From 99a442abc2fac0f6940132bf762e4afdcc4da696 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E6=B1=89?= <5725748+qin_and_han_dynasties@user.noreply.gitee.com> Date: Sun, 29 Mar 2026 17:06:40 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=84=E5=88=92=E4=BA=86=E6=97=A5=E5=B8=B8?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=9A=84=E7=BB=8F=E9=AA=8C=E6=9E=84=E6=88=90?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E6=88=90=E9=95=BF=E6=9B=B2=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Frontend/src/views/admin/MissionView.vue | 26 +++--- Build_God_Api/Build_God_Api/DB/Mission.cs | 14 +-- .../Build_God_Api/DB/MissionReward.cs | 4 +- .../Services/DailyMissionService.cs | 82 ++++++++++++++---- Build_God_Game/src/api/dailyMission.ts | 6 +- Build_God_Game/src/api/index.ts | 9 +- .../src/components/StarBorder/StarBorder.vue | 2 +- Build_God_Game/src/views/DailyMissionView.vue | 45 ++++++++-- Build_God_Game/src/views/LoginView.vue | 5 +- Build_God_Game/模拟导图.xls | Bin 28160 -> 36352 bytes 10 files changed, 138 insertions(+), 55 deletions(-) diff --git a/Build_God_Admin_Frontend/Frontend/src/views/admin/MissionView.vue b/Build_God_Admin_Frontend/Frontend/src/views/admin/MissionView.vue index f5e95e4..c8cca2c 100644 --- a/Build_God_Admin_Frontend/Frontend/src/views/admin/MissionView.vue +++ b/Build_God_Admin_Frontend/Frontend/src/views/admin/MissionView.vue @@ -347,18 +347,18 @@ const onRewardItemChange = (id: number) => { } const saveReward = async (missionId?: number) => { - console.log('missionId',missionId); - console.log('isedit',isEditingReward.value) + console.log('missionId', missionId); + console.log('isedit', isEditingReward.value) if (isEditingReward.value) { var index = missions.value.findIndex(x => x.id == rewardFormData.value.missionId) if (index > -1) { var result = await UpdateReward(rewardFormData.value) - if(result){ + if (result) { ElMessage.success('任务奖励修改成功') closeRewardDialog() await refreshMissions() } - else{ + else { ElMessage.error('修改失败') } } @@ -675,7 +675,7 @@ const fetchEquipments = async (): Promise => { - + @@ -698,14 +698,17 @@ const fetchEquipments = async (): Promise => { - - + + - + @@ -733,14 +736,15 @@ const fetchEquipments = async (): Promise => { - + {{ value.description }} - + @@ -763,7 +767,7 @@ const fetchEquipments = async (): Promise => { - + diff --git a/Build_God_Api/Build_God_Api/DB/Mission.cs b/Build_God_Api/Build_God_Api/DB/Mission.cs index dcf9b03..d1abfa2 100644 --- a/Build_God_Api/Build_God_Api/DB/Mission.cs +++ b/Build_God_Api/Build_God_Api/DB/Mission.cs @@ -95,10 +95,7 @@ namespace Build_God_Api.DB MainStory = 1, [Description("日常任务")] - DailyTask = 2, - - [Description("采集任务")] - BranchTask = 3 + DailyTask = 2 } /// @@ -106,16 +103,13 @@ namespace Build_God_Api.DB /// public enum MissionDifficulty { - [Description("简单")] - Easy = 1, - [Description("普通")] - Normal = 2, + Normal = 1, [Description("困难")] - Hard = 3, + Hard = 2, [Description("炼狱")] - Purgatory = 4 + Purgatory = 3 } } diff --git a/Build_God_Api/Build_God_Api/DB/MissionReward.cs b/Build_God_Api/Build_God_Api/DB/MissionReward.cs index 5743c91..5d7fb2b 100644 --- a/Build_God_Api/Build_God_Api/DB/MissionReward.cs +++ b/Build_God_Api/Build_God_Api/DB/MissionReward.cs @@ -43,9 +43,7 @@ namespace Build_God_Api.DB Pill = 1, [Description("装备")] Equipment = 2, - [Description("经验")] - Exp = 3, [Description("灵石")] - Money = 4 + Money = 3 } } diff --git a/Build_God_Api/Build_God_Api/Services/DailyMissionService.cs b/Build_God_Api/Build_God_Api/Services/DailyMissionService.cs index d112cff..e087b15 100644 --- a/Build_God_Api/Build_God_Api/Services/DailyMissionService.cs +++ b/Build_God_Api/Build_God_Api/Services/DailyMissionService.cs @@ -46,6 +46,9 @@ namespace Build_God_Api.Services public DateTime? EndTime { get; set; } public bool IsFromYesterday { get; set; } public DateTime AssignedDate { get; set; } + public int ExpReward { get; set; } + public int TodayClaimedCount { get; set; } + public int TodayTotalCount { get; set; } public List Rewards { get; set; } = new(); } @@ -69,9 +72,23 @@ namespace Build_God_Api.Services private readonly ILogger _logger = logger; private const int DailyMissionCount = 5; + private const int HardMissionCount = 2; + private const int PurgatoryMissionCount = 1; private static readonly TimeZoneInfo BeijingTimeZone = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time"); + private int CalculateExpReward(MissionDifficulty difficulty, int levelId) + { + var coefficient = difficulty switch + { + MissionDifficulty.Normal => 2, + MissionDifficulty.Hard => 4, + MissionDifficulty.Purgatory => 6, + _ => 2 + }; + return coefficient * levelId * levelId * levelId; + } + private DateTime GetBeijingTime() { return TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, BeijingTimeZone); @@ -88,12 +105,20 @@ namespace Build_God_Api.Services var yesterday = today.AddDays(-1); var dailyMissions = await _db.Queryable() - .Where(x => x.CharacterId == characterId && x.Status != DailyMissionStatus.Claimed) + .Where(x => x.CharacterId == characterId) .Where(x => x.AssignedDate == today || x.AssignedDate == yesterday) .OrderByDescending(x => x.AssignedDate) .OrderByDescending(x => x.IsFromYesterday) .ToListAsync(); + var character = await _db.Queryable() + .FirstAsync(x => x.Id == characterId) + ?? throw new Exception("角色不存在"); + + var todayMissions = dailyMissions.Where(x => x.AssignedDate == today).ToList(); + var todayClaimedCount = todayMissions.Count(x => x.Status == DailyMissionStatus.Claimed); + var todayTotalCount = todayMissions.Count; + var result = new List(); foreach (var dm in dailyMissions) @@ -117,7 +142,10 @@ namespace Build_God_Api.Services StartTime = dm.StartTime, EndTime = dm.EndTime, IsFromYesterday = dm.IsFromYesterday, - AssignedDate = dm.AssignedDate + AssignedDate = dm.AssignedDate, + ExpReward = CalculateExpReward(mission.Difficulty, character.LevelId), + TodayClaimedCount = todayClaimedCount, + TodayTotalCount = todayTotalCount }; if (mission.Rewards != null) @@ -143,6 +171,13 @@ namespace Build_God_Api.Services public async Task AcceptMission(int characterId, int dailyMissionId) { + var existingInProgress = await _db.Queryable() + .Where(x => x.CharacterId == characterId && x.Status == DailyMissionStatus.InProgress) + .AnyAsync(); + + if (existingInProgress) + throw new Exception("已有任务在执行中,请先完成当前任务"); + var dailyMission = await _db.Queryable() .FirstAsync(x => x.Id == dailyMissionId && x.CharacterId == characterId) ?? throw new Exception("任务不存在"); @@ -184,17 +219,16 @@ namespace Build_God_Api.Services .FirstAsync(x => x.Id == characterId) ?? throw new Exception("角色不存在"); + var expReward = CalculateExpReward(mission.Difficulty, character.LevelId); + character.CurrentExp += expReward; + _logger.LogInformation("角色 {CharacterId} 领取任务奖励:经验 +{ExpReward}", characterId, expReward); + if (mission.Rewards != null) { foreach (var reward in mission.Rewards) { switch (reward.RewardType) { - case RewardType.Exp: - character.CurrentExp += reward.Count; - _logger.LogInformation("角色 {CharacterId} 领取任务奖励:经验 +{Count}", characterId, reward.Count); - break; - case RewardType.Money: character.Money += reward.Count; _logger.LogInformation("角色 {CharacterId} 领取任务奖励:灵石 +{Count}", characterId, reward.Count); @@ -212,10 +246,10 @@ namespace Build_God_Api.Services break; } } - - await _db.Updateable(character).ExecuteCommandAsync(); } + await _db.Updateable(character).ExecuteCommandAsync(); + dailyMission.Status = DailyMissionStatus.Claimed; await _db.Updateable(dailyMission).ExecuteCommandAsync(); @@ -275,16 +309,31 @@ namespace Build_God_Api.Services } var random = new Random(); - var filteredMissions = availableMissions - .Where(x => random.Next(100) < (int)x.ObtainPercentage) - .ToList(); - var selectedMissions = filteredMissions - .OrderBy(x => random.Next()) + var normalMissions = availableMissions + .Where(x => x.Difficulty == MissionDifficulty.Normal) + //.Where(x => random.Next(100) < (int)x.ObtainPercentage) + //.OrderBy(x => random.Next()) .Take(DailyMissionCount) .ToList(); - foreach (var mission in selectedMissions) + var hardMissions = availableMissions + .Where(x => x.Difficulty == MissionDifficulty.Hard) + //.Where(x => random.Next(100) < (int)x.ObtainPercentage) + //.OrderBy(x => random.Next()) + .Take(HardMissionCount) + .ToList(); + + var purgatoryMissions = availableMissions + .Where(x => x.Difficulty == MissionDifficulty.Purgatory) + //.Where(x => random.Next(100) < (int)x.ObtainPercentage) + //.OrderBy(x => random.Next()) + .Take(PurgatoryMissionCount) + .ToList(); + + var allSelectedMissions = normalMissions.Concat(hardMissions).Concat(purgatoryMissions).ToList(); + + foreach (var mission in allSelectedMissions) { var dailyMission = new CharacterDailyMission { @@ -299,7 +348,8 @@ namespace Build_God_Api.Services await _db.Insertable(dailyMission).ExecuteCommandAsync(); } - _logger.LogInformation("为角色 {CharacterId} 分配了 {Count} 个每日任务", characterId, selectedMissions.Count); + _logger.LogInformation("为角色 {CharacterId} 分配了 {Count} 个每日任务(普通:{NormalCount}, 困难:{HardCount}, 炼狱:{PurgatoryCount})", + characterId, allSelectedMissions.Count, normalMissions.Count, hardMissions.Count, purgatoryMissions.Count); } } } diff --git a/Build_God_Game/src/api/dailyMission.ts b/Build_God_Game/src/api/dailyMission.ts index 8302cdf..f148739 100644 --- a/Build_God_Game/src/api/dailyMission.ts +++ b/Build_God_Game/src/api/dailyMission.ts @@ -9,8 +9,7 @@ export type DailyMissionStatus = typeof DailyMissionStatus[keyof typeof DailyMis export const RewardType = { Pill: 1, Equipment: 2, - Exp: 3, - Money: 4 + Money: 3 } as const export type RewardType = typeof RewardType[keyof typeof RewardType] export interface MissionReward { @@ -33,6 +32,9 @@ export interface DailyMission { endTime?: string isFromYesterday: boolean assignedDate: string + expReward: number + todayClaimedCount: number + todayTotalCount: number rewards: MissionReward[] } export const dailyMissionApi = { diff --git a/Build_God_Game/src/api/index.ts b/Build_God_Game/src/api/index.ts index 6e80220..f48556c 100644 --- a/Build_God_Game/src/api/index.ts +++ b/Build_God_Game/src/api/index.ts @@ -30,7 +30,14 @@ instance.interceptors.response.use( if (error.code === 'ERR_NETWORK' || error.code === 'ECONNABORTED' || !error.response) { window.location.href = '/404' } - return Promise.reject(error.response?.data || error.message) + const responseData = error.response?.data + if (typeof responseData === 'string') { + return Promise.reject({ data: responseData, message: responseData }) + } + if (responseData?.message) { + return Promise.reject({ data: responseData.message, message: responseData.message }) + } + return Promise.reject(error.response?.data || { data: error.message, message: error.message }) } ) diff --git a/Build_God_Game/src/components/StarBorder/StarBorder.vue b/Build_God_Game/src/components/StarBorder/StarBorder.vue index a003478..f46ed76 100644 --- a/Build_God_Game/src/components/StarBorder/StarBorder.vue +++ b/Build_God_Game/src/components/StarBorder/StarBorder.vue @@ -30,7 +30,7 @@