项目结构与架构

June 13, 2026 · View on GitHub

目录结构

gitfolio/
├── config/                 # 配置管理
│   ├── config.go           # 全局配置加载
│   └── constants.go        # 常量定义
├── handlers/               # HTTP 请求处理器
│   ├── admin_handler.go    # 管理后台(账号、镜像、同步点)
│   ├── group_handler.go    # 团队 CRUD + 成员管理
│   ├── issue_handler.go    # Issue CRUD + 评论
│   ├── pull_request_handler.go # PR CRUD + 合并/关闭
│   ├── task_handler.go     # 任务管理 + 排期 + 附件 + 计时
│   ├── release_handler.go  # 版本发布
│   ├── repo_crud.go        # 仓库增删改查 + 转移
│   ├── repo_dto.go         # 仓库响应结构
│   ├── repo_git.go         # Git 操作(树、文件、提交、差异、暂存、提交)
│   ├── repo_star.go        # Star/Watch
│   ├── repo_sync.go        # 仓库同步
│   ├── snippet_handler.go  # 代码片段
│   ├── stats_handler.go    # 统计信息
│   ├── sync_config_handler.go # 同步配置
│   ├── upload_handler.go   # 文件上传
│   └── user_handler.go     # 用户管理
├── helpers/                # 公共辅助函数
│   ├── helpers.go          # 分页、响应、参数解析
│   ├── db.go               # 批量查询(贡献者、用户、评论数)
│   ├── labels.go           # 标签管理
│   ├── permissions.go      # 权限校验
│   ├── references.go       # 提交消息解析和关联创建
│   └── resources.go        # 资源查询(Owner、Repo 解析)
├── middleware/             # 中间件
│   └── auth.go             # JWT 认证 + 角色检查
├── models/                 # 数据模型
│   ├── conn.go             # 数据库连接管理
│   ├── fields.go           # 字段类型定义
│   └── tables.go           # 所有表结构定义
├── routes/                 # 路由配置
│   └── routes.go           # 路由注册
├── services/               # 业务逻辑层
│   ├── account_service.go  # 账户服务
│   ├── git_commit.go       # Git 提交查询
│   ├── git_diff.go         # Git Diff 解析
│   ├── git_graph.go        # Git 图表数据
│   ├── git_repo.go         # Git 仓库操作
│   ├── github_service.go   # GitHub API 集成
│   ├── lang.go             # 语言检测
│   ├── proxy.go            # HTTP 代理
│   ├── scheduler_service.go # 定时同步调度
│   ├── stats_service.go    # 统计服务
│   └── sync_service.go     # 同步服务(Issue/PR/评论并发同步)
├── web/                    # 前端(React + Chakra UI + Vite)
│   ├── src/
│   │   ├── api/            # API 调用封装
│   │   ├── components/     # 通用组件
│   │   │   └── gitworkflow/ # Git 工作流组件(暂存、提交、Rebase、Stash)
│   │   ├── contexts/       # React Context(认证、Git 工作流)
│   │   ├── i18n/           # 国际化(中文/英文)
│   │   ├── pages/          # 页面组件(按功能域合并)
│   │   │   ├── HomePages.jsx       # 首页、项目列表、创建项目、迁移
│   │   │   ├── CommunityPages.jsx  # 登录、团队、团队详情
│   │   │   ├── UserPages.jsx       # 活动、用户管理、个人资料、设置、管理后台
│   │   │   ├── SnippetPages.jsx    # 代码片段列表、详情、新建、编辑
│   │   │   ├── ProjectDetail.jsx   # 项目详情框架页
│   │   │   └── project/
│   │   │       └── ProjectPages.jsx # 项目子页面(树、Issue、PR、提交等)
│   │   ├── test/           # 前端测试
│   │   ├── theme/          # Chakra UI 主题
│   │   ├── App.jsx         # 路由配置
│   │   ├── codeThemes.js   # 代码高亮主题
│   │   └── main.jsx        # 入口
│   └── package.json
├── main.go                 # 程序入口
└── Makefile                # 构建命令

前端架构

页面组件合并策略

前端页面按功能域合并,减少文件数量,同时保持路由级代码分割:

文件包含组件加载方式
HomePages.jsxDashboard, Projects, CreateProject, MigrateProject直接导入
CommunityPages.jsxLoginPage, Groups, NewGroup, GroupDetail直接导入
UserPages.jsxActivity, UserManagement, UserProfile, UserSettings, AdminPage懒加载
SnippetPages.jsxSnippets, SnippetDetail, NewSnippet, EditSnippet懒加载
ProjectDetail.jsxProjectDetail直接导入
ProjectPages.jsxProjectTree, ProjectIssues, ProjectPRs, ProjectCommits, ProjectBranches, ProjectTags, ProjectStats, ProjectReleases, ProjectTasks, NewIssue, NewPR, NewTask, CommitDetail, IssueDetail, PRDetail, TaskDetail, ProjectSettings, FileViewer懒加载

构建产物

Vite 构建配置通过 manualChunks 拆分第三方依赖,首屏仅加载核心 chunk:

Chunkgzip 大小说明
index~33 kB应用核心代码
react-vendor~68 kBReact + React Router + React Icons
chakra-core~92 kBChakra UI + Emotion
framer-motion~37 kB动画库
datepicker~40 kB日期选择器(按需)
syntax-highlighter~227 kB代码高亮(按需)
syntax-styles~18 kB高亮主题样式(按需)
markdown-editor~112 kBMarkdown 编辑器(按需)
ProjectPages~57 kB项目子页面(按需)

项目类型

类型可见性远程同步推送远程Owner ID说明
local除 guest 外可见0本地项目,无远程关联
mirror所有人可见✅ 拉取用户/团队 ID镜像项目,只读
public所有人可见用户/团队 ID公开项目
private仅所有者和团队成员可见用户/团队 ID私有项目

类型转换规则:mirror ↔ public/private 可互转,public ↔ private 可互转,local 不可转换。

镜像项目不显示"新建 Issue"和"新建 PR"按钮,因为数据来自远程仓库。

角色系统

用户角色

角色权限
admin全部权限,包括管理所有用户和项目
user管理自己的项目,参与团队项目
guest只读访问公开和镜像项目

团队角色

角色权限
leader危险操作(删除、转移所有权)、合并 PR
member管理团队项目(非危险操作)

仓库列表可见性

角色可见项目类型
admin所有项目
userlocal + public + mirror + 自己/团队的 private
guestpublic + mirror
未登录public + mirror(仅列表,详情需登录)

项目访问权限

项目类型未登录guestuser / admin
public❌ 需登录✅ 只读✅ 读写
mirror❌ 需登录✅ 只读✅ 读写(owner/组成员)
private❌ 403❌ 403✅ 仅 owner/组成员(admin 可访问所有)
local❌ 403❌ 403✅ 仅 owner(admin 可访问所有)

API 请求权限

请求类型未登录guestuser / admin
GET(读取)✅ 白名单接口✅ 允许✅ 允许
POST/PUT/DELETE(写入)❌ 401 跳转登录❌ 403✅ 允许

白名单 GET 接口:/health/auth/login/auth/logout/stats/recent-issues/recent-tasks/repos/github-info

Guest 用户界面限制

guest 用户在前端界面中以下操作按钮被禁用:

  • 创建项目、迁移项目
  • 创建团队、管理团队成员
  • 创建代码片段、编辑/删除代码片段
  • 仓库设置、同步操作
  • 创建 Issue、添加评论
  • 创建 PR、合并/关闭 PR
  • 创建任务、状态流转、添加评论
  • Star/Watch 仓库
  • 提交页面:拉取代码、设置默认分支、新建/删除标签
  • 个人设置:修改资料、上传头像、修改密码

数据模型

核心数据表:

表名说明
User用户
Repository仓库
RepositoryStats仓库统计
Owner仓库所有者
IssueIssue
PullRequestPull Request
Comment评论
Label标签
IssueLabelIssue-标签关联
PullRequestLabelPR-标签关联
Milestone里程碑
Contributor贡献者
Branch分支
Release版本发布
Star / Watch收藏/关注
Group / GroupMember团队/成员
Activity活动流
Task任务
TaskSchedule任务排期
TaskAttachment任务附件
TaskIssue任务-Issue 关联
TaskTransition任务状态流转记录
TaskPullRequest任务-PR 关联
TaskTimeLog任务时间追踪
CommitReference提交关联(Issue/PR/Task)
Snippet代码片段
PlatformAccount平台账号
SyncToken同步令牌
RemoteRepository远程仓库
SyncPoint同步点
SyncLog同步日志
WebhookWebhook