文字游戏
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

303 lines
8.1 KiB

2 weeks ago
# AGENTS.md - Build God Project
Guidelines for agentic coding agents working on this repository.
2 weeks ago
## Project Overview
1 week ago
- **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)
2 weeks ago
---
## 1. Build, Lint, and Test Commands
### Backend (.NET API)
```bash
1 week ago
# Build the solution
dotnet build Build_God_Api/Build_God_Api/Build_God_Api.csproj
2 weeks ago
1 week ago
# 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"
2 weeks ago
```
**Note**: No test framework or linting is currently configured for the backend.
2 weeks ago
1 week ago
### Admin Frontend (Build_God_Admin_Frontend/Frontend)
2 weeks ago
```bash
# Install dependencies
npm install
# Start development server (http://localhost:5173)
2 weeks ago
npm run dev
# Build for production
npm run build
# Type-check only
npm run type-check
# Preview production build
npm run preview
```
1 week ago
### 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 weeks ago
---
## 2. Code Style Guidelines
### Backend (.NET/C#)
#### Conventions
2 weeks ago
- Use **file-scoped namespaces** (`namespace Build_God_Api.Controllers;`)
1 week ago
- Enable **nullable reference types** (`<Nullable>enable</Nullable>`)
2 weeks ago
- Use **primary constructors** for dependency injection
- Use **async/await** for all I/O operations
1 week ago
- Use **region** sparingly - prefer natural code organization
2 weeks ago
#### Naming
- **Classes/Types**: PascalCase (`AccountController`, `AccountService`)
- **Methods/Properties**: PascalCase (`GetAccount`, `UserName`)
- **Local variables/Parameters**: camelCase (`accountId`, `emailAddress`)
- **Interfaces**: Prefix with `I` (`IAccountService`)
1 week ago
- **DTOs**: Postfix with `Cmd` for commands, `Dto` for responses
2 weeks ago
#### Project Structure
```
1 week ago
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
2 weeks ago
```
#### Error Handling
- Return `BadRequest("error message")` for validation errors
- Return `Ok(result)` for successful operations
1 week ago
- Use try-catch with `Console.WriteLine` for error logging
- Validate inputs at controller level using DataAnnotations
2 weeks ago
#### Route Conventions
- Use `[Route("api/god/[controller]")]`
1 week ago
- 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
2 weeks ago
---
### Frontend (Vue 3 + TypeScript)
#### Conventions
2 weeks ago
- Use **Composition API** with `<script setup lang="ts">`
- Use **path aliases**: `@/` maps to `src/`
1 week ago
- Admin: Plain CSS (`<style scoped lang="css">`)
- Game: Tailwind CSS utility classes
2 weeks ago
#### Naming
2 weeks ago
- **Components**: PascalCase (`LoginView.vue`, `Sidebar.vue`)
- **Variables/functions**: camelCase (`handleLogin`, `userName`)
- **Types/Interfaces**: PascalCase (`LoginRequest`, `User`)
1 week ago
- **Store names**: kebab-case in defineStore (`defineStore('auth', ...)`)
2 weeks ago
#### Project Structure
```
1 week ago
Admin Frontend (src/):
api/ # API modules
components/ # Reusable components
views/ # Page components (subdir: admin/)
stores/ # Pinia stores
router/ # Vue Router config
assets/ # Static assets
Game Frontend (src/):
api/ # API modules
components/ # Reusable components
composables/ # Vue composables
views/ # Page components
stores/ # Pinia stores
router/ # Vue Router config
2 weeks ago
```
#### Imports
- Use `@/` alias: `import { useAuthStore } from '@/stores/auth'`
1 week ago
- Order: external libs → internal imports → types/interfaces
#### TypeScript Settings (tsconfig.app.json)
```json
{
"strict": false,
"strictNullChecks": false,
"noUnusedLocals": false,
"noUnusedParameters": false
}
```
2 weeks ago
1 week ago
#### TypeScript Patterns
- Define types/interfaces for all API payloads
2 weeks ago
- Use `ref<T>` and `computed<T>` for reactive state
1 week ago
- Use `unknown` or proper types instead of `any`
2 weeks ago
#### Vue Component Pattern
2 weeks ago
```vue
<script setup lang="ts">
1 week ago
import { ref, computed } from 'vue'
2 weeks ago
import { useRouter } from 'vue-router'
import { ElMessage } from 'element-plus'
const router = useRouter()
const loading = ref(false)
</script>
<template>
<!-- Element Plus components -->
2 weeks ago
</template>
<style scoped lang="css">
/* Component styles */
</style>
```
#### 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)
1 week ago
const login = async (credentials: LoginRequest): Promise<boolean> => {
// 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' }
2 weeks ago
})
1 week ago
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<CharacterDto[]> => {
return http.get('/character/list')
}
}
2 weeks ago
```
---
## 3. API Integration
### Base URL
2 weeks ago
- Development: `http://localhost:5091/api/god/`
- Routes: `api/god/{entity}` (e.g., `api/god/account/login`)
2 weeks ago
### Authentication
- JWT Bearer tokens
1 week ago
- Store in `localStorage` as `auth_token` (Game) or `sessionStorage` (Admin)
- Header: `Authorization: Bearer {token}`
2 weeks ago
### Key Endpoints
- POST `/api/god/account/register` - Register account
2 weeks ago
- POST `/api/god/account/login` - User login
- POST `/api/god/account/login/admin` - Admin login
2 weeks ago
---
## 4. Development Workflow
1 week ago
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/`)
2 weeks ago
---
## 5. Adding New Features
### Backend
1. Create model in `DB/` (extend `BaseEntity`)
2. Create interface in `Services/`
2 weeks ago
3. Implement service in `Services/`
4. Create controller in `Controllers/`
5. Register service in `Program.cs`
### Frontend
1 week ago
1. Add API function in `src/api/{entity}.ts` (import `http` from `./index`)
2. Add Pinia store in `src/stores/` if needed
2 weeks ago
3. Create view component in `src/views/`
4. Add route in `src/router/index.ts`
---
## 6. Important Notes
1 week ago
- **Admin credentials**: `admin` / `love_god.123`
- **Test account**: `Tom` / `123456` (email: 976802198@qq.com)
1 week ago
- Backend runs on ports **59447** (HTTPS) and **59448** (HTTP)
- Admin Frontend uses sessionStorage; Game Frontend uses localStorage
- Always use `await` with async operations
1 week ago
- Run type-check before committing