From 6ddb157cef7df8142ab1daf9dc3e5ef829f37843 Mon Sep 17 00:00:00 2001 From: hanqin Date: Thu, 19 Mar 2026 14:18:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=A5=E5=B8=B8=E4=BB=BB=E5=8A=A1=E7=9B=B8?= =?UTF-8?q?=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 145 ++--- .../Controllers/DailyMissionController.cs | 78 +++ .../Build_God_Api/DB/CharacterDailyMission.cs | 71 +++ .../Build_God_Api/DB/MissionProgress.cs | 2 +- Build_God_Api/Build_God_Api/DB/Pill.cs | 4 +- Build_God_Api/Build_God_Api/Program.cs | 3 + .../Services/CharacterService.cs | 11 +- .../Services/DailyMissionHostedService.cs | 37 ++ .../Services/DailyMissionService.cs | 305 ++++++++++ Build_God_Game/src/api/dailyMission.ts | 92 +++ Build_God_Game/src/router/index.ts | 6 + Build_God_Game/src/views/DailyMissionView.vue | 571 ++++++++++++++++++ Build_God_Game/src/views/GameView.vue | 2 + Build_God_Game/模拟导图.xls | Bin 26624 -> 43008 bytes 14 files changed, 1232 insertions(+), 95 deletions(-) create mode 100644 Build_God_Api/Build_God_Api/Controllers/DailyMissionController.cs create mode 100644 Build_God_Api/Build_God_Api/DB/CharacterDailyMission.cs create mode 100644 Build_God_Api/Build_God_Api/Services/DailyMissionHostedService.cs create mode 100644 Build_God_Api/Build_God_Api/Services/DailyMissionService.cs create mode 100644 Build_God_Game/src/api/dailyMission.ts create mode 100644 Build_God_Game/src/views/DailyMissionView.vue diff --git a/AGENTS.md b/AGENTS.md index f5282bb..a00c9f6 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,10 +1,9 @@ # AGENTS.md - Build God Project -This document provides guidelines for agentic coding agents working on this repository. +Guidelines for agentic coding agents working on this repository. ## Project Overview -Build God is a full-stack application with: - **Backend**: ASP.NET Core 8.0 Web API (C#) - **Frontend**: Vue 3 + TypeScript + Vite + Element Plus @@ -14,31 +13,23 @@ Build God is a full-stack application with: ### Backend (.NET API) -Located in: `BuildGod_Api/` - ```bash -# Build the solution -dotnet build BuildGod_Api.sln +# Build the solution (from Build_God_Api directory) +dotnet build Build_God_Api/Build_God_Api.csproj -# Run the API (from BuildGod_Api directory) +# Run the API dotnet run --project Build_God_Api/Build_God_Api.csproj - -# Build and run with Docker -docker build -t build-god-api BuildGod_Api/ -docker run -p 5091:80 build-god-api ``` -**Note**: No test framework is currently configured for the backend. +**Note**: No test framework or linting is currently configured for the backend. ### Frontend (Vue 3) -Located in: `Build_God_Admin_Frontend/Frontend/` - ```bash # Install dependencies npm install -# Start development server +# Start development server (http://localhost:5173) npm run dev # Build for production @@ -51,7 +42,7 @@ npm run type-check npm run preview ``` -**Running a single test**: No tests are currently configured. +**Note**: No test framework or ESLint is currently configured for the frontend. --- @@ -59,97 +50,84 @@ npm run preview ### Backend (.NET/C#) -#### General Conventions +#### Conventions - Use **file-scoped namespaces** (`namespace Build_God_Api.Controllers;`) -- Enable **nullable reference types** (`enable`) +- Enable **nullable reference types** - Use **primary constructors** for dependency injection - Use **async/await** for all I/O operations -#### Naming Conventions -- **Types/Classes**: PascalCase (`AccountController`, `AccountService`) -- **Methods**: PascalCase (`GetAccount`, `Register`) -- **Properties**: PascalCase (`UserName`, `Email`) -- **Local variables**: camelCase (`accountId`, `existingAccount`) -- **Parameters**: camelCase (`accountName`, `emailAddress`) -- **Interfaces**: Prefix with `I` (`IAccountService`, `ICurrentUserService`) +#### Naming +- **Classes/Types**: PascalCase (`AccountController`, `AccountService`) +- **Methods/Properties**: PascalCase (`GetAccount`, `UserName`) +- **Local variables/Parameters**: camelCase (`accountId`, `emailAddress`) +- **Interfaces**: Prefix with `I` (`IAccountService`) #### Project Structure ``` -Controllers/ # API endpoints -Services/ # Business logic (interface + implementation) -DB/ # Database entities/models +Build_God_Api/ + Controllers/ # API endpoints + Services/ # Business logic (interface + implementation) + Services/Game/ # Game-specific services + DB/ # Database entities (extend BaseEntity) + Dto/ # Data transfer objects + Common/ # Utilities + Hubs/ # SignalR hubs ``` #### Error Handling - Return `BadRequest("error message")` for validation errors - Return `Ok(result)` for successful operations -- Use try-catch with logging for operations that may fail -- Use `ILogger` for logging - -#### Dependency Injection -```csharp -public class AccountController(IAccountService service) : ControllerBase -{ - private readonly IAccountService _service = service; - // ... -} -``` +- Use try-catch with `ILogger` for error logging #### Route Conventions - Use `[Route("api/god/[controller]")]` -- Use `[ApiController]` attribute -- Use HTTP method attributes: `[HttpGet]`, `[HttpPost]`, `[HttpPut]`, `[HttpDelete]` +- Use `[ApiController]` and HTTP method attributes --- ### Frontend (Vue 3 + TypeScript) -#### General Conventions +#### Conventions - Use **Composition API** with ` diff --git a/Build_God_Game/src/views/GameView.vue b/Build_God_Game/src/views/GameView.vue index 37b42fe..2215cf5 100644 --- a/Build_God_Game/src/views/GameView.vue +++ b/Build_God_Game/src/views/GameView.vue @@ -52,6 +52,8 @@ const handleSwitchCharacter = () => { const navigateTo = (item: { label: string }) => { if (item.label === '打坐' || item.label === '打坐中') { router.push('/training') + } else if (item.label === '任务') { + router.push('/daily-mission') } } diff --git a/Build_God_Game/模拟导图.xls b/Build_God_Game/模拟导图.xls index ae203f0c0edc40e3fef1747ff0eb4e9eabe779e5..435db336a7379006f30616715ec7a7fe325fe8c9 100644 GIT binary patch literal 43008 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 delta 440 zcmZp;z|?Soae@t_-bUNwjEshpS((=J{`>#`KL{HzFfbTRc4Xc^F`;1+OAhCP*_u5! zx87mYpIpk)%oG>C`4>x_os?S$P#FUoV=zMoLn;uKFc>kkGKer-3Y|R3d83F3NEQs_ zfut%s1H-)F$v0>DZQkm_!^kMV`H*WV(`0XtlQQxQj0`Lc{0ysCfxs_&h$c=37e)r= z$