# AGENTS.md - Build God Project
Guidelines for agentic coding agents working on this repository.
## Project Overview
- **Backend**: ASP.NET Core 8.0 Web API (C#) with PostgreSQL and SqlSugar ORM
- **Admin Frontend**: Vue 3 + TypeScript + Vite + Element Plus (port 5173)
- **Game Frontend**: Vue 3 + TypeScript + Vite + Element Plus + TailwindCSS + Three.js (port 5174)
---
## 1. Build, Lint, and Test Commands
### Backend (.NET API)
```bash
# Build the solution
dotnet build Build_God_Api/Build_God_Api/Build_God_Api.csproj
# Run the API (launches on https://localhost:59447, http://localhost:59448)
dotnet run --project Build_God_Api/Build_God_Api/Build_God_Api.csproj
# Run with specific URL
dotnet run --urls "http://localhost:5091"
```
**Note**: No test framework or linting is currently configured for the backend.
### Admin Frontend (Build_God_Admin_Frontend/Frontend)
```bash
# Install dependencies
npm install
# Start development server (http://localhost:5173)
npm run dev
# Build for production
npm run build
# Type-check only
npm run type-check
# Preview production build
npm run preview
```
### Game Frontend (Build_God_Game)
```bash
# Install dependencies
npm install
# Start development server (http://localhost:5174)
npm run dev
# Build for production
npm run build
# Type-check only
vue-tsc --build
```
**Note**: No test framework or ESLint is configured for either frontend.
---
## 2. Code Style Guidelines
### Backend (.NET/C#)
#### Conventions
- Use **file-scoped namespaces** (`namespace Build_God_Api.Controllers;`)
- Enable **nullable reference types** (`enable`)
- Use **primary constructors** for dependency injection
- Use **async/await** for all I/O operations
- Use **region** sparingly - prefer natural code organization
#### Naming
- **Classes/Types**: PascalCase (`AccountController`, `AccountService`)
- **Methods/Properties**: PascalCase (`GetAccount`, `UserName`)
- **Local variables/Parameters**: camelCase (`accountId`, `emailAddress`)
- **Interfaces**: Prefix with `I` (`IAccountService`)
- **DTOs**: Postfix with `Cmd` for commands, `Dto` for responses
#### Project Structure
```
Build_God_Api/Build_God_Api/
Controllers/ # API endpoints
Services/ # Business logic interfaces
Services/Game/ # Game-specific services
DB/ # Database entities (extend BaseEntity)
Dto/ # Data transfer objects
Common/ # Utilities and helpers
Hubs/ # SignalR hubs
```
#### Error Handling
- Return `BadRequest("error message")` for validation errors
- Return `Ok(result)` for successful operations
- Use try-catch with `Console.WriteLine` for error logging
- Validate inputs at controller level using DataAnnotations
#### Route Conventions
- Use `[Route("api/god/[controller]")]`
- Use `[ApiController]` and HTTP method attributes (`[HttpGet]`, `[HttpPost]`)
#### Database Entities (SqlSugar)
- All entities extend `BaseEntity` which provides `Id`, `CreatedOn`, `UpdatedOn`, `CreatedBy`, `UpdatedBy`
- Use `[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]` for auto-increment primary keys
---
### Frontend (Vue 3 + TypeScript)
#### Conventions
- Use **Composition API** with `
```
#### Pinia Store Pattern
```typescript
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
export const useAuthStore = defineStore('auth', () => {
const token = ref('')
const isAuthenticated = computed(() => !!token.value)
const login = async (credentials: LoginRequest): Promise => {
// implementation
}
return { token, isAuthenticated, login }
})
```
#### API Module Pattern
All API modules share a centralized axios instance from `api/index.ts`.
**`src/api/index.ts`** - Shared axios instance (one per frontend):
```typescript
import axios from 'axios'
const instance = axios.create({
baseURL: import.meta.env.VITE_API_URL || 'http://localhost:5091/api/god/',
timeout: 10000,
headers: { 'Content-Type': 'application/json' }
})
instance.interceptors.request.use((config) => {
const token = localStorage.getItem('auth_token') // or sessionStorage for Admin
if (token) config.headers.Authorization = `Bearer ${token}`
return config
})
instance.interceptors.response.use(
(response) => response.data,
(error) => {
if (error.response?.status === 401) {
localStorage.removeItem('auth_token')
window.location.href = '/login'
}
return Promise.reject(error.response?.data || error.message)
}
)
export default instance
```
**`src/api/{entity}.ts`** - Individual API modules (import from index):
```typescript
import http from './index'
export interface CharacterDto { ... }
export const characterApi = {
getList: (): Promise => {
return http.get('/character/list')
}
}
```
---
## 3. API Integration
### Base URL
- Development: `http://localhost:5091/api/god/`
- Routes: `api/god/{entity}` (e.g., `api/god/account/login`)
### Authentication
- JWT Bearer tokens
- Store in `localStorage` as `auth_token` (Game) or `sessionStorage` (Admin)
- Header: `Authorization: Bearer {token}`
### Key Endpoints
- POST `/api/god/account/register` - Register account
- POST `/api/god/account/login` - User login
- POST `/api/god/account/login/admin` - Admin login
---
## 4. Development Workflow
1. **Start Backend**: `dotnet run --project Build_God_Api/Build_God_Api/Build_God_Api.csproj`
2. **Start Admin Frontend**: `npm run dev` (in `Build_God_Admin_Frontend/Frontend/`)
3. **Start Game Frontend**: `npm run dev` (in `Build_God_Game/`)
---
## 5. Adding New Features
### Backend
1. Create model in `DB/` (extend `BaseEntity`)
2. Create interface in `Services/`
3. Implement service in `Services/`
4. Create controller in `Controllers/`
5. Register service in `Program.cs`
### Frontend
1. Add API function in `src/api/{entity}.ts` (import `http` from `./index`)
2. Add Pinia store in `src/stores/` if needed
3. Create view component in `src/views/`
4. Add route in `src/router/index.ts`
---
## 6. Important Notes
- **Admin credentials**: `admin` / `love_god.123`
- **Test account**: `Tom` / `123456` (email: 976802198@qq.com)
- Backend runs on ports **59447** (HTTPS) and **59448** (HTTP)
- Admin Frontend uses sessionStorage; Game Frontend uses localStorage
- Always use `await` with async operations
- Run type-check before committing