- 移除 OpenApiService.GenerateContentAsync 的 isAsync 查询参数及其分支处理(不再在该接口直接创建并返回 ImageStore 任务 Id)。 - 保留 alt=sse 的代理处理逻辑。 - 在 ImageStoreTaskAggregateRoot 中新增字段: - Prompt:提示词(大文本) - ReferenceImageUrls:参考图 URL 列表(JSON 存储) - 兼容性提示:接口去掉了 isAsync 参数,调用方需相应调整异步任务创建流程。
130 lines
5.5 KiB
Markdown
130 lines
5.5 KiB
Markdown
# CLAUDE.md
|
|
|
|
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
|
|
## Overview
|
|
|
|
Yi.Abp.Net8 is a modular, multi-tenant SaaS platform built on ABP Framework 8.3.4 with .NET 8.0. It uses **SqlSugar** (not EF Core) as the ORM and follows Domain-Driven Design (DDD) principles. The platform includes AI/ML features (chat, models, agents, token tracking), RBAC, forum, messaging, and digital collectibles modules.
|
|
|
|
## Architecture
|
|
|
|
### Solution Structure
|
|
|
|
```
|
|
Yi.Abp.Net8/
|
|
├── src/ # Main application host
|
|
│ └── Yi.Abp.Web/ # ASP.NET Core 8.0 Web Host (port 19001)
|
|
├── framework/ # Framework layer (shared infrastructure)
|
|
│ ├── Yi.Framework.Core # Core utilities, JSON handling
|
|
│ ├── Yi.Framework.SqlSugarCore # SqlSugar ORM abstraction (v5.1.4.197-preview22)
|
|
│ ├── Yi.Framework.SqlSugarCore.Abstractions # Repository interfaces
|
|
│ ├── Yi.Framework.AspNetCore # ASP.NET Core extensions
|
|
│ ├── Yi.Framework.AspNetCore.Authentication.OAuth # QQ, Gitee OAuth
|
|
│ ├── Yi.Framework.Ddd.Application # DDD application base classes
|
|
│ ├── Yi.Framework.BackgroundWorkers.Hangfire # Job scheduling
|
|
│ ├── Yi.Framework.Caching.FreeRedis # Redis caching
|
|
│ └── Yi.Framework.SemanticKernel # AI/ML integration
|
|
├── module/ # Business modules (each follows 5-layer DDD pattern)
|
|
│ ├── ai-hub/ # AI services (chat, models, sessions, agents)
|
|
│ ├── rbac/ # Role-Based Access Control (core auth/authz)
|
|
│ ├── bbs/ # Forum/community
|
|
│ ├── chat-hub/ # Real-time messaging
|
|
│ ├── audit-logging/ # Audit trail tracking
|
|
│ ├── code-gen/ # Code generation
|
|
│ ├── tenant-management/ # Multi-tenancy support
|
|
│ ├── digital-collectibles/ # NFT/digital assets
|
|
│ └── ai-stock/ # AI-powered stock analysis
|
|
├── test/ # Unit tests (xUnit + NSubstitute + Shouldly)
|
|
├── client/ # HTTP API clients
|
|
└── tool/ # Development utilities
|
|
```
|
|
|
|
### Module Structure (DDD Layers)
|
|
|
|
Each module follows this pattern:
|
|
|
|
```
|
|
module/[feature]/
|
|
├── [Feature].Domain.Shared/ # Constants, enums, shared DTOs
|
|
├── [Feature].Domain/ # Entities, aggregates, domain services
|
|
├── [Feature].Application.Contracts/ # Service interfaces, DTOs
|
|
├── [Feature].Application/ # Application services (implementations)
|
|
└── [Feature].SqlSugarCore/ # Repository implementations, DbContext
|
|
```
|
|
|
|
**Dependency Flow:** Application → Domain + Application.Contracts → Domain.Shared → Framework
|
|
|
|
### Module Registration
|
|
|
|
All modules are registered in `src/Yi.Abp.Web/YiAbpWebModule.cs`. When adding a new module:
|
|
|
|
1. Add `DependsOn` attribute in `YiAbpWebModule`
|
|
2. Add conventional controller in `PreConfigureServices`:
|
|
```csharp
|
|
options.ConventionalControllers.Create(typeof(YiFramework[Feature]ApplicationModule).Assembly,
|
|
option => option.RemoteServiceName = "[service-name]");
|
|
```
|
|
|
|
### API Routing
|
|
|
|
All API routes use the unified prefix: `/api/app/{service-name}/{controller}/{action}`
|
|
|
|
Registered service names:
|
|
- `default` - Main application services
|
|
- `rbac` - Authentication, authorization, user/role management
|
|
- `ai-hub` - AI chat, models, sessions, agents
|
|
- `bbs` - Forum posts and comments
|
|
- `chat-hub` - Real-time messaging
|
|
- `tenant-management` - Multi-tenant configuration
|
|
- `code-gen` - Code generation utilities
|
|
- `digital-collectibles` - NFT/digital assets
|
|
- `ai-stock` - Stock analysis
|
|
|
|
## Database
|
|
|
|
**ORM:** SqlSugar (NOT Entity Framework Core)
|
|
|
|
**Configuration** (`appsettings.json`):
|
|
```json
|
|
"DbConnOptions": {
|
|
"Url": "DataSource=yi-abp-dev.db",
|
|
"DbType": "Sqlite", // Sqlite, Mysql, Sqlserver, Oracle, PostgreSQL
|
|
"EnabledCodeFirst": true, // Auto-create tables
|
|
"EnabledDbSeed": true, // Auto-seed data
|
|
"EnabledSaasMultiTenancy": true
|
|
}
|
|
```
|
|
|
|
**Multi-tenancy:** Tenant isolation via `HeaderTenantResolveContributor` (NOT cookie-based). Tenant is resolved from `__tenant` header.
|
|
|
|
## Key Technologies
|
|
|
|
| Component | Technology |
|
|
|-----------|-----------|
|
|
| Framework | ABP 8.3.4 |
|
|
| .NET Version | .NET 8.0 |
|
|
| ORM | SqlSugar 5.1.4.197-preview22 |
|
|
| Authentication | JWT Bearer + Refresh Tokens |
|
|
| OAuth | QQ, Gitee |
|
|
| Caching | FreeRedis (optional) |
|
|
| Background Jobs | Hangfire (in-memory or Redis) |
|
|
| Logging | Serilog (daily rolling files) |
|
|
| Testing | xUnit + NSubstitute + Shouldly |
|
|
| Container | Autofac |
|
|
|
|
## Important Notes
|
|
|
|
- **JSON Serialization:** Uses Microsoft's `System.Text.Json`, NOT Newtonsoft.Json. Date format handled via `DatetimeJsonConverter`.
|
|
- **Multi-tenancy:** Tenant resolved from `__tenant` header, NOT cookies.
|
|
- **Rate Limiting:** Disabled in development, enabled in production (1000 req/60s sliding window).
|
|
- **Swagger:** Available at `/swagger` in development.
|
|
- **Hangfire Dashboard:** Available at `/hangfire` (requires JWT authorization).
|
|
- **Background Workers:** Disabled in development (`AbpBackgroundWorkerOptions.IsEnabled = false`).
|
|
|
|
## Development Workflow
|
|
|
|
1. **Branch:** Main branch is `abp`, current development branch is `ai-hub`.
|
|
2. **Commit Convention:** Chinese descriptive messages with prefixes (`feat:`, `fix:`, `style:`).
|
|
3. **Testing:** Run `dotnet test` before committing.
|
|
4. **Building:** Use `dotnet build --no-restore` for faster builds after initial restore.
|