系统初始化后,登录页面显示默认管理员帐号
|
# GitCandy 架构设计
> 版本:v1.0 | 日期:2026-07-20 | æ¥æºï¼šä»£ç 结构分æž
本文档æè¿° GitCandy çš„åˆ†å±‚æž¶æž„ã€æ ¸å¿ƒç»„件与关键æµç¨‹ã€‚功能需求å‚è§[需求文档](/NewLife/GitCandy/Blob/master/Doc/需求文档.md),完æˆçжæ€åœ¨[功能清å•](/NewLife/GitCandy/Blob/master/Doc/功能清å•.md)追踪。
---
## 1. 项目分层
```
GitCandy.sln
├── GitCandy (GitCandy.Data) ↠数æ®å±‚ (.NET Standard 2.1)
│ ├── Entity/ ↠XCode 实体模型 (Model.xml) + 实体类 + Biz 业务逻辑
│ ├── Base/ ↠基础工具类 (Pager, FileHelper, RegularExpression)
│ ├── Configuration/ ↠[已排除] æ—§é…置模å—
│ └── Security/ ↠[已排除] æ—§å®‰å…¨æ¨¡å— (Token)
│
├── GitCandy.Web ↠Web 表现层 (.NET 10.0, ASP.NET Core MVC + Cube)
│ ├── Areas/GitCandy/ ↠Cube 区域(åŽå°ç®¡ç†ï¼‰
│ │ ├── Controllers/ ↠EntityController 锿–¹å®žä½“控制器
│ │ └── Views/ ↠Razor 视图
│ ├── Controllers/ ↠自定义 Web 控制器(å‰å°é¡µé¢ + Gitå议)
│ ├── Services/ ↠应用æœåŠ¡ï¼ˆAccountService)
│ ├── Data/ â† æ•°æ®æœåŠ¡ï¼ˆMembershipService, RepositoryService)
│ ├── Git/ ↠Git æ ¸å¿ƒè®¿é—®å±‚
│ │ └── Cache/ ↠Git 缓å˜å±‚
│ ├── Models/ ↠视图模型
│ ├── Views/ ↠Razor 视图
│ ├── Extensions/ ↠扩展方法
│ └── wwwroot/ â† é™æ€èµ„æº
│
└── Test ↠测试项目 (.NET 8.0)
```
### ä¾èµ–关系
```
GitCandy.Web → GitCandy(数æ®å±‚)
GitCandy.Web → NewLife.Cube.Coreï¼ˆé”æ–¹æ¡†æž¶ï¼‰
GitCandy.Web → LibGit2Sharp(Git æ“作库)
GitCandy → NewLife.XCode(ORM)
GitCandy → NewLife.Core(基础库)
GitCandy → NewLife.Stardust(星尘监控)
Test → GitCandy(数æ®å±‚)
```
---
## 2. æ•°æ®å±‚设计
### 2.1 实体模型(Model.xml)
| 实体 | 表å | 主键 | 说明 |
|------|------|:--:|------|
| User | User | Int32 自增 | 用户/团队(通过 IsTeam 区分) |
| Repository | Repository | Int32 自增 | Git 仓库 |
| UserTeam | UserTeam | Int32 自增 | 用户↔团队 å¤šå¯¹å¤šå…³è” |
| UserRepository | UserRepository | Int32 自增 | 用户↔仓库 多对多æƒé™å…³è” |
| GitHistory | GitHistory | Int64 | Git æ“作审计日志 |
> **设计è¦ç‚¹**:User 实体通过 `IsTeam` å—æ®µåŒæ—¶æ‰¿è½½ã€Œä¸ªäººç”¨æˆ·ã€å’Œã€Œå›¢é˜Ÿã€ä¸¤ç§è§’色。团队也是特殊的用户,通过 `UserTeam` å…³è”表维护æˆå‘˜å…³ç³»ã€‚é“¾æŽ¥å—æ®µ `LinkID` ç”¨äºŽå…³è” Cube 基础用户表。
### 2.2 实体 Biz 层
| 实体 | Biz 文件 | æ ¸å¿ƒæ–¹æ³• |
|------|----------|----------|
| User | 用户.Biz.cs | `Create`, `CreateTeam`, `Search`, `SearchByName`, `SearchTeam`, `SearchUser`, `GetOrAdd` |
| Repository | 仓库.Biz.cs | `FindByOwnerAndName`, `Search`, `GetPublics` |
| UserTeam | 用户团队.Biz.cs | `FindByUserAndTeam`, `Search`, `SearchSql` |
| UserRepository | 用户仓库.Biz.cs | `FindByUserIDAndRepositoryID`, `Search` |
| GitHistory | Git历å².Biz.cs | `Search` |
---
## 3. Web 层组件
### 3.1 控制器矩阵
| 控制器 | 类型 | 命å空间 | èŒè´£ | 对应功能编ç |
|--------|------|----------|------|:----------:|
| `GitController` (Area) | `ConfigController<GitSetting>` | Areas/GitCandy | 系统é…置管ç†ï¼ˆCube ConfigController) | SYS-1 |
| `UserController` (Area) | `EntityController<User>` | Areas/GitCandy | 用户åŽå°ç®¡ç†ï¼ˆCube CRUD) | USER-1 |
| `RepositoryController` (Area) | `EntityController<Repository>` | Areas/GitCandy | 仓库åŽå°ç®¡ç†ï¼ˆCube CRUD) | REPO-1 |
| `UserTeamController` (Area) | `EntityController<UserTeam>` | Areas/GitCandy | 用户团队关è”管ç†ï¼ˆCube CRUD) | TEAM-2 |
| `UserRepositoryController` (Area) | `EntityController<UserRepository>` | Areas/GitCandy | 用户仓库关è”管ç†ï¼ˆCube CRUD) | REPO-3 |
| `GitHistoryController` (Area) | `ReadOnlyEntityController<GitHistory>` | Areas/GitCandy | Gitæ“ä½œåŽ†å²æŸ¥çœ‹ï¼ˆCube åªè¯»ï¼‰ | HIST-1b |
| `HomeController` | `CandyControllerBase` | Controllers | 首页é‡å®šå‘ã€å…³äºŽã€è¯è¨€åˆ‡æ¢ | SYS-3 |
| `AccountController` | `CandyControllerBase` | Controllers | 用户账å·è¯¦æƒ…ã€æœç´¢ | USER-2 |
| `RepositoryController` | `CandyControllerBase` | Controllers | 仓库æµè§ˆ/创建/编辑/åˆ é™¤/å作/ä»£ç æµè§ˆ | REPO-2/4/5, GIT-2~11 |
| `TeamController` | `CandyControllerBase` | Controllers | 团队创建/编辑/详情/æˆå‘˜ç®¡ç† | TEAM-1, TEAM-3 |
| `GitController` | `Controller` | Controllers | Git Smart HTTP åè®®å¤„ç† | GIT-1 |
### 3.2 æœåС层
| æœåŠ¡ | 文件 | èŒè´£ |
|------|------|------|
| `AccountService` | Services/AccountService.cs | 用户登录认è¯ï¼ˆå¯†ç /TokenåŒé‡éªŒè¯ï¼‰ |
| `MembershipService` | Data/MembershipService.cs | 用户/å›¢é˜Ÿæ•°æ®æŸ¥è¯¢ä¸Žæ¨¡åž‹è½¬æ¢ |
| `RepositoryService` | Data/RepositoryService.cs | 仓库 CRUDã€å作管ç†ã€åˆ—表查询 |
### 3.3 Git æ ¸å¿ƒè®¿é—®å±‚ï¼ˆGit/ 目录)
| 组件 | 文件 | èŒè´£ |
|------|------|------|
| `GitService` | Git/GitService.cs | Git 仓库æ“ä½œæ ¸å¿ƒï¼šSmart HTTPã€ä»£ç æ ‘ã€æ–‡ä»¶å†…容ã€åˆ†æ”¯/æ ‡ç¾ç‰ |
| `ArchiverAccessor` | Git/ArchiverAccessor.cs | 代ç 归档打包下载 |
| `BlameAccessor` | Git/BlameAccessor.cs | 文件é€è¡Œå®¡é˜…(blame) |
| `CommitsAccessor` | Git/CommitsAccessor.cs | æäº¤åކ岿Ÿ¥è¯¢ |
| `ContributorsAccessor` | Git/ContributorsAccessor.cs | è´¡çŒ®è€…ç»Ÿè®¡åˆ†æž |
| `HistoryDivergenceAccessor` | Git/HistoryDivergenceAccessor.cs | 分支差异比较 |
| `LastCommitAccessor` | Git/LastCommitAccessor.cs | æœ€åŽæäº¤ä¿¡æ¯èŽ·å– |
| `RepositorySizeAccessor` | Git/RepositorySizeAccessor.cs | 仓库大å°è®¡ç®— |
| `ScopeAccessor` | Git/ScopeAccessor.cs | 仓库作用域访问 |
| `SummaryAccessor` | Git/SummaryAccessor.cs | 仓库摘è¦ä¿¡æ¯ |
### 3.4 基础组件
| 组件 | 文件 | èŒè´£ |
|------|------|------|
| `CandyControllerBase` | Controllers/CandyControllerBase.cs | æŽ§åˆ¶å™¨åŸºç±»ï¼šè®¤è¯æ¡¥æŽ¥ã€è¯è¨€æ–‡åŒ–ã€Sessionç®¡ç† |
| `GitSetting` | GitSetting.cs | 系统é…置类(NewLife.Config),æŒä¹…化到 `appsettings.json` |
| `GitCandyArea` | Areas/GitCandy/GitCandyArea.cs | Cube 区域注册,èœå•项「糖果仓库〠|
| `UserUrlConstraint` | Base/UserUrlConstraint.cs | 路由约æŸï¼šåŒºåˆ†ç”¨æˆ·å和团队å |
| `GitUrlConstraint` | Base/GitUrlConstraint.cs | 路由约æŸï¼šè¯†åˆ« Git åè®®åŠ¨è¯ |
---
## 4. 关键æµç¨‹
### 4.1 Git Smart HTTP åè®®æµç¨‹
```
Git Client (git push/pull/clone)
│
├─ GET /{owner}/{project}.git/info/refs?service=git-upload-pack
│ └─ GitController.Smart() → Basic Auth → GitService.InfoRefs()
│
└─ POST /{owner}/{project}.git/git-upload-pack
└─ GitController.Smart() → Session Auth → GitService.ExecutePack()
```
### 4.2 Web ç”¨æˆ·è®¤è¯æµç¨‹
```
æµè§ˆå™¨è¯·æ±‚
└─ CandyControllerBase.OnActionExecuting()
├─ 检查 Session["GitToken"]
├─ æ— Token → ManageProvider.Provider.TryLogin(HttpContext)
├─ 有Cube用户 → User.GetOrAdd(user) → å˜å…¥ Session
└─ 设置 ViewBag.Token
```
### 4.3 仓库路由规则
```
/{owner}/{name} → RepositoryController.Tree (默认)
/{owner}/{name}/{action} → RepositoryController.{action}
/{owner}/{name}/{action}/{path} → RepositoryController.{action}(path)
/{owner}/{project}/{*verb} → GitController.Smart (Gitåè®®)
/{name} → AccountController.Detail (用户) 或 TeamController.Detail (团队)
```
---
## 5. é…置体系
`GitSetting` 继承 `Config<GitSetting>`,é…置键å‰ç¼€ `Git`,å˜å‚¨åœ¨ `appsettings.json`:
| é…置项 | 默认值 | 说明 |
|--------|--------|------|
| IsPublicServer | true | 是å¦å¼€æ”¾æœåŠ¡ |
| AllowRegisterUser | true | å…许注册 |
| AllowRepositoryCreation | true | å…许创建代ç 库 |
| RepositoryPath | ../Repos | 代ç 库å˜å‚¨è·¯å¾„ |
| CachePath | ../Cache | 缓å˜è·¯å¾„ |
| GitCorePath | 自动探测 | git-core 路径 |
| Commits | 30 | æ¯é¡µæäº¤æ•° |
| PageSize | 30 | åˆ†é¡µå¤§å° |
| Contributors | 50 | 显示å‚与者数 |
| AllowArchive | true | å…许打包下载 |
| AllowBlame | true | å…许查看审阅 |
| AllowCommits | true | å…许查看æäº¤ |
| AllowContributors | true | å…许查看贡献者 |
| AllowHistoryDivergence | true | å…许查看分支差异 |
| AllowSummary | true | å…è®¸æŸ¥çœ‹æ‘˜è¦ |
---
## 6. 关键技术决ç–
| å†³ç– | 内容 | ç†ç”± |
|------|------|------|
| User 实体承载用户+团队 | `IsTeam` å—æ®µåŒºåˆ† | 简化模型,团队å¯åƒç”¨æˆ·ä¸€æ ·æ‹¥æœ‰ä»“库 |
| 本地用户表 + Cube 用户表分离 | `LinkID` å…³è” | ä¿æŒ GitCandy ç”¨æˆ·ä½“ç³»ç‹¬ç«‹ï¼ŒåŒæ—¶å¤ç”¨ Cube è®¤è¯ |
| Git æ“作使用外部 git.exe | `GitService.RunGitCmdAsync` | 利用 LibGit2Sharp 管ç†ä»“库元数æ®ï¼Œgit-core 处ç†ä¼ 输åè®® |
| ä»…æ”¯æŒ HTTP åè®® | 䏿”¯æŒ SSH | ç®€åŒ–éƒ¨ç½²ï¼Œæ— éœ€ç®¡ç† SSH Key |
| Cube 锿–¹åšåŽå°ç®¡ç† | EntityController CRUD | 零代ç 获得 CRUD 界é¢ï¼Œä¸“注业务定制 |
|