From 1927e3f96002ba216d22b8bcb5c0e5e276069e58 Mon Sep 17 00:00:00 2001 From: Putoo <290555932@qq.com> Date: Fri, 5 Jun 2026 18:06:38 +0800 Subject: [PATCH] 12121 --- Kx.SeaTime.sln.DotSettings.user | 1 + .../game/user/unit_user_skill.cs | 57 +++++++++ .../model/MapResModel.cs | 11 ++ .../resource/game/game_city_map_res.cs | 12 +- .../resource/game/game_skill.cs | 45 +++++++ Service/Application.Domain/Enum/SkillEnum.cs | 19 +++ .../Services/Interface/Map/IGameMapService.cs | 6 +- .../Interface/Skill/IGameSkillService.cs | 11 ++ .../Services/Service/Map/GameMapService.cs | 65 +++++++++- .../Service/Skill/GameSkillService.cs | 120 ++++++++++++++++++ .../Controllers/Map/MapController.cs | 85 ++++++++++++- .../Controllers/User/UserController.cs | 17 ++- Web/src/assets/css/style.css | 27 ++-- Web/src/pages/map/index.vue | 60 ++++++++- Web/src/pages/user/skill/index.vue | 50 +++++++- Web/src/services/map/MapService.ts | 8 ++ Web/src/services/user/UserService.ts | 8 ++ 17 files changed, 575 insertions(+), 27 deletions(-) create mode 100644 Service/Application.Domain.Entity/game/user/unit_user_skill.cs create mode 100644 Service/Application.Domain.Entity/model/MapResModel.cs create mode 100644 Service/Application.Domain.Entity/resource/game/game_skill.cs create mode 100644 Service/Application.Domain/Enum/SkillEnum.cs create mode 100644 Service/Application.Domain/Services/Interface/Skill/IGameSkillService.cs create mode 100644 Service/Application.Domain/Services/Service/Skill/GameSkillService.cs diff --git a/Kx.SeaTime.sln.DotSettings.user b/Kx.SeaTime.sln.DotSettings.user index a34a065..f1f5bbe 100644 --- a/Kx.SeaTime.sln.DotSettings.user +++ b/Kx.SeaTime.sln.DotSettings.user @@ -6,6 +6,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded diff --git a/Service/Application.Domain.Entity/game/user/unit_user_skill.cs b/Service/Application.Domain.Entity/game/user/unit_user_skill.cs new file mode 100644 index 0000000..bbfa7ac --- /dev/null +++ b/Service/Application.Domain.Entity/game/user/unit_user_skill.cs @@ -0,0 +1,57 @@ +using SqlSugar; +using System; + +namespace Application.Domain.Entity +{ + [Tenant("Kg.SeaTime.Game")] + public class unit_user_skill + { + /// + /// usId + /// + [SugarColumn(IsPrimaryKey = true, Length = 50)] + public string usId { get; set; } + + /// + /// userId + /// + [SugarColumn(Length = 50, IsNullable = true)] + public string? userId { get; set; } + + /// + /// skill + /// + [SugarColumn(IsNullable = true)] + public int? skill { get; set; } + + /// + /// code + /// + [SugarColumn(Length = 50, IsNullable = true)] + public string? code { get; set; } + + /// + /// name + /// + [SugarColumn(Length = 50, IsNullable = true)] + public string? name { get; set; } + + /// + /// lev + /// + [SugarColumn(IsNullable = true)] + public int? lev { get; set; } + + /// + /// sign + /// + [SugarColumn(IsNullable = true)] + public string? sign { get; set; } + + /// + /// remark + /// + [SugarColumn(IsNullable = true)] + public string? remark { get; set; } + } +} \ No newline at end of file diff --git a/Service/Application.Domain.Entity/model/MapResModel.cs b/Service/Application.Domain.Entity/model/MapResModel.cs new file mode 100644 index 0000000..cf34d27 --- /dev/null +++ b/Service/Application.Domain.Entity/model/MapResModel.cs @@ -0,0 +1,11 @@ +namespace Application.Domain.Entity; + +public class MapResModel +{ + public string resId { get; set; } + public string resName { get; set; } + public int lev { get; set; } + public long lockTime { get; set; } + public int needVigour { get; set; } + public int gather { get; set; } +} \ No newline at end of file diff --git a/Service/Application.Domain.Entity/resource/game/game_city_map_res.cs b/Service/Application.Domain.Entity/resource/game/game_city_map_res.cs index 4c38dca..bdb1788 100644 --- a/Service/Application.Domain.Entity/resource/game/game_city_map_res.cs +++ b/Service/Application.Domain.Entity/resource/game/game_city_map_res.cs @@ -18,6 +18,12 @@ namespace Application.Domain.Entity [SugarColumn(Length = 50, IsNullable = true)] public string? mapId { get; set; } + /// + /// 等级 + /// + [SugarColumn(IsNullable = true)] + public int? lev { get; set; } + /// /// 资源名称 /// @@ -45,8 +51,8 @@ namespace Application.Domain.Entity /// /// 成功率 /// - [SugarColumn(Length = 18, IsNullable = true)] - public decimal? okRadio { get; set; } + [SugarColumn(IsNullable = true)] + public int? okRadio { get; set; } /// /// 采集锁定时间 @@ -54,4 +60,4 @@ namespace Application.Domain.Entity [SugarColumn(IsNullable = true)] public int? gatherTime { get; set; } } -} +} \ No newline at end of file diff --git a/Service/Application.Domain.Entity/resource/game/game_skill.cs b/Service/Application.Domain.Entity/resource/game/game_skill.cs new file mode 100644 index 0000000..1862deb --- /dev/null +++ b/Service/Application.Domain.Entity/resource/game/game_skill.cs @@ -0,0 +1,45 @@ +using SqlSugar; +using System; + +namespace Application.Domain.Entity +{ + [Tenant("Kg.SeaTime.Resource")] + public class game_skill + { + /// + /// skill + /// + [SugarColumn(IsPrimaryKey = true)] + public int skill { get; set; } + + /// + /// code + /// + [SugarColumn(Length = 50, IsNullable = true)] + public string? code { get; set; } + + /// + /// name + /// + [SugarColumn(Length = 50, IsNullable = true)] + public string? name { get; set; } + + /// + /// lev + /// + [SugarColumn(IsNullable = true)] + public int? lev { get; set; } + + /// + /// sign + /// + [SugarColumn(IsNullable = true)] + public string? sign { get; set; } + + /// + /// remark + /// + [SugarColumn(IsNullable = true)] + public string? remark { get; set; } + } +} \ No newline at end of file diff --git a/Service/Application.Domain/Enum/SkillEnum.cs b/Service/Application.Domain/Enum/SkillEnum.cs new file mode 100644 index 0000000..91daae9 --- /dev/null +++ b/Service/Application.Domain/Enum/SkillEnum.cs @@ -0,0 +1,19 @@ +namespace Application.Domain; + +public static class SkillEnum +{ + public enum code + { + GATHER,//采集术 + FISH,//钓鱼术 + DIVE,//潜水术 + NEGOTI,//谈判术 + FINANC,//理财术 + ATK,//攻击术 + DEFENCE,//防御术 + AGILE,//敏捷术 + RIDI,//乘骑术 + WING,//翼形术 + Collect,//采集术 + } +} \ No newline at end of file diff --git a/Service/Application.Domain/Services/Interface/Map/IGameMapService.cs b/Service/Application.Domain/Services/Interface/Map/IGameMapService.cs index 7acdb86..d4ec39b 100644 --- a/Service/Application.Domain/Services/Interface/Map/IGameMapService.cs +++ b/Service/Application.Domain/Services/Interface/Map/IGameMapService.cs @@ -65,7 +65,11 @@ public interface IGameMapService #region 地图资源 + Task GetMapResInfo(string resId); Task> GetMapRes(string mapId); - + Task> GetMapResData(string mapId, int area); + Task GetMapResLockTime(string resId, int area); + Task SetMapResLockTime(string resId, int area, int lockTime); + #endregion } \ No newline at end of file diff --git a/Service/Application.Domain/Services/Interface/Skill/IGameSkillService.cs b/Service/Application.Domain/Services/Interface/Skill/IGameSkillService.cs new file mode 100644 index 0000000..ecb1c18 --- /dev/null +++ b/Service/Application.Domain/Services/Interface/Skill/IGameSkillService.cs @@ -0,0 +1,11 @@ +namespace Application.Domain; + +public interface IGameSkillService +{ + Task GetGameSkillInfo(int skillId); + Task GetUserSkillInfo(string userId, string code); + Task> GetUserSkillAttr(string userId); + Task> GetUserSkill(string userId); + Task UpdateUserSkill(string userId, int skillId); + +} \ No newline at end of file diff --git a/Service/Application.Domain/Services/Service/Map/GameMapService.cs b/Service/Application.Domain/Services/Service/Map/GameMapService.cs index 716f752..ed31d1e 100644 --- a/Service/Application.Domain/Services/Service/Map/GameMapService.cs +++ b/Service/Application.Domain/Services/Service/Map/GameMapService.cs @@ -877,14 +877,15 @@ public class GameMapService(ISqlSugarClient DbClient, IRedisCache redis) : IGame public async Task GetMapBusInfo(int busId) { - string key = string.Format(BaseCache.BaseCacheKeys, "CITY_MAP_BUS","BUS_INFO"); + string key = string.Format(BaseCache.BaseCacheKeys, "CITY_MAP_BUS", "BUS_INFO"); if (await redis.HExistsHashAsync(key, busId.ToString())) { return await redis.GetHashAsync(key, busId.ToString()); } + var db = DbClient.AsTenant().GetConnectionWithAttr(); - var data = await db.Queryable().Where(it => it.busId == busId).SingleAsync(); - await redis.AddHashAsync(key,busId.ToString(), data); + var data = await db.Queryable().Where(it => it.busId == busId).SingleAsync(); + await redis.AddHashAsync(key, busId.ToString(), data); return data; } @@ -924,7 +925,19 @@ public class GameMapService(ISqlSugarClient DbClient, IRedisCache redis) : IGame #endregion #region 地图资源 + public async Task GetMapResInfo(string resId) + { + string key = string.Format(BaseCache.BaseCacheKeys, "CityData", "MapResInfo"); + var data = await redis.GetHashAsync(key, resId); + if (data == null) + { + var db = DbClient.AsTenant().GetConnectionWithAttr(); + data = await db.Queryable().Where(it => it.resId == resId).SingleAsync(); + await redis.AddHashAsync(key, resId, data); + } + return data; + } public async Task> GetMapRes(string mapId) { string key = string.Format(BaseCache.BaseCacheKeys, "CityData", "MapRes"); @@ -933,12 +946,56 @@ public class GameMapService(ISqlSugarClient DbClient, IRedisCache redis) : IGame { var db = DbClient.AsTenant().GetConnectionWithAttr(); data = await db.Queryable().Where(it => it.mapId == mapId).ToListAsync(); - await redis.AddHashAsync(key, mapId,data); + await redis.AddHashAsync(key, mapId, data); } return data; } + public async Task> GetMapResData(string mapId, int area) + { + var data = await GetMapRes(mapId); + List result = new List(); + foreach (var item in data) + { + long lockTime = await GetMapResLockTime(item.resId, area); + MapResModel temp = new MapResModel() + { + resId = item.resId, + resName = item.resName, + lev = (int)item.lev, + lockTime = lockTime, + needVigour = (int)item.needVigour, + gather = (int)item.gatherTime + }; + result.Add(temp); + } + + return result; + } + + public async Task GetMapResLockTime(string resId, int area) + { + long result = 0; + string key = string.Format(BaseCache.BaseCacheKeys, "CityData", "MapResLockTime"); + string field = $"{area}_{resId}"; + if (await redis.HExistsHashAsync(key, field)) + { + long lockTime = await redis.GetHashAsync(key, field); + result = lockTime - TimeExtend.GetTimeStampSeconds; + result = result <= 0 ? 0 : result; + } + + return result; + } + + public async Task SetMapResLockTime(string resId, int area, int lockTime) + { + string key = string.Format(BaseCache.BaseCacheKeys, "CityData", "MapResLockTime"); + string field = $"{area}_{resId}"; + long atTime = TimeExtend.GetTimeStampSeconds + lockTime; + await redis.AddHashAsync(key, field, atTime); + } #endregion } \ No newline at end of file diff --git a/Service/Application.Domain/Services/Service/Skill/GameSkillService.cs b/Service/Application.Domain/Services/Service/Skill/GameSkillService.cs new file mode 100644 index 0000000..fe0d87d --- /dev/null +++ b/Service/Application.Domain/Services/Service/Skill/GameSkillService.cs @@ -0,0 +1,120 @@ +using Newtonsoft.Json; + +namespace Application.Domain; + +public class GameSkillService(ISqlSugarClient DbClient, IRedisCache redis) : IGameSkillService, ITransient +{ + public async Task GetGameSkillInfo(int skillId) + { + string key = string.Format(BaseCache.BaseCacheKeys, "SkillData", "SkillInfo"); + var data = await redis.GetHashAsync(key, skillId.ToString()); + if (data == null) + { + var db = DbClient.AsTenant().GetConnectionWithAttr(); + data = await db.Queryable().Where(it => it.skill == skillId).SingleAsync(); + await redis.AddHashAsync(key, skillId.ToString(), data); + } + + return data; + } + + private string GetUserSkillKey(string userId, string code) + { + return $"{userId}_{code}"; + } + + public async Task GetUserSkillInfo(string userId, string code) + { + string usId = GetUserSkillKey(userId, code); + string key = string.Format(BaseCache.BaseCacheKeys, "SkillData", "UserSkill"); + if (await redis.HExistsHashAsync(key,usId)) + { + return await redis.GetHashAsync(key,usId); + } + else + { + var db = DbClient.AsTenant().GetConnectionWithAttr(); + var data = await db.Queryable().Where(it => it.usId == usId).SingleAsync(); + await redis.AddHashAsync(key,usId, data); + return data; + } + } + + public async Task> GetUserSkillAttr(string userId) + { + List result = new List(); + string key = string.Format(BaseCache.BaseCacheKeys, "SkillData", "UserSkillAttr"); + if (await redis.HExistsHashAsync(key,userId)) + { + result = await redis.GetHashAsync>(key,userId); + } + else + { + var data = await GetUserSkill(userId); + foreach (var item in data) + { + if (item.code == nameof(SkillEnum.code.ATK) || item.code ==nameof(SkillEnum.code.DEFENCE) || + item.code == nameof(SkillEnum.code.AGILE)) + { + List attr = JsonConvert.DeserializeObject>(item.sign); + result.AddRange(attr); + } + } + + await redis.AddHashAsync(key,userId, result); + } + return result; + } + + public async Task> GetUserSkill(string userId) + { + var db = DbClient.AsTenant().GetConnectionWithAttr(); + return await db.Queryable().Where(it => it.userId == userId) + .OrderBy(it => it.name, OrderByType.Asc).ToListAsync(); + } + + private async Task ClearUserSkillInfo(string userId, string code) + { + string usId = GetUserSkillKey(userId, code); + string key = string.Format(BaseCache.BaseCacheKeys, "SkillData", "UserSkill"); + await redis.DelHashAsync(key,usId); + key = string.Format(BaseCache.BaseCacheKeys, "SkillData", "UserSkillAttr"); + await redis.DelHashAsync(key); + } + + public async Task UpdateUserSkill(string userId, int skillId) + { + bool result = false; + var skillInfo = await GetGameSkillInfo(skillId); + if (skillInfo != null) + { + unit_user_skill usInfo = new unit_user_skill(); + usInfo.usId = GetUserSkillKey(userId, skillInfo.code); + usInfo.userId = userId; + usInfo.code = skillInfo.code; + usInfo.skill = skillInfo.skill; + usInfo.name = skillInfo.name; + usInfo.lev = skillInfo.lev; + usInfo.sign = skillInfo.sign; + usInfo.remark = skillInfo.remark; + var userSkill = await GetUserSkillInfo(userId, skillInfo.code); + if (userSkill == null) + { + var db = DbClient.AsTenant().GetConnectionWithAttr(); + result = await db.Insertable(usInfo).ExecuteCommandAsync() > 0; + } + else if (userSkill.lev < skillInfo.lev) + { + var db = DbClient.AsTenant().GetConnectionWithAttr(); + result = await db.Updateable(usInfo).ExecuteCommandAsync() > 0; + } + } + + if (result) + { + await ClearUserSkillInfo(userId, skillInfo.code); + } + + return result; + } +} \ No newline at end of file diff --git a/Service/Application.Web/Controllers/Map/MapController.cs b/Service/Application.Web/Controllers/Map/MapController.cs index 39490e0..5bdfe45 100644 --- a/Service/Application.Web/Controllers/Map/MapController.cs +++ b/Service/Application.Web/Controllers/Map/MapController.cs @@ -18,10 +18,11 @@ public class MapController : ControllerBase private readonly IMessageService _messageService; private readonly IUnitUserWeight _weightService; private readonly IUnitUserAccService _accService; - + private readonly IGameSkillService _skillService; + private readonly IGameGoodsService _goodsService; public MapController(IUnitUserService userService, IGameMapService mapService, IGameChatService chatService, IUnitUserAttrService attrService, IMessageService messageService, IUnitUserWeight weightService, - IUnitUserAccService accService) + IUnitUserAccService accService, IGameSkillService skillService,IGameGoodsService goodsService) { _userService = userService; _mapService = mapService; @@ -30,6 +31,8 @@ public class MapController : ControllerBase _messageService = messageService; _weightService = weightService; _accService = accService; + _skillService = skillService; + _goodsService = goodsService; } #region 地图相关 @@ -118,10 +121,10 @@ public class MapController : ControllerBase } //地图资源 - List mapRes = new List(); + List mapRes = new List(); if (mapInfo.isRes == 1) { - mapRes = await _mapService.GetMapRes(mapInfo.mapId); + mapRes = await _mapService.GetMapResData(mapInfo.mapId, area); } #endregion @@ -635,4 +638,78 @@ public class MapController : ControllerBase } #endregion + + #region 采集相关 + + /// + /// 采集接口 + /// + /// + /// + [HttpGet] + public async Task CollectMapRes(string resId) + { + var resInfo = await _mapService.GetMapResInfo(resId); + if (resInfo == null) + { + return PoAction.Message("特产不存在!"); + } + + var userId = StateHelper.userId; + int area = StateHelper.areaId; + var onMap = await _mapService.GetUserOnMap(userId); + if (onMap.mapId != resInfo.mapId) + { + return PoAction.Message("特产不存在!"); + } + + long lockTime = await _mapService.GetMapResLockTime(resId, area); + if (lockTime > 0) + { + return PoAction.Message($"{lockTime}秒后可采集!"); + } + + var skillInfo = await _skillService.GetUserSkillInfo(userId, nameof(SkillEnum.code.Collect)); + if (skillInfo == null) + { + return PoAction.Message("未学习采集术!"); + } + + if (skillInfo.lev < resInfo.lev) + { + return PoAction.Message($"需要{resInfo.lev}级采集术才可以采集哦!"); + } + + var myVigour = await _attrService.GetUserVigourInfo(userId); + Console.WriteLine($"{myVigour.vitality }-{resInfo.needVigour}"); + if (myVigour.vitality < resInfo.needVigour) + { + return PoAction.Message("活力不足!"); + } + + if (await _attrService.UpdateUserVigour(userId, 0, (int)resInfo.needVigour)) + { + await _mapService.SetMapResLockTime(resId, area, (int)resInfo.gatherTime); + if (RandomAssist.CheakRandom((int)resInfo.okRadio)) + { + //采集成功 + string[] counts = resInfo.count.Split('-'); + int onCount = + RandomAssist.GetFormatedNumeric(Convert.ToInt32(counts[0]), Convert.ToInt32(counts[1]) + 1); + await _goodsService.UpdateUserGoods(userId, 1, (int)resInfo.goodsId, onCount, "采集获得"); + return PoAction.Ok(resInfo.gatherTime, $"成功采集{resInfo.resName}×{onCount}!"); + } + else + { + await _mapService.SetMapResLockTime(resId, area, (int)resInfo.gatherTime); + return PoAction.Ok(resInfo.gatherTime, "抱歉,采集失败!提升技能会提高成功率哦!"); + } + } + else + { + return PoAction.Message("采集失败,请稍后尝试!"); + } + } + + #endregion } \ No newline at end of file diff --git a/Service/Application.Web/Controllers/User/UserController.cs b/Service/Application.Web/Controllers/User/UserController.cs index aaff95c..b4ff278 100644 --- a/Service/Application.Web/Controllers/User/UserController.cs +++ b/Service/Application.Web/Controllers/User/UserController.cs @@ -15,10 +15,10 @@ public class UserController : ControllerBase private readonly IUnitUserRelationService _relationService; private readonly IGameGoodsService _goodsService; private readonly IGameChatService _chatService; - + private readonly IGameSkillService _skillService; public UserController(IUnitUserService userService, IUnitUserAttrService attrService, IUnitUserAccService accService, IGameMapService mapService, IUnitUserRelationService relationService, - IGameGoodsService goodsService, IGameChatService chatService) + IGameGoodsService goodsService, IGameChatService chatService,IGameSkillService skillService) { _userService = userService; _attrService = attrService; @@ -27,6 +27,7 @@ public class UserController : ControllerBase _relationService = relationService; _goodsService = goodsService; _chatService = chatService; + _skillService = skillService; } @@ -280,4 +281,16 @@ public class UserController : ControllerBase return PoAction.Message("操作失败,请稍后尝试!"); } } + + /// + /// 获取用户技能 + /// + /// + [HttpGet] + public async TaskGetUserSkill() + { + var userId = StateHelper.userId; + var data = await _skillService.GetUserSkill(userId); + return PoAction.Ok(data); + } } \ No newline at end of file diff --git a/Web/src/assets/css/style.css b/Web/src/assets/css/style.css index cd475e5..68c68b4 100644 --- a/Web/src/assets/css/style.css +++ b/Web/src/assets/css/style.css @@ -21,9 +21,6 @@ body { .main {} -div { - margin: 5px 2px; -} div img { margin-right: 2px; @@ -38,13 +35,21 @@ div img { max-height: 120px; } -.head {} +.head { + margin: 5px 2px; +} -.title {} +.title { + margin: 5px 2px; +} -.content {} +.content { + margin: 5px 2px; +} -.item {} +.item { + margin: 5px 2px; +} .border { border-bottom: 1px dashed #9f8d8d; @@ -54,7 +59,9 @@ div img { height: 5px; } -.foot {} +.foot { + margin: 5px 2px; +} a { color: #1e5494; @@ -91,7 +98,9 @@ a:focus { color: red; } -.common {} +.common { + margin: 5px 2px; +} .common img { margin-right: 2px; diff --git a/Web/src/pages/map/index.vue b/Web/src/pages/map/index.vue index 5582d9d..aee64ce 100644 --- a/Web/src/pages/map/index.vue +++ b/Web/src/pages/map/index.vue @@ -31,7 +31,7 @@
特产:
- {{item.resName}} + {{ item.resName }}({{ item.lev }}级)
@@ -89,6 +89,20 @@ + + +
+ 物品名称:{{ showResData.resName }}
+ 采集要求:{{ showResData.lev }}级采集术
+ 消耗活力:{{ showResData.needVigour }}
+ 冷却时间:{{ showResData.gather }}秒
+
+
+ + {{ resLockDiff > 0 ? `${resLockDiff}秒后可采集` : "立即采集" }} + +
+
\ No newline at end of file diff --git a/Web/src/pages/user/skill/index.vue b/Web/src/pages/user/skill/index.vue index 41a40c8..1def57f 100644 --- a/Web/src/pages/user/skill/index.vue +++ b/Web/src/pages/user/skill/index.vue @@ -1 +1,49 @@ - \ No newline at end of file + + \ No newline at end of file diff --git a/Web/src/services/map/MapService.ts b/Web/src/services/map/MapService.ts index 6811016..7c0e660 100644 --- a/Web/src/services/map/MapService.ts +++ b/Web/src/services/map/MapService.ts @@ -86,4 +86,12 @@ export class MapService { static async GetNpcInfo(npcId: number) { return await ApiService.Request("get", "/Map/Map/GetNpcInfo", { npcId }); } + + /** + * 采集接口 + * GET /Map/Map/CollectMapRes + */ + static async CollectMapRes(resId: string) { + return await ApiService.Request("get", "/Map/Map/CollectMapRes", { resId }); + } } \ No newline at end of file diff --git a/Web/src/services/user/UserService.ts b/Web/src/services/user/UserService.ts index 14a2bff..c184230 100644 --- a/Web/src/services/user/UserService.ts +++ b/Web/src/services/user/UserService.ts @@ -57,4 +57,12 @@ export class UserService { static async UpdateUserSign(sign: string) { return await ApiService.Request("post", "/User/User/UpdateUserSign", { sign }); } + + /** + * 获取用户技能 + * GET /User/User/GetUserSkill + */ + static async GetUserSkill() { + return await ApiService.Request("get", "/User/User/GetUserSkill"); + } } \ No newline at end of file