From 9c0bcc23ae7397f9a952422ddb74b5390f7b72fb Mon Sep 17 00:00:00 2001 From: hanqin Date: Wed, 18 Mar 2026 09:19:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 237 ++ Build_God_Admin_Frontend/.gitignore | 37 + .../Frontend/.env.development | 2 + .../Frontend/.env.production | 2 + Build_God_Admin_Frontend/Frontend/.gitignore | 39 + .../17.14.1204.46620/CodeChunks.db | Bin 0 -> 385024 bytes .../17.14.1204.46620/SemanticSymbols.db | Bin 0 -> 77824 bytes ...386c32c4-b9ee-4dbd-a581-3a705798da36.vsidx | Bin 0 -> 25436 bytes ...4728dbf9-f440-46eb-88e4-4db8163ed89b.vsidx | Bin 0 -> 107 bytes ...5605984b-62f9-4eaa-8bf4-955fb18f6973.vsidx | Bin 0 -> 4171 bytes ...9255374b-c7f1-458c-a33b-8b234c94b5a0.vsidx | Bin 0 -> 480637 bytes ...a4763d64-25e3-4dbe-bf7f-24febff8dc81.vsidx | Bin 0 -> 107 bytes .../Frontend/config/applicationhost.config | 1026 +++++ .../Frontend/.vs/Frontend/v17/.wsuo | Bin 0 -> 31232 bytes .../Frontend/v17/DocumentLayout.backup.json | 63 + .../.vs/Frontend/v17/DocumentLayout.json | 59 + .../Frontend/.vs/ProjectSettings.json | 3 + .../Frontend/.vs/VSWorkspaceState.json | 6 + .../Frontend/.vs/slnx.sqlite | Bin 0 -> 110592 bytes .../Frontend/ADMIN_SYSTEM_README.md | 173 + .../Frontend/API_IMPLEMENTATION_COMPLETE.md | 434 ++ .../Frontend/API_INTEGRATION_COMPLETE.md | 507 +++ .../Frontend/API_INTEGRATION_GUIDE.md | 399 ++ .../Frontend/API_QUICK_REFERENCE.md | 306 ++ .../Frontend/BACKEND_API_EXAMPLE.md | 401 ++ .../Frontend/PROJECT_SUMMARY.md | 501 +++ .../Frontend/QUICK_START.md | 170 + Build_God_Admin_Frontend/Frontend/README.md | 42 + .../Frontend/README_API_SUMMARY.md | 235 ++ .../Frontend/WHAT_TO_DO_NEXT.md | 390 ++ Build_God_Admin_Frontend/Frontend/env.d.ts | 1 + Build_God_Admin_Frontend/Frontend/index.html | 13 + .../Frontend/package-lock.json | 3561 +++++++++++++++++ .../Frontend/package.json | 35 + .../Frontend/public/favicon.ico | Bin 0 -> 4286 bytes Build_God_Admin_Frontend/Frontend/src/App.vue | 25 + .../Frontend/src/api/auth.ts | 70 + .../Frontend/src/api/bag.ts | 89 + .../Frontend/src/api/character.ts | 31 + .../Frontend/src/api/equipment.ts | 114 + .../Frontend/src/api/index.ts | 62 + .../Frontend/src/api/level.ts | 32 + .../Frontend/src/api/mission.ts | 82 + .../Frontend/src/api/missionProgress.ts | 42 + .../Frontend/src/api/pill.ts | 49 + .../Frontend/src/api/spirit.ts | 27 + .../Frontend/src/api/statistics.ts | 16 + .../Frontend/src/assets/base.css | 86 + .../Frontend/src/assets/logo.svg | 1 + .../Frontend/src/assets/main.css | 28 + .../Frontend/src/components/Header.vue | 105 + .../Frontend/src/components/HelloWorld.vue | 41 + .../Frontend/src/components/Sidebar.vue | 192 + .../Frontend/src/components/TheWelcome.vue | 95 + .../Frontend/src/components/WelcomeItem.vue | 87 + .../src/components/icons/IconCommunity.vue | 7 + .../components/icons/IconDocumentation.vue | 7 + .../src/components/icons/IconEcosystem.vue | 7 + .../src/components/icons/IconSupport.vue | 7 + .../src/components/icons/IconTooling.vue | 19 + .../Frontend/src/constants/theme.ts | 41 + Build_God_Admin_Frontend/Frontend/src/main.ts | 27 + .../Frontend/src/router/index.ts | 104 + .../Frontend/src/stores/auth.ts | 73 + .../Frontend/src/stores/counter.ts | 12 + .../Frontend/src/views/AboutView.vue | 15 + .../Frontend/src/views/AdminLayout.vue | 79 + .../Frontend/src/views/HomeView.vue | 9 + .../Frontend/src/views/LoginView.vue | 166 + .../Frontend/src/views/admin/BagsView.vue | 365 ++ .../src/views/admin/DashboardView.vue | 460 +++ .../src/views/admin/EquipmentsView.vue | 640 +++ .../Frontend/src/views/admin/LevelsView.vue | 433 ++ .../Frontend/src/views/admin/MissionView.vue | 1042 +++++ .../Frontend/src/views/admin/PillsView.vue | 542 +++ .../Frontend/src/views/admin/SettingsView.vue | 296 ++ .../Frontend/src/views/admin/SpiritsView.vue | 375 ++ .../Frontend/src/views/admin/UsersView.vue | 426 ++ .../Frontend/tsconfig.app.json | 12 + .../Frontend/tsconfig.json | 11 + .../Frontend/tsconfig.node.json | 19 + .../Frontend/vite.config.ts | 18 + Build_God_Api/.dockerignore | 30 + Build_God_Api/.gitignore | 52 + Build_God_Api/Build_God_Api.sln | 25 + .../Build_God_Api/Build_God_Api.csproj | 25 + .../Build_God_Api/Build_God_Api.http | 6 + .../Build_God_Api/Common/EnumHelper.cs | 41 + .../Controllers/AccountController.cs | 94 + .../Controllers/BagController.cs | 121 + .../Controllers/CharacterController.cs | 100 + .../Controllers/EquipmentController.cs | 75 + .../Controllers/Game/TrainingController.cs | 24 + .../Controllers/LevelController.cs | 42 + .../Controllers/MissionController.cs | 130 + .../Controllers/PillController.cs | 59 + .../Controllers/ProfessionController.cs | 43 + .../Controllers/StatisticsController.cs | 18 + Build_God_Api/Build_God_Api/DB/Account.cs | 19 + Build_God_Api/Build_God_Api/DB/Bag.cs | 50 + Build_God_Api/Build_God_Api/DB/BagItem.cs | 43 + Build_God_Api/Build_God_Api/DB/BaseEntity.cs | 20 + Build_God_Api/Build_God_Api/DB/Character.cs | 83 + .../Build_God_Api/DB/CharacterBag.cs | 20 + .../DB/CharacterMissionProgress.cs | 40 + Build_God_Api/Build_God_Api/DB/ChatMessage.cs | 15 + .../Build_God_Api/DB/ChatMessageType.cs | 9 + Build_God_Api/Build_God_Api/DB/Equipment.cs | 217 + Build_God_Api/Build_God_Api/DB/Level.cs | 40 + Build_God_Api/Build_God_Api/DB/Mission.cs | 121 + .../Build_God_Api/DB/MissionProgress.cs | 65 + .../Build_God_Api/DB/MissionReward.cs | 51 + Build_God_Api/Build_God_Api/DB/Pill.cs | 72 + Build_God_Api/Build_God_Api/DB/Profession.cs | 40 + Build_God_Api/Build_God_Api/Dockerfile | 30 + .../Build_God_Api/Dto/CharacterDto.cs | 22 + .../Build_God_Api/Dto/EquipmentDtos.cs | 14 + .../Build_God_Api/Dto/MissionDtos.cs | 11 + .../Build_God_Api/Dto/PagedResult.cs | 30 + Build_God_Api/Build_God_Api/Hubs/ChatHub.cs | 101 + Build_God_Api/Build_God_Api/MarkDown.md | 20 + Build_God_Api/Build_God_Api/Program.cs | 197 + .../Build_God_Api/Services/AccountService.cs | 123 + .../Build_God_Api/Services/BagService.cs | 256 ++ .../Services/CharacterService.cs | 306 ++ .../Build_God_Api/Services/ChatService.cs | 61 + .../Services/CurrentUserService.cs | 35 + .../Services/EquipmentService.cs | 95 + .../CharacterAttributeCalculateService.cs | 43 + .../Services/Game/TrainingService.cs | 66 + .../Build_God_Api/Services/IChatService.cs | 11 + .../Build_God_Api/Services/LevelService.cs | 63 + .../Services/MissionProgressService.cs | 129 + .../Build_God_Api/Services/MissionService.cs | 166 + .../Build_God_Api/Services/PillService.cs | 63 + .../Build_God_Api/Services/SpiritService.cs | 66 + .../Services/StatisticsService.cs | 56 + Build_God_Api/Build_God_Api/appsettings.json | 17 + Build_God_Game/.gitignore | 49 + .../17.14.1204.46620/CodeChunks.db | Bin 0 -> 102400 bytes .../17.14.1204.46620/SemanticSymbols.db | Bin 0 -> 53248 bytes ...2099cff6-a572-4dd2-99fc-659228ba18be.vsidx | Bin 0 -> 14810 bytes ...440a4ccf-fbf1-4ea3-b521-123cfbcd8f11.vsidx | Bin 0 -> 115833 bytes Build_God_Game/.vs/Build_God_Game/v17/.wsuo | Bin 0 -> 19968 bytes .../v17/DocumentLayout.backup.json | 63 + .../Build_God_Game/v17/DocumentLayout.json | 59 + Build_God_Game/.vs/ProjectSettings.json | 3 + Build_God_Game/.vs/VSWorkspaceState.json | 6 + Build_God_Game/.vs/slnx.sqlite | Bin 0 -> 90112 bytes Build_God_Game/.vscode/extensions.json | 3 + Build_God_Game/README.md | 5 + Build_God_Game/index.html | 13 + Build_God_Game/package.json | 37 + Build_God_Game/public/vite.svg | 1 + Build_God_Game/src/App.vue | 6 + Build_God_Game/src/api/auth.ts | 61 + Build_God_Game/src/api/character.ts | 105 + Build_God_Game/src/assets/vue.svg | 1 + Build_God_Game/src/components/ChatBox.vue | 338 ++ .../src/components/GlareHover/GlareHover.vue | 113 + .../src/components/GooeyNav/GooeyNav.vue | 389 ++ .../src/components/Particles/Particles.vue | 347 ++ Build_God_Game/src/composables/useChat.ts | 106 + Build_God_Game/src/main.ts | 14 + Build_God_Game/src/router/index.ts | 70 + Build_God_Game/src/stores/auth.ts | 95 + Build_God_Game/src/stores/character.ts | 174 + Build_God_Game/src/style.css | 27 + Build_God_Game/src/views/CharacterView.vue | 705 ++++ Build_God_Game/src/views/GameView.vue | 444 ++ Build_God_Game/src/views/LoginView.vue | 294 ++ Build_God_Game/src/views/RegisterView.vue | 333 ++ Build_God_Game/src/views/TrainingView.vue | 304 ++ Build_God_Game/tsconfig.app.json | 21 + Build_God_Game/tsconfig.json | 7 + Build_God_Game/tsconfig.node.json | 26 + Build_God_Game/vite.config.ts | 30 + Build_God_Game/模拟导图.xls | Bin 0 -> 26624 bytes 178 files changed, 23148 insertions(+) create mode 100644 AGENTS.md create mode 100644 Build_God_Admin_Frontend/.gitignore create mode 100644 Build_God_Admin_Frontend/Frontend/.env.development create mode 100644 Build_God_Admin_Frontend/Frontend/.env.production create mode 100644 Build_God_Admin_Frontend/Frontend/.gitignore create mode 100644 Build_God_Admin_Frontend/Frontend/.vs/Frontend/CopilotIndices/17.14.1204.46620/CodeChunks.db create mode 100644 Build_God_Admin_Frontend/Frontend/.vs/Frontend/CopilotIndices/17.14.1204.46620/SemanticSymbols.db create mode 100644 Build_God_Admin_Frontend/Frontend/.vs/Frontend/FileContentIndex/386c32c4-b9ee-4dbd-a581-3a705798da36.vsidx create mode 100644 Build_God_Admin_Frontend/Frontend/.vs/Frontend/FileContentIndex/4728dbf9-f440-46eb-88e4-4db8163ed89b.vsidx create mode 100644 Build_God_Admin_Frontend/Frontend/.vs/Frontend/FileContentIndex/5605984b-62f9-4eaa-8bf4-955fb18f6973.vsidx create mode 100644 Build_God_Admin_Frontend/Frontend/.vs/Frontend/FileContentIndex/9255374b-c7f1-458c-a33b-8b234c94b5a0.vsidx create mode 100644 Build_God_Admin_Frontend/Frontend/.vs/Frontend/FileContentIndex/a4763d64-25e3-4dbe-bf7f-24febff8dc81.vsidx create mode 100644 Build_God_Admin_Frontend/Frontend/.vs/Frontend/config/applicationhost.config create mode 100644 Build_God_Admin_Frontend/Frontend/.vs/Frontend/v17/.wsuo create mode 100644 Build_God_Admin_Frontend/Frontend/.vs/Frontend/v17/DocumentLayout.backup.json create mode 100644 Build_God_Admin_Frontend/Frontend/.vs/Frontend/v17/DocumentLayout.json create mode 100644 Build_God_Admin_Frontend/Frontend/.vs/ProjectSettings.json create mode 100644 Build_God_Admin_Frontend/Frontend/.vs/VSWorkspaceState.json create mode 100644 Build_God_Admin_Frontend/Frontend/.vs/slnx.sqlite create mode 100644 Build_God_Admin_Frontend/Frontend/ADMIN_SYSTEM_README.md create mode 100644 Build_God_Admin_Frontend/Frontend/API_IMPLEMENTATION_COMPLETE.md create mode 100644 Build_God_Admin_Frontend/Frontend/API_INTEGRATION_COMPLETE.md create mode 100644 Build_God_Admin_Frontend/Frontend/API_INTEGRATION_GUIDE.md create mode 100644 Build_God_Admin_Frontend/Frontend/API_QUICK_REFERENCE.md create mode 100644 Build_God_Admin_Frontend/Frontend/BACKEND_API_EXAMPLE.md create mode 100644 Build_God_Admin_Frontend/Frontend/PROJECT_SUMMARY.md create mode 100644 Build_God_Admin_Frontend/Frontend/QUICK_START.md create mode 100644 Build_God_Admin_Frontend/Frontend/README.md create mode 100644 Build_God_Admin_Frontend/Frontend/README_API_SUMMARY.md create mode 100644 Build_God_Admin_Frontend/Frontend/WHAT_TO_DO_NEXT.md create mode 100644 Build_God_Admin_Frontend/Frontend/env.d.ts create mode 100644 Build_God_Admin_Frontend/Frontend/index.html create mode 100644 Build_God_Admin_Frontend/Frontend/package-lock.json create mode 100644 Build_God_Admin_Frontend/Frontend/package.json create mode 100644 Build_God_Admin_Frontend/Frontend/public/favicon.ico create mode 100644 Build_God_Admin_Frontend/Frontend/src/App.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/api/auth.ts create mode 100644 Build_God_Admin_Frontend/Frontend/src/api/bag.ts create mode 100644 Build_God_Admin_Frontend/Frontend/src/api/character.ts create mode 100644 Build_God_Admin_Frontend/Frontend/src/api/equipment.ts create mode 100644 Build_God_Admin_Frontend/Frontend/src/api/index.ts create mode 100644 Build_God_Admin_Frontend/Frontend/src/api/level.ts create mode 100644 Build_God_Admin_Frontend/Frontend/src/api/mission.ts create mode 100644 Build_God_Admin_Frontend/Frontend/src/api/missionProgress.ts create mode 100644 Build_God_Admin_Frontend/Frontend/src/api/pill.ts create mode 100644 Build_God_Admin_Frontend/Frontend/src/api/spirit.ts create mode 100644 Build_God_Admin_Frontend/Frontend/src/api/statistics.ts create mode 100644 Build_God_Admin_Frontend/Frontend/src/assets/base.css create mode 100644 Build_God_Admin_Frontend/Frontend/src/assets/logo.svg create mode 100644 Build_God_Admin_Frontend/Frontend/src/assets/main.css create mode 100644 Build_God_Admin_Frontend/Frontend/src/components/Header.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/components/HelloWorld.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/components/Sidebar.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/components/TheWelcome.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/components/WelcomeItem.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/components/icons/IconCommunity.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/components/icons/IconDocumentation.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/components/icons/IconEcosystem.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/components/icons/IconSupport.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/components/icons/IconTooling.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/constants/theme.ts create mode 100644 Build_God_Admin_Frontend/Frontend/src/main.ts create mode 100644 Build_God_Admin_Frontend/Frontend/src/router/index.ts create mode 100644 Build_God_Admin_Frontend/Frontend/src/stores/auth.ts create mode 100644 Build_God_Admin_Frontend/Frontend/src/stores/counter.ts create mode 100644 Build_God_Admin_Frontend/Frontend/src/views/AboutView.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/views/AdminLayout.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/views/HomeView.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/views/LoginView.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/views/admin/BagsView.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/views/admin/DashboardView.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/views/admin/EquipmentsView.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/views/admin/LevelsView.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/views/admin/MissionView.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/views/admin/PillsView.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/views/admin/SettingsView.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/views/admin/SpiritsView.vue create mode 100644 Build_God_Admin_Frontend/Frontend/src/views/admin/UsersView.vue create mode 100644 Build_God_Admin_Frontend/Frontend/tsconfig.app.json create mode 100644 Build_God_Admin_Frontend/Frontend/tsconfig.json create mode 100644 Build_God_Admin_Frontend/Frontend/tsconfig.node.json create mode 100644 Build_God_Admin_Frontend/Frontend/vite.config.ts create mode 100644 Build_God_Api/.dockerignore create mode 100644 Build_God_Api/.gitignore create mode 100644 Build_God_Api/Build_God_Api.sln create mode 100644 Build_God_Api/Build_God_Api/Build_God_Api.csproj create mode 100644 Build_God_Api/Build_God_Api/Build_God_Api.http create mode 100644 Build_God_Api/Build_God_Api/Common/EnumHelper.cs create mode 100644 Build_God_Api/Build_God_Api/Controllers/AccountController.cs create mode 100644 Build_God_Api/Build_God_Api/Controllers/BagController.cs create mode 100644 Build_God_Api/Build_God_Api/Controllers/CharacterController.cs create mode 100644 Build_God_Api/Build_God_Api/Controllers/EquipmentController.cs create mode 100644 Build_God_Api/Build_God_Api/Controllers/Game/TrainingController.cs create mode 100644 Build_God_Api/Build_God_Api/Controllers/LevelController.cs create mode 100644 Build_God_Api/Build_God_Api/Controllers/MissionController.cs create mode 100644 Build_God_Api/Build_God_Api/Controllers/PillController.cs create mode 100644 Build_God_Api/Build_God_Api/Controllers/ProfessionController.cs create mode 100644 Build_God_Api/Build_God_Api/Controllers/StatisticsController.cs create mode 100644 Build_God_Api/Build_God_Api/DB/Account.cs create mode 100644 Build_God_Api/Build_God_Api/DB/Bag.cs create mode 100644 Build_God_Api/Build_God_Api/DB/BagItem.cs create mode 100644 Build_God_Api/Build_God_Api/DB/BaseEntity.cs create mode 100644 Build_God_Api/Build_God_Api/DB/Character.cs create mode 100644 Build_God_Api/Build_God_Api/DB/CharacterBag.cs create mode 100644 Build_God_Api/Build_God_Api/DB/CharacterMissionProgress.cs create mode 100644 Build_God_Api/Build_God_Api/DB/ChatMessage.cs create mode 100644 Build_God_Api/Build_God_Api/DB/ChatMessageType.cs create mode 100644 Build_God_Api/Build_God_Api/DB/Equipment.cs create mode 100644 Build_God_Api/Build_God_Api/DB/Level.cs create mode 100644 Build_God_Api/Build_God_Api/DB/Mission.cs create mode 100644 Build_God_Api/Build_God_Api/DB/MissionProgress.cs create mode 100644 Build_God_Api/Build_God_Api/DB/MissionReward.cs create mode 100644 Build_God_Api/Build_God_Api/DB/Pill.cs create mode 100644 Build_God_Api/Build_God_Api/DB/Profession.cs create mode 100644 Build_God_Api/Build_God_Api/Dockerfile create mode 100644 Build_God_Api/Build_God_Api/Dto/CharacterDto.cs create mode 100644 Build_God_Api/Build_God_Api/Dto/EquipmentDtos.cs create mode 100644 Build_God_Api/Build_God_Api/Dto/MissionDtos.cs create mode 100644 Build_God_Api/Build_God_Api/Dto/PagedResult.cs create mode 100644 Build_God_Api/Build_God_Api/Hubs/ChatHub.cs create mode 100644 Build_God_Api/Build_God_Api/MarkDown.md create mode 100644 Build_God_Api/Build_God_Api/Program.cs create mode 100644 Build_God_Api/Build_God_Api/Services/AccountService.cs create mode 100644 Build_God_Api/Build_God_Api/Services/BagService.cs create mode 100644 Build_God_Api/Build_God_Api/Services/CharacterService.cs create mode 100644 Build_God_Api/Build_God_Api/Services/ChatService.cs create mode 100644 Build_God_Api/Build_God_Api/Services/CurrentUserService.cs create mode 100644 Build_God_Api/Build_God_Api/Services/EquipmentService.cs create mode 100644 Build_God_Api/Build_God_Api/Services/Game/CharacterAttributeCalculateService.cs create mode 100644 Build_God_Api/Build_God_Api/Services/Game/TrainingService.cs create mode 100644 Build_God_Api/Build_God_Api/Services/IChatService.cs create mode 100644 Build_God_Api/Build_God_Api/Services/LevelService.cs create mode 100644 Build_God_Api/Build_God_Api/Services/MissionProgressService.cs create mode 100644 Build_God_Api/Build_God_Api/Services/MissionService.cs create mode 100644 Build_God_Api/Build_God_Api/Services/PillService.cs create mode 100644 Build_God_Api/Build_God_Api/Services/SpiritService.cs create mode 100644 Build_God_Api/Build_God_Api/Services/StatisticsService.cs create mode 100644 Build_God_Api/Build_God_Api/appsettings.json create mode 100644 Build_God_Game/.gitignore create mode 100644 Build_God_Game/.vs/Build_God_Game/CopilotIndices/17.14.1204.46620/CodeChunks.db create mode 100644 Build_God_Game/.vs/Build_God_Game/CopilotIndices/17.14.1204.46620/SemanticSymbols.db create mode 100644 Build_God_Game/.vs/Build_God_Game/FileContentIndex/2099cff6-a572-4dd2-99fc-659228ba18be.vsidx create mode 100644 Build_God_Game/.vs/Build_God_Game/FileContentIndex/440a4ccf-fbf1-4ea3-b521-123cfbcd8f11.vsidx create mode 100644 Build_God_Game/.vs/Build_God_Game/v17/.wsuo create mode 100644 Build_God_Game/.vs/Build_God_Game/v17/DocumentLayout.backup.json create mode 100644 Build_God_Game/.vs/Build_God_Game/v17/DocumentLayout.json create mode 100644 Build_God_Game/.vs/ProjectSettings.json create mode 100644 Build_God_Game/.vs/VSWorkspaceState.json create mode 100644 Build_God_Game/.vs/slnx.sqlite create mode 100644 Build_God_Game/.vscode/extensions.json create mode 100644 Build_God_Game/README.md create mode 100644 Build_God_Game/index.html create mode 100644 Build_God_Game/package.json create mode 100644 Build_God_Game/public/vite.svg create mode 100644 Build_God_Game/src/App.vue create mode 100644 Build_God_Game/src/api/auth.ts create mode 100644 Build_God_Game/src/api/character.ts create mode 100644 Build_God_Game/src/assets/vue.svg create mode 100644 Build_God_Game/src/components/ChatBox.vue create mode 100644 Build_God_Game/src/components/GlareHover/GlareHover.vue create mode 100644 Build_God_Game/src/components/GooeyNav/GooeyNav.vue create mode 100644 Build_God_Game/src/components/Particles/Particles.vue create mode 100644 Build_God_Game/src/composables/useChat.ts create mode 100644 Build_God_Game/src/main.ts create mode 100644 Build_God_Game/src/router/index.ts create mode 100644 Build_God_Game/src/stores/auth.ts create mode 100644 Build_God_Game/src/stores/character.ts create mode 100644 Build_God_Game/src/style.css create mode 100644 Build_God_Game/src/views/CharacterView.vue create mode 100644 Build_God_Game/src/views/GameView.vue create mode 100644 Build_God_Game/src/views/LoginView.vue create mode 100644 Build_God_Game/src/views/RegisterView.vue create mode 100644 Build_God_Game/src/views/TrainingView.vue create mode 100644 Build_God_Game/tsconfig.app.json create mode 100644 Build_God_Game/tsconfig.json create mode 100644 Build_God_Game/tsconfig.node.json create mode 100644 Build_God_Game/vite.config.ts create mode 100644 Build_God_Game/模拟导图.xls diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..f5282bb --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,237 @@ +# AGENTS.md - Build God Project + +This document provides 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 + +--- + +## 1. Build, Lint, and Test Commands + +### Backend (.NET API) + +Located in: `BuildGod_Api/` + +```bash +# Build the solution +dotnet build BuildGod_Api.sln + +# Run the API (from BuildGod_Api directory) +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. + +### Frontend (Vue 3) + +Located in: `Build_God_Admin_Frontend/Frontend/` + +```bash +# Install dependencies +npm install + +# Start development server +npm run dev + +# Build for production +npm run build + +# Type-check only +npm run type-check + +# Preview production build +npm run preview +``` + +**Running a single test**: No tests are currently configured. + +--- + +## 2. Code Style Guidelines + +### Backend (.NET/C#) + +#### General 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 + +#### 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`) + +#### Project Structure +``` +Controllers/ # API endpoints +Services/ # Business logic (interface + implementation) +DB/ # Database entities/models +``` + +#### 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; + // ... +} +``` + +#### Route Conventions +- Use `[Route("api/god/[controller]")]` +- Use `[ApiController]` attribute +- Use HTTP method attributes: `[HttpGet]`, `[HttpPost]`, `[HttpPut]`, `[HttpDelete]` + +--- + +### Frontend (Vue 3 + TypeScript) + +#### General 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 () => { /* ... */ } + + return { token, isAuthenticated, login } +}) +``` + +#### UI Library (Element Plus) +- Use Element Plus components: `ElButton`, `ElInput`, `ElTable`, etc. +- Use `ElMessage` for notifications +- Use `ElMessageBox` for confirmations +- Follow Element Plus prop naming conventions + +#### Error Handling +- Use try-catch with async/await +- Show errors with `ElMessage.error()` +- Handle 401 (unauthorized) by redirecting to login + +--- + +## 3. API Integration + +### Backend API Base URL +- Development: `http://localhost:5091/api/god/` +- Routes follow pattern: `api/god/{entity}` (e.g., `api/god/account/login`) + +### Authentication +- Use JWT Bearer tokens +- Store token in `localStorage` as `auth_token` +- Include in requests: `Authorization: Bearer {token}` + +### Common Endpoints +- POST `/api/god/account/register` - Register new account +- POST `/api/god/account/login` - User login +- POST `/api/god/account/login/admin` - Admin login (use: name="admin", password="build_god.123") + +--- + +## 4. Development Workflow + +1. **Start Backend**: Run `dotnet run` in `BuildGod_Api/` +2. **Start Frontend**: Run `npm run dev` in `Build_God_Admin_Frontend/Frontend/` +3. **Access**: Frontend runs on `http://localhost:5173` by default + +--- + +## 5. Adding New Features + +### Backend +1. Create model in `DB/` folder (extend `BaseEntity`) +2. Create service interface in `Services/` +3. Implement service in `Services/` +4. Create controller in `Controllers/` +5. Register service in `Program.cs` + +### Frontend +1. Create API module in `src/api/` +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 + +- The admin login credentials are hardcoded: `admin` / `build_god.123` +- Backend runs on port 5091 +- Frontend uses Vite proxy for API calls (configured in `vite.config.ts`) +- Use `npm run type-check` before committing to catch TypeScript errors +- Always use `await` with async operations - never ignore promises diff --git a/Build_God_Admin_Frontend/.gitignore b/Build_God_Admin_Frontend/.gitignore new file mode 100644 index 0000000..d28c088 --- /dev/null +++ b/Build_God_Admin_Frontend/.gitignore @@ -0,0 +1,37 @@ +# ============== 依赖目录 ============== +# npm/yarn/pnpm 安装的第三方依赖,体积大,无需提交,部署时重新安装即可 +node_modules/ +.pnpm-store/ + +# ============== 打包构建产物 ============== +# Vue-CLI 打包输出目录 +dist/ +# Vite 打包默认输出目录(和dist二选一即可,兼容写法) +dist-ssr/ +# 旧版webpack打包目录 +build/ + +# ============== 环境变量配置文件 ============== +# 包含密钥、接口地址等敏感信息,绝对禁止提交 +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# ============== 日志与缓存文件 ============== +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# ============== 编辑器/IDE 配置文件 ============== +.idea/ +.vscode/ +*.swp +*.swo +.DS_Store # macOS系统自动生成的隐藏文件 + +# ============== 测试/编译缓存 ============== +coverage/ +*.local \ No newline at end of file diff --git a/Build_God_Admin_Frontend/Frontend/.env.development b/Build_God_Admin_Frontend/Frontend/.env.development new file mode 100644 index 0000000..40bd306 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/.env.development @@ -0,0 +1,2 @@ +# 开发环境配置 +VITE_API_URL=http://localhost:5091/api/god/ diff --git a/Build_God_Admin_Frontend/Frontend/.env.production b/Build_God_Admin_Frontend/Frontend/.env.production new file mode 100644 index 0000000..1e3a2ec --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/.env.production @@ -0,0 +1,2 @@ +# 生产环境配置 +VITE_API_URL=https://api.example.com/api diff --git a/Build_God_Admin_Frontend/Frontend/.gitignore b/Build_God_Admin_Frontend/Frontend/.gitignore new file mode 100644 index 0000000..cd68f14 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/.gitignore @@ -0,0 +1,39 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo + +.eslintcache + +# Cypress +/cypress/videos/ +/cypress/screenshots/ + +# Vitest +__screenshots__/ + +# Vite +*.timestamp-*-*.mjs diff --git a/Build_God_Admin_Frontend/Frontend/.vs/Frontend/CopilotIndices/17.14.1204.46620/CodeChunks.db b/Build_God_Admin_Frontend/Frontend/.vs/Frontend/CopilotIndices/17.14.1204.46620/CodeChunks.db new file mode 100644 index 0000000000000000000000000000000000000000..bd340e9829a17c919303726754c92c0bce4b9af6 GIT binary patch literal 385024 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 z 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 KPZFLe9Qt4S*DG28 literal 0 HcmV?d00001 diff --git a/Build_God_Admin_Frontend/Frontend/.vs/Frontend/CopilotIndices/17.14.1204.46620/SemanticSymbols.db b/Build_God_Admin_Frontend/Frontend/.vs/Frontend/CopilotIndices/17.14.1204.46620/SemanticSymbols.db new file mode 100644 index 0000000000000000000000000000000000000000..ee74a2b1974c3c75355705193ccab20bde69106b GIT binary patch literal 77824 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

s$5Kuu9`Pj z!(}BkG9~W?q47)+Qc)dLadJfw^1+jzn3jhDc_Vi7s>mL_&#pi}@QBqlZ3kTsjiL-Mf$xHih7_g<;D?Ql0|vT}|47Mx7P>$KOSN`=$@fsvV>y zrPOo~G@gI=(KTKOcRv9x_(*znleb~z)E}-tdyOG+k^)4$)yY*0d8fDxEL`RM#jU!^lE%lr_v8Wj z7?jYG{SdKvu2=}#Ii(cv>4$EK$%mi-{3XuCHF?Sweb}~$mc`%GvH!VA`3S(`FFHnC z3;Od2&|0gX>|Qt>kqZFa(NrUr&W1pscQ{|XDJstcDE>lbonFJ{NYIXfUtV*tH!Abk zsI@6K)L>7(@Hf7Qd>EU6n)4%IPsH`V`;fhzp{Tx9_Wx962U%GF5&E&)K;KcTbFhY$ z54aAQp7`RVoQE>-6sYcDEGmDW5ATte0N9Epd}%ME1{RVR0SwQiR36WwHSdg^14O*7 zZH(T2F0Q`S@Ayb++fjas~=$ zZi`Rxgcc2QOkMy;2UZ*Fk7`l6$I18k+is^eQ__x$A?~1@hN5?16?VQ$KbOvx*?st``^8sp-7DV)(0GfU8)k5! z2X6Ad_p48}-$n(8RX5~flqt`{*#fy#d`P=M8d7#crsSg_D*h%7bjFFu=3vL6IL~D{ zW#~F>az60RPmjw+-rd<%$( z=LnRPiiP6?(BV^>Vma=noZtu)MVvT^_Tx3TsZoE(5I6=u@GWn?0i5eeaHFw^&@`ad zjV^G}lLn9%&yATH@x&6bP{JEZ1bx%!z%YfA7p;6qejA|Tjd7LDrXfbxt_b(rK5uN|Po<2{x9&yE-zjD6ExyA96gLhnIeVh3~>$C08w7;W$ zSKCW%@2AhV-DrQ#{&xFj+jne7nJ$aZb{+E_MzX%a@>9#-oBv>*tREhdcL@W80m8ul zQ3fVyX-ktw#ndL3n5VJNNvs`m843F^pViYz%n9t{4J(Im=5157w6!HHR*bRCt=Kfy zdIZc{hiS=$C1eRqIg<1^_DP*39L>XIZfS}*-N0U%$77CRAJe3&Omzsr9G#)19a!Wc zKz(po<>WBS{9_fl^b4}k-fCk-(ko@1XVIc; zSe2_&UhGzL1kRt~EZU|FuugL-Pb*{oBuB@#F8()<(XY^_=y|%+bj~E1UT^#l{`bBSfa@IKwJLD+ zjNilEJ=b{tdE~Cw0hXyY(S1QI-IV0V&yN4=|NO{zS0_!~hJjQy6*6!~kfx4Z0#4=p z#|J+-mFzZ!Z%2pb)tRDMwO)0-A?^5&u!K%Ux)jJ&lIsumWZ(1cN&n7EY{=RGOv_MC zTn|un62Gg~SJ#^x%;tOhY3kNXXp73&OA{`J6t>Qc{i?$09h{2D3npBzX#d`i@9^)q zMD|J{PE96u@C`I|{1U2JLei(=N4A4Jm(rC=C|by+C5B_$RK7_3-{5%9s_Fg8DW^&u zB=P^nEt#!RMiT#XB>rzUGOb=L!w5~epZYO@#Q&woLXr5t`oRVy{#SB(iPAcZ(nVD) YO5*=j!t={=FIrOuSQjz;IpY8S1$T58Pyhe` literal 0 HcmV?d00001 diff --git a/Build_God_Admin_Frontend/Frontend/.vs/Frontend/FileContentIndex/386c32c4-b9ee-4dbd-a581-3a705798da36.vsidx b/Build_God_Admin_Frontend/Frontend/.vs/Frontend/FileContentIndex/386c32c4-b9ee-4dbd-a581-3a705798da36.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..56fc60474cde92f5223eab416d8c024e6632810a GIT binary patch literal 25436 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 literal 0 HcmV?d00001 diff --git a/Build_God_Admin_Frontend/Frontend/.vs/Frontend/FileContentIndex/4728dbf9-f440-46eb-88e4-4db8163ed89b.vsidx b/Build_God_Admin_Frontend/Frontend/.vs/Frontend/FileContentIndex/4728dbf9-f440-46eb-88e4-4db8163ed89b.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..70aef67a00f5a48bfb0d87044cf8f151e2685b5d GIT binary patch literal 107 wcmZ>EaTnxZU~p%E02V0C38Z0cW+XOHDO{Wlsuo0n)bd05(ok9*N*hCI0FV0t;Q#;t literal 0 HcmV?d00001 diff --git a/Build_God_Admin_Frontend/Frontend/.vs/Frontend/FileContentIndex/5605984b-62f9-4eaa-8bf4-955fb18f6973.vsidx b/Build_God_Admin_Frontend/Frontend/.vs/Frontend/FileContentIndex/5605984b-62f9-4eaa-8bf4-955fb18f6973.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..faaf35b424f7b222987835f853757f096cd145c7 GIT binary patch literal 4171 zcmYM0XLQs>6vZD+5es7P5)3BMK(Ol)ktMrXRoZ?#7|=XCe9H}>`R^mp}iwry^d`ewFu%pEU(p!vfn|r!0vimC^5oH2n*C)4_W}Q+XmJ0h?1*R> zf-e%lzQAR(J%*4ihTsUr6j<6;<%I`h^aq=eC)`n-P-J+a6JaqUmWeuGMX*Q3&>!*{ z?3J8a-UW=J{~VtSHVeHUk0E%dBy11|?a>|$5o+8FiNPKdVP2$)^fsC8;xg^Ti>Qe|?<(#l?k?^j?kVmi z?k(;k?kkQKE5tG4eqyCKR@`5#601dQqvv&ic%WD-juXd=b>al^An{=F5b;p)F!6Bl z2=PeqC@~^V6zj#K#Yy5Z;$$%@P7!fReLXQTE;fn@5eLidk|M6JKOZMHi77EHX2h&` zyqFX7VnJ*cr->(sE#h>Me+PITTg5hUhIo?LE*8ZO@nmtP*eQ02r--w}Q$^e{pZ7Eo zx6q$wi*v*tu~(cco+0*$C9z+eC!Q&uC7vzfJ>&D8E6x|s6Bmf*ix-Fk;)UWx;>F@Z z@e*;7c&T`qc)56mc%^uixLCYeTp}(NuMw{muM@8qZxC-3mx(utH;cE3w~Dukw~Kd( zcZzq3%f-9Jd&CvuO7ULtKJk9>0r5fcA@O1H5%E!RmH3$WxcG$lr1+G$T6|huBR(Up z6`vKK6Q38?i7$vRiZ6*Ti|fT##8<`F#Mi|)#5cva#J9zF#COH_#P`Jy#1F-f#E->K z#81Ty;%DOL;uqqV;#cC=;zscs@mujb@q6(H@kj9|ag+G7_>1_f_?!5Yepo-u7htH znzbCXU{R~LDX^)BbsEZ;QT%@+?#l6$x6?KW?W~XH(2Bx80i^{sjwo^TF;)itQ_LXikgJds{xtikTGL0?}`9NQcz_>3(cvjzQ)Ua3Y{C(!0P8<9`O_pbnD#aPW8lo7c15!VIKlIy zG<>MEWc8A;U^|amQ{%3AD6?T*qOQ!8)#QpJP|ib5yXK*3SaQB5SH|X<3a2TIF%MQY z8dTbFXL7!}u;0`adV+TqV&^?RPhKV3ysz9v=EC{7m-VhZkBm&^ zDE+8)uHn3LO{@mB)mzoBQCCJ|eR!tnTeMo(@~uNHLivv2ZLe{SxU$B~hbO7pm3NhA zh{{psL!~eGk-O0f&3b(91KYG@J!r-H@@>X@!v5*#;rVES@`O^8P@bS>jK!clThtts y`SM<6+%xX0nuHb5i|^JLlx@CEvi>%yajo@tFl8uyBlX1pWAQU_NZ_&&f&T$cT%&{l literal 0 HcmV?d00001 diff --git a/Build_God_Admin_Frontend/Frontend/.vs/Frontend/FileContentIndex/9255374b-c7f1-458c-a33b-8b234c94b5a0.vsidx b/Build_God_Admin_Frontend/Frontend/.vs/Frontend/FileContentIndex/9255374b-c7f1-458c-a33b-8b234c94b5a0.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..7f56ef1b74b34235387e4cc959f9e35a5536c82c GIT binary patch literal 480637 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

6%vFqd{6rG*mD3cTxiioyCwkRx=PdW?5 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 P=fxj#@!!Rt^8f!2mE2&T literal 0 HcmV?d00001 diff --git a/Build_God_Admin_Frontend/Frontend/.vs/Frontend/FileContentIndex/a4763d64-25e3-4dbe-bf7f-24febff8dc81.vsidx b/Build_God_Admin_Frontend/Frontend/.vs/Frontend/FileContentIndex/a4763d64-25e3-4dbe-bf7f-24febff8dc81.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..70aef67a00f5a48bfb0d87044cf8f151e2685b5d GIT binary patch literal 107 wcmZ>EaTnxZU~p%E02V0C38Z0cW+XOHDO{Wlsuo0n)bd05(ok9*N*hCI0FV0t;Q#;t literal 0 HcmV?d00001 diff --git a/Build_God_Admin_Frontend/Frontend/.vs/Frontend/config/applicationhost.config b/Build_God_Admin_Frontend/Frontend/.vs/Frontend/config/applicationhost.config new file mode 100644 index 0000000..cdd2df8 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/.vs/Frontend/config/applicationhost.config @@ -0,0 +1,1026 @@ + + + + + + + +

+
+
+
+
+
+
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+ + +
+
+
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Build_God_Admin_Frontend/Frontend/.vs/Frontend/v17/.wsuo b/Build_God_Admin_Frontend/Frontend/.vs/Frontend/v17/.wsuo new file mode 100644 index 0000000000000000000000000000000000000000..813d29512265be65d231a95f9566fc0420f7890a GIT binary patch literal 31232 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 WI<-#o;#uF_&?V$)UbKh!wf_T0x9bZ4 literal 0 HcmV?d00001 diff --git a/Build_God_Admin_Frontend/Frontend/.vs/Frontend/v17/DocumentLayout.backup.json b/Build_God_Admin_Frontend/Frontend/.vs/Frontend/v17/DocumentLayout.backup.json new file mode 100644 index 0000000..5e61e86 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/.vs/Frontend/v17/DocumentLayout.backup.json @@ -0,0 +1,63 @@ +{ + "Version": 1, + "WorkspaceRootPath": "D:\\Test\\Build_God\\Build_God_Admin_Frontend\\Frontend\\", + "Documents": [], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 200, + "SelectedChildIndex": -1, + "Children": [ + { + "$type": "Bookmark", + "Name": "ST:129:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:128:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:136:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:135:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:134:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:133:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:132:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:131:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:130:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:131:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/Build_God_Admin_Frontend/Frontend/.vs/Frontend/v17/DocumentLayout.json b/Build_God_Admin_Frontend/Frontend/.vs/Frontend/v17/DocumentLayout.json new file mode 100644 index 0000000..ecf552c --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/.vs/Frontend/v17/DocumentLayout.json @@ -0,0 +1,59 @@ +{ + "Version": 1, + "WorkspaceRootPath": "D:\\Test\\Build_God\\Build_God_Admin_Frontend\\Frontend\\", + "Documents": [], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 200, + "SelectedChildIndex": -1, + "Children": [ + { + "$type": "Bookmark", + "Name": "ST:129:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:128:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:136:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:135:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:134:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:133:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:132:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:131:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:130:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:131:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/Build_God_Admin_Frontend/Frontend/.vs/ProjectSettings.json b/Build_God_Admin_Frontend/Frontend/.vs/ProjectSettings.json new file mode 100644 index 0000000..f8b4888 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": null +} \ No newline at end of file diff --git a/Build_God_Admin_Frontend/Frontend/.vs/VSWorkspaceState.json b/Build_God_Admin_Frontend/Frontend/.vs/VSWorkspaceState.json new file mode 100644 index 0000000..6b61141 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/.vs/VSWorkspaceState.json @@ -0,0 +1,6 @@ +{ + "ExpandedNodes": [ + "" + ], + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/Build_God_Admin_Frontend/Frontend/.vs/slnx.sqlite b/Build_God_Admin_Frontend/Frontend/.vs/slnx.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..c7a1067ce1724d8edd79f1b5a30411f73d3773a0 GIT binary patch literal 110592 zcmeHw3w#_`dGE~bYFGQ1Ig%Awwq?f~o754`*!zCOq(NS-ZN;)|>)|BWLfxI2wbzk$ zmEDySlZ15S@JyT12he*d<=*r`Tc9a$Z~Ft*ya0w-)rTlHKpDUK8GZlZB>0nrvd9&ZoFt$Am z!}P*G{jUptIP@2AS<~-%egcmzxo6ujF}jFpR-lW%Kk;>VcY7XnKhpkPm)*JF{+qV* zwh`Oy^RS@auN?&1v8c)$cvsII0;}xL7bN+<(c{zE;?#hg%NO#Me6cX8{wy5ck)M(W zrOClYL?|_q?jKA02ZsmJclr-D#bbi=_~CEwa6SEm|E7c1WGDKRZqC({0x@?s7IQc= zEjJd9Uqm<~<{~0t!U=zB@6Zs|b$D;8e>C0qj$3`M9zkH=D^xPsDY;hl+ILP9W~_hv zP`ZKUoaZJLmpTv!r3t`yEWI;5;@>wixTk;QF8}WIUH<;@vAu)Cz;;i1cnqY1f8#?# zH)~w>m5Rsml3X&!)@f7{oCzc89qEzua4J3OKd8q@7b^M6@rj$N9>Ai{hywXGzHa~n z0WhTc2hx_Hf%H(?2-1a70USQiKa$$jKXOwj8ttnJT!X6~WykE))bahZnW=m(FH4OW zSo1@Vw;M`{ftRka9@;O8a=Dz(=BKcVRak4uYRX_8ouRTBKwMEqkC!X*bQQu{FASyM zh`kgnhl*kb*UypSz4I%e6Qzn%v(troI?mIlZ1uW&CZS$Ul6plX6*Gl`TuNocBl2Xu z=xQyiCG=TqS#9vVd`xw&HV%}%`qU@-PKFYJFHppCO zny7JFhBlJ9uH;y197%Wa0<*mGqE~CPQhIr}NTU;03$N}`SN|JV^0DJH&`Rnpm7auN z^TzVia=DV3o|*9D#$#-7545DvUg44`xLrM4``9@|N}`@D<~NBSx`!&5N6Xgn;lcgm z)h~}uQ;lRQUV50O7<^-NA64X~Dav5k~Notets`sTKl zL2IC?1nL3iOlqR!sU@Q-u&R#H%mx;1W%YEcsx}iDXW1<-S5I2dv#hotPwvZ<wGhO&WH%L5pY>nwmV%tcSFl}+-UhswNOjCKBlSt zGm*PAeY7r6ZL~$WEuz~3N_4lGyG3=$VpJLn>|8`(BjzH)H3Gix#4d;0NT-ZO+JsiE zoNd+$QX6clBDFzFt17C@Mk#NiCo*py7;PPC$8diN|1F_Qu)G$2u#B;p@NXZi?*51t@=2u<*A;I6eH5zS0l_IbZIBDcwn$ql6w|W9BEojLfk4X7f-omO2S7vKQj$o{-!lGVzf$KgX1-?rPG;wp&3mHT?_PE zJiV6XWO*iE$~T{l8hHzJBrSY1skcJaQgOB-mku3jq9NEoz5&(H_LfTBx(m@|vqns?c;E4BW-0nkNf=3lz5S zTduaa`#wQ>-Wx_MnNnqTMjKAx!7dp<(sY*C3v~0tVRp zpTeagn2c|7Iv63GD#@9OEbT3g&q(-3AiOmY+ZqalV*X(KmI(YGxWVCIQk`T}p^iVw z<1nJuMu+9y^6`Tc5AU$GG27mq!Q*X`mOB44s#?^`0XZurB{?F5LZU20LW!V|iApg+ z%m(6#crqeKz&k9<1slbgma-lBp8nfkysLl z%RxBv->LPU&7LMD_63SlV`k7RS1kQ9-Gcs87s zqEZ;g4}nZ^Nk}9!5g{H4#}g6pn$c@oXrb$VG!< zT*%0wU{DgHf+&X|@t~9ulEF*>l8Zz#@mLgO$q8aCl!(PeQHaGe2_cdcV?rh=1%yym z&V^%1DUr>^0gqfH5sk!!Kvs@{;8F;r14P7NNXmtyk}M~a0tg*R$kBixCX#@I7?p)Y zEEW^uv7j81K&?Pf7Nle-7!sqBkc>w&kQ}hf#G_#$l#3=}*<3akh{pvfC&r`6U{Xj( z8Gs-g5rwQ2i3-73R0?IqTr3C3%F$pn7Ljv8B$~k4k_!rncqj+j#dFbUMoz{6V_8ZB zBaviW2nV83$Qv;zBy(~=fW$;G84U-*!GMs9N5w=u8xSN3vMrK}1%zY_GFX&yQXrN9 z%|oG;tb^IqGYT^>(;3Yw3&Z@?4i0^uaiSc9{u%uQ{TBLT^dP*@KZ*cFfFeK+zP!zxQcI3nj{SXLp*Y4mSQmzyxIa`3YDURE-Nn1VE%B0v$K2v7tl0u%v?07ZZzKoOt_Py{Ff z6oJMFTxS>9+9e^*_4X7V>Cd;?y$y#iusp=kZQsh)tw6E&+PAUutQWC$*f+T?ivYNG zFEifuXAC-p{xAA-^gA&AzXSF0SNL!7f5E?(KgPe6AK-7|UEEK(FLUpQ{Q-Ay8#$-% zKYjn;`$N}{TwinjneS2Gq;Iz`=f|K9$Y_V>4!+xNG}+IwB^bCq4Au5GT> z&I`_`ou6}l&{=ZscW!l}wv%m7fvEJ4B0v$K2>gN}ux@U>li6f*JMkjH@`1d3@0Me; zGTYVu%)_qPsBL!r-1SaoGlY+lrPd87{B!G^jDRWB4RZ}h*3GR|6WIrQMH+;!pX*f< z*`qE8trz3^xiwCv4-y%|yJ{M+*f6)+$pnEQtuO9xKy<_0DkrlQhz2s{BiUl6B-N+1 zcCN?C+z2$=Glv_nSU0y)Rb{AnIA74CGe6hyT07URM&DJOmg|Gp&t0c#+AmG#3qzUX zu(TTkZZPPc>vA$ZwsvO*QyBj1=2oZ)_h%taJ?AxZolfQkklR?m%eF)AOMwDS~D(ug~TfiWC``G=Tc-zWdPG+6E-MOPwgcZsK zN%!Bd)5%03vew(s3xFlA?|wM_$I$1ARdWcKfhhWFcIHK0%2ji`8dQPxgfgsyW?s;P z*3WS&ZiBFIY^+$Eg3X3v#yiJ7c6|~abFy}USrHa$jvv3a0aVyRGxpq~eJLD-5O2Z(WwSg&^=XIH{ zpL40DdhCd-5m^a(=bTPvBZxB!r=w&uC2MH+T$@@{@*r&4%+{f@-6c;=6(L`zBx}Sq zb9S|??2WVdR)tpVu1+tGrESH(*KweS~R?V?$&{XkoaZCBwVRI0p24yp4*xYB1 zwN80RExB-_LM30Wroz53$C`;%Lv(^JfK#1Z3#J) z!Nag=z{+}!a=)smvCiD!uu6HGrj52!&m44I4XPH>sFto1My6nfT$G6lC1aJ9hPtO^)rI z9N0TKoW65x%XGDQTMJ*MKA^Df9n}-^!xst1uWp(x6eVl3*$bbfO=b#no4Ou6195}{mU{89of8XHb==dId#*#_u9{2#QuM(L8*21R; ztFwQ6FtvMfbgX~GtSt0RlQ}n|}2P?U6Wbf_i)L4V$*1%`yMxcN%$K9F3Rshz+ zR|o5;g$Ywd@otNbYv5aOBjgN*ZgRRP%|b!e@m&QUgBu{SS_O|(rl<6fmGCWC2O;{# zYu$eZd;z+Fn*@!F?)L_0^OHcky+5@(Jv=}#OW)bQXWvlT1kD?u)yGsAQ5Bx*xd)>m!8HZp%XG)L_B0jT8556A02ZA0f;kL3!c2DZzo$yh>H4f6#z3}}1xW~v;=u z@h|e<_dV#@$$y#qIsXLzG5*8+32uug=zY;w@T}z?@*U(ha4Wq#z2D=f`Gfp`$IW^9 zAosNQOZ=K&ux>w9mm)wBpa@U|C;}7#iomr(V1<2?&1zX(f1Q1^t=5=$eK#y4)y+q` zZHrxpV_QvzYjNyaD`9UJEO@Ok46f<12W<^(fvZ>Ax7zB>f2%s}H`*)~zaE^p#mL95 z#6)Jh9@~w@sWIiT*LmzcHe$VFyD$@r!H!*l>^Im98y(x}v-jFGvmD#O+1J^0n*)pR zn{EqZd7KtDOPS4IobGA1c=@o7n9^$G@~*MRiFdtS%cIAznzG!OdyVyqZO3R^4OXnH z!@kjGvQe>4i~$~-m)SNCe>^$&*5Zr zL&{0~qT5b>+HUW%fw=_CEB0;{kA{6tdzTx=XI=KqY|SXoj^~hxpJ`}k!yK^b<`lAT zWKCw4k=6D%+t5}#xXK>Yr=9hhOvd^EU8qZf(33V&VDlBM2JIPAUzFrG~L31}w*=iAi`n#G{ZAJUA5cRf?6&>~) zS+l{T6U$I%<>B1tziH#ohpBS5n;v|+^z!-B)ZA7{q7#~5@8okcIfDu5rO zAE0N@chEP{*U(ewN%RHuIrNw4lj!4M4frtnUG&@NJ?LTd5PBP$MKfrUukc0wD3W2- zz+SWy-G<_5E82wCqaK7{oc}U^mVciA5&v)exB0K}U*tc}{}ul@|55%U{0I5p;NQhR z#Ao@p@NeWd@N4)Lyoa}O7r2+WXZaESc78j53m@YCgL|6$XYMKP@3_x$pW^-uM5TWe z0g3=cfFeKJd8 znV+*OHMd)HuhZNv&0Rs%b6?Wj7d7_<&3#^TpVQn^ntM`nf7)heY|OK5b{1?C z=uxI^zr)V3`|x8ee)QtU8vIy|AFI$~OdIU=XV{ha(TyM1L9uS@!oODFM<;%C;0MAF z9zQtz@ZpCSKRo#1#*cRV0N@$ci63qF;lK|&e%S1G#!cq`-GdB2#oxj2+Xf@?f8svPeGu0C-|YKq&wu0Y_kF_S@jmPOU2Zk!^1Rdi0(TF3$#=s2FZ>+; zW$*v?{=O&b4STyi7rpQE{J`@S^dG*G=TChZ_YKDPJ54Iv#o9py^Fnml|umkx@|b@I>N>} zlitOyC2VRZ)4SN-m5x4J?Rt7?bvE-Fst6huDZ@~qs=<8-o^G1 zaV&G|cnCpA&C~1P*-d1unPCV2>o`Y`O`T+iw=TlaGS3daD^@seu$iXX85n*bM=wNE zuN8pzjt<8pAHeRdu^7?Ks%33?b&bvoADOmp<7m@6bF^lAE2%wCZ4tDx@3 zV9r>I$SLMD!A{$I!Tg*M>pL!(pJ}h^J`3h0@~ZEyU|u9z8?*V(GB0RFvO1yvEb}~x zqwk+!p7T1opoHRG6EOLXORGM`|15Koyz8_4&oV!CJGvNkqTlW4X4IMfUPqE)=b1+) zVe?ERuXEhW)J+!aE8E?EN2)&5Je9oBF{lyDKbNc~-*__F=jdgsv&k;d3olndjvK(U zx?bIJonte+TUV*uyB&h&XDb7c7cT4@S>uSi=UKY2+7Wd(Uc10K*13(v3q6h? z(`fZVm!prVUA{nQtIHCqdqdW&aBO0XG0|?B_vxI?ntk;9^8U~Vn z%_0V`V>P3%Vj!|KSjN!lxDjYf8#g+MDD?{&2%%*q1IZfGQU(BuG1fA0@TGO2H!|oe z=mRJNKj5{e=4#_xIf6+=sY#ab<3j+s(z{egH&^3q^n;KoOt_ zPy{Ff6ak6=MSvne5qQ-j(5b+Q^)@%_WIJu`&pb5x%~aRXP6bY@Cw?8^cVgS)fAic| zI~6#sp7o-{cih@$xa21j3<5Aw*ZIL~siT@wrr`fxAD5 z&*iEQ-1$L#E>?Zuf)C*Cu*(W;S5)a~Y zhA{fr51;CQYj;?c%1|eT_47+|h&PscOT2X=ks13yGi6foD`st1$*vg!$QO za&TP<@i|#d4locdRWv;O>W+TSYlR@8y^f#u-M{5h}?w4((70t)ayMmO=_ zf7RD>Dj-FGB0v$K2v7tl0u%v?07ZZzKoOt_yv`872l26;%&!x-gZVY$BIXftK;O&E zdx?96c@OdDnRk=-%gnoodx?1`aWAR|6#}1!30((sg1Cs8BjGPI3VG+5Uv=7TEOX@{ z;#_(=aV|edoQn?-=iL3ox$rjCIZm82_Yvppz4)ZS&MxwDdIo-zUnh&iIbXn`t9ktF z(nu9cM6AjUqr1pa@U|C;}7#iU37` zB0v$K2v7tl0)PM=|I=bX5ugZA1SkR&0g3=cfFeK9k99QM2 z@ltuDwyRQLwO__OGBbI?fVh=RC10-O#j++vou|rVcRyh=o&-U7%tR~}%9Tu^qQYmq zRgTEhvc{|4S7o;C&4k%)TS1~LbrQ|wOZkdf8r?&UyyrF&d4E4dzEm4|I$tj5i-moq z;$g^HvrhFPD!ceE6L#A+1G~$$>}K*)Qzl8YS2g0Tw~~nckh#po+K5_ernrWW8omEb zBzigu(a+UJm+zU)&rHh&GYn=wl|^zJVR5SfEH2ctn39jlX4&<3E%l_4`q|p3;*m@# zBSJAViEs8(S={Ud7A(`(*TeQ6%U9$rklVTZVTfaWQ>p!JgnHe&9+r~}$F@j7r@JZz zRPJ`*myX^-L`wo+=1i?<*$hrV_f_B2=$jKH+UAWA?Ib3^|E4qff<~|XREd*uLQIf5 zuXEE~bA`gSL4Q}H#$zNZDKDq>D7tH^%{Zo|D&zhC9+#a#G5$aKvhPoP9p2rZN8OLK zf7fMq?zjJ@?YwQocKb4$I2!#I3IWF_d+rceWj`sRqsOPS#i;=~moMZi&zb2$@kR~q0~sae=O}E93DvD=|5N-+>plv=kdee-r;)s3I9z8t;tUGDczi_ zCk0~eY%Jz*W?F769KVQgM$AP-!h{q4)ZU>Xtn2XJRR3tY?;W@LTs?xozE`MZvQu)c z>b38jCd^p>_MvnG%{k9aDlT;(4oVY%?^t?gdc?nPWN=Ua$X)*3>AU>><70aVhk@;$ z^zax+1^>o}hHlolz&GqzUXn}Z*gB0$f-_+xy(2x69!{l4{Rj0J=|Ux6IX-by)dN`c z8BrkL#`g_iAOMC`|3KOjG>{%j8$r4-DuBZW`bSc``bTaGMWcOHfopKpqwJWSnmWFJ zHZzsa!>ScSEgtfmas(HSb60mKz$^mw@< zPgfzV^}{x+Yprp$ z!H~XQ<7$J+@7$A<^^k5|7uI!!f_sd(vOnqu&c(S1~rYZ{Vj=mEKeM+0>&{~Xiq>gnraPi!OQ zP-mvHx4yZpWzZUEDuH@{Ig^?wd1}e13aqMQG_!$4TUkBbs;bRI##wfY%hi(>^en3_ z$dmgrCAmM=!wjm2S!^*+A-Xp!hcKX5-hKUA1q^R zCj8q6>$`zNnQ~=swk(&9$%^NX`3Qe!K6GYyrzXm|Alds$^Y zsV1XxrIIfkCUsitZ>v5IYk8`tBgKex_tgmVRocFNHfPV~&Fo#Iu~~Q=)O<}vPV;%iO4@3EJvI3EPa2jWdJDR$q>wln;S>>iKSI@ydR=KODTQQKSWab?P83h89 zt+ckK*1&mrH2h9ucDSWAc<3-s^gVpv3etmp&*qwsG>&9Mz;E5wM$#H+YAdY)OKUO> z9#v6|Z>;vkG78rczO&05dh5Mqvv&G8$MV_N2~{-~GNmjulrp{pi+ALg(67%nU zqZ)kOe3hk2(U?`k>QapZxmEqG3IHR9P{(3I56CleL4p~rMTG8JTquCAI3JSUX81L^Y!eiO_sHAwzeTM z)LDuNu!^=;J`LIaYX>40xp1d&!e4D&=4m^wVPjLZJX!5hn$77Ayo*kL4B|N*Q_E62 zX)*6ejZS{h$&V#jI+oc3)8{pQ@g_g;{{Izd&IY&seGmNvokw3o-$H+jUP50&pG6;s zn*jd^eGvUVdLMcZntMgf0W>j+07ZZzKoOt_Py{Ff6ak6=MSvne5ugaXt`NX?^0A$1 z;&coU2c^hGeJ^h(Z+t&_yYgn@T)K@omw%Z!7jGrbxi=B#!ZzZZxrI1qljP<)Yb}AKp=Kr{}om4en>$yV_5;|3y3RdfX*B|IR5oSGB#pZIk2sj_vjz*?-^mg6$o) z2>W~NPL^d3VrKBCY)~dVjLkj1P3cK8EFX<#<8d((6q501P>6)XqL7rLIUy=1g3(+s z8j8k3gJswwo0*-ej8-zG%IplR#5*dBmHY9+whegu#fDqJElRQ|ZuR9msi-Qr@WCp<%in`)F6V1gLw zi%UQnju{~bgxsl&Ym9kZ$&RSWcjA@7>kn`d-Mii258c8goGD;K|FoGAZ20_cw zG-Jw$#zt5o8y!6hTV;h@eUMmdE2``SLnR=J9$H4O3)nHk7y3!$K$iQ;RtaL2v*aMck zO<110R#=)7UK~p^^>*cU0ze-wmuId9OVhDT`;?aZ}8 zPEB%g%v8FRvXdxEIya}U1}*a;Q6tI@jSF;cmcm8H%ghuyH)#zp+_^b@tpL-~TpTft z@HPdG$AkXhMqI#7HVc{g9Ix9II3AC1*m(6EFjQt{ibsKi@^B~mA&}_gH9$#AZDD|P zkrX&^4}>9K)AP-OQ+Hh1m;y)b5jOBOT@o9;M3F6#)t<;o+nz%+2np)ol9<FI#`enRew~<)pG!g1=1tl zW+!;AgT%OI(y|;2n6hb+*Iiv?3lqi05-!{BUB_^(#a~Zne&po>jL>^wfR3JI;`}HB zbN{E&^RNTp^XN0M>i=Wt573vT<+-AF_S(Z9nAfqz2VP#A4S z8&NOnLSAI&FY-U*f6D)W|9k#({HOVk@qfU7i2pAC4gM?qZ}X4vC;0pMGJiKO@&_R~ z`bQC<2v7tl0u%v?07ZZzKoOt_Py{FfuYCkucAJguWS-O9Q<{5{xE;({%{`;Jr-_T0 z%bI&hb1!0-d71gS=Kf4`Un1@m)~>lW&1JF6^31Z|pOrxH&0+arJ&Ty>_N zSXyB29Y=Xk3vQSWw&#%>K-Aj_7EEeG4Y58UNaWJj2wantTc#wo&Nr*0+2X%k6&Fpn zWf~guU(M=i#AsE98XOmtp=CO&bEgZYWh%S+Osi_6TW-!ak#@`U)Yd69U4nJ`R^_YC zZ$YG6tu3rXQZMgWFjZ6j*01JhO-|SHT~MBup+J`YESQu@b<2XH<(BNlQ*MQl#=r#!Ai9>e?tR(7Tr9HCLO=Ld9Wp0z%?k05B^TjfazKkku;kRJ=t_3C975O8+PV6oJSJA@A z+myEvg_pD1_PEBOHLGp!BivpUt8I79!DYr!N68+HB`@|TCE(B;+;mJ>!5)kyv(gKf z(Pz@O7b(}zIkWOV&yx{WkrSrmQ zHcmkCD^nVr-EoHPZ0+JuoUWd5)#{^nr{~)^StsZYio;->jb=AnIuXlai!*)1<$bh>)Y5#ar_nK zts1lBvY25h=ShO&Mi~c}g!BKnk8nxu0eGc<6ak6=MSvne5ugZA1SkR&0g3=cfFfW< zV3pm$Z0#DvHyy&#K)6W0oWcvJLJ6>cGJQfgRgyCmS=w6~pONs7KzM5)wlx$8#r(ne zEfM%XaD&6aq&mq+PhCe{9xux!?RNO`Zu$7ZiHCRC+L&$c&J1PB6_S>EmEx$FDHP;V zIUr}Hq$Ed#P)L-8NGK5$GEpfeh}l3q5l=?s2zZBOSq#KNq7aP4!a^jT2nd<5C<$^b z8k7UcXgnr|g>Wtuhy>#iAreahksOT(iEu0^WV6Yn7|JB0A&3^qhC^a35f>mKQHY2! zNyvmUK_M(9;*o4F6Otm55YL9QQdA1#_#u!fE(wWbCL+WmpWH)s36KANIWQIgk&%ifaD^POgt6^S#p9H z3ngN4Q50hFOhSkx#h8#uN&z91m2=@(Qc7fValj)NNkk)YA&`}0Ah;9)=>QQi7?N_~ zs3gnDqyR!k5^^*kh>0ZNAVy^&5sSrycq}M~Bv305lm#gn3Wmg}gb%TUQ{s}qE)$Q2 zg-|YKA!Pu9Y(x~YQY0z_V^JxT6?3s1AS*|M(O5*z36W?5 zXG<<9B;uhQXcx~#qZv6F1B}6d5R62UaUmRtMj>xRI6W^X2Lwn=6qC_#ARG(`xp-7e z#IpfGk|5h6xmZ9*#vp@5DJKPD3D7(gTFE+?O+BOH5qUau07_22SO{(jZ;5hjhOw~; zhVOs}{c9S5O-={Xu#yMk)k+?MN)Dj<9%oXYZPQLNOce{c{NdRWtUD|gM&;76yeO-u z8)^jPEDH-2Svs=79u4)dhXq%!Y_J{(v9#q-O{CMrDw&0LfmlxIFs+uJQ8%QtYO_hx zn_4W}UvxX_(!gsv&1FJ}O?~P{nkIGxnAXeb^Xw+nm$8+miL_g$=i=+bO=`XdSEdtt zzB=8ra2+?YUY{IlO=dQccFQu8OpP_Gre)4;Y1PueZ1I#^rlc`_-mIoZjODdLhPnpF z1!ZW3&WkUKel0G-R;SsTSS@R6eO{w$b*|71tn-jiEVz9f~v2D zz6I)9_`PD<>Z@E9Owg*Z9;Jmk>nsCQ)zkhPp7VbYA~yO@ z9Yxdg|F7Z}0o*ggErK>cAx1%Z{{NzPFw|~_K3dj+tPfE!rRV=I^&){9WUHs{zN*jv zcS&H^ghgoN#Ns9GL?Fe+B{46mY+8E$Kd}Ap+DbNh{(t=qE5-pHM!h!ssWtjlfBwI> zlO4i^rv>Zy;j$i9Wpz!~@xzDvF|9nlO4sqz^ZySwbpr}L|KEI`ls;UWZ(%;}d1=-} zhOv#~8n*NuNl=Ntt8!?;jwE3AC|Lvis@Rb<(3_F@14 literal 0 HcmV?d00001 diff --git a/Build_God_Admin_Frontend/Frontend/ADMIN_SYSTEM_README.md b/Build_God_Admin_Frontend/Frontend/ADMIN_SYSTEM_README.md new file mode 100644 index 0000000..6bf4147 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/ADMIN_SYSTEM_README.md @@ -0,0 +1,173 @@ +# 后台管理系统 + +一个基于 Vue 3 + TypeScript + Vite 的现代化后台管理系统框架。 + +## 🎨 特性 + +- ✨ **暗黑主题设计** - 黑白双色优雅设计,舒适的深色主题 +- 🔐 **认证系统** - 完整的登录/登出功能 +- 📊 **仪表板** - 数据统计和概览 +- 👥 **用户管理** - CRUD 操作示例 +- 📦 **产品管理** - 完整的产品管理模块 +- 📋 **订单管理** - 订单管理系统 +- ⚙️ **系统设置** - 系统配置管理 +- 🎯 **响应式布局** - 完美适配各种屏幕尺寸 + +## 🚀 快速开始 + +### 安装依赖 + +```bash +npm install +``` + +### 开发模式 + +```bash +npm run dev +``` + +访问 `http://localhost:5173` 查看应用 + +### 生产构建 + +```bash +npm run build +``` + +### 类型检查 + +```bash +npm run type-check +``` + +### 预览构建结果 + +```bash +npm run preview +``` + +## 📁 项目结构 + +``` +src/ +├── assets/ # 静态资源和样式 +├── components/ # 可复用组件 +│ ├── Header.vue # 顶部导航栏 +│ └── Sidebar.vue # 侧边栏菜单 +├── router/ # 路由配置 +├── stores/ # Pinia 状态管理 +│ ├── auth.ts # 认证状态 +│ └── counter.ts # 计数器示例 +├── views/ # 页面组件 +│ ├── LoginView.vue # 登录页面 +│ ├── AdminLayout.vue # 后台布局 +│ └── admin/ # 后台管理页面 +│ ├── DashboardView.vue # 仪表板 +│ ├── UsersView.vue # 用户管理 +│ ├── ProductsView.vue # 产品管理 +│ ├── OrdersView.vue # 订单管理 +│ └── SettingsView.vue # 系统设置 +└── main.ts # 应用入口 +``` + +## 🔑 认证信息 + +### 测试账号 + +- **用户名**: `admin` +- **密码**: `123456` + +> 注:当前使用本地模拟认证,实际项目需要连接真实 API 服务器 + +## 🎯 功能模块 + +### 仪表板 (Dashboard) +- 数据统计卡片 +- 最近订单表格 +- 统计数据可视化 + +### 用户管理 +- 用户列表展示 +- 搜索功能 +- 新增用户 +- 编辑用户信息 +- 删除用户 +- 状态管理(启用/禁用) + +### 产品管理 +- 产品列表管理 +- 产品搜索和过滤 +- 新增产品 +- 编辑产品 +- 删除产品 +- 库存管理 +- 产品分类 + +### 订单管理 +- 订单列表展示 +- 订单搜索和过滤 +- 订单状态管理 +- 新增/编辑/删除订单 +- 支付方式记录 + +### 系统设置 +- 基本设置 +- 安全设置 +- 备份配置 +- 文件上传设置 + +## 🎨 主题配置 + +系统使用黑白双色暗黑主题: + +- **主色调**: `#667eea` (紫蓝色) +- **背景色**: `#0a0e27` (深蓝黑) +- **卡片色**: `#1f2937` (深灰) +- **文字色**: `#e5e7eb` (浅灰) + +## 📦 技术栈 + +- **Vue 3** - 渐进式 JavaScript 框架 +- **TypeScript** - JavaScript 超集 +- **Vite** - 下一代前端构建工具 +- **Vue Router** - 官方路由库 +- **Pinia** - Vue 3 状态管理 +- **Element Plus** - UI 组件库 +- **Axios** - HTTP 客户端库 + +## 🔒 路由保护 + +系统包含路由导航守卫,确保: +- 未登录用户无法访问后台页面 +- 已登录用户不能重复进入登录页 +- 自动重定向到登录页 + +## 💾 数据持久化 + +认证信息保存在 `localStorage` 中: +- `auth_token` - 用户令牌 +- `user` - 用户信息 + +## 🛠 开发建议 + +1. **状态管理**: 使用 Pinia store 管理全局状态 +2. **API 集成**: 将模拟数据替换为真实 API 调用 +3. **表单验证**: 为表单添加完善的验证规则 +4. **错误处理**: 添加全局错误处理和日志记录 +5. **权限管理**: 根据用户角色实现权限控制 + +## 📝 注意事项 + +- 当前使用本地状态管理,实际项目需要后端 API 支持 +- 表单数据为演示用途,需要根据实际需求修改 +- 样式可根据公司品牌进行定制 +- 建议在生产环境中启用权限检查和数据验证 + +## 🤝 贡献 + +欢迎提交 Issue 和 Pull Request + +## 📄 许可证 + +MIT diff --git a/Build_God_Admin_Frontend/Frontend/API_IMPLEMENTATION_COMPLETE.md b/Build_God_Admin_Frontend/Frontend/API_IMPLEMENTATION_COMPLETE.md new file mode 100644 index 0000000..7f52ff7 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/API_IMPLEMENTATION_COMPLETE.md @@ -0,0 +1,434 @@ +# ✨ API 集成完成!完整总结 + +## 🎉 已为你完成的工作 + +### 1. ✅ Axios 配置文件 (`src/api/index.ts`) + +完整的 HTTP 客户端配置,包括: + +```typescript +✓ axios 实例创建 +✓ 请求拦截器 - 自动添加 Authorization header +✓ 响应拦截器 - 自动解析响应、处理错误 +✓ Token 过期处理 - 自动清除并跳转登录 +✓ 环境变量支持 - 开发/生产不同 API 地址 +``` + +### 2. ✅ API 服务层 (`src/api/auth.ts`) + +完整的登录 API 接口定义,包括: + +```typescript +✓ 类型定义 (TypeScript) +✓ loginApi() - 登录接口 +✓ logoutApi() - 登出接口 +✓ getUserInfoApi() - 获取用户信息 +✓ refreshTokenApi() - 刷新 token +✓ 详细的 JSDoc 注释 +``` + +### 3. ✅ 认证 Store 更新 (`src/stores/auth.ts`) + +集成后端 API 的状态管理: + +```typescript +✓ async login() - 调用真实 API +✓ async logout() - 调用登出 API +✓ setUser() - 更新用户信息 +✓ localStorage 持久化 +✓ 错误处理 +``` + +### 4. ✅ 登录页面更新 (`src/views/LoginView.vue`) + +支持异步 API 调用的登录页面: + +```typescript +✓ async handleLogin() +✓ 加载状态管理 +✓ 错误处理和提示 +✓ 回车键提交 +✓ 完整的错误消息 +``` + +### 5. ✅ 环境配置文件 + +``` +✓ .env.development - 开发环境 API 地址 +✓ .env.production - 生产环境 API 地址 +✓ .env.local - 本地覆盖配置 +``` + +### 6. ✅ 完整的文档 + +``` +✓ API_INTEGRATION_GUIDE.md - 详细集成指南 +✓ BACKEND_API_EXAMPLE.md - 后端实现参考 (Node.js/Python) +✓ API_INTEGRATION_COMPLETE.md - 完整工作流程说明 +✓ API_QUICK_REFERENCE.md - 快速参考卡片 +``` + +## 📂 项目结构 + +``` +src/ +├── api/ +│ ├── index.ts ← axios 实例 + 拦截器 +│ └── auth.ts ← 登录 API 接口定义 ← 可在这里添加更多 API +├── stores/ +│ ├── auth.ts ← 认证状态管理(已与 API 集成) +│ └── counter.ts +├── views/ +│ ├── LoginView.vue ← 登录页面(已支持异步 API) +│ ├── AdminLayout.vue +│ └── admin/ +│ ├── DashboardView.vue +│ ├── UsersView.vue +│ ├── ProductsView.vue +│ ├── OrdersView.vue +│ └── SettingsView.vue +├── components/ +│ ├── Header.vue +│ ├── Sidebar.vue +│ └── ... +├── router/ +│ └── index.ts +├── main.ts +└── App.vue + +root/ +├── .env.development ← 开发环境配置 +├── .env.production ← 生产环境配置 +├── .env.local ← 本地覆盖 +├── API_INTEGRATION_GUIDE.md ← 详细教程 +├── BACKEND_API_EXAMPLE.md ← 后端代码示例 +├── API_INTEGRATION_COMPLETE.md ← 完整说明 +└── API_QUICK_REFERENCE.md ← 快速参考 +``` + +## 🔄 完整工作流 + +### 前端流程 + +``` +1️⃣ 用户在登录页输入用户名和密码 + └─> username.value = 'admin' + └─> password.value = '123456' + +2️⃣ 点击"登录"按钮 + └─> handleLogin() 被调用 + +3️⃣ 登录方法开始 + └─> loading.value = true + └─> authStore.login(username, password) 被调用 + +4️⃣ Store 中的登录方法 + └─> loginApi({ username, password }) 被调用 + └─> 返回 Promise + +5️⃣ API 函数 + └─> http.post('/auth/login', { username, password }) + └─> 返回 Promise + +6️⃣ Axios 请求拦截器 + └─> 检查 localStorage 中是否有 auth_token + └─> 如果有,添加 Authorization: Bearer + └─> 发送 HTTP 请求 + +7️⃣ HTTP 请求发送到后端 + └─> POST http://localhost:3000/api/auth/login + └─> Content-Type: application/json + └─> Body: { "username": "admin", "password": "123456" } + +8️⃣ 后端处理请求 + └─> 验证用户名和密码 + └─> 生成 JWT token + └─> 返回 JSON 响应 + +9️⃣ Axios 响应拦截器 + └─> 检查响应状态码 + └─> 如果 401,清除 token 并跳转登录 + └─> 提取 response.data 并返回 + +🔟 Store 接收响应 + └─> 检查 response.code === 200 + └─> 保存 token 和 user 到 localStorage + └─> 返回 true + +1️⃣1️⃣ 组件接收结果 + └─> 显示"登录成功"提示 + └─> 路由跳转到 /admin/dashboard + +✨ 完成!用户已登录 +``` + +## 💻 后端需要做什么 + +### 最小实现示例 (Node.js Express) + +```javascript +app.post('/api/auth/login', (req, res) => { + const { username, password } = req.body + + // 验证用户 + if (username === 'admin' && password === '123456') { + // 生成 token (使用 JWT) + const token = jwt.sign({ id: 1, username }, 'secret') + + // 返回正确格式的响应 + res.json({ + code: 200, + message: '登录成功', + data: { + token, + user: { + id: '1', + username: 'admin', + email: 'admin@example.com', + role: 'admin' + } + } + }) + } else { + res.status(401).json({ + code: 401, + message: '用户名或密码错误' + }) + } +}) +``` + +### 响应格式必须严格遵守 + +✅ **必须返回** +```json +{ + "code": 200, + "message": "登录成功", + "data": { + "token": "jwt_token_here", + "user": { + "id": "1", + "username": "admin", + "email": "admin@example.com", + "role": "admin" + } + } +} +``` + +❌ **不要这样返回** +```json +{ + "token": "...", // ❌ 缺少 code 和 message + "user": {...} +} +``` + +## 🚀 立即开始 + +### 第 1 步:准备后端服务 + +```bash +# 方案 A: 使用提供的 Node.js 示例 +# 参考 BACKEND_API_EXAMPLE.md 创建 server.js +node server.js + +# 方案 B: 使用你自己的后端 +# 确保实现了 POST /api/auth/login 接口 +# 返回上述格式的 JSON +``` + +### 第 2 步:配置前端 API 地址 + +编辑 `.env.development`(可选,因为已配置默认值): + +``` +VITE_API_URL=http://localhost:3000/api +``` + +### 第 3 步:启动前端开发服务器 + +```bash +npm run dev +``` + +### 第 4 步:测试登录 + +1. 访问 http://localhost:5173 +2. 输入用户名和密码 +3. 点击登录 +4. 应该看到"登录成功"提示并跳转到仪表板 + +### 第 5 步:验证请求 + +1. 打开浏览器开发者工具 (F12) +2. 点击 Network 标签 +3. 再次登录 +4. 看到 POST /api/auth/login 请求 +5. 点击查看请求和响应的详细信息 + +## 📝 代码使用示例 + +### 在登录页使用 + +```typescript +// LoginView.vue +import { useAuthStore } from '@/stores/auth' + +const authStore = useAuthStore() +const success = await authStore.login('admin', '123456') +``` + +### 在其他组件中获取用户信息 + +```typescript +import { useAuthStore } from '@/stores/auth' + +const authStore = useAuthStore() +console.log(authStore.user) // 用户信息 +console.log(authStore.token) // JWT token +console.log(authStore.isAuthenticated) // 是否已登录 +``` + +### 创建新的 API 接口 + +```typescript +// src/api/users.ts +import http from './index' + +export const getUsersApi = () => http.get('/users') +export const createUserApi = (data) => http.post('/users', data) +export const updateUserApi = (id, data) => http.put(`/users/${id}`, data) +export const deleteUserApi = (id) => http.delete(`/users/${id}`) + +// 在组件中使用 +import { getUsersApi } from '@/api/users' +const response = await getUsersApi() +``` + +## ✅ 完成清单 + +### 前端完成 +- [x] Axios 配置 +- [x] 请求/响应拦截器 +- [x] API 服务层 +- [x] 认证 Store +- [x] 登录页面 +- [x] 类型定义 +- [x] 环境配置 +- [x] 完整文档 + +### 等待后端完成 +- [ ] 实现 POST /api/auth/login 接口 +- [ ] 返回正确的 JSON 格式 +- [ ] 配置 CORS 允许前端请求 +- [ ] 其他业务接口 (可选) + +## 🎓 后续学习 + +### 添加其他 API + +参考登录 API,在 `src/api/` 中创建新文件: + +``` +src/api/ +├── index.ts # axios 实例 +├── auth.ts # ✓ 已完成 +├── users.ts # 待添加 +├── products.ts # 待添加 +├── orders.ts # 待添加 +└── ... +``` + +### 完整的 CRUD 示例 (用户管理) + +```typescript +// src/api/users.ts +import http from './index' + +export interface User { + id: number + username: string + email: string +} + +// 查 - Read +export const getUsersApi = (page = 1, limit = 10) => + http.get('/users', { params: { page, limit } }) + +// 增 - Create +export const createUserApi = (data: User) => + http.post('/users', data) + +// 改 - Update +export const updateUserApi = (id: number, data: Partial) => + http.put(`/users/${id}`, data) + +// 删 - Delete +export const deleteUserApi = (id: number) => + http.delete(`/users/${id}`) +``` + +## 🔍 调试技巧 + +### 查看请求和响应 + +```typescript +// 在 api/index.ts 中添加日志 +instance.interceptors.request.use((config) => { + console.log('📤 发送请求:', config.method?.toUpperCase(), config.url) + console.log('数据:', config.data) + return config +}) + +instance.interceptors.response.use((response) => { + console.log('📥 收到响应:', response) + return response +}) +``` + +### 检查 localStorage + +```typescript +// 在浏览器控制台执行 +localStorage.getItem('auth_token') // 查看 token +localStorage.getItem('user') // 查看用户信息 +``` + +### 测试 API 接口 + +```bash +# 使用 curl +curl -X POST http://localhost:3000/api/auth/login \ + -H "Content-Type: application/json" \ + -d '{"username":"admin","password":"123456"}' + +# 或使用 Postman/Insomnia GUI 工具 +``` + +## 🎉 总结 + +你现在拥有: + +✅ **完整的前端 API 架构** - 随时可以调用后端接口 +✅ **登录示例** - 展示了完整的请求/响应流程 +✅ **可扩展的 API 服务层** - 轻松添加更多接口 +✅ **完整的文档** - 学习和参考资料 +✅ **后端代码示例** - Node.js 和 Python 实现 + +现在你需要做的只是: +1. 实现后端登录接口 +2. 启动后端和前端 +3. 测试登录功能 + +其他所有的 CRUD 操作都可以按照登录示例的方式进行! + +祝你开发愉快!🚀 + +--- + +📚 **相关文档** +- [详细 API 集成指南](./API_INTEGRATION_GUIDE.md) +- [后端实现参考](./BACKEND_API_EXAMPLE.md) +- [快速参考卡片](./API_QUICK_REFERENCE.md) diff --git a/Build_God_Admin_Frontend/Frontend/API_INTEGRATION_COMPLETE.md b/Build_God_Admin_Frontend/Frontend/API_INTEGRATION_COMPLETE.md new file mode 100644 index 0000000..c4fe061 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/API_INTEGRATION_COMPLETE.md @@ -0,0 +1,507 @@ +# API 集成完整指南 + +你好!现在项目已经完全配置好了 axios 和 API 层。以下是完整的说明。 + +## 🎯 快速概览 + +### 已为你完成的工作 + +✅ **Axios 配置** - 完整的 HTTP 客户端配置 +✅ **API 服务层** - 登录 API 接口定义 +✅ **认证 Store** - 与后端 API 集成的状态管理 +✅ **登录页面** - 支持异步 API 调用 +✅ **环境配置** - 开发和生产环境变量 +✅ **详细文档** - API 集成指南和后端示例 + +## 📁 项目结构 + +``` +src/ +├── api/ +│ ├── index.ts ← axios 实例(请求/响应拦截器) +│ └── auth.ts ← 登录 API 接口(可扩展) +├── stores/ +│ └── auth.ts ← 认证状态(调用 API) +├── views/ +│ └── LoginView.vue ← 登录页面(异步登录) +└── ... + +root/ +├── .env.development ← 开发环境配置 +├── .env.production ← 生产环境配置 +├── API_INTEGRATION_GUIDE.md ← API 集成详细指南 +├── BACKEND_API_EXAMPLE.md ← 后端实现参考 +└── ... +``` + +## 🔄 工作流程 + +### 1️⃣ 用户登录流程 + +``` +用户输入用户名和密码 + ↓ +点击"登录"按钮 + ↓ +LoginView.vue 调用 authStore.login(username, password) + ↓ +authStore 调用 loginApi({ username, password }) + ↓ +axios 发送 POST /api/auth/login 请求 + ↓ +axios 拦截器处理: + - 添加 Authorization 头 + - 处理错误响应 + ↓ +后端返回 JSON 响应 + ↓ +前端解析 response.data(自动由拦截器处理) + ↓ +保存 token 和 user 到 localStorage + ↓ +路由跳转到仪表板 +``` + +### 2️⃣ 后续请求流程 + +``` +任何组件需要调用 API + ↓ +导入 API 函数(如 getUsersApi) + ↓ +await getUsersApi() + ↓ +axios 请求拦截器自动添加 Authorization: Bearer + ↓ +后端验证 token + ↓ +后端返回数据 + ↓ +axios 响应拦截器处理(提取 data) + ↓ +组件接收数据 +``` + +## 💻 代码实现细节 + +### axios 实例 (`src/api/index.ts`) + +```typescript +import axios from 'axios' + +const instance = axios.create({ + baseURL: import.meta.env.VITE_API_URL || 'http://localhost:3000/api', + timeout: 10000 +}) + +// 请求拦截器 - 自动添加 token +instance.interceptors.request.use((config) => { + const token = localStorage.getItem('auth_token') + if (token) { + config.headers.Authorization = `Bearer ${token}` + } + return config +}) + +// 响应拦截器 - 处理错误和 token 过期 +instance.interceptors.response.use( + (response) => response.data, // ← 返回 response.data + (error) => { + if (error.response?.status === 401) { + // token 过期,清除并跳转 + localStorage.removeItem('auth_token') + window.location.href = '/login' + } + return Promise.reject(error) + } +) + +export default instance +``` + +**关键点:** +1. 所有请求自动添加 `Authorization: Bearer ` +2. 所有响应自动提取 `response.data` +3. 401 错误自动清除 token 并跳转 + +### API 接口定义 (`src/api/auth.ts`) + +```typescript +import http from './index' + +export interface LoginRequest { + username: string + password: string +} + +export interface LoginResponse { + code: number + message: string + data: { + token: string + user: User + } +} + +export const loginApi = (credentials: LoginRequest): Promise => { + return http.post('/auth/login', credentials) +} +``` + +**使用方式:** +```typescript +const response = await loginApi({ username: 'admin', password: '123456' }) +// response.code === 200 +// response.data.token +// response.data.user +``` + +### 认证 Store (`src/stores/auth.ts`) + +```typescript +export const useAuthStore = defineStore('auth', () => { + const login = async (username: string, password: string): Promise => { + try { + const response = await loginApi({ username, password }) + + if (response.code === 200 && response.data) { + token.value = response.data.token + user.value = response.data.user + localStorage.setItem('auth_token', token.value) + return true + } + } catch (error) { + console.error('登录失败:', error) + return false + } + } + + return { login, logout, user, token, isAuthenticated } +}) +``` + +### 登录页面 (`src/views/LoginView.vue`) + +```typescript +const handleLogin = async () => { + loading.value = true + try { + // 调用异步登录 + const success = await authStore.login(username.value, password.value) + if (success) { + ElMessage.success('登录成功') + router.push('/admin/dashboard') + } else { + ElMessage.error('登录失败') + } + } catch (error: any) { + ElMessage.error(error?.message || '登录出错') + } finally { + loading.value = false + } +} +``` + +## 🛠 后端 API 需要返回什么? + +### 登录接口 + +**端点:** `POST /api/auth/login` + +**请求:** +```json +{ + "username": "admin", + "password": "123456" +} +``` + +**响应格式(必须严格按照):** +```json +{ + "code": 200, + "message": "登录成功", + "data": { + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", + "user": { + "id": "1", + "username": "admin", + "email": "admin@example.com", + "role": "admin" + } + } +} +``` + +**关键点:** +- `code` 必须是 200 表示成功 +- `data.token` 是 JWT token,后续请求在 `Authorization: Bearer ` 中使用 +- `data.user` 必须包含至少 `id, username, email, role` 字段 + +## 📝 添加更多 API 接口 + +### 例子:用户列表 API + +1. **在 `src/api/` 中创建 `users.ts`:** + +```typescript +import http from './index' + +export interface User { + id: number + username: string + email: string + role: string +} + +export interface UsersResponse { + code: number + message: string + data: { + items: User[] + total: number + } +} + +// 获取用户列表 +export const getUsersApi = ( + page: number = 1, + limit: number = 10 +): Promise => { + return http.get('/users', { + params: { page, limit } + }) +} + +// 创建用户 +export const createUserApi = (data: User): Promise => { + return http.post('/users', data) +} + +// 更新用户 +export const updateUserApi = (id: number, data: Partial): Promise => { + return http.put(`/users/${id}`, data) +} + +// 删除用户 +export const deleteUserApi = (id: number): Promise => { + return http.delete(`/users/${id}`) +} +``` + +2. **在组件中使用:** + +```typescript +import { getUsersApi } from '@/api/users' + +const users = ref([]) +const loading = ref(false) + +const fetchUsers = async () => { + loading.value = true + try { + const response = await getUsersApi(1, 10) + if (response.code === 200) { + users.value = response.data.items + } + } catch (error) { + ElMessage.error('获取用户列表失败') + } finally { + loading.value = false + } +} + +onMounted(() => { + fetchUsers() +}) +``` + +## 🌐 环境配置 + +### 开发环境 (`.env.development`) + +``` +VITE_API_URL=http://localhost:3000/api +``` + +### 生产环境 (`.env.production`) + +``` +VITE_API_URL=https://api.example.com/api +``` + +### 在代码中使用 + +```typescript +const baseURL = import.meta.env.VITE_API_URL +console.log(baseURL) // 自动根据环境选择 + +// 或直接在 axios 配置中 +baseURL: import.meta.env.VITE_API_URL || 'http://localhost:3000/api' +``` + +## 🧪 测试步骤 + +### 1. 启动后端服务 + +```bash +# Node.js Express 示例 +node server.js + +# 或 Python Flask 示例 +python app.py + +# 或你自己的后端服务 +``` + +### 2. 验证后端在运行 + +访问 `http://localhost:3000/api/auth/login` (应该看到 404 或错误,说明服务在运行) + +### 3. 使用 cURL 测试登录 + +```bash +curl -X POST http://localhost:3000/api/auth/login \ + -H "Content-Type: application/json" \ + -d '{"username":"admin","password":"123456"}' +``` + +应该返回: +```json +{ + "code": 200, + "message": "登录成功", + "data": { + "token": "...", + "user": {...} + } +} +``` + +### 4. 启动前端 + +```bash +npm run dev +``` + +### 5. 在前端登录 + +- 访问 http://localhost:5173 +- 输入用户名和密码 +- 点击登录 +- 如果成功,应该跳转到仪表板 + +### 6. 检查浏览器开发者工具 + +- **Network 标签:** 查看请求和响应 +- **Application 标签:** 查看 localStorage 中的 `auth_token` +- **Console 标签:** 查看是否有错误 + +## 🔒 安全建议 + +1. **始终使用 HTTPS** (生产环境) +2. **密码必须加密存储** (使用 bcrypt 等) +3. **使用 JWT 令牌** 而不是 session +4. **设置合理的 token 过期时间** (如 7 天) +5. **实现 token 刷新机制** (可选但推荐) +6. **验证 CORS 配置** 只允许特定域名 +7. **记录所有登录尝试** 用于审计 +8. **使用速率限制** 防止暴力破解 + +## 常见问题 + +### Q: 如何在其他组件中获取当前用户? + +```typescript +import { useAuthStore } from '@/stores/auth' + +const authStore = useAuthStore() +console.log(authStore.user) // 当前用户 +console.log(authStore.token) // 当前 token +``` + +### Q: 如何处理 token 刷新? + +参考 `src/api/auth.ts` 中已定义的 `refreshTokenApi` 函数,在响应拦截器中实现 token 刷新逻辑。 + +### Q: 如何在请求中添加其他头信息? + +```typescript +// 在 src/api/index.ts 中修改请求拦截器 +instance.interceptors.request.use((config) => { + const token = localStorage.getItem('auth_token') + if (token) { + config.headers.Authorization = `Bearer ${token}` + } + // 添加其他头 + config.headers['X-Custom-Header'] = 'value' + return config +}) +``` + +### Q: 如何处理超时错误? + +```typescript +const login = async () => { + try { + await authStore.login(username, password) + } catch (error: any) { + if (error.code === 'ECONNABORTED') { + ElMessage.error('请求超时,请检查网络') + } else { + ElMessage.error(error.message) + } + } +} +``` + +### Q: 前后端如何联调? + +1. 后端启动在 http://localhost:3000 +2. 前端启动在 http://localhost:5173 +3. 确保 `.env.development` 中 `VITE_API_URL=http://localhost:3000/api` +4. 后端需要配置 CORS 允许 http://localhost:5173 访问 + +### Q: CORS 错误怎么解决? + +后端需要配置 CORS: + +**Express 示例:** +```javascript +const cors = require('cors') +app.use(cors({ + origin: 'http://localhost:5173', + credentials: true +})) +``` + +**Flask 示例:** +```python +from flask_cors import CORS +CORS(app, resources={r"/api/*": {"origins": "http://localhost:5173"}}) +``` + +## 📚 相关文档 + +- [API 集成详细指南](./API_INTEGRATION_GUIDE.md) - 完整的 API 使用说明 +- [后端 API 实现参考](./BACKEND_API_EXAMPLE.md) - Node.js/Python 后端示例代码 +- [项目总结](./PROJECT_SUMMARY.md) - 整个项目的概览 + +## 🎉 总结 + +你现在有: + +✅ 完整的 axios 配置(请求/响应拦截器) +✅ API 服务层架构 +✅ 登录示例(已与后端集成) +✅ 完整的类型定义 (TypeScript) +✅ 环境变量配置 +✅ 详细的文档和后端示例 + +**下一步:** +1. 启动你的后端服务,确保监听 3000 端口 +2. 实现后端的 `/api/auth/login` 接口,返回上述格式的 JSON +3. 运行 `npm run dev` 启动前端 +4. 测试登录功能 + +有任何问题,请参考文档或查看相关代码注释!🚀 diff --git a/Build_God_Admin_Frontend/Frontend/API_INTEGRATION_GUIDE.md b/Build_God_Admin_Frontend/Frontend/API_INTEGRATION_GUIDE.md new file mode 100644 index 0000000..7d5d685 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/API_INTEGRATION_GUIDE.md @@ -0,0 +1,399 @@ +# API 集成指南 + +## 概述 + +项目已完整配置 axios,包括请求拦截器、响应拦截器和 API 服务层。 + +## 文件结构 + +``` +src/api/ +├── index.ts # axios 实例配置(请求/响应拦截器) +└── auth.ts # 登录相关 API 接口定义 +``` + +## 核心概念 + +### 1. axios 实例配置 (`src/api/index.ts`) + +```typescript +// 创建 axios 实例 +const instance = axios.create({ + baseURL: 'http://localhost:3000/api', // 从环境变量读取 + timeout: 10000 +}) +``` + +**请求拦截器**:自动在请求头添加 Authorization token +```typescript +instance.interceptors.request.use((config) => { + const token = localStorage.getItem('auth_token') + if (token) { + config.headers.Authorization = `Bearer ${token}` + } + return config +}) +``` + +**响应拦截器**:统一处理错误和 token 过期 +```typescript +instance.interceptors.response.use( + (response) => response.data, // 成功时返回 data + (error) => { + if (error.response?.status === 401) { + // Token 过期,清除登录状态并跳转到登录页 + } + } +) +``` + +### 2. API 服务层 (`src/api/auth.ts`) + +定义所有 API 接口和类型: + +```typescript +// 定义请求/响应类型 +export interface LoginRequest { + username: string + password: string +} + +export interface LoginResponse { + code: number + message: string + data: { + token: string + user: User + } +} + +// 定义 API 接口 +export const loginApi = (credentials: LoginRequest): Promise => { + return http.post('/auth/login', credentials) +} +``` + +### 3. 状态管理 (`src/stores/auth.ts`) + +在 Pinia store 中调用 API: + +```typescript +const login = async (username: string, password: string): Promise => { + try { + const response = await loginApi({ username, password }) + + if (response.code === 200 && response.data) { + token.value = response.data.token + user.value = response.data.user + + // 保存到本地存储 + localStorage.setItem('auth_token', token.value) + localStorage.setItem('user', JSON.stringify(user.value)) + + return true + } + } catch (error) { + console.error('登录失败:', error) + return false + } +} +``` + +## 登录流程详解 + +### 前端请求流程 + +``` +1. 用户在登录页输入用户名和密码 + ↓ +2. 点击"登录"按钮调用 handleLogin() + ↓ +3. authStore.login(username, password) 被调用 + ↓ +4. loginApi({ username, password }) 发送 HTTP 请求 + ↓ +5. axios 拦截器处理(添加 headers 等) + ↓ +6. 发送 POST /auth/login 请求到后端 +``` + +### 后端需要返回的数据格式 + +```json +{ + "code": 200, + "message": "登录成功", + "data": { + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", + "user": { + "id": "1", + "username": "admin", + "email": "admin@example.com", + "role": "admin" + } + } +} +``` + +**字段说明:** +- `code`: HTTP 状态码(200 表示成功) +- `message`: 返回消息 +- `data.token`: JWT token,用于后续请求认证 +- `data.user`: 用户信息对象 + - `id`: 用户 ID + - `username`: 用户名 + - `email`: 邮箱 + - `role`: 用户角色(admin 或 user) + +## 环境配置 + +### `.env.development` (开发环境) +``` +VITE_API_URL=http://localhost:3000/api +``` + +### `.env.production` (生产环境) +``` +VITE_API_URL=https://api.example.com/api +``` + +### 在代码中获取环境变量 + +```typescript +const baseURL = import.meta.env.VITE_API_URL || 'http://localhost:3000/api' +``` + +## 使用示例 + +### 1. 调用登录 API + +```typescript +import { loginApi } from '@/api/auth' + +const response = await loginApi({ + username: 'admin', + password: '123456' +}) + +if (response.code === 200) { + console.log('登录成功,用户信息:', response.data.user) + console.log('Token:', response.data.token) +} +``` + +### 2. 在组件中使用 store + +```vue + +``` + +### 3. 创建新的 API 接口 + +在 `src/api/` 中创建新文件,如 `users.ts`: + +```typescript +import http from './index' + +export interface User { + id: number + username: string + email: string + role: string +} + +// 获取用户列表 +export const getUsersApi = (page: number, limit: number) => { + return http.get('/users', { + params: { page, limit } + }) +} + +// 创建用户 +export const createUserApi = (data: User) => { + return http.post('/users', data) +} + +// 更新用户 +export const updateUserApi = (id: number, data: Partial) => { + return http.put(`/users/${id}`, data) +} + +// 删除用户 +export const deleteUserApi = (id: number) => { + return http.delete(`/users/${id}`) +} +``` + +## 错误处理 + +### 全局错误处理 + +axios 响应拦截器已处理以下情况: + +| 状态码 | 处理方式 | +|-------|--------| +| 401 | Token 过期,清除登录状态,跳转到登录页 | +| 其他 4xx/5xx | 返回错误信息 | +| 网络错误 | 返回"网络错误"提示 | + +### 在组件中处理错误 + +```typescript +try { + const response = await loginApi({ username, password }) + // 处理成功 +} catch (error: any) { + ElMessage.error(error?.message || '登录失败') +} +``` + +## 请求示例 + +### POST 请求 (登录) + +```typescript +// 请求 +POST /api/auth/login +Content-Type: application/json +Authorization: Bearer + +{ + "username": "admin", + "password": "123456" +} + +// 响应 +{ + "code": 200, + "message": "登录成功", + "data": { + "token": "...", + "user": { ... } + } +} +``` + +### GET 请求 (获取列表) + +```typescript +// 请求 +GET /api/users?page=1&limit=10 +Authorization: Bearer + +// 响应 +{ + "code": 200, + "message": "成功", + "data": { + "items": [...], + "total": 100 + } +} +``` + +### PUT 请求 (更新) + +```typescript +// 请求 +PUT /api/users/1 +Content-Type: application/json +Authorization: Bearer + +{ + "username": "new_name", + "email": "new@email.com" +} + +// 响应 +{ + "code": 200, + "message": "更新成功", + "data": { ... } +} +``` + +## 常见问题 + +### Q: Token 过期怎么处理? + +A: 后端返回 401 时,拦截器会自动清除 token 并跳转到登录页。 + +### Q: 如何添加其他请求头? + +A: 修改 `src/api/index.ts` 中的拦截器: + +```typescript +instance.interceptors.request.use((config) => { + config.headers['Custom-Header'] = 'value' + return config +}) +``` + +### Q: 如何处理超时? + +A: 已在 axios 配置中设置 `timeout: 10000`(10秒)。修改 `src/api/index.ts` 中的 `timeout` 值。 + +### Q: 如何调用 API 时显示加载状态? + +A: 在组件中使用 `loading` ref: + +```typescript +const loading = ref(false) +loading.value = true +try { + const response = await loginApi(...) +} finally { + loading.value = false +} +``` + +## 集成后端步骤 + +1. **启动后端服务** + ```bash + # 后端服务应该运行在 http://localhost:3000 + ``` + +2. **更新 API 地址** (如果不同) + ``` + 修改 .env.development 中的 VITE_API_URL + ``` + +3. **确保后端返回正确格式** + ```json + { + "code": 200, + "message": "...", + "data": { ... } + } + ``` + +4. **测试登录流程** + - 访问 http://localhost:5173 + - 输入用户名和密码 + - 查看浏览器控制台的网络请求 + +5. **检查 Token 存储** + - 打开浏览器开发者工具 → Application → LocalStorage + - 应该看到 `auth_token` 和 `user` 字段 + +## 下一步 + +- [ ] 集成后端登录接口 +- [ ] 添加用户列表 API (`src/api/users.ts`) +- [ ] 添加产品 API (`src/api/products.ts`) +- [ ] 添加订单 API (`src/api/orders.ts`) +- [ ] 实现 token 刷新机制 +- [ ] 添加错误日志上报 diff --git a/Build_God_Admin_Frontend/Frontend/API_QUICK_REFERENCE.md b/Build_God_Admin_Frontend/Frontend/API_QUICK_REFERENCE.md new file mode 100644 index 0000000..dab5b79 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/API_QUICK_REFERENCE.md @@ -0,0 +1,306 @@ +# API 快速参考卡片 + +## 📋 一页纸速查表 + +### 项目文件对应关系 + +| 文件 | 作用 | 修改频率 | +|-----|------|--------| +| `src/api/index.ts` | axios 配置 + 拦截器 | 很少 | +| `src/api/auth.ts` | API 接口定义 | 经常 | +| `src/stores/auth.ts` | 认证状态管理 | 偶尔 | +| `src/views/LoginView.vue` | 登录页面 | 偶尔 | +| `.env.development` | 开发环境 API 地址 | 很少 | +| `.env.production` | 生产环境 API 地址 | 很少 | + +### 工作流程简图 + +``` +前端组件 + ↓ +import { loginApi } from '@/api/auth' + ↓ +await loginApi({ username, password }) + ↓ +axios instance (请求拦截器添加 token) + ↓ +POST /api/auth/login + ↓ +后端返回 JSON + ↓ +axios instance (响应拦截器提取 data) + ↓ +return response.data + ↓ +前端接收数据 +``` + +### 常用代码片段 + +**1. 登录** +```typescript +import { useAuthStore } from '@/stores/auth' + +const authStore = useAuthStore() +const success = await authStore.login('admin', '123456') +``` + +**2. 获取当前用户** +```typescript +const authStore = useAuthStore() +console.log(authStore.user) +console.log(authStore.token) +``` + +**3. 登出** +```typescript +const authStore = useAuthStore() +await authStore.logout() +``` + +**4. 创建新 API 接口** +```typescript +// src/api/users.ts +import http from './index' + +export const getUsersApi = () => { + return http.get('/users') +} + +// 组件中使用 +import { getUsersApi } from '@/api/users' +const response = await getUsersApi() +``` + +### 后端需要的东西 + +**登录接口** +``` +POST /api/auth/login + +请求: +{ + "username": "admin", + "password": "123456" +} + +响应: +{ + "code": 200, + "message": "登录成功", + "data": { + "token": "jwt_token_here", + "user": { + "id": "1", + "username": "admin", + "email": "admin@example.com", + "role": "admin" + } + } +} +``` + +**所有其他接口** +``` +Authorization: Bearer (自动添加) + +返回格式: +{ + "code": 200, + "message": "...", + "data": {...} +} +``` + +### 调试技巧 + +**1. 查看网络请求** +- 打开浏览器开发者工具 (F12) +- 点击 Network 标签 +- 登录看看 POST /api/auth/login 的请求和响应 + +**2. 查看存储的 token** +- 打开浏览器开发者工具 (F12) +- 点击 Application 标签 +- 找到 LocalStorage +- 查看 `auth_token` 和 `user` + +**3. 打印错误** +```typescript +try { + await loginApi(...) +} catch (error) { + console.log(error) // 查看具体错误 +} +``` + +### 环境变量配置 + +**开发环境** (`.env.development`) +``` +VITE_API_URL=http://localhost:3000/api +``` + +**生产环境** (`.env.production`) +``` +VITE_API_URL=https://api.yourdomain.com/api +``` + +**在代码中使用** +```typescript +console.log(import.meta.env.VITE_API_URL) +``` + +### 常见错误解决 + +| 错误 | 原因 | 解决 | +|-----|------|------| +| CORS error | 跨域问题 | 后端配置 CORS | +| 401 | token 过期 | 自动清除,跳转登录 | +| 404 | 接口不存在 | 检查后端路由 | +| 500 | 服务器错误 | 检查后端日志 | +| 网络错误 | 后端未启动 | 启动后端服务 | + +### 完整登录示例 + +```typescript + + + +``` + +### API 调用模板 + +```typescript +// 1. 创建接口文件 src/api/xxx.ts +import http from './index' + +export interface XXXRequest { + // 请求参数 +} + +export interface XXXResponse { + code: number + message: string + data: { + // 响应数据 + } +} + +export const xxxApi = (params: XXXRequest): Promise => { + return http.post('/xxx', params) +} + +// 2. 在组件中使用 +import { xxxApi } from '@/api/xxx' + +const response = await xxxApi({ /* 参数 */ }) +if (response.code === 200) { + // 成功处理 +} +``` + +### HTTP 方法速查 + +```typescript +// GET 请求 +http.get('/users') +http.get('/users?page=1&limit=10') +http.get('/users', { params: { page: 1 } }) + +// POST 请求 +http.post('/users', { name: 'John' }) + +// PUT 请求 +http.put('/users/1', { name: 'Jane' }) + +// DELETE 请求 +http.delete('/users/1') + +// PATCH 请求 +http.patch('/users/1', { name: 'Bob' }) +``` + +### token 在请求中的流程 + +``` +1. 用户登录 → token 保存到 localStorage +2. 请求拦截器检查 localStorage 中的 token +3. 如果有 token,添加到请求头:Authorization: Bearer +4. 后端验证 token +5. 后端返回数据或 401 错误 +6. 响应拦截器检查状态码 +7. 如果 401,清除 token 并跳转登录页 +``` + +### 测试后端接口的命令 + +```bash +# 测试登录 +curl -X POST http://localhost:3000/api/auth/login \ + -H "Content-Type: application/json" \ + -d '{"username":"admin","password":"123456"}' + +# 获取响应中的 token +# 复制 token 值 + +# 测试其他接口(需要 token) +curl -X GET http://localhost:3000/api/users \ + -H "Authorization: Bearer YOUR_TOKEN_HERE" +``` + +## 🚀 快速启动清单 + +- [ ] 后端启动在 http://localhost:3000 +- [ ] 后端实现 POST /api/auth/login 接口 +- [ ] 后端返回正确的 JSON 格式 +- [ ] 前端运行 `npm run dev` +- [ ] 前端 .env.development 中 VITE_API_URL 指向后端 +- [ ] 打开浏览器访问 http://localhost:5173 +- [ ] 输入用户名和密码登录 +- [ ] 查看浏览器 Network 标签验证请求 +- [ ] 检查 localStorage 中是否保存了 token +- [ ] 登录成功后跳转到仪表板 + +## 📞 获取帮助 + +1. 查看 `API_INTEGRATION_GUIDE.md` - 详细教程 +2. 查看 `BACKEND_API_EXAMPLE.md` - 后端代码示例 +3. 查看组件代码注释 +4. 打开浏览器开发者工具查看错误 +5. 检查后端日志 diff --git a/Build_God_Admin_Frontend/Frontend/BACKEND_API_EXAMPLE.md b/Build_God_Admin_Frontend/Frontend/BACKEND_API_EXAMPLE.md new file mode 100644 index 0000000..850db89 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/BACKEND_API_EXAMPLE.md @@ -0,0 +1,401 @@ +# 后端 API 实现参考 + +这是一个使用 Node.js + Express 的简单后端示例,展示如何实现登录接口。 + +## 快速开始 (Node.js + Express) + +### 1. 初始化项目 + +```bash +mkdir admin-backend +cd admin-backend +npm init -y +npm install express cors jsonwebtoken bcryptjs dotenv +npm install -D nodemon typescript ts-node +``` + +### 2. 创建 `server.js` + +```javascript +const express = require('express') +const cors = require('cors') +const jwt = require('jsonwebtoken') +require('dotenv').config() + +const app = express() +const PORT = process.env.PORT || 3000 +const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key' + +// 中间件 +app.use(cors()) +app.use(express.json()) + +// 模拟用户数据 +const users = [ + { + id: '1', + username: 'admin', + password: '123456', // 实际应该加密存储 + email: 'admin@example.com', + role: 'admin' + }, + { + id: '2', + username: 'user', + password: '123456', + email: 'user@example.com', + role: 'user' + } +] + +// 登录接口 +app.post('/api/auth/login', (req, res) => { + const { username, password } = req.body + + // 验证输入 + if (!username || !password) { + return res.status(400).json({ + code: 400, + message: '用户名和密码不能为空' + }) + } + + // 查找用户 + const user = users.find(u => u.username === username && u.password === password) + + if (!user) { + return res.status(401).json({ + code: 401, + message: '用户名或密码错误' + }) + } + + // 生成 JWT token + const token = jwt.sign( + { id: user.id, username: user.username, role: user.role }, + JWT_SECRET, + { expiresIn: '7d' } + ) + + // 返回成功响应 + res.json({ + code: 200, + message: '登录成功', + data: { + token, + user: { + id: user.id, + username: user.username, + email: user.email, + role: user.role + } + } + }) +}) + +// 登出接口 +app.post('/api/auth/logout', (req, res) => { + res.json({ + code: 200, + message: '登出成功' + }) +}) + +// 获取用户信息接口 (需要认证) +app.get('/api/auth/userinfo', authenticateToken, (req, res) => { + const user = users.find(u => u.id === req.user.id) + + if (!user) { + return res.status(404).json({ + code: 404, + message: '用户不存在' + }) + } + + res.json({ + code: 200, + message: '获取成功', + data: { + id: user.id, + username: user.username, + email: user.email, + role: user.role + } + }) +}) + +// Token 验证中间件 +function authenticateToken(req, res, next) { + const authHeader = req.headers['authorization'] + const token = authHeader && authHeader.split(' ')[1] // Bearer + + if (!token) { + return res.status(401).json({ + code: 401, + message: 'Token 缺失' + }) + } + + jwt.verify(token, JWT_SECRET, (err, user) => { + if (err) { + return res.status(401).json({ + code: 401, + message: 'Token 无效或已过期' + }) + } + req.user = user + next() + }) +} + +// 启动服务器 +app.listen(PORT, () => { + console.log(\`✅ 服务器运行在 http://localhost:\${PORT}\`) + console.log(\`📝 API 文档: http://localhost:\${PORT}/api/docs\`) +}) +``` + +### 3. 创建 `.env` + +```env +PORT=3000 +JWT_SECRET=your-super-secret-key-change-in-production +NODE_ENV=development +``` + +### 4. 运行服务器 + +```bash +node server.js +# 或使用 nodemon 自动重启 +npx nodemon server.js +``` + +## API 端点说明 + +### 登录接口 + +**请求** +``` +POST /api/auth/login +Content-Type: application/json + +{ + "username": "admin", + "password": "123456" +} +``` + +**成功响应 (200)** +```json +{ + "code": 200, + "message": "登录成功", + "data": { + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", + "user": { + "id": "1", + "username": "admin", + "email": "admin@example.com", + "role": "admin" + } + } +} +``` + +**错误响应 (401)** +```json +{ + "code": 401, + "message": "用户名或密码错误" +} +``` + +### 获取用户信息接口 + +**请求** +``` +GET /api/auth/userinfo +Authorization: Bearer +``` + +**成功响应** +```json +{ + "code": 200, + "message": "获取成功", + "data": { + "id": "1", + "username": "admin", + "email": "admin@example.com", + "role": "admin" + } +} +``` + +## 使用 cURL 测试 + +```bash +# 登录 +curl -X POST http://localhost:3000/api/auth/login \ + -H "Content-Type: application/json" \ + -d '{"username":"admin","password":"123456"}' + +# 获取用户信息 +curl -X GET http://localhost:3000/api/auth/userinfo \ + -H "Authorization: Bearer YOUR_TOKEN_HERE" +``` + +## 使用 Postman 测试 + +1. 打开 Postman +2. 创建 POST 请求到 `http://localhost:3000/api/auth/login` +3. 在 Body → raw → JSON 中输入: + ```json + { + "username": "admin", + "password": "123456" + } + ``` +4. 点击 Send +5. 复制响应中的 token + +## Python Flask 示例 + +```python +from flask import Flask, request, jsonify +from flask_cors import CORS +from functools import wraps +import jwt +from datetime import datetime, timedelta + +app = Flask(__name__) +CORS(app) +app.config['JSON_AS_ASCII'] = False +SECRET_KEY = 'your-secret-key' + +# 模拟用户数据 +USERS = [ + {'id': '1', 'username': 'admin', 'password': '123456', 'email': 'admin@example.com', 'role': 'admin'}, + {'id': '2', 'username': 'user', 'password': '123456', 'email': 'user@example.com', 'role': 'user'} +] + +def token_required(f): + @wraps(f) + def decorated(*args, **kwargs): + token = request.headers.get('Authorization', '').replace('Bearer ', '') + if not token: + return jsonify({'code': 401, 'message': 'Token 缺失'}), 401 + try: + data = jwt.decode(token, SECRET_KEY, algorithms=['HS256']) + request.user_id = data['id'] + except: + return jsonify({'code': 401, 'message': 'Token 无效'}), 401 + return f(*args, **kwargs) + return decorated + +@app.route('/api/auth/login', methods=['POST']) +def login(): + data = request.json + username = data.get('username') + password = data.get('password') + + if not username or not password: + return jsonify({'code': 400, 'message': '用户名和密码不能为空'}), 400 + + user = next((u for u in USERS if u['username'] == username and u['password'] == password), None) + + if not user: + return jsonify({'code': 401, 'message': '用户名或密码错误'}), 401 + + token = jwt.encode( + {'id': user['id'], 'username': user['username']}, + SECRET_KEY, + algorithm='HS256' + ) + + return jsonify({ + 'code': 200, + 'message': '登录成功', + 'data': { + 'token': token, + 'user': { + 'id': user['id'], + 'username': user['username'], + 'email': user['email'], + 'role': user['role'] + } + } + }) + +@app.route('/api/auth/userinfo', methods=['GET']) +@token_required +def get_userinfo(): + user = next((u for u in USERS if u['id'] == request.user_id), None) + if not user: + return jsonify({'code': 404, 'message': '用户不存在'}), 404 + + return jsonify({ + 'code': 200, + 'message': '获取成功', + 'data': { + 'id': user['id'], + 'username': user['username'], + 'email': user['email'], + 'role': user['role'] + } + }) + +if __name__ == '__main__': + app.run(debug=True, port=3000) +``` + +## Java Spring Boot 示例 + +```java +@RestController +@RequestMapping("/api/auth") +@CrossOrigin(origins = "*") +public class AuthController { + + @PostMapping("/login") + public ResponseEntity login(@RequestBody LoginRequest request) { + // 验证用户 + User user = authenticateUser(request.getUsername(), request.getPassword()); + + if (user == null) { + return ResponseEntity.status(401).body(new ApiResponse(401, "用户名或密码错误")); + } + + // 生成 JWT token + String token = JwtUtils.generateToken(user); + + return ResponseEntity.ok(new ApiResponse(200, "登录成功", + new LoginResponse(token, user))); + } + + @GetMapping("/userinfo") + @PreAuthorize("isAuthenticated()") + public ResponseEntity getUserInfo() { + User user = getCurrentUser(); + return ResponseEntity.ok(new ApiResponse(200, "获取成功", user)); + } +} +``` + +## 注意事项 + +1. **密码加密**:在生产环境中,必须加密存储密码(使用 bcrypt 等) +2. **HTTPS**:生产环境必须使用 HTTPS +3. **CORS**:根据前端域名配置 CORS +4. **Token 有效期**:建议设置合理的过期时间(如 7 天) +5. **错误处理**:返回统一的错误格式 +6. **日志记录**:记录所有登录尝试 +7. **速率限制**:防止暴力破解 + +## 与前端集成 + +1. 启动后端服务:`node server.js` +2. 启动前端开发服务:`npm run dev` +3. 前端会自动从 `http://localhost:3000/api` 调用后端接口 +4. 在登录页输入 `admin / 123456` 进行测试 diff --git a/Build_God_Admin_Frontend/Frontend/PROJECT_SUMMARY.md b/Build_God_Admin_Frontend/Frontend/PROJECT_SUMMARY.md new file mode 100644 index 0000000..a7c25dd --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/PROJECT_SUMMARY.md @@ -0,0 +1,501 @@ +# 🎉 后台管理系统 - 项目完成总结 + +## ✨ 项目概述 + +一个现代化的 Vue 3 + TypeScript 后台管理系统框架,具有完整的登录认证、用户管理、产品管理、订单管理等功能模块,采用优雅的暗黑主题设计。 + +--- + +## 🎨 设计主题 + +### 颜色方案(黑白双色暗黑风格) +```css +主色调:#667eea (紫蓝色) - 用于强调和交互元素 +副色调:#764ba2 (深紫) - 用于渐变和悬停效果 + +背景色:#0a0e27 (深蓝黑) - 主要背景 +卡片色:#1f2937 (深灰) - 内容卡片背景 +边框色:#374151 (浅深灰) - 边框分割线 +文字色:#e5e7eb (浅灰) - 主文本 +辅文字:#9ca3af (中灰) - 辅助文本 + +成功:#22c55e (绿色) +警告:#f59e0b (橙色) +错误:#ef4444 (红色) +信息:#3b82f6 (蓝色) +``` + +### 设计风格 +- ✅ 极简现代设计 +- ✅ 深色护眼主题 +- ✅ 圆角柔和设计 +- ✅ 平滑过渡动画 +- ✅ 响应式布局 + +--- + +## 📁 完整的文件清单 + +### 核心文件 +``` +✅ src/main.ts - 应用入口,集成 Element Plus +✅ src/App.vue - 根组件,简化为路由容器 +✅ src/router/index.ts - 路由配置(含导航守卫) +✅ src/assets/main.css - 暗黑主题全局样式 +``` + +### 状态管理 +``` +✅ src/stores/auth.ts - 用户认证状态管理 + - 登录/登出功能 + - 用户信息管理 + - Token 管理 + - localStorage 持久化 +``` + +### 页面组件 +``` +✅ src/views/LoginView.vue - 登录页面 + - 用户名/密码输入 + - 表单验证 + - 记住登录状态 + +✅ src/views/AdminLayout.vue - 后台主布局 + - 侧边栏 + 内容区域布局 + - 顶部导航栏 + - 退出登录功能 + +✅ src/views/admin/DashboardView.vue - 仪表板 + - 数据统计卡片 + - 最近订单表格 + - 数据概览展示 + +✅ src/views/admin/UsersView.vue - 用户管理 + - 用户列表展示 + - 搜索功能 + - 新增用户 + - 编辑用户 + - 删除用户 + - 状态管理 + +✅ src/views/admin/ProductsView.vue - 产品管理 + - 产品列表管理 + - 搜索过滤 + - 新增产品 + - 编辑产品 + - 删除产品 + - 库存管理 + - 价格管理 + +✅ src/views/admin/OrdersView.vue - 订单管理 + - 订单列表展示 + - 高级过滤 + - 订单搜索 + - 新增订单 + - 编辑订单 + - 删除订单 + - 状态跟踪 + +✅ src/views/admin/SettingsView.vue - 系统设置 + - 基本设置 + - 安全设置 + - 备份配置 + - 文件类型管理 +``` + +### 可复用组件 +``` +✅ src/components/Header.vue - 顶部导航栏 + - 菜单切换按钮 + - 用户信息展示 + - 退出登录按钮 + +✅ src/components/Sidebar.vue - 侧边栏菜单 + - 可折叠菜单 + - 图标 + 文字标签 + - 当前路由高亮 + - 菜单项导航 +``` + +### 文档文件 +``` +✅ ADMIN_SYSTEM_README.md - 项目完整文档 +✅ QUICK_START.md - 快速开始指南 +✅ PROJECT_SUMMARY.md - 本文件 +``` + +--- + +## 🎯 功能清单 + +### 已实现的功能 + +#### 1. 认证系统 ✅ +- [x] 登录页面(用户名/密码) +- [x] 登录状态验证 +- [x] 自动登录(localStorage 记忆) +- [x] 登出功能 +- [x] 路由保护守卫 +- [x] 登录失败提示 + +#### 2. 仪表板 ✅ +- [x] 数据统计卡片(4 个指标) +- [x] 统计数据展示 +- [x] 最近订单表格 +- [x] 欢迎信息 + +#### 3. 用户管理(CRUD 完整示例)✅ +- [x] 用户列表展示 +- [x] 搜索功能(用户名/邮箱) +- [x] 新增用户对话框 +- [x] 编辑用户信息 +- [x] 删除用户 +- [x] 状态管理(启用/禁用) +- [x] 角色管理(管理员/普通用户) +- [x] 创建时间记录 + +#### 4. 产品管理(CRUD 完整示例)✅ +- [x] 产品列表展示 +- [x] 搜索功能(名称/SKU) +- [x] 新增产品 +- [x] 编辑产品信息 +- [x] 删除产品 +- [x] 库存管理 +- [x] 价格管理 +- [x] 分类管理 +- [x] 上架/下架状态 +- [x] 库存警告显示 + +#### 5. 订单管理(CRUD 完整示例)✅ +- [x] 订单列表展示 +- [x] 搜索功能(订单号/客户名) +- [x] 状态过滤 +- [x] 新增订单 +- [x] 编辑订单 +- [x] 删除订单 +- [x] 支付方式管理 +- [x] 订单状态追踪 +- [x] 金额管理 + +#### 6. 系统设置 ✅ +- [x] 基本设置表单 +- [x] 安全设置 +- [x] 备份配置 +- [x] 文件上传设置 +- [x] 文件类型管理 +- [x] 设置保存功能 + +#### 7. UI 组件 ✅ +- [x] 侧边栏菜单(可折叠) +- [x] 顶部导航栏 +- [x] 对话框表单 +- [x] 数据表格 +- [x] 搜索输入 +- [x] 状态标签 +- [x] 按钮组件 +- [x] 表单输入 + +#### 8. 交互功能 ✅ +- [x] 弹出确认对话框 +- [x] 提示消息提醒 +- [x] 加载状态显示 +- [x] 表单验证 +- [x] 回车键提交 +- [x] 菜单切换动画 + +#### 9. 路由系统 ✅ +- [x] 登录路由 +- [x] 后台管理路由 +- [x] 路由懒加载 +- [x] 导航守卫(认证检查) +- [x] 自动重定向 +- [x] 404 处理 + +--- + +## 🚀 技术架构 + +### 技术栈 +``` +Frontend: + - Vue 3.5.27 前端框架 + - TypeScript 5.9.3 类型安全 + - Vite 7.3.1 构建工具 + - Vue Router 4.6.4 路由管理 + - Pinia 3.0.4 状态管理 + - Element Plus 2.7.0 UI 组件库 + - Axios HTTP 请求 +``` + +### 架构特点 +``` +1. 组件化设计 + - 可复用组件模式 + - 父子组件通信 + - Emits 事件机制 + +2. 状态管理 + - Pinia 集中管理状态 + - localStorage 持久化 + - 单一数据源 + +3. 路由管理 + - 嵌套路由结构 + - 导航守卫保护 + - 懒加载优化 + +4. 样式系统 + - Scoped CSS + - CSS 变量(可扩展) + - 响应式设计 + +5. 类型安全 + - 完整的 TypeScript 支持 + - 接口定义 + - 类型检查 +``` + +--- + +## 📊 数据流 + +### 登录流程 +``` +用户输入 → 表单验证 → authStore.login() + → localStorage 保存 → 路由重定向 → 仪表板 +``` + +### 页面导航 +``` +点击菜单 → Router.push() → 导航守卫检查 + → 页面组件加载 → 内容展示 +``` + +### 数据操作 +``` +表单提交 → 数据验证 → ref 状态更新 + → UI 重新渲染 → 操作反馈 +``` + +--- + +## 🎨 样式系统 + +### 响应式设计 +```css +✅ 桌面端:完整布局 +✅ 平板端:侧边栏可收缩 +✅ 手机端:响应式卡片布局 +``` + +### 颜色管理 +```css +主题颜色统一使用: +- 主调:#667eea(可自定义) +- 背景:#0a0e27(可自定义) +- 卡片:#1f2937(可自定义) +- 文本:#e5e7eb(可自定义) +``` + +--- + +## 🔐 安全特性 + +### 已实现 +``` +✅ 路由认证守卫 +✅ 登录状态管理 +✅ 表单数据验证 +✅ 错误提示处理 +✅ Token 管理 +``` + +### 建议增强 +``` +⚠️ HTTPS 传输 +⚠️ API 签名验证 +⚠️ CSRF 令牌 +⚠️ XSS 防护 +⚠️ 权限细粒度控制 +``` + +--- + +## 📈 性能优化 + +### 已优化项 +``` +✅ 路由懒加载 +✅ 组件动态导入 +✅ 事件委托 +✅ 防抖处理 +``` + +### 可优化项 +``` +⚠️ 虚拟滚动(大列表) +⚠️ 分页加载 +⚠️ 图片懒加载 +⚠️ 缓存策略 +⚠️ 代码分割优化 +``` + +--- + +## 🎓 学习路径 + +### 初级开发者 +1. 理解 Vue 3 基础 +2. 学习组件通信 +3. 理解 Pinia 状态管理 +4. 学习 Vue Router 路由 + +### 中级开发者 +1. API 集成 +2. 表单验证和处理 +3. 错误处理 +4. 权限管理 + +### 高级开发者 +1. 性能优化 +2. 安全加固 +3. 自动化测试 +4. 部署流程 + +--- + +## 📋 使用说明 + +### 快速启动 +```bash +# 1. 安装依赖 +npm install + +# 2. 开发模式 +npm run dev + +# 3. 访问 +http://localhost:5173 + +# 4. 登录信息 +用户名: admin +密码: 123456 +``` + +### 生产构建 +```bash +# 构建 +npm run build + +# 预览 +npm run preview + +# 类型检查 +npm run type-check +``` + +--- + +## 🛠 后续开发计划 + +### Phase 1: 基础功能(当前 ✅) +- [x] 登录认证 +- [x] CRUD 模块 +- [x] 主题设计 + +### Phase 2: 功能扩展(推荐) +- [ ] API 后端集成 +- [ ] 权限管理系统 +- [ ] 审计日志 +- [ ] 批量操作 +- [ ] 导出功能 + +### Phase 3: 用户体验(优化) +- [ ] 深浅主题切换 +- [ ] 国际化多语言 +- [ ] 快捷键支持 +- [ ] 高级搜索 +- [ ] 自定义仪表板 + +### Phase 4: 系统优化(性能) +- [ ] 性能监控 +- [ ] 错误追踪 +- [ ] 用户行为分析 +- [ ] 缓存策略 +- [ ] CDN 配置 + +--- + +## 💡 开发建议 + +### 代码组织 +``` +建议创建 src/api 文件夹管理所有 API 调用 +建议创建 src/services 文件夹存放业务逻辑 +建议创建 src/types 文件夹存放类型定义 +建议创建 src/utils 文件夹存放工具函数 +``` + +### 命名规范 +``` +✅ 组件文件:PascalCase(如 UserForm.vue) +✅ 页面文件:PascalCase + View 后缀(如 UsersView.vue) +✅ Store 文件:camelCase + Store 后缀(如 authStore.ts) +✅ 类名:PascalCase +✅ 变量/函数:camelCase +✅ 常量:UPPER_CASE +``` + +### Git 管理 +```bash +# 建议分支结构 +main - 生产环境 +develop - 开发环境 +feature/* - 功能分支 +bugfix/* - 修复分支 +hotfix/* - 紧急修复 +``` + +--- + +## 🎉 项目成果总结 + +✅ **完整的后台管理系统框架** +- 5 个功能模块(仪表板、用户、产品、订单、设置) +- 2 个可复用组件(导航栏、侧边栏) +- 完整的 CRUD 示例 + +✅ **专业的暗黑主题设计** +- 黑白双色优雅设计 +- 响应式布局 +- 平滑动画效果 + +✅ **完善的路由和认证系统** +- 登录/登出功能 +- 路由保护守卫 +- localStorage 持久化 + +✅ **生产级代码质量** +- TypeScript 类型安全 +- 完整的错误处理 +- 用户友好的提示反馈 + +✅ **详细的文档和注释** +- 项目完整文档 +- 快速开始指南 +- 代码注释清晰 + +--- + +## 📞 联系方式 + +如有任何问题或建议,欢迎反馈。 + +--- + +**项目创建时间**: 2026-02-02 +**框架版本**: Vue 3.5.27 + TypeScript 5.9.3 +**主题**: 暗黑风格(黑白双色) +**状态**: ✅ 已完成且可直接使用 + +祝你开发愉快!🚀 diff --git a/Build_God_Admin_Frontend/Frontend/QUICK_START.md b/Build_God_Admin_Frontend/Frontend/QUICK_START.md new file mode 100644 index 0000000..ed5099a --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/QUICK_START.md @@ -0,0 +1,170 @@ +# 快速开始指南 + +## 系统已搭建完成 ✅ + +你的后台管理系统框架已经完全搭建好!以下是完成的内容: + +## 📦 已安装的依赖 + +- ✅ Vue 3 +- ✅ TypeScript +- ✅ Vue Router +- ✅ Pinia (状态管理) +- ✅ Element Plus (UI 库) +- ✅ Axios (HTTP 请求) +- ✅ Vite (构建工具) + +## 🏗️ 已创建的文件结构 + +### 状态管理 +- `src/stores/auth.ts` - 认证状态管理(用户登录/登出) + +### 页面组件 +- `src/views/LoginView.vue` - 登录页面 +- `src/views/AdminLayout.vue` - 后台主布局 +- `src/views/admin/DashboardView.vue` - 仪表板 +- `src/views/admin/UsersView.vue` - 用户管理(CRUD 示例) +- `src/views/admin/ProductsView.vue` - 产品管理(CRUD 示例) +- `src/views/admin/OrdersView.vue` - 订单管理(CRUD 示例) +- `src/views/admin/SettingsView.vue` - 系统设置 + +### 可复用组件 +- `src/components/Header.vue` - 顶部导航栏 +- `src/components/Sidebar.vue` - 侧边栏菜单 + +### 配置文件 +- `src/router/index.ts` - 路由配置(包含导航守卫) +- `src/main.ts` - 应用入口 +- `src/App.vue` - 根组件 +- `src/assets/main.css` - 暗黑主题样式 + +## 🎨 设计特点 + +### 暗黑主题配置 +- 主色调:紫蓝色 (#667eea) +- 背景:深蓝黑 (#0a0e27) +- 卡片:深灰 (#1f2937) +- 文本:浅灰 (#e5e7eb) + +### UI 特性 +- 侧边栏可折叠 +- 响应式设计 +- 平滑过渡动画 +- 深色主题优化 + +## 🚀 运行项目 + +### 开发环境 +```bash +npm run dev +``` +访问 http://localhost:5173 + +### 生产构建 +```bash +npm run build +``` + +### 类型检查 +```bash +npm run type-check +``` + +## 🔐 登录信息 + +- **用户名**: admin +- **密码**: 123456 + +## 📋 功能清单 + +✅ 登录/登出功能 +✅ 仪表板(数据统计) +✅ 用户管理(增删改查) +✅ 产品管理(增删改查) +✅ 订单管理(增删改查) +✅ 系统设置 +✅ 侧边栏导航 +✅ 顶部导航栏 +✅ 路由保护 +✅ 响应式布局 + +## 🎯 后续开发步骤 + +1. **后端 API 集成** + - 替换 mock 数据为真实 API 调用 + - 使用 axios 进行 HTTP 请求 + - 添加错误处理和加载状态 + +2. **权限管理** + - 根据用户角色显示/隐藏菜单项 + - 实现页面级权限控制 + - 添加操作级权限检查 + +3. **数据验证** + - 为所有表单添加输入验证 + - 实现客户端表单验证规则 + - 添加服务端验证提示 + +4. **功能扩展** + - 添加更多管理模块 + - 实现导出/导入功能 + - 添加批量操作功能 + - 实现高级过滤和搜索 + +5. **性能优化** + - 实现虚拟滚动 + - 添加分页功能 + - 优化图片加载 + - 实现懒加载 + +6. **用户体验** + - 添加更多交互反馈 + - 实现快捷键支持 + - 添加深色/浅色主题切换 + - 实现国际化多语言 + +## 📚 文件修改说明 + +### 关键文件 + +1. **src/router/index.ts** + - 完全重写了路由配置 + - 添加了导航守卫(认证检查) + - 配置了后台管理模块路由 + +2. **src/main.ts** + - 集成了 Element Plus + - 初始化认证状态 + +3. **src/App.vue** + - 简化为只展示路由视图 + +4. **src/assets/main.css** + - 更新为暗黑主题样式 + +## 💡 开发建议 + +1. 所有 CRUD 页面都有完整的搜索、编辑、删除功能示例 +2. 使用 Pinia store 管理全局状态 +3. 表单验证可以使用 Element Plus 的表单验证功能 +4. API 调用使用 axios 库,可创建 `src/api` 文件夹管理所有 API +5. 创建 `src/services` 文件夹存放业务逻辑 + +## 🔗 项目结构优化建议 + +``` +src/ +├── api/ # API 接口管理 +│ ├── users.ts +│ ├── products.ts +│ ├── orders.ts +│ └── index.ts +├── services/ # 业务逻辑服务 +├── types/ # TypeScript 类型定义 +├── utils/ # 工具函数 +├── hooks/ # 自定义 Hooks +├── directives/ # 自定义指令 +└── ... +``` + +祝你开发愉快!如有任何问题,随时联系我。 diff --git a/Build_God_Admin_Frontend/Frontend/README.md b/Build_God_Admin_Frontend/Frontend/README.md new file mode 100644 index 0000000..2bb42be --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/README.md @@ -0,0 +1,42 @@ +# Build_God_Admin_Frontend + +This template should help get you started developing with Vue 3 in Vite. + +## Recommended IDE Setup + +[VS Code](https://code.visualstudio.com/) + [Vue (Official)](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur). + +## Recommended Browser Setup + +- Chromium-based browsers (Chrome, Edge, Brave, etc.): + - [Vue.js devtools](https://chromewebstore.google.com/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd) + - [Turn on Custom Object Formatter in Chrome DevTools](http://bit.ly/object-formatters) +- Firefox: + - [Vue.js devtools](https://addons.mozilla.org/en-US/firefox/addon/vue-js-devtools/) + - [Turn on Custom Object Formatter in Firefox DevTools](https://fxdx.dev/firefox-devtools-custom-object-formatters/) + +## Type Support for `.vue` Imports in TS + +TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) to make the TypeScript language service aware of `.vue` types. + +## Customize configuration + +See [Vite Configuration Reference](https://vite.dev/config/). + +## Project Setup + +```sh +npm install +``` + +### Compile and Hot-Reload for Development + +```sh +npm run dev +``` + +### Type-Check, Compile and Minify for Production + +```sh +npm run build +``` diff --git a/Build_God_Admin_Frontend/Frontend/README_API_SUMMARY.md b/Build_God_Admin_Frontend/Frontend/README_API_SUMMARY.md new file mode 100644 index 0000000..46b6ac3 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/README_API_SUMMARY.md @@ -0,0 +1,235 @@ +# 🎯 Axios API 集成 - 一句话总结 + +## 你问的问题 + +> 是不是少了axios相关的东西?调用后台接口,后台接口会传递json数据上来,我应该怎么做?你只用做一个登录示例就可以了。 + +## 答案 + +✅ **已为你完成!** 完整的 axios 配置和登录 API 示例已创建。 + +--- + +## 📂 新增文件 + +### API 层(前端代码) + +``` +src/api/ +├── index.ts ← axios 实例 + 拦截器 +│ • baseURL 自动添加 API 前缀 +│ • 请求拦截器自动添加 token +│ • 响应拦截器自动处理错误 +│ +└── auth.ts ← 登录 API + • loginApi(username, password) - 调用 POST /api/auth/login + • logoutApi() + • getUserInfoApi() + • 完整的 TypeScript 类型定义 +``` + +### 环境配置 + +``` +.env.development ← API 地址:http://localhost:3000/api +.env.production ← API 地址:https://api.example.com/api +.env.local ← 本地覆盖 +``` + +### 文档 + +``` +WHAT_TO_DO_NEXT.md ← 👈 你接下来该做什么(先读这个) +API_IMPLEMENTATION_COMPLETE.md ← 完整总结 +API_INTEGRATION_GUIDE.md ← 详细教程 +BACKEND_API_EXAMPLE.md ← 后端代码示例 +API_QUICK_REFERENCE.md ← 快速参考 +``` + +--- + +## 🔄 工作流程 + +### 简单版本 + +``` +用户登录 + ↓ +await authStore.login(username, password) + ↓ +loginApi(credentials) + ↓ +http.post('/auth/login', credentials) + ↓ +axios 拦截器处理 + ↓ +POST http://localhost:3000/api/auth/login + ↓ +后端返回 JSON + ↓ +axios 拦截器提取 response.data + ↓ +前端收到数据 + ↓ +保存 token 和 user 到 localStorage + ↓ +登录成功! +``` + +--- + +## 💻 后端返回的 JSON 格式 + +你的后端需要返回这样的格式: + +```json +{ + "code": 200, + "message": "登录成功", + "data": { + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", + "user": { + "id": "1", + "username": "admin", + "email": "admin@example.com", + "role": "admin" + } + } +} +``` + +**关键点:** +- `code` 必须是 200 表示成功 +- `data.token` 是 JWT,后续请求会自动在 `Authorization: Bearer ` 中发送 +- `data.user` 包含用户信息 + +--- + +## 🚀 立即测试 + +### 选项 1:使用提供的后端示例 + +```bash +# 创建后端项目 +mkdir admin-backend && cd admin-backend +npm init -y && npm install express cors jsonwebtoken + +# 复制 BACKEND_API_EXAMPLE.md 中的代码到 server.js +# 然后运行 +node server.js + +# 在另一个终端启动前端 +npm run dev + +# 访问 http://localhost:5173 +# 输入 admin / 123456 登录 +``` + +### 选项 2:集成你自己的后端 + +1. 实现 `POST /api/auth/login` 接口 +2. 返回上述格式的 JSON +3. 配置 CORS +4. 启动后端 +5. 运行 `npm run dev` +6. 测试登录 + +--- + +## 📝 代码示例 + +### 在组件中使用(已更新) + +```typescript +import { useAuthStore } from '@/stores/auth' + +const authStore = useAuthStore() + +// 登录 +const success = await authStore.login('admin', '123456') +if (success) { + console.log('登录成功!') +} + +// 获取当前用户 +console.log(authStore.user) +console.log(authStore.token) + +// 登出 +await authStore.logout() +``` + +### 添加新的 API(参考登录示例) + +```typescript +// src/api/users.ts +import http from './index' + +export const getUsersApi = () => { + return http.get('/users') +} + +export const createUserApi = (data) => { + return http.post('/users', data) +} + +// 在组件中使用 +const response = await getUsersApi() +if (response.code === 200) { + console.log(response.data) +} +``` + +--- + +## ✅ 检查清单 + +### 前端(✅ 已完成) + +- [x] Axios 配置 +- [x] 拦截器设置 +- [x] API 服务层 +- [x] 登录示例 +- [x] TypeScript 类型 +- [x] 环境配置 + +### 你需要做(⏳ 待实施) + +- [ ] 实现后端登录接口 +- [ ] 配置 CORS +- [ ] 启动后端 +- [ ] 测试集成 + +--- + +## 📚 快速参考 + +| 需求 | 文件 | 说明 | +|------|------|------| +| 快速上手 | `WHAT_TO_DO_NEXT.md` | 下一步该做什么 | +| 详细教程 | `API_INTEGRATION_GUIDE.md` | 完整 API 使用指南 | +| 后端参考 | `BACKEND_API_EXAMPLE.md` | Node.js/Python 实现 | +| 代码参考 | `API_QUICK_REFERENCE.md` | 快速代码片段 | +| 原理说明 | `API_IMPLEMENTATION_COMPLETE.md` | 完整工作流程 | + +--- + +## 🎉 总结 + +``` +✅ 前端:完整的 API 层 + 登录示例 +⏳ 你的工作:实现后端 API + 配置 CORS + 测试 + +预计时间:15 分钟 +结果:功能完整的登录系统 +``` + +**现在就开始吧!** 🚀 + +--- + +**相关文档快速链接:** +- 👉 [接下来该做什么](./WHAT_TO_DO_NEXT.md) +- 📖 [详细集成指南](./API_INTEGRATION_GUIDE.md) +- 💻 [后端代码示例](./BACKEND_API_EXAMPLE.md) +- ⚡ [快速参考](./API_QUICK_REFERENCE.md) diff --git a/Build_God_Admin_Frontend/Frontend/WHAT_TO_DO_NEXT.md b/Build_God_Admin_Frontend/Frontend/WHAT_TO_DO_NEXT.md new file mode 100644 index 0000000..67d7d58 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/WHAT_TO_DO_NEXT.md @@ -0,0 +1,390 @@ +# 🎯 API 集成总结 - 你该做什么 + +## ✅ 已经为你完成的 + +### 1. 前端 API 架构 + +``` +src/api/ +├── index.ts - axios 实例 + 拦截器(请求时自动添加 token) +└── auth.ts - 登录相关 API 定义 +``` + +### 2. 更新的文件 + +``` +src/stores/auth.ts - 已更新为调用真实 API +src/views/LoginView.vue - 已更新为异步登录 +``` + +### 3. 环境配置 + +``` +.env.development - API 地址:http://localhost:3000/api +.env.production - API 地址:https://api.example.com/api (修改为你的) +.env.local - 本地覆盖配置 +``` + +### 4. 完整的文档 + +``` +API_IMPLEMENTATION_COMPLETE.md - 最完整的总结(推荐先读这个) +API_INTEGRATION_GUIDE.md - 详细 API 使用指南 +BACKEND_API_EXAMPLE.md - 后端代码示例(Node.js/Python) +API_QUICK_REFERENCE.md - 快速参考卡片 +``` + +## 🚀 你现在需要做什么 + +### 方案 A:使用我提供的后端示例 + +**第 1 步:创建后端项目** + +```bash +mkdir admin-backend +cd admin-backend +npm init -y +npm install express cors jsonwebtoken +``` + +**第 2 步:创建 `server.js`** + +参考 `BACKEND_API_EXAMPLE.md` 中的 Node.js 示例代码,复制到 `server.js` + +**第 3 步:启动后端** + +```bash +node server.js +``` + +你会看到: +``` +✅ 服务器运行在 http://localhost:3000 +``` + +**第 4 步:启动前端** + +在另一个终端: + +```bash +npm run dev +``` + +**第 5 步:测试** + +1. 访问 http://localhost:5173 +2. 输入 `admin / 123456` +3. 点击登录 +4. 应该看到"登录成功"并跳转到仪表板 ✨ + +--- + +### 方案 B:使用你自己的后端 + +**需要做什么:** + +1. **实现登录接口** + + 端点:`POST /api/auth/login` + + 请求: + ```json + { + "username": "admin", + "password": "123456" + } + ``` + + 响应: + ```json + { + "code": 200, + "message": "登录成功", + "data": { + "token": "jwt_token_here", + "user": { + "id": "1", + "username": "admin", + "email": "admin@example.com", + "role": "admin" + } + } + } + ``` + +2. **配置 CORS** + + 允许前端跨域请求: + ``` + Access-Control-Allow-Origin: http://localhost:5173 + Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS + Access-Control-Allow-Headers: Content-Type, Authorization + ``` + +3. **启动后端服务** + + 确保监听 `3000` 端口(或修改 `.env.development` 中的地址) + +4. **启动前端** + + ```bash + npm run dev + ``` + +--- + +## 🔧 常见问题 + +### Q: 前端提示"网络错误" + +**解决方案:** +1. 检查后端是否启动:`http://localhost:3000` +2. 检查 `.env.development` 中的 API 地址是否正确 +3. 查看浏览器开发者工具的 Network 标签查看请求 + +### Q: 前端提示"CORS error" + +**解决方案:** +- 后端必须配置 CORS,允许来自 `http://localhost:5173` 的请求 + +**Express 示例:** +```javascript +const cors = require('cors') +app.use(cors({ + origin: 'http://localhost:5173', + credentials: true +})) +``` + +### Q: 登录提示"401 未授权" + +**解决方案:** +- 检查后端返回的 `code` 是否为 200 +- 检查用户名和密码是否匹配 +- 查看后端日志 + +### Q: 登录后页面不跳转 + +**解决方案:** +1. 检查浏览器控制台是否有 JavaScript 错误 +2. 检查是否成功保存到 localStorage(打开开发者工具 → Application → LocalStorage) +3. 查看 Network 标签验证响应数据格式是否正确 + +### Q: 如何修改 API 地址? + +**开发环境:** +编辑 `.env.development`: +``` +VITE_API_URL=http://你的后端地址:3000/api +``` + +**生产环境:** +编辑 `.env.production`: +``` +VITE_API_URL=https://你的生产API地址/api +``` + +--- + +## 📚 后续开发 + +### 添加更多 API 接口 + +参考 `src/api/auth.ts`,在 `src/api/` 中创建新文件: + +```typescript +// src/api/users.ts +import http from './index' + +export const getUsersApi = () => { + return http.get('/users') +} + +export const createUserApi = (data) => { + return http.post('/users', data) +} + +export const updateUserApi = (id, data) => { + return http.put(`/users/${id}`, data) +} + +export const deleteUserApi = (id) => { + return http.delete(`/users/${id}`) +} +``` + +### 在组件中使用 + +```typescript +import { getUsersApi } from '@/api/users' + +const users = ref([]) +const loading = ref(false) + +const fetchUsers = async () => { + loading.value = true + try { + const response = await getUsersApi() + if (response.code === 200) { + users.value = response.data.items + } + } catch (error) { + ElMessage.error('获取失败') + } finally { + loading.value = false + } +} + +onMounted(() => { + fetchUsers() +}) +``` + +--- + +## 🧪 测试步骤 + +### 1. 测试后端接口(使用 curl) + +```bash +# 登录 +curl -X POST http://localhost:3000/api/auth/login \ + -H "Content-Type: application/json" \ + -d '{"username":"admin","password":"123456"}' + +# 应该返回 +# { +# "code": 200, +# "message": "登录成功", +# "data": { +# "token": "...", +# "user": {...} +# } +# } +``` + +### 2. 测试前端集成 + +1. 启动后端:`node server.js` +2. 启动前端:`npm run dev` +3. 打开 http://localhost:5173 +4. 输入用户名和密码 +5. 点击登录 +6. 查看浏览器开发者工具: + - **Network** 标签:查看请求/响应 + - **Application** 标签:查看 localStorage 中的 token + - **Console** 标签:查看任何错误信息 + +--- + +## 📋 文件说明 + +| 文件 | 说明 | 何时修改 | +|-----|------|--------| +| `src/api/index.ts` | Axios 配置和拦截器 | 很少 | +| `src/api/auth.ts` | API 接口定义 | 添加新接口时 | +| `src/stores/auth.ts` | 认证状态管理 | 很少 | +| `src/views/LoginView.vue` | 登录页面 | 很少 | +| `.env.development` | 开发环境 API 地址 | 改变后端地址时 | +| `.env.production` | 生产环境 API 地址 | 部署到生产前 | + +--- + +## 🎓 学习资源 + +1. **快速参考** - 看 `API_QUICK_REFERENCE.md` +2. **详细指南** - 看 `API_INTEGRATION_GUIDE.md` +3. **后端示例** - 看 `BACKEND_API_EXAMPLE.md` +4. **完整说明** - 看 `API_IMPLEMENTATION_COMPLETE.md` + +--- + +## ✅ 完成清单 + +### 前端部分(✅ 已完成) + +- [x] Axios 配置 +- [x] 请求拦截器 +- [x] 响应拦截器 +- [x] API 服务层 +- [x] 认证 Store +- [x] 登录页面 +- [x] 环境配置 +- [x] 文档 +- [x] 类型定义 + +### 你需要完成的(⏳ 待实施) + +- [ ] 后端登录接口 +- [ ] 后端 CORS 配置 +- [ ] 后端数据库存储 +- [ ] 其他业务接口 + +--- + +## 🚀 快速开始 + +### 最快的方式(使用示例后端) + +```bash +# 终端 1 - 启动后端 +cd admin-backend +node server.js + +# 终端 2 - 启动前端 +npm run dev + +# 打开浏览器访问 http://localhost:5173 +# 输入 admin / 123456 登录 +``` + +--- + +## 💡 核心概念 + +### 请求流程 +``` +前端 → 添加 token → 发送 HTTP 请求 → 后端 ← 验证 token ← 返回数据 +``` + +### 响应格式 +```json +{ + "code": 200, // HTTP 状态码 + "message": "...", // 消息 + "data": {...} // 实际数据 +} +``` + +### Token 管理 +``` +登录时保存 → 每个请求自动添加 → 验证失败自动清除 → 跳转登录 +``` + +--- + +## 📞 如果遇到问题 + +1. 查看浏览器控制台错误信息 +2. 查看后端日志 +3. 使用 curl 测试后端接口 +4. 查看相关文档 +5. 检查文件名和 API 路径是否正确 + +--- + +## 🎉 总结 + +你现在有: + +✅ 完整的前端 API 架构(可直接使用) +✅ 登录示例代码(参考如何集成) +✅ 后端代码示例(参考如何实现) +✅ 详细的文档(学习和参考) + +**只需 3 步即可让系统运行:** +1. 实现后端登录接口 +2. 启动后端和前端 +3. 在登录页测试 + +准备好了吗?让我们开始吧!🚀 diff --git a/Build_God_Admin_Frontend/Frontend/env.d.ts b/Build_God_Admin_Frontend/Frontend/env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/Build_God_Admin_Frontend/Frontend/index.html b/Build_God_Admin_Frontend/Frontend/index.html new file mode 100644 index 0000000..e25dc5e --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite App + + +
+ + + diff --git a/Build_God_Admin_Frontend/Frontend/package-lock.json b/Build_God_Admin_Frontend/Frontend/package-lock.json new file mode 100644 index 0000000..c880063 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/package-lock.json @@ -0,0 +1,3561 @@ +{ + "name": "build-god-admin-frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "build-god-admin-frontend", + "version": "0.0.0", + "dependencies": { + "axios": "^1.13.4", + "element-plus": "^2.7.0", + "jwt-decode": "^4.0.0", + "pinia": "^3.0.4", + "vue": "^3.5.27", + "vue-router": "^4.6.4" + }, + "devDependencies": { + "@tsconfig/node24": "^24.0.4", + "@types/node": "^24.10.9", + "@vitejs/plugin-vue": "^6.0.3", + "@vue/tsconfig": "^0.8.1", + "npm-run-all2": "^8.0.4", + "typescript": "~5.9.3", + "vite": "^7.3.1", + "vite-plugin-vue-devtools": "^8.0.5", + "vue-tsc": "^3.2.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.29.0.tgz", + "integrity": "sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.0.tgz", + "integrity": "sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-decorators": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.28.6.tgz", + "integrity": "sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@element-plus/icons-vue": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz", + "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==", + "license": "MIT", + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.4", + "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.7.4.tgz", + "integrity": "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.5", + "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.7.5.tgz", + "integrity": "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.4", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmmirror.com/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@popperjs/core": { + "name": "@sxzz/popperjs-es", + "version": "2.11.8", + "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.8.tgz", + "integrity": "sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz", + "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tsconfig/node24": { + "version": "24.0.4", + "resolved": "https://registry.npmmirror.com/@tsconfig/node24/-/node24-24.0.4.tgz", + "integrity": "sha512-2A933l5P5oCbv6qSxHs7ckKwobs8BDAe9SJ/Xr2Hy+nDlwmLE1GhFh/g/vXGRZWgxBg9nX/5piDtHR9Dkw/XuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/node": { + "version": "24.10.9", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-24.10.9.tgz", + "integrity": "sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.16", + "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", + "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-6.0.3.tgz", + "integrity": "sha512-TlGPkLFLVOY3T7fZrwdvKpjprR3s4fxRln0ORDo1VQ7HHyxJwTlrjKU3kpVWTlaAjIEuCTokmjkZnr8Tpc925w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-beta.53" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.27", + "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-2.4.27.tgz", + "integrity": "sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.27" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.27", + "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-2.4.27.tgz", + "integrity": "sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.27", + "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-2.4.27.tgz", + "integrity": "sha512-eWaYCcl/uAPInSK2Lze6IqVWaBu/itVqR5InXcHXFyles4zO++Mglt3oxdgj75BDcv1Knr9Y93nowS8U3wqhxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.27", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz", + "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz", + "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.2", + "@vue/babel-helper-vue-transform-on": "1.5.0", + "@vue/babel-plugin-resolve-type": "1.5.0", + "@vue/shared": "^3.5.18" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz", + "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.0", + "@vue/compiler-sfc": "^3.5.18" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.27", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.27.tgz", + "integrity": "sha512-gnSBQjZA+//qDZen+6a2EdHqJ68Z7uybrMf3SPjEGgG4dicklwDVmMC1AeIHxtLVPT7sn6sH1KOO+tS6gwOUeQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/shared": "3.5.27", + "entities": "^7.0.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.27", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.27.tgz", + "integrity": "sha512-oAFea8dZgCtVVVTEC7fv3T5CbZW9BxpFzGGxC79xakTr6ooeEqmRuvQydIiDAkglZEAd09LgVf1RoDnL54fu5w==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.27", + "@vue/shared": "3.5.27" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.27", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.27.tgz", + "integrity": "sha512-sHZu9QyDPeDmN/MRoshhggVOWE5WlGFStKFwu8G52swATgSny27hJRWteKDSUUzUH+wp+bmeNbhJnEAel/auUQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/compiler-core": "3.5.27", + "@vue/compiler-dom": "3.5.27", + "@vue/compiler-ssr": "3.5.27", + "@vue/shared": "3.5.27", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.27", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.27.tgz", + "integrity": "sha512-Sj7h+JHt512fV1cTxKlYhg7qxBvack+BGncSpH+8vnN+KN95iPIcqB5rsbblX40XorP+ilO7VIKlkuu3Xq2vjw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.27", + "@vue/shared": "3.5.27" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.9", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.9.tgz", + "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.9" + } + }, + "node_modules/@vue/devtools-core": { + "version": "8.0.5", + "resolved": "https://registry.npmmirror.com/@vue/devtools-core/-/devtools-core-8.0.5.tgz", + "integrity": "sha512-dpCw8nl0GDBuiL9SaY0mtDxoGIEmU38w+TQiYEPOLhW03VDC0lfNMYXS/qhl4I0YlysGp04NLY4UNn6xgD0VIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.0.5", + "@vue/devtools-shared": "^8.0.5", + "mitt": "^3.0.1", + "nanoid": "^5.1.5", + "pathe": "^2.0.3", + "vite-hot-client": "^2.1.0" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vue/devtools-core/node_modules/@vue/devtools-kit": { + "version": "8.0.5", + "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-8.0.5.tgz", + "integrity": "sha512-q2VV6x1U3KJMTQPUlRMyWEKVbcHuxhqJdSr6Jtjz5uAThAIrfJ6WVZdGZm5cuO63ZnSUz0RCsVwiUUb0mDV0Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.0.5", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^2.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-core/node_modules/@vue/devtools-shared": { + "version": "8.0.5", + "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-8.0.5.tgz", + "integrity": "sha512-bRLn6/spxpmgLk+iwOrR29KrYnJjG9DGpHGkDFG82UM21ZpJ39ztUT9OXX3g+usW7/b2z+h46I9ZiYyB07XMXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/devtools-core/node_modules/nanoid": { + "version": "5.1.6", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-5.1.6.tgz", + "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@vue/devtools-core/node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.9", + "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", + "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.9", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.9", + "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", + "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/language-core": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-3.2.4.tgz", + "integrity": "sha512-bqBGuSG4KZM45KKTXzGtoCl9cWju5jsaBKaJJe3h5hRAAWpZUuj5G+L+eI01sPIkm4H6setKRlw7E85wLdDNew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.27", + "@vue/compiler-dom": "^3.5.0", + "@vue/shared": "^3.5.0", + "alien-signals": "^3.0.0", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1", + "picomatch": "^4.0.2" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.27", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.27.tgz", + "integrity": "sha512-vvorxn2KXfJ0nBEnj4GYshSgsyMNFnIQah/wczXlsNXt+ijhugmW+PpJ2cNPe4V6jpnBcs0MhCODKllWG+nvoQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.27" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.27", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.27.tgz", + "integrity": "sha512-fxVuX/fzgzeMPn/CLQecWeDIFNt3gQVhxM0rW02Tvp/YmZfXQgcTXlakq7IMutuZ/+Ogbn+K0oct9J3JZfyk3A==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.27", + "@vue/shared": "3.5.27" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.27", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.27.tgz", + "integrity": "sha512-/QnLslQgYqSJ5aUmb5F0z0caZPGHRB8LEAQ1s81vHFM5CBfnun63rxhvE/scVb/j3TbBuoZwkJyiLCkBluMpeg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.27", + "@vue/runtime-core": "3.5.27", + "@vue/shared": "3.5.27", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.27", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.27.tgz", + "integrity": "sha512-qOz/5thjeP1vAFc4+BY3Nr6wxyLhpeQgAE/8dDtKo6a6xdk+L4W46HDZgNmLOBUDEkFXV3G7pRiUqxjX0/2zWA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.27", + "@vue/shared": "3.5.27" + }, + "peerDependencies": { + "vue": "3.5.27" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.27", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.27.tgz", + "integrity": "sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==", + "license": "MIT" + }, + "node_modules/@vue/tsconfig": { + "version": "0.8.1", + "resolved": "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.8.1.tgz", + "integrity": "sha512-aK7feIWPXFSUhsCP9PFqPyFOcz4ENkb8hZ2pneL6m2UjCkccvaOhC/5KCKluuBufvp2KzkbdA2W2pk20vLzu3g==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": "5.x", + "vue": "^3.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/@vueuse/core": { + "version": "9.13.0", + "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz", + "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.16", + "@vueuse/metadata": "9.13.0", + "@vueuse/shared": "9.13.0", + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/metadata": { + "version": "9.13.0", + "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz", + "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "9.13.0", + "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz", + "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "license": "MIT", + "dependencies": { + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/alien-signals": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/alien-signals/-/alien-signals-3.1.2.tgz", + "integrity": "sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/ansis/-/ansis-4.2.0.tgz", + "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.4", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.13.4.tgz", + "integrity": "sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001766", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", + "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "license": "MIT", + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.19", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/default-browser": { + "version": "5.4.0", + "resolved": "https://registry.npmmirror.com/default-browser/-/default-browser-5.4.0.tgz", + "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.283", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.283.tgz", + "integrity": "sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==", + "dev": true, + "license": "ISC" + }, + "node_modules/element-plus": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.7.0.tgz", + "integrity": "sha512-WAiaFLavuWFxof9qwkC27jvkh9nRcNnB506g1vvJSiVaVqjCBWUFCIyJKeN11M1qcv2cS5VV5PfSLjTIkrw87A==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^3.4.1", + "@element-plus/icons-vue": "^2.3.1", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.14.182", + "@types/lodash-es": "^4.17.6", + "@vueuse/core": "^9.1.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.3", + "escape-html": "^1.0.3", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "lodash-unified": "^1.0.2", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", + "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jwt-decode": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.23", + "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "license": "MIT" + }, + "node_modules/lodash-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "license": "MIT", + "peerDependencies": { + "@types/lodash-es": "*", + "lodash": "*", + "lodash-es": "*" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", + "license": "BSD-3-Clause" + }, + "node_modules/npm-normalize-package-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", + "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-run-all2": { + "version": "8.0.4", + "resolved": "https://registry.npmmirror.com/npm-run-all2/-/npm-run-all2-8.0.4.tgz", + "integrity": "sha512-wdbB5My48XKp2ZfJUlhnLVihzeuA1hgBnqB2J9ahV77wLS+/YAJAlN8I+X3DIFIPZ3m5L7nplmlbhNiFDmXRDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "cross-spawn": "^7.0.6", + "memorystream": "^0.3.1", + "picomatch": "^4.0.2", + "pidtree": "^0.6.0", + "read-package-json-fast": "^4.0.0", + "shell-quote": "^1.7.3", + "which": "^5.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "npm-run-all2": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": "^20.5.0 || >=22.0.0", + "npm": ">= 10" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmmirror.com/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pinia": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/pinia/-/pinia-3.0.4.tgz", + "integrity": "sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^7.7.7" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.5.0", + "vue": "^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/read-package-json-fast": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz", + "integrity": "sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==", + "dev": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/unplugin-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/unplugin-utils/-/unplugin-utils-0.3.1.tgz", + "integrity": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmmirror.com/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-dev-rpc": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/vite-dev-rpc/-/vite-dev-rpc-1.1.0.tgz", + "integrity": "sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==", + "dev": true, + "license": "MIT", + "dependencies": { + "birpc": "^2.4.0", + "vite-hot-client": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0" + } + }, + "node_modules/vite-hot-client": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/vite-hot-client/-/vite-hot-client-2.1.0.tgz", + "integrity": "sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0" + } + }, + "node_modules/vite-plugin-inspect": { + "version": "11.3.3", + "resolved": "https://registry.npmmirror.com/vite-plugin-inspect/-/vite-plugin-inspect-11.3.3.tgz", + "integrity": "sha512-u2eV5La99oHoYPHE6UvbwgEqKKOQGz86wMg40CCosP6q8BkB6e5xPneZfYagK4ojPJSj5anHCrnvC20DpwVdRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansis": "^4.1.0", + "debug": "^4.4.1", + "error-stack-parser-es": "^1.0.5", + "ohash": "^2.0.11", + "open": "^10.2.0", + "perfect-debounce": "^2.0.0", + "sirv": "^3.0.1", + "unplugin-utils": "^0.3.0", + "vite-dev-rpc": "^1.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/vite-plugin-inspect/node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite-plugin-vue-devtools": { + "version": "8.0.5", + "resolved": "https://registry.npmmirror.com/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-8.0.5.tgz", + "integrity": "sha512-p619BlKFOqQXJ6uDWS1vUPQzuJOD6xJTfftj57JXBGoBD/yeQCowR7pnWcr/FEX4/HVkFbreI6w2uuGBmQOh6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-core": "^8.0.5", + "@vue/devtools-kit": "^8.0.5", + "@vue/devtools-shared": "^8.0.5", + "sirv": "^3.0.2", + "vite-plugin-inspect": "^11.3.3", + "vite-plugin-vue-inspector": "^5.3.2" + }, + "engines": { + "node": ">=v14.21.3" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0-0" + } + }, + "node_modules/vite-plugin-vue-devtools/node_modules/@vue/devtools-kit": { + "version": "8.0.5", + "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-8.0.5.tgz", + "integrity": "sha512-q2VV6x1U3KJMTQPUlRMyWEKVbcHuxhqJdSr6Jtjz5uAThAIrfJ6WVZdGZm5cuO63ZnSUz0RCsVwiUUb0mDV0Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.0.5", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^2.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/vite-plugin-vue-devtools/node_modules/@vue/devtools-shared": { + "version": "8.0.5", + "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-8.0.5.tgz", + "integrity": "sha512-bRLn6/spxpmgLk+iwOrR29KrYnJjG9DGpHGkDFG82UM21ZpJ39ztUT9OXX3g+usW7/b2z+h46I9ZiYyB07XMXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/vite-plugin-vue-devtools/node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite-plugin-vue-inspector": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.3.2.tgz", + "integrity": "sha512-YvEKooQcSiBTAs0DoYLfefNja9bLgkFM7NI2b07bE2SruuvX0MEa9cMaxjKVMkeCp5Nz9FRIdcN1rOdFVBeL6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.0", + "@babel/plugin-proposal-decorators": "^7.23.0", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.22.15", + "@vue/babel-plugin-jsx": "^1.1.5", + "@vue/compiler-dom": "^3.3.4", + "kolorist": "^1.8.0", + "magic-string": "^0.30.4" + }, + "peerDependencies": { + "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0" + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.27", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.27.tgz", + "integrity": "sha512-aJ/UtoEyFySPBGarREmN4z6qNKpbEguYHMmXSiOGk69czc+zhs0NF6tEFrY8TZKAl8N/LYAkd4JHVd5E/AsSmw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.27", + "@vue/compiler-sfc": "3.5.27", + "@vue/runtime-dom": "3.5.27", + "@vue/server-renderer": "3.5.27", + "@vue/shared": "3.5.27" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.6.4", + "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.6.4.tgz", + "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/vue-tsc": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-3.2.4.tgz", + "integrity": "sha512-xj3YCvSLNDKt1iF9OcImWHhmYcihVu9p4b9s4PGR/qp6yhW+tZJaypGxHScRyOrdnHvaOeF+YkZOdKwbgGvp5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.27", + "@vue/language-core": "3.2.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/Build_God_Admin_Frontend/Frontend/package.json b/Build_God_Admin_Frontend/Frontend/package.json new file mode 100644 index 0000000..2f82a44 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/package.json @@ -0,0 +1,35 @@ +{ + "name": "build-god-admin-frontend", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "run-p type-check \"build-only {@}\" --", + "preview": "vite preview", + "build-only": "vite build", + "type-check": "vue-tsc --build" + }, + "dependencies": { + "axios": "^1.13.4", + "element-plus": "^2.7.0", + "jwt-decode": "^4.0.0", + "pinia": "^3.0.4", + "vue": "^3.5.27", + "vue-router": "^4.6.4" + }, + "devDependencies": { + "@tsconfig/node24": "^24.0.4", + "@types/node": "^24.10.9", + "@vitejs/plugin-vue": "^6.0.3", + "@vue/tsconfig": "^0.8.1", + "npm-run-all2": "^8.0.4", + "typescript": "~5.9.3", + "vite": "^7.3.1", + "vite-plugin-vue-devtools": "^8.0.5", + "vue-tsc": "^3.2.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } +} diff --git a/Build_God_Admin_Frontend/Frontend/public/favicon.ico b/Build_God_Admin_Frontend/Frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S literal 0 HcmV?d00001 diff --git a/Build_God_Admin_Frontend/Frontend/src/App.vue b/Build_God_Admin_Frontend/Frontend/src/App.vue new file mode 100644 index 0000000..23de264 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/App.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/Build_God_Admin_Frontend/Frontend/src/api/auth.ts b/Build_God_Admin_Frontend/Frontend/src/api/auth.ts new file mode 100644 index 0000000..bbe5c2e --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/api/auth.ts @@ -0,0 +1,70 @@ +import http from './index' + +// 定义登录请求/响应的类型 +export interface LoginRequest { + name: string + password: string +} + +export interface User { + id: string + name: string + email: string + role: 'admin' | 'user' +} + +export interface LoginResponse { + token: string +} + +// 定义 API 响应的通用格式 +export interface ApiResponse { + code: number + message: string + data?: T +} + +/** + * 只有admin用户能登录,账号密码存在api里得固定值 + * @param credentials - 登录凭证 { username, password } + * @returns Promise + * + * 示例请求: + * POST /api/god/account/login/admin + * { + * "name": "admin", + * "password": "123456" + * } + * + * 示例响应: + * { + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." + * } + */ +export const loginApi = (credentials: LoginRequest): Promise => { + return http.post('account/login/admin', credentials) +} + +/** + * 用户登出 + * @returns Promise + */ +export const logoutApi = (): Promise> => { + return http.post('/auth/logout', {}) +} + +/** + * 获取当前用户信息 + * @returns Promise> + */ +export const getUserInfoApi = (): Promise> => { + return http.get('/auth/userinfo') +} + +/** + * 刷新 token + * @returns Promise + */ +export const refreshTokenApi = (): Promise => { + return http.post('/auth/refresh', {}) +} diff --git a/Build_God_Admin_Frontend/Frontend/src/api/bag.ts b/Build_God_Admin_Frontend/Frontend/src/api/bag.ts new file mode 100644 index 0000000..165fc10 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/api/bag.ts @@ -0,0 +1,89 @@ +import http, { type EnumInfoDto } from './index' + +export interface Bag { + id: number + name: string + rarity: number + capacity: number + description: string | null +} + +export interface CharacterBag { + id: number + characterId: number + bagId: number + bagName: string | null + bagCapacity: number +} + +export interface BagItem { + id: number + characterBagId: number + itemType: number + itemId: number + quantity: number + itemName: string | null + itemRarity: number | null +} + +export interface AddBagItemDto { + itemType: number + itemId: number + quantity: number +} + +export interface AssignBagDto { + characterId: number + bagId: number +} + +// Bag配置管理 +export const GetAllBags = (): Promise => { + return http.get('bag/all') +} + +export const GetBagById = (id: number): Promise => { + return http.get(`bag/${id}`) +} + +export const CreateBag = (data: Bag): Promise => { + return http.post('bag', data) +} + +export const UpdateBag = (id: number, data: Bag): Promise => { + return http.put(`bag/${id}`, data) +} + +export const DeleteBag = (id: number): Promise => { + return http.delete(`bag/${id}`) +} + +// 角色背包管理 +export const GetCharacterBag = (characterId: number): Promise => { + return http.get(`bag/character/${characterId}`) +} + +export const AssignBagToCharacter = (data: AssignBagDto): Promise => { + return http.post('bag/assign', data) +} + +// 背包物品管理 +export const GetBagItems = (characterBagId: number): Promise => { + return http.get(`bag/${characterBagId}/items`) +} + +export const AddItemToBag = (characterBagId: number, data: AddBagItemDto): Promise => { + return http.post(`bag/${characterBagId}/items`, data) +} + +export const RemoveItemFromBag = (characterBagId: number, itemId: number): Promise => { + return http.delete(`bag/${characterBagId}/items/${itemId}`) +} + +export const GetBagRarities = (): Promise => { + return http.get('bag/rarities') +} + +export const GetBagItemTypes = (): Promise => { + return http.get('bag/item-types') +} diff --git a/Build_God_Admin_Frontend/Frontend/src/api/character.ts b/Build_God_Admin_Frontend/Frontend/src/api/character.ts new file mode 100644 index 0000000..9ebad78 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/api/character.ts @@ -0,0 +1,31 @@ +import http from './index' + +export interface Character { + id: number + name: string + accountId: number + currentExp: number + levelId: number + money: number + maxHP: number + currentHP: number + attack: number + breakthroughRate: number + spiritId: number | null + spiritFieldId: number | null + lastLogin: string + trainingOn: string | null + isLocked: boolean +} + +export const GetAllCharacters = (): Promise => { + return http.get('character/all') +} + +export const GetCharacterById = (id: number): Promise => { + return http.get(`character/${id}`) +} + +export const GetCharacterByAccountId = (accountId: number): Promise => { + return http.get(`character/accountId/${accountId}`) +} diff --git a/Build_God_Admin_Frontend/Frontend/src/api/equipment.ts b/Build_God_Admin_Frontend/Frontend/src/api/equipment.ts new file mode 100644 index 0000000..5c3712c --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/api/equipment.ts @@ -0,0 +1,114 @@ +import http, { type EnumInfoDto } from "../api/index"; + +export interface EquipmentTemplate { + id: number; + name: string; + description: string; + type: number; + rarity: number; + requirdLevelId: number; + setId: number | null; + money: number; + attributePool: string; + randomAttrCount: number; + maxEnhanceLevel: number; +} + +export interface EquipmentAttribute { + type: string; + value: number; +} + +export interface EquipmentInstance { + id: number; + characterBagId: number; + equipmentTemplateId: number; + name: string; + type: number; + rarity: number; + attributes: string; + enhanceLevel: number; + enhanceBonusPercent: number; + requirdLevelId: number; + setId: number | null; +} + +export interface EnhanceConfig { + id: number; + level: number; + reqItemId: number; + reqItemCount: number; + successRate: number; + bonusPercent: number; +} + +export interface EquipmentAttributePool { + type: number; + min: number; + max: number; + weight: number; +} + +//获取所有的equipment +export interface PagedResult { + items: T[]; + totalCount: number; +} + +interface SearchEquipmentDto { + pageNumber: number | undefined; + pageSize: number | undefined; + equipmentType: number | undefined; +} + +export const GetEquipmentTemplateList = ( + eqType?: number, + pageNumber?: number, + pageSize?: number, +): Promise | EquipmentTemplate[]> => { + var dto: SearchEquipmentDto = { + pageNumber: pageNumber, + pageSize: pageSize, + equipmentType: eqType, + }; + return http.post("equipment/all", dto); +}; + +//获取装备类型 +export const GetEquipmentTypes = (): Promise => { + return http.get("equipment/types"); +}; + +//获取装备稀有度 +export const GetEquipmentRarities = (): Promise => { + return http.get("equipment/rarities"); +}; + +//获取装备属性类型 +export const GetEquipmentAttributeTypes = (): Promise => { + return http.get("equipment/attribute-types"); +}; + +//添加装备模板 +export const AddEquipmentTemplate = (data: EquipmentTemplate): Promise => { + return http.post("equipment", data); +}; + +//修改装备模板 +export const UpdateEquipmentTemplate = (data: EquipmentTemplate): Promise => { + return http.put("equipment", data); +}; + +//删除装备模板 +export const DeleteEquipmentTemplate = (id: number): Promise => { + return http.delete(`equipment/${id}`); +}; + +//获取装备实例列表 +export const GetEquipmentInstanceList = ( + characterBagId?: number, + pageNumber?: number, + pageSize?: number, +): Promise | EquipmentInstance[]> => { + return http.get("equipment/instance/all", { params: { characterBagId, pageNumber, pageSize } }); +}; diff --git a/Build_God_Admin_Frontend/Frontend/src/api/index.ts b/Build_God_Admin_Frontend/Frontend/src/api/index.ts new file mode 100644 index 0000000..af74d4a --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/api/index.ts @@ -0,0 +1,62 @@ +import axios from 'axios' + +export interface EnumInfoDto{ + id: number; + name: string; + displayName: string | null; + description: string | null; +} + +// 创建 axios 实例 +const instance = axios.create({ + // 根据环境设置 API 地址 + baseURL: import.meta.env.VITE_API_URL || 'http://localhost:5091/api/god/', + timeout: 10000, + headers: { + 'Content-Type': 'application/json' + } +}) + +// 请求拦截器 - 添加 token +instance.interceptors.request.use( + (config) => { + const token = sessionStorage.getItem('auth_token') + if (token) { + config.headers.Authorization = `Bearer ${token}` + } + return config + }, + (error) => { + return Promise.reject(error) + } +) + +// 响应拦截器 - 处理错误 +instance.interceptors.response.use( + (response) => { + // 如果后端统一返回格式,这里可以解析 + return response.data + }, + (error) => { + if (error.response) { + // 服务器返回错误状态码 + const { status, data } = error.response + + if (status === 401) { + // 令牌过期,清除登录状态 + sessionStorage.removeItem('auth_token') + sessionStorage.removeItem('user') + window.location.href = '/login' + } + return Promise.reject(data || error.message) + } else if (error.request) { + // 请求已发送但没有收到响应 + return Promise.reject('网络错误,请检查连接') + } else { + // 请求配置有问题 + return Promise.reject(error.message) + } + } +) + +export default instance diff --git a/Build_God_Admin_Frontend/Frontend/src/api/level.ts b/Build_God_Admin_Frontend/Frontend/src/api/level.ts new file mode 100644 index 0000000..bac7d75 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/api/level.ts @@ -0,0 +1,32 @@ +import http from "../api/index"; + +export interface Level{ + id: number; + name: string; + levelId: number | null; + currentLevelMinExp: number | null; + nextLevelId: number | null; + baseBreakthroughRate: number; + failIncrement: number; + description: string; +} + +//获取所有的level +export const GetLevelList = (): Promise => { + return http.get("level/all"); +}; + +//添加等级 +export const AddLevel = (data: Level): Promise => { + return http.post("level", data); +} + +//修改等级 +export const UpdateLevel = (data: Level): Promise => { + return http.put("level", data); +} + +//删除等级 +export const DeleteLevel = (id: number): Promise => { + return http.delete(`level/${id}`); +} \ No newline at end of file diff --git a/Build_God_Admin_Frontend/Frontend/src/api/mission.ts b/Build_God_Admin_Frontend/Frontend/src/api/mission.ts new file mode 100644 index 0000000..1f35e33 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/api/mission.ts @@ -0,0 +1,82 @@ +import http, { type EnumInfoDto } from "../api/index"; + +export interface Mission { + id: number; + name: string; + type?: number; + title: string; + description: string; + requiredLevelId?: number; + repeatable: boolean; + isAvailable: boolean; + spendTimeMinutes?: number; + obtainPercentage?: number; + preMissionId?: number; + difficulty?: number; + rewards?: MissionReward[]; +} + +export interface MissionReward { + id: number; + missionId?: number; + rewardType?: number; + itemId?: number; + itemName: string; + count?: number; +} + +export interface PagedResult { + items: T[]; + totalCount: number; +} + +interface SearchMissionDto { + pageNumber: number | undefined; + pageSize: number | undefined; + missionType: number | undefined; +} + +export const GetMissionList = ( + type?: number, + pageNumber?: number, + pageSize?: number, +): Promise | Mission[]> => { + var dto: SearchMissionDto = { + pageNumber: pageNumber, + pageSize: pageSize, + missionType: type, + }; + return http.post("mission/all", dto); +}; + +export const GetMissionTypes = (): Promise => { + return http.get("mission/types"); +}; + +export const GetMissionDifficultys = (): Promise => { + return http.get("mission/difficulties"); +}; + +export const AddMission = (data: Mission): Promise => { + return http.post("mission", data); +}; + +export const UpdateMission = (data: Mission): Promise => { + return http.put("mission", data); +}; + +export const DeleteMission = (id: number): Promise => { + return http.delete(`mission/${id}`); +}; + +export const AddReward = (data: MissionReward): Promise => { + return http.post("mission/reward/add", data); +}; + +export const UpdateReward = (data: MissionReward): Promise => { + return http.post("mission/reward/update", data); +}; + +export const GetRewardTypes = (): Promise => { + return http.get("mission/reward/types"); +}; diff --git a/Build_God_Admin_Frontend/Frontend/src/api/missionProgress.ts b/Build_God_Admin_Frontend/Frontend/src/api/missionProgress.ts new file mode 100644 index 0000000..98552f7 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/api/missionProgress.ts @@ -0,0 +1,42 @@ +import http, { type EnumInfoDto } from './index' + +export interface MissionProgress { + id: number + missionId: number + targetType: number + targetItemId: number | null + targetItemName: string | null + targetCount: number + description: string | null +} + +export interface CharacterMissionProgress { + id: number + characterId: number + missionId: number + missionProgressId: number + currentCount: number + isCompleted: boolean + updatedOn: string +} + +// Mission Progress Config APIs +export const GetMissionProgresses = (missionId: number): Promise => { + return http.get(`mission/${missionId}/progresses`) +} + +export const CreateMissionProgress = (missionId: number, data: MissionProgress): Promise => { + return http.post(`mission/${missionId}/progresses`, data) +} + +export const UpdateMissionProgress = (id: number, data: MissionProgress): Promise => { + return http.put(`mission/progresses/${id}`, data) +} + +export const DeleteMissionProgress = (id: number): Promise => { + return http.delete(`mission/progresses/${id}`) +} + +export const GetProgressTargetTypes = (): Promise => { + return http.get('mission/progress/target-types') +} diff --git a/Build_God_Admin_Frontend/Frontend/src/api/pill.ts b/Build_God_Admin_Frontend/Frontend/src/api/pill.ts new file mode 100644 index 0000000..db1d893 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/api/pill.ts @@ -0,0 +1,49 @@ +import http, { type EnumInfoDto } from "../api/index"; + +export interface Pill { + id: number; + name: string; + grade?: number; + type?: number; + rarity?: number; + money?: number; + description: string; + requirdLevelId?: number; + effectValue?: number; + duration?: number; +} + +//获取所有 +export const GetPillList = (): Promise => { + return http.get("pill/all"); +}; + +//添加丹药 +export const AddPill = (data: Pill): Promise => { + return http.post("pill", data); +} + +//修改丹药 +export const UpdatePill = (data: Pill): Promise => { + return http.put("pill", data); +} + +//删除丹药 +export const DeletePill = (id: number): Promise => { + return http.delete(`pill/${id}`); +} + +//获取丹药等级 +export const getPillGrades = (): Promise => { + return http.get('pill/grades'); +} + +//获取丹药类型 +export const getPillTypes = (): Promise => { + return http.get('pill/types'); +} + +//获取丹药稀有度 +export const getPillRarities = (): Promise => { + return http.get('pill/rarities'); +} diff --git a/Build_God_Admin_Frontend/Frontend/src/api/spirit.ts b/Build_God_Admin_Frontend/Frontend/src/api/spirit.ts new file mode 100644 index 0000000..3229ba4 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/api/spirit.ts @@ -0,0 +1,27 @@ +import http from "../api/index"; + +export interface Profession { + id: number; + name: string; + description: string; + attackRate: number; + defendRate: number; + healthRate: number; + criticalRate: number; +} + +export const GetProfessionList = (): Promise => { + return http.get("profession/all"); +}; + +export const AddProfession = (data: Profession): Promise => { + return http.post("profession", data); +} + +export const UpdateProfession = (data: Profession): Promise => { + return http.put("profession", data); +} + +export const DeleteProfession = (id: number): Promise => { + return http.delete(`profession/${id}`); +} diff --git a/Build_God_Admin_Frontend/Frontend/src/api/statistics.ts b/Build_God_Admin_Frontend/Frontend/src/api/statistics.ts new file mode 100644 index 0000000..3a0cf2d --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/api/statistics.ts @@ -0,0 +1,16 @@ +import http from './index' + +export interface StatisticsSummary { + equipmentCount: number + levelCount: number + professionCount: number + pillCount: number + missionCount: number + equipmentByRarity: Record + missionByDifficulty: Record + pillByGrade: Record +} + +export const GetStatisticsSummary = (): Promise => { + return http.get('statistics/summary') +} diff --git a/Build_God_Admin_Frontend/Frontend/src/assets/base.css b/Build_God_Admin_Frontend/Frontend/src/assets/base.css new file mode 100644 index 0000000..8816868 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/assets/base.css @@ -0,0 +1,86 @@ +/* color palette from */ +:root { + --vt-c-white: #ffffff; + --vt-c-white-soft: #f8f8f8; + --vt-c-white-mute: #f2f2f2; + + --vt-c-black: #181818; + --vt-c-black-soft: #222222; + --vt-c-black-mute: #282828; + + --vt-c-indigo: #2c3e50; + + --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); + --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); + --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); + --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); + + --vt-c-text-light-1: var(--vt-c-indigo); + --vt-c-text-light-2: rgba(60, 60, 60, 0.66); + --vt-c-text-dark-1: var(--vt-c-white); + --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); +} + +/* semantic color variables for this project */ +:root { + --color-background: var(--vt-c-white); + --color-background-soft: var(--vt-c-white-soft); + --color-background-mute: var(--vt-c-white-mute); + + --color-border: var(--vt-c-divider-light-2); + --color-border-hover: var(--vt-c-divider-light-1); + + --color-heading: var(--vt-c-text-light-1); + --color-text: var(--vt-c-text-light-1); + + --section-gap: 160px; +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--vt-c-black); + --color-background-soft: var(--vt-c-black-soft); + --color-background-mute: var(--vt-c-black-mute); + + --color-border: var(--vt-c-divider-dark-2); + --color-border-hover: var(--vt-c-divider-dark-1); + + --color-heading: var(--vt-c-text-dark-1); + --color-text: var(--vt-c-text-dark-2); + } +} + +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + font-weight: normal; +} + +body { + min-height: 100vh; + color: var(--color-text); + background: var(--color-background); + transition: + color 0.5s, + background-color 0.5s; + line-height: 1.6; + font-family: + Inter, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + Roboto, + Oxygen, + Ubuntu, + Cantarell, + 'Fira Sans', + 'Droid Sans', + 'Helvetica Neue', + sans-serif; + font-size: 15px; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/Build_God_Admin_Frontend/Frontend/src/assets/logo.svg b/Build_God_Admin_Frontend/Frontend/src/assets/logo.svg new file mode 100644 index 0000000..7565660 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/Build_God_Admin_Frontend/Frontend/src/assets/main.css b/Build_God_Admin_Frontend/Frontend/src/assets/main.css new file mode 100644 index 0000000..3876722 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/assets/main.css @@ -0,0 +1,28 @@ +@import './base.css'; + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html, +body { + background-color: #0a0e27; + color: #e5e7eb; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; +} + +html { + height: 100%; +} + +body { + min-height: 100%; +} + +#app { + width: 100%; + height: 100%; + background-color: #0a0e27; +} diff --git a/Build_God_Admin_Frontend/Frontend/src/components/Header.vue b/Build_God_Admin_Frontend/Frontend/src/components/Header.vue new file mode 100644 index 0000000..66f0354 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/components/Header.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/Build_God_Admin_Frontend/Frontend/src/components/HelloWorld.vue b/Build_God_Admin_Frontend/Frontend/src/components/HelloWorld.vue new file mode 100644 index 0000000..d174cf8 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/components/HelloWorld.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/Build_God_Admin_Frontend/Frontend/src/components/Sidebar.vue b/Build_God_Admin_Frontend/Frontend/src/components/Sidebar.vue new file mode 100644 index 0000000..1696171 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/components/Sidebar.vue @@ -0,0 +1,192 @@ + + + + + diff --git a/Build_God_Admin_Frontend/Frontend/src/components/TheWelcome.vue b/Build_God_Admin_Frontend/Frontend/src/components/TheWelcome.vue new file mode 100644 index 0000000..8b731d9 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/components/TheWelcome.vue @@ -0,0 +1,95 @@ + + + diff --git a/Build_God_Admin_Frontend/Frontend/src/components/WelcomeItem.vue b/Build_God_Admin_Frontend/Frontend/src/components/WelcomeItem.vue new file mode 100644 index 0000000..6d7086a --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/components/WelcomeItem.vue @@ -0,0 +1,87 @@ + + + diff --git a/Build_God_Admin_Frontend/Frontend/src/components/icons/IconCommunity.vue b/Build_God_Admin_Frontend/Frontend/src/components/icons/IconCommunity.vue new file mode 100644 index 0000000..2dc8b05 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/components/icons/IconCommunity.vue @@ -0,0 +1,7 @@ + diff --git a/Build_God_Admin_Frontend/Frontend/src/components/icons/IconDocumentation.vue b/Build_God_Admin_Frontend/Frontend/src/components/icons/IconDocumentation.vue new file mode 100644 index 0000000..6d4791c --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/components/icons/IconDocumentation.vue @@ -0,0 +1,7 @@ + diff --git a/Build_God_Admin_Frontend/Frontend/src/components/icons/IconEcosystem.vue b/Build_God_Admin_Frontend/Frontend/src/components/icons/IconEcosystem.vue new file mode 100644 index 0000000..c3a4f07 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/components/icons/IconEcosystem.vue @@ -0,0 +1,7 @@ + diff --git a/Build_God_Admin_Frontend/Frontend/src/components/icons/IconSupport.vue b/Build_God_Admin_Frontend/Frontend/src/components/icons/IconSupport.vue new file mode 100644 index 0000000..7452834 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/components/icons/IconSupport.vue @@ -0,0 +1,7 @@ + diff --git a/Build_God_Admin_Frontend/Frontend/src/components/icons/IconTooling.vue b/Build_God_Admin_Frontend/Frontend/src/components/icons/IconTooling.vue new file mode 100644 index 0000000..660598d --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/components/icons/IconTooling.vue @@ -0,0 +1,19 @@ + + diff --git a/Build_God_Admin_Frontend/Frontend/src/constants/theme.ts b/Build_God_Admin_Frontend/Frontend/src/constants/theme.ts new file mode 100644 index 0000000..0b05ee0 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/constants/theme.ts @@ -0,0 +1,41 @@ +export const ICONS = { + dashboard: '📊', + equipment: '⚔️', + level: '📈', + spirit: '✨', + pill: '💊', + bag:'🎒', + mission: '📜', + + reward: { + pill: '💊', + equipment: '⚔️', + experience: '⭐', + money: '💰', + bag:'👜', + default: '🎁' + } +} + +export const COLORS = { + equipment: '#a855f7', + level: '#f59e0b', + spirit: '#06b6d4', + pill: '#22c55e', + mission: '#3b82f6', + dashboard: '#8b5cf6', + + rarity: { + common: '#9ca3af', + rare: '#22c55e', + epic: '#3b82f6', + legendary: '#f59e0b' + }, + + difficulty: { + easy: '#22c55e', + normal: '#f59e0b', + hard: '#ef4444', + purgatory: '#dc2626' + } +} diff --git a/Build_God_Admin_Frontend/Frontend/src/main.ts b/Build_God_Admin_Frontend/Frontend/src/main.ts new file mode 100644 index 0000000..0e882bb --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/main.ts @@ -0,0 +1,27 @@ +import './assets/main.css' + +import { createApp } from 'vue' +import { createPinia } from 'pinia' +import ElementPlus from 'element-plus' +// Element Plus default styles +import 'element-plus/dist/index.css' +// Element Plus dark css variables (provides dark theme variables) +import 'element-plus/theme-chalk/dark/css-vars.css' + +import App from './App.vue' +import router from './router' +import { useAuthStore } from './stores/auth' + +const app = createApp(App) + +const pinia = createPinia() +app.use(pinia) + +// 初始化认证状态(在 router 安装之前) +const authStore = useAuthStore() +authStore.initAuth() + +app.use(router) +app.use(ElementPlus) + +app.mount('#app') diff --git a/Build_God_Admin_Frontend/Frontend/src/router/index.ts b/Build_God_Admin_Frontend/Frontend/src/router/index.ts new file mode 100644 index 0000000..f96b19a --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/router/index.ts @@ -0,0 +1,104 @@ +import { createRouter, createWebHistory, type RouteRecordRaw } from 'vue-router' +import { useAuthStore } from '../stores/auth' +import LoginView from '../views/LoginView.vue' +import AdminLayout from '../views/AdminLayout.vue' + +const routes: RouteRecordRaw[] = [ + { + path: '/login', + name: 'login', + component: LoginView, + meta: { requiresAuth: false } + }, + { + path: '/admin', + component: AdminLayout, + meta: { requiresAuth: true }, + children: [ + { + path: 'dashboard', + name: 'dashboard', + component: () => import('../views/admin/DashboardView.vue'), + meta: { title: '仪表板' } + }, + { + path: 'users', + name: 'users', + component: () => import('../views/admin/UsersView.vue'), + meta: { title: '用户管理' } + }, + { + path: 'equipments', + name: 'equipments', + component: () => import('../views/admin/EquipmentsView.vue'), + meta: { title: '装备管理' } + }, + { + path: 'levels', + name: 'levels', + component: () => import('../views/admin/LevelsView.vue'), + meta: { title: '境界管理' } + }, + { + path: 'professions', + name: 'professions', + component: () => import('../views/admin/SpiritsView.vue'), + meta: { title: '职业管理' } + }, + { + path: 'pills', + name: 'pills', + component: () => import('../views/admin/PillsView.vue'), + meta: { title: '丹药管理' } + }, + { + path: 'missions', + name: 'missions', + component: () => import('../views/admin/MissionView.vue'), + meta: { title: '任务管理' } + }, + { + path: 'bags', + name: 'bags', + component: () => import('../views/admin/BagsView.vue'), + meta: { title: '背包管理' } + }, + { + path: 'settings', + name: 'settings', + component: () => import('../views/admin/SettingsView.vue'), + meta: { title: '系统设置' } + } + ] + }, + { + path: '/', + redirect: '/admin/dashboard' + }, + { + path: '/:pathMatch(.*)*', + redirect: '/admin/dashboard' + } +] + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes +}) + +// 导航守卫 +router.beforeEach((to, from, next) => { + const authStore = useAuthStore() + const isAuthenticated = authStore.isAuthenticated + const requiresAuth = to.meta.requiresAuth !== false + + if (requiresAuth && !isAuthenticated) { + next('/login') + } else if (to.path === '/login' && isAuthenticated) { + next('/admin/dashboard') + } else { + next() + } +}) + +export default router diff --git a/Build_God_Admin_Frontend/Frontend/src/stores/auth.ts b/Build_God_Admin_Frontend/Frontend/src/stores/auth.ts new file mode 100644 index 0000000..b9bb995 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/stores/auth.ts @@ -0,0 +1,73 @@ +import { defineStore } from "pinia"; +import { ref, computed } from "vue"; +import { loginApi, logoutApi } from "@/api/auth"; +import type { User } from "@/api/auth"; +import { jwtDecode } from "jwt-decode"; +import router from "@/router"; + +export const useAuthStore = defineStore("auth", () => { + const user = ref(null); + const token = ref(""); + const isAuthenticated = computed(() => !!token.value); + + /** + * 登录 - 调用后台 API + * @param username 用户名 + * @param password 密码 + * @returns 登录是否成功 + */ + const login = async (name: string, password: string): Promise => { + try { + const response = await loginApi({ name, password }); + if (response.token) { + token.value = response.token; + sessionStorage.setItem("auth_token", token.value); + const userInfo = jwtDecode(response.token); + console.log(userInfo); + user.value = userInfo + return true; + } else { + return false; + } + } catch (error) { + console.error("登录失败:", error); + return false; + } + }; + + /** + * 登出 + */ + const logout = async () => { + try { + //await logoutApi(); + router.push('/login') + } catch (error) { + console.error("登出失败:", error); + } finally { + token.value = ""; + user.value = null; + sessionStorage.removeItem("auth_token"); + sessionStorage.removeItem("auth_token"); + } + }; + + /** + * 初始化认证状态(从 sessionStorage 恢复) + */ + const initAuth = () => { + const savedToken = sessionStorage.getItem("auth_token"); + if (savedToken) { + token.value = savedToken; + } + }; + + return { + user, + token, + isAuthenticated, + login, + logout, + initAuth + }; +}); diff --git a/Build_God_Admin_Frontend/Frontend/src/stores/counter.ts b/Build_God_Admin_Frontend/Frontend/src/stores/counter.ts new file mode 100644 index 0000000..b6757ba --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/stores/counter.ts @@ -0,0 +1,12 @@ +import { ref, computed } from 'vue' +import { defineStore } from 'pinia' + +export const useCounterStore = defineStore('counter', () => { + const count = ref(0) + const doubleCount = computed(() => count.value * 2) + function increment() { + count.value++ + } + + return { count, doubleCount, increment } +}) diff --git a/Build_God_Admin_Frontend/Frontend/src/views/AboutView.vue b/Build_God_Admin_Frontend/Frontend/src/views/AboutView.vue new file mode 100644 index 0000000..756ad2a --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/views/AboutView.vue @@ -0,0 +1,15 @@ + + + diff --git a/Build_God_Admin_Frontend/Frontend/src/views/AdminLayout.vue b/Build_God_Admin_Frontend/Frontend/src/views/AdminLayout.vue new file mode 100644 index 0000000..19835a0 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/views/AdminLayout.vue @@ -0,0 +1,79 @@ + + + + + diff --git a/Build_God_Admin_Frontend/Frontend/src/views/HomeView.vue b/Build_God_Admin_Frontend/Frontend/src/views/HomeView.vue new file mode 100644 index 0000000..d5c0217 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/views/HomeView.vue @@ -0,0 +1,9 @@ + + + diff --git a/Build_God_Admin_Frontend/Frontend/src/views/LoginView.vue b/Build_God_Admin_Frontend/Frontend/src/views/LoginView.vue new file mode 100644 index 0000000..7afa743 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/views/LoginView.vue @@ -0,0 +1,166 @@ + + + + + diff --git a/Build_God_Admin_Frontend/Frontend/src/views/admin/BagsView.vue b/Build_God_Admin_Frontend/Frontend/src/views/admin/BagsView.vue new file mode 100644 index 0000000..f1d188f --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/views/admin/BagsView.vue @@ -0,0 +1,365 @@ + + + + + diff --git a/Build_God_Admin_Frontend/Frontend/src/views/admin/DashboardView.vue b/Build_God_Admin_Frontend/Frontend/src/views/admin/DashboardView.vue new file mode 100644 index 0000000..0c982be --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/views/admin/DashboardView.vue @@ -0,0 +1,460 @@ + + + + + diff --git a/Build_God_Admin_Frontend/Frontend/src/views/admin/EquipmentsView.vue b/Build_God_Admin_Frontend/Frontend/src/views/admin/EquipmentsView.vue new file mode 100644 index 0000000..a82b17a --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/views/admin/EquipmentsView.vue @@ -0,0 +1,640 @@ + + + + + diff --git a/Build_God_Admin_Frontend/Frontend/src/views/admin/LevelsView.vue b/Build_God_Admin_Frontend/Frontend/src/views/admin/LevelsView.vue new file mode 100644 index 0000000..2d2468b --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/views/admin/LevelsView.vue @@ -0,0 +1,433 @@ + + + + + diff --git a/Build_God_Admin_Frontend/Frontend/src/views/admin/MissionView.vue b/Build_God_Admin_Frontend/Frontend/src/views/admin/MissionView.vue new file mode 100644 index 0000000..f5e95e4 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/views/admin/MissionView.vue @@ -0,0 +1,1042 @@ + + + + + diff --git a/Build_God_Admin_Frontend/Frontend/src/views/admin/PillsView.vue b/Build_God_Admin_Frontend/Frontend/src/views/admin/PillsView.vue new file mode 100644 index 0000000..6a14f7b --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/views/admin/PillsView.vue @@ -0,0 +1,542 @@ + + + + + diff --git a/Build_God_Admin_Frontend/Frontend/src/views/admin/SettingsView.vue b/Build_God_Admin_Frontend/Frontend/src/views/admin/SettingsView.vue new file mode 100644 index 0000000..73d49e4 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/views/admin/SettingsView.vue @@ -0,0 +1,296 @@ + + + + + diff --git a/Build_God_Admin_Frontend/Frontend/src/views/admin/SpiritsView.vue b/Build_God_Admin_Frontend/Frontend/src/views/admin/SpiritsView.vue new file mode 100644 index 0000000..0641818 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/views/admin/SpiritsView.vue @@ -0,0 +1,375 @@ + + + + + \ No newline at end of file diff --git a/Build_God_Admin_Frontend/Frontend/src/views/admin/UsersView.vue b/Build_God_Admin_Frontend/Frontend/src/views/admin/UsersView.vue new file mode 100644 index 0000000..e3093bb --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/src/views/admin/UsersView.vue @@ -0,0 +1,426 @@ + + + + + diff --git a/Build_God_Admin_Frontend/Frontend/tsconfig.app.json b/Build_God_Admin_Frontend/Frontend/tsconfig.app.json new file mode 100644 index 0000000..913b8f2 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/tsconfig.app.json @@ -0,0 +1,12 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], + "exclude": ["src/**/__tests__/*"], + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/Build_God_Admin_Frontend/Frontend/tsconfig.json b/Build_God_Admin_Frontend/Frontend/tsconfig.json new file mode 100644 index 0000000..66b5e57 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.node.json" + }, + { + "path": "./tsconfig.app.json" + } + ] +} diff --git a/Build_God_Admin_Frontend/Frontend/tsconfig.node.json b/Build_God_Admin_Frontend/Frontend/tsconfig.node.json new file mode 100644 index 0000000..822562d --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/tsconfig.node.json @@ -0,0 +1,19 @@ +{ + "extends": "@tsconfig/node24/tsconfig.json", + "include": [ + "vite.config.*", + "vitest.config.*", + "cypress.config.*", + "nightwatch.conf.*", + "playwright.config.*", + "eslint.config.*" + ], + "compilerOptions": { + "noEmit": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + + "module": "ESNext", + "moduleResolution": "Bundler", + "types": ["node"] + } +} diff --git a/Build_God_Admin_Frontend/Frontend/vite.config.ts b/Build_God_Admin_Frontend/Frontend/vite.config.ts new file mode 100644 index 0000000..4217010 --- /dev/null +++ b/Build_God_Admin_Frontend/Frontend/vite.config.ts @@ -0,0 +1,18 @@ +import { fileURLToPath, URL } from 'node:url' + +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import vueDevTools from 'vite-plugin-vue-devtools' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + vueDevTools(), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + }, + }, +}) diff --git a/Build_God_Api/.dockerignore b/Build_God_Api/.dockerignore new file mode 100644 index 0000000..fe1152b --- /dev/null +++ b/Build_God_Api/.dockerignore @@ -0,0 +1,30 @@ +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/azds.yaml +**/bin +**/charts +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md +!**/.gitignore +!.git/HEAD +!.git/config +!.git/packed-refs +!.git/refs/heads/** \ No newline at end of file diff --git a/Build_God_Api/.gitignore b/Build_God_Api/.gitignore new file mode 100644 index 0000000..7220077 --- /dev/null +++ b/Build_God_Api/.gitignore @@ -0,0 +1,52 @@ +# ===================== 核心:编译/构建产物 ===================== +bin/ +obj/ +*.dll +*.pdb +publish/ +*.exe +*.manifest +*.resources +*.cache + +# ===================== IDE/编辑器配置 ===================== +# Visual Studio +.vs/ +*.suo +*.user +*.sln.docstates +*.vcxproj.user +*.vcxproj.filters + +# Rider +.idea/ +*.iml +*.sln.iml + +# VS Code +.vscode/ + +# ===================== 运行时/依赖缓存 ===================== +project.assets.json +packages/ +.nuget/ +*.nuspec +dotnet-*.json + +# ===================== 环境配置/敏感信息 ===================== +appsettings.Development.json +appsettings.Staging.json +appsettings.Production.json +launchSettings.json +.user-secrets/ + +# ===================== 临时文件/日志 ===================== +*.tmp +*.temp +*.bak +*.swp +~* +*.log +logs/ +temp/ +tmp/ \ No newline at end of file diff --git a/Build_God_Api/Build_God_Api.sln b/Build_God_Api/Build_God_Api.sln new file mode 100644 index 0000000..53dc6b1 --- /dev/null +++ b/Build_God_Api/Build_God_Api.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36811.4 d17.14 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Build_God_Api", "Build_God_Api\Build_God_Api.csproj", "{A69A7FB4-26C9-4BAC-8A1C-4912FD062DF4}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A69A7FB4-26C9-4BAC-8A1C-4912FD062DF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A69A7FB4-26C9-4BAC-8A1C-4912FD062DF4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A69A7FB4-26C9-4BAC-8A1C-4912FD062DF4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A69A7FB4-26C9-4BAC-8A1C-4912FD062DF4}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C243A1B1-A5E8-40A6-B46C-35138EAC6C53} + EndGlobalSection +EndGlobal diff --git a/Build_God_Api/Build_God_Api/Build_God_Api.csproj b/Build_God_Api/Build_God_Api/Build_God_Api.csproj new file mode 100644 index 0000000..5f01627 --- /dev/null +++ b/Build_God_Api/Build_God_Api/Build_God_Api.csproj @@ -0,0 +1,25 @@ + + + + net8.0 + enable + enable + 34d14f51-4f4c-4f8e-81d7-17b45add3813 + Linux + + + + + + + + + + + + + + + + + diff --git a/Build_God_Api/Build_God_Api/Build_God_Api.http b/Build_God_Api/Build_God_Api/Build_God_Api.http new file mode 100644 index 0000000..8f7db19 --- /dev/null +++ b/Build_God_Api/Build_God_Api/Build_God_Api.http @@ -0,0 +1,6 @@ +@Build_God_Api_HostAddress = http://localhost:5091 + +GET {{Build_God_Api_HostAddress}}/weatherforecast/ +Accept: application/json + +### diff --git a/Build_God_Api/Build_God_Api/Common/EnumHelper.cs b/Build_God_Api/Build_God_Api/Common/EnumHelper.cs new file mode 100644 index 0000000..b08b11d --- /dev/null +++ b/Build_God_Api/Build_God_Api/Common/EnumHelper.cs @@ -0,0 +1,41 @@ +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.Reflection; + +namespace Build_God_Api.Common +{ + + public class EnumHelper + { + public static List GetEnumList() where T : Enum + { + var result = new List(); + + foreach (var value in Enum.GetValues(typeof(T)).Cast()) + { + var fieldInfo = typeof(T).GetField(value.ToString()); + var description = fieldInfo?.GetCustomAttribute()?.Description; + var displayName = fieldInfo?.GetCustomAttribute()?.Name; + + result.Add(new EnumInfoDto + { + Id = Convert.ToInt32(value), + Name = value.ToString(), + DisplayName = displayName ?? value.ToString(), + Description = description ?? value.ToString() + }); + } + + return result; + } + } + + // 枚举信息DTO + public class EnumInfoDto + { + public int Id { get; set; } + public string? Name { get; set; } + public string? DisplayName { get; set; } + public string? Description { get; set; } + } +} diff --git a/Build_God_Api/Build_God_Api/Controllers/AccountController.cs b/Build_God_Api/Build_God_Api/Controllers/AccountController.cs new file mode 100644 index 0000000..f0a03f4 --- /dev/null +++ b/Build_God_Api/Build_God_Api/Controllers/AccountController.cs @@ -0,0 +1,94 @@ +using Build_God_Api.DB; +using Build_God_Api.Services; +using Microsoft.AspNetCore.Mvc; +using System.ComponentModel.DataAnnotations; + +namespace Build_God_Api.Controllers +{ + /// + /// 本地测试账号 Tom 123456 email:976802198@qq.com + /// + /// + [ApiController] + [Route("api/god/[controller]")] + public class AccountController(IAccountService service) : ControllerBase + { + private readonly IAccountService _service = service; + + [HttpPost("register")] + public async Task> Register(AccountPostCmd cmd) + { + var exist = await _service.ExistsAccount(cmd.Name, cmd.Email); + if (exist) return BadRequest("账号已经存在"); + + cmd.Password = _service.CalculateHash(cmd.Name, cmd.Password); + var account = new Account + { + Name = cmd.Name, + Email = cmd.Email, + Password = cmd.Password, + Active = true, + IsAdmin = false + }; + + var bo = await _service.Register(account); + if (!bo) + { + return BadRequest("注册账号失败"); + } + + return Ok(account.Id); + } + + [HttpPost("login")] + public async Task> Login(LoginCmd cmd) + { + var account = await _service.GetAccountByName(cmd.Name); + if (account == null) return BadRequest("账号或者密码错误"); + if (account.Password != _service.CalculateHash(cmd.Name, cmd.Password)) + return BadRequest("账号或者密码错误"); + var token = _service.GenerateToken(account.Id, account.Name, false); + return new LoginResult { Token = token }; + } + + [HttpPost("login/admin")] + public ActionResult AdminLogin(LoginCmd cmd) + { + if (cmd.Name != "admin" && cmd.Password != "love_god.123") + { + return BadRequest("只有管理员账号才能使用此接口登录"); + } + var token = _service.GenerateToken(0, "admin", true); + return new LoginResult { Token = token }; + } + } + + public class AccountPostCmd + { + [StringLength(30, MinimumLength = 3)] + [RegularExpression(@"^[a-zA-Z0-9_]+$")] + public string Name { get; set; } = string.Empty; + + [EmailAddress] + [StringLength(50)] + public string Email { get; set; } = string.Empty; + + [StringLength(30, MinimumLength = 4)] + public string Password { get; set; } = string.Empty; + } + + public class LoginCmd + { + [StringLength(30, MinimumLength = 3)] + [RegularExpression(@"^[a-zA-Z0-9_]+$")] + public string Name { get; set; } = string.Empty; + + [StringLength(30, MinimumLength = 4)] + public string Password { get; set; } = string.Empty; + } + + public class LoginResult + { + public string Token { get; set; } = string.Empty; + } +} diff --git a/Build_God_Api/Build_God_Api/Controllers/BagController.cs b/Build_God_Api/Build_God_Api/Controllers/BagController.cs new file mode 100644 index 0000000..5b6754e --- /dev/null +++ b/Build_God_Api/Build_God_Api/Controllers/BagController.cs @@ -0,0 +1,121 @@ +using Build_God_Api.Common; +using Build_God_Api.DB; +using Build_God_Api.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Build_God_Api.Controllers +{ + [ApiController] + [Route("api/god/[controller]")] + public class BagController(IBagService service) : ControllerBase + { + private readonly IBagService service = service; + + // ============ Bag配置管理 ============ + + [HttpGet("all")] + [Authorize] + public async Task>> GetAllBags() + { + return await service.GetAllBags(); + } + + [HttpGet("{id}")] + [Authorize] + public async Task> GetBagById(int id) + { + return await service.GetBagById(id); + } + + [HttpPost] + [Authorize(Roles = "admin")] + public async Task> CreateBag([FromBody] Bag bag) + { + return await service.CreateBag(bag); + } + + [HttpPut("{id}")] + [Authorize(Roles = "admin")] + public async Task> UpdateBag(int id, [FromBody] Bag bag) + { + bag.Id = id; + return await service.UpdateBag(bag); + } + + [HttpDelete("{id}")] + [Authorize(Roles = "admin")] + public async Task> DeleteBag(int id) + { + return await service.DeleteBag(id); + } + + // ============ 角色背包管理 ============ + + [HttpGet("character/{characterId}")] + [Authorize] + public async Task> GetCharacterBag(int characterId) + { + return await service.GetCharacterBag(characterId); + } + + [HttpPost("assign")] + [Authorize(Roles = "admin")] + public async Task> AssignBagToCharacter([FromBody] AssignBagDto dto) + { + return await service.AssignBagToCharacter(dto.CharacterId, dto.BagId); + } + + // ============ 背包物品管理 ============ + + [HttpGet("{characterBagId}/items")] + [Authorize] + public async Task>> GetBagItems(int characterBagId) + { + return await service.GetBagItems(characterBagId); + } + + [HttpPost("{characterBagId}/items")] + [Authorize(Roles = "admin")] + public async Task> AddItemToBag(int characterBagId, [FromBody] AddBagItemDto dto) + { + return await service.AddItemToBag(characterBagId, dto.ItemType, dto.ItemId, dto.Quantity); + } + + [HttpDelete("{characterBagId}/items/{itemId}")] + [Authorize(Roles = "admin")] + public async Task> RemoveItemFromBag(int characterBagId, int itemId) + { + return await service.RemoveItemFromBag(characterBagId, itemId); + } + + // ============ 枚举 ============ + + [HttpGet("rarities")] + [Authorize] + public ActionResult> GetBagRarities() + { + return EnumHelper.GetEnumList(); + } + + [HttpGet("item-types")] + [Authorize] + public ActionResult> GetBagItemTypes() + { + return EnumHelper.GetEnumList(); + } + } + + public class AssignBagDto + { + public int CharacterId { get; set; } + public int BagId { get; set; } + } + + public class AddBagItemDto + { + public int ItemType { get; set; } + public int ItemId { get; set; } + public int Quantity { get; set; } + } +} diff --git a/Build_God_Api/Build_God_Api/Controllers/CharacterController.cs b/Build_God_Api/Build_God_Api/Controllers/CharacterController.cs new file mode 100644 index 0000000..280f217 --- /dev/null +++ b/Build_God_Api/Build_God_Api/Controllers/CharacterController.cs @@ -0,0 +1,100 @@ +using Build_God_Api.DB; +using Build_God_Api.Dto; +using Build_God_Api.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Build_God_Api.Controllers +{ + [ApiController] + [Route("api/god/[controller]")] + public class CharacterController(ICharacterService characterService, ICurrentUserService currentUserService) : ControllerBase + { + private readonly ICharacterService characterService = characterService; + private readonly ICurrentUserService currentUserService = currentUserService; + + /// + /// 获取当前账号的角色列表(包含境界和灵根信息) + /// + [HttpGet("list")] + [Authorize] + public async Task>> GetCharacterList() + { + var result = await characterService.GetCharacterListWithDetails(currentUserService.UserId); + return result; + } + + [HttpGet("accountId/{accountId}")] + [Authorize] + public async Task> GetCharacterByAccountId(int accountId) + { + var result = await characterService.GetCharacterByAccountId(accountId); + return result; + } + + [HttpGet("all")] + [Authorize(Roles = "admin")] + public async Task>> GetAllCharacters() + { + return await characterService.GetAllCharacters(); + } + + [HttpGet("{characterId}")] + [Authorize(Roles = "admin")] + public async Task> GetCharacterById(int characterId) + { + return await characterService.GetCharacterById(characterId); + } + + [HttpPost("register")] + [Authorize] + public async Task> RegisterCharacter([FromBody] CharacterRegisterDto dto) + { + return await characterService.RegisterCharacter(dto); + } + + /// + /// 选择角色(更新最后登录时间) + /// + [HttpPost("select/{characterId}")] + [Authorize] + public async Task> SelectCharacter(int characterId) + { + return await characterService.SelectCharacter(characterId); + } + + [HttpDelete("{characterId}")] + [Authorize] + public async Task> DeleteCharacter(int characterId) + { + return await characterService.DeleteCharacter(characterId); + } + + [HttpPost("{characterId}/breakthrough")] + [Authorize] + public async Task> Breakthrough(int characterId) + { + return await characterService.Breakthrough(characterId); + } + + /// + /// 开始打坐 + /// + [HttpPost("{characterId}/training/start")] + [Authorize] + public async Task> StartTraining(int characterId) + { + return await characterService.StartTraining(characterId); + } + + /// + /// 停止打坐并结算经验 + /// + [HttpPost("{characterId}/training/stop")] + [Authorize] + public async Task> StopTraining(int characterId) + { + return await characterService.StopTraining(characterId); + } + } +} diff --git a/Build_God_Api/Build_God_Api/Controllers/EquipmentController.cs b/Build_God_Api/Build_God_Api/Controllers/EquipmentController.cs new file mode 100644 index 0000000..aa0e276 --- /dev/null +++ b/Build_God_Api/Build_God_Api/Controllers/EquipmentController.cs @@ -0,0 +1,75 @@ +using Build_God_Api.Common; +using Build_God_Api.DB; +using Build_God_Api.Dto; +using Build_God_Api.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Build_God_Api.Controllers +{ + [ApiController] + [Route("api/god/[controller]")] + public class EquipmentController(IEquipmentService service) : ControllerBase + { + private readonly IEquipmentService service = service; + + [HttpPost] + [Authorize(Roles = "admin")] + public async Task> Add([FromBody] EquipmentTemplate item) + { + return await service.Add(item); + } + + [HttpPost("list")] + [Authorize(Roles = "admin")] + public async Task> Add([FromBody] List items) + { + return await service.Add(items); + } + + [HttpDelete("{id}")] + [Authorize(Roles = "admin")] + public async Task> Delete(int id) + { + return await service.Delete(id); + } + + [HttpPut] + [Authorize(Roles = "admin")] + public async Task> Update([FromBody] EquipmentTemplate item) + { + return await service.Update(item); + } + + [HttpPost("all")] + [Authorize] + public async Task>> GetAll([FromBody] SearchEquipmentDto dto) + { + return await service.GetAll(dto); + } + + [HttpGet("types")] + [Authorize] + public ActionResult> GetEquipmentTypes() + { + var result = EnumHelper.GetEnumList(); + return result; + } + + [HttpGet("rarities")] + [Authorize] + public ActionResult> GetEquipmentRarity() + { + var result = EnumHelper.GetEnumList(); + return result; + } + + [HttpGet("attribute-types")] + [Authorize] + public ActionResult> GetEquipmentAttributeTypes() + { + var result = EnumHelper.GetEnumList(); + return result; + } + } +} diff --git a/Build_God_Api/Build_God_Api/Controllers/Game/TrainingController.cs b/Build_God_Api/Build_God_Api/Controllers/Game/TrainingController.cs new file mode 100644 index 0000000..4228b96 --- /dev/null +++ b/Build_God_Api/Build_God_Api/Controllers/Game/TrainingController.cs @@ -0,0 +1,24 @@ +using Build_God_Api.Services.Game; +using Microsoft.AspNetCore.Mvc; + +namespace Build_God_Api.Controllers.Game +{ + [ApiController] + [Route("api/god/[controller]")] + public class TrainingController(ITrainingService trainingService) : ControllerBase + { + private readonly ITrainingService trainingService = trainingService; + + [HttpPost("start/{characterId}")] + public async Task> StartTraining(int characterId) + { + return await trainingService.StartTraining(characterId); + } + + [HttpPost("end/{characterId}")] + public async Task> EndTraining(int characterId) + { + return await trainingService.EndTraining(characterId); + } + } +} diff --git a/Build_God_Api/Build_God_Api/Controllers/LevelController.cs b/Build_God_Api/Build_God_Api/Controllers/LevelController.cs new file mode 100644 index 0000000..a4b938f --- /dev/null +++ b/Build_God_Api/Build_God_Api/Controllers/LevelController.cs @@ -0,0 +1,42 @@ +using Build_God_Api.DB; +using Build_God_Api.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Build_God_Api.Controllers +{ + [ApiController] + [Route("api/god/[controller]")] + public class LevelController(ILevelService service) : ControllerBase + { + private readonly ILevelService service = service; + + [HttpPost] + [Authorize(Roles = "admin")] + public async Task> Add([FromBody] Level item) + { + return await service.Add(item); + } + + [HttpDelete("{id}")] + [Authorize(Roles = "admin")] + public async Task> Delete(int id) + { + return await service.Delete(id); + } + + [HttpPut] + [Authorize(Roles = "admin")] + public async Task> Update([FromBody] Level item) + { + return await service.Update(item); + } + + [HttpGet("all")] + [Authorize] + public async Task>> GetAll() + { + return await service.GetAll(); + } + } +} diff --git a/Build_God_Api/Build_God_Api/Controllers/MissionController.cs b/Build_God_Api/Build_God_Api/Controllers/MissionController.cs new file mode 100644 index 0000000..f471fa9 --- /dev/null +++ b/Build_God_Api/Build_God_Api/Controllers/MissionController.cs @@ -0,0 +1,130 @@ +using Build_God_Api.Common; +using Build_God_Api.DB; +using Build_God_Api.Dto; +using Build_God_Api.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Build_God_Api.Controllers +{ + [ApiController] + [Route("api/god/[controller]")] + public class MissionController( + IMissionService service, + IMissionProgressService progressService + ) : ControllerBase + { + private readonly IMissionService service = service; + private readonly IMissionProgressService progressService = progressService; + + // ============ Mission ============ + + [HttpPost] + [Authorize(Roles = "admin")] + public async Task> Add([FromBody] Mission item) + { + return await service.Add(item); + } + + [HttpDelete("{id}")] + [Authorize(Roles = "admin")] + public async Task> Delete(int id) + { + return await service.Delete(id); + } + + [HttpPut] + [Authorize(Roles = "admin")] + public async Task> Update([FromBody] Mission item) + { + return await service.Update(item); + } + + [HttpPost("all")] + [Authorize] + public async Task>> GetAll([FromBody] SearchMissionDto dto) + { + return await service.GetAll(dto); + } + + [HttpPost("reward/add")] + [Authorize] + public async Task> AddReward([FromBody] MissionReward reward) + { + return await service.AddReward(reward); + } + + [HttpPost("reward/update")] + [Authorize] + public async Task> UpdateReward([FromBody] MissionReward reward) + { + return await service.UpdateReward(reward); + } + + // ============ Mission Progress ============ + + [HttpGet("{missionId}/progresses")] + [Authorize] + public async Task>> GetProgresses(int missionId) + { + return await progressService.GetByMissionId(missionId); + } + + [HttpPost("{missionId}/progresses")] + [Authorize(Roles = "admin")] + public async Task> AddProgress(int missionId, [FromBody] MissionProgress progress) + { + progress.MissionId = missionId; + return await progressService.Create(progress); + } + + [HttpPut("progresses/{id}")] + [Authorize(Roles = "admin")] + public async Task> UpdateProgress(int id, [FromBody] MissionProgress progress) + { + progress.Id = id; + return await progressService.Update(progress); + } + + [HttpDelete("progresses/{id}")] + [Authorize(Roles = "admin")] + public async Task> DeleteProgress(int id) + { + return await progressService.Delete(id); + } + + // ============ Enums ============ + + [HttpGet("types")] + [Authorize] + public ActionResult> GetMissionTypes() + { + var result = EnumHelper.GetEnumList(); + return result; + } + + [HttpGet("difficulties")] + [Authorize] + public ActionResult> GetMissionDifficultys() + { + var result = EnumHelper.GetEnumList(); + return result; + } + + [HttpGet("reward/types")] + [Authorize] + public ActionResult> GetMissionRewardTypes() + { + var result = EnumHelper.GetEnumList(); + return result; + } + + [HttpGet("progress/target-types")] + [Authorize] + public ActionResult> GetProgressTargetTypes() + { + var result = EnumHelper.GetEnumList(); + return result; + } + } +} diff --git a/Build_God_Api/Build_God_Api/Controllers/PillController.cs b/Build_God_Api/Build_God_Api/Controllers/PillController.cs new file mode 100644 index 0000000..9977cac --- /dev/null +++ b/Build_God_Api/Build_God_Api/Controllers/PillController.cs @@ -0,0 +1,59 @@ +using Build_God_Api.Common; +using Build_God_Api.DB; +using Build_God_Api.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Build_God_Api.Controllers +{ + [ApiController] + [Route("api/god/[controller]")] + public class PillController(IPillService service) : ControllerBase + { + private readonly IPillService service = service; + + [HttpPost] + [Authorize(Roles = "admin")] + public async Task> Add([FromBody] Pill item) + { + return await service.Add(item); + } + + [HttpDelete("{id}")] + [Authorize(Roles = "admin")] + public async Task> Delete(int id) + { + return await service.Delete(id); + } + + [HttpPut] + [Authorize(Roles = "admin")] + public async Task> Update([FromBody] Pill item) + { + return await service.Update(item); + } + + [HttpGet("all")] + [Authorize] + public async Task>> GetAll() + { + return await service.GetAll(); + } + + [HttpGet("types")] + [Authorize] + public ActionResult> GetTypes() + { + var result = EnumHelper.GetEnumList(); + return result; + } + + [HttpGet("rarities")] + [Authorize] + public ActionResult> GetRarities() + { + var result = EnumHelper.GetEnumList(); + return result; + } + } +} diff --git a/Build_God_Api/Build_God_Api/Controllers/ProfessionController.cs b/Build_God_Api/Build_God_Api/Controllers/ProfessionController.cs new file mode 100644 index 0000000..e7af23e --- /dev/null +++ b/Build_God_Api/Build_God_Api/Controllers/ProfessionController.cs @@ -0,0 +1,43 @@ +using Build_God_Api.Common; +using Build_God_Api.DB; +using Build_God_Api.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Build_God_Api.Controllers +{ + [ApiController] + [Route("api/god/[controller]")] + public class ProfessionController(IProfessionService professionService) : ControllerBase + { + private readonly IProfessionService service = professionService; + + [HttpPost] + [Authorize(Roles = "admin")] + public async Task> Add([FromBody] Profession item) + { + return await service.Add(item); + } + + [HttpDelete("{id}")] + [Authorize(Roles = "admin")] + public async Task> Delete(int id) + { + return await service.Delete(id); + } + + [HttpPut] + [Authorize(Roles = "admin")] + public async Task> Update([FromBody] Profession item) + { + return await service.Update(item); + } + + [HttpGet("all")] + [Authorize] + public async Task>> GetAll() + { + return await service.GetAll(); + } + } +} diff --git a/Build_God_Api/Build_God_Api/Controllers/StatisticsController.cs b/Build_God_Api/Build_God_Api/Controllers/StatisticsController.cs new file mode 100644 index 0000000..4bbace3 --- /dev/null +++ b/Build_God_Api/Build_God_Api/Controllers/StatisticsController.cs @@ -0,0 +1,18 @@ +using Build_God_Api.Services; +using Microsoft.AspNetCore.Mvc; + +namespace Build_God_Api.Controllers +{ + [ApiController] + [Route("api/god/[controller]")] + public class StatisticsController(IStatisticsService service) : ControllerBase + { + private readonly IStatisticsService service = service; + + [HttpGet("summary")] + public async Task> GetSummary() + { + return await service.GetSummary(); + } + } +} diff --git a/Build_God_Api/Build_God_Api/DB/Account.cs b/Build_God_Api/Build_God_Api/DB/Account.cs new file mode 100644 index 0000000..9c07d46 --- /dev/null +++ b/Build_God_Api/Build_God_Api/DB/Account.cs @@ -0,0 +1,19 @@ +namespace Build_God_Api.DB +{ + public class Account : BaseEntity + { + public string Name { get; set; } = string.Empty; + public string Email { get; set; } = string.Empty; + public string Password { get; set; } = string.Empty; + public bool Active { get; set; } + public bool IsAdmin { get; set; } + } + + + public enum ThirdPartyProvider + { + QQ, + WeChat, + System + } +} diff --git a/Build_God_Api/Build_God_Api/DB/Bag.cs b/Build_God_Api/Build_God_Api/DB/Bag.cs new file mode 100644 index 0000000..c9eba61 --- /dev/null +++ b/Build_God_Api/Build_God_Api/DB/Bag.cs @@ -0,0 +1,50 @@ +using SqlSugar; +using System.ComponentModel; + +namespace Build_God_Api.DB +{ + /// + /// 背包配置表 (预设5种背包类型) + /// + public class Bag : BaseEntity + { + /// + /// 背包名称 + /// + public string Name { get; set; } = string.Empty; + + /// + /// 背包稀有度 + /// + public BagRarity Rarity { get; set; } + + /// + /// 背包容量 + /// + public int Capacity { get; set; } + + /// + /// 描述 + /// + [SugarColumn(IsNullable = true)] + public string? Description { get; set; } + } + + /// + /// 背包稀有度枚举 + /// + public enum BagRarity + { + [Description("普通")] + Common = 1, + + [Description("稀有")] + Rare = 2, + + [Description("史诗")] + Epic = 3, + + [Description("传说")] + Legendary = 4 + } +} diff --git a/Build_God_Api/Build_God_Api/DB/BagItem.cs b/Build_God_Api/Build_God_Api/DB/BagItem.cs new file mode 100644 index 0000000..5d5b118 --- /dev/null +++ b/Build_God_Api/Build_God_Api/DB/BagItem.cs @@ -0,0 +1,43 @@ +using SqlSugar; +using System.ComponentModel; + +namespace Build_God_Api.DB +{ + /// + /// 背包物品表 + /// + public class BagItem : BaseEntity + { + /// + /// 角色背包关联ID + /// + public int CharacterBagId { get; set; } + + /// + /// 物品类型 + /// + public BagItemType ItemType { get; set; } + + /// + /// 物品ID (装备ID或丹药ID) + /// + public int ItemId { get; set; } + + /// + /// 数量 + /// + public int Quantity { get; set; } + } + + /// + /// 背包物品类型枚举 + /// + public enum BagItemType + { + [Description("装备")] + Equipment = 1, + + [Description("丹药")] + Pill = 2 + } +} diff --git a/Build_God_Api/Build_God_Api/DB/BaseEntity.cs b/Build_God_Api/Build_God_Api/DB/BaseEntity.cs new file mode 100644 index 0000000..453f1f0 --- /dev/null +++ b/Build_God_Api/Build_God_Api/DB/BaseEntity.cs @@ -0,0 +1,20 @@ +using SqlSugar; + +namespace Build_God_Api.DB +{ + public class BaseEntity + { + //数据是自增需要加上IsIdentity + //数据库是主键需要加上IsPrimaryKey + [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] + public int Id { get; set; } + + public DateTime CreatedOn { get; set; } = DateTime.UtcNow; + + public DateTime UpdatedOn { get; set; } = DateTime.UtcNow; + + public int CreatedBy { get; set; } + + public int UpdatedBy { get; set; } + } +} diff --git a/Build_God_Api/Build_God_Api/DB/Character.cs b/Build_God_Api/Build_God_Api/DB/Character.cs new file mode 100644 index 0000000..700cd56 --- /dev/null +++ b/Build_God_Api/Build_God_Api/DB/Character.cs @@ -0,0 +1,83 @@ + +using System.ComponentModel.DataAnnotations.Schema; + +namespace Build_God_Api.DB +{ + /// + /// 账号角色 + /// + public class Character : BaseEntity + { + /// + /// 姓名 + /// + public string Name { get; set; } = string.Empty; + + /// + /// 账号ID + /// + public int AccountId { get; set; } + + /// + /// 当前经验值 + /// + public decimal CurrentExp { get; set; } + + /// + /// 当前境界 + /// + public int LevelId { get; set; } + + /// + /// 灵石 + /// + public decimal Money { get; set; } + + /// + /// 最大生命值 + /// + public decimal MaxHP { get; set; } + + /// + /// 当前生命值 + /// + public decimal CurrentHP { get; set; } + + /// + /// 攻击力 + /// + public decimal Attack { get; set; } + + /// + /// 突破成功的概率[0-100] + /// + public decimal BreakthroughRate { get; set; } + + /// + /// 职业ID + /// + [SqlSugar.SugarColumn(IsNullable = false)] + public int? ProfessionId { get; set; } + + /// + /// 灵田ID + /// + public int? SpiritFieldId { get; set; } + + /// + /// 最后登录时间 + /// + public DateTime LastLogin { get; set; } + + /// + /// 是不是在修炼中 + /// + [SqlSugar.SugarColumn(IsNullable = true)] + public DateTime? TrainingOn { get; set; } + + /// + /// 是否删除 + /// + public bool isLocked { get; set; } + } +} diff --git a/Build_God_Api/Build_God_Api/DB/CharacterBag.cs b/Build_God_Api/Build_God_Api/DB/CharacterBag.cs new file mode 100644 index 0000000..5265406 --- /dev/null +++ b/Build_God_Api/Build_God_Api/DB/CharacterBag.cs @@ -0,0 +1,20 @@ +using SqlSugar; + +namespace Build_God_Api.DB +{ + /// + /// 角色背包关联表 + /// + public class CharacterBag : BaseEntity + { + /// + /// 角色ID + /// + public int CharacterId { get; set; } + + /// + /// 背包配置ID + /// + public int BagId { get; set; } + } +} diff --git a/Build_God_Api/Build_God_Api/DB/CharacterMissionProgress.cs b/Build_God_Api/Build_God_Api/DB/CharacterMissionProgress.cs new file mode 100644 index 0000000..9b975bd --- /dev/null +++ b/Build_God_Api/Build_God_Api/DB/CharacterMissionProgress.cs @@ -0,0 +1,40 @@ +using SqlSugar; + +namespace Build_God_Api.DB +{ + /// + /// 角色任务进度表 + /// + public class CharacterMissionProgress : BaseEntity + { + /// + /// 角色ID + /// + public int CharacterId { get; set; } + + /// + /// 任务ID + /// + public int MissionId { get; set; } + + /// + /// 进度配置ID + /// + public int MissionProgressId { get; set; } + + /// + /// 当前完成数量 + /// + public int CurrentCount { get; set; } + + /// + /// 该进度是否已完成 + /// + public bool IsCompleted { get; set; } + + /// + /// 更新时间 + /// + public new DateTime UpdatedOn { get; set; } + } +} diff --git a/Build_God_Api/Build_God_Api/DB/ChatMessage.cs b/Build_God_Api/Build_God_Api/DB/ChatMessage.cs new file mode 100644 index 0000000..fc9e744 --- /dev/null +++ b/Build_God_Api/Build_God_Api/DB/ChatMessage.cs @@ -0,0 +1,15 @@ +namespace Build_God_Api.DB +{ + public class ChatMessage : BaseEntity + { + public int? CharacterId { get; set; } + + public string CharacterName { get; set; } = string.Empty; + + public string Content { get; set; } = string.Empty; + + public ChatMessageType Type { get; set; } + + public DateTime CreatedAt { get; set; } + } +} diff --git a/Build_God_Api/Build_God_Api/DB/ChatMessageType.cs b/Build_God_Api/Build_God_Api/DB/ChatMessageType.cs new file mode 100644 index 0000000..a599344 --- /dev/null +++ b/Build_God_Api/Build_God_Api/DB/ChatMessageType.cs @@ -0,0 +1,9 @@ +namespace Build_God_Api.DB +{ + public enum ChatMessageType + { + Player = 0, + System = 1, + World = 2 + } +} diff --git a/Build_God_Api/Build_God_Api/DB/Equipment.cs b/Build_God_Api/Build_God_Api/DB/Equipment.cs new file mode 100644 index 0000000..f6e0212 --- /dev/null +++ b/Build_God_Api/Build_God_Api/DB/Equipment.cs @@ -0,0 +1,217 @@ +using SqlSugar; +using System.ComponentModel; + +namespace Build_God_Api.DB +{ + /// + /// 装备模板 - 定义装备的基础信息和随机属性池 + /// + public class EquipmentTemplate : BaseEntity + { + public string Name { get; set; } = string.Empty; + + /// + /// 描述 + /// + public string Description { get; set; } = string.Empty; + + /// + /// 装备类型(武器/防具/饰品等) + /// + public EquipmentType Type { get; set; } + + /// + /// 稀有度 + /// + public Rarity Rarity { get; set; } + + /// + /// 需求等级(角色需达到该等级才能穿戴) + /// + public int RequirdLevelId { get; set; } + + /// + /// 所属套装ID + /// + [SugarColumn(IsNullable = true)] + public int? SetId { get; set; } + + /// + /// 价格 + /// + public int Money { get; set; } + + /// + /// 随机属性池配置(JSON) + /// 格式: [{"type":"AttackFixed","min":100,"max":1000,"weight":1},{"type":"AttackPercent","min":0,"max":50,"weight":1}] + /// + [SugarColumn(ColumnDataType = "text")] + public string AttributePool { get; set; } + + /// + /// 随机生成几条属性 + /// + public int RandomAttrCount { get; set; } + + /// + /// 最大强化等级 + /// + public int MaxEnhanceLevel { get; set; } + } + + /// + /// 装备实例 - 角色拥有的具体装备 + /// + public class EquipmentInstance : BaseEntity + { + /// + /// 角色背包关联ID + /// + public int CharacterBagId { get; set; } + + /// + /// 装备模板ID + /// + public int EquipmentTemplateId { get; set; } + + /// + /// 装备名称(复制自模板) + /// + public string Name { get; set; } = string.Empty; + + /// + /// 装备类型 + /// + public EquipmentType Type { get; set; } + + /// + /// 稀有度 + /// + public Rarity Rarity { get; set; } + + /// + /// 随机属性(JSON) + /// 格式: [{"type":"AttackFixed","value":856},{"type":"AttackPercent","value":40}] + /// + public string Attributes { get; set; } = "[]"; + + /// + /// 强化等级 + /// + public int EnhanceLevel { get; set; } + + /// + /// 强化额外加成百分比 + /// + public int EnhanceBonusPercent { get; set; } + + /// + /// 需求等级 + /// + public int RequirdLevelId { get; set; } + + /// + /// 套装ID + /// + [SugarColumn(IsNullable = true)] + public int? SetId { get; set; } + } + + /// + /// 强化配置 + /// + public class EnhanceConfig : BaseEntity + { + /// + /// 强化等级 + /// + public int Level { get; set; } + + /// + /// 所需材料ID + /// + public int ReqItemId { get; set; } + + /// + /// 所需材料数量 + /// + public int ReqItemCount { get; set; } + + /// + /// 成功率(百分比) + /// + public int SuccessRate { get; set; } + + /// + /// 成功后增加的强化加成百分比 + /// + public int BonusPercent { get; set; } + } + + /// + /// 属性类型枚举 + /// + public enum EquipmentAttributeType + { + [Description("攻击力-固定")] + AttackFixed = 1, + + [Description("攻击力-百分比")] + AttackPercent = 2, + + [Description("防御力-固定")] + DefendFixed = 3, + + [Description("防御力-百分比")] + DefendPercent = 4, + + [Description("暴击率-百分比")] + CriticalPercent = 5, + + [Description("闪避-百分比")] + MissPercent = 6, + + [Description("生命值-固定")] + HealthBonusFixed = 7, + + [Description("生命值-百分比")] + HealthBonusPercent = 8, + + [Description("法力-固定")] + ManaBonusFixed = 9, + + [Description("法力-百分比")] + ManaBonusPercent = 10, + + [Description("突破概率-百分比")] + BreakthroughBonusPercent = 11 + } + + public enum EquipmentType + { + [Description("武器")] + Weapon = 1, + [Description("防具")] + Armor, + [Description("头盔")] + Helmet, + [Description("项链")] + Necklace, + [Description("戒指")] + Ring, + [Description("鞋子")] + Boots + } + + public enum Rarity + { + [Description("普通")] + Common = 1, + [Description("稀有")] + Rare, + [Description("史诗")] + Epic, + [Description("传说")] + Legendary + } +} diff --git a/Build_God_Api/Build_God_Api/DB/Level.cs b/Build_God_Api/Build_God_Api/DB/Level.cs new file mode 100644 index 0000000..915b926 --- /dev/null +++ b/Build_God_Api/Build_God_Api/DB/Level.cs @@ -0,0 +1,40 @@ +namespace Build_God_Api.DB +{ + /// + /// 境界 + /// + public class Level : BaseEntity + { + public string Name { get; set; } = string.Empty; + + /// + /// 境界层级,数值越大等级越高 + /// + public int LevelId { get; set; } + + /// + /// 当前等级最小经验值 + /// + public int CurrentLevelMinExp { get; set; } + + /// + /// 下一境界ID + /// + public int? NextLevelId { get; set; } + + /// + /// 基础突破概率[0-100] + /// + public decimal BaseBreakthroughRate { get; set; } + + /// + /// 突破失败后增加的概率[0-100] + /// + public decimal FailIncrement { get; set; } + + /// + /// 描述 + /// + public string Description { get; set; } = string.Empty; + } +} diff --git a/Build_God_Api/Build_God_Api/DB/Mission.cs b/Build_God_Api/Build_God_Api/DB/Mission.cs new file mode 100644 index 0000000..dcf9b03 --- /dev/null +++ b/Build_God_Api/Build_God_Api/DB/Mission.cs @@ -0,0 +1,121 @@ +using SqlSugar; +using System; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; + +namespace Build_God_Api.DB +{ + /// + /// 任务实体(修仙游戏) + /// + public class Mission : BaseEntity + { + /// + /// 任务名称 + /// + [SugarColumn(Length = 50, IsNullable = false)] + public string Name { get; set; } = string.Empty; + + /// + /// 任务类型 + /// + [SugarColumn(IsNullable = false)] + public MissionType Type { get; set; } = MissionType.MainStory; + + /// + /// 任务标题(展示用,与Name不同) + /// + [SugarColumn(Length = 100, IsNullable = false)] + public string Title { get; set; } = string.Empty; + + /// + /// 任务简介 + /// + [SugarColumn(Length = 500, IsNullable = false)] + public string Description { get; set; } = string.Empty; + + /// + /// 需求修为境界ID + /// + [SugarColumn(IsNullable = false)] + public int RequiredLevelId { get; set; } = 1; + + /// + /// 是否可以重复接取 + /// true-无限/每日重置,false-仅可接取一次 + /// + [SugarColumn(IsNullable = false)] + public bool Repeatable { get; set; } = false; + + /// + /// 是否可接取(true-可接,false-未开放) + /// + [SugarColumn(IsNullable = false, DefaultValue = "0")] + public bool IsAvailable { get; set; } = false; + + /// + /// 任务花费时间(分钟) + /// + [SugarColumn(IsNullable = false, DefaultValue = "0")] + public int SpendTimeMinutes { get; set; } = 0; + + /// + /// 任务获取概率(0-100,百分比) + /// + [Range(0, 100)] + [SugarColumn(IsNullable = false, DefaultValue = "100")] + public decimal ObtainPercentage { get; set; } = 100; + + /// + /// 前置任务ID(0代表无前置) + /// + [SugarColumn(IsNullable = false, DefaultValue = "0")] + public int PreMissionId { get; set; } = 0; + + /// + /// 任务难度 + /// + [SugarColumn(IsNullable = false)] + public MissionDifficulty Difficulty { get; set; } = MissionDifficulty.Normal; + + //这里不能给rewards初始化,不然导航属性会没办法查询到数据 + [SqlSugar.Navigate(SqlSugar.NavigateType.OneToMany, nameof(MissionReward.MissionId), nameof(Id))] + public List? Rewards { get; set; } + + [SqlSugar.Navigate(SqlSugar.NavigateType.OneToMany, nameof(MissionProgress.MissionId), nameof(Id))] + public List? Progresses { get; set; } + } + + /// + /// 任务类型枚举 + /// + public enum MissionType + { + [Description("悬赏任务")] + MainStory = 1, + + [Description("日常任务")] + DailyTask = 2, + + [Description("采集任务")] + BranchTask = 3 + } + + /// + /// 任务难度枚举 + /// + public enum MissionDifficulty + { + [Description("简单")] + Easy = 1, + + [Description("普通")] + Normal = 2, + + [Description("困难")] + Hard = 3, + + [Description("炼狱")] + Purgatory = 4 + } +} diff --git a/Build_God_Api/Build_God_Api/DB/MissionProgress.cs b/Build_God_Api/Build_God_Api/DB/MissionProgress.cs new file mode 100644 index 0000000..6ab6aab --- /dev/null +++ b/Build_God_Api/Build_God_Api/DB/MissionProgress.cs @@ -0,0 +1,65 @@ +using SqlSugar; +using System.ComponentModel; + +namespace Build_God_Api.DB +{ + /// + /// 任务目标 + /// + public class MissionProgress : BaseEntity + { + /// + /// 任务ID + /// + public int MissionId { get; set; } + + /// + /// 目标类型 + /// + public ProgressTargetType TargetType { get; set; } + + /// + /// 目标物品ID (可选) + /// + [SugarColumn(IsNullable = true)] + public int? TargetItemId { get; set; } + + /// + /// 目标物品名称 (展示用) + /// + [SugarColumn(Length = 100, IsNullable = true)] + public string? TargetItemName { get; set; } + + /// + /// 目标数量 + /// + public int TargetCount { get; set; } + + /// + /// 描述 + /// + [SugarColumn(Length = 500, IsNullable = true)] + public string? Description { get; set; } + } + + /// + /// 进度目标类型枚举 + /// + public enum ProgressTargetType + { + [Description("收集物品")] + CollectItem = 1, + + [Description("钓鱼")] + Fish = 2, + + [Description("击杀怪物")] + KillMonster = 3, + + [Description("消耗物品")] + ConsumeItem = 4, + + [Description("自定义")] + Custom = 5 + } +} diff --git a/Build_God_Api/Build_God_Api/DB/MissionReward.cs b/Build_God_Api/Build_God_Api/DB/MissionReward.cs new file mode 100644 index 0000000..5743c91 --- /dev/null +++ b/Build_God_Api/Build_God_Api/DB/MissionReward.cs @@ -0,0 +1,51 @@ +using System.ComponentModel; + +namespace Build_God_Api.DB +{ + /// + /// 任务奖励关联表(一对多) + /// + public class MissionReward : BaseEntity + { + /// + /// 任务ID + /// + public int MissionId { get; set; } + + /// + /// 奖励类型(丹药/装备/法宝/功法等) + /// + public RewardType RewardType { get; set; } + + /// + /// 奖励物品ID(关联对应物品表) + /// + public int ItemId { get; set; } + + /// + /// 物品名称(展示用,非数据库字段) + /// + [SqlSugar.SugarColumn(IsIgnore = true)] + public string ItemName { get; set; } = string.Empty; + + /// + /// 奖励数量 + /// + public int Count { get; set; } + } + + /// + /// 奖励类型枚举 + /// + public enum RewardType + { + [Description("丹药")] + Pill = 1, + [Description("装备")] + Equipment = 2, + [Description("经验")] + Exp = 3, + [Description("灵石")] + Money = 4 + } +} diff --git a/Build_God_Api/Build_God_Api/DB/Pill.cs b/Build_God_Api/Build_God_Api/DB/Pill.cs new file mode 100644 index 0000000..f8bc5e7 --- /dev/null +++ b/Build_God_Api/Build_God_Api/DB/Pill.cs @@ -0,0 +1,72 @@ +using System.ComponentModel; + +namespace Build_God_Api.DB +{ + /// + /// 丹药 + /// + public class Pill : BaseEntity + { + /// + /// 丹药名称 + /// + public string Name { get; set; } = string.Empty; + + /// + /// 丹药类型(疗伤、突破、增益等) + /// + public PillType Type { get; set; } + + /// + /// 丹药稀有度 + /// + public Rarity Rarity { get; set; } + + /// + /// 价格 + /// + public int Money { get; set; } + + /// + /// 描述 + /// + public string Description { get; set; } = string.Empty; + + /// + /// 所需境界 + /// + public int RequirdLevelId { get; set; } + + /// + /// 提升效果(比如 增加1000血、提升百分之20的修炼效率) + /// + public decimal EffectValue { get; set; } + + /// + /// 持续时间(秒) 如果是 0 就表示是永久 + /// + public decimal Duration { get; set; } + } + + public enum PillType + { + [Description("增益")] + Buff = 1, + [Description("疗伤")] + Healing, + [Description("突破")] + Breakthrough + } + + public enum PillRarity + { + [Description("下品")] + Low = 1, + [Description("中品")] + Medium, + [Description("上品")] + High, + [Description("极品")] + Premium + } +} diff --git a/Build_God_Api/Build_God_Api/DB/Profession.cs b/Build_God_Api/Build_God_Api/DB/Profession.cs new file mode 100644 index 0000000..653736c --- /dev/null +++ b/Build_God_Api/Build_God_Api/DB/Profession.cs @@ -0,0 +1,40 @@ +using System.ComponentModel; + +namespace Build_God_Api.DB +{ + /// + /// 职业 + /// + public class Profession : BaseEntity + { + /// + /// 职业名称 + /// + public string Name { get; set; } = string.Empty; + + /// + /// 职业描述 + /// + public string Description { get; set; } = string.Empty; + + /// + /// 攻击系数 + /// + public decimal AttackRate { get; set; } = 1.0m; + + /// + /// 防御系数 + /// + public decimal DefendRate { get; set; } = 1.0m; + + /// + /// 生命系数 + /// + public decimal HealthRate { get; set; } = 1.0m; + + /// + /// 暴击系数 + /// + public decimal CriticalRate { get; set; } = 1.0m; + } +} diff --git a/Build_God_Api/Build_God_Api/Dockerfile b/Build_God_Api/Build_God_Api/Dockerfile new file mode 100644 index 0000000..c994d28 --- /dev/null +++ b/Build_God_Api/Build_God_Api/Dockerfile @@ -0,0 +1,30 @@ +# 请参阅 https://aka.ms/customizecontainer 以了解如何自定义调试容器,以及 Visual Studio 如何使用此 Dockerfile 生成映像以更快地进行调试。 + +# 此阶段用于在快速模式(默认为调试配置)下从 VS 运行时 +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +USER $APP_UID +WORKDIR /app +EXPOSE 8080 +EXPOSE 8081 + + +# 此阶段用于生成服务项目 +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +ARG BUILD_CONFIGURATION=Release +WORKDIR /src +COPY ["Build_God_Api/Build_God_Api.csproj", "Build_God_Api/"] +RUN dotnet restore "./Build_God_Api/Build_God_Api.csproj" +COPY . . +WORKDIR "/src/Build_God_Api" +RUN dotnet build "./Build_God_Api.csproj" -c $BUILD_CONFIGURATION -o /app/build + +# 此阶段用于发布要复制到最终阶段的服务项目 +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "./Build_God_Api.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false + +# 此阶段在生产中使用,或在常规模式下从 VS 运行时使用(在不使用调试配置时为默认值) +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "Build_God_Api.dll"] \ No newline at end of file diff --git a/Build_God_Api/Build_God_Api/Dto/CharacterDto.cs b/Build_God_Api/Build_God_Api/Dto/CharacterDto.cs new file mode 100644 index 0000000..f31bafa --- /dev/null +++ b/Build_God_Api/Build_God_Api/Dto/CharacterDto.cs @@ -0,0 +1,22 @@ +namespace Build_God_Api.Dto +{ + public class CharacterDto + { + public int Id { get; set; } + public string Name { get; set; } + public string LevelName { get; set; } + public int LevelId { get; set; } + public decimal MaxHP { get; set; } + public decimal Attack { get; set; } + public string ProfessionName { get; set; } + public decimal Money { get; set; } + public decimal CurrentExp { get; set; } + public DateTime? TrainingOn { get; set; } + public string? NextLevelName { get; set; } + public decimal? NextLevelMinExp { get; set; } + public decimal BreakthroughRate { get; set; } + public bool CanBreakthrough { get; set; } + public DateTime LastLogin { get; set; } + public DateTime CreatedOn { get; set; } + } +} diff --git a/Build_God_Api/Build_God_Api/Dto/EquipmentDtos.cs b/Build_God_Api/Build_God_Api/Dto/EquipmentDtos.cs new file mode 100644 index 0000000..2d75cf5 --- /dev/null +++ b/Build_God_Api/Build_God_Api/Dto/EquipmentDtos.cs @@ -0,0 +1,14 @@ +using Build_God_Api.DB; + +namespace Build_God_Api.Dto +{ + /// + /// 查询装备的条件 + /// + public class SearchEquipmentDto + { + public int PageNumber { get; set; } + public int PageSize { get; set; } = 0; + public int? EquipmentType { get; set; } + } +} diff --git a/Build_God_Api/Build_God_Api/Dto/MissionDtos.cs b/Build_God_Api/Build_God_Api/Dto/MissionDtos.cs new file mode 100644 index 0000000..b0d7a6a --- /dev/null +++ b/Build_God_Api/Build_God_Api/Dto/MissionDtos.cs @@ -0,0 +1,11 @@ +using Build_God_Api.DB; + +namespace Build_God_Api.Dto +{ + public class SearchMissionDto + { + public int PageNumber { get; set; } + public int PageSize { get; set; } = 0; + public int? MissionType { get; set; } + } +} diff --git a/Build_God_Api/Build_God_Api/Dto/PagedResult.cs b/Build_God_Api/Build_God_Api/Dto/PagedResult.cs new file mode 100644 index 0000000..161c88f --- /dev/null +++ b/Build_God_Api/Build_God_Api/Dto/PagedResult.cs @@ -0,0 +1,30 @@ +namespace Build_God_Api.Dto +{ + public class PagedResult where T : class + { + /// + /// 当前页的数据 + /// + public List Items { get; set; } = []; + + /// + /// 总记录数 + /// + public long TotalCount { get; set; } + + /// + /// 每页大小 + /// + public int PageSize { get; set; } + + /// + /// 当前页码(从1开始) + /// + public int PageNumber { get; set; } + + /// + /// 总页数 + /// + public int TotalPages => PageSize > 0 ? (int)Math.Ceiling((double)TotalCount / PageSize) : 0; + } +} diff --git a/Build_God_Api/Build_God_Api/Hubs/ChatHub.cs b/Build_God_Api/Build_God_Api/Hubs/ChatHub.cs new file mode 100644 index 0000000..0ac38f7 --- /dev/null +++ b/Build_God_Api/Build_God_Api/Hubs/ChatHub.cs @@ -0,0 +1,101 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.SignalR; +using Build_God_Api.DB; +using Build_God_Api.Services; +using System.Security.Claims; + +namespace Build_God_Api.Hubs +{ + [Authorize(AuthenticationSchemes = "Bearer")] + public class ChatHub : Hub + { + private readonly IChatService _chatService; + private readonly ICurrentUserService _currentUserService; + private readonly ICharacterService _characterService; + private readonly IHubContext _hubContext; + private readonly ILogger _logger; + + public ChatHub( + IChatService chatService, + ICurrentUserService currentUserService, + ICharacterService characterService, + IHubContext hubContext, + ILogger logger) + { + _chatService = chatService; + _currentUserService = currentUserService; + _characterService = characterService; + _hubContext = hubContext; + _logger = logger; + } + + public async Task> GetRecentMessages(int count = 100) + { + var messages = await _chatService.GetRecentMessagesAsync(count); + return messages.Select(m => new ChatMessageDto + { + Id = m.Id, + CharacterId = m.CharacterId, + CharacterName = m.CharacterName, + Content = m.Content, + Type = m.Type, + CreatedAt = m.CreatedAt + }).ToList(); + } + + public async Task SendMessage(string content, int type = 0) + { + if (string.IsNullOrWhiteSpace(content) || content.Length > 500) + return null; + + var accountId = _currentUserService.UserId; + var character = await _characterService.GetCharacterByAccountId(accountId); + + if (character == null) + return null; + + var messageType = (ChatMessageType)type; + var message = await _chatService.AddMessageAsync( + character.Id, + character.Name, + content.Trim(), + messageType); + + var dto = new ChatMessageDto + { + Id = message.Id, + CharacterId = message.CharacterId, + CharacterName = message.CharacterName, + Content = message.Content, + Type = message.Type, + CreatedAt = message.CreatedAt + }; + + await _hubContext.Clients.All.SendAsync("ReceiveMessage", dto); + + return dto; + } + + public override async Task OnConnectedAsync() + { + _logger.LogInformation("User connected: {ConnectionId}", Context.ConnectionId); + await base.OnConnectedAsync(); + } + + public override async Task OnDisconnectedAsync(Exception? exception) + { + _logger.LogInformation("User disconnected: {ConnectionId}", Context.ConnectionId); + await base.OnDisconnectedAsync(exception); + } + } + + public class ChatMessageDto + { + public int Id { get; set; } + public int? CharacterId { get; set; } + public string CharacterName { get; set; } = string.Empty; + public string Content { get; set; } = string.Empty; + public ChatMessageType Type { get; set; } + public DateTime CreatedAt { get; set; } + } +} diff --git a/Build_God_Api/Build_God_Api/MarkDown.md b/Build_God_Api/Build_God_Api/MarkDown.md new file mode 100644 index 0000000..d7e3482 --- /dev/null +++ b/Build_God_Api/Build_God_Api/MarkDown.md @@ -0,0 +1,20 @@ +# 后台API + +所有的API都在这里面了😎 + +# 职业 +将系统的灵根设定成职业 + +- 亡灵 : 攻击系数 * 1.6 防御系数 * 0.8 生命系数 * 0.9 暴击系数 * 1.1 +- 骑士 : 攻击系数 * 0.85 防御系数 * 1.6 生命系数 * 1.3 暴击系数 * 0.9 +- 游侠 : 攻击系数 * 1.1 防御系数 * 0.9 生命系数 * 0.85 暴击系数 * 1.5 +- 战士 : 攻击系数 * 1.0 防御系数 * 1.0 生命系数 * 1.5 暴击系数 * 0.95 + +## 打坐 🧘 +结算公式:基础系数 × 等级 × 等级 × (1 + buff) × 秒数 +--基础系数:一个很小的数字,用于整体平衡,比如0.2、0.5或者1,我设定得1,后面再调整 +--buff:加成 + +## 等级 +每一级得最小经验门槛儿计算: 100 * level * level * level; + diff --git a/Build_God_Api/Build_God_Api/Program.cs b/Build_God_Api/Build_God_Api/Program.cs new file mode 100644 index 0000000..3b2208a --- /dev/null +++ b/Build_God_Api/Build_God_Api/Program.cs @@ -0,0 +1,197 @@ +using Build_God_Api.DB; +using Build_God_Api.Services; +using Build_God_Api.Services.Game; +using Build_God_Api.Hubs; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.IdentityModel.Tokens; +using Microsoft.OpenApi.Models; +using SqlSugar; +using System.Text; + +namespace Build_God_Api +{ + public class Program + { + public static void Main(string[] args) + { + var builder = WebApplication.CreateBuilder(args); + + // Add services to the container. + + builder.Services.AddControllers(); + // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle + builder.Services.AddEndpointsApiExplorer(); + builder.Services.AddSwaggerGen(c => + { + c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" }); + + // 添加Bearer认证 + c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme + { + Description = "输入JWT Token: Bearer {token}", + Name = "Authorization", + In = ParameterLocation.Header, + Type = SecuritySchemeType.Http, + Scheme = "Bearer" + }); + + c.AddSecurityRequirement(new OpenApiSecurityRequirement + { + { + new OpenApiSecurityScheme + { + Reference = new OpenApiReference + { + Type = ReferenceType.SecurityScheme, + Id = "Bearer" + } + }, + new string[] {} + } + }); + }); + + //sqlsugar + builder.Services.AddHttpContextAccessor(); + builder.Services.AddSingleton(s => + { + var config = new ConnectionConfig() + { + ConnectionString = builder.Configuration["connection"], + DbType = DbType.PostgreSQL, + IsAutoCloseConnection = true, + InitKeyType = InitKeyType.Attribute, + MoreSettings = new ConnMoreSettings + { + EnableCodeFirstUpdatePrecision = true + }, + AopEvents = new AopEvents + { + OnLogExecuting = (sql, pars) => + { + Console.WriteLine($"Sql:{sql}"); + Console.WriteLine($"parameters:{string.Join(",", pars.Select(p => $"{p.ParameterName}:{p.Value}"))}"); + } + } + }; + + var sqlSugarClient = new SqlSugarScope(config); + + sqlSugarClient.DbMaintenance.CreateDatabase(); + sqlSugarClient.CodeFirst.InitTables(typeof(Account)); + sqlSugarClient.CodeFirst.InitTables(typeof(Character)); + sqlSugarClient.CodeFirst.InitTables(typeof(Level)); + sqlSugarClient.CodeFirst.InitTables(typeof(Profession)); + sqlSugarClient.CodeFirst.InitTables(typeof(EquipmentTemplate)); + sqlSugarClient.CodeFirst.InitTables(typeof(EquipmentInstance)); + sqlSugarClient.CodeFirst.InitTables(typeof(EnhanceConfig)); + sqlSugarClient.CodeFirst.InitTables(typeof(Pill)); + sqlSugarClient.CodeFirst.InitTables(typeof(Mission)); + sqlSugarClient.CodeFirst.InitTables(typeof(MissionReward)); + sqlSugarClient.CodeFirst.InitTables(typeof(Bag)); + sqlSugarClient.CodeFirst.InitTables(typeof(CharacterBag)); + sqlSugarClient.CodeFirst.InitTables(typeof(BagItem)); + sqlSugarClient.CodeFirst.InitTables(typeof(MissionProgress)); + sqlSugarClient.CodeFirst.InitTables(typeof(CharacterMissionProgress)); + sqlSugarClient.CodeFirst.InitTables(typeof(ChatMessage)); + + return sqlSugarClient; + }); + + //jwt + builder.Services.AddAuthentication().AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, op => + { + op.TokenValidationParameters = new TokenValidationParameters + { + ValidateIssuer = true, + ValidIssuer = builder.Configuration["JWT:Issuer"], + ValidateAudience = true, + ValidAudience = builder.Configuration["JWT:Audience"], + ValidateIssuerSigningKey = true, + IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["JWT:SecretKey"]!)), + ValidateLifetime = true, + ClockSkew = TimeSpan.FromSeconds(30), + RequireExpirationTime = true, + }; + + op.Events = new JwtBearerEvents + { + OnMessageReceived = context => + { + var accessToken = context.Request.Query["access_token"]; + var path = context.HttpContext.Request.Path; + if (!string.IsNullOrEmpty(accessToken) && path.StartsWithSegments("/hubs")) + { + context.Token = accessToken; + } + return Task.CompletedTask; + }, + // 可选:添加认证失败日志,方便排查 + OnAuthenticationFailed = context => + { + Console.WriteLine($"认证失败:{context.Exception.Message}"); + return Task.CompletedTask; + } + }; + }); + builder.Services.AddSignalR(); + builder.Services.AddMemoryCache(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + + builder.Services.AddCors(options => + { + options.AddPolicy("AllowLocal", policy => + { + var allowedOrigins = builder.Configuration["AllowedOrigins"]?.Split(',') ?? []; + + if (builder.Environment.IsDevelopment()) + { + var devOrigins = new[] { "http://localhost:5174", "http://localhost:5173" }; + policy.WithOrigins(devOrigins.Concat(allowedOrigins).ToArray()); + } + else + { + policy.WithOrigins(allowedOrigins); + } + + policy.AllowAnyMethod() + .AllowAnyHeader() + .AllowCredentials(); + }); + }); + + var app = builder.Build(); + + // Configure the HTTP request pipeline. + if (app.Environment.IsDevelopment()) + { + app.UseCors("AllowLocal"); + app.UseSwagger(); + app.UseSwaggerUI(); + } + + app.UseHttpsRedirection(); + + app.UseAuthentication(); + app.UseAuthorization(); + + app.MapControllers(); + app.MapHub("/hubs/chat"); + + app.Run(); + } + } +} diff --git a/Build_God_Api/Build_God_Api/Services/AccountService.cs b/Build_God_Api/Build_God_Api/Services/AccountService.cs new file mode 100644 index 0000000..7691a36 --- /dev/null +++ b/Build_God_Api/Build_God_Api/Services/AccountService.cs @@ -0,0 +1,123 @@ +using Build_God_Api.DB; +using Microsoft.IdentityModel.Tokens; +using SqlSugar; +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using System.Security.Cryptography; +using System.Text; + +namespace Build_God_Api.Services +{ + public interface IAccountService + { + Task GetAccount(long id); + Task GetAccountByEmail(string email); + Task GetAccountByName(string name); + Task ExistsAccount(string name, string email); + Task Register(Account account); + Task UpdateAccount(Account account); + Task ActivateAccount(long id); + Task DeactivateAccount(long id); + Task DeleteAccount(long id); + string CalculateHash(string name, string password); + string GenerateToken(long id, string name, bool isAdmin); + } + + public class AccountService + ( + ISqlSugarClient context, + IConfiguration configuration, + ILogger logger, + ICurrentUserService currentUserService + ) : IAccountService + { + private readonly ISqlSugarClient _context = context; + private readonly IConfiguration _configuration = configuration; + private readonly ILogger _logger = logger; + private readonly ICurrentUserService currentUserService = currentUserService; + + public async Task GetAccount(long id) + => await _context.Queryable().FirstAsync(x => x.Id == id); + public async Task GetAccountByName(string name) + => await _context.Queryable().FirstAsync(a => a.Name == name); + public async Task GetAccountByEmail(string email) + => await _context.Queryable().FirstAsync(a => a.Email == email); + public async Task ExistsAccount(string name, string email) + => await _context.Queryable().AnyAsync(a => a.Name == name || a.Email == email); + + public async Task Register(Account account) + { + var accountToUpdate = await GetAccountByEmail(account.Email); + if (accountToUpdate != null) return false; + await _context.Insertable(account).ExecuteCommandAsync(); + return true; + } + + public async Task UpdateAccount(Account account) + { + var accountToUpdate = await GetAccount(account.Id); + if (accountToUpdate == null) return null; + + accountToUpdate.Email = account.Email; + accountToUpdate.Name = account.Name; + accountToUpdate.Password = account.Password; + accountToUpdate.Active = account.Active; + accountToUpdate.UpdatedOn = DateTime.UtcNow; + + return accountToUpdate.Id; + } + public async Task ActivateAccount(long id) + { + var account = await GetAccount(id); + if (account == null) return false; + account.Active = true; + await _context.Updateable(account).ExecuteCommandAsync(); + return true; + } + public async Task DeactivateAccount(long id) + { + var account = await GetAccount(id); + if (account == null) return false; + account.Active = false; + await _context.Updateable(account).ExecuteCommandAsync(); + return true; + } + public async Task DeleteAccount(long id) + { + var account = await GetAccount(id); + if (account == null) return false; + await _context.Deleteable(account).ExecuteCommandAsync(); + return true; + } + public string CalculateHash(string name, string password) + { + var new_password = password[..1] + name[..1] + password[1..^1] + name[^1] + password[^1] + '+'; + var bytes = SHA256.HashData(Encoding.UTF8.GetBytes(new_password)); + return Convert.ToBase64String(bytes); + } + + public string GenerateToken(long id, string name, bool isAdmin) + { + _logger.LogInformation("Generating token for {name}, key: {key}, issuer: {issuer}", name, _configuration["JWT:SecretKey"], _configuration["JWT:Issuer"]); + var claims = new[] + { + new Claim("Id", id.ToString()), + new Claim("Name", name), + new Claim(ClaimTypes.Role, isAdmin ? "admin" : "user") + }; + var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["JWT:SecretKey"]!)); + var signingCredentials = new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha256); + var expires = Convert.ToInt32(_configuration["JWT:Expires"]); + var token = new JwtSecurityToken( + _configuration["JWT:Issuer"], + _configuration["JWT:Audience"], + claims, + DateTime.Now, + DateTime.Now.AddMinutes(expires), + signingCredentials + ); + var jwtToken = new JwtSecurityTokenHandler().WriteToken(token); + return jwtToken; + } + } +} diff --git a/Build_God_Api/Build_God_Api/Services/BagService.cs b/Build_God_Api/Build_God_Api/Services/BagService.cs new file mode 100644 index 0000000..4e53a79 --- /dev/null +++ b/Build_God_Api/Build_God_Api/Services/BagService.cs @@ -0,0 +1,256 @@ +using Build_God_Api.DB; +using SqlSugar; + +namespace Build_God_Api.Services +{ + public interface IBagService + { + // Bag配置管理 + Task> GetAllBags(); + Task GetBagById(int id); + Task CreateBag(Bag bag); + Task UpdateBag(Bag bag); + Task DeleteBag(int id); + + // 角色背包管理 + Task GetCharacterBag(int characterId); + Task AssignBagToCharacter(int characterId, int bagId); + + // 背包物品管理 + Task> GetBagItems(int characterBagId); + Task AddItemToBag(int characterBagId, int itemType, int itemId, int quantity); + Task RemoveItemFromBag(int characterBagId, int bagItemId); + } + + public class BagItemDto + { + public int Id { get; set; } + public int CharacterBagId { get; set; } + public int ItemType { get; set; } + public int ItemId { get; set; } + public int Quantity { get; set; } + public string? ItemName { get; set; } + public int? ItemRarity { get; set; } + } + + public class CharacterBagDto + { + public int Id { get; set; } + public int CharacterId { get; set; } + public int BagId { get; set; } + public string? BagName { get; set; } + public int BagCapacity { get; set; } + } + + public class BagService(ISqlSugarClient db) : IBagService + { + private readonly ISqlSugarClient db = db; + + // ============ Bag配置管理 ============ + + public async Task> GetAllBags() + { + return await db.Queryable().ToListAsync(); + } + + public async Task GetBagById(int id) + { + return await db.Queryable().FirstAsync(x => x.Id == id); + } + + public async Task CreateBag(Bag bag) + { + await db.Insertable(bag).ExecuteCommandAsync(); + return true; + } + + public async Task UpdateBag(Bag bag) + { + var existing = await GetBagById(bag.Id); + if (existing == null) + throw new Exception("背包配置不存在"); + + existing.Name = bag.Name; + existing.Rarity = bag.Rarity; + existing.Capacity = bag.Capacity; + existing.Description = bag.Description; + + await db.Updateable(existing).ExecuteCommandAsync(); + return true; + } + + public async Task DeleteBag(int id) + { + // 检查是否有角色正在使用此背包 + var characterBags = await db.Queryable() + .Where(x => x.BagId == id) + .ToListAsync(); + + if (characterBags.Any()) + { + // 删除相关的物品和关联 + foreach (var cb in characterBags) + { + await db.Deleteable().Where(x => x.CharacterBagId == cb.Id).ExecuteCommandAsync(); + } + await db.Deleteable().Where(x => x.BagId == id).ExecuteCommandAsync(); + } + + await db.Deleteable().Where(x => x.Id == id).ExecuteCommandAsync(); + return true; + } + + public async Task GetCharacterBag(int characterId) + { + var characterBag = await db.Queryable() + .FirstAsync(x => x.CharacterId == characterId); + + if (characterBag == null) + return null; + + var bag = await GetBagById(characterBag.BagId); + + return new CharacterBagDto + { + Id = characterBag.Id, + CharacterId = characterBag.CharacterId, + BagId = characterBag.BagId, + BagName = bag?.Name, + BagCapacity = bag?.Capacity ?? 0 + }; + } + + public async Task AssignBagToCharacter(int characterId, int bagId) + { + var bag = await GetBagById(bagId); + if (bag == null) + throw new Exception("背包配置不存在"); + + var existing = await db.Queryable() + .FirstAsync(x => x.CharacterId == characterId); + + if (existing != null) + { + // 角色已有背包,更新背包配置 + existing.BagId = bagId; + await db.Updateable(existing).ExecuteCommandAsync(); + } + else + { + // 创建新的关联 + var characterBag = new CharacterBag + { + CharacterId = characterId, + BagId = bagId + }; + await db.Insertable(characterBag).ExecuteCommandAsync(); + } + + return true; + } + + // ============ 背包物品管理 ============ + + public async Task> GetBagItems(int characterBagId) + { + var characterBag = await db.Queryable() + .FirstAsync(x => x.Id == characterBagId); + + if (characterBag == null) + throw new Exception("角色背包不存在"); + + var bag = await GetBagById(characterBag.BagId); + + var bagItems = await db.Queryable() + .Where(x => x.CharacterBagId == characterBagId) + .ToListAsync(); + + var result = new List(); + foreach (var item in bagItems) + { + var dto = new BagItemDto + { + Id = item.Id, + CharacterBagId = item.CharacterBagId, + ItemType = (int)item.ItemType, + ItemId = item.ItemId, + Quantity = item.Quantity + }; + + if (item.ItemType == BagItemType.Equipment) + { + var equipment = await db.Queryable() + .FirstAsync(x => x.Id == item.ItemId); + dto.ItemName = equipment?.Name; + dto.ItemRarity = equipment != null ? (int)equipment.Rarity : null; + } + else if (item.ItemType == BagItemType.Pill) + { + var pill = await db.Queryable() + .FirstAsync(x => x.Id == item.ItemId); + dto.ItemName = pill?.Name; + } + + result.Add(dto); + } + + return result; + } + + public async Task AddItemToBag(int characterBagId, int itemType, int itemId, int quantity) + { + var characterBag = await db.Queryable() + .FirstAsync(x => x.Id == characterBagId); + + if (characterBag == null) + throw new Exception("角色背包不存在"); + + var bag = await GetBagById(characterBag.BagId); + if (bag == null) + throw new Exception("背包配置不存在"); + + var existingItem = await db.Queryable() + .FirstAsync(x => x.CharacterBagId == characterBagId + && x.ItemType == (BagItemType)itemType + && x.ItemId == itemId); + + if (existingItem != null) + { + existingItem.Quantity += quantity; + await db.Updateable(existingItem).ExecuteCommandAsync(); + } + else + { + var currentCount = await db.Queryable() + .Where(x => x.CharacterBagId == characterBagId) + .CountAsync(); + + if (currentCount >= bag.Capacity) + throw new Exception("背包已满"); + + var newItem = new BagItem + { + CharacterBagId = characterBagId, + ItemType = (BagItemType)itemType, + ItemId = itemId, + Quantity = quantity + }; + await db.Insertable(newItem).ExecuteCommandAsync(); + } + + return true; + } + + public async Task RemoveItemFromBag(int characterBagId, int bagItemId) + { + var item = await db.Queryable() + .FirstAsync(x => x.Id == bagItemId && x.CharacterBagId == characterBagId); + + if (item == null) + throw new Exception("物品不存在"); + + await db.Deleteable(item).ExecuteCommandAsync(); + return true; + } + } +} diff --git a/Build_God_Api/Build_God_Api/Services/CharacterService.cs b/Build_God_Api/Build_God_Api/Services/CharacterService.cs new file mode 100644 index 0000000..9a0b9c6 --- /dev/null +++ b/Build_God_Api/Build_God_Api/Services/CharacterService.cs @@ -0,0 +1,306 @@ +using Build_God_Api.DB; +using Build_God_Api.Dto; +using Build_God_Api.Services.Game; +using SqlSugar; +using System.Security.Cryptography; + +namespace Build_God_Api.Services +{ +public interface ICharacterService + { + public Task GetCharacterByAccountId(int accountId); + public Task> GetCharactersByAccountId(int accountId); + public Task> GetCharacterListWithDetails(int accountId); + public Task> GetAllCharacters(); + public Task GetCharacterById(int characterId); + + public Task ExistsByNameAsync(string name); + + public Task RegisterCharacter(CharacterRegisterDto character); + + public Task DeleteCharacter(int characterId); + + /// + /// 选择角色(更新最后登录时间) + /// + public Task SelectCharacter(int characterId); + + /// + /// 突破 + /// + /// + public Task Breakthrough(int characterId); + + /// + /// 开始打坐 + /// + public Task StartTraining(int characterId); + + /// + /// 停止打坐并结算经验 + /// + /// 获得的经验值 + public Task StopTraining(int characterId); + } + + public class CharacterService(ISqlSugarClient db, + ICurrentUserService currentUserService, + ICharacterAttributeCalculateService calculateService) : ICharacterService + { + private readonly ISqlSugarClient db = db; + private readonly ICurrentUserService currentUserService = currentUserService; + private readonly ICharacterAttributeCalculateService calculateService = calculateService; + + public async Task Breakthrough(int characterId) + { + var character = await db.Queryable().FirstAsync(x => x.Id == characterId) ?? throw new Exception("角色不存在"); + var currentLevel = await db.Queryable().FirstAsync(x => x.LevelId == character.LevelId); + var nextLevelId = currentLevel?.NextLevelId ?? 1; + var nextLevel = await db.Queryable().FirstAsync(x => x.LevelId == nextLevelId) ?? throw new Exception("你暂时无敌了,没有等级可以突破了"); + + if (character.CurrentExp < nextLevel.CurrentLevelMinExp) + { + throw new Exception($"距离可以突破你还差 {nextLevel.CurrentLevelMinExp - character.CurrentExp}"); + } + + if (currentLevel?.BaseBreakthroughRate <= 0) + { + throw new Exception("当前境界无法突破"); + } + + if (character.BreakthroughRate >= 100) + { + character.LevelId = nextLevelId; + character.BreakthroughRate = nextLevel.BaseBreakthroughRate; + await calculateService.CalculateAndUpdateAttributesAsync(character); + return true; + } + + decimal randomValue = GenerateSecureRandomDecimal(0, 100, 1); + bool isSuccess = randomValue < character.BreakthroughRate; + + if (isSuccess) + { + character.LevelId = nextLevelId; + character.BreakthroughRate = nextLevel.BaseBreakthroughRate; + await calculateService.CalculateAndUpdateAttributesAsync(character); + } + else + { + character.BreakthroughRate += currentLevel!.FailIncrement; + if (character.BreakthroughRate > 100) + { + character.BreakthroughRate = 100; + } + } + + await db.Updateable(character).ExecuteCommandAsync(); + return isSuccess; + } + + public async Task StartTraining(int characterId) + { + var character = await db.Queryable().FirstAsync(x => x.Id == characterId) + ?? throw new Exception("角色不存在"); + + if (character.TrainingOn.HasValue) + { + throw new Exception("你已经在打坐了"); + } + + character.TrainingOn = DateTime.Now; + await db.Updateable(character).ExecuteCommandAsync(); + return true; + } + + public async Task StopTraining(int characterId) + { + var character = await db.Queryable().FirstAsync(x => x.Id == characterId) + ?? throw new Exception("角色不存在"); + + if (!character.TrainingOn.HasValue) + { + throw new Exception("你还没有开始打坐"); + } + + var duration = DateTime.Now - character.TrainingOn.Value; + var seconds = (decimal)duration.TotalSeconds; + + // exp = 1 * seconds * level * level * (1 + buff) + var expGained = 1 * seconds * character.LevelId * character.LevelId * (1 + 0); + + character.CurrentExp += Math.Round(expGained); + character.TrainingOn = null; + await db.Updateable(character).ExecuteCommandAsync(); + + return expGained; + } + + private readonly RandomNumberGenerator _rng = RandomNumberGenerator.Create(); + + /// + /// 生成安全的高精度随机小数(生产环境用) + /// + /// 最小值 + /// 最大值 + /// 小数位数 + /// 随机数 + private decimal GenerateSecureRandomDecimal(decimal min, decimal max, int decimalPlaces) + { + byte[] randomBytes = new byte[4]; + _rng.GetBytes(randomBytes); + int randomInt = BitConverter.ToInt32(randomBytes, 0); + + decimal randomDecimal = (decimal)Math.Abs(randomInt) / int.MaxValue; + decimal result = min + (randomDecimal * (max - min)); + + return Math.Round(result, decimalPlaces); + } + + public async Task DeleteCharacter(int characterId) + { + var item = await db.Queryable().FirstAsync(x => x.Id == characterId && x.AccountId == currentUserService.UserId) ?? throw new Exception("你没有权力这么做"); + item.isLocked = true; + await db.Updateable(item).ExecuteCommandAsync(); + return true; + } + + public async Task SelectCharacter(int characterId) + { + var character = await db.Queryable().FirstAsync(x => x.Id == characterId && x.AccountId == currentUserService.UserId && x.isLocked == false) + ?? throw new Exception("角色不存在"); + character.LastLogin = DateTime.Now; + await db.Updateable(character).ExecuteCommandAsync(); + return true; + } + + public async Task ExistsByNameAsync(string name) + { + return await db.Queryable().AnyAsync(x => x.Name == name); + } + +public async Task GetCharacterByAccountId(int accountId) + { + return await db.Queryable().FirstAsync(x => x.AccountId == accountId && x.isLocked == false); + } + + public async Task> GetCharactersByAccountId(int accountId) + { + return await db.Queryable() + .Where(x => x.AccountId == accountId && x.isLocked == false) + .OrderBy(x => x.CreatedOn) + .ToListAsync(); + } + + /// + /// 获取角色列表(包含境界和灵根信息) + /// + public async Task> GetCharacterListWithDetails(int accountId) + { + var characters = await db.Queryable() + .Where(x => x.AccountId == accountId && x.isLocked == false) + .OrderBy(x => x.CreatedOn) + .ToListAsync(); + + var result = new List(); + foreach (var c in characters) + { + var level = await db.Queryable().FirstAsync(x => x.LevelId == c.LevelId); + Level? nextLevel = null; + if (level?.NextLevelId.HasValue == true) + { + nextLevel = await db.Queryable().FirstAsync(x => x.LevelId == level.NextLevelId); + } + Profession? profession = null; + if (c.ProfessionId.HasValue && c.ProfessionId > 0) + { + profession = await db.Queryable().FirstAsync(x => x.Id == c.ProfessionId); + } + + bool canBreakthrough = false; + if (nextLevel != null && c.CurrentExp >= nextLevel.CurrentLevelMinExp) + { + canBreakthrough = true; + } + + result.Add(new CharacterDto + { + Id = c.Id, + Name = c.Name, + LevelName = level?.Name ?? "未知", + LevelId = c.LevelId, + MaxHP = c.MaxHP, + Attack = c.Attack, + ProfessionName = profession?.Name, + Money = c.Money, + CurrentExp = c.CurrentExp, + TrainingOn = c.TrainingOn, + NextLevelName = nextLevel?.Name, + NextLevelMinExp = nextLevel?.CurrentLevelMinExp, + BreakthroughRate = c.BreakthroughRate, + CanBreakthrough = canBreakthrough, + LastLogin = c.LastLogin, + CreatedOn = c.CreatedOn + }); + } + + return result; + } + + public async Task> GetAllCharacters() + { + return await db.Queryable().Where(x => x.isLocked == false).ToListAsync(); + } + + public async Task GetCharacterById(int characterId) + { + return await db.Queryable().FirstAsync(x => x.Id == characterId && x.isLocked == false); + } + + public async Task RegisterCharacter(CharacterRegisterDto character) + { + var bo = await ExistsByNameAsync(character.Name); + if (bo) + { + throw new Exception("已经有道友叫这个名字了,请想另外一个吊炸天的名字吧"); + } + + // 限制每个账号最多3个角色 + var existingCount = await db.Queryable() + .CountAsync(x => x.AccountId == currentUserService.UserId && x.isLocked == false); + if (existingCount >= 3) + { + throw new Exception("每个账号最多只能创建3个角色"); + } + + Character newOne = new() + { + Name = character.Name, + AccountId = currentUserService.UserId, + CurrentExp = 0, + LevelId = 1, + Money = 0, + MaxHP = 100, + CurrentHP = 100, + Attack = 0, + ProfessionId = character.ProfessionId, + SpiritFieldId = 0, + BreakthroughRate = 0, + LastLogin = DateTime.Now + }; + + await db.Insertable(newOne).ExecuteCommandAsync(); + + return true; + } + } + + /// + /// 注册角色 + /// + public class CharacterRegisterDto + { + public string Name { get; set; } = string.Empty; + public int ProfessionId { get; set; } + } +} diff --git a/Build_God_Api/Build_God_Api/Services/ChatService.cs b/Build_God_Api/Build_God_Api/Services/ChatService.cs new file mode 100644 index 0000000..aaa14bf --- /dev/null +++ b/Build_God_Api/Build_God_Api/Services/ChatService.cs @@ -0,0 +1,61 @@ +using Build_God_Api.DB; +using SqlSugar; + +namespace Build_God_Api.Services +{ + public class ChatService(ISqlSugarClient db) : IChatService + { + public async Task> GetRecentMessagesAsync(int count = 100) + { + return await db.Queryable() + .OrderBy(x => x.CreatedAt) + .Take(count) + .ToListAsync(); + } + + public async Task AddMessageAsync(int? characterId, string characterName, string content, ChatMessageType type) + { + var message = new ChatMessage + { + CharacterId = characterId, + CharacterName = characterName, + Content = content, + Type = type, + CreatedAt = DateTime.Now + }; + + await db.Insertable(message).ExecuteCommandAsync(); + + await CleanupOldMessagesAsync(); + + return message; + } + + public async Task CleanupOldMessagesAsync(int maxCount = 1000, int daysToKeep = 7) + { + var cutoffDate = DateTime.Now.AddDays(-daysToKeep); + + var totalCount = await db.Queryable().CountAsync(); + + if (totalCount > maxCount) + { + var deleteCount = totalCount - maxCount; + + var oldMessages = await db.Queryable() + .OrderBy(x => x.CreatedAt) + .Take(deleteCount) + .ToListAsync(); + + if (oldMessages.Any()) + { + var ids = oldMessages.Select(x => x.Id).ToList(); + await db.Deleteable().In(ids).ExecuteCommandAsync(); + } + } + + await db.Deleteable() + .Where(x => x.CreatedAt < cutoffDate) + .ExecuteCommandAsync(); + } + } +} diff --git a/Build_God_Api/Build_God_Api/Services/CurrentUserService.cs b/Build_God_Api/Build_God_Api/Services/CurrentUserService.cs new file mode 100644 index 0000000..a78c151 --- /dev/null +++ b/Build_God_Api/Build_God_Api/Services/CurrentUserService.cs @@ -0,0 +1,35 @@ +namespace Build_God_Api.Services +{ + public interface ICurrentUserService + { + int UserId { get; } + bool IsAdmin { get; } + } + + public class CurrentUserService(IHttpContextAccessor accessor) : ICurrentUserService + { + private readonly IHttpContextAccessor _accessor = accessor; + + public int UserId + { + get + { + var idClaim = _accessor.HttpContext?.User.FindFirst("Id")?.Value; + if (int.TryParse(idClaim, out var id)) + return id; + return 0; + } + } + + public bool IsAdmin + { + get + { + var role = _accessor.HttpContext?.User.FindFirst("Role")?.Value; + if (!string.IsNullOrEmpty(role)) + return role == "admin"; + return false; + } + } + } +} diff --git a/Build_God_Api/Build_God_Api/Services/EquipmentService.cs b/Build_God_Api/Build_God_Api/Services/EquipmentService.cs new file mode 100644 index 0000000..91704bc --- /dev/null +++ b/Build_God_Api/Build_God_Api/Services/EquipmentService.cs @@ -0,0 +1,95 @@ +using Build_God_Api.DB; +using Build_God_Api.Dto; +using SqlSugar; + +namespace Build_God_Api.Services +{ + public interface IEquipmentService + { + public Task Add(EquipmentTemplate item); + + public Task Add(List items); + + public Task Delete(int id); + + public Task Update(EquipmentTemplate item); + + public Task> GetAll(SearchEquipmentDto dto); + + public Task ExistsByNameAsync(string name); + } + + public class EquipmentService(ISqlSugarClient db,ICurrentUserService currentUserService) : IEquipmentService + { + private readonly ISqlSugarClient db = db; + private readonly ICurrentUserService currentUserService = currentUserService; + + public async Task Add(EquipmentTemplate item) + { + var bo = await this.ExistsByNameAsync(item.Name); + + if (bo) + { + throw new Exception($"已存在名为{item.Name}的装备"); + } + item.CreatedOn = DateTime.UtcNow; + item.CreatedBy = currentUserService.UserId; + await db.Insertable(item).ExecuteCommandAsync(); + return true; + } + + public async Task Add(List items) + { + var bo = await db.Queryable().Where(x => items.Any(i => x.Name == i.Name)).AnyAsync(); + if (bo) + { + throw new Exception("存在重复的装备名称,添加失败"); + } + foreach(var item in items) + { + item.CreatedOn = DateTime.UtcNow; + item.CreatedBy = currentUserService.UserId; + } + await db.Insertable(items).ExecuteCommandAsync(); + return true; + } + + public async Task Delete(int id) + { + var item = await db.Queryable().FirstAsync(x => x.Id == id) ?? throw new Exception("没找到对应的装备"); + await db.Deleteable(item).ExecuteCommandAsync(); + return true; + } + + public async Task ExistsByNameAsync(string name) + { + return await db.Queryable().AnyAsync(x => x.Name == name); + } + + public async Task> GetAll(SearchEquipmentDto dto) + { + var list = await db.Queryable().Skip((dto.PageNumber - 1) * dto.PageSize).Take(dto.PageSize) + .WhereIF(dto.EquipmentType != null, x => (int)x.Type == dto.EquipmentType) + .OrderBy(x=>x.CreatedOn) + .ToListAsync(); + var total = await db.Queryable() + .WhereIF(dto.EquipmentType != null, x => (int)x.Type == dto.EquipmentType).CountAsync(); + var result = new PagedResult + { + PageNumber = 1, + TotalCount = total, + Items = list + }; + return result; + } + + public async Task Update(EquipmentTemplate item) + { + var equipment = await db.Queryable().FirstAsync(x => x.Id == item.Id) ?? throw new Exception("没找到对应装备"); + item.UpdatedOn = DateTime.UtcNow; + item.UpdatedBy = currentUserService.UserId; + await db.Updateable(item).ExecuteCommandAsync(); + return true; + } + } +} diff --git a/Build_God_Api/Build_God_Api/Services/Game/CharacterAttributeCalculateService.cs b/Build_God_Api/Build_God_Api/Services/Game/CharacterAttributeCalculateService.cs new file mode 100644 index 0000000..adb4991 --- /dev/null +++ b/Build_God_Api/Build_God_Api/Services/Game/CharacterAttributeCalculateService.cs @@ -0,0 +1,43 @@ +using Build_God_Api.DB; +using SqlSugar; + +namespace Build_God_Api.Services.Game +{ + /// + /// 角色属性计算服务 + /// + public interface ICharacterAttributeCalculateService + { + Task CalculateAndUpdateAttributesAsync(Character character); + } + + public class CharacterAttributeCalculateService(ISqlSugarClient context): ICharacterAttributeCalculateService + { + private readonly ISqlSugarClient _context = context; + + public async Task CalculateAndUpdateAttributesAsync(Character character) + { + Profession? profession = null; + if (character.ProfessionId.HasValue && character.ProfessionId > 0) + { + profession = await _context.Queryable().FirstAsync(x => x.Id == character.ProfessionId); + } + + // 无职业则默认系数为1 + decimal attackRate = profession?.AttackRate ?? 1m; + decimal defendRate = profession?.DefendRate ?? 1m; + decimal healthRate = profession?.HealthRate ?? 1m; + decimal criticalRate = profession?.CriticalRate ?? 1m; + + // 血量 = 基础值(100) + 等级 * 经验 * 5 * 生命系数 + character.MaxHP = 100 + character.LevelId * character.CurrentExp * 5 * healthRate; + + // 攻击力 = 基础值(10) + 等级 * 经验 * 2 * 攻击系数 + character.Attack = 10 + character.LevelId * character.CurrentExp * 2 * attackRate; + + await _context.Updateable(character).ExecuteCommandAsync(); + + return true; + } + } +} diff --git a/Build_God_Api/Build_God_Api/Services/Game/TrainingService.cs b/Build_God_Api/Build_God_Api/Services/Game/TrainingService.cs new file mode 100644 index 0000000..f7c7d27 --- /dev/null +++ b/Build_God_Api/Build_God_Api/Services/Game/TrainingService.cs @@ -0,0 +1,66 @@ +using Build_God_Api.DB; +using SqlSugar; + +namespace Build_God_Api.Services.Game +{ + /// + /// 角色修炼服务 + /// + public interface ITrainingService + { + /// + /// 开始修炼 + /// + /// + Task StartTraining(int characterId); + + Task EndTraining(int characterId); + + Task IsTraining(int characterId); + } + + public class TrainingService(ISqlSugarClient context,ICharacterAttributeCalculateService characterAttributeCalculateService) : ITrainingService + { + private readonly ISqlSugarClient _context = context; + private readonly ICharacterAttributeCalculateService characterAttributeCalculateService = characterAttributeCalculateService; + + public async Task StartTraining(int characterId) + { + var character = await _context.Queryable().FirstAsync(x => x.Id == characterId) ?? throw new Exception("意料之外的角色ID"); + + var isTraining = await IsTraining(characterId); + if (isTraining) + { + return false; + } + + character.TrainingOn = DateTime.UtcNow; + return true; + } + + public async Task IsTraining(int characterId) + { + var character = await _context.Queryable().FirstAsync(x => x.Id == characterId); + return character?.TrainingOn != null; + } + + public async Task EndTraining(int characterId) + { + var character = await _context.Queryable().FirstAsync(x => x.Id == characterId) ?? throw new Exception("意料之外的角色ID"); + var isTraining = await IsTraining(characterId); + if (!isTraining) + { + return false; + } + + var totalTime = DateTime.UtcNow - character.TrainingOn!.Value; + //基础修炼加成 + var exp = (decimal)totalTime.TotalMinutes; + character.CurrentExp += exp; + character.TrainingOn = null; + await characterAttributeCalculateService.CalculateAndUpdateAttributesAsync(character); + + return true; + } + } +} diff --git a/Build_God_Api/Build_God_Api/Services/IChatService.cs b/Build_God_Api/Build_God_Api/Services/IChatService.cs new file mode 100644 index 0000000..3c15e43 --- /dev/null +++ b/Build_God_Api/Build_God_Api/Services/IChatService.cs @@ -0,0 +1,11 @@ +using Build_God_Api.DB; + +namespace Build_God_Api.Services +{ + public interface IChatService + { + Task> GetRecentMessagesAsync(int count = 100); + Task AddMessageAsync(int? characterId, string characterName, string content, ChatMessageType type); + Task CleanupOldMessagesAsync(int maxCount = 1000, int daysToKeep = 7); + } +} diff --git a/Build_God_Api/Build_God_Api/Services/LevelService.cs b/Build_God_Api/Build_God_Api/Services/LevelService.cs new file mode 100644 index 0000000..2294769 --- /dev/null +++ b/Build_God_Api/Build_God_Api/Services/LevelService.cs @@ -0,0 +1,63 @@ +using Build_God_Api.DB; +using SqlSugar; + +namespace Build_God_Api.Services +{ + public interface ILevelService + { + public Task Add(Level item); + + public Task Delete(int id); + + public Task Update(Level item); + + public Task> GetAll(); + + public Task ExistsByNameAsync(string name); + } + + public class LevelService(ISqlSugarClient db, ICurrentUserService currentUserService) : ILevelService + { + private readonly ISqlSugarClient db = db; + private readonly ICurrentUserService currentUserService = currentUserService; + + public async Task Add(Level item) + { + var bo = await this.ExistsByNameAsync(item.Name); + if (bo) + { + throw new Exception($"已经添加过名为{item.Name}的境界"); + } + item.CreatedOn = DateTime.UtcNow; + item.CreatedBy = currentUserService.UserId; + await db.Insertable(item).ExecuteCommandAsync(); + return true; + } + + public async Task Delete(int id) + { + var item = await db.Queryable().FirstAsync(x => x.Id == id) ?? throw new Exception("没有找到对应境界"); + await db.Deleteable(item).ExecuteCommandAsync(); + return true; + } + + public async Task ExistsByNameAsync(string name) + { + return await db.Queryable().AnyAsync(x => x.Name == name); + } + + public async Task> GetAll() + { + return await db.Queryable().OrderBy(x => x.LevelId).ToListAsync(); + } + + public async Task Update(Level item) + { + var level = await db.Queryable().FirstAsync(x => x.Id == item.Id) ?? throw new Exception("没有找到对应境界"); + item.UpdatedOn = DateTime.UtcNow; + item.UpdatedBy = currentUserService.UserId; + await db.Updateable(item).ExecuteCommandAsync(); + return true; + } + } +} diff --git a/Build_God_Api/Build_God_Api/Services/MissionProgressService.cs b/Build_God_Api/Build_God_Api/Services/MissionProgressService.cs new file mode 100644 index 0000000..469f001 --- /dev/null +++ b/Build_God_Api/Build_God_Api/Services/MissionProgressService.cs @@ -0,0 +1,129 @@ +using Build_God_Api.DB; +using SqlSugar; + +namespace Build_God_Api.Services +{ + public interface IMissionProgressService + { + // 任务进度配置管理 + Task> GetByMissionId(int missionId); + Task GetById(int id); + Task Create(MissionProgress progress); + Task Update(MissionProgress progress); + Task Delete(int id); + + // 角色任务进度 + Task> GetCharacterProgress(int characterId, int missionId); + Task UpdateCharacterProgress(int characterId, int missionProgressId, int count); + Task InitCharacterProgress(int characterId, int missionId); + } + + public class MissionProgressService(ISqlSugarClient db) : IMissionProgressService + { + private readonly ISqlSugarClient db = db; + + // ============ 任务进度配置管理 ============ + + public async Task> GetByMissionId(int missionId) + { + return await db.Queryable() + .Where(x => x.MissionId == missionId) + .ToListAsync(); + } + + public async Task GetById(int id) + { + return await db.Queryable() + .FirstAsync(x => x.Id == id); + } + + public async Task Create(MissionProgress progress) + { + await db.Insertable(progress).ExecuteCommandAsync(); + return true; + } + + public async Task Update(MissionProgress progress) + { + var existing = await GetById(progress.Id); + if (existing == null) + throw new Exception("进度配置不存在"); + + existing.TargetType = progress.TargetType; + existing.TargetItemId = progress.TargetItemId; + existing.TargetItemName = progress.TargetItemName; + existing.TargetCount = progress.TargetCount; + existing.Description = progress.Description; + + await db.Updateable(existing).ExecuteCommandAsync(); + return true; + } + + public async Task Delete(int id) + { + await db.Deleteable().Where(x => x.Id == id).ExecuteCommandAsync(); + return true; + } + + // ============ 角色任务进度 ============ + + public async Task> GetCharacterProgress(int characterId, int missionId) + { + return await db.Queryable() + .Where(x => x.CharacterId == characterId && x.MissionId == missionId) + .ToListAsync(); + } + + public async Task UpdateCharacterProgress(int characterId, int missionProgressId, int count) + { + var progress = await db.Queryable() + .FirstAsync(x => x.CharacterId == characterId && x.MissionProgressId == missionProgressId); + + if (progress == null) + throw new Exception("角色进度不存在"); + + var missionProgress = await GetById(missionProgressId); + if (missionProgress == null) + throw new Exception("进度配置不存在"); + + progress.CurrentCount = count; + progress.IsCompleted = count >= missionProgress.TargetCount; + progress.UpdatedOn = DateTime.UtcNow; + + await db.Updateable(progress).ExecuteCommandAsync(); + return true; + } + + public async Task InitCharacterProgress(int characterId, int missionId) + { + // 检查是否已经初始化过 + var existing = await db.Queryable() + .AnyAsync(x => x.CharacterId == characterId && x.MissionId == missionId); + + if (existing) + return true; + + // 获取任务的进度配置 + var progresses = await GetByMissionId(missionId); + if (!progresses.Any()) + return true; // 没有进度配置,直接返回 + + // 为每个进度配置创建角色进度记录 + foreach (var progress in progresses) + { + var characterProgress = new CharacterMissionProgress + { + CharacterId = characterId, + MissionId = missionId, + MissionProgressId = progress.Id, + CurrentCount = 0, + IsCompleted = false, + UpdatedOn = DateTime.UtcNow + }; + await db.Insertable(characterProgress).ExecuteCommandAsync(); + } + + return true; + } + } +} diff --git a/Build_God_Api/Build_God_Api/Services/MissionService.cs b/Build_God_Api/Build_God_Api/Services/MissionService.cs new file mode 100644 index 0000000..d0be340 --- /dev/null +++ b/Build_God_Api/Build_God_Api/Services/MissionService.cs @@ -0,0 +1,166 @@ +using Build_God_Api.DB; +using Build_God_Api.Dto; +using SqlSugar; + +namespace Build_God_Api.Services +{ + public interface IMissionService + { + public Task Add(Mission item); + + public Task Delete(int id); + + public Task Update(Mission item); + + public Task> GetAll(SearchMissionDto dto); + + public Task ExistsByNameAsync(string name); + + public Task AddReward(MissionReward reward); + + public Task UpdateReward(MissionReward reward); + } + + public class MissionService(ISqlSugarClient db,ICurrentUserService currentUserService) : IMissionService + { + private readonly ISqlSugarClient db = db; + private readonly ICurrentUserService currentUserService = currentUserService; + + public async Task Add(Mission item) + { + var bo = await this.ExistsByNameAsync(item.Name); + if (bo) + { + throw new Exception($"已经创建过名为{item.Name}的任务"); + } + item.CreatedOn = DateTime.UtcNow; + item.CreatedBy = currentUserService.UserId; + await db.Insertable(item).ExecuteCommandAsync(); + return true; + } + + public async Task AddReward(MissionReward reward) + { + var item = await db.Queryable().FirstAsync(x => x.Id == reward.MissionId) ?? throw new Exception("没找到对应任务"); + var oldOne = await db.Queryable() + .FirstAsync(x => x.MissionId == reward.MissionId && x.RewardType == reward.RewardType && x.ItemId == reward.ItemId); + if (oldOne != null) + { + throw new Exception("已经添加过相同的奖励了"); + } + var newOne = new MissionReward + { + MissionId = reward.MissionId, + RewardType = reward.RewardType, + ItemId = reward.ItemId, + Count = reward.Count + }; + await db.Insertable(newOne).ExecuteCommandAsync(); + return true; + } + + public async Task Delete(int id) + { + var item = await db.Queryable().FirstAsync(x => x.Id == id) ?? throw new Exception("没找到对应的任务"); + await db.DeleteNav(item).Include(x => x.Rewards).Include(x => x.Progresses).ExecuteCommandAsync(); + return true; + } + + public Task ExistsByNameAsync(string name) + { + return db.Queryable().AnyAsync(x => x.Name == name); + } + + public async Task> GetAll(SearchMissionDto dto) + { + var list = await db.Queryable() + .Skip((dto.PageNumber - 1) * dto.PageSize) + .Take(dto.PageSize) + .WhereIF(dto.MissionType != null, x => (int)x.Type == dto.MissionType) + .OrderBy(x => x.CreatedOn) + .Includes(x => x.Rewards) + .Includes(x => x.Progresses) + .ToListAsync(); + + foreach(var mission in list) + { + if (mission.Rewards != null) + { + foreach(var reward in mission.Rewards) + { + switch (reward.RewardType) + { + case RewardType.Equipment: + var eq = await db.Queryable().FirstAsync(x => x.Id == reward.ItemId); + reward.ItemName = eq.Name; + break; + case RewardType.Pill: + var pill = await db.Queryable().FirstAsync(x => x.Id == reward.ItemId); + reward.ItemName = pill.Name; + break; + default: + reward.ItemName = string.Empty; + break; + } + } + } + + if (mission.Progresses != null) + { + foreach (var progress in mission.Progresses) + { + switch (progress.TargetType) + { + case ProgressTargetType.CollectItem: + case ProgressTargetType.ConsumeItem: + var pill = await db.Queryable().FirstAsync(x => x.Id == progress.TargetItemId); + progress.TargetItemName = pill?.Name; + break; + default: + break; + } + } + } + } + + var total = await db.Queryable() + .WhereIF(dto.MissionType != null, x => (int)x.Type == dto.MissionType) + .CountAsync(); + + var result = new PagedResult + { + PageNumber = 1, + TotalCount = total, + Items = list + }; + return result; + } + + public async Task Update(Mission item) + { + var task = await db.Queryable().FirstAsync(x => x.Id == item.Id) ?? throw new Exception("没找到对应任务"); + item.UpdatedBy = currentUserService.UserId; + item.UpdatedOn = DateTime.UtcNow; + await db.Updateable(item).ExecuteCommandAsync(); + return true; + } + + public async Task UpdateReward(MissionReward reward) + { + var task = await db.Queryable() + .FirstAsync(x => x.Id == reward.MissionId) ?? throw new Exception("没找到对应任务"); + + var oldOne = await db.Queryable() + .FirstAsync(x => x.MissionId == reward.MissionId + && x.RewardType == reward.RewardType) ?? throw new Exception("没有找到对应的奖励"); + + oldOne.Count = reward.Count; + oldOne.ItemId = reward.ItemId; + oldOne.UpdatedBy = currentUserService.UserId; + oldOne.UpdatedOn = DateTime.UtcNow; + + await db.Updateable(oldOne).ExecuteCommandAsync(); + return true; + } + } +} diff --git a/Build_God_Api/Build_God_Api/Services/PillService.cs b/Build_God_Api/Build_God_Api/Services/PillService.cs new file mode 100644 index 0000000..7dfbb18 --- /dev/null +++ b/Build_God_Api/Build_God_Api/Services/PillService.cs @@ -0,0 +1,63 @@ +using Build_God_Api.DB; +using SqlSugar; + +namespace Build_God_Api.Services +{ + public interface IPillService + { + public Task Add(Pill item); + + public Task Delete(int id); + + public Task Update(Pill item); + + public Task> GetAll(); + + public Task ExistsByNameAsync(string name); + } + + public class PillService(ISqlSugarClient db, ICurrentUserService currentUserService) : IPillService + { + private readonly ISqlSugarClient db = db; + private readonly ICurrentUserService currentUserService = currentUserService; + + public async Task Add(Pill item) + { + var bo = await ExistsByNameAsync(item.Name); + if (bo) + { + throw new Exception($"已经添加过名为{item.Name}的丹药"); + } + item.CreatedOn = DateTime.Now; + item.CreatedBy = currentUserService.UserId; + await db.Insertable(item).ExecuteCommandAsync(); + return true; + } + + public async Task Delete(int id) + { + var item = await db.Queryable().FirstAsync(x => x.Id == id) ?? throw new Exception("没有找到对应丹药"); + await db.Deleteable(item).ExecuteCommandAsync(); + return true; + } + + public async Task ExistsByNameAsync(string name) + { + return await db.Queryable().AnyAsync(x => x.Name == name); + } + + public async Task> GetAll() + { + return await db.Queryable().ToListAsync(); + } + + public async Task Update(Pill item) + { + var pill = await db.Queryable().FirstAsync(x => x.Id == item.Id) ?? throw new Exception("没有找到对应丹药"); + item.UpdatedOn = DateTime.UtcNow; + item.UpdatedBy = currentUserService.UserId; + await db.Updateable(item).ExecuteCommandAsync(); + return true; + } + } +} diff --git a/Build_God_Api/Build_God_Api/Services/SpiritService.cs b/Build_God_Api/Build_God_Api/Services/SpiritService.cs new file mode 100644 index 0000000..7249edf --- /dev/null +++ b/Build_God_Api/Build_God_Api/Services/SpiritService.cs @@ -0,0 +1,66 @@ +using Build_God_Api.DB; +using SqlSugar; + +namespace Build_God_Api.Services +{ + public interface IProfessionService + { + public Task Add(Profession item); + + public Task Delete(int id); + + public Task Update(Profession item); + + public Task> GetAll(); + + public Task ExistsByNameAsync(string name); + } + + /// + /// 职业服务 + /// + public class ProfessionService(ISqlSugarClient db,ICurrentUserService currentUserService) : IProfessionService + { + private readonly ISqlSugarClient db = db; + private readonly ICurrentUserService currentUserService = currentUserService; + + public async Task Add(Profession item) + { + var bo = await this.ExistsByNameAsync(item.Name); + if (bo) + { + throw new Exception($"已添加名为{item.Name}的职业"); + } + item.CreatedOn = DateTime.Now; + item.CreatedBy = currentUserService.UserId; + await db.Insertable(item).ExecuteCommandAsync(); + return true; + } + + public async Task Delete(int id) + { + var item = await db.Queryable().FirstAsync(x => x.Id == id) ?? throw new Exception("没找到对应的职业"); + await db.Deleteable(item).ExecuteCommandAsync(); + return true; + } + + public async Task ExistsByNameAsync(string name) + { + return await db.Queryable().AnyAsync(x => x.Name == name); + } + + public async Task> GetAll() + { + return await db.Queryable().ToListAsync(); + } + + public async Task Update(Profession item) + { + var profession = await db.Queryable().FirstAsync(x => x.Id == item.Id) ?? throw new Exception("没找到对应的职业"); + item.UpdatedOn = DateTime.UtcNow; + item.UpdatedBy = currentUserService.UserId; + await db.Updateable(item).ExecuteCommandAsync(); + return true; + } + } +} diff --git a/Build_God_Api/Build_God_Api/Services/StatisticsService.cs b/Build_God_Api/Build_God_Api/Services/StatisticsService.cs new file mode 100644 index 0000000..c6ff68c --- /dev/null +++ b/Build_God_Api/Build_God_Api/Services/StatisticsService.cs @@ -0,0 +1,56 @@ +using Build_God_Api.DB; +using SqlSugar; + +namespace Build_God_Api.Services +{ + public interface IStatisticsService + { + Task GetSummary(); + } + + public class StatisticsSummary + { + public int EquipmentCount { get; set; } + public int LevelCount { get; set; } + public int ProfessionCount { get; set; } + public int PillCount { get; set; } + public int MissionCount { get; set; } + public Dictionary EquipmentByRarity { get; set; } = new(); + public Dictionary MissionByDifficulty { get; set; } = new(); + } + + public class StatisticsService(ISqlSugarClient db) : IStatisticsService + { + private readonly ISqlSugarClient db = db; + + public async Task GetSummary() + { + var equipmentCount = await db.Queryable().CountAsync(); + var levelCount = await db.Queryable().CountAsync(); + var professionCount = await db.Queryable().CountAsync(); + var pillCount = await db.Queryable().CountAsync(); + var missionCount = await db.Queryable().CountAsync(); + + var equipmentByRarity = await db.Queryable() + .GroupBy(x => x.Rarity) + .Select(x => new { Rarity = x.Rarity, Count = SqlFunc.AggregateCount(x.Id) }) + .ToListAsync(); + + var missionByDifficulty = await db.Queryable() + .GroupBy(x => x.Difficulty) + .Select(x => new { Difficulty = x.Difficulty, Count = SqlFunc.AggregateCount(x.Id) }) + .ToListAsync(); + + return new StatisticsSummary + { + EquipmentCount = equipmentCount, + LevelCount = levelCount, + ProfessionCount = professionCount, + PillCount = pillCount, + MissionCount = missionCount, + EquipmentByRarity = equipmentByRarity.ToDictionary(x => (int)x.Rarity, x => x.Count), + MissionByDifficulty = missionByDifficulty.ToDictionary(x => (int)x.Difficulty, x => x.Count) + }; + } + } +} diff --git a/Build_God_Api/Build_God_Api/appsettings.json b/Build_God_Api/Build_God_Api/appsettings.json new file mode 100644 index 0000000..e18d96f --- /dev/null +++ b/Build_God_Api/Build_God_Api/appsettings.json @@ -0,0 +1,17 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "AllowedOrigins": "http://localhost:5174,http://localhost:5173", + "connection": "Host=47.105.124.101;Port=5432;Database=god;Username=God;Password=build_god.123;", + "JWT": { + "SecretKey": "If_you_have_a_dream_you_got_to_protect_it", + "Issuer": "BuildGod", + "Expires": 240, + "Audience": "ob" + } +} diff --git a/Build_God_Game/.gitignore b/Build_God_Game/.gitignore new file mode 100644 index 0000000..2b82f4f --- /dev/null +++ b/Build_God_Game/.gitignore @@ -0,0 +1,49 @@ +# 依赖包(npm/yarn/pnpm 安装的包) +node_modules/ +# 包管理锁文件(可选忽略,建议保留 pnpm-lock.yaml/yarn.lock,忽略 package-lock.json 避免冲突) +package-lock.json +yarn.lock +pnpm-lock.yaml +# 编译/构建产物 +dist/ +build/ +# Vite 特有临时文件 +.vite/ +# Vue CLI 特有配置/缓存 +.vue-cli-service/ +# 环境变量文件(存放本地开发的环境变量,包含敏感信息如接口密钥) +.env +.env.local +.env.*.local +# 日志文件 +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +# IDE/编辑器配置(根据你使用的工具选择) +.idea/ # WebStorm/IntelliJ +.vscode/ # VS Code(可保留 settings.json,排除其他) +!.vscode/extensions.json +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +.DS_Store # Mac 系统隐藏文件 +Thumbs.db # Windows 系统缩略图文件 +# 本地缓存/临时文件 +*.swp +*.swo +tmp/ +temp/ +# 测试相关(如有单元测试/端到端测试) +coverage/ # 测试覆盖率报告 +cypress/videos/ +cypress/screenshots/ +# 打包压缩文件 +*.zip +*.tar.gz +*.rar +# TypeScript 编译产物(如果用 TS 开发) +*.tsbuildinfo +types/ +# pnpm 存储目录 +.pnpm-store/ \ No newline at end of file diff --git a/Build_God_Game/.vs/Build_God_Game/CopilotIndices/17.14.1204.46620/CodeChunks.db b/Build_God_Game/.vs/Build_God_Game/CopilotIndices/17.14.1204.46620/CodeChunks.db new file mode 100644 index 0000000000000000000000000000000000000000..f3738eb4c5f7f59d05b6975442290b2c17f4566d GIT binary patch literal 102400 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 literal 0 HcmV?d00001 diff --git a/Build_God_Game/.vs/Build_God_Game/FileContentIndex/2099cff6-a572-4dd2-99fc-659228ba18be.vsidx b/Build_God_Game/.vs/Build_God_Game/FileContentIndex/2099cff6-a572-4dd2-99fc-659228ba18be.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..06fc80a43625624b88a97315307234f7af98d0a3 GIT binary patch literal 14810 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 literal 0 HcmV?d00001 diff --git a/Build_God_Game/.vs/Build_God_Game/FileContentIndex/440a4ccf-fbf1-4ea3-b521-123cfbcd8f11.vsidx b/Build_God_Game/.vs/Build_God_Game/FileContentIndex/440a4ccf-fbf1-4ea3-b521-123cfbcd8f11.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..94a536f4e09e4d06c5bf1940438cba141d1399fb GIT binary patch literal 115833 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

hzvLFnLMuY?&%BLN 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 literal 0 HcmV?d00001 diff --git a/Build_God_Game/.vscode/extensions.json b/Build_God_Game/.vscode/extensions.json new file mode 100644 index 0000000..a7cea0b --- /dev/null +++ b/Build_God_Game/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/Build_God_Game/README.md b/Build_God_Game/README.md new file mode 100644 index 0000000..33895ab --- /dev/null +++ b/Build_God_Game/README.md @@ -0,0 +1,5 @@ +# Vue 3 + TypeScript + Vite + +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` + + diff --git a/Build_God_Game/package.json b/Build_God_Game/package.json new file mode 100644 index 0000000..d8c21ad --- /dev/null +++ b/Build_God_Game/package.json @@ -0,0 +1,37 @@ +{ + "name": "build-god-game", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc -b && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@microsoft/signalr": "^10.0.0", + "@vueuse/core": "^14.2.1", + "axios": "^1.13.6", + "element-plus": "^2.13.5", + "jwt-decode": "^4.0.0", + "motion": "^12.35.2", + "ogl": "^1.0.11", + "pinia": "^3.0.4", + "three": "^0.183.2", + "vue": "^3.5.25", + "vue-router": "^5.0.3" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.2.1", + "@types/node": "^24.10.1", + "@types/three": "^0.183.1", + "@vitejs/plugin-vue": "^6.0.2", + "@vue/tsconfig": "^0.8.1", + "autoprefixer": "^10.4.27", + "postcss": "^8.5.8", + "tailwindcss": "^4.2.1", + "typescript": "~5.9.3", + "vite": "^7.3.1", + "vue-tsc": "^3.1.5" + } +} diff --git a/Build_God_Game/public/vite.svg b/Build_God_Game/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/Build_God_Game/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Build_God_Game/src/App.vue b/Build_God_Game/src/App.vue new file mode 100644 index 0000000..c048298 --- /dev/null +++ b/Build_God_Game/src/App.vue @@ -0,0 +1,6 @@ + + + diff --git a/Build_God_Game/src/api/auth.ts b/Build_God_Game/src/api/auth.ts new file mode 100644 index 0000000..527011d --- /dev/null +++ b/Build_God_Game/src/api/auth.ts @@ -0,0 +1,61 @@ +import axios from 'axios' + +const API_BASE_URL = '/api' + +const instance = axios.create({ + baseURL: API_BASE_URL, + timeout: 10000, + headers: { + 'Content-Type': 'application/json' + } +}) + +instance.interceptors.request.use( + (config) => { + const token = localStorage.getItem('auth_token') + if (token) { + config.headers.Authorization = `Bearer ${token}` + } + return config + }, + (error) => Promise.reject(error) +) + +instance.interceptors.response.use( + (response) => response.data, + (error) => { + if (error.response?.status === 401) { + localStorage.removeItem('auth_token') + localStorage.removeItem('user') + window.location.href = '/login' + } + return Promise.reject(error.response?.data || error.message) + } +) + +export interface LoginRequest { + name: string + password: string +} + +export interface RegisterRequest { + name: string + email: string + password: string +} + +export interface AuthResponse { + token: string +} + +export const authApi = { + login: (data: LoginRequest): Promise => { + return instance.post('/account/login', data) + }, + + register: (data: RegisterRequest): Promise => { + return instance.post('/account/register', data) + } +} + +export default instance diff --git a/Build_God_Game/src/api/character.ts b/Build_God_Game/src/api/character.ts new file mode 100644 index 0000000..47cfec5 --- /dev/null +++ b/Build_God_Game/src/api/character.ts @@ -0,0 +1,105 @@ +import axios from 'axios' + +const API_BASE_URL = '/api' +const API_GOD_URL = '/api/god' + +const instance = axios.create({ + baseURL: API_BASE_URL, + timeout: 10000, + headers: { + 'Content-Type': 'application/json' + } +}) + +instance.interceptors.request.use( + (config) => { + const token = localStorage.getItem('auth_token') + if (token) { + config.headers.Authorization = `Bearer ${token}` + } + return config + }, + (error) => Promise.reject(error) +) + +instance.interceptors.response.use( + (response) => response.data, + (error) => { + if (error.response?.status === 401) { + localStorage.removeItem('auth_token') + localStorage.removeItem('user') + window.location.href = '/login' + } + return Promise.reject(error.response?.data || error.message) + } +) + +export interface CharacterDto { + id: number + name: string + levelName: string + levelId: number + maxHP: number + attack: number + professionName?: string + money: number + currentExp: number + trainingOn?: string + nextLevelName?: string + nextLevelMinExp?: number + breakthroughRate: number + canBreakthrough: boolean + lastLogin: string + createdOn: string +} + +export interface ProfessionDto { + id: number + name: string + description: string + attackRate: number + defendRate: number + healthRate: number + criticalRate: number +} + +export interface CreateCharacterRequest { + name: string + professionId: number +} + +export const characterApi = { + getCharacterList: (): Promise => { + return instance.get('/character/list') + }, + + createCharacter: (data: CreateCharacterRequest): Promise => { + return instance.post('/character/register', data) + }, + + deleteCharacter: (characterId: number): Promise => { + return instance.delete(`/character/${characterId}`) + }, + + selectCharacter: (characterId: number): Promise => { + return instance.post(`/character/select/${characterId}`) + }, + + getProfessions: (): Promise => { + return instance.get(`/profession/all`) + }, + + startTraining: (characterId: number): Promise => { + return instance.post(`/character/${characterId}/training/start`) + }, + + stopTraining: (characterId: number): Promise => { + return instance.post(`/character/${characterId}/training/stop`) + }, + + breakthrough: (characterId: number): Promise => { + return instance.post(`/character/${characterId}/breakthrough`) + } +} + +export default instance diff --git a/Build_God_Game/src/assets/vue.svg b/Build_God_Game/src/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/Build_God_Game/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Build_God_Game/src/components/ChatBox.vue b/Build_God_Game/src/components/ChatBox.vue new file mode 100644 index 0000000..78d5c63 --- /dev/null +++ b/Build_God_Game/src/components/ChatBox.vue @@ -0,0 +1,338 @@ + + + + + diff --git a/Build_God_Game/src/components/GlareHover/GlareHover.vue b/Build_God_Game/src/components/GlareHover/GlareHover.vue new file mode 100644 index 0000000..f518c9e --- /dev/null +++ b/Build_God_Game/src/components/GlareHover/GlareHover.vue @@ -0,0 +1,113 @@ + + + diff --git a/Build_God_Game/src/components/GooeyNav/GooeyNav.vue b/Build_God_Game/src/components/GooeyNav/GooeyNav.vue new file mode 100644 index 0000000..1cee48e --- /dev/null +++ b/Build_God_Game/src/components/GooeyNav/GooeyNav.vue @@ -0,0 +1,389 @@ + + + + + diff --git a/Build_God_Game/src/components/Particles/Particles.vue b/Build_God_Game/src/components/Particles/Particles.vue new file mode 100644 index 0000000..ed70345 --- /dev/null +++ b/Build_God_Game/src/components/Particles/Particles.vue @@ -0,0 +1,347 @@ + + + + + diff --git a/Build_God_Game/src/composables/useChat.ts b/Build_God_Game/src/composables/useChat.ts new file mode 100644 index 0000000..5994852 --- /dev/null +++ b/Build_God_Game/src/composables/useChat.ts @@ -0,0 +1,106 @@ +import { ref, onUnmounted } from 'vue' +import * as signalR from '@microsoft/signalr' +import { useAuthStore } from '@/stores/auth' + +export interface ChatMessage { + id: number + characterId: number | null + characterName: string + content: string + type: 0 | 1 | 2 + createdAt: string +} + +export function useChat() { + const authStore = useAuthStore() + const messages = ref([]) + const isConnected = ref(false) + const connection = ref(null) + const isLoading = ref(false) + + const API_URL = 'http://localhost:5091' + + const connect = async () => { + if (connection.value) { + return + } + + const token = authStore.token + + connection.value = new signalR.HubConnectionBuilder() + .withUrl(`${API_URL}/hubs/chat`, { + accessTokenFactory: () => token, + }) + .withAutomaticReconnect() + .configureLogging(signalR.LogLevel.Information) + .build() + + connection.value.on('ReceiveMessage', (message: ChatMessage) => { + messages.value.push(message) + if (messages.value.length > 100) { + messages.value = messages.value.slice(0, 100) + } + }) + + try { + await connection.value.start() + isConnected.value = true + const history = await connection.value.invoke('GetRecentMessages', 100) + messages.value = history + } catch (err) { + console.error('SignalR connection failed:', err) + isConnected.value = false + } + + connection.value.onclose(() => { + isConnected.value = false + }) + + connection.value.onreconnecting(() => { + isConnected.value = false + }) + + connection.value.onreconnected(() => { + isConnected.value = true + }) + } + + const disconnect = async () => { + if (connection.value) { + await connection.value.stop() + connection.value = null + isConnected.value = false + } + } + + const sendMessage = async (content: string, type: 0 | 1 | 2 = 0) => { + if (!connection.value || !isConnected.value) { + console.warn('SignalR not connected') + return null + } + + try { + isLoading.value = true + const result = await connection.value.invoke('SendMessage', content, type) + return result + } catch (err) { + console.error('Send message failed:', err) + return null + } finally { + isLoading.value = false + } + } + + onUnmounted(() => { + disconnect() + }) + + return { + messages, + isConnected, + isLoading, + connect, + disconnect, + sendMessage + } +} diff --git a/Build_God_Game/src/main.ts b/Build_God_Game/src/main.ts new file mode 100644 index 0000000..495a430 --- /dev/null +++ b/Build_God_Game/src/main.ts @@ -0,0 +1,14 @@ +import { createApp } from 'vue' +import { createPinia } from 'pinia' +import './style.css' +import App from './App.vue' +import router from './router' +import ElementPlus from 'element-plus' +import 'element-plus/dist/index.css' + +const app = createApp(App) +app.use(ElementPlus) +app.use(createPinia()) +app.use(router) + +app.mount('#app') diff --git a/Build_God_Game/src/router/index.ts b/Build_God_Game/src/router/index.ts new file mode 100644 index 0000000..2a0937f --- /dev/null +++ b/Build_God_Game/src/router/index.ts @@ -0,0 +1,70 @@ +import { createRouter, createWebHistory } from 'vue-router' +import { useAuthStore } from '@/stores/auth' +import { useCharacterStore } from '@/stores/character' + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes: [ + { + path: '/', + redirect: '/login' + }, + { + path: '/login', + name: 'login', + component: () => import('@/views/LoginView.vue'), + meta: { requiresGuest: true } + }, + { + path: '/register', + name: 'register', + component: () => import('@/views/RegisterView.vue'), + meta: { requiresGuest: true } + }, + { + path: '/character', + name: 'character', + component: () => import('@/views/CharacterView.vue'), + meta: { requiresAuth: true } + }, + { + path: '/game', + name: 'game', + component: () => import('@/views/GameView.vue'), + meta: { requiresAuth: true } + }, + { + path: '/training', + name: 'training', + component: () => import('@/views/TrainingView.vue'), + meta: { requiresAuth: true } + } + ] +}) + +router.beforeEach((to, _from, next) => { + const authStore = useAuthStore() + const characterStore = useCharacterStore() + authStore.initAuth() + + if (to.meta.requiresAuth && !authStore.isAuthenticated) { + next('/login') + } else if (to.meta.requiresGuest && authStore.isAuthenticated) { + // 已登录用户访问登录/注册页,跳转到角色选择或游戏页面 + if (characterStore.characters.length > 0 && characterStore.currentCharacter) { + next('/game') + } else { + next('/character') + } + } else if (to.path === '/login' && authStore.isAuthenticated) { + // 访问登录页且已登录,跳转到角色选择 + next('/character') + } else if (to.path === '/game' && authStore.isAuthenticated && !characterStore.currentCharacter) { + // 访问游戏页但没有选择角色,跳转到角色选择 + next('/character') + } else { + next() + } +}) + +export default router diff --git a/Build_God_Game/src/stores/auth.ts b/Build_God_Game/src/stores/auth.ts new file mode 100644 index 0000000..dbd4712 --- /dev/null +++ b/Build_God_Game/src/stores/auth.ts @@ -0,0 +1,95 @@ +import { defineStore } from 'pinia' +import { ref, computed } from 'vue' +import { jwtDecode } from 'jwt-decode' +import { authApi, type LoginRequest, type RegisterRequest } from '@/api/auth' +import { useRouter } from 'vue-router' + +interface JwtPayload { + name: string + isAdmin: boolean + exp?: number +} + +export const useAuthStore = defineStore('auth', () => { + const token = ref('') + const username = ref('') + const isAdmin = ref(false) + const isLoading = ref(false) + const router = useRouter() + + const isAuthenticated = computed(() => !!token.value) + + const initAuth = () => { + const storedToken = localStorage.getItem('auth_token') + if (storedToken) { + try { + const decoded = jwtDecode(storedToken) + if (decoded.exp && decoded.exp * 1000 < Date.now()) { + logout() + } else { + token.value = storedToken + username.value = decoded.name + isAdmin.value = decoded.isAdmin || false + } + } catch { + logout() + } + } + } + + const login = async (credentials: LoginRequest): Promise => { + isLoading.value = true + try { + const response = await authApi.login(credentials) + token.value = response.token + localStorage.setItem('auth_token', response.token) + + const decoded = jwtDecode(response.token) + username.value = decoded.name + isAdmin.value = decoded.isAdmin || false + localStorage.setItem('user', JSON.stringify({ name: decoded.name, isAdmin: decoded.isAdmin })) + + return true + } catch (error) { + console.error('Login failed:', error) + return false + } finally { + isLoading.value = false + } + } + + const register = async (data: RegisterRequest): Promise => { + isLoading.value = true + try { + await authApi.register(data) + return true + } catch (error) { + console.error('Register failed:', error) + return false + } finally { + isLoading.value = false + } + } + + const logout = () => { + token.value = '' + username.value = '' + isAdmin.value = false + localStorage.removeItem('auth_token') + localStorage.removeItem('user') + } + + initAuth() + + return { + token, + username, + isAdmin, + isLoading, + isAuthenticated, + login, + register, + logout, + initAuth + } +}) diff --git a/Build_God_Game/src/stores/character.ts b/Build_God_Game/src/stores/character.ts new file mode 100644 index 0000000..f10e66c --- /dev/null +++ b/Build_God_Game/src/stores/character.ts @@ -0,0 +1,174 @@ +import { defineStore } from 'pinia' +import { ref } from 'vue' +import { characterApi, type CharacterDto, type CreateCharacterRequest, type ProfessionDto } from '@/api/character' + +export const useCharacterStore = defineStore('character', () => { + const characters = ref([]) + const currentCharacter = ref(null) + const professions = ref([]) + const isLoading = ref(false) + + const fetchCharacters = async (): Promise => { + isLoading.value = true + try { + const data = await characterApi.getCharacterList() + characters.value = data || [] + return true + } catch (error) { + console.error('Failed to fetch characters:', error) + return false + } finally { + isLoading.value = false + } + } + + const fetchProfessions = async (): Promise => { + try { + const data = await characterApi.getProfessions() + professions.value = data || [] + return true + } catch (error) { + console.error('Failed to fetch professions:', error) + return false + } + } + + const createCharacter = async (name: string, professionId: number): Promise => { + isLoading.value = true + try { + const data: CreateCharacterRequest = { name, professionId } + await characterApi.createCharacter(data) + await fetchCharacters() + return true + } catch (error) { + console.error('Failed to create character:', error) + return false + } finally { + isLoading.value = false + } + } + + const deleteCharacter = async (characterId: number): Promise => { + isLoading.value = true + try { + await characterApi.deleteCharacter(characterId) + await fetchCharacters() + return true + } catch (error) { + console.error('Failed to delete character:', error) + return false + } finally { + isLoading.value = false + } + } + + const selectCharacter = async (characterId: number): Promise => { + isLoading.value = true + try { + await characterApi.selectCharacter(characterId) + const char = characters.value.find(c => c.id === characterId) + if (char) { + currentCharacter.value = char + localStorage.setItem('current_character', JSON.stringify(char)) + } + return true + } catch (error) { + console.error('Failed to select character:', error) + return false + } finally { + isLoading.value = false + } + } + + const initCurrentCharacter = () => { + const stored = localStorage.getItem('current_character') + if (stored) { + try { + currentCharacter.value = JSON.parse(stored) + } catch { + currentCharacter.value = null + } + } + } + + const clearCurrentCharacter = () => { + currentCharacter.value = null + localStorage.removeItem('current_character') + } + + const startTraining = async (): Promise => { + if (!currentCharacter.value) return false + isLoading.value = true + try { + await characterApi.startTraining(currentCharacter.value.id) + currentCharacter.value.trainingOn = new Date().toISOString() + localStorage.setItem('current_character', JSON.stringify(currentCharacter.value)) + return true + } catch (error) { + console.error('Failed to start training:', error) + return false + } finally { + isLoading.value = false + } + } + + const stopTraining = async (): Promise => { + if (!currentCharacter.value) return 0 + isLoading.value = true + try { + const expGained = await characterApi.stopTraining(currentCharacter.value.id) + currentCharacter.value.trainingOn = undefined + currentCharacter.value.currentExp += expGained + localStorage.setItem('current_character', JSON.stringify(currentCharacter.value)) + return expGained + } catch (error) { + console.error('Failed to stop training:', error) + return 0 + } finally { + isLoading.value = false + } + } + + const breakthrough = async (): Promise<{ success: boolean; message: string }> => { + if (!currentCharacter.value) return { success: false, message: '角色不存在' } + isLoading.value = true + try { + const result = await characterApi.breakthrough(currentCharacter.value.id) + await fetchCharacters() + const updatedChar = characters.value.find(c => c.id === currentCharacter.value!.id) + if (updatedChar) { + currentCharacter.value = updatedChar + localStorage.setItem('current_character', JSON.stringify(updatedChar)) + } + if (result) { + return { success: true, message: '突破成功' } + } else { + return { success: false, message: '突破失败,请再接再厉' } + } + } catch (error: any) { + console.error('Failed to breakthrough:', error) + return { success: false, message: error?.message || '突破失败' } + } finally { + isLoading.value = false + } + } + + initCurrentCharacter() + + return { + characters, + currentCharacter, + professions, + isLoading, + fetchCharacters, + fetchProfessions, + createCharacter, + deleteCharacter, + selectCharacter, + initCurrentCharacter, + clearCurrentCharacter, + startTraining, + stopTraining, + breakthrough + } +}) diff --git a/Build_God_Game/src/style.css b/Build_God_Game/src/style.css new file mode 100644 index 0000000..d16b809 --- /dev/null +++ b/Build_God_Game/src/style.css @@ -0,0 +1,27 @@ +@import "tailwindcss"; + +@theme { + --font-sans: 'Microsoft YaHei', 'PingFang SC', sans-serif; +} + +:root { + font-family: var(--font-sans); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html, body, #app { + width: 100%; + min-height: 100vh; + touch-action: manipulation; +} + +body { + overflow-x: hidden; +} diff --git a/Build_God_Game/src/views/CharacterView.vue b/Build_God_Game/src/views/CharacterView.vue new file mode 100644 index 0000000..fb4e3fa --- /dev/null +++ b/Build_God_Game/src/views/CharacterView.vue @@ -0,0 +1,705 @@ + + + + + diff --git a/Build_God_Game/src/views/GameView.vue b/Build_God_Game/src/views/GameView.vue new file mode 100644 index 0000000..59c400a --- /dev/null +++ b/Build_God_Game/src/views/GameView.vue @@ -0,0 +1,444 @@ + + + + + diff --git a/Build_God_Game/src/views/LoginView.vue b/Build_God_Game/src/views/LoginView.vue new file mode 100644 index 0000000..3948367 --- /dev/null +++ b/Build_God_Game/src/views/LoginView.vue @@ -0,0 +1,294 @@ + + + + + diff --git a/Build_God_Game/src/views/RegisterView.vue b/Build_God_Game/src/views/RegisterView.vue new file mode 100644 index 0000000..54482e7 --- /dev/null +++ b/Build_God_Game/src/views/RegisterView.vue @@ -0,0 +1,333 @@ + + + + + diff --git a/Build_God_Game/src/views/TrainingView.vue b/Build_God_Game/src/views/TrainingView.vue new file mode 100644 index 0000000..736a41f --- /dev/null +++ b/Build_God_Game/src/views/TrainingView.vue @@ -0,0 +1,304 @@ + + + + + diff --git a/Build_God_Game/tsconfig.app.json b/Build_God_Game/tsconfig.app.json new file mode 100644 index 0000000..9d430dc --- /dev/null +++ b/Build_God_Game/tsconfig.app.json @@ -0,0 +1,21 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "types": ["vite/client"], + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + }, + + /* Linting */ + "strict": false, + "noUnusedLocals": false, + "noUnusedParameters": false, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true, + "strictNullChecks": false + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"] +} diff --git a/Build_God_Game/tsconfig.json b/Build_God_Game/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/Build_God_Game/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/Build_God_Game/tsconfig.node.json b/Build_God_Game/tsconfig.node.json new file mode 100644 index 0000000..8a67f62 --- /dev/null +++ b/Build_God_Game/tsconfig.node.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/Build_God_Game/vite.config.ts b/Build_God_Game/vite.config.ts new file mode 100644 index 0000000..caaf80e --- /dev/null +++ b/Build_God_Game/vite.config.ts @@ -0,0 +1,30 @@ +import { fileURLToPath, URL } from 'node:url' +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import tailwindcss from '@tailwindcss/vite' + +export default defineConfig({ + plugins: [ + vue(), + tailwindcss(), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + }, + }, + server: { + port: 5174, + proxy: { + '/api': { + target: 'http://localhost:5091', + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, '/api/god') + }, + '/hubs': { + target: 'http://localhost:5091', + changeOrigin: true + } + } + } +}) diff --git a/Build_God_Game/模拟导图.xls b/Build_God_Game/模拟导图.xls new file mode 100644 index 0000000000000000000000000000000000000000..ae203f0c0edc40e3fef1747ff0eb4e9eabe779e5 GIT binary patch literal 26624 zcmeHQ2V4|K+n+lQI0U43g#%F#5GjJ#;1F!F_ZYhZqM{O8u%JY-W5cf43zkGpEHP0d zmc)ieiNt6$K~0P$wj@e4D&Or@?uU}VGR0u>u;OGCse~|}X0oF(;JPU{_h?Wqs z%&j4+A=*H!0?`(t9YlMGRUtY+gepLsAUZ>If#?d+4Wc_l4~U)+y&!r+^nq9nVs(hV z5d9!(Ao@cLfLH@!AjFywYe5Wx7!0vC#1M#~5W^tWfr#}DV+8z;5?%inx&1!|Y9}%R z{zgMtG$X^|Jd%t9k5)doLycjXQG%LAjYmR?=#exRPQr2Bs@i#1_FYrdh07wWXb`$X z>LbZeGJxV3DiHt1(U~X}EPXszMimkE=`Kh%BV8cpS&;K&(jSifD`P+;;|l33;2PUc zWz$FXDT158d!5M`G7SFuQ{T6OQb?mdLCR<{7=8~&1rs4ymw#-#l}#Vp@*SN$8#T0I zD@$_F{+#vE90jq0#(#q-$!^tAI1+LbVlR>jeS_j{@(wuZ9isVHgr*cje+6PF0tYuy zSP=!#ETBh08k9R6UFdNal{!R^O=xcftanms#K8&gP;V=>RBkRk2GC))?J7qfc#Vu0Jpm^h&4zAX+#7{FSxaFs;?>r zZo{6&#CwuXB$cF)-X;|5!@b)}t{4t!nMzII`Kl7(mhWp?)qKj#$Y8i%M-fF|qR{~i zfnPjlNN+?8xrTW+CJ_MM37}enu9p7xRdt5}LTw>2Q^_FRR07B|WqKSGQA5-D5VC6w zt6^fM<%EP2pb2m*EMJ3Qz!PaKUs7}O+!>QFmsDM7`))+h3x;3fQmPH5)C-1ShV)+G zZC_ObsF~izRd^jSrQ8T=r;k*bfi|A1z!lPN1}SUIshdL}HsnQi!^l>_^UN@4NEsc< z67sYHhqx>hX^^gfOG^K}a&+u%jmev$qg7+_|DWj!I+eg2Vi5d{Lw@RqKLjeLhnb+; zn4s4-K@TxXhw+aKK!PKa2!i0L>x0%)`_rxN^w6ES0SoScd1Fc%Z#^>j(Ta3V+L7dtsEvt0)G>r(t!^BMh! z-w{8evY~XG@G-g|FVJxkDA3c=1o`?@9w&yBeu?x0{4f_3@Ze-oNAIuIMCkK{6G%$m ztMk7qgxbMLr6IizrQ<}?kRD3uU{FGjpmdy&8p`{brOWMjny_EbgdL$i$kP@4EVplp z9{o4%oAQGx`wdLk7yK{BFVN-q-A(u>(u92<6Z9|>c1+Q$o3LZb|3dwd;}`4@xINH* z31?O`uzm@r6i}=6w+2Q>d7xv(u7tcLvyTlNgHo`A^J1DVb}SfxK2hyTCbDZvY);-; z+qX)#x(>-UpkwP%!Xgb!OQ{^65Lboar&6wf&5A4JkR1ICTBndLNdeoN6)X!0DSZ6# z$9jb-MrhVXXlf%gm5x?XQLMLT0x=dCM-0+`rGPb8P{2t#Mixw@fa_H}g~^jAOH)Xc z_yiZXEMV;HO0DZF3{bHoOr$C`f~#Zyun}BdV@4_xDv3l|iEw?+tiu*c^6v)<*7`aj zb{MM@Vj8OxVj8OxVw%2A6tB=10IS&v31js%T`5XIX$(LmBqZn+7$`A~ffCagC^3zJ z`t{de_4YU@o`wlf{sy4Lxn-clGzLmcW1z$|bD&;i%NmH(Qvn8`#JOdl#54vn&@p^^IqdIeT33sV0QNwD6C zDW8CVKA6Z3F4YS@u^_2wZ|GQD>t{xa+q|I>+$>;5qN0r%(dPwzn8*(9HZUW?z6eud zojSY5vk4=(UBQf`rs>wasU9;@iOLo(GE&^;4UOQUJ3|r`ZOjOTr8}6&PK3yauusI4 zSa#Soo=q4Lwwti+U_HV477NTsC47SWJ}f)MZQjsGw8%(Qv@s(L8Jq!K=9C^Ayq<_(QB5*dk#Hf96_^ua`S8iN4KjDfKU2F^CHLJGS@cQVc_lqI380!bi8NWvagMq#TgZO&U=W~7D<%2)duB2wB` zs0iZqT-@g!Cn?s zY~aZOD2qk&Q#;DMrE~>vA%}@-1ko2pMBS+93%#g6imsotY=YdXJBT7juG^7D8F)Y$a6VJ3foiW8Zysn$%@fo(pXDJCfwjnJ)K3P?!V7>QM-a7! zXD1Xyk=-L-?Fp_#q7W1c?+OLU?txc}l-BTg1&BTDEf@0vv4_0{F&h$u2`d-WX(vlq zQ4JDCjv(p=y98>YXxP^xZ$@hOo(0QCP7$hEEkhWp>J@4tl@d(&!?r?IqKJYWs+vRt zdp#PNV7?lwA&Lt@q4KS$3L8zPHBfGm(jT^?z;rz`f^yS-VA`ApGaZViWB-%yh6> zpEA>K&`e}L#hzU1)7mnhvL4+Z_WI5G6wOI}8e-O`+;psYpBghAYSyRRbba$aHD)@@ ztWTL~HxeiJX^at{){*%Xrx8M@*TB3_(VWz$;bwixO*b^}Q)8yr-ahjWm|~G}eeuBV|6tS(V_^Cgy#L=A=H2GV4=rI^MibjhT)%>r-wz!Msn6nXYHn zr-JE$YIibFbU${dZoE)*A}*qfCF$?B{fGA-lsYmzYgmSTaoZ}#HICXF+3Vk1aHamh zgTc)Pe0+B2!Dl3?z&r8ex{|fuUH<9T)cWUta4lWc+P+6vfwleY)N|o8KY2Vctk7rc z)t1%12+O!}((U%$EYH(>=eqpR>eQ%?*)>WRO#5)(bXLQDN0g}e$eCGe4iNCBQ>5RIq2j10cH+Q?)>GjHK z0l}RrEZ00ZeWG2p4eq(?hO~=b^TUKmen-k*E)4DN7g#Uui(ZaPV~>@55p0*)Fr`L* zJMSA0CY2u>?x~(t;`i@BNenq`ftcvZf0T@$ZcDr?Q!*-b8~2iD$mcy;y2-2Q># zAKMi^9#)(+CGgO%r_aya7=2;Yh1DZnOUF7VmqfJes2uWW&F{xvO*>!J@{4V*L;AHG z*M9Jc(4vcbH^tBSG`*v5LBLgYV)@L~PoG$LS-INS_<8r=H2KE)*GsDJU1rxg)SMgd2EL}mr2OwcUO-u{AQcmi+aR zq+7LD-YJjw#Y`-GXK>d>Rr^dG@K(uP?}oF_>}wa(!ec??#uxIe(J^W>C*=c zYuVOgrhm|ij9kAob(Q|xo|gXhs85s0-iOA&{_*9FJ-^LJSd%b*^y|mg8_zm5PQH7> zed6f?fCf5uXpv0e|>GfN9^lmj}l%#FZ}AIHh9D4W_3T$`t|;vpt_&G{PB|! zeiO>9tJ!B{tqpuzRsV61%sDm7R#nX#+Q9em;tvN zPJM4iQpID%u5%9??SD2Pe$k2O-=4<3n{zVnVy#=>lV06N^>BLlRmrT$BjfkH`-x-2 zr{}IW-L~lJ`LL-wTTKk<89BDN@%rE;=~Fs~Sv;NFHu724d-ENGcAiW*wW8lZuWL0D zU7SX=e34S-IJoxcmd>ZnUK^y@bamFbC#%<;-ul)3*!VFEJ2=i9pZ93sz1%0>D_br8 zqsz07O&{d=`Fs7D_shBG7rq>mo7<*+L~7!o+-Z+bU;D9a*OK4wUxIAP0gCz_3H zwIzOaimee{eYhZ|I{@xej6(PIkx1_fTfdgz?pqpM?UG%h>Qv+<13 zbK_kePX2bocj-&l^xHc7Y0Z1RXH2@h{`e=KCym(t)8xozmZ9BDJ4acHq z>z$U~Z|>X9dgjfAQIX4bzuLXF@7IM{({0y=FW!;qS~35?=Jb#9Ggn@{TR1q=>OI$x zru`$5d(^0Q{Czv$MRqp>FQr*twCOd_u4esl*)E@_^g0#m{L$&pw&eGy?i>*55Zuc9 z#?I3VTiLaZ>H2-ht=H`?#;JCsPpT8w>(VbrI@GV({`#Sg!{1*P?(iflZ$?SlmY59( z`t|v(+wnB*sy>Yy+FFhNa)kf7A+JF8k|tw+vY zP zp+k$uBWq7?+;Ld93Hu&@@`7|)_NSfp zwQP2GWJ;etL2l1VSI;JKg-ufjDW`N?ob&$uQy#Z7&Q4vmtl;gbv)-vP%)8QeW&X*Gl0yO8=B0c_Pd5&-T&a^TY*Dt_l3Uu=lx-dZ#!(-{_Ur(hll=l z-txz8J#3S1eetaQo@Nyv_N%ZgvMOJHcJGZdW14S{sIHy*tU_h_W{5Y;z9UmJM$sE4 zzn^UWrts&_fENoZfcP+xAQO&~)8>CQx)Az{!OR z-|c(ZZ}}Rpve-6XKXvbPxqiQ$^S7R^*mFFhcuo7GlXr#v)J!$J{^B-+e;lxWYu#I& z4=>o7y8V*xg?$H}eD#^44eu^_cjeJx2Y#8S?d0BW)|EynyZcR#l$ZH4-ashP)fX(c34@l=T)5dtU-1C z+P*kiK0EP);jlvUL14)rkk@LkZR!H&o=GEyk4_yv zx^I_pnW>|CKQ8S0 zXL*~FE={*;+%v+i-1_wAtX@0IZ><~ax#+hpcf0mUpO%t+YwM2R|GZuMU};EX2aBme zAN;OZ)aUXtkDqQkM%2E$rOVwl4X$}D%9vkc(>3eBZF}SA6@5H+wN1Z-bxEUoyVn15 z{D8poS!XVcd7e`z!@Ar22@T>`CRfYvR(^7h%Z?JqV`X8xm#?fI^F#2Jrl&TK`h3xN zkCG+n>7$lLbe&`smc1)#p#kVqCG!^D494AV7%u`NAcr3>_(v<44T;XI!%ENRpO&rrpd6*9J z+>G$>A$H{9x~o(VmSZUoWu!cOG92|#M#{s7z>$ZKoA*;-Zl?jRI{2^+u~Kv<>Ch8k z&k#xJ&AUkHQIuZNRZ5R0E1~7C6t!GT1p|`upgnbizoQB@M0juZo|3#INwg)QS78so z)r7)H@bYwv&V`e-1IV(kCgrV!=QO?=S~3oQLQm+C^DH%(l#Hv5-J)<|)u}c-i&F)X zD1%3iup(k57G4&2G$@YEV9HqbS^#C(o5e-2on9qrxJwl zIH9)a_j-7O!v;{nQxNcnm|($Ve?RzFmcY&mQUF_+1BBJ*ie&f>Lo(<*kNu} z^cw9)SJ&#V;i(A{?Z){Q*im}$YZd6Fx$|o%Kn1f$l-R6=4`&D+rCN#AAAbuktZNkx z1Zh}3q%_Q>l!o1tlqTF84eenylFA7~EJHbLs8Ts}pp=GPrId!XOG?A8QA)#_D5YUn zD5asVq%`dMq%`!Pl!hILl!hIXl!hIWl!k3VO2hgprD4Y-rD2C7rC~=SrC|pnrD4Y; zrD2C8rQ!aVlvdpc4POBf%e|uQpTLj?gK(uFO=(>du9U#TS|(gsz!lan;YtM^64tCq zN_gQG&R7zU6RhBUV{9SGaD}0VmY$&J@J%7fAXnsTL9AiUjbciwgaVK8$wLSr2D(%X zo{(vOyt>BHzZu3Nd0n5F^oI z;@FQdjI*>zrilYakmDG!aZ@E=J8DsgVWeUVBYwhyVH~WbQm|YLrT`DNvb0i;9c>voPmjndYwt;yxgN>RTc7Rw@snhf& zO2`29HfX*s@?|-}-b;j;&Y4~ZiJYv1hzl0^_a*wjtPtwC4;KqUF>F=cfC0#(A8tYJ`XXuQcU1UhH1zt zaiRhyc(G2O#|C1yfXR|$(oW`>z-Uo2s0x@YMVK@k6X@zOVV{ebJSisp9E#3Qo~7bM z1x!{VOijgX#N-1}@28?EoQ>o|DmP&J5(}tdwuBZrtueImSW%b&0z#mcp5R`Z40?K) zcpE^N)hJABJCNNhv}7tYxX3EqDZNgzdny|k`w z4f%r$GbGqSqA-RYVzz*!3P+-y&)Ez~6_HOwEtny}yFMDPMUmL*k@QO-i3a@|RsdU$ zMB9fag?*a9*4Ofgg`CZhz`O2{lu&)5IGZ7{(;*3_NbK}Th^M6-2@Z6bPX=&X42d20 zNl`v$GbDDR(y7PU3<-{K(0B+%Vy{QC?qU@=5*&EzkZ4l5Er!INBk8c1vl$X-F`zBn z9b-6~A;EDK8V{pL;ITbjJ;^!ZC`W?dSkfWMN$0j0lByg@*%HoXNUDlTr#@#R85?(1 znAjO<+?XE5a0<{t4={6us~jMXv~>VA89WIF(18QYT*lc9po6H;MBP3D#Kw(7OEexq zk>Idg*QAJ-9El@GLNa+$42dI0LRN4#L*hu02!+;=vl$W`&?1sZio{8eWWmeoawIrQ z)A_`4B)7$oIB_HkR&q8&;zW@MO{y_xGbA{SM&nTw35-c}KG7EY%aPzGzH~^mqq!}H z#F-<}6mT{};w&nic+O@>aPW@CqbU;jE|U()@`r&O36gR6y?8IL1JfzucGRZz|cq3RSJC}zHO%) zt!dYCHbdenLZanth6Lv@Xgr1@fzJi$kOU`%$&t8mBnu{RTg)eJ97*~*&SprUS+jiP zByu)Gf-@&X5=)V|>yh+Jh>#<3=SZ}ZxGjdnog;}@&)E!#J4GT?X3-c5$=CzAL#;5< z1K~6d0oJDgJ@fz%Er^l>#21Tng*G#XBVYh=;KvKvz*)$~Ymj%ejbs&OPaGr28>q#8$3wwbdT5`3$S4Y^uyHba6- z5s0J-MN(alWc;e8awOF`l9sc%Erz5zN3wMbXEP-DvYKw76C#>i66pSQ zrIWcLS&jsz$W$2Q#ba-V1m;q#bTSL&NbnsvUFnckoQ+5>!xGCaxK+KaY)&@8-x;zP z{tC%@c-Wc$@vF_0%C7~Pc%?JhkF!Ujg_wdrAk2XW7v>1J33{CZnWzpxEZ{~50as@5 z*9ssLn?Y(1GDsv0%N6(y2Mf3#nO+zcmM5t-IN-wYKXXwS`nCV~MPasR%X|R!3Cn_B zYT@{oWg#dECGx+r_=gtg{~cu^6yJaH5vvw7aOk1TfBzf5w~Z5GoQmQk5U;U)%h}PkH#2HODVXLj@_SK+eDZ zOcP~&-(Q^#@vZrpDhmfA_#IV(y!1>JK%VNGIWs*^yse`Bvj3-NItGA|h!EgR%OP2J z4JW)V(p?snJ76DSLyjgAk{eD4UMnQmO3^ir9saTK8hkHo*cjSDSY^}J{`$Oqy5o+8 zY7!c>=Sl?74nV|;j{KGoA>?#`1Lp8;h*@BTb8k{p&O*a<3@xcTSJ(bMTw^sE zYUMz9Vx}pa2Sck&f#+OOfrEjKS6ac=ayPg}TZl6Wp3BRi^*IB6vHw4z6Ij3}^yGQK zc86^nKO_+Y$2#zQP89slHjxk`AVyIt9)yrlX8+nQJLk}?^9Szi2@CnM)gXjD(4WYk))4w(RA7@l*#Q*>R literal 0 HcmV?d00001