diff --git a/AdminSrc/AdminApi/AdminApi.csproj b/AdminSrc/AdminApi/AdminApi.csproj new file mode 100644 index 0000000..d9666a2 --- /dev/null +++ b/AdminSrc/AdminApi/AdminApi.csproj @@ -0,0 +1,28 @@ + + + + Exe + net8.0 + enable + enable + + + + + + + + + + + + + + + + + + + + + diff --git a/AdminSrc/AdminApi/AdminUser/AdminUserController.cs b/AdminSrc/AdminApi/AdminUser/AdminUserController.cs new file mode 100644 index 0000000..ea15e65 --- /dev/null +++ b/AdminSrc/AdminApi/AdminUser/AdminUserController.cs @@ -0,0 +1,665 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using AdminService.GameConfigs; +using AdminService.User; +using AdminService.User.Param; +using AdminService.User.Response; +using Common; +using Common.Utils; +using CommonDomain; +using CommonDomain.BaseModel; +using CommonDomain.Enum; +using CommonInfrastructure; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using RedisService; +using UserDomain.Entity; + +namespace AdminApi.AdminUser +{ + [ApiController, Route("adminapi/[controller]")] + [Authorize] + public class AdminUserController : BaseController + { + private readonly IAdminUserService _userService; + private readonly IRedisService _redisService; + + public AdminUserController(IAdminUserService userService, IRedisService redisService) + { + _userService = userService; + _redisService = redisService; + } + + [HttpPost("GetUserList")] + public async Task> GetUserList(AdminUserListParam param) + { + var result = await _userService.GetAdminUserList(param); + var onlineUserIds = _redisService.GetAllLoginUserIds().ToHashSet(StringComparer.Ordinal); + var dtos = (result.list ?? new List()).Select(u => + { + var dto = MapToUserListItemDto(u); + dto.IsOnline = onlineUserIds.Contains(u.Id); + if (dto.CurrentGameType != 3) + { + var session = _redisService.GetRedisUserCId(u.Id); + if (session == null || string.IsNullOrWhiteSpace(session.RoomId)) + { + dto.CurrentGameType = 0; + dto.RoomNumber = ""; + } + } + return dto; + }).ToList(); + return this.ToPageResult(dtos, result.count); + } + + [HttpGet("GetUserDetail")] + public async Task> GetUserDetail(string userId) + { + var result = await _userService.GetUser(userId); + if (result == null) + return this.ToFailResult("用户不存在"); + + return this.ToResult(result); + } + + [HttpPost("UpdateUserAssets")] + public async Task> UpdateUserAssets(UpdateUserAssetsParam param) + { + var result = await _userService.UpdateUserAssets(param); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("GetUserStatistics")] + public async Task> GetUserStatistics() + { + var result = await _userService.GetUserStatistics(); + return this.ToResult(MapToUserStatisticsDto(result)); + } + + [HttpGet("GetEmailStatistics")] + public async Task> GetEmailStatistics() + { + var result = await _userService.GetEmailStatistics(); + return this.ToResult(MapToEmailStatisticsDto(result)); + } + + [HttpPost("BatchBanUser")] + public async Task> BatchBanUser(BatchBanUserParam param) + { + var result = await _userService.BatchBanUser(param); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("UnbanUser")] + public async Task> UnbanUser(string userId) + { + var result = await _userService.UnbanUser(userId); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("BatchSendEmail")] + public async Task> BatchSendEmail(BatchSendEmailParam param) + { + var result = await _userService.BatchSendEmail(param); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("CancelUser")] + [Authorize] + public async Task> CancelUser() + { + var result = await _userService.CancelUser(loginUser); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("DeleteUser")] + [Authorize] + public async Task> DeleteUser(string id) + { + var result = await _userService.DeleteUser(id); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("BatchDeleteUser")] + [Authorize] + public async Task> BatchDeleteUser([FromBody] BatchDeleteUserParam param) + { + var result = await _userService.BatchDeleteUser(param.UserIds); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("BanUser")] + [Authorize] + public async Task> BanUser([FromBody] BanUserParam param) + { + var result = await _userService.BanUser(param.UserId, param.Reason, param.Days); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("UpdateUser")] + [Authorize] + public async Task> UpdateUser(UpdateUserDataParam param) + { + var result = await _userService.UpdateUser(param); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("SendEmail")] + [Authorize] + public async Task> SendEmail(SendEmailParam param) + { + var result = await _userService.SendEmail(param, loginUser); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("GetEmailList")] + [Authorize] + public async Task> GetEmailList([FromBody] EmailListQueryParam param) + { + var (list, count) = await _userService.GetEmailList(param); + var userIds = list.Where(e => !string.IsNullOrWhiteSpace(e.UserId)) + .Select(e => e.UserId).Distinct().ToList(); + var userNames = await _userService.GetEmailUserNamesAsync(userIds); + var dtos = list.Select(e => + { + userNames.TryGetValue(e.UserId ?? "", out var info); + return new EmailListItemDto + { + Id = e.Id, + UserId = e.UserId ?? "", + UserName = info.UserName, + UserNumber = info.UserNumber, + Title = e.Title ?? "", + IsRead = e.IsRead, + IsReward = e.IsReward, + RewardGold = e.RewardGold, + RewardDiamond = e.RewardDiamond, + SendTime = e.SendTime, + ReadTime = e.ReadTime, + ExpireTime = e.ExpireTime, + RewardText = BuildRewardText(e) + }; + }).ToList(); + return this.ToPageResult(dtos, (int)count); + } + + [HttpGet("DeleteEmail")] + [Authorize] + public async Task> DeleteEmail(string id) + { + var result = await _userService.DeleteEmail(id); + if (result.ok) + return this.ToResult("删除成功"); + else + return this.ToFailResult(result.message ?? "删除失败"); + } + + [HttpPost("BatchDeleteEmail")] + [Authorize] + public async Task> BatchDeleteEmail([FromBody] List ids) + { + var (success, fail) = await _userService.BatchDeleteEmail(ids); + if (fail == 0) + return this.ToResult($"成功删除 {success} 条"); + return this.ToResult($"删除完成:成功 {success} 条,失败 {fail} 条"); + } + + [HttpPost("SetUserType")] + public async Task> SetUserType(string userId, int userType) + { + var result = await _userService.SetUserType(userId, userType); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("BatchSetUserType")] + public async Task> BatchSetUserType([FromBody] BatchSetUserTypeParam param) + { + var result = await _userService.BatchSetUserType(param.UserIds, param.UserType); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("SetBlackUser")] + public async Task> SetBlackUser(string userId, bool isBlack) + { + var result = await _userService.SetBlackUser(userId, isBlack); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("BatchSetBlackUser")] + public async Task> BatchSetBlackUser([FromBody] BatchSetBlackUserParam param) + { + var result = await _userService.BatchSetBlackUser(param.UserIds, param.IsBlack); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("UpdateUserFactor")] + public async Task> UpdateUserFactor([FromBody] UpdateUserFactorFlatParam param) + { + var factor = new PlayerFactor + { + ViolateValue = param.ViolateValue, + MissRate = param.MissRate, + CompensateQuota = param.CompensateQuota, + PenaltyQuota = param.PenaltyQuota, + CompensateRate = param.CompensateRate, + PenaltyRate = param.PenaltyRate, + AdditionalFactor = param.AdditionalFactor + }; + var result = await _userService.UpdateUserFactor(param.UserId, factor); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("GetBlackFactorConfig")] + public async Task> GetBlackFactorConfig() + { + var result = await _userService.GetBlackFactorConfig(); + return this.ToResult(MapToPlayerFactorDto(result)); + } + + [HttpPost("ResetUserFactor")] + public async Task> ResetUserFactor(string userId) + { + var result = await _userService.ResetUserFactor(userId); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("InitUserPassword")] + public async Task> InitUserPassword([FromQuery] string userId) + { + var result = await _userService.InitUserPassword(userId); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("InitSafeBoxPassword")] + public async Task> InitSafeBoxPassword([FromQuery] string userId) + { + var result = await _userService.InitSafeBoxPassword(userId); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("GetUserFactorList")] + public async Task> GetUserFactorList([FromBody] UserFactorListParam param) + { + var result = await _userService.GetUserFactorList(param); + + var pageIps = (result.list ?? new List()) + .Where(u => !string.IsNullOrEmpty(u.RegisterIp)) + .Select(u => u.RegisterIp!) + .Distinct() + .ToList(); + + Dictionary ipCounts = new Dictionary(); + if (pageIps.Count > 0) + { + var allUsersWithSameIp = await _userService.GetUsersByRegisterIps(pageIps); + ipCounts = allUsersWithSameIp + .GroupBy(u => u.RegisterIp) + .ToDictionary(g => g.Key, g => g.Count()); + } + + var dtos = (result.list ?? new List()).Select(u => new UserFactorListItemDto + { + Id = u.Id, + Number = u.BaseInfo?.Number ?? "", + UserName = u.BaseInfo?.UserName ?? "", + Mobile = u.BaseInfo?.Mobile ?? "", + UserType = u.UserType, + RegisterIp = u.RegisterIp ?? "", + LoginIp = u.Static?.LastLoginIp ?? "", + IpCount = !string.IsNullOrEmpty(u.RegisterIp) && ipCounts.ContainsKey(u.RegisterIp) ? ipCounts[u.RegisterIp] : 1, + IsBlack = u.PlayerFactor?.IsBlack ?? false, + ViolateValue = u.PlayerFactor?.ViolateValue ?? 0.2, + MissRate = u.PlayerFactor?.MissRate ?? 0, + CompensateQuota = u.PlayerFactor?.CompensateQuota ?? 0, + PenaltyQuota = u.PlayerFactor?.PenaltyQuota ?? 0, + CompensateRate = u.PlayerFactor?.CompensateRate != null ? new CompensateRateDto + { + BossRate = u.PlayerFactor.CompensateRate.BossRate, + GoldRate = u.PlayerFactor.CompensateRate.GoldRate, + SpecialRate = u.PlayerFactor.CompensateRate.SpecialRate, + Ordinary = u.PlayerFactor.CompensateRate.Ordinary + } : new CompensateRateDto(), + PenaltyRate = u.PlayerFactor?.PenaltyRate != null ? new PenaltyRateDto + { + BossRate = u.PlayerFactor.PenaltyRate.BossRate, + GoldRate = u.PlayerFactor.PenaltyRate.GoldRate, + SpecialRate = u.PlayerFactor.PenaltyRate.SpecialRate, + Ordinary = u.PlayerFactor.PenaltyRate.Ordinary + } : new PenaltyRateDto(), + CreateTime = u.CreateTime, + TotalRecharge = u.Static?.TotalRecharge ?? 0, + TotalRechargeGold = u.Static?.TotalRechargeGold ?? 0, + TotalConsumeGold = u.Static?.TotalConsumeGold ?? 0, + CurrentGold = u.Assets?.Gold ?? 0, + Profit = (u.Assets?.Gold ?? 0) - ((u.Static?.TotalRechargeGold ?? 0) + (u.PlayerFactor?.StartingBonus ?? 0)), + AdditionalFactor = u.PlayerFactor?.AdditionalFactor ?? 0, + StartingBonus = u.PlayerFactor?.StartingBonus ?? 0 + }); + return this.ToPageResult(dtos, result.count); + } + + + private static UserListItemDto MapToUserListItemDto(UserEntity entity) + { + return new UserListItemDto + { + Id = entity.Id, + Number = entity.BaseInfo?.Number ?? "", + NickName = entity.BaseInfo?.UserName ?? "", + Avatar = entity.BaseInfo?.AvatarUrl ?? "", + Mobile = entity.BaseInfo?.Mobile ?? "", + Diamond = entity.Assets?.Diamond ?? 0, + Gold = entity.Assets?.Gold ?? 0, + SafeBoxGold = entity.SafeBox?.Amount ?? 0, + VipLevel = entity.Assets?.VipLevel ?? 0, + UserType = entity.UserType, + IsBan = entity.BanInfo?.IsBan ?? false, + BanReason = entity.BanInfo?.BanReason, + BanEndTime = entity.BanInfo?.BanEndTime ?? 0, + IsBlack = entity.PlayerFactor?.IsBlack ?? false, + RegisterTime = entity.CreateTime, + RegisterIp = entity.RegisterIp ?? "", + LastLoginIp = entity.Static?.LastLoginIp ?? "", + LastLoginTime = entity.Static?.LastLoginTime ?? 0, + RoomNumber = entity.Static?.RoomNumber ?? "", + CurrentGameType = entity.Static?.CurrentGameType ?? 0, + Channel = entity.BaseInfo?.Channel ?? "", + TotalRecharge = (long)(entity.Static?.TotalRecharge ?? 0) + }; + } + + private static UserStatisticsDto MapToUserStatisticsDto(UserStatistics stat) + { + return new UserStatisticsDto + { + TotalUsers = stat.TotalUsers, + TodayRegisteredUsers = stat.TodayRegisteredUsers, + MonthRegisteredUsers = stat.MonthRegisteredUsers, + OnlineUsers = stat.OnlineUsers, + BannedUsers = stat.BannedUsers, + VipUsers = stat.VipUsers, + VipLevelCount = stat.VipLevelCount ?? new Dictionary(), + TotalGold = stat.TotalGold, + TotalDiamond = stat.TotalDiamond + }; + } + + private static EmailStatisticsDto MapToEmailStatisticsDto(EmailStatistics stat) + { + return new EmailStatisticsDto + { + TotalEmails = stat.TotalEmails, + RewardEmails = stat.RewardEmails, + UnclaimedEmails = stat.UnclaimedEmails, + TodayEmails = stat.TodayEmails, + MonthEmails = stat.MonthEmails + }; + } + + private static PlayerFactorDto MapToPlayerFactorDto(PlayerFactor factor) + { + if (factor == null) + return new PlayerFactorDto(); + + return new PlayerFactorDto + { + IsBlack = factor.IsBlack, + IsIgnore = factor.IsIgnore, + ViolateValue = factor.ViolateValue, + CompensateRate = factor.CompensateRate?.BossRate ?? 1, + PenaltyRate = factor.PenaltyRate?.BossRate ?? 0, + CompensateQuota = factor.CompensateQuota, + PenaltyQuota = factor.PenaltyQuota, + StartingBonus = factor.StartingBonus + }; + } + + private static string BuildRewardText(UserEmail email) + { + var parts = new List(); + if (email.RewardGold > 0) + parts.Add($"金币{email.RewardGold:N0}"); + if (email.RewardDiamond > 0) + parts.Add($"钻石{email.RewardDiamond}"); + if (email.RewardItems != null) + { + foreach (var item in email.RewardItems) + { + if (item != null && !string.IsNullOrWhiteSpace(item.Name)) + parts.Add($"{item.Name}*{item.Count}"); + } + } + return parts.Count > 0 ? string.Join(" ", parts) : "无"; + } + + + + [HttpGet("GetUserProps")] + public async Task>> GetUserProps(string userId) + { + var result = await _userService.GetUserProps(userId); + return this.ToResult(result); + } + + [HttpPost("AddUserProp")] + public async Task> AddUserProp(string userId, string propNumber, int count) + { + var res = await _userService.AddUserProp(userId, propNumber, count); + if (res.isok) return this.ToResult(res.msg); + return this.ToFailResult(res.msg); + } + + [HttpPost("UpdateUserPropCount")] + public async Task> UpdateUserPropCount(string userId, string propNumber, int count) + { + var res = await _userService.UpdateUserPropCount(userId, propNumber, count); + if (res.isok) return this.ToResult(res.msg); + return this.ToFailResult(res.msg); + } + + [HttpPost("DeleteUserProp")] + public async Task> DeleteUserProp(string userId, string propNumber) + { + var res = await _userService.DeleteUserProp(userId, propNumber); + if (res.isok) return this.ToResult(res.msg); + return this.ToFailResult(res.msg); + } + + [HttpGet("SyncAllUserLevel")] + public async Task> SyncAllUserLevel() + { + var (total, updated, msg) = await _userService.SyncAllUserLevel(); + return this.ToResult(msg); + } + + } + + + public class UserListItemDto + { + public string Id { get; set; } + public string Number { get; set; } + public string NickName { get; set; } + public string Avatar { get; set; } + public string Mobile { get; set; } + public int Diamond { get; set; } + public long Gold { get; set; } + public long SafeBoxGold { get; set; } + public int VipLevel { get; set; } + public int UserType { get; set; } + public bool IsBan { get; set; } + public string BanReason { get; set; } + public long BanEndTime { get; set; } + public bool IsBlack { get; set; } + public long RegisterTime { get; set; } + public string RegisterIp { get; set; } + public string LastLoginIp { get; set; } + public long LastLoginTime { get; set; } + public string RoomNumber { get; set; } + public int CurrentGameType { get; set; } + public bool IsOnline { get; set; } + public string Channel { get; set; } + public long TotalRecharge { get; set; } + } + + public class UserStatisticsDto + { + public long TotalUsers { get; set; } + public long TodayRegisteredUsers { get; set; } + public long MonthRegisteredUsers { get; set; } + public long OnlineUsers { get; set; } + public long BannedUsers { get; set; } + public long VipUsers { get; set; } + public Dictionary VipLevelCount { get; set; } + public long TotalGold { get; set; } + public long TotalDiamond { get; set; } + } + + public class EmailStatisticsDto + { + public long TotalEmails { get; set; } + public long RewardEmails { get; set; } + public long UnclaimedEmails { get; set; } + public long TodayEmails { get; set; } + public long MonthEmails { get; set; } + } + + public class PlayerFactorDto + { + public bool IsBlack { get; set; } + public bool IsIgnore { get; set; } + public double ViolateValue { get; set; } + public double CompensateRate { get; set; } + public double PenaltyRate { get; set; } + public int CompensateQuota { get; set; } + public int PenaltyQuota { get; set; } + public long StartingBonus { get; set; } + } + + public class UserFactorListItemDto + { + public string Id { get; set; } + public string Number { get; set; } + public string UserName { get; set; } + public string Mobile { get; set; } + public int UserType { get; set; } + public string RegisterIp { get; set; } + public string LoginIp { get; set; } + public int IpCount { get; set; } + public bool IsBlack { get; set; } + public double ViolateValue { get; set; } + public double MissRate { get; set; } + public int CompensateQuota { get; set; } + public int PenaltyQuota { get; set; } + public CompensateRateDto CompensateRate { get; set; } + public PenaltyRateDto PenaltyRate { get; set; } + public long CreateTime { get; set; } + public double TotalRecharge { get; set; } + public long TotalRechargeGold { get; set; } + public long TotalConsumeGold { get; set; } + public long CurrentGold { get; set; } + public long Profit { get; set; } + public double AdditionalFactor { get; set; } + public long StartingBonus { get; set; } + } + + public class CompensateRateDto + { + public double BossRate { get; set; } = 1; + public double GoldRate { get; set; } = 1; + public double SpecialRate { get; set; } = 1; + public double Ordinary { get; set; } = 1; + } + + public class PenaltyRateDto + { + public double BossRate { get; set; } = 1; + public double GoldRate { get; set; } = 1; + public double SpecialRate { get; set; } = 1; + public double Ordinary { get; set; } = 1; + } + + public class BanUserParam + { + public string UserId { get; set; } = ""; + + public string Reason { get; set; } = ""; + + public int Days { get; set; } = 0; + } + + public class EmailListItemDto + { + public string Id { get; set; } = ""; + public string UserId { get; set; } = ""; + public string UserName { get; set; } = ""; + public string UserNumber { get; set; } = ""; + public string Title { get; set; } = ""; + public bool IsRead { get; set; } + public bool IsReward { get; set; } + public long RewardGold { get; set; } + public int RewardDiamond { get; set; } + public long SendTime { get; set; } + public long ReadTime { get; set; } + public long ExpireTime { get; set; } + public string RewardText { get; set; } = ""; + } + +} diff --git a/AdminSrc/AdminApi/AssemblyMarker.cs b/AdminSrc/AdminApi/AssemblyMarker.cs new file mode 100644 index 0000000..e7c92c5 --- /dev/null +++ b/AdminSrc/AdminApi/AssemblyMarker.cs @@ -0,0 +1,6 @@ +namespace AdminApi +{ + public static class AssemblyMarker + { + } +} \ No newline at end of file diff --git a/AdminSrc/AdminApi/BackgroundOperation/BackgroundOperationController.cs b/AdminSrc/AdminApi/BackgroundOperation/BackgroundOperationController.cs new file mode 100644 index 0000000..1adfcc5 --- /dev/null +++ b/AdminSrc/AdminApi/BackgroundOperation/BackgroundOperationController.cs @@ -0,0 +1,114 @@ +using System.Threading.Tasks; +using Common; +using CommonDomain; +using CommonInfrastructure; +using CommonInfrastructure.Response; +using CommonService; +using CommonService.BackgroundOperation; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using UserDomain.Entity; + +namespace AdminApi.BackgroundOperation +{ + [Authorize] + [Route("adminapi/[controller]")] + [ApiController] + public class BackgroundOperationController : BaseController + { + private readonly IBackgroundOperationService _operationService; + + public BackgroundOperationController(IBackgroundOperationService operationService) + { + _operationService = operationService; + } + + [HttpPost("charge")] + public async Task> Charge([FromBody] BackgroundOperationRequest request) + { + if (request == null || string.IsNullOrWhiteSpace(request.TargetUserId)) + return this.ToFailResult("目标用户ID不能为空"); + + if (request.Amount <= 0) + return this.ToFailResult("操作数量必须大于0"); + + var (success, message) = await _operationService.Charge( + loginUser.UserId, request.TargetUserId, request.CurrencyType, request.Amount, request.Remark); + + return success + ? this.ToResult("充值成功") + : this.ToFailResult(message); + } + + [HttpPost("deduct")] + public async Task> Deduct([FromBody] BackgroundOperationRequest request) + { + if (request == null || string.IsNullOrWhiteSpace(request.TargetUserId)) + return this.ToFailResult("目标用户ID不能为空"); + + if (request.Amount <= 0) + return this.ToFailResult("操作数量必须大于0"); + + var (success, message) = await _operationService.Deduct( + loginUser.UserId, request.TargetUserId, request.CurrencyType, request.Amount, request.Remark); + + return success + ? this.ToResult("扣除成功") + : this.ToFailResult(message); + } + + [HttpGet("logs")] + public async Task> GetLogs( + string? adminUserId = null, + string? targetUserId = null, + int? operationType = null, + int pageIndex = 1, + int pageSize = 20) + { + var (data, total) = await _operationService.QueryLogs( + adminUserId, targetUserId, operationType, pageIndex, pageSize); + + return this.ToPageResult(data, total); + } + + [HttpGet("search-user")] + public async Task> SearchUser(string keyword) + { + if (string.IsNullOrWhiteSpace(keyword)) + { + + return this.ToFailResult("搜索关键词不能为空"); + } + + var user = await _operationService.SearchUser(keyword); + + if (user == null) + { + return this.ToFailResult("用户不存在"); + } + + var dto = new SearchUserResponse + { + UserId = user.Id, + UserName = user.BaseInfo?.UserName ?? "", + UserPhone = user.BaseInfo?.Mobile ?? "", + Gold = user.Assets?.Gold ?? 0, + Diamond = user.Assets?.Diamond ?? 0, + RegisterTime = user.CreateTime / 1000 + }; + + return this.ToResult(dto); + } + + } + + public class SearchUserResponse + { + public string UserId { get; set; } + public string UserName { get; set; } + public string UserPhone { get; set; } + public long Gold { get; set; } + public int Diamond { get; set; } + public long RegisterTime { get; set; } + } +} diff --git a/AdminSrc/AdminApi/BeautifulNumber/BeautifulNumberController.cs b/AdminSrc/AdminApi/BeautifulNumber/BeautifulNumberController.cs new file mode 100644 index 0000000..47984b5 --- /dev/null +++ b/AdminSrc/AdminApi/BeautifulNumber/BeautifulNumberController.cs @@ -0,0 +1,384 @@ +using System.Collections.Generic; +using System.Linq; +using AdminDomain.BeautifulNumber; +using AdminDomain.Entity; +using AdminService.BeautifulNumber; +using Common; +using CommonInfrastructure; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using UserDomain.Entity; + +namespace AdminApi.BeautifulNumber +{ + [ApiController, Route("adminapi/[controller]")] + [Authorize] + + public class BeautifulNumberController : BaseController + { + private readonly IBeautifulNumberService _beautifulNumberService; + + public BeautifulNumberController(IBeautifulNumberService beautifulNumberService) + { + _beautifulNumberService = beautifulNumberService; + } + + [HttpGet("list")] + public async Task> GetList([FromQuery] BeautifulNumberListParam param) + { + param.page = param.page > 0 ? param.page : 1; + param.size = param.size > 0 ? param.size : 20; + var result = await _beautifulNumberService.GetList(param); + var dtos = result.list.Select(MapToDto).ToList(); + return this.ToPageResult(dtos, (int)result.count); + } + + [HttpGet("available")] + public async Task> GetAvailableList([FromQuery] BeautifulNumberListParam param) + { + param.page = param.page > 0 ? param.page : 1; + param.size = param.size > 0 ? param.size : 20; + param.status = (int)BeautifulNumberStatus.Available; + var result = await _beautifulNumberService.GetList(param); + var dtos = result.list.Select(MapToDto).ToList(); + return this.ToPageResult(dtos, (int)result.count); + } + + [HttpGet("check/{number}")] + public async Task> CheckNumber(string number) + { + var result = await _beautifulNumberService.CheckNumber(number); + return this.ToResult(MapToDto(result)); + } + + private static BeautifulNumberDto MapToDto(BeautifulNumberConfig entity) + { + if (entity == null) return new BeautifulNumberDto(); + return new BeautifulNumberDto + { + Id = entity.Id ?? "", + Number = entity.Number ?? "", + RuleName = entity.RuleName ?? "", + Level = entity.Level ?? "", + Price = entity.Price, + Status = (int)entity.Status, + SaleTime = entity.SaleTime, + BuyerUserId = entity.BuyerUserId ?? "", + UserId = entity.UserId ?? "", + Remark = entity.Remark ?? "", + CreateTime = entity.CreateTime + }; + } + + [HttpPost("delete")] + public async Task> Delete([FromBody] DeleteBeautifulNumberParam param) + { + var result = await _beautifulNumberService.Delete(param.Id); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("set-normal")] + public async Task> SetToNormal([FromBody] DeleteBeautifulNumberParam param) + { + var result = await _beautifulNumberService.SetToNormal(param.Id); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("freeze")] + public async Task> Freeze([FromBody] DeleteBeautifulNumberParam param) + { + var result = await _beautifulNumberService.Freeze(param.Id); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("unfreeze")] + public async Task> Unfreeze([FromBody] DeleteBeautifulNumberParam param) + { + var result = await _beautifulNumberService.Unfreeze(param.Id); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("update-price")] + public async Task> UpdatePrice([FromBody] UpdateBeautifulNumberPriceParam param) + { + var result = await _beautifulNumberService.UpdatePrice(param.Id, param.Price); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("update-number")] + public async Task> UpdateNumber([FromBody] UpdateBeautifulNumberParam param) + { + var result = await _beautifulNumberService.UpdateNumber(param.Id, param.Level, param.Price); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("rules")] + public async Task>> GetRules() + { + var result = await _beautifulNumberService.GetRules(); + var dtos = result.Select(MapRuleToDto).ToList(); + return this.ToResult(dtos); + } + + private static BeautifulNumberRuleDto MapRuleToDto(BeautifulNumberRule entity) + { + if (entity == null) return new BeautifulNumberRuleDto(); + return new BeautifulNumberRuleDto + { + Id = entity.Id ?? "", + RuleName = entity.RuleName ?? "", + Level = entity.Level ?? "", + Price = entity.Price, + Sort = entity.Sort, + IsEnable = entity.IsEnable + }; + } + + [HttpPost("update-rules")] + public async Task> UpdateRules([FromBody] List paramList) + { + var rules = new List(); + foreach (var param in paramList) + { + rules.Add(new BeautifulNumberRule + { + Id = param.Id, + RuleName = param.RuleName, + Level = param.Level, + Price = param.Price, + Sort = param.Sort, + IsEnable = param.IsEnable + }); + } + var result = await _beautifulNumberService.UpdateRules(rules); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("init-rules")] + public async Task> InitRules() + { + var result = await _beautifulNumberService.InitRules(); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("add-rule")] + public async Task> AddRule([FromBody] BeautifulNumberRule rule) + { + var result = await _beautifulNumberService.AddRule(rule); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("update-rule")] + public async Task> UpdateRule([FromBody] BeautifulNumberRule rule) + { + var result = await _beautifulNumberService.UpdateRule(rule); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("delete-rule")] + public async Task> DeleteRule([FromBody] DeleteBeautifulNumberRuleParam param) + { + var result = await _beautifulNumberService.DeleteRule(param.Id); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("give-to-user")] + public async Task> GiveToUser([FromBody] GiveBeautifulNumberParam param) + { + var result = await _beautifulNumberService.GiveToUser(param.Number, param.UserId); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("init-numbers")] + public async Task> InitNumbers() + { + var result = await _beautifulNumberService.InitBeautifulNumbers(); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("add-number")] + public async Task> AddNumber([FromBody] AddBeautifulNumberParam param) + { + var result = await _beautifulNumberService.AddNumber(param.Number, param.Level, param.Price); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("batch-add-numbers")] + public async Task> BatchAddNumbers([FromBody] BatchAddBeautifulNumbersParam param) + { + var result = await _beautifulNumberService.BatchAddNumbers(param.Numbers, param.Level, param.Price); + return this.ToResult(new BatchAddResult { SuccessCount = result.successCount, FailCount = result.failCount, Message = result.msg }); + } + } + + public class BatchAddResult + { + public int SuccessCount { get; set; } + public int FailCount { get; set; } + public string Message { get; set; } + } + + public class BeautifulNumberDto + { + public string Id { get; set; } + public string Number { get; set; } + public string RuleName { get; set; } + public string Level { get; set; } + public long Price { get; set; } + public int Status { get; set; } + public long SaleTime { get; set; } + public string BuyerUserId { get; set; } + public string UserId { get; set; } + public string Remark { get; set; } + public long CreateTime { get; set; } + } + + public class BeautifulNumberRuleDto + { + public string Id { get; set; } + public string RuleName { get; set; } + public string Level { get; set; } + public long Price { get; set; } + public int Sort { get; set; } + public bool IsEnable { get; set; } + } + + public class BatchAddBeautifulNumbersParam + { + public List Numbers { get; set; } + + public string Level { get; set; } + + public long Price { get; set; } + + + + } + + public class GiveBeautifulNumberParam + { + public string Number { get; set; } + + public string UserId { get; set; } + } + + public class AddBeautifulNumberParam + { + public string Number { get; set; } + + public string Level { get; set; } + + public long Price { get; set; } + + public int Sort { get; set; } + + public string Remark { get; set; } + } + public class UpdateBeautifulNumberParam + { + public string Id { get; set; } + + public string Level { get; set; } + + public long Price { get; set; } + + } + public class DeleteBeautifulNumberParam + { + public string Id { get; set; } + } + + public class UpdateBeautifulNumberPriceParam + { + public string Id { get; set; } + + public long Price { get; set; } + } + + + + public class UpdateBeautifulNumberRuleParam + { + public string Id { get; set; } + + + + public string RuleName { get; set; } + + + + public string Level { get; set; } + + public long Price { get; set; } + + public int Sort { get; set; } + + public bool IsEnable { get; set; } + } + + public class AddBeautifulNumberRuleParam + { + public string RuleName { get; set; } + public string Level { get; set; } + public long Price { get; set; } + public int Sort { get; set; } + public bool IsEnable { get; set; } + } + + public class UpdateSingleBeautifulNumberRuleParam + { + public string Id { get; set; } + public string RuleName { get; set; } + public string Level { get; set; } + public long Price { get; set; } + public int Sort { get; set; } + public bool IsEnable { get; set; } + } + + public class DeleteBeautifulNumberRuleParam + { + public string Id { get; set; } + } +} diff --git a/AdminSrc/AdminApi/Controllers/ImageUploadController.cs b/AdminSrc/AdminApi/Controllers/ImageUploadController.cs new file mode 100644 index 0000000..324426c --- /dev/null +++ b/AdminSrc/AdminApi/Controllers/ImageUploadController.cs @@ -0,0 +1,64 @@ +using AdminService.ImageUpload; +using Common; +using CommonInfrastructure; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; + +namespace AdminApi.Controllers +{ + [Route("adminapi/[controller]")] + [ApiController] + public class ImageUploadController : BaseController + { + private readonly IImageUploadService _imageUploadService; + + public ImageUploadController(IImageUploadService imageUploadService) + { + _imageUploadService = imageUploadService; + } + + [HttpPost("upload")] + public async Task UploadFile(IFormFile file, [FromQuery] string? name = null) + { + if (string.IsNullOrWhiteSpace(name)) + name = Request.Form["name"].FirstOrDefault(); + + var result = await _imageUploadService.UploadImageAsync(file, name); + return result.isOk + ? Json(this.ToResult(new { path = result.path, fileName = result.fileName })) + : Json(this.ToFailResult(result.errorMessage)); + } + + [HttpPost("upload/temp")] + public async Task UploadTempFile(IFormFile file) + { + var result = await _imageUploadService.UploadImageAsync(file); + return result.isOk + ? Json(this.ToResult(new { path = result.path, fileName = result.fileName })) + : Json(this.ToFailResult(result.errorMessage)); + } + + [HttpPost("upload/config")] + public async Task UploadConfigFile(IFormFile file, [FromQuery] string? number = null) + { + if (!string.Equals(Path.GetExtension(file?.FileName), ".png", StringComparison.OrdinalIgnoreCase)) + return Json(this.ToFailResult("配置图片必须是 PNG 格式")); + + if (string.IsNullOrWhiteSpace(number)) + number = Request.Form["number"].FirstOrDefault(); + + number = number?.Trim(); + if (string.IsNullOrWhiteSpace(number) + || number != Path.GetFileName(number) + || number.Any(c => !char.IsLetterOrDigit(c) && c != '_' && c != '-')) + { + return Json(this.ToFailResult("图片编号无效")); + } + + var result = await _imageUploadService.UploadImageAsync(file, number); + return result.isOk + ? Json(this.ToResult(new { path = result.path, fileName = result.fileName, number })) + : Json(this.ToFailResult(result.errorMessage)); + } + } +} diff --git a/AdminSrc/AdminApi/Controllers/OperationLogController.cs b/AdminSrc/AdminApi/Controllers/OperationLogController.cs new file mode 100644 index 0000000..c0897db --- /dev/null +++ b/AdminSrc/AdminApi/Controllers/OperationLogController.cs @@ -0,0 +1,130 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using AdminService.Admin; +using Common; +using CommonInfrastructure; +using Domain.Admin.Admin; +using Domain.Admin.Admin.ENum; +using Domain.Admin.Admin.Param; +using Microsoft.AspNetCore.Mvc; +using MongoRepository; + +namespace AdminApi.Controllers +{ + [Route("adminapi/[controller]")] + [ApiController] + public class OperationLogController : BaseController + { + private readonly IAdminOperationLogService _operationLogService; + private readonly IMongoBaseRepository _systemUserRepo; + private readonly IMongoBaseRepository _logRepo; + + public OperationLogController(IAdminOperationLogService operationLogService, IMongoBaseRepository systemUserRepo, IMongoBaseRepository logRepo) + { + _operationLogService = operationLogService; + _systemUserRepo = systemUserRepo; + _logRepo = logRepo; + } + + [HttpPost("list")] + public async Task> GetList([FromBody] OperationLogQueryParam param) + { + var (list, count) = await _operationLogService.QueryPage(param); + if (list == null) + return this.ToPageResult(new List(), 0); + var dtos = list.Select(MapToDto); + return this.ToPageResult(dtos, (int)count); + } + + [HttpGet("admins")] + public async Task>> GetAdmins() + { + var users = await _systemUserRepo.FilterByAsync(x => x.State == 1); + var result = users.Select(x => new AdminOptionDto { Value = x.Id, Label = x.DisplayName }).ToList(); + return this.ToResult(result); + } + + [HttpGet("modules")] + public BaseResponse> GetModules() + { + var modules = Enum.GetValues() + .Select(x => new ModuleOptionDto { Value = (int)x, Label = ((int)x).ToString() }) + .ToList(); + return this.ToResult(modules); + } + + [HttpPost("Delete")] + public async Task> Delete(string id) + { + var result = await _logRepo.DeleteByIdAsync(id); + if (result.ok) + return this.ToResult("删除成功"); + else + return this.ToFailResult("删除失败"); + } + + [HttpPost("BatchDelete")] + public async Task> BatchDelete([FromBody] List ids) + { + int success = 0, fail = 0; + foreach (var id in ids) + { + var result = await _logRepo.DeleteByIdAsync(id); + if (result.ok) + success++; + else + fail++; + } + if (fail == 0) + return this.ToResult($"成功删除 {success} 条"); + return this.ToResult($"删除完成:成功 {success} 条,失败 {fail} 条"); + } + + private static OperationLogDto MapToDto(AdminOperationLog entity) + { + return new OperationLogDto + { + Id = entity.Id, + AdminId = entity.AdminId ?? "", + AdminName = entity.AdminName ?? "", + Module = entity.Module, + ActionType = entity.ActionType ?? "", + Description = entity.Description ?? "", + HttpMethod = entity.HttpMethod ?? "", + RequestPath = entity.RequestPath ?? "", + Ip = entity.Ip ?? "", + Status = entity.Status, + OperateTime = entity.OperateTime + }; + } + } + + public class OperationLogDto + { + public string Id { get; set; } + public string AdminId { get; set; } + public string AdminName { get; set; } + public int Module { get; set; } + public string ActionType { get; set; } + public string Description { get; set; } + public string HttpMethod { get; set; } + public string RequestPath { get; set; } + public string Ip { get; set; } + public int Status { get; set; } + public DateTime OperateTime { get; set; } + } + + public class AdminOptionDto + { + public string Value { get; set; } + public string Label { get; set; } + } + + public class ModuleOptionDto + { + public int Value { get; set; } + public string Label { get; set; } + } +} diff --git a/AdminSrc/AdminApi/Customer/CustomerController.cs b/AdminSrc/AdminApi/Customer/CustomerController.cs new file mode 100644 index 0000000..a6cd278 --- /dev/null +++ b/AdminSrc/AdminApi/Customer/CustomerController.cs @@ -0,0 +1,244 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using AdminApplication.DTOs; +using AdminDomain.Customer; +using AdminDomain.Customer.Param; +using Common; +using CommonInfrastructure; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace AdminApi.Customer +{ + [ApiController] + [Route("adminapi/[controller]")] + [Authorize] + public class CustomerController : BaseController + { + private readonly ICustomerService _customerService; + + public CustomerController(ICustomerService customerService) + { + _customerService = customerService; + } + + [HttpGet("list")] + public async Task> GetCustomerList([FromQuery] GetCustomerListParam param) + { + var result = await _customerService.GetCustomerList(param); + var dtos = MapToCustomerDtos(result.customers); + return this.ToPageResult(dtos, result.total); + } + + [HttpGet("{id}")] + public async Task> GetCustomerById(string id) + { + var result = await _customerService.GetCustomerById(id); + var dto = MapToCustomerDto(result.customer); + return this.ToResult(dto); + } + + [HttpPost] + public async Task> AddCustomer([FromBody] AddCustomerParam param) + { + var result = await _customerService.AddCustomer(param); + if (result.isOk) + { + var dto = MapToCustomerDto(result.customer); + return this.ToResult(dto); + } + else + { + return this.ToFailResult(result.msg); + } + } + + [HttpPut] + public async Task> UpdateCustomer([FromBody] UpdateCustomerParam param) + { + var result = await _customerService.UpdateCustomer(param); + if (result.isOk) + { + return this.ToResult(result.msg); + } + else + { + return this.ToFailResult(result.msg); + } + } + + [HttpDelete("{id}")] + public async Task> DeleteCustomer(string id) + { + var result = await _customerService.DeleteCustomer(id); + if (result.isOk) + { + return this.ToResult(result.msg); + } + else + { + return this.ToFailResult(result.msg); + } + } + + [HttpGet("conversations")] + public async Task> GetConversationList([FromQuery] GetConversationListParam param) + { + var result = await _customerService.GetConversationList(param); + var dtos = MapToConversationDtos(result.conversations); + return this.ToPageResult(dtos, result.total); + } + + [HttpGet("conversation/{id}")] + public async Task> GetConversationById(string id) + { + var result = await _customerService.GetConversationById(id); + var dto = MapToConversationDto(result.conversation); + return this.ToResult(dto); + } + + [HttpDelete("conversation/{id}")] + public async Task> DeleteConversation(string id) + { + var result = await _customerService.DeleteConversation(id); + return result.isOk + ? this.ToResult(result.msg) + : this.ToFailResult(result.msg); + } + + [HttpGet("chatlog/{conversationId}")] + public async Task>> GetChatLog(string conversationId) + { + var result = await _customerService.GetChatLog(conversationId); + if (result.isOk) + { + var dtos = MapToMessageDtos(result.messages); + return this.ToResult(dtos); + } + else + { + return this.ToFailResult>(result.msg); + } + } + + [HttpDelete("message/{id}")] + public async Task> DeleteMessage(string id) + { + var result = await _customerService.DeleteMessage(id); + if (result.isOk) + { + return this.ToResult(result.msg); + } + else + { + return this.ToFailResult(result.msg); + } + } + + [HttpDelete("messages/{conversationId}")] + public async Task> DeleteAllMessages(string conversationId) + { + var result = await _customerService.DeleteAllMessages(conversationId); + if (result.isOk) + { + return this.ToResult(result.msg); + } + else + { + return this.ToFailResult(result.msg); + } + } + + [HttpPost("messages/delete-batch")] + public async Task> DeleteMessagesBatch([FromBody] DeleteMessagesBatchRequest param) + { + var result = await _customerService.DeleteMessagesBatch(param.Ids); + if (result.isOk) + { + return this.ToResult(result.msg); + } + else + { + return this.ToFailResult(result.msg); + } + } + + private static CustomerDto MapToCustomerDto(CustomerService.Domain.Entity.CustomerEntity? entity) + { + if (entity == null) return null!; + return new CustomerDto + { + Id = entity.Id, + UserId = entity.UserId, + UserName = entity.UserName, + Status = entity.Status, + Avatar = entity.Avatar, + CreateTime = entity.CreateTime + }; + } + + private static List MapToCustomerDtos(IEnumerable entities) + { + var dtos = new List(); + foreach (var entity in entities) + { + dtos.Add(MapToCustomerDto(entity)); + } + return dtos; + } + + private static ConversationDto MapToConversationDto(CustomerService.Domain.Entity.ConversationEntity? entity) + { + if (entity == null) return null!; + return new ConversationDto + { + Id = entity.Id, + UserId = entity.UserId, + UserName = entity.UserName, + UserAvatar = entity.UserAvatar, + CustomerId = entity.CustomerId, + CustomerName = entity.CustomerName, + CustomerAvatar = entity.CustomerAvatar, + Status = entity.Status, + CreateTime = entity.CreateTime, + EndTime = entity.EndTime + }; + } + + private static List MapToConversationDtos(IEnumerable entities) + { + var dtos = new List(); + foreach (var entity in entities) + { + dtos.Add(MapToConversationDto(entity)); + } + return dtos; + } + + private static MessageDto MapToMessageDto(CustomerService.Domain.Entity.MessageEntity entity) + { + return new MessageDto + { + Id = entity.Id, + ConversationId = entity.ConversationId, + SenderType = entity.SenderType, + SenderId = entity.SenderId, + SenderName = entity.SenderName, + SenderAvatar = entity.SenderAvatar, + ContentType = entity.ContentType, + Content = entity.Content, + CreateTime = entity.CreateTime + }; + } + + private static List MapToMessageDtos(IEnumerable entities) + { + var dtos = new List(); + foreach (var entity in entities) + { + dtos.Add(MapToMessageDto(entity)); + } + return dtos; + } + } +} diff --git a/AdminSrc/AdminApi/EmptyRoomRate/EmptyRoomRateConfigController.cs b/AdminSrc/AdminApi/EmptyRoomRate/EmptyRoomRateConfigController.cs new file mode 100644 index 0000000..28cfe4c --- /dev/null +++ b/AdminSrc/AdminApi/EmptyRoomRate/EmptyRoomRateConfigController.cs @@ -0,0 +1,110 @@ +using AdminService.EmptyRoomRate; +using Common; +using CommonDomain; +using CommonDomain.Enum; +using CommonInfrastructure; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace AdminApi.EmptyRoomRate +{ + [ApiController, Route("adminapi/[controller]")] + [Authorize] + public class EmptyRoomRateConfigController : BaseController + { + private readonly IEmptyRoomRateConfigService _emptyRoomRateConfigService; + + public EmptyRoomRateConfigController(IEmptyRoomRateConfigService emptyRoomRateConfigService) + { + _emptyRoomRateConfigService = emptyRoomRateConfigService; + } + + [HttpGet("list")] + public async Task> GetList( + [FromQuery] int page = 1, + [FromQuery] int size = 20, + [FromQuery] GameTypeEnum? gameType = null, + [FromQuery] int? roomLevel = null) + { + page = page > 0 ? page : 1; + size = size > 0 ? size : 20; + var result = await _emptyRoomRateConfigService.GetList(page, size, gameType, roomLevel); + var dtos = result.list.Select(MapToDto).ToList(); + return this.ToPageResult(dtos, (int)result.count); + } + + [HttpPost("add")] + public async Task> Add([FromBody] AddEmptyRoomRateParam param) + { + var result = await _emptyRoomRateConfigService.Add(param.GameType, param.RoomLevel, param.EmptyRoomRate); + if (result.isok) + return this.ToResult(result.msg); + return this.ToFailResult(result.msg); + } + + [HttpPost("update")] + public async Task> Update([FromBody] UpdateEmptyRoomRateParam param) + { + var result = await _emptyRoomRateConfigService.Update(param.Id, param.EmptyRoomRate); + if (result.isok) + return this.ToResult(result.msg); + return this.ToFailResult(result.msg); + } + + [HttpPost("delete")] + public async Task> Delete([FromBody] DeleteEmptyRoomRateParam param) + { + var result = await _emptyRoomRateConfigService.Delete(param.Id); + if (result.isok) + return this.ToResult(result.msg); + return this.ToFailResult(result.msg); + } + + private static EmptyRoomRateDto MapToDto(EmptyRoomRateConfig entity) + { + if (entity == null) return new EmptyRoomRateDto(); + return new EmptyRoomRateDto + { + Id = entity.Id ?? "", + GameType = (int)entity.GameType, + GameTypeName = entity.GameType.ToString(), + RoomLevel = entity.RoomLevel, + EmptyRoomRate = entity.EmptyRoomRate + }; + } + } + + public class EmptyRoomRateDto + { + public string Id { get; set; } + + public int GameType { get; set; } + + public string GameTypeName { get; set; } + + public int RoomLevel { get; set; } + + public int EmptyRoomRate { get; set; } + } + + public class AddEmptyRoomRateParam + { + public GameTypeEnum GameType { get; set; } + + public int RoomLevel { get; set; } + + public int EmptyRoomRate { get; set; } = 30; + } + + public class UpdateEmptyRoomRateParam + { + public string Id { get; set; } + + public int EmptyRoomRate { get; set; } + } + + public class DeleteEmptyRoomRateParam + { + public string Id { get; set; } + } +} \ No newline at end of file diff --git a/AdminSrc/AdminApi/Faq/FaqController.cs b/AdminSrc/AdminApi/Faq/FaqController.cs new file mode 100644 index 0000000..bc26b98 --- /dev/null +++ b/AdminSrc/AdminApi/Faq/FaqController.cs @@ -0,0 +1,246 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Common; +using CommonDomain; +using CommonInfrastructure; +using Microsoft.AspNetCore.Mvc; +using AdminService.Faq; + +namespace AdminApi.Faq +{ + [ApiController, Route("adminapi/[controller]")] + public class FaqController : BaseController + { + private readonly IFaqService _faqService; + + public FaqController(IFaqService faqService) + { + _faqService = faqService; + } + + + [HttpGet("Categories")] + public async Task GetCategories() + { + var list = await _faqService.GetAllCategories(); + if (list == null) + return new ListResponse { Code = CommonResponseCodeEnum.Success, Data = new List() }; + var dtos = list.Select(MapToCategoryDto).ToList(); + return new ListResponse + { + Code = CommonResponseCodeEnum.Success, + Info = "获取成功", + Data = dtos + }; + } + + [HttpGet("CategoryTree")] + public async Task GetCategoryTree() + { + var tree = await _faqService.GetCategoryTree(); + var dtos = tree.Select(MapToTreeNodeDto).ToList(); + return new ListResponse + { + Code = CommonResponseCodeEnum.Success, + Info = "获取成功", + Data = dtos + }; + } + + [HttpGet("CategoryDetail")] + public async Task> GetCategoryDetail(string id) + { + var category = await _faqService.GetCategoryById(id); + if (category == null) + return this.ToFailResult("板块不存在"); + + return this.ToResult(MapToCategoryDto(category)); + } + + [HttpPost("AddCategory")] + public async Task> AddCategory([FromBody] FaqCategory category) + { + var result = await _faqService.AddCategory(category); + if (result.ok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("UpdateCategory")] + public async Task> UpdateCategory([FromBody] FaqCategory category) + { + var result = await _faqService.UpdateCategory(category); + if (result.ok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("DeleteCategory")] + public async Task> DeleteCategory(string id) + { + var result = await _faqService.DeleteCategory(id); + if (result.ok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + + [HttpGet("Questions")] + public async Task GetQuestions(string categoryId) + { + var list = await _faqService.GetQuestionsByCategory(categoryId); + if (list == null) + return new ListResponse { Code = CommonResponseCodeEnum.Success, Data = new List() }; + var dtos = list.Select(MapToQuestionDto).ToList(); + return new ListResponse + { + Code = CommonResponseCodeEnum.Success, + Info = "获取成功", + Data = dtos + }; + } + + [HttpPost("QuestionList")] + public async Task GetQuestionList([FromBody] FaqQueryParam param) + { + var result = await _faqService.QueryQuestions(param.CategoryId, param.PageIndex, param.PageSize); + var dtos = result.list.Select(MapToQuestionDto).ToList(); + return new PageDataResponse + { + Code = CommonResponseCodeEnum.Success, + Info = "获取成功", + Data = dtos, + Count = (int)result.count + }; + } + + [HttpGet("QuestionDetail")] + public async Task> GetQuestionDetail(string id) + { + var question = await _faqService.GetQuestionById(id); + if (question == null) + return this.ToFailResult("问题不存在"); + + return this.ToResult(MapToQuestionDto(question)); + } + + [HttpPost("AddQuestion")] + public async Task> AddQuestion([FromBody] FaqQuestion question) + { + var result = await _faqService.AddQuestion(question); + if (result.ok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("UpdateQuestion")] + public async Task> UpdateQuestion([FromBody] FaqQuestion question) + { + var result = await _faqService.UpdateQuestion(question); + if (result.ok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("DeleteQuestion")] + public async Task> DeleteQuestion(string id) + { + var result = await _faqService.DeleteQuestion(id); + if (result.ok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + + private static FaqCategoryDto MapToCategoryDto(FaqCategory entity) + { + if (entity == null) return new FaqCategoryDto(); + return new FaqCategoryDto + { + Id = entity.Id ?? "", + ParentId = entity.ParentId ?? "", + Name = entity.Name ?? "", + Icon = entity.Icon ?? "", + Sort = entity.Sort, + IsEnable = entity.IsEnable + }; + } + + private static FaqCategoryTreeNodeDto MapToTreeNodeDto(FaqCategoryTreeNode entity) + { + if (entity == null) return new FaqCategoryTreeNodeDto(); + return new FaqCategoryTreeNodeDto + { + Id = entity.Id ?? "", + Name = entity.Name ?? "", + Icon = entity.Icon ?? "", + Sort = entity.Sort, + IsEnable = entity.IsEnable, + Children = entity.Children?.Select(MapToTreeNodeDto).ToList() ?? new List(), + QuestionCount = entity.QuestionCount + }; + } + + private static FaqQuestionDto MapToQuestionDto(FaqQuestion entity) + { + if (entity == null) return new FaqQuestionDto(); + return new FaqQuestionDto + { + Id = entity.Id ?? "", + CategoryId = entity.CategoryId ?? "", + Title = entity.Title ?? "", + Content = entity.Content ?? "", + Sort = entity.Sort, + IsEnable = entity.IsEnable, + CreateTime = entity.CreateTime + }; + } + + } + + public class FaqCategoryDto + { + public string Id { get; set; } + public string ParentId { get; set; } + public string Name { get; set; } + public string Icon { get; set; } + public int Sort { get; set; } + public bool IsEnable { get; set; } + } + + public class FaqCategoryTreeNodeDto + { + public string Id { get; set; } + public string Name { get; set; } + public string Icon { get; set; } + public int Sort { get; set; } + public bool IsEnable { get; set; } + public List Children { get; set; } = new(); + public int QuestionCount { get; set; } + } + + public class FaqQuestionDto + { + public string Id { get; set; } + public string CategoryId { get; set; } + public string Title { get; set; } + public string Content { get; set; } + public int Sort { get; set; } + public bool IsEnable { get; set; } + public DateTime CreateTime { get; set; } + } + + public class FaqQueryParam + { + public string? CategoryId { get; set; } + public int PageIndex { get; set; } = 1; + public int PageSize { get; set; } = 10; + } +} diff --git a/AdminSrc/AdminApi/Feedbacks/FeedbackManageController.cs b/AdminSrc/AdminApi/Feedbacks/FeedbackManageController.cs new file mode 100644 index 0000000..423d5e6 --- /dev/null +++ b/AdminSrc/AdminApi/Feedbacks/FeedbackManageController.cs @@ -0,0 +1,163 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Common; +using CommonInfrastructure; +using Microsoft.AspNetCore.Mvc; +using MongoRepository; +using UserDomain; +using UserDomain.Entity; +using UserDomain.Param; + +namespace AdminApi.Feedbacks +{ + [ApiController, Route("adminapi/[controller]")] + public class FeedbackManageController : BaseController + { + private readonly IUserFeedbackService _feedbackService; + private readonly IMongoBaseRepository _feedbackRepo; + + public FeedbackManageController(IUserFeedbackService feedbackService, IMongoBaseRepository feedbackRepo) + { + _feedbackService = feedbackService; + _feedbackRepo = feedbackRepo; + } + + [HttpPost("List")] + public async Task> GetList([FromBody] FeedbackQueryParam param) + { + var result = await _feedbackService.QueryPage(param); + var dtos = result.list.Select(MapToDto); + return this.ToPageResult(dtos, (int)result.count); + } + + [HttpGet("Detail")] + public async Task> GetDetail(string id) + { + var feedback = await _feedbackRepo.FindOneAsync(x => x.Id == id); + if (feedback == null) + return this.ToFailResult("反馈不存在"); + + return this.ToResult(MapToDetailDto(feedback)); + } + + [HttpPost("Reply")] + public async Task> Reply([FromBody] ReplyFeedbackParam param) + { + var feedback = await _feedbackRepo.FindOneAsync(x => x.Id == param.Id); + if (feedback == null) + return this.ToFailResult("反馈不存在"); + + feedback.Reply = param.Reply; + feedback.Status = param.Status; + feedback.ReplyTime = DateTime.Now; + feedback.ReplyAdminId = loginUser.UserId; + feedback.ReplyAdminName = loginUser.UserName; + + var result = await _feedbackRepo.ReplaceOneAsync(feedback); + if (result.ok) + return this.ToResult("回复成功"); + else + return this.ToFailResult("回复失败"); + } + + [HttpPost("Delete")] + public async Task> Delete(string id) + { + var result = await _feedbackRepo.DeleteByIdAsync(id); + if (result.ok) + return this.ToResult("删除成功"); + else + return this.ToFailResult("删除失败"); + } + + private static FeedbackDto MapToDto(UserFeedback entity) + { + return new FeedbackDto + { + Id = entity.Id, + UserId = entity.UserId ?? "", + UserNumber = entity.UserNumber ?? "", + UserName = entity.UserName ?? "", + Type = entity.Type, + Title = entity.Title ?? "", + Content = entity.Content ?? "", + Images = string.IsNullOrEmpty(entity.Images) ? new List() : entity.Images.Split(',').ToList(), + QQ = entity.QQ ?? "", + Contact = entity.Contact ?? "", + Status = entity.Status, + Reply = entity.Reply ?? "", + ReplyTime = entity.ReplyTime, + SubmitTime = entity.SubmitTime + }; + } + + private static FeedbackDetailDto MapToDetailDto(UserFeedback entity) + { + return new FeedbackDetailDto + { + Id = entity.Id, + UserId = entity.UserId ?? "", + UserNumber = entity.UserNumber ?? "", + UserName = entity.UserName ?? "", + Type = entity.Type, + Title = entity.Title ?? "", + Content = entity.Content ?? "", + Images = string.IsNullOrEmpty(entity.Images) ? new List() : entity.Images.Split(',').ToList(), + QQ = entity.QQ ?? "", + Contact = entity.Contact ?? "", + Status = entity.Status, + Reply = entity.Reply ?? "", + ReplyTime = entity.ReplyTime, + ReplyAdminId = entity.ReplyAdminId ?? "", + ReplyAdminName = entity.ReplyAdminName ?? "", + SubmitTime = entity.SubmitTime + }; + } + } + + public class FeedbackDto + { + public string Id { get; set; } + public string UserId { get; set; } + public string UserNumber { get; set; } + public string UserName { get; set; } + public int Type { get; set; } + public string Title { get; set; } + public string Content { get; set; } + public List Images { get; set; } + /// + /// QQ + /// + public string QQ { get; set; } + public string Contact { get; set; } + public int Status { get; set; } + public string Reply { get; set; } + public DateTime? ReplyTime { get; set; } + public DateTime SubmitTime { get; set; } + } + + public class FeedbackDetailDto + { + public string Id { get; set; } + public string UserId { get; set; } + public string UserNumber { get; set; } + public string UserName { get; set; } + public int Type { get; set; } + public string Title { get; set; } + public string Content { get; set; } + public List Images { get; set; } + /// + /// QQ + /// + public string QQ { get; set; } + public string Contact { get; set; } + public int Status { get; set; } + public string Reply { get; set; } + public DateTime? ReplyTime { get; set; } + public string ReplyAdminId { get; set; } + public string ReplyAdminName { get; set; } + public DateTime SubmitTime { get; set; } + } +} diff --git a/AdminSrc/AdminApi/GameConfigs/ActivityConfigController.cs b/AdminSrc/AdminApi/GameConfigs/ActivityConfigController.cs new file mode 100644 index 0000000..c7b2b2c --- /dev/null +++ b/AdminSrc/AdminApi/GameConfigs/ActivityConfigController.cs @@ -0,0 +1,224 @@ +using System.Text; +using AdminService.GameConfigs; +using Common; +using CommonDomain; +using CommonDomain.BaseModel; +using CommonInfrastructure; +using Microsoft.AspNetCore.Mvc; +using NewLife; +using RedisService; +using XAct; + +namespace AdminApi.GameConfigs +{ + [ApiController, Route("adminapi/[controller]")] + public class ActivityConfigController : BaseController + { + private readonly IActivityConfigService _activityConfigService; + private readonly IRedisService _redisService; + + public ActivityConfigController(IActivityConfigService activityConfigService, IRedisService redisService) + { + _activityConfigService = activityConfigService; + _redisService = redisService; + } + + [HttpGet] + [HttpGet("Get")] + public async Task> Get() + { + var config = await _activityConfigService.Get(); + if (config != null) + return this.ToResult(config); + else + return this.ToFailResult("配置不存在"); + } + + [HttpPost("Update")] + public async Task> Update(ActivityConfig config) + { + var res = await _activityConfigService.Update(config); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpPost("Delete")] + public async Task> Delete() + { + var res = await _activityConfigService.Delete(); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpPost("UpdateBattleOrder")] + public async Task> UpdateBattleOrder(BattleOrderConfig config) + { + var activityConfig = await _activityConfigService.Get() ?? new ActivityConfig(); + activityConfig.BattleOrderConfig = config; + var res = await _activityConfigService.Update(activityConfig); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpPost("UpdateRelief")] + public async Task> UpdateRelief(ReliefConfig config) + { + var activityConfig = await _activityConfigService.Get() ?? new ActivityConfig(); + activityConfig.ReliefConfig = config; + var res = await _activityConfigService.Update(activityConfig); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpPost("UpdateSign")] + public async Task> UpdateSign(List configs) + { + var activityConfig = await _activityConfigService.Get() ?? new ActivityConfig(); + activityConfig.SignConfigs = configs; + var res = await _activityConfigService.Update(activityConfig); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpPost("UpdateGoldShop")] + public async Task> UpdateGoldShop(List configs) + { + var activityConfig = await _activityConfigService.Get() ?? new ActivityConfig(); + activityConfig.GoldShopConfigs = configs; + var res = await _activityConfigService.Update(activityConfig); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpPost("UpdateDiamondShop")] + public async Task> UpdateDiamondShop(List configs) + { + var activityConfig = await _activityConfigService.Get() ?? new ActivityConfig(); + activityConfig.DiamondShopConfigs = configs; + var res = await _activityConfigService.Update(activityConfig); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpPost("UpdateRegister")] + public async Task> UpdateRegister(RegisterConfig config) + { + var activityConfig = await _activityConfigService.Get() ?? new ActivityConfig(); + activityConfig.RegisterConfig = config; + var res = await _activityConfigService.Update(activityConfig); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpPost("UpdateFishingReturn")] + public async Task> UpdateFishingReturn(FishingReturnConfig config) + { + var activityConfig = await _activityConfigService.Get() ?? new ActivityConfig(); + activityConfig.FishingReturnConfig = config; + var res = await _activityConfigService.Update(activityConfig); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpGet("GetFishingReturn")] + public async Task> GetFishingReturn() + { + var config = await _activityConfigService.Get(); + if (config?.FishingReturnConfig != null) + return this.ToResult(config.FishingReturnConfig); + else + return this.ToFailResult("配置不存在"); + } + + [HttpGet("SaveSection/{sectionName}")] + public async Task> SaveSection(string sectionName) + { + var prop = typeof(ActivityConfig).GetProperty(sectionName); + if (prop == null) + return this.ToFailResult($"板块 {sectionName} 不存在"); + + var config = await _activityConfigService.Get(); + if (config == null) + return this.ToFailResult("配置不存在"); + + var sectionValue = prop.GetValue(config); + if (sectionValue == null) + return this.ToFailResult($"板块 {sectionName} 数据为空"); + + var jsonPath = global::System.IO.Path.Combine(AppContext.BaseDirectory, "Config", "activityconfig.json"); + + try + { + await _activityConfigService.Update(config); + + ActivityConfig fileConfig; + if (global::System.IO.File.Exists(jsonPath)) + { + var json = await global::System.IO.File.ReadAllTextAsync(jsonPath, global::System.Text.Encoding.UTF8); + fileConfig = global::System.Text.Json.JsonSerializer.Deserialize(json, new global::System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true, ReadCommentHandling = global::System.Text.Json.JsonCommentHandling.Skip }) ?? new ActivityConfig(); + } + else + { + fileConfig = new ActivityConfig(); + } + + prop.SetValue(fileConfig, sectionValue); + + var outJson = global::System.Text.Json.JsonSerializer.Serialize(fileConfig, new global::System.Text.Json.JsonSerializerOptions + { + WriteIndented = true, + Encoder = global::System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }); + await global::System.IO.File.WriteAllTextAsync(jsonPath, outJson, global::System.Text.Encoding.UTF8); + + return this.ToResult($"{sectionName} 已保存到 activityconfig.json"); + } + catch (Exception ex) + { + return this.ToFailResult($"保存失败: {ex.Message}"); + } + } + + [HttpGet("ExportSection/{sectionName}")] + public async Task ExportSection(string sectionName) + { + var config = await _activityConfigService.Get(); + if (config == null) + return NotFound("配置不存在"); + + var prop = typeof(ActivityConfig).GetProperty(sectionName); + if (prop == null) + return NotFound($"板块 {sectionName} 不存在"); + + var data = prop.GetValue(config); + if (data == null) + return NotFound($"板块 {sectionName} 数据为空"); + + var json = global::System.Text.Json.JsonSerializer.Serialize(data, new global::System.Text.Json.JsonSerializerOptions + { + WriteIndented = true, + Encoder = global::System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }); + return File(global::System.Text.Encoding.UTF8.GetBytes(json), "application/json", $"{sectionName}.json"); + } + + } +} diff --git a/AdminSrc/AdminApi/GameConfigs/AdminRoomController.cs b/AdminSrc/AdminApi/GameConfigs/AdminRoomController.cs new file mode 100644 index 0000000..17f2fe4 --- /dev/null +++ b/AdminSrc/AdminApi/GameConfigs/AdminRoomController.cs @@ -0,0 +1,828 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using AdminService.GameConfigs; +using ChessGameDomain; +using Common; +using CommonDomain; +using CommonDomain.Enum; +using CommonInfrastructure; +using DotNetCore.CAP; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using MongoRepository; +using RedisService; +using RedisService.Param; +using UserDomain.Entity; + +namespace AdminApi.GameConfigs +{ + [ApiController, Route("adminapi/Admin/[controller]")] + [Authorize] + public class RoomController : BaseController + { + private readonly IRedisService _redisService; + private readonly IGameConfigService _gameConfigService; + private readonly ICapPublisher _capPublisher; + private readonly IMongoBaseRepository _userMongo; + private readonly ILogger _logger; + + public RoomController(IRedisService redisService, IGameConfigService gameConfigService, ICapPublisher capPublisher, IMongoBaseRepository userMongo, ILogger logger) + { + _redisService = redisService; + _gameConfigService = gameConfigService; + _capPublisher = capPublisher; + _userMongo = userMongo; + _logger = logger; + } + + [HttpGet("GetAllRooms")] + public async Task> GetAllRooms( + int pageIndex = 1, + int pageSize = 20, + int? roomLevel = null, + string? gameType = null, + string? sortField = null, + string? sortOrder = "desc") + { + var rooms = GetAllRoomsFromRedis()?.ToList() ?? new List(); + + foreach (var room in rooms) + { + if (room?.Players != null && room.Players.Count > 1) + room.Players = room.Players.OrderBy(p => p.Position).ToList(); + } + + if (roomLevel.HasValue) + { + rooms = rooms.Where(r => r != null && r.RoomLevel == roomLevel.Value).ToList(); + } + + if (!string.IsNullOrEmpty(gameType) && int.TryParse(gameType, out var gameTypeValue)) + { + rooms = rooms.Where(r => r != null && (int)r.GameType == gameTypeValue).ToList(); + } + + var total = rooms.Count; + + if (!string.IsNullOrEmpty(sortField)) + { + switch (sortField.ToLower()) + { + case "currentonline": + rooms = sortOrder?.ToLower() == "asc" + ? rooms.OrderBy(r => r.CurrentOnlinePlayerCount).ToList() + : rooms.OrderByDescending(r => r.CurrentOnlinePlayerCount).ToList(); + break; + case "robotcount": + rooms = sortOrder?.ToLower() == "asc" + ? rooms.OrderBy(r => r.RobotCount).ToList() + : rooms.OrderByDescending(r => r.RobotCount).ToList(); + break; + case "roomlevel": + rooms = sortOrder?.ToLower() == "asc" + ? rooms.OrderBy(r => r.RoomLevel).ToList() + : rooms.OrderByDescending(r => r.RoomLevel).ToList(); + break; + default: + rooms = rooms.OrderByDescending(r => r.RoomId).ToList(); + break; + } + } + + var pagedRooms = rooms.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList(); + + return this.ToPageResult(pagedRooms, total); + } + + [HttpGet("GetAllChessRooms")] + public async Task> GetAllChessRooms( + int pageIndex = 1, + int pageSize = 20, + int? state = null, + int? gameType = null) + { + var rooms = _redisService.GetAllChessRooms()?.ToList(); + if (state.HasValue) + { + rooms = rooms.Where(r => r != null && r.state == state.Value).ToList(); + } + + if (gameType.HasValue) + { + rooms = rooms.Where(r => r != null && r.gameType == gameType.Value).ToList(); + } + + var total = rooms.Count; + + rooms = rooms.OrderByDescending(r => r.CreateTime).ToList(); + + var pagedRooms = rooms.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList(); + + return this.ToPageResult(pagedRooms, total); + } + + [HttpGet("GetChessRoomDetail")] + public async Task> GetChessRoomDetail(string roomId) + { + var room = _redisService.GetChessRoom(roomId); + if (room == null) + return this.ToFailResult("房间不存在"); + + return this.ToResult(room); + } + + [HttpGet("ClearChessRoom")] + public async Task> ClearChessRoom(string roomId) + { + var room = _redisService.GetChessRoom(roomId); + if (room == null) + return this.ToFailResult("房间不存在"); + + int playerCount = 0; + foreach (var user in room.users.ToList()) + { + try + { + var userRedis = _redisService.GetRedisUserCId(user.userId); + if (userRedis != null) + { + userRedis.CId = ""; + _redisService.SetRedisUserCId(userRedis); + } + playerCount++; + } + catch (Exception ex) + { + _logger.LogError(ex, "管理员清空象棋房间 清理userRedis失败 roomId={RoomId} userId={UserId}", roomId, user.userId); + } + } + + room.users.Clear(); + room.state = 0; + room.robotCount = 0; + room.gold = 0; + room.gameType = 0; + room.password = ""; + room.IsGameEnded = false; + room.EndGameRequests?.Clear(); + room.PendingWinUserId = null; + room.TimeoutLoserUserId = ""; + room.LastActiveTime = 0; + _redisService.SetChessRoom(room); + + return this.ToResult($"已清空房间 {roomId} 的所有玩家({playerCount} 人)"); + } + + [HttpGet("KickChessPlayer")] + public async Task> KickChessPlayer(string roomId, string userId) + { + if (string.IsNullOrWhiteSpace(roomId) || string.IsNullOrWhiteSpace(userId)) + return this.ToFailResult("房间ID和玩家ID不能为空"); + + var room = _redisService.GetChessRoom(roomId); + if (room == null) + return this.ToFailResult("房间不存在"); + if (room.state == 2) + return this.ToFailResult("游戏进行中不能直接踢人,请先结束对局"); + if (room.users?.Any(u => u.userId == userId) != true) + return this.ToFailResult("玩家不在该房间中"); + + await _capPublisher.PublishAsync(TopicKeys.后台踢出象棋玩家, new AdminKickChessPlayerMessage + { + RoomId = roomId, + UserId = userId, + Reason = "被管理员移出房间" + }); + + return this.ToResult("踢人指令已提交"); + } + + [HttpGet("GetChessRoomStatistics")] + public async Task> GetChessRoomStatistics() + { + var rooms = _redisService.GetAllChessRooms() ?? new List(); + + var stats = new ChessRoomStatistics + { + TotalRooms = rooms.Count, + EmptyRooms = rooms.Count(r => r.state == 0 && + (r.users == null || !r.users.Any(u => u != null && !u.IsLeave)) && + r.robotCount == 0), + WaitingRooms = rooms.Count(r => r.state == 1), + PlayingRooms = rooms.Count(r => r.state == 2), + FinishedRooms = rooms.Count(r => r.state == 3), + TotalPlayers = rooms.SelectMany(r => r.users ?? new List()).Count(), + BlackSidePlayers = rooms.SelectMany(r => r.users ?? new List()).Count(u => u.type == 1), + RedSidePlayers = rooms.SelectMany(r => r.users ?? new List()).Count(u => u.type == 2) + }; + + stats.EmptyRoomRate = stats.TotalRooms == 0 + ? 0 + : Math.Round(stats.EmptyRooms * 100.0 / stats.TotalRooms, 2); + + return this.ToResult(stats); + } + + [HttpGet("DeleteChessRoom")] + public async Task> DeleteChessRoom(string roomId) + { + var room = _redisService.GetChessRoom(roomId); + if (room == null) + return this.ToFailResult("房间不存在"); + + _redisService.RemoveChessRoom(roomId); + + return this.ToResult("已删除房间 " + roomId); + } + + [HttpGet("AddChessRobot")] + public async Task> AddChessRobot(string roomId, int count) + { + var room = _redisService.GetChessRoom(roomId); + if (room == null) + return this.ToFailResult("房间不存在"); + + var realPlayers = room.users?.Where(u => u != null && !u.IsLeave).ToList(); + if (realPlayers != null && realPlayers.Count > 0) + return this.ToFailResult("房间有真人玩家,不能修改机器人数量"); + + room.robotCount += count; + ApplyRobotStateRule(room); + _redisService.SetChessRoom(room); + + return this.ToResult("添加成功"); + } + + [HttpGet("SetChessRobot")] + public async Task> SetChessRobot(string roomId, int count) + { + var room = _redisService.GetChessRoom(roomId); + if (room == null) + return this.ToFailResult("房间不存在"); + + var realPlayers = room.users?.Where(u => u != null && !u.IsLeave).ToList(); + if (realPlayers != null && realPlayers.Count > 0) + return this.ToFailResult("房间有真人玩家,不能修改机器人数量"); + + room.robotCount = Math.Clamp(count, 0, 2); + ApplyRobotStateRule(room); + _redisService.SetChessRoom(room); + + return this.ToResult("设置成功"); + } + + [HttpGet("GetRoomDetail")] + public async Task> GetRoomDetail(string roomId) + { + var room = _redisService.GetGameRoom(roomId); + if (room == null) + return this.ToFailResult("房间不存在"); + + return this.ToResult(room); + } + + [HttpGet("GetUserRoomRealtime")] + [ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)] + public async Task> GetUserRoomRealtime(string userId) + { + if (string.IsNullOrWhiteSpace(userId)) + return this.ToFailResult("用户ID不能为空"); + + var dto = new UserRoomRealtimeDto { Found = true }; + + var user = await _userMongo.FindByIdAsync(userId); + var factor = user?.PlayerFactor ?? new PlayerFactor(); + + dto.Gold = user?.Assets?.Gold ?? 0; + dto.TotalRechargeGold = user?.Static?.TotalRechargeGold ?? 0; + + RedisGameRoom? matchedRoom = null; + RedisGamePlayer? matchedPlayer = null; + var session = _redisService.GetRedisUserCId(userId); + if (!string.IsNullOrWhiteSpace(session?.RoomId)) + { + matchedRoom = _redisService.GetGameRoom(session.RoomId); + matchedPlayer = matchedRoom?.Players? + .FirstOrDefault(p => p != null && !p.IsBot && p.UserId == userId); + } + + if (matchedPlayer == null) + { + var fallback = _redisService.GetGameRoomAllList() + .Where(r => r != null && r.Players != null) + .SelectMany(r => r.Players.Select(p => new { Room = r, Player = p })) + .FirstOrDefault(x => x.Player != null && !x.Player.IsBot && x.Player.UserId == userId); + matchedRoom = fallback?.Room; + matchedPlayer = fallback?.Player; + } + + if (matchedRoom != null && matchedPlayer != null) + { + var room = matchedRoom; + var player = matchedPlayer; + dto.InRoom = true; + dto.RoomId = room.RoomId; + dto.RoomName = room.RoomName; + dto.GameType = (int)room.GameType; + dto.GameTypeName = room.GameType.ToString(); + dto.RoomLevel = room.RoomLevel; + dto.RoomPartition = room.RoomPartition; + dto.RoomNumber = room.RoomNumber; + dto.SystemFactor = room.SystemFactor; + dto.CurrentOnlinePlayerCount = room.CurrentOnlinePlayerCount; + dto.RobotCount = room.RobotCount; + dto.Position = player.Position; + dto.UserName = player.UserName; + dto.UserNumber = player.UserNumber; + dto.Gold = player.Gold; + dto.MaxGold = player.MaxGold; + dto.BeginCoin = player.BeginCoin; + dto.CannonMultiple = player.CannonMultiple; + dto.CannonId = player.CannonId; + dto.State = player.State; + dto.IsAfk = player.IsAfk; + dto.TotalRechargeGold = player.TotalRechargeGold; + + var delta = player.Gold - player.BeginCoin; + dto.WinGold = delta > 0 ? delta : 0; + dto.LoseGold = delta < 0 ? -delta : 0; + + var realtimeFactor = player.PlayerFactor ?? new PlayerFactor(); + if (realtimeFactor.ViolateValue > 0) + factor.ViolateValue = realtimeFactor.ViolateValue; + } + + dto.IsBlack = factor.IsBlack; + dto.IsIgnore = factor.IsIgnore; + dto.ViolateValue = factor.ViolateValue; + dto.AdditionalFactor = factor.AdditionalFactor; + dto.MissRate = factor.MissRate; + dto.CompensateQuota = factor.CompensateQuota; + dto.CompensateStartGold = factor.CompensateStartGold; + dto.CompensateTargetGold = factor.CompensateTargetGold; + if (factor.CompensateQuota <= 0) + dto.CompensateRemainingQuota = 0; + else + dto.CompensateRemainingQuota = factor.CompensateTargetGold > 0 + ? Math.Max(0, factor.CompensateTargetGold - dto.Gold) + : Math.Max(0, factor.CompensateQuota); + dto.PenaltyQuota = factor.PenaltyQuota; + dto.StartingBonus = factor.StartingBonus; + dto.CompensateRateBoss = factor.CompensateRate?.BossRate ?? 0; + dto.CompensateRateGold = factor.CompensateRate?.GoldRate ?? 0; + dto.CompensateRateSpecial = factor.CompensateRate?.SpecialRate ?? 0; + dto.CompensateRateOrdinary = factor.CompensateRate?.Ordinary ?? 0; + dto.PenaltyRateBoss = factor.PenaltyRate?.BossRate ?? 0; + dto.PenaltyRateGold = factor.PenaltyRate?.GoldRate ?? 0; + dto.PenaltyRateSpecial = factor.PenaltyRate?.SpecialRate ?? 0; + dto.PenaltyRateOrdinary = factor.PenaltyRate?.Ordinary ?? 0; + + return this.ToResult(dto); + } + + [HttpGet("AddRobot")] + public async Task> AddRobot(string roomId, int count) + { + var room = _redisService.GetGameRoom(roomId); + if (room == null) + return this.ToFailResult("房间不存在"); + + if (count < 0) + return this.ToFailResult("机器人增加数量不能小于0"); + + var realPlayerCount = room.Players?.Count(p => !p.IsBot) ?? room.CurrentOnlinePlayerCount; + room.CurrentOnlinePlayerCount = realPlayerCount; + room.RobotCount = Math.Clamp(room.RobotCount + count, 0, Math.Max(0, room.MaxPlayerCount - realPlayerCount)); + if (room.Players != null) + { + var excessBots = room.Players.Where(p => p.IsBot).Skip(room.RobotCount).ToList(); + foreach (var bot in excessBots) + { + _redisService.ClearBulletIds(roomId, bot.UserId); + room.Players.Remove(bot); + } + room.RobotCount = Math.Max(room.RobotCount, room.Players.Count(p => p.IsBot)); + } + _redisService.SetGameRoom(room); + + return this.ToResult($"已为房间 {roomId} 添加 {count} 个机器人"); + } + + [HttpGet("SetRobotCount")] + public async Task> SetRobotCount(string roomId, int count) + { + var room = _redisService.GetGameRoom(roomId); + if (room == null) + return this.ToFailResult("房间不存在"); + + if (count < 0) + return this.ToFailResult("机器人数量不能小于0"); + + var realPlayerCount = room.Players?.Count(p => !p.IsBot) ?? room.CurrentOnlinePlayerCount; + room.CurrentOnlinePlayerCount = realPlayerCount; + room.RobotCount = Math.Clamp(count, 0, Math.Max(0, room.MaxPlayerCount - realPlayerCount)); + if (room.Players != null) + { + var excessBots = room.Players.Where(p => p.IsBot).Skip(room.RobotCount).ToList(); + foreach (var bot in excessBots) + { + _redisService.ClearBulletIds(roomId, bot.UserId); + room.Players.Remove(bot); + } + room.RobotCount = Math.Max(room.RobotCount, room.Players.Count(p => p.IsBot)); + } + _redisService.SetGameRoom(room); + + return this.ToResult($"已将房间 {roomId} 的机器人数量设置为 {count}"); + } + + [HttpGet("RegenerateAllBotIds")] + public async Task> RegenerateAllBotIds() + { + var rooms = GetAllRoomsFromRedis()?.ToList() ?? new List(); + int totalBots = 0; + + foreach (var room in rooms) + { + if (room?.Players == null || room.Players.Count == 0) + continue; + + var bots = room.Players.Where(p => p.IsBot).ToList(); + if (bots.Count == 0) + continue; + + foreach (var bot in bots) + { + var oldUserId = bot.UserId; + bot.UserId = Guid.NewGuid().ToString("N"); + bot.UserNumber = Common.Utils.RandomHelper.RandomNumbers(8); + totalBots++; + } + + _redisService.SetGameRoom(room); + } + + + return this.ToResult($"已刷新 {totalBots} 个机器人编号(涉及 {rooms.Count(r => r?.Players?.Any(p => p.IsBot) == true)} 个房间)"); + } + + [HttpGet("ClearRoom")] + public async Task> ClearRoom(string roomId) + { + var room = _redisService.GetGameRoom(roomId); + if (room == null) + return this.ToFailResult("房间不存在"); + + int success = 0, fail = 0; + + foreach (var player in room.Players.Where(p => !p.IsBot).ToList()) + { + try + { + await _capPublisher.PublishAsync(TopicKeys.游戏金币结算, new + { + UserId = player.UserId, + BeforeGold = player.BeginCoin, + AfterGold = player.Gold, + Remark = "管理员清空房间结算", + RoomName = room.RoomName ?? "", + RoomInfo = room.RoomId ?? "" + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "管理员清空房间 CAP 结算失败 roomId={RoomId} userId={UserId}", roomId, player.UserId); + } + + try { _redisService.ClearBulletIds(roomId, player.UserId); } + catch (Exception ex) { _logger.LogError(ex, "管理员清空房间 清理子弹失败 roomId={RoomId} userId={UserId}", roomId, player.UserId); } + + try + { + var userRedis = _redisService.GetRedisUserCId(player.UserId); + if (userRedis != null && userRedis.RoomId == roomId) + { + userRedis.RoomId = ""; + userRedis.CId = ""; + _redisService.SetRedisUserCId(userRedis); + } + success++; + } + catch (Exception ex) + { + _logger.LogError(ex, "管理员清空房间 清理userRedis失败 roomId={RoomId} userId={UserId}", roomId, player.UserId); + fail++; + } + } + + foreach (var player in room.Players.Where(p => p.IsBot).ToList()) + { + try { _redisService.ClearBulletIds(roomId, player.UserId); } + catch { } + } + + var robotCount = room.RobotCount; + room.Players.Clear(); + room.CurrentOnlinePlayerCount = 0; + room.RobotCount = Math.Clamp(robotCount, 0, room.MaxPlayerCount); + _redisService.SetGameRoom(room); + + var msg = fail > 0 + ? $"已清空房间 {roomId}:成功 {success} 人,失败 {fail} 人" + : $"已清空房间 {roomId} 的所有玩家({success} 人)"; + return this.ToResult(msg); + } + + [HttpGet("GetRoomStatistics")] + public async Task> GetRoomStatistics() + { + var rooms = GetAllRoomsFromRedis(); + if (rooms == null || rooms.Count() == 0) + { + return this.ToResult(new RoomStatistics()); + } + var stats = new RoomStatistics + { + TotalRooms = rooms?.Count()?? 0, + TotalPlayers = rooms?.Where(_=>_!=null).Sum(r => r.CurrentOnlinePlayerCount) ?? 0, + TotalRobots = rooms?.Where(_ => _ != null).Sum(r => r.RobotCount) ?? 0 + }; + + if (rooms != null && rooms.Count() > 0) + { + stats.RoomsByLevel = rooms.Where(_ => _ != null).GroupBy(r => r.RoomLevel) + .ToDictionary(g => g.Key, g => g.Count()); + + stats.RoomsByType = rooms.Where(_ => _ != null).GroupBy(r => r.GameType.ToString()) + .ToDictionary(g => g.Key, g => g.Count()); + } + + return this.ToResult(stats); + } + + [HttpGet("RepairChessRooms")] + public async Task> RepairChessRooms() + { + var rooms = _redisService.GetAllChessRooms(); + if (rooms == null || rooms.Count == 0) + return this.ToFailResult("没有象棋房间"); + + int fixedCount = 0; + foreach (var room in rooms) + { + if (room.users != null && room.users.Any(u => !u.IsLeave)) + continue; + + ApplyRobotStateRule(room); + _redisService.SetChessRoom(room); + fixedCount++; + } + + return this.ToResult($"已修复 {fixedCount} 个象棋房间"); + } + + [HttpGet("InitRooms")] + public async Task> InitRooms() + { + _redisService.RemoveGameRoomAll(); + _redisService.ClearAllChessRooms(); + await _gameConfigService.InitRoom(); + + var config = await _gameConfigService.Get(); + var chessRoomConfigs = config?.RoomConfigs.Where(c => c.GameType == GameTypeEnum.中国象棋).ToList(); + if (chessRoomConfigs != null) + { + foreach (var roomConfig in chessRoomConfigs) + { + for (int y = 1; y <= roomConfig.RoomPartitionNum; y++) + { + for (int i = 0; i < roomConfig.RoomCount; i++) + { + var room = new ChessGameRoom + { + RoomId = $"{(int)GameTypeEnum.中国象棋}{y}{i.ToString("00")}", + CreateTime = DateTime.Now, + createUserId = "", + gameType = 0, + gold = roomConfig.RoomGoldLimit, + Id = Guid.NewGuid().ToString(), + users = new List(), + EndGameRequests = new Dictionary(), + LastActiveTime = 0, + TimeoutSeconds = 60, + robotCount = 0 + }; + ApplyRobotStateRule(room); + _redisService.SetChessRoom(room); + } + } + } + } + + return this.ToResult("房间初始化成功"); + } + + [HttpGet("ReInitChessRooms")] + public async Task> ReInitChessRooms() + { + var config = await _gameConfigService.Get(); + var chessConfig = config?.ChessConfig; + if (chessConfig == null) + return this.ToFailResult("象棋配置不存在"); + + _redisService.ClearAllChessRooms(); + + var chessRoomConfigs = config.RoomConfigs.Where(c => c.GameType == GameTypeEnum.中国象棋).ToList(); + if (chessRoomConfigs.Count == 0) + return this.ToFailResult("未找到象棋房间配置"); + + int count = 0; + foreach (var roomConfig in chessRoomConfigs) + { + for (int y = 1; y <= roomConfig.RoomPartitionNum; y++) + { + for (int i = 0; i < roomConfig.RoomCount; i++) + { + var room = new ChessGameRoom + { + RoomId = $"{(int)GameTypeEnum.中国象棋}{y}{i.ToString("00")}", + CreateTime = DateTime.Now, + createUserId = "", + gameType = 0, + gold = roomConfig.RoomGoldLimit, + Id = Guid.NewGuid().ToString(), + users = new List(), + EndGameRequests = new Dictionary(), + LastActiveTime = 0, + TimeoutSeconds = 60, + robotCount = 0 + }; + ApplyRobotStateRule(room); + _redisService.SetChessRoom(room); + count++; + } + } + } + + return this.ToResult($"象棋房间已重新初始化,共 {count} 个房间"); + } + + private IEnumerable GetAllRoomsFromRedis() + { + + return _redisService.GetGameRoomAllList(); + } + + private static void ApplyRobotStateRule(ChessGameRoom room) + { + var userCount = room.users?.Count ?? 0; + var totalCount = userCount + room.robotCount; + + if (totalCount == 0) + { + room.state = 0; + room.password = ""; + } + else if (totalCount == 1) + { + room.state = 1; + if (string.IsNullOrEmpty(room.password)) + room.password = Random.Shared.Next(100000, 999999).ToString(); + } + else + { + room.state = 2; + if (string.IsNullOrEmpty(room.password)) + room.password = Random.Shared.Next(100000, 999999).ToString(); + } + } + } + + public class RoomStatistics + { + public int TotalRooms { get; set; } = 0; + + public int TotalPlayers { get; set; } = 0; + + public int TotalRobots { get; set; } = 0; + + public Dictionary RoomsByLevel { get; set; } = new(); + + public Dictionary RoomsByType { get; set; } = new(); + } + + public class ChessRoomStatistics + { + public int TotalRooms { get; set; } = 0; + + public int EmptyRooms { get; set; } = 0; + + public double EmptyRoomRate { get; set; } = 0; + + public int WaitingRooms { get; set; } = 0; + + public int PlayingRooms { get; set; } = 0; + + public int FinishedRooms { get; set; } = 0; + + public int TotalPlayers { get; set; } = 0; + + public int BlackSidePlayers { get; set; } = 0; + + public int RedSidePlayers { get; set; } = 0; + } + + public class UserRoomRealtimeDto + { + public bool Found { get; set; } = false; + + public bool InRoom { get; set; } = false; + + public long WinGold { get; set; } = 0; + + public long LoseGold { get; set; } = 0; + + public string RoomId { get; set; } = string.Empty; + + public string RoomName { get; set; } = string.Empty; + + public int GameType { get; set; } + + public string GameTypeName { get; set; } = string.Empty; + + public int RoomLevel { get; set; } + + public int RoomPartition { get; set; } + + public int RoomNumber { get; set; } + + public double SystemFactor { get; set; } = 1.0; + + public int CurrentOnlinePlayerCount { get; set; } + + public int RobotCount { get; set; } + + public int Position { get; set; } + + public string UserName { get; set; } = string.Empty; + + public string UserNumber { get; set; } = string.Empty; + + public long Gold { get; set; } + + public long BeginCoin { get; set; } + + public long MaxGold { get; set; } + + public int CannonMultiple { get; set; } + + public string CannonId { get; set; } = string.Empty; + + public int State { get; set; } + + public bool IsAfk { get; set; } + + public long TotalRechargeGold { get; set; } + + public bool IsBlack { get; set; } + + public bool IsIgnore { get; set; } + + public double ViolateValue { get; set; } + + public double AdditionalFactor { get; set; } + + public double MissRate { get; set; } + + public int CompensateQuota { get; set; } + + public long CompensateStartGold { get; set; } + + public long CompensateTargetGold { get; set; } + + public long CompensateRemainingQuota { get; set; } + + public int PenaltyQuota { get; set; } + + public long StartingBonus { get; set; } + + public double CompensateRateBoss { get; set; } + + public double CompensateRateGold { get; set; } + + public double CompensateRateSpecial { get; set; } + + public double CompensateRateOrdinary { get; set; } + + public double PenaltyRateBoss { get; set; } + + public double PenaltyRateGold { get; set; } + + public double PenaltyRateSpecial { get; set; } + + public double PenaltyRateOrdinary { get; set; } + } +} diff --git a/AdminSrc/AdminApi/GameConfigs/BotConfigController.cs b/AdminSrc/AdminApi/GameConfigs/BotConfigController.cs new file mode 100644 index 0000000..3b3d863 --- /dev/null +++ b/AdminSrc/AdminApi/GameConfigs/BotConfigController.cs @@ -0,0 +1,63 @@ +using Common; +using CommonDomain; +using CommonInfrastructure; +using Microsoft.AspNetCore.Mvc; +using MongoDB.Driver; +using MongoRepository; + +namespace AdminApi.GameConfigs +{ + [ApiController, Route("adminapi/[controller]")] + public class BotConfigController : BaseController + { + private readonly IMongoBaseRepository _botRepo; + + public BotConfigController(IMongoBaseRepository botRepo) + { + _botRepo = botRepo; + } + + [HttpGet("GetAll")] + public async Task>> GetAll() + { + var list = await _botRepo.FilterByAsync(_ => true); + return this.ToResult(list.ToList()); + } + + [HttpPost("Add")] + public async Task> Add(BotProfileEntity entity) + { + if (string.IsNullOrWhiteSpace(entity.Name)) + return this.ToFailResult("名称不能为空"); + + await _botRepo.InsertOneAsync(entity); + return this.ToResult("添加成功"); + } + + [HttpPost("Update")] + public async Task> Update(BotProfileEntity entity) + { + if (string.IsNullOrWhiteSpace(entity.Id)) + return this.ToFailResult("缺少Id"); + + if (string.IsNullOrWhiteSpace(entity.Name)) + return this.ToFailResult("名称不能为空"); + + var update = Builders.Update + .Set(x => x.Name, entity.Name) + .Set(x => x.Avatar, entity.Avatar ?? string.Empty); + await _botRepo.UpdateByIdAsync(entity.Id, update); + return this.ToResult("更新成功"); + } + + [HttpPost("Delete")] + public async Task> Delete([FromQuery] string id) + { + if (string.IsNullOrWhiteSpace(id)) + return this.ToFailResult("缺少Id"); + + await _botRepo.DeleteByIdAsync(id); + return this.ToResult("删除成功"); + } + } +} diff --git a/AdminSrc/AdminApi/GameConfigs/GameConfigController.cs b/AdminSrc/AdminApi/GameConfigs/GameConfigController.cs new file mode 100644 index 0000000..e275025 --- /dev/null +++ b/AdminSrc/AdminApi/GameConfigs/GameConfigController.cs @@ -0,0 +1,3786 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using Microsoft.Extensions.Logging; +using STT = global::System.Threading.Tasks; +using AdminService.GameConfigs; +using AutoMapper; +using ChessGameDomain; +using ChessGameService; +using Common; +using Common.Utils; +using CommonDomain; +using CommonDomain.BaseModel; +using CommonDomain.Enum; +using CommonInfrastructure; +using FishRoomService.RoomService; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using RedisService; +using XAct; +using static CommonDomain.BaseModel.BossConfig; +using static CommonDomain.BaseModel.BossConfig.BossBombConfig; + using static CommonDomain.BaseModel.BossConfig.BossProbabilityConfig; + using static CommonDomain.BaseModel.BossConfig.BossProbabilityConfigParam; + using static CommonDomain.BaseModel.BossConfig.LuckWheelConfig; + using static CommonDomain.BaseModel.BossConfig.CruiseConfigCount; + using static CommonDomain.BaseModel.BossConfig.ScorpionItemCountConfig; + using static CommonDomain.BaseModel.BossConfig.ScorpionItemConfig; +using static CommonDomain.BaseModel.BossOptionBaseParam; +using static CommonDomain.BaseModel.BattleOrderConfig; +using BattleOrderConfigLevel = CommonDomain.BaseModel.BattleOrderConfig.BattleOrderLevelConfig; +using BattleOrderConfigAdvance = CommonDomain.BaseModel.BattleOrderConfig.AdvanceGiftConfig; + +namespace AdminApi.GameConfigs +{ + [ApiController, Route("adminapi/[controller]")] + + public class GameConfigController : BaseController + { + private readonly IGameConfigService _gameConfigService; + private readonly IMapper _mapper; + private readonly IRedisService _redisService; + + public GameConfigController(IGameConfigService gameConfigService, IMapper mapper, IRedisService redisService) + { + _gameConfigService = gameConfigService; + _mapper = mapper; + _redisService = redisService; + } + + + + + + [HttpGet("init-all")] + public async Task> InitAll([FromServices] IActivityConfigService activityConfigService) + { + await InitGameConfigInternal(); + + await InitActivityConfigInternal(activityConfigService); + + return this.ToResult("所有配置初始化成功"); + } + + [HttpGet("init-game")] + public async Task> InitGame() + { + await InitGameConfigInternal(); + return this.ToResult("游戏配置初始化成功"); + } + + [HttpGet("InitSection/{sectionName}")] + public async Task> InitSection(string sectionName) + { + if (sectionName == "RoomFishProbabilityList") + { + var jsonPath = global::System.IO.Path.Combine(AppContext.BaseDirectory, "Config", "gameconfig.json"); + if (!global::System.IO.File.Exists(jsonPath)) + return this.ToFailResult("gameconfig.json 不存在"); + try + { + var json = await global::System.IO.File.ReadAllTextAsync(jsonPath); + var cfg = global::System.Text.Json.JsonSerializer.Deserialize(json, new global::System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true, ReadCommentHandling = global::System.Text.Json.JsonCommentHandling.Skip }); + if (cfg?.RoomFishConfigs == null) + return this.ToFailResult("配置中无 RoomFishConfigs 数据"); + + var existing = await _gameConfigService.Get() ?? new GameConfig(); + foreach (var jsonRoomCfg in cfg.RoomFishConfigs) + { + var target = existing.RoomFishConfigs.FirstOrDefault(r => r.GameType == jsonRoomCfg.GameType); + if (target != null) + target.RoomFishProbabilityList = jsonRoomCfg.RoomFishProbabilityList; + } + var res = await _gameConfigService.Update(existing); + return res.isok ? this.ToResult("RoomFishProbabilityList 初始化成功") : this.ToFailResult(res.msg); + } + catch (global::System.Text.Json.JsonException ex) + { + return this.ToFailResult($"gameconfig.json 解析失败: {ex.Message}"); + } + } + + var prop = typeof(GameConfig).GetProperty(sectionName); + if (prop == null) + return this.ToFailResult($"板块 {sectionName} 不存在"); + + var jsonPath2 = global::System.IO.Path.Combine(AppContext.BaseDirectory, "Config", "gameconfig.json"); + if (!global::System.IO.File.Exists(jsonPath2)) + return this.ToFailResult("gameconfig.json 不存在,请先执行全量初始化"); + + try + { + var json2 = await global::System.IO.File.ReadAllTextAsync(jsonPath2); + var cfg2 = global::System.Text.Json.JsonSerializer.Deserialize(json2, new global::System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true, ReadCommentHandling = global::System.Text.Json.JsonCommentHandling.Skip }); + if (cfg2 == null) + return this.ToFailResult("配置解析失败"); + + var sectionValue = prop.GetValue(cfg2); + if (sectionValue == null) + return this.ToFailResult($"板块 {sectionName} 数据为空"); + + var existing = await _gameConfigService.Get() ?? new GameConfig(); + prop.SetValue(existing, sectionValue); + + var res = await _gameConfigService.Update(existing); + return res.isok + ? this.ToResult($"{sectionName} 初始化成功") + : this.ToFailResult(res.msg); + } + catch (global::System.Text.Json.JsonException ex) + { + return this.ToFailResult($"gameconfig.json 解析失败: {ex.Message}"); + } + } + + [HttpGet("SaveSection/{sectionName}")] + public async Task> SaveSection(string sectionName) + { + if (sectionName == "RoomFishProbabilityList") + { + var config = await _gameConfigService.Get(); + if (config?.RoomFishConfigs == null) + return this.ToFailResult("配置不存在"); + + var jsonPath = global::System.IO.Path.Combine(AppContext.BaseDirectory, "Config", "gameconfig.json"); + GameConfig fileConfig; + if (global::System.IO.File.Exists(jsonPath)) + { + var json = await global::System.IO.File.ReadAllTextAsync(jsonPath); + fileConfig = global::System.Text.Json.JsonSerializer.Deserialize(json, new global::System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true, ReadCommentHandling = global::System.Text.Json.JsonCommentHandling.Skip }) ?? new GameConfig(); + } + else + { + fileConfig = new GameConfig(); + } + + foreach (var mongoRoomCfg in config.RoomFishConfigs) + { + var target = fileConfig.RoomFishConfigs.FirstOrDefault(r => r.GameType == mongoRoomCfg.GameType); + if (target != null) + target.RoomFishProbabilityList = mongoRoomCfg.RoomFishProbabilityList; + } + + try + { + var output = global::System.Text.Json.JsonSerializer.Serialize(fileConfig, new global::System.Text.Json.JsonSerializerOptions { WriteIndented = true, Encoder = global::System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping }); + await global::System.IO.File.WriteAllTextAsync(jsonPath, output); + return this.ToResult("RoomFishProbabilityList 保存成功"); + } + catch (Exception ex) + { + return this.ToFailResult($"保存失败: {ex.Message}"); + } + } + + var prop = typeof(GameConfig).GetProperty(sectionName); + if (prop == null) + return this.ToFailResult($"板块 {sectionName} 不存在"); + + var config2 = await _gameConfigService.Get(); + if (config2 == null) + return this.ToFailResult("配置不存在,请先执行全量初始化"); + + var sectionValue = prop.GetValue(config2); + if (sectionValue == null) + return this.ToFailResult($"板块 {sectionName} 数据为空"); + + var jsonPath2 = global::System.IO.Path.Combine(AppContext.BaseDirectory, "Config", "gameconfig.json"); + GameConfig fileConfig2; + if (global::System.IO.File.Exists(jsonPath2)) + { + var json2 = await global::System.IO.File.ReadAllTextAsync(jsonPath2); + fileConfig2 = global::System.Text.Json.JsonSerializer.Deserialize(json2, new global::System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true, ReadCommentHandling = global::System.Text.Json.JsonCommentHandling.Skip }) ?? new GameConfig(); + } + else + { + fileConfig2 = new GameConfig(); + } + + prop.SetValue(fileConfig2, sectionValue); + + try + { + var output2 = global::System.Text.Json.JsonSerializer.Serialize(fileConfig2, new global::System.Text.Json.JsonSerializerOptions { WriteIndented = true, Encoder = global::System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping }); + await global::System.IO.File.WriteAllTextAsync(jsonPath2, output2); + return this.ToResult($"{sectionName} 保存成功"); + } + catch (Exception ex) + { + return this.ToFailResult($"保存失败: {ex.Message}"); + } + } + + [HttpGet("init-activity")] + public async Task> InitActivity([FromServices] IActivityConfigService activityConfigService) + { + await InitActivityConfigInternal(activityConfigService); + return this.ToResult("活动配置初始化成功"); + } + + [HttpGet("InitActivitySection/{sectionName}")] + public async Task> InitActivitySection(string sectionName, [FromServices] IActivityConfigService activityConfigService) + { + var prop = typeof(ActivityConfig).GetProperty(sectionName); + if (prop == null) + return this.ToFailResult($"板块 {sectionName} 不存在"); + + var jsonPath = global::System.IO.Path.Combine(AppContext.BaseDirectory, "Config", "activityconfig.json"); + if (!global::System.IO.File.Exists(jsonPath)) + return this.ToFailResult("activityconfig.json 不存在"); + + try + { + var json = await global::System.IO.File.ReadAllTextAsync(jsonPath); + var cfg = global::System.Text.Json.JsonSerializer.Deserialize(json, new global::System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true, ReadCommentHandling = global::System.Text.Json.JsonCommentHandling.Skip }); + if (cfg == null) + return this.ToFailResult("配置解析失败"); + + var sectionValue = prop.GetValue(cfg); + if (sectionValue == null) + return this.ToFailResult($"板块 {sectionName} 数据为空"); + + var existing = await activityConfigService.Get() ?? new ActivityConfig(); + prop.SetValue(existing, sectionValue); + + await activityConfigService.Update(existing); + return this.ToResult($"{sectionName} 初始化成功"); + } + catch (global::System.Text.Json.JsonException ex) + { + return this.ToFailResult($"activityconfig.json 解析失败: {ex.Message}"); + } + } + + private async STT.Task InitGameConfigInternal() + { + var jsonPath = global::System.IO.Path.Combine(AppContext.BaseDirectory, "Config", "gameconfig.json"); + if (global::System.IO.File.Exists(jsonPath)) + { + try + { + var json = await global::System.IO.File.ReadAllTextAsync(jsonPath, global::System.Text.Encoding.UTF8); + var cfg = global::System.Text.Json.JsonSerializer.Deserialize(json, new global::System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true, ReadCommentHandling = global::System.Text.Json.JsonCommentHandling.Skip }); + if (cfg != null) + { + await _gameConfigService.Delete(); + await _gameConfigService.Update(cfg); + return; + } + } + catch (Exception ex) + { + Console.Error.WriteLine($"gameconfig.json 加载失败,回退到代码初始化: {ex.Message}"); + } + } + + await _gameConfigService.Delete(); + + GameConfig config = new GameConfig(); + + + var roomFishConfigs = new RoomFishConfig() { GameType = GameTypeEnum.风雷之渊 }; + int id = 11000; + + var names = new string[] { "彩虹鱼", "小丑鱼", "热带鱼", "乌贼", "箭鱼", "斑点鱼", "海龟", "小河豚", "蝴蝶鱼", "裙摆鱼", "水母", "海马", "锅盔鱼", "蝙蝠鱼", "锯齿鲨", "鲨鱼" }; + var scores = new int[] { 2, 3, 4, 5, 6, 7, 8, 10, 12, 15, 18, 20, 25, 30, 40, 50 }; + var killWeight = new int[] { 5000, 3333, 2500, 2000, 1666, 1428, 1250, 1000, 833, 666, 555, 500, 400, 333, 250, 222 }; + var pathList = new List>() { + new List { 1,2,3,4,5,6,7,8 }, + new List { 9,10,11,12,13,14,15,16 }, + new List { 17,18,19,20,21,22,23,24 }, + new List { 25,26,27,28,29,30,31,32 }, + new List { 33,34,35,36,37,38,39,40 }, + new List { 41,42,43,44,45,46,47,48 }, + new List { 49,50,51,52,53,54,55,56 }, + new List { 57,58,59,60,61,62,63,64 }, + new List { 65,66,67,68,69,70,71,72 }, + new List { 73,74,75,76,77,78,79,80 }, + new List { 81,82,83,84,85,86,87,88 }, + new List { 89,90,91,92,93,94,95,96 }, + new List { 97,98,99,100,101,102,103,104 }, + new List { 105,106,107,108,109,110,111,112 }, + new List { 113,114,115,116,117,118,119,120 }, + new List { 121,122,123,124,125,126,127,128 } + }; + for (int i = 0; i < names.Count(); i++) + { + id++; + config.FishTypeConfigs.Add(new FishTypeConfig() { FishNumber = id.ToString(), FishName = names[i], FishScore = scores[i], FishType = FishTypeEnum.普通鱼, KillWeight = killWeight[i], PathList = pathList[i] }); + + roomFishConfigs.NormalFishList.Add(new RoomFishDetailConfig() { Type = 1, FishNumber = id.ToString(), MaxCount = 1, FishFrequency = 5, FishWeight = 40, Times = 20 }); + } + + + + + names = new string[] { "银绞鲨", "金绞鲨", "黄金锅盔鱼", "金钱龟", "黄金水母", "金龙鱼" }; + killWeight = new int[] { 166, 100, 83, 66, 50, 40 }; + scores = new int[] { 60, 100, 120, 150, 200, 250 }; + pathList = new List>() { + new List { 129,130,131,132,133,134,135,136 }, + new List { 137,138,139,140,141,142,143,144 }, + new List { 145,146,147,148,149,150,151,152 }, + new List { 153,154,155,156,157,158,159,160 }, + new List { 161,162,163,164,165,166,167,168 }, + new List { 169,170,171,172,173,174,175,176 } }; + for (int i = 0; i < names.Count(); i++) + { + id++; + config.FishTypeConfigs.Add(new FishTypeConfig() { FishNumber = id.ToString(), FishName = names[i], FishScore = scores[i], FishType = FishTypeEnum.黄金鱼, KillWeight = killWeight[i], PathList =pathList[i] }); + + roomFishConfigs.NormalFishList.Add(new RoomFishDetailConfig() { Type = 1, FishNumber = id.ToString(), MaxCount = 1, FishFrequency = 5, FishWeight = 40, Times = 25 }); + } + + names = new string[] { "电鳗", "吞噬鲲", "玲珑宝塔", "聚宝盆", "金龙", "神龙转盘", "炸弹蟹", "青龙", "蟠桃树", "激光蟹", "钻头蟹", "荧光水母", "远古龙龟", "深海灯笼鱼", "深渊鳄鱼", "禄存星君", "苍穹之主", "雷霆之主", "人鱼公主", "霸王蟹", "哥斯拉" }; + killWeight = new int[] { 57, 56, 21, 21, 33, 25, 54, 50, 17, 54, 54, 50, 50, 42, 50, 18, 10, 20, 8, 50, 20 }; + + pathList = new List>() { + + new List {1,9,41 }, + new List {1,2 }, + new List {1,2,3 }, + new List {1,2 }, + new List (), + new List {1,2,3 }, + new List { 3,7,17}, + new List (), + new List { 1,2,3 }, + new List { 19,24,26 }, + new List { 32,40,42 }, + new List { 1,2 }, + new List { 1,2 }, + new List { 1,2 }, + new List { 1,2 }, + new List { 1,2,3 }, + new List (), + new List (), + new List (), + new List { 1,2,3 }, + new List (), + + }; + + var briefs = new string[] { + "发出闪电攻击附近的鱼", + "其巨大的身体可以吞噬一切", + "传说中天界重宝,拥有浩大无穷之力,据说能降伏一切妖魔鬼怪。", + "含有大量宝物,并且会不断变大,价值连城", + "传说中的神兽,象征着吉祥和尊贵,可上天入海,见首不见尾。捕获后最高可获得500倍奖励。", + "多重元宝转盘", + "背着奇怪装置的半机械螃蟹,捕获后可触发全屏炸弹攻击", + "传说中的神龙,全身凝聚雷电的力量,拥有惊人的破坏力。被捕获后将触发双龙戏珠,雷动九天攻击全场。", + "先天王水蟠桃树,九千年一熟,食用后可与日月同庚。", + "背着奇怪装置的半机械螃蟹,捕获后可发射强力激光攻击", + "背着奇怪装置的半机械螃蟹,捕获后可发射弹跳钻头攻击", + "散发着荧光变异水母", + "远古之初,有巨龟如巍峨山峦,身披混沌火焰", + "头悬幽光灯笼,利齿倒钩如囚笼", + "冰封巨鳄,被封印在深渊之中", + "主掌功名利禄的星神其星光辉耀间似蕴含着世间福禄运数的神秘力量。", + "以无上的力量盘踞于苍穹之上,掌控着苍穹的风云变幻。", + "周身环绕紫色雷霆,一次龙吟,都能引发天地轰鸣,雷霆呼啸", + "幽蓝海底的公主,舞姿曼妙,鱼群常伴随它的海螺声出现。", + "蟹中之王,喜欢金银珠宝", + "身躯如山岳般巍峨,每一步踏出都让大地为之颤抖,喷射出的射线足以燃尽一切" + }; + + for (int i = 0; i < names.Count(); i++) + { + id++; + bool isBossOrSpecialBoss = true; + if (names[i] == "炸弹蟹" || names[i] == "钻头蟹" ) + { + if (names[i] == "炸弹蟹") isBossOrSpecialBoss = true; + config.FishTypeConfigs.Add(new FishTypeConfig() { FishNumber = id.ToString(), FishName = names[i], FishBrief = briefs[i], FishScore = 1, FishType = FishTypeEnum.特殊鱼, KillWeight = killWeight[i], PathList = pathList[i] }); + } + else if (names[i] == "苍穹之主") + { + config.FishTypeConfigs.Add(new FishTypeConfig() { FishNumber = id.ToString(), FishName = names[i], FishBrief = briefs[i], FishScore = 200, FishType = FishTypeEnum.特殊Boss, KillWeight = killWeight[i], PathList = pathList[i] }); + } + else if (names[i] == "雷霆之主") + { + config.FishTypeConfigs.Add(new FishTypeConfig() { FishNumber = id.ToString(), FishName = names[i], FishBrief = briefs[i], FishScore = 400, FishType = FishTypeEnum.特殊Boss, KillWeight = killWeight[i], PathList = pathList[i] }); + } + else if (names[i] == "人鱼公主") + { + config.FishTypeConfigs.Add(new FishTypeConfig() { FishNumber = id.ToString(), FishName = names[i], FishBrief = briefs[i], FishScore = 200, FishType = FishTypeEnum.特殊Boss, KillWeight = killWeight[i], PathList = pathList[i] }); + } + else if (names[i] == "哥斯拉") + { + config.FishTypeConfigs.Add(new FishTypeConfig() { FishNumber = id.ToString(), FishName = names[i], FishBrief = briefs[i], FishScore = 500, FishType = FishTypeEnum.特殊Boss, KillWeight = killWeight[i], PathList = pathList[i] }); + } + else if (names[i] == "青龙"|| names[i] == "聚宝盆") + { + config.FishTypeConfigs.Add(new FishTypeConfig() { FishNumber = id.ToString(), FishName = names[i], FishBrief = briefs[i], FishScore = 100, FishType = FishTypeEnum.Boss鱼, KillWeight = killWeight[i], PathList = pathList[i] }); + } + else { + config.FishTypeConfigs.Add(new FishTypeConfig() { FishNumber = id.ToString(), FishName = names[i], FishBrief = briefs[i], FishScore = 1, FishType = FishTypeEnum.Boss鱼, KillWeight = killWeight[i], PathList = pathList[i] }); + } + + var fishTimes = isBossOrSpecialBoss ? 30 : 10; + if (id <= 11027) + { + roomFishConfigs.RoomFishLevelList.Add(new RoomFishLevelConfig() { RoomLevel = 1, Type = 1, FishNumber = id.ToString(), MaxCount = 1, FishFrequency = 30, FishWeight = 1, Times = fishTimes }); + } + if (i <= 11035 && id <= 11041) + { + roomFishConfigs.RoomFishLevelList.Add(new RoomFishLevelConfig() { RoomLevel = 2, Type = 1, FishNumber = id.ToString(), MaxCount = 1, FishFrequency = 30, FishWeight = 1, Times = fishTimes }); + } + + + roomFishConfigs.RoomFishLevelList.Add(new RoomFishLevelConfig() { RoomLevel = 3, Type = 1, FishNumber = id.ToString(), MaxCount = 1, FishFrequency = 30, FishWeight = 1, Times = fishTimes }); + } + + for (int rl = 1; rl <= 3; rl++) + { + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = rl, Type = 1, FishType = FishTypeEnum.普通鱼, + FirstFishCountRange = new List { 20, 30 }, + TimeRange = new List { 20, 20 }, + CountRange = new List { 20, 30 }, + MaxCountRange = new List { 20, 30 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = rl, Type = 1, FishType = FishTypeEnum.黄金鱼, + FirstFishCountRange = new List { 2, 3 }, + TimeRange = new List { 15, 20 }, + CountRange = new List { 2, 3 }, + MaxCountRange = new List { 2, 3 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = rl, Type = 1, FishType = FishTypeEnum.Boss鱼, + FirstFishCountRange = new List { 2, 3 }, + TimeRange = new List { 30, 30 }, + CountRange = new List { 2, 3 }, + MaxCountRange = new List { 2, 3 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = rl, Type = 1, FishType = FishTypeEnum.特殊鱼, + FirstFishCountRange = new List { 1, 2 }, + TimeRange = new List { 30, 30 }, + CountRange = new List { 1, 2 }, + MaxCountRange = new List { 1, 2 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = rl, Type = 1, FishType = FishTypeEnum.特殊Boss, + FirstFishCountRange = new List { 0, 0 }, + TimeRange = new List { 25, 30 }, + CountRange = new List { 1, 1 }, + MaxCountRange = new List { 1, 1 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = rl, Type = 2, FishType = FishTypeEnum.普通鱼, + FirstFishCountRange = new List { 1, 1 }, + TimeRange = new List { 20, 20 }, + CountRange = new List { 1, 1 }, + MaxCountRange = new List { 1, 1 } + }); + } + + + config.RoomFishConfigs.Add(roomFishConfigs); + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20011", RoomName = "初级场", GameType = GameTypeEnum.风雷之渊, RoomLevel = 1, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 100000, CannonMultipleList = new List { 1000, 2000, 3000, 5000, 6000, 7000, 8000, 9000, 10000, 20000 } }); + + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20012", RoomName = "中级场", GameType = GameTypeEnum.风雷之渊, RoomLevel = 2, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 1000000, CannonMultipleList = new List { 100, 200, 300, 500, 600, 700, 800, 900, 1000, 2000 } }); + + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20013", RoomName = "高级场", GameType = GameTypeEnum.风雷之渊, RoomLevel = 3, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 2000000, CannonMultipleList = new List { 2000, 3000, 5000, 6000, 7000, 8000, 9000, 10000, 20000, 50000 } }); + + + + + roomFishConfigs = new RoomFishConfig() { GameType = GameTypeEnum.永夜尸城 }; + id = 15000; + + string[] normalNames = new string[] + { + "普通丧尸1", "医生丧尸", "普通丧尸2", "普通丧尸3", "普通丧尸4", "普通丧尸5", "普通丧尸6", "普通丧尸7", + "骷髅1", "骷髅2", "骷髅3", "爆炎丧尸", "熔岩丧尸", "暗影骷髅", "紫晶魔物", "女仆丧尸", "老年丧尸", + "红巾丧尸", "女战士丧尸", "机甲丧尸", "烈焰丧尸", "灰皮丧尸", "霜冻女妖", "僵尸狼", "绿皮肥丧尸", + "肥肉巨怪", "阿凡达僵尸", "贝比僵尸", "蝙蝠侠僵尸", "超人僵尸", "厨师僵尸", "刺客僵尸", "导游僵尸", + "防爆僵尸", "橄榄球僵尸", "功夫僵尸", "古惑仔僵尸", "黑帮倭瓜僵尸", "黑衣人僵尸", "葫芦娃僵尸", + "加勒比僵尸", "街头霸王僵尸", "酒鬼僵尸", "救生员僵尸", "科利僵尸", "科学狂人僵尸", "矿工僵尸", + "篮球僵尸", "劳拉僵尸", "林克僵尸", "摩斯族僵尸", "牛仔僵尸", "胖虎僵尸", "清朝僵尸", "容颜炮手僵尸", + "蛇反女僵尸", "史瑞克僵尸", "铁桶僵尸", "铁血战士僵尸", "迈克尔僵尸", "小丑僵尸", "教师僵尸", + "野人僵尸", "荧光棒僵尸", "杂耍僵尸", "学生僵尸", "张起灵僵尸", "终结者僵尸" + }; + + string[] normalBriefs = new string[] + { + "人类感染基础形态,行动迟缓,靠数量压制", + "医生感染变异,可投掷医疗工具攻击", + "人类感染基础形态,行动迟缓,靠数量压制", + "人类感染基础形态,行动迟缓,靠数量压制", + "人类感染基础形态,行动迟缓,靠数量压制", + "人类感染基础形态,行动迟缓,靠数量压制", + "人类感染基础形态,行动迟缓,靠数量压制", + "人类感染基础形态,行动迟缓,靠数量压制", + "人类骸骨与病毒结合,行动灵活,可群体冲锋", + "人类骸骨与病毒结合,行动灵活,可群体冲锋", + "人类骸骨与病毒结合,行动灵活,可群体冲锋", + "体内积攒爆炎能量,自爆可对范围目标造成高额伤害", + "火山区域变异体,躯体流淌熔岩,攻击附灼烧且生命力顽强", + "暗影能量凝聚而成,可穿梭阴影突袭,攻击附暗影debuff", + "被紫晶能量侵蚀,可操控晶刺攻击,防御较强", + "曾为女仆,保留人类动作习惯,可投掷清洁工具攻击", + "老年人感染变异,行动缓慢但韧性极强,擅长近身缠斗", + "头戴红巾,攻击欲望强烈,主动冲向目标撕咬", + "曾为战士,保留战斗技巧,近身格斗能力出色", + "士兵感染后与机甲融合,装甲防御强,可发射腐蚀弹", + "被火焰感染,周身带火,攻击附灼烧,行动迅猛", + "人类感染早期形态,行动迟缓但耐力强,擅长近身撕咬", + "寒冷区域亡灵,可释放寒气减速目标,擅长远程骚扰", + "野狼感染变异,行动敏捷,擅长追踪突袭", + "肥胖人类感染变异,绿皮肉瘤可喷吐毒素,生命力顽强。", + "高热量变异丧尸,行动缓慢但撞击冲击力强,脓疱破裂会腐蚀目标。", + "融合阿凡达奇幻风格,外形或能力带有阿凡达特征", + "走可爱幼态风格的僵尸", + "结合蝙蝠侠元素,可能保留其标志性装备或能力", + "融合超人设定,大概率拥有超强力量、飞行等超能力", + "职业为厨师,可能带有厨房相关道具或技能", + "具备刺客属性,擅长隐匿、刺杀,行动敏捷", + "以导游为职业,行为模式偏向引导、讲解", + "具备防爆相关能力或装备,防御力较强", + "以橄榄球运动员为原型,拥有强壮体魄和冲撞能力", + "精通功夫,近战能力强劲", + "融合古惑仔帮派风格,带有江湖气息和团队作战属性", + "结合黑帮元素与倭瓜外形,有黑帮背景", + "身着黑衣,具备神秘、隐匿特质", + "以葫芦娃为原型,可能保留其色彩特征或部分能力", + "带有加勒比海盗风格,和海洋、海盗相关", + "融合街头霸王格斗元素,擅长各类格斗技巧", + "嗜酒,行为可能受酒精影响,或有酒类相关技能", + "职业为救生员,具备水上相关能力和装备", + "小众原创类僵尸角色,设定信息较少", + "拥有疯狂科学家特质,可能进行邪恶实验", + "以矿工为职业,拥有挖掘、耐力相关能力", + "以篮球运动员为原型,拥有出色跳跃和投篮能力", + "以《古墓丽影》劳拉为原型,擅长探险和格斗", + "以《塞尔达传说》林克为原型,保留其冒险和战斗能力", + "以摩斯族为原型,拥有独特种族能力和外形", + "带有西部牛仔风格,擅长枪械和马术", + "以《哆啦A梦》胖虎为原型,拥有强壮体魄和高音量攻击", + "以清朝人物为原型,带有古代服饰和武器特征", + "以炮手为职业,擅长远程炮击攻击", + "带有蛇类特征的女性僵尸,拥有蛇类相关能力和外形", + "以《史瑞克》角色为原型,拥有绿色皮肤和强壮体魄", + "以铁桶为装备或外形特征,防御力极强", + "融合铁血战士元素,擅长潜行和各类外星武器使用", + "以迈克尔·杰克逊为原型,带有舞蹈和音乐相关特质", + "带有小丑外形和特质,行为诡异,擅长制造混乱", + "职业为教师,可能带有教育相关道具和技能", + "类似野人,拥有原始力量和野性特质", + "带有荧光棒元素,可能在黑暗环境发光或拥有光系技能", + "擅长杂耍,行动灵活,能使用杂耍道具攻击", + "以学生为原型,带有书包、文具等学生相关道具", + "以《盗墓笔记》张起灵为原型,拥有麒麟血和超强战斗能力", + "融合终结者元素,拥有超强自愈能力和战斗能力" + }; + int[] normalScores = new int[] + { + 2,2,2,2,2,2,2,2,2,2,2, + 3,3, + 4,4, + 5,5, + 6,6, + 7,7, + 8,8,8, + 10, + 12, + 15,15,15,15, + 18,18,18, + 20,20, + 25,25,25,25,25,25,25,25, + 25, + 30,30,30,30,30,30,30,30,30, + 40,40,40,40,40,40,40,40,40, + 45,45,45,45,45,45 + }; + int[] normalWeights = new int[] + { + // 15001-15011 (weight=5000) + 5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000, + // 15012-15013 (3333) + 3333,3333, + // 15014-15015 (2500) + 2500,2500, + // 15016-15017 (2000) + 2000,2000, + // 15018-15019 (1666) + 1666,1666, + // 15020-15021 (1428) + 1428,1428, + // 15022-15024 (1250) + 1250,1250,1250, + // 15025 (1000) + 1000, + // 15026 (833) + 833, + // 15027-15030 (666) + 666,666,666,666, + // 15031-15033 (555) + 555,555,555, + // 15034-15035 (500) + 500,500, + // 15036-15043 (400) + 400,400,400,400,400,400,400,400, + 400, + // 15045-15053 (333) + 333,333,333,333,333,333,333,333,333, + // 15054-15062 (250) + 250,250,250,250,250,250,250,250,250, + // 15063-15068 (222) + 222,222,222,222,222,222 + }; + + for (int i = 0; i < normalNames.Length; i++) + { + id++; + config.FishTypeConfigs.Add(new FishTypeConfig() + { + FishNumber = id.ToString(), + FishName = normalNames[i], + FishBrief = normalBriefs[i], + FishScore = normalScores[i], + FishType = FishTypeEnum.普通鱼, + KillWeight = normalWeights[i], + PathList = new List { 1, 2, 3, 4, 5, 6, 7, 8 } + }); + + roomFishConfigs.NormalFishList.Add(new RoomFishDetailConfig() + { + Type = 1, + FishNumber = id.ToString(), + MaxCount = 1, + FishFrequency = 5, + FishWeight = 40, + Times = 10 + }); + } + + string[] goldNames = new string[] { "骸骨战狼", "熔岩骷髅怪", "机械骷髅怪", "怨灵骷髅群", "多头骷髅怪" }; + string[] goldBriefs = new string[] + { + "古狼骸骨+丧尸病毒诞生,嗅觉敏锐,行动迅猛,擅长突袭追踪。", + "火山附近亡灵,躯体流熔岩,攻击附灼烧效果,生命力顽强。", + "机械残骸与骷髅融合,机械臂可夹碎金属,擅长破坏防御工事。", + "冤死灵魂凝聚而成,群体冲锋压制目标,数量多难彻底消灭。", + "多骷髅头颅拼接而成,可同时攻击多个目标,附带寄生虫啃食效果。" + }; + int[] goldScores = new int[] { 100, 100, 100, 100, 100 }; + int[] goldWeights = new int[] { 100, 100, 100, 100, 100 }; + + for (int i = 0; i < goldNames.Length; i++) + { + id++; + config.FishTypeConfigs.Add(new FishTypeConfig() + { + FishNumber = id.ToString(), + FishName = goldNames[i], + FishBrief = goldBriefs[i], + FishScore = goldScores[i], + FishType = FishTypeEnum.黄金鱼, + KillWeight = goldWeights[i], + PathList = new List { 1, 2, 3, 4, 5, 6, 7, 8 } + }); + + roomFishConfigs.NormalFishList.Add(new RoomFishDetailConfig() + { + Type = 1, + FishNumber = id.ToString(), + MaxCount = 1, + FishFrequency = 5, + FishWeight = 40, + Times = 10 + }); + } + + string[] specialNames = new string[] + { + "摇滚僵尸", "死神僵尸", "忍者神龟僵尸", "犬夜叉僵尸", "魔法师僵尸", "美国队长僵尸", + "路飞僵尸", "克劳德僵尸", "金刚狼僵尸", "弗兰肯斯坦", "飞行僵尸", "宝骏僵尸", + "567僵尸", "腐肉巨魔", "食人花丧尸", "坦克丧尸" + }; + string[] specialBriefs = new string[] + { + "带有摇滚风格,拥有音乐相关能力和狂暴特质", + "融合死神元素,带有镰刀等标志性武器和死亡相关特质", + "融合忍者神龟元素,擅长忍术和各类武器使用", + "以《犬夜叉》角色为原型,保留其半妖特质和能力", + "具备魔法能力,能施展各类魔法攻击", + "融合美国队长元素,拥有超强力量和盾牌装备", + "以《海贼王》路飞为原型,拥有橡胶果实能力", + "以《最终幻想7》克劳德为原型,保留其战斗风格", + "结合金刚狼设定,拥有自愈能力和钢爪", + "源自玛丽·雪莱小说的经典人造人僵尸,是科学伦理探讨的标志性角色", + "拥有飞行能力,行动范围广,攻击更具突然性", + "以汽车品牌宝骏为原型的趣味拟人化僵尸", + "小众原创类僵尸角色,设定信息较少", + "人尸与腐植异变融合,行动迟缓但耐力极强,靠近身撕咬攻击。", + "变异食人花与丧尸躯体结合,靠巨花獠牙捕猎,以气味引诱目标。", + "士兵尸身与坦克残骸融合,装甲为天然防御,炮管可发射腐蚀弹。" + }; + int[] specialScores = new int[] { 120, 120, 120, 120, 150, 150, 150, 150, 200, 200, 200, 200, 200, 250, 250, 250 }; + int[] specialWeights = new int[] { 83, 83, 83, 83, 66, 66, 66, 66, 50, 50, 50, 50, 50, 40, 40, 40 }; + + for (int i = 0; i < specialNames.Length; i++) + { + id++; + config.FishTypeConfigs.Add(new FishTypeConfig() + { + FishNumber = id.ToString(), + FishName = specialNames[i], + FishBrief = specialBriefs[i], + FishScore = specialScores[i], + FishType = FishTypeEnum.特殊鱼, + KillWeight = specialWeights[i], + PathList = new List { 1, 2, 3, 4, 5, 6, 7, 8 } + }); + + roomFishConfigs.NormalFishList.Add(new RoomFishDetailConfig() + { + Type = 1, + FishNumber = id.ToString(), + MaxCount = 1, + FishFrequency = 5, + FishWeight = 40, + Times = 10 + }); + } + + string[] bossNames = new string[] + { + "战神僵尸", "阴阳师僵尸", "雷神僵尸", "斯芬克斯僵尸", "大力水手僵尸", + "礼物车僵尸", "骑士僵尸", "阿拉丁僵尸", "骷髅王僵尸" + }; + string[] bossBriefs = new string[] + { + "具备战神属性,拥有超强力量和战斗技巧", + "融合阴阳师元素,擅长式神召唤和阴阳法术", + "结合雷神元素,拥有雷电相关能力和武器", + "以斯芬克斯为原型,拥有谜题和智慧相关能力", + "以大力水手为原型,拥有超强力量和菠菜相关技能", + "和礼物车相关,可能带有运输、投掷类技能", + "具备骑士属性,身披盔甲,擅长骑士剑术", + "以《阿拉丁》角色为原型,和神灯、魔法相关", + "僵尸群体中的强力领导者" + }; + int[] bossScores = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + int[] bossWeights = new int[] { 55, 52, 43, 41, 32, 20, 20, 20, 20 }; + + for (int i = 0; i < bossNames.Length; i++) + { + id++; + config.FishTypeConfigs.Add(new FishTypeConfig() + { + FishNumber = id.ToString(), + FishName = bossNames[i], + FishBrief = bossBriefs[i], + FishScore = bossScores[i], + FishType = FishTypeEnum.Boss鱼, + KillWeight = bossWeights[i], + PathList = new List { 1, 2, 3, 4, 5, 6, 7, 8 } + }); + + roomFishConfigs.RoomFishLevelList.Add(new RoomFishLevelConfig() + { + RoomLevel = i % 3 + 1, + Type = 1, + FishNumber = id.ToString(), + MaxCount = 1, + FishFrequency = 30, + FishWeight = 1, + Times = 10 + }); + } + + id++; // 15099 + config.FishTypeConfigs.Add(new FishTypeConfig() + { + FishNumber = id.ToString(), + FishName = "博士僵尸", + FishBrief = "以博士为职业,拥有高智商和科技相关能力", + FishScore = 1, + FishType = FishTypeEnum.Boss鱼, + KillWeight = 16, + PathList = new List { 1, 2, 3, 4, 5, 6, 7, 8 } + }); + + roomFishConfigs.RoomFishLevelList.Add(new RoomFishLevelConfig() + { + RoomLevel = 3, + Type = 1, + FishNumber = id.ToString(), + MaxCount = 1, + FishFrequency = 60, + FishWeight = 1, + Times = 10 + }); + + + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 1, + Type = 1, + FishType = FishTypeEnum.普通鱼, + FirstFishCountRange = new List { 20, 30 }, + TimeRange = new List { 3, 10 }, + CountRange = new List { 20, 30 }, + MaxCountRange = new List { 20, 30 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 1, + Type = 1, + FishType = FishTypeEnum.黄金鱼, + FirstFishCountRange = new List { 2, 3 }, + TimeRange = new List { 15, 20 }, + CountRange = new List { 2, 3 }, + MaxCountRange = new List { 1, 1 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 1, + Type = 1, + FishType = FishTypeEnum.Boss鱼, + FirstFishCountRange = new List { 2, 3 }, + TimeRange = new List { 30, 30 }, + CountRange = new List { 2, 3 }, + MaxCountRange = new List { 1, 1 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 1, + Type = 1, + FishType = FishTypeEnum.特殊鱼, + FirstFishCountRange = new List { 1, 2 }, + TimeRange = new List { 30, 30 }, + CountRange = new List { 1, 2 }, + MaxCountRange = new List { 1, 2 } + }); + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 1, + Type = 1, + FishType = FishTypeEnum.特殊Boss, + FirstFishCountRange = new List { 1, 1 }, + TimeRange = new List { 30, 30 }, + CountRange = new List { 1, 1 }, + MaxCountRange = new List { 1, 1 } + }); + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 1, + Type = 2, + FishType = FishTypeEnum.普通鱼, + FirstFishCountRange = new List { 5, 10 }, + TimeRange = new List { 15, 20 }, + CountRange = new List { 5, 10 }, + MaxCountRange = new List { 5, 10 } + }); + + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 2, + Type = 1, + FishType = FishTypeEnum.普通鱼, + FirstFishCountRange = new List { 20, 30 }, + TimeRange = new List { 3, 10 }, + CountRange = new List { 20, 30 }, + MaxCountRange = new List { 20, 30 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 2, + Type = 1, + FishType = FishTypeEnum.黄金鱼, + FirstFishCountRange = new List { 2, 3 }, + TimeRange = new List { 15, 20 }, + CountRange = new List { 2, 3 }, + MaxCountRange = new List { 1, 1 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 2, + Type = 1, + FishType = FishTypeEnum.Boss鱼, + FirstFishCountRange = new List { 2, 3 }, + TimeRange = new List { 30, 30 }, + CountRange = new List { 2, 3 }, + MaxCountRange = new List { 2, 3 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 2, + Type = 1, + FishType = FishTypeEnum.特殊鱼, + FirstFishCountRange = new List { 1, 2 }, + TimeRange = new List { 30, 30 }, + CountRange = new List { 1, 2 }, + MaxCountRange = new List { 1, 2 } + }); + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 2, + Type = 1, + FishType = FishTypeEnum.特殊Boss, + FirstFishCountRange = new List { 1, 1 }, + TimeRange = new List { 30, 30 }, + CountRange = new List { 1, 1 }, + MaxCountRange = new List { 1, 1 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 2, + Type = 2, + FishType = FishTypeEnum.普通鱼, + FirstFishCountRange = new List { 5, 10 }, + TimeRange = new List { 15, 20 }, + CountRange = new List { 5, 10 }, + MaxCountRange = new List { 5, 10 } + }); + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 3, + Type = 1, + FishType = FishTypeEnum.普通鱼, + FirstFishCountRange = new List { 20, 30 }, + TimeRange = new List { 3, 10 }, + CountRange = new List { 20, 30 }, + MaxCountRange = new List { 20, 30 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 3, + Type = 1, + FishType = FishTypeEnum.黄金鱼, + FirstFishCountRange = new List { 2, 3 }, + TimeRange = new List { 15, 20 }, + CountRange = new List { 2, 3 }, + MaxCountRange = new List { 2, 3 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 3, + Type = 1, + FishType = FishTypeEnum.Boss鱼, + FirstFishCountRange = new List { 2, 3 }, + TimeRange = new List { 30, 30 }, + CountRange = new List { 2, 3 }, + MaxCountRange = new List { 2, 3 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 3, + Type = 1, + FishType = FishTypeEnum.特殊鱼, + FirstFishCountRange = new List { 1, 2 }, + TimeRange = new List { 30, 30 }, + CountRange = new List { 1, 2 }, + MaxCountRange = new List { 1, 2 } + }); + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 3, + Type = 1, + FishType = FishTypeEnum.特殊Boss, + FirstFishCountRange = new List { 1, 1 }, + TimeRange = new List { 30, 30 }, + CountRange = new List { 1, 1 }, + MaxCountRange = new List { 1, 1 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 3, + Type = 2, + FishType = FishTypeEnum.普通鱼, + FirstFishCountRange = new List { 5, 10 }, + TimeRange = new List { 15, 20 }, + CountRange = new List { 5, 10 }, + MaxCountRange = new List { 5, 10 } + }); + config.RoomFishConfigs.Add(roomFishConfigs); + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20021", RoomName = "初级场", GameType = GameTypeEnum.永夜尸城, RoomLevel = 1, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 100000, CannonMultipleList = new List { 1000, 2000, 3000, 5000, 6000, 7000, 8000, 9000, 10000, 20000 } }); + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20022", RoomName = "中级场", GameType = GameTypeEnum.永夜尸城, RoomLevel = 2, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 1000000, CannonMultipleList = new List { 100, 200, 300, 500, 600, 700, 800, 900, 1000, 2000 } }); + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20023", RoomName = "高级场", GameType = GameTypeEnum.永夜尸城, RoomLevel = 3, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 2000000, CannonMultipleList = new List { 2000, 3000, 5000, 6000, 7000, 8000, 9000, 10000, 20000, 50000 } }); + + + roomFishConfigs = new RoomFishConfig() { GameType = GameTypeEnum.黑神话悟空 }; + id = 13000; + + names = new string[] { "小蓝鱼", "小黄鱼", "小飞鱼", "小丑鱼", "神仙鱼", "灯笼鱼", "孔雀鱼", "小龙虾", "狮子鱼", "水丹", "刺豚", "海龟", "蝙蝠鱼", "海豚", "尖嘴鲨", "双髻鲨", "大白鲨" }; + killWeight = new int[] { 5000, 3333, 2000, 2000, 1666, 1428, 1250, 1111, 1000, 833, 666, 500, 400, 333, 250, 200, 166 }; + pathList = new List>() { + new List { 1,2,3,4,5,6,7,8 }, + new List { 9,10,11,12,13,14,15,16 }, + new List { 17,18,19,20,21,22,23,24 }, + new List { 25,26,27,28,29,30,31,32 }, + new List { 33,34,35,36,37,38,39,40 }, + new List { 41,42,43,44,45,46,47,48 }, + new List { 49,50,51,52,53,54,55,56 }, + new List { 57,58,59,60,61,62,63,64 }, + new List { 65,66,67,68,69,70,71,72 }, + new List { 73,74,75,76,77,78,79,80 }, + new List { 81,82,83,84,85,86,87,88 }, + new List { 89,90,91,92,93,94,95,96 }, + new List { 97,98,99,100,101,102,103,104 }, + new List { 105,106,107,108,109,110,111,112 }, + new List { 113,114,115,116,117,118,119,120 }, + new List { 121,122,123,124,125,126,127,128 }, + new List { 129,130,131,132,133,134,135,136 } + }; + + + briefs = new string[] { + "小黄刺鱼通体黄色,经常成群出没,打击难度比较小。", + "因有两只硕大无比的眼睛而得名。此鱼生性胆小。", + "小丑鱼因为脸上有一条或两条白色条纹,好似京剧中的丑角而得名,是一种热带咸水鱼。", + "热带蓝鱼常常被当做观赏鱼饲养,种类极多,以海草及石灰质中的浮游生物为食。", + "乌龟是现存古老的爬行动物。特征是身上长有非常坚固的甲壳,受击时可以把头、尾及四肢缩回龟壳内。", + "身上的纹理像彩虹一般的鱼,分值还不错,加油捕获吧。", + "剑鱼的攻击力特强,它那骨质利剑非常坚硬,而且还是游泳冠军记录的保持着。", + "大家别急,游慢点....", + "蝴蝶鱼一般个体较小,可以在珊瑚丛中灵巧地穿梭。体色大部鲜艳美丽。", + "我想游的再快点....", + "生性胆小的家伙,一有风吹草动,马上溜之大吉。", + "河豚的体型浑圆,具有膨胀身体的能力,受到威胁时,能快速吸入水或者空气,再短时间内膨胀数倍大小,吓退掠食者。", + "灯笼鱼的背上长着一种发光器,每当它游泳的时候,发光器就像一盏玲珑的小灯笼,在深海中照出一片亮光来。", + "巨大小丑是小丑鱼变异来的,体型要大很多,捕获难度较大。", + "魔鬼鱼身体扁平似蝙蝠,胸鳍宽大,由吻端延伸到细长的尾根底部,身子扁平,尾巴细长。", + "远洋型虎鲸身长可达8-10米,成年后体重9顿左右。以鲨鱼为主要食物,是当之无愧的海洋霸主。", + "我保证你不愿意看见我的微笑!嘿嘿...."}; + + + scores = new int[] { 2, 3, 5, 5, 6, 7, 8, 9, 10, 12, 15, 20, 25, 30, 40, 50, 60, }; + for (int i = 0; i < names.Count(); i++) + { + id++; + config.FishTypeConfigs.Add(new FishTypeConfig() { FishNumber = id.ToString(), FishName = names[i], FishScore = scores[i], FishBrief = briefs[i], FishType = FishTypeEnum.普通鱼, KillWeight = killWeight[i], PathList = pathList[i].ToList() }); + + roomFishConfigs.NormalFishList.Add(new RoomFishDetailConfig() { Type = 1, FishNumber = id.ToString(), MaxCount = 1, FishFrequency = 5, FishWeight = 40, Times = 20 }); + } + + + + + names = new string[] { "鲸鱼", "奖金幽灵水母", "奖金魔鬼鱼", "奖金鲨鱼", "奖金双髻鲨", "奖金大海龟" }; + killWeight = new int[] { 83, 76, 66, 62, 55, 50 }; + briefs = new string[] { "黄金珊瑚鱼通体黄金,是珊瑚鱼中最高级的个体。", "黄金河豚浑身金灿灿,价值连城,但是数量极少。", "一只移动的聚宝盆,虽然移动缓慢,但捕获难度超高", "这只金灿灿的黄金灯笼鱼极其少见,捕获它能获得很多奖励。", "黄金虎鲸是虎鲸的变异群种,不是一般的难打。可是一旦渔获,会很惊!", "鲨的变种鱼之一,它的一切资料还隐藏在迷雾中……" }; + scores = new int[] { 120, 130, 150, 160, 180, 200 }; + pathList = new List>() { + new List { 137,138,139,140,141,142,143,144 }, + new List { 145,146,147,148,149,150,151,152 }, + new List { 153,154,155,156,157,158,159,160 }, + new List { 161,162,163,164,165,166,167,168 }, + new List { 169,170,171,172,173,174,175,176 }, + new List { 177,178,179,180,181,182,183,184 } + }; + for (int i = 0; i < names.Count(); i++) + { + id++; + config.FishTypeConfigs.Add(new FishTypeConfig() { FishNumber = id.ToString(), FishName = names[i], FishScore = scores[i], FishBrief = briefs[i], FishType = FishTypeEnum.黄金鱼, KillWeight = killWeight[i], PathList = pathList[i].ToList() }); + + roomFishConfigs.NormalFishList.Add(new RoomFishDetailConfig() { Type = 1, FishNumber = id.ToString(), MaxCount = 1, FishFrequency = 5, FishWeight = 40, Times = 25 }); + } + + + names = new string[] { "大龙虾", "闪电鱼", "连环导弹", "九龙玉玺", "沙僧", "白骨精", "小白龙", "嫦娥", "孙悟空", "铁扇公主", "唐僧", "猪八戒", "烈焰巨龙", "宝船居蟹", "杨戬", "食神八戒", "齐天大圣" }; + killWeight = new int[] { 55, 52, 52, 43, 41, 32, 33, 32, 20, 33, 20, 20, 20, 16, 15, 15, 12 }; + briefs = new string[] { + "钻头蟹的钻头可贯穿全场,捕获它将让你所向披靡。", + "释放强力闪电,瞬间秒杀一定范围内的鱼。", "此炸弹威力无穷,民间赞颂它,\"炸药一响,黄金万两\"。", "据说可驭九龙之力,威压所致,万物皆惧!", "原为天界卷帘大将,手持玉帝所赐降妖宝杖,对唐僧忠心耿耿且实力超群。", "擅长变化,狡猾又通晓人弱点,多次试图接近唐僧,最终被孙悟空识破?", "本是西海龙王三太子,法力高强,贪食唐僧坐骑,被观音点化后变为白龙马。", "掌管月宫的广寒仙子,能以月神之力带来富贵和好运", "由仙石孕育而生,拜菩提老祖门下习得七十二变,后大闹龙宫取得如意金箍棒", "牛魔王妻子,持有法宝芭蕉扇,呼风唤雨,世人称之铁扇金仙", "如来佛祖座下金蝉子转世,一心向善,为取真经一路历经磨难", "曾为掌管天宫八万水军天蓬元帅,会天罡数三十六般变化,所持武器九齿钉耙~", "地心熔穴为巢,故极其罕见,在猎人黑市可谓价值连城!", "极具财运,搜罗过无数元宝宝藏,让人羡慕不已!", "三尖两刃刀横扫三界,天眼洞悉万物,哮天犬伴其左右,神威凛冽不容侵犯!", "让俺老猪看看盘子里装的是什么好吃的!", "齐天大圣孙悟空,火眼金睛识破一切妖魔鬼怪" }; + pathList = new List>() { + new List { 185,186,187,188,189,190,191,192 }, + new List { 193,194,195,196,197,198,199,200 }, + new List { 201,202,203,204,205,206,207,208 }, + new List { 1, 2, 3 }, + new List { 1, 2, 3 }, + new List { 1 }, + new List { 1 }, + new List { 1, 2, 3 }, + new List { 1, 2, 3 }, + new List { 1, 2, 3 }, + new List { 1, 2, 3 }, + new List { 1 }, + new List { 1, 2 }, + new List { 1, 2}, + new List { 1, 2, 3 }, + new List { 1, 2, 3 }, + new List { 1, 2, 3 } + }; + + for (int i = 0; i < names.Count(); i++) + { + id++; + var fishPathList = pathList[i].ToList(); + if (names[i] == "炸弹蟹" || names[i] == "闪电鱼" || names[i] == "钻头蟹") + { + config.FishTypeConfigs.Add(new FishTypeConfig() { FishNumber = id.ToString(), FishName = names[i], FishBrief = briefs[i], FishScore = 1, FishType = FishTypeEnum.特殊鱼, KillWeight = killWeight[i], PathList = fishPathList }); + } + else if (names[i] == "杨戬" || names[i] == "食神八戒" || names[i] == "齐天大圣") + { + config.FishTypeConfigs.Add(new FishTypeConfig() { FishNumber = id.ToString(), FishName = names[i], FishBrief = briefs[i], FishScore = 1, FishType = FishTypeEnum.特殊Boss, KillWeight = killWeight[i], PathList = fishPathList }); + } + else { + + config.FishTypeConfigs.Add(new FishTypeConfig() { FishNumber = id.ToString(), FishName = names[i], FishBrief = briefs[i], FishScore = 1, FishType = FishTypeEnum.Boss鱼, KillWeight = killWeight[i], PathList = fishPathList }); + } + + if (id <= 13035) + { + roomFishConfigs.RoomFishLevelList.Add(new RoomFishLevelConfig() { RoomLevel = 1, Type = 1, FishNumber = id.ToString(), MaxCount = 1, FishFrequency = 30, FishWeight = 1, Times = 30 }); + } + if (i <= 13037) + { + roomFishConfigs.RoomFishLevelList.Add(new RoomFishLevelConfig() { RoomLevel = 2, Type = 1, FishNumber = id.ToString(), MaxCount = 1, FishFrequency = 30, FishWeight = 1, Times = 30 }); + } + + roomFishConfigs.RoomFishLevelList.Add(new RoomFishLevelConfig() { RoomLevel = 3, Type = 1, FishNumber = id.ToString(), MaxCount = 1, FishFrequency = 30, FishWeight = 1, Times = 30 }); + } + + + void AddProb(int rl, int type, FishTypeEnum ft, int[] ff, int[] tm, int[] cnt, int[] max) + { + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = rl, Type = type, FishType = ft, + FirstFishCountRange = new List { ff[0], ff[1] }, + TimeRange = new List { tm[0], tm[1] }, + CountRange = new List { cnt[0], cnt[1] }, + MaxCountRange = new List { max[0], max[1] } + }); + } + + for (int rl = 1; rl <= 3; rl++) + { + AddProb(rl, 1, FishTypeEnum.普通鱼, new[] { 5, 10 }, new[] { 5, 10 }, new[] { 5, 10 }, new[] { 5, 10 }); + AddProb(rl, 1, FishTypeEnum.黄金鱼, new[] { 1, 2 }, new[] { 15, 20 }, new[] { 1, 2 }, new[] { 1, 2 }); + AddProb(rl, 1, FishTypeEnum.Boss鱼, new[] { 1, 2 }, new[] { 30, 30 }, new[] { 1, 2 }, new[] { 1, 2 }); + AddProb(rl, 1, FishTypeEnum.特殊Boss, new[] { 1, 2 }, new[] { 25, 30 }, new[] { 1, 2 }, new[] { 1, 2 }); + AddProb(rl, 1, FishTypeEnum.特殊鱼, new[] { 1, 2 }, new[] { 30, 30 }, new[] { 1, 2 }, new[] { 2, 3 }); + AddProb(rl, 2, FishTypeEnum.普通鱼, new[] { 3, 5 }, new[] { 5, 10 }, new[] { 5, 10 }, new[] { 5, 10 }); + } + + + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20051", RoomName = "初级场", GameType = GameTypeEnum.黑神话悟空, RoomLevel = 1, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 100000, CannonMultipleList = new List { 1000, 2000, 3000, 5000, 6000, 7000, 8000, 9000, 10000, 20000 } }); + + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20052", RoomName = "中级场", GameType = GameTypeEnum.黑神话悟空, RoomLevel = 2, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 1000000, CannonMultipleList = new List { 100, 200, 300, 500, 600, 700, 800, 900, 1000, 2000 } }); + + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20053", RoomName = "高级场", GameType = GameTypeEnum.黑神话悟空, RoomLevel = 3, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 2000000, CannonMultipleList = new List { 2000, 3000, 5000, 6000, 7000, 8000, 9000, 10000, 20000, 50000 } }); + + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "31001", Name = "小蓝鱼顺序鱼阵", FishNumber = "13001", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "71001", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "31002", Name = "小黄鱼顺序鱼阵", FishNumber = "13002", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "71002", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "31003", Name = "小飞鱼顺序鱼阵", FishNumber = "13003", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "71003", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "31004", Name = "小丑鱼顺序鱼阵", FishNumber = "13004", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "71004", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "31005", Name = "神仙鱼顺序鱼阵", FishNumber = "13005", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "71005", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "31006", Name = "灯笼鱼顺序鱼阵", FishNumber = "13006", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "71006", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "31007", Name = "孔雀鱼顺序鱼阵", FishNumber = "13007", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "71007", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "31008", Name = "小龙虾顺序鱼阵", FishNumber = "13008", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "71008", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "31009", Name = "狮子鱼顺序鱼阵", FishNumber = "13009", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "71009", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "31010", Name = "水母顺序鱼阵", FishNumber = "13010", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "71010", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "31011", Name = "刺豚顺序鱼阵", FishNumber = "13011", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "71011", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "31012", Name = "海龟顺序鱼阵", FishNumber = "13012", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "71012", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "31013", Name = "蝙蝠鱼顺序鱼阵", FishNumber = "13013", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "71013", ThresholdList = new List { 5, 10 } }); + + + foreach (var item in config.FishArrayConfigs.Where(x => Convert.ToInt32(x.FishArrayNumber) >= 31001 && Convert.ToInt32(x.FishArrayNumber) <= 31013)) + { + roomFishConfigs.RoomFishLevelList.Add(new RoomFishLevelConfig() { RoomLevel = 1, Type = 2, FishNumber = item.FishArrayNumber, MaxCount = 1, FishFrequency = 100, FishWeight = 1, Times = 20 }); + roomFishConfigs.RoomFishLevelList.Add(new RoomFishLevelConfig() { RoomLevel = 2, Type = 2, FishNumber = item.FishArrayNumber, MaxCount = 1, FishFrequency = 100, FishWeight = 1, Times = 20 }); + roomFishConfigs.RoomFishLevelList.Add(new RoomFishLevelConfig() { RoomLevel = 3, Type = 2, FishNumber = item.FishArrayNumber, MaxCount = 1, FishFrequency = 100, FishWeight = 1, Times = 20 }); + } + + config.RoomFishConfigs.Add(roomFishConfigs); + + + + + + + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20041", RoomName = "初级场", GameType = GameTypeEnum.星际迷航, RoomLevel = 1, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 100000, CannonMultipleList = new List { 1000, 2000, 3000, 5000, 6000, 7000, 8000, 9000, 10000, 20000 } }); + + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20042", RoomName = "中级场", GameType = GameTypeEnum.星际迷航, RoomLevel = 2, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 1000000, CannonMultipleList = new List { 100, 200, 300, 500, 600, 700, 800, 900, 1000, 2000 } }); + + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20043", RoomName = "高级场", GameType = GameTypeEnum.星际迷航, RoomLevel = 3, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 2000000, CannonMultipleList = new List { 2000, 3000, 5000, 6000, 7000, 8000, 9000, 10000, 20000, 50000 } }); + + + id = 12000; + roomFishConfigs = new RoomFishConfig() { GameType = GameTypeEnum.星际迷航 }; + names = new string[] { "绿风", "蝎子", "黄蜂", "红刹", "白羽", "蔷薇", "雷霆", "星火", "紫虹", "赤日", "蓝鸟", "迷彩", "天鹰", "幻影", "嫣然", "赤鸦", "极寒", "烈焰", "双子天使" }; + scores = new int[] { 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 18, 20, 30, 35, 50, 60, 70, 80, 100 }; + + killWeight = new int[] { 5000, 3333, 2500, 2000, 1666, 1428, 1250, 1111, 1000, 666, 555, 500, 333, 285, 200, 166, 142, 125, 100 }; + + for (int i = 0; i < names.Count(); i++) + { + id++; + config.FishTypeConfigs.Add(new FishTypeConfig() { FishNumber = id.ToString(), FishName = names[i], FishScore = 3, FishType = FishTypeEnum.普通鱼, KillWeight = killWeight[i], PathList = new List() { 1, 2, 3, 4, 5, 6, 7, 8 } }); + if (id >= 12010) + roomFishConfigs.NormalFishList.Add(new RoomFishDetailConfig() { Type = 1, FishNumber = id.ToString(), MaxCount = 1, FishFrequency = 5, FishWeight = 40, Times = 20 }); + } + names = new string[] { "光环飞机F2", "光环飞机F1" }; + for (int i = 0; i < names.Count(); i++) + { + id++; + config.FishTypeConfigs.Add(new FishTypeConfig() { FishNumber = id.ToString(), FishName = names[i], FishScore = 3, FishType = FishTypeEnum.特殊鱼, KillWeight = 500, PathList = new List() { 1, 2, 3, 4, 5, 6, 7, 8 } }); + + roomFishConfigs.NormalFishList.Add(new RoomFishDetailConfig() { Type = 1, FishNumber = id.ToString(), MaxCount = 1, FishFrequency = 5, FishWeight = 40, Times = 10 }); + + } + + names = new string[] { "幸运飞碟", "小丑扑克", "黑洞飞船", "弹药箱", "爆裂金鲨", "女龙王", "机械蝎", "星际巡航", "破坏球", "幸运轮", "超能魔盒", "机甲雷霆", "烈焰风暴" }; + killWeight = new int[] { 100, 500, 52, 500, 43, 20, 15, 66, 27, 18, 18, 16, 66 }; + pathList = new List>() { + new List{1,2,3}, + new List{1,2,3}, + new List{1,2,3}, + new List{1,2,3}, + new List{1,2,3}, + new List{1}, + new List{1}, + new List{1,2,3}, + new List{1,2,3}, + new List{1,2,3}, + new List{1,2,3}, + new List{1,2,3}, + new List{1,2,3}, + }; + + + for (int i = 0; i < names.Count(); i++) + { + id++; + if (names[i] == "幸运轮" || names[i] == "机甲雷霆") + { + config.FishTypeConfigs.Add(new FishTypeConfig() { FishNumber = id.ToString(), FishName = names[i], FishScore = 1, FishType = FishTypeEnum.特殊Boss, KillWeight = killWeight[i], PathList = pathList[i].ToList() }); + } + else + { + config.FishTypeConfigs.Add(new FishTypeConfig() { FishNumber = id.ToString(), FishName = names[i], FishScore = 1, FishType = FishTypeEnum.Boss鱼, KillWeight = killWeight[i], PathList = pathList[i].ToList() }); + } + + if (id <= 12026) + { + roomFishConfigs.RoomFishLevelList.Add(new RoomFishLevelConfig() { RoomLevel = 1, Type = 1, FishNumber = id.ToString(), MaxCount = 1, FishFrequency = 30, FishWeight = 1, Times = 30 }); + } + if (i <= 12030) + { + roomFishConfigs.RoomFishLevelList.Add(new RoomFishLevelConfig() { RoomLevel = 2, Type = 1, FishNumber = id.ToString(), MaxCount = 1, FishFrequency = 30, FishWeight = 1, Times = 30 }); + } + + roomFishConfigs.RoomFishLevelList.Add(new RoomFishLevelConfig() { RoomLevel = 3, Type = 1, FishNumber = id.ToString(), MaxCount = 1, FishFrequency = 30, FishWeight = 1, Times = 30 }); + } + + + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 1, + Type = 1, + FishType = FishTypeEnum.普通鱼, + FirstFishCountRange = new List { 20, 30 }, + TimeRange = new List { 3, 10 }, + CountRange = new List { 20, 30 }, + MaxCountRange = new List { 20, 30 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 1, + Type = 1, + FishType = FishTypeEnum.黄金鱼, + FirstFishCountRange = new List { 2, 3 }, + TimeRange = new List { 15, 20 }, + CountRange = new List { 2, 3 }, + MaxCountRange = new List { 1, 1 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 1, + Type = 1, + FishType = FishTypeEnum.Boss鱼, + FirstFishCountRange = new List { 2, 3 }, + TimeRange = new List { 30, 30 }, + CountRange = new List { 2, 3 }, + MaxCountRange = new List { 1, 1 } + }); + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 1, + Type = 1, + FishType = FishTypeEnum.特殊Boss, + FirstFishCountRange = new List { 1, 1 }, + TimeRange = new List { 30, 30 }, + CountRange = new List { 1, 1 }, + MaxCountRange = new List { 1, 1 } + }); + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 3, + Type = 1, + FishType = FishTypeEnum.特殊Boss, + FirstFishCountRange = new List { 1, 1 }, + TimeRange = new List { 25, 30 }, + CountRange = new List { 1, 1 }, + MaxCountRange = new List { 1, 1 } + }); + + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 1, + Type = 2, + FishType = FishTypeEnum.普通鱼, + FirstFishCountRange = new List { 5, 10 }, + TimeRange = new List { 15, 20 }, + CountRange = new List { 5, 10 }, + MaxCountRange = new List { 5, 10 } + }); + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 2, + Type = 1, + FishType = FishTypeEnum.普通鱼, + FirstFishCountRange = new List { 20, 30 }, + TimeRange = new List { 3, 10 }, + CountRange = new List { 20, 30 }, + MaxCountRange = new List { 20, 30 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 2, + Type = 1, + FishType = FishTypeEnum.黄金鱼, + FirstFishCountRange = new List { 2, 3 }, + TimeRange = new List { 15, 20 }, + CountRange = new List { 2, 3 }, + MaxCountRange = new List { 1, 2 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 2, + Type = 1, + FishType = FishTypeEnum.Boss鱼, + FirstFishCountRange = new List { 2, 3 }, + TimeRange = new List { 30, 30 }, + CountRange = new List { 2, 3 }, + MaxCountRange = new List { 2, 3 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 2, + Type = 1, + FishType = FishTypeEnum.特殊鱼, + FirstFishCountRange = new List { 1, 2 }, + TimeRange = new List { 30, 30 }, + CountRange = new List { 1, 2 }, + MaxCountRange = new List { 1, 2 } + }); + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel =2, + Type = 1, + FishType = FishTypeEnum.特殊Boss, + FirstFishCountRange = new List { 1, 2 }, + TimeRange = new List { 60, 90 }, + CountRange = new List { 1, 1 }, + MaxCountRange = new List { 1, 1 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 2, + Type = 2, + FishType = FishTypeEnum.普通鱼, + FirstFishCountRange = new List { 5, 10 }, + TimeRange = new List { 15, 20 }, + CountRange = new List { 5, 10 }, + MaxCountRange = new List { 5, 10 } + }); + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 3, + Type = 1, + FishType = FishTypeEnum.普通鱼, + FirstFishCountRange = new List { 20, 30 }, + TimeRange = new List { 3, 10 }, + CountRange = new List { 20, 30 }, + MaxCountRange = new List { 20, 30 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 3, + Type = 1, + FishType = FishTypeEnum.黄金鱼, + FirstFishCountRange = new List { 2, 3 }, + TimeRange = new List { 15, 20 }, + CountRange = new List { 2, 3 }, + MaxCountRange = new List { 1, 1 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 3, + Type = 1, + FishType = FishTypeEnum.Boss鱼, + FirstFishCountRange = new List { 2, 3 }, + TimeRange = new List { 30, 30 }, + CountRange = new List { 2, 3 }, + MaxCountRange = new List { 2, 3 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 3, + Type = 1, + FishType = FishTypeEnum.特殊鱼, + FirstFishCountRange = new List { 1, 2 }, + TimeRange = new List { 30, 30 }, + CountRange = new List { 1, 2 }, + MaxCountRange = new List { 1, 2 } + }); + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 3, + Type = 1, + FishType = FishTypeEnum.特殊Boss, + FirstFishCountRange = new List { 1, 1 }, + TimeRange = new List { 30, 30 }, + CountRange = new List { 1, 1 }, + MaxCountRange = new List { 1, 1 } + }); + + roomFishConfigs.RoomFishProbabilityList.Add(new RoomFishProbabilityConfig + { + RoomLevel = 3, + Type = 2, + FishType = FishTypeEnum.普通鱼, + FirstFishCountRange = new List { 5, 10 }, + TimeRange = new List { 15, 20 }, + CountRange = new List { 5, 10 }, + MaxCountRange = new List { 5, 10 } + }); + + + + + + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30001", Name = "红刹扇形鱼阵", FishNumber = "12004", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70002", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30002", Name = "蝎子扇形鱼阵", FishNumber = "12002", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70002", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30003", Name = "赤日扇形鱼阵", FishNumber = "12010", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70002", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30004", Name = "白羽扇形鱼阵", FishNumber = "12005", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70002", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30005", Name = "雷霆扇形鱼阵", FishNumber = "12007", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70002", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30006", Name = "紫虹扇形鱼阵", FishNumber = "12009", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70002", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30007", Name = "红刹扇形鱼阵", FishNumber = "12004", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70001", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30008", Name = "蝎子扇形鱼阵", FishNumber = "12002", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70001", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30009", Name = "赤日扇形鱼阵", FishNumber = "12010", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70001", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30010", Name = "白羽扇形鱼阵", FishNumber = "12005", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70001", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30011", Name = "雷霆扇形鱼阵", FishNumber = "12007", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70001", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30012", Name = "紫虹扇形鱼阵", FishNumber = "12009", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70002", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30013", Name = "白羽圆形鱼阵", FishNumber = "12005", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70101", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30014", Name = "白羽圆形鱼阵", FishNumber = "12005", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70102", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30015", Name = "白羽圆形鱼阵", FishNumber = "12005", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70103", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30016", Name = "白羽圆形鱼阵", FishNumber = "12005", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70104", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30017", Name = "红刹圆形鱼阵", FishNumber = "12004", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70101", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30018", Name = "红刹圆形鱼阵", FishNumber = "12004", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70102", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30019", Name = "红刹圆形鱼阵", FishNumber = "12004", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70103", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30020", Name = "红刹圆形鱼阵", FishNumber = "12004", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70104", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30021", Name = "蝎子圆形鱼阵", FishNumber = "12002", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70101", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30022", Name = "蝎子圆形鱼阵", FishNumber = "12002", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70102", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30023", Name = "蝎子圆形鱼阵", FishNumber = "12002", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70103", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30024", Name = "蝎子圆形鱼阵", FishNumber = "12002", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70104", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30025", Name = "绿风弧形鱼阵", FishNumber = "12001", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70201", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30026", Name = "黄蜂弧形鱼阵", FishNumber = "12003", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70201", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30027", Name = "红刹弧形鱼阵", FishNumber = "12004", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70201", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30028", Name = "白羽弧形鱼阵", FishNumber = "12005", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70201", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30029", Name = "蔷薇弧形鱼阵", FishNumber = "12006", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70201", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30030", Name = "雷霆弧形鱼阵", FishNumber = "12007", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70201", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30031", Name = "绿风弧形鱼阵", FishNumber = "12001", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70202", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30032", Name = "黄蜂弧形鱼阵", FishNumber = "12003", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70202", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30033", Name = "红刹弧形鱼阵", FishNumber = "12004", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70202", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30034", Name = "白羽弧形鱼阵", FishNumber = "12005", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70202", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30035", Name = "蔷薇弧形鱼阵", FishNumber = "12006", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70202", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30036", Name = "雷霆弧形鱼阵", FishNumber = "12007", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70202", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30037", Name = "星火三圈顺序鱼阵", FishNumber = "12008", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70203", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30038", Name = "紫虹三圈顺序鱼阵", FishNumber = "12009", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70203", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30039", Name = "蔷薇三圈顺序鱼阵", FishNumber = "12006", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70204", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30040", Name = "雷霆三圈顺序鱼阵", FishNumber = "12007", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70204", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30041", Name = "白羽单圈顺序鱼阵", FishNumber = "12005", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70205", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30042", Name = "白羽单圈顺序鱼阵", FishNumber = "12005", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70206", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30043", Name = "蔷薇曲线顺序鱼阵", FishNumber = "12006", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70203", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30044", Name = "雷霆曲线顺序鱼阵", FishNumber = "12007", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70207", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30045", Name = "星火曲线顺序鱼阵", FishNumber = "12008", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70207", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30046", Name = "紫虹曲线顺序鱼阵", FishNumber = "12009", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70207", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30047", Name = "蔷薇曲线顺序鱼阵", FishNumber = "12006", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70208", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30048", Name = "雷霆曲线顺序鱼阵", FishNumber = "12007", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70208", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30049", Name = "星火曲线顺序鱼阵", FishNumber = "12008", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70208", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30050", Name = "紫虹曲线顺序鱼阵", FishNumber = "12009", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70208", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30051", Name = "绿风弧形鱼阵", FishNumber = "12001", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70210", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30052", Name = "黄蜂弧形鱼阵", FishNumber = "12003", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70210", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30053", Name = "红刹弧形鱼阵", FishNumber = "12004", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70210", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30054", Name = "白羽弧形鱼阵", FishNumber = "12005", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70211", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30055", Name = "蔷薇弧形鱼阵", FishNumber = "12006", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70211", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30056", Name = "雷霆弧形鱼阵", FishNumber = "12007", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70211", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30057", Name = "绿风弧形鱼阵", FishNumber = "12001", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70212", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30058", Name = "黄蜂弧形鱼阵", FishNumber = "12003", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70212", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30059", Name = "红刹弧形鱼阵", FishNumber = "12004", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70212", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30060", Name = "雷霆曲线顺序鱼阵", FishNumber = "12007", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70213", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30061", Name = "星火曲线顺序鱼阵", FishNumber = "12008", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70213", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30062", Name = "紫虹曲线顺序鱼阵", FishNumber = "12009", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70213", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30063", Name = "绿风弧形鱼阵", FishNumber = "12001", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70214", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30064", Name = "黄蜂弧形鱼阵", FishNumber = "12003", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70214", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30065", Name = "红刹弧形鱼阵", FishNumber = "12004", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70215", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30066", Name = "白羽弧形鱼阵", FishNumber = "12005", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70215", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30067", Name = "蔷薇弧形鱼阵", FishNumber = "12006", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70216", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30068", Name = "雷霆弧形鱼阵", FishNumber = "12007", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70216", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30069", Name = "星火三圈顺序鱼阵", FishNumber = "12008", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70217", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30070", Name = "紫虹三圈顺序鱼阵", FishNumber = "12009", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70217", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30071", Name = "绿风弧形鱼阵", FishNumber = "12001", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70218", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30072", Name = "黄蜂弧形鱼阵", FishNumber = "12003", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70218", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30073", Name = "红刹弧形鱼阵", FishNumber = "12004", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70219", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30074", Name = "白羽弧形鱼阵", FishNumber = "12005", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70219", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30075", Name = "蔷薇弧形鱼阵", FishNumber = "12006", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70220", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30076", Name = "雷霆弧形鱼阵", FishNumber = "12007", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70220", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30077", Name = "星火三圈顺序鱼阵", FishNumber = "12008", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70221", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30078", Name = "紫虹三圈顺序鱼阵", FishNumber = "12009", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70221", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30079", Name = "绿风弧形鱼阵", FishNumber = "12001", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70222", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30080", Name = "黄蜂弧形鱼阵", FishNumber = "12003", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70222", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30081", Name = "红刹弧形鱼阵", FishNumber = "12004", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70223", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30082", Name = "白羽弧形鱼阵", FishNumber = "12005", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70223", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30083", Name = "蔷薇弧形鱼阵", FishNumber = "12006", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70224", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30084", Name = "雷霆弧形鱼阵", FishNumber = "12007", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70224", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30085", Name = "星火三圈顺序鱼阵", FishNumber = "12008", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70225", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30086", Name = "紫虹三圈顺序鱼阵", FishNumber = "12009", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70225", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30087", Name = "红刹扇形鱼阵", FishNumber = "12004", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70004", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30088", Name = "蝎子扇形鱼阵", FishNumber = "12002", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70004", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30089", Name = "红刹扇形鱼阵", FishNumber = "12004", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70003", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "30090", Name = "蝎子扇形鱼阵", FishNumber = "12002", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70003", ThresholdList = new List { 5, 10 } }); + + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32001", Name = "彩虹鱼顺序鱼阵1", FishNumber = "11001", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70401", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32002", Name = "小丑鱼顺序鱼阵1", FishNumber = "11002", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70402", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32003", Name = "热带鱼顺序鱼阵1", FishNumber = "11003", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70403", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32004", Name = "乌贼顺序鱼阵1", FishNumber = "11004", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70404", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32005", Name = "箭鱼顺序鱼阵1", FishNumber = "11005", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70405", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32006", Name = "斑点鱼顺序鱼阵1", FishNumber = "11006", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70406", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32007", Name = "海龟顺序鱼阵1", FishNumber = "11007", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70407", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32008", Name = "小河豚顺序鱼阵1", FishNumber = "11008", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70408", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32009", Name = "蝴蝶鱼顺序鱼阵1", FishNumber = "11009", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70409", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32010", Name = "裙摆鱼顺序鱼阵1", FishNumber = "11010", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70410", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32011", Name = "水母顺序鱼阵1", FishNumber = "11011", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70411", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32012", Name = "海马顺序鱼阵1", FishNumber = "11012", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70412", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32013", Name = "锅盔鱼顺序鱼阵1", FishNumber = "11013", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70413", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32014", Name = "蝙蝠鱼顺序鱼阵1", FishNumber = "11014", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70414", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32015", Name = "锯齿鲨顺序鱼阵1", FishNumber = "11015", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70415", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32016", Name = "鲨鱼顺序鱼阵1", FishNumber = "11016", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70416", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32017", Name = "彩虹鱼顺序鱼阵2", FishNumber = "11001", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70417", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32018", Name = "小丑鱼顺序鱼阵2", FishNumber = "11002", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70418", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32019", Name = "热带鱼顺序鱼阵2", FishNumber = "11003", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70419", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32020", Name = "乌贼顺序鱼阵2", FishNumber = "11004", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70420", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32021", Name = "箭鱼顺序鱼阵2", FishNumber = "11005", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70421", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32022", Name = "斑点鱼顺序鱼阵2", FishNumber = "11006", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70422", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32023", Name = "海龟顺序鱼阵2", FishNumber = "11007", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70423", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32024", Name = "小河豚顺序鱼阵2", FishNumber = "11008", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70424", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32025", Name = "蝴蝶鱼顺序鱼阵2", FishNumber = "11009", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70425", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32026", Name = "裙摆鱼顺序鱼阵2", FishNumber = "11010", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70426", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32027", Name = "水母顺序鱼阵2", FishNumber = "11011", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70427", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32028", Name = "海马顺序鱼阵2", FishNumber = "11012", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70428", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32029", Name = "锅盔鱼顺序鱼阵2", FishNumber = "11013", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70429", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32030", Name = "蝙蝠鱼顺序鱼阵2", FishNumber = "11014", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70430", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32031", Name = "锯齿鲨顺序鱼阵2", FishNumber = "11015", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70431", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32032", Name = "鲨鱼顺序鱼阵2", FishNumber = "11016", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70432", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32033", Name = "彩虹鱼顺序鱼阵3", FishNumber = "11001", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70433", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32034", Name = "小丑鱼顺序鱼阵3", FishNumber = "11002", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70434", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32035", Name = "热带鱼顺序鱼阵3", FishNumber = "11003", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70435", ThresholdList = new List { 5, 10 } }); + config.FishArrayConfigs.Add(new FishArrayConfig() { FishArrayNumber = "32036", Name = "乌贼顺序鱼阵3", FishNumber = "11004", FishCount = 1, BossFishNumber = "", BoosCount = 0, ArrayNumber = "70436", ThresholdList = new List { 5, 10 } }); + + foreach (var item in config.FishArrayConfigs.Where(c => Convert.ToInt32(c.FishArrayNumber) >= 30001 && Convert.ToInt32(c.FishArrayNumber) <= 30090)) + { + roomFishConfigs.RoomFishLevelList.Add(new RoomFishLevelConfig() { RoomLevel = 1, Type = 2, FishNumber = item.FishArrayNumber, MaxCount = 1, FishFrequency = 100, FishWeight = 1, Times = 10 }); + roomFishConfigs.RoomFishLevelList.Add(new RoomFishLevelConfig() { RoomLevel = 2, Type = 2, FishNumber = item.FishArrayNumber, MaxCount = 1, FishFrequency = 100, FishWeight = 1, Times = 10 }); + roomFishConfigs.RoomFishLevelList.Add(new RoomFishLevelConfig() { RoomLevel = 3, Type = 2, FishNumber = item.FishArrayNumber, MaxCount = 1, FishFrequency = 100, FishWeight = 1, Times = 10 }); + } + var fengleiConfig = config.RoomFishConfigs.First(c => c.GameType == GameTypeEnum.风雷之渊); + foreach (var item in config.FishArrayConfigs.Where(c => Convert.ToInt32(c.FishArrayNumber) >= 32001 && Convert.ToInt32(c.FishArrayNumber) <= 32036)) + { + fengleiConfig.RoomFishLevelList.Add(new RoomFishLevelConfig() { RoomLevel = 1, Type = 2, FishNumber = item.FishArrayNumber, MaxCount = 1, FishFrequency = 100, FishWeight = 1, Times = 20 }); + fengleiConfig.RoomFishLevelList.Add(new RoomFishLevelConfig() { RoomLevel = 2, Type = 2, FishNumber = item.FishArrayNumber, MaxCount = 1, FishFrequency = 100, FishWeight = 1, Times = 20 }); + fengleiConfig.RoomFishLevelList.Add(new RoomFishLevelConfig() { RoomLevel = 3, Type = 2, FishNumber = item.FishArrayNumber, MaxCount = 1, FishFrequency = 100, FishWeight = 1, Times = 20 }); + } + config.RoomFishConfigs.Add(roomFishConfigs); + + + + + var levelProps = new Dictionary props)> + { + { 1, (1000, 20, new() { ("40004", 3), ("40003", 3) }) }, + { 2, (1200, 20, new() { ("40004", 3), ("40003", 3) }) }, + { 3, (1500, 20, new() { ("40004", 3), ("40003", 3) }) }, + { 4, (2000, 20, new() { ("40004", 5), ("40003", 5) }) }, + { 5, (3000, 20, new() { ("40004", 5), ("40003", 5) }) }, + { 6, (5000, 30, new() { ("40004", 5), ("40003", 5) }) }, + { 7, (6000, 30, new() { ("40004", 6), ("40003", 6) }) }, + { 8, (8000, 30, new() { ("40004", 6), ("40003", 6) }) }, + { 9, (10000, 30, new() { ("40004", 6), ("40003", 6) }) }, + { 10, (12000, 30, new() { ("40004", 8), ("40003", 8) }) }, + { 11, (15000, 50, new() { ("40004", 8), ("40003", 8) }) }, + { 12, (20000, 50, new() { ("40004", 8), ("40003", 8) }) }, + { 13, (30000, 50, new() { ("40004", 10), ("40003", 10) }) }, + { 14, (45000, 50, new() { ("40004", 10), ("40003", 10) }) }, + { 15, (65000, 50, new() { ("40004", 10), ("40003", 10) }) }, + { 16, (80000, 80, new() { ("40004", 15), ("40003", 15) }) }, + { 17, (100000, 80, new() { ("40004", 15), ("40003", 15) }) }, + { 18, (200000, 80, new() { ("40004", 15), ("40003", 15) }) }, + { 19, (250000, 80, new() { ("40004", 18), ("40003", 18) }) }, + { 20, (300000, 80, new() { ("40004", 18), ("40003", 18) }) }, + }; + int[] expMins = { 1501, 3751, 5626, 8439, 12657, 18985, 28478, 42716, 64073, 96109, 144164, 216245, 324367, 486550, 729824, 1094736, 1642103, 2463154, 3694731, 5542096 }; + int[] expMaxs = { 3750, 5625, 8438, 12656, 18984, 28477, 42715, 64072, 96108, 144163, 216244, 324366, 486549, 729823, 1094735, 1642102, 2463153, 3694730, 5542095, 8313142 }; + for (int i = 0; i < 20; i++) + { + var lv = i + 1; + var p = levelProps[lv]; + config.UserLevelConfigs.Add(new UserLevelConfig + { + Level = lv, + ExpMin = expMins[i], + ExpMax = expMaxs[i], + Gold = p.gold, + Diamond = p.diamond, + ProductList = p.props.Select(x => new BaseProductCount { Number = x.number, Count = x.count }).ToList() + }); + } + + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.技能, Number = "40004", Name = "狂暴", Desc = "狂暴", ImageUrl = "/uploads/40004.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.技能, Number = "40003", Name = "冰冻", Desc = "冰冻", ImageUrl = "/uploads/40003.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.大喇叭, Number = "40002", Name = "大喇叭", Desc = "大喇叭", ImageUrl = "/uploads/40002.png", Price = 788888, VIPPrice = 688888, DealerPrice = 588888, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = true }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.刮刮卡, Number = "40005", Name = "刮刮卡", Desc = "刮刮卡", ImageUrl = "/uploads/40005.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.召唤卡, Number = "40006", Name = "召唤卡", Desc = "召唤卡", ImageUrl = "/uploads/40006.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.改名卡, Number = "40001", Name = "改名卡", Desc = "改名卡", ImageUrl = "/uploads/40001.png", Price = 888888, VIPPrice = 788888, DealerPrice = 688888, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = true }); + + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "40100", Name = "Vip1专属炮台", Desc = "Vip1专属炮台", ImageUrl = "/uploads/40100.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "40101", Name = "Vip2专属炮台", Desc = "Vip2专属炮台", ImageUrl = "/uploads/40101.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "40102", Name = "Vip3专属炮台", Desc = "Vip3专属炮台", ImageUrl = "/uploads/40102.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "40103", Name = "Vip4专属炮台", Desc = "Vip4专属炮台", ImageUrl = "/uploads/40103.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "40104", Name = "Vip5专属炮台", Desc = "Vip5专属炮台", ImageUrl = "/uploads/40104.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "40105", Name = "Vip6专属炮台", Desc = "Vip6专属炮台", ImageUrl = "/uploads/40105.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "40106", Name = "Vip7专属炮台", Desc = "Vip7专属炮台", ImageUrl = "/uploads/40106.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "40107", Name = "Vip8专属炮台", Desc = "Vip8专属炮台", ImageUrl = "/uploads/40107.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "40108", Name = "Vip9专属炮台", Desc = "Vip9专属炮台", ImageUrl = "/uploads/40108.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "40109", Name = "Vip10专属炮台", Desc = "Vip10专属炮台", ImageUrl = "/uploads/40109.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11001", Name = "深海之眼", Desc = "深海之眼", ImageUrl = "/uploads/11001.png", Price = 3988888, VIPPrice = 3888888, DealerPrice = 3788888, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = true }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11002", Name = "祥龙九天", Desc = "祥龙九天", ImageUrl = "/uploads/11002.png", Price = 6388888, VIPPrice = 6288888, DealerPrice = 6188888, Day = 365, SaleType = SaleTypeEnum.金币, IsSale = true }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11003", Name = "星际战舰", Desc = "星际战舰", ImageUrl = "/uploads/11003.png", Price = 3988888, VIPPrice = 3888888, DealerPrice = 3788888, Day = 30, SaleType = SaleTypeEnum.金币, IsSale = true }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11004", Name = "星际穿梭", Desc = "星际穿梭", ImageUrl = "/uploads/11004.png", Price = 5188888, VIPPrice = 5088888, DealerPrice = 5000000, Day = 7, SaleType = SaleTypeEnum.金币, IsSale = true }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11005", Name = "洛神萌仙", Desc = "洛神萌仙", ImageUrl = "/uploads/11005.png", Price = 3288888, VIPPrice = 3188888, DealerPrice = 2988888, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = true }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11006", Name = "脉冲音波", Desc = "脉冲音波", ImageUrl = "/uploads/11006.png", Price = 3988888, VIPPrice = 3888888, DealerPrice = 3788888, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = true }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11007", Name = "萌娃驾到", Desc = "萌娃驾到", ImageUrl = "/uploads/11007.png", Price = 3988888, VIPPrice = 3888888, DealerPrice = 3788888, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = true }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11008", Name = "创世之心", Desc = "创世之心", ImageUrl = "/uploads/11008.png", Price = 3988888, VIPPrice = 3888888, DealerPrice = 3788888, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = true }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11009", Name = "龙舟先锋", Desc = "龙舟先锋", ImageUrl = "/uploads/11009.png", Price = 3988888, VIPPrice = 3888888, DealerPrice = 3788888, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = true }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11010", Name = "金福满堂", Desc = "金福满堂", ImageUrl = "/uploads/11010.png", Price = 3988888, VIPPrice = 3888888, DealerPrice = 3788888, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = true }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11011", Name = "福狮之心", Desc = "福狮之心", ImageUrl = "/uploads/11011.png", Price = 6388888, VIPPrice = 6288888, DealerPrice = 6188888, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = true }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11012", Name = "舞兔映月", Desc = "舞兔映月", ImageUrl = "/uploads/11012.png", Price = 6388888, VIPPrice = 6288888, DealerPrice = 6188888, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = true }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11013", Name = "森林秘宝", Desc = "森林秘宝", ImageUrl = "/uploads/11013.png", Price = 3988888, VIPPrice = 3888888, DealerPrice = 3788888, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = true }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11014", Name = "心心相印", Desc = "心心相印", ImageUrl = "/uploads/11014.png", Price = 3288888, VIPPrice = 3188888, DealerPrice = 3088888, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = true }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11015", Name = "冰火回响", Desc = "冰火回响", ImageUrl = "/uploads/11015.png", Price = 3288888, VIPPrice = 3188888, DealerPrice = 3088888, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = true }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11016", Name = "梦华水晶", Desc = "梦华水晶", ImageUrl = "/uploads/11016.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11017", Name = "苍刃出鞘", Desc = "苍刃出鞘", ImageUrl = "/uploads/11017.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11018", Name = "梦魇鬼魅", Desc = "梦魇鬼魅", ImageUrl = "/uploads/11018.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11019", Name = "救赎圣域", Desc = "救赎圣域", ImageUrl = "/uploads/11019.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11020", Name = "武装斗神", Desc = "武装斗神", ImageUrl = "/uploads/11020.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11021", Name = "诸葛神弩", Desc = "诸葛神弩", ImageUrl = "/uploads/11021.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11022", Name = "春华锦簇", Desc = "春华锦簇", ImageUrl = "/uploads/11022.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11023", Name = "神龙大侠", Desc = "神龙大侠", ImageUrl = "/uploads/11023.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11024", Name = "醒狮纳吉1", Desc = "醒狮纳吉1", ImageUrl = "/uploads/11024.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11025", Name = "鸿兔先锋", Desc = "鸿兔先锋", ImageUrl = "/uploads/11025.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11026", Name = "刑天魔斧", Desc = "刑天魔斧", ImageUrl = "/uploads/11026.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11027", Name = "冰霜巨龙", Desc = "冰霜巨龙", ImageUrl = "/uploads/11027.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11028", Name = "剑气如虹", Desc = "剑气如虹", ImageUrl = "/uploads/11028.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11029", Name = "万圣通灵", Desc = "万圣通灵", ImageUrl = "/uploads/11029.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11030", Name = "八卦神炉", Desc = "八卦神炉", ImageUrl = "/uploads/11030.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11031", Name = "暗域侵扰", Desc = "暗域侵扰", ImageUrl = "/uploads/11031.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11032", Name = "天下无极", Desc = "天下无极", ImageUrl = "/uploads/11032.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11033", Name = "金秋之心", Desc = "金秋之心", ImageUrl = "/uploads/11033.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11034", Name = "沙滩明珠", Desc = "沙滩明珠", ImageUrl = "/uploads/11034.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11035", Name = "甜心教主", Desc = "甜心教主", ImageUrl = "/uploads/11035.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11036", Name = "荧光之星", Desc = "荧光之星", ImageUrl = "/uploads/11036.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11037", Name = "雷神之怒", Desc = "雷神之怒", ImageUrl = "/uploads/11037.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11038", Name = "麒麟瑞兽", Desc = "麒麟瑞兽", ImageUrl = "/uploads/11038.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11039", Name = "黑龙吐息", Desc = "黑龙吐息", ImageUrl = "/uploads/11039.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11040", Name = "圣光之剑", Desc = "圣光之剑", ImageUrl = "/uploads/11040.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11041", Name = "能量核心", Desc = "能量核心", ImageUrl = "/uploads/11041.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11042", Name = "战魂之刃", Desc = "战魂之刃", ImageUrl = "/uploads/11042.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11043", Name = "战神之怒", Desc = "战神之怒", ImageUrl = "/uploads/11043.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11044", Name = "醒狮纳吉", Desc = "醒狮纳吉", ImageUrl = "/uploads/11044.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.炮台, Number = "11045", Name = "裂魂之刃", Desc = "裂魂之刃", ImageUrl = "/uploads/11045.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12001", Name = "自由之翼", Desc = "自由之翼", ImageUrl = "/uploads/12001.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12002", Name = "紫晶龙翼", Desc = "紫晶龙翼", ImageUrl = "/uploads/12002.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12003", Name = "祥麟瑞凤", Desc = "祥麟瑞凤", ImageUrl = "/uploads/12003.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12004", Name = "雷霆万钧", Desc = "雷霆万钧", ImageUrl = "/uploads/12004.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12005", Name = "梦幻之翼", Desc = "梦幻之翼", ImageUrl = "/uploads/12005.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12006", Name = "风暴之心", Desc = "风暴之心", ImageUrl = "/uploads/12006.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12007", Name = "堕天使之翼", Desc = "堕天使之翼", ImageUrl = "/uploads/12007.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12008", Name = "飞鱼双翅", Desc = "飞鱼双翅", ImageUrl = "/uploads/12008.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12009", Name = "极度深寒", Desc = "极度深寒", ImageUrl = "/uploads/12009.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12010", Name = "如虎添翼", Desc = "如虎添翼", ImageUrl = "/uploads/12010.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12011", Name = "战魂之翼", Desc = "战魂之翼", ImageUrl = "/uploads/12011.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12012", Name = "傲游太虚", Desc = "傲游太虚", ImageUrl = "/uploads/12012.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12013", Name = "珍珠之翼", Desc = "珍珠之翼", ImageUrl = "/uploads/12013.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12014", Name = "金秋之翼", Desc = "金秋之翼", ImageUrl = "/uploads/12014.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12015", Name = "血翼狂潮", Desc = "血翼狂潮", ImageUrl = "/uploads/12015.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12016", Name = "幽冥飞刃", Desc = "幽冥飞刃", ImageUrl = "/uploads/12016.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12017", Name = "战旗之翼", Desc = "战旗之翼", ImageUrl = "/uploads/12017.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12018", Name = "三昧真火", Desc = "三昧真火", ImageUrl = "/uploads/12018.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12019", Name = "永冻领域", Desc = "永冻领域", ImageUrl = "/uploads/12019.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12020", Name = "蚩尤虎魄", Desc = "蚩尤虎魄", ImageUrl = "/uploads/12020.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12021", Name = "鸿福展翅", Desc = "鸿福展翅", ImageUrl = "/uploads/12021.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12022", Name = "流光祥翼", Desc = "流光祥翼", ImageUrl = "/uploads/12022.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12023", Name = "武林至尊", Desc = "武林至尊", ImageUrl = "/uploads/12023.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12024", Name = "流光华彩", Desc = "流光华彩", ImageUrl = "/uploads/12024.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12025", Name = "焰翎之翼", Desc = "焰翎之翼", ImageUrl = "/uploads/12025.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12026", Name = "天机神鹰", Desc = "天机神鹰", ImageUrl = "/uploads/12026.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12027", Name = "圣洁之心", Desc = "圣洁之心", ImageUrl = "/uploads/12027.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12028", Name = "刀光剑影", Desc = "刀光剑影", ImageUrl = "/uploads/12028.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12029", Name = "流火之焰", Desc = "流火之焰", ImageUrl = "/uploads/12029.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12030", Name = "玄冰烈焰", Desc = "玄冰烈焰", ImageUrl = "/uploads/12030.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12031", Name = "巨蟹之翼", Desc = "巨蟹之翼", ImageUrl = "/uploads/12031.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12032", Name = "飞龙在天", Desc = "飞龙在天", ImageUrl = "/uploads/12032.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12033", Name = "金色童年", Desc = "金色童年", ImageUrl = "/uploads/12033.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12034", Name = "虚空之光", Desc = "虚空之光", ImageUrl = "/uploads/12034.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12035", Name = "蜻蜓之夏", Desc = "蜻蜓之夏", ImageUrl = "/uploads/12035.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12036", Name = "幻蝶彩翼", Desc = "幻蝶彩翼", ImageUrl = "/uploads/12036.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12037", Name = "福狮之翼", Desc = "福狮之翼", ImageUrl = "/uploads/12037.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12038", Name = "炽核振羽", Desc = "炽核振羽", ImageUrl = "/uploads/12038.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12039", Name = "树影轻舞", Desc = "树影轻舞", ImageUrl = "/uploads/12039.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12040", Name = "创世幻翼", Desc = "创世幻翼", ImageUrl = "/uploads/12040.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12041", Name = "环游世界", Desc = "环游世界", ImageUrl = "/uploads/12041.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12042", Name = "音律幻羽", Desc = "音律幻羽", ImageUrl = "/uploads/12042.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12043", Name = "洛神云翼", Desc = "洛神云翼", ImageUrl = "/uploads/12043.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12044", Name = "五谷丰登", Desc = "五谷丰登", ImageUrl = "/uploads/12044.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12045", Name = "次元光翼", Desc = "次元光翼", ImageUrl = "/uploads/12045.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12046", Name = "时空穿梭", Desc = "时空穿梭", ImageUrl = "/uploads/12046.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + config.PropConfig.Add(new PropInfConfig() { Type = ProductTypeEnum.翅膀, Number = "12047", Name = "玄武灵蛇", Desc = "玄武灵蛇", ImageUrl = "/uploads/12047.png", Price = 0, VIPPrice = 0, DealerPrice = 0, Day = 0, SaleType = SaleTypeEnum.金币, IsSale = false }); + + for (int i = 1; i <= 45; i++) + { + var cannon = config.PropConfig.FirstOrDefault(c => c.Number == $"110{i:D2}"); + if (cannon == null) continue; + config.PropFragments.Add(new PropFragmentConfig() + { + Number = $"160{i:D2}", + Name = cannon.Name + "碎片", + Type = ProductTypeEnum.炮塔碎片, + ImageUrl = cannon.ImageUrl, + IsSale = false, + FragmentCount = 60, + ProductNumber = $"110{i:D2}" + }); + } + + for (int i = 1; i <= 47; i++) + { + var wing = config.PropConfig.FirstOrDefault(c => c.Number == $"120{i:D2}"); + if (wing == null) continue; + config.PropFragments.Add(new PropFragmentConfig() + { + Number = $"170{i:D2}", + Name = wing.Name + "碎片", + Type = ProductTypeEnum.翅膀碎片, + ImageUrl = wing.ImageUrl, + IsSale = false, + FragmentCount = 120, + ProductNumber = $"120{i:D2}" + }); + } + + Func getProp = (number) => config.PropConfig.FirstOrDefault(c => c.Number == number); + + config.VipLevelConfigs.Add(new VipLevelConfig() + { + Level = 0, + ExpMin = 0, + ExpMax = 999, + SignInAdd = 0, + Remark = "Vip等级0介绍文本
1.每日金币10000" + }); + + config.VipLevelConfigs.Add(new VipLevelConfig() + { + Level = 1, + ExpMin = 1000, + ExpMax = 6999, + SignInAdd = 0.1, + Remark = "Vip等级1介绍文本
1.每日金币10000", + GiftList = new List() + { + new GiftConfig() { Type = 2, Count = 1 }, + new GiftConfig() { Type = 3, Count = 5, OtherId = "40003" }, + new GiftConfig() { Type = 3, Count = 5, OtherId = "40004" }, + new GiftConfig() { Type = 3, Count = 1, OtherId = "40100" } + }, + DailyGift = new List() + { + new GiftConfig() { Type = 3, IsRandom = true, MinCount = 1, MaxCount = 5, OtherId = "40003" }, + new GiftConfig() { Type = 3, IsRandom = true, MinCount = 1, MaxCount = 5, OtherId = "40004" } + } + }); + + config.VipLevelConfigs.Add(new VipLevelConfig() + { + Level = 2, + ExpMin = 7000, + ExpMax = 12999, + SignInAdd = 0.2, + Remark = "Vip等级2介绍文本
1.每日金币10000", + GiftList = new List() + { + new GiftConfig() { Type = 2, Count = 2 }, + new GiftConfig() { Type = 3, Count = 10, OtherId = "40003" }, + new GiftConfig() { Type = 3, Count = 10, OtherId = "40004" }, + new GiftConfig() { Type = 3, Count = 1, OtherId = "40101" } + }, + DailyGift = new List() + { + new GiftConfig() { Type = 3, IsRandom = true, MinCount = 5, MaxCount = 10, OtherId = "40003" }, + new GiftConfig() { Type = 3, IsRandom = true, MinCount = 5, MaxCount = 10, OtherId = "40004" }, + new GiftConfig() { Type = 1, IsRandom = true, MinCount = 5000, MaxCount = 60000 } + } + }); + + // VIP3 + config.VipLevelConfigs.Add(new VipLevelConfig() + { + Level = 3, + ExpMin = 13000, + ExpMax = 19999, + SignInAdd = 0.3, + Remark = "Vip等级3介绍文本
1.每日金币10000", + GiftList = new List() + { + new GiftConfig() { Type = 2, Count = 4 }, + new GiftConfig() { Type = 3, Count = 15, OtherId = "40003" }, + new GiftConfig() { Type = 3, Count = 15, OtherId = "40004" }, + new GiftConfig() { Type = 3, Count = 1, OtherId = "40102" } + }, + DailyGift = new List() + { + new GiftConfig() { Type = 3, IsRandom = true, MinCount = 10, MaxCount = 15, OtherId = "40003" }, + new GiftConfig() { Type = 3, IsRandom = true, MinCount = 10, MaxCount = 15, OtherId = "40004" } + } + }); + + config.VipLevelConfigs.Add(new VipLevelConfig() + { + Level = 4, + ExpMin = 20000, + ExpMax = 28999, + SignInAdd = 0.4, + GiftList = new List() + { + new GiftConfig() { Type = 2, Count = 8 }, + new GiftConfig() { Type = 3, Count = 20, OtherId = "40003" }, + new GiftConfig() { Type = 3, Count = 20, OtherId = "40004" }, + new GiftConfig() { Type = 3, Count = 1, OtherId = "40103" } + }, + DailyGift = new List() + { + new GiftConfig() { Type = 3, IsRandom = true, MinCount = 15, MaxCount = 20, OtherId = "40003" }, + new GiftConfig() { Type = 3, IsRandom = true, MinCount = 15, MaxCount = 20, OtherId = "40004" } + } + }); + + config.VipLevelConfigs.Add(new VipLevelConfig() + { + Level = 5, + ExpMin = 29000, + ExpMax = 59999, + SignInAdd = 0.5, + GiftList = new List() + { + new GiftConfig() { Type = 2, Count = 16 }, + new GiftConfig() { Type = 3, Count = 25, OtherId = "40003" }, + new GiftConfig() { Type = 3, Count = 25, OtherId = "40004" }, + new GiftConfig() { Type = 3, Count = 1, OtherId = "40104" } + }, + DailyGift = new List() + { + new GiftConfig() { Type = 3, IsRandom = true, MinCount = 20, MaxCount = 25, OtherId = "40003" }, + new GiftConfig() { Type = 3, IsRandom = true, MinCount = 20, MaxCount = 25, OtherId = "40004" } + } + }); + + config.VipLevelConfigs.Add(new VipLevelConfig() + { + Level = 6, + ExpMin = 60000, + ExpMax = 99999, + SignInAdd = 0.6, + GiftList = new List() + { + new GiftConfig() { Type = 2, Count = 32 }, + new GiftConfig() { Type = 3, Count = 30, OtherId = "40003" }, + new GiftConfig() { Type = 3, Count = 30, OtherId = "40004" }, + new GiftConfig() { Type = 3, Count = 1, OtherId = "40105" } + }, + DailyGift = new List() + { + new GiftConfig() { Type = 3, IsRandom = true, MinCount = 25, MaxCount = 30, OtherId = "40003" }, + new GiftConfig() { Type = 3, IsRandom = true, MinCount = 25, MaxCount = 30, OtherId = "40004" } + } + }); + + config.VipLevelConfigs.Add(new VipLevelConfig() + { + Level = 7, + ExpMin = 100000, + ExpMax = 399999, + SignInAdd = 0.7, + GiftList = new List() + { + new GiftConfig() { Type = 2, Count = 64 }, + new GiftConfig() { Type = 3, Count = 50, OtherId = "40003" }, + new GiftConfig() { Type = 3, Count = 50, OtherId = "40004" }, + new GiftConfig() { Type = 3, Count = 1, OtherId = "40106" } + }, + DailyGift = new List() + { + new GiftConfig() { Type = 3, IsRandom = true, MinCount = 30, MaxCount = 50, OtherId = "40003" }, + new GiftConfig() { Type = 3, IsRandom = true, MinCount = 30, MaxCount = 50, OtherId = "40004" } + } + }); + + config.VipLevelConfigs.Add(new VipLevelConfig() + { + Level = 8, + ExpMin = 400000, + ExpMax = 999999, + SignInAdd = 0.8, + GiftList = new List() + { + new GiftConfig() { Type = 2, Count = 128 }, + new GiftConfig() { Type = 3, Count = 80, OtherId = "40003" }, + new GiftConfig() { Type = 3, Count = 80, OtherId = "40004" }, + new GiftConfig() { Type = 3, Count = 1, OtherId = "40107" } + }, + DailyGift = new List() + { + new GiftConfig() { Type = 3, Count = 80, OtherId = "40003" }, + new GiftConfig() { Type = 3, Count = 80, OtherId = "40004" } + } + }); + + config.VipLevelConfigs.Add(new VipLevelConfig() + { + Level = 9, + ExpMin = 1000000, + ExpMax = 2999999, + SignInAdd = 0.9, + GiftList = new List() + { + new GiftConfig() { Type = 2, Count = 328 }, + new GiftConfig() { Type = 3, Count = 100, OtherId = "40003" }, + new GiftConfig() { Type = 3, Count = 100, OtherId = "40004" }, + new GiftConfig() { Type = 3, Count = 1, OtherId = "40108" } + }, + DailyGift = new List() + { + new GiftConfig() { Type = 3, IsRandom = true, MinCount = 80, MaxCount = 100, OtherId = "40003" }, + new GiftConfig() { Type = 3, IsRandom = true, MinCount = 80, MaxCount = 100, OtherId = "40004" } + } + }); + + config.VipLevelConfigs.Add(new VipLevelConfig() + { + Level = 10, + ExpMin = 3000000, + ExpMax = 999999999, + SignInAdd = 1.0, + GiftList = new List() + { + new GiftConfig() { Type = 2, Count = 328 }, + new GiftConfig() { Type = 3, Count = 100, OtherId = "40003" }, + new GiftConfig() { Type = 3, Count = 100, OtherId = "40004" }, + new GiftConfig() { Type = 3, Count = 1, OtherId = "40109" } + }, + + }); + + + + + config.BossConfigs = new BossConfig(); + { + var luckWheelObj = new LuckWheelConfig(); + + + luckWheelObj.FishNumber.Add("12031"); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(50, 50, 50)); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(100, 100, 100)); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(230, 230, 200)); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(80, 80, 80)); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(280, 280, 280)); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(300, 300, 300)); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(130, 130, 130)); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(250, 250, 250)); + + luckWheelObj.CountList.Add(new BossOptionBaseParam(1, 100)); + luckWheelObj.CountList.Add(new BossOptionBaseParam(2, 100)); + luckWheelObj.CountList.Add(new BossOptionBaseParam(3, 100)); + luckWheelObj.CountList.Add(new BossOptionBaseParam(4, 30)); + luckWheelObj.CountList.Add(new BossOptionBaseParam(5, 15)); + luckWheelObj.CountList.Add(new BossOptionBaseParam(6, 5)); + config.BossConfigs.LuckWheel.Add(luckWheelObj); + } + { + var luckWheelObj = new LuckWheelConfig(); + luckWheelObj.FishNumber.Add("11038"); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(50, 900, 50)); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(100, 180, 100)); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(230, 8, 230)); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(80, 320, 80)); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(280, 4, 280)); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(300, 3, 300)); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(130, 25, 130)); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(250, 12, 250)); + luckWheelObj.CountList.Add(new BossOptionBaseParam(1, 100)); + luckWheelObj.CountList.Add(new BossOptionBaseParam(2, 100)); + luckWheelObj.CountList.Add(new BossOptionBaseParam(3, 100)); + luckWheelObj.CountList.Add(new BossOptionBaseParam(4, 30)); + luckWheelObj.CountList.Add(new BossOptionBaseParam(5, 15)); + luckWheelObj.CountList.Add(new BossOptionBaseParam(6, 5)); + config.BossConfigs.LuckWheel.Add(luckWheelObj); + } + { + var luckWheelObj = new LuckWheelConfig(); + + + luckWheelObj.FishNumber.Add("12032"); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(50, 50, 50)); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(100, 100, 100)); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(230, 230, 200)); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(80, 80, 80)); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(280, 280, 280)); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(300, 300, 300)); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(130, 130, 130)); + luckWheelObj.OptionList.Add(new BossOptionBaseParam(250, 250, 250)); + + luckWheelObj.CountList.Add(new BossOptionBaseParam(1, 100)); + luckWheelObj.CountList.Add(new BossOptionBaseParam(2, 100)); + luckWheelObj.CountList.Add(new BossOptionBaseParam(3, 100)); + luckWheelObj.CountList.Add(new BossOptionBaseParam(4, 30)); + luckWheelObj.CountList.Add(new BossOptionBaseParam(5, 15)); + luckWheelObj.CountList.Add(new BossOptionBaseParam(6, 5)); + config.BossConfigs.LuckWheel.Add(luckWheelObj); + } + + config.BossConfigs.LuckPoker.FishNumber.Add("12023"); + config.BossConfigs.LuckPoker.OptionList.Add(new BossOptionBaseParam(1, 1, 200)); + config.BossConfigs.LuckPoker.OptionList.Add(new BossOptionBaseParam(2, 2, 100)); + config.BossConfigs.LuckPoker.OptionList.Add(new BossOptionBaseParam(3, 20, 50)); + config.BossConfigs.LuckPoker.OptionList.Add(new BossOptionBaseParam(4, 13, 80)); + config.BossConfigs.LuckPoker.OptionList.Add(new BossOptionBaseParam(5, 33, 30)); + config.BossConfigs.LuckPoker.OptionList.Add(new BossOptionBaseParam(6, 205, 10)); + + { + var model = new LuckFlyDiskConfig(); + model.FishNumber.Add("12022"); + model.InnerOptionList.Add(new BossOptionBaseParam(10, 100, 10)); + model.InnerOptionList.Add(new BossOptionBaseParam(20, 80, 20)); + model.InnerOptionList.Add(new BossOptionBaseParam(30, 70, 30)); + model.InnerOptionList.Add(new BossOptionBaseParam(40, 60, 1400)); + model.InnerOptionList.Add(new BossOptionBaseParam(50, 50, 50)); + model.InnerOptionList.Add(new BossOptionBaseParam(80, 30, 80)); + model.InnerOptionList.Add(new BossOptionBaseParam(100, 20, 100)); + model.InnerOptionList.Add(new BossOptionBaseParam(150, 10, 150)); + model.InnerOptionList.Add(new BossOptionBaseParam(200, 5, 200)); + model.InnerOptionList.Add(new BossOptionBaseParam(500, 2, 500)); + //[1:100,1.2:100,1.5:100,1.8:100,2:100,2.5:100,3:100]] + + model.OuterOptionList.Add(new BossOptionBaseParam(1, 50, 1)); + model.OuterOptionList.Add(new BossOptionBaseParam(1.2, 40, 1.2)); + model.OuterOptionList.Add(new BossOptionBaseParam(1.5, 30, 1.5)); + model.OuterOptionList.Add(new BossOptionBaseParam(1.8, 20, 1.8)); + model.OuterOptionList.Add(new BossOptionBaseParam(2, 15, 2)); + model.OuterOptionList.Add(new BossOptionBaseParam(2.5, 10, 2.5)); + model.OuterOptionList.Add(new BossOptionBaseParam(3, 5, 3)); + config.BossConfigs.LuckFlyDisk.Add(model); + } + { + var model = new LuckFlyDiskConfig(); + model.FishNumber.Add("11030"); + model.InnerOptionList.Add(new BossOptionBaseParam(1, 1, 1)); + model.InnerOptionList.Add(new BossOptionBaseParam(2, 2, 2)); + model.InnerOptionList.Add(new BossOptionBaseParam(3, 3, 3)); + + //[1:100,1.2:100,1.5:100,1.8:100,2:100,2.5:100,3:100]] + + model.OuterOptionList.Add(new BossOptionBaseParam(1, 1, 1)); + model.OuterOptionList.Add(new BossOptionBaseParam(2, 2, 1)); + model.OuterOptionList.Add(new BossOptionBaseParam(3, 3, 2)); + model.OuterOptionList.Add(new BossOptionBaseParam(4, 4, 3)); + + + config.BossConfigs.LuckFlyDisk.Add(model); + } + + config.BossConfigs.FullScreen.FishNumber.Add(""); + config.BossConfigs.FullScreen.FishNumber.AddRange(new List { }); + + + config.BossConfigs.AmmunitionBox.FishNumber.Add("12025"); + + config.BossConfigs.AmmunitionBox.OptionList.Add(new BossOptionBaseParam(1, 100, 1)); + config.BossConfigs.AmmunitionBox.OptionList.Add(new BossOptionBaseParam(2, 100, 2)); + config.BossConfigs.AmmunitionBox.OptionList.Add(new BossOptionBaseParam(3, 100, 3)); + + + + + { + var tempObj1 = new BossProbabilityConfig() + { + FishNumber = new List() { "13024" } + }; + tempObj1.configParams.Add(new BossProbabilityConfigParam(150, 160, 200)); + tempObj1.configParams.Add(new BossProbabilityConfigParam(161, 170, 185)); + tempObj1.configParams.Add(new BossProbabilityConfigParam(171, 180, 170)); + tempObj1.configParams.Add(new BossProbabilityConfigParam(181, 190, 160)); + tempObj1.configParams.Add(new BossProbabilityConfigParam(191, 200, 150)); + tempObj1.configParams.Add(new BossProbabilityConfigParam(201, 210, 140)); + tempObj1.configParams.Add(new BossProbabilityConfigParam(210, 220, 130)); + tempObj1.configParams.Add(new BossProbabilityConfigParam(221, 230, 120)); + config.BossConfigs.Probability.Add(tempObj1); + + var tempObj2 = new BossProbabilityConfig() + { + FishNumber = new List() { "13025" } + }; + tempObj2.configParams.Add(new BossProbabilityConfigParam(160, 170, 115)); + tempObj2.configParams.Add(new BossProbabilityConfigParam(171, 180, 108)); + tempObj2.configParams.Add(new BossProbabilityConfigParam(181, 190, 102)); + tempObj2.configParams.Add(new BossProbabilityConfigParam(191, 200, 95)); + tempObj2.configParams.Add(new BossProbabilityConfigParam(201, 210, 89)); + tempObj2.configParams.Add(new BossProbabilityConfigParam(211, 220, 83)); + tempObj2.configParams.Add(new BossProbabilityConfigParam(221, 230, 78)); + tempObj2.configParams.Add(new BossProbabilityConfigParam(231, 240, 74)); + config.BossConfigs.Probability.Add(tempObj2); + + var tempObj3 = new BossProbabilityConfig() + { + FishNumber = new List() { "13026" } + }; + tempObj3.configParams.Add(new BossProbabilityConfigParam(150, 160, 118)); + tempObj3.configParams.Add(new BossProbabilityConfigParam(161, 170, 110)); + tempObj3.configParams.Add(new BossProbabilityConfigParam(171, 180, 104)); + tempObj3.configParams.Add(new BossProbabilityConfigParam(181, 190, 98)); + tempObj3.configParams.Add(new BossProbabilityConfigParam(191, 200, 93)); + tempObj3.configParams.Add(new BossProbabilityConfigParam(201, 210, 88)); + tempObj3.configParams.Add(new BossProbabilityConfigParam(211, 220, 83)); + tempObj3.configParams.Add(new BossProbabilityConfigParam(221, 230, 79)); + config.BossConfigs.Probability.Add(tempObj3); + + var tempObj4 = new BossProbabilityConfig() + { + FishNumber = new List() { "13027" } + }; + tempObj4.configParams.Add(new BossProbabilityConfigParam(181, 190, 105)); + tempObj4.configParams.Add(new BossProbabilityConfigParam(191, 200, 100)); + tempObj4.configParams.Add(new BossProbabilityConfigParam(201, 210, 95)); + tempObj4.configParams.Add(new BossProbabilityConfigParam(211, 220, 91)); + tempObj4.configParams.Add(new BossProbabilityConfigParam(221, 230, 87)); + tempObj4.configParams.Add(new BossProbabilityConfigParam(231, 240, 83)); + tempObj4.configParams.Add(new BossProbabilityConfigParam(241, 250, 80)); + tempObj4.configParams.Add(new BossProbabilityConfigParam(251, 260, 77)); + tempObj4.configParams.Add(new BossProbabilityConfigParam(261, 270, 74)); + tempObj4.configParams.Add(new BossProbabilityConfigParam(271, 280, 71)); + config.BossConfigs.Probability.Add(tempObj4); + + var tempObj5 = new BossProbabilityConfig() + { + FishNumber = new List() { "13028" } + }; + tempObj5.configParams.Add(new BossProbabilityConfigParam(191, 200, 108)); + tempObj5.configParams.Add(new BossProbabilityConfigParam(201, 210, 103)); + tempObj5.configParams.Add(new BossProbabilityConfigParam(211, 220, 98)); + tempObj5.configParams.Add(new BossProbabilityConfigParam(221, 230, 94)); + tempObj5.configParams.Add(new BossProbabilityConfigParam(231, 240, 90)); + tempObj5.configParams.Add(new BossProbabilityConfigParam(251, 260, 83)); + tempObj5.configParams.Add(new BossProbabilityConfigParam(261, 270, 80)); + tempObj5.configParams.Add(new BossProbabilityConfigParam(271, 280, 77)); + tempObj5.configParams.Add(new BossProbabilityConfigParam(281, 290, 75)); + tempObj5.configParams.Add(new BossProbabilityConfigParam(291, 300, 72)); + config.BossConfigs.Probability.Add(tempObj5); + + var tempObj6 = new BossProbabilityConfig() + { + FishNumber = new List() { "13029" } + }; + tempObj6.configParams.Add(new BossProbabilityConfigParam(250, 270, 111)); + tempObj6.configParams.Add(new BossProbabilityConfigParam(271, 290, 103)); + tempObj6.configParams.Add(new BossProbabilityConfigParam(291, 310, 96)); + tempObj6.configParams.Add(new BossProbabilityConfigParam(311, 330, 90)); + tempObj6.configParams.Add(new BossProbabilityConfigParam(331, 350, 89)); + tempObj6.configParams.Add(new BossProbabilityConfigParam(351, 360, 86)); + tempObj6.configParams.Add(new BossProbabilityConfigParam(361, 380, 81)); + tempObj6.configParams.Add(new BossProbabilityConfigParam(381, 400, 77)); + config.BossConfigs.Probability.Add(tempObj6); + + var tempObj7 = new BossProbabilityConfig() + { + FishNumber = new List() { "13030" } + }; + tempObj7.configParams.Add(new BossProbabilityConfigParam(201, 220, 110)); + tempObj7.configParams.Add(new BossProbabilityConfigParam(221, 239, 102)); + tempObj7.configParams.Add(new BossProbabilityConfigParam(250, 270, 95)); + tempObj7.configParams.Add(new BossProbabilityConfigParam(271, 290, 88)); + tempObj7.configParams.Add(new BossProbabilityConfigParam(291, 310, 83)); + tempObj7.configParams.Add(new BossProbabilityConfigParam(311, 330, 78)); + tempObj7.configParams.Add(new BossProbabilityConfigParam(331, 339, 77)); + tempObj7.configParams.Add(new BossProbabilityConfigParam(350, 360, 75)); + tempObj7.configParams.Add(new BossProbabilityConfigParam(361, 380, 71)); + tempObj7.configParams.Add(new BossProbabilityConfigParam(381, 400, 67)); + config.BossConfigs.Probability.Add(tempObj7); + + var tempObj8 = new BossProbabilityConfig() + { + FishNumber = new List() { "13031" } + }; + tempObj8.configParams.Add(new BossProbabilityConfigParam(201, 220, 107)); + tempObj8.configParams.Add(new BossProbabilityConfigParam(221, 239, 99)); + tempObj8.configParams.Add(new BossProbabilityConfigParam(250, 270, 92)); + tempObj8.configParams.Add(new BossProbabilityConfigParam(271, 290, 85)); + tempObj8.configParams.Add(new BossProbabilityConfigParam(291, 310, 80)); + tempObj8.configParams.Add(new BossProbabilityConfigParam(311, 330, 76)); + tempObj8.configParams.Add(new BossProbabilityConfigParam(331, 339, 74)); + tempObj8.configParams.Add(new BossProbabilityConfigParam(350, 360, 72)); + tempObj8.configParams.Add(new BossProbabilityConfigParam(361, 380, 68)); + tempObj8.configParams.Add(new BossProbabilityConfigParam(381, 400, 65)); + config.BossConfigs.Probability.Add(tempObj8); + + var tempObj9 = new BossProbabilityConfig() + { + FishNumber = new List() { "13032" } + }; + tempObj9.configParams.Add(new BossProbabilityConfigParam(280, 380, 100)); + tempObj9.configParams.Add(new BossProbabilityConfigParam(380, 480, 90)); + tempObj9.configParams.Add(new BossProbabilityConfigParam(480, 580, 67)); + tempObj9.configParams.Add(new BossProbabilityConfigParam(580, 680, 57)); + tempObj9.configParams.Add(new BossProbabilityConfigParam(680, 780, 50)); + tempObj9.configParams.Add(new BossProbabilityConfigParam(780, 880, 43)); + config.BossConfigs.Probability.Add(tempObj9); + + var tempObj10 = new BossProbabilityConfig() + { + FishNumber = new List() { "13033" } + }; + tempObj10.configParams.Add(new BossProbabilityConfigParam(201, 220, 100)); + tempObj10.configParams.Add(new BossProbabilityConfigParam(221, 239, 91)); + tempObj10.configParams.Add(new BossProbabilityConfigParam(250, 270, 83)); + tempObj10.configParams.Add(new BossProbabilityConfigParam(271, 290, 77)); + tempObj10.configParams.Add(new BossProbabilityConfigParam(291, 310, 74)); + tempObj10.configParams.Add(new BossProbabilityConfigParam(311, 330, 68)); + tempObj10.configParams.Add(new BossProbabilityConfigParam(331, 339, 67)); + tempObj10.configParams.Add(new BossProbabilityConfigParam(350, 360, 65)); + tempObj10.configParams.Add(new BossProbabilityConfigParam(361, 380, 62)); + tempObj10.configParams.Add(new BossProbabilityConfigParam(381, 400, 59)); + config.BossConfigs.Probability.Add(tempObj10); + + var tempObj11 = new BossProbabilityConfig() + { + FishNumber = new List() { "13034" } + }; + tempObj11.configParams.Add(new BossProbabilityConfigParam(380, 420, 100)); + tempObj11.configParams.Add(new BossProbabilityConfigParam(421, 520, 81)); + tempObj11.configParams.Add(new BossProbabilityConfigParam(521, 620, 67)); + tempObj11.configParams.Add(new BossProbabilityConfigParam(621, 720, 57)); + tempObj11.configParams.Add(new BossProbabilityConfigParam(721, 820, 50)); + tempObj11.configParams.Add(new BossProbabilityConfigParam(821, 920, 43)); + config.BossConfigs.Probability.Add(tempObj11); + + var tempObj12 = new BossProbabilityConfig() + { + FishNumber = new List() { "13035" } + }; + tempObj12.configParams.Add(new BossProbabilityConfigParam(280, 380, 100)); + tempObj12.configParams.Add(new BossProbabilityConfigParam(380, 480, 90)); + tempObj12.configParams.Add(new BossProbabilityConfigParam(480, 580, 67)); + tempObj12.configParams.Add(new BossProbabilityConfigParam(580, 680, 57)); + tempObj12.configParams.Add(new BossProbabilityConfigParam(680, 780, 50)); + tempObj12.configParams.Add(new BossProbabilityConfigParam(780, 880, 43)); + config.BossConfigs.Probability.Add(tempObj12); + + var tempObj13 = new BossProbabilityConfig() + { + FishNumber = new List() { "13036" } + }; + tempObj13.configParams.Add(new BossProbabilityConfigParam(360, 400, 100)); + tempObj13.configParams.Add(new BossProbabilityConfigParam(401, 460, 87)); + tempObj13.configParams.Add(new BossProbabilityConfigParam(461, 500, 77)); + tempObj13.configParams.Add(new BossProbabilityConfigParam(501, 560, 69)); + tempObj13.configParams.Add(new BossProbabilityConfigParam(561, 660, 61)); + tempObj13.configParams.Add(new BossProbabilityConfigParam(661, 700, 56)); + tempObj13.configParams.Add(new BossProbabilityConfigParam(701, 760, 52)); + tempObj13.configParams.Add(new BossProbabilityConfigParam(761, 800, 48)); + tempObj13.configParams.Add(new BossProbabilityConfigParam(801, 900, 44)); + tempObj13.configParams.Add(new BossProbabilityConfigParam(901, 980, 41)); + config.BossConfigs.Probability.Add(tempObj13); + + var tempObj14 = new BossProbabilityConfig() + { + FishNumber = new List() { "13037" } + }; + tempObj14.configParams.Add(new BossProbabilityConfigParam(380, 480, 100)); + tempObj14.configParams.Add(new BossProbabilityConfigParam(481, 580, 83)); + tempObj14.configParams.Add(new BossProbabilityConfigParam(581, 680, 69)); + tempObj14.configParams.Add(new BossProbabilityConfigParam(681, 780, 58)); + tempObj14.configParams.Add(new BossProbabilityConfigParam(781, 880, 51)); + tempObj14.configParams.Add(new BossProbabilityConfigParam(881, 980, 45)); + tempObj14.configParams.Add(new BossProbabilityConfigParam(981, 1080, 41)); + config.BossConfigs.Probability.Add(tempObj14); + + var tempObj15 = new BossProbabilityConfig() + { + FishNumber = new List() { "13038" } + }; + tempObj15.configParams.Add(new BossProbabilityConfigParam(1, 1, 325)); + tempObj15.configParams.Add(new BossProbabilityConfigParam(2, 2, 163)); + tempObj15.configParams.Add(new BossProbabilityConfigParam(3, 3, 109)); + tempObj15.configParams.Add(new BossProbabilityConfigParam(4, 4, 81)); + tempObj15.configParams.Add(new BossProbabilityConfigParam(5, 5, 65)); + tempObj15.configParams.Add(new BossProbabilityConfigParam(6, 6, 54)); + config.BossConfigs.Probability.Add(tempObj15); + + var tempObj16 = new BossProbabilityConfig() + { + FishNumber = new List() { "13039" } + }; + tempObj16.configParams.Add(new BossProbabilityConfigParam(1, 1, 325)); + tempObj16.configParams.Add(new BossProbabilityConfigParam(2, 2, 163)); + tempObj16.configParams.Add(new BossProbabilityConfigParam(3, 3, 109)); + tempObj16.configParams.Add(new BossProbabilityConfigParam(4, 4, 81)); + tempObj16.configParams.Add(new BossProbabilityConfigParam(5, 5, 65)); + tempObj16.configParams.Add(new BossProbabilityConfigParam(6, 6, 54)); + config.BossConfigs.Probability.Add(tempObj16); + + + var tempObjBaoLieJinSha = new BossProbabilityConfig() + { + FishNumber = new List() { "12026" } + }; + tempObjBaoLieJinSha.configParams.Add(new BossProbabilityConfigParam(181, 190, 105)); + tempObjBaoLieJinSha.configParams.Add(new BossProbabilityConfigParam(191, 200, 100)); + tempObjBaoLieJinSha.configParams.Add(new BossProbabilityConfigParam(201, 210, 95)); + tempObjBaoLieJinSha.configParams.Add(new BossProbabilityConfigParam(211, 220, 91)); + tempObjBaoLieJinSha.configParams.Add(new BossProbabilityConfigParam(221, 230, 87)); + tempObjBaoLieJinSha.configParams.Add(new BossProbabilityConfigParam(231, 240, 83)); + tempObjBaoLieJinSha.configParams.Add(new BossProbabilityConfigParam(241, 250, 80)); + tempObjBaoLieJinSha.configParams.Add(new BossProbabilityConfigParam(251, 260, 77)); + tempObjBaoLieJinSha.configParams.Add(new BossProbabilityConfigParam(261, 270, 74)); + tempObjBaoLieJinSha.configParams.Add(new BossProbabilityConfigParam(271, 280, 71)); + config.BossConfigs.Probability.Add(tempObjBaoLieJinSha); + + var tempObjHeiDongFeiChuan = new BossProbabilityConfig() + { + FishNumber = new List() { "12024" } + }; + tempObjHeiDongFeiChuan.configParams.Add(new BossProbabilityConfigParam(150, 160, 118)); + tempObjHeiDongFeiChuan.configParams.Add(new BossProbabilityConfigParam(161, 170, 110)); + tempObjHeiDongFeiChuan.configParams.Add(new BossProbabilityConfigParam(171, 180, 104)); + tempObjHeiDongFeiChuan.configParams.Add(new BossProbabilityConfigParam(181, 190, 98)); + tempObjHeiDongFeiChuan.configParams.Add(new BossProbabilityConfigParam(191, 200, 93)); + tempObjHeiDongFeiChuan.configParams.Add(new BossProbabilityConfigParam(201, 210, 88)); + tempObjHeiDongFeiChuan.configParams.Add(new BossProbabilityConfigParam(210, 220, 83)); + tempObjHeiDongFeiChuan.configParams.Add(new BossProbabilityConfigParam(221, 230, 79)); + config.BossConfigs.Probability.Add(tempObjHeiDongFeiChuan); + + var tempObjNvLongWang = new BossProbabilityConfig() + { + FishNumber = new List() { "12027" } + }; + tempObjNvLongWang.configParams.Add(new BossProbabilityConfigParam(320, 420, 100)); + tempObjNvLongWang.configParams.Add(new BossProbabilityConfigParam(421, 520, 81)); + tempObjNvLongWang.configParams.Add(new BossProbabilityConfigParam(521, 620, 67)); + tempObjNvLongWang.configParams.Add(new BossProbabilityConfigParam(621, 720, 57)); + tempObjNvLongWang.configParams.Add(new BossProbabilityConfigParam(721, 820, 50)); + tempObjNvLongWang.configParams.Add(new BossProbabilityConfigParam(821, 920, 43)); + config.BossConfigs.Probability.Add(tempObjNvLongWang); + + var tempObjJiJiaLeiTing = new BossProbabilityConfig() + { + FishNumber = new List() { "12033" } + }; + tempObjJiJiaLeiTing.configParams.Add(new BossProbabilityConfigParam(1, 1, 600)); + tempObjJiJiaLeiTing.configParams.Add(new BossProbabilityConfigParam(2, 2, 300)); + tempObjJiJiaLeiTing.configParams.Add(new BossProbabilityConfigParam(3, 3, 200)); + tempObjJiJiaLeiTing.configParams.Add(new BossProbabilityConfigParam(4, 4, 150)); + tempObjJiJiaLeiTing.configParams.Add(new BossProbabilityConfigParam(5, 5, 120)); + tempObjJiJiaLeiTing.configParams.Add(new BossProbabilityConfigParam(6, 6, 100)); + config.BossConfigs.Probability.Add(tempObjJiJiaLeiTing); + + var tempObjLinglong = new BossProbabilityConfig() + { + FishNumber = new List() { "11025" } + }; + tempObjLinglong.configParams.Add(new BossProbabilityConfigParam(280, 380, 100)); + tempObjLinglong.configParams.Add(new BossProbabilityConfigParam(380, 480, 80)); + tempObjLinglong.configParams.Add(new BossProbabilityConfigParam(480, 580, 67)); + tempObjLinglong.configParams.Add(new BossProbabilityConfigParam(580, 680, 57)); + tempObjLinglong.configParams.Add(new BossProbabilityConfigParam(680, 780, 50)); + tempObjLinglong.configParams.Add(new BossProbabilityConfigParam(780, 880, 43)); + config.BossConfigs.Probability.Add(tempObjLinglong); + + var tempObjMermaid = new BossProbabilityConfig() + { + FishNumber = new List() { "11041" } + }; + tempObjMermaid.configParams.Add(new BossProbabilityConfigParam(1, 1, 250)); + tempObjMermaid.configParams.Add(new BossProbabilityConfigParam(2, 2, 125)); + tempObjMermaid.configParams.Add(new BossProbabilityConfigParam(3, 3, 83)); + tempObjMermaid.configParams.Add(new BossProbabilityConfigParam(4, 4, 62)); + tempObjMermaid.configParams.Add(new BossProbabilityConfigParam(5, 5, 50)); + tempObjMermaid.configParams.Add(new BossProbabilityConfigParam(6, 6, 41)); + tempObjMermaid.configParams.Add(new BossProbabilityConfigParam(7, 7, 35)); + tempObjMermaid.configParams.Add(new BossProbabilityConfigParam(8, 8, 31)); + config.BossConfigs.Probability.Add(tempObjMermaid); + + var tempYingGuang = new BossProbabilityConfig() + { + FishNumber = new List() { "11034" } + }; + tempYingGuang.configParams.Add(new BossProbabilityConfigParam(185, 195, 105)); + tempYingGuang.configParams.Add(new BossProbabilityConfigParam(196, 205, 100)); + tempYingGuang.configParams.Add(new BossProbabilityConfigParam(206, 215, 95)); + tempYingGuang.configParams.Add(new BossProbabilityConfigParam(216, 225, 91)); + tempYingGuang.configParams.Add(new BossProbabilityConfigParam(226, 235, 87)); + tempYingGuang.configParams.Add(new BossProbabilityConfigParam(236, 245, 83)); + tempYingGuang.configParams.Add(new BossProbabilityConfigParam(246, 255, 80)); + tempYingGuang.configParams.Add(new BossProbabilityConfigParam(256, 265, 75)); + tempYingGuang.configParams.Add(new BossProbabilityConfigParam(266, 275, 73)); + tempYingGuang.configParams.Add(new BossProbabilityConfigParam(276, 285, 70)); + config.BossConfigs.Probability.Add(tempYingGuang); + + var tempLongGui = new BossProbabilityConfig() + { + FishNumber = new List() { "11035" } + }; + tempLongGui.configParams.Add(new BossProbabilityConfigParam(185, 195, 105)); + tempLongGui.configParams.Add(new BossProbabilityConfigParam(196, 205, 100)); + tempLongGui.configParams.Add(new BossProbabilityConfigParam(206, 215, 95)); + tempLongGui.configParams.Add(new BossProbabilityConfigParam(216, 225, 91)); + tempLongGui.configParams.Add(new BossProbabilityConfigParam(226, 235, 87)); + tempLongGui.configParams.Add(new BossProbabilityConfigParam(236, 245, 83)); + tempLongGui.configParams.Add(new BossProbabilityConfigParam(246, 255, 80)); + tempLongGui.configParams.Add(new BossProbabilityConfigParam(256, 265, 75)); + tempLongGui.configParams.Add(new BossProbabilityConfigParam(266, 275, 73)); + tempLongGui.configParams.Add(new BossProbabilityConfigParam(276, 285, 70)); + config.BossConfigs.Probability.Add(tempLongGui); + + var tempShenHai = new BossProbabilityConfig() + { + FishNumber = new List() { "11036" } + }; + tempShenHai.configParams.Add(new BossProbabilityConfigParam(185, 195, 129)); + tempShenHai.configParams.Add(new BossProbabilityConfigParam(196, 205, 119)); + tempShenHai.configParams.Add(new BossProbabilityConfigParam(206, 215, 111)); + tempShenHai.configParams.Add(new BossProbabilityConfigParam(216, 225, 105)); + tempShenHai.configParams.Add(new BossProbabilityConfigParam(226, 235, 101)); + tempShenHai.configParams.Add(new BossProbabilityConfigParam(236, 245, 97)); + tempShenHai.configParams.Add(new BossProbabilityConfigParam(246, 255, 94)); + tempShenHai.configParams.Add(new BossProbabilityConfigParam(256, 265, 91)); + tempShenHai.configParams.Add(new BossProbabilityConfigParam(266, 275, 88)); + tempShenHai.configParams.Add(new BossProbabilityConfigParam(276, 285, 85)); + config.BossConfigs.Probability.Add(tempShenHai); + + var tempEYu = new BossProbabilityConfig() + { + FishNumber = new List() { "11037" } + }; + tempEYu.configParams.Add(new BossProbabilityConfigParam(185, 195, 105)); + tempEYu.configParams.Add(new BossProbabilityConfigParam(196, 205, 100)); + tempEYu.configParams.Add(new BossProbabilityConfigParam(206, 215, 95)); + tempEYu.configParams.Add(new BossProbabilityConfigParam(216, 225, 91)); + tempEYu.configParams.Add(new BossProbabilityConfigParam(226, 235, 87)); + tempEYu.configParams.Add(new BossProbabilityConfigParam(236, 245, 83)); + tempEYu.configParams.Add(new BossProbabilityConfigParam(246, 255, 80)); + tempEYu.configParams.Add(new BossProbabilityConfigParam(256, 265, 75)); + tempEYu.configParams.Add(new BossProbabilityConfigParam(266, 275, 73)); + tempEYu.configParams.Add(new BossProbabilityConfigParam(276, 285, 70)); + config.BossConfigs.Probability.Add(tempEYu); + + var tempBaWang = new BossProbabilityConfig() + { + FishNumber = new List() { "11042" } + }; + tempBaWang.configParams.Add(new BossProbabilityConfigParam(185, 195, 105)); + tempBaWang.configParams.Add(new BossProbabilityConfigParam(196, 205, 100)); + tempBaWang.configParams.Add(new BossProbabilityConfigParam(206, 215, 95)); + tempBaWang.configParams.Add(new BossProbabilityConfigParam(216, 225, 91)); + tempBaWang.configParams.Add(new BossProbabilityConfigParam(226, 235, 87)); + tempBaWang.configParams.Add(new BossProbabilityConfigParam(236, 245, 83)); + tempBaWang.configParams.Add(new BossProbabilityConfigParam(246, 255, 80)); + tempBaWang.configParams.Add(new BossProbabilityConfigParam(256, 265, 75)); + tempBaWang.configParams.Add(new BossProbabilityConfigParam(266, 275, 73)); + tempBaWang.configParams.Add(new BossProbabilityConfigParam(276, 285, 70)); + config.BossConfigs.Probability.Add(tempBaWang); + + var tempGeSiLa = new BossProbabilityConfig() + { + FishNumber = new List() { "11043" } + }; + tempGeSiLa.configParams.Add(new BossProbabilityConfigParam(1, 1, 250)); + tempGeSiLa.configParams.Add(new BossProbabilityConfigParam(2, 2, 125)); + tempGeSiLa.configParams.Add(new BossProbabilityConfigParam(3, 3, 83)); + tempGeSiLa.configParams.Add(new BossProbabilityConfigParam(4, 4, 62)); + tempGeSiLa.configParams.Add(new BossProbabilityConfigParam(5, 5, 50)); + tempGeSiLa.configParams.Add(new BossProbabilityConfigParam(6, 6, 41)); + tempGeSiLa.configParams.Add(new BossProbabilityConfigParam(7, 7, 35)); + tempGeSiLa.configParams.Add(new BossProbabilityConfigParam(8, 8, 31)); + config.BossConfigs.Probability.Add(tempGeSiLa); + + var tempDianMan = new BossProbabilityConfig() + { + FishNumber = new List() { "11023" } + }; + tempDianMan.configParams.Add(new BossProbabilityConfigParam(150, 155, 117)); + tempDianMan.configParams.Add(new BossProbabilityConfigParam(156, 160, 110)); + tempDianMan.configParams.Add(new BossProbabilityConfigParam(161, 165, 106)); + tempDianMan.configParams.Add(new BossProbabilityConfigParam(166, 170, 103)); + tempDianMan.configParams.Add(new BossProbabilityConfigParam(171, 175, 100)); + tempDianMan.configParams.Add(new BossProbabilityConfigParam(176, 180, 97)); + tempDianMan.configParams.Add(new BossProbabilityConfigParam(181, 185, 95)); + tempDianMan.configParams.Add(new BossProbabilityConfigParam(186, 190, 92)); + tempDianMan.configParams.Add(new BossProbabilityConfigParam(191, 195, 90)); + tempDianMan.configParams.Add(new BossProbabilityConfigParam(196, 200, 88)); + config.BossConfigs.Probability.Add(tempDianMan); + + var tempTunShiKun = new BossProbabilityConfig() + { + FishNumber = new List() { "11024" } + }; + tempTunShiKun.configParams.Add(new BossProbabilityConfigParam(150, 155, 120)); + tempTunShiKun.configParams.Add(new BossProbabilityConfigParam(156, 160, 113)); + tempTunShiKun.configParams.Add(new BossProbabilityConfigParam(161, 165, 109)); + tempTunShiKun.configParams.Add(new BossProbabilityConfigParam(166, 170, 106)); + tempTunShiKun.configParams.Add(new BossProbabilityConfigParam(171, 175, 103)); + tempTunShiKun.configParams.Add(new BossProbabilityConfigParam(176, 180, 100)); + tempTunShiKun.configParams.Add(new BossProbabilityConfigParam(181, 185, 97)); + tempTunShiKun.configParams.Add(new BossProbabilityConfigParam(186, 190, 95)); + tempTunShiKun.configParams.Add(new BossProbabilityConfigParam(191, 195, 92)); + tempTunShiKun.configParams.Add(new BossProbabilityConfigParam(196, 200, 90)); + config.BossConfigs.Probability.Add(tempTunShiKun); + + var tempJuBaoPen = new BossProbabilityConfig() + { + FishNumber = new List() { "11026" } + }; + tempJuBaoPen.configParams.Add(new BossProbabilityConfigParam(280, 380, 100)); + tempJuBaoPen.configParams.Add(new BossProbabilityConfigParam(380, 480, 80)); + tempJuBaoPen.configParams.Add(new BossProbabilityConfigParam(480, 580, 67)); + tempJuBaoPen.configParams.Add(new BossProbabilityConfigParam(580, 680, 57)); + tempJuBaoPen.configParams.Add(new BossProbabilityConfigParam(680, 780, 50)); + tempJuBaoPen.configParams.Add(new BossProbabilityConfigParam(780, 880, 43)); + config.BossConfigs.Probability.Add(tempJuBaoPen); + + var tempJinLong = new BossProbabilityConfig() + { + FishNumber = new List() { "11027" } + }; + tempJinLong.configParams.Add(new BossProbabilityConfigParam(201, 220, 110)); + tempJinLong.configParams.Add(new BossProbabilityConfigParam(221, 239, 102)); + tempJinLong.configParams.Add(new BossProbabilityConfigParam(250, 270, 95)); + tempJinLong.configParams.Add(new BossProbabilityConfigParam(271, 290, 88)); + tempJinLong.configParams.Add(new BossProbabilityConfigParam(291, 310, 83)); + tempJinLong.configParams.Add(new BossProbabilityConfigParam(311, 330, 78)); + tempJinLong.configParams.Add(new BossProbabilityConfigParam(331, 339, 77)); + tempJinLong.configParams.Add(new BossProbabilityConfigParam(350, 360, 75)); + tempJinLong.configParams.Add(new BossProbabilityConfigParam(361, 380, 71)); + tempJinLong.configParams.Add(new BossProbabilityConfigParam(381, 400, 67)); + config.BossConfigs.Probability.Add(tempJinLong); + + var tempZhaDanXie = new BossProbabilityConfig() + { + FishNumber = new List() { "11029" } + }; + tempZhaDanXie.configParams.Add(new BossProbabilityConfigParam(150, 155, 123)); + tempZhaDanXie.configParams.Add(new BossProbabilityConfigParam(156, 160, 116)); + tempZhaDanXie.configParams.Add(new BossProbabilityConfigParam(161, 165, 112)); + tempZhaDanXie.configParams.Add(new BossProbabilityConfigParam(166, 170, 109)); + tempZhaDanXie.configParams.Add(new BossProbabilityConfigParam(171, 175, 106)); + tempZhaDanXie.configParams.Add(new BossProbabilityConfigParam(176, 180, 103)); + tempZhaDanXie.configParams.Add(new BossProbabilityConfigParam(181, 185, 100)); + tempZhaDanXie.configParams.Add(new BossProbabilityConfigParam(186, 190, 97)); + tempZhaDanXie.configParams.Add(new BossProbabilityConfigParam(191, 195, 95)); + tempZhaDanXie.configParams.Add(new BossProbabilityConfigParam(196, 200, 92)); + config.BossConfigs.Probability.Add(tempZhaDanXie); + + var tempPanTao = new BossProbabilityConfig() + { + FishNumber = new List() { "11031" } + }; + tempPanTao.configParams.Add(new BossProbabilityConfigParam(280, 380, 158)); + tempPanTao.configParams.Add(new BossProbabilityConfigParam(380, 480, 125)); + tempPanTao.configParams.Add(new BossProbabilityConfigParam(480, 580, 103)); + tempPanTao.configParams.Add(new BossProbabilityConfigParam(580, 680, 88)); + tempPanTao.configParams.Add(new BossProbabilityConfigParam(680, 780, 77)); + tempPanTao.configParams.Add(new BossProbabilityConfigParam(780, 880, 68)); + config.BossConfigs.Probability.Add(tempPanTao); + + var tempJiGuangXie = new BossProbabilityConfig() + { + FishNumber = new List() { "11032" } + }; + tempJiGuangXie.configParams.Add(new BossProbabilityConfigParam(150, 155, 123)); + tempJiGuangXie.configParams.Add(new BossProbabilityConfigParam(156, 160, 116)); + tempJiGuangXie.configParams.Add(new BossProbabilityConfigParam(161, 165, 112)); + tempJiGuangXie.configParams.Add(new BossProbabilityConfigParam(166, 170, 109)); + tempJiGuangXie.configParams.Add(new BossProbabilityConfigParam(171, 175, 106)); + tempJiGuangXie.configParams.Add(new BossProbabilityConfigParam(176, 180, 103)); + tempJiGuangXie.configParams.Add(new BossProbabilityConfigParam(181, 185, 100)); + tempJiGuangXie.configParams.Add(new BossProbabilityConfigParam(186, 190, 97)); + tempJiGuangXie.configParams.Add(new BossProbabilityConfigParam(191, 195, 95)); + tempJiGuangXie.configParams.Add(new BossProbabilityConfigParam(196, 200, 92)); + config.BossConfigs.Probability.Add(tempJiGuangXie); + + var tempZuanTouXie = new BossProbabilityConfig() + { + FishNumber = new List() { "11033" } + }; + tempZuanTouXie.configParams.Add(new BossProbabilityConfigParam(150, 155, 123)); + tempZuanTouXie.configParams.Add(new BossProbabilityConfigParam(156, 160, 116)); + tempZuanTouXie.configParams.Add(new BossProbabilityConfigParam(161, 165, 112)); + tempZuanTouXie.configParams.Add(new BossProbabilityConfigParam(166, 170, 109)); + tempZuanTouXie.configParams.Add(new BossProbabilityConfigParam(171, 175, 106)); + tempZuanTouXie.configParams.Add(new BossProbabilityConfigParam(176, 180, 103)); + tempZuanTouXie.configParams.Add(new BossProbabilityConfigParam(181, 185, 100)); + tempZuanTouXie.configParams.Add(new BossProbabilityConfigParam(186, 190, 97)); + tempZuanTouXie.configParams.Add(new BossProbabilityConfigParam(191, 195, 95)); + tempZuanTouXie.configParams.Add(new BossProbabilityConfigParam(196, 200, 92)); + config.BossConfigs.Probability.Add(tempZuanTouXie); + + var tempZhanShen = new BossProbabilityConfig() + { + FishNumber = new List() { "15090" } + }; + tempZhanShen.configParams.Add(new BossProbabilityConfigParam(150, 160, 200)); + tempZhanShen.configParams.Add(new BossProbabilityConfigParam(161, 170, 185)); + tempZhanShen.configParams.Add(new BossProbabilityConfigParam(171, 180, 170)); + tempZhanShen.configParams.Add(new BossProbabilityConfigParam(181, 190, 160)); + tempZhanShen.configParams.Add(new BossProbabilityConfigParam(191, 200, 150)); + tempZhanShen.configParams.Add(new BossProbabilityConfigParam(201, 210, 140)); + tempZhanShen.configParams.Add(new BossProbabilityConfigParam(210, 220, 130)); + tempZhanShen.configParams.Add(new BossProbabilityConfigParam(221, 230, 120)); + config.BossConfigs.Probability.Add(tempZhanShen); + + var tempYinYang = new BossProbabilityConfig() + { + FishNumber = new List() { "15091" } + }; + tempYinYang.configParams.Add(new BossProbabilityConfigParam(160, 170, 115)); + tempYinYang.configParams.Add(new BossProbabilityConfigParam(171, 180, 108)); + tempYinYang.configParams.Add(new BossProbabilityConfigParam(181, 190, 102)); + tempYinYang.configParams.Add(new BossProbabilityConfigParam(191, 200, 95)); + tempYinYang.configParams.Add(new BossProbabilityConfigParam(201, 210, 89)); + tempYinYang.configParams.Add(new BossProbabilityConfigParam(211, 220, 83)); + tempYinYang.configParams.Add(new BossProbabilityConfigParam(221, 230, 78)); + tempYinYang.configParams.Add(new BossProbabilityConfigParam(231, 240, 74)); + config.BossConfigs.Probability.Add(tempYinYang); + + var tempLeiShen = new BossProbabilityConfig() + { + FishNumber = new List() { "15092" } + }; + tempLeiShen.configParams.Add(new BossProbabilityConfigParam(181, 190, 105)); + tempLeiShen.configParams.Add(new BossProbabilityConfigParam(191, 200, 100)); + tempLeiShen.configParams.Add(new BossProbabilityConfigParam(201, 210, 95)); + tempLeiShen.configParams.Add(new BossProbabilityConfigParam(211, 220, 91)); + tempLeiShen.configParams.Add(new BossProbabilityConfigParam(221, 230, 87)); + tempLeiShen.configParams.Add(new BossProbabilityConfigParam(231, 240, 83)); + tempLeiShen.configParams.Add(new BossProbabilityConfigParam(241, 250, 80)); + tempLeiShen.configParams.Add(new BossProbabilityConfigParam(251, 260, 77)); + tempLeiShen.configParams.Add(new BossProbabilityConfigParam(261, 270, 74)); + tempLeiShen.configParams.Add(new BossProbabilityConfigParam(271, 280, 71)); + config.BossConfigs.Probability.Add(tempLeiShen); + + var tempSiFen = new BossProbabilityConfig() + { + FishNumber = new List() { "15093" } + }; + tempSiFen.configParams.Add(new BossProbabilityConfigParam(191, 200, 108)); + tempSiFen.configParams.Add(new BossProbabilityConfigParam(201, 210, 103)); + tempSiFen.configParams.Add(new BossProbabilityConfigParam(211, 220, 98)); + tempSiFen.configParams.Add(new BossProbabilityConfigParam(221, 230, 94)); + tempSiFen.configParams.Add(new BossProbabilityConfigParam(231, 240, 90)); + tempSiFen.configParams.Add(new BossProbabilityConfigParam(251, 260, 83)); + tempSiFen.configParams.Add(new BossProbabilityConfigParam(261, 270, 80)); + tempSiFen.configParams.Add(new BossProbabilityConfigParam(271, 280, 77)); + tempSiFen.configParams.Add(new BossProbabilityConfigParam(281, 290, 75)); + tempSiFen.configParams.Add(new BossProbabilityConfigParam(291, 300, 72)); + config.BossConfigs.Probability.Add(tempSiFen); + + var tempDaLi = new BossProbabilityConfig() + { + FishNumber = new List() { "15094" } + }; + tempDaLi.configParams.Add(new BossProbabilityConfigParam(250, 270, 111)); + tempDaLi.configParams.Add(new BossProbabilityConfigParam(271, 290, 103)); + tempDaLi.configParams.Add(new BossProbabilityConfigParam(291, 310, 96)); + tempDaLi.configParams.Add(new BossProbabilityConfigParam(311, 330, 90)); + tempDaLi.configParams.Add(new BossProbabilityConfigParam(331, 350, 89)); + tempDaLi.configParams.Add(new BossProbabilityConfigParam(351, 360, 86)); + tempDaLi.configParams.Add(new BossProbabilityConfigParam(361, 380, 81)); + tempDaLi.configParams.Add(new BossProbabilityConfigParam(381, 400, 77)); + config.BossConfigs.Probability.Add(tempDaLi); + + var tempLiWu = new BossProbabilityConfig() + { + FishNumber = new List() { "15095" } + }; + tempLiWu.configParams.Add(new BossProbabilityConfigParam(280, 380, 100)); + tempLiWu.configParams.Add(new BossProbabilityConfigParam(380, 480, 80)); + tempLiWu.configParams.Add(new BossProbabilityConfigParam(480, 580, 67)); + tempLiWu.configParams.Add(new BossProbabilityConfigParam(580, 680, 57)); + tempLiWu.configParams.Add(new BossProbabilityConfigParam(680, 780, 50)); + tempLiWu.configParams.Add(new BossProbabilityConfigParam(780, 880, 43)); + config.BossConfigs.Probability.Add(tempLiWu); + + var tempQiShi = new BossProbabilityConfig() + { + FishNumber = new List() { "15096" } + }; + tempQiShi.configParams.Add(new BossProbabilityConfigParam(320, 420, 100)); + tempQiShi.configParams.Add(new BossProbabilityConfigParam(421, 520, 81)); + tempQiShi.configParams.Add(new BossProbabilityConfigParam(521, 620, 67)); + tempQiShi.configParams.Add(new BossProbabilityConfigParam(621, 720, 57)); + tempQiShi.configParams.Add(new BossProbabilityConfigParam(721, 820, 50)); + tempQiShi.configParams.Add(new BossProbabilityConfigParam(821, 920, 43)); + config.BossConfigs.Probability.Add(tempQiShi); + + var tempALa = new BossProbabilityConfig() + { + FishNumber = new List() { "15097" } + }; + tempALa.configParams.Add(new BossProbabilityConfigParam(360, 400, 100)); + tempALa.configParams.Add(new BossProbabilityConfigParam(401, 460, 87)); + tempALa.configParams.Add(new BossProbabilityConfigParam(461, 500, 77)); + tempALa.configParams.Add(new BossProbabilityConfigParam(501, 560, 69)); + tempALa.configParams.Add(new BossProbabilityConfigParam(601, 660, 61)); + tempALa.configParams.Add(new BossProbabilityConfigParam(661, 700, 56)); + tempALa.configParams.Add(new BossProbabilityConfigParam(701, 760, 52)); + tempALa.configParams.Add(new BossProbabilityConfigParam(761, 800, 48)); + tempALa.configParams.Add(new BossProbabilityConfigParam(801, 900, 44)); + tempALa.configParams.Add(new BossProbabilityConfigParam(901, 980, 41)); + config.BossConfigs.Probability.Add(tempALa); + + var tempKuLou = new BossProbabilityConfig() + { + FishNumber = new List() { "15098" } + }; + tempKuLou.configParams.Add(new BossProbabilityConfigParam(360, 400, 100)); + tempKuLou.configParams.Add(new BossProbabilityConfigParam(401, 460, 87)); + tempKuLou.configParams.Add(new BossProbabilityConfigParam(461, 500, 77)); + tempKuLou.configParams.Add(new BossProbabilityConfigParam(501, 560, 69)); + tempKuLou.configParams.Add(new BossProbabilityConfigParam(601, 660, 61)); + tempKuLou.configParams.Add(new BossProbabilityConfigParam(661, 700, 56)); + tempKuLou.configParams.Add(new BossProbabilityConfigParam(701, 760, 52)); + tempKuLou.configParams.Add(new BossProbabilityConfigParam(761, 800, 48)); + tempKuLou.configParams.Add(new BossProbabilityConfigParam(801, 900, 44)); + tempKuLou.configParams.Add(new BossProbabilityConfigParam(901, 980, 41)); + config.BossConfigs.Probability.Add(tempKuLou); + + var tempBoShi = new BossProbabilityConfig() + { + FishNumber = new List() { "15099" } + }; + tempBoShi.configParams.Add(new BossProbabilityConfigParam(380, 480, 100)); + tempBoShi.configParams.Add(new BossProbabilityConfigParam(481, 580, 83)); + tempBoShi.configParams.Add(new BossProbabilityConfigParam(581, 680, 69)); + tempBoShi.configParams.Add(new BossProbabilityConfigParam(681, 780, 58)); + tempBoShi.configParams.Add(new BossProbabilityConfigParam(781, 880, 51)); + tempBoShi.configParams.Add(new BossProbabilityConfigParam(881, 980, 45)); + tempBoShi.configParams.Add(new BossProbabilityConfigParam(981, 1080, 41)); + config.BossConfigs.Probability.Add(tempBoShi); + + { + var tempObjShenLong = new LuckDragonConfig() + { + FishNumber = new List() { "11028" } + }; + tempObjShenLong.OuterConfig.Add(new BossProbabilityConfigParam(200, 200, 1)); + tempObjShenLong.OuterConfig.Add(new BossProbabilityConfigParam(250, 250, 1)); + tempObjShenLong.OuterConfig.Add(new BossProbabilityConfigParam(300, 300, 1)); + tempObjShenLong.OuterConfig.Add(new BossProbabilityConfigParam(350, 350, 1)); + tempObjShenLong.OuterConfig.Add(new BossProbabilityConfigParam(400, 400, 1)); + tempObjShenLong.OuterConfig.Add(new BossProbabilityConfigParam(450, 450, 1)); + tempObjShenLong.OuterConfig.Add(new BossProbabilityConfigParam(500, 500, 1)); + tempObjShenLong.OuterConfig.Add(new BossProbabilityConfigParam(-1, -1, 612)); + + + tempObjShenLong.MiddleConfig.Add(new BossProbabilityConfigParam(300, 300, 1)); + tempObjShenLong.MiddleConfig.Add(new BossProbabilityConfigParam(400, 400, 1)); + tempObjShenLong.MiddleConfig.Add(new BossProbabilityConfigParam(500, 500, 1)); + tempObjShenLong.MiddleConfig.Add(new BossProbabilityConfigParam(800, 800, 1)); + tempObjShenLong.MiddleConfig.Add(new BossProbabilityConfigParam(1000, 1000, 1)); + tempObjShenLong.MiddleConfig.Add(new BossProbabilityConfigParam(-1, -1, 1)); + + + tempObjShenLong.InnerConfig.Add(new BossProbabilityConfigParam(10000, 10000, 1)); + tempObjShenLong.InnerConfig.Add(new BossProbabilityConfigParam(20000, 20000, 1)); + tempObjShenLong.InnerConfig.Add(new BossProbabilityConfigParam(-1, -1, 0)); + + config.BossConfigs.LuckDragon.Add(tempObjShenLong); + } + + } + + + config.BossConfigs.InterstellarCruise.FishNumber.Add("12029"); + + config.BossConfigs.InterstellarCruise.CountConfig.Add(new CruiseConfigCount() { Count = 1, TriggerRate = 60, KillRate = 50 }); + config.BossConfigs.InterstellarCruise.CountConfig.Add(new CruiseConfigCount() { Count = 2, TriggerRate = 30, KillRate = 35 }); + config.BossConfigs.InterstellarCruise.CountConfig.Add(new CruiseConfigCount() { Count = 3, TriggerRate = 10, KillRate = 15 }); + + var icDeathConfigs = config.BossConfigs.InterstellarCruise.DeathConfigs; + icDeathConfigs.Add(new List() + { + new BossProbabilityConfigParam(50, 70, 60), + new BossProbabilityConfigParam(71, 90, 30), + new BossProbabilityConfigParam(91, 110, 10), + new BossProbabilityConfigParam(171, 190, 79), + new BossProbabilityConfigParam(191, 210, 71) + }); + icDeathConfigs.Add(new List() + { + new BossProbabilityConfigParam(110, 130, 138), + new BossProbabilityConfigParam(131, 150, 120), + new BossProbabilityConfigParam(151, 170, 106), + new BossProbabilityConfigParam(171, 190, 95), + new BossProbabilityConfigParam(191, 210, 86), + new BossProbabilityConfigParam(211, 220, 81), + new BossProbabilityConfigParam(221, 230, 78) + }); + icDeathConfigs.Add(new List() + { + new BossProbabilityConfigParam(150, 160, 125), + new BossProbabilityConfigParam(161, 170, 118), + new BossProbabilityConfigParam(171, 180, 111), + new BossProbabilityConfigParam(181, 190, 105), + new BossProbabilityConfigParam(191, 200, 100), + new BossProbabilityConfigParam(201, 210, 95), + new BossProbabilityConfigParam(210, 220, 91), + new BossProbabilityConfigParam(221, 230, 87) + }); + + + + + // 1. + config.BossConfigs.FlameStorm.FishNumber.Add("12034"); + + config.BossConfigs.FlameStorm.CountConfig.Add(new CruiseConfigCount() { Count = 1, TriggerRate = 60, KillRate = 60 }); + config.BossConfigs.FlameStorm.CountConfig.Add(new CruiseConfigCount() { Count = 2, TriggerRate = 30, KillRate = 40 }); + + var fsDeathConfigs = config.BossConfigs.FlameStorm.DeathConfigs; + fsDeathConfigs.Add(new List() + { + new BossProbabilityConfigParam(150, 160, 100), + new BossProbabilityConfigParam(161, 170, 94), + new BossProbabilityConfigParam(171, 180, 89), + new BossProbabilityConfigParam(181, 190, 84), + new BossProbabilityConfigParam(191, 200, 80), + new BossProbabilityConfigParam(201, 210, 76), + new BossProbabilityConfigParam(210, 220, 73), + new BossProbabilityConfigParam(221, 230, 69) + }); + fsDeathConfigs.Add(new List() + { + new BossProbabilityConfigParam(150, 160, 100), + new BossProbabilityConfigParam(161, 170, 94), + new BossProbabilityConfigParam(171, 180, 89), + new BossProbabilityConfigParam(181, 190, 84), + new BossProbabilityConfigParam(191, 200, 80), + new BossProbabilityConfigParam(201, 210, 76), + new BossProbabilityConfigParam(210, 220, 73), + new BossProbabilityConfigParam(221, 230, 69) + }); + + + + + + + + // 1. + config.BossConfigs.Bomb.FishNumber.Add("12030"); + + config.BossConfigs.Bomb.CountConfig.Add(new CruiseConfigCount() { Count = 1, TriggerRate = 60, KillRate = 70 }); + config.BossConfigs.Bomb.CountConfig.Add(new CruiseConfigCount() { Count = 2, TriggerRate = 30, KillRate = 30 }); + + + config.BossConfigs.Bomb.OneDeathConfig.Add(new BossProbabilityConfigParam(360, 400, 100)); + config.BossConfigs.Bomb.OneDeathConfig.Add(new BossProbabilityConfigParam(401, 460, 94)); + config.BossConfigs.Bomb.OneDeathConfig.Add(new BossProbabilityConfigParam(461, 500, 89)); + config.BossConfigs.Bomb.OneDeathConfig.Add(new BossProbabilityConfigParam(501, 560, 84)); + config.BossConfigs.Bomb.OneDeathConfig.Add(new BossProbabilityConfigParam(601, 660, 76)); + config.BossConfigs.Bomb.OneDeathConfig.Add(new BossProbabilityConfigParam(661, 700, 73)); + config.BossConfigs.Bomb.OneDeathConfig.Add(new BossProbabilityConfigParam(701, 760, 70)); + config.BossConfigs.Bomb.OneDeathConfig.Add(new BossProbabilityConfigParam(761, 800, 67)); + config.BossConfigs.Bomb.OneDeathConfig.Add(new BossProbabilityConfigParam(801, 900, 63)); + config.BossConfigs.Bomb.OneDeathConfig.Add(new BossProbabilityConfigParam(901, 980, 59)); + + config.BossConfigs.Bomb.TwoDeathConfig.Add(new BossProbabilityConfigParam(360, 400, 100)); + config.BossConfigs.Bomb.TwoDeathConfig.Add(new BossProbabilityConfigParam(401, 460, 87)); + config.BossConfigs.Bomb.TwoDeathConfig.Add(new BossProbabilityConfigParam(461, 500, 77)); + config.BossConfigs.Bomb.TwoDeathConfig.Add(new BossProbabilityConfigParam(501, 560, 69)); + config.BossConfigs.Bomb.TwoDeathConfig.Add(new BossProbabilityConfigParam(601, 660, 61)); + config.BossConfigs.Bomb.TwoDeathConfig.Add(new BossProbabilityConfigParam(661, 700, 56)); + config.BossConfigs.Bomb.TwoDeathConfig.Add(new BossProbabilityConfigParam(701, 760, 52)); + config.BossConfigs.Bomb.TwoDeathConfig.Add(new BossProbabilityConfigParam(761, 800, 48)); + config.BossConfigs.Bomb.TwoDeathConfig.Add(new BossProbabilityConfigParam(801, 900, 44)); + config.BossConfigs.Bomb.TwoDeathConfig.Add(new BossProbabilityConfigParam(901, 980, 41)); + + + + + + + + // 1. + config.BossConfigs.Scorpion.FishNumber.Add("12028"); + + config.BossConfigs.Scorpion.CompositeMultiplier = 650; + + config.BossConfigs.Scorpion.ItemCountConfig.Add(new ScorpionItemCountConfig() { Count = 1, Weight = 90 }); + config.BossConfigs.Scorpion.ItemCountConfig.Add(new ScorpionItemCountConfig() { Count = 2, Weight = 80 }); + config.BossConfigs.Scorpion.ItemCountConfig.Add(new ScorpionItemCountConfig() { Count = 3, Weight = 70 }); + config.BossConfigs.Scorpion.ItemCountConfig.Add(new ScorpionItemCountConfig() { Count = 4, Weight = 60 }); + config.BossConfigs.Scorpion.ItemCountConfig.Add(new ScorpionItemCountConfig() { Count = 5, Weight = 50 }); + config.BossConfigs.Scorpion.ItemCountConfig.Add(new ScorpionItemCountConfig() { Count = 6, Weight = 40 }); + config.BossConfigs.Scorpion.ItemCountConfig.Add(new ScorpionItemCountConfig() { Count = 7, Weight = 30 }); + config.BossConfigs.Scorpion.ItemCountConfig.Add(new ScorpionItemCountConfig() { Count = 8, Weight = 20 }); + config.BossConfigs.Scorpion.ItemCountConfig.Add(new ScorpionItemCountConfig() { Count = 9, Weight = 10 }); + + config.BossConfigs.Scorpion.ItemConfig.Add(new ScorpionItemConfig() { PropNumber = "50001", Count = 3, Weight = 100 }); + config.BossConfigs.Scorpion.ItemConfig.Add(new ScorpionItemConfig() { PropNumber = "50002", Count = 3, Weight = 82 }); + config.BossConfigs.Scorpion.ItemConfig.Add(new ScorpionItemConfig() { PropNumber = "50003", Count = 3, Weight = 72 }); + config.BossConfigs.Scorpion.ItemConfig.Add(new ScorpionItemConfig() { PropNumber = "50004", Count = 3, Weight = 67 }); + config.BossConfigs.Scorpion.ItemConfig.Add(new ScorpionItemConfig() { PropNumber = "50005", Count = 3, Weight = 62 }); + config.BossConfigs.Scorpion.ItemConfig.Add(new ScorpionItemConfig() { PropNumber = "50006", Count = 3, Weight = 58 }); + + config.BossConfigs.Scorpion.GoldConfig.Add(new BossProbabilityConfigParam(420, 450, 100)); + config.BossConfigs.Scorpion.GoldConfig.Add(new BossProbabilityConfigParam(451, 550, 82)); + config.BossConfigs.Scorpion.GoldConfig.Add(new BossProbabilityConfigParam(551, 600, 72)); + config.BossConfigs.Scorpion.GoldConfig.Add(new BossProbabilityConfigParam(601, 650, 67)); + config.BossConfigs.Scorpion.GoldConfig.Add(new BossProbabilityConfigParam(651, 700, 62)); + config.BossConfigs.Scorpion.GoldConfig.Add(new BossProbabilityConfigParam(701, 750, 58)); + config.BossConfigs.Scorpion.GoldConfig.Add(new BossProbabilityConfigParam(751, 800, 54)); + config.BossConfigs.Scorpion.GoldConfig.Add(new BossProbabilityConfigParam(801, 900, 48)); + config.BossConfigs.Scorpion.GoldConfig.Add(new BossProbabilityConfigParam(901, 1000, 43)); + config.BossConfigs.Scorpion.GoldConfig.Add(new BossProbabilityConfigParam(1001, 1100, 39)); + + + + + config.ScratchCardConfig.Add(new ScratchCardConfig() { Type = 1, Count = 5000, Weight = 2500 }); + config.ScratchCardConfig.Add(new ScratchCardConfig() { Type = 1, Count = 10000, Weight = 2000 }); + config.ScratchCardConfig.Add(new ScratchCardConfig() { Type = 1, Count = 50000, Weight = 1000 }); + config.ScratchCardConfig.Add(new ScratchCardConfig() { Type = 1, Count = 100000, Weight = 500 }); + config.ScratchCardConfig.Add(new ScratchCardConfig() { Type = 1, Count = 500000, Weight = 100 }); + config.ScratchCardConfig.Add(new ScratchCardConfig() { Type = 1, Count = 1000000, Weight = 20 }); + config.ScratchCardConfig.Add(new ScratchCardConfig() { Type = 2, Count = 10, Weight = 2000 }); + config.ScratchCardConfig.Add(new ScratchCardConfig() { Type = 2, Count = 50, Weight = 800 }); + config.ScratchCardConfig.Add(new ScratchCardConfig() { Type = 2, Count = 100, Weight = 300 }); + config.ScratchCardConfig.Add(new ScratchCardConfig() { Type = 2, Count = 500, Weight = 50 }); + config.ScratchCardConfig.Add(new ScratchCardConfig() { Type = 3, Count = 1, Weight = 500, BaseProduct = config.PropConfig.FirstOrDefault(c => c.Number == "40006") }); + config.ScratchCardConfig.Add(new ScratchCardConfig() { Type = 3, Count = 1, Weight = 300, BaseProduct = config.PropConfig.FirstOrDefault(c => c.Number == "40002") }); + config.ScratchCardConfig.Add(new ScratchCardConfig() { Type = 3, Count = 1, Weight = 300, BaseProduct = config.PropConfig.FirstOrDefault(c => c.Number == "40004") }); + config.ScratchCardConfig.Add(new ScratchCardConfig() { Type = 3, Count = 1, Weight = 300, BaseProduct = config.PropConfig.FirstOrDefault(c => c.Number == "40003") }); + config.ScratchCardConfig.Add(new ScratchCardConfig() { Type = 3, Count = 1, Weight = 200, BaseProduct = config.PropConfig.FirstOrDefault(c => c.Number == "40001") }); + + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20031", RoomName = "象棋场", GameType = GameTypeEnum.中国象棋, RoomLevel = 1, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 100000 }); + + config.ChessConfig = new ChessConfig() { + + BetGoldLimits=new List() { 100000,200000,500000,1000000,2000000,5000000}, + MinBetGold=10000, + CreateRoomLimit=new List() {2 }, + CreateRoomVipLevels = new List() + }; + config.FishRoomConfig = new FishRoomConfig() + { + SeatSelectLimit = new List() { 1, 2 }, + SeatSelectVipLevels = new List() + }; + + foreach (var fish in config.FishTypeConfigs) + { + fish.FishImage = fish.FishNumber + ".png"; + if (fish.FishType == FishTypeEnum.Boss鱼 || fish.FishType == FishTypeEnum.特殊Boss) + fish.FishMultipleDesc = $"最高{fish.FishScore}倍"; + else + fish.FishMultipleDesc = $"{fish.FishScore}倍"; + } + + EnrichProductData(config, config.PropConfig); + + config.RobotKillConfig = new RobotKillConfig + { + IsEnabled = true, + IntervalSeconds = 5, + Scenes = GetDefaultRobotKillScenes() + }; + + var res = await _gameConfigService.Update(config); + if (res.isok) + { + await _gameConfigService.InitRoom(GameTypeEnum.None, 0, config); + + var rooms = new List(); + var chessRoomConfigs = config.RoomConfigs.Where(c => c.GameType == GameTypeEnum.中国象棋).ToList(); + foreach (var roomConfig in chessRoomConfigs) + { + for (int y = 1; y <= roomConfig.RoomPartitionNum; y++) + { + for (int i = 0; i < roomConfig.RoomCount; i++) + { + var room = new ChessGameRoom + { + RoomId = $"{(int)GameTypeEnum.中国象棋}{y}{i.ToString("00")}", + state = 0, + CreateTime = DateTime.Now, + createUserId = "", + gameType = 0, + gold = roomConfig.RoomGoldLimit, + Id = Guid.NewGuid().ToString(), + password = "", + users = new List(), + EndGameRequests = new Dictionary(), + LastActiveTime = 0, + TimeoutSeconds = 60, + robotCount = 0 + }; + + _redisService.SetChessRoom(room); + rooms.Add(room); + } + } + } + } + + try + { + var json = global::System.Text.Json.JsonSerializer.Serialize(config, new global::System.Text.Json.JsonSerializerOptions { WriteIndented = true, Encoder = global::System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping }); + await global::System.IO.File.WriteAllTextAsync(jsonPath, json); + } + catch (Exception ex) + { + Console.Error.WriteLine($"写入 gameconfig.json 失败: {ex.Message}"); + } + } + + private async STT.Task InitActivityConfigInternal(IActivityConfigService activityConfigService) + { + var jsonPath = global::System.IO.Path.Combine(AppContext.BaseDirectory, "Config", "activityconfig.json"); + if (global::System.IO.File.Exists(jsonPath)) + { + try + { + var json = await global::System.IO.File.ReadAllTextAsync(jsonPath); + var cfg = global::System.Text.Json.JsonSerializer.Deserialize(json, new global::System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true, ReadCommentHandling = global::System.Text.Json.JsonCommentHandling.Skip }); + if (cfg != null) + { + var gc1 = _redisService.GetGameConfig(); + var propDict1 = gc1?.PropConfig?.ToDictionary(p => p.Number, p => p) ?? new Dictionary(); + PropInfConfig? Prop1(string num) => propDict1.TryGetValue(num, out var p) ? p : null; + if (cfg.BattleOrderConfig?.LevelConfig != null) + { + + } + await activityConfigService.Delete(); + await activityConfigService.Update(cfg); + return; + } + } + catch (Exception ex) + { + Console.Error.WriteLine($"activityconfig.json 加载失败,回退到代码初始化: {ex.Message}"); + } + } + + await activityConfigService.Delete(); + + var config = new ActivityConfig(); + + config.SignConfigs.Add(new SignConfig() { Order = 70000, Gold = 2000, Name = "2千", Icon = "/uploads/70000.png", Probability = 0.01 }); + config.SignConfigs.Add(new SignConfig() { Order = 70001, Gold = 800, Name = "8佰", Icon = "/uploads/70001.png", Probability = 0.09 }); + config.SignConfigs.Add(new SignConfig() { Order = 70002, Gold = 400, Name = "4佰", Icon = "/uploads/70002.png", Probability = 0.09 }); + config.SignConfigs.Add(new SignConfig() { Order = 70003, Gold = 200, Name = "2佰", Icon = "/uploads/70003.png", Probability = 0.05 }); + config.SignConfigs.Add(new SignConfig() { Order = 70004, Gold = 1000, Name = "1千", Icon = "/uploads/70004.png", Probability = 0.05 }); + config.SignConfigs.Add(new SignConfig() { Order = 70005, Gold = 800, Name = "8佰", Icon = "/uploads/70005.png", Probability = 0.09 }); + config.SignConfigs.Add(new SignConfig() { Order = 70006, Gold = 400, Name = "4佰", Icon = "/uploads/70006.png", Probability = 0.09 }); + config.SignConfigs.Add(new SignConfig() { Order = 70007, Gold = 200, Name = "2佰", Icon = "/uploads/70007.png", Probability = 0.05 }); + config.SignConfigs.Add(new SignConfig() { Order = 70008, Gold = 2000, Name = "2千", Icon = "/uploads/70008.png", Probability = 0.01 }); + config.SignConfigs.Add(new SignConfig() { Order = 70009, Gold = 1000, Name = "1千", Icon = "/uploads/70009.png", Probability = 0.05 }); + config.SignConfigs.Add(new SignConfig() { Order = 70010, Gold = 400, Name = "4佰", Icon = "/uploads/70010.png", Probability = 0.09 }); + config.SignConfigs.Add(new SignConfig() { Order = 70011, Gold = 200, Name = "2佰", Icon = "/uploads/70011.png", Probability = 0.05 }); + config.SignConfigs.Add(new SignConfig() { Order = 70012, Gold = 800, Name = "8佰", Icon = "/uploads/70012.png", Probability = 0.09 }); + config.SignConfigs.Add(new SignConfig() { Order = 70013, Gold = 1000, Name = "1千", Icon = "/uploads/70013.png", Probability = 0.05 }); + config.SignConfigs.Add(new SignConfig() { Order = 70014, Gold = 400, Name = "4佰", Icon = "/uploads/70014.png", Probability = 0.09 }); + config.SignConfigs.Add(new SignConfig() { Order = 70015, Gold = 200, Name = "2佰", Icon = "/uploads/70015.png", Probability = 0.05 }); + + config.ReliefConfig = new ReliefConfig() { IsOpen = true, Count = 3, Gold = 100000, Limit = 10000 }; + + config.GoldShopConfigs.Add(new GoldShopConfig() { Number = "70001", Name = "100万金币", Gold = 1000000, Diamond = 100, Icon = "/uploads/70001.png" }); + config.GoldShopConfigs.Add(new GoldShopConfig() { Number = "70002", Name = "500万金币", Gold = 5000000, Diamond = 500, Icon = "/uploads/70002.png" }); + config.GoldShopConfigs.Add(new GoldShopConfig() { Number = "70003", Name = "1000万金币", Gold = 10000000, Diamond = 1000, Icon = "/uploads/70003.png" }); + config.GoldShopConfigs.Add(new GoldShopConfig() { Number = "70004", Name = "2000万金币", Gold = 20000000, Diamond = 2000, Icon = "/uploads/70004.png" }); + config.GoldShopConfigs.Add(new GoldShopConfig() { Number = "70005", Name = "5000万金币", Gold = 50000000, Diamond = 5000, Icon = "/uploads/70005.png" }); + config.GoldShopConfigs.Add(new GoldShopConfig() { Number = "70006", Name = "1亿金币", Gold = 100000000, Diamond = 10000, Icon = "/uploads/70006.png" }); + + config.DiamondShopConfigs.Add(new DiamondShopConfig() { Number = "80001", Name = "100钻石", Diamond = 100, Money = 1, Icon = "/uploads/80001.png" }); + config.DiamondShopConfigs.Add(new DiamondShopConfig() { Number = "80002", Name = "500钻石", Diamond = 500, Money = 5, Icon = "/uploads/80002.png" }); + config.DiamondShopConfigs.Add(new DiamondShopConfig() { Number = "80003", Name = "1000钻石", Diamond = 1000, Money = 10, Icon = "/uploads/80003.png" }); + config.DiamondShopConfigs.Add(new DiamondShopConfig() { Number = "80004", Name = "2000钻石", Diamond = 2000, Money = 20, Icon = "/uploads/80004.png" }); + config.DiamondShopConfigs.Add(new DiamondShopConfig() { Number = "80005", Name = "5000钻石", Diamond = 5000, Money = 50, Icon = "/uploads/80005.png" }); + config.DiamondShopConfigs.Add(new DiamondShopConfig() { Number = "80006", Name = "10000钻石", Diamond = 10000, Money = 100, Icon = "/uploads/80006.png" }); + + config.RegisterConfig = new RegisterConfig() + { + InitGold = 10000, + InitDiamond = 100, + InitProductList = new List + { + new BaseProductCount { Number = "11001", Type = ProductTypeEnum.炮台, Name = "深海之眼", Count = 1 } + } + }; + + config.FishingReturnConfig = new FishingReturnConfig() { IsEnabled = false, ReturnRate = 0.001, DailyMaxReturn = 0 }; + + config.BattleOrderConfig.IsOpen = true; + config.BattleOrderConfig.EndTime = new DateTimeOffset(DateTime.Now.AddDays(30)).ToUnixTimeSeconds(); + config.BattleOrderConfig.RuleDesc = "完成每日任务获得战令经验,升级领取奖励"; + config.BattleOrderConfig.BuyDesc = "购买战令等级,快速提升战力"; + config.BattleOrderConfig.AdvanceGiftDesc = "购买进阶获得更多豪华奖励"; + + config.BattleOrderConfig.LevelConfig = new List(); + + for (int i = 1; i <= 100; i++) + { + GiftConfig normal, luxury, supreme; + + if (i == 100) + { + normal = new GiftConfig { Type = 3, Count = 1, OtherId = "11032" }; + luxury = new GiftConfig { Type = 3, Count = 1, OtherId = "12019" }; + supreme = new GiftConfig { Type = 1, Count = 300000 }; + } + else if (i == 57) + { + normal = new GiftConfig { Type = 3, Count = 1, OtherId = "40005" }; + luxury = new GiftConfig { Type = 3, Count = 2, OtherId = "40005" }; + supreme = new GiftConfig { Type = 3, Count = 3, OtherId = "40005" }; + } + else + { + var mod = (i - 1) % 8; + switch (mod) + { + case 0: case 1: case 2: + normal = new GiftConfig { Type = 1, Count = 100000 }; + luxury = new GiftConfig { Type = 1, Count = 200000 }; + supreme = new GiftConfig { Type = 1, Count = 300000 }; + break; + case 3: + normal = new GiftConfig { Type = 3, Count = 5, OtherId = "40004" }; + luxury = new GiftConfig { Type = 3, Count = 10, OtherId = "40004" }; + supreme = new GiftConfig { Type = 3, Count = 15, OtherId = "40004" }; + break; + case 4: + normal = new GiftConfig { Type = 3, Count = 5, OtherId = "40003" }; + luxury = new GiftConfig { Type = 3, Count = 10, OtherId = "40003" }; + supreme = new GiftConfig { Type = 3, Count = 15, OtherId = "40003" }; + break; + case 5: + normal = new GiftConfig { Type = 3, Count = 1, OtherId = "40006" }; + luxury = new GiftConfig { Type = 3, Count = 2, OtherId = "40006" }; + supreme = new GiftConfig { Type = 3, Count = 3, OtherId = "40006" }; + break; + case 6: + normal = new GiftConfig { Type = 2, Count = 3 }; + luxury = new GiftConfig { Type = 2, Count = 5 }; + supreme = new GiftConfig { Type = 2, Count = 8 }; + break; + default: + normal = new GiftConfig { Type = 3, Count = 5, OtherId = "16015" }; + luxury = new GiftConfig { Type = 3, Count = 5, OtherId = "17031" }; + supreme = new GiftConfig { Type = 1, Count = 1000000 }; + break; + } + } + + config.BattleOrderConfig.LevelConfig.Add(new BattleOrderConfig.BattleOrderLevelConfig + { + Level = i, + Exp = i * 100, + NormalGiftList = new List { normal }, + LuxuryGiftList = new List { luxury }, + SupremeGiftList = new List { supreme }, + PayType = 1, + PayCount = i * 100 + }); + } + + config.BattleOrderConfig.AdvanceGift = new List + { + new BattleOrderConfig.AdvanceGiftConfig + { + Type = 1, + Name = "豪华战令", + Count = 100, + PayType = 1, + PayCount = 1000000, + GiftList = new List { new GiftConfig() { Type = 1, Count = 1000 }, new GiftConfig() { Type = 3, Count = 5, OtherId = "碎片" } } + }, + new BattleOrderConfig.AdvanceGiftConfig + { + Type = 2, + Name = "至尊战令", + Count = 100, + PayType = 2, + PayCount = 10000, + GiftList = new List { new GiftConfig() { Type = 1, Count = 1000 }, new GiftConfig() { Type = 3, Count = 6, OtherId = "碎片" } } + }, + new BattleOrderConfig.AdvanceGiftConfig + { + Type = 3, + Name = "豪华+至尊战令", + Count = 200, + PayType = 3, + PayCount = 1000, + GiftList = new List { new GiftConfig() { Type = 1, Count = 1000 }, new GiftConfig() { Type = 3, Count = 7, OtherId = "碎片" } } + } + }; + + config.RankingRewardConfig = new RankingRewardConfig + { + IsEnabled = true, + Groups = new List + { + new RankingRewardGroup { RankingType = 1, Name = "金币达人榜", Rewards = GetDefaultRankingRewards() }, + new RankingRewardGroup { RankingType = 2, Name = "等级达人榜", Rewards = GetDefaultRankingRewards() }, + new RankingRewardGroup { RankingType = 3, Name = "当日积分榜", Rewards = GetDefaultRankingRewards() } + } + }; + + await activityConfigService.Update(config); + + try + { + var json = global::System.Text.Json.JsonSerializer.Serialize(config, new global::System.Text.Json.JsonSerializerOptions { WriteIndented = true, Encoder = global::System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping }); + await global::System.IO.File.WriteAllTextAsync(jsonPath, json); + } + catch (Exception ex) + { + Console.Error.WriteLine($"写入 activityconfig.json 失败: {ex.Message}"); + } + } + + [HttpGet] + + public async Task> Get() + { + var res = await _gameConfigService.Get(); + if (res == null) + return this.ToFailResult("配置不存在"); + if (res.PropConfig != null) + EnrichProductData(res, res.PropConfig); + return this.ToResult(res); + } + + [HttpGet("FishTypeList")] + public async Task>> GetFishTypeList() + { + var res = await _gameConfigService.Get(); + var fishTypes = res.FishTypeConfigs + .Select(f => new { fishNumber = f.FishNumber, fishName = f.FishName, fishType = f.FishType }) + .OrderBy(f => f.fishNumber) + .ToList(); + + return this.ToResult(res.FishTypeConfigs.OrderBy(f => f.FishNumber).ToList()); + } + + [HttpGet("PropList")] + public async Task>> GetPropList() + { + var res = await _gameConfigService.Get(); + if (res?.PropConfig == null) + return this.ToResult(new List()); + var propList = res.PropConfig + .Where(p => p.IsEnable) + .Select(p => new BaseProductCount + { + Number = p.Number, + Name = p.Name, + Desc = p.Desc, + ImageUrl = p.ImageUrl, + Type = p.Type, + Level = p.Level, + Count = 1 + }) + .OrderBy(p => p.Type) + .ThenBy(p => p.Number) + .ToList(); + return this.ToResult(propList); + } + + [HttpPost("Update")] + public async Task> Update(GameConfig param) + { + + StripAllGiftProducts(param); + var res = await _gameConfigService.Update(param); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + + [HttpPost("UpdateFishType")] + public async Task> UpdateFishType(List configs) + { + + var gameConfig = await _gameConfigService.Get(); + gameConfig.FishTypeConfigs = configs; + var res = await _gameConfigService.Update(gameConfig); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpPost("UpdateRoom")] + public async Task> UpdateRoom(List configs) + { + var gameConfig = await _gameConfigService.Get(); + gameConfig.RoomConfigs = configs; + var res = await _gameConfigService.Update(gameConfig); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpPost("UpdateRoomFish")] + public async Task> UpdateRoomFish(List configs) + { + + var gameConfig = await _gameConfigService.Get(); + gameConfig.RoomFishConfigs = configs; + var res = await _gameConfigService.Update(gameConfig); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpPost("UpdateFishArray")] + public async Task> UpdateFishArray(List configs) + { + + var gameConfig = await _gameConfigService.Get(); + gameConfig.FishArrayConfigs = configs; + var res = await _gameConfigService.Update(gameConfig); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpPost("UpdateUserLevel")] + public async Task> UpdateUserLevel(List configs) + { + var gameConfig = await _gameConfigService.Get(); + gameConfig.UserLevelConfigs = configs; + var res = await _gameConfigService.Update(gameConfig); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpPost("UpdateProp")] + public async Task> UpdateProp(List configs) + { + RefreshConfigImagePaths(configs, c => c.Number, (c, path) => c.ImageUrl = path); + var gameConfig = await _gameConfigService.Get(); + gameConfig.PropConfig = configs; + var res = await _gameConfigService.Update(gameConfig); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpPost("UpdatePropFragment")] + public async Task> UpdatePropFragment(List configs) + { + RefreshConfigImagePaths(configs, c => c.Number, (c, path) => c.ImageUrl = path); + var gameConfig = await _gameConfigService.Get(); + gameConfig.PropFragments = configs; + var res = await _gameConfigService.Update(gameConfig); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + private static void RefreshConfigImagePaths(IEnumerable configs, Func numberSelector, Action setter) + { + if (configs == null) return; + var uploadRoot = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "uploads"); + var timespan = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + foreach (var config in configs) + { + var number = numberSelector(config)?.Trim(); + if (string.IsNullOrWhiteSpace(number)) continue; + + var safeNumber = Path.GetFileName(number); + var filePath = Path.Combine(uploadRoot, safeNumber + ".png"); + if (global::System.IO.File.Exists(filePath)) + setter(config, $"/uploads/{safeNumber}.png?timespan={timespan}"); + } + } + + [HttpPost("UpdateVipLevel")] + public async Task> UpdateVipLevel(List configs) + { + var gameConfig = await _gameConfigService.Get(); + StripGiftProduct(configs); + AutoFillGiftProduct(configs, gameConfig.PropConfig); + gameConfig.VipLevelConfigs = configs; + var res = await _gameConfigService.Update(gameConfig); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpPost("UpdateScratchCard")] + public async Task> UpdateScratchCard(List configs) + { + if (configs == null || configs.Count == 0) + return this.ToFailResult("刮刮卡配置不能为空"); + if (configs.Any(x => x.Count <= 0 || x.Weight <= 0)) + return this.ToFailResult("奖励数量和权重必须大于0"); + if (configs.Any(x => x.Type == 3 && string.IsNullOrWhiteSpace(x.BaseProduct?.Number))) + return this.ToFailResult("道具奖励必须配置道具编号"); + + var gameConfig = await _gameConfigService.Get(); + gameConfig.ScratchCardConfig = configs; + var res = await _gameConfigService.Update(gameConfig); + return res.isok ? this.ToResult(res.msg) : this.ToFailResult(res.msg); + } + + [HttpPost("UpdateBossDrop")] + public async Task> UpdateBossDrop(BossDropConfig config) + { + var gameConfig = await _gameConfigService.Get(); + gameConfig.BossDropConfig = config; + var res = await _gameConfigService.Update(gameConfig); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + + + [HttpGet("ExportSection/{sectionName}")] + public async Task ExportSection(string sectionName) + { + var config = await _gameConfigService.Get(); + if (config == null) + return NotFound("配置不存在"); + + var prop = typeof(GameConfig).GetProperty(sectionName); + if (prop == null) + return NotFound($"板块 {sectionName} 不存在"); + + var data = prop.GetValue(config); + if (data == null) + return NotFound($"板块 {sectionName} 数据为空"); + + EnrichProductData(data, config.PropConfig); + + var json = global::System.Text.Json.JsonSerializer.Serialize(data, new global::System.Text.Json.JsonSerializerOptions + { + WriteIndented = true, + Encoder = global::System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }); + return File(global::System.Text.Encoding.UTF8.GetBytes(json), "application/json", $"{sectionName}.json"); + } + + private void EnrichProductData(object obj, List propConfig) + { + if (obj == null) return; + + if (obj is BaseProduct product) + { + var prop = propConfig.FirstOrDefault(p => p.Number == product.Number); + if (prop != null) + { + product.Name = prop.Name; + product.Desc = prop.Desc; + product.ImageUrl = prop.ImageUrl; + product.Type = prop.Type; + product.Level = prop.Level; + } + return; + } + + if (obj is global::System.Collections.IEnumerable enumerable && obj.GetType() != typeof(string)) + { + foreach (var item in enumerable) + EnrichProductData(item, propConfig); + return; + } + + foreach (var p in obj.GetType().GetProperties(global::System.Reflection.BindingFlags.Public | global::System.Reflection.BindingFlags.Instance)) + { + if (p.PropertyType == typeof(string) || p.PropertyType.IsValueType || p.GetIndexParameters().Length > 0) + continue; + var val = p.GetValue(obj); + if (val != null) EnrichProductData(val, propConfig); + } + } + + private static void StripAllGiftProducts(GameConfig config) + { + if (config == null) return; + StripGiftProduct(config.VipLevelConfigs); + } + + private static void StripGiftProduct(IEnumerable configs) + { + if (configs == null) return; + foreach (var level in configs) + { + StripGiftList(level.GiftList); + StripGiftList(level.DailyGift); + } + } + + private static void StripGiftList(IEnumerable gifts) + { + if (gifts == null) return; + foreach (var gift in gifts) + gift.Product = null; + } + + private static void AutoFillGiftProduct(IEnumerable configs, List propConfig) + { + if (configs == null || propConfig == null) return; + foreach (var level in configs) + { + AutoFillGiftProductList(level.GiftList, propConfig); + AutoFillGiftProductList(level.DailyGift, propConfig); + } + } + + private static void AutoFillGiftProductList(IEnumerable gifts, List propConfig) + { + if (gifts == null) return; + foreach (var gift in gifts) + { + if (gift.Type != 3 || string.IsNullOrEmpty(gift.OtherId)) continue; + var prop = propConfig.FirstOrDefault(p => p.Number == gift.OtherId); + if (prop == null) + { + gift.Product = new BaseProduct { Number = gift.OtherId }; + continue; + } + gift.Product = new BaseProduct + { + Number = prop.Number, + Name = prop.Name, + Desc = prop.Desc, + ImageUrl = prop.ImageUrl, + Type = prop.Type, + Level = prop.Level + }; + } + } + + private static List GetDefaultRankingRewards() + { + var rewards = new (int min, int max, long gold, int diamond)[] + { + (1, 1, 65000, 50), (2, 2, 45000, 50), (3, 3, 30000, 50), (4, 4, 20000, 50), + (5, 5, 15000, 50), (6, 6, 12000, 30), (7, 7, 10000, 30), (8, 8, 8000, 30), + (9, 9, 6000, 30), (10, 10, 5000, 30), (11, 11, 3000, 20), (12, 12, 2000, 20), + (13, 13, 1500, 20), (14, 14, 1200, 20), (15, 15, 1000, 20) + }; + return rewards.Select(r => new RankingRewardItem + { + RankMin = r.min, RankMax = r.max, Gold = r.gold, Diamond = r.diamond, + Items = new List + { + new GiftConfig { Type = 3, OtherId = "40004", Count = r.min <= 5 ? 10 : r.min <= 8 ? 8 : r.min <= 10 ? 5 : r.min <= 12 ? 5 : 3 }, + new GiftConfig { Type = 3, OtherId = "40003", Count = r.min <= 5 ? 10 : r.min <= 8 ? 8 : r.min <= 10 ? 5 : r.min <= 12 ? 5 : 3 } + } + }).ToList(); + } + + private static List GetDefaultRobotKillScenes() + { + var data = new (string game, string level, int gt, int rl, int w, string fish, string num, int mulMin, int mulMax, long jpMin, long jpMax)[] + { + ("风雷之渊","初级场",1,1,1,"电鳗","11023",500,2000,5000000,500000000), + ("风雷之渊","初级场",1,1,1,"吞噬鲲","11024",500,2000,5000000,500000000), + ("风雷之渊","初级场",1,1,1,"玲珑宝塔","11025",500,2000,5000000,500000000), + ("风雷之渊","初级场",1,1,1,"聚宝盆","11026",500,2000,5000000,500000000), + ("风雷之渊","初级场",1,1,1,"金龙","11027",500,2000,5000000,500000000), + ("风雷之渊","中级场",1,2,1,"电鳗","11023",500,2000,5000000,500000000), + ("风雷之渊","中级场",1,2,1,"吞噬鲲","11024",500,2000,5000000,500000000), + ("风雷之渊","中级场",1,2,1,"玲珑宝塔","11025",500,2000,5000000,500000000), + ("风雷之渊","中级场",1,2,1,"聚宝盆","11026",500,2000,5000000,500000000), + ("风雷之渊","中级场",1,2,1,"金龙","11027",500,2000,5000000,500000000), + ("风雷之渊","中级场",1,2,1,"神龙转盘","11028",500,2000,5000000,500000000), + ("风雷之渊","中级场",1,2,1,"炸弹蟹","11029",500,2000,5000000,500000000), + ("风雷之渊","中级场",1,2,1,"蚌精","11030",500,2000,5000000,500000000), + ("风雷之渊","中级场",1,2,1,"蟠桃树","11031",500,2000,5000000,500000000), + ("风雷之渊","中级场",1,2,1,"激光蟹","11032",500,2000,5000000,500000000), + ("风雷之渊","中级场",1,2,1,"钻头蟹","11033",500,2000,5000000,500000000), + ("风雷之渊","中级场",1,2,1,"魔法南瓜","11034",500,2000,5000000,500000000), + ("风雷之渊","中级场",1,2,1,"欢乐小丑","11035",500,2000,5000000,500000000), + ("风雷之渊","高级场",1,3,1,"电鳗","11023",500,2000,5000000,500000000), + ("风雷之渊","高级场",1,3,1,"吞噬鲲","11024",500,2000,5000000,500000000), + ("风雷之渊","高级场",1,3,1,"玲珑宝塔","11025",500,2000,5000000,500000000), + ("风雷之渊","高级场",1,3,1,"聚宝盆","11026",500,2000,5000000,500000000), + ("风雷之渊","高级场",1,3,1,"金龙","11027",500,2000,5000000,500000000), + ("风雷之渊","高级场",1,3,1,"神龙转盘","11028",500,2000,5000000,500000000), + ("风雷之渊","高级场",1,3,1,"炸弹蟹","11029",500,2000,5000000,500000000), + ("风雷之渊","高级场",1,3,1,"蚌精","11030",500,2000,5000000,500000000), + ("风雷之渊","高级场",1,3,1,"蟠桃树","11031",500,2000,5000000,500000000), + ("风雷之渊","高级场",1,3,1,"激光蟹","11032",500,2000,5000000,500000000), + ("风雷之渊","高级场",1,3,1,"钻头蟹","11033",500,2000,5000000,500000000), + ("风雷之渊","高级场",1,3,1,"魔法南瓜","11034",500,2000,5000000,500000000), + ("风雷之渊","高级场",1,3,1,"欢乐小丑","11035",500,2000,5000000,500000000), + ("风雷之渊","高级场",1,3,1,"熔岩螃蟹","11036",500,2000,5000000,500000000), + ("风雷之渊","高级场",1,3,1,"熔岩蝎","11037",500,2000,5000000,500000000), + ("风雷之渊","高级场",1,3,1,"禄存星君","11038",500,2000,5000000,500000000), + ("风雷之渊","高级场",1,3,1,"苍穹之主","11039",500,2000,5000000,500000000), + ("风雷之渊","高级场",1,3,1,"雷霆之主","11040",500,2000,5000000,500000000), + ("黑神话悟空","初级场",5,1,1,"大龙虾","13024",500,2000,5000000,500000000), + ("黑神话悟空","初级场",5,1,1,"闪电鱼","13025",500,2000,5000000,500000000), + ("黑神话悟空","初级场",5,1,1,"连环导弹","13026",500,2000,5000000,500000000), + ("黑神话悟空","初级场",5,1,1,"九龙玉玺","13027",500,2000,5000000,500000000), + ("黑神话悟空","初级场",5,1,1,"沙僧","13028",500,2000,5000000,500000000), + ("黑神话悟空","初级场",5,1,1,"白骨精","13029",500,2000,5000000,500000000), + ("黑神话悟空","初级场",5,1,1,"小白龙","13030",500,2000,5000000,500000000), + ("黑神话悟空","初级场",5,1,1,"嫦娥","13031",500,2000,5000000,500000000), + ("黑神话悟空","初级场",5,1,1,"猪八戒","13035",500,2000,5000000,500000000), + ("黑神话悟空","中级场",5,2,1,"大龙虾","13024",500,2000,5000000,500000000), + ("黑神话悟空","中级场",5,2,1,"闪电鱼","13025",500,2000,5000000,500000000), + ("黑神话悟空","中级场",5,2,1,"连环导弹","13026",500,2000,5000000,500000000), + ("黑神话悟空","中级场",5,2,1,"九龙玉玺","13027",500,2000,5000000,500000000), + ("黑神话悟空","中级场",5,2,1,"沙僧","13028",500,2000,5000000,500000000), + ("黑神话悟空","中级场",5,2,1,"白骨精","13029",500,2000,5000000,500000000), + ("黑神话悟空","中级场",5,2,1,"小白龙","13030",500,2000,5000000,500000000), + ("黑神话悟空","中级场",5,2,1,"嫦娥","13031",500,2000,5000000,500000000), + ("黑神话悟空","中级场",5,2,1,"孙悟空","13032",500,2000,5000000,500000000), + ("黑神话悟空","中级场",5,2,1,"铁扇公主","13033",500,2000,5000000,500000000), + ("黑神话悟空","中级场",5,2,1,"猪八戒","13035",500,2000,5000000,500000000), + ("黑神话悟空","中级场",5,2,1,"烈焰巨龙","13036",500,2000,5000000,500000000), + ("黑神话悟空","中级场",5,2,1,"宝船居蟹","13037",500,2000,5000000,500000000), + ("黑神话悟空","高级场",5,3,1,"大龙虾","13024",500,2000,5000000,500000000), + ("黑神话悟空","高级场",5,3,1,"闪电鱼","13025",500,2000,5000000,500000000), + ("黑神话悟空","高级场",5,3,1,"连环导弹","13026",500,2000,5000000,500000000), + ("黑神话悟空","高级场",5,3,1,"九龙玉玺","13027",500,2000,5000000,500000000), + ("黑神话悟空","高级场",5,3,1,"沙僧","13028",500,2000,5000000,500000000), + ("黑神话悟空","高级场",5,3,1,"白骨精","13029",500,2000,5000000,500000000), + ("黑神话悟空","高级场",5,3,1,"小白龙","13030",500,2000,5000000,500000000), + ("黑神话悟空","高级场",5,3,1,"嫦娥","13031",500,2000,5000000,500000000), + ("黑神话悟空","高级场",5,3,1,"孙悟空","13032",500,2000,5000000,500000000), + ("黑神话悟空","高级场",5,3,1,"铁扇公主","13033",500,2000,5000000,500000000), + ("黑神话悟空","高级场",5,3,1,"唐僧","13034",500,2000,5000000,500000000), + ("黑神话悟空","高级场",5,3,1,"猪八戒","13035",500,2000,5000000,500000000), + ("黑神话悟空","高级场",5,3,1,"烈焰巨龙","13036",500,2000,5000000,500000000), + ("黑神话悟空","高级场",5,3,1,"宝船居蟹","13037",500,2000,5000000,500000000), + ("黑神话悟空","高级场",5,3,1,"杨戬","13038",500,2000,5000000,500000000), + ("黑神话悟空","高级场",5,3,1,"食神八戒","13039",500,2000,5000000,500000000), + ("星际迷航","初级场",4,1,1,"幸运飞碟","12022",500,2000,5000000,500000000), + ("星际迷航","初级场",4,1,1,"小丑扑克","12023",500,2000,5000000,500000000), + ("星际迷航","初级场",4,1,1,"黑洞飞船","12024",500,2000,5000000,500000000), + ("星际迷航","初级场",4,1,1,"弹药箱","12025",500,2000,5000000,500000000), + ("星际迷航","初级场",4,1,1,"爆裂金鲨","12026",500,2000,5000000,500000000), + ("星际迷航","中级场",4,2,1,"幸运飞碟","12022",500,2000,5000000,500000000), + ("星际迷航","中级场",4,2,1,"小丑扑克","12023",500,2000,5000000,500000000), + ("星际迷航","中级场",4,2,1,"黑洞飞船","12024",500,2000,5000000,500000000), + ("星际迷航","中级场",4,2,1,"弹药箱","12025",500,2000,5000000,500000000), + ("星际迷航","中级场",4,2,1,"爆裂金鲨","12026",500,2000,5000000,500000000), + ("星际迷航","中级场",4,2,1,"女龙王","12027",500,2000,5000000,500000000), + ("星际迷航","高级场",4,3,1,"幸运飞碟","12022",500,2000,5000000,500000000), + ("星际迷航","高级场",4,3,1,"小丑扑克","12023",500,2000,5000000,500000000), + ("星际迷航","高级场",4,3,1,"黑洞飞船","12024",500,2000,5000000,500000000), + ("星际迷航","高级场",4,3,1,"弹药箱","12025",500,2000,5000000,500000000), + ("星际迷航","高级场",4,3,1,"爆裂金鲨","12026",500,2000,5000000,500000000), + ("星际迷航","高级场",4,3,1,"女龙王","12027",500,2000,5000000,500000000), + ("星际迷航","高级场",4,3,1,"机械蝎","12028",500,2000,5000000,500000000), + ("星际迷航","高级场",4,3,1,"星际巡航","12029",500,2000,5000000,500000000), + ("星际迷航","高级场",4,3,1,"破坏球","12030",500,2000,5000000,500000000), + ("星际迷航","高级场",4,3,1,"幸运轮","12031",500,2000,5000000,500000000), + ("星际迷航","高级场",4,3,1,"超能魔盒","12032",500,2000,5000000,500000000), + ("星际迷航","高级场",4,3,1,"机甲雷霆","12033",500,2000,5000000,500000000), + ("星际迷航","高级场",4,3,1,"烈焰风暴","12034",500,2000,5000000,500000000), + }; + return data.Select(d => new RobotKillScene + { + GameName = d.game, LevelName = d.level, GameType = d.gt, RoomLevel = d.rl, Weight = d.w, + FishName = d.fish, FishNumber = d.num, + MultiplierMin = d.mulMin, MultiplierMax = d.mulMax, + JackpotMin = d.jpMin, JackpotMax = d.jpMax + }).ToList(); + } + + + } +} + + + + diff --git a/AdminSrc/AdminApi/GameConfigs/TempSpawnFishController.cs b/AdminSrc/AdminApi/GameConfigs/TempSpawnFishController.cs new file mode 100644 index 0000000..6f2b3e4 --- /dev/null +++ b/AdminSrc/AdminApi/GameConfigs/TempSpawnFishController.cs @@ -0,0 +1,98 @@ +using System; +using Common; +using CommonDomain; +using CommonInfrastructure; +using DotNetCore.CAP; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using RedisService; + +namespace AdminApi.GameConfigs +{ + [ApiController, Route("adminapi/Admin/[controller]")] + [AllowAnonymous] + public class TempSpawnFishController : BaseController + { + private readonly ICapPublisher _capPublisher; + private readonly IRedisService _redisService; + private readonly ILogger _logger; + + public TempSpawnFishController(ICapPublisher capPublisher, IRedisService redisService, ILogger logger) + { + _capPublisher = capPublisher; + _redisService = redisService; + _logger = logger; + } + + [HttpGet("SpawnFish")] + public async Task> SpawnFish( + string roomId, + string fishNumber, + int count = 1, + int? seconds = null, + int? routeId = null) + { + if (string.IsNullOrWhiteSpace(roomId) || string.IsNullOrWhiteSpace(fishNumber)) + { + + return new BaseResponse + { + Code = CommonResponseCodeEnum.ParamError, + Info = "roomId / fishNumber 不能为空" + }; + } + + var room = _redisService.GetGameRoom(roomId); + if (room == null) + { + + return new BaseResponse + { + Code = CommonResponseCodeEnum.ParamError, + Info = $"房间 {roomId} 不存在或不在线" + }; + } + + + count = Math.Clamp(count <= 0 ? 1 : count, 1, 2000); + var effectiveSeconds = (seconds.HasValue && seconds.Value > 0) ? seconds.Value : 30; + + var operationId = Guid.NewGuid().ToString("N"); + var publishedAt = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + var msg = new TempSpawnFishMessage + { + RoomId = roomId, + FishNumber = fishNumber, + Count = count, + RouteId = routeId, + Seconds = effectiveSeconds, + OperationId = operationId, + PublishedAtUnixMs = publishedAt + }; + + try + { + await _capPublisher.PublishAsync(TopicKeys.临时强制出鱼, msg); + + return new BaseResponse + { + Code = CommonResponseCodeEnum.Success, + Info = "已推送临时出鱼指令(异步),operationId=" + operationId, + Data = operationId + }; + } + catch (Exception ex) + { + _logger.LogError(ex, + "[TempSpawn] CAP发布失败 operationId={OperationId} roomId={RoomId} fishNumber={FishNumber} count={Count}", + operationId, roomId, fishNumber, count); + return new BaseResponse + { + Code = CommonResponseCodeEnum.Error, + Info = "发布失败:" + ex.Message + }; + } + } + } +} \ No newline at end of file diff --git a/AdminSrc/AdminApi/LoginLogs/UserLoginLogController.cs b/AdminSrc/AdminApi/LoginLogs/UserLoginLogController.cs new file mode 100644 index 0000000..c15185b --- /dev/null +++ b/AdminSrc/AdminApi/LoginLogs/UserLoginLogController.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Common; +using CommonInfrastructure; +using Microsoft.AspNetCore.Mvc; +using MongoRepository; +using UserDomain; +using UserDomain.Entity; +using UserDomain.Param; + +namespace AdminApi.LoginLogs +{ + [ApiController, Route("adminapi/[controller]")] + public class UserLoginLogController : BaseController + { + private readonly IMongoBaseRepository _logRepo; + + public UserLoginLogController(IMongoBaseRepository logRepo) + { + _logRepo = logRepo; + } + + [HttpPost("List")] + public async Task> GetList([FromBody] UserLoginLogQueryParam param) + { + var result = await _logRepo.QueryPageAsync( + filterExpression: x => + (string.IsNullOrEmpty(param.UserId) || x.UserId == param.UserId) && + (string.IsNullOrEmpty(param.UserNumber) || x.UserNumber == param.UserNumber) && + (string.IsNullOrEmpty(param.UserName) || (x.UserName != null && x.UserName.Contains(param.UserName))) && + (!param.LoginType.HasValue || x.LoginType == param.LoginType) && + (!param.Status.HasValue || x.Status == param.Status) && + (!param.Platform.HasValue || x.Platform == param.Platform) && + (!param.StartTime.HasValue || x.LoginTime >= param.StartTime) && + (!param.EndTime.HasValue || x.LoginTime <= param.EndTime), + orderExpression: x => x.LoginTime, + desc: true, + pageSize: param.PageSize, + pageIndex: param.PageIndex + ); + + var dtos = result.list.Select(MapToDto); + return this.ToPageResult(dtos, (int)result.count); + } + + [HttpGet("Detail")] + public async Task> GetDetail(string id) + { + var log = await _logRepo.FindOneAsync(x => x.Id == id); + if (log == null) + return this.ToFailResult("日志不存在"); + + return this.ToResult(MapToDto(log)); + } + + [HttpPost("Delete")] + public async Task> Delete(string id) + { + var result = await _logRepo.DeleteByIdAsync(id); + if (result.ok) + return this.ToResult("删除成功"); + else + return this.ToFailResult("删除失败"); + } + + [HttpPost("BatchDelete")] + public async Task> BatchDelete([FromBody] List ids) + { + int success = 0, fail = 0; + foreach (var id in ids) + { + var result = await _logRepo.DeleteByIdAsync(id); + if (result.ok) + success++; + else + fail++; + } + if (fail == 0) + return this.ToResult($"成功删除 {success} 条"); + return this.ToResult($"删除完成:成功 {success} 条,失败 {fail} 条"); + } + + private static UserLoginLogDto MapToDto(UserLoginLog entity) + { + return new UserLoginLogDto + { + Id = entity.Id, + UserId = entity.UserId ?? "", + UserNumber = entity.UserNumber ?? "", + UserName = entity.UserName ?? "", + LoginType = entity.LoginType, + Status = entity.Status, + Ip = entity.Ip ?? "", + IpLocation = entity.IpLocation ?? "", + DeviceType = entity.DeviceType ?? "", + DeviceId = entity.DeviceId ?? "", + Platform = entity.Platform, + ClientVersion = entity.ClientVersion ?? "", + FailReason = entity.FailReason ?? "", + LoginTime = entity.LoginTime + }; + } + } + + public class UserLoginLogDto + { + public string Id { get; set; } + + public string UserId { get; set; } + + public string UserNumber { get; set; } + + public string UserName { get; set; } + + public int LoginType { get; set; } + + public int Status { get; set; } + + public string Ip { get; set; } + + public string IpLocation { get; set; } + + public string DeviceType { get; set; } + + public string DeviceId { get; set; } + + public int Platform { get; set; } + + public string ClientVersion { get; set; } + + public string FailReason { get; set; } + + public DateTime LoginTime { get; set; } + } +} diff --git a/AdminSrc/AdminApi/Lottery/LotteryController.cs b/AdminSrc/AdminApi/Lottery/LotteryController.cs new file mode 100644 index 0000000..1e95c0f --- /dev/null +++ b/AdminSrc/AdminApi/Lottery/LotteryController.cs @@ -0,0 +1,236 @@ +using AdminService.GameConfigs; +using Common; +using CommonDomain; +using CommonDomain.BaseModel; +using CommonInfrastructure; +using Microsoft.AspNetCore.Mvc; + +namespace AdminApi.Lottery +{ + [ApiController, Route("adminapi/[controller]")] + public class LotteryController : BaseController + { + private readonly IActivityConfigService _activityConfigService; + private readonly IGameConfigService _gameConfigService; + + public LotteryController(IActivityConfigService activityConfigService, IGameConfigService gameConfigService) + { + _activityConfigService = activityConfigService; + _gameConfigService = gameConfigService; + } + + [HttpGet("list")] + public async Task>> List() + { + var config = await _activityConfigService.Get(); + if (config == null) + return this.ToResult(new List()); + + var lotto = config.LotteryActivityConfig; + if (lotto == null || string.IsNullOrWhiteSpace(lotto.ActivityName)) + return this.ToResult(new List()); + + LotteryPrizeProductHelper.Enrich(lotto, await _gameConfigService.Get()); + + var vm = new LotteryActivityVm + { + ActivityId = config.Id, + ActivityName = lotto.ActivityName, + IsOpen = lotto.IsOpen, + StartTime = lotto.StartTime, + EndTime = lotto.EndTime, + CostsByPool = lotto.CostsByPool, + UserMaxDraw = lotto.UserMaxDraw, + Pools = lotto.Pools + }; + + return this.ToResult(new List { vm }); + } + + [HttpGet("detail")] + public async Task> Detail([FromQuery] string activityId) + { + var config = await _activityConfigService.Get(); + if (config == null) + return this.ToFailResult("活动配置不存在"); + + LotteryPrizeProductHelper.Enrich(config.LotteryActivityConfig, await _gameConfigService.Get()); + + var vm = new LotteryActivityVm + { + ActivityId = config.Id, + ActivityName = config.LotteryActivityConfig.ActivityName, + IsOpen = config.LotteryActivityConfig.IsOpen, + StartTime = config.LotteryActivityConfig.StartTime, + EndTime = config.LotteryActivityConfig.EndTime, + CostsByPool = config.LotteryActivityConfig.CostsByPool, + UserMaxDraw = config.LotteryActivityConfig.UserMaxDraw, + Pools = config.LotteryActivityConfig.Pools + }; + + return this.ToResult(vm); + } + + [HttpPost("save")] + public async Task> Save([FromBody] LotteryActivityVm param) + { + if (string.IsNullOrWhiteSpace(param.ActivityName)) + return this.ToFailResult("活动名称不能为空"); + + var pools = param.Pools ?? new List(); + if (pools.SelectMany(pool => pool.PrizeList ?? new List()) + .Any(prize => !string.IsNullOrWhiteSpace(prize.OtherId))) + { + var gameConfig = await _gameConfigService.Get(); + if (gameConfig == null) + return this.ToFailResult("道具配置不存在,无法补全奖项信息"); + EnrichPrizeProducts(pools, gameConfig); + } + + var activityConfig = await _activityConfigService.Get() ?? new ActivityConfig(); + var previousLottery = activityConfig.LotteryActivityConfig; + var cycleChanged = previousLottery == null + || previousLottery.StartTime != param.StartTime + || previousLottery.EndTime != param.EndTime; + + if (cycleChanged) + { + foreach (var prize in pools.SelectMany(pool => pool.PrizeList ?? new List())) + prize.DrawnCount = 0; + } + + var normalizedCostsByPool = new Dictionary>(); + var poolNames = new Dictionary { [1] = "炮台", [2] = "战神", [3] = "翅膀" }; + for (var poolType = 1; poolType <= 3; poolType++) + { + List? poolCosts = null; + param.CostsByPool?.TryGetValue(poolType, out poolCosts); + var validPoolCosts = poolCosts?.Where(cost => cost > 0).ToList(); + if (validPoolCosts == null || validPoolCosts.Count == 0) + return this.ToFailResult($"请配置{poolNames[poolType]}奖池消耗金币"); + + normalizedCostsByPool[poolType] = validPoolCosts; + } + + activityConfig.LotteryActivityConfig = new LotteryActivityConfig + { + ActivityName = param.ActivityName, + IsOpen = param.IsOpen, + StartTime = param.StartTime, + EndTime = param.EndTime, + CostsByPool = normalizedCostsByPool, + UserMaxDraw = param.UserMaxDraw, + Pools = pools + }; + + var res = await _activityConfigService.Update(activityConfig); + if (res.isok) + return this.ToResult("保存成功"); + else + return this.ToFailResult(res.msg); + } + + private static void EnrichPrizeProducts(List pools, GameConfig gameConfig) + { + LotteryPrizeProductHelper.Enrich(new LotteryActivityConfig { Pools = pools }, gameConfig); + } + + [HttpPost("toggle")] + public async Task> Toggle([FromBody] LotteryToggleParam param) + { + var activityConfig = await _activityConfigService.Get(); + if (activityConfig == null) + return this.ToFailResult("活动配置不存在"); + + activityConfig.LotteryActivityConfig.IsOpen = param.IsOpen; + + var res = await _activityConfigService.Update(activityConfig); + if (res.isok) + return this.ToResult(param.IsOpen ? "活动已开启" : "活动已关闭"); + else + return this.ToFailResult(res.msg); + } + + [HttpPost("initialize")] + public async Task> Initialize() + { + var path = Path.Combine(AppContext.BaseDirectory, "Config", "lottery-init.json"); + if (!global::System.IO.File.Exists(path)) + return this.ToFailResult("奖池初始化模板不存在"); + + LotteryActivityConfig? template; + try + { + var json = await global::System.IO.File.ReadAllTextAsync(path); + template = global::System.Text.Json.JsonSerializer.Deserialize(json, + new global::System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true }); + } + catch (global::System.Text.Json.JsonException) + { + return this.ToFailResult("奖池初始化模板格式错误"); + } + + var pools = template?.Pools; + var prizes = pools?.SelectMany(pool => pool.PrizeList ?? new List()).ToList(); + if (template == null || string.IsNullOrWhiteSpace(template.ActivityName) + || template.CostsByPool == null + || new[] { 1, 2, 3 }.Any(type => !template.CostsByPool.TryGetValue(type, out var costs) || costs == null || costs.Count == 0) + || pools == null || pools.Count == 0 || prizes == null || prizes.Count == 0 + || new[] { 1, 2, 3 }.Any(type => !pools.Any(pool => pool.PoolType == type && pool.PrizeList?.Count > 0)) + || prizes.Any(prize => string.IsNullOrWhiteSpace(prize.PrizeId)) + || prizes.Select(prize => prize.PrizeId).Distinct().Count() != prizes.Count) + return this.ToFailResult("奖池初始化模板不完整,未修改现有配置"); + + template.IsOpen = false; + foreach (var prize in prizes) prize.DrawnCount = 0; + var config = await _activityConfigService.Get() ?? new ActivityConfig(); + config.LotteryActivityConfig = template; + var result = await _activityConfigService.Update(config); + return result.isok + ? this.ToResult("奖池配置已初始化,活动保持关闭") + : this.ToFailResult(result.msg); + } + + [HttpDelete("delete")] + public async Task> Delete() + { + var activityConfig = await _activityConfigService.Get(); + if (activityConfig == null) + return this.ToFailResult("活动配置不存在"); + + activityConfig.LotteryActivityConfig = new LotteryActivityConfig(); + + var res = await _activityConfigService.Update(activityConfig); + if (res.isok) + return this.ToResult("删除成功"); + else + return this.ToFailResult(res.msg); + } + } + + public class LotteryActivityVm + { + public string ActivityId { get; set; } = string.Empty; + + public string ActivityName { get; set; } = string.Empty; + + public bool IsOpen { get; set; } = false; + + public long StartTime { get; set; } = 0; + + public long EndTime { get; set; } = 0; + + public Dictionary> CostsByPool { get; set; } = new Dictionary>(); + + public int UserMaxDraw { get; set; } = 100; + + public List Pools { get; set; } = new List(); + } + + public class LotteryToggleParam + { + public string ActivityId { get; set; } = string.Empty; + + public bool IsOpen { get; set; } + } +} diff --git a/AdminSrc/AdminApi/Notices/NoticeController.cs b/AdminSrc/AdminApi/Notices/NoticeController.cs new file mode 100644 index 0000000..df4f964 --- /dev/null +++ b/AdminSrc/AdminApi/Notices/NoticeController.cs @@ -0,0 +1,88 @@ +using Domain.Admin.Notices; +using AdminService.Notices; +using AdminService.Notices.Param; +using Common; +using CommonInfrastructure; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace AdminApi.Notices; + +[ApiController, Route("adminapi/[controller]")] +[Authorize] +public class NoticeController : BaseController +{ + private readonly INoticeService _noticeService; + + public NoticeController(INoticeService noticeService) + { + _noticeService = noticeService; + } + + [HttpPost("add")] + public async Task> AddNotice([FromBody] AddNoticeParam param) + { + var result = await _noticeService.Add(param); + return result.isok + ? this.ToResult(result.msg) + : this.ToFailResult(result.msg); + } + + [HttpPost("update")] + public async Task> UpdateNotice([FromBody] UpdateNoticeParam param) + { + var result = await _noticeService.Update(param); + return result.isok + ? this.ToResult(result.msg) + : this.ToFailResult(result.msg); + } + + [HttpGet("delete")] + public async Task> DeleteNotice([FromQuery] string id) + { + var result = await _noticeService.Delete(id); + return result.isok + ? this.ToResult(result.msg) + : this.ToFailResult(result.msg); + } + + [HttpPost("list")] + public async Task> GetNoticeList([FromBody] GetNoticeListParam param) + { + var (list, count) = await _noticeService.GetList(param); + if (list == null) + return this.ToPageResult(new List(), 0); + var dtos = list.Select(n => new NoticeListItemDto + { + Id = n.Id, + Title = n.Title, + Recommend = n.Recommend, + TopImage = n.TopImage, + CreateTime = n.CreateTime + }); + return this.ToPageResult(dtos, (int)count); + } + + [HttpGet("get")] + [AllowAnonymous] + public async Task> GetNotice([FromQuery] string id) + { + var notice = await _noticeService.Get(id); + if (notice == null) + { + return this.ToFailResult("公告不存在"); + } + + var dto = new NoticeDto + { + Id = notice.Id, + Title = notice.Title, + Content = notice.Content, + Recommend = notice.Recommend, + TopImage = notice.TopImage, + ContentImages = notice.ContentImages, + CreateTime = notice.CreateTime + }; + return this.ToResult(dto); + } +} diff --git a/AdminSrc/AdminApi/Program.cs b/AdminSrc/AdminApi/Program.cs new file mode 100644 index 0000000..3751555 --- /dev/null +++ b/AdminSrc/AdminApi/Program.cs @@ -0,0 +1,2 @@ +// See https://aka.ms/new-console-template for more information +Console.WriteLine("Hello, World!"); diff --git a/AdminSrc/AdminApi/System/SystemController.cs b/AdminSrc/AdminApi/System/SystemController.cs new file mode 100644 index 0000000..a63be1f --- /dev/null +++ b/AdminSrc/AdminApi/System/SystemController.cs @@ -0,0 +1,330 @@ +using System.Linq; +using AdminService.System; +using AdminService.System.Param; +using AdminService.System.Response; +using Common; +using CommonInfrastructure ; +using Domain.Admin.Admin; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 + +namespace AdminApi.System +{ + + [ApiController, Route("adminapi/[controller]")] + [Authorize] + public class SystemController : BaseController + { + private readonly ISystemService _systemService; + + public SystemController(ISystemService systemService) + { + _systemService = systemService; + } + + + [HttpPost("user/add")] + + public async Task> AddUser(AddUserParam param) + { + var result = await _systemService.AddUser(param); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + [HttpPost("user/update")] + + public async Task> UpdateUser(UpdateUserParam param) + { + var result = await _systemService.UpdateUser(param); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + [HttpGet("user/update/icon")] + + public async Task> UpdateUserIcon(string id, string icon) + { + var result = await _systemService.UpdateUserIcon(id,icon); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + [HttpGet("user/update/state")] + + public async Task> UpdateUserState(string id, int state) + { + var result = await _systemService.UpdateUserState(id, state); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + [HttpGet("user/delete")] + + public async Task> DeleteUser(string id) + { + var result = await _systemService.DeleteUser(id); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + [HttpGet("user/login")] + [AllowAnonymous] + public async Task> UserLogin(string userName, string password) + { + var result = await _systemService.UserLogin(userName, password); + if (result.isok) + return this.ToResult(result.model); + else + return this.ToFailResult(result.msg); + } + [HttpPost("user/list")] + + public async Task> GetUserList(GetUserListParam param) + { + var result = await _systemService.GetUserList(param); + var dtos = result.list.Select(MapToSystemUserDto).ToList(); + return this.ToPageResult(dtos, (int)result.count); + } + + [HttpGet("user/getuser")] + + public async Task> GetUser() + { + if (string.IsNullOrEmpty(loginUser.UserId)) + return this.ToFailResult("用户未登录"); + var result = await _systemService.GetUser(loginUser.UserId); + if (result == null) + return this.ToFailResult("用户不存在"); + return this.ToResult(MapToSystemUserDto(result)); + } + + private static SystemUserDto MapToSystemUserDto(SystemUser entity) + { + if (entity == null) return new SystemUserDto(); + return new SystemUserDto + { + Id = entity.Id ?? "", + UserName = entity.UserName ?? "", + DisplayName = entity.DisplayName ?? "", + Icon = entity.Icon ?? "", + RegisterTime = entity.RegisterTime, + State = entity.State, + RoleId = entity.SystemRole?.Id ?? "", + RoleName = entity.SystemRole?.Name ?? "" + }; + } + + [HttpGet("user/nav")] + + public async Task> GetUserNav() + { + if (string.IsNullOrEmpty(loginUser.UserId)) + return this.ToListFailResult("用户未登录"); + var result = await _systemService.GetUserNav(this.loginUser); + if (result == null) + return this.ToListFailResult("获取菜单失败"); + return this.ToListResult(result); + } + + + + [HttpPost("role/add")] + + public async Task> AddRole(AddRoleParam param) + { + var result = await _systemService.AddRole(param); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + [HttpPost("role/update")] + + public async Task> UpdateRole(UpdateRoleParam param) + { + var result = await _systemService.UpdateRole(param); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + [HttpPost("role/updatenav")] + + public async Task> UpdateRoleNav(UpdateRoleNavParam param) + { + var result = await _systemService.UpdateRoleNav(param); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("role/delete")] + + public async Task> DeleteRole(string id) + { + var result = await _systemService.DeleteRole(id); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("role/list")] + public async Task> GetRoleList(int page, int limit) + { + var result = await _systemService.GetRoleList(); + var dtos = result.Select(MapToSystemUserRoleDto).ToList(); + return this.ToListResult(dtos); + } + + private static SystemUserRoleDto MapToSystemUserRoleDto(SystemUserRole entity) + { + if (entity == null) return new SystemUserRoleDto(); + return new SystemUserRoleDto + { + Id = entity.Id ?? "", + RoleName = entity.RoleName ?? "", + Description = entity.Description ?? "", + NavIds = entity.NavIds ?? new List() + }; + } + [HttpGet("role/get")] + + public async Task> GetUserRole(string id) + { + var result = await _systemService.GetUserRole(id); + return this.ToResult(MapToSystemUserRoleDto(result)); + } + + + + + [HttpPost("nav/add")] + + public async Task> AddNav(AddNavParam param) + { + var result = await _systemService.AddNav(param); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + [HttpPost("nav/update")] + + public async Task> UpdateNav(UpdateNavParam param) + { + var result = await _systemService.UpdateNav(param); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("nav/delete")] + + public async Task> DeleteNav(string id) + { + var result = await _systemService.DeleteNav(id); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + + [HttpGet("nav/list")] + + public async Task> GetNavList(string? id="") + { + var result = await _systemService.GetNavList(id); + return this.ToListResult(result); + } + + + public class SystemUserDto + { + public string Id { get; set; } + public string UserName { get; set; } + public string DisplayName { get; set; } + public string Icon { get; set; } + public DateTime RegisterTime { get; set; } + public int State { get; set; } + public string RoleId { get; set; } + public string RoleName { get; set; } + } + + public class SystemUserRoleDto + { + public string Id { get; set; } + public string RoleName { get; set; } + public string Description { get; set; } + public List NavIds { get; set; } = new List(); + } + + + + [HttpPost("dic/add")] + + public async Task> AddDic(AddDicParam param) + { + var result = await _systemService.AddDic(param); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + [HttpPost("dic/update")] + + public async Task> UpdateDic(UpdateDicParam param) + { + var result = await _systemService.UpdateDic(param); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("dic/delete")] + + public async Task> DeleteDic(string id) + { + var result = await _systemService.DeleteDic(id); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + + [HttpGet("dic/list")] + + public async Task> GetDicList(string id="") + { + var result = await _systemService.GetDicList(id); + return this.ToListResult(result); + } + [HttpGet("dic/list/code")] + + public async Task> GetDicListByCode(string code) + { + var result = await _systemService.GetDicListByCode(code); + return this.ToListResult(result); + } + [HttpGet("dic/get/code")] + + public async Task> GetDictByCode(string code) + { + var result = await _systemService.GetDictByCode(code); + return this.ToResult(result); + } + } +} diff --git a/AdminSrc/AdminApi/Task/TaskController.cs b/AdminSrc/AdminApi/Task/TaskController.cs new file mode 100644 index 0000000..c6bf024 --- /dev/null +++ b/AdminSrc/AdminApi/Task/TaskController.cs @@ -0,0 +1,78 @@ +using AdminService.Tasks; +using AdminService.Tasks.Param; +using Common; +using CommonDomain; +using CommonInfrastructure; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace AdminApi.Task +{ + [ApiController, Route("adminapi/[controller]")] + [Authorize] + public class TaskController : BaseController + { + private readonly ITaskService _taskService; + + public TaskController(ITaskService taskService) + { + _taskService = taskService; + } + + [HttpGet("Init")] + public async Task Init() + { + return await _taskService.InitDefaultTasks(); + } + + [HttpGet("DayTaskReward")] + public async Task DayTaskReward() + { + return await _taskService.DayTaskReward(); + } + [HttpPost("AddTask")] + public async Task> AddTask([FromBody] GameTask param) + { + var res = await _taskService.AddTask(param); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + [HttpGet("DeleteTask")] + public async Task> DeleteTask(string id) + { + var res = await _taskService.DeleteTask(id); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + [HttpGet("UpdateTaskState")] + public async Task> UpdateTaskState(string id, int state) + { + var res = await _taskService.UpdateTaskState(id, state); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpPost("UpdateTask")] + public async Task> UpdateTask([FromBody] GameTask param) + { + var res = await _taskService.UpdateTask(param); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpPost("GetTaskList")] + public async Task> GetTaskList(GetTaskListParam param) + { + var res = await _taskService.GetTaskList(param); + return this.ToPageResult(res.list, res.count); + } + } +} diff --git a/AdminSrc/AdminApi/UserAssetChanges/UserAssetChangeController.cs b/AdminSrc/AdminApi/UserAssetChanges/UserAssetChangeController.cs new file mode 100644 index 0000000..ca35d19 --- /dev/null +++ b/AdminSrc/AdminApi/UserAssetChanges/UserAssetChangeController.cs @@ -0,0 +1,150 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using AdminService.User.Param; +using Common; +using Common.Utils; +using CommonDomain.BaseModel; +using CommonInfrastructure; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using MongoDB.Driver; +using MongoRepository; +using UserDomain.Entity; +using UserDomain.Enum; + +namespace AdminApi.UserAssetChanges +{ + [ApiController, Route("adminapi/[controller]")] + [Authorize] + public class UserAssetChangeController : BaseController + { + private readonly IMongoBaseRepository _rewardMongo; + private readonly IMongoBaseRepository _userMongo; + + public UserAssetChangeController(IMongoBaseRepository rewardMongo, IMongoBaseRepository userMongo) + { + _rewardMongo = rewardMongo; + _userMongo = userMongo; + } + + [HttpPost("list")] + public async Task> GetList([FromBody] UserAssetChangeQueryParam param) + { + var filter = Builders.Filter.Empty; + + filter &= Builders.Filter.Nin(x => x.Source, new List() { RewardSource.开炮, RewardSource.击杀鱼}); + + if (!string.IsNullOrWhiteSpace(param.UserId)) + { + filter &= Builders.Filter.Eq(x => x.UserId, param.UserId); + } + + if (param.CurrencyTypes != null && param.CurrencyTypes.Count > 0) + { + filter &= Builders.Filter.In(x => x.CurrencyType, param.CurrencyTypes); + } + + if (param.ChangeTypes != null && param.ChangeTypes.Count > 0) + { + filter &= Builders.Filter.In(x => x.Type, param.ChangeTypes); + } + + if (param.Sources != null && param.Sources.Count > 0) + { + var sourceEnums = param.Sources.Select(s => Enum.TryParse(s, out var src) ? src : (RewardSource?)null) + .Where(x => x.HasValue) + .Select(x => x.Value) + .ToList(); + if (sourceEnums.Count > 0) + { + filter &= Builders.Filter.In(x => x.Source, sourceEnums); + } + } + + + + if (param.CurrencyType.HasValue) + { + filter &= Builders.Filter.Eq(x => x.CurrencyType, param.CurrencyType.Value); + } + + if (param.TimeStart.HasValue) + { + filter &= Builders.Filter.Gte(x => x.CreateTime, param.TimeStart.Value); + } + if (param.TimeEnd.HasValue) + { + filter &= Builders.Filter.Lte(x => x.CreateTime, param.TimeEnd.Value); + } + + var sort = Builders.Sort.Descending(x => x.CreateTime); + var result = await _rewardMongo.QueryPageAsync( + filter, + sort, + true, + param.PageSize.Value, + param.PageIndex.Value + ); + + var list = result.list ?? new List(); + var userIds = list.Select(x => x.UserId).Distinct().ToList(); + var users = await _userMongo.FilterByAsync(x => userIds.Contains(x.Id)); + var userDict = users.ToDictionary(u => u.Id, u => u.BaseInfo?.UserName ?? ""); + + if (list == null) + return this.ToPageResult(new List(), 0); + var dtos = list.Select(x => new UserAssetChangeDto + { + Id = x.Id, + UserId = x.UserId, + UserName = userDict.TryGetValue(x.UserId, out var name) ? name : "", + Type = x.Type, + ChangeTypeText = x.Type == 1 ? "增加" : "减少", + Source = x.Source.ToString(), + CurrencyType = x.CurrencyType, + CurrencyTypeText = x.CurrencyType == 1 ? "金币" : x.CurrencyType == 2 ? "保险箱金币" : "钻石", + BeforeCount = x.BeforeCount, + ChangeCount = x.ChangeCount, + AfterCount = x.AfterCount, + Remark = x.Remark, + CreateTime = x.CreateTime.ToDateTime() + }); + + return this.ToPageResult(dtos, (int)result.count); + } + + [HttpGet("sources")] + public BaseResponse> GetSources() + { + var sources = Enum.GetValues() + .Select(x => new SourceOptionDto { Value = x.ToString(), Label = x.ToString() }) + .ToList(); + return this.ToResult(sources); + } + } + + public class UserAssetChangeDto + { + public string Id { get; set; } + public string UserId { get; set; } + public string UserName { get; set; } + public int Type { get; set; } + public string ChangeTypeText { get; set; } + public string Source { get; set; } + public int CurrencyType { get; set; } + public string CurrencyTypeText { get; set; } + public long BeforeCount { get; set; } + public long ChangeCount { get; set; } + public long AfterCount { get; set; } + public string Remark { get; set; } + public DateTime CreateTime { get; set; } + } + + public class SourceOptionDto + { + public string Value { get; set; } + public string Label { get; set; } + } +} diff --git a/AdminSrc/AdminApplication/AdminApplication.csproj b/AdminSrc/AdminApplication/AdminApplication.csproj new file mode 100644 index 0000000..30402ac --- /dev/null +++ b/AdminSrc/AdminApplication/AdminApplication.csproj @@ -0,0 +1,9 @@ + + + + net8.0 + enable + enable + + + diff --git a/AdminSrc/AdminApplication/DTOs/CustomerDtos.cs b/AdminSrc/AdminApplication/DTOs/CustomerDtos.cs new file mode 100644 index 0000000..c94d402 --- /dev/null +++ b/AdminSrc/AdminApplication/DTOs/CustomerDtos.cs @@ -0,0 +1,67 @@ +using System; + +namespace AdminApplication.DTOs; + +public class CustomerDto +{ + public string Id { get; set; } + + public string? UserId { get; set; } + + public string? UserName { get; set; } + + public int Status { get; set; } + + public string? Avatar { get; set; } + + public DateTime CreateTime { get; set; } +} + +public class ConversationDto +{ + public string Id { get; set; } + + public string? UserId { get; set; } + + public string? UserName { get; set; } + + public string? UserAvatar { get; set; } + + public string? CustomerId { get; set; } + + public string? CustomerName { get; set; } + + public string? CustomerAvatar { get; set; } + + public int Status { get; set; } + + public DateTime CreateTime { get; set; } + + public DateTime? EndTime { get; set; } +} + +public class MessageDto +{ + public string Id { get; set; } + + public string? ConversationId { get; set; } + + public int SenderType { get; set; } + + public string? SenderId { get; set; } + + public string? SenderName { get; set; } + + public string? SenderAvatar { get; set; } + + public int ContentType { get; set; } + + public string? Content { get; set; } + + public DateTime CreateTime { get; set; } +} + +public class DeleteMessagesBatchRequest +{ + public List Ids { get; set; } = new List(); +} diff --git a/AdminSrc/AdminDomain/Admin/AdminOperationLog.cs b/AdminSrc/AdminDomain/Admin/AdminOperationLog.cs new file mode 100644 index 0000000..3fdfbbe --- /dev/null +++ b/AdminSrc/AdminDomain/Admin/AdminOperationLog.cs @@ -0,0 +1,50 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; + +namespace Domain.Admin.Admin +{ + [BsonCollection("admin_operation_log", ServiceDatabases.Admin)] + [BsonIgnoreExtraElements] + public class AdminOperationLog : MongoBaseEntity + { + [BsonElement("adminid")] + public string? AdminId { get; set; } + + [BsonElement("adminname")] + public string? AdminName { get; set; } + + [BsonElement("module")] + public int Module { get; set; } + + [BsonElement("actiontype")] + public string? ActionType { get; set; } + + [BsonElement("description")] + public string? Description { get; set; } + + [BsonElement("httpmethod")] + public string? HttpMethod { get; set; } + + [BsonElement("requestpath")] + public string? RequestPath { get; set; } + + [BsonElement("requestparams")] + public string? RequestParams { get; set; } + + [BsonElement("response")] + public string? Response { get; set; } + + [BsonElement("ip")] + public string? Ip { get; set; } + + [BsonElement("status")] + public int Status { get; set; } = 1; + + [BsonElement("operatetime")] + [BsonDateTimeOptions(Kind = DateTimeKind.Local, DateOnly = false)] + public DateTime OperateTime { get; set; } = DateTime.Now; + } +} diff --git a/AdminSrc/AdminDomain/Admin/ENum/EnumNavigationCategory.cs b/AdminSrc/AdminDomain/Admin/ENum/EnumNavigationCategory.cs new file mode 100644 index 0000000..dcdddaa --- /dev/null +++ b/AdminSrc/AdminDomain/Admin/ENum/EnumNavigationCategory.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Domain.Admin.Admin.ENum +{ + public enum EnumNavigationCategory + { + [Description("后台菜单")] + System, + + [Description("前台菜单")] + Customer + } + +} diff --git a/AdminSrc/AdminDomain/Admin/ENum/EnumOperationModule.cs b/AdminSrc/AdminDomain/Admin/ENum/EnumOperationModule.cs new file mode 100644 index 0000000..900e40f --- /dev/null +++ b/AdminSrc/AdminDomain/Admin/ENum/EnumOperationModule.cs @@ -0,0 +1,43 @@ +using System.ComponentModel; + +namespace Domain.Admin.Admin.ENum +{ + public enum EnumOperationModule + { + [Description("用户管理")] + User = 1, + + [Description("系统用户")] + SystemUser = 2, + + [Description("角色管理")] + Role = 3, + + [Description("菜单管理")] + Navigation = 4, + + [Description("字典管理")] + Dictionary = 5, + + [Description("游戏配置")] + GameConfig = 6, + + [Description("房间管理")] + Room = 7, + + [Description("客服管理")] + Customer = 8, + + [Description("靓号管理")] + BeautifulNumber = 9, + + [Description("公告管理")] + Notice = 10, + + [Description("任务管理")] + Task = 11, + + [Description("其他")] + Other = 99 + } +} diff --git a/AdminSrc/AdminDomain/Admin/ENum/EnumResource.cs b/AdminSrc/AdminDomain/Admin/ENum/EnumResource.cs new file mode 100644 index 0000000..6e48aae --- /dev/null +++ b/AdminSrc/AdminDomain/Admin/ENum/EnumResource.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Domain.Admin.Admin.ENum +{ + + public enum EnumResource + { + /// + /// + /// + [Description("菜单")] + Navigation, + /// + /// + /// + [Description("资源")] + Resource, + /// + /// + /// + [Description("代码块")] + Block + } +} diff --git a/AdminSrc/AdminDomain/Admin/IAdminOperationLogService.cs b/AdminSrc/AdminDomain/Admin/IAdminOperationLogService.cs new file mode 100644 index 0000000..14a61e8 --- /dev/null +++ b/AdminSrc/AdminDomain/Admin/IAdminOperationLogService.cs @@ -0,0 +1,11 @@ +using Domain.Admin.Admin; + +namespace Domain.Admin.Admin +{ + public interface IAdminOperationLogService + { + Task AddLog(AdminOperationLog log); + + Task<(List list, long count)> QueryPage(Param.OperationLogQueryParam param); + } +} diff --git a/AdminSrc/AdminDomain/Admin/Param/OperationLogParam.cs b/AdminSrc/AdminDomain/Admin/Param/OperationLogParam.cs new file mode 100644 index 0000000..49b2f1b --- /dev/null +++ b/AdminSrc/AdminDomain/Admin/Param/OperationLogParam.cs @@ -0,0 +1,46 @@ +namespace Domain.Admin.Admin.Param +{ + public class OperationLogQueryParam + { + public int PageIndex { get; set; } = 1; + + public int PageSize { get; set; } = 20; + + public string? AdminId { get; set; } + + public string? AdminName { get; set; } + + public int? Module { get; set; } + + public DateTime? StartTime { get; set; } + + public DateTime? EndTime { get; set; } + + public int? Status { get; set; } + } + + public class AddOperationLogParam + { + public string? AdminId { get; set; } + + public string? AdminName { get; set; } + + public int Module { get; set; } + + public string? ActionType { get; set; } + + public string? Description { get; set; } + + public string? HttpMethod { get; set; } + + public string? RequestPath { get; set; } + + public string? RequestParams { get; set; } + + public string? Response { get; set; } + + public string? Ip { get; set; } + + public int Status { get; set; } = 1; + } +} diff --git a/AdminSrc/AdminDomain/Admin/SystemDic.cs b/AdminSrc/AdminDomain/Admin/SystemDic.cs new file mode 100644 index 0000000..680bbb3 --- /dev/null +++ b/AdminSrc/AdminDomain/Admin/SystemDic.cs @@ -0,0 +1,46 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; + +namespace Domain.Admin.Admin +{ + [BsonCollection("system_user_dic", ServiceDatabases.Admin)] + [BsonIgnoreExtraElements] + public class SystemDic :MongoBaseEntity + { + + public string ParentId { set; get; } = ""; + + [BsonElement("rolename")] + public string? Name { get; set; } + + [BsonElement("order")] + public int Order { get; set; } + + [BsonElement("icon")] + public string? Icon { get; set; } + + [BsonElement("value")] + public string? Value { get; set; } + [BsonElement("code")] + public string? Code { get; set; } + + [BsonElement("remark")] + public string? Remark { get; set; } + + + + [BsonElement("remark1")] + public string? Remark1 { get; set; } + + public void Init() + { + Id = ObjectId.GenerateNewId().ToString(); + } + + } + + +} diff --git a/AdminSrc/AdminDomain/Admin/SystemNavigation.cs b/AdminSrc/AdminDomain/Admin/SystemNavigation.cs new file mode 100644 index 0000000..3203c5a --- /dev/null +++ b/AdminSrc/AdminDomain/Admin/SystemNavigation.cs @@ -0,0 +1,45 @@ +using Domain.Admin.Admin.ENum; +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; + +namespace Domain.Admin.Admin +{ + [BsonCollection("system_user_nav", ServiceDatabases.Admin)] + [BsonIgnoreExtraElements] + public class SystemNavigation :MongoBaseEntity + { + + [BsonElement("parentId")] + public string ParentId { set; get; } = ""; + + [BsonElement("name")] + public string? Name { get; set; } + + [BsonElement("order")] + public int Order { get; set; } + + [BsonElement("icon")] + public string? Icon { get; set; } + + [BsonElement("url")] + public string? Url { get; set; } + + [BsonElement("category")] + public EnumNavigationCategory Category { get; set; } + + [BsonElement("target")] + public string? Target { get; set; } + + [BsonElement("isresource")] + public EnumResource IsResource { get; set; } + public void Init() + { + Id = ObjectId.GenerateNewId().ToString(); + } + } + + +} diff --git a/AdminSrc/AdminDomain/Admin/SystemUser.cs b/AdminSrc/AdminDomain/Admin/SystemUser.cs new file mode 100644 index 0000000..ca17cf7 --- /dev/null +++ b/AdminSrc/AdminDomain/Admin/SystemUser.cs @@ -0,0 +1,47 @@ +using Common.CommonModel; +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; + +namespace Domain.Admin.Admin +{ + [BsonCollection("system_user", ServiceDatabases.Admin)] + [BsonIgnoreExtraElements] + public class SystemUser:MongoBaseEntity + { + [BsonElement("username")] + public string? UserName { get; set; } + + + [BsonElement("displayname")] + public string? DisplayName { get; set; } + + [BsonElement("icon")] + public string? Icon { get; set; } + + [BsonElement("password")] + public string? Password { get; set; } + + + [BsonElement("registertime")] + [BsonDateTimeOptions(Kind = DateTimeKind.Local, DateOnly = false)] + public DateTime RegisterTime { get; set; } = DateTime.Now; + + [BsonElement("state")] + public int State { get; set; } = 1; + + [BsonElement("systemrole")] + public BaseIdName SystemRole { get; set; } + + + public void Init() + { + Id = ObjectId.GenerateNewId().ToString(); + State = 1; + RegisterTime=DateTime.Now; + } + + } +} diff --git a/AdminSrc/AdminDomain/Admin/SystemUserRole.cs b/AdminSrc/AdminDomain/Admin/SystemUserRole.cs new file mode 100644 index 0000000..607a9e1 --- /dev/null +++ b/AdminSrc/AdminDomain/Admin/SystemUserRole.cs @@ -0,0 +1,30 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; + +namespace Domain.Admin.Admin +{ + [BsonCollection("system_user_role", ServiceDatabases.Admin)] + [BsonIgnoreExtraElements] + public class SystemUserRole:MongoBaseEntity + { + [BsonElement("rolename")] + public string? RoleName { get; set; } + + [BsonElement("description")] + public string? Description { get; set; } + + + [BsonElement("navIds")] + public List NavIds { get; set; } = new List(); + + public void Init() + { + Id = ObjectId.GenerateNewId().ToString(); + NavIds = new List(); + } + + } +} diff --git a/AdminSrc/AdminDomain/AdminDomain.csproj b/AdminSrc/AdminDomain/AdminDomain.csproj new file mode 100644 index 0000000..e1cdeda --- /dev/null +++ b/AdminSrc/AdminDomain/AdminDomain.csproj @@ -0,0 +1,19 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + diff --git a/AdminSrc/AdminDomain/BeautifulNumber/BeautifulNumberConfig.cs b/AdminSrc/AdminDomain/BeautifulNumber/BeautifulNumberConfig.cs new file mode 100644 index 0000000..8a8c1b2 --- /dev/null +++ b/AdminSrc/AdminDomain/BeautifulNumber/BeautifulNumberConfig.cs @@ -0,0 +1,50 @@ +using AdminDomain.BeautifulNumber; +using Common.Utils; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; + +namespace AdminDomain.Entity +{ + [BsonCollection("beautiful_number_config", ServiceDatabases.Admin)] + [BsonIgnoreExtraElements] + public class BeautifulNumberConfig : MongoBaseEntity + { + public string Number { get; set; } + public string RuleName { get; set; } + + public string Level { get; set; } + + public long Price { get; set; } + + public BeautifulNumberStatus Status { get; set; }= BeautifulNumberStatus.Available; + + public long SaleTime { get; set; } = 0; + + public string BuyerUserId { get; set; } + + public string UserId { get; set; } + + public string Remark { get; set; } + + public long CreateTime { get; set; } = DateTime.Now.ToTimeStamp(); + } + + [BsonCollection("beautiful_number_rule", ServiceDatabases.Admin)] + [BsonIgnoreExtraElements] + public class BeautifulNumberRule : MongoBaseEntity + { + + public string RuleName { get; set; } + + + public string Level { get; set; } + + public long Price { get; set; } + + public int Sort { get; set; } + + public bool IsEnable { get; set; } = true; + } +} diff --git a/AdminSrc/AdminDomain/BeautifulNumber/BeautifulNumberRuleEnum.cs b/AdminSrc/AdminDomain/BeautifulNumber/BeautifulNumberRuleEnum.cs new file mode 100644 index 0000000..686c237 --- /dev/null +++ b/AdminSrc/AdminDomain/BeautifulNumber/BeautifulNumberRuleEnum.cs @@ -0,0 +1,94 @@ +using System.ComponentModel; + +namespace AdminDomain.BeautifulNumber +{ + public enum BeautifulNumberRuleEnum + { + [Description("普通号")] + Normal = 0, + + [Description("3连号")] + TripleRepeat = 1, + + [Description("4连号")] + QuadrupleRepeat = 2, + + [Description("5连号")] + QuintupleRepeat = 3, + + [Description("6连号")] + SextupleRepeat = 4, + + [Description("7连号")] + SeptupleRepeat = 5, + + [Description("4顺子")] + Straight4 = 10, + + [Description("5顺子")] + Straight5 = 11, + + [Description("6顺子")] + Straight6 = 12, + + [Description("双连2组")] + DoubleRepeat2 = 20, + + [Description("双连3组")] + DoubleRepeat3 = 21, + + [Description("双连4组")] + DoubleRepeat4 = 22, + + [Description("混搭")] + Mixed = 30, + + [Description("5连+3任意")] + QuintupleWithAny = 31, + + [Description("3任意+5连")] + AnyWithQuintuple = 32, + + [Description("夹心3连")] + SandwichTriple = 40, + + [Description("间隔2连")] + Alternating2 = 41, + + [Description("对称3连")] + SymmetricTriple = 42 + } + + public enum BeautifulNumberLevel + { + [Description("D")] + D = 0, + + [Description("C")] + C = 1, + + [Description("B")] + B = 2, + + [Description("A")] + A = 3, + + [Description("S")] + S = 4 + } + + public enum BeautifulNumberStatus + { + [Description("未售")] + Available = 0, + + [Description("已售")] + Sold = 1, + + [Description("冻结")] + Frozen = 2, + + [Description("普通号")] + Normal = 3 + } +} diff --git a/AdminSrc/AdminDomain/Customer/ICustomerService.cs b/AdminSrc/AdminDomain/Customer/ICustomerService.cs new file mode 100644 index 0000000..7b9624b --- /dev/null +++ b/AdminSrc/AdminDomain/Customer/ICustomerService.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using AdminDomain.Customer.Param; +using CustomerService.Domain.Entity; + +namespace AdminDomain.Customer +{ + public interface ICustomerService + { + Task<(bool isOk, string msg, CustomerEntity? customer)> AddCustomer(AddCustomerParam param); + Task<(bool isOk, string msg)> UpdateCustomer(UpdateCustomerParam param); + Task<(bool isOk, string msg)> DeleteCustomer(string id); + Task<(bool isOk, string msg, List? customers, int total)> GetCustomerList(GetCustomerListParam param); + Task<(bool isOk, string msg, CustomerEntity? customer)> GetCustomerById(string id); + Task<(bool isOk, string msg, ConversationEntity? conversation)> GetConversationById(string id); + Task<(bool isOk, string msg, List? conversations, int total)> GetConversationList(GetConversationListParam param); + Task<(bool isOk, string msg)> DeleteConversation(string conversationId); + Task<(bool isOk, string msg, List? messages)> GetChatLog(string conversationId); + Task<(bool isOk, string msg)> DeleteMessage(string id); + Task<(bool isOk, string msg)> DeleteAllMessages(string conversationId); + Task<(bool isOk, string msg)> DeleteMessagesBatch(List ids); + } +} diff --git a/AdminSrc/AdminDomain/Customer/Param/CustomerParam.cs b/AdminSrc/AdminDomain/Customer/Param/CustomerParam.cs new file mode 100644 index 0000000..345b10d --- /dev/null +++ b/AdminSrc/AdminDomain/Customer/Param/CustomerParam.cs @@ -0,0 +1,36 @@ +using System; + +namespace AdminDomain.Customer.Param +{ + public class AddCustomerParam + { + public string UserId { get; set; } = ""; + public string UserName { get; set; } = ""; + public string? Avatar { get; set; } + } + + public class UpdateCustomerParam + { + public string Id { get; set; } = ""; + public string UserName { get; set; } = ""; + public string? Avatar { get; set; } + public int Status { get; set; } + } + + public class GetCustomerListParam + { + public int PageIndex { get; set; } = 1; + public int PageSize { get; set; } = 10; + public string? UserName { get; set; } + public int? Status { get; set; } + } + + public class GetConversationListParam + { + public int PageIndex { get; set; } = 1; + public int PageSize { get; set; } = 10; + public string? UserId { get; set; } + public string? CustomerId { get; set; } + public int? Status { get; set; } + } +} diff --git a/AdminSrc/AdminDomain/Notices/NoticeDtos.cs b/AdminSrc/AdminDomain/Notices/NoticeDtos.cs new file mode 100644 index 0000000..6f28d8c --- /dev/null +++ b/AdminSrc/AdminDomain/Notices/NoticeDtos.cs @@ -0,0 +1,33 @@ +using System; + +namespace Domain.Admin.Notices; + +public class NoticeDto +{ + public string Id { get; set; } + + public string Title { get; set; } + + public string Content { get; set; } + + public string? Recommend { get; set; } + + public string? TopImage { get; set; } + + public List? ContentImages { get; set; } + + public long CreateTime { get; set; } +} + +public class NoticeListItemDto +{ + public string Id { get; set; } + + public string Title { get; set; } + + public string? Recommend { get; set; } + + public string? TopImage { get; set; } + + public long CreateTime { get; set; } +} diff --git a/AdminSrc/AdminHost/.dockerignore b/AdminSrc/AdminHost/.dockerignore new file mode 100644 index 0000000..fe1152b --- /dev/null +++ b/AdminSrc/AdminHost/.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/AdminSrc/AdminHost/AdminHost.csproj b/AdminSrc/AdminHost/AdminHost.csproj new file mode 100644 index 0000000..523824b --- /dev/null +++ b/AdminSrc/AdminHost/AdminHost.csproj @@ -0,0 +1,54 @@ + + + + net8.0 + enable + enable + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Always + + + Always + + + + + + + + + + + + + diff --git a/AdminSrc/AdminHost/Config/activityconfig.json b/AdminSrc/AdminHost/Config/activityconfig.json new file mode 100644 index 0000000..156942c --- /dev/null +++ b/AdminSrc/AdminHost/Config/activityconfig.json @@ -0,0 +1,5065 @@ +{ + "BattleOrderConfig": { + "IsOpen": true, + "EndTime": 1786111155, + "RuleDesc": "完成每日任务获得战令经验,升级领取奖励", + "BuyDesc": "购买战令等级,快速提升战力", + "AdvanceGiftDesc": "购买进阶获得更多豪华奖励", + "LevelConfig": [ + { + "Level": 1, + "Exp": 100, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 100 + }, + { + "Level": 2, + "Exp": 200, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 200 + }, + { + "Level": 3, + "Exp": 300, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 300 + }, + { + "Level": 4, + "Exp": 400, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 400 + }, + { + "Level": 5, + "Exp": 500, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 500 + }, + { + "Level": 6, + "Exp": 600, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 2, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 600 + }, + { + "Level": 7, + "Exp": 700, + "NormalGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 700 + }, + { + "Level": 8, + "Exp": 800, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "16015", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "17031", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 1000000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 800 + }, + { + "Level": 9, + "Exp": 900, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 900 + }, + { + "Level": 10, + "Exp": 1000, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 1000 + }, + { + "Level": 11, + "Exp": 1100, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 1100 + }, + { + "Level": 12, + "Exp": 1200, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 1200 + }, + { + "Level": 13, + "Exp": 1300, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 1300 + }, + { + "Level": 14, + "Exp": 1400, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 2, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 1400 + }, + { + "Level": 15, + "Exp": 1500, + "NormalGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 1500 + }, + { + "Level": 16, + "Exp": 1600, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "16015", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "17031", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 1000000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 1600 + }, + { + "Level": 17, + "Exp": 1700, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 1700 + }, + { + "Level": 18, + "Exp": 1800, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 1800 + }, + { + "Level": 19, + "Exp": 1900, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 1900 + }, + { + "Level": 20, + "Exp": 2000, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 2000 + }, + { + "Level": 21, + "Exp": 2100, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 2100 + }, + { + "Level": 22, + "Exp": 2200, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 2, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 2200 + }, + { + "Level": 23, + "Exp": 2300, + "NormalGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 2300 + }, + { + "Level": 24, + "Exp": 2400, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "16015", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "17031", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 1000000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 2400 + }, + { + "Level": 25, + "Exp": 2500, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 2500 + }, + { + "Level": 26, + "Exp": 2600, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 2600 + }, + { + "Level": 27, + "Exp": 2700, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 2700 + }, + { + "Level": 28, + "Exp": 2800, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 2800 + }, + { + "Level": 29, + "Exp": 2900, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 2900 + }, + { + "Level": 30, + "Exp": 3000, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 2, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 3000 + }, + { + "Level": 31, + "Exp": 3100, + "NormalGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 3100 + }, + { + "Level": 32, + "Exp": 3200, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "16015", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "17031", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 1000000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 3200 + }, + { + "Level": 33, + "Exp": 3300, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 3300 + }, + { + "Level": 34, + "Exp": 3400, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 3400 + }, + { + "Level": 35, + "Exp": 3500, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 3500 + }, + { + "Level": 36, + "Exp": 3600, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 3600 + }, + { + "Level": 37, + "Exp": 3700, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 3700 + }, + { + "Level": 38, + "Exp": 3800, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 2, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 3800 + }, + { + "Level": 39, + "Exp": 3900, + "NormalGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 3900 + }, + { + "Level": 40, + "Exp": 4000, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "16015", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "17031", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 1000000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 4000 + }, + { + "Level": 41, + "Exp": 4100, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 4100 + }, + { + "Level": 42, + "Exp": 4200, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 4200 + }, + { + "Level": 43, + "Exp": 4300, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 4300 + }, + { + "Level": 44, + "Exp": 4400, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 4400 + }, + { + "Level": 45, + "Exp": 4500, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 4500 + }, + { + "Level": 46, + "Exp": 4600, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 2, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 4600 + }, + { + "Level": 47, + "Exp": 4700, + "NormalGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 4700 + }, + { + "Level": 48, + "Exp": 4800, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "16015", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "17031", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 1000000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 4800 + }, + { + "Level": 49, + "Exp": 4900, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 4900 + }, + { + "Level": 50, + "Exp": 5000, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 5000 + }, + { + "Level": 51, + "Exp": 5100, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 5100 + }, + { + "Level": 52, + "Exp": 5200, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 5200 + }, + { + "Level": 53, + "Exp": 5300, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 5300 + }, + { + "Level": 54, + "Exp": 5400, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 2, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 5400 + }, + { + "Level": 55, + "Exp": 5500, + "NormalGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 5500 + }, + { + "Level": 56, + "Exp": 5600, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "16015", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "17031", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 1000000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 5600 + }, + { + "Level": 57, + "Exp": 5700, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40005", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40005", + "IsRandom": false, + "Count": 2, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40005", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 5700 + }, + { + "Level": 58, + "Exp": 5800, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 5800 + }, + { + "Level": 59, + "Exp": 5900, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 5900 + }, + { + "Level": 60, + "Exp": 6000, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 6000 + }, + { + "Level": 61, + "Exp": 6100, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 6100 + }, + { + "Level": 62, + "Exp": 6200, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 6200 + }, + { + "Level": 63, + "Exp": 6300, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 2, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 6300 + }, + { + "Level": 64, + "Exp": 6400, + "NormalGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 6400 + }, + { + "Level": 65, + "Exp": 6500, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "16015", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "17031", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 1000000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 6500 + }, + { + "Level": 66, + "Exp": 6600, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 6600 + }, + { + "Level": 67, + "Exp": 6700, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 6700 + }, + { + "Level": 68, + "Exp": 6800, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 6800 + }, + { + "Level": 69, + "Exp": 6900, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 6900 + }, + { + "Level": 70, + "Exp": 7000, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 7000 + }, + { + "Level": 71, + "Exp": 7100, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 2, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 7100 + }, + { + "Level": 72, + "Exp": 7200, + "NormalGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 7200 + }, + { + "Level": 73, + "Exp": 7300, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "16015", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "17031", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 1000000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 7300 + }, + { + "Level": 74, + "Exp": 7400, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 7400 + }, + { + "Level": 75, + "Exp": 7500, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 7500 + }, + { + "Level": 76, + "Exp": 7600, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 7600 + }, + { + "Level": 77, + "Exp": 7700, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 7700 + }, + { + "Level": 78, + "Exp": 7800, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 7800 + }, + { + "Level": 79, + "Exp": 7900, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 2, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 7900 + }, + { + "Level": 80, + "Exp": 8000, + "NormalGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 8000 + }, + { + "Level": 81, + "Exp": 8100, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "16015", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "17031", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 1000000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 8100 + }, + { + "Level": 82, + "Exp": 8200, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 8200 + }, + { + "Level": 83, + "Exp": 8300, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 8300 + }, + { + "Level": 84, + "Exp": 8400, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 8400 + }, + { + "Level": 85, + "Exp": 8500, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 8500 + }, + { + "Level": 86, + "Exp": 8600, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 8600 + }, + { + "Level": 87, + "Exp": 8700, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 2, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 8700 + }, + { + "Level": 88, + "Exp": 8800, + "NormalGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 8800 + }, + { + "Level": 89, + "Exp": 8900, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "16015", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "17031", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 1000000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 8900 + }, + { + "Level": 90, + "Exp": 9000, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 9000 + }, + { + "Level": 91, + "Exp": 9100, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 9100 + }, + { + "Level": 92, + "Exp": 9200, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 9200 + }, + { + "Level": 93, + "Exp": 9300, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 9300 + }, + { + "Level": 94, + "Exp": 9400, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 9400 + }, + { + "Level": 95, + "Exp": 9500, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 2, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 3, + "OtherId": "40006", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 9500 + }, + { + "Level": 96, + "Exp": 9600, + "NormalGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 9600 + }, + { + "Level": 97, + "Exp": 9700, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "16015", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "17031", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 1000000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 9700 + }, + { + "Level": 98, + "Exp": 9800, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 9800 + }, + { + "Level": 99, + "Exp": 9900, + "NormalGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 100000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 200000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 9900 + }, + { + "Level": 100, + "Exp": 10000, + "NormalGiftList": [ + { + "Type": 3, + "OtherId": "11032", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "LuxuryGiftList": [ + { + "Type": 3, + "OtherId": "12019", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "SupremeGiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 300000, + "MinCount": 0, + "MaxCount": 0 + } + ], + "PayType": 1, + "PayCount": 10000 + } + ], + "AdvanceGift": [ + { + "Type": 1, + "Name": "豪华战令", + "Count": 100, + "ImageUrl": "", + "PayType": 1, + "PayCount": 1000000, + "GiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 1000, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "碎片", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "Type": 2, + "Name": "至尊战令", + "Count": 100, + "ImageUrl": "", + "PayType": 2, + "PayCount": 10000, + "GiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 1000, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "碎片", + "IsRandom": false, + "Count": 6, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "Type": 3, + "Name": "豪华+至尊战令", + "Count": 200, + "ImageUrl": "", + "PayType": 3, + "PayCount": 1000, + "GiftList": [ + { + "Type": 1, + "OtherId": "", + "IsRandom": false, + "Count": 1000, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "碎片", + "IsRandom": false, + "Count": 7, + "MinCount": 0, + "MaxCount": 0 + } + ] + } + ] + }, + "ReliefConfig": { + "IsOpen": true, + "Gold": 100000, + "Count": 3, + "Limit": 10000 + }, + "SignConfigs": [ + { + "Order": 70000, + "Gold": 2000, + "Name": "2千", + "Icon": "/uploads/70000.png", + "Probability": 0.01 + }, + { + "Order": 70001, + "Gold": 800, + "Name": "8佰", + "Icon": "/uploads/70001.png", + "Probability": 0.09 + }, + { + "Order": 70002, + "Gold": 400, + "Name": "4佰", + "Icon": "/uploads/70002.png", + "Probability": 0.09 + }, + { + "Order": 70003, + "Gold": 200, + "Name": "2佰", + "Icon": "/uploads/70003.png", + "Probability": 0.05 + }, + { + "Order": 70004, + "Gold": 1000, + "Name": "1千", + "Icon": "/uploads/70004.png", + "Probability": 0.05 + }, + { + "Order": 70005, + "Gold": 800, + "Name": "8佰", + "Icon": "/uploads/70005.png", + "Probability": 0.09 + }, + { + "Order": 70006, + "Gold": 400, + "Name": "4佰", + "Icon": "/uploads/70006.png", + "Probability": 0.09 + }, + { + "Order": 70007, + "Gold": 200, + "Name": "2佰", + "Icon": "/uploads/70007.png", + "Probability": 0.05 + }, + { + "Order": 70008, + "Gold": 2000, + "Name": "2千", + "Icon": "/uploads/70008.png", + "Probability": 0.01 + }, + { + "Order": 70009, + "Gold": 1000, + "Name": "1千", + "Icon": "/uploads/70009.png", + "Probability": 0.05 + }, + { + "Order": 70010, + "Gold": 400, + "Name": "4佰", + "Icon": "/uploads/70010.png", + "Probability": 0.09 + }, + { + "Order": 70011, + "Gold": 200, + "Name": "2佰", + "Icon": "/uploads/70011.png?timespan=1784483834", + "Probability": 0.05 + }, + { + "Order": 70012, + "Gold": 800, + "Name": "8佰", + "Icon": "/uploads/70012.png?timespan=1784483840", + "Probability": 0.09 + }, + { + "Order": 70013, + "Gold": 1000, + "Name": "1千", + "Icon": "/uploads/70013.png?timespan=1784483847", + "Probability": 0.05 + }, + { + "Order": 70014, + "Gold": 400, + "Name": "4佰", + "Icon": "/uploads/70014.png?timespan=1784483852", + "Probability": 0.09 + }, + { + "Order": 70015, + "Gold": 200, + "Name": "2佰", + "Icon": "/uploads/70015.png?timespan=1784483858", + "Probability": 0.05 + } + ], + "GoldShopConfigs": [ + { + "Number": "70001", + "Name": "100万金币", + "Icon": "/uploads/70001.png", + "Gold": 1000000, + "Diamond": 100, + "DealerDiamond": 0, + "IsFirst": false + }, + { + "Number": "70002", + "Name": "500万金币", + "Icon": "/uploads/70002.png", + "Gold": 5000000, + "Diamond": 500, + "DealerDiamond": 0, + "IsFirst": false + }, + { + "Number": "70003", + "Name": "1000万金币", + "Icon": "/uploads/70003.png", + "Gold": 10000000, + "Diamond": 1000, + "DealerDiamond": 0, + "IsFirst": false + }, + { + "Number": "70004", + "Name": "2000万金币", + "Icon": "/uploads/70004.png", + "Gold": 20000000, + "Diamond": 2000, + "DealerDiamond": 0, + "IsFirst": false + }, + { + "Number": "70005", + "Name": "5000万金币", + "Icon": "/uploads/70005.png", + "Gold": 50000000, + "Diamond": 5000, + "DealerDiamond": 0, + "IsFirst": false + }, + { + "Number": "70006", + "Name": "1亿金币", + "Icon": "/uploads/70006.png", + "Gold": 100000000, + "Diamond": 10000, + "DealerDiamond": 0, + "IsFirst": false + } + ], + "DiamondShopConfigs": [ + { + "Number": "80001", + "Name": "100钻石", + "Icon": "/uploads/80001.png", + "Diamond": 100, + "Money": 1, + "DealerMoney": 0, + "IsFirst": false + }, + { + "Number": "80002", + "Name": "500钻石", + "Icon": "/uploads/80002.png", + "Diamond": 500, + "Money": 5, + "DealerMoney": 0, + "IsFirst": false + }, + { + "Number": "80003", + "Name": "1000钻石", + "Icon": "/uploads/80003.png", + "Diamond": 1000, + "Money": 10, + "DealerMoney": 0, + "IsFirst": false + }, + { + "Number": "80004", + "Name": "2000钻石", + "Icon": "/uploads/80004.png", + "Diamond": 2000, + "Money": 20, + "DealerMoney": 0, + "IsFirst": false + }, + { + "Number": "80005", + "Name": "5000钻石", + "Icon": "/uploads/80005.png", + "Diamond": 5000, + "Money": 50, + "DealerMoney": 0, + "IsFirst": false + }, + { + "Number": "80006", + "Name": "10000钻石", + "Icon": "/uploads/80006.png", + "Diamond": 10000, + "Money": 100, + "DealerMoney": 0, + "IsFirst": false + } + ], + "RegisterConfig": { + "InitGold": 10000, + "InitDiamond": 100, + "InitProductList": [ + { + "Count": 1, + "Number": "11001", + "Name": "深海之眼", + "Desc": "深海之眼", + "ImageUrl": "/uploads/11001.png", + "Type": 1, + "Level": 0 + } + ] + }, + "FishingReturnConfig": { + "IsEnabled": false, + "ReturnRate": 0.001, + "DailyMaxReturn": 0 + }, + "LotteryActivityConfig": { + "ActivityName": "", + "IsOpen": false, + "StartTime": 0, + "EndTime": 0, + "Pools": [], + "Costs": [ + 100, + 200, + 300, + 500, + 800, + 1000 + ], + "UserMaxDraw": 100 + }, + "RankingRewardConfig": { + "IsEnabled": true, + "Groups": [ + { + "RankingType": 1, + "Name": "金币达人榜", + "Rewards": [ + { + "RankMin": 1, + "RankMax": 1, + "Gold": 65000, + "Diamond": 50, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 2, + "RankMax": 2, + "Gold": 45000, + "Diamond": 50, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 3, + "RankMax": 3, + "Gold": 30000, + "Diamond": 50, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 4, + "RankMax": 4, + "Gold": 20000, + "Diamond": 50, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 5, + "RankMax": 5, + "Gold": 15000, + "Diamond": 50, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 6, + "RankMax": 6, + "Gold": 12000, + "Diamond": 30, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 7, + "RankMax": 7, + "Gold": 10000, + "Diamond": 30, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 8, + "RankMax": 8, + "Gold": 8000, + "Diamond": 30, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 9, + "RankMax": 9, + "Gold": 6000, + "Diamond": 30, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 10, + "RankMax": 10, + "Gold": 5000, + "Diamond": 30, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 11, + "RankMax": 11, + "Gold": 3000, + "Diamond": 20, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 12, + "RankMax": 12, + "Gold": 2000, + "Diamond": 20, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 13, + "RankMax": 13, + "Gold": 1500, + "Diamond": 20, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 14, + "RankMax": 14, + "Gold": 1200, + "Diamond": 20, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 15, + "RankMax": 15, + "Gold": 1000, + "Diamond": 20, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ] + } + ] + }, + { + "RankingType": 2, + "Name": "等级达人榜", + "Rewards": [ + { + "RankMin": 1, + "RankMax": 1, + "Gold": 65000, + "Diamond": 50, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 2, + "RankMax": 2, + "Gold": 45000, + "Diamond": 50, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 3, + "RankMax": 3, + "Gold": 30000, + "Diamond": 50, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 4, + "RankMax": 4, + "Gold": 20000, + "Diamond": 50, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 5, + "RankMax": 5, + "Gold": 15000, + "Diamond": 50, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 6, + "RankMax": 6, + "Gold": 12000, + "Diamond": 30, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 7, + "RankMax": 7, + "Gold": 10000, + "Diamond": 30, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 8, + "RankMax": 8, + "Gold": 8000, + "Diamond": 30, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 9, + "RankMax": 9, + "Gold": 6000, + "Diamond": 30, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 10, + "RankMax": 10, + "Gold": 5000, + "Diamond": 30, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 11, + "RankMax": 11, + "Gold": 3000, + "Diamond": 20, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 12, + "RankMax": 12, + "Gold": 2000, + "Diamond": 20, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 13, + "RankMax": 13, + "Gold": 1500, + "Diamond": 20, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 14, + "RankMax": 14, + "Gold": 1200, + "Diamond": 20, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 15, + "RankMax": 15, + "Gold": 1000, + "Diamond": 20, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ] + } + ] + }, + { + "RankingType": 3, + "Name": "当日积分榜", + "Rewards": [ + { + "RankMin": 1, + "RankMax": 1, + "Gold": 65000, + "Diamond": 50, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 2, + "RankMax": 2, + "Gold": 45000, + "Diamond": 50, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 3, + "RankMax": 3, + "Gold": 30000, + "Diamond": 50, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 4, + "RankMax": 4, + "Gold": 20000, + "Diamond": 50, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 5, + "RankMax": 5, + "Gold": 15000, + "Diamond": 50, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 6, + "RankMax": 6, + "Gold": 12000, + "Diamond": 30, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 7, + "RankMax": 7, + "Gold": 10000, + "Diamond": 30, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 8, + "RankMax": 8, + "Gold": 8000, + "Diamond": 30, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 8, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 9, + "RankMax": 9, + "Gold": 6000, + "Diamond": 30, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 10, + "RankMax": 10, + "Gold": 5000, + "Diamond": 30, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 11, + "RankMax": 11, + "Gold": 3000, + "Diamond": 20, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 12, + "RankMax": 12, + "Gold": 2000, + "Diamond": 20, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 13, + "RankMax": 13, + "Gold": 1500, + "Diamond": 20, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 14, + "RankMax": 14, + "Gold": 1200, + "Diamond": 20, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "RankMin": 15, + "RankMax": 15, + "Gold": 1000, + "Diamond": 20, + "Items": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 3, + "MinCount": 0, + "MaxCount": 0 + } + ] + } + ] + } + ] + }, + "Id": "061fa16e105d4e3ea54dc648c44a7f89", + "IsDelete": false, + "CreateInfo": null +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/Config/gameconfig.json b/AdminSrc/AdminHost/Config/gameconfig.json new file mode 100644 index 0000000..26b3f4a --- /dev/null +++ b/AdminSrc/AdminHost/Config/gameconfig.json @@ -0,0 +1,24980 @@ +{ + "FishTypeConfigs": [ + { + "FishNumber": "11001", + "FishName": "彩虹鱼", + "FishBrief": "", + "FishType": 1, + "FishScore": 2, + "KillWeight": 5000, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "11001.png", + "FishMultipleDesc": "2倍" + }, + { + "FishNumber": "11002", + "FishName": "小丑鱼", + "FishBrief": "", + "FishType": 1, + "FishScore": 3, + "KillWeight": 3333, + "PathList": [ + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16 + ], + "FishImage": "11002.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "11003", + "FishName": "热带鱼", + "FishBrief": "", + "FishType": 1, + "FishScore": 4, + "KillWeight": 2500, + "PathList": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ], + "FishImage": "11003.png", + "FishMultipleDesc": "4倍" + }, + { + "FishNumber": "11004", + "FishName": "乌贼", + "FishBrief": "", + "FishType": 1, + "FishScore": 5, + "KillWeight": 2000, + "PathList": [ + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32 + ], + "FishImage": "11004.png", + "FishMultipleDesc": "5倍" + }, + { + "FishNumber": "11005", + "FishName": "箭鱼", + "FishBrief": "", + "FishType": 1, + "FishScore": 6, + "KillWeight": 1666, + "PathList": [ + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40 + ], + "FishImage": "11005.png", + "FishMultipleDesc": "6倍" + }, + { + "FishNumber": "11006", + "FishName": "斑点鱼", + "FishBrief": "", + "FishType": 1, + "FishScore": 7, + "KillWeight": 1428, + "PathList": [ + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48 + ], + "FishImage": "11006.png", + "FishMultipleDesc": "7倍" + }, + { + "FishNumber": "11007", + "FishName": "海龟", + "FishBrief": "", + "FishType": 1, + "FishScore": 8, + "KillWeight": 1250, + "PathList": [ + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56 + ], + "FishImage": "11007.png", + "FishMultipleDesc": "8倍" + }, + { + "FishNumber": "11008", + "FishName": "小河豚", + "FishBrief": "", + "FishType": 1, + "FishScore": 10, + "KillWeight": 1000, + "PathList": [ + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64 + ], + "FishImage": "11008.png", + "FishMultipleDesc": "10倍" + }, + { + "FishNumber": "11009", + "FishName": "蝴蝶鱼", + "FishBrief": "", + "FishType": 1, + "FishScore": 12, + "KillWeight": 833, + "PathList": [ + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72 + ], + "FishImage": "11009.png", + "FishMultipleDesc": "12倍" + }, + { + "FishNumber": "11010", + "FishName": "裙摆鱼", + "FishBrief": "", + "FishType": 1, + "FishScore": 15, + "KillWeight": 666, + "PathList": [ + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80 + ], + "FishImage": "11010.png", + "FishMultipleDesc": "15倍" + }, + { + "FishNumber": "11011", + "FishName": "水母", + "FishBrief": "", + "FishType": 1, + "FishScore": 18, + "KillWeight": 555, + "PathList": [ + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88 + ], + "FishImage": "11011.png", + "FishMultipleDesc": "18倍" + }, + { + "FishNumber": "11012", + "FishName": "海马", + "FishBrief": "", + "FishType": 1, + "FishScore": 20, + "KillWeight": 500, + "PathList": [ + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96 + ], + "FishImage": "11012.png", + "FishMultipleDesc": "20倍" + }, + { + "FishNumber": "11013", + "FishName": "锅盔鱼", + "FishBrief": "", + "FishType": 1, + "FishScore": 25, + "KillWeight": 400, + "PathList": [ + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104 + ], + "FishImage": "11013.png", + "FishMultipleDesc": "25倍" + }, + { + "FishNumber": "11014", + "FishName": "蝙蝠鱼", + "FishBrief": "", + "FishType": 1, + "FishScore": 30, + "KillWeight": 333, + "PathList": [ + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112 + ], + "FishImage": "11014.png", + "FishMultipleDesc": "30倍" + }, + { + "FishNumber": "11015", + "FishName": "锯齿鲨", + "FishBrief": "", + "FishType": 1, + "FishScore": 40, + "KillWeight": 250, + "PathList": [ + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120 + ], + "FishImage": "11015.png", + "FishMultipleDesc": "40倍" + }, + { + "FishNumber": "11016", + "FishName": "鲨鱼", + "FishBrief": "", + "FishType": 1, + "FishScore": 50, + "KillWeight": 222, + "PathList": [ + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128 + ], + "FishImage": "11016.png", + "FishMultipleDesc": "50倍" + }, + { + "FishNumber": "11017", + "FishName": "银绞鲨", + "FishBrief": "", + "FishType": 3, + "FishScore": 60, + "KillWeight": 166, + "PathList": [ + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136 + ], + "FishImage": "11017.png", + "FishMultipleDesc": "60倍" + }, + { + "FishNumber": "11018", + "FishName": "金绞鲨", + "FishBrief": "", + "FishType": 3, + "FishScore": 100, + "KillWeight": 100, + "PathList": [ + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144 + ], + "FishImage": "11018.png", + "FishMultipleDesc": "100倍" + }, + { + "FishNumber": "11019", + "FishName": "黄金锅盔鱼", + "FishBrief": "", + "FishType": 3, + "FishScore": 120, + "KillWeight": 83, + "PathList": [ + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152 + ], + "FishImage": "11019.png", + "FishMultipleDesc": "120倍" + }, + { + "FishNumber": "11020", + "FishName": "金钱龟", + "FishBrief": "", + "FishType": 3, + "FishScore": 150, + "KillWeight": 66, + "PathList": [ + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160 + ], + "FishImage": "11020.png", + "FishMultipleDesc": "150倍" + }, + { + "FishNumber": "11021", + "FishName": "黄金水母", + "FishBrief": "", + "FishType": 3, + "FishScore": 200, + "KillWeight": 50, + "PathList": [ + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168 + ], + "FishImage": "11021.png", + "FishMultipleDesc": "200倍" + }, + { + "FishNumber": "11022", + "FishName": "金龙鱼", + "FishBrief": "", + "FishType": 3, + "FishScore": 250, + "KillWeight": 40, + "PathList": [ + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176 + ], + "FishImage": "11022.png", + "FishMultipleDesc": "250倍" + }, + { + "FishNumber": "11023", + "FishName": "电鳗", + "FishBrief": "发出闪电攻击附近的鱼", + "FishType": 2, + "FishScore": 1, + "KillWeight": 33, + "PathList": [ + 1, + 9, + 41 + ], + "FishImage": "11023.png", + "FishMultipleDesc": "最高360倍" + }, + { + "FishNumber": "11024", + "FishName": "吞噬鲲", + "FishBrief": "其巨大的身体可以吞噬一切", + "FishType": 2, + "FishScore": 1, + "KillWeight": 26, + "PathList": [ + 1, + 2 + ], + "FishImage": "11024.png", + "FishMultipleDesc": "最高500倍" + }, + { + "FishNumber": "11025", + "FishName": "玲珑宝塔", + "FishBrief": "传说中天界重宝,拥有浩大无穷之力,据说能降伏一切妖魔鬼怪。", + "FishType": 2, + "FishScore": 1, + "KillWeight": 15, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "11025.png", + "FishMultipleDesc": "最高1000倍" + }, + { + "FishNumber": "11026", + "FishName": "聚宝盆", + "FishBrief": "含有大量宝物,并且会不断变大,价值连城", + "FishType": 2, + "FishScore": 1, + "KillWeight": 11, + "PathList": [ + 1, + 2 + ], + "FishImage": "11026.png", + "FishMultipleDesc": "最高1200倍" + }, + { + "FishNumber": "11027", + "FishName": "金龙", + "FishBrief": "传说中的神兽,象征着吉祥和尊贵,可上天入海,见首不见尾。捕获后最高可获得500倍奖励。", + "FishType": 2, + "FishScore": 1, + "KillWeight": 26, + "PathList": [], + "FishImage": "11027.png", + "FishMultipleDesc": "最高500倍" + }, + { + "FishNumber": "11028", + "FishName": "神龙转盘", + "FishBrief": "多重元宝转盘", + "FishType": 2, + "FishScore": 1, + "KillWeight": 12, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "11028.png", + "FishMultipleDesc": "最高1000倍" + }, + { + "FishNumber": "11029", + "FishName": "炸弹蟹", + "FishBrief": "背着奇怪装置的半机械螃蟹,捕获后可触发全屏炸弹攻击", + "FishType": 2, + "FishScore": 1, + "KillWeight": 33, + "PathList": [ + 3, + 7, + 17 + ], + "FishImage": "11029.png", + "FishMultipleDesc": "最高360倍" + }, + { + "FishNumber": "11030", + "FishName": "青龙", + "FishBrief": "传说中的神龙,全身凝聚雷电的力量,拥有惊人的破坏力。被捕获后将触发双龙戏珠,雷动九天攻击全场。", + "FishType": 2, + "FishScore": 150, + "KillWeight": 16, + "PathList": [], + "FishImage": "11030.png", + "FishMultipleDesc": "最高1600倍" + }, + { + "FishNumber": "11031", + "FishName": "蟠桃树", + "FishBrief": "先天王水蟠桃树,九千年一熟,食用后可与日月同庚。", + "FishType": 2, + "FishScore": 1, + "KillWeight": 11, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "11031.png", + "FishMultipleDesc": "最高1200倍" + }, + { + "FishNumber": "11032", + "FishName": "激光蟹", + "FishBrief": "背着奇怪装置的半机械螃蟹,捕获后可发射强力激光攻击", + "FishType": 2, + "FishScore": 1, + "KillWeight": 33, + "PathList": [ + 19, + 24, + 26 + ], + "FishImage": "11032.png", + "FishMultipleDesc": "最高360倍" + }, + { + "FishNumber": "11033", + "FishName": "钻头蟹", + "FishBrief": "背着奇怪装置的半机械螃蟹,捕获后可发射弹跳钻头攻击", + "FishType": 4, + "FishScore": 1, + "KillWeight": 33, + "PathList": [ + 32, + 40, + 42 + ], + "FishImage": "11033.png", + "FishMultipleDesc": "最高360倍" + }, + { + "FishNumber": "11034", + "FishName": "荧光水母", + "FishBrief": "散发着荧光变异水母", + "FishType": 2, + "FishScore": 1, + "KillWeight": 10000, + "PathList": [ + 1, + 2 + ], + "FishImage": "11034.png", + "FishMultipleDesc": "最高380倍" + }, + { + "FishNumber": "11035", + "FishName": "远古龙龟", + "FishBrief": "远古之初,有巨龟如巍峨山峦,身披混沌火焰", + "FishType": 2, + "FishScore": 1, + "KillWeight": 10000, + "PathList": [ + 1, + 2 + ], + "FishImage": "11035.png", + "FishMultipleDesc": "最高1200倍" + }, + { + "FishNumber": "11036", + "FishName": "深海灯笼鱼", + "FishBrief": "头悬幽光灯笼,利齿倒钩如囚笼", + "FishType": 2, + "FishScore": 1, + "KillWeight": 26, + "PathList": [ + 1, + 2 + ], + "FishImage": "11036.png", + "FishMultipleDesc": "最高500倍" + }, + { + "FishNumber": "11037", + "FishName": "深渊鳄鱼", + "FishBrief": "冰封巨鳄,被封印在深渊之中", + "FishType": 2, + "FishScore": 1, + "KillWeight": 29, + "PathList": [ + 1, + 2 + ], + "FishImage": "11037.png", + "FishMultipleDesc": "最高380倍" + }, + { + "FishNumber": "11038", + "FishName": "禄存星君", + "FishBrief": "主掌功名利禄的星神其星光辉耀间似蕴含着世间福禄运数的神秘力量。", + "FishType": 2, + "FishScore": 1, + "KillWeight": 8, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "11038.png", + "FishMultipleDesc": "最高1600倍" + }, + { + "FishNumber": "11039", + "FishName": "苍穹之主", + "FishBrief": "以无上的力量盘踞于苍穹之上,掌控着苍穹的风云变幻。", + "FishType": 5, + "FishScore": 2000, + "KillWeight": 1, + "PathList": [], + "FishImage": "11039.png", + "FishMultipleDesc": "最高12000倍" + }, + { + "FishNumber": "11040", + "FishName": "雷霆之主", + "FishBrief": "周身环绕紫色雷霆,一次龙吟,都能引发天地轰鸣,雷霆呼啸", + "FishType": 5, + "FishScore": 2000, + "KillWeight": 1, + "PathList": [], + "FishImage": "11040.png", + "FishMultipleDesc": "最高16000倍" + }, + { + "FishNumber": "11041", + "FishName": "人鱼公主", + "FishBrief": "幽蓝海底的公主,舞姿曼妙,鱼群常伴随它的海螺声出现。", + "FishType": 5, + "FishScore": 1000, + "KillWeight": 1, + "PathList": [], + "FishImage": "11041.png", + "FishMultipleDesc": "最高8000倍" + }, + { + "FishNumber": "11042", + "FishName": "霸王蟹", + "FishBrief": "蟹中之王,喜欢金银珠宝", + "FishType": 2, + "FishScore": 1, + "KillWeight": 10000, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "11042.png", + "FishMultipleDesc": "最高380倍" + }, + { + "FishNumber": "11043", + "FishName": "哥斯拉", + "FishBrief": "身躯如山岳般巍峨,每一步踏出都让大地为之颤抖,喷射出的射线足以燃尽一切", + "FishType": 5, + "FishScore": 1000, + "KillWeight": 1, + "PathList": [], + "FishImage": "11043.png", + "FishMultipleDesc": "最高8000倍" + }, + { + "FishNumber": "15001", + "FishName": "普通丧尸1", + "FishBrief": "人类感染基础形态,行动迟缓,靠数量压制", + "FishType": 1, + "FishScore": 2, + "KillWeight": 5000, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15001.png", + "FishMultipleDesc": "2倍" + }, + { + "FishNumber": "15002", + "FishName": "医生丧尸", + "FishBrief": "医生感染变异,可投掷医疗工具攻击", + "FishType": 1, + "FishScore": 2, + "KillWeight": 5000, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15002.png", + "FishMultipleDesc": "2倍" + }, + { + "FishNumber": "15003", + "FishName": "普通丧尸2", + "FishBrief": "人类感染基础形态,行动迟缓,靠数量压制", + "FishType": 1, + "FishScore": 2, + "KillWeight": 5000, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15003.png", + "FishMultipleDesc": "2倍" + }, + { + "FishNumber": "15004", + "FishName": "普通丧尸3", + "FishBrief": "人类感染基础形态,行动迟缓,靠数量压制", + "FishType": 1, + "FishScore": 2, + "KillWeight": 5000, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15004.png", + "FishMultipleDesc": "2倍" + }, + { + "FishNumber": "15005", + "FishName": "普通丧尸4", + "FishBrief": "人类感染基础形态,行动迟缓,靠数量压制", + "FishType": 1, + "FishScore": 2, + "KillWeight": 5000, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15005.png", + "FishMultipleDesc": "2倍" + }, + { + "FishNumber": "15006", + "FishName": "普通丧尸5", + "FishBrief": "人类感染基础形态,行动迟缓,靠数量压制", + "FishType": 1, + "FishScore": 2, + "KillWeight": 5000, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15006.png", + "FishMultipleDesc": "2倍" + }, + { + "FishNumber": "15007", + "FishName": "普通丧尸6", + "FishBrief": "人类感染基础形态,行动迟缓,靠数量压制", + "FishType": 1, + "FishScore": 2, + "KillWeight": 5000, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15007.png", + "FishMultipleDesc": "2倍" + }, + { + "FishNumber": "15008", + "FishName": "普通丧尸7", + "FishBrief": "人类感染基础形态,行动迟缓,靠数量压制", + "FishType": 1, + "FishScore": 2, + "KillWeight": 5000, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15008.png", + "FishMultipleDesc": "2倍" + }, + { + "FishNumber": "15009", + "FishName": "骷髅1", + "FishBrief": "人类骸骨与病毒结合,行动灵活,可群体冲锋", + "FishType": 1, + "FishScore": 2, + "KillWeight": 5000, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15009.png", + "FishMultipleDesc": "2倍" + }, + { + "FishNumber": "15010", + "FishName": "骷髅2", + "FishBrief": "人类骸骨与病毒结合,行动灵活,可群体冲锋", + "FishType": 1, + "FishScore": 2, + "KillWeight": 5000, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15010.png", + "FishMultipleDesc": "2倍" + }, + { + "FishNumber": "15011", + "FishName": "骷髅3", + "FishBrief": "人类骸骨与病毒结合,行动灵活,可群体冲锋", + "FishType": 1, + "FishScore": 2, + "KillWeight": 5000, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15011.png", + "FishMultipleDesc": "2倍" + }, + { + "FishNumber": "15012", + "FishName": "爆炎丧尸", + "FishBrief": "体内积攒爆炎能量,自爆可对范围目标造成高额伤害", + "FishType": 1, + "FishScore": 3, + "KillWeight": 3333, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15012.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "15013", + "FishName": "熔岩丧尸", + "FishBrief": "火山区域变异体,躯体流淌熔岩,攻击附灼烧且生命力顽强", + "FishType": 1, + "FishScore": 3, + "KillWeight": 3333, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15013.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "15014", + "FishName": "暗影骷髅", + "FishBrief": "暗影能量凝聚而成,可穿梭阴影突袭,攻击附暗影debuff", + "FishType": 1, + "FishScore": 4, + "KillWeight": 2500, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15014.png", + "FishMultipleDesc": "4倍" + }, + { + "FishNumber": "15015", + "FishName": "紫晶魔物", + "FishBrief": "被紫晶能量侵蚀,可操控晶刺攻击,防御较强", + "FishType": 1, + "FishScore": 4, + "KillWeight": 2500, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15015.png", + "FishMultipleDesc": "4倍" + }, + { + "FishNumber": "15016", + "FishName": "女仆丧尸", + "FishBrief": "曾为女仆,保留人类动作习惯,可投掷清洁工具攻击", + "FishType": 1, + "FishScore": 5, + "KillWeight": 2000, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15016.png", + "FishMultipleDesc": "5倍" + }, + { + "FishNumber": "15017", + "FishName": "老年丧尸", + "FishBrief": "老年人感染变异,行动缓慢但韧性极强,擅长近身缠斗", + "FishType": 1, + "FishScore": 5, + "KillWeight": 2000, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15017.png", + "FishMultipleDesc": "5倍" + }, + { + "FishNumber": "15018", + "FishName": "红巾丧尸", + "FishBrief": "头戴红巾,攻击欲望强烈,主动冲向目标撕咬", + "FishType": 1, + "FishScore": 6, + "KillWeight": 1666, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15018.png", + "FishMultipleDesc": "6倍" + }, + { + "FishNumber": "15019", + "FishName": "女战士丧尸", + "FishBrief": "曾为战士,保留战斗技巧,近身格斗能力出色", + "FishType": 1, + "FishScore": 6, + "KillWeight": 1666, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15019.png", + "FishMultipleDesc": "6倍" + }, + { + "FishNumber": "15020", + "FishName": "机甲丧尸", + "FishBrief": "士兵感染后与机甲融合,装甲防御强,可发射腐蚀弹", + "FishType": 1, + "FishScore": 7, + "KillWeight": 1428, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15020.png", + "FishMultipleDesc": "7倍" + }, + { + "FishNumber": "15021", + "FishName": "烈焰丧尸", + "FishBrief": "被火焰感染,周身带火,攻击附灼烧,行动迅猛", + "FishType": 1, + "FishScore": 7, + "KillWeight": 1428, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15021.png", + "FishMultipleDesc": "7倍" + }, + { + "FishNumber": "15022", + "FishName": "灰皮丧尸", + "FishBrief": "人类感染早期形态,行动迟缓但耐力强,擅长近身撕咬", + "FishType": 1, + "FishScore": 8, + "KillWeight": 1250, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15022.png", + "FishMultipleDesc": "8倍" + }, + { + "FishNumber": "15023", + "FishName": "霜冻女妖", + "FishBrief": "寒冷区域亡灵,可释放寒气减速目标,擅长远程骚扰", + "FishType": 1, + "FishScore": 8, + "KillWeight": 1250, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15023.png", + "FishMultipleDesc": "8倍" + }, + { + "FishNumber": "15024", + "FishName": "僵尸狼", + "FishBrief": "野狼感染变异,行动敏捷,擅长追踪突袭", + "FishType": 1, + "FishScore": 8, + "KillWeight": 1250, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15024.png", + "FishMultipleDesc": "8倍" + }, + { + "FishNumber": "15025", + "FishName": "绿皮肥丧尸", + "FishBrief": "肥胖人类感染变异,绿皮肉瘤可喷吐毒素,生命力顽强。", + "FishType": 1, + "FishScore": 10, + "KillWeight": 1000, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15025.png", + "FishMultipleDesc": "10倍" + }, + { + "FishNumber": "15026", + "FishName": "肥肉巨怪", + "FishBrief": "高热量变异丧尸,行动缓慢但撞击冲击力强,脓疱破裂会腐蚀目标。", + "FishType": 1, + "FishScore": 12, + "KillWeight": 833, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15026.png", + "FishMultipleDesc": "12倍" + }, + { + "FishNumber": "15027", + "FishName": "阿凡达僵尸", + "FishBrief": "融合阿凡达奇幻风格,外形或能力带有阿凡达特征", + "FishType": 1, + "FishScore": 15, + "KillWeight": 666, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15027.png", + "FishMultipleDesc": "15倍" + }, + { + "FishNumber": "15028", + "FishName": "贝比僵尸", + "FishBrief": "走可爱幼态风格的僵尸", + "FishType": 1, + "FishScore": 15, + "KillWeight": 666, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15028.png", + "FishMultipleDesc": "15倍" + }, + { + "FishNumber": "15029", + "FishName": "蝙蝠侠僵尸", + "FishBrief": "结合蝙蝠侠元素,可能保留其标志性装备或能力", + "FishType": 1, + "FishScore": 15, + "KillWeight": 666, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15029.png", + "FishMultipleDesc": "15倍" + }, + { + "FishNumber": "15030", + "FishName": "超人僵尸", + "FishBrief": "融合超人设定,大概率拥有超强力量、飞行等超能力", + "FishType": 1, + "FishScore": 15, + "KillWeight": 666, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15030.png", + "FishMultipleDesc": "15倍" + }, + { + "FishNumber": "15031", + "FishName": "厨师僵尸", + "FishBrief": "职业为厨师,可能带有厨房相关道具或技能", + "FishType": 1, + "FishScore": 18, + "KillWeight": 555, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15031.png", + "FishMultipleDesc": "18倍" + }, + { + "FishNumber": "15032", + "FishName": "刺客僵尸", + "FishBrief": "具备刺客属性,擅长隐匿、刺杀,行动敏捷", + "FishType": 1, + "FishScore": 18, + "KillWeight": 555, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15032.png", + "FishMultipleDesc": "18倍" + }, + { + "FishNumber": "15033", + "FishName": "导游僵尸", + "FishBrief": "以导游为职业,行为模式偏向引导、讲解", + "FishType": 1, + "FishScore": 18, + "KillWeight": 555, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15033.png", + "FishMultipleDesc": "18倍" + }, + { + "FishNumber": "15034", + "FishName": "防爆僵尸", + "FishBrief": "具备防爆相关能力或装备,防御力较强", + "FishType": 1, + "FishScore": 20, + "KillWeight": 500, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15034.png", + "FishMultipleDesc": "20倍" + }, + { + "FishNumber": "15035", + "FishName": "橄榄球僵尸", + "FishBrief": "以橄榄球运动员为原型,拥有强壮体魄和冲撞能力", + "FishType": 1, + "FishScore": 20, + "KillWeight": 500, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15035.png", + "FishMultipleDesc": "20倍" + }, + { + "FishNumber": "15036", + "FishName": "功夫僵尸", + "FishBrief": "精通功夫,近战能力强劲", + "FishType": 1, + "FishScore": 25, + "KillWeight": 400, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15036.png", + "FishMultipleDesc": "25倍" + }, + { + "FishNumber": "15037", + "FishName": "古惑仔僵尸", + "FishBrief": "融合古惑仔帮派风格,带有江湖气息和团队作战属性", + "FishType": 1, + "FishScore": 25, + "KillWeight": 400, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15037.png", + "FishMultipleDesc": "25倍" + }, + { + "FishNumber": "15038", + "FishName": "黑帮倭瓜僵尸", + "FishBrief": "结合黑帮元素与倭瓜外形,有黑帮背景", + "FishType": 1, + "FishScore": 25, + "KillWeight": 400, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15038.png", + "FishMultipleDesc": "25倍" + }, + { + "FishNumber": "15039", + "FishName": "黑衣人僵尸", + "FishBrief": "身着黑衣,具备神秘、隐匿特质", + "FishType": 1, + "FishScore": 25, + "KillWeight": 400, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15039.png", + "FishMultipleDesc": "25倍" + }, + { + "FishNumber": "15040", + "FishName": "葫芦娃僵尸", + "FishBrief": "以葫芦娃为原型,可能保留其色彩特征或部分能力", + "FishType": 1, + "FishScore": 25, + "KillWeight": 400, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15040.png", + "FishMultipleDesc": "25倍" + }, + { + "FishNumber": "15041", + "FishName": "加勒比僵尸", + "FishBrief": "带有加勒比海盗风格,和海洋、海盗相关", + "FishType": 1, + "FishScore": 25, + "KillWeight": 400, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15041.png", + "FishMultipleDesc": "25倍" + }, + { + "FishNumber": "15042", + "FishName": "街头霸王僵尸", + "FishBrief": "融合街头霸王格斗元素,擅长各类格斗技巧", + "FishType": 1, + "FishScore": 25, + "KillWeight": 400, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15042.png", + "FishMultipleDesc": "25倍" + }, + { + "FishNumber": "15043", + "FishName": "酒鬼僵尸", + "FishBrief": "嗜酒,行为可能受酒精影响,或有酒类相关技能", + "FishType": 1, + "FishScore": 25, + "KillWeight": 400, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15043.png", + "FishMultipleDesc": "25倍" + }, + { + "FishNumber": "15044", + "FishName": "救生员僵尸", + "FishBrief": "职业为救生员,具备水上相关能力和装备", + "FishType": 1, + "FishScore": 25, + "KillWeight": 400, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15044.png", + "FishMultipleDesc": "25倍" + }, + { + "FishNumber": "15045", + "FishName": "科利僵尸", + "FishBrief": "小众原创类僵尸角色,设定信息较少", + "FishType": 1, + "FishScore": 30, + "KillWeight": 333, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15045.png", + "FishMultipleDesc": "30倍" + }, + { + "FishNumber": "15046", + "FishName": "科学狂人僵尸", + "FishBrief": "拥有疯狂科学家特质,可能进行邪恶实验", + "FishType": 1, + "FishScore": 30, + "KillWeight": 333, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15046.png", + "FishMultipleDesc": "30倍" + }, + { + "FishNumber": "15047", + "FishName": "矿工僵尸", + "FishBrief": "以矿工为职业,拥有挖掘、耐力相关能力", + "FishType": 1, + "FishScore": 30, + "KillWeight": 333, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15047.png", + "FishMultipleDesc": "30倍" + }, + { + "FishNumber": "15048", + "FishName": "篮球僵尸", + "FishBrief": "以篮球运动员为原型,拥有出色跳跃和投篮能力", + "FishType": 1, + "FishScore": 30, + "KillWeight": 333, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15048.png", + "FishMultipleDesc": "30倍" + }, + { + "FishNumber": "15049", + "FishName": "劳拉僵尸", + "FishBrief": "以《古墓丽影》劳拉为原型,擅长探险和格斗", + "FishType": 1, + "FishScore": 30, + "KillWeight": 333, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15049.png", + "FishMultipleDesc": "30倍" + }, + { + "FishNumber": "15050", + "FishName": "林克僵尸", + "FishBrief": "以《塞尔达传说》林克为原型,保留其冒险和战斗能力", + "FishType": 1, + "FishScore": 30, + "KillWeight": 333, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15050.png", + "FishMultipleDesc": "30倍" + }, + { + "FishNumber": "15051", + "FishName": "摩斯族僵尸", + "FishBrief": "以摩斯族为原型,拥有独特种族能力和外形", + "FishType": 1, + "FishScore": 30, + "KillWeight": 333, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15051.png", + "FishMultipleDesc": "30倍" + }, + { + "FishNumber": "15052", + "FishName": "牛仔僵尸", + "FishBrief": "带有西部牛仔风格,擅长枪械和马术", + "FishType": 1, + "FishScore": 30, + "KillWeight": 333, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15052.png", + "FishMultipleDesc": "30倍" + }, + { + "FishNumber": "15053", + "FishName": "胖虎僵尸", + "FishBrief": "以《哆啦A梦》胖虎为原型,拥有强壮体魄和高音量攻击", + "FishType": 1, + "FishScore": 30, + "KillWeight": 333, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15053.png", + "FishMultipleDesc": "30倍" + }, + { + "FishNumber": "15054", + "FishName": "清朝僵尸", + "FishBrief": "以清朝人物为原型,带有古代服饰和武器特征", + "FishType": 1, + "FishScore": 40, + "KillWeight": 250, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15054.png", + "FishMultipleDesc": "40倍" + }, + { + "FishNumber": "15055", + "FishName": "容颜炮手僵尸", + "FishBrief": "以炮手为职业,擅长远程炮击攻击", + "FishType": 1, + "FishScore": 40, + "KillWeight": 250, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15055.png", + "FishMultipleDesc": "40倍" + }, + { + "FishNumber": "15056", + "FishName": "蛇反女僵尸", + "FishBrief": "带有蛇类特征的女性僵尸,拥有蛇类相关能力和外形", + "FishType": 1, + "FishScore": 40, + "KillWeight": 250, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15056.png", + "FishMultipleDesc": "40倍" + }, + { + "FishNumber": "15057", + "FishName": "史瑞克僵尸", + "FishBrief": "以《史瑞克》角色为原型,拥有绿色皮肤和强壮体魄", + "FishType": 1, + "FishScore": 40, + "KillWeight": 250, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15057.png", + "FishMultipleDesc": "40倍" + }, + { + "FishNumber": "15058", + "FishName": "铁桶僵尸", + "FishBrief": "以铁桶为装备或外形特征,防御力极强", + "FishType": 1, + "FishScore": 40, + "KillWeight": 250, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15058.png", + "FishMultipleDesc": "40倍" + }, + { + "FishNumber": "15059", + "FishName": "铁血战士僵尸", + "FishBrief": "融合铁血战士元素,擅长潜行和各类外星武器使用", + "FishType": 1, + "FishScore": 40, + "KillWeight": 250, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15059.png", + "FishMultipleDesc": "40倍" + }, + { + "FishNumber": "15060", + "FishName": "迈克尔僵尸", + "FishBrief": "以迈克尔・杰克逊为原型,带有舞蹈和音乐相关特质", + "FishType": 1, + "FishScore": 40, + "KillWeight": 250, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15060.png", + "FishMultipleDesc": "40倍" + }, + { + "FishNumber": "15061", + "FishName": "小丑僵尸", + "FishBrief": "带有小丑外形和特质,行为诡异,擅长制造混乱", + "FishType": 1, + "FishScore": 40, + "KillWeight": 250, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15061.png", + "FishMultipleDesc": "40倍" + }, + { + "FishNumber": "15062", + "FishName": "教师僵尸", + "FishBrief": "职业为教师,可能带有教育相关道具和技能", + "FishType": 1, + "FishScore": 40, + "KillWeight": 250, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15062.png", + "FishMultipleDesc": "40倍" + }, + { + "FishNumber": "15063", + "FishName": "野人僵尸", + "FishBrief": "类似野人,拥有原始力量和野性特质", + "FishType": 1, + "FishScore": 45, + "KillWeight": 222, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15063.png", + "FishMultipleDesc": "45倍" + }, + { + "FishNumber": "15064", + "FishName": "荧光棒僵尸", + "FishBrief": "带有荧光棒元素,可能在黑暗环境发光或拥有光系技能", + "FishType": 1, + "FishScore": 45, + "KillWeight": 222, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15064.png", + "FishMultipleDesc": "45倍" + }, + { + "FishNumber": "15065", + "FishName": "杂耍僵尸", + "FishBrief": "擅长杂耍,行动灵活,能使用杂耍道具攻击", + "FishType": 1, + "FishScore": 45, + "KillWeight": 222, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15065.png", + "FishMultipleDesc": "45倍" + }, + { + "FishNumber": "15066", + "FishName": "学生僵尸", + "FishBrief": "以学生为原型,带有书包、文具等学生相关道具", + "FishType": 1, + "FishScore": 45, + "KillWeight": 222, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15066.png", + "FishMultipleDesc": "45倍" + }, + { + "FishNumber": "15067", + "FishName": "张起灵僵尸", + "FishBrief": "以《盗墓笔记》张起灵为原型,拥有麒麟血和超强战斗能力", + "FishType": 1, + "FishScore": 45, + "KillWeight": 222, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15067.png", + "FishMultipleDesc": "45倍" + }, + { + "FishNumber": "15068", + "FishName": "终结者僵尸", + "FishBrief": "融合终结者元素,拥有超强自愈能力和战斗能力", + "FishType": 1, + "FishScore": 45, + "KillWeight": 222, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15068.png", + "FishMultipleDesc": "45倍" + }, + { + "FishNumber": "15069", + "FishName": "骸骨战狼", + "FishBrief": "古狼骸骨+丧尸病毒诞生,嗅觉敏锐,行动迅猛,擅长突袭追踪。", + "FishType": 3, + "FishScore": 100, + "KillWeight": 100, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15069.png", + "FishMultipleDesc": "100倍" + }, + { + "FishNumber": "15070", + "FishName": "熔岩骷髅怪", + "FishBrief": "火山附近亡灵,躯体流熔岩,攻击附灼烧效果,生命力顽强。", + "FishType": 3, + "FishScore": 100, + "KillWeight": 100, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15070.png", + "FishMultipleDesc": "100倍" + }, + { + "FishNumber": "15071", + "FishName": "机械骷髅怪", + "FishBrief": "机械残骸与骷髅融合,机械臂可夹碎金属,擅长破坏防御工事。", + "FishType": 3, + "FishScore": 100, + "KillWeight": 100, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15071.png", + "FishMultipleDesc": "100倍" + }, + { + "FishNumber": "15072", + "FishName": "怨灵骷髅群", + "FishBrief": "冤死灵魂凝聚而成,群体冲锋压制目标,数量多难彻底消灭。", + "FishType": 3, + "FishScore": 100, + "KillWeight": 100, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15072.png", + "FishMultipleDesc": "100倍" + }, + { + "FishNumber": "15073", + "FishName": "多头骷髅怪", + "FishBrief": "多骷髅头颅拼接而成,可同时攻击多个目标,附带寄生虫啃食效果。", + "FishType": 3, + "FishScore": 100, + "KillWeight": 100, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15073.png", + "FishMultipleDesc": "100倍" + }, + { + "FishNumber": "15074", + "FishName": "摇滚僵尸", + "FishBrief": "带有摇滚风格,拥有音乐相关能力和狂暴特质", + "FishType": 4, + "FishScore": 120, + "KillWeight": 83, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15074.png", + "FishMultipleDesc": "120倍" + }, + { + "FishNumber": "15075", + "FishName": "死神僵尸", + "FishBrief": "融合死神元素,带有镰刀等标志性武器和死亡相关特质", + "FishType": 4, + "FishScore": 120, + "KillWeight": 83, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15075.png", + "FishMultipleDesc": "120倍" + }, + { + "FishNumber": "15076", + "FishName": "忍者神龟僵尸", + "FishBrief": "融合忍者神龟元素,擅长忍术和各类武器使用", + "FishType": 4, + "FishScore": 120, + "KillWeight": 83, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15076.png", + "FishMultipleDesc": "120倍" + }, + { + "FishNumber": "15077", + "FishName": "犬夜叉僵尸", + "FishBrief": "以《犬夜叉》角色为原型,保留其半妖特质和能力", + "FishType": 4, + "FishScore": 120, + "KillWeight": 83, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15077.png", + "FishMultipleDesc": "120倍" + }, + { + "FishNumber": "15078", + "FishName": "魔法师僵尸", + "FishBrief": "具备魔法能力,能施展各类魔法攻击", + "FishType": 4, + "FishScore": 150, + "KillWeight": 66, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15078.png", + "FishMultipleDesc": "150倍" + }, + { + "FishNumber": "15079", + "FishName": "美国队长僵尸", + "FishBrief": "融合美国队长元素,拥有超强力量和盾牌装备", + "FishType": 4, + "FishScore": 150, + "KillWeight": 66, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15079.png", + "FishMultipleDesc": "150倍" + }, + { + "FishNumber": "15080", + "FishName": "路飞僵尸", + "FishBrief": "以《海贼王》路飞为原型,拥有橡胶果实能力", + "FishType": 4, + "FishScore": 150, + "KillWeight": 66, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15080.png", + "FishMultipleDesc": "150倍" + }, + { + "FishNumber": "15081", + "FishName": "克劳德僵尸", + "FishBrief": "以《最终幻想7》克劳德为原型,保留其战斗风格", + "FishType": 4, + "FishScore": 150, + "KillWeight": 66, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15081.png", + "FishMultipleDesc": "150倍" + }, + { + "FishNumber": "15082", + "FishName": "金刚狼僵尸", + "FishBrief": "结合金刚狼设定,拥有自愈能力和钢爪", + "FishType": 4, + "FishScore": 200, + "KillWeight": 50, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15082.png", + "FishMultipleDesc": "200倍" + }, + { + "FishNumber": "15083", + "FishName": "弗兰肯斯坦", + "FishBrief": "源自玛丽・雪莱小说的经典人造人僵尸,是科学伦理探讨的标志性角色", + "FishType": 4, + "FishScore": 200, + "KillWeight": 50, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15083.png", + "FishMultipleDesc": "200倍" + }, + { + "FishNumber": "15084", + "FishName": "飞行僵尸", + "FishBrief": "拥有飞行能力,行动范围广,攻击更具突然性", + "FishType": 4, + "FishScore": 200, + "KillWeight": 50, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15084.png", + "FishMultipleDesc": "200倍" + }, + { + "FishNumber": "15085", + "FishName": "宝骏僵尸", + "FishBrief": "以汽车品牌宝骏为原型的趣味拟人化僵尸", + "FishType": 4, + "FishScore": 200, + "KillWeight": 50, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15085.png", + "FishMultipleDesc": "200倍" + }, + { + "FishNumber": "15086", + "FishName": "567僵尸", + "FishBrief": "小众原创类僵尸角色,设定信息较少", + "FishType": 4, + "FishScore": 200, + "KillWeight": 50, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15086.png", + "FishMultipleDesc": "200倍" + }, + { + "FishNumber": "15087", + "FishName": "腐肉巨魔", + "FishBrief": "人尸与腐植异变融合,行动迟缓但耐力极强,靠近身撕咬攻击。", + "FishType": 4, + "FishScore": 250, + "KillWeight": 40, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15087.png", + "FishMultipleDesc": "250倍" + }, + { + "FishNumber": "15088", + "FishName": "食人花丧尸", + "FishBrief": "变异食人花与丧尸躯体结合,靠巨花獠牙捕猎,以气味引诱目标。", + "FishType": 4, + "FishScore": 250, + "KillWeight": 40, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15088.png", + "FishMultipleDesc": "250倍" + }, + { + "FishNumber": "15089", + "FishName": "坦克丧尸", + "FishBrief": "士兵尸身与坦克残骸融合,装甲为天然防御,炮管可发射腐蚀弹。", + "FishType": 4, + "FishScore": 250, + "KillWeight": 40, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15089.png", + "FishMultipleDesc": "250倍" + }, + { + "FishNumber": "15090", + "FishName": "战神僵尸", + "FishBrief": "具备战神属性,拥有超强力量和战斗技巧", + "FishType": 2, + "FishScore": 1, + "KillWeight": 55, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15090.png", + "FishMultipleDesc": "最高1倍" + }, + { + "FishNumber": "15091", + "FishName": "阴阳师僵尸", + "FishBrief": "融合阴阳师元素,擅长式神召唤和阴阳法术", + "FishType": 2, + "FishScore": 1, + "KillWeight": 52, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15091.png", + "FishMultipleDesc": "最高1倍" + }, + { + "FishNumber": "15092", + "FishName": "雷神僵尸", + "FishBrief": "结合雷神元素,拥有雷电相关能力和武器", + "FishType": 2, + "FishScore": 1, + "KillWeight": 43, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15092.png", + "FishMultipleDesc": "最高1倍" + }, + { + "FishNumber": "15093", + "FishName": "斯芬克斯僵尸", + "FishBrief": "以斯芬克斯为原型,拥有谜题和智慧相关能力", + "FishType": 2, + "FishScore": 1, + "KillWeight": 41, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15093.png", + "FishMultipleDesc": "最高1倍" + }, + { + "FishNumber": "15094", + "FishName": "大力水手僵尸", + "FishBrief": "以大力水手为原型,拥有超强力量和菠菜相关技能", + "FishType": 2, + "FishScore": 1, + "KillWeight": 32, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15094.png", + "FishMultipleDesc": "最高1倍" + }, + { + "FishNumber": "15095", + "FishName": "礼物车僵尸", + "FishBrief": "和礼物车相关,可能带有运输、投掷类技能", + "FishType": 2, + "FishScore": 1, + "KillWeight": 20, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15095.png", + "FishMultipleDesc": "最高1倍" + }, + { + "FishNumber": "15096", + "FishName": "骑士僵尸", + "FishBrief": "具备骑士属性,身披盔甲,擅长骑士剑术", + "FishType": 2, + "FishScore": 1, + "KillWeight": 20, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15096.png", + "FishMultipleDesc": "最高1倍" + }, + { + "FishNumber": "15097", + "FishName": "阿拉丁僵尸", + "FishBrief": "以《阿拉丁》角色为原型,和神灯、魔法相关", + "FishType": 2, + "FishScore": 1, + "KillWeight": 20, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15097.png", + "FishMultipleDesc": "最高1倍" + }, + { + "FishNumber": "15098", + "FishName": "骷髅王僵尸", + "FishBrief": "僵尸群体中的强力领导者", + "FishType": 2, + "FishScore": 1, + "KillWeight": 20, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15098.png", + "FishMultipleDesc": "最高1倍" + }, + { + "FishNumber": "15099", + "FishName": "博士僵尸", + "FishBrief": "以博士为职业,拥有高智商和科技相关能力", + "FishType": 2, + "FishScore": 1, + "KillWeight": 16, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "15099.png", + "FishMultipleDesc": "最高1倍" + }, + { + "FishNumber": "13001", + "FishName": "小蓝鱼", + "FishBrief": "小黄刺鱼通体黄色,经常成群出没,打击难度比较小。", + "FishType": 1, + "FishScore": 2, + "KillWeight": 5000, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "13001.png", + "FishMultipleDesc": "2倍" + }, + { + "FishNumber": "13002", + "FishName": "小黄鱼", + "FishBrief": "因有两只硕大无比的眼睛而得名。此鱼生性胆小。", + "FishType": 1, + "FishScore": 3, + "KillWeight": 3333, + "PathList": [ + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16 + ], + "FishImage": "13002.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "13003", + "FishName": "小飞鱼", + "FishBrief": "小丑鱼因为脸上有一条或两条白色条纹,好似京剧中的丑角而得名,是一种热带咸水鱼。", + "FishType": 1, + "FishScore": 5, + "KillWeight": 2000, + "PathList": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ], + "FishImage": "13003.png", + "FishMultipleDesc": "5倍" + }, + { + "FishNumber": "13004", + "FishName": "小丑鱼", + "FishBrief": "热带蓝鱼常常被当做观赏鱼饲养,种类极多,以海草及石灰质中的浮游生物为食。", + "FishType": 1, + "FishScore": 5, + "KillWeight": 2000, + "PathList": [ + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32 + ], + "FishImage": "13004.png", + "FishMultipleDesc": "5倍" + }, + { + "FishNumber": "13005", + "FishName": "神仙鱼", + "FishBrief": "乌龟是现存古老的爬行动物。特征是身上长有非常坚固的甲壳,受击时可以把头、尾及四肢缩回龟壳内。", + "FishType": 1, + "FishScore": 6, + "KillWeight": 1666, + "PathList": [ + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40 + ], + "FishImage": "13005.png", + "FishMultipleDesc": "6倍" + }, + { + "FishNumber": "13006", + "FishName": "灯笼鱼", + "FishBrief": "身上的纹理像彩虹一般的鱼,分值还不错,加油捕获吧。", + "FishType": 1, + "FishScore": 7, + "KillWeight": 1428, + "PathList": [ + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48 + ], + "FishImage": "13006.png", + "FishMultipleDesc": "7倍" + }, + { + "FishNumber": "13007", + "FishName": "孔雀鱼", + "FishBrief": "剑鱼的攻击力特强,它那骨质利剑非常坚硬,而且还是游泳冠军记录的保持着。", + "FishType": 1, + "FishScore": 8, + "KillWeight": 1250, + "PathList": [ + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56 + ], + "FishImage": "13007.png", + "FishMultipleDesc": "8倍" + }, + { + "FishNumber": "13008", + "FishName": "小龙虾", + "FishBrief": "大家别急,游慢点....", + "FishType": 1, + "FishScore": 9, + "KillWeight": 1111, + "PathList": [ + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64 + ], + "FishImage": "13008.png", + "FishMultipleDesc": "9倍" + }, + { + "FishNumber": "13009", + "FishName": "狮子鱼", + "FishBrief": "蝴蝶鱼一般个体较小,可以在珊瑚丛中灵巧地穿梭。体色大部鲜艳美丽。", + "FishType": 1, + "FishScore": 10, + "KillWeight": 1000, + "PathList": [ + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72 + ], + "FishImage": "13009.png", + "FishMultipleDesc": "10倍" + }, + { + "FishNumber": "13010", + "FishName": "水丹", + "FishBrief": "我想游的再快点....", + "FishType": 1, + "FishScore": 12, + "KillWeight": 833, + "PathList": [ + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80 + ], + "FishImage": "13010.png", + "FishMultipleDesc": "12倍" + }, + { + "FishNumber": "13011", + "FishName": "刺豚", + "FishBrief": "生性胆小的家伙,一有风吹草动,马上溜之大吉。", + "FishType": 1, + "FishScore": 15, + "KillWeight": 666, + "PathList": [ + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88 + ], + "FishImage": "13011.png", + "FishMultipleDesc": "15倍" + }, + { + "FishNumber": "13012", + "FishName": "海龟", + "FishBrief": "河豚的体型浑圆,具有膨胀身体的能力,受到威胁时,能快速吸入水或者空气,再短时间内膨胀数倍大小,吓退掠食者。", + "FishType": 1, + "FishScore": 20, + "KillWeight": 500, + "PathList": [ + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96 + ], + "FishImage": "13012.png", + "FishMultipleDesc": "20倍" + }, + { + "FishNumber": "13013", + "FishName": "蝙蝠鱼", + "FishBrief": "灯笼鱼的背上长着一种发光器,每当它游泳的时候,发光器就像一盏玲珑的小灯笼,在深海中照出一片亮光来。", + "FishType": 1, + "FishScore": 25, + "KillWeight": 400, + "PathList": [ + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104 + ], + "FishImage": "13013.png", + "FishMultipleDesc": "25倍" + }, + { + "FishNumber": "13014", + "FishName": "海豚", + "FishBrief": "巨大小丑是小丑鱼变异来的,体型要大很多,捕获难度较大。", + "FishType": 1, + "FishScore": 30, + "KillWeight": 333, + "PathList": [ + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112 + ], + "FishImage": "13014.png", + "FishMultipleDesc": "30倍" + }, + { + "FishNumber": "13015", + "FishName": "尖嘴鲨", + "FishBrief": "魔鬼鱼身体扁平似蝙蝠,胸鳍宽大,由吻端延伸到细长的尾根底部,身子扁平,尾巴细长。", + "FishType": 1, + "FishScore": 40, + "KillWeight": 250, + "PathList": [ + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120 + ], + "FishImage": "13015.png", + "FishMultipleDesc": "40倍" + }, + { + "FishNumber": "13016", + "FishName": "双髻鲨", + "FishBrief": "远洋型虎鲸身长可达8-10米,成年后体重9顿左右。以鲨鱼为主要食物,是当之无愧的海洋霸主。", + "FishType": 1, + "FishScore": 50, + "KillWeight": 200, + "PathList": [ + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128 + ], + "FishImage": "13016.png", + "FishMultipleDesc": "50倍" + }, + { + "FishNumber": "13017", + "FishName": "大白鲨", + "FishBrief": "我保证你不愿意看见我的微笑!嘿嘿....", + "FishType": 1, + "FishScore": 60, + "KillWeight": 166, + "PathList": [ + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136 + ], + "FishImage": "13017.png", + "FishMultipleDesc": "60倍" + }, + { + "FishNumber": "13018", + "FishName": "鲸鱼", + "FishBrief": "黄金珊瑚鱼通体黄金,是珊瑚鱼中最高级的个体。", + "FishType": 3, + "FishScore": 120, + "KillWeight": 83, + "PathList": [ + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144 + ], + "FishImage": "13018.png", + "FishMultipleDesc": "120倍" + }, + { + "FishNumber": "13019", + "FishName": "奖金幽灵水母", + "FishBrief": "黄金河豚浑身金灿灿,价值连城,但是数量极少。", + "FishType": 3, + "FishScore": 130, + "KillWeight": 76, + "PathList": [ + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152 + ], + "FishImage": "13019.png", + "FishMultipleDesc": "130倍" + }, + { + "FishNumber": "13020", + "FishName": "奖金魔鬼鱼", + "FishBrief": "一只移动的聚宝盆,虽然移动缓慢,但捕获难度超高", + "FishType": 3, + "FishScore": 150, + "KillWeight": 66, + "PathList": [ + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160 + ], + "FishImage": "13020.png", + "FishMultipleDesc": "150倍" + }, + { + "FishNumber": "13021", + "FishName": "奖金鲨鱼", + "FishBrief": "这只金灿灿的黄金灯笼鱼极其少见,捕获它能获得很多奖励。", + "FishType": 3, + "FishScore": 160, + "KillWeight": 62, + "PathList": [ + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168 + ], + "FishImage": "13021.png", + "FishMultipleDesc": "160倍" + }, + { + "FishNumber": "13022", + "FishName": "奖金双髻鲨", + "FishBrief": "黄金虎鲸是虎鲸的变异群种,不是一般的难打。可是一旦渔获,会很惊!", + "FishType": 3, + "FishScore": 180, + "KillWeight": 55, + "PathList": [ + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176 + ], + "FishImage": "13022.png", + "FishMultipleDesc": "180倍" + }, + { + "FishNumber": "13023", + "FishName": "奖金大海龟", + "FishBrief": "鲨的变种鱼之一,它的一切资料还隐藏在迷雾中……", + "FishType": 3, + "FishScore": 200, + "KillWeight": 50, + "PathList": [ + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184 + ], + "FishImage": "13023.png", + "FishMultipleDesc": "200倍" + }, + { + "FishNumber": "13024", + "FishName": "大龙虾", + "FishBrief": "钻头蟹的钻头可贯穿全场,捕获它将让你所向披靡。", + "FishType": 2, + "FishScore": 1, + "KillWeight": 33, + "PathList": [ + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192 + ], + "FishImage": "13024.png", + "FishMultipleDesc": "最高360倍" + }, + { + "FishNumber": "13025", + "FishName": "闪电鱼", + "FishBrief": "释放强力闪电,瞬间秒杀一定范围内的鱼。", + "FishType": 4, + "FishScore": 1, + "KillWeight": 33, + "PathList": [ + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200 + ], + "FishImage": "13025.png", + "FishMultipleDesc": "最高360倍" + }, + { + "FishNumber": "13026", + "FishName": "连环导弹", + "FishBrief": "此炸弹威力无穷,民间赞颂它,", + "FishType": 4, + "FishScore": 1, + "KillWeight": 10000, + "PathList": [ + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208 + ], + "FishImage": "13026.png", + "FishMultipleDesc": "最高360倍" + }, + { + "FishNumber": "13027", + "FishName": "九龙玉玺", + "FishBrief": "据说可驭九龙之力,威压所致,万物皆惧!", + "FishType": 2, + "FishScore": 1, + "KillWeight": 29, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "13027.png", + "FishMultipleDesc": "最高380倍" + }, + { + "FishNumber": "13028", + "FishName": "沙僧", + "FishBrief": "原为天界卷帘大将,手持玉帝所赐降妖宝杖,对唐僧忠心耿耿且实力超群。", + "FishType": 2, + "FishScore": 1, + "KillWeight": 29, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "13028.png", + "FishMultipleDesc": "最高380倍" + }, + { + "FishNumber": "13029", + "FishName": "白骨精", + "FishBrief": "擅长变化,狡猾又通晓人弱点,多次试图接近唐僧,最终被孙悟空识破?", + "FishType": 2, + "FishScore": 1, + "KillWeight": 29, + "PathList": [ + 1 + ], + "FishImage": "13029.png", + "FishMultipleDesc": "最高380倍" + }, + { + "FishNumber": "13030", + "FishName": "小白龙", + "FishBrief": "本是西海龙王三太子,法力高强,贪食唐僧坐骑,被观音点化后变为白龙马。", + "FishType": 2, + "FishScore": 1, + "KillWeight": 26, + "PathList": [ + 1 + ], + "FishImage": "13030.png", + "FishMultipleDesc": "最高500倍" + }, + { + "FishNumber": "13031", + "FishName": "嫦娥", + "FishBrief": "掌管月宫的广寒仙子,能以月神之力带来富贵和好运", + "FishType": 2, + "FishScore": 1, + "KillWeight": 26, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "13031.png", + "FishMultipleDesc": "最高500倍" + }, + { + "FishNumber": "13032", + "FishName": "孙悟空", + "FishBrief": "由仙石孕育而生,拜菩提老祖门下习得七十二变,后大闹龙宫取得如意金箍棒", + "FishType": 2, + "FishScore": 1, + "KillWeight": 26, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "13032.png", + "FishMultipleDesc": "最高500倍" + }, + { + "FishNumber": "13033", + "FishName": "铁扇公主", + "FishBrief": "牛魔王妻子,持有法宝芭蕉扇,呼风唤雨,世人称之铁扇金仙", + "FishType": 2, + "FishScore": 1, + "KillWeight": 15, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "13033.png", + "FishMultipleDesc": "最高1000倍" + }, + { + "FishNumber": "13034", + "FishName": "唐僧", + "FishBrief": "如来佛祖座下金蝉子转世,一心向善,为取真经一路历经磨难", + "FishType": 2, + "FishScore": 1, + "KillWeight": 15, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "13034.png", + "FishMultipleDesc": "最高1000倍" + }, + { + "FishNumber": "13035", + "FishName": "猪八戒", + "FishBrief": "曾为掌管天宫八万水军天蓬元帅,会天罡数三十六般变化,所持武器九齿钉耙~", + "FishType": 2, + "FishScore": 1, + "KillWeight": 15, + "PathList": [ + 1 + ], + "FishImage": "13035.png", + "FishMultipleDesc": "最高1000倍" + }, + { + "FishNumber": "13036", + "FishName": "烈焰巨龙", + "FishBrief": "地心熔穴为巢,故极其罕见,在猎人黑市可谓价值连城!", + "FishType": 2, + "FishScore": 1, + "KillWeight": 11, + "PathList": [ + 1, + 2 + ], + "FishImage": "13036.png", + "FishMultipleDesc": "最高1200倍" + }, + { + "FishNumber": "13037", + "FishName": "宝船居蟹", + "FishBrief": "极具财运,搜罗过无数元宝宝藏,让人羡慕不已!", + "FishType": 2, + "FishScore": 1, + "KillWeight": 11, + "PathList": [ + 1, + 2 + ], + "FishImage": "13037.png", + "FishMultipleDesc": "最高1200倍" + }, + { + "FishNumber": "13038", + "FishName": "杨戬", + "FishBrief": "三尖两刃刀横扫三界,天眼洞悉万物,哮天犬伴其左右,神威凛冽不容侵犯!", + "FishType": 5, + "FishScore": 1, + "KillWeight": 1, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "13038.png", + "FishMultipleDesc": "最高8000倍" + }, + { + "FishNumber": "13039", + "FishName": "食神八戒", + "FishBrief": "让俺老猪看看盘子里装的是什么好吃的!", + "FishType": 5, + "FishScore": 1, + "KillWeight": 1, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "13039.png", + "FishMultipleDesc": "最高8000倍" + }, + { + "FishNumber": "13040", + "FishName": "齐天大圣", + "FishBrief": "齐天大圣孙悟空,火眼金睛识破一切妖魔鬼怪", + "FishType": 5, + "FishScore": 1, + "KillWeight": 1, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "13040.png", + "FishMultipleDesc": "最高12000倍" + }, + { + "FishNumber": "12001", + "FishName": "绿风", + "FishBrief": "", + "FishType": 1, + "FishScore": 3, + "KillWeight": 5000, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "12001.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "12002", + "FishName": "蝎子", + "FishBrief": "", + "FishType": 1, + "FishScore": 3, + "KillWeight": 3333, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "12002.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "12003", + "FishName": "黄蜂", + "FishBrief": "", + "FishType": 1, + "FishScore": 3, + "KillWeight": 2500, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "12003.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "12004", + "FishName": "红刹", + "FishBrief": "", + "FishType": 1, + "FishScore": 3, + "KillWeight": 2000, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "12004.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "12005", + "FishName": "白羽", + "FishBrief": "", + "FishType": 1, + "FishScore": 3, + "KillWeight": 1666, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "12005.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "12006", + "FishName": "蔷薇", + "FishBrief": "", + "FishType": 1, + "FishScore": 3, + "KillWeight": 1428, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "12006.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "12007", + "FishName": "雷霆", + "FishBrief": "", + "FishType": 1, + "FishScore": 3, + "KillWeight": 1250, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "12007.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "12008", + "FishName": "星火", + "FishBrief": "", + "FishType": 1, + "FishScore": 3, + "KillWeight": 1111, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "12008.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "12009", + "FishName": "紫虹", + "FishBrief": "", + "FishType": 1, + "FishScore": 3, + "KillWeight": 1000, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "12009.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "12010", + "FishName": "赤日", + "FishBrief": "", + "FishType": 1, + "FishScore": 3, + "KillWeight": 666, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "12010.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "12011", + "FishName": "蓝鸟", + "FishBrief": "", + "FishType": 1, + "FishScore": 3, + "KillWeight": 555, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "12011.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "12012", + "FishName": "迷彩", + "FishBrief": "", + "FishType": 1, + "FishScore": 3, + "KillWeight": 500, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "12012.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "12013", + "FishName": "天鹰", + "FishBrief": "", + "FishType": 1, + "FishScore": 3, + "KillWeight": 333, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "12013.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "12014", + "FishName": "幻影", + "FishBrief": "", + "FishType": 1, + "FishScore": 3, + "KillWeight": 285, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "12014.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "12015", + "FishName": "嫣然", + "FishBrief": "", + "FishType": 1, + "FishScore": 3, + "KillWeight": 200, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "12015.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "12016", + "FishName": "赤鸦", + "FishBrief": "", + "FishType": 1, + "FishScore": 3, + "KillWeight": 166, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "12016.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "12017", + "FishName": "极寒", + "FishBrief": "", + "FishType": 1, + "FishScore": 3, + "KillWeight": 142, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "12017.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "12018", + "FishName": "烈焰", + "FishBrief": "", + "FishType": 1, + "FishScore": 3, + "KillWeight": 125, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "12018.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "12019", + "FishName": "双子天使", + "FishBrief": "", + "FishType": 1, + "FishScore": 3, + "KillWeight": 100, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "12019.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "12020", + "FishName": "光环飞机F2", + "FishBrief": "", + "FishType": 4, + "FishScore": 3, + "KillWeight": 500, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "12020.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "12021", + "FishName": "光环飞机F1", + "FishBrief": "", + "FishType": 4, + "FishScore": 3, + "KillWeight": 500, + "PathList": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "FishImage": "12021.png", + "FishMultipleDesc": "3倍" + }, + { + "FishNumber": "12022", + "FishName": "幸运飞碟", + "FishBrief": "", + "FishType": 2, + "FishScore": 1, + "KillWeight": 100, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "12022.png", + "FishMultipleDesc": "最高1倍" + }, + { + "FishNumber": "12023", + "FishName": "小丑扑克", + "FishBrief": "", + "FishType": 2, + "FishScore": 1, + "KillWeight": 500, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "12023.png", + "FishMultipleDesc": "最高1倍" + }, + { + "FishNumber": "12024", + "FishName": "黑洞飞船", + "FishBrief": "", + "FishType": 2, + "FishScore": 1, + "KillWeight": 52, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "12024.png", + "FishMultipleDesc": "最高1倍" + }, + { + "FishNumber": "12025", + "FishName": "弹药箱", + "FishBrief": "", + "FishType": 2, + "FishScore": 1, + "KillWeight": 500, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "12025.png", + "FishMultipleDesc": "最高1倍" + }, + { + "FishNumber": "12026", + "FishName": "爆裂金鲨", + "FishBrief": "", + "FishType": 2, + "FishScore": 1, + "KillWeight": 43, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "12026.png", + "FishMultipleDesc": "最高1倍" + }, + { + "FishNumber": "12027", + "FishName": "女龙王", + "FishBrief": "", + "FishType": 2, + "FishScore": 1, + "KillWeight": 20, + "PathList": [ + 1 + ], + "FishImage": "12027.png", + "FishMultipleDesc": "最高1倍" + }, + { + "FishNumber": "12028", + "FishName": "机械蝎", + "FishBrief": "", + "FishType": 2, + "FishScore": 1, + "KillWeight": 15, + "PathList": [ + 1 + ], + "FishImage": "12028.png", + "FishMultipleDesc": "最高1倍" + }, + { + "FishNumber": "12029", + "FishName": "星际巡航", + "FishBrief": "", + "FishType": 2, + "FishScore": 1, + "KillWeight": 66, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "12029.png", + "FishMultipleDesc": "最高1倍" + }, + { + "FishNumber": "12030", + "FishName": "破坏球", + "FishBrief": "", + "FishType": 2, + "FishScore": 1, + "KillWeight": 27, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "12030.png", + "FishMultipleDesc": "最高1倍" + }, + { + "FishNumber": "12031", + "FishName": "幸运轮", + "FishBrief": "", + "FishType": 5, + "FishScore": 1, + "KillWeight": 18, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "12031.png", + "FishMultipleDesc": "最高1倍" + }, + { + "FishNumber": "12032", + "FishName": "超能魔盒", + "FishBrief": "", + "FishType": 2, + "FishScore": 1, + "KillWeight": 18, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "12032.png", + "FishMultipleDesc": "最高1倍" + }, + { + "FishNumber": "12033", + "FishName": "机甲雷霆", + "FishBrief": "", + "FishType": 5, + "FishScore": 1, + "KillWeight": 16, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "12033.png", + "FishMultipleDesc": "最高1倍" + }, + { + "FishNumber": "12034", + "FishName": "烈焰风暴", + "FishBrief": "", + "FishType": 2, + "FishScore": 1, + "KillWeight": 66, + "PathList": [ + 1, + 2, + 3 + ], + "FishImage": "12034.png", + "FishMultipleDesc": "最高1倍" + } + ], + "RoomConfigs": [ + { + "RoomNumber": "20011", + "RoomName": "初级场", + "GameType": 1, + "RoomLevel": 1, + "RoomPartitionNum": 1, + "RoomCount": 29, + "RoomGoldLimit": 100000, + "CannonMultipleList": [ + 100, + 200, + 300, + 500, + 600, + 700, + 800, + 900, + 1000, + 2000 + ] + }, + { + "RoomNumber": "20012", + "RoomName": "中级场", + "GameType": 1, + "RoomLevel": 2, + "RoomPartitionNum": 1, + "RoomCount": 29, + "RoomGoldLimit": 1000000, + "CannonMultipleList": [ + 1000, + 2000, + 3000, + 5000, + 6000, + 7000, + 8000, + 9000, + 10000, + 20000 + ] + }, + { + "RoomNumber": "20013", + "RoomName": "高级场", + "GameType": 1, + "RoomLevel": 3, + "RoomPartitionNum": 2, + "RoomCount": 29, + "RoomGoldLimit": 2000000, + "CannonMultipleList": [ + 2000, + 3000, + 5000, + 6000, + 7000, + 8000, + 9000, + 10000, + 20000, + 50000 + ] + }, + { + "RoomNumber": "20021", + "RoomName": "初级场", + "GameType": 2, + "RoomLevel": 1, + "RoomPartitionNum": 1, + "RoomCount": 29, + "RoomGoldLimit": 100000, + "CannonMultipleList": [ + 100, + 200, + 300, + 500, + 600, + 700, + 800, + 900, + 1000, + 2000 + ] + }, + { + "RoomNumber": "20022", + "RoomName": "中级场", + "GameType": 2, + "RoomLevel": 2, + "RoomPartitionNum": 1, + "RoomCount": 29, + "RoomGoldLimit": 1000000, + "CannonMultipleList": [ + 1000, + 2000, + 3000, + 5000, + 6000, + 7000, + 8000, + 9000, + 10000, + 20000 + ] + }, + { + "RoomNumber": "20023", + "RoomName": "高级场", + "GameType": 2, + "RoomLevel": 3, + "RoomPartitionNum": 1, + "RoomCount": 29, + "RoomGoldLimit": 2000000, + "CannonMultipleList": [ + 2000, + 3000, + 5000, + 6000, + 7000, + 8000, + 9000, + 10000, + 20000, + 50000 + ] + }, + { + "RoomNumber": "20051", + "RoomName": "初级场", + "GameType": 5, + "RoomLevel": 1, + "RoomPartitionNum": 1, + "RoomCount": 29, + "RoomGoldLimit": 100000, + "CannonMultipleList": [ + 100, + 200, + 300, + 500, + 600, + 700, + 800, + 900, + 1000, + 2000 + ] + }, + { + "RoomNumber": "20052", + "RoomName": "中级场", + "GameType": 5, + "RoomLevel": 2, + "RoomPartitionNum": 1, + "RoomCount": 29, + "RoomGoldLimit": 1000000, + "CannonMultipleList": [ + 1000, + 2000, + 3000, + 5000, + 6000, + 7000, + 8000, + 9000, + 10000, + 20000 + ] + }, + { + "RoomNumber": "20053", + "RoomName": "高级场", + "GameType": 5, + "RoomLevel": 3, + "RoomPartitionNum": 2, + "RoomCount": 29, + "RoomGoldLimit": 2000000, + "CannonMultipleList": [ + 2000, + 3000, + 5000, + 6000, + 7000, + 8000, + 9000, + 10000, + 20000, + 50000 + ] + }, + { + "RoomNumber": "20041", + "RoomName": "初级场", + "GameType": 4, + "RoomLevel": 1, + "RoomPartitionNum": 1, + "RoomCount": 29, + "RoomGoldLimit": 100000, + "CannonMultipleList": [ + 100, + 200, + 300, + 500, + 600, + 700, + 800, + 900, + 1000, + 2000 + ] + }, + { + "RoomNumber": "20042", + "RoomName": "中级场", + "GameType": 4, + "RoomLevel": 2, + "RoomPartitionNum": 1, + "RoomCount": 29, + "RoomGoldLimit": 1000000, + "CannonMultipleList": [ + 1000, + 2000, + 3000, + 5000, + 6000, + 7000, + 8000, + 9000, + 10000, + 20000 + ] + }, + { + "RoomNumber": "20043", + "RoomName": "高级场", + "GameType": 4, + "RoomLevel": 3, + "RoomPartitionNum": 1, + "RoomCount": 29, + "RoomGoldLimit": 2000000, + "CannonMultipleList": [ + 2000, + 3000, + 5000, + 6000, + 7000, + 8000, + 9000, + 10000, + 20000, + 50000 + ] + }, + { + "RoomNumber": "20031", + "RoomName": "象棋场", + "GameType": 3, + "RoomLevel": 1, + "RoomPartitionNum": 2, + "RoomCount": 30, + "RoomGoldLimit": 100000, + "CannonMultipleList": [] + } + ], + "RoomFishConfigs": [ + { + "GameType": 1, + "NormalFishList": [ + { + "Type": 1, + "FishNumber": "11001", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "11002", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "11003", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "11004", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "11005", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "11006", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "11007", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "11008", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "11009", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "11010", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "11011", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "11012", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "11013", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "11014", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "11015", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "11016", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "11017", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 25 + }, + { + "Type": 1, + "FishNumber": "11018", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 25 + }, + { + "Type": 1, + "FishNumber": "11019", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 25 + }, + { + "Type": 1, + "FishNumber": "11020", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 25 + }, + { + "Type": 1, + "FishNumber": "11021", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 25 + }, + { + "Type": 1, + "FishNumber": "11022", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 25 + } + ], + "RoomFishLevelList": [ + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "11023", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "11023", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "11023", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "11024", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "11024", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "11024", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "11025", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "11025", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "11025", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "11026", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "11026", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "11026", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "11027", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "11027", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "11027", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "11028", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "11028", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "11029", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "11029", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "11030", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "11030", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "11031", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "11031", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "11032", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "11032", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "11033", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "11033", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "11034", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "11034", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "11035", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "11035", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "11036", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "11036", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "11037", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "11037", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "11038", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "11038", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "11039", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "11039", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "11040", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "11040", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "11041", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "11041", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "11042", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "11043", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32001", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32001", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32001", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32002", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32002", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32002", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32003", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32003", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32003", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32004", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32004", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32004", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32005", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32005", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32005", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32006", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32006", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32006", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32007", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32007", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32007", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32008", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32008", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32008", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32009", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32009", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32009", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32010", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32010", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32010", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32011", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32011", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32011", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32012", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32012", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32012", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32013", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32013", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32013", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32014", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32014", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32014", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32015", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32015", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32015", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32016", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32016", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32016", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32017", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32017", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32017", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32018", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32018", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32018", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32019", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32019", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32019", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32020", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32020", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32020", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32021", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32021", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32021", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32022", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32022", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32022", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32023", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32023", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32023", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32024", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32024", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32024", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32025", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32025", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32025", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32026", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32026", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32026", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32027", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32027", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32027", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32028", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32028", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32028", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32029", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32029", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32029", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32030", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32030", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32030", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32031", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32031", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32031", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32032", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32032", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32032", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32033", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32033", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32033", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32034", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32034", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32034", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32035", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32035", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32035", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "32036", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "32036", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "32036", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + } + ], + "RoomFishProbabilityList": [ + { + "RoomLevel": 1, + "Type": 1, + "FishType": 1, + "FirstFishCountRange": [ + 20, + 30 + ], + "TimeRange": [ + 3, + 10 + ], + "CountRange": [ + 20, + 30 + ], + "MaxCountRange": [ + 20, + 30 + ] + }, + { + "RoomLevel": 1, + "Type": 1, + "FishType": 3, + "FirstFishCountRange": [ + 2, + 3 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 2, + 3 + ], + "MaxCountRange": [ + 2, + 3 + ] + }, + { + "RoomLevel": 1, + "Type": 1, + "FishType": 2, + "FirstFishCountRange": [ + 2, + 3 + ], + "TimeRange": [ + 25, + 30 + ], + "CountRange": [ + 2, + 3 + ], + "MaxCountRange": [ + 2, + 3 + ] + }, + { + "RoomLevel": 1, + "Type": 1, + "FishType": 4, + "FirstFishCountRange": [ + 1, + 2 + ], + "TimeRange": [ + 25, + 30 + ], + "CountRange": [ + 1, + 2 + ], + "MaxCountRange": [ + 1, + 2 + ] + }, + { + "RoomLevel": 1, + "Type": 1, + "FishType": 5, + "FirstFishCountRange": [ + 1, + 1 + ], + "TimeRange": [ + 258, + 369 + ], + "CountRange": [ + 1, + 1 + ], + "MaxCountRange": [ + 1, + 1 + ] + }, + { + "RoomLevel": 1, + "Type": 2, + "FishType": 1, + "FirstFishCountRange": [ + 5, + 10 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 5, + 10 + ], + "MaxCountRange": [ + 5, + 10 + ] + }, + { + "RoomLevel": 2, + "Type": 1, + "FishType": 1, + "FirstFishCountRange": [ + 20, + 30 + ], + "TimeRange": [ + 3, + 10 + ], + "CountRange": [ + 20, + 30 + ], + "MaxCountRange": [ + 20, + 30 + ] + }, + { + "RoomLevel": 2, + "Type": 1, + "FishType": 3, + "FirstFishCountRange": [ + 2, + 3 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 2, + 3 + ], + "MaxCountRange": [ + 2, + 3 + ] + }, + { + "RoomLevel": 2, + "Type": 1, + "FishType": 2, + "FirstFishCountRange": [ + 2, + 3 + ], + "TimeRange": [ + 25, + 30 + ], + "CountRange": [ + 2, + 3 + ], + "MaxCountRange": [ + 2, + 3 + ] + }, + { + "RoomLevel": 2, + "Type": 1, + "FishType": 4, + "FirstFishCountRange": [ + 1, + 2 + ], + "TimeRange": [ + 25, + 30 + ], + "CountRange": [ + 1, + 2 + ], + "MaxCountRange": [ + 1, + 2 + ] + }, + { + "RoomLevel": 2, + "Type": 1, + "FishType": 5, + "FirstFishCountRange": [ + 1, + 1 + ], + "TimeRange": [ + 258, + 369 + ], + "CountRange": [ + 1, + 1 + ], + "MaxCountRange": [ + 1, + 1 + ] + }, + { + "RoomLevel": 2, + "Type": 2, + "FishType": 1, + "FirstFishCountRange": [ + 5, + 10 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 5, + 10 + ], + "MaxCountRange": [ + 5, + 10 + ] + }, + { + "RoomLevel": 3, + "Type": 1, + "FishType": 1, + "FirstFishCountRange": [ + 20, + 30 + ], + "TimeRange": [ + 3, + 10 + ], + "CountRange": [ + 20, + 30 + ], + "MaxCountRange": [ + 20, + 30 + ] + }, + { + "RoomLevel": 3, + "Type": 1, + "FishType": 3, + "FirstFishCountRange": [ + 2, + 3 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 2, + 3 + ], + "MaxCountRange": [ + 2, + 3 + ] + }, + { + "RoomLevel": 3, + "Type": 1, + "FishType": 2, + "FirstFishCountRange": [ + 2, + 3 + ], + "TimeRange": [ + 25, + 30 + ], + "CountRange": [ + 2, + 3 + ], + "MaxCountRange": [ + 2, + 3 + ] + }, + { + "RoomLevel": 3, + "Type": 1, + "FishType": 4, + "FirstFishCountRange": [ + 1, + 2 + ], + "TimeRange": [ + 25, + 30 + ], + "CountRange": [ + 1, + 2 + ], + "MaxCountRange": [ + 1, + 2 + ] + }, + { + "RoomLevel": 3, + "Type": 1, + "FishType": 5, + "FirstFishCountRange": [ + 1, + 1 + ], + "TimeRange": [ + 258, + 369 + ], + "CountRange": [ + 1, + 1 + ], + "MaxCountRange": [ + 1, + 1 + ] + }, + { + "RoomLevel": 3, + "Type": 2, + "FishType": 1, + "FirstFishCountRange": [ + 5, + 10 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 5, + 10 + ], + "MaxCountRange": [ + 5, + 10 + ] + } + ] + }, + { + "GameType": 2, + "NormalFishList": [ + { + "Type": 1, + "FishNumber": "15001", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15002", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15003", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15004", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15005", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15006", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15007", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15008", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15009", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15010", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15011", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15012", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15013", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15014", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15015", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15016", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15017", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15018", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15019", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15020", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15021", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15022", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15023", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15024", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15025", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15026", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15027", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15028", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15029", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15030", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15031", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15032", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15033", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15034", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15035", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15036", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15037", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15038", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15039", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15040", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15041", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15042", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15043", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15044", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15045", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15046", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15047", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15048", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15049", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15050", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15051", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15052", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15053", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15054", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15055", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15056", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15057", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15058", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15059", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15060", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15061", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15062", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15063", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15064", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15065", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15066", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15067", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15068", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15069", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15070", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15071", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15072", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15073", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15074", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15075", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15076", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15077", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15078", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15079", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15080", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15081", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15082", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15083", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15084", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15085", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15086", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15087", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15088", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "15089", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + } + ], + "RoomFishLevelList": [ + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "15090", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "15091", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "15092", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "15093", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "15094", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "15095", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "15096", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "15097", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "15098", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "15099", + "FishWeight": 1, + "FishFrequency": 60, + "MaxCount": 1, + "Times": 10 + } + ], + "RoomFishProbabilityList": [ + { + "RoomLevel": 1, + "Type": 1, + "FishType": 1, + "FirstFishCountRange": [ + 20, + 30 + ], + "TimeRange": [ + 3, + 10 + ], + "CountRange": [ + 20, + 30 + ], + "MaxCountRange": [ + 20, + 30 + ] + }, + { + "RoomLevel": 1, + "Type": 1, + "FishType": 3, + "FirstFishCountRange": [ + 2, + 3 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 2, + 3 + ], + "MaxCountRange": [ + 1, + 1 + ] + }, + { + "RoomLevel": 1, + "Type": 1, + "FishType": 2, + "FirstFishCountRange": [ + 2, + 3 + ], + "TimeRange": [ + 30, + 30 + ], + "CountRange": [ + 2, + 3 + ], + "MaxCountRange": [ + 1, + 1 + ] + }, + { + "RoomLevel": 1, + "Type": 1, + "FishType": 4, + "FirstFishCountRange": [ + 1, + 2 + ], + "TimeRange": [ + 30, + 30 + ], + "CountRange": [ + 1, + 2 + ], + "MaxCountRange": [ + 1, + 2 + ] + }, + { + "RoomLevel": 1, + "Type": 1, + "FishType": 5, + "FirstFishCountRange": [ + 1, + 1 + ], + "TimeRange": [ + 30, + 30 + ], + "CountRange": [ + 1, + 1 + ], + "MaxCountRange": [ + 1, + 1 + ] + }, + { + "RoomLevel": 1, + "Type": 2, + "FishType": 1, + "FirstFishCountRange": [ + 5, + 10 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 5, + 10 + ], + "MaxCountRange": [ + 5, + 10 + ] + }, + { + "RoomLevel": 2, + "Type": 1, + "FishType": 1, + "FirstFishCountRange": [ + 20, + 30 + ], + "TimeRange": [ + 3, + 10 + ], + "CountRange": [ + 20, + 30 + ], + "MaxCountRange": [ + 20, + 30 + ] + }, + { + "RoomLevel": 2, + "Type": 1, + "FishType": 3, + "FirstFishCountRange": [ + 2, + 3 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 2, + 3 + ], + "MaxCountRange": [ + 1, + 1 + ] + }, + { + "RoomLevel": 2, + "Type": 1, + "FishType": 2, + "FirstFishCountRange": [ + 2, + 3 + ], + "TimeRange": [ + 30, + 30 + ], + "CountRange": [ + 2, + 3 + ], + "MaxCountRange": [ + 2, + 3 + ] + }, + { + "RoomLevel": 2, + "Type": 1, + "FishType": 4, + "FirstFishCountRange": [ + 1, + 2 + ], + "TimeRange": [ + 30, + 30 + ], + "CountRange": [ + 1, + 2 + ], + "MaxCountRange": [ + 1, + 2 + ] + }, + { + "RoomLevel": 2, + "Type": 1, + "FishType": 5, + "FirstFishCountRange": [ + 1, + 1 + ], + "TimeRange": [ + 30, + 30 + ], + "CountRange": [ + 1, + 1 + ], + "MaxCountRange": [ + 1, + 1 + ] + }, + { + "RoomLevel": 2, + "Type": 2, + "FishType": 1, + "FirstFishCountRange": [ + 5, + 10 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 5, + 10 + ], + "MaxCountRange": [ + 5, + 10 + ] + }, + { + "RoomLevel": 3, + "Type": 1, + "FishType": 1, + "FirstFishCountRange": [ + 20, + 30 + ], + "TimeRange": [ + 3, + 10 + ], + "CountRange": [ + 20, + 30 + ], + "MaxCountRange": [ + 20, + 30 + ] + }, + { + "RoomLevel": 3, + "Type": 1, + "FishType": 3, + "FirstFishCountRange": [ + 2, + 3 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 2, + 3 + ], + "MaxCountRange": [ + 2, + 3 + ] + }, + { + "RoomLevel": 3, + "Type": 1, + "FishType": 2, + "FirstFishCountRange": [ + 2, + 3 + ], + "TimeRange": [ + 30, + 30 + ], + "CountRange": [ + 2, + 3 + ], + "MaxCountRange": [ + 2, + 3 + ] + }, + { + "RoomLevel": 3, + "Type": 1, + "FishType": 4, + "FirstFishCountRange": [ + 1, + 2 + ], + "TimeRange": [ + 30, + 30 + ], + "CountRange": [ + 1, + 2 + ], + "MaxCountRange": [ + 1, + 2 + ] + }, + { + "RoomLevel": 3, + "Type": 1, + "FishType": 5, + "FirstFishCountRange": [ + 1, + 1 + ], + "TimeRange": [ + 30, + 30 + ], + "CountRange": [ + 1, + 1 + ], + "MaxCountRange": [ + 1, + 1 + ] + }, + { + "RoomLevel": 3, + "Type": 2, + "FishType": 1, + "FirstFishCountRange": [ + 5, + 10 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 5, + 10 + ], + "MaxCountRange": [ + 5, + 10 + ] + } + ] + }, + { + "GameType": 5, + "NormalFishList": [ + { + "Type": 1, + "FishNumber": "13001", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "13002", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "13003", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "13004", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "13005", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "13006", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "13007", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "13008", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "13009", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "13010", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "13011", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "13012", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "13013", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "13014", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "13015", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "13016", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "13017", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "13018", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 25 + }, + { + "Type": 1, + "FishNumber": "13019", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 25 + }, + { + "Type": 1, + "FishNumber": "13020", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 25 + }, + { + "Type": 1, + "FishNumber": "13021", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 25 + }, + { + "Type": 1, + "FishNumber": "13022", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 25 + }, + { + "Type": 1, + "FishNumber": "13023", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 25 + } + ], + "RoomFishLevelList": [ + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "13024", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "13024", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "13024", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "13025", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "13025", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "13025", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "13026", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "13026", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "13026", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "13027", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "13027", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "13027", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "13028", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "13028", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "13028", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "13029", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "13029", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "13029", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "13030", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "13030", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "13030", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "13031", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "13031", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "13031", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "13032", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "13032", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "13032", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "13033", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "13033", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "13033", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "13034", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "13034", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "13034", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "13035", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "13035", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "13035", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "13036", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "13036", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "13037", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "13037", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "13038", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "13038", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "13039", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "13039", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "13040", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "13040", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "31001", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "31001", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "31001", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "31002", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "31002", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "31002", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "31003", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "31003", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "31003", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "31004", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "31004", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "31004", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "31005", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "31005", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "31005", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "31006", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "31006", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "31006", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "31007", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "31007", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "31007", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "31008", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "31008", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "31008", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "31009", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "31009", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "31009", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "31010", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "31010", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "31010", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "31011", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "31011", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "31011", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "31012", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "31012", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "31012", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "31013", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "31013", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "31013", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 20 + } + ], + "RoomFishProbabilityList": [ + { + "RoomLevel": 1, + "Type": 1, + "FishType": 1, + "FirstFishCountRange": [ + 5, + 10 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 10, + 20 + ], + "MaxCountRange": [ + 5, + 10 + ] + }, + { + "RoomLevel": 1, + "Type": 1, + "FishType": 3, + "FirstFishCountRange": [ + 1, + 2 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 1, + 2 + ], + "MaxCountRange": [ + 1, + 2 + ] + }, + { + "RoomLevel": 1, + "Type": 1, + "FishType": 2, + "FirstFishCountRange": [ + 1, + 2 + ], + "TimeRange": [ + 25, + 30 + ], + "CountRange": [ + 1, + 2 + ], + "MaxCountRange": [ + 1, + 2 + ] + }, + { + "RoomLevel": 1, + "Type": 1, + "FishType": 5, + "FirstFishCountRange": [ + 1, + 2 + ], + "TimeRange": [ + 258, + 369 + ], + "CountRange": [ + 1, + 2 + ], + "MaxCountRange": [ + 1, + 2 + ] + }, + { + "RoomLevel": 1, + "Type": 1, + "FishType": 4, + "FirstFishCountRange": [ + 1, + 2 + ], + "TimeRange": [ + 25, + 30 + ], + "CountRange": [ + 1, + 2 + ], + "MaxCountRange": [ + 2, + 3 + ] + }, + { + "RoomLevel": 1, + "Type": 2, + "FishType": 1, + "FirstFishCountRange": [ + 3, + 5 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 5, + 10 + ], + "MaxCountRange": [ + 10, + 20 + ] + }, + { + "RoomLevel": 2, + "Type": 1, + "FishType": 1, + "FirstFishCountRange": [ + 5, + 10 + ], + "TimeRange": [ + 5, + 10 + ], + "CountRange": [ + 10, + 20 + ], + "MaxCountRange": [ + 5, + 10 + ] + }, + { + "RoomLevel": 2, + "Type": 1, + "FishType": 3, + "FirstFishCountRange": [ + 1, + 2 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 1, + 2 + ], + "MaxCountRange": [ + 1, + 2 + ] + }, + { + "RoomLevel": 2, + "Type": 1, + "FishType": 2, + "FirstFishCountRange": [ + 1, + 2 + ], + "TimeRange": [ + 25, + 30 + ], + "CountRange": [ + 1, + 2 + ], + "MaxCountRange": [ + 1, + 2 + ] + }, + { + "RoomLevel": 2, + "Type": 1, + "FishType": 5, + "FirstFishCountRange": [ + 1, + 2 + ], + "TimeRange": [ + 258, + 369 + ], + "CountRange": [ + 1, + 2 + ], + "MaxCountRange": [ + 1, + 2 + ] + }, + { + "RoomLevel": 2, + "Type": 1, + "FishType": 4, + "FirstFishCountRange": [ + 1, + 2 + ], + "TimeRange": [ + 25, + 30 + ], + "CountRange": [ + 1, + 2 + ], + "MaxCountRange": [ + 2, + 3 + ] + }, + { + "RoomLevel": 2, + "Type": 2, + "FishType": 1, + "FirstFishCountRange": [ + 3, + 5 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 5, + 10 + ], + "MaxCountRange": [ + 10, + 20 + ] + }, + { + "RoomLevel": 3, + "Type": 1, + "FishType": 1, + "FirstFishCountRange": [ + 5, + 10 + ], + "TimeRange": [ + 5, + 10 + ], + "CountRange": [ + 10, + 20 + ], + "MaxCountRange": [ + 5, + 10 + ] + }, + { + "RoomLevel": 3, + "Type": 1, + "FishType": 3, + "FirstFishCountRange": [ + 1, + 2 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 1, + 2 + ], + "MaxCountRange": [ + 1, + 2 + ] + }, + { + "RoomLevel": 3, + "Type": 1, + "FishType": 2, + "FirstFishCountRange": [ + 1, + 2 + ], + "TimeRange": [ + 25, + 30 + ], + "CountRange": [ + 1, + 2 + ], + "MaxCountRange": [ + 1, + 2 + ] + }, + { + "RoomLevel": 3, + "Type": 1, + "FishType": 5, + "FirstFishCountRange": [ + 1, + 2 + ], + "TimeRange": [ + 258, + 369 + ], + "CountRange": [ + 1, + 2 + ], + "MaxCountRange": [ + 1, + 2 + ] + }, + { + "RoomLevel": 3, + "Type": 1, + "FishType": 4, + "FirstFishCountRange": [ + 1, + 2 + ], + "TimeRange": [ + 25, + 30 + ], + "CountRange": [ + 1, + 2 + ], + "MaxCountRange": [ + 2, + 3 + ] + }, + { + "RoomLevel": 3, + "Type": 2, + "FishType": 1, + "FirstFishCountRange": [ + 3, + 5 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 5, + 10 + ], + "MaxCountRange": [ + 10, + 20 + ] + } + ] + }, + { + "GameType": 4, + "NormalFishList": [ + { + "Type": 1, + "FishNumber": "12010", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "12011", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "12012", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "12013", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "12014", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "12015", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "12016", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "12017", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "12018", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "12019", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 20 + }, + { + "Type": 1, + "FishNumber": "12020", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + }, + { + "Type": 1, + "FishNumber": "12021", + "FishWeight": 40, + "FishFrequency": 5, + "MaxCount": 1, + "Times": 10 + } + ], + "RoomFishLevelList": [ + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "12022", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "12022", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "12022", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "12023", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "12023", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "12023", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "12024", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "12024", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "12024", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "12025", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "12025", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "12025", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 1, + "Type": 1, + "FishNumber": "12026", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "12026", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "12026", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "12027", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "12027", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "12028", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "12028", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "12029", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "12029", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "12030", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "12030", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "12031", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "12031", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "12032", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "12032", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "12033", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "12033", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 2, + "Type": 1, + "FishNumber": "12034", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 3, + "Type": 1, + "FishNumber": "12034", + "FishWeight": 1, + "FishFrequency": 30, + "MaxCount": 1, + "Times": 30 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30001", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30001", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30001", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30002", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30002", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30002", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30003", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30003", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30003", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30004", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30004", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30004", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30005", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30005", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30005", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30006", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30006", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30006", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30007", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30007", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30007", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30008", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30008", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30008", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30009", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30009", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30009", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30010", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30010", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30010", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30011", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30011", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30011", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30012", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30012", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30012", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30013", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30013", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30013", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30014", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30014", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30014", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30015", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30015", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30015", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30016", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30016", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30016", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30017", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30017", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30017", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30018", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30018", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30018", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30019", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30019", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30019", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30020", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30020", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30020", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30021", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30021", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30021", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30022", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30022", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30022", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30023", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30023", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30023", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30024", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30024", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30024", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30025", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30025", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30025", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30026", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30026", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30026", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30027", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30027", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30027", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30028", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30028", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30028", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30029", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30029", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30029", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30030", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30030", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30030", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30031", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30031", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30031", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30032", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30032", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30032", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30033", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30033", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30033", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30034", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30034", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30034", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30035", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30035", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30035", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30036", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30036", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30036", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30037", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30037", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30037", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30038", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30038", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30038", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30039", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30039", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30039", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30040", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30040", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30040", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30041", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30041", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30041", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30042", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30042", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30042", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30043", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30043", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30043", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30044", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30044", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30044", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30045", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30045", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30045", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30046", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30046", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30046", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30047", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30047", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30047", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30048", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30048", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30048", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30049", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30049", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30049", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30050", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30050", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30050", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30051", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30051", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30051", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30052", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30052", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30052", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30053", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30053", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30053", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30054", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30054", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30054", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30055", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30055", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30055", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30056", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30056", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30056", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30057", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30057", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30057", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30058", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30058", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30058", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30059", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30059", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30059", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30060", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30060", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30060", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30061", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30061", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30061", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30062", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30062", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30062", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30063", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30063", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30063", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30064", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30064", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30064", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30065", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30065", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30065", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30066", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30066", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30066", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30067", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30067", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30067", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30068", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30068", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30068", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30069", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30069", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30069", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30070", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30070", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30070", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30071", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30071", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30071", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30072", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30072", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30072", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30073", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30073", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30073", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30074", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30074", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30074", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30075", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30075", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30075", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30076", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30076", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30076", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30077", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30077", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30077", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30078", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30078", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30078", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30079", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30079", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30079", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30080", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30080", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30080", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30081", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30081", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30081", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30082", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30082", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30082", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30083", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30083", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30083", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30084", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30084", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30084", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30085", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30085", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30085", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30086", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30086", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30086", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30087", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30087", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30087", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30088", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30088", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30088", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30089", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30089", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30089", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 1, + "Type": 2, + "FishNumber": "30090", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 2, + "Type": 2, + "FishNumber": "30090", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + }, + { + "RoomLevel": 3, + "Type": 2, + "FishNumber": "30090", + "FishWeight": 1, + "FishFrequency": 100, + "MaxCount": 1, + "Times": 10 + } + ], + "RoomFishProbabilityList": [ + { + "RoomLevel": 1, + "Type": 1, + "FishType": 1, + "FirstFishCountRange": [ + 20, + 30 + ], + "TimeRange": [ + 3, + 10 + ], + "CountRange": [ + 20, + 30 + ], + "MaxCountRange": [ + 20, + 30 + ] + }, + { + "RoomLevel": 1, + "Type": 1, + "FishType": 3, + "FirstFishCountRange": [ + 2, + 3 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 2, + 3 + ], + "MaxCountRange": [ + 1, + 1 + ] + }, + { + "RoomLevel": 1, + "Type": 1, + "FishType": 2, + "FirstFishCountRange": [ + 2, + 3 + ], + "TimeRange": [ + 30, + 30 + ], + "CountRange": [ + 2, + 3 + ], + "MaxCountRange": [ + 1, + 1 + ] + }, + { + "RoomLevel": 1, + "Type": 1, + "FishType": 5, + "FirstFishCountRange": [ + 1, + 1 + ], + "TimeRange": [ + 30, + 30 + ], + "CountRange": [ + 1, + 1 + ], + "MaxCountRange": [ + 1, + 1 + ] + }, + { + "RoomLevel": 3, + "Type": 1, + "FishType": 5, + "FirstFishCountRange": [ + 1, + 1 + ], + "TimeRange": [ + 258, + 369 + ], + "CountRange": [ + 1, + 1 + ], + "MaxCountRange": [ + 1, + 1 + ] + }, + { + "RoomLevel": 1, + "Type": 2, + "FishType": 1, + "FirstFishCountRange": [ + 5, + 10 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 5, + 10 + ], + "MaxCountRange": [ + 5, + 10 + ] + }, + { + "RoomLevel": 2, + "Type": 1, + "FishType": 1, + "FirstFishCountRange": [ + 20, + 30 + ], + "TimeRange": [ + 3, + 10 + ], + "CountRange": [ + 20, + 30 + ], + "MaxCountRange": [ + 20, + 30 + ] + }, + { + "RoomLevel": 2, + "Type": 1, + "FishType": 3, + "FirstFishCountRange": [ + 2, + 3 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 2, + 3 + ], + "MaxCountRange": [ + 1, + 2 + ] + }, + { + "RoomLevel": 2, + "Type": 1, + "FishType": 2, + "FirstFishCountRange": [ + 2, + 3 + ], + "TimeRange": [ + 30, + 30 + ], + "CountRange": [ + 2, + 3 + ], + "MaxCountRange": [ + 2, + 3 + ] + }, + { + "RoomLevel": 2, + "Type": 1, + "FishType": 4, + "FirstFishCountRange": [ + 1, + 2 + ], + "TimeRange": [ + 30, + 30 + ], + "CountRange": [ + 1, + 2 + ], + "MaxCountRange": [ + 1, + 2 + ] + }, + { + "RoomLevel": 2, + "Type": 1, + "FishType": 5, + "FirstFishCountRange": [ + 1, + 2 + ], + "TimeRange": [ + 60, + 90 + ], + "CountRange": [ + 1, + 1 + ], + "MaxCountRange": [ + 1, + 1 + ] + }, + { + "RoomLevel": 2, + "Type": 2, + "FishType": 1, + "FirstFishCountRange": [ + 5, + 10 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 5, + 10 + ], + "MaxCountRange": [ + 5, + 10 + ] + }, + { + "RoomLevel": 3, + "Type": 1, + "FishType": 1, + "FirstFishCountRange": [ + 20, + 30 + ], + "TimeRange": [ + 3, + 10 + ], + "CountRange": [ + 20, + 30 + ], + "MaxCountRange": [ + 20, + 30 + ] + }, + { + "RoomLevel": 3, + "Type": 1, + "FishType": 3, + "FirstFishCountRange": [ + 2, + 3 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 2, + 3 + ], + "MaxCountRange": [ + 1, + 1 + ] + }, + { + "RoomLevel": 3, + "Type": 1, + "FishType": 2, + "FirstFishCountRange": [ + 2, + 3 + ], + "TimeRange": [ + 30, + 30 + ], + "CountRange": [ + 2, + 3 + ], + "MaxCountRange": [ + 2, + 3 + ] + }, + { + "RoomLevel": 3, + "Type": 1, + "FishType": 4, + "FirstFishCountRange": [ + 1, + 2 + ], + "TimeRange": [ + 30, + 30 + ], + "CountRange": [ + 1, + 2 + ], + "MaxCountRange": [ + 1, + 2 + ] + }, + { + "RoomLevel": 3, + "Type": 1, + "FishType": 5, + "FirstFishCountRange": [ + 1, + 1 + ], + "TimeRange": [ + 30, + 30 + ], + "CountRange": [ + 1, + 1 + ], + "MaxCountRange": [ + 1, + 1 + ] + }, + { + "RoomLevel": 3, + "Type": 2, + "FishType": 1, + "FirstFishCountRange": [ + 5, + 10 + ], + "TimeRange": [ + 15, + 20 + ], + "CountRange": [ + 5, + 10 + ], + "MaxCountRange": [ + 5, + 10 + ] + } + ] + } + ], + "FishArrayConfigs": [ + { + "FishArrayNumber": "31001", + "Name": "小蓝鱼顺序鱼阵", + "FishNumber": "13001", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "71001", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "31002", + "Name": "小黄鱼顺序鱼阵", + "FishNumber": "13002", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "71002", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "31003", + "Name": "小飞鱼顺序鱼阵", + "FishNumber": "13003", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "71003", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "31004", + "Name": "小丑鱼顺序鱼阵", + "FishNumber": "13004", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "71004", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "31005", + "Name": "神仙鱼顺序鱼阵", + "FishNumber": "13005", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "71005", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "31006", + "Name": "灯笼鱼顺序鱼阵", + "FishNumber": "13006", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "71006", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "31007", + "Name": "孔雀鱼顺序鱼阵", + "FishNumber": "13007", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "71007", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "31008", + "Name": "小龙虾顺序鱼阵", + "FishNumber": "13008", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "71008", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "31009", + "Name": "狮子鱼顺序鱼阵", + "FishNumber": "13009", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "71009", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "31010", + "Name": "水母顺序鱼阵", + "FishNumber": "13010", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "71010", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "31011", + "Name": "刺豚顺序鱼阵", + "FishNumber": "13011", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "71011", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "31012", + "Name": "海龟顺序鱼阵", + "FishNumber": "13012", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "71012", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "31013", + "Name": "蝙蝠鱼顺序鱼阵", + "FishNumber": "13013", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "71013", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30001", + "Name": "红刹扇形鱼阵", + "FishNumber": "12004", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70002", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30002", + "Name": "蝎子扇形鱼阵", + "FishNumber": "12002", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70002", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30003", + "Name": "赤日扇形鱼阵", + "FishNumber": "12010", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70002", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30004", + "Name": "白羽扇形鱼阵", + "FishNumber": "12005", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70002", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30005", + "Name": "雷霆扇形鱼阵", + "FishNumber": "12007", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70002", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30006", + "Name": "紫虹扇形鱼阵", + "FishNumber": "12009", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70002", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30007", + "Name": "红刹扇形鱼阵", + "FishNumber": "12004", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70001", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30008", + "Name": "蝎子扇形鱼阵", + "FishNumber": "12002", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70001", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30009", + "Name": "赤日扇形鱼阵", + "FishNumber": "12010", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70001", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30010", + "Name": "白羽扇形鱼阵", + "FishNumber": "12005", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70001", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30011", + "Name": "雷霆扇形鱼阵", + "FishNumber": "12007", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70001", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30012", + "Name": "紫虹扇形鱼阵", + "FishNumber": "12009", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70002", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30013", + "Name": "白羽圆形鱼阵", + "FishNumber": "12005", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70101", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30014", + "Name": "白羽圆形鱼阵", + "FishNumber": "12005", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70102", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30015", + "Name": "白羽圆形鱼阵", + "FishNumber": "12005", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70103", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30016", + "Name": "白羽圆形鱼阵", + "FishNumber": "12005", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70104", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30017", + "Name": "红刹圆形鱼阵", + "FishNumber": "12004", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70101", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30018", + "Name": "红刹圆形鱼阵", + "FishNumber": "12004", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70102", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30019", + "Name": "红刹圆形鱼阵", + "FishNumber": "12004", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70103", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30020", + "Name": "红刹圆形鱼阵", + "FishNumber": "12004", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70104", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30021", + "Name": "蝎子圆形鱼阵", + "FishNumber": "12002", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70101", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30022", + "Name": "蝎子圆形鱼阵", + "FishNumber": "12002", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70102", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30023", + "Name": "蝎子圆形鱼阵", + "FishNumber": "12002", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70103", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30024", + "Name": "蝎子圆形鱼阵", + "FishNumber": "12002", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70104", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30025", + "Name": "绿风弧形鱼阵", + "FishNumber": "12001", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70201", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30026", + "Name": "黄蜂弧形鱼阵", + "FishNumber": "12003", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70201", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30027", + "Name": "红刹弧形鱼阵", + "FishNumber": "12004", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70201", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30028", + "Name": "白羽弧形鱼阵", + "FishNumber": "12005", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70201", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30029", + "Name": "蔷薇弧形鱼阵", + "FishNumber": "12006", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70201", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30030", + "Name": "雷霆弧形鱼阵", + "FishNumber": "12007", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70201", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30031", + "Name": "绿风弧形鱼阵", + "FishNumber": "12001", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70202", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30032", + "Name": "黄蜂弧形鱼阵", + "FishNumber": "12003", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70202", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30033", + "Name": "红刹弧形鱼阵", + "FishNumber": "12004", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70202", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30034", + "Name": "白羽弧形鱼阵", + "FishNumber": "12005", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70202", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30035", + "Name": "蔷薇弧形鱼阵", + "FishNumber": "12006", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70202", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30036", + "Name": "雷霆弧形鱼阵", + "FishNumber": "12007", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70202", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30037", + "Name": "星火三圈顺序鱼阵", + "FishNumber": "12008", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70203", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30038", + "Name": "紫虹三圈顺序鱼阵", + "FishNumber": "12009", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70203", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30039", + "Name": "蔷薇三圈顺序鱼阵", + "FishNumber": "12006", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70204", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30040", + "Name": "雷霆三圈顺序鱼阵", + "FishNumber": "12007", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70204", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30041", + "Name": "白羽单圈顺序鱼阵", + "FishNumber": "12005", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70205", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30042", + "Name": "白羽单圈顺序鱼阵", + "FishNumber": "12005", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70206", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30043", + "Name": "蔷薇曲线顺序鱼阵", + "FishNumber": "12006", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70203", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30044", + "Name": "雷霆曲线顺序鱼阵", + "FishNumber": "12007", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70207", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30045", + "Name": "星火曲线顺序鱼阵", + "FishNumber": "12008", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70207", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30046", + "Name": "紫虹曲线顺序鱼阵", + "FishNumber": "12009", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70207", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30047", + "Name": "蔷薇曲线顺序鱼阵", + "FishNumber": "12006", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70208", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30048", + "Name": "雷霆曲线顺序鱼阵", + "FishNumber": "12007", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70208", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30049", + "Name": "星火曲线顺序鱼阵", + "FishNumber": "12008", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70208", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30050", + "Name": "紫虹曲线顺序鱼阵", + "FishNumber": "12009", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70208", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30051", + "Name": "绿风弧形鱼阵", + "FishNumber": "12001", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70210", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30052", + "Name": "黄蜂弧形鱼阵", + "FishNumber": "12003", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70210", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30053", + "Name": "红刹弧形鱼阵", + "FishNumber": "12004", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70210", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30054", + "Name": "白羽弧形鱼阵", + "FishNumber": "12005", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70211", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30055", + "Name": "蔷薇弧形鱼阵", + "FishNumber": "12006", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70211", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30056", + "Name": "雷霆弧形鱼阵", + "FishNumber": "12007", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70211", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30057", + "Name": "绿风弧形鱼阵", + "FishNumber": "12001", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70212", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30058", + "Name": "黄蜂弧形鱼阵", + "FishNumber": "12003", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70212", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30059", + "Name": "红刹弧形鱼阵", + "FishNumber": "12004", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70212", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30060", + "Name": "雷霆曲线顺序鱼阵", + "FishNumber": "12007", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70213", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30061", + "Name": "星火曲线顺序鱼阵", + "FishNumber": "12008", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70213", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30062", + "Name": "紫虹曲线顺序鱼阵", + "FishNumber": "12009", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70213", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30063", + "Name": "绿风弧形鱼阵", + "FishNumber": "12001", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70214", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30064", + "Name": "黄蜂弧形鱼阵", + "FishNumber": "12003", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70214", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30065", + "Name": "红刹弧形鱼阵", + "FishNumber": "12004", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70215", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30066", + "Name": "白羽弧形鱼阵", + "FishNumber": "12005", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70215", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30067", + "Name": "蔷薇弧形鱼阵", + "FishNumber": "12006", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70216", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30068", + "Name": "雷霆弧形鱼阵", + "FishNumber": "12007", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70216", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30069", + "Name": "星火三圈顺序鱼阵", + "FishNumber": "12008", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70217", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30070", + "Name": "紫虹三圈顺序鱼阵", + "FishNumber": "12009", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70217", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30071", + "Name": "绿风弧形鱼阵", + "FishNumber": "12001", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70218", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30072", + "Name": "黄蜂弧形鱼阵", + "FishNumber": "12003", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70218", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30073", + "Name": "红刹弧形鱼阵", + "FishNumber": "12004", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70219", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30074", + "Name": "白羽弧形鱼阵", + "FishNumber": "12005", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70219", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30075", + "Name": "蔷薇弧形鱼阵", + "FishNumber": "12006", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70220", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30076", + "Name": "雷霆弧形鱼阵", + "FishNumber": "12007", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70220", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30077", + "Name": "星火三圈顺序鱼阵", + "FishNumber": "12008", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70221", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30078", + "Name": "紫虹三圈顺序鱼阵", + "FishNumber": "12009", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70221", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30079", + "Name": "绿风弧形鱼阵", + "FishNumber": "12001", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70222", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30080", + "Name": "黄蜂弧形鱼阵", + "FishNumber": "12003", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70222", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30081", + "Name": "红刹弧形鱼阵", + "FishNumber": "12004", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70223", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30082", + "Name": "白羽弧形鱼阵", + "FishNumber": "12005", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70223", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30083", + "Name": "蔷薇弧形鱼阵", + "FishNumber": "12006", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70224", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30084", + "Name": "雷霆弧形鱼阵", + "FishNumber": "12007", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70224", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30085", + "Name": "星火三圈顺序鱼阵", + "FishNumber": "12008", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70225", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30086", + "Name": "紫虹三圈顺序鱼阵", + "FishNumber": "12009", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70225", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30087", + "Name": "红刹扇形鱼阵", + "FishNumber": "12004", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70004", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30088", + "Name": "蝎子扇形鱼阵", + "FishNumber": "12002", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70004", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30089", + "Name": "红刹扇形鱼阵", + "FishNumber": "12004", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70003", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "30090", + "Name": "蝎子扇形鱼阵", + "FishNumber": "12002", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70003", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32001", + "Name": "彩虹鱼顺序鱼阵1", + "FishNumber": "11001", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70401", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32002", + "Name": "小丑鱼顺序鱼阵1", + "FishNumber": "11002", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70402", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32003", + "Name": "热带鱼顺序鱼阵1", + "FishNumber": "11003", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70403", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32004", + "Name": "乌贼顺序鱼阵1", + "FishNumber": "11004", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70404", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32005", + "Name": "箭鱼顺序鱼阵1", + "FishNumber": "11005", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70405", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32006", + "Name": "斑点鱼顺序鱼阵1", + "FishNumber": "11006", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70406", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32007", + "Name": "海龟顺序鱼阵1", + "FishNumber": "11007", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70407", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32008", + "Name": "小河豚顺序鱼阵1", + "FishNumber": "11008", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70408", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32009", + "Name": "蝴蝶鱼顺序鱼阵1", + "FishNumber": "11009", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70409", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32010", + "Name": "裙摆鱼顺序鱼阵1", + "FishNumber": "11010", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70410", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32011", + "Name": "水母顺序鱼阵1", + "FishNumber": "11011", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70411", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32012", + "Name": "海马顺序鱼阵1", + "FishNumber": "11012", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70412", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32013", + "Name": "锅盔鱼顺序鱼阵1", + "FishNumber": "11013", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70413", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32014", + "Name": "蝙蝠鱼顺序鱼阵1", + "FishNumber": "11014", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70414", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32015", + "Name": "锯齿鲨顺序鱼阵1", + "FishNumber": "11015", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70415", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32016", + "Name": "鲨鱼顺序鱼阵1", + "FishNumber": "11016", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70416", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32017", + "Name": "彩虹鱼顺序鱼阵2", + "FishNumber": "11001", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70417", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32018", + "Name": "小丑鱼顺序鱼阵2", + "FishNumber": "11002", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70418", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32019", + "Name": "热带鱼顺序鱼阵2", + "FishNumber": "11003", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70419", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32020", + "Name": "乌贼顺序鱼阵2", + "FishNumber": "11004", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70420", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32021", + "Name": "箭鱼顺序鱼阵2", + "FishNumber": "11005", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70421", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32022", + "Name": "斑点鱼顺序鱼阵2", + "FishNumber": "11006", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70422", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32023", + "Name": "海龟顺序鱼阵2", + "FishNumber": "11007", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70423", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32024", + "Name": "小河豚顺序鱼阵2", + "FishNumber": "11008", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70424", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32025", + "Name": "蝴蝶鱼顺序鱼阵2", + "FishNumber": "11009", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70425", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32026", + "Name": "裙摆鱼顺序鱼阵2", + "FishNumber": "11010", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70426", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32027", + "Name": "水母顺序鱼阵2", + "FishNumber": "11011", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70427", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32028", + "Name": "海马顺序鱼阵2", + "FishNumber": "11012", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70428", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32029", + "Name": "锅盔鱼顺序鱼阵2", + "FishNumber": "11013", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70429", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32030", + "Name": "蝙蝠鱼顺序鱼阵2", + "FishNumber": "11014", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70430", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32031", + "Name": "锯齿鲨顺序鱼阵2", + "FishNumber": "11015", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70431", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32032", + "Name": "鲨鱼顺序鱼阵2", + "FishNumber": "11016", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70432", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32033", + "Name": "彩虹鱼顺序鱼阵3", + "FishNumber": "11001", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70433", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32034", + "Name": "小丑鱼顺序鱼阵3", + "FishNumber": "11002", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70434", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32035", + "Name": "热带鱼顺序鱼阵3", + "FishNumber": "11003", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70435", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + }, + { + "FishArrayNumber": "32036", + "Name": "乌贼顺序鱼阵3", + "FishNumber": "11004", + "FishCount": 1, + "BossFishNumber": "", + "BoosCount": 0, + "ArrayNumber": "70436", + "ThresholdList": [ + 5, + 10 + ], + "GenerateFrequency": 0.2 + } + ], + "UserLevelConfigs": [ + { + "Level": 1, + "ExpMin": 1501, + "ExpMax": 3750, + "Gold": 1000, + "Diamond": 20, + "ProductList": [ + { + "Count": 3, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 3, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 2, + "ExpMin": 3751, + "ExpMax": 5625, + "Gold": 1200, + "Diamond": 20, + "ProductList": [ + { + "Count": 3, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 3, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 3, + "ExpMin": 5626, + "ExpMax": 8438, + "Gold": 1500, + "Diamond": 20, + "ProductList": [ + { + "Count": 3, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 3, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 4, + "ExpMin": 8439, + "ExpMax": 12656, + "Gold": 2000, + "Diamond": 20, + "ProductList": [ + { + "Count": 5, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 5, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 5, + "ExpMin": 12657, + "ExpMax": 18984, + "Gold": 3000, + "Diamond": 20, + "ProductList": [ + { + "Count": 5, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 5, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 6, + "ExpMin": 18985, + "ExpMax": 28477, + "Gold": 5000, + "Diamond": 30, + "ProductList": [ + { + "Count": 5, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 5, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 7, + "ExpMin": 28478, + "ExpMax": 42715, + "Gold": 6000, + "Diamond": 30, + "ProductList": [ + { + "Count": 6, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 6, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 8, + "ExpMin": 42716, + "ExpMax": 64072, + "Gold": 8000, + "Diamond": 30, + "ProductList": [ + { + "Count": 6, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 6, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 9, + "ExpMin": 64073, + "ExpMax": 96108, + "Gold": 10000, + "Diamond": 30, + "ProductList": [ + { + "Count": 6, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 6, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 10, + "ExpMin": 96109, + "ExpMax": 144163, + "Gold": 12000, + "Diamond": 30, + "ProductList": [ + { + "Count": 8, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 8, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 11, + "ExpMin": 144164, + "ExpMax": 216244, + "Gold": 15000, + "Diamond": 50, + "ProductList": [ + { + "Count": 8, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 8, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 12, + "ExpMin": 216245, + "ExpMax": 324366, + "Gold": 20000, + "Diamond": 50, + "ProductList": [ + { + "Count": 8, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 8, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 13, + "ExpMin": 324367, + "ExpMax": 486549, + "Gold": 30000, + "Diamond": 50, + "ProductList": [ + { + "Count": 10, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 10, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 14, + "ExpMin": 486550, + "ExpMax": 729823, + "Gold": 45000, + "Diamond": 50, + "ProductList": [ + { + "Count": 10, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 10, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 15, + "ExpMin": 729824, + "ExpMax": 1094735, + "Gold": 65000, + "Diamond": 50, + "ProductList": [ + { + "Count": 10, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 10, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 16, + "ExpMin": 1094736, + "ExpMax": 1642102, + "Gold": 80000, + "Diamond": 80, + "ProductList": [ + { + "Count": 15, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 15, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 17, + "ExpMin": 1642103, + "ExpMax": 2463153, + "Gold": 100000, + "Diamond": 80, + "ProductList": [ + { + "Count": 15, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 15, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 18, + "ExpMin": 2463154, + "ExpMax": 3694730, + "Gold": 200000, + "Diamond": 80, + "ProductList": [ + { + "Count": 15, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 15, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 19, + "ExpMin": 3694731, + "ExpMax": 5542095, + "Gold": 250000, + "Diamond": 80, + "ProductList": [ + { + "Count": 18, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 18, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 20, + "ExpMin": 5542096, + "ExpMax": 8313142, + "Gold": 300000, + "Diamond": 80, + "ProductList": [ + { + "Count": 18, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 18, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 21, + "ExpMin": 8313143, + "ExpMax": 12469713, + "Gold": 1000, + "Diamond": 20, + "ProductList": [ + { + "Count": 18, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 18, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 22, + "ExpMin": 12469714, + "ExpMax": 18704569, + "Gold": 1200, + "Diamond": 20, + "ProductList": [ + { + "Count": 18, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 18, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 23, + "ExpMin": 18704570, + "ExpMax": 28056853, + "Gold": 1500, + "Diamond": 20, + "ProductList": [ + { + "Count": 18, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 18, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 24, + "ExpMin": 28056854, + "ExpMax": 42085281, + "Gold": 2000, + "Diamond": 20, + "ProductList": [ + { + "Count": 20, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 20, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 25, + "ExpMin": 42085282, + "ExpMax": 63127921, + "Gold": 3000, + "Diamond": 20, + "ProductList": [ + { + "Count": 20, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 20, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 26, + "ExpMin": 63127922, + "ExpMax": 94691881, + "Gold": 5000, + "Diamond": 30, + "ProductList": [ + { + "Count": 20, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 20, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 27, + "ExpMin": 94691882, + "ExpMax": 142037821, + "Gold": 6000, + "Diamond": 30, + "ProductList": [ + { + "Count": 21, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 21, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 28, + "ExpMin": 142037822, + "ExpMax": 213056731, + "Gold": 8000, + "Diamond": 30, + "ProductList": [ + { + "Count": 21, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 21, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 29, + "ExpMin": 213056732, + "ExpMax": 319585098, + "Gold": 10000, + "Diamond": 30, + "ProductList": [ + { + "Count": 21, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 21, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 30, + "ExpMin": 319585099, + "ExpMax": 479377647, + "Gold": 12000, + "Diamond": 30, + "ProductList": [ + { + "Count": 23, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 23, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 31, + "ExpMin": 479377648, + "ExpMax": 719066470, + "Gold": 15000, + "Diamond": 50, + "ProductList": [ + { + "Count": 23, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 23, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 32, + "ExpMin": 719066471, + "ExpMax": 1078599705, + "Gold": 20000, + "Diamond": 50, + "ProductList": [ + { + "Count": 23, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 23, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 33, + "ExpMin": 1078599706, + "ExpMax": 1617899557, + "Gold": 30000, + "Diamond": 50, + "ProductList": [ + { + "Count": 25, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 25, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 34, + "ExpMin": 1617899558, + "ExpMax": 2426849335, + "Gold": 45000, + "Diamond": 50, + "ProductList": [ + { + "Count": 25, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 25, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 35, + "ExpMin": 2426849336, + "ExpMax": 3640274002, + "Gold": 65000, + "Diamond": 50, + "ProductList": [ + { + "Count": 25, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 25, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 36, + "ExpMin": 3640274003, + "ExpMax": 5460411003, + "Gold": 80000, + "Diamond": 80, + "ProductList": [ + { + "Count": 30, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 30, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 37, + "ExpMin": 5460411004, + "ExpMax": 8190616504, + "Gold": 100000, + "Diamond": 80, + "ProductList": [ + { + "Count": 30, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 30, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 38, + "ExpMin": 8190616505, + "ExpMax": 12285924756, + "Gold": 200000, + "Diamond": 80, + "ProductList": [ + { + "Count": 30, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 30, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 39, + "ExpMin": 12285924757, + "ExpMax": 18428887134, + "Gold": 250000, + "Diamond": 80, + "ProductList": [ + { + "Count": 33, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 33, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 40, + "ExpMin": 18428887135, + "ExpMax": 27643330701, + "Gold": 300000, + "Diamond": 80, + "ProductList": [ + { + "Count": 33, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 33, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 41, + "ExpMin": 27643330702, + "ExpMax": 41464996051, + "Gold": 1000, + "Diamond": 20, + "ProductList": [ + { + "Count": 33, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 33, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 42, + "ExpMin": 41464996052, + "ExpMax": 62197494076, + "Gold": 1200, + "Diamond": 20, + "ProductList": [ + { + "Count": 33, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 33, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 43, + "ExpMin": 62197494077, + "ExpMax": 93296241114, + "Gold": 1500, + "Diamond": 20, + "ProductList": [ + { + "Count": 33, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 33, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 44, + "ExpMin": 93296241115, + "ExpMax": 139944361671, + "Gold": 2000, + "Diamond": 20, + "ProductList": [ + { + "Count": 35, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 35, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 45, + "ExpMin": 139944361672, + "ExpMax": 209916542507, + "Gold": 3000, + "Diamond": 20, + "ProductList": [ + { + "Count": 35, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 35, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 46, + "ExpMin": 209916542508, + "ExpMax": 314874813760, + "Gold": 5000, + "Diamond": 30, + "ProductList": [ + { + "Count": 35, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 35, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 47, + "ExpMin": 314874813761, + "ExpMax": 472312220640, + "Gold": 6000, + "Diamond": 30, + "ProductList": [ + { + "Count": 36, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 36, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 48, + "ExpMin": 472312220641, + "ExpMax": 708468330960, + "Gold": 8000, + "Diamond": 30, + "ProductList": [ + { + "Count": 36, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 36, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 49, + "ExpMin": 708468330961, + "ExpMax": 1062702496440, + "Gold": 10000, + "Diamond": 30, + "ProductList": [ + { + "Count": 36, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 36, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 50, + "ExpMin": 1062702496441, + "ExpMax": 1594053744660, + "Gold": 12000, + "Diamond": 30, + "ProductList": [ + { + "Count": 38, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 38, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 51, + "ExpMin": 1594053744661, + "ExpMax": 2391080616990, + "Gold": 15000, + "Diamond": 50, + "ProductList": [ + { + "Count": 38, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 38, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 52, + "ExpMin": 2391080616991, + "ExpMax": 3586620925485, + "Gold": 20000, + "Diamond": 50, + "ProductList": [ + { + "Count": 38, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 38, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 53, + "ExpMin": 3586620925486, + "ExpMax": 5379931388227, + "Gold": 30000, + "Diamond": 50, + "ProductList": [ + { + "Count": 40, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 40, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 54, + "ExpMin": 5379931388228, + "ExpMax": 8069897082340, + "Gold": 45000, + "Diamond": 50, + "ProductList": [ + { + "Count": 40, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 40, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 55, + "ExpMin": 8069897082341, + "ExpMax": 12104845623510, + "Gold": 65000, + "Diamond": 50, + "ProductList": [ + { + "Count": 40, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 40, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 56, + "ExpMin": 12104845623511, + "ExpMax": 18157268435265, + "Gold": 80000, + "Diamond": 80, + "ProductList": [ + { + "Count": 45, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 45, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 57, + "ExpMin": 18157268435266, + "ExpMax": 27235902652897, + "Gold": 100000, + "Diamond": 80, + "ProductList": [ + { + "Count": 45, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 45, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 58, + "ExpMin": 27235902652898, + "ExpMax": 40853853979345, + "Gold": 200000, + "Diamond": 80, + "ProductList": [ + { + "Count": 45, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 45, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 59, + "ExpMin": 40853853979346, + "ExpMax": 61280780969017, + "Gold": 250000, + "Diamond": 80, + "ProductList": [ + { + "Count": 48, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 48, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 60, + "ExpMin": 61280780969018, + "ExpMax": 91921171453525, + "Gold": 300000, + "Diamond": 80, + "ProductList": [ + { + "Count": 48, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 48, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 61, + "ExpMin": 91921171453526, + "ExpMax": 137881757180287, + "Gold": 1000, + "Diamond": 20, + "ProductList": [ + { + "Count": 48, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 48, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 62, + "ExpMin": 137881757180288, + "ExpMax": 206822635770430, + "Gold": 1200, + "Diamond": 20, + "ProductList": [ + { + "Count": 48, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 48, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 63, + "ExpMin": 206822635770431, + "ExpMax": 310233953655645, + "Gold": 1500, + "Diamond": 20, + "ProductList": [ + { + "Count": 48, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 48, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 64, + "ExpMin": 310233953655646, + "ExpMax": 465350930483467, + "Gold": 2000, + "Diamond": 20, + "ProductList": [ + { + "Count": 50, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 50, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 65, + "ExpMin": 465350930483468, + "ExpMax": 698026395725200, + "Gold": 3000, + "Diamond": 20, + "ProductList": [ + { + "Count": 50, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 50, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 66, + "ExpMin": 698026395725201, + "ExpMax": 1047039593587800, + "Gold": 5000, + "Diamond": 30, + "ProductList": [ + { + "Count": 50, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 50, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 67, + "ExpMin": 1047039593587801, + "ExpMax": 1570559390381700, + "Gold": 6000, + "Diamond": 30, + "ProductList": [ + { + "Count": 51, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 51, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 68, + "ExpMin": 1570559390381701, + "ExpMax": 2355839085572550, + "Gold": 8000, + "Diamond": 30, + "ProductList": [ + { + "Count": 51, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 51, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 69, + "ExpMin": 2355839085572551, + "ExpMax": 3533758628358825, + "Gold": 10000, + "Diamond": 30, + "ProductList": [ + { + "Count": 51, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 51, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + }, + { + "Level": 70, + "ExpMin": 3533758628358826, + "ExpMax": 5300637942538237, + "Gold": 12000, + "Diamond": 30, + "ProductList": [ + { + "Count": 53, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + { + "Count": 53, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + } + ], + "GiftList": [] + } + ], + "PropConfig": [ + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 999999999, + "SaleCount": 1, + "VIPPrice": 999999999, + "DealerPrice": 999999999, + "IsEnable": true, + "IsSale": true, + "Number": "13006", + "Name": "核能怪兽", + "Desc": "吞噬核能吐息,毁灭万物战神。", + "ImageUrl": "/uploads/13006.png?v=1784193073", + "Type": 5, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 999999999, + "SaleCount": 1, + "VIPPrice": 999999999, + "DealerPrice": 999999999, + "IsEnable": true, + "IsSale": true, + "Number": "13005", + "Name": "人鱼公主", + "Desc": "深海化身海王,主宰海洋之力。", + "ImageUrl": "/uploads/13005.png?v=1784193082", + "Type": 5, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 999999999, + "SaleCount": 1, + "VIPPrice": 999999999, + "DealerPrice": 999999999, + "IsEnable": true, + "IsSale": true, + "Number": "13004", + "Name": "熊猫侠客", + "Desc": "执剑吹箫行侠,守护国宝自然。", + "ImageUrl": "/uploads/13004.png?v=1784193135", + "Type": 5, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 999999999, + "SaleCount": 1, + "VIPPrice": 999999999, + "DealerPrice": 999999999, + "IsEnable": true, + "IsSale": true, + "Number": "13003", + "Name": "杨戬", + "Desc": "天眼识破万象,劈山救母战神。", + "ImageUrl": "/uploads/13003.png?v=1784193107", + "Type": 5, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 999999999, + "SaleCount": 1, + "VIPPrice": 999999999, + "DealerPrice": 999999999, + "IsEnable": true, + "IsSale": true, + "Number": "13002", + "Name": "孙悟空", + "Desc": "大闹天宫降妖,斗战不屈战神。", + "ImageUrl": "/uploads/13002.png?v=1784193118", + "Type": 5, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 999999999, + "SaleCount": 1, + "VIPPrice": 999999999, + "DealerPrice": 999999999, + "IsEnable": true, + "IsSale": true, + "Number": "13001", + "Name": "大乔", + "Desc": "提灯守望沧海,指引爱人归途。", + "ImageUrl": "/uploads/13001.png?v=1784193126", + "Type": 5, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png?v=1784285974", + "Type": 10, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png?v=1784285984", + "Type": 10, + "Level": 0 + }, + { + "GameNumber": [ + "1", + "2", + "3", + "4", + "5" + ], + "Day": 0, + "SaleType": 1, + "Price": 35000, + "SaleCount": 1, + "VIPPrice": 35000, + "DealerPrice": 35000, + "IsEnable": true, + "IsSale": true, + "Number": "40007", + "Name": "VIP经验包", + "Desc": "购买后立即获得100VIP经验值", + "ImageUrl": "/uploads/40007.png?v=1784191363", + "Type": 12, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 788888, + "SaleCount": 1, + "VIPPrice": 688888, + "DealerPrice": 588888, + "IsEnable": true, + "IsSale": true, + "Number": "40002", + "Name": "大喇叭", + "Desc": "大喇叭", + "ImageUrl": "/uploads/40002.png", + "Type": 9, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "40005", + "Name": "刮刮卡", + "Desc": "刮刮卡", + "ImageUrl": "/uploads/40005.png", + "Type": 7, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "40006", + "Name": "召唤卡", + "Desc": "召唤卡", + "ImageUrl": "/uploads/40006.png", + "Type": 11, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 888888, + "SaleCount": 1, + "VIPPrice": 788888, + "DealerPrice": 688888, + "IsEnable": true, + "IsSale": true, + "Number": "40001", + "Name": "改名卡", + "Desc": "改名卡", + "ImageUrl": "/uploads/40001.png", + "Type": 8, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "40100", + "Name": "Vip1专属炮台", + "Desc": "Vip1专属炮台", + "ImageUrl": "/uploads/40100.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "40101", + "Name": "Vip2专属炮台", + "Desc": "Vip2专属炮台", + "ImageUrl": "/uploads/40101.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "40102", + "Name": "Vip3专属炮台", + "Desc": "Vip3专属炮台", + "ImageUrl": "/uploads/40102.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "40103", + "Name": "Vip4专属炮台", + "Desc": "Vip4专属炮台", + "ImageUrl": "/uploads/40103.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "40104", + "Name": "Vip5专属炮台", + "Desc": "Vip5专属炮台", + "ImageUrl": "/uploads/40104.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "40105", + "Name": "Vip6专属炮台", + "Desc": "Vip6专属炮台", + "ImageUrl": "/uploads/40105.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "40106", + "Name": "Vip7专属炮台", + "Desc": "Vip7专属炮台", + "ImageUrl": "/uploads/40106.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "40107", + "Name": "Vip8专属炮台", + "Desc": "Vip8专属炮台", + "ImageUrl": "/uploads/40107.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "40108", + "Name": "Vip9专属炮台", + "Desc": "Vip9专属炮台", + "ImageUrl": "/uploads/40108.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "40109", + "Name": "Vip10专属炮台", + "Desc": "Vip10专属炮台", + "ImageUrl": "/uploads/40109.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3988888, + "SaleCount": 1, + "VIPPrice": 3888888, + "DealerPrice": 3788888, + "IsEnable": true, + "IsSale": true, + "Number": "11001", + "Name": "深海之眼", + "Desc": "凝视深渊,发射毁灭一切的深海光束。", + "ImageUrl": "/uploads/11001.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 365, + "SaleType": 1, + "Price": 6388888, + "SaleCount": 1, + "VIPPrice": 6288888, + "DealerPrice": 6188888, + "IsEnable": true, + "IsSale": true, + "Number": "11002", + "Name": "祥龙九天", + "Desc": "祥龙盘踞九天,护佑平安吉祥。", + "ImageUrl": "/uploads/11002.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 30, + "SaleType": 1, + "Price": 3988888, + "SaleCount": 1, + "VIPPrice": 3888888, + "DealerPrice": 3788888, + "IsEnable": true, + "IsSale": true, + "Number": "11003", + "Name": "星际战舰", + "Desc": "星际巨舰轰鸣,炮火撕裂苍穹。", + "ImageUrl": "/uploads/11003.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 7, + "SaleType": 1, + "Price": 5188888, + "SaleCount": 1, + "VIPPrice": 5088888, + "DealerPrice": 5000000, + "IsEnable": true, + "IsSale": true, + "Number": "11004", + "Name": "星际穿梭", + "Desc": "洛神踏水而来,萌仙灵动可爱。", + "ImageUrl": "/uploads/11004.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3288888, + "SaleCount": 1, + "VIPPrice": 3188888, + "DealerPrice": 2988888, + "IsEnable": true, + "IsSale": true, + "Number": "11005", + "Name": "洛神萌仙", + "Desc": "脉冲音波激荡,震碎一切阻碍。", + "ImageUrl": "/uploads/11005.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3988888, + "SaleCount": 1, + "VIPPrice": 3888888, + "DealerPrice": 3788888, + "IsEnable": true, + "IsSale": true, + "Number": "11006", + "Name": "脉冲音波", + "Desc": "萌娃可爱驾到,带来无限欢乐。", + "ImageUrl": "/uploads/11006.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3988888, + "SaleCount": 1, + "VIPPrice": 3888888, + "DealerPrice": 3788888, + "IsEnable": false, + "IsSale": false, + "Number": "11007", + "Name": "萌娃驾到", + "Desc": "创世之心跳动,孕育万物生机。", + "ImageUrl": "/uploads/11007.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3988888, + "SaleCount": 1, + "VIPPrice": 3888888, + "DealerPrice": 3788888, + "IsEnable": true, + "IsSale": true, + "Number": "11008", + "Name": "创世之心", + "Desc": "龙舟破浪前行,勇夺竞技先锋。", + "ImageUrl": "/uploads/11008.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3988888, + "SaleCount": 1, + "VIPPrice": 3888888, + "DealerPrice": 3788888, + "IsEnable": true, + "IsSale": true, + "Number": "11009", + "Name": "龙舟先锋", + "Desc": "金福洒满厅堂,阖家幸福安康。", + "ImageUrl": "/uploads/11009.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3988888, + "SaleCount": 1, + "VIPPrice": 3888888, + "DealerPrice": 3788888, + "IsEnable": true, + "IsSale": true, + "Number": "11010", + "Name": "金福满堂", + "Desc": "金福洒满厅堂,阖家幸福安康。", + "ImageUrl": "/uploads/11010.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 6388888, + "SaleCount": 1, + "VIPPrice": 6288888, + "DealerPrice": 6188888, + "IsEnable": true, + "IsSale": true, + "Number": "11011", + "Name": "福狮之心", + "Desc": "福狮守护之心,驱邪纳福迎祥。", + "ImageUrl": "/uploads/11011.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 6388888, + "SaleCount": 1, + "VIPPrice": 6288888, + "DealerPrice": 6188888, + "IsEnable": true, + "IsSale": true, + "Number": "11012", + "Name": "舞兔映月", + "Desc": "玉兔月下起舞,尽显灵动娇憨。", + "ImageUrl": "/uploads/11012.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3988888, + "SaleCount": 1, + "VIPPrice": 3888888, + "DealerPrice": 3788888, + "IsEnable": true, + "IsSale": true, + "Number": "11013", + "Name": "森林秘宝", + "Desc": "探寻森林深处,发掘神秘秘宝。", + "ImageUrl": "/uploads/11013.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3288888, + "SaleCount": 1, + "VIPPrice": 3188888, + "DealerPrice": 3088888, + "IsEnable": true, + "IsSale": true, + "Number": "11014", + "Name": "心心相印", + "Desc": "彼此心心相印,传递真挚情感。", + "ImageUrl": "/uploads/11014.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3288888, + "SaleCount": 1, + "VIPPrice": 3188888, + "DealerPrice": 3088888, + "IsEnable": true, + "IsSale": true, + "Number": "11015", + "Name": "冰火回响", + "Desc": "冰火元素交织,激荡双重回响。", + "ImageUrl": "/uploads/11015.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 1758888, + "SaleCount": 1, + "VIPPrice": 1758888, + "DealerPrice": 1758888, + "IsEnable": true, + "IsSale": false, + "Number": "11016", + "Name": "梦华水晶", + "Desc": "梦华流光溢彩,水晶璀璨夺目。", + "ImageUrl": "/uploads/11016.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2888888, + "SaleCount": 1, + "VIPPrice": 2888888, + "DealerPrice": 2888888, + "IsEnable": true, + "IsSale": false, + "Number": "11017", + "Name": "苍刃出鞘", + "Desc": "苍蓝利刃出鞘,锋芒势不可挡。", + "ImageUrl": "/uploads/11017.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3158888, + "SaleCount": 1, + "VIPPrice": 3158888, + "DealerPrice": 3158888, + "IsEnable": true, + "IsSale": false, + "Number": "11018", + "Name": "梦魇鬼魅", + "Desc": "梦魇鬼魅降临,笼罩无尽黑暗。", + "ImageUrl": "/uploads/11018.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2758888, + "SaleCount": 1, + "VIPPrice": 2758888, + "DealerPrice": 2758888, + "IsEnable": true, + "IsSale": false, + "Number": "11019", + "Name": "救赎圣域", + "Desc": "圣域光辉普照,带来终极救赎。", + "ImageUrl": "/uploads/11019.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2188888, + "SaleCount": 1, + "VIPPrice": 2188888, + "DealerPrice": 2188888, + "IsEnable": true, + "IsSale": false, + "Number": "11020", + "Name": "武装斗神", + "Desc": "斗神全副武装,战意燃烧沸腾。", + "ImageUrl": "/uploads/11020.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 1758888, + "SaleCount": 1, + "VIPPrice": 1758888, + "DealerPrice": 1758888, + "IsEnable": true, + "IsSale": false, + "Number": "11021", + "Name": "诸葛神弩", + "Desc": "神弩机括轻响,箭矢百步穿杨。", + "ImageUrl": "/uploads/11021.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2888888, + "SaleCount": 1, + "VIPPrice": 2888888, + "DealerPrice": 2888888, + "IsEnable": true, + "IsSale": false, + "Number": "11022", + "Name": "春华锦簇", + "Desc": "繁花似锦绽放,尽显春日烂漫。", + "ImageUrl": "/uploads/11022.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3158888, + "SaleCount": 1, + "VIPPrice": 3158888, + "DealerPrice": 3158888, + "IsEnable": true, + "IsSale": false, + "Number": "11023", + "Name": "神龙大侠", + "Desc": "神龙大侠降临,守护世间正义。", + "ImageUrl": "/uploads/11023.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2758888, + "SaleCount": 1, + "VIPPrice": 2758888, + "DealerPrice": 2758888, + "IsEnable": false, + "IsSale": false, + "Number": "11024", + "Name": "醒狮纳吉1", + "Desc": "醒狮昂首纳吉,开启祥瑞新篇。", + "ImageUrl": "/uploads/11024.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2188888, + "SaleCount": 1, + "VIPPrice": 2188888, + "DealerPrice": 2188888, + "IsEnable": true, + "IsSale": false, + "Number": "11025", + "Name": "鸿兔先锋", + "Desc": "鸿兔奋勇争先,传递新春鸿运。", + "ImageUrl": "/uploads/11025.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 1758888, + "SaleCount": 1, + "VIPPrice": 1758888, + "DealerPrice": 1758888, + "IsEnable": true, + "IsSale": false, + "Number": "11026", + "Name": "刑天魔斧", + "Desc": "刑天挥舞巨斧,战意永不停歇。", + "ImageUrl": "/uploads/11026.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2888888, + "SaleCount": 1, + "VIPPrice": 2888888, + "DealerPrice": 2888888, + "IsEnable": true, + "IsSale": false, + "Number": "11027", + "Name": "冰霜巨龙", + "Desc": "冰霜巨龙吐息,冻结万里长空。", + "ImageUrl": "/uploads/11027.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3158888, + "SaleCount": 1, + "VIPPrice": 3158888, + "DealerPrice": 3158888, + "IsEnable": true, + "IsSale": false, + "Number": "11028", + "Name": "剑气如虹", + "Desc": "剑气纵横如虹,斩破重重迷雾。", + "ImageUrl": "/uploads/11028.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2758888, + "SaleCount": 1, + "VIPPrice": 2758888, + "DealerPrice": 2758888, + "IsEnable": true, + "IsSale": false, + "Number": "11029", + "Name": "万圣通灵", + "Desc": "万圣之夜降临,万物通灵显圣。", + "ImageUrl": "/uploads/11029.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2188888, + "SaleCount": 1, + "VIPPrice": 2188888, + "DealerPrice": 2188888, + "IsEnable": true, + "IsSale": false, + "Number": "11030", + "Name": "八卦神炉", + "Desc": "八卦神炉炼化,孕育绝世神兵。", + "ImageUrl": "/uploads/11030.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 1758888, + "SaleCount": 1, + "VIPPrice": 1758888, + "DealerPrice": 1758888, + "IsEnable": true, + "IsSale": false, + "Number": "11031", + "Name": "暗域侵扰", + "Desc": "暗域悄然侵扰,吞噬光明希望。", + "ImageUrl": "/uploads/11031.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2888888, + "SaleCount": 1, + "VIPPrice": 2888888, + "DealerPrice": 2888888, + "IsEnable": true, + "IsSale": false, + "Number": "11032", + "Name": "天下无极", + "Desc": "天下无极之境,掌控乾坤万象。", + "ImageUrl": "/uploads/11032.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3158888, + "SaleCount": 1, + "VIPPrice": 3158888, + "DealerPrice": 3158888, + "IsEnable": true, + "IsSale": false, + "Number": "11033", + "Name": "金秋之心", + "Desc": "金秋硕果累累,收获喜悦之心。", + "ImageUrl": "/uploads/11033.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2758888, + "SaleCount": 1, + "VIPPrice": 2758888, + "DealerPrice": 2758888, + "IsEnable": true, + "IsSale": false, + "Number": "11034", + "Name": "沙滩明珠", + "Desc": "沙滩明珠闪耀,映照碧海蓝天。", + "ImageUrl": "/uploads/11034.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2188888, + "SaleCount": 1, + "VIPPrice": 2188888, + "DealerPrice": 2188888, + "IsEnable": true, + "IsSale": false, + "Number": "11035", + "Name": "甜心教主", + "Desc": "甜心教主驾到,散发可爱魅力。", + "ImageUrl": "/uploads/11035.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 1758888, + "SaleCount": 1, + "VIPPrice": 1758888, + "DealerPrice": 1758888, + "IsEnable": true, + "IsSale": false, + "Number": "11036", + "Name": "荧光之星", + "Desc": "荧光之星闪烁,点亮梦幻夜空。", + "ImageUrl": "/uploads/11036.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2888888, + "SaleCount": 1, + "VIPPrice": 2888888, + "DealerPrice": 2888888, + "IsEnable": true, + "IsSale": false, + "Number": "11037", + "Name": "雷神之怒", + "Desc": "雷神降下天怒,雷霆震慑四方。", + "ImageUrl": "/uploads/11037.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3158888, + "SaleCount": 1, + "VIPPrice": 3158888, + "DealerPrice": 3158888, + "IsEnable": true, + "IsSale": false, + "Number": "11038", + "Name": "麒麟瑞兽", + "Desc": "麒麟瑞兽踏云,带来盛世祥瑞。", + "ImageUrl": "/uploads/11038.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2758888, + "SaleCount": 1, + "VIPPrice": 2758888, + "DealerPrice": 2758888, + "IsEnable": true, + "IsSale": false, + "Number": "11039", + "Name": "黑龙吐息", + "Desc": "黑龙张开巨口,吐息毁灭一切。", + "ImageUrl": "/uploads/11039.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2758888, + "SaleCount": 1, + "VIPPrice": 2758888, + "DealerPrice": 2758888, + "IsEnable": true, + "IsSale": false, + "Number": "11040", + "Name": "圣光之剑", + "Desc": "圣光凝聚成剑,驱散世间黑暗。", + "ImageUrl": "/uploads/11040.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 1758888, + "SaleCount": 1, + "VIPPrice": 1758888, + "DealerPrice": 1758888, + "IsEnable": true, + "IsSale": false, + "Number": "11041", + "Name": "能量核心", + "Desc": "能量核心运转,提供澎湃动力。", + "ImageUrl": "/uploads/11041.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2888888, + "SaleCount": 1, + "VIPPrice": 2888888, + "DealerPrice": 2888888, + "IsEnable": false, + "IsSale": false, + "Number": "11042", + "Name": "战魂之刃", + "Desc": "战魂融入锋刃,斩尽一切强敌。", + "ImageUrl": "/uploads/11042.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3158888, + "SaleCount": 1, + "VIPPrice": 3158888, + "DealerPrice": 3158888, + "IsEnable": true, + "IsSale": false, + "Number": "11043", + "Name": "战神之怒", + "Desc": "战神雷霆震怒,横扫千军万马。", + "ImageUrl": "/uploads/11043.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2758888, + "SaleCount": 1, + "VIPPrice": 2758888, + "DealerPrice": 2758888, + "IsEnable": true, + "IsSale": false, + "Number": "11044", + "Name": "醒狮纳吉", + "Desc": "醒狮欢腾纳吉,福运绵延不绝。", + "ImageUrl": "/uploads/11044.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2188888, + "SaleCount": 1, + "VIPPrice": 2188888, + "DealerPrice": 2188888, + "IsEnable": false, + "IsSale": false, + "Number": "11045", + "Name": "裂魂之刃", + "Desc": "裂魂之刃挥舞,撕裂敌人灵魂。", + "ImageUrl": "/uploads/11045.png", + "Type": 1, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 1758888, + "SaleCount": 1, + "VIPPrice": 1758888, + "DealerPrice": 1758888, + "IsEnable": true, + "IsSale": false, + "Number": "12001", + "Name": "自由之翼", + "Desc": "插上自由之翼,翱翔广阔天地。", + "ImageUrl": "/uploads/12001.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2888888, + "SaleCount": 1, + "VIPPrice": 2888888, + "DealerPrice": 2888888, + "IsEnable": true, + "IsSale": false, + "Number": "12002", + "Name": "紫晶龙翼", + "Desc": "紫晶铸就龙翼,散发神秘华光。", + "ImageUrl": "/uploads/12002.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3158888, + "SaleCount": 1, + "VIPPrice": 3158888, + "DealerPrice": 3158888, + "IsEnable": true, + "IsSale": false, + "Number": "12003", + "Name": "祥麟瑞凤", + "Desc": "祥麟瑞凤齐飞,寓意天下太平。", + "ImageUrl": "/uploads/12003.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2758888, + "SaleCount": 1, + "VIPPrice": 2758888, + "DealerPrice": 2758888, + "IsEnable": true, + "IsSale": false, + "Number": "12004", + "Name": "雷霆万钧", + "Desc": "雷霆万钧之势,震撼天地乾坤。", + "ImageUrl": "/uploads/12004.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2188888, + "SaleCount": 1, + "VIPPrice": 2188888, + "DealerPrice": 2188888, + "IsEnable": true, + "IsSale": false, + "Number": "12005", + "Name": "梦幻之翼", + "Desc": "梦幻羽翼轻展,编织绮丽梦境。", + "ImageUrl": "/uploads/12005.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 1758888, + "SaleCount": 1, + "VIPPrice": 1758888, + "DealerPrice": 1758888, + "IsEnable": true, + "IsSale": false, + "Number": "12006", + "Name": "风暴之心", + "Desc": "风暴凝聚于心,掀起惊涛骇浪。", + "ImageUrl": "/uploads/12006.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2888888, + "SaleCount": 1, + "VIPPrice": 2888888, + "DealerPrice": 2888888, + "IsEnable": true, + "IsSale": false, + "Number": "12007", + "Name": "堕天使之翼", + "Desc": "堕天使之翼展,散发暗黑魅惑。", + "ImageUrl": "/uploads/12007.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3158888, + "SaleCount": 1, + "VIPPrice": 3158888, + "DealerPrice": 3158888, + "IsEnable": true, + "IsSale": false, + "Number": "12008", + "Name": "飞鱼双翅", + "Desc": "飞鱼振翅跃海,畅游碧波之间。", + "ImageUrl": "/uploads/12008.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2758888, + "SaleCount": 1, + "VIPPrice": 2758888, + "DealerPrice": 2758888, + "IsEnable": true, + "IsSale": false, + "Number": "12009", + "Name": "极度深寒", + "Desc": "极度深寒笼罩,冰封万里山河。", + "ImageUrl": "/uploads/12009.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2188888, + "SaleCount": 1, + "VIPPrice": 2188888, + "DealerPrice": 2188888, + "IsEnable": true, + "IsSale": false, + "Number": "12010", + "Name": "如虎添翼", + "Desc": "强者如虎添翼,气势锐不可当。", + "ImageUrl": "/uploads/12010.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 1758888, + "SaleCount": 1, + "VIPPrice": 1758888, + "DealerPrice": 1758888, + "IsEnable": true, + "IsSale": false, + "Number": "12011", + "Name": "战魂之翼", + "Desc": "战魂化作双翼,守护荣耀战场。", + "ImageUrl": "/uploads/12011.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2888888, + "SaleCount": 1, + "VIPPrice": 2888888, + "DealerPrice": 2888888, + "IsEnable": true, + "IsSale": false, + "Number": "12012", + "Name": "傲游太虚", + "Desc": "傲游太虚之境,俯瞰浩瀚星河。", + "ImageUrl": "/uploads/12012.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3158888, + "SaleCount": 1, + "VIPPrice": 3158888, + "DealerPrice": 3158888, + "IsEnable": true, + "IsSale": false, + "Number": "12013", + "Name": "珍珠之翼", + "Desc": "珍珠点缀羽翼,温润光华流转。", + "ImageUrl": "/uploads/12013.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2758888, + "SaleCount": 1, + "VIPPrice": 2758888, + "DealerPrice": 2758888, + "IsEnable": true, + "IsSale": false, + "Number": "12014", + "Name": "金秋之翼", + "Desc": "金秋染透双翼,承载丰收喜悦。", + "ImageUrl": "/uploads/12014.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2188888, + "SaleCount": 1, + "VIPPrice": 2188888, + "DealerPrice": 2188888, + "IsEnable": true, + "IsSale": false, + "Number": "12015", + "Name": "血翼狂潮", + "Desc": "血翼掀起狂潮,燃尽一切罪恶。", + "ImageUrl": "/uploads/12015.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 1758888, + "SaleCount": 1, + "VIPPrice": 1758888, + "DealerPrice": 1758888, + "IsEnable": true, + "IsSale": false, + "Number": "12016", + "Name": "幽冥飞刃", + "Desc": "幽冥飞刃盘旋,收割无尽灵魂。", + "ImageUrl": "/uploads/12016.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2888888, + "SaleCount": 1, + "VIPPrice": 2888888, + "DealerPrice": 2888888, + "IsEnable": true, + "IsSale": false, + "Number": "12017", + "Name": "战旗之翼", + "Desc": "战旗化作羽翼,指引胜利方向。", + "ImageUrl": "/uploads/12017.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3158888, + "SaleCount": 1, + "VIPPrice": 3158888, + "DealerPrice": 3158888, + "IsEnable": true, + "IsSale": false, + "Number": "12018", + "Name": "三昧真火", + "Desc": "三昧真火升腾,焚尽世间虚妄。", + "ImageUrl": "/uploads/12018.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2758888, + "SaleCount": 1, + "VIPPrice": 2758888, + "DealerPrice": 2758888, + "IsEnable": true, + "IsSale": false, + "Number": "12019", + "Name": "永冻领域", + "Desc": "永冻领域展开,万物归于沉寂。", + "ImageUrl": "/uploads/12019.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2188888, + "SaleCount": 1, + "VIPPrice": 2188888, + "DealerPrice": 2188888, + "IsEnable": true, + "IsSale": false, + "Number": "12020", + "Name": "蚩尤虎魄", + "Desc": "蚩尤虎魄觉醒,释放上古战意。", + "ImageUrl": "/uploads/12020.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 1758888, + "SaleCount": 1, + "VIPPrice": 1758888, + "DealerPrice": 1758888, + "IsEnable": true, + "IsSale": false, + "Number": "12021", + "Name": "鸿福展翅", + "Desc": "鸿福展翅高飞,带来无边好运。", + "ImageUrl": "/uploads/12021.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2888888, + "SaleCount": 1, + "VIPPrice": 2888888, + "DealerPrice": 2888888, + "IsEnable": true, + "IsSale": false, + "Number": "12022", + "Name": "流光祥翼", + "Desc": "流光缠绕祥翼,映照祥瑞之光。", + "ImageUrl": "/uploads/12022.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3158888, + "SaleCount": 1, + "VIPPrice": 3158888, + "DealerPrice": 3158888, + "IsEnable": true, + "IsSale": false, + "Number": "12023", + "Name": "武林至尊", + "Desc": "武林至尊双翼,傲视江湖群雄。", + "ImageUrl": "/uploads/12023.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2758888, + "SaleCount": 1, + "VIPPrice": 2758888, + "DealerPrice": 2758888, + "IsEnable": true, + "IsSale": false, + "Number": "12024", + "Name": "流光华彩", + "Desc": "流光倾泻华彩,绘就绝美画卷。", + "ImageUrl": "/uploads/12024.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2188888, + "SaleCount": 1, + "VIPPrice": 2188888, + "DealerPrice": 2188888, + "IsEnable": true, + "IsSale": false, + "Number": "12025", + "Name": "焰翎之翼", + "Desc": "焰翎燃烧炽热,舞出烈焰华章。", + "ImageUrl": "/uploads/12025.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 1758888, + "SaleCount": 1, + "VIPPrice": 1758888, + "DealerPrice": 1758888, + "IsEnable": true, + "IsSale": false, + "Number": "12026", + "Name": "天机神鹰", + "Desc": "天机神鹰展翅,洞察世间玄机。", + "ImageUrl": "/uploads/12026.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2888888, + "SaleCount": 1, + "VIPPrice": 2888888, + "DealerPrice": 2888888, + "IsEnable": true, + "IsSale": false, + "Number": "12027", + "Name": "圣洁之心", + "Desc": "圣洁之心闪耀,净化一切污浊。", + "ImageUrl": "/uploads/12027.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3158888, + "SaleCount": 1, + "VIPPrice": 3158888, + "DealerPrice": 3158888, + "IsEnable": true, + "IsSale": false, + "Number": "12028", + "Name": "刀光剑影", + "Desc": "刀光剑影交错,尽显侠客豪情。", + "ImageUrl": "/uploads/12028.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2758888, + "SaleCount": 1, + "VIPPrice": 2758888, + "DealerPrice": 2758888, + "IsEnable": true, + "IsSale": false, + "Number": "12029", + "Name": "流火之焰", + "Desc": "流火划过天际,燃尽漫漫长夜。", + "ImageUrl": "/uploads/12029.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2188888, + "SaleCount": 1, + "VIPPrice": 2188888, + "DealerPrice": 2188888, + "IsEnable": true, + "IsSale": false, + "Number": "12030", + "Name": "玄冰烈焰", + "Desc": "玄冰交织烈焰,演绎冰火之歌。", + "ImageUrl": "/uploads/12030.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 1758888, + "SaleCount": 1, + "VIPPrice": 1758888, + "DealerPrice": 1758888, + "IsEnable": true, + "IsSale": false, + "Number": "12031", + "Name": "巨蟹之翼", + "Desc": "巨蟹双翼舒展,守护坚实壁垒。", + "ImageUrl": "/uploads/12031.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2888888, + "SaleCount": 1, + "VIPPrice": 2888888, + "DealerPrice": 2888888, + "IsEnable": true, + "IsSale": false, + "Number": "12032", + "Name": "飞龙在天", + "Desc": "飞龙翱翔九天,尽显王者霸气。", + "ImageUrl": "/uploads/12032.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3158888, + "SaleCount": 1, + "VIPPrice": 3158888, + "DealerPrice": 3158888, + "IsEnable": true, + "IsSale": false, + "Number": "12033", + "Name": "金色童年", + "Desc": "金色童年双翼,承载纯真回忆。", + "ImageUrl": "/uploads/12033.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2758888, + "SaleCount": 1, + "VIPPrice": 2758888, + "DealerPrice": 2758888, + "IsEnable": true, + "IsSale": false, + "Number": "12034", + "Name": "虚空之光", + "Desc": "虚空绽放光芒,穿越无尽黑暗。", + "ImageUrl": "/uploads/12034.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2188888, + "SaleCount": 1, + "VIPPrice": 2188888, + "DealerPrice": 2188888, + "IsEnable": true, + "IsSale": false, + "Number": "12035", + "Name": "蜻蜓之夏", + "Desc": "蜻蜓振翅夏日,带来清凉微风。", + "ImageUrl": "/uploads/12035.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 1758888, + "SaleCount": 1, + "VIPPrice": 1758888, + "DealerPrice": 1758888, + "IsEnable": true, + "IsSale": false, + "Number": "12036", + "Name": "幻蝶彩翼", + "Desc": "幻蝶舞动彩翼,翩跹如梦似幻。", + "ImageUrl": "/uploads/12036.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2888888, + "SaleCount": 1, + "VIPPrice": 2888888, + "DealerPrice": 2888888, + "IsEnable": true, + "IsSale": false, + "Number": "12037", + "Name": "福狮之翼", + "Desc": "福狮双翼展开,护佑岁岁平安。", + "ImageUrl": "/uploads/12037.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3158888, + "SaleCount": 1, + "VIPPrice": 3158888, + "DealerPrice": 3158888, + "IsEnable": true, + "IsSale": false, + "Number": "12038", + "Name": "炽核振羽", + "Desc": "炽核驱动羽翼,迸发无尽热能。", + "ImageUrl": "/uploads/12038.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2758888, + "SaleCount": 1, + "VIPPrice": 2758888, + "DealerPrice": 2758888, + "IsEnable": true, + "IsSale": false, + "Number": "12039", + "Name": "树影轻舞", + "Desc": "树影随风轻舞,尽显自然生机。", + "ImageUrl": "/uploads/12039.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2188888, + "SaleCount": 1, + "VIPPrice": 2188888, + "DealerPrice": 2188888, + "IsEnable": true, + "IsSale": false, + "Number": "12040", + "Name": "创世幻翼", + "Desc": "创世幻翼舒展,见证世界初生。", + "ImageUrl": "/uploads/12040.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 1758888, + "SaleCount": 1, + "VIPPrice": 1758888, + "DealerPrice": 1758888, + "IsEnable": true, + "IsSale": false, + "Number": "12041", + "Name": "环游世界", + "Desc": "双翼环游世界,领略万千风光。", + "ImageUrl": "/uploads/12041.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2888888, + "SaleCount": 1, + "VIPPrice": 2888888, + "DealerPrice": 2888888, + "IsEnable": true, + "IsSale": false, + "Number": "12042", + "Name": "音律幻羽", + "Desc": "音律化作幻羽,奏响天籁之音。", + "ImageUrl": "/uploads/12042.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 3158888, + "SaleCount": 1, + "VIPPrice": 3158888, + "DealerPrice": 3158888, + "IsEnable": true, + "IsSale": false, + "Number": "12043", + "Name": "洛神云翼", + "Desc": "洛神踏云展翅,尽显绝世风华。", + "ImageUrl": "/uploads/12043.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2758888, + "SaleCount": 1, + "VIPPrice": 2758888, + "DealerPrice": 2758888, + "IsEnable": true, + "IsSale": false, + "Number": "12044", + "Name": "五谷丰登", + "Desc": "五谷丰登之翼,祈愿年年富足。", + "ImageUrl": "/uploads/12044.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2188888, + "SaleCount": 1, + "VIPPrice": 2188888, + "DealerPrice": 2188888, + "IsEnable": true, + "IsSale": false, + "Number": "12045", + "Name": "次元光翼", + "Desc": "次元光翼闪烁,跨越时空界限。", + "ImageUrl": "/uploads/12045.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 1758888, + "SaleCount": 1, + "VIPPrice": 1758888, + "DealerPrice": 1758888, + "IsEnable": true, + "IsSale": false, + "Number": "12046", + "Name": "时空穿梭", + "Desc": "双翼撕裂时空,穿梭过去未来。", + "ImageUrl": "/uploads/12046.png", + "Type": 2, + "Level": 0 + }, + { + "GameNumber": [], + "Day": 0, + "SaleType": 1, + "Price": 2888888, + "SaleCount": 1, + "VIPPrice": 2888888, + "DealerPrice": 2888888, + "IsEnable": true, + "IsSale": false, + "Number": "12047", + "Name": "玄武灵蛇", + "Desc": "玄武灵蛇盘踞,镇守四方安宁。", + "ImageUrl": "/uploads/12047.png", + "Type": 2, + "Level": 0 + } + ], + "PropFragments": [ + { + "FragmentCount": 120, + "ProductNumber": "13006", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "18006", + "Name": "核能怪兽", + "Desc": "吞噬核能吐息,毁灭万物战神。", + "ImageUrl": "/uploads/18006.png?timespan=1784299933", + "Type": 6, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "13005", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "18005", + "Name": "人鱼公主", + "Desc": "深海化身海王,主宰海洋之力。", + "ImageUrl": "/uploads/18005.png?timespan=1784299896", + "Type": 6, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "13004", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "18004", + "Name": "熊猫侠客战神碎片", + "Desc": "执剑吹箫行侠,守护国宝自然。", + "ImageUrl": "/uploads/18004.png?timespan=1784299759", + "Type": 6, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "13003", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "18003", + "Name": "杨戬战神碎片", + "Desc": "天眼识破万象,劈山救母战神。", + "ImageUrl": "/uploads/18003.png?timespan=1784299705", + "Type": 6, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "13002", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "18002", + "Name": "孙悟空战神碎片", + "Desc": "大闹天宫降妖,斗战不屈战神。", + "ImageUrl": "/uploads/18002.png?timespan=1784299633", + "Type": 6, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "13001", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "18001", + "Name": "大乔碎片", + "Desc": "提灯守望沧海,指引爱人归途。", + "ImageUrl": "/uploads/18001.png?timespan=1784298975", + "Type": 6, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11001", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16001", + "Name": "深海之眼碎片", + "Desc": "", + "ImageUrl": "/uploads/16001.png?timespan=1784297830", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11002", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16002", + "Name": "祥龙九天碎片", + "Desc": "", + "ImageUrl": "/uploads/16002.png?timespan=1784297858", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11003", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16003", + "Name": "星际战舰碎片", + "Desc": "", + "ImageUrl": "/uploads/16003.png?timespan=1784297863", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11004", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16004", + "Name": "星际穿梭碎片", + "Desc": "", + "ImageUrl": "/uploads/16004.png?timespan=1784297870", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11005", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16005", + "Name": "洛神萌仙碎片", + "Desc": "", + "ImageUrl": "/uploads/16005.png?timespan=1784297877", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11006", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16006", + "Name": "脉冲音波碎片", + "Desc": "", + "ImageUrl": "/uploads/16006.png?timespan=1784297884", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11007", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16007", + "Name": "萌娃驾到碎片", + "Desc": "", + "ImageUrl": "/uploads/16007.png?timespan=1784296927", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11008", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16008", + "Name": "创世之心碎片", + "Desc": "", + "ImageUrl": "/uploads/16008.png?timespan=1784297893", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11009", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16009", + "Name": "龙舟先锋碎片", + "Desc": "", + "ImageUrl": "/uploads/16009.png?timespan=1784297901", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11010", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16010", + "Name": "金福满堂碎片", + "Desc": "", + "ImageUrl": "/uploads/16010.png?timespan=1784297908", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11011", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16011", + "Name": "福狮之心碎片", + "Desc": "", + "ImageUrl": "/uploads/16011.png?timespan=1784297917", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11012", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16012", + "Name": "舞兔映月碎片", + "Desc": "", + "ImageUrl": "/uploads/16012.png?timespan=1784297924", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11013", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16013", + "Name": "森林秘宝碎片", + "Desc": "", + "ImageUrl": "/uploads/16013.png?timespan=1784297931", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11014", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16014", + "Name": "心心相印碎片", + "Desc": "", + "ImageUrl": "/uploads/16014.png?timespan=1784297936", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11015", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16015", + "Name": "冰火回响碎片", + "Desc": "", + "ImageUrl": "/uploads/16015.png?timespan=1784297943", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11016", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16016", + "Name": "梦华水晶碎片", + "Desc": "", + "ImageUrl": "/uploads/16016.png?timespan=1784297948", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11017", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16017", + "Name": "苍刃出鞘碎片", + "Desc": "", + "ImageUrl": "/uploads/16017.png?timespan=1784297954", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11018", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16018", + "Name": "梦魇鬼魅碎片", + "Desc": "", + "ImageUrl": "/uploads/16018.png?timespan=1784297960", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11019", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16019", + "Name": "救赎圣域碎片", + "Desc": "", + "ImageUrl": "/uploads/16019.png?timespan=1784297966", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11020", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16020", + "Name": "武装斗神碎片", + "Desc": "", + "ImageUrl": "/uploads/16020.png?timespan=1784297973", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11021", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16021", + "Name": "诸葛神弩碎片", + "Desc": "", + "ImageUrl": "/uploads/16021.png?timespan=1784297980", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11022", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16022", + "Name": "春华锦簇碎片", + "Desc": "", + "ImageUrl": "/uploads/16022.png?timespan=1784297987", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11023", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16023", + "Name": "神龙大侠碎片", + "Desc": "", + "ImageUrl": "/uploads/16023.png?timespan=1784297999", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11024", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16024", + "Name": "醒狮纳吉1碎片", + "Desc": "", + "ImageUrl": "/uploads/16024.png?timespan=1784298007", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11025", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16025", + "Name": "鸿兔先锋碎片", + "Desc": "", + "ImageUrl": "/uploads/16025.png?timespan=1784298018", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11026", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16026", + "Name": "刑天魔斧碎片", + "Desc": "", + "ImageUrl": "/uploads/16026.png?timespan=1784298030", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11027", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16027", + "Name": "冰霜巨龙碎片", + "Desc": "", + "ImageUrl": "/uploads/16027.png?timespan=1784298036", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11028", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16028", + "Name": "剑气如虹碎片", + "Desc": "", + "ImageUrl": "/uploads/16028.png?timespan=1784298043", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11029", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16029", + "Name": "万圣通灵碎片", + "Desc": "", + "ImageUrl": "/uploads/16029.png?timespan=1784298050", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11030", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16030", + "Name": "八卦神炉碎片", + "Desc": "", + "ImageUrl": "/uploads/16030.png?timespan=1784298056", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11031", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16031", + "Name": "暗域侵扰碎片", + "Desc": "", + "ImageUrl": "/uploads/16031.png?timespan=1784298063", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11032", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16032", + "Name": "天下无极碎片", + "Desc": "", + "ImageUrl": "/uploads/16032.png?timespan=1784298070", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11033", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16033", + "Name": "金秋之心碎片", + "Desc": "", + "ImageUrl": "/uploads/16033.png?timespan=1784298077", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11034", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16034", + "Name": "沙滩明珠碎片", + "Desc": "", + "ImageUrl": "/uploads/16034.png?timespan=1784298085", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11035", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16035", + "Name": "甜心教主碎片", + "Desc": "", + "ImageUrl": "/uploads/16035.png?timespan=1784298094", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11036", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16036", + "Name": "荧光之星碎片", + "Desc": "", + "ImageUrl": "/uploads/16036.png?timespan=1784298102", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11037", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16037", + "Name": "雷神之怒碎片", + "Desc": "", + "ImageUrl": "/uploads/16037.png?timespan=1784298110", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11038", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16038", + "Name": "麒麟瑞兽碎片", + "Desc": "", + "ImageUrl": "/uploads/16038.png?timespan=1784298116", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11039", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16039", + "Name": "黑龙吐息碎片", + "Desc": "", + "ImageUrl": "/uploads/16039.png?timespan=1784298123", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11040", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16040", + "Name": "圣光之剑碎片", + "Desc": "", + "ImageUrl": "/uploads/16040.png?timespan=1784298130", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11041", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16041", + "Name": "能量核心碎片", + "Desc": "", + "ImageUrl": "/uploads/16041.png?timespan=1784298137", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11042", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16042", + "Name": "战魂之刃碎片", + "Desc": "", + "ImageUrl": "/uploads/16042.png?timespan=1784298146", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11043", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16043", + "Name": "战神之怒碎片", + "Desc": "", + "ImageUrl": "/uploads/16043.png?timespan=1784298155", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11044", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16044", + "Name": "醒狮纳吉碎片", + "Desc": "", + "ImageUrl": "/uploads/16044.png?timespan=1784298164", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 60, + "ProductNumber": "11045", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "16045", + "Name": "裂魂之刃碎片", + "Desc": "", + "ImageUrl": "/uploads/16045.png?timespan=1784298172", + "Type": 3, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12001", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17001", + "Name": "自由之翼碎片", + "Desc": "", + "ImageUrl": "/uploads/17001.png?timespan=1784298259", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12002", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17002", + "Name": "紫晶龙翼碎片", + "Desc": "", + "ImageUrl": "/uploads/17002.png?timespan=1784298674", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12003", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17003", + "Name": "祥麟瑞凤碎片", + "Desc": "", + "ImageUrl": "/uploads/17003.png?timespan=1784298667", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12004", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17004", + "Name": "雷霆万钧碎片", + "Desc": "", + "ImageUrl": "/uploads/17004.png?timespan=1784298655", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12005", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17005", + "Name": "梦幻之翼碎片", + "Desc": "", + "ImageUrl": "/uploads/17005.png?timespan=1784298647", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12006", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17006", + "Name": "风暴之心碎片", + "Desc": "", + "ImageUrl": "/uploads/17006.png?timespan=1784298635", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12007", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17007", + "Name": "堕天使之翼碎片", + "Desc": "", + "ImageUrl": "/uploads/17007.png?timespan=1784298628", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12008", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17008", + "Name": "飞鱼双翅碎片", + "Desc": "", + "ImageUrl": "/uploads/17008.png?timespan=1784298621", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12009", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17009", + "Name": "极度深寒碎片", + "Desc": "", + "ImageUrl": "/uploads/17009.png?timespan=1784298614", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12010", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17010", + "Name": "如虎添翼碎片", + "Desc": "", + "ImageUrl": "/uploads/17010.png?timespan=1784298607", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12011", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17011", + "Name": "战魂之翼碎片", + "Desc": "", + "ImageUrl": "/uploads/17011.png?timespan=1784298600", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12012", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17012", + "Name": "傲游太虚碎片", + "Desc": "", + "ImageUrl": "/uploads/17012.png?timespan=1784298592", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12013", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17013", + "Name": "珍珠之翼碎片", + "Desc": "", + "ImageUrl": "/uploads/17013.png?timespan=1784298586", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12014", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17014", + "Name": "金秋之翼碎片", + "Desc": "", + "ImageUrl": "/uploads/17014.png?timespan=1784298577", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12015", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17015", + "Name": "血翼狂潮碎片", + "Desc": "", + "ImageUrl": "/uploads/17015.png?timespan=1784298544", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12016", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17016", + "Name": "幽冥飞刃碎片", + "Desc": "", + "ImageUrl": "/uploads/17016.png?timespan=1784298537", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12017", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17017", + "Name": "战旗之翼碎片", + "Desc": "", + "ImageUrl": "/uploads/17017.png?timespan=1784298530", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12018", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17018", + "Name": "三昧真火碎片", + "Desc": "", + "ImageUrl": "/uploads/17018.png?timespan=1784298524", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12019", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17019", + "Name": "永冻领域碎片", + "Desc": "", + "ImageUrl": "/uploads/17019.png?timespan=1784298509", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12020", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17020", + "Name": "蚩尤虎魄碎片", + "Desc": "", + "ImageUrl": "/uploads/17020.png?timespan=1784298502", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12021", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17021", + "Name": "鸿福展翅碎片", + "Desc": "", + "ImageUrl": "/uploads/17021.png?timespan=1784298495", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12022", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17022", + "Name": "流光祥翼碎片", + "Desc": "", + "ImageUrl": "/uploads/17022.png?timespan=1784298486", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12023", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17023", + "Name": "武林至尊碎片", + "Desc": "", + "ImageUrl": "/uploads/17023.png?timespan=1784298480", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12024", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17024", + "Name": "流光华彩碎片", + "Desc": "", + "ImageUrl": "/uploads/17024.png?timespan=1784298469", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12025", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17025", + "Name": "焰翎之翼碎片", + "Desc": "", + "ImageUrl": "/uploads/17025.png?timespan=1784298462", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12026", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17026", + "Name": "天机神鹰碎片", + "Desc": "", + "ImageUrl": "/uploads/17026.png?timespan=1784298455", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12027", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17027", + "Name": "圣洁之心碎片", + "Desc": "", + "ImageUrl": "/uploads/17027.png?timespan=1784298448", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12028", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17028", + "Name": "刀光剑影碎片", + "Desc": "", + "ImageUrl": "/uploads/17028.png?timespan=1784298441", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12029", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17029", + "Name": "流火之焰碎片", + "Desc": "", + "ImageUrl": "/uploads/17029.png?timespan=1784298434", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12030", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17030", + "Name": "玄冰烈焰碎片", + "Desc": "", + "ImageUrl": "/uploads/17030.png?timespan=1784298427", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12031", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17031", + "Name": "巨蟹之翼碎片", + "Desc": "", + "ImageUrl": "/uploads/17031.png?timespan=1784298419", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12032", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17032", + "Name": "飞龙在天碎片", + "Desc": "", + "ImageUrl": "/uploads/17032.png?timespan=1784298412", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12033", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17033", + "Name": "金色童年碎片", + "Desc": "", + "ImageUrl": "/uploads/17033.png?timespan=1784298404", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12034", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17034", + "Name": "虚空之光碎片", + "Desc": "", + "ImageUrl": "/uploads/17034.png?timespan=1784298396", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12035", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17035", + "Name": "蜻蜓之夏碎片", + "Desc": "", + "ImageUrl": "/uploads/17035.png?timespan=1784298385", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12036", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17036", + "Name": "幻蝶彩翼碎片", + "Desc": "", + "ImageUrl": "/uploads/17036.png?timespan=1784298377", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12037", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17037", + "Name": "福狮之翼碎片", + "Desc": "", + "ImageUrl": "/uploads/17037.png?timespan=1784298369", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12038", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17038", + "Name": "炽核振羽碎片", + "Desc": "", + "ImageUrl": "/uploads/17038.png?timespan=1784298360", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12039", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17039", + "Name": "树影轻舞碎片", + "Desc": "", + "ImageUrl": "/uploads/17039.png?timespan=1784298352", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12040", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17040", + "Name": "创世幻翼碎片", + "Desc": "", + "ImageUrl": "/uploads/17040.png?timespan=1784298342", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12041", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17041", + "Name": "环游世界碎片", + "Desc": "", + "ImageUrl": "/uploads/17041.png?timespan=1784298329", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12042", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17042", + "Name": "音律幻羽碎片", + "Desc": "", + "ImageUrl": "/uploads/17042.png?timespan=1784298318", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12043", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17043", + "Name": "洛神云翼碎片", + "Desc": "", + "ImageUrl": "/uploads/17043.png?timespan=1784298305", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12044", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17044", + "Name": "五谷丰登碎片", + "Desc": "", + "ImageUrl": "/uploads/17044.png?timespan=1784298293", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12045", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17045", + "Name": "次元光翼碎片", + "Desc": "", + "ImageUrl": "/uploads/17045.png?timespan=1784298285", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12046", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17046", + "Name": "时空穿梭碎片", + "Desc": "", + "ImageUrl": "/uploads/17046.png?timespan=1784298277", + "Type": 4, + "Level": 0 + }, + { + "FragmentCount": 120, + "ProductNumber": "12047", + "SaleType": 1, + "Price": 0, + "SaleCount": 1, + "VIPPrice": 0, + "DealerPrice": 0, + "IsEnable": true, + "IsSale": false, + "Number": "17047", + "Name": "玄武灵蛇碎片", + "Desc": "", + "ImageUrl": "/uploads/17047.png?timespan=1784298269", + "Type": 4, + "Level": 0 + } + ], + "ScratchCardConfig": [ + { + "Type": 1, + "BaseProduct": null, + "Count": 5000, + "Weight": 2500 + }, + { + "Type": 1, + "BaseProduct": null, + "Count": 10000, + "Weight": 2000 + }, + { + "Type": 1, + "BaseProduct": null, + "Count": 50000, + "Weight": 1000 + }, + { + "Type": 1, + "BaseProduct": null, + "Count": 100000, + "Weight": 500 + }, + { + "Type": 1, + "BaseProduct": null, + "Count": 500000, + "Weight": 100 + }, + { + "Type": 1, + "BaseProduct": null, + "Count": 1000000, + "Weight": 20 + }, + { + "Type": 2, + "BaseProduct": null, + "Count": 10, + "Weight": 2000 + }, + { + "Type": 2, + "BaseProduct": null, + "Count": 50, + "Weight": 800 + }, + { + "Type": 2, + "BaseProduct": null, + "Count": 100, + "Weight": 300 + }, + { + "Type": 2, + "BaseProduct": null, + "Count": 500, + "Weight": 50 + }, + { + "Type": 3, + "BaseProduct": { + "Number": "40006", + "Name": "召唤卡", + "Desc": "召唤卡", + "ImageUrl": "/uploads/40006.png", + "Type": 11, + "Level": 0 + }, + "Count": 1, + "Weight": 500 + }, + { + "Type": 3, + "BaseProduct": { + "Number": "40002", + "Name": "大喇叭", + "Desc": "大喇叭", + "ImageUrl": "/uploads/40002.png", + "Type": 9, + "Level": 0 + }, + "Count": 1, + "Weight": 300 + }, + { + "Type": 3, + "BaseProduct": { + "Number": "40004", + "Name": "狂暴", + "Desc": "狂暴", + "ImageUrl": "/uploads/40004.png", + "Type": 10, + "Level": 0 + }, + "Count": 1, + "Weight": 300 + }, + { + "Type": 3, + "BaseProduct": { + "Number": "40003", + "Name": "冰冻", + "Desc": "冰冻", + "ImageUrl": "/uploads/40003.png", + "Type": 10, + "Level": 0 + }, + "Count": 1, + "Weight": 300 + }, + { + "Type": 3, + "BaseProduct": { + "Number": "40001", + "Name": "改名卡", + "Desc": "改名卡", + "ImageUrl": "/uploads/40001.png", + "Type": 8, + "Level": 0 + }, + "Count": 1, + "Weight": 200 + } + ], + "VipLevelConfigs": [ + { + "Level": 0, + "ExpMax": 999, + "ExpMin": 0, + "SignInAdd": 0, + "Remark": "", + "GiftList": [], + "DailyGift": [] + }, + { + "Level": 1, + "ExpMax": 1999, + "ExpMin": 1000, + "SignInAdd": 0.1, + "Remark": "Vip等级1介绍:
1.狂暴*5
2.冰冻*5
3.VIP1专属炮台*1
4.每日随机领取冰冻
5.每日随机领取狂暴
6.每日随机领取金币
", + "GiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 5, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40100", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "DailyGift": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": true, + "Count": 0, + "MinCount": 1, + "MaxCount": 6 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": true, + "Count": 0, + "MinCount": 1, + "MaxCount": 5 + } + ] + }, + { + "Level": 2, + "ExpMax": 2999, + "ExpMin": 2000, + "SignInAdd": 0.2, + "Remark": "Vip等级2介绍:
1.狂暴*10
2.冰冻*10
3.VIP2专属炮台*1
4.每日随机领取冰冻
5.每日随机领取狂暴
6.每日随机领取金币
", + "GiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 10, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40101", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "DailyGift": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": true, + "Count": 0, + "MinCount": 5, + "MaxCount": 10 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": true, + "Count": 0, + "MinCount": 5, + "MaxCount": 10 + }, + { + "Type": 1, + "OtherId": "", + "IsRandom": true, + "Count": 0, + "MinCount": 5000, + "MaxCount": 60000 + } + ] + }, + { + "Level": 3, + "ExpMax": 4999, + "ExpMin": 3000, + "SignInAdd": 0.3, + "Remark": "Vip等级3介绍:
1.狂暴*15
2.冰冻*15
3.VIP3专属炮台*1
4.每日随机领取冰冻
5.每日随机领取狂暴
6.每日随机领取金币
", + "GiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40002", + "IsRandom": false, + "Count": 15, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40101", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "DailyGift": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": true, + "Count": 0, + "MinCount": 10, + "MaxCount": 15 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": true, + "Count": 0, + "MinCount": 10, + "MaxCount": 15 + } + ] + }, + { + "Level": 4, + "ExpMax": 7999, + "ExpMin": 5000, + "SignInAdd": 0.4, + "Remark": "Vip等级4介绍:
1.狂暴*20
2.冰冻*20
3.VIP4专属炮台*1
4.每日随机领取冰冻
5.每日随机领取狂暴
6.每日随机领取金币
", + "GiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 20, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 20, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40103", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "DailyGift": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": true, + "Count": 0, + "MinCount": 15, + "MaxCount": 20 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": true, + "Count": 0, + "MinCount": 15, + "MaxCount": 20 + } + ] + }, + { + "Level": 5, + "ExpMax": 10999, + "ExpMin": 8000, + "SignInAdd": 0.5, + "Remark": "Vip等级5介绍:
1.狂暴*25
2.冰冻*25
3.VIP5专属炮台*1
4.每日随机领取冰冻
5.每日随机领取狂暴
6.每日随机领取金币
", + "GiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 25, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 25, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40104", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "DailyGift": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": true, + "Count": 0, + "MinCount": 20, + "MaxCount": 25 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": true, + "Count": 0, + "MinCount": 20, + "MaxCount": 25 + } + ] + }, + { + "Level": 6, + "ExpMax": 12999, + "ExpMin": 11000, + "SignInAdd": 0.6, + "Remark": "Vip等级6介绍:
1.狂暴*30
2.冰冻*30
3.VIP6专属炮台*1
4.每日随机领取冰冻
5.每日随机领取狂暴
6.每日随机领取金币
", + "GiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 30, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 30, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40105", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "DailyGift": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": true, + "Count": 0, + "MinCount": 25, + "MaxCount": 30 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": true, + "Count": 0, + "MinCount": 25, + "MaxCount": 30 + } + ] + }, + { + "Level": 7, + "ExpMax": 14999, + "ExpMin": 13000, + "SignInAdd": 0.7, + "Remark": "Vip等级7介绍:
1.狂暴*35
2.冰冻*35
3.VIP7专属炮台*1
4.每日随机领取冰冻
5.每日随机领取狂暴
6.每日随机领取金币
", + "GiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 50, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 50, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40106", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "DailyGift": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": true, + "Count": 0, + "MinCount": 30, + "MaxCount": 50 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": true, + "Count": 0, + "MinCount": 30, + "MaxCount": 50 + } + ] + }, + { + "Level": 8, + "ExpMax": 17999, + "ExpMin": 15000, + "SignInAdd": 0.8, + "Remark": "Vip等级8介绍:
1.狂暴*40
2.冰冻*40
3.VIP8专属炮台*1
4.每日随机领取冰冻
5.每日随机领取狂暴
6.每日随机领取金币
", + "GiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 80, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 80, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40107", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "DailyGift": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 80, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 80, + "MinCount": 0, + "MaxCount": 0 + } + ] + }, + { + "Level": 9, + "ExpMax": 19999, + "ExpMin": 18000, + "SignInAdd": 0.9, + "Remark": "Vip等级9介绍:
1.狂暴*45
2.冰冻*45
3.VIP9专属炮台*1
4.每日随机领取冰冻
5.每日随机领取狂暴
6.每日随机领取金币
", + "GiftList": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 100, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 100, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40108", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "DailyGift": [ + { + "Type": 3, + "OtherId": "40004", + "IsRandom": true, + "Count": 0, + "MinCount": 80, + "MaxCount": 100 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": true, + "Count": 0, + "MinCount": 80, + "MaxCount": 100 + } + ] + }, + { + "Level": 10, + "ExpMax": 99999999, + "ExpMin": 20000, + "SignInAdd": 1, + "Remark": "Vip等级10介绍:
1.狂暴*50
2.冰冻*50
3.VIP10专属炮台*1
4.每日随机领取冰冻
5.每日随机领取狂暴
6.每日随机领取金币
", + "GiftList": [ + { + "Type": 2, + "OtherId": "", + "IsRandom": false, + "Count": 328, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40004", + "IsRandom": false, + "Count": 100, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40003", + "IsRandom": false, + "Count": 100, + "MinCount": 0, + "MaxCount": 0 + }, + { + "Type": 3, + "OtherId": "40109", + "IsRandom": false, + "Count": 1, + "MinCount": 0, + "MaxCount": 0 + } + ], + "DailyGift": [] + } + ], + "KillConfig": { + "NormalizationFactorPlayer": 50000, + "MinPlayerModifier": 0.3, + "MaxPlayerModifier": 2, + "TargetSystemProfit": 1000000, + "NormalizationFactorSystem": 10000000, + "MinSystemModifier": 0.95, + "MaxSystemModifier": 1.05, + "DaySystemGold": 100000, + "IPCount": 5, + "ViolateValue": 0.2, + "CompensateRate": { + "BossRate": 1, + "GoldRate": 1, + "SpecialRate": 1, + "Ordinary": 1 + }, + "PenaltyRate": { + "BossRate": 1, + "GoldRate": 1, + "SpecialRate": 1, + "Ordinary": 1 + }, + "GlobalAnnounceMinGold": 0 + }, + "BossConfigs": { + "LuckWheel": [ + { + "OptionList": [ + { + "OptionId": 50, + "TriggerRate": 50, + "Score": 50 + }, + { + "OptionId": 100, + "TriggerRate": 100, + "Score": 100 + }, + { + "OptionId": 230, + "TriggerRate": 230, + "Score": 200 + }, + { + "OptionId": 80, + "TriggerRate": 80, + "Score": 80 + }, + { + "OptionId": 280, + "TriggerRate": 280, + "Score": 280 + }, + { + "OptionId": 300, + "TriggerRate": 300, + "Score": 300 + }, + { + "OptionId": 130, + "TriggerRate": 130, + "Score": 130 + }, + { + "OptionId": 250, + "TriggerRate": 250, + "Score": 250 + } + ], + "CountList": [ + { + "OptionId": 1, + "TriggerRate": 100, + "Score": 0 + }, + { + "OptionId": 2, + "TriggerRate": 100, + "Score": 0 + }, + { + "OptionId": 3, + "TriggerRate": 100, + "Score": 0 + }, + { + "OptionId": 4, + "TriggerRate": 30, + "Score": 0 + }, + { + "OptionId": 5, + "TriggerRate": 15, + "Score": 0 + }, + { + "OptionId": 6, + "TriggerRate": 5, + "Score": 0 + } + ], + "FishNumber": [ + "12031" + ] + }, + { + "OptionList": [ + { + "OptionId": 50, + "TriggerRate": 500, + "Score": 50 + }, + { + "OptionId": 100, + "TriggerRate": 300, + "Score": 100 + }, + { + "OptionId": 230, + "TriggerRate": 350, + "Score": 230 + }, + { + "OptionId": 80, + "TriggerRate": 150, + "Score": 80 + }, + { + "OptionId": 280, + "TriggerRate": 80, + "Score": 280 + }, + { + "OptionId": 300, + "TriggerRate": 60, + "Score": 300 + }, + { + "OptionId": 130, + "TriggerRate": 50, + "Score": 130 + }, + { + "OptionId": 250, + "TriggerRate": 65, + "Score": 250 + } + ], + "CountList": [ + { + "OptionId": 1, + "TriggerRate": 100, + "Score": 0 + }, + { + "OptionId": 2, + "TriggerRate": 100, + "Score": 0 + }, + { + "OptionId": 3, + "TriggerRate": 100, + "Score": 0 + }, + { + "OptionId": 4, + "TriggerRate": 30, + "Score": 0 + }, + { + "OptionId": 5, + "TriggerRate": 15, + "Score": 0 + }, + { + "OptionId": 6, + "TriggerRate": 5, + "Score": 0 + } + ], + "FishNumber": [ + "11038" + ] + }, + { + "OptionList": [ + { + "OptionId": 50, + "TriggerRate": 50, + "Score": 50 + }, + { + "OptionId": 100, + "TriggerRate": 100, + "Score": 100 + }, + { + "OptionId": 230, + "TriggerRate": 230, + "Score": 200 + }, + { + "OptionId": 80, + "TriggerRate": 80, + "Score": 80 + }, + { + "OptionId": 280, + "TriggerRate": 280, + "Score": 280 + }, + { + "OptionId": 300, + "TriggerRate": 300, + "Score": 300 + }, + { + "OptionId": 130, + "TriggerRate": 130, + "Score": 130 + }, + { + "OptionId": 250, + "TriggerRate": 250, + "Score": 250 + } + ], + "CountList": [ + { + "OptionId": 1, + "TriggerRate": 100, + "Score": 0 + }, + { + "OptionId": 2, + "TriggerRate": 100, + "Score": 0 + }, + { + "OptionId": 3, + "TriggerRate": 100, + "Score": 0 + }, + { + "OptionId": 4, + "TriggerRate": 30, + "Score": 0 + }, + { + "OptionId": 5, + "TriggerRate": 15, + "Score": 0 + }, + { + "OptionId": 6, + "TriggerRate": 5, + "Score": 0 + } + ], + "FishNumber": [ + "12032" + ] + } + ], + "LuckPoker": { + "OptionList": [ + { + "OptionId": 1, + "TriggerRate": 1, + "Score": 200 + }, + { + "OptionId": 2, + "TriggerRate": 2, + "Score": 100 + }, + { + "OptionId": 3, + "TriggerRate": 20, + "Score": 50 + }, + { + "OptionId": 4, + "TriggerRate": 13, + "Score": 80 + }, + { + "OptionId": 5, + "TriggerRate": 33, + "Score": 30 + }, + { + "OptionId": 6, + "TriggerRate": 205, + "Score": 10 + } + ], + "FishNumber": [ + "12023" + ] + }, + "LuckFlyDisk": [ + { + "InnerOptionList": [ + { + "OptionId": 10, + "TriggerRate": 100, + "Score": 10 + }, + { + "OptionId": 20, + "TriggerRate": 80, + "Score": 20 + }, + { + "OptionId": 30, + "TriggerRate": 70, + "Score": 30 + }, + { + "OptionId": 40, + "TriggerRate": 60, + "Score": 1400 + }, + { + "OptionId": 50, + "TriggerRate": 50, + "Score": 50 + }, + { + "OptionId": 80, + "TriggerRate": 30, + "Score": 80 + }, + { + "OptionId": 100, + "TriggerRate": 20, + "Score": 100 + }, + { + "OptionId": 150, + "TriggerRate": 10, + "Score": 150 + }, + { + "OptionId": 200, + "TriggerRate": 5, + "Score": 200 + }, + { + "OptionId": 500, + "TriggerRate": 2, + "Score": 500 + } + ], + "OuterOptionList": [ + { + "OptionId": 1, + "TriggerRate": 50, + "Score": 1 + }, + { + "OptionId": 1.2, + "TriggerRate": 40, + "Score": 1.2 + }, + { + "OptionId": 1.5, + "TriggerRate": 30, + "Score": 1.5 + }, + { + "OptionId": 1.8, + "TriggerRate": 20, + "Score": 1.8 + }, + { + "OptionId": 2, + "TriggerRate": 15, + "Score": 2 + }, + { + "OptionId": 2.5, + "TriggerRate": 10, + "Score": 2.5 + }, + { + "OptionId": 3, + "TriggerRate": 5, + "Score": 3 + } + ], + "FishNumber": [ + "12022" + ] + }, + { + "InnerOptionList": [ + { + "OptionId": 1, + "TriggerRate": 1, + "Score": 1 + }, + { + "OptionId": 2, + "TriggerRate": 2, + "Score": 2 + }, + { + "OptionId": 3, + "TriggerRate": 1, + "Score": 3 + } + ], + "OuterOptionList": [ + { + "OptionId": 2, + "TriggerRate": 1, + "Score": 2 + }, + { + "OptionId": 3, + "TriggerRate": 2, + "Score": 3 + }, + { + "OptionId": 4, + "TriggerRate": 1, + "Score": 4 + }, + { + "OptionId": 0, + "TriggerRate": 0, + "Score": 0 + } + ], + "FishNumber": [ + "11030" + ] + } + ], + "FullScreen": { + "FishNumber": [] + }, + "Range": { + "FishNumber": [] + }, + "AmmunitionBox": { + "OptionList": [ + { + "OptionId": 1, + "TriggerRate": 100, + "Score": 1 + }, + { + "OptionId": 2, + "TriggerRate": 100, + "Score": 2 + }, + { + "OptionId": 3, + "TriggerRate": 100, + "Score": 3 + } + ], + "FishNumber": [ + "12025" + ] + }, + "InterstellarCruise": { + "CountConfig": [ + { + "Count": 1, + "TriggerRate": 60, + "KillRate": 0 + }, + { + "Count": 2, + "TriggerRate": 30, + "KillRate": 0 + }, + { + "Count": 3, + "TriggerRate": 10, + "KillRate": 0 + } + ], + "OneDeathConfig": [ + { + "Min": 50, + "Max": 70, + "TriggerRate": 60 + }, + { + "Min": 71, + "Max": 90, + "TriggerRate": 30 + }, + { + "Min": 91, + "Max": 110, + "TriggerRate": 10 + }, + { + "Min": 171, + "Max": 190, + "TriggerRate": 79 + }, + { + "Min": 191, + "Max": 210, + "TriggerRate": 71 + } + ], + "TwoDeathConfig": [ + { + "Min": 110, + "Max": 130, + "TriggerRate": 138 + }, + { + "Min": 131, + "Max": 150, + "TriggerRate": 120 + }, + { + "Min": 151, + "Max": 170, + "TriggerRate": 106 + }, + { + "Min": 171, + "Max": 190, + "TriggerRate": 95 + }, + { + "Min": 191, + "Max": 210, + "TriggerRate": 86 + }, + { + "Min": 211, + "Max": 220, + "TriggerRate": 81 + }, + { + "Min": 221, + "Max": 230, + "TriggerRate": 78 + } + ], + "ThreeDeathConfig": [ + { + "Min": 150, + "Max": 160, + "TriggerRate": 125 + }, + { + "Min": 161, + "Max": 170, + "TriggerRate": 118 + }, + { + "Min": 171, + "Max": 180, + "TriggerRate": 111 + }, + { + "Min": 181, + "Max": 190, + "TriggerRate": 105 + }, + { + "Min": 191, + "Max": 200, + "TriggerRate": 100 + }, + { + "Min": 201, + "Max": 210, + "TriggerRate": 95 + }, + { + "Min": 210, + "Max": 220, + "TriggerRate": 91 + }, + { + "Min": 221, + "Max": 230, + "TriggerRate": 87 + } + ], + "FishNumber": [ + "12029" + ] + }, + "FlameStorm": { + "CountConfig": [ + { + "Count": 1, + "TriggerRate": 60, + "KillRate": 0 + }, + { + "Count": 2, + "TriggerRate": 30, + "KillRate": 0 + } + ], + "OneDeathConfig": [ + { + "Min": 150, + "Max": 160, + "TriggerRate": 100 + }, + { + "Min": 161, + "Max": 170, + "TriggerRate": 94 + }, + { + "Min": 171, + "Max": 180, + "TriggerRate": 89 + }, + { + "Min": 181, + "Max": 190, + "TriggerRate": 84 + }, + { + "Min": 191, + "Max": 200, + "TriggerRate": 80 + }, + { + "Min": 201, + "Max": 210, + "TriggerRate": 76 + }, + { + "Min": 210, + "Max": 220, + "TriggerRate": 73 + }, + { + "Min": 221, + "Max": 230, + "TriggerRate": 69 + } + ], + "TwoDeathConfig": [ + { + "Min": 150, + "Max": 160, + "TriggerRate": 100 + }, + { + "Min": 161, + "Max": 170, + "TriggerRate": 94 + }, + { + "Min": 171, + "Max": 180, + "TriggerRate": 89 + }, + { + "Min": 181, + "Max": 190, + "TriggerRate": 84 + }, + { + "Min": 191, + "Max": 200, + "TriggerRate": 80 + }, + { + "Min": 201, + "Max": 210, + "TriggerRate": 76 + }, + { + "Min": 210, + "Max": 220, + "TriggerRate": 73 + }, + { + "Min": 221, + "Max": 230, + "TriggerRate": 69 + } + ], + "FishNumber": [ + "12034" + ] + }, + "Bomb": { + "CountConfig": [ + { + "Count": 1, + "TriggerRate": 60, + "KillRate": 0 + }, + { + "Count": 2, + "TriggerRate": 30, + "KillRate": 0 + } + ], + "OneDeathConfig": [ + { + "Min": 360, + "Max": 400, + "TriggerRate": 100 + }, + { + "Min": 401, + "Max": 460, + "TriggerRate": 94 + }, + { + "Min": 461, + "Max": 500, + "TriggerRate": 89 + }, + { + "Min": 501, + "Max": 560, + "TriggerRate": 84 + }, + { + "Min": 601, + "Max": 660, + "TriggerRate": 76 + }, + { + "Min": 661, + "Max": 700, + "TriggerRate": 73 + }, + { + "Min": 701, + "Max": 760, + "TriggerRate": 70 + }, + { + "Min": 761, + "Max": 800, + "TriggerRate": 67 + }, + { + "Min": 801, + "Max": 900, + "TriggerRate": 63 + }, + { + "Min": 901, + "Max": 980, + "TriggerRate": 59 + } + ], + "TwoDeathConfig": [ + { + "Min": 360, + "Max": 400, + "TriggerRate": 100 + }, + { + "Min": 401, + "Max": 460, + "TriggerRate": 87 + }, + { + "Min": 461, + "Max": 500, + "TriggerRate": 77 + }, + { + "Min": 501, + "Max": 560, + "TriggerRate": 69 + }, + { + "Min": 601, + "Max": 660, + "TriggerRate": 61 + }, + { + "Min": 661, + "Max": 700, + "TriggerRate": 56 + }, + { + "Min": 701, + "Max": 760, + "TriggerRate": 52 + }, + { + "Min": 761, + "Max": 800, + "TriggerRate": 48 + }, + { + "Min": 801, + "Max": 900, + "TriggerRate": 44 + }, + { + "Min": 901, + "Max": 980, + "TriggerRate": 41 + } + ], + "FishNumber": [ + "12030" + ] + }, + "Probability": [ + { + "configParams": [ + { + "Min": 260, + "Max": 270, + "TriggerRate": 60 + }, + { + "Min": 271, + "Max": 280, + "TriggerRate": 57 + }, + { + "Min": 281, + "Max": 290, + "TriggerRate": 54 + }, + { + "Min": 291, + "Max": 300, + "TriggerRate": 51 + }, + { + "Min": 301, + "Max": 310, + "TriggerRate": 48 + }, + { + "Min": 311, + "Max": 320, + "TriggerRate": 45 + }, + { + "Min": 321, + "Max": 330, + "TriggerRate": 42 + }, + { + "Min": 331, + "Max": 340, + "TriggerRate": 39 + }, + { + "Min": 341, + "Max": 350, + "TriggerRate": 36 + }, + { + "Min": 351, + "Max": 360, + "TriggerRate": 33 + }, + { + "Min": 0, + "Max": 0, + "TriggerRate": 0 + } + ], + "FishNumber": [ + "13024" + ] + }, + { + "configParams": [ + { + "Min": 160, + "Max": 170, + "TriggerRate": 115 + }, + { + "Min": 171, + "Max": 180, + "TriggerRate": 108 + }, + { + "Min": 181, + "Max": 190, + "TriggerRate": 102 + }, + { + "Min": 191, + "Max": 200, + "TriggerRate": 95 + }, + { + "Min": 201, + "Max": 210, + "TriggerRate": 89 + }, + { + "Min": 211, + "Max": 220, + "TriggerRate": 83 + }, + { + "Min": 221, + "Max": 230, + "TriggerRate": 78 + }, + { + "Min": 231, + "Max": 240, + "TriggerRate": 74 + } + ], + "FishNumber": [ + "13025" + ] + }, + { + "configParams": [ + { + "Min": 261, + "Max": 270, + "TriggerRate": 60 + }, + { + "Min": 271, + "Max": 280, + "TriggerRate": 57 + }, + { + "Min": 281, + "Max": 290, + "TriggerRate": 54 + }, + { + "Min": 291, + "Max": 300, + "TriggerRate": 51 + }, + { + "Min": 301, + "Max": 310, + "TriggerRate": 48 + }, + { + "Min": 311, + "Max": 320, + "TriggerRate": 45 + }, + { + "Min": 321, + "Max": 330, + "TriggerRate": 42 + }, + { + "Min": 331, + "Max": 340, + "TriggerRate": 39 + }, + { + "Min": 341, + "Max": 350, + "TriggerRate": 36 + }, + { + "Min": 351, + "Max": 360, + "TriggerRate": 33 + } + ], + "FishNumber": [ + "13026" + ] + }, + { + "configParams": [ + { + "Min": 300, + "Max": 310, + "TriggerRate": 50 + }, + { + "Min": 311, + "Max": 320, + "TriggerRate": 46 + }, + { + "Min": 321, + "Max": 330, + "TriggerRate": 42 + }, + { + "Min": 331, + "Max": 340, + "TriggerRate": 38 + }, + { + "Min": 341, + "Max": 350, + "TriggerRate": 34 + }, + { + "Min": 351, + "Max": 360, + "TriggerRate": 30 + }, + { + "Min": 361, + "Max": 370, + "TriggerRate": 26 + }, + { + "Min": 371, + "Max": 380, + "TriggerRate": 22 + }, + { + "Min": 0, + "Max": 0, + "TriggerRate": 0 + }, + { + "Min": 0, + "Max": 0, + "TriggerRate": 0 + } + ], + "FishNumber": [ + "13027" + ] + }, + { + "configParams": [ + { + "Min": 300, + "Max": 310, + "TriggerRate": 50 + }, + { + "Min": 311, + "Max": 320, + "TriggerRate": 46 + }, + { + "Min": 321, + "Max": 330, + "TriggerRate": 42 + }, + { + "Min": 331, + "Max": 340, + "TriggerRate": 38 + }, + { + "Min": 341, + "Max": 350, + "TriggerRate": 34 + }, + { + "Min": 351, + "Max": 360, + "TriggerRate": 30 + }, + { + "Min": 361, + "Max": 370, + "TriggerRate": 26 + }, + { + "Min": 371, + "Max": 380, + "TriggerRate": 22 + }, + { + "Min": 0, + "Max": 0, + "TriggerRate": 0 + }, + { + "Min": 0, + "Max": 0, + "TriggerRate": 0 + } + ], + "FishNumber": [ + "13028" + ] + }, + { + "configParams": [ + { + "Min": 300, + "Max": 310, + "TriggerRate": 50 + }, + { + "Min": 311, + "Max": 320, + "TriggerRate": 46 + }, + { + "Min": 321, + "Max": 330, + "TriggerRate": 42 + }, + { + "Min": 331, + "Max": 340, + "TriggerRate": 38 + }, + { + "Min": 341, + "Max": 350, + "TriggerRate": 34 + }, + { + "Min": 351, + "Max": 360, + "TriggerRate": 30 + }, + { + "Min": 361, + "Max": 370, + "TriggerRate": 26 + }, + { + "Min": 371, + "Max": 380, + "TriggerRate": 22 + } + ], + "FishNumber": [ + "13029" + ] + }, + { + "configParams": [ + { + "Min": 300, + "Max": 320, + "TriggerRate": 62 + }, + { + "Min": 321, + "Max": 340, + "TriggerRate": 58 + }, + { + "Min": 341, + "Max": 360, + "TriggerRate": 54 + }, + { + "Min": 361, + "Max": 380, + "TriggerRate": 50 + }, + { + "Min": 381, + "Max": 400, + "TriggerRate": 46 + }, + { + "Min": 401, + "Max": 420, + "TriggerRate": 42 + }, + { + "Min": 421, + "Max": 440, + "TriggerRate": 38 + }, + { + "Min": 441, + "Max": 460, + "TriggerRate": 34 + }, + { + "Min": 461, + "Max": 480, + "TriggerRate": 30 + }, + { + "Min": 481, + "Max": 500, + "TriggerRate": 26 + } + ], + "FishNumber": [ + "13030" + ] + }, + { + "configParams": [ + { + "Min": 300, + "Max": 320, + "TriggerRate": 62 + }, + { + "Min": 321, + "Max": 340, + "TriggerRate": 58 + }, + { + "Min": 341, + "Max": 360, + "TriggerRate": 54 + }, + { + "Min": 361, + "Max": 380, + "TriggerRate": 50 + }, + { + "Min": 381, + "Max": 400, + "TriggerRate": 46 + }, + { + "Min": 401, + "Max": 420, + "TriggerRate": 42 + }, + { + "Min": 421, + "Max": 440, + "TriggerRate": 38 + }, + { + "Min": 441, + "Max": 460, + "TriggerRate": 34 + }, + { + "Min": 461, + "Max": 480, + "TriggerRate": 30 + }, + { + "Min": 481, + "Max": 500, + "TriggerRate": 26 + } + ], + "FishNumber": [ + "13031" + ] + }, + { + "configParams": [ + { + "Min": 300, + "Max": 320, + "TriggerRate": 62 + }, + { + "Min": 321, + "Max": 340, + "TriggerRate": 58 + }, + { + "Min": 341, + "Max": 360, + "TriggerRate": 54 + }, + { + "Min": 361, + "Max": 380, + "TriggerRate": 50 + }, + { + "Min": 381, + "Max": 400, + "TriggerRate": 46 + }, + { + "Min": 401, + "Max": 420, + "TriggerRate": 42 + }, + { + "Min": 421, + "Max": 440, + "TriggerRate": 38 + }, + { + "Min": 441, + "Max": 460, + "TriggerRate": 34 + }, + { + "Min": 461, + "Max": 480, + "TriggerRate": 30 + }, + { + "Min": 481, + "Max": 500, + "TriggerRate": 26 + } + ], + "FishNumber": [ + "13032" + ] + }, + { + "configParams": [ + { + "Min": 500, + "Max": 580, + "TriggerRate": 30 + }, + { + "Min": 581, + "Max": 660, + "TriggerRate": 27 + }, + { + "Min": 661, + "Max": 720, + "TriggerRate": 24 + }, + { + "Min": 721, + "Max": 800, + "TriggerRate": 21 + }, + { + "Min": 801, + "Max": 880, + "TriggerRate": 18 + }, + { + "Min": 881, + "Max": 960, + "TriggerRate": 15 + }, + { + "Min": 961, + "Max": 1000, + "TriggerRate": 12 + }, + { + "Min": 0, + "Max": 0, + "TriggerRate": 0 + }, + { + "Min": 0, + "Max": 0, + "TriggerRate": 0 + }, + { + "Min": 0, + "Max": 0, + "TriggerRate": 0 + } + ], + "FishNumber": [ + "13033" + ] + }, + { + "configParams": [ + { + "Min": 500, + "Max": 580, + "TriggerRate": 30 + }, + { + "Min": 581, + "Max": 660, + "TriggerRate": 27 + }, + { + "Min": 661, + "Max": 720, + "TriggerRate": 24 + }, + { + "Min": 721, + "Max": 800, + "TriggerRate": 21 + }, + { + "Min": 801, + "Max": 880, + "TriggerRate": 18 + }, + { + "Min": 881, + "Max": 960, + "TriggerRate": 15 + }, + { + "Min": 961, + "Max": 1000, + "TriggerRate": 12 + } + ], + "FishNumber": [ + "13034" + ] + }, + { + "configParams": [ + { + "Min": 500, + "Max": 580, + "TriggerRate": 30 + }, + { + "Min": 581, + "Max": 660, + "TriggerRate": 27 + }, + { + "Min": 661, + "Max": 720, + "TriggerRate": 24 + }, + { + "Min": 721, + "Max": 800, + "TriggerRate": 21 + }, + { + "Min": 801, + "Max": 880, + "TriggerRate": 18 + }, + { + "Min": 881, + "Max": 960, + "TriggerRate": 15 + }, + { + "Min": 961, + "Max": 1000, + "TriggerRate": 12 + } + ], + "FishNumber": [ + "13035" + ] + }, + { + "configParams": [ + { + "Min": 600, + "Max": 660, + "TriggerRate": 36 + }, + { + "Min": 661, + "Max": 720, + "TriggerRate": 33 + }, + { + "Min": 721, + "Max": 780, + "TriggerRate": 30 + }, + { + "Min": 781, + "Max": 860, + "TriggerRate": 27 + }, + { + "Min": 861, + "Max": 960, + "TriggerRate": 24 + }, + { + "Min": 961, + "Max": 1060, + "TriggerRate": 21 + }, + { + "Min": 1061, + "Max": 1080, + "TriggerRate": 18 + }, + { + "Min": 1081, + "Max": 1160, + "TriggerRate": 15 + }, + { + "Min": 1161, + "Max": 1200, + "TriggerRate": 12 + }, + { + "Min": 0, + "Max": 0, + "TriggerRate": 0 + } + ], + "FishNumber": [ + "13036" + ] + }, + { + "configParams": [ + { + "Min": 600, + "Max": 660, + "TriggerRate": 36 + }, + { + "Min": 661, + "Max": 720, + "TriggerRate": 33 + }, + { + "Min": 721, + "Max": 780, + "TriggerRate": 30 + }, + { + "Min": 781, + "Max": 860, + "TriggerRate": 27 + }, + { + "Min": 861, + "Max": 960, + "TriggerRate": 24 + }, + { + "Min": 961, + "Max": 1060, + "TriggerRate": 21 + }, + { + "Min": 1601, + "Max": 1080, + "TriggerRate": 18 + }, + { + "Min": 1081, + "Max": 1160, + "TriggerRate": 15 + }, + { + "Min": 1161, + "Max": 1200, + "TriggerRate": 12 + } + ], + "FishNumber": [ + "13037" + ] + }, + { + "configParams": [ + { + "Min": 1, + "Max": 1, + "TriggerRate": 250 + }, + { + "Min": 2, + "Max": 2, + "TriggerRate": 125 + }, + { + "Min": 3, + "Max": 3, + "TriggerRate": 83 + }, + { + "Min": 4, + "Max": 4, + "TriggerRate": 62 + }, + { + "Min": 5, + "Max": 5, + "TriggerRate": 50 + }, + { + "Min": 6, + "Max": 6, + "TriggerRate": 41 + }, + { + "Min": 7, + "Max": 7, + "TriggerRate": 35 + }, + { + "Min": 8, + "Max": 8, + "TriggerRate": 31 + } + ], + "FishNumber": [ + "13038" + ] + }, + { + "configParams": [ + { + "Min": 1, + "Max": 1, + "TriggerRate": 250 + }, + { + "Min": 2, + "Max": 2, + "TriggerRate": 125 + }, + { + "Min": 3, + "Max": 3, + "TriggerRate": 83 + }, + { + "Min": 4, + "Max": 4, + "TriggerRate": 62 + }, + { + "Min": 5, + "Max": 5, + "TriggerRate": 50 + }, + { + "Min": 6, + "Max": 6, + "TriggerRate": 41 + }, + { + "Min": 7, + "Max": 7, + "TriggerRate": 35 + }, + { + "Min": 8, + "Max": 8, + "TriggerRate": 31 + }, + { + "Min": 0, + "Max": 0, + "TriggerRate": 0 + }, + { + "Min": 0, + "Max": 0, + "TriggerRate": 0 + } + ], + "FishNumber": [ + "13039" + ] + }, + { + "configParams": [ + { + "Min": 181, + "Max": 190, + "TriggerRate": 105 + }, + { + "Min": 191, + "Max": 200, + "TriggerRate": 100 + }, + { + "Min": 201, + "Max": 210, + "TriggerRate": 95 + }, + { + "Min": 211, + "Max": 220, + "TriggerRate": 91 + }, + { + "Min": 221, + "Max": 230, + "TriggerRate": 87 + }, + { + "Min": 231, + "Max": 240, + "TriggerRate": 83 + }, + { + "Min": 241, + "Max": 250, + "TriggerRate": 80 + }, + { + "Min": 251, + "Max": 260, + "TriggerRate": 77 + }, + { + "Min": 261, + "Max": 270, + "TriggerRate": 74 + }, + { + "Min": 271, + "Max": 280, + "TriggerRate": 71 + } + ], + "FishNumber": [ + "12026" + ] + }, + { + "configParams": [ + { + "Min": 150, + "Max": 160, + "TriggerRate": 118 + }, + { + "Min": 161, + "Max": 170, + "TriggerRate": 110 + }, + { + "Min": 171, + "Max": 180, + "TriggerRate": 104 + }, + { + "Min": 181, + "Max": 190, + "TriggerRate": 98 + }, + { + "Min": 191, + "Max": 200, + "TriggerRate": 93 + }, + { + "Min": 201, + "Max": 210, + "TriggerRate": 88 + }, + { + "Min": 210, + "Max": 220, + "TriggerRate": 83 + }, + { + "Min": 221, + "Max": 230, + "TriggerRate": 79 + } + ], + "FishNumber": [ + "12024" + ] + }, + { + "configParams": [ + { + "Min": 320, + "Max": 420, + "TriggerRate": 100 + }, + { + "Min": 421, + "Max": 520, + "TriggerRate": 81 + }, + { + "Min": 521, + "Max": 620, + "TriggerRate": 67 + }, + { + "Min": 621, + "Max": 720, + "TriggerRate": 57 + }, + { + "Min": 721, + "Max": 820, + "TriggerRate": 50 + }, + { + "Min": 821, + "Max": 920, + "TriggerRate": 43 + } + ], + "FishNumber": [ + "12027" + ] + }, + { + "configParams": [ + { + "Min": 1, + "Max": 1, + "TriggerRate": 600 + }, + { + "Min": 2, + "Max": 2, + "TriggerRate": 300 + }, + { + "Min": 3, + "Max": 3, + "TriggerRate": 200 + }, + { + "Min": 4, + "Max": 4, + "TriggerRate": 150 + }, + { + "Min": 5, + "Max": 5, + "TriggerRate": 120 + }, + { + "Min": 6, + "Max": 6, + "TriggerRate": 100 + } + ], + "FishNumber": [ + "12033" + ] + }, + { + "configParams": [ + { + "Min": 500, + "Max": 580, + "TriggerRate": 30 + }, + { + "Min": 581, + "Max": 660, + "TriggerRate": 27 + }, + { + "Min": 661, + "Max": 720, + "TriggerRate": 24 + }, + { + "Min": 721, + "Max": 800, + "TriggerRate": 21 + }, + { + "Min": 801, + "Max": 880, + "TriggerRate": 18 + }, + { + "Min": 881, + "Max": 960, + "TriggerRate": 15 + }, + { + "Min": 961, + "Max": 1000, + "TriggerRate": 12 + } + ], + "FishNumber": [ + "11025" + ] + }, + { + "configParams": [ + { + "Min": 1, + "Max": 1, + "TriggerRate": 250 + }, + { + "Min": 2, + "Max": 2, + "TriggerRate": 125 + }, + { + "Min": 3, + "Max": 3, + "TriggerRate": 83 + }, + { + "Min": 4, + "Max": 4, + "TriggerRate": 62 + }, + { + "Min": 5, + "Max": 5, + "TriggerRate": 50 + }, + { + "Min": 6, + "Max": 6, + "TriggerRate": 41 + }, + { + "Min": 7, + "Max": 7, + "TriggerRate": 35 + }, + { + "Min": 8, + "Max": 8, + "TriggerRate": 31 + } + ], + "FishNumber": [ + "11041" + ] + }, + { + "configParams": [ + { + "Min": 300, + "Max": 310, + "TriggerRate": 50 + }, + { + "Min": 311, + "Max": 320, + "TriggerRate": 46 + }, + { + "Min": 321, + "Max": 330, + "TriggerRate": 42 + }, + { + "Min": 331, + "Max": 340, + "TriggerRate": 38 + }, + { + "Min": 341, + "Max": 350, + "TriggerRate": 34 + }, + { + "Min": 351, + "Max": 360, + "TriggerRate": 30 + }, + { + "Min": 361, + "Max": 370, + "TriggerRate": 26 + }, + { + "Min": 371, + "Max": 380, + "TriggerRate": 22 + }, + { + "Min": 0, + "Max": 0, + "TriggerRate": 0 + }, + { + "Min": 0, + "Max": 0, + "TriggerRate": 0 + } + ], + "FishNumber": [ + "11034" + ] + }, + { + "configParams": [ + { + "Min": 800, + "Max": 850, + "TriggerRate": 29 + }, + { + "Min": 851, + "Max": 900, + "TriggerRate": 27 + }, + { + "Min": 901, + "Max": 950, + "TriggerRate": 25 + }, + { + "Min": 951, + "Max": 1000, + "TriggerRate": 23 + }, + { + "Min": 1001, + "Max": 1050, + "TriggerRate": 21 + }, + { + "Min": 1051, + "Max": 1100, + "TriggerRate": 19 + }, + { + "Min": 1101, + "Max": 1150, + "TriggerRate": 17 + }, + { + "Min": 1151, + "Max": 1200, + "TriggerRate": 15 + }, + { + "Min": 0, + "Max": 0, + "TriggerRate": 0 + }, + { + "Min": 0, + "Max": 0, + "TriggerRate": 0 + } + ], + "FishNumber": [ + "11035" + ] + }, + { + "configParams": [ + { + "Min": 300, + "Max": 320, + "TriggerRate": 62 + }, + { + "Min": 321, + "Max": 340, + "TriggerRate": 58 + }, + { + "Min": 341, + "Max": 360, + "TriggerRate": 54 + }, + { + "Min": 361, + "Max": 380, + "TriggerRate": 50 + }, + { + "Min": 381, + "Max": 400, + "TriggerRate": 46 + }, + { + "Min": 401, + "Max": 420, + "TriggerRate": 42 + }, + { + "Min": 421, + "Max": 440, + "TriggerRate": 38 + }, + { + "Min": 441, + "Max": 460, + "TriggerRate": 34 + }, + { + "Min": 461, + "Max": 480, + "TriggerRate": 30 + }, + { + "Min": 481, + "Max": 500, + "TriggerRate": 26 + } + ], + "FishNumber": [ + "11036" + ] + }, + { + "configParams": [ + { + "Min": 300, + "Max": 310, + "TriggerRate": 50 + }, + { + "Min": 311, + "Max": 320, + "TriggerRate": 46 + }, + { + "Min": 321, + "Max": 330, + "TriggerRate": 42 + }, + { + "Min": 331, + "Max": 340, + "TriggerRate": 38 + }, + { + "Min": 341, + "Max": 350, + "TriggerRate": 34 + }, + { + "Min": 351, + "Max": 360, + "TriggerRate": 30 + }, + { + "Min": 361, + "Max": 370, + "TriggerRate": 26 + }, + { + "Min": 371, + "Max": 380, + "TriggerRate": 22 + }, + { + "Min": 0, + "Max": 0, + "TriggerRate": 0 + }, + { + "Min": 0, + "Max": 0, + "TriggerRate": 0 + } + ], + "FishNumber": [ + "11037" + ] + }, + { + "configParams": [ + { + "Min": 300, + "Max": 310, + "TriggerRate": 50 + }, + { + "Min": 311, + "Max": 320, + "TriggerRate": 46 + }, + { + "Min": 321, + "Max": 330, + "TriggerRate": 42 + }, + { + "Min": 331, + "Max": 340, + "TriggerRate": 38 + }, + { + "Min": 341, + "Max": 350, + "TriggerRate": 34 + }, + { + "Min": 351, + "Max": 360, + "TriggerRate": 30 + }, + { + "Min": 361, + "Max": 370, + "TriggerRate": 26 + }, + { + "Min": 371, + "Max": 380, + "TriggerRate": 22 + }, + { + "Min": 0, + "Max": 0, + "TriggerRate": 0 + }, + { + "Min": 0, + "Max": 0, + "TriggerRate": 0 + } + ], + "FishNumber": [ + "11042" + ] + }, + { + "configParams": [ + { + "Min": 1, + "Max": 1, + "TriggerRate": 250 + }, + { + "Min": 2, + "Max": 2, + "TriggerRate": 125 + }, + { + "Min": 3, + "Max": 3, + "TriggerRate": 83 + }, + { + "Min": 4, + "Max": 4, + "TriggerRate": 62 + }, + { + "Min": 5, + "Max": 5, + "TriggerRate": 50 + }, + { + "Min": 6, + "Max": 6, + "TriggerRate": 41 + }, + { + "Min": 7, + "Max": 7, + "TriggerRate": 35 + }, + { + "Min": 8, + "Max": 8, + "TriggerRate": 31 + } + ], + "FishNumber": [ + "11043" + ] + }, + { + "configParams": [ + { + "Min": 260, + "Max": 270, + "TriggerRate": 60 + }, + { + "Min": 271, + "Max": 280, + "TriggerRate": 57 + }, + { + "Min": 281, + "Max": 290, + "TriggerRate": 54 + }, + { + "Min": 291, + "Max": 300, + "TriggerRate": 51 + }, + { + "Min": 301, + "Max": 310, + "TriggerRate": 48 + }, + { + "Min": 311, + "Max": 320, + "TriggerRate": 45 + }, + { + "Min": 321, + "Max": 330, + "TriggerRate": 42 + }, + { + "Min": 331, + "Max": 340, + "TriggerRate": 39 + }, + { + "Min": 341, + "Max": 350, + "TriggerRate": 36 + }, + { + "Min": 351, + "Max": 360, + "TriggerRate": 33 + } + ], + "FishNumber": [ + "11023" + ] + }, + { + "configParams": [ + { + "Min": 300, + "Max": 320, + "TriggerRate": 62 + }, + { + "Min": 321, + "Max": 340, + "TriggerRate": 58 + }, + { + "Min": 341, + "Max": 360, + "TriggerRate": 54 + }, + { + "Min": 361, + "Max": 380, + "TriggerRate": 50 + }, + { + "Min": 381, + "Max": 400, + "TriggerRate": 46 + }, + { + "Min": 401, + "Max": 420, + "TriggerRate": 42 + }, + { + "Min": 421, + "Max": 440, + "TriggerRate": 38 + }, + { + "Min": 441, + "Max": 460, + "TriggerRate": 34 + }, + { + "Min": 461, + "Max": 480, + "TriggerRate": 30 + }, + { + "Min": 481, + "Max": 500, + "TriggerRate": 26 + } + ], + "FishNumber": [ + "11024" + ] + }, + { + "configParams": [ + { + "Min": 600, + "Max": 660, + "TriggerRate": 36 + }, + { + "Min": 661, + "Max": 720, + "TriggerRate": 33 + }, + { + "Min": 721, + "Max": 780, + "TriggerRate": 30 + }, + { + "Min": 781, + "Max": 860, + "TriggerRate": 27 + }, + { + "Min": 861, + "Max": 960, + "TriggerRate": 24 + }, + { + "Min": 961, + "Max": 1060, + "TriggerRate": 21 + }, + { + "Min": 1061, + "Max": 1080, + "TriggerRate": 18 + }, + { + "Min": 1081, + "Max": 1160, + "TriggerRate": 15 + }, + { + "Min": 1161, + "Max": 1200, + "TriggerRate": 12 + } + ], + "FishNumber": [ + "11026" + ] + }, + { + "configParams": [ + { + "Min": 300, + "Max": 320, + "TriggerRate": 62 + }, + { + "Min": 321, + "Max": 340, + "TriggerRate": 58 + }, + { + "Min": 341, + "Max": 360, + "TriggerRate": 54 + }, + { + "Min": 361, + "Max": 380, + "TriggerRate": 50 + }, + { + "Min": 381, + "Max": 400, + "TriggerRate": 46 + }, + { + "Min": 401, + "Max": 420, + "TriggerRate": 42 + }, + { + "Min": 421, + "Max": 440, + "TriggerRate": 38 + }, + { + "Min": 441, + "Max": 460, + "TriggerRate": 34 + }, + { + "Min": 461, + "Max": 480, + "TriggerRate": 30 + }, + { + "Min": 481, + "Max": 500, + "TriggerRate": 26 + } + ], + "FishNumber": [ + "11027" + ] + }, + { + "configParams": [ + { + "Min": 260, + "Max": 270, + "TriggerRate": 60 + }, + { + "Min": 271, + "Max": 280, + "TriggerRate": 57 + }, + { + "Min": 281, + "Max": 290, + "TriggerRate": 54 + }, + { + "Min": 291, + "Max": 300, + "TriggerRate": 51 + }, + { + "Min": 301, + "Max": 310, + "TriggerRate": 48 + }, + { + "Min": 311, + "Max": 320, + "TriggerRate": 45 + }, + { + "Min": 321, + "Max": 330, + "TriggerRate": 42 + }, + { + "Min": 331, + "Max": 340, + "TriggerRate": 39 + }, + { + "Min": 341, + "Max": 350, + "TriggerRate": 36 + }, + { + "Min": 351, + "Max": 360, + "TriggerRate": 33 + } + ], + "FishNumber": [ + "11029" + ] + }, + { + "configParams": [ + { + "Min": 500, + "Max": 580, + "TriggerRate": 36 + }, + { + "Min": 581, + "Max": 660, + "TriggerRate": 33 + }, + { + "Min": 661, + "Max": 720, + "TriggerRate": 30 + }, + { + "Min": 721, + "Max": 800, + "TriggerRate": 27 + }, + { + "Min": 801, + "Max": 880, + "TriggerRate": 24 + }, + { + "Min": 881, + "Max": 960, + "TriggerRate": 21 + }, + { + "Min": 961, + "Max": 1080, + "TriggerRate": 18 + }, + { + "Min": 1081, + "Max": 1160, + "TriggerRate": 15 + }, + { + "Min": 1161, + "Max": 1200, + "TriggerRate": 12 + } + ], + "FishNumber": [ + "11031" + ] + }, + { + "configParams": [ + { + "Min": 260, + "Max": 270, + "TriggerRate": 60 + }, + { + "Min": 271, + "Max": 280, + "TriggerRate": 57 + }, + { + "Min": 281, + "Max": 290, + "TriggerRate": 54 + }, + { + "Min": 291, + "Max": 300, + "TriggerRate": 51 + }, + { + "Min": 301, + "Max": 310, + "TriggerRate": 48 + }, + { + "Min": 311, + "Max": 320, + "TriggerRate": 45 + }, + { + "Min": 321, + "Max": 330, + "TriggerRate": 42 + }, + { + "Min": 331, + "Max": 340, + "TriggerRate": 39 + }, + { + "Min": 341, + "Max": 350, + "TriggerRate": 36 + }, + { + "Min": 351, + "Max": 360, + "TriggerRate": 33 + } + ], + "FishNumber": [ + "11032" + ] + }, + { + "configParams": [ + { + "Min": 260, + "Max": 270, + "TriggerRate": 60 + }, + { + "Min": 271, + "Max": 280, + "TriggerRate": 57 + }, + { + "Min": 281, + "Max": 290, + "TriggerRate": 54 + }, + { + "Min": 291, + "Max": 300, + "TriggerRate": 51 + }, + { + "Min": 301, + "Max": 310, + "TriggerRate": 48 + }, + { + "Min": 311, + "Max": 320, + "TriggerRate": 45 + }, + { + "Min": 321, + "Max": 330, + "TriggerRate": 42 + }, + { + "Min": 331, + "Max": 340, + "TriggerRate": 39 + }, + { + "Min": 341, + "Max": 350, + "TriggerRate": 36 + }, + { + "Min": 351, + "Max": 360, + "TriggerRate": 33 + } + ], + "FishNumber": [ + "11033" + ] + }, + { + "configParams": [ + { + "Min": 150, + "Max": 160, + "TriggerRate": 200 + }, + { + "Min": 161, + "Max": 170, + "TriggerRate": 185 + }, + { + "Min": 171, + "Max": 180, + "TriggerRate": 170 + }, + { + "Min": 181, + "Max": 190, + "TriggerRate": 160 + }, + { + "Min": 191, + "Max": 200, + "TriggerRate": 150 + }, + { + "Min": 201, + "Max": 210, + "TriggerRate": 140 + }, + { + "Min": 210, + "Max": 220, + "TriggerRate": 130 + }, + { + "Min": 221, + "Max": 230, + "TriggerRate": 120 + } + ], + "FishNumber": [ + "15090" + ] + }, + { + "configParams": [ + { + "Min": 160, + "Max": 170, + "TriggerRate": 115 + }, + { + "Min": 171, + "Max": 180, + "TriggerRate": 108 + }, + { + "Min": 181, + "Max": 190, + "TriggerRate": 102 + }, + { + "Min": 191, + "Max": 200, + "TriggerRate": 95 + }, + { + "Min": 201, + "Max": 210, + "TriggerRate": 89 + }, + { + "Min": 211, + "Max": 220, + "TriggerRate": 83 + }, + { + "Min": 221, + "Max": 230, + "TriggerRate": 78 + }, + { + "Min": 231, + "Max": 240, + "TriggerRate": 74 + } + ], + "FishNumber": [ + "15091" + ] + }, + { + "configParams": [ + { + "Min": 181, + "Max": 190, + "TriggerRate": 105 + }, + { + "Min": 191, + "Max": 200, + "TriggerRate": 100 + }, + { + "Min": 201, + "Max": 210, + "TriggerRate": 95 + }, + { + "Min": 211, + "Max": 220, + "TriggerRate": 91 + }, + { + "Min": 221, + "Max": 230, + "TriggerRate": 87 + }, + { + "Min": 231, + "Max": 240, + "TriggerRate": 83 + }, + { + "Min": 241, + "Max": 250, + "TriggerRate": 80 + }, + { + "Min": 251, + "Max": 260, + "TriggerRate": 77 + }, + { + "Min": 261, + "Max": 270, + "TriggerRate": 74 + }, + { + "Min": 271, + "Max": 280, + "TriggerRate": 71 + } + ], + "FishNumber": [ + "15092" + ] + }, + { + "configParams": [ + { + "Min": 191, + "Max": 200, + "TriggerRate": 108 + }, + { + "Min": 201, + "Max": 210, + "TriggerRate": 103 + }, + { + "Min": 211, + "Max": 220, + "TriggerRate": 98 + }, + { + "Min": 221, + "Max": 230, + "TriggerRate": 94 + }, + { + "Min": 231, + "Max": 240, + "TriggerRate": 90 + }, + { + "Min": 251, + "Max": 260, + "TriggerRate": 83 + }, + { + "Min": 261, + "Max": 270, + "TriggerRate": 80 + }, + { + "Min": 271, + "Max": 280, + "TriggerRate": 77 + }, + { + "Min": 281, + "Max": 290, + "TriggerRate": 75 + }, + { + "Min": 291, + "Max": 300, + "TriggerRate": 72 + } + ], + "FishNumber": [ + "15093" + ] + }, + { + "configParams": [ + { + "Min": 250, + "Max": 270, + "TriggerRate": 111 + }, + { + "Min": 271, + "Max": 290, + "TriggerRate": 103 + }, + { + "Min": 291, + "Max": 310, + "TriggerRate": 96 + }, + { + "Min": 311, + "Max": 330, + "TriggerRate": 90 + }, + { + "Min": 331, + "Max": 350, + "TriggerRate": 89 + }, + { + "Min": 351, + "Max": 360, + "TriggerRate": 86 + }, + { + "Min": 361, + "Max": 380, + "TriggerRate": 81 + }, + { + "Min": 381, + "Max": 400, + "TriggerRate": 77 + } + ], + "FishNumber": [ + "15094" + ] + }, + { + "configParams": [ + { + "Min": 280, + "Max": 380, + "TriggerRate": 100 + }, + { + "Min": 380, + "Max": 480, + "TriggerRate": 80 + }, + { + "Min": 480, + "Max": 580, + "TriggerRate": 67 + }, + { + "Min": 580, + "Max": 680, + "TriggerRate": 57 + }, + { + "Min": 680, + "Max": 780, + "TriggerRate": 50 + }, + { + "Min": 780, + "Max": 880, + "TriggerRate": 43 + } + ], + "FishNumber": [ + "15095" + ] + }, + { + "configParams": [ + { + "Min": 320, + "Max": 420, + "TriggerRate": 100 + }, + { + "Min": 421, + "Max": 520, + "TriggerRate": 81 + }, + { + "Min": 521, + "Max": 620, + "TriggerRate": 67 + }, + { + "Min": 621, + "Max": 720, + "TriggerRate": 57 + }, + { + "Min": 721, + "Max": 820, + "TriggerRate": 50 + }, + { + "Min": 821, + "Max": 920, + "TriggerRate": 43 + } + ], + "FishNumber": [ + "15096" + ] + }, + { + "configParams": [ + { + "Min": 360, + "Max": 400, + "TriggerRate": 100 + }, + { + "Min": 401, + "Max": 460, + "TriggerRate": 87 + }, + { + "Min": 461, + "Max": 500, + "TriggerRate": 77 + }, + { + "Min": 501, + "Max": 560, + "TriggerRate": 69 + }, + { + "Min": 601, + "Max": 660, + "TriggerRate": 61 + }, + { + "Min": 661, + "Max": 700, + "TriggerRate": 56 + }, + { + "Min": 701, + "Max": 760, + "TriggerRate": 52 + }, + { + "Min": 761, + "Max": 800, + "TriggerRate": 48 + }, + { + "Min": 801, + "Max": 900, + "TriggerRate": 44 + }, + { + "Min": 901, + "Max": 980, + "TriggerRate": 41 + } + ], + "FishNumber": [ + "15097" + ] + }, + { + "configParams": [ + { + "Min": 360, + "Max": 400, + "TriggerRate": 100 + }, + { + "Min": 401, + "Max": 460, + "TriggerRate": 87 + }, + { + "Min": 461, + "Max": 500, + "TriggerRate": 77 + }, + { + "Min": 501, + "Max": 560, + "TriggerRate": 69 + }, + { + "Min": 601, + "Max": 660, + "TriggerRate": 61 + }, + { + "Min": 661, + "Max": 700, + "TriggerRate": 56 + }, + { + "Min": 701, + "Max": 760, + "TriggerRate": 52 + }, + { + "Min": 761, + "Max": 800, + "TriggerRate": 48 + }, + { + "Min": 801, + "Max": 900, + "TriggerRate": 44 + }, + { + "Min": 901, + "Max": 980, + "TriggerRate": 41 + } + ], + "FishNumber": [ + "15098" + ] + }, + { + "configParams": [ + { + "Min": 380, + "Max": 480, + "TriggerRate": 100 + }, + { + "Min": 481, + "Max": 580, + "TriggerRate": 83 + }, + { + "Min": 581, + "Max": 680, + "TriggerRate": 69 + }, + { + "Min": 681, + "Max": 780, + "TriggerRate": 58 + }, + { + "Min": 781, + "Max": 880, + "TriggerRate": 51 + }, + { + "Min": 881, + "Max": 980, + "TriggerRate": 45 + }, + { + "Min": 981, + "Max": 1080, + "TriggerRate": 41 + } + ], + "FishNumber": [ + "15099" + ] + }, + { + "configParams": [ + { + "Min": 1, + "Max": 1, + "TriggerRate": 500 + }, + { + "Min": 2, + "Max": 2, + "TriggerRate": 250 + }, + { + "Min": 3, + "Max": 3, + "TriggerRate": 167 + }, + { + "Min": 4, + "Max": 4, + "TriggerRate": 125 + }, + { + "Min": 5, + "Max": 5, + "TriggerRate": 100 + }, + { + "Min": 6, + "Max": 6, + "TriggerRate": 83 + } + ], + "FishNumber": [ + "13040" + ] + }, + { + "configParams": [ + { + "Min": 1, + "Max": 1, + "TriggerRate": 500 + }, + { + "Min": 2, + "Max": 2, + "TriggerRate": 250 + }, + { + "Min": 3, + "Max": 3, + "TriggerRate": 167 + }, + { + "Min": 4, + "Max": 4, + "TriggerRate": 125 + }, + { + "Min": 5, + "Max": 5, + "TriggerRate": 100 + }, + { + "Min": 6, + "Max": 6, + "TriggerRate": 83 + } + ], + "FishNumber": [ + "11039" + ] + }, + { + "configParams": [ + { + "Min": 1, + "Max": 1, + "TriggerRate": 375 + }, + { + "Min": 2, + "Max": 2, + "TriggerRate": 188 + }, + { + "Min": 3, + "Max": 3, + "TriggerRate": 125 + }, + { + "Min": 4, + "Max": 4, + "TriggerRate": 94 + }, + { + "Min": 5, + "Max": 5, + "TriggerRate": 75 + }, + { + "Min": 6, + "Max": 6, + "TriggerRate": 62 + }, + { + "Min": 7, + "Max": 7, + "TriggerRate": 54 + }, + { + "Min": 8, + "Max": 8, + "TriggerRate": 47 + }, + { + "Min": 0, + "Max": 0, + "TriggerRate": 0 + } + ], + "FishNumber": [ + "11040" + ] + } + ], + "LuckDragon": [ + { + "OuterConfig": [ + { + "Min": 300, + "Max": 300, + "TriggerRate": 1 + }, + { + "Min": 350, + "Max": 350, + "TriggerRate": 1 + }, + { + "Min": 500, + "Max": 500, + "TriggerRate": 1 + }, + { + "Min": 550, + "Max": 550, + "TriggerRate": 1 + }, + { + "Min": 600, + "Max": 600, + "TriggerRate": 1 + }, + { + "Min": 650, + "Max": 650, + "TriggerRate": 1 + }, + { + "Min": 700, + "Max": 700, + "TriggerRate": 1 + }, + { + "Min": -1, + "Max": -1, + "TriggerRate": 2271 + } + ], + "MiddleConfig": [ + { + "Min": 300, + "Max": 300, + "TriggerRate": 1 + }, + { + "Min": 500, + "Max": 500, + "TriggerRate": 1 + }, + { + "Min": 600, + "Max": 600, + "TriggerRate": 1 + }, + { + "Min": 800, + "Max": 800, + "TriggerRate": 1 + }, + { + "Min": 1000, + "Max": 1000, + "TriggerRate": 1 + }, + { + "Min": -1, + "Max": -1, + "TriggerRate": 0 + } + ], + "InnerConfig": [ + { + "Min": 10000, + "Max": 10000, + "TriggerRate": 1 + }, + { + "Min": 20000, + "Max": 20000, + "TriggerRate": 1 + }, + { + "Min": -1, + "Max": -1, + "TriggerRate": 0 + } + ], + "FishNumber": [ + "11028" + ] + } + ] + }, + "ChessConfig": { + "CreateRoomLimit": [ + 1, + 2 + ], + "MinBetGold": 350000, + "BetGoldLimits": [ + 350000, + 700000, + 1750000, + 3500000, + 17500000, + 35000000 + ], + "CreateRoomVipLevels": [ + 10 + ] + }, + "FishRoomConfig": { + "SeatSelectLimit": [ + 1, + 2 + ], + "SeatSelectVipLevels": [] + }, + "BossDropConfig": { + "NoDropWeight": 5000, + "DropItems": [] + }, + "RobotKillConfig": { + "IsEnabled": true, + "IntervalSeconds": 5, + "Scenes": [ + { + "GameName": "风雷之渊", + "LevelName": "初级场", + "GameType": 1, + "RoomLevel": 1, + "Weight": 1, + "FishName": "电鳗", + "FishNumber": "11023", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "初级场", + "GameType": 1, + "RoomLevel": 1, + "Weight": 1, + "FishName": "吞噬鲲", + "FishNumber": "11024", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "初级场", + "GameType": 1, + "RoomLevel": 1, + "Weight": 1, + "FishName": "玲珑宝塔", + "FishNumber": "11025", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "初级场", + "GameType": 1, + "RoomLevel": 1, + "Weight": 1, + "FishName": "聚宝盆", + "FishNumber": "11026", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "初级场", + "GameType": 1, + "RoomLevel": 1, + "Weight": 1, + "FishName": "金龙", + "FishNumber": "11027", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "中级场", + "GameType": 1, + "RoomLevel": 2, + "Weight": 1, + "FishName": "电鳗", + "FishNumber": "11023", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "中级场", + "GameType": 1, + "RoomLevel": 2, + "Weight": 1, + "FishName": "吞噬鲲", + "FishNumber": "11024", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "中级场", + "GameType": 1, + "RoomLevel": 2, + "Weight": 1, + "FishName": "玲珑宝塔", + "FishNumber": "11025", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "中级场", + "GameType": 1, + "RoomLevel": 2, + "Weight": 1, + "FishName": "聚宝盆", + "FishNumber": "11026", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "中级场", + "GameType": 1, + "RoomLevel": 2, + "Weight": 1, + "FishName": "金龙", + "FishNumber": "11027", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "中级场", + "GameType": 1, + "RoomLevel": 2, + "Weight": 1, + "FishName": "神龙转盘", + "FishNumber": "11028", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "中级场", + "GameType": 1, + "RoomLevel": 2, + "Weight": 1, + "FishName": "炸弹蟹", + "FishNumber": "11029", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "中级场", + "GameType": 1, + "RoomLevel": 2, + "Weight": 1, + "FishName": "蚌精", + "FishNumber": "11030", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "中级场", + "GameType": 1, + "RoomLevel": 2, + "Weight": 1, + "FishName": "蟠桃树", + "FishNumber": "11031", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "中级场", + "GameType": 1, + "RoomLevel": 2, + "Weight": 1, + "FishName": "激光蟹", + "FishNumber": "11032", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "中级场", + "GameType": 1, + "RoomLevel": 2, + "Weight": 1, + "FishName": "钻头蟹", + "FishNumber": "11033", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "中级场", + "GameType": 1, + "RoomLevel": 2, + "Weight": 1, + "FishName": "魔法南瓜", + "FishNumber": "11034", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "中级场", + "GameType": 1, + "RoomLevel": 2, + "Weight": 1, + "FishName": "欢乐小丑", + "FishNumber": "11035", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "高级场", + "GameType": 1, + "RoomLevel": 3, + "Weight": 1, + "FishName": "电鳗", + "FishNumber": "11023", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "高级场", + "GameType": 1, + "RoomLevel": 3, + "Weight": 1, + "FishName": "吞噬鲲", + "FishNumber": "11024", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "高级场", + "GameType": 1, + "RoomLevel": 3, + "Weight": 1, + "FishName": "玲珑宝塔", + "FishNumber": "11025", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "高级场", + "GameType": 1, + "RoomLevel": 3, + "Weight": 1, + "FishName": "聚宝盆", + "FishNumber": "11026", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "高级场", + "GameType": 1, + "RoomLevel": 3, + "Weight": 1, + "FishName": "金龙", + "FishNumber": "11027", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "高级场", + "GameType": 1, + "RoomLevel": 3, + "Weight": 1, + "FishName": "神龙转盘", + "FishNumber": "11028", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "高级场", + "GameType": 1, + "RoomLevel": 3, + "Weight": 1, + "FishName": "炸弹蟹", + "FishNumber": "11029", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "高级场", + "GameType": 1, + "RoomLevel": 3, + "Weight": 1, + "FishName": "蚌精", + "FishNumber": "11030", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "高级场", + "GameType": 1, + "RoomLevel": 3, + "Weight": 1, + "FishName": "蟠桃树", + "FishNumber": "11031", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "高级场", + "GameType": 1, + "RoomLevel": 3, + "Weight": 1, + "FishName": "激光蟹", + "FishNumber": "11032", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "高级场", + "GameType": 1, + "RoomLevel": 3, + "Weight": 1, + "FishName": "钻头蟹", + "FishNumber": "11033", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "高级场", + "GameType": 1, + "RoomLevel": 3, + "Weight": 1, + "FishName": "魔法南瓜", + "FishNumber": "11034", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "高级场", + "GameType": 1, + "RoomLevel": 3, + "Weight": 1, + "FishName": "欢乐小丑", + "FishNumber": "11035", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "高级场", + "GameType": 1, + "RoomLevel": 3, + "Weight": 1, + "FishName": "熔岩螃蟹", + "FishNumber": "11036", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "高级场", + "GameType": 1, + "RoomLevel": 3, + "Weight": 1, + "FishName": "熔岩蝎", + "FishNumber": "11037", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "高级场", + "GameType": 1, + "RoomLevel": 3, + "Weight": 1, + "FishName": "禄存星君", + "FishNumber": "11038", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "高级场", + "GameType": 1, + "RoomLevel": 3, + "Weight": 1, + "FishName": "苍穹之主", + "FishNumber": "11039", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "风雷之渊", + "LevelName": "高级场", + "GameType": 1, + "RoomLevel": 3, + "Weight": 1, + "FishName": "雷霆之主", + "FishNumber": "11040", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "初级场", + "GameType": 5, + "RoomLevel": 1, + "Weight": 1, + "FishName": "大龙虾", + "FishNumber": "13024", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "初级场", + "GameType": 5, + "RoomLevel": 1, + "Weight": 1, + "FishName": "闪电鱼", + "FishNumber": "13025", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "初级场", + "GameType": 5, + "RoomLevel": 1, + "Weight": 1, + "FishName": "连环导弹", + "FishNumber": "13026", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "初级场", + "GameType": 5, + "RoomLevel": 1, + "Weight": 1, + "FishName": "九龙玉玺", + "FishNumber": "13027", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "初级场", + "GameType": 5, + "RoomLevel": 1, + "Weight": 1, + "FishName": "沙僧", + "FishNumber": "13028", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "初级场", + "GameType": 5, + "RoomLevel": 1, + "Weight": 1, + "FishName": "白骨精", + "FishNumber": "13029", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "初级场", + "GameType": 5, + "RoomLevel": 1, + "Weight": 1, + "FishName": "小白龙", + "FishNumber": "13030", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "初级场", + "GameType": 5, + "RoomLevel": 1, + "Weight": 1, + "FishName": "嫦娥", + "FishNumber": "13031", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "初级场", + "GameType": 5, + "RoomLevel": 1, + "Weight": 1, + "FishName": "猪八戒", + "FishNumber": "13035", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "中级场", + "GameType": 5, + "RoomLevel": 2, + "Weight": 1, + "FishName": "大龙虾", + "FishNumber": "13024", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "中级场", + "GameType": 5, + "RoomLevel": 2, + "Weight": 1, + "FishName": "闪电鱼", + "FishNumber": "13025", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "中级场", + "GameType": 5, + "RoomLevel": 2, + "Weight": 1, + "FishName": "连环导弹", + "FishNumber": "13026", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "中级场", + "GameType": 5, + "RoomLevel": 2, + "Weight": 1, + "FishName": "九龙玉玺", + "FishNumber": "13027", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "中级场", + "GameType": 5, + "RoomLevel": 2, + "Weight": 1, + "FishName": "沙僧", + "FishNumber": "13028", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "中级场", + "GameType": 5, + "RoomLevel": 2, + "Weight": 1, + "FishName": "白骨精", + "FishNumber": "13029", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "中级场", + "GameType": 5, + "RoomLevel": 2, + "Weight": 1, + "FishName": "小白龙", + "FishNumber": "13030", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "中级场", + "GameType": 5, + "RoomLevel": 2, + "Weight": 1, + "FishName": "嫦娥", + "FishNumber": "13031", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "中级场", + "GameType": 5, + "RoomLevel": 2, + "Weight": 1, + "FishName": "孙悟空", + "FishNumber": "13032", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "中级场", + "GameType": 5, + "RoomLevel": 2, + "Weight": 1, + "FishName": "铁扇公主", + "FishNumber": "13033", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "中级场", + "GameType": 5, + "RoomLevel": 2, + "Weight": 1, + "FishName": "猪八戒", + "FishNumber": "13035", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "中级场", + "GameType": 5, + "RoomLevel": 2, + "Weight": 1, + "FishName": "烈焰巨龙", + "FishNumber": "13036", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "中级场", + "GameType": 5, + "RoomLevel": 2, + "Weight": 1, + "FishName": "宝船居蟹", + "FishNumber": "13037", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "高级场", + "GameType": 5, + "RoomLevel": 3, + "Weight": 1, + "FishName": "大龙虾", + "FishNumber": "13024", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "高级场", + "GameType": 5, + "RoomLevel": 3, + "Weight": 1, + "FishName": "闪电鱼", + "FishNumber": "13025", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "高级场", + "GameType": 5, + "RoomLevel": 3, + "Weight": 1, + "FishName": "连环导弹", + "FishNumber": "13026", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "高级场", + "GameType": 5, + "RoomLevel": 3, + "Weight": 1, + "FishName": "九龙玉玺", + "FishNumber": "13027", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "高级场", + "GameType": 5, + "RoomLevel": 3, + "Weight": 1, + "FishName": "沙僧", + "FishNumber": "13028", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "高级场", + "GameType": 5, + "RoomLevel": 3, + "Weight": 1, + "FishName": "白骨精", + "FishNumber": "13029", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "高级场", + "GameType": 5, + "RoomLevel": 3, + "Weight": 1, + "FishName": "小白龙", + "FishNumber": "13030", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "高级场", + "GameType": 5, + "RoomLevel": 3, + "Weight": 1, + "FishName": "嫦娥", + "FishNumber": "13031", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "高级场", + "GameType": 5, + "RoomLevel": 3, + "Weight": 1, + "FishName": "孙悟空", + "FishNumber": "13032", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "高级场", + "GameType": 5, + "RoomLevel": 3, + "Weight": 1, + "FishName": "铁扇公主", + "FishNumber": "13033", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "高级场", + "GameType": 5, + "RoomLevel": 3, + "Weight": 1, + "FishName": "唐僧", + "FishNumber": "13034", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "高级场", + "GameType": 5, + "RoomLevel": 3, + "Weight": 1, + "FishName": "猪八戒", + "FishNumber": "13035", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "高级场", + "GameType": 5, + "RoomLevel": 3, + "Weight": 1, + "FishName": "烈焰巨龙", + "FishNumber": "13036", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "高级场", + "GameType": 5, + "RoomLevel": 3, + "Weight": 1, + "FishName": "宝船居蟹", + "FishNumber": "13037", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "高级场", + "GameType": 5, + "RoomLevel": 3, + "Weight": 1, + "FishName": "杨戬", + "FishNumber": "13038", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "黑神话悟空", + "LevelName": "高级场", + "GameType": 5, + "RoomLevel": 3, + "Weight": 1, + "FishName": "食神八戒", + "FishNumber": "13039", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "初级场", + "GameType": 4, + "RoomLevel": 1, + "Weight": 1, + "FishName": "幸运飞碟", + "FishNumber": "12022", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "初级场", + "GameType": 4, + "RoomLevel": 1, + "Weight": 1, + "FishName": "小丑扑克", + "FishNumber": "12023", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "初级场", + "GameType": 4, + "RoomLevel": 1, + "Weight": 1, + "FishName": "黑洞飞船", + "FishNumber": "12024", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "初级场", + "GameType": 4, + "RoomLevel": 1, + "Weight": 1, + "FishName": "弹药箱", + "FishNumber": "12025", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "初级场", + "GameType": 4, + "RoomLevel": 1, + "Weight": 1, + "FishName": "爆裂金鲨", + "FishNumber": "12026", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "中级场", + "GameType": 4, + "RoomLevel": 2, + "Weight": 1, + "FishName": "幸运飞碟", + "FishNumber": "12022", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "中级场", + "GameType": 4, + "RoomLevel": 2, + "Weight": 1, + "FishName": "小丑扑克", + "FishNumber": "12023", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "中级场", + "GameType": 4, + "RoomLevel": 2, + "Weight": 1, + "FishName": "黑洞飞船", + "FishNumber": "12024", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "中级场", + "GameType": 4, + "RoomLevel": 2, + "Weight": 1, + "FishName": "弹药箱", + "FishNumber": "12025", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "中级场", + "GameType": 4, + "RoomLevel": 2, + "Weight": 1, + "FishName": "爆裂金鲨", + "FishNumber": "12026", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "中级场", + "GameType": 4, + "RoomLevel": 2, + "Weight": 1, + "FishName": "女龙王", + "FishNumber": "12027", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "高级场", + "GameType": 4, + "RoomLevel": 3, + "Weight": 1, + "FishName": "幸运飞碟", + "FishNumber": "12022", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "高级场", + "GameType": 4, + "RoomLevel": 3, + "Weight": 1, + "FishName": "小丑扑克", + "FishNumber": "12023", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "高级场", + "GameType": 4, + "RoomLevel": 3, + "Weight": 1, + "FishName": "黑洞飞船", + "FishNumber": "12024", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "高级场", + "GameType": 4, + "RoomLevel": 3, + "Weight": 1, + "FishName": "弹药箱", + "FishNumber": "12025", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "高级场", + "GameType": 4, + "RoomLevel": 3, + "Weight": 1, + "FishName": "爆裂金鲨", + "FishNumber": "12026", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "高级场", + "GameType": 4, + "RoomLevel": 3, + "Weight": 1, + "FishName": "女龙王", + "FishNumber": "12027", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "高级场", + "GameType": 4, + "RoomLevel": 3, + "Weight": 1, + "FishName": "机械蝎", + "FishNumber": "12028", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "高级场", + "GameType": 4, + "RoomLevel": 3, + "Weight": 1, + "FishName": "星际巡航", + "FishNumber": "12029", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "高级场", + "GameType": 4, + "RoomLevel": 3, + "Weight": 1, + "FishName": "破坏球", + "FishNumber": "12030", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "高级场", + "GameType": 4, + "RoomLevel": 3, + "Weight": 1, + "FishName": "幸运轮", + "FishNumber": "12031", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "高级场", + "GameType": 4, + "RoomLevel": 3, + "Weight": 1, + "FishName": "超能魔盒", + "FishNumber": "12032", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "高级场", + "GameType": 4, + "RoomLevel": 3, + "Weight": 1, + "FishName": "机甲雷霆", + "FishNumber": "12033", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + }, + { + "GameName": "星际迷航", + "LevelName": "高级场", + "GameType": 4, + "RoomLevel": 3, + "Weight": 1, + "FishName": "烈焰风暴", + "FishNumber": "12034", + "MultiplierMin": 500, + "MultiplierMax": 2000, + "JackpotMin": 5000000, + "JackpotMax": 500000000 + } + ] + }, + "BotConfig": { + "Enabled": true, + "AiState": "active", + "LuckFactor": 1, + "StateRefreshInterval": 0, + "Skills": { + "SkillRefreshInterval": 10, + "LockProb": 0, + "LockMinTime": 5, + "LockMaxTime": 20, + "FrenzyProb": 0.3, + "FrenzyMinTime": 3, + "FrenzyMaxTime": 8, + "TripleProb": 0.5, + "TripleMinTime": 4, + "TripleMaxTime": 12, + "DoubleProb": 0, + "DoubleMinTime": 3, + "DoubleMaxTime": 6 + }, + "ActiveBehavior": { + "FireIntervalMin": 0.3, + "FireIntervalMax": 1.2, + "FireProb": 0.9, + "RotateSpeed": 80, + "TargetHoldTimeMin": 2, + "TargetHoldTimeMax": 5, + "TargetSwitchChance": 0.7, + "TargetPreferHighScore": 0, + "CanTargetBoss": true, + "CanTargetSpecial": true + }, + "IdleBehavior": { + "FireIntervalMin": 0.3, + "FireIntervalMax": 1.2, + "FireProb": 0.9, + "RotateSpeed": 80, + "TargetHoldTimeMin": 2, + "TargetHoldTimeMax": 5, + "TargetSwitchChance": 0.7, + "TargetPreferHighScore": 0, + "CanTargetBoss": true, + "CanTargetSpecial": true + }, + "AggressiveBehavior": { + "FireIntervalMin": 0.3, + "FireIntervalMax": 1.2, + "FireProb": 0.9, + "RotateSpeed": 80, + "TargetHoldTimeMin": 2, + "TargetHoldTimeMax": 5, + "TargetSwitchChance": 0.7, + "TargetPreferHighScore": 0, + "CanTargetBoss": true, + "CanTargetSpecial": true + }, + "Multiplier": { + "InitialLevelIndex": 0, + "DecreaseThreshold": 0.5, + "IncreaseThreshold": 1.5, + "Step": 1, + "CheckInterval": 3, + "MinLevelIndex": 0, + "MaxLevelIndex": -1 + }, + "BossStrategy": { + "BossFishTypes": [ + 2, + 5 + ], + "ScatterWhenNoBoss": true, + "TripleShotProb": 0.5, + "PreferMaxMultiplierBoss": true, + "ScatterModeThreshold": 3, + "FrenzyProb": 0.6, + "FrenzyMinTime": 3, + "FrenzyMaxTime": 8 + }, + "ExitCondition": { + "ExitWhenGoldAbove": 0, + "ExitWhenGoldBelow": 100, + "CheckInterval": 5, + "SendLeaveRoom": true, + "ShowWaitingAfterExit": true + } + }, + "Id": "8c2d565c7dad4fbb9f1b0e158153ee21", + "IsDelete": false, + "CreateInfo": null +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/Config/lottery-init.json b/AdminSrc/AdminHost/Config/lottery-init.json new file mode 100644 index 0000000..17889bc --- /dev/null +++ b/AdminSrc/AdminHost/Config/lottery-init.json @@ -0,0 +1,986 @@ +{ + "ActivityName": "炮台/战神/翅膀奖池", + "IsOpen": false, + "StartTime": 0, + "EndTime": 0, + "Pools": [ + { + "PoolType": 1, + "Level": "A", + "Count": 2, + "Weight": 1, + "PrizeList": [ + { + "PrizeId": "587001", + "Name": "剑气如虹", + "Icon": "", + "Type": 3, + "Count": 1, + "OtherId": "11028", + "Weight": 1, + "TotalCount": 0 + }, + { + "PrizeId": "587002", + "Name": "万圣通灵", + "Icon": "", + "Type": 3, + "Count": 1, + "OtherId": "11029", + "Weight": 2, + "TotalCount": 0 + } + ] + }, + { + "PoolType": 1, + "Level": "B", + "Count": 8, + "Weight": 10, + "PrizeList": [ + { + "PrizeId": "587101", + "Name": "狂暴卡", + "Icon": "http://47.109.132.12/uploads/40004.png?v=1784285974", + "Type": 3, + "Count": 60, + "OtherId": "40004", + "Weight": 10, + "TotalCount": 0 + }, + { + "PrizeId": "587102", + "Name": "狂暴卡", + "Icon": "http://47.109.132.12/uploads/40004.png?v=1784285974", + "Type": 3, + "Count": 60, + "OtherId": "40004", + "Weight": 10, + "TotalCount": 0 + }, + { + "PrizeId": "587103", + "Name": "金币", + "Icon": "", + "Type": 1, + "Count": 500000, + "OtherId": "", + "Weight": 10, + "TotalCount": 0 + }, + { + "PrizeId": "587104", + "Name": "金币", + "Icon": "", + "Type": 1, + "Count": 500000, + "OtherId": "", + "Weight": 10, + "TotalCount": 0 + }, + { + "PrizeId": "587105", + "Name": "钻石", + "Icon": "", + "Type": 2, + "Count": 50, + "OtherId": "", + "Weight": 10, + "TotalCount": 0 + }, + { + "PrizeId": "587106", + "Name": "钻石", + "Icon": "", + "Type": 2, + "Count": 50, + "OtherId": "", + "Weight": 10, + "TotalCount": 0 + }, + { + "PrizeId": "587107", + "Name": "冰冻卡", + "Icon": "http://47.109.132.12/uploads/40003.png?v=1784285984", + "Type": 3, + "Count": 50, + "OtherId": "40003", + "Weight": 10, + "TotalCount": 0 + }, + { + "PrizeId": "587108", + "Name": "冰冻卡", + "Icon": "http://47.109.132.12/uploads/40003.png?v=1784285984", + "Type": 3, + "Count": 50, + "OtherId": "40003", + "Weight": 10, + "TotalCount": 0 + } + ] + }, + { + "PoolType": 1, + "Level": "C", + "Count": 20, + "Weight": 20, + "PrizeList": [ + { + "PrizeId": "587201", + "Name": "狂暴卡", + "Icon": "http://47.109.132.12/uploads/40004.png?v=1784285974", + "Type": 3, + "Count": 10, + "OtherId": "40004", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "587202", + "Name": "狂暴卡", + "Icon": "http://47.109.132.12/uploads/40004.png?v=1784285974", + "Type": 3, + "Count": 10, + "OtherId": "40004", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "587203", + "Name": "狂暴卡", + "Icon": "http://47.109.132.12/uploads/40004.png?v=1784285974", + "Type": 3, + "Count": 10, + "OtherId": "40004", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "587204", + "Name": "狂暴卡", + "Icon": "http://47.109.132.12/uploads/40004.png?v=1784285974", + "Type": 3, + "Count": 10, + "OtherId": "40004", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "587205", + "Name": "钻石", + "Icon": "", + "Type": 2, + "Count": 5, + "OtherId": "", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "587206", + "Name": "钻石", + "Icon": "", + "Type": 2, + "Count": 5, + "OtherId": "", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "587207", + "Name": "钻石", + "Icon": "", + "Type": 2, + "Count": 15, + "OtherId": "", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "587208", + "Name": "钻石", + "Icon": "", + "Type": 2, + "Count": 15, + "OtherId": "", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "587209", + "Name": "召唤卡", + "Icon": "http://47.109.132.12/uploads/40006.png", + "Type": 3, + "Count": 3, + "OtherId": "40006", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "587210", + "Name": "召唤卡", + "Icon": "http://47.109.132.12/uploads/40006.png", + "Type": 3, + "Count": 3, + "OtherId": "40006", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "587211", + "Name": "冰冻卡", + "Icon": "http://47.109.132.12/uploads/40003.png?v=1784285984", + "Type": 3, + "Count": 3, + "OtherId": "40003", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "587212", + "Name": "冰冻卡", + "Icon": "http://47.109.132.12/uploads/40003.png?v=1784285984", + "Type": 3, + "Count": 3, + "OtherId": "40003", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "587213", + "Name": "金币", + "Icon": "", + "Type": 1, + "Count": 100000, + "OtherId": "", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "587214", + "Name": "金币", + "Icon": "", + "Type": 1, + "Count": 100000, + "OtherId": "", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "587215", + "Name": "金币", + "Icon": "", + "Type": 1, + "Count": 50000, + "OtherId": "", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "587216", + "Name": "金币", + "Icon": "", + "Type": 1, + "Count": 50000, + "OtherId": "", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "587217", + "Name": "冰冻卡", + "Icon": "http://47.109.132.12/uploads/40003.png?v=1784285984", + "Type": 3, + "Count": 3, + "OtherId": "40003", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "587218", + "Name": "冰冻卡", + "Icon": "http://47.109.132.12/uploads/40003.png?v=1784285984", + "Type": 3, + "Count": 3, + "OtherId": "40003", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "587219", + "Name": "刮刮卡", + "Icon": "http://47.109.132.12/uploads/40005.png", + "Type": 3, + "Count": 1, + "OtherId": "40005", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "587220", + "Name": "刮刮卡", + "Icon": "http://47.109.132.12/uploads/40005.png", + "Type": 3, + "Count": 1, + "OtherId": "40005", + "Weight": 20, + "TotalCount": 0 + } + ] + }, + { + "PoolType": 2, + "Level": "A", + "Count": 3, + "Weight": 1, + "PrizeList": [ + { + "PrizeId": "588001", + "Name": "孙悟空", + "Icon": "", + "Type": 3, + "Count": 1, + "OtherId": "13002", + "Weight": 1, + "TotalCount": 0 + }, + { + "PrizeId": "588002", + "Name": "杨戬", + "Icon": "", + "Type": 3, + "Count": 1, + "OtherId": "13003", + "Weight": 2, + "TotalCount": 0 + }, + { + "PrizeId": "588003", + "Name": "熊猫侠客", + "Icon": "", + "Type": 3, + "Count": 1, + "OtherId": "13004", + "Weight": 3, + "TotalCount": 0 + } + ] + }, + { + "PoolType": 2, + "Level": "B", + "Count": 3, + "Weight": 10, + "PrizeList": [ + { + "PrizeId": "588101", + "Name": "穹渊核弹", + "Icon": "http://47.109.132.12/uploads/48004.png?timespan=1788935361", + "Type": 3, + "Count": 1, + "OtherId": "48004", + "Weight": 10, + "TotalCount": 0 + }, + { + "PrizeId": "588102", + "Name": "噬浪核弹", + "Icon": "http://47.109.132.12/uploads/48003.png?timespan=1788935284", + "Type": 3, + "Count": 1, + "OtherId": "48003", + "Weight": 10, + "TotalCount": 0 + }, + { + "PrizeId": "588103", + "Name": "霜雷核弹", + "Icon": "http://47.109.132.12/uploads/48002.png?timespan=1788935210", + "Type": 3, + "Count": 1, + "OtherId": "48002", + "Weight": 10, + "TotalCount": 0 + } + ] + }, + { + "PoolType": 2, + "Level": "C", + "Count": 20, + "Weight": 20, + "PrizeList": [ + { + "PrizeId": "588201", + "Name": "涌爆核弹", + "Icon": "http://47.109.132.12/uploads/48001.png?timespan=1788935117", + "Type": 3, + "Count": 1, + "OtherId": "48001", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588202", + "Name": "涌爆核弹", + "Icon": "http://47.109.132.12/uploads/48001.png?timespan=1788935117", + "Type": 3, + "Count": 1, + "OtherId": "48001", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588203", + "Name": "狂暴卡", + "Icon": "http://47.109.132.12/uploads/40004.png?v=1784285974", + "Type": 3, + "Count": 10, + "OtherId": "40004", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588204", + "Name": "狂暴卡", + "Icon": "http://47.109.132.12/uploads/40004.png?v=1784285974", + "Type": 3, + "Count": 10, + "OtherId": "40004", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588205", + "Name": "狂暴卡", + "Icon": "http://47.109.132.12/uploads/40004.png?v=1784285974", + "Type": 3, + "Count": 10, + "OtherId": "40004", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588206", + "Name": "狂暴卡", + "Icon": "http://47.109.132.12/uploads/40004.png?v=1784285974", + "Type": 3, + "Count": 10, + "OtherId": "40004", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588207", + "Name": "金币", + "Icon": "", + "Type": 1, + "Count": 100000, + "OtherId": "", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588208", + "Name": "金币", + "Icon": "", + "Type": 1, + "Count": 100000, + "OtherId": "", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588209", + "Name": "钻石", + "Icon": "", + "Type": 2, + "Count": 5, + "OtherId": "", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588210", + "Name": "钻石", + "Icon": "", + "Type": 2, + "Count": 5, + "OtherId": "", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588211", + "Name": "召唤卡", + "Icon": "http://47.109.132.12/uploads/40006.png", + "Type": 3, + "Count": 3, + "OtherId": "40006", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588212", + "Name": "召唤卡", + "Icon": "http://47.109.132.12/uploads/40006.png", + "Type": 3, + "Count": 3, + "OtherId": "40006", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588213", + "Name": "召唤卡", + "Icon": "http://47.109.132.12/uploads/40006.png", + "Type": 3, + "Count": 3, + "OtherId": "40006", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588214", + "Name": "召唤卡", + "Icon": "http://47.109.132.12/uploads/40006.png", + "Type": 3, + "Count": 3, + "OtherId": "40006", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588215", + "Name": "冰冻卡", + "Icon": "http://47.109.132.12/uploads/40003.png?v=1784285984", + "Type": 3, + "Count": 3, + "OtherId": "40003", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588216", + "Name": "冰冻卡", + "Icon": "http://47.109.132.12/uploads/40003.png?v=1784285984", + "Type": 3, + "Count": 3, + "OtherId": "40003", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588217", + "Name": "冰冻卡", + "Icon": "http://47.109.132.12/uploads/40003.png?v=1784285984", + "Type": 3, + "Count": 3, + "OtherId": "40003", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588218", + "Name": "冰冻卡", + "Icon": "http://47.109.132.12/uploads/40003.png?v=1784285984", + "Type": 3, + "Count": 3, + "OtherId": "40003", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588219", + "Name": "刮刮卡", + "Icon": "http://47.109.132.12/uploads/40005.png", + "Type": 3, + "Count": 1, + "OtherId": "40005", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588220", + "Name": "刮刮卡", + "Icon": "http://47.109.132.12/uploads/40005.png", + "Type": 3, + "Count": 1, + "OtherId": "40005", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588221", + "Name": "金币", + "Icon": "", + "Type": 1, + "Count": 50000, + "OtherId": "", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588222", + "Name": "金币", + "Icon": "", + "Type": 1, + "Count": 50000, + "OtherId": "", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588223", + "Name": "金币", + "Icon": "", + "Type": 1, + "Count": 50000, + "OtherId": "", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "588224", + "Name": "金币", + "Icon": "", + "Type": 1, + "Count": 50000, + "OtherId": "", + "Weight": 20, + "TotalCount": 0 + } + ] + }, + { + "PoolType": 3, + "Level": "A", + "Count": 2, + "Weight": 1, + "PrizeList": [ + { + "PrizeId": "589001", + "Name": "堕天使之翼", + "Icon": "", + "Type": 3, + "Count": 1, + "OtherId": "12007", + "Weight": 1, + "TotalCount": 0 + }, + { + "PrizeId": "589002", + "Name": "流火之焰", + "Icon": "", + "Type": 3, + "Count": 1, + "OtherId": "12029", + "Weight": 2, + "TotalCount": 0 + } + ] + }, + { + "PoolType": 3, + "Level": "B", + "Count": 10, + "Weight": 10, + "PrizeList": [ + { + "PrizeId": "589101", + "Name": "穹渊核弹", + "Icon": "http://47.109.132.12/uploads/48004.png?timespan=1788935361", + "Type": 3, + "Count": 1, + "OtherId": "48004", + "Weight": 10, + "TotalCount": 0 + }, + { + "PrizeId": "589102", + "Name": "穹渊核弹", + "Icon": "http://47.109.132.12/uploads/48004.png?timespan=1788935361", + "Type": 3, + "Count": 1, + "OtherId": "48004", + "Weight": 10, + "TotalCount": 0 + }, + { + "PrizeId": "589103", + "Name": "噬浪核弹", + "Icon": "http://47.109.132.12/uploads/48003.png?timespan=1788935284", + "Type": 3, + "Count": 1, + "OtherId": "48003", + "Weight": 10, + "TotalCount": 0 + }, + { + "PrizeId": "589104", + "Name": "噬浪核弹", + "Icon": "http://47.109.132.12/uploads/48003.png?timespan=1788935284", + "Type": 3, + "Count": 1, + "OtherId": "48003", + "Weight": 10, + "TotalCount": 0 + }, + { + "PrizeId": "589105", + "Name": "霜雷核弹", + "Icon": "http://47.109.132.12/uploads/48002.png?timespan=1788935210", + "Type": 3, + "Count": 1, + "OtherId": "48002", + "Weight": 10, + "TotalCount": 0 + }, + { + "PrizeId": "589106", + "Name": "霜雷核弹", + "Icon": "http://47.109.132.12/uploads/48002.png?timespan=1788935210", + "Type": 3, + "Count": 1, + "OtherId": "48002", + "Weight": 10, + "TotalCount": 0 + }, + { + "PrizeId": "589107", + "Name": "涌爆核弹", + "Icon": "http://47.109.132.12/uploads/48001.png?timespan=1788935117", + "Type": 3, + "Count": 1, + "OtherId": "48001", + "Weight": 10, + "TotalCount": 0 + }, + { + "PrizeId": "589108", + "Name": "涌爆核弹", + "Icon": "http://47.109.132.12/uploads/48001.png?timespan=1788935117", + "Type": 3, + "Count": 1, + "OtherId": "48001", + "Weight": 10, + "TotalCount": 0 + }, + { + "PrizeId": "589109", + "Name": "金币", + "Icon": "", + "Type": 1, + "Count": 100000, + "OtherId": "", + "Weight": 10, + "TotalCount": 0 + }, + { + "PrizeId": "589110", + "Name": "金币", + "Icon": "", + "Type": 1, + "Count": 100000, + "OtherId": "", + "Weight": 10, + "TotalCount": 0 + } + ] + }, + { + "PoolType": 3, + "Level": "C", + "Count": 18, + "Weight": 20, + "PrizeList": [ + { + "PrizeId": "589201", + "Name": "狂暴卡", + "Icon": "http://47.109.132.12/uploads/40004.png?v=1784285974", + "Type": 3, + "Count": 10, + "OtherId": "40004", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "589202", + "Name": "狂暴卡", + "Icon": "http://47.109.132.12/uploads/40004.png?v=1784285974", + "Type": 3, + "Count": 10, + "OtherId": "40004", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "589203", + "Name": "狂暴卡", + "Icon": "http://47.109.132.12/uploads/40004.png?v=1784285974", + "Type": 3, + "Count": 10, + "OtherId": "40004", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "589204", + "Name": "狂暴卡", + "Icon": "http://47.109.132.12/uploads/40004.png?v=1784285974", + "Type": 3, + "Count": 10, + "OtherId": "40004", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "589205", + "Name": "金币", + "Icon": "", + "Type": 1, + "Count": 100000, + "OtherId": "", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "589206", + "Name": "金币", + "Icon": "", + "Type": 1, + "Count": 100000, + "OtherId": "", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "589207", + "Name": "钻石", + "Icon": "", + "Type": 2, + "Count": 5, + "OtherId": "", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "589208", + "Name": "钻石", + "Icon": "", + "Type": 2, + "Count": 5, + "OtherId": "", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "589209", + "Name": "召唤卡", + "Icon": "http://47.109.132.12/uploads/40006.png", + "Type": 3, + "Count": 3, + "OtherId": "40006", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "589210", + "Name": "召唤卡", + "Icon": "http://47.109.132.12/uploads/40006.png", + "Type": 3, + "Count": 3, + "OtherId": "40006", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "589211", + "Name": "召唤卡", + "Icon": "http://47.109.132.12/uploads/40006.png", + "Type": 3, + "Count": 3, + "OtherId": "40006", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "589212", + "Name": "召唤卡", + "Icon": "http://47.109.132.12/uploads/40006.png", + "Type": 3, + "Count": 3, + "OtherId": "40006", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "589213", + "Name": "冰冻卡", + "Icon": "http://47.109.132.12/uploads/40003.png?v=1784285984", + "Type": 3, + "Count": 3, + "OtherId": "40003", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "589214", + "Name": "冰冻卡", + "Icon": "http://47.109.132.12/uploads/40003.png?v=1784285984", + "Type": 3, + "Count": 3, + "OtherId": "40003", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "589215", + "Name": "冰冻卡", + "Icon": "http://47.109.132.12/uploads/40003.png?v=1784285984", + "Type": 3, + "Count": 3, + "OtherId": "40003", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "589216", + "Name": "冰冻卡", + "Icon": "http://47.109.132.12/uploads/40003.png?v=1784285984", + "Type": 3, + "Count": 3, + "OtherId": "40003", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "589217", + "Name": "刮刮卡", + "Icon": "http://47.109.132.12/uploads/40005.png", + "Type": 3, + "Count": 1, + "OtherId": "40005", + "Weight": 20, + "TotalCount": 0 + }, + { + "PrizeId": "589218", + "Name": "刮刮卡", + "Icon": "http://47.109.132.12/uploads/40005.png", + "Type": 3, + "Count": 1, + "OtherId": "40005", + "Weight": 20, + "TotalCount": 0 + } + ] + } + ], + "CostsByPool": { + "1": [100, 200, 300, 500, 800, 1000], + "2": [100, 200, 300, 500, 800, 1000], + "3": [100, 200, 300, 500, 800, 1000] + }, + "UserMaxDraw": 100 +} diff --git a/AdminSrc/AdminHost/Config/system.json b/AdminSrc/AdminHost/Config/system.json new file mode 100644 index 0000000..148fa07 --- /dev/null +++ b/AdminSrc/AdminHost/Config/system.json @@ -0,0 +1,53 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + + "AllowedHosts": "*", + "JwtConfig": { + "TokenKey": "token", + "Issuer": "admin", + "Audience": "", + "SecretKey": "henanhuashengchongwuyouxiangongsikejizhongxin", + "ValidateIssuer": false, + "ValidateAudience": false, + "ValidateIssuerSigningKey": false, + "ValidateLifetime": false + }, + "ConnectionStrings": { + "PgSqlConnection": "host=pgsql;database=data_0524;user id=data_0524;password=123456;" + }, + "CapConfig": { + "Host": "rabbitmq", + "UserName": "admin", + "Password": "123456", + "VirtualHost": "/", + "PGLogHost": "host=pgsql;database=data_0524;user id=data_0524;password=123456;" + }, + "RedisConfig": { + "Host": "redis", + "Port": 6379, + "UserName": "", + "Password": "123456", + "Database": 1, + "ConnectionString": "redis:6379,password=123456,defaultDatabase=2,abortConnect=false" + }, + "MongoDbSettings": { + "username": "root", + "password": "root23456", + "ServerUrl": "mongodb://mongo:27017" + }, + "WXConfig": { + "AppId": "wxceab9ce5b4474219", + "Secret": "5a291d7b295c76da579611da3f83e059", + "Url": "https://api.weixin.qq.com" + }, + "BulletConfig": { + "SignKey": "63215f0afa3f5b25", + "MaxBulletPerUser": 100, + "TimeWindowSeconds": 500000 + } +} diff --git a/AdminSrc/AdminHost/Extension/CapExtension.cs b/AdminSrc/AdminHost/Extension/CapExtension.cs new file mode 100644 index 0000000..a2a829b --- /dev/null +++ b/AdminSrc/AdminHost/Extension/CapExtension.cs @@ -0,0 +1,50 @@ +using DotNetCore.CAP.Messages; +using AdminService.Tasks; + +namespace AdminHost.Extension +{ + public static class CapExtension + { + public static IServiceCollection AddCap(this IServiceCollection services, IConfiguration configuration) + { + services.AddCap(x => + { + x.UseDashboard(); + x.UseRabbitMQ(rb => + { + rb.HostName = configuration["CapConfig:Host"]; + rb.UserName = configuration["CapConfig:UserName"]; + rb.Password = configuration["CapConfig:Password"]; + rb.VirtualHost = configuration["CapConfig:VirtualHost"]; + rb.ExchangeName = "cap.exchange"; + }); + x.UsePostgreSql(op => + { + op.ConnectionString = configuration["CapConfig:PGLogHost"]; + op.Schema = "public"; + }); + + x.SucceedMessageExpiredAfter = 7 * 24 * 3600; + x.FailedRetryCount = 5; + x.FailedRetryInterval = 10; + x.FailedThresholdCallback = ObjFailedThresholdCallback; + + }); + return services; + } + + private static async void ObjFailedThresholdCallback(FailedInfo failed) + { + var exception = failed.Message.Headers["cap-exception"] ?? string.Empty; + var name = failed.Message.GetName(); + if (failed.MessageType == MessageType.Publish) + { + + } + else + { + + } + } + } +} diff --git a/AdminSrc/AdminHost/Jobs/DailyTaskJob.cs b/AdminSrc/AdminHost/Jobs/DailyTaskJob.cs new file mode 100644 index 0000000..5cb4fcf --- /dev/null +++ b/AdminSrc/AdminHost/Jobs/DailyTaskJob.cs @@ -0,0 +1,24 @@ +using Microsoft.Extensions.Logging; +using ScheduledService; +using UserService.Tasks; + +namespace AdminHost.Jobs; + +public class DailyTaskJob : CronJobService +{ + private readonly ITaskService _taskService; + + public DailyTaskJob( + IScheduleConfig config, + ITaskService taskService, + ILogger baseLogger) + : base(config.CronExpression, config.TimeZoneInfo, baseLogger) + { + _taskService = taskService; + } + + public override async Task DoWork(CancellationToken cancellationToken) + { + await _taskService.DayTaskReward(); + } +} diff --git a/AdminSrc/AdminHost/Middleware/ApiLoggingMiddleware.cs b/AdminSrc/AdminHost/Middleware/ApiLoggingMiddleware.cs new file mode 100644 index 0000000..3793f47 --- /dev/null +++ b/AdminSrc/AdminHost/Middleware/ApiLoggingMiddleware.cs @@ -0,0 +1,156 @@ + +using System.Text; +using Common; +using CommonDomain; +using CommonService; +using Newtonsoft.Json; + +namespace AdminHost.Middleware +{ + public class ApiLoggingMiddleware + { + private readonly RequestDelegate _next; + private readonly ILogger _logger; + private readonly IApiLogService _apiLogService; + + public ApiLoggingMiddleware(RequestDelegate next, ILogger logger, IApiLogService apiLogService) + { + _next = next; + _logger = logger; + _apiLogService = apiLogService; + } + public async Task Invoke(HttpContext httpContext) + { + var request = httpContext.Request; + if (request.Path.StartsWithSegments(new PathString("/api")) && request.Method.ToLower() != "options") + { + var requestTime = DateTime.Now; + var requestBodyContent = string.Empty; + var originalRequest = httpContext.Response.Body; + if (request.Method == "POST") + { + request.EnableBuffering(); + requestBodyContent = await new StreamReader(request.Body).ReadToEndAsync(); + request.Body.Position = 0; + } + + try + { + using (var responseBody = new MemoryStream()) + { + var response = httpContext.Response; + response.Body = responseBody; + await _next(httpContext); + string responseBodyContent = null; + responseBodyContent = await FormatResponse(response); + await responseBody.CopyToAsync(originalRequest); + + string token = string.Empty, version = string.Empty, userAgent = string.Empty, source = string.Empty, deviceId = string.Empty, device = string.Empty, ip = string.Empty,sign=string.Empty; + if (httpContext.Request != null && httpContext.Request.Headers != null) + { + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Token"])) + { + token = httpContext.Request.Headers["Token"] + ""; } + + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Version"])) + { + version = httpContext.Request.Headers["Version"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["User-Agent"])) + { + userAgent = httpContext.Request.Headers["User-Agent"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Source"])) + { + source = httpContext.Request.Headers["Source"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["DeviceId"])) + { + deviceId = httpContext.Request.Headers["DeviceId"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Device"])) + { + device = httpContext.Request.Headers["Device"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Ip"])) + { + ip = httpContext.Request.Headers["Ip"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Sign"])) + { + sign = httpContext.Request.Headers["Sign"] + ""; + } + } + try + { + if (!string.IsNullOrEmpty(responseBodyContent)) + { + BaseResponse baseResponse = JsonConvert.DeserializeObject>(responseBodyContent); + if (baseResponse != null && baseResponse.Data != null) + { + baseResponse.Data = null; + } + responseBodyContent = JsonConvert.SerializeObject(baseResponse); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "API响应日志脱敏序列化失败 path={Path}", request.Path); +} + var now = DateTime.Now; + var apilog = new ApiLog() + { + requestTime = now, + accessToken = token, + clientIP = httpContext.Connection.RemoteIpAddress.ToString(), + consumeTime = (DateTime.Now - requestTime).Milliseconds, + requestHead= JsonConvert.SerializeObject(httpContext.Request.Headers), + requestUrl = request.Path, + requestMethod = request.Method.ToLower(), + requestQuery = request.QueryString.ToString(), + requestBody = requestBodyContent, + httpStatus = httpContext.Response.StatusCode, + responseBody = responseBodyContent, + userAgent = userAgent, + device= device, + deviceId= deviceId, + ip=ip, + source=source, + version=version, + sign=sign + }; + await _apiLogService.InsertOneAsync(apilog); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "API日志记录失败 path={Path}", request.Path); + } + finally + { + httpContext.Response.Body = originalRequest; + } + } + else + { + await _next(httpContext); + } + } + + private async Task FormatResponse(HttpResponse response) + { + response.Body.Seek(0, SeekOrigin.Begin); + string text = await new StreamReader(response.Body).ReadToEndAsync(); + response.Body.Seek(0, SeekOrigin.Begin); + return text; + } + } + + public static class ApiLoggingMiddlewareExtensions + { + public static IApplicationBuilder UseApiLogging(this IApplicationBuilder app) + { + return app.UseMiddleware(); + } + } +} diff --git a/AdminSrc/AdminHost/Middleware/AutofacModule.cs b/AdminSrc/AdminHost/Middleware/AutofacModule.cs new file mode 100644 index 0000000..3fa7475 --- /dev/null +++ b/AdminSrc/AdminHost/Middleware/AutofacModule.cs @@ -0,0 +1,47 @@ +using AdminService.System; +using AdminService.Customer; +using AdminService.Admin; +using Autofac; +using CommonService; +using MongoRepository; +using UserService; +using UserService.BeautifulNumber; + +namespace AdminHost.Middleware +{ + public class AutofacModule : Module + { + protected override void Load(ContainerBuilder builder) + { + builder.RegisterGeneric(typeof(MongoBaseRepository<>)).As(typeof(IMongoBaseRepository<>)).InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterAssemblyTypes(typeof(ApiLogService).Assembly) + .Where(t => t.Name.EndsWith("Service")) + .AsImplementedInterfaces() + .InstancePerLifetimeScope(); + + builder.RegisterAssemblyTypes(typeof(AdminOperationLogService).Assembly) + .Where(t => t.Name.EndsWith("Service")) + .AsImplementedInterfaces() + .InstancePerLifetimeScope(); + + builder.RegisterAssemblyTypes(typeof(SystemService).Assembly) + .Where(t => t.Name.EndsWith("Service")) + .AsImplementedInterfaces() + .InstancePerLifetimeScope(); + + builder.RegisterAssemblyTypes(typeof(UserFeedbackService).Assembly) + .Where(t => t.Name.EndsWith("Service")) + .AsImplementedInterfaces() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + } + } +} diff --git a/AdminSrc/AdminHost/Middleware/OperationLogMiddleware.cs b/AdminSrc/AdminHost/Middleware/OperationLogMiddleware.cs new file mode 100644 index 0000000..56033b4 --- /dev/null +++ b/AdminSrc/AdminHost/Middleware/OperationLogMiddleware.cs @@ -0,0 +1,234 @@ +using System.Text; +using Domain.Admin.Admin; +using Domain.Admin.Admin.ENum; + +namespace AdminHost.Middleware +{ + public class OperationLogMiddleware + { + private readonly RequestDelegate _next; + private readonly ILogger _logger; + + public OperationLogMiddleware(RequestDelegate next, ILogger logger) + { + _next = next; + _logger = logger; + } + + public async Task InvokeAsync(HttpContext context, Domain.Admin.Admin.IAdminOperationLogService logService) + { + var path = context.Request.Path.Value ?? ""; + var method = context.Request.Method; + + bool shouldLog = path.StartsWith("/adminapi", StringComparison.OrdinalIgnoreCase) || + path.StartsWith("/api/Admin", StringComparison.OrdinalIgnoreCase); + + if (!shouldLog) + { + await _next(context); + return; + } + + if (path.Contains("/login", StringComparison.OrdinalIgnoreCase) || + path.Contains("/GetAccessToken", StringComparison.OrdinalIgnoreCase)) + { + await _next(context); + return; + } + + string? requestBody = null; + + if (method == "POST" || method == "PUT") + { + context.Request.EnableBuffering(); + using var reader = new StreamReader(context.Request.Body, Encoding.UTF8, leaveOpen: true); + requestBody = await reader.ReadToEndAsync(); + context.Request.Body.Position = 0; + } + + var startTime = DateTime.Now; + string? ip = GetClientIp(context); + string? adminId = null; + string? adminName = null; + + if (context.User.Identity?.IsAuthenticated == true) + { + adminId = context.User.FindFirst("uid")?.Value; + adminName = context.User.FindFirst("dname")?.Value + ?? context.User.FindFirst(System.Security.Claims.ClaimTypes.Name)?.Value; + } + + if (adminId == "administrator" || adminName == "administrator") + { + await _next(context); + return; + } + + int statusCode = 200; + + try + { + await _next(context); + statusCode = context.Response.StatusCode; + } + catch (Exception ex) + { + statusCode = 500; + _logger.LogError(ex, "请求处理异常"); + throw; + } + + _ = Task.Run(async () => + { + try + { + var log = new AdminOperationLog + { + AdminId = adminId, + AdminName = adminName, + Module = (int)GetModuleFromPath(path), + ActionType = GetActionType(method, path), + Description = $"{GetActionType(method, path)} - {path}", + HttpMethod = method, + RequestPath = path, + RequestParams = requestBody?.Length > 4000 ? requestBody[..4000] : requestBody, + Response = null, + Ip = ip, + Status = statusCode >= 200 && statusCode < 400 ? 1 : 0, + OperateTime = startTime + }; + + await logService.AddLog(log); + } + catch (Exception ex) + { + _logger.LogError(ex, "记录操作日志失败"); + } + }); + } + + private static string? GetClientIp(HttpContext context) + { + var ip = context.Request.Headers["X-Forwarded-For"].FirstOrDefault(); + if (string.IsNullOrEmpty(ip)) + { + ip = context.Connection.RemoteIpAddress?.ToString(); + } + return ip; + } + + private static EnumOperationModule GetModuleFromPath(string path) + { + if (path.Contains("/AdminUser", StringComparison.OrdinalIgnoreCase)) + return EnumOperationModule.User; + if (path.Contains("/Customer", StringComparison.OrdinalIgnoreCase)) + return EnumOperationModule.Customer; + if (path.Contains("/BeautifulNumber", StringComparison.OrdinalIgnoreCase)) + return EnumOperationModule.BeautifulNumber; + if (path.Contains("/Notice", StringComparison.OrdinalIgnoreCase)) + return EnumOperationModule.Notice; + if (path.Contains("/Task", StringComparison.OrdinalIgnoreCase)) + return EnumOperationModule.Task; + if (path.Contains("/GameConfig", StringComparison.OrdinalIgnoreCase)) + return EnumOperationModule.GameConfig; + if (path.Contains("/Room", StringComparison.OrdinalIgnoreCase)) + return EnumOperationModule.Room; + if (path.Contains("/System/user", StringComparison.OrdinalIgnoreCase) || + path.Contains("/system/user", StringComparison.OrdinalIgnoreCase)) + return EnumOperationModule.SystemUser; + if (path.Contains("/System/role", StringComparison.OrdinalIgnoreCase) || + path.Contains("/system/role", StringComparison.OrdinalIgnoreCase)) + return EnumOperationModule.Role; + if (path.Contains("/System/nav", StringComparison.OrdinalIgnoreCase) || + path.Contains("/system/nav", StringComparison.OrdinalIgnoreCase)) + return EnumOperationModule.Navigation; + if (path.Contains("/System/dic", StringComparison.OrdinalIgnoreCase) || + path.Contains("/system/dic", StringComparison.OrdinalIgnoreCase)) + return EnumOperationModule.Dictionary; + + return EnumOperationModule.Other; + } + + private static string GetActionType(string method, string path) + { + if (path.Contains("/Ban", StringComparison.OrdinalIgnoreCase) || + path.Contains("/ban", StringComparison.OrdinalIgnoreCase)) + return "封号"; + if (path.Contains("/Unban", StringComparison.OrdinalIgnoreCase) || + path.Contains("/unban", StringComparison.OrdinalIgnoreCase)) + return "解封"; + if (path.Contains("/Batch", StringComparison.OrdinalIgnoreCase) || + path.Contains("/batch", StringComparison.OrdinalIgnoreCase)) + return "批量操作"; + if (path.Contains("/Email", StringComparison.OrdinalIgnoreCase) || + path.Contains("/email", StringComparison.OrdinalIgnoreCase)) + return "发送邮件"; + if (path.Contains("/Init", StringComparison.OrdinalIgnoreCase) || + path.Contains("/init", StringComparison.OrdinalIgnoreCase)) + return "初始化"; + if (path.Contains("/Freeze", StringComparison.OrdinalIgnoreCase) || + path.Contains("/freeze", StringComparison.OrdinalIgnoreCase)) + return "冻结"; + if (path.Contains("/Unfreeze", StringComparison.OrdinalIgnoreCase) || + path.Contains("/unfreeze", StringComparison.OrdinalIgnoreCase)) + return "解冻"; + if (path.Contains("/Give", StringComparison.OrdinalIgnoreCase) || + path.Contains("/give", StringComparison.OrdinalIgnoreCase)) + return "赠送"; + if (path.Contains("/Clear", StringComparison.OrdinalIgnoreCase) || + path.Contains("/clear", StringComparison.OrdinalIgnoreCase)) + return "清空"; + if (path.Contains("/Robot", StringComparison.OrdinalIgnoreCase) || + path.Contains("/robot", StringComparison.OrdinalIgnoreCase)) + return "机器人管理"; + if (path.Contains("/state", StringComparison.OrdinalIgnoreCase) || + path.Contains("/State", StringComparison.OrdinalIgnoreCase)) + return "设置状态"; + if (path.Contains("/icon", StringComparison.OrdinalIgnoreCase) || + path.Contains("/Icon", StringComparison.OrdinalIgnoreCase)) + return "修改头像"; + if (path.Contains("/list", StringComparison.OrdinalIgnoreCase) || + path.Contains("/List", StringComparison.OrdinalIgnoreCase) || + path.Contains("/GetAll", StringComparison.OrdinalIgnoreCase) || + path.Contains("/getall", StringComparison.OrdinalIgnoreCase) || + path.Contains("/Get", StringComparison.OrdinalIgnoreCase) || + path.Contains("/get", StringComparison.OrdinalIgnoreCase) || + path.Contains("/check", StringComparison.OrdinalIgnoreCase) || + path.Contains("/Check", StringComparison.OrdinalIgnoreCase)) + return "查询"; + if (path.Contains("/add", StringComparison.OrdinalIgnoreCase) || + path.Contains("/create", StringComparison.OrdinalIgnoreCase) || + path.Contains("/Add", StringComparison.OrdinalIgnoreCase) || + path.Contains("/Create", StringComparison.OrdinalIgnoreCase) || + path.Contains("/send", StringComparison.OrdinalIgnoreCase) || + path.Contains("/Send", StringComparison.OrdinalIgnoreCase)) + return "新增"; + if (path.Contains("/update", StringComparison.OrdinalIgnoreCase) || + path.Contains("/edit", StringComparison.OrdinalIgnoreCase) || + path.Contains("/Update", StringComparison.OrdinalIgnoreCase) || + path.Contains("/Edit", StringComparison.OrdinalIgnoreCase) || + path.Contains("/set-", StringComparison.OrdinalIgnoreCase)) + return "修改"; + if (path.Contains("/delete", StringComparison.OrdinalIgnoreCase) || + path.Contains("/Delete", StringComparison.OrdinalIgnoreCase)) + return "删除"; + + return method switch + { + "GET" => "查询", + "POST" => "新增", + "PUT" => "修改", + "DELETE" => "删除", + _ => "操作" + }; + } + } + + public static class OperationLogMiddlewareExtensions + { + public static IApplicationBuilder UseOperationLog(this IApplicationBuilder builder) + { + return builder.UseMiddleware(); + } + } +} diff --git a/AdminSrc/AdminHost/Program.cs b/AdminSrc/AdminHost/Program.cs new file mode 100644 index 0000000..c85bbe3 --- /dev/null +++ b/AdminSrc/AdminHost/Program.cs @@ -0,0 +1,150 @@ +using System.Text.Json; +using AdminApi; +using AdminHost.Extension; +using AdminHost.Jobs; +using AdminHost.Middleware; +using Microsoft.AspNetCore.SignalR; +using AdminService; +using Autofac; +using Autofac.Extensions.DependencyInjection; +using Common.Request; + +using JWTHelper; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Microsoft.Extensions.Options; +using MongoRepository.Config; +using Newtonsoft.Json; +using NLog.Extensions.Logging; +using NLog.Web; +using RedisHelper; +using ScheduledService; +using SharpAbp.Infrastructure.Api.Middleware; + +Environment.SetEnvironmentVariable("SERVICE_NAME", + Environment.GetEnvironmentVariable("SERVICE_NAME") + ?? System.Reflection.Assembly.GetEntryAssembly()?.GetName().Name + ?? "AdminHost"); +Environment.SetEnvironmentVariable("INSTANCE_ID", + Environment.GetEnvironmentVariable("INSTANCE_ID") ?? "default"); + +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. +builder.Services.AddControllers() + .AddApplicationPart(typeof(AssemblyMarker).Assembly) + .AddControllersAsServices() + .ConfigureApiBehaviorOptions(options => + { + options.SuppressModelStateInvalidFilter = true; + }); + +builder.Services.AddControllers(); +builder.Logging.AddNLog(); +builder.Host.UseNLog(); + +builder.Services.AddControllers().AddNewtonsoftJson( + option => { + option.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; + option.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local; + option.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; + option.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver(); + } +); + +builder.Configuration.AddJsonFile(Path.Combine("Config", "system.json"), optional: true); +builder.Services.Configure(builder.Configuration.GetSection(nameof(MongoDbSettings))); +builder.Services.AddSingleton(sp => sp.GetRequiredService>().Value); + +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); +builder.Services.AddAutoMapper(typeof(AutoMapperConfig)); + +builder.Services.AddHealthChecks() + .AddCheck("self", () => HealthCheckResult.Healthy(), tags: new[] { "self" }); + + + +builder.Services.AddCors(options => +{ + options.AddPolicy("Cors", policy => + { + policy + .SetIsOriginAllowed(_ => true) + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials(); + }); +}); + +builder.Services.AddSignalR(); + +#region jwt +builder.Services.AddCustomJwt(builder.Configuration); +#endregion + +#region redis +builder.Services.AddRedisCache(builder.Configuration); +#endregion + +#region Cap +builder.Services.AddCap(builder.Configuration); +#endregion + +builder.Services.AddCronJob(c => +{ + c.TimeZoneInfo = TimeZoneInfo.Local; + c.CronExpression = @"0 0 0 * * *"; +}); + +builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); +builder.Host.ConfigureContainer(builder => +{ + builder.RegisterModule(); +}); + +var app = builder.Build(); + + + +if (app.Environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseCors("Cors"); +app.UseRouting(); +app.UseStaticFiles(); +app.UseAuthentication(); +app.UseAuthorization(); + +app.UseApiLogging(); + +app.UseOperationLog(); + +app.MapControllers(); +app.UseGlobalExceptionHandler(); +app.MapHealthChecks("/health", new HealthCheckOptions +{ + Predicate = _ => true, + ResponseWriter = async (context, report) => + { + context.Response.ContentType = "application/json"; + var result = new + { + status = report.Status.ToString(), + checks = report.Entries.Select(e => new + { + name = e.Key, + status = e.Value.Status.ToString(), + description = e.Value.Description, + duration = e.Value.Duration.TotalMilliseconds + }), + totalDuration = report.TotalDuration.TotalMilliseconds + }; + await context.Response.WriteAsync(System.Text.Json.JsonSerializer.Serialize(result)); + } +}); + +app.Run(); diff --git a/AdminSrc/AdminHost/Properties/launchSettings.json b/AdminSrc/AdminHost/Properties/launchSettings.json new file mode 100644 index 0000000..274c20b --- /dev/null +++ b/AdminSrc/AdminHost/Properties/launchSettings.json @@ -0,0 +1,29 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:57330", + "sslPort": 0 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:8002/", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/AdminSrc/AdminHost/appsettings.Development.json b/AdminSrc/AdminHost/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/AdminSrc/AdminHost/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/AdminSrc/AdminHost/appsettings.json b/AdminSrc/AdminHost/appsettings.json new file mode 100644 index 0000000..3457895 --- /dev/null +++ b/AdminSrc/AdminHost/appsettings.json @@ -0,0 +1,16 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "CapConfig": { + "Host": "rabbitmq", + "UserName": "admin", + "Password": "123456", + "VirtualHost": "/", + "PGLogHost": "host=pgsql;database=data_0524;user id=data_0524;password=123456;" + } +} diff --git a/AdminSrc/AdminHost/docker-compose.yaml b/AdminSrc/AdminHost/docker-compose.yaml new file mode 100644 index 0000000..37ce47d --- /dev/null +++ b/AdminSrc/AdminHost/docker-compose.yaml @@ -0,0 +1,8 @@ +name: webapi +services: + 0524admin: + image: 0524admin + container_name: '0524admin' + restart: always + ports: + - '5241:80' \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/.htaccess b/AdminSrc/AdminHost/wwwroot/admin/dist/.htaccess new file mode 100644 index 0000000..e69de29 diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/config.js b/AdminSrc/AdminHost/wwwroot/admin/dist/config.js new file mode 100644 index 0000000..e866730 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/config.js @@ -0,0 +1,135 @@ + + +layui.define(['laytpl', 'layer', 'element', 'util'], function(exports){ + exports('setter', { + baseurl:'http://localhost:8002/', + customerApiUrl: 'http://localhost:8007/', + container: 'LAY_app' //容器ID + ,base: layui.cache.base //记录layuiAdmin文件夹所在路径 + ,views: layui.cache.base + 'views/' //视图所在目录 + , entry: 'user/administrators/list' //默认视图文件名 + ,engine: '.html' //视图文件后缀名 + ,pageTabs: true //是否开启页面选项卡功能 + ,type: 'tab' //tab切换模式,不设置则每次点击都刷新 + + , name: '朋客捕鱼后台管理' + ,tableName: 'layuiAdmin' //本地存储表名 + ,MOD_NAME: 'admin' //模块事件名 + + ,debug: false //是否开启调试模式。如开启,接口异常时会抛出异常 URL 等信息 + + ,interceptor: true //是否开启未登入拦截 + + //自定义请求字段 + ,request: { + tokenName: 'token' //自动携带 token 的字段名。可设置 false 不携带。 + } + + //自定义响应字段 + ,response: { + statusName: 'code' //数据状态的字段名称 + ,statusCode: { + ok: 0 //数据状态一切正常的状态码 + , logout: 401 //登录状态失效的状态码 + } + ,msgName: 'info' //状态信息的字段名称 + ,dataName: 'data' //数据详情的字段名称 + } + + //独立页面路由,可随意添加(无需写参数) + ,indPage: [ + '/user/login' //登入页 + ,'/user/reg' //注册页 + ,'/user/forget' //找回密码 + ,'/template/tips/test' //独立页的一个测试 demo + ] + + //扩展的第三方模块 + ,extend: [ + 'echarts', //echarts 核心包 + 'echartsTheme' //echarts 主题 + ] + + //主题配置 + ,theme: { + //内置主题配色方案 + color: [{ + main: '#20222A' //主题色 + ,selected: '#009688' //选中色 + ,alias: 'default' //默认别名 + },{ + main: '#03152A' + ,selected: '#3B91FF' + ,alias: 'dark-blue' //藏蓝 + },{ + main: '#2E241B' + ,selected: '#A48566' + ,alias: 'coffee' //咖啡 + },{ + main: '#50314F' + ,selected: '#7A4D7B' + ,alias: 'purple-red' //紫红 + },{ + main: '#344058' + ,logo: '#1E9FFF' + ,selected: '#1E9FFF' + ,alias: 'ocean' //海洋 + },{ + main: '#3A3D49' + ,logo: '#2F9688' + ,selected: '#5FB878' + ,alias: 'green' //墨绿 + },{ + main: '#20222A' + ,logo: '#F78400' + ,selected: '#F78400' + ,alias: 'red' //橙色 + },{ + main: '#28333E' + ,logo: '#AA3130' + ,selected: '#AA3130' + ,alias: 'fashion-red' //时尚红 + },{ + main: '#24262F' + ,logo: '#3A3D49' + ,selected: '#009688' + ,alias: 'classic-black' //经典黑 + },{ + logo: '#226A62' + ,header: '#2F9688' + ,alias: 'green-header' //墨绿头 + },{ + main: '#344058' + ,logo: '#0085E8' + ,selected: '#1E9FFF' + ,header: '#1E9FFF' + ,alias: 'ocean-header' //海洋头 + },{ + header: '#393D49' + ,alias: 'classic-black-header' //经典黑 + },{ + main: '#50314F' + ,logo: '#50314F' + ,selected: '#7A4D7B' + ,header: '#50314F' + ,alias: 'purple-red-header' //紫红头 + },{ + main: '#28333E' + ,logo: '#28333E' + ,selected: '#AA3130' + ,header: '#AA3130' + ,alias: 'fashion-red-header' //时尚红头 + },{ + main: '#28333E' + ,logo: '#009688' + ,selected: '#009688' + ,header: '#009688' + ,alias: 'green-header' //墨绿头 + }] + + //初始的颜色索引,对应上面的配色方案数组索引 + //如果本地已经有主题色记录,则以本地记录为优先,除非请求本地数据(localStorage) + ,initColorIndex: 0 + } + }); +}); diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/controller/banneradmin.js b/AdminSrc/AdminHost/wwwroot/admin/dist/controller/banneradmin.js new file mode 100644 index 0000000..6d08fc8 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/controller/banneradmin.js @@ -0,0 +1,131 @@ + +layui.define(["table", "admin", "form", 'user', 'tree'], function (e) { + var i = (layui.$, layui.admin), + $ = layui.$, + t = layui.view, + l = layui.table, + r = layui.form, + tree = layui.tree, + admin = layui.admin, + setter = layui.setter; + var treedata = []; + //提交数据 + + l.render({ + elem: "#LAY-user-back-manage", + url: setter.baseurl + "adminapi/banner/list", + method: "post", + contentType: "application/json", + page: true, + where: { + keyWord: "", + state: -1 + }, + request: { + pageName: 'pageIndex' //页码的参数名称,默认:page + , limitName: 'pageSize' //每页数据量的参数名,默认:limit + }, + limit: 10, + headers: { + 'token': layui.data(setter.tableName)[setter.request.tokenName] + }, + cols: [ + [ + { + field: "title", + title: "标题", + }, { + field: "url", + title: "链接" + } + , { + field: "times", + title: "时长(秒)" + }, { + field: "seeCount", + title: "浏览次数" + }, { + field: "state", + title: "状态", + templet: function (d) { + if (d.state == 1) + return "正常"; + else + return "停止" + } + }, { + field: "position", + title: "位置", + templet: function (d) { + var str = ""; + console.log(d) + d.position.forEach(function (currentValue, index, array) { + + str += currentValue.title + "," + }); + + return str; + } + }, { + field: "createTime", + title: "加入时间", + sort: !0 + }, { + title: "操作", + align: "center", + fixed: "right", + toolbar: "#table-banneradmin-admin" + }] + ], + text: "对不起,加载出现异常!", + response: { + statusName: 'code', //数据状态的字段名称,默认:code + statusCode: 0, //成功的状态码,默认:0 + msgName: 'info', //状态信息的字段名称,默认:msg + countName: 'count', //数据总数的字段名称,默认:count + dataName: 'data' //数据列表的字段名称,默认:data + } + }), + + l.on("tool(LAY-user-back-manage)", function (e) { + var l = e.data; + console.log(e.event) + if ("del" === e.event) { + layer.confirm("确定删除此广告?", function (i) { + //提交数据 + admin.req({ + method: "get", + url: setter.baseurl + "adminapi/banner/delete?id=" + e.data.id,//实际使用请改成服务端真实接口 + async: true, + done: function (res) { + + e.del(), layer.close(i) + } + }) + + }) + } + if ("edit" === e.event) { + i.popup({ + title: "编辑广告", + area: ["500px", "600px"], + id: "LAY-popup-user-add", + success: function (e, i) { + t(this.id).render("user/administrators/bannerform", l).done(function () { + + r.render(null, "layuiadmin-form-admin"), + + r.on("submit(LAY-user-back-submit)", function (e) { + + + + + + }) + }) + } + }) + } + + }), e("banneradmin", {}) +}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/controller/common.js b/AdminSrc/AdminHost/wwwroot/admin/dist/controller/common.js new file mode 100644 index 0000000..dd330de --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/controller/common.js @@ -0,0 +1,142 @@ +/** layuiAdmin.pro-v1.4.0 LPPL License By https://www.layui.com/admin/ */; +layui.define(function (exports) { + var $ = layui.$; + var i = (layui.$, layui.layer, layui.laytpl, layui.setter, layui.view, layui.admin); + + // Helper: convert PascalCase or any case keys to camelCase recursively + function toCamelKey(s) { + if (!s || typeof s !== 'string') return s; + // handle underscores and PascalCase + var str = s.replace(/_([a-z])/g, function (m, p1) { return p1.toUpperCase(); }); + // if contains uppercase letters after first char, convert first char to lower + return str.charAt(0).toLowerCase() + str.slice(1); + } + + function convertKeysToCamel(obj) { + if (obj === null || obj === undefined) return obj; + if (Array.isArray(obj)) return obj.map(convertKeysToCamel); + if (typeof obj === 'object') { + var res = {}; + for (var k in obj) { + if (!Object.prototype.hasOwnProperty.call(obj, k)) continue; + var nk = toCamelKey(k); + res[nk] = convertKeysToCamel(obj[k]); + } + return res; + } + return obj; + } + + // Wrap admin.req so that all responses have their .data keys converted to camelCase + if (i && i.req) { + var _origReq = i.req.bind(i); + i.req = function (options) { + if (!options) return _origReq(options); + var userDone = options.done; + options.done = function (res) { + try { + if (res && res.data) { + res.data = convertKeysToCamel(res.data); + } + } catch (e) { + console && console.error && console.error('convertKeysToCamel error', e); + } + if (typeof userDone === 'function') userDone(res); + }; + return _origReq(options); + }; + } + + // Enum definitions: populate as needed. Keys are field names in camelCase, values are arrays of {value,text} + window.enumDefinitions = window.enumDefinitions || { + fishType: [{ value: 1, text: '普通鱼' }, { value: 2, text: 'Boss鱼' }, { value: 3, text: '黄金鱼' }, { value: 4, text: '特殊鱼' }, { value: 5, text: '特殊Boss' }], + saleType: [{ value: 1, text: '钻石' }, { value: 2, text: '房卡' }, { value: 4, text: '金币' }, { value: 5, text: '道具' }] + }; + + function replaceInputWithSelect($form, name, options, currentValue) { + var $input = $form.find('[name="' + name + '"]'); + if ($input.length === 0) return; + // create select + var $select = $(''); + $select.attr('name', name); + $options = options || []; + $select.append($('')); + $options.forEach(function (opt) { + var $opt = $('').attr('value', opt.value).text(opt.text); + if (String(opt.value) === String(currentValue)) $opt.attr('selected', 'selected'); + $select.append($opt); + }); + $input.replaceWith($select); + } + + // Normalize input/select/textarea name attributes to camelCase + function normalizeFormInputNames($container) { + try { + var $root = $($container || document); + $root.find('input[name],select[name],textarea[name]').each(function () { + var $el = $(this); + var name = $el.attr('name'); + if (!name) return; + var newName = toCamelKey(name); + if (newName !== name) { + $el.attr('name', newName); + } + }); + } catch (e) { + console && console.error && console.error('normalizeFormInputNames error', e); + } + } + + window.renderEnumControls = function ($container) { + try { + var $ = layui.$; + var $form = $($container || document); + // normalize names first + normalizeFormInputNames($form); + Object.keys(window.enumDefinitions).forEach(function (field) { + var options = window.enumDefinitions[field]; + // find any input/select with this name and replace if it's not already a select + var $els = $form.find('[name="' + field + '"]'); + $els.each(function () { + var $el = $(this); + if ($el.is('select')) return; // already select + var currentVal = $el.val(); + replaceInputWithSelect($form, field, options, currentVal); + }); + }); + } catch (e) { + console && console.error && console.error('renderEnumControls error', e); + } + }; + + // Wrap form.render to invoke enum rendering after original render + if (layui && layui.form && layui.form.render) { + var _origFormRender = layui.form.render.bind(layui.form); + layui.form.render = function () { + var res = _origFormRender.apply(null, arguments); + try { + // arguments may include filter name; find forms with that lay-filter + var filter = arguments && arguments.length ? arguments[0] : null; + if (typeof filter === 'string') { + // find forms with lay-filter + var $forms = layui.$("[lay-filter='" + filter + "']"); + $forms.each(function () { window.renderEnumControls(this); }); + } else { + window.renderEnumControls(document); + } + } catch (e) { } + return res; + }; + } + + i.events.logout = function () { + i.req({ + url: "./json/user/logout.js", + type: "get", + data: {}, + done: function (e) { + i.exit() + } + }) + }, exports("common", {}) +}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/controller/dic.js b/AdminSrc/AdminHost/wwwroot/admin/dist/controller/dic.js new file mode 100644 index 0000000..58c40aa --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/controller/dic.js @@ -0,0 +1,93 @@ + +layui.define(["table", "admin", "form", 'user', 'tree'], function (e) { + var i = (layui.$, layui.admin), + $ = layui.$, + t = layui.view, + l = layui.treeTable, + r = layui.form, + tree = layui.tree, + admin = layui.admin, + setter = layui.setter; + var treedata = []; + //提交数据 + + l.render({ + elem: "#LAY-user-back-dic", + url: setter.baseurl + "adminapi/System/dic/list", + method: "get", + page: false, + limit: 0, + headers: { + 'token': layui.data(setter.tableName)[setter.request.tokenName] + }, + treeNode:true, + cols: [ + [ + { + field: "name", + title: "名称" + }, { + field: "order", + title: "序号" + }, { + title: "操作", + width: 300, + align: "center", + fixed: "right", + toolbar: "#table-role-admin" + }] + ], + text: "对不起,加载出现异常!" + }), l.on("tool(LAY-user-back-dic)", function (e) { + var l = e.data; + console.log(e.event) + if ("del" === e.event) { + layer.confirm("确定删除此菜单?", function (i) { + //提交数据 + admin.req({ + method: "get", + url: setter.baseurl + "adminapi/System/dic/delete?id=" + e.data.id,//实际使用请改成服务端真实接口 + async: true, + done: function (res) { + + e.del(), layer.close(i) + } + }) + + }) + } + if ("edit" === e.event) { + i.popup({ + title: "编辑菜单", + area: ["500px", "480px"], + id: "LAY-popup-user-add", + success: function (e, i) { + t(this.id).render("user/administrators/dicform", l).done(function () { + r.render(null, "layuiadmin-form-dic"), r.on("submit(LAY-user-dic-submit)", function (e) { + + var param = e.field; + param.dicid + //提交数据 + admin.req({ + method: "post", + contentType: "application/json;charset=UTF-8", + dataType: "json", + headers: { + 'token': layui.data(setter.tableName)[setter.request.tokenName] + }, + url: setter.baseurl + "adminapi/System/dic/update",//实际使用请改成服务端真实接口 + async: false, + data: JSON.stringify(param), + done: function (res) { + + layui.table.reload("LAY-user-back-dic"), layer.close(i) + } + }) + + }) + }) + } + }) + } + }), e("dic", {}) +}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/controller/nav.js b/AdminSrc/AdminHost/wwwroot/admin/dist/controller/nav.js new file mode 100644 index 0000000..0452daf --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/controller/nav.js @@ -0,0 +1,93 @@ + +layui.define(["table", "admin", "form", 'user', 'tree'], function (e) { + var i = (layui.$, layui.admin), + $ = layui.$, + t = layui.view, + l = layui.treeTable, + r = layui.form, + tree = layui.tree, + admin = layui.admin, + setter = layui.setter; + var treedata = []; + //提交数据 + + l.render({ + elem: "#LAY-user-back-nav", + url: setter.baseurl + "adminapi/System/nav/list", + method: "get", + page: false, + limit: 0, + headers: { + 'token': layui.data(setter.tableName)[setter.request.tokenName] + }, + treeNode:true, + cols: [ + [ + { + field: "name", + title: "名称" + }, { + field: "order", + title: "序号" + }, { + title: "操作", + width: 300, + align: "center", + fixed: "right", + toolbar: "#table-role-admin" + }] + ], + text: "对不起,加载出现异常!" + }), l.on("tool(LAY-user-back-nav)", function (e) { + var l = e.data; + console.log(e.event) + if ("del" === e.event) { + layer.confirm("确定删除此菜单?", function (i) { + //提交数据 + admin.req({ + method: "get", + url: setter.baseurl + "adminapi/System/nav/delete?id=" + e.data.id,//实际使用请改成服务端真实接口 + async: true, + done: function (res) { + + e.del(), layer.close(i) + } + }) + + }) + } + if ("edit" === e.event) { + i.popup({ + title: "编辑菜单", + area: ["500px", "480px"], + id: "LAY-popup-user-add", + success: function (e, i) { + t(this.id).render("user/administrators/navform", l).done(function () { + r.render(null, "layuiadmin-form-nav"), r.on("submit(LAY-user-nav-submit)", function (e) { + + var param = e.field; + param.navid + //提交数据 + admin.req({ + method: "post", + contentType: "application/json;charset=UTF-8", + dataType: "json", + headers: { + 'token': layui.data(setter.tableName)[setter.request.tokenName] + }, + url: setter.baseurl + "adminapi/System/nav/update",//实际使用请改成服务端真实接口 + async: false, + data: JSON.stringify(param), + done: function (res) { + + layui.table.reload("LAY-user-back-nav"), layer.close(i) + } + }) + + }) + }) + } + }) + } + }), e("nav", {}) +}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/controller/productlistjs.js b/AdminSrc/AdminHost/wwwroot/admin/dist/controller/productlistjs.js new file mode 100644 index 0000000..61bddf0 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/controller/productlistjs.js @@ -0,0 +1,175 @@ + +layui.define(["table", "admin", "form"], function (e) { + var i = (layui.$, layui.admin), + $ = layui.$, + t = layui.view, + l = layui.table, + r = layui.form, + + admin = layui.admin, + setter = layui.setter; + + //提交数据 + console.log(setter); + l.render({ + elem: "#LAY-user-back-manage", + url: setter.baseurl + "adminapi/Mall/GetAllProductList", + method: "get", + headers: { + 'token': layui.data(setter.tableName)[setter.request.tokenName] + }, + + cols: [ + [ + { + field: "number", + title: "编号", + templet: function (d) { + return d.productInfo?.number??""; + } + }, + { + field: "name", + title: "名称", + }, { + field: "productName", + title: "产品名称", + templet: function (d) { + + return d.productInfo?.name ?? ""; + } + }, + { + field: "saleInfo", + title: "售价信息", + templet: function (d) { + // 1 钻石 2 房卡 4 金币 5 道具 + var tempName = ""; + if (d.moneySaleInfo != null && d.moneySaleInfo.price > 0) { + tempName += d.moneySaleInfo.price + "元 " + (d.moneySaleInfo.limitCount == 0 ? "不限购" : " 限购"+d.moneySaleInfo.limitCount + "个
"); + } + + + if (d.diamondSaleInfo != null && d.diamondSaleInfo.price > 0) { + tempName += (d.diamondSaleInfo.price + "钻石 " + (d.diamondSaleInfo.limitCount == 0 ? "不限购" : "限购"+d.diamondSaleInfo.limitCount + "个
")); + } + + if (d.scoreSaleInfo != null && d.scoreSaleInfo.price > 0) { + tempName += d.scoreSaleInfo.price + "积分" + (d.scoreSaleInfo.limitCount == 0 ? "不限购" : "限购"+d.scoreSaleInfo.limitCount + "个"); + } + + return tempName + } + + }, { + field: "state", + title: "状态", + templet: function (d) { + if (d.state == 0) + return "下架"; + else + return "上架" + } + }, { + title: "操作", + align: "center", + fixed: "right", + toolbar: "#table-product-admin" + }] + ], + text: "对不起,加载出现异常!", + response: { + statusName: 'code', //数据状态的字段名称,默认:code + statusCode: 0, //成功的状态码,默认:0 + msgName: 'info', //状态信息的字段名称,默认:msg + countName: 'count', //数据总数的字段名称,默认:count + dataName: 'data' //数据列表的字段名称,默认:data + } + }), + + l.on("tool(LAY-user-back-manage)", function (e) { + var l = e.data; + + if ("del" === e.event) { + layer.confirm("确定删除此产品?", function (i) { + //提交数据 + admin.req({ + method: "get", + url: setter.baseurl + "adminapi/Mall/DeleteProduct?id=" + e.data.id,//实际使用请改成服务端真实接口 + async: true, + done: function (res) { + + e.del(), layer.close(i) + } + }) + + }) + } + if ("state" === e.event) { + + admin.req({ + method: "get", + url: setter.baseurl + "adminapi/Mall/UpdateProductState?id=" + e.data.id + "&state=" + (e.data.state == 0 ? 1 : 0),//实际使用请改成服务端真实接口 + async: true, + done: function (res) { + layer.msg("操作成功"); + layui.table.reload("LAY-user-back-manage"); + } + }) + } + if ("edit" === e.event) { + i.popup({ + title: "编辑产品", + area: ["500px", "600px"], + id: "LAY-popup-product-add", + success: function (e, i) { + t(this.id).render("mall/productform", l).done(function () { + + r.render(null, "layuiadmin-form-admin"), r.on("submit(LAY-product-back-submit)", function (data) { + + console.log(data) + var param = { + id: data.field.id, + name: data.field.name, + imageUrl: data.field.imageUrl, + detailType: parseInt(data.field.detailType), + + number: data.field.baseProduct + + }; + + param.moneySaleInfo = { limitCount: data.field.moneyLimitCount, price: parseFloat(data.field.moneyPrice) } + param.diamondSaleInfo = { limitCount: data.field.diamondLimitCount, price: parseFloat(data.field.diamondPrice) } + param.scoreSaleInfo = { limitCount: data.field.scoreLimitCount, price: parseFloat(data.field.scorePrice) } + + //提交数据 + admin.req({ + method: "post", + contentType: "application/json;charset=UTF-8", + dataType: "json", + headers: { + 'token': layui.data(setter.tableName)[setter.request.tokenName] + }, + url: setter.baseurl + "adminapi/mall/UpdateProduct",//实际使用请改成服务端真实接口 + async: false, + data: JSON.stringify(param), + done: function (res) { + + layui.table.reload("LAY-user-back-manage"), layer.close(i) + } + }) + + + + }) + }) + } + }) + } + + + + + + }), e("productlistjs", {}) +}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/controller/set.js b/AdminSrc/AdminHost/wwwroot/admin/dist/controller/set.js new file mode 100644 index 0000000..a567521 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/controller/set.js @@ -0,0 +1,33 @@ +/** layuiAdmin.pro-v1.4.0 LPPL License By https://www.layui.com/admin/ */; +layui.define(["form", "upload"], function (t) { + var i = layui.$, + e = layui.layer, + n = (layui.laytpl, layui.setter, layui.view, layui.admin), + a = layui.form, + s = layui.upload; + i("body"); + a.render(), a.verify({ + nickname: function (t, i) { + return new RegExp("^[a-zA-Z0-9_一-龥\\s·]+$").test(t) ? /(^\_)|(\__)|(\_+$)/.test(t) ? "用户名首尾不能出现下划线'_'" : /^\d+\d+\d$/.test(t) ? "用户名不能全为数字" : void 0 : "用户名不能有特殊字符" + }, + pass: [/^[\S]{6,12}$/, "密码必须6到12位,且不能出现空格"], + repass: function (t) { + if (t !== i("#LAY_password").val()) return "两次密码输入不一致" + } + }); + + a.on("submit(setmypass)", function (t) { + + admin.req({ + method: "get", + url: setter.baseurl + "adminapi/System/user/delete?id=" + e.data.id,//实际使用请改成服务端真实接口 + async: true, + done: function (res) { + + return e.msg("修改成功"), !1 + } + }) + + + }), t("set", {}) +}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/controller/task.js b/AdminSrc/AdminHost/wwwroot/admin/dist/controller/task.js new file mode 100644 index 0000000..571547a --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/controller/task.js @@ -0,0 +1,175 @@ + +layui.define(["table", "admin", "form", 'user', 'tree'], function (e) { + var i = (layui.$, layui.admin), + $ = layui.$, + t = layui.view, + l = layui.table, + r = layui.form, + + admin = layui.admin, + setter = layui.setter; + //提交数据 + + l.render({ + elem: "#LAY-task-back-manage", + url: setter.baseurl + "adminapi/task/GetTaskList", + method: "post", + contentType: "application/json", + page: true, + where: { + keyWord: "", + state: -1 + }, + request: { + pageName: 'pageIndex' //页码的参数名称,默认:page + , limitName: 'pageSize' //每页数据量的参数名,默认:limit + }, + limit: 10, + headers: { + 'token': layui.data(setter.tableName)[setter.request.tokenName] + }, + cols: [ + [ + { + field: "number", + title: "任务编号", + }, { + field: "remark", + title: "任务描述" + }, { + field: "taskType", + title: "任务类型", + templet: function (d) { + if (d.taskType == 1) + return "每日任务"; + + if (d.taskType == 2) + return "在线时长任务"; + } + }, { + field: "taskEvent", + title: "事件", + templet: function (d) { + var tem = ""; + switch (d.taskEvent) { + case 1: tem = "整点在线奖励"; break; + case 2: tem = "在线时长";break; + case 3: tem = "捕获任意鱼";break; + case 4: tem = "捕获黄金鱼";break; + case 5: tem = "捕获Boss鱼"; break; + case 6: tem = "赢取金币"; break; + case 7: tem = "使用狂暴"; break; + case 8: tem = "开炮任务"; break; + case 9: tem = "登录任务"; break; + case 10: tem = "充值任务"; break; + default:tem = "未知";break; + } + + return tem; + } + }, { + field: "taskCount", + title: "任务条件" + } + , { + field: "exp", + title: "战令经验" + } + , { + field: "state", + title: "状态", + templet: function (d) { + if (d.state == 1) + return "启用"; + else + return "禁用" + } + } + , { + width: 240, + title: "操作", + align: "center", + fixed: "right", + toolbar: "#table-taskadmin-admin" + }] + ], + text: "对不起,加载出现异常!", + response: { + statusName: 'code', //数据状态的字段名称,默认:code + statusCode: 0, //成功的状态码,默认:0 + msgName: 'info', //状态信息的字段名称,默认:msg + countName: 'count', //数据总数的字段名称,默认:count + dataName: 'data' //数据列表的字段名称,默认:data + } + }), + + l.on("tool(LAY-task-back-manage)", function (e) { + var l = e.data; + console.log(e.event) + if ("del" === e.event) { + layer.confirm("确定删除此任务?", function (i) { + //提交数据 + admin.req({ + method: "get", + url: setter.baseurl + "adminapi/task/DeleteTask?id=" + e.data.id,//实际使用请改成服务端真实接口 + async: true, + done: function (res) { + + e.del(), layer.close(i) + } + }) + + }) + } + + if ("state" === e.event) { + + admin.req({ + method: "get", + url: setter.baseurl + "adminapi/Task/UpdateTaskState?id=" + e.data.id + "&state=" + (e.data.state == 1 ? 2 :1),//实际使用请改成服务端真实接口 + async: true, + done: function (res) { + layer.msg("操作成功"); + layui.table.reload("LAY-task-back-manage"); + } + }) + } + if ("edit" === e.event) { + i.popup({ + title: "编辑任务", + area: ["500px", "600px"], + id: "LAY-popup-user-add", + success: function (e, i) { + t(this.id).render("config/taskform", l).done(function () { + + r.render(null, "layuiadmin-form-admin"), r.on("submit(LAY-user-back-submit)", function (e) { + + console.log(e.field) + + //提交数据 + admin.req({ + method: "post", + contentType: "application/json;charset=UTF-8", + dataType: "json", + headers: { + 'token': layui.data(setter.tableName)[setter.request.tokenName] + }, + url: setter.baseurl + "adminapi/task/AddTask",//实际使用请改成服务端真实接口 + async: false, + data: JSON.stringify(e.field), + done: function (res) { + + layui.table.reload("LAY-task-back-manage"), layer.close(i) + } + }) + + + + }) + }) + } + }) + } + + }), e("task", {}) +}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/controller/user.js b/AdminSrc/AdminHost/wwwroot/admin/dist/controller/user.js new file mode 100644 index 0000000..d427a1a --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/controller/user.js @@ -0,0 +1,15 @@ +/** layuiAdmin.pro-v1.4.0 LPPL License By https://www.layui.com/admin/ */; +layui.define("form", function (e) { + var t = layui.$, + i = (layui.layer, layui.laytpl, layui.setter, layui.view, layui.admin, layui.form), + a = t("body"); + i.verify({ + nickname: function (e, t) { + return new RegExp("^[a-zA-Z0-9_一-龥\\s·]+$").test(e) ? /(^\_)|(\__)|(\_+$)/.test(e) ? "用户名首尾不能出现下划线'_'" : /^\d+\d+\d$/.test(e) ? "用户名不能全为数字" : void 0 : "用户名不能有特殊字符" + }, + pass: [/^[\S]{6,12}$/, "密码必须6到12位,且不能出现空格"] + }), a.on("click", "#LAY-user-get-vercode", function () { + t(this); + this.src = "https://www.oschina.net/action/user/captcha?t=" + (new Date).getTime() + }), e("user", {}) +}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/controller/useradmin.js b/AdminSrc/AdminHost/wwwroot/admin/dist/controller/useradmin.js new file mode 100644 index 0000000..de6738d --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/controller/useradmin.js @@ -0,0 +1,243 @@ + +layui.define(["table", "admin", "form", 'user', 'tree'], function (e) { + var i = (layui.$, layui.admin), + $ = layui.$, + t = layui.view, + l = layui.table, + r = layui.form, + tree = layui.tree, + admin = layui.admin, + setter = layui.setter; + var treedata = []; + //提交数据 + + l.render({ + elem: "#LAY-user-back-manage", + url: setter.baseurl + "adminapi/System/user/list", + method: "post", + contentType: "application/json", + page: true, + where: { + keyWord: "", + state: -1 + }, + request: { + pageName: 'pageIndex' //页码的参数名称,默认:page + , limitName: 'pageSize' //每页数据量的参数名,默认:limit + }, + limit: 10, + headers: { + 'token': layui.data(setter.tableName)[setter.request.tokenName] + }, + cols: [ + [ + { + field: "userName", + title: "用户名", + }, { + field: "icon", + title: "头像", + templet: function (d) { + if (d.icon == null || d.icon == "") + return ""; + return "" + } + }, { + field: "displayName", + title: "名字" + }, { + field: "state", + title: "状态", + templet: function (d) { + if (d.state == 0) + return "禁用"; + else + return "正常" + } + }, { + field: "systemRole", + title: "角色", + templet: function (d) { + if (d.systemRole == null) + return "未选择" + return d.systemRole.name + } + }, { + field: "registerTime", + title: "加入时间", + sort: !0 + }, { + title: "操作", + align: "center", + fixed: "right", + toolbar: "#table-useradmin-admin" + }] + ], + text: "对不起,加载出现异常!", + response: { + statusName: 'code', //数据状态的字段名称,默认:code + statusCode: 0, //成功的状态码,默认:0 + msgName: 'info', //状态信息的字段名称,默认:msg + countName: 'count', //数据总数的字段名称,默认:count + dataName: 'data' //数据列表的字段名称,默认:data + } + }), + + l.on("tool(LAY-user-back-manage)", function (e) { + var l = e.data; + console.log(e.event) + if ("del" === e.event) { + layer.confirm("确定删除此管理员?", function (i) { + //提交数据 + admin.req({ + method: "get", + url: setter.baseurl + "adminapi/System/user/delete?id=" + e.data.id,//实际使用请改成服务端真实接口 + async: true, + done: function (res) { + + e.del(), layer.close(i) + } + }) + + }) + } + if ("edit" === e.event) { + i.popup({ + title: "编辑管理员", + area: ["500px", "600px"], + id: "LAY-popup-user-add", + success: function (e, i) { + t(this.id).render("user/administrators/adminform", l).done(function () { + + r.render(null, "layuiadmin-form-admin"), r.on("submit(LAY-user-back-submit)", function (e) { + + var param = { + id: e.field.id, + userName: e.field.userName, + displayName: e.field.displayName, + icon: e.field.icon, + password: e.field.password, + systemRole: { + id: e.field.systemRole, + name: $('#systemRole option:selected').text() + } + }; + + //提交数据 + admin.req({ + method: "post", + contentType: "application/json;charset=UTF-8", + dataType: "json", + headers: { + 'token': layui.data(setter.tableName)[setter.request.tokenName] + }, + url: setter.baseurl + "adminapi/System/user/update",//实际使用请改成服务端真实接口 + async: false, + data: JSON.stringify(param), + done: function (res) { + + layui.table.reload("LAY-user-back-manage"), layer.close(i) + } + }) + + + + }) + }) + } + }) + } + + }), l.render({ + elem: "#LAY-user-back-role", + url: setter.baseurl + "adminapi/System/role/list", + method: "get", + page: false, + limit: 0, + headers: { + 'token': layui.data(setter.tableName)[setter.request.tokenName] + }, + cols: [ + [ + { + field: "roleName", + title: "角色名" + }, { + field: "description", + title: "具体描述" + }, { + title: "操作", + width: 300, + align: "center", + fixed: "right", + toolbar: "#table-useradmin-admin" + }] + ], + text: "对不起,加载出现异常!" + }), l.on("tool(LAY-user-back-role)", function (e) { + var l = e.data; + console.log(e.event) + if ("del" === e.event) { + layer.confirm("确定删除此角色?", function (i) { + //提交数据 + admin.req({ + method: "get", + url: setter.baseurl + "adminapi/System/role/delete?id=" + e.data.id,//实际使用请改成服务端真实接口 + async: true, + done: function (res) { + + e.del(), layer.close(i) + } + }) + + }) + } + if ("edit" === e.event) { + i.popup({ + title: "编辑角色", + area: ["500px", "480px"], + id: "LAY-popup-user-add", + success: function (e, i) { + t(this.id).render("user/administrators/roleform", l).done(function () { + r.render(null, "layuiadmin-form-role"), r.on("submit(LAY-user-role-submit)", function (e) { + + var param = e.field; + param.navid + //提交数据 + admin.req({ + method: "post", + contentType: "application/json;charset=UTF-8", + dataType: "json", + headers: { + 'token': layui.data(setter.tableName)[setter.request.tokenName] + }, + url: setter.baseurl + "adminapi/System/role/update",//实际使用请改成服务端真实接口 + async: false, + data: JSON.stringify(param), + done: function (res) { + + layui.table.reload("LAY-user-back-role"), layer.close(i) + } + }) + + }) + }) + } + }) + } + if ("role" === e.event) { + i.popup({ + title: "编辑权限", + area: ["500px", "600px"], + id: "LAY-popup-user-tree-add", + success: function (e, i) { + t(this.id).render("user/administrators/roletree", l).done(function () { + + + + }) + } + }) + } + }), e("useradmin", {}) +}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/index.js b/AdminSrc/AdminHost/wwwroot/admin/dist/index.js new file mode 100644 index 0000000..ddd28e1 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/index.js @@ -0,0 +1,89 @@ +/** layuiAdmin.pro-v1.4.0 LPPL License By https://www.layui.com/admin/ */; +layui.extend({ + setter: "config", + admin: "lib/admin", + view: "lib/view" +}).define(["setter", "admin"], function (e) { + var a = layui.setter, + n = layui.element, + i = layui.admin, + t = i.tabsPage, + l = layui.view, + o = function () { + var e = layui.router(), + r = e.path, + y = i.correctRouter(e.path.join("/")); + r.length || (r = [""]), "" === r[r.length - 1] && (r[r.length - 1] = a.entry); + var h = function (e) { + o.haveInit && d(".layui-layer").each(function () { + var e = d(this), + a = e.attr("times"); + e.hasClass("layui-layim") || layer.close(a) + }), o.haveInit = !0, d(s).scrollTop(0), delete t.type + }; + return "tab" === t.type && ("/" !== y || "/" === y && i.tabsBody().html()) ? (i.tabsBodyChange(t.index), h(t.type)) : (l().render(r.join("/")).then(function (l) { + var o, r = d("#LAY_app_tabsheader>li"); + r.each(function (e) { + var a = d(this), + n = a.attr("lay-id"); + n === y && (o = !0, t.index = e) + }), a.pageTabs && "/" !== y && (o || (d(s).append('
'), t.index = r.length, n.tabAdd(u, { + title: "" + (l.title || "新标签页") + "", + id: y, + attr: e.href + }))), this.container = i.tabsBody(t.index), a.pageTabs || this.container.scrollTop(0), n.tabChange(u, y), i.tabsBodyChange(t.index) + }).done(function () { + layui.use("common", layui.cache.callback.common), c.on("resize", layui.data.resize), n.render("breadcrumb", "breadcrumb"), i.tabsBody(t.index).on("scroll", function () { + var e = d(this), + a = d(".layui-laydate"), + n = d(".layui-layer")[0]; + a[0] && (a.each(function () { + var e = d(this); + e.hasClass("layui-laydate-static") || e.remove() + }), e.find("input").blur()), n && layer.closeAll("tips") + }) + }), void h()) + }, + r = function (e) { + var n, t = layui.router(), + r = l(a.container), + s = i.correctRouter(t.path.join("/")); + if (layui.each(a.indPage, function (e, a) { + if (s === a) return n = !0 + }), layui.config({ + base: a.base + "controller/" + }), n || "/user/login" === s) r.render(t.path.join("/")).done(function () { + i.pageType = "alone" + }); + else { + if (a.interceptor) { + var u = layui.data(a.tableName); + if (!u[a.request.tokenName]) return location.hash = "/user/login/redirect=" + encodeURIComponent(s) + } + "console" === i.pageType ? o() : r.render("layout").done(function () { + o(), layui.element.render(), i.screen() < 2 && i.sideFlexible(), i.pageType = "console" + }) + } + }, + s = "#LAY_app_body", + u = "layadmin-layout-tabs", + d = layui.$, + c = d(window); + layui.link(a.base + "style/admin.css?v=" + (i.v + "-1"), function () { + r() + }, "layuiAdmin"), window.onhashchange = function () { + // 只在首次加载时渲染layout,之后只切换tab + if (!o.haveInit) { + r(); + } else { + // 已经初始化,只切换到对应tab + o(); + } + layui.event.call(this, a.MOD_NAME, "hash({*})", layui.router()) + }, layui.each(a.extend, function (e, n) { + var i = {}; + i[n] = "{/}" + a.base + "lib/extend/" + n, layui.extend(i) + }), e("index", { + render: o + }) +}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/lib/admin.js b/AdminSrc/AdminHost/wwwroot/admin/dist/lib/admin.js new file mode 100644 index 0000000..58d8492 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/lib/admin.js @@ -0,0 +1,2 @@ +/** layuiAdmin.pro-v1.4.0 LPPL License By https://www.layui.com/admin/ */ +;layui.define("view",function(e){var a=layui.jquery,t=layui.laytpl,i=layui.element,n=layui.setter,l=layui.view,s=layui.device(),r=a(window),o=a("body"),u=a("#"+n.container),c="layui-show",d="layui-this",y="layui-disabled",m="#LAY_app_body",f="LAY_app_flexible",h="layadmin-side-spread-sm",p="layadmin-tabsbody-item",v="layui-icon-shrink-right",b="layui-icon-spread-left",g="layadmin-side-shrink",x="LAY-system-side-menu",C={v:"1.4.0 pro",req:l.req,exit:l.exit,escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},on:function(e,a){return layui.onevent.call(this,n.MOD_NAME,e,a)},popup:l.popup,popupRight:function(e){return C.popup.index=layer.open(a.extend({type:1,id:"LAY_adminPopupR",anim:-1,title:!1,closeBtn:!1,offset:"r",shade:.1,shadeClose:!0,skin:"layui-anim layui-anim-rl layui-layer-adminRight",area:"300px"},e))},sendAuthCode:function(e){e=a.extend({seconds:60,elemPhone:"#LAY_phone",elemVercode:"#LAY_vercode"},e);var t,i=e.seconds,n=function(l){var s=a(e.elem);i--,i<0?(s.removeClass(y).html("获取验证码"),i=e.seconds,clearInterval(t)):s.addClass(y).html(i+"秒后重获"),l||(t=setInterval(function(){n(!0)},1e3))};o.off("click",e.elem).on("click",e.elem,function(){e.elemPhone=a(e.elemPhone),e.elemVercode=a(e.elemVercode);var t=e.elemPhone,l=t.val();if(i===e.seconds&&!a(this).hasClass(y)){if(!/^1\d{10}$/.test(l))return t.focus(),layer.msg("请输入正确的手机号");if("object"==typeof e.ajax){var s=e.ajax.success;delete e.ajax.success}C.req(a.extend(!0,{url:"/auth/code",type:"get",data:{phone:l},success:function(a){layer.msg("验证码已发送至你的手机,请注意查收",{icon:1,shade:0}),e.elemVercode.focus(),n(),s&&s(a)}},e.ajax))}})},screen:function(){var e=r.width();return e>1200?3:e>992?2:e>768?1:0},sideFlexible:function(e){var t=u,i=a("#"+f),l=C.screen();"spread"===e?(i.removeClass(b).addClass(v),l<2?t.addClass(h):t.removeClass(h),t.removeClass(g)):(i.removeClass(v).addClass(b),l<2?t.removeClass(g):t.addClass(g),t.removeClass(h)),layui.event.call(this,n.MOD_NAME,"side({*})",{status:e})},resizeTable:function(e){var t=this,i=function(){t.tabsBody(C.tabsPage.index).find(".layui-table-view").each(function(){var e=a(this).attr("lay-id");layui.table.resize(e)})};layui.table&&(e?setTimeout(i,e):i())},theme:function(e){var i=(n.theme,layui.data(n.tableName)),l="LAY_layadmin_theme",s=document.createElement("style"),r=t([".layui-side-menu,",".layadmin-pagetabs .layui-tab-title li:after,",".layadmin-pagetabs .layui-tab-title li.layui-this:after,",".layui-layer-admin .layui-layer-title,",".layadmin-side-shrink .layui-side-menu .layui-nav>.layui-nav-item>.layui-nav-child","{background-color:{{d.color.main}} !important;}",".layui-nav-tree .layui-this,",".layui-nav-tree .layui-this>a,",".layui-nav-tree .layui-nav-child dd.layui-this,",".layui-nav-tree .layui-nav-child dd.layui-this a","{background-color:{{d.color.selected}} !important;}",".layui-layout-admin .layui-logo{background-color:{{d.color.logo || d.color.main}} !important;}","{{# if(d.color.header){ }}",".layui-layout-admin .layui-header{background-color:{{ d.color.header }};}",".layui-layout-admin .layui-header a,",".layui-layout-admin .layui-header a cite{color: #f8f8f8;}",".layui-layout-admin .layui-header a:hover{color: #fff;}",".layui-layout-admin .layui-header .layui-nav .layui-nav-more{border-top-color: #fbfbfb;}",".layui-layout-admin .layui-header .layui-nav .layui-nav-mored{border-color: transparent; border-bottom-color: #fbfbfb;}",".layui-layout-admin .layui-header .layui-nav .layui-this:after, .layui-layout-admin .layui-header .layui-nav-bar{background-color: #fff; background-color: rgba(255,255,255,.5);}",".layadmin-pagetabs .layui-tab-title li:after{display: none;}","{{# } }}"].join("")).render(e=a.extend({},i.theme,e)),u=document.getElementById(l);"styleSheet"in s?(s.setAttribute("type","text/css"),s.styleSheet.cssText=r):s.innerHTML=r,s.id=l,u&&o[0].removeChild(u),o[0].appendChild(s),o.attr("layadmin-themealias",e.color.alias),i.theme=i.theme||{},layui.each(e,function(e,a){i.theme[e]=a}),layui.data(n.tableName,{key:"theme",value:i.theme})},initTheme:function(e){var a=n.theme;e=e||0,a.color[e]&&(a.color[e].index=e,C.theme({color:a.color[e]}))},tabsPage:{},tabsHeader:function(e){return a("#LAY_app_tabsheader").children("li").eq(e||0)},tabsBody:function(e){return a(m).find("."+p).eq(e||0)},tabsBodyChange:function(e){C.tabsHeader(e).attr("lay-attr",layui.router().href),C.tabsBody(e).addClass(c).siblings().removeClass(c),k.rollPage("auto",e)},resize:function(e){var a=layui.router(),t=a.path.join("-");C.resizeFn[t]&&(r.off("resize",C.resizeFn[t]),delete C.resizeFn[t]),"off"!==e&&(e(),C.resizeFn[t]=e,r.on("resize",C.resizeFn[t]))},resizeFn:{},runResize:function(){var e=layui.router(),a=e.path.join("-");C.resizeFn[a]&&C.resizeFn[a]()},delResize:function(){this.resize("off")},closeThisTabs:function(){C.tabsPage.index&&a(z).eq(C.tabsPage.index).find(".layui-tab-close").trigger("click")},fullScreen:function(){var e=document.documentElement,a=e.requestFullScreen||e.webkitRequestFullScreen||e.mozRequestFullScreen||e.msRequestFullscreen;"undefined"!=typeof a&&a&&a.call(e)},exitScreen:function(){document.documentElement;document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()},correctRouter:function(e){return/^\//.test(e)||(e="/"+e),e.replace(/^(\/+)/,"/").replace(new RegExp("/"+n.entry+"$"),"/")}},k=C.events={flexible:function(e){var a=e.find("#"+f),t=a.hasClass(b);C.sideFlexible(t?"spread":null),C.resizeTable(350)},refresh:function(){layui.index.render()},serach:function(e){e.off("keypress").on("keypress",function(a){if(this.value.replace(/\s/g,"")&&13===a.keyCode){var t=e.attr("lay-action"),i=e.attr("lay-text")||"搜索";t+=this.value,i=i+' '+C.escape(this.value)+"",location.hash=C.correctRouter(t),k.serach.keys||(k.serach.keys={}),k.serach.keys[C.tabsPage.index]=this.value,this.value===k.serach.keys[C.tabsPage.index]&&k.refresh(e),this.value=""}})},message:function(e){e.find(".layui-badge-dot").remove()},theme:function(){C.popupRight({id:"LAY_adminPopupTheme",success:function(){l(this.id).render("system/theme")}})},note:function(e){var a=C.screen()<2,t=layui.data(n.tableName).note;k.note.index=C.popup({title:"便签",shade:0,offset:["41px",a?null:e.offset().left-250+"px"],anim:-1,id:"LAY_adminNote",skin:"layadmin-note layui-anim layui-anim-upbit",content:'',resize:!1,success:function(e,a){var i=e.find("textarea"),l=void 0===t?"便签中的内容会存储在本地,这样即便你关掉了浏览器,在下次打开时,依然会读取到上一次的记录。是个非常小巧实用的本地备忘录":t;i.val(l).focus().on("keyup",function(){layui.data(n.tableName,{key:"note",value:this.value})})}})},fullscreen:function(e){var a="layui-icon-screen-full",t="layui-icon-screen-restore",i=e.children("i");i.hasClass(a)?(C.fullScreen(),i.addClass(t).removeClass(a)):(C.exitScreen(),i.addClass(a).removeClass(t))},about:function(){C.popupRight({id:"LAY_adminPopupAbout",success:function(){l(this.id).render("system/about")}})},more:function(){C.popupRight({id:"LAY_adminPopupMore",success:function(){l(this.id).render("system/more")}})},back:function(){history.back()},setTheme:function(e){var a=e.data("index");e.siblings(".layui-this").data("index");e.hasClass(d)||(e.addClass(d).siblings(".layui-this").removeClass(d),C.initTheme(a))},rollPage:function(e,t){var i=a("#LAY_app_tabsheader"),n=i.children("li"),l=(i.prop("scrollWidth"),i.outerWidth()),s=parseFloat(i.css("left"));if("left"===e){if(!s&&s<=0)return;var r=-s-l;n.each(function(e,t){var n=a(t),l=n.position().left;if(l>=r)return i.css("left",-l),!1})}else"auto"===e?!function(){var e,r=n.eq(t);if(r[0]){if(e=r.position().left,e<-s)return i.css("left",-e);if(e+r.outerWidth()>=l-s){var o=e+r.outerWidth()-(l-s);n.each(function(e,t){var n=a(t),l=n.position().left;if(l+s>0&&l-s>o)return i.css("left",-l),!1})}}}():n.each(function(e,t){var n=a(t),r=n.position().left;if(r+n.outerWidth()>=l-s)return i.css("left",-r),!1})},leftPage:function(){k.rollPage("left")},rightPage:function(){k.rollPage()},closeThisTabs:function(){C.closeThisTabs()},closeOtherTabs:function(e){var t="LAY-system-pagetabs-remove";"all"===e?(a(z+":gt(0)").remove(),a(m).find("."+p+":gt(0)").remove()):(a(z).each(function(e,i){e&&e!=C.tabsPage.index&&(a(i).addClass(t),C.tabsBody(e).addClass(t))}),a("."+t).remove())},closeAllTabs:function(){k.closeOtherTabs("all"),location.hash=""},shade:function(){C.sideFlexible()},update:function(){a.ajax({type:"get",dataType:"jsonp",data:{name:"layuiAdmin",version:C.v},url:"https://fly.layui.com/adminapi/product_update/",success:function(e){0===e.status?e.version===C.v.replace(/\s|pro|std/g,"")?layer.alert("当前版本已经是最新版本"):layer.alert("检查到更新,是否前往下载?",{btn:["更新","暂不"]},function(e){layer.close(e),layer.open({type:2,content:"https://fly.layui.com/user/product/",area:["100%","100%"],title:"检查更新"})}):1==e.status?layer.alert(e.msg,{btn:["登入","暂不"]},function(e){layer.close(e),layer.open({type:2,content:"https://fly.layui.com/user/login/",area:["100%","100%"],title:"检查更新"})}):layer.msg(e.msg||e.code,{shift:6})},error:function(e){layer.msg("请求异常,请重试",{shift:6})}})}};!function(){var e=layui.data(n.tableName);e.theme?C.theme(e.theme):n.theme&&C.initTheme(n.theme.initColorIndex),o.addClass("layui-layout-body"),C.screen()<1&&delete n.pageTabs,n.pageTabs||u.addClass("layadmin-tabspage-none"),s.ie&&s.ie<10&&l.error("IE"+s.ie+"下访问可能不佳,推荐使用:Chrome / Firefox / Edge 等高级浏览器",{offset:"auto",id:"LAY_errorIE"})}(),C.on("hash(side)",function(e){var t=e.path,i=function(e){return{list:e.children(".layui-nav-child"),name:e.data("name"),jump:e.data("jump")}},n=a("#"+x),l="layui-nav-itemed",s=function(e){var n=C.correctRouter(t.join("/"));e.each(function(e,s){var r=a(s),o=i(r),u=o.list.children("dd"),c=t[0]==o.name||0===e&&!t[0]||o.jump&&n==C.correctRouter(o.jump);if(u.each(function(e,s){var r=a(s),u=i(r),c=u.list.children("dd"),y=t[0]==o.name&&t[1]==u.name||u.jump&&n==C.correctRouter(u.jump);if(c.each(function(e,s){var r=a(s),c=i(r),y=t[0]==o.name&&t[1]==u.name&&t[2]==c.name||c.jump&&n==C.correctRouter(c.jump);if(y){var m=c.list[0]?l:d;return r.addClass(m).siblings().removeClass(m),!1}}),y){var m=u.list[0]?l:d;return r.addClass(m).siblings().removeClass(m),!1}}),c){var y=o.list[0]?l:d;return r.addClass(y).siblings().removeClass(y),!1}})};n.find("."+d).removeClass(d),s(n.children("li"))}),i.on("nav(layadmin-system-side-menu)",function(e){e.siblings(".layui-nav-child")[0]&&u.hasClass(g)&&(C.sideFlexible("spread"),layer.close(e.data("index"))),C.tabsPage.type="nav"}),i.on("nav(layadmin-pagetabs-nav)",function(e){var a=e.parent();a.removeClass(d),a.parent().removeClass(c)});var F=function(e){var a=e.attr("lay-id"),t=e.attr("lay-attr"),i=e.index();location.hash=a===n.entry?"/":t||"/",C.tabsBodyChange(i)},z="#LAY_app_tabsheader>li";o.on("click",z,function(){var e=a(this),t=e.index();return C.tabsPage.type="tab",C.tabsPage.index=t,"iframe"===e.attr("lay-attr")?C.tabsBodyChange(t):(F(e),C.runResize(),void C.resizeTable())}),i.on("tabDelete(layadmin-layout-tabs)",function(e){var t=a(z+".layui-this");e.index&&C.tabsBody(e.index).remove(),F(t),C.delResize()}),o.on("click","*[lay-href]",function(){var e=a(this),t=e.attr("lay-href"),i=layui.router();C.tabsPage.elem=e,location.hash=C.correctRouter(t),C.correctRouter(t)===i.href&&C.events.refresh()}),o.on("click","*[layadmin-event]",function(){var e=a(this),t=e.attr("layadmin-event");k[t]&&k[t].call(this,e)}),o.on("mouseenter","*[lay-tips]",function(){var e=a(this);if(!e.parent().hasClass("layui-nav-item")||u.hasClass(g)){var t=e.attr("lay-tips"),i=e.attr("lay-offset"),n=e.attr("lay-direction"),l=layer.tips(t,this,{tips:n||1,time:-1,success:function(e,a){i&&e.css("margin-left",i+"px")}});e.data("index",l)}}).on("mouseleave","*[lay-tips]",function(){layer.close(a(this).data("index"))});var A=layui.data.resizeSystem=function(){layer.closeAll("tips"),A.lock||setTimeout(function(){C.sideFlexible(C.screen()<2?"":"spread"),delete A.lock},100),A.lock=!0};r.on("resize",layui.data.resizeSystem),e("admin",C)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/lib/extend/echarts.js b/AdminSrc/AdminHost/wwwroot/admin/dist/lib/extend/echarts.js new file mode 100644 index 0000000..7af448c --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/lib/extend/echarts.js @@ -0,0 +1,39 @@ +!function(e){var t,i;!function(){function e(e,t){if(!t)return e;if(0===e.indexOf(".")){var i=t.split("/"),n=e.split("/"),a=i.length-1,o=n.length,r=0,s=0;e:for(var l=0;o>l;l++)switch(n[l]){case"..":if(!(a>r))break e;r++,s++;break;case".":s++;break;default:break e}return i.length=a-r,n=n.slice(s),i.concat(n).join("/")}return e}function n(t){function i(i,r){if("string"==typeof i){var s=n[i];return s||(s=o(e(i,t)),n[i]=s),s}i instanceof Array&&(r=r||function(){},r.apply(this,a(i,r,t)))}var n={};return i}function a(i,n,a){for(var s=[],l=r[a],h=0,m=Math.min(i.length,n.length);m>h;h++){var V,U=e(i[h],a);switch(U){case"require":V=l&&l.require||t;break;case"exports":V=l.exports;break;case"module":V=l;break;default:V=o(U)}s.push(V)}return s}function o(e){var t=r[e];if(!t)throw new Error("No "+e);if(!t.defined){var i=t.factory,n=i.apply(this,a(t.deps||[],i,e));"undefined"!=typeof n&&(t.exports=n),t.defined=1}return t.exports}var r={};i=function(e,t,i){r[e]={id:e,deps:t,factory:i,defined:0,exports:{},require:n(e)}},t=n("")}(),i("echarts",["echarts/echarts"],function(e){return e}),i("echarts/echarts",["require","./config","zrender/tool/util","zrender/tool/event","zrender/tool/env","zrender","zrender/config","./chart/island","./component/toolbox","./component","./component/title","./component/tooltip","./component/legend","./util/ecData","./chart","zrender/tool/color","./component/timeline","zrender/shape/Image","zrender/loadingEffect/Bar","zrender/loadingEffect/Bubble","zrender/loadingEffect/DynamicLine","zrender/loadingEffect/Ring","zrender/loadingEffect/Spin","zrender/loadingEffect/Whirling","./theme/macarons","./theme/infographic"],function(e){function t(){r.Dispatcher.call(this)}function i(e){e.innerHTML="",this._themeConfig={},this.dom=e,this._connected=!1,this._status={dragIn:!1,dragOut:!1,needRefresh:!1},this._curEventType=!1,this._chartList=[],this._messageCenter=new t,this._messageCenterOutSide=new t,this.resize=this.resize(),this._init()}function n(e,t,i,n,a){for(var o=e._chartList,r=o.length;r--;){var s=o[r];"function"==typeof s[t]&&s[t](i,n,a)}}var a=e("./config"),o=e("zrender/tool/util"),r=e("zrender/tool/event"),s={},l=e("zrender/tool/env").canvasSupported,h=new Date-0,m={},V="_echarts_instance_";s.version="2.2.7",s.dependencies={zrender:"2.1.1"},s.init=function(t,n){var a=e("zrender");a.version.replace(".","")-0r;r++){var l=d[r],h=U[l];o[h]="_on"+l.toLowerCase(),i.on(h,this._onzrevent)}this.chart={},this.component={};var m=e("./chart/island");this._island=new m(this._themeConfig,this._messageCenter,i,{},this),this.chart.island=this._island;var V=e("./component/toolbox");this._toolbox=new V(this._themeConfig,this._messageCenter,i,{},this),this.component.toolbox=this._toolbox;var p=e("./component");p.define("title",e("./component/title")),p.define("tooltip",e("./component/tooltip")),p.define("legend",e("./component/legend")),(0===i.getWidth()||0===i.getHeight())&&console.error("Dom’s width & height should be ready before init.")},__onevent:function(e){e.__echartsId=e.__echartsId||this.id;var t=e.__echartsId===this.id;switch(this._curEventType||(this._curEventType=e.type),e.type){case a.EVENT.LEGEND_SELECTED:this._onlegendSelected(e);break;case a.EVENT.DATA_ZOOM:if(!t){var i=this.component.dataZoom;i&&(i.silence(!0),i.absoluteZoom(e.zoom),i.silence(!1))}this._ondataZoom(e);break;case a.EVENT.DATA_RANGE:t&&this._ondataRange(e);break;case a.EVENT.MAGIC_TYPE_CHANGED:if(!t){var n=this.component.toolbox;n&&(n.silence(!0),n.setMagicType(e.magicType),n.silence(!1))}this._onmagicTypeChanged(e);break;case a.EVENT.DATA_VIEW_CHANGED:t&&this._ondataViewChanged(e);break;case a.EVENT.TOOLTIP_HOVER:t&&this._tooltipHover(e);break;case a.EVENT.RESTORE:this._onrestore();break;case a.EVENT.REFRESH:t&&this._onrefresh(e);break;case a.EVENT.TOOLTIP_IN_GRID:case a.EVENT.TOOLTIP_OUT_GRID:if(t){if(this._connected){var o=this.component.grid;o&&(e.x=(e.event.zrenderX-o.getX())/o.getWidth(),e.y=(e.event.zrenderY-o.getY())/o.getHeight())}}else{var o=this.component.grid;o&&this._zr.trigger("mousemove",{connectTrigger:!0,zrenderX:o.getX()+e.x*o.getWidth(),zrenderY:o.getY()+e.y*o.getHeight()})}}if(this._connected&&t&&this._curEventType===e.type){for(var r in this._connected)this._connected[r].connectedEventHandler(e);this._curEventType=null}(!t||!this._connected&&t)&&(this._curEventType=null)},_onclick:function(e){if(n(this,"onclick",e),e.target){var t=this._eventPackage(e.target);t&&null!=t.seriesIndex&&this._messageCenter.dispatch(a.EVENT.CLICK,e.event,t,this)}},_ondblclick:function(e){if(n(this,"ondblclick",e),e.target){var t=this._eventPackage(e.target);t&&null!=t.seriesIndex&&this._messageCenter.dispatch(a.EVENT.DBLCLICK,e.event,t,this)}},_onmouseover:function(e){if(e.target){var t=this._eventPackage(e.target);t&&null!=t.seriesIndex&&this._messageCenter.dispatch(a.EVENT.HOVER,e.event,t,this)}},_onmouseout:function(e){if(e.target){var t=this._eventPackage(e.target);t&&null!=t.seriesIndex&&this._messageCenter.dispatch(a.EVENT.MOUSEOUT,e.event,t,this)}},_ondragstart:function(e){this._status={dragIn:!1,dragOut:!1,needRefresh:!1},n(this,"ondragstart",e)},_ondragenter:function(e){n(this,"ondragenter",e)},_ondragover:function(e){n(this,"ondragover",e)},_ondragleave:function(e){n(this,"ondragleave",e)},_ondrop:function(e){n(this,"ondrop",e,this._status),this._island.ondrop(e,this._status)},_ondragend:function(e){if(n(this,"ondragend",e,this._status),this._timeline&&this._timeline.ondragend(e,this._status),this._island.ondragend(e,this._status),this._status.needRefresh){this._syncBackupData(this._option);var t=this._messageCenter;t.dispatch(a.EVENT.DATA_CHANGED,e.event,this._eventPackage(e.target),this),t.dispatch(a.EVENT.REFRESH,null,null,this)}},_onlegendSelected:function(e){this._status.needRefresh=!1,n(this,"onlegendSelected",e,this._status),this._status.needRefresh&&this._messageCenter.dispatch(a.EVENT.REFRESH,null,null,this)},_ondataZoom:function(e){this._status.needRefresh=!1,n(this,"ondataZoom",e,this._status),this._status.needRefresh&&this._messageCenter.dispatch(a.EVENT.REFRESH,null,null,this)},_ondataRange:function(e){this._clearEffect(),this._status.needRefresh=!1,n(this,"ondataRange",e,this._status),this._status.needRefresh&&this._zr.refreshNextFrame()},_onmagicTypeChanged:function(){this._clearEffect(),this._render(this._toolbox.getMagicOption())},_ondataViewChanged:function(e){this._syncBackupData(e.option),this._messageCenter.dispatch(a.EVENT.DATA_CHANGED,null,e,this),this._messageCenter.dispatch(a.EVENT.REFRESH,null,null,this)},_tooltipHover:function(e){var t=[];n(this,"ontooltipHover",e,t)},_onrestore:function(){this.restore()},_onrefresh:function(e){this._refreshInside=!0,this.refresh(e),this._refreshInside=!1},_syncBackupData:function(e){this.component.dataZoom&&this.component.dataZoom.syncBackupData(e)},_eventPackage:function(t){if(t){var i=e("./util/ecData"),n=i.get(t,"seriesIndex"),a=i.get(t,"dataIndex");return a=-1!=n&&this.component.dataZoom?this.component.dataZoom.getRealDataIndex(n,a):a,{seriesIndex:n,seriesName:(i.get(t,"series")||{}).name,dataIndex:a,data:i.get(t,"data"),name:i.get(t,"name"),value:i.get(t,"value"),special:i.get(t,"special")}}},_noDataCheck:function(e){for(var t=e.series,i=0,n=t.length;n>i;i++)if(t[i].type==a.CHART_TYPE_MAP||t[i].data&&t[i].data.length>0||t[i].markPoint&&t[i].markPoint.data&&t[i].markPoint.data.length>0||t[i].markLine&&t[i].markLine.data&&t[i].markLine.data.length>0||t[i].nodes&&t[i].nodes.length>0||t[i].links&&t[i].links.length>0||t[i].matrix&&t[i].matrix.length>0||t[i].eventList&&t[i].eventList.length>0)return!1;var o=this._option&&this._option.noDataLoadingOption||this._themeConfig.noDataLoadingOption||a.noDataLoadingOption||{text:this._option&&this._option.noDataText||this._themeConfig.noDataText||a.noDataText,effect:this._option&&this._option.noDataEffect||this._themeConfig.noDataEffect||a.noDataEffect};return this.clear(),this.showLoading(o),!0},_render:function(t){if(this._mergeGlobalConifg(t),!this._noDataCheck(t)){var i=t.backgroundColor;if(i)if(l||-1==i.indexOf("rgba"))this.dom.style.backgroundColor=i;else{var n=i.split(",");this.dom.style.filter="alpha(opacity="+100*n[3].substring(0,n[3].lastIndexOf(")"))+")",n.length=3,n[0]=n[0].replace("a",""),this.dom.style.backgroundColor=n.join(",")+")"}this._zr.clearAnimation(),this._chartList=[];var o=e("./chart"),r=e("./component");(t.xAxis||t.yAxis)&&(t.grid=t.grid||{},t.dataZoom=t.dataZoom||{});for(var s,h,m,V=["title","legend","tooltip","dataRange","roamController","grid","dataZoom","xAxis","yAxis","polar"],U=0,d=V.length;d>U;U++)h=V[U],m=this.component[h],t[h]?(m?m.refresh&&m.refresh(t):(s=r.get(/^[xy]Axis$/.test(h)?"axis":h),m=new s(this._themeConfig,this._messageCenter,this._zr,t,this,h),this.component[h]=m),this._chartList.push(m)):m&&(m.dispose(),this.component[h]=null,delete this.component[h]);for(var p,c,u,y={},U=0,d=t.series.length;d>U;U++)c=t.series[U].type,c?y[c]||(y[c]=!0,p=o.get(c),p?(this.chart[c]?(u=this.chart[c],u.refresh(t)):u=new p(this._themeConfig,this._messageCenter,this._zr,t,this),this._chartList.push(u),this.chart[c]=u):console.error(c+" has not been required.")):console.error("series["+U+"] chart type has not been defined.");for(c in this.chart)c==a.CHART_TYPE_ISLAND||y[c]||(this.chart[c].dispose(),this.chart[c]=null,delete this.chart[c]);this.component.grid&&this.component.grid.refixAxisShape(this.component),this._island.refresh(t),this._toolbox.refresh(t),t.animation&&!t.renderAsImage?this._zr.refresh():this._zr.render();var g="IMG"+this.id,b=document.getElementById(g);t.renderAsImage&&l?(b?b.src=this.getDataURL(t.renderAsImage):(b=this.getImage(t.renderAsImage),b.id=g,b.style.position="absolute",b.style.left=0,b.style.top=0,this.dom.firstChild.appendChild(b)),this.un(),this._zr.un(),this._disposeChartList(),this._zr.clear()):b&&b.parentNode.removeChild(b),b=null,this._option=t}},restore:function(){this._clearEffect(),this._option=o.clone(this._optionRestore),this._disposeChartList(),this._island.clear(),this._toolbox.reset(this._option,!0),this._render(this._option)},refresh:function(e){this._clearEffect(),e=e||{};var t=e.option;!this._refreshInside&&t&&(t=this.getOption(),o.merge(t,e.option,!0),o.merge(this._optionRestore,e.option,!0),this._toolbox.reset(t)),this._island.refresh(t),this._toolbox.refresh(t),this._zr.clearAnimation();for(var i=0,n=this._chartList.length;n>i;i++)this._chartList[i].refresh&&this._chartList[i].refresh(t);this.component.grid&&this.component.grid.refixAxisShape(this.component),this._zr.refresh()},_disposeChartList:function(){this._clearEffect(),this._zr.clearAnimation();for(var e=this._chartList.length;e--;){var t=this._chartList[e];if(t){var i=t.type;this.chart[i]&&delete this.chart[i],this.component[i]&&delete this.component[i],t.dispose&&t.dispose()}}this._chartList=[]},_mergeGlobalConifg:function(t){for(var i=["backgroundColor","calculable","calculableColor","calculableHolderColor","nameConnector","valueConnector","animation","animationThreshold","animationDuration","animationDurationUpdate","animationEasing","addDataAnimation","symbolList","DRAG_ENABLE_TIME"],n=i.length;n--;){var o=i[n];null==t[o]&&(t[o]=null!=this._themeConfig[o]?this._themeConfig[o]:a[o])}var r=t.color;r&&r.length||(r=this._themeConfig.color||a.color),this._zr.getColor=function(t){var i=e("zrender/tool/color");return i.getColor(t,r)},l||(t.animation=!1,t.addDataAnimation=!1)},setOption:function(e,t){return e.timeline?this._setTimelineOption(e):this._setOption(e,t)},_setOption:function(e,t,i){return!t&&this._option?this._option=o.merge(this.getOption(),o.clone(e),!0):(this._option=o.clone(e),!i&&this._timeline&&this._timeline.dispose()),this._optionRestore=o.clone(this._option),this._option.series&&0!==this._option.series.length?(this.component.dataZoom&&(this._option.dataZoom||this._option.toolbox&&this._option.toolbox.feature&&this._option.toolbox.feature.dataZoom&&this._option.toolbox.feature.dataZoom.show)&&this.component.dataZoom.syncOption(this._option),this._toolbox.reset(this._option),this._render(this._option),this):void this._zr.clear()},getOption:function(){function e(e){var n=i._optionRestore[e];if(n)if(n instanceof Array)for(var a=n.length;a--;)t[e][a].data=o.clone(n[a].data);else t[e].data=o.clone(n.data)}var t=o.clone(this._option),i=this;return e("xAxis"),e("yAxis"),e("series"),t},setSeries:function(e,t){return t?(this._option.series=e,this.setOption(this._option,t)):this.setOption({series:e}),this},getSeries:function(){return this.getOption().series},_setTimelineOption:function(t){this._timeline&&this._timeline.dispose();var i=e("./component/timeline"),n=new i(this._themeConfig,this._messageCenter,this._zr,t,this);return this._timeline=n,this.component.timeline=this._timeline,this},addData:function(e,t,i,n,r){function s(){if(V._zr){V._zr.clearAnimation();for(var e=0,t=X.length;t>e;e++)X[e].motionlessOnce=h.addDataAnimation&&X[e].addDataAnimation;V._messageCenter.dispatch(a.EVENT.REFRESH,null,{option:h},V)}}for(var l=e instanceof Array?e:[[e,t,i,n,r]],h=this.getOption(),m=this._optionRestore,V=this,U=0,d=l.length;d>U;U++){e=l[U][0],t=l[U][1],i=l[U][2],n=l[U][3],r=l[U][4];var p=m.series[e],c=i?"unshift":"push",u=i?"pop":"shift";if(p){var y=p.data,g=h.series[e].data;if(y[c](t),g[c](t),n||(y[u](),t=g[u]()),null!=r){var b,f;if(p.type===a.CHART_TYPE_PIE&&(b=m.legend)&&(f=b.data)){var k=h.legend.data;if(f[c](r),k[c](r),!n){var x=o.indexOf(f,t.name);-1!=x&&f.splice(x,1),x=o.indexOf(k,t.name),-1!=x&&k.splice(x,1)}}else if(null!=m.xAxis&&null!=m.yAxis){var _,L,W=p.xAxisIndex||0;(null==m.xAxis[W].type||"category"===m.xAxis[W].type)&&(_=m.xAxis[W].data,L=h.xAxis[W].data,_[c](r),L[c](r),n||(_[u](),L[u]())),W=p.yAxisIndex||0,"category"===m.yAxis[W].type&&(_=m.yAxis[W].data,L=h.yAxis[W].data,_[c](r),L[c](r),n||(_[u](),L[u]()))}}this._option.series[e].data=h.series[e].data}}this._zr.clearAnimation();for(var X=this._chartList,v=0,w=function(){v--,0===v&&s()},U=0,d=X.length;d>U;U++)h.addDataAnimation&&X[U].addDataAnimation&&(v++,X[U].addDataAnimation(l,w));return this.component.dataZoom&&this.component.dataZoom.syncOption(h),this._option=h,h.addDataAnimation||setTimeout(s,0),this},addMarkPoint:function(e,t){return this._addMark(e,t,"markPoint")},addMarkLine:function(e,t){return this._addMark(e,t,"markLine")},_addMark:function(e,t,i){var n,a=this._option.series;if(a&&(n=a[e])){var r=this._optionRestore.series,s=r[e],l=n[i],h=s[i];l=n[i]=l||{data:[]},h=s[i]=h||{data:[]};for(var m in t)"data"===m?(l.data=l.data.concat(t.data),h.data=h.data.concat(t.data)):"object"!=typeof t[m]||null==l[m]?l[m]=h[m]=t[m]:(o.merge(l[m],t[m],!0),o.merge(h[m],t[m],!0));var V=this.chart[n.type];V&&V.addMark(e,t,i)}return this},delMarkPoint:function(e,t){return this._delMark(e,t,"markPoint")},delMarkLine:function(e,t){return this._delMark(e,t,"markLine")},_delMark:function(e,t,i){var n,a,o,r=this._option.series;if(!(r&&(n=r[e])&&(a=n[i])&&(o=a.data)))return this;t=t.split(" > ");for(var s=-1,l=0,h=o.length;h>l;l++){var m=o[l];if(m instanceof Array){if(m[0].name===t[0]&&m[1].name===t[1]){s=l;break}}else if(m.name===t[0]){s=l;break}}if(s>-1){o.splice(s,1),this._optionRestore.series[e][i].data.splice(s,1);var V=this.chart[n.type];V&&V.delMark(e,t.join(" > "),i)}return this},getDom:function(){return this.dom},getZrender:function(){return this._zr},getDataURL:function(e){if(!l)return"";if(0===this._chartList.length){var t="IMG"+this.id,i=document.getElementById(t);if(i)return i.src}var n=this.component.tooltip;switch(n&&n.hideTip(),e){case"jpeg":break;default:e="png"}var a=this._option.backgroundColor;return a&&"rgba(0,0,0,0)"===a.replace(" ","")&&(a="#fff"),this._zr.toDataURL("image/"+e,a)},getImage:function(e){var t=this._optionRestore.title,i=document.createElement("img");return i.src=this.getDataURL(e),i.title=t&&t.text||"ECharts",i},getConnectedDataURL:function(t){if(!this.isConnected())return this.getDataURL(t);var i=this.dom,n={self:{img:this.getDataURL(t),left:i.offsetLeft,top:i.offsetTop,right:i.offsetLeft+i.offsetWidth,bottom:i.offsetTop+i.offsetHeight}},a=n.self.left,o=n.self.top,r=n.self.right,s=n.self.bottom;for(var l in this._connected)i=this._connected[l].getDom(),n[l]={img:this._connected[l].getDataURL(t),left:i.offsetLeft,top:i.offsetTop,right:i.offsetLeft+i.offsetWidth,bottom:i.offsetTop+i.offsetHeight},a=Math.min(a,n[l].left),o=Math.min(o,n[l].top),r=Math.max(r,n[l].right),s=Math.max(s,n[l].bottom);var h=document.createElement("div");h.style.position="absolute",h.style.left="-4000px",h.style.width=r-a+"px",h.style.height=s-o+"px",document.body.appendChild(h);var m=e("zrender").init(h),V=e("zrender/shape/Image");for(var l in n)m.addShape(new V({style:{x:n[l].left-a,y:n[l].top-o,image:n[l].img}}));m.render();var U=this._option.backgroundColor;U&&"rgba(0,0,0,0)"===U.replace(/ /g,"")&&(U="#fff");var d=m.toDataURL("image/png",U);return setTimeout(function(){m.dispose(),h.parentNode.removeChild(h),h=null},100),d},getConnectedImage:function(e){var t=this._optionRestore.title,i=document.createElement("img");return i.src=this.getConnectedDataURL(e),i.title=t&&t.text||"ECharts",i},on:function(e,t){return this._messageCenterOutSide.bind(e,t,this),this},un:function(e,t){return this._messageCenterOutSide.unbind(e,t),this},connect:function(e){if(!e)return this;if(this._connected||(this._connected={}),e instanceof Array)for(var t=0,i=e.length;i>t;t++)this._connected[e[t].id]=e[t];else this._connected[e.id]=e;return this},disConnect:function(e){if(!e||!this._connected)return this;if(e instanceof Array)for(var t=0,i=e.length;i>t;t++)delete this._connected[e[t].id];else delete this._connected[e.id];for(var n in this._connected)return this;return this._connected=!1,this},connectedEventHandler:function(e){e.__echartsId!=this.id&&this._onevent(e)},isConnected:function(){return!!this._connected},showLoading:function(t){var i={bar:e("zrender/loadingEffect/Bar"),bubble:e("zrender/loadingEffect/Bubble"),dynamicLine:e("zrender/loadingEffect/DynamicLine"),ring:e("zrender/loadingEffect/Ring"),spin:e("zrender/loadingEffect/Spin"),whirling:e("zrender/loadingEffect/Whirling")};this._toolbox.hideDataView(),t=t||{};var n=t.textStyle||{};t.textStyle=n;var r=o.merge(o.merge(o.clone(n),this._themeConfig.textStyle),a.textStyle);n.textFont=r.fontStyle+" "+r.fontWeight+" "+r.fontSize+"px "+r.fontFamily,n.text=t.text||this._option&&this._option.loadingText||this._themeConfig.loadingText||a.loadingText,null!=t.x&&(n.x=t.x),null!=t.y&&(n.y=t.y),t.effectOption=t.effectOption||{},t.effectOption.textStyle=n;var s=t.effect;return("string"==typeof s||null==s)&&(s=i[t.effect||this._option&&this._option.loadingEffect||this._themeConfig.loadingEffect||a.loadingEffect]||i.spin),this._zr.showLoading(new s(t.effectOption)),this},hideLoading:function(){return this._zr.hideLoading(),this},setTheme:function(t){if(t){if("string"==typeof t)switch(t){case"macarons":t=e("./theme/macarons");break;case"infographic":t=e("./theme/infographic");break;default:t={}}else t=t||{};this._themeConfig=t}if(!l){var i=this._themeConfig.textStyle;i&&i.fontFamily&&i.fontFamily2&&(i.fontFamily=i.fontFamily2),i=a.textStyle,i.fontFamily=i.fontFamily2}this._timeline&&this._timeline.setTheme(!0),this._optionRestore&&this.restore()},resize:function(){var e=this;return function(){if(e._clearEffect(),e._zr.resize(),e._option&&e._option.renderAsImage&&l)return e._render(e._option),e;e._zr.clearAnimation(),e._island.resize(),e._toolbox.resize(),e._timeline&&e._timeline.resize();for(var t=0,i=e._chartList.length;i>t;t++)e._chartList[t].resize&&e._chartList[t].resize();return e.component.grid&&e.component.grid.refixAxisShape(e.component),e._zr.refresh(),e._messageCenter.dispatch(a.EVENT.RESIZE,null,null,e),e}},_clearEffect:function(){this._zr.modLayer(a.EFFECT_ZLEVEL,{motionBlur:!1}),this._zr.painter.clearLayer(a.EFFECT_ZLEVEL)},clear:function(){return this._disposeChartList(),this._zr.clear(),this._option={},this._optionRestore={},this.dom.style.backgroundColor=null,this},dispose:function(){var e=this.dom.getAttribute(V);e&&delete m[e],this._island.dispose(),this._toolbox.dispose(),this._timeline&&this._timeline.dispose(),this._messageCenter.unbind(),this.clear(),this._zr.dispose(),this._zr=null}},s}),i("echarts/config",[],function(){var e={CHART_TYPE_LINE:"line",CHART_TYPE_BAR:"bar",CHART_TYPE_SCATTER:"scatter",CHART_TYPE_PIE:"pie",CHART_TYPE_RADAR:"radar",CHART_TYPE_VENN:"venn",CHART_TYPE_TREEMAP:"treemap",CHART_TYPE_TREE:"tree",CHART_TYPE_MAP:"map",CHART_TYPE_K:"k",CHART_TYPE_ISLAND:"island",CHART_TYPE_FORCE:"force",CHART_TYPE_CHORD:"chord",CHART_TYPE_GAUGE:"gauge",CHART_TYPE_FUNNEL:"funnel",CHART_TYPE_EVENTRIVER:"eventRiver",CHART_TYPE_WORDCLOUD:"wordCloud",CHART_TYPE_HEATMAP:"heatmap",COMPONENT_TYPE_TITLE:"title",COMPONENT_TYPE_LEGEND:"legend",COMPONENT_TYPE_DATARANGE:"dataRange",COMPONENT_TYPE_DATAVIEW:"dataView",COMPONENT_TYPE_DATAZOOM:"dataZoom",COMPONENT_TYPE_TOOLBOX:"toolbox",COMPONENT_TYPE_TOOLTIP:"tooltip",COMPONENT_TYPE_GRID:"grid",COMPONENT_TYPE_AXIS:"axis",COMPONENT_TYPE_POLAR:"polar",COMPONENT_TYPE_X_AXIS:"xAxis",COMPONENT_TYPE_Y_AXIS:"yAxis",COMPONENT_TYPE_AXIS_CATEGORY:"categoryAxis",COMPONENT_TYPE_AXIS_VALUE:"valueAxis",COMPONENT_TYPE_TIMELINE:"timeline",COMPONENT_TYPE_ROAMCONTROLLER:"roamController",backgroundColor:"rgba(0,0,0,0)",color:["#ff7f50","#87cefa","#da70d6","#32cd32","#6495ed","#ff69b4","#ba55d3","#cd5c5c","#ffa500","#40e0d0","#1e90ff","#ff6347","#7b68ee","#00fa9a","#ffd700","#6699FF","#ff6666","#3cb371","#b8860b","#30e0e0"],markPoint:{clickable:!0,symbol:"pin",symbolSize:10,large:!1,effect:{show:!1,loop:!0,period:15,type:"scale",scaleSize:2,bounceDistance:10},itemStyle:{normal:{borderWidth:2,label:{show:!0,position:"inside"}},emphasis:{label:{show:!0}}}},markLine:{clickable:!0,symbol:["circle","arrow"],symbolSize:[2,4],smoothness:.2,precision:2,effect:{show:!1,loop:!0,period:15,scaleSize:2},bundling:{enable:!1,maxTurningAngle:45},itemStyle:{normal:{borderWidth:1.5,label:{show:!0,position:"end"},lineStyle:{type:"dashed"}},emphasis:{label:{show:!1},lineStyle:{}}}},textStyle:{decoration:"none",fontFamily:"Arial, Verdana, sans-serif",fontFamily2:"微软雅黑",fontSize:12,fontStyle:"normal",fontWeight:"normal"},EVENT:{REFRESH:"refresh",RESTORE:"restore",RESIZE:"resize",CLICK:"click",DBLCLICK:"dblclick",HOVER:"hover",MOUSEOUT:"mouseout",DATA_CHANGED:"dataChanged",DATA_ZOOM:"dataZoom",DATA_RANGE:"dataRange",DATA_RANGE_SELECTED:"dataRangeSelected",DATA_RANGE_HOVERLINK:"dataRangeHoverLink",LEGEND_SELECTED:"legendSelected",LEGEND_HOVERLINK:"legendHoverLink",MAP_SELECTED:"mapSelected",PIE_SELECTED:"pieSelected",MAGIC_TYPE_CHANGED:"magicTypeChanged",DATA_VIEW_CHANGED:"dataViewChanged",TIMELINE_CHANGED:"timelineChanged",MAP_ROAM:"mapRoam",FORCE_LAYOUT_END:"forceLayoutEnd",TOOLTIP_HOVER:"tooltipHover",TOOLTIP_IN_GRID:"tooltipInGrid",TOOLTIP_OUT_GRID:"tooltipOutGrid",ROAMCONTROLLER:"roamController"},DRAG_ENABLE_TIME:120,EFFECT_ZLEVEL:10,effectBlendAlpha:.95,symbolList:["circle","rectangle","triangle","diamond","emptyCircle","emptyRectangle","emptyTriangle","emptyDiamond"],loadingEffect:"spin",loadingText:"数据读取中...",noDataEffect:"bubble",noDataText:"暂无数据",calculable:!1,calculableColor:"rgba(255,165,0,0.6)",calculableHolderColor:"#ccc",nameConnector:" & ",valueConnector:": ",animation:!0,addDataAnimation:!0,animationThreshold:2e3,animationDuration:2e3,animationDurationUpdate:500,animationEasing:"ExponentialOut"};return e}),i("zrender/tool/util",["require","../dep/excanvas"],function(e){function t(e){return e&&1===e.nodeType&&"string"==typeof e.nodeName}function i(e){if("object"==typeof e&&null!==e){var n=e;if(e instanceof Array){n=[];for(var a=0,o=e.length;o>a;a++)n[a]=i(e[a])}else if(!y[g.call(e)]&&!t(e)){n={};for(var r in e)e.hasOwnProperty(r)&&(n[r]=i(e[r]))}return n}return e}function n(e,i,n,o){if(i.hasOwnProperty(n)){var r=e[n];"object"!=typeof r||y[g.call(r)]||t(r)?!o&&n in e||(e[n]=i[n]):a(e[n],i[n],o)}}function a(e,t,i){for(var a in t)n(e,t,a,i);return e}function o(){if(!U)if(e("../dep/excanvas"),window.G_vmlCanvasManager){var t=document.createElement("div");t.style.position="absolute",t.style.top="-1000px",document.body.appendChild(t),U=G_vmlCanvasManager.initElement(t).getContext("2d")}else U=document.createElement("canvas").getContext("2d");return U}function r(e,t){if(e.indexOf)return e.indexOf(t);for(var i=0,n=e.length;n>i;i++)if(e[i]===t)return i;return-1}function s(e,t){function i(){}var n=e.prototype;i.prototype=t.prototype,e.prototype=new i;for(var a in n)e.prototype[a]=n[a];e.constructor=e}function l(e,t,i){if(e&&t)if(e.forEach&&e.forEach===p)e.forEach(t,i);else if(e.length===+e.length)for(var n=0,a=e.length;a>n;n++)t.call(i,e[n],n,e);else for(var o in e)e.hasOwnProperty(o)&&t.call(i,e[o],o,e)}function h(e,t,i){if(e&&t){if(e.map&&e.map===c)return e.map(t,i);for(var n=[],a=0,o=e.length;o>a;a++)n.push(t.call(i,e[a],a,e));return n}}function m(e,t,i){if(e&&t){if(e.filter&&e.filter===u)return e.filter(t,i);for(var n=[],a=0,o=e.length;o>a;a++)t.call(i,e[a],a,e)&&n.push(e[a]);return n}}function V(e,t){return function(){e.apply(t,arguments)}}var U,d=Array.prototype,p=d.forEach,c=d.map,u=d.filter,y={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1},g=Object.prototype.toString;return{inherits:s,clone:i,merge:a,getContext:o,indexOf:r,each:l,map:h,filter:m,bind:V}}),i("zrender/tool/event",["require","../mixin/Eventful"],function(e){"use strict";function t(e){return"undefined"!=typeof e.zrenderX&&e.zrenderX||"undefined"!=typeof e.offsetX&&e.offsetX||"undefined"!=typeof e.layerX&&e.layerX||"undefined"!=typeof e.clientX&&e.clientX}function i(e){return"undefined"!=typeof e.zrenderY&&e.zrenderY||"undefined"!=typeof e.offsetY&&e.offsetY||"undefined"!=typeof e.layerY&&e.layerY||"undefined"!=typeof e.clientY&&e.clientY}function n(e){return"undefined"!=typeof e.zrenderDelta&&e.zrenderDelta||"undefined"!=typeof e.wheelDelta&&e.wheelDelta||"undefined"!=typeof e.detail&&-e.detail}var a=e("../mixin/Eventful"),o="function"==typeof window.addEventListener?function(e){e.preventDefault(),e.stopPropagation(),e.cancelBubble=!0}:function(e){e.returnValue=!1,e.cancelBubble=!0};return{getX:t,getY:i,getDelta:n,stop:o,Dispatcher:a}}),i("zrender/tool/env",[],function(){function e(e){var t=this.os={},i=this.browser={},n=e.match(/Web[kK]it[\/]{0,1}([\d.]+)/),a=e.match(/(Android);?[\s\/]+([\d.]+)?/),o=e.match(/(iPad).*OS\s([\d_]+)/),r=e.match(/(iPod)(.*OS\s([\d_]+))?/),s=!o&&e.match(/(iPhone\sOS)\s([\d_]+)/),l=e.match(/(webOS|hpwOS)[\s\/]([\d.]+)/),h=l&&e.match(/TouchPad/),m=e.match(/Kindle\/([\d.]+)/),V=e.match(/Silk\/([\d._]+)/),U=e.match(/(BlackBerry).*Version\/([\d.]+)/),d=e.match(/(BB10).*Version\/([\d.]+)/),p=e.match(/(RIM\sTablet\sOS)\s([\d.]+)/),c=e.match(/PlayBook/),u=e.match(/Chrome\/([\d.]+)/)||e.match(/CriOS\/([\d.]+)/),y=e.match(/Firefox\/([\d.]+)/),g=e.match(/MSIE ([\d.]+)/),b=n&&e.match(/Mobile\//)&&!u,f=e.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/)&&!u,g=e.match(/MSIE\s([\d.]+)/);return(i.webkit=!!n)&&(i.version=n[1]),a&&(t.android=!0,t.version=a[2]),s&&!r&&(t.ios=t.iphone=!0,t.version=s[2].replace(/_/g,".")),o&&(t.ios=t.ipad=!0,t.version=o[2].replace(/_/g,".")),r&&(t.ios=t.ipod=!0,t.version=r[3]?r[3].replace(/_/g,"."):null),l&&(t.webos=!0,t.version=l[2]),h&&(t.touchpad=!0),U&&(t.blackberry=!0,t.version=U[2]),d&&(t.bb10=!0,t.version=d[2]),p&&(t.rimtabletos=!0,t.version=p[2]),c&&(i.playbook=!0),m&&(t.kindle=!0,t.version=m[1]),V&&(i.silk=!0,i.version=V[1]),!V&&t.android&&e.match(/Kindle Fire/)&&(i.silk=!0),u&&(i.chrome=!0,i.version=u[1]),y&&(i.firefox=!0,i.version=y[1]),g&&(i.ie=!0,i.version=g[1]),b&&(e.match(/Safari/)||t.ios)&&(i.safari=!0),f&&(i.webview=!0),g&&(i.ie=!0,i.version=g[1]),t.tablet=!!(o||c||a&&!e.match(/Mobile/)||y&&e.match(/Tablet/)||g&&!e.match(/Phone/)&&e.match(/Touch/)),t.phone=!(t.tablet||t.ipod||!(a||s||l||U||d||u&&e.match(/Android/)||u&&e.match(/CriOS\/([\d.]+)/)||y&&e.match(/Mobile/)||g&&e.match(/Touch/))),{browser:i,os:t,canvasSupported:document.createElement("canvas").getContext?!0:!1}}return e(navigator.userAgent)}),i("zrender",["zrender/zrender"],function(e){return e}),i("zrender/zrender",["require","./dep/excanvas","./tool/util","./tool/log","./tool/guid","./Handler","./Painter","./Storage","./animation/Animation","./tool/env"],function(e){function t(e){return function(){e._needsRefreshNextFrame&&e.refresh()}}e("./dep/excanvas");var i=e("./tool/util"),n=e("./tool/log"),a=e("./tool/guid"),o=e("./Handler"),r=e("./Painter"),s=e("./Storage"),l=e("./animation/Animation"),h={},m={};m.version="2.1.1",m.init=function(e){var t=new V(a(),e);return h[t.id]=t,t},m.dispose=function(e){if(e)e.dispose();else{for(var t in h)h[t].dispose();h={}}return m},m.getInstance=function(e){return h[e]},m.delInstance=function(e){return delete h[e],m};var V=function(i,n){this.id=i,this.env=e("./tool/env"),this.storage=new s,this.painter=new r(n,this.storage),this.handler=new o(n,this.storage,this.painter),this.animation=new l({stage:{update:t(this)}}),this.animation.start();var a=this;this.painter.refreshNextFrame=function(){a.refreshNextFrame()},this._needsRefreshNextFrame=!1;var a=this,h=this.storage,m=h.delFromMap;h.delFromMap=function(e){var t=h.get(e);a.stopAnimation(t),m.call(h,e)}};return V.prototype.getId=function(){return this.id},V.prototype.addShape=function(e){return this.addElement(e),this},V.prototype.addGroup=function(e){return this.addElement(e),this},V.prototype.delShape=function(e){return this.delElement(e),this},V.prototype.delGroup=function(e){return this.delElement(e),this},V.prototype.modShape=function(e,t){return this.modElement(e,t),this},V.prototype.modGroup=function(e,t){return this.modElement(e,t),this},V.prototype.addElement=function(e){return this.storage.addRoot(e),this._needsRefreshNextFrame=!0,this},V.prototype.delElement=function(e){return this.storage.delRoot(e),this._needsRefreshNextFrame=!0,this},V.prototype.modElement=function(e,t){return this.storage.mod(e,t),this._needsRefreshNextFrame=!0,this},V.prototype.modLayer=function(e,t){return this.painter.modLayer(e,t),this._needsRefreshNextFrame=!0,this},V.prototype.addHoverShape=function(e){return this.storage.addHover(e),this},V.prototype.render=function(e){return this.painter.render(e),this._needsRefreshNextFrame=!1,this},V.prototype.refresh=function(e){return this.painter.refresh(e),this._needsRefreshNextFrame=!1,this},V.prototype.refreshNextFrame=function(){return this._needsRefreshNextFrame=!0,this},V.prototype.refreshHover=function(e){return this.painter.refreshHover(e),this},V.prototype.refreshShapes=function(e,t){return this.painter.refreshShapes(e,t),this},V.prototype.resize=function(){return this.painter.resize(),this},V.prototype.animate=function(e,t,a){var o=this;if("string"==typeof e&&(e=this.storage.get(e)),e){var r;if(t){for(var s=t.split("."),l=e,h=0,m=s.length;m>h;h++)l&&(l=l[s[h]]);l&&(r=l)}else r=e;if(!r)return void n('Property "'+t+'" is not existed in element '+e.id); + +null==e.__animators&&(e.__animators=[]);var V=e.__animators,U=this.animation.animate(r,{loop:a}).during(function(){o.modShape(e)}).done(function(){var t=i.indexOf(e.__animators,U);t>=0&&V.splice(t,1)});return V.push(U),U}n("Element not existed")},V.prototype.stopAnimation=function(e){if(e.__animators){for(var t=e.__animators,i=t.length,n=0;i>n;n++)t[n].stop();t.length=0}return this},V.prototype.clearAnimation=function(){return this.animation.clear(),this},V.prototype.showLoading=function(e){return this.painter.showLoading(e),this},V.prototype.hideLoading=function(){return this.painter.hideLoading(),this},V.prototype.getWidth=function(){return this.painter.getWidth()},V.prototype.getHeight=function(){return this.painter.getHeight()},V.prototype.toDataURL=function(e,t,i){return this.painter.toDataURL(e,t,i)},V.prototype.shapeToImage=function(e,t,i){var n=a();return this.painter.shapeToImage(n,e,t,i)},V.prototype.on=function(e,t,i){return this.handler.on(e,t,i),this},V.prototype.un=function(e,t){return this.handler.un(e,t),this},V.prototype.trigger=function(e,t){return this.handler.trigger(e,t),this},V.prototype.clear=function(){return this.storage.delRoot(),this.painter.clear(),this},V.prototype.dispose=function(){this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null,m.delInstance(this.id)},m}),i("zrender/config",[],function(){var e={EVENT:{RESIZE:"resize",CLICK:"click",DBLCLICK:"dblclick",MOUSEWHEEL:"mousewheel",MOUSEMOVE:"mousemove",MOUSEOVER:"mouseover",MOUSEOUT:"mouseout",MOUSEDOWN:"mousedown",MOUSEUP:"mouseup",GLOBALOUT:"globalout",DRAGSTART:"dragstart",DRAGEND:"dragend",DRAGENTER:"dragenter",DRAGOVER:"dragover",DRAGLEAVE:"dragleave",DROP:"drop",touchClickDelay:300},elementClassName:"zr-element",catchBrushException:!1,debugMode:0,devicePixelRatio:Math.max(window.devicePixelRatio||1,1)};return e}),i("echarts/chart/island",["require","./base","zrender/shape/Circle","../config","../util/ecData","zrender/tool/util","zrender/tool/event","zrender/tool/color","../util/accMath","../chart"],function(e){function t(e,t,n,a,r){i.call(this,e,t,n,a,r),this._nameConnector,this._valueConnector,this._zrHeight=this.zr.getHeight(),this._zrWidth=this.zr.getWidth();var l=this;l.shapeHandler.onmousewheel=function(e){var t=e.target,i=e.event,n=s.getDelta(i);n=n>0?-1:1,t.style.r-=n,t.style.r=t.style.r<5?5:t.style.r;var a=o.get(t,"value"),r=a*l.option.island.calculateStep;a=r>1?Math.round(a-r*n):+(a-r*n).toFixed(2);var h=o.get(t,"name");t.style.text=h+":"+a,o.set(t,"value",a),o.set(t,"name",h),l.zr.modShape(t.id),l.zr.refreshNextFrame(),s.stop(i)}}var i=e("./base"),n=e("zrender/shape/Circle"),a=e("../config");a.island={zlevel:0,z:5,r:15,calculateStep:.1};var o=e("../util/ecData"),r=e("zrender/tool/util"),s=e("zrender/tool/event");return t.prototype={type:a.CHART_TYPE_ISLAND,_combine:function(t,i){var n=e("zrender/tool/color"),a=e("../util/accMath"),r=a.accAdd(o.get(t,"value"),o.get(i,"value")),s=o.get(t,"name")+this._nameConnector+o.get(i,"name");t.style.text=s+this._valueConnector+r,o.set(t,"value",r),o.set(t,"name",s),t.style.r=this.option.island.r,t.style.color=n.mix(t.style.color,i.style.color)},refresh:function(e){e&&(e.island=this.reformOption(e.island),this.option=e,this._nameConnector=this.option.nameConnector,this._valueConnector=this.option.valueConnector)},getOption:function(){return this.option},resize:function(){var e=this.zr.getWidth(),t=this.zr.getHeight(),i=e/(this._zrWidth||e),n=t/(this._zrHeight||t);if(1!==i||1!==n){this._zrWidth=e,this._zrHeight=t;for(var a=0,o=this.shapeList.length;o>a;a++)this.zr.modShape(this.shapeList[a].id,{style:{x:Math.round(this.shapeList[a].style.x*i),y:Math.round(this.shapeList[a].style.y*n)}})}},add:function(e){var t=o.get(e,"name"),i=o.get(e,"value"),a=null!=o.get(e,"series")?o.get(e,"series").name:"",r=this.getFont(this.option.island.textStyle),s=this.option.island,l={zlevel:s.zlevel,z:s.z,style:{x:e.style.x,y:e.style.y,r:this.option.island.r,color:e.style.color||e.style.strokeColor,text:t+this._valueConnector+i,textFont:r},draggable:!0,hoverable:!0,onmousewheel:this.shapeHandler.onmousewheel,_type:"island"};"#fff"===l.style.color&&(l.style.color=e.style.strokeColor),this.setCalculable(l),l.dragEnableTime=0,o.pack(l,{name:a},-1,i,-1,t),l=new n(l),this.shapeList.push(l),this.zr.addShape(l)},del:function(e){this.zr.delShape(e.id);for(var t=[],i=0,n=this.shapeList.length;n>i;i++)this.shapeList[i].id!=e.id&&t.push(this.shapeList[i]);this.shapeList=t},ondrop:function(e,t){if(this.isDrop&&e.target){var i=e.target,n=e.dragged;this._combine(i,n),this.zr.modShape(i.id),t.dragIn=!0,this.isDrop=!1}},ondragend:function(e,t){var i=e.target;this.isDragend?t.dragIn&&(this.del(i),t.needRefresh=!0):t.dragIn||(i.style.x=s.getX(e.event),i.style.y=s.getY(e.event),this.add(i),t.needRefresh=!0),this.isDragend=!1}},r.inherits(t,i),e("../chart").define("island",t),t}),i("echarts/component/toolbox",["require","./base","zrender/shape/Line","zrender/shape/Image","zrender/shape/Rectangle","../util/shape/Icon","../config","zrender/tool/util","zrender/config","zrender/tool/event","./dataView","../component"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.dom=o.dom,this._magicType={},this._magicMap={},this._isSilence=!1,this._iconList,this._iconShapeMap={},this._featureTitle={},this._featureIcon={},this._featureColor={},this._featureOption={},this._enableColor="red",this._disableColor="#ccc",this._markShapeList=[];var r=this;r._onMark=function(e){r.__onMark(e)},r._onMarkUndo=function(e){r.__onMarkUndo(e)},r._onMarkClear=function(e){r.__onMarkClear(e)},r._onDataZoom=function(e){r.__onDataZoom(e)},r._onDataZoomReset=function(e){r.__onDataZoomReset(e)},r._onDataView=function(e){r.__onDataView(e)},r._onRestore=function(e){r.__onRestore(e)},r._onSaveAsImage=function(e){r.__onSaveAsImage(e)},r._onMagicType=function(e){r.__onMagicType(e)},r._onCustomHandler=function(e){r.__onCustomHandler(e)},r._onmousemove=function(e){return r.__onmousemove(e)},r._onmousedown=function(e){return r.__onmousedown(e)},r._onmouseup=function(e){return r.__onmouseup(e)},r._onclick=function(e){return r.__onclick(e)}}var i=e("./base"),n=e("zrender/shape/Line"),a=e("zrender/shape/Image"),o=e("zrender/shape/Rectangle"),r=e("../util/shape/Icon"),s=e("../config");s.toolbox={zlevel:0,z:6,show:!1,orient:"horizontal",x:"right",y:"top",color:["#1e90ff","#22bb22","#4b0082","#d2691e"],disableColor:"#ddd",effectiveColor:"red",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,itemSize:16,showTitle:!0,feature:{mark:{show:!1,title:{mark:"辅助线开关",markUndo:"删除辅助线",markClear:"清空辅助线"},lineStyle:{width:1,color:"#1e90ff",type:"dashed"}},dataZoom:{show:!1,title:{dataZoom:"区域缩放",dataZoomReset:"区域缩放后退"}},dataView:{show:!1,title:"数据视图",readOnly:!1,lang:["数据视图","关闭","刷新"]},magicType:{show:!1,title:{line:"折线图切换",bar:"柱形图切换",stack:"堆积",tiled:"平铺",force:"力导向布局图切换",chord:"和弦图切换",pie:"饼图切换",funnel:"漏斗图切换"},type:[]},restore:{show:!1,title:"还原"},saveAsImage:{show:!1,title:"保存为图片",type:"png",lang:["点击保存"]}}};var l=e("zrender/tool/util"),h=e("zrender/config"),m=e("zrender/tool/event"),V="stack",U="tiled";return t.prototype={type:s.COMPONENT_TYPE_TOOLBOX,_buildShape:function(){this._iconList=[];var e=this.option.toolbox;this._enableColor=e.effectiveColor,this._disableColor=e.disableColor;var t=e.feature,i=[];for(var n in t)if(t[n].show)switch(n){case"mark":i.push({key:n,name:"mark"}),i.push({key:n,name:"markUndo"}),i.push({key:n,name:"markClear"});break;case"magicType":for(var a=0,o=t[n].type.length;o>a;a++)t[n].title[t[n].type[a]+"Chart"]=t[n].title[t[n].type[a]],t[n].option&&(t[n].option[t[n].type[a]+"Chart"]=t[n].option[t[n].type[a]]),i.push({key:n,name:t[n].type[a]+"Chart"});break;case"dataZoom":i.push({key:n,name:"dataZoom"}),i.push({key:n,name:"dataZoomReset"});break;case"saveAsImage":this.canvasSupported&&i.push({key:n,name:"saveAsImage"});break;default:i.push({key:n,name:n})}if(i.length>0){for(var r,n,a=0,o=i.length;o>a;a++)r=i[a].name,n=i[a].key,this._iconList.push(r),this._featureTitle[r]=t[n].title[r]||t[n].title,t[n].icon&&(this._featureIcon[r]=t[n].icon[r]||t[n].icon),t[n].color&&(this._featureColor[r]=t[n].color[r]||t[n].color),t[n].option&&(this._featureOption[r]=t[n].option[r]||t[n].option);this._itemGroupLocation=this._getItemGroupLocation(),this._buildBackground(),this._buildItem();for(var a=0,o=this.shapeList.length;o>a;a++)this.zr.addShape(this.shapeList[a]);this._iconShapeMap.mark&&(this._iconDisable(this._iconShapeMap.markUndo),this._iconDisable(this._iconShapeMap.markClear)),this._iconShapeMap.dataZoomReset&&0===this._zoomQueue.length&&this._iconDisable(this._iconShapeMap.dataZoomReset)}},_buildItem:function(){var t,i,n,o,s=this.option.toolbox,l=this._iconList.length,h=this._itemGroupLocation.x,m=this._itemGroupLocation.y,V=s.itemSize,U=s.itemGap,d=s.color instanceof Array?s.color:[s.color],p=this.getFont(s.textStyle);"horizontal"===s.orient?(i=this._itemGroupLocation.y/this.zr.getHeight()<.5?"bottom":"top",n=this._itemGroupLocation.x/this.zr.getWidth()<.5?"left":"right",o=this._itemGroupLocation.y/this.zr.getHeight()<.5?"top":"bottom"):i=this._itemGroupLocation.x/this.zr.getWidth()<.5?"right":"left",this._iconShapeMap={};for(var c=this,u=0;l>u;u++){switch(t={type:"icon",zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:h,y:m,width:V,height:V,iconType:this._iconList[u],lineWidth:1,strokeColor:this._featureColor[this._iconList[u]]||d[u%d.length],brushType:"stroke"},highlightStyle:{lineWidth:1,text:s.showTitle?this._featureTitle[this._iconList[u]]:void 0,textFont:p,textPosition:i,strokeColor:this._featureColor[this._iconList[u]]||d[u%d.length]},hoverable:!0,clickable:!0},this._featureIcon[this._iconList[u]]&&(t.style.image=this._featureIcon[this._iconList[u]].replace(new RegExp("^image:\\/\\/"),""),t.style.opacity=.8,t.highlightStyle.opacity=1,t.type="image"),"horizontal"===s.orient&&(0===u&&"left"===n&&(t.highlightStyle.textPosition="specific",t.highlightStyle.textAlign=n,t.highlightStyle.textBaseline=o,t.highlightStyle.textX=h,t.highlightStyle.textY="top"===o?m+V+10:m-10),u===l-1&&"right"===n&&(t.highlightStyle.textPosition="specific",t.highlightStyle.textAlign=n,t.highlightStyle.textBaseline=o,t.highlightStyle.textX=h+V,t.highlightStyle.textY="top"===o?m+V+10:m-10)),this._iconList[u]){case"mark":t.onclick=c._onMark;break;case"markUndo":t.onclick=c._onMarkUndo;break;case"markClear":t.onclick=c._onMarkClear;break;case"dataZoom":t.onclick=c._onDataZoom;break;case"dataZoomReset":t.onclick=c._onDataZoomReset;break;case"dataView":if(!this._dataView){var y=e("./dataView");this._dataView=new y(this.ecTheme,this.messageCenter,this.zr,this.option,this.myChart)}t.onclick=c._onDataView;break;case"restore":t.onclick=c._onRestore;break;case"saveAsImage":t.onclick=c._onSaveAsImage;break;default:this._iconList[u].match("Chart")?(t._name=this._iconList[u].replace("Chart",""),t.onclick=c._onMagicType):t.onclick=c._onCustomHandler}"icon"===t.type?t=new r(t):"image"===t.type&&(t=new a(t)),this.shapeList.push(t),this._iconShapeMap[this._iconList[u]]=t,"horizontal"===s.orient?h+=V+U:m+=V+U}},_buildBackground:function(){var e=this.option.toolbox,t=this.reformCssArray(this.option.toolbox.padding);this.shapeList.push(new o({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._itemGroupLocation.x-t[3],y:this._itemGroupLocation.y-t[0],width:this._itemGroupLocation.width+t[3]+t[1],height:this._itemGroupLocation.height+t[0]+t[2],brushType:0===e.borderWidth?"fill":"both",color:e.backgroundColor,strokeColor:e.borderColor,lineWidth:e.borderWidth}}))},_getItemGroupLocation:function(){var e=this.option.toolbox,t=this.reformCssArray(this.option.toolbox.padding),i=this._iconList.length,n=e.itemGap,a=e.itemSize,o=0,r=0;"horizontal"===e.orient?(o=(a+n)*i-n,r=a):(r=(a+n)*i-n,o=a);var s,l=this.zr.getWidth();switch(e.x){case"center":s=Math.floor((l-o)/2);break;case"left":s=t[3]+e.borderWidth;break;case"right":s=l-o-t[1]-e.borderWidth;break;default:s=e.x-0,s=isNaN(s)?0:s}var h,m=this.zr.getHeight();switch(e.y){case"top":h=t[0]+e.borderWidth;break;case"bottom":h=m-r-t[2]-e.borderWidth;break;case"center":h=Math.floor((m-r)/2);break;default:h=e.y-0,h=isNaN(h)?0:h}return{x:s,y:h,width:o,height:r}},__onmousemove:function(e){this._marking&&(this._markShape.style.xEnd=m.getX(e.event),this._markShape.style.yEnd=m.getY(e.event),this.zr.addHoverShape(this._markShape)),this._zooming&&(this._zoomShape.style.width=m.getX(e.event)-this._zoomShape.style.x,this._zoomShape.style.height=m.getY(e.event)-this._zoomShape.style.y,this.zr.addHoverShape(this._zoomShape),this.dom.style.cursor="crosshair",m.stop(e.event)),this._zoomStart&&"pointer"!=this.dom.style.cursor&&"move"!=this.dom.style.cursor&&(this.dom.style.cursor="crosshair")},__onmousedown:function(e){if(!e.target){this._zooming=!0;var t=m.getX(e.event),i=m.getY(e.event),n=this.option.dataZoom||{};return this._zoomShape=new o({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:t,y:i,width:1,height:1,brushType:"both"},highlightStyle:{lineWidth:2,color:n.fillerColor||s.dataZoom.fillerColor,strokeColor:n.handleColor||s.dataZoom.handleColor,brushType:"both"}}),this.zr.addHoverShape(this._zoomShape),!0}},__onmouseup:function(){if(!this._zoomShape||Math.abs(this._zoomShape.style.width)<10||Math.abs(this._zoomShape.style.height)<10)return this._zooming=!1,!0;if(this._zooming&&this.component.dataZoom){this._zooming=!1;var e=this.component.dataZoom.rectZoom(this._zoomShape.style);e&&(this._zoomQueue.push({start:e.start,end:e.end,start2:e.start2,end2:e.end2}),this._iconEnable(this._iconShapeMap.dataZoomReset),this.zr.refreshNextFrame())}return!0},__onclick:function(e){if(!e.target)if(this._marking)this._marking=!1,this._markShapeList.push(this._markShape),this._iconEnable(this._iconShapeMap.markUndo),this._iconEnable(this._iconShapeMap.markClear),this.zr.addShape(this._markShape),this.zr.refreshNextFrame();else if(this._markStart){this._marking=!0;var t=m.getX(e.event),i=m.getY(e.event);this._markShape=new n({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{xStart:t,yStart:i,xEnd:t,yEnd:i,lineWidth:this.query(this.option,"toolbox.feature.mark.lineStyle.width"),strokeColor:this.query(this.option,"toolbox.feature.mark.lineStyle.color"),lineType:this.query(this.option,"toolbox.feature.mark.lineStyle.type")}}),this.zr.addHoverShape(this._markShape)}},__onMark:function(e){var t=e.target;if(this._marking||this._markStart)this._resetMark(),this.zr.refreshNextFrame();else{this._resetZoom(),this.zr.modShape(t.id,{style:{strokeColor:this._enableColor}}),this.zr.refreshNextFrame(),this._markStart=!0;var i=this;setTimeout(function(){i.zr&&i.zr.on(h.EVENT.CLICK,i._onclick)&&i.zr.on(h.EVENT.MOUSEMOVE,i._onmousemove)},10)}return!0},__onMarkUndo:function(){if(this._marking)this._marking=!1;else{var e=this._markShapeList.length;if(e>=1){var t=this._markShapeList[e-1];this.zr.delShape(t.id),this.zr.refreshNextFrame(),this._markShapeList.pop(),1===e&&(this._iconDisable(this._iconShapeMap.markUndo),this._iconDisable(this._iconShapeMap.markClear))}}return!0},__onMarkClear:function(){this._marking&&(this._marking=!1);var e=this._markShapeList.length;if(e>0){for(;e--;)this.zr.delShape(this._markShapeList.pop().id);this._iconDisable(this._iconShapeMap.markUndo),this._iconDisable(this._iconShapeMap.markClear),this.zr.refreshNextFrame()}return!0},__onDataZoom:function(e){var t=e.target;if(this._zooming||this._zoomStart)this._resetZoom(),this.zr.refreshNextFrame(),this.dom.style.cursor="default";else{this._resetMark(),this.zr.modShape(t.id,{style:{strokeColor:this._enableColor}}),this.zr.refreshNextFrame(),this._zoomStart=!0;var i=this;setTimeout(function(){i.zr&&i.zr.on(h.EVENT.MOUSEDOWN,i._onmousedown)&&i.zr.on(h.EVENT.MOUSEUP,i._onmouseup)&&i.zr.on(h.EVENT.MOUSEMOVE,i._onmousemove)},10),this.dom.style.cursor="crosshair"}return!0},__onDataZoomReset:function(){return this._zooming&&(this._zooming=!1),this._zoomQueue.pop(),this._zoomQueue.length>0?this.component.dataZoom.absoluteZoom(this._zoomQueue[this._zoomQueue.length-1]):(this.component.dataZoom.rectZoom(),this._iconDisable(this._iconShapeMap.dataZoomReset),this.zr.refreshNextFrame()),!0},_resetMark:function(){this._marking=!1,this._markStart&&(this._markStart=!1,this._iconShapeMap.mark&&this.zr.modShape(this._iconShapeMap.mark.id,{style:{strokeColor:this._iconShapeMap.mark.highlightStyle.strokeColor}}),this.zr.un(h.EVENT.CLICK,this._onclick),this.zr.un(h.EVENT.MOUSEMOVE,this._onmousemove))},_resetZoom:function(){this._zooming=!1,this._zoomStart&&(this._zoomStart=!1,this._iconShapeMap.dataZoom&&this.zr.modShape(this._iconShapeMap.dataZoom.id,{style:{strokeColor:this._iconShapeMap.dataZoom.highlightStyle.strokeColor}}),this.zr.un(h.EVENT.MOUSEDOWN,this._onmousedown),this.zr.un(h.EVENT.MOUSEUP,this._onmouseup),this.zr.un(h.EVENT.MOUSEMOVE,this._onmousemove))},_iconDisable:function(e){"image"!=e.type?this.zr.modShape(e.id,{hoverable:!1,clickable:!1,style:{strokeColor:this._disableColor}}):this.zr.modShape(e.id,{hoverable:!1,clickable:!1,style:{opacity:.3}})},_iconEnable:function(e){"image"!=e.type?this.zr.modShape(e.id,{hoverable:!0,clickable:!0,style:{strokeColor:e.highlightStyle.strokeColor}}):this.zr.modShape(e.id,{hoverable:!0,clickable:!0,style:{opacity:.8}})},__onDataView:function(){return this._dataView.show(this.option),!0},__onRestore:function(){return this._resetMark(),this._resetZoom(),this.messageCenter.dispatch(s.EVENT.RESTORE,null,null,this.myChart),!0},__onSaveAsImage:function(){var e=this.option.toolbox.feature.saveAsImage,t=e.type||"png";"png"!=t&&"jpeg"!=t&&(t="png");var i;i=this.myChart.isConnected()?this.myChart.getConnectedDataURL(t):this.zr.toDataURL("image/"+t,this.option.backgroundColor&&"rgba(0,0,0,0)"===this.option.backgroundColor.replace(" ","")?"#fff":this.option.backgroundColor);var n=document.createElement("div");n.id="__echarts_download_wrap__",n.style.cssText="position:fixed;z-index:99999;display:block;top:0;left:0;background-color:rgba(33,33,33,0.5);text-align:center;width:100%;height:100%;line-height:"+document.documentElement.clientHeight+"px;";var a=document.createElement("a");a.href=i,a.setAttribute("download",(e.name?e.name:this.option.title&&(this.option.title.text||this.option.title.subtext)?this.option.title.text||this.option.title.subtext:"ECharts")+"."+t),a.innerHTML='图片另存为":e.lang?e.lang[0]:"点击保存")+'"/>',n.appendChild(a),document.body.appendChild(n),a=null,n=null,setTimeout(function(){var e=document.getElementById("__echarts_download_wrap__");e&&(e.onclick=function(){var e=document.getElementById("__echarts_download_wrap__");e.onclick=null,e.innerHTML="",document.body.removeChild(e),e=null},e=null)},500)},__onMagicType:function(e){this._resetMark();var t=e.target._name;return this._magicType[t]||(this._magicType[t]=!0,t===s.CHART_TYPE_LINE?this._magicType[s.CHART_TYPE_BAR]=!1:t===s.CHART_TYPE_BAR&&(this._magicType[s.CHART_TYPE_LINE]=!1),t===s.CHART_TYPE_PIE?this._magicType[s.CHART_TYPE_FUNNEL]=!1:t===s.CHART_TYPE_FUNNEL&&(this._magicType[s.CHART_TYPE_PIE]=!1),t===s.CHART_TYPE_FORCE?this._magicType[s.CHART_TYPE_CHORD]=!1:t===s.CHART_TYPE_CHORD&&(this._magicType[s.CHART_TYPE_FORCE]=!1),t===V?this._magicType[U]=!1:t===U&&(this._magicType[V]=!1),this.messageCenter.dispatch(s.EVENT.MAGIC_TYPE_CHANGED,e.event,{magicType:this._magicType},this.myChart)),!0},setMagicType:function(e){this._resetMark(),this._magicType=e,!this._isSilence&&this.messageCenter.dispatch(s.EVENT.MAGIC_TYPE_CHANGED,null,{magicType:this._magicType},this.myChart)},__onCustomHandler:function(e){var t=e.target.style.iconType,i=this.option.toolbox.feature[t].onclick;"function"==typeof i&&i.call(this,this.option)},reset:function(e,t){if(t&&this.clear(),this.query(e,"toolbox.show")&&this.query(e,"toolbox.feature.magicType.show")){var i=e.toolbox.feature.magicType.type,n=i.length;for(this._magicMap={};n--;)this._magicMap[i[n]]=!0;n=e.series.length;for(var a,o;n--;)a=e.series[n].type,this._magicMap[a]&&(o=e.xAxis instanceof Array?e.xAxis[e.series[n].xAxisIndex||0]:e.xAxis,o&&"category"===(o.type||"category")&&(o.__boundaryGap=null!=o.boundaryGap?o.boundaryGap:!0),o=e.yAxis instanceof Array?e.yAxis[e.series[n].yAxisIndex||0]:e.yAxis,o&&"category"===o.type&&(o.__boundaryGap=null!=o.boundaryGap?o.boundaryGap:!0),e.series[n].__type=a,e.series[n].__itemStyle=l.clone(e.series[n].itemStyle||{})),(this._magicMap[V]||this._magicMap[U])&&(e.series[n].__stack=e.series[n].stack)}this._magicType=t?{}:this._magicType||{};for(var r in this._magicType)if(this._magicType[r]){this.option=e,this.getMagicOption();break}var s=e.dataZoom;if(s&&s.show){var h=null!=s.start&&s.start>=0&&s.start<=100?s.start:0,m=null!=s.end&&s.end>=0&&s.end<=100?s.end:100;h>m&&(h+=m,m=h-m,h-=m),this._zoomQueue=[{start:h,end:m,start2:0,end2:100}]}else this._zoomQueue=[]},getMagicOption:function(){var e,t;if(this._magicType[s.CHART_TYPE_LINE]||this._magicType[s.CHART_TYPE_BAR]){for(var i=this._magicType[s.CHART_TYPE_LINE]?!1:!0,n=0,a=this.option.series.length;a>n;n++)t=this.option.series[n].type,(t==s.CHART_TYPE_LINE||t==s.CHART_TYPE_BAR)&&(e=this.option.xAxis instanceof Array?this.option.xAxis[this.option.series[n].xAxisIndex||0]:this.option.xAxis,e&&"category"===(e.type||"category")&&(e.boundaryGap=i?!0:e.__boundaryGap),e=this.option.yAxis instanceof Array?this.option.yAxis[this.option.series[n].yAxisIndex||0]:this.option.yAxis,e&&"category"===e.type&&(e.boundaryGap=i?!0:e.__boundaryGap));this._defaultMagic(s.CHART_TYPE_LINE,s.CHART_TYPE_BAR)}if(this._defaultMagic(s.CHART_TYPE_CHORD,s.CHART_TYPE_FORCE),this._defaultMagic(s.CHART_TYPE_PIE,s.CHART_TYPE_FUNNEL),this._magicType[V]||this._magicType[U])for(var n=0,a=this.option.series.length;a>n;n++)this._magicType[V]?(this.option.series[n].stack="_ECHARTS_STACK_KENER_2014_",t=V):this._magicType[U]&&(this.option.series[n].stack=null,t=U),this._featureOption[t+"Chart"]&&l.merge(this.option.series[n],this._featureOption[t+"Chart"]||{},!0);return this.option},_defaultMagic:function(e,t){if(this._magicType[e]||this._magicType[t])for(var i=0,n=this.option.series.length;n>i;i++){var a=this.option.series[i].type;(a==e||a==t)&&(this.option.series[i].type=this._magicType[e]?e:t,this.option.series[i].itemStyle=l.clone(this.option.series[i].__itemStyle),a=this.option.series[i].type,this._featureOption[a+"Chart"]&&l.merge(this.option.series[i],this._featureOption[a+"Chart"]||{},!0))}},silence:function(e){this._isSilence=e},resize:function(){this._resetMark(),this.clear(),this.option&&this.option.toolbox&&this.option.toolbox.show&&this._buildShape(),this._dataView&&this._dataView.resize()},hideDataView:function(){this._dataView&&this._dataView.hide()},clear:function(e){this.zr&&(this.zr.delShape(this.shapeList),this.shapeList=[],e||(this.zr.delShape(this._markShapeList),this._markShapeList=[]))},onbeforDispose:function(){this._dataView&&(this._dataView.dispose(),this._dataView=null),this._markShapeList=null},refresh:function(e){e&&(this._resetMark(),this._resetZoom(),e.toolbox=this.reformOption(e.toolbox),this.option=e,this.clear(!0),e.toolbox.show&&this._buildShape(),this.hideDataView())}},l.inherits(t,i),e("../component").define("toolbox",t),t}),i("echarts/component",[],function(){var e={},t={};return e.define=function(i,n){return t[i]=n,e},e.get=function(e){return t[e]},e}),i("echarts/component/title",["require","./base","zrender/shape/Text","zrender/shape/Rectangle","../config","zrender/tool/util","zrender/tool/area","zrender/tool/color","../component"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Rectangle"),o=e("../config");o.title={zlevel:0,z:6,show:!0,text:"",subtext:"",x:"left",y:"top",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:5,textStyle:{fontSize:18,fontWeight:"bolder",color:"#333"},subtextStyle:{color:"#aaa"}};var r=e("zrender/tool/util"),s=e("zrender/tool/area"),l=e("zrender/tool/color");return t.prototype={type:o.COMPONENT_TYPE_TITLE,_buildShape:function(){if(this.titleOption.show){this._itemGroupLocation=this._getItemGroupLocation(),this._buildBackground(),this._buildItem();for(var e=0,t=this.shapeList.length;t>e;e++)this.zr.addShape(this.shapeList[e])}},_buildItem:function(){var e=this.titleOption.text,t=this.titleOption.link,i=this.titleOption.target,a=this.titleOption.subtext,o=this.titleOption.sublink,r=this.titleOption.subtarget,s=this.getFont(this.titleOption.textStyle),h=this.getFont(this.titleOption.subtextStyle),m=this._itemGroupLocation.x,V=this._itemGroupLocation.y,U=this._itemGroupLocation.width,d=this._itemGroupLocation.height,p={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{y:V,color:this.titleOption.textStyle.color,text:e,textFont:s,textBaseline:"top"},highlightStyle:{color:l.lift(this.titleOption.textStyle.color,1),brushType:"fill"},hoverable:!1};t&&(p.hoverable=!0,p.clickable=!0,p.onclick=function(){i&&"self"==i?window.location=t:window.open(t)});var c={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{y:V+d,color:this.titleOption.subtextStyle.color,text:a,textFont:h,textBaseline:"bottom"},highlightStyle:{color:l.lift(this.titleOption.subtextStyle.color,1),brushType:"fill"},hoverable:!1};switch(o&&(c.hoverable=!0,c.clickable=!0,c.onclick=function(){r&&"self"==r?window.location=o:window.open(o)}),this.titleOption.x){case"center":p.style.x=c.style.x=m+U/2,p.style.textAlign=c.style.textAlign="center";break;case"left":p.style.x=c.style.x=m,p.style.textAlign=c.style.textAlign="left";break;case"right":p.style.x=c.style.x=m+U,p.style.textAlign=c.style.textAlign="right";break;default:m=this.titleOption.x-0,m=isNaN(m)?0:m,p.style.x=c.style.x=m}this.titleOption.textAlign&&(p.style.textAlign=c.style.textAlign=this.titleOption.textAlign),this.shapeList.push(new n(p)),""!==a&&this.shapeList.push(new n(c))},_buildBackground:function(){var e=this.reformCssArray(this.titleOption.padding);this.shapeList.push(new a({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._itemGroupLocation.x-e[3],y:this._itemGroupLocation.y-e[0],width:this._itemGroupLocation.width+e[3]+e[1],height:this._itemGroupLocation.height+e[0]+e[2],brushType:0===this.titleOption.borderWidth?"fill":"both",color:this.titleOption.backgroundColor,strokeColor:this.titleOption.borderColor,lineWidth:this.titleOption.borderWidth}}))},_getItemGroupLocation:function(){var e,t=this.reformCssArray(this.titleOption.padding),i=this.titleOption.text,n=this.titleOption.subtext,a=this.getFont(this.titleOption.textStyle),o=this.getFont(this.titleOption.subtextStyle),r=Math.max(s.getTextWidth(i,a),s.getTextWidth(n,o)),l=s.getTextHeight(i,a)+(""===n?0:this.titleOption.itemGap+s.getTextHeight(n,o)),h=this.zr.getWidth();switch(this.titleOption.x){case"center":e=Math.floor((h-r)/2);break;case"left":e=t[3]+this.titleOption.borderWidth;break;case"right":e=h-r-t[1]-this.titleOption.borderWidth;break;default:e=this.titleOption.x-0,e=isNaN(e)?0:e}var m,V=this.zr.getHeight();switch(this.titleOption.y){case"top":m=t[0]+this.titleOption.borderWidth;break;case"bottom":m=V-l-t[2]-this.titleOption.borderWidth;break;case"center":m=Math.floor((V-l)/2);break;default:m=this.titleOption.y-0,m=isNaN(m)?0:m}return{x:e,y:m,width:r,height:l}},refresh:function(e){e&&(this.option=e,this.option.title=this.reformOption(this.option.title),this.titleOption=this.option.title,this.titleOption.textStyle=this.getTextStyle(this.titleOption.textStyle),this.titleOption.subtextStyle=this.getTextStyle(this.titleOption.subtextStyle)),this.clear(),this._buildShape()}},r.inherits(t,i),e("../component").define("title",t),t}),i("echarts/component/tooltip",["require","./base","../util/shape/Cross","zrender/shape/Line","zrender/shape/Rectangle","../config","../util/ecData","zrender/config","zrender/tool/event","zrender/tool/area","zrender/tool/color","zrender/tool/util","zrender/shape/Base","../component"],function(e){function t(e,t,o,r,s){i.call(this,e,t,o,r,s),this.dom=s.dom;var l=this;l._onmousemove=function(e){return l.__onmousemove(e)},l._onglobalout=function(e){return l.__onglobalout(e)},this.zr.on(h.EVENT.MOUSEMOVE,l._onmousemove),this.zr.on(h.EVENT.GLOBALOUT,l._onglobalout),l._hide=function(e){return l.__hide(e)},l._tryShow=function(e){return l.__tryShow(e)},l._refixed=function(e){return l.__refixed(e)},l._setContent=function(e,t){return l.__setContent(e,t)},this._tDom=this._tDom||document.createElement("div"),this._tDom.onselectstart=function(){return!1},this._tDom.onmouseover=function(){l._mousein=!0},this._tDom.onmouseout=function(){l._mousein=!1},this._tDom.className="echarts-tooltip",this._tDom.style.position="absolute",this.hasAppend=!1,this._axisLineShape&&this.zr.delShape(this._axisLineShape.id),this._axisLineShape=new a({zlevel:this.getZlevelBase(),z:this.getZBase(),invisible:!0,hoverable:!1}),this.shapeList.push(this._axisLineShape),this.zr.addShape(this._axisLineShape),this._axisShadowShape&&this.zr.delShape(this._axisShadowShape.id),this._axisShadowShape=new a({zlevel:this.getZlevelBase(),z:1,invisible:!0,hoverable:!1}),this.shapeList.push(this._axisShadowShape),this.zr.addShape(this._axisShadowShape),this._axisCrossShape&&this.zr.delShape(this._axisCrossShape.id),this._axisCrossShape=new n({zlevel:this.getZlevelBase(),z:this.getZBase(),invisible:!0,hoverable:!1}),this.shapeList.push(this._axisCrossShape),this.zr.addShape(this._axisCrossShape),this.showing=!1,this.refresh(r)}var i=e("./base"),n=e("../util/shape/Cross"),a=e("zrender/shape/Line"),o=e("zrender/shape/Rectangle"),r=new o({}),s=e("../config");s.tooltip={zlevel:1,z:8,show:!0,showContent:!0,trigger:"item",islandFormatter:"{a}
{b} : {c}",showDelay:20,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"rgba(0,0,0,0.7)",borderColor:"#333",borderRadius:4,borderWidth:0,padding:5,axisPointer:{type:"line",lineStyle:{color:"#48b",width:2,type:"solid"},crossStyle:{color:"#1e90ff",width:1,type:"dashed"},shadowStyle:{color:"rgba(150,150,150,0.3)",width:"auto",type:"default"}},textStyle:{color:"#fff"}};var l=e("../util/ecData"),h=e("zrender/config"),m=e("zrender/tool/event"),V=e("zrender/tool/area"),U=e("zrender/tool/color"),d=e("zrender/tool/util"),p=e("zrender/shape/Base");return t.prototype={type:s.COMPONENT_TYPE_TOOLTIP,_gCssText:"position:absolute;display:block;border-style:solid;white-space:nowrap;",_style:function(e){if(!e)return"";var t=[];if(e.transitionDuration){var i="left "+e.transitionDuration+"s,top "+e.transitionDuration+"s";t.push("transition:"+i),t.push("-moz-transition:"+i),t.push("-webkit-transition:"+i),t.push("-o-transition:"+i)}e.backgroundColor&&(t.push("background-Color:"+U.toHex(e.backgroundColor)),t.push("filter:alpha(opacity=70)"),t.push("background-Color:"+e.backgroundColor)),null!=e.borderWidth&&t.push("border-width:"+e.borderWidth+"px"),null!=e.borderColor&&t.push("border-color:"+e.borderColor),null!=e.borderRadius&&(t.push("border-radius:"+e.borderRadius+"px"),t.push("-moz-border-radius:"+e.borderRadius+"px"),t.push("-webkit-border-radius:"+e.borderRadius+"px"),t.push("-o-border-radius:"+e.borderRadius+"px"));var n=e.textStyle;n&&(n.color&&t.push("color:"+n.color),n.decoration&&t.push("text-decoration:"+n.decoration),n.align&&t.push("text-align:"+n.align),n.fontFamily&&t.push("font-family:"+n.fontFamily),n.fontSize&&t.push("font-size:"+n.fontSize+"px"),n.fontSize&&t.push("line-height:"+Math.round(3*n.fontSize/2)+"px"),n.fontStyle&&t.push("font-style:"+n.fontStyle),n.fontWeight&&t.push("font-weight:"+n.fontWeight));var a=e.padding;return null!=a&&(a=this.reformCssArray(a),t.push("padding:"+a[0]+"px "+a[1]+"px "+a[2]+"px "+a[3]+"px")),t=t.join(";")+";"},__hide:function(){this._lastDataIndex=-1,this._lastSeriesIndex=-1,this._lastItemTriggerId=-1,this._tDom&&(this._tDom.style.display="none");var e=!1;this._axisLineShape.invisible||(this._axisLineShape.invisible=!0, +this.zr.modShape(this._axisLineShape.id),e=!0),this._axisShadowShape.invisible||(this._axisShadowShape.invisible=!0,this.zr.modShape(this._axisShadowShape.id),e=!0),this._axisCrossShape.invisible||(this._axisCrossShape.invisible=!0,this.zr.modShape(this._axisCrossShape.id),e=!0),this._lastTipShape&&this._lastTipShape.tipShape.length>0&&(this.zr.delShape(this._lastTipShape.tipShape),this._lastTipShape=!1,this.shapeList.length=2),e&&this.zr.refreshNextFrame(),this.showing=!1},_show:function(e,t,i,n){var a=this._tDom.offsetHeight,o=this._tDom.offsetWidth;e&&("function"==typeof e&&(e=e([t,i])),e instanceof Array&&(t=e[0],i=e[1])),t+o>this._zrWidth&&(t-=o+40),i+a>this._zrHeight&&(i-=a-20),20>i&&(i=0),this._tDom.style.cssText=this._gCssText+this._defaultCssText+(n?n:"")+"left:"+t+"px;top:"+i+"px;",(10>a||10>o)&&setTimeout(this._refixed,20),this.showing=!0},__refixed:function(){if(this._tDom){var e="",t=this._tDom.offsetHeight,i=this._tDom.offsetWidth;this._tDom.offsetLeft+i>this._zrWidth&&(e+="left:"+(this._zrWidth-i-20)+"px;"),this._tDom.offsetTop+t>this._zrHeight&&(e+="top:"+(this._zrHeight-t-10)+"px;"),""!==e&&(this._tDom.style.cssText+=e)}},__tryShow:function(){var e,t;if(this._curTarget){if("island"===this._curTarget._type&&this.option.tooltip.show)return void this._showItemTrigger();var i=l.get(this._curTarget,"series"),n=l.get(this._curTarget,"data");e=this.deepQuery([n,i,this.option],"tooltip.show"),null!=i&&null!=n&&e?(t=this.deepQuery([n,i,this.option],"tooltip.trigger"),"axis"===t?this._showAxisTrigger(i.xAxisIndex,i.yAxisIndex,l.get(this._curTarget,"dataIndex")):this._showItemTrigger()):(clearTimeout(this._hidingTicket),clearTimeout(this._showingTicket),this._hidingTicket=setTimeout(this._hide,this._hideDelay))}else this._findPolarTrigger()||this._findAxisTrigger()},_findAxisTrigger:function(){if(!this.component.xAxis||!this.component.yAxis)return void(this._hidingTicket=setTimeout(this._hide,this._hideDelay));for(var e,t,i=this.option.series,n=0,a=i.length;a>n;n++)if("axis"===this.deepQuery([i[n],this.option],"tooltip.trigger"))return e=i[n].xAxisIndex||0,t=i[n].yAxisIndex||0,this.component.xAxis.getAxis(e)&&this.component.xAxis.getAxis(e).type===s.COMPONENT_TYPE_AXIS_CATEGORY?void this._showAxisTrigger(e,t,this._getNearestDataIndex("x",this.component.xAxis.getAxis(e))):this.component.yAxis.getAxis(t)&&this.component.yAxis.getAxis(t).type===s.COMPONENT_TYPE_AXIS_CATEGORY?void this._showAxisTrigger(e,t,this._getNearestDataIndex("y",this.component.yAxis.getAxis(t))):void this._showAxisTrigger(e,t,-1);"cross"===this.option.tooltip.axisPointer.type&&this._showAxisTrigger(-1,-1,-1)},_findPolarTrigger:function(){if(!this.component.polar)return!1;var e,t=m.getX(this._event),i=m.getY(this._event),n=this.component.polar.getNearestIndex([t,i]);return n?(e=n.valueIndex,n=n.polarIndex):n=-1,-1!=n?this._showPolarTrigger(n,e):!1},_getNearestDataIndex:function(e,t){var i=-1,n=m.getX(this._event),a=m.getY(this._event);if("x"===e){for(var o,r,s=this.component.grid.getXend(),l=t.getCoordByIndex(i);s>l&&(r=l,n>=l);)o=l,l=t.getCoordByIndex(++i);return 0>=i?i=0:r-n>=n-o?i-=1:null==t.getNameByIndex(i)&&(i-=1),i}for(var h,V,U=this.component.grid.getY(),l=t.getCoordByIndex(i);l>U&&(h=l,l>=a);)V=l,l=t.getCoordByIndex(++i);return 0>=i?i=0:a-h>=V-a?i-=1:null==t.getNameByIndex(i)&&(i-=1),i},_showAxisTrigger:function(e,t,i){if(!this._event.connectTrigger&&this.messageCenter.dispatch(s.EVENT.TOOLTIP_IN_GRID,this._event,null,this.myChart),null==this.component.xAxis||null==this.component.yAxis||null==e||null==t)return clearTimeout(this._hidingTicket),clearTimeout(this._showingTicket),void(this._hidingTicket=setTimeout(this._hide,this._hideDelay));var n,a,o,r,l=this.option.series,h=[],V=[],U="";if("axis"===this.option.tooltip.trigger){if(!this.option.tooltip.show)return;a=this.option.tooltip.formatter,o=this.option.tooltip.position}var d,p,c=-1!=e&&this.component.xAxis.getAxis(e).type===s.COMPONENT_TYPE_AXIS_CATEGORY?"xAxis":-1!=t&&this.component.yAxis.getAxis(t).type===s.COMPONENT_TYPE_AXIS_CATEGORY?"yAxis":!1;if(c){var u="xAxis"==c?e:t;n=this.component[c].getAxis(u);for(var y=0,g=l.length;g>y;y++)this._isSelected(l[y].name)&&l[y][c+"Index"]===u&&"axis"===this.deepQuery([l[y],this.option],"tooltip.trigger")&&(r=this.query(l[y],"tooltip.showContent")||r,a=this.query(l[y],"tooltip.formatter")||a,o=this.query(l[y],"tooltip.position")||o,U+=this._style(this.query(l[y],"tooltip")),null!=l[y].stack&&"xAxis"==c?(h.unshift(l[y]),V.unshift(y)):(h.push(l[y]),V.push(y)));this.messageCenter.dispatch(s.EVENT.TOOLTIP_HOVER,this._event,{seriesIndex:V,dataIndex:i},this.myChart);var b;"xAxis"==c?(d=this.subPixelOptimize(n.getCoordByIndex(i),this._axisLineWidth),p=m.getY(this._event),b=[d,this.component.grid.getY(),d,this.component.grid.getYend()]):(d=m.getX(this._event),p=this.subPixelOptimize(n.getCoordByIndex(i),this._axisLineWidth),b=[this.component.grid.getX(),p,this.component.grid.getXend(),p]),this._styleAxisPointer(h,b[0],b[1],b[2],b[3],n.getGap(),d,p)}else d=m.getX(this._event),p=m.getY(this._event),this._styleAxisPointer(l,this.component.grid.getX(),p,this.component.grid.getXend(),p,0,d,p),i>=0?this._showItemTrigger(!0):(clearTimeout(this._hidingTicket),clearTimeout(this._showingTicket),this._tDom.style.display="none");if(h.length>0){if(this._lastItemTriggerId=-1,this._lastDataIndex!=i||this._lastSeriesIndex!=V[0]){this._lastDataIndex=i,this._lastSeriesIndex=V[0];var f,k;if("function"==typeof a){for(var x=[],y=0,g=h.length;g>y;y++)f=h[y].data[i],k=this.getDataFromOption(f,"-"),x.push({seriesIndex:V[y],seriesName:h[y].name||"",series:h[y],dataIndex:i,data:f,name:n.getNameByIndex(i),value:k,0:h[y].name||"",1:n.getNameByIndex(i),2:k,3:f});this._curTicket="axis:"+i,this._tDom.innerHTML=a.call(this.myChart,x,this._curTicket,this._setContent)}else if("string"==typeof a){this._curTicket=0/0,a=a.replace("{a}","{a0}").replace("{b}","{b0}").replace("{c}","{c0}");for(var y=0,g=h.length;g>y;y++)a=a.replace("{a"+y+"}",this._encodeHTML(h[y].name||"")),a=a.replace("{b"+y+"}",this._encodeHTML(n.getNameByIndex(i))),f=h[y].data[i],f=this.getDataFromOption(f,"-"),a=a.replace("{c"+y+"}",f instanceof Array?f:this.numAddCommas(f));this._tDom.innerHTML=a}else{this._curTicket=0/0,a=this._encodeHTML(n.getNameByIndex(i));for(var y=0,g=h.length;g>y;y++)a+="
"+this._encodeHTML(h[y].name||"")+" : ",f=h[y].data[i],f=this.getDataFromOption(f,"-"),a+=f instanceof Array?f:this.numAddCommas(f);this._tDom.innerHTML=a}}if(r===!1||!this.option.tooltip.showContent)return;this.hasAppend||(this._tDom.style.left=this._zrWidth/2+"px",this._tDom.style.top=this._zrHeight/2+"px",this.dom.firstChild.appendChild(this._tDom),this.hasAppend=!0),this._show(o,d+10,p+10,U)}},_showPolarTrigger:function(e,t){if(null==this.component.polar||null==e||null==t||0>t)return!1;var i,n,a,o=this.option.series,r=[],s=[],l="";if("axis"===this.option.tooltip.trigger){if(!this.option.tooltip.show)return!1;i=this.option.tooltip.formatter,n=this.option.tooltip.position}for(var h=this.option.polar[e].indicator[t].text,V=0,U=o.length;U>V;V++)this._isSelected(o[V].name)&&o[V].polarIndex===e&&"axis"===this.deepQuery([o[V],this.option],"tooltip.trigger")&&(a=this.query(o[V],"tooltip.showContent")||a,i=this.query(o[V],"tooltip.formatter")||i,n=this.query(o[V],"tooltip.position")||n,l+=this._style(this.query(o[V],"tooltip")),r.push(o[V]),s.push(V));if(r.length>0){for(var d,p,c,u=[],V=0,U=r.length;U>V;V++){d=r[V].data;for(var y=0,g=d.length;g>y;y++)p=d[y],this._isSelected(p.name)&&(p=null!=p?p:{name:"",value:{dataIndex:"-"}},c=this.getDataFromOption(p.value[t]),u.push({seriesIndex:s[V],seriesName:r[V].name||"",series:r[V],dataIndex:t,data:p,name:p.name,indicator:h,value:c,0:r[V].name||"",1:p.name,2:c,3:h}))}if(u.length<=0)return;if(this._lastItemTriggerId=-1,this._lastDataIndex!=t||this._lastSeriesIndex!=s[0])if(this._lastDataIndex=t,this._lastSeriesIndex=s[0],"function"==typeof i)this._curTicket="axis:"+t,this._tDom.innerHTML=i.call(this.myChart,u,this._curTicket,this._setContent);else if("string"==typeof i){i=i.replace("{a}","{a0}").replace("{b}","{b0}").replace("{c}","{c0}").replace("{d}","{d0}");for(var V=0,U=u.length;U>V;V++)i=i.replace("{a"+V+"}",this._encodeHTML(u[V].seriesName)),i=i.replace("{b"+V+"}",this._encodeHTML(u[V].name)),i=i.replace("{c"+V+"}",this.numAddCommas(u[V].value)),i=i.replace("{d"+V+"}",this._encodeHTML(u[V].indicator));this._tDom.innerHTML=i}else{i=this._encodeHTML(u[0].name)+"
"+this._encodeHTML(u[0].indicator)+" : "+this.numAddCommas(u[0].value);for(var V=1,U=u.length;U>V;V++)i+="
"+this._encodeHTML(u[V].name)+"
",i+=this._encodeHTML(u[V].indicator)+" : "+this.numAddCommas(u[V].value);this._tDom.innerHTML=i}if(a===!1||!this.option.tooltip.showContent)return;return this.hasAppend||(this._tDom.style.left=this._zrWidth/2+"px",this._tDom.style.top=this._zrHeight/2+"px",this.dom.firstChild.appendChild(this._tDom),this.hasAppend=!0),this._show(n,m.getX(this._event),m.getY(this._event),l),!0}},_showItemTrigger:function(e){if(this._curTarget){var t,i,n,a=l.get(this._curTarget,"series"),o=l.get(this._curTarget,"seriesIndex"),r=l.get(this._curTarget,"data"),h=l.get(this._curTarget,"dataIndex"),V=l.get(this._curTarget,"name"),U=l.get(this._curTarget,"value"),d=l.get(this._curTarget,"special"),p=l.get(this._curTarget,"special2"),c=[r,a,this.option],u="";if("island"!=this._curTarget._type){var y=e?"axis":"item";this.option.tooltip.trigger===y&&(t=this.option.tooltip.formatter,i=this.option.tooltip.position),this.query(a,"tooltip.trigger")===y&&(n=this.query(a,"tooltip.showContent")||n,t=this.query(a,"tooltip.formatter")||t,i=this.query(a,"tooltip.position")||i,u+=this._style(this.query(a,"tooltip"))),n=this.query(r,"tooltip.showContent")||n,t=this.query(r,"tooltip.formatter")||t,i=this.query(r,"tooltip.position")||i,u+=this._style(this.query(r,"tooltip"))}else this._lastItemTriggerId=0/0,n=this.deepQuery(c,"tooltip.showContent"),t=this.deepQuery(c,"tooltip.islandFormatter"),i=this.deepQuery(c,"tooltip.islandPosition");this._lastDataIndex=-1,this._lastSeriesIndex=-1,this._lastItemTriggerId!==this._curTarget.id&&(this._lastItemTriggerId=this._curTarget.id,"function"==typeof t?(this._curTicket=(a.name||"")+":"+h,this._tDom.innerHTML=t.call(this.myChart,{seriesIndex:o,seriesName:a.name||"",series:a,dataIndex:h,data:r,name:V,value:U,percent:d,indicator:d,value2:p,indicator2:p,0:a.name||"",1:V,2:U,3:d,4:p,5:r,6:o,7:h},this._curTicket,this._setContent)):"string"==typeof t?(this._curTicket=0/0,t=t.replace("{a}","{a0}").replace("{b}","{b0}").replace("{c}","{c0}"),t=t.replace("{a0}",this._encodeHTML(a.name||"")).replace("{b0}",this._encodeHTML(V)).replace("{c0}",U instanceof Array?U:this.numAddCommas(U)),t=t.replace("{d}","{d0}").replace("{d0}",d||""),t=t.replace("{e}","{e0}").replace("{e0}",l.get(this._curTarget,"special2")||""),this._tDom.innerHTML=t):(this._curTicket=0/0,this._tDom.innerHTML=a.type===s.CHART_TYPE_RADAR&&d?this._itemFormatter.radar.call(this,a,V,U,d):a.type===s.CHART_TYPE_EVENTRIVER?this._itemFormatter.eventRiver.call(this,a,V,U,r):""+(null!=a.name?this._encodeHTML(a.name)+"
":"")+(""===V?"":this._encodeHTML(V)+" : ")+(U instanceof Array?U:this.numAddCommas(U))));var g=m.getX(this._event),b=m.getY(this._event);this.deepQuery(c,"tooltip.axisPointer.show")&&this.component.grid?this._styleAxisPointer([a],this.component.grid.getX(),b,this.component.grid.getXend(),b,0,g,b):this._hide(),n!==!1&&this.option.tooltip.showContent&&(this.hasAppend||(this._tDom.style.left=this._zrWidth/2+"px",this._tDom.style.top=this._zrHeight/2+"px",this.dom.firstChild.appendChild(this._tDom),this.hasAppend=!0),this._show(i,g+20,b-20,u))}},_itemFormatter:{radar:function(e,t,i,n){var a="";a+=this._encodeHTML(""===t?e.name||"":t),a+=""===a?"":"
";for(var o=0;o";return a},chord:function(e,t,i,n,a){if(null==a)return this._encodeHTML(t)+" ("+this.numAddCommas(i)+")";var o=this._encodeHTML(t),r=this._encodeHTML(n);return""+(null!=e.name?this._encodeHTML(e.name)+"
":"")+o+" -> "+r+" ("+this.numAddCommas(i)+")
"+r+" -> "+o+" ("+this.numAddCommas(a)+")"},eventRiver:function(e,t,i,n){var a="";a+=this._encodeHTML(""===e.name?"":e.name+" : "),a+=this._encodeHTML(t),a+=""===a?"":"
",n=n.evolution;for(var o=0,r=n.length;r>o;o++)a+='
',n[o].detail&&(n[o].detail.img&&(a+=''),a+='
'+n[o].time+"
",a+='',a+=n[o].detail.text+"
",a+="
");return a}},_styleAxisPointer:function(e,t,i,n,a,o,r,s){if(e.length>0){var l,h,m=this.option.tooltip.axisPointer,V=m.type,U={line:{},cross:{},shadow:{}};for(var d in U)U[d].color=m[d+"Style"].color,U[d].width=m[d+"Style"].width,U[d].type=m[d+"Style"].type;for(var p=0,c=e.length;c>p;p++)l=e[p],h=this.query(l,"tooltip.axisPointer.type"),V=h||V,h&&(U[h].color=this.query(l,"tooltip.axisPointer."+h+"Style.color")||U[h].color,U[h].width=this.query(l,"tooltip.axisPointer."+h+"Style.width")||U[h].width,U[h].type=this.query(l,"tooltip.axisPointer."+h+"Style.type")||U[h].type);if("line"===V){var u=U.line.width,y=t==n;this._axisLineShape.style={xStart:y?this.subPixelOptimize(t,u):t,yStart:y?i:this.subPixelOptimize(i,u),xEnd:y?this.subPixelOptimize(n,u):n,yEnd:y?a:this.subPixelOptimize(a,u),strokeColor:U.line.color,lineWidth:u,lineType:U.line.type},this._axisLineShape.invisible=!1,this.zr.modShape(this._axisLineShape.id)}else if("cross"===V){var g=U.cross.width;this._axisCrossShape.style={brushType:"stroke",rect:this.component.grid.getArea(),x:this.subPixelOptimize(r,g),y:this.subPixelOptimize(s,g),text:("( "+this.component.xAxis.getAxis(0).getValueFromCoord(r)+" , "+this.component.yAxis.getAxis(0).getValueFromCoord(s)+" )").replace(" , "," ").replace(" , "," "),textPosition:"specific",strokeColor:U.cross.color,lineWidth:g,lineType:U.cross.type},this.component.grid.getXend()-r>100?(this._axisCrossShape.style.textAlign="left",this._axisCrossShape.style.textX=r+10):(this._axisCrossShape.style.textAlign="right",this._axisCrossShape.style.textX=r-10),s-this.component.grid.getY()>50?(this._axisCrossShape.style.textBaseline="bottom",this._axisCrossShape.style.textY=s-10):(this._axisCrossShape.style.textBaseline="top",this._axisCrossShape.style.textY=s+10),this._axisCrossShape.invisible=!1,this.zr.modShape(this._axisCrossShape.id)}else"shadow"===V&&((null==U.shadow.width||"auto"===U.shadow.width||isNaN(U.shadow.width))&&(U.shadow.width=o),t===n?Math.abs(this.component.grid.getX()-t)<2?(U.shadow.width/=2,t=n+=U.shadow.width/2):Math.abs(this.component.grid.getXend()-t)<2&&(U.shadow.width/=2,t=n-=U.shadow.width/2):i===a&&(Math.abs(this.component.grid.getY()-i)<2?(U.shadow.width/=2,i=a+=U.shadow.width/2):Math.abs(this.component.grid.getYend()-i)<2&&(U.shadow.width/=2,i=a-=U.shadow.width/2)),this._axisShadowShape.style={xStart:t,yStart:i,xEnd:n,yEnd:a,strokeColor:U.shadow.color,lineWidth:U.shadow.width},this._axisShadowShape.invisible=!1,this.zr.modShape(this._axisShadowShape.id));this.zr.refreshNextFrame()}},__onmousemove:function(e){if(clearTimeout(this._hidingTicket),clearTimeout(this._showingTicket),!this._mousein||!this._enterable){var t=e.target,i=m.getX(e.event),n=m.getY(e.event);if(t){this._curTarget=t,this._event=e.event,this._event.zrenderX=i,this._event.zrenderY=n;var a;if(this._needAxisTrigger&&this.component.polar&&-1!=(a=this.component.polar.isInside([i,n])))for(var o=this.option.series,l=0,h=o.length;h>l;l++)if(o[l].polarIndex===a&&"axis"===this.deepQuery([o[l],this.option],"tooltip.trigger")){this._curTarget=null;break}this._showingTicket=setTimeout(this._tryShow,this._showDelay)}else this._curTarget=!1,this._event=e.event,this._event.zrenderX=i,this._event.zrenderY=n,this._needAxisTrigger&&this.component.grid&&V.isInside(r,this.component.grid.getArea(),i,n)?this._showingTicket=setTimeout(this._tryShow,this._showDelay):this._needAxisTrigger&&this.component.polar&&-1!=this.component.polar.isInside([i,n])?this._showingTicket=setTimeout(this._tryShow,this._showDelay):(!this._event.connectTrigger&&this.messageCenter.dispatch(s.EVENT.TOOLTIP_OUT_GRID,this._event,null,this.myChart),this._hidingTicket=setTimeout(this._hide,this._hideDelay))}},__onglobalout:function(){clearTimeout(this._hidingTicket),clearTimeout(this._showingTicket),this._hidingTicket=setTimeout(this._hide,this._hideDelay)},__setContent:function(e,t){this._tDom&&(e===this._curTicket&&(this._tDom.innerHTML=t),setTimeout(this._refixed,20))},ontooltipHover:function(e,t){if(!this._lastTipShape||this._lastTipShape&&this._lastTipShape.dataIndex!=e.dataIndex){this._lastTipShape&&this._lastTipShape.tipShape.length>0&&(this.zr.delShape(this._lastTipShape.tipShape),this.shapeList.length=2);for(var i=0,n=t.length;n>i;i++)t[i].zlevel=this.getZlevelBase(),t[i].z=this.getZBase(),t[i].style=p.prototype.getHighlightStyle(t[i].style,t[i].highlightStyle),t[i].draggable=!1,t[i].hoverable=!1,t[i].clickable=!1,t[i].ondragend=null,t[i].ondragover=null,t[i].ondrop=null,this.shapeList.push(t[i]),this.zr.addShape(t[i]);this._lastTipShape={dataIndex:e.dataIndex,tipShape:t}}},ondragend:function(){this._hide()},onlegendSelected:function(e){this._selectedMap=e.selected},_setSelectedMap:function(){this._selectedMap=this.component.legend?d.clone(this.component.legend.getSelectedMap()):{}},_isSelected:function(e){return null!=this._selectedMap[e]?this._selectedMap[e]:!0},showTip:function(e){if(e){var t,i=this.option.series;if(null!=e.seriesIndex)t=e.seriesIndex;else for(var n=e.seriesName,a=0,o=i.length;o>a;a++)if(i[a].name===n){t=a;break}var r=i[t];if(null!=r){var m=this.myChart.chart[r.type],V="axis"===this.deepQuery([r,this.option],"tooltip.trigger");if(m)if(V){var U=e.dataIndex;switch(m.type){case s.CHART_TYPE_LINE:case s.CHART_TYPE_BAR:case s.CHART_TYPE_K:case s.CHART_TYPE_RADAR:if(null==this.component.polar||r.data[0].value.length<=U)return;var d=r.polarIndex||0,p=this.component.polar.getVector(d,U,"max");this._event={zrenderX:p[0],zrenderY:p[1]},this._showPolarTrigger(d,U)}}else{var c,u,y=m.shapeList;switch(m.type){case s.CHART_TYPE_LINE:case s.CHART_TYPE_BAR:case s.CHART_TYPE_K:case s.CHART_TYPE_TREEMAP:case s.CHART_TYPE_SCATTER:for(var U=e.dataIndex,a=0,o=y.length;o>a;a++)if(null==y[a]._mark&&l.get(y[a],"seriesIndex")==t&&l.get(y[a],"dataIndex")==U){this._curTarget=y[a],c=y[a].style.x,u=m.type!=s.CHART_TYPE_K?y[a].style.y:y[a].style.y[0];break}break;case s.CHART_TYPE_RADAR:for(var U=e.dataIndex,a=0,o=y.length;o>a;a++)if("polygon"===y[a].type&&l.get(y[a],"seriesIndex")==t&&l.get(y[a],"dataIndex")==U){this._curTarget=y[a];var p=this.component.polar.getCenter(r.polarIndex||0);c=p[0],u=p[1];break}break;case s.CHART_TYPE_PIE:for(var g=e.name,a=0,o=y.length;o>a;a++)if("sector"===y[a].type&&l.get(y[a],"seriesIndex")==t&&l.get(y[a],"name")==g){this._curTarget=y[a];var b=this._curTarget.style,f=(b.startAngle+b.endAngle)/2*Math.PI/180;c=this._curTarget.style.x+Math.cos(f)*b.r/1.5,u=this._curTarget.style.y-Math.sin(f)*b.r/1.5;break}break;case s.CHART_TYPE_MAP:for(var g=e.name,k=r.mapType,a=0,o=y.length;o>a;a++)if("text"===y[a].type&&y[a]._mapType===k&&y[a].style._name===g){this._curTarget=y[a],c=this._curTarget.style.x+this._curTarget.position[0],u=this._curTarget.style.y+this._curTarget.position[1];break}break;case s.CHART_TYPE_CHORD:for(var g=e.name,a=0,o=y.length;o>a;a++)if("sector"===y[a].type&&l.get(y[a],"name")==g){this._curTarget=y[a];var b=this._curTarget.style,f=(b.startAngle+b.endAngle)/2*Math.PI/180;return c=this._curTarget.style.x+Math.cos(f)*(b.r-2),u=this._curTarget.style.y-Math.sin(f)*(b.r-2),void this.zr.trigger(h.EVENT.MOUSEMOVE,{zrenderX:c,zrenderY:u})}break;case s.CHART_TYPE_FORCE:for(var g=e.name,a=0,o=y.length;o>a;a++)if("circle"===y[a].type&&l.get(y[a],"name")==g){this._curTarget=y[a],c=this._curTarget.position[0],u=this._curTarget.position[1];break}}null!=c&&null!=u&&(this._event={zrenderX:c,zrenderY:u},this.zr.addHoverShape(this._curTarget),this.zr.refreshHover(),this._showItemTrigger())}}}},hideTip:function(){this._hide()},refresh:function(e){if(this._zrHeight=this.zr.getHeight(),this._zrWidth=this.zr.getWidth(),this._lastTipShape&&this._lastTipShape.tipShape.length>0&&this.zr.delShape(this._lastTipShape.tipShape),this._lastTipShape=!1,this.shapeList.length=2,this._lastDataIndex=-1,this._lastSeriesIndex=-1,this._lastItemTriggerId=-1,e){this.option=e,this.option.tooltip=this.reformOption(this.option.tooltip),this.option.tooltip.textStyle=d.merge(this.option.tooltip.textStyle,this.ecTheme.textStyle),this._needAxisTrigger=!1,"axis"===this.option.tooltip.trigger&&(this._needAxisTrigger=!0);for(var t=this.option.series,i=0,n=t.length;n>i;i++)if("axis"===this.query(t[i],"tooltip.trigger")){this._needAxisTrigger=!0;break}this._showDelay=this.option.tooltip.showDelay,this._hideDelay=this.option.tooltip.hideDelay,this._defaultCssText=this._style(this.option.tooltip),this._setSelectedMap(),this._axisLineWidth=this.option.tooltip.axisPointer.lineStyle.width,this._enterable=this.option.tooltip.enterable,!this._enterable&&this._tDom.className.indexOf(h.elementClassName)<0&&(this._tDom.className+=" "+h.elementClassName)}if(this.showing){var a=this;setTimeout(function(){a.zr.trigger(h.EVENT.MOUSEMOVE,a.zr.handler._event)},50)}},onbeforDispose:function(){this._lastTipShape&&this._lastTipShape.tipShape.length>0&&this.zr.delShape(this._lastTipShape.tipShape),clearTimeout(this._hidingTicket),clearTimeout(this._showingTicket),this.zr.un(h.EVENT.MOUSEMOVE,this._onmousemove),this.zr.un(h.EVENT.GLOBALOUT,this._onglobalout),this.hasAppend&&this.dom.firstChild&&this.dom.firstChild.removeChild(this._tDom),this._tDom=null},_encodeHTML:function(e){return String(e).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}},d.inherits(t,i),e("../component").define("tooltip",t),t}),i("echarts/component/legend",["require","./base","zrender/shape/Text","zrender/shape/Rectangle","zrender/shape/Sector","../util/shape/Icon","../util/shape/Candle","../config","zrender/tool/util","zrender/tool/area","../component"],function(e){function t(e,t,n,a,o){if(!this.query(a,"legend.data"))return void console.error("option.legend.data has not been defined.");i.call(this,e,t,n,a,o);var r=this;r._legendSelected=function(e){r.__legendSelected(e)},r._dispatchHoverLink=function(e){return r.__dispatchHoverLink(e)},this._colorIndex=0,this._colorMap={},this._selectedMap={},this._hasDataMap={},this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Rectangle"),o=e("zrender/shape/Sector"),r=e("../util/shape/Icon"),s=e("../util/shape/Candle"),l=e("../config");l.legend={zlevel:0,z:4,show:!0,orient:"horizontal",x:"center",y:"top",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,itemWidth:20,itemHeight:14,textStyle:{color:"#333"},selectedMode:!0};var h=e("zrender/tool/util"),m=e("zrender/tool/area");t.prototype={type:l.COMPONENT_TYPE_LEGEND,_buildShape:function(){if(this.legendOption.show){this._itemGroupLocation=this._getItemGroupLocation(),this._buildBackground(),this._buildItem();for(var e=0,t=this.shapeList.length;t>e;e++)this.zr.addShape(this.shapeList[e])}},_buildItem:function(){var e,t,i,a,o,s,l,V,U=this.legendOption.data,d=U.length,p=this.legendOption.textStyle,c=this.zr.getWidth(),u=this.zr.getHeight(),y=this._itemGroupLocation.x,g=this._itemGroupLocation.y,b=this.legendOption.itemWidth,f=this.legendOption.itemHeight,k=this.legendOption.itemGap;"vertical"===this.legendOption.orient&&"right"===this.legendOption.x&&(y=this._itemGroupLocation.x+this._itemGroupLocation.width-b);for(var x=0;d>x;x++)o=h.merge(U[x].textStyle||{},p),s=this.getFont(o),e=this._getName(U[x]),l=this._getFormatterName(e),""!==e?(t=U[x].icon||this._getSomethingByName(e).type,V=this.getColor(e),"horizontal"===this.legendOption.orient?200>c-y&&b+5+m.getTextWidth(l,s)+(x===d-1||""===U[x+1]?0:k)>=c-y&&(y=this._itemGroupLocation.x,g+=f+k):200>u-g&&f+(x===d-1||""===U[x+1]?0:k)>=u-g&&("right"===this.legendOption.x?y-=this._itemGroupLocation.maxWidth+k:y+=this._itemGroupLocation.maxWidth+k,g=this._itemGroupLocation.y),i=this._getItemShapeByType(y,g,b,f,this._selectedMap[e]&&this._hasDataMap[e]?V:"#ccc",t,V),i._name=e,i=new r(i),a={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:y+b+5,y:g+f/2,color:this._selectedMap[e]?"auto"===o.color?V:o.color:"#ccc",text:l,textFont:s,textBaseline:"middle"},highlightStyle:{color:V,brushType:"fill"},hoverable:!!this.legendOption.selectedMode,clickable:!!this.legendOption.selectedMode},"vertical"===this.legendOption.orient&&"right"===this.legendOption.x&&(a.style.x-=b+10,a.style.textAlign="right"),a._name=e,a=new n(a),this.legendOption.selectedMode&&(i.onclick=a.onclick=this._legendSelected,i.onmouseover=a.onmouseover=this._dispatchHoverLink,i.hoverConnect=a.id,a.hoverConnect=i.id),this.shapeList.push(i),this.shapeList.push(a),"horizontal"===this.legendOption.orient?y+=b+5+m.getTextWidth(l,s)+k:g+=f+k):"horizontal"===this.legendOption.orient?(y=this._itemGroupLocation.x,g+=f+k):("right"===this.legendOption.x?y-=this._itemGroupLocation.maxWidth+k:y+=this._itemGroupLocation.maxWidth+k,g=this._itemGroupLocation.y);"horizontal"===this.legendOption.orient&&"center"===this.legendOption.x&&g!=this._itemGroupLocation.y&&this._mLineOptimize()},_getName:function(e){return"undefined"!=typeof e.name?e.name:e},_getFormatterName:function(e){var t,i=this.legendOption.formatter;return t="function"==typeof i?i.call(this.myChart,e):"string"==typeof i?i.replace("{name}",e):e},_getFormatterNameFromData:function(e){var t=this._getName(e);return this._getFormatterName(t)},_mLineOptimize:function(){for(var e=[],t=this._itemGroupLocation.x,i=2,n=this.shapeList.length;n>i;i++)this.shapeList[i].style.x===t?e.push((this._itemGroupLocation.width-(this.shapeList[i-1].style.x+m.getTextWidth(this.shapeList[i-1].style.text,this.shapeList[i-1].style.textFont)-t))/2):i===n-1&&e.push((this._itemGroupLocation.width-(this.shapeList[i].style.x+m.getTextWidth(this.shapeList[i].style.text,this.shapeList[i].style.textFont)-t))/2);for(var a=-1,i=1,n=this.shapeList.length;n>i;i++)this.shapeList[i].style.x===t&&a++,0!==e[a]&&(this.shapeList[i].style.x+=e[a])},_buildBackground:function(){var e=this.reformCssArray(this.legendOption.padding);this.shapeList.push(new a({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._itemGroupLocation.x-e[3],y:this._itemGroupLocation.y-e[0],width:this._itemGroupLocation.width+e[3]+e[1],height:this._itemGroupLocation.height+e[0]+e[2],brushType:0===this.legendOption.borderWidth?"fill":"both",color:this.legendOption.backgroundColor,strokeColor:this.legendOption.borderColor,lineWidth:this.legendOption.borderWidth}}))},_getItemGroupLocation:function(){var e=this.legendOption.data,t=e.length,i=this.legendOption.itemGap,n=this.legendOption.itemWidth+5,a=this.legendOption.itemHeight,o=this.legendOption.textStyle,r=this.getFont(o),s=0,l=0,V=this.reformCssArray(this.legendOption.padding),U=this.zr.getWidth()-V[1]-V[3],d=this.zr.getHeight()-V[0]-V[2],p=0,c=0;if("horizontal"===this.legendOption.orient){l=a;for(var u=0;t>u;u++)if(""!==this._getName(e[u])){var y=m.getTextWidth(this._getFormatterNameFromData(e[u]),e[u].textStyle?this.getFont(h.merge(e[u].textStyle||{},o)):r);p+n+y+i>U?(p-=i,s=Math.max(s,p),l+=a+i,p=0):(p+=n+y+i,s=Math.max(s,p-i))}else p-=i,s=Math.max(s,p),l+=a+i,p=0}else{for(var u=0;t>u;u++)c=Math.max(c,m.getTextWidth(this._getFormatterNameFromData(e[u]),e[u].textStyle?this.getFont(h.merge(e[u].textStyle||{},o)):r));c+=n,s=c;for(var u=0;t>u;u++)""!==this._getName(e[u])?p+a+i>d?(s+=c+i,p-=i,l=Math.max(l,p),p=0):(p+=a+i,l=Math.max(l,p-i)):(s+=c+i,p-=i,l=Math.max(l,p),p=0)}U=this.zr.getWidth(),d=this.zr.getHeight();var g;switch(this.legendOption.x){case"center":g=Math.floor((U-s)/2);break;case"left":g=V[3]+this.legendOption.borderWidth;break;case"right":g=U-s-V[1]-V[3]-2*this.legendOption.borderWidth;break;default:g=this.parsePercent(this.legendOption.x,U)}var b;switch(this.legendOption.y){case"top":b=V[0]+this.legendOption.borderWidth;break;case"bottom":b=d-l-V[0]-V[2]-2*this.legendOption.borderWidth;break;case"center":b=Math.floor((d-l)/2);break;default:b=this.parsePercent(this.legendOption.y,d)}return{x:g,y:b,width:s,height:l,maxWidth:c}},_getSomethingByName:function(e){for(var t,i=this.option.series,n=0,a=i.length;a>n;n++){if(i[n].name===e)return{type:i[n].type,series:i[n],seriesIndex:n,data:null,dataIndex:-1};if(i[n].type===l.CHART_TYPE_PIE||i[n].type===l.CHART_TYPE_RADAR||i[n].type===l.CHART_TYPE_CHORD||i[n].type===l.CHART_TYPE_FORCE||i[n].type===l.CHART_TYPE_FUNNEL||i[n].type===l.CHART_TYPE_TREEMAP){t=i[n].categories||i[n].data||i[n].nodes;for(var o=0,r=t.length;r>o;o++)if(t[o].name===e)return{type:i[n].type,series:i[n],seriesIndex:n,data:t[o],dataIndex:o}}}return{type:"bar",series:null,seriesIndex:-1,data:null,dataIndex:-1}},_getItemShapeByType:function(e,t,i,n,a,o,r){var s,h="#ccc"===a?r:a,m={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{iconType:"legendicon"+o,x:e,y:t,width:i,height:n,color:a,strokeColor:a,lineWidth:2},highlightStyle:{color:h,strokeColor:h,lineWidth:1},hoverable:this.legendOption.selectedMode,clickable:this.legendOption.selectedMode};if(o.match("image")){var s=o.replace(new RegExp("^image:\\/\\/"),"");o="image"}switch(o){case"line":m.style.brushType="stroke",m.highlightStyle.lineWidth=3;break;case"radar":case"venn":case"tree":case"treemap":case"scatter":m.highlightStyle.lineWidth=3;break;case"k":m.style.brushType="both",m.highlightStyle.lineWidth=3,m.highlightStyle.color=m.style.color=this.deepQuery([this.ecTheme,l],"k.itemStyle.normal.color")||"#fff",m.style.strokeColor="#ccc"!=a?this.deepQuery([this.ecTheme,l],"k.itemStyle.normal.lineStyle.color")||"#ff3200":a;break;case"image":m.style.iconType="image",m.style.image=s,"#ccc"===a&&(m.style.opacity=.5)}return m},__legendSelected:function(e){var t=e.target._name;if("single"===this.legendOption.selectedMode)for(var i in this._selectedMap)this._selectedMap[i]=!1;this._selectedMap[t]=!this._selectedMap[t],this.messageCenter.dispatch(l.EVENT.LEGEND_SELECTED,e.event,{selected:this._selectedMap,target:t},this.myChart)},__dispatchHoverLink:function(e){this.messageCenter.dispatch(l.EVENT.LEGEND_HOVERLINK,e.event,{target:e.target._name},this.myChart)},refresh:function(e){if(e){this.option=e||this.option,this.option.legend=this.reformOption(this.option.legend),this.legendOption=this.option.legend;var t,i,n,a,o=this.legendOption.data||[];if(this.legendOption.selected)for(var r in this.legendOption.selected)this._selectedMap[r]="undefined"!=typeof this._selectedMap[r]?this._selectedMap[r]:this.legendOption.selected[r];for(var s=0,h=o.length;h>s;s++)t=this._getName(o[s]),""!==t&&(i=this._getSomethingByName(t),i.series?(this._hasDataMap[t]=!0,a=!i.data||i.type!==l.CHART_TYPE_PIE&&i.type!==l.CHART_TYPE_FORCE&&i.type!==l.CHART_TYPE_FUNNEL?[i.series]:[i.data,i.series],n=this.getItemStyleColor(this.deepQuery(a,"itemStyle.normal.color"),i.seriesIndex,i.dataIndex,i.data),n&&i.type!=l.CHART_TYPE_K&&this.setColor(t,n),this._selectedMap[t]=null!=this._selectedMap[t]?this._selectedMap[t]:!0):this._hasDataMap[t]=!1)}this.clear(),this._buildShape()},getRelatedAmount:function(e){for(var t,i=0,n=this.option.series,a=0,o=n.length;o>a;a++)if(n[a].name===e&&i++,n[a].type===l.CHART_TYPE_PIE||n[a].type===l.CHART_TYPE_RADAR||n[a].type===l.CHART_TYPE_CHORD||n[a].type===l.CHART_TYPE_FORCE||n[a].type===l.CHART_TYPE_FUNNEL){t=n[a].type!=l.CHART_TYPE_FORCE?n[a].data:n[a].categories;for(var r=0,s=t.length;s>r;r++)t[r].name===e&&"-"!=t[r].value&&i++}return i},setColor:function(e,t){this._colorMap[e]=t},getColor:function(e){return this._colorMap[e]||(this._colorMap[e]=this.zr.getColor(this._colorIndex++)),this._colorMap[e]},hasColor:function(e){return this._colorMap[e]?this._colorMap[e]:!1},add:function(e,t){ +for(var i=this.legendOption.data,n=0,a=i.length;a>n;n++)if(this._getName(i[n])===e)return;this.legendOption.data.push(e),this.setColor(e,t),this._selectedMap[e]=!0,this._hasDataMap[e]=!0},del:function(e){for(var t=this.legendOption.data,i=0,n=t.length;n>i;i++)if(this._getName(t[i])===e)return this.legendOption.data.splice(i,1)},getItemShape:function(e){if(null!=e)for(var t,i=0,n=this.shapeList.length;n>i;i++)if(t=this.shapeList[i],t._name===e&&"text"!=t.type)return t},setItemShape:function(e,t){for(var i,n=0,a=this.shapeList.length;a>n;n++)i=this.shapeList[n],i._name===e&&"text"!=i.type&&(this._selectedMap[e]||(t.style.color="#ccc",t.style.strokeColor="#ccc"),this.zr.modShape(i.id,t))},isSelected:function(e){return"undefined"!=typeof this._selectedMap[e]?this._selectedMap[e]:!0},getSelectedMap:function(){return this._selectedMap},setSelected:function(e,t){if("single"===this.legendOption.selectedMode)for(var i in this._selectedMap)this._selectedMap[i]=!1;this._selectedMap[e]=t,this.messageCenter.dispatch(l.EVENT.LEGEND_SELECTED,null,{selected:this._selectedMap,target:e},this.myChart)},onlegendSelected:function(e,t){var i=e.selected;for(var n in i)this._selectedMap[n]!=i[n]&&(t.needRefresh=!0),this._selectedMap[n]=i[n]}};var V={line:function(e,t){var i=t.height/2;e.moveTo(t.x,t.y+i),e.lineTo(t.x+t.width,t.y+i)},pie:function(e,t){var i=t.x,n=t.y,a=t.width,r=t.height;o.prototype.buildPath(e,{x:i+a/2,y:n+r+2,r:r,r0:6,startAngle:45,endAngle:135})},eventRiver:function(e,t){var i=t.x,n=t.y,a=t.width,o=t.height;e.moveTo(i,n+o),e.bezierCurveTo(i+a,n+o,i,n+4,i+a,n+4),e.lineTo(i+a,n),e.bezierCurveTo(i,n,i+a,n+o-4,i,n+o-4),e.lineTo(i,n+o)},k:function(e,t){var i=t.x,n=t.y,a=t.width,o=t.height;s.prototype.buildPath(e,{x:i+a/2,y:[n+1,n+1,n+o-6,n+o],width:a-6})},bar:function(e,t){var i=t.x,n=t.y+1,a=t.width,o=t.height-2,r=3;e.moveTo(i+r,n),e.lineTo(i+a-r,n),e.quadraticCurveTo(i+a,n,i+a,n+r),e.lineTo(i+a,n+o-r),e.quadraticCurveTo(i+a,n+o,i+a-r,n+o),e.lineTo(i+r,n+o),e.quadraticCurveTo(i,n+o,i,n+o-r),e.lineTo(i,n+r),e.quadraticCurveTo(i,n,i+r,n)},force:function(e,t){r.prototype.iconLibrary.circle(e,t)},radar:function(e,t){var i=6,n=t.x+t.width/2,a=t.y+t.height/2,o=t.height/2,r=2*Math.PI/i,s=-Math.PI/2,l=n+o*Math.cos(s),h=a+o*Math.sin(s);e.moveTo(l,h),s+=r;for(var m=0,V=i-1;V>m;m++)e.lineTo(n+o*Math.cos(s),a+o*Math.sin(s)),s+=r;e.lineTo(l,h)}};V.chord=V.pie,V.map=V.bar;for(var U in V)r.prototype.iconLibrary["legendicon"+U]=V[U];return h.inherits(t,i),e("../component").define("legend",t),t}),i("echarts/util/ecData",[],function(){function e(e,t,i,n,a,o,r,s){var l;return"undefined"!=typeof n&&(l=null==n.value?n:n.value),e._echartsData={_series:t,_seriesIndex:i,_data:n,_dataIndex:a,_name:o,_value:l,_special:r,_special2:s},e._echartsData}function t(e,t){var i=e._echartsData;if(!t)return i;switch(t){case"series":case"seriesIndex":case"data":case"dataIndex":case"name":case"value":case"special":case"special2":return i&&i["_"+t]}return null}function i(e,t,i){switch(e._echartsData=e._echartsData||{},t){case"series":case"seriesIndex":case"data":case"dataIndex":case"name":case"value":case"special":case"special2":e._echartsData["_"+t]=i}}function n(e,t){t._echartsData={_series:e._echartsData._series,_seriesIndex:e._echartsData._seriesIndex,_data:e._echartsData._data,_dataIndex:e._echartsData._dataIndex,_name:e._echartsData._name,_value:e._echartsData._value,_special:e._echartsData._special,_special2:e._echartsData._special2}}return{pack:e,set:i,get:t,clone:n}}),i("echarts/chart",[],function(){var e={},t={};return e.define=function(i,n){return t[i]=n,e},e.get=function(e){return t[e]},e}),i("zrender/tool/color",["require","../tool/util"],function(e){function t(e){D=e}function i(){D=N}function n(e,t){return e=0|e,t=t||D,t[e%t.length]}function a(e){B=e}function o(){H=B}function r(){return B}function s(e,t,i,n,a,o,r){O||(O=P.getContext());for(var s=O.createRadialGradient(e,t,i,n,a,o),l=0,h=r.length;h>l;l++)s.addColorStop(r[l][0],r[l][1]);return s.__nonRecursion=!0,s}function l(e,t,i,n,a){O||(O=P.getContext());for(var o=O.createLinearGradient(e,t,i,n),r=0,s=a.length;s>r;r++)o.addColorStop(a[r][0],a[r][1]);return o.__nonRecursion=!0,o}function h(e,t,i){e=p(e),t=p(t),e=I(e),t=I(t);for(var n=[],a=(t[0]-e[0])/i,o=(t[1]-e[1])/i,r=(t[2]-e[2])/i,s=(t[3]-e[3])/i,l=0,h=e[0],m=e[1],U=e[2],d=e[3];i>l;l++)n[l]=V([S(Math.floor(h),[0,255]),S(Math.floor(m),[0,255]),S(Math.floor(U),[0,255]),d.toFixed(4)-0],"rgba"),h+=a,m+=o,U+=r,d+=s;return h=t[0],m=t[1],U=t[2],d=t[3],n[l]=V([h,m,U,d],"rgba"),n}function m(e,t){var i=[],n=e.length;if(void 0===t&&(t=20),1===n)i=h(e[0],e[0],t);else if(n>1)for(var a=0,o=n-1;o>a;a++){var r=h(e[a],e[a+1],t);o-1>a&&r.pop(),i=i.concat(r)}return i}function V(e,t){if(t=t||"rgb",e&&(3===e.length||4===e.length)){if(e=C(e,function(e){return e>1?Math.ceil(e):e}),t.indexOf("hex")>-1)return"#"+((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1);if(t.indexOf("hs")>-1){var i=C(e.slice(1,3),function(e){return e+"%"});e[1]=i[0],e[2]=i[1]}return t.indexOf("a")>-1?(3===e.length&&e.push(1),e[3]=S(e[3],[0,1]),t+"("+e.slice(0,4).join(",")+")"):t+"("+e.slice(0,3).join(",")+")"}}function U(e){e=L(e),e.indexOf("rgba")<0&&(e=p(e));var t=[],i=0;return e.replace(/[\d.]+/g,function(e){e=3>i?0|e:+e,t[i++]=e}),t}function d(e,t){if(!E(e))return e;var i=I(e),n=i[3];return"undefined"==typeof n&&(n=1),e.indexOf("hsb")>-1?i=F(i):e.indexOf("hsl")>-1&&(i=T(i)),t.indexOf("hsb")>-1||t.indexOf("hsv")>-1?i=A(i):t.indexOf("hsl")>-1&&(i=M(i)),i[3]=n,V(i,t)}function p(e){return d(e,"rgba")}function c(e){return d(e,"rgb")}function u(e){return d(e,"hex")}function y(e){return d(e,"hsva")}function g(e){return d(e,"hsv")}function b(e){return d(e,"hsba")}function f(e){return d(e,"hsb")}function k(e){return d(e,"hsla")}function x(e){return d(e,"hsl")}function _(e){for(var t in G)if(u(G[t])===u(e))return t;return null}function L(e){return String(e).replace(/\s+/g,"")}function W(e){if(G[e]&&(e=G[e]),e=L(e),e=e.replace(/hsv/i,"hsb"),/^#[\da-f]{3}$/i.test(e)){e=parseInt(e.slice(1),16);var t=(3840&e)<<8,i=(240&e)<<4,n=15&e;e="#"+((1<<24)+(t<<4)+t+(i<<4)+i+(n<<4)+n).toString(16).slice(1)}return e}function X(e,t){if(!E(e))return e;var i=t>0?1:-1;"undefined"==typeof t&&(t=0),t=Math.abs(t)>1?1:Math.abs(t),e=c(e);for(var n=I(e),a=0;3>a;a++)n[a]=1===i?n[a]*(1-t)|0:(255-n[a])*t+n[a]|0;return"rgb("+n.join(",")+")"}function v(e){if(!E(e))return e;var t=I(p(e));return t=C(t,function(e){return 255-e}),V(t,"rgb")}function w(e,t,i){if(!E(e)||!E(t))return e;"undefined"==typeof i&&(i=.5),i=1-S(i,[0,1]);for(var n=2*i-1,a=I(p(e)),o=I(p(t)),r=a[3]-o[3],s=((n*r===-1?n:(n+r)/(1+n*r))+1)/2,l=1-s,h=[],m=0;3>m;m++)h[m]=a[m]*s+o[m]*l;var U=a[3]*i+o[3]*(1-i);return U=Math.max(0,Math.min(1,U)),1===a[3]&&1===o[3]?V(h,"rgb"):(h[3]=U,V(h,"rgba"))}function K(){return"#"+(Math.random().toString(16)+"0000").slice(2,8)}function I(e){e=W(e);var t=e.match(R);if(null===t)throw new Error("The color format error");var i,n,a,o=[];if(t[2])i=t[2].replace("#","").split(""),a=[i[0]+i[1],i[2]+i[3],i[4]+i[5]],o=C(a,function(e){return S(parseInt(e,16),[0,255])});else if(t[4]){var r=t[4].split(",");n=r[3],a=r.slice(0,3),o=C(a,function(e){return e=Math.floor(e.indexOf("%")>0?2.55*parseInt(e,0):e),S(e,[0,255])}),"undefined"!=typeof n&&o.push(S(parseFloat(n),[0,1]))}else if(t[5]||t[6]){var s=(t[5]||t[6]).split(","),l=parseInt(s[0],0)/360,h=s[1],m=s[2];n=s[3],o=C([h,m],function(e){return S(parseFloat(e)/100,[0,1])}),o.unshift(l),"undefined"!=typeof n&&o.push(S(parseFloat(n),[0,1]))}return o}function J(e,t){if(!E(e))return e;null===t&&(t=1);var i=I(p(e));return i[3]=S(Number(t).toFixed(4),[0,1]),V(i,"rgba")}function C(e,t){if("function"!=typeof t)throw new TypeError;for(var i=e?e.length:0,n=0;i>n;n++)e[n]=t(e[n]);return e}function S(e,t){return e<=t[0]?e=t[0]:e>=t[1]&&(e=t[1]),e}function E(e){return e instanceof Array||"string"==typeof e}function F(e){var t,i,n,a=e[0],o=e[1],r=e[2];if(0===o)t=255*r,i=255*r,n=255*r;else{var s=6*a;6===s&&(s=0);var l=0|s,h=r*(1-o),m=r*(1-o*(s-l)),V=r*(1-o*(1-(s-l))),U=0,d=0,p=0;0===l?(U=r,d=V,p=h):1===l?(U=m,d=r,p=h):2===l?(U=h,d=r,p=V):3===l?(U=h,d=m,p=r):4===l?(U=V,d=h,p=r):(U=r,d=h,p=m),t=255*U,i=255*d,n=255*p}return[t,i,n]}function T(e){var t,i,n,a=e[0],o=e[1],r=e[2];if(0===o)t=255*r,i=255*r,n=255*r;else{var s;s=.5>r?r*(1+o):r+o-o*r;var l=2*r-s;t=255*z(l,s,a+1/3),i=255*z(l,s,a),n=255*z(l,s,a-1/3)}return[t,i,n]}function z(e,t,i){return 0>i&&(i+=1),i>1&&(i-=1),1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+(t-e)*(2/3-i)*6:e}function A(e){var t,i,n=e[0]/255,a=e[1]/255,o=e[2]/255,r=Math.min(n,a,o),s=Math.max(n,a,o),l=s-r,h=s;if(0===l)t=0,i=0;else{i=l/s;var m=((s-n)/6+l/2)/l,V=((s-a)/6+l/2)/l,U=((s-o)/6+l/2)/l;n===s?t=U-V:a===s?t=1/3+m-U:o===s&&(t=2/3+V-m),0>t&&(t+=1),t>1&&(t-=1)}return t=360*t,i=100*i,h=100*h,[t,i,h]}function M(e){var t,i,n=e[0]/255,a=e[1]/255,o=e[2]/255,r=Math.min(n,a,o),s=Math.max(n,a,o),l=s-r,h=(s+r)/2;if(0===l)t=0,i=0;else{i=.5>h?l/(s+r):l/(2-s-r);var m=((s-n)/6+l/2)/l,V=((s-a)/6+l/2)/l,U=((s-o)/6+l/2)/l;n===s?t=U-V:a===s?t=1/3+m-U:o===s&&(t=2/3+V-m),0>t&&(t+=1),t>1&&(t-=1)}return t=360*t,i=100*i,h=100*h,[t,i,h]}var O,P=e("../tool/util"),D=["#ff9277"," #dddd00"," #ffc877"," #bbe3ff"," #d5ffbb","#bbbbff"," #ddb000"," #b0dd00"," #e2bbff"," #ffbbe3","#ff7777"," #ff9900"," #83dd00"," #77e3ff"," #778fff","#c877ff"," #ff77ab"," #ff6600"," #aa8800"," #77c7ff","#ad77ff"," #ff77ff"," #dd0083"," #777700"," #00aa00","#0088aa"," #8400dd"," #aa0088"," #dd0000"," #772e00"],N=D,B="rgba(255,255,0,0.5)",H=B,R=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,G={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#0ff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000",blanchedalmond:"#ffebcd",blue:"#00f",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#0ff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#f0f",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#789",lightslategrey:"#789",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#0f0",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#f0f",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#f00",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#fff",whitesmoke:"#f5f5f5",yellow:"#ff0",yellowgreen:"#9acd32"};return{customPalette:t,resetPalette:i,getColor:n,getHighlightColor:r,customHighlight:a,resetHighlight:o,getRadialGradient:s,getLinearGradient:l,getGradientColors:m,getStepColors:h,reverse:v,mix:w,lift:X,trim:L,random:K,toRGB:c,toRGBA:p,toHex:u,toHSL:x,toHSLA:k,toHSB:f,toHSBA:b,toHSV:g,toHSVA:y,toName:_,toColor:V,toArray:U,alpha:J,getData:I}}),i("echarts/component/timeline",["require","./base","zrender/shape/Rectangle","../util/shape/Icon","../util/shape/Chain","../config","zrender/tool/util","zrender/tool/area","zrender/tool/event","../component"],function(e){function t(e,t,i,a,o){n.call(this,e,t,i,a,o);var r=this;if(r._onclick=function(e){return r.__onclick(e)},r._ondrift=function(e,t){return r.__ondrift(this,e,t)},r._ondragend=function(){return r.__ondragend()},r._setCurrentOption=function(){var e=r.timelineOption;r.currentIndex%=e.data.length;var t=r.options[r.currentIndex]||{};r.myChart._setOption(t,e.notMerge,!0),r.messageCenter.dispatch(s.EVENT.TIMELINE_CHANGED,null,{currentIndex:r.currentIndex,data:null!=e.data[r.currentIndex].name?e.data[r.currentIndex].name:e.data[r.currentIndex]},r.myChart)},r._onFrame=function(){r._setCurrentOption(),r._syncHandleShape(),r.timelineOption.autoPlay&&(r.playTicket=setTimeout(function(){return r.currentIndex+=1,!r.timelineOption.loop&&r.currentIndex>=r.timelineOption.data.length?(r.currentIndex=r.timelineOption.data.length-1,void r.stop()):void r._onFrame()},r.timelineOption.playInterval))},this.setTheme(!1),this.options=this.option.options,this.currentIndex=this.timelineOption.currentIndex%this.timelineOption.data.length,this.timelineOption.notMerge||0===this.currentIndex||(this.options[this.currentIndex]=l.merge(this.options[this.currentIndex],this.options[0])),this.timelineOption.show&&(this._buildShape(),this._syncHandleShape()),this._setCurrentOption(),this.timelineOption.autoPlay){var r=this;this.playTicket=setTimeout(function(){r.play()},null!=this.ecTheme.animationDuration?this.ecTheme.animationDuration:s.animationDuration)}}function i(e,t){var i=2,n=t.x+i,a=t.y+i+2,r=t.width-i,s=t.height-i,l=t.symbol;if("last"===l)e.moveTo(n+r-2,a+s/3),e.lineTo(n+r-2,a),e.lineTo(n+2,a+s/2),e.lineTo(n+r-2,a+s),e.lineTo(n+r-2,a+s/3*2),e.moveTo(n,a),e.lineTo(n,a);else if("next"===l)e.moveTo(n+2,a+s/3),e.lineTo(n+2,a),e.lineTo(n+r-2,a+s/2),e.lineTo(n+2,a+s),e.lineTo(n+2,a+s/3*2),e.moveTo(n,a),e.lineTo(n,a);else if("play"===l)if("stop"===t.status)e.moveTo(n+2,a),e.lineTo(n+r-2,a+s/2),e.lineTo(n+2,a+s),e.lineTo(n+2,a);else{var h="both"===t.brushType?2:3;e.rect(n+2,a,h,s),e.rect(n+r-h-2,a,h,s)}else if(l.match("image")){var m="";m=l.replace(new RegExp("^image:\\/\\/"),""),l=o.prototype.iconLibrary.image,l(e,{x:n,y:a,width:r,height:s,image:m})}}var n=e("./base"),a=e("zrender/shape/Rectangle"),o=e("../util/shape/Icon"),r=e("../util/shape/Chain"),s=e("../config");s.timeline={zlevel:0,z:4,show:!0,type:"time",notMerge:!1,realtime:!0,x:80,x2:80,y2:0,height:50,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,controlPosition:"left",autoPlay:!1,loop:!0,playInterval:2e3,lineStyle:{width:1,color:"#666",type:"dashed"},label:{show:!0,interval:"auto",rotate:0,textStyle:{color:"#333"}},checkpointStyle:{symbol:"auto",symbolSize:"auto",color:"auto",borderColor:"auto",borderWidth:"auto",label:{show:!1,textStyle:{color:"auto"}}},controlStyle:{itemSize:15,itemGap:5,normal:{color:"#333"},emphasis:{color:"#1e90ff"}},symbol:"emptyDiamond",symbolSize:4,currentIndex:0};var l=e("zrender/tool/util"),h=e("zrender/tool/area"),m=e("zrender/tool/event");return t.prototype={type:s.COMPONENT_TYPE_TIMELINE,_buildShape:function(){if(this._location=this._getLocation(),this._buildBackground(),this._buildControl(),this._chainPoint=this._getChainPoint(),this.timelineOption.label.show)for(var e=this._getInterval(),t=0,i=this._chainPoint.length;i>t;t+=e)this._chainPoint[t].showLabel=!0;this._buildChain(),this._buildHandle();for(var t=0,n=this.shapeList.length;n>t;t++)this.zr.addShape(this.shapeList[t])},_getLocation:function(){var e,t=this.timelineOption,i=this.reformCssArray(this.timelineOption.padding),n=this.zr.getWidth(),a=this.parsePercent(t.x,n),o=this.parsePercent(t.x2,n);null==t.width?(e=n-a-o,o=n-o):(e=this.parsePercent(t.width,n),o=a+e);var r,s,l=this.zr.getHeight(),h=this.parsePercent(t.height,l);return null!=t.y?(r=this.parsePercent(t.y,l),s=r+h):(s=l-this.parsePercent(t.y2,l),r=s-h),{x:a+i[3],y:r+i[0],x2:o-i[1],y2:s-i[2],width:e-i[1]-i[3],height:h-i[0]-i[2]}},_getReformedLabel:function(e){var t=this.timelineOption,i=null!=t.data[e].name?t.data[e].name:t.data[e],n=t.data[e].formatter||t.label.formatter;return n&&("function"==typeof n?i=n.call(this.myChart,i):"string"==typeof n&&(i=n.replace("{value}",i))),i},_getInterval:function(){var e=this._chainPoint,t=this.timelineOption,i=t.label.interval;if("auto"===i){var n=t.label.textStyle.fontSize,a=t.data,o=t.data.length;if(o>3){var r,s,l=!1;for(i=0;!l&&o>i;){i++,l=!0;for(var m=i;o>m;m+=i){if(r=e[m].x-e[m-i].x,0!==t.label.rotate)s=n;else if(a[m].textStyle)s=h.getTextWidth(e[m].name,e[m].textFont);else{var V=e[m].name+"",U=(V.match(/\w/g)||"").length,d=V.length-U;s=U*n*2/3+d*n}if(s>r){l=!1;break}}}}else i=1}else i=i-0+1;return i},_getChainPoint:function(){function e(e){return null!=h[e].name?h[e].name:h[e]+""}var t,i=this.timelineOption,n=i.symbol.toLowerCase(),a=i.symbolSize,o=i.label.rotate,r=i.label.textStyle,s=this.getFont(r),h=i.data,m=this._location.x,V=this._location.y+this._location.height/4*3,U=this._location.x2-this._location.x,d=h.length,p=[];if(d>1){var c=U/d;if(c=c>50?50:20>c?5:c,U-=2*c,"number"===i.type)for(var u=0;d>u;u++)p.push(m+c+U/(d-1)*u);else{p[0]=new Date(e(0).replace(/-/g,"/")),p[d-1]=new Date(e(d-1).replace(/-/g,"/"))-p[0];for(var u=1;d>u;u++)p[u]=m+c+U*(new Date(e(u).replace(/-/g,"/"))-p[0])/p[d-1];p[0]=m+c}}else p.push(m+U/2);for(var y,g,b,f,k,x=[],u=0;d>u;u++)m=p[u],y=h[u].symbol&&h[u].symbol.toLowerCase()||n,y.match("empty")?(y=y.replace("empty",""),b=!0):b=!1,y.match("star")&&(g=y.replace("star","")-0||5,y="star"),t=h[u].textStyle?l.merge(h[u].textStyle||{},r):r,f=t.align||"center",o?(f=o>0?"right":"left",k=[o*Math.PI/180,m,V-5]):k=!1,x.push({x:m,n:g,isEmpty:b,symbol:y,symbolSize:h[u].symbolSize||a,color:h[u].color,borderColor:h[u].borderColor,borderWidth:h[u].borderWidth,name:this._getReformedLabel(u),textColor:t.color,textAlign:f,textBaseline:t.baseline||"middle",textX:m,textY:V-(o?5:0),textFont:h[u].textStyle?this.getFont(t):s,rotation:k,showLabel:!1});return x},_buildBackground:function(){var e=this.timelineOption,t=this.reformCssArray(this.timelineOption.padding),i=this._location.width,n=this._location.height;(0!==e.borderWidth||"rgba(0,0,0,0)"!=e.backgroundColor.replace(/\s/g,""))&&this.shapeList.push(new a({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._location.x-t[3],y:this._location.y-t[0],width:i+t[1]+t[3],height:n+t[0]+t[2],brushType:0===e.borderWidth?"fill":"both",color:e.backgroundColor,strokeColor:e.borderColor,lineWidth:e.borderWidth}}))},_buildControl:function(){var e=this,t=this.timelineOption,i=t.lineStyle,n=t.controlStyle;if("none"!==t.controlPosition){var a,r=n.itemSize,s=n.itemGap;"left"===t.controlPosition?(a=this._location.x,this._location.x+=3*(r+s)):(a=this._location.x2-(3*(r+s)-s),this._location.x2-=3*(r+s));var h=this._location.y,m={zlevel:this.getZlevelBase(),z:this.getZBase()+1,style:{iconType:"timelineControl",symbol:"last",x:a,y:h,width:r,height:r,brushType:"stroke",color:n.normal.color,strokeColor:n.normal.color,lineWidth:i.width},highlightStyle:{color:n.emphasis.color,strokeColor:n.emphasis.color,lineWidth:i.width+1},clickable:!0};this._ctrLastShape=new o(m),this._ctrLastShape.onclick=function(){e.last()},this.shapeList.push(this._ctrLastShape),a+=r+s,this._ctrPlayShape=new o(l.clone(m)),this._ctrPlayShape.style.brushType="fill",this._ctrPlayShape.style.symbol="play",this._ctrPlayShape.style.status=this.timelineOption.autoPlay?"playing":"stop",this._ctrPlayShape.style.x=a,this._ctrPlayShape.onclick=function(){"stop"===e._ctrPlayShape.style.status?e.play():e.stop()},this.shapeList.push(this._ctrPlayShape),a+=r+s,this._ctrNextShape=new o(l.clone(m)),this._ctrNextShape.style.symbol="next",this._ctrNextShape.style.x=a,this._ctrNextShape.onclick=function(){e.next()},this.shapeList.push(this._ctrNextShape)}},_buildChain:function(){var e=this.timelineOption,t=e.lineStyle;this._timelineShae={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:this._location.x,y:this.subPixelOptimize(this._location.y,t.width),width:this._location.x2-this._location.x,height:this._location.height,chainPoint:this._chainPoint,brushType:"both",strokeColor:t.color,lineWidth:t.width,lineType:t.type},hoverable:!1,clickable:!0,onclick:this._onclick},this._timelineShae=new r(this._timelineShae),this.shapeList.push(this._timelineShae)},_buildHandle:function(){var e=this._chainPoint[this.currentIndex],t=e.symbolSize+1;t=5>t?5:t,this._handleShape={zlevel:this.getZlevelBase(),z:this.getZBase()+1,hoverable:!1,draggable:!0,style:{iconType:"diamond",n:e.n,x:e.x-t,y:this._location.y+this._location.height/4-t,width:2*t,height:2*t,brushType:"both",textPosition:"specific",textX:e.x,textY:this._location.y-this._location.height/4,textAlign:"center",textBaseline:"middle"},highlightStyle:{},ondrift:this._ondrift,ondragend:this._ondragend},this._handleShape=new o(this._handleShape),this.shapeList.push(this._handleShape)},_syncHandleShape:function(){if(this.timelineOption.show){var e=this.timelineOption,t=e.checkpointStyle,i=this._chainPoint[this.currentIndex];this._handleShape.style.text=t.label.show?i.name:"",this._handleShape.style.textFont=i.textFont,this._handleShape.style.n=i.n,"auto"===t.symbol?this._handleShape.style.iconType="none"!=i.symbol?i.symbol:"diamond":(this._handleShape.style.iconType=t.symbol,t.symbol.match("star")&&(this._handleShape.style.n=t.symbol.replace("star","")-0||5,this._handleShape.style.iconType="star"));var n;"auto"===t.symbolSize?(n=i.symbolSize+2,n=5>n?5:n):n=t.symbolSize-0,this._handleShape.style.color="auto"===t.color?i.color?i.color:e.controlStyle.emphasis.color:t.color,this._handleShape.style.textColor="auto"===t.label.textStyle.color?this._handleShape.style.color:t.label.textStyle.color,this._handleShape.highlightStyle.strokeColor=this._handleShape.style.strokeColor="auto"===t.borderColor?i.borderColor?i.borderColor:"#fff":t.borderColor,this._handleShape.style.lineWidth="auto"===t.borderWidth?i.borderWidth?i.borderWidth:0:t.borderWidth-0,this._handleShape.highlightStyle.lineWidth=this._handleShape.style.lineWidth+1,this.zr.animate(this._handleShape.id,"style").when(500,{x:i.x-n,textX:i.x,y:this._location.y+this._location.height/4-n,width:2*n,height:2*n}).start("ExponentialOut")}},_findChainIndex:function(e){var t=this._chainPoint,i=t.length;if(e<=t[0].x)return 0;if(e>=t[i-1].x)return i-1;for(var n=0;i-1>n;n++)if(e>=t[n].x&&e<=t[n+1].x)return Math.abs(e-t[n].x)=n[a-1].x-n[a-1].symbolSize?(e.style.x=n[a-1].x-n[a-1].symbolSize,i=a-1):(e.style.x+=t,i=this._findChainIndex(e.style.x));var o=n[i],r=o.symbolSize+2;if(e.style.iconType=o.symbol,e.style.n=o.n,e.style.textX=e.style.x+r/2,e.style.y=this._location.y+this._location.height/4-r,e.style.width=2*r,e.style.height=2*r,e.style.text=o.name,i===this.currentIndex)return!0;if(this.currentIndex=i,this.timelineOption.realtime){clearTimeout(this.playTicket);var s=this;this.playTicket=setTimeout(function(){s._setCurrentOption()},200)}return!0},__ondragend:function(){this.isDragend=!0},ondragend:function(e,t){this.isDragend&&e.target&&(!this.timelineOption.realtime&&this._setCurrentOption(),t.dragOut=!0,t.dragIn=!0,t.needRefresh=!1,this.isDragend=!1,this._syncHandleShape())},last:function(){return this.timelineOption.autoPlay&&this.stop(),this.currentIndex-=1,this.currentIndex<0&&(this.currentIndex=this.timelineOption.data.length-1),this._onFrame(),this.currentIndex},next:function(){return this.timelineOption.autoPlay&&this.stop(),this.currentIndex+=1,this.currentIndex>=this.timelineOption.data.length&&(this.currentIndex=0),this._onFrame(),this.currentIndex},play:function(e,t){return this._ctrPlayShape&&"playing"!=this._ctrPlayShape.style.status&&(this._ctrPlayShape.style.status="playing",this.zr.modShape(this._ctrPlayShape.id),this.zr.refreshNextFrame()),this.timelineOption.autoPlay=null!=t?t:!0,this.timelineOption.autoPlay||clearTimeout(this.playTicket),this.currentIndex=null!=e?e:this.currentIndex+1,this.currentIndex>=this.timelineOption.data.length&&(this.currentIndex=0),this._onFrame(),this.currentIndex},stop:function(){return this._ctrPlayShape&&"stop"!=this._ctrPlayShape.style.status&&(this._ctrPlayShape.style.status="stop",this.zr.modShape(this._ctrPlayShape.id),this.zr.refreshNextFrame()),this.timelineOption.autoPlay=!1,clearTimeout(this.playTicket),this.currentIndex},resize:function(){this.timelineOption.show&&(this.clear(),this._buildShape(),this._syncHandleShape())},setTheme:function(e){this.timelineOption=this.reformOption(l.clone(this.option.timeline)),this.timelineOption.label.textStyle=this.getTextStyle(this.timelineOption.label.textStyle),this.timelineOption.checkpointStyle.label.textStyle=this.getTextStyle(this.timelineOption.checkpointStyle.label.textStyle),this.myChart.canvasSupported||(this.timelineOption.realtime=!1),this.timelineOption.show&&e&&(this.clear(),this._buildShape(),this._syncHandleShape())},onbeforDispose:function(){clearTimeout(this.playTicket)}},o.prototype.iconLibrary.timelineControl=i,l.inherits(t,n),e("../component").define("timeline",t),t}),i("zrender/shape/Image",["require","./Base","../tool/util"],function(e){var t=e("./Base"),i=function(e){t.call(this,e)};return i.prototype={type:"image",brush:function(e,t,i){var n=this.style||{};t&&(n=this.getHighlightStyle(n,this.highlightStyle||{}));var a=n.image,o=this;if(this._imageCache||(this._imageCache={}),"string"==typeof a){var r=a;this._imageCache[r]?a=this._imageCache[r]:(a=new Image,a.onload=function(){a.onload=null,o.modSelf(),i()},a.src=r,this._imageCache[r]=a)}if(a){if("IMG"==a.nodeName.toUpperCase())if(window.ActiveXObject){if("complete"!=a.readyState)return}else if(!a.complete)return;var s=n.width||a.width,l=n.height||a.height,h=n.x,m=n.y;if(!a.width||!a.height)return;if(e.save(),this.doClip(e),this.setContext(e,n),this.setTransform(e),n.sWidth&&n.sHeight){var V=n.sx||0,U=n.sy||0;e.drawImage(a,V,U,n.sWidth,n.sHeight,h,m,s,l)}else if(n.sx&&n.sy){var V=n.sx,U=n.sy,d=s-V,p=l-U;e.drawImage(a,V,U,d,p,h,m,s,l)}else e.drawImage(a,h,m,s,l);n.width||(n.width=s),n.height||(n.height=l),this.style.width||(this.style.width=s),this.style.height||(this.style.height=l),this.drawText(e,n,this.style),e.restore()}},getRect:function(e){return{x:e.x,y:e.y,width:e.width,height:e.height}},clearCache:function(){this._imageCache={}}},e("../tool/util").inherits(i,t),i}),i("zrender/loadingEffect/Bar",["require","./Base","../tool/util","../tool/color","../shape/Rectangle"],function(e){function t(e){i.call(this,e)}var i=e("./Base"),n=e("../tool/util"),a=e("../tool/color"),o=e("../shape/Rectangle");return n.inherits(t,i),t.prototype._start=function(e,t){var i=n.merge(this.options,{textStyle:{color:"#888"},backgroundColor:"rgba(250, 250, 250, 0.8)",effectOption:{x:0,y:this.canvasHeight/2-30,width:this.canvasWidth,height:5,brushType:"fill",timeInterval:100}}),r=this.createTextShape(i.textStyle),s=this.createBackgroundShape(i.backgroundColor),l=i.effectOption,h=new o({highlightStyle:n.clone(l)});return h.highlightStyle.color=l.color||a.getLinearGradient(l.x,l.y,l.x+l.width,l.y+l.height,[[0,"#ff6400"],[.5,"#ffe100"],[1,"#b1ff00"]]),null!=i.progress?(e(s),h.highlightStyle.width=this.adjust(i.progress,[0,1])*i.effectOption.width,e(h),e(r),void t()):(h.highlightStyle.width=0,setInterval(function(){e(s),h.highlightStyle.widthc;c++){var u="random"==l.color?a.alpha(a.random(),.3):l.color;U[c]=new o({highlightStyle:{x:Math.ceil(Math.random()*d),y:Math.ceil(Math.random()*p),r:Math.ceil(40*Math.random()),brushType:m,color:u,strokeColor:u,lineWidth:V},animationY:Math.ceil(20*Math.random())})}return setInterval(function(){e(s);for(var i=0;h>i;i++){var n=U[i].highlightStyle;n.y-U[i].animationY+n.r<=0&&(U[i].highlightStyle.y=p+n.r,U[i].highlightStyle.x=Math.ceil(Math.random()*d)),U[i].highlightStyle.y-=U[i].animationY,e(U[i])}e(r),t()},l.timeInterval)},t}),i("zrender/loadingEffect/DynamicLine",["require","./Base","../tool/util","../tool/color","../shape/Line"],function(e){function t(e){i.call(this,e)}var i=e("./Base"),n=e("../tool/util"),a=e("../tool/color"),o=e("../shape/Line");return n.inherits(t,i),t.prototype._start=function(e,t){for(var i=n.merge(this.options,{textStyle:{color:"#fff"},backgroundColor:"rgba(0, 0, 0, 0.8)",effectOption:{n:30,lineWidth:1,color:"random",timeInterval:100}}),r=this.createTextShape(i.textStyle),s=this.createBackgroundShape(i.backgroundColor),l=i.effectOption,h=l.n,m=l.lineWidth,V=[],U=this.canvasWidth,d=this.canvasHeight,p=0;h>p;p++){var c=-Math.ceil(1e3*Math.random()),u=Math.ceil(400*Math.random()),y=Math.ceil(Math.random()*d),g="random"==l.color?a.random():l.color;V[p]=new o({highlightStyle:{xStart:c,yStart:y,xEnd:c+u,yEnd:y,strokeColor:g,lineWidth:m},animationX:Math.ceil(100*Math.random()),len:u})}return setInterval(function(){e(s);for(var i=0;h>i;i++){var n=V[i].highlightStyle;n.xStart>=U&&(V[i].len=Math.ceil(400*Math.random()),n.xStart=-400,n.xEnd=-400+V[i].len,n.yStart=Math.ceil(Math.random()*d),n.yEnd=n.yStart),n.xStart+=V[i].animationX,n.xEnd+=V[i].animationX,e(V[i])}e(r),t()},l.timeInterval)},t}),i("zrender/loadingEffect/Ring",["require","./Base","../tool/util","../tool/color","../shape/Ring","../shape/Sector"],function(e){function t(e){i.call(this,e)}var i=e("./Base"),n=e("../tool/util"),a=e("../tool/color"),o=e("../shape/Ring"),r=e("../shape/Sector");return n.inherits(t,i),t.prototype._start=function(e,t){var i=n.merge(this.options,{textStyle:{color:"#07a"},backgroundColor:"rgba(250, 250, 250, 0.8)",effect:{x:this.canvasWidth/2,y:this.canvasHeight/2,r0:60,r:100,color:"#bbdcff",brushType:"fill",textPosition:"inside",textFont:"normal 30px verdana",textColor:"rgba(30, 144, 255, 0.6)",timeInterval:100}}),s=i.effect,l=i.textStyle; + +null==l.x&&(l.x=s.x),null==l.y&&(l.y=s.y+(s.r0+s.r)/2-5);for(var h=this.createTextShape(i.textStyle),m=this.createBackgroundShape(i.backgroundColor),V=s.x,U=s.y,d=s.r0+6,p=s.r-6,c=s.color,u=a.lift(c,.1),y=new o({highlightStyle:n.clone(s)}),g=[],b=a.getGradientColors(["#ff6400","#ffe100","#97ff00"],25),f=15,k=240,x=0;16>x;x++)g.push(new r({highlightStyle:{x:V,y:U,r0:d,r:p,startAngle:k-f,endAngle:k,brushType:"fill",color:u},_color:a.getLinearGradient(V+d*Math.cos(k,!0),U-d*Math.sin(k,!0),V+d*Math.cos(k-f,!0),U-d*Math.sin(k-f,!0),[[0,b[2*x]],[1,b[2*x+1]]])})),k-=f;k=360;for(var x=0;4>x;x++)g.push(new r({highlightStyle:{x:V,y:U,r0:d,r:p,startAngle:k-f,endAngle:k,brushType:"fill",color:u},_color:a.getLinearGradient(V+d*Math.cos(k,!0),U-d*Math.sin(k,!0),V+d*Math.cos(k-f,!0),U-d*Math.sin(k-f,!0),[[0,b[2*x+32]],[1,b[2*x+33]]])})),k-=f;var _=0;if(null!=i.progress){e(m),_=100*this.adjust(i.progress,[0,1]).toFixed(2)/5,y.highlightStyle.text=5*_+"%",e(y);for(var x=0;20>x;x++)g[x].highlightStyle.color=_>x?g[x]._color:u,e(g[x]);return e(h),void t()}return setInterval(function(){e(m),_+=_>=20?-20:1,e(y);for(var i=0;20>i;i++)g[i].highlightStyle.color=_>i?g[i]._color:u,e(g[i]);e(h),t()},s.timeInterval)},t}),i("zrender/loadingEffect/Spin",["require","./Base","../tool/util","../tool/color","../tool/area","../shape/Sector"],function(e){function t(e){i.call(this,e)}var i=e("./Base"),n=e("../tool/util"),a=e("../tool/color"),o=e("../tool/area"),r=e("../shape/Sector");return n.inherits(t,i),t.prototype._start=function(e,t){var i=n.merge(this.options,{textStyle:{color:"#fff",textAlign:"start"},backgroundColor:"rgba(0, 0, 0, 0.8)"}),s=this.createTextShape(i.textStyle),l=10,h=o.getTextWidth(s.highlightStyle.text,s.highlightStyle.textFont),m=o.getTextHeight(s.highlightStyle.text,s.highlightStyle.textFont),V=n.merge(this.options.effect||{},{r0:9,r:15,n:18,color:"#fff",timeInterval:100}),U=this.getLocation(this.options.textStyle,h+l+2*V.r,Math.max(2*V.r,m));V.x=U.x+V.r,V.y=s.highlightStyle.y=U.y+U.height/2,s.highlightStyle.x=V.x+V.r+l;for(var d=this.createBackgroundShape(i.backgroundColor),p=V.n,c=V.x,u=V.y,y=V.r0,g=V.r,b=V.color,f=[],k=Math.round(180/p),x=0;p>x;x++)f[x]=new r({highlightStyle:{x:c,y:u,r0:y,r:g,startAngle:k*x*2,endAngle:k*x*2+k,color:a.alpha(b,(x+1)/p),brushType:"fill"}});var _=[0,c,u];return setInterval(function(){e(d),_[0]-=.3;for(var i=0;p>i;i++)f[i].rotation=_,e(f[i]);e(s),t()},V.timeInterval)},t}),i("zrender/loadingEffect/Whirling",["require","./Base","../tool/util","../tool/area","../shape/Ring","../shape/Droplet","../shape/Circle"],function(e){function t(e){i.call(this,e)}var i=e("./Base"),n=e("../tool/util"),a=e("../tool/area"),o=e("../shape/Ring"),r=e("../shape/Droplet"),s=e("../shape/Circle");return n.inherits(t,i),t.prototype._start=function(e,t){var i=n.merge(this.options,{textStyle:{color:"#888",textAlign:"start"},backgroundColor:"rgba(250, 250, 250, 0.8)"}),l=this.createTextShape(i.textStyle),h=10,m=a.getTextWidth(l.highlightStyle.text,l.highlightStyle.textFont),V=a.getTextHeight(l.highlightStyle.text,l.highlightStyle.textFont),U=n.merge(this.options.effect||{},{r:18,colorIn:"#fff",colorOut:"#555",colorWhirl:"#6cf",timeInterval:50}),d=this.getLocation(this.options.textStyle,m+h+2*U.r,Math.max(2*U.r,V));U.x=d.x+U.r,U.y=l.highlightStyle.y=d.y+d.height/2,l.highlightStyle.x=U.x+U.r+h;var p=this.createBackgroundShape(i.backgroundColor),c=new r({highlightStyle:{a:Math.round(U.r/2),b:Math.round(U.r-U.r/6),brushType:"fill",color:U.colorWhirl}}),u=new s({highlightStyle:{r:Math.round(U.r/6),brushType:"fill",color:U.colorIn}}),y=new o({highlightStyle:{r0:Math.round(U.r-U.r/3),r:U.r,brushType:"fill",color:U.colorOut}}),g=[0,U.x,U.y];return c.highlightStyle.x=u.highlightStyle.x=y.highlightStyle.x=g[1],c.highlightStyle.y=u.highlightStyle.y=y.highlightStyle.y=g[2],setInterval(function(){e(p),e(y),g[0]-=.3,c.rotation=g,e(c),e(u),e(l),t()},U.timeInterval)},t}),i("echarts/theme/macarons",[],function(){var e={color:["#2ec7c9","#b6a2de","#5ab1ef","#ffb980","#d87a80","#8d98b3","#e5cf0d","#97b552","#95706d","#dc69aa","#07a2a4","#9a7fd1","#588dd5","#f5994e","#c05050","#59678c","#c9ab00","#7eb00a","#6f5553","#c14089"],title:{textStyle:{fontWeight:"normal",color:"#008acd"}},dataRange:{itemWidth:15,color:["#5ab1ef","#e0ffff"]},toolbox:{color:["#1e90ff","#1e90ff","#1e90ff","#1e90ff"],effectiveColor:"#ff4500"},tooltip:{backgroundColor:"rgba(50,50,50,0.5)",axisPointer:{type:"line",lineStyle:{color:"#008acd"},crossStyle:{color:"#008acd"},shadowStyle:{color:"rgba(200,200,200,0.2)"}}},dataZoom:{dataBackgroundColor:"#efefff",fillerColor:"rgba(182,162,222,0.2)",handleColor:"#008acd"},grid:{borderColor:"#eee"},categoryAxis:{axisLine:{lineStyle:{color:"#008acd"}},splitLine:{lineStyle:{color:["#eee"]}}},valueAxis:{axisLine:{lineStyle:{color:"#008acd"}},splitArea:{show:!0,areaStyle:{color:["rgba(250,250,250,0.1)","rgba(200,200,200,0.1)"]}},splitLine:{lineStyle:{color:["#eee"]}}},polar:{axisLine:{lineStyle:{color:"#ddd"}},splitArea:{show:!0,areaStyle:{color:["rgba(250,250,250,0.2)","rgba(200,200,200,0.2)"]}},splitLine:{lineStyle:{color:"#ddd"}}},timeline:{lineStyle:{color:"#008acd"},controlStyle:{normal:{color:"#008acd"},emphasis:{color:"#008acd"}},symbol:"emptyCircle",symbolSize:3},bar:{itemStyle:{normal:{barBorderRadius:5},emphasis:{barBorderRadius:5}}},line:{smooth:!0,symbol:"emptyCircle",symbolSize:3},k:{itemStyle:{normal:{color:"#d87a80",color0:"#2ec7c9",lineStyle:{color:"#d87a80",color0:"#2ec7c9"}}}},scatter:{symbol:"circle",symbolSize:4},radar:{symbol:"emptyCircle",symbolSize:3},map:{itemStyle:{normal:{areaStyle:{color:"#ddd"},label:{textStyle:{color:"#d87a80"}}},emphasis:{areaStyle:{color:"#fe994e"}}}},force:{itemStyle:{normal:{linkStyle:{color:"#1e90ff"}}}},chord:{itemStyle:{normal:{borderWidth:1,borderColor:"rgba(128, 128, 128, 0.5)",chordStyle:{lineStyle:{color:"rgba(128, 128, 128, 0.5)"}}},emphasis:{borderWidth:1,borderColor:"rgba(128, 128, 128, 0.5)",chordStyle:{lineStyle:{color:"rgba(128, 128, 128, 0.5)"}}}}},gauge:{axisLine:{lineStyle:{color:[[.2,"#2ec7c9"],[.8,"#5ab1ef"],[1,"#d87a80"]],width:10}},axisTick:{splitNumber:10,length:15,lineStyle:{color:"auto"}},splitLine:{length:22,lineStyle:{color:"auto"}},pointer:{width:5}},textStyle:{fontFamily:"微软雅黑, Arial, Verdana, sans-serif"}};return e}),i("echarts/theme/infographic",[],function(){var e={color:["#C1232B","#B5C334","#FCCE10","#E87C25","#27727B","#FE8463","#9BCA63","#FAD860","#F3A43B","#60C0DD","#D7504B","#C6E579","#F4E001","#F0805A","#26C0C0"],title:{textStyle:{fontWeight:"normal",color:"#27727B"}},dataRange:{x:"right",y:"center",itemWidth:5,itemHeight:25,color:["#C1232B","#FCCE10"]},toolbox:{color:["#C1232B","#B5C334","#FCCE10","#E87C25","#27727B","#FE8463","#9BCA63","#FAD860","#F3A43B","#60C0DD"],effectiveColor:"#ff4500"},tooltip:{backgroundColor:"rgba(50,50,50,0.5)",axisPointer:{type:"line",lineStyle:{color:"#27727B",type:"dashed"},crossStyle:{color:"#27727B"},shadowStyle:{color:"rgba(200,200,200,0.3)"}}},dataZoom:{dataBackgroundColor:"rgba(181,195,52,0.3)",fillerColor:"rgba(181,195,52,0.2)",handleColor:"#27727B"},grid:{borderWidth:0},categoryAxis:{axisLine:{lineStyle:{color:"#27727B"}},splitLine:{show:!1}},valueAxis:{axisLine:{show:!1},splitArea:{show:!1},splitLine:{lineStyle:{color:["#ccc"],type:"dashed"}}},polar:{axisLine:{lineStyle:{color:"#ddd"}},splitArea:{show:!0,areaStyle:{color:["rgba(250,250,250,0.2)","rgba(200,200,200,0.2)"]}},splitLine:{lineStyle:{color:"#ddd"}}},timeline:{lineStyle:{color:"#27727B"},controlStyle:{normal:{color:"#27727B"},emphasis:{color:"#27727B"}},symbol:"emptyCircle",symbolSize:3},line:{itemStyle:{normal:{borderWidth:2,borderColor:"#fff",lineStyle:{width:3}},emphasis:{borderWidth:0}},symbol:"circle",symbolSize:3.5},k:{itemStyle:{normal:{color:"#C1232B",color0:"#B5C334",lineStyle:{width:1,color:"#C1232B",color0:"#B5C334"}}}},scatter:{itemStyle:{normal:{borderWidth:1,borderColor:"rgba(200,200,200,0.5)"},emphasis:{borderWidth:0}},symbol:"star4",symbolSize:4},radar:{symbol:"emptyCircle",symbolSize:3},map:{itemStyle:{normal:{areaStyle:{color:"#ddd"},label:{textStyle:{color:"#C1232B"}}},emphasis:{areaStyle:{color:"#fe994e"},label:{textStyle:{color:"rgb(100,0,0)"}}}}},force:{itemStyle:{normal:{linkStyle:{color:"#27727B"}}}},chord:{itemStyle:{normal:{borderWidth:1,borderColor:"rgba(128, 128, 128, 0.5)",chordStyle:{lineStyle:{color:"rgba(128, 128, 128, 0.5)"}}},emphasis:{borderWidth:1,borderColor:"rgba(128, 128, 128, 0.5)",chordStyle:{lineStyle:{color:"rgba(128, 128, 128, 0.5)"}}}}},gauge:{center:["50%","80%"],radius:"100%",startAngle:180,endAngle:0,axisLine:{show:!0,lineStyle:{color:[[.2,"#B5C334"],[.8,"#27727B"],[1,"#C1232B"]],width:"40%"}},axisTick:{splitNumber:2,length:5,lineStyle:{color:"#fff"}},axisLabel:{textStyle:{color:"#fff",fontWeight:"bolder"}},splitLine:{length:"5%",lineStyle:{color:"#fff"}},pointer:{width:"40%",length:"80%",color:"#fff"},title:{offsetCenter:[0,-20],textStyle:{color:"auto",fontSize:20}},detail:{offsetCenter:[0,0],textStyle:{color:"auto",fontSize:40}}},textStyle:{fontFamily:"微软雅黑, Arial, Verdana, sans-serif"}};return e}),i("zrender/dep/excanvas",["require"],function(){return document.createElement("canvas").getContext?G_vmlCanvasManager=!1:!function(){function e(){return this.context_||(this.context_=new f(this))}function t(e,t){var i=O.call(arguments,2);return function(){return e.apply(t,i.concat(O.call(arguments)))}}function i(e){return String(e).replace(/&/g,"&").replace(/"/g,""")}function n(e,t,i){e.namespaces[t]||e.namespaces.add(t,i,"#default#VML")}function a(e){if(n(e,"g_vml_","urn:schemas-microsoft-com:vml"),n(e,"g_o_","urn:schemas-microsoft-com:office:office"),!e.styleSheets.ex_canvas_){var t=e.createStyleSheet();t.owningElement.id="ex_canvas_",t.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}function o(e){var t=e.srcElement;switch(e.propertyName){case"width":t.getContext().clearRect(),t.style.width=t.attributes.width.nodeValue+"px",t.firstChild.style.width=t.clientWidth+"px";break;case"height":t.getContext().clearRect(),t.style.height=t.attributes.height.nodeValue+"px",t.firstChild.style.height=t.clientHeight+"px"}}function r(e){var t=e.srcElement;t.firstChild&&(t.firstChild.style.width=t.clientWidth+"px",t.firstChild.style.height=t.clientHeight+"px")}function s(){return[[1,0,0],[0,1,0],[0,0,1]]}function l(e,t){for(var i=s(),n=0;3>n;n++)for(var a=0;3>a;a++){for(var o=0,r=0;3>r;r++)o+=e[n][r]*t[r][a];i[n][a]=o}return i}function h(e,t){t.fillStyle=e.fillStyle,t.lineCap=e.lineCap,t.lineJoin=e.lineJoin,t.lineWidth=e.lineWidth,t.miterLimit=e.miterLimit,t.shadowBlur=e.shadowBlur,t.shadowColor=e.shadowColor,t.shadowOffsetX=e.shadowOffsetX,t.shadowOffsetY=e.shadowOffsetY,t.strokeStyle=e.strokeStyle,t.globalAlpha=e.globalAlpha,t.font=e.font,t.textAlign=e.textAlign,t.textBaseline=e.textBaseline,t.scaleX_=e.scaleX_,t.scaleY_=e.scaleY_,t.lineScale_=e.lineScale_}function m(e){var t=e.indexOf("(",3),i=e.indexOf(")",t+1),n=e.substring(t+1,i).split(",");return(4!=n.length||"a"!=e.charAt(3))&&(n[3]=1),n}function V(e){return parseFloat(e)/100}function U(e,t,i){return Math.min(i,Math.max(t,e))}function d(e){var t,i,n,a,o,r;if(a=parseFloat(e[0])/360%360,0>a&&a++,o=U(V(e[1]),0,1),r=U(V(e[2]),0,1),0==o)t=i=n=r;else{var s=.5>r?r*(1+o):r+o-r*o,l=2*r-s;t=p(l,s,a+1/3),i=p(l,s,a),n=p(l,s,a-1/3)}return"#"+D[Math.floor(255*t)]+D[Math.floor(255*i)]+D[Math.floor(255*n)]}function p(e,t,i){return 0>i&&i++,i>1&&i--,1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+(t-e)*(2/3-i)*6:e}function c(e){if(e in R)return R[e];var t,i=1;if(e=String(e),"#"==e.charAt(0))t=e;else if(/^rgb/.test(e)){for(var n,a=m(e),t="#",o=0;3>o;o++)n=-1!=a[o].indexOf("%")?Math.floor(255*V(a[o])):+a[o],t+=D[U(n,0,255)];i=+a[3]}else if(/^hsl/.test(e)){var a=m(e);t=d(a),i=a[3]}else t=H[e]||e;return R[e]={color:t,alpha:i}}function u(e){if(Y[e])return Y[e];var t,i=document.createElement("div"),n=i.style;try{n.font=e,t=n.fontFamily.split(",")[0]}catch(a){}return Y[e]={style:n.fontStyle||G.style,variant:n.fontVariant||G.variant,weight:n.fontWeight||G.weight,size:n.fontSize||G.size,family:t||G.family}}function y(e,t){var i={};for(var n in e)i[n]=e[n];var a=parseFloat(t.currentStyle.fontSize),o=parseFloat(e.size);return i.size="number"==typeof e.size?e.size:-1!=e.size.indexOf("px")?o:-1!=e.size.indexOf("em")?a*o:-1!=e.size.indexOf("%")?a/100*o:-1!=e.size.indexOf("pt")?o/.75:a,i}function g(e){return e.style+" "+e.variant+" "+e.weight+" "+e.size+"px '"+e.family+"'"}function b(e){return Q[e]||"square"}function f(e){this.m_=s(),this.mStack_=[],this.aStack_=[],this.currentPath_=[],this.strokeStyle="#000",this.fillStyle="#000",this.lineWidth=1,this.lineJoin="miter",this.lineCap="butt",this.miterLimit=1*A,this.globalAlpha=1,this.font="12px 微软雅黑",this.textAlign="left",this.textBaseline="alphabetic",this.canvas=e;var t="width:"+e.clientWidth+"px;height:"+e.clientHeight+"px;overflow:hidden;position:absolute",i=e.ownerDocument.createElement("div");i.style.cssText=t,e.appendChild(i);var n=i.cloneNode(!1);n.style.backgroundColor="#fff",n.style.filter="alpha(opacity=0)",e.appendChild(n),this.element_=i,this.scaleX_=1,this.scaleY_=1,this.lineScale_=1}function k(e,t,i,n){e.currentPath_.push({type:"bezierCurveTo",cp1x:t.x,cp1y:t.y,cp2x:i.x,cp2y:i.y,x:n.x,y:n.y}),e.currentX_=n.x,e.currentY_=n.y}function x(e,t){var i=c(e.strokeStyle),n=i.color,a=i.alpha*e.globalAlpha,o=e.lineScale_*e.lineWidth;1>o&&(a*=o),t.push("')}function _(e,t,i,n){var a=e.fillStyle,o=e.scaleX_,r=e.scaleY_,s=n.x-i.x,l=n.y-i.y;if(a instanceof v){var h=0,m={x:0,y:0},V=0,U=1;if("gradient"==a.type_){var d=a.x0_/o,p=a.y0_/r,u=a.x1_/o,y=a.y1_/r,g=L(e,d,p),b=L(e,u,y),f=b.x-g.x,k=b.y-g.y;h=180*Math.atan2(f,k)/Math.PI,0>h&&(h+=360),1e-6>h&&(h=0)}else{var g=L(e,a.x0_,a.y0_);m={x:(g.x-i.x)/s,y:(g.y-i.y)/l},s/=o*A,l/=r*A;var x=C.max(s,l);V=2*a.r0_/x,U=2*a.r1_/x-V}var _=a.colors_;_.sort(function(e,t){return e.offset-t.offset});for(var W=_.length,X=_[0].color,K=_[W-1].color,I=_[0].alpha*e.globalAlpha,J=_[W-1].alpha*e.globalAlpha,S=[],E=0;W>E;E++){var F=_[E];S.push(F.offset*U+V+" "+F.color)}t.push('')}else if(a instanceof w){if(s&&l){var T=-i.x,z=-i.y;t.push("')}}else{var M=c(e.fillStyle),O=M.color,P=M.alpha*e.globalAlpha;t.push('')}}function L(e,t,i){var n=e.m_;return{x:A*(t*n[0][0]+i*n[1][0]+n[2][0])-M,y:A*(t*n[0][1]+i*n[1][1]+n[2][1])-M}}function W(e){return isFinite(e[0][0])&&isFinite(e[0][1])&&isFinite(e[1][0])&&isFinite(e[1][1])&&isFinite(e[2][0])&&isFinite(e[2][1])}function X(e,t,i){if(W(t)&&(e.m_=t,e.scaleX_=Math.sqrt(t[0][0]*t[0][0]+t[0][1]*t[0][1]),e.scaleY_=Math.sqrt(t[1][0]*t[1][0]+t[1][1]*t[1][1]),i)){var n=t[0][0]*t[1][1]-t[0][1]*t[1][0];e.lineScale_=z(T(n))}}function v(e){this.type_=e,this.x0_=0,this.y0_=0,this.r0_=0,this.x1_=0,this.y1_=0,this.r1_=0,this.colors_=[]}function w(e,t){switch(I(e),t){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=t;break;default:K("SYNTAX_ERR")}this.src_=e.src,this.width_=e.width,this.height_=e.height}function K(e){throw new J(e)}function I(e){e&&1==e.nodeType&&"IMG"==e.tagName||K("TYPE_MISMATCH_ERR"),"complete"!=e.readyState&&K("INVALID_STATE_ERR")}function J(e){this.code=this[e],this.message=e+": DOM Exception "+this.code}var C=Math,S=C.round,E=C.sin,F=C.cos,T=C.abs,z=C.sqrt,A=10,M=A/2,O=(+navigator.userAgent.match(/MSIE ([\d.]+)?/)[1],Array.prototype.slice);a(document);var P={init:function(e){var i=e||document;i.createElement("canvas"),i.attachEvent("onreadystatechange",t(this.init_,this,i))},init_:function(e){for(var t=e.getElementsByTagName("canvas"),i=0;iN;N++)for(var B=0;16>B;B++)D[16*N+B]=N.toString(16)+B.toString(16);var H={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"},R={},G={style:"normal",variant:"normal",weight:"normal",size:12,family:"微软雅黑"},Y={},Q={butt:"flat",round:"round"},Z=f.prototype;Z.clearRect=function(){this.textMeasureEl_&&(this.textMeasureEl_.removeNode(!0),this.textMeasureEl_=null),this.element_.innerHTML=""},Z.beginPath=function(){this.currentPath_=[]},Z.moveTo=function(e,t){var i=L(this,e,t);this.currentPath_.push({type:"moveTo",x:i.x,y:i.y}),this.currentX_=i.x,this.currentY_=i.y},Z.lineTo=function(e,t){var i=L(this,e,t);this.currentPath_.push({type:"lineTo",x:i.x,y:i.y}),this.currentX_=i.x,this.currentY_=i.y},Z.bezierCurveTo=function(e,t,i,n,a,o){var r=L(this,a,o),s=L(this,e,t),l=L(this,i,n);k(this,s,l,r)},Z.quadraticCurveTo=function(e,t,i,n){var a=L(this,e,t),o=L(this,i,n),r={x:this.currentX_+2/3*(a.x-this.currentX_),y:this.currentY_+2/3*(a.y-this.currentY_)},s={x:r.x+(o.x-this.currentX_)/3,y:r.y+(o.y-this.currentY_)/3};k(this,r,s,o)},Z.arc=function(e,t,i,n,a,o){i*=A;var r=o?"at":"wa",s=e+F(n)*i-M,l=t+E(n)*i-M,h=e+F(a)*i-M,m=t+E(a)*i-M;s!=h||o||(s+=.125);var V=L(this,e,t),U=L(this,s,l),d=L(this,h,m);this.currentPath_.push({type:r,x:V.x,y:V.y,radius:i,xStart:U.x,yStart:U.y,xEnd:d.x,yEnd:d.y})},Z.rect=function(e,t,i,n){this.moveTo(e,t),this.lineTo(e+i,t),this.lineTo(e+i,t+n),this.lineTo(e,t+n),this.closePath()},Z.strokeRect=function(e,t,i,n){var a=this.currentPath_;this.beginPath(),this.moveTo(e,t),this.lineTo(e+i,t),this.lineTo(e+i,t+n),this.lineTo(e,t+n),this.closePath(),this.stroke(),this.currentPath_=a},Z.fillRect=function(e,t,i,n){var a=this.currentPath_;this.beginPath(),this.moveTo(e,t),this.lineTo(e+i,t),this.lineTo(e+i,t+n),this.lineTo(e,t+n),this.closePath(),this.fill(),this.currentPath_=a},Z.createLinearGradient=function(e,t,i,n){var a=new v("gradient");return a.x0_=e,a.y0_=t,a.x1_=i,a.y1_=n,a},Z.createRadialGradient=function(e,t,i,n,a,o){var r=new v("gradientradial");return r.x0_=e,r.y0_=t,r.r0_=i,r.x1_=n,r.y1_=a,r.r1_=o,r},Z.drawImage=function(e){var t,i,n,a,o,r,s,l,h=e.runtimeStyle.width,m=e.runtimeStyle.height;e.runtimeStyle.width="auto",e.runtimeStyle.height="auto";var V=e.width,U=e.height;if(e.runtimeStyle.width=h,e.runtimeStyle.height=m,3==arguments.length)t=arguments[1],i=arguments[2],o=r=0,s=n=V,l=a=U;else if(5==arguments.length)t=arguments[1],i=arguments[2],n=arguments[3],a=arguments[4],o=r=0,s=V,l=U;else{if(9!=arguments.length)throw Error("Invalid number of arguments");o=arguments[1],r=arguments[2],s=arguments[3],l=arguments[4],t=arguments[5],i=arguments[6],n=arguments[7],a=arguments[8]}var d=L(this,t,i),p=[],c=10,u=10,y=b=1;if(p.push(" '),(o||r)&&p.push('
'),p.push('
'),(o||r)&&p.push("
"),p.push("
"),this.element_.insertAdjacentHTML("BeforeEnd",p.join(""))},Z.stroke=function(e){var t=[],i=10,n=10;t.push("o.x)&&(o.x=l.x),(null==a.y||l.yo.y)&&(o.y=l.y))}t.push(' ">'),e?_(this,t,a,o):x(this,t),t.push(""),this.element_.insertAdjacentHTML("beforeEnd",t.join(""))},Z.fill=function(){this.stroke(!0)},Z.closePath=function(){this.currentPath_.push({type:"close"})},Z.save=function(){var e={};h(this,e),this.aStack_.push(e),this.mStack_.push(this.m_),this.m_=l(s(),this.m_)},Z.restore=function(){this.aStack_.length&&(h(this.aStack_.pop(),this),this.m_=this.mStack_.pop())},Z.translate=function(e,t){var i=[[1,0,0],[0,1,0],[e,t,1]];X(this,l(i,this.m_),!1)},Z.rotate=function(e){var t=F(e),i=E(e),n=[[t,i,0],[-i,t,0],[0,0,1]];X(this,l(n,this.m_),!1)},Z.scale=function(e,t){var i=[[e,0,0],[0,t,0],[0,0,1]];X(this,l(i,this.m_),!0)},Z.transform=function(e,t,i,n,a,o){var r=[[e,t,0],[i,n,0],[a,o,1]];X(this,l(r,this.m_),!0)},Z.setTransform=function(e,t,i,n,a,o){var r=[[e,t,0],[i,n,0],[a,o,1]];X(this,r,!0)},Z.drawText_=function(e,t,n,a,o){var r=this.m_,s=1e3,l=0,h=s,m={x:0,y:0},V=[],U=y(u(this.font),this.element_),d=g(U),p=this.element_.currentStyle,c=this.textAlign.toLowerCase();switch(c){case"left":case"center":case"right":break;case"end":c="ltr"==p.direction?"right":"left";break;case"start":c="rtl"==p.direction?"right":"left";break;default:c="left"}switch(this.textBaseline){case"hanging":case"top":m.y=U.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":m.y=-U.size/2.25}switch(c){case"right":l=s,h=.05;break;case"center":l=h=s/2}var b=L(this,t+m.x,n+m.y);V.push(''),o?x(this,V):_(this,V,{x:-l,y:0},{x:h,y:U.size});var f=r[0][0].toFixed(3)+","+r[1][0].toFixed(3)+","+r[0][1].toFixed(3)+","+r[1][1].toFixed(3)+",0,0",k=S(b.x/A)+","+S(b.y/A);V.push('','',''),this.element_.insertAdjacentHTML("beforeEnd",V.join(""))},Z.fillText=function(e,t,i,n){this.drawText_(e,t,i,n,!1)},Z.strokeText=function(e,t,i,n){this.drawText_(e,t,i,n,!0)},Z.measureText=function(e){if(!this.textMeasureEl_){var t='';this.element_.insertAdjacentHTML("beforeEnd",t),this.textMeasureEl_=this.element_.lastChild}var i=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";try{this.textMeasureEl_.style.font=this.font}catch(n){}return this.textMeasureEl_.appendChild(i.createTextNode(e)),{width:this.textMeasureEl_.offsetWidth}},Z.clip=function(){},Z.arcTo=function(){},Z.createPattern=function(e,t){return new w(e,t)},v.prototype.addColorStop=function(e,t){t=c(t),this.colors_.push({offset:e,color:t.color,alpha:t.alpha})};var q=J.prototype=new Error;q.INDEX_SIZE_ERR=1,q.DOMSTRING_SIZE_ERR=2,q.HIERARCHY_REQUEST_ERR=3,q.WRONG_DOCUMENT_ERR=4,q.INVALID_CHARACTER_ERR=5,q.NO_DATA_ALLOWED_ERR=6,q.NO_MODIFICATION_ALLOWED_ERR=7,q.NOT_FOUND_ERR=8,q.NOT_SUPPORTED_ERR=9,q.INUSE_ATTRIBUTE_ERR=10,q.INVALID_STATE_ERR=11,q.SYNTAX_ERR=12,q.INVALID_MODIFICATION_ERR=13,q.NAMESPACE_ERR=14,q.INVALID_ACCESS_ERR=15,q.VALIDATION_ERR=16,q.TYPE_MISMATCH_ERR=17,G_vmlCanvasManager=P,CanvasRenderingContext2D=f,CanvasGradient=v,CanvasPattern=w,DOMException=J}(),G_vmlCanvasManager}),i("zrender/mixin/Eventful",["require"],function(){var e=function(){this._handlers={}};return e.prototype.one=function(e,t,i){var n=this._handlers;return t&&e?(n[e]||(n[e]=[]),n[e].push({h:t,one:!0,ctx:i||this}),this):this},e.prototype.bind=function(e,t,i){var n=this._handlers;return t&&e?(n[e]||(n[e]=[]),n[e].push({h:t,one:!1,ctx:i||this}),this):this},e.prototype.unbind=function(e,t){var i=this._handlers;if(!e)return this._handlers={},this;if(t){if(i[e]){for(var n=[],a=0,o=i[e].length;o>a;a++)i[e][a].h!=t&&n.push(i[e][a]);i[e]=n}i[e]&&0===i[e].length&&delete i[e]}else delete i[e];return this},e.prototype.dispatch=function(e){if(this._handlers[e]){var t=arguments,i=t.length;i>3&&(t=Array.prototype.slice.call(t,1));for(var n=this._handlers[e],a=n.length,o=0;a>o;){switch(i){case 1:n[o].h.call(n[o].ctx);break;case 2:n[o].h.call(n[o].ctx,t[1]);break;case 3:n[o].h.call(n[o].ctx,t[1],t[2]);break;default:n[o].h.apply(n[o].ctx,t)}n[o].one?(n.splice(o,1),a--):o++}}return this},e.prototype.dispatchWithContext=function(e){if(this._handlers[e]){var t=arguments,i=t.length;i>4&&(t=Array.prototype.slice.call(t,1,t.length-1));for(var n=t[t.length-1],a=this._handlers[e],o=a.length,r=0;o>r;){switch(i){case 1:a[r].h.call(n);break;case 2:a[r].h.call(n,t[1]);break;case 3:a[r].h.call(n,t[1],t[2]);break;default:a[r].h.apply(n,t)}a[r].one?(a.splice(r,1),o--):r++}}return this},e}),i("zrender/tool/log",["require","../config"],function(e){var t=e("../config");return function(){if(0!==t.debugMode)if(1==t.debugMode)for(var e in arguments)throw new Error(arguments[e]);else if(t.debugMode>1)for(var e in arguments)console.log(arguments[e])}}),i("zrender/tool/guid",[],function(){var e=2311;return function(){return"zrender__"+e++}}),i("zrender/Handler",["require","./config","./tool/env","./tool/event","./tool/util","./tool/vector","./tool/matrix","./mixin/Eventful"],function(e){"use strict";function t(e,t){return function(i,n){return e.call(t,i,n)}}function i(e,t){return function(i,n,a){return e.call(t,i,n,a)}}function n(e){for(var i=d.length;i--;){var n=d[i];e["_"+n+"Handler"]=t(c[n],e)}}function a(e,t,i){if(this._draggingTarget&&this._draggingTarget.id==e.id||e.isSilent())return!1;var n=this._event;if(e.isCover(t,i)){e.hoverable&&this.storage.addHover(e);for(var a=e.parent;a;){if(a.clipShape&&!a.clipShape.isCover(this._mouseX,this._mouseY))return!1;a=a.parent}return this._lastHover!=e&&(this._processOutShape(n),this._processDragLeave(n),this._lastHover=e,this._processDragEnter(n)),this._processOverShape(n),this._processDragOver(n),this._hasfound=1,!0}return!1}var o=e("./config"),r=e("./tool/env"),s=e("./tool/event"),l=e("./tool/util"),h=e("./tool/vector"),m=e("./tool/matrix"),V=o.EVENT,U=e("./mixin/Eventful"),d=["resize","click","dblclick","mousewheel","mousemove","mouseout","mouseup","mousedown","touchstart","touchend","touchmove"],p=function(e){if(window.G_vmlCanvasManager)return!0;e=e||window.event;var t=e.toElement||e.relatedTarget||e.srcElement||e.target;return t&&t.className.match(o.elementClassName)},c={resize:function(e){e=e||window.event,this._lastHover=null,this._isMouseDown=0,this.dispatch(V.RESIZE,e)},click:function(e,t){if(p(e)||t){e=this._zrenderEventFixed(e);var i=this._lastHover;(i&&i.clickable||!i)&&this._clickThreshold<5&&this._dispatchAgency(i,V.CLICK,e),this._mousemoveHandler(e)}},dblclick:function(e,t){if(p(e)||t){e=e||window.event,e=this._zrenderEventFixed(e);var i=this._lastHover;(i&&i.clickable||!i)&&this._clickThreshold<5&&this._dispatchAgency(i,V.DBLCLICK,e),this._mousemoveHandler(e)}},mousewheel:function(e,t){if(p(e)||t){e=this._zrenderEventFixed(e);var i=e.wheelDelta||-e.detail,n=i>0?1.1:1/1.1,a=!1,o=this._mouseX,r=this._mouseY;this.painter.eachBuildinLayer(function(t){var i=t.position;if(t.zoomable){t.__zoom=t.__zoom||1;var l=t.__zoom;l*=n,l=Math.max(Math.min(t.maxZoom,l),t.minZoom),n=l/t.__zoom,t.__zoom=l,i[0]-=(o-i[0])*(n-1),i[1]-=(r-i[1])*(n-1),t.scale[0]*=n,t.scale[1]*=n,t.dirty=!0,a=!0,s.stop(e)}}),a&&this.painter.refresh(),this._dispatchAgency(this._lastHover,V.MOUSEWHEEL,e),this._mousemoveHandler(e)}},mousemove:function(e,t){if((p(e)||t)&&!this.painter.isLoading()){e=this._zrenderEventFixed(e),this._lastX=this._mouseX,this._lastY=this._mouseY,this._mouseX=s.getX(e),this._mouseY=s.getY(e);var i=this._mouseX-this._lastX,n=this._mouseY-this._lastY;this._processDragStart(e),this._hasfound=0,this._event=e,this._iterateAndFindHover(),this._hasfound||((!this._draggingTarget||this._lastHover&&this._lastHover!=this._draggingTarget)&&(this._processOutShape(e), +this._processDragLeave(e)),this._lastHover=null,this.storage.delHover(),this.painter.clearHover());var a="default";if(this._draggingTarget)this.storage.drift(this._draggingTarget.id,i,n),this._draggingTarget.modSelf(),this.storage.addHover(this._draggingTarget),this._clickThreshold++;else if(this._isMouseDown){var o=!1;this.painter.eachBuildinLayer(function(e){e.panable&&(a="move",e.position[0]+=i,e.position[1]+=n,o=!0,e.dirty=!0)}),o&&this.painter.refresh()}this._draggingTarget||this._hasfound&&this._lastHover.draggable?a="move":this._hasfound&&this._lastHover.clickable&&(a="pointer"),this.root.style.cursor=a,this._dispatchAgency(this._lastHover,V.MOUSEMOVE,e),(this._draggingTarget||this._hasfound||this.storage.hasHoverShape())&&this.painter.refreshHover()}},mouseout:function(e,t){if(p(e)||t){e=this._zrenderEventFixed(e);var i=e.toElement||e.relatedTarget;if(i!=this.root)for(;i&&9!=i.nodeType;){if(i==this.root)return void this._mousemoveHandler(e);i=i.parentNode}e.zrenderX=this._lastX,e.zrenderY=this._lastY,this.root.style.cursor="default",this._isMouseDown=0,this._processOutShape(e),this._processDrop(e),this._processDragEnd(e),this.painter.isLoading()||this.painter.refreshHover(),this.dispatch(V.GLOBALOUT,e)}},mousedown:function(e,t){if(p(e)||t){if(this._clickThreshold=0,2==this._lastDownButton)return this._lastDownButton=e.button,void(this._mouseDownTarget=null);this._lastMouseDownMoment=new Date,e=this._zrenderEventFixed(e),this._isMouseDown=1,this._mouseDownTarget=this._lastHover,this._dispatchAgency(this._lastHover,V.MOUSEDOWN,e),this._lastDownButton=e.button}},mouseup:function(e,t){(p(e)||t)&&(e=this._zrenderEventFixed(e),this.root.style.cursor="default",this._isMouseDown=0,this._mouseDownTarget=null,this._dispatchAgency(this._lastHover,V.MOUSEUP,e),this._processDrop(e),this._processDragEnd(e))},touchstart:function(e,t){(p(e)||t)&&(e=this._zrenderEventFixed(e,!0),this._lastTouchMoment=new Date,this._mobileFindFixed(e),this._mousedownHandler(e))},touchmove:function(e,t){(p(e)||t)&&(e=this._zrenderEventFixed(e,!0),this._mousemoveHandler(e),this._isDragging&&s.stop(e))},touchend:function(e,t){if(p(e)||t){e=this._zrenderEventFixed(e,!0),this._mouseupHandler(e);var i=new Date;i-this._lastTouchMoment=0;o--){var r=n[o];if(t!==r.zlevel&&(i=this.painter.getLayer(r.zlevel,i),a[0]=this._mouseX,a[1]=this._mouseY,i.needTransform&&(m.invert(e,i.transform),h.applyTransform(a,a,e))),this._findHover(r,a[0],a[1]))break}}}();var y=[{x:10},{x:-20},{x:10,y:10},{y:-20}];return u.prototype._mobileFindFixed=function(e){this._lastHover=null,this._mouseX=e.zrenderX,this._mouseY=e.zrenderY,this._event=e,this._iterateAndFindHover();for(var t=0;!this._lastHover&&ts;s++){var h=e[s];if(n!==h.zlevel&&(i&&(i.needTransform&&o.restore(),o.flush&&o.flush()),n=h.zlevel,i=this.getLayer(n),i.isBuildin||r("ZLevel "+n+" has been used by unkown layer "+i.id),o=i.ctx,i.unusedCount=0,(i.dirty||t)&&i.clear(),i.needTransform&&(o.save(),i.setTransform(o))),(i.dirty||t)&&!h.invisible&&(!h.onbrush||h.onbrush&&!h.onbrush(o,!1)))if(a.catchBrushException)try{h.brush(o,!1,this.refreshNextFrame)}catch(m){r(m,"brush error of "+h.type,h)}else h.brush(o,!1,this.refreshNextFrame);h.__dirty=!1}i&&(i.needTransform&&o.restore(),o.flush&&o.flush()),this.eachBuildinLayer(this._postProcessLayer)},h.prototype.getLayer=function(e){var t=this._layers[e];return t||(t=new l(e,this),t.isBuildin=!0,this._layerConfig[e]&&o.merge(t,this._layerConfig[e],!0),t.updateTransform(),this.insertLayer(e,t),t.initContext()),t},h.prototype.insertLayer=function(e,t){if(this._layers[e])return void r("ZLevel "+e+" has been used already");if(!n(t))return void r("Layer of zlevel "+e+" is not valid");var i=this._zlevelList.length,a=null,o=-1;if(i>0&&e>this._zlevelList[0]){for(o=0;i-1>o&&!(this._zlevelList[o]e);o++);a=this._layers[this._zlevelList[o]]}this._zlevelList.splice(o+1,0,e);var s=a?a.dom:this._bgDom;s.nextSibling?s.parentNode.insertBefore(t.dom,s.nextSibling):s.parentNode.appendChild(t.dom),this._layers[e]=t},h.prototype.eachLayer=function(e,t){for(var i=0;in;n++){var o=e[n],r=o.zlevel,s=t[r];if(s){if(s.elCount++,s.dirty)continue;s.dirty=o.__dirty}}this.eachBuildinLayer(function(e,t){i[t]!==e.elCount&&(e.dirty=!0)})},h.prototype.refreshShapes=function(e,t){for(var i=0,n=e.length;n>i;i++){var a=e[i];a.modSelf()}return this.refresh(t),this},h.prototype.setLoadingEffect=function(e){return this._loadingEffect=e,this},h.prototype.clear=function(){return this.eachBuildinLayer(this._clearLayer),this},h.prototype._clearLayer=function(e){e.clear()},h.prototype.modLayer=function(e,t){if(t){this._layerConfig[e]?o.merge(this._layerConfig[e],t,!0):this._layerConfig[e]=t;var i=this._layers[e];i&&o.merge(i,this._layerConfig[e],!0)}},h.prototype.delLayer=function(e){var t=this._layers[e];t&&(this.modLayer(e,{position:t.position,rotation:t.rotation,scale:t.scale}),t.dom.parentNode.removeChild(t.dom),delete this._layers[e],this._zlevelList.splice(o.indexOf(this._zlevelList,e),1))},h.prototype.refreshHover=function(){this.clearHover();for(var e=this.storage.getHoverShapes(!0),t=0,i=e.length;i>t;t++)this._brushHover(e[t]);var n=this._layers.hover.ctx;return n.flush&&n.flush(),this.storage.delHover(),this},h.prototype.clearHover=function(){var e=this._layers.hover;return e&&e.clear(),this},h.prototype.showLoading=function(e){return this._loadingEffect&&this._loadingEffect.stop(),e&&this.setLoadingEffect(e),this._loadingEffect.start(this),this.loading=!0,this},h.prototype.hideLoading=function(){return this._loadingEffect.stop(),this.clearHover(),this.loading=!1,this},h.prototype.isLoading=function(){return this.loading},h.prototype.resize=function(){var e=this._domRoot;e.style.display="none";var t=this._getWidth(),i=this._getHeight();if(e.style.display="",this._width!=t||i!=this._height){this._width=t,this._height=i,e.style.width=t+"px",e.style.height=i+"px";for(var n in this._layers)this._layers[n].resize(t,i);this.refresh(null,!0)}return this},h.prototype.clearLayer=function(e){var t=this._layers[e];t&&t.clear()},h.prototype.dispose=function(){this.isLoading()&&this.hideLoading(),this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},h.prototype.getDomHover=function(){return this._layers.hover.dom},h.prototype.toDataURL=function(e,t,i){if(window.G_vmlCanvasManager)return null;var n=new l("image",this);this._bgDom.appendChild(n.dom),n.initContext();var o=n.ctx;n.clearColor=t||"#fff",n.clear();var s=this;this.storage.iterShape(function(e){if(!e.invisible&&(!e.onbrush||e.onbrush&&!e.onbrush(o,!1)))if(a.catchBrushException)try{e.brush(o,!1,s.refreshNextFrame)}catch(t){r(t,"brush error of "+e.type,e)}else e.brush(o,!1,s.refreshNextFrame)},{normal:"up",update:!0});var h=n.dom.toDataURL(e,i);return o=null,this._bgDom.removeChild(n.dom),h},h.prototype.getWidth=function(){return this._width},h.prototype.getHeight=function(){return this._height},h.prototype._getWidth=function(){var e=this.root,t=e.currentStyle||document.defaultView.getComputedStyle(e);return((e.clientWidth||parseInt(t.width,10))-parseInt(t.paddingLeft,10)-parseInt(t.paddingRight,10)).toFixed(0)-0},h.prototype._getHeight=function(){var e=this.root,t=e.currentStyle||document.defaultView.getComputedStyle(e);return((e.clientHeight||parseInt(t.height,10))-parseInt(t.paddingTop,10)-parseInt(t.paddingBottom,10)).toFixed(0)-0},h.prototype._brushHover=function(e){var t=this._layers.hover.ctx;if(!e.onbrush||e.onbrush&&!e.onbrush(t,!0)){var i=this.getLayer(e.zlevel);if(i.needTransform&&(t.save(),i.setTransform(t)),a.catchBrushException)try{e.brush(t,!0,this.refreshNextFrame)}catch(n){r(n,"hoverBrush error of "+e.type,e)}else e.brush(t,!0,this.refreshNextFrame);i.needTransform&&t.restore()}},h.prototype._shapeToImage=function(t,i,n,a,o){var r=document.createElement("canvas"),s=r.getContext("2d");r.style.width=n+"px",r.style.height=a+"px",r.setAttribute("width",n*o),r.setAttribute("height",a*o),s.clearRect(0,0,n*o,a*o);var l={position:i.position,rotation:i.rotation,scale:i.scale};i.position=[0,0,0],i.rotation=0,i.scale=[1,1],i&&i.brush(s,!1);var h=e("./shape/Image"),m=new h({id:t,style:{x:0,y:0,image:r}});return null!=l.position&&(m.position=i.position=l.position),null!=l.rotation&&(m.rotation=i.rotation=l.rotation),null!=l.scale&&(m.scale=i.scale=l.scale),m},h.prototype._createShapeToImageProcessor=function(){if(window.G_vmlCanvasManager)return i;var e=this;return function(t,i,n,o){return e._shapeToImage(t,i,n,o,a.devicePixelRatio)}},h}),i("zrender/Storage",["require","./tool/util","./Group"],function(e){"use strict";function t(e,t){return e.zlevel==t.zlevel?e.z==t.z?e.__renderidx-t.__renderidx:e.z-t.z:e.zlevel-t.zlevel}var i=e("./tool/util"),n=e("./Group"),a={hover:!1,normal:"down",update:!1},o=function(){this._elements={},this._hoverElements=[],this._roots=[],this._shapeList=[],this._shapeListOffset=0};return o.prototype.iterShape=function(e,t){if(t||(t=a),t.hover)for(var i=0,n=this._hoverElements.length;n>i;i++){var o=this._hoverElements[i];if(o.updateTransform(),e(o))return this}switch(t.update&&this.updateShapeList(),t.normal){case"down":for(var n=this._shapeList.length;n--;)if(e(this._shapeList[n]))return this;break;default:for(var i=0,n=this._shapeList.length;n>i;i++)if(e(this._shapeList[i]))return this}return this},o.prototype.getHoverShapes=function(e){for(var i=[],n=0,a=this._hoverElements.length;a>n;n++){i.push(this._hoverElements[n]);var o=this._hoverElements[n].hoverConnect;if(o){var r;o=o instanceof Array?o:[o];for(var s=0,l=o.length;l>s;s++)r=o[s].id?o[s]:this.get(o[s]),r&&i.push(r)}}if(i.sort(t),e)for(var n=0,a=i.length;a>n;n++)i[n].updateTransform();return i},o.prototype.getShapeList=function(e){return e&&this.updateShapeList(),this._shapeList},o.prototype.updateShapeList=function(){this._shapeListOffset=0;for(var e=0,i=this._roots.length;i>e;e++){var n=this._roots[e];this._updateAndAddShape(n)}this._shapeList.length=this._shapeListOffset;for(var e=0,i=this._shapeList.length;i>e;e++)this._shapeList[e].__renderidx=e;this._shapeList.sort(t)},o.prototype._updateAndAddShape=function(e,t){if(!e.ignore)if(e.updateTransform(),e.clipShape&&(e.clipShape.parent=e,e.clipShape.updateTransform(),t?(t=t.slice(),t.push(e.clipShape)):t=[e.clipShape]),"group"==e.type){for(var i=0;i0},o.prototype.addRoot=function(e){this._elements[e.id]||(e instanceof n&&e.addChildrenToStorage(this),this.addToMap(e),this._roots.push(e))},o.prototype.delRoot=function(e){if("undefined"==typeof e){for(var t=0;tt;t++)this.delRoot(e[t]);else{var r;r="string"==typeof e?this._elements[e]:e;var s=i.indexOf(this._roots,r);s>=0&&(this.delFromMap(r.id),this._roots.splice(s,1),r instanceof n&&r.delChildrenFromStorage(this))}},o.prototype.addToMap=function(e){return e instanceof n&&(e._storage=this),e.modSelf(),this._elements[e.id]=e,this},o.prototype.get=function(e){return this._elements[e]},o.prototype.delFromMap=function(e){var t=this._elements[e];return t&&(delete this._elements[e],t instanceof n&&(t._storage=null)),this},o.prototype.dispose=function(){this._elements=this._renderList=this._roots=this._hoverElements=null},o}),i("zrender/animation/Animation",["require","./Clip","../tool/color","../tool/util","../tool/event"],function(e){"use strict";function t(e,t){return e[t]}function i(e,t,i){e[t]=i}function n(e,t,i){return(t-e)*i+e}function a(e,t,i,a,o){var r=e.length;if(1==o)for(var s=0;r>s;s++)a[s]=n(e[s],t[s],i);else for(var l=e[0].length,s=0;r>s;s++)for(var h=0;l>h;h++)a[s][h]=n(e[s][h],t[s][h],i)}function o(e){switch(typeof e){case"undefined":case"string":return!1}return"undefined"!=typeof e.length}function r(e,t,i,n,a,o,r,l,h){var m=e.length;if(1==h)for(var V=0;m>V;V++)l[V]=s(e[V],t[V],i[V],n[V],a,o,r);else for(var U=e[0].length,V=0;m>V;V++)for(var d=0;U>d;d++)l[V][d]=s(e[V][d],t[V][d],i[V][d],n[V][d],a,o,r)}function s(e,t,i,n,a,o,r){var s=.5*(i-e),l=.5*(n-t);return(2*(t-i)+s+l)*r+(-3*(t-i)-2*s-l)*o+s*a+t}function l(e){if(o(e)){var t=e.length;if(o(e[0])){for(var i=[],n=0;t>n;n++)i.push(c.call(e[n]));return i}return c.call(e)}return e}function h(e){return e[0]=Math.floor(e[0]),e[1]=Math.floor(e[1]),e[2]=Math.floor(e[2]),"rgba("+e.join(",")+")"}var m=e("./Clip"),V=e("../tool/color"),U=e("../tool/util"),d=e("../tool/event").Dispatcher,p=window.requestAnimationFrame||window.msRequestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||function(e){setTimeout(e,16)},c=Array.prototype.slice,u=function(e){e=e||{},this.stage=e.stage||{},this.onframe=e.onframe||function(){},this._clips=[],this._running=!1,this._time=0,d.call(this)};u.prototype={add:function(e){this._clips.push(e)},remove:function(e){if(e.__inStep)e.__needsRemove=!0;else{var t=U.indexOf(this._clips,e);t>=0&&this._clips.splice(t,1)}},_update:function(){for(var e=(new Date).getTime(),t=e-this._time,i=this._clips,n=i.length,a=[],o=[],r=0;n>r;r++){var s=i[r];s.__inStep=!0;var l=s.step(e);s.__inStep=!1,l&&(a.push(l),o.push(s))}for(var r=0;n>r;)i[r].__needsRemove?(i[r]=i[n-1],i.pop(),n--):r++;n=a.length;for(var r=0;n>r;r++)o[r].fire(a[r]);this._time=e,this.onframe(t),this.dispatch("frame",t),this.stage.update&&this.stage.update()},start:function(){function e(){t._running&&(p(e),t._update())}var t=this;this._running=!0,this._time=(new Date).getTime(),p(e)},stop:function(){this._running=!1},clear:function(){this._clips=[]},animate:function(e,t){t=t||{};var i=new y(e,t.loop,t.getter,t.setter);return i.animation=this,i},constructor:u},U.merge(u.prototype,d.prototype,!0);var y=function(e,n,a,o){this._tracks={},this._target=e,this._loop=n||!1,this._getter=a||t,this._setter=o||i,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};return y.prototype={when:function(e,t){for(var i in t)this._tracks[i]||(this._tracks[i]=[],0!==e&&this._tracks[i].push({time:0,value:l(this._getter(this._target,i))})),this._tracks[i].push({time:parseInt(e,10),value:t[i]});return this},during:function(e){return this._onframeList.push(e),this},start:function(e){var t=this,i=this._setter,l=this._getter,U="spline"===e,d=function(){if(t._clipCount--,0===t._clipCount){t._tracks={};for(var e=t._doneList.length,i=0;e>i;i++)t._doneList[i].call(t)}},p=function(p,c){var u=p.length;if(u){var y=p[0].value,g=o(y),b=!1,f=g&&o(y[0])?2:1;p.sort(function(e,t){return e.time-t.time});var k;if(u){k=p[u-1].time;for(var x=[],_=[],L=0;u>L;L++){x.push(p[L].time/k);var W=p[L].value;"string"==typeof W&&(W=V.toArray(W),0===W.length&&(W[0]=W[1]=W[2]=0,W[3]=1),b=!0),_.push(W)}var X,L,v,w,K,I,J,C=0,S=0;if(b)var E=[0,0,0,0];var F=function(e,o){if(S>o){for(X=Math.min(C+1,u-1),L=X;L>=0&&!(x[L]<=o);L--);L=Math.min(L,u-2)}else{for(L=C;u>L&&!(x[L]>o);L++);L=Math.min(L-1,u-2)}C=L,S=o;var m=x[L+1]-x[L];if(0!==m){if(v=(o-x[L])/m,U)if(K=_[L],w=_[0===L?L:L-1],I=_[L>u-2?u-1:L+1],J=_[L>u-3?u-1:L+2],g)r(w,K,I,J,v,v*v,v*v*v,l(e,c),f);else{var V;b?(V=r(w,K,I,J,v,v*v,v*v*v,E,1),V=h(E)):V=s(w,K,I,J,v,v*v,v*v*v),i(e,c,V)}else if(g)a(_[L],_[L+1],v,l(e,c),f);else{var V;b?(a(_[L],_[L+1],v,E,1),V=h(E)):V=n(_[L],_[L+1],v),i(e,c,V)}for(L=0;L=t[1]&&(e=t[1]),e},t.prototype.getLocation=function(e,t,i){var n=null!=e.x?e.x:"center";switch(n){case"center":n=Math.floor((this.canvasWidth-t)/2);break;case"left":n=0;break;case"right":n=this.canvasWidth-t}var a=null!=e.y?e.y:"center";switch(a){case"center":a=Math.floor((this.canvasHeight-i)/2);break;case"top":a=0;break;case"bottom":a=this.canvasHeight-i}return{x:n,y:a,width:t,height:i}},t}),i("zrender/Layer",["require","./mixin/Transformable","./tool/util","./config"],function(e){function t(){return!1}function i(e,t,i){var n=document.createElement(t),a=i.getWidth(),o=i.getHeight();return n.style.position="absolute",n.style.left=0,n.style.top=0,n.style.width=a+"px",n.style.height=o+"px",n.width=a*r.devicePixelRatio,n.height=o*r.devicePixelRatio,n.setAttribute("data-zr-dom-id",e),n}var n=e("./mixin/Transformable"),a=e("./tool/util"),o=window.G_vmlCanvasManager,r=e("./config"),s=function(e,a){this.id=e,this.dom=i(e,"canvas",a),this.dom.onselectstart=t,this.dom.style["-webkit-user-select"]="none",this.dom.style["user-select"]="none",this.dom.style["-webkit-touch-callout"]="none",this.dom.style["-webkit-tap-highlight-color"]="rgba(0,0,0,0)",this.dom.className=r.elementClassName,o&&o.initElement(this.dom),this.domBack=null,this.ctxBack=null,this.painter=a,this.unusedCount=0,this.config=null,this.dirty=!0,this.elCount=0,this.clearColor=0,this.motionBlur=!1,this.lastFrameAlpha=.7,this.zoomable=!1,this.panable=!1,this.maxZoom=1/0,this.minZoom=0,n.call(this)};return s.prototype.initContext=function(){this.ctx=this.dom.getContext("2d");var e=r.devicePixelRatio;1!=e&&this.ctx.scale(e,e)},s.prototype.createBackBuffer=function(){if(!o){this.domBack=i("back-"+this.id,"canvas",this.painter),this.ctxBack=this.domBack.getContext("2d");var e=r.devicePixelRatio;1!=e&&this.ctxBack.scale(e,e)}},s.prototype.resize=function(e,t){var i=r.devicePixelRatio;this.dom.style.width=e+"px",this.dom.style.height=t+"px",this.dom.setAttribute("width",e*i),this.dom.setAttribute("height",t*i),1!=i&&this.ctx.scale(i,i),this.domBack&&(this.domBack.setAttribute("width",e*i),this.domBack.setAttribute("height",t*i),1!=i&&this.ctxBack.scale(i,i))},s.prototype.clear=function(){var e=this.dom,t=this.ctx,i=e.width,n=e.height,a=this.clearColor&&!o,s=this.motionBlur&&!o,l=this.lastFrameAlpha,h=r.devicePixelRatio;if(s&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(e,0,0,i/h,n/h)),t.clearRect(0,0,i/h,n/h),a&&(t.save(),t.fillStyle=this.clearColor,t.fillRect(0,0,i/h,n/h),t.restore()),s){var m=this.domBack;t.save(),t.globalAlpha=l,t.drawImage(m,0,0,i/h,n/h),t.restore()}},a.merge(s.prototype,n.prototype),s}),i("zrender/shape/Text",["require","../tool/area","./Base","../tool/util"],function(e){ +var t=e("../tool/area"),i=e("./Base"),n=function(e){i.call(this,e)};return n.prototype={type:"text",brush:function(e,i){var n=this.style;if(i&&(n=this.getHighlightStyle(n,this.highlightStyle||{})),"undefined"!=typeof n.text&&n.text!==!1){e.save(),this.doClip(e),this.setContext(e,n),this.setTransform(e),n.textFont&&(e.font=n.textFont),e.textAlign=n.textAlign||"start",e.textBaseline=n.textBaseline||"middle";var a,o=(n.text+"").split("\n"),r=t.getTextHeight("国",n.textFont),s=this.getRect(n),l=n.x;a="top"==n.textBaseline?s.y:"bottom"==n.textBaseline?s.y+r:s.y+r/2;for(var h=0,m=o.length;m>h;h++){if(n.maxWidth)switch(n.brushType){case"fill":e.fillText(o[h],l,a,n.maxWidth);break;case"stroke":e.strokeText(o[h],l,a,n.maxWidth);break;case"both":e.fillText(o[h],l,a,n.maxWidth),e.strokeText(o[h],l,a,n.maxWidth);break;default:e.fillText(o[h],l,a,n.maxWidth)}else switch(n.brushType){case"fill":e.fillText(o[h],l,a);break;case"stroke":e.strokeText(o[h],l,a);break;case"both":e.fillText(o[h],l,a),e.strokeText(o[h],l,a);break;default:e.fillText(o[h],l,a)}a+=r}e.restore()}},getRect:function(e){if(e.__rect)return e.__rect;var i=t.getTextWidth(e.text,e.textFont),n=t.getTextHeight(e.text,e.textFont),a=e.x;"end"==e.textAlign||"right"==e.textAlign?a-=i:"center"==e.textAlign&&(a-=i/2);var o;return o="top"==e.textBaseline?e.y:"bottom"==e.textBaseline?e.y-n:e.y-n/2,e.__rect={x:a,y:o,width:i,height:n},e.__rect}},e("../tool/util").inherits(n,i),n}),i("zrender/shape/Rectangle",["require","./Base","../tool/util"],function(e){var t=e("./Base"),i=function(e){t.call(this,e)};return i.prototype={type:"rectangle",_buildRadiusPath:function(e,t){var i,n,a,o,r=t.x,s=t.y,l=t.width,h=t.height,m=t.radius;"number"==typeof m?i=n=a=o=m:m instanceof Array?1===m.length?i=n=a=o=m[0]:2===m.length?(i=a=m[0],n=o=m[1]):3===m.length?(i=m[0],n=o=m[1],a=m[2]):(i=m[0],n=m[1],a=m[2],o=m[3]):i=n=a=o=0;var V;i+n>l&&(V=i+n,i*=l/V,n*=l/V),a+o>l&&(V=a+o,a*=l/V,o*=l/V),n+a>h&&(V=n+a,n*=h/V,a*=h/V),i+o>h&&(V=i+o,i*=h/V,o*=h/V),e.moveTo(r+i,s),e.lineTo(r+l-n,s),0!==n&&e.quadraticCurveTo(r+l,s,r+l,s+n),e.lineTo(r+l,s+h-a),0!==a&&e.quadraticCurveTo(r+l,s+h,r+l-a,s+h),e.lineTo(r+o,s+h),0!==o&&e.quadraticCurveTo(r,s+h,r,s+h-o),e.lineTo(r,s+i),0!==i&&e.quadraticCurveTo(r,s,r+i,s)},buildPath:function(e,t){t.radius?this._buildRadiusPath(e,t):(e.moveTo(t.x,t.y),e.lineTo(t.x+t.width,t.y),e.lineTo(t.x+t.width,t.y+t.height),e.lineTo(t.x,t.y+t.height),e.lineTo(t.x,t.y)),e.closePath()},getRect:function(e){if(e.__rect)return e.__rect;var t;return t="stroke"==e.brushType||"fill"==e.brushType?e.lineWidth||1:0,e.__rect={x:Math.round(e.x-t/2),y:Math.round(e.y-t/2),width:e.width+t,height:e.height+t},e.__rect}},e("../tool/util").inherits(i,t),i}),i("zrender/tool/area",["require","./util","./curve"],function(e){"use strict";function t(e){return e%=C,0>e&&(e+=C),e}function i(e,t,i,o){if(!t||!e)return!1;var r=e.type;L=L||W.getContext();var s=n(e,t,i,o);if("undefined"!=typeof s)return s;if(e.buildPath&&L.isPointInPath)return a(e,L,t,i,o);switch(r){case"ellipse":return!0;case"trochoid":var l="out"==t.location?t.r1+t.r2+t.d:t.r1-t.r2+t.d;return d(t,i,o,l);case"rose":return d(t,i,o,t.maxr);default:return!1}}function n(e,t,i,n){var a=e.type;switch(a){case"bezier-curve":return"undefined"==typeof t.cpX2?l(t.xStart,t.yStart,t.cpX1,t.cpY1,t.xEnd,t.yEnd,t.lineWidth,i,n):s(t.xStart,t.yStart,t.cpX1,t.cpY1,t.cpX2,t.cpY2,t.xEnd,t.yEnd,t.lineWidth,i,n);case"line":return r(t.xStart,t.yStart,t.xEnd,t.yEnd,t.lineWidth,i,n);case"polyline":return m(t.pointList,t.lineWidth,i,n);case"ring":return V(t.x,t.y,t.r0,t.r,i,n);case"circle":return d(t.x,t.y,t.r,i,n);case"sector":var o=t.startAngle*Math.PI/180,h=t.endAngle*Math.PI/180;return t.clockWise||(o=-o,h=-h),p(t.x,t.y,t.r0,t.r,o,h,!t.clockWise,i,n);case"path":return t.pathArray&&k(t.pathArray,Math.max(t.lineWidth,5),t.brushType,i,n);case"polygon":case"star":case"isogon":return c(t.pointList,i,n);case"text":var u=t.__rect||e.getRect(t);return U(u.x,u.y,u.width,u.height,i,n);case"rectangle":case"image":return U(t.x,t.y,t.width,t.height,i,n)}}function a(e,t,i,n,a){return t.beginPath(),e.buildPath(t,i),t.closePath(),t.isPointInPath(n,a)}function o(e,t,n,a){return!i(e,t,n,a)}function r(e,t,i,n,a,o,r){if(0===a)return!1;var s=Math.max(a,5),l=0,h=e;if(r>t+s&&r>n+s||t-s>r&&n-s>r||o>e+s&&o>i+s||e-s>o&&i-s>o)return!1;if(e===i)return Math.abs(o-e)<=s/2;l=(t-n)/(e-i),h=(e*n-i*t)/(e-i);var m=l*o-r+h,V=m*m/(l*l+1);return s/2*s/2>=V}function s(e,t,i,n,a,o,r,s,l,h,m){if(0===l)return!1;var V=Math.max(l,5);if(m>t+V&&m>n+V&&m>o+V&&m>s+V||t-V>m&&n-V>m&&o-V>m&&s-V>m||h>e+V&&h>i+V&&h>a+V&&h>r+V||e-V>h&&i-V>h&&a-V>h&&r-V>h)return!1;var U=X.cubicProjectPoint(e,t,i,n,a,o,r,s,h,m,null);return V/2>=U}function l(e,t,i,n,a,o,r,s,l){if(0===r)return!1;var h=Math.max(r,5);if(l>t+h&&l>n+h&&l>o+h||t-h>l&&n-h>l&&o-h>l||s>e+h&&s>i+h&&s>a+h||e-h>s&&i-h>s&&a-h>s)return!1;var m=X.quadraticProjectPoint(e,t,i,n,a,o,s,l,null);return h/2>=m}function h(e,i,n,a,o,r,s,l,h){if(0===s)return!1;var m=Math.max(s,5);l-=e,h-=i;var V=Math.sqrt(l*l+h*h);if(V-m>n||n>V+m)return!1;if(Math.abs(a-o)>=C)return!0;if(r){var U=a;a=t(o),o=t(U)}else a=t(a),o=t(o);a>o&&(o+=C);var d=Math.atan2(h,l);return 0>d&&(d+=C),d>=a&&o>=d||d+C>=a&&o>=d+C}function m(e,t,i,n){for(var t=Math.max(t,10),a=0,o=e.length-1;o>a;a++){var s=e[a][0],l=e[a][1],h=e[a+1][0],m=e[a+1][1];if(r(s,l,h,m,t,i,n))return!0}return!1}function V(e,t,i,n,a,o){var r=(a-e)*(a-e)+(o-t)*(o-t);return n*n>r&&r>i*i}function U(e,t,i,n,a,o){return a>=e&&e+i>=a&&o>=t&&t+n>=o}function d(e,t,i,n,a){return i*i>(n-e)*(n-e)+(a-t)*(a-t)}function p(e,t,i,n,a,o,r,s,l){return h(e,t,(i+n)/2,a,o,r,n-i,s,l)}function c(e,t,i){for(var n=e.length,a=0,o=0,r=n-1;n>o;o++){var s=e[r][0],l=e[r][1],h=e[o][0],m=e[o][1];a+=u(s,l,h,m,t,i),r=o}return 0!==a}function u(e,t,i,n,a,o){if(o>t&&o>n||t>o&&n>o)return 0;if(n==t)return 0;var r=t>n?1:-1,s=(o-t)/(n-t),l=s*(i-e)+e;return l>a?r:0}function y(){var e=E[0];E[0]=E[1],E[1]=e}function g(e,t,i,n,a,o,r,s,l,h){if(h>t&&h>n&&h>o&&h>s||t>h&&n>h&&o>h&&s>h)return 0;var m=X.cubicRootAt(t,n,o,s,h,S);if(0===m)return 0;for(var V,U,d=0,p=-1,c=0;m>c;c++){var u=S[c],g=X.cubicAt(e,i,a,r,u);l>g||(0>p&&(p=X.cubicExtrema(t,n,o,s,E),E[1]1&&y(),V=X.cubicAt(t,n,o,s,E[0]),p>1&&(U=X.cubicAt(t,n,o,s,E[1]))),d+=2==p?uV?1:-1:uU?1:-1:U>s?1:-1:uV?1:-1:V>s?1:-1)}return d}function b(e,t,i,n,a,o,r,s){if(s>t&&s>n&&s>o||t>s&&n>s&&o>s)return 0;var l=X.quadraticRootAt(t,n,o,s,S);if(0===l)return 0;var h=X.quadraticExtremum(t,n,o);if(h>=0&&1>=h){for(var m=0,V=X.quadraticAt(t,n,o,h),U=0;l>U;U++){var d=X.quadraticAt(e,i,a,S[U]);r>d||(m+=S[U]V?1:-1:V>o?1:-1)}return m}var d=X.quadraticAt(e,i,a,S[0]);return r>d?0:t>o?1:-1}function f(e,i,n,a,o,r,s,l){if(l-=i,l>n||-n>l)return 0;var h=Math.sqrt(n*n-l*l);if(S[0]=-h,S[1]=h,Math.abs(a-o)>=C){a=0,o=C;var m=r?1:-1;return s>=S[0]+e&&s<=S[1]+e?m:0}if(r){var h=a;a=t(o),o=t(h)}else a=t(a),o=t(o);a>o&&(o+=C);for(var V=0,U=0;2>U;U++){var d=S[U];if(d+e>s){var p=Math.atan2(l,d),m=r?1:-1;0>p&&(p=C+p),(p>=a&&o>=p||p+C>=a&&o>=p+C)&&(p>Math.PI/2&&p<1.5*Math.PI&&(m=-m),V+=m)}}return V}function k(e,t,i,n,a){var o=0,m=0,V=0,U=0,d=0,p=!0,c=!0;i=i||"fill";for(var y="stroke"===i||"both"===i,k="fill"===i||"both"===i,x=0;x0&&(k&&(o+=u(m,V,U,d,n,a)),0!==o))return!0;U=L[L.length-2],d=L[L.length-1],p=!1,c&&"A"!==_.command&&(c=!1,m=U,V=d)}switch(_.command){case"M":m=L[0],V=L[1];break;case"L":if(y&&r(m,V,L[0],L[1],t,n,a))return!0;k&&(o+=u(m,V,L[0],L[1],n,a)),m=L[0],V=L[1];break;case"C":if(y&&s(m,V,L[0],L[1],L[2],L[3],L[4],L[5],t,n,a))return!0;k&&(o+=g(m,V,L[0],L[1],L[2],L[3],L[4],L[5],n,a)),m=L[4],V=L[5];break;case"Q":if(y&&l(m,V,L[0],L[1],L[2],L[3],t,n,a))return!0;k&&(o+=b(m,V,L[0],L[1],L[2],L[3],n,a)),m=L[2],V=L[3];break;case"A":var W=L[0],X=L[1],v=L[2],w=L[3],K=L[4],I=L[5],J=Math.cos(K)*v+W,C=Math.sin(K)*w+X;c?(c=!1,U=J,d=C):o+=u(m,V,J,C);var S=(n-W)*w/v+W;if(y&&h(W,X,w,K,K+I,1-L[7],t,S,a))return!0;k&&(o+=f(W,X,w,K,K+I,1-L[7],S,a)),m=Math.cos(K+I)*v+W,V=Math.sin(K+I)*w+X;break;case"z":if(y&&r(m,V,U,d,t,n,a))return!0;p=!0}}return k&&(o+=u(m,V,U,d,n,a)),0!==o}function x(e,t){var i=e+":"+t;if(v[i])return v[i];L=L||W.getContext(),L.save(),t&&(L.font=t),e=(e+"").split("\n");for(var n=0,a=0,o=e.length;o>a;a++)n=Math.max(L.measureText(e[a]).width,n);return L.restore(),v[i]=n,++K>J&&(K=0,v={}),n}function _(e,t){var i=e+":"+t;if(w[i])return w[i];L=L||W.getContext(),L.save(),t&&(L.font=t),e=(e+"").split("\n");var n=(L.measureText("国").width+2)*e.length;return L.restore(),w[i]=n,++I>J&&(I=0,w={}),n}var L,W=e("./util"),X=e("./curve"),v={},w={},K=0,I=0,J=5e3,C=2*Math.PI,S=[-1,-1,-1],E=[-1,-1];return{isInside:i,isOutside:o,getTextWidth:x,getTextHeight:_,isInsidePath:k,isInsidePolygon:c,isInsideSector:p,isInsideCircle:d,isInsideLine:r,isInsideRect:U,isInsidePolyline:m,isInsideCubicStroke:s,isInsideQuadraticStroke:l}}),i("zrender/shape/Base",["require","../tool/matrix","../tool/guid","../tool/util","../tool/log","../mixin/Transformable","../mixin/Eventful","../tool/area","../tool/color"],function(e){function t(t,n,a,o,r,s,l){r&&(t.font=r),t.textAlign=s,t.textBaseline=l;var h=i(n,a,o,r,s,l);n=(n+"").split("\n");var m=e("../tool/area").getTextHeight("国",r);switch(l){case"top":o=h.y;break;case"bottom":o=h.y+m;break;default:o=h.y+m/2}for(var V=0,U=n.length;U>V;V++)t.fillText(n[V],a,o),o+=m}function i(t,i,n,a,o,r){var s=e("../tool/area"),l=s.getTextWidth(t,a),h=s.getTextHeight("国",a);switch(t=(t+"").split("\n"),o){case"end":case"right":i-=l;break;case"center":i-=l/2}switch(r){case"top":break;case"bottom":n-=h*t.length;break;default:n-=h*t.length/2}return{x:i,y:n,width:l,height:h*t.length}}var n=window.G_vmlCanvasManager,a=e("../tool/matrix"),o=e("../tool/guid"),r=e("../tool/util"),s=e("../tool/log"),l=e("../mixin/Transformable"),h=e("../mixin/Eventful"),m=function(e){e=e||{},this.id=e.id||o();for(var t in e)this[t]=e[t];this.style=this.style||{},this.highlightStyle=this.highlightStyle||null,this.parent=null,this.__dirty=!0,this.__clipShapes=[],l.call(this),h.call(this)};m.prototype.invisible=!1,m.prototype.ignore=!1,m.prototype.zlevel=0,m.prototype.draggable=!1,m.prototype.clickable=!1,m.prototype.hoverable=!0,m.prototype.z=0,m.prototype.brush=function(e,t){var i=this.beforeBrush(e,t);switch(e.beginPath(),this.buildPath(e,i),i.brushType){case"both":e.fill();case"stroke":i.lineWidth>0&&e.stroke();break;default:e.fill()}this.drawText(e,i,this.style),this.afterBrush(e)},m.prototype.beforeBrush=function(e,t){var i=this.style;return this.brushTypeOnly&&(i.brushType=this.brushTypeOnly),t&&(i=this.getHighlightStyle(i,this.highlightStyle||{},this.brushTypeOnly)),"stroke"==this.brushTypeOnly&&(i.strokeColor=i.strokeColor||i.color),e.save(),this.doClip(e),this.setContext(e,i),this.setTransform(e),i},m.prototype.afterBrush=function(e){e.restore()};var V=[["color","fillStyle"],["strokeColor","strokeStyle"],["opacity","globalAlpha"],["lineCap","lineCap"],["lineJoin","lineJoin"],["miterLimit","miterLimit"],["lineWidth","lineWidth"],["shadowBlur","shadowBlur"],["shadowColor","shadowColor"],["shadowOffsetX","shadowOffsetX"],["shadowOffsetY","shadowOffsetY"]];m.prototype.setContext=function(e,t){for(var i=0,n=V.length;n>i;i++){var a=V[i][0],o=t[a],r=V[i][1];"undefined"!=typeof o&&(e[r]=o)}};var U=a.create();return m.prototype.doClip=function(e){if(this.__clipShapes&&!n)for(var t=0;t=i.x&&e<=i.x+i.width&&t>=i.y&&t<=i.y+i.height},m.prototype.drawText=function(e,i,n){if("undefined"!=typeof i.text&&i.text!==!1){var a=i.textColor||i.color||i.strokeColor;e.fillStyle=a;var o,r,s,l,h=10,m=i.textPosition||this.textPosition||"top";switch(m){case"inside":case"top":case"bottom":case"left":case"right":if(this.getRect){var V=(n||i).__rect||this.getRect(n||i);switch(m){case"inside":s=V.x+V.width/2,l=V.y+V.height/2,o="center",r="middle","stroke"!=i.brushType&&a==i.color&&(e.fillStyle="#fff");break;case"left":s=V.x-h,l=V.y+V.height/2,o="end",r="middle";break;case"right":s=V.x+V.width+h,l=V.y+V.height/2,o="start",r="middle";break;case"top":s=V.x+V.width/2,l=V.y-h,o="center",r="bottom";break;case"bottom":s=V.x+V.width/2,l=V.y+V.height+h,o="center",r="top"}}break;case"start":case"end":var U=i.pointList||[[i.xStart||0,i.yStart||0],[i.xEnd||0,i.yEnd||0]],d=U.length;if(2>d)return;var p,c,u,y;switch(m){case"start":p=U[1][0],c=U[0][0],u=U[1][1],y=U[0][1];break;case"end":p=U[d-2][0],c=U[d-1][0],u=U[d-2][1],y=U[d-1][1]}s=c,l=y;var g=Math.atan((u-y)/(c-p))/Math.PI*180;0>c-p?g+=180:0>u-y&&(g+=360),h=5,g>=30&&150>=g?(o="center",r="bottom",l-=h):g>150&&210>g?(o="right",r="middle",s-=h):g>=210&&330>=g?(o="center",r="top",l+=h):(o="left",r="middle",s+=h);break;case"specific":s=i.textX||0,l=i.textY||0,o="start",r="middle"}null!=s&&null!=l&&t(e,i.text,s,l,i.textFont,i.textAlign||o,i.textBaseline||r)}},m.prototype.modSelf=function(){this.__dirty=!0,this.style&&(this.style.__rect=null),this.highlightStyle&&(this.highlightStyle.__rect=null)},m.prototype.isSilent=function(){return!(this.hoverable||this.draggable||this.clickable||this.onmousemove||this.onmouseover||this.onmouseout||this.onmousedown||this.onmouseup||this.onclick||this.ondragenter||this.ondragover||this.ondragleave||this.ondrop)},r.merge(m.prototype,l.prototype,!0),r.merge(m.prototype,h.prototype,!0),m}),i("zrender/tool/curve",["require","./vector"],function(e){function t(e){return e>-u&&u>e}function i(e){return e>u||-u>e}function n(e,t,i,n,a){var o=1-a;return o*o*(o*e+3*a*t)+a*a*(a*n+3*o*i)}function a(e,t,i,n,a){var o=1-a;return 3*(((t-e)*o+2*(i-t)*a)*o+(n-i)*a*a)}function o(e,i,n,a,o,r){var s=a+3*(i-n)-e,l=3*(n-2*i+e),h=3*(i-e),m=e-o,V=l*l-3*s*h,U=l*h-9*s*m,d=h*h-3*l*m,p=0;if(t(V)&&t(U))if(t(l))r[0]=0;else{var c=-h/l;c>=0&&1>=c&&(r[p++]=c)}else{var u=U*U-4*V*d;if(t(u)){var b=U/V,c=-l/s+b,f=-b/2;c>=0&&1>=c&&(r[p++]=c),f>=0&&1>=f&&(r[p++]=f)}else if(u>0){var k=Math.sqrt(u),x=V*l+1.5*s*(-U+k),_=V*l+1.5*s*(-U-k);x=0>x?-Math.pow(-x,g):Math.pow(x,g),_=0>_?-Math.pow(-_,g):Math.pow(_,g);var c=(-l-(x+_))/(3*s);c>=0&&1>=c&&(r[p++]=c)}else{var L=(2*V*l-3*s*U)/(2*Math.sqrt(V*V*V)),W=Math.acos(L)/3,X=Math.sqrt(V),v=Math.cos(W),c=(-l-2*X*v)/(3*s),f=(-l+X*(v+y*Math.sin(W)))/(3*s),w=(-l+X*(v-y*Math.sin(W)))/(3*s);c>=0&&1>=c&&(r[p++]=c),f>=0&&1>=f&&(r[p++]=f),w>=0&&1>=w&&(r[p++]=w)}}return p}function r(e,n,a,o,r){var s=6*a-12*n+6*e,l=9*n+3*o-3*e-9*a,h=3*n-3*e,m=0;if(t(l)){if(i(s)){var V=-h/s;V>=0&&1>=V&&(r[m++]=V)}}else{var U=s*s-4*l*h;if(t(U))r[0]=-s/(2*l);else if(U>0){var d=Math.sqrt(U),V=(-s+d)/(2*l),p=(-s-d)/(2*l);V>=0&&1>=V&&(r[m++]=V),p>=0&&1>=p&&(r[m++]=p)}}return m}function s(e,t,i,n,a,o){var r=(t-e)*a+e,s=(i-t)*a+t,l=(n-i)*a+i,h=(s-r)*a+r,m=(l-s)*a+s,V=(m-h)*a+h;o[0]=e,o[1]=r,o[2]=h,o[3]=V,o[4]=V,o[5]=m,o[6]=l,o[7]=n}function l(e,t,i,a,o,r,s,l,h,m,V){var U,d=.005,p=1/0;b[0]=h,b[1]=m;for(var y=0;1>y;y+=.05){f[0]=n(e,i,o,s,y),f[1]=n(t,a,r,l,y);var g=c.distSquare(b,f);p>g&&(U=y,p=g)}p=1/0;for(var x=0;32>x&&!(u>d);x++){var _=U-d,L=U+d;f[0]=n(e,i,o,s,_),f[1]=n(t,a,r,l,_);var g=c.distSquare(f,b);if(_>=0&&p>g)U=_,p=g;else{k[0]=n(e,i,o,s,L),k[1]=n(t,a,r,l,L);var W=c.distSquare(k,b);1>=L&&p>W?(U=L,p=W):d*=.5}}return V&&(V[0]=n(e,i,o,s,U),V[1]=n(t,a,r,l,U)),Math.sqrt(p)}function h(e,t,i,n){var a=1-n;return a*(a*e+2*n*t)+n*n*i}function m(e,t,i,n){return 2*((1-n)*(t-e)+n*(i-t))}function V(e,n,a,o,r){var s=e-2*n+a,l=2*(n-e),h=e-o,m=0;if(t(s)){if(i(l)){var V=-h/l;V>=0&&1>=V&&(r[m++]=V)}}else{var U=l*l-4*s*h;if(t(U)){var V=-l/(2*s);V>=0&&1>=V&&(r[m++]=V)}else if(U>0){var d=Math.sqrt(U),V=(-l+d)/(2*s),p=(-l-d)/(2*s);V>=0&&1>=V&&(r[m++]=V),p>=0&&1>=p&&(r[m++]=p)}}return m}function U(e,t,i){var n=e+i-2*t;return 0===n?.5:(e-t)/n}function d(e,t,i,n,a){var o=(t-e)*n+e,r=(i-t)*n+t,s=(r-o)*n+o;a[0]=e,a[1]=o,a[2]=s,a[3]=s,a[4]=r,a[5]=i}function p(e,t,i,n,a,o,r,s,l){var m,V=.005,U=1/0;b[0]=r,b[1]=s;for(var d=0;1>d;d+=.05){f[0]=h(e,i,a,d),f[1]=h(t,n,o,d);var p=c.distSquare(b,f);U>p&&(m=d,U=p)}U=1/0;for(var y=0;32>y&&!(u>V);y++){var g=m-V,x=m+V;f[0]=h(e,i,a,g),f[1]=h(t,n,o,g);var p=c.distSquare(f,b);if(g>=0&&U>p)m=g,U=p;else{k[0]=h(e,i,a,x),k[1]=h(t,n,o,x);var _=c.distSquare(k,b);1>=x&&U>_?(m=x,U=_):V*=.5}}return l&&(l[0]=h(e,i,a,m),l[1]=h(t,n,o,m)),Math.sqrt(U)}var c=e("./vector"),u=1e-4,y=Math.sqrt(3),g=1/3,b=c.create(),f=c.create(),k=c.create();return{cubicAt:n,cubicDerivativeAt:a,cubicRootAt:o,cubicExtrema:r,cubicSubdivide:s,cubicProjectPoint:l,quadraticAt:h,quadraticDerivativeAt:m,quadraticRootAt:V,quadraticExtremum:U,quadraticSubdivide:d,quadraticProjectPoint:p}}),i("zrender/mixin/Transformable",["require","../tool/matrix","../tool/vector"],function(e){"use strict";function t(e){return e>-s&&s>e}function i(e){return e>s||-s>e}var n=e("../tool/matrix"),a=e("../tool/vector"),o=[0,0],r=n.translate,s=5e-5,l=function(){this.position||(this.position=[0,0]),"undefined"==typeof this.rotation&&(this.rotation=[0,0,0]),this.scale||(this.scale=[1,1,0,0]),this.needLocalTransform=!1,this.needTransform=!1};return l.prototype={constructor:l,updateNeedTransform:function(){this.needLocalTransform=i(this.rotation[0])||i(this.position[0])||i(this.position[1])||i(this.scale[0]-1)||i(this.scale[1]-1)},updateTransform:function(){this.updateNeedTransform();var e=this.parent&&this.parent.needTransform;if(this.needTransform=this.needLocalTransform||e,this.needTransform){var t=this.transform||n.create();if(n.identity(t),this.needLocalTransform){var a=this.scale;if(i(a[0])||i(a[1])){o[0]=-a[2]||0,o[1]=-a[3]||0;var s=i(o[0])||i(o[1]);s&&r(t,t,o),n.scale(t,t,a),s&&(o[0]=-o[0],o[1]=-o[1],r(t,t,o))}if(this.rotation instanceof Array){if(0!==this.rotation[0]){o[0]=-this.rotation[1]||0,o[1]=-this.rotation[2]||0;var s=i(o[0])||i(o[1]);s&&r(t,t,o),n.rotate(t,t,this.rotation[0]),s&&(o[0]=-o[0],o[1]=-o[1],r(t,t,o))}}else 0!==this.rotation&&n.rotate(t,t,this.rotation);(i(this.position[0])||i(this.position[1]))&&r(t,t,this.position)}e&&(this.needLocalTransform?n.mul(t,this.parent.transform,t):n.copy(t,this.parent.transform)),this.transform=t,this.invTransform=this.invTransform||n.create(),n.invert(this.invTransform,t)}},setTransform:function(e){if(this.needTransform){var t=this.transform;e.transform(t[0],t[1],t[2],t[3],t[4],t[5])}},lookAt:function(){var e=a.create();return function(i){this.transform||(this.transform=n.create());var o=this.transform;if(a.sub(e,i,this.position),!t(e[0])||!t(e[1])){a.normalize(e,e);var r=this.scale;o[2]=e[0]*r[1],o[3]=e[1]*r[1],o[0]=e[1]*r[0],o[1]=-e[0]*r[0],o[4]=this.position[0],o[5]=this.position[1],this.decomposeTransform()}}}(),decomposeTransform:function(){if(this.transform){var e=this.transform,t=e[0]*e[0]+e[1]*e[1],n=this.position,a=this.scale,o=this.rotation;i(t-1)&&(t=Math.sqrt(t));var r=e[2]*e[2]+e[3]*e[3];i(r-1)&&(r=Math.sqrt(r)),n[0]=e[4],n[1]=e[5],a[0]=t,a[1]=r,a[2]=a[3]=0,o[0]=Math.atan2(-e[1]/r,e[0]/t),o[1]=o[2]=0}},transformCoordToLocal:function(e,t){var i=[e,t];return this.needTransform&&this.invTransform&&a.applyTransform(i,i,this.invTransform),i}},l}),i("zrender/Group",["require","./tool/guid","./tool/util","./mixin/Transformable","./mixin/Eventful"],function(e){var t=e("./tool/guid"),i=e("./tool/util"),n=e("./mixin/Transformable"),a=e("./mixin/Eventful"),o=function(e){e=e||{},this.id=e.id||t();for(var i in e)this[i]=e[i];this.type="group",this.clipShape=null,this._children=[],this._storage=null,this.__dirty=!0,n.call(this),a.call(this)};return o.prototype.ignore=!1,o.prototype.children=function(){return this._children.slice()},o.prototype.childAt=function(e){return this._children[e]},o.prototype.addChild=function(e){e!=this&&e.parent!=this&&(e.parent&&e.parent.removeChild(e),this._children.push(e),e.parent=this,this._storage&&this._storage!==e._storage&&(this._storage.addToMap(e),e instanceof o&&e.addChildrenToStorage(this._storage)))},o.prototype.removeChild=function(e){var t=i.indexOf(this._children,e);t>=0&&this._children.splice(t,1),e.parent=null,this._storage&&(this._storage.delFromMap(e.id),e instanceof o&&e.delChildrenFromStorage(this._storage))},o.prototype.clearChildren=function(){for(var e=0;et)){t=Math.min(t,1);var n="string"==typeof this.easing?i[this.easing]:this.easing,a="function"==typeof n?n(t):t;return this.fire("frame",a),1==t?this.loop?(this.restart(),"restart"):(this.__needsRemove=!0,"destroy"):null}},restart:function(){var e=(new Date).getTime(),t=(e-this._startTime)%this._life;this._startTime=(new Date).getTime()-t+this.gap,this.__needsRemove=!1},fire:function(e,t){for(var i=0,n=this._targetPool.length;n>i;i++)this["on"+e]&&this["on"+e](this._targetPool[i],t)},constructor:t},t}),i("zrender/animation/easing",[],function(){var e={Linear:function(e){return e},QuadraticIn:function(e){return e*e},QuadraticOut:function(e){return e*(2-e)},QuadraticInOut:function(e){return(e*=2)<1?.5*e*e:-.5*(--e*(e-2)-1)},CubicIn:function(e){return e*e*e},CubicOut:function(e){return--e*e*e+1},CubicInOut:function(e){return(e*=2)<1?.5*e*e*e:.5*((e-=2)*e*e+2)},QuarticIn:function(e){return e*e*e*e},QuarticOut:function(e){return 1- --e*e*e*e},QuarticInOut:function(e){return(e*=2)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2)},QuinticIn:function(e){return e*e*e*e*e},QuinticOut:function(e){return--e*e*e*e*e+1},QuinticInOut:function(e){return(e*=2)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2)},SinusoidalIn:function(e){return 1-Math.cos(e*Math.PI/2)},SinusoidalOut:function(e){return Math.sin(e*Math.PI/2)},SinusoidalInOut:function(e){return.5*(1-Math.cos(Math.PI*e))},ExponentialIn:function(e){return 0===e?0:Math.pow(1024,e-1)},ExponentialOut:function(e){return 1===e?1:1-Math.pow(2,-10*e)},ExponentialInOut:function(e){return 0===e?0:1===e?1:(e*=2)<1?.5*Math.pow(1024,e-1):.5*(-Math.pow(2,-10*(e-1))+2)},CircularIn:function(e){return 1-Math.sqrt(1-e*e)},CircularOut:function(e){return Math.sqrt(1- --e*e)},CircularInOut:function(e){return(e*=2)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1)},ElasticIn:function(e){var t,i=.1,n=.4;return 0===e?0:1===e?1:(!i||1>i?(i=1,t=n/4):t=n*Math.asin(1/i)/(2*Math.PI),-(i*Math.pow(2,10*(e-=1))*Math.sin(2*(e-t)*Math.PI/n)))},ElasticOut:function(e){var t,i=.1,n=.4;return 0===e?0:1===e?1:(!i||1>i?(i=1,t=n/4):t=n*Math.asin(1/i)/(2*Math.PI),i*Math.pow(2,-10*e)*Math.sin(2*(e-t)*Math.PI/n)+1)},ElasticInOut:function(e){var t,i=.1,n=.4;return 0===e?0:1===e?1:(!i||1>i?(i=1,t=n/4):t=n*Math.asin(1/i)/(2*Math.PI),(e*=2)<1?-.5*i*Math.pow(2,10*(e-=1))*Math.sin(2*(e-t)*Math.PI/n):i*Math.pow(2,-10*(e-=1))*Math.sin(2*(e-t)*Math.PI/n)*.5+1)},BackIn:function(e){var t=1.70158;return e*e*((t+1)*e-t)},BackOut:function(e){var t=1.70158;return--e*e*((t+1)*e+t)+1},BackInOut:function(e){var t=2.5949095;return(e*=2)<1?.5*e*e*((t+1)*e-t):.5*((e-=2)*e*((t+1)*e+t)+2)},BounceIn:function(t){return 1-e.BounceOut(1-t)},BounceOut:function(e){return 1/2.75>e?7.5625*e*e:2/2.75>e?7.5625*(e-=1.5/2.75)*e+.75:2.5/2.75>e?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375},BounceInOut:function(t){return.5>t?.5*e.BounceIn(2*t):.5*e.BounceOut(2*t-1)+.5}};return e}),i("echarts/chart/base",["require","zrender/shape/Image","../util/shape/Icon","../util/shape/MarkLine","../util/shape/Symbol","zrender/shape/Polyline","zrender/shape/ShapeBundle","../config","../util/ecData","../util/ecAnimation","../util/ecEffect","../util/accMath","../component/base","../layout/EdgeBundling","zrender/tool/util","zrender/tool/area"],function(e){function t(e){return null!=e.x&&null!=e.y}function i(e,t,i,n,a){p.call(this,e,t,i,n,a);var o=this;this.selectedMap={},this.lastShapeList=[],this.shapeHandler={onclick:function(){o.isClick=!0},ondragover:function(e){var t=e.target;t.highlightStyle=t.highlightStyle||{};var i=t.highlightStyle,n=i.brushTyep,a=i.strokeColor,r=i.lineWidth;i.brushType="stroke",i.strokeColor=o.ecTheme.calculableColor||h.calculableColor,i.lineWidth="icon"===t.type?30:10,o.zr.addHoverShape(t),setTimeout(function(){i&&(i.brushType=n,i.strokeColor=a,i.lineWidth=r)},20)},ondrop:function(e){null!=m.get(e.dragged,"data")&&(o.isDrop=!0)},ondragend:function(){o.isDragend=!0}}}var n=e("zrender/shape/Image"),a=e("../util/shape/Icon"),o=e("../util/shape/MarkLine"),r=e("../util/shape/Symbol"),s=e("zrender/shape/Polyline"),l=e("zrender/shape/ShapeBundle"),h=e("../config"),m=e("../util/ecData"),V=e("../util/ecAnimation"),U=e("../util/ecEffect"),d=e("../util/accMath"),p=e("../component/base"),c=e("../layout/EdgeBundling"),u=e("zrender/tool/util"),y=e("zrender/tool/area");return i.prototype={setCalculable:function(e){return e.dragEnableTime=this.ecTheme.DRAG_ENABLE_TIME||h.DRAG_ENABLE_TIME,e.ondragover=this.shapeHandler.ondragover,e.ondragend=this.shapeHandler.ondragend,e.ondrop=this.shapeHandler.ondrop,e},ondrop:function(e,t){if(this.isDrop&&e.target&&!t.dragIn){var i,n=e.target,a=e.dragged,o=m.get(n,"seriesIndex"),r=m.get(n,"dataIndex"),s=this.series,l=this.component.legend;if(-1===r){if(m.get(a,"seriesIndex")==o)return t.dragOut=t.dragIn=t.needRefresh=!0,void(this.isDrop=!1);i={value:m.get(a,"value"),name:m.get(a,"name")},this.type===h.CHART_TYPE_PIE&&i.value<0&&(i.value=0);for(var V=!1,U=s[o].data,p=0,c=U.length;c>p;p++)U[p].name===i.name&&"-"===U[p].value&&(s[o].data[p].value=i.value,V=!0);!V&&s[o].data.push(i),l&&l.add(i.name,a.style.color||a.style.strokeColor)}else i=s[o].data[r]||"-",null!=i.value?(s[o].data[r].value="-"!=i.value?d.accAdd(s[o].data[r].value,m.get(a,"value")):m.get(a,"value"),(this.type===h.CHART_TYPE_FUNNEL||this.type===h.CHART_TYPE_PIE)&&(l&&1===l.getRelatedAmount(i.name)&&this.component.legend.del(i.name),i.name+=this.option.nameConnector+m.get(a,"name"),l&&l.add(i.name,a.style.color||a.style.strokeColor))):s[o].data[r]="-"!=i?d.accAdd(s[o].data[r],m.get(a,"value")):m.get(a,"value");t.dragIn=t.dragIn||!0,this.isDrop=!1;var u=this;setTimeout(function(){u.zr.trigger("mousemove",e.event)},300)}},ondragend:function(e,t){if(this.isDragend&&e.target&&!t.dragOut){var i=e.target,n=m.get(i,"seriesIndex"),a=m.get(i,"dataIndex"),o=this.series;if(null!=o[n].data[a].value){o[n].data[a].value="-";var r=o[n].data[a].name,s=this.component.legend;s&&0===s.getRelatedAmount(r)&&s.del(r)}else o[n].data[a]="-";t.dragOut=!0,t.needRefresh=!0,this.isDragend=!1}},onlegendSelected:function(e,t){var i=e.selected;for(var n in this.selectedMap)this.selectedMap[n]!=i[n]&&(t.needRefresh=!0),this.selectedMap[n]=i[n]},_buildPosition:function(){this._symbol=this.option.symbolList,this._sIndex2ShapeMap={},this._sIndex2ColorMap={},this.selectedMap={},this.xMarkMap={};for(var e,t,i,n,a=this.series,o={top:[],bottom:[],left:[],right:[],other:[]},r=0,s=a.length;s>r;r++)a[r].type===this.type&&(a[r]=this.reformOption(a[r]),this.legendHoverLink=a[r].legendHoverLink||this.legendHoverLink,e=a[r].xAxisIndex,t=a[r].yAxisIndex,i=this.component.xAxis.getAxis(e),n=this.component.yAxis.getAxis(t),i.type===h.COMPONENT_TYPE_AXIS_CATEGORY?o[i.getPosition()].push(r):n.type===h.COMPONENT_TYPE_AXIS_CATEGORY?o[n.getPosition()].push(r):o.other.push(r));for(var l in o)o[l].length>0&&this._buildSinglePosition(l,o[l]);this.addShapeList()},_buildSinglePosition:function(e,t){var i=this._mapData(t),n=i.locationMap,a=i.maxDataLength;if(0!==a&&0!==n.length){switch(e){case"bottom":case"top":this._buildHorizontal(t,a,n,this.xMarkMap);break;case"left":case"right":this._buildVertical(t,a,n,this.xMarkMap);break;case"other":this._buildOther(t,a,n,this.xMarkMap)}for(var o=0,r=t.length;r>o;o++)this.buildMark(t[o])}},_mapData:function(e){for(var t,i,n,a,o=this.series,r=0,s={},l="__kener__stack__",m=this.component.legend,V=[],U=0,d=0,p=e.length;p>d;d++){if(t=o[e[d]],n=t.name,this._sIndex2ShapeMap[e[d]]=this._sIndex2ShapeMap[e[d]]||this.query(t,"symbol")||this._symbol[d%this._symbol.length],m){if(this.selectedMap[n]=m.isSelected(n),this._sIndex2ColorMap[e[d]]=m.getColor(n),a=m.getItemShape(n)){var c=a.style;if(this.type==h.CHART_TYPE_LINE)c.iconType="legendLineIcon",c.symbol=this._sIndex2ShapeMap[e[d]];else if(t.itemStyle.normal.barBorderWidth>0){var u=a.highlightStyle;c.brushType="both",c.x+=1,c.y+=1,c.width-=2,c.height-=2,c.strokeColor=u.strokeColor=t.itemStyle.normal.barBorderColor,u.lineWidth=3}m.setItemShape(n,a)}}else this.selectedMap[n]=!0,this._sIndex2ColorMap[e[d]]=this.zr.getColor(e[d]);this.selectedMap[n]&&(i=t.stack||l+e[d],null==s[i]?(s[i]=r,V[r]=[e[d]],r++):V[s[i]].push(e[d])),U=Math.max(U,t.data.length)}return{locationMap:V,maxDataLength:U}},_calculMarkMapXY:function(e,t,i){for(var n=this.series,a=0,o=t.length;o>a;a++)for(var r=0,s=t[a].length;s>r;r++){var l=t[a][r],h="xy"==i?0:"",m=this.component.grid,V=e[l];if("-1"!=i.indexOf("x")){V["counter"+h]>0&&(V["average"+h]=V["sum"+h]/V["counter"+h]);var U=this.component.xAxis.getAxis(n[l].xAxisIndex||0).getCoord(V["average"+h]);V["averageLine"+h]=[[U,m.getYend()],[U,m.getY()]],V["minLine"+h]=[[V["minX"+h],m.getYend()],[V["minX"+h],m.getY()]],V["maxLine"+h]=[[V["maxX"+h],m.getYend()],[V["maxX"+h],m.getY()]],V.isHorizontal=!1}if(h="xy"==i?1:"","-1"!=i.indexOf("y")){V["counter"+h]>0&&(V["average"+h]=V["sum"+h]/V["counter"+h]);var d=this.component.yAxis.getAxis(n[l].yAxisIndex||0).getCoord(V["average"+h]);V["averageLine"+h]=[[m.getX(),d],[m.getXend(),d]],V["minLine"+h]=[[m.getX(),V["minY"+h]],[m.getXend(),V["minY"+h]]],V["maxLine"+h]=[[m.getX(),V["maxY"+h]],[m.getXend(),V["maxY"+h]]],V.isHorizontal=!0}}},addLabel:function(e,t,i,n,a){var o=[i,t],r=this.deepMerge(o,"itemStyle.normal.label"),s=this.deepMerge(o,"itemStyle.emphasis.label"),l=r.textStyle||{},h=s.textStyle||{}; + +if(r.show){var m=e.style;m.text=this._getLabelText(t,i,n,"normal"),m.textPosition=null==r.position?"horizontal"===a?"right":"top":r.position,m.textColor=l.color,m.textFont=this.getFont(l),m.textAlign=l.align,m.textBaseline=l.baseline}if(s.show){var V=e.highlightStyle;V.text=this._getLabelText(t,i,n,"emphasis"),V.textPosition=r.show?e.style.textPosition:null==s.position?"horizontal"===a?"right":"top":s.position,V.textColor=h.color,V.textFont=this.getFont(h),V.textAlign=h.align,V.textBaseline=h.baseline}return e},_getLabelText:function(e,t,i,n){var a=this.deepQuery([t,e],"itemStyle."+n+".label.formatter");a||"emphasis"!==n||(a=this.deepQuery([t,e],"itemStyle.normal.label.formatter"));var o=this.getDataFromOption(t,"-");return a?"function"==typeof a?a.call(this.myChart,{seriesName:e.name,series:e,name:i,value:o,data:t,status:n}):"string"==typeof a?a=a.replace("{a}","{a0}").replace("{b}","{b0}").replace("{c}","{c0}").replace("{a0}",e.name).replace("{b0}",i).replace("{c0}",this.numAddCommas(o)):void 0:o instanceof Array?null!=o[2]?this.numAddCommas(o[2]):o[0]+" , "+o[1]:this.numAddCommas(o)},buildMark:function(e){var t=this.series[e];this.selectedMap[t.name]&&(t.markLine&&this._buildMarkLine(e),t.markPoint&&this._buildMarkPoint(e))},_buildMarkPoint:function(e){for(var t,i,n=(this.markAttachStyle||{})[e],a=this.series[e],o=u.clone(a.markPoint),r=0,s=o.data.length;s>r;r++)t=o.data[r],i=this.getMarkCoord(e,t),t.x=null!=t.x?t.x:i[0],t.y=null!=t.y?t.y:i[1],!t.type||"max"!==t.type&&"min"!==t.type||(t.value=i[3],t.name=t.name||t.type,t.symbolSize=t.symbolSize||y.getTextWidth(i[3],this.getFont())/2+5);for(var l=this._markPoint(e,o),r=0,s=l.length;s>r;r++){var m=l[r];m.zlevel=a.zlevel,m.z=a.z+1;for(var V in n)m[V]=u.clone(n[V]);this.shapeList.push(m)}if(this.type===h.CHART_TYPE_FORCE||this.type===h.CHART_TYPE_CHORD)for(var r=0,s=l.length;s>r;r++)this.zr.addShape(l[r])},_buildMarkLine:function(e){for(var t,i=(this.markAttachStyle||{})[e],n=this.series[e],a=u.clone(n.markLine),o=0,r=a.data.length;r>o;o++){var s=a.data[o];!s.type||"max"!==s.type&&"min"!==s.type&&"average"!==s.type?t=[this.getMarkCoord(e,s[0]),this.getMarkCoord(e,s[1])]:(t=this.getMarkCoord(e,s),a.data[o]=[u.clone(s),{}],a.data[o][0].name=s.name||s.type,a.data[o][0].value="average"!==s.type?t[3]:+t[3].toFixed(null!=a.precision?a.precision:this.deepQuery([this.ecTheme,h],"markLine.precision")),t=t[2],s=[{},{}]),null!=t&&null!=t[0]&&null!=t[1]&&(a.data[o][0].x=null!=s[0].x?s[0].x:t[0][0],a.data[o][0].y=null!=s[0].y?s[0].y:t[0][1],a.data[o][1].x=null!=s[1].x?s[1].x:t[1][0],a.data[o][1].y=null!=s[1].y?s[1].y:t[1][1])}var m=this._markLine(e,a),V=a.large;if(V){var U=new l({style:{shapeList:m}}),d=m[0];if(d){u.merge(U.style,d.style),u.merge(U.highlightStyle={},d.highlightStyle),U.style.brushType="stroke",U.zlevel=n.zlevel,U.z=n.z+1,U.hoverable=!1;for(var p in i)U[p]=u.clone(i[p])}this.shapeList.push(U),this.zr.addShape(U),U._mark="largeLine";var c=a.effect;c.show&&(U.effect=c)}else{for(var o=0,r=m.length;r>o;o++){var y=m[o];y.zlevel=n.zlevel,y.z=n.z+1;for(var p in i)y[p]=u.clone(i[p]);this.shapeList.push(y)}if(this.type===h.CHART_TYPE_FORCE||this.type===h.CHART_TYPE_CHORD)for(var o=0,r=m.length;r>o;o++)this.zr.addShape(m[o])}},_markPoint:function(e,t){var i=this.series[e],n=this.component;u.merge(u.merge(t,u.clone(this.ecTheme.markPoint||{})),u.clone(h.markPoint)),t.name=i.name;var a,o,r,s,l,V,U,d=[],p=t.data,c=n.dataRange,y=n.legend,g=this.zr.getWidth(),b=this.zr.getHeight();if(t.large)a=this.getLargeMarkPointShape(e,t),a._mark="largePoint",a&&d.push(a);else for(var f=0,k=p.length;k>f;f++)null!=p[f].x&&null!=p[f].y&&(r=null!=p[f].value?p[f].value:"",y&&(o=y.getColor(i.name)),c&&(o=isNaN(r)?o:c.getColor(r),s=[p[f],t],l=this.deepQuery(s,"itemStyle.normal.color")||o,V=this.deepQuery(s,"itemStyle.emphasis.color")||l,null==l&&null==V)||(o=null==o?this.zr.getColor(e):o,p[f].tooltip=p[f].tooltip||t.tooltip||{trigger:"item"},p[f].name=null!=p[f].name?p[f].name:"",p[f].value=r,a=this.getSymbolShape(t,e,p[f],f,p[f].name,this.parsePercent(p[f].x,g),this.parsePercent(p[f].y,b),"pin",o,"rgba(0,0,0,0)","horizontal"),a._mark="point",U=this.deepMerge([p[f],t],"effect"),U.show&&(a.effect=U),i.type===h.CHART_TYPE_MAP&&(a._geo=this.getMarkGeo(p[f])),m.pack(a,i,e,p[f],f,p[f].name,r),d.push(a)));return d},_markLine:function(){function e(e,t){e[t]=e[t]instanceof Array?e[t].length>1?e[t]:[e[t][0],e[t][0]]:[e[t],e[t]]}return function(i,n){var a=this.series[i],o=this.component,r=o.dataRange,s=o.legend;u.merge(u.merge(n,u.clone(this.ecTheme.markLine||{})),u.clone(h.markLine));var l=s?s.getColor(a.name):this.zr.getColor(i);e(n,"symbol"),e(n,"symbolSize"),e(n,"symbolRotate");for(var V=n.data,U=[],d=this.zr.getWidth(),p=this.zr.getHeight(),y=0;yy;y++){var K=U[y],I=K.rawEdge||K,g=I.rawData,x=null!=g.value?g.value:"",J=this.getMarkLineShape(n,i,g,y,K.points,W,I.color);J._mark="line";var C=this.deepMerge([g[0],g[1],n],"effect");C.show&&(J.effect=C,J.effect.large=n.large),a.type===h.CHART_TYPE_MAP&&(J._geo=[this.getMarkGeo(g[0]),this.getMarkGeo(g[1])]),m.pack(J,a,i,g[0],y,g[0].name+(""!==g[1].name?" > "+g[1].name:""),x),v.push(J)}return v}}(),getMarkCoord:function(){return[0,0]},getSymbolShape:function(e,t,i,o,r,s,l,h,V,U,d){var p=[i,e],c=this.getDataFromOption(i,"-");h=this.deepQuery(p,"symbol")||h;var u=this.deepQuery(p,"symbolSize");u="function"==typeof u?u(c):u,"number"==typeof u&&(u=[u,u]);var y=this.deepQuery(p,"symbolRotate"),g=this.deepMerge(p,"itemStyle.normal"),b=this.deepMerge(p,"itemStyle.emphasis"),f=null!=g.borderWidth?g.borderWidth:g.lineStyle&&g.lineStyle.width;null==f&&(f=h.match("empty")?2:0);var k=null!=b.borderWidth?b.borderWidth:b.lineStyle&&b.lineStyle.width;null==k&&(k=f+2);var x=this.getItemStyleColor(g.color,t,o,i),_=this.getItemStyleColor(b.color,t,o,i),L=u[0],W=u[1],X=new a({style:{iconType:h.replace("empty","").toLowerCase(),x:s-L,y:l-W,width:2*L,height:2*W,brushType:"both",color:h.match("empty")?U:x||V,strokeColor:g.borderColor||x||V,lineWidth:f},highlightStyle:{color:h.match("empty")?U:_||x||V,strokeColor:b.borderColor||g.borderColor||_||x||V,lineWidth:k},clickable:this.deepQuery(p,"clickable")});return h.match("image")&&(X.style.image=h.replace(new RegExp("^image:\\/\\/"),""),X=new n({style:X.style,highlightStyle:X.highlightStyle,clickable:this.deepQuery(p,"clickable")})),null!=y&&(X.rotation=[y*Math.PI/180,s,l]),h.match("star")&&(X.style.iconType="star",X.style.n=h.replace("empty","").replace("star","")-0||5),"none"===h&&(X.invisible=!0,X.hoverable=!1),X=this.addLabel(X,e,i,r,d),h.match("empty")&&(null==X.style.textColor&&(X.style.textColor=X.style.strokeColor),null==X.highlightStyle.textColor&&(X.highlightStyle.textColor=X.highlightStyle.strokeColor)),m.pack(X,e,t,i,o,r),X._x=s,X._y=l,X._dataIndex=o,X._seriesIndex=t,X},getMarkLineShape:function(e,t,i,n,a,r,l){var h=null!=i[0].value?i[0].value:"-",m=null!=i[1].value?i[1].value:"-",V=[i[0].symbol||e.symbol[0],i[1].symbol||e.symbol[1]],U=[i[0].symbolSize||e.symbolSize[0],i[1].symbolSize||e.symbolSize[1]];U[0]="function"==typeof U[0]?U[0](h):U[0],U[1]="function"==typeof U[1]?U[1](m):U[1];var d=[this.query(i[0],"symbolRotate")||e.symbolRotate[0],this.query(i[1],"symbolRotate")||e.symbolRotate[1]],p=[i[0],i[1],e],c=this.deepMerge(p,"itemStyle.normal");c.color=this.getItemStyleColor(c.color,t,n,i);var u=this.deepMerge(p,"itemStyle.emphasis");u.color=this.getItemStyleColor(u.color,t,n,i);var y=c.lineStyle,g=u.lineStyle,b=y.width;null==b&&(b=c.borderWidth);var f=g.width;null==f&&(f=null!=u.borderWidth?u.borderWidth:b+2);var k=this.deepQuery(p,"smoothness");this.deepQuery(p,"smooth")||(k=0);var x=r?s:o,_=new x({style:{symbol:V,symbolSize:U,symbolRotate:d,brushType:"both",lineType:y.type,shadowColor:y.shadowColor||y.color||c.borderColor||c.color||l,shadowBlur:y.shadowBlur,shadowOffsetX:y.shadowOffsetX,shadowOffsetY:y.shadowOffsetY,color:c.color||l,strokeColor:y.color||c.borderColor||c.color||l,lineWidth:b,symbolBorderColor:c.borderColor||c.color||l,symbolBorder:c.borderWidth},highlightStyle:{shadowColor:g.shadowColor,shadowBlur:g.shadowBlur,shadowOffsetX:g.shadowOffsetX,shadowOffsetY:g.shadowOffsetY,color:u.color||c.color||l,strokeColor:g.color||y.color||u.borderColor||c.borderColor||u.color||c.color||l,lineWidth:f,symbolBorderColor:u.borderColor||c.borderColor||u.color||c.color||l,symbolBorder:null==u.borderWidth?c.borderWidth+2:u.borderWidth},clickable:this.deepQuery(p,"clickable")}),L=_.style;return r?(L.pointList=a,L.smooth=k):(L.xStart=a[0][0],L.yStart=a[0][1],L.xEnd=a[1][0],L.yEnd=a[1][1],L.curveness=k,_.updatePoints(_.style)),_=this.addLabel(_,e,i[0],i[0].name+" : "+i[1].name)},getLargeMarkPointShape:function(e,t){var i,n,a,o,s,l,h=this.series[e],m=this.component,V=t.data,U=m.dataRange,d=m.legend,p=[V[0],t];if(d&&(n=d.getColor(h.name)),!U||(a=null!=V[0].value?V[0].value:"",n=isNaN(a)?n:U.getColor(a),o=this.deepQuery(p,"itemStyle.normal.color")||n,s=this.deepQuery(p,"itemStyle.emphasis.color")||o,null!=o||null!=s)){n=this.deepMerge(p,"itemStyle.normal").color||n;var c=this.deepQuery(p,"symbol")||"circle";c=c.replace("empty","").replace(/\d/g,""),l=this.deepMerge([V[0],t],"effect");var u=window.devicePixelRatio||1;return i=new r({style:{pointList:V,color:n,strokeColor:n,shadowColor:l.shadowColor||n,shadowBlur:(null!=l.shadowBlur?l.shadowBlur:8)*u,size:this.deepQuery(p,"symbolSize"),iconType:c,brushType:"fill",lineWidth:1},draggable:!1,hoverable:!1}),l.show&&(i.effect=l),i}},backupShapeList:function(){this.shapeList&&this.shapeList.length>0?(this.lastShapeList=this.shapeList,this.shapeList=[]):this.lastShapeList=[]},addShapeList:function(){var e,t,i=this.option.animationThreshold/(this.canvasSupported?2:4),n=this.lastShapeList,a=this.shapeList,o=n.length>0,r=o?this.query(this.option,"animationDurationUpdate"):this.query(this.option,"animationDuration"),s=this.query(this.option,"animationEasing"),l={},m={};if(this.option.animation&&!this.option.renderAsImage&&a.lengthV;V++)t=this._getAnimationKey(n[V]),t.match("undefined")?this.zr.delShape(n[V].id):(t+=n[V].type,l[t]?this.zr.delShape(n[V].id):l[t]=n[V]);for(var V=0,U=a.length;U>V;V++)t=this._getAnimationKey(a[V]),t.match("undefined")?this.zr.addShape(a[V]):(t+=a[V].type,m[t]=a[V]);for(t in l)m[t]||this.zr.delShape(l[t].id);for(t in m)l[t]?(this.zr.delShape(l[t].id),this._animateMod(l[t],m[t],r,s,0,o)):(e=this.type!=h.CHART_TYPE_LINE&&this.type!=h.CHART_TYPE_RADAR||0===t.indexOf("icon")?0:r/2,this._animateMod(!1,m[t],r,s,e,o));this.zr.refresh(),this.animationEffect()}else{this.motionlessOnce=!1,this.zr.delShape(n);for(var V=0,U=a.length;U>V;V++)this.zr.addShape(a[V])}},_getAnimationKey:function(e){return this.type!=h.CHART_TYPE_MAP&&this.type!=h.CHART_TYPE_TREEMAP&&this.type!=h.CHART_TYPE_VENN&&this.type!=h.CHART_TYPE_TREE?m.get(e,"seriesIndex")+"_"+m.get(e,"dataIndex")+(e._mark?e._mark:"")+(this.type===h.CHART_TYPE_RADAR?m.get(e,"special"):""):m.get(e,"seriesIndex")+"_"+m.get(e,"dataIndex")+(e._mark?e._mark:"undefined")},_animateMod:function(e,t,i,n,a,o){switch(t.type){case"polyline":case"half-smooth-polygon":V.pointList(this.zr,e,t,i,n);break;case"rectangle":V.rectangle(this.zr,e,t,i,n);break;case"image":case"icon":V.icon(this.zr,e,t,i,n,a);break;case"candle":o?this.zr.addShape(t):V.candle(this.zr,e,t,i,n);break;case"ring":case"sector":case"circle":o?"sector"===t.type?V.sector(this.zr,e,t,i,n):this.zr.addShape(t):V.ring(this.zr,e,t,i+(m.get(t,"dataIndex")||0)%20*100,n);break;case"text":V.text(this.zr,e,t,i,n);break;case"polygon":o?V.pointList(this.zr,e,t,i,n):V.polygon(this.zr,e,t,i,n);break;case"ribbon":V.ribbon(this.zr,e,t,i,n);break;case"gauge-pointer":V.gaugePointer(this.zr,e,t,i,n);break;case"mark-line":V.markline(this.zr,e,t,i,n);break;case"bezier-curve":case"line":V.line(this.zr,e,t,i,n);break;default:this.zr.addShape(t)}},animationMark:function(e,t,i){for(var i=i||this.shapeList,n=0,a=i.length;a>n;n++)i[n]._mark&&this._animateMod(!1,i[n],e,t,0,!0);this.animationEffect(i)},animationEffect:function(e){if(!e&&this.clearEffectShape(),e=e||this.shapeList,null!=e){var t=h.EFFECT_ZLEVEL;this.canvasSupported&&this.zr.modLayer(t,{motionBlur:!0,lastFrameAlpha:this.option.effectBlendAlpha||h.effectBlendAlpha});for(var i,n=0,a=e.length;a>n;n++)i=e[n],i._mark&&i.effect&&i.effect.show&&U[i._mark]&&(U[i._mark](this.zr,this.effectList,i,t),this.effectList[this.effectList.length-1]._mark=i._mark)}},clearEffectShape:function(e){var t=this.effectList;if(this.zr&&t&&t.length>0){e&&this.zr.modLayer(h.EFFECT_ZLEVEL,{motionBlur:!1}),this.zr.delShape(t);for(var i=0;il;l++)this.zr.addShape(this.shapeList[l]);this.zr.refreshNextFrame()}n[i].data=r}},delMark:function(e,t,i){i=i.replace("mark","").replace("large","").toLowerCase();var n=this.series[e];if(this.selectedMap[n.name]){for(var a=!1,o=[this.shapeList,this.effectList],r=2;r--;)for(var s=0,l=o[r].length;l>s;s++)if(o[r][s]._mark==i&&m.get(o[r][s],"seriesIndex")==e&&m.get(o[r][s],"name")==t){this.zr.delShape(o[r][s].id),o[r].splice(s,1),a=!0;break}a&&this.zr.refreshNextFrame()}}},u.inherits(i,p),i}),i("zrender/shape/Circle",["require","./Base","../tool/util"],function(e){"use strict";var t=e("./Base"),i=function(e){t.call(this,e)};return i.prototype={type:"circle",buildPath:function(e,t){e.moveTo(t.x+t.r,t.y),e.arc(t.x,t.y,t.r,0,2*Math.PI,!0)},getRect:function(e){if(e.__rect)return e.__rect;var t;return t="stroke"==e.brushType||"fill"==e.brushType?e.lineWidth||1:0,e.__rect={x:Math.round(e.x-e.r-t/2),y:Math.round(e.y-e.r-t/2),width:2*e.r+t,height:2*e.r+t},e.__rect}},e("../tool/util").inherits(i,t),i}),i("echarts/util/accMath",[],function(){function e(e,t){var i=e.toString(),n=t.toString(),a=0;try{a=n.split(".")[1].length}catch(o){}try{a-=i.split(".")[1].length}catch(o){}return(i.replace(".","")-0)/(n.replace(".","")-0)*Math.pow(10,a)}function t(e,t){var i=e.toString(),n=t.toString(),a=0;try{a+=i.split(".")[1].length}catch(o){}try{a+=n.split(".")[1].length}catch(o){}return(i.replace(".","")-0)*(n.replace(".","")-0)/Math.pow(10,a)}function i(e,t){var i=0,n=0;try{i=e.toString().split(".")[1].length}catch(a){}try{n=t.toString().split(".")[1].length}catch(a){}var o=Math.pow(10,Math.max(i,n));return(Math.round(e*o)+Math.round(t*o))/o}function n(e,t){return i(e,-t)}return{accDiv:e,accMul:t,accAdd:i,accSub:n}}),i("echarts/util/shape/Icon",["require","zrender/tool/util","zrender/shape/Star","zrender/shape/Heart","zrender/shape/Droplet","zrender/shape/Image","zrender/shape/Base"],function(e){function t(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i,n+t.height),e.lineTo(i+5*a,n+14*o),e.lineTo(i+t.width,n+3*o),e.lineTo(i+13*a,n),e.lineTo(i+2*a,n+11*o),e.lineTo(i,n+t.height),e.moveTo(i+6*a,n+10*o),e.lineTo(i+14*a,n+2*o),e.moveTo(i+10*a,n+13*o),e.lineTo(i+t.width,n+13*o),e.moveTo(i+13*a,n+10*o),e.lineTo(i+13*a,n+t.height)}function i(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i,n+t.height),e.lineTo(i+5*a,n+14*o),e.lineTo(i+t.width,n+3*o),e.lineTo(i+13*a,n),e.lineTo(i+2*a,n+11*o),e.lineTo(i,n+t.height),e.moveTo(i+6*a,n+10*o),e.lineTo(i+14*a,n+2*o),e.moveTo(i+10*a,n+13*o),e.lineTo(i+t.width,n+13*o)}function n(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i+4*a,n+15*o),e.lineTo(i+9*a,n+13*o),e.lineTo(i+14*a,n+8*o),e.lineTo(i+11*a,n+5*o),e.lineTo(i+6*a,n+10*o),e.lineTo(i+4*a,n+15*o),e.moveTo(i+5*a,n),e.lineTo(i+11*a,n),e.moveTo(i+5*a,n+o),e.lineTo(i+11*a,n+o),e.moveTo(i,n+2*o),e.lineTo(i+t.width,n+2*o),e.moveTo(i,n+5*o),e.lineTo(i+3*a,n+t.height),e.lineTo(i+13*a,n+t.height),e.lineTo(i+t.width,n+5*o)}function a(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i,n+3*o),e.lineTo(i+6*a,n+3*o),e.moveTo(i+3*a,n),e.lineTo(i+3*a,n+6*o),e.moveTo(i+3*a,n+8*o),e.lineTo(i+3*a,n+t.height),e.lineTo(i+t.width,n+t.height),e.lineTo(i+t.width,n+3*o),e.lineTo(i+8*a,n+3*o)}function o(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i+6*a,n),e.lineTo(i+2*a,n+3*o),e.lineTo(i+6*a,n+6*o),e.moveTo(i+2*a,n+3*o),e.lineTo(i+14*a,n+3*o),e.lineTo(i+14*a,n+11*o),e.moveTo(i+2*a,n+5*o),e.lineTo(i+2*a,n+13*o),e.lineTo(i+14*a,n+13*o),e.moveTo(i+10*a,n+10*o),e.lineTo(i+14*a,n+13*o),e.lineTo(i+10*a,n+t.height)}function r(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16,r=t.width/2;e.lineWidth=1.5,e.arc(i+r,n+r,r-a,0,2*Math.PI/3),e.moveTo(i+3*a,n+t.height),e.lineTo(i+0*a,n+12*o),e.lineTo(i+5*a,n+11*o),e.moveTo(i,n+8*o),e.arc(i+r,n+r,r-a,Math.PI,5*Math.PI/3),e.moveTo(i+13*a,n),e.lineTo(i+t.width,n+4*o),e.lineTo(i+11*a,n+5*o)}function s(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i,n),e.lineTo(i,n+t.height),e.lineTo(i+t.width,n+t.height),e.moveTo(i+2*a,n+14*o),e.lineTo(i+7*a,n+6*o),e.lineTo(i+11*a,n+11*o),e.lineTo(i+15*a,n+2*o)}function l(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i,n),e.lineTo(i,n+t.height),e.lineTo(i+t.width,n+t.height),e.moveTo(i+3*a,n+14*o),e.lineTo(i+3*a,n+6*o),e.lineTo(i+4*a,n+6*o),e.lineTo(i+4*a,n+14*o),e.moveTo(i+7*a,n+14*o),e.lineTo(i+7*a,n+2*o),e.lineTo(i+8*a,n+2*o),e.lineTo(i+8*a,n+14*o),e.moveTo(i+11*a,n+14*o),e.lineTo(i+11*a,n+9*o),e.lineTo(i+12*a,n+9*o),e.lineTo(i+12*a,n+14*o)}function h(e,t){var i=t.x,n=t.y,a=t.width-2,o=t.height-2,r=Math.min(a,o)/2;n+=2,e.moveTo(i+r+3,n+r-3),e.arc(i+r+3,n+r-3,r-1,0,-Math.PI/2,!0),e.lineTo(i+r+3,n+r-3),e.moveTo(i+r,n),e.lineTo(i+r,n+r),e.arc(i+r,n+r,r,-Math.PI/2,2*Math.PI,!0),e.lineTo(i+r,n+r),e.lineWidth=1.5}function m(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;n-=o,e.moveTo(i+1*a,n+2*o),e.lineTo(i+15*a,n+2*o),e.lineTo(i+14*a,n+3*o),e.lineTo(i+2*a,n+3*o),e.moveTo(i+3*a,n+6*o),e.lineTo(i+13*a,n+6*o),e.lineTo(i+12*a,n+7*o),e.lineTo(i+4*a,n+7*o),e.moveTo(i+5*a,n+10*o),e.lineTo(i+11*a,n+10*o),e.lineTo(i+10*a,n+11*o),e.lineTo(i+6*a,n+11*o),e.moveTo(i+7*a,n+14*o),e.lineTo(i+9*a,n+14*o),e.lineTo(i+8*a,n+15*o),e.lineTo(i+7*a,n+15*o)}function V(e,t){var i=t.x,n=t.y,a=t.width,o=t.height,r=a/16,s=o/16,l=2*Math.min(r,s);e.moveTo(i+r+l,n+s+l),e.arc(i+r,n+s,l,Math.PI/4,3*Math.PI),e.lineTo(i+7*r-l,n+6*s-l),e.arc(i+7*r,n+6*s,l,Math.PI/4*5,4*Math.PI),e.arc(i+7*r,n+6*s,l/2,Math.PI/4*5,4*Math.PI),e.moveTo(i+7*r-l/2,n+6*s+l),e.lineTo(i+r+l,n+14*s-l),e.arc(i+r,n+14*s,l,-Math.PI/4,2*Math.PI),e.moveTo(i+7*r+l/2,n+6*s),e.lineTo(i+14*r-l,n+10*s-l/2),e.moveTo(i+16*r,n+10*s),e.arc(i+14*r,n+10*s,l,0,3*Math.PI),e.lineWidth=1.5}function U(e,t){var i=t.x,n=t.y,a=t.width,o=t.height,r=Math.min(a,o)/2;e.moveTo(i+a,n+o/2),e.arc(i+r,n+r,r,0,2*Math.PI),e.arc(i+r,n,r,Math.PI/4,Math.PI/5*4),e.arc(i,n+r,r,-Math.PI/3,Math.PI/3),e.arc(i+a,n+o,r,Math.PI,Math.PI/2*3),e.lineWidth=1.5}function d(e,t){for(var i=t.x,n=t.y,a=t.width,o=t.height,r=Math.round(o/3),s=Math.round((r-2)/2),l=3;l--;)e.rect(i,n+r*l+s,a,2)}function p(e,t){for(var i=t.x,n=t.y,a=t.width,o=t.height,r=Math.round(a/3),s=Math.round((r-2)/2),l=3;l--;)e.rect(i+r*l+s,n,2,o)}function c(e,t){var i=t.x,n=t.y,a=t.width/16;e.moveTo(i+a,n),e.lineTo(i+a,n+t.height),e.lineTo(i+15*a,n+t.height),e.lineTo(i+15*a,n),e.lineTo(i+a,n),e.moveTo(i+3*a,n+3*a),e.lineTo(i+13*a,n+3*a),e.moveTo(i+3*a,n+6*a),e.lineTo(i+13*a,n+6*a),e.moveTo(i+3*a,n+9*a),e.lineTo(i+13*a,n+9*a),e.moveTo(i+3*a,n+12*a),e.lineTo(i+9*a,n+12*a)}function u(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i,n),e.lineTo(i,n+t.height),e.lineTo(i+t.width,n+t.height),e.lineTo(i+t.width,n),e.lineTo(i,n),e.moveTo(i+4*a,n),e.lineTo(i+4*a,n+8*o),e.lineTo(i+12*a,n+8*o),e.lineTo(i+12*a,n),e.moveTo(i+6*a,n+11*o),e.lineTo(i+6*a,n+13*o),e.lineTo(i+10*a,n+13*o),e.lineTo(i+10*a,n+11*o),e.lineTo(i+6*a,n+11*o)}function y(e,t){var i=t.x,n=t.y,a=t.width,o=t.height;e.moveTo(i,n+o/2),e.lineTo(i+a,n+o/2),e.moveTo(i+a/2,n),e.lineTo(i+a/2,n+o)}function g(e,t){var i=t.width/2,n=t.height/2,a=Math.min(i,n);e.moveTo(t.x+i+a,t.y+n),e.arc(t.x+i,t.y+n,a,0,2*Math.PI),e.closePath()}function b(e,t){e.rect(t.x,t.y,t.width,t.height),e.closePath()}function f(e,t){var i=t.width/2,n=t.height/2,a=t.x+i,o=t.y+n,r=Math.min(i,n);e.moveTo(a,o-r),e.lineTo(a+r,o+r),e.lineTo(a-r,o+r),e.lineTo(a,o-r),e.closePath()}function k(e,t){var i=t.width/2,n=t.height/2,a=t.x+i,o=t.y+n,r=Math.min(i,n);e.moveTo(a,o-r),e.lineTo(a+r,o),e.lineTo(a,o+r),e.lineTo(a-r,o),e.lineTo(a,o-r),e.closePath()}function x(e,t){var i=t.x,n=t.y,a=t.width/16;e.moveTo(i+8*a,n),e.lineTo(i+a,n+t.height),e.lineTo(i+8*a,n+t.height/4*3),e.lineTo(i+15*a,n+t.height),e.lineTo(i+8*a,n),e.closePath()}function _(t,i){var n=e("zrender/shape/Star"),a=i.width/2,o=i.height/2;n.prototype.buildPath(t,{x:i.x+a,y:i.y+o,r:Math.min(a,o),n:i.n||5})}function L(t,i){var n=e("zrender/shape/Heart");n.prototype.buildPath(t,{x:i.x+i.width/2,y:i.y+.2*i.height,a:i.width/2,b:.8*i.height})}function W(t,i){var n=e("zrender/shape/Droplet");n.prototype.buildPath(t,{x:i.x+.5*i.width,y:i.y+.5*i.height,a:.5*i.width,b:.8*i.height})}function X(e,t){var i=t.x,n=t.y-t.height/2*1.5,a=t.width/2,o=t.height/2,r=Math.min(a,o);e.arc(i+a,n+o,r,Math.PI/5*4,Math.PI/5),e.lineTo(i+a,n+o+1.5*r),e.closePath()}function v(t,i,n){var a=e("zrender/shape/Image");this._imageShape=this._imageShape||new a({style:{}});for(var o in i)this._imageShape.style[o]=i[o];this._imageShape.brush(t,!1,n)}function w(e){I.call(this,e)}var K=e("zrender/tool/util"),I=e("zrender/shape/Base");return w.prototype={type:"icon",iconLibrary:{mark:t,markUndo:i,markClear:n,dataZoom:a,dataZoomReset:o,restore:r,lineChart:s,barChart:l,pieChart:h,funnelChart:m,forceChart:V,chordChart:U,stackChart:d,tiledChart:p,dataView:c,saveAsImage:u,cross:y,circle:g,rectangle:b,triangle:f,diamond:k,arrow:x,star:_,heart:L,droplet:W,pin:X,image:v},brush:function(t,i,n){var a=i?this.highlightStyle:this.style;a=a||{};var o=a.iconType||this.style.iconType;if("image"===o){var r=e("zrender/shape/Image");r.prototype.brush.call(this,t,i,n)}else{var a=this.beforeBrush(t,i);switch(t.beginPath(),this.buildPath(t,a,n),a.brushType){case"both":t.fill();case"stroke":a.lineWidth>0&&t.stroke();break;default:t.fill()}this.drawText(t,a,this.style),this.afterBrush(t)}},buildPath:function(e,t,i){this.iconLibrary[t.iconType]?this.iconLibrary[t.iconType].call(this,e,t,i):(e.moveTo(t.x,t.y),e.lineTo(t.x+t.width,t.y),e.lineTo(t.x+t.width,t.y+t.height),e.lineTo(t.x,t.y+t.height),e.lineTo(t.x,t.y),e.closePath())},getRect:function(e){return e.__rect?e.__rect:(e.__rect={x:Math.round(e.x),y:Math.round(e.y-("pin"==e.iconType?e.height/2*1.5:0)),width:e.width,height:e.height*("pin"===e.iconType?1.25:1)},e.__rect)},isCover:function(e,t){var i=this.transformCoordToLocal(e,t);e=i[0],t=i[1];var n=this.style.__rect;n||(n=this.style.__rect=this.getRect(this.style));var a=n.height<8||n.width<8?4:0;return e>=n.x-a&&e<=n.x+n.width+a&&t>=n.y-a&&t<=n.y+n.height+a}},K.inherits(w,I),w}),i("echarts/util/shape/MarkLine",["require","zrender/shape/Base","./Icon","zrender/shape/Line","zrender/shape/BezierCurve","zrender/tool/area","zrender/shape/util/dashedLineTo","zrender/tool/util","zrender/tool/curve"],function(e){function t(e){i.call(this,e),this.style.curveness>0&&this.updatePoints(this.style),this.highlightStyle.curveness>0&&this.updatePoints(this.highlightStyle)}var i=e("zrender/shape/Base"),n=e("./Icon"),a=e("zrender/shape/Line"),o=new a({}),r=e("zrender/shape/BezierCurve"),s=new r({}),l=e("zrender/tool/area"),h=e("zrender/shape/util/dashedLineTo"),m=e("zrender/tool/util"),V=e("zrender/tool/curve");return t.prototype={type:"mark-line",brush:function(e,t){var i=this.style;t&&(i=this.getHighlightStyle(i,this.highlightStyle||{})),e.save(),this.setContext(e,i),this.setTransform(e),e.save(),e.beginPath(),this.buildPath(e,i),e.stroke(),e.restore(),this.brushSymbol(e,i,0),this.brushSymbol(e,i,1),this.drawText(e,i,this.style),e.restore()},buildPath:function(e,t){var i=t.lineType||"solid";if(e.moveTo(t.xStart,t.yStart),t.curveness>0){var n=null;switch(i){case"dashed":n=[5,5];break;case"dotted":n=[1,1]}n&&e.setLineDash&&e.setLineDash(n),e.quadraticCurveTo(t.cpX1,t.cpY1,t.xEnd,t.yEnd)}else if("solid"==i)e.lineTo(t.xEnd,t.yEnd);else{var a=(t.lineWidth||1)*("dashed"==t.lineType?5:1);h(e,t.xStart,t.yStart,t.xEnd,t.yEnd,a)}},updatePoints:function(e){var t=e.curveness||0,i=1,n=e.xStart,a=e.yStart,o=e.xEnd,r=e.yEnd,s=(n+o)/2-i*(a-r)*t,l=(a+r)/2-i*(o-n)*t;e.cpX1=s,e.cpY1=l},brushSymbol:function(e,t,i){if("none"!=t.symbol[i]){e.save(),e.beginPath(),e.lineWidth=t.symbolBorder,e.strokeStyle=t.symbolBorderColor;var a=t.symbol[i].replace("empty","").toLowerCase();t.symbol[i].match("empty")&&(e.fillStyle="#fff");var o=t.xStart,r=t.yStart,s=t.xEnd,l=t.yEnd,h=0===i?o:s,m=0===i?r:l,U=t.curveness||0,d=null!=t.symbolRotate[i]?t.symbolRotate[i]-0:0;if(d=d/180*Math.PI,"arrow"==a&&0===d)if(0===U){var p=0===i?-1:1;d=Math.PI/2+Math.atan2(p*(l-r),p*(s-o))}else{var c=t.cpX1,u=t.cpY1,y=V.quadraticDerivativeAt,g=y(o,c,s,i),b=y(r,u,l,i);d=Math.PI/2+Math.atan2(b,g)}e.translate(h,m),0!==d&&e.rotate(d);var f=t.symbolSize[i];n.prototype.buildPath(e,{x:-f,y:-f,width:2*f,height:2*f,iconType:a}),e.closePath(),e.fill(),e.stroke(),e.restore()}},getRect:function(e){return e.curveness>0?s.getRect(e):o.getRect(e),e.__rect},isCover:function(e,t){var i=this.transformCoordToLocal(e,t);return e=i[0],t=i[1],this.isCoverRect(e,t)?this.style.curveness>0?l.isInside(s,this.style,e,t):l.isInside(o,this.style,e,t):!1}},m.inherits(t,i),t}),i("echarts/util/shape/Symbol",["require","zrender/shape/Base","zrender/shape/Polygon","zrender/tool/util","./normalIsCover"],function(e){function t(e){i.call(this,e)}var i=e("zrender/shape/Base"),n=e("zrender/shape/Polygon"),a=new n({}),o=e("zrender/tool/util");return t.prototype={type:"symbol",buildPath:function(e,t){var i=t.pointList,n=i.length;if(0!==n)for(var a,o,r,s,l,h=1e4,m=Math.ceil(n/h),V=i[0]instanceof Array,U=t.size?t.size:2,d=U,p=U/2,c=2*Math.PI,u=0;m>u;u++){e.beginPath(),a=u*h,o=a+h,o=o>n?n:o;for(var y=a;o>y;y++)if(t.random&&(r=t["randomMap"+y%20]/100,d=U*r*r,p=d/2),V?(s=i[y][0],l=i[y][1]):(s=i[y].x,l=i[y].y),3>d)e.rect(s-p,l-p,d,d);else switch(t.iconType){case"circle":e.moveTo(s,l),e.arc(s,l,p,0,c,!0);break;case"diamond":e.moveTo(s,l-p),e.lineTo(s+p/3,l-p/3),e.lineTo(s+p,l),e.lineTo(s+p/3,l+p/3),e.lineTo(s,l+p),e.lineTo(s-p/3,l+p/3),e.lineTo(s-p,l),e.lineTo(s-p/3,l-p/3),e.lineTo(s,l-p);break;default:e.rect(s-p,l-p,d,d)}if(e.closePath(),m-1>u)switch(t.brushType){case"both":e.fill(),t.lineWidth>0&&e.stroke();break;case"stroke":t.lineWidth>0&&e.stroke();break;default:e.fill()}}},getRect:function(e){return e.__rect||a.getRect(e)},isCover:e("./normalIsCover")},o.inherits(t,i),t}),i("zrender/shape/Polyline",["require","./Base","./util/smoothSpline","./util/smoothBezier","./util/dashedLineTo","./Polygon","../tool/util"],function(e){var t=e("./Base"),i=e("./util/smoothSpline"),n=e("./util/smoothBezier"),a=e("./util/dashedLineTo"),o=function(e){this.brushTypeOnly="stroke",this.textPosition="end",t.call(this,e)};return o.prototype={type:"polyline",buildPath:function(e,t){var n=t.pointList;if(!(n.length<2)){var o=Math.min(t.pointList.length,Math.round(t.pointListLength||t.pointList.length));if(t.smooth&&"spline"!==t.smooth){t.controlPointList||this.updateControlPoints(t);var r=t.controlPointList;e.moveTo(n[0][0],n[0][1]);for(var s,l,h,m=0;o-1>m;m++)s=r[2*m],l=r[2*m+1],h=n[m+1],e.bezierCurveTo(s[0],s[1],l[0],l[1],h[0],h[1])}else if("spline"===t.smooth&&(n=i(n),o=n.length),t.lineType&&"solid"!=t.lineType){if("dashed"==t.lineType||"dotted"==t.lineType){var V=(t.lineWidth||1)*("dashed"==t.lineType?5:1);e.moveTo(n[0][0],n[0][1]);for(var m=1;o>m;m++)a(e,n[m-1][0],n[m-1][1],n[m][0],n[m][1],V)}}else{e.moveTo(n[0][0],n[0][1]);for(var m=1;o>m;m++)e.lineTo(n[m][0],n[m][1])}}},updateControlPoints:function(e){e.controlPointList=n(e.pointList,e.smooth,!1,e.smoothConstraint)},getRect:function(t){return e("./Polygon").prototype.getRect(t)}},e("../tool/util").inherits(o,t),o}),i("zrender/shape/ShapeBundle",["require","./Base","../tool/util"],function(e){var t=e("./Base"),i=function(e){t.call(this,e)};return i.prototype={constructor:i,type:"shape-bundle",brush:function(e,t){var i=this.beforeBrush(e,t);e.beginPath();for(var n=0;n0&&e.stroke();break;default:e.fill()}this.drawText(e,i,this.style),this.afterBrush(e)},getRect:function(e){if(e.__rect)return e.__rect;for(var t=1/0,i=-(1/0),n=1/0,a=-(1/0),o=0;oh;h++)o[h]=[r[h][0],l];else for(var m=r[0][0],h=0;s>h;h++)o[h]=[m,r[h][1]];"half-smooth-polygon"==i.type&&(o[s-1]=p.clone(r[s-1]),o[s-2]=p.clone(r[s-2])),t={style:{pointList:o}}}o=t.style.pointList;var V=o.length;i.style.pointList=V==s?o:s>V?o.concat(r.slice(V)):o.slice(0,s),e.addShape(i),i.__animating=!0,e.animate(i.id,"style").when(n,{pointList:r}).during(function(){i.updateControlPoints&&i.updateControlPoints(i.style)}).done(function(){i.__animating=!1}).start(a)}function i(e,t){for(var i=arguments.length,n=2;i>n;n++){var a=arguments[n];e.style[a]=t.style[a]}}function n(e,t,n,a,o){var r=n.style;t||(t={position:n.position,style:{x:r.x,y:"vertical"==n._orient?r.y+r.height:r.y,width:"vertical"==n._orient?r.width:0,height:"vertical"!=n._orient?r.height:0}});var s=r.x,l=r.y,h=r.width,m=r.height,V=[n.position[0],n.position[1]];i(n,t,"x","y","width","height"),n.position=t.position,e.addShape(n),(V[0]!=t.position[0]||V[1]!=t.position[1])&&e.animate(n.id,"").when(a,{position:V}).start(o),n.__animating=!0,e.animate(n.id,"style").when(a,{x:s,y:l,width:h,height:m}).done(function(){n.__animating=!1}).start(o)}function a(e,t,i,n,a){if(!t){var o=i.style.y;t={style:{y:[o[0],o[0],o[0],o[0]]}}}var r=i.style.y;i.style.y=t.style.y,e.addShape(i),i.__animating=!0,e.animate(i.id,"style").when(n,{y:r}).done(function(){i.__animating=!1}).start(a)}function o(e,t,i,n,a){var o=i.style.x,r=i.style.y,s=i.style.r0,l=i.style.r;i.__animating=!0,"r"!=i._animationAdd?(i.style.r0=0,i.style.r=0,i.rotation=[2*Math.PI,o,r],e.addShape(i),e.animate(i.id,"style").when(n,{r0:s,r:l}).done(function(){i.__animating=!1}).start(a),e.animate(i.id,"").when(n,{rotation:[0,o,r]}).start(a)):(i.style.r0=i.style.r,e.addShape(i),e.animate(i.id,"style").when(n,{r0:s}).done(function(){i.__animating=!1}).start(a))}function r(e,t,n,a,o){t||(t="r"!=n._animationAdd?{ +style:{startAngle:n.style.startAngle,endAngle:n.style.startAngle}}:{style:{r0:n.style.r}});var r=n.style.startAngle,s=n.style.endAngle;i(n,t,"startAngle","endAngle"),e.addShape(n),n.__animating=!0,e.animate(n.id,"style").when(a,{startAngle:r,endAngle:s}).done(function(){n.__animating=!1}).start(o)}function s(e,t,n,a,o){t||(t={style:{x:"left"==n.style.textAlign?n.style.x+100:n.style.x-100,y:n.style.y}});var r=n.style.x,s=n.style.y;i(n,t,"x","y"),e.addShape(n),n.__animating=!0,e.animate(n.id,"style").when(a,{x:r,y:s}).done(function(){n.__animating=!1}).start(o)}function l(t,i,n,a,o){var r=e("zrender/shape/Polygon").prototype.getRect(n.style),s=r.x+r.width/2,l=r.y+r.height/2;n.scale=[.1,.1,s,l],t.addShape(n),n.__animating=!0,t.animate(n.id,"").when(a,{scale:[1,1,s,l]}).done(function(){n.__animating=!1}).start(o)}function h(e,t,n,a,o){t||(t={style:{source0:0,source1:n.style.source1>0?360:-360,target0:0,target1:n.style.target1>0?360:-360}});var r=n.style.source0,s=n.style.source1,l=n.style.target0,h=n.style.target1;t.style&&i(n,t,"source0","source1","target0","target1"),e.addShape(n),n.__animating=!0,e.animate(n.id,"style").when(a,{source0:r,source1:s,target0:l,target1:h}).done(function(){n.__animating=!1}).start(o)}function m(e,t,i,n,a){t||(t={style:{angle:i.style.startAngle}});var o=i.style.angle;i.style.angle=t.style.angle,e.addShape(i),i.__animating=!0,e.animate(i.id,"style").when(n,{angle:o}).done(function(){i.__animating=!1}).start(a)}function V(e,t,i,a,o,r){if(i.style._x=i.style.x,i.style._y=i.style.y,i.style._width=i.style.width,i.style._height=i.style.height,t)n(e,t,i,a,o);else{var s=i._x||0,l=i._y||0;i.scale=[.01,.01,s,l],e.addShape(i),i.__animating=!0,e.animate(i.id,"").delay(r).when(a,{scale:[1,1,s,l]}).done(function(){i.__animating=!1}).start(o||"QuinticOut")}}function U(e,t,n,a,o){t||(t={style:{xStart:n.style.xStart,yStart:n.style.yStart,xEnd:n.style.xStart,yEnd:n.style.yStart}});var r=n.style.xStart,s=n.style.xEnd,l=n.style.yStart,h=n.style.yEnd;i(n,t,"xStart","xEnd","yStart","yEnd"),e.addShape(n),n.__animating=!0,e.animate(n.id,"style").when(a,{xStart:r,xEnd:s,yStart:l,yEnd:h}).done(function(){n.__animating=!1}).start(o)}function d(e,t,i,n,a){a=a||"QuinticOut",i.__animating=!0,e.addShape(i);var o=i.style,r=function(){i.__animating=!1},s=o.xStart,l=o.yStart,h=o.xEnd,m=o.yEnd;if(o.curveness>0){i.updatePoints(o);var V={p:0},U=o.cpX1,d=o.cpY1,p=[],u=[],y=c.quadraticSubdivide;e.animation.animate(V).when(n,{p:1}).during(function(){y(s,U,h,V.p,p),y(l,d,m,V.p,u),o.cpX1=p[1],o.cpY1=u[1],o.xEnd=p[2],o.yEnd=u[2],e.modShape(i)}).done(r).start(a)}else e.animate(i.id,"style").when(0,{xEnd:s,yEnd:l}).when(n,{xEnd:h,yEnd:m}).done(r).start(a)}var p=e("zrender/tool/util"),c=e("zrender/tool/curve");return{pointList:t,rectangle:n,candle:a,ring:o,sector:r,text:s,polygon:l,ribbon:h,gaugePointer:m,icon:V,line:U,markline:d}}),i("echarts/util/ecEffect",["require","../util/ecData","zrender/shape/Circle","zrender/shape/Image","zrender/tool/curve","../util/shape/Icon","../util/shape/Symbol","zrender/shape/ShapeBundle","zrender/shape/Polyline","zrender/tool/vector","zrender/tool/env"],function(e){function t(e,t,i,n){var a,r=i.effect,l=r.color||i.style.strokeColor||i.style.color,m=r.shadowColor||l,V=r.scaleSize,U=r.bounceDistance,d="undefined"!=typeof r.shadowBlur?r.shadowBlur:V;"image"!==i.type?(a=new h({zlevel:n,style:{brushType:"stroke",iconType:"droplet"!=i.style.iconType?i.style.iconType:"circle",x:d+1,y:d+1,n:i.style.n,width:i.style._width*V,height:i.style._height*V,lineWidth:1,strokeColor:l,shadowColor:m,shadowBlur:d},draggable:!1,hoverable:!1}),"pin"==i.style.iconType&&(a.style.y+=a.style.height/2*1.5),p&&(a.style.image=e.shapeToImage(a,a.style.width+2*d+2,a.style.height+2*d+2).style.image,a=new s({zlevel:a.zlevel,style:a.style,draggable:!1,hoverable:!1}))):a=new s({zlevel:n,style:i.style,draggable:!1,hoverable:!1}),o.clone(i,a),a.position=i.position,t.push(a),e.addShape(a);var c="image"!==i.type?window.devicePixelRatio||1:1,u=(a.style.width/c-i.style._width)/2;a.style.x=i.style._x-u,a.style.y=i.style._y-u,"pin"==i.style.iconType&&(a.style.y-=i.style.height/2*1.5);var y=100*(r.period+10*Math.random());e.modShape(i.id,{invisible:!0});var g=a.style.x+a.style.width/2/c,b=a.style.y+a.style.height/2/c;"scale"===r.type?(e.modShape(a.id,{scale:[.1,.1,g,b]}),e.animate(a.id,"",r.loop).when(y,{scale:[1,1,g,b]}).done(function(){i.effect.show=!1,e.delShape(a.id)}).start()):e.animate(a.id,"style",r.loop).when(y,{y:a.style.y-U}).when(2*y,{y:a.style.y}).done(function(){i.effect.show=!1,e.delShape(a.id)}).start()}function i(e,t,i,n){var a=i.effect,o=a.color||i.style.strokeColor||i.style.color,r=a.scaleSize,s=a.shadowColor||o,l="undefined"!=typeof a.shadowBlur?a.shadowBlur:2*r,h=window.devicePixelRatio||1,V=new m({zlevel:n,position:i.position,scale:i.scale,style:{pointList:i.style.pointList,iconType:i.style.iconType,color:o,strokeColor:o,shadowColor:s,shadowBlur:l*h,random:!0,brushType:"fill",lineWidth:1,size:i.style.size},draggable:!1,hoverable:!1});t.push(V),e.addShape(V),e.modShape(i.id,{invisible:!0});for(var U=Math.round(100*a.period),d={},p={},c=0;20>c;c++)V.style["randomMap"+c]=0,d={},d["randomMap"+c]=100,p={},p["randomMap"+c]=0,V.style["randomMap"+c]=100*Math.random(),e.animate(V.id,"style",!0).when(U,d).when(2*U,p).when(3*U,d).when(4*U,d).delay(Math.random()*U*c).start()}function n(e,t,i,n,a){var s=i.effect,h=i.style,m=s.color||h.strokeColor||h.color,V=s.shadowColor||h.strokeColor||m,c=h.lineWidth*s.scaleSize,u="undefined"!=typeof s.shadowBlur?s.shadowBlur:c,y=new r({zlevel:n,style:{x:u,y:u,r:c,color:m,shadowColor:V,shadowBlur:u},hoverable:!1}),g=0;if(p&&!a){var n=y.zlevel;y=e.shapeToImage(y,2*(c+u),2*(c+u)),y.zlevel=n,y.hoverable=!1,g=u}a||(o.clone(i,y),y.position=i.position,t.push(y),e.addShape(y));var b=function(){a||(i.effect.show=!1,e.delShape(y.id)),y.effectAnimator=null};if(i instanceof U){for(var f=[0],k=0,x=h.pointList,_=h.controlPointList,L=1;L0){var F=h.cpX1-g,T=h.cpY1-g;y.effectAnimator=e.animation.animate(y,{loop:s.loop}).when(E,{p:1}).during(function(t,i){y.style.x=l.quadraticAt(K,F,J,i),y.style.y=l.quadraticAt(I,T,C,i),a||e.modShape(y)}).done(b).start()}else y.effectAnimator=e.animation.animate(y.style,{loop:s.loop}).when(E,{x:J,y:C}).during(function(){a||e.modShape(y)}).done(b).start();y.effectAnimator.duration=E}return y}function a(e,t,i,a){var o=new V({style:{shapeList:[]},zlevel:a,hoverable:!1}),r=i.style.shapeList,s=i.effect;o.position=i.position;for(var l=0,h=[],m=0;ml&&(l=d.duration),0===m&&(o.style.color=U.style.color,o.style.shadowBlur=U.style.shadowBlur,o.style.shadowColor=U.style.shadowColor),h.push(d)}t.push(o),e.addShape(o);var p=function(){for(var e=0;e=0;o--)t=s.type==i.CHART_TYPE_PIE||s.type==i.CHART_TYPE_FUNNEL?n.get(s.shapeList[o],"name"):(n.get(s.shapeList[o],"series")||{}).name,t!=a||s.shapeList[o].invisible||s.shapeList[o].__animating||s.zr.addHoverShape(s.shapeList[o])},t&&t.bind(i.EVENT.LEGEND_HOVERLINK,this._onlegendhoverlink)}var i=e("../config"),n=e("../util/ecData"),a=e("../util/ecQuery"),o=e("../util/number"),r=e("zrender/tool/util");return t.prototype={canvasSupported:e("zrender/tool/env").canvasSupported,_getZ:function(e){if(null!=this[e])return this[e];var t=this.ecTheme[this.type];return t&&null!=t[e]?t[e]:(t=i[this.type],t&&null!=t[e]?t[e]:0)},getZlevelBase:function(){return this._getZ("zlevel")},getZBase:function(){return this._getZ("z")},reformOption:function(e){return e=r.merge(r.merge(e||{},r.clone(this.ecTheme[this.type]||{})),r.clone(i[this.type]||{})),this.z=e.z,this.zlevel=e.zlevel,e},reformCssArray:function(e){if(!(e instanceof Array))return[e,e,e,e];switch(e.length+""){case"4":return e;case"3":return[e[0],e[1],e[2],e[1]];case"2":return[e[0],e[1],e[0],e[1]];case"1":return[e[0],e[0],e[0],e[0]];case"0":return[0,0,0,0]}},getShapeById:function(e){for(var t=0,i=this.shapeList.length;i>t;t++)if(this.shapeList[t].id===e)return this.shapeList[t];return null},getFont:function(e){var t=this.getTextStyle(r.clone(e));return t.fontStyle+" "+t.fontWeight+" "+t.fontSize+"px "+t.fontFamily},getTextStyle:function(e){return r.merge(r.merge(e||{},this.ecTheme.textStyle),i.textStyle)},getItemStyleColor:function(e,t,i,n){return"function"==typeof e?e.call(this.myChart,{seriesIndex:t,series:this.series[t],dataIndex:i,data:n}):e},getDataFromOption:function(e,t){return null!=e?null!=e.value?e.value:e:t},subPixelOptimize:function(e,t){return e=t%2===1?Math.floor(e)+.5:Math.round(e)},resize:function(){this.refresh&&this.refresh(),this.clearEffectShape&&this.clearEffectShape(!0);var e=this;setTimeout(function(){e.animationEffect&&e.animationEffect()},200)},clear:function(){this.clearEffectShape&&this.clearEffectShape(),this.zr&&this.zr.delShape(this.shapeList),this.shapeList=[]},dispose:function(){this.onbeforDispose&&this.onbeforDispose(),this.clear(),this.shapeList=null,this.effectList=null,this.messageCenter&&this.messageCenter.unbind(i.EVENT.LEGEND_HOVERLINK,this._onlegendhoverlink),this.onafterDispose&&this.onafterDispose()},query:a.query,deepQuery:a.deepQuery,deepMerge:a.deepMerge,parsePercent:o.parsePercent,parseCenter:o.parseCenter,parseRadius:o.parseRadius,numAddCommas:o.addCommas,getPrecision:o.getPrecision},t}),i("echarts/layout/EdgeBundling",["require","../data/KDTree","zrender/tool/vector"],function(e){function t(e,t){e=e.array,t=t.array;var i=t[0]-e[0],n=t[1]-e[1],a=t[2]-e[2],o=t[3]-e[3];return i*i+n*n+a*a+o*o}function i(e){this.points=[e.mp0,e.mp1],this.group=e}function n(e){var t=e.points;t[0][1]0&&t(e[o],n[a-1])||(n[a++]=U(e[o]));return i[0]&&!t(n[0],i[0])&&(n=n.reverse()),n}for(var a=this._iterate(e),o=0;o++f&&(f=W,k=L,V(g,c),V(y,p),b=u)}if(k){s+=f;var X;k.group||(X=new a,o.push(X),X.addEdge(k)),X=k.group,V(X.mp0,y),V(X.mp1,g),X.ink=b,k.group.addEdge(m)}else{var X=new a;o.push(X),V(X.mp0,m.getStartPoint()),V(X.mp1,m.getEndPoint()),X.ink=m.ink,X.addEdge(m)}}}return{groups:o,edges:i,savedInk:s}},_calculateEdgeEdgeInk:function(){var e=[],t=[];return function(i,n,a,o){e[0]=i.getStartPoint(),e[1]=n.getStartPoint(),t[0]=i.getEndPoint(),t[1]=n.getEndPoint(),this._calculateMeetPoints(e,t,a,o);var r=m(e[0],a)+m(a,o)+m(o,t[0])+m(e[1],a)+m(o,t[1]);return r}}(),_calculateGroupEdgeInk:function(e,t,i,n){for(var a=[],o=[],r=0;rl;l++)s.add(e,e,i[l]);s.scale(e,e,1/r),r=n.length;for(var l=0;r>l;l++)s.add(t,t,n[l]);s.scale(t,t,1/r),this._limitTurningAngle(i,e,t,a),this._limitTurningAngle(n,t,e,o)}}(),_limitTurningAngle:function(){var e=l(),t=l(),i=l(),n=l();return function(a,o,r,l){var V=Math.cos(this.maxTurningAngle),U=Math.tan(this.maxTurningAngle);s.sub(e,o,r),s.normalize(e,e),s.copy(l,o);for(var d=0,p=0;py){s.scaleAndAdd(i,o,e,u*y);var g=m(i,c),b=g/U;s.scaleAndAdd(n,i,e,-b);var f=h(n,o);f>d&&(d=f,s.copy(l,n))}}}}()},o}),i("zrender/shape/Star",["require","../tool/math","./Base","../tool/util"],function(e){var t=e("../tool/math"),i=t.sin,n=t.cos,a=Math.PI,o=e("./Base"),r=function(e){o.call(this,e)};return r.prototype={type:"star",buildPath:function(e,t){var o=t.n;if(o&&!(2>o)){var r=t.x,s=t.y,l=t.r,h=t.r0;null==h&&(h=o>4?l*n(2*a/o)/n(a/o):l/3);var m=a/o,V=-a/2,U=r+l*n(V),d=s+l*i(V);V+=m;var p=t.pointList=[];p.push([U,d]);for(var c,u=0,y=2*o-1;y>u;u++)c=u%2===0?h:l,p.push([r+c*n(V),s+c*i(V)]),V+=m;p.push([U,d]),e.moveTo(p[0][0],p[0][1]);for(var u=0;ur;r+=2)e[0]=Math.min(e[0],e[0],o[r]),e[1]=Math.min(e[1],e[1],o[r+1]),i[0]=Math.max(i[0],i[0],o[r]),i[1]=Math.max(i[1],i[1],o[r+1]);break;case"Q":for(var r=0;4>r;r+=2)e[0]=Math.min(e[0],e[0],o[r]),e[1]=Math.min(e[1],e[1],o[r+1]),i[0]=Math.max(i[0],i[0],o[r]),i[1]=Math.max(i[1],i[1],o[r+1]);break;case"A":var s=o[0],l=o[1],h=o[2],m=o[3];e[0]=Math.min(e[0],e[0],s-h),e[1]=Math.min(e[1],e[1],l-m),i[0]=Math.max(i[0],i[0],s+h),i[1]=Math.max(i[1],i[1],l+m)}}return{x:e[0],y:e[1],width:i[0]-e[0],height:i[1]-e[1]}},n.prototype.begin=function(e){return this._ctx=e||null,this.pathCommands.length=0,this},n.prototype.moveTo=function(e,t){return this.pathCommands.push(new i("M",[e,t])),this._ctx&&this._ctx.moveTo(e,t),this},n.prototype.lineTo=function(e,t){return this.pathCommands.push(new i("L",[e,t])),this._ctx&&this._ctx.lineTo(e,t),this},n.prototype.bezierCurveTo=function(e,t,n,a,o,r){return this.pathCommands.push(new i("C",[e,t,n,a,o,r])),this._ctx&&this._ctx.bezierCurveTo(e,t,n,a,o,r),this},n.prototype.quadraticCurveTo=function(e,t,n,a){return this.pathCommands.push(new i("Q",[e,t,n,a])),this._ctx&&this._ctx.quadraticCurveTo(e,t,n,a),this},n.prototype.arc=function(e,t,n,a,o,r){return this.pathCommands.push(new i("A",[e,t,n,n,a,o-a,0,r?0:1])),this._ctx&&this._ctx.arc(e,t,n,a,o,r),this},n.prototype.arcTo=function(e,t,i,n,a){return this._ctx&&this._ctx.arcTo(e,t,i,n,a),this},n.prototype.rect=function(e,t,i,n){return this._ctx&&this._ctx.rect(e,t,i,n),this},n.prototype.closePath=function(){return this.pathCommands.push(new i("z")),this._ctx&&this._ctx.closePath(),this},n.prototype.isEmpty=function(){return 0===this.pathCommands.length},n.PathSegment=i,n}),i("zrender/shape/Line",["require","./Base","./util/dashedLineTo","../tool/util"],function(e){var t=e("./Base"),i=e("./util/dashedLineTo"),n=function(e){this.brushTypeOnly="stroke",this.textPosition="end",t.call(this,e)};return n.prototype={type:"line",buildPath:function(e,t){if(t.lineType&&"solid"!=t.lineType){if("dashed"==t.lineType||"dotted"==t.lineType){var n=(t.lineWidth||1)*("dashed"==t.lineType?5:1);i(e,t.xStart,t.yStart,t.xEnd,t.yEnd,n)}}else e.moveTo(t.xStart,t.yStart),e.lineTo(t.xEnd,t.yEnd)},getRect:function(e){if(e.__rect)return e.__rect;var t=e.lineWidth||1;return e.__rect={x:Math.min(e.xStart,e.xEnd)-t,y:Math.min(e.yStart,e.yEnd)-t,width:Math.abs(e.xStart-e.xEnd)+t,height:Math.abs(e.yStart-e.yEnd)+t},e.__rect}},e("../tool/util").inherits(n,t),n}),i("zrender/shape/BezierCurve",["require","./Base","../tool/util"],function(e){"use strict";var t=e("./Base"),i=function(e){this.brushTypeOnly="stroke",this.textPosition="end",t.call(this,e)};return i.prototype={type:"bezier-curve",buildPath:function(e,t){e.moveTo(t.xStart,t.yStart),"undefined"!=typeof t.cpX2&&"undefined"!=typeof t.cpY2?e.bezierCurveTo(t.cpX1,t.cpY1,t.cpX2,t.cpY2,t.xEnd,t.yEnd):e.quadraticCurveTo(t.cpX1,t.cpY1,t.xEnd,t.yEnd)},getRect:function(e){if(e.__rect)return e.__rect;var t=Math.min(e.xStart,e.xEnd,e.cpX1),i=Math.min(e.yStart,e.yEnd,e.cpY1),n=Math.max(e.xStart,e.xEnd,e.cpX1),a=Math.max(e.yStart,e.yEnd,e.cpY1),o=e.cpX2,r=e.cpY2;"undefined"!=typeof o&&"undefined"!=typeof r&&(t=Math.min(t,o),i=Math.min(i,r),n=Math.max(n,o),a=Math.max(a,r));var s=e.lineWidth||1;return e.__rect={x:t-s,y:i-s,width:n-t+s,height:a-i+s},e.__rect}},e("../tool/util").inherits(i,t),i}),i("zrender/shape/util/dashedLineTo",[],function(){var e=[5,5];return function(t,i,n,a,o,r){if(t.setLineDash)return e[0]=e[1]=r,t.setLineDash(e),t.moveTo(i,n),void t.lineTo(a,o);r="number"!=typeof r?5:r;var s=a-i,l=o-n,h=Math.floor(Math.sqrt(s*s+l*l)/r);s/=h,l/=h;for(var m=!0,V=0;h>V;++V)m?t.moveTo(i,n):t.lineTo(i,n),m=!m,i+=s,n+=l;t.lineTo(a,o)}}),i("zrender/shape/Polygon",["require","./Base","./util/smoothSpline","./util/smoothBezier","./util/dashedLineTo","../tool/util"],function(e){var t=e("./Base"),i=e("./util/smoothSpline"),n=e("./util/smoothBezier"),a=e("./util/dashedLineTo"),o=function(e){t.call(this,e)};return o.prototype={type:"polygon",buildPath:function(e,t){var o=t.pointList;if(!(o.length<2)){if(t.smooth&&"spline"!==t.smooth){var r=n(o,t.smooth,!0,t.smoothConstraint);e.moveTo(o[0][0],o[0][1]);for(var s,l,h,m=o.length,V=0;m>V;V++)s=r[2*V],l=r[2*V+1],h=o[(V+1)%m],e.bezierCurveTo(s[0],s[1],l[0],l[1],h[0],h[1])}else if("spline"===t.smooth&&(o=i(o,!0)),t.lineType&&"solid"!=t.lineType){if("dashed"==t.lineType||"dotted"==t.lineType){var U=t._dashLength||(t.lineWidth||1)*("dashed"==t.lineType?5:1);t._dashLength=U,e.moveTo(o[0][0],o[0][1]);for(var V=1,d=o.length;d>V;V++)a(e,o[V-1][0],o[V-1][1],o[V][0],o[V][1],U);a(e,o[o.length-1][0],o[o.length-1][1],o[0][0],o[0][1],U)}}else{e.moveTo(o[0][0],o[0][1]);for(var V=1,d=o.length;d>V;V++)e.lineTo(o[V][0],o[V][1]);e.lineTo(o[0][0],o[0][1])}e.closePath()}},getRect:function(e){if(e.__rect)return e.__rect;for(var t=Number.MAX_VALUE,i=Number.MIN_VALUE,n=Number.MAX_VALUE,a=Number.MIN_VALUE,o=e.pointList,r=0,s=o.length;s>r;r++)o[r][0]i&&(i=o[r][0]),o[r][1]a&&(a=o[r][1]);var l;return l="stroke"==e.brushType||"fill"==e.brushType?e.lineWidth||1:0,e.__rect={x:Math.round(t-l/2),y:Math.round(n-l/2),width:i-t+l,height:a-n+l},e.__rect}},e("../tool/util").inherits(o,t),o}),i("echarts/util/shape/normalIsCover",[],function(){return function(e,t){var i=this.transformCoordToLocal(e,t);return e=i[0],t=i[1],this.isCoverRect(e,t)}}),i("zrender/shape/util/smoothSpline",["require","../../tool/vector"],function(e){function t(e,t,i,n,a,o,r){var s=.5*(i-e),l=.5*(n-t);return(2*(t-i)+s+l)*r+(-3*(t-i)-2*s-l)*o+s*a+t}var i=e("../../tool/vector");return function(e,n){for(var a=e.length,o=[],r=0,s=1;a>s;s++)r+=i.distance(e[s-1],e[s]);var l=r/5;l=a>l?a:l;for(var s=0;l>s;s++){var h,m,V,U=s/(l-1)*(n?a:a-1),d=Math.floor(U),p=U-d,c=e[d%a];n?(h=e[(d-1+a)%a],m=e[(d+1)%a],V=e[(d+2)%a]):(h=e[0===d?d:d-1],m=e[d>a-2?a-1:d+1],V=e[d>a-3?a-1:d+2]);var u=p*p,y=p*u;o.push([t(h[0],c[0],m[0],V[0],p,u,y),t(h[1],c[1],m[1],V[1],p,u,y)])}return o}}),i("zrender/shape/util/smoothBezier",["require","../../tool/vector"],function(e){var t=e("../../tool/vector");return function(e,i,n,a){var o,r,s,l,h=[],m=[],V=[],U=[],d=!!a;if(d){s=[1/0,1/0],l=[-(1/0),-(1/0)];for(var p=0,c=e.length;c>p;p++)t.min(s,s,e[p]),t.max(l,l,e[p]);t.min(s,s,a[0]),t.max(l,l,a[1])}for(var p=0,c=e.length;c>p;p++){var o,r,u=e[p];if(n)o=e[p?p-1:c-1],r=e[(p+1)%c];else{if(0===p||p===c-1){h.push(t.clone(e[p]));continue}o=e[p-1],r=e[p+1]}t.sub(m,r,o),t.scale(m,m,i);var y=t.distance(u,o),g=t.distance(u,r),b=y+g;0!==b&&(y/=b,g/=b),t.scale(V,m,-y),t.scale(U,m,g);var f=t.add([],u,V),k=t.add([],u,U);d&&(t.max(f,f,s),t.min(f,f,l),t.max(k,k,s),t.min(k,k,l)),h.push(f),h.push(k)}return n&&h.push(t.clone(h.shift())),h}}),i("echarts/util/ecQuery",["require","zrender/tool/util"],function(e){function t(e,t){if("undefined"!=typeof e){if(!t)return e;t=t.split(".");for(var i=t.length,n=0;i>n;){if(e=e[t[n]],"undefined"==typeof e)return;n++}return e}}function i(e,i){for(var n,a=0,o=e.length;o>a;a++)if(n=t(e[a],i),"undefined"!=typeof n)return n}function n(e,i){for(var n,o=e.length;o--;){var r=t(e[o],i);"undefined"!=typeof r&&("undefined"==typeof n?n=a.clone(r):a.merge(n,r,!0))}return n}var a=e("zrender/tool/util");return{query:t,deepQuery:i,deepMerge:n}}),i("echarts/util/number",[],function(){function e(e){return e.replace(/^\s+/,"").replace(/\s+$/,"")}function t(t,i){return"string"==typeof t?e(t).match(/%$/)?parseFloat(t)/100*i:parseFloat(t):t}function i(e,i){return[t(i[0],e.getWidth()),t(i[1],e.getHeight())]}function n(e,i){i instanceof Array||(i=[0,i]);var n=Math.min(e.getWidth(),e.getHeight())/2;return[t(i[0],n),t(i[1],n)]}function a(e){return isNaN(e)?"-":(e=(e+"").split("."),e[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(e.length>1?"."+e[1]:""))}function o(e){for(var t=1,i=0;Math.round(e*t)/t!==e;)t*=10,i++;return i}return{parsePercent:t,parseCenter:i,parseRadius:n,addCommas:a,getPrecision:o}}),i("echarts/data/KDTree",["require","./quickSelect"],function(e){function t(e,t){this.left=null,this.right=null,this.axis=e,this.data=t}var i=e("./quickSelect"),n=function(e,t){e.length&&(t||(t=e[0].array.length),this.dimension=t,this.root=this._buildTree(e,0,e.length-1,0),this._stack=[],this._nearstNList=[])};return n.prototype._buildTree=function(e,n,a,o){if(n>a)return null;var r=Math.floor((n+a)/2);r=i(e,n,a,r,function(e,t){return e.array[o]-t.array[o]});var s=e[r],l=new t(o,s);return o=(o+1)%this.dimension,a>n&&(l.left=this._buildTree(e,n,r-1,o),l.right=this._buildTree(e,r+1,a,o)),l},n.prototype.nearest=function(e,t){var i=this.root,n=this._stack,a=0,o=1/0,r=null;for(i.data!==e&&(o=t(i.data,e),r=i),e.array[i.axis]s,h=!1;s*=s,o>s&&(s=t(i.data,e),o>s&&i.data!==e&&(o=s,r=i),h=!0),l?(h&&i.right&&(n[a++]=i.right),i.left&&(n[a++]=i.left)):(h&&i.left&&(n[a++]=i.left),i.right&&(n[a++]=i.right))}return r.data},n.prototype._addNearest=function(e,t,i){for(var n=this._nearstNList,a=e-1;a>0&&!(t>=n[a-1].dist);a--)n[a].dist=n[a-1].dist,n[a].node=n[a-1].node;n[a].dist=t,n[a].node=i},n.prototype.nearestN=function(e,t,i,n){if(0>=t)return n.length=0,n;for(var a=this.root,o=this._stack,r=0,s=this._nearstNList,l=0;t>l;l++)s[l]||(s[l]={}),s[l].dist=0,s[l].node=null;var h=i(a.data,e),m=0;for(a.data!==e&&(m++,this._addNearest(m,h,a)),e.array[a.axis]h,U=!1;h*=h,(t>m||hm||hm&&m++,this._addNearest(m,h,a)),U=!0),V?(U&&a.right&&(o[r++]=a.right),a.left&&(o[r++]=a.left)):(U&&a.left&&(o[r++]=a.left),a.right&&(o[r++]=a.right))}for(var l=0;m>l;l++)n[l]=s[l].node.data;return n.length=m,n},n}),i("echarts/data/quickSelect",["require"],function(){function e(e,t){return e-t}function t(e,t,i){var n=e[t];e[t]=e[i],e[i]=n}function i(e,i,n,a,o){for(var r=i;n>i;){var r=Math.round((n+i)/2),s=e[r];t(e,r,n),r=i;for(var l=i;n-1>=l;l++)o(s,e[l])>=0&&(t(e,l,r),r++);if(t(e,n,r),r===a)return r;a>r?i=r+1:n=r-1}return i}function n(t,n,a,o,r){return arguments.length<=3&&(o=n,r=2==arguments.length?e:a,n=0,a=t.length-1),i(t,n,a,o,r)}return n}),i("echarts/component/dataView",["require","./base","../config","zrender/tool/util","../component"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.dom=o.dom,this._tDom=document.createElement("div"),this._textArea=document.createElement("textArea"),this._buttonRefresh=document.createElement("button"),this._buttonRefresh.setAttribute("type","button"),this._buttonClose=document.createElement("button"),this._buttonClose.setAttribute("type","button"),this._hasShow=!1,this._zrHeight=n.getHeight(),this._zrWidth=n.getWidth(),this._tDom.className="echarts-dataview",this.hide(),this.dom.firstChild.appendChild(this._tDom),window.addEventListener?(this._tDom.addEventListener("click",this._stop),this._tDom.addEventListener("mousewheel",this._stop),this._tDom.addEventListener("mousemove",this._stop),this._tDom.addEventListener("mousedown",this._stop),this._tDom.addEventListener("mouseup",this._stop),this._tDom.addEventListener("touchstart",this._stop),this._tDom.addEventListener("touchmove",this._stop),this._tDom.addEventListener("touchend",this._stop)):(this._tDom.attachEvent("onclick",this._stop),this._tDom.attachEvent("onmousewheel",this._stop),this._tDom.attachEvent("onmousemove",this._stop),this._tDom.attachEvent("onmousedown",this._stop),this._tDom.attachEvent("onmouseup",this._stop))}var i=e("./base"),n=e("../config"),a=e("zrender/tool/util");return t.prototype={type:n.COMPONENT_TYPE_DATAVIEW,_lang:["Data View","close","refresh"],_gCssText:"position:absolute;display:block;overflow:hidden;transition:height 0.8s,background-color 1s;-moz-transition:height 0.8s,background-color 1s;-webkit-transition:height 0.8s,background-color 1s;-o-transition:height 0.8s,background-color 1s;z-index:1;left:0;top:0;",hide:function(){this._sizeCssText="width:"+this._zrWidth+"px;height:0px;background-color:#f0ffff;",this._tDom.style.cssText=this._gCssText+this._sizeCssText},show:function(e){this._hasShow=!0;var t=this.query(this.option,"toolbox.feature.dataView.lang")||this._lang;this.option=e,this._tDom.innerHTML='

'+(t[0]||this._lang[0])+"

";var i=this.query(this.option,"toolbox.feature.dataView.optionToContent");"function"!=typeof i?this._textArea.value=this._optionToContent():(this._textArea=document.createElement("div"),this._textArea.innerHTML=i(this.option)),this._textArea.style.cssText="display:block;margin:0 0 8px 0;padding:4px 6px;overflow:auto;width:100%;height:"+(this._zrHeight-100)+"px;",this._tDom.appendChild(this._textArea),this._buttonClose.style.cssText="float:right;padding:1px 6px;",this._buttonClose.innerHTML=t[1]||this._lang[1];var n=this;this._buttonClose.onclick=function(){n.hide()},this._tDom.appendChild(this._buttonClose),this.query(this.option,"toolbox.feature.dataView.readOnly")===!1?(this._buttonRefresh.style.cssText="float:right;margin-right:10px;padding:1px 6px;",this._buttonRefresh.innerHTML=t[2]||this._lang[2],this._buttonRefresh.onclick=function(){n._save()},this._textArea.readOnly=!1,this._textArea.style.cursor="default"):(this._buttonRefresh.style.cssText="display:none", +this._textArea.readOnly=!0,this._textArea.style.cursor="text"),this._tDom.appendChild(this._buttonRefresh),this._sizeCssText="width:"+this._zrWidth+"px;height:"+this._zrHeight+"px;background-color:#fff;",this._tDom.style.cssText=this._gCssText+this._sizeCssText},_optionToContent:function(){var e,t,i,a,o,r,s=[],l="";if(this.option.xAxis)for(s=this.option.xAxis instanceof Array?this.option.xAxis:[this.option.xAxis],e=0,a=s.length;a>e;e++)if("category"==(s[e].type||"category")){for(r=[],t=0,i=s[e].data.length;i>t;t++)r.push(this.getDataFromOption(s[e].data[t]));l+=r.join(", ")+"\n\n"}if(this.option.yAxis)for(s=this.option.yAxis instanceof Array?this.option.yAxis:[this.option.yAxis],e=0,a=s.length;a>e;e++)if("category"==s[e].type){for(r=[],t=0,i=s[e].data.length;i>t;t++)r.push(this.getDataFromOption(s[e].data[t]));l+=r.join(", ")+"\n\n"}var h,m=this.option.series;for(e=0,a=m.length;a>e;e++){for(r=[],t=0,i=m[e].data.length;i>t;t++)o=m[e].data[t],h=m[e].type==n.CHART_TYPE_PIE||m[e].type==n.CHART_TYPE_MAP?(o.name||"-")+":":"",m[e].type==n.CHART_TYPE_SCATTER&&(o=this.getDataFromOption(o).join(", ")),r.push(h+this.getDataFromOption(o));l+=(m[e].name||"-")+" : \n",l+=r.join(m[e].type==n.CHART_TYPE_SCATTER?"\n":", "),l+="\n\n"}return l},_save:function(){var e=this.query(this.option,"toolbox.feature.dataView.contentToOption");if("function"!=typeof e){for(var t=this._textArea.value.split("\n"),i=[],a=0,o=t.length;o>a;a++)t[a]=this._trim(t[a]),""!==t[a]&&i.push(t[a]);this._contentToOption(i)}else e(this._textArea,this.option);this.hide();var r=this;setTimeout(function(){r.messageCenter&&r.messageCenter.dispatch(n.EVENT.DATA_VIEW_CHANGED,null,{option:r.option},r.myChart)},r.canvasSupported?800:100)},_contentToOption:function(e){var t,i,a,o,r,s,l,h=[],m=0;if(this.option.xAxis)for(h=this.option.xAxis instanceof Array?this.option.xAxis:[this.option.xAxis],t=0,o=h.length;o>t;t++)if("category"==(h[t].type||"category")){for(s=e[m].split(","),i=0,a=h[t].data.length;a>i;i++)l=this._trim(s[i]||""),r=h[t].data[i],"undefined"!=typeof h[t].data[i].value?h[t].data[i].value=l:h[t].data[i]=l;m++}if(this.option.yAxis)for(h=this.option.yAxis instanceof Array?this.option.yAxis:[this.option.yAxis],t=0,o=h.length;o>t;t++)if("category"==h[t].type){for(s=e[m].split(","),i=0,a=h[t].data.length;a>i;i++)l=this._trim(s[i]||""),r=h[t].data[i],"undefined"!=typeof h[t].data[i].value?h[t].data[i].value=l:h[t].data[i]=l;m++}var V=this.option.series;for(t=0,o=V.length;o>t;t++)if(m++,V[t].type==n.CHART_TYPE_SCATTER)for(var i=0,a=V[t].data.length;a>i;i++)s=e[m],l=s.replace(" ","").split(","),"undefined"!=typeof V[t].data[i].value?V[t].data[i].value=l:V[t].data[i]=l,m++;else{s=e[m].split(",");for(var i=0,a=V[t].data.length;a>i;i++)l=(s[i]||"").replace(/.*:/,""),l=this._trim(l),l="-"!=l&&""!==l?l-0:"-","undefined"!=typeof V[t].data[i].value?V[t].data[i].value=l:V[t].data[i]=l;m++}},_trim:function(e){var t=new RegExp("(^[\\s\\t\\xa0\\u3000]+)|([\\u3000\\xa0\\s\\t]+$)","g");return e.replace(t,"")},_stop:function(e){e=e||window.event,e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},resize:function(){this._zrHeight=this.zr.getHeight(),this._zrWidth=this.zr.getWidth(),this._tDom.offsetHeight>10&&(this._sizeCssText="width:"+this._zrWidth+"px;height:"+this._zrHeight+"px;background-color:#fff;",this._tDom.style.cssText=this._gCssText+this._sizeCssText,this._textArea.style.cssText="display:block;margin:0 0 8px 0;padding:4px 6px;overflow:auto;width:100%;height:"+(this._zrHeight-100)+"px;")},dispose:function(){window.removeEventListener?(this._tDom.removeEventListener("click",this._stop),this._tDom.removeEventListener("mousewheel",this._stop),this._tDom.removeEventListener("mousemove",this._stop),this._tDom.removeEventListener("mousedown",this._stop),this._tDom.removeEventListener("mouseup",this._stop),this._tDom.removeEventListener("touchstart",this._stop),this._tDom.removeEventListener("touchmove",this._stop),this._tDom.removeEventListener("touchend",this._stop)):(this._tDom.detachEvent("onclick",this._stop),this._tDom.detachEvent("onmousewheel",this._stop),this._tDom.detachEvent("onmousemove",this._stop),this._tDom.detachEvent("onmousedown",this._stop),this._tDom.detachEvent("onmouseup",this._stop)),this._buttonRefresh.onclick=null,this._buttonClose.onclick=null,this._hasShow&&(this._tDom.removeChild(this._textArea),this._tDom.removeChild(this._buttonRefresh),this._tDom.removeChild(this._buttonClose)),this._textArea=null,this._buttonRefresh=null,this._buttonClose=null,this.dom.firstChild.removeChild(this._tDom),this._tDom=null}},a.inherits(t,i),e("../component").define("dataView",t),t}),i("echarts/util/shape/Cross",["require","zrender/shape/Base","zrender/shape/Line","zrender/tool/util","./normalIsCover"],function(e){function t(e){i.call(this,e)}var i=e("zrender/shape/Base"),n=e("zrender/shape/Line"),a=e("zrender/tool/util");return t.prototype={type:"cross",buildPath:function(e,t){var i=t.rect;t.xStart=i.x,t.xEnd=i.x+i.width,t.yStart=t.yEnd=t.y,n.prototype.buildPath(e,t),t.xStart=t.xEnd=t.x,t.yStart=i.y,t.yEnd=i.y+i.height,n.prototype.buildPath(e,t)},getRect:function(e){return e.rect},isCover:e("./normalIsCover")},a.inherits(t,i),t}),i("zrender/shape/Sector",["require","../tool/math","../tool/computeBoundingBox","../tool/vector","./Base","../tool/util"],function(e){var t=e("../tool/math"),i=e("../tool/computeBoundingBox"),n=e("../tool/vector"),a=e("./Base"),o=n.create(),r=n.create(),s=n.create(),l=n.create(),h=function(e){a.call(this,e)};return h.prototype={type:"sector",buildPath:function(e,i){var n=i.x,a=i.y,o=i.r0||0,r=i.r,s=i.startAngle,l=i.endAngle,h=i.clockWise||!1;s=t.degreeToRadian(s),l=t.degreeToRadian(l),h||(s=-s,l=-l);var m=t.cos(s),V=t.sin(s);e.moveTo(m*o+n,V*o+a),e.lineTo(m*r+n,V*r+a),e.arc(n,a,r,s,l,!h),e.lineTo(t.cos(l)*o+n,t.sin(l)*o+a),0!==o&&e.arc(n,a,o,l,s,h),e.closePath()},getRect:function(e){if(e.__rect)return e.__rect;var a=e.x,h=e.y,m=e.r0||0,V=e.r,U=t.degreeToRadian(e.startAngle),d=t.degreeToRadian(e.endAngle),p=e.clockWise;return p||(U=-U,d=-d),m>1?i.arc(a,h,m,U,d,!p,o,s):(o[0]=s[0]=a,o[1]=s[1]=h),i.arc(a,h,V,U,d,!p,r,l),n.min(o,o,r),n.max(s,s,l),e.__rect={x:o[0],y:o[1],width:s[0]-o[0],height:s[1]-o[1]},e.__rect}},e("../tool/util").inherits(h,a),h}),i("echarts/util/shape/Candle",["require","zrender/shape/Base","zrender/tool/util","./normalIsCover"],function(e){function t(e){i.call(this,e)}var i=e("zrender/shape/Base"),n=e("zrender/tool/util");return t.prototype={type:"candle",_numberOrder:function(e,t){return t-e},buildPath:function(e,t){var i=n.clone(t.y).sort(this._numberOrder);e.moveTo(t.x,i[3]),e.lineTo(t.x,i[2]),e.moveTo(t.x-t.width/2,i[2]),e.rect(t.x-t.width/2,i[2],t.width,i[1]-i[2]),e.moveTo(t.x,i[1]),e.lineTo(t.x,i[0])},getRect:function(e){if(!e.__rect){var t=0;("stroke"==e.brushType||"fill"==e.brushType)&&(t=e.lineWidth||1);var i=n.clone(e.y).sort(this._numberOrder);e.__rect={x:Math.round(e.x-e.width/2-t/2),y:Math.round(i[3]-t/2),width:e.width+t,height:i[0]-i[3]+t}}return e.__rect},isCover:e("./normalIsCover")},n.inherits(t,i),t}),i("zrender/tool/computeBoundingBox",["require","./vector","./curve"],function(e){function t(e,t,i){if(0!==e.length){for(var n=e[0][0],a=e[0][0],o=e[0][1],r=e[0][1],s=1;sa&&(a=l[0]),l[1]r&&(r=l[1])}t[0]=n,t[1]=o,i[0]=a,i[1]=r}}function i(e,t,i,n,a,r){var s=[];o.cubicExtrema(e[0],t[0],i[0],n[0],s);for(var l=0;l=2*Math.PI)return m[0]=e-i,m[1]=t-i,V[0]=e+i,void(V[1]=t+i);if(r[0]=Math.cos(n)*i+e,r[1]=Math.sin(n)*i+t,s[0]=Math.cos(o)*i+e,s[1]=Math.sin(o)*i+t,a.min(m,r,s),a.max(V,r,s),n%=2*Math.PI,0>n&&(n+=2*Math.PI),o%=2*Math.PI,0>o&&(o+=2*Math.PI),n>o&&!h?o+=2*Math.PI:o>n&&h&&(n+=2*Math.PI),h){var U=o;o=n,n=U}for(var d=0;o>d;d+=Math.PI/2)d>n&&(l[0]=Math.cos(d)*i+e,l[1]=Math.sin(d)*i+t,a.min(m,l,m),a.max(V,l,V))};return t.cubeBezier=i,t.quadraticBezier=n,t.arc=h,t}),i("echarts/util/shape/Chain",["require","zrender/shape/Base","./Icon","zrender/shape/util/dashedLineTo","zrender/tool/util","zrender/tool/matrix"],function(e){function t(e){i.call(this,e)}var i=e("zrender/shape/Base"),n=e("./Icon"),a=e("zrender/shape/util/dashedLineTo"),o=e("zrender/tool/util"),r=e("zrender/tool/matrix");return t.prototype={type:"chain",brush:function(e,t){var i=this.style;t&&(i=this.getHighlightStyle(i,this.highlightStyle||{})),e.save(),this.setContext(e,i),this.setTransform(e),e.save(),e.beginPath(),this.buildLinePath(e,i),e.stroke(),e.restore(),this.brushSymbol(e,i),e.restore()},buildLinePath:function(e,t){var i=t.x,n=t.y+5,o=t.width,r=t.height/2-10;if(e.moveTo(i,n),e.lineTo(i,n+r),e.moveTo(i+o,n),e.lineTo(i+o,n+r),e.moveTo(i,n+r/2),t.lineType&&"solid"!=t.lineType){if("dashed"==t.lineType||"dotted"==t.lineType){var s=(t.lineWidth||1)*("dashed"==t.lineType?5:1);a(e,i,n+r/2,i+o,n+r/2,s)}}else e.lineTo(i+o,n+r/2)},brushSymbol:function(e,t){var i=t.y+t.height/4;e.save();for(var a,o=t.chainPoint,r=0,s=o.length;s>r;r++){if(a=o[r],"none"!=a.symbol){e.beginPath();var l=a.symbolSize;n.prototype.buildPath(e,{iconType:a.symbol,x:a.x-l,y:i-l,width:2*l,height:2*l,n:a.n}),e.fillStyle=a.isEmpty?"#fff":t.strokeColor,e.closePath(),e.fill(),e.stroke()}a.showLabel&&(e.font=a.textFont,e.fillStyle=a.textColor,e.textAlign=a.textAlign,e.textBaseline=a.textBaseline,a.rotation?(e.save(),this._updateTextTransform(e,a.rotation),e.fillText(a.name,a.textX,a.textY),e.restore()):e.fillText(a.name,a.textX,a.textY))}e.restore()},_updateTextTransform:function(e,t){var i=r.create();if(r.identity(i),0!==t[0]){var n=t[1]||0,a=t[2]||0;(n||a)&&r.translate(i,i,[-n,-a]),r.rotate(i,i,t[0]),(n||a)&&r.translate(i,i,[n,a])}e.transform.apply(e,i)},isCover:function(e,t){var i=this.style;return e>=i.x&&e<=i.x+i.width&&t>=i.y&&t<=i.y+i.height?!0:!1}},o.inherits(t,i),t}),i("zrender/shape/Ring",["require","./Base","../tool/util"],function(e){var t=e("./Base"),i=function(e){t.call(this,e)};return i.prototype={type:"ring",buildPath:function(e,t){e.arc(t.x,t.y,t.r,0,2*Math.PI,!1),e.moveTo(t.x+t.r0,t.y),e.arc(t.x,t.y,t.r0,0,2*Math.PI,!0)},getRect:function(e){if(e.__rect)return e.__rect;var t;return t="stroke"==e.brushType||"fill"==e.brushType?e.lineWidth||1:0,e.__rect={x:Math.round(e.x-e.r-t/2),y:Math.round(e.y-e.r-t/2),width:2*e.r+t,height:2*e.r+t},e.__rect}},e("../tool/util").inherits(i,t),i}),i("echarts/component/axis",["require","./base","zrender/shape/Line","../config","../util/ecData","zrender/tool/util","zrender/tool/color","./categoryAxis","./valueAxis","../component"],function(e){function t(e,t,n,a,o,r){i.call(this,e,t,n,a,o),this.axisType=r,this._axisList=[],this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Line"),a=e("../config"),o=e("../util/ecData"),r=e("zrender/tool/util"),s=e("zrender/tool/color");return t.prototype={type:a.COMPONENT_TYPE_AXIS,axisBase:{_buildAxisLine:function(){var e=this.option.axisLine.lineStyle.width,t=e/2,i={_axisShape:"axisLine",zlevel:this.getZlevelBase(),z:this.getZBase()+3,hoverable:!1},a=this.grid;switch(this.option.position){case"left":i.style={xStart:a.getX()-t,yStart:a.getYend(),xEnd:a.getX()-t,yEnd:a.getY(),lineCap:"round"};break;case"right":i.style={xStart:a.getXend()+t,yStart:a.getYend(),xEnd:a.getXend()+t,yEnd:a.getY(),lineCap:"round"};break;case"bottom":i.style={xStart:a.getX(),yStart:a.getYend()+t,xEnd:a.getXend(),yEnd:a.getYend()+t,lineCap:"round"};break;case"top":i.style={xStart:a.getX(),yStart:a.getY()-t,xEnd:a.getXend(),yEnd:a.getY()-t,lineCap:"round"}}var o=i.style;""!==this.option.name&&(o.text=this.option.name,o.textPosition=this.option.nameLocation,o.textFont=this.getFont(this.option.nameTextStyle),this.option.nameTextStyle.align&&(o.textAlign=this.option.nameTextStyle.align),this.option.nameTextStyle.baseline&&(o.textBaseline=this.option.nameTextStyle.baseline),this.option.nameTextStyle.color&&(o.textColor=this.option.nameTextStyle.color)),o.strokeColor=this.option.axisLine.lineStyle.color,o.lineWidth=e,this.isHorizontal()?o.yStart=o.yEnd=this.subPixelOptimize(o.yEnd,e):o.xStart=o.xEnd=this.subPixelOptimize(o.xEnd,e),o.lineType=this.option.axisLine.lineStyle.type,i=new n(i),this.shapeList.push(i)},_axisLabelClickable:function(e,t){return e?(o.pack(t,void 0,-1,void 0,-1,t.style.text),t.hoverable=!0,t.clickable=!0,t.highlightStyle={color:s.lift(t.style.color,1),brushType:"fill"},t):t},refixAxisShape:function(e,t){if(this.option.axisLine.onZero){var i;if(this.isHorizontal()&&null!=t)for(var n=0,a=this.shapeList.length;a>n;n++)"axisLine"===this.shapeList[n]._axisShape?(this.shapeList[n].style.yStart=this.shapeList[n].style.yEnd=this.subPixelOptimize(t,this.shapeList[n].stylelineWidth),this.zr.modShape(this.shapeList[n].id)):"axisTick"===this.shapeList[n]._axisShape&&(i=this.shapeList[n].style.yEnd-this.shapeList[n].style.yStart,this.shapeList[n].style.yStart=t-i,this.shapeList[n].style.yEnd=t,this.zr.modShape(this.shapeList[n].id));if(!this.isHorizontal()&&null!=e)for(var n=0,a=this.shapeList.length;a>n;n++)"axisLine"===this.shapeList[n]._axisShape?(this.shapeList[n].style.xStart=this.shapeList[n].style.xEnd=this.subPixelOptimize(e,this.shapeList[n].stylelineWidth),this.zr.modShape(this.shapeList[n].id)):"axisTick"===this.shapeList[n]._axisShape&&(i=this.shapeList[n].style.xEnd-this.shapeList[n].style.xStart,this.shapeList[n].style.xStart=e,this.shapeList[n].style.xEnd=e+i,this.zr.modShape(this.shapeList[n].id))}},getPosition:function(){return this.option.position},isHorizontal:function(){return"bottom"===this.option.position||"top"===this.option.position}},reformOption:function(e){if(!e||e instanceof Array&&0===e.length?e=[{type:a.COMPONENT_TYPE_AXIS_VALUE}]:e instanceof Array||(e=[e]),e.length>2&&(e=[e[0],e[1]]),"xAxis"===this.axisType){(!e[0].position||"bottom"!=e[0].position&&"top"!=e[0].position)&&(e[0].position="bottom"),e.length>1&&(e[1].position="bottom"===e[0].position?"top":"bottom");for(var t=0,i=e.length;i>t;t++)e[t].type=e[t].type||"category",e[t].xAxisIndex=t,e[t].yAxisIndex=-1}else{(!e[0].position||"left"!=e[0].position&&"right"!=e[0].position)&&(e[0].position="left"),e.length>1&&(e[1].position="left"===e[0].position?"right":"left");for(var t=0,i=e.length;i>t;t++)e[t].type=e[t].type||"value",e[t].xAxisIndex=-1,e[t].yAxisIndex=t}return e},refresh:function(t){var i;t&&(this.option=t,"xAxis"===this.axisType?(this.option.xAxis=this.reformOption(t.xAxis),i=this.option.xAxis):(this.option.yAxis=this.reformOption(t.yAxis),i=this.option.yAxis),this.series=t.series);for(var n=e("./categoryAxis"),a=e("./valueAxis"),o=Math.max(i&&i.length||0,this._axisList.length),r=0;o>r;r++)!this._axisList[r]||!t||i[r]&&this._axisList[r].type==i[r].type||(this._axisList[r].dispose&&this._axisList[r].dispose(),this._axisList[r]=!1),this._axisList[r]?this._axisList[r].refresh&&this._axisList[r].refresh(i?i[r]:!1,this.series):i&&i[r]&&(this._axisList[r]="category"===i[r].type?new n(this.ecTheme,this.messageCenter,this.zr,i[r],this.myChart,this.axisBase):new a(this.ecTheme,this.messageCenter,this.zr,i[r],this.myChart,this.axisBase,this.series))},getAxis:function(e){return this._axisList[e]},getAxisCount:function(){return this._axisList.length},clear:function(){for(var e=0,t=this._axisList.length;t>e;e++)this._axisList[e].dispose&&this._axisList[e].dispose();this._axisList=[]}},r.inherits(t,i),e("../component").define("axis",t),t}),i("echarts/component/grid",["require","./base","zrender/shape/Rectangle","../config","zrender/tool/util","../component"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Rectangle"),a=e("../config");a.grid={zlevel:0,z:0,x:80,y:60,x2:80,y2:60,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"};var o=e("zrender/tool/util");return t.prototype={type:a.COMPONENT_TYPE_GRID,getX:function(){return this._x},getY:function(){return this._y},getWidth:function(){return this._width},getHeight:function(){return this._height},getXend:function(){return this._x+this._width},getYend:function(){return this._y+this._height},getArea:function(){return{x:this._x,y:this._y,width:this._width,height:this._height}},getBbox:function(){return[[this._x,this._y],[this.getXend(),this.getYend()]]},refixAxisShape:function(e){for(var t,i,n,o=e.xAxis._axisList.concat(e.yAxis?e.yAxis._axisList:[]),r=o.length;r--;)n=o[r],n.type==a.COMPONENT_TYPE_AXIS_VALUE&&n._min<0&&n._max>=0&&(n.isHorizontal()?t=n.getCoord(0):i=n.getCoord(0));if("undefined"!=typeof t||"undefined"!=typeof i)for(r=o.length;r--;)o[r].refixAxisShape(t,i)},refresh:function(e){if(e||this._zrWidth!=this.zr.getWidth()||this._zrHeight!=this.zr.getHeight()){this.clear(),this.option=e||this.option,this.option.grid=this.reformOption(this.option.grid);var t=this.option.grid;this._zrWidth=this.zr.getWidth(),this._zrHeight=this.zr.getHeight(),this._x=this.parsePercent(t.x,this._zrWidth),this._y=this.parsePercent(t.y,this._zrHeight);var i=this.parsePercent(t.x2,this._zrWidth),a=this.parsePercent(t.y2,this._zrHeight);this._width="undefined"==typeof t.width?this._zrWidth-this._x-i:this.parsePercent(t.width,this._zrWidth),this._width=this._width<=0?10:this._width,this._height="undefined"==typeof t.height?this._zrHeight-this._y-a:this.parsePercent(t.height,this._zrHeight),this._height=this._height<=0?10:this._height,this._x=this.subPixelOptimize(this._x,t.borderWidth),this._y=this.subPixelOptimize(this._y,t.borderWidth),this.shapeList.push(new n({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._x,y:this._y,width:this._width,height:this._height,brushType:t.borderWidth>0?"both":"fill",color:t.backgroundColor,strokeColor:t.borderColor,lineWidth:t.borderWidth}})),this.zr.addShape(this.shapeList[0])}}},o.inherits(t,i),e("../component").define("grid",t),t}),i("echarts/component/dataZoom",["require","./base","zrender/shape/Rectangle","zrender/shape/Polygon","../util/shape/Icon","../config","../util/date","zrender/tool/util","../component"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o);var r=this;r._ondrift=function(e,t){return r.__ondrift(this,e,t)},r._ondragend=function(){return r.__ondragend()},this._fillerSize=30,this._isSilence=!1,this._zoom={},this.option.dataZoom=this.reformOption(this.option.dataZoom),this.zoomOption=this.option.dataZoom,this._handleSize=this.zoomOption.handleSize,this.myChart.canvasSupported||(this.zoomOption.realtime=!1),this._location=this._getLocation(),this._zoom=this._getZoom(),this._backupData(),this.option.dataZoom.show&&this._buildShape(),this._syncData()}var i=e("./base"),n=e("zrender/shape/Rectangle"),a=e("zrender/shape/Polygon"),o=e("../util/shape/Icon"),r=e("../config");r.dataZoom={zlevel:0,z:4,show:!1,orient:"horizontal",backgroundColor:"rgba(0,0,0,0)",dataBackgroundColor:"#eee",fillerColor:"rgba(144,197,237,0.2)",handleColor:"rgba(70,130,180,0.8)",handleSize:8,showDetail:!0,realtime:!0};var s=e("../util/date"),l=e("zrender/tool/util");return t.prototype={type:r.COMPONENT_TYPE_DATAZOOM,_buildShape:function(){this._buildBackground(),this._buildFiller(),this._buildHandle(),this._buildFrame();for(var e=0,t=this.shapeList.length;t>e;e++)this.zr.addShape(this.shapeList[e]);this._syncFrameShape()},_getLocation:function(){var e,t,i,n,a=this.component.grid;return"horizontal"==this.zoomOption.orient?(i=this.zoomOption.width||a.getWidth(),n=this.zoomOption.height||this._fillerSize,e=null!=this.zoomOption.x?this.zoomOption.x:a.getX(),t=null!=this.zoomOption.y?this.zoomOption.y:this.zr.getHeight()-n-2):(i=this.zoomOption.width||this._fillerSize,n=this.zoomOption.height||a.getHeight(),e=null!=this.zoomOption.x?this.zoomOption.x:2,t=null!=this.zoomOption.y?this.zoomOption.y:a.getY()),{x:e,y:t,width:i,height:n}},_getZoom:function(){var e=this.option.series,t=this.option.xAxis;!t||t instanceof Array||(t=[t],this.option.xAxis=t);var i=this.option.yAxis;!i||i instanceof Array||(i=[i],this.option.yAxis=i);var n,a,o=[],s=this.zoomOption.xAxisIndex;if(t&&null==s){n=[];for(var l=0,h=t.length;h>l;l++)("category"==t[l].type||null==t[l].type)&&n.push(l)}else n=s instanceof Array?s:null!=s?[s]:[];if(s=this.zoomOption.yAxisIndex,i&&null==s){a=[];for(var l=0,h=i.length;h>l;l++)"category"==i[l].type&&a.push(l)}else a=s instanceof Array?s:null!=s?[s]:[];for(var m,l=0,h=e.length;h>l;l++)if(m=e[l],m.type==r.CHART_TYPE_LINE||m.type==r.CHART_TYPE_BAR||m.type==r.CHART_TYPE_SCATTER||m.type==r.CHART_TYPE_K){for(var V=0,U=n.length;U>V;V++)if(n[V]==(m.xAxisIndex||0)){o.push(l);break}for(var V=0,U=a.length;U>V;V++)if(a[V]==(m.yAxisIndex||0)){o.push(l);break}null==this.zoomOption.xAxisIndex&&null==this.zoomOption.yAxisIndex&&m.data&&this.getDataFromOption(m.data[0])instanceof Array&&(m.type==r.CHART_TYPE_SCATTER||m.type==r.CHART_TYPE_LINE||m.type==r.CHART_TYPE_BAR)&&o.push(l)}var d=null!=this._zoom.start?this._zoom.start:null!=this.zoomOption.start?this.zoomOption.start:0,p=null!=this._zoom.end?this._zoom.end:null!=this.zoomOption.end?this.zoomOption.end:100;d>p&&(d+=p,p=d-p,d-=p);var c=Math.round((p-d)/100*("horizontal"==this.zoomOption.orient?this._location.width:this._location.height));return{start:d,end:p,start2:0,end2:100,size:c,xAxisIndex:n,yAxisIndex:a,seriesIndex:o,scatterMap:this._zoom.scatterMap||{}}},_backupData:function(){this._originalData={xAxis:{},yAxis:{},series:{}};for(var e=this.option.xAxis,t=this._zoom.xAxisIndex,i=0,n=t.length;n>i;i++)this._originalData.xAxis[t[i]]=e[t[i]].data;for(var a=this.option.yAxis,o=this._zoom.yAxisIndex,i=0,n=o.length;n>i;i++)this._originalData.yAxis[o[i]]=a[o[i]].data;for(var s,l=this.option.series,h=this._zoom.seriesIndex,i=0,n=h.length;n>i;i++)s=l[h[i]],this._originalData.series[h[i]]=s.data,s.data&&this.getDataFromOption(s.data[0])instanceof Array&&(s.type==r.CHART_TYPE_SCATTER||s.type==r.CHART_TYPE_LINE||s.type==r.CHART_TYPE_BAR)&&(this._backupScale(),this._calculScatterMap(h[i]))},_calculScatterMap:function(t){this._zoom.scatterMap=this._zoom.scatterMap||{},this._zoom.scatterMap[t]=this._zoom.scatterMap[t]||{};var i=e("../component"),n=i.get("axis"),a=l.clone(this.option.xAxis);"category"==a[0].type&&(a[0].type="value"),a[1]&&"category"==a[1].type&&(a[1].type="value");var o=new n(this.ecTheme,null,!1,{xAxis:a,series:this.option.series},this,"xAxis"),r=this.option.series[t].xAxisIndex||0;this._zoom.scatterMap[t].x=o.getAxis(r).getExtremum(),o.dispose(),a=l.clone(this.option.yAxis),"category"==a[0].type&&(a[0].type="value"),a[1]&&"category"==a[1].type&&(a[1].type="value"),o=new n(this.ecTheme,null,!1,{yAxis:a,series:this.option.series},this,"yAxis"),r=this.option.series[t].yAxisIndex||0,this._zoom.scatterMap[t].y=o.getAxis(r).getExtremum(),o.dispose()},_buildBackground:function(){var e=this._location.width,t=this._location.height;this.shapeList.push(new n({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._location.x,y:this._location.y,width:e,height:t,color:this.zoomOption.backgroundColor}}));for(var i=0,o=this._originalData.xAxis,s=this._zoom.xAxisIndex,l=0,h=s.length;h>l;l++)i=Math.max(i,o[s[l]].length);for(var m=this._originalData.yAxis,V=this._zoom.yAxisIndex,l=0,h=V.length;h>l;l++)i=Math.max(i,m[V[l]].length);for(var U,d=this._zoom.seriesIndex[0],p=this._originalData.series[d],c=Number.MIN_VALUE,u=Number.MAX_VALUE,l=0,h=p.length;h>l;l++)U=this.getDataFromOption(p[l],0),this.option.series[d].type==r.CHART_TYPE_K&&(U=U[1]),isNaN(U)&&(U=0),c=Math.max(c,U),u=Math.min(u,U);var y=c-u,g=[],b=e/(i-(i>1?1:0)),f=t/(i-(i>1?1:0)),k=1;"horizontal"==this.zoomOption.orient&&1>b?k=Math.floor(3*i/e):"vertical"==this.zoomOption.orient&&1>f&&(k=Math.floor(3*i/t));for(var l=0,h=i;h>l;l+=k)U=this.getDataFromOption(p[l],0),this.option.series[d].type==r.CHART_TYPE_K&&(U=U[1]),isNaN(U)&&(U=0),g.push("horizontal"==this.zoomOption.orient?[this._location.x+b*l,this._location.y+t-1-Math.round((U-u)/y*(t-10))]:[this._location.x+1+Math.round((U-u)/y*(e-10)),this._location.y+f*(h-l-1)]);"horizontal"==this.zoomOption.orient?(g.push([this._location.x+e,this._location.y+t]),g.push([this._location.x,this._location.y+t])):(g.push([this._location.x,this._location.y]),g.push([this._location.x,this._location.y+t])),this.shapeList.push(new a({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{pointList:g,color:this.zoomOption.dataBackgroundColor},hoverable:!1}))},_buildFiller:function(){this._fillerShae={zlevel:this.getZlevelBase(),z:this.getZBase(),draggable:!0,ondrift:this._ondrift,ondragend:this._ondragend,_type:"filler"},this._fillerShae.style="horizontal"==this.zoomOption.orient?{x:this._location.x+Math.round(this._zoom.start/100*this._location.width)+this._handleSize,y:this._location.y,width:this._zoom.size-2*this._handleSize,height:this._location.height,color:this.zoomOption.fillerColor,text:":::",textPosition:"inside"}:{x:this._location.x,y:this._location.y+Math.round(this._zoom.start/100*this._location.height)+this._handleSize,width:this._location.width,height:this._zoom.size-2*this._handleSize,color:this.zoomOption.fillerColor,text:"::",textPosition:"inside"},this._fillerShae.highlightStyle={brushType:"fill",color:"rgba(0,0,0,0)"},this._fillerShae=new n(this._fillerShae),this.shapeList.push(this._fillerShae)},_buildHandle:function(){var e=this.zoomOption.showDetail?this._getDetail():{start:"",end:""};this._startShape={zlevel:this.getZlevelBase(),z:this.getZBase(),draggable:!0,style:{iconType:"rectangle",x:this._location.x,y:this._location.y,width:this._handleSize,height:this._handleSize,color:this.zoomOption.handleColor,text:"=",textPosition:"inside"},highlightStyle:{text:e.start,brushType:"fill",textPosition:"left"},ondrift:this._ondrift,ondragend:this._ondragend},"horizontal"==this.zoomOption.orient?(this._startShape.style.height=this._location.height,this._endShape=l.clone(this._startShape),this._startShape.style.x=this._fillerShae.style.x-this._handleSize,this._endShape.style.x=this._fillerShae.style.x+this._fillerShae.style.width,this._endShape.highlightStyle.text=e.end,this._endShape.highlightStyle.textPosition="right"):(this._startShape.style.width=this._location.width,this._endShape=l.clone(this._startShape),this._startShape.style.y=this._fillerShae.style.y+this._fillerShae.style.height,this._startShape.highlightStyle.textPosition="bottom",this._endShape.style.y=this._fillerShae.style.y-this._handleSize,this._endShape.highlightStyle.text=e.end,this._endShape.highlightStyle.textPosition="top"),this._startShape=new o(this._startShape),this._endShape=new o(this._endShape),this.shapeList.push(this._startShape),this.shapeList.push(this._endShape)},_buildFrame:function(){var e=this.subPixelOptimize(this._location.x,1),t=this.subPixelOptimize(this._location.y,1);this._startFrameShape={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:e,y:t,width:this._location.width-(e>this._location.x?1:0),height:this._location.height-(t>this._location.y?1:0),lineWidth:1,brushType:"stroke",strokeColor:this.zoomOption.handleColor}},this._endFrameShape=l.clone(this._startFrameShape),this._startFrameShape=new n(this._startFrameShape),this._endFrameShape=new n(this._endFrameShape),this.shapeList.push(this._startFrameShape),this.shapeList.push(this._endFrameShape)},_syncHandleShape:function(){"horizontal"==this.zoomOption.orient?(this._startShape.style.x=this._fillerShae.style.x-this._handleSize,this._endShape.style.x=this._fillerShae.style.x+this._fillerShae.style.width,this._zoom.start=(this._startShape.style.x-this._location.x)/this._location.width*100,this._zoom.end=(this._endShape.style.x+this._handleSize-this._location.x)/this._location.width*100):(this._startShape.style.y=this._fillerShae.style.y+this._fillerShae.style.height,this._endShape.style.y=this._fillerShae.style.y-this._handleSize,this._zoom.start=(this._location.y+this._location.height-this._startShape.style.y)/this._location.height*100,this._zoom.end=(this._location.y+this._location.height-this._endShape.style.y-this._handleSize)/this._location.height*100),this.zr.modShape(this._startShape.id),this.zr.modShape(this._endShape.id),this._syncFrameShape(),this.zr.refreshNextFrame()},_syncFillerShape:function(){var e,t;"horizontal"==this.zoomOption.orient?(e=this._startShape.style.x,t=this._endShape.style.x,this._fillerShae.style.x=Math.min(e,t)+this._handleSize,this._fillerShae.style.width=Math.abs(e-t)-this._handleSize,this._zoom.start=(Math.min(e,t)-this._location.x)/this._location.width*100,this._zoom.end=(Math.max(e,t)+this._handleSize-this._location.x)/this._location.width*100):(e=this._startShape.style.y,t=this._endShape.style.y,this._fillerShae.style.y=Math.min(e,t)+this._handleSize,this._fillerShae.style.height=Math.abs(e-t)-this._handleSize,this._zoom.start=(this._location.y+this._location.height-Math.max(e,t))/this._location.height*100,this._zoom.end=(this._location.y+this._location.height-Math.min(e,t)-this._handleSize)/this._location.height*100),this.zr.modShape(this._fillerShae.id),this._syncFrameShape(),this.zr.refreshNextFrame()},_syncFrameShape:function(){"horizontal"==this.zoomOption.orient?(this._startFrameShape.style.width=this._fillerShae.style.x-this._location.x,this._endFrameShape.style.x=this._fillerShae.style.x+this._fillerShae.style.width,this._endFrameShape.style.width=this._location.x+this._location.width-this._endFrameShape.style.x):(this._startFrameShape.style.y=this._fillerShae.style.y+this._fillerShae.style.height,this._startFrameShape.style.height=this._location.y+this._location.height-this._startFrameShape.style.y,this._endFrameShape.style.height=this._fillerShae.style.y-this._location.y),this.zr.modShape(this._startFrameShape.id),this.zr.modShape(this._endFrameShape.id)},_syncShape:function(){this.zoomOption.show&&("horizontal"==this.zoomOption.orient?(this._startShape.style.x=this._location.x+this._zoom.start/100*this._location.width,this._endShape.style.x=this._location.x+this._zoom.end/100*this._location.width-this._handleSize,this._fillerShae.style.x=this._startShape.style.x+this._handleSize,this._fillerShae.style.width=this._endShape.style.x-this._startShape.style.x-this._handleSize):(this._startShape.style.y=this._location.y+this._location.height-this._zoom.start/100*this._location.height,this._endShape.style.y=this._location.y+this._location.height-this._zoom.end/100*this._location.height-this._handleSize,this._fillerShae.style.y=this._endShape.style.y+this._handleSize,this._fillerShae.style.height=this._startShape.style.y-this._endShape.style.y-this._handleSize),this.zr.modShape(this._startShape.id),this.zr.modShape(this._endShape.id),this.zr.modShape(this._fillerShae.id),this._syncFrameShape(),this.zr.refresh())},_syncData:function(e){var t,i,n,a,o;for(var s in this._originalData){t=this._originalData[s];for(var l in t)o=t[l],null!=o&&(a=o.length,i=Math.floor(this._zoom.start/100*a),n=Math.ceil(this._zoom.end/100*a),this.getDataFromOption(o[0])instanceof Array&&this.option[s][l].type!=r.CHART_TYPE_K?(this._setScale(),this.option[s][l].data=this._synScatterData(l,o)):this.option[s][l].data=o.slice(i,n))}this._isSilence||!this.zoomOption.realtime&&!e||this.messageCenter.dispatch(r.EVENT.DATA_ZOOM,null,{zoom:this._zoom},this.myChart)},_synScatterData:function(e,t){if(0===this._zoom.start&&100==this._zoom.end&&0===this._zoom.start2&&100==this._zoom.end2)return t;var i,n,a,o,r,s=[],l=this._zoom.scatterMap[e]; + +"horizontal"==this.zoomOption.orient?(i=l.x.max-l.x.min,n=this._zoom.start/100*i+l.x.min,a=this._zoom.end/100*i+l.x.min,i=l.y.max-l.y.min,o=this._zoom.start2/100*i+l.y.min,r=this._zoom.end2/100*i+l.y.min):(i=l.x.max-l.x.min,n=this._zoom.start2/100*i+l.x.min,a=this._zoom.end2/100*i+l.x.min,i=l.y.max-l.y.min,o=this._zoom.start/100*i+l.y.min,r=this._zoom.end/100*i+l.y.min);var h;(h=l.x.dataMappingMethods)&&(n=h.coord2Value(n),a=h.coord2Value(a)),(h=l.y.dataMappingMethods)&&(o=h.coord2Value(o),r=h.coord2Value(r));for(var m,V=0,U=t.length;U>V;V++)m=t[V].value||t[V],m[0]>=n&&m[0]<=a&&m[1]>=o&&m[1]<=r&&s.push(t[V]);return s},_setScale:function(){var e=0!==this._zoom.start||100!==this._zoom.end||0!==this._zoom.start2||100!==this._zoom.end2,t={xAxis:this.option.xAxis,yAxis:this.option.yAxis};for(var i in t)for(var n=0,a=t[i].length;a>n;n++)t[i][n].scale=e||t[i][n]._scale},_backupScale:function(){var e={xAxis:this.option.xAxis,yAxis:this.option.yAxis};for(var t in e)for(var i=0,n=e[t].length;n>i;i++)e[t][i]._scale=e[t][i].scale},_getDetail:function(){for(var e=["xAxis","yAxis"],t=0,i=e.length;i>t;t++){var n=this._originalData[e[t]];for(var a in n){var o=n[a];if(null!=o){var r=o.length,l=Math.floor(this._zoom.start/100*r),h=Math.ceil(this._zoom.end/100*r);return h-=h>0?1:0,{start:this.getDataFromOption(o[l]),end:this.getDataFromOption(o[h])}}}}e="horizontal"==this.zoomOption.orient?"xAxis":"yAxis";var m=this._zoom.seriesIndex[0],V=this.option.series[m][e+"Index"]||0,U=this.option[e][V].type,d=this._zoom.scatterMap[m][e.charAt(0)].min,p=this._zoom.scatterMap[m][e.charAt(0)].max,c=p-d;if("value"==U)return{start:d+c*this._zoom.start/100,end:d+c*this._zoom.end/100};if("time"==U){p=d+c*this._zoom.end/100,d+=c*this._zoom.start/100;var u=s.getAutoFormatter(d,p).formatter;return{start:s.format(u,d),end:s.format(u,p)}}return{start:"",end:""}},__ondrift:function(e,t,i){this.zoomOption.zoomLock&&(e=this._fillerShae);var n="filler"==e._type?this._handleSize:0;if("horizontal"==this.zoomOption.orient?e.style.x+t-n<=this._location.x?e.style.x=this._location.x+n:e.style.x+t+e.style.width+n>=this._location.x+this._location.width?e.style.x=this._location.x+this._location.width-e.style.width-n:e.style.x+=t:e.style.y+i-n<=this._location.y?e.style.y=this._location.y+n:e.style.y+i+e.style.height+n>=this._location.y+this._location.height?e.style.y=this._location.y+this._location.height-e.style.height-n:e.style.y+=i,"filler"==e._type?this._syncHandleShape():this._syncFillerShape(),this.zoomOption.realtime&&this._syncData(),this.zoomOption.showDetail){var a=this._getDetail();this._startShape.style.text=this._startShape.highlightStyle.text=a.start,this._endShape.style.text=this._endShape.highlightStyle.text=a.end,this._startShape.style.textPosition=this._startShape.highlightStyle.textPosition,this._endShape.style.textPosition=this._endShape.highlightStyle.textPosition}return!0},__ondragend:function(){this.zoomOption.showDetail&&(this._startShape.style.text=this._endShape.style.text="=",this._startShape.style.textPosition=this._endShape.style.textPosition="inside",this.zr.modShape(this._startShape.id),this.zr.modShape(this._endShape.id),this.zr.refreshNextFrame()),this.isDragend=!0},ondragend:function(e,t){this.isDragend&&e.target&&(!this.zoomOption.realtime&&this._syncData(),t.dragOut=!0,t.dragIn=!0,this._isSilence||this.zoomOption.realtime||this.messageCenter.dispatch(r.EVENT.DATA_ZOOM,null,{zoom:this._zoom},this.myChart),t.needRefresh=!1,this.isDragend=!1)},ondataZoom:function(e,t){t.needRefresh=!0},absoluteZoom:function(e){this._zoom.start=e.start,this._zoom.end=e.end,this._zoom.start2=e.start2,this._zoom.end2=e.end2,this._syncShape(),this._syncData(!0)},rectZoom:function(e){if(!e)return this._zoom.start=this._zoom.start2=0,this._zoom.end=this._zoom.end2=100,this._syncShape(),this._syncData(!0),this._zoom;var t=this.component.grid.getArea(),i={x:e.x,y:e.y,width:e.width,height:e.height};if(i.width<0&&(i.x+=i.width,i.width=-i.width),i.height<0&&(i.y+=i.height,i.height=-i.height),i.x>t.x+t.width||i.y>t.y+t.height)return!1;i.xt.x+t.width&&(i.width=t.x+t.width-i.x),i.y+i.height>t.y+t.height&&(i.height=t.y+t.height-i.y);var n,a=(i.x-t.x)/t.width,o=1-(i.x+i.width-t.x)/t.width,r=1-(i.y+i.height-t.y)/t.height,s=(i.y-t.y)/t.height;return"horizontal"==this.zoomOption.orient?(n=this._zoom.end-this._zoom.start,this._zoom.start+=n*a,this._zoom.end-=n*o,n=this._zoom.end2-this._zoom.start2,this._zoom.start2+=n*r,this._zoom.end2-=n*s):(n=this._zoom.end-this._zoom.start,this._zoom.start+=n*r,this._zoom.end-=n*s,n=this._zoom.end2-this._zoom.start2,this._zoom.start2+=n*a,this._zoom.end2-=n*o),this._syncShape(),this._syncData(!0),this._zoom},syncBackupData:function(e){for(var t,i,n=this._originalData.series,a=e.series,o=0,r=a.length;r>o;o++){i=a[o].data||a[o].eventList,t=n[o]?Math.floor(this._zoom.start/100*n[o].length):0;for(var s=0,l=i.length;l>s;s++)n[o]&&(n[o][s+t]=i[s])}},syncOption:function(e){this.silence(!0),this.option=e,this.option.dataZoom=this.reformOption(this.option.dataZoom),this.zoomOption=this.option.dataZoom,this.myChart.canvasSupported||(this.zoomOption.realtime=!1),this.clear(),this._location=this._getLocation(),this._zoom=this._getZoom(),this._backupData(),this.option.dataZoom&&this.option.dataZoom.show&&this._buildShape(),this._syncData(),this.silence(!1)},silence:function(e){this._isSilence=e},getRealDataIndex:function(e,t){if(!this._originalData||0===this._zoom.start&&100==this._zoom.end)return t;var i=this._originalData.series;return i[e]?Math.floor(this._zoom.start/100*i[e].length)+t:-1},resize:function(){this.clear(),this._location=this._getLocation(),this._zoom=this._getZoom(),this.option.dataZoom.show&&this._buildShape()}},l.inherits(t,i),e("../component").define("dataZoom",t),t}),i("echarts/component/categoryAxis",["require","./base","zrender/shape/Text","zrender/shape/Line","zrender/shape/Rectangle","../config","zrender/tool/util","zrender/tool/area","../component"],function(e){function t(e,t,n,a,o,r){if(a.data.length<1)return void console.error("option.data.length < 1.");i.call(this,e,t,n,a,o),this.grid=this.component.grid;for(var s in r)this[s]=r[s];this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Line"),o=e("zrender/shape/Rectangle"),r=e("../config");r.categoryAxis={zlevel:0,z:0,show:!0,position:"bottom",name:"",nameLocation:"end",nameTextStyle:{},boundaryGap:!0,axisLine:{show:!0,onZero:!0,lineStyle:{color:"#48b",width:2,type:"solid"}},axisTick:{show:!0,interval:"auto",inside:!1,length:5,lineStyle:{color:"#333",width:1}},axisLabel:{show:!0,interval:"auto",rotate:0,margin:8,textStyle:{color:"#333"}},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}};var s=e("zrender/tool/util"),l=e("zrender/tool/area");return t.prototype={type:r.COMPONENT_TYPE_AXIS_CATEGORY,_getReformedLabel:function(e){var t=this.getDataFromOption(this.option.data[e]),i=this.option.data[e].formatter||this.option.axisLabel.formatter;return i&&("function"==typeof i?t=i.call(this.myChart,t):"string"==typeof i&&(t=i.replace("{value}",t))),t},_getInterval:function(){var e=this.option.axisLabel.interval;if("auto"==e){var t=this.option.axisLabel.textStyle.fontSize,i=this.option.data,n=this.option.data.length;if(this.isHorizontal())if(n>3){var a,o,r=this.getGap(),h=!1,m=Math.floor(.5/r);for(m=1>m?1:m,e=Math.floor(15/r);!h&&n>e;){e+=m,h=!0,a=Math.floor(r*e);for(var V=Math.floor((n-1)/e)*e;V>=0;V-=e){if(0!==this.option.axisLabel.rotate)o=t;else if(i[V].textStyle)o=l.getTextWidth(this._getReformedLabel(V),this.getFont(s.merge(i[V].textStyle,this.option.axisLabel.textStyle)));else{var U=this._getReformedLabel(V)+"",d=(U.match(/\w/g)||"").length,p=U.length-d;o=d*t*2/3+p*t}if(o>a){h=!1;break}}}}else e=1;else if(n>3){var r=this.getGap();for(e=Math.floor(11/r);t>r*e-6&&n>e;)e++}else e=1}else e="function"==typeof e?1:e-0+1;return e},_buildShape:function(){if(this._interval=this._getInterval(),this.option.show){this.option.splitArea.show&&this._buildSplitArea(),this.option.splitLine.show&&this._buildSplitLine(),this.option.axisLine.show&&this._buildAxisLine(),this.option.axisTick.show&&this._buildAxisTick(),this.option.axisLabel.show&&this._buildAxisLabel();for(var e=0,t=this.shapeList.length;t>e;e++)this.zr.addShape(this.shapeList[e])}},_buildAxisTick:function(){var e,t=this.option.data,i=this.option.data.length,n=this.option.axisTick,o=n.length,r=n.lineStyle.color,s=n.lineStyle.width,l="function"==typeof n.interval?n.interval:"auto"==n.interval&&"function"==typeof this.option.axisLabel.interval?this.option.axisLabel.interval:!1,h=l?1:"auto"==n.interval?this._interval:n.interval-0+1,m=n.onGap,V=m?this.getGap()/2:"undefined"==typeof m&&this.option.boundaryGap?this.getGap()/2:0,U=V>0?-h:0;if(this.isHorizontal())for(var d,p="bottom"==this.option.position?n.inside?this.grid.getYend()-o-1:this.grid.getYend()+1:n.inside?this.grid.getY()+1:this.grid.getY()-o-1,c=U;i>c;c+=h)(!l||l(c,t[c]))&&(d=this.subPixelOptimize(this.getCoordByIndex(c)+(c>=0?V:0),s),e={_axisShape:"axisTick",zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:d,yStart:p,xEnd:d,yEnd:p+o,strokeColor:r,lineWidth:s}},this.shapeList.push(new a(e)));else for(var u,y="left"==this.option.position?n.inside?this.grid.getX()+1:this.grid.getX()-o-1:n.inside?this.grid.getXend()-o-1:this.grid.getXend()+1,c=U;i>c;c+=h)(!l||l(c,t[c]))&&(u=this.subPixelOptimize(this.getCoordByIndex(c)-(c>=0?V:0),s),e={_axisShape:"axisTick",zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:y,yStart:u,xEnd:y+o,yEnd:u,strokeColor:r,lineWidth:s}},this.shapeList.push(new a(e)))},_buildAxisLabel:function(){var e,t,i=this.option.data,a=this.option.data.length,o=this.option.axisLabel,r=o.rotate,l=o.margin,h=o.clickable,m=o.textStyle,V="function"==typeof o.interval?o.interval:!1;if(this.isHorizontal()){var U,d;"bottom"==this.option.position?(U=this.grid.getYend()+l,d="top"):(U=this.grid.getY()-l,d="bottom");for(var p=0;a>p;p+=this._interval)V&&!V(p,i[p])||""===this._getReformedLabel(p)||(t=s.merge(i[p].textStyle||{},m),e={zlevel:this.getZlevelBase(),z:this.getZBase()+3,hoverable:!1,style:{x:this.getCoordByIndex(p),y:U,color:t.color,text:this._getReformedLabel(p),textFont:this.getFont(t),textAlign:t.align||"center",textBaseline:t.baseline||d}},r&&(e.style.textAlign=r>0?"bottom"==this.option.position?"right":"left":"bottom"==this.option.position?"left":"right",e.rotation=[r*Math.PI/180,e.style.x,e.style.y]),this.shapeList.push(new n(this._axisLabelClickable(h,e))))}else{var c,u;"left"==this.option.position?(c=this.grid.getX()-l,u="right"):(c=this.grid.getXend()+l,u="left");for(var p=0;a>p;p+=this._interval)V&&!V(p,i[p])||""===this._getReformedLabel(p)||(t=s.merge(i[p].textStyle||{},m),e={zlevel:this.getZlevelBase(),z:this.getZBase()+3,hoverable:!1,style:{x:c,y:this.getCoordByIndex(p),color:t.color,text:this._getReformedLabel(p),textFont:this.getFont(t),textAlign:t.align||u,textBaseline:t.baseline||0===p&&""!==this.option.name?"bottom":p==a-1&&""!==this.option.name?"top":"middle"}},r&&(e.rotation=[r*Math.PI/180,e.style.x,e.style.y]),this.shapeList.push(new n(this._axisLabelClickable(h,e))))}},_buildSplitLine:function(){var e,t=this.option.data,i=this.option.data.length,n=this.option.splitLine,o=n.lineStyle.type,r=n.lineStyle.width,s=n.lineStyle.color;s=s instanceof Array?s:[s];var l=s.length,h="function"==typeof this.option.axisLabel.interval?this.option.axisLabel.interval:!1,m=n.onGap,V=m?this.getGap()/2:"undefined"==typeof m&&this.option.boundaryGap?this.getGap()/2:0;if(i-=m||"undefined"==typeof m&&this.option.boundaryGap?1:0,this.isHorizontal())for(var U,d=this.grid.getY(),p=this.grid.getYend(),c=0;i>c;c+=this._interval)(!h||h(c,t[c]))&&(U=this.subPixelOptimize(this.getCoordByIndex(c)+V,r),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:U,yStart:d,xEnd:U,yEnd:p,strokeColor:s[c/this._interval%l],lineType:o,lineWidth:r}},this.shapeList.push(new a(e)));else for(var u,y=this.grid.getX(),g=this.grid.getXend(),c=0;i>c;c+=this._interval)(!h||h(c,t[c]))&&(u=this.subPixelOptimize(this.getCoordByIndex(c)-V,r),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:y,yStart:u,xEnd:g,yEnd:u,strokeColor:s[c/this._interval%l],lineType:o,lineWidth:r}},this.shapeList.push(new a(e)))},_buildSplitArea:function(){var e,t=this.option.data,i=this.option.splitArea,n=i.areaStyle.color;if(n instanceof Array){var a=n.length,r=this.option.data.length,s="function"==typeof this.option.axisLabel.interval?this.option.axisLabel.interval:!1,l=i.onGap,h=l?this.getGap()/2:"undefined"==typeof l&&this.option.boundaryGap?this.getGap()/2:0;if(this.isHorizontal())for(var m,V=this.grid.getY(),U=this.grid.getHeight(),d=this.grid.getX(),p=0;r>=p;p+=this._interval)s&&!s(p,t[p])&&r>p||(m=r>p?this.getCoordByIndex(p)+h:this.grid.getXend(),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:d,y:V,width:m-d,height:U,color:n[p/this._interval%a]}},this.shapeList.push(new o(e)),d=m);else for(var c,u=this.grid.getX(),y=this.grid.getWidth(),g=this.grid.getYend(),p=0;r>=p;p+=this._interval)s&&!s(p,t[p])&&r>p||(c=r>p?this.getCoordByIndex(p)-h:this.grid.getY(),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:u,y:c,width:y,height:g-c,color:n[p/this._interval%a]}},this.shapeList.push(new o(e)),g=c)}else e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this.grid.getX(),y:this.grid.getY(),width:this.grid.getWidth(),height:this.grid.getHeight(),color:n}},this.shapeList.push(new o(e))},refresh:function(e){e&&(this.option=this.reformOption(e),this.option.axisLabel.textStyle=this.getTextStyle(this.option.axisLabel.textStyle)),this.clear(),this._buildShape()},getGap:function(){var e=this.option.data.length,t=this.isHorizontal()?this.grid.getWidth():this.grid.getHeight();return this.option.boundaryGap?t/e:t/(e>1?e-1:1)},getCoord:function(e){for(var t=this.option.data,i=t.length,n=this.getGap(),a=this.option.boundaryGap?n/2:0,o=0;i>o;o++){if(this.getDataFromOption(t[o])==e)return a=this.isHorizontal()?this.grid.getX()+a:this.grid.getYend()-a;a+=n}},getCoordByIndex:function(e){if(0>e)return this.isHorizontal()?this.grid.getX():this.grid.getYend();if(e>this.option.data.length-1)return this.isHorizontal()?this.grid.getXend():this.grid.getY();var t=this.getGap(),i=this.option.boundaryGap?t/2:0;return i+=e*t,i=this.isHorizontal()?this.grid.getX()+i:this.grid.getYend()-i},getNameByIndex:function(e){return this.getDataFromOption(this.option.data[e])},getIndexByName:function(e){for(var t=this.option.data,i=t.length,n=0;i>n;n++)if(this.getDataFromOption(t[n])==e)return n;return-1},getValueFromCoord:function(){return""},isMainAxis:function(e){return e%this._interval===0}},s.inherits(t,i),e("../component").define("categoryAxis",t),t}),i("echarts/component/valueAxis",["require","./base","zrender/shape/Text","zrender/shape/Line","zrender/shape/Rectangle","../config","../util/date","zrender/tool/util","../util/smartSteps","../util/accMath","../util/smartLogSteps","../component"],function(e){function t(e,t,n,a,o,r,s){if(!s||0===s.length)return void console.err("option.series.length == 0.");i.call(this,e,t,n,a,o),this.series=s,this.grid=this.component.grid;for(var l in r)this[l]=r[l];this.refresh(a,s)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Line"),o=e("zrender/shape/Rectangle"),r=e("../config");r.valueAxis={zlevel:0,z:0,show:!0,position:"left",name:"",nameLocation:"end",nameTextStyle:{},boundaryGap:[0,0],axisLine:{show:!0,onZero:!0,lineStyle:{color:"#48b",width:2,type:"solid"}},axisTick:{show:!1,inside:!1,length:5,lineStyle:{color:"#333",width:1}},axisLabel:{show:!0,rotate:0,margin:8,textStyle:{color:"#333"}},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}};var s=e("../util/date"),l=e("zrender/tool/util");return t.prototype={type:r.COMPONENT_TYPE_AXIS_VALUE,_buildShape:function(){if(this._hasData=!1,this._calculateValue(),this._hasData&&this.option.show){this.option.splitArea.show&&this._buildSplitArea(),this.option.splitLine.show&&this._buildSplitLine(),this.option.axisLine.show&&this._buildAxisLine(),this.option.axisTick.show&&this._buildAxisTick(),this.option.axisLabel.show&&this._buildAxisLabel();for(var e=0,t=this.shapeList.length;t>e;e++)this.zr.addShape(this.shapeList[e])}},_buildAxisTick:function(){var e,t=this._valueList,i=this._valueList.length,n=this.option.axisTick,o=n.length,r=n.lineStyle.color,s=n.lineStyle.width;if(this.isHorizontal())for(var l,h="bottom"===this.option.position?n.inside?this.grid.getYend()-o-1:this.grid.getYend()+1:n.inside?this.grid.getY()+1:this.grid.getY()-o-1,m=0;i>m;m++)l=this.subPixelOptimize(this.getCoord(t[m]),s),e={_axisShape:"axisTick",zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:l,yStart:h,xEnd:l,yEnd:h+o,strokeColor:r,lineWidth:s}},this.shapeList.push(new a(e));else for(var V,U="left"===this.option.position?n.inside?this.grid.getX()+1:this.grid.getX()-o-1:n.inside?this.grid.getXend()-o-1:this.grid.getXend()+1,m=0;i>m;m++)V=this.subPixelOptimize(this.getCoord(t[m]),s),e={_axisShape:"axisTick",zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:U,yStart:V,xEnd:U+o,yEnd:V,strokeColor:r,lineWidth:s}},this.shapeList.push(new a(e))},_buildAxisLabel:function(){var e,t=this._valueList,i=this._valueList.length,a=this.option.axisLabel.rotate,o=this.option.axisLabel.margin,r=this.option.axisLabel.clickable,s=this.option.axisLabel.textStyle;if(this.isHorizontal()){var l,h;"bottom"===this.option.position?(l=this.grid.getYend()+o,h="top"):(l=this.grid.getY()-o,h="bottom");for(var m=0;i>m;m++)e={zlevel:this.getZlevelBase(),z:this.getZBase()+3,hoverable:!1,style:{x:this.getCoord(t[m]),y:l,color:"function"==typeof s.color?s.color(t[m]):s.color,text:this._valueLabel[m],textFont:this.getFont(s),textAlign:s.align||"center",textBaseline:s.baseline||h}},a&&(e.style.textAlign=a>0?"bottom"===this.option.position?"right":"left":"bottom"===this.option.position?"left":"right",e.rotation=[a*Math.PI/180,e.style.x,e.style.y]),this.shapeList.push(new n(this._axisLabelClickable(r,e)))}else{var V,U;"left"===this.option.position?(V=this.grid.getX()-o,U="right"):(V=this.grid.getXend()+o,U="left");for(var m=0;i>m;m++)e={zlevel:this.getZlevelBase(),z:this.getZBase()+3,hoverable:!1,style:{x:V,y:this.getCoord(t[m]),color:"function"==typeof s.color?s.color(t[m]):s.color,text:this._valueLabel[m],textFont:this.getFont(s),textAlign:s.align||U,textBaseline:s.baseline||(0===m&&""!==this.option.name?"bottom":m===i-1&&""!==this.option.name?"top":"middle")}},a&&(e.rotation=[a*Math.PI/180,e.style.x,e.style.y]),this.shapeList.push(new n(this._axisLabelClickable(r,e)))}},_buildSplitLine:function(){var e,t=this._valueList,i=this._valueList.length,n=this.option.splitLine,o=n.lineStyle.type,r=n.lineStyle.width,s=n.lineStyle.color;s=s instanceof Array?s:[s];var l=s.length;if(this.isHorizontal())for(var h,m=this.grid.getY(),V=this.grid.getYend(),U=0;i>U;U++)h=this.subPixelOptimize(this.getCoord(t[U]),r),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:h,yStart:m,xEnd:h,yEnd:V,strokeColor:s[U%l],lineType:o,lineWidth:r}},this.shapeList.push(new a(e));else for(var d,p=this.grid.getX(),c=this.grid.getXend(),U=0;i>U;U++)d=this.subPixelOptimize(this.getCoord(t[U]),r),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:p,yStart:d,xEnd:c,yEnd:d,strokeColor:s[U%l],lineType:o,lineWidth:r}},this.shapeList.push(new a(e))},_buildSplitArea:function(){var e,t=this.option.splitArea.areaStyle.color;if(t instanceof Array){var i=t.length,n=this._valueList,a=this._valueList.length;if(this.isHorizontal())for(var r,s=this.grid.getY(),l=this.grid.getHeight(),h=this.grid.getX(),m=0;a>=m;m++)r=a>m?this.getCoord(n[m]):this.grid.getXend(),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:h,y:s,width:r-h,height:l,color:t[m%i]}},this.shapeList.push(new o(e)),h=r;else for(var V,U=this.grid.getX(),d=this.grid.getWidth(),p=this.grid.getYend(),m=0;a>=m;m++)V=a>m?this.getCoord(n[m]):this.grid.getY(),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:U,y:V,width:d,height:p-V,color:t[m%i]}},this.shapeList.push(new o(e)),p=V}else e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this.grid.getX(),y:this.grid.getY(),width:this.grid.getWidth(),height:this.grid.getHeight(),color:t}},this.shapeList.push(new o(e))},_calculateValue:function(){if(isNaN(this.option.min-0)||isNaN(this.option.max-0)){for(var e,t,i={},n=this.component.legend,a=0,o=this.series.length;o>a;a++)!(this.series[a].type!=r.CHART_TYPE_LINE&&this.series[a].type!=r.CHART_TYPE_BAR&&this.series[a].type!=r.CHART_TYPE_SCATTER&&this.series[a].type!=r.CHART_TYPE_K&&this.series[a].type!=r.CHART_TYPE_EVENTRIVER||n&&!n.isSelected(this.series[a].name)||(e=this.series[a].xAxisIndex||0,t=this.series[a].yAxisIndex||0,this.option.xAxisIndex!=e&&this.option.yAxisIndex!=t||!this._calculSum(i,a)));var s;for(var a in i){s=i[a];for(var l=0,h=s.length;h>l;l++)if(!isNaN(s[l])){this._hasData=!0,this._min=s[l],this._max=s[l];break}if(this._hasData)break}for(var a in i){s=i[a];for(var l=0,h=s.length;h>l;l++)isNaN(s[l])||(this._min=Math.min(this._min,s[l]),this._max=Math.max(this._max,s[l]))}var m="log"!==this.option.type?this.option.boundaryGap:[0,0],V=Math.abs(this._max-this._min);this._min=isNaN(this.option.min-0)?this._min-Math.abs(V*m[0]):this.option.min-0,this._max=isNaN(this.option.max-0)?this._max+Math.abs(V*m[1]):this.option.max-0,this._min===this._max&&(0===this._max?this._max=1:this._max>0?this._min=this._max/this.option.splitNumber!=null?this.option.splitNumber:5:this._max=this._max/this.option.splitNumber!=null?this.option.splitNumber:5),"time"===this.option.type?this._reformTimeValue():"log"===this.option.type?this._reformLogValue():this._reformValue(this.option.scale)}else this._hasData=!0,this._min=this.option.min-0,this._max=this.option.max-0,"time"===this.option.type?this._reformTimeValue():"log"===this.option.type?this._reformLogValue():this._customerValue()},_calculSum:function(e,t){var i,n,a=this.series[t].name||"kener";if(this.series[t].stack){var o="__Magic_Key_Positive__"+this.series[t].stack,l="__Magic_Key_Negative__"+this.series[t].stack;e[o]=e[o]||[],e[l]=e[l]||[],e[a]=e[a]||[],n=this.series[t].data;for(var h=0,m=n.length;m>h;h++)i=this.getDataFromOption(n[h]),"-"!==i&&(i-=0,i>=0?null!=e[o][h]?e[o][h]+=i:e[o][h]=i:null!=e[l][h]?e[l][h]+=i:e[l][h]=i,this.option.scale&&e[a].push(i))}else if(e[a]=e[a]||[],this.series[t].type!=r.CHART_TYPE_EVENTRIVER){n=this.series[t].data;for(var h=0,m=n.length;m>h;h++)i=this.getDataFromOption(n[h]),this.series[t].type===r.CHART_TYPE_K?(e[a].push(i[0]),e[a].push(i[1]),e[a].push(i[2]),e[a].push(i[3])):i instanceof Array?(-1!=this.option.xAxisIndex&&e[a].push("time"!=this.option.type?i[0]:s.getNewDate(i[0])),-1!=this.option.yAxisIndex&&e[a].push("time"!=this.option.type?i[1]:s.getNewDate(i[1]))):e[a].push(i)}else{n=this.series[t].data;for(var h=0,m=n.length;m>h;h++)for(var V=n[h].evolution,U=0,d=V.length;d>U;U++)e[a].push(s.getNewDate(V[U].time))}},_reformValue:function(t){var i=e("../util/smartSteps"),n=this.option.splitNumber;!t&&this._min>=0&&this._max>=0&&(this._min=0),!t&&this._min<=0&&this._max<=0&&(this._max=0);var a=i(this._min,this._max,n);n=null!=n?n:a.secs,this._min=a.min,this._max=a.max,this._valueList=a.pnts,this._reformLabelData()},_reformTimeValue:function(){var e=null!=this.option.splitNumber?this.option.splitNumber:5,t=s.getAutoFormatter(this._min,this._max,e),i=t.formatter,n=t.gapValue;this._valueList=[s.getNewDate(this._min)];var a;switch(i){case"week":a=s.nextMonday(this._min);break;case"month":a=s.nextNthOnMonth(this._min,1);break;case"quarter":a=s.nextNthOnQuarterYear(this._min,1);break;case"half-year":a=s.nextNthOnHalfYear(this._min,1);break;case"year":a=s.nextNthOnYear(this._min,1);break;default:72e5>=n?a=(Math.floor(this._min/n)+1)*n:(a=s.getNewDate(this._min- -n),a.setHours(6*Math.round(a.getHours()/6)),a.setMinutes(0),a.setSeconds(0))}for(a-this._min=0&&(("month"==i||"quarter"==i||"half-year"==i||"year"==i)&&t.setDate(1),!(this._max-t=a;a++)this._valueList.push(t.accAdd(this._min,t.accMul(n,a)));this._reformLabelData()},_reformLogValue:function(){var t=this.option,i=e("../util/smartLogSteps")({dataMin:this._min,dataMax:this._max,logPositive:t.logPositive,logLabelBase:t.logLabelBase,splitNumber:t.splitNumber});this._min=i.dataMin,this._max=i.dataMax,this._valueList=i.tickList,this._dataMappingMethods=i.dataMappingMethods,this._reformLabelData(i.labelFormatter)},_reformLabelData:function(e){this._valueLabel=[];var t=this.option.axisLabel.formatter;if(t)for(var i=0,n=this._valueList.length;n>i;i++)"function"==typeof t?this._valueLabel.push(e?t.call(this.myChart,this._valueList[i],e):t.call(this.myChart,this._valueList[i])):"string"==typeof t&&this._valueLabel.push(e?s.format(t,this._valueList[i]):t.replace("{value}",this._valueList[i]));else for(var i=0,n=this._valueList.length;n>i;i++)this._valueLabel.push(e?e(this._valueList[i]):this.numAddCommas(this._valueList[i]))},getExtremum:function(){this._calculateValue();var e=this._dataMappingMethods;return{min:this._min,max:this._max,dataMappingMethods:e?l.merge({},e):null}},refresh:function(e,t){e&&(this.option=this.reformOption(e),this.option.axisLabel.textStyle=l.merge(this.option.axisLabel.textStyle||{},this.ecTheme.textStyle),this.series=t),this.zr&&(this.clear(),this._buildShape())},getCoord:function(e){this._dataMappingMethods&&(e=this._dataMappingMethods.value2Coord(e)),e=ethis._max?this._max:e;var t;return t=this.isHorizontal()?this.grid.getX()+(e-this._min)/(this._max-this._min)*this.grid.getWidth():this.grid.getYend()-(e-this._min)/(this._max-this._min)*this.grid.getHeight()},getCoordSize:function(e){return Math.abs(this.isHorizontal()?e/(this._max-this._min)*this.grid.getWidth():e/(this._max-this._min)*this.grid.getHeight())},getValueFromCoord:function(e){var t;return this.isHorizontal()?(e=ethis.grid.getXend()?this.grid.getXend():e,t=this._min+(e-this.grid.getX())/this.grid.getWidth()*(this._max-this._min)):(e=ethis.grid.getYend()?this.grid.getYend():e,t=this._max-(e-this.grid.getY())/this.grid.getHeight()*(this._max-this._min)),this._dataMappingMethods&&(t=this._dataMappingMethods.coord2Value(t)),t.toFixed(2)-0},isMaindAxis:function(e){for(var t=0,i=this._valueList.length;i>t;t++)if(this._valueList[t]===e)return!0;return!1}},l.inherits(t,i),e("../component").define("valueAxis",t),t}),i("echarts/util/date",[],function(){function e(e,t,i){i=i>1?i:2;for(var n,a,o,r,s=0,l=m.length;l>s;s++)if(n=m[s].value,a=Math.ceil(t/n)*n-Math.floor(e/n)*n,Math.round(a/n)<=1.2*i){o=m[s].formatter,r=m[s].value;break}return null==o&&(o="year",n=317088e5,a=Math.ceil(t/n)*n-Math.floor(e/n)*n,r=Math.round(a/(i-1)/n)*n),{formatter:o,gapValue:r}}function t(e){return 10>e?"0"+e:e}function i(e,i){("week"==e||"month"==e||"quarter"==e||"half-year"==e||"year"==e)&&(e="MM - dd\nyyyy");var n=h(i),a=n.getFullYear(),o=n.getMonth()+1,r=n.getDate(),s=n.getHours(),l=n.getMinutes(),m=n.getSeconds();return e=e.replace("MM",t(o)),e=e.toLowerCase(),e=e.replace("yyyy",a),e=e.replace("yy",a%100),e=e.replace("dd",t(r)),e=e.replace("d",r),e=e.replace("hh",t(s)),e=e.replace("h",s),e=e.replace("mm",t(l)),e=e.replace("m",l),e=e.replace("ss",t(m)),e=e.replace("s",m)}function n(e){return e=h(e),e.setDate(e.getDate()+8-e.getDay()),e}function a(e,t,i){return e=h(e),e.setMonth(Math.ceil((e.getMonth()+1)/i)*i),e.setDate(t),e}function o(e,t){return a(e,t,1)}function r(e,t){return a(e,t,3)}function s(e,t){return a(e,t,6)}function l(e,t){return a(e,t,12)}function h(e){return e instanceof Date?e:new Date("string"==typeof e?e.replace(/-/g,"/"):e)}var m=[{formatter:"hh : mm : ss",value:1e3},{formatter:"hh : mm : ss",value:5e3},{formatter:"hh : mm : ss",value:1e4},{formatter:"hh : mm : ss",value:15e3},{formatter:"hh : mm : ss",value:3e4},{formatter:"hh : mm\nMM - dd",value:6e4},{formatter:"hh : mm\nMM - dd",value:3e5},{formatter:"hh : mm\nMM - dd",value:6e5},{formatter:"hh : mm\nMM - dd",value:9e5},{formatter:"hh : mm\nMM - dd",value:18e5},{formatter:"hh : mm\nMM - dd",value:36e5},{formatter:"hh : mm\nMM - dd",value:72e5},{formatter:"hh : mm\nMM - dd",value:216e5},{formatter:"hh : mm\nMM - dd",value:432e5},{formatter:"MM - dd\nyyyy",value:864e5},{formatter:"week",value:6048e5},{formatter:"month",value:26784e5},{formatter:"quarter",value:8208e6},{formatter:"half-year",value:16416e6},{formatter:"year",value:32832e6}];return{getAutoFormatter:e,getNewDate:h,format:i,nextMonday:n,nextNthPerNmonth:a,nextNthOnMonth:o,nextNthOnQuarterYear:r,nextNthOnHalfYear:s,nextNthOnYear:l}}),i("echarts/util/smartSteps",[],function(){function e(e){return X.log(I(e))/X.LN10}function t(e){return X.pow(10,e)}function i(e){return e===w(e)}function n(e,t,n,a){b=a||{},f=b.steps||L,k=b.secs||W,n=v(+n||0)%99,e=+e||0,t=+t||0,x=_=0,"min"in b&&(e=+b.min||0,x=1),"max"in b&&(t=+b.max||0,_=1),e>t&&(t=[e,e=t][0]);var o=t-e;if(x&&_)return g(e,t,n);if((n||5)>o){if(i(e)&&i(t))return d(e,t,n);if(0===o)return p(e,t,n)}return h(e,t,n)}function a(e,i,n,a){a=a||0;var s=o((i-e)/n,-1),l=o(e,-1,1),h=o(i,-1),m=X.min(s.e,l.e,h.e);0===l.c?m=X.min(s.e,h.e):0===h.c&&(m=X.min(s.e,l.e)),r(s,{c:0,e:m}),r(l,s,1),r(h,s),a+=m,e=l.c,i=h.c;for(var V=(i-e)/n,U=t(a),d=0,p=[],c=n+1;c--;)p[c]=(e+V*c)*U;if(0>a){d=u(U),V=+(V*U).toFixed(d),e=+(e*U).toFixed(d),i=+(i*U).toFixed(d);for(var c=p.length;c--;)p[c]=p[c].toFixed(d),0===+p[c]&&(p[c]="0")}else e*=U,i*=U,V*=U;return k=0,f=0,b=0,{min:e,max:i,secs:n,step:V,fix:d,exp:a,pnts:p}}function o(n,a,o){a=v(a%10)||2,0>a&&(i(n)?a=(""+I(n)).replace(/0+$/,"").length||1:(n=n.toFixed(15).replace(/0+$/,""),a=n.replace(".","").replace(/^[-0]+/,"").length,n=+n));var r=w(e(n))-a+1,s=+(n*t(-r)).toFixed(15)||0;return s=o?w(s):K(s),!s&&(r=0),(""+I(s)).length>a&&(r+=1,s/=10),{c:s,e:r}}function r(e,i,n){var a=i.e-e.e;a&&(e.e+=a,e.c*=t(-a),e.c=n?w(e.c):K(e.c))}function s(e,t,i){e.et[n];)n++;if(!t[n])for(i/=10,e.e+=1,n=0;i>t[n];)n++;return e.c=t[n],e}function h(e,t,n){var s,h=n||+k.slice(-1),p=l((t-e)/h,f),u=o(t-e),g=o(e,-1,1),b=o(t,-1);if(r(u,p),r(g,p,1),r(b,p),n?s=V(g,b,h):h=m(g,b),i(e)&&i(t)&&e*t>=0){if(h>t-e)return d(e,t,h);h=U(e,t,n,g,b,h)}var L=c(e,t,g.c,b.c);return g.c=L[0],b.c=L[1],(x||_)&&y(e,t,g,b),a(g.c,b.c,h,b.e)}function m(e,i){for(var n,a,o,r,s=[],h=k.length;h--;)n=k[h],a=l((i.c-e.c)/n,f),a=a.c*t(a.e),o=w(e.c/a)*a,r=K(i.c/a)*a,s[h]={min:o,max:r,step:a,span:r-o};return s.sort(function(e,t){var i=e.span-t.span;return 0===i&&(i=e.step-t.step),i}),s=s[0],n=s.span/s.step,e.c=s.min,i.c=s.max,3>n?2*n:n}function V(e,i,n){for(var a,o,r=i.c,s=(i.c-e.c)/n-1;r>e.c;)s=l(s+1,f),s=s.c*t(s.e),a=s*n,o=K(i.c/s)*s,r=o-a;var h=e.c-r,m=o-i.c,V=h-m;return V>1.1*s&&(V=v(V/s/2)*s,r+=V,o+=V),e.c=r,i.c=o,s}function U(e,n,a,o,r,s){var l=r.c-o.c,h=l/s*t(r.e);if(!i(h)&&(h=w(h),l=h*s,n-e>l&&(h+=1,l=h*s,!a&&h*(s-1)>=n-e&&(s-=1,l=h*s)),l>=n-e)){var m=l-(n-e);o.c=v(e-m/2),r.c=v(n+m/2),o.e=0,r.e=0}return s}function d(e,t,i){if(i=i||5,x)t=e+i;else if(_)e=t-i;else{var n=i-(t-e),o=v(e-n/2),r=v(t+n/2),s=c(e,t,o,r);e=s[0],t=s[1]}return a(e,t,i)}function p(e,t,i){i=i||5;var n=X.min(I(t/i),i)/2.1;return x?t=e+n:_?e=t-n:(e-=n,t+=n),h(e,t,i)}function c(e,t,i,n){ +return e>=0&&0>i?(n-=i,i=0):0>=t&&n>0&&(i-=n,n=0),[i,n]}function u(e){return e=(+e).toFixed(15).split("."),e.pop().replace(/0+$/,"").length}function y(e,t,i,n){if(x){var a=o(e,4,1);i.e-a.e>6&&(a={c:0,e:i.e}),s(i,a),s(n,a),n.c+=a.c-i.c,i.c=a.c}else if(_){var r=o(t,4);n.e-r.e>6&&(r={c:0,e:n.e}),s(i,r),s(n,r),i.c+=r.c-n.c,n.c=r.c}}function g(e,t,i){var n=i?[i]:k,s=t-e;if(0===s)return t=o(t,3),i=n[0],t.c=v(t.c+i/2),a(t.c-i,t.c,i,t.e);I(t/s)<1e-6&&(t=0),I(e/s)<1e-6&&(e=0);var l,h,m,V=[[5,10],[10,2],[50,10],[100,2]],U=[],d=[],p=o(t-e,3),c=o(e,-1,1),u=o(t,-1);r(c,p,1),r(u,p),s=u.c-c.c,p.c=s;for(var y=n.length;y--;){i=n[y],l=K(s/i),h=l*i-s,m=3*(h+3),m+=2*(i-n[0]+2),i%5===0&&(m-=10);for(var g=V.length;g--;)l%V[g][0]===0&&(m/=V[g][1]);d[y]=[i,l,h,m].join(),U[y]={secs:i,step:l,delta:h,score:m}}return U.sort(function(e,t){return e.score-t.score}),U=U[0],c.c=v(c.c-U.delta/2),u.c=v(u.c+U.delta/2),a(c.c,u.c,U.secs,p.e)}var b,f,k,x,_,L=[10,20,25,50],W=[4,5,6],X=Math,v=X.round,w=X.floor,K=X.ceil,I=X.abs;return n}),i("echarts/util/smartLogSteps",["require","./number"],function(e){function t(e){return i(),u=e||{},n(),a(),[o(),i()][0]}function i(){U=u=g=c=b=f=y=k=d=p=null}function n(){d=u.logLabelBase,null==d?(p="plain",d=10,c=I):(d=+d,1>d&&(d=10),p="exponent",c=L(d)),y=u.splitNumber,null==y&&(y=E);var e=parseFloat(u.dataMin),t=parseFloat(u.dataMax);isFinite(e)||isFinite(t)?isFinite(e)?isFinite(t)?e>t&&(t=[e,e=t][0]):t=e:e=t:e=t=1,U=u.logPositive,null==U&&(U=t>0||0===e),b=U?e:-t,f=U?t:-e,S>b&&(b=S),S>f&&(f=S)}function a(){function e(){y>m&&(y=m);var e=w(l(m/y)),t=v(l(m/e)),i=e*t,n=(i-U)/2,a=w(l(r-n));V(a-r)&&(a-=1),g=-a*c;for(var s=a;o>=s-e;s+=e)k.push(W(d,s))}function t(){for(var e=i(h,0),t=e+2;t>e&&a(e+1)+n(e+1)*Ct&&a(l-1)+n(l-1)*C>o;)l--;g=-(a(e)*I+n(e)*J);for(var m=e;l>=m;m++){var V=a(m),U=n(m);k.push(W(10,V)*W(2,U))}}function i(e,t){return 3*e+t}function n(e){return e-3*a(e)}function a(e){return w(l(e/3))}k=[];var o=l(L(f)/c),r=l(L(b)/c),s=v(o),h=w(r),m=s-h,U=o-r;"exponent"===p?e():F>=m&&y>F?t():e()}function o(){for(var e=[],t=0,i=k.length;i>t;t++)e[t]=(U?1:-1)*k[t];!U&&e.reverse();var n=s(),a=n.value2Coord,o=a(e[0]),l=a(e[e.length-1]);return o===l&&(o-=1,l+=1),{dataMin:o,dataMax:l,tickList:e,logPositive:U,labelFormatter:r(),dataMappingMethods:n}}function r(){if("exponent"===p){var e=d,t=c;return function(i){if(!isFinite(parseFloat(i)))return"";var n="";return 0>i&&(i=-i,n="-"),n+e+m(L(i)/t)}}return function(e){return isFinite(parseFloat(e))?x.addCommas(h(e)):""}}function s(){var e=U,t=g;return{value2Coord:function(i){return null==i||isNaN(i)||!isFinite(i)?i:(i=parseFloat(i),isFinite(i)?e&&S>i?i=S:!e&&i>-S&&(i=-S):i=S,i=X(i),(e?1:-1)*(L(i)+t))},coord2Value:function(i){return null==i||isNaN(i)||!isFinite(i)?i:(i=parseFloat(i),isFinite(i)||(i=S),e?W(K,i-t):-W(K,-i+t))}}}function l(e){return+Number(+e).toFixed(14)}function h(e){return Number(e).toFixed(15).replace(/\.?0*$/,"")}function m(e){e=h(Math.round(e));for(var t=[],i=0,n=e.length;n>i;i++){var a=e.charAt(i);t.push(T[a]||"")}return t.join("")}function V(e){return e>-S&&S>e}var U,d,p,c,u,y,g,b,f,k,x=e("./number"),_=Math,L=_.log,W=_.pow,X=_.abs,v=_.ceil,w=_.floor,K=_.E,I=_.LN10,J=_.LN2,C=J/I,S=1e-9,E=5,F=2,T={0:"⁰",1:"¹",2:"²",3:"³",4:"⁴",5:"⁵",6:"⁶",7:"⁷",8:"⁸",9:"⁹","-":"⁻"};return t}),i("echarts/chart/line",["require","./base","zrender/shape/Polyline","../util/shape/Icon","../util/shape/HalfSmoothPolygon","../component/axis","../component/grid","../component/dataZoom","../config","../util/ecData","zrender/tool/util","zrender/tool/color","../chart"],function(e){function t(e,t,i,a,o){n.call(this,e,t,i,a,o),this.refresh(a)}function i(e,t,i){var n=t.x,a=t.y,r=t.width,s=t.height,l=s/2;t.symbol.match("empty")&&(e.fillStyle="#fff"),t.brushType="both";var h=t.symbol.replace("empty","").toLowerCase();h.match("star")?(l=h.replace("star","")-0||5,a-=1,h="star"):("rectangle"===h||"arrow"===h)&&(n+=(r-s)/2,r=s);var m="";if(h.match("image")&&(m=h.replace(new RegExp("^image:\\/\\/"),""),h="image",n+=Math.round((r-s)/2)-1,r=s+=2),h=o.prototype.iconLibrary[h]){var V=t.x,U=t.y;e.moveTo(V,U+l),e.lineTo(V+5,U+l),e.moveTo(V+t.width-5,U+l),e.lineTo(V+t.width,U+l);var d=this;h(e,{x:n+4,y:a+4,width:r-8,height:s-8,n:l,image:m},function(){d.modSelf(),i()})}else e.moveTo(n,a+l),e.lineTo(n+r,a+l)}var n=e("./base"),a=e("zrender/shape/Polyline"),o=e("../util/shape/Icon"),r=e("../util/shape/HalfSmoothPolygon");e("../component/axis"),e("../component/grid"),e("../component/dataZoom");var s=e("../config");s.line={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,dataFilter:"nearest",itemStyle:{normal:{label:{show:!1},lineStyle:{width:2,type:"solid",shadowColor:"rgba(0,0,0,0)",shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0}},emphasis:{label:{show:!1}}},symbolSize:2,showAllSymbol:!1};var l=e("../util/ecData"),h=e("zrender/tool/util"),m=e("zrender/tool/color");return t.prototype={type:s.CHART_TYPE_LINE,_buildShape:function(){this.finalPLMap={},this._buildPosition()},_buildHorizontal:function(e,t,i,n){for(var a,o,r,s,l,h,m,V,U,d=this.series,p=i[0][0],c=d[p],u=this.component.xAxis.getAxis(c.xAxisIndex||0),y={},g=0,b=t;b>g&&null!=u.getNameByIndex(g);g++){o=u.getCoordByIndex(g);for(var f=0,k=i.length;k>f;f++){a=this.component.yAxis.getAxis(d[i[f][0]].yAxisIndex||0),l=s=m=h=a.getCoord(0);for(var x=0,_=i[f].length;_>x;x++)p=i[f][x],c=d[p],V=c.data[g],U=this.getDataFromOption(V,"-"),y[p]=y[p]||[],n[p]=n[p]||{min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY,sum:0,counter:0,average:0},"-"!==U?(U>=0?(s-=x>0?a.getCoordSize(U):l-a.getCoord(U),r=s):0>U&&(h+=x>0?a.getCoordSize(U):a.getCoord(U)-m,r=h),y[p].push([o,r,g,u.getNameByIndex(g),o,l]),n[p].min>U&&(n[p].min=U,n[p].minY=r,n[p].minX=o),n[p].max0&&(this.finalPLMap[p]=this.finalPLMap[p]||[],this.finalPLMap[p].push(y[p]),y[p]=[])}s=this.component.grid.getY();for(var L,f=0,k=i.length;k>f;f++)for(var x=0,_=i[f].length;_>x;x++)p=i[f][x],c=d[p],V=c.data[g],U=this.getDataFromOption(V,"-"),"-"==U&&this.deepQuery([V,c,this.option],"calculable")&&(L=this.deepQuery([V,c],"symbolSize"),s+=2*L+5,r=s,this.shapeList.push(this._getCalculableItem(p,g,u.getNameByIndex(g),o,r,"horizontal")))}for(var W in y)y[W].length>0&&(this.finalPLMap[W]=this.finalPLMap[W]||[],this.finalPLMap[W].push(y[W]),y[W]=[]);this._calculMarkMapXY(n,i,"y"),this._buildBorkenLine(e,this.finalPLMap,u,"horizontal")},_buildVertical:function(e,t,i,n){for(var a,o,r,s,l,h,m,V,U,d=this.series,p=i[0][0],c=d[p],u=this.component.yAxis.getAxis(c.yAxisIndex||0),y={},g=0,b=t;b>g&&null!=u.getNameByIndex(g);g++){r=u.getCoordByIndex(g);for(var f=0,k=i.length;k>f;f++){a=this.component.xAxis.getAxis(d[i[f][0]].xAxisIndex||0),l=s=m=h=a.getCoord(0);for(var x=0,_=i[f].length;_>x;x++)p=i[f][x],c=d[p],V=c.data[g],U=this.getDataFromOption(V,"-"),y[p]=y[p]||[],n[p]=n[p]||{min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY,sum:0,counter:0,average:0},"-"!==U?(U>=0?(s+=x>0?a.getCoordSize(U):a.getCoord(U)-l,o=s):0>U&&(h-=x>0?a.getCoordSize(U):m-a.getCoord(U),o=h),y[p].push([o,r,g,u.getNameByIndex(g),l,r]),n[p].min>U&&(n[p].min=U,n[p].minX=o,n[p].minY=r),n[p].max0&&(this.finalPLMap[p]=this.finalPLMap[p]||[],this.finalPLMap[p].push(y[p]),y[p]=[])}s=this.component.grid.getXend();for(var L,f=0,k=i.length;k>f;f++)for(var x=0,_=i[f].length;_>x;x++)p=i[f][x],c=d[p],V=c.data[g],U=this.getDataFromOption(V,"-"),"-"==U&&this.deepQuery([V,c,this.option],"calculable")&&(L=this.deepQuery([V,c],"symbolSize"),s-=2*L+5,o=s,this.shapeList.push(this._getCalculableItem(p,g,u.getNameByIndex(g),o,r,"vertical")))}for(var W in y)y[W].length>0&&(this.finalPLMap[W]=this.finalPLMap[W]||[],this.finalPLMap[W].push(y[W]),y[W]=[]);this._calculMarkMapXY(n,i,"x"),this._buildBorkenLine(e,this.finalPLMap,u,"vertical")},_buildOther:function(e,t,i,n){for(var a,o=this.series,r={},s=0,l=i.length;l>s;s++)for(var h=0,m=i[s].length;m>h;h++){var V=i[s][h],U=o[V];a=this.component.xAxis.getAxis(U.xAxisIndex||0);var d=this.component.yAxis.getAxis(U.yAxisIndex||0),p=d.getCoord(0);r[V]=r[V]||[],n[V]=n[V]||{min0:Number.POSITIVE_INFINITY,min1:Number.POSITIVE_INFINITY,max0:Number.NEGATIVE_INFINITY,max1:Number.NEGATIVE_INFINITY,sum0:0,sum1:0,counter0:0,counter1:0,average0:0,average1:0};for(var c=0,u=U.data.length;u>c;c++){var y=U.data[c],g=this.getDataFromOption(y,"-");if(g instanceof Array){var b=a.getCoord(g[0]),f=d.getCoord(g[1]);r[V].push([b,f,c,g[0],b,p]),n[V].min0>g[0]&&(n[V].min0=g[0],n[V].minY0=f,n[V].minX0=b),n[V].max0g[1]&&(n[V].min1=g[1],n[V].minY1=f,n[V].minX1=b),n[V].max10&&(this.finalPLMap[k]=this.finalPLMap[k]||[],this.finalPLMap[k].push(r[k]),r[k]=[]);this._calculMarkMapXY(n,i,"xy"),this._buildBorkenLine(e,this.finalPLMap,a,"other")},_buildBorkenLine:function(e,t,i,n){for(var o,s="other"==n?"horizontal":n,V=this.series,U=e.length-1;U>=0;U--){var d=e[U],p=V[d],c=t[d];if(p.type===this.type&&null!=c)for(var u=this._getBbox(d,s),y=this._sIndex2ColorMap[d],g=this.query(p,"itemStyle.normal.lineStyle.width"),b=this.query(p,"itemStyle.normal.lineStyle.type"),f=this.query(p,"itemStyle.normal.lineStyle.color"),k=this.getItemStyleColor(this.query(p,"itemStyle.normal.color"),d,-1),x=null!=this.query(p,"itemStyle.normal.areaStyle"),_=this.query(p,"itemStyle.normal.areaStyle.color"),L=0,W=c.length;W>L;L++){var X=c[L],v="other"!=n&&this._isLarge(s,X);if(v)X=this._getLargePointList(s,X,p.dataFilter);else for(var w=0,K=X.length;K>w;w++)o=p.data[X[w][2]],(this.deepQuery([o,p,this.option],"calculable")||this.deepQuery([o,p],"showAllSymbol")||"categoryAxis"===i.type&&i.isMainAxis(X[w][2])&&"none"!=this.deepQuery([o,p],"symbol"))&&this.shapeList.push(this._getSymbol(d,X[w][2],X[w][3],X[w][0],X[w][1],s));var I=new a({zlevel:p.zlevel,z:p.z,style:{miterLimit:g,pointList:X,strokeColor:f||k||y,lineWidth:g,lineType:b,smooth:this._getSmooth(p.smooth),smoothConstraint:u,shadowColor:this.query(p,"itemStyle.normal.lineStyle.shadowColor"),shadowBlur:this.query(p,"itemStyle.normal.lineStyle.shadowBlur"),shadowOffsetX:this.query(p,"itemStyle.normal.lineStyle.shadowOffsetX"),shadowOffsetY:this.query(p,"itemStyle.normal.lineStyle.shadowOffsetY")},hoverable:!1,_main:!0,_seriesIndex:d,_orient:s});if(l.pack(I,V[d],d,0,L,V[d].name),this.shapeList.push(I),x){var J=new r({zlevel:p.zlevel,z:p.z,style:{miterLimit:g,pointList:h.clone(X).concat([[X[X.length-1][4],X[X.length-1][5]],[X[0][4],X[0][5]]]),brushType:"fill",smooth:this._getSmooth(p.smooth),smoothConstraint:u,color:_?_:m.alpha(y,.5)},highlightStyle:{brushType:"fill"},hoverable:!1,_main:!0,_seriesIndex:d,_orient:s});l.pack(J,V[d],d,0,L,V[d].name),this.shapeList.push(J)}}}},_getBbox:function(e,t){var i=this.component.grid.getBbox(),n=this.xMarkMap[e];return null!=n.minX0?[[Math.min(n.minX0,n.maxX0,n.minX1,n.maxX1),Math.min(n.minY0,n.maxY0,n.minY1,n.maxY1)],[Math.max(n.minX0,n.maxX0,n.minX1,n.maxX1),Math.max(n.minY0,n.maxY0,n.minY1,n.maxY1)]]:("horizontal"===t?(i[0][1]=Math.min(n.minY,n.maxY),i[1][1]=Math.max(n.minY,n.maxY)):(i[0][0]=Math.min(n.minX,n.maxX),i[1][0]=Math.max(n.minX,n.maxX)),i)},_isLarge:function(e,t){return t.length<2?!1:"horizontal"===e?Math.abs(t[0][0]-t[1][0])<.5:Math.abs(t[0][1]-t[1][1])<.5},_getLargePointList:function(e,t,i){var n;n="horizontal"===e?this.component.grid.getWidth():this.component.grid.getHeight();var a=t.length,o=[];if("function"!=typeof i)switch(i){case"min":i=function(e){return Math.max.apply(null,e)};break;case"max":i=function(e){return Math.min.apply(null,e)};break;case"average":i=function(e){for(var t=0,i=0;is;s++){var l=Math.floor(a/n*s),h=Math.min(Math.floor(a/n*(s+1)),a);if(!(l>=h)){for(var m=l;h>m;m++)r[m-l]="horizontal"===e?t[m][1]:t[m][0];r.length=h-l;for(var V=i(r),U=-1,d=1/0,m=l;h>m;m++){var p="horizontal"===e?t[m][1]:t[m][0],c=Math.abs(p-V);d>c&&(U=m,d=c)}var u=t[U].slice();"horizontal"===e?u[1]=V:u[0]=V,o.push(u)}}return o},_getSmooth:function(e){return e?.3:0},_getCalculableItem:function(e,t,i,n,a,o){var r=this.series,l=r[e].calculableHolderColor||this.ecTheme.calculableHolderColor||s.calculableHolderColor,h=this._getSymbol(e,t,i,n,a,o);return h.style.color=l,h.style.strokeColor=l,h.rotation=[0,0],h.hoverable=!1,h.draggable=!1,h.style.text=void 0,h},_getSymbol:function(e,t,i,n,a,o){var r=this.series,s=r[e],l=s.data[t],h=this.getSymbolShape(s,e,l,t,i,n,a,this._sIndex2ShapeMap[e],this._sIndex2ColorMap[e],"#fff","vertical"===o?"horizontal":"vertical");return h.zlevel=s.zlevel,h.z=s.z+1,this.deepQuery([l,s,this.option],"calculable")&&(this.setCalculable(h),h.draggable=!0),h},getMarkCoord:function(e,t){var i=this.series[e],n=this.xMarkMap[e],a=this.component.xAxis.getAxis(i.xAxisIndex),o=this.component.yAxis.getAxis(i.yAxisIndex);if(t.type&&("max"===t.type||"min"===t.type||"average"===t.type)){var r=null!=t.valueIndex?t.valueIndex:null!=n.maxX0?"1":"";return[n[t.type+"X"+r],n[t.type+"Y"+r],n[t.type+"Line"+r],n[t.type+r]]}return["string"!=typeof t.xAxis&&a.getCoordByIndex?a.getCoordByIndex(t.xAxis||0):a.getCoord(t.xAxis||0),"string"!=typeof t.yAxis&&o.getCoordByIndex?o.getCoordByIndex(t.yAxis||0):o.getCoord(t.yAxis||0)]},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()},ontooltipHover:function(e,t){for(var i,n,a=e.seriesIndex,o=e.dataIndex,r=a.length;r--;)if(i=this.finalPLMap[a[r]])for(var s=0,l=i.length;l>s;s++){n=i[s];for(var h=0,m=n.length;m>h;h++)o===n[h][2]&&t.push(this._getSymbol(a[r],n[h][2],n[h][3],n[h][0],n[h][1],"horizontal"))}},addDataAnimation:function(e,t){function i(){c--,0===c&&t&&t()}function n(e){e.style.controlPointList=null}for(var a=this.series,o={},r=0,s=e.length;s>r;r++)o[e[r][0]]=e[r];for(var l,h,m,V,U,d,p,c=0,r=this.shapeList.length-1;r>=0;r--)if(U=this.shapeList[r]._seriesIndex,o[U]&&!o[U][3]){if(this.shapeList[r]._main&&this.shapeList[r].style.pointList.length>1){if(d=this.shapeList[r].style.pointList,h=Math.abs(d[0][0]-d[1][0]),V=Math.abs(d[0][1]-d[1][1]),p="horizontal"===this.shapeList[r]._orient,o[U][2]){if("half-smooth-polygon"===this.shapeList[r].type){var u=d.length;this.shapeList[r].style.pointList[u-3]=d[u-2],this.shapeList[r].style.pointList[u-3][p?0:1]=d[u-4][p?0:1],this.shapeList[r].style.pointList[u-2]=d[u-1]}this.shapeList[r].style.pointList.pop(),p?(l=h,m=0):(l=0,m=-V)}else{if(this.shapeList[r].style.pointList.shift(),"half-smooth-polygon"===this.shapeList[r].type){var y=this.shapeList[r].style.pointList.pop();p?y[0]=d[0][0]:y[1]=d[0][1],this.shapeList[r].style.pointList.push(y)}p?(l=-h,m=0):(l=0,m=V)}this.shapeList[r].style.controlPointList=null,this.zr.modShape(this.shapeList[r])}else{if(o[U][2]&&this.shapeList[r]._dataIndex===a[U].data.length-1){this.zr.delShape(this.shapeList[r].id);continue}if(!o[U][2]&&0===this.shapeList[r]._dataIndex){this.zr.delShape(this.shapeList[r].id);continue}}this.shapeList[r].position=[0,0],c++,this.zr.animate(this.shapeList[r].id,"").when(this.query(this.option,"animationDurationUpdate"),{position:[l,m]}).during(n).done(i).start()}c||t&&t()}},o.prototype.iconLibrary.legendLineIcon=i,h.inherits(t,n),e("../chart").define("line",t),t}),i("echarts/util/shape/HalfSmoothPolygon",["require","zrender/shape/Base","zrender/shape/util/smoothBezier","zrender/tool/util","zrender/shape/Polygon"],function(e){function t(e){i.call(this,e)}var i=e("zrender/shape/Base"),n=e("zrender/shape/util/smoothBezier"),a=e("zrender/tool/util");return t.prototype={type:"half-smooth-polygon",buildPath:function(t,i){var a=i.pointList;if(!(a.length<2))if(i.smooth){var o=n(a.slice(0,-2),i.smooth,!1,i.smoothConstraint);t.moveTo(a[0][0],a[0][1]);for(var r,s,l,h=a.length,m=0;h-3>m;m++)r=o[2*m],s=o[2*m+1],l=a[m+1],t.bezierCurveTo(r[0],r[1],s[0],s[1],l[0],l[1]);t.lineTo(a[h-2][0],a[h-2][1]),t.lineTo(a[h-1][0],a[h-1][1]),t.lineTo(a[0][0],a[0][1])}else e("zrender/shape/Polygon").prototype.buildPath(t,i)}},a.inherits(t,i),t}),i("echarts/chart/bar",["require","./base","zrender/shape/Rectangle","../component/axis","../component/grid","../component/dataZoom","../config","../util/ecData","zrender/tool/util","zrender/tool/color","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Rectangle");e("../component/axis"),e("../component/grid"),e("../component/dataZoom");var a=e("../config");a.bar={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,barMinHeight:0,barGap:"30%",barCategoryGap:"20%",itemStyle:{normal:{barBorderColor:"#fff",barBorderRadius:0,barBorderWidth:0,label:{show:!1}},emphasis:{barBorderColor:"#fff",barBorderRadius:0,barBorderWidth:0,label:{show:!1}}}};var o=e("../util/ecData"),r=e("zrender/tool/util"),s=e("zrender/tool/color");return t.prototype={type:a.CHART_TYPE_BAR,_buildShape:function(){this._buildPosition()},_buildNormal:function(e,t,i,o,r){for(var s,l,h,m,V,U,d,p,c,u,y,g,b=this.series,f=i[0][0],k=b[f],x="horizontal"==r,_=this.component.xAxis,L=this.component.yAxis,W=x?_.getAxis(k.xAxisIndex):L.getAxis(k.yAxisIndex),X=this._mapSize(W,i),v=X.gap,w=X.barGap,K=X.barWidthMap,I=X.barMaxWidthMap,J=X.barWidth,C=X.barMinHeightMap,S=X.interval,E=this.deepQuery([this.ecTheme,a],"island.r"),F=0,T=t;T>F&&null!=W.getNameByIndex(F);F++){x?m=W.getCoordByIndex(F)-v/2:V=W.getCoordByIndex(F)+v/2;for(var z=0,A=i.length;A>z;z++){var M=b[i[z][0]].yAxisIndex||0,O=b[i[z][0]].xAxisIndex||0;s=x?L.getAxis(M):_.getAxis(O),d=U=c=p=s.getCoord(0);for(var P=0,D=i[z].length;D>P;P++)f=i[z][P],k=b[f],y=k.data[F],g=this.getDataFromOption(y,"-"),o[f]=o[f]||{min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY,sum:0,counter:0,average:0},h=Math.min(I[f]||Number.MAX_VALUE,K[f]||J),"-"!==g&&(g>0?(l=P>0?s.getCoordSize(g):x?d-s.getCoord(g):s.getCoord(g)-d,1===D&&C[f]>l&&(l=C[f]),x?(U-=l,V=U):(m=U,U+=l)):0>g?(l=P>0?s.getCoordSize(g):x?s.getCoord(g)-c:c-s.getCoord(g),1===D&&C[f]>l&&(l=C[f]),x?(V=p,p+=l):(p-=l,m=p)):(l=0,x?(U-=l,V=U):(m=U,U+=l)),o[f][F]=x?m+h/2:V-h/2,o[f].min>g&&(o[f].min=g,x?(o[f].minY=V,o[f].minX=o[f][F]):(o[f].minX=m+l,o[f].minY=o[f][F])),o[f].maxP;P++)f=i[z][P],k=b[f],y=k.data[F],g=this.getDataFromOption(y,"-"),h=Math.min(I[f]||Number.MAX_VALUE,K[f]||J),"-"==g&&this.deepQuery([y,k,this.option],"calculable")&&(x?(U-=E,V=U):(m=U,U+=E),u=this._getBarItem(f,F,W.getNameByIndex(F),m,V-(x?0:h),x?h:E,x?E:h,x?"vertical":"horizontal"),u.hoverable=!1,u.draggable=!1,u.style.lineWidth=1,u.style.brushType="stroke",u.style.strokeColor=k.calculableHolderColor||this.ecTheme.calculableHolderColor||a.calculableHolderColor,this.shapeList.push(new n(u)));x?m+=h+w:V-=h+w}}this._calculMarkMapXY(o,i,x?"y":"x")},_buildHorizontal:function(e,t,i,n){return this._buildNormal(e,t,i,n,"horizontal")},_buildVertical:function(e,t,i,n){return this._buildNormal(e,t,i,n,"vertical")},_buildOther:function(e,t,i,a){for(var o=this.series,r=0,s=i.length;s>r;r++)for(var l=0,h=i[r].length;h>l;l++){var m=i[r][l],V=o[m],U=V.xAxisIndex||0,d=this.component.xAxis.getAxis(U),p=d.getCoord(0),c=V.yAxisIndex||0,u=this.component.yAxis.getAxis(c),y=u.getCoord(0);a[m]=a[m]||{min0:Number.POSITIVE_INFINITY,min1:Number.POSITIVE_INFINITY,max0:Number.NEGATIVE_INFINITY,max1:Number.NEGATIVE_INFINITY,sum0:0,sum1:0,counter0:0,counter1:0,average0:0,average1:0};for(var g=0,b=V.data.length;b>g;g++){var f=V.data[g],k=this.getDataFromOption(f,"-");if(k instanceof Array){var x,_,L=d.getCoord(k[0]),W=u.getCoord(k[1]),X=[f,V],v=this.deepQuery(X,"barWidth")||10,w=this.deepQuery(X,"barHeight");null!=w?(x="horizontal",k[0]>0?(v=L-p,L-=v):v=k[0]<0?p-L:0,_=this._getBarItem(m,g,k[0],L,W-w/2,v,w,x)):(x="vertical",k[1]>0?w=y-W:k[1]<0?(w=W-y,W-=w):w=0,_=this._getBarItem(m,g,k[0],L-v/2,W,v,w,x)),this.shapeList.push(new n(_)),L=d.getCoord(k[0]),W=u.getCoord(k[1]),a[m].min0>k[0]&&(a[m].min0=k[0],a[m].minY0=W,a[m].minX0=L),a[m].max0k[1]&&(a[m].min1=k[1],a[m].minY1=W,a[m].minX1=L),a[m].max1=a&&(d=Math.floor(t.length/n),a=1);else if(n="string"==typeof U&&U.match(/%$/)?(e.getGap()*(100-parseFloat(U))/100).toFixed(2)-0:e.getGap()-U,"string"==typeof V&&V.match(/%$/)?(V=parseFloat(V)/100,a=+((n-m)/((t.length-1)*V+t.length-h)).toFixed(2),V=a*V):(V=parseFloat(V),a=+((n-m-V*(t.length-1))/(t.length-h)).toFixed(2)),0>=a)return this._mapSize(e,t,!0)}else if(n=h>1?"string"==typeof U&&U.match(/%$/)?+(e.getGap()*(100-parseFloat(U))/100).toFixed(2):e.getGap()-U:m,a=0,V=h>1?+((n-m)/(h-1)).toFixed(2):0,0>V)return this._mapSize(e,t,!0);return this._recheckBarMaxWidth(t,r,s,l,n,a,V,d)},_findSpecialBarSzie:function(e,t){for(var i,n,a,o,r=this.series,s={},l={},h={},m=0,V=0,U=0,d=e.length;d>U;U++)for(var p={barWidth:!1,barMaxWidth:!1},c=0,u=e[U].length;u>c;c++){var y=e[U][c],g=r[y];if(!t){if(p.barWidth)s[y]=i;else if(i=this.query(g,"barWidth"),null!=i){s[y]=i,V+=i,m++,p.barWidth=!0;for(var b=0,f=c;f>b;b++){var k=e[U][b];s[k]=i}}if(p.barMaxWidth)l[y]=n;else if(n=this.query(g,"barMaxWidth"),null!=n){l[y]=n,p.barMaxWidth=!0;for(var b=0,f=c;f>b;b++){var k=e[U][b];l[k]=n}}}h[y]=this.query(g,"barMinHeight"),a=null!=a?a:this.query(g,"barGap"),o=null!=o?o:this.query(g,"barCategoryGap")}return{barWidthMap:s,barMaxWidthMap:l,barMinHeightMap:h,sBarWidth:i,sBarMaxWidth:n,sBarWidthCounter:m,sBarWidthTotal:V,barGap:a,barCategoryGap:o}},_recheckBarMaxWidth:function(e,t,i,n,a,o,r,s){for(var l=0,h=e.length;h>l;l++){var m=e[l][0];i[m]&&i[m]0&&b.height>g&&b.width>g?(b.y+=g/2,b.height-=g,b.x+=g/2,b.width-=g):b.brushType="fill",m.highlightStyle.textColor=m.highlightStyle.color,m=this.addLabel(m,U,d,i,h);for(var f=[b,m.highlightStyle],k=0,x=f.length;x>k;k++){var _=f[k].textPosition;if("insideLeft"===_||"insideRight"===_||"insideTop"===_||"insideBottom"===_){var L=5;switch(_){case"insideLeft":f[k].textX=b.x+L,f[k].textY=b.y+b.height/2,f[k].textAlign="left",f[k].textBaseline="middle";break;case"insideRight":f[k].textX=b.x+b.width-L,f[k].textY=b.y+b.height/2,f[k].textAlign="right",f[k].textBaseline="middle";break;case"insideTop":f[k].textX=b.x+b.width/2,f[k].textY=b.y+L/2,f[k].textAlign="center",f[k].textBaseline="top";break;case"insideBottom":f[k].textX=b.x+b.width/2,f[k].textY=b.y+b.height-L/2,f[k].textAlign="center",f[k].textBaseline="bottom"}f[k].textPosition="specific",f[k].textColor=f[k].textColor||"#fff"}}return this.deepQuery([d,U,this.option],"calculable")&&(this.setCalculable(m),m.draggable=!0),o.pack(m,V[e],e,V[e].data[t],t,i),m},getMarkCoord:function(e,t){var i,n,a=this.series[e],o=this.xMarkMap[e],r=this.component.xAxis.getAxis(a.xAxisIndex),s=this.component.yAxis.getAxis(a.yAxisIndex);if(!t.type||"max"!==t.type&&"min"!==t.type&&"average"!==t.type)if(o.isHorizontal){i="string"==typeof t.xAxis&&r.getIndexByName?r.getIndexByName(t.xAxis):t.xAxis||0;var l=o[i];l=null!=l?l:"string"!=typeof t.xAxis&&r.getCoordByIndex?r.getCoordByIndex(t.xAxis||0):r.getCoord(t.xAxis||0),n=[l,s.getCoord(t.yAxis||0)]}else{i="string"==typeof t.yAxis&&s.getIndexByName?s.getIndexByName(t.yAxis):t.yAxis||0;var h=o[i];h=null!=h?h:"string"!=typeof t.yAxis&&s.getCoordByIndex?s.getCoordByIndex(t.yAxis||0):s.getCoord(t.yAxis||0),n=[r.getCoord(t.xAxis||0),h]}else{var m=null!=t.valueIndex?t.valueIndex:null!=o.maxX0?"1":"";n=[o[t.type+"X"+m],o[t.type+"Y"+m],o[t.type+"Line"+m],o[t.type+m]]}return n},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()},addDataAnimation:function(e,t){function i(){c--,0===c&&t&&t()}for(var n=this.series,a={},r=0,s=e.length;s>r;r++)a[e[r][0]]=e[r];for(var l,h,m,V,U,d,p,c=0,r=this.shapeList.length-1;r>=0;r--)if(d=o.get(this.shapeList[r],"seriesIndex"),a[d]&&!a[d][3]&&"rectangle"===this.shapeList[r].type){if(p=o.get(this.shapeList[r],"dataIndex"),U=n[d],a[d][2]&&p===U.data.length-1){this.zr.delShape(this.shapeList[r].id);continue}if(!a[d][2]&&0===p){this.zr.delShape(this.shapeList[r].id);continue}"horizontal"===this.shapeList[r]._orient?(V=this.component.yAxis.getAxis(U.yAxisIndex||0).getGap(),m=a[d][2]?-V:V,l=0):(h=this.component.xAxis.getAxis(U.xAxisIndex||0).getGap(),l=a[d][2]?h:-h,m=0),this.shapeList[r].position=[0,0],c++,this.zr.animate(this.shapeList[r].id,"").when(this.query(this.option,"animationDurationUpdate"),{position:[l,m]}).done(i).start()}c||t&&t()}},r.inherits(t,i),e("../chart").define("bar",t),t}),i("echarts/chart/scatter",["require","./base","../util/shape/Symbol","../component/axis","../component/grid","../component/dataZoom","../component/dataRange","../config","zrender/tool/util","zrender/tool/color","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("../util/shape/Symbol");e("../component/axis"),e("../component/grid"),e("../component/dataZoom"),e("../component/dataRange");var a=e("../config");a.scatter={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,symbolSize:4,large:!1,largeThreshold:2e3,itemStyle:{normal:{label:{show:!1}},emphasis:{label:{show:!1}}}};var o=e("zrender/tool/util"),r=e("zrender/tool/color");return t.prototype={type:a.CHART_TYPE_SCATTER,_buildShape:function(){var e=this.series;this._sIndex2ColorMap={},this._symbol=this.option.symbolList,this._sIndex2ShapeMap={},this.selectedMap={},this.xMarkMap={};for(var t,i,n,o,s=this.component.legend,l=[],h=0,m=e.length;m>h;h++)if(t=e[h],i=t.name,t.type===a.CHART_TYPE_SCATTER){if(e[h]=this.reformOption(e[h]),this.legendHoverLink=e[h].legendHoverLink||this.legendHoverLink,this._sIndex2ShapeMap[h]=this.query(t,"symbol")||this._symbol[h%this._symbol.length],s){if(this.selectedMap[i]=s.isSelected(i),this._sIndex2ColorMap[h]=r.alpha(s.getColor(i),.5),n=s.getItemShape(i)){var o=this._sIndex2ShapeMap[h];n.style.brushType=o.match("empty")?"stroke":"both",o=o.replace("empty","").toLowerCase(),o.match("rectangle")&&(n.style.x+=Math.round((n.style.width-n.style.height)/2),n.style.width=n.style.height),o.match("star")&&(n.style.n=o.replace("star","")-0||5,o="star"),o.match("image")&&(n.style.image=o.replace(new RegExp("^image:\\/\\/"),""),n.style.x+=Math.round((n.style.width-n.style.height)/2),n.style.width=n.style.height,o="image"),n.style.iconType=o,s.setItemShape(i,n)}}else this.selectedMap[i]=!0,this._sIndex2ColorMap[h]=r.alpha(this.zr.getColor(h),.5);this.selectedMap[i]&&l.push(h)}this._buildSeries(l),this.addShapeList()},_buildSeries:function(e){if(0!==e.length){for(var t,i,n,a,o,r,s,l,h=this.series,m={},V=0,U=e.length;U>V;V++)if(t=e[V],i=h[t],0!==i.data.length){o=this.component.xAxis.getAxis(i.xAxisIndex||0),r=this.component.yAxis.getAxis(i.yAxisIndex||0),m[t]=[];for(var d=0,p=i.data.length;p>d;d++)n=i.data[d],a=this.getDataFromOption(n,"-"),"-"===a||a.length<2||(s=o.getCoord(a[0]),l=r.getCoord(a[1]),m[t].push([s,l,d,n.name||""]));this.xMarkMap[t]=this._markMap(o,r,i.data,m[t]),this.buildMark(t)}this._buildPointList(m)}},_markMap:function(e,t,i,n){for(var a,o={min0:Number.POSITIVE_INFINITY,max0:Number.NEGATIVE_INFINITY,sum0:0,counter0:0,average0:0,min1:Number.POSITIVE_INFINITY,max1:Number.NEGATIVE_INFINITY,sum1:0,counter1:0,average1:0},r=0,s=n.length;s>r;r++)a=i[n[r][2]].value||i[n[r][2]],o.min0>a[0]&&(o.min0=a[0],o.minY0=n[r][1],o.minX0=n[r][0]),o.max0a[1]&&(o.min1=a[1],o.minY1=n[r][1],o.minX1=n[r][0]),o.max1t.largeThreshold)this.shapeList.push(this._getLargeSymbol(t,i,this.getItemStyleColor(this.query(t,"itemStyle.normal.color"),r,-1)||this._sIndex2ColorMap[r]));else for(var s=0,l=i.length;l>s;s++)n=i[s],a=this._getSymbol(r,n[2],n[3],n[0],n[1]),a&&this.shapeList.push(a)},_getSymbol:function(e,t,i,n,a){var o,r=this.series,s=r[e],l=s.data[t],h=this.component.dataRange;if(h){if(o=isNaN(l[2])?this._sIndex2ColorMap[e]:h.getColor(l[2]),!o)return null}else o=this._sIndex2ColorMap[e];var m=this.getSymbolShape(s,e,l,t,i,n,a,this._sIndex2ShapeMap[e],o,"rgba(0,0,0,0)","vertical");return m.zlevel=s.zlevel,m.z=s.z,m._main=!0,m},_getLargeSymbol:function(e,t,i){return new n({zlevel:e.zlevel,z:e.z,_main:!0,hoverable:!1,style:{pointList:t,color:i,strokeColor:i},highlightStyle:{pointList:[]}})},getMarkCoord:function(e,t){var i,n=this.series[e],a=this.xMarkMap[e],o=this.component.xAxis.getAxis(n.xAxisIndex),r=this.component.yAxis.getAxis(n.yAxisIndex);if(!t.type||"max"!==t.type&&"min"!==t.type&&"average"!==t.type)i=["string"!=typeof t.xAxis&&o.getCoordByIndex?o.getCoordByIndex(t.xAxis||0):o.getCoord(t.xAxis||0),"string"!=typeof t.yAxis&&r.getCoordByIndex?r.getCoordByIndex(t.yAxis||0):r.getCoord(t.yAxis||0)];else{var s=null!=t.valueIndex?t.valueIndex:1;i=[a[t.type+"X"+s],a[t.type+"Y"+s],a[t.type+"Line"+s],a[t.type+s]]}return i},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()},ondataRange:function(e,t){this.component.dataRange&&(this.refresh(),t.needRefresh=!0)}},o.inherits(t,i),e("../chart").define("scatter",t),t}),i("echarts/component/dataRange",["require","./base","zrender/shape/Text","zrender/shape/Rectangle","../util/shape/HandlePolygon","../config","zrender/tool/util","zrender/tool/event","zrender/tool/area","zrender/tool/color","../component"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o);var s=this;s._ondrift=function(e,t){return s.__ondrift(this,e,t)},s._ondragend=function(){return s.__ondragend()},s._dataRangeSelected=function(e){return s.__dataRangeSelected(e)},s._dispatchHoverLink=function(e){return s.__dispatchHoverLink(e)},s._onhoverlink=function(e){return s.__onhoverlink(e); + +},this._selectedMap={},this._range={},this.refresh(a),t.bind(r.EVENT.HOVER,this._onhoverlink)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Rectangle"),o=e("../util/shape/HandlePolygon"),r=e("../config");r.dataRange={zlevel:0,z:4,show:!0,orient:"vertical",x:"left",y:"bottom",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,itemWidth:20,itemHeight:14,precision:0,splitNumber:5,splitList:null,calculable:!1,selectedMode:!0,hoverLink:!0,realtime:!0,color:["#006edd","#e0ffff"],textStyle:{color:"#333"}};var s=e("zrender/tool/util"),l=e("zrender/tool/event"),h=e("zrender/tool/area"),m=e("zrender/tool/color");return t.prototype={type:r.COMPONENT_TYPE_DATARANGE,_textGap:10,_buildShape:function(){if(this._itemGroupLocation=this._getItemGroupLocation(),this._buildBackground(),this._isContinuity()?this._buildGradient():this._buildItem(),this.dataRangeOption.show)for(var e=0,t=this.shapeList.length;t>e;e++)this.zr.addShape(this.shapeList[e]);this._syncShapeFromRange()},_buildItem:function(){var e,t,i,o,r=this._valueTextList,s=r.length,l=this.getFont(this.dataRangeOption.textStyle),m=this._itemGroupLocation.x,V=this._itemGroupLocation.y,U=this.dataRangeOption.itemWidth,d=this.dataRangeOption.itemHeight,p=this.dataRangeOption.itemGap,c=h.getTextHeight("国",l);"vertical"==this.dataRangeOption.orient&&"right"==this.dataRangeOption.x&&(m=this._itemGroupLocation.x+this._itemGroupLocation.width-U);var u=!0;this.dataRangeOption.text&&(u=!1,this.dataRangeOption.text[0]&&(i=this._getTextShape(m,V,this.dataRangeOption.text[0]),"horizontal"==this.dataRangeOption.orient?m+=h.getTextWidth(this.dataRangeOption.text[0],l)+this._textGap:(V+=c+this._textGap,i.style.y+=c/2+this._textGap,i.style.textBaseline="bottom"),this.shapeList.push(new n(i))));for(var y=0;s>y;y++)e=r[y],o=this.getColorByIndex(y),t=this._getItemShape(m,V,U,d,this._selectedMap[y]?o:"#ccc"),t._idx=y,t.onmousemove=this._dispatchHoverLink,this.dataRangeOption.selectedMode&&(t.clickable=!0,t.onclick=this._dataRangeSelected),this.shapeList.push(new a(t)),u&&(i={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:m+U+5,y:V,color:this._selectedMap[y]?this.dataRangeOption.textStyle.color:"#ccc",text:r[y],textFont:l,textBaseline:"top"},highlightStyle:{brushType:"fill"}},"vertical"==this.dataRangeOption.orient&&"right"==this.dataRangeOption.x&&(i.style.x-=U+10,i.style.textAlign="right"),i._idx=y,i.onmousemove=this._dispatchHoverLink,this.dataRangeOption.selectedMode&&(i.clickable=!0,i.onclick=this._dataRangeSelected),this.shapeList.push(new n(i))),"horizontal"==this.dataRangeOption.orient?m+=U+(u?5:0)+(u?h.getTextWidth(e,l):0)+p:V+=d+p;!u&&this.dataRangeOption.text[1]&&("horizontal"==this.dataRangeOption.orient?m=m-p+this._textGap:V=V-p+this._textGap,i=this._getTextShape(m,V,this.dataRangeOption.text[1]),"horizontal"!=this.dataRangeOption.orient&&(i.style.y-=5,i.style.textBaseline="top"),this.shapeList.push(new n(i)))},_buildGradient:function(){var t,i,o=this.getFont(this.dataRangeOption.textStyle),r=this._itemGroupLocation.x,s=this._itemGroupLocation.y,l=this.dataRangeOption.itemWidth,m=this.dataRangeOption.itemHeight,V=h.getTextHeight("国",o),U=10,d=!0;this.dataRangeOption.text&&(d=!1,this.dataRangeOption.text[0]&&(i=this._getTextShape(r,s,this.dataRangeOption.text[0]),"horizontal"==this.dataRangeOption.orient?r+=h.getTextWidth(this.dataRangeOption.text[0],o)+this._textGap:(s+=V+this._textGap,i.style.y+=V/2+this._textGap,i.style.textBaseline="bottom"),this.shapeList.push(new n(i))));for(var p=e("zrender/tool/color"),c=1/(this.dataRangeOption.color.length-1),u=[],y=0,g=this.dataRangeOption.color.length;g>y;y++)u.push([y*c,this.dataRangeOption.color[y]]);"horizontal"==this.dataRangeOption.orient?(t={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:r,y:s,width:l*U,height:m,color:p.getLinearGradient(r,s,r+l*U,s,u)},hoverable:!1},r+=l*U+this._textGap):(t={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:r,y:s,width:l,height:m*U,color:p.getLinearGradient(r,s,r,s+m*U,u)},hoverable:!1},s+=m*U+this._textGap),this.shapeList.push(new a(t)),this._calculableLocation=t.style,this.dataRangeOption.calculable&&(this._buildFiller(),this._bulidMask(),this._bulidHandle()),this._buildIndicator(),!d&&this.dataRangeOption.text[1]&&(i=this._getTextShape(r,s,this.dataRangeOption.text[1]),this.shapeList.push(new n(i)))},_buildIndicator:function(){var e,t,i=this._calculableLocation.x,n=this._calculableLocation.y,a=this._calculableLocation.width,r=this._calculableLocation.height,s=5;"horizontal"==this.dataRangeOption.orient?"bottom"!=this.dataRangeOption.y?(e=[[i,n+r],[i-s,n+r+s],[i+s,n+r+s]],t="bottom"):(e=[[i,n],[i-s,n-s],[i+s,n-s]],t="top"):"right"!=this.dataRangeOption.x?(e=[[i+a,n],[i+a+s,n-s],[i+a+s,n+s]],t="right"):(e=[[i,n],[i-s,n-s],[i-s,n+s]],t="left"),this._indicatorShape={style:{pointList:e,color:"#fff",__rect:{x:Math.min(e[0][0],e[1][0]),y:Math.min(e[0][1],e[1][1]),width:s*("horizontal"==this.dataRangeOption.orient?2:1),height:s*("horizontal"==this.dataRangeOption.orient?1:2)}},highlightStyle:{brushType:"fill",textPosition:t,textColor:this.dataRangeOption.textStyle.color},hoverable:!1},this._indicatorShape=new o(this._indicatorShape)},_buildFiller:function(){this._fillerShape={zlevel:this.getZlevelBase(),z:this.getZBase()+1,style:{x:this._calculableLocation.x,y:this._calculableLocation.y,width:this._calculableLocation.width,height:this._calculableLocation.height,color:"rgba(255,255,255,0)"},highlightStyle:{strokeColor:"rgba(255,255,255,0.5)",lineWidth:1},draggable:!0,ondrift:this._ondrift,ondragend:this._ondragend,onmousemove:this._dispatchHoverLink,_type:"filler"},this._fillerShape=new a(this._fillerShape),this.shapeList.push(this._fillerShape)},_bulidHandle:function(){var e,t,i,n,a,r,s,l,m=this._calculableLocation.x,V=this._calculableLocation.y,U=this._calculableLocation.width,d=this._calculableLocation.height,p=this.getFont(this.dataRangeOption.textStyle),c=h.getTextHeight("国",p),u=Math.max(h.getTextWidth(this._textFormat(this.dataRangeOption.max),p),h.getTextWidth(this._textFormat(this.dataRangeOption.min),p))+2;"horizontal"==this.dataRangeOption.orient?"bottom"!=this.dataRangeOption.y?(e=[[m,V],[m,V+d+c],[m-c,V+d+c],[m-1,V+d],[m-1,V]],t=m-u/2-c,i=V+d+c/2+2,n={x:m-u-c,y:V+d,width:u+c,height:c},a=[[m+U,V],[m+U,V+d+c],[m+U+c,V+d+c],[m+U+1,V+d],[m+U+1,V]],r=m+U+u/2+c,s=i,l={x:m+U,y:V+d,width:u+c,height:c}):(e=[[m,V+d],[m,V-c],[m-c,V-c],[m-1,V],[m-1,V+d]],t=m-u/2-c,i=V-c/2-2,n={x:m-u-c,y:V-c,width:u+c,height:c},a=[[m+U,V+d],[m+U,V-c],[m+U+c,V-c],[m+U+1,V],[m+U+1,V+d]],r=m+U+u/2+c,s=i,l={x:m+U,y:V-c,width:u+c,height:c}):(u+=c,"right"!=this.dataRangeOption.x?(e=[[m,V],[m+U+c,V],[m+U+c,V-c],[m+U,V-1],[m,V-1]],t=m+U+u/2+c/2,i=V-c/2,n={x:m+U,y:V-c,width:u+c,height:c},a=[[m,V+d],[m+U+c,V+d],[m+U+c,V+c+d],[m+U,V+1+d],[m,V+d+1]],r=t,s=V+d+c/2,l={x:m+U,y:V+d,width:u+c,height:c}):(e=[[m+U,V],[m-c,V],[m-c,V-c],[m,V-1],[m+U,V-1]],t=m-u/2-c/2,i=V-c/2,n={x:m-u-c,y:V-c,width:u+c,height:c},a=[[m+U,V+d],[m-c,V+d],[m-c,V+c+d],[m,V+1+d],[m+U,V+d+1]],r=t,s=V+d+c/2,l={x:m-u-c,y:V+d,width:u+c,height:c})),this._startShape={style:{pointList:e,text:this._textFormat(this.dataRangeOption.max),textX:t,textY:i,textFont:p,color:this.getColor(this.dataRangeOption.max),rect:n,x:e[0][0],y:e[0][1],_x:e[0][0],_y:e[0][1]}},this._startShape.highlightStyle={strokeColor:this._startShape.style.color,lineWidth:1},this._endShape={style:{pointList:a,text:this._textFormat(this.dataRangeOption.min),textX:r,textY:s,textFont:p,color:this.getColor(this.dataRangeOption.min),rect:l,x:a[0][0],y:a[0][1],_x:a[0][0],_y:a[0][1]}},this._endShape.highlightStyle={strokeColor:this._endShape.style.color,lineWidth:1},this._startShape.zlevel=this._endShape.zlevel=this.getZlevelBase(),this._startShape.z=this._endShape.z=this.getZBase()+1,this._startShape.draggable=this._endShape.draggable=!0,this._startShape.ondrift=this._endShape.ondrift=this._ondrift,this._startShape.ondragend=this._endShape.ondragend=this._ondragend,this._startShape.style.textColor=this._endShape.style.textColor=this.dataRangeOption.textStyle.color,this._startShape.style.textAlign=this._endShape.style.textAlign="center",this._startShape.style.textPosition=this._endShape.style.textPosition="specific",this._startShape.style.textBaseline=this._endShape.style.textBaseline="middle",this._startShape.style.width=this._endShape.style.width=0,this._startShape.style.height=this._endShape.style.height=0,this._startShape.style.textPosition=this._endShape.style.textPosition="specific",this._startShape=new o(this._startShape),this._endShape=new o(this._endShape),this.shapeList.push(this._startShape),this.shapeList.push(this._endShape)},_bulidMask:function(){var e=this._calculableLocation.x,t=this._calculableLocation.y,i=this._calculableLocation.width,n=this._calculableLocation.height;this._startMask={zlevel:this.getZlevelBase(),z:this.getZBase()+1,style:{x:e,y:t,width:"horizontal"==this.dataRangeOption.orient?0:i,height:"horizontal"==this.dataRangeOption.orient?n:0,color:"#ccc"},hoverable:!1},this._endMask={zlevel:this.getZlevelBase(),z:this.getZBase()+1,style:{x:"horizontal"==this.dataRangeOption.orient?e+i:e,y:"horizontal"==this.dataRangeOption.orient?t:t+n,width:"horizontal"==this.dataRangeOption.orient?0:i,height:"horizontal"==this.dataRangeOption.orient?n:0,color:"#ccc"},hoverable:!1},this._startMask=new a(this._startMask),this._endMask=new a(this._endMask),this.shapeList.push(this._startMask),this.shapeList.push(this._endMask)},_buildBackground:function(){var e=this.reformCssArray(this.dataRangeOption.padding);this.shapeList.push(new a({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._itemGroupLocation.x-e[3],y:this._itemGroupLocation.y-e[0],width:this._itemGroupLocation.width+e[3]+e[1],height:this._itemGroupLocation.height+e[0]+e[2],brushType:0===this.dataRangeOption.borderWidth?"fill":"both",color:this.dataRangeOption.backgroundColor,strokeColor:this.dataRangeOption.borderColor,lineWidth:this.dataRangeOption.borderWidth}}))},_getItemGroupLocation:function(){var e=this._valueTextList,t=e.length,i=this.dataRangeOption.itemGap,n=this.dataRangeOption.itemWidth,a=this.dataRangeOption.itemHeight,o=0,r=0,s=this.getFont(this.dataRangeOption.textStyle),l=h.getTextHeight("国",s),m=10;if("horizontal"==this.dataRangeOption.orient){if(this.dataRangeOption.text||this._isContinuity())o=(this._isContinuity()?n*m+i:t*(n+i))+(this.dataRangeOption.text&&"undefined"!=typeof this.dataRangeOption.text[0]?h.getTextWidth(this.dataRangeOption.text[0],s)+this._textGap:0)+(this.dataRangeOption.text&&"undefined"!=typeof this.dataRangeOption.text[1]?h.getTextWidth(this.dataRangeOption.text[1],s)+this._textGap:0);else{n+=5;for(var V=0;t>V;V++)o+=n+h.getTextWidth(e[V],s)+i}o-=i,r=Math.max(l,a)}else{var U;if(this.dataRangeOption.text||this._isContinuity())r=(this._isContinuity()?a*m+i:t*(a+i))+(this.dataRangeOption.text&&"undefined"!=typeof this.dataRangeOption.text[0]?this._textGap+l:0)+(this.dataRangeOption.text&&"undefined"!=typeof this.dataRangeOption.text[1]?this._textGap+l:0),U=Math.max(h.getTextWidth(this.dataRangeOption.text&&this.dataRangeOption.text[0]||"",s),h.getTextWidth(this.dataRangeOption.text&&this.dataRangeOption.text[1]||"",s)),o=Math.max(n,U);else{r=(a+i)*t,n+=5,U=0;for(var V=0;t>V;V++)U=Math.max(U,h.getTextWidth(e[V],s));o=n+U}r-=i}var d,p=this.reformCssArray(this.dataRangeOption.padding),c=this.zr.getWidth();switch(this.dataRangeOption.x){case"center":d=Math.floor((c-o)/2);break;case"left":d=p[3]+this.dataRangeOption.borderWidth;break;case"right":d=c-o-p[1]-this.dataRangeOption.borderWidth;break;default:d=this.parsePercent(this.dataRangeOption.x,c),d=isNaN(d)?0:d}var u,y=this.zr.getHeight();switch(this.dataRangeOption.y){case"top":u=p[0]+this.dataRangeOption.borderWidth;break;case"bottom":u=y-r-p[2]-this.dataRangeOption.borderWidth;break;case"center":u=Math.floor((y-r)/2);break;default:u=this.parsePercent(this.dataRangeOption.y,y),u=isNaN(u)?0:u}if(this.dataRangeOption.calculable){var g=Math.max(h.getTextWidth(this.dataRangeOption.max,s),h.getTextWidth(this.dataRangeOption.min,s))+l;"horizontal"==this.dataRangeOption.orient?(g>d&&(d=g),d+o+g>c&&(d-=g)):(l>u&&(u=l),u+r+l>y&&(u-=l))}return{x:d,y:u,width:o,height:r}},_getTextShape:function(e,t,i){return{zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:"horizontal"==this.dataRangeOption.orient?e:this._itemGroupLocation.x+this._itemGroupLocation.width/2,y:"horizontal"==this.dataRangeOption.orient?this._itemGroupLocation.y+this._itemGroupLocation.height/2:t,color:this.dataRangeOption.textStyle.color,text:i,textFont:this.getFont(this.dataRangeOption.textStyle),textBaseline:"horizontal"==this.dataRangeOption.orient?"middle":"top",textAlign:"horizontal"==this.dataRangeOption.orient?"left":"center"},hoverable:!1}},_getItemShape:function(e,t,i,n,a){return{zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:e,y:t+1,width:i,height:n-2,color:a},highlightStyle:{strokeColor:a,lineWidth:1}}},__ondrift:function(e,t,i){var n=this._calculableLocation.x,a=this._calculableLocation.y,o=this._calculableLocation.width,r=this._calculableLocation.height;return"horizontal"==this.dataRangeOption.orient?e.style.x+t<=n?e.style.x=n:e.style.x+t+e.style.width>=n+o?e.style.x=n+o-e.style.width:e.style.x+=t:e.style.y+i<=a?e.style.y=a:e.style.y+i+e.style.height>=a+r?e.style.y=a+r-e.style.height:e.style.y+=i,"filler"==e._type?this._syncHandleShape():this._syncFillerShape(e),this.dataRangeOption.realtime&&this._dispatchDataRange(),!0},__ondragend:function(){this.isDragend=!0},ondragend:function(e,t){this.isDragend&&e.target&&(t.dragOut=!0,t.dragIn=!0,this.dataRangeOption.realtime||this._dispatchDataRange(),t.needRefresh=!1,this.isDragend=!1)},_syncShapeFromRange:function(){var e=this.dataRangeOption.range||{},t=e.start,i=e.end;if(t>i&&(t=[i,i=t][0]),this._range.end=null!=t?t:null!=this._range.end?this._range.end:0,this._range.start=null!=i?i:null!=this._range.start?this._range.start:100,100!=this._range.start||0!==this._range.end){if("horizontal"==this.dataRangeOption.orient){var n=this._fillerShape.style.width;this._fillerShape.style.x+=n*(100-this._range.start)/100,this._fillerShape.style.width=n*(this._range.start-this._range.end)/100}else{var a=this._fillerShape.style.height;this._fillerShape.style.y+=a*(100-this._range.start)/100,this._fillerShape.style.height=a*(this._range.start-this._range.end)/100}this.zr.modShape(this._fillerShape.id),this._syncHandleShape()}},_syncHandleShape:function(){var e=this._calculableLocation.x,t=this._calculableLocation.y,i=this._calculableLocation.width,n=this._calculableLocation.height;"horizontal"==this.dataRangeOption.orient?(this._startShape.style.x=this._fillerShape.style.x,this._startMask.style.width=this._startShape.style.x-e,this._endShape.style.x=this._fillerShape.style.x+this._fillerShape.style.width,this._endMask.style.x=this._endShape.style.x,this._endMask.style.width=e+i-this._endShape.style.x,this._range.start=Math.ceil(100-(this._startShape.style.x-e)/i*100),this._range.end=Math.floor(100-(this._endShape.style.x-e)/i*100)):(this._startShape.style.y=this._fillerShape.style.y,this._startMask.style.height=this._startShape.style.y-t,this._endShape.style.y=this._fillerShape.style.y+this._fillerShape.style.height,this._endMask.style.y=this._endShape.style.y,this._endMask.style.height=t+n-this._endShape.style.y,this._range.start=Math.ceil(100-(this._startShape.style.y-t)/n*100),this._range.end=Math.floor(100-(this._endShape.style.y-t)/n*100)),this._syncShape()},_syncFillerShape:function(e){var t,i,n=this._calculableLocation.x,a=this._calculableLocation.y,o=this._calculableLocation.width,r=this._calculableLocation.height;"horizontal"==this.dataRangeOption.orient?(t=this._startShape.style.x,i=this._endShape.style.x,e.id==this._startShape.id&&t>=i?(i=t,this._endShape.style.x=t):e.id==this._endShape.id&&t>=i&&(t=i,this._startShape.style.x=t),this._fillerShape.style.x=t,this._fillerShape.style.width=i-t,this._startMask.style.width=t-n,this._endMask.style.x=i,this._endMask.style.width=n+o-i,this._range.start=Math.ceil(100-(t-n)/o*100),this._range.end=Math.floor(100-(i-n)/o*100)):(t=this._startShape.style.y,i=this._endShape.style.y,e.id==this._startShape.id&&t>=i?(i=t,this._endShape.style.y=t):e.id==this._endShape.id&&t>=i&&(t=i,this._startShape.style.y=t),this._fillerShape.style.y=t,this._fillerShape.style.height=i-t,this._startMask.style.height=t-a,this._endMask.style.y=i,this._endMask.style.height=a+r-i,this._range.start=Math.ceil(100-(t-a)/r*100),this._range.end=Math.floor(100-(i-a)/r*100)),this._syncShape()},_syncShape:function(){this._startShape.position=[this._startShape.style.x-this._startShape.style._x,this._startShape.style.y-this._startShape.style._y],this._startShape.style.text=this._textFormat(this._gap*this._range.start+this.dataRangeOption.min),this._startShape.style.color=this._startShape.highlightStyle.strokeColor=this.getColor(this._gap*this._range.start+this.dataRangeOption.min),this._endShape.position=[this._endShape.style.x-this._endShape.style._x,this._endShape.style.y-this._endShape.style._y],this._endShape.style.text=this._textFormat(this._gap*this._range.end+this.dataRangeOption.min),this._endShape.style.color=this._endShape.highlightStyle.strokeColor=this.getColor(this._gap*this._range.end+this.dataRangeOption.min),this.zr.modShape(this._startShape.id),this.zr.modShape(this._endShape.id),this.zr.modShape(this._startMask.id),this.zr.modShape(this._endMask.id),this.zr.modShape(this._fillerShape.id),this.zr.refreshNextFrame()},_dispatchDataRange:function(){this.messageCenter.dispatch(r.EVENT.DATA_RANGE,null,{range:{start:this._range.end,end:this._range.start}},this.myChart)},__dataRangeSelected:function(e){if("single"===this.dataRangeOption.selectedMode)for(var t in this._selectedMap)this._selectedMap[t]=!1;var i=e.target._idx;this._selectedMap[i]=!this._selectedMap[i];var n,a;this._useCustomizedSplit()?(n=this._splitList[i].max,a=this._splitList[i].min):(n=(this._colorList.length-i)*this._gap+this.dataRangeOption.min,a=n-this._gap),this.messageCenter.dispatch(r.EVENT.DATA_RANGE_SELECTED,e.event,{selected:this._selectedMap,target:i,valueMax:n,valueMin:a},this.myChart),this.messageCenter.dispatch(r.EVENT.REFRESH,null,null,this.myChart)},__dispatchHoverLink:function(e){var t,i;if(this.dataRangeOption.calculable){var n,a=this.dataRangeOption.max-this.dataRangeOption.min;n="horizontal"==this.dataRangeOption.orient?(1-(l.getX(e.event)-this._calculableLocation.x)/this._calculableLocation.width)*a:(1-(l.getY(e.event)-this._calculableLocation.y)/this._calculableLocation.height)*a,t=n-.05*a,i=n+.05*a}else if(this._useCustomizedSplit()){var o=e.target._idx;i=this._splitList[o].max,t=this._splitList[o].min}else{var o=e.target._idx;i=(this._colorList.length-o)*this._gap+this.dataRangeOption.min,t=i-this._gap}this.messageCenter.dispatch(r.EVENT.DATA_RANGE_HOVERLINK,e.event,{valueMin:t,valueMax:i},this.myChart)},__onhoverlink:function(e){if(this.dataRangeOption.show&&this.dataRangeOption.hoverLink&&this._indicatorShape&&e&&null!=e.seriesIndex&&null!=e.dataIndex){var t=e.value;if(""===t||isNaN(t))return;tthis.dataRangeOption.max&&(t=this.dataRangeOption.max),this._indicatorShape.position="horizontal"==this.dataRangeOption.orient?[(this.dataRangeOption.max-t)/(this.dataRangeOption.max-this.dataRangeOption.min)*this._calculableLocation.width,0]:[0,(this.dataRangeOption.max-t)/(this.dataRangeOption.max-this.dataRangeOption.min)*this._calculableLocation.height],this._indicatorShape.style.text=this._textFormat(e.value),this._indicatorShape.style.color=this.getColor(t),this.zr.addHoverShape(this._indicatorShape)}},_textFormat:function(e,t){var i=this.dataRangeOption;if(e!==-Number.MAX_VALUE&&(e=(+e).toFixed(i.precision)),null!=t&&t!==Number.MAX_VALUE&&(t=(+t).toFixed(i.precision)),i.formatter){if("string"==typeof i.formatter)return i.formatter.replace("{value}",e===-Number.MAX_VALUE?"min":e).replace("{value2}",t===Number.MAX_VALUE?"max":t);if("function"==typeof i.formatter)return i.formatter.call(this.myChart,e,t)}return null==t?e:e===-Number.MAX_VALUE?"< "+t:t===Number.MAX_VALUE?"> "+e:e+" - "+t},_isContinuity:function(){var e=this.dataRangeOption;return!(e.splitList?e.splitList.length>0:e.splitNumber>0)||e.calculable},_useCustomizedSplit:function(){var e=this.dataRangeOption;return e.splitList&&e.splitList.length>0},_buildColorList:function(e){if(this._colorList=m.getGradientColors(this.dataRangeOption.color,Math.max((e-this.dataRangeOption.color.length)/(this.dataRangeOption.color.length-1),0)+1),this._colorList.length>e){for(var t=this._colorList.length,i=[this._colorList[0]],n=t/(e-1),a=1;e-1>a;a++)i.push(this._colorList[Math.floor(a*n)]);i.push(this._colorList[t-1]),this._colorList=i}if(this._useCustomizedSplit())for(var o=this._splitList,a=0,t=o.length;t>a;a++)o[a].color&&(this._colorList[a]=o[a].color)},_buildGap:function(e){if(!this._useCustomizedSplit()){var t=this.dataRangeOption.precision;for(this._gap=(this.dataRangeOption.max-this.dataRangeOption.min)/e;this._gap.toFixed(t)-0!=this._gap&&5>t;)t++;this.dataRangeOption.precision=t,this._gap=((this.dataRangeOption.max-this.dataRangeOption.min)/e).toFixed(t)-0}},_buildDataList:function(e){for(var t=this._valueTextList=[],i=this.dataRangeOption,n=this._useCustomizedSplit(),a=0;e>a;a++){this._selectedMap[a]=!0;var o="";if(n){var r=this._splitList[e-1-a];o=null!=r.label?r.label:null!=r.single?this._textFormat(r.single):this._textFormat(r.min,r.max)}else o=this._textFormat(a*this._gap+i.min,(a+1)*this._gap+i.min);t.unshift(o)}},_buildSplitList:function(){if(this._useCustomizedSplit())for(var e=this.dataRangeOption.splitList,t=this._splitList=[],i=0,n=e.length;n>i;i++){var a=e[i];if(!a||null==a.start&&null==a.end)throw new Error("Empty item exists in splitList!");var o={label:a.label,color:a.color};o.min=a.start,o.max=a.end,o.min>o.max&&(o.min=[o.max,o.max=o.min][0]),o.min===o.max&&(o.single=o.max),null==o.min&&(o.min=-Number.MAX_VALUE),null==o.max&&(o.max=Number.MAX_VALUE),t.push(o)}},refresh:function(e){if(e){this.option=e,this.option.dataRange=this.reformOption(this.option.dataRange);var t=this.dataRangeOption=this.option.dataRange;if(!this._useCustomizedSplit()&&(null==t.min||null==t.max))throw new Error("option.dataRange.min or option.dataRange.max has not been defined.");this.myChart.canvasSupported||(t.realtime=!1);var i=this._isContinuity()?100:this._useCustomizedSplit()?t.splitList.length:t.splitNumber;this._buildSplitList(),this._buildColorList(i),this._buildGap(i),this._buildDataList(i)}this.clear(),this._buildShape()},getColor:function(e){if(isNaN(e))return null;var t;if(this._useCustomizedSplit()){for(var i=this._splitList,n=0,a=i.length;a>n;n++)if(i[n].min<=e&&i[n].max>=e){t=n;break}}else{if(this.dataRangeOption.min==this.dataRangeOption.max)return this._colorList[0];if(ethis.dataRangeOption.max&&(e=this.dataRangeOption.max),this.dataRangeOption.calculable&&(e-(this._gap*this._range.start+this.dataRangeOption.min)>5e-5||e-(this._gap*this._range.end+this.dataRangeOption.min)<-5e-5))return null;t=this._colorList.length-Math.ceil((e-this.dataRangeOption.min)/(this.dataRangeOption.max-this.dataRangeOption.min)*this._colorList.length),t==this._colorList.length&&t--}return this._selectedMap[t]?this._colorList[t]:null},getColorByIndex:function(e){return e>=this._colorList.length?e=this._colorList.length-1:0>e&&(e=0),this._colorList[e]},onbeforDispose:function(){this.messageCenter.unbind(r.EVENT.HOVER,this._onhoverlink)}},s.inherits(t,i),e("../component").define("dataRange",t),t}),i("echarts/util/shape/HandlePolygon",["require","zrender/shape/Base","zrender/shape/Polygon","zrender/tool/util"],function(e){function t(e){i.call(this,e)}var i=e("zrender/shape/Base"),n=e("zrender/shape/Polygon"),a=e("zrender/tool/util");return t.prototype={type:"handle-polygon",buildPath:function(e,t){n.prototype.buildPath(e,t)},isCover:function(e,t){var i=this.transformCoordToLocal(e,t);e=i[0],t=i[1];var n=this.style.rect;return e>=n.x&&e<=n.x+n.width&&t>=n.y&&t<=n.y+n.height?!0:!1}},a.inherits(t,i),t}),i("echarts/chart/k",["require","./base","../util/shape/Candle","../component/axis","../component/grid","../component/dataZoom","../config","../util/ecData","zrender/tool/util","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("../util/shape/Candle");e("../component/axis"),e("../component/grid"),e("../component/dataZoom");var a=e("../config");a.k={zlevel:0,z:2,clickable:!0,hoverable:!0,legendHoverLink:!1,xAxisIndex:0,yAxisIndex:0,itemStyle:{normal:{color:"#fff",color0:"#00aa11",lineStyle:{width:1,color:"#ff3200",color0:"#00aa11"},label:{show:!1}},emphasis:{label:{show:!1}}}};var o=e("../util/ecData"),r=e("zrender/tool/util");return t.prototype={type:a.CHART_TYPE_K,_buildShape:function(){var e=this.series;this.selectedMap={};for(var t,i={top:[],bottom:[]},n=0,o=e.length;o>n;n++)e[n].type===a.CHART_TYPE_K&&(e[n]=this.reformOption(e[n]),this.legendHoverLink=e[n].legendHoverLink||this.legendHoverLink,t=this.component.xAxis.getAxis(e[n].xAxisIndex),t.type===a.COMPONENT_TYPE_AXIS_CATEGORY&&i[t.getPosition()].push(n));for(var r in i)i[r].length>0&&this._buildSinglePosition(r,i[r]);this.addShapeList()},_buildSinglePosition:function(e,t){var i=this._mapData(t),n=i.locationMap,a=i.maxDataLength;if(0!==a&&0!==n.length){this._buildHorizontal(t,a,n);for(var o=0,r=t.length;r>o;o++)this.buildMark(t[o])}},_mapData:function(e){for(var t,i,n=this.series,a=this.component.legend,o=[],r=0,s=0,l=e.length;l>s;s++)t=n[e[s]],i=t.name,this.selectedMap[i]=a?a.isSelected(i):!0,this.selectedMap[i]&&o.push(e[s]),r=Math.max(r,t.data.length);return{locationMap:o,maxDataLength:r}},_buildHorizontal:function(e,t,i){for(var n,a,o,r,s,l,h,m,V,U,d=this.series,p={},c=0,u=i.length;u>c;c++){n=i[c],a=d[n],o=a.xAxisIndex||0,r=this.component.xAxis.getAxis(o),h=a.barWidth||Math.floor(r.getGap()/2),U=a.barMaxWidth,U&&h>U&&(h=U),s=a.yAxisIndex||0,l=this.component.yAxis.getAxis(s),p[n]=[];for(var y=0,g=t;g>y&&null!=r.getNameByIndex(y);y++)m=a.data[y],V=this.getDataFromOption(m,"-"),"-"!==V&&4==V.length&&p[n].push([r.getCoordByIndex(y),h,l.getCoord(V[0]),l.getCoord(V[1]),l.getCoord(V[2]),l.getCoord(V[3]),y,r.getNameByIndex(y)])}this._buildKLine(e,p)},_buildKLine:function(e,t){for(var i,n,o,r,s,l,h,m,V,U,d,p,c,u,y,g,b,f=this.series,k=0,x=e.length;x>k;k++)if(b=e[k],d=f[b],u=t[b],this._isLarge(u)&&(u=this._getLargePointList(u)),d.type===a.CHART_TYPE_K&&null!=u){p=d,i=this.query(p,"itemStyle.normal.lineStyle.width"),n=this.query(p,"itemStyle.normal.lineStyle.color"),o=this.query(p,"itemStyle.normal.lineStyle.color0"),r=this.query(p,"itemStyle.normal.color"),s=this.query(p,"itemStyle.normal.color0"),l=this.query(p,"itemStyle.emphasis.lineStyle.width"),h=this.query(p,"itemStyle.emphasis.lineStyle.color"),m=this.query(p,"itemStyle.emphasis.lineStyle.color0"),V=this.query(p,"itemStyle.emphasis.color"),U=this.query(p,"itemStyle.emphasis.color0");for(var _=0,L=u.length;L>_;_++)y=u[_],c=d.data[y[6]],p=c,g=y[3]a;a++)n[a]=e[Math.floor(i/t*a)];return n},_getCandle:function(e,t,i,a,r,s,l,h,m,V,U,d,p,c,u){var y=this.series,g=y[e],b=g.data[t],f=[b,g],k={zlevel:g.zlevel,z:g.z,clickable:this.deepQuery(f,"clickable"),hoverable:this.deepQuery(f,"hoverable"),style:{x:a,y:[s,l,h,m],width:r,color:V,strokeColor:d,lineWidth:U,brushType:"both"},highlightStyle:{color:p,strokeColor:u,lineWidth:c},_seriesIndex:e};return k=this.addLabel(k,g,b,i),o.pack(k,g,e,b,t,i),k=new n(k)},getMarkCoord:function(e,t){var i=this.series[e],n=this.component.xAxis.getAxis(i.xAxisIndex),a=this.component.yAxis.getAxis(i.yAxisIndex);return["string"!=typeof t.xAxis&&n.getCoordByIndex?n.getCoordByIndex(t.xAxis||0):n.getCoord(t.xAxis||0),"string"!=typeof t.yAxis&&a.getCoordByIndex?a.getCoordByIndex(t.yAxis||0):a.getCoord(t.yAxis||0)]},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()},addDataAnimation:function(e,t){function i(){p--,0===p&&t&&t()}for(var n=this.series,a={},r=0,s=e.length;s>r;r++)a[e[r][0]]=e[r];for(var l,h,m,V,U,d,p=0,r=0,s=this.shapeList.length;s>r;r++)if(U=this.shapeList[r]._seriesIndex,a[U]&&!a[U][3]&&"candle"===this.shapeList[r].type){if(d=o.get(this.shapeList[r],"dataIndex"),V=n[U],a[U][2]&&d===V.data.length-1){this.zr.delShape(this.shapeList[r].id);continue}if(!a[U][2]&&0===d){this.zr.delShape(this.shapeList[r].id);continue}h=this.component.xAxis.getAxis(V.xAxisIndex||0).getGap(),l=a[U][2]?h:-h,m=0,p++,this.zr.animate(this.shapeList[r].id,"").when(this.query(this.option,"animationDurationUpdate"),{position:[l,m]}).done(i).start()}p||t&&t()}},r.inherits(t,i),e("../chart").define("k",t),t}),i("echarts/chart/pie",["require","./base","zrender/shape/Text","zrender/shape/Ring","zrender/shape/Circle","zrender/shape/Sector","zrender/shape/Polyline","../config","../util/ecData","zrender/tool/util","zrender/tool/math","zrender/tool/color","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o);var r=this;r.shapeHandler.onmouseover=function(e){var t=e.target,i=h.get(t,"seriesIndex"),n=h.get(t,"dataIndex"),a=h.get(t,"special"),o=[t.style.x,t.style.y],s=t.style.startAngle,l=t.style.endAngle,m=((l+s)/2+360)%360,V=t.highlightStyle.color,U=r.getLabel(i,n,a,o,m,V,!0);U&&r.zr.addHoverShape(U);var d=r.getLabelLine(i,n,o,t.style.r0,t.style.r,m,V,!0);d&&r.zr.addHoverShape(d)},this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Ring"),o=e("zrender/shape/Circle"),r=e("zrender/shape/Sector"),s=e("zrender/shape/Polyline"),l=e("../config");l.pie={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,center:["50%","50%"],radius:[0,"75%"],clockWise:!0,startAngle:90,minAngle:0,selectedOffset:10,itemStyle:{normal:{borderColor:"rgba(0,0,0,0)",borderWidth:1,label:{show:!0,position:"outer"},labelLine:{show:!0,length:20,lineStyle:{width:1,type:"solid"}}},emphasis:{borderColor:"rgba(0,0,0,0)",borderWidth:1,label:{show:!1},labelLine:{show:!1,length:20,lineStyle:{width:1,type:"solid"}}}}};var h=e("../util/ecData"),m=e("zrender/tool/util"),V=e("zrender/tool/math"),U=e("zrender/tool/color");return t.prototype={type:l.CHART_TYPE_PIE,_buildShape:function(){var e=this.series,t=this.component.legend;this.selectedMap={},this._selected={};var i,n,r;this._selectedMode=!1;for(var s,m=0,V=e.length;V>m;m++)if(e[m].type===l.CHART_TYPE_PIE){if(e[m]=this.reformOption(e[m]),this.legendHoverLink=e[m].legendHoverLink||this.legendHoverLink,s=e[m].name||"",this.selectedMap[s]=t?t.isSelected(s):!0,!this.selectedMap[s])continue;i=this.parseCenter(this.zr,e[m].center),n=this.parseRadius(this.zr,e[m].radius),this._selectedMode=this._selectedMode||e[m].selectedMode,this._selected[m]=[],this.deepQuery([e[m],this.option],"calculable")&&(r={zlevel:e[m].zlevel,z:e[m].z,hoverable:!1,style:{x:i[0],y:i[1],r0:n[0]<=10?0:n[0]-10,r:n[1]+10,brushType:"stroke",lineWidth:1,strokeColor:e[m].calculableHolderColor||this.ecTheme.calculableHolderColor||l.calculableHolderColor}},h.pack(r,e[m],m,void 0,-1),this.setCalculable(r),r=n[0]<=10?new o(r):new a(r),this.shapeList.push(r)),this._buildSinglePie(m),this.buildMark(m)}this.addShapeList()},_buildSinglePie:function(e){for(var t,i=this.series,n=i[e],a=n.data,o=this.component.legend,r=0,s=0,l=0,h=Number.NEGATIVE_INFINITY,m=[],V=0,U=a.length;U>V;V++)t=a[V].name, +this.selectedMap[t]=o?o.isSelected(t):!0,this.selectedMap[t]&&!isNaN(a[V].value)&&(0!==+a[V].value?r++:s++,l+=+a[V].value,h=Math.max(h,+a[V].value));if(0!==l){for(var d,p,c,u,y,g,b=100,f=n.clockWise,k=(n.startAngle.toFixed(2)-0+360)%360,x=n.minAngle||.01,_=360-x*r-.01*s,L=n.roseType,V=0,U=a.length;U>V;V++)if(t=a[V].name,this.selectedMap[t]&&!isNaN(a[V].value)){if(p=o?o.getColor(t):this.zr.getColor(V),b=a[V].value/l,d="area"!=L?f?k-b*_-(0!==b?x:.01):b*_+k+(0!==b?x:.01):f?k-360/U:360/U+k,d=d.toFixed(2)-0,b=(100*b).toFixed(2),c=this.parseCenter(this.zr,n.center),u=this.parseRadius(this.zr,n.radius),y=+u[0],g=+u[1],"radius"===L?g=a[V].value/h*(g-y)*.8+.2*(g-y)+y:"area"===L&&(g=Math.sqrt(a[V].value/h)*(g-y)+y),f){var W;W=k,k=d,d=W}this._buildItem(m,e,V,b,a[V].selected,c,y,g,k,d,p),f||(k=d)}this._autoLabelLayout(m,c,g);for(var V=0,U=m.length;U>V;V++)this.shapeList.push(m[V]);m=null}},_buildItem:function(e,t,i,n,a,o,r,s,l,m,V){var U=this.series,d=((m+l)/2+360)%360,p=this.getSector(t,i,n,a,o,r,s,l,m,V);h.pack(p,U[t],t,U[t].data[i],i,U[t].data[i].name,n),e.push(p);var c=this.getLabel(t,i,n,o,d,V,!1),u=this.getLabelLine(t,i,o,r,s,d,V,!1);u&&(h.pack(u,U[t],t,U[t].data[i],i,U[t].data[i].name,n),e.push(u)),c&&(h.pack(c,U[t],t,U[t].data[i],i,U[t].data[i].name,n),c._labelLine=u,e.push(c))},getSector:function(e,t,i,n,a,o,s,l,h,m){var d=this.series,p=d[e],c=p.data[t],u=[c,p],y=this.deepMerge(u,"itemStyle.normal")||{},g=this.deepMerge(u,"itemStyle.emphasis")||{},b=this.getItemStyleColor(y.color,e,t,c)||m,f=this.getItemStyleColor(g.color,e,t,c)||("string"==typeof b?U.lift(b,-.2):b),k={zlevel:p.zlevel,z:p.z,clickable:this.deepQuery(u,"clickable"),style:{x:a[0],y:a[1],r0:o,r:s,startAngle:l,endAngle:h,brushType:"both",color:b,lineWidth:y.borderWidth,strokeColor:y.borderColor,lineJoin:"round"},highlightStyle:{color:f,lineWidth:g.borderWidth,strokeColor:g.borderColor,lineJoin:"round"},_seriesIndex:e,_dataIndex:t};if(n){var x=((k.style.startAngle+k.style.endAngle)/2).toFixed(2)-0;k.style._hasSelected=!0,k.style._x=k.style.x,k.style._y=k.style.y;var _=this.query(p,"selectedOffset");k.style.x+=V.cos(x,!0)*_,k.style.y-=V.sin(x,!0)*_,this._selected[e][t]=!0}else this._selected[e][t]=!1;return this._selectedMode&&(k.onclick=this.shapeHandler.onclick),this.deepQuery([c,p,this.option],"calculable")&&(this.setCalculable(k),k.draggable=!0),(this._needLabel(p,c,!0)||this._needLabelLine(p,c,!0))&&(k.onmouseover=this.shapeHandler.onmouseover),k=new r(k)},getLabel:function(e,t,i,a,o,r,s){var l=this.series,h=l[e],U=h.data[t];if(this._needLabel(h,U,s)){var d,p,c,u=s?"emphasis":"normal",y=m.merge(m.clone(U.itemStyle)||{},h.itemStyle),g=y[u].label,b=g.textStyle||{},f=a[0],k=a[1],x=this.parseRadius(this.zr,h.radius),_="middle";g.position=g.position||y.normal.label.position,"center"===g.position?(d=f,p=k,c="center"):"inner"===g.position||"inside"===g.position?(x=(x[0]+x[1])*(g.distance||.5),d=Math.round(f+x*V.cos(o,!0)),p=Math.round(k-x*V.sin(o,!0)),r="#fff",c="center"):(x=x[1]- -y[u].labelLine.length,d=Math.round(f+x*V.cos(o,!0)),p=Math.round(k-x*V.sin(o,!0)),c=o>=90&&270>=o?"right":"left"),"center"!=g.position&&"inner"!=g.position&&"inside"!=g.position&&(d+="left"===c?20:-20),U.__labelX=d-("left"===c?5:-5),U.__labelY=p;var L=new n({zlevel:h.zlevel,z:h.z+1,hoverable:!1,style:{x:d,y:p,color:b.color||r,text:this.getLabelText(e,t,i,u),textAlign:b.align||c,textBaseline:b.baseline||_,textFont:this.getFont(b)},highlightStyle:{brushType:"fill"}});return L._radius=x,L._labelPosition=g.position||"outer",L._rect=L.getRect(L.style),L._seriesIndex=e,L._dataIndex=t,L}},getLabelText:function(e,t,i,n){var a=this.series,o=a[e],r=o.data[t],s=this.deepQuery([r,o],"itemStyle."+n+".label.formatter");return s?"function"==typeof s?s.call(this.myChart,{seriesIndex:e,seriesName:o.name||"",series:o,dataIndex:t,data:r,name:r.name,value:r.value,percent:i}):"string"==typeof s?(s=s.replace("{a}","{a0}").replace("{b}","{b0}").replace("{c}","{c0}").replace("{d}","{d0}"),s=s.replace("{a0}",o.name).replace("{b0}",r.name).replace("{c0}",r.value).replace("{d0}",i)):void 0:r.name},getLabelLine:function(e,t,i,n,a,o,r,l){var h=this.series,U=h[e],d=U.data[t];if(this._needLabelLine(U,d,l)){var p=l?"emphasis":"normal",c=m.merge(m.clone(d.itemStyle)||{},U.itemStyle),u=c[p].labelLine,y=u.lineStyle||{},g=i[0],b=i[1],f=a,k=this.parseRadius(this.zr,U.radius)[1]- -u.length,x=V.cos(o,!0),_=V.sin(o,!0);return new s({zlevel:U.zlevel,z:U.z+1,hoverable:!1,style:{pointList:[[g+f*x,b-f*_],[g+k*x,b-k*_],[d.__labelX,d.__labelY]],strokeColor:y.color||r,lineType:y.type,lineWidth:y.width},_seriesIndex:e,_dataIndex:t})}},_needLabel:function(e,t,i){return this.deepQuery([t,e],"itemStyle."+(i?"emphasis":"normal")+".label.show")},_needLabelLine:function(e,t,i){return this.deepQuery([t,e],"itemStyle."+(i?"emphasis":"normal")+".labelLine.show")},_autoLabelLayout:function(e,t,i){for(var n=[],a=[],o=0,r=e.length;r>o;o++)("outer"===e[o]._labelPosition||"outside"===e[o]._labelPosition)&&(e[o]._rect._y=e[o]._rect.y,e[o]._rect.xa;a++)if(e[a]._rect.y+=n,e[a].style.y+=n,e[a]._labelLine&&(e[a]._labelLine.style.pointList[1][1]+=n,e[a]._labelLine.style.pointList[2][1]+=n),a>t&&i>a+1&&e[a+1]._rect.y>e[a]._rect.y+e[a]._rect.height)return void o(a,n/2);o(i-1,n/2)}function o(t,i){for(var n=t;n>=0&&(e[n]._rect.y-=i,e[n].style.y-=i,e[n]._labelLine&&(e[n]._labelLine.style.pointList[1][1]-=i,e[n]._labelLine.style.pointList[2][1]-=i),!(n>0&&e[n]._rect.y>e[n-1]._rect.y+e[n-1]._rect.height));n--);}function r(e,t,i,n,a){for(var o,r,s,l=i[0],h=i[1],m=a>0?t?Number.MAX_VALUE:0:t?Number.MAX_VALUE:0,V=0,U=e.length;U>V;V++)r=Math.abs(e[V]._rect.y-h),s=e[V]._radius-n,o=n+s>r?Math.sqrt((n+s+20)*(n+s+20)-Math.pow(e[V]._rect.y-h,2)):Math.abs(e[V]._rect.x+(a>0?0:e[V]._rect.width)-l),t&&o>=m&&(o=m-10),!t&&m>=o&&(o=m+10),e[V]._rect.x=e[V].style.x=l+o*a,e[V]._labelLine&&(e[V]._labelLine.style.pointList[2][0]=l+(o-5)*a,e[V]._labelLine.style.pointList[1][0]=l+(o-20)*a),m=o}e.sort(function(e,t){return e._rect.y-t._rect.y});for(var s,l=0,h=e.length,m=[],V=[],U=0;h>U;U++)s=e[U]._rect.y-l,0>s&&a(U,h,-s,n),l=e[U]._rect.y+e[U]._rect.height;this.zr.getHeight()-l<0&&o(h-1,l-this.zr.getHeight());for(var U=0;h>U;U++)e[U]._rect.y>=t[1]?V.push(e[U]):m.push(e[U]);r(V,!0,t,i,n),r(m,!1,t,i,n)},reformOption:function(e){var t=m.merge;return e=t(t(e||{},m.clone(this.ecTheme.pie||{})),m.clone(l.pie)),e.itemStyle.normal.label.textStyle=this.getTextStyle(e.itemStyle.normal.label.textStyle),e.itemStyle.emphasis.label.textStyle=this.getTextStyle(e.itemStyle.emphasis.label.textStyle),this.z=e.z,this.zlevel=e.zlevel,e},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()},addDataAnimation:function(e,t){function i(){s--,0===s&&t&&t()}for(var n=this.series,a={},o=0,r=e.length;r>o;o++)a[e[o][0]]=e[o];var s=0,h={},m={},V={},U=this.shapeList;this.shapeList=[];for(var d,p,c,u={},o=0,r=e.length;r>o;o++)d=e[o][0],p=e[o][2],c=e[o][3],n[d]&&n[d].type===l.CHART_TYPE_PIE&&(p?(c||(h[d+"_"+n[d].data.length]="delete"),u[d]=1):c?u[d]=0:(h[d+"_-1"]="delete",u[d]=-1),this._buildSinglePie(d));for(var y,g,o=0,r=this.shapeList.length;r>o;o++)switch(d=this.shapeList[o]._seriesIndex,y=this.shapeList[o]._dataIndex,g=d+"_"+y,this.shapeList[o].type){case"sector":h[g]=this.shapeList[o];break;case"text":m[g]=this.shapeList[o];break;case"polyline":V[g]=this.shapeList[o]}this.shapeList=[];for(var b,o=0,r=U.length;r>o;o++)if(d=U[o]._seriesIndex,a[d]){if(y=U[o]._dataIndex+u[d],g=d+"_"+y,b=h[g],!b)continue;if("sector"===U[o].type)"delete"!=b?(s++,this.zr.animate(U[o].id,"style").when(400,{startAngle:b.style.startAngle,endAngle:b.style.endAngle}).done(i).start()):(s++,this.zr.animate(U[o].id,"style").when(400,u[d]<0?{startAngle:U[o].style.startAngle}:{endAngle:U[o].style.endAngle}).done(i).start());else if("text"===U[o].type||"polyline"===U[o].type)if("delete"===b)this.zr.delShape(U[o].id);else switch(U[o].type){case"text":s++,b=m[g],this.zr.animate(U[o].id,"style").when(400,{x:b.style.x,y:b.style.y}).done(i).start();break;case"polyline":s++,b=V[g],this.zr.animate(U[o].id,"style").when(400,{pointList:b.style.pointList}).done(i).start()}}this.shapeList=U,s||t&&t()},onclick:function(e){var t=this.series;if(this.isClick&&e.target){this.isClick=!1;for(var i,n=e.target,a=n.style,o=h.get(n,"seriesIndex"),r=h.get(n,"dataIndex"),s=0,m=this.shapeList.length;m>s;s++)if(this.shapeList[s].id===n.id){if(o=h.get(n,"seriesIndex"),r=h.get(n,"dataIndex"),a._hasSelected)n.style.x=n.style._x,n.style.y=n.style._y,n.style._hasSelected=!1,this._selected[o][r]=!1;else{var U=((a.startAngle+a.endAngle)/2).toFixed(2)-0;n.style._hasSelected=!0,this._selected[o][r]=!0,n.style._x=n.style.x,n.style._y=n.style.y,i=this.query(t[o],"selectedOffset"),n.style.x+=V.cos(U,!0)*i,n.style.y-=V.sin(U,!0)*i}this.zr.modShape(n.id)}else this.shapeList[s].style._hasSelected&&"single"===this._selectedMode&&(o=h.get(this.shapeList[s],"seriesIndex"),r=h.get(this.shapeList[s],"dataIndex"),this.shapeList[s].style.x=this.shapeList[s].style._x,this.shapeList[s].style.y=this.shapeList[s].style._y,this.shapeList[s].style._hasSelected=!1,this._selected[o][r]=!1,this.zr.modShape(this.shapeList[s].id));this.messageCenter.dispatch(l.EVENT.PIE_SELECTED,e.event,{selected:this._selected,target:h.get(n,"name")},this.myChart),this.zr.refreshNextFrame()}}},m.inherits(t,i),e("../chart").define("pie",t),t}),i("echarts/chart/radar",["require","./base","zrender/shape/Polygon","../component/polar","../config","../util/ecData","zrender/tool/util","zrender/tool/color","../util/accMath","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Polygon");e("../component/polar");var a=e("../config");a.radar={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,polarIndex:0,itemStyle:{normal:{label:{show:!1},lineStyle:{width:2,type:"solid"}},emphasis:{label:{show:!1}}},symbolSize:2};var o=e("../util/ecData"),r=e("zrender/tool/util"),s=e("zrender/tool/color");return t.prototype={type:a.CHART_TYPE_RADAR,_buildShape:function(){this.selectedMap={},this._symbol=this.option.symbolList,this._queryTarget,this._dropBoxList=[],this._radarDataCounter=0;for(var e,t=this.series,i=this.component.legend,n=0,o=t.length;o>n;n++)t[n].type===a.CHART_TYPE_RADAR&&(this.serie=this.reformOption(t[n]),this.legendHoverLink=t[n].legendHoverLink||this.legendHoverLink,e=this.serie.name||"",this.selectedMap[e]=i?i.isSelected(e):!0,this.selectedMap[e]&&(this._queryTarget=[this.serie,this.option],this.deepQuery(this._queryTarget,"calculable")&&this._addDropBox(n),this._buildSingleRadar(n),this.buildMark(n)));this.addShapeList()},_buildSingleRadar:function(e){for(var t,i,n,a,o=this.component.legend,r=this.serie.data,s=this.deepQuery(this._queryTarget,"calculable"),l=0;lr;r++)n=this.getDataFromOption(t.value[r]),i="-"!=n?o.getVector(e,r,n):!1,i&&a.push(i);return a},_addSymbol:function(e,t,i,n,a){for(var r,s=this.series,l=this.component.polar,h=0,m=e.length;m>h;h++)r=this.getSymbolShape(this.deepMerge([s[n].data[i],s[n]]),n,s[n].data[i].value[h],h,l.getIndicatorText(a,h),e[h][0],e[h][1],this._symbol[this._radarDataCounter%this._symbol.length],t,"#fff","vertical"),r.zlevel=this.getZlevelBase(),r.z=this.getZBase()+1,o.set(r,"data",s[n].data[i]),o.set(r,"value",s[n].data[i].value),o.set(r,"dataIndex",i),o.set(r,"special",h),this.shapeList.push(r)},_addDataShape:function(e,t,i,a,r,l){var h=this.series,m=[i,this.serie],V=this.getItemStyleColor(this.deepQuery(m,"itemStyle.normal.color"),a,r,i),U=this.deepQuery(m,"itemStyle.normal.lineStyle.width"),d=this.deepQuery(m,"itemStyle.normal.lineStyle.type"),p=this.deepQuery(m,"itemStyle.normal.areaStyle.color"),c=this.deepQuery(m,"itemStyle.normal.areaStyle"),u={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{pointList:e,brushType:c?"both":"stroke",color:p||V||("string"==typeof t?s.alpha(t,.5):t),strokeColor:V||t,lineWidth:U,lineType:d},highlightStyle:{brushType:this.deepQuery(m,"itemStyle.emphasis.areaStyle")||c?"both":"stroke",color:this.deepQuery(m,"itemStyle.emphasis.areaStyle.color")||p||V||("string"==typeof t?s.alpha(t,.5):t),strokeColor:this.getItemStyleColor(this.deepQuery(m,"itemStyle.emphasis.color"),a,r,i)||V||t,lineWidth:this.deepQuery(m,"itemStyle.emphasis.lineStyle.width")||U,lineType:this.deepQuery(m,"itemStyle.emphasis.lineStyle.type")||d}};o.pack(u,h[a],a,i,r,i.name,this.component.polar.getIndicator(h[a].polarIndex)),l&&(u.draggable=!0,this.setCalculable(u)),u=new n(u),this.shapeList.push(u)},_addDropBox:function(e){var t=this.series,i=this.deepQuery(this._queryTarget,"polarIndex");if(!this._dropBoxList[i]){var n=this.component.polar.getDropBox(i);n.zlevel=this.getZlevelBase(),n.z=this.getZBase(),this.setCalculable(n),o.pack(n,t,e,void 0,-1),this.shapeList.push(n),this._dropBoxList[i]=!0}},ondragend:function(e,t){var i=this.series;if(this.isDragend&&e.target){var n=e.target,a=o.get(n,"seriesIndex"),r=o.get(n,"dataIndex");this.component.legend&&this.component.legend.del(i[a].data[r].name),i[a].data.splice(r,1),t.dragOut=!0,t.needRefresh=!0,this.isDragend=!1}},ondrop:function(t,i){var n=this.series;if(this.isDrop&&t.target){var a,r,s=t.target,l=t.dragged,h=o.get(s,"seriesIndex"),m=o.get(s,"dataIndex"),V=this.component.legend;if(-1===m)a={value:o.get(l,"value"),name:o.get(l,"name")},n[h].data.push(a),V&&V.add(a.name,l.style.color||l.style.strokeColor);else{var U=e("../util/accMath");a=n[h].data[m],V&&V.del(a.name),a.name+=this.option.nameConnector+o.get(l,"name"),r=o.get(l,"value");for(var d=0;dh;h++)t=m.polar2cartesian(s,o*Math.PI/180+r*h),l.push({vector:[t[1],-t[0]]})},_getRadius:function(){var e=this.polar[this._index];return this.parsePercent(e.radius,Math.min(this.zr.getWidth(),this.zr.getHeight())/2)},_buildSpiderWeb:function(e){var t=this.polar[e],i=t.__ecIndicator,n=t.splitArea,a=t.splitLine,o=this.getCenter(e),r=t.splitNumber,s=a.lineStyle.color,l=a.lineStyle.width,h=a.show,m=this.deepQuery(this._queryTarget,"axisLine");this._addArea(i,r,o,n,s,l,h),m.show&&this._addLine(i,o,m)},_addAxisLabel:function(t){for(var i,a,o,r,a,s,l,m,V,U,d=e("../util/accMath"),p=this.polar[t],c=this.deepQuery(this._queryTarget,"indicator"),u=p.__ecIndicator,y=this.deepQuery(this._queryTarget,"splitNumber"),g=this.getCenter(t),b=0;b=x;x+=U+1)r=h.merge({},o),l=d.accAdd(s.min,d.accMul(s.step,x)),l="function"==typeof k?k(l):"string"==typeof k?k.replace("{a}","{a0}").replace("{a0}",l):this.numAddCommas(l),r.text=l,r.x=x*a[0]/y+Math.cos(m)*V+g[0],r.y=x*a[1]/y+Math.sin(m)*V+g[1],this.shapeList.push(new n({zlevel:this.getZlevelBase(),z:this.getZBase(),style:r,draggable:!1,hoverable:!1}))}},_buildText:function(e){for(var t,i,a,o,r,s,l,h=this.polar[e],m=h.__ecIndicator,V=this.deepQuery(this._queryTarget,"indicator"),U=this.getCenter(e),d=0,p=0,c=0;c0?"left":Math.round(t[0])<0?"right":"center",null==o.margin?t=this._mapVector(t,U,1.1):(s=o.margin,d=t[0]>0?s:-s,p=t[1]>0?s:-s,d=0===t[0]?0:d,p=0===t[1]?0:p,t=this._mapVector(t,U,1)),i.textAlign=a,i.x=t[0]+d,i.y=t[1]+p,r=o.rotate?[o.rotate/180*Math.PI,t[0],t[1]]:[0,0,0],this.shapeList.push(new n({zlevel:this.getZlevelBase(),z:this.getZBase(),style:i,draggable:!1,hoverable:!1,rotation:r})))},getIndicatorText:function(e,t){return this.polar[e]&&this.polar[e].__ecIndicator[t]&&this.polar[e].__ecIndicator[t].text},getDropBox:function(e){var t,i,e=e||0,n=this.polar[e],a=this.getCenter(e),o=n.__ecIndicator,r=o.length,s=[],l=n.type;if("polygon"==l){for(var h=0;r>h;h++)t=o[h].vector,s.push(this._mapVector(t,a,1.2));i=this._getShape(s,"fill","rgba(0,0,0,0)","",1)}else"circle"==l&&(i=this._getCircle("",1,1.2,a,"fill","rgba(0,0,0,0)"));return i},_addArea:function(e,t,i,n,a,o,r){for(var s,l,h,m,V=this.deepQuery(this._queryTarget,"type"),U=0;t>U;U++)l=(t-U)/t,r&&("polygon"==V?(m=this._getPointList(e,l,i),s=this._getShape(m,"stroke","",a,o)):"circle"==V&&(s=this._getCircle(a,o,l,i,"stroke")),this.shapeList.push(s)),n.show&&(h=(t-U-1)/t,this._addSplitArea(e,n,l,h,i,U))},_getCircle:function(e,t,i,n,a,o){var s=this._getRadius();return new r({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:n[0],y:n[1],r:s*i,brushType:a,strokeColor:e,lineWidth:t,color:o},hoverable:!1,draggable:!1})},_getRing:function(e,t,i,n){var a=this._getRadius();return new s({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:n[0],y:n[1],r:t*a,r0:i*a,color:e,brushType:"fill"},hoverable:!1,draggable:!1})},_getPointList:function(e,t,i){for(var n,a=[],o=e.length,r=0;o>r;r++)n=e[r].vector,a.push(this._mapVector(n,i,t));return a},_getShape:function(e,t,i,n,a){return new o({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{pointList:e,brushType:t,color:i,strokeColor:n,lineWidth:a},hoverable:!1,draggable:!1})},_addSplitArea:function(e,t,i,n,a,o){var r,s,l,h,m,V=e.length,U=t.areaStyle.color,d=[],V=e.length,p=this.deepQuery(this._queryTarget,"type");if("string"==typeof U&&(U=[U]),s=U.length,r=U[o%s],"polygon"==p)for(var c=0;V>c;c++)d=[],l=e[c].vector,h=e[(c+1)%V].vector,d.push(this._mapVector(l,a,i)),d.push(this._mapVector(l,a,n)),d.push(this._mapVector(h,a,n)),d.push(this._mapVector(h,a,i)),m=this._getShape(d,"fill",r,"",1),this.shapeList.push(m);else"circle"==p&&(m=this._getRing(r,i,n,a),this.shapeList.push(m))},_mapVector:function(e,t,i){return[e[0]*i+t[0],e[1]*i+t[1]]},getCenter:function(e){var e=e||0;return this.parseCenter(this.zr,this.polar[e].center)},_addLine:function(e,t,i){for(var n,a,o=e.length,r=i.lineStyle,s=r.color,l=r.width,h=r.type,m=0;o>m;m++)a=e[m].vector,n=this._getLine(t[0],t[1],a[0]+t[0],a[1]+t[1],s,l,h),this.shapeList.push(n)},_getLine:function(e,t,i,n,o,r,s){return new a({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{xStart:e,yStart:t,xEnd:i,yEnd:n,strokeColor:o,lineWidth:r,lineType:s},hoverable:!1})},_adjustIndicatorValue:function(t){for(var i,n,a,o=this.polar[t],r=this.deepQuery(this._queryTarget,"indicator"),s=r.length,l=o.__ecIndicator,h=this._getSeriesData(t),m=o.boundaryGap,V=o.splitNumber,U=o.scale,d=e("../util/smartSteps"),p=0;s>p;p++){if("number"==typeof r[p].max)i=r[p].max,n=r[p].min||0,a={max:i,min:n};else{var c=this._findValue(h,p,V,m);n=c.min,i=c.max}!U&&n>=0&&i>=0&&(n=0),!U&&0>=n&&0>=i&&(i=0);var u=d(n,i,V,a);l[p].value={min:u.min,max:u.max,step:u.step}}},_getSeriesData:function(e){for(var t,i,n,a=[],o=this.component.legend,r=0;ro||void 0===o)&&(o=e),(r>e||void 0===r)&&(r=e)}var o,r,s;if(e&&0!==e.length){if(1==e.length&&(r=0),1!=e.length)for(var l=0;l0?r=o/i:o/=i),{max:o,min:r}}},getVector:function(e,t,i){e=e||0,t=t||0;var n=this.polar[e].__ecIndicator;if(!(t>=n.length)){var a,o=this.polar[e].__ecIndicator[t],r=this.getCenter(e),s=o.vector,l=o.value.max,h=o.value.min;if("undefined"==typeof i)return r;switch(i){case"min":i=h;break;case"max":i=l;break;case"center":i=(l+h)/2}return a=l!=h?(i-h)/(l-h):.5,this._mapVector(s,r,a)}},isInside:function(e){var t=this.getNearestIndex(e);return t?t.polarIndex:-1},getNearestIndex:function(e){for(var t,i,n,a,o,r,s,l,h,V=0;Va[0])return{polarIndex:V,valueIndex:Math.floor((h+l/2)/l)%s}}},getIndicator:function(e){var e=e||0;return this.polar[e].indicator},refresh:function(e){e&&(this.option=e,this.polar=this.option.polar,this.series=this.option.series),this.clear(),this._buildShape()}},h.inherits(t,i),e("../component").define("polar",t),t}),i("echarts/util/coordinates",["require","zrender/tool/math"],function(e){function t(e,t){return[e*n.sin(t),e*n.cos(t)]}function i(e,t){return[Math.sqrt(e*e+t*t),Math.atan(t/e)]}var n=e("zrender/tool/math");return{polar2cartesian:t,cartesian2polar:i}}),i("echarts/chart/chord",["require","./base","zrender/shape/Text","zrender/shape/Line","zrender/shape/Sector","../util/shape/Ribbon","../util/shape/Icon","zrender/shape/BezierCurve","../config","../util/ecData","zrender/tool/util","zrender/tool/vector","../data/Graph","../layout/Chord","../chart"],function(e){"use strict";function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.scaleLineLength=4,this.scaleUnitAngle=4,this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Line"),o=e("zrender/shape/Sector"),r=e("../util/shape/Ribbon"),s=e("../util/shape/Icon"),l=e("zrender/shape/BezierCurve"),h=e("../config");h.chord={zlevel:0,z:2,clickable:!0,radius:["65%","75%"],center:["50%","50%"],padding:2,sort:"none",sortSub:"none",startAngle:90,clockWise:!0,ribbonType:!0,minRadius:10,maxRadius:20,symbol:"circle",showScale:!1,showScaleText:!1,itemStyle:{normal:{borderWidth:0,borderColor:"#000",label:{show:!0,rotate:!1,distance:5},chordStyle:{width:1,color:"black",borderWidth:1,borderColor:"#999",opacity:.5}},emphasis:{borderWidth:0,borderColor:"#000",chordStyle:{width:1,color:"black",borderWidth:1,borderColor:"#999"}}}};var m=e("../util/ecData"),V=e("zrender/tool/util"),U=e("zrender/tool/vector"),d=e("../data/Graph"),p=e("../layout/Chord");return t.prototype={type:h.CHART_TYPE_CHORD,_init:function(){var e=this.series;this.selectedMap={};for(var t={},i={},n=0,a=e.length;a>n;n++)if(e[n].type===this.type){var o=this.isSelected(e[n].name);this.selectedMap[e[n].name]=o,o&&this.buildMark(n),this.reformOption(e[n]),t[e[n].name]=e[n]}for(var n=0,a=e.length;a>n;n++)if(e[n].type===this.type)if(e[n].insertToSerie){var r=t[e[n].insertToSerie];e[n]._referenceSerie=r}else i[e[n].name]=[e[n]];for(var n=0,a=e.length;a>n;n++)if(e[n].type===this.type&&e[n].insertToSerie){for(var s=e[n]._referenceSerie;s&&s._referenceSerie;)s=s._referenceSerie;i[s.name]&&this.selectedMap[e[n].name]&&i[s.name].push(e[n])}for(var l in i)this._buildChords(i[l]);this.addShapeList()},_getNodeCategory:function(e,t){return e.categories&&e.categories[t.category||0]},_getNodeQueryTarget:function(e,t){var i=this._getNodeCategory(e,t);return[t,i,e]},_getEdgeQueryTarget:function(e,t,i){return i=i||"normal",[t.itemStyle&&t.itemStyle[i],e.itemStyle[i].chordStyle]},_buildChords:function(e){for(var t=[],i=e[0],n=function(e){return e.layout.size>0},a=function(e){return function(t){return e.getEdge(t.node2,t.node1)}},o=0;oa;a++){var r=n[a];if(r&&!r.ignore){var s=this._getNodeCategory(t,r),l=s?s.name:r.name;if(this.selectedMap[l]=this.isSelected(l),this.selectedMap[l]){var h=i.addNode(r.name,r);h.rawIndex=a}}}for(var a=0,o=e.links.length;o>a;a++){var m=e.links[a],V=m.source,U=m.target;"number"==typeof V&&(V=n[V],V&&(V=V.name)),"number"==typeof U&&(U=n[U],U&&(U=U.name));var p=i.addEdge(V,U,m);p&&(p.rawIndex=a)}return i.eachNode(function(e){var i=e.data.value;if(null==i)if(i=0,t.ribbonType)for(var n=0;n0&&(p.style.brushType="both"),p.highlightStyle.lineWidth>0&&(p.highlightStyle.brushType="both"),m.pack(p,e,t,i.data,i.rawIndex,i.id,i.category),this.shapeList.push(p),i.shape=p},this)},_buildNodeIcons:function(e,t,i,n){var a=this.parseCenter(this.zr,n.center),o=this.parseRadius(this.zr,n.radius),r=o[1];i.eachNode(function(i){var o=i.layout.startAngle,l=i.layout.endAngle,h=(o+l)/2,V=r*Math.cos(h),U=r*Math.sin(h),d=this._getNodeQueryTarget(n,i.data),p=this._getNodeCategory(n,i.data),c=this.deepQuery(d,"itemStyle.normal.color");c||(c=this.getColor(p?p.name:i.id));var u=new s({zlevel:e.zlevel,z:e.z+1,style:{x:-i.layout.size,y:-i.layout.size,width:2*i.layout.size,height:2*i.layout.size,iconType:this.deepQuery(d,"symbol"),color:c,brushType:"both",lineWidth:this.deepQuery(d,"itemStyle.normal.borderWidth"),strokeColor:this.deepQuery(d,"itemStyle.normal.borderColor")},highlightStyle:{color:this.deepQuery(d,"itemStyle.emphasis.color"),lineWidth:this.deepQuery(d,"itemStyle.emphasis.borderWidth"),strokeColor:this.deepQuery(d,"itemStyle.emphasis.borderColor")},clickable:n.clickable,position:[V+a[0],U+a[1]]});m.pack(u,e,t,i.data,i.rawIndex,i.id,i.category),this.shapeList.push(u),i.shape=u},this)},_buildLabels:function(e,t,i,a){var o=this.query(a,"itemStyle.normal.label.rotate"),r=this.query(a,"itemStyle.normal.label.distance"),s=this.parseCenter(this.zr,a.center),l=this.parseRadius(this.zr,a.radius),h=a.clockWise,m=h?1:-1; + +i.eachNode(function(t){var i=t.layout.startAngle/Math.PI*180*m,h=t.layout.endAngle/Math.PI*180*m,V=(i*-m+h*-m)/2;V%=360,0>V&&(V+=360);var d=90>=V||V>=270;V=V*Math.PI/180;var p=[Math.cos(V),-Math.sin(V)],c=0;c=a.ribbonType?a.showScaleText?35+r:r:r+t.layout.size;var u=U.scale([],p,l[1]+c);U.add(u,u,s);var y={zlevel:e.zlevel,z:e.z+1,hoverable:!1,style:{text:null==t.data.label?t.id:t.data.label,textAlign:d?"left":"right"}};o?(y.rotation=d?V:Math.PI+V,y.style.x=d?l[1]+c:-l[1]-c,y.style.y=0,y.position=s.slice()):(y.style.x=u[0],y.style.y=u[1]),y.style.color=this.deepQuery([t.data,a],"itemStyle.normal.label.textStyle.color")||"#000000",y.style.textFont=this.getFont(this.deepQuery([t.data,a],"itemStyle.normal.label.textStyle")),y=new n(y),this.shapeList.push(y),t.labelShape=y},this)},_buildRibbons:function(e,t,i,n){var a=e[t],o=this.parseCenter(this.zr,n.center),s=this.parseRadius(this.zr,n.radius);i.eachEdge(function(l,h){var V,U=i.getEdge(l.node2,l.node1);if(U&&!l.shape){if(U.shape)return void(l.shape=U.shape);var d=l.layout.startAngle/Math.PI*180,p=l.layout.endAngle/Math.PI*180,c=U.layout.startAngle/Math.PI*180,u=U.layout.endAngle/Math.PI*180;V=this.getColor(1===e.length?l.layout.weight<=U.layout.weight?l.node1.id:l.node2.id:a.name);var y,g,b=this._getEdgeQueryTarget(a,l.data),f=this._getEdgeQueryTarget(a,l.data,"emphasis"),k=new r({zlevel:a.zlevel,z:a.z,style:{x:o[0],y:o[1],r:s[0],source0:d,source1:p,target0:c,target1:u,brushType:"both",opacity:this.deepQuery(b,"opacity"),color:V,lineWidth:this.deepQuery(b,"borderWidth"),strokeColor:this.deepQuery(b,"borderColor"),clockWise:n.clockWise},clickable:n.clickable,highlightStyle:{brushType:"both",opacity:this.deepQuery(f,"opacity"),lineWidth:this.deepQuery(f,"borderWidth"),strokeColor:this.deepQuery(f,"borderColor")}});l.layout.weight<=U.layout.weight?(y=U.node1,g=U.node2):(y=l.node1,g=l.node2),m.pack(k,a,t,l.data,null==l.rawIndex?h:l.rawIndex,l.data.name||y.id+"-"+g.id,y.id,g.id),this.shapeList.push(k),l.shape=k}},this)},_buildEdgeCurves:function(e,t,i,n,a){var o=e[t],r=this.parseCenter(this.zr,n.center);i.eachEdge(function(e,i){var n=a.getNodeById(e.node1.id),s=a.getNodeById(e.node2.id),h=n.shape,V=s.shape,U=this._getEdgeQueryTarget(o,e.data),d=this._getEdgeQueryTarget(o,e.data,"emphasis"),p=new l({zlevel:o.zlevel,z:o.z,style:{xStart:h.position[0],yStart:h.position[1],xEnd:V.position[0],yEnd:V.position[1],cpX1:r[0],cpY1:r[1],lineWidth:this.deepQuery(U,"width"),strokeColor:this.deepQuery(U,"color"),opacity:this.deepQuery(U,"opacity")},highlightStyle:{lineWidth:this.deepQuery(d,"width"),strokeColor:this.deepQuery(d,"color"),opacity:this.deepQuery(d,"opacity")}});m.pack(p,o,t,e.data,null==e.rawIndex?i:e.rawIndex,e.data.name||e.node1.id+"-"+e.node2.id,e.node1.id,e.node2.id),this.shapeList.push(p),e.shape=p},this)},_buildScales:function(e,t,i){var o,r,s=e.clockWise,l=this.parseCenter(this.zr,e.center),h=this.parseRadius(this.zr,e.radius),m=s?1:-1,V=0,d=-(1/0);e.showScaleText&&(i.eachNode(function(e){var t=e.data.value;t>d&&(d=t),V+=t}),d>1e10?(o="b",r=1e-9):d>1e7?(o="m",r=1e-6):d>1e4?(o="k",r=.001):(o="",r=1));var p=V/(360-e.padding);i.eachNode(function(t){for(var i=t.layout.startAngle/Math.PI*180,V=t.layout.endAngle/Math.PI*180,d=i;;){if(s&&d>V||!s&&V>d)break;var c=d/180*Math.PI,u=[Math.cos(c),Math.sin(c)],y=U.scale([],u,h[1]+1);U.add(y,y,l);var g=U.scale([],u,h[1]+this.scaleLineLength);U.add(g,g,l);var b=new a({zlevel:e.zlevel,z:e.z-1,hoverable:!1,style:{xStart:y[0],yStart:y[1],xEnd:g[0],yEnd:g[1],lineCap:"round",brushType:"stroke",strokeColor:"#666",lineWidth:1}});this.shapeList.push(b),d+=m*this.scaleUnitAngle}if(e.showScaleText)for(var f=i,k=5*p*this.scaleUnitAngle,x=0;;){if(s&&f>V||!s&&V>f)break;var c=f;c%=360,0>c&&(c+=360);var _=90>=c||c>=270,L=new n({zlevel:e.zlevel,z:e.z-1,hoverable:!1,style:{x:_?h[1]+this.scaleLineLength+4:-h[1]-this.scaleLineLength-4,y:0,text:Math.round(10*x)/10+o,textAlign:_?"left":"right"},position:l.slice(),rotation:_?[-c/180*Math.PI,0,0]:[-(c+180)/180*Math.PI,0,0]});this.shapeList.push(L),x+=k*r,f+=m*this.scaleUnitAngle*5}},this)},refresh:function(e){if(e&&(this.option=e,this.series=e.series),this.legend=this.component.legend,this.legend)this.getColor=function(e){return this.legend.getColor(e)},this.isSelected=function(e){return this.legend.isSelected(e)};else{var t={},i=0;this.getColor=function(e){return t[e]?t[e]:(t[e]||(t[e]=this.zr.getColor(i++)),t[e])},this.isSelected=function(){return!0}}this.backupShapeList(),this._init()},reformOption:function(e){var t=V.merge;e=t(t(e||{},this.ecTheme.chord),h.chord),e.itemStyle.normal.label.textStyle=this.getTextStyle(e.itemStyle.normal.label.textStyle),this.z=e.z,this.zlevel=e.zlevel}},V.inherits(t,i),e("../chart").define("chord",t),t}),i("echarts/util/shape/Ribbon",["require","zrender/shape/Base","zrender/shape/util/PathProxy","zrender/tool/util","zrender/tool/area"],function(e){function t(e){i.call(this,e),this._pathProxy=new n}var i=e("zrender/shape/Base"),n=e("zrender/shape/util/PathProxy"),a=e("zrender/tool/util"),o=e("zrender/tool/area");return t.prototype={type:"ribbon",buildPath:function(e,t){var i=t.clockWise||!1,n=this._pathProxy;n.begin(e);var a=t.x,o=t.y,r=t.r,s=t.source0/180*Math.PI,l=t.source1/180*Math.PI,h=t.target0/180*Math.PI,m=t.target1/180*Math.PI,V=a+Math.cos(s)*r,U=o+Math.sin(s)*r,d=a+Math.cos(l)*r,p=o+Math.sin(l)*r,c=a+Math.cos(h)*r,u=o+Math.sin(h)*r,y=a+Math.cos(m)*r,g=o+Math.sin(m)*r;n.moveTo(V,U),n.arc(a,o,t.r,s,l,!i),n.bezierCurveTo(.7*(a-d)+d,.7*(o-p)+p,.7*(a-c)+c,.7*(o-u)+u,c,u),(t.source0!==t.target0||t.source1!==t.target1)&&(n.arc(a,o,t.r,h,m,!i),n.bezierCurveTo(.7*(a-y)+y,.7*(o-g)+g,.7*(a-V)+V,.7*(o-U)+U,V,U))},getRect:function(e){return e.__rect?e.__rect:(this._pathProxy.isEmpty()||this.buildPath(null,e),this._pathProxy.fastBoundingRect())},isCover:function(e,t){var i=this.getRect(this.style);return e>=i.x&&e<=i.x+i.width&&t>=i.y&&t<=i.y+i.height?o.isInsidePath(this._pathProxy.pathCommands,0,"fill",e,t):void 0}},a.inherits(t,i),t}),i("echarts/data/Graph",["require","zrender/tool/util"],function(e){var t=e("zrender/tool/util"),i=function(e){this._directed=e||!1,this.nodes=[],this.edges=[],this._nodesMap={},this._edgesMap={}};i.prototype.isDirected=function(){return this._directed},i.prototype.addNode=function(e,t){if(this._nodesMap[e])return this._nodesMap[e];var n=new i.Node(e,t);return this.nodes.push(n),this._nodesMap[e]=n,n},i.prototype.getNodeById=function(e){return this._nodesMap[e]},i.prototype.addEdge=function(e,t,n){if("string"==typeof e&&(e=this._nodesMap[e]),"string"==typeof t&&(t=this._nodesMap[t]),e&&t){var a=e.id+"-"+t.id;if(this._edgesMap[a])return this._edgesMap[a];var o=new i.Edge(e,t,n);return this._directed&&(e.outEdges.push(o),t.inEdges.push(o)),e.edges.push(o),e!==t&&t.edges.push(o),this.edges.push(o),this._edgesMap[a]=o,o}},i.prototype.removeEdge=function(e){var i=e.node1,n=e.node2,a=i.id+"-"+n.id;this._directed&&(i.outEdges.splice(t.indexOf(i.outEdges,e),1),n.inEdges.splice(t.indexOf(n.inEdges,e),1)),i.edges.splice(t.indexOf(i.edges,e),1),i!==n&&n.edges.splice(t.indexOf(n.edges,e),1),delete this._edgesMap[a],this.edges.splice(t.indexOf(this.edges,e),1)},i.prototype.getEdge=function(e,t){return"string"!=typeof e&&(e=e.id),"string"!=typeof t&&(t=t.id),this._directed?this._edgesMap[e+"-"+t]:this._edgesMap[e+"-"+t]||this._edgesMap[t+"-"+e]},i.prototype.removeNode=function(e){if("string"!=typeof e||(e=this._nodesMap[e])){delete this._nodesMap[e.id],this.nodes.splice(t.indexOf(this.nodes,e),1);for(var i=0;in;)e.call(t,this.nodes[n],n)?n++:(this.removeNode(this.nodes[n]),i--)},i.prototype.filterEdge=function(e,t){for(var i=this.edges.length,n=0;i>n;)e.call(t,this.edges[n],n)?n++:(this.removeEdge(this.edges[n]),i--)},i.prototype.eachNode=function(e,t){for(var i=this.nodes.length,n=0;i>n;n++)this.nodes[n]&&e.call(t,this.nodes[n],n)},i.prototype.eachEdge=function(e,t){for(var i=this.edges.length,n=0;i>n;n++)this.edges[n]&&e.call(t,this.edges[n],n)},i.prototype.clear=function(){this.nodes.length=0,this.edges.length=0,this._nodesMap={},this._edgesMap={}},i.prototype.breadthFirstTraverse=function(e,t,i,n){if("string"==typeof t&&(t=this._nodesMap[t]),t){var a="edges";"out"===i?a="outEdges":"in"===i&&(a="inEdges");for(var o=0;or;r++){var s=o.addNode(e[r].id,e[r]);s.data.value=0,n&&(s.data.outValue=s.data.inValue=0)}for(var r=0;a>r;r++)for(var l=0;a>l;l++){var h=t[r][l];n&&(o.nodes[r].data.outValue+=h,o.nodes[l].data.inValue+=h),o.nodes[r].data.value+=h,o.nodes[l].data.value+=h}for(var r=0;a>r;r++)for(var l=r;a>l;l++){var h=t[r][l];if(0!==h){var m=o.nodes[r],V=o.nodes[l],U=o.addEdge(m,V,{});if(U.data.weight=h,r!==l&&n&&t[l][r]){var d=o.addEdge(V,m,{});d.data.weight=t[l][r]}}}return o}},i}),i("echarts/layout/Chord",["require"],function(){var e=function(e){e=e||{},this.sort=e.sort||null,this.sortSub=e.sortSub||null,this.padding=.05,this.startAngle=e.startAngle||0,this.clockWise=null==e.clockWise?!1:e.clockWise,this.center=e.center||[0,0],this.directed=!0};e.prototype.run=function(e){e instanceof Array||(e=[e]);var n=e.length;if(n){for(var a=e[0],o=a.nodes.length,r=[],s=0,l=0;o>l;l++){var h=a.nodes[l],m={size:0,subGroups:[],node:h};r.push(m);for(var V=0,U=0;Ul;l++){var m=r[l];m.node.layout.startAngle=f,m.node.layout.endAngle=f+k*m.size*b,m.node.layout.subGroups=[];for(var u=0;un;n++){var o=i[n];if(o.type===d.CHART_TYPE_FORCE){if(i[n]=this.reformOption(i[n]),e=i[n].name||"",this.selectedMap[e]=t?t.isSelected(e):!0,!this.selectedMap[e])continue;this.buildMark(n),this._initSerie(o,n);break}}this.animationEffect()},_getNodeCategory:function(e,t){return e.categories&&e.categories[t.category||0]},_getNodeQueryTarget:function(e,t,i){i=i||"normal";var n=this._getNodeCategory(e,t)||{};return[t.itemStyle&&t.itemStyle[i],n&&n.itemStyle&&n.itemStyle[i],e.itemStyle[i].nodeStyle]},_getEdgeQueryTarget:function(e,t,i){return i=i||"normal",[t.itemStyle&&t.itemStyle[i],e.itemStyle[i].linkStyle]},_initSerie:function(e,t){this._temperature=1,e.matrix?this._graph=this._getSerieGraphFromDataMatrix(e):e.links&&(this._graph=this._getSerieGraphFromNodeLinks(e)),this._buildLinkShapes(e,t),this._buildNodeShapes(e,t);var i=e.roam===!0||"move"===e.roam,n=e.roam===!0||"scale"===e.roam;this.zr.modLayer(this.getZlevelBase(),{panable:i,zoomable:n}),(this.query("markPoint.effect.show")||this.query("markLine.effect.show"))&&this.zr.modLayer(d.EFFECT_ZLEVEL,{panable:i,zoomable:n}),this._initLayout(e),this._step()},_getSerieGraphFromDataMatrix:function(e){for(var t=[],i=0,n=[],a=0;an;n++){var o=i[n];if(o&&!o.ignore){var r=this._getNodeCategory(e,o),l=r?r.name:o.name;if(this.selectedMap[l]=this.isSelected(l),this.selectedMap[l]){var h=t.addNode(o.name,o);h.rawIndex=n}}}for(var n=0,a=e.links.length;a>n;n++){var m=e.links[n],V=m.source,U=m.target;"number"==typeof V&&(V=i[V],V&&(V=V.name)),"number"==typeof U&&(U=i[U],U&&(U=U.name));var d=t.addEdge(V,U,m);d&&(d.rawIndex=n)}return t.eachNode(function(e){var t=e.data.value;if(null==t){t=0;for(var i=0;ih;h++){var m=t.nodes[h];l=Math.max(m.layout.size,l),s=Math.min(m.layout.size,s)}for(var V=l-s,h=0;i>h;h++){var m=t.nodes[h];V>0?(m.layout.size=(m.layout.size-s)*(a-n)/V+n,m.layout.mass=m.layout.size/a):(m.layout.size=(a-n)/2,m.layout.mass=.5)}for(var h=0;i>h;h++){var m=t.nodes[h];if("undefined"!=typeof this.__nodePositionMap[m.id])m.layout.position=y.create(),y.copy(m.layout.position,this.__nodePositionMap[m.id]);else if("undefined"!=typeof m.data.initial)m.layout.position=y.create(),y.copy(m.layout.position,m.data.initial);else{var U=this._layout.center,d=Math.min(this._layout.width,this._layout.height);m.layout.position=o(U[0],U[1],.8*d)}var p=m.shape.style,c=m.layout.size;p.width=p.width||2*c,p.height=p.height||2*c,p.x=-p.width/2,p.y=-p.height/2,y.copy(m.shape.position,m.layout.position)}i=t.edges.length,l=-(1/0);for(var h=0;i>h;h++){var u=t.edges[h];u.layout.weight>l&&(l=u.layout.weight)}for(var h=0;i>h;h++){var u=t.edges[h];u.layout.weight/=l}this._layout.init(t,e.useWorker)},_buildNodeShapes:function(e,t){var i=this._graph,n=this.query(e,"categories");i.eachNode(function(i){var a=this._getNodeCategory(e,i.data),o=[i.data,a,e],r=this._getNodeQueryTarget(e,i.data),s=this._getNodeQueryTarget(e,i.data,"emphasis"),l=new U({style:{x:0,y:0,color:this.deepQuery(r,"color"),brushType:"both",strokeColor:this.deepQuery(r,"strokeColor")||this.deepQuery(r,"borderColor"),lineWidth:this.deepQuery(r,"lineWidth")||this.deepQuery(r,"borderWidth")},highlightStyle:{color:this.deepQuery(s,"color"),strokeColor:this.deepQuery(s,"strokeColor")||this.deepQuery(s,"borderColor"),lineWidth:this.deepQuery(s,"lineWidth")||this.deepQuery(s,"borderWidth")},clickable:e.clickable,zlevel:this.getZlevelBase(),z:this.getZBase()});l.style.color||(l.style.color=this.getColor(a?a.name:i.id)),l.style.iconType=this.deepQuery(o,"symbol");var h=this.deepQuery(o,"symbolSize")||0;"number"==typeof h&&(h=[h,h]),l.style.width=2*h[0],l.style.height=2*h[1],l.style.iconType.match("image")&&(l.style.image=l.style.iconType.replace(new RegExp("^image:\\/\\/"),""),l=new V({style:l.style,highlightStyle:l.highlightStyle,clickable:l.clickable,zlevel:this.getZlevelBase(),z:this.getZBase()})),this.deepQuery(o,"itemStyle.normal.label.show")&&(l.style.text=null==i.data.label?i.id:i.data.label,l.style.textPosition=this.deepQuery(o,"itemStyle.normal.label.position"),l.style.textColor=this.deepQuery(o,"itemStyle.normal.label.textStyle.color"),l.style.textFont=this.getFont(this.deepQuery(o,"itemStyle.normal.label.textStyle")||{})),this.deepQuery(o,"itemStyle.emphasis.label.show")&&(l.highlightStyle.textPosition=this.deepQuery(o,"itemStyle.emphasis.label.position"),l.highlightStyle.textColor=this.deepQuery(o,"itemStyle.emphasis.label.textStyle.color"),l.highlightStyle.textFont=this.getFont(this.deepQuery(o,"itemStyle.emphasis.label.textStyle")||{})),this.deepQuery(o,"draggable")&&(this.setCalculable(l),l.dragEnableTime=0,l.draggable=!0,l.ondragstart=this.shapeHandler.ondragstart,l.ondragover=null);var m="";if("undefined"!=typeof i.category){var a=n[i.category];m=a&&a.name||""}p.pack(l,e,t,i.data,i.rawIndex,i.data.name||"",i.category),this.shapeList.push(l),this.zr.addShape(l),i.shape=l},this)},_buildLinkShapes:function(e,t){for(var i=this._graph,n=i.edges.length,a=0;n>a;a++){var o=i.edges[a],r=o.data,s=o.node1,l=o.node2,V=i.getEdge(l,s),d=this._getEdgeQueryTarget(e,r),u=this.deepQuery(d,"type");e.linkSymbol&&"none"!==e.linkSymbol&&(u="line");var y="line"===u?h:m,g=new y({style:{xStart:0,yStart:0,xEnd:0,yEnd:0},clickable:this.query(e,"clickable"),highlightStyle:{},zlevel:this.getZlevelBase(),z:this.getZBase()});if(V&&V.shape&&(g.style.offset=4,V.shape.style.offset=4),c.merge(g.style,this.query(e,"itemStyle.normal.linkStyle"),!0),c.merge(g.highlightStyle,this.query(e,"itemStyle.emphasis.linkStyle"),!0),"undefined"!=typeof r.itemStyle&&(r.itemStyle.normal&&c.merge(g.style,r.itemStyle.normal,!0),r.itemStyle.emphasis&&c.merge(g.highlightStyle,r.itemStyle.emphasis,!0)),g.style.lineWidth=g.style.lineWidth||g.style.width,g.style.strokeColor=g.style.strokeColor||g.style.color,g.highlightStyle.lineWidth=g.highlightStyle.lineWidth||g.highlightStyle.width,g.highlightStyle.strokeColor=g.highlightStyle.strokeColor||g.highlightStyle.color,p.pack(g,e,t,o.data,null==o.rawIndex?a:o.rawIndex,o.data.name||s.id+" - "+l.id,s.id,l.id),this.shapeList.push(g),this.zr.addShape(g),o.shape=g,e.linkSymbol&&"none"!==e.linkSymbol){var b=new U({style:{x:-5,y:0,width:e.linkSymbolSize[0],height:e.linkSymbolSize[1],iconType:e.linkSymbol,brushType:"fill",color:g.style.strokeColor},highlightStyle:{brushType:"fill"},position:[0,0],rotation:0,zlevel:this.getZlevelBase(),z:this.getZBase()});g._symbolShape=b,this.shapeList.push(b),this.zr.addShape(b)}}},_updateLinkShapes:function(){for(var e=y.create(),t=y.create(),i=y.create(),n=y.create(),a=this._graph.edges,o=0,r=a.length;r>o;o++){var s=a[o],l=s.node1.shape,h=s.node2.shape;y.copy(i,l.position),y.copy(n,h.position);var m=s.shape.style;if(y.sub(e,i,n),y.normalize(e,e),m.offset?(t[0]=e[1],t[1]=-e[0],y.scaleAndAdd(i,i,t,m.offset),y.scaleAndAdd(n,n,t,m.offset)):"bezier-curve"===s.shape.type&&(m.cpX1=(i[0]+n[0])/2-(n[1]-i[1])/4,m.cpY1=(i[1]+n[1])/2-(i[0]-n[0])/4),m.xStart=i[0],m.yStart=i[1],m.xEnd=n[0],m.yEnd=n[1],s.shape.modSelf(),s.shape._symbolShape){var V=s.shape._symbolShape;y.copy(V.position,n),y.scaleAndAdd(V.position,V.position,e,h.style.width/2+2);var U=Math.atan2(e[1],e[0]);V.rotation=Math.PI/2-U,V.modSelf()}}},_syncNodePositions:function(){for(var e=this._graph,t=0;t.01?this._layout.step(this._steps):this.messageCenter.dispatch(d.EVENT.FORCE_LAYOUT_END,{},{},this.myChart)},refresh:function(e){if(e&&(this.option=e,this.series=this.option.series),this.legend=this.component.legend,this.legend)this.getColor=function(e){return this.legend.getColor(e)},this.isSelected=function(e){return this.legend.isSelected(e)};else{var t={},i=0;this.getColor=function(e){return t[e]?t[e]:(t[e]||(t[e]=this.zr.getColor(i++)),t[e])},this.isSelected=function(){return!0}}this._init()},dispose:function(){this.clear(),this.shapeList=null,this.effectList=null,this._layout.dispose(),this._layout=null,this.__nodePositionMap={}},getPosition:function(){var e=[];return this._graph.eachNode(function(t){t.layout&&e.push({name:t.data.name,position:Array.prototype.slice.call(t.layout.position)})}),e}},c.inherits(t,r),e("../chart").define("force",t),t}),i("echarts/layout/Force",["require","./forceLayoutWorker","zrender/tool/vector"],function(e){function t(){if("undefined"!=typeof Worker&&"undefined"!=typeof Blob)try{var e=new Blob([n.getWorkerCode()]);i=window.URL.createObjectURL(e)}catch(t){i=""}return i}var i,n=e("./forceLayoutWorker"),a=e("zrender/tool/vector"),o=window.requestAnimationFrame||window.msRequestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||function(e){setTimeout(e,16)},r="undefined"==typeof Float32Array?Array:Float32Array,s=function(e){"undefined"==typeof i&&t(),e=e||{},this.width=e.width||500,this.height=e.height||500,this.center=e.center||[this.width/2,this.height/2],this.ratioScaling=e.ratioScaling||!1,this.scaling=e.scaling||1,this.gravity="undefined"!=typeof e.gravity?e.gravity:1,this.large=e.large||!1,this.preventNodeOverlap=e.preventNodeOverlap||!1,this.preventNodeEdgeOverlap=e.preventNodeEdgeOverlap||!1,this.maxSpeedIncrease=e.maxSpeedIncrease||1,this.onupdate=e.onupdate||function(){},this.temperature=e.temperature||1,this.coolDown=e.coolDown||.99,this._layout=null,this._layoutWorker=null;var n=this,a=this._$onupdate;this._$onupdate=function(e){a.call(n,e)}};return s.prototype.updateConfig=function(){var e=this.width,t=this.height,i=Math.min(e,t),n={center:this.center,width:this.ratioScaling?e:i,height:this.ratioScaling?t:i,scaling:this.scaling||1,gravity:this.gravity||1,barnesHutOptimize:this.large,preventNodeOverlap:this.preventNodeOverlap,preventNodeEdgeOverlap:this.preventNodeEdgeOverlap,maxSpeedIncrease:this.maxSpeedIncrease};if(this._layoutWorker)this._layoutWorker.postMessage({cmd:"updateConfig",config:n});else for(var a in n)this._layout[a]=n[a]},s.prototype.init=function(e,t){if(this._layoutWorker&&(this._layoutWorker.terminate(),this._layoutWorker=null),i&&t)try{this._layoutWorker||(this._layoutWorker=new Worker(i),this._layoutWorker.onmessage=this._$onupdate),this._layout=null}catch(a){this._layoutWorker=null,this._layout||(this._layout=new n)}else this._layout||(this._layout=new n);this.temperature=1,this.graph=e;for(var o=e.nodes.length,s=new r(2*o),l=new r(o),h=new r(o),m=0;o>m;m++){var V=e.nodes[m];s[2*m]=V.layout.position[0],s[2*m+1]=V.layout.position[1],l[m]="undefined"==typeof V.layout.mass?1:V.layout.mass,h[m]="undefined"==typeof V.layout.size?1:V.layout.size,V.layout.__index=m}o=e.edges.length;for(var U=new r(2*o),d=new r(o),m=0;o>m;m++){var p=e.edges[m];U[2*m]=p.node1.layout.__index,U[2*m+1]=p.node2.layout.__index,d[m]=p.layout.weight||1}this._layoutWorker?this._layoutWorker.postMessage({cmd:"init",nodesPosition:s,nodesMass:l,nodesSize:h,edges:U,edgesWeight:d}):(this._layout.initNodes(s,l,h),this._layout.initEdges(U,d)),this.updateConfig()},s.prototype.step=function(e){var t=this.graph.nodes;if(this._layoutWorker){for(var i=new r(2*t.length),n=0;nn;n++)this.temperature*=this.coolDown}else{o(this._$onupdate);for(var n=0;nn;n++)this._layout.temperature=this.temperature,this._layout.update(),this.temperature*=this.coolDown}},s.prototype._$onupdate=function(e){if(this._layoutWorker){for(var t=new Float32Array(e.data),i=0;i0&&(a=1/Math.sqrt(a),e[0]=t[0]*a,e[1]=t[1]*a),e},negate:function(e,t){return e[0]=-t[0],e[1]=-t[1],e},copy:function(e,t){return e[0]=t[0],e[1]=t[1],e},set:function(e,t,i){return e[0]=t,e[1]=i,e}}:e("zrender/tool/vector");var l="undefined"==typeof Float32Array?Array:Float32Array;if(t.prototype.beforeUpdate=function(){for(var e=0;e=e&&this.bbox[1]<=t&&this.bbox[3]>=t},t.prototype.setBBox=function(e,t,i,n){this.bbox[0]=e,this.bbox[1]=t,this.bbox[2]=i,this.bbox[3]=n,this.size=(i-e+n-t)/2},t.prototype._newSubRegion=function(){var e=this.subRegions[this.nSubRegions];return e||(e=new t,this.subRegions[this.nSubRegions]=e),this.nSubRegions++,e},t.prototype._addNodeToSubRegion=function(e){var t=this.findSubRegion(e.position[0],e.position[1]),i=this.bbox;if(!t){var n=(i[0]+i[2])/2,a=(i[1]+i[3])/2,o=(i[2]-i[0])/2,r=(i[3]-i[1])/2,s=e.position[0]>=n?1:0,l=e.position[1]>=a?1:0,t=this._newSubRegion();t.setBBox(s*o+i[0],l*r+i[1],(s+1)*o+i[0],(l+1)*r+i[1])}t.addNode(e)},t.prototype._updateCenterOfMass=function(e){null==this.centerOfMass&&(this.centerOfMass=r.create());var t=this.centerOfMass[0]*this.mass,i=this.centerOfMass[1]*this.mass;t+=e.position[0]*e.mass,i+=e.position[1]*e.mass,this.mass+=e.mass,this.centerOfMass[0]=t/this.mass,this.centerOfMass[1]=i/this.mass},a.prototype.nodeToNodeRepulsionFactor=function(e,t,i){return i*i*e/t},a.prototype.edgeToNodeRepulsionFactor=function(e,t,i){return i*e/t},a.prototype.attractionFactor=function(e,t,i){return e*t/i},a.prototype.initNodes=function(e,t,n){this.temperature=1;var a=e.length/2;this.nodes.length=0;for(var o="undefined"!=typeof n,r=0;a>r;r++){var s=new i;s.position[0]=e[2*r],s.position[1]=e[2*r+1],s.mass=t[r],o&&(s.size=n[r]),this.nodes.push(s)}this._massArr=t,o&&(this._sizeArr=n)},a.prototype.initEdges=function(e,t){var i=e.length/2;this.edges.length=0;for(var a="undefined"!=typeof t,o=0;i>o;o++){var r=e[2*o],s=e[2*o+1],l=this.nodes[r],h=this.nodes[s];if(l&&h){l.outDegree++,h.inDegree++;var m=new n(l,h);a&&(m.weight=t[o]),this.edges.push(m)}}},a.prototype.update=function(){var e=this.nodes.length;if(this.updateBBox(),this._k=.4*this.scaling*Math.sqrt(this.width*this.height/e),this.barnesHutOptimize){this._rootRegion.setBBox(this.bbox[0],this.bbox[1],this.bbox[2],this.bbox[3]),this._rootRegion.beforeUpdate();for(var t=0;e>t;t++)this._rootRegion.addNode(this.nodes[t]);this._rootRegion.afterUpdate()}else{var i=0,n=this._rootRegion.centerOfMass;r.set(n,0,0);for(var t=0;e>t;t++){var a=this.nodes[t];i+=a.mass,r.scaleAndAdd(n,n,a.position,a.mass); + +}i>0&&r.scale(n,n,1/i)}this.updateForce(),this.updatePosition()},a.prototype.updateForce=function(){for(var e=this.nodes.length,t=0;e>t;t++){var i=this.nodes[t];r.copy(i.forcePrev,i.force),r.copy(i.speedPrev,i.speed),r.set(i.force,0,0)}this.updateNodeNodeForce(),this.gravity>0&&this.updateGravityForce(),this.updateEdgeForce(),this.preventNodeEdgeOverlap&&this.updateNodeEdgeForce()},a.prototype.updatePosition=function(){for(var e=this.nodes.length,t=r.create(),i=0;e>i;i++){var n=this.nodes[i],a=n.speed;r.scale(n.force,n.force,1/30);var o=r.len(n.force)+.1,s=Math.min(o,500)/o;r.scale(n.force,n.force,s),r.add(a,a,n.force),r.scale(a,a,this.temperature),r.sub(t,a,n.speedPrev);var l=r.len(t);if(l>0){r.scale(t,t,1/l);var h=r.len(n.speedPrev);h>0&&(l=Math.min(l/h,this.maxSpeedIncrease)*h,r.scaleAndAdd(a,n.speedPrev,t,l))}var m=r.len(a),s=Math.min(m,100)/(m+.1);r.scale(a,a,s),r.add(n.position,n.position,a)}},a.prototype.updateNodeNodeForce=function(){for(var e=this.nodes.length,t=0;e>t;t++){var i=this.nodes[t];if(this.barnesHutOptimize)this.applyRegionToNodeRepulsion(this._rootRegion,i);else for(var n=t+1;e>n;n++){var a=this.nodes[n];this.applyNodeToNodeRepulsion(i,a,!1)}}},a.prototype.updateGravityForce=function(){for(var e=0;ethis.barnesHutTheta*t.size*t.size){var a=this._k*this._k*(i.mass+t.mass)/(n+1);r.scaleAndAdd(i.force,i.force,e,2*a)}else for(var o=0;o0?o=this.nodeToNodeRepulsionFactor(s,l,this._k):0>=l&&(o=this._k*this._k*10*s)):o=this.nodeToNodeRepulsionFactor(s,l,this._k),n||r.scaleAndAdd(t.force,t.force,e,2*o),r.scaleAndAdd(i.force,i.force,e,2*-o)}}}}(),a.prototype.applyEdgeAttraction=function(){var e=r.create();return function(t){var i=t.node1,n=t.node2;r.sub(e,i.position,n.position);var a,o=r.len(e);a=0===this.edgeWeightInfluence?1:1==this.edgeWeightInfluence?t.weight:Math.pow(t.weight,this.edgeWeightInfluence);var s;if(!(this.preventOverlap&&(o=o-i.size-n.size,0>=o))){var s=this.attractionFactor(a,o,this._k);r.scaleAndAdd(i.force,i.force,e,-s),r.scaleAndAdd(n.force,n.force,e,s)}}}(),a.prototype.applyNodeGravity=function(){var e=r.create();return function(t){r.sub(e,this.center,t.position),this.width>this.height?e[1]*=this.width/this.height:e[0]*=this.height/this.width;var i=r.len(e)/100;this.strongGravity?r.scaleAndAdd(t.force,t.force,e,i*this.gravity*t.mass):r.scaleAndAdd(t.force,t.force,e,this.gravity*t.mass/(i+1))}}(),a.prototype.applyEdgeToNodeRepulsion=function(){var e=r.create(),t=r.create(),i=r.create();return function(n,a){var o=n.node1,s=n.node2;if(o!==a&&s!==a){r.sub(e,s.position,o.position),r.sub(t,a.position,o.position);var l=r.len(e);r.scale(e,e,1/l);var h=r.dot(e,t);if(!(0>h||h>l)){r.scaleAndAdd(i,o.position,e,h);var m=r.dist(i,a.position)-a.size,V=this.edgeToNodeRepulsionFactor(a.mass,Math.max(m,.1),100);r.sub(e,a.position,i),r.normalize(e,e),r.scaleAndAdd(a.force,a.force,e,V),r.scaleAndAdd(o.force,o.force,e,-V),r.scaleAndAdd(s.force,s.force,e,-V)}}}}(),a.prototype.updateBBox=function(){for(var e=1/0,t=1/0,i=-(1/0),n=-(1/0),a=0;an;n++){var o=h.nodes[n];o.position[0]=t[2*n],o.position[1]=t[2*n+1]}}else switch(e.data.cmd){case"init":h||(h=new a),h.initNodes(e.data.nodesPosition,e.data.nodesMass,e.data.nodesSize),h.initEdges(e.data.edges,e.data.edgesWeight);break;case"updateConfig":if(h)for(var r in e.data.config)h[r]=e.data.config[r];break;case"update":var s=e.data.steps;if(h){var i=h.nodes.length,t=new Float32Array(2*i);h.temperature=e.data.temperature;for(var n=0;s>n;n++)h.update(),h.temperature*=e.data.coolDown;for(var n=0;i>n;n++){var o=h.nodes[n];t[2*n]=o.position[0],t[2*n+1]=o.position[1]}self.postMessage(t.buffer,[t.buffer])}else{var l=new Float32Array;self.postMessage(l.buffer,[l.buffer])}}}}return a}),i("echarts/chart/map",["require","./base","zrender/shape/Text","zrender/shape/Path","zrender/shape/Circle","zrender/shape/Rectangle","zrender/shape/Line","zrender/shape/Polygon","zrender/shape/Ellipse","zrender/shape/Image","../component/dataRange","../component/roamController","../layer/heatmap","../config","../util/ecData","zrender/tool/util","zrender/config","zrender/tool/event","../util/mapData/params","../util/mapData/textFixed","../util/mapData/geoCoord","../util/projection/svg","../util/projection/normal","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o);var r=this;r._onmousewheel=function(e){return r.__onmousewheel(e)},r._onmousedown=function(e){return r.__onmousedown(e)},r._onmousemove=function(e){return r.__onmousemove(e)},r._onmouseup=function(e){return r.__onmouseup(e)},r._onroamcontroller=function(e){return r.__onroamcontroller(e)},r._ondrhoverlink=function(e){return r.__ondrhoverlink(e)},this._isAlive=!0,this._selectedMode={},this._activeMapType={},this._clickable={},this._hoverable={},this._showLegendSymbol={},this._selected={},this._mapTypeMap={},this._mapDataMap={},this._nameMap={},this._specialArea={},this._refreshDelayTicket,this._mapDataRequireCounter,this._markAnimation=!1,this._hoverLinkMap={},this._roamMap={},this._scaleLimitMap={},this._mx,this._my,this._mousedown,this._justMove,this._curMapType,this.refresh(a),this.zr.on(c.EVENT.MOUSEWHEEL,this._onmousewheel),this.zr.on(c.EVENT.MOUSEDOWN,this._onmousedown),t.bind(U.EVENT.ROAMCONTROLLER,this._onroamcontroller),t.bind(U.EVENT.DATA_RANGE_HOVERLINK,this._ondrhoverlink)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Path"),o=e("zrender/shape/Circle"),r=e("zrender/shape/Rectangle"),s=e("zrender/shape/Line"),l=e("zrender/shape/Polygon"),h=e("zrender/shape/Ellipse"),m=e("zrender/shape/Image");e("../component/dataRange"),e("../component/roamController");var V=e("../layer/heatmap"),U=e("../config");U.map={zlevel:0,z:2,mapType:"china",showLegendSymbol:!0,dataRangeHoverLink:!0,hoverable:!0,clickable:!0,itemStyle:{normal:{borderColor:"rgba(0,0,0,0)",borderWidth:1,areaStyle:{color:"#ccc"},label:{show:!1,textStyle:{color:"rgb(139,69,19)"}}},emphasis:{borderColor:"rgba(0,0,0,0)",borderWidth:1,areaStyle:{color:"rgba(255,215,0,0.8)"},label:{show:!1,textStyle:{color:"rgb(100,0,0)"}}}}};var d=e("../util/ecData"),p=e("zrender/tool/util"),c=e("zrender/config"),u=e("zrender/tool/event"),y=e("../util/mapData/params").params,g=e("../util/mapData/textFixed"),b=e("../util/mapData/geoCoord");return t.prototype={type:U.CHART_TYPE_MAP,_buildShape:function(){var e=this.series;this.selectedMap={},this._activeMapType={};for(var t,i,n,a,o=this.component.legend,r={},s={},l={},h={},m=0,V=e.length;V>m;m++)if(e[m].type==U.CHART_TYPE_MAP&&(e[m]=this.reformOption(e[m]),i=e[m].mapType,s[i]=s[i]||{},s[i][m]=!0,l[i]=l[i]||e[m].mapValuePrecision,this._scaleLimitMap[i]=this._scaleLimitMap[i]||{},e[m].scaleLimit&&p.merge(this._scaleLimitMap[i],e[m].scaleLimit,!0),this._roamMap[i]=e[m].roam||this._roamMap[i],(null==this._hoverLinkMap[i]||this._hoverLinkMap[i])&&(this._hoverLinkMap[i]=e[m].dataRangeHoverLink),this._nameMap[i]=this._nameMap[i]||{},e[m].nameMap&&p.merge(this._nameMap[i],e[m].nameMap,!0),this._activeMapType[i]=!0,e[m].textFixed&&p.merge(g,e[m].textFixed,!0),e[m].geoCoord&&p.merge(b,e[m].geoCoord,!0),this._selectedMode[i]=this._selectedMode[i]||e[m].selectedMode,(null==this._hoverable[i]||this._hoverable[i])&&(this._hoverable[i]=e[m].hoverable),(null==this._clickable[i]||this._clickable[i])&&(this._clickable[i]=e[m].clickable),(null==this._showLegendSymbol[i]||this._showLegendSymbol[i])&&(this._showLegendSymbol[i]=e[m].showLegendSymbol),h[i]=h[i]||e[m].mapValueCalculation,t=e[m].name,this.selectedMap[t]=o?o.isSelected(t):!0,this.selectedMap[t])){r[i]=r[i]||{},n=e[m].data;for(var d=0,c=n.length;c>d;d++){a=this._nameChange(i,n[d].name),r[i][a]=r[i][a]||{seriesIndex:[],valueMap:{},precision:0};for(var u in n[d])"value"!=u?r[i][a][u]=n[d][u]:isNaN(n[d].value)||(null==r[i][a].value&&(r[i][a].value=0),r[i][a].precision=Math.max(this.getPrecision(+n[d].value),r[i][a].precision),r[i][a].value+=+n[d].value,r[i][a].valueMap[m]=+n[d].value);r[i][a].seriesIndex.push(m)}}this._mapDataRequireCounter=0;for(var f in r)this._mapDataRequireCounter++;this._clearSelected(),0===this._mapDataRequireCounter&&(this.clear(),this.zr&&this.zr.delShape(this.lastShapeList),this.lastShapeList=[]);for(var f in r){for(var c in r[f]){"average"==h[f]&&(r[f][c].value/=r[f][c].seriesIndex.length);var k=r[f][c].value;null!=k&&(r[f][c].value=k.toFixed(null==l[f]?r[f][c].precision:l[f])-0)}this._mapDataMap[f]=this._mapDataMap[f]||{},this._mapDataMap[f].mapData?this._mapDataCallback(f,r[f],s[f])(this._mapDataMap[f].mapData):y[f.replace(/\|.*/,"")].getGeoJson&&(this._specialArea[f]=y[f.replace(/\|.*/,"")].specialArea||this._specialArea[f],y[f.replace(/\|.*/,"")].getGeoJson(this._mapDataCallback(f,r[f],s[f])))}},_mapDataCallback:function(t,i,n){var a=this;return function(o){a._isAlive&&null!=a._activeMapType[t]&&(-1!=t.indexOf("|")&&(o=a._getSubMapData(t,o)),a._mapDataMap[t].mapData=o,o.firstChild?(a._mapDataMap[t].rate=1,a._mapDataMap[t].projection=e("../util/projection/svg")):(a._mapDataMap[t].rate=.75,a._mapDataMap[t].projection=e("../util/projection/normal")),a._buildMap(t,a._getProjectionData(t,o,n),i,n),a._buildMark(t,n),--a._mapDataRequireCounter<=0&&(a.addShapeList(),a.zr.refreshNextFrame()),a._buildHeatmap(t))}},_clearSelected:function(){for(var e in this._selected)this._activeMapType[this._mapTypeMap[e]]||(delete this._selected[e],delete this._mapTypeMap[e])},_getSubMapData:function(e,t){for(var i=e.replace(/^.*\|/,""),n=t.features,a=0,o=n.length;o>a;a++)if(n[a].properties&&n[a].properties.name==i){n=n[a],"United States of America"==i&&n.geometry.coordinates.length>1&&(n={geometry:{coordinates:n.geometry.coordinates.slice(5,6),type:n.geometry.type},id:n.id,properties:n.properties,type:n.type});break}return{type:"FeatureCollection",features:[n]}},_getProjectionData:function(e,t,i){var n,a=this._mapDataMap[e].projection,o=[],r=this._mapDataMap[e].bbox||a.getBbox(t,this._specialArea[e]);n=this._mapDataMap[e].hasRoam?this._mapDataMap[e].transform:this._getTransform(r,i,this._mapDataMap[e].rate);var s,l=this._mapDataMap[e].lastTransform||{scale:{}};n.left!=l.left||n.top!=l.top||n.scale.x!=l.scale.x||n.scale.y!=l.scale.y?(s=a.geoJson2Path(t,n,this._specialArea[e]),l=p.clone(n)):(n=this._mapDataMap[e].transform,s=this._mapDataMap[e].pathArray),this._mapDataMap[e].bbox=r,this._mapDataMap[e].transform=n,this._mapDataMap[e].lastTransform=l,this._mapDataMap[e].pathArray=s;for(var h=[n.left,n.top],m=0,V=s.length;V>m;m++)o.push(this._getSingleProvince(e,s[m],h));if(this._specialArea[e])for(var U in this._specialArea[e])o.push(this._getSpecialProjectionData(e,t,U,this._specialArea[e][U],h));if("china"==e){var d=this.geo2pos(e,b["南海诸岛"]||y["南海诸岛"].textCoord),c=n.scale.x/10.5,u=[32*c+d[0],83*c+d[1]];g["南海诸岛"]&&(u[0]+=g["南海诸岛"][0],u[1]+=g["南海诸岛"][1]),o.push({name:this._nameChange(e,"南海诸岛"),path:y["南海诸岛"].getPath(d,c),position:h,textX:u[0],textY:u[1]})}return o},_getSpecialProjectionData:function(t,i,n,a,o){i=this._getSubMapData("x|"+n,i);var r=e("../util/projection/normal"),s=r.getBbox(i),l=this.geo2pos(t,[a.left,a.top]),h=this.geo2pos(t,[a.left+a.width,a.top+a.height]),m=Math.abs(h[0]-l[0]),V=Math.abs(h[1]-l[1]),U=s.width,d=s.height,p=m/.75/U,c=V/d;p>c?(p=.75*c,m=U*p):(c=p,p=.75*c,V=d*c);var u={OffsetLeft:l[0],OffsetTop:l[1],scale:{x:p,y:c}},y=r.geoJson2Path(i,u);return this._getSingleProvince(t,y[0],o)},_getSingleProvince:function(e,t,i){var n,a=t.properties.name,o=g[a]||[0,0];if(b[a])n=this.geo2pos(e,b[a]);else if(t.cp)n=[t.cp[0]+o[0],t.cp[1]+o[1]];else{var r=this._mapDataMap[e].bbox;n=this.geo2pos(e,[r.left+r.width/2,r.top+r.height/2]),n[0]+=o[0],n[1]+=o[1]}return t.name=this._nameChange(e,a),t.position=i,t.textX=n[0],t.textY=n[1],t},_getTransform:function(e,t,i){var n,a,o,r,s,l,h,m=this.series,V=this.zr.getWidth(),U=this.zr.getHeight(),d=Math.round(.02*Math.min(V,U));for(var p in t)n=m[p].mapLocation||{},o=n.x||o,s=n.y||s,l=n.width||l,h=n.height||h;a=this.parsePercent(o,V),a=isNaN(a)?d:a,r=this.parsePercent(s,U),r=isNaN(r)?d:r,l=null==l?V-a-2*d:this.parsePercent(l,V),h=null==h?U-r-2*d:this.parsePercent(h,U);var c=e.width,u=e.height,y=l/i/c,g=h/u;if(y>g?(y=g*i,l=c*y):(g=y,y=g*i,h=u*g),isNaN(o))switch(o=o||"center",o+""){case"center":a=Math.floor((V-l)/2);break;case"right":a=V-l}if(isNaN(s))switch(s=s||"center",s+""){case"center":r=Math.floor((U-h)/2);break;case"bottom":r=U-h}return{left:a,top:r,width:l,height:h,baseScale:1,scale:{x:y,y:g}}},_buildMap:function(e,t,i,m){for(var V,c,u,y,g,b,f,k,x,_,L,W=this.series,X=this.component.legend,v=this.component.dataRange,w=0,K=t.length;K>w;w++){if(k=p.clone(t[w]),x={name:k.name,path:k.path,position:p.clone(k.position)},c=k.name,u=i[c]){g=[u],V="";for(var I=0,J=u.seriesIndex.length;J>I;I++){var C=W[u.seriesIndex[I]];g.push(C),V+=C.name+" ",X&&this._showLegendSymbol[e]&&X.hasColor(C.name)&&this.shapeList.push(new o({zlevel:C.zlevel,z:C.z+1,position:p.clone(k.position),_mapType:e,style:{x:k.textX+3+7*I,y:k.textY-10,r:3,color:X.getColor(C.name)},hoverable:!1}))}y=u.value}else{u={name:c,value:"-"},V="",g=[];for(var S in m)g.push(W[S]);y="-"}switch(this.ecTheme.map&&g.push(this.ecTheme.map),g.push(U.map),b=v&&!isNaN(y)?v.getColor(y):null,k.color=k.color||b||this.getItemStyleColor(this.deepQuery(g,"itemStyle.normal.color"),u.seriesIndex,-1,u)||this.deepQuery(g,"itemStyle.normal.areaStyle.color"),k.strokeColor=k.strokeColor||this.deepQuery(g,"itemStyle.normal.borderColor"),k.lineWidth=k.lineWidth||this.deepQuery(g,"itemStyle.normal.borderWidth"),x.color=this.getItemStyleColor(this.deepQuery(g,"itemStyle.emphasis.color"),u.seriesIndex,-1,u)||this.deepQuery(g,"itemStyle.emphasis.areaStyle.color")||k.color,x.strokeColor=this.deepQuery(g,"itemStyle.emphasis.borderColor")||k.strokeColor,x.lineWidth=this.deepQuery(g,"itemStyle.emphasis.borderWidth")||k.lineWidth,k.brushType=x.brushType=k.brushType||"both",k.lineJoin=x.lineJoin="round",k._name=x._name=c,f=this.deepQuery(g,"itemStyle.normal.label.textStyle"),L={zlevel:this.getZlevelBase(),z:this.getZBase()+1,position:p.clone(k.position),_mapType:e,_geo:this.pos2geo(e,[k.textX,k.textY]),style:{brushType:"fill",x:k.textX,y:k.textY,text:this.getLabelText(c,y,g,"normal"),_name:c,textAlign:"center",color:this.deepQuery(g,"itemStyle.normal.label.show")?this.deepQuery(g,"itemStyle.normal.label.textStyle.color"):"rgba(0,0,0,0)",textFont:this.getFont(f)}},L._style=p.clone(L.style),L.highlightStyle=p.clone(L.style),this.deepQuery(g,"itemStyle.emphasis.label.show")?(L.highlightStyle.text=this.getLabelText(c,y,g,"emphasis"),L.highlightStyle.color=this.deepQuery(g,"itemStyle.emphasis.label.textStyle.color")||L.style.color,f=this.deepQuery(g,"itemStyle.emphasis.label.textStyle")||f,L.highlightStyle.textFont=this.getFont(f)):L.highlightStyle.color="rgba(0,0,0,0)",_={zlevel:this.getZlevelBase(),z:this.getZBase(),position:p.clone(k.position),style:k,highlightStyle:x,_style:p.clone(k),_mapType:e},null!=k.scale&&(_.scale=p.clone(k.scale)),L=new n(L),_.style.shapeType){case"rectangle":_=new r(_);break;case"line":_=new s(_);break;case"circle":_=new o(_);break;case"polygon":_=new l(_);break;case"ellipse":_=new h(_);break;default:_=new a(_),_.buildPathArray&&(_.style.pathArray=_.buildPathArray(_.style.path))}(this._selectedMode[e]&&this._selected[c]&&u.selected!==!1||u.selected===!0)&&(L.style=L.highlightStyle,_.style=_.highlightStyle),L.clickable=_.clickable=this._clickable[e]&&(null==u.clickable||u.clickable),this._selectedMode[e]&&(this._selected[c]=null!=this._selected[c]?this._selected[c]:u.selected,this._mapTypeMap[c]=e,(null==u.selectable||u.selectable)&&(_.clickable=L.clickable=!0,_.onclick=L.onclick=this.shapeHandler.onclick)),this._hoverable[e]&&(null==u.hoverable||u.hoverable)?(L.hoverable=_.hoverable=!0,_.hoverConnect=L.id,L.hoverConnect=_.id):L.hoverable=_.hoverable=!1,d.pack(L,{name:V,tooltip:this.deepQuery(g,"tooltip")},0,u,0,c),this.shapeList.push(L),d.pack(_,{name:V,tooltip:this.deepQuery(g,"tooltip")},0,u,0,c),this.shapeList.push(_)}},_buildMark:function(e,t){this._seriesIndexToMapType=this._seriesIndexToMapType||{},this.markAttachStyle=this.markAttachStyle||{};var i=[this._mapDataMap[e].transform.left,this._mapDataMap[e].transform.top];"none"==e&&(i=[0,0]);for(var n in t)this._seriesIndexToMapType[n]=e,this.markAttachStyle[n]={position:i,_mapType:e},this.buildMark(n)},_buildHeatmap:function(e){for(var t=this.series,i=0,n=t.length;n>i;i++)if(t[i].heatmap){var a=t[i].heatmap.data;if(t[i].heatmap.needsTransform===!1){for(var o=[],r=0,s=a.length;s>r;++r)o.push([a[r][3],a[r][4],a[r][2]]);var l=[0,0]}else{var h=t[i].heatmap._geoData;if(void 0===h){t[i].heatmap._geoData=[];for(var r=0,s=a.length;s>r;++r)t[i].heatmap._geoData[r]=a[r];h=t[i].heatmap._geoData}for(var s=a.length,U=0;s>U;++U)a[U]=this.geo2pos(e,[h[U][0],h[U][1]]);var l=[this._mapDataMap[e].transform.left,this._mapDataMap[e].transform.top]}var d=new V(t[i].heatmap),p=d.getCanvas(a[0][3]?o:a,this.zr.getWidth(),this.zr.getHeight()),c=new m({zlevel:this.getZlevelBase(),z:this.getZBase()+1,position:l,scale:[1,1],hoverable:!1,style:{x:0,y:0,image:p,width:p.width,height:p.height}});c.type="heatmap",c._mapType=e,this.shapeList.push(c),this.zr.addShape(c)}},getMarkCoord:function(e,t){return t.geoCoord||b[t.name]?this.geo2pos(this._seriesIndexToMapType[e],t.geoCoord||b[t.name]):[0,0]},getMarkGeo:function(e){return e.geoCoord||b[e.name]},_nameChange:function(e,t){return this._nameMap[e][t]||t},getLabelText:function(e,t,i,n){var a=this.deepQuery(i,"itemStyle."+n+".label.formatter");return a?"function"==typeof a?a.call(this.myChart,e,t):"string"==typeof a?(a=a.replace("{a}","{a0}").replace("{b}","{b0}"),a=a.replace("{a0}",e).replace("{b0}",t)):void 0:e},_findMapTypeByPos:function(e,t){var i,n,a,o,r;for(var s in this._mapDataMap)if(i=this._mapDataMap[s].transform,i&&this._roamMap[s]&&this._activeMapType[s]&&(n=i.left,a=i.top,o=i.width,r=i.height,e>=n&&n+o>=e&&t>=a&&a+r>=t))return s},__onmousewheel:function(e){function t(e,t){for(var i=0;in;n++){var o=this.shapeList[n];if(o.__animating)return}var r,s,l=e.event,h=u.getX(l),m=u.getY(l),V=u.getDelta(l),d=e.mapTypeControl;d||(d={},s=this._findMapTypeByPos(h,m),s&&this._roamMap[s]&&"move"!=this._roamMap[s]&&(d[s]=!0));var p=!1;for(s in d)if(d[s]){p=!0;var c=this._mapDataMap[s].transform,y=c.left,g=c.top,b=c.width,f=c.height,k=this.pos2geo(s,[h-y,m-g]);if(V>0){if(r=1.2,null!=this._scaleLimitMap[s].max&&c.baseScale>=this._scaleLimitMap[s].max)continue}else if(r=1/1.2,null!=this._scaleLimitMap[s].min&&c.baseScale<=this._scaleLimitMap[s].min)continue;c.baseScale*=r,c.scale.x*=r,c.scale.y*=r,c.width=b*r,c.height=f*r,this._mapDataMap[s].hasRoam=!0,this._mapDataMap[s].transform=c,k=this.geo2pos(s,k),c.left-=k[0]-(h-y),c.top-=k[1]-(m-g),this._mapDataMap[s].transform=c,this.clearEffectShape(!0);for(var n=0,a=this.shapeList.length;a>n;n++){var o=this.shapeList[n];if(o._mapType==s){var x=o.type,_=o.style;switch(o.position[0]=c.left,o.position[1]=c.top,x){case"path":case"symbol":case"circle":case"rectangle":case"polygon":case"line":case"ellipse":case"heatmap":o.scale[0]*=r,o.scale[1]*=r;break;case"mark-line":i(_,r);break;case"polyline":t(_,r);break;case"shape-bundle":for(var L=0;L<_.shapeList.length;L++){var W=_.shapeList[L];"mark-line"==W.type?i(W.style,r):"polyline"==W.type&&t(W.style,r)}break;case"icon":case"image":k=this.geo2pos(s,o._geo),_.x=_._x=k[0]-_.width/2,_.y=_._y=k[1]-_.height/2;break;default:k=this.geo2pos(s,o._geo),_.x=k[0],_.y=k[1],"text"==x&&(o._style.x=o.highlightStyle.x=k[0],o._style.y=o.highlightStyle.y=k[1])}this.zr.modShape(o.id)}}}if(p){u.stop(l),this.zr.refreshNextFrame();var X=this;clearTimeout(this._refreshDelayTicket),this._refreshDelayTicket=setTimeout(function(){X&&X.shapeList&&X.animationEffect()},100),this.messageCenter.dispatch(U.EVENT.MAP_ROAM,e.event,{type:"scale"},this.myChart)}}},__onmousedown:function(e){if(!(this.shapeList.length<=0)){var t=e.target;if(!t||!t.draggable){var i=e.event,n=u.getX(i),a=u.getY(i),o=this._findMapTypeByPos(n,a);if(o&&this._roamMap[o]&&"scale"!=this._roamMap[o]){this._mousedown=!0,this._mx=n,this._my=a,this._curMapType=o,this.zr.on(c.EVENT.MOUSEUP,this._onmouseup);var r=this;setTimeout(function(){r.zr.on(c.EVENT.MOUSEMOVE,r._onmousemove)},100)}}}},__onmousemove:function(e){if(this._mousedown&&this._isAlive){var t=e.event,i=u.getX(t),n=u.getY(t),a=this._mapDataMap[this._curMapType].transform;a.hasRoam=!0,a.left-=this._mx-i,a.top-=this._my-n,this._mx=i,this._my=n,this._mapDataMap[this._curMapType].transform=a;for(var o=0,r=this.shapeList.length;r>o;o++)this.shapeList[o]._mapType==this._curMapType&&(this.shapeList[o].position[0]=a.left,this.shapeList[o].position[1]=a.top,this.zr.modShape(this.shapeList[o].id));this.messageCenter.dispatch(U.EVENT.MAP_ROAM,e.event,{type:"move"},this.myChart),this.clearEffectShape(!0),this.zr.refreshNextFrame(),this._justMove=!0,u.stop(t)}},__onmouseup:function(e){var t=e.event;this._mx=u.getX(t),this._my=u.getY(t),this._mousedown=!1;var i=this;setTimeout(function(){i._justMove&&i.animationEffect(),i._justMove=!1,i.zr.un(c.EVENT.MOUSEMOVE,i._onmousemove),i.zr.un(c.EVENT.MOUSEUP,i._onmouseup)},120)},__onroamcontroller:function(e){var t=e.event;t.zrenderX=this.zr.getWidth()/2,t.zrenderY=this.zr.getHeight()/2;var i=e.mapTypeControl,n=0,a=0,o=e.step;switch(e.roamType){case"scaleUp":return t.zrenderDelta=1,void this.__onmousewheel({event:t,mapTypeControl:i});case"scaleDown":return t.zrenderDelta=-1,void this.__onmousewheel({event:t,mapTypeControl:i});case"up":n=-o;break;case"down":n=o;break;case"left":a=-o;break;case"right":a=o}var r,s;for(s in i)this._mapDataMap[s]&&this._activeMapType[s]&&(r=this._mapDataMap[s].transform,r.hasRoam=!0,r.left-=a,r.top-=n,this._mapDataMap[s].transform=r);for(var l=0,h=this.shapeList.length;h>l;l++)s=this.shapeList[l]._mapType,i[s]&&this._activeMapType[s]&&(r=this._mapDataMap[s].transform,this.shapeList[l].position[0]=r.left,this.shapeList[l].position[1]=r.top,this.zr.modShape(this.shapeList[l].id));this.messageCenter.dispatch(U.EVENT.MAP_ROAM,e.event,{type:"move"},this.myChart),this.clearEffectShape(!0),this.zr.refreshNextFrame(),clearTimeout(this.dircetionTimer);var m=this;this.dircetionTimer=setTimeout(function(){m.animationEffect()},150)},__ondrhoverlink:function(e){for(var t,i,n=0,a=this.shapeList.length;a>n;n++)t=this.shapeList[n]._mapType,this._hoverLinkMap[t]&&this._activeMapType[t]&&(i=d.get(this.shapeList[n],"value"),null!=i&&i>=e.valueMin&&i<=e.valueMax&&this.zr.addHoverShape(this.shapeList[n]))},onclick:function(e){if(this.isClick&&e.target&&!this._justMove&&"icon"!=e.target.type){this.isClick=!1;var t=e.target,i=t.style._name,n=this.shapeList.length,a=t._mapType||"";if("single"==this._selectedMode[a])for(var o in this._selected)if(this._selected[o]&&this._mapTypeMap[o]==a){for(var r=0;n>r;r++)this.shapeList[r].style._name==o&&this.shapeList[r]._mapType==a&&(this.shapeList[r].style=this.shapeList[r]._style,this.zr.modShape(this.shapeList[r].id));o!=i&&(this._selected[o]=!1)}this._selected[i]=!this._selected[i];for(var r=0;n>r;r++)this.shapeList[r].style._name==i&&this.shapeList[r]._mapType==a&&(this.shapeList[r].style=this._selected[i]?this.shapeList[r].highlightStyle:this.shapeList[r]._style,this.zr.modShape(this.shapeList[r].id));this.messageCenter.dispatch(U.EVENT.MAP_SELECTED,e.event,{selected:this._selected,target:i},this.myChart),this.zr.refreshNextFrame();var s=this;setTimeout(function(){s.zr.trigger(c.EVENT.MOUSEMOVE,e.event)},100)}},refresh:function(e){e&&(this.option=e,this.series=e.series),this._mapDataRequireCounter>0?this.clear():this.backupShapeList(),this._buildShape(),this.zr.refreshHover()},ondataRange:function(e,t){this.component.dataRange&&(this.refresh(),t.needRefresh=!0)},pos2geo:function(e,t){return this._mapDataMap[e].transform?this._mapDataMap[e].projection.pos2geo(this._mapDataMap[e].transform,t):null},getGeoByPos:function(e,t){if(!this._mapDataMap[e].transform)return null;var i=[this._mapDataMap[e].transform.left,this._mapDataMap[e].transform.top];return t instanceof Array?(t[0]-=i[0],t[1]-=i[1]):(t.x-=i[0],t.y-=i[1]),this.pos2geo(e,t)},geo2pos:function(e,t){return this._mapDataMap[e].transform?this._mapDataMap[e].projection.geo2pos(this._mapDataMap[e].transform,t):null},getPosByGeo:function(e,t){if(!this._mapDataMap[e].transform)return null;var i=this.geo2pos(e,t);return i[0]+=this._mapDataMap[e].transform.left,i[1]+=this._mapDataMap[e].transform.top,i},getMapPosition:function(e){return this._mapDataMap[e].transform?[this._mapDataMap[e].transform.left,this._mapDataMap[e].transform.top]:null},onbeforDispose:function(){this._isAlive=!1,this.zr.un(c.EVENT.MOUSEWHEEL,this._onmousewheel),this.zr.un(c.EVENT.MOUSEDOWN,this._onmousedown),this.messageCenter.unbind(U.EVENT.ROAMCONTROLLER,this._onroamcontroller),this.messageCenter.unbind(U.EVENT.DATA_RANGE_HOVERLINK,this._ondrhoverlink)}},p.inherits(t,i),e("../chart").define("map",t),t}),i("zrender/shape/Path",["require","./Base","./util/PathProxy","../tool/util"],function(e){var t=e("./Base"),i=e("./util/PathProxy"),n=i.PathSegment,a=function(e){return Math.sqrt(e[0]*e[0]+e[1]*e[1])},o=function(e,t){return(e[0]*t[0]+e[1]*t[1])/(a(e)*a(t))},r=function(e,t){return(e[0]*t[1]0&&""===d[0]&&d.shift();for(var p=0;p0&&!isNaN(d[0]);){var c,u,y,g,b,f,k,x,_=null,L=[],W=h,X=m;switch(U){case"l":h+=d.shift(),m+=d.shift(),_="L",L.push(h,m);break;case"L":h=d.shift(),m=d.shift(),L.push(h,m);break;case"m":h+=d.shift(),m+=d.shift(),_="M",L.push(h,m),U="l";break;case"M":h=d.shift(),m=d.shift(),_="M",L.push(h,m),U="L";break;case"h":h+=d.shift(),_="L",L.push(h,m);break;case"H":h=d.shift(),_="L",L.push(h,m);break;case"v":m+=d.shift(),_="L",L.push(h,m);break;case"V":m=d.shift(),_="L",L.push(h,m);break;case"C":L.push(d.shift(),d.shift(),d.shift(),d.shift()),h=d.shift(),m=d.shift(),L.push(h,m);break;case"c":L.push(h+d.shift(),m+d.shift(),h+d.shift(),m+d.shift()),h+=d.shift(),m+=d.shift(),_="C",L.push(h,m);break;case"S":c=h,u=m,y=l[l.length-1],"C"===y.command&&(c=h+(h-y.points[2]),u=m+(m-y.points[3])),L.push(c,u,d.shift(),d.shift()),h=d.shift(),m=d.shift(),_="C",L.push(h,m);break;case"s":c=h,u=m,y=l[l.length-1],"C"===y.command&&(c=h+(h-y.points[2]),u=m+(m-y.points[3])),L.push(c,u,h+d.shift(),m+d.shift()),h+=d.shift(),m+=d.shift(),_="C",L.push(h,m);break;case"Q":L.push(d.shift(),d.shift()),h=d.shift(),m=d.shift(),L.push(h,m);break;case"q":L.push(h+d.shift(),m+d.shift()),h+=d.shift(),m+=d.shift(),_="Q",L.push(h,m);break;case"T":c=h,u=m,y=l[l.length-1],"Q"===y.command&&(c=h+(h-y.points[0]),u=m+(m-y.points[1])),h=d.shift(),m=d.shift(),_="Q",L.push(c,u,h,m);break;case"t":c=h,u=m,y=l[l.length-1],"Q"===y.command&&(c=h+(h-y.points[0]),u=m+(m-y.points[1])),h+=d.shift(),m+=d.shift(),_="Q",L.push(c,u,h,m);break;case"A":g=d.shift(),b=d.shift(),f=d.shift(),k=d.shift(),x=d.shift(),W=h,X=m,h=d.shift(),m=d.shift(),_="A",L=this._convertPoint(W,X,h,m,k,x,g,b,f);break;case"a":g=d.shift(),b=d.shift(),f=d.shift(),k=d.shift(),x=d.shift(),W=h,X=m,h+=d.shift(),m+=d.shift(),_="A",L=this._convertPoint(W,X,h,m,k,x,g,b,f)}for(var v=0,w=L.length;w>v;v+=2)L[v]+=t,L[v+1]+=i;l.push(new n(_||U,L))}("z"===U||"Z"===U)&&l.push(new n("z",[]))}return l},_convertPoint:function(e,t,i,n,a,s,l,h,m){var V=m*(Math.PI/180),U=Math.cos(V)*(e-i)/2+Math.sin(V)*(t-n)/2,d=-1*Math.sin(V)*(e-i)/2+Math.cos(V)*(t-n)/2,p=U*U/(l*l)+d*d/(h*h);p>1&&(l*=Math.sqrt(p),h*=Math.sqrt(p));var c=Math.sqrt((l*l*h*h-l*l*d*d-h*h*U*U)/(l*l*d*d+h*h*U*U));a===s&&(c*=-1),isNaN(c)&&(c=0);var u=c*l*d/h,y=c*-h*U/l,g=(e+i)/2+Math.cos(V)*u-Math.sin(V)*y,b=(t+n)/2+Math.sin(V)*u+Math.cos(V)*y,f=r([1,0],[(U-u)/l,(d-y)/h]),k=[(U-u)/l,(d-y)/h],x=[(-1*U-u)/l,(-1*d-y)/h],_=r(k,x);return o(k,x)<=-1&&(_=Math.PI),o(k,x)>=1&&(_=0),0===s&&_>0&&(_-=2*Math.PI),1===s&&0>_&&(_+=2*Math.PI),[g,b,l,h,f,_,V,s]},buildPath:function(e,t){var i=t.path,n=t.x||0,a=t.y||0;t.pathArray=t.pathArray||this.buildPathArray(i,n,a);for(var o=t.pathArray,r=t.pointList=[],s=[],l=0,h=o.length;h>l;l++){"M"==o[l].command.toUpperCase()&&(s.length>0&&r.push(s),s=[]);for(var m=o[l].points,V=0,U=m.length;U>V;V+=2)s.push([m[V],m[V+1]])}s.length>0&&r.push(s);for(var l=0,h=o.length;h>l;l++){var d=o[l].command,m=o[l].points;switch(d){case"L":e.lineTo(m[0],m[1]);break;case"M":e.moveTo(m[0],m[1]);break;case"C":e.bezierCurveTo(m[0],m[1],m[2],m[3],m[4],m[5]);break;case"Q":e.quadraticCurveTo(m[0],m[1],m[2],m[3]);break;case"A":var p=m[0],c=m[1],u=m[2],y=m[3],g=m[4],b=m[5],f=m[6],k=m[7],x=u>y?u:y,_=u>y?1:u/y,L=u>y?y/u:1;e.translate(p,c),e.rotate(f),e.scale(_,L),e.arc(0,0,x,g,g+b,1-k),e.scale(1/_,1/L),e.rotate(-f),e.translate(-p,-c);break;case"z":e.closePath()}}},getRect:function(e){if(e.__rect)return e.__rect;var t;t="stroke"==e.brushType||"fill"==e.brushType?e.lineWidth||1:0;for(var i=Number.MAX_VALUE,n=Number.MIN_VALUE,a=Number.MAX_VALUE,o=Number.MIN_VALUE,r=e.x||0,s=e.y||0,l=e.pathArray||this.buildPathArray(e.path),h=0;hn&&(n=m[V])):(m[V]+so&&(o=m[V]));var U;return U=i===Number.MAX_VALUE||n===Number.MIN_VALUE||a===Number.MAX_VALUE||o===Number.MIN_VALUE?{x:0,y:0,width:0,height:0}:{x:Math.round(i-t/2),y:Math.round(a-t/2),width:n-i+t,height:o-a+t},e.__rect=U,U}},e("../tool/util").inherits(s,t),s}),i("zrender/shape/Ellipse",["require","./Base","../tool/util"],function(e){var t=e("./Base"),i=function(e){t.call(this,e)};return i.prototype={type:"ellipse",buildPath:function(e,t){var i=.5522848,n=t.x,a=t.y,o=t.a,r=t.b,s=o*i,l=r*i;e.moveTo(n-o,a),e.bezierCurveTo(n-o,a-l,n-s,a-r,n,a-r),e.bezierCurveTo(n+s,a-r,n+o,a-l,n+o,a),e.bezierCurveTo(n+o,a+l,n+s,a+r,n,a+r),e.bezierCurveTo(n-s,a+r,n-o,a+l,n-o,a),e.closePath()},getRect:function(e){if(e.__rect)return e.__rect;var t;return t="stroke"==e.brushType||"fill"==e.brushType?e.lineWidth||1:0,e.__rect={x:Math.round(e.x-e.a-t/2), +y:Math.round(e.y-e.b-t/2),width:2*e.a+t,height:2*e.b+t},e.__rect}},e("../tool/util").inherits(i,t),i}),i("echarts/component/roamController",["require","./base","zrender/shape/Rectangle","zrender/shape/Sector","zrender/shape/Circle","../config","zrender/tool/util","zrender/tool/color","zrender/tool/event","../component"],function(e){function t(e,t,n,a,o){if(this.rcOption={},a.roamController&&a.roamController.show){if(!a.roamController.mapTypeControl)return void console.error("option.roamController.mapTypeControl has not been defined.");i.call(this,e,t,n,a,o),this.rcOption=a.roamController;var r=this;this._drictionMouseDown=function(e){return r.__drictionMouseDown(e)},this._drictionMouseUp=function(e){return r.__drictionMouseUp(e)},this._drictionMouseMove=function(e){return r.__drictionMouseMove(e)},this._drictionMouseOut=function(e){return r.__drictionMouseOut(e)},this._scaleHandler=function(e){return r.__scaleHandler(e)},this.refresh(a)}}var i=e("./base"),n=e("zrender/shape/Rectangle"),a=e("zrender/shape/Sector"),o=e("zrender/shape/Circle"),r=e("../config");r.roamController={zlevel:0,z:4,show:!0,x:"left",y:"top",width:80,height:120,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,handleColor:"#6495ed",fillerColor:"#fff",step:15,mapTypeControl:null};var s=e("zrender/tool/util"),l=e("zrender/tool/color"),h=e("zrender/tool/event");return t.prototype={type:r.COMPONENT_TYPE_ROAMCONTROLLER,_buildShape:function(){if(this.rcOption.show){this._itemGroupLocation=this._getItemGroupLocation(),this._buildBackground(),this._buildItem();for(var e=0,t=this.shapeList.length;t>e;e++)this.zr.addShape(this.shapeList[e])}},_buildItem:function(){this.shapeList.push(this._getDirectionShape("up")),this.shapeList.push(this._getDirectionShape("down")),this.shapeList.push(this._getDirectionShape("left")),this.shapeList.push(this._getDirectionShape("right")),this.shapeList.push(this._getScaleShape("scaleUp")),this.shapeList.push(this._getScaleShape("scaleDown"))},_getDirectionShape:function(e){var t=this._itemGroupLocation.r,i=this._itemGroupLocation.x+t,n=this._itemGroupLocation.y+t,o={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:i,y:n,r:t,startAngle:-45,endAngle:45,color:this.rcOption.handleColor,text:">",textX:i+t/2+4,textY:n-.5,textAlign:"center",textBaseline:"middle",textPosition:"specific",textColor:this.rcOption.fillerColor,textFont:Math.floor(t/2)+"px arial"},highlightStyle:{color:l.lift(this.rcOption.handleColor,-.2),brushType:"fill"},clickable:!0};switch(e){case"up":o.rotation=[Math.PI/2,i,n];break;case"left":o.rotation=[Math.PI,i,n];break;case"down":o.rotation=[-Math.PI/2,i,n]}return o=new a(o),o._roamType=e,o.onmousedown=this._drictionMouseDown,o.onmouseup=this._drictionMouseUp,o.onmousemove=this._drictionMouseMove,o.onmouseout=this._drictionMouseOut,o},_getScaleShape:function(e){var t=this._itemGroupLocation.width,i=this._itemGroupLocation.height-t;i=0>i?20:i;var n=Math.min(t/2-5,i)/2,a=this._itemGroupLocation.x+("scaleDown"===e?t-n:n),r=this._itemGroupLocation.y+this._itemGroupLocation.height-n,s={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:a,y:r,r:n,color:this.rcOption.handleColor,text:"scaleDown"===e?"-":"+",textX:a,textY:r-2,textAlign:"center",textBaseline:"middle",textPosition:"specific",textColor:this.rcOption.fillerColor,textFont:Math.floor(n)+"px verdana"},highlightStyle:{color:l.lift(this.rcOption.handleColor,-.2),brushType:"fill"},clickable:!0};return s=new o(s),s._roamType=e,s.onmousedown=this._scaleHandler,s},_buildBackground:function(){var e=this.reformCssArray(this.rcOption.padding);this.shapeList.push(new n({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._itemGroupLocation.x-e[3],y:this._itemGroupLocation.y-e[0],width:this._itemGroupLocation.width+e[3]+e[1],height:this._itemGroupLocation.height+e[0]+e[2],brushType:0===this.rcOption.borderWidth?"fill":"both",color:this.rcOption.backgroundColor,strokeColor:this.rcOption.borderColor,lineWidth:this.rcOption.borderWidth}}))},_getItemGroupLocation:function(){var e,t=this.reformCssArray(this.rcOption.padding),i=this.rcOption.width,n=this.rcOption.height,a=this.zr.getWidth(),o=this.zr.getHeight();switch(this.rcOption.x){case"center":e=Math.floor((a-i)/2);break;case"left":e=t[3]+this.rcOption.borderWidth;break;case"right":e=a-i-t[1]-t[3]-2*this.rcOption.borderWidth;break;default:e=this.parsePercent(this.rcOption.x,a)}var r;switch(this.rcOption.y){case"top":r=t[0]+this.rcOption.borderWidth;break;case"bottom":r=o-n-t[0]-t[2]-2*this.rcOption.borderWidth;break;case"center":r=Math.floor((o-n)/2);break;default:r=this.parsePercent(this.rcOption.y,o)}return{x:e,y:r,r:i/2,width:i,height:n}},__drictionMouseDown:function(e){this.mousedown=!0,this._drictionHandlerOn(e)},__drictionMouseUp:function(e){this.mousedown=!1,this._drictionHandlerOff(e)},__drictionMouseMove:function(e){this.mousedown&&this._drictionHandlerOn(e)},__drictionMouseOut:function(e){this._drictionHandlerOff(e)},_drictionHandlerOn:function(e){this._dispatchEvent(e.event,e.target._roamType),clearInterval(this.dircetionTimer);var t=this;this.dircetionTimer=setInterval(function(){t._dispatchEvent(e.event,e.target._roamType)},100),h.stop(e.event)},_drictionHandlerOff:function(){clearInterval(this.dircetionTimer)},__scaleHandler:function(e){this._dispatchEvent(e.event,e.target._roamType),h.stop(e.event)},_dispatchEvent:function(e,t){this.messageCenter.dispatch(r.EVENT.ROAMCONTROLLER,e,{roamType:t,mapTypeControl:this.rcOption.mapTypeControl,step:this.rcOption.step},this.myChart)},refresh:function(e){e&&(this.option=e||this.option,this.option.roamController=this.reformOption(this.option.roamController),this.rcOption=this.option.roamController),this.clear(),this._buildShape()}},s.inherits(t,i),e("../component").define("roamController",t),t}),i("echarts/layer/heatmap",["require"],function(){function e(e){if(this.option=e,e)for(var i in t)this.option[i]=void 0!==e[i]?e[i]:t[i];else this.option=t}var t={blurSize:30,gradientColors:["blue","cyan","lime","yellow","red"],minAlpha:.05,valueScale:1,opacity:1},i=20,n=256;return e.prototype={getCanvas:function(e,t,a){var o=this._getBrush(),r=this._getGradient(),s=i+this.option.blurSize,l=document.createElement("canvas");l.width=t,l.height=a;for(var h=l.getContext("2d"),m=e.length,V=0;m>V;++V){var U=e[V],d=U[0],p=U[1],c=U[2],u=Math.min(1,Math.max(c*this.option.valueScale||this.option.minAlpha,this.option.minAlpha));h.globalAlpha=u,h.drawImage(o,d-s,p-s)}for(var y=h.getImageData(0,0,l.width,l.height),g=y.data,m=g.length/4;m--;){var b=4*m+3,u=g[b]/256,f=Math.floor(u*(n-1));g[b-3]=r[4*f],g[b-2]=r[4*f+1],g[b-1]=r[4*f+2],g[b]*=this.option.opacity}return h.putImageData(y,0,0),l},_getBrush:function(){if(!this._brushCanvas){this._brushCanvas=document.createElement("canvas");var e=i+this.option.blurSize,t=2*e;this._brushCanvas.width=t,this._brushCanvas.height=t;var n=this._brushCanvas.getContext("2d");n.shadowOffsetX=t,n.shadowBlur=this.option.blurSize,n.shadowColor="black",n.beginPath(),n.arc(-e,e,i,0,2*Math.PI,!0),n.closePath(),n.fill()}return this._brushCanvas},_getGradient:function(){if(!this._gradientPixels){var e=n,t=document.createElement("canvas");t.width=1,t.height=e;for(var i=t.getContext("2d"),a=i.createLinearGradient(0,0,0,e),o=this.option.gradientColors.length,r=0;o>r;++r)"string"==typeof this.option.gradientColors[r]?a.addColorStop((r+1)/o,this.option.gradientColors[r]):a.addColorStop(this.option.gradientColors[r].offset,this.option.gradientColors[r].color);i.fillStyle=a,i.fillRect(0,0,1,e),this._gradientPixels=i.getImageData(0,0,1,e).data}return this._gradientPixels}},e}),i("echarts/util/mapData/params",["require"],function(e){function t(e){if(!e.UTF8Encoding)return e;for(var t=e.features,n=0;n>1^-(1&r),s=s>>1^-(1&s),r+=n,s+=a,n=r,a=s,i.push([r/1024,s/1024])}return i}var n={none:{getGeoJson:function(e){e({type:"FeatureCollection",features:[{type:"Feature",geometry:{coordinates:[],encodeOffsets:[],type:"Polygon"},properties:{}}]})}},world:{getGeoJson:function(i){e(["./geoJson/world_geo"],function(e){i(t(e))})}},china:{getGeoJson:function(i){e(["./geoJson/china_geo"],function(e){i(t(e))})}},"南海诸岛":{textCoord:[126,25],getPath:function(e,t){for(var i=[[[0,3.5],[7,11.2],[15,11.9],[30,7],[42,.7],[52,.7],[56,7.7],[59,.7],[64,.7],[64,0],[5,0],[0,3.5]],[[13,16.1],[19,14.7],[16,21.7],[11,23.1],[13,16.1]],[[12,32.2],[14,38.5],[15,38.5],[13,32.2],[12,32.2]],[[16,47.6],[12,53.2],[13,53.2],[18,47.6],[16,47.6]],[[6,64.4],[8,70],[9,70],[8,64.4],[6,64.4]],[[23,82.6],[29,79.8],[30,79.8],[25,82.6],[23,82.6]],[[37,70.7],[43,62.3],[44,62.3],[39,70.7],[37,70.7]],[[48,51.1],[51,45.5],[53,45.5],[50,51.1],[48,51.1]],[[51,35],[51,28.7],[53,28.7],[53,35],[51,35]],[[52,22.4],[55,17.5],[56,17.5],[53,22.4],[52,22.4]],[[58,12.6],[62,7],[63,7],[60,12.6],[58,12.6]],[[0,3.5],[0,93.1],[64,93.1],[64,0],[63,0],[63,92.4],[1,92.4],[1,3.5],[0,3.5]]],n="",a=e[0],o=e[1],r=0,s=i.length;s>r;r++){n+="M "+((i[r][0][0]*t+a).toFixed(2)-0)+" "+((i[r][0][1]*t+o).toFixed(2)-0)+" ";for(var l=1,h=i[r].length;h>l;l++)n+="L "+((i[r][l][0]*t+a).toFixed(2)-0)+" "+((i[r][l][1]*t+o).toFixed(2)-0)+" "}return n+" Z"}},"新疆":{getGeoJson:function(i){e(["./geoJson/xin_jiang_geo"],function(e){i(t(e))})}},"西藏":{getGeoJson:function(i){e(["./geoJson/xi_zang_geo"],function(e){i(t(e))})}},"内蒙古":{getGeoJson:function(i){e(["./geoJson/nei_meng_gu_geo"],function(e){i(t(e))})}},"青海":{getGeoJson:function(i){e(["./geoJson/qing_hai_geo"],function(e){i(t(e))})}},"四川":{getGeoJson:function(i){e(["./geoJson/si_chuan_geo"],function(e){i(t(e))})}},"黑龙江":{getGeoJson:function(i){e(["./geoJson/hei_long_jiang_geo"],function(e){i(t(e))})}},"甘肃":{getGeoJson:function(i){e(["./geoJson/gan_su_geo"],function(e){i(t(e))})}},"云南":{getGeoJson:function(i){e(["./geoJson/yun_nan_geo"],function(e){i(t(e))})}},"广西":{getGeoJson:function(i){e(["./geoJson/guang_xi_geo"],function(e){i(t(e))})}},"湖南":{getGeoJson:function(i){e(["./geoJson/hu_nan_geo"],function(e){i(t(e))})}},"陕西":{getGeoJson:function(i){e(["./geoJson/shan_xi_1_geo"],function(e){i(t(e))})}},"广东":{getGeoJson:function(i){e(["./geoJson/guang_dong_geo"],function(e){i(t(e))})}},"吉林":{getGeoJson:function(i){e(["./geoJson/ji_lin_geo"],function(e){i(t(e))})}},"河北":{getGeoJson:function(i){e(["./geoJson/he_bei_geo"],function(e){i(t(e))})}},"湖北":{getGeoJson:function(i){e(["./geoJson/hu_bei_geo"],function(e){i(t(e))})}},"贵州":{getGeoJson:function(i){e(["./geoJson/gui_zhou_geo"],function(e){i(t(e))})}},"山东":{getGeoJson:function(i){e(["./geoJson/shan_dong_geo"],function(e){i(t(e))})}},"江西":{getGeoJson:function(i){e(["./geoJson/jiang_xi_geo"],function(e){i(t(e))})}},"河南":{getGeoJson:function(i){e(["./geoJson/he_nan_geo"],function(e){i(t(e))})}},"辽宁":{getGeoJson:function(i){e(["./geoJson/liao_ning_geo"],function(e){i(t(e))})}},"山西":{getGeoJson:function(i){e(["./geoJson/shan_xi_2_geo"],function(e){i(t(e))})}},"安徽":{getGeoJson:function(i){e(["./geoJson/an_hui_geo"],function(e){i(t(e))})}},"福建":{getGeoJson:function(i){e(["./geoJson/fu_jian_geo"],function(e){i(t(e))})}},"浙江":{getGeoJson:function(i){e(["./geoJson/zhe_jiang_geo"],function(e){i(t(e))})}},"江苏":{getGeoJson:function(i){e(["./geoJson/jiang_su_geo"],function(e){i(t(e))})}},"重庆":{getGeoJson:function(i){e(["./geoJson/chong_qing_geo"],function(e){i(t(e))})}},"宁夏":{getGeoJson:function(i){e(["./geoJson/ning_xia_geo"],function(e){i(t(e))})}},"海南":{getGeoJson:function(i){e(["./geoJson/hai_nan_geo"],function(e){i(t(e))})}},"台湾":{getGeoJson:function(i){e(["./geoJson/tai_wan_geo"],function(e){i(t(e))})}},"北京":{getGeoJson:function(i){e(["./geoJson/bei_jing_geo"],function(e){i(t(e))})}},"天津":{getGeoJson:function(i){e(["./geoJson/tian_jin_geo"],function(e){i(t(e))})}},"上海":{getGeoJson:function(i){e(["./geoJson/shang_hai_geo"],function(e){i(t(e))})}},"香港":{getGeoJson:function(i){e(["./geoJson/xiang_gang_geo"],function(e){i(t(e))})}},"澳门":{getGeoJson:function(i){e(["./geoJson/ao_men_geo"],function(e){i(t(e))})}}};return{decode:t,params:n}}),i("echarts/util/mapData/textFixed",[],function(){return{"广东":[0,-10],"香港":[10,10],"澳门":[-10,18],"黑龙江":[0,20],"天津":[5,5],"深圳市":[-35,0],"红河哈尼族彝族自治州":[0,20],"楚雄彝族自治州":[-5,15],"石河子市":[-5,5],"五家渠市":[0,-10],"昌吉回族自治州":[10,10],"昌江黎族自治县":[0,20],"陵水黎族自治县":[0,20],"东方市":[0,20],"渭南市":[0,20]}}),i("echarts/util/mapData/geoCoord",[],function(){return{Russia:[100,60],"United States of America":[-99,38]}}),i("echarts/util/projection/svg",["require","zrender/shape/Path"],function(e){function t(e){return parseFloat(e||0)}function i(e){for(var i=e.firstChild;"svg"!=i.nodeName.toLowerCase()||1!=i.nodeType;)i=i.nextSibling;var n=t(i.getAttribute("x")),a=t(i.getAttribute("y")),o=t(i.getAttribute("width")),r=t(i.getAttribute("height"));return{left:n,top:a,width:o,height:r}}function n(e,t){function i(e){var t=e.tagName;if(m[t]){var o=m[t](e,n);o&&(o.scale=n,o.properties={name:e.getAttribute("name")||""},o.id=e.id,s(o,e),a.push(o))}for(var r=e.childNodes,l=0,h=r.length;h>l;l++)i(r[l])}var n=[t.scale.x,t.scale.y],a=[];return i(e),a}function a(e,t){var i=t instanceof Array?[1*t[0],1*t[1]]:[1*t.x,1*t.y];return[i[0]/e.scale.x,i[1]/e.scale.y]}function o(e,t){var i=t instanceof Array?[1*t[0],1*t[1]]:[1*t.x,1*t.y];return[i[0]*e.scale.x,i[1]*e.scale.y]}function r(e){return e.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}function s(e,t){var i=t.getAttribute("fill"),n=t.getAttribute("stroke"),a=t.getAttribute("stroke-width"),o=t.getAttribute("opacity");i&&"none"!=i?(e.color=i,n?(e.brushType="both",e.strokeColor=n):e.brushType="fill"):n&&"none"!=n&&(e.strokeColor=n,e.brushType="stroke"),a&&"none"!=a&&(e.lineWidth=parseFloat(a)),o&&"none"!=o&&(e.opacity=parseFloat(o))}function l(e){for(var t=r(e).replace(/,/g," ").split(/\s+/),i=[],n=0;no;o++)if(n=a[o],!n.properties.name||!t[n.properties.name])switch(n.type){case"Feature":r[n.geometry.type](n.geometry.coordinates);break;case"GeometryCollection":i=n.geometries;for(var l=0,h=i.length;h>l;l++)r[i[l].type](i[l].coordinates)}return e.srcSize={left:1*r.xmin.toFixed(4),top:1*r.ymin.toFixed(4),width:1*(r.xmax-r.xmin).toFixed(4),height:1*(r.ymax-r.ymin).toFixed(4)},e}function i(e,i,n){function a(e,t){c=e.type,u=e.coordinates,o._bbox={xmin:360,xmax:-360,ymin:180,ymax:-180},y=o[c](u),m.push({path:y,cp:o.makePoint(t.properties.cp?t.properties.cp:[(o._bbox.xmin+o._bbox.xmax)/2,(o._bbox.ymin+o._bbox.ymax)/2]),properties:t.properties,id:t.id})}n=n||{},o.scale=null,o.offset=null,e.srcSize||t(e,n),i.offset={x:e.srcSize.left,y:e.srcSize.top,left:i.OffsetLeft||0,top:i.OffsetTop||0},o.scale=i.scale,o.offset=i.offset;for(var r,s,l,h=e.features,m=[],V=0,U=h.length;U>V;V++)if(l=h[V],!l.properties.name||!n[l.properties.name])if("Feature"==l.type)a(l.geometry,l);else if("GeometryCollection"==l.type){r=l.geometries;for(var d=0,p=r.length;p>d;d++)s=r[d],a(s,s)}var c,u,y;return m}function n(e,t){var i,n;return t instanceof Array?(i=1*t[0],n=1*t[1]):(i=1*t.x,n=1*t.y),i=i/e.scale.x+e.offset.x-168.5,i=i>180?i-360:i,n=90-(n/e.scale.y+e.offset.y),[i,n]}function a(e,t){return o.offset=e.offset,o.scale=e.scale,o.makePoint(t instanceof Array?[1*t[0],1*t[1]]:[1*t.x,1*t.y])}var o={formatPoint:function(e){return[(e[0]<-168.5&&e[1]>63.8?e[0]+360:e[0])+168.5,90-e[1]]},makePoint:function(e){var t=this,i=t.formatPoint(e);t._bbox.xmin>e[0]&&(t._bbox.xmin=e[0]),t._bbox.xmaxe[1]&&(t._bbox.ymin=e[1]),t._bbox.ymaxn;n++)t=o.makePoint(e[n]),i=0===n?"M"+t.join(","):i+"L"+t.join(",");return i},Polygon:function(e){for(var t="",i=0,n=e.length;n>i;i++)t=t+o.LineString(e[i])+"z";return t},MultiPoint:function(e){for(var t=[],i=0,n=e.length;n>i;i++)t.push(o.Point(e[i]));return t},MultiLineString:function(e){for(var t="",i=0,n=e.length;n>i;i++)t+=o.LineString(e[i]);return t},MultiPolygon:function(e){for(var t="",i=0,n=e.length;n>i;i++)t+=o.Polygon(e[i]);return t}},r={formatPoint:o.formatPoint,makePoint:function(e){var t=this,i=t.formatPoint(e),n=i[0],a=i[1];t.xmin>n&&(t.xmin=n),t.xmaxa&&(t.ymin=a),t.ymaxt;t++)this.makePoint(e[t])},Polygon:function(e){for(var t=0,i=e.length;i>t;t++)this.LineString(e[t])},MultiPoint:function(e){for(var t=0,i=e.length;i>t;t++)this.Point(e[t])},MultiLineString:function(e){for(var t=0,i=e.length;i>t;t++)this.LineString(e[t])},MultiPolygon:function(e){for(var t=0,i=e.length;i>t;t++)this.Polygon(e[t])}};return{getBbox:e,geoJson2Path:i,pos2geo:n,geo2pos:a}}),i("echarts/util/mapData/geoJson/an_hui_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"3415",properties:{name:"六安市",cp:[116.3123,31.8329],childNum:6},geometry:{type:"Polygon",coordinates:["@@„„nJ‚UXUVƒ°U„ÑnU@mlLVaVln@@bn@VU@xlb@lšLnKlšƒVI„JšUVxnI@lVL@b„ްVX@˜b„x„nVVUnVVnU‚›@kX@VwV@„al¥UUnUWa@ƒ@wĸU„LU¥lKUa@aUI@alLVaUƒ¯anƒWkUKm@XV@VaXlW@aU_UWVUƒI¯@ma¯W¯™™I@UU@WWU@U@@UU@VkV@@WUUm@UaU@„lK@IUK„L@KWmXUWaXI@ƒ@a@a@U@U@KV¥lw„k°b²JVIVKlV@UX„la„Ul`œUVLVVVUšJ„U@Lnm@_VK@KUIW@™J@Xk@WW@U—ƒmm™XmWk@kK@aUUƒVmmkUwUmWL™@WmU@™UJmUULkKWakLWVkIƒlƒwULƒW@X°lUJ@°ULƒWV—wmJ@bmb¯Vkm@@WkWm¯wƒL@lkXƒWmXym¯UImJUbkV™@Vn¯„@V@lUbƒ@mk@maUxmlUbULWn@J—LmKUkWKkwUKƒbm„X„WxkVUKmLkVV@JUUWL@xkJUUƒV@X@VVlUbVX@xk¤šx‚¼œxWxn„‚nn@Þ¼„JVb°aVn„@šmlnXU„JlbVlkz@‚lUŽlXJmxVxXnWxXÈWlUŽ@šUxU@VX@xUL@šUÆmLnV@lWXk@@JlbXblnlJ"],encodeOffsets:[[118710,33351]]}},{type:"Feature",id:"3408",properties:{name:"安庆市",cp:[116.7517,30.5255],childNum:9},geometry:{type:"Polygon",coordinates:["@@n°‚znW„XlW@k„K°xXn‚l@Xn@l‚°Una@anI˜xXU„ŽVK@¯VIkW¯X@‚„VK„x„klJXUlKXblLVKnVVIšŽV@Xn‚@šŽXKVnVxlŽnn„UlmV@²óUkV™lW„b„lƒšƒn@VVVIn@lw@WVIXblV„@Èx‚aUaVIVVnKVLšK„ƒln@b²K@»U£ƒÑķƒġÝÅb™K™a@Im@ۍ„@kWÓkkmKÅnóJƒUÅ£›W@w„ĕ@wĉţ¯¯ƒUkK±l¯Uƒ¥UÑkÝUķ»Ý¥¯™JƒIUŽVbUl¯ÈV¼VJU¼Vb@bkLUl@„VJ@bUXǚ@lkVmXmKkLVxš‚Ž„VƒL@VkVVVlzW˜kbmLUUUbVbUV™šlÒnJlUnLllUL@bU„Vx„l‚LXVƦÈVU¦WJ"],encodeOffsets:[[118834,31759]]}},{type:"Feature",id:"3411",properties:{name:"滁州市",cp:[118.1909,32.536],childNum:7},geometry:{type:"Polygon",coordinates:["@@š„@`nnl@„xšK@X°KXV˜IXVlbXVWnX‚lL@šÈ»‚LVan@VJ„êVVn@‚X@laÞbVaƒyn@„_‚xnWVXnWl@VnUVkI@l‚nXKVLVV@V@kW@LlVô„@J@bVnnKnkVa@»lç@ƒnwšKma™UUUVњ@n™mWXalI@alVn@VwUaVU„@„nlaôJnU„VVXlJšaXXVK@UšV@VWx@nXVWšXVšUlLUbV‚ULVVnUVbUbVbš@@a„KÆnnKVK@U@UU@@a„@Vƒ°¯ÈJVIlķ@aa˜UaVKU_@mkxUI@aƒUlyU@@™wkKWmUbUnUVWbkJW_J@bƒn@Vm@@KULk@V@@bVbÅm@LW@UVVbkK@UkKWL@VULUKWIUJUbkK@_WVXU›Jka@XƒVa@kšy@aVIUUW@@m„UlLœKWÑUKVan@UkVmmIXKƒaVaUwVU@UmykU¯@±UUL@WUIVUU@KkIWaƒaU@kUUaǃUó»mKƒk¯@y@kWK@bkI¯`mn™l¯XWlkVUzUJlbUbVJl@nnm„@VULV`XnWƗbmUUn™JmUknƒJ¯km@ƒyk@kU›xL@VUbmnn¤lX@`™z@JmaULUVl@Xn@xllkXWa—aW@UVmUbƒ@mVXšWxXbWbUŽƒÒnVVnVVUL"],encodeOffsets:[[120004,33520]]}},{type:"Feature",id:"3418",properties:{name:"宣城市",cp:[118.8062,30.6244],childNum:7},geometry:{type:"Polygon",coordinates:["@@Vb@„XL˜JXxlIXxlVlV@I²¤šnlUnVšU@VULWVUJ@Lnb@lV@UnV@@VVVlLnbnJ‚UVkUUVWn@@anUVnVJVIV‚@@nUJVbUb‚„@VUbVK@bn@VbnIlxkllXVlXKWUXUlL°¤UVVb@bš„UlkXW‚ƒxXz@‚„Ila„UlƒnUlJVInVÆJ„U„LVUnV„K°@VnlVnxV@XLlK@wVL@KnUlJXU˜bnKVLX„lUw@VWlLXKm@@a„@VLnmlIVVnKn@škVašVlwk@@a@k@ƒVIUa™@maUa@wna@kmWƒ™UUmVUIVǗ@aƒKm™aƒ™kU™J@InmUUaVa„k‚lX@Vk@m@VU@wnK@alKVUkUkKƒbmUkmƒ@U£WVk@@UÝbbƒaÇx@b@WVUa¯ƒ@wVwUUV@VwnK@KWaŁ@KšIUyUI@WmXó™UbWaKm™@km@IUyƒIUaWKƒx@zUKUL@llVUnkLVVkJWX@VUKUVƒIkVWakb@VWb@n@JkXUlmL@xkL@`VxšLUÈUJ@Vm@@bmIUlUL@VUVVbknm@mKUw™KVÈ@J@LV±kkJUIƒl"],encodeOffsets:[[120803,31247]]}},{type:"Feature",id:"3412",properties:{name:"阜阳市",cp:[115.7629,32.9919],childNum:6},geometry:{type:"Polygon",coordinates:["@@V™nƒš@ša„k°aš±@‚¥@UUI@aUmlwUUx›b@¥XU@mmI@a@Kn@@_W@@W„I@mšUVVXUl@XaV@‚K@I@a„LX@aVI°K@KVL„UUw‚yXkšK@kšKÆbXnlK@k@a„JlU@w@U@»@aXKWƒn_‚JXkVKnƒ@°LlKXƒW@¯Uƒ@aUK@kmJUw™VƒIUJ™„kŽmL™K@kka@wUVm@@am@UkUbkK@nmVƒÒ¯VU„WVVmIƒƒULk@ƒƒma@kkKƒƒ@nUbUamU™`UUVUkKVkkƒW@@bkmƒnƒmUXVKXVƒL@VƒbU„m‚™bVXJ@nmKÅI@KWKUXVJUL@VUKUX@KUKWL@LUJmaXXm@kVVV@L@VUL@VlK@L@V@LUK@VUb@UUU@°@nVxU`‚Lkn@`@XVJ@X™Vm„k@UKmV¯LVVn±Wm@Ub@JlLUl„@VLk„@lmVVn@bnV@V°IV™šaVJXI°K°V@XXVlVVU„nšKVlUš„bWXnV@bV`U„„@@m@@‚ƒ@nxmn@bXVlL@¤nb„Ul¦šVVUnJVU„Vl@@bÞL"],encodeOffsets:[[118418,34392]]}},{type:"Feature",id:"3413",properties:{name:"宿州市",cp:[117.5208,33.6841],childNum:5},geometry:{type:"Polygon",coordinates:["@@@UWU@bkW@aWU@aUIkWV™lLXb„lVIUVV@‚mn@V_n@VaUK@I‚@UašanJVU„@lV„UVnnKVVlaUa„I@wnK‚Lnll@nVlk@wVKXkl@@b„bUJ@V‚U@U„UUyVk@aVUXwlWXX‚WU¹@aU™@WUI@mlUšn„J@Il@šaXbV@VKl@XxVL@W„IšJlb„@„al@„IUUm@@aVK@¥¯—@mUķ¯bWƒk£Vm@akm@VaÅ@UVWaƒ@UJWkƒJ—UƒbWbU@UlƒXk@ƒamV@K¯nk@ƒlU@Uxmz@bU`ÇbUbÅVm£U@Ww™x@akLUK@UlakwUJWVkLmaUal@n_ƒmVUnKVUUmÅXWa™@kJmx@XUJ@bVLXxl@VVUVV„UbkLWbU@@lUVV„VVX„›K@XkJ@nU@@bV@VxUVlb„U@xXLWŽn@UxVbVĊ„V@b@XV`mnkJ@kUKmbƒaU@VbnbÆx@XU@@`k@@bl„™@@bkL@WƒakXWaU@Vmkx@XWW@@wUUUbƒJ™U¯V™@¯ÞU@WxXŽlL@bkb@ŽlVlnb™JW@kkU@mbkaWJ—IVlmz¯`UnU@mb™@@„ƒ`@bkVlœnV@b@šV@„aVxn@Vx‚KXnl@nbVK„bVK@a„_V@Vƒ„w@W„LlwnK@UmIU@VWš@šUÈ@lKnal„wš@@V°@šaUmlUUw@„ƒV@@UXK"],encodeOffsets:[[119836,35061]]}},{type:"Feature",id:"3410",properties:{name:"黄山市",cp:[118.0481,29.9542],childNum:5},geometry:{type:"Polygon",coordinates:["@@lXnlWX@VUJVnUJVzXJVx„kVJlI²l‚U@K@IUǚLVxnLn@lmUaVU@UVKVknJ@an@@UVIVǙKUw@_lK@wnKVklW@I@mXa@UlaXblU„JVUVL@UXWlIUUlKVmkU@kVKVL@y„wXLVb„JVz@Jlnš@nŽ‚LXbVaôšnW@la@UVWUa@@a@mk@WIk@VwUa¯¥m@UUVK@ImK@aX£ƒkK›ÅV™a™™ƒ_@±ƒakXWW—LƒƒƒnU@@a@¯mK@L™JUWwUV™VmbXX@lWLn`mzUJUb™Lƒ„k@makVWmkX™ambkKknƒaƒ@ƒaƒb@‚U@Unm@—ƒWVƒ@VbUbUJWIk@@lmL@°UVUVm„nš™@@kmWkb@xƒ_m@@aU@b@JlŽUz™lWxXn„@‚b²@l`„IVl„UlL@VšK„nVbUl@VlIn@@b„bVWUk‚@@bX@Valb@bnb°Vn@„xVKlbVnV@V‚x„L@ln@UXVV‚L˜"],encodeOffsets:[[120747,31095]]}},{type:"Feature",id:"3414",properties:{name:"巢湖市",cp:[117.7734,31.4978],childNum:5},geometry:{type:"Polygon",coordinates:["@@VV@blL@ŽXlWnnšnŽ˜„@VXXl@@WšIX@VJ@LšxŎxlnšŽ@bXJVblX@VVbUVn@VbUVlb@LnJVbVLV‚XLšÒVL„ÒšV„bVIVylUXk°Wšknm°_lJ@aXL@l‚z°@„lnLô¼V‚È„VUUaVKU@WW@@UUa@knmVLlaV@„a@kšak±@UmwkKmk™lj™ÝUUkL@mlIVmnÝWkkUÝ@KƑĉ™a@»ƒmma@mX™¤¯Uƒw@ƒ@UU@bU±±L@akmƒ„™LUKmLUUUJVbbÇwƒ@kUWaUJ@Xkxm@UJUUm@™„k„ƒ‚ƒakXUšVl±ôU@kn"],encodeOffsets:[[119847,32007]]}},{type:"Feature",id:"3416",properties:{name:"亳州市",cp:[116.1914,33.4698],childNum:4},geometry:{type:"Polygon",coordinates:["@@lU@Un@@anUlw@KVmUwlaX_lKna@KU@@kWKUU@ankW™XK˜@@V²VVIÈU@al@VaÈamK@wU™@klaUƒV@XƒVUU»WUUbkmUkVmk@aÈw@mWU@VkIkVWKUÑķXȭºU¯lƒ@kkLWmÅa™L@l™LWlzVxƒVUK@L¯LUJ@bWƒK@b@JLU@Wbk@WVUU™V@nƒJ@XX@@`m@@L@bnJ@nWV@¦œa‚wVVkxVn@bVJ@V¦@Ž™²¯bƒl™b™@m„UšUŽƒŽ@¼ƒ¦Xb‚UV`@nnxUxWLkUkVWKkV@XV@@VVL@VX„@lVV@L@blL@`šL@xXKVL‚@„VnUš@lwnU@ml@XnV@@UVW°LnalƒUI@aUK@a‚a@U„kXW@I@mWL@UXK@UVW@U‚@@k„Wn‚@@V„@XblaVxšL@bVKXb„IlJ"],encodeOffsets:[[119183,34594]]}},{type:"Feature",id:"3417",properties:{name:"池州市",cp:[117.3889,30.2014],childNum:4},geometry:{type:"Polygon",coordinates:["@@„V°°ĊŤ@xƒĖ@xœXƤ„VôIÆmnLllXÔ@lƒÜŽn@@JšbšLÆaĢÞĸ„°VVUUKVanK@UV@VL„VVn„ln@‚xnklxXamk@WV@Xa˜@naVk„Klk™@mkUWwkJWw—IWK@ƒUaUwWIUyVIUmVI@UXWmkkW‚—KUUVWm@@kƒKw@U‚UUmkaULƒwm@¯Uma@akaUbW@@a@VlUXƒa@am@kJ@UVkUaƒm™L@UkKƒVUkƒJk_±@aƒ@WmXwÇkkaVaUa±ƒœwV@VkƒwnyUaW@UU¯amLk@m™@kmmU™™¯K@L@lUX¯ƒWlkXƒŽVb„bƒVUL@J@LVKnlJXnlb@`nXlalV@bnL@Vnb˜¼@lXbWlkL™K@zUJmIUxUVUVmX","@@llUL@VlxšL@a@UƒwXa¯@"],encodeOffsets:[[119543,30781],[120061,31152]]}},{type:"Feature",id:"3401",properties:{name:"合肥市",cp:[117.29,32.0581],childNum:4},geometry:{type:"Polygon",coordinates:["@@„L„xV‚ĊLÞkšVlVVXaWaXwW™nU„@‚anVVUX@˜bXblWkk@wWmk@VUVKnb@Išy@_kWm£nmVa@U‚KœwlVl@„zn@°l„IlmnVšIVmnV˜aXÅWmU_VK@Unƒmmk@UIVakaƒa™UƒÑUK™ÑWKUUKUamI@KkaVUUam@VUUa@UkWUaWI@a™kmōw™wUL@`mn@KƒV™IUVUUUK›Vk_ƒVkbWƒ@VkUULUJ±I¯aƒlkxU¦@L@V@V@b@b@„WJXbWVXn@LƒKVL@JkLƒŽV@Vbn@VV@XU@UlV@@VV@V@XXV@@VšJ°š°Xnb°@„JUVVXV`@bkXWŽUbU@WŽn@VLXlm„°bV„UbkK@bVJ@bVbkLV¦ƒKķV@x@„XbmVVVk¦"],encodeOffsets:[[119678,33323]]}},{type:"Feature",id:"3403",properties:{name:"蚌埠市",cp:[117.4109,33.1073],childNum:4},geometry:{type:"Polygon",coordinates:["@@VÒXLlUlJ@UXV@nÇx@bnlUVllnVaXVV¼UVW„U@V„²wVV@Vl@„VnwlIš@XbÆWVnUVmLUV„nm`k@VbnblKXUVIlxkb@VVLlK@bšwXxV@n¤ÆUVaÈaV_@anyVwV@„kl@°m@LnU„bl@„WVkV@Xa„a˜V„IXl‚IV‚„@XbVUÆ@XKWwUkmW@_UmnIlJXkWKXmV@‚w@_XV@Kl@kU@KlX@@UUUUKWLm@klJVUUmk@mXUWmXwƒ`m@„zUbÝakbW@m@UUƒéUIm@UbKǼ@™kKWXmWUkaWU—JWU¯L@W™Lƒwk@mm@_™ƒÅl™UVkmWUnV@VWLUb™bƑĬ¯l"],encodeOffsets:[[119543,33722]]}},{type:"Feature",id:"3402",properties:{name:"芜湖市",cp:[118.3557,31.0858],childNum:4},geometry:{type:"Polygon",coordinates:["@@„bVaV@XllLXU°ŽlL@V@VUnVl¯Ikš›VUVU@@b@lUXUWmb„n@¼šbƒĊ‚LÞ@lVXlmÞUnkJ@nlKVVšÞXklWVaVI@aUKn»lL@Kn@‚XXwlm@mn°@„V@Wy„wXlWVk™ƒ@aUaVU¯£kKWVXVWLUkkWlkkwmJUam@@aULVa@UƒVaUaVI@m‚@UUJUIUmmV@bm@UXVVUlVmImakKUU@UU@VmU@@kma@KVIXUVK@U™VmUkV™m±£@JkU@nlšk‚ƒLUlmb—@WbU@@XnlWb"],encodeOffsets:[[120814,31585]]}},{type:"Feature",id:"3406",properties:{name:"淮北市",cp:[116.6968,33.6896],childNum:3},geometry:{type:"MultiPolygon",coordinates:[["@@lnnK@¦n@@V‚V„@@VV@nIV„V@VW²a@b@bVnUVVV@V™z@lš@°UšV„IVaVV@x@ŽXX@WlwUnV@XblW„b@XlK@aš@kƒ@al@@_V@@WÅwmaUaV@„bnaVL@llInmU_@W@aƒUUĉUaVwm@XWK@wƒVkaVUUwU@@aV@@mlI@WœLWƒUUUƒVU@kV@XalKVaUƒVUUUk@WwUK@aVI@WƒUk@@UUU±xkb@lVš@xnLÇbUbk@@bÇVUJ±U@U—@WLXšml@bVVXL@lV@@LmbkLW`kbVxUn@LkxmV@bm@@VkV"],["@@VVVkV@¥@UV@U@VUUJƒkWakKUšlXVJ@bXV@blX@aXV@V"]],encodeOffsets:[[[119183,34594]],[[119836,35061]]]}},{type:"Feature",id:"3404",properties:{name:"淮南市",cp:[116.7847,32.7722],childNum:2},geometry:{type:"Polygon",coordinates:["@@°kƒīšaVaXK@U‚UVmnXUlšVÆkVKUUUmmU„ÑkU™UÝlĉKUƒwƒKƒbU@UxW@@lœmVUUVmUUƒmƒw—aW„kL¯K@Žm„ULWlIm`X„WL@b@¼@V@xkVƒI@b@l@lk„V°Ȯ¹ĸW"],encodeOffsets:[[119543,33722]]}},{type:"Feature",id:"3405",properties:{name:"马鞍山市",cp:[118.6304,31.5363],childNum:2},geometry:{type:"Polygon",coordinates:["@@šNJnllLnxV@laXLVKma„aXbVI„bVKVVVIVyn@n_ƒƒW@@ƒ„UnJlUVVXlLnaUWlV@VV„IXW@_W@XK@K@UVUUwVamÑXmmwƒw™KUnUK™çU@ƒJƒU¯@mŽ@nknWxWm@@LkKm¼VL@bUJUbkXWl"],encodeOffsets:[[121219,32288]]}},{type:"Feature",id:"3407",properties:{name:"铜陵市",cp:[117.9382,30.9375],childNum:3},geometry:{type:"MultiPolygon",coordinates:[["@@„ÒV¤@¼V²@aVV@Ž@„„x°Vš£nW‚@nbnaVXVW@k@aV@VUœUl™°JUkVm@U@UkK¯WVkKWkU@Ubƒakwmlwm@ƒkUmƒUUKU@@VmLUbVLUV¯U"],["@@LllUL@VlxšL@a@UƒwXamK"]],encodeOffsets:[[[120522,31529]],[[120094,31146]]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/ao_men_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"8200",properties:{name:"澳门",cp:[113.5715,22.1583],childNum:1},geometry:{type:"Polygon",coordinates:["@@HQFMDIDGBI@E@EEKEGCEIGGEKEMGSEU@CBEDAJAP@F@LBT@JCHMPOdADCFADAB@LFLDFFP@DAB@@AF@D@B@@FBD@FADHBBHAD@FAJ@JEDCJI`gFIJW"],encodeOffsets:[[116325,22699]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/bei_jing_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"110228",properties:{name:"密云县",cp:[117.0923,40.5121],childNum:1},geometry:{type:"Polygon",coordinates:["@@vIHZDZQtDLNMXIbHRCXXITbJ@H`LGPRDDJNCLHTOCWFGvGBUJMKGFO^IHWXITQCI’Y^AXGfRˆDXF`DJOLB~G\\DZIHHpErUVMhHb]\\M†BVF@FTP`@zTbD\\@~M\\K`H^EVODWICAakAQXoIcCOCIgGYNWFWNGGKKGaJEGMEIKYJUT_J_Go@_SyQaSFMEGTcYOQLIIi@EKAUPCV[EEXQCW|aMUMAaYCYNIDGGACIMGGSKDQGaF_C[GaB@GOIiOKAYL“mI@CN]F[SWWAcKKI@HMUimEKbeYQYISNUOcBKPIFBNgvDPGZYFSf]CMSIWGEUFgDIQ[MeDMJS@RR@LphFPCHaBAJKF@J]IBJO@HlO@@RKAMPJHCNDJTHFP@ZGNANBRFH@J_fM^ONJNF\\VTDJHDON@XRND\\XRCPVETCLBVKDFJINHRGPRV@\\CLJN@VbXbLVT"],encodeOffsets:[[119561,41684]]}},{type:"Feature",id:"110116",properties:{name:"怀柔区",cp:[116.6377,40.6219],childNum:1},geometry:{type:"Polygon",coordinates:["@@JHTVHXCHPfnDJGHNDJSB[JSBGVSAOH@PMPuDEHHXZN@PHF@ZLJ@LHVYJA\\OFWP]BMtMBSRGV[JeVAPQVIFENMD¡–@^NV\\JH@NNL@NM\\kTQ\\I^FNIpBHGTBFFAZQfKDIXQTLXFXNNVMVHRGpCFLlRLEVBBH`IVO\\G`RDPAXLXBXORHZEHTDLLN@VGTMrQNFPeASKG@GMOAKBYMK@GTUHUXSHMVDNMOUEOZMJML@^KRACMZEZMRQLUHE@OFENPR@DI\\ChMHIDG\\GJMDWHCKGMDCIQCHO_K@GaIJSWWQDaGWJMNCKRsCYGYuJUSaKaW@UIMDK@[QUHOGQJMEILCAUDKFSOUQD[WMC‚Q@WPMGCCIUSE[IMPMN]`e@IEGAQBMHM@YEOSGCIDMIGNOLB@QP@GkP@AI^J@ILEBIbADGEOog@KQQWSekWQQUOFKZLF@PUNmIaHIUeBCTSHENcJa@_IWSaGu`GLSBKJQFOXGDXVQVOBIHcDSJWBEFGTMH[^mLaXcHiKElTRKtFXZ`MHMPCNRDxZˆB\\ICIHK@KŽHbIVFZ@BPnGTGbDXRDJaZKRiGEFSFEJhjFNZFjn"],encodeOffsets:[[119314,41552]]}},{type:"Feature",id:"110111",properties:{name:"房山区",cp:[115.8453,39.7163],childNum:1},geometry:{type:"Polygon",coordinates:["@@h@bl@HRJDZ``TA\\VVD^H`\\pF\\JŒ`JGv@ZO\\GPSTEjPTR`FnEbDTDHEhLFMTK@ETSPULKEI@OVISKSJACEQNQbV˜IXGDIN@dMB[IIBcN]ZHNLP@XOWCFWŠCNRHTpATD@^NVNLED@Rh@jCEF}E[OOHUEW]W@QGGDIQSH_MmFmCUT_K]i@MHCMW—FCF‹E{BMHMPOHKS]CFNGBELDH_@BcAKOACESAOBELaXAROB@FODMEDWJAG[aE@UM@DImEWJMC@OeCA{aE[@{L@MINUCQXKfUJORCHqJBF@TCXWNQX]M[EAJO@@KMBQJIC]EWMCCUBEBFHKDOTMBGNGF]MWDBRDdMDQVyE@LPVHDCP@JVVMTG~HNSH[CmRUvHPHBbA\\PTNRC\\YNJ€PRARPJDDR"],encodeOffsets:[[118343,40770]]}},{type:"Feature",id:"110229",properties:{name:"延庆县",cp:[116.1543,40.5286],childNum:1},geometry:{type:"Polygon",coordinates:["@@^AXOPEB[ZIGU@KKI@YGE@OYMGWFGvCNO@OPGTBHUTA\\ITACIGMIHmCOeDGGWSUIGimYEEMgiFITEFEjHLQbYCIWQaCSHmHAOY@UEaJG@LGLDJ[J‡AwYQCDMNONGY_EWLsSQFkMO[NWAIGaIYL@HMBOKiOQDWEUDMQSF_QIUBWdg@[NaAKQ@M]OQ@WhgLUMMFYQDIRCEUZOOCIOJ[KIUMKL@HIDKVEBM`HJAJSJUdBLGNEdMBMO[BYEWJSNKNaD]PE\\SjOT_RQVEZPpƒNQXfŠNA~lNG`@PNLp¼RFLfbdKbATUh@FSNWjGFZVLFHVA~X¨PPROfFJbNJPLFbENJPrEFNPFRHDDJdENJLVEPBJTVTHGHFRFH@PXP\\ORQHW\\BjWFDERLPPBbB\\E`B\\D\\L`@F]FCnJ^AZL"],encodeOffsets:[[119262,41751]]}},{type:"Feature",id:"110109",properties:{name:"门头沟区",cp:[115.8,39.9957],childNum:1},geometry:{type:"Polygon",coordinates:["@@V@XMnGPY²‰JQNEhH\\AZMPDVTTDZCPiJkHSHCjIdFtEHITCNITQEKUAMCEIKCECABYESKFWAKBEIIHABGDCKCAIHMHALKEI\\CFIBILIJQZS]BBEECS@E@@C]COKI@CABAAEEDMGƒCH]A[M@CJWH—JaUMRFRBDTITLUJ@PFJKLOVST@FSLENgKGFSCaCmF_ESQiOSFOT[HYPu@IH‹_[IoE_[]GUC[USB__CYQI@Gakg@qZeHQNMNV\\FVLPgJAFJPRLCH[XcPELUT[JiV_EELFTADBXRTRLJC@fHXHHbPd`fR@NfT`@TLplHMpCEJHJBVLFŽ@JT‚VnG^KXDXHNVGRLRXFJVdDHSNWLGfEzA"],encodeOffsets:[[118635,41113]]}},{type:"Feature",id:"110114",properties:{name:"昌平区",cp:[116.1777,40.2134],childNum:1},geometry:{type:"Polygon",coordinates:["@@VNLJI\\JPPDYPFVQDCJZRNEVNhKXgR@^P@NLRbB\\Mh@XcVARJE`RTCNFV€XRCjPPLNA@GZKbJJHXB\\MNPjLdGbWnK\\]NGHSFEXATIdCJGPARUWUHCPWRELITAHKv_E@iYCaW_BQ\\Y@QIO@QDCIGZCEMWGFMFAFgHEDOCSqKCCFGAMKEAC@ODGCGs@WH@KQA@EE@CE@GEA@EH@GGUEEJEAYD@JM@@DAA@FHD@FTJEHUC@JUBKCKG@G[CIIQReAYhO@OXGDO@@FF@IHJFCPEBACBIAAKDOABXARHPNEHGbQAAKQFGIAM[C@WHKaGiCEGOA‹HUKCIokSCUSOCYN[BgGMFIR±ŠOZmHWNU@ShbbXDHVXXGJ^lZ@PZ\\Nb@\\FHJAD"], +encodeOffsets:[[118750,41232]]}},{type:"Feature",id:"110115",properties:{name:"大兴区",cp:[116.4716,39.6352],childNum:1},geometry:{type:"Polygon",coordinates:["@@F\\E~DFN@BDFEpHFCHBBEGCDCJBHUDSBB@ELCPbF@B\\J@BJVAFJ\\ADKTCBGECFMT@BMN@@FH@DaNBEnvB@FPBATK@FHEFIAKFBFL@@PKBFJHC@FXBRAFCDMPDTOL@JIVFDHH@DDH@BGRFCDLD@N^@@CNA@KNOAEBCECFEGCFGMGFIPMOEJOLBADBBHGG@GCHIECY@INC@DMGS\\AIOZAAEYA@GT@KKMBEETCGMVINFxA@MJADB@FlA@HJA@NND@DFA@DVAZBBOFKH_JA@K^GBC@EFE„G@gAENMXKJigC@IbSJMqGOP£RGSMGE@kbQFDPEFiBSGGSBK]I{CDWCIDOic[C_G@SuSO@EWKCO@MNY@\\uZOPENQD[LKESSKGBKEG@EJGAGHoH¥CqhifeJkX_XFFGHFNEDFPENKHM^IFIVL^S`DVEnNnG`RTCJHH@R^XFXGVPP"],encodeOffsets:[[119042,40704]]}},{type:"Feature",id:"110113",properties:{name:"顺义区",cp:[116.7242,40.1619],childNum:1},geometry:{type:"Polygon",coordinates:["@@EhEBENXHFNYDJHCD@RJP@R[ZARX`DbjZF@bHXT`Jb@dIFMTGDSfAJVbGnJVM@OKELYPERVXRflXTT@NIfC\\NJRhCVEHFJXNT^DTeZEHYCOhuAMJELOdAVPTMOWBWNMNEJgl]@WGUFIC[T{EEDEHGCIGMI@SECUQI[D{A{GQESPUH]CsiMCmHUeoHENcAaDGCMDGMQCACCBaCGLMAHB@DIEQLOAAEEJ@CW@CDINGAAGKQOCgV@LG@BEGDKNeREFBNCFIDOPKD[@YRW@GFWDAFE@EHDDrLDTCPGF","@@KrJEH[\\B@FF@CHFBHUN‹AJKADGECBCMAG^E@EbI@BEGP"],encodeOffsets:[[119283,41084],[119377,41046]]}},{type:"Feature",id:"110117",properties:{name:"平谷区",cp:[117.1706,40.2052],childNum:1},geometry:{type:"Polygon",coordinates:["@@ZJZRafFLjn€VGNJ@LLBdXX\\T^EDMJ@”nZKLBjPPJ@HbA\\H`DbERHLCFK^BZaFWXQLAGMHa\\OLO@SBIpBdCLƒVQfElO@GSAKEDQTC@GEBKG@ORIJBDAPDFA@CaOq@GGQAAEJK@KMUGAAGEAa@MGMBGCGSIIW@WSUCMDOJeWOM@IUF{WMWaDIMgIoRoCOKeEOEAG_I[cg@wLIFENQFDVTFJ@HNDJGHCFFFS|D\\EJHV@Xk^IhMFMNAXPX"],encodeOffsets:[[119748,41190]]}},{type:"Feature",id:"110112",properties:{name:"通州区",cp:[116.7297,39.8131],childNum:1},geometry:{type:"Polygon",coordinates:["@@FDAJTGDNDCTDDEDBBE@DT@@EHCDGJ@EIZ@@FDBR@ATFBBVFFE@@HNA\\VE@CLIFNJFNJBCP]A@LJFA@HJEDD\\C@DBCHLAEPF@@DH@APHAERDF\\GIxDTM@CFLBBFJ@CNUPMHECGDBF]BMFPDLRBHHBJMDCX@@DFIBFPBRKJF@CGANBHKbDDABDRDHNNCHDbCdBFMpGHiOYMefKJMC}HWAUNW\\NNBNA„kNU|]HMTMN@MZBLFFF@RIRUT‘BMFIEGaAGGAOIIUGTSFcYKS@MSLYPKRUBU]EWDOI]CKGASgW@MTWKIMCS@uMAKKADMECGAKVUTSDy@IjWLMNBF@hƒHEF@FAD]H@LIBG`ELAPYAUB@CEB@CMC@MIB@GkB@ECAIB@NwBMEUJHNSDFFNALLS@@HZBBFYBJP[BHTCND@JMZ@FDGJHDH@GHAABCKAIPPFONEJNHEHHDEFFDADBFMP@L"],encodeOffsets:[[119329,40782]]}},{type:"Feature",id:"110105",properties:{name:"朝阳区",cp:[116.4977,39.949],childNum:2},geometry:{type:"MultiPolygon",coordinates:[["@@bFGHBHFBFIVFHHG@@FFB@HDFF@@FRB@LXGt@DHCH@PBDLFBNF@BEXCHEX@ZQ\\@LCPOJCDEAMFEfQLMHCAFH@@KhUNE^AAEHCFDNGVODMI@AEKADEN@CSJw[HCEFQGBBOG@@CE@FOKBDGCAD@C[FCGIB@IE@K^BDOIAEMMIJEDKF@[UMB@GF@EEAUEABSQ@CA@EY@FJI@CHGD@FS@@CAFCACFSCCDCMSHBIECMB@D]@@MKCDCQEAHG@CCG@CGUEIJK@SPOCCNEDQBDNDB@DJCDLFCBBALJB@BVGPBKVO@KHCCCD@FE@BNA@FNCTDDJA@FGB@NBDW@CL@hT@@ZHHQDDDAFSAANBC@HG@EFS@@DE@@PCB@Ue@CADNJB@FCBWA@LI^ix@FIHrH"],["@@HUN‹AJKADGECBCMAG^E@EbI@BEGPKrJEH[\\B@FF@CHFB"]],encodeOffsets:[[[119169,40992]],[[119398,41063]]]}},{type:"Feature",id:"110108",properties:{name:"海淀区",cp:[116.2202,40.0239],childNum:1},geometry:{type:"Polygon",coordinates:["@@plDJVLŒGPBFHjDbHGL@X\\DBNHJREBLRBHaFGŽMGOBQAWPBLCBBAJBDFADOIEJGE@@EP@HCPWP@ZgfBRQJJ\\D@HLHLDVA@IVDFGSI@EGC@EBB@CN@@IZCAGHGaEqGJG@EjwJ]@K@GSA@e_I@NE@CA@Kg@KC@ENCFƒAKQAW@WIMK@V‹@I@@F@^EDFB@HcIaDYCBRRDCHD@EFLN@FE@CJUPEJOJMTBPEDIFCMIAKNOGMRFJNDVBFLSRMJSDGJsFcEiJGDGTIlOjYD"],encodeOffsets:[[118834,41050]]}},{type:"Feature",id:"110106",properties:{name:"丰台区",cp:[116.2683,39.8309],childNum:1},geometry:{type:"Polygon",coordinates:["@@hMN@NFTQCFRCBJFA@HJ@@HJ@HJ\\FTACDŒ@@UNLXJX@@MA@@IECAQlDFEHBDI~D@GXCFMVDFCH@@NF@ANJC@FnAB@AMF@@EDCDDLGP@LUOAUH@AIABKAAEDCKID@CCACMWA@EGDEILA@OK@AELEJBFEEGL@BSOA@EuAFmMACbG@@EM@ANS@ENFDAHSDCL[BEIUBAII@A[E@OaKD@FAACTGVIACDHDAFGAEDoGEFACM@i€g@@QFCMKMU@]SCoBGSMQ‰DEXXDWPO@MKYGM^AdJJA\\cNB\\G^„DNHFCBFABDBJ@PL^D@DF@T@FDAF^A"],encodeOffsets:[[118958,40846]]}},{type:"Feature",id:"110107",properties:{name:"石景山区",cp:[116.1887,39.9346],childNum:1},geometry:{type:"Polygon",coordinates:["@@NQPHLMJBDNJEFCAONSPIFIVODIF@@EKMFEC@DGQCAQZDbCdJ@GEAFC@]@EJ@DCSB[EGII@@GI@@GEBAIQDDESRMEM@gNYTIRKJAJEJ[DFJKLGBGNBJLDCDAHGBJJAFBLEXTLZFBAFDLD"],encodeOffsets:[[118940,40953]]}},{type:"Feature",id:"110102",properties:{name:"西城区",cp:[116.3631,39.9353],childNum:1},geometry:{type:"Polygon",coordinates:["@@XBDA@EIACM@IJAD]BC@SFABISAD]H@@OAEDQEW@BLE„MD@FLDh@@LDBF@@M`J@fTB@H"],encodeOffsets:[[119175,40932]]}},{type:"Feature",id:"110101",properties:{name:"东城区",cp:[116.418,39.9367],childNum:1},geometry:{type:"Polygon",coordinates:["@@DBf@@VDA@OF@@CT@FEH@@GADBMTBBECCRCGG@YS@@gDK@A‘C@PG@C^TBAJEB@TADC^IB@J"],encodeOffsets:[[119182,40921]]}},{type:"Feature",id:"110104",properties:{name:"宣武区",cp:[116.3603,39.8852],childNum:1},geometry:{type:"Polygon",coordinates:["@@RBX@RFFCŽBFU@aK@WA}CCJGAEFkCBRFD@JB@@N"],encodeOffsets:[[119118,40855]]}},{type:"Feature",id:"110103",properties:{name:"崇文区",cp:[116.4166,39.8811],childNum:1},geometry:{type:"Polygon",coordinates:["@@XBL@@bEV’D@BX@AC@MHA@EIBCCDSEMmB@EIDBME@@MG@EDUCENWD@H"],encodeOffsets:[[119175,40829]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/china_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"xin_jiang",properties:{name:"新疆",cp:[84.9023,41.748],childNum:18},geometry:{type:"Polygon",coordinates:["@@@›ρȁôƧƦóəʵסʵóƪԫʵѵͩƧͩړ›υࡓɛʵ@ȃ@óᇑѵƨɝɚôóНѺͩɜ̏ԭʵôƧɞñ@υƩ—݇ȂóƩƧ@ѵȂυœƥŌਗ—॥ɛóʵѵƧѹ˜݇̍ࢯ˜əɞυ˜ρͩ̏óਙƨƧŋôōóš̍ͩóʵן›óŋړͪƧѶ@ɜԭ—ԫƦɛȄ̍›ɝȄöςƩȂ̏œñȀ̏œƩóóŎə˜@Ő̎@ɞȀɝŎôƨóנѵȄƧ@óŏɝœóɜôŎ̍ͨςŎ@ƨóôƨɞ݈ʶóƨφó̎Ȁƨ̍ԮòѸԮמ@ѺȀ@ƪၬֆòȂñ̐òȂɜ˜óƨ̒Ŏ̑߼@φρȀ@Ő๐ς̎Ƨφ@ɝφڔ೦Ԯǿࢰ@ƦŏԮƨƨȄƧ۬ɜʶڔŐɚɚóŐôƨ߼˜ôƧƧó̐ƥóŏѺǿƦȁφƧς˜ƨƧ̒@ɜƥƦυ̐ɛƪͩƩəƪʷ̑ə@ȃƨʵנŋྸōਚԭԪ—@ɝƨŋ̒օςʵôƧ"],encodeOffsets:[[98730,43786]]}},{type:"Feature",id:"xi_zang",properties:{name:"西藏",cp:[88.7695,31.6846],childNum:7},geometry:{type:"Polygon",coordinates:["@@ôŌנœôʶ̎ͪô™óŎƨŌਚƧ̐ôςͪφ—ɚɝࢰ—݈̎Ѻ—Ѷƨôʶ०ɜਘ˜Ʀŋφ›Ѷȁ̍—ôŏɚŋ@̑ə—@ŏò̍ɜ›óƥôʷƧ̍φѹԪ̍ע@Ѹʷɜ@ôñנ@Ѷɛɞô̐ŏѶƨѸƧƥōƦœôŏô—@ƧôƩ̒ŋƨŌƦǿô̎ɜȁ̒—óʶѶôôО̒›ςƥɜНφσɛȁ̎υƨఱƧŏ@ʵƥœ@ŌóóóͩƨƧóŋ̑õóɞóɝԩͪɝρôƧ̍ƧѹͨڑŎ̑ōóƧࢭͩ̏ѵɝóఱóóԪυô@̒ƥŌ̏Ƨ̑Ȅ݇ŎƧ›ѵӏ@ɛõŏɛȄôӒƧŌѵǿɝ˜Ƨŋԫ@̏ʴƥ@óǿ̑Ȁóǿ̍ςóóυô@ʶɛñρƦƩŐó̎óœѵó̑ͪࢯОóɜן˜Ƨ̏ƥȄ߻̎̏̐ןŎɝɜöɞƩȀôöɛȀóͪ̐ƨƪ̍̎ȂƥԪυО@φɞ˜ôƪ"],encodeOffsets:[[80911,35146]]}},{type:"Feature",id:"nei_meng_gu",properties:{name:"内蒙古",cp:[117.5977,44.3408],childNum:12},geometry:{type:"Polygon",coordinates:["@@ኊȁ૊ö߼ƩɜɛנñԮɛѶóԮô@ȁѸóמ̎ගѺၬ@߼ʶԮӒ߼̎@ŐѹӒ̒Ԫƨöග̑ѶȄ̒ς।œѶɚöɞɜʴڔôôȂ̎—ѺȀς—ƨ˜ƪóԪ—ɜôɛОਕڔԭ˜ѵ̍ѹȂԫ›ɛƥ̍Ȃóɜ̎ô@ʶ݊ੲࢮʵږͪנƨôȂƧ˜̐ͪ@ŐƦƨφԬѶɜôƦ@ŐƧôôƦəŐ̏›@ŐڒѶԬô̐ʳԩНςōôŏɞ@ƨȂѶəóƧ̒ػ̎ó̐Őנóƨô̒@ƨɚɚ@עԫɛɛ@ȁυͩƥʳòևρ—̑ࡗƧͪ༃ॣԮփ̎Ʀ@ôô@ôō@š@ȁѵóƨ̍υȃóʵɛƨƥóυȂóəƪ›̐ρƧͩɜԭڔȄ̎عƧȁ̐ŏó̍ɛ›ƥƧ̑óρŐ@Ƨ̏˜ɝəɛ˜߻ͩ̍ͩɝО̍ƪƧóóӓƨóƧʳ݇@ɝςƪœ@ʴƩ—ƧƦôƨɛȄə›Ƨŋυ›óͩѵ@ɝǿóŌן̍ɛ˜óО̍œ̑̏ôȁ̍ŏòȁñóƦͩ@ǿə@ɛƧ̑˜ρȁυô̍օѹœóȃə™@ȂσʵѷƪòƩ̍—ôó߻ۯôʳƧ™óšõʵѵóѹɜ̍ȂѹôɛŌφֈƩͨρóυӑóޟఱ̑݇ͪóƪƨŌóȄڔԬƩςםñ̑ȃѵŐԭŏƨȁɛǿρôõɚɛóƧОə@ѹ̐ѵöԪͨôͪɛ̒ןŏƧƥóôƥƧɛŌôóɝó@̒݇Ӓ̒Ō@Ŏԭࢰ"],encodeOffsets:[[99540,43830]]}},{type:"Feature",id:"qing_hai",properties:{name:"青海",cp:[96.2402,35.4199],childNum:8},geometry:{type:"Polygon",coordinates:["@@ƨ@ôƪ݈ȁƪ˜@φɝòóƨԮʶɛ̐ѹͪôОəóƧɞᇒѶ@ôږô@ǿѶ›ƪȁςœɜͩφ˜ςŋɞôѶɛƨŌɞ—@ɚςŐñԪॢͩƨȂɞóƨŐ̎ŏעӏ̎óƧƦôœ̒ȁɜ›ςͩ̒œɚɛƨôƨɝφɛóȁƨŋóóɚͩƨóóƩ@ƧəŋƦƩ̍@ƧƧôǿυ̑@ȁɞǿõŏρƥסɚƧóτԫɞœôƧƦ@ñȃòñƥóυôôѹѵ—@ŏ̏Ȅɝó@ȂəŌóəѹƦ@Ő̍Ōυ݈ԩŐƧóôƧ̑›ôʵɞƧ̑ѵôƩɞƧ̑œóНѵóôʵ̑˜ɛȂó̍ƥȀƧŋ̑Ōóƪ@ƨó˜óŐƥ›ƦŎѷƨѵƧ̏Őɝóѵɜן@óòɛ@ѷʸס@ԩ̎υѺƨ̎óʸôƦɛœñ̎@Őɚ˜@̒əŌóŐ̎˜"],encodeOffsets:[[91890,36945]]}},{type:"Feature",id:"si_chuan",properties:{name:"四川",cp:[102.9199,30.1904],childNum:21},geometry:{type:"Polygon",coordinates:["@@ô˜ôŋó̑Ԯ̒ɛОמͪƨōöͫ߼ƥôȃƨóóñôƧóƧôōڔŏƨŐ@Ŏô˜òƥѺŎ@ōɜóנ˜ôǿô›ƦôԮ̍ɜôɚ›Ƨ—ñɛɚȁ̍Ƨɛևυ@óóôŋρԭɝ@Ƨʸ̍ŏυɜƧƧóƧƨȁρ̍ƨȃɚ—ôʵφóô̑̏Ȃ̑ʵɜʵɞ@ƨʳסƩóŎə—óɜƧôƩƧρ˜óôôô@ŎƧƨƨƪѹ˜ó̍̍Ʃ@̏ѹНôޟ̍Ʃóƪυɝɛ—əƨôŎɛȀ@Ȃ@ñɝʶ@Ōρנ̏—õóɛͨƨȂѵОɛʵ@̏ƩŐó߼Ƨల̍φɜȂυτɛОρƦɝƨóƪ̒Ѷɝƨóʶ̒œóƨƨôԪŏφ݇̎ŋ@ŏѺƥôɚɚŋ@ȁɞô̐ȃ@ŐѶ˜óѺφóƦôñòòȄ"],encodeOffsets:[[104220,34336]]}},{type:"Feature",id:"hei_long_jiang",properties:{name:"黑龙江",cp:[128.1445,48.5156],childNum:13},geometry:{type:"Polygon",coordinates:["@@ᇔȂਚНƨŐѶŏöƥςŏñƧƦóƨȁ@óƨ—óȁφӑóóƨ˜óǿ̎̑ôНɞ—ó̑ɜə߼›̎ǿ̒ôڒӑφ@Ƨȁ̎̏ƥƩ̎ρశ˜ôȂςƨφ@נɞ݈˜̑ƥƧɛƨʵƧȃƥ@Ƨƥ@ŏ̑ԩôɝρρóɛƧ›ƩͩƧó߻ʸ̍ʷѹƥɞڕõ̍öɝυ—̍ȂƧ̐̑ŏóƨñŋѹóóȁ̍›̏Ԭõʸ̏ŏ@ǿ̍@ƧОυ@ñƨòȀƥŎ̑ŐѵóɛŌóȂԫōƧŎѹñ̍ʶóОן@Ƨ̎Ѷô@Ȃ@™óŎó@@ó̍ƥԭք༄।ƨͩ̒ࡘς˜ñֈƦʴφͪ@ȂɜɜסԬə@Ƨə̑@Ƨóןô̏ŏ̍ô̑ؼôƨѵɚƧȁɝ@óŐρŎԪО̏ʴ"],encodeOffsets:[[124380,54630]]}},{type:"Feature",id:"gan_su",properties:{name:"甘肃",cp:[95.7129,40.166],childNum:14},geometry:{type:"Polygon",coordinates:["@@ڔôԮࢯ@ō̑ŋ݈ӑ@̑ɞôóôɜŋƦƨôóƨƦנŐɜ̑óͩԩͧѶõѺ̏ɚ@ƨНɜôöəςóɜȀƧȂԮŐѶŏ̒ȄמòƪρړԫôȃƧŋôƩ݈ͩɚ@@ǿɜ@φͩóŏɜӑƧōôǿ̎›ôƥƪóõ›ö@ô—ƨ˜ôƧƦôó̒ɜ@ɞŌõʶ̏Ő@ȀóôƨȂ@ʶע@@ƥ୾ӑó̑óŋôʵóɛړ@@ƩöóƩóρ—ɛƨ̑@óʷƥƥ̎ɛƧ›ôōƧǿôͩѵôɝȃɞȁõƧρóó—@ōƧŏړŐóŎôƨóƨôòƧôóȄ߻ƦõͬƧŎםͩɜНԭ̑ô̒óŌó—ƥ@óƨɝ›σԬƨôעəςƦöŐɝȀ@Ȃφ̒óȀƨƨ̎@ƥƪɚŌ@ƨôƪƧôəͪôôƧŌôȂυɜƧɞƧóəɜ̑›ρͪɛœ̑Ȃó›ƨƥ̍ôסӐ̍ŐƧŏɝôƧȁॡͪòԩρŏ@əɝ˜ƧŋѵɜɝóρŌυ—ɛͪρ›ƩȂѵœ@Ȁڕó@ȄɜʶφࡔڔœƨͪѶͪԬʶôƩעʶɚʶƥôóƨςȂ"],encodeOffsets:[[98730,43740]]}},{type:"Feature",id:"yun_nan",properties:{name:"云南",cp:[101.8652,25.1807],childNum:16},geometry:{type:"Polygon",coordinates:["@@ôɞôɝ̒öôŌƧƨôͪôô@ŋƦ›@ʶƨŐô߻ƪŏ@̐ɜʶѶНƧȁɜͧöô̐˜ςן@ŋɞʵ@ò@ȁɜǿóōɚƧɜ˜φɞôƩ̎ƪóޠѺО@̐̎ƪô̎Ѻ—ƧƩƨƧ@ōóóôóς—ƪƨƨóôɛó̑ԭ—ƥŌɛǿɝƨɛͩô›@ǿƨȁѺŌɚɛ̍ןѶНɛƧôóƥȁƦͩôŎɞ—ƨ̑ɜ—òôφ@ƨʵ@ɛѹōóȃəƨυǿóʵρƧƧŌƩɛ̏ȄñƧƧȀɝ̍ԩʶƧ̑υ—óŌƥʳɚӑóНƥô̑›óӒѵʵѹœƧӐןôƪφõŌƪ̒ԫŌƧؼƨƨס›ρȁƧœƨȂóʶó@@ʴƨôôφ̎Ŏ@Ȁƨ—ƪɚƨœóƨôôôςóޤƧŌƩŋƧԪ"],encodeOffsets:[[100530,28800]]}},{type:"Feature",id:"guang_xi",properties:{name:"广西",cp:[108.2813,23.6426],childNum:14},geometry:{type:"Polygon",coordinates:["@@ƦŋѺ̎ڔʵƨŐ@ƦמȄƪôóȂɜŌɚͩɜ@öóɜôôȂƦôɜȁ@ɞφ›óȄ̎›ƨʶɞŋƨʴɚǿ̐̎Ԭ@ôñ@̏ƨ›ρ۫ô›ɚƨƨНƪŐ̎›ƥóƦʵƥŋ@ȃóƥƧ@@ŏɝǿôυƧȁѵɛ@əóŏ̑@@ə̍›óƧó—@ȁƩ˜ρóòНƥô@Ӓ̑@óŎ̍ƥσŎυ@̍ƨ@Ō̑ôóͪƨ̒óŌړœ̏Ŏ@ŌôȄѺŎ@ɜƧʶυ@ñóɛ˜Ƨ̒ɝ˜óōƥͪ"],encodeOffsets:[[107011,25335]]}},{type:"Feature",id:"hu_nan",properties:{name:"湖南",cp:[111.5332,27.3779],childNum:14},geometry:{type:"Polygon",coordinates:["@@@քɜОƨ@öŐמóƪôƩɚ̒Ő߼ȁςͩɜòƪ—ɜȀò—ñɝò—Ѻͪ@ŏƨŋóɝôǿƨ™ɚȃóəƨȃѵͩó̍@ȃƨóóƥƨƧ@ʵƦ›óͩɜ—ɛóñԭɛōυȂ̍ƧƦō@ɛƥ—ɛȀ̑œóʷóō̍œƩŏƧОəƧóœς۬Ƨœ@̐óòԫ@̏̍əȀƧʳɝŌóɞƧ˜ƨɜóŐƨò@ȄƧŌρŋóôԪОóʶ@̎óȄ"],encodeOffsets:[[111870,29161]]}},{type:"Feature",id:"shan_xi_1",properties:{name:"陕西",cp:[109.5996,35.6396],childNum:10},geometry:{type:"Polygon",coordinates:["@@ςôöƨɝȂɞȄѶóóͪƨȀóŎƨœ̍ɜƦƦôʸ̒@ɜƧς˜ƪôõô@ƪڔ@ôɜóʶôŌô̒୽Ӓ@Ʀ@Ѻ̎ɜѺɛѶôöʶô™ƨšóʴ߼۰óô̎˜ñƪѸƩτʶ@ȁòŋəѹóǿ̑ʵ@ȁ̒ʷυփô݉ôН̏ط@ȁƨóô̏ƪõ@ʳ̐ʵ@ɝɛŋƩŌɛóןôƧŋ̒ó@ŏ̐ƥ@ŏυ@ƧƧôן̏@ƥȂѹɜəœɛóԭ̎ƥóóœóȀן—ɛô@ŎѹōñƦ"],encodeOffsets:[[108001,33705]]}},{type:"Feature",id:"guang_dong",properties:{name:"广东",cp:[113.4668,22.8076],childNum:21},geometry:{type:"Polygon",coordinates:["@@@Ȃô˜ôƨ̎œ@ɚ̒@ôŐ@ɚѶɜƨȂóφɞȀ@Őƨ@ôƦ@ȄƦŌƥʶƦôôŎôʸ̒›ɜǿƦ˜@ɜƥŎ̎ƨφȁɜŎòƥԮŎƨōóŏɛƧɝəɞƧ߼ɜςȃñȄƦŎ̒ōôòƨəƨ˜ɚН@əƨ̏ƪʵυŌəɛóəԭŏəœóŏѹœρʵɝƦ̏™ƥʳѶ›öō̑óóŋρȀυƧƥɛѹōƧôן—ɛŏѵ@óŋôʵɝ›ƪԩõ@Ƨō̍@Ƨ@@ƦɝԮƪО@@","@@X¯aWĀ„@l"],encodeOffsets:[[112411,21916],[116325,22697]]}},{type:"Feature",id:"ji_lin",properties:{name:"吉林",cp:[126.4746,43.5938],childNum:9},geometry:{type:"Polygon",coordinates:["@@נ@ôН̎ʵѺòƨōԬŎôȁɜŋѶô̒ŏƦōñǿòƧφ@ƨН̎@@Ȁ̐Őöʷ̐ԫ̎œôȂѺôòŌôƧ̒Őƨ̏̎ȁφ˜@ŋƩͩםȃƨ—@ȁ̑ʶ@Ōóôɛœƥѹ̑—συ݇@ɜρƧȃࢯƨôœəȂɛōƩɛ̏υρóõœƪʴυφ@ʶôŌóœρք@ɜƧ@ɝǿƧͪρȀƩó̏ŐƨȂ̍غړȃɛԮƨͪ̏ςƩœôɚφȁƦôɜƧôʶφȄ"],encodeOffsets:[[126181,47341]]}},{type:"Feature",id:"he_bei",properties:{name:"河北",cp:[115.4004,37.9688],childNum:11},geometry:{type:"MultiPolygon",coordinates:[["@@Ʃ̒̏ŌѺ̒Ʃ˜óȄƧŌƥͪòôñȂ̎ŐóȂ̒̐̎›ôНɜ—נ̎ôŋɞȀѶ@ôͪφœƨŌɚœɜȃóƧƨƥƪ˜@ʳƩ›ɞρ݈@υНφʵɜ˜ƦρƨƧ̍ɝóɛѹ̍ρŏ̑ôóƨ@œƧƦôƨɛ@ƥƨ@ȂƦ@@ôəŐƧʶƨŌυœ̍̎ɛŋôōɝ@óƧ̍›ƦʵѵʳôʵɜŏςôƪŋƨŌɚ@ôНƥƧ@ōѸɛ̐ô̎ʵѵНԭ@̍̍Ƨò@ȁɝ@əρυͩƪ̏ƩõƧŎƧōóšॡȄɛʶɜȀ@ɞςѶƧœƥςɛŐ@ɚɜɜ@Ŏôôςœƪς"],["@@õə@Ƨɛ˜@ŐóƦφô"]],encodeOffsets:[[[117271,40455]],[[120061,41040]]]}},{type:"Feature",id:"hu_bei",properties:{name:"湖北",cp:[112.2363,31.1572],childNum:17},geometry:{type:"Polygon",coordinates:["@@ñȄυƦöŐƩ˜óנƨƨφ@@Ő̏Ʀ@Ő̑ôƨŌנóɜôƪŋɜŌѶօڔə݈òɞōɜŎôӏƦóƨô̒óôȃƨó̎ŐôƧƪ@ƨȁςƧə̑̎Н@̍Ƨŏρôԭͩԫ—̍ʵƧšóȀôɞƧŌ@Őѹͩñ˜òɞñ˜ɛǿƩ˜ɛñρͪ߻Ȃ̑ŏƪəƩóםôõŏƧ@ɛНƥȄó›̑ѺƧ›ôφóƨƨƦƪóɜŐôóòôƨóφ̐ƨóƦ̎"],encodeOffsets:[[112860,31905]]}},{type:"Feature",id:"gui_zhou",properties:{name:"贵州",cp:[106.6113,26.9385],childNum:9},geometry:{type:"Polygon",coordinates:["@@ɜȀƦŋԮ˜ô̒ɚ˜ôōעƪƧʴɝ@ɛʶ̒ʶ̐ȁƦœóȂô@ôŏ@ōô—ƨʶѸô@ʶƨ˜ɞó@ōτöòυƨ@@əƨô@ɛ̒@Ʀɜôȃ@̍ôʵԩНôóςŌƨŋ@ȃƧñôŏƧɛƨ—ôɝƧʵ̍œôȃυœ@ɝɛȂƥóóȁɛóõôɛ@əͪɛŋôȁƩóםȃ@ƥƧŏړʶѹ̍ƥŌƦȂóôɜƨѵО̎נəɜѹŋƧȂ@ȀóœɜͪɞƧ"],encodeOffsets:[[106651,27901]]}},{type:"Feature",id:"shan_dong",properties:{name:"山东",cp:[118.7402,36.4307],childNum:17},geometry:{type:"Polygon",coordinates:["@@Ʃ̐φͪɚςɞ@@Ȃƨñ̎̎Ԯ@ѶОƨƧڔ@φН̑ŋ@Ʃ̒ǿ̎@ƨɜԬςôʶ̐ʶöԫƨƧנƥɜŎôō̎@ôŏóρƧŏԫôóƧԩó@ƥɜƧԭóƨʵɛƨ߻ӑɜНԩ˜óô̑óƧʳə™óɛƧ@õȀƧœ̍ȃɛŐóŏυО̍—óɝƩ—ԩ@ƧɚԫȄɚʶƨ˜ɞʶԪ̐ړɛƪ̒"],encodeOffsets:[[118261,37036]]}},{type:"Feature",id:"jiang_xi",properties:{name:"江西",cp:[116.0156,27.29],childNum:11},geometry:{type:"Polygon",coordinates:["@@ƧȄôɚəȄ̎ʶԬ˜ԮͪςóƨŐƪ›τɞƦōƥƧ@ŏςôóŐôô̒ʷѶ—ƪƩƩǿ@ō̒ɛôυ@—Ƨȁѹɛəƨѹ̑ƨ̏óƥѵʷô̍ɛȁôŏɝǿƧԫƧ›ôʳƥōòȃρȄ߻ɛɝƨɞɚɜƨôŐƧŎԭōñƦòԮɜôɛ˜ôͪƥœ@ʶƧƨôƦƧô@Ȅô̎Ѷͪ"],encodeOffsets:[[117e3,29025]]}},{type:"Feature",id:"he_nan",properties:{name:"河南",cp:[113.4668,33.8818],childNum:17},geometry:{type:"Polygon",coordinates:["@@φ˜̎ƪ̐˜ɞȄɚ@@Ȃעó̎ŌѺ̒ôֆॢȃô™ƨŎƨōƪöƩ̑ڔɜԩ̏ɝʵƧ—əʵԬȃƨəԪ@@Ƨ̒ŏô̍υȁƧɚ̍ôóŋ@ɝƧŋõ̑σ—@ŏɜŋôɝ̒ƧɚôôطρóóɛƩ@óƨ̍ŏƧôóȄ̑ôƧóƥôóӐɛōɝŎ݇ñړɚѵֆ@ɞ̏ʶ@ʴƩöó̐"],encodeOffsets:[[113040,35416]]}},{type:"Feature",id:"liao_ning",properties:{name:"辽宁",cp:[122.3438,41.0889],childNum:14},geometry:{type:"Polygon",coordinates:["@@ƨʴƧôôӔƨô̎ƩɞН̎ͪ߼ͪɜ—ɞɚ̐—@ƨςŏ̒ôƦƨɜœô̎ƪôςǿƨͩɞȀƨ@@ɛςփô›óŋ@ʵφυƩʳö›॥փρѹס@əɛ@ͩࢯ@ѹʵρ—ƩʶφȀƧ݈̒۬óʸɝŎѵ@ԭԫןɛƧƨƥςɛ—υʶφО"],encodeOffsets:[[122131,42301]]}},{type:"Feature",id:"shan_xi_2",properties:{name:"山西",cp:[112.4121,37.6611],childNum:11},geometry:{type:"Polygon",coordinates:["@@ɚѺñŌɚšôȄѺ›̎ֆφóςȂ̒—ɜƨɚ@@Ȁƨŋôȃƪ—ѹ̑̐ŋƪ̑Ʃρρ›óó@ōɛɛ@əɜŏƦρƨ›ρѵ@ɝɛǿɜʵóօѹ̑̍ŋסô@ȁə@ɝȃ̏—̍Ʃυ—Ƨô@Ȃ̐ظóОó݊φք̑ʸ@Ȃ̒ʶôȀ"],encodeOffsets:[[113581,39645]]}},{type:"Feature",id:"an_hui",properties:{name:"安徽",cp:[117.2461,32.0361],childNum:17},geometry:{type:"Polygon",coordinates:["@@ó̎̑Ő@ƨƪ˜Ѷǿɜ̑φ—Ʀʵ̐˜Ƨѵôóƪôôυς—ƨȂɞŏ@̍ԫôò̑ƥ—óȃѶͩƧƥôŏѺœôŏƦ—@›ƥͩƧ—ôȁυó@̑ƧɛѵʵƩƪѵ˜̑ʸóóôŏρó@ŐƦƨƥŎσɝƩœ@̎̍Оɚ̒ρƨƧȂôɜςôóظəó̑ƨóɞɛŌ@Őτ˜ö̒ƨŌ@ɞôŌ̎óƨəφȂ"],encodeOffsets:[[119431,34741]]}},{type:"Feature",id:"fu_jian",properties:{name:"福建",cp:[118.3008,25.9277],childNum:9},geometry:{type:"Polygon",coordinates:["@@̎›óȁƨӑ̒—̎ɚƨͩφŐƨɝ̎ŋóŏρ—@ōƨ›òʳəóƨō̏˜õɛƧ@ƨѵƧōəŏóŋƧô̑ɝɛʳƥ@@óɛõ@Ƨ̑ƧóȁəƧ̑—Ƨ̐@ɚəОƧ—Ƨɚóñ̑ŎóʴƨœƨԬɞȀóŐɜȂó̎ѶʸôƦƧ̐Ѻ̒ɚƧѺɜƨȂ"],encodeOffsets:[[121321,28981]]}},{type:"Feature",id:"zhe_jiang",properties:{name:"浙江",cp:[120.498,29.0918],childNum:11},geometry:{type:"Polygon",coordinates:["@@Ѷʶƨɜ@̒φôóȂƨ˜Ʀͪ@œ̐˜Ѹ̍τȂ̒̑נŐמôƪƧôӑ̑›@ƥρͩƨօ̏@@υɝó@ŋɛ@ôƩəóƧѵυó@ƩɜŋƧ@̍ŌƧɞυŏƧͪ̍ə̑˜ƧӒôȂ̍œ@˜óφ̑ɜ@ŎƪȀ"],encodeOffsets:[[121051,30105]]}},{type:"Feature",id:"jiang_su",properties:{name:"江苏",cp:[120.0586,32.915],childNum:13},geometry:{type:"Polygon",coordinates:["@@ôɞ̎˜φНôŐɜŏ̎Ȅƨ›öǿƨ@ôɜɚšƨʴ̒ôôó@Ƨ̎əԮȃԪૉöͩ̐ƧòʵφƧôʵ@óړɜóŏɜǿƧ›ɝρσȁѷ̎̏—ƥ˜óŐѹ›óŐƨƦѵͪôȄƦ˜ñ̒Ԭó@̎ɝŐƧȁρ˜óφƩóóôƨѶ̏—ƥʶυ˜ɛ̒ѵȀ"],encodeOffsets:[[119161,35460]]}},{type:"Feature",id:"chong_qing",properties:{name:"重庆",cp:[107.7539,30.1904],childNum:40},geometry:{type:"Polygon",coordinates:["@@əȂòɜƨ˜ѺɛƦȁ̐@ƪ—õŏφƥòȃƥ̍Ƨôυ̏ƧôñóóôɛŏƩôƧƥôƧóυƨœ̒ѹôœƦȃ@փƥɛ̑@@ɜƧó@ɚƧ@ñφσõ@ŎɝôƧ—@ʵѷóƧʵó˜@ŎóŐó@ôȁƥ›ó̒υôóʶə˜ƧȄς̎ƧȂôƨƨƨφɛ̎Őƨʷɞ@ςԮóŌôôφ@ɜֈ̎ƨ"],encodeOffsets:[[111150,32446]]}},{type:"Feature",id:"ning_xia",properties:{name:"宁夏",cp:[105.9961,37.3096],childNum:5},geometry:{type:"Polygon",coordinates:["@@ల̒ôޠφӒςôƪͧυևɜŋѺó̎ȁ̍ɛ@ѹס@@ʵƧȁôó@ǿ̐ŏöʵɝŋɛ@ô̑ƥóóƨƧ—ó˜ôœó@ƩôóƦ̍œóȀƨŎɛӒôŐυͪɛ@@Ȁə@"],encodeOffsets:[[106831,38340]]}},{type:"Feature",id:"hai_nan",properties:{name:"海南",cp:[109.9512,19.2041],childNum:18},geometry:{type:"Polygon",coordinates:["@@φɜƦʶ̐ôφô̎@ƨŎö@τʵƦ˜ԩ۫õН̏óƥȃƧ@Ʃəםƨ̑Ʀ@ޤ"],encodeOffsets:[[111240,19846]]}},{type:"Feature",id:"tai_wan",properties:{name:"台湾",cp:[121.0254,23.5986],childNum:1},geometry:{type:"Polygon",coordinates:["@@ô—ƩɝöƧɝѵəޣ̏ρƩԭóōóͪρɞƧОôԪ݈ଦѶɜ̒ɛ"],encodeOffsets:[[124831,25650]]}},{type:"Feature",id:"bei_jing",properties:{name:"北京",cp:[116.4551,40.2539],childNum:19},geometry:{type:"Polygon",coordinates:["@@óóó›υóôƥ@ŏóóə@ƧŋƩŌρóɛŐóʶѶʴƥʶ̎œôƨɞ@óŎɜŌ̎̍φ›Ƨŋƨʵ"],encodeOffsets:[[120241,41176]]}},{type:"Feature",id:"tian_jin",properties:{name:"天津",cp:[117.4219,39.4189],childNum:18},geometry:{type:"Polygon",coordinates:["@@ôôɜ—@ƨöɚôœôôɚŏ@óƥ@@ȁƦƧɜ@óƧƨƥ@›ƧóəН̏óѷɜ@ŎƦƨóО"],encodeOffsets:[[119610,40545]]}},{type:"Feature",id:"shang_hai",properties:{name:"上海",cp:[121.4648,31.2891],childNum:19},geometry:{type:"Polygon",coordinates:["@@ɞςƨœɛȀôŐڔɛóυô̍ןŏ̑̒"],encodeOffsets:[[123840,31771]]}},{type:"Feature",id:"xiang_gang",properties:{name:"香港",cp:[114.2578,22.3242],childNum:1},geometry:{type:"Polygon",coordinates:["@@óɛƩ@ρ@óœôȀɚŎƨ@ö@@ōƨ@"],encodeOffsets:[[117361,22950]]}},{type:"Feature",id:"ao_men",properties:{name:"澳门",cp:[113.5547,22.1484],childNum:1},geometry:{type:"Polygon",coordinates:["@@X¯aWĀ„@l"],encodeOffsets:[[116325,22697]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/chong_qing_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"500242",properties:{name:"酉阳土家族苗族自治县",cp:[108.8196,28.8666],childNum:1},geometry:{type:"Polygon",coordinates:["@@XJ°œlJX@lbl@XbV@VLnJlxnbšƒUU@IVK@lVIVwnJlU@n@J@L@Jn@l_nWVLVln@@blLšmV@@xœÔ‚`nœ™xV‚ÈLlx„LVxVVšƒV_U»VWn_m¥XwVmnX°ƒlmUUVwÞaVƒk@a@mmIUa@™mwk@™ƒm@@U¯a@UV@@K™@ykkmwkV@kU@ƒÑƒVkKWLÅamaUm@kyU@WkU@Ua™IUašVaUUmUUa@aVLXKWa¯UUbmJXnWnX`l@@xkzWÆ@V„LU¦‚x@b@JkIkJ@LmbUamJwm@óxƒnk@V„@x„ŽVnUVmVUVŽUbVlUbkXWŽ"],encodeOffsets:[[110914,29695]]}},{type:"Feature",id:"500236",properties:{name:"奉节县",cp:[109.3909,30.9265],childNum:1},geometry:{type:"Polygon",coordinates:["@@WVXb‚UnK@x@b‚²kxmKkl¯_ƒVV°™VU@bnKVVV@@nkŽ@n›bn‚@š°@VLČUš@°WV@V™nU@InKVl@nU„b˜KnX„WlknLlKUwnalLša„VlUXmWk@UU@UWWIUyķ¹XaWW@X™ƒKUIVm„U@W@UVU@KV@n»VkUkÇmUmVIUmULUbm@ƒwUaƒKkkm¯ÑUL@bWVnx@VmxUI@„klmkkK@aƒK@IlJ@I¯ƒk@mak@mnkJVL@bV@Ub„„W`UUUV™I@VƒU@VVbUJVLUVVbUX„VVxk¦VJUnVxnVVUšJV@Ubl@@bXV@L"],encodeOffsets:[[111781,31658]]}},{type:"Feature",id:"500238",properties:{name:"巫溪县",cp:[109.3359,31.4813],childNum:1},geometry:{type:"Polygon",coordinates:["@@nLWbX‚VLVU„V@KšIVl@b„@lbšU„VnU@JÆU@V@n°KĢUl@VbÞKšVš@„_„V‚KXU‚U@KXƒ@wlkkU@mWKUU@UôJ@XV@œaVmÞIVaVLƒƒ@»kmƒ@ƒUkL™U@aU@WWƒLUUU™™KkbƒwWa@KU@kaƒXmW—LƒamVk@UmL@JmVUšU@¯X™@ċVUK¯@ÅnWK™LkKULWK@UXK@wW@™LkV@bVLƒlXn›`¯xU„°LnŽlV@n°Lnl"],encodeOffsets:[[111488,32361]]}},{type:"Feature",id:"500234",properties:{name:"开县",cp:[108.4131,31.2561],childNum:1},geometry:{type:"Polygon",coordinates:["@@n@na‚I„wš@@VVK„LVbVxnVÆUnanKWXamKmk¯K@mkUm¯KVƒ°w@Wm@UIUUlKUU@a¯KWanwmUXamKkUWUnU@KƒkUwWKXaWLUWkImaUUUƒƒKka±k@lƒ¯w™wmbUƒ™ƒkXm@UJkIW‚XXƒbƒmƒ„UJ™XUV@°šKlšlVXV@xmbnV@blV@VšœU`UL@V™a@bULlb°VXbܚ@V@bƒL@J„xnLVb@lVb@V@@z˜bXWšX„KVLV‚š@@bUVVL@b„„lVna@ll@„zl@@J"],encodeOffsets:[[111150,32434]]}},{type:"Feature",id:"500243",properties:{name:"彭水苗族土家族自治县",cp:[108.2043,29.3994],childNum:1},geometry:{type:"Polygon",coordinates:["@@„Jlb@nVV@bXb@ÆlL„Ul`nVKU¼VxkbW„nlUxlXX‚@°°WnnJ@VUn@J„k°L@VlV@nUJ„x@bVVVz@VnLla„KnalVlIUŽ„¼@nV@@anKUwVal@UlJœƒlI@akU@UWXKVI‚¯Uak@@KmkXWÜkXWykIWwXw@laXamkVUUym_XmlkkmmakwmIUKU@Wak@kaW@kI¯›WIk¦VŽƒUUƒmaUV@XkVUV±aUb¯b¯¥m@@ImJ—@mƒmL@kUKUkkJƒbV¦"],encodeOffsets:[[110408,29729]]}},{type:"Feature",id:"500235",properties:{name:"云阳县",cp:[108.8306,31.0089],childNum:1},geometry:{type:"Polygon",coordinates:["@@lb„LV„VVnblJVXXKWbXLVx„l@LmVXVVl‚nLWbnVmxXb°L@bVVkLVVVJn@@X‚‚œ_Wm„kUK@alUšKX@@xWL@VXLVKlLšKXLÆm@™mœa@ml@mU@UUmL@aVšUU¯„U°`lknLlw±@a@wmLVWaXU@KWU@ak@VaU@™IUVmUUwVmUIl¥UwƒUVWUaVUUKVIUa@UUUUJƒUUm™kƒ„nl@„@VWV@L¯aUb™Ulxƒ@@b@VULUx@VUxVV™U@bU@mxU„U@mUVŽklkkƒ@WxknlxK@amLƒKU„K"],encodeOffsets:[[111016,31742]]}},{type:"Feature",id:"500101",properties:{name:"万州区",cp:[108.3911,30.6958],childNum:1},geometry:{type:"Polygon",coordinates:["@@ĸĊVI„ƒ„n„aWWXlJVIn@lWš„V„našx°xk„l@²Ž‚LVƒ„LnK@b‚LkwlmXw„@lllkUnVV@VƒnwV@@ašVUUVw@UVwVK@U@a„@kwšVVa°b@KXU@U@ƒmk„ƒÇсaml™kUVmn@VULU˜m@kUVkUaƒwUWm@Uw¯„mKUUmVUUULUKU„W@XbWVkaWwkUU™ƒ™k@maUbmbVlk¦ƒxUVUIWVU„kJVVkL@UmJ™UUVU@lLUVU„lx„@@VbƒJ™U™L¯¤@Vƒ„"],encodeOffsets:[[110464,31551]]}},{type:"Feature",id:"500229",properties:{name:"城口县",cp:[108.7756,31.9098],childNum:1},geometry:{type:"Polygon",coordinates:["@@VK@w¯L@m@UÅV@ImVƒU™Vkaƒ@@aUk™J@LƒUUVUKmLmbÅVmUUwUaƒKUL@U™@ƒxJmbm@nVJ@X@VkV‚n™lƒLXx™@ƒb@bUVƒLU`UnƒbU@@ŽmVVX@JX@VLVVšklV—„‚`@bUL@V„LVKn@‚U@„UJkn@lmLmK@X@Jn@mb„nÞWVXnJ‚k„KČÑÆ@VK@knaÜmXlUČW°kôÇÆ@a@yÞ_VmƒUnU@K"],encodeOffsets:[[111893,32513]]}},{type:"Feature",id:"500116",properties:{name:"江津区",cp:[106.2158,28.9874],childNum:1},geometry:{type:"Polygon",coordinates:["@@„InWUUlU@LVašlX@°²lÒXxlK@Ul@@Un@UaVJ@I@W@UƒUUVUwVIUKUa‚UUVwn@Üx@XUlnn‚bœJ@¥VklKUUlk@ynU@kVƒUUVWnI@¥V£VWVIUKU@UVƒa@n@Vm@@nlUaVkUwƒJ@blLkLW@XWmXkmmLn™@m@U@UVm@™„UVUUlakUVa„ƒVkV@@wnaWUk@VwkƒlmVIkUUxmJ@U„™@KƒIkx±V@IUm@K@IUKkbWKUbn„m„@bmVnbmb@xkxUJ@ULW`@bX@WVXL@Vƒš¯„mk¯@UJ@VmLUaWnX@WJ@nkKkxW@UIV@@KkImmkK@UW@XaWIU@U‚ƒIkbWb„xXŽlLVbnV@bWlX@VxVLnl@nÆÞVÜ"],encodeOffsets:[[108585,30032]]}},{type:"Feature",id:"500240",properties:{name:"石柱土家族自治县",cp:[108.2813,30.1025],childNum:1},geometry:{type:"Polygon",coordinates:["@@„š@kl@š¼UbmVXJ@bV@nxVIVJULVVk@@LWbnJVU@bVbUJ@blLXnWV—@mbnV‚@V„„bn@VJVLnaVanbl@„šVšlVXxlbXUWaX@VƒUUVwUUVm@I@WmI@a„mlLœ™lK@alwnUV@kóVaƒÝk@UlbVK@™VU»VUUVWUƒ@U`ULkwm@@KmU@knKƒ»VkJkUmbƒLkbmK@UUyUU@aƒwm@@XXJ@VVLVVUbVnUJVX@K„„k`WXXJWXUbmW@bkL™Um`Xnƒb@JVL@LU@™°VVXKVnUxVLUbmJ"],encodeOffsets:[[110588,30769]]}},{type:"Feature",id:"500237",properties:{name:"巫山县",cp:[109.8853,31.1188],childNum:1},geometry:{type:"Polygon",coordinates:["@@kVƒU™bkKmbVxkLmKkllbV@@LXb„xlašLVšVV„KXXV@@bšVlK„V„@ln@¼°KXa„U@Ulw°JXalIUa„ÝWXW@kVU@ƒVUVWUUUamUw@aVamwn@VUUƒlLXWm£@wÇĉkKklmLUÒ¯ƒWn™@ğ±kwmaWm¼U@@LUV@V@XƒVUnVJ„LWš@‚XXWbĸºVzXJVXV@@VXlWn"],encodeOffsets:[[112399,31917]]}},{type:"Feature",id:"500102",properties:{name:"涪陵区",cp:[107.3364,29.6796],childNum:1},geometry:{type:"Polygon",coordinates:["@@nèVblĖVVnLšŽ„@šx‚V„n@nšJ@L„UVVX@lbUJV@@nn@VVVK@z„˜V@nzVJVUlmX@@_VVVbnaVal@@knW@wnaƒVK@aVI„J@£kUVW@‚wXUVJ„amƒ@Ikƒƒƒƒ_X¥ƒ@WwkKkwmŽ™šƒkUxƒnÅmm¥™WV@Um@UlVL@JU@@Xƒ@UVkKVk™KVk™Kkb@bmJVXU„VVUbU@@`W_UV¯b"],encodeOffsets:[[109508,30207]]}},{type:"Feature",id:"500230",properties:{name:"丰都县",cp:[107.8418,29.9048],childNum:1},geometry:{type:"Polygon",coordinates:["@@Þè@XUK@LlV@blbUJ@„„V@bnV‚@VVVXU@ƒlbXal@VXnKV@maXUރ@amk@aVKXV‚anbš£°mnIVaUKVwUmWLUUš¯V@@KUK@I„aWmn_šVlK@anXVaXWWIXWl_ƒƒ@LUWVIUmVaUUUK@UWI@Wn@VI@mkU@U¯Kƒl@ImVÅLƒwU¤óbUU@wWXkmm@LU@@VUIWVUL@JUnƒaƒx@Jn„ƒbUIWVx@ŽUXlV@¤ƒIUJ@bUL„Žmb@xmX@lk@UbmbUaUU@`W@kn"],encodeOffsets:[[110048,30713]]}},{type:"Feature",id:"500232",properties:{name:"武隆县",cp:[107.655,29.35],childNum:1},geometry:{type:"Polygon",coordinates:["@@l„„w„bVm@IVKXUVJ@UV@@KnnWlX@xVVôaV£„xÆKnUVm@UmIXm¯¯@WkWVwmkXƒlaUwV»ULmk_ƒVkK@ÅWa@aUU@mkaƒIƒb@‚n¼ƒnm‚_@mmK@UƒLUVVmI@aUJ@XWJ@U`UIkm±kk@@lULmUmKUnVšnlUVmI@VkVlx™bkIƒVmLUxkKUŽ‚Xš‚n¦Æn„mVw„lš™nlxlLXx„@W¦„`„„"],encodeOffsets:[[110262,30291]]}},{type:"Feature",id:"500119",properties:{name:"南川区",cp:[107.1716,29.1302],childNum:1},geometry:{type:"Polygon",coordinates:["@@VšUbVJVUn@VLX@WVXVVI@VUVWxU@mš@ĊX@@¼V°aVUX`@_V@VaUUVƒUWnI@alašLUlšLUllLVU„@@WV@@IUKVkn@@VlLVwnK„UlJšakwlU@UnJVUmkU™VmXa@wVK@UUw™@VƒVI@akƒ@alInwlKXUmaUW@wWLk™™KVak_ÇaUƒƒV@šXbƒLVxUlWIk@UK@V™@ƒkU@VbUVUlVnƒLUV@lVXmxkV@L@V@Vk@WbUwmL@JUI@xVxkx"],encodeOffsets:[[109463,29830]]}},{type:"Feature",id:"500241",properties:{name:"秀山土家族苗族自治县",cp:[109.0173,28.5205],childNum:1},geometry:{type:"Polygon",coordinates:["@@XlV@lzn@VŽnbÆbXKlL„U„ÒV@@llUnxll@zšŽ@LU@@V°b@Vn@š„l@VÑUƒnK@UšU@aUaƒkVm@K¯wƒklmnn„Ul`nI@almkIUwmWVkUaƒkkJmUUa@K@aU@@_m@@wUyVUUa@Umƒ@awl@Wka±„UkUykIWV™b@bUVk@›aU@UXU‚UIWakUWmUxUV@nUVWbšŽ@XXVVŽmXXŽ@VƒbVLkVWx"],encodeOffsets:[[111330,29183]]}},{type:"Feature",id:"500114",properties:{name:"黔江区",cp:[108.7207,29.4708],childNum:1},geometry:{type:"Polygon",coordinates:["@@VX@V@LV@VJUL@lVnnxlb@VXV‚XV@@W„@UIVK@kUKna@£VWUaVUUalIVJVIUW„_lm@bXKV@mn@J„UUw@KnIVll@VanLVmUkVKXLVKUIVamw@UaU_lw„KlwUWV_Ua@aUa@KUšwm›_›Ó@wU@™nkK@am@UkUKmXk`m@@I@K@I@mkVmIUxUJ@kUL@JVV™„lnklWnn`VzUVnlWbkb@WxXxlJXzWŽÛlWXnl@Ll@Vb°UJWLX@VlV@bkJ"],encodeOffsets:[[111106,30420]]}},{type:"Feature",id:"500117",properties:{name:"合川区",cp:[106.3257,30.108],childNum:1},geometry:{type:"Polygon",coordinates:["@@XKVXlK„ƒVL@UnV@aValXXK„U@WVwUaVU@IV@@aVW„L@U@anVV@@bVK@UVL@bnJWL@VnUnb˜@@JnIlVl‚@@bXIWbn@UKVLVKXLlaV@VVnK@bVL„m„IVƒ@KmknUUWVI@aVJ@_„WU_VmUwƒU@K™ƒVak@am¯mJU_UJUkU@WkIV`UI@JV@LmmU@@mƒbUzś™@„VK@nUKƒ„ƒb™akb@UWK@bkVVbV„Û@@`ƒXk@WŽ@n@lXL@bmb@VVJUn@JnUlnUlmX@`XLlbkJW@kzlb@`@b@b"],encodeOffsets:[[108529,31101]]}},{type:"Feature",id:"500222",properties:{name:"綦江县",cp:[106.6553,28.8171],childNum:1},geometry:{type:"Polygon",coordinates:["@@@¦‚@X„lVX@@UVKl„VUX@lanVlUVbXWVXVƒ„VVUnKVUlwUwU@UJ@nmVkUV™lwXam@VaUUUw@W@kk»mV@UmKkwVKVUU@@LUKVI@mV@XVWxnXVKUUUK@wWU@UUWnUlLXa‚mUI„am@wI@K@amIm‚UUkI@m‚akUkKWUUanƒ@wƒamLVxk@UVmUUL@Vm@kV@I@ak@@bWVXJlLVbVL@š@bn@@`Un„@WbUKULWVXbƒ@UVmbX„WVƒb@bVmxUKUƒV@šUn@V@V@nmšnKlnnWWXX@lKkK@a„IVxUlVb‚k@mn@@U@m„bVUV@VLUJUXU¤"],encodeOffsets:[[109137,29779]]}},{type:"Feature",id:"500233",properties:{name:"忠县",cp:[107.8967,30.3223],childNum:1},geometry:{type:"Polygon",coordinates:["@@VLÞĊ„U@Wš@¼V‚„@lk@w²mlšVUœ„llšVnI@VlKUUlIVƒXUVJVU„wl¥UkUKUIm@ƒaUƒ@mUna˜@XUWmkK@aVIUa@aUVmIXa@Kl@UUVKUIUJmwU@@aWInUVa™»k@@lƒ™¯n™¤mabWUUL@bnl@b݄WVnbU@mLUWk@Wbka@„WVUU@UmUmVkUULV„lVUx„l@L@VƒbÈÒlb"],encodeOffsets:[[110239,31146]]}},{type:"Feature",id:"500228",properties:{name:"梁平县",cp:[107.7429,30.6519],childNum:1},geometry:{type:"Polygon",coordinates:["@@XLV@VV@b°°nšƒnkb@bƒšnJWVXblIUVšxWnUJnVVLVU„JlUnLVK@UnUVJš²nKVbVKla@aXlJ„k„Klb„ƒ@U°£šKšV„IUa@ƒ@kwVƒVUkKV@VUkk›ƒUVk™±n@xklƒ@U@»™‚@XƒVÝĉUJnxWb@UX›KkVUbUKWUkVmkkLU`›b"],encodeOffsets:[[109980,31247]]}},{type:"Feature",id:"500113",properties:{name:"巴南区",cp:[106.7322,29.4214],childNum:1},geometry:{type:"Polygon",coordinates:["@@nxnVlJlUXLƒ¦@x@Vl@nKVVX@V_V@@KlVXU„@lKlxXIl@ÈĊ@Vl@n_VJlŽnVlnb„²VVVJVVmUUkĕUamçU@»W@@ĉn™V@XwVU@UUJWUXUW@UKm@UVUIVaU™UVmLUVƒUU„UWWXUakVmUkbW@UVkƒUL@VW@kUWƒ@mJUXVVU„@lmV@zklVVkLUl@¦›I"],encodeOffsets:[[108990,30061]]}},{type:"Feature",id:"500223",properties:{name:"潼南县",cp:[105.7764,30.1135],childNum:1},geometry:{type:"Polygon",coordinates:["@@@a@a@_kalyX@lIkaWK@_nWVkkmmV@IVmUI@Una@aWK@k@mkbWaknmJUk@mk@@kUal@Uaš@Wa@aXLlwUKlkkƒ@KmI@VUJ@Lk@@VUUmL@amJU£kKUaWakLmU@bVVUbnbWV@xkL@bUb‚xUxVbXJVbUVWIUVU@kLWxkKWV@n¯VUbU@@VVX@VmaUL@VUK@VVbn@lVnI‚@@lnLULm@Ub@Žl@na„@lK@XVVkJ@b@zl@@VnV@bVb@J@bnXV`lXXmVI@W@InbV@@aVKUblKVLUanLlmnLlK"],encodeOffsets:[[108529,31101]]}},{type:"Feature",id:"500118",properties:{name:"永川区",cp:[105.8643,29.2566],childNum:1},geometry:{type:"Polygon",coordinates:["@@@b܄nWVLX„lxV„VxXxlVn@@bVblK@a@UnLVJV@@UnLVU@VXaVKVXš@n`WUÿ@IUKlaUUUkWyUÛÅÝ@mmkUKUwW@Xk@amUUakKWƒwXaƒK@VVLklƒXVlkxV„UL@bm@Vxn`ƒIVxUVkLVšUšl@@lkXmmƒVUn@VV@Xb"],encodeOffsets:[[108192,30038]]}},{type:"Feature",id:"500231",properties:{name:"垫江县",cp:[107.4573,30.2454],childNum:1},geometry:{type:"Polygon",coordinates:["@@šĊ°¤nҘ¼œaV_lKnllUXVVLValUœLVW‚@XamwVIUKkaÇфa@U@KƒkVwkUUƒVKlVnU@aƒU@ƒVIka@akU@KVL@WÝçUV@Vmbů@L™KƒnnJW„ƒVkxlL@VX@VxmnXVWxUb@bkn"],encodeOffsets:[[109812,30961]]}},{type:"Feature",id:"500112",properties:{name:"渝北区",cp:[106.7212,29.8499],childNum:1},geometry:{type:"Polygon",coordinates:["@@@bVVXL‚a@lnbWn@L„@XVlK@VVLUVlbkLUKVVVL@VšnX‚VL@VV@UbVb@x@¦UxVb@bUJƒL@L„VVxlK@™nk@U@W„UVLlKXV„@VblU@UUKVU@wn@VJVanLlkX@VaVK™¯@a@U@U@ƒVaUK„kUUƒ±maUkm@UUkbm@@Vk@@JƒwU@Ub@I@JmwUL@aƒ@@KkVÇLkƒWkƒ@kUU@@xUVmKUnllUb"],encodeOffsets:[[109013,30381]]}},{type:"Feature",id:"500115",properties:{name:"长寿区",cp:[107.1606,29.9762],childNum:1},geometry:{type:"Polygon",coordinates:["@@VVšU„bX‚lX„¥l@XnVmlxUx„@@blVnnôĀlm@aVaXwWUnmUwW@@UkKlw„UXƒmI„mšL@Kưna@UUImyU@ƒ—@yULUUm@@mU@VIkaW@UUƒV@K™I@mƒmU™wƒ@™mKUnU‚UIƒlVLUb@„@V@V@bš°ULUbW@klmKUbUIm@@xUVVL"],encodeOffsets:[[109429,30747]]}},{type:"Feature",id:"500225",properties:{name:"大足县",cp:[105.7544,29.6136],childNum:1},geometry:{type:"Polygon",coordinates:["@@XUmaVaUU@anVlKXbValU@aV@@IXKš@@bV@VxVK@UXLlUšJXa@_‚@@aVK—ÅWVkwWaƒƒwUa@am@kUWLU@kWmX@ykI@W@UV@na@LlLV@UƒkwWƒUKmXX`mIVl@bXLWVkbkkƒx@`VXm@@J@U@UUKUxk@WbUIVl@VXLW„ƒJUkUlUImxXlmb@X@VUJUnVbšW@UV@@VVX@bnW@LVxUnlJUV@n„@VxVIn@l`„UVVVL"],encodeOffsets:[[108270,30578]]}},{type:"Feature",id:"500224",properties:{name:"铜梁县",cp:[106.0291,29.8059],childNum:1},geometry:{type:"Polygon",coordinates:["@@VblLV¤nI@bnKVV@Ul@@KVI@UnJ@Ll„klVLkxWK@bXb™@Vbk@Vb@ll@@nVlnIlmXblaXl@„W@_Ü@UƒUalU@aXL@Vlašb„a„ƒVL@mUL@ƒUUƒƒÇXUW›X_WaƒƒUƒ»m_™@UWULWb@UUVmK@VU@UImK@V@bkL„x‚„XblxXU˜ÆUL@b@@`Wb™IkVWK@VULUwU@@a™@WL@JU@@bkVUb"],encodeOffsets:[[108316,30527]]}},{type:"Feature",id:"500226",properties:{name:"荣昌县",cp:[105.5127,29.4708],childNum:1},geometry:{type:"Polygon",coordinates:["@@VI@U@WnaWknwVJVkVl„IXƒWK@UUkVJXal@VwVL@V@V@In@UW@_„wlllaXUWK@aUknJW_ۃ@aWaU@@UVm„UUaUImJVnÅUmVUm`kUUVWLnVU@VVmXƒK@„nxmŽULkx™ImJ@nU`@X@Vkn@`@nlV@nVJVaX„VLnK@bVV@nV@lbXWš@"],encodeOffsets:[[108012,30392]]}},{type:"Feature",id:"500227",properties:{name:"璧山县",cp:[106.2048,29.5807],childNum:1},geometry:{type:"Polygon",coordinates:["@@XzVlVVkbVL@JVĀXŽ‚¼V„„„XbW`XœWVȎ„„VVšŽVkV@@UXa@alK@IƒƒU@UKWUyUI@wVUUWVak@VUkƒW¹@WXI@yVIUK@kWwkѯ±W@™kUb@KkVVVmXƒJ"],encodeOffsets:[[108585,30032]]}},{type:"Feature",id:"500109",properties:{name:"北碚区",cp:[106.5674,29.8883],childNum:1},geometry:{type:"Polygon",coordinates:["@@X‚VLV@„„@JkL@bWb@VU@UlƜVy„a@nV@nn@KU@IVJU_lJXV@VlVIV`nIn°@b‚lUbš„„KVI@aUaVw@¥@wUaVaU@@UUKW™m@UUKUUVLlKkaVUUK@UkLWUƒ@@KXmma@kbWKUU@aUamLnÞ@VWLk@@Wm@ULU@@U™KUVWI"],encodeOffsets:[[108855,30449]]}},{type:"Feature",id:"500110",properties:{name:"万盛区",cp:[106.908,28.9325],childNum:1},geometry:{type:"Polygon",coordinates:["@@VIV@@wVJ@InKVxXal@@U@U@KlUnwUW@kVU„KUmVkUa@I@KW@@bk@@mƒU@m@k@a@aƒIUxmJk@ƒwULƒwkKmVVX@VXV@xVLVVULmWXwWUU@@nUJVL@KV@UVULlxnL@VnUl¼@l@XVxVVUbn@WbkxUšlVnU@m"],encodeOffsets:[[109452,29779]]}},{type:"Feature",id:"500107",properties:{name:"九龙坡区",cp:[106.3586,29.4049],childNum:1},geometry:{type:"Polygon",coordinates:["@@XK‚L@Vš@XbV@lW@UV@@VXIV@U™VKlL@KnnJ@VV@VU@I„@@mVUVWUUmL@V¯LUK@UV@UU@a@U@yU@WLUK@X@KUVmL@ƒ@aXI@w@ammVk@WÛwm@UxVVVbVLUJVxVU„V@V@X@JUIVbm@@Vk@@VkL@lVLUJ@zWJ@X"],encodeOffsets:[[108799,30241]]}},{type:"Feature",id:"500106",properties:{name:"沙坪坝区",cp:[106.3696,29.6191],childNum:1},geometry:{type:"Polygon",coordinates:["@@Xºl„UVl@UbVXUV@xVJVzXJVUšL@VV@VKn@@Xl@XK@UmÝnKVbVakkVm@k„ƒUK@UmIm@LkKULVšU@WJ@UU@@VkXU@Wa™@@UKWL"],encodeOffsets:[[108799,30241]]}},{type:"Feature",id:"500108",properties:{name:"南岸区",cp:[106.6663,29.5367],childNum:1},geometry:{type:"Polygon",coordinates:["@@VV„JVL@bUVVnl`XIlwXJlw°nnl‚IXW@UÇĉk@WJkwkLƒ@WVkU@LU@U`W@UXUV@n"],encodeOffsets:[[109092,30241]]}},{type:"Feature",id:"500105",properties:{name:"江北区",cp:[106.8311,29.6191],childNum:1},geometry:{type:"Polygon",coordinates:["@@nLVU@wV@lV„@Xll„ÈKlU@L„@@bVKnx@I@JVaV@„x@Il@@Un@laVVn@mkUIm`k@WXJmk¯mkxWIkxWJk_UmVUUKƒ@UU™@ƒ„@l"],encodeOffsets:[[109013,30319]]}},{type:"Feature",id:"500104",properties:{name:"大渡口区",cp:[106.4905,29.4214],childNum:1},geometry:{type:"Polygon",coordinates:["@@k@@U@w„¥WKkVkImUmwa@b@xWJ@b@„nKVU@L@WVLXKV@@z@V@bVVU@@VVL°K@U"],encodeOffsets:[[109080,30190]]}},{type:"Feature",id:"500111",properties:{name:"双桥区",cp:[105.7874,29.4928],childNum:1},geometry:{type:"Polygon",coordinates:["@@WwUwU@kK@KmbU@@V@XlJ@znWlXV@XK"],encodeOffsets:[[108372,30235]]}},{type:"Feature",id:"500103",properties:{name:"渝中区",cp:[106.5344,29.5477],childNum:1},geometry:{type:"Polygon",coordinates:["@@VLš@VV„@VL@aUKƒIUUƒ@@JUVU@"],encodeOffsets:[[109036,30257]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/fu_jian_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"3507",properties:{name:"南平市",cp:[118.136,27.2845],childNum:10},geometry:{type:"Polygon",coordinates:["@@@knyƒk@ƒKU¥šwV@nkƒWƒzUmk@@lKUa@aVI@UƒKUamKUUVaUI‚@Xƒ@UV@K±IUVVlUbUbUL@KWUXmWk@KkXmmkŃKUƒ™a@amUƒbkUkKWUnwUƒÇwV™UUƒÝUKV£U™@ƒnKWwXLVKm¥@wUXkmWk@ƒ@wX@lU„@šyVImaXwVƒƒ@kŽƒnU@mbk@mlUXƒmU@mV@n@bnW@bUIWJ—ImVUKWbUK@nkKƒaU@W_VUUmWmL@UU@™bUWUL@V@bmVUz@`mUUVVbXL@V™L@lmLUxmVamXkW@xWbU„VbUxkU±@ÅUmmkLUbW@@`kLknVlV@lbXxlVUXVV™ŽU„U@UbWŽkIWVUUUJkI@llbUxVL@V™VƒUU°ULUmWXUV@VULWb@™xm@UaVLVKUa@ƒw@V›bkmVambUUm@@VkK@„@b„xlxX@‚„n¤@Xƒ@@lkLWV@Žn„V„kb@bWJXLWx@nkxmm™bXn@VWVUn@VnJ@bVXl@„™VJXnWbX`lL„UlJVI@Žœ@VXV@Vl@bn@@Æmn@VšxXU@mVIlxšVššnI„l@nVJ‚aXI@mlU@aXkVm°klmnVV_naš°@V@xܦXK„V‚nnUlVXbVK‚LXKV@naV@@VVl@@lXblXšWnLlbVK²nš@@‚VLUnlV@lƒXxô°‚V@UnaUUlKXLVUVVUbVVlUnJVX„@VW@an@lb„@nl@VU@anƒšUVW@kƒaUm@InVVKVU@kUW@Uam@km@kVa@a@™nwšU@WlI@mVI@WXaW_nƒ@™nƒlkkW@U‚¥@kV@Uw@wUƒ@@IXK‚¥VIn@nU@`@Xl@VV„LnašW‚bVaUwnU„@VIšKlV"],encodeOffsets:[[122119,28086]]}},{type:"Feature",id:"3504",properties:{name:"三明市",cp:[117.5317,26.3013],childNum:11},geometry:{type:"Polygon",coordinates:["@@lL@Un@VVna‚bnUlœa@U‚x@„VbULUKVbn@šw‚@XaVK@UVUXWVnVKV¯„VšU@UUKVwka@klJVIVVXUlJXVaV@VƒšUUVWkUWwkaU@UklmlK@_X@ValKnnÆV²@lVVwUaVƒXa@wlXnW‚bnUVwnK@kšK@UWKUaVUnV@_VynU@a@UVKVXšaV@@VnKnXVV‚UX`V@„blL@mVLXaVLnU˜JXIVJ@amX@a@mnUV@„nVWnkl@naV@„ml„@@KmKUam@UU@ƒ@UlKU™Vk™U™K@aVaUwV™U¥UIkJ@wmI@‚mbkwkVW@UXƒKULU`™IVKUa@LƒkkVmUU@WlULUWÅU@I@ƒWW™nU@@w@a@ƒUam_XyVIVWkkƒ@mwVKXUV@nw˜VXkWƒÅ™U@ƒaƒU¯KUnƒK@ƒ¯šmUƒLXŽVLnWVbVbUVm@Ub¯¼W@amƒ`kb™amLUUUƒ™aUXV`@x@XmJ@n@L@xkJUU@kU@mWm@kUUwUUVWl@VUkIƒy@kkaVUUm™IWVXbWxU@k„mVkK@nWVX¦WxU@@bkx@VU@WŽk@™kUbmJUUmkUW@_kKWKƒ@knV¤kIUKWLUbV‚@Wbk@@VWL@VkI@lUXVxUVU@@mWIƒV@a¯nUaƒaUV@„ƒJ™b@bÞ°VbUš@X™aUVmL@‚VXblŽnV„°˜n@Vnx„@VUUUlK@InJVb@„Vlnn@V™L@VWJU„x@XlJUVVVl@LUUUJ@Lƒ„@lUL°¦k˜V„VnV@„xV„„l@blLnlšLVaXll@šnVUn@‚xn@nml°‚X@lb"], +encodeOffsets:[[119858,27754]]}},{type:"Feature",id:"3508",properties:{name:"龙岩市",cp:[116.8066,25.2026],childNum:7},geometry:{type:"Polygon",coordinates:["@@ša„I@ƒVU„bVb°m@b„UXJ@nV@VUUwVW@klJ@UXK@Ul@Xa‚@UVaXKVLlJU£lm„@XLlL@`VXnlVVnIVašll@XV@@Ulw@aV@XwW¥XU@mlLnUlƒV@XwWaXUšJVnUVlb@l„zlJUVk@UXVVVxlVn@nXV@@lVVlI@w@K@mnI@W@wU_VWšbV„VVnKšbla„_n‚bX@°»Van@VUUaUamXUKW„K@a@Ukƒ@wWkXƒWW@wUU™Kw@_lyƒwUkU@@Uƒ@kamVmƒXašUVUka@Wk@»UUUVƒKkbWU™VUbk@mkƒxkƒƒKnIVUmW@kUKmXUmVaU@kU@m@KUWVkIWJ@ŽU@UI@wUUUa@KW»nU@mVkUmm@XwWU@ƒUUmL@ƒw@mnƒVUU@aWak@@amxU@UxULWVXbVLU`mbUImVU„ƒbn‚V@@bVn@bnVWxLmyUbƒIUKƒ@aƒVm™akbV‚UXW„UlKWbkV@„WLUlk@@nšbƒb@lkKmU@ƒUIWJkw¯UUVVxm@@XkbWx—›XKƒlUzWJkUUL@bmKkVƒ@@VUIUlWV@X„K@VkbWx°xUb@LUbk@@VWb@LXJ@VWXU@@bUVV„VVn@VVlLn„@l„@‚xk¦Vx@bVJXbƒn@JlnXxV@@„nJ@X@V@lmx„bUn@xVL@VVKlL@l„„nLVaVL@xkl@LƒxVl°š„X„WVX„Vl„œJWnxlJ"],encodeOffsets:[[119194,26657]]}},{type:"Feature",id:"3509",properties:{name:"宁德市",cp:[119.6521,26.9824],childNum:9},geometry:{type:"Polygon",coordinates:["@@@LVKVaVaUkVU²J@LVU„@@W‚VJUbVVnLVb„L@VUJ@bVbkL@Žl@Vn„y„XmlU@™xV¦„L@Ž„lmz@lnL@bVVšbVb@l„nšKVk„Vl¤@zXV@šl@XJVLVKnXVK‚VnU@wUm@šKUƒ@UlVlw@U@U@ƒUaUKlU@kXKlmXIWKXaVIVUVK@KU@@k„JVUnLVJUL@V‚IVa@VnLšKUnl`Vb„V„V@š‚Vbn@Vzn@lKnVlI„VVKUalkXJl@XXVWVLVUUmVU@Unm„£lK@Uk@WUXK@U@WVwVkšƒĠkĢǰaUÅUwmaţƒɱUÇa™w„±V¹XalKôx„@„UVaÜʓͿVóbÅLƒJm„¯Vk¦ƒŽk@mamXkKUƒUL›akbk@mV@LkJWb@Vk„mXk@UVmaUV@amLUKUamI@KUaU@WbU@UUUƒUIWJUkm@šƒw™Kk„VJm@kxǁVƒUK@mUVUkmlkkVm@amwƒLVWU@UbVLkšUbƒ@VƒmK@XaVWU_VJnwV@@kUmWakxƒ@kwWakIWxnbUJ™zƒ@kVW@@x@„XllnVW@xn¦ULWKXxmL@„VšU¤VL„ÞVVUšÈxV„mxXVlLlV„anV@bšbV„„LlÆnnlW@LXlWnXV"],encodeOffsets:[[121816,27816]]}},{type:"Feature",id:"3501",properties:{name:"福州市",cp:[119.4543,25.9222],childNum:9},geometry:{type:"Polygon",coordinates:["@@lxna@nJ@xlIVJV¦UšVxUb@bšLšVUlVškL@V@„VVn@Vb‚Ln‚@LU„lJXblx„@lwXbVn@lU@mxUIV`UXWb@‚nLU„„@Val™UKVaV@UX„Knx‚bn@lUkllnUVnV‚@VLU„È‚lwn@UIlƒšL„x‚™n@VlXIVJV„VVV@XaV@Vb@LnJVbVLnK@bVUnbVUl@nWlƒ@UXalI@KnUl@laœbVKV„lLnWnbl@„l¥°Unƒ„IÆKôa΀U„a@UUwÇWǓIUWUÅVkƨm@ƒ@£@KmLU¤ULˣJ™kUƒVǟUUķ@ĉVƒKUk@Ѱwôǚç@īšé@Åţ¥mīÛkm¼Å@ƒVķVó°ō¦U°ƒn@bVJXVVL@bUŽƒakLmx@xmxXzW`XbWnXV@bWLÛ@™aƒ@ƒaXbWVkaÝwU@mlWKkLWWkLUKULW@kVmVUU݁UamV—¤›n@xUVUzkJV¦lJU„"],encodeOffsets:[[121253,26511]]}},{type:"Feature",id:"3506",properties:{name:"漳州市",cp:[117.5757,24.3732],childNum:10},geometry:{type:"Polygon",coordinates:["@@@bl@Xb@bVVUŽm„@n„x‚@nKVV@„XVWxn@VnUl@nmVX¼@LVbVV@xVJV@@XIlJXU‚V@Ln‚@lVV@UbVnnWVL@lnXUVmJ„Ll„„wnll@VašUXVla„LVUVV@¼Xl@lbUV™VWbn„nUlb„@@VV@„aVUšmlUašUny@kU@Wkk@WaUVk@@ammk@@U@UlU@aUa@wl@šmXLllnL‚U@anVnU@L@VVV@KlXnWVnVanUšw@w@wm›nÅ@wƒaUam@Uk„mUl@@a„a@U@¥škôK‚wȯ°w@ŻkwǕaK›ÑÛk@ĕōřċ£ĵƒUKW»kÅŻLU@Ulġw@¤Vz™VUbkKUbmLmlULU¼UxmbXl@bWVƒb@bUnV‚UšVbULU@@VkbVL@`U@WX@ŽXV@b°„@b¯š@¤@Xm@@b@`U„VVUL"],encodeOffsets:[[119712,24953]]}},{type:"Feature",id:"3505",properties:{name:"泉州市",cp:[118.3228,25.1147],childNum:9},geometry:{type:"Polygon",coordinates:["@@Vl„xkz@`‚xšLVV@xXXW„Xl@xl„@V@bnV°™@„„LVm°L„V„bV@ƚX„Wl—UmxU@WVULnx„@llUXUJWzn`Vb@„@b@xV@šmXX@„@JÆVVXVKXkV@nVlU„l@KVbULšJV_VK„LVWX@lUVƒkIU¥lIVyVU@wœm˜£nUVWU@aƒm@UmWw@UX@@am™VUn@@aUUlUVanaWUXWmUnkšK@VšUlVVUUwš@XLWWX™ma@knm‚bVb„VXbVL‚@XJlInlšL„w˜mXóšw@çV»ÇçŋaķƧóƅóKġ°nÅUķƑUÇW@—¯xǰöÆlV„n@llšaš@„Lšbƒ`™@™„VšXVƒVx@V@bULVJUk‚Ç@ƒ¼ƒXUKk@mmULkaWbk@ƒx@UkL@a@K@U@UmKmbU@kV@UmVUbUmmXkW@LUU@U@KmVmU@bVmKkkWK™nk@@xVb@bkV@V@Vl@nn@bl@VUXbl@XlV@@lmz™VVbkŽ™nUVƒb"],encodeOffsets:[[120398,25797]]}},{type:"Feature",id:"3503",properties:{name:"莆田市",cp:[119.0918,25.3455],childNum:2},geometry:{type:"Polygon",coordinates:["@@VbނVVnUlUX@VKVLlKXXlKXL‚‚nkV@ÞxlbXUWa„b„@šbÜ@XK@aWUXmWaX_Wynw@wnwlK„bV@aUKWUUI@a„mV¯Ŏ¥ô¯ĸU„UÆ@n»¯aƿé@ţ¯nĉĬÝK™óó@™ÑU¼@è™xWô—nƒx™KmkkJWI@UKWaƒUUaamn@lnbWšXXWK™@VxUVkU™V@U™LmlnVWXXVmbUbkVVV@bm@UVnš@bW@@VXx‚n@V„n@bV‚UX"],encodeOffsets:[[121388,26264]]}},{type:"Feature",id:"3502",properties:{name:"厦门市",cp:[118.1689,24.6478],childNum:1},geometry:{type:"Polygon",coordinates:["@@@VlUV@nanL@V@V@L@blK@V„wl@XalbVKnnl@VL„W„»È@lVUIVK@a@UUw„WUU™šƒš@„_™aƒK™@™bkkm@UƒkõŁxóL™l@¦@Vƒb@bk@VŽƒnVln@Vb„b@xmÆnœ@x@x™x"],encodeOffsets:[[120747,25465]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/gan_su_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"6209",properties:{name:"酒泉市",cp:[96.2622,40.4517],childNum:8},geometry:{type:"Polygon",coordinates:["@@ÇnÅaĉ@ƒU¯¥›UŹ‚ƒ£™WUýUU±JkkUw‚yÞIČxĊĕĊ¯š¥ÆUkţ™UÅÓ±¼™IUx¯UƒÒƑ‚ݐŰƒKÝnğ°ÅU@Žƒ@Vn@þš¼¯šWnŎ°XLWlnVnbWnƒVXxmbƒa—bóUƒlǕUUa™IUmlU™ƒš¥™kƒ¥ĉwkkƒÝɛa@¯™™U¯°mVƒkVnKlƒōÑÇÑU@kl™UġŽkUŻnUW™@š¯ƒk»šmWV£UKnUƒmUw‚w@ƒUIVaX™šwm»Èmmwn¯ċ™¯LĉŽUƒJUalka±Va@U‚k@ƒÛф¯WmnUaɝ¤Ûmƒn¯m±x@wóxÛLġÒUx¯VƒÈ™JUbóz݃ÇKĉ¯ōlÝUŎWl¯nťbÝ@¯ǩLġmV@ƯĢkÆm™ĊkVťLɃmÝXó°@„ĢbVŽóVݦɱ@Ƨaġ„UV„ĠÇÈV¼UVţwmbJÇwˋa™XmǯKkkmŽƒbXšm¼V¼Ǭڲ¤ôŰÆƴô̐ŤǪnɆӨ¼ɆLÆłUĊšxŎƞȘǔˎǬǪnƨŮǬö°»šġ„„ÞÜÆĸÒĊ„ǀbƾèôÈ@¼¯þŤĸƧ°Vb@lÈĊ‚šʠń̐„ȘKǀŽֲॗţÿǕý@ʊǓƨóÆÑǖŃôw@΋ʈƆÅÈVVĊV„óĊÅ@ÞƒĬV@Þīš@°Ž„V@ĸ̃°XτƜĠ@ÈaÜ¥Őƅ‚™nğóĕVġUůƿŋ—ĕƒa±V—UťÇğÑ"],encodeOffsets:[[101892,40821]]}},{type:"Feature",id:"6207",properties:{name:"张掖市",cp:[99.7998,38.7433],childNum:9},geometry:{type:"Polygon",coordinates:["@@ÈÒŎÒk„mLUŽlŽU„¯nV°šš@°ɜb„ÞĠaÈ»ĸl‚š„LVUÈ@Ċ@ýUm„@@ÆVĠ¯Þm„LƯޏƒ„ѰVVwšJ²»ÆÔšVlŤÅV™¦ĉ°ĉĖċwÝJzVxll²IVVVþšX„¤źœV°¦„VĊ@ÆbÈmǔLĸĠ¯Ģaô¯ĸmÆÛUƒlÇĸk°XyĊUǔV„ǩnmV»ƒa@ýnK°n@l¥@»ż„Ċ¤m皃@£ČU@mƒmVkÞUƐ±²¹°‚ĠwÅƑŃU¯™›V¯aÈŁšƒÇ»™ġn_°xŎKlxœklx„@Þw‚„„@Æm²b‚DzLlkšWXať¯ĊaœÑšK±w@wƒUÅçV±Uk™@@„¯š¯xƒU™±±UU°ōxVxÅÔō°ó¯UÝ¦óbÝþƒ@ĉÈóUV‚Ux„„@VŽUVÝwÅÈǎóVkk¯JǐkmmL@„™KÇx@bkš™@U°ķ²ó`ƒš™šmn¯°ƒUwlÅkUƒ`™¦ɛô™Žķz@ŽÅnǰU¼¯KmVk²ƒJƒ¼ƏÞķôš¤ULƒ@mnğ`™šÇnUxÇ@Ûÿ™U@ƒƒkŻŽ@x@móJkŃ¥VŹĉóÒĉlċ°ķ„Uƽ܃@›x"],encodeOffsets:[[99720,40090]]}},{type:"Feature",id:"6230",properties:{name:"甘南藏族自治州",cp:[102.9199,34.6893],childNum:9},geometry:{type:"Polygon",coordinates:["@@ލš™nKlnšwX¥WÝXk˜xÞUnƒ°aĊVnUUKlÞĶWXnĠ¥ô»„™@nmVL@¤°™Vz„JšanU@aÆwna@k›ƒU¯šyX_›aĉb™ƒ„wƒéXkWwÅaš¯V¥mƒ¯UƒƒI@ƒš@„mšb°aÈçšUš¥@»‚knwɜƇ°I°ÑÈmVU™¯Xa@w‚W@wšV¯Č¥l¯Uwnm@k˜aUaóKkk@™Ça™b@ށÒWa¯IÇxÛam¼™VUƒxÒl‚@zÝÒ¯bÝaĉVĉwDށW›zJ™mJn²mܯUƒ¯ĉ@ġ¤Åb@²nšmlƒ@@Ž„„U„ƒLVxšV™„U¼Ålma™b@ƒ°™l@WIUƒ¯@mƒ™@™™ó„™„@U›zţyƒXÇU™ÇVUUVLkbWakVWmUbkkƒKUÆ»nƒ°Knk@aƒUVmšnk»l¯Ģ›lw@_kKVU@ƒnaƒ@lUk@¯¥mV@kmbW™b¯Åõa@mkU@kƒÇŽkU@›`@™óó—bl¼Uxƒn„¼šlVȄx@blVkVVnƒ`XÈġÈ@ǃK£ÝJmUUnUĖmlU„mKUn™VÅaUw›Uĉ`¯n¯wW¼nxVŽ™š@bĉnƒ‚kIċŘkXUŽ±Ò™xšÈ@ŽX°`l„œV˜IȯĊV„ƒšVVan@VašUVażVmšblkÈW„ƒWIXa„alL@wVb„„V„¦lL@lĠ™n҄U‚nk‚šL@ÆÞkšÞšK‚bñþW¦Û„ċVƒ„ULUºkÈlŎUxÆxÞUUxšÒ‚x„@XbšL@lÆ@„ÒlXVln@„bm¼ƒJ@„Ån„šƒx@bnšĠm„xVXmbÈè@ŽĊ£ČW˜w"],encodeOffsets:[[105210,36349]]}},{type:"Feature",id:"6206",properties:{name:"武威市",cp:[103.0188,38.1061],childNum:4},geometry:{type:"Polygon",coordinates:["@@±¯¥@klwU»ƒƒÞÝmwKm¯™™ç@™kVÇUL¯lVUKġ„ġm@a@U„@X£°l°LŎÇ@aōVÝw™ÔƒKUŽÅš„WJ¯lm@ÛVWa™@klĉUmaƒLUanaƒ™ƒk¯J„™™±KkXóÜÅxƒ²Ç‚@„„nUÒĊb°@™ÆkL™Ž™XÇÆ@xÝn—xWxţ„¯¤ƒI@Æn„ƒVV„VlU²Æè„V@x²x™L›ÒĉbŦ°Wb™Xklބš@l¤šXĊ`„wl@ĢÈŎm@bšnV‚Ubƒ„@șÆÛLƒèǚUÒŦlĸ™`°ĮʟÆǓbĉôϚĊƚĢnŤé΀ÑĸĀĊ¦„@@l°lœ¦Ȯ¦ɆÞĊKŤ™ĵĸů„»mفyġ™ķŭ@Çɱȭ¯mƧUĊķnŁŻ»UaU™˜ƛɞÝƨů"],encodeOffsets:[[106336,38543]]}},{type:"Feature",id:"6212",properties:{name:"陇南市",cp:[105.304,33.5632],childNum:9},geometry:{type:"Polygon",coordinates:["@@šÈÞ@l`UmVƒ¼œŽ‚@nnÆwVlnVVa„LVƒÈ_‚ÿރ@n„a„xÆ@„lš_š@VxnK@llLnxmÈŎJnbUxšI°Žl@n¦‚lÈIlmX¥„k°@šk‚J„k²é˜@klaUaVaU@@ÝnIWnmnx‚k„ºÞ„„aV™°„V@nw‚KšxôbÞ£šVšU„bšþšLn»mƒVw„IšJ°Ž@„nb@°°I„ġUkÇKVƒ™™@ů»lƒ„Lnmƒ£@anK@Ñ܍n@»mL@£™yk„UUmbUÞÝ@kyÇbó»™XUxƒWVzb±mÝbXaƒwUamL¯»@wUKVwm¯ĵJ°ÅUWVk„KVk°wÈVšVуlUšƒ¥škmVamknƒUw¯¯ƒbċ¥ÅKƒk™Kk„™VċVk£kKVw‚Ñ„a@kóyÛ¯ÇVk™ów›š—Xō¥Ç¼ów™Ž¯U±‚k„ƒ@x›IĉÒÅVmÈnšÜ@n°„bUbÝV‚ŽUnnJ¯Į@‚m¦nV܃@„„L°JXb‚Ñ@šaÈb@šllôLVb—b@lmnVxk°ċ¦U°™Ž@xX@xWbš°UVÇn¯Ò¯Jɛƈmxl@¼"],encodeOffsets:[[106527,34943]]}},{type:"Feature",id:"6210",properties:{name:"庆阳市",cp:[107.5342,36.2],childNum:8},geometry:{type:"Polygon",coordinates:["@@kw‚ĉ—»VamƒƒV¯wƒIóVkl¯™Km™Vō¯ÝWkL@bÝKō¦@Ž™„@š™Lx›@b@l™a@km@@l¯nm@UaÅ@ƒ„óWUXm¥™nƒw`@UUxķôǰğ¦@„VJš_n‚‚IVŽnalxkX„JWn¯šnVƒLšxl¤nnVbklVX@xnxmV@bUK@nm@@xƒV—°±aÅnƒŽkUWnUaƒx@m™n@ƒ¯LƒššmUĀlU@lV@blLUblxklkIÇx¯°‚UXbšaVŽUnšV@°‚LUlnbšX@`°nVmbnÆmV‚kLmK™¦UŽ@X„y@kl@U„°K@¼XbW„ƒš@b„WnLVa„VšƒVz@xlVČ¥lbUxލlV„U@nÆWôn²™VJlU„Ƨ„LnmÜLXa˜n@mœw@wlUlV²mšblwšVȃlLލ„±@lVnUlxnkma@mškšJ@kXV‚U@mn@š¼VXUƒVƒlLnmVbôaVnWV»ÈUl°È¯ÆIn›ÆU@kk»mKkÆġk¯@»mƒk—¯@óÇlÇ@—Vykkl™Uml¯Þ™@w"],encodeOffsets:[[111229,36383]]}},{type:"Feature",id:"6204",properties:{name:"白银市",cp:[104.8645,36.5076],childNum:6},geometry:{type:"Polygon",coordinates:["@@VKUȚl@šè°šnŽ‚LnxÝބ„V¼kx@l‚¦²°ĊóĠ„™Ċ»š@ÈxšaĊxlwÈVŤa@¯²aÇ£ƒJk£lƒnUÞ@°šô™@y„wl»lIX¥Ǫnw@ÑÞWla„ÅlL@ƒUwĉakƒl@ƒš¯mwna°J„V¯nUVÓÞÑm£²óWaUƒÇ@óÝUçV»ÈkkW@¯‚xV@XlK@wX@Vmm_@wÈݙKU¯ÇwVwÅK¯VƒkƒJ™™™XkWVaƒImޝUk„ÇlVšœĀV°mxóšk„@¼ó„WxĉÜU@Ub‚zÛJÇk@‚ÆnVlԙ@kŽ„x™ô@ĬWL¯ƒƒK@aÛImm™@ƒIUaƒ@™™UŽÇêU¤VÒÇx¯ÒV„šš™lk@Wbĉ¦UbkWV_‚y¯Lƒaó„kŽ@b@nmbkx„°"],encodeOffsets:[[106077,37885]]}},{type:"Feature",id:"6211",properties:{name:"定西市",cp:[104.5569,35.0848],childNum:7},geometry:{type:"Polygon",coordinates:["@@„a‚V²wVJV_@„LlanÅllŦçÜӚ_šlnƒWaôk„xUš„bmV@È°lèšnk°l¦„`@nnL‚@ÈlÜIyVaV@ĊÛXwôƒ@»lƒô™nwU¯›ÿU™Èklƒ°Vn„JUblXšWšš„I„l°U„ƒVƒš—@aVVVmnL@„lƒ„UUw‚mkƒš£„bV¥VUVwۂƒlaÇÝރmk£ƒLUy¯L@WlkKW_XaWƒ—mƒ„ġU@a™k™‚ƒakXkmVwmŹVƒU™b™WƒónmwnWW£„KÈnV¥ƒ¥„ƒÆ_k™lW„bU¯„V°aôbnaVwmaōInÇmwkK@kmLUw™@™`ƒkÅ@ƒwƒb@m݄ĀÇ`U„ƒKUbmUUkÅxmm@›„»nUVk_Ý@™Ç™¦™VÇè¯b™aƒn™@@„„JV„°Žn„U¦™°ÆbXxWl„êƒxš„ĊaœbW`™zV°œ„@lmbÅx@bmV™bƒI™`™¦@ÒUVUI@ƃL@bš¼@ššŽ@„šlmxnL„°ULƒŽƒÞğޛ°kLUŽƒL™°™xVŽ„n„KVƒl@šzX@"],encodeOffsets:[[106122,36794]]}},{type:"Feature",id:"6205",properties:{name:"天水市",cp:[105.6445,34.6289],childNum:6},geometry:{type:"Polygon",coordinates:["@@UyȍVƒVUnn@ƒVU„`UblzšJnk‚@Vb„KU„°l„wš„„W°„nkVŽ‚UÈlš£°V@n¥šV„kl™kU˜±U„ƒn™ƒlw¯UkwmKUlmkUmnkym@ō@U„mWÈU°l°anlJškUKlU„¯Èm@kmWV»kkÝLUWUx±b™@¯ma@ƒ¯™IƒJUxn„m¼™K™ýƒa™V™Uݤóa™wLmxU@¯ƒUšƒb݃ƒ¹lmwmnXŽmJ@ÞV@UbVbkblŽ—@±êƒlI™l¯@ƒlW¦knÇJkm¥k@¯™Jmbóa¯bƒUV°ƒakXlšÅ`ƒ„„¦U¦ÇmƒLX¤mXnxm‚„ôšXša„VźUnŽUxlnlW„bššl@bĢV„ƒ˜nX„WbX`lLXk@ްKVz„Kl¤„nÞ݂Èkb„‚܁"],encodeOffsets:[[108180,35984]]}},{type:"Feature",id:"6201",properties:{name:"兰州市",cp:[103.5901,36.3043],childNum:5},geometry:{type:"MultiPolygon",coordinates:[["@@lW²LššƒŽ°I„l„šmbVb„KnbĊVlkš@XbÜU@Žkn°‚XIƒÆ™V„LšÓÞxŎUlôƒ„b°KzU`lXVaĊ¥Xal@šk™™Uƒ°ÑÈwUтV£ÈéVšš„@Vb„Jš@nnÜJ@b„L°„XK@īšóƒwlš@kÓmUÅmK@mƒ_k¥l¯™mkçǯ@nUƒaV™ƒwólXbm„™k™`ÛÔťèkkmÆkbƒK@U`UI±xUƒbWlX„mbVbÅÒólkƒƒIWJkšƒ@ƒz—Kݼ™@™xUx󎃄¯LWb@ŽÅ҄„±¦U`nbťĀUšVb„LšŽ„U"],["@@ƒ¯lwna@mōȯK¯kW¤ƒ@@V@bĢñVLU‚°k"]],encodeOffsets:[[[105188,37649]],[[106077,37885]]]}},{type:"Feature",id:"6208",properties:{name:"平凉市",cp:[107.0728,35.321],childNum:7},geometry:{type:"Polygon",coordinates:["@@ÆLUxÈxV°šLÇÞ@xn`Ü@X@nĊŽÆwnJmwUx‚aUkšw@V@w„aVmlLXÝl@X‚VĢmV°@nl@UUUWK@w„ÿVI²Òlmš@nÝĊýVV@nšJ°„„šUłm@kV¼nK›ĢȤôK„blnKllVk²aĠ¥È¯ĸóVw@V‚_„xšmn¦VWôX„ƒÆ@Vbn@°m@kn@@lšb@k‚aœ@‚wšK@™šƒ@UlKVaƒWX™W²¹lӄw@_°›n@@_lKōķW™@ŽmLUWƒn™»Û@›l_Ç`ƒÛmm°ÅbWb@š—VWbƒUUKDŽÅaġlmkUġlƒ»—Lƒl™Um¦@ޝU™¤ÇkVUml¯ƒƒX™ƒƒx¯kVƒƒLUa@ml™IkyVaƒ_UV@„mmUVU„ÇŽVzUxUVU¦ƒa™¤l„nVxƒVk„@ƒmKUnUU@b™˜U„ƒ„","@@@Žż@™mlkƒġk"],encodeOffsets:[[107877,36338],[108439,36265]]}},{type:"Feature",id:"6229",properties:{name:"临夏回族自治州",cp:[103.2715,35.5737],childNum:8},geometry:{type:"Polygon",coordinates:["@@š@ż»˜L„y„@l™XI„Jl„ôkÆÑUanaWƒXkW@™yk@U„ƒLƒmUšwš¯„KVlKœ¯Ġ݄݄VKƒ¯mKnw™k@ƒ™@™™»@a„K@ÅVJVU@њ¥š_Uy¯š@£UKmn@‚ƒšó¼ğ¦WmĵXݎkŽVLmVĉU¯bm„ÝV—wWlXÞW¦™xkmmL™šÝŽœ„±U@Vގ™š@„ÅÈW°X„ܼƨyUĮnŽWŽnXÝxUx°lVXJlôV"],encodeOffsets:[[105548,37075]]}},{type:"Feature",id:"6203",properties:{name:"金昌市",cp:[102.074,38.5126],childNum:2},geometry:{type:"Polygon",coordinates:["@@šĢȼ™„Çł°bœU°šV‚ƒń‚ÆǖŰnšÆ„ōĬǔaʠůĭš_kķÆ¥VÑș„çÜKšÅ@DŽƒVaU™m@aōnġÇk@ƒxĉ_™Wk£™@݃±KÈ±aÅnƒ@ƒÝxƒ@kw›lkwōL¯wm`"],encodeOffsets:[[103849,38970]]}},{type:"Feature",id:"6202",properties:{name:"嘉峪关市",cp:[98.1738,39.8035],childNum:1},geometry:{type:"Polygon",coordinates:["@@llĊx„¦šl™¦š„kVVnšJVbǖV„kôV˜a„bnaWw„UXmmamUXkWKō¯Xm°™™»ĉÇ@UVƒK™ķkǼğb"],encodeOffsets:[[100182,40664]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/guang_dong_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"4418",properties:{name:"清远市",cp:[112.9175,24.3292],childNum:8},geometry:{type:"Polygon",coordinates:["@@lǯkÿƒaV¯™VaÈU„¥ÆÇ„Ilxšmnb‚Uœxl™„Uôl°kš„„Wl„š@ô™VwUanUl@„xVkšaX¥‚kU»„aš¯±@kka@ƒUwmUkwƒJk™˜„±k@ƒ™™L@ÝWUwV݃—xÇU¯ŽÇX@m™Åƒ@@yĉ£VmUwȗ»ÇšUn„lUnWU¯`Ukƒ@@„™x„Ž@bÇxX¼ƒVVš¯LšĀk‚ÝLƒ„¯@VŽƒĀ¯lnĊW¦kVÇôkUDŽUK@ţ™U@a™™ó܃UU»ƒ@™¦k@Vx„KVb„n‚š@„Æ™„l„@xšƒbWšnlU„lxÈlV„ȰƄ@¼™„@x„šWxœŎ‚V„šK°„š¥ššnƒÆkŎ@ÈÑm™„K@¥šk@™ô@„nôV"],encodeOffsets:[[115707,25527]]}},{type:"Feature",id:"4402",properties:{name:"韶关市",cp:[113.7964,24.7028],childNum:8},geometry:{type:"Polygon",coordinates:["@@W™Xk±Ñ@ƒUw™mUwĉwlmn@Æwn£mkIš¥ÇÅ@¥šaƒón£nWWwš£V`Þ@šnVml@xô¼„IV¥ƒkUmkamUkVWwÛ»móƒ£UVÅKmn@x™@kbmm¯a™Xka›VĉaUb݃ƒ²—‚lš„IlxnVVx@„lb@l²™°ƒbV¼lW¦™bUlƒwk@mVVbUxóš™@kƒƒX™ƒ¯lókƒVkš›wVma™nkwƒJÅȃ¦ÇVUbšŽU°„bl°ŽkÈ@x™¦ÆÜ™°@„°„¦óa™VUôlUlbXl@nÜV„„nKlŽnIVÞ°Wš„°U@bnm@¥šIVƒ²Ulƒ°VnalzXyl_Vyƒ¦lƒœLlxš„@ŽÞbšKm„knVWanwƒÑVwČº˜@n_ÞV„aVŽÜIœl@„˜KȚ„VJ@aš£È@˜™@km™„aV¯W@_ƒa¯KmbkÇkLmwƒ@Å¥"],encodeOffsets:[[117147,25549]]}},{type:"Feature",id:"4408",properties:{name:"湛江市",cp:[110.3577,20.9894],childNum:6},geometry:{type:"Polygon",coordinates:["@@@ƒkXƒ™@a„UUċlk„Jƒk„™@wVJXUWk°W@nKnwlUlš²ƒ„blU@‚lI„l@„XbW„šxnm@lW@w„wU‚JX¯VU°`ŎóˋkÝÝkÅ@ÇmğÈřmw™aĵV›xUہ»°™ĠǷnýmóX¥ɅĵҏÇ@°²ĊU˱ĮU¤Ç°™Ā¯ɐnżUĊĊĬV@脎@ԃÒU¼l¤nƒĠb„êVĠ°Èy„zVaV‚nUÆL„ašbVl„wÆ@"],encodeOffsets:[[113040,22416]]}},{type:"Feature",id:"4414",properties:{name:"梅州市",cp:[116.1255,24.1534],childNum:8},geometry:{type:"Polygon",coordinates:["@@„‚nԚlW¼x‚¦@lœVl™lLkè„a@zš¤ƒĖ„¼UxlnUKUbÝlU¼lb@„Vx„V„klJÈwV¯š@ĠlÛ˚nƒbkšÆźÞƒUÈôklmšL„¥‚LœW˜„„™nKUkVa°V„x@IVV@x°bUk„a™a@mV@„@y„w‚L„ÑUwVUšV„‚„U‚bÞVVann‚@XwÇÿš¯²aVamkXaÆ»@»nw@¥›UXaƒkbWa¯KUw@¥m@kwmLU»UU™J@kmU@UUWUƒ@ƒyƒanwmçÛl¯ƒŽ¯UƒmKUmƒwVkmÝXbW@XWÝbƒk¯@±‚w@»U@W¯Å@ƒÇ¥UƒU@ƒƒ™IU™ƒakJƒĀ„ꃰšþƒXkamŽ@Žƒ_J°m‚@X"],encodeOffsets:[[118125,24419]]}},{type:"Feature",id:"4416",properties:{name:"河源市",cp:[114.917,23.9722],childNum:6},geometry:{type:"Polygon",coordinates:["@@°VlmX¹laĢÒlm„@„„šV𣂂@¦Ģklynn¼lW°z„W„„°VbÈV@lÆbnn‚JškX„šVÆašÅ„W@™ƒUUw@ƒkaV»ÞkVaVLkmVwƒ»„ĕ™£@yƒblçkKkš›U@k¥‚wX»™kmӃ@Wn¯‚I„`@nlb„W™ý„¯ƒé„ÿlI@™XUmWUwƒ@@UJU„Ç„mKUV@x™„ţk¯¯LWƒƒnUxK@ű»Vwa¯š@¤WX@ŽÛ¦@¤ÇIȼWxXŽƒ@Wx—w›ŽUnVbÅèmVa±²UWl@Žk„lȄ¤nôܼXxlUnVlbVn„lU¦ƒJó»@wnkmU™‚Ý@U_™¤XxmXm¤„ô™b@¦Èƙ¦lJn"],encodeOffsets:[[117057,25167]]}},{type:"Feature",id:"4412",properties:{name:"肇庆市",cp:[112.1265,23.5822],childNum:7},geometry:{type:"Polygon",coordinates:["@@l@š¥„@V¼„Vôۚš@bšV@ŤVLȃlVÈólUX¥mĉ°k„ÿU°@„ƒÞKl™ÿ°KU™„UW»Èw@aƒšw@ƒ„@nm@w›£kÓVUVn„Kš™k¥™£Vamƒ@nkKkbÆǫma—kmLU¥™UmƒÛwmVU™mUƒJ—ÇaUxÇIn`mb@Þ¯b@„nJ@nl„U‚V„lVU„L›W¯—Û`Ç_¯`mš¯I™bĉWċzx±J™x𐝯Uƒƒ_k@™šƒJ@Umb„šXôlLš˜n¦@¼ĊxlUXŽ˜xUbL‚Ġ„UnVĊwlšUš„b@lW„X„‚m²˜@ÞWxXš‚Unb"],encodeOffsets:[[114627,24818]]}},{type:"Feature",id:"4413",properties:{name:"惠州市",cp:[114.6204,23.1647],childNum:4},geometry:{type:"Polygon",coordinates:["@@lbšW°bnnlaš@@wnmÆLVUkÇlƒ@Xk‚V²±‚bnUÆçUaVmœ˜xXw„@WXwÇ»ÈJ@£Ü¥@XW@£°™‚bUx²¼@ƂLVw„mX„°K°Ťlšƒ@wVUnLȃVƒVIky±wkƒKU¯ƒÅkƒ™XġÑۃlwUwlm@m„nKWašÅm›¯óÇmğb¯alĉUwķbmb@lÞÒVn—šmĀŹ@VŽƒbVŽUnmakLm`@xĉkklVÔVJVn—lV„UnmJmaLUbl‚™zmŽkL™a™‚ō@@zš‚V¦UŽV²kJ„nÜU@˜VXUށL@„lJƒL@bݤUnVŽ—b@xVnlK²„Vx°V„xlI„lkVl²k¤@n"],encodeOffsets:[[116776,24492]]}},{type:"Feature",id:"4409",properties:{name:"茂名市",cp:[111.0059,22.0221],childNum:5},geometry:{type:"Polygon",coordinates:["@@‚LnÇlk„KnkÆL„ƒUm™ÈxlUœJló°n@ššanŽš„„a@ƒ˜@X_@mÝóóU@a™aU¯mL¯ƒƒkV¯™ÇVwkw@V±Ŏ£@™™@šalw±Vk@m„Åm¯™ÿŃƧIÇ`ōô¯_UVW°IV‚ƒx@xkX@Žmn™wXƒWa@ƒƒkkJ@kVƒa±„k™kVmxmL@‚¯XXlWVUI@xƒš„lƒIklVȃV@b„šlW@„@nUxVblVxkôlx™n„‚y„šnIƻư„aXwlK„bVnƒŽXb‚L„¤„k‚L—èƒVV¼ƒŽ²IlĠVX„ynz°KVx°@VlœLlblKœš"],encodeOffsets:[[113761,23237]]}},{type:"Feature",id:"4407",properties:{name:"江门市",cp:[112.6318,22.1484],childNum:5},geometry:{type:"Polygon",coordinates:["@@lUXx°JWnnƚXVš„W„X@„šºVLV¯nU‚Vnb™ô„x‚aXmW™XIšŽUb°xlK„l¯œK˜xXÞ°ŽšXÈ¥Ü@„ĉޏU™‚çš»nóƒVma—x‚¯UÅU¥Ý¯@ƒƒç@ș@çĉÅUmU籃ĉKÝxÝ_ÅJƒk¯»ó¯nmèkǀšŽWxœ¼mnUÜġ°@¦@ƒxƒLkŽÇaVnUxV„™šVlnIlbnÆÆKX¦"],encodeOffsets:[[114852,22928]]}},{type:"Feature",id:"4417",properties:{name:"阳江市",cp:[111.8298,22.0715],childNum:4},geometry:{type:"Polygon",coordinates:["@@°„nKV°šb@bôVÞô@n„VlÒôÆUnlnn@lmkmVkƒaÈkÆÆ„™k¥‚ÅÞ»ÆKXkW¥ÅLmÅkamJUkš™UƒVwUmÈbl„K„w‚@@¥Ģ¯VÛnm›»Xw™lƿ™@kbW™—aʵ@óL›l¯ƽ@™ƒƒLn°ƒÆ@nUl‚²kx™b@‚š@šō¤U²@ŽlxUxšÈU°lŽ„"],encodeOffsets:[[114053,22782]]}},{type:"Feature",id:"4453",properties:{name:"云浮市",cp:[111.7859,22.8516],childNum:5},geometry:{type:"Polygon",coordinates:["@@@V„Iš™l@„`V„°Å™šw²I‚wČyĊXša°Jn™°_È`Ü_°˜œX‚KVƒkUUƒVkƒ@mmI@ƒ°a@Ýnam_ÈJVwlĉX@„šlUšómaUmVU°UK™¹@ƒƒWƒXU™™WmÅXm¯IWwkVWlÅLݼÆl¦ƒšÅÅÇl„bUllnknm@kmVmóÅkуUW`—@@„ƒb™ƒm™b@™¯mkô›IkVÇwnš„VƒÅKmlƒLklmȁKƒšVĊK°²„`n˜¤n„U„bWl„xVx™LUx@°nXm`VklVxmnnx"],encodeOffsets:[[114053,23873]]}},{type:"Feature",id:"4401",properties:{name:"广州市",cp:[113.5107,23.2196],childNum:13},geometry:{type:"Polygon",coordinates:["@@Ș¼VxUnĊ¤@z„@šÆ@nÈW°ÈV˜w„ŽUÞVxÞX@ŽšK„šl@ބVaĊbœU@ml£k±lUƒkkJƒw¯UUw±ƒkLUm@w˜aUVmÞ£@a„KkI@ƒ‚KVUW@—ÛVƒmlIU±VU¥™@yğzƧǃƒšƽĠřšÅnī±m@ƒ²¯lƒ°@nÝÆóUll@XnÝVU¦mVV°—„V¼™Jƒn„b@°mbn„ƒ‚@²¯‚¯wVwƒ@@nmxX¤¯L@ŽVLU„m@@l"],encodeOffsets:[[115673,24019]]}},{type:"Feature",id:"4415",properties:{name:"汕尾市",cp:[115.5762,23.0438],childNum:4},geometry:{type:"Polygon",coordinates:["@@@‚„@VxnXWV@š„bVššJ„„V@ÞÅU¥Ċxš£UWU‚wÅUU¥WVUkĊÇnkV`°LV™„wƒƒnU@™„ƒlbĊ¯„Vnalšš@@çkUÝ¥ġaó¯ÅaÅLŻÆUýmy¯ó@ĉÆó„ȯw™ÆXbmLƒ‚@nknVxkx܄ĢҚW„Æl„V°„Ll‚²xlz"],encodeOffsets:[[118193,23806]]}},{type:"Feature",id:"4452",properties:{name:"揭阳市",cp:[116.1255,23.313],childNum:5},geometry:{type:"Polygon",coordinates:["@@V„Ȧ„Æ@X°V@@¼‚x²°@„lÞaWXX@‚aÞWlnUŽ„xVnnL„‚°V„@k‚mĢl@„ak™@mlk°aXƒ±„nwm±™²¯JV²@ƒwW˜—_mƒa„V»ƒU@m¯ĉUф™šJl™„ašbVn„lĸLlƅÛDZwÝ@ĉxó@è™@k™mbƒUĉ°kaƒ„@šmV„„ƒxUš¯KU_mlĉÈVlXUV¦ÆVxVŽVX™¤ĉwV¦ÝÆ"],encodeOffsets:[[118384,24036]]}},{type:"Feature",id:"4404",properties:{name:"珠海市",cp:[113.7305,22.1155],childNum:1},geometry:{type:"Polygon",coordinates:["@@„è@„Þ°V¦VƁ°˜wnb„UÆ»nçÆ@nxܤ²llU°VnÈJސ°UôéšķUklƒô£VVˌKÞV°£n¥ƒ£ȗ™Ýy¯¯mÅkw¯bÇĔğ@Ýn¯ĊƒVğōŁŻƒķJ@Ț","@@X¯kmèVbnJ‚™"],encodeOffsets:[[115774,22602],[116325,22697]]}},{type:"Feature",id:"4406",properties:{name:"佛山市",cp:[112.8955,23.1097],childNum:1},geometry:{type:"Polygon",coordinates:["@@Èb˜Ž„InVVšnUÜxn„šVV¦nK˜lnbÅǬlalL@mn„Ubš¤l¦™šƒLUmUVlԜ¤@xmnVl°_XVVmƒkVmș@kn@VƒUK@°KW£nw@m„@Ux°x°@±„mƒna@¯ƒa„mšIU»˜ƒU¯nUV¥ÞUWmk@Vk¯™Ukn›ÑWݐƒĊÛ@Ǧ™W¯Wݗw›Lk°ƒkL¯wVa™WJXšWnbƒwkVƒ™W@kĊ"],encodeOffsets:[[115088,23316]]}},{type:"Feature",id:"4451",properties:{name:"潮州市",cp:[116.7847,23.8293],childNum:3},geometry:{type:"Polygon",coordinates:["@@°ŽÜknèmx„b„z„@V‚VX@VnV@lšIVVV¼nKlxn@@¦Vx°LXbla„ŽWbœV°£¯™W@nW@™‚aUñVœwWš»@¥ŤÅUÝǓÝóV@ńǎkUVmƒIUwÅVWÇX¹›—@W„¯bkl@nlšƒb@‚kġށn@l"],encodeOffsets:[[119161,24306]]}},{type:"Feature",id:"4405",properties:{name:"汕头市",cp:[117.1692,23.3405],childNum:2},geometry:{type:"Polygon",coordinates:["@@‚@U±°Iš±n²mx²ƒ˜@œWºXÈÆUVx„JUnlVȍ@ŃôUǔÞVçn»VyĢÛVm@»kaÝUǼóšÛÈķKċ¥X„¥Wwğk™ƒ¯@ƒwķKƒkUm™aƒbkš™IƒšVÒ°Ċ@n„VU¼ƒ‚„bn˜`X—„x"],encodeOffsets:[[119251,24059]]}},{type:"Feature",id:"4403",properties:{name:"深圳市",cp:[114.5435,22.5439],childNum:1},geometry:{type:"Polygon",coordinates:["@@ÞLš„@xšbV„šVšK°™X°Kô¥Vw@anU„胐š‚lkĊl@wn_lKnbVmU„aUź@nÿ˜™UmÝѯUƒbk„@ÆkxŻ@™aÇX—wƒJƒƒ¯LķÝUĕ™ó™ĸóêWº@b²nmĬ™Æ"],encodeOffsets:[[116404,23265]]}},{type:"Feature",id:"4419",properties:{name:"东莞市",cp:[113.8953,22.901],childNum:1},geometry:{type:"Polygon",coordinates:["@@Ŏ@ššblKnšykVa‚KnbnIVmUƒ˜kUmUIUә„ƒçmV@bUxó¦¯LW‚¯š™L™UUƒ™a@w™ƒÝKğŚ™ƾ„„ƨÈĠy"],encodeOffsets:[[116573,23670]]}},{type:"Feature",id:"4420",properties:{name:"中山市",cp:[113.4229,22.478],childNum:1},geometry:{type:"Polygon",coordinates:["@@‚XœÒlmšV°ôÞÅ@m„¯°k„±‚@@aX¹¯VݏÇIUmV¯kk‚±Û£mw@‚Őmèżmô™¼èVš"],encodeOffsets:[[115887,23209]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/guang_xi_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"4510",properties:{name:"百色市",cp:[106.6003,23.9227],childNum:12},geometry:{type:"Polygon",coordinates:["@@lklWXL@VšI‚l@XnJn@VUUalk@mK@kny@UlU@a°™„ƒUU@VmaU@Ua@UWw@ƒn@KmLm@alkšmnI‚m@an@VIUamWÅImwU@@a@K„X@JVL„UVmUaVkUa@m„@@Ulmkk°ƒUaVUlKXbVwVIkaVmUk@KVk@a„aW¯m@w„¥laœX@KmaškVmnUl@nxVKšInU@yVaVIV@na°KlxX@@_lmXšUV`VIV™V@„n@lšbn@@WUkValK@²yl@„„VUV@@K°L@KU@@UVaXIVVV@naVkVa@K@UUK@UUa™LWa—w@m@K@UVVƒ@mVUUVKnL„mVL„K‚bVK@UUIk›mI@mUIVK@IUK@VkLƒ@WU@mU@WmUk@ƒI@VƒJk@WwX_@amK@UUWkIƒ„ƒK@LVb@mVmakL@J@bU@Ux@xƒbmI@`ƒIwm@UbmKUaUWa¯UkJWV@XƒJUU¯LUmV@ma@kkamKwƒLUUmWVkkm@aVUUkVKnVVUmXK@UW@km@Ukkm@@W@U™kUy@I@aUUmbƒ¤U@kUmL@bmJU@Ua@wkLWWkL@Uƒ@VaU@ƒLUakKWbkUWVkKkLVLUV@JVbƒz@Vƒ„@ƒVmUU@kVmK¯@VƒU_™VWakVmIUKUaU@@bml@XU@@V@LmKUV„mVUKƒƒKƒbkaUXƒKUL@x@V@l@„mxU¦„V@ŽlL@V@Ln@@VV@„nlKUaV@nLUbmJnL@VWLkbmV„@@L„W‚„XLlx„VVIVV@x@V²blUVm„LVUœK@kWWXUlV@Xl`„LX„l@@VšŽƒn@VnbVš@lVUVUÈVbš@@`UXU`l@@XUVm@kš@xmVknUJVXUbmKULmbx@VlJ@LVbkKUbVLÇUUVƒUVmU@VaUkUKƒVUwmLkUUVVlƒbka™XmwƒKUšVVU@@V±Uk@VWUUm»XamU™bƒKk™`ƒ„™U@UnWW_kKmbUVUVmnUV@„nJVUlšUbU@UV@n@JmI@VmbnVUXlx¯ŽkKmnVV@L@V™bkV™Umm™@Ub¯LmlUƒL@VWLkmkLmmn£WmnKU_mW™š™bnbmxƒ@U¦UJU„@Xmlk¦@‚mnUUm@@Jn@lV„ÔVJnIVW„I@a„ƒÆK@I@aVK„IlŽÞnnl@nl`nbÆX²l@xV„@llbVn²ŽVVl@nn„V@IlW@Un@@kVa°KšnÈmVaVXUlaVƒÈU„VlwôUlynIVašan@lVXb‚Iš@n¥la@Kš_n‚@bÆx@XnJV„nKVz@`VXVšU`@bƒ¦UV@VšIlx„UnV‚K„XÈbšVllšbVbnVn@"],encodeOffsets:[[109126,25684]]}},{type:"Feature",id:"4512",properties:{name:"河池市",cp:[107.8638,24.5819],childNum:11},geometry:{type:"Polygon",coordinates:["@@lLVl„bVV@nXVlI@JVX„mšn„W°b„IVV@‚ln„@nalVUb„nW‚@kVkÒlbVKn²°bUŽlV²@˜X@`nb„aUI@ƒ°wlU@aXJVI@aVK@wUamIXm‚@XUV@@bV@Vm„ImnUUwVaVKXU‚nVK@akƒVwV@nL@UV`n@@X‚lnIUJl@X¦˜V@aUIVm@anƒV@UwnL@VlbVL@KVVXUWƒ„wUUVUka@UVJnUlbnalbVVn@°„„LV`Þ@šXVxV@@bVlUVVbXnWlXnmlš@XXWVXJmbUI@V„llUVkn@@VWV@Vnb„@VXUJVnn`lLVk„a„»lVšLnw@WV@lInw@WnU@U@m‚knUVó„K‚wUmUXUƒU@@wVJVIl@XKVVVbVI„J@Un@lŽVLnm„b@U@Ul@nUš°VUVJnnVJV@„@mVU@ƒ@wkUVwkKWk™yUUkU@alkÈ@lJ@x„Ilƒ@UUWVkUw@Kn@@kmaƒVUl™UUL™ÇƒUUKl@UUmL@aXU@mlUUwmKkUUVKVUƒaƒKUnK@U@Vl@XUWU„KlwX@šb@K‚@XkV@UwWJka@aUwmV@U™@@U@wUm@»kLWVkIWŽXnmV@VkbmKƒLUbk™Va@aƒa@@aVU@aVak£@ƒ±UkVU¯V™UUƒJVƒUIƒ@kxmUmWUbL›w@K@aU@@aVU@Kma@aka@_VWkk@UWVUKULWKULUš@KUnƒwVaUKƒxU@UmaƒL—m@kVmVa@UkƒmI@ƒ@KmIkxU@@K™U@mmakI@VƒLkmWkkJ™_U‚@V@L@n˜xXbšKVb@VVL@V@LUbUlmbU@UUWJUb@VV@@L¯K@LU@UVƒƒk@±z@‚kLUbVl@Xm@™akm@ƒU@UšUJU_™VWŽkn@`W@kw¯LmbU@UJUb@zmV™JULmwk@mVUn™lnb@L›Wkbƒ¦@x°nXŽƒb@bUl@LVlUnlbUJUxWakLUVVb¯„llkn@Vƒ@@nVbUlVbUnƒVUK@IƒW@L@bV@nxÆJnXVbUJm@@bnmJ™nkl@b‚nnK@L„m‚@Xx@VVbV@nb@UVVƒ„¯š@bkV@Vmz@lnLl@kŽVbUVm@mI@Wk™J@UWKkXkl"],encodeOffsets:[[109126,25684]]}},{type:"Feature",id:"4503",properties:{name:"桂林市",cp:[110.5554,25.318],childNum:13},geometry:{type:"Polygon",coordinates:["@@nU@J‚X@`XLm¦Vb`lšVXXWš@VblČnVšŽlanLnmVLšK@_Vaƒ¥@kUa„@VmVb„aV@XVVzlVVK@knKVmX£VKšLlbnš@b@llL@xĊôXaV@°È@¤„bn„V@@Wl_„V„U@W„nVamw„wVbn@„K‚VšLX@VmVUxlV@šnVV_nK@m‚I@Wn@@IšUĊ@@wVWX@@I°VVm@wmU@m@IUƒV™kƒlkUmmkÅV@@aV@@Wn_UKla@kšaV„šlVanb@k„@@KlVn@@aV@nIWW™UUaVU@™kKmwU@UImKk@UU@w@W@‚™k@™UkWƒ@mk_W@Ua@a™ƒƒ@—¯ƒmV£@mƒUUam@—kWakƒVama@UUm@nw@alaUmnUlVlIœV‚™šLVyk£Vm@k@UUJkƒK@kmKUw™KkWK@UXImyVwnI@m‚ƒkUlkUKkUVmƒw@kkJWUÈm@_k@@aƒaW@U„UJUwU@@IWKkƒmUUV@nVl@bVb@bU‚UXƒakw@ƒWUkbkKƒbm@™xUlkLm@@wmKUX@‚™UaVW™XVmU@@UUUƒxkmWXkKkUWaUaUb™L@`UL@LV`UXmK@VmakLVbkL‚xUJUIVbUVVb¯KƒV@Xnl@lVXbmÒnV@L@VWKkVUIWJkIƒŽUamUUbm@U„kU@JUbW@X„WxUam@kbVVUnUJmUUV@bƒU@UUV™@ƒVk@ƒbƒmULV¦U@V„U`VLUL@xVbn@UJ@nWJXXVŽVV@bkxVbUx‚Lšš@x„¦@šU‚lXUVVlULV@@šnŽU„ƒb@xl„nJVnlVknUlVUbmŽU@ƒbVš„x"],encodeOffsets:[[112399,26500]]}},{type:"Feature",id:"4501",properties:{name:"南宁市",cp:[108.479,23.1152],childNum:7},geometry:{type:"Polygon",coordinates:["@@lKnbnU‚@Ua@K„L„ƒlJVX@VnL@bW`Xxl@„I@U„Jl@nV@X‚V@nXV„@lK@UVL@JULVJ@nnJlœVJ@VULaƒLUKƒnmKULVVUŽ@nU„š`lIXlln„K@UlJnb@nšV@LV@lwnJ@L@„nJl„@VUbUn@l˜n„KnbVŽV@„wVLUb„xVm@LV™VKXLVKVLXU@VllUX@`lb@bnb‚L@ŽUV@bV@@b@Lœx‚KVanXVƒUUmVUUUaVUky‚UUa„ImK@mUUVUkKU_@W@UVVVIUW„UVaVU@UUKnƒ@k@al@ll@bnL@b„VUV˜X@Vœ@@b‚Knblmn@V_@aUalL@a@akK@kVKUKlwUUnV¥VmU_VWVIVaX@Va„alńK@LVJnalL@LnK„wlVUw‚mX@VXšƒlLUVnblaUmVUVwXU@Wm¯Va@ÞKnw@w™mšk„»‚UVW²a@_mW@U@I„y„LVUUKW@@™„LX@VUV@@yVU@UV@nwUUmJka@IU@ƒmƒVkaW@UwUX@`ƒ@kLWUk@mƒkUUm@k‚UUWkUƒkWxk@@VƒK@nV@UVaƒUUJmIkVƒ@UamLUbkVmamLka™@ƒ‚kmL¯WI@wJmwƒx@akU@aUKmbkaW_nW@_U@Wm@a@wkwUKmƒk@ƒbkb›w@mKUkkU@J@bW@kVWz@bVUa›VUx@„ULkJWbXVVXƒ`@œmJUVU@@Lk@WbU@UJlnXlm„Vx@Ln@‚b@K„LX„WJUUW@kƒaUVUbmV@nnV@n@lVLƒVmLX‚mXkV±@kxÅL›šUbJWIÅJ@I‚mXalkUamKkškL±aVwKƒUU@mÞnbWJX„m„@lbmKULWUUVkaƒbnn@Vl@VVV@VƒbVbnLWLXJWxXLV@@VV"],encodeOffsets:[[109958,23806]]}},{type:"Feature",id:"4502",properties:{name:"柳州市",cp:[109.3799,24.9774],childNum:7},geometry:{type:"Polygon",coordinates:["@@ƒwU™„aV@nVaUVklmkUUmmIkƒ@w„aVƒm@™U@VKUkVUkWV@™ƒ¥@w™™KVwUalw@aUUUWWXI@mVIm@Ua@wVKUKV_UƒV@U¥VK„n„al@„Uš@VU@V„V@aVUnVVIVmUUlan@VbXwWƒX@Va@IlVVƒn@VanVVb„lJXIVJlUXL@U@KmUnÑWakU@mkƒJUI@mk™@wUmmUV@JXaWIXWmaUIƒJƒkk@W„nJ@„ƒaUak@›kkJ@kUKU_ƒ@myUóWUkm¥kUmL@KUKm@k_UmVa@ƒk@@UmU@mm_—JWIUVUŽWLUlbVUJÇVUIVwƒKUVk@mU@n@lUL@Km@@l@L™VƒzJmUU¤m@UbV²U`U@@¼Vn@x@Vš@@VnUVx@blbXIVxU@Wl@@L™aW@kxƒLXVWVk@@U@VmLVŽ„L„bUVULVV‚lnLVxkV@nWV@bnKVVk@VL„VšÈVKšVVk„Unb@lm@@LVxUlVX@Vk„ƒJ@wkIÇ@kl@blVVVšzXllLUxlV@x@„UV@nƒ‚U@UImmUIUV™¯mVk@@V@VƒamnUKkm@@VƒIUJUaUUWLk@UJUI@xV@V„VWVnxƒLUômVV„@VkVVVUnV@UVkL@VVV@bVxla@bkXVJVn„`nU@bƒb@bVL@VnJ@„l@šV„aU@@_lW@UUU@Unƒlll@XLl@@UX@°bVWVanLlknVV@VVX@VVƒnUŽVLmbXJ@nllXX@`VXƒlmaXVWk@Wkƒw—J@„VL@J‚bnU@bn@@bVKUnVJVIVVVL²a@bV@@Vl@nUVakalmš„UL@VUL@V‚a@mXl@nK@UlK„L@Vl@@nkllb@š„Vnn@‚šnV„™V°l„šVInwlKXxlU°Žn@@ƒ‚I@UnVlakUJWkUK@anUWK@_ÞJ@U"],encodeOffsets:[[112399,26500]]}},{type:"Feature",id:"4514",properties:{name:"崇左市",cp:[107.3364,22.4725],childNum:7},geometry:{type:"Polygon",coordinates:["@@@JVzšl@V@Xn@ll@VlnX@@VWLnŽUVmUULVlUV@blnUlnXVV„K‚xnLlb@lnbU@Vn°KVV„I@WXUlI°VXb‚VVbnLVan@‚x„J@_nJ„a@wVwV@@a@IU@UU@WKXwWIXKmKUa„a@U‚UUUk@@Umm„albVUXVVKnL‚a@knƒWƒXImanÝV@„V‚LUx²blKl™nLVbklWbn@JÆIXJ‚IVaœ™ÆKlw²@lUnWWnK„UUK@k@mmU@mnUVaVU„b@lVXVXIWƒƒK@Lam@@KUwnƒWkkmVIV@Xal@@KV@VUnI@›„_UWWUkam@kkm@ka@mƒk@wkJWIUU@WXkW™XkWWLUUƒ@UakLƒW™XV±VIVWUU@anUWaUK@IU@Vak@@UUKWaƒ@m@ak@@wUkla@mUaUklakwVƒ¯¯@WWUkLkKmaƒ™kLUnV`UxWX@Jkn@bmlƒakkk@ƒb@l¯bm„ƒbJ›b@VXn„bVV@„ƒbƒJUkkKWVU@mœÛVUUW@UVUJWXkVkKmUL@WW@U„Vl@XXKW„XJ@XVlmbUxnnm@UlVnV@XVm¦VJb@šmLkKÇbXblVkn@l@bWnX`V@@IVV@ŽV„V°n@@_naÆVVbUVVbUJnzlVUl‚XkV@Vlx@X„VnxƒbƒKUK@b¯VVUV™L"],encodeOffsets:[[109227,23440]]}},{type:"Feature",id:"4513",properties:{name:"来宾市",cp:[109.7095,23.8403],childNum:6},geometry:{type:"Polygon",coordinates:["@@nVlw„@VJU„„IVVUšV°lU²V@„l¤Ub@bUV@b‚@„b@bUblšVa„KnLla@UnUWmXlJXUlKV@V_U±Van@V£nV‚I„yšU@K@kn@@LVK@k@mnVl@VU„LUxVJÈUVIU‚aVkXKVVUXJ˜In`@nnV@Vl@@„UbVnl`n@VL@LnKlVn¦VlôXV‚nz„@V`VL@llIœll@Vb„b@ƒmIXƒl@„l„IVJnbWXXJWb@IU‚nVVn@xlš@nVJ„I@W„U°LUaVUUaVJVIwlKUalKnb@UnLVWU_@KVK@_šKVa„@VKU¯VLVKn@la„aUkU@maVU„J@k™@Um@XmbkyVaUIUU@KV@laVn@KXKWUkUk@ƒaW™UUVw@aXKmƒVaUUkšmIƒlUU@wUa™xUmmU™¯™U@WƒLUmVIUym@UVmUa@wmw@çm@aWLU„™JUIUamKmL@™aƒx¯¥ƒkU¥U@±„k„UVmKU_mJUbkKm„ƒLÅǙ_@WWUXUmaVUkK™„UWW@nVxkUƒxmL@KkKmbUI@KƒLkƃbUbW@UbUJUXV`UnU¦mŽVVkxVLUL@llL@b@bkKVb@bU`m@knmaL@a›@@U—WVUƒU@amK@akkk@@b@lm„VL@VUVUbƒVVXUJUU@V@XV`lLUVVV@nnLƒJVbVlzUVVbVVnUVVU„"],encodeOffsets:[[111083,24599]]}},{type:"Feature",id:"4509",properties:{name:"玉林市",cp:[110.2148,22.3792],childNum:6},geometry:{type:"Polygon",coordinates:["@@VJUXVVXlWX@V™xVnX@@`ššULWŽUXÅbWK@mULUUmJ@n¯b@l@VULVx„x‚XU`VXXJVI„V@nm`@nUŽVXn@lWVn@b@Jn@nU@Lm`@Xn@WJƒ¦U@@VnL„lV@@Xl`nIlJnkVL„w@KVK@UšaVL@bVKX™lUUKVK@I„VšL„a@U@WšLUlVL@bU@@blb@VlbUxVbXUVJ@xVL„U„lV@VU„bVLnKl„XJ@L‚b@an@VanL@`VLšKV_UWl@U_„a@WVInlVUUUVm@I@W@wVakIWm@U@ƒXwlaVbnI@ƒm»Va@aXaVLšU„»@aVa@k™KkL@KmU@WƒzUK@wU@VWUUVUUKUa@mKmbUK@_nWVaUkVaUaVUVLXKVƒVUVmVI@UkKkLm`UkW@UwWW_„UaU@WakXmK@xUXƒJkƒUUWUk@Wl—mJ@km@@aUKzmyVk„a@kkWVUU¯lmU@@w‚kkmV@Vk@mÅIƒ‚Ukƒaƒ@Ub@m@UUU`mUbWaWmb™X™XKWIXUWm@љ@y@UkIUJUUWLUWƒL@UkVUxW@kaWbKWnXxW¦n„m`XLVlUbVbUx™I@JmLUKUb@VW@@bkL@b@VlU@xkš@L@lƒxXxWXX°V@VVVbUVV@UVVbULVnVJUb²b‚aUb@VVVVInlV@VnXaVUšlI„VUb"],encodeOffsets:[[112478,22872]]}},{type:"Feature",id:"4504",properties:{name:"梧州市",cp:[110.9949,23.5052],childNum:6},geometry:{type:"Polygon",coordinates:["@@VbXblVlLXWln„wVV@VV@UnšWUXVbš‚@VWXa@kVK„UaVaVkšUlyX@Vaƒ—VmUwUaVU@UÈymI@aU°@š™nWV@VaVaw@IV@VmnLVK@kmmna@™„™VbVI@aV@XbW`U„„LUVVx„@VbUV@bl@VLXblJn¦lL„°°@n™@K@UlLnK„a°LWbnJ„¦UÒV„UllLlVnKnbWnn„V`„w‚@@Xa±™n™l@XKV_„WVkVa@kVyUa@wU£UW@UIVW‚@@a—wWaX_WKkVmUULmak@UJUI@±m»™—k@m»VyUIm™nmmwnkUmVaVIUn_mW@»Vk„@VwkmmUXa@IƒaVm—mƒ@Wm_U@mIUWóLmUk@laXmmkUK@UmKULUUmWULƒ@VakU™@Ub@bƒ¼™VUKWb@bUbn¼@„mJUakbWx@„@VXnlJUb@x@X@JUnVVUVmkUJ@XƒbV`k@VXU`™LUK@_mKUbm@@b@„U`@nlV@b„UnbVbn@@`VbUbVV¯bm@@mJXb@bVnUllVXUlbUl@LU¦VVmŽkLVb@b™l@V@XlK@V@nUJUz„°mށwmLmlXbWVU@UUUlƒIU@VVmV@@¦‚bXbWxX„WlXVWL@LUmkbU@@LVVVJUblzna@WVnš@@lƒIUVnbV@Vlƒbkbm@ULUKV°ULƒ@"],encodeOffsets:[[112973,24863]]}},{type:"Feature",id:"4511",properties:{name:"贺州市",cp:[111.3135,24.4006],childNum:4},geometry:{type:"Polygon",coordinates:["@@nL@xn@lKVkšwn@„alLlaXV@„lx„bVWV@aUa@aUk@mVUnVl„XL@JV@VxVIVƒX@„b@bl@@`ÇnXVlI@l„xUnlVVLkllV„@nmJUxnzWJ@VXLlŽšLVxnL@l„LlŽVI@V@lUnl¤Uz™Kš@„Vl@š„L‚l„Lnš‚b@VnVVU@k„a‚Knxn@VkVJ@ńUlakmWIUaVanm@_UK@UVWUa@klXam™U@Vmƒ™VIXW„@lUVknVlKVLXŽVXšW@b@VlšnnVL@KXL‚Kn@lb@UnW°@Va„X„WVb°aVa@I¯aUkUaVKVwƒaXk@a„a‚™@wkm@alanUVw@alK@Umkw@UƒaUmU@WXUaUK@UW@UaVWI@¥Xa@w@WWšVƒXwƒU@mKUXUWVU@a¯kl@akU@UULmK¯VUVW@U_m`U@@xVbUz@lUbUlƒXU`WLk@mš²šWb@ށ@ƒxU_mƒXmmamLkUkKVkUƒVу¥mIXa¯KƒbmLkK@V@Lmš¯@ƒ¯kKm¥kIWaUKk@@aVUUaƒ@UwVUƒKVƒX_WaU@@bUJUaƒš@šmbnn@lULmKUnU@@J‚xUbUbU@mX™š¯@VŽ@bnJÇz@VUVVbVxUn„˜UbW@kz™VUlUbVbƒŽUL@lWb"],encodeOffsets:[[113220,24947]]}},{type:"Feature",id:"4507",properties:{name:"钦州市",cp:[109.0283,22.0935],childNum:3},geometry:{type:"Polygon",coordinates:["@@@IlVVlnL‚@œxla„al@n„VLlx@x@bXnV@@`mXX`lbnaVL@blV@b„wnx‚I@xXJ°nK‚l„š@lbnKnblUVanKVb„@lUnJVI„VUb@V‚U@m„L@Ul@Xw„llVVXV@lVnlVn„l@XVlK„@@_VWVxX@lb„U„nV@@JlbnIlmnVV@UwVK@U@k°a@mnIVVVK@nXLÆaVWXVK™™@_W@Umšw@UXWWkUUVWUIVaƒUkJ™UVWbUmU@mkUJUU@UVab±aVaUIUmVKUaVUU@VUUaUUU@W¯XWWw„w@k@Kl™@wkV@U@alK@aX@@UmIUWUIƒ@mmkXU`U_WJUnUJmUk@@amLU@UVW@UkU@@VƒbUWVUk@@wmKkUWLUWX@JmIƒlUkkKWKkLWU@UKWa@bU@@a@_UKWƒUUUmJmw@nV_@ġğKóLmbU¼VÆ@xUXƒ@Um@wklVnUn›lkaUV@„lV²WVklWXXbWlkVkIm`UUƒLƒUU@UWƒx@XU@@lWLU@kbUbV`UXllUV@bmb@LnKVbULm‚šnVVIV`X@"],encodeOffsets:[[110881,22742]]}},{type:"Feature",id:"4508",properties:{name:"贵港市",cp:[109.9402,23.3459],childNum:3},geometry:{type:"Polygon",coordinates:["@@n@VzUJ‚nVŽ„K@XšVš°nVVnšwVb@xVV„knJl™VVUbn„WL@bUxVVXš„bl@lVXkWƒXwWaa@¥‚@nUUUV@„JVkVVV@XUWanknK‚xnƒ¯VyVI@m@UkL@W@Ušk@aUalKnUUV¥@KVkkaWVkUVkUm@aWanI@n@°aUUVaUa@_m@UamaƒV@akU@mV_@ƒa@KWIkƒmLUKƒaUVU@ƒkƒVUK@wUIWVUaVwka@Uka@aV@@aUKVk™K@X@Vƒb™KƒU@JULVLkVWšUL@aUK™b@VUL@LƒxUKmlkImJk_@WU@ƒkmK@UV@„¥XIm@@Wn_@KmVm@@I@aUmkXm@UWV@mn_@mƒUUJWIUWV_WƒwU@mUknVVmxU@@VUV@zU@UVW@ƒK@šX@VLUVƒKƒz@J@VnX@`±bUXVƒ¼™lšn@xmxÝL@‚Ubn°@XWVUxUVVnkbWVXV@Xš`ÆÈ„KnƒlLVanIV`nLVUlƒ²ƒV@V¦„l°¦„w‚b@šnKnLVbVJšIVƒXK@b‚n@ènx@xVbUnV‚"],encodeOffsets:[[112568,24255]]}},{type:"Feature",id:"4506",properties:{name:"防城港市",cp:[108.0505,21.9287],childNum:3},geometry:{type:"Polygon",coordinates:["@@XV@X°°U„lxkbVlVb@nkbVl@xl@@b@n„‚XbVL@Vl@UbV@@JVLXbmV@bVVUXUJU²šW„XlKVb„@VVXKlXšWlXXWV@VXJlI@x„l@nlbn@lln@lbXalIVK@ƒVwœUVb‚U@aXylUX@@aW@U_UJmU™nVKUamL@Kna@aVUkkVWU_ValaV@XK@kV@@W„wVXV@„V„KVVn_lJlUXkWaXWlkXU‚±kU@ƒVUlbœkVmUmlk™¯Ý™™W@mb@¦VxULm™kJUU@ma¯wƒmkX@VóJ±bUVUXÝWk™lWXXlƒxUaƒbƒIğ™Ç@U@mVUKkkm@UJm@XnWV@x"],encodeOffsets:[[110070,22174]]}},{type:"Feature",id:"4505",properties:{name:"北海市",cp:[109.314,21.6211],childNum:2},geometry:{type:"Polygon",coordinates:["@@VaVLnK@IšJVwUaVaUkWKn_mƒX¥WwXm‚LXalbU£UyV„Å@ݙwm@™°l›LÅUƒmk™mwÛaƑLÝUUm@ȣƃV_„Ó@£UƒƒUVƒ„™¼U°W̄™ÞVbXbôx@b@bmV@ǃ™UÝ@@ĢU`m@ŽnxnIVV‚VX„VL@`@bV@@aXbVL‚@XVlKXLlLVl„knJ@I‚WVXXKlVnL@xl@UVVX„a@UV@VlX@VUV@nK@bl@nVVIVmXIV`V_lWnn„@VJVXnJ"],encodeOffsets:[[112242,22444]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/gui_zhou_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"5203",properties:{name:"遵义市",cp:[106.908,28.1744],childNum:14},geometry:{type:"MultiPolygon",coordinates:[["@@@UnUlJn„w‚JU°VL@bnVšU„wlJ@XƒŽXVlU@klVUJknl„UllL@bUJ@xULUlƒ„UblVkblbnw‚UXmla@„wV@VK@L@UXaVKVLXWƒUVa@U@Im@@W@£UKUakKWIXU@al@@llUnL@W@Un@@VlUV@VIUanKl@Xb@lmxVb@b°bb@nlJVVnnJ@b@L‚V@ln„@LmV@Vx@blnVK„nlJXIlw„J@҄b@nlK@Un@UL@VVVVUUUVK„l„@VUVL„J@UVUUw„@Wm@™„UV„ÈVlbUb@JšLlŽX@@x„„ƒLmŽk@@nlx@bUJUzVJ„@@LVxUV@bWxnLnVVK@_‚K²xVbV@n¥@aVI@b„@l@Va„Knb@n‚`n„mmý„W@ƒU_šwV@VlVV@Vn@n„˜@nI@Jn@°¦VaUU@™„mVVWVaUńU@aVKnƒVbVUmmU@a@kUw™m@aUUmUUJ¯lakU‚aXaWUUaVƒkk„amkmUnVlULƒVlJ@XU@UJWUUw„k@aU@WbkWƒL@U@WU@@XUKmV@aUVwUĕUJUamUUVUÑm™nIVJ@kl@XalJVn@KVLœ¥@UWIXWmU@mVUKnUWLUKUaWUUKVU@U@anUny@UlUkK@w@a@aVUƒ»UkVw@Wmk—JƒÅmUUVmwXalLXWWUnam@XkƒJ@UVU@U@W„@@U@I@Wl@Ènlw@KXLWb„lVUkalKUU„VVaV@@wnIlaUmkUƒKWU@KkUkLWaƒKUUWUn@VƒK@LnnWJUIƒVkUWVnV@V™@@XƒK@VUIUJ@IWJkX@VVJ™IƒVkK@I@UVaUWk@m„@wnUWKk@mxk@@„lV@b„xmb@x@VUmLkUƒJ@nVV@b@VkLVbU`¯I›l@™U_UW@UU@™™ƒK¯wm@™xƒL¯¥kIƒ™ƒ‚@bkbƒ@Ua@ƒm@kkW@XVbmV@ŽkV@bWbUbV@„¦ƒxXlmVk@ƒ¦™bkaWL@KUImK@wUK@VUI™b@bmK@LÅy@akXW@kbWlXblL@ŽULUbƒ`@U™kUymX¯@mšUJUUJƒL@Lm@@WX@lU„VlšXll„@l@Èk°V°Ž„X@VU@UVll@XUJVXUVm@@VXLWlnV@Xƒšk@mVULnxV@@bm‚kL@VWLUbU@UVm@ƒb@ķ¥UnmJ@UUVƒkkJUšlÔU`UIW@ƒ°kLUlUI@WVI™U@mWKkXk@ƒ‚WU@bXšW„@J@xX@l@LVl@xšLVxXX@x‚KnxVknb‚KVV@U„L„WlXU`@nUlšX@llVXšVU„KlkUKlI@anKVLXKVaUIVWV_VK@VnLlU„»VKVL„m"],["@@@KlKkUUVVX"]], +encodeOffsets:[[[108799,29239]],[[110532,27822]]]}},{type:"Feature",id:"5226",properties:{name:"黔东南苗族侗族自治州",cp:[108.4241,26.4166],childNum:17},geometry:{type:"MultiPolygon",coordinates:[["@@VV@XkV@bUbWJU¼Vb@Vnb@bš„@J@bƒL@LV@UVƒlUI@a™KULVb@bkJmx„šlLVxknVJk„‚xnKmnnL@bn`WIXlWLU@UxVbUVmKV„XI@JVIVJ@U„L@Wš@@UmUXUlV„UVJXImm@K„L@UVmVXV‚„LXblKlV@LXV„LlVVnkbmJ@xnXl@šbXa‚@Vana„ÒšL„m‚VnIl‚Þ¦°k@b„@@lV„nJlUnš‚VX_„@lVlK„šV„UUxVLVWVIXJšUlnnWlI@KUaUUVKn@VaVXV@na@ƒmw¯@mUkJUamI@lk@@am@@I„ƒUmVImUUw˜™@anUVaUU@LU@WaWUXWW„wV@VwnU@L@ynbl@@X@a„J@nW@@Vn@„lVLlxnI„lš@@UWKUƒnIlJXIVllIVVš¼XK@aVI„V‚@@bn@VKXLVKVVVInw„J@UWI@mX@WKnI@KmU„UVJUL@V„KW@@k„@aU@@W@InJWUXwWI@Wƒ@¯wkaVaUIl@nŽValIXWWI@UUm@anwWkXWWIUbk@UJmIUamKVUUUVVama¯VkIVVUlKnXVwX@@WVaUUVa@IlƒaVmƒkna›wk™UU@ƒU@mUVƒšUVwœl°LVbnJVU™¯la@mX@@UWKXU@aV_V@@JlkUƒ¯@V™nK@km¯k„U@ƒWUW@mmƒU@™kmlU@wkL@WƒUkL@VmLƒJ@b@V@bknUUVK@UVKUK@Uk@Wa@LUVVnUbmVk@@UU@@aƒV¯K@U@UU@WmUL@aU@WV—w@ƒ˜I„xXll@UX‚K@KXXVJna@wWaƒ£naUKV„m@UU@mUmalm@@XkVm@U@VƒLmWU@kkWxU@@bVV@VkXVlƒVƒ@UUk@@ƒmI@KUw„m@UmVƒUUwU@lwkV@IUa@mUaVIVKVa@w@U@™UJkb@n@bmJ@XmlVUxWXkJmUkUUVW™xUlU@ƒaULUšmbU@@‚WXkmƒL@xUV@nUxÇm@„XLWbnlƒnV‚nnUV˜U‚nVVz„@lbUVVlULVb@V@nUJkwm@Ux@bWbUK@UULka›JbƒU™U@U@lUK@XUJmn™J@bU@UwWa™x@zkJWnUJUUVšVV@bXn@xVb@J™L™m@X™w@`@bkb@VmXUV¯L@mW@@n@V@‚ƒL@K—IW@@aƒaUx¯@U„m@XbW@@L„V@bnVWVkKUzlV@bÆa@lnI@VV@@LnVVKUaV_VJVbnU@bn@‚‚nX@yVIVxXKVLlUVaXU°J","@@@KlKkUUVVX"],["@@UUVUkUmV@ln@VXVK@K"]],encodeOffsets:[[[110318,27214],[110532,27822]],[[112219,27394]]]}},{type:"Feature",id:"5224",properties:{name:"毕节地区",cp:[105.1611,27.0648],childNum:8},geometry:{type:"Polygon",coordinates:["@@UkVƒ@k‚W@Xn@@K„KVIVVIn™°@nWVzšl@V„_VaVK@kKWaXklaX@lW@bÆz@KnL@ašaVJ@UVL@xnLVJ@LXKlbša„¥l@nUWk„wƒ¥U@VaXa@amLkUƒKmƒ¯kƒmkIUaƒKUIWƒkKm@anw@mlwXIƒmƒUk¯@a@amUƒ`kkKWVkxmUUak_mJmw@w„mXUW¯X›_@WnI@aVwkWWýŃU@WLkU™aUbVV@lUVVnm@kUmV¯™kK™LƒwmVUUaWV™aaWw¯wƒÈ@VULUVUUƒK@nWJkI™l@Umxnbm@kbUJƒa¯bUbVxmLUV™aU@VUUWxkVVV@bUV@XWbnlUbƒbUJlbUV¯b@z„`WbXnmbƒaƒwUwVWUƒbUxmbU@Uam™@Vƒk™VaƒwVaUƒWI@mUKóz@lUlÅ@WIƒb@xXxml@XklULWKUmwUa¯KUXWJkaULmKkLWbkKUVƒImƒƒWa@kUaULƒW¯LƒK¯@kbƒL@b™x@J@bmnnlUšlzU`U@@Uƒb@„m‚n¦°bU„Vx@bkVm¼mx@mk™mVV@bkxVn„aVV@bU@mL@b²`lIVV@lXLlš„bVxn@@bl@XllIVšnbVšn°°wlbXw@mVa°lVnU@mš™VLVbn@@b„@@WVnUV@Xlxn`VznJVb@L@bV`V@šUnwšU„@WUXKV@UUlmUUlaXalLšm„bšIVbnJVIlVVaUUnWVXn‚VL‚k@ƒnWnblnlb²x„xVKVXlVXLVW„LlUVJna@wVL„¼@JVX@`@nnx@nWJU@Vx@XXKšŽUblxUš°„LVKVVlL@KnbVUnJ„IlUšƒnKl£VW„x„IlJ@nšVÞUVVnb‚VX@V_°lnK","@@@UmWUwkU@Um@@VkL@V@„„‚V„VkV@nbVa@ƒ"],encodeOffsets:[[108552,28412],[107213,27445]]}},{type:"Feature",id:"5227",properties:{name:"黔南布依族苗族自治州",cp:[107.2485,25.8398],childNum:12},geometry:{type:"Polygon",coordinates:["@@‚V@IöalK@UV@@KUaVIVVœLlaVbVWnX@‚@LnUlxl@naVLXVVaVU„J@lUUanWWI„@VlV@Xbƒb@V„n@VmVVbk@kU@V›V@X„J@zn`ULW@kK@_WVUK@LUb@Jlxn@nnWlU@@b„x@XVVU@UbVb‚@n`VI@VVLUlUIUV@KmL@VV@XIV@@lVLVmXV„@WLXLW@U`šnkb@Vl@UL@VVV„L„llX@`lIXb„J˜IXW„L‚aVL@ŽXXW‚Ģ™b@bmK@L@°@Vnxmxšn„K@xVn@VkL@V™Lƒakbl`VnnxVnUlššV@@VVXV`@šœk°JV_UalK@U@aUU@m„IlVnK‚V@U@wnaƒw@akU@ƒl@nwl@XLmV@xnƒl@VXUb@V@JlL„UšJUI@UlWUƒnLVUUaVwV@XKWkXJm_@amKnmmLwlƒUIlmUwkKƒ™nwlI@aUaVKšL@bVJ„kVUU@@K„K@a@I™ƒ@ama@UUaV»XIVa@alU@WUU¯IWVUbkVUKWLUwUJ@zmWm@@amVUaUIU`VbULmU@KU@@UmJ@kÅb@akUVylLXUmU@aƒU@KX@Wan@Vƒ°@Vw„b@bX@˜J@L„K@@U@mX@@n°KVUnW@Ula@a@_šx@WšnšK@IUa@wWm@aUUU™VVVIXmlI@yšwXbVxV@@ašInmVI@WVL@k@VšV„V‚aœIlbVK@VVLXa@aVwn@lxVI@m@UUaVKUkVUkaƒ@UymUV—VUmmU„mmkXaWK@ƒÈnVw@mVU@w„KlnXW@V@naV™VKUk@KVIUWƒ@mk@KXU@Um@@lVƒk@UVJna@UWaƒL@a@ƒXa@kmmVUUk@mkkƒamJ—ImJUUmIm±aUUkambkamVUU@VlbUbVVƒxX„WVUU@VUakU@UmUV‚U@mnUVVnUbVJ@b—UW¥kLVamVkUaWJU_UVWKk@@nl„UVVJUXm@Vm@UnVlmbnmJUbULU@@UUKWVIWxnJVb@xUL@bUJWIkxƒbkb@xVJƒbmU@kW±LkKUkVa@a¯am¥ULkalÑlKXUWƒXƒaVakImVƒ@ka@UUƒJ¯aƒX™mmb—KWU@wUUƒaUa™KmU@UXlWb—¼WLUKUb°„UlVbkbVL@VƒšƒJ@nVlUbUXmJ@VX@lbUbU@@bWb@VnLVJ@bVVUz„ŽVL@lnL@b™VVVULmKUk™Jkbm@ƒxVb@V—kƒKVnnV@b@ŽWXU‚„nV„l‚VVXVJUXlVXbWV@VU@Ubk@@KWbUUmL@JnXV°XJ@_‚`UbkXVVlÆkbƒ@VLXVV@‚V@k„KXX@`V@@n"],encodeOffsets:[[108912,26905]]}},{type:"Feature",id:"5222",properties:{name:"铜仁地区",cp:[108.6218,28.0096],childNum:10},geometry:{type:"Polygon",coordinates:["@@°a@aÈbVUlU@aVKnVV„VUlyX¹lWVa@U™VƒnUVU@m™@mUl@„mÞw„@‚xnIVbna@KVI‚J@kwV¥ƒUXÇVkVW@kkKWU@aXUWmnIVa°VXbmL@VVbnVVVUb™VbšJVbVKXkVKVanU@aWnWUWa@U™nk@mVIVK@wXxlLXbVJVlKœbl@VI@mšaXalVV„VbX@@ašalnkx@b@V‚b@Vnx@bVVUXn¤WXn@Vl@Vlzn@š`@I@KUU@ƒV£namVkXa@aVK‚nnU@anVlKƒa@UUU@amk@»kƒU¯@aš„VWnkWmkImU@akaVm@»VUV@UKnkW¯XWlkUKnIWaš@nmlIXmWUnwUwWm@wULmaUJkIUaƒaWa—klwkwmJmU@bkJ@XUJ¯W@XbWbUKUkWJUUVKnn@UmmXUWa@mU@@UI@WmXVykwm@kaULWwU@¯ƒlKUUVU@mU@UkmaUbmV@b—š‚xVnVUJVnƒ„@Jn@@bl@@knJVblInV°@nx@„mbU@UWUbm@ULVVVb@LkJmXkm™VWIUJUXUKVwƒV™UƒŽkLkUƒ@W`Um™kVmIUƒ@kƒ@@a¯lÝ¥kmJUƒn™KƒÑmbUb@Wb™ak@mWU@UbƒUVVkLlbUVƒkXaWK@LkxÇmk@@X@J@Vƒ@@X@VUV@V„IWln@mbXVWXkKWbnxVUnV„ƘInl@XUxVl„¼UV@b@b@xlLkV@VmzmV@b@VUVVLXVVbVLXKmVVLU‚@nnVWXXJ@V›¦UK@LUmkIWbk@@lUImJnšVÒVUnVVbVIVĖUxV‚@bnUVL@WV@@X@V„KlXXaV@@bƒlVxXVVIV@@WkI„UVKUkVmlnnŽƒbllU„VbXVWbblVkb°ŽVInVVV@bšnVx@l@bnVVnUŽUam„UL@bƒVVÆUbUXU‚ƒn@šVVUb"],encodeOffsets:[[110667,29785]]}},{type:"Feature",id:"5223",properties:{name:"黔西南布依族苗族自治州",cp:[105.5347,25.3949],childNum:8},geometry:{type:"Polygon",coordinates:["@@VL@Vl@@IXW@kVUVbnW@XlKVVnU„VlL@b„aVbƒb@xX‚°ÔUxV@kbm@VxkxWJœ„V¦ƒŽ@ÈnšVKšxWXJmV@n„Ò@xVbn@@blLk`VX@bššla²JVUlnn@U±lw@wnw@mlwVIX@@m@klKnk‚a„KnwmmXkƍVm„Uš¥l@nb°n@„aVwVmVIVnI@a„¯@mšU°ƒl@@VnI@JV@UV@b@IUbVJmXöºƒzllUbVa@aXUl@„U@llLnKVaUa@UmK@UšwV„bnKV@VwVK@UXƒV@Vbn@‚w@U„WnX‚@„a@m„I„™@UUKlaUaVk¯ƒVaVLXK˜»XaWk¯mƒkğwmW@mIƒVkwƒJUIšÇVwU™UkVKkƒm@UkmU@WÅwm£Vƒ„m¤¯IkJWa™_™lUbmJzÝJk„ƒUÇVU„ƒ‚@bU„Ýn™m¯LUb@`mL@VkL@VƒUmmk@UU±Umka@kUƒ@ķymUkk@mmkÝmUaUakImV@V@VÅLƒ¦ƒJUXmJXšWb@n°Æœx‚¼nV@LlbUŽUbmL¯@ÞbV¤nbVx@bUVlblIœ™@KVVUnVJUn@VlLUlmLUUUxmK@I@@VW@@bU@UJmUkLVVUl@b@V"],encodeOffsets:[[107157,25965]]}},{type:"Feature",id:"5202",properties:{name:"六盘水市",cp:[104.7546,26.0925],childNum:5},geometry:{type:"MultiPolygon",coordinates:[["@@ôyVL@nXJV„Ub„x‚bUŽlšU„@ŽšnŽVbV@naVw„a‚VUXVx„x„bnaWmXaƒ_@y°aVUkaVI„aVamkXa@WVU@aUUlUXwVV@UVšbVUnKUwVa°a„bVIlan@manw@VšklJXI@m„LVVVUVK@U„ǃk@KUa@UkaVU@UVWV_XWVXVWlLXKlLXaÆKšwVL@akKm@Uwƒ@@XUVk@VUI@wWK@aUV™I@UkK@ƒmL™Wƒ@kImJƒUÅVmkXUW@UJkx@nmx@xkxV²m@kmUV±Ikb™™@aUWl_kK@am@Ua@wƒÑ@mnUWIX™wULm™@DŽU¥›ƒXIlwUwn@laU@Vw¯ÓW@w„aUaƒb@akKƒUmVUUkL@WmXUaUV@lWX@Jk@@UUKULmLUJmzkKmVX°VšUnWKUL™ƒƒL@mU@UnVJ@b@„UV@Xƒ`m_@l@@bmbXJmnnš@°˜wnn@ŽVLX@V‚@nVl@nk@@b‚l@nn°WlXzW`XXVKnUlxVbUb@‚V„Xb@Ž‚VxÈbVlnbmn@ŽkVUL@„ƒŽmLUVVL"],["@@@ƒ@UmWUwkU@Um@@VkL@V@„„‚@„V@VkV@nbVa"]],encodeOffsets:[[[107089,27181]],[[107213,27479]]]}},{type:"Feature",id:"5204",properties:{name:"安顺市",cp:[105.9082,25.9882],childNum:6},geometry:{type:"Polygon",coordinates:["@@lL@bUK™xÅLWbkKWLkKUXUWWXU`UX@VUVlb@VVb@L„l°xXx‚bšbXUVb‚VnU„xšKlL°šnUlVn@UmVU@kUUVašblVXKV@ƄXþlXUxnU@mVK@_@ml@UU„@šblU@KnLVyUw„@@UmkšWVw@UVK@VXzVK@n„VVUUW@kVJnlaš@nKW™kaWL@U—™õb@JU@mU@@_WWƒL@lUU@WUUK„@lakÅUUlWVa_@`WIU¯mW@InKVVXa@Ll@VaV@@UXUWakUVWUIUW‚UkUƒƒmVXW@@amUUm„L˜l@UUa„wn@lašIVlnLVKUUšU@amK@kUKƒVyUU@aUImK@UXa@aV@VakaW@@UnIVWVaUkƒb@mWƒX@Vxm@UaU@W„@VULUxU@mLƒaUŽ™x@VnL@VVbUbmLkK@kƒVk@WV@bUbVakk„yõ¹nWUIVa@J@aVUU@@ImJ@Uk@¯„™V@nƒ°@bmJUUJUnUxƒbm@¯Žmak@™¦ƒVUnŎWlnnmxƒLbmlkL@l@nWVnlÆU„VnIlJ„@šXnK@„lL@VšJVU@bXL@xVJUl@VU@W„@Vxn@"],encodeOffsets:[[108237,26792]]}},{type:"Feature",id:"5201",properties:{name:"贵阳市",cp:[106.6992,26.7682],childNum:5},geometry:{type:"Polygon",coordinates:["@@nŽlLX„VJ„LVblJ„n°ln„„LlVnKlU@nUUa@WlX@l„n@‚Vb„@la@a„„šlJ°¦„Kšwn@°x„LVkUmmwUmk_la„bšK@UlK@UUm@wƒL™mnwmw@U@¯@KnL@aša‚ġXWW@UKbƒKWX—JƒIWakJ@_kWƒkƒKUU@UVKk@@Ula™mV_X@WKXKƒ@WUUnUK@kU@WJU@@UnK@LVUVJVkUK@UUJm_@UaVaV@UU@Wƒw@aV@Xkmmm@kw@IVa@KVLXU@`lLX@VKm_@yƒI@WœU@UlVl@UanU@Uƒm@U„aWaU@Ukƒ@XJmXVbkV@ŽƒIUVUbWUUKmbk@kwmV@K@mWUXUakb›KUUUJVb@LU@@VkL˜š@VXKlbXšmL™@kbm‚UI@lVXUVƒU@mULWy@UUL@VUx™Xnl@Vƒ@VxUzmK@LkV™aƒ@VVk@@n@`UL@nmV@bmJ@Xœ`WX°WVƒn@xnxnIl`VbnVlwXUlLl‚„_nV@b@bl°„V„nWJkx@nmx@b"],encodeOffsets:[[108945,27760]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/hai_nan_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"469003",properties:{name:"儋州市",cp:[109.3291,19.5653],childNum:1},geometry:{type:"Polygon",coordinates:["@@஼jpnr’``ŽpRVHʘ̤žZt^JÖA˜[†CâlTébQhRPOhMBcRSQiROE[FYdGNOEIH]MgEAMLLIAG_WMCSL@ED]PCLYC[ZIHgjSxJTMbHNEFCMEE_HSDFHSLECRNSFDRICHNADGPI\\RZGIJTIAHLDQOHG`GTNCOIC@eIGDWHIS[kiE[FMbECZS@KKS[FDWsCeRuU_DUQNOE[LKGUBM¨EDQP@HWHGDImXƒCog_~‹I_fGDG|QDUWKBC\\ore|}[KLsISBHVXHCN`lNdQLOnFJSXcUEJMCKSHOUMDIm_‹DI`kNDIGEYFM\\YPEEIPMSGLIKOVAU_EBGQ@CIk`WGGDUM_XcIOLCJphHT_NCISG_R@V]\\OjSGAQSAKF]@q^mGFKSW^cQUC[]T}SGD@^_ˆaRUTO@OHATŸ”"],encodeOffsets:[[111506,20018]]}},{type:"Feature",id:"469005",properties:{name:"文昌市",cp:[110.8905,19.7823],childNum:1},geometry:{type:"Polygon",coordinates:["@@€hIJ¤Ī¯LQDaFßL[VQìw€G‚F~Z^Ab[€¹ZYöpFº lN®D´INQQk]U‘[GSU©S_­c‹}aoSiA£cŁ¡©EiQeU­qWoESKSSOmwŸćõWkàmJMAAMMCWHGoM]gA[FGZLZCTURFNBncVOXCdGB@TSbk\\gDOKMNKWQHIvXDJ\\VDTXPERHJMFNj@OwX@LOTGzL^GHN^@RPHPE^KTDhhtBjZL[Pg@MNGLEdHV[HbRb@JHEV_NKLBRTPZhERHJcH^HDRlZJOPGdDJPOpXTETaV[GOZXTARQTRLBLWDa^QAF`ENUPBP…\\Eji`yºEvåà"],encodeOffsets:[[113115,20665]]}},{type:"Feature",id:"469033",properties:{name:"乐东黎族自治县",cp:[109.0283,18.6301],childNum:1},geometry:{type:"Polygon",coordinates:["@@ªVLP`@PEdNRAHOPEAKHEVL`GZBJfvdTAXNNTZJFPrHHNpKTD\\ILHbEVd^J‚OHLh@NNBnHP`\\xH@NBRLJTlŽNv_^CTLd@bNDVFbxdFV€UPBTKOGEOUO@OEBXQP[H_EI\\EbeYa@UO_J‹MEJ_IEDKJUGMDcNUd_FMTEJSGoZ]EIYGO[YW‘gEQ]a@WHEDQKUSDUGAbYBUpSCYNiWqOSQEoF[UcQISWWNMSDe_cLQ_UBiKQOOASQAWgS­ā]ZaŽSPÝZ]XMXSŒ[^oVËNgNKlE RôEø"],encodeOffsets:[[111263,19164]]}},{type:"Feature",id:"4602",properties:{name:"三亚市",cp:[109.3716,18.3698],childNum:1},geometry:{type:"Polygon",coordinates:["@@®ĂhTBXTRPBRPjLVAR`dKf`TC‚NXMTXRJVdE\\FpTRrPjXZMTDVoZABaVHTCLVCRGF@X^bFR’hZXP\\ZHHMA[^wBWXJlW¤EJ[bCTOF‹WWMm@ILMGWQ@DQ^QNWFSHEbF`OXNbO„VNKTEPDTLTCCVTREfvfEHNbRAENH^RJXCFHNFRpVGHWISDOTMVCZeGamaLoLÛD¹¹ėgsia{OųE—Tt‰lɂwr}jŸR±E{L}j]HąKÃT[P"],encodeOffsets:[[111547,18737]]}},{type:"Feature",id:"469036",properties:{name:"琼中黎族苗族自治县",cp:[109.8413,19.0736],childNum:1},geometry:{type:"Polygon",coordinates:["@@bRFnHNbHŒgN@NPEnbXP@bND`NT\\@\\QZb@`@J]V@XhžDpW„nCJGHGXO@CR§FANHVKLF\\MPVR`CvVfQtDPKpGHG@S`WJP~^dSTHWX\\RHTFACQTIAUPOU@MG__IaYSFQK‘NSbORHXCZeTFJg„B`YBMNMFi~IVDV[tGJWXGDQRGF]ˆJrALgESLSAYDGIaFeXQLS\\MKSLSQYJY}eKO[EHiGSaK[Yw[bmdURgEK^_kcSGEOHKIAS]aFSU@Y]IWFUTYlkP_CUOUEkmYbSQK@EMWUuAU\\M@EpK^_ZMDQ^OXwC_ZODBrERURGVVZ\\DTXcFWNIAWJWAYUUFYEWLQQaCIZeDM`cLKRGpanJZQd"],encodeOffsets:[[112153,19488]]}},{type:"Feature",id:"469007",properties:{name:"东方市",cp:[108.8498,19.0414],childNum:1},geometry:{type:"Polygon",coordinates:["@@ºŸx‹JYZQ”IŠYXLl@dR\\WZEn]bA\\S~F`KXaDeTiNO^EEKWEDQXITBXaWaDQMUJOIaTWf@NJV@dSxGZ‰Fu_@WMKAUˆ}AQ@MwG_[GOAmMMg@GKP]IUcaFKG[JSCoLGMqGEOYIMSWMSBucIeYA_HUKGFBLOFGPQBcMOF_@KO©UAtERadwZQ\\@ÊJÒgòUĪRlR°KĮVŽLJ"],encodeOffsets:[[111208,19833]]}},{type:"Feature",id:"4601",properties:{name:"海口市",cp:[110.3893,19.8516],childNum:1},geometry:{type:"Polygon",coordinates:["@@ńZƂt̬æßFuz¹j_Fi†[AOVOFME_RBb]XCAKQKRSBQWSPY\\HbUFSWSPoIOcCOHIPkYCQ]GdGGIFQYgSOAQLK`MFUIGa@aQ\\GGUFcHKNMh@\\OYKAigsCgLSF]GOQO]@GM]HyKSHKPW@Pxi@EMINYREXWRQ@MQcFGWIAwXGRH\\yDI`KJIdOCGRNPNtd\\UTMbQYi@]JeYOWaL[EcICMUJqWGDNZEXGJWFEXNbZRELFV]XQbAZFrYVUBCLNFCHmJaMIDDHXHEhQNXZ_TARFHVB@DTQIRR@YHAJVnAbKFUEMLd\\c^ÍÞ"],encodeOffsets:[[112711,20572]]}},{type:"Feature",id:"469006",properties:{name:"万宁市",cp:[110.3137,18.8388],childNum:1},geometry:{type:"Polygon",coordinates:["@@^J@ZTVbET^JBGLFPTHld]`FLQhcVanx\\\\ZbLHTGj\\FLP~fIZRZPVTQFSVAFJE^NDLEE[~LjsxVTG\\NZZNGlLRRGLJTV@hPZANN^@T\\NEPPbDZXO`d^HSvcJDIV\\XZAJUFCLNP@PQ¤@[ïKLÑIÏ]ÇE±I{uƒ­YśUćFcYUmsVeBSVgB[RO@aYYPO^]@UVaNeDShMLG\\EfFVE\\F`"],encodeOffsets:[[112657,19182]]}},{type:"Feature",id:"469027",properties:{name:"澄迈县",cp:[109.9937,19.7314],childNum:1},geometry:{type:"Polygon",coordinates:["@@T\\GJCXJH@fJDDPNCNJENN^NLHBNSx@DDYbBLLDRbjZTj@`XXTlG^Xr@PJLW\\WLTlWR@HDJTD@X_PO@STMDNTMVV@NLDM`M\\XM\\JNBH[PYZ‡úYzŸ`Ċ\\ÎÝd]c[NKVFLEBaUmBIZGQ@JQSR@CUAEGBQ`SWYRMFgWGCGJCbNnIDGMEDKVAZUEqBYRa^WEUFKYQMaFWXEHIFWMYHCrXVIIiaK@aMCUYNSIISTwXALKH@XWXIEIJQCG[IEQDE_XSBaa[AIPW@]RS[FWS[CD]PEBYNGFSaSyJG]@ugEUDQlGHiBKHUIoNSKqHFaPMICK]UUHIPDJMuCA[SCPIDIOILGAEmU[POPBVSJDREBGS[QXWSGcT}]IO_X@TGHoHOLCX\\ELT@LYTD‚aFENF\\lj"],encodeOffsets:[[112385,19987]]}},{type:"Feature",id:"469030",properties:{name:"白沙黎族自治县",cp:[109.3703,19.211],childNum:1},geometry:{type:"Polygon",coordinates:["@@D\\RV]dTXELnHr]^@LETBBRTHPi^[@U`QTHDJ`MGSogDIPKdJ`WVNHCXHl_DJR@AH`FBVPUJLHKNTJOFFZON[ZEHFCJlMJ_ŒCn`CJVNGPLTNDFIdVTWEIPmRKMc_kDMWGGUTAtJLK~\\f{pqD[LAVXRCH{HC`eŒJ`}@W^U@I@_Ya[R[@MSC_aMO@aWFmMOM@‹haGGMEmaQ[@MESHaIQJQ……MckBIw[AOSKKAMPSDSLOAV_@@`KJRbKRDfMdHZERgAWVsDMTUHqOUr@VQXTT@Tƒfg‚L^NH\\@heTCZaESNObHPƒHeZF\\X^ElM^F^"],encodeOffsets:[[111665,19890]]}},{type:"Feature",id:"469002",properties:{name:"琼海市",cp:[110.4208,19.224],childNum:1},geometry:{type:"Polygon",coordinates:["@@TP\\pATHTGlZDJGAQjE\\Rb@jVBDCN`JZ[NCNHNXbULPrP\\KNbMTLjJJRFP`“pNLZz^FLRHjVPZ@hxVKbHBHMNNJFRlLzGPnNHhIrHHADcPWdUAmEMVQDSKYHY\\EhBN^HpXGNDBNNBnIß‹Å_g{³So]ã@ORO@KMEDIVYB[WJUICudGTc]P_YWaCOOMFS[]@MMYBgOU@ISHKQQkKMHYY[MSHwUit}KF\\KFMCF]EIUBETSROUKTLT[NKTWREfJbCHBZKTFTKh"],encodeOffsets:[[112763,19595]]}},{type:"Feature",id:"469031",properties:{name:"昌江黎族自治县",cp:[109.0407,19.2137],childNum:1},geometry:{type:"Polygon",coordinates:["@@`ZĤd–`òüˆ˜ “BSPGP@VSbQ`‡@]HC~T^SE]N]FkW]E[fY„GGOPaTMbFDYfS@g[MGK]h„e@SSSRW@UVqrPVGNStCXUhBFQGYNcCeLQQaLI@_`@EUwcEaCUaMc@SK]Du`MSkKI‡~BVNL@X`‚EvYŠwHcTU@MIe@SXJbIPNVCRXbWbSAWJCRXFFL]FMPSjCfWb_L}E[TaBm^YF[XcQk@WK‰Z“JYRIZwŒ¹ "],encodeOffsets:[[111208,19833]]}},{type:"Feature",id:"469028",properties:{name:"临高县",cp:[109.6957,19.8063],childNum:1},geometry:{type:"Polygon",coordinates:["@@jD`hNd\\^dZädĒH´Op@ˆùZY\\OAGIMN[[W_NCNMKU@NUMSNCTSP@`O@WSCCI@GXQSkXKX[IK@OWqH]SkWW@_SiiYQaKCAKZaCCw@MTGAMKM]FMMIMDSM_HGHRPKCBGSJJIYH[QOJCHMBDGQJECMTDQKFGTCEGTF`NFEDMFaGSNwIiTGhYJD\\KZODC^@FTKND`XBHKJNKFBNhG^FJMPcHEZF\\QPRjQTAdgNOPgQaRSê"],encodeOffsets:[[112122,20431]]}},{type:"Feature",id:"469034",properties:{name:"陵水黎族自治县",cp:[109.9924,18.5415],childNum:1},geometry:{type:"Polygon",coordinates:["@@R]NC`YL]FoN@V[vBXVFNL@TRZalnVFVP`DlOZkVSXEE_F[EUFeH[NKTgfCbMVU^@P]ZObZP@\\QhATUfAtUasñiāEoI]eYǯ@aKmaeƒWuCºKÜKpnbHbYfUDSNCPJTRAHJTDJSfDNLHXC``VBNGTYCQDIXMDSP@xLNEFRNXBIpVNLXah@RgF@`qOML@LJNSPLbaHAh@Jdj"],encodeOffsets:[[112409,19261]]}},{type:"Feature",id:"469026",properties:{name:"屯昌县",cp:[110.0377,19.362],childNum:1},geometry:{type:"Polygon",coordinates:["@@\\OnVBFKHPJCJOJTDB\\vDINOCGJVVL^JDONEbrGTLpMVJLGjAHGRkVChF@vH^zIbTETMHAZOFC^\\DXT\\EffAP\\PdAV@UIYfS|S@YPICMeM@sC[_A]VQEwyHSMuNcAUlQJMVGMS@mVBZPFO\\CSFQK[LqDMACiUa@[QiFBRIHYCHkGSBS[oSOqB‡IE^QHCRWHIXsHU\\UC}JEjMNAN_ZƒAIhSEYfWDQGaPMTL’ERZTJb``NHV@"],encodeOffsets:[[112513,19852]]}},{type:"Feature",id:"469025",properties:{name:"定安县",cp:[110.3384,19.4698],childNum:1},geometry:{type:"Polygon",coordinates:["@@JjDNdJ\\FbKPXfZ^Ij@RZNaVSc[MsMOHQPDJcLIJ_zCG[HQxWJBHXdENRR@XQFWZQQGOFSWUCI[WCJuRGLXNMPLhCl[Ta@SqGgJMGOmyHkKEQMINMAGaGULgwY@UOGiKQ]EYyMK”oO_QEIIKiNSMa[LqOKOaVMWMGMDY\\_IKrL\\ERT[DEPYOUA@nNTUHINkRBVMdNvGTxzRF^U`BD\\@tfNDNOJ@Z{TeTJZ@VU€cB[OBOeeQT@^OXBJb\\AbWTF`RCJFH\\RDJIJFXW@WLGBKxWTSJJMTVZND@bbL"],encodeOffsets:[[112903,20139]]}},{type:"Feature",id:"469035",properties:{name:"保亭黎族苗族自治县",cp:[109.6284,18.6108],childNum:1},geometry:{type:"Polygon",coordinates:["@@FJp@fxpQ\\ApN\\GNPNBM`HLMrXLXj\\PEHnI@WUCEM\\GTc\\GZYHTPBHRCPTd€H\\K\\@HXi–BJILJJAVNTOZJNtFPC`YxDPWci@IBgbGKaTOIM@KNKrP@_hE@QbgKWUMJoWAQMFEKM@wTONCJWRCZDHSAM_UD_GWMKeCITSCGIQBGXUHQoMEEGWDQIG]FMQBMaFGueFeSQDUSDSKOCSFMLƒUaPWM_PaEGFETMX]RCRR@HXKN@JNnXXEŒSPaDI\\£FkXWIAX]xB\\GN"],encodeOffsets:[[112031,19071]]}},{type:"Feature",id:"469001",properties:{name:"五指山市",cp:[109.5282,18.8299],childNum:1},geometry:{type:"Polygon",coordinates:["@@TCNOLBTLBPx\\AJdl†NR†RIbJTGNF\\@RcIYbmHoLQdKN_fCJYbDRRXKZFVEZVXBXIJBXMdESW[CUYHUVQFQAqsEIMPYMSBUIIJKAIj•GW[@[LGScDOGQOAGSYZ[HSd[HFNVD@XmJFG[OWiWKNqGKN_MAMO[HoM[BoRewo@Y^HpITSFENc`MVCdHNIVCLJFI`NFIŒP`@VZbaf[FFJG`O\\WRFA@PVPFPPH"],encodeOffsets:[[111973,19401]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/hei_long_jiang_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"2311",properties:{name:"黑河市",cp:[127.1448,49.2957],childNum:6},geometry:{type:"Polygon",coordinates:["@@VÈÞ@Žkx˜nXްVÈa°V@kôw„b‚š„JVškXlVUx„„@ŽlL@xkVV°ƒ„VbxlVUnVxk@ƒ„ƒKkŽVb„Il„@°kVl„@„™lÆnkll@@V„VXƒŽš@V„²bUlƒVlV„U„VÇn@nkJšŽlkVbœ@›x²V@n°VUnlKU„n`@n°bWLnVUblVUVVbknV`°kkŽl@@V°@nz„J@XšxlWXb°n@bƒĠlbXb™bVbƒJ@Všb„a@„„@lbUbšVmnœ@lšVmnIW‚œ@WbÞ@„n@x°@š„ĢaƐéϚnœ„‚lȝĠŻÈwm@ôçU™mm£Xy°UV™›@wÈ£Ǫ¯kõÝçUњ™Uķ‚ƒĢkVфÆšÞU°nŎ¥ČUĊx°m°¦żVƐœx°ƒÇ£@y„UônރÆ@Èĉ°Kô¦šW„kWU—bÇ»@™ÈĕWÇÈ£ŤU@›n£ÆUUKVamanwŃmÝJ¯k@JƒIkaVaUUÇbkaÆÑkWmÝUۙ™Ý@™ƒwnU±ƒ@kkV¯KUkƒJƒ¼U¦ƒšÅ@ówķaķůV¥Uaó@Åwmƒƒ_kVƒwĉ‚ĉmmn_V»™a@U™ƒVwķóƒ‚U¦LǫéóXÇmōLǓÇķxÝkƒƒĉ™kmakbUͰ@W¼„@bƒšÈÆ@Ė™L„l@„°J¯„mkl¯L݃±L—amJ@¼ƒ„™VƧUó„™UX˜ċb¯ńVbkÆÝI@llx„k°V²šV@Uxގ˜L@b„@b™`ƒšÇzkókݤ@ğ¯Wƒ™LĉǙLmmnċVkbUaƒL@ޝ„‚bU°ğL݂Ý@"],encodeOffsets:[[127744,50102]]}},{type:"Feature",id:"2327",properties:{name:"大兴安岭地区",cp:[124.1016,52.2345],childNum:3},geometry:{type:"Polygon",coordinates:["@@k›ƒϙmƏêġb™ƒ¯@@wƒmÝ@XV@IlŽl@bUxl¯VlV™bV@ULVlUV™_kx™VVV™ÈÝJ@„¯šU„™lm¯x@xóÒĉ¼m„¯Wƒxţ@Uz¯ƒWwnUwťƒ@knƒWƒ£óVƒUUwğyó¦WI—Vmm™I@±kwÇ@@bƒ@ĉ¼ó@¯wó@¯aó¼›KՃaUwmWUwÅI@aƒKó@Ua™LƒaƒVÅwō¼UUÝl±I—¤VxÇx@zkJmnn‚mbnz™xlŽƒl¯ČkJl™°@„kb„Žmx@x™@kêmVnŽWxôXšxU°„bWLóJnÇWĵ„V¦™ŽƒUUb™b™ÆġK™šk¯™VU±aXmċÑUwĉKġ„k„™ŽVxk„ÇKkbƒIƒ‚ÛXWl¯bƒŽ™X¯K™bĊš„„ÞVƚnŽĸ²lxUްn°òÈb‚¦—xVbƒŽƒ@¯„Vx@¯VķÞČlĊ°KĸŽȘI°¤ČIôŽò»ƨnȰKǬ¦ôWŎÈƨwlƒnKVXmbX`lbšwkVW‚XXŽ„L°a„ƾaĊ£nƒ°@°¥ŎzÞ¥‚»œalwôkƒJ„a@ĶK„£„bU°ĊxźVÈUĠ¥ƨ™VI@XU°x°Ln¥šw°UmwXm݁V¥Ģް@nU@mÆ£š¯lKœšÜw@aÅU‚¥UaÝIkmV²‚nn@Ķ»@Uk¥VKÞ@ÞÛ@ƒkVmĢa@_ƒJómƒǖ¯Æw—óÇa@alƒUwšwĢřšk@wÆWXUWXƒWa™m@_ƒ»ÇéXaĸwVa@ÝKkUWkX‚kšKXxƒn@lĊV@¯m¯nřÆwš¥"],encodeOffsets:[[130084,52206]]}},{type:"Feature",id:"2301",properties:{name:"哈尔滨市",cp:[127.9688,45.368],childNum:11},geometry:{type:"Polygon",coordinates:["@@°`„_šJlUšŽ@„„@V¦°JUšŽnLôlnŤ@@šÈaUÒVbkbl¤ƒzk°ÇVÛô°IlVUVôU„xÆU„Ž@bźĀ„º@¦šb@l²‚UVlœ@°ÒĠxšnXxÆVô¼Þ@Üx²KލlƒVѰUȰôlwô@²ƒĸ°„lanV@„šVŎUll@bÈnÜm„wĢ@la@ÝÞb°UXb˜lŎ²ÆškšV‚I@ŽnJnĠްknƒÜbĢwna@a˜kÞKƒĀ„a‚™œ‚‚IVbU¥wĠwkô˜xnLƒċVçkaUƒ±IUmnġW„°WôĉšalƒÞÅĵ¯@W¹XÝaƒb¯a±X¯ºLƒaVƒmkLóƒƒbkaƒVUKVkkKV_@aÝykk±L@ƒÅU@yV_™aU¥ówÇx™@UkVƒn@lƒkÅlwšWVwUkĉmkklW@šašbVwnWWƒ—wWL™™@Ušƒ™UƒÇLšÇmƒ„@wƒJĉƒL¥@ƒÝ_@a¯y„UWw¯ƒ¯Uġx¯aÝXVmaU£ó±›¯nwƒa¯óÅVƒXman™„Uƒ›lUXkWa@mkI„›ğaƒm™IklÇU™„kĊƒƒzkKƒš„lU„ōĬlš™„@ŽnX°@llUxʲmKĉVWwk@UbUK@bmVmI—ƒVmwaWxXlWȁšmºšÞÆbUxV@ĵńWÆĉLkWUbƒaWzkbĉ`U„±LklōwUVÝ£™UW`Uwk@mk¯VkaõVX@WbL™K@XƧºWzxƒK@lmX@bkVVÆk¼Vbk@Vn"],encodeOffsets:[[128712,46604]]}},{type:"Feature",id:"2302",properties:{name:"齐齐哈尔市",cp:[124.541,47.5818],childNum:11},geometry:{type:"Polygon",coordinates:["@@Þ@ށĠKV¯a°ƒ@„KVblaČU‚mnnšKĊȚKX„°ŽĠ@Þ£ôllÈy„™š_@a‚ƒ@a—KݍVwU@±™¯Uƒlkw@kÞJlÅUa°ŃČaW—šVôƒƨVšU„ƒ@»nI˜b²Kބ°Klkn°ƒ¯I@ƒƒkšK@ĕÇń™@aƒX»¯@VĵlaÿVamI@aÅÝउýƒĊȗJƒôȁÅkmƑۃ@kxġ@@l™aVk¯»ƒīŹaƒkƒ¥Å¯™JUaWU@@w™aƒ»„KUkÆkUm„UmwÛ±±UUbUŽUXƒwWwÆÝk™lkUanaWwnKl™kal¯ka™ƽa›kÅx™a¯@™amb¯V™lÇwÛĀ™V@x™šmêVƜVV‚aôV„wÈx@šˌx„¦VÞ¯VšlmX@‚ƒL@¯Ua¯LmV@„„°X„ċK™V™ƒ@UƒÈ@‚¥@w—ƒġIU™km¥Źwƒ¦¯lmn@°kxVV@¦óam„n¦l@nx™lĉVóšmx™n™ÒĉĀĊ¼„þ„šǔêÞ°ˌĠÞÒ°ĀɲĀƨźˤȤƨĊ°w@£nymwnkUUV¥ôÑVmkÆmUUVa™mVIkmô„lxkXÞþƒbl„ƒl@kV„ƆƒV„xV@š¼VÒ@šŽUŽšnnނJ"],encodeOffsets:[[127744,50102]]}},{type:"Feature",id:"2310",properties:{name:"牡丹江市",cp:[129.7815,44.7089],childNum:7},geometry:{type:"Polygon",coordinates:["@@U`lLUlVL„Ulb„aô„lKnŽU„„b‚K°¹²W°b„aÞb˜knyUlUkamř²L@m°@lšmš²n`ôÅlK„x„ÜKnxV@„l@œƒ›ÅXyW_k@™wm™ŹĕmƒX™»‚ƒÛ™l°ƒôšÈ„»š—ô˜ô_WW@Uœal»šwU@@wšUVƒš@VƒXI@w‚Ģ͑ÞȻ›aU_@mUkly@¯óV»XmWUXUWmnm¥nUUaWLk»Æ²IÇa™wÅaݰ¯nUa±a™ƒ™@¦õÆğ„@„™@Åb›xU܁nÇłlb¯¦„ôó»mƒ—@±ƒUk@Wwƒa¯xU„V°ƒxXbǎŁUV™™ƒK@¹ƒKUaȯ@ōݙXƒal™ƒlÛkalÇUǫÇńÇakbÝƆ¯nlš¯Ž@¼™VUx@x¯W¼™Æ¯šmĖ„Ĭ¯ČƒVk‚ķÅmxœ°ô²V¤‚bUnÞW°bĢw°V°„XxƒV°z@bÞ`@„‚¦„KĊŽ„I@xƒŽn„™ÈÈK‚„šV™„@VššXK˜xX„mXUx™a™b@‚kXllĊnVlUx™XkxlÆk„m@U„Vlš@ÈwôxV¦šbU`@zÆV@„²KllÞz@b"],encodeOffsets:[[132672,46936]]}},{type:"Feature",id:"2312",properties:{name:"绥化市",cp:[126.7163,46.8018],childNum:10},geometry:{type:"Polygon",coordinates:["@@ऊþÆÞ@bnJUb‚ĀnblŽĊš„„ÞlĸwǔÈŎKÈnôWǬê‚KV¥„ĸôUxš„@VšbU¼m`nnĊŽĊ„xlUšmkaVÿšLšwš@°»UmbKmݙUšwUmVknKUUl¯ƒKU™ƒUȃ‚™nK@ĠkX±lX„°„L@¯¥@wV_m›ĵ¯Ww™L¯ƒUkōƒÇVU™l›w—V󁱃¯aƒVka°wVk°mÞ¯Ŧřƙl™²™Ŏk™U@ƒmUkb¯ƒķޱ„ó@kxȯó¯VUÒk„ÝŽ±LÛwÝ@ó»ÅUWw™mğw¯Ñ›@UkV±@k™a@¥ƒ¹Źÿ@aƒÅVƒwóVVUkU¯JÜóÈUl¯„yk£laUaVÑÇb@™ţ@kmómK™V¯IU¥ƒ@@ƒ™kV™Iƒ`@ô™¼„blU„lƒ™bÈb@xÇKkĢɳaÅɆō@ƒŽVƒK@z™@@¥ÆKnÜ@@aۏUw›wnU‚ķ@ƒ_ƒV°Ž@„klVššnULVVÞbVl@°™@nx™n°LŚÆlV„ȃmU²@VmĠLƒx„n¯xkWƒzšJ‚wnLmbXbW°šÆ‚™²™@™Žšx@JVx„L‚Ā²Æ°I¯º‚È@ÒnÈ"],encodeOffsets:[[128352,48421]]}},{type:"Feature",id:"2307",properties:{name:"伊春市",cp:[129.1992,47.9608],childNum:3},geometry:{type:"Polygon",coordinates:["@@ƒKƒ¯kWW²ğl@ŽmLšÇ„„VVš„Lk°VVmLUlVn™xšVnނLnaVޝ¼™@™x™KUĀlb™n„`n„Æxô@VbU¦ĸŰĸbôxÆ@„™V¥„»„IVl°LUŽll@²„mV„x@ššÞܚÞVnŽlXÅÒlbÈaVVUblb„J@I°lÞIn‚Æ„mxnbUbVLÅVm¤@œţVǤXÈÇĖ@šÈ¼˜aXVÜaXbWŽnzŎašř„KôbšUlw@¯naÆKnUU¯Üa@mkkVUĊm„™żÝ‚ǖŽ‚K„™°L²lÆI@ƒ¯¥ĉƛVaÞk@ÝVaĠlnUVwƒœómaƒ@™wĉ@™a™VƒxamX@aƒ@UaÅLƒaVWƒ_nWm£nWm_ÅV¯ƒm@m„󤁚ݦƒ¯ÅalmX£ƒ™VWUŚw™mÇ@@IV™„WUw@ašI@„k@wŎ»Wƒ„ƒ™ÅVaœK›Ika@¥lUkUlwÅwVyÈwWU@a¯U°m—Ç@UçƒaVa¯mV»ÅwÝUlƒUk™V@k„mUk‚X£šw°@@ǃaÝIƒƒam™Ûam„¯lğmmI@J™U™l±ÅōŽ—kWa¯VÝa@Þkbġ@ƒxÛnÇm@akkōVōl±škšÅšťŚÝ°¯nUl¯xlb„U°b²„ô‚˜Uœxšk‚VÈUŎ„Vl°„šKXxͰnœU`@x°¦@"],encodeOffsets:[[131637,48556]]}},{type:"Feature",id:"2308",properties:{name:"佳木斯市",cp:[133.0005,47.5763],childNum:7},geometry:{type:"Polygon",coordinates:["@@nš„b‚„ÞJ„b@ȯ@™xW¤Vlƒn@lšUVlk„ÞVÆxU¼°nUb„bVèÈ@˜ŽnIn‚@šĢmlUw°™żƒ‚VUn@lnL@VôbšwĊ‚lœ„JķĸĢl„wôwƨxVVUƒŦšxšLź™Èš°`nnĠwŎJސĶwôJ„@¤Xn܄ĸlšn°¼È°lŽ„„Uš‚b„xš@„l@ÞÞÈm°„lôwšL°¼ĸ‚°Þ²nĠ@ôwÞ`ŤI„V„ÒĠU„„@„VJĸbƄ²@°ŽĊKšœ„JĶa̐Ȱ@ô¥°nš¤‚bČUš@Vx„mUw@a݁ţƒÇ™ķƒ@ĕķīU¯²@ÆmVÑô¯X¥ċç@™ĉ»U¥ÝţKWVÅkUVÝŎUmǍÝx¯aķxÛUóL¯a±óōb¯™ƒÑŃVÿƒ_Åķ„a@UƒK@wm@Van@UmmLVa—@VImmXUWƒÝUřƒKUwÝUUƒkVƒk@l¯X›‚Å_ƒJ¯k™Jm„ÅLƒa@¥U@¯Vƒz¯@ƒ`@¼šmxƥšŏKÛk@±laÛ@@Xm@™ƒ@xƽ@WŎnšˣĕÅ@@aÅ@@nÝbǏ¯@ƒ_U›kUWƒkb™wÝU@ç„Wlw@anIƒ¯lyœX°m°VšašÛšm@„mVwÞK°ƒšXlaXmm_ƒ@UƒkwÝK@ƒVI™ƒXmV»ƒI@aƒ¯ğW™bġaU_¯JU¯ġŽƒ„ĉ„k„ō`±nÝÆk„™bóĊ¯Xƒ‚ĢX‚mVn²JV„lbUè„ČmK—wlóğx‚xV¦UaJ›šƒbƑÿÝL—l@bmbġx"],encodeOffsets:[[132615,47740]]}},{type:"Feature",id:"2303",properties:{name:"鸡西市",cp:[132.7917,45.7361],childNum:4},geometry:{type:"Polygon",coordinates:["@@‚LšKVVnkšbVšÈb‚²U°VnklVlaÈL@anU°ÜmXV`œnôLƒèšxlŽšLX„˜L²ašVVmÈX@ķ˜lnU„Èl`ȹš@ŤŽ°U@x„KnnV„mlnnUl‚lVnnaŎwlVÞ҄@n¦šLVްlšwVk„Lšaގl„n҄š@xmLÞ¤Wnœ¼‚WÈLVVUxlÈô„„WVaU_VKšKXUÆbn™‚nôK„bÞw°bÆWXamVwœK˜™Uw¯WUk„UlJUwVUa™@@kmyzm›ĉw@kVwškƒW¯ÅKU_Vmƒƒ™xU@aW@@kK@w„a@Kƒ@@kVUƒaky°_Vm™kna¯K@™ƒL™wġk@@IÇóX™ƒwVakmV@mwXUWanƒlĉ@ǙUw™KƒƒóšܛNJۄm°@›w—Å@ƒ±b¯Wƒ¹„WVwŹĕ¯kVmōb¯w@aƒwmV™UUb™V™IkaVwķ™xk¼›b@VXXó`󗙘ƒ¼Çó™¯„kŽÜš„š¼WŽn„źĖnššxl@X`WzœÆ"],encodeOffsets:[[133921,46716]]}},{type:"Feature",id:"2305",properties:{name:"双鸭山市",cp:[133.5938,46.7523],childNum:5},geometry:{type:"Polygon",coordinates:["@@™UƒƒUwó™mÑÞÑUÝÝUkmmŃyV¯ī„¥ƒUÿĉ¯mÇkaWbÅX¯aÝxƒaóLmmšÅaWV™LULV`UbƒXóƒkÇVwUUÇKX›»XmÝ£nK@wƒ™mÑkƒÝ™bƒKUl™x¯kU™Km¥ƒ@ÝÑkUōxmbUmkVkmmnkUƒmmƒL@w¯Vţ™@Ǻk_ƒÇmV—k@ĸVx‚VȰlLkllšUbōwƒnVW¼nlUx¯XmWUnÝ@™xÝUó¼¯J@LVbkJWnkb™W¯„ÝLUxƒn@‚™n™Ü™b¯U¯n›Wkz„°mJ@bkxƒX@èÞVšxlaX„lVVœ„`°@ȐÞa@mÆ@@bÆ@ˤĖm™Xōƾ@@wš„n@@WÜ@kb@²ÜlŐLƦ™nw™@»„_°@„y°UV@@¦„bÆKnƒšI°l„IÆ`œ°W@k„llUV„ÞVVx„LƚÞVX„WVnnUJ˜@UbnKVnm@Ubn@@x„L@VƒbÆĸ„`UĀÆ„„Ò°šŎa²ô°bôKÜVĸw°bÞwȎVnÞōVUÆlXU"],encodeOffsets:[[137577,48578]]}},{type:"Feature",id:"2306",properties:{name:"大庆市",cp:[124.7717,46.4282],childNum:5},geometry:{type:"Polygon",coordinates:["@@mÇ@сǰ¹¯J±ÅÿƒKUw‚I@™wšš@š±Å‚™X¯WanamKx™I„ylX°wƒm„wğKUn±@nVDŽUƒÅkƙ¯Kšmmwš@@¯UkÝaUUVK™mU™lk@ƒ¯„U„`ĸ@V‚mœxVxܐ@bÛ@m‚ÅL@¦š@@y„L‚U„Ŏ@ÆɅɴblġÈL@wÇaša„ƒkkVƒaš»@ó¯_ÝJ™wÇaÅXny›U¯¥Å„@w™bÝa™Lmm@@ƒVUŽlbğVmš™¯Xƒm_ƒ`¯_Ux™m™L™a¯b@mƒaó¦Çk™¤V„@bóJknVx™VXx±aƒLUbVxkLVlLWlƒ@nX@VÅbWlÈnƒx„bWšÅbmŽ@xœbml°b™„XbW„XVmnn`ƒLmšnbmb@šk@mwU@@š¯Jlbk°lbkšmLXxmbVbkllšÅނxX„xVWVVa²VܲnxƒVVnÅlVlƒL„¼šb@xV@XŽVbšIư„¦„lźb„Ĭ°¼Ulšb@kĢ@lw„@ƒÜlnȂƄóȘI„ĉ"],encodeOffsets:[[128352,48421]]}},{type:"Feature",id:"2304",properties:{name:"鹤岗市",cp:[130.4407,47.7081],childNum:3},geometry:{type:"Polygon",coordinates:["@@Þ¥‚™ô£nƒn@°„ÆUn`mXn¤mX„`UX„bÆKVb„@@bnW‚b„wšUšbĊ@šx„@nbšWVmƒ_mm@ó»Um„ŘWXkĠ»²¯‚¯nķšwŎ@ĊšŎK°bĸUnјKȦĠÈbÆknJššÆUĢV°IšŽšVƾƒwaV™ƒƒkÇ¯¯»™mķkۃWm@£ƒóIĵxݏōIğxmm¯_Ç™Źš™K™wťŽ„UVUŽƧwóxƒxġkĸķƒIk›ĉ™xóa@UmK@kVmUŻ„¯šVxkŽġn™‚@mmJ¯n°V@bXVÇxUzÆxkxlVkV@¦lbœJ›LUbšÆƒ„X„ō¼@xƒl@™J@bVxƒXUš@JÈ@šn™xVÆUXš‚„W¤knÆb„°"],encodeOffsets:[[132998,49478]]}},{type:"Feature",id:"2309",properties:{name:"七台河市",cp:[131.2756,45.9558],childNum:2},geometry:{type:"Polygon",coordinates:["@@²mŎ_lƒĊƒ„ƒĢV°°IV`ĢbšaĠX„°@b„JU¼Wnš„UJ@„ÞLlxV„„@n`lIUa@K°Iô»ÞVšwÞ@VmnX°WVwmkX»‚U„mŎxVak™lkkKǯUUwÇWUn™U±b—KWƒ™Kk™w„çóK›mU_nW¯ÛmV@bÇKkbkUml¯U±VÇaU™™amlUU™LK›„k@ƒU@mwÛLƒŽƒwkLóÆm_™±™nkޝ@@n±KnŚlbkVV‚mz—lWXº@Ķ°"],encodeOffsets:[[133369,47228]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/he_bei_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"1308",properties:{name:"承德市",cp:[117.5757,41.4075],childNum:11},geometry:{type:"Polygon",coordinates:["@@lLnlmxn„„IVVlUnb@VVxXJWL@LގVnnV„J˜_@wkmšK„b‚x„wXk˜WXXšKlb²K@nVVVb„L@WlU²„lKVnUJVz@VVb@lżmVUVnbôaVX@°Ub@lWbXš@b@bVb°x„@VxÈLVlšaÆ@Þb²k°@lVUŽ@Xn@VW‚LXb@¤VXšKVVVLnm°_ƨ¤@aUIVa„alkX›°k„™V@„alwUVy„U@k󙰃na°UVUUmUÆw@mkLVUƒWVI„WšLnn@xlVnK„myU@ƒU°UXaV@U¥ƒU@Uƙ@aVUkWU¯ƒaU@WLUV@bkbmKULmKkUVUkmVIUwlWV²™Uml°U@W„LUwVm@UUK@_ƒKUUÜaXw@ƒVKUU@mVIUUlmnIVVVbÈVlKnbVKš@nI˜@nVnwVLVK„K„„˜Vnb@aUIVW@In™°@lVnIš@lWĢ@°UVL@b„@VyUUƒa@w@WUnU@Wǯ™K@UkkJWaÛbmk@mVaÞU@amkWƒ@mXUKkÿƒ£@a„kl@Um°UXwla„al@nmlXnW°znW@aƒwV™@ƒakbĉ¥VmU@ƒIƒVƒUƒJkUmWU™KbmkUaƒKkUVU@KV@@klw—™WaU@kmƒXVènbmlUUƒKƒX¯JkbƒI@JmIUWU@ƒLml@XkJ@U™kƒK@aVKwWa—IWwƒmUƒ@mU@J@UaċU™aUUƒVkI±ƒk@UUƒ@UbVVm@UVKƒLƒlkIWaULUWƒXUJU„ƒ@WbUb@lkXUxm@@JVn@J@b„nƒb@Vkx@bšLU‚Æn„JšaVXnKVVmzX‚°V@_lJXxWXƒK¯bÅamUƒ@lUI›bñJ@LÇKkIÇ`kxWL@„ƒ@@bUVUb¯xWKk„Å„VlULW@ƒŽn¦Ul@I™lmUUUVm@kWƒnkKma¯XUKWmnwVwÝL„mŽ™VUbUVWb@Lnxm„xVŽmbXx›¦@„nb@`™„ƒVƒ@kbƒLU„mVUlkbVXkºmnm@@xk¦šbĢÜlš"],encodeOffsets:[[118868,42784]]}},{type:"Feature",id:"1307",properties:{name:"张家口市",cp:[115.1477,40.8527],childNum:15},geometry:{type:"Polygon",coordinates:["@@k™ġۙal¥@wn@nml¹UWlaVknUVƒ„Kla„@„Ušƒ@_ma@ƒœ¥WwnaU‚wnƒmw@KXaVUVašUnmWUk°™lƒnUVUXWVw™IWVóKUI@WXƒxUU@mma@kUKWLkw@yk@ƒaVkUUċaUU@Wk@Unm@UVmLm±IUƒkJ™kWƒ@a„I@m@U„ƒVƒ„Ula„@VXVƒXmVwnkWKƒKU_k@m¥ƒmX_™JmnU@km@U@KmU™VƒU@U™@Umk@@LƒmW@Û£Wƒka@wk™@aƒI@mmk@mUa@UmUƒIƒwW@aWUƒbU@kbÇ@kwƒ@makVUk™U@aƒm@aU@mxkUƒbƒKUXUƒ±KXVWLUK@wkU@V™@WXUa@WbUxƒJIƒŽ@¦VèVVX@±ê¯KUIƒ`¯UULVx@Vƒ@UKƒIƒVkLmVkKmš@nUJÝbkIUJVXšVVxVbU„VJ„Un™°bV„mlU°„XnK@Ul@lVÈVUXšx@W„@VXšV‚KÞb„n@VnbV„m`ƒUx™kW@UVkL™Km¼@lUnUJVnV„XV@Vm@@LV„klƒIkl@VƒWlŽULWKUL@mJ„@blbUVUlmzUJUxm@UUbċÜk@Ub@VšLVV„¦ôbVŽmšUKUkU@m„„@VlVn¼WbUJ¯@@„°šnIllÈl˜@nXšWlLœk‚J@bkxlxkxlXUlklJƒšXL@bW„n`@nƎXxlL@xl@Xb‚LœKlVlIXblVUbUJW@lX@VL@VVŽšXšJšw„n@WnL°K„bVbl@VI@K„@U@nmVmV@XUWI@aXm@™VUUkWmn@lmUUk@mUmK@UnwVĉ@ƒƒmU_V@XJôVVUšLVUn@šllUnJl_n@šml@XŽlLlw²LVJUL@VmbVblVXmVnlš@Ť¦„nn@܎@bšl„@@XV`„Unb@VlLVb²J‚Xn¥ÆÑ@¥Þ@"],encodeOffsets:[[118868,42784]]}},{type:"Feature",id:"1306",properties:{name:"保定市",cp:[115.0488,39.0948],childNum:23},geometry:{type:"Polygon",coordinates:["@@VbXWš@@UlV@xVLXKWU²LV„VW„L„alVnwV@@b„n@bšVVllUnb„@lxÈ@laV@„aXV@b‚X„x„J‚nV@VVb@nnl@n„J@blšl@„ašƒU_VWUwVUškUm™Ukb±mVwœU@VIUW@UWk„@VU@ynL„m@IV@‚bnK„LVaVmnIlaXwV@@WVL°@@xnX„@V`V@VbUVVLVKnwnL@ll@@_V@VVnaÆ@œKVXÆ@nƒ@wƒKmU—™Wm@km@kÜKXU@ÑW±nIUwVƒ„Kla@I°wU±kškmm¯mƒ_ƒJnƒaƒwW@IVaUama@wƒUƒmU@mVw@aXk@mWa@£km@aƒ_kVmUnWW@¯bƒkUmk@ƒVÇm@@kUU™KUU™@UVUamVUaWIkb@xU@@amUkKƒVkam@@kVUkUWmKmUkLUb@xmJƒ™U@UImVÛVmnUwƒJƒU@VƒX@UWm@Ub°¦UšmxklmX@`ULU@@UW@@xkn¯@makV™UmxUb™°ƒlUšƒbUbƒnUJƒUUVƒa™LkbUU›JUU@mUUUƒJkaƒ@™xUIWJƒUnƒJ@V™zƒ@kb@`@bln@l™bƒŽ@X@š@š„@Xl‚bnbVb„@„„VJlInlšbVw@U„K„l@lbnan@Vb‚JôLn‚UzlV@lÈLVbVK@LVx—VWXX`WxXz‚bV`UXV¤nx@„bVlVnVlUL"],encodeOffsets:[[117304,40512]]}},{type:"Feature",id:"1302",properties:{name:"唐山市",cp:[118.4766,39.6826],childNum:11},geometry:{type:"Polygon",coordinates:["@@„@VVl@²„lJ„UVVšbČVVb‚@@InV„@‚V„nXx˜JXb‚xUL@b„Lšl@VlI@Wnk„KV@VXnJ@I„Jla°I„W„LVVnkmaUç„WVkôaܯ„@nV°wnJlaV@VUnUUaW¯wXWWwna@£UaWKU¯ƒ¯@aVUkKUamUUƒn»‚an™„IVwUWlkš@„LlWVakU@K„_lƒšbÞU°@šy°n„@„KÈkWW™ţ¥ĉōƒkġWUw¯£¯ƒÇwţwƒ@kK@kƒ¥ÝwÅbǤېťV™lW°@ĸ™x@VVVULVLkl@V@Xƒ`Ub@Xm@UWbƒk@ÆVbnLWV@lnXUbl‚@X¯lmU™VkKWLkK@_UK@U@UmmUxmVXLWVULkU@`W@ULUK@XlJXzV@@xml@VU@UX@Kk@WbUK@Xn`ƒXmJnšmškxUVbUVlVVxUbV@nKlL„kVKÞbVKXI°KVšmVUIUKULVxVJVLkV@Vƒ@UbU@WUU@UbUK@b@nƒV@VkLmb@b"],encodeOffsets:[[120398,41159]]}},{type:"Feature",id:"1309",properties:{name:"沧州市",cp:[116.8286,38.2104],childNum:15},geometry:{type:"Polygon",coordinates:["@@@ln@UȄŽl@Vn„l°aX@mXnVlU„`@bln@¤Xb@nWl@bUx@nnV‚„„V@xnbVbUb@J‚X„x„b‚mXa@k„UVwlW„k„KôVm@w™kkK@kl»Èƒm™VKXkla°@XVV@VI@ml@@Vn@VX@V@J„@VxUzVVšš²blVk¦@šĠ@@»š@VK@VÈLlK@XnJ@alIUl„a„VVbš@„n@a„U@WUIV@mUn@mKXml@lL@LnWšb@XV@@a„VVb„V„@VV„IVWÈb˜IÈ»ƒǟlWšaVUÅUƒƒ™Um@kVU™WVkaUwmaóUƒJUU¯ÑU¥mk™¯UaƒKÅnÇyóXmWÛX¯aċbÛa›J—W™ÝU¯»ƒaóóUm@IƒšVVl@bƒLUJWLX@@xšXUxl¤V@V„nVUV„XVbVš@Ž„@@VVn„°VŽ@ţU¯VƒUmƒUWV@mUXƒaƒbUKUwUaÇKn„ƒVk¦Wb@VnLmV@bkV@n„xW`Å_UVƒV@bƒUklVX@VmlUƒx@VVL@x—VWVL@VW@UUm@"],encodeOffsets:[[118485,39280]]}},{type:"Feature",id:"1301",properties:{name:"石家庄市",cp:[114.4995,38.1006],childNum:19},geometry:{type:"Polygon",coordinates:["@@la„@šy@U„I‚m„VXIVJšw„@lb„IVVnV‚@VVœIVVlašK„bVU„VVI„mVa„aV™„kš¯VanwšVlUnb°@lm@wX@@VV@VK@_nWlknwV™¯¥Van@VX‚@„W@U„V„IVxnmÜUnUVJV@„šnI@wValKnV@k‚mU£na@mVk°K„LVa@UU@UƒmknWWkXU@aWW@@km@UaU@@klK@UkaWaUnamm@U„a¯wWU@UkƒL@ŽUn@x™V™lUXVJUb™LmU@aUWUkmKkLUUm@mW—XƒaƒmmkkWUm@@U¯JUUm™kU¯@mKĉxÝwÝ¥LƒUóŽmwkUUUWVkKm™kKmLX„lxVLVxXJ@nVJnz@VWL@`nX@šƒxƒ@kVUUmJmIXx„JV„ƒnUVƒ@UVV„@LUšƒ`UXVVƒ„ƒlXL@l@b@VmX@b™xn°™UƒbkKWLXlW@@bƒK„mKULmakLUlmb@šXb@xmXU`V„b@`lLx@nWVXL@‚°WlXnlb„KVK„XVb@˜X@l_lJ@V@XnŽ„I"],encodeOffsets:[[116562,39691]]}},{type:"Feature",id:"1305",properties:{name:"邢台市",cp:[114.8071,37.2821],childNum:18},geometry:{type:"Polygon",coordinates:["@@nKlLnšlLXUVVlVnxô„V‚KÞ¦ÞxĊwnL°@lVnšVV°I@Vn@V‚lXnl„n„b˜WnXn@VVlKnLVlVX@bnVšKVaUIVWškšU@wVm@¯@U¥VmU_°lšK„k‚w@LX‚Va„U@wšUƒUUKlUóW@UVUœUlƒ°K„wlKU_na„KVnlKkkšWWa@IœJVa@IlJnU@„KVUUmVlaXUl@lm@kXWÝÑnkƒ™±™k@wğ›@@U@mKĉLmVJ@zmlnŽWLUÝJU_ƒ@@šmJkXUVlbklÝ@Ýa™b¯@¯±JÅwġaUU@ƒkU™@mVI±bUKƒL™WUXƒJkaƒLóKULWbUVkKmnk@@bmLUŽƒl@b@mnmJkUULƒaƒbnŽmn@lVV@¦n@„l@b‚znx@`Vz@b„xnV@xl„lbnKVx"],encodeOffsets:[[116764,38346]]}},{type:"Feature",id:"1304",properties:{name:"邯郸市",cp:[114.4775,36.535],childNum:18},geometry:{type:"Polygon",coordinates:["@@„bVKlVnInm‚@@a„kVnK@al@nmlLVUXaVKôL„Klb„IVWšX„KVL²a‚JnUš@lV@„VVĢbÆx²I°Ž°@šaÞbÞ@lkkaVUlWnI@™„@V`ÞI‚VXKmnk@y‚InUĊKƒÇkUUamUUkƒƒ@aU@U™ƒk@WUwVkVJVkkw°a@„mK@UX@VV„LVW@wšwVa@¯Xm@@lUIWaU@UWkXWmU@UwmUkKmn@lkVƒ²™VƒaULUVmJUUUwƒLma@™UmkIUm›L—mVšmx@b™LUamKÅL@VmbkU¯KÝamzkJUb±Vkb™L@lU@WIkJƒzkKmKƒnUalWkkKW@@nkbk@WW¯XUVUJ@XlJ@Xƒ@XlWLkUƒ`VUnaWa„UV@UVIƒaUxUUmVƒK@I@W@DŽU@@U@bƒ‚@nmKXmx™@UxkVWUX„@`VLlL@`™zX‚Ýb@b‚„@VUVkIUJVz°KVlnLlKnL„xlLVVUVlXUJ@nn‚„I@mVUlbn@@Žm„@bV„nV"],encodeOffsets:[[116528,37885]]}},{type:"Feature",id:"1303",properties:{name:"秦皇岛市",cp:[119.2126,40.0232],childNum:5},geometry:{type:"Polygon",coordinates:["@@lnV@Xb˜škx@lU@@LUVlV„LVbnl‚ašLXVVn‚l„I„V„U„JV@UnĊ¦la„bš@nJ°UmƒV@„wn@VU„JVI°bnWlXnWVLVK²b‚akk„lI@aUaVƒUwVUUalaVwnUVak¥šX@W‚kœLVÓm„mUK@_lWš@n_UK@alÅ@ğÅƑŃݍmƒ@їţÇlƒLƒ@¯m™z¯@ÝV™ak„ƒ`@LlVUbkXƒK™@klVXUxƒJmšbm¼V„nVVblLUV@b„°V°XLVb@¤mbXxWX°xXŽVbmVUVU@kbmI¯xmUƒ@Û°óbUl"],encodeOffsets:[[121411,41254]]}},{type:"Feature",id:"1311",properties:{name:"衡水市",cp:[115.8838,37.7161],childNum:11},geometry:{type:"Polygon",coordinates:["@@„KVlV@X°xƒb@VnnmbVŽXblb@VkL@lV@Vbn@@l‚@XX@bWVXlmXnlV„V@@VUbƒK¯LUl@nmbV¤n@l‚LXnlVUV@ln@lb„UlLnV@bV@@wlaXJVbnUVbVUš@VVšLVVn@VVX@@U‚KXU˜U@wUK@U„wVnk@UUWlk„V@a„UVUÆ`X_ƒw@mlU@anUmK@UXal¥„UmƒÈLVbVxVL„a„bVW@nXU‚Vn„„V°UŤV@Uƒ¯Um@Uƒ@@U™UaƒWVUmUUƒU@k£Vw™W@wW@XKƒIUa@wU@@al@UK@_mKXKƒbUU@aVKmš@Xmƒƒ±@kbÇakLğVaUw@a@ƒmkUJƒk@ykw@£ƒWX@lknk@WVkbUŽVnUVƒL@‚mVkI@JUb›I@JXb™XllkLUmƒLmbV`kLƒx¯Lk„›VUV@VôXkVVL„V™V@xƒVUbW@Kxƒl™L¯kV`UnV¦°@"],encodeOffsets:[[118024,38549]]}},{type:"Feature",id:"1310",properties:{name:"廊坊市",cp:[116.521,39.0509],childNum:9},geometry:{type:"MultiPolygon",coordinates:[["@@la„Ušš@šUnL@VWbklWxnIVV„V@X„JlbUlšXVbn@@K„mV@@X°WVInJmn²@lmVbnL@amKV_kwlmX@@LVamaXaƒaVU@UnJVanLlUkaW@UaVakK@IlKUU@an@ln@alKUƒkIVa@a@klaUKUV@UkUV¯šKVƒV@kUmƒU@@a¯ImJUU@VV@UL@Uƒ@@WXUWa@Ukwm™@ƒX@@w@al@@aVIUmVUUUVWUknK@I@™l¥kU±a™™UUVyUwƒ@@I@UUWm@@Uk@@nUJU@WU¯@kbWlULnšÇ„k¼@llLšl@xUnóŽƒLƒlkXUxƒV@lWb„I„`°nnn™llŽV²¯x@JkbƒLU„VxmJX²@ÒWVÛL@lln@‚Xn˜šnV„L"],["@@@kX@Valaa@KWI@UXW@WanaUIW@UaUKķŽk_W@UVUKUš@bƒ@UamxVXnJUbWVXLVbn@W°kb@U@Wó¼mIU¼k`V„@bVbl@„lX@lUôVlUœIV`lX„Vn@lUlVn@„l@UVaƒIUWl£Um™VWU@@UUKlUUUnƒVL@KšUnLVWUa›@™U"]],encodeOffsets:[[[119037,40467]],[[119970,40776]]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/he_nan_geo",[],function(){ +return{type:"FeatureCollection",features:[{type:"Feature",id:"4113",properties:{name:"南阳市",cp:[112.4011,33.0359],childNum:12},geometry:{type:"Polygon",coordinates:["@@lKl@nVV@„bn„@VVnm‚nL‚LXx@š„‚VLlKVU„IXWÜ@șlbl@XUĊUlwnW„LÞw‚m@ÞUVmnVl@nX‚JXLm@VnnJla„I@VkxVb„@VŽln„J@knKVn„@°aVanal@XK°b„‚@š¯VJXIš„VK@al@nV„k‚@nK„a‚b„@XL@blVVKVLXK„@VaVI°mVaX@V_@a@yUkVw„VšIVašJ°™@anIlaV@nKnXÆm@wUUV±UUWUKnaWwXUWmٝVƒam@kakImƒUKƒ»lan@VXXa˜W@@UlUUa@a@UlwUƒV@Xal@@anIVaUK@V™XmwVmUmV„LXl‚@nalLnal@„šnKlkV@@UnJ‚UXnl@nVl¦V@@VnJ@nUVVVVIn@Va„JƗn@@K@m„kƒa@kmWVaUI@a@™k@@aUL@mmaVIUKUVƒ@@IU@mƒUmmL@K@UUUU@mW@@nU@ğ»mVmbk@klW@UXnV@LƒJm„™lUnUJ™UUUWƒƒ@UnkKƒxmLa@ƒ@@lUU™bmUVWk@@nkUmam@UakJU_ƒVm@ÅlÇLUVmVUwULƒKU@ƒk@UƒVUlU@@Uƒ@UaUUWaŎƒzJƒaWLkl™b@bmL@„kKƒabWŽUVƒ_@mV@b¯JmXUbUK™¤ÇLUU@b@JkLWmkUWIkJ@VmX@JUbVXU`¯VV¯blK@LXKl„UV@Um@@Uk@kxWŽkbƒL@KkbmL@‚UXmaU@@l@x@blX@xUJ@bULUlULÇ@@VšnU`W@@nÛ¼U@@VmKUkm@VVX@@xǚ@bUbVb@VX@@x‚LUb@lƒ¼XLlbUlVVU„Ub@n"],encodeOffsets:[[113671,34364]]}},{type:"Feature",id:"4115",properties:{name:"信阳市",cp:[114.8291,32.0197],childNum:9},geometry:{type:"Polygon",coordinates:["@@VllInJlknJVkVU@mXlUÞ`VnV™VU@U@y„@nXlKV„nJVkXKWaXI‚b@yVk„VUkVwn@‚K@nW@k„KlUXVVUlbnUV`n@V_V@llX@@V„b@bV@@nlVUb¯‚WLnbmb@ŽnLnK˜b„U„bVWnLlaX@VVUX@Vln@`kL@ll@VXVJÈIVl@XÞJ°Una„LlylU@UXKlnn@lanLWWnbVI@KXKVL@LVWVL@UVKUIVWX@@XÆJ@In`@lJVI@a„WšÛnK@UlK@UU@VK„nlm„nXal„UllLUbVVšknJ@nV@Vm@a„l@@xnV„„lJVUU@™w@aƒk„@XW@_mWnUlŁUmVKV@VXwW»XƒWaUwnkWUkVUƒU@@@WlaUkkaƒIWVkm¯xmIUmƒLUVƒaUIó»m@mmwXk@a›mk¯¯l™@wƒmkLmmU@UbkUWJ@XUbƒJ@b@l@znÆmK@Xk@Ub@lm@ƒI@akmVKUUVUkU@U±JUbkƒ@IWmkxƒa@UUV™UWVkIUaW@UlLWn@VkJƒI@VkK@L@bmKƒkJmUUaUKWXk¼VxnJ@„V@@VULV¼ƒ@@UkaUlWL@U@W@IkKmL@KULUWULWKUXUJmIƒb—KƒŽƒ²UW™nWKUUkLUƒmUUam@UU™@ƒmUL@xkV@„VV@bmV@Vk@mwkUƒVUx@mbX‚ÇnVb„‚UL¯šWŽnUVLVb@xnlWnU@UVUVVUbVVlVkn@llVUXUWUXVbUJ@bmLUJnb@nVK@bl@@š@bVJUbnX@l„b"],encodeOffsets:[[116551,33385]]}},{type:"Feature",id:"4103",properties:{name:"洛阳市",cp:[112.0605,34.3158],childNum:11},geometry:{type:"Polygon",coordinates:["@@VVUllLXl@LWn@J„@bƒKUVmnL@`VblLnbV@„b@JmL@LnV@VV@¯„VJVnXL˜@nm@aÞ@‚a„k@m„IšmVbXL‚ynLšk°@°aVJnUV@UVVXk@WJ@VXLlUnJVnnƒ°U@»°U„wl@šb„WmUXƒÆ@VLXU@m@U„a@I›mkb™a@naWW@_@WXUV@@U‚ƒ²@„K@I±U@¥kKWLóLlƒa@£Um@kWKXU@mlLXUVKUU±J¯_@`UL¯Wmk@Wa„kkƒlUnƒVUVaU@KUU@mmK@_ƒa@KX@VaUIm±™k„aVKVUkw™@kaƒƒW@kbkL±UUaƒK@UUKVak£ƒ@UmmL@lƒIkmUƒ@Ualw@UƒJkbmIUmn@WKImWk@mUUnÝV@ށnÝxƒKmXkxĉVWVk@kaċšÛ@WXƒJUV@zŽm„VWnbUbVbšLlUnŽ‚lUÒnWV—VWnk@@Vm@kxm@Un™l@Ll@@V@šXnƒškJV„šV@nlVXx˜U@l„n@aš@VLnWĊ¦nxš@lbVKXLl@ރVLƒ„XJl@XXl`lIXVl@Xl‚XUVšK„wV@lanx„zUbVJ@VVX@b"],encodeOffsets:[[114683,35551]]}},{type:"Feature",id:"4117",properties:{name:"驻马店市",cp:[114.1589,32.9041],childNum:10},geometry:{type:"Polygon",coordinates:["@@n@„b°UƂXnVlnLÜ@VLœm@n˜@na@J„„m@k„@lVšVxXX@„V`lLV„XVV@VVÞLVV°„²@lašbnxV@@b„Lšmlm„_VWnIWUna@lšLšbnV°ƒVL@KšV„LVUVaVLXK@mÆXna@wVm„a‚@Xw@KlL@a„@Va@wUkaWnIVƒla@Kn@Vn@VUl@nKVn„J@LnK@aVkVUUWƒ@VakUVanI‚²X‚W@UUU°KnUVLl@XaVK@ašU@KUI@W@_lm@KkLUKV_Uƒ@»@UVJ@XV@@mVL@K@U@Kk@VwUUm@kmWL@VkVkzƒKmb¯VÝI@WUkÇJUIUWk@@klK@_km@UVWUUW@kbmKUXƒaƒV—amLmK@namaXK°VakU@mU@@aƒa@UW@kkU@U`m@U_mVkaUVWUkVƒL@lmX@ށLm@UxVlƒUUl@zaWJXbWLUlmIUƒkLmWƒ@@z@VUVUšUmÝ_kVWŽ@nUVUlmIklmIkJUkƒl@n@Lm@؃IUbm@UJUUVU@mmI@UU@k¥mUk@WmVmI@VU@klmLƒ™k@mbkKmb@WkƒKUŽVnUnnxšW@UVLUbmJ@bk@WbU@V„kx@V@bVbkV@V‚@‚—XWbUWm@kb„¼VLn„lJlb"],encodeOffsets:[[115920,33863]]}},{type:"Feature",id:"4116",properties:{name:"周口市",cp:[114.873,33.6951],childNum:10},geometry:{type:"Polygon",coordinates:["@@lšnb@xlJ@UnLlKXUlJl_„KnV@xVL@bkbVVUè@šWb@„Ubmš„ŽkšVšmbX„VJnUl@„a°@@b„LVbƒlXx˜InmnLVw‚anJÆw²IlmnXVl°VVbÈaVb„@lkn@VWnLlUVmÞUUklƒkƒVkUaVaVaUw™K@kkaVWmw„_„‚l@nU„VVb@b„aV@VV@zXJl@@kl@šlœk°WVnÆbnbUšVJ„Iš@VKVm@k™K@_kK@a@aU@@wW@@k@aUW@IUWVUnLlUlVXKVwmk@W@—VWa„¥@k@lnƒUIÇKUaU@ƒUUVmIUV™Uk¥ƒVma@¯k@Wanwmƒ„@@n@@m@UIVƒkUVamUXWƒaV™U_™@ƒmUVUImW@aUIĉK@VmI™b@lU@@n™JƒkU™@KƒIUmmLk@UVm@UŽm@@LkbU„mJXlbV‚@xUbƒ@@bkK@LWx@ƒbUn@xmbÅW@nWLUKUbUVƒK™U@LUK¯„mU@šVV@xULUŽVL@bU`WšUz¯aUamKUaƒ@@xkX@x"],encodeOffsets:[[116832,34527]]}},{type:"Feature",id:"4114",properties:{name:"商丘市",cp:[115.741,34.2828],childNum:8},geometry:{type:"Polygon",coordinates:["@@XVl@lLȃ„@VkV@V»UanƒWX@VaÆÇô@ÈaVX@xVJXUÞU‚aVLĸbXKl„V@šm°Vn_ny˜XX»mUk¥lK@a„_@yšInaVKVa°_@WXI@ƒ@K‚VnIlbnaV@„l„@‚a@_w@ƒlwUKm™Xa@UV@š»Vƒšw@kUKVUUm@w±VUXUKUwmJUUƒ@km@@±mXkmUI™@mm™KUwkbWakLWaUIkJmŽƒX@l@@VUX@JWbX@VbULWbƒlUVULknlV@bVJk„mb¯KknWmk@@nmVkx™@ƒVmU¯KUnUL™@ƒJUIV™maÅaUm¯X›l™kk@@lk@WI@yUUU@ƒb@aUaƒUmVk@ƒƒ`nxUXlb@lšLVxUbUbVbUll„k„VlÝVUnkVmKUXm@klƒ@ƒnUx@xnxƒn@`VX@V²x@V@b@„Wl@zU`VUVVb„L@Vƒb™W@bkXllkLWV@V„@VVÈwlVœ@@X˜K²Llb„WnnÆL@VnJWn"],encodeOffsets:[[118024,35680]]}},{type:"Feature",id:"4112",properties:{name:"三门峡市",cp:[110.8301,34.3158],childNum:6},geometry:{type:"Polygon",coordinates:["@@WKUmUI°ƒU@@UmU@KnK@IƒaU@makKUa@_‚KnmVU„L@a‚ƒ@IXm@KWkkKVkUU@aUW@UUIVaƒymwkbU@ƒx™LVUWWkk@WUkJk_WWk@WI„ƒUK݄k@WKULka™@mwĉ¥mXUK™@@bƒm@k—VWwkU@m™UUƒlI„™Wm@™@Uk@@KškVmn@lwn@@Ul@Xm˜UXUmVсkmkV™KUaVamaUXnƒ‚@ykLUKƒ@™WwKmKnUm@UmƒƒaU@mUk@kL@lƒxċxUnkVmnXxWb@`kzWJ@V—LmVUn™lmUL@lW@Ub@VšXUbš`VLUbUJ@nmnUlUUm@@bUJlnU„š‚U@lxkbƒ@@XƒJUnƒ@kb¯VVVmlXXlJlzn@VlkVW@bkK™bmškŽUbVb„lƒXVxšKÈnšwÞlĊKlšVnKlwX@lL@xlUnVn„@šl@lmX@ƄÈb°¼ÈwVJlx„_°xšašlšUÈxlUnbVxnL@lllšbm„n@nb‚@@V„L@V„@@„VLšJnIVVlKnV„_"],encodeOffsets:[[114661,35911]]}},{type:"Feature",id:"4107",properties:{name:"新乡市",cp:[114.2029,35.3595],childNum:9},geometry:{type:"Polygon",coordinates:["@@XVlL„K°bUblbUbšl@nX@W„XVVKVkš@@Žmb@„Ubn„W`kL„LƒV@VVLnKlVXIlVš@@a„@l£nWlƒkVa„@°bnUlLVlna‚bnUVUXKlU@ƒ@lk@a„I°y„@ôkUU@wšmôšnkWakml™UkVmkUlmUUm@nkUKWanamU„LXW@U‚VnUln„`l„œblL°KXV@ĠJ@L°„šJšUVw„anK@UUImmƒkK@¯±Um@IVmUmmÅnWaUK¯aUk„w@W±kVƒx™U™VƒwƒnÅJUIWaÝJóI—bm`ÝbÅImJUI¯¥¯@mU¯UƒJmnUVóUkl±V@zXl„bWVXL@bm„mº@@XmJUXU°llk„@nWJk@U„@¦U`m¯ŽWx"],encodeOffsets:[[116100,36349]]}},{type:"Feature",id:"4104",properties:{name:"平顶山市",cp:[112.9724,33.739],childNum:8},geometry:{type:"Polygon",coordinates:["@@l¤UbVL@V„LVb²VlKlaX@„„lbš@lxUVULƒbšln²VJUbW@@L„b@`nL@nVV@LVŽUbUVm„kVl„ƒlXbl@Xn°ŽVK@_°`²IVVV@VUVJnInaWK@Uš@„K„LÆ@nmlXXWVUUw@klKVa@knyVkVanI‚JXUl@XbVUl@@aša@mXk‚bnK@UlK@UUUVaXaWmkUm¥n—WmXaWaœkl@VmÞb„KVL@aVI@mUwVm„@KōméUL™KVaUk@kUK@U˜WXI@VlKXU‚@VVnInVV@VLlK@UUƒkKU_@ƒWWUwU™@klƒn@ƒƒ@Imb—@@m›nUKÛ@mKUkWVXxmbVLXŽVVU²VV@xÅnmWmLU@kbmJ@b¯š™IUb™JƒUUxVl@z@bU`W@Ub¯nUJUbƒ@WLUKULkU@aWKƒ@aƒbmL@ƒlmUk@@bUL™ƒWJUI™°@ƒŽ¯aWLk@mbUb¯b"],encodeOffsets:[[114942,34527]]}},{type:"Feature",id:"4101",properties:{name:"郑州市",cp:[113.4668,34.6234],childNum:8},geometry:{type:"Polygon",coordinates:["@@@nWVUKÅ@W„nVnI‚ŽV@œkƂšwV@šnn@lxÞlnôJ˜zXJl@nalUČVlƒl@²UlkôVVUnm„I°VnV°@°¦VJnIÆJÞan_VmU@ama™@kU˜¥kaUklw@UIV¥kVUI@ƒmmUÅmUlƒwVU@amU—JWbUakVƒ—Vé¯Im`ƒk—@ƒwVWmLkU¯ŽƒXkWmLmx@UUƒbm@@x™J@LbW@UUVWUkVKƒ@ka™IUamKUkkmmLƒUkJUVWXkWmnÅ@ƒKƒL™@@VXLmbmJUIUVU@ULWVkK@nWVXL@lVn@¤„b‚kôKXKlL@¦²V@JƒL±@„@VU@WV@X@`XXmb@Žšblaœn@Jƒb@V"],encodeOffsets:[[115617,35584]]}},{type:"Feature",id:"4105",properties:{name:"安阳市",cp:[114.5325,36.0022],childNum:6},geometry:{type:"Polygon",coordinates:["@@°kVaV¥kVmUkWkWVkVKUwkkmKUU@a„wWWXWakKWkXmlašIVmX¥ƒU@a„@WnK@kƒƒ™V™I¯ƒ@KğI@WU¯LkK›akƒƒ_kmmVU@VWXƒKnVmbXbVLmln@VVknlVUnVlkšlnXbmlmlXblnÈlWbn@@nšK@V„L„bVV°VVzšlnš@V™xƒI™b™ŽU@WLUa¯V™UkWõ@¯kkmxk¼l‚„XUlVbVLnlULmU@lƒLkVUlƒX@xW@¯mUƒ@UmIUW™L@aXa˜kU™¯anƒWk°@k™kKmmUIWaambUkkKmV¯aƒ@UblŽk„mXk¤ƒ@@b™@UbULWVnb@lUVVnmšnVVU„J@bWXX@WJkL@blVU°UV@XlWnXUbW@UVkVšVWbnLUJWLUK@Lnn@blVU‚„nUblxVUVJXU„a˜@Ub„LnUVV@mVIVVn@UbV@‚XbmbUV„_lVXUWanJVI@WkI@WVIVU°WXXl@la@mX@lLXl‚kVbœm‚X„ylIXJV@@kšKla²UVa„IVyÞb°LlVna@UÆKnLVbšK@anwU™"],encodeOffsets:[[117676,36917]]}},{type:"Feature",id:"4102",properties:{name:"开封市",cp:[114.5764,34.6124],childNum:6},geometry:{type:"Polygon",coordinates:["@@lUVbXa˜InV@bUV„x‚knVVÆnn@„VJlUU¦VJ@kxVllb—¦lVš@nb@bVŽUn˜aôJÞIXbVJÆI„m„xšUšV„w‚U²l@XƒxVl°bVLXb‚`XklUnmVblLœ@lmšx°LVK@UXIVašWlL@Ukƒ°KkVaVUXmmI@UÅKmmƒXka±K—L@W›@kUÇxUUƒ@@UXUlKkklW@ašX„a@UƒKUaVUUV_@yXk@ƒ@a@U±w@UUW@_„mmw@wVw„mUaÇbUa¯UUkmWkn±JÅxmIbUxmKmn—JWw„kUaƒK@a¯@ƒbk@mVUIWƒ—Lmwm@Ua@WJUb@LUl™@UUmLUbWJ@VL@VmXWWzUJUꄘ"],encodeOffsets:[[116641,35280]]}},{type:"Feature",id:"4108",properties:{name:"焦作市",cp:[112.8406,35.1508],childNum:8},geometry:{type:"Polygon",coordinates:["@@V@VL@x@bXŽWV@XkššlUŽWX@J„@nI@KlL„KšUVaV@œJlL@KUk@KÞL‚l²_‚@nWlL„UVVš@nLWVUJVn@anV@a„wÞUVLVx„b„@lW„@lbXn‚Vn@@¼šL°mšKVn@bnl@nVK@blb„L„W„U@VWLXV@nlKn@lVVbXw°nV_@¥Vƒl@XI@mlƒkkV¯VWnI@W‚@n¹nƒ@aWKXUƒaWk@yk@k„ċUkVmbk@WI—yóImÝkkwm@™mU@™xŁ›lU@mJƒX™ak@ƒx¯V@¼¯Vm„UmmIkVWK@UXIl@UWVUU@mVUI¯b¯@™lmKzWKUa™nƒJ@nƒlbÝ@@b"],encodeOffsets:[[114728,35888]]}},{type:"Feature",id:"4110",properties:{name:"许昌市",cp:[113.6975,34.0466],childNum:6},geometry:{type:"Polygon",coordinates:["@@lI„VnKlnVlnLVbšJlb„@ULVlUXVVX@‚a@KšI@wn@„aVV‚@nwnKlX„W°lVnKUX„x˜@„ln_°JVIXy‚XnW@U‚K@UXIVanKVVš@Vk@KVaXI‚@Vbn@nx˜KnaU™l™ƒn™Va@ƒXa@™VçUUla@aUK@wmUƒLk`kIWVkLmK@V@XUlƒn@JXV@nm„™bU‚óIƒmUa±@@ÑóVUUk@UlKVU@akWVUUlUUaUK@UUKWbUkÅJ@XWaƒ@XbmJ@nUJ@bUKƒLÝaUnk@›lXbWbXnm˜n¦lVXnWbUbVV@VkL@VmLaWl@n™b@bk@UVWak@WVImJUbUlmz@lUbkL@lVx"],encodeOffsets:[[115797,35089]]}},{type:"Feature",id:"4109",properties:{name:"濮阳市",cp:[115.1917,35.799],childNum:6},geometry:{type:"Polygon",coordinates:["@@lLXbW‚XXƒx@bVVnLllVxULUl‚XXlVlUnlŽU¦Ub¯l˜nœK@V‚bVb@šXbVL„KVxVVnIlašb„a„¥lU@wnalLnVVlVLXnlWVXn@@lVI@WnU@mƒÅW¥—aW_k@WwXy@kmƒ@wU„mš„š¦šlUxVLV@UwšJ°xš@VX„@Vb„@š`VX@VX@llšIVbnJlI„bšV„l„˜J@ƒmѯLóa@ƒƒKUa„k™ƒ™Xƒ@UK@wU@ƒlWUUݯImW¯aƒLUKU@ƒkƒ»k@mƒwƒa@UnKWI@ƒUU@akVWK—k@a±ƒbóUWKXUmk™KUmLƒbUx„„@lmLXŽƒ@@b„VW¦Un™JkbWnXl"],encodeOffsets:[[117642,36501]]}},{type:"Feature",id:"4111",properties:{name:"漯河市",cp:[113.8733,33.6951],childNum:3},geometry:{type:"Polygon",coordinates:["@@@Lƒ‚UnVxnIWa„@Xb@WÆIVlXaVL@VVLVbkVVŽUVlX@bUVkLV‚l@VVôU@Ò²@Vb„nôJVšanƒ@mWU@I„mVk@WkI@wmak™@wlW@w„@VbnLVb°bVyX™V_@aUKVVK@wUU@™™a™K@kmbXVmJUXƒ`kn™nƒK@aU@mw™akb±@¯ƒUUÝKUUU@WU@VkLUKU@mUmJUU@WVkL@UWJ—X@VVL@lVlUbšLVKnêÆŽ"],encodeOffsets:[[116348,34431]]}},{type:"Feature",id:"4106",properties:{name:"鹤壁市",cp:[114.3787,35.744],childNum:3},geometry:{type:"Polygon",coordinates:["@@ó™™n@xVVólƒ@¯zƒJ@bkl@@„kVWLUVmVXbVJnnlLlš¯@Xlm„°bVš—lWb@bšKVXnJ@VV„°nX@@w„WVklU„K@knVVKmkUKUaVkƒWkl»nwlްlö@lXšV°UVbXKV@šša„Jšw@Um™™kUy¯UUUƒaƒK@U™L@mm@XaÇkkmWank"],encodeOffsets:[[117158,36338]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/hu_bei_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"4228",properties:{name:"恩施土家族苗族自治州",cp:[109.5007,30.2563],childNum:8},geometry:{type:"Polygon",coordinates:["@@VK‚bX@lbUVnL°„@VlVnUl@VUX@„aVƒmaXƒlašUUU@wmaVUn@Vƒnmmk@m™U@kna™aU¥Vam™X_@WƒU™mW@_kƒVaVKnL‚lœ@VVal@k¥@kUW@kUKVUlUVсW@kÇaU»ValmkUVUVak™@aƒV¯_@W‚UkmVUlU@aœƒƒalI@akkVWUaWXUWwœWVbÆ@„„l„alIVK@U™m@UU„W@al²a‚¯UağÇm@ƒbkk@wƒ@@W™aULmxƒIU‚™ƒb¯@U`UX™JmL¯aƒKX›WUL@aknmK™@aWUXaWm@I@UÅmVU@™™aUV@b™VƒI@WkU›bXkm@VakwUKULWKXmJ@XUK@ƒmL@KUwVaUI@KU@mmn™mXka@»V@@UUaƒw¯yVk@ƒUUVmmkÛÈU@mWUnmx„šmlUbV¦UlbWVUL@UUƒ™IUmÇKV„VbUVVxkn™LUxV`VX@š„„kJVVUXWaUVVlUnmKUbkI@WULmK@L@LVlƒLnmUIWV@aknƒ`VXUJIVlUVVbUX@¤mbnLm‚m@UXk@mm@Ukaƒ¥@kV@@KkU@aUKWbkLWVkIVŽk@UbVlmX@bU@@mmL@bn`@Ln@llVLVk„@XVVU@`VXUš‚¼k`VULka@VllVIn¤VU@@bl܃bkx@bkL›škKƒn@bn@@b@JUnV`UnVbVKlVXUlbn@°ƒVx„@@b„nVbUllVn@V—VK@UnW@UVUšlnk‚VÈޚxVb„VVI„xVaÆ@@aka@UVaU@@a„k@Wl@nbVIƎ@Jk@„L@VlXnlla@VJnw@UmwXU@aVK°ÒnllnLlb„xnKVaV@l¦²nVl@llL„x@XVVœ‚͐š@našx@U@al™XUVa‚LÈþV°XxWXkK@šmLnlUb@b‚xnLVlVVkb@UJ@xWXXš"],encodeOffsets:[[112816,32052]]}},{type:"Feature",id:"4203",properties:{name:"十堰市",cp:[110.5115,32.3877],childNum:9},geometry:{type:"MultiPolygon",coordinates:[["@@@a@w@kV@nbVK@ƒnUla„@la„Ål@nlVakwWX@WkLšaVmšwV@anK@UlIXmWkk@@mmLkWlwk@U_mKXwWK@U¯K@UU@ƒVUa™kmƒkI™yUUVUmanU@mlwkƒ@_mWXaƒUWU@ǃ@U@aUaVwUKUIƒVkK@UWIXƒmaV@k@Vm@UnwlƒUamk@V@„ULUamxUJkU@Iƒ`WkkK¯XWak@@W@IUV™LWJkXkaÇVUKƒ@kUmbmUUƒUKƒbkKWUkI@ƒkKÝ@@aƒUm»nI@mƒU@UnWV_@aUmWbkLUl¯b@a›kkk@WkkJm_k@UV±@J@b›nU@@WÝIUJVbXL@nlJkx@„Wn@VkJmb—LmUƒ`VbUL@xVn„@XVƒŽ@„mVVnnJVbU„ƒx@„V„nVUbVVƒx@šn„™bUK@bƒ„@bƒJ„šm²„VU‚lbXzVJV„„JVbn@@Xmb@V@bVJÈ@‚Vnkn@°aVVV@šX„KnalLVmšUnnVKVlnLWlXX„Klk°š™šXŽWškLUVVV@nU@ml¯nmbk@W`Å@mb—LWm¯UƒxnêVèk@mbƒVƒnUK™@kKmXk@@JUI›lÛLllnbVnlJ@LULnlÆaVLnŽV@nkVJ„@lkô@²bÆm°w„L„WV@VXšKšVXI@W°ÆVšK„b°U„JVIVV„¦XKVL@l‚InaVÝnUl@@bX@‚™nmVL@lVL„lVLVUnbVW@xXn˜bœU°¤V@š™„a@kWKUUn@VlnL@UV@Ü»@mX@V_ƒakaÞ@VK‚¯@kkW"],["@@mUkUUm@nllVKXXVK"]],encodeOffsets:[[[113918,33739]],[[113817,32811]]]}},{type:"Feature",id:"4205",properties:{name:"宜昌市",cp:[111.1707,30.7617],childNum:9},geometry:{type:"Polygon",coordinates:["@@°`„U@blšUbUVlVkn‚ŽUbV¼Èb@l‚XUÒkVUVVL@lVX@ll¦k@UbU‚›@kmKULUbl„@`nXšŽ„V@XW`nšUbV¦šbmb@lšV@nnlmnU„m@UVnb@xVV™VkbW„nb‚VnVa@an@UaVU‚JXnWlXX@l„¦@ŽlKÆX„bX‚V@VV„@°¯°xXx‚XV@nV°UVWU_VWXkmaVnWVkn@lln@lb@UVLXWlnX@˜aXUmaVK@UXU„U@WVI‚W„XXV‚U@¥VKœ@‚Uގ„„‚a²LlV@kV@UanKma@UVUnK@UVLXyVL‚knJ@UV@@UXKWUXaV@Vb@mVLnKW„m@aUUm@@UkK@Ula„LXKWaXI@alKlmUk@wVKXL@m@WWn@UVa@K@wna@aW_XWWkXbVW@k@U¯WWwka@UUaVIVƒkU@m±@U@@wVKkaš_@VV@XUVwU¥‚šyUkm@V±ÈUKk»ÇL„m˜mLk@ó£kmWwƒm@U„IkWKXwWU@ƒkLƒwkbmaƒbkK@VƒLkmWIUKkUUƒÇIǫJ™XÅJULVŽÇLUVƒ@UK™@kI@WVI@UaƒWmXVVUL`±kÅLmKkƒƒkƒÅ@Ua›XXxWVXŽVbUXll@bkJ„b›„@bkVUVlnV@X"],encodeOffsets:[[112906,30961]]}},{type:"Feature",id:"4206",properties:{name:"襄樊市",cp:[111.9397,31.9263],childNum:7},geometry:{type:"Polygon",coordinates:["@@@Xl@Xb°WlLXl„_@JlVVInwVbVK@ƒ@UnlVbk„mx@VUnl@U@nbW„XJ@VlL„UVJVLUxVb@b@VȄ‚@XV„VWbnX@`l„kx@nmVnbUVVVšzlJn„šlVb„UV@@V°L@VXLWxnLV`l@kxlXnK@nl@XlWn„`Xnl@@UVa@VÈKš£VLVanW°U@UVU„@„`VIn‚mV@„nV@Xa@aVW@UšalkXKšblI„yƍXnlJXbl@@VV@nklU@`„nVK„LVKVb@V„U@UÈK„UVKšIlUX@V`lIVbn@nblVVmV@@XXJšUVV@knKVn@`@X‚VnK„wlLVmUUU@ƒU@aXL@WlU@UUW@UmU@KkLWaXkWmXUWm@U@ƒnk@UmK@U@UaUVUUKV_@al@namWUI@KUƒK@aV@WUIƒbƒ¥ULUJkIm™ƒK@U@K™V@U@a@UkU@K@wVaUwlU@mUƒULmKUkV@@anIWmUK@I¯„mKkl@LUb±lUakLmk@WwUKÝVUIm`¯n@Uk@makJU_@ƒƒJma¯ImwUVkKƒb™aUÅ@wWaU@VU@mXIVmmUkJkwm@mIlUKWzUK@VmLUV@VnbmLVbU@@lkU±KbƒƒÝV›@UL@¦VWUƒWXUJ@XƒVWV@VULnbWV—bW@kmWXUK@Vkam@kkm@UlmXUŽnbWlUXV`UX¯VmUU@Ul@Lll@nnJ@LƒnWmbmš@b™`ƒš","@@kUUm@nllVKXXVKmU"],encodeOffsets:[[113423,32597],[113794,32800]]}},{type:"Feature",id:"4211",properties:{name:"黄冈市",cp:[115.2686,30.6628],childNum:10},geometry:{type:"Polygon",coordinates:["@@VVUnWVXnVJ@„‚U@V@VXŽV@@IVJUnŽ@V@L@KlIVlVanLVbnVlI„ƒn@@a@Kl@@I„JlI@aXU@KlK„kVblJXU„VlU@V„bVkVKXn@VlxVa²I@VlVUxln@bšJXklaVWnLmÅ@y@k@ašI@W@aXIlVVaV@nnlKnLVW@IUa@a@K„UVVlI@wXKVV@IUƒla„@lUXwWƒnƒnalLlxXLll°@XwVKVaXIl™nb˜@nln@Va@U@k°ƒUmÆUVaXI„JV¯ÇUmmkU@WaKmakVm@U@aVKkkmKkVmIkǰ£@aUUVaVVnKlkX‚mkƒ@ƒlUVaX@@Um@‚™UmlUXV„UVU@w‚K²¥Ua@I@UV™l@U™V±UIUǰ»VkUmVI@a@U™m™ĉ™¯V±bŹĖğaÇL¯lmŽkX@‚óĀ@ŽmšÝêb±WkLƒn@xXx@Ž@b@V@LW@UbƒlţXƒ`kxWnXô¯¦ÆV@L@JVLƒxkK@V@bkz°l‚lXz@J„UlVla@XUV„bVKXnW`XXV@laVV@V„X@V¯xƒx@xULVbUJ@n@LU@VmmakbUK@b™IWWUUVkUmkLm@VJkb@nUJƒ@`V@kX™aUaVmmLkUmJ@Uk@U„±lkzmJUb@b„VUxVXU¤ƒL@JƒX@VlL@JkLUVU@mnUl„¦@V"],encodeOffsets:[[117181,32063]]}},{type:"Feature",id:"4210",properties:{name:"荆州市",cp:[113.291,30.0092],childNum:7},geometry:{type:"Polygon",coordinates:["@@ÈJV„lVVLXJln„K@UlL„anbla„xlK@„XVWxXLlƒJ@V„nXxlnô¤l@nKn—‚ƒÈKl¼VL²Ç‚Un@Vl™zŽV¦UxWVU@@U™`lbUL@xV@²@@nlVU„UJVb@VlbXx°XVWX_VKUwVKVa@UVKUUVk@KnblaUU@wnWl@UX@lÆ@@a„IVmUk„™šxVJ„U„bܙ@Uk@WWnk@Vƒ„™Vm@I@m@Un@m™XUlVlUnJ@knJVU°@@aÆLX@ƒllL@¦nJV@XblLVa²U@UlWš@VX@`@LV@@bXJlIXml_lJœU°b„KÆLnVVl‚@ö—Vƒ‚mXaVIĢllUlVnLVlX@@b‚ašnnxšV„L‚bn@°ÆXmmkĉƒ¯w±™™™Uċ@KÝÅƧŃÝ癙Uw¯ƒm™¯k@W‚kV@¯UIUJW¼kb™Uƒwk@W`@¦Uônb@VƚlÈ@VU@ƒƒ£UWWnUÆUnmJkUÇ£VWUI@aUU@WkI@Uƒa@JW@k£kaWVUKmnkKƒb™kkVWb—VmUUmwU@kk›@UakUUa@V@nlx@lUb±lUbnnWLUyk@UamœUK™@mlk@Wb@VXL@x@xWI@a¯Ž¯V@bVn@LkKmL@`XmKmVU@@bkL@V±bk@Uaƒa™L™KUVƒIƒ„™W™XamVVbUK@b@Lm@UWkxULWVUnm@UlUX"],encodeOffsets:[[113918,30764]]}},{type:"Feature",id:"4208",properties:{name:"荆门市",cp:[112.6758,30.9979],childNum:4},geometry:{type:"Polygon",coordinates:["@@n@lxlInVUnWJ@nUVV@Xb@xVƚb„alLVUnx°Jnb„I@„V`lInbl@@V°mn_VJÞUVLXx‚@nllKVb²kVa@KlknL°ƒ@JVLXnmJ@bU@VlnLVKV„@nX@lUšKVaXal@VKn@¥°L@Unw˜bnašV@KV@VUX@lVXI@KW@@IXWV@laVL„„KlaXUVVnkVWV@lwXblIXWVkVmšaU£VaUmVIkU@y@WakKUamU@UUK@kmK@w@@mK@LƒV¯™U@WwkmULƒamVVUU@ƒƒIƒbUKUa™kmƒm@UakLmxU@UÒWlULţÿmwkIUm@a‚kÈblW@UVƒUUk@JW@XkWWUkUKUIlw@aUWknWUUmnIWƒ™aUwVaۚƒaƒVUI™wƒšVlUnƒJ@bÅ@@kVWk@mX@xVVkbma@LUlVVUL@VUbULVxULW`UX@V@lUXWaXlWXX`@bmb@x@LUb@VmŽXX@‚@nWKUL@xVlknkL@bWJXbWLƒKkb@VlL@Vn@VV@bƒnX‚mLUK@nUaU@WbXVWL@VU@@V"],encodeOffsets:[[114548,31984]]}},{type:"Feature",id:"4212",properties:{name:"咸宁市",cp:[114.2578,29.6631],childNum:6},geometry:{type:"Polygon",coordinates:["@@ÞÆ‚LČ@šV‚š²š°xĊ„nlWnŎ¯m@aƒK@„„°‚n„Jšwn™VIUaÆJšÅ@wšwV™XW@aV_l@²V°lĊwlaXLšwlUkalVVaX@lVXI@a˜UXJ@U°UU¥VIVKVklanLVa@VÈIVV@nk@aVa@mV_@a„K@klKUa@UnKWk@@lU@@UW@@nUWUwmaVIXƒ„lV@mLXblJ@kV@kk@KU@WƒkUWVÅwkLmW@UmL@lUL™KULƒak@maUUÝwUJƒIb›KUUƒ@š™aWK@kUWVkUwVw@™mÝ@™I@wkW@a›ww@LU¥™kƒJ@nVJƒIkVVnkV›UkyUIUl@xWUkaW@@°kz„ŽWxkLUWmzk@@bVVVš„b@‚@XlVœ@Vl@bVbUn™`Wn—@Wb„VVI@`„LVbXLV`mnU@@lƒL@LUŽƒak@ƒLk@WbUJn¦@lVb@xVb@n"],encodeOffsets:[[116303,30567]]}},{type:"Feature",id:"4213",properties:{name:"随州市",cp:[113.4338,31.8768],childNum:2},geometry:{type:"Polygon",coordinates:["@@„@nš`lw„k„ƒ„UmUVWX@lk„@VanUĠ¼V@@mX@@nVV‚VXLmJVLnK@b„V@@J„@VUn@VaVUUUVWVLV@@Kk_@almaVkUU@WVƒVUVLXmmk@wUaUKUV@°™@kmaUaÈmW„mUƒVklaX@lVnxl@@UnaUk@ƒVUVwVK„nš@VVn@VbVJUknUmmVmk_Vw„KUUm™Vak¥@UVKVIkW@UmIVWkIVƒkmmLkwmVUƒ@LƒUU@VVXL@JmLUbmK@UUKmkKUUmVUaUnÇlk¯™mJUnmLUaUJUaWL@UkJ™ƒUƒ@ƒaklkU@¯@KWLUmUUWVkbƒLƒŽUKkbU@WX@JX@@LWJkUW@UVU@@L™Umb—amx@V¯K@¦mŽULk@WbUb™LkVW@kVVxUb@x@LlV@V@b@VšU@L@V„LnšlJVIVK„¦„aVJ@XUŽ@b„LV‚@LVJnXmbk@@bU`VLUVV‚b@V@VnL@Vml@„@VXnWVXnWlXblK@LnV@VVX@VkV@XWK@b„VV@VV"],encodeOffsets:[[115830,33154]]}},{type:"Feature",id:"4209",properties:{name:"孝感市",cp:[113.9502,31.1188],childNum:7},geometry:{type:"Polygon",coordinates:["@@VnXK@L@°lVlk„b„@„VšlI@VXKVbVIVbnKVmnI°šlŽÈkVmVbnUVVlLnVL@VnLVanK@IWKUUV@„V@KV„nUlxnKlnU„lJUXnJ@VlXUJUL@Vl¦UbnšVVƒLUxl`UnnnmVVlnVK„bšmVX@a°Ý°LšaXJV@VUnKVXVK@LnKlLUbVVX@VwVJVn„@@UU¥V@@UUK@ƒmaUVUkkJ@L@K@UmVUI@JU@W@U@UV@ƒUIWmXUVmUUÇ@UVmIlmnmakK@akaW@UwVUkKVnUlKVwk™ƒVU_WKUkVW@UXaWkUa@w@VU@XaW±@IkbƒKƒb¯L@WƒXkWƒ@UakL@UV@UmVUmL@UXWVL@ašUƒVUUUVU@yUUƒIUa@wUKWVU@kƒ™™Wk¯UkwVKƒLUx™K@nVxUlUUWVUmw@wƒUUyXWlX¦WbUV@„U‚@blbUVVbXXƒl@lVL@bk@lxkVVnVx™¦ƒ`UnkL@V@L@Ž‚@@xnL@lVL@VnVVblLXb@‚@zlVUJVnUbV¤™bUnUlWXkJWakxU@UXml"],encodeOffsets:[[116033,32091]]}},{type:"Feature",id:"4201",properties:{name:"武汉市",cp:[114.3896,30.6628],childNum:1},geometry:{type:"Polygon",coordinates:["@@nbnm‚knJVUÈ@@Uƒ¥VknmV@VUlK@IkK@U„W@I„KV£UWVwƒU@aVanIly²kVƒl@@VnIlVnKUnVbšblWU@@_„‚VI@mlaUIn@lKVnUlVVXXšJ@aVLlanbUnV@@K@mVIUaVK@w„w°w@UƒW@UUUkbU@WWX_WmULƒaVU@WkbkUƒV@IWyk¯kly@a@UlL„wUK@I@KÅUW@ѱUm@wl¥kaƒ@@_Vw@ķƒa@akw@ƒkKW£XVUVwVwUaU@VUU™™xWKkbĉx¯k±Uk@U`@bWXUš™x@x™ÆÅIVbUJmš™xƒImƒ¯@ƒ™Umx™nUVVbnJV„@Lƒ@@ŽkV@bVnƒ@UVULlx°VXlššl„V@XUVL@xVb„JVV@zUVVVUV„™V@bUKWX@VnKUVVnU@@VlKVb„@lX„W@X°K„a„Lla@JX²Wb@ŽUV@@xVbXlWb@VUXVlXLV`Uš„lŽUxkLmVUŽlLUVVxX@lb@blL"],encodeOffsets:[[117e3,32097]]}},{type:"Feature",id:"4202",properties:{name:"黄石市",cp:[115.0159,29.9213],childNum:3},geometry:{type:"Polygon",coordinates:["@@VšUVV@VbUx„aWUœblUVmnKlX@bXJVIlVUxVVVIU‚zlx¯š@‚VbnL@x‚x@UVaXK„b˜@Xk‚WU_Vm²klW„XVK„Žl@nXV@@w„mlK²X‚aÞén™@ôÿ@lWn°kUKmmUљUmm@ƒwkImWU@UakL@bVLUVċ@™bUK@alIXKWK@™nXnKmkUVwƒ@¯b@L„lUL±W™n@KULUaW@kL@lƒL@bU`@nUb@bmlU@UÇJ@UUbmKkblŽUULUJV¦¯V@VWI—V@bWJkUW@UbkUlbkV"],encodeOffsets:[[117282,30685]]}},{type:"Feature",id:"429021",properties:{name:"神农架林区",cp:[110.4565,31.5802],childNum:1},geometry:{type:"Polygon",coordinates:["@@n`lIXll@lœl@b°aVklKXaVn@bU`mX@V„V@nmJn¼„V@bÞ@lL@„lJXVlL„aVLV„nVnalV„@VLÈUlblWXIšKVU@J„™š_‚@an™na‚X„m@KmI@mkk@KVkWWw¯w¯°ƒ@UUU@WƒaÅWkL@ƒ¥@kWWXkWmIUVVbm@@bUbmUU„ƒbW@UVk@mVkU@U¯ƒmKVUkaW@aULƒÆVbƒb@VÅ@Un@VƒLWl¯Lš„"],encodeOffsets:[[112624,32266]]}},{type:"Feature",id:"429006",properties:{name:"天门市",cp:[113.0273,30.6409],childNum:1},geometry:{type:"Polygon",coordinates:["@@@K@UlKVm„_š¥UwUmlUkwl@@aUK@k„kWWUaVUka@aV@ƒVUXaW¥Xk@WWIklm@ÅxmI™VÝUkxkaƒ„@bWJaUL@„W@™l¯UULU‚ƒbƒkV™Ua¯bm¤UnÇUkmUšUx˜b@VkXÇal@bVnlJnxŤĀVKXkVÑV@nwlKVbn@n„šlVbVL„a„J@„VV‚UnU„bVKlnXxV@°š„U@KnL"],encodeOffsets:[[116056,31636]]}},{type:"Feature",id:"429004",properties:{name:"仙桃市",cp:[113.3789,30.3003],childNum:1},geometry:{type:"Polygon",coordinates:["@@VK°VškX@@ƒVK‚bXI@a„ƒlblwÞVšUnJÆwn@lkXJ@X‚WVz„V@xnx‚VXUVVVkUw@mšLVw„KVU„@Um@alU@„@@KUƒmIUaVUšmnwmw™mb@aW@UkmKkUkVġkUJWbnU„õ˜@UkmUÅKƒL¯a›VkIk`WnkJƒ@xVLUVVbUbk@WlXbm„VxnxUblbUV™@@VUV@nVL"],encodeOffsets:[[115662,31259]]}},{type:"Feature",id:"429005",properties:{name:"潜江市",cp:[112.7637,30.3607],childNum:1},geometry:{type:"Polygon",coordinates:["@@UbVxšbX„mJVnXVlmVX@bkxVJVLVlXXWlX@@IVl„V‚U—aVwV™lnÈVVmn£°aVbUš„l„aVUK@mVU@Uš@VUkaVamwUwnƒWaXkl@VaUaVUUK@w„WI@aU@@K@_UW™@kX@V±VUbkKWaU@mI@¥kK„kW@ÅK@b¯@UVmI@lmIkVkUWVnšm@@V@n@JUnƒšU„@ŽmlXXl@@V"],encodeOffsets:[[115234,31118]]}},{type:"Feature",id:"4207",properties:{name:"鄂州市",cp:[114.7302,30.4102],childNum:1},geometry:{type:"Polygon",coordinates:["@@°¥WóXmlw„_ŤW„kVaX@@K@U@a@WwU@mWk@ƒULƒWkX±lUnV`XWl—@ƒaWLUb@Vw@wmKUa@°™kw‚yVUJUUVwkUUJWI@akWmLUnkV›aXVƒbUxUVWX¤lL@„lx@b„b@ĸUx@`„@lbk¦@x‚n²VƄX@"],encodeOffsets:[[117541,31349]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/hu_nan_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"4312",properties:{name:"怀化市",cp:[109.9512,27.4438],childNum:12},geometry:{type:"Polygon",coordinates:["@@@n„‚@b@XnJ@k°x@aVUnl‚UXnV@@VnJWUJV„nIVV°ŽUbVVVL@޲LUVa°V@aV@nm‚UXblLXWVXVmVLVK@an_„`@X@l°„VlXXW`nX@Jmn@b„@nV@Lm`„bUb‚n@VUVl@nIVbUlƒV@LkJUnVV@xVblVUbU@ƒzUKU@mx@xUnn@@WV@lbUb@šnVWXX‚V@VIV@VUnJ@VUz@JWbXllI@VXVVL@ŽVn@„„Wlb@„Žl„XVlL„aV@VJ@XX`„kVwVl@bk„‚bUŽlVXIlƒnLVa„mVwV@@nV@XaVJVbX@lwV@n„@nV@VWnIVVUŽÆ@Xx‚a@I„UUKmk@mVƒ„IXmWUš™VJnUVU@anaVwk™›U@UXa@W™@m_@a¯@@K@UVƒ„bnK@blIlbXa@WW_n@VƒU@¯bmyƒUkUJÇÅ@WU@kWKÅwƒnm°KVkmankVWnXVWV@UƒƒwXkV@mƒ„UlLnaƒVaX@VUn@VnVK@xlnXWšU@a™@@klak™Vw™mUaV@™wmIÛ`m—@mVUXmlIXƒV‚I@K@aU@UaV_UK@wkUmmUKWXŽmVkUƒL@mƒƒU_nK‚™@aVU@Ukak»@U™™@ymUƒ„¯™ƒUUƒVKkam@™nka@ƒmwkLWb¯mkaƒ_VaVKUƒ™IUw@kKmU@WK@UnƒmaULkU@wUalWV¹U@@WUI@WU@‚_@W@U@mƒU@WbbUK@Um@@UmbUwWWkk@WU„a@anUUwlWUwUU@wlJVUnnV@@mnI@m‚K@U@w„a@wUm@_mƒVUUaVUkƒƒƒ_kċUk™VWLƒ@mlU@kn¥W@UwUWV@VÝU@lXLWVUbVLXlVIl‚knmU@VUJk@@„ƒ@™kVmwmVkxU@@XmVUb@xnKVLl@VxUxkIU`@bWVXX@JWL@bkb„¤@bmUUU¯Kƒkmb@V™VU„VVn@@„Vb@`lnœxmb„lUn‚bk„@xU„mV@bmWbUV@VJ„Il@nVUb‚K@nn@VbnJVIlJVkXJ@X@lmx@bnnWVXJWXU@UlU@mk@@llb°x„IUbnJ@VWbXVmI@JVX@bk‚@bWL@JUXUK@U@Uƒ`n@@Xm@XVW@@nX@@`ƒImxU@@JUI@KƒLmK@UÅUUV@VW@™¯kUU@UamVUUmJ@n„xmLKƒkmJkwkKm_mKXU@aƒU@b@Wk@ma@zUJVUmbUlU@™xnXlWlXXblK„¤V@@nUVVLkVš„l@Xb@VVK‚nXKVx@znW@X‚@@lVK@X@JXbWbnn@JUamLVVXIVxnK@aWUX@˜x@VnI@WlI@anV„IVxk‚l@lbXXšxVVVJVInbV@@ln¦ml@XXVWbkJWb","@@XLVKVXVKUa@UUUmV@l"],encodeOffsets:[[112050,28384],[112174,27394]]}},{type:"Feature",id:"4311",properties:{name:"永州市",cp:[111.709,25.752],childNum:10},geometry:{type:"Polygon",coordinates:["@@lxUXV‚lXUVnlVĢ„JVbUXVJV@XUW¯„VIUK@klW@Un@„nl@V`XUVL@l@šVx@„XXW`UnUbšxUlVnUšV„lb@VnJšUVVVInJlUšVnwVklKnw„LVJVšV@nIV@nbVa@KVVVUUa„KV_nVVJ@_VW„nV@n¥lI@anƒl¥X_VKlwVlULUVVVš@šU@VXL˜ƒ@IUmn@VU@wmKXUWU@m²šl@VIXWWkWUkWlkIVamUXamUnmWUU@@Un™lK@XJl@kVUk@mWKXkl@@aVU@UVWUUVa„In`VUVLnw@U@K@Uƒƒ@w@UVmUUƒ™°K@UnV@bV@Xk@KVm@amk„aU£VWUUmUUwm`UbULka›KXU@kVmU™@aV_UWVIn@˜y„XXK@klmV„V_kWVUn@WUU@UƒmaU@™wnwWanUmmXkƒam@UakLmK@b™xUUUU@Km¥Vaƒ¯@ƒkUaVUlm„UU@mUUÇmUk™Uyƒb™bUa™XUWWbÅLmL@V™aL@WWXUKmmk@a@UUK™XW¥kU@VƒUkxmVkUWbUJnVJ@nVJXzWxkŽ@lVbUX@VVL@`mbUnšŽUn™VV¼k@Ulm@mwLƒb@lmLUK@UamƒWkƒK@£Ua@ƒ›UkJkUmbVlkX@bWbUŽVŽnnUVl„@bšbVK@VX@lb„V@nU¤šx‚²„Knblb@x„V„ô@šlŽ@b@l@XWxnVl@„VV@XLVl‚LUŽUXV`šbXXmJU@@bm@UUkLW@UlUKWUUb™wUm™L@nklVVmVXXm@@bUKlÆn„‚XkllVUVVL@nUbV‚@V@nnV@xUn¯U@JW@UX@xĉ@™`m@@LV@b"],encodeOffsets:[[113671,26989]]}},{type:"Feature",id:"4305",properties:{name:"邵阳市",cp:[110.9619,26.8121],childNum:10},geometry:{type:"Polygon",coordinates:["@@XIlJšI„VVK@n@VVVKnLVwVmnLVK@U„@šw„J@wVIƚ°X@ÜȄUÈxll@kn@VwVaXJWXn@@WVL@UUKVKV_U@@aVK„x@U„aV@lk„@XylbUaV_šVnal@W„U@a„I@aV@@aVUl@Xm‚UXWaXml@@kk@ma@V_UnUV™UUWJUa@kkaWLUmk@@LUVWUkJWkK@¼UnWJƒIkV@b@JUIm@Ul™V™m@Uw@a@kWƒXWKUknW@ƒWUU@k™mx™UkVmIUJUU™VmI@UkaUƒV™UmVk™wVaVmX_WW@ƒUw@™@kUKWVU_k@ƒmm@@VkX@lVLUJƒX°WVU@UIVWUaƒIUġmkVUkWUVWkwWXk`mI@¥kUVƒUƒUn±@m›XkWknV„UVmmU@@XƒVƒUk`@Xƒƒƒk@¥¯»mbĉó@mkU@kU™ƒƒ™KmX@˜UnmL@lULkKUƒWUU@ƒbUaUnƒ@Vb@l„¦Ub@l™@UKmnƒKUnl„UVVbUVn„@`Vn@xƒb@x@VL@nmJ@nU@mmUVkI@xVVVxkXVxmV@bƒbXVl@Xl‚XVxna@Vn@@VVL‚aXaV@n„‚@@V@X`V@@XVJ@XV@UºkXVb@xlVVKnbm„@VXLV@n‚lL@VxšJV„ULUb„`lb°nXalKnx@„lbšmn@lbULV„„V°š„ƒnV@zšš@Vl¼lb@VUV@bšmLV`„„@n„KlVnU‚XWVLnnlV@xVLU`VbV@"],encodeOffsets:[[113535,28322]]}},{type:"Feature",id:"4310",properties:{name:"郴州市",cp:[113.2361,25.8673],childNum:10},geometry:{type:"Polygon",coordinates:["@@²zVaVlnVl@nšVk„Jl_XJlIVmnL@mV@VXn@lV@‚XzV@lyV¯²U@UlJ@XVKnVVIXl@UVLV`@n@J„I@mlI„KVLnUlVUVVLXašKVLl@nb@ŽW„XV°KUnVV„L@xVJ„L@b@LUVVVU„˜VXbmbVbn@@lUbm@x@XVVVŽ@@˜@bkImx@Vm@Xbƒb@l°XU¤„a‚L„mnL@bl@@™VUX@VxnV˜anLnƒWƒ¥XKVwnUWXmVIUWÆLVx„L„w@wVmlU@¥XƒWUkwlÇn_Uw„WV@VU°wnU—ƒy@aVškVlnL@lVn„w@VlJ@b„X„x@bVKnb@U@WVUl@@Vnbl@XLlK@aVLVKnxÞn@a„LlmUaVU™ƒm@ÅknUmaUKmVk@m™kk@UlWUkVm@w@kUU@W™U¯™¥@w„Ç@aVIlUV@kUWU@UUm»@k@mKVkUKUwƒaUaUa›@k„kUWJkImaU@UK™@maUzk`@zƒy@XmJkL@UUJmUkV@z›@kŽkVmK@¦UbWL@a@UbmKmwUK™Xk›VUUkmVkw@UUKmL@WUIWa—JW_k@@WmI@mk@WkWULUUVKUUVm@šU„bš@‚nUǃ@U@w„™V@Ua@aƒL@ak„›l@k™UƒJƒwó@@L@V@„™`@œƒJ@xnn™šmV@bkJmUó@ƒn—JW„UUmƒU@UV@Lk„WlnnmVXbmxšxV@nbV„V@XVm@UVlXU`ƒUŽkn@lWLƒW—zm@UJVXU`@bVšUn@lWVœLlbVKVan_VxnVVVUXV¤ƒbnl@bUn@LWlU@@amU@V¯L„šVVUn@V@x„„@V@L@VmxUKUVm_ƒJUbVV"],encodeOffsets:[[114930,26747]]}},{type:"Feature",id:"4307",properties:{name:"常德市",cp:[111.4014,29.2676],childNum:8},geometry:{type:"Polygon",coordinates:["@@l™U™mkUwUyV™@VW@¯Va—VmUU@KVUVUVLnaWƒnkUÓV_@mVU@݄w@ƒka@kVmƒUmK@IkaUamKkXWaUW@WUk„™@@KVU@aU@™L@J@XÇVUKVak_mWkLWakVUbmLUUmlUVKUU@kUWW@UImJ@xkLkKm@@Xƒ@ó݃@UUk@UKƒV™ƒULƒKƒXkWWbkaƒIUƒWU@mUk@WLaUJġ™ƒ@@XÈÆVIl‚„Vnz°aV@U„m@X`@XWbkakJ@amLƒaU„@V@L°@@bn`š@@XWb@VœVlšUxmb@bUVmVUI™šXVWnƒJU„@nnlVLƒV@JbWzk`m@UVK²V‚x„k„LVl„@Vn@V„„°xVKVkœVVlUblx@bU„‚Æœ@@nVnUll„kx@VW@@VkLWxUL@bÝ@kKkVõV@bkXVVUVƒ@ƒVkUkV›LkV™a™@@™ƒ¯xUxmX@JVb°WXkK@Vm@k„Vb™bn¤‚xUXkJƒblxnXÆK²l‚_@Wnašn@ŽUL@b‚JnIlV„@lUœ@@¯ô@lWȂIVKVm„U@aXaV@lwVXn@@K@UVKUUnU‚bn@lWšX„ƒlJnUšLšKV@„„l@²a@UlK@aV@naVX„WV_nKlL@KUm@a°U°@VXL@a@wWmXal@„k„@VLn›V@@bl@VnX@mwVa²aVU@mk@"],encodeOffsets:[[114976,30201]]}},{type:"Feature",id:"4331",properties:{name:"湘西土家族苗族自治州",cp:[109.7864,28.6743],childNum:8},geometry:{type:"Polygon",coordinates:["@@@KšL@wnK±nƒnm‚—@WUk„ƒÜÈn@n»@mVamk„mšU„„l@V™nmmU@wUan¯VKšLn„VWlInyWUœI@WWk@KXU˜n@mnUmU@WœƒmkV@ƒkXašaVaUm‚Ikƒƒ@kaƒX@ƒUm@UKWU@UkJWkXa@IVy@UmIUVU@UJU@WXWmU@™VakaU@@Xm@Vm@wnwV@VL„yV@VakUUa@wUUVmlI@K„UVkUamJk@VU@UmVaƒan_@KmUƒ@@anm@ImWX_WWUk¯ƒ@k@Wƒ_m`@bULUKUnUWWXkKWaVmnU@@b¯UUbVޱK@UKUUVa¯UUmJUƒVIXmI@UU@WmVmkUV@b¯w@lmI@W@aƒ@m¯LXbmJVLklWL@V@XXŽmbVVU@@VU²Ul@VlX@bš`Xx›zUmkUVÒlŽ@bXLWxXVlš@V„bkLma@nmVmULVbmVUb@lnzmbUÒVl@°nLV„lJkn@bmJk_ƒVmmkblxÈx@LUb„xVb@V™n@JmLVŽUš@„nV@¦VbnJ@lVVbkx™bm@UxVLV@n`UnVVV„kl°z„xVb@VU@@ÆlXnWm¦nbVK@XVVUVVl@X„KUV@nVL@WnIWŽXLVKVLlxUbVKXVWbn@@UnKVLVb„JšU@aVU°b"],encodeOffsets:[[112354,30325]]}},{type:"Feature",id:"4304",properties:{name:"衡阳市",cp:[112.4121,26.7902],childNum:9},geometry:{type:"Polygon",coordinates:["@@lšV@XV@„mXVlXL„W‚X@l@bVxn@šŽšUVkn@VJ@I@alU„JXIVm@»‚LXllIXVVU@Kl@VnXKlb@lVbXIVVUšmVVU`@nbl@@lXLVVVKVbnXWJ@VXbWxXb„Ul™VK„¦nLVVUVVbšb„K@U˜LnK@Un@VxlUV`UnnL@VVL@JV@VUnxnKVbV@@VšIVUnJUVUl@nW„XllIUa„KVbÞLV¼²`V@VIUwlaVmXa@IWanK@U@m„kVƒVUVaX@lšnaVLÈ@‚¥@kkJUWJUaƒXkaUm‚wVXJ@_lWUU@¥n_‚KkamUK„™@amKƒnKƒbV£¯W@k„aWan@@UnwlJ@a@—@UUU@W‚wn@Va@km@UanaWa—UVƒUUVU@K@aƒKUI@wƒKUUVm¯LWUXƒ@mak@UK™LWbUKVUkUmVUKƒLkJ@nƒJ@I@mU_UK@VWkUJmUUL@WkI@V±VU°kzU@Wy@kUm@UWU@@nmKUnkJWIk`ƒIUlm™k@mUUkUb±yUX@VUV@bk@WlXL@nVlUl‚k@WI@ŽkLmš@VV@XVmnnVWbnVUblJXkVl‚XXlWXUJk@±™@nXVWVnL@xUVm@Vn@J—„WK@U™V™@UUVUVKUkkxULW`k¦m„@bkJm¦U@ƒmUX@`UImUU`ƒLVbUVUU@LUbmaU@mJU@U™UIƒKmxkLUl"],encodeOffsets:[[114222,27484]]}},{type:"Feature",id:"4306",properties:{name:"岳阳市",cp:[113.2361,29.1357],childNum:7},geometry:{type:"Polygon",coordinates:["@@@wUklmUUmU@@UVm@wUaV_mmUKmwkIkJmUUnm@™™@UUƒbUKUƒmÛamm¯xVLkbÇÆƒUƒVUzkVUlƒUUKWLX¦W@ƒVUUUaƒKUbmLKm„@akU@aƒmVaUUVIVWkk@wkƒƒ@@xmLlmÅwmbVlXlÝIWVkK@kkVƒL@VWKU@Ublnaƒƒm@b@bšnW`@XUJk@UUWKƒk@UKƒnn‚@xmLUVm@kbVbV„nV@V„b‚@KnV„LWšXŽÆV̦VblŽš„n„UJWz@ƙVóUVbkV™aÅx@¦lVUbVVknWKƒ„k@ƒwƒK™VU„Å„ƒl@zkb@`m_mJ@xX„mbVbœ@llV@n„@llbXL˜UXalUšl„alVnwnLVKlšVbX@@I„V@blJ@bVL@VVVUXȤ‚VnkVÑXmlbnš‚„VKkÑř@UmaVç@±XUlI„xlV„@VaX¯lUVVUšVJn—V@°°nް„Vxĸł°¦šb²¦lJ@U@aUK@kUm@_m±VIXal@„Kl@„bV@K„K@k„m@UmUUaƒK@_UJƒaXU˜@Xmš_VmUk@WUk›@kU@a@m@UƒaUUU@al@ny‚XXWWwkly@¯n@@bnV@k@mVI‚„œVlUUmlU„JUw„I‚bXƒVaUal@K„b@ƒVKVkXVl@VkUU@ylUœVVaVL"],encodeOffsets:[[116888,29526]]}},{type:"Feature",id:"4309",properties:{name:"益阳市",cp:[111.731,28.3832],childNum:5},geometry:{type:"Polygon",coordinates:["@@„ŽÆxXL@l‚V„@̚VI‚bXKl@nVV@„XVŽ„JlbXalX„W„LVKš„„UVLl@VV„@ôބ@@Wn@lLlK@wnIVJX@VX@lVVUL‚VnkVVnKValUXblKnXl`UbVLÈU@W@IšKV@@bUV@Lš@lƒXV‚@VXXblWnLVblb@JnL„VUn@llb@„ƒx@ÞUV@nU`VÔmlX„mbUKUVUV@LVVUn˜ŽUb@°UXš@U‚VzVxnlVškšVnlVnaWƒ@wnIn`@_la@y„kƃVƒšU„L„xl@„ƒXLlmUUVakU@¥ÆwšblUUaôVšU@ÅXyVImƒ™ƒkUaġ¥ÅUWX™ƒKmU@Lƒa@UmUUƒUalan@VUnK@wm„m‚L@V„lXLVVl@VI@WX_™m@a™¯mKUkwW¥UK@_UWWLUVkUWL@WUIkVƒU@JƒwkLUUmJVI@WkXm@VmkKUIU@mmm_@VUV™@™„kJċwUU@KUWkkW@IWW@km@klwkWVkkU™V¯m@kWLU`mIkmkXm@@`@L@xUKWkU@VL@JUU@mbUKVa¯WVnL@`lXUVkU@xW@UbUWVU@UJ@„lnU@m‚nÈmVƒa@bUL™wUb™@@VkxmUUƒ™UV›K@IƒUƒmk@akm@wmIƒŽkK@b™VWXkm@wULUmm@UVW@Ub„mbkKƒVn„U@Wl„xV„U@UXmWUXmlnbUl¯Lmn"],encodeOffsets:[[113378,28981]]}},{type:"Feature",id:"4301",properties:{name:"长沙市",cp:[113.0823,28.2568],childNum:5},geometry:{type:"Polygon",coordinates:["@@lVUllXkx@lln@‚XX@JlXXl‚V@LVVČxlIšƒš@VU@Un`nnV@VJlLUnn@lW@XUJnIVVlK„x@I„VlUVJ@XXKlVVUXKVX@`VLX¦lxVŽnLš°‚an@„„‚bkmVaV@XL@U„KlU@llLXUÞJWkUknaÆxnŽ‚knK@w„@l„@xllUXUJVVUb„n@blV@bnƒ‚LnKVa„LVbVV„UX@W¥XKVL„VVklUVy„U„VÈÅlaUK°wnnÜbn‚V„VL„aVVš@šn@VmnVlIlJna„@Valkn@na@amwm@„UXw˜K@aUUVUUaVa—wWK@kU@UaW@kKUUƒƒ@k™W¯XWan@k„™mmÅ@@I@U@KmLkaVUƒKkLWVUƒk@UVmU@am@kkk¥ƒUƒVUK™„maUb@ŽUb™I@aƒKkkWm@W¯K¯b@VmaULVxUXlVk@UxVJVbUb@xULƒ@ULWW—LƒĕmxVVL@šVb™KUwƒaŲWwX@@WƒUWLU@VbkV@aU@@VUnmJ@VUn@VƒLUK@U‚mUIk@UÇmU@@UW@J@LƒbUmVI@aUmW@@bkXUx@lmLUbm@UbkJ@V@XmlUbkKm@ma@kUaVU@aUK@mImJUIkVƒUƒVUakbWwka@UWKkLUamKUXm`Å_U˜ƒULmaU@@lUV@X"],encodeOffsets:[[114582,28694]]}},{type:"Feature",id:"4302",properties:{name:"株洲市",cp:[113.5327,27.0319],childNum:6},geometry:{type:"Polygon",coordinates:["@@X‚‚Unw„Ė˜KXXVK„@VK@wVaUaUIVwl@kUVWUwVKnb@U°a°LXŽ‚@Xnll„L@bšJVa@VanbšƒVL„U„V@al@@UV¯ÅÇ@Ummk™w@¯ƒyVwnUVVVUkmWV—nKVUƒa@WXkVKn@lUVU„VVVXIlV°VnI@VlKnV@mwVm@LXKWkU¥wWwƒƒ@k@m„X@KX¯V@VUVa@VnKWkœƒV@VUkm@aWa@wkUWwkmV£VÿXUVL@mVIXaò@nW@ašUš@@am™@aUU„UmXmWUk@ƒƒnUW@_maVm™wUkamaUL@aƒwƒW@akI@UƒxUm@kmKUk™lUŽ@b„zV˜m¯xUVU@ƒXVxm`kÈlxXVW„@¦kVUn@xƒxƒKUwÅKVXUJWnXŽmVUxWL„¦XŽm„mK—bmUUwW@UV@šk@ƒšVLnŽlbLm`@¦VVkX@`WIUށxVnlb„WVbXIV‚lI@l¦Ç@UKmbk™W@UbUVU„ƒl@n@VmLXb@JWbUnkbVxUJUxWXXlWL@V@V@XXJWx„zUVVVVKnXW`@bkIUl‚„nLVJUbUIWVXlWV@XklVbnn@xlš"],encodeOffsets:[[115774,28587]]}},{type:"Feature",id:"4308",properties:{name:"张家界市",cp:[110.5115,29.328],childNum:3},geometry:{type:"Polygon",coordinates:["@@@InWVw°wš„@š@šblUœKlUlV„U„@VUUUlW@aöUlUlLÞ@@aVKXwlK@UX@@UlwkƒVkUm@m›@ÅVƒ@akwVaUk›UUlUL¯wƒƒ@UUmƒ@UkƒKƒlw±UULVn@l_XyWwÅ@VUUmJUXU@@mmƒU@kxW@UaUIWbU@@mU@UxƒnUbmKk„WJkUValƒ@aUkUxƒlW_@WUIU@ƒbkKWUJVnUb™bWb„lU@nl›„@XnVmV@n—mWV@LXl@X›JXVmzkJUXmƒ™KULm°Vb@xnVmnUšk@ƒƒ™VƒnnlUb@nm¼m@Ûǃ„Vl@X˜mnm„²ŽmL@x™K@LUl@nULÆx@V@VXVWbXX˜l„@nLlm@bVKœX‚W„L°bnUš@VaVUš@šmšVw„JnwVK°zn@V‚Vb„a„@Ċ¼"],encodeOffsets:[[113288,30471]]}},{type:"Feature",id:"4313",properties:{name:"娄底市",cp:[111.6431,27.7185],childNum:5},geometry:{type:"Polygon",coordinates:["@@lL„nJ@xln@bnlV„‚„@JœLVUšŽV„nVlw@Uš@VašxVK@a„bnUmÇnV@km@ƒ‚I@VUVVXVaX@@wlVVUkW@_mKXU°‚UbVLnaV@‚V@IUKV@XlVL@w@K@_n@lWlnnJV_XK@l°nšU@WVU@kV@nbVK„V—lƒ@nLlƒ„LXU@ƒlmkw@nW@UKVa¯IVn@@aVUUKl@nXVKVn²a˜ŽXblKnLlmVI@KUU@akLUaVa‚UXm@aƒ@wVUVKnLnWlXl‚n@@U@anUVm@U‚Inm@IUK@UmKVmU_kVUwm@@VmL—K@VƒL™aUaVUUUmKƒ¥ULkšƒVWaXwWa@UXImWUaULUUWKk@WnXbWށVWnk@UV@bU@@bƒJ@bƒV@XkŽmb™UU`VbkaWzƒ@klU@ƒb@VƒwUL@bV@U`ULVL@VUK@Xm@XWWIUbUxm@@lkkÇwƒVÛÇW@¯Å™UJ@xƒI™xƒ@@VULmKUnUxmKULUUm@@‚ULƒU™JkIWJ@b@LJUW„kJWnUV@nn˜Ü_nJšxU@VbšnUxlškb@lš@"],encodeOffsets:[[113682,28699]]}},{type:"Feature",id:"4303",properties:{name:"湘潭市",cp:[112.5439,27.7075],childNum:4},geometry:{type:"Polygon",coordinates:["@@Æ`n_VWnLVblKXL@VlbXxlaVb„U„VlUVJnInJ‚@VL@bUVVb@lnbn@lLVank@W@UlIVan@VanK@kVwlW@aX@Vn@bUJVn„a@K‚IX@@VV@nŽVÈl@VJn@VVL„K@UVm@UnIVm@UV@@blUUaV@XK„V@XW@XxƱ„bVxšLUa@™UKWk™@wmmUalk@WXUWkXUVJVaUImKƒVklJ@aX_mWULUUVUƒyXwWI@W@U@UXKWkXWVwU@±_U»ÝKUaƒLVbkJkƒWmXk@UVVŽmIUV™J@UU@UamLmwUVU@mnJ@VUnmV@b@Vm@kkWmXmKULUV@x„Ž@bWnVUbVblK@bVV@LUJknmKkLWa—±bUmULmWk@VLUV@bm@U°JUbVLX@@mlxkn@„WVƒKk„mK@k„"],encodeOffsets:[[114683,28576]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/jiang_su_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"3209",properties:{name:"盐城市",cp:[120.2234,33.5577],childNum:8},geometry:{type:"Polygon",coordinates:["@@„n@‚°ĀÞ°@¦ULWKkx@bkLWb@lUlVXXJVbƒnUKmxXV@bm@@Xš‚„LޚܦXlVnš‚mzVJ@n@‚²ÞôkƃÞaȰĉ‚wnljÜó„éVÛnĊīČlj‚ĉ@ō@KÞUlU@ƒkklÇÈњÑlġXɛ@UġƒƒaU@U_ƒW@n™@kaUL@VW@kKmkUV@bkbWW@bkzma@ƒJWI@KUKULƒ@U¦™`@XUJ™U@KmXƒw¯KXkmy@aUIWJXXmV@K¯UU@@bVL@¤VLXbV@@JVXVK@„„JVn@bkKmakVVXUVVVlI@`U@nzVVƒb@¤n@@UlKXLVVšI@V@nV@V‚@ÈUx@šóVōšƒkÅWó@mU@bk@Ýwk@WbXxm@@J@zV@kVƒbV‚nLWVUX™WUXUŽWLUށ@Wl°z@VkxU@UVWIxWJkbƒĬ„nW@@bUl"], +encodeOffsets:[[122344,34504]]}},{type:"Feature",id:"3203",properties:{name:"徐州市",cp:[117.5208,34.3268],childNum:7},geometry:{type:"Polygon",coordinates:["@@XKVX@WnIVx@K°Lnll@@I°K„nVašU°x²mlxš@VanU@aƒk@akmV@@w™@Ua@aUwVwUw@w›@UK@£kaĉlóIÇVkޱ@@kUKmVkIkxW@Ua¯UUm@UVI@WVI„JV@ƒ@Um@Uana„U@m‚I@J@XV@XaVlkXƒVaUUWLUyVIXmWak@ƒXkJókƒJUL@KWkk@ULU@Wa™lUIkJmI™mk„VbVš@lV°kXUKWKULU„mb@VUlVnƒb@VV@IVKUUmU@ak@@bmV@xklƒUƒU@UKmV@nƒJVbkXƒKUamLUJ¯UUVmI™bVV—Ll`@LƒLU`m@kXUVU@V„lxUK@xkIWbUKƒx@V‚kVVn™b¯@@U™@ƒxk‚mbkLÇK™b™@@XnJ@LmVklƒ@@XƒlUƒVkxƒakVVb@bVnUbU@@x˜VUšVb@š„ŽnIĊ`šXVVôJš_„K@xlU²Klk„U„@VaVVÈm@kVUVmnamUUaVƒXIVJ„@‚ç@¥nkVLn›„@@XVK@VUX@JVUV@UnVJVLUJVLUVlšnI„b‚KnU@m°™VanI@anV‚KVL„an„lK„blš„KÞk@¦@¤@„VKnLVK„L„KVzlWšLX@VmV@VbnU°@Ualk™˜WXLVU„KWkUUWšƒ@£Wa"],encodeOffsets:[[121005,35213]]}},{type:"Feature",id:"3206",properties:{name:"南通市",cp:[121.1023,32.1625],childNum:7},geometry:{type:"Polygon",coordinates:["@@VJ@bnzWl°L„xnW@LšVVI@Wš_V¥„@VKVL@LXJ„I‚@nbly@aXXla@aVUnllLX@@UVKlbš@@m„XV`V@„bĢ„lkČÇÆƒȘ¯šwnĕVĉVÿšUƒUĠƒŦğlXÑVǵ@±ōLʵ˝lÇbÝÞ¯xk@Çkķé™n¯@ğŽġƴǫ@kVVlUbƒL@xULǂóLUl¤@nkVV°VLkxVb@l™aUXUKWĖklVX@¤UšƒUkb"],encodeOffsets:[[123087,33385]]}},{type:"Feature",id:"3208",properties:{name:"淮安市",cp:[118.927,33.4039],childNum:5},geometry:{type:"Polygon",coordinates:["@@šnźUôÒɴ胚l¦nĖV‚kbmš„X@xVlVL@xUb@bUJVnUx‚šœ„lKVLÈx‚m„zXV@lW@XV‚b@bȚVxnb‚ƒVIXa°L„aÆVVaXUlK@aXIƄVlXKVUlIXalK@alwXLVK@¥Ý¯¯ÿ@ƒmVk@aX@ƒm„īlaXI‚wXJVUV@lw@U¯yb›UaƒUġUÅaUKVknaġm@kUm@wÆIV±nLÆw„ÇnUUkƒ@ƅÝU¯JÝI¯¦Ul@bƒ@@VVL@l@LƒLÅmƒL@b™@UaVaUWmLUKV¹KƒLWKX¥WI@mXk@UmaUVUU@VmL@W™bkIUWƒUmVóIkbmm™@UbVLUxmJkU@bkJWbnXU`Wz™KUÞÈlVb™Lmx@„kè@Æ"],encodeOffsets:[[121062,33975]]}},{type:"Feature",id:"3205",properties:{name:"苏州市",cp:[120.6519,31.3989],childNum:6},geometry:{type:"Polygon",coordinates:["@@ôèĊVnX°¤²„lxƒÈÜ@²x@J@b@X‚`nIUƙUUV@bl@VVnL@L@xƒJ@X@blJXnW@@`XbW„kVƒ@UbVxƒXUxkV@LóxVbUVWš²šVJĸklUǬ@ĢƳĠ°@šmƒī°»ÈÇ¥ULUU±a@bU@¯ƒU@KnImUVWUk™mXUVU@lIVaUUVWKUbUkWKU¥n£WakJUkUL›K¯L™KkƒVIn@VaUƒVUUƒ›UkVk@ƒU@amUkJƒ@UUlwX¥W@@UkVmk@JUakL›@kk¯ÝmJUn@nmVXlmbVVkn@„UJ@±WUxV¯a¯KōbżÇxUxƒšUUlWL"],encodeOffsets:[[122794,31917]]}},{type:"Feature",id:"3213",properties:{name:"宿迁市",cp:[118.5535,33.7775],childNum:4},geometry:{type:"Polygon",coordinates:["@@XbWnUJVzXKVVUbW„klUWbU@@W@IJ@nƒVmbVbn@@V@„UŽƒIUJ@XUJ@VVn°VVbX@lwlJnUVL@l²@lÈUôJĊklb@¤VLœ@@xVxUxVx@bVbš@@xU@ln„mnX˜mXLVmV@X@lxVnVJôL„LXa‚x@b„@@KVL@bn@@m@™@alLUUVaU¥nIV±‚I@mXI@aWWXU@LlUXWW_XWmaUwǙ@aaWUX@@kWUƒynÇwUKkL›ƒ™VwUmVI@aVa@wUKUk@wƒWn™laUmĕk¥„™ɳçóÑŹV™mmzkVmm@a@Ióƒk@@LWU@`—„WbXLWlkImJVn@`nXVbXŽmL@Vn@‚l@nUVl°Xx°U@LVĠ@z°˜@¦UV@Xn@VJmV"],encodeOffsets:[[121005,34560]]}},{type:"Feature",id:"3207",properties:{name:"连云港市",cp:[119.1248,34.552],childNum:5},geometry:{type:"Polygon",coordinates:["@@@‚lzXxmÆV„„@@¦„@l`XnlKšXXm‚KnLla„b„@„xmbm@kL@V@Vl@@VUXšJX„mbš@@„°Æ@èÈzlW°XĢJlÈ`lInbšWV_@mš™@UUķnƒôw°ÆmnaVƒVÛVmĸ»Ģw±Ý@@mUIny™UmWkۥݙƒK™@Wn@@aWUnwVL„mUaWIUWVk@kkJUVWLUkŃWJ@bkLWVUbÅUƒb¯KWbUJ„WXX`WXkV@KWVXX@bWJ@nJU²mJV¦UbVVkK@b@š@nm@@aUK@Lƒ@@awWbƒKóKUIUmkwW@U@UnWK—nmWƒn@b„l@bmVUb™@kw±n¯w™VUb"],encodeOffsets:[[121253,35264]]}},{type:"Feature",id:"3210",properties:{name:"扬州市",cp:[119.4653,32.8162],childNum:5},geometry:{type:"Polygon",coordinates:["@@VUXblVVV„b@xV@kz„V@l‚wVLUbVV@VU@VbUbl‚b@nkͰIÞV@Ɔ„VlmVƒÈÅxmKU²ÅJ@xVn@lĢnmbUlVLÆbĢV„V‚bœV‚aXk‚@VXKVVWšXVWXUmKU„aWaU@™¥@£XW‚UUV@@ynam_VWkUVUna@ÆV@mnkWmXkWU„W@k„@@akklƒlWUI@UnKl¥™I@VVma@a@I@U@a@anK@UmK@ÅVUnJl™kI@aVwka@mVIUW@UWL@WÅbmIƒƒULka™UWƒUxkLUKWlXL@VƒImƒÅVƒU™mĉL™Uól¯I±l@ÒUbVbUVVXUJUnVV@lnbl@"],encodeOffsets:[[121928,33244]]}},{type:"Feature",id:"3201",properties:{name:"南京市",cp:[118.8062,31.9208],childNum:3},geometry:{type:"Polygon",coordinates:["@@k@ma@kUUVmVIUWVUUaVa@Ѳk°Jôk@Wmk¯KmX¯aUakKƒƒWU„@XU‚LXaV@@mUaVUUl@VmkaUXm@ƒWUUna°IlmV™m™IUW‚@Uk@@aV@VVX@„V‚I°»nm„U@VKVan@m»UaU@U_@WlIUa™aVaUala@¯n@‚ƒkaUkUUWKU@mwkUUmmL@K@ƒLmUUVƒKƒVÅImU—JƒƒVkVVLšèVLVU@W„L„V„š@nVÜULVŽUL@bW@XbWbkJƒUUVUxVXmVk@WUUkVmIƒV@„nbnVWbƒJU„kUULƒa@Jma@XkK@VVL@L@JƒLUVU@V¼ƒnXlƒbm@kbUKmn@lVb@VXXV‚UV@b@LVbÆxXbl@@lV@U„VV@XVK²VlIš`„UbVbUlVVn@WXn@@VUV@„@KmbVLXқLkKƒV@nX@VVUV@b™nVllbšmnb„IWVXU@`lLlknVnmlLlbUmVInK°nUƒU@l@VU@Vn@„ƒ@alI„`VIXaVaVa"],encodeOffsets:[[121928,33244]]}},{type:"Feature",id:"3212",properties:{name:"泰州市",cp:[120.0586,32.5525],childNum:5},geometry:{type:"Polygon",coordinates:["@@lUU@@y@In@WwXal@Þxl@@anVô@ÆX„lŎ™ôU@™Vw@ÇUU@@m@U™JUUWKkL@Vm@@£„aUUmyV@@_kJUUVUUWlUnblL@aUmƒI@ƒULUW@IU@WaUK@£UK@aV@°V@LnUWWXIla„VV™@£UWlkXĕVLVWšb@kUalwUKU¯lU@mk£VôKȁVK@w„KVaUkķlUI±™ğ¥ÝUʚ™Ž¯ôm¦ƒĸ™‚@XXK@VVXUJ@nlbUx@blJkšmIUV@ÆnL@VmL@b@b@V@J@bnb‚U@UšJk¦mL@VVJkXk„ll@bƒ@@lƒXXVWlXnml@nÅU@ŽmbUVlVUXn`mb@zU@V‚VWX@¤š¦V@Xb"],encodeOffsets:[[122592,34015]]}},{type:"Feature",id:"3202",properties:{name:"无锡市",cp:[120.3442,31.5527],childNum:3},geometry:{type:"Polygon",coordinates:["@@nLƒÒlxUVkL™am@™ƒkVWUULUxVVVbUV@bVLU‚nnź™ÞVĠ¦X™VUUaôw@KlUVw„WUwVa„@lUXƒWa@_X@WmkI@a@W„I@w@KmKUUk@@aVUšVVÅmJ_@W@a@I±wÛ@ƑÇkw±ƒ¯£mWĉUóçƒK¯VkUWK@XkV¯UWabƒmUa™UUb™lln@b@xƒbXŽWX`@„VxUblL@bn@Vb@`m@XbWnn@l¤„n@xnVlU„™VLÆWœkV@VbÞJ‚_nƒl@nKVU@aU™U@mVk°WVLUV¯bVXŽ˜bXlVn@VmL@x—V@bl„š‚@œnW@X@VVJ@²VJVU"],encodeOffsets:[[123064,32513]]}},{type:"Feature",id:"3204",properties:{name:"常州市",cp:[119.4543,31.5582],childNum:3},geometry:{type:"Polygon",coordinates:["@@„L˜ŽnxUbVVƒL@xnnW‚nn@VVXn@‚yœImx„„°ƒšL„a‚¥n@VkšKVw„W@nX„VJ@b‚@UVn„ƒ@UnUV@L‚b@`VLklVÞn„Æ@VaXLl™ÈJšmmVUK@aVUUaUUVwVKXVlUš„n@šblKVUkw„ÑmKUVUI@±UI@U@WmX@›™kƒ@a˜U@wnK@UUmWk—aWU°aVUUK¯XUl@nVŽVš@bUVmLk@m„`ÝIUaU@›lÅXUKƒškVmU@wƒmk£m@XmWan@@_Uam@@akKVaUw@ƒW_XW„a@w@akmm@mL@UJmnUKƒ@@XnJWLkKUb@„Vxk„WƒL—aWVUImVULUK@L@lkLVVVllb„m@@°kbVbUbšbVbkJ@XV`V@Vbn¼"],encodeOffsets:[[122097,32389]]}},{type:"Feature",id:"3211",properties:{name:"镇江市",cp:[119.4763,31.9702],childNum:4},geometry:{type:"Polygon",coordinates:["@@šVĊKšn„VÆUn„„J@UWKXkVLlKVwX„šVlbVK„„nJÆaš„ķn¥°óÇIkšWKUbÅ@mƒUÝlkUK@_a@KVUVm„@mƒVU@@aUIWƒ@mƒXUx™LUlm@¦ƒb™K¯„ƒƒnw›Jzm@UW@UmmXmm@w„KUUVamw—ƒKm@UbUL@ŽƒVmn¯¼JƒUW@UUU@@bl@@VŽVXšJšnnU‚‚k¯JmbVV„Xn@VWlbUnk@VVUŽVb@nU@WbKWVƒ@XV„„lLVb°bnW°Lnl@X"],encodeOffsets:[[122097,32997]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/jiang_xi_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"3607",properties:{name:"赣州市",cp:[115.2795,25.8124],childNum:18},geometry:{type:"Polygon",coordinates:["@@„`l@Èbln„@„KVLl@„V@bȎlnšKXkVlVL@„lJnb„¦VKVVnX„W@w°@VU„mln„UV`šU„bVUV@„xnKVI°KXKVkVL@al@Xa„LVlULWV™VVL@b„x@VXVmb@x@V™VV@nn¤„šlb°b°KXXWbX`lbXx‚z@x„`VIVUnK„L‚x„WXLVKVbVLVU@wnW°b„@nalX„‚mXVJn@U²mKkVl„U@@xlnœaVmlKnœ@JVLlŽnVššl@XXÆèVlUX@xVLXVšb°W@wnUWmXk@K‚LVwUmUkUKUw@wVaVK@kƒ@WnkUKWkwlmXL@KVUlLVKXmWU„L@ašL@malaVk@aa‚ašƒnXš@VVUblb„Jn˜ƒXa„V‚wn£„K@UWmUk@ƒUaWIV@b™JW@KmmU@aUUUkmKkVKlUU™nKVU„lVaV£Å¥WUUK@UkUUw@m@mIkƒƒUUWƒLƒK¯Uw°¯@wUKUbƒKmƒ@kkKUL@UUKV¥U@manw@k@U@Wm@@U@Wwkm„wWaUU@UUmV¯kwƒ@@kmƒkKkUW@UK@ÅV@XWWkXa@Ul@Va@KVaUUU@ƒaXwla@UkVWaXk@K@lmkUmV@Vmbk@ƒ»XIƒ¥VUkƒVUVU@anKVUƒKUalU@wX@˜™@a@K—@ÝwƒL@ŽUnÇlUIkJmn@ŽƒbVVb@VmnkLƒV¯U@ƒ±l—IWmƒ@kaUI@aÇU@K@KUIkbWbƒJUIUyƒX¯ƒUbU@méUUmUk„WK—xWIkJm@V¥U_UJUwmVkšƒUU@ƒƒƒ@knƒwm@UmkWJkL@n@VW@@‚U@knm@kUml@xÅxƒ@@XUJlb„@VX„JVxn@lbV„@lULnV@VlnV@bWV@bXL@lVLVb„V@blLn@Vl„K@xln@bX@lašLVbnKUVVb„KlXVVkxƒV@nnVUb‚lV@@z—°WWkbƒIk‚WL@LUJ@bUI@b™`@UmI@mkK¯XW™™mUV¯@UUVUUam@@VULWUJƒIm`IUJ›KUkW@Uxn‚WbnnmlXbmIUVmV@Vnb@V™LUKWLnÒVVV@V„UL@„kJUV@bƒÈ@ŽšV°šŽ@XVV@l@xUz"],encodeOffsets:[[116753,26596]]}},{type:"Feature",id:"3608",properties:{name:"吉安市",cp:[114.884,26.9659],childNum:12},geometry:{type:"Polygon",coordinates:["@@lxnb@V@bV@ln@‚n„‚lInš@blVXK‚nk¼@VUKWL@b™L@`UXU`ƒ@V¦XLĠ@lJ„¦@„nV@l°nn@‚mVXnaš@nb‚K„n@l„IVƒš@VanJ@_lKVVnš„L@L‚K@Vn@VbšUVanKlLnbnJVbšnWVnVVanI@‚Vb@L„bVKVanXVbVJVU@aXLll„bôlƼXxVLVK@Xn@ƒxnVVVmb@LnVVKVXV@@mnaVXUVnV˜K@_UaUmšwnKV_‚anKVLš»„K@¯ÝU@›™U@kWlUn™lknK‚VnaUkma@ƒUIUwl»Åw@ƒVwV@n™‚n@ÈXlKVmna@kVw@anm‚@n_WWk@™™mUkUK@Im›kLUn›bkm@wV@kƒlUnLV±m@UInWƒkWmbƒ@¯amX@xUVUKUaULWKƒXwƒKmLUVUJƒ_@wyWwkaW_XaWW¯L¯akaƒ™m£@mUUš@U@wnaWU@Uƒw@aUKšUXUVKUkƒKWbk@@bUKUlWL¯LUJmLƒwU@UVƒa™VU_ƒVkmƒnUV¯@@xƒXmWUUULƒ¥makI@ƒUKUkWl™LkmǍ@aƒUk@UKƒLƒ@kmÇak@ƒ_VlkL@`lbnšlLVanLnbmVÆln@škJlbknmKUbÝmmwULUK@bkLWKULUUma@Kk@UV@L@llbVzšxUxnl@bVLmŽšŽ@IVJXœVlƒLV`@bn²@J™@™V@Xmbñ@WbUJ@bm@@LUĬU‚„¦lV@xXb@blnUV"],encodeOffsets:[[116652,27608]]}},{type:"Feature",id:"3611",properties:{name:"上饶市",cp:[117.8613,28.7292],childNum:12},geometry:{type:"Polygon",coordinates:["@@„„@„V‚š„„I°`nm¤²@bVJUVVXUl@Vmb@xV@XbmVVœ@lkLmbn`VbnU‚@Va„UnbVllUXV„a@w°VW@_VWšLššnVlbšLVbnl„KšnVK@IUW@_@am@™‚ÑUólK@U@WU@VwU@UI@aUU‚aXƒƒ@kwmJV@yX@k‚anƒƒ@mkwVmmI@aUU@aUUW@kVkV@@anKš»„XVWnIVUl`@_„W@wlUœV@UWKnU‚bnްInJl„UV@VnI‚b„Wn@VklL@l@Vn²m@U`kI@bWJƒnV@°VXnJm„XVmx@VVL@bkLmWULUmU@ƒbWXb@llnX@‚xkxVV„nVV@¤nL‚nVxnJVXX@˜ššbn`VI„b„@„blmlLnaV@„blWXnlUnbl@„ƒšKVanUVmm_XK@kWWnašU@UnaWUXa›ƒXamUkKmXUWƒLX¯WakKm™nUWwXa@KW_„aXWW_@WnIVl@XU‚LnWVknK@ImyUUÆbXK„Û@W@IÆUnƒVÝlkVK@mUIVwkUVaUm@aVIVyXIƒaÈwmmk@UnanVUmÅaó»lwšW@kkUVmUK@WKLƒUmWULkamK™Lk@Wa@wk@UU@U@mbUIWVKUXWmkUmVm›U@LkakKƒw@w@U™¯ƒ‚ƒUUn¯l@bmn@xkJWxkL@VkI@mƒkmJUI@V@b@VVxnbWlkÈkVƒLƒbkKmVƒL@V@²nxW‚kLUL@xlKVx„bXmVnšWJ@ޙ°@n™xUKUw±`UImVmnU@kalm@akwƒU@UUJmxU@@Uƒ@kU@Um@@Kn™ƒVm@k™KmkU@@WUnkLWxkVUwmKmLkU™bmKUbVŽ@xUnkJ@n±ŽšUxVXUšWJ@LUb™lUnm@ƒW@nknUJUVm@kXllknVbÆK„VVbš¼V„@šUl"],encodeOffsets:[[119194,29751]]}},{type:"Feature",id:"3604",properties:{name:"九江市",cp:[115.4224,29.3774],childNum:12},geometry:{type:"Polygon",coordinates:["@@WUkVUkmaƒVUb@mVUam_nalK@kU›nUWaU@@wna@UVkUWVUUI@a‚±n£m¯_ƒJ™ƒU@ƒƒƒĉ¦Ul@UV™Km™mLlm@ğ¹m`Uk¯@@UVK¯™@UUK@amkmKkVVUa@UkUƒKƒŽUa™L@VVXUJ™@ƒnƒ@™š™WUbƒnVb¯V@LÅlÝIƒJÅkݙm@Ua™WUU@UmUXmmwVUUKWUX±mUam@kWƒzUaVmÇw@aÅLmKXƒ‚UWKkL@W¯IƒwVw™lkUƒJ@Um@ÛÈWށKUxWkƒaUU@KkLVl@„UKUX±KUb@nVVUbUVmaUlUL@„ƒaUL@‚@nUlWzX`@„V@lx²„@Vlb@bšVÞ@°nl@UxVL@lUbVV@n²xVUVmnUÞb‚a„J@IšV°xnbl@nbÆ@VwnK@VnXlK°xnUlVX„V@Vl@L@lk@W_XK@KƒkWxUL@J„nVx@aX@VVUa˜IXlmL@bVVX@VbnK‚a²XVWƒk°a„@UnV¤nbmLmW@XbmJUbVL„aÞK„L@K@U@aVKlbV@nXlJœxV@VnšŽVȚ„ÞKôbźĕČmV@ĊšŽ²xÆIšV@Þ¦ĸ¼ÞVlŽVÞnxln°Jœk‚LXWVUVUVwnJVI@yn@lXlaXmWI@w—»ma@UmK@akKkXmW@_kaWakKWk@@K@IšWƒkUa„ƒ"],encodeOffsets:[[119487,30319]]}},{type:"Feature",id:"3610",properties:{name:"抚州市",cp:[116.4441,27.4933],childNum:11},geometry:{type:"Polygon",coordinates:["@@°V°UnÜ@n@lnLlV@bšV°L„lnLllVzVVXlV„V@@L@xX@WlX„m@UVƒL@V@n„°škVmVUnKlaXxVbšnlU@lVVnaVI@aX@V„šJš@V„@b„b@šVbš‚@X@lUL@Ž@VlIVm@wUVanLšalVnKnLVxlUXwlKVm@k@Una@mWIXKWUÛVƒk@a@UVWn@@kl@@W„XlW@_Um@UVK@a„LnalInWV@@xnI@¥‚K„—šm@kKmƒnk@mlI„¤laXbVblknV@U‚KXVlUXa‚@@Unw@±mU@ak_±a@ƒUJUIƒVKW_Xa@aWU™šK@mmUVa@IXa@UWmšannlmX¯WKXwVUVwƒ@XUlK@klJXa@kƒkmm@Uwƒw@¯ƒW¯kw@WmbULƒaUUU@mVUU™WmkUb™KmkkK@aƒkUƒ¯¥Uƒl—ƒm@akU@mš@KVIVV@KUkUVUkaƒUWb—„mƒIkaVaUU™@mW™„b‚b@bUlkb‚b@n™K@bƒKXVWnULkKUV@LWKknlxXŽVLml@X„Ž@lULUb@xVxVLVlVnUxK@LWlXnmV@x¯X™aWUUK@wVWUkÅçm`@mn@bUx@lmbUnkLÇWm@mšU@Ux@„Æxk¼VxVJ@„nbVlmbUmLklmškVlX@‚VœšV@°Þ"],encodeOffsets:[[118508,28396]]}},{type:"Feature",id:"3609",properties:{name:"宜春市",cp:[115.0159,28.3228],childNum:10},geometry:{type:"Polygon",coordinates:["@@@VlbnK@b@JšLlUnx±ĀXxÆW„X@lš@V„@@blJ@nX@˜xUbVVUbVV@b—VmnmJœ„@bmbm@klUbƒLmbœš@lVb@xUX@bVVVbV¤@LVV„bXlVw‚LXÜÇn@@V„IlVškUx„x°J@XlKXLV„‚WnLÆK@bÈxUnVb„ylXn@Vbn‚W²XV‚LVVUŽnxWnnV@VVVšXVbn@ޚÆl„IÞJÆk@K°UUa„mVa@UUUš»@wV@VƒkkUKUVW£U@UmW@@aXkVUnVlKVV„UUkVmU™@kWaUanU„VVamIX¥W@@aUaUVW@_mW@UnIVVn@VbVm@bVL@anKVUkƒWK„UXV‚Ikx‚@na„bVK„b@nVJ„_V›@Vw„‚VUVVXUlUUaV@X@VblašbnKlkVaXaƒ¯@m@U„KVUn@WƒXkW@@w@KU@UƒWkUUUykkmKƒk¯K™U@akUmK@k@mmÛ¯V¯U@‚ƒL™¼UKmLbU`mL™xVnVb@`—LmUVUUWmb@nU@UWULmU@KnaUUmU„wmJ¯IUJWIkVkaWVUIUlWaUIUVkKmbUIƒÒlVUnnŽ@VlLUJ@bUX¯@ƒaWVUKUXƒKUbm@UwKWa@a@VkUWn™@Uak@mbX„WJXbm@mL—aWVk@™wƒL@WmanU@knwWmkaWL—KWUXaƒU@¥l„UVVVbnwƒ¥nKV™»@aUk@a@UƒJ@kƒmLma™@mbUWnm@ULǺ@LXnmxUŽm@UbkbW@@akLmWk@UXmJmUkV@VUXVlULmKUxkL@lmXnJ@X‚l°Vnb@bU@WbKUX@VmKUX"],encodeOffsets:[[116652,28666]]}},{type:"Feature",id:"3601",properties:{name:"南昌市",cp:[116.0046,28.6633],childNum:6},geometry:{type:"Polygon",coordinates:["@@šXš™„@„mš@VIUW@UšKVb„„LlV@VVbUŽlUnLnl@bVL@V°šUL@V°@Vln_Ġºn@‚knKnššLVU@VkĊ¥Vk@™Uƒ™»UaƒUÅLUalmkklWn@VUVIlm@m„Xn@VmškVa@KXIV™UWVw‚™²@m@U@VK@k@W™Ua@™ƒa@aUƒ™@™IUƒW@@bUJmbUU@kkV™mUaWwkbmLUVUn™lWbUbklmL™akbUaW@U@VbkVWVUUUVƒUx@‚Uœƒ`UI@mƒaULƒamb@lwJWUƒVXLl„UVmL@bUK@aUnUam@UUmJ@VnX@`UXVŽVb@bX@W¦nJUbƒUmVVbXb@lVšUnVlƒVUUkLmUUVWl@bX@VnV@X¤VUVLllU„U@@x™¼VV@V"],encodeOffsets:[[118249,29700]]}},{type:"Feature",id:"3602",properties:{name:"景德镇市",cp:[117.334,29.3225],childNum:3},geometry:{type:"Polygon",coordinates:["@@VVX@Vbmz„xUlU@mbmL@V²xVbUVVblbX@šVškVykValKVI@bn@n`lVWnX@l„L@™WKnƒVIVa@¯nK@alIXJVIVWUw‚ƒn@nU˜„nK@alI@a@anKm_™a—™W@UWmIUwmmK@£UUƒmUUlwwW@km@kWaX„aV@VnVKnXlK@aUK@UnwWUnƒmIUW@¯mU„XI@alJV_n@m±@U@kkKUlm@ƒXamJ@UVUkƒmI¯JmamVXL@V›UkV@xƒX@`k_UVmJUXƒW™¼mL@bU@UllX@VV@bVV@bnJUnlx@n„Žm„b@lWŽ@zU‚nIlx„@W„bVV@bVJV@UxV@@X@VkLVôÒ‚šn@@b@`VX@J"],encodeOffsets:[[119903,30409]]}},{type:"Feature",id:"3603",properties:{name:"萍乡市",cp:[113.9282,27.4823],childNum:4},geometry:{type:"Polygon",coordinates:["@@VWnL@UVW‚LXaV@@ama¯Uk@WmInW@klKVwnLVKUkVW@UlUnVnIVWl@nXlK@bX@laVan@VnwWm@KȹVK¯m@kmU@ƒƒ¥kIğ@WKU¥„@V_VW@_šK@aXKVL@Ul»mWLkU@am™kJƒm@kmU@@a@UmakwU@›„Xlƒ@VXk`UIW¼kWWX@‚œ@l‚xV¦XlW@Ubn„@ŽmUkL@UmJ¯UkUWVUaƒUlm@UXWl„nUJ@LmLU˜nXll@bUVUUmVUn„Ž@¦šxlŽnn@VÆÈU°kbV„VxllnL@VnVVUl@V„„anL"],encodeOffsets:[[116652,28666]]}},{type:"Feature",id:"3606",properties:{name:"鹰潭市",cp:[117.0813,28.2349],childNum:3},geometry:{type:"Polygon",coordinates:["@@@XV@nlšL@lUnš„mŽ@Ln@@VlV„@@VV@nwVI@V„Vlx@bknlbV@nmnUVJ‚_²‚VxVLšw@mš¯@ÝXIm™nUWƒaUwkL@wVKlKXmw@±@U„KnUlL„a„KlUlÇXkmaUw@U@a@Uƒ™UkwUJ@zWJ™w@WbkVWUL@VmUklUaWakbƒ£kJ@nmln„lL@Ž™nƒ˜L@¦mJ@wU@mXkJmbƒK@bUL@VVn@`kXƒW@Xk@@lm@UX@V@b„lÜUXVWLXJ@nmb@V@l"],encodeOffsets:[[119599,29025]]}},{type:"Feature",id:"3605",properties:{name:"新余市",cp:[114.95,27.8174],childNum:2},geometry:{type:"Polygon",coordinates:["@@m@@WULUKWwÅ»ókƒakkWK@bUVUIUamWUbULƒa@KUa@mJUbmUXU™mUamImakKmLUb™VUam@@UL@KƒKm™UUkL@`mIUb™@U„@V@bVl@bš¼UŽmL„¦mxUaUUƒVkŽ@¦„VWbXV˜LXKlbXnmx@lmVnb@X„Kšxl@XU˜bnKn@WaXIWƒnal@Vbš@XmlV@U@bXb‚LVxn@Va„LVWVLXU„b°@VW@aVIkK@UmVmkU„ÑVJnalLVUVJXbVkVJXUlblUXJVI°JnI"],encodeOffsets:[[118182,28542]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/ji_lin_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"2224",properties:{name:"延边朝鲜族自治州",cp:[129.397,43.2587],childNum:8},geometry:{type:"Polygon",coordinates:["@@Wxĵ„mš@„ó¤VX@@xܼƨš²xWxƒV„V@„XVƒ„„„ƒbWšXllaÞU°Ċ„@ô¼„LôÝWanV¥ƒÑnĉ°¥šÅX¥°¯@w°w@»°k£°mÈŹ‚mÈbƃŎ¦„K°z@Žkxl¦UbU¤šššklV„KŤÞȰ@@bšV@nVVUlÞ¦lUllœVlU°ÑU¯Vƒ°w„bXxl@V޲„˜@n„ô¼ƒó°™kmVk²ĕ‚w@wV™ÞÞ@@Ġƒö»˜¯œ@‚„šbnb°mÞ¯°V°„ÈJmX¥mam™UřƒUƒlaU¯™ƒ@w™Kk—l±n@@wƒkÝVUUl±¯I¯b™a™lƒ@™kLmakbƒ@ġƒŹé°™Þb°šékƒƒLm™„wX™‚aÅb@bVlƒbVb—ÒVbUb›UUanwƒakbVŽUV›ak„¯„UŽƒLmxV°UxnôŻX@J„Xkl‚bkbĉaƒbƒWU„ƒ@ƒk„WUU¯@@klmƒ@@™Å@aƒwWXlKkI@WbUaVIUanUƒƒ@ĕƒ¯K™„mUnWUwm@£ċèkUmbUmm@@nkJUalwk@@nmWUan_óaWmnw±KœIƒwl@UmƒI@an@@mlUÅmV_™KUkƒ@U`@_ƒKUmU™@U¯™mmb¯@kb™ImV¯ƒƒLkbƒKƒƒÛ@ÇnɱJóaÝĢkb@„›x—ÒÇllœ@‚޲V‚„ÆUVV„UÇ°X„óxlV¯„lV@bƒV@n—x›@—¤@„șŎnxV¼knšJ‚nšKX°˜¦UlnVbUbÆVnÞWVX¦llšb@l°œVJôÒnLVbšbXŽ"],encodeOffsets:[[131086,44798]]}},{type:"Feature",id:"2202",properties:{name:"吉林市",cp:[126.8372,43.6047],childNum:6},geometry:{type:"Polygon",coordinates:["@@ôl‚zšaÈV°„šK@„mŽ—LWl™nšVxUV‚È@ŽÝĬUÈn‚ôLša‚„²VmĀkV@„ĠĊnU@b„V@b˜@nl°UVnÞaôJ@bš™V„¦mlkššbmVXx¯@Vxm„nbƒ„šbÈK‚V@bÈL„wĠyônšmnbÜ@nn„V˜x@n²K‚„„J@k„al@nxÞU„Lź±Vwkw¯LWWUš™kŎīVwƒw„°y„Vĕ°wÈVlkÛ»@wW@Uô£@ƒn™ĶƒXwW™aUamKóÑUI¯›@k™akkW¥XUmÝÅUVaUa‚mVk—¥W¯™Lm™IlmU»mwȚō@ƒ˜£kJUÇk@am¯y¯UVwƒa@wġx¦ƒKƒƒ¯X°Ċ¯¦U°ċWULÅa±b¯@UkÅWmVƒ™ƒkIUlóŽċ¹™`óIƒlX„WŽXxmbUƒLݏƒbƧ@ƒx¯bƒÈ—l@xƒš¯zƒaݤ@nšm„VWb²bmn¯J¯Ò@n„š"],encodeOffsets:[[128701,44303]]}},{type:"Feature",id:"2208",properties:{name:"白城市",cp:[123.0029,45.2637],childNum:5},geometry:{type:"Polygon",coordinates:["@@ó™ǩŁ@WlwUaƑwÛÅÇéĉamKƒōÇ@Iƒ™ôġVƒȁÑŹçƒ™ÝUƧċĉwóóÝ@Ƒ»ğL¯ll²@ƆÅV@¦m‚Åb@nmlU²VxšlUn™@VbnW„bÇbk҃š„n@èlnlšU҄ްLšx@¼ĉb@҄šUŽċxՃènLVxƒÒƒbÅJ±a@_ÅJÅnƒŽVb„Kl„nUÜĊ@„Uš™xXVÆn„mšVššJÞ¯V™ĠwšƒXw°xWL„x„KV¦ôU„wVÝǬóÞޙ¼‚‚„ÞkŽVôȘxބU„lVn¦ÞšĊa°w„b°@šbÆw„lŤL²`„z°@V@@™nJVnl@@¥nUmmn„@mwnmmUnk@mlwUaƒLnƒ›wn¯°anƒWakI„ƒÇmXwÆamUXUlJXa‚UUklKUknmÞV@‚K@VWÞ@VkUwVƒ"],encodeOffsets:[[127350,46553]]}},{type:"Feature",id:"2207",properties:{name:"松原市",cp:[124.0906,44.7198],childNum:5},geometry:{type:"Polygon",coordinates:["@@„šźèȂÒU„óĢ„š@JŎȄ‚‚LnŽĊbÈêÜÆƒxVbkx@XǪłôš„kÞ`„šW„b@n°ašbšKšnVw°`š_X`W„š¦„ĊIkmVšakw‚K„x°UÞb„U@lšƒl@°¦œVW„šaÞbšxÞI@mVI@ƒVkŚUWK„¥nL‚a@ƒ„@ȍ„@°ƒÆ@nU@KÞalkUwVékUWw„™kU›VkkƒJk¯@»ókƒV¯ÆÇI@bĉô¯@™ķw¯nmmÅL¯wƒVƒUÞy@UówÇLkmm@@UóxkkĉmL¯wVwkWWX™mLõm@kűV_ƒƒô»ÛƒÆ¯@™Va™VšaĠVlmğwķUóÝƽ£ÇJkbǫaƽLW@nxݤkzƒy¯XɅm@VšôÇX¯Ė¯ºÝnUŽnLVlUÔmV"],encodeOffsets:[[126068,45580]]}},{type:"Feature",id:"2201",properties:{name:"长春市",cp:[125.8154,44.2584],childNum:5},geometry:{type:"Polygon",coordinates:["@@„U°xÆKnn°mĸxš°@Ċó@aÈJ°Å„Uôl@¼l°„IllœUlVƒšXxlVUêVxkllnÈUVll@Vx²IÞ¤VUlVnIôlރlwô_„›„bVaĶLXÅÞÇ@K˜¯@wÛaƒçn¥š¯WXyW¯XwƒUmmÛ@ma™nómğzƒxÇK@aUÇL™a„ƒmanƒUw°@WwnU™al™nkƒ¥šU™@aóIÝbUm¯Vmk—@@aƒU@amVğĉ@ƒlUnÿ±Uƒ™bóKmVÇÞī@ÇVUUw‚™šmXk˜Kn@ƒ™L¯ƒÇU™byókōè@b‚n@lÝX@x¯ô@ƙUV_maXm@aóƒJWxnX@ŽVVnĖVnUJ@nōÆÇ¼V¼kxƒLklÝw@xƒx@zV`ÅbmxU±xU„nnm‚kn‚ŽğU™bUŽ‚šUb@šÅ°Ü„󼄄U`Ʋ@lön‚KšnXWlXUx°xnKĊllôw@Vn@lnÈKôx@VÝz„V"],encodeOffsets:[[128262,45940]]}},{type:"Feature",id:"2206",properties:{name:"白山市",cp:[127.2217,42.0941],childNum:5},geometry:{type:"Polygon",coordinates:["@@Ušl¦kÒÆ°„IlÒU¤ôz„¼lJš„U„n‚ÆXVl°@²aÆbVKČXV¯°¥¯ĉ°W„„„L‚¥Ģw@x„bUx°V°zn‚‚b@ÈlVŽlIœ@˜w@m„U@akU°ƒkUôwWƒÈ¯VUƒVUƒÅ±U›@kÈk˜Ñœw@ƒlaÞġƒUÞ£@ƅ‚KnÑ̝@W‚aUaVUVkkw@a¯@¯™Ý™ƒVXnW@@WkXmK@xkKUb@bW@Uw¯„mmb@WKUbmUbUaWbƒJĉIVW@I—l±LkšmU™bUm™@ƒnkKWa¯n™@„`Ubma™„ĉL@bƚ—@W`ƒL@n¯‚Xb‚@kb@x™Lƒ„™@V‚kL±™™mlUIU¥mL@lÅx@_laƒƒ@U—aƒV@kmmƒK„£ƒƒLƒƒmKUnÅKVbmXVlèĉUUbml„ĢŤƒIlޝbǦœl‚@ô¼Ģ„@x°„l¤„n„a„l@x™b"],encodeOffsets:[[129567,43262]]}},{type:"Feature",id:"2205",properties:{name:"通化市",cp:[125.9583,41.8579],childNum:7},geometry:{type:"Polygon",coordinates:["@@ÆlXnĠx̰lȰš„K„°kXm‚@¦Vbk„ŤJšnݤk„VÞVVkȄb°y„™@w˜k„ǰa„wƨ@„aސ„K‚VnaWwXWƒ„kôJš_ČºôVkƒ»óyV£kуJůlÑk¥V™ša@wƒkƒbƒmk£¯ƒ@wġƒó»@›kÈ¥°ak„JÆ£ƒġnkVaĊVkçWUnUaÆLVmnL„„‚KU™±@—„m@a¯U„bmV¯m@_ƒK™™U™ƒaƒÅ™Wó¹ƒ@UanmWak@@wmI@y™@mk„JVa™@UaƒIkJ@n™@Um±kkxƒm™Ik„ƒbÇm@ްbXn„V@ްÈmlÞ¼¯XVº¯Lm„kWWXLmVVlknƒ@@lnWƙ„Vxbmšnšm„¯lÝaVȁè@¼V„„b™„ÆŽ°ÞUVšJ„„kx›I—xƒƒƒIV¤™ÒXxmn"],encodeOffsets:[[128273,43330]]}},{type:"Feature",id:"2203",properties:{name:"四平市",cp:[124.541,43.4894],childNum:5},geometry:{type:"Polygon",coordinates:["@@Ɇn°W„zlyÞ£mwX@ƾKǬblaÈIƾ¤ôÞĸVĠxnmmVƒ²w‚VnwÆaU_@y„w@wÞxlk„KlwU»È»ŎÅ@mVIUmmĕUU@mWXw„Iô‚@bWnnbU`‚šV@Űó@wÞW@km@aŎ烙@m°Ñ°Inm±aXaƒU™n@mƑšU¦@šÇޝaU£šaU™ġ¦ÅҙJōUŻókUÇ@™¥¯ak¯mUVak@@aċçÅaUƒm¦Ý`XbƄ@n`ƒI™xĊÞōÞml@šUb@Wl™_¯JkšÇUÝÆÅb@n™„llUb¯„±a@ƒ—ƒWĉJġ™Unóšm¤œxôaVnƒxôI@x„V@bmƙ„@lnLmޯޙxVb¯þ"],encodeOffsets:[[126293,45124]]}},{type:"Feature",id:"2204",properties:{name:"辽源市",cp:[125.343,42.7643],childNum:3},geometry:{type:"Polygon",coordinates:["@@żôŎVšIÆÑĢ¥Vš™bV¤°bȍ@™V¥ƒ™Þ£lÇUUUÝlƒÞ£™mţIlƒUa@¥nlWƒ¯ƒL¯™kÇġ¯ğwWmÅk¯UƒVU„„bWlXlmnƒbUx¯xVVknlŽUbV„ÇKUb@„™VnbmlnzUº±bmJUbWÈnèm҄š@X`WL"],encodeOffsets:[[127879,44168]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/liao_ning_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"2102",properties:{name:"大连市",cp:[122.2229,39.4409],childNum:5},geometry:{type:"Polygon",coordinates:["@@‚IÞmVk@wXWÜbnwlLnU„@‚nLlbXW@a‚wnbl@XL‚aš@Ċ¥@LULnJ@xVnmV@VXXV@VJkn@VÜKXXôJlb„xl@„IVbnJVLUbn‚lnVw„JVU@ƒXU‚aUUlwn@°ƒn„VKnV°_VJšwl@nwlV„IXWlIVVnK@IWmkIVaVU@WÈUlmU@U„WUalkXġŻ@kIƒ»mm™akUm›ĉUŁV»²ġVĕ@aUU؍IɃ`ȃ@kƒw@ƒUƒmwĉ™@ƒWķсIĉÇbÝLkymbIƒwÇmÛbmbU„¯ÜõÈkÆVbŎxnXVÆnšǪ¦„bš¤Uš™xÝnĉÒmĊVȄ¤Èš„bƼ„Ā„„ÆÆÞ„źb„VVbX„‚°²¤"],encodeOffsets:[[124786,41102]]}},{type:"Feature",id:"2113",properties:{name:"朝阳市",cp:[120.0696,41.4899],childNum:6},geometry:{type:"Polygon",coordinates:["@@na@UVI@m„ÑW™kaV¥UI@wl@„aÈbšm@wVašk„@@K@kƒ™@a@UUmƒUUalmU@KÇUű¯@±kUKVkUaƒaU@¥m@@¯k@WLUmkn@mmIkm@amU@wVmkU@Klk@U—m˜aXIWWUL™aULVbƒmk@UUmUk±™_Uym@mbkImaX¯WW™xWKzU@WƒkJWwkV™@Um@UbVVVVXb@VWX—@WŽ@Vkb@V™nUK±aUUlwX™ÇWKknU@mmUkƒLUVƒVUUVƒUaƒw™bkKmwnIƒ™kJ@nmbƒ`kmVkLWwUm@UUU™K@UmaUa@UUaWK@mUƒ¯Wkk¯VmUUŽ„xVXUVmL¯ymXkWUbmXUKƒVknWx¯JVnkLƒl@VVxnxlĀVL²WlX„l@bÝVUn@bnlÜaXblIVl@šš@Ȧ@VmbXV‚@@x„VVnUn@`°@VnXU@K@„VV@VmbnVn@ln@b„xƒ°Ub@bšLV`Ånƒ„W@@lUšnnWVU@Vbkl@Xl`XxV„UblŽkX@ް¦V„UVVbUlkV›@UbVbkLUxmJkXšš@b‚bœxVKÆlXX˜bnŽnala@ƒUk@U„VVklKVUXKVU°KVan@VUnLšKVL„WVaU_@mmUXa@m˜wXwVkVWXk‚k@›„k@klm@wXKl@U@KVUUUVaUƒV@„alL„xUx@b°°VnnVšxlIXJmx„LUVlV@bnX@Všb„aVx‚@XJ@b‚n@VŽVXȄl@llX@lU„Vô°°@ބVbn@‚V„k„@VW"],encodeOffsets:[[123919,43262]]}},{type:"Feature",id:"2106",properties:{name:"丹东市",cp:[124.541,40.4242],childNum:4},geometry:{type:"Polygon",coordinates:["@@lzXJ‚U@š²x‚@@Vš„@bUVmKUn„°n@lnVK„„nV@n@VlV„°WbXn@‚VzƒJ@¦@bkb‚bUl@bkbƒJ¯zƒWULWbklV„nb™¦VJ@„„K°U„kl@@W„bVn°@„Všm²U˜nX`„UÜLXmVXlKVbUVVnUbn˜ƒX@VUL@lUbWxš@²kl`n@Vlb„@nUVWVLVU@aV@²bl@ÈmšxWX„VÈU„JV„l@„„la„WnX‚KÈkÈ@Va°bÆm„@XV°IVV°UnalƒVUn@UwVU„@@VVJ„I@bl@XK@wWmXU‚UVbkJVXnJVI@mƒknwlKXL@`l@VI@UUaVKÞn„aVm@aÇ£XW„U@aÇUU@mbkKm£™@WW™ƒL@@Kk@kl›U—bWKUkUU¯UõÛƒmUUaVU„U@WU_W@kVkJƒ_WKkV@bUL™¯¯ƒ±mk¯ġƒğÑ@UmwƒKUakƒ™ƒa@a„m¥ÝƒIUWmk@w™mţ—L›KʝbȗKWĢklVbƒX@VV‚knÇV@XUVUblJXn@J"],encodeOffsets:[[126372,40967]]}},{type:"Feature",id:"2112",properties:{name:"铁岭市",cp:[124.2773,42.7423],childNum:7},geometry:{type:"Polygon",coordinates:["@@XJm@¯šmXUlnVbUJƒU@bV@UJWL@VXLmJVbkXlJXxVL@b@V@n@b@`Vbk@lxknV@VV™V@bUL@bV@@bVK@VXLWLXJ@LV@nbWJ@IUV„x@LVJUXVxVx@VV@@LXJWL@VU@@L@VnL@bVVmVX@@VVInJmbnLWVnVULVVU@VVmX@@JVz‚l@„nVVKVXރ@mk_lm„UUWV_nJlUÞÑÞVVUVƒVL„UVJ@I„Vna‚@@KV@XwWknwnKlalU„w„aĉݚwšJl_@aUaƒKUUU@WU@WXUÆ@@UVK@n@UnVVšblK@bœllb@b„bW@Xbl@UlnLl°°bš¦nKlVnI„V@UWU@WXkƒw@am@nm@aVw@I@KUaVIm±XÑlknJVnVJšaX_VaUaVKmwnkmmn@lU@U@mnašXlKUmUIVmklaUK@UlUVUW@U™kVm™a@UUU@JmUU@@bmb—KWV¯XUKm@ka@UVKVk@aUKmLkKUUÝUmbXbÇJ@k@WU_@m™™@klm@UXKVaUI@KWUXaƒÇWk™aWUkWUL±U@lUU@ƒUJƒI@V¯JmIm@@aU@Uwƒa™@UV@VkI›V¯aUkƒWkb@bVL„@@VVVUXW@Uaƒ@@b—‚ÝbUV݄@ŽƒLmUkVUbVllLUV@LššXŽWbUXm@U`@„kxlnnJlbnIllšLX„lVlUXmVK„n‚V@L"],encodeOffsets:[[126720,43572]]}},{type:"Feature",id:"2101",properties:{name:"沈阳市",cp:[123.1238,42.1216],childNum:5},geometry:{type:"Polygon",coordinates:["@@ȚĊܰ„b„L‚lÞxUbUn±‚@ÈnVÆL@xnLšlUVƒbƒxkImJkn@V±LUxkV@bšbšKVKnzVl@L°@Va„xÞUlbôxVVœ@@V±bnŽ@llXL˜ŽöXĶŽnal@nkVJVI@aU@@aVK@ašUUUU@lmkwl@Ua@_@a@m@U@aUKWwkIlWUanIWK@UXKVIU@@a„VVIUa‚mVknW°™n@WI@KUƒmULWnkVkUWƒ™KkkmJkamIkmlw@ƒV_n@VWXaW™™@KVUkKUkValUnV„K@ÞƒVUÞa˜@a„@VbX@VWUU@Uƒ@UK@ala@IkKmUUa@U@ƒVƒkk™WVwU_@KÜUXbl@V¥XUVmƒƒƒXa‚kŃlUUkIm`UIUJW@UIKmkm@UUJƒImmU@ƒVUXU`mIUbUK@LƒJUU™l@Xƒ@UbƒJ™kU@ƒŽn„m@Uam@@ƒ™aUmLKƒwƒ™mWXUK@kUaÇa@JUIUa@aƒKVUƒUXmƒUy™_@lmbkLUKWLX`‚n@bVL@JXL„‚WX@Vnb@Vm@UbnVmL@V@x@LUbVV@V@LƒUVl@mb¯U@xU@UVVV@X@VVblJ@bn„VKUn„x@llnL±¤™b@k`VXÆK@„kV@¼kl@bWIUl@VmLnbm@@JXXmb"],encodeOffsets:[[125359,43139]]}},{type:"Feature",id:"2104",properties:{name:"抚顺市",cp:[124.585,41.8579],childNum:4},geometry:{type:"Polygon",coordinates:["@@„XVl°bœUlJ@UVUš@„bVxV@@bn@nJ°I@U„J‚I„VV@V@k²VVKlXXVšb‚lÈX„ŽWbXV@LVJUbWL@Vkn@lšš@nV`@X@lÈIWanaÞVVVlLnKVL@bUlUL@Vlbn@VL°WXU˜Lna@aV@nV@IVV@VšbUnšl@V‚XnKVa@U„UnyWkXaƒaVk@ašašbnm@_WKXmWanU@alaU—l@XJVLVxX@˜wnKnVlwƒƒ™@V_@a¯¥@UkKWUaUU‚anK@IƒaU@WUaVw@klUVyUUVUUÇ@Iôbša@mnUma@kXa@UWak@Wa—l@a›@WUƒLmU@U`mIUU™`mUk@@UUK±nkJƒbUam@kwm@@a@UU@Ua@@K@ƒVK@kmKU_UKƒUUaĉWmkkL@`™LƒnmlkLkbmK@k™@Ulmb@b™„@Ž„xUVƒIUlmVXXƒxm@™JUUk@WUk@ƒakx±@¯x¯Umb™KUUVmUU¯UmVVn™WkÆ„lWb„„„ŽUnWVU¦k@WaÛV@LV`UxšXllU„@„@VVbnVlL@J"],encodeOffsets:[[126754,42992]]}},{type:"Feature",id:"2114",properties:{name:"葫芦岛市",cp:[120.1575,40.578],childNum:4},geometry:{type:"Polygon",coordinates:["@@ll°X„ŽnV‚@XLVb@VVbnb@VšLVV@VVnXxlKnU‚l„_na@mlI„šmJnxlLša„xVbU„VV„UVU„KVlnnV@lmXLšÈWŽkxVV²bVLšm@Ula@UX˜@XW@UWaUUUUVan@V‚š@lUXxlIX„V@‚yXLšw‚ŽXXW°nblJnan@Vzš`l²nVVVl@„nUaVKšbVKnXVaUaVUšyšnXK@kVK‚@X@m@m‚LXa„LWƒU¯„w@™ƒa@UVw„¥°™ó¯¯y¯ƒUǯ»›w¯Iƒm—¯Ç™UUl™¯»ţKċÑţķm¯w@mU_ómk¼VnU`±IkbVlƒnnŽU¼±Lk`@X™Wl¦UbmVUxkXVlkbllU„Vb@bkVmx@XVV@Jb±aULkKWXkWmX¯aUJmIkVm@ƒxU@n„"],encodeOffsets:[[122097,41575]]}},{type:"Feature",id:"2109",properties:{name:"阜新市",cp:[122.0032,42.2699],childNum:4},geometry:{type:"Polygon",coordinates:["@@šXnb°lš„VlnXVJ„LlVnl@zÆxnK@b„blKVLn@@V„aVLVK@L@Vl@XVVInVVKVwlUXwlKšL„ššVVb@aV@X„lUXbVW@n„lWnXKV@@V@XUVVLUVV@@bVVV@@ln@VbVUXV‚I„xVanJ@UšIVWšL@UV@@¤V@nInw˜W„k„lnIVx‚lnzUVÇJ¦VVÜLĸUnW@aV_šWĊXXa‚Knkl@nm™L™a@alUVw²K@UlmnIlJ„w„aVU™kmK@wÅKmU@DzVmVaÝwkƒKƒaÛ¯șĉķ¥ğ¥ƒ@kUWkƏī݃ƒ@@akU„K@KWIUm¯nƒU¯JmwUVmIkJÇLm@™UImJUU@aW@U@@nUb™JƒaƒbXVWn@UVmX@V@b„š@l@Lƒ@™lUb@x™nÇaƒbk@@xVJU¦lbXšƒÒ@nUJ@Vmb"],encodeOffsets:[[123919,43262]]}},{type:"Feature",id:"2107",properties:{name:"锦州市",cp:[121.6626,41.4294],childNum:5},geometry:{type:"Polygon",coordinates:["@@nJ@nlmVnXKl@@°n@@¦‚V„bVbUlVL²l°@ƲÈV@LV‚knVb„VVnnWVU‚@XmWU„a„bšIVa@mV@X@@bVVnIVJ@š‚nÈKlInJVUnx°I„V°mVnXJ@LƒLlV@b„@ބƐĬXllV„@Ġ¦ĸ¦naWW@In@manK@UVkXJ@alk@»lU@ƒÅLUWl_@ša²£‚Kkm@kƒwVmULmƒ@akIUa@U@WUUVU™aÝ@ğ›wkƒƒmĉ£UWƒ@@bÇL@m—a@_mKƒlƒXUwKƒLţÓ@UWw@K@U„I@m™U@UV¥„@°UnJ°@@_™KUwƒW@UnaWUmmI@m™ķwUaÇLóVĵwݙUUW™¯šƒ¦Ux@V„b@šƒxV°X„ƒKWbK@n@nW‚@UL@lWL™m™zUVVbUbmWXXWJ—b˜n@Vkl@LlVUn@xnV@bln"],encodeOffsets:[[123694,42391]]}},{type:"Feature",id:"2103",properties:{name:"鞍山市",cp:[123.0798,40.6055],childNum:4},geometry:{type:"Polygon",coordinates:["@@l„œxĠŽÞ@šbV@@w°Vna‚@Uk„V@K@UUUVa@K@w@UnKmUVan@@Uma@UXWƒWK@IUK@amW_XKVLlKna@kmKVak@VU„@VmšU@anIÆan@‚a„šUVnb@blLV`ÞLlU„bna‚Kn@naVU@¥°IVK@anUUKVaƒUVak™@mJƒkXƒ™UVwkƒVUUa°U@Wƒ@WlkXWlIXUlJlaœx‚IVVXLšll@nLV@lLXl„KĊzš¥maUƒlkXaVK„X°y„Ila@aVkala@a@¥„IUy@WmXaƒ¯kU@U@mmUƒƒULkmm@ƒ¯VmnLVU@a™ƒ@U@±w@™VWIkymLUUkJWXƒJkUmxk@™xUI¯`mUULmƒ¯„m@kxVVbWV@„UVƒIUx@bkšVšVVšxUbVV@V@zšJVXU‚lnk@@lkLƒlƒLUU±Jkšm@UIUVƒLUVU@™K@UƒnnV@l@Ll„ƒaUJ@zn`@nWlƒIUVUUUV±Ln‚@nmL@VUVkLVlUxVLVlÅXma™@@akLmWUX@JUnVJVkXJ@X@`WX„VUVUIlb„W@bVUVL@`Un@¦U`@bUV@z@Jm@@XV`„LUL¯J@IVKmKÅI@J™nWVnLnšVxV¤™z@bmV@VUV@bUL"],encodeOffsets:[[125123,42447]]}},{type:"Feature",id:"2105",properties:{name:"本溪市",cp:[124.1455,41.1987],childNum:3},geometry:{type:"Polygon",coordinates:["@@lb@Vn„lnVVUb@šVJ@nnJ@bmXUx@xVbkbkŽWLUxnl@Ul@„xWx@nUV@¼Ull„knkK@bmbnl‚LVJX@VIVJn_lJVVšXUmnU°VVVUnVVšLna°V°w²@lw„bl@XVl@VVšIn@„wWWnUVk„JVUƒw@šƒ@anaVkš@@lnLlalKnk„mšK@_lKnlĊXVb„VVLV`nL@lUL@„@L@‚VbV@@V@bn@lxn@Vb„alI²mVL@Vl@nVš_VVnJV_‚@nV„K‚V@Xœ‚@b˜kXbl@XblylUUkš™@Xa@UVIlK@UUWVU„Llm@UUUnKWU@K@UXm„XVa@U°KVUUWUk@ašUVKkaWkƒKUknaWa@U—@m@mk@ƒaUJk@@_WKkLmx„l@nUJmIUWlIUaVWVXn@xWLk@@aƒJUI@Uƒ@UVVxm@UVk„mb¯VUU¯JWUƒ@Ån¯aUbÇ@ÇlLmWƒXkbƒƒk@UƒƒIÇVƒUXW™wÇnk@±aU@@bUVUKUXmVƒ@kaUm@k_±l™@XwVa@kVK@U„Wm—VaUmVUUakLUWWnÛKƒVW_—m±V™nƒU¯@Umƒa@Xk@ƒl¯V"],encodeOffsets:[[126552,41839]]}},{type:"Feature",id:"2108",properties:{name:"营口市",cp:[122.4316,40.4297],childNum:4},geometry:{type:"Polygon",coordinates:["@@ĊĖÆn¤„„°Ċ¯ŎWšô„@xXb‚wnKl@nX@VUVƒKmL@VU@Ux݄@Vlb„x„U@VUb@b‚kœ`‚IUlVUn„V@@UV@@JnXlK@bš@nbÆWUkUKVwUklKVU@UnK@mm²KVUVVVU„JXk@mm_@yVI„bkƒ@K@kmU„m@VšLV@VU„KVUVJn@l™²IVV„K„klK@kl@kmVUW™I@y@UUUVa™wUUU™l™@akmmVaUKmIUaƒJk@ƒwkaóIWWÛL@UlmUIU@WW@UnUUm@wmIVK@Kĉ¦™@bWKk@max@bWXkamKƒ@mVkKmxÛaWX@xUlÝnJ"],encodeOffsets:[[124786,41102]]}},{type:"Feature",id:"2110",properties:{name:"辽阳市",cp:[123.4094,41.1383],childNum:5},geometry:{type:"Polygon",coordinates:["@@š`Vz„‚Wn„VUV„L@bVbVJ@IÈbVb@lVLXW‚n„š„x‚LnKVŽšb@„n@Vbn@mƒ„V@šl„IVa„@@WškVV„I@KVLVanJV_VW„UV@nn„JVI‚Vn@na@alLlmkƒVk@»VU@mXwƒwk@@VmkVwXKllaUa@wVwnW@amI@mUI@™VaUUkmmƒ@UkaƒL@ƒUIĉyƒLWkkKU@mKk@™kWKUUJ›wkbkIWVkJWXkl@X„‚@X¯VVbUVl„UxšVW„„lnIš@l‚Ub„VUbVLmV@bUL¯J@¦UVmbm@LmbƒakVÝKU_kK@amaVUƒ™bm@ÅbmJ@b™VUnƒ@UVl@UbnL"],encodeOffsets:[[125562,42194]]}},{type:"Feature",id:"2111",properties:{name:"盘锦市",cp:[121.9482,41.0449],childNum:3},geometry:{type:"Polygon",coordinates:["@@Vbĸx‚š@nnJVnXŽmb@V„XVxšL@`¯@mI¯Vƒ@U¦@VšV@nƒJ@V@LXx@VŤÔ„K‚LVx„W„knL@`˜b@nÈK@a„@VXĊ¤„nVK@aVU@UnU@ašyU£Uwm™mKXUšm@IÆJnLUL@J°IVKƒKU_@Wn@@I@yVU@aV_@¥Vm@_UKUV@aƒXkaVJVUƒUXW@_@WWIUlUIVm@IVW@IU@@VU@mƒUVVkJ›_l@aVa@UƒVƒwka@UރVwV@@UnK„LVU@UmWk@mLxWa@wóƒUVUIÇÆĉ¦¯¦¯xʟJ"],encodeOffsets:[[124392,41822]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/nei_meng_gu_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"1507",properties:{name:"呼伦贝尔市",cp:[120.8057,50.2185],childNum:13},geometry:{type:"Polygon",coordinates:["@@„m@Łkƒ™Žƒklƒôƒ@£kJ°ý™ɅķÑó¤ğLĉÅlÇğŁW¯¯›™ƥóÿlwkţÈéÝƛó™°ÞÅxV¤ĉĖWƒ¯lȭţυ̃ɱÿķƅˋğɱřÝţϙȍƧĊţ@¯kWKUKm¹Å@ķJU@ƧÑƧ„ō¥˹Ɔ@L@„Þ‚VLnš@VōČWJX¦@JŻbU@ţÞmVU@ȁýóbkWWLƒƒÅ™¯UWġkmóƒ±UŹôV¼ƽ¼ƒł̥ĖƽǬʉxĉŽŻȗKΕ̛ʵƨʟÞ˹»Ƨţ»Ǖō˷Ȍ±ȚʊĠUɾɜɨmÜ֞߼˸ƅȂ¯ǖKˢğÈÒǔnƾŎՂ@šĊbôô̐¼ƒ@ĊôĊŽÞĀ™xšĖƧL±ŽœŽ‚Uš°U„°ĬƒČ°ÜƒêɴȂVł°@ƒ„nxŎèƒbȄÞȌ΀Ǹl޲IlxĊl²ÒmšôĖ™Èl„ĵºm„ÈêVþ„xɛČʉÇĵVmš„ÒƒÈɆôƐŰǀĊ°ÆǬĮƾb„yĊ@ĠšƒXǀċm»ôw°Ûk¥Çm¯ç™kkÇǫţǕéX_ĶWǖīŎaÆĵĸĊ@ȚȘ‚™ĊLĢĉ„VÆĉʊÇĕóaU¥šĉ°mkŰġUĠřk°mƒÑČÿ˜ÛƒWĸ£ʠšÆxÈÞŎÞ»ʈ²ĊÇČalÒ°Ť±ĸz„ŽĊKȲm¤Ŏ@Ò°¼nyȂUźīǖƳÈē°@šÝ̓@ƒÈkl¥Ççkxk™›JXÇƒUÅ@˜£k»„óƿīÛ@lÅJl¥óý@¯ƽġƍÅan™ċ™°é¯¹"],encodeOffsets:[[128194,51014]]}},{type:"Feature",id:"1529",properties:{name:"阿拉善盟",cp:[102.019,40.1001],childNum:3},geometry:{type:"Polygon",coordinates:["@@™ƏnǟƨʫšŹɆÿ°¯ÆV²ˢ™żÿ@ÝÆŁȰ¯ȀƳĉó™™@ğkyš¹@īš›ƒwl£Źƒƒ¯Ŧé@™ÇÇxŋĉƩUUŃōL™Ç™ĵóÝnƒóç@™™ó@ġƒƱ„¥ƒç™WUçÆōƒ@é—çťK™çȭVһƽ̻aW¥ȁ£ʵNJǓƲɳޗǔlżÞmĠóĬȂɲȮ@ÈĢŮźÔnĶŻǠšŎȭœгŃċóȭţΗÆƑÞƧÅΫóȘǫɱȁġlÛkǰȁÈnšõl¯ô„ÞɛÝkĢóWĊ„zÇɼʝ@ÇÈķlUČÅÜķnέƒǓKȮŎŎb°ĢǀŌ@ȼôĬmĠğŰōĖƧbЇƧōx@ķó£Ål±ĀƧīXÝġƃêĉK°Ýʇƅ@ΌʉżÅÒϱʈ@˺ƾ֛।࡬ţશóЈèʞUš¤Ґ_޸Ƒʠɽ̦ÝɜL׈ɛϜóȂJϚÈ@ǟͪaÞ»Ȯź"],encodeOffsets:[[107764,42750]]}},{type:"Feature",id:"1525",properties:{name:"锡林郭勒盟",cp:[115.6421,44.176],childNum:12},geometry:{type:"Polygon",coordinates:["@@ʶĬĊIȘƨƨŽ@ĬÛĢșŤĉĬƒĀóšU‚ÈŚÜènŦƐȤȄłϰUƨťƾÑ܆ğɲƜǔÈèʈƲĊƞƒšɆ¯̼V˺Ò˺ȂŤVĢêU܃x„Āˌ˘ƨ„ưѢmÞżU¼ÆlŎ@ĊçŎnÈÒͪŎźƒĸU°lżwUb°°°Vš£ÞlĠĉĊLޏɆnźÞ„n¦ĊaȂīġѝIĉůl»kƒ„™Çý„¥Ŏ¯ƒén£ġљÝȭxƒÇ™@Åçķ»óƱŎ¥™çWÿmlóa£Çb™yVÅČÇV»ÝU¯™KĉýǕċţnġ¯»ÇōUm»ğƒÑ™wƏbċÇŎċwˋÈÛÿʉѰŁkw@óÇ»ĉw™¥VÑŹU™mW»ğğljVÿŤÅźī@ř¯ğnõƐ@ÞÅnŁVljóJƒwĊÑkĕÝw¯nk¥ŏaó¦ĉƒV¦Å`ğуÑÝ@mwn¯m±@óƒÛKˍƏǓ±UšÝ™a¯lƒōšșk„èƒĬގn@ŤġŰk°ċx@œĉ`Ƨĕ°@ţÒĉwmĉ@ƒƒnƒƒa„™¥ķnƒÞĉVóÆókĉŽķ@ÝkƧƧÛaƒ°Ç@ÝÈU˜óbݼ@„ÛÒV°™@V¼ˋL™ÞɅŤŹǠVÞȗŤÇĖŚōbȁƜ"],encodeOffsets:[[113817,44421]]}},{type:"Feature",id:"1506",properties:{name:"鄂尔多斯市",cp:[108.9734,39.2487],childNum:8},geometry:{type:"Polygon",coordinates:["@@ĶL²ĬVłƑkkl@Ȏ™ŘWńÈĬȗ¯™ºlz@ĠššĊôŦô„ÒĠ°kÞܚ™n@¤„UĸèĸbŌÈXŽĸLlÒĢxɲÆ¤ÈÛƾJÈݰUšÅĶ»²VW¯ĸJôšbk‚V@ôlbnĊyÈzVôašb@ĸ‚ÞUl°yǬ²Ǭm°ššk„±lbn°@È»˜JX„VŎÑÆJ@k„LšƒÆl²™Ġ²ʊůĊġ‚řóƛÞÅ@m„ƒmLUÿóĉƧ@™»L@„›`ČĸmšȗÑţů±ĉğl¯Ā™wǎƒçƧŤÛI@±ÜĉǓçō°Uwô™ǫůķƳř±bÅ£™ÓÇwnÑó@ȁƽ@™ƒÇƧĢón»ŏĕóĊ¯b„Å™™VȯÅImƒōKU„™LǓ±Ýxċ—ŋ˜V±Āȗ°™„Źl±šÛ@WÒȁŚŹНŚÅèŌô„¼°ȰɞȂVĊ"],encodeOffsets:[[109542,39983]]}},{type:"Feature",id:"1504",properties:{name:"赤峰市",cp:[118.6743,43.2642],childNum:10},geometry:{type:"Polygon",coordinates:["@@ɲŁĢljĊwƾōÞĭ°_ŎŃźȹƒUČÿl»¯ôķVÿǬƽ™ɅġÅÑǫ»̐ʟȣU™¯wVWݍÈġW»Þ¹m݃ɛŎÿŎōͩůV¹›ō™éċ™óŹÅVVĢǩʈ@Ėċ@ķšÛšV°¯xÇÅţ¥™»°Ûô™ĉʟ„¥WýČ¥™w‚灻±mnÅķ¥ˋVƒbUÒġ»ÅxğLƧ™ƒbWĖÅxš¦U°ÝVóŰlô²@š¥ÜÞÛô„V@²±`𦙄™¯Ý@„ŽÅ„VÒō¼ôš™¤V²ŹĬÇĊƑƒţxƒç¯Lk»ʟlƽýmłÝÆƏ@mö°Ġ@ŚŹĬţÆUĀĠNJĠŽX¼šnźVUҚ¦Ċxȼ@ôlx¯łʊÒÜĀˌÇČxƍČÈƐašx„ÒĠŽn¼ŎVȐ‚¼Ģ°ŤmǖČĊþšLV°ÞŽU¼ċÈUƚzÈa‚¤ôbkŽ‚nXšè"],encodeOffsets:[[122232,46328]]}},{type:"Feature",id:"1508",properties:{name:"巴彦淖尔市",cp:[107.5562,41.3196],childNum:7},geometry:{type:"Polygon",coordinates:["@@²@Ζǀݴʶհĸ„˜ƒ¦Ķ™̒Uˌ¼ӾÇƾ¼̨UÞĉ˜Ƨ—éÝ»ƒĕĉ—ƐȍœōǪakó‚ó¯a@™ôţ™aV¯Þ¯°@²él¥ĵğťwōxó¯k±š—Vó@™aóbUÇyĉzmŽkaóŽU@l™aó‚ķIX°±Uĵ¼™Æ¯VÇÞƽIÇÜÅ£ɱŽġwkÑķKWŋÇķaķçƒV@£šmۙlÝğ¯ƒÑťóǿƴȯ°Åł@ÞŻĀˡš±ŽÅU¯°ɅĀ™źƧʬmǠšƐ"],encodeOffsets:[[107764,42750]]}},{type:"Feature",id:"1505",properties:{name:"通辽市",cp:[121.4758,43.9673],childNum:8},geometry:{type:"Polygon",coordinates:["@@ôƲĸ¼Æèš@„ÈȮwƾ»ʠĢ¥VÆ@²¥@»Ŏњ¯ĊJŤ£k»ÆÇX¯̼ōšī°aX£ôƒƾȁꥄƒ™aôŤ™ĢL°ƒĸ@Ȯ¼ÈÒʈŚôVXůÆaĠƛÈKƒķšĉôÿ@ğÈĉ™»ÇVn™ĉV›wXĠݰšČÿĸwVƒ™¯¯ǵ±™ĉ‚ǫ™ÅÅm»²Ż±ƽIm¥ţÈķ@¯šƧJV»ÞUÝç¯UġºU£ţŽóaÅÅlƒƒ™Ƨī¯K¯Þ݃ğL̑ȍƽ@ōŎōĀƑɜnÞݺX¼ÇĢގUX°xVšʠȤ̏Ǭ¼ÆÒɆ̚ŽǫƾUĀóĸ°‚k¼ċĀƑVŹȺōń¯`ÝĮƽŎĉxġNJɱłō¦"],encodeOffsets:[[122097,46379]]}},{type:"Feature",id:"1509",properties:{name:"乌兰察布市",cp:[112.5769,41.77],childNum:11},geometry:{type:"Polygon",coordinates:["@@ʠǠÞĸɲȺƒÒȂƛŎaƙÈĕȘţUÝźǟɆţšÝˌKU»š@U¯ÜÑ@ƒÞ»ôaV—ÞÇÈ@„¯ÜbƨƨÞlĸ@ĊôlôÅĊU„Ýĸmš¦ƒŽ„bm„„„Ċ@n‚ĊxŤÑ@¯‚ƨĖĊ_@›Čwl¯™ƒȭL›Ý„»ƽ¯ķů„Ǔ@ÇǓbċ™ÅÅÆwÿĠÇU£óaƒ¥¯aŎğĠţkw°»¯ůlÝĵkǻݰɱƧǫaóôɱ»Çk¯ŃóƒʇŐŻ›ĉNJŻĢ„ޝÒÈUl°ƒx°n„Ò™Ĭón™Ċğ°ÇŚĉ¦ʵVƒ°°ĬÛżÇJȁńʇʹó˂ƽŎ›Æţ¦"],encodeOffsets:[[112984,43763]]}},{type:"Feature",id:"1522",properties:{name:"兴安盟",cp:[121.3879,46.1426],childNum:6},geometry:{type:"Polygon",coordinates:["@@ÆXnlŎ°@LVLĠþœxĊUȮĊnU„ĠV@żaW¯XIŎġƒ¥Ý@K@w@K@I˺ŻŎ¦ƨƒƨÒŎIÆ@X@VºnX°lŎ@ƾĉˤƒȘǷȘÑÝݚÞbVţĸÿŤxÈĖƐށêÇKnĸ¥ô@›ķÞUnÒl@UŚaƒīˋƒ¯ÑƧx@±kXřƐƏÛéV™ˋ»lō¯ĉ„ÅÇÓǫޗĖġV@ğ»›°ĵ„ÇÞǓ¼¯m˜ÛÅŃĉĠÇƾb²çƒ™šéż¯VƒƒğÞml»ōÑV痻V¯™¯šĕÆU¯y°k¯¯V»ôDŽѰa@Źk™ġKţšóŽšbƒ„ʦƽȂó„W¤¯b™Ĭ̻ŎW°ÅÈl¼ţ¤ĉI™°ōÒ@¼±¦Å@UŽġ¦ʟŽƽ¼šÞĢÒm¤„êō°ƒ¦Èþƒšl„k¼Ċ۰JĢńȁĬ„°ƒżn‚ÇbV„ݼ@¼óĸţ¤@°Ånšl"],encodeOffsets:[[122412,48482]]}},{type:"Feature",id:"1502",properties:{name:"包头市",cp:[110.3467,41.4899],childNum:5},geometry:{type:"Polygon",coordinates:["@@źxżĀǔÆǬVȘĀŤ¥œÅƾōôˁʈͳȂŃÈIÜŻ¯ī„¯ōm™¯ɱ˝ƒķÒÝIÝ»ÅV™ƒlÅôфġ™ğVmÞnnƒWçkW܁XƝÆwU»Șĕš£ĉÑ𱱚Åk™„ƒK@lÅIō҃UW‚—IǼ¯@m‚kaƒ²™l¯™ǫnǫ±¯zkŽÝVķUô™˜l²ô°ŎwŦxĶĠk¦±ê¯@ݰU°šbóŤ@š°bôlôǩb›ŎƏȎĊ˜„ĖÞ¼˜ê—ƨÝĊ"],encodeOffsets:[[112017,43465]]}},{type:"Feature",id:"1501", +properties:{name:"呼和浩特市",cp:[111.4124,40.4901],childNum:6},geometry:{type:"Polygon",coordinates:["@@ʶUĊ¥ÈřĠ¯šĉômšīƒÑ¯m„wk¯ÇV°ÑƒżġĊljǓɱţǓ›ƝóX¯ƒɛÒóa@nÝÆôƜŚĉĢʉŰĊҙ¤ȗĖV¼ÅxWƞۂlXXèm„ÝmUnšĠƒĢóÒkƚ„ÆUÞ¼ÞJĸѰ„ɲĕš°Ŏn"],encodeOffsets:[[114098,42312]]}},{type:"Feature",id:"1503",properties:{name:"乌海市",cp:[106.886,39.4739],childNum:1},geometry:{type:"Polygon",coordinates:["@@Ș°ÇīXњŗ@ȍlkƒlUٱīĵKō¼VŽÇôXĸ¯Ž@šťê„°ź„k¤„x™œ@Ĭ"],encodeOffsets:[[109317,40799]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/ning_xia_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"6403",properties:{name:"吴忠市",cp:[106.853,37.3755],childNum:4},geometry:{type:"Polygon",coordinates:["@@nLV‚@šVLšaÞbn@@l˜š@bUVlUV„zVx™¤kÞVèšXnš‚@nm°a@UƒÑ„@VŽXnV@Va„UšŽVKUUU@@U‚@@KVa@U²@‚wXkWnk„±lLnU@UmmVKnIVWnI@UK›@UK@@UVKXkmWLWUXmlkVwUyVa@w„w@aVI„K@aVÈw„KlLVV@LnV„VVnU‚ܲ°WÈIUÆ@nÞ¼‚‚@¦™@UÞUVW@UxUxVn„b„K‚b¯ÞU`VbǬ™V@XXÆVVl°InmnUôƒ°¯‚anam£œWVX‚KXmškôaVU@ƒVak@@wmaƒn@K@UÛUWKXUƒÇƒ@UI™b@alW@akLUKV@@Ukw±Iš›nL@kmwkWmk@JUIƒůVmnnU@m@UƒK„VKlkUwkƒƒnVUKmbkI±š—KƒkmVkKƒb@U@aƒVkUmn™`kIlaUK@UUKmbUIݚUa@mUa@aƒ„m@UUULUK@bmKkbWI@WXwlkXƒWa@k@kKƒLVkkK@L@JUVmzUKlwUUnW˜£XVlKUwVU@aXI@aWaUw@W@_nam@¯‚UkWVkUWaU@nwmJkUVkWVUmUkJ@ImbUaƒ@@WÅ_mJknmak@@mƒXƒaUV@„ƒxUšƒ„@‚ƒ„@VUnkVƒ@Vn@`ULUbWLXVW@kbUJ@XW`@ƒnÅĖWJƒ@—m°@xƒxšbnUa‚w²lƒÞ°xŤIVVULۂWbšbkVVXÆ`UbVL„@kx°LlV@Vœ„WbƒJn@bl¤ULV„°@lmL@ƒƒ£U@@aUwmKULVxUVVx@„™@kU™@mK¯LÇa¯@"],encodeOffsets:[[108124,38605]]}},{type:"Feature",id:"6405",properties:{name:"中卫市",cp:[105.4028,36.9525],childNum:3},geometry:{type:"Polygon",coordinates:["@@°@Èb°KnLš@lVš@@ƒUwVUUwVKnLVx@bV@„¤@„nK@k‚¯UƒVKk£@a‚m„IXa›ƒ@UkU¯Klwƒ@UKVaÅ_UWlU™aXa܁VKUUţJ¯w„ݱkxVbmŽ™a„w@wn¯˜„@XIÆĕ„m‚@X_@WVIlaX@WUXKVaVK@_Um„@lUVm@U„ƒ@„ƒV™„w@ƒVUÛwm@@W@ImKUkU@Ua‚aXƒ@wWaUKkw@UVaUamLU™nk@»±`¯@k—W@Ua™ykbƒI„„@VWJkLWUkJƒwU@ƒn¤mL¯wm@Umƒ²XVWbnV@bmxƒVkxUblLUV@kVWKU¼ƒŽkUƒ@mn@JnV@bUnmJUn@„k‚@XlxšLVVnKlLVV@š@LkKULVbk`WL@lkXW@kVƒ@UÞUlÇX™lkaUbmV¯@@L@šƒV@bkb@xƒlW„—bƒbW@—±@UJ@IU@mVk„VxV@@l„Illœn@Vm@ƒVUbl„@JLmKÛXmVkU›KULU`@LĉwƒKUX„lVUl@Vb„JX¦̼bÞxŎxɜĖĠ„Ŏaô@"],encodeOffsets:[[108124,38605]]}},{type:"Feature",id:"6404",properties:{name:"固原市",cp:[106.1389,35.9363],childNum:6},geometry:{type:"MultiPolygon",coordinates:[["@@Vnn@°xnK‚£„mV@„xlIXVlKXI@Uƒƒ„JlašzVbX@l˜°@²_@¼mlVšnKVbUb@VlxVLXb@xW„bVbV@VlnL@J@Xn@Üx„b„W@nl@nblmnIÆ`@X„@Vbna@aVUUWVkƒ@kbWakbU@VwšW@_l@nmn@@alVlk@UkmVak@@a‚UXaƒL@¯@KVa@axWI@KnkVaVJn_lJ@„X@‚m@nVanUVb@mXLlJ„VWnLla„VVaVX@KXVVkVKlknKVa@aVU@KXb@klJUknUmƒ@K@_UW@alIUamaU¯kJma@IUK@U„@@UW@@aXLVƒVJVaXIƒKlaUkUV@ambUUJkIWJ@wUI™V@JU@UwV@@Um@™nU`@UkUmVUxWUUV@aÅb@aWXkKUUƒUUaWK@wnm@IVU@aXwm@UmVaUalk@anKUwlƒUwlkK@wmaƒUkmmIk@VmkUUbW@UVUnW@kV@xkVmbVnU‚™@UbUV@a›k@kkW@„kLW¤@„nV@VU@W_UV™UU`VLUV@IUVõVULU@UUUJ@wmkUJ@šWI@l@bkKkbVVƒbVbUL@UUJ@Vm@@L@xbVVVLVlVwX@Vb@bmUkbk@@JWIUVÅw@Km@UkWKXxWLÅ@UVUnWK@xkVW„@KULwWVXVWzXVVKVXkV›V@VUbV@U„VV@š@LXxVL@V„b‚Ž„LnKVLVxXVmb@l"],["@@@J@aƒU@LWK¯UUxVVn@Ġ„„LUW@UbUUUa@KUX"]],encodeOffsets:[[[108023,37052]],[[108541,36299]]]}},{type:"Feature",id:"6401",properties:{name:"银川市",cp:[106.3586,38.1775],childNum:4},geometry:{type:"Polygon",coordinates:["@@šUšwVK@UVWÞUšbšw„V@knV˜@@KU_VK@K„ƒn@W_XWlL@Vn@Ċw@Ulaœ@Wanamī@aƒ»ŋó@aÆÅɲÿUaV_°ÝaƒLƒaUmVwVwX@VUVݚ@@¥Ý»@mVÅÇJ¯XÛ±VUmƒUmU@KUUkKƒLÇxUŽ@bƒLUJ@bƒx@xUbVzUxklWnXV‚KnXWlUL@V@ŽVLœ@VL@ŽmJUXmJULnn@VmVkKƒ²mlXWlx±@@VUb@L@@VV@VVUL™ƒVUbU@WmUƒ@„Ò@V¯bmn@VŽƒ„@lVnUšnVWŽXVl@¦VVUn@x‚š@‚XL@¦‚lXxš„Vb"],encodeOffsets:[[108563,39803]]}},{type:"Feature",id:"6402",properties:{name:"石嘴山市",cp:[106.4795,39.0015],childNum:2},geometry:{type:"Polygon",coordinates:["@@U¯ķó±ÇÛ¯™ķmbXb›@kb@Vĉxm@@UkKWXX`m@ƒ„@LULV`@L—@mU@lƒU™x™aÝVUX@VUL™x™VkLWVšš@J„nVLXVlŽUV@zl‚VL@V@b„„n@lU²WVLlLVbUŽVxUx@xǀL˜xôҜk‚K²ŽVa‚U@wXa@W™ÈĉUa@‚bÈk„m@¯"],encodeOffsets:[[109542,39938]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/qing_hai_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"6328",properties:{name:"海西蒙古族藏族自治州",cp:[94.9768,37.1118],childNum:7},geometry:{type:"MultiPolygon",coordinates:[["@@„V£°š@laœXô±źwš™ô@„Ulƒża܍n™Kƒw@U„aƒ™ša²L‚mÈLƚÈxlaUa„wÞmÜbÞUšnJ°a„kôƒ‚ÑkwÝVğwÇ@ÝkkV¯¥@ò„»„nŤ¥XImw@mVwša@Åw™mLkaW—wƒ¥l»kçƒó„»@ƒWÑĉŽğ@ĉ„™‚Ń„UwóřVómĵ»™™Ý@VǕ¯kšÝĊÅk™°ÓUklkU±šI„ÇÞkƒ±@šƽJƒ™@UġIk@W¦™VÑșÓÅnťKULnޝX›ƒ@¯mUÛ@WřmóKknōbƒxÝ@ƒŽU@kw@ÿÇLţšÝUkšmwƒŽk™lċVŚU¦™ŽƒLkUWlÅÑ@aƒ@ÅѱUóġʼƒÈĉmŻ@@wkw™Kl¯U™ġ@—„lÇU™Ó¯_ƒ‚Waĉ²Åló¼VbknƒKǎÅ@ƧĢō°Ý@ğ„W™ÅxUUm@™‚ÝXۂW„ULUè¯@mbUaƒLƒbUWġxIUJWz™a¯b™y™@ōÈóLU`ÇXUl™UĉV¯n›mÛbǕLklƒUĉVƒšóaġ„ƏbġKţnkbÝmmnÝWȭȃŽÝXţWókUÇl¯U¯‚ġUɅĀ@°¯„„š¯„VÆnmJ@ĊķnóJUbÝXUlVškL@lVxnnmb@¤Vzš`ÞÞŤ@„VnÆJV„°b„UôJkzlŽkl@²óš@ÆÇ°k˃šÇbÛU@lmb™XV˜kzƒV™ŽɅĀXˢlń„ĬŹ@›éÅ@ĉńưğbUšlŽɜ_°‚@xŦ˜škbVbƒKĢ„ŤVŎް@żÈźlĊ„ôKôb@nôxŦ„Æ@ôŽŎL@þÆb@šnnšWˌbÈx‚InaŎxlU@Ѳ±ƒğVŨƨbɲ@Þ¥ôUUķWVô¯ĊWʶnôaŤˁ@£nmnIôŽǪK°xUXô@Ŧa°m‚kXÆÞVŎkĊ°ÞLȄôyVašIlwX°UVwĢÑÜKôw@nV@œm°nmŽn„Ü‚ɞ£VbmŽXnƒ°ÜÒ@xx@V‚b²UlbkxVnšJUnVVĊ°KȚm°nxÇnn¤±¦@ŽUXVV@„lV„„bmVVȁŽVxšÒ™°šIšbźaȃšbVwš@šƒVL„™ƾÑ@ƒŦô¯ĊkôÑ"],["@@„@šƒ„@n„òVœa‚w²bVxšxÜaČVô_ĊJšIVmšL„a°@Ŏ¥XlK@ƒšk„l„KVbUb˜@nUĢn‚aÈ@lmǬ»Ġ¯œn‚mnƒƨVy™Ñǖ™Ġ»ɲInŽ‚@@ÅĢƳ@¯°™ôV„KÈbVIÇ¥¯@Ýó„™@ÑnīWKšƒk™‚k@¥š™¯™Åa™Xƒ±VÅw@±Ġ¯@»™š™n™Wmw@ƒ™@¯ƒVƒUUWçƒKĉ„a±VkkƒV¯w™x@šUJ‚x@bknÇb™mÅ@Uw±U¯¦UŽ™Kmš¯I¯Žť¼ğĊ™@ǃŹÈ¯@Ý»ÇnˡJƒbÛèÇnƒ„ÅK¯„ġĠʐW¼Ålm„@¤n²ƒŽÝb@b„š¯lƒ¯@ƒšÅ¤W„™¼nV@x„„°@Vx„@lbUblbX¼W‚œšÇ²lšUŽ@¼ŽV¦@bÇlVxUbVxÞbVšœbm¦ƒVV„"]],encodeOffsets:[[[100452,39719]],[[91980,35742]]]}},{type:"Feature",id:"6327",properties:{name:"玉树藏族自治州",cp:[93.5925,33.9368],childNum:6},geometry:{type:"Polygon",coordinates:["@@ɆÿĢV°°VÈklVôŤXÞW„ȮÇÞXnmÞnlaŤmĢLƐãôb„™ĊU„VlkǖKÜaœn°mĊUšVVkÈWV_ôKŎǚ@šz°ašbXyVI‚JĢwVX„a„KVbna°@VçVKXƒÜÞWšn@VVÆwXšĠƒÞ@Ŏ¯ƨġÆ@ȍ„LlmUaô»ÆkĊ±Xb„°`šÔV‚kȘƒĢ@Všk°šLlx@xż@Ċn„Çź»ô̲VÆÒ„@@bÆÒXklV„KšV¥Æ™ČUšk‚l„nxl™çƒ¥ċç@±m¥ƒwÅJƒ@™™™Vƒ„mÈIléÈa°U¥™™@kÞV‚K²ÑWƒ°w²Ñ‚K²ñšyƐ„ÝšVmw„»kkWĉ—JWUƒVÅwƒL™mÅ@@ƒmw„kn¥Vу»°™°@@»„¯„Lla„JônV‚UůƒU@W¯Umѯ¯k@WykU@¯„wV¥ƒkVwţƒk»šwWǜĉĶçšK„ƒÞ™ÇaĉbƒI™lUƒ@kwƒWƒXUƒ°w™±@UšKn£Wĉ—KWxƒkĕVƒšamwXw™@™„Wmnk@aƒVkƒ™bĉLƒl™Imm„wUÇ‚Wx™nÝJn@¥Æ™kwƒaXƒÜĉ™¯ÅV¯¤mkƒx¯kķܙ²VWôŹVUƒƒ@V£™¥@ƒ°wn@™m@¯@UbUôķŽmn@ÆÛ@ÇýVaUÇĊVƒ@Çlğ—¯xÝŤ™lVÈÈVƒx„ƒ¤Vx™„kK@™@ƒx@„kVƒĖġ¥kIWbXŽŎx@nƒxÅUW`ƒ_—@±ŽUa™LUxƒK¯„WbkVlb—bmŽƒLÛÆWIUwƒWkwÝV@kI›ŽéUb›UUk™V¯Km¯k@Umݐ¯m¯›m—L›Þĉ‚ÛUm™ġ£UxkKm°™Lw›šk@kšƒVm„ƒKVUk›@¯a¯Ģ™móKUU™x™ImlÅn™™ÇbXèVVU„°„@ŽšŽ@„‚xXnmš™ššŽ@¼ğ°@²ÆxU‚„²šWÆb°š™š@¦llš™„XLmĬ@҃šÞô°@ȦUJÇaƒLóU¯š@°ġƴ@Ɓ@mɱJğ¼ǕššÒUzƧ‚m„n›mğ°ǫ¼knÇ@bġmmV—@VaUaƒLƒk™l@„kLW‚ō¦¯@ƒb™KUn™JĉIó`ċUÛb™wUw±ax›bñUmƒƒ@™„ƒ@—bƒaƒbǏÅXm˜„ƒÝ„ÅôVbގ™bl„UšÞVޚ„U‚°„VUxƒ@U„V„@l`™¼nL@Ċ„LW„„¤kXķWġXUVVVķ„UbVb@°kVVxÈa‚@ȦĊbšaźJ„U@Ț„„˜Vœƒlš@XkôaWƒĢ™Þ@laĸUÆb²mÞLĠ™ÞÑôbšÒĊa„JVbm¦"],encodeOffsets:[[93285,37030]]}},{type:"Feature",id:"6326",properties:{name:"果洛藏族自治州",cp:[99.3823,34.0466],childNum:6},geometry:{type:"Polygon",coordinates:["@@ÞVŤ™ÈK@ĀlxV@„Þ@„wŎalmôLšnXÆÜ@nV‚°@œ„°WmVKŦLÆmȚԂҚUX¥l@ĢJVš@„ŽƾI@w™W°™™Ån¥›kÅÝVwôƒÈç„@lÑĊĕša„JnaÆLVw°kny°UnkÆVȍĊll¦„Vƾ@@™nUźƒÈǂIn°X„wÞKô¦VWV£„@£°ókċ±I™™am¯Va™»ČĉV¥°™@m„k„¥l@„Ċm@ašU™mwXƒ@wÆxšmĢ_„`VnÆbšKVw„@@ƒnUVğVmVVöIlŽl@@çÛmƒ£UDŽw°@VUƒ¯»m¯ƒJōĖÅLƒa@»ĉ̱`U_k`ÇçšóƒkX™lK@ƒakÝރš£WċkÝ™kxƒJݯÅw™xķxmIÅx„@k±J@ýŋš›¤UœkŽmV™°ÅÝxkwmġƒnÝVU„š¦ƒŤlmšóXk¤™UKƒç™@mVkK@klīƒ£mš¯VUbƒW¯¼ċb¯ĵam¼mVX„m@k¤ÇX‚ÇbƒUƒ„¯J¯„¯È@˜™bVXVҙ¤V¼kxݚV„@l‚V—„WxÛ¦Wš¯šmKnlŽkŽ‚šU‚@nƑUĉ„Ý@ǺۄċUĉ¥™UƒÞŏ™z±òL±Ò¯xX„±ÒLÝU@lššV¦¯‚ÇbkêÇJƒnU„šš@š„‚ÆI„xn¦‚‚@²Č脦‚è"],encodeOffsets:[[99709,36130]]}},{type:"Feature",id:"6325",properties:{name:"海南藏族自治州",cp:[100.3711,35.9418],childNum:5},geometry:{type:"Polygon",coordinates:["@@VxƒŽńƒš@ĊĠŽĊXÒ°UƾĕÞm°£nb@‚@LUUW„Ûº@nlÆǬšĠ£ÞV°UXb‚VȂǵ„éƒ@kWanm°@™x„z„K°¯ĠVšƒVƒkw™Lnm°kÞxÆa„¥@‚wnĉƏ@™œ_l›š_VwšmĸèŤÅČU@™˜Wn@ÑmKU™nğƒK@ƒ°¯UÿV£nmšLl™„UƒUÛé±óókkmƒnƒakV@ǰóÝXƒWəÞťIţxmm™VÛUVȂÓnWyȁĉkƒVš°WnkĊa„¥‚_œK°ÿWna@ƒmU¯wƒlÝIU¤UXó¥ÝLƒx¯WmJÇÈŹ„mV@šƽ@ƒUk¥ĉkċŽÅUml¯Vmz¯lUxÅKmbƒI™bĉĖk҃@Çèó„UxÆÞœlm¦šÆ¯ššX@x™Ž@Ž„²ÝlƒÈ™JV²klVl¯ÔlšĉƙްlUǖÞ@ššĶ¼nŽUôôŚ"],encodeOffsets:[[101712,37632]]}},{type:"Feature",id:"6322",properties:{name:"海北藏族自治州",cp:[100.3711,37.9138],childNum:4},geometry:{type:"Polygon",coordinates:["@@ōmġxƽUm±Lǿþġԙ@kxmWƒb¯I¯‚mIUx@bƒbŹVǎƒkĵbƒlĉI¯¥ƒUšm@ƒÆ¯È@šašóšUlƒČ»@w›œ»›wXaƒƒó°ţç݄kUƒaV¥ÅbÝw¯lmnšKlxU„™„ğU¯°ƒLƒyšw¯@mnXb‚l„@ƒêȁǶUWa¯VÝUğ¤ǫ™kÅ@mܹXƒVV@K@ma¯¤Ýnƽ˝V@„ƒ¼„ôlèk¼„¦˜xXŽlbnKšÆx@Ž™bUx@nnxWJţ¦ƒmƒ¼ñ@ް¦lUÞlÈ@ĠxÞUlxÒó„ƒl¯bmI™ŽÝVÛaÝnƒxVbkbÇwřÇKn±K™b„šƒb@V„xšLmŽÛŽŻbk„ƒVó@™šŹxó²›Wkb™@¯U¤ƒźĊ@lUX„°lÆôU„ƒlLX‚aœV°wšxUb°xÜôÈKVkÈmlwškÈKšwšK™™VUŤĉŎ»„»„Il¥na°LV»²¯Üy@w̃°ĸwlwĢw°±„_lVkš@°ƒbƒÆ¯zƒ‚„š„@l_„@̱lŚVlUaރ„LVƒnKlnȏ°IllČa˜wÞѰx„UU™@wƒVkmĠLô»„KÞýôaÞ¥ôĀÞmƁ„™‚mUƒŎV¥Èl°²°a²¥V„@@w„amm@Ñn@Æ£żƒVƒĠ£@W„¯Þƒšl@š»@Uk@"],encodeOffsets:[[105087,37992]]}},{type:"Feature",id:"6323",properties:{name:"黄南藏族自治州",cp:[101.5686,35.1178],childNum:4},geometry:{type:"Polygon",coordinates:["@@ôl²ôÜê„VƒVkš™KmnU¤V°@„„LmĠVšnLÈL@alb@al@n°Vš_XmWUÈamaVIn@n‚aV£œóVWƒ™U£°ašxÈ¥@™‚aĊwȹ@óša™ƒğbm@k„w@mƒaÆw@ƒ„In¯mmƒ@UkkWƒÑÅ@@kċÅçVkÝJÅkVykŹl¥@¯š™ĢU܃X¥òý—mmX™ÝÅlmU@£™Wly™XW»Åbƒl@aI›»k@klm@UxUUƒVƒ¼¯Xƒl™aUnķ‚ƒI@x™@¯„ƒK™„ĉUU`óšlȝô@¤ƒÞJ„k°xVŽ„n@ŽmbXޝ›L`ƒ¦ĉbml¯X™ŽUŽl„ȂĊXzm‚ȁÔU‚ÜVšUnnŤwŦJɚ݄XÞW¯ô@ÈlU„b„mln"],encodeOffsets:[[103984,36344]]}},{type:"Feature",id:"6321",properties:{name:"海东地区",cp:[102.3706,36.2988],childNum:6},geometry:{type:"Polygon",coordinates:["@@@҄bš¤ÆI°ôU¼š°UŽnnWx™š@b¯L@lUUWbXxWl„ƨnxVUllš„XVŽUŽnL@lȀý²KVnƾ‚ĢwV»ƒ@mÞ£nÆƒÞÑmL™ƒKUaVżĕƒWVk²ƒƒÆÝ@ƒXw°@„ô™@a°wóUUmIk™™aVmÞwmknyƒ¹VÿƧnŏm£X»˜™naV±„Ýw@ašb@aƒm¯„ĉVó¦kÝWKUU@WanU™b@ôǺĉxb@šÇ¦™w¯bV¤„šUX›ôU¤bmm@UJnbÇbXVWn™`¯Umk@@bka@bÇK"],encodeOffsets:[[104108,37030]]}},{type:"Feature",id:"6301",properties:{name:"西宁市",cp:[101.4038,36.8207],childNum:4},geometry:{type:"Polygon",coordinates:["@@@kmKVUƒWk™VkUmwƒƧXkWwXaVV@k°K@aš™XwmmV™¯V»¯óÅJ™£ƒamŽ—X@šċVţÆķç™nUx™`kœ›`@šÅmĊx@Žƒ¦U¦„blVރŤèô¯„„Wbœx›¼œŽ@xċ¼k„™V™ô™bÇ@Ű@„™n„V°¦ĊJ„kĶa„lȍźU„a@aVwnJ°°J„anXlwš@ĢÓ"],encodeOffsets:[[104356,38042]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/shang_hai_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"310230",properties:{name:"崇明县",cp:[121.5637,31.5383],childNum:1},geometry:{type:"Polygon",coordinates:["@@uŏu»GPIV±ÐɃŜ{\\qJmC[W\\t„¾ÕjÕp‡nα|ěÔe`²„ †nZzZ~V|B^IpUbU†{bs\\a\\OvQ’Kªs†Mň£RAhQĤ‹lA`GĂA@ĥWĝO“"],encodeOffsets:[[124908,32105]]}},{type:"Feature",id:"310119",properties:{name:"南汇区",cp:[121.8755,30.954],childNum:1},geometry:{type:"Polygon",coordinates:["@@`y”ĉNǕDwǏ»ƒÖLxCdJ`HB@LBTD@CPFXANC@@PGBKNECCBB@EBFHEDDDSNKAUNBDMNqf[HcDCCcF…@EFGLEBa@ACoCCDDD@LGHD@DJFBBJED@BGAEGGFKIGDBDLBAD@FHBEF@RFDMLE@SGANFFJBANPH@@E@FJjRIACDMDOEKLFD@DbDAJI@AP@BGHFBCBGDCC@DCA@CECGH@FKCEHFJGBFDIHACEDNJDCVFBDCRKRLDLITB@CjNJI^DBCfNVDHDFKHAFGDIICDWBIF@@CFAjFJNJBBHD@CJ@AEFJ@@DH@BFBCPDBMFEQGDIFCNDHIP@HDABFACBJFHEBSZC@DP@@JDBƤ~"],encodeOffsets:[[124854,31907]]}},{type:"Feature",id:"310120",properties:{name:"奉贤区",cp:[121.5747,30.8475],childNum:1},geometry:{type:"Polygon",coordinates:["@@~T~JjZdDbLXDLCB_J@@FHFZJJIAGH@HGR@BENBLID@@LFCDF\\FpDBDb@FAHKFE†@dEDDdC\\GreNMACVMLBTMCCFCEGFAA@DAFDLMHA@OD@BMEWDOC@AS@KGAI_DcKw„ÕísƝ‘åĆctKbMBQ@EGEBEJ@@MBKL@BJB@FIBGKE@ABG@@FMFCPL@AjCD@ZOFCJIDICIlKJHNGJALH@@FPDCTJDGDBNCn"],encodeOffsets:[[124274,31722]]}},{type:"Feature",id:"310115",properties:{name:"浦东新区",cp:[121.6928,31.2561],childNum:1},geometry:{type:"Polygon",coordinates:["@@EN@JJLNHjLJNR^GRYVBNZJRBV@PDvbLNDN@LGNER@nCNQNuT_TIVFV\\Z\\XnDrI|[Ʉś²ÏJUHOƣ}CA@IO@@CYDATGFIEDAEBBAGCO@GJMCEDCJRHEFANOCADAEG@@CI@FE@BDIC@AGIAIMiEEB@DE@AJCXJDCJEHGBELGCUCeMAD]CIJiM@DSAKJKCLQDQACUECDMIFCBDJGECHAEIWCK@GLMCCGEACNKCEJG@MMBMC@@CIJUINT@JAJSTEPZZCP"],encodeOffsets:[[124383,31915]]}},{type:"Feature",id:"310116",properties:{name:"金山区",cp:[121.2657,30.8112],childNum:1},geometry:{type:"Polygon",coordinates:["@@L@BIHFN@@EE@@EFBDGDAADVDD@@EF@CA@IIsRE@GDAF@BF@CV@|FBCHBLCNHAFCADBMDCFZXHILBVEEQA@MWFARJJ@DCX@@TEFBLHAAERE@AJABRPBNK\\BrJ\\VHGND@CNADKDADQjGAGNC@GJ@FCFFHC@JF@@dLBDSFADHVG\\DTEPDDHJALIJkJDJCDIPE@YDCBiK@DONE@EH@BAF@HLJA@EIA@ALKNA@@FIFAFHR@NALadsæąyQY@ƒA±DʼnXUVI^BF@FFF@HBJEDFFGFEBSRkVEXGHFBMFIVW@GAEEFOIAIPKABGWEKFSCQLQBSEIBC\\FdBLRR@JGACFDDEF@AWB@LJJYNABBA@CUEGPaO_AIE@MYMFIGAEFECHSAAKAO\\[JEDB@E@MMA@@AGBKMGDFFCDDFEDFJF@NPBAFLHFH@EDDHBADDC@DDCDHHCDDFDABDAD@FEFOBCJ[D@HEDDNJBDDHABJIBBvGLBJAH"],encodeOffsets:[[123901,31695]]}},{type:"Feature",id:"310118",properties:{name:"青浦区",cp:[121.1751,31.1909],childNum:1},geometry:{type:"Polygon",coordinates:["@@RUNKdOFDJCbRFMLAHPLDN@JGL@@APBWYCKN@TU@SHGCEJIDIJKVIZVNM`iNY@CIE@CA@KBOEGEUFCCSADEIEFCDDDIDDHC@CKIeDCG@IG@DHWFEEGCH@@GO@@O]CNpeEQDBFME[JC]DGF@CKOA@QSB@GB@@GW@@ED@AQIJIAAFE@@DO@CFI@KNG@CDACAFEGKGBEGBDCCAIFCCLIECFI@MBCLDHGNAHSF@DMB@EEKBA@@C]DEICFG@ADBHGFKCDAKKHKD@@FHGAANGEEFCHKCECBCKG@ADKCNE\\[A[I@@mGBDQQEO@BCE@AI[AML@JGACLOAFKEMM@EQKC@CUCBCCBCHEA@FF@@FM@GEAJK@GNF@EXPH@FD@M^@HIADJCFDBER@DK@@DE@CAKFOCCBDHIBCNSB@GFC@GQEEOWFICGDUAEJIDBTAHJHEB@DIF@NE@H|HBDBEH@DKBAHEF@HEEUB@FGFGCCCE@AHOB@NH@PRLVNNFBX@RC€PbAvMtBfH@DJF@ELBFA@EH@HNED@FFB@HLC@CJ@@DJ@PIRf@HE@CFF@GPHD@DKE@FFBEFFD@DEFCA@DD@IjCRFBAHFDKD@HF@@PM@H@BlbDJDBFEF@DLXB@HCD@@IFCBIFEJD@FDC@FBALLF@PAACJERACAJCBD@EL@JD"],encodeOffsets:[[124061,32028]]}},{type:"Feature",id:"310117",properties:{name:"松江区",cp:[121.1984,31.0268],childNum:1},geometry:{type:"Polygon",coordinates:["@@@DLDFRN@FNELPBDKHB@INK\\BBJF@ADP@RFCRHA@nJ@B\\[\\MFLDBCH@DLDADFGLEDFFMHBBGH@EC@GLLLCBLDHEAGBCH@DEFJ^C@DB@LAFFA@CNE@GTMBGHKCAD@NEJFDKJDDJEDBCDHAAFLHFHBEBDDCH@LMJ@DEP@@CF@BEJBJIBRC@@FX@@HA@@HTA@RPBDLE@CHD^\\INFAERCfFMo^D@PP@@HG@HDFFXECGH@@JDHfCLJ@DGDCCCJCCEDJFCFTBDDVEHFPFLAB@NBFCFKFC@CHIACNOHWHCAAFIDD@CDAGEI@ACFMF@R@R_@GQED@EGFEQEDE_IAHKAEXCQUOQCUDEN@ZI\\DDmAMHCICDSOC@EG@BKHIGMIBCGOCSF[CUHCGEBCTKA@cE@@IGDEEEDI@@HMDBHiHCRCBCLMB@DMCGH[UqI[AMLOAAQIB@BQFBFGBAKFE@SW@CDI@QIEBNXB@FRUFKAGJYWDENCCADBBEMGKDGAAD{EU@@DAEE@CB@HQFJt@JDBE@@FC@"],encodeOffsets:[[123933,31687]]}},{type:"Feature",id:"310114",properties:{name:"嘉定区",cp:[121.2437,31.3625],childNum:1},geometry:{type:"Polygon",coordinates:["@@F@LI@IDKJADKIEJICADGACFECCJ@HKCAFOHAJI@aCBEE@ICAEB[GFGCKL@FGEIFADMLCAEJM@ELQECEIG@BE^QKKLQCA@EHBIGQ[GEHOMGGDHKH@JOECFCjCBEFDNCACMBCILGTABDLEEOEIG@GFIMM@CGKFBFCDE@@GEAGEEACIcGaHMFITIHDN[AKF@FS@OA@BK@IHM@KCGOKBENaQIDECcPMLQVFHFB@BFBKLGD@FAJOVGIACQ@A`LPCB@JEF@RU@ANS@@RCL\\HIFpRBFRBBDKLLDADJDGBFDABHBEDNF@DGBBBADKDAHC@\\JJFBDEH[DEFDH\\LX@XLBLbT@DNJLDCEL@VJABJNDHB@HBHYFBAA@GNFB@@AFB@AFABFLFBHFCL@HJBAFBLC@DN@HN"],encodeOffsets:[[124213,32254]]}},{type:"Feature",id:"310113",properties:{name:"宝山区",cp:[121.4346,31.4051],childNum:1},geometry:{type:"Polygon",coordinates:["@@ˆmÖoÖiƒ½[s[YEUJU`SCIEBCCWJY_LIICDWU@@FaBCJIB[ICH[@@CDKEE@MK@@IMCAEBCH@AMFI@SMGEFGB@FK@BHCAIFJNQD@FEBDFMBKGACG@ECWH@@CDDTOEEBGEK@GC@EE@GPHFR\\JHGA@FDBKRLL]RAFH@FJFDKR@FINBFKDCNEBFJEHK@DLEH\\HFADB@JFFDA@bIJGBEPDBGLI@DDEFBDCHDBIJJFCLIBCL@JKJE@ADHDBHJ@HIBBDFHBBAEIJ@BJFAVL¢ˆ"],encodeOffsets:[[124300,32302]]}},{type:"Feature",id:"310112",properties:{name:"闵行区",cp:[121.4992,31.0838],childNum:1},geometry:{type:"Polygon",coordinates:["@@T@@ELE\\BCMJGJSNEbGdHDJFBJAFIEIFCEWG@@gMENSFCVJFAxR~B@IH@AIiI@GE@FGEAFQPDRiV[\\DFSGMHAXHDOMCJCDETBBNVJJI@DD@ANNNH@FILDDMFBDHNDHKL@XDFGLD@EHGFD@DDB@CDDHCDAEAHG@ABOJ@BIaC@CECLKPFNCDCJBiQEIF@@@OGBMIAEEBMTHF@NKEC@QFEGA@EBCKAACHCLJHEFHHB@AFCAIEACIC@HG@KCCDC[ECEED@KC@KJMAAFQ@GHG@BHIJYIGE@EI@A`KDWCaKcCiY}I}S[CYJM@CFDVPRRVWDFžLBBG`JCFRFEFFHC@RF@HQ`Q@E@ENBDJ@HFCB@DCCEJBBGDGXMPBDGJ@DEDELEDMA@DJF@DMZ_jMNYUUJILCJIJDFGH@TSVM@DLXZ"],encodeOffsets:[[124165,32010]]}},{type:"Feature",id:"310110",properties:{name:"杨浦区",cp:[121.528,31.2966],childNum:1},geometry:{type:"Polygon",coordinates:["@@V@CXJDKJZ`XIDDFADJvSRMDM@mFQHM@KCMKMuaOCU@BDAJSX@HKJGD@PNJCJWAGT@R"],encodeOffsets:[[124402,32064]]}},{type:"Feature",id:"310107",properties:{name:"普陀区",cp:[121.3879,31.2602],childNum:1},geometry:{type:"Polygon",coordinates:["@@F@@FHDL@HFFAPFCSDC@@XGFDH@BDLHNACEFA@ERCIMJEDBAGL@@EHAFENHHJ\\ONQBQCIBC[MKACKI@GGGH@I_G@CW@[DMHCDIBMTDHN@JNHEH@FJFPKFACSBKHDJNABDMDECAFiDEDFDIPG@GLHCNH"],encodeOffsets:[[124248,32045]]}},{type:"Feature",id:"310104",properties:{name:"徐汇区",cp:[121.4333,31.1607],childNum:1},geometry:{type:"Polygon",coordinates:["@@RADL\\NCPHFfLJaJ@FWLGMGIK@IFMDOYYFOTSBI@IMSAMSACFIDNDCPWGGBHNET[CU\\QjOCERFBEHF@@HjJBJG@@J"],encodeOffsets:[[124327,31941]]}},{type:"Feature",id:"310105",properties:{name:"长宁区",cp:[121.3852,31.2115],childNum:1},geometry:{type:"Polygon",coordinates:["@@HFFB@HF@DCAELENSJADCNG\\CX@@D`H@JHGHHJ@BINBFUGEDO[MCKQB}AwQEBUIEDMTNF@hH@FXEDFJEJIB"],encodeOffsets:[[124250,31987]]}},{type:"Feature",id:"310108",properties:{name:"闸北区",cp:[121.4511,31.2794],childNum:1},geometry:{type:"Polygon",coordinates:["@@CSG@BQGODUPWTOBQAAFMECKBGEMFKEOHADDJARMR[PGI@TEJBNG@ADBFND@JL@@NFFCL@D\\@DG\\JJADI"],encodeOffsets:[[124385,32068]]}},{type:"Feature",id:"310109",properties:{name:"虹口区",cp:[121.4882,31.2788],childNum:1},geometry:{type:"Polygon",coordinates:["@@bA@E@QHSXBDIMI@OHCLI@GTWBIACQAYIOFGCENBBARSPOXCVHPARH@DT"],encodeOffsets:[[124385,32068]]}},{type:"Feature",id:"310101",properties:{name:"黄浦区",cp:[121.4868,31.219],childNum:1},geometry:{type:"Polygon",coordinates:["@@NEHFLAFDHDPEAMZUHQQ]IMKJG@EPERABHBGRUCCNGV"],encodeOffsets:[[124379,31992]]}},{type:"Feature",id:"310103",properties:{name:"卢湾区",cp:[121.4758,31.2074],childNum:1},geometry:{type:"Polygon",coordinates:["@@VDHQGABAFQFOH@LIiKKHEXI@IbAFZB"],encodeOffsets:[[124385,31974]]}},{type:"Feature",id:"310106",properties:{name:"静安区",cp:[121.4484,31.2286],childNum:1},geometry:{type:"Polygon",coordinates:["@@DLLB\\NPGLFHUDMYABEeKEVMAAJ"],encodeOffsets:[[124343,31979]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/shan_dong_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"3706",properties:{name:"烟台市",cp:[120.7397,37.5128],childNum:9},geometry:{type:"Polygon",coordinates:["@@ŤLšLllVń²è°xżĢĠÆl҄šŤbœ„V¤ĊXnŽlĢVĊ„Òš„ȰĊŰÞè˜L„±@џn»VUźċ²»ÆkôVɆkĊѲkŤVVwUUVmUaƒ@KkU@ƒmUmmk@UwUkmW@UVIXa@ƒmw@a™KULƒaƒx@Uk@UbWU@yULmK¯@kXƒVUwm@@JUUknWKUVƒLUbU@™wWykIƒa@w@mUI@ašUVynIWa„k„@@W„bl@@knmƒK@wnIl™°Kna@V¥ğ@ġUķ»™¥@UōJƒX¯¤k@™wmI¯‚k@mwƒak@@šlX@bUJ@VƒbknWxkLkxlŽšLVlkLmŽšb@bU@ƒbU@VbU`Vb@n„L@Žmb—U@˜VnUVmnU@mm™@kIUWVIUK›VkkUJUnmL@VmLUaVWaXamU@™™U@KUUmVƒU—JƒU™VÇwğn™mƒ@mXĉV@l¯xnô"],encodeOffsets:[[122446,38042]]}},{type:"Feature",id:"3713",properties:{name:"临沂市",cp:[118.3118,35.2936],childNum:10},geometry:{type:"Polygon",coordinates:["@@˜bXlƒl@zlV@lXXmŽkbVVlš„U@Vn@@Vmb@XšKšVX„WJ@XXl@„‚ŽÈbVLšUl`„@XXV@VVUxVbUxVbš¦„@‚WnXVJ@bnVUzl@„°Æx„U„KlU@mUUnUlUVWVUnVV@XX°V@Všll@Vk„aXVl@Ux@bmbXLlKlb@b@bUJn@@„„b@n°x°K@an@@UlLVKVbXb@bVVnK°LVa@UVa@™Xw‚KVxnLšU°@naV@UWUkWƒULmV—wÝKUUla@aó_@mƒK@aUU@ƒWUkwVm@aVI°W„@@IUw@a±¯@¥kUVUm@a‚wkw™@ƒK@kVKk@maXalI@alL„WXblaVLVU„V@LnKš@„l@w˜aXašLlnUl„LšmV@n°J@_VmnIVym£UKmI@WnIVm@anUVmÇ_kġIÅWUXÇm@U@ݯÅ@ƒ™@naWƒ™IVW@IkK@klKn@naWIƒmk@ƒaƒbkKkLWn™WkLWmk_ƒ@UaVƒUKmLUw@mn£WwUmU™ƒaóV@UkUm@UKULUwmJUX@WW@XҙzVblJXŽWXk@UVWK—X‚¤UL@xU@ƒ@ƒVUaU@@XmVkLmWkXUyÝLmKXnVŽ@n@l™x@bWLnVVn™`knULmxUl„„WLXŽVb@VƒK@z¯x¯¼Wx™KUn@bk@ƒlƒVVVz"],encodeOffsets:[[120241,36119]]}},{type:"Feature",id:"3707",properties:{name:"潍坊市",cp:[119.0918,36.524],childNum:9},geometry:{type:"Polygon",coordinates:["@@l@@UšK@Ž@L@bX@@VlL@JƒLUVnX@`ÜXn`V²mJ@bU@@n„b@l°xnnĸVƚ°@„ƒĊ£Þ@lWnÑnkʶJmó°w@kk»V@»ƒ¥k@V@kw@wVm„a˜Å„mšaô£ŎƒXI@mln„Kla@mV_UKƒ@kUkw@alW™IU»™mƒ—@WUIl±UUÅU›bkJƒ@a@wUKUaVIÆmXIWaka@m@Ul£XKVw@ƒUIƒJUkmJ™ƒVkU@a„ƒWK—ImVƒ@UxmL@bX`WXU@U`ÇkUak@@°UblXk‚mLUKmL@VULóƒƒVk@@Vlbn@Ub@ċaUJUbƒIUlVLUVVbVKX„VlVXU@mb¯@™VmKUwLWx@šUb@VUb¯KmLUU@aWaUaULkK@Vm@@b¯L¯w@mƒa@ƒm@UUU@U¦lJUXƒVƒmkb@nm„XVWŽkb™IVxUV@VUbWLXVƒLW`Ux@nk@Vn@x@VkJ@œV`mXkŽ@V„xV@lVššI@VULš˜VU„IV`°bVXXx„V@VWVnL@xV„Ub"],encodeOffsets:[[121332,37840]]}},{type:"Feature",id:"3702",properties:{name:"青岛市",cp:[120.4651,36.3373],childNum:6},geometry:{type:"Polygon",coordinates:["@@„@nU˜JXLƒ„@blVU‚š„nIVl„IVJ@„UxWLk¤@V@nlbXbWJÅnUJVbVL@x@b„ŽlIœaÆVVVk²VJ@X„˜šnV¼šJkX@blxlV„@VLU`@nkbƒLkm@nWJō„ó¤™bƒn—ƃbUn@xlxU@l@„¦@¼UŽl¼ĊUnW„@šnĠmÈxšU„V˜I„VnUVV@LšV@šnVWbXb‚UVbnK@UnKVmVIllœUVLUJVXlJš@nnV@nmVUUm@—˜Vna@ƒK@mUaV_UaV@„aV@@a™anlKUk™KklwlKXwlm„a@UVI@akW@™l@„bnxl@°nJšxl@°£„WŎIUÑn»lašmô¹Ŏ¥VaUUkƒmkġWɱIUUŹ`›@kk@ĉƨřV¥_Ç@™Ĭƒ¤ÝL¯m¯£ƽóķwUW±ī¯kōaĉĕ™kğmó°ƒbW@UKkLUaƒVmz@V@ŽUxVn"],encodeOffsets:[[122389,36580]]}},{type:"Feature",id:"3717",properties:{name:"菏泽市",cp:[115.6201,35.2057],childNum:9},geometry:{type:"Polygon",coordinates:["@@@¥šIVUÈmÞ»@UlU@Un@VW@UVmkk@aVUUKVÝ@UVknK@UV@VVnIVƒ@wnƒmwmKXaWaXI@UV@Vy²blkVKkam™U@kb@Um@VmUkmƒKmkXKWwkU@Ulƒ@UnK@UVUUm‚KXwšUVL„w‚K„U„@@Wl@@wUkV¥—@@I@W@_V@VWUw@UUa@aƒaWa—@@_mKUw™l¯amzmV—@WK™nU@kƒWLķaUKbÝVmV@UWÇbÛ@ƒX™°UbW@XŽm„Vlk²UJUbmLÇxÅWUzl‚¯Ll„@VkK™XUbWJ@bU@¯@™ƒkbƒLmKka™„@l™_WšXºVbUz@J‚n²V@¤lX„Ž„nV°šLn`WbXLôVlKVUšxXn˜lXLlU@bVV@„XJWLUVnVV@„„@n‚l„°nn‚V„KÈbVXÆJU°VnXV„kV@@xVL„@šWlb"],encodeOffsets:[[118654,36726]]}},{type:"Feature",id:"3708",properties:{name:"济宁市",cp:[116.8286,35.3375],childNum:11},geometry:{type:"Polygon",coordinates:["@@nam_nKlVLXa„Il`š_@KVVXI@m@w‚ƒ„@@k@Kšnô@n`VbV@@L„L@KVVn@VX@‚VL„Jl„š@VUUƒU@Uam@Uk„wšKWaXamkJmIUVUÈblašUnV@kVKl@@lXL°kVJ@VÈnVJUX@V‚LXl@xVLnU‚@VK„V@a„IUaV@„bĊU„x„K‚kVJXUlV„ƒ„UVašI@WUI@KlUnw„mWk@WXIWƒ™U™L@Wna@Um@@UƒVk™UUlanWW@kkU@y„kWk—aWVUlÝbUU@kƒJUIU@@ƒ™JmaókƒLKǃUUkKWLk@WbkUUaƒbmKn¯°¥V@XwV@VanaVaU_@Wlk@WÈ@VUÈVVۂm„aklKȯlLVUX@lK@aX@@kV@VmV@VwnJV_UWUwƒX™am@kW@wVUkKVIUUVmU@UV@IVK@aUL@aƒV@Lm„UKmx@ށômLkUWJ@šnXmlUxUL@Vkn›VUšU„@V™L™`Ub±LkV@kUKÇbÛ@ƒU™Wó_mJƒ@Wk@@Xƒ@ƒVLƒxUK™VWxLVnUV@VmL@Vk„@VlVXxWLnl‚Ln„VlUnn@@VlaV@nšlbULkl±aUzU@@VWJXbWbnLnxm„@xU„mJUUU@@VmLUl@VUÞVLUV@bllUn@VUXm@@VkV@VݼÇnUV™J@¦nnƒlnVlL@„Þb°KVV"],encodeOffsets:[[118834,36844]]}},{type:"Feature",id:"3714",properties:{name:"德州市",cp:[116.6858,37.2107],childNum:11},geometry:{type:"Polygon",coordinates:["@@„¤@VmbVXnVVbVJššX@Žll@z„lVInl@„@bVxUbĠ‚l@Èbla„IšxXVWb@L™@n‚ULWVXXšWWLnL@`@LUVVL@lVn„JšU@UUk‚a„™nš‚Vôô„b°¼V‚ސXš˜‚œIÜbČa˜bôW„XÞWÈzÆmnLVJ°ÈnlV²lbnW@™@UƒUV™šmnwmkkKWƒkla@mVIUKUa™aUwmn™JU@@amIk@@bVlkX@mmUklUUƒƒa@_UaUUƒV@wƒw™WkXmW@I@WUaÝU@UXaWUU@UUVW@UUUWUn¥nUVa@m@k@alU@wk™LWa@UUm@@wnmU™wla@anKn_@alK@ݙ_ƒ@@WUUUmlkaƒIƒyU@UwU_Wa¯yU_mWUwkImm@InWWUk@@UVWV—kW¯U@VƒL@b¯b@l±¦@šVV@lUbV„@škxVnUšl¼XV@b@lV@nIWxnbƒ‚™@UU™LƒxÅxm¯ƒaUƒ™wU@mUÅVÝKULm@bmKUXó@"],encodeOffsets:[[118542,37801]]}},{type:"Feature",id:"3716",properties:{name:"滨州市",cp:[117.8174,37.4963],childNum:7},geometry:{type:"Polygon",coordinates:["@@Vb@`„bV„kVlnV@nlWUk@al@nJ@bV@šInmVxšbVbVLUJ@nkb‚lX„lLnlmx™nUš„V@V@šmXn˜lbĸ@nnVx‚b@lnXV@UJ@nVxšxnxVbÆVn¯ƒĕ‚@@wÈçUÇlķVIœb‚@„Çmk@¥k@UkUK@aWakUóJW_UW@wkkWK@U@Kš@XUƒƒUkmUUalKXala@U@kkWlkÈl@kšV„mVIVmU_‚a„ƒƒwnwVW@wƒwUƒ@wU£ƒwkJWIyUI±bk‚VUJ@nmV™Ukl„Xmx@lnbW„kVƒUkLWŽƒxkKUUmUkb™J±—LÇxUKmkUmkkW™™a„mUaVkšJÆ_²KĠ@U„W@w„U‚¥nUWwK@aÝUkÅVaVK@akLWƒƒƒ¯I@bnbVx¯JW„ñšWbUL@šƒŽnV@VmbkUUV@IÇak@@bWak@WJUœJWL@bXV@„‚@„V„Jlb@zUlUŽUImšnbV‚mz@°UV@V™bV@@V@L@xLmKUnmJVX„J@VkLW@UVUL@b"],encodeOffsets:[[120083,38442]]}},{type:"Feature",id:"3715",properties:{name:"聊城市",cp:[115.9167,36.4032],childNum:8},geometry:{type:"Polygon",coordinates:["@@ô@VWnL‚an@VKÞLÆUnVV@šxV„„bn°Æw„wšKVVš@„maXwmJU@@k@aWUk»V™Umlw@™UƒVa@kUU@™²¥@k°a@a„K@U›ƒU@mmm@ów—ѱ¥¯@@w™Kmw—I›¥kU¯UmakJmIUaƒVkKUkm@VUUa™Uƒ@UaƒKUK¯@™w™UVŽUIUKVw™k™¥™wƒbVŽ@xn„@lWnXxlL@`„XlJX¦l°XxW¦@¦Ul™n@Ž™@@Um@@VXVmx@¯bllUnUJ@VULVn@b„xV‚VL@b„„VlnVVblV„ÈnVlIVJœLô„lJ@xl²„"],encodeOffsets:[[118542,37801]]}},{type:"Feature",id:"3705",properties:{name:"东营市",cp:[118.7073,37.5513],childNum:5},geometry:{type:"Polygon",coordinates:["@@ͬUǪlô@°Uœw°ōĠ¯š»Ģ炻XÇ@w™wƑa™ÇƒkwVƑ¯@řķUmm¯w@kƒa@mV@@anIU±m_ÛW@_mWVU„K@IkK@UW@@a@K@™L@Vk@±U@UV@lm@mUU@kLm„„xV¤@xV„„x@xUXmx„xƒ„bV`UnUJƒn™U@lÇkkllX@l@VkbWbkLVbnVVl„„WV™@@L@VXLll@xVXX`ôIlVXb@bVLVll@@¦nlƒÈ@›aUJkĸVÈÇè@x"],encodeOffsets:[[121005,39066]]}},{type:"Feature",id:"3701",properties:{name:"济南市",cp:[117.1582,36.8701],childNum:5},geometry:{type:"Polygon",coordinates:["@@²¦˜Òôxn@nn‚@V‚œ„°VlXU˜UX@Vl@XVmX@JnnlJVxnXV`°zXbV`VxV@„z„JlbkŽVnVV@X„@š`@ÞkL@bm`mL@bkbšxnVm@xn@VV‚@XbšKl@xkV@b@l@nUbmVm¦XVVV@VUXVVV@XVWb@VÞVVb@X@JnXlWšX„x@x„UVV@aVKVUX@lK@UƒIUWnIVmnL‚K@w@K@UU@ša@UVU@¯nyUman™VJVVk@ykaƒIƒU@@ƒWU@aXK‚IV›XIl@Xb@al@Èb@JVUlVna@UmU„@™VKXaò™Xƒ°IUwma@aU@UU@wVW@фw@a™I±`kbƒUkw™UmJ@UkmÇUUkmKknUVƒ@mJUkaWkƒa@KmKkUƒLmyXa¯_@WmImmbƒLmUkVUbUVƒJ™bƒUkkWJkUƒl™IUm™k™Lƒ›„lK@knaVmkI@mWaƒLUK™UU@@VmLUVLWK@UUUƒWUkkVmx@„Vl™¦"],encodeOffsets:[[119014,37041]]}},{type:"Feature",id:"3709",properties:{name:"泰安市",cp:[117.0264,36.0516],childNum:5},geometry:{type:"Polygon",coordinates:["@@n¼šŽW„nxšL@x°@š¥Uk@ƒnwlUVl„XVV@VXL‚KVUnK@UV@šVVL„KXb@nlJUnmb@lkLƒ‚„œšKšlVnšJ„klVXIll„Vša„IVUValUnV„K‚annnJ@X°`Wbnz„KlVnL‚Ž@L„bXl‚bVlnI„@VUU@UmVƒ@U@Uš¥@VmV@@_Ua@m°@@ƒ„kmUUm@UVmn@nX‚@@a„anJVUVL„mlIVJn@nkVLVa@KVmVLXVVLš@@U°bn@VaV@@K@aVkœbWaXUVymU@aUImWXƒ@™¥UaVwUaVwUUU@WWƒ@k_™VUKÇa@ƒƒnmxkV@LVJ@X™JUbƒVƒ„kUWVUIlƒLƒwĉVƒaU@VbƒJ@bƒUUL@mVUK@wWkK@UVWUIÇm@UUI¯lWK@kk@UL@lmU™VkbÇaUVVnJlIn‚WbXb™LƒxVln@VbV@V„UV™@kƒƒIUK@UWm@UU@LƒK@KU@Uam_ó@™m@L@lƒ@„@x@nWJUU@L™`k_ƒJWbUKkmLn`mb"],encodeOffsets:[[118834,36844]]}},{type:"Feature",id:"3710",properties:{name:"威海市",cp:[121.9482,37.1393],childNum:4},geometry:{type:"Polygon",coordinates:["@@VbUnVVUxĊ¼š¼ô@Þф¯‚WǬLŎUÆW„¹Uǃō¯ÑƒÝkţ™™ţóġ™óL™ł̥U™wm¥kÝmkkKóbÝ@U¦@‚mb¯LkšmJ@x„Lmn@lk@ƒa@Xƒ@ƒlXbmJUz™V@bVJ@n@x„blJXzšxV@Va„KVUXLlmVV@In@Vx„UlW°@nLVK@zXVVal@@V„w„bVKšL@bnx@„WbUJ@VnXVlVxl@nnnV@„lV@L„‚"],encodeOffsets:[[124842,38312]]}},{type:"Feature",id:"3711",properties:{name:"日照市",cp:[119.2786,35.5023],childNum:3},geometry:{type:"Polygon",coordinates:["@@UaVUUKVk„JVaVIČb@Vam@ka@Ul@„Uô„VK@UnKVLnKlkWVa@¯l@VbÈlV_V@XWW_@anKVwUmVw@@Uny„UVblKVLX@„aô¯ó¥mÛĊÿÈ¥š™Þ¹lUīƒ¯Kĉ¼ʟbÇV™U™ŽUŽ™XmakJUnmV@bUnmJ@XnJVLn¤UzmJUn@`¯ImŽU@™nƒKVkkm™KWb—b@xƒk™@mL@KƒUUVUKkbWaƒXkK@bkJWbnbl@UL@l„Lš@lxx@b‚nUVlV@¦²°@bVx@Jƒ@¯XUJ@bUnlxVŽ„X@‚VV@b„L@nô`@bkbVVÞL˜xnU"],encodeOffsets:[[121883,36895]]}},{type:"Feature",id:"3703",properties:{name:"淄博市",cp:[118.0371,36.6064],childNum:4},geometry:{type:"Polygon",coordinates:["@@nƒlKV@nVn@@kVU‚@²VVaUƒ@wmKXU@UƒUWwUW¯aU_ƒJUV™—VK@U™JU™@kUƒw@UlnWU_@›lI@U@wUml@@mVwX_„KWUXKVa@UVUUwšJlaXWUnƒ@mla„n„UVWkIV¥V@VVVI@a@akakLWKna@aVwk@WUƒbUlk@™k@U¯UWWU@mUUVUXkVmVVV@nkVƒLƒVÅwƒ¯k@WVXb›aUl@bV@@b@xkVVXVxkJ@nk@@ŽVLUlVb‚VXUVVUzV‚™LVbUbV„VWVkLmškJ@n±@UxU„VVkV@bƒx@ÒUX@xVVV@°J„„X„lK@bULUblÆÞV@b‚LXxmV¦ƒV@xƒXVŽğ@±LÅ`™IUlVbƒnšbXšllVnnlVLÈw˜K²ŽšIlanVVVlL„wXlK„VlUXƒma@knwƒWlkšVnU@mVIUl²aVJ‚zXJlI"],encodeOffsets:[[121129,37891]]}},{type:"Feature",id:"3704",properties:{name:"枣庄市",cp:[117.323,34.8926],childNum:2},geometry:{type:"Polygon",coordinates:["@@‚yUU„U„kl@@aVmšLXw°»°w@y„L@UUaWXKƒƒVknwVKlmš_UmmUXK@ašw@k@mUWmUL@ƒ@™@£@KƒbÝV@akw™aULmƒƒbUK™LUU@lm@—°mL@nUJVxVXU`mIUxU@UnU@@lW@@bkLW@UVkKǰkLlŽƒbnUÜÇUUVÇ@@Xkl@XV`UbmbUbU@WxU@¯¦m°nL„aVblVXal@XKlLVVȄ‚L„KôlnbšI@„V@VJ„I@lVVÞaVkXU"],encodeOffsets:[[120241,36119]]}},{type:"Feature",id:"3712",properties:{name:"莱芜市",cp:[117.6526,36.2714],childNum:1},geometry:{type:"Polygon",coordinates:["@@lmnLVlÈVln@VnIšVlx„Vla²_šJlUUUVƒVw²@@mlIn™lKXU‚UUƒVaUašKUVyUUWVUUaVkUK@l@@mlIUwUWlU@w@aU@@LU@Ubm@¯a@V™@UKWUUKUn@LUbUKmlm@UIkJƒnUKUVmIƒb@b@mWm@Un@VVnnVƒl@„¯@@nVb@`U@Un@Ž™¦@V@VU„VnV@"],encodeOffsets:[[120173,37334]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/shan_xi_1_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"6108",properties:{name:"榆林市",cp:[109.8743,38.205],childNum:12},geometry:{type:"Polygon",coordinates:["@@™ýVƒnIW»ƒW@»kUÇL—݃U¯¥ÇIUWWїUWwX¯mƒ@»n@ÜÈķô™@a±kȱƒw„ÑmwçċmU»ÆkkVyIm™ĉÿ@ƒÝ¹ƒWnwÇVš™Åaƒzmmĉ¦ó™kVmx™xU¼VškVm_UlVlk„°IV‚kmJa›¦k™™LmmV@XmKnšlUô›VXbƒbƒ@UaÇLğܙ™Åwƒ£mKnmċwÅ@UkƒbmaVƒƒƒn@m¯aU™Jm_k˜@kWXyl@@kÅamw™LU™Þ™ƒ™mWÅzUKƒš™Uk±@™b@nnK‚bX¤mzVšŽVxÇn„‚¯„@ÒknWƒƒVUbkķÈÑWkk@Va™™U@„mUkbƒÝÅ@Ý¥ÇbkĬ™XV`kLǍVmalUUa™nV±nwmkƒJ@Inƒ°KVw¯UnÅ@¥™ƒ™U±bUU˜±œmWbÛKWnUm`UƒVK@bmnœm‚Èż@V„L@xƒxmš„Ť°nŽ@VmK™²VlšlKk„ô@„êÜV@VXLlmš¦UššV°Ș¯²ÿ@¥š@ƁĊ˜²IšmĶnnb°b„KVƒĸLl„Þ@UȮš™Ü°IVƒÞÝސlŽœx@ŽķĀWŽ„Ux„èƐ@š°ŽXnšlĊ˰m„nƒšV„²V°ÒƦ„aބ„˜@zll@bÞšlš¼nKĊ¼óȂb²±šIǪÒ¯ĖV@„lxnVlk„JlaXwŌĉ„„@VnŽššlÆĕ„UÆLœèŌŤôxȚlUœ@šxlaUċĕXm„IWmnkšVVƒ„VW_@aÈWUUmk@ƒ¯çVm»™±W¯n¥V™mkXw±ÇVwƒ"],encodeOffsets:[[113592,39645]]}},{type:"Feature",id:"6106",properties:{name:"延安市",cp:[109.1052,36.4252],childNum:13},geometry:{type:"Polygon",coordinates:["@@@kkÇmIšmUwVkUƒƒU²WmšVkm@m`mIĢĕUƒVa@™mXƒƒÿVVkyUýšĕ@l_UmnƒW„KVkţ™™¥™aƒwğ@™@aôƒ„ƒWa„kUmƒa¯¯™a±£kx™mmxUwÝ@xmU™b¯K™wó„Ý@kmm¹Ub@lklVbmnnVUV@x›UknƧJUX@ŽƒLÇWkw™LķƧÅwWJk„ƒLkþĉxWz™JUnǚkš@Ɛk¼ÜÔÈKšè@°lșÆk¦l„n@l¼@l¯L™°UU™Vǰƒ¹—`m¼mXk‚™bUaƒV@U¯x@¦™Ç™„UUmlmUVm„nnmlkw™@@šƒ¦Å‚ÇLmx¯Iklš„@¦mưVUx¯Lm„@J„InlmxU²šmVbkV‚bUnȎlKU_šWlīÈaÞ¦Æ@„ÞlanV@ƒšVšUbl@XlÇÒĸlŽVa„UX„lm@ѰƒƒÈmUw‚U™nyW£amL@mša²@lšV„™VLÆynX„šÝšVššKnxÆb@lk@WzXŽ@ll—n`šIV‚°b@n„m„„‚Unb„aVlÆ@ČxmnnL„¤ÆxššĠÛÈKVb„@„aWaœU‚ókVm™nL@W‚UnnšKlšœ¥‚bnIlU¯JlƒUkVkn`lUU™V»šwnwlUôšĊ¥nn„yÆb"],encodeOffsets:[[113074,37862]]}},{type:"Feature",id:"6107",properties:{name:"汉中市",cp:[106.886,33.0139],childNum:11},geometry:{type:"Polygon",coordinates:["@@lKnb@n„lWb°bkxĸwVb@ł„nlŽ„ƒĊ¥šL@XŽl™ÈƒVblÈK‚b„akVwôml²`‚nœ@‚nVKœl˜k²xŎƒ°¦VU„JĊw@çnWçރVkUóÛ@¥kwš™šUmƒX¯WšÑkƒ@UymIUwlUn¥‚mUk²a°¯V»@™ÝVș„ÝċÅÅVl»@l@a°±@_kammÅb™a@ƒƒm@ż™KknõĠ—@mšƒ„¯LÅw›‚—LVxmb@¼kV™@mw¯wVakKW»X±¼¯Vkxƒb„¼WŽ@nx@x±bóakbƒ@ÝmU™@ķÓÛL™kƒVUm™k¯¤ÝLUlÝ@Ýz™š„x@x™°™™™bƒmƒX¯aUJW¯—k@bÇWƒwÛwWxƒ@XWlb@Žƒ„VŽÈUlwšLnl°VlUô¦œU°¤VšUxVXUxlbkVVlƒI„°„ÅVlU°m@k„ÇU¯xUlƒLUlVL@b™°ĠInĠ°ÈnK‚„@xÞa²n‚aUyšXUKVkšWô¼Èa‚z°JXUVÇV_„JVƒšz@Žnb"],encodeOffsets:[[109137,34392]]}},{type:"Feature",id:"6109",properties:{name:"安康市",cp:[109.1162,32.7722],childNum:10},geometry:{type:"Polygon",coordinates:["@@„bĊaƨèšwôô„¼šb°ašXVƒÞVUÞ@‚aXƒm¥kImx¯¯ƒV@anU@UÇéğL@ƒ¯¥V£mƒ@ÝÈb„K‚™„X°wČÿ˜ƒ„b@xÈblxȯĊ„„mÆUVƒ„nÈ@ƨÜLĢ¥ƒŹnƒ°Vnn˜K„aô_ȃšwU‚aXmnW‚¯kl›LXƒÇ™ō¦ÝaÅVmbğUn¥±wÅéVƒan¥ƒ„U„»°am¥„£ƒÝ@ƒ„wVw™¥nU„уUmmVwmķIÅaóVWxkblb@ból@œğÒĉ¤ċXƒ˜¯X™xk„Ç@óÆÅx@š™xķ_kmݎǣkblb@`¯²@bk‚‚@k¼ÆUČÆƒÞǚÞU@šU¼¯°±bVlnm¦kVVxnJVz@‚l„™ÒXW°n„™V™šlx@¦ôÜVUl݄Xèm@è"],encodeOffsets:[[110644,34521]]}},{type:"Feature",id:"6110",properties:{name:"商洛市",cp:[109.8083,33.761],childNum:7},geometry:{type:"Polygon",coordinates:["@@²nl‚ôbš„°aVwnKÞIš`°wšXôw°VĊ°@ŽÅš„ÞÆV„zÞK@xšŽ@a‚LŚ@b@ŽnLlƒ@šln„mnLVw„a„bVƒ‚VnbU¼„Vƒ°„bl„šbÈ@ĶŦb˜@nÇ@amIyUI@ĠVmôƒU™ƒVwkwlanJ„¯lwó¥@an°Jš_„‚@š™nóƒó@£l¥UwmašÑ@ƒUm±V_ƒJ—£›J—UW¥¯@ƒ_k¯¼mUƒVUè¯b@wmL™»ğVmağI¯¤ċIUW™XƒKĵ¦ķaƒJUb™IƒlUóVmk@WÅÅÇ@ƒmU„ÅVƒnĉƒÇ°kwÇa@wƒa—„ċxƒWšƒLÇa@Þn„U¤°¦@„ĠKÈê@VmV@b„U°°nwlJn¦W„bÝ@VŽ"],encodeOffsets:[[111454,34628]]}},{type:"Feature",id:"6103",properties:{name:"宝鸡市",cp:[107.1826,34.3433],childNum:10},geometry:{type:"Polygon",coordinates:["@@@ƒ„£@›°Išb@¯°ynʃaUƒlƒU£„Umšĵĉ@@ylUÞ@@£kWU¯WaU£¯ÇV¥ƒ@kb¯wƒn™¥ÇkUÇnUƒ@¯±›kULm›@m±_kŽónUxlŽƒbaÇLkŽUaDŽkšW@™Kĉ¦ƒ„kƒm@ŁUaķxlw¯aXaƒk@mmakL@šmšÛŽ@¼m„@l„XV`ƒn™KUš°°@²š¤UÈ@VxmôƒxKl„VV²aVw„Xla„Vlx@UVnŽÇnk°ƒVVL™lkI™šƒJÇk¯V@šknƘn@lznmlVkzVŽ„VVxš@Ux„z@x±¼VxxU„l‚kb˜@„¼Čk˜VXlĠkôV²w‚LUKlwœJ@a‚IV¥Þƒn¯Ün„‚„@nk˜l²kÆ@š°„aVbnI@™š‚Ťn"],encodeOffsets:[[110408,35815]]}},{type:"Feature",id:"6105",properties:{name:"渭南市",cp:[109.7864,35.0299],childNum:11},geometry:{type:"Polygon",coordinates:["@@@ÈôL„xUް„Þ@mŽÈnl¤nUôL‚wX`@ÞÝL™ŽUšmLô„„ŽôbVbnºlnÞ@ôƒšx°LšanV‚wÞ@Vxnwšnlw²¤šb°°„bVnƒlXbƒ„ó„@bš‚Ġ@„xšbš¦ŤšV™Xġ„£W¥ƽɽƒó@ýóƝÝ»„£X™mƅšĊkUƒ„@™™šó„kťaĵŽÇ@™akƒƒa„¯ƒUV»maUU„ƒaƒbUxmKƒnkm@™k„mK@ƒxó@¯n¯KǦ@ôÅèlxkx°nƒƾ¯KU¯WķL@VÝIUb™yWbX¼Ç°"],encodeOffsets:[[111589,35657]]}},{type:"Feature",id:"6104",properties:{name:"咸阳市",cp:[108.4131,34.8706],childNum:14},geometry:{type:"Polygon",coordinates:["@@šIXyĊwlý„KlƒXIVaķƒ™»a›£„¯aVU@a™‚wÈō‚ašL²»‚VœUln°WȯW»XašzVaÞJ@Uƒ»@¯Ýbğwly@£kÑţ±Wу@ka™IUƒƒnƒ@¯ƒómţU™b™U¯lÇIÝb@¤Ý@kV@zĊ@™ĶnƒVV¤k„V„„bmź¯z@°™a¯J@œƒ¤@„„bUx™bƒ„@`™xUÔ±ºVXœW‚„UnUJ‚L̝ÈKlblmÈXŎ°šU„°LšŽlkÞKš@Èxl_°ĶUÒkblš"],encodeOffsets:[[111229,36394]]}},{type:"Feature",id:"6101",properties:{name:"西安市",cp:[109.1162,34.2004],childNum:5},geometry:{type:"Polygon",coordinates:["@@°²@‚„mVVÈÈlš¦„m°xla„@U¦°ÈV¤XbV°lXÞaÈJ°kšVšaŤVôn°„„@„mV„šJlb„@XÒŤ²lÒ@¤kzĠxÞa@°„¼ĸK°XV‚°L„ƽ¯mlwkwÆç@óÈ¥°L°mô@„w@aƙK@b™@wÝLƒyÅUƒÝƙ@ĉ¯¯Uóx™W¯x™_ÝJmLUx¯b™ƒóak±mÝUU„™W¯b™aƒ»óó™xƧçĉbƒaĉxƒIUV¯¥ō„±w—l"],encodeOffsets:[[110206,34532]]}},{type:"Feature",id:"6102",properties:{name:"铜川市",cp:[109.0393,35.1947],childNum:2},geometry:{type:"Polygon",coordinates:["@@ÆxĸƨšKlxÈX„K@VWƨIlmœV@wVUmUnmUalk@kVaUaóaƒóƒnKV™šÞK@ÝW_xóKmVk£ÇmnÝ@¯ƒVƒwóK@ǯXkm›VU±¼™KbÇŎx‚š@bUV°bƒœ¤‚bš¼ĸ„Ub"],encodeOffsets:[[111477,36192]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/shan_xi_2_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"1409",properties:{name:"忻州市",cp:[112.4561,38.8971],childNum:14},geometry:{type:"Polygon",coordinates:["@@Vx@lnbn¦WlnnUšmš°š²VšV‚VVVnUn„ºlz@l„„@Jƒ@kXWVXl@Lƒa@„ƒKUL„ŽlbnKlLnK‚LnKÆXn°šbVV@bUVl°Un@LnaVJUbW@UX²l‚@ČwlVVIšWnkÆa°„„anV‚Kn°™UW¯@™aVUVk@Un@„aV@ValwUanmWU„k@WVUUanaVwnLVl°@nk@mVU@UVK@w„LVKVU@ƒ„K@UUKVUV@@bnL„a‚V„aôšlIXmlKX_°KVV@bVV„@šzV`kblI„V„Ul‚šL@bnV@V„Ċll„„VlIXW@k„a‚U²blKšVnIlJ„albXXlWVn°JnšnL@l@XlJlaX@„X˜W²@l_VmnKšU„blU@mnkVK„¯@U@ƒma@kX¥VƒmakkƒLƒa@aƒ@WIUUVXWWnk@a°a@kkm@kUUmJm@WUUUIk`m@V—kaWWkX™KmƒXk¯ƒ@WKƒLkak@±bƒw@ƒaƒa@akaƒ@ma¯@ƒL—KÇÅkKWbkmġ™±ÅUƒLUK™VVkƒm¯LUVVbƒ„UwUW¯bm„ƒULƒxWJ—@ƒklmkUm@@KnwVkVK@akwƒ@@a¯bƒKkn›VUI™b¯mmbk@UbmKUL@xUUƒ@klmLUŽlVXI‚VVVUVUœU`mLXVWbXnW`Ų°xmށxU@mĉƒƒwU@mbU@UƒmbkVW¦kJ™@ƒX@`¯Im@UlUVVnb@bWJXnmbƒJUU™UUaƒ@UamIkaƒxƒ@@x@b"], +encodeOffsets:[[113614,39657]]}},{type:"Feature",id:"1411",properties:{name:"吕梁市",cp:[111.3574,37.7325],childNum:13},geometry:{type:"Polygon",coordinates:["@@@a@w„@„wlbnJVb„@VbšVVV„InaWmXI@a‚aUmVUVkn@°J@_„Wš@lIX¥lUnaV„V@naV@„xĊ„n‚V@‚wn¯wƱX_WmXaWUnKV_V›VUUUUWJkUVnKlk¯™@@kmKUaٱKkU@WmI@WUIlUUmVwXƒ‚w@ƒUlUVwœV‚@„Lnb‚W@anU@UšaVkô@l»n@na˜JnUÈLVaƃUUVm„VKVƒ²L@mU_lK@UVWkU‚a@a@U¯aUaƒÑóÑUb™„ƒKk@@aƒk¯mVaUwVƒÑkWUmK@UUKmXUWÝwUa™LUU@aWJUUU@Ua݄U@WL@VKVaVI@WnU@alIVKƒƒ@kIƒmIkJ@™m@ƒ™@@_™K@xƒ@kaW@U„@Vmn@ŽUK@mIƒJUXV¤XXWlkKƒkkK@XmJVakImJU@ó™¯LWKUV@nUVƒLkxmKkLma@kXKmmƒLƒab™LmK@V@mXVÆUxƒX@`nL„aV@@VmLUVnLlLš˜„b@„šŽ°²nx@b‚VUxlb@V¯bUV@zV‚XVĊXVx@lVn@VnnmŽUš@LlJXVƒz¯VWVXbšV@bmn™VUVk„Çþń@XVxmbUlV„Uln„W„@„Xl‚@VLXÒ@bÞJ°¦„L˜ò„@nU‚b@°„X@ŽXbmVU„V„nb@x‚x"],encodeOffsets:[[113614,39657]]}},{type:"Feature",id:"1410",properties:{name:"临汾市",cp:[111.4783,36.1615],childNum:17},geometry:{type:"Polygon",coordinates:["@@nW‚@@UnLšK‚a„b„KnnWL@lnblKnLlw„KVU@mVUXL°KôšV@nIlJUbnI@WlL„llLXkWWU£VW„InJ‚@VL@nm@UVƒX@lb„@@wšL@`‚@„šn@V@lw„@n„VmVX„WmwnUlƒœa@_lK„wVlUn°xVKVXXWlUšVVI@K@K„n°KœwlVlU@kna@V_„Wn‚m„UVm@kXml_@m„LlKXw°m@_ôJVUV@X™l@UaV@Va°I„lk»VwUkVmwUmmVn@V¯@KƒU—wmK@U¯wUVÝ@mJƒU—nWK™@@UnKVa„_lykUmKÛnm@™x@ƒUUlwVk™ƒXW@ƒa@Uƒ@@K@ƒkIV™nammVakUlƒ@wX@@kƒ™¯@ƒVVbml@„„°UbULmlVbnbÅK±VƒKVXUJWa@ULWaUU@@U@aWK@UkxUKƒLUUUJ±UkL@V±kk@kam@UV@l@LWl@n@VVUx„LlUUx@VUV™U@aƒIUl™L@°mLU‚ƒbkUUaWUUaUU@aWK—LWJ@bUL@VUVVbU@m@a@kmKmnĉlUK™XƒWUblb—xmIkƒƒU@xWb@lkšVx™LXŽmzVV@bklVVUzm˜@bk„@Vx@xlŽU„@lUbVnl@„Wxnl@n@ŽUbV„mL‚mƒb@`X@lUX@@xlnkLWaUJnnWV™Vn@l„@bULVV@l™V@XnJVX"],encodeOffsets:[[113063,37784]]}},{type:"Feature",id:"1407",properties:{name:"晋中市",cp:[112.7747,37.37],childNum:11},geometry:{type:"Polygon",coordinates:["@@@šlInJ„lJ„@‚„ULkJ@bmV@XUJUb‚L@UXKV@ރVbV@VVXI@bVVšKVbÞxVXnWVL@VnLV‚lX„ÒUŽVxUb°n„l@bl@„LšƒVaô҄ÒVb°b@VnLnnV@lmn@lb„U„V@„‚JœUVV‚Xkl@lUzmJ@xšXkl‚bUn„JVšUb„nU‚lb„V@nlLX@lakšV`Ub°š@XVJnU‚L²KlxnI@KV@lbUbVV„KnVl@„zlm@Uš@nŽšI@WUaVl@@mVU„@XkW@ƒnkVKVƒ„_Vw„y@knwVa‚@XalU„@šVnml@„X@V„L‚KVaÞbnnlJšI„mVKn„VVVInVlU„@„m@™mXK@UmyUI@mWUUakamw@wUwmLkakwVƒmK™w@wUam£y@am_ƒW@™UU@knmm„amU@WUa@knw@ƒUUUUV@nƒJm@mVUkKVUUUkKmwƒKULƒKUImV@lUn™nŽm@mbUK@°™bUnmbUmkkƒWUb@am@UXkK@a±@™V™@ĉř„V‚UXVxUVkLWl¯@@bULUlm@@nm`—XƒlWakIkm›VUbUL@Vm@kIƒ@@Kšm@—VaX‚I@W@aU@kUƒVU_™KƒbƒJkkǎ™b@nkKmL™wÅW@kVUUƒVU@WUIƒJmIXmma@_kyVaUUlkUm@ƒkU›x¯Lƒm@L@LUJ™UkVWXUWUL¯wVmUkƒxkL@`›bk„mVnxƒXUWUnmƒƒ@kxU@"],encodeOffsets:[[114087,37682]]}},{type:"Feature",id:"1408",properties:{name:"运城市",cp:[111.1487,35.2002],childNum:13},geometry:{type:"Polygon",coordinates:["@@„Vl„nJ˜wkaVa„XšWVLĊknmnL‚l@@bn‚V@UaVU@UVK@aXI˜KXL@bVVVbXVVblV„aVnK@¯šKVk„J@bšVVU@UVwkVƒKVwUUm@@Xk@K@kVUn@lbl@²l@UlK²VVIVV„KVLlw@VXL@b@VV@VŽXbVK‚@XbVIUW„L‚U²ÆLmaUankVKVaƒ¯@ƒnkUa„U°@„š‚n@@kWa„UVaXUW@IXKVw@U™ƒ„™WU@W@@UUƒU@mn@ƒ`m@UUULkUmJ™IUƒ@@UƒK@U@›anƒ™ak_@wmKUwmakV™kmK™V™k¯b™wƒ`kwUIÇx¯»ÇaŃmn@@™mƒmUkV@wkKW@kxmL™UkĉLÝk™xÝw¯lóVU„mV@ĀVVX¦W¤kz@`Vx°„²ĸ‚š@„Ul@x„êĸNJ°¤V„VlXLWnXxmV@nUl@„"],encodeOffsets:[[113232,36597]]}},{type:"Feature",id:"1402",properties:{name:"大同市",cp:[113.7854,39.8035],childNum:8},geometry:{type:"Polygon",coordinates:["@@²£šyl@Ȑ˜Ė@bĸŽĢbĸ„˜X„a‚KŤnn@ŎôllÈx„nVnÞDŽV@b‚nXllL°KšbVb@J@b—„‚„@ŽU„„xlKXLlKlXk„@Ulk„JlkUƒVKXUƒÇVIVm@_nǚLšašl‚w„VnU@UUwma@aƒaÝaLmUk@@Wƒ@U@@X™wVWÝUUUk@@VmLƒKV»nwUw™aUL@`mzƒJUIVƒUaUw™KUaVIlJôanÑlLVUn@ša„@VV„@@UUwVK°Vn_lJÆLœéW@UUUÅ@»lm@aÞIVwXW˜UUkkm@U@aƒU@mwU£VWU_kWmƒXwW_°yUkkK@UÇK@kkUVymóK—U@KWIƒbUak@mJ@bkbmLkŽ™UmƒkVU„W¦@lnb@„@Vƒ°ULml@nkVƒa™VmLUnk`±@—XƒWW@kbǦXޝ„WxI@xmbmxXlWV„„@bŎUz@J‚b@bÞb™ŽU@Wbk@ƒxk@WX¯VۙƒWÝbÝUkVUU@alI@a@akLWa™m@U¯UUmÇL@K@aU@¯VUkƒKmX@`@œkJ@nV‚Ub@lbVÆXVW„ULU`VbkLUV@XWl@bXJ˜@VbV@Vl"],encodeOffsets:[[115335,41209]]}},{type:"Feature",id:"1404",properties:{name:"长治市",cp:[112.8625,36.4746],childNum:12},geometry:{type:"Polygon",coordinates:["@@Uk™Lky@I‚JVa@mÞaWšy@_W@_WƒXVlUVwš@nw°K@m„UƒVaƒmVkU@mmmnLVUmKXa™U@IlKVUnK@UmWkX@WV_Vƒ@akU@a„KWIXyƒIUVmUn™Ua@WaXUVKVmkUWVkUƒLU@@VƒbƒKbƒIUmƒ@mbVL—x›WUUkn±V¯wƒbÅJUbmLkbmKÅKƒbVnUbƒV™KUb™KUbmLKmƒb™aƒKkUm@UŽnn‚VnxUVlUxl¼ƒk¯JUbU@Vbk@WšU@UVóI@`¯nWxkLƒK@nk`Wn@lUnƒVnm‚ƒXU`@mb@lkV@„VnklVVUblz@`nbWnnJ„IVJ@XUVV„UV@lÆXšxnKlL@mšaȍll„I„ašLV`„UlVV@@b@XJWUb@˜™n@L„@lJn@@UVKVaœUlnlJXb„k˜Wn_@mn@VkVK@a°@XklKVUUwVWUšƒĊƚ@šU²@@blLVWn@@bVa„XllVnnaVmša@¯VLnan@‚šmVm@knUVJ"],encodeOffsets:[[116269,37637]]}},{type:"Feature",id:"1406",properties:{name:"朔州市",cp:[113.0713,39.6991],childNum:5},geometry:{type:"Polygon",coordinates:["@@XXWVXVWnnlnn@èÆ¼@„„xlš„ŽV„nblšššVŽÈUVl‚š@„blnœL܃ĊmUkU@Ua‚—@WI@aXk@WVUlKUaV_VKXƒWUUÅka@VaU@mlI@›@_nW„LVl°UV@@b@LÈKVn°V@VšnXblK@b@bkJ@bVVlUÞVÞa„Xܚ°UXWl@„wl@XaV@šÝa@aa@IVyƍ@aƒƒXUWknwna@w‚JXw°ƒWÈ¥kI@W@kmKm™¯IUmkXWWkaƒbkImJ™UkL±aVƒb@lWXkJƒUkƒĉkƒ@UmU@a™KkƒVƒUkJlaU_™yƒ@UU@aUU¯LW`kLWnkJó™ƒbUƒbmK@aU@UVVL@VƒL@„UVULƒK@xUL@VUV@nml¯@UkmKUxmbVbUV@XƒlXVmnVbkxUbU@ƒbm@@VUlUVšb°@VX¯šm‚"],encodeOffsets:[[114615,40562]]}},{type:"Feature",id:"1405",properties:{name:"晋城市",cp:[112.7856,35.6342],childNum:6},geometry:{type:"Polygon",coordinates:["@@lV„Lšb„an‚LnKVašLVašL„UVaUm„aÆLnLlanKVaÆI„a°x²UlmVVœX˜wUKna„@Vn„J‚a„L„a@UV@@alUkKVKnkmmVwUk„w@ƒ™@kxWUXƒW@@mƒk@aUa@a¯aƒLkKmwkUm@kL@K@aWIXmƒVƒXƒWkUVakL@UVKƒw@aUK@UUKmLU@¯n™KUwVƒUIWJUWmka™@UXƒJƒk@UkmW@kLWKVƒx@bmI@VUaVU@a¯@UUmVKmX@±`kÝKVxUL±akL@V™bƒLkKmVƒ@XWVUbƒVXb@lm@@lW@@xk„lVUbnnmbUšlJ@„@L„@@V„b@‚WXš„UlkxVV@„šwn@ÜmnLlVkzƒ`UbmL@Vš@XL˜m„VnIÞ@VU°x@VnL˜x„V@LU°"],encodeOffsets:[[115223,36895]]}},{type:"Feature",id:"1401",properties:{name:"太原市",cp:[112.3352,37.9413],childNum:5},geometry:{type:"Polygon",coordinates:["@@„@VV@wVKnLVal@na°nšaVJœUlm„L°a@b„@lx@bULUlmx@Ln@lVkn„l˜@XI„w‚K„Vnƒ°aVXVx„ƒUaVU°K„nUlšUVL„KÆVš²Ģ‚lnXalLÈÆ˜L„KUaVkUanmWU™a@WwkUWU¯y¯Ñ@anIl@@aVU„m„I„ymUƒLUUVakaU@@LmJkw±LKmVUI@W¯™VaU_l™kbW@kK@mƒUkaVƒmVaU™ƒIVmalk™W@wnIVy@klkWUU›VI@ƒƒUƒVkam@knU@mmmK@bblVUX@VkLV`@n±KU„ULƒ‚UnVVńUbÇKmV—Imbm@k¼ó@Ul™b@VmV@bXmaƒK@›UUxkV‚V@„xW„UxVnkVVJ@XnJ@XlV²LƂVbnL@lš@°"],encodeOffsets:[[114503,39134]]}},{type:"Feature",id:"1403",properties:{name:"阳泉市",cp:[113.4778,38.0951],childNum:3},geometry:{type:"Polygon",coordinates:["@@°@nb„@lb@b„b„b‚@„x²al@lb„KXU@m‚kUWkkmUUƒVwV@XUW@™naVklKXblKnL‚ƒnLVanImaXKlL„ašV@U@KUKW„alƒXK@£WKXUV@VU„ƒUUVW„_V™@W@@K„@šƒUƒƒIWmXUmƒULƒn™JkImmÝaUbLƒK@UƒWk@mn™Uƒ@kVWb@Ubmx@lƒzUxƒ`U„ULml@„XWlƒ@UV@nk@U‚Vb@X™Jm™@@Vknƒyk@ƒzƒJƒnUV@bk@mJ@b°Ò°zXVlVXx‚@šbXVmnVbUlVb"],encodeOffsets:[[115864,39336]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/si_chuan_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"5133",properties:{name:"甘孜藏族自治州",cp:[99.9207,31.0803],childNum:18},geometry:{type:"Polygon",coordinates:["@@ƒaXamƒ¯wm@±°wUwV@UaVw²Kš™„U@UƒU„¥‚a„ƒ@£Þ™ôx‚Knkm™X¥™IUƒÝUwlk°V„@ƒÈ™‚KUwlkUyV¹„mšx²Xll„ÑW»š„l„w°UŎ„nƒ„„˜Jœƒl¯°V@wôIVÇn™nUllšLšVǚLô¼XW£@±„@¥k_ÇJƒkUéƒkšƒƒwXa@ƒšLlw²™Vx„b‚mš¼ÈxlLȃ„VWÞn¯mǙÑUÝlÛkwlĉmƒULmwUJ™ç@wkm@ÑlUX™ƒÑôġƒVa™ƒUф¯@wķÓkbV„mnU@@y¯IķKƒV@¹šaƒé@k„mÞU°¥@a¯@anKlblU„¥@óğç@Çw@wkla„çݱk¯±@ğÝUÛmݯwƒ@kb±¯akXWÜkXUÆÇUš¤X_Ɛw„V@¤ƒXU‚ƒbUƒŽƒIUlÇUkŽġ@™aXČmlUlèUV@„mVk¦Vxš@¦±š¯ƒƒ¯¯anlWš¯nƒƒÅw@w°KVak£m@klƒKknÇU™»óKšīlaUaV£@™™¯@ƙU™VƒÛÝÇXƒÇl—ÓlŹ„»WUğJ¯£mx™Lĵô›ºX„VlUll²bl„„lŽƒxónn°ÝšU¼mJUš¯nƒƒƒV@êĉ°Uĸ™w™@mƒ@¯kmXamѯaUwÝKU¥„mÅn¥Wmn™ƒ¹n±ƑƆÇôXê±NJnšƒ‚UôlĖkȂVÒ¯¼VnƒȮ¯ĀnƆ˜Ģ@Žk°V°¯ĢVlkšVxm¼X²™Ŏ@ŽVxknWܰU‚¯n™ÆÝœ@`„ôݲÒƒ‚Çzn‚mX@x„è°K°Å„UČĬóĖ݄ƒ˜ó¼ÅêƒÒƒbmšk@V„Ž˜„@ҁl@nĉܛê—x@Ėml՛J¯¦óxȭ°ÝmޝLĵè›Ā@Ɓ„l°żƒ‚šX@xmŽkV@z@‚„°blŽnÞ°J@bn@ƼUVƒUóŽóLƒ°X°ÝLƒxUn„°ƒĬƒn@lnL@ŽÆ@šn„KÆxnUnV˜InĬmÆnxŎ¼ĊIĢóÞ@ĊƒƨbUƒ‚mV¥lkƒ‚wnL„mšÅÆ¥Xƒ˜wU@w‚wUÞ™@alUUŚU™Vkkm°aU—°Ó°w°U„ƒ„b°aš²K˜¯œĕ˜@ÈbޏĊaš»„XVm°In„‚Ĭk¼Vb„ašJšôš£VĊan™‚k„ů™™nƒÜU@anKnĮ‚bÈmƎš»nI‚霣Ġ™"],encodeOffsets:[[103073,33295]]}},{type:"Feature",id:"5132",properties:{name:"阿坝藏族羌族自治州",cp:[102.4805,32.4536],childNum:13},geometry:{type:"Polygon",coordinates:["@@l@@þ²I@lƒ„VL°wnJ°Uĸ™Ŏè„Ilw„V°¤nĮ™¤Ý„lè„L@„ƒ„@x„l™è²ôĊ_ĊġVÈôJżīlbXšÆÈVŽkxÇVƒ„n°„¦Üb@è@nn@@°šUÈ¥WDŽ_Uala¯¯UǙkƒ»„mVwk»˜k²°VxlL@¤œ_@x‚`ȍ‚Ėöb˜š@l²alX„a@bnK°¦VK@nnWmx@nUnl@@lƒlĉk°l°UXkmW@Unš`k„ÇL„ŽW„ÛÈVxšVVlVk@l„IXb@ylXÈW˜Į„WŤzœy@šmIƒŽ²šJ‚š@nް@V„„J°a„Å@ƒŎkVǚk™aUw„KVw™™Vƒ„@nkm™@±ôkô™ĊJš¼šInÑm±nIššÞ‚XȃĊxĊUÈbÜyÈ£Vkw@kVUV™„m@ša„»ÜbÈmƒUXwÝxƒUn¥@°ġ™Å‚aœJVk™aW¯Û@W¥—UŏĶ™@¯kUƒŃ@ašI@mmanwސ‚W@œ™mw°»Uřk¹±W„xVx¯¦U°ƒzţW™w@°ÇVÑk¯@„y°aš£š@šmšnl¼„ašÝÝakwUƒ±aĉImlĵn@ƒm@kkVƒ¯Ñm™ĸ™°x„l™œ@˜ƒXVÞmlÛݙĉUÅ¥mwÅ¥VaUw›™XġċaVůÛŹlwU¯U™ó±™xÛV±¯¯n¯mċƒLmnĊm‚™@™_kJWaXmwUƒĉK™»™@mwX݃UDŽkKÇw™»nƒaUw±škx™K@„Wb„x™„„lVê„lÈIl`@¦ƒŽ@²X¤Wó»™KUșŽ™KkkmVmšUÈóJ@x¯Uk°›„—Iƒƒm„ōƒ¯Vƒxƒk™ŽX¼ƒÒkk±W™wƒnUºVzklVxLǚ@„ƒŽ¯UklVxސV„šJW¦nšmlLówݚ@¤ƒ„bƒ¦„V@VƒV™š±LUxVbU@Vx¯x@²n‚°xn„Wb„b"],encodeOffsets:[[103073,33295]]}},{type:"Feature",id:"5134",properties:{name:"凉山彝族自治州",cp:[101.9641,27.6746],childNum:17},geometry:{type:"Polygon",coordinates:["@@ĶóšKnw°¤ĠIXVƒ¼kź˜Ôk‚„ÈWŽÞȄÜUVšÅš°@šš‚@U¤Vbkb™ĬôLš¼ÈVlm„Llkn@l¤Ub¯L@xÆx„„°mX™mk°b„°°„²™@¥‚™Uwl¥nU@ƒVUkçVnkWċšbĢ@lÈVVk„J„‚V„aV„W@£ƒUƏxW`™£ÈVVÅlWXÛlW°b²la„@°xnÞVÜĠÞ²@l°Þ²ƒèkblŽ@xÈx@Ġènal£nU‚Dz@‚ÞK„nn¤@¼˜°U¼„nV‚šXU‚šbn™ĠUVbUlVš°LX„@lV„èÜUnK@_ƒyXVyUwmIU»Vƒ„kÇ¥šÿkkV¯m±n@ƒn¯ÜanVVƄz@Ž‚bœwÜb„m@wša@kƒmk»@™a@VUUó„w˜@nb°mš„XŽmnVbގVôanwšJ‚ak£lw„˜šLšÅnÝ@wl¥IÇӃ@U™™Lƒ¼kVǃÅó¯kVmmw@ƒn_‚Vn»°LÅ»@éÇçŹīVÇÝ@ÝğU™ƒaVݙ™š¯ķlŭġlƒ@óÞۂċ@¯nkUӄ—m±™IVġUwóKUn±¯—K›w»ƒKݐV„nl@„óxUwţ›£ĉƒUmŗÇ݃K™„ÝUlmKƒ£UVŽ@ÞȎW¦„Ò@Ĭšnny‚@nÒmœVŽ—¼@°Vbl@VlnUUwl™°a@„œ„@llnk°lbnKWĀnŽU„VxUŽ‚²Å‚m¦Û›ÇڃaU„Vbš@¦m`móX™Umm™xÅ@±Þn虲™U¯»m™ƒV—m@wƒU@wݚÝmLƒa@„™VÇUk„l°¯„VlkVƒ¦UšmxƒaULUèVx@„kIUxmWV¼¯VmȯšU„nl›È—@m»Å™ƒVWxÅbÅğW@kƒm@kVV¦mlnn@‚ō„l¦Åƙxkœ"],encodeOffsets:[[102466,28756]]}},{type:"Feature",id:"5107",properties:{name:"绵阳市",cp:[104.7327,31.8713],childNum:8},geometry:{type:"Polygon",coordinates:["@@„ńlV°š@Őĵ˜VX»ÆUĊќJ‚w„@È»m»š£°Kšk@ÇnÑÆš@„w°JUwnw@wšbVbš@VlźLUw„aƒ»„aUklyUUVakwWXwWƒUxkLƒmn¥mšwk™˜UX™lJ„w@aƒIk°X„¥Wƒ²l¥šaU™„IlmkklƒÈL@m°nlWU™aW—š@Vƒ„@UaV¥@ašk@Çk¹ƒK@a™K@kƒKkšÇX@VU@kx±V™èkIWwUVUkkKÇ@ƒa@wkml¯@kUWn£Wa„aVwnaV݃w¯@UaWx—n›JńUxUšma@L@„mbUށU±VVnkxUƙ„VŽm@kkKW°„X@¤ÇUkÆÇnU¦¯ŽkƒmLVwÅK@UóbÇÆVƒ¦™L@‚±êX¦mVޚkÜÝnWU—„›@kšƒŽ¯wķšnš°ÒU„lln@@„ĶmnkĊJ²bV„lxÞb™Þƒbk»™m™n™@™¤¯bƒz@Žl°UÒ¯È@ŽšxŤX„yV¯°¥Uwƒw²XlºVڝ¼nx›š@ށXݏmxnb@n™J@b"],encodeOffsets:[[106448,33694]]}},{type:"Feature",id:"5117",properties:{name:"达州市",cp:[107.6111,31.333],childNum:7},geometry:{type:"Polygon",coordinates:["@@Uxn°‚bnŽlUnÒÆƒnn@n‚¤„LnxlU„ššV@„Æl„x°XXxl`XœƒVW‚œL˜è—„±nÈbƒŽ°b@š²x°Kܼ°ĉ„V¦lJnU@¦šÞ‚JÞğ„mšLÞ»šxU„lb„VÆann„alŽ„VƍX@lnŎV„mU™maÅXƒa@aWmœ@‚£@wĉJVƒkk‚kkmƒnk@ƒmna@šal„Kš™‚J@Þwm‚ÅŃ@ambkUƒƒ@™™KUġKU@m‚ak¯±ƒ„a@aĉÑÅaVwšXlwƒ±—V¥l@@a™kƒ›@@£šmƒĉÝónWV@ށnÝÇÇx—UmbƒaVkkk@m„@m°ƒÝýXm›akÅīƒ@@ƒmb@@xmšnbƒ@mxšŽkWL@ƒ¯b@WUXmWœWKkbm@kx™Xmm@LUl„xlêóK™nUš„all™LƒlLó°m¯JVšU„K„„@x˜K²Āô¦l°"],encodeOffsets:[[109519,31917]]}},{type:"Feature",id:"5108",properties:{name:"广元市",cp:[105.6885,32.2284],childNum:5},geometry:{type:"Polygon",coordinates:["@@ÆL„Ċx°»Ŧ¦˜W„™šLȄ@xÞKܰÞnVxÅĀlÒnJ°a@w„V¯l@XWknKnw˜VȚ°XXa˜lX°VI°b„W„nšaššš¥@ƒw°™n@šyÆ@nkÞ@°¯lJn„°IÈl‚UšlXÅ@ķlUV¥VUUÝޙUUƒ@UwƒJUkĉm@ýƒƒlk™WUwVwWJk@VUK™lUkaVƒUƒmLk„m@ƒƒ@Uƒ›Ik`@„™UmlUkV¯ÇXKÝ_mm¯@Uƒ`kwmƒl¼±KV¯—¯Vk±Vk±kzma™KUnDZ™bk¦±ŽX„ƒ¦¯Wl„J@bƒxkIWš—Vlš™xnŽm¦„nlKVwX„WxXŽlxUbVVkzVlƒb„¼ƒbVxŹKUk™@Ua™a@xmxVx¯Iƒx™@ŎmÒ@șl¯L™¤n¼"],encodeOffsets:[[107146,33452]]}},{type:"Feature",id:"5118",properties:{name:"雅安市",cp:[102.6672,29.8938],childNum:8},geometry:{type:"Polygon",coordinates:["@@ln@xšèVInxVKn„‚ĊklxkÜVޚÒnÈm°nxš@š¼ĊLV„nx‚WXblIš`š@nmĉn‚KȄôÅlUÑmU„K²¹@ÇÅVÓůVýÞW„‚UVmX„ÆbnwšKUÿ‚™@UmmIUb¯¥Uwƒ™¯™Çmš™„çmanUm»UUƒl—kƒ¤ƒa¯bV™U_WĕmÇŚ±ĢUlƒUl™ÛVƒçkUƒ@WޝKU™VkUağVmš™aV™WUƒmV»—¯@»m£ƒmÝLŽ±@ÈmVk¤mb@ôƒ¦kVkamL@b°‚@b¯¦ÝVƒn@l„ê™b@º„UĸL°J@zV@nmUƒlaĸÔ@xƒ°VҚ„Ub„‚óĢ„ÒWškV@Ò"],encodeOffsets:[[104727,30797]]}},{type:"Feature",id:"5115",properties:{name:"宜宾市",cp:[104.6558,28.548],childNum:10},geometry:{type:"Polygon",coordinates:["@@VlÈnl‚XnWLX`m„²nV‚@b°xĢçlnšVm‚nn„@@„°‚UzšlV°nޘÒkxl„w„`UnVb„mšL@albÞKÈۚmܼ°@Xǚ@wmW@ńKĊL„lV„šLVŎçÞL²±‚ğkw@Uƒy@¹lKX™lKVa@w™™Č@‚w@a˜ÇU¯n™@@wġak—™aō‚ƒƒK@Å»VakUWmķwkbğ¥mL™akš™@ġރ°¯xVVÞ@VšxVš—VWx„XlxU‚™@k²WVŃULmèULVĊklĠ„VœJVx±nѝ¦mwğ@mƒƒlğkkl±@kšUk@¯±Ç™Kƒ—kxl¤b™Imx"],encodeOffsets:[[106099,29279]]}},{type:"Feature",id:"5111",properties:{name:"乐山市",cp:[103.5791,29.1742],childNum:9},geometry:{type:"Polygon",coordinates:["@@kšVŽk„ššÆkšV²UlºÈIlxƒLXèÜlU„„XU‚mkƒbVè„x°@„@¼°Knnn@m˜ÆIUbnJ@bVI°b°±@nK@mVakkƒKl¯nbšmĸ„èl@VnÈl‚UUw„wmwnm°¥„L„™lLnU@Va™ImbkƒmK„ƒƒnk@mƒb™ƒƒLV„JVUUƒ„VnkVmb@a¯JUaÆkk¥„IW¥„Klw—ÑmÝU¯™kVy¯@ƒƒ@mmn™Ukmġè¯w@aU±mnƒW_XKWmkÇmUkóbUÝUanmW™ƒ¯nma—@ƒxVôUV@šb@‚l¼„n@l™b@xƒnÛa›xa@ƒyUÅmUÛbm°@„m‚n²U°ll™ĀȦƒlU„V¼nJVxUz‚W„z@`mL"],encodeOffsets:[[105480,29993]]}},{type:"Feature",id:"5113",properties:{name:"南充市",cp:[106.2048,31.1517],childNum:7},geometry:{type:"Polygon",coordinates:["@@ȲVmšLnblyl²²UUl˜°U°²L‚»„knlx„_Vް@nnÞ`WL°ÈUŽVlnkšV@ƒl_œJV„‚@„„n@lƒnKV£™Çšƒ„UV¯šm„@laX˜U„‚UbVx„@VkôJU°Jn™@™‚wUk°wnUƒV_nJmknmm¯Vwk¯ó¥±ÿ—L@wƒƒƒLVU™kU›bX¯mykI@a±Kk¦ULmaXƒƒVm¯ƒK—z±ƒklUIVbÇJšƒkL¯™l™ƒU™ÿ™UƒlUkJƒUmŽUUkVVklKk@@a™U@„™J„²ƒxƒ¦kĬ@¼±ºXnWb—xƒU@xƒx@lšL@b„Llº@șl@bU¦Vbƒ@U„™@X˜‚bVškX¯m@nÇKk„llknƒJVš"],encodeOffsets:[[107989,32282]]}},{type:"Feature",id:"5119",properties:{name:"巴中市",cp:[107.0618,31.9977],childNum:4},geometry:{type:"Polygon",coordinates:["@@V„U„lbkVšŽVLUŽl@XI‚ŽUxVxšXkl„„@þĊnVl„IVx„@VVݚVÞUVU¦kV@ĸWÆô²š@VÞnš@Vaôb²W@‚K@XUmÑUW°¯°Ina@y„_lWn¼lLUbô¼„Kla@™nkUyô—Æx°@šn£™Ý@¥mVkIU¥Ċƒ‚¯Û»¯L±w@™¯a„Ça²m˜ƒ—ç›KX„UW›k_Ww¯WƒwÅk@ƒ™Uƒ™kVmwƒK£@mmmńmÑkVmamnnlmIU`V„m¯xVlx@šmš¯IV‚óIUlƒ@UwVaƒ—VW‚kbƒ@™nU°ƒV™„šÈU¤"],encodeOffsets:[[108957,32569]]}},{type:"Feature",id:"5105",properties:{name:"泸州市",cp:[105.4578,28.493],childNum:5},geometry:{type:"Polygon",coordinates:["@@VVXwVKn„˜wnVƒn„l@b¯xmKUbVn°°X°@blLšènV„@Vn‚l@U„LnmmUna„VV_ĶV@wnJ„„l@@kkKVólaUwnJm„wUlm@ašUaôKVnJWbޚ@VšwVLX¥VVš_Þ`šw„WƒÞŹmmnIn¥Wƒ@k„WV¯@ƒ°kI™ŽƒLk¼Ç@k¤±Xk˜™nmݯUlÅÛKWV¯kƒlUwkLƒÓ™@U—@ƒ‚w@ġXV„˜WX„š@UbVbšV›š_kÇV™lU°lnwŎ¦ÞaƯnmm¯šU„™m¥nkVmkƒl_ó¥¯UÇl¯@™ƒ™L™kƒ`¯ķLUy¯@mw—¼ķ°ġ_řU°mlšnÇVUޚ„@‚ƒš_ƒJUnV‚UXšbl˜Ģb@x@mšV°—È‚b@‚xċ@šš@xUbkLWškL@º„zV‚@lxĠ±²"],encodeOffsets:[[107674,29639]]}},{type:"Feature",id:"5101",properties:{name:"成都市",cp:[103.9526,30.7617],childNum:11},geometry:{type:"Polygon",coordinates:["@@°n°m²°ÜUšw²ŽôVš°ŽVkxÜźUŰČb‚ŽĢlaÈL„»ƒ@k„wVǂ@„ƒnÛÆ»È™UݰKl_„V°Uš`Vbn@VbÈLšaVU@ƨ»V™nIl™šUUa„±lIk±š@VnKmÅ@WaƒK¦™lVōškK™Ý@maXÇmw¯IU‚@kƒVƒwUmVIƒƒƒç—ÿƒU±ŽÅ@¯È@xƒK@wƒLUbÇKō@mÝ£@yóUóóUxkI@WlIUaƒbƒaŽVĀ™LmxÅaWƒUnVƒÝXUþưUÔÈÆ@±ºƒLnVVÒkóÆ"],encodeOffsets:[[105492,31534]]}},{type:"Feature",id:"5120",properties:{name:"资阳市",cp:[104.9744,30.1575],childNum:4},geometry:{type:"Polygon",coordinates:["@@„è„„UJVn„x„U@lV°JnxWÈnbÞ@šŽlLŎ™Ušk‚¥„LXbÆ@nŽmLU‚@zlbXmlnVynL„çšJVb‚UnómUnamU„an¥lKV_²aValWô„n@nƒ‚bVœK°¯VblW@kkƒlUnlV£°W@w„UXk°KVwƒmVkwVyVI@wkmƒVÅ_Umm@Uÿmbk£™xUaVw±V¼V¤kLWxU@Uk™bƒyƒXšómƒ°V@@zÝÒkKƒn™±U@@_VVkƒÇaVwnLWalm@@kkVVl™¦kIV`±n@w„Kƒƒk²™aƒVUUV¤™nkxmUkVWVnLUbVbƒ`kUU„mLU‚mX@`ÅbǚXbWLXŽ›n"],encodeOffsets:[[106695,31062]]}},{type:"Feature",id:"5104",properties:{name:"攀枝花市",cp:[101.6895,26.7133],childNum:3},geometry:{type:"Polygon",coordinates:["@@„b‚KÞnޙ@x„V@x˜n„Unš°¼šVš±mç²ÝÆ@šwnnšVWŽnôn_@¥‚™UaVƒ„bƙœÈ܎n¥Æ±VUwVƒmXÿmLkal¯km@k›ƒ@ƒ¯bkšVxmVUkk@Ua@¯˜»Un›mс@mz™m@īƒÑX¥Ç@ݙxU¦ƒšÅŽÇUkx@šlb„UWVX„mV@xĵ˱@@ޝxUšÆLnÆm„šx@nXL±lUUVwKWak@WxkbšÞƒŽĉbUn@‚ƒ@@xó¦„Ŏ"],encodeOffsets:[[103602,27816]]}},{type:"Feature",id:"5114",properties:{name:"眉山市",cp:[103.8098,30.0146],childNum:6},geometry:{type:"Polygon",coordinates:["@@„šVx°¦VanJVnš@„b„aVbkJ@XlJVwôôôV@zÞ¤@nƎÈLVa„K@x„L@w°ÇÆ@²„V˜ĀœmWXKWașÆa@_nWVnKVƒlV„_UaVamKXUWwnmmwœÑm£@ynUƒkWƒĉUkWVkkV±çkJmkKƒšƒK¯¦mnnxƒxVxVÇkUmk@ƒçķ™nmak°„LllUb@nmL@‚¯²¯aUJ@amIVaÅJn—m@mm¯L@»ƒŽ¯@ƒwUç„anlVƒWVƒÛkWç„KkwÇJk¹±V™UÅl™™ġV™²ÈƂnXĖV`Uš°a„b„£˜l„kVVn¼mVnbƒè™šÈn°š"],encodeOffsets:[[105683,30685]]}},{type:"Feature",id:"5116",properties:{name:"广安市",cp:[106.6333,30.4376],childNum:5},geometry:{type:"Polygon",coordinates:["@@„VlIV‚„kšVšĀ„Vkš°šlK™„ÈIUaVJlk²„˜y„Ln°„UW„nbVKl¥²L@blJnzW°œalV°Inô¯‚K„kšKkkƒbV™šmôLkéƒwVk@KnnšWlwn@laXL›ŽnXVW@X°a@„XKl™nw„@man™@w‚@na@„„@ƒw™ĕġġ™wUkUWb@mk@™¦ƒ¥mUÛb±yÅn@bml@kV@„ƒlknVbmVnlmš—bÇk¯bWyk@V_UamJ@I—@WaƒVXamIVWkUkbVaƒUUxƒ@VnkVU¼›bkKUxmK™„@WšƒxnV@n"],encodeOffsets:[[108518,31208]]}},{type:"Feature",id:"5106",properties:{name:"德阳市",cp:[104.48,31.1133],childNum:6},geometry:{type:"Polygon",coordinates:["@@nUW¥²é@šK„¥‚UÈÅôa@VÆLUxnKl„°V¥ÈmlÅÈV@£ƒWX¯lLln@UšƒVÅlwUm²U‚VVna@ƒ@KnbV™VwƃœI˜mXwWƒkIVwÝĕVUa™IƒèmKUzkmWnka@y™@l²kJƒ²Vb™VkšmJUšƧ¼@UV™bÇKUam@Ua™_¯VƒUk`¯LVÞǚżm܃„@Uȃx@l„ƒ¼ÇKkbWŽœšVxUbƦnxƦĊV"],encodeOffsets:[[106594,32457]]}},{type:"Feature",id:"5110",properties:{name:"内江市",cp:[104.8535,29.6136],childNum:4},geometry:{type:"Polygon",coordinates:["@@²èlUUllXĊVX„„lmV@zn¤›ÒnxmnXxlUnVlwšmU£VV„Ušbl±„„ƒL@x²mU_lJš¥UklU@ln@‚kXbmKUxÈbl„UU@`V@š²„mlLÞÑ@yU@„¯ôn‚™„W„zšaVlV@XwlKU£‚»—aVaUwm@mwUVUwkƒlVDzLlƒ„KV™m_@ykUmƒ@mU™çkKmxkIU‚Ý„@LUJ@n±„kº‚LXb™¼@mmIXa™@mamnkW™ƒKUƒƒxƒ_U`UklwUw™mUbƒV™²ƒakbƒmkn@`„UmҙšVxUb™I™`UƒaÝÈ"],encodeOffsets:[[106774,30342]]}},{type:"Feature",id:"5109",properties:{name:"遂宁市",cp:[105.5347,30.6683],childNum:4},geometry:{type:"Polygon",coordinates:["@@ÞĖUxlJX„Vb°@„xUÞmbUxƒbXbm¤VX@lk°ln@x„bÈ@lLVlVUXxlJšç²UlwV@@UÈWl™„L„w@w„V˜wXaWm²¹@»lī„¥„wƒ±šI@ƒšV@bl@kLUllUVVn@mmU„wX™ċbVb@VUkbmamšW@kƒa@™™k@ƒlaUa™@¯b@šmmwó@@lkXUa¯°›LU‚am„m@óƒkXUb±bU`kLm¦ƒbnVmbnVmô"],encodeOffsets:[[107595,31270]]}},{type:"Feature",id:"5103",properties:{name:"自贡市",cp:[104.6667,29.2786],childNum:3},geometry:{type:"Polygon",coordinates:["@@lIÞDŽbVŽš_šJVaUwš™nуV@_lm„nla„bš±„UVašnVxkxVlV_„`„wV„„LšlXnmnbš@WbnJ@nš»WaKl¹²ƒ@mVI@KރVlJnw@aW¯¯¯UmVanL°w@aƒk„mmU—xmƒULWxUUÝKōèU™KUƒƒkĉKƒL@ÆnX@x™‚Wȯ@Û»™nÇÜÝLka@b™KƒnUaVmƒ_ƒxkƒLX¦ƒJl¦ÅlVb°I@bnaUŽmlƒUV„UVƒIUŽ„Kš„„a@nml„„ƒŽnLl„našJUbV@"],encodeOffsets:[[106752,30347]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/tai_wan_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"7100",properties:{name:"台湾",cp:[121.0295,23.6082],childNum:1},geometry:{type:"Polygon",coordinates:["@@\\sŽ@pS}aekgKSu™SsMß`¡CqZ·be@Q^o@‹gieMp‹‰]}•}Ľc_Kk…{™ù“A¡r‰[uom@эĥJiq©mʼnq¯Bq]ÙYgSåk_gwU­isTE…“‘ĕiqiUEkue_‰OSsZ‹aWKo¡­q“ycY£w}‹ĩ™ĕS§Z©S™N¥SyLÑ¡±Ks^IY‰PdƒY[Uo†Fp}´\\¬\\j]ˆe܍ò‹¤¡–ā a\\bn™U㺹Ìs¼j®[cíȈEŽĝĆ`ļf¶Š®K|VØDdKGpVnU‚FjpH—F`†B’[pMºxÖjbpÎxp€¬‚|ΟÜÒCв®‚ÜAp„ZG~€Šd˜ÞàV¨|¸€`|Œ²tx~\\~|dFf^zG€ĄŚhœdL\\hĸž¼†ŠOªP®lV`p\\]Xpll˜æ¤œCpQ|oF}fMRi†NSon_²qämœM„NM‹\\•"],encodeOffsets:[[124853,25650]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/tian_jin_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"120225",properties:{name:"蓟县",cp:[117.4672,40.004],childNum:1},geometry:{type:"Polygon",coordinates:["@@EUDAEI@WNMNCBFAHFFNACDJDPBD@@GD@DIFFHEFGDBDEQOFG@EI_KG@OcJQM]RMEKBGPG@[LaCIICBWKCEEG@WBQHCDFD@HSLEJI@IHWECFGAAEKCGDBFCBSBIDCKKHEADMJMFABKOKEQAA@IEEG@GIQAEK@OZEESMOL“lu@SLUTYFQCMG@@SQUAYKAACA@IB@BDB@B@DC@@BGAEFAA@BEGKJCC@AGAIHA@@JC@QEIP@@A@EGIDC@O@C@@@@CJCWKABFLBBEBSQGBAAMIEM@AKBcJEN@BEBCFMAEFEF@J@BG@BFABECKFG@AFQ@@F@BEB@@A@@AAAKAE@GFGDECEFEECBKIKDELDFEDYH@EIACDCHKBEB@BAAC@ADBHABKJIAIJICEDGDCD@@A@A@DHCHJHDFEFGBKRKBGIK@GIMHSBCH_BOJECCJCFKKMD@DNJEDEGC@OJCJHRUL@HRJ@H[DCNKDZHCTFDHCFFKR`TANVDFZRDLFARB@HPAPG`ILAR@TERNDFNHDLCLDDCXDYbHF@FEB@LDDVE@JPNfXPINCVDJJD@NJPAJHLXHDNANHhB@DPNLRMTBFRBHHr@`NBFEBOCCBIAQJDHCHLHFA@HSDCRLFTB@HEFLNF@PELBDJALFLTC@EPFLLP@tUHQJDfIHGTB^JTCPDLKAIBATFPADIEGECEMJ@JIAIHGECFEAGDI\\SPOXAFCL@BQTQBBTMZECYGAHA@GJAE@HCAEME@IECFKJADDBABLTHHG@ILEAMNDJCDHEBF@@JNFJELDFKTOT@JETBFFHBHEHKI@@IJEJ@XKEOUMS@AF@CEB"],encodeOffsets:[[120575,41009]]}},{type:"Feature",id:"120114",properties:{name:"武清区",cp:[117.0621,39.4121],childNum:1},geometry:{type:"Polygon",coordinates:["@@FWôµ@IFCLIB@EHNBp]AGEAKAEDMGZKFGBGME@ILGP@HEFB@BXMEAHUGC@IHCLOD@X[NWHWPKAEF[@EKIOL@EKGBNMJ@EIEHKBIC@BAKMIACCFQZCF]DB@ERAKADIHGEIBCGIIECFaGLZO@EFCNGAGDGAKL@BMG@IE@ADSDEH[JGC@CGA@BMDeK@EIACFE@@GG@FIAMM@CCGC@EM@ADE@CFMAAGHBDKIEAJG@DOGCDEKAGIS@KFCHKAEHIE]BeKNO[IFIOELC@A]GMBKVYCDDgGAICARc@MW@AQE@DGI@@AQ@@BKBAIQQYEFW@CEADIGGBCEIiMEMF_LGEKMBBDWEBGRC@E_CHYGCH_IAED@FFBQh@FGJaJ}AHRAREF@bE\\C@CT`FHC@\\BBF@BID@HGDDJ@@FAHKBARECKDAZBJIVNHCTA@EREAMLHDAFFBVFFC@RNRETHD@FOJMACH@CAB@P@DF@@FGDWE@FFSIEMKQDYCCHKb^JADOCIDGNDBdBCFJB@EC\\A@BJEA@JAAAD@HHD@LFBCFF@BERDHNhZQHMBGHOACCEBWEGD@PSJKCGEUD@CINLFGHE@AJK@HDABBHTB@F`DBFLBBHEDARCFG@ABJBAPVFE^FBGLGCFG_BMLEXGAAFE@@JNRVJHFALFBEHQJCTbNDHCF@PlFLJSXCHFHfVBTNJ\\BPJXC^FAVNFCHFB@FFH@JF@\\ABCFD\\BDMCAAJKQBGAILOEGHILECQLWFENJHADC@QxNHFJNLDFA@CBA@D˜UÂmR@FBL@BD"],encodeOffsets:[[119959,40574]]}},{type:"Feature",id:"120115",properties:{name:"宝坻区",cp:[117.4274,39.5913],childNum:1},geometry:{type:"Polygon",coordinates:["@@TZbB@JHD@DODCLM@AP@LL@BNH@ETFN@`E@DNG@CHLBCJA@AICFKDDBKA@\\N@AFNAGRBFjFFFL@DHLBLFQPcXAZMJ]GAVHAIZJFNE@JpDRRDCLFDGXA@EFF@CFFPDfEBDB@DCHCFCJDJIJBLI@I@CB@@ADBB@FALADGDC@@H@BB@FZGFCCE@@FMLALJDAFFFEFDFCB@@AHCF@L@@BBB@BB@FC@E@@R@BEL@HEFD@G@AH@AIB@@@FEFEBALDDEFAFO^IF@JCBBFPNJJ@D@PRDCEKBAXL@BIFD@T@JE@BHHJORFDI@@B@JGH@@B@BDDLIFFHCD@D@DEE@BAAAB@DAF@B@H@NGLJLMRDNMfGIEPMI@GDAKK@KIDIJ@GE@CFDN@FE@GFEPGV@TCDFKHBBF@RW@DD@@ID@TJFKIKLI@EP@IGBCLAEKLEN@KSHIGYACSD@SEAMBBMGEBMQBCMIGKFB[D@HDLPHDBC@IFITDLG@IIIFGVBNJDLN@VIRI@YIAIHIC@CLKZCBEE@JECEIHEAKGDGECBGEEM@@DA@CCCBBEGA[GEDBBoNAAH]MKiIAWKQoIIPMFQAEEDMH@FMSUYIeF@EK@BIOEKJEBICFKaKPFAFSE@LWCCFMHDDEKESBOGBKIEIODLG@CCDEQCEDWEMDIEIB@EHGEEDAEAa@@HqDEJGF[AECCFa@WCEIKAAEQB@FCAE^YDERDDJBLNABD@AJGLJF@FNIAMLH@FPKLJ@FE\\BFOLGXMXW\\C@KPGD@JHDGVFBWN@AEAGFO@KH@JNFAHEHYLNHFCLBFBBHo^MAFGA@KJED@Jó¶EX"],encodeOffsets:[[119959,40574]]}},{type:"Feature",id:"120223",properties:{name:"静海县",cp:[116.9824,38.8312],childNum:1},geometry:{type:"Polygon",coordinates:["@@NGFMDATCNDR@CCbINEHNJA@C\\EEGVE@IhE–[˜w”epc¢·²›^QEKIEKIgiQDkehY£uSDBMkUDOJDHC@GF@CAFBFEN@C‹Q@BeP@@G@HD@@MHQKi@[IGCOCESE@GMA_OcCGDu`aˆ@VZzKDkJBLNXGDqKEWE@cFEFA@ƒISIi@@KMABJGBcMuFEzGVH\\ATSEUBeALCEMG@CEBUHUCGXaBPtUBBFIBFTDFF@DDKBFNGBJPHXDDMDCLJ^mBIHIL@LR\\@LCR[@@z@NFD@LLBNb@RHDBNTPT\\F@BJF@BXCFBHHBDLFB@HODADE@@JHVXCPDHCFTLBBFNCDCCCU@@GAABEHHZHBCAEdEjFDD@GfD@DXFCHF@ERFDLBH@"],encodeOffsets:[[119688,40010]]}},{type:"Feature",id:"120221",properties:{name:"宁河县",cp:[117.6801,39.3853],childNum:1},geometry:{type:"Polygon",coordinates:["@@BFLBFJXDb@DEFD\\BHEFIrC@Gb@FBCBFFGH@FJAJFNCXFFCRDCFDDH@CKJPJFALPHTALFCFGCENDDKXF@ETEBO‚bLELJDFALIPFAJL@@FfEZJTVENG@CNFFRBNEJOpJLRBXjJNLG^BBpMAAFC\\HHBAFDADDB@@CN@FFAHFDCHLHFBJGFCFUNKJJTD\\XUXF\\^F@DDDQXXBRLRCBDFEVCDLVDpUl@LEDJHAPRFGL@CETGPBTCDDVI@CFF@GFDCCVGLKEK[Y@MECISG@BKNSCGCKWEAaEBEKNGFSECO@GGM@GYI@DÅCMLHPTF@DJHAVVNKEGDETJ^[TJNNd@NOAMFYJ@@GFANDPEJB^aOadSTQSI@MHBDIEOKCG@EEFCKCqXO@@DMFENCDDHCCGJ]AKFoDaGGHYFDHKJiCMFGC@EQ@AEHGAC@IEAATKOHGIC@IXIFEoƒGE[JCFCDHNmRADFZMF[EEBMO{GU@AOW@@]ZeHBDEHBKEfQkuIWBs‡@EC@d[@[^EDMTKCEEcI@cDAB@FCBCACmOCG{PYHeBgPwPFDDALFFFCHQGSD@BHFAR[TaFYXMASUiGFL@DQNCJI@@D@PLDN`ETEFIGMCGBCE‘~CAIFDPEHGEQPHJADFJGHCJLB"],encodeOffsets:[[120145,40295]]}},{type:"Feature",id:"120109",properties:{name:"大港区",cp:[117.3875,38.757],childNum:1},geometry:{type:"Polygon",coordinates:["@@JFFL°_`ONJKDDFIFZN xlb~yFVNRŒrdJGzDPVFBCTNND\\UR@E`F@@Ip@IWGUoawOEE@ÏDgK{İEEMFëC—b…™@—KwOCDHHKBDJCDEEEAGHOABFABMCgDLSQ@CFEB‰MgYIDQINE@AUSwSAdYEHQMEyK[KI@GRMLE@@OqOoBOnpJ@BmEAFHL^FDB[C@BBDVFAHFJENB@sNEjQAMYsUgCSBGDJH@\\LjGR@NC@@G@HO@AfR@DŒM@EFEADBE@@HGDICCPlVANTC¤vgZlfRChjLJ"],encodeOffsets:[[120065,39771]]}},{type:"Feature",id:"120107",properties:{name:"塘沽区",cp:[117.6801,38.9987],childNum:1},geometry:{type:"Polygon",coordinates:["@@|ODHnPBDADEDA@CB@ddJFFLDNSFC\\]\\@@cFDˆ@nACOMW@M@ITURBRZNHNWRQšoO•j½f‡cqŸAqeiDÿÍyÓįFL|Ch@ÐFFxPpbHVJXo@@JCTR^BPABQA]^MB@bE@@FQBFVJRH@FXtPNZSBAja@@NƒDTŽLJrQTHFXZFB`"],encodeOffsets:[[120391,40118]]}},{type:"Feature",id:"120111",properties:{name:"西青区",cp:[117.1829,39.0022],childNum:1},geometry:{type:"Polygon",coordinates:["@@@LHAHRHATh`LHNHDG`HDGZ`D@FQDAHXFACNAFLVRTBFOfHDCVBFQH@HSXHEPFB@LDBF[bDbLFKJBFLADBDjLvCPEI]FGEIGCBEUSjcFiBIVWfaHCjN^HtwBBFGPBJGjFBEGECGDONMFAP]TDHQOWCMGAMHKIJEIGQ]aDlUG]VGEGDC„{PEbBZmE@@GH@BCA@FMQCFMYMJECELCMI_P¯`]R±œ¡¸od“f—x•\\gF@JUFFH[F@DIBGMMFaJDDQ@MCSDCBENMH"],encodeOffsets:[[119688,40010]]}},{type:"Feature",id:"120113",properties:{name:"北辰区",cp:[117.1761,39.2548],childNum:1},geometry:{type:"Polygon",coordinates:["@@ROHFFGCOJEDB’}DFHANDJHFEFSM_KC@O@CJ@DIRM@CEKKA…L…FKACHoLSJSIBETDJaEIIE]E]K[MYUYQILC@GF[MGNKEK@A@BCWECAIFEFYAGFOMI[OFuDiKACBCEKIAELaKaCE\\CA@KEAFOWGGTG@ERUACDeGEPSAUQKHE`FNjNFJADHHCJFB@DEXZFRRBJLA@AR@@BJ@CHF@BRX@@NQdDBBJhHCCZDLUNA^H@BKDPFEJ\\JMPfL^AJFFGLBDGLET@HJLBCFHDCPH@BIJFCLGABHNBDEF@BCN@@FHDDDN@BNEJH@@HF@DEJB@FfLNC@AHB@DHD\\IFGTCBCF@@JNH@ALKHBHCHBDMFEP@KYbHDEJF"],encodeOffsets:[[120139,40273]]}},{type:"Feature",id:"120110",properties:{name:"东丽区",cp:[117.4013,39.1223],childNum:1},geometry:{type:"Polygon",coordinates:["@@ZV\\N^L^FJFFJIbSCAFTJTIpKDGLB†E†KLBjHTVNBZWbE\\SBQGE@ATCRHDGEEKECBECxOhOfAZGA_YEEWSGqRKIS„C@Mb@BiTAMYsOEWG@IQEURA@EF@@acUOXQRYCUDCHDTEF[SUEgAYDcVGJM`iAWDWLQRMHUHgDsDBLHJFCFDFGHBFFVEAGHCJN@RJF‡PIhBD\\FENCPWA@LFBAFHBEJUEARCDIAEDQBRNa^"],encodeOffsets:[[120048,40134]]}},{type:"Feature",id:"120108",properties:{name:"汉沽区",cp:[117.8888,39.2191],childNum:1},geometry:{type:"Polygon",coordinates:["@@LMEI\\MTABKN@FCDMH@COAcH[AoēA™M¡Wa[Meq™pQRMXMGQYQASV@J@NNXDPmBAtJXlveRLFGACFGAYf@^X@BPV@|HNPFA\\FNEEYBCnQGMDCDE\\IHFp„EFWJ@JJDGHLPBSFB@JBDGHBFR@@FHDNEjDLICGZEHGbHpCLE^BHIDDCGDCFMNE@CP@rWLDEDFFH@"],encodeOffsets:[[120859,40235]]}},{type:"Feature",id:"120112",properties:{name:"津南区",cp:[117.3958,38.9603],childNum:1},geometry:{type:"Polygon",coordinates:["@@TLv@CNHFFBHGZFETNPhCVGNGRQXKXCjBN_HIdUZChBVF\\TFECSDGVCZDRQPWdVNA^]RBBAAOQ]DSE@F_Q@[VMCSMADUECOHycI‹qMQEU}zkaŸwENRDENB@ADG@@HF@YnaAOFƒ|CDFHUHH^kVbCR^JHIFLJNGHBDNPXGRSCO^EBMNCPDHHFAFiEIHOAEH"],encodeOffsets:[[120045,39982]]}},{type:"Feature",id:"120103",properties:{name:"河西区",cp:[117.2365,39.0804],childNum:1},geometry:{type:"Polygon",coordinates:["@@d@hZNFdcLYXKRCtCMOFSYEGHEAGEDMu@SKAAsx]GMTGt"],encodeOffsets:[[119992,40041]]}},{type:"Feature",id:"120102",properties:{name:"河东区",cp:[117.2571,39.1209],childNum:1},geometry:{type:"Polygon",coordinates:["@@ZBVFFIGABEEA@KXBDOFM[EACJgˆOIE@QIMGDBHUFEEGAEHECEDGIAKQDWLKZcdQPEP@FOFBJTJ@HNORJf@DBCN"],encodeOffsets:[[120063,40098]]}},{type:"Feature",id:"120104",properties:{name:"南开区",cp:[117.1527,39.1065],childNum:1},geometry:{type:"Polygon",coordinates:["@@NMVDCG\\E^B@HlB@YEDS@C…HsNSiMGDebUXAJEjidVTAFHDFJ"],encodeOffsets:[[119940,40093]]}},{type:"Feature",id:"120105",properties:{name:"河北区",cp:[117.2145,39.1615],childNum:1},geometry:{type:"Polygon",coordinates:["@@DBXFADB@L@LFHM\\NHED@JKZRb]QMRAFCJBDCBQYADMCAe@QIMP@GSIAIPE@E[EGH@ZEF]^HJAXK@KF"],encodeOffsets:[[119980,40125]]}},{type:"Feature",id:"120106",properties:{name:"红桥区",cp:[117.1596,39.1663],childNum:1},geometry:{type:"Polygon",coordinates:["@@J\\PNHEZBFEJELEL@BWGI^]FEkA@G]A[FDHUCMNEHJ^"],encodeOffsets:[[119942,40112]]}},{type:"Feature",id:"120101",properties:{name:"和平区",cp:[117.2008,39.1189],childNum:1},geometry:{type:"Polygon",coordinates:["@@D†T@FCHG\\FFOROMEgYc@"],encodeOffsets:[[119992,40041]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/world_geo",[],function(){return{type:"FeatureCollection",offset:{x:170,y:90},features:[{type:"Feature",id:"AFG",properties:{name:"Afghanistan"},geometry:{type:"Polygon",coordinates:["@@ࡪ͇وŐǬϠڐŶӂʮǚڦ۾njƀ̚ІɣʪҴMوǯʲĹ،˒˰Nj˖ϪԈiżŬĘͺβ̈Ҕȏĝʱʪ¡ý۷ͪ˟̊ǰώĊԼϖׂ×ࢀAƬʋӧĥяƹ७ĭࣗǭӫλȤΣĪллΛ–͑ɳ̡ߛ€ͦ։՗ɅΥԕ²ԋ͡ɿ̳þٝŋğɻسDҵӇ‡܍થΓבôǝȁԇņ࠿űටіހހåզُƚßՔ˟ڢάҢιŮɲؒ΂ਸ"],encodeOffsets:[[62680,36506]]}},{type:"Feature",id:"AGO",properties:{name:"Angola"},geometry:{type:"MultiPolygon",coordinates:[["@@ȸصʌԋȘ˕͐ѯ֊æˤŠҬşŲɀɂӨԶ®ƤіHñ̡৴RfՉǞ͕ūԑÖԫ˪̷­ৃȼüκsԴŴϦ¹ĘʹĩСƨϿů̿î́ყZᦵ֤ۋպԽ໳΁᎝Š׋Ж₭—ŵÏԃϞկ~ԉƝЙDžÿՈŜ݊̂ޒªΰ˚ݶȨΆӘռːϐĘج«ӊʣ̜ɡԚȵԎ®Ǩʶͬʭ߼ǣ֚сՐĄǎΌŔʒg̎ĸៜ["],["@@ɉėɣلͼδʪƘ̀˽̩ǯƍɍλ"]],encodeOffsets:[[[16719,-6018]],[[12736,-5820]]]}},{type:"Feature",id:"ALB",properties:{name:"Albania"},geometry:{type:"Polygon",coordinates:["@@Ń˷ŢέΒȳiə˗ŧ»˙ϷСƛÐgȂү˰ñАîֶŖʼƗƂÉˌθаÂƿɨôǴɥȪďȨ̂"],encodeOffsets:[[21085,42860]]}},{type:"Feature",id:"ARE",properties:{name:"United Arab Emirates"},geometry:{type:"Polygon",coordinates:["@@Ƭ¤ŒɱڂƂ۞uԖ{ֺ֪ظՠՎԮdž˹ŖڑѕGçճƪŝϝǑE΅ʓΏuͷǝDZᡋъ͏࡚Ț"],encodeOffsets:[[52818,24828]]}},{type:"Feature",id:"ARG",properties:{name:"Argentina"},geometry:{type:"MultiPolygon",coordinates:[["@@ߗ§ѓ̔ԑx࣑@Aሞ͒ϵрؿનԋ୲ȿϙп"],["@@Ӵ؇͠ڰॠ“ƊǷ໶ോۊŷਆاࡾ͡Ŧχࠡ౧ࡒɭ़ŷڔƈނ٢ƎݐжLjфӝiڣۻҩ֟΁ॅࠃ૭ଧȽڥɣࡹT࠷ǽȇÝիËѫ੨ܙŗ׃Հν§Ч߯ઁఛ҉။ǩउĎǰԅǣػƺщԋ̏ࡱř̪͕߱ɗŜ࠳֨ʧҠˆʢѧޛʻڭԹūࡋȣ҇ߏEڃљʋؿؙࠞߦǝ˿ݭ঳Ӄձটލͧ΅Ͽ˔ࢍ֔ӡΟ¨ީƀ᎓ŒΑӪhؾ֓Ą̃̏óࢺ٤φˈՒĭьѾܔ̬૘ěӲξDŽę̈́ϵǚˢΜϛ͈ȝॺ͸Ǣƙ਀ȠࡲɤݢԊ̨ʭࠐEޚَոo۰ӒࠎDޜɓƶϭฐԬࡺÿࠀ̜ބռ߂צԺʥ͢Ǭ˔ඔࣶд̀ࢎĹɂ۬ݺશȱ"]],encodeOffsets:[[[-67072,-56524]],[[-66524,-22605]]]}},{type:"Feature",id:"ARM",properties:{name:"Armenia"},geometry:{type:"Polygon",coordinates:["@@୞ƀǨə͌ƣǛɁ҄˽ʁˋΦɫϘƏl׋̣}΃ӢHżχCʝɤǩuͧʖرȼĄФƛ̒"],encodeOffsets:[[44629,42079]]}},{type:"Feature",id:"ATF",properties:{name:"French Southern and Antarctic Lands"},geometry:{type:"Polygon",coordinates:["@@ը˃ߐĿˆDžɽϣಇÃq҂ŮΎÊǢ"],encodeOffsets:[[70590,-49792]]}},{type:"Feature",id:"AUS",properties:{name:"Australia"},geometry:{type:"MultiPolygon",coordinates:[["@@ߺ́ҜŘپNJԎÉÐঽ˽́ēگ̉ɰ׍בǧ®ԫ€ԭܘŗֈӝܸtϬռõ"],["@@̢ڇբ̈́˦ΡЖ͟đϋǴܛŸнɄĹɬܕąѥ˖֭࣬ѭצЋ֞λŋȯӔՃࣧ͜ͲȂ;ηȴźƢࢹ׬ԩϸ͋ڀڹʀڭtӏËԳА܋µݓơϵɩݡjӕǕ׻χއثЭ̫ٱ˫гʝܧ͕нɅػʼnׁªˇӕ̇व‰ޡ·ϫ͙ԕέ۟ψԥƪżѬҝǃ݁؉ܩɪӉƄӑÔ߿ʐիԮƻْțьЭ;߱ĸˢРȯزЧ׉ݝƷѮҬŶӞ͘ЬãجہܑԿ˽͏ڛٽΊ~ҀԿ،ѹ̀ǂȘઃԚןz߯Цຓāછ̝ख़˫ߡÈࢻљܯȗljѱ̳Ϳ܉qՅõݑƶ׿ğֽԁ҃ʕœуʁЗˋؕ֛Bࢽ՜ҋDŽlӖкŘƚȒ‡̠ĺאģӼѻࡖƏӒ˜ӎͭնsʚϋͰĽڄӓڔřΪτε˳ެиʑʞ͗aјеڎă˄țʦĠӠǢȸŘрęӮΎ؀Úٕ΢׀ۀˬЦΪٜ̰ϤàɴĻڎ̺ԚĤŶȀɞüҬoࢨʖҚώɊ҆ӲѐœͲvҘט܎ΠܩΦǚ̗Ј˂ТψǻĸٖҠаȮͨцƜ`ɼτĭdɂτŦОŔبϫҲӽՂMՖÿDZҦДڪϜɘſȾκӒԘ̒јıۺǂeі؛ˢ҂Ū֎ȻҀ·ۼɋʈĐԶʵӬʊ͂ñȠNJϬеɡ͉҇ͻ˿ƒĮͱʙп̗ЭÔʁڜҫ٨ˏѠ́؈ӻʂBѰɍŶʷߤ˵ֈ˼ǐҊǠόľҤʰڞŝОÔʔīӔŌنLjǠŽˬȮѾdžҦtʈ̸̾ʂЩÎՃȾķ˜Λ̨ёÚӇ‡̥"]],encodeOffsets:[[[148888,-41771]],[[147008,-14093]]]}},{type:"Feature",id:"AUT",properties:{name:"Austria"},geometry:{type:"Polygon",coordinates:["@@Û΃ӁCǎǻ˧էLJƗܽsщȏۛÞயɐȉ̊ࠧƣĭDžԗŢѕxϝƶźȴƬʪ²ьɹŤɜݎ•׸ƮЖ}ˀǣþƜšո̠ń̒ϰز˓ӀΆ̐ÚٶʱЂªϰǁãŃČ̅"],encodeOffsets:[[17388,49279]]}},{type:"Feature",id:"AZE",properties:{name:"Azerbaijan"},geometry:{type:"MultiPolygon",coordinates:[["@@ʞɣψDGŻ΄ӡֽŒщϰƃ͆Ǫv"],["@@ϊËƞɈԈͺѴѵђ׭ϺŸʸɧۗãƣٵƟ̭̍ȝvзȽ¥ԻѲ̂дʝʚ̿×যإk׌ϗƐΥɬʂˌ҃˾ǜɂ͋ƤǧɚȶƎضʍҐ¹ŘIJбҔɔŚʀ…׀ԙ"]],encodeOffsets:[[[46083,40694]],[[48511,42210]]]}},{type:"Feature",id:"BDI",properties:{name:"Burundi"},geometry:{type:"Polygon",coordinates:["@@Á০ɃϢԜßʲӎҀŸͧǸȏT˗ȹǭ͛ѫ̧̥΍Ÿ"],encodeOffsets:[[30045,-4607]]}},{type:"Feature",id:"BEL",properties:{name:"Belgium"},geometry:{type:"Polygon",coordinates:["@@؜áުǪՐοҦȝħ֧ɕĝһܿϦћßדІϷͶϷ`ũ̒ڪǔ"],encodeOffsets:[[3395,52579]]}},{type:"Feature",id:"BEN",properties:{name:"Benin"},geometry:{type:"Polygon",coordinates:["@@ۛįȹ׆žኞǛǦЮ̇̌ʱʞņѶ̀ĨǠξЪĀȀʤˮʘ̠F٘ә˩ȎӽǓͷĘɧСԳʵʳǁՉt՗µണ"],encodeOffsets:[[2757,6410]]}},{type:"Feature",id:"BFA",properties:{name:"Burkina Faso"},geometry:{type:"Polygon",coordinates:["@@ֹɐϽ‹̍Ƀϗǰƥ˦ϙǾÅӦɮΤo˴ښۢŬּɲȴОœΚǢŘɎٴϖdžˀ޼ΒҦŢɀLJՠJáСŔϣӀչ€НॺȏmֻǿʣЩÿǟν˿ħ݁lϳâ˓ƉωÖร¡qӉŘم"],encodeOffsets:[[-2895,9874]]}},{type:"Feature",id:"BGD",properties:{name:"Bangladesh"},geometry:{type:"Polygon",coordinates:["@@i׽̉ŶÆگʉѬµєDžКΕӨޟ’ü΋˃ҳΧǠũƵʃĠ͗øŽۖ̅لƜԒԫɤȆ̪Հ̼؅Ѽ֮̔ږεВ£ô׏ߞřު^Ӟƛϯ܅ϕµʷӍҢѥƎ՞ɶFѶ೯"],encodeOffsets:[[94897,22571]]}},{type:"Feature",id:"BGR",properties:{name:"Bulgaria"},geometry:{type:"Polygon",coordinates:["@@ʎΉ͚Ö٦ſ௾«иɌবȜ̩ؒӴĕѥΏ̫׹˔ӏܣŒࡥ˃Uлޅÿס̊ڧɱة|Ñ֊сːƒŢĝĴƘˌ͌ˀСδ÷̬ȸȐ"],encodeOffsets:[[23201,45297]]}},{type:"Feature",id:"BHS",properties:{name:"The Bahamas"},geometry:{type:"MultiPolygon",coordinates:[["@@ȵ£ɇӜ̿ʐǾՔʨ‘ۣ̎Jӥ"],["@@ࣷƅÏ̴Ђäֈ{~ɕ"],["@@ƟׯƷņ`ѮϓͪCĪڐϗ"]],encodeOffsets:[[[-79395,24330]],[[-79687,27218]],[[-78848,27229]]]}},{type:"Feature",id:"BIH",properties:{name:"Bosnia and Herzegovina"},geometry:{type:"Polygon",coordinates:["@@̦FȿσМ͓ūЃȡ™ƽû˙țūҥݓ͈ͅΘ͋Ȅϭ̾ǻʺЩϾǬΒ̞ȕǼǨϾnܠƓ׈\\Ϟȅ"],encodeOffsets:[[19462,45937]]}},{type:"Feature",id:"BLR",properties:{name:"Belarus"},geometry:{type:"Polygon",coordinates:["@@߼Mࣰ̈́ȚӄېːÿϔԜƚ͖ࣘࢮɁŢȻѲĴࠒȧĊЁǷɧՄս΂Ƴ»Ʊ֦Ʃʎɡ͝ǿڳˆljÿȠ˧ȸ՝ܝ¹ʵȁÃхͭĆݷ¡əȞ̿ƥ́ŨڍjफȬࡕàٱmҡɩГeϐʷϴԌǢLͰɷ͌™ϊ"],encodeOffsets:[[24048,55207]]}},{type:"Feature",id:"BLZ",properties:{name:"Belize"},geometry:{type:"Polygon",coordinates:["@@OŮĸžƴı̞ԔDŽZHūDŽGaɭƋεôŻĕ̝ÀăīщǓɟƱǓ̅ʣ@àॆPژ"],encodeOffsets:[[-91282,18236]]}},{type:"Feature",id:"BMU",properties:{name:"Bermuda"},geometry:{type:"Polygon",coordinates:["@@OEMA]NOGNG\\Q^McMOI_OK@CQSGa@WNLVWHFLJXVFGJ`ZRTDLeeWKIHGIK@@[MQNi`]VDTBHCJAPBJLVFjT^LV\\RJZRn^RH`TfJjZHHOTTFJP_NOX[EYQQKMEJOLANJH@HQHAARF@ZEPS[U_IcRQXE@EEKKOCGGCQCOGISKYGUC"],encodeOffsets:[[-66334,33083]]}},{type:"Feature",id:"BOL",properties:{name:"Bolivia"},geometry:{type:"Polygon",coordinates:["@@य़”͟گӳ؈વȲ۫ݹ؅ŗ͡୆ҋऺˆ߾ѳ΢ŏ؆ЫֲՌ࣢αۺȖ˰ƭ̶͠рh܎¤נǸ˶ܩഠزíѠnȈʪ݀;Ѷ͂સƚęؽļ͓ãࣰ֛ݫऴƑ̻ͦ֨ǕΐʑՈTӦʟšӟǐʕZγʓa͒এྖ“ūӟĜͧҞɽȤԹƫڋɯρĄӏʿǥaʶ޳јޭ^ัʓЕ݋sҋͥ৕ƉǸ"],encodeOffsets:[[-64354,-22563]]}},{type:"Feature",id:"BRA",properties:{name:"Brazil"},geometry:{type:"Polygon",coordinates:["@@૮ନॆࠄ֠΂ۼҪjڤуӞеLJǒӜŖӼBҦ̡ƴ̿Ƌ̻œį͔ýޔƿʤ֥ɪ΃ǏࢱLjÈଜʝҴˀǦăӐɰςƬڌȣԺҝɾěͨŬӠྕ”͑ঐʔbYδǏʖ™ӠӥʠՇSΏʒ֧ǖ̼ͥळƒ࣯ݬä֜Ļ͔Ěؾષƙѵ́ܿͽȇʩџmرîӃƟϡĪÈ౨ۏӷݏv҄ͅ֏¶DzΰұԞΓݴɜƶA΢ԖʎċҔɊ̈Ôϼ०ֲێNJŔŴݴŸϚᘰpθſӔύ̬LؐӀƒǚē†͐ӯĔYՀ࿖k˦̂ɸˉǐӷǂļҨѻٸÆnjʲشȞΊƐĮΤ׸ʆ¯Ǯ܅ðśՊ’֞ϓɒǀþجŅڜȿʐȤ؀žल̮͎̾ŏʂѪšȜȗʼnσ̀ŵȖϷɷ̏ƅ܏ɌыÔϳԬϿЮ¥Ģǒˆ˜ϠƦ˚ɢҬíȲŠҚçøǢƗǘĎʐͺõЈĒӔDZξǥʺɪȊ•ŘɿДÒ͒͊ʴؤӼޒ˺¢ȺҫҼ฽҈Ƒxׅمەʾʩ๤ƁŠࡃٔր੐̟ඊԡШӱƏҫ঎ʶ࿐ѹఴŽఔ۝੸व٪ʏܖ‘̦˅˸੭Ɣԗͯ൹ёշஅୡՙोثܯȿgɻءÒ༽ɹಓęօˇͧƫ૱࡛઱ƛࢁڹηȟԋ࣯Fೕ͓סύवʗ঩ڝ܅࠯ũطƔҫƽࡓȏЧחҥट๕݉ڗ֯Ͻϥߛ։ӑɷӈψЊӟֲڇҬࡹՠ̹{ࡅٰձę"], +encodeOffsets:[[-59008,-30941]]}},{type:"Feature",id:"BRN",properties:{name:"Brunei"},geometry:{type:"Polygon",coordinates:["@@ͬ̾܎Ң›Я·՛Б€ǭ˹ϥѦ"],encodeOffsets:[[116945,4635]]}},{type:"Feature",id:"BTN",properties:{name:"Bhutan"},geometry:{type:"Polygon",coordinates:["@@΂ˍÏԩۇ{ۿÈՇſޅ͊kǚ֌زҒɈ׸șѺqπɥ"],encodeOffsets:[[93898,28439]]}},{type:"Feature",id:"BWA",properties:{name:"Botswana"},geometry:{type:"Polygon",coordinates:["@@ǜƭ˄ӡॎइήĝD̑ʚՑٰŹ՚ϝ஑أݭع˩֓ʧ́ҙãƧГďʽ՝țہ¤БɾΟĸХșȵГЉʧпϑ׻đȇ̐üԠӽߚɧŲAរࠤˆ|Ჾش„ಖ͎̎΍՜ͤʮDӂȎưÙ͔ڣ"],encodeOffsets:[[26265,-18980]]}},{type:"Feature",id:"CAF",properties:{name:"Central African Republic"},geometry:{type:"Polygon",coordinates:["@@ۜÚƺɎƔgȾȏ੔͐Τ͠Ѭ̌ĉ̐ʂüߺ½߆ϴ؊ࣺю;ՐƜĪΫӜԿF΃ƋΓÄʻ̆ʍٖοҢͻT˗֠ѫΖεɆԋغͩƊˉˣęաpكĘ̹ïųȱ˕}ͧDzधнϥĎŗÝʥԕطǐؙĊ՗̴ۓ˸҉˓͛яùדգ²֩Ƙԅѻѯޱėʐ›Ϧϧ˔̳Ѡï̠ЇѮæʢċΞÞٴȬƴц࡜"],encodeOffsets:[[15647,7601]]}},{type:"Feature",id:"CAN",properties:{name:"Canada"},geometry:{type:"MultiPolygon",coordinates:[["@@؎œުxЯ΅̵Å੥Φȿˬ͆ʸ̎С"],["@@Хcઝ˂ޯІ̄î૆Ɂ࡮Η|Ʒ"],["@@хŝൡϢʥ̘ݩ̌Ưʈࡻư͕ҜðȚࢨǿԨŵ߄ė˺̃дЋ࠼΍Όҩ"],["@@։ܿո˴֠ǵ̏̉ݚɱϰȴ࠼ʵʹ؛טƞņѿʼԷΝ݉ϝ‹փǂǾیɻńইܯԅ†צЂ߫Ȳࣙ¹࿅~ŹʠԼ̐λɬ۸Ԓࢄ೾Զӎܲ̂϶™Njɫ҅Չ"],["@@@@@@@@߰äʥ॓ܶگͯDԑϪ̵ϮчʾƻτºˎЂŋ"],["@@͡ѳχîəʢ Î͖ʦΆkɈǣ"],["@@ঝҧץnǿɪزϲ଼SiǍ"],["@@ƼυјżӨɗं˽४ʽöЍؤÞ׶˥ݙ˃ಳȬҽϚ࠭ҁ஡ѣ˿Ӯଗăܴдņڌ˺ޔ؈å"],["@@ष¥ȿЪΦҼޖŜپɷXέħřձʛ"],["@@Է̍ଉʬۃğଫϘ݊ʼטζࢼʃԎƯʦDžԠ͍"],["@@G࡭૰ڄ৐եʡح߾֥࢚؈ؖܨ°ईஞÝఔūૼй¼зس҃פ҇ŃУ࿩חୡŻࢃʨʣуߵ۽ʓοই֩ளÇڏΡÇձ঍Ŀਉڻ࣭ु͙ڏ±উంƕϜ޻ϼّ୲ǔ༞εࡀ͋׺Ѕ੆ɳࢸΟ൶µࣴąƍܫʼࡋ،ळనߗ٨˚ҔࡺѭೢףѶഎЀ॒לҮהç֭֘܌৷لলࢤνݾ˫ಾגȘ෸ɫࡸć۠ɚ޴˵ਚӣʮ͙ຄÛ}۷˪ਜ਼ގſ،ӵ௖Ұߦऔ֌ϸٺݣબੳघ৙͵Յ૤Ӂݰӓംɏբˍͬ܃ټŏͶͅÖऻ؍́׽̏൯̗੏ۑ෇ƋᅛǮుPࢇÍ۱׽ੳω௉૗ॵޡ܌Ɛഘૄᄈ۪సČݔЫߍ֟ˊࣟ˜هતп൸ŨࡆीÎ؍ժ̥ਣսᇷԁ࠯ͽय؁ٓ֍܆ฤ۞഍ƒणĹջӆBନύʐ֛ƛ˧ɚٙىʱٹ̕ϡΥŽˏ¥čȹ໽A౥MϛƷࢵ؃Ŀßˍ͝ޗBࠛGϛƅƊǑøʯeďષлࡽſউ҅Ɂ@˷ƂĥŦnĔȂ̎ЂҦʘӺǙܴǵނ࢕ЂľƬūĺɳ@ǛƆ¥ȤǍēɥ€¾ĊȡĊćɚٵːڹ˪ࠑ͘߁̨ݧʃ˝Sਕɔڻʼnࠁʺ࡫Ɔו¾ʻƜƫҤ˳IE͓჏BᮝA᭯@ᡃ@ᠿ@៙@ᢡ@ࠛ@᠁@ᛷ@őF྽ࠜ׵δຽΐҳݖŤԨ੻ΨƧڴ৭؎iѠҲКwՌෙ՘࡭ॠՁ׾ޑϚ֣ΈѿѢࡇ˕ࠇҹݛւדπࠋɸࠟ|JⷎNᷲ༬ȭ೘Й࢘û݆ΖৰˀఢĹ఼τ൘Ⱦ־ΑظȠȊЄ׈ęෆݫ૦֬ŖّਔƐ͆ʖৰ·౼Λዸ̭ୄƛࠖÄଊэ஁зຶǷᗘIJܒƦࣆԋࣴьࡩΦժ˼৾žڦĎڴȩࡊҗरä๢ϛಬƄ௬oĭԺݞƦದ˵KߑՖڠڰuϞࡊ࣑԰কͺäघশ؎ૌƇࡘχଞॅݗЭ༠ǝ"],["@@нϿሎʬୠщॊіސ˟یࠛфΒ׭ࡰ݊Ŭ࠲Ƈश͹ՆࠉʼץථеະЉĝσൡã՚͓˱ູ̯Ƃฃɪঋ»ཅ˷ᒃű๻āҕІଫɮݙģਛږ֔ĚಘƜஈ›રƦྷȞᅗã஗jѷ̴ዎͲಗ[ืɚ۶ـגͮᖬԠ࡬Nj"],["@@݉ևಹך˸Ş૸’ٔȁ"],["@@öɵࢿ|ࣟjࣿőʑ¼ऍѾ˜̠ИÈነěชң"],["@@ڎԽޤڴᒆΈ෺ࢅůջဒʒߒͮሀыୄЏŊν༚Ȑ࢘՗᎐ܸͩ͹ߐ޻໯ϹጘչೲȁீޙೖÇʽכ้ঋਗά೓߲ઙĿŁӕࢪӥଜϯΌɟմࠩ́׿੕ɪᑏڨஎܣ࢔ԕƎ̉ᗱͲᅩӤ৳Ц̌ʂయќ௥Т`ʑᝡƅ܃˾ֆؤ཈dႸņ˫̜̊оચࠊɳϊ͕˾౿Рၳ˺՞ɆࢷԺ݋´ڏ˸҇ʛ຿ŅᵝȈᄫʚഹŴۥ̐࢞Ϧ஝Hˉ࡚٦ݨࡺ΄ᓪɢأի"],["@@৊ǯຄńɖʑ޷Е౜αƱݳ൝͗߳ê׉͎ᐡٮjˎ႖ĽएռসР"],["@@࣓عय़ŒԽ݆`кѮΨ࠰ɮც‡ྈȱళݟ৉Ǎ"],["@@ᕍЙѷςኹѺήΤ׌ؘܰւࠑԦᭊƀ஬ǧᒰ±ࠄʑࣖΝ੍ɃᏝןਫי@ν"],["@@ҙ͙௝Øৱɖ҂Ϛீɨܼ̬̍ˇ"],["@@ٞϵ€љϣس൱đࣗƈjӬ൝ÝÁٮࣜౌ˺ஂµÜŎ"],["@@̙͢ݠƘࢢ™ƪЩԝЋ᭗Žᑯη౩mŅ˜პϊ④ij୯Ʈପࠐ߈ɾᛄ˳๶ӻฺÛறߨޔ̪ࢄĭ˲Џ"],["@@ढ˓ကFܨˡȑ́८ȍՔȧଊ™௬ë೸ǼႊðീÏ࣒ͅȊ΍ԽɟభǷ੽ĸᜱŻႫcഫļᖁ˔̃ҦĹжࡇξ჋ĺঅʼ͂ΈႾÁ"],["@@ŗ٣٩̇޹£༝Ϋ഍ŹଗǼ@@ුؼႮծಆ[ସŬ"],["@@ϣy༽Âɡɼၜ]מƻĵĩ"],["@@༩ʋఝ˔ڼˎ௮Đஈſ˩ʥ"],["@@৽ǏඉBbŤࡴʦҌદǝ"],["@@కǥۃȚέ͂áΎજ‘ӪÅ৐̇ɫ̣"],["@@͜Ε൏Ĥ൩˘ሏŒߺʠ৫ȮÕ͐࿶ŕᗢ̫ٞЍ"],["@@০˕ଽʟ༇ك๥Óდņࣗ΄^̦ڔɢ໡Oए˨ՑϠ׌ώ׊ʲࡴÎοȖዜ¨੶҅මǵ൞ǃڒև"],["@@ᖢßᅮŅ໤ɫ™ɡᏅη᎙ǟݻȉᆬJጡԙേʃ෯ۇႿƓՙǡᡷěୈĿׇƭ۞бߙ˽ಛʃЋ͡୫ʣŞȏ෬lȳᖟԋᔧɴឿŻధĸཟªĿЖ༊Ȑб؆ԢÐᖤγ଩բഹLjڼ͘๰Ȩʄ̊஋͠ΥѠᘞ—ڒĝ಼̪ቃĬ᰽Á๣˸۩ͼগʘȁ˺దLjঘ‚࿲ƌం̺ਬ©ࣤɽٔҒૐƈບĢᢲ–Ҁĝ᝚ƚᆔÁᆒÁ"]],encodeOffsets:[[[-65192,47668]],[[-63289,50284]],[[-126474,49675]],[[-57481,51904]],[[-135895,55337]],[[-81168,63651]],[[-83863,64216]],[[-87205,67234]],[[-77686,68761]],[[-97943,70767]],[[-92720,71166]],[[-116907,74877]],[[-107008,75183]],[[-78172,74858]],[[-88639,74914]],[[-102764,75617]],[[-95433,74519]],[[-123351,73097]],[[-95859,76780]],[[-100864,78562]],[[-110808,78031]],[[-96956,78949]],[[-118987,79509]],[[-96092,79381]],[[-112831,79562]],[[-112295,80489]],[[-98130,79931]],[[-102461,80205]],[[-89108,81572]],[[-70144,85101]]]}},{type:"Feature",id:"CHE",properties:{name:"Switzerland"},geometry:{type:"Polygon",coordinates:["@@ƫŹȳϞƵіwá΅χƙةŀǻ͹ЏơƄһ˵Л¡αǶ˽ςБſ^ϠؚҾɈϤûɲƞ܎MǦǼ࣒ʱ"],encodeOffsets:[[9825,48666]]}},{type:"Feature",id:"CHL",properties:{name:"Chile"},geometry:{type:"MultiPolygon",coordinates:[["@@Bም࣒@Ԓw˧ͻܛʻЭ‚ӻä؏ʨ࢟ŨੑҸ࡫Ҏୃशۘǭ୼֗૜̟ѢϬ˘ֺޠΎװı"],["@@͢୅؆ŘĺɁ˿ࢍࣵг€ඓǫ˓ʦ͡ץԹջ߁̛ރĀ߿ԫࡹϮฏɔƵCޛӑࠍpۯٍշFޙʮࠏԉ̧ɣݡȟࡱƚ৿ͷǡȞॹϜ͇ˡΛ϶ǙĚ̓νǃĜӱ̫૗ѽܓĮыˇՑ٣υôࢹ̧̐֔ÄgؽΒө᎔őުſݝPЙȷݷ̣Ɖ޹Σoॅ˚१ג@@ਲ਼ӔˁՒʄӰх֒Ņ෤Φ߰ࢴٰౣʔߞݒ˸ඊत̏Ѯგ֝ɠʿ਻ՉŠ˂ல˺༒ϮָʍࠎéूΠ„Ԩപ׈എΤబȗ఼ʤۚĵਞӮਆưྺ˒ნˀሤÕ൘ǩ஄ќɌɦњЬֱŐ؅ѴΡ˅߽Ҍह"]],encodeOffsets:[[[-70281,-53899]],[[-69857,-22010]]]}},{type:"Feature",id:"CHN",properties:{name:"China"},geometry:{type:"MultiPolygon",coordinates:[["@@ԑഓΫۏѷ܂ĩخӶࠜڦَϨʡƣԓ","@@ܩЗۏʺyܢаϠࣾɾӚoȊ͍σσșӟ"],["@@ฬˍ঺ׯͼ߃౨Cܰͨ൸ʜѳݱ͙̭˽ः֡ࠇ৵ƪܝ̑ɜܙť঳ѕwLяթӺͯһಙαƀѹܩŒЍ˂ֽ׭ऑҋۃա୭ʑأϽࣝɭ҂ϴǭ͞ږ֠ѹѲܷ̓ॉ׏ԫթ࠙¡ѓϻѸ֩یƏ„ϕڔʕस׶ݚ͝լuƌѱஓɻϻҏࠇућיࣜҥͦࠝԞޓ֮٥_دՅɯȪ҃ӶʻŻۃɇڗҷ÷ؗࣧڹિޭোିޡୟۻृĩԣύ̃˘Ӈй୭сࢵŹ˻ࢱҭ·ə؎Ȧ͘ૻːЇƍࡍɔЏ΀ƄӜޏƶЙܑ̀҃ࠇīڡJ҉ȳѥūŶ॥҃x÷Ȣ}Ύ؝ʓεƸر͂ʔۤՏǎȧޜࢱƓĴাߔۮ”ۚ{٠νȨ˭ӶӭÙࣟŲ˴ΜϿԺ׳Ν۵ȸॷ՗އسڳĿοɦѹr׷Țґɇ֋رëڌԟǭওĈोȖڿτٵǔ˯ЖҽŦࡓոکʴΑȩଢ଼טࠛՒɽऐ׾ő‚іͭјĐۆࣙঠ൧ͼʝ٦ةϼƫʌųӎˆ͜ԛȔ˟ďɇިʈȔśȠߤЈ׈ǐࢸő͆՜ંIJͮ̚೜ҔŠȐãӐּɔݱฦဘͲјȈ؆ຒဠˡҲϞ¢ࡆۦĀٖ֔͢èɚו۸ѽப̿׆ڱ͕ঙ̢ηূƝଆŝ৪ԻԲġϤޟӲӿऒnჄȉ૤Ŝࠦůఔԛ৮BόʽঐҌബ̈ాŒঘ̒׾҈ך˰Ƌˤˍ͔ѴըӀùࡺǝ࠸Ѿ౲͚؞֊נʆ௠ŐڐĥĠ̘ݿזګː٥̳ࠣžӇŃɏΆר࠾Цو৚̓ஆՎQτݸࢾҲːWҪңȦۜмਰƲ૜vసʡ݈̱԰ࡏ̀α̊ԩ̶ࠕ"]],encodeOffsets:[[[124701,24980],[112988,19127]],[[130722,50955]]]}},{type:"Feature",id:"CIV",properties:{name:"Ivory Coast"},geometry:{type:"Polygon",coordinates:["@@ϣUוǒ՟Wহƥ׍ʍ̯ࠫNjvÞۖĄŀ}ͨΣΚˉÈʕɲǾώčО ʔƄB¸ξÝnjĄŜ̸ĶȹڨȗΎæ˸ǘÞŊúɸųٮOƸʖƢgʎĦžΫȞłΌŰϚǽƦ˥Ϙǯ̎ɄϾŒֺɏɠ஡Ο۷ɕेθܣ›ͧ"],encodeOffsets:[[-2924,5115]]}},{type:"Feature",id:"CMR",properties:{name:"Cameroon"},geometry:{type:"Polygon",coordinates:["@@Ľ°ӻŇԝŒЋÅ൅nŬڒ͟֊ϧƚǟϖɋŦXɶɎתЎ߸ʒRԄӮ͈bҾΉ־˲ĀΔȌͺžь҆ΊǞךDzȊŢѨɜ՚۾ٲ¬˨ĠƲͫͰ‚ˌʂ¶ͮ՟Ê֏‹֏ҜޅҷTʁÏϥČǻЅӸөμƛŠΏˆ׃ſɩх࡛ȫƳÝٳČΝåʡЈѭð̴̟џϨ˓œϥĘʏÓґڛȤڷɜ੗"],encodeOffsets:[[13390,2322]]}},{type:"Feature",id:"COD",properties:{name:"Democratic Republic of the Congo"},geometry:{type:"Polygon",coordinates:["@@»ঙͶŕˑ̗͓ɟ͍ѫǯϷ±ګț͍Oهʍɹ‹ԃŗÝýҟɄϡÂ৥ưޝċѧǘӣӤҹҒ੕ͥĒ૿ƙɣĵʇՙȊχƫষĻࡇɨƫט͝ɲƴìٟࣟR·Ҧ̳ΨٟŠȋѰԣ˅ڧŞ˫ϢՕüϽqµʾ́rϥºԳųιtȻû®ৄ˩̸ÕԬŬԒǝ͖eՊ৳Qò̢ѕG­ƣԵɁӧűȿҫŠˣş։å͏Ѱȗ˖ʋԌȷض៛\\̍ķʑh΋œşʼɊʀμƎɎ̪ǰɚđ˼͐ҜSÄʃ̼ƩӶՄӨШɆːƒ۔θࠆϬўքМĪˌt̰Ǝ̆«ӊŀݖǐԾʦ҈¸Ԕúה͜ѐҊ˔۔˷՘ؚ̳ĉظǏʦԖŘÞϦčनоͨDZ˖~ŴȲ̺ðلėբoˤĚԘۙϘķɤƖϲÅҶDzȦΫ݊֏"],encodeOffsets:[[31574,3594]]}},{type:"Feature",id:"COG",properties:{name:"Republic of the Congo"},geometry:{type:"Polygon",coordinates:["@@̿˾ʩƗͻγۏࢸٖҪ̓֌˾ɂ֦ĺäό҆Зݐ•ʴЈł֒ĝڀЉӺζ঄ȽǘسçɻѢÔξ੘ڸɛڜȣÔҒѰ޲ԆѼ֪Ɨդ±·ԓʥ҇ǏԽĿݕ¬Ӊƍ̅s̯ĩˋփЛϫѝηࠅ„ۓɅˏӧЧӵՃ̻ƪÃʄқT˻͏əĒ"],encodeOffsets:[[13308,-4895]]}},{type:"Feature",id:"COL",properties:{name:"Colombia"},geometry:{type:"Polygon",coordinates:["@@ΫȤЭ˨ʅƅ܉Ŝȱΰƽ_࠿Ӓŕʺ̼ڛтȢ̦иÊΞՆ͐Ѵ̳ȦDŽӦȏސǸɚƃ܄ͻ҄ņТ˔ÑǂʠțӶĺŬѢـהΌĚT˦ƺ܂ӖϸՊfäǪڂéڌъ͞ȊОК̖»ɚɛǍ˱գƕɇп͗ʋʓ̷Ĺ׵ɷӭѢÇņϭȄȁâ͹ij̵ˆǫȸéȨ̉ઊĄӦŃעܡͼĚ؂­ӐĪ̔ƟƱҍȇ˯ß׻ǜ֑ʆʟ†ȉэл̨ȃɠ̋ʰ࠹ǁĻǏӸɷˊ˥́࿕lZԿӰē…͏ǙĔҿƑK؏ώ̫ƀӓoηϙᘯп҂ʣpժࡤٟϾԍị̈ƤҧɝصŀӵࢤϳɐˍІ֑Њɡā"],encodeOffsets:[[-77182,-155]]}},{type:"Feature",id:"CRI",properties:{name:"Costa Rica"},geometry:{type:"Polygon",coordinates:["@@җȆǟǮĬƤ‰ȄɷȪͥǔ́ņÅʖəƮÄʑǗȩȓɸˑĊŗǞLʮŎˆʁŠȖnjŴňֆɝȖŊˊéƔǥʜÇȪDzɈҙ͖ͷЂΩ͗õLͷǪűűıƱëǟ©Ǖ"],encodeOffsets:[[-84956,8423]]}},{type:"Feature",id:"CUB",properties:{name:"Cuba"},geometry:{type:"Polygon",coordinates:["@@ܨÑڊW߄˹̭ͮ޺Ĩ̔ȡ܈ԳԺϛˢ\\ԆǟÕʁئ“ٌ΅ıȟ֑Ń֡¥׃âளą֜Ҷ΁ɔէÈ̃ʐȥӎӃ޵ɦʥǬભž̋ǐ̀ɀࠗ¨׿ѧΏ[ťȳеğΫĂѺʸǼ̤ϞȈіǎَĄȰĢ"],encodeOffsets:[[-84242,23746]]}},{type:"Feature",id:"-99",properties:{name:"Northern Cyprus"},geometry:{type:"Polygon",coordinates:["@@ÐJŨȮ؄Yކʢ֧ΧÔƿęˆLJÙűj¥iĎѾNjVɫïƿ¬"],encodeOffsets:[[33518,35984]]}},{type:"Feature",id:"CYP",properties:{name:"Cyprus"},geometry:{type:"Polygon",coordinates:["@@€ãࡱͿЩŊȟͶЎŒǀ«ɬðnjUÒ½j覎ŲiLjÚ̇"],encodeOffsets:[[34789,35900]]}},{type:"Feature",id:"CZE",properties:{name:"Czech Republic"},geometry:{type:"Polygon",coordinates:["@@ϯǂЁ©ٵʲ̏Ùҿ΅ر˔ӃΰѕȬėΠƧʠؒǾ̸Ⱦ׾ǎɂdžɜīϒĖЊ˓ؼñ¿ɳҘǧŲɒּĥĄʿز»ϮЯʡCŽƯȕ—ÅȑLJ¡wý˹ēϋbšȁ"],encodeOffsets:[[17368,49764]]}},{type:"Feature",id:"DEU",properties:{name:"Germany"},geometry:{type:"Polygon",coordinates:["@@d͗ࡔțS̗ࡢǂҾɰॊͧІˋȞёɹɣ̨̙Ⱥ҅ß́Έ՛ϑĕɛĬɁDž׽Ǎ̷ȽؑǽƨʟĘΟіȫӄί̑ϯ̟ŃŢշýƛʿǤЕ~׷ƭݍ–ţɛыɺʩ±࣑ʲǥǻ܍Nń״ьֺ௅ƸЇɘ´ςǗȐĨ֨ƗࢢԎ@Ɉ͂Ⱦޔƿ˴ǐDz۰°Ƽȃ֮вȓ̀ӈٌōՠŸ"],encodeOffsets:[[10161,56303]]}},{type:"Feature",id:"DJI",properties:{name:"Djibouti"},geometry:{type:"Polygon",coordinates:["@@ȤʹΑӏȩήɯ̱҇ȅƬȭÏҷb_ʮßɶ˴Ѐ̐ϊήñʪȴ"],encodeOffsets:[[44116,13005]]}},{type:"Feature",id:"DNK",properties:{name:"Denmark"},geometry:{type:"MultiPolygon",coordinates:[["@@ԋڹ࢟ӄŝΒ௼˨ˎу"],["@@ȵ̓ʡĞ؁؁ɮХ՟ŷًŎͽҲ}࡬Ɣɪʌʦ݌À̐ɴڮʂƒѝʟ˙ĶɽҘŵ"]],encodeOffsets:[[[12995,56945]],[[11175,57814]]]}},{type:"Feature",id:"DOM",properties:{name:"Dominican Republic"},geometry:{type:"Polygon",coordinates:["@@ŀƞپIӾɏɜtƴ̕Ҡhʡϐ‰Ю̷̯ͿЍǼϫ•ˡ¢ƱƵ͑½ŷȲˣťͳֻɏƆ§ʎjɬɍʦȲƚÞ͒óҜ"],encodeOffsets:[[-73433,20188]]}},{type:"Feature",id:"DZA",properties:{name:"Algeria"},geometry:{type:"Polygon",coordinates:["@@ᮩཽᝩ࿷இϑटćU՘ϵƌԹʊȧЀᬻᆴᬻᆴṕᎠfnj@ÊQ঺ബب࠼Ÿێɦ͎тচͪ˜جӢòϞ̶સƚƸ͜ɛDz̃ࢲ¹Ԟ́ՠ߰ҠࣦƢՌΎ߶ʰ෎Ƭർæшůߊͨ࣌P΀ȝֺ¾ǟћƄߟȡۙԭҵôمۊԃRȯԮ͹Ϊຝ˖ݏ°ϵƧۇÔϥŃҟòՇͫΗӺؓŽέ̘ҵϼƸڒϷςՃ"],encodeOffsets:[[12288,24035]]}},{type:"Feature",id:"ECU",properties:{name:"Ecuador"},geometry:{type:"Polygon",coordinates:["@@҂غǻξ͍ϵԉςǞʀƙބ̎ŴƺԼ͆զÍ΄ҢǸ׀Ͱࡀӑƾ`Ȳί܊śʆƆЮ˧άȣŞٓʽճࣷ࢟য়ͧԥܵǃ֣Ӆ΋ΙъͻĞ΍áw̮ʈȨıΔ"],encodeOffsets:[[-82229,-3486]]}},{type:"Feature",id:"EGY",properties:{name:"Egypt"},geometry:{type:"Polygon",coordinates:["@@ɽͷǹىɫѩȝƥ˩˔ϛϒ׵ஸđùΐࢯԪࡋٌವ̴ҙ˒ӃݮछǗƣ‚ճ঒ݭƨǣΏ@Ὁ@⁩@@ᶶ@Ჴʥڲɐ԰Żά̤Ж૦b߲ɝ࠲ʛϴſ٨ˊΌʊݎêװŃɮеȜ˜ڨȣټ³аɄւ෽"],encodeOffsets:[[35761,30210]]}},{type:"Feature",id:"ERI",properties:{name:"Eritrea"},geometry:{type:"Polygon",coordinates:["@@˻˖ΉӰϋ˒ɏܷ̄ͶֻXȭǬӯȡԛϢʽط঑ǬęʹβఀĊ֒ˆʴؤƐьӒӦঃɴޗҢУବߏҲӍҖӝˀ˿аʧʩȳέò"],encodeOffsets:[[43368,12844]]}},{type:"Feature",id:"ESP",properties:{name:"Spain"},geometry:{type:"Polygon",coordinates:["@@¦״΃θஒ؆ਊƱ૾NࣂƝۦªമƒͰ͛໺ϡ̨ǺीϝআŊ®ӥߓ֓ઁǯõ˱ԩү͕ہ͞ӑӟϑǹճىǗש٥੧_ߟhՃ͍̓ͅЩê̵˴ʃӚ޷žé˦̶̀Śɬ̃ʢɶրͳԌδè’ЈƎŬZپϲɪɻфөˆƝŁӹCɁЬ΃ū̥ɇ"],encodeOffsets:[[-9251,42886]]}},{type:"Feature",id:"EST",properties:{name:"Estonia"},geometry:{type:"Polygon",coordinates:["@@ĮӸ̱ŁՓ̘ñӘਫ਼ɼ੔Ũ࣮Ƒࢂ|Ŵƣׯӝʞ޵ΫˉۙDܡ̸ρļ܏Ʃ"],encodeOffsets:[[24897,59181]]}},{type:"Feature",id:"ETH",properties:{name:"Ethiopia"},geometry:{type:"Polygon",coordinates:["@@ԜϡӰȢȮǫּWܸ͵ɐ̃όˑΊӯ˼˕̏ω˳Ͽàɵ`ʭҸaȮÐȆƫǽ̴̕ҧ̴Й̛͎ᩨঽۺNᛛᡃફ™ݟףաeɯ˅ַB͹˴ލΙʝΓ֕àȃĬȟwˇT੟܌ב@˹ˢ@ҾѧƘӻࣴϥȚƧʹэЦԧÒ˸ӐҀrŲʰ[ݲʞࢠЊɾĎ΄ήٜԔи΀ࠠƆܠ঒ǫʾظ"],encodeOffsets:[[38816,15319]]}},{type:"Feature",id:"FIN",properties:{name:"Finland"},geometry:{type:"Polygon",coordinates:["@@ūיಀ֓ޡى঎ख़֡ܛݴس΅յఘֻ́ѓޭӟᅡੵໃá๑̯ൃǯӡҞ߿ˠȈࠢСݶАӪނՆ኎࣮֖Ǭē΢ୟЈ˳͜uಒ಻ֲ૩ЪԊɞतѻલ¦ࣘȭߠϊЬ؞ಬ˶઄ͯΡכ"],encodeOffsets:[[29279,70723]]}},{type:"Feature",id:"FJI",properties:{name:"Fiji"},geometry:{type:"MultiPolygon",coordinates:[["@@̂ʍƓѭԳŗҩļąτ͖̀ϤĻȼƐ"],["@@՛ǯŅ̼оǤˊ°Ӱˀ@ЧՕȷ"],["@@é­@ШǨžĽЗ"]],encodeOffsets:[[[182655,-17756]],[[183669,-17204]],[[-184235,-16897]]]}},{type:"Feature",id:"FLK",properties:{name:"Falkland Islands"},geometry:{type:"Polygon",coordinates:["@@৘Ԍ܎ȿԌʹڦϙʥ̋ଋʥϙ̌܋ϙпϚ"],encodeOffsets:[[-62668,-53094]]}},{type:"Feature",id:"FRA",properties:{name:"France"},geometry:{type:"MultiPolygon",coordinates:[["@@ˣ٭ϡǠș֢ǜ̺ը͎Ɯܛ"],["@@הЅќà݀ϥȊñʎjЈɗெƷыֹŃ׳ɱƝϣü‚ɇؙҽ]ϟВƀ˾ρ“ʁʚ̿̅ʯɐٱҖŃĩηݿӅစɬ௧˗ĩԑঅʼnिϞ̧ǹ໹Ϣͯ͜ѢԎdžူࢁࢤإю౹͒čؖઠǾථɏˇॎߌέዠپʨێܾǞŪ̑ϸ_ϸ͵"]],encodeOffsets:[[[9790,43165]],[[3675,51589]]]}},{type:"Feature",id:"GAB",properties:{name:"Gabon"},geometry:{type:"Polygon",coordinates:["@@ࡹࡔ։ۚԙࢄ‚˨ǾˎȲؔǜخ˴¶௢SOৠЌÆԞőӼňľ¯ÓνɼѡشèȾǗεঃЊӹĞٿŁ֑ʳЇݏ–҅Иãϋ֥Ĺ˽Ɂ̈́֋ٕҩ"],encodeOffsets:[[11361,-4074]]}},{type:"Feature",id:"GBR",properties:{name:"United Kingdom"},geometry:{type:"MultiPolygon",coordinates:[["@@҉ֽًǦԱ[ǦҊǥ҈۴–ࣔԳ"],["@@࣋ࣧࡦŘऄIɕۅݯݩࢄÃäĕݠ঱ֺƇԬढ़ʈͧৰDžķ՝ѓʗͲѣݱѯ૳Rෝɱϻǒ։ϿޥĪם͍ҁǘ௼ࢨݪǺOBಽƔʃͰ࢜ʺҡҐdžռఢ÷D@ŮӤ֛Ԯ_\\৵ƨȧɬ̨ϒˡɴҍЇ·߶щє̨ࢆٶھڤá০ì"]],encodeOffsets:[[[-5797,55864]],[[-3077,60043]]]}},{type:"Feature",id:"GEO",properties:{name:"Georgia"},geometry:{type:"Polygon",coordinates:["@@Ųάȿִӟ̲ҭĬ̯ʴĺIJ܄ƝఆƋଦЕƦƻԚƂ޶ǭʴ·Նșɓřвғŗıҏºصʎȵƍଢ଼ſ߳Юࣅ¡"],encodeOffsets:[[42552,42533]]}},{type:"Feature",id:"GHA",properties:{name:"Ghana"},geometry:{type:"Polygon",coordinates:["@@೉ӯҳ˽ݳʑݡʆœͨηܤɖैΠ۸ɟ஢ŗنrӊฤ¢ϊÕ˔ƊϴáÕʿΖџC؍Ąڍɂ̫ȅݳäйɢՓȈ̍"],encodeOffsets:[[1086,6072]]}},{type:"Feature",id:"GIN",properties:{name:"Guinea"},geometry:{type:"Polygon",coordinates:["@@ʃtǡͷʁJǏǴÈͶΗԨɕħǵmɳ³V̮Ƈɘ‚ʔǻΜɹ̜ڥDțǁɵoƝǷīɹ҅σρӼ͛͢ɋŊȿǖħϊūȂʓƐώЦʮeɖƘȄDƄŎï˨ĢĖd˶МU؀ȱȄlÚĤҜáŨ´¶̭ƆBɖŒƔƒɸɇάãɲǺ˖ŒȬŠǚuȈȁĴɳΆΙǣɏ˙ǴĊŀį«ʡʲʍǗÝå˷Ș΍Ⱥڧ̷ĵăśÞNj·νƃA"],encodeOffsets:[[-8641,7871]]}},{type:"Feature",id:"GMB",properties:{name:"Gambia"},geometry:{type:"Polygon",coordinates:["@@ņόࣶzȎȦˊ`ͨȷʼIˢƚǞʏεȋιdέǰ̷ȗƭQȫŝއl"],encodeOffsets:[[-17245,13468]]}},{type:"Feature",id:"GNB",properties:{name:"Guinea Bissau"},geometry:{type:"Polygon",coordinates:["@@҅ΘΝÈȕʀLŸʯǴÁǶѼƌ˦ɦĨ༈•c˵ġĕð˧ƃōȃCɕƗʭfύХ"],encodeOffsets:[[-15493,11306]]}},{type:"Feature",id:"GNQ",properties:{name:"Equatorial Guinea"},geometry:{type:"Polygon",coordinates:["@@ƿŴ़̀െmPয়௡T˳µ"],encodeOffsets:[[9721,1035]]}},{type:"Feature",id:"GRC",properties:{name:"Greece"},geometry:{type:"MultiPolygon",coordinates:[["@@Ҡ˱ٺ¶شÑqƣҜĶĿʛ௃íTƒਁǎƺΦ"],["@@ʹՁȥĥԟ|ѫĀৱɓ׌ҿяƋҳAѻўƿȁȊԅрЁ̓ǿҴϯжʑ^ӅޥɠʜѕՓĕ͈ݏ֏Yۍμ̿ڦƧ֒͝ϮљӐÉʆϸТ¼˚˘Ũjɚռö͌ȀҖgƒƦdž„ت{ڨɲע̉ކĀVмЦɝ"]],encodeOffsets:[[[24269,36562]],[[27243,42560]]]}},{type:"Feature",id:"GRL",properties:{name:"Greenland"},geometry:{type:"Polygon",coordinates:["@@ᬜԆ᱒›ੴ̴ᲈĄ䀦Ŀ㉊ڗ༅͕ộ™⭏ćшƫᲐĠᡚ́࿈ʴۦ̝इӧᒞ̺✘͚ᠼNjҾΫ⃝ױӃȕ᧑ơወ¡ছؕگկ€ध৚շಽ“൧ˇ༂ѽȢ܋࣍ýઞܡህÑঈ΁˟̑இŽ୥E੆֩\\Ϗပΐћɣଌȿ઼ԣ͈ڱກlj٫͖ਣӘ˼֭উѵᕖ•୆¯ᖯܵᗿڏឧ́ओIࢅ͓ୟࢱᅵכׅ“૧ȷ஽ȝܛԱ[כыտോڧͺٿϗ۝љࠍஅ½఍ۈဿLࠁҢ֕ࠐฝਲэոŗݮ୓ޢ̢ئ֗̒ࠪচొ̺ͨΘǬڀॡ̕қůݯţਏ˜Éְ͢҂ެ\\႔ɟ෿Քݩ˾࠷ş۫ȼम޴ԝ̺ڗ׈ৡࢼ੯͚XΚᖷӮᄻÖᖟ‘Ꮕ×ইˌวՈᕂ˄ၚ¬≹ɖ቉΄Ś͜ẊИᶎИ̪͘ᗗ̠ܺͰ᯲ז௢ĚΓϘጲɜᣚƂᣖRࣺʽᕺҨፘ̽୺áპ˙ፅҐŘή"],encodeOffsets:[[-47886,84612]]}},{type:"Feature",id:"GTM",properties:{name:"Guatemala"},geometry:{type:"Polygon",coordinates:["@@ћƦԻfϩǖҍΌrʖĮȠšƾКۆ઄Ft˸Ƌ¾ġǺ̵Ț̹ˬϜDBӂ޸BަUOڗßॅʤ@˚ƱòŰʘŃϥ͍ЉɻÏljâǑǧɇȟ½¬ıƿġ˽Ƀ}ŭ"],encodeOffsets:[[-92257,14065]]}},{type:"Feature",id:"GUF",properties:{name:"French Guiana"},geometry:{type:"Polygon",coordinates:["@@͉͑ГÑŗʀȉ–ʹɩνǦɈΪòϤƢή͛ӸáֺѪܠ˸ğؤȥࢸۿƔ·ӻޑʳأ"],encodeOffsets:[[-53817,2565]]}},{type:"Feature",id:"GUY",properties:{name:"Guyana"},geometry:{type:"Polygon",coordinates:["@@ր̯Դյzџ̈́o҈Чͪ̇Ƈݱԛɕ°ȣƹџϊ؏ːAŎӃԢܳȱ‰ҫî˙ɡϟƥ˅—ġǑЭ¦ԫЀÓϴɋьƆܐɸ̐ȕϸ˿ŶŊτțȘѩ™ْ֩ɬɲiϲԬƊȾƾ˽̸ô̬ږӲ"],encodeOffsets:[[-61192,8568]]}},{type:"Feature",id:"HND",properties:{name:"Honduras"},geometry:{type:"Polygon",coordinates:["@@ơˀʭòÐʹŗĞǣÒσij‹ŔʩƈǷǚʛìǨɈáǒÐNJЊɼϦ͎ĔȂƨʊ\\þ垦ϸùϲv˒ĢİĦˎ©ȪÉɘnǖòϨśƄkʲƿʐį̏Źɜɳ˽jśŕ̇ŋɃAȅŃǙœƛźĕ{ŇȩăRaǥ̉ɳƹıđĽʛǞǹɣǫPȟqlЭūQĿȓʽ“"],encodeOffsets:[[-89412,13297]]}},{type:"Feature",id:"HRV",properties:{name:"Croatia"},geometry:{type:"Polygon",coordinates:["@@Ȳ͗ˊʇ͓̓ϝȆׇ[ܟƔϽmǻǧ̝ȖǫΑЪϽǼʹϮ̽͌ȃ͆Ηݔ͇ġƛ߃̶ӣ̢ޑʠ۹ؤǞØϥΞe˲եƄʱγʝˮn̆Šbג…Ƹƚ˸ƍͤgGɼ̈ĒĈͺڞɠˊĻؼέۜlj̼Ų"],encodeOffsets:[[19282,47011]]}},{type:"Feature",id:"HTI",properties:{name:"Haiti"},geometry:{type:"Polygon",coordinates:["@@Ԣ™ܰƁôқÝ͑ȱƙɎʥiɫ֏ƜЅÍԡÔϽƿ҉ʾö˔ޜśيã̢ȈϧθP͎ՋžȌɶ"],encodeOffsets:[[-74946,20394]]}},{type:"Feature",id:"HUN",properties:{name:"Hungary"},geometry:{type:"Polygon",coordinates:["@@˨ըǍǼӂDÜ΄ђɋ̲ğ۸ļäǚͮ~ЦžĜÃЂŀȠȢˠ¼࣒ʭǴĒҲɭÎɣԡǭЉ֫ԕ֭کǁԽš١ə̻űۛNJػήˉļǍ˴ƗV"],encodeOffsets:[[16592,47977]]}},{type:"Feature",id:"IDN",properties:{name:"Indonesia"},geometry:{type:"MultiPolygon",coordinates:[["@@Λe૝ך޴ǒѴʭ̎ʭ»ɩ"],["@@ܙȁijĶø˸ΰԢࠨͬĐǓfʫշع"],["@@̢ɣԲèȼΥॿǛ׉őҍP̀ӚҤPɤ̖"],["@@ūұ౅ʅૣľE̬ښǪՂʥ֔Üݬ̮"],["@@ྔċȂΌ༘З̪կీƵਐӿय़͋ऍ͸ݻwࢍØ޻ưঅ͎؝ČΓŁ໕ΌƣΰޑØּߤ৶·ڴ͡ΒÛŘ̗"],["@@ѝֱćنƬ̠Ǭ˴ȒʗCЏ"],["@@̿˥ׅƸǏΰࡘ¢Ⱦˣ"],["@@̨ٝۿΌۯìӃÅׇˆȦҦਠ”ऎʕ"],["@@ɼയ࢈ԉ۰ࢼ८ԔݜBܘ̉خ̛ࣘLJbᩑbᩑݟې࡟ǜȷʇ੡}ΦۂՈɺɕࣲЕ۸࿃܆ۗêృަʛУ͑óȏ̮GκٛЮ̢ࣞ״gëɠ௵DͩԄݥƺΡдଈȰњ˜ഘ·Ƃ̹"],["@@ڭ࠭كlj߱ǐඓ¥ܽŧţٍݪݛҒϠ༪˸çϯλŪιӯ͙݉ߒ੿Ƶ˿ݲॻQտ҅ʙ̐͡Мی࠙͗ȻɶŊ͖؅ӲØࠌ֕ʭîও”றՓũίʚʌޜŽ߸ΛPʻֺΎվŤښф౎ǮΎ܎ذپʛ੖śॴ–ࠨ؎Ʀȉ"],["@@©ܽџĈŷԝΌѷɽĵ͹Ւʟ੺ǚڤ˨̨ÔҝӸóĀ΃"],["@@सާহį˫ֵšݿַ߱u࠷͕౻ŭ̚ॕϙͫԤ׳´лːৃ̟̩Оս¯ۗĬŹૺнɺЕܘŝ݀ĮުԂ֐Ɩָ֗ӅըǠ՜ÑӪъЖôߒɽۆǶњୠ͔̈̆क़ॲ@ܰƙӍݷآߓơϭ"],["@@छkۻ۰અۊέԚٍۄзؾٕ୴۪݅ʙܠ̳ڀݵՊѭܘمҺࢗऒóђզ‘ಢNjݔࠓٮ֫ҪΓߔࣙࡢ_ۺֹӠ۳٘ϥͳۉӖ̞̅sƜו̊ҵؠõФՏɁ਱‘ಟ"]],encodeOffsets:[[[123613,-10485]],[[127423,-10383]],[[120730,-8289]],[[125854,-8288]],[[111231,-6940]],[[137959,-6363]],[[130304,-3542]],[[133603,-3168]],[[137363,-1179]],[[128247,1454]],[[131777,1160]],[[120705,1872]],[[108358,-5992]]]}},{type:"Feature",id:"IND",properties:{name:"India"},geometry:{type:"Polygon",coordinates:["@@ࣚটďۅͮїѕ׽ŒɾएࠜՑ୞חՑϟ͛޻ࠀͅߊЭરһସʼnӜёٮāৠȝ۪bĪͪŋՖÞβԠǮìڋlǙކ͉Ոƀ܀Çۈ|ÐԪ΁ˎڴŀވشॸ՘۶ȷ״ΞЀԹ˳Λ࣠űÜ͇̍Ʒèԫ׷Ʋછׅ~ӓҩ۵§ХϏۗځȒࢇȏ˹ĚΣгȥѵ೰ɵEƍ՝ҡѦʸӎϖ¶ϰ܆ӝƜީ]ߝŚóאБ¤ڕζ֭̓؆ѻԿ̻ȅ̩Ԭɣƛԑ̆كžەţֱ̫Zਛǩ´ك҃ӻ௃֡ळ঩كՋ࠷ջCϭлȹݳ̝Ͻ«ʥٙǪધ®ۡΣߙI෗ѣ¡ϣٙʰˣދʃ˱֯͵ʍߑ޸ϳ୴͑ࡒ̍Јѿ߰ȻੂơՀޅ଼Α࿀ʣ੾HৰǍ޾௣ԉףĶ઱৲И̤ʝͤড܊֖֔ᇜCǗܞҽюĩ٨ջϘऒࢢঊÙ࢞ࢢՄ࡞ࠄࡈ_״ܒӠڳд֪݂̇̕Ьβ౤ȱपŰߺ۸"],encodeOffsets:[[79706,36346]]}},{type:"Feature",id:"IRL",properties:{name:"Ireland"},geometry:{type:"Polygon",coordinates:["@@ƒ׷ًݣ๯ӹ஑Ŷڼ࢚ѭࡢତڄٌϼǦ҇ǥ҉Բ\\ٌǥ"],encodeOffsets:[[-6346,55161]]}},{type:"Feature",id:"IRN",properties:{name:"Iran"},geometry:{type:"Polygon",coordinates:["@@݈njװӔ֚{τƾװýघэڤğ।ݓظ‰òۻ΁਷ɱؑκŭΫҡˠڡàՓِƙæեݿݿжѵ͸ԓߦυx݉ДƋêϯ௉ѡ̓উཌྷʪࣷȖेŊΧਐЕƪ٣ƭࡑНਇ˦ࡑ٦߳ʈ֗ߘا૪ҍƋՕ˦̻͝ҭѴS҂ˍ@Ɛ،ѝٔ਍Ң׉ߜȜپц̂ÙӬտʨխ৊ҟڨǐʼʿ६ּʈƄͅъϯ־ő̤~রئ̀Øʞʙ́гԼѱȾ¦ˈإߖǩ׎у஠ƟಾɞĄȞ"],encodeOffsets:[[55216,38092]]}},{type:"Feature",id:"IRQ",properties:{name:"Iraq"},geometry:{type:"Polygon",coordinates:["@@րʧÚӫх́țٽ׊ߛ਎ҡўٓƏ؋ˎ@TҁҮѳӿ¤֟ê؝߭༟äᛍၖఫךৡɪ͹৾ᇶ࢔͆৬āؘҢȺјԾΰž঎Ň̐ɉЖƚծ৉"],encodeOffsets:[[46511,36842]]}},{type:"Feature",id:"ISL",properties:{name:"Iceland"},geometry:{type:"Polygon",coordinates:["@@șիॊֵથٙᝓֹܣƵૉŮᚑˈࠠψᆧЪ๪ǎ—ʘᄋȜ֨նౠŰಸ֭౨Ҝ੒ʃൌ҄ආÑ"],encodeOffsets:[[-14856,68051]]}},{type:"Feature",id:"ISR",properties:{name:"Israel"},geometry:{type:"Polygon",coordinates:["@@ƥ˅̣Ŝǫ֓ɂĥɋř—ɛЄŖp͛нഉց෾ʔˢ˶ɞϼǠيŤɆzVˬCþƦɤ\\`·ŕŵhM"],encodeOffsets:[[36578,33495]]}},{type:"Feature",id:"ITA",properties:{name:"Italy"},geometry:{type:"MultiPolygon",coordinates:[["@@̟ڋŲʹǭѝٝ̈́ёĞ୩ѐŞќজûࡪĠْò"],["@@Ԍ׭ş૕ϣÂ΁˫͇ɞ‘২ȓӒҨ¥рʼ"],["@@ரɏĝЯȬΧڝŪہ̗²зĻʇˠё߀чцۛदڱچLȲȃɽǗݪ̥ؠʩܜѫĔƿƽ̛үϼܳƐΝի؈̷ıѫΗ¹҅ܛΕÝHʲǢҊǼǶ͝ӤʱшΑŀʛδգƴεͶثÆٿϜޑմ֯ӜʿࠪйĮہˤϯŕӝϵΓÕĪθҕńɏٲ̆ʰʙ̀”ʂβǵМ¢Ҽ˶ƢƃА€ǼͺتĿψƚâΆԘšĮdžࠨƤȊ̉"]],encodeOffsets:[[[15893,39149]],[[9432,42200]],[[12674,47890]]]}},{type:"Feature",id:"JAM",properties:{name:"Jamaica"},geometry:{type:"Polygon",coordinates:["@@֢÷ҀȫƔɯןeʭƗҹƊӑ̪ĶȔΜÎȒƒ"],encodeOffsets:[[-79431,18935]]}},{type:"Feature",id:"JOR",properties:{name:"Jordan"},geometry:{type:"Polygon",coordinates:["@@Ʀˆपͫ࿪ࣆͺ৽Džų၅у࠸࠿ˣƛƑ˭ٙřȩ̡εʵधƆƒŨоഊo͜Ůʚ@Ԥ"],encodeOffsets:[[36399,33172]]}},{type:"Feature",id:"JPN",properties:{name:"Japan"},geometry:{type:"MultiPolygon",coordinates:[["@@ņ˽ҿԕΉːљțɝӭշʈRЊҬԆӌīΊΜؠǹ"],["@@́ڡƤсѩף੹Ѓ๏½ணॡ͔֡“غษȃষЃঝe࡞أ֗෗իΝН͜ȶݶՏʒͿ־ߐʶѲՈࡌѢ؞ָာʤ࣎ǣࢠ๺֔Б௾ࡀӌ͜ՈਈƟा΢ՎࣀƸҞୗ}ڻޥࡍbࢁ"],["@@נǵרΤȈहఝɯ݁࠱೓ָқँण]ř࠴д٨࣌²ʖ୐ʜټন࢓٤˯"]],encodeOffsets:[[[137870,34969]],[[144360,38034]],[[147365,45235]]]}},{type:"Feature",id:"KAZ",properties:{name:"Kazakhstan"},geometry:{type:"Polygon",coordinates:["@@ӕƹ્דο׹̹KɱЊ੫‚ǡێХNÚࡆ৓ؘ෷ßডũߣݶۋ͆ಥ׼ƽðᓗӹᶽљ£יچ֧ɼॕǩχ˧±ȲȶΖDž̊অ˺ϛݮҩɆ…˜ࠊāŽؘ܎ƎܼűƲࠎƭԲ࠿£܍ȴঃσ޵ǭяƌĐўՙ֘دw܉֬ӞِʕǢڢऊࡺӣŀؘჄࣴಾtᇢ׉঺ͻࢼΠ೰j੺ѥʔʠ୼—ɂЊഷ׀߮Цƿɮ߮ɔ؅ֺϬ˼Ḯ̈ШȺᑆ̴ݰΒຢǹ˄ࢉ࢚Ȳઆ˹éҝ߮´ᑌߎ̭ˁ੶٭ሠᒑ҄ѰୄӛீɎҪƯКӟטNjΨΥ઎ŒѾԣٕ֓ۥÿ¡ࡅұϝဟˢ؅ຑїȇဗͱݲลֻɓäӏԭŬу̠ఝĖඃx̧ġ஥ΞӉǧŽӹ൩̂փşȉρ"],encodeOffsets:[[72666,43281]]}},{type:"Feature",id:"KEN",properties:{name:"Kenya"},geometry:{type:"Polygon",coordinates:["@@ӾۙיͱȹΕ̿Õšףˑ͹Ǐ֑ͷ˥஻ࡀËӤᵁႌƙĢSࢺʊ;а֌̨ؔσ॰įтЉ׎ԬԈ֬ֆѨƗ@ҽ˺ˡג@੠܋ˈSȠxȄī֖ßʞΔގΚͺ˳ָAܽ॑Xᵣ"],encodeOffsets:[[41977,-878]]}},{type:"Feature",id:"KGZ",properties:{name:"Kyrgyzstan"},geometry:{type:"Polygon",coordinates:["@@ȊςքŠ൪́žӺӊǨ஦Ν̨Ģ඄wఞĕф̟Ԯūşȏ೛ғ̙ͭઁıͅ՛ࢷŒׇǏߣЇŜȟʇȓཟŵਡ˘࣫ÝĂӜࣴƕ̮ʸٖĉ੾؂঻ѸױȽإ͂۶ծʟĊ"],encodeOffsets:[[72666,43281]]}},{type:"Feature",id:"KHM",properties:{name:"Cambodia"},geometry:{type:"Polygon",coordinates:["@@΁Ѭыࢄȣ২ՠۨઘdž߀ťۚ͡Ϟׄݖ̱Ȝ֕Ļ৕ඳ٧τԙࢥÓܫͷ۱Ū"],encodeOffsets:[[105982,10888]]}},{type:"Feature",id:"KOR",properties:{name:"South Korea"},geometry:{type:"Polygon",coordinates:["@@ܨযȺխPॷ̓ҥݽljڥΏݳïĥҚƼـχ࢔ذƚֻܘÂúϒ‡͞Ϝצ¢ΨÈŨȮ"],encodeOffsets:[[131431,39539]]}},{type:"Feature",id:"CS-KM",properties:{name:"Kosovo"},geometry:{type:"Polygon",coordinates:["@@›ǣŃPĘ́ȩĐdzɦƾȌȪÒŜ˨ư²Ţşƾ¿ŌƅƒŸǎƻŢLĥȳijij„×ȉӹŻ"],encodeOffsets:[[21261,43062]]}},{type:"Feature",id:"KWT",properties:{name:"Kuwait"},geometry:{type:"Polygon",coordinates:["@@Ǭχõȓ˔هשuȽАݟĆ؞߮֠é"],encodeOffsets:[[49126,30696]]}},{type:"Feature",id:"LAO",properties:{name:"Laos"},geometry:{type:"Polygon",coordinates:["@@˚Ϝœ܆ڹܸ¿ٕࠦھٍÎǛ̉ӯyʣƨࢯԅoݬȸࢮ֧ž³ԎηʸǴ̲ܐնøȡ҄wŵ०ѦŬӮڏϖޅਚO͚ܹ՝ɗʉ̟৔ԉۦ঳Ռ݋َ׏ɄץƵ࠿ݕ̲ϝ׃ۙ͢"],encodeOffsets:[[107745,14616]]}},{type:"Feature",id:"LBN",properties:{name:"Lebanon"},geometry:{type:"Polygon",coordinates:["@@ɣ[ýƥ˫D̘ۄмעfˆϘ§Ɛͣқ̓ȷҟ"],encodeOffsets:[[36681,34077]]}},{type:"Feature",id:"LBR",properties:{name:"Liberia"},geometry:{type:"Polygon",coordinates:["@@ɗQࡽАޅٖ܏Ң֣ըȪː¬ʔϜҘϺϺǶnɖĨΘԧÇ͵ǐdzʂIǢ͸ʄsŸʓĎНǽύʖɱˊÇΤΙ~ͧăĿÝە"],encodeOffsets:[[-7897,4470]]}},{type:"Feature",id:"LBY",properties:{name:"Libya"},geometry:{type:"Polygon",coordinates:["@@ק̷ҿҤ೧βρՄڑϸϻƷ̗ҶήӹؔͬΘñՈńҠÓϦƨۈ¯϶˕ݐШȜðΠėΒ־͔ʶːЦʌ´٦দ́ΜðۮƓ૞ϓЀݛݮǍஆΙࣆйЦɔЖϮț٠˂Ф؄ЀׂŘ଒ǣ˺ϑ̺Iˌƛ࠴ıȲˣ̣ЕżΫɏԯʦڱ@Ჳ@ᶵ@့ॱGYΙ‧ྐ‧ྒࡓҟ"],encodeOffsets:[[15208,23412]]}},{type:"Feature",id:"LKA",properties:{name:"Sri Lanka"},geometry:{type:"Polygon",coordinates:["@@ų࢓ΙʇܵȓЍڜƫீϠ഼׆ұϺסО࢓"],encodeOffsets:[[83751,7704]]}},{type:"Feature",id:"LSO",properties:{name:"Lesotho"},geometry:{type:"Polygon",coordinates:["@@̆ʩʳУƛ˛ҳſƹˍ̛ċؿ٨҄ՐҖ͢ϼǠξʵ"],encodeOffsets:[[29674,-29650]]}},{type:"Feature",id:"LTU",properties:{name:"Lithuania"},geometry:{type:"Polygon",coordinates:["@@ãɊĚɲχƄࢡƨDZ۸२ʴඬÁࠜĊŞǩ҂Ã߲СĀϓۏˏșӃ࣯̓߻NȫʶљĜ"],encodeOffsets:[[23277,55632]]}},{type:"Feature",id:"LUX",properties:{name:"Luxembourg"},geometry:{type:"Polygon",coordinates:["@@ǘȏ³ρʍiȉòĞҼɖŽ"],encodeOffsets:[[6189,51332]]}},{type:"Feature",id:"LVA",properties:{name:"Latvia"},geometry:{type:"Polygon",coordinates:["@@†نЮՆߊ˼ڜعڪhNJ٤ܐƪςĻܢ̷ۚCКȕîС˒ӷ͕ࣗԛƙ߱ТҁÄŝǪࠛĉණÂ१ʳ"],encodeOffsets:[[21562,57376]]}},{type:"Feature",id:"MAR",properties:{name:"Morocco"},geometry:{type:"Polygon",coordinates:["@@ԒΥߜÎࢊȃκU͂՟ºԝ̄ࢱɜDZƷ͛ષƙϝ̵ӡñ—ثঙ͍ͩсۍɥ࠻ŷഫاRহŷ@@@p҉Ա˓ȑϡ@̥Ŋ۹ě˛ٻʿÕЁ੕ୟ࣡ˣୋ΅ϗĵ̡ቅãaD ϶͒ɮ˞ѪÃ˶̀פҴՖ˲ƊɞӬp҂̤Բ̪֔Ւ࡬f\\ц͔ްĢڎָтɠۮۮȿਸ਼͊ܢŔѶդ֨ࡈϦخΐ֘࢈˄ԪؤI"],encodeOffsets:[[-5318,36614]]}},{type:"Feature",id:"MDA",properties:{name:"Moldova"},geometry:{type:"Polygon",coordinates:["@@ȨŮ֒ĊؤʽΊϞɥÑ˵̪ƏŨΗ̊ɇÏűƾčɝ×ӷ|ĉŜǫãÒƭɱˍƥ˽ɁĝƯϦĘΪςӝԂˉΠʹʠʯĈ"],encodeOffsets:[[27259,49379]]}},{type:"Feature",id:"MDG",properties:{name:"Madagascar"},geometry:{type:"Polygon",coordinates:["@@ɠΥȺ։Ɗঢ়ɒϽĉЗƩʙ˷ӰǁʝLjثõΥɵȗ¿܅ͧওб୅ԯཧ͑ୟϛইہȣܻΡӛɊڙ̜ɳѺÇݘ̑ڠù؂Ʈ؄ϰƢD˪Дِø՚șЈǃՌãޠ̊ҺŔՒмŒҶǤ̶Ʋτ\\ӐӎۖԮʦцŗάΦĵҪ׎fԐ˦ϔ̊ί"],encodeOffsets:[[50733,-12769]]}},{type:"Feature",id:"MEX",properties:{name:"Mexico"},geometry:{type:"Polygon",coordinates:["@@͙݅ƥ؁Õ૷ąЧƤқʺЧǚٳ֎سȞӏ͢бࢾɝΐΙ݄ɾٚĎؼưՊƠՖ΂ȨӬè۸Ƣʖ֬ɚࢶȚݔ‡ԚîȬDZ…ЙҋԁȥԝƸƥűγɁٽɅɎǭcǃY̝ԓƳIJķPŭޥV޷AAӁϛC̺˫̶șĢǹƌ½s˷ઃEЙۅŢƽĭȟqʕ्ࣞџ˘ۇɖҷÓګ́чĉץɜؿDŽ޹ϬؿŠ्ϸ۱ВɃɤҹº࡯ˈΓϦࣗӊсՌȧЦ˪ĈđʈȖɔJ̄˱Ϙùͮ˭ъ݋࠴ࡋڀУԼܝ΄ƷȴŸԲѓȞӹФȽהҍæӣѸϿФ™ˀҍو̓٠^͔؇ͬ˫™ӑɴƇͿƔЕĆف̀΋خׁƒȡŸÓŎ˽Ƭ\\ǜթʮɇǴ̕Նё˨ޯʠρɸϿ²ѷКƒͶϡ̨ϑqƭΝ̱ƫJɛԞջӎ؃РїɈ„ؚŵҖЏʺֿϒŏŇɃɖԭȰӷӦÖÚΊ³̸̼ŽϜ٩׶ӱɶ̱Հ̷վϳڦͿݲॖÞ੪ĞÿǑ౔СኀףဪPژ@DΌผ@̪̕јˇԀσ˨ѭȾҥѢʩۤʥՊڒۊhפͱфֹ̄ӯӸӏȂחɾЃپʹ׮ȁ͞|"],encodeOffsets:[[-99471,26491]]}},{type:"Feature",id:"MKD",properties:{name:"Macedonia"},geometry:{type:"Polygon",coordinates:["@@ńOœǤӺżȊ˺¶ϴbтˏÒ։DžƒƑƥҕh͋ǿջõΑȴšήń˸"],encodeOffsets:[[21085,42860]]}},{type:"Feature",id:"MLI",properties:{name:"Mali"},geometry:{type:"Polygon",coordinates:["@@˰ƶƘӶˊpזɻӄǖ͖ÇŴȈ⁚^ȈךƣļЛ⋈Л⋆౾dᬼᆳᬼᆳȨϿԺʉ϶ƋV՗ठĈFካҟ֗íԭݛƃ଩ï̳̗ա՟IȿLjҥš޻ΑDžʿٳϕŗɍΙǡНŔɱȳūֻڙۡp˳ɭΣÆӥ΋ůȝŁŽάʍĥơhƷʕ٭PɷŴʼnùʱʎ¬ʢĿİdzĉ˚Ǥɐ΅ΚijɴȇȂǙvȫş˕őɱǹΫäɷɈƓ„ɕőƅAµ̮žʾí̽͘ʀǓӔԺ"],encodeOffsets:[[-12462,14968]]}},{type:"Feature",id:"MMR",properties:{name:"Myanmar"},geometry:{type:"Polygon",coordinates:["@@ӫηץ›ϥࣥΟƳО݅ՔؗΈօ̭ܵ̃ƹȪу֖ڙĪҷ_ϵ͠ދң޵Сࡷăذʴ٠˯ӼæࣸͽѤ˛৔Ʊਗ਼εۢօуॕ׳ҽöԳȠ̂ਪǫ޾څॺļ̢ӭņ׭ۆÅڰ̊ŵj׾дȦęΤȐ˺Ž࢈ڂȑϐۘ¨ЦҪ۶}Ӕજ׆׸ƱçԬ̎ƸÛ͈ӮÚˮӵξȧ|ٟ“ۙߓۭijঽࢲƔȨޛՐǍʓۣز́ζƷ؞ʔ~΍܏յdẕӓȗ"],encodeOffsets:[[101933,20672]]}},{type:"Feature",id:"MNE",properties:{name:"Montenegro"},geometry:{type:"Polygon",coordinates:["@@ÁǀηЯÊˋǫÞɽ˞εǖĢƜŬҦ˚ȜƾüɠƟŬśˠě͌ǧçïƽȋɧó"],encodeOffsets:[[20277,43521]]}},{type:"Feature",id:"MNG",properties:{name:"Mongolia"},geometry:{type:"Polygon",coordinates:["@@ࢮƢ྄ܤ౬Єܴʳ࢚]֘Ͻ࠼‰ௐɁࠈגͿӶࢊࢊश΍ނįনɍLjؿஜΛߐƺਫ਼ŌࡆōࠖЗԚѕެT੒Ƌޜȼૈƒ௸פԌĝѰ˭ৌêХهק࠽ɐ΅ӈńࠤŽ٦̴ڬˏހוğ̗ڏĦ௟ŏןʅ؝։౱͙࠷ѽࡹǞҿúѳէˎ͓ƌˣי˯׽҇গ̑ఽ‹ഫ̇এҋϋʾ৭AఓԜࠥŰૣśჃȊऑmӱԀϣޠԱĢ৩ԼଅŞুƞ̡θ͖চׅڲன̀۷Ѿəז"],encodeOffsets:[[89858,50481]]}},{type:"Feature",id:"MOZ",properties:{name:"Mozambique"},geometry:{type:"Polygon",coordinates:["@@لæ৞ʁɖńגt̚ʦԌaऀ͜ڞӤƊϕ“࠷ľ݅ಿƨЫʣ׷͙׍՗Եޏ͉ृСॉ͓ࣕƵוׯ΋ȗí׳ЌُǔӱZʣƪ¦{ࠗƋϷȤƝűΓΗ̗ۗ˳য়ҕρ̳ðΟɊÉíѵّRïϊůϖí̠ƬपɓװГஂࢬ॔ɜ؆ŶúĨӶƉʞ˜غǐ׌E੠ѥ˒ЏÔǹȼϳǰ۫gÅ̼āװᢈۘӚЕɴüͨɅ¸͵ǯϷØסոԱʲ׌ζǰíઊΙ؈̣˖̅]ɽદɾٔ"],encodeOffsets:[[35390,-11796]]}},{type:"Feature",id:"MRT",properties:{name:"Mauritania"},geometry:{type:"Polygon",coordinates:["@@և־ԗؤ֍ɞГʚҵUЧǽйð˽ˏïҐɺаŀߊģࠨĵкČмɑЎѵδǾˬᾔMǃ௎ȴќ߀øᒸ᪂©F౞Ṗ᎟౽cМ⋅М⋇ƤĻȇי⁙]ųȇ͕ÈӃǕוɼˉoƗӵ˯Ƶ"],encodeOffsets:[[-12462,14968]]}},{type:"Feature",id:"MWI",properties:{name:"Malawi"},geometry:{type:"Polygon",coordinates:["@@ɽٓɾથ̆^̤˕Κ؇îઉεǯʱ׋շԲ×עǰϸ·ͶͧɆɳûәЖѵɔʮޮ˄̈LJۢǚڼƞɪɉ܌Ѕϐ࠘ƽǜɵ˶Ϲɾଡ"],encodeOffsets:[[35390,-11796]]}},{type:"Feature",id:"MYS",properties:{name:"Malaysia"},geometry:{type:"MultiPolygon",coordinates:[["@@àћֈĶ˞ΈȘýӸԓΜ֛¶֣ęϡĆ˿Öӻ̒ɵͤݑe˳׫Éߑخ঵ښįђӟ֚ś̡۠ҜĠؔȃΤƤƮۈρ"],["@@أ˹ܯƚॱ@̅ॗ͓̇љୟۅǵߑɾЕóөщ՛Òէǟַӆƕ֘؜˽ٮǀǜ܆άǂ৖Ǻ׾ڔЬՐϦѥǮ˺В¸՜œа٪אшڀͼHќыžιֆɻ۬ʧÑ֝͡¥ƮЧ"]],encodeOffsets:[[[103502,6354]],[[121466,4586]]]}},{type:"Feature",id:"NAM",properties:{name:"Namibia"},geometry:{type:"Polygon",coordinates:["@@رٌؖ͡ȃࠊȷ،˯ಒm৒ŅҞ͛Όѡۜѳ৘ǽՆۃࠐ»٢КdžԊƞհ}ԄϝŶÐ₮˜׌Е᎞ş໴΂یȒհµͨȍPéӁȍʭC՛͍ͣΎಕ̍سƒ{Ჽࠣ‡BយA᷋ݣѕҋÕՇDŽϗÔƗάͩɰГг"],encodeOffsets:[[16738,-29262]]}},{type:"Feature",id:"NCL",properties:{name:"New Caledonia"},geometry:{type:"Polygon",coordinates:["@@ېԵѨϭ͉ȫҥɪ׹ϚէѼ։פś˶β[Һ˹φ˷ˎɻ"],encodeOffsets:[[169759,-21585]]}},{type:"Feature",id:"NER",properties:{name:"Niger"},geometry:{type:"Polygon",coordinates:["@@nּॹȐОҿպœϤâТբ̴̘ପðݜƄîԮҠ֘Eኬஈϒᝪ࿸᮪ཾ೨αӀңר̸ȸಯ̾ɓ`ˋΔ˽ǻί͕ၻ«ધੳߋγૉΔ̵CեբmčЃʁµˋƻm֩ंȟ’ځҷٱʔҍ¸ʏşӯ~ӷΧѓq৯ѢЉȵѓb̿͆ࡅ̼ࣗıɕǻşӗʋ͹ÍݣٗӚ̟E˭ʗ"],encodeOffsets:[[2207,12227]]}},{type:"Feature",id:"NGA",properties:{name:"Nigeria"},geometry:{type:"Polygon",coordinates:["@@ࢍ̡͉¬͓ȉڥl҇Ղˡ؊שֆكYݍB¶തs՘ǂՊʶʴТԴėɨǔ͸ȍӾ˪ÎݤʌͺŠӘɖǼࣘIJࡆ̻̀ͅєaЊȶৰѡєrӸΨӰ}ʐŠҎ·ٲʓڂҸȠ‘֪ँƼnͬͯğƱ«˧۽ٱɛՙšѧDZȉǝי҅ΉŽыȋ͹ÿΓֽ˱ҽΊ͇aԃӭʑQЍ߷ɍש"],encodeOffsets:[[8705,4887]]}},{type:"Feature",id:"NIC",properties:{name:"Nicaragua"},geometry:{type:"Polygon",coordinates:["@@̃ˆϽͺȁ˲Ο˄сϜĤžƒŵÚÒʾ”ŀȔŬRkЮȠrǬOǺɤʜǝĒľƺIJ̊ɴbǦĄQňȪĖ|ƜŹǚ›ȆńɄB̈ŌŜŖ˾iïă§ȉĐ̫ȗ˹ěͷυ®ɏtϙŹĉýΫÌɛǣɋ ɩźƏȩDZʛÈƓǦˉêȕʼnօɞųŇ"],encodeOffsets:[[-87769,11355]]}},{type:"Feature",id:"NLD",properties:{name:"Netherlands"},geometry:{type:"Polygon",coordinates:["@@ۦyǀ˳Ƚޓɇ́ԍ@ƘࢡҥȞՏπީǩ؛âѠɲ݀ఆଲΘ"],encodeOffsets:[[6220,54795]]}},{type:"Feature",id:"NOR",properties:{name:"Norway"},geometry:{type:"MultiPolygon",coordinates:[["@@᥆ؙઍɣऄՅෛ͵ڵû΢לઃͰಫ˵Ы؝ߟωࣗȮ઱¥णѼԉɝԷ“ūփནƊɝҵ߭Hևױ࠿झಫ஁̨˹̇ͫ࠯bձ޿¾૟՞э˥ধֻۧυӛ֝Ԫဋঁ૫ȟ୏є̛ࣚˇ኶ޞզᕠ۶ဌࢂ໤୦፺ྴඦلᘼ੊ᇎπ൪­౮ۢ໖›ພǘ"],["@@ም΅๝Ȝ׆ɐԕˎეǚͮ̿ொȍ"],["@@᪖صᑟͥұأ݅ǁЍۡৣᅵԢނ̘ఽʐ࿕܂ٷڄᘎ̜Ң̋஦\\͊˼௾ˆ੖̋"],["@@࿮̏ఝҍ᝱ı៙ƖƫɴஹdँϬᣴɼ௞ȫࡘʤᑺȽ"]],encodeOffsets:[[[28842,72894]],[[25318,79723]],[[18690,81615]],[[26059,82338]]]}},{type:"Feature",id:"NPL",properties:{name:"Nepal"},geometry:{type:"Polygon",coordinates:["@@ÝαŌՕĩͩ۩aয়Ȟ٭ĂӛђଷŊયҼ߉Ю߿͆͜޼ՒϠΒȪڪʳࡔշҾť˰ЕٶǓۀσौȕঔć"],encodeOffsets:[[90236,28546]]}},{type:"Feature",id:"NZL",properties:{name:"New Zealand"},geometry:{type:"MultiPolygon",coordinates:[["@@Ȓ΋װ;ʐΡBΝ̹ϳչإїͷ̴З٭Yܗ̓ɣջӋࡗڇϓнʇޝlխˢࣱÐƗ̰Ҍذ੐ࠦժǀ׾͌ܜѰԎѦώظ͈ɆŰҶלϴȆΧ"],["@@،ࢫlָϜɯŲًڰ˛֨ãӒ͎юĭȯݗʯӫٛjɡʭþαūƻͅҏзֹ٭ͯƟɘΕŨӞ۔˟ҨࣛͲz̦؈̌ƚ٨Ÿլͻ֜vƪБΎڋݔΗת̸àҚұٺɑʂݡ"]],encodeOffsets:[[[177173,-41901]],[[178803,-37024]]]}},{type:"Feature",id:"OMN",properties:{name:"Oman"},geometry:{type:"MultiPolygon",coordinates:[["@@ֹ̻ϟªǩȧƉэļ֗ÿĻϯFԽ̻ćХȓǯԹP͡ɃJͻПɷҩĂ֗˳ϱ³˝טٿ൴ᠾ࠾֖၂ϩתv͸ʔΐFΆϞǒƩŞèմіHϖֵҸ̧؞ŋӼƳϜӕɨ˧̞ŃCȉ̩ԃƅɽΟˏ"],["@@ʼnƳDž˺ʔ˺ľñā΍"]],encodeOffsets:[[[60274,21621]],[[57745,26518]]]}},{type:"Feature",id:"PAK",properties:{name:"Pakistan"},geometry:{type:"Polygon",coordinates:["@@تϻʞ٥൨ͻ߹۷ऩůౣȲЫα̖݁̈֩ڴгܑӟ`׳ࠃࡇՃ࡝࢝ࢡউÚऑࢡռϗĪ٧ҾэǘܝᇛD֓֕؛Ɇʣ؀٭٘໻ǁിeஃŝ̈́ঊொѢéϰГƌw݊ߥφͷԔеѶඨѕࡀŲԈŅǞȂגóદĈ܎ҶӈشCĠɼٞŌ̴ý͢ʀ±ԌΦԖ՘Ɇͥ֊ߜɴ̢•͒мΜĩмȣΤӬμࣘǮ८ĮѐƺӨĦ"],encodeOffsets:[[76962,38025]]}},{type:"Feature",id:"PAN",properties:{name:"Panama"},geometry:{type:"Polygon",coordinates:["@@˫ʎǵҒȺɢɅÎƿˤлɸοÁǝ̇ͻɁǽ‡ĉǩВҗɯŅŧŭϷ©ơԈŋƛˡ¸ǝ͸·ÈɓİέCǻĩŶªǖìǠƲŲIJǩŲK͸͘ö̠̝iDZͲ›ĀæɴȵЮÔΨɄԜǞ˺ʤҬ·‹ĉҶ…ώơ˜ʧ̈́ɵĹūȜӵǁʟ˓ÒŅС"],encodeOffsets:[[-79750,7398]]}},{type:"Feature",id:"PER",properties:{name:"Peru"},geometry:{type:"Polygon",coordinates:["@@ɥљћɋࡅӘñΈရࡊທࣾ٫԰ΏۜƐʎ܅ાࠣ༄ߍီ΅Ϥ˃ؤٷպױͼ˖ϒПߢʼךڢՎIJΓʇȧx̭ΎâͼĝΚщӆΌDŽ֤ԦܶৠͨࣸࢠʾմŝٔɢĂ֒ЉˎЅϴɏӶࢣضĿҨɞ̤ƣԎð٠Ͻթࡣʤoрҁݳ œųۍlj॥ֱÓϻɉ̇ČғԕʍBΡɛƵΔݳҲԝDZί֐µ͆҃ݐuېӸÇ౧ϢĩӄƠܪടǷ˵£ןg܍͟пƮ̵ȕ˯β۹Ջ࣡"],encodeOffsets:[[-71260,-18001]]}},{type:"Feature",id:"PHL",properties:{name:"Philippines"},geometry:{type:"MultiPolygon",coordinates:[["@@Đ֏ºҽ˹ޑ̫ࡨϽэˎإʉϿ঩Ӧɿ؊ʰЎՑЈˁΑЃثҵƑʖ͢۾ՌʀҜ̈́̔ϝٔɰƎϒרv·ٰڼЋêхÐ̱"],["@@̟ˡˁՍ˃ʝԫ׈ǦɤɂɾĢԸҨ¸Ɖ֣جߺāߡ"],["@@ૣߕЬט؈԰Ԏ׊Ѱ࠲Ʈۅևҧѳֿ"],["@@Ԏʹ՘BgΗϳΣՕʧ‡ϸÒєŽА"],["@@ʀभ٫ɞj˭ȶԯЍȋ•עʧªƁԘӶãY͈ԣٜ߮mɴ̻"],["@@ɟܩέоѓ٘ܚ‰̡̈"],["@@ԮʉʶɖüɇƍΑ˼׻ɛۥӷ˥ƁڳȊڝѾġϊIJਾүăҙ˜ȫēϯٻЮ̵Ѵɍ̯՗ԊރůлȆ¨ΎˀɊʣȘŇ̡бӚűμߨͺˡĔೄ˜ހԘA"]],encodeOffsets:[[[129410,8617]],[[126959,10526]],[[121349,9540]],[[124809,12178]],[[128515,12455]],[[124445,13384]],[[124234,18949]]]}},{type:"Feature",id:"PNG",properties:{name:"Papua New Guinea"},geometry:{type:"MultiPolygon",coordinates:[["@@ɽčε͔ρՔǷ٘ŜĆĜʡʬȏРՑЈ˵ŝɽ"],["@@ѯçƃɽҟȱћȟѽBۏʔӑɺêʺݬũҠàŶЖŦrĆѽӐÜʂ˼Ҹ̚ġӸԌfǜƏgү˯ԡ"],["@@ݤտղࢻӖ„‘ω٬ƛʥǁࣀΝġʏ֋ÏȷɔܟĦࡕŴٷ՚ӉҦѧ݀ભπ܇ʇԡˣńإڇ˿һƖࢅ–aᩒaᩒภ׃༊ӓׄїҴхŸӵඔԱȲѽޛěȄ֕"],["@@ʿɡǁӸȝ͘ϝ˞ӍΪ؇ʚɺȮҒɻ˸ȁΜȫʹΛ͊ˏĶѧ"]],encodeOffsets:[[[159622,-6983]],[[155631,-5609]],[[150725,-7565]],[[156816,-4607]]]}},{type:"Feature",id:"POL",properties:{name:"Poland"},geometry:{type:"Polygon",coordinates:["@@·՜à̂ȹ̧҆̚ɺɤȝђָʘ಼ϴ੒˴࠼ƙÚȱ߸Yਚħ໶^њěȬʵšωɸ͋KͯԋǡʸϳfϏцܻěɽзįރۥɒϗǿ¶ߙ͔؁šЇĒӹǵч̖Ήŕ³¼ϭаر¼ăˀֻĦűɑҗǨÀɴػòЉ˔"],encodeOffsets:[[15378,52334]]}},{type:"Feature",id:"PRI",properties:{name:"Puerto Rico"},geometry:{type:"Polygon",coordinates:["@@јõưǕɋɃمLӫ‡·άŢŬیK"],encodeOffsets:[[-67873,18960]]}},{type:"Feature",id:"PRK",properties:{name:"North Korea"},geometry:{type:"Polygon",coordinates:["@@Şƥ͉ºη˵ʣ˷Ž׽ѣȅƫƧ̓ʝ֓ƏηɥηįġͰƋӈσŧȭΧÇץ¡͝ϛϑˆÁùСdžĵƿʙé‡ǀɑüɥƆɰφȤİõƶɆҒÅƎөĠЇɤۄբऒҌ־׮Ўˁܪ‹ſѺಚβͰҼժӹ"],encodeOffsets:[[133776,43413]]}},{type:"Feature",id:"PRT",properties:{name:"Portugal"},geometry:{type:"Polygon",coordinates:["@@̦Ɉ΄ŬɂЫӺDƞłӪ‡ɼуϱɩYٽƍū‘Їγçʹԋɵտ̄ʡřɫ̵̿ê˥ͷɓѷŠџġŸڂÿԬϓþȩ͈äռͰ̨ÒͼǪԎkΤǙ̠™˲"],encodeOffsets:[[-9251,42886]]}},{type:"Feature",id:"PRY",properties:{name:"Paraguay"},geometry:{type:"Polygon",coordinates:["@@ͦ৖tҌЖ݌าʔޮ]޴їbʵʞҳÇଛࢲLJ΄ǐ֦ɩǀʣþޓİ͓̼›̀ƌ̢ƳAҥŕӻǑӛƍݏށ١ړƇऻŸࡑɮࠢ౨ťψࡽ͢ਅبۉŸ໵ൌ"],encodeOffsets:[[-64189,-22783]]}},{type:"Feature",id:"QAT",properties:{name:"Qatar"},geometry:{type:"Polygon",coordinates:["@@ÇؔɨѲɰĜʬˁdӯǽӳɵÑʫǖ"],encodeOffsets:[[52030,25349]]}},{type:"Feature",id:"ROU",properties:{name:"Romania"},geometry:{type:"Polygon",coordinates:["@@δǶԴġՠGϸȳ˺źبĄɄȠΠ@ʰćʺʟˊΟӞԁ€ρėΩưϥϒƹЂƊϠƟpɏПǹʯĀɻ৥ӳĖ̪ؑফțзɋ௽¬٥ƀ͙ÕʍΊƵƦȚƘȷŀ˃ȋөʔßΌԟȢĥˌҕͤڪǂԖ֮Њ֬ԢǮ"],encodeOffsets:[[23256,49032]]}},{type:"Feature",id:"RUS",properties:{name:"Russia"},geometry:{type:"MultiPolygon",coordinates:[["@@ࡌ๫కˤԫ்ࠌࡳyוُԒսٱƻ۸Ĥࠊħ࣢Țٌš૴ӯࠜôରަϮͭϴϐŠɔ։̆ߵuࠟΎࡑ"],["@@໵]ਙĨȒτ୊˚ࢢƧψƃęɱäɉ"],["@@֦Ƚțؐᗸű࿨޻࠭λ൛ēsࠑͳǩ޽~ٗ̊ૣʖȉθ࡟Ǝॗʼnҗ̎Ǽ̸৓ȥϚЃӉΣ@„Ꮪٛᔺ࠳ïԷ"],["@@ः©ƭˌੲΖ@ַ"],["@@ળ»@ָň–܈E௒ʉïŗࡽȩ"],["@@ౡMႣĤƧ¬ߘͪੀþஞ͏ĸə"],["@@ॿͩഉø༛ͨȪ˖༨ųᑔɗ"],["@@ډرᶽzඃȣမղҎ׀૎ǂᕞ™ᴬѽ"],["@@ӹóᩣŊɟώູɦūҒ࡮Ƕ…Ҟသܒޙĺ፨݆ɩϢሤѺ᪪բ᫠ǀ෴̸࿐Ŋאͩ֟ʻᲗз᢭Џᤙߝఫࠍ೉߱Ǡۥྎۏ"],["@@ɨгސȲឤYቈЧڬ̿ȽѧङʝᕅүفʟਬşఖɃݴDŽєաτɔഊƂ᧪ƑȴϽ↲ů´ٜᄼƥഄLബѷϮ՝ӹΙੌڋ೔Ϳ߸ࢦഖϙ෢ɦྼʵؤʀൖş؅ޮૐζ䢀ձܐӿᔲٛ₎DŽာƑ۪΍Ĺؙਜʇ૴Ǥ๰vཚǑཪĢะݛਪˎڷ՞ϐώᧆɻფºᝂБ୲ν@”MKઇσઝÖݶҁԄەϲɧĮΏɑɝ༧Ǿ᚝مݛĭ౽ן௛ԧ̱ϣய׊ᔗڇϣ̸ߵΫ૱Ř˓ց৙߽Šͻड़ȋő௣ޭ‹Ϋ۱Δα฽ѕ̅ॡభȳʥ࡟ே޳ׂ̳έ௬ҵለИ୘܀ԆªϾರȊຊ੒คࡺຢڢڮஆ৷ëԍۗᒉइۍਖᓧ˷ᑃටۚԧሙɕಝēÔ؊ಯŶ਩ЭᢵƠ᪏ʟᨩ࿛ủጝ೚ŁаՃࠄȅ՞оईÃௌऍ†܍ځ࠽ë্ϛഉ్௓˯ׇଙ঑ଇॻթӹ૩ӱՉYՇФૻؙſ˩ŝƦKѐіxŦ঴ɛܚܞ̒৶Ʃ֢ࠈ˾ऄ͚̮Ѵݲ൷ʛܯͧ౧Dͻ߄হװหˎ̵ࠖ̉Ԫ̿βԯࡐ̲݇షʢ૛uਯƱۛлҤȥXҩұˑݷࢻRσஅՍ৙̈́োéѯˮԋĞ௷ףેƑޛȻੑƌޫSԙіࠕИࡅŎ੝ŋߏƹ஛ΜLJـধɎށİवΎࢉࢉ΀ӵࠇב௏ɂ࠻Š֗Ͼ࢙^ܳʴ౫Ѓྃܣࢭơ͡çѽԤઍőΧΦחnjЙӠҩưிɍୃӜ҃ѯሟᒒੵٮ̮˂ᑋߍ߭³êҞઅ˺࢙ȱ˃ࢊມǺݯΑᑅ̳Чȹḭ̇ϫ˻؆ֹ߭ɓǀɭ߭ХസֿɁЉ୻˜ʓʟ੹Ѧ೯iࢻΟহͼᇡ׊ಽsჃࣳĿؗࡹӤڡउʖǡӝُ܊֫ذx՚֗ďѝѐƋϥӽ߿Ƒ࠳ࢁކߕĉ֣ࣼফԇ͹ƝɇωÌֿԚɿ†ՅȚʳΈ޵ǮԙƁƥƼଥЖఅƌ܃ƞĹıੱ܂य़̈́ܩӴؒƈۤ۰ҹͪఌ΄uȀݯƉ‚ώѠɼ߼ÖƄ˪ȅҪ΀ѰWʚఉ˚ӭUԯЀ١ƃ੩̐lǒ̗θڟ¤éʼɀǞ՝ӈࢋąʭ¦Ƀȑ̽”ȷ՞ȟ˨NJĀڴ‡͞Ȁʍɢ֥ƪ¼Ʋ΁ƴՃվǸɨĉЂࠑȨѱijšȼࢭɂˑӸíТЙȖάˊʝ޶װӞųƤक़ҬࢡЎᅢ੶ޮӠ͂єగּΆնݳش֢ܜ঍ग़ޢي౿֔ŬךڶüොͶࢀ̈൦ԕᘨȧṺो٤ЋÆ֓टѳ൏ɡ⏷ٔ؟Ńൌ؛ÂϵÆ࡫ઌʯڂɓňРԑΰ՘͈᎖Թ۾Ȳ֣؜ዦࠖޢµ޸̋Ӫ׀۫ԄЪԊءԶᚠˑӔҹ੡ĻNҳڌ˽ಜǼȶ՚ჶАᰪܞي£ࠣԙਬĕ׼˼༾xఢΐफ़ԏॖ֌ࢡӢѪˤ២ʫ୒ʿᴾॣ֚ѰࡡѺ{ǴৣĈˢЌ҅ټ}ː༄ݾրކزǒᕮɛǬұߕڽԺˋ˒חȏଵऒԧέ֕࿫஝०ŭ̢ͮऎɎɞжܮЎөӌϼֈࣿêȫҲڢࡈણۆຒ֦șװмnѴүͧ߷࣐Ƶϥ؄ඤͦლ¬༈ӏݛ۪ċࣆศǞ፾™ᆘŌہѮংւॲx࿎иᕠŐ˪ɲᕂþیȋሴҀ໲aɶδߤΨጤΈ෸˗ଥȷበŹ"],["@@ⵙ͕ໞીےĦقÃᒈӋʟͿ"],["@@૽ōݱÛśƏঙƑ࣫ȦӐʾል~࿞ƶ౨XǢɧӘȬߊƐఞǿ͗ŷ"],["@@ᆳĿᚉʎඅ͎٣׾଩ǔᔆָᆎȎ࿌чኬ߻ȹݯ"]],encodeOffsets:[[[147096,51966]],[[23277,55632]],[[-179214,68183]],[[184320,72533]],[[-182982,72595]],[[147051,74970]],[[154350,76887]],[[148569,77377]],[[58917,72418]],[[109538,78822]],[[107598,80187]],[[52364,82481]],[[102339,80775]]]}},{type:"Feature",id:"RWA",properties:{name:"Rwanda"},geometry:{type:"Polygon",coordinates:["@@ͬӃµӵʏŁѿÆʱӍԛàþҠŘތԄʎɺȰďԈʸ"],encodeOffsets:[[31150,-1161]]}},{type:"Feature",id:"ESH",properties:{name:"Western Sahara"},geometry:{type:"Polygon",coordinates:["@@oҊŸ@@ÉeNjEౝ᪁ª‚ᒷ޿÷ȳћDŽ்ᾓNǽ˫˜΢bCቆäĶ̢ΆϘˤୌୠ࣢Ђ੖ˀÖ˜ټۺĜ̦ʼnϢ@˔ȒԲ‚"],encodeOffsets:[[-9005,27772]]}},{type:"Feature",id:"SAU",properties:{name:"Saudi Arabia"},geometry:{type:"Polygon",coordinates:["@@ʼnΪʩʨÝͲѡ̞҃۴ʁۆׇ׀ϑƐ֋ߠīא–ӾӕञϿ͠ґǨˡӖ°ȎɹѦʕȊ͝زԟڴѓ־лIžҦœ̌ļͲनƅζʶȪ̢ٚŚƒˮˤƜ࠷ࡀ၆фdžŴৢɩబיᛎၕ༠ãݠąȾЏתv͠ܥаȓƠִ̏Λ¼΍ċ˩ł˯ʎɽŐ˟ŲȵʬǕɶÒdž͍Žș࡙͐ᡌщǞDzϪש֕၁ᠽ࠽ᝑ͑޷ϙ׻ࢥϹƕɁˬ͏§߻ĎƷČॹmɫùΉɔɝЭĒΟρˋ"],encodeOffsets:[[43807,16741]]}},{type:"Feature",id:"SDN",properties:{name:"Sudan"},geometry:{type:"Polygon",coordinates:["@@śhdмĵ̀џͨĵ؄ĶبϳÌÍȇԍ©Ȭʕðԍңңл؅џđ۹Ӫͅǥđʓџǃ…ǥ࠵@řǦ؃†̡ƝɳîѝӬƟɲ؃ŗɱϵɏݣ˿ǁʳğå ̅ʎÃʼƌΔE΄ӛՀĩάZȰ̱ʜUӦǭ͖̍µĎ̰ɒΖħΐˢʴǫȞɞ԰ϨئܦÏ¥ ZΚॲH@း@Ὂ@ῼ@˔ࠗȁƳŪࡻ্̰͌ȷҠ̳ыӑأƏ˅ʳĉ֑α௿ĚͳƅܟͿࠟԓзέٛč΃Љɽʝ࢟Dij"],encodeOffsets:[[34779,9692]]}},{type:"Feature",id:"SDS",properties:{name:"South Sudan"},geometry:{type:"Polygon",coordinates:["@@Xٽűʯѿq˷ӏԨÑюХƨͳϦșӼࣳ֫օԫԇԫϭסFگȟՕȊ΋ɭ݉֐ȥάҵDZϱÆɣƕϗĸԗۚƉˊعͪɅԌΕζ֟ѬS˘ҡͼ֯͠ʴĠ̀ǂɐݤɲ϶؄ŘƠɱўӫɴí̢ƞ؄…Śǥ࠶@†ǦѠDŽĒʔ͆ǦۺөѠĒм؆ҤҤïԎȫʖԎªÎȈϴËĵاĶ؃ѠͧĶ˿cлŜg"],encodeOffsets:[[34779,9692]]}},{type:"Feature",id:"SEN",properties:{name:"Senegal"},geometry:{type:"Polygon",coordinates:["@@΍ٺн̚φDŽРמȦќ˾ːкïШǾҶVДʙ֎ɝԘأֈֽžԹǔӓ̾ɿî͗ʽŧ³қâÙģȃk׿ȲЛV༇–ɥħ˥‚ѻƋƏ٢ވkȬŞƮR̸ȘήǯκcζȌǝʐˡƙʻJͧȸˉ_ȍȥࣵy"],encodeOffsets:[[-17114,13922]]}},{type:"Feature",id:"SLB",properties:{name:"Solomon Islands"},geometry:{type:"MultiPolygon",coordinates:[["@@ɾ˿חN͉ԬԈȯǜ‰"],["@@͝mԧĎǫżÀͮֈƁ˜ǭƎə"],["@@ųƹحܰǫԈ˺@̠ڥʹЗ"],["@@–ǛڅΦҟ̠̿˪ŰĐϮȫېϭȢˉ"],["@@Ǘ³οȒ·Ί¨ƖԈΡͰ˛"]],encodeOffsets:[[[166010,-10734]],[[164713,-10109]],[[165561,-9830]],[[163713,-8537]],[[161320,-7524]]]}},{type:"Feature",id:"SLE",properties:{name:"Sierra Leone"},geometry:{type:"Polygon",coordinates:["@@ɧØ؁ͺѩ҈Ƨ̬Ĺت҆τĬɺƞǸɶpȜǂڦCɺ̛ǼˁʓƈɗṶɴ´ϹϹϛҗ«ʓȩˏ"],encodeOffsets:[[-11713,6949]]}},{type:"Feature",id:"SLV",properties:{name:"El Salvador"},geometry:{type:"Polygon",coordinates:["@@ġȡӡ^̡Ą΍ǘұÀʃǶ~Ů˾ɄǀĢ«IJȠ¾ʜëǸǙʪƇŒœτĴǤÑŘĝÏͳ"],encodeOffsets:[[-89900,13706]]}},{type:"Feature",id:"-99",properties:{name:"Somaliland"},geometry:{type:"Polygon",coordinates:["@@ϛԩד۫۹Mᩧা͍̜̳К̳ҨǾ̖̲҈˚ƹǒΏϜΗкGߊɌࣴĴ݌ʼиÆ̚ƶӎˆKaE΋Aࡑ@ѫ"], +encodeOffsets:[[50113,9679]]}},{type:"Feature",id:"SOM",properties:{name:"Somalia"},geometry:{type:"Polygon",coordinates:["@@ѼĎЊ˾͈FpɵýӧHѳǯ̣ʁࣥЙयԱ੷ܝ௷ܓवধ଩ࡁڹష࠯޳ٕँৱȗѷȍȣӽۚWᵤܾ॒ɰˆբfݠפબšᛜᡄה۬ϜԪ@ѬBࡒFΌLbːhϰŰ"],encodeOffsets:[[50923,11857]]}},{type:"Feature",id:"SRB",properties:{name:"Republic of Serbia"},geometry:{type:"Polygon",coordinates:["@@Ԡȡà΋Ӫʓ˄ȌȸĿșƗƶƥȷȏø̫Тγ͋ʿƗˋĞijƑšϳa˹µƒØĴĴĦȴšKǍƼƑ ŋƆƽÀšŠƯ±ś˧ȩÑèð͋Ǩ˟ĜūŜɟƠȢšŬЄЛ͔ɀτ̥Ë͔́ˉʈȱ͘٢ɚԾ™ҖͣĦˋ"],encodeOffsets:[[21376,46507]]}},{type:"Feature",id:"SUR",properties:{name:"Suriname"},geometry:{type:"Polygon",coordinates:["@@৔ǙĞưڶÔࣚɥѩܟâֹͤӽƥίóϩɉΛӓDzЇđ͹öčʏƘǗ÷ǡҙèԡܴōӄˏBωؐƺѠ¯ȤԜɖƈݲ"],encodeOffsets:[[-58518,6117]]}},{type:"Feature",id:"SVK",properties:{name:"Slovakia"},geometry:{type:"Polygon",coordinates:["@@´»ΊŖш̕ӺǶЈđ؂Ţߚ͓ɷɓǏ͹dzđ࣑ʮ˟»ȟȡЁĿěÄХŽͭ}ãǙ۷Ļ̱ĠёɌċ̆äńŢȂόa˺ĔxþLj¢ÆȒȖ˜žưʢD"],encodeOffsets:[[19306,50685]]}},{type:"Feature",id:"SVN",properties:{name:"Slovenia"},geometry:{type:"Polygon",coordinates:["@@ۜÝъȐܾtLjƘƘUǎ˳ڝɟć͹̇đHɻͣh˷ƎƷƙב†ȈúȫΨĞа"],encodeOffsets:[[14138,47626]]}},{type:"Feature",id:"SWE",properties:{name:"Sweden"},geometry:{type:"Polygon",coordinates:["@@ࠁוƀԥ೹ڭྱܡؓஃײףߦүޗॅ࢑ȝ͍තӋ޿৳ĆӅڗঃˉߐ۳॔ٓஐφӜּۨ˦ন՝ю½ૠղ߀࠰ä̧ͬ˺ಬஂࡀञֈײ߮GɞҶཔƉŬքԸ”૪Щ಼ֱv಑˴͛ฃʃ"],encodeOffsets:[[22716,67302]]}},{type:"Feature",id:"SWZ",properties:{name:"Swaziland"},geometry:{type:"Polygon",coordinates:["@@ǡύӭěԅҖS̄ɰ̀ĂʔʐÒшƵŰϕðω"],encodeOffsets:[[32842,-27375]]}},{type:"Feature",id:"SYR",properties:{name:"Syria"},geometry:{type:"Polygon",coordinates:["@@࿩ࣅऩͬgNŖŶ_ΈȸҠҜ̈́Əͤϗ¨ÿٞȶΌɤȀɤȀ°Ҹ˞Ǐऎɺ҂ƿۖFॴ̀Ґaक़žїԽҡȹĂؗͅ৫ᇵ࢓"],encodeOffsets:[[39724,34180]]}},{type:"Feature",id:"TCD",properties:{name:"Chad"},geometry:{type:"Polygon",coordinates:["@@ĎЄաnDզΓ̶δ૊ੴߌ¬ન͖ၼǼΰΓ˾_ˌ̽ɔȷರࡔҠ…ྑ…ྏ¦ ܥÐϧإɝԯǬȝˡʳĨΏɑΕč̯̎¶Ǯ͕Vӥ̲ʛYȯՏƛэͽ؉ࣹ߅ϳ߹¾ʁûĊ̏ѫ̋Σ͟੓͏ȽȐƓhƹɍۛÙƀɪ˅ׄşΐλƜӷӪǼІϦċʂÐҸSқކŒ֐É֐ͭՠ"],encodeOffsets:[[14844,13169]]}},{type:"Feature",id:"TGO",properties:{name:"Togo"},geometry:{type:"Polygon",coordinates:["@@ڱdzȇ̎ɡՔãкȆݴɁ̬ăڎD؎ΕѠÖˀ݂kŅѵʲʝ̈̋ŽЭǜǥኝȺׅ"],encodeOffsets:[[1911,6290]]}},{type:"Feature",id:"THA",properties:{name:"Thailand"},geometry:{type:"Polygon",coordinates:["@@ݭϬܗeŬڈ݉Káऋґ௯˙ݏÌ؋ն΀ދưܭҶӓԚĭѤѧ˝·ևĵßќۇςƣƭͧ͒ƝжҁӄПЌƏӳǃҲĠԾʚ߬ТࡸҤ޶͟ތ`϶ĩҸ֕ښȩф̄ƺ̮ܶ·ֆՓؘН݆ΠƴϦࣦצœӬθӔȘθʷ´ԍ֨ȷࢭpݫࢰԆʤƧӰzǜَ̊ÍٖڽÀࠥںܷ›܅˙ϛ޿ŦગDž՟ۧȤ১"],encodeOffsets:[[105047,12480]]}},{type:"Feature",id:"TJK",properties:{name:"Tajikistan"},geometry:{type:"Polygon",coordinates:["@@̭ʷࣳƖāӛ࣬Þਢ˗འŶɈާˠĐԜȓ‡͛ŴӍࡿBׁØԻϕύĉ̉ǯͩˠþ۸ʩ¢ĞʲғȐα̇ė͹Żūԇj˕ϩ˯nj؋ˑʱĺӀࡘǹض؟ȨɔφۮŸЌҬˌբ૲ȜǩϵŤɹΎv"],encodeOffsets:[[72719,41211]]}},{type:"Feature",id:"TKM",properties:{name:"Turkmenistan"},geometry:{type:"Polygon",coordinates:["@@ñۼطŠॣݔڣĠगюׯþσƽ֙|ׯӓ݇NjƻרŪ࢞ٽ˶Ɏֺ֏¸Ȇ۾ߊȵ݈ˎؓԎʉӔڱɋď؛ʿհψ˨ॖǪ֨ɻךڅњ¤ॆ\\Əцܖ̂۾ӦଆѹĜڡ͐ǣࣦžˮƳаࡽ०ׇոЃ࢞Щ૤Ϋwԥʩ€Ѕɤſ̙۽NjǙڥӁʭڏŵǫϟهŏࡩ͈"],encodeOffsets:[[62680,36506]]}},{type:"Feature",id:"TLS",properties:{name:"East Timor"},geometry:{type:"Polygon",coordinates:["@@IJȤܢȌז†ˀŀ͆Ľ̯ɫ࢕ο۳ʋeʬďǔ"],encodeOffsets:[[127968,-9106]]}},{type:"Feature",id:"TTO",properties:{name:"Trinidad and Tobago"},geometry:{type:"Polygon",coordinates:["@@ӚŊǮ‡‘صۭġƯúʒɲiͪ"],encodeOffsets:[[-63160,11019]]}},{type:"Feature",id:"TUN",properties:{name:"Tunisia"},geometry:{type:"Polygon",coordinates:["@@ΩພԭͺQȰۉԄóنԮҶȢۚƃߠǠќࣶͺךĵ}ы܊̲ÒljпЫMϱ̆ȽōܫփхDŽқѤaɄЍ͊ſ³٥Хʋʵˏֽ͓ĘΑïΟЧț"],encodeOffsets:[[9710,31035]]}},{type:"Feature",id:"TUR",properties:{name:"Turkey"},geometry:{type:"MultiPolygon",coordinates:[["@@஺͗ঐżܤõলѬࣆ¢ߴЭƜ̑ăУزȻͨʕֻʇˀ५ǏʻҠڧЕƙ̏Ɋ঍ňίŽॗŽҏbॳ̿ەEҁǀऍɹ˝ǐ¯ҷɣǿɣǿ̱Ϡ͈͂ԟí۱ȖֿәౣĥڹҊࣟ†ȗΑׇij߻҄ࣻeӽ࠶ؗҰЦٸՓВठߨಒ’Μྀٔŏ৞հ঒ʄർlุף"],["@@۫ҏ˃Ϻ\\ǦȦĦʺՂХɞࡦ˄ܤőĴ͓ܼ˓Ƶȵি±Ωʷ"]],encodeOffsets:[[[37800,42328]],[[27845,41668]]]}},{type:"Feature",id:"TZA",properties:{name:"United Republic of Tanzania"},geometry:{type:"Polygon",coordinates:["@@ƚġᵂႋÌӣ஼࠿ϱਙ¸Ӊՠ̩~ɓɳԓ¶ʭÇГ̌Ճΐ̰ࠡǿڝӣࣿ͛ԋb̙ʥבsɕŃঢ়ʂكåɽଢ˵ϺǛɶࠗƾӉʨՕƘͯƘΗɈґ੖ӣҺǗӤČѨƯޞΎ ̨̦͜ѬȺǮS˘ǷȐ·ͨʐł¶Ӷͫӄ̎Ķऄ[ႎà"],encodeOffsets:[[34718,-972]]}},{type:"Feature",id:"UGA",properties:{name:"Uganda"},geometry:{type:"Polygon",coordinates:["@@ः\\̍ĵԇʷȯĐPوȜ͎²ڬǰϸ͎Ѭ͔ɠ˒̘͵Ŗ¼চΌɮՖȉڰȠעEԬϮЊ׍İсτ९̧ؓЯ֋ʉͽTࢹႍß"],encodeOffsets:[[32631,-1052]]}},{type:"Feature",id:"UKR",properties:{name:"Ukraine"},geometry:{type:"Polygon",coordinates:["@@̾“ɄȒʮ¥ࢌĆ՞Ӈȿǝêʻڠ£̘ηkǑ੪̏٢Ƅ԰ϿӮVఊ˙XʙͿѯȆҩƃ˩߻Õџɻύڡã֑˕޽«ܣ̻¸ԹЪȭࡨ¼Ǐ̛ँơଛӟұǠȄЂࣽʘƨLjߪ˪ʑȔಯɆË̼ީĻ̷ҧٱةϟƠЁƉϑƺɂĞƦ˾ɲˎÑƮǬäĊśӸ{ɞØƽĎÐŲ̉ɈŧΘ̩ƐÒ˶ϝɦΉŽأʾ֑ĉȧŭΟ@Ƀȟاă˹ŹϷȴ՟HԳĢγǵÍɤұɮǐͺɸɔȀµɑϘބۦиİĜɾхܼДҢɪٲnࡖßबȫڎi͂ŧ̀Ʀɚȝݸ¢ͮąÄцʶȂܞº"],encodeOffsets:[[32549,53353]]}},{type:"Feature",id:"URY",properties:{name:"Uruguay"},geometry:{type:"Polygon",coordinates:["@@ղĚࡆٯ̺|ࡺ՟ڈҫӠֱχЉɸӇεՇॉұاǚғěޥΰ֫ԟҬÞլǾȈS࠸ɤࡺȾڦ"],encodeOffsets:[[-59008,-30941]]}},{type:"Feature",id:"USA",properties:{name:"United States of America"},geometry:{type:"MultiPolygon",coordinates:[["@@ũƕȽŤ|ɾƓ̨¦ĤƤƎÍǔ¸þÜe͐ƙƬñƌőɊ̍q¯͟ǵˏſ"],["@@˭ÑƟǮīèQÀĈî̘āɘŹëĵ"],["@@ĝ҉|Úĸа•"],["@@­µÓŻˆŃȒ’ɤŚêÃʐ˥"],["@@ıĉ˱ƴªÖŸĈȘijȝ"],["@@Ƭңʼƛז½࡬ƅࠂʹڼŊਖɓ˞Tݨʄ߂̧ࠒ͗ں˩ٶˏĈəȢĉ½ĉɦǎĔ¦ȣǜƅɴ@ŬĹĽƫ࢖ЁǶށǚܳʗӹЁҥȁ̍mēĦť˸Ɓɂ@ঊ҆ࡾƀસмfĐ÷ʰƉǒϜƆࠜHޘAˎ͞ŀàࢶ؄ϜƸ౦N໾BĎȺː¦Φž̖Ϣʲٺٚي˨ə֜ƜώʏAଧռӅƢ˝࣋Пࡷ̃ࢱʝѻӿƛȋSѽˤѽΒsė̬ʦȇãʇ֥ƋЗhةƥλ¥ӥ¥۫ʏఀǂʠǃ୳ʥ՗C|ĺʭɷʚǹ׽ؑ٧×Ɏȁª˟ɀǪҍȼƭ^ͅˏ͛ҿڡûʺֲѕ͎įۦljεǴՑևƀׂ˓˜ߛʊÍĖ̃ŠࡁՕدࢇʝցӱнÁэ̱ţ˭इձӁЍЅӽŻׯƪ׍ˬܗώשLεЊঅ֥—͛ȿԡʣŃЯĺƁς͋ȖѻܢϹٞű͢Ǥ֐ɽҦٻ۲͟źࡑϡƭ¦СϼՃȺोŁݗĤٙÍΏſƲɟaͽǴǓLJō̵Ů́ǃ؍€طѺܻĿ؏ȚԹÏۻȝއح࠳γҝБȕϗUׅ¨ЕDŽ˹͝{׭ȂٽʺɽЄȁטӷӐ̃ӰуֺףͲۉgՉڑۣʦѡʪȽҦ˧Ѯӿτїˈ̩̖ป@C΋ڗ@ဩOቿפ౓ТĀǒ੩ĝॕÝƙіխӚϻĴğʌһ¦̝ɪޭĊɉƌĹҢࠁࡊ۩ୠˆȚχˤٯ۴řۆ҃ҞȀۢ…ܜˍ٢͠ߊĸނĺނƱૼˇܘʓ϶ĸǐ௒˷҂ߋȺɜƇې˷ێᛸ@᠂@ࠜ@ᢢ@៚@ᡀ@ᡄ@᭰@ᮞBაAF͔˴J"],["@@࠽͋ѕɐŽЀބ̘҆Ÿ֐ÉΤʻܫЍ"],["@@ԧŽսƾԛɮࠦƞښùĂ͑"],["@@԰DžԾĒڸɛ࠲őéĝُDZٕǾ͋Ʋݍµȧôº̈́"],["@@؊ϛώnjහ»¹ȕ౾ƛࡨČᄚ˅ྤā٨ʼn૦Ǝౢʧࣲŝ@@MᷱIⷍࠠ{ࠌɵהρݜցࠈҺࡈ˖Ҁѡ֤·ޒϙՂ׽࡮य़ේ՗xՋұЙҥ͂ݍˌʃܺએںҍߎ߯Ä೷rটʌ჉ࢎߩDŽ฽̜୑í࿻ϬৃΨटǯǦ׏ҫÁঁǫ݉˱झdzťӶϚࠚࣀʶɱɂੱҵֵ֑௅ױؚСߏ׿ࣗΗࡁʱȻωಽѡ˅ϿছΫֽÞ޷ɻ࡝˹ۧ˫෹ʉſƘऀϾࠔʸࣆҠਬĨвΈ୘ԊȈǚب̒ƢْђӸॹʫ˓Ơҕ̧շюɧ̝̽м࠿ͳԩBïԄƲ̮ե̚થLJ܁ЀַȬIӈ٩Ϊ͘ӘۆҸ̚њںÖ־ƇڴМ؎ï٘ʼƻϨҹưج͖ԩWࢻǽʯȃڏȄஏĥ௷ȬΛ͸੟Ӧ୾ΘመШ۔@ŕнᄢŽڽԶਕ͌ױр߫ΨଽˈҺѲ๰‚ਗ਼ϦȨФ࡬ЎࠊĪཪώޜÉಐ҄ౚǭ"]],encodeOffsets:[[[-159275,19542]],[[-159825,21140]],[[-160520,21686]],[[-161436,21834]],[[-163169,22510]],[[-97093,50575]],[[-156678,58487]],[[-169553,61348]],[[-175853,65314]],[[-158789,72856]]]}},{type:"Feature",id:"UZB",properties:{name:"Uzbekistan"},geometry:{type:"Polygon",coordinates:["@@xԦૣά࢝ЪշЄ॥׈Яࡾ˭ƴࣥ͏ǤěڢଅѺ۽ӥܕ́Ɛхॅ[ᶾᓘӺƾïದ׻یͅߤݵঢŪ෸à৔ؗÙࡅЦMǢۍ੬ɲЉ̺Lπ׺૎הӖƺʠĉ۵խئ́ײȾ়ѷ੽؁ٕĊ΍uţɺǪ϶૱țˋաЋҫۭ ɓυؠȧǺصҿࡗهǰҳN"],encodeOffsets:[[68116,38260]]}},{type:"Feature",id:"VEN",properties:{name:"Venezuela"},geometry:{type:"Polygon",coordinates:["@@yȣӱĭ˜ϡYѭυӥ͆ڙδÆȌ؈ʻ̒§َਸ਼΀řІ̎ˆ̞ןל_մҵ˧ݮQ࣌ĔӖϕٞĻҼʾXɄਨ¼৖\\܉ʛ˼Їڦ×ِЯƆڧѬn͢ȣڕӱó̫˾̷ȽƽԫƉjϱɫɱّ֪Őʁ̭͍ऱ̽׿Žʏȣڛɀثņƿýϔɑ‘֝ŜՉ܆ï°ǭ׷ʅĭΣΉƏسȝNjʱٷÅҧѼʯ࠺ɟ̧̌Ȅюм…ȊʅʠǛ֒à׼Ȉ˰ƲҎ̓Ơӏĩ؁®ͻęסܢӥńઉăȧ̊ȷê‡ǬĴ̶áͺȃȂŅϮѡÈɸӮĺ׶ʔ̸͘ʌɈрդƖ"],encodeOffsets:[[-73043,12059]]}},{type:"Feature",id:"VNM",properties:{name:"Vietnam"},geometry:{type:"Polygon",coordinates:["@@૭ܗ۫ߍȁ׍٠ࢭ޺ળނԱԞګϪ།ŕ๓۫փ१եۇ۫਷ޱ̧ՠʀ֬دӌܬ͸ࢦÔσԚප٨ļ৖ț֖ƶࡀɃצٍאՋ݌ۥ঴৓Ԋʊ̠՞ɘ͙ܺਙPϕކӭڐҊȴڢIࠈĬܒ҄К̿ސƵƃӛАͿࡎɓ"],encodeOffsets:[[110644,22070]]}},{type:"Feature",id:"VUT",properties:{name:"Vanuatu"},geometry:{type:"MultiPolygon",coordinates:[["@@ˣō˭ςŒɤՆӗ"],["@@ƌڱɥŀǩ­ťɴi٢Дʵ"]],encodeOffsets:[[[171874,-16861]],[[171119,-15292]]]}},{type:"Feature",id:"PSE",properties:{name:"West Bank"},geometry:{type:"Polygon",coordinates:["@@@ԣŭʙЃŕ˜ɜɌŚɁĦǬ̤֔ś"],encodeOffsets:[[36399,33172]]}},{type:"Feature",id:"YEM",properties:{name:"Yemen"},geometry:{type:"Polygon",coordinates:["@@؉ɥNjύo˹࠷Οഇϻݩףυ±ʥºӭΑ՗lj۷©ɃµǿɛəÕŻɇеlˍœ׉¨ɓӬzҠƍʜǑتʋΊǚ¤đϨĸNJ™ξςˌđΠɞЮΊɓɬúॺnƸċ߼č͐¨ɂ˫ϺƖ׼ࢦ޸Ϛᝒ͒ڀ൳˞ח"],encodeOffsets:[[54384,17051]]}},{type:"Feature",id:"ZAF",properties:{name:"South Africa"},geometry:{type:"Polygon",coordinates:["@@ǏŧΣяɻћӇ׻ोࢁףԋًϣ࢛͙ѓ«ŇɷԛŰеDž࣫NJԙĹΏ¬ࡿͩܓƃԱͅϡoΣ̚˳fαϒŸśŏɦLӰ˙֞˔ƴs٤ս޼х܈AF׽તДдͪɯƘΫϘÓՈǃҌÖݤіB᷌ɨűӾߙûԟȈ̏׼ĒрϒЊʨȶДЦȚΠķВɽۂ£՞ȜĐʾƨДҚäʨ͂˪֔ݮغஒؤ΂UОƛ˲Ķ҂ċД஁ɔׯƫऩî̟чƶʏÑāʓɯ̿T̃ԆҕӮĜǢώْQȿؑıۥɑϛֵщ","@@νʶϻǟҕ҃͡Տـ٧̜ČƺˎҴƀƜ˜ʴФ̅ʪ"],encodeOffsets:[[32278,-29959],[29674,-29650]]}},{type:"Feature",id:"ZMB",properties:{name:"Zambia"},geometry:{type:"Polygon",coordinates:["@@ІϏɊ܋ƝɩǙڻLjۡ˃̇ʭޭѶɓᢇۗĂׯٍřӍͯĹ̛̅ßܵۓҭխ˳o˗ĬऱĠƯÚOêͧȎկ¶ۋȑչԾ֣یžᦶშYí̂Ű̀ƧЀĪТėʺ̂q¶ʽϾrՖûˬϡڨŝԤˆȌѯ٠ş̴ΧΈҥ٠Që࣠ɱƳח͞ɧƬļࡈƬসȉψʈ՚ɤĶ଀ƚͦđΘɇͰƗՖƗӊʧ"],encodeOffsets:[[33546,-9452]]}},{type:"Feature",id:"ZWE",properties:{name:"Zimbabwe"},geometry:{type:"Polygon",coordinates:["@@ҁČ˱ĵНƜ΁VՙϞٯźʙՒC̒έĞ्ई˃ӢǛƮ͓ڤलğ˘ī˴pҮծܶ۔̜àĺ̆ӎͰَŚÆ̻۬hϴǯǺȻАÓѦˑF੟Ǐ׋—عƊʝħӵŵùɛ؅ࢫ॓"],encodeOffsets:[[31941,-22785]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/xiang_gang_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"8100",properties:{name:"香港",cp:[114.2784,22.3057],childNum:1},geometry:{type:"Polygon",coordinates:["@@™@}ScTʟ@cWuJÁ–]„l¦RLj¼BĄà˜ ŽH@TOHCTDDDHDNAT@PEHDDNJLX@BABALHFF@DKHADBBLDHHFBLEJB@GDBBFBADDB@@KFAFBBJJA@BB@@FFDDADFF@FADDDBJC@AFBD@@DDD@DAA@D@DB@DHHBFJBBFEHDFAN@DGDC@DLCBDDCFDlAFBFCBEF@BC@GDAB@FD@DZJ‚X´HĐMja@Ý`p_PCZ@lLnRGSDMFK|a\\Y}­ƒ§™Mën"],encodeOffsets:[[117078,22678]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/xin_jiang_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"6528",properties:{name:"巴音郭楞蒙古自治州",cp:[88.1653,39.6002],childNum:9},geometry:{type:"Polygon",coordinates:["@@˜@ÈÒĊanwŎV„™Ȯ¦ͪŃĢ„ÜōȂçČéƐżLɆóĊ‚Ċaʊٱ¯²Um»ˌmÈ»V™ʠţWÑůǓ郙ôƑƒğÆīŎī@Ƿ™wô™˺LÞ¯ƨVǪуšĢ™ȘV°wĢŽôk°¯ƒ»΀@Ȃ»ĸŽǔ@΀ƒ͔ôôLɆó̐ÝɜLɲōͪƒƨóŤK@ī@IU܃ÛmȻţǩÝ˹ÛljťǓǫō@Ɲ²¯VçōKͿŁΗÇţ»ƽ™ɅƑLÓŏÅÅɱV@ÝĊU¯ÑĊĭÞLšÞŎJ±̃XȣˌōlƒUÈ¯ŎKÆƅ°™XÑܱnŗġV¯™óaUƒƧUōŁ„Ñ™±„çɲ¥lĉkğ°ƒk¥˜ƒnğţL¯ÝÝUƽĬ΁lķ°@„ō„XÿݯV»ŹLʉÞɱŤĉó°ÝJ™¦ÝKÝ£ţܙÈĉ@ƒxǩUċƑ@ky͓¹™`U²ĉVġ»ğa¯¥ť@ĉ™‚ó@ŻÛÛJƒw¯nó¯ġWƽʩķÝɛwĉĕݼȭÞķō@ó£Å΀ƑޝôȯÞ¯Ȱ™ÆōèĉXǼó@ݚnºƒĸ„ÞVƜĸȚUʶõˀĵĖɱŎÝĖVࢰӒѢ°˘nϚVˌ™ÈmɼĵŦW¤öʊõʔ@°ÈXVŽ™ènŎȁb¯ǫĉ„±Èğ`ġwōÔğ»mVVށ„Ý¥ó@™ĸķô@ššbX„ĶmV²²`Þ_˜˜ɴbͪȰ„ÞWĸÈŌmބškɲŽÈUÆ»n¼ǬVķĸźô¯°n¦ɄǜÈ"],encodeOffsets:[[86986,44534]]}},{type:"Feature",id:"6532",properties:{name:"和田地区",cp:[81.167,36.9855],childNum:8},geometry:{type:"Polygon",coordinates:["@@ƨ¥šèź٨ΘƑᩄbUࢯÞĕɲōĶĕöʿVʵķșUƛƒÝ„ķm¹Þ™ô@È»ĊWŎçšÅ°ȯȰÝ°óƒÆͿĉ»̽çnƒmɱĵƧºóU™™ƽ@±wóL¯°̻L±Æ¯Vƴķb¯VÇ¥ğ²Ǖbk¥ÇKlÅɱġ@у™óK@™ÇaÝXğţxĉČǫķê¯K@уaŹ„ƑKƒ¼¯Vóaónġw™óÞéU™ġbóĉğÇl¹™aUóğKW„Vůn›ÇŋƑ›ķnʇ»óxĉw™çǰÅw™°ċ„XŽ™„ób±ƒkÈÇJ—ƒm²ţx@ÒݎšŦǺn„ó¼n°ÇbUÒ±¼XĸĠłƽXmwĉºƒzÈÜmnxmx²ĖmҚbnŽƧêUºĊêÆVóĖóUĉ¼ÅĬƑ°ɆƆŻŚlłÞLš¼nĠƒ¼@ޙšÞź@ŎÞ°VšɄɴжϼِ͈Ŏ„"],encodeOffsets:[[81293,39764]]}},{type:"Feature",id:"6522",properties:{name:"哈密地区",cp:[93.7793,42.9236],childNum:3},geometry:{type:"Polygon",coordinates:["@@WnŐÆĶL̦ţºź„lxÅĸƽŚ‚Ʉ—Į˜è@ô²ÞUĔƐńV°¯ĸX¦Ɛm̐bƒ»Ɇa΀šĢ™ƐLˤ™ȘÑnƒІljĸÿn¯ĶaŎ¯ĢĕȘ¯°΂œla¯¥™ǕǔwˤӱlťО̻nŻmɃĕċţUw°WUóƨÅţķ°ýV±óÅǓéʉ¯ƽكéōǖȁÝƏůǕw˹ǫȗǓƧǕVý™é@ĬţLƧôͩ„ɱŎɛK̏ÞɅôóK@²@°ōؚ¼lŦ¯ŰóƜÛlV¼ķ¼ƒ°kȰ™Ű„ĠƒǬ™ŚÝŎmˁ`@ÇÜn„"],encodeOffsets:[[93387,44539]]}},{type:"Feature",id:"6529",properties:{name:"阿克苏地区",cp:[82.9797,41.0229],childNum:10},geometry:{type:"Polygon",coordinates:["@@VƚxˌŎÞŎƒ°n„ȂÒ°²VĊ¯VğƾˍǬƨÞÞKÈÞĊVźôɆÞĢèԐôWȲŤVÞĸʶbl‚¯ôn_VÆĸlmÞnVź_ĸ¼Ȯmǖ„šéĸW°°„ĸJ„kʠ¼Æw°¤ÈƒlxɆzČºĶI²ÆǔUš°ô@Þ¦‚ƒUnUĠ¼ŎÓĢxĠ_²ÇĊƒǬ°ŽȂamōšçUÇW@¯öʓõʉX£ĶťnɻšÇUˋmϙ¯˗ӑѡᩃaΗƒœɜ°xWƴUxɃÒˣ¤Ʌwğ„ʉōóÝŹ±°ȗ@¯„ƃ²¼","@@ō™гwȁ¥Ƨ°ŹÑķV™¼ÞêĊ»‚lĵšm¦ÅW@ĀôÈźaɜxÈbÞÆĶIОŘnIÇŃÛÝĊÑĠƏ"],encodeOffsets:[[80022,41294],[83914,41474]]}},{type:"Feature",id:"6543",properties:{name:"阿勒泰地区",cp:[88.2971,47.0929],childNum:7},geometry:{type:"Polygon",coordinates:["@@ɲˣĊIÈ¥‚ÅU±Ċýkō°ƒĉƽó»ĶƽXóʵʵ™ȯƑÅȁɅ¯ĉ@ÇሗK֛@@ˤV֜ʵрƒǬVĸƑŎ@ƆϯÑóŽķ@ʇ»ķ¦έmlÈĸĊX¼WźÛÞÝѸ‚ĢČþ„ĀĊôάVö¼ĊUƨ°°èŎČUÜÆóôVôô޲êȘlˌç°`n²ǬŽĊaš™ƒÛ°±kğmm»š@°ÝɆÛÅÇVaݍVm͔ğôÝÈb‚„@„ƒ™n¯š™ÜUĢÑĊ@źīżWŤÈǖWôŁÆI²ÓƨL@ŽĊX„mmÑÆ»ȰÑkƒĶō@ý°m—¯"],encodeOffsets:[[92656,48460]]}},{type:"Feature",id:"6531",properties:{name:"喀什地区",cp:[77.168,37.8534],childNum:13},geometry:{type:"Polygon",coordinates:["@@Č@°ƒĠ„ôÓô@Ŏĉ@Ƴĸ@Ť£ĢlVôWVóřXĉŤêÞ@ƐÒĢÑlèÈV@šĠIk°ÆŘ@ÈÈĀ@ǶťÒğ@š„@ÒĉlŻ_@šƧĖÅĬōÆ@bźÞnƒƒlVœÝĬšWƼʇ„ƒÝÅ@ÇÅÈwWóĉ±ğz‚ĬČƨƂÝIĉݯbÇÑĉƒ¯ʈV°xUŰĊ¤ƪ_ôÓɚI@lȚXȮ™ŎlɴȘ՘š„¦ɲÆʈ_ɴŽźŽôÞʊŎĠƒɆxˤ£ɄÑVwXƳ¯w›ɛŹ٧™çƧ¦ōƒُ͇еϻɃɳU™Ý¯@ōÝŹš™@݄»mğ™»ÝKkŁżřɅƅƒ¯ÆīĊ»ôVôĕÅUĉéV¹ƨém™anѱĕnwmwnÇۄyĉ¹ŹlŏkĵèķmōÞġKñÔċKÅèĉzƒŽ„ômxȗÿƿI@þÅČÝKݰ@¼ÈVºš@Å̚ÆUċłn„ÝÆǕČĵJm£ÝJ¦@ĊƒxV°ƏLċ¼ǩ™@™m@ÅĢómÇÆğ¹Çš™ÆšĖÞKšx„wô¦ÆÑÆL²ÆƾŽU„ޱŚÅŻĖ@ĬŤÈñ„@ǔÇx„Èǃ","@@VÇ™ţ°ğUĠ¯mk¯ó¥ķIġÿƏbƒ„ĉa±ÒĸĀlKU„_m»nwšŽ„m@ÈŤ¦ĉbÞ°±Þżł̦°ĢŁVé"],encodeOffsets:[[76624,39196],[81507,40877]]}},{type:"Feature",id:"6542",properties:{name:"塔城地区",cp:[86.6272,45.8514],childNum:7},geometry:{type:"Polygon",coordinates:["@@ήnĸ¥ʈ¼ĸ@ôϰÒ@ƅƒōUķƑǫʶпU֛܃LګK@΋ĸ@Æ£ÞġÅĠċšLV݄»™@Å»Ýnm¯š»nŻĊ@nķŃ@¯ómóÛÝǟ¯aÝóȭ¥ƒšōUmxĉbÇї@›bUº¯X¯ÆƧbVÒĉnǕw¯°ƑŽV„—ŽÇ@kx±Uƒšɱn™ŽÅKƒ„¯ƒĠǠU°ɜL@°ƒxnĬ‚ĀŋŎÇLƒŽğšϱÞέƜkôÅĀǕłƒĸĊŤUṴ̋„¦ȂϰÜɨ°x@°żǠÆƈČVĠ»ČL°ÇšbĊÑ̐óÞlĶwބɆVÞwǬxǪţȼÜLŐĶˢ@","@@óKĵĀV͈ĉłƾNJÆŤƒzXl°ƒÆL²¼źŽôÈĢǔ™¦l„ô°ɜÞʊĠğŃm»ʵƳƑʝȗīV¥¯ĉ°Ñ@ŃÅI™»ĉmğn™ƒašƒċƨbš™Vğ—w›ġ¯@Uōa™ĉÝJğÑÆŎkŎÞĀlꃦ"],encodeOffsets:[[87593,48184],[86884,45760]]}},{type:"Feature",id:"6523",properties:{name:"昌吉回族自治州",cp:[89.6814,44.4507],childNum:7},geometry:{type:"MultiPolygon",coordinates:[["@@መL@ȰĊȂɆƒÆĊ£„ťôWÓɆbĢÅŎƒÆ¦ČÑW¥°ķU¯ƏŃVē±Ý@ó—ç˜ĭɃƾřÆķkwʃŤ¹ġ¥ĵKŏÅXmˍщwǓ¤Ƒ@wóōVķ£ɱšġôÛa±Òȁ„óèţIVŽƽ¼k¤ó¹ġJmx—»ÝUƒ²™@ÅÆƒĸǫŎ„ĊmŎǬ՘"],["@@Þô°bÞǠôÜôn@°ĸń˜Ƕkłƒ¼UޙKğȂÆÝĢŤķ@@ΌڬL܄K@ˣȂ˭lĉńW¥ĵVÆý@ŃÞēUŃȗƅ@ŹƩǕĉ»k»Ç™VğóřX™ŻKƏŽċêȁèÛŎġƒͩń"]],encodeOffsets:[[[90113,46080]],[[87638,44579]]]}},{type:"Feature",id:"6530",properties:{name:"克孜勒苏柯尔克孜自治州",cp:[74.6301,39.5233],childNum:4},geometry:{type:"Polygon",coordinates:["@@ˎǫĠƽ°UUĉ¯±ȁÑmƒ„¯Ýōˋō™wUű»ÅƑ°ƒȘ@²¯ɳʇ`ɱŃ¥՗™ɳȗōkȭšșW@kəJóÔƩ`ĉ£Vů¯wU°ʇĊ„ÈÒ°aĊÞÞJŁċƧīĠyĊ²XôÇxÈÆÆ@„ÞʈƒÅ»™XÞīU›Ƒkm„ŹÝ@aŎÅÆīƨĕ@™ż`Ċk@љƒĠ@ŦÑ@ǵÇÿ@ÇÅŗl¯ğJ@™ÇUkçġÒƏÑÝ@ţéWĊôŚUŽóXUġkţ¤ķ@@ƴōĊó@óÔğƒ¯„ċ@@Қ¤kôˣŰ͓„k»ƒKX¯ċwƧôğɐšÒôIVƙš¯UķǬķšnŽ™¼ôb°ÒȰVVÈÞ°ƒĸó¤V¼°„V°²êƒlĢ҂Uƨ¦ôȰƴĊVV¼ǖIċĊ„ÞɜéšnČW˸Ǹša„řÈw±īšçĸ¤ĊšôšwšŽĸU̦˜éǖĬ„Āô¼lÞkÒ°x°ƆÞx„šÆV²ǔ»„b°wގȘ¥°n„šŎV@°„„ʠè‚ŰȂb"],encodeOffsets:[[80269,42396]]}},{type:"Feature",id:"6521",properties:{name:"吐鲁番地区",cp:[89.6375,42.4127],childNum:3},geometry:{type:"Polygon",coordinates:["@@ôK„ĉǪa²¼lÜô@ʠê°Ĭ™ôȂƒ²ÑÜbĢóɲ™ĸ¤ŎUô@xƒŽǔ£ъxˎmƒÈÛ@‚_nĕÞōšř„ǫƒğšůlȯ„¯ĸ»U»Ükôƛ°ůkť™»Ŏŗ@¯@±͓óͿ„Ǔ@ķȁ¼Ϳ@Ƒ¼¯°ólġ¯xȗUġšƑ™ǩÒƧUݰ˹Kóššx@ǸōĬÅĬƑĠ󃄚ǔêÆ°XÒʟŤUšÇ¼ˋnn¼±V²°ȂUŌݜbʟǔɅô@żǬaҎÈ"],encodeOffsets:[[90248,44371]]}},{type:"Feature",id:"6540",properties:{name:"伊犁哈萨克自治州",cp:[82.5513,43.5498],childNum:10},geometry:{type:"MultiPolygon",coordinates:[["@@ĉ„ÆŘȁ̐mÞ¯ĀX°±¼@ƾ¯ƴ°ŎÝþŋ¦WÜÞbȂĉźUœÇmwVUȂóô@ȰÝ΀nÆJn™ƾ™ʠ™ŌLČóǪ¯œ¥ǔaǖšŌaôÝĢLšx„ƒÆLšɲm„™²VlwÈ@˜Uƒƒ°¯ǖxĊmUÑƨa°Å°WV¹œa›ÇɃÈm¥°¯ŹóĸķǫUm»Å¼ÇVɱ™l݃ŋnķÇÝX¯ƒͩÇɳa——Ý`±_U±ĵnWƒ™a@™ĸóšķ™¯ǓV±ÅĵJċ¹ɅykwDޝ£Åxʟ»ƒlķI¯ƒX¯ķ‚™êǕƒȭnķ»Ź`±„kÞ@Žš„Ýô@Þ°xšŤŎIƨÆUxōš¯²ǔĬǬlUŚ"],["@@ÞĀlꃦ¯ĸŤKޙšƒċƨbš™Vğ—w›ġ¯@ţƽJ"]],encodeOffsets:[[[82722,44337]],[[86817,45456]]]}},{type:"Feature",id:"6527",properties:{name:"博尔塔拉蒙古自治州",cp:[81.8481,44.6979],childNum:3},geometry:{type:"Polygon",coordinates:["@@ήƛϲÝĠ™„ÈKŌōÿmī„w@¯ɛKV¯ğǟ°Ƒ™wġKóÞŋbǕ™Ǔb›¦ǩ°ċôŋKʟšƽšmšÅImŽͿŽȯÞó@ȁôUVnx›ÈŹVȁĊÝabŻ£¯°l„óxȂŤĸkĊšÞyĊêĊmĢxV„ƨÈŽĠX„ŽΘÆĠÔź‚Ɇţ°LXƾŤŤb"],encodeOffsets:[[84555,46311]]}},{type:"Feature",id:"6501",properties:{name:"乌鲁木齐市",cp:[87.9236,43.5883],childNum:4},geometry:{type:"Polygon",coordinates:["@@šŽWŽôŚUĠȚl¼Ċ¼ƪǖ@źȘƆ@ýlܚXVŘޙš¦V¼kĖó҃èkĊȁˮ֜@ǫ՗nōƒĉǬō„ķÆÅš@„±ÞV˜¼nwĢIôºl£ƾ»UŤJôçšó¯īʟéó@kÛ±»ǩbƒĊóLҍÇǫb@ŻɆóʠǓ›aŋÞȁVʉłĉbĉɅô"],encodeOffsets:[[88887,44146]]}},{type:"Feature",id:"6502",properties:{name:"克拉玛依市",cp:[85.2869,45.5054],childNum:2},geometry:{type:"MultiPolygon",coordinates:[["@@ɜÞʊĊýVaŃm»ʵƳƑʝȗīV¥¯ĉ°Ñ@ŃÅI™»ĉmğn™ƒaݚţL°ķóKĵĀV͈ĉłƾNJÆŤƒzXl°ƒÆL²¼źŽôÈĢǔ™¦l„ô°"],["@@ƾIŤ@UUwōa™ĉÝJğÑÆŎkŎ"]],encodeOffsets:[[[87424,47245]],[[86817,45456]]]}},{type:"Feature",id:"659002",properties:{name:"阿拉尔市",cp:[81.2769,40.6549],childNum:1},geometry:{type:"Polygon",coordinates:["@@nIÇŃÛÝĊÑĠƏō™гwȁ¥Ƨ°ŹÑķV™¼ÞêĊ»‚lĵšm¦ÅW@ĀôÈźaɜxÈbÞÆĶIОŘ"],encodeOffsets:[[83824,41929]]}},{type:"Feature",id:"659003",properties:{name:"图木舒克市",cp:[79.1345,39.8749],childNum:1},geometry:{type:"Polygon",coordinates:["@@VéVÇ™ţ°ğUĠ¯mk¯ó¥ķIġÿƏbƒ„ĉa±ÒĸĀlKU„_m»nwšŽ„m@ÈŤ¦ĉbÞ°±Þżł̦°ĢŁ"],encodeOffsets:[[81496,40962]]}},{type:"Feature",id:"659004",properties:{name:"五家渠市",cp:[87.5391,44.3024],childNum:1},geometry:{type:"Polygon",coordinates:["@@„çôÑlĕU»™¥ÝšUŗ™WkÛ@þVńÝĔ@ńÅþĶUX¦Æƒ"],encodeOffsets:[[89674,45636]]}},{type:"Feature",id:"659001",properties:{name:"石河子市",cp:[86.0229,44.2914],childNum:1},geometry:{type:"Polygon",coordinates:["@@lŁ—ǵm‚ĉ@mż™¼n°ÞmƼš@"],encodeOffsets:[[88178,45529]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/xi_zang_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"5424",properties:{name:"那曲地区",cp:[88.1982,33.3215],childNum:10},geometry:{type:"Polygon",coordinates:["@@ƨʔĸbܺÞwnxźbÞ°ô@„ĶŽĸIȼĊJŎÈôUšÝƒ¤ǔLސŎ@ĢŽȘblƒôL„ÇźçȤôLš¥ÞIÞ¯Ķxʊťƨ™ƿÑĉXVķŦ¯ȂKÇǕšÑ¯IUš£¯Óƿ£VĕōÞÿÆwƒƑ„£ǖxÞĕ±ÇÝaUÑȃU¯‚UōÈ݃wWŁĵ™±Ý„óĢÿ°IÞ±mÅ̝mÿ„¥°UnÑŤĢĕĶwǬŻͪwŎ¼źÇĢ„Ġĕˎٰóƨ¼Èa‚m@¥°wǔ„ǖ°ŽƨÇŤœšġƨ„ŎŃôbÈÛŎĊ°@Ġw²ÑÞJƃÆb²ƒ°êĊUނlȲƒV„ÈKĊÒĸĉ›»ÅôťUÅǃk¯@ǂÑklǁÅl™Ģ™VÑóƒ@°@„ÛĸƒV¯ƒÇĊ™n¯Uĕšƽ¯m›¯b™È@Ò°Ĭƒbĵ›¼„‚kxķýÇJk£ÝaUÑÅóĶǟkÓʉnĉƒÝ¼Ƒ„ó»Þmn£m™Č¯@ƒȮÿV¯ĸƒ™k@Ýówƒ»ğ„ġ±ǓLō„ƒšV¼Əèķĉ™è±b@Òţ„UÑóakƒl£™Ó@¯L@™ÇlUóȁš¯aġÈÅĕÝLķ¯Ė¯@WĬ—x‚ÒÈnW°ţôU²ǓÓġ²V°¯ôƒǔÝL—ċšk™š»Ý»Ýš¯ÞƒVƒwۄÝÇōͩÈĉċ»ĉm¯£W¥ţKkóġƏW@¯±kōŽÈ›b@җšÇaƒÆ¯a™„ƒkóŽÛƒÇ¦Ýa¯šÝ™ĉ@ǻۄmƒǓxķƛ¯lVĀÅÞġb™™ÇJUÅV™ĖƑW™zō»ōšƒW™n@è¯ÞóVkwƩnkźÇބҙޯƒƒýğÇUxÆÈnè±bĉÝ»ÈуwšwÞ@m»ÈV@ýÇ°ķ™xƒa„ݯXċ¥ƒÈóW@ôkxlnxVÈóĊkŤġ¼@°¯ŰƑL̻۱ŎÝV—Þ›VƒÇÞŎÇakƞ‚š@èğŎĸżšƾ°ÒšLÞôĠKȰĖźVÈÒĠ„¤™VôšŽU„ÈþťL@ôǬÞlÜÈnÇÒUŚ™@šĊƨW°™°Xƒ‚@ČÇþ„ƴĉÒķ¦@ŽĢôWĀôłUÞĢǬ™ź°¼š@ƒôV°„bUÆnzm¤ƽĸƒÈ"],encodeOffsets:[[88133,36721]]}},{type:"Feature",id:"5425",properties:{name:"阿里地区",cp:[82.3645,32.7667],childNum:7},geometry:{type:"Polygon",coordinates:["@@„Çƾķn£myVŃaU¯„ó™@¯»šŹġǫVÝóŁXÿġó@ĸ¥ĊуƳÈý@ċ„Wš¯X¯ĉƧ‚™š@VřÈÑÇmkÛǫÝ@óŦKÇýVƒ™U󚏃£ğÇÑŹUȯĕğLÝó™K¯Ñ™ƽķŻĠō@灙lƝÈbƍÈ݂„œU˜ÝÞU²ō̼ůƒK°ů@¯UK±—ĊƧbōÇmçÈġƒóšÅób™™źóš¥kól™ç™KôĵUƒÅ„VŃķ¥nÅŏm¯¹Å‚™»@ÑǍóxÝkʇȤU¤ķb@ƒ¯ĊÇx¯ĸĉKm°šĀk¦l„„KnĬȀƾÛ¦WÆÅmNJĉ°ōUţ¤UšŎ°šŎKÞłÆ„Ǔ¦ƒÞ™‚™„ř¯bmUÝl¯Um™ğl¯£șwŎǫaÝnĉ̓k@¯™K™šō»ĉn™aÞ»ťnkml™ĸ¥UŚŻkÑťƒĉV™ôó°LôīĠU„ÿĉǕÅz±Kƒ¤„²ō¤¯Ė¯UÝ¥Vĵ™óÈťÝwķșÑk¤ó„™ƒWýĵĕ™„VĠƒV󍃎Ǔ„ķ°k±VU±ţ¦UǟÝřJVљ¥XUċUŎlÛƆǕÆȗƆ¯wŏÞÅ@™šĉl݁óŽƒÒ™nUôńlxólÝôێ±™™LÛôÝL@‚ġ¯X¯ÇUżóa󤛼XÒġŎóLk¦‚ôżĸĠ™¼™KġƆô¦„ÆƑÔĉ͝ImÒ°¦n°¯Þl˜ÝČn„ƒÒšKĠޚĕkƒlýƾťœšôI‚ĖŤÒnƜm¼¯lnżóÞ@Ůó¦™ôƽĖċŚn°Ý°ôÈUƜƒblÞóŽ@Žǖô°UÈƆ°X„þôŽô‚lѢšŽ²Ėm¦°š@¤™XŽĊblܚzkºƒĖmX„šŎWVšóÞn°lĠxȚa°»żLźƒ„b@ưXĠÝȚxĊĕŤaȚ‚°È@„„@èŤ¦Ü¼œW˜ÞkŽÈ@V°lŤkŎ±²¦ƐUšlj°aÈÑŎb̃ŎbÆ¥ÞIȘlššôVÈU‚™šb„kɲĶn„mnXb̼òƾĖŎ@̐ȂÑôÓĠĖʊšĊÔ"],encodeOffsets:[[88133,36721]]}},{type:"Feature",id:"5423",properties:{name:"日喀则地区",cp:[86.2427,29.5093],childNum:18},geometry:{type:"Polygon",coordinates:["@@ĶĖXþš„ôƒl£šÒĸÇÞxÇŦšôUĶÞ¦°V°ĕŎ£ƒ±„£²LÆyĊǖƒĀğVóĬ¯KóôUš‚ĊŦ„lҙżVÆķ¦kšlnŦmݼšbĊmŎ¼š™šL@°„lĊĵÞmǬbƍȚx°¤Ġknš°VÞkVn°aƒŚš‚š„Ýǔ¥ÅƒÝŁōL¯™ōV™Ť£ŎVĊ¯nljƏXÅÜ¥ǿƽmīƒLkƒl¥™ÿn¯ĊL°ķÈw°ĉ@ƑĸaV£ʈȣÞlôwȎ@Қ¼Æ°ºŐnmÆĸ¦UńƃV„ó͚LšèôkŰlĬ™¦Źôššôa™Æ„ôÇĢnèŎÈƨa˜ĉ²‚VLĢ»lţôĉUǂwkmlw@óôX„ÇȦ°WƒÞ„b‚wĸšÈ¯@þÇUn¼Ý@™x„xÇńÞ¼Ċ޲amçÅÇVwĠȄþ°„šÝƒÑÈÝlŹƪmlxôU°Ý@çšm„XŎ™Ŏ¼šyƒXšĕÆUVÈIššĢaÆÝUÿ°kĸƜǔwn„܃ȼĊ@ޚ°™Þbȥ܄ô„lšƒ°b„ÅÈb˜™@ќa‚ǯUU¯Vġš»ƒ™¯aV¯Ç°Å™mnÑŤçǬVǬ™±ĉ¯¥Vĕ¯Ýk£˜ō—w@±ġÛ°ÇVїƒ@ۘa@ČL™Ƴ™„ƒÇa¯¤ÝIĵ¼U¥ƿōķÅţŻókÝóĕ‚¥¯™U»Æ£X¯ġŃÛkݰV°ó¼¯èWôÞĖ„ȎƒŽkĀƧĀówm¥¯JŹÝJݙōVVŁaݐƑ@ƒ˜ğŭǂ¯_ƒ˜ĵ—›VnxŃón›ƒĵxÇĖĉVÝÈğV™Ò󃯐±Żĉ£ķÆÅL™Ljĉý˜ţۃ¯VƒnV¤ÝÈ@°ÅÞݤ™ŰğŁm¦ÝxóKƒ¥ɱÈUĠôêVôÛ¼ÇWÝçĵaō¦óĖƧlÇĢƑŽnŎDŽV¼¼‚ºÛ@m¦ƽ„ĉmm¯ÝKÛç¯bŏłĬ™bƒ¼ÅLmŽ„xť°ÅU™šÝXkŽÝmĉ¦W„¯K„ÒknÝaV„Ýè¯KɅńÝKnÞ¯¼"],encodeOffsets:[[84117,30927]]}},{type:"Feature",id:"5426",properties:{name:"林芝地区",cp:[95.4602,29.1138],childNum:7},geometry:{type:"Polygon",coordinates:["@@‚VÈłVôÈk@š°K@ŽšÔk¤l„ôbVÒŤƒ@ѲašçĸĊƐçU»„™ŎƒǔK̲Ġƒ„¼ôx@ޚlƨĬ„Ul¯ÈLV‚šÞJ„°Ünʊ„wÜbXê‚VÞ¯°ššanaU°wƼɴÑWѰmÈýÈam¥Þ£Ť@„¥ôblÞĢ„ź¥ôxÈÅmݚ™ƒĕŃV»ĉōŤōnóƒ»ÈīķIUƒĠѰġĸLÞ¯VÒÆ‚@bš¼WôÈ@V¼ôóŤKÈÑU»šwVǫżnWÒÈx™¼‚lŦ£ĊōŤx²¯@ƒÆƒU¯šçÆ@„¤°£„é°k°lšůÈó@¯ŤÇÈĉƒkkÿó¥ÝXķљÜ@ÒóŚÝ¯°ĉówÇ±¦ÅJUÒĉĀķw¯°m˝„±akxÝÅnƒ™»lуK@¯lU™¯UVѯóĊ¯mōğVǓƅƒÞƒWÝÈÛ@ƿô¯ÜġzÅþ¯ólmôʇġĊÅUͿřŏȁˋŁóÇˡōƧƒÇb™w°Ķôk¦šÒƒnUþġҙÔkǔķèó@ƒ²@ŘōńĵyƒzġaݤÅIƒ¤Ƀť¦ğѯ¤ķbóš¯ó±ŽU²°¤ČÜVnÈÆ‚„ŚŎ°ôĢ„þÆzèVĀǎĀǘƒXŹÑ¯¤ówċķk¦šłUÒġzÇ@ƒ™ÆÝx@²Þ@Ƥ„Uô¦Uš°x„U"],encodeOffsets:[[94737,30809]]}},{type:"Feature",id:"5421",properties:{name:"昌都地区",cp:[97.0203,30.7068],childNum:11},geometry:{type:"Polygon",coordinates:["@@™ŽVĖm°ĉš„ÈU°ķ„ƒÜ¯@@ô„UÒġškš‚ÆkÈlށÒ@Èl°È„VÆóŦƂœ¼‚a„ÅĢ™Ʉwnōw@¥Ŏ¦°ŹÞmVš°wnÿƒw„wÝw@¯šmÞŗ°wĠ˜ĸkÞğlĔ²¦°@„ĕĸwVóšal@nĢÇĊn°@¦šŽźUXçǔůĸVš™ÆK„ÈÝĠš²ÅĔô@lšŽÈ_m˜„zǖl„šaU¼ôwV°¯¦‚ĬÈa„l@Čǎ„¼™„nŽ˜I„xô»ɜ@ƨ¥ɆŁ„ŃǪȁkƛƨȍʊȡóĭ›@—ÈÇVƒůރĸƅmēƨť™ÅÈʉVǵ°ġVŭÅɧ°ÿnɛš£mƒķ²ŃóÑUĉ°mÇ»¯@mxUèţ°ȁÝç„ġU¯ÆÇţÈ@°Çô™Ű¯k¯lƒê¯¤ƒ£Å@™èV°Å„@„±°ţwĉŎť¤kš»ÇwXÑŻmUǬ™xV¼ÇÒţLóôU»Ç@X󙻂a@ÿŁUÑݰķK¯ĢğÒV„ĸJÇĬ„¼môţŎĊŎU¼Æ„„Ė™šnÞÇÆówʦġƒkÝóaƒ¦ţ@ݤn¦ÇbÇþ¯nXÒɳÒÅ»¯xVmb™b¯™Ý°UWéÛaƒxʉÛmƒ¯ÝI™‚UÇKk°ƒVƧīķ„U°ȭĀ@„ċ°nšm¤Ýnô¼ƒƒÞ»Ċ„ʊmlÔĵǠÆôVÒÞbl¤ÈIĸþlwƒœ»ĶŽ„a¯ī@њǰanœƾ°"],encodeOffsets:[[97302,31917]]}},{type:"Feature",id:"5422",properties:{name:"山南地区",cp:[92.2083,28.3392],childNum:12},geometry:{type:"Polygon",coordinates:["@@°ÞU˰¦²ĊôÇÜLǖĀɜŽȘŰÞLĸźêÞ@UÜUŤ°ɞ¯Ü„°WŦĀmŎ„¦ĢyVљŁl¥Čĸôx°£źÒ„Wȗ‚ÿȍUÿ‚çÅyƒýóġō¯ƒřŁmÇÛUċޝ£V±²°ôô™ĸa°£ĠÒŦ¥ɄŽ„£ÆJÞ£Ģb„yĶzŎŃ@ŗ„±ô@ĸçlǓšÓĢÑVý„m™Ñl¥ĵó‚¯̻̥™ƛǫÝһÇƧĉyţ¼ҍēVĶĉŎ°ĸmšÞVÝĸ™ÒÛaċ„ó™ŹĖƒèÈÈl¼k¤ÝX@`ސŏ¼Æō¼ÇçĉKUÝÝ£ğ¤@¦ġl¯Òġĉ¯óš™móxÝÞğVšƴċK@—b@ܘ„UÒ¯ÈĢÜ@²˜x—Ŏl¤"],encodeOffsets:[[92363,29672]]}},{type:"Feature",id:"5401",properties:{name:"拉萨市",cp:[91.1865,30.1465],childNum:8},geometry:{type:"Polygon",coordinates:["@@Ŏ²l@°‚XĢƐlôŤLX¦°¤ĊnȼÇĊŎͪÞÈ܃„x„U°Ýޙ޼™¼lšČ™˜ŽÞK„Ǔ°óU¯Ģ±ǔÔV±ŤóX¯ÇmÑ˜wXī°@°ĕĸÞKÆĖĢǰbȂ™ÇفUƒV¯wV™ó¥ƒVÅ£Ý@@±ÞwšÅ‚„È@ƒ¥nōťÿ¯Xۃɝ°ţ¯ÛVVÝ@ŹéķÝKȗůɛǕÿÛKóÈǫšǫUţèmҚn¯Æ°ÈU‚°b„š™¼UĢV°°V"],encodeOffsets:[[92059,30696]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/yun_nan_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"5308",properties:{name:"普洱市",cp:[100.7446,23.4229],childNum:10},geometry:{type:"Polygon",coordinates:["@@U‚ô²‚a@޲²Ķ¥œV°šĶ²bl¤kVxl‚@œ°‚ڲ@˜„„y„@ô¦¯„@xƒxVxU„VššbVšÜm¼Ŏ„„ĢmºXXWÆ@œšmŽmXU°ÅÒm¼Þx°w„@°‚XêĠ°»nV°U„l@k„@V±ôī@£‚ƒČŃÆ£„KÞý@¥‚k@y„a@—nWV„UVƒšwƒmƒ£Jƒknm@wmkn‚X„˜šX„¥mUUlUnbš¯°ŽnkƒVInlIUw°n™mk@@mlanXlanmšk@wVWUw™_@éĠašnmUaÜ£ƒmXƒ¥¯@@„óUmݯ¯ÞÝlKnxô£š»„»Ġ„J°aV„UÝÿV¥ÛbƒI@wmŽón¯yÛL@ƒWkŎmș`IWa¯K@¯mUnmaXm™bmak„¯ŽƒĢ™ÒÝm¯mV¯KÇb¯KۜWW™X@a™V™knċLUWV™kXóW@k™a@ƒób¯Uƒwmb¥UUlaU¥U£ma횃KXkƒmÝ@kwmѯk±ċbUUVakaġ¦ƒƒkL@`ƒœ™a¯xƒm™Åƒ™LUWƒ@ċnŎUV°LkL@b°°@¤š²ƒ‚šnôôk„l°kè›ÒÈzV¤È„WôôƒnV@„ƒ¦@¼Ux"],encodeOffsets:[[101903,23637]]}},{type:"Feature",id:"5325",properties:{name:"红河哈尼族彝族自治州",cp:[103.0408,23.6041],childNum:13},geometry:{type:"Polygon",coordinates:["@@°°nÞôV@ƒ°@„¦WŽ„nÛ¤Vbmn™ğb@êš`VxUX@xš„ÆÞUnn˜WÞĸ̃šÈ@ŽÇè@zÛÜWšÅêlš²„˜KnV¯ĖĊx@bk@@„°JÆ£Èbl„nnm°nlUkVUUwVm„Kn„‚nVŽÞxVLX¥laX@@xl@VzȎVmšk@b°šÈĸmŽV¦`W„XšƒbUb‚bX¼°x@ašVVkn@lþnXUlVxŤÅ„y‚IUƒka‚IŎĊ@lXx@b„z@‚ô„ƒ¥„_V@l‚n@„ôy@al_l`nmƒÈ»@kƒmXwWK™U¯»™a™Å@wƒmUÝKUa™UUƒ™wWƒ@w²»@kƃV£—mm£VKkÑV@@»nwƒ¥™ƒ@kƙnllIVlnLVakalknJšWmnaUaVÑVVލn¥m@ƒ„¯Uÿl™@™™™VçƒaXaV¯UyVLVkš@nJlšXLlŽkxlbla²Òl@nVJVkšx„KlkUaVķÝÑU@Åm¯@±™Uó°ğńķĠmU™Ñ@ǯ¯Å¼@nml@°¯¯`@w™£@¯Çƒk@ƒ»nmċ¯U»™I™Ž¯LÇĶÛn@bó°™U›šwmޝ„™Umǯa„™ƒ™ƒI@ykIƒVUޝbƒIğŽƒ¼™¼ó¤mwkLÝÞ"],encodeOffsets:[[104243,23429]]}},{type:"Feature",id:"5326",properties:{name:"文山壮族苗族自治州",cp:[104.8865,23.5712],childNum:8},geometry:{type:"Polygon",coordinates:["@@šwô„š@²¯maUmôUÆxš@Xš˜bÞInlVUVw„JVaU„K°¥„xmÞXnlKlnna°@ĊČ„ÆwUmnkl@°ƒƒ£nyn@VV@Vak™ƒ@@kÞ݄bmx°Vnw°klÞInĖÞVlKl™@Xa°„„KlV„U@šJnx‚U@ÈĢbUKlm@ak_‚wšanWUk°ƒl»„k@Wk@lwU_ƒ@UalóU¥ƒÇnƒ™kJWƒ@mVXx±bƒK@nV±a@™Åa™£ÝK²ƒWknamKknǏk¯ƒaV™™V¯ĀƒU™„™Ò¥ƒI@mm¯¯xōW@@`k@ó»ƒUU¯lm£ÅWlĵ„w@mmwÅmWU@y±U—xmwU„¯Uƒ¥Ý¥¯£m@kŽÇVUV°VbklƒL™wUlUIm‚k@±ÑkbkalwkWKk™mI™@UlUKVzU°Wb„bU蚚@škšVƒ°@„n‚m¦ÝŽUUUÒVbmbXn™‚mIkllbUbmKUkkJmkŚ@lš„„¦mx@¼U@lÒULn¤˜nU¤Å„@l±¼@xX„šxV„šVVbÞLVŽ„n@xšÆšb°¼šV"],encodeOffsets:[[106504,25037]]}},{type:"Feature",id:"5303",properties:{name:"曲靖市",cp:[103.9417,25.7025],childNum:9},geometry:{type:"Polygon",coordinates:["@@ȦlKÞĕUV¯Um¯„ÇVUnVVUƒĉn™ĊÇƾLn°°È„JÆw„@lbÞa„¦V„XJ°¯W¯„aÞJVkUša„ƒ@lKnÅmWUk¯a¯»@m±@уkkbWWX_WÓU»_l™kÑm@U»m@l@IWċn¯l@VanV„UV™UVwVx„KȄVmUē‚@„ƒn@VÝÆL„w„VVwnVlmkUVÑǰka@k™ÿÝaÞUl£™›—ċĕX±±ĉƒa@UnVnalónk@wl™UVmkÝJ—aW™™@ÅwóVVnnb±°™@óƒ™xXLWx„n@lǼn„m‚k_k`@bózƒ‚m@kU@ƒ`„¦óƒ@nWš@ÜÅXWw@ƒyƒb¦@ÒlnUb@x™lܐk‚@²Ç@Uƒ¯bmy@kV@bƒb„¦U`lLVx@b—Ll¼Þ¤@„°VVބU@WސUb›J@nnš@lnnm„šxUŽƒUUbƒK@šÇwklkUƒVWakn@ŽlbU@@„ULVxkKUn‚°¯Ò@¼™„kmƒ¦m@kl™Ȱ@lU„l¦„@Vl°wšnnþĊUÆbUx™b„ŽV„šĖU°„a‚nnašV„al@@b"],encodeOffsets:[[106099,27653]]}},{type:"Feature",id:"5323",properties:{name:"楚雄彝族自治州",cp:[101.6016,25.3619],childNum:10},geometry:{type:"Polygon",coordinates:["@@mҁXU`Wnšš™@Xl±¦š„Uxnbl°knmKUx„„ƒxVôUx°¼ôÒȄ°JlnÞKĠœW°¦ƒ„Vx²JVwš_°¥@UV@@wnymknK¯I@‚™²b°ƒš£V¥šwU‚V„¤nLškÆJÈwôô°„l»Č¯ƒġVƒUU@@ƒ°ƒƒÝXl@U»°Å„@U„¯@w±¯VmUUlm@m™„ÑnIVyUwmak£Vwm±—@Çw@nƒ@UxkwlÇnL‚mkř@±Žk™ka@kóJV¯Ç»U£lw¯™Xalbl¥¯UXƒ@a˜™UaÈL@ÇVIVƒkaU¯mm™akLWkUJ¯Umxnšƒ@ƒkUx¯xƒ„mWÅīÝkkbƒŤƒbkxWmXwWk¯wƒKkƒƒLŤċń„@¤óĬU²ƒ@@lƒk¯VmU¯¼@xV@k°l°kbUš°nm‚VnUš@°„š„UVèރÆbUÒÞnU¦›V—¼lô„@Vl"],encodeOffsets:[[103433,26196]]}},{type:"Feature",id:"5329",properties:{name:"大理白族自治州",cp:[99.9536,25.6805],childNum:12},geometry:{type:"Polygon",coordinates:["@@lbœKVIUa˜@²m@b™xôÒÜxXLmbnšl@š„„K°šš¼k„Uô‚xôlV¦nJ„Uš™Ænšm„@šx„ÆwšbXšÆôô„LUVwôK@wlmšaVwœ@WknmƒIUmlnJla@_™@kÝmKUašÑm¯Xw°aUaVl»²JV„bÆJkôͲVVk„mšbVwUó„wƒƒVwnLlmk¯maVw™ƒ²¥Wkš@™™XmV_‚WnÑUkƒ@k󘻜UV¥ÝmVÑÅa݄UçƒVƒ™@¯V™Umn¯mV™lak¯l¯U@@wğŽW鯁ƒ@¯xÝw¯š¯Jċa¯U¥mLU¤„bÞȤƒbÇLWUwmIUVW¼kbš`U„Vb¯L±ĊÛkƒÿÝKkwƒKţê™UĉþƒÈƒV¯ÞVbUްKVšk²Ý‚mI—ƒmV@kƒm™UkšVxm„¯KXÈķJU¦V°ULWxšL@môƒšb@bkx±LnVUŽVLnkÜWnwlLŃmW@kkJU_ƒV„šWĊ„Þ"],encodeOffsets:[[101408,26770]]}},{type:"Feature",id:"5309",properties:{name:"临沧市",cp:[99.613,24.0546],childNum:8},geometry:{type:"Polygon",coordinates:["@@‚xĢ„l`²X°ŽV„šx@x°Þ°KXašğUњW‚bnIl`X²°b„xl°„„šV@xVxk¦mb„l@xšXV‚ÆzX¤™Æ˜k°„kx@lźêlaX»VUnJVx‚XÈK„aÝȣƒaV£nKV¦°‚Čb°I°™n»ÆÑV¯nWn›™@ÿXÅWWn¹ƒġōƒn»‚ÛU™™aU™VƒUw„w@w°ƒó¥ƒ@ƒz—ƒ±@ř›¯@kUwlk£±aĵޝ™›Uĵ¦±±@bó±VÝ@ó¤ƒw¯I@mńóm±XޝIólƒK@š°Ullb™zkKlln@@ԙºƒUmVk²ôҙx™ŎUVóLƒb„ŽmÈnŽmbnl‚a„x@z„@Ǝ„¦kš"],encodeOffsets:[[101251,24734]]}},{type:"Feature",id:"5334",properties:{name:"迪庆藏族自治州",cp:[99.4592,27.9327],childNum:3},geometry:{type:"Polygon",coordinates:["@@W™Xwƒ™@akk@y›—k°īX¥›Uóķ¯w@n»UaVaUۃ¯ƒmV¼k‚™Þċô@n¯xÛÒm„V‚¯Ô@xƒ‚@šk™wm™Åa@ƒUa‚݁¯VŃyV„a@ÿšn»ÝVmank™mmÞÅôƒ@n£±›ğzÇmU¦™Vm„nÜmbn@°nV@xmzÅ@mºV¦k°ln¤š¼õô„n@xkƃIUxUš@Ťƒ¦VšmVkmkXW¤XzVx@ƚx™¼ƒÞ¯b@lVš™ĸގV„m¼XŽm¦V„ŽÞ@Ǝš¹Vón¥ÆKn„‚KX¯x@èĊȱłXšaÆxnlV@UÛlȻkğV¥„m²ljmÅÞĕƒƛm°„ÆmX¤mznƃŽV¦ÞVVb°bnÞWbnްl@V„È@„‚VĵĊ±@ó„InxÆw„¥@£Þ›W¯ĸ£UƒUK‚ƒk±akkkbmWmÈķ„aÆÇU—ȃÆW@wmknmU¯"],encodeOffsets:[[102702,28401]]}},{type:"Feature",id:"5306",properties:{name:"昭通市",cp:[104.0955,27.6031],childNum:11},geometry:{type:"Polygon",coordinates:["@@mƒnK@wmƒUř¥mšóXǓŏmX@Ž—VƒmL@xţ™nk@mlUšŻÒğŋ@ƒL@mmLkm™š@b™XŎW¼ka¯lÇŹ¯aÇ»™ÝÝ_@m„@@a™@UklwUm@ak@ƒb™UmbmƒbV¯™ĕUƒƒšaVwÅaĉVmý™m¯xUkƒ@k¥VƒUXƒ¤VÈm`@„—ńÇÜ@Ākn‚ĔkƞÆĠ„™Þš‚U„VôƆÞI@ŽUxƦn„l@ĊĊnxUÒ°¦Vb¯WUnWށIml@xn„Ubô¤‚¼ÈxlI„»šKVš„@ÈԂJkšU˱ÆVb@nœ„VÜVUVƒšL„wĠl„kn„Ġ@nx°¥Æ„²mUwƒ@m™mÅUl¯UњÑUm„Lll„Il±š@VkwƒW@w°@U»™kUóI°ƒ„»ĢтL„™š`nUĠ²lm„bôV@n„JUxƦX¦l@š‚ŎUƒV„@lV„KVřV£UaÞU™ƒnW@¯VU@ó™"],encodeOffsets:[[107787,28244]]}},{type:"Feature",id:"5301",properties:{name:"昆明市",cp:[102.9199,25.4663],childNum:11},geometry:{type:"Polygon",coordinates:["@@n@Vk‚VUn²°@xƒ°Vƒ@¯ÆV¼k@WŽ„Þ¯„@„@‚VVU„„Ģċ°k¼V„Ċxœ¤Ōœx°mVkƒÑȏšL‚°„x°Xœ°VmĊLVxU˰bX¦VW@kšȯlkn@„¥lnšƒ@»°Ñ¯VmlLUwVK@ƒV@ka@lmXb„UlVlkÈx@™„LVa„VV™wnƒmm@km™@mœIVaݏ@XƒVUݯU@ƒÝ£k»˜K@aUwkKV_ƒ¥„a@alU@nz°aV„È@@±lÛšk@wVakm@т¥„a„z‚@XxÆW@ÛX™@m@ƒy@aWw@kōĉJlbV„JƒzţÆUwVkmWkým@Ul™U@b¯wVºƒU™VUêšĠƒXUaUbVĊUŽWXUmkK™™WnUUU™V™ƒƒVV™Ý@kk±‚™¯ƒƒLkƒš±WkXlVklƒ@ƒwXbmLƒ›VUIVmk@Ubma@kkaVKUƒ™kmlXLWn™J¯ÒĊ°@zkºlLUŤn@@n›ô@lƁnmKkÈlxVw„@@mÈx˜@n²Uxl¤nbVxUzmJƒÒnš"],encodeOffsets:[[104828,25999]]}},{type:"Feature",id:"5307",properties:{name:"丽江市",cp:[100.448,26.955],childNum:5},geometry:{type:"Polygon",coordinates:["@@l@™„@w°ÓUnƒÜѰw@mČóšÝlU»n°„„VÜUbVbm¼@ްxôĸœVW¦¯Ĭlœ˜@zll@b„šWxXš‚a„X@ÆĠÆaXwl@XaƦn¼˜Jn@mnKW¯È»V¯°ak™VanXVwl@VyUĕVU„bÈīlaUk°ƒk¯lƒ²V˜Ukƛô@ƒ„I@mVwĊa„™ƒVaka„™ÆbUŽVLšaXIWKUw™ƒ„aWÑÅKUaVk°ƒ@Uw„ƒ¯¥›XğÝLkm¯Iǃóѯ»™aƒnUl±UĵÿlóÅIƒaU‚±Ik¼UŽVb¯bWxn°™ÒVbnLlޚ@@`kbmIkŽVn„JmnXl›@Ux™bkn@xóLUxVŽƒKóóŐW™™aÅxƒŽ™wƒ@™nÅm™šƒV™„ƒôX„ƒLlVU¤ƒb¦m¼™Ž@ƒbU‚„zUƂ°ÞVb@„Æbnššx"],encodeOffsets:[[101937,28227]]}},{type:"Feature",id:"5328",properties:{name:"西双版纳傣族自治州",cp:[100.8984,21.8628],childNum:3},geometry:{type:"Polygon",coordinates:["@@l²°ŽnÒlxÞ@„nWl„Lĸ™nbV¤V¦kbVV‚¦na„x°Vôa@„šb@lôXlWUšVXČKlmššU@bšWXXܛ°LÈa°LnU°‚ÞnšÑ„ġ°lƒnbšaƒ¯¯KWƒœó@kmK@UšĉV@k°„VV¹„a@y‚_ċl_nÓlL@anI@ƒóWl£VU—ƒl™kĕl™šKVw„U@™kVƒam¯ÅL@bƒ‚Ýk@Vn„UbÇbÝwÅ@ċ¥¯lk‚¼ÅŽ™Ò°b@¦nlUn@ŽÇV„mƁbWôU@ÝÅōm™¯ƒaU™™mk™WWw—@±ƒ™n¯U™è™a™Lƒ¯mƒL™škwƒl@°mnÈÒ¯šów@V™xƒĀU¤°Įƒ°Xl"],encodeOffsets:[[102376,22579]]}},{type:"Feature",id:"5305",properties:{name:"保山市",cp:[99.0637,24.9884],childNum:5},geometry:{type:"Polygon",coordinates:["@@X°„Il‚@¦ƒŽÈ¼m¼ÞaÞÅl„ÈxV¼šlVôÈÆlLޣȺlkUƒ‚ƒUw„¯UĕVwĊ@n¦mlnVĸIWǰLnƒUwl™šV„n@lnU˜„nJށl±U™¯LVUa°Ý„U„ÇĊýšVŤé„LlxÞL„ĀÜl²ĉ°KUaVƒ™_Źé@klw¯ƒlÅ—šW£ÅyU™W@wƒknal¥Uw@w™Uƒƒk¯ƒw¯aW±k_mJa™XVҙĠWb¯L¯Ý@w™wUƒ¯±Wk_ġƒwƒwōKmb@¤„bk°l˃ô„UJƒšVnÅlťUš¯°VbnbWxX„m„ÞššWUĀ™L™yWzÛKmbUxVKkn݃kŽVšĀċ¤Ux„@ޝŽm@ƒ¦"],encodeOffsets:[[100440,25943]]}},{type:"Feature",id:"5304",properties:{name:"玉溪市",cp:[101.9312,23.8898],childNum:9},geometry:{type:"Polygon",coordinates:["@@l„„L°xXlWxXnlw„a„ţlaÞlÆĬnX„ƒ°wVw„l„@m™nw°VVIXllKšbnnV°lbU„UJ@ÈÇKVb—š@bW„°Vk¦kaWb°škxV¤È¼U°ôI@llblš²š@‚@œó@mm@VţkKl¹@yĉ¯°ÑšIXmWKnkšlV„ULlb@lnbVal@UnVJœU‚„nKWa„x„@lkkUlW²X„™‚l„K°„šl²@lšÞUŽ„U‚„UšVšVVXmššlLVnXWVUĉVaVb„W™ğVéšU„VU¹W»aVa„aW™Xƒ‚_U¥nÇ흙@a™lUnǍUyk@@wW@kbW¦UKÝwUmmƒƒLUnVxUVVlk¯mmnƒmkÇaŤ¯I@ƒl@@aĉw°ĕmU—L±ƒk™ÆéX™ÜÛ@yÈç@™Çġ„Ýķ—XmmÝVՙƒ™lmnkbmWkb@nl@nŽmš¯VxkJmUJ„ml¯™°makVVnVƒ¦™Wƒ—Wmnl@xmn„l‚I„¤„n™xU„ƒVUŽmX@˜ƒb@zl@¦Ýþ"],encodeOffsets:[[103703,24874]]}},{type:"Feature",id:"5333",properties:{name:"怒江傈僳族自治州",cp:[99.1516,26.5594],childNum:4},geometry:{type:"Polygon",coordinates:["@@WyX£lWlnnUU™„¥@ţV™Vw„JlÅ@wƒmö󙻂£kml¯U¥n¹Æ@ny@wmU@¯mnamÛnƒšUV¥ÈnĠy²œm¤„@ÆónݚnmlnbÞU‚¥„aV£kU„KWƒ„óšƒmIU¥ókwVólƒ™»¯™ƒL™ƒk@m™naWKÛwóњw@a±n—@VbUJ›LkaƒÝXĉƒ™„UV`lI@lnXÆƑkKmxÛXmlUKVmU²Klw@a™aó„@n™KXwVKU¯V¥mUnkm¥ĉ@UxV˃°Vx„V„klmޙkKWĀkVWšnl°Lnm@°ŽUxlV@nk¦™JVȰŽVÒ@nX°@ÆlUômlnôƒ²nxmłnVV„¯x@Èm°XblVUšl°@xkXU¤WXX‚W„Xƃ„mkÅJmށw±bƒxUīkKmÅVUĖÝèV„kx@š›lX„lnk¤ƒLkŽ‚Ėk¦‚xUššL°‚¯Ė@LnK@b°xVI„¥Ua°Ñ@»nm@¹‚KŎÞÈWln²n"],encodeOffsets:[[101071,28891]]}},{type:"Feature",id:"5331",properties:{name:"德宏傣族景颇族自治州",cp:[98.1299,24.5874],childNum:5},geometry:{type:"Polygon",coordinates:["@@„¥n@°@ƒVwČ£™ÿUlÞ„lmULVwnaÜLXyšzšKVÿ™XݙnƒWƒXwmaUa°¯V™ŦŽÆkUm„™VIƒ„ókĕl¯ƒa@£nama™@¯m¯œó@óyţbġkÅm±ÛammVkƒLwU`Wk@VƒkUmŃlUUKmbkkUVUwƒ¦óް¼šbn°ô¦lºƒz@xšŽ¯„™@UްnƒšU¤ţU„°VƆ@ÈmlnzÞl°¦Æa„xUxƒLkxWƒn@‚š²ŰšW„™‚@°ÈXl°Llx"],encodeOffsets:[[100440,25943]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/zhe_jiang_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"3311",properties:{name:"丽水市",cp:[119.5642,28.1854],childNum:9},geometry:{type:"Polygon",coordinates:["@@@V‚bVl@Xn‚UXƒKVŽ@¦nxlUXV‚n„KVmnL‚UV@bn¤lLXK˜²„`nnlJXIVJ‚I„Vnn°KnnVll@VLXWV@UkVaVK„zV@„ƒšVVaUK@U»VUl@@WnUUƒ@wVLn@Vwl@XW°LVbn@VU‚@X„l`@XnKVbkl@XVJlUnlV„„xlL@lnXl„@VšUnV°°„@a„UVLXblWVXn@VVUV@Lš¤VLV„U‚VbnalLUUVX_laVa„WVzXKV@@a@KUmImmXama@kU@yVIUK‚aVa@kXK@aWU@VIUmW@kkVm„Uš@VwUa@K@k@Uƒ`@kUKVk@UV@VaUm²Vy@klUUWUkVmUa@_ƒKVaXa›XmƒU@mUlWkaUXƒ@mmkL@w™JƒnVVÅbWKXa™@@I@aƒJUUÇ@V„UL™W@akLmb@K@a™XXw@mƒVmUVkUy@£@aU@@VkUWm@kUKƒXUWU_mW@wkkmJUUkLWWUXƒW@IkJ@k@mW_kӃ_Ul™Lƒm@I@aUa¯m@kƒa¯LUJƒ@mVVxUb™a@LUKkXƒbm@Uak@@a@Um`ƒIUbUJ@nUVW@@LnVV@lšUbVlUX@`š@blXklW„Ušm„Xlm¦U@@V¯bml@š@nUb@llnn@VbX@lV@ŽUVULmU@JVn„bVbkb™VWxU@@nUVk@"],encodeOffsets:[[121546,28992]]}},{type:"Feature",id:"3301",properties:{name:"杭州市",cp:[119.5313,29.8773],childNum:6},geometry:{type:"Polygon",coordinates:["@@X@l„°KXXlW„b@²„`šššb‚I„šX`l@„@bWl@n@VnLUV@V„@°¦@šl@XVlU@š@xVbUb@Vkb@‚@XVJVz™J@Lޚ@VmLUxUJ@LU„Vx‚b„xXUl@VaÈw„b‚aÞa@Vl@XUVx@V@V„LlbnV„al@lb„Vnn‚LnKnL@VlbVJXalIšb@KUU@mVInJ˜„U„Vl@xUšVLnUš@UÞaV@lkV@UanK„L@UlKVUnbÆmn@@nUlVnVJl@@UXU„L@WVIVJVxVLXV@IÜKnbn@V¥V@@I@ƒƒ„y°b@UUwnk°ÆƨVlUšçXm›£aƒÇ™IkVƒ@WV@@aWIUWUIkb@WW@UnƒK@UU@kaWVkƒVIVVnU@UWVUV@VmVkKkWIkVWaULU`UImJUImm—U@ƒƒwmwUV™IUWVkUamaU@mV—kƒb@KVU@aVU@anKULVJ‚U@kÛU™JUV›kkƒVakU@ƒaVwkW@UWkXmWaULUaUK@XƒJUUmƒVU@UVƒUkJ@ImwmKU@k„@lU„W@@akKm„kamIkWl_UwVm@UkaVUUaƒ@UamakbWlkL@aUalU@mkL@U@U™lmK@XkKm@Ýakb@xƒnXbƒ`ƒnUUU@›™U@™wU@@ƒmKkkƒV¯U@lULUbVbUb@V‚a@L™ºÝb@bLmK™x@VUL@bk@mxULWl"],encodeOffsets:[[121185,30184]]}},{type:"Feature",id:"3303",properties:{name:"温州市",cp:[120.498,27.8119],childNum:9},geometry:{type:"Polygon",coordinates:["@@ll@xnXV`VX„WVL@lXnlV@UV@@b@¤VzUlnV„U@nWxšW@b@LnalK@bšXVKUƒÈ@VV„I@b@Jš@WbXLÆaUU„mšI@xlKnn„@VWlbkXV‚@n„VWnœ‚WbUb„L@`VbUnVlVXkV@lUz±‚VnUbU@@VUlVL@l„_@V@l@LVbV@XLV`VÈlxn@lU@aœaVV‚k„@XJ@nl@@LU`°LVb„L°a@a„UVy@anI@a„a‚nV@²wÜJX@VšVV°k„na@WVk„aWwU@m@™ƒkƒaUĕ™ÝšÝŤnÈa„aóI›»@±X™WkUķ@kV±kw™ƒUkWw„™UƒÝ»ÛkɳlImaUaWóXÿǬk‚UnWVmmk™KţnŏÞğl™„UlUx@XWb„V@JkXƒ°mb@VULVxUVk@@LWWk@WIkšƒUkJmUkVmI@yƒ@Ua™kLm‚U@mUUUkaVk™@mK@UlUU@UmKmbUUUJ@n@KVLUL@VkJWXX`mnULWlkL@JVLVb@°kxkU@LVŽ™V@„VLV`UL@VUX"],encodeOffsets:[[122502,28334]]}},{type:"Feature",id:"3302",properties:{name:"宁波市",cp:[121.5967,29.6466],childNum:6},geometry:{type:"Polygon",coordinates:["@@Ċ¦ĸ°‚nXÞVšKškƨƑźÿ°»n„@wô¥ÜbœU°ÆXÞWóçĉݱIUƒÈ¥@U°wÆ»²mm_@aXƒVKÞVlk@akk›̅@£X»VwƏXWa¯aȗb™KƽۃĊ™xƒLóŽk@ƒƒƒ@¯nƒKUL@xkL›ÑkWULUUmJUXVŽU@mŽUX¯@V`mbXbV@@nn¤WXšx@škJ@nVVUVl²UbÝVUVk@Wx@V@„ƒVXzmlaƒL@VlLU`„XUVVVUnl@VbnJlnUVVnƒlUKkbmnn„VxlJnxmbU@UL@KUV™X@xmb@lk@mnVVUš™è"],encodeOffsets:[[123784,30977]]}},{type:"Feature",id:"3309",properties:{name:"舟山市",cp:[122.2559,30.2234],childNum:3},geometry:{type:"Polygon",coordinates:["@@l΢ƒʠþÆVĢLĊƒǬXĊ܄XôV„ÑÆw„ƒlšƏÈóVĭVǓ@ƒĉwɛkmK@ĉXīWaĉUĵÝmƒ¯ĉƒwĉ±±nż¯x@VǦV„²JĊÞôèÝXÅW¯›VÛaó¦@xƒŽmޝ¼ŹĀ"], +encodeOffsets:[[124437,30983]]}},{type:"Feature",id:"3310",properties:{name:"台州市",cp:[121.1353,28.6688],childNum:7},geometry:{type:"Polygon",coordinates:["@@lV„IVWVz@bXJl@Xal@°„nLll@nVxnV„K@UJVbƒ¦°„k`UIWJXnƚ@bUJ„Xl@lb„Wn@UzVV@bVVšmVnnJVXna‚bšKUKnUVVUnVLlKVLXa„Jm£@mU@WanaU_°@VWnV@UVWnIVVVKlXœÒlK@wVK„L°m„@„„l@ô„Kšw„ĉƾůUƒl£@»UƒVk„m@ƅUƒƒaÛIŏmUk@m„w@a™£ƒWk@ţšƒIm±@ankôUlaU™Uw¯ƒōaƒbÇbţm™ÞšÞVĖ„b„l@š@n‚VXxƒbUl@XmbƒŽ¯lUUU™W@ÛI±xU@mƒb@bmJ@bUzƒV@b¯bƒKUa¯KV_@Kk@@mWIƒ@lUU›b@bkVm@kwUÇU_WKU@Ux™@ƒVUnllX@Vn‚J@UXV@bWL@lUbbVLUJ@z‚V@lnbWbnnnJVŽ@L"],encodeOffsets:[[123312,29526]]}},{type:"Feature",id:"3307",properties:{name:"金华市",cp:[120.0037,29.1028],childNum:8},geometry:{type:"Polygon",coordinates:["@@nbVb„@VbUVlb@VUnVxk`lXnJlbnƒlL@bX@Vƒ@klƒV@nLnx@JlI„V‚U@VUVn„VV„I@WVLVbVKXbWnXl@VlXUx„b@ŽlVUbl„œlVUšIÜVnalKX@@bV@@aUUlUƒwUw„@naWW„UVaUUšaVb„LlxXJVk°ƒUƒlkU¥@k„a@LVlXLVlšVWznVn@lxšJl_@WX_@mVa„a@alU@kVVna„KVLlK„b@UUaVašbnUWmXU@k@yVI@ařWmXIVJl_¯ƒ„¥UaVI@ƒLmUUw@mkkmK¯ƒk@Wbk@WI@aUyUXƒJkU@bU@WLUyƒXUbkbW`UVVkKmbUaVUƒUK™£@KVUUUm@UWkXWaUKƒV@b¯ƒ¯mU™V@UkƒmW@kkKƒwUƒmkkVUI@WlkUamL@Wk_Wƒ@UVm@Ua¯KWXk@Uxm@UK@xV„mV@Xk@UVV¼@‚VLUb™Uƒ„U@ƒyULUbVlU@@XlVUVVbƒU@lXXVW@XUVl@@VUVƒÈn@VVU„@lVa@„U„mL@`X@`WL@VUX@lUL@xlx"],encodeOffsets:[[122119,29948]]}},{type:"Feature",id:"3308",properties:{name:"衢州市",cp:[118.6853,28.8666],childNum:5},geometry:{type:"Polygon",coordinates:["@@XkVKnwl@@aVK@UšwnL‚K@aÞaš¹@Kb@UVaUaVaVK@k°V„UllnL@„V@šxV@œšV@VV„m„_Wa„m@wlaÞbn@lL@WnLšk@V@VlK@nkVVb@blKXklakw@wVK@kVW@UXK@_‚W@_nKVƒ@ƒUb@kVƒUUm@„ÇVU@Uk@VU@WUXWW@k„VUaVUkU@WWXUKk@Ukmm¯LmmƒUJUIWJkImmƒ_—±WLkKm£@aVUmKUnƒLmWUkVmw@¥U„LVWm@WUka@UmmLmm@@bUX™@@WUIm@UVUK@UVUUU™VVJmb@b„Xn‚mVƒ¼nnn¦mJUVƒL„V@VW@UzUlVnUbl`UnVl@XU@kl@bmÈUx™Vk@@J@„ƒ¼W@ÅaVVnzmVƒ„@WJk@kWJ@ƒlXbWbXxmVnšlLXb@°lKVXnWšbWV„„X„mbV@Xl‚bšI@Kn@@x@šVLlm"],encodeOffsets:[[121185,30184]]}},{type:"Feature",id:"3306",properties:{name:"绍兴市",cp:[120.564,29.7565],childNum:6},geometry:{type:"Polygon",coordinates:["@@„x@„˜VnnVJnIVJV_VKXblUXJlŽlLUŽUnU@UVVX@ŽmVUUUJl„XUlbV@@V„LVmX@@XlaVJVXXJ@b‚@XU„@lUšJ„È‚bœ¤Ō„JšçV™UUnml@@kna@wšWVU@LVKV@namwkIUwmƒnmlaVL„kUmVUkmmIUak@VmUUVUƒWV_kK@U„K‚bnkWy„U@ƒ@UXwl@VUÞUVak±VUUU@mlI@™™wXWƒIWbUKkLUKVmUUmVVL™LambUWmIUm™nUU@aUUVym@ƒXkak@ƒW@z@lWVXnmV™aUbVb@VƒakLUKƒLmbUU@lkV@bƒbUb@nW`@Xk`™Ikwm@mUXy™UUkWKUk@Kƒb@lV¦klV„¯„UlWIkwƒKUa™bVVUbƒVXXmbƒ@Vx„xkVVV@bU@@aW@kLmb@lVUIVKmL@bUV@bUV@L„a˜lnUV@nbVbUlVXšJVUnx"],encodeOffsets:[[122997,30561]]}},{type:"Feature",id:"3304",properties:{name:"嘉兴市",cp:[120.9155,30.6354],childNum:6},geometry:{type:"Polygon",coordinates:["@@@blIX@@VÜVUnn@l‚k„lKnI°Þl`²LVKVbnbVaVLUVn@W¦@VkVVb„@VI„`@blLnL‚aX@„VVb@U‚@XlVa„@@kVaUKV»U_lWXUƒƒ@alb„k@VllnLVKn@@UVIUw@y°IVVXU@VV@lw„m@wVkƾaœJ‚LkΡƧƒ™l™LÝUmW¯ķÿĉ¥ƒIŋŽWn™èkVƧU¯ÅmlVx@V¯aƒz„Ž@„@JU@U¦m@@šnVmn@V„LV‚"],encodeOffsets:[[123233,31382]]}},{type:"Feature",id:"3305",properties:{name:"湖州市",cp:[119.8608,30.7782],childNum:4},geometry:{type:"Polygon",coordinates:["@@kLlƒkm@VmÛU@UW@kJ@aUƒK@UnmmU@™maÛL@JWUUKUwUIUJ@XƒKWV@Vk@UIUmVk@mm@ÅnmaUVkL@VƒKmLVbU@klU@ÝbV™@mVUKV™@wUkVƒ—ƒmIUJ@nVV@L™akJWbUIka@UmKmLKmmƒUUVk@@nmLX`WXUV@Ž@nUl™kmlU@Ub„„ƒxVVšIlV„Žšnn„@@n˜„UҚ@„°n@@xmb@„VbnV@šš„@b@`@L@L@x@blVklVbnnV@‚aXb°VlU@W„b°U„LXWVUV™„™VwÈwÜ»ĸaĠnUVw²X@V@lVU@wlaUUVm@knUV›"],encodeOffsets:[[123379,31500]]}}],UTF8Encoding:!0}}),i("echarts/chart/gauge",["require","./base","../util/shape/GaugePointer","zrender/shape/Text","zrender/shape/Line","zrender/shape/Rectangle","zrender/shape/Circle","zrender/shape/Sector","../config","../util/ecData","../util/accMath","zrender/tool/util","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("../util/shape/GaugePointer"),a=e("zrender/shape/Text"),o=e("zrender/shape/Line"),r=e("zrender/shape/Rectangle"),s=e("zrender/shape/Circle"),l=e("zrender/shape/Sector"),h=e("../config");h.gauge={zlevel:0,z:2,center:["50%","50%"],clickable:!0,legendHoverLink:!0,radius:"75%",startAngle:225,endAngle:-45,min:0,max:100,splitNumber:10,axisLine:{show:!0,lineStyle:{color:[[.2,"#228b22"],[.8,"#48b"],[1,"#ff4500"]],width:30}},axisTick:{show:!0,splitNumber:5,length:8,lineStyle:{color:"#eee",width:1,type:"solid"}},axisLabel:{show:!0,textStyle:{color:"auto"}},splitLine:{show:!0,length:30,lineStyle:{color:"#eee",width:2,type:"solid"}},pointer:{show:!0,length:"80%",width:8,color:"auto"},title:{show:!0,offsetCenter:[0,"-40%"],textStyle:{color:"#333",fontSize:15}},detail:{show:!0,backgroundColor:"rgba(0,0,0,0)",borderWidth:0,borderColor:"#ccc",width:100,height:40,offsetCenter:[0,"40%"],textStyle:{color:"auto",fontSize:30}}};var m=e("../util/ecData"),V=e("../util/accMath"),U=e("zrender/tool/util");return t.prototype={type:h.CHART_TYPE_GAUGE,_buildShape:function(){var e=this.series;this._paramsMap={},this.selectedMap={};for(var t=0,i=e.length;i>t;t++)e[t].type===h.CHART_TYPE_GAUGE&&(this.selectedMap[e[t].name]=!0,e[t]=this.reformOption(e[t]),this.legendHoverLink=e[t].legendHoverLink||this.legendHoverLink,this._buildSingleGauge(t),this.buildMark(t));this.addShapeList()},_buildSingleGauge:function(e){var t=this.series[e];this._paramsMap[e]={center:this.parseCenter(this.zr,t.center),radius:this.parseRadius(this.zr,t.radius),startAngle:t.startAngle.toFixed(2)-0,endAngle:t.endAngle.toFixed(2)-0},this._paramsMap[e].totalAngle=this._paramsMap[e].startAngle-this._paramsMap[e].endAngle,this._colorMap(e),this._buildAxisLine(e),this._buildSplitLine(e),this._buildAxisTick(e),this._buildAxisLabel(e),this._buildPointer(e),this._buildTitle(e),this._buildDetail(e)},_buildAxisLine:function(e){var t=this.series[e];if(t.axisLine.show)for(var i,n,a=t.min,o=t.max-a,r=this._paramsMap[e],s=r.center,l=r.startAngle,h=r.totalAngle,V=r.colorArray,U=t.axisLine.lineStyle,d=this.parsePercent(U.width,r.radius[1]),p=r.radius[1],c=p-d,u=l,y=0,g=V.length;g>y;y++)n=l-h*(V[y][0]-a)/o,i=this._getSector(s,c,p,n,u,V[y][1],U,t.zlevel,t.z),u=n,i._animationAdd="r",m.set(i,"seriesIndex",e),m.set(i,"dataIndex",y),this.shapeList.push(i)},_buildSplitLine:function(e){var t=this.series[e];if(t.splitLine.show)for(var i,n,a,r=this._paramsMap[e],s=t.splitNumber,l=t.min,h=t.max-l,m=t.splitLine,V=this.parsePercent(m.length,r.radius[1]),U=m.lineStyle,d=U.color,p=r.center,c=r.startAngle*Math.PI/180,u=r.totalAngle*Math.PI/180,y=r.radius[1],g=y-V,b=0;s>=b;b++)i=c-u/s*b,n=Math.sin(i),a=Math.cos(i),this.shapeList.push(new o({zlevel:t.zlevel,z:t.z+1,hoverable:!1,style:{xStart:p[0]+a*y,yStart:p[1]-n*y,xEnd:p[0]+a*g,yEnd:p[1]-n*g,strokeColor:"auto"===d?this._getColor(e,l+h/s*b):d,lineType:U.type,lineWidth:U.width,shadowColor:U.shadowColor,shadowBlur:U.shadowBlur,shadowOffsetX:U.shadowOffsetX,shadowOffsetY:U.shadowOffsetY}}))},_buildAxisTick:function(e){var t=this.series[e];if(t.axisTick.show)for(var i,n,a,r=this._paramsMap[e],s=t.splitNumber,l=t.min,h=t.max-l,m=t.axisTick,V=m.splitNumber,U=this.parsePercent(m.length,r.radius[1]),d=m.lineStyle,p=d.color,c=r.center,u=r.startAngle*Math.PI/180,y=r.totalAngle*Math.PI/180,g=r.radius[1],b=g-U,f=0,k=s*V;k>=f;f++)f%V!==0&&(i=u-y/k*f,n=Math.sin(i),a=Math.cos(i),this.shapeList.push(new o({zlevel:t.zlevel,z:t.z+1,hoverable:!1,style:{xStart:c[0]+a*g,yStart:c[1]-n*g,xEnd:c[0]+a*b,yEnd:c[1]-n*b,strokeColor:"auto"===p?this._getColor(e,l+h/k*f):p,lineType:d.type,lineWidth:d.width,shadowColor:d.shadowColor,shadowBlur:d.shadowBlur,shadowOffsetX:d.shadowOffsetX,shadowOffsetY:d.shadowOffsetY}})))},_buildAxisLabel:function(e){var t=this.series[e];if(t.axisLabel.show)for(var i,n,o,r,s=t.splitNumber,l=t.min,h=t.max-l,m=t.axisLabel.textStyle,U=this.getFont(m),d=m.color,p=this._paramsMap[e],c=p.center,u=p.startAngle,y=p.totalAngle,g=p.radius[1]-this.parsePercent(t.splitLine.length,p.radius[1])-5,b=0;s>=b;b++)r=V.accAdd(l,V.accMul(V.accDiv(h,s),b)),i=u-y/s*b,n=Math.sin(i*Math.PI/180),o=Math.cos(i*Math.PI/180),i=(i+360)%360,this.shapeList.push(new a({zlevel:t.zlevel,z:t.z+1,hoverable:!1,style:{x:c[0]+o*g,y:c[1]-n*g,color:"auto"===d?this._getColor(e,r):d,text:this._getLabelText(t.axisLabel.formatter,r),textAlign:i>=110&&250>=i?"left":70>=i||i>=290?"right":"center",textBaseline:i>=10&&170>=i?"top":i>=190&&350>=i?"bottom":"middle",textFont:U,shadowColor:m.shadowColor,shadowBlur:m.shadowBlur,shadowOffsetX:m.shadowOffsetX,shadowOffsetY:m.shadowOffsetY}}))},_buildPointer:function(e){var t=this.series[e];if(t.pointer.show){var i=t.max-t.min,a=t.pointer,o=this._paramsMap[e],r=this.parsePercent(a.length,o.radius[1]),l=this.parsePercent(a.width,o.radius[1]),h=o.center,V=this._getValue(e);V=V2?2:l/2,color:"#fff"}});m.pack(p,this.series[e],e,this.series[e].data[0],0,this.series[e].data[0].name,V),this.shapeList.push(p),this.shapeList.push(new s({zlevel:t.zlevel,z:t.z+2,hoverable:!1,style:{x:h[0],y:h[1],r:a.width/2.5,color:"#fff"}}))}},_buildTitle:function(e){var t=this.series[e];if(t.title.show){var i=t.data[0],n=null!=i.name?i.name:"";if(""!==n){var o=t.title,r=o.offsetCenter,s=o.textStyle,l=s.color,h=this._paramsMap[e],m=h.center[0]+this.parsePercent(r[0],h.radius[1]),V=h.center[1]+this.parsePercent(r[1],h.radius[1]);this.shapeList.push(new a({zlevel:t.zlevel,z:t.z+(Math.abs(m-h.center[0])+Math.abs(V-h.center[1])<2*s.fontSize?2:1),hoverable:!1,style:{x:m,y:V,color:"auto"===l?this._getColor(e):l,text:n,textAlign:"center",textFont:this.getFont(s),shadowColor:s.shadowColor,shadowBlur:s.shadowBlur,shadowOffsetX:s.shadowOffsetX,shadowOffsetY:s.shadowOffsetY}}))}}},_buildDetail:function(e){var t=this.series[e];if(t.detail.show){var i=t.detail,n=i.offsetCenter,a=i.backgroundColor,o=i.textStyle,s=o.color,l=this._paramsMap[e],h=this._getValue(e),m=l.center[0]-i.width/2+this.parsePercent(n[0],l.radius[1]),V=l.center[1]+this.parsePercent(n[1],l.radius[1]);this.shapeList.push(new r({zlevel:t.zlevel,z:t.z+(Math.abs(m+i.width/2-l.center[0])+Math.abs(V+i.height/2-l.center[1])r;r++)o.push([a[r][0]*n+i,a[r][1]]);this._paramsMap[e].colorArray=o},_getColor:function(e,t){null==t&&(t=this._getValue(e));for(var i=this._paramsMap[e].colorArray,n=0,a=i.length;a>n;n++)if(i[n][0]>=t)return i[n][1];return i[i.length-1][1]},_getSector:function(e,t,i,n,a,o,r,s,h){return new l({zlevel:s,z:h,hoverable:!1,style:{x:e[0],y:e[1],r0:t,r:i,startAngle:n,endAngle:a,brushType:"fill",color:o,shadowColor:r.shadowColor,shadowBlur:r.shadowBlur,shadowOffsetX:r.shadowOffsetX,shadowOffsetY:r.shadowOffsetY}})},_getLabelText:function(e,t){if(e){if("function"==typeof e)return e.call(this.myChart,t);if("string"==typeof e)return e.replace("{value}",t)}return t},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()}},U.inherits(t,i),e("../chart").define("gauge",t),t}),i("echarts/util/shape/GaugePointer",["require","zrender/shape/Base","zrender/tool/util","./normalIsCover"],function(e){function t(e){i.call(this,e)}var i=e("zrender/shape/Base"),n=e("zrender/tool/util");return t.prototype={type:"gauge-pointer",buildPath:function(e,t){var i=t.r,n=t.width,a=t.angle,o=t.x-Math.cos(a)*n*(n>=i/3?1:2),r=t.y+Math.sin(a)*n*(n>=i/3?1:2);a=t.angle-Math.PI/2,e.moveTo(o,r),e.lineTo(t.x+Math.cos(a)*n,t.y-Math.sin(a)*n),e.lineTo(t.x+Math.cos(t.angle)*i,t.y-Math.sin(t.angle)*i),e.lineTo(t.x-Math.cos(a)*n,t.y+Math.sin(a)*n),e.lineTo(o,r)},getRect:function(e){if(e.__rect)return e.__rect;var t=2*e.width,i=e.x,n=e.y,a=i+Math.cos(e.angle)*e.r,o=n-Math.sin(e.angle)*e.r;return e.__rect={x:Math.min(i,a)-t,y:Math.min(n,o)-t,width:Math.abs(i-a)+t,height:Math.abs(n-o)+t},e.__rect},isCover:e("./normalIsCover")},n.inherits(t,i),t}),i("echarts/chart/funnel",["require","./base","zrender/shape/Text","zrender/shape/Line","zrender/shape/Polygon","../config","../util/ecData","../util/number","zrender/tool/util","zrender/tool/color","zrender/tool/area","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Line"),o=e("zrender/shape/Polygon"),r=e("../config");r.funnel={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,x:80,y:60,x2:80,y2:60,min:0,max:100,minSize:"0%",maxSize:"100%",sort:"descending",gap:0,funnelAlign:"center",itemStyle:{normal:{borderColor:"#fff",borderWidth:1,label:{show:!0,position:"outer"},labelLine:{show:!0,length:10,lineStyle:{width:1,type:"solid"}}},emphasis:{borderColor:"rgba(0,0,0,0)",borderWidth:1,label:{show:!0},labelLine:{show:!0}}}};var s=e("../util/ecData"),l=e("../util/number"),h=e("zrender/tool/util"),m=e("zrender/tool/color"),V=e("zrender/tool/area");return t.prototype={type:r.CHART_TYPE_FUNNEL,_buildShape:function(){var e=this.series,t=this.component.legend;this._paramsMap={},this._selected={},this.selectedMap={};for(var i,n=0,a=e.length;a>n;n++)if(e[n].type===r.CHART_TYPE_FUNNEL){if(e[n]=this.reformOption(e[n]),this.legendHoverLink=e[n].legendHoverLink||this.legendHoverLink,i=e[n].name||"",this.selectedMap[i]=t?t.isSelected(i):!0,!this.selectedMap[i])continue;this._buildSingleFunnel(n),this.buildMark(n)}this.addShapeList()},_buildSingleFunnel:function(e){var t=this.component.legend,i=this.series[e],n=this._mapData(e),a=this._getLocation(e);this._paramsMap[e]={location:a,data:n};for(var o,r=0,s=[],h=0,m=n.length;m>h;h++)o=n[h].name,this.selectedMap[o]=t?t.isSelected(o):!0,this.selectedMap[o]&&!isNaN(n[h].value)&&(s.push(n[h]),r++);if(0!==r){for(var V,U,d,p,c=this._buildFunnelCase(e),u=i.funnelAlign,y=i.gap,g=r>1?(a.height-(r-1)*y)/r:a.height,b=a.y,f="descending"===i.sort?this._getItemWidth(e,s[0].value):l.parsePercent(i.minSize,a.width),k="descending"===i.sort?1:0,x=a.centerX,_=[],h=0,m=s.length;m>h;h++)if(o=s[h].name,this.selectedMap[o]&&!isNaN(s[h].value)){switch(V=m-2>=h?this._getItemWidth(e,s[h+k].value):"descending"===i.sort?l.parsePercent(i.minSize,a.width):l.parsePercent(i.maxSize,a.width),u){case"left":U=a.x;break;case"right":U=a.x+a.width-f;break;default:U=x-f/2}d=this._buildItem(e,s[h]._index,t?t.getColor(o):this.zr.getColor(s[h]._index),U,b,f,V,g,u),b+=g+y,p=d.style.pointList,_.unshift([p[0][0]-10,p[0][1]]),_.push([p[1][0]+10,p[1][1]]),0===h&&(0===f?(p=_.pop(),"center"==u&&(_[0][0]+=10),"right"==u&&(_[0][0]=p[0]),_[0][1]-="center"==u?10:15,1==m&&(p=d.style.pointList)):(_[_.length-1][1]-=5,_[0][1]-=5)),f=V}c&&(_.unshift([p[3][0]-10,p[3][1]]),_.push([p[2][0]+10,p[2][1]]),0===f?(p=_.pop(),"center"==u&&(_[0][0]+=10),"right"==u&&(_[0][0]=p[0]),_[0][1]+="center"==u?10:15):(_[_.length-1][1]+=5,_[0][1]+=5),c.style.pointList=_)}},_buildFunnelCase:function(e){var t=this.series[e];if(this.deepQuery([t,this.option],"calculable")){var i=this._paramsMap[e].location,n=10,a={hoverable:!1,style:{pointListd:[[i.x-n,i.y-n],[i.x+i.width+n,i.y-n],[i.x+i.width+n,i.y+i.height+n],[i.x-n,i.y+i.height+n]],brushType:"stroke",lineWidth:1,strokeColor:t.calculableHolderColor||this.ecTheme.calculableHolderColor||r.calculableHolderColor}};return s.pack(a,t,e,void 0,-1),this.setCalculable(a),a=new o(a),this.shapeList.push(a),a}},_getLocation:function(e){var t=this.series[e],i=this.zr.getWidth(),n=this.zr.getHeight(),a=this.parsePercent(t.x,i),o=this.parsePercent(t.y,n),r=null==t.width?i-a-this.parsePercent(t.x2,i):this.parsePercent(t.width,i);return{x:a,y:o,width:r,height:null==t.height?n-o-this.parsePercent(t.y2,n):this.parsePercent(t.height,n),centerX:a+r/2}},_mapData:function(e){function t(e,t){return"-"===e.value?1:"-"===t.value?-1:t.value-e.value}function i(e,i){return-t(e,i)}for(var n=this.series[e],a=h.clone(n.data),o=0,r=a.length;r>o;o++)a[o]._index=o;return"none"!=n.sort&&a.sort("descending"===n.sort?t:i),a},_buildItem:function(e,t,i,n,a,o,r,l,h){var m=this.series,V=m[e],U=V.data[t],d=this.getPolygon(e,t,i,n,a,o,r,l,h);s.pack(d,m[e],e,m[e].data[t],t,m[e].data[t].name),this.shapeList.push(d);var p=this.getLabel(e,t,i,n,a,o,r,l,h);s.pack(p,m[e],e,m[e].data[t],t,m[e].data[t].name),this.shapeList.push(p),this._needLabel(V,U,!1)||(p.invisible=!0);var c=this.getLabelLine(e,t,i,n,a,o,r,l,h);this.shapeList.push(c),this._needLabelLine(V,U,!1)||(c.invisible=!0);var u=[],y=[];return this._needLabelLine(V,U,!0)&&(u.push(c.id),y.push(c.id)),this._needLabel(V,U,!0)&&(u.push(p.id),y.push(d.id)),d.hoverConnect=u,p.hoverConnect=y,d},_getItemWidth:function(e,t){var i=this.series[e],n=this._paramsMap[e].location,a=i.min,o=i.max,r=l.parsePercent(i.minSize,n.width),s=l.parsePercent(i.maxSize,n.width);return(t-a)*(s-r)/(o-a)+r},getPolygon:function(e,t,i,n,a,r,s,l,h){var V,U=this.series[e],d=U.data[t],p=[d,U],c=this.deepMerge(p,"itemStyle.normal")||{},u=this.deepMerge(p,"itemStyle.emphasis")||{},y=this.getItemStyleColor(c.color,e,t,d)||i,g=this.getItemStyleColor(u.color,e,t,d)||("string"==typeof y?m.lift(y,-.2):y);switch(h){case"left":V=n;break;case"right":V=n+(r-s);break;default:V=n+(r-s)/2}var b={zlevel:U.zlevel,z:U.z,clickable:this.deepQuery(p,"clickable"),style:{pointList:[[n,a],[n+r,a],[V+s,a+l],[V,a+l]],brushType:"both",color:y,lineWidth:c.borderWidth,strokeColor:c.borderColor},highlightStyle:{color:g,lineWidth:u.borderWidth,strokeColor:u.borderColor}};return this.deepQuery([d,U,this.option],"calculable")&&(this.setCalculable(b),b.draggable=!0),new o(b)},getLabel:function(e,t,i,a,o,r,s,l,U){var d,p=this.series[e],c=p.data[t],u=this._paramsMap[e].location,y=h.merge(h.clone(c.itemStyle)||{},p.itemStyle),g="normal",b=y[g].label,f=b.textStyle||{},k=y[g].labelLine.length,x=this.getLabelText(e,t,g),_=this.getFont(f),L=i;b.position=b.position||y.normal.label.position,"inner"===b.position||"inside"===b.position||"center"===b.position?(d=U,L=Math.max(r,s)/2>V.getTextWidth(x,_)?"#fff":m.reverse(i)):d="left"===b.position?"right":"left";var W={zlevel:p.zlevel,z:p.z+1,style:{x:this._getLabelPoint(b.position,a,u,r,s,k,U),y:o+l/2,color:f.color||L,text:x,textAlign:f.align||d,textBaseline:f.baseline||"middle",textFont:_}};return g="emphasis",b=y[g].label||b,f=b.textStyle||f,k=y[g].labelLine.length||k,b.position=b.position||y.normal.label.position,x=this.getLabelText(e,t,g),_=this.getFont(f),L=i,"inner"===b.position||"inside"===b.position||"center"===b.position?(d=U,L=Math.max(r,s)/2>V.getTextWidth(x,_)?"#fff":m.reverse(i)):d="left"===b.position?"right":"left",W.highlightStyle={x:this._getLabelPoint(b.position,a,u,r,s,k,U),color:f.color||L,text:x,textAlign:f.align||d,textFont:_,brushType:"fill"},new n(W)},getLabelText:function(e,t,i){var n=this.series,a=n[e],o=a.data[t],r=this.deepQuery([o,a],"itemStyle."+i+".label.formatter");return r?"function"==typeof r?r.call(this.myChart,{seriesIndex:e,seriesName:a.name||"",series:a,dataIndex:t,data:o,name:o.name,value:o.value}):"string"==typeof r?r=r.replace("{a}","{a0}").replace("{b}","{b0}").replace("{c}","{c0}").replace("{a0}",a.name).replace("{b0}",o.name).replace("{c0}",o.value):void 0:o.name},getLabelLine:function(e,t,i,n,o,r,s,l,m){var V=this.series[e],U=V.data[t],d=this._paramsMap[e].location,p=h.merge(h.clone(U.itemStyle)||{},V.itemStyle),c="normal",u=p[c].labelLine,y=p[c].labelLine.length,g=u.lineStyle||{},b=p[c].label;b.position=b.position||p.normal.label.position;var f={zlevel:V.zlevel,z:V.z+1,hoverable:!1,style:{xStart:this._getLabelLineStartPoint(n,d,r,s,m),yStart:o+l/2,xEnd:this._getLabelPoint(b.position,n,d,r,s,y,m),yEnd:o+l/2,strokeColor:g.color||i,lineType:g.type,lineWidth:g.width}};return c="emphasis",u=p[c].labelLine||u,y=p[c].labelLine.length||y,g=u.lineStyle||g,b=p[c].label||b,b.position=b.position,f.highlightStyle={xEnd:this._getLabelPoint(b.position,n,d,r,s,y,m),strokeColor:g.color||i,lineType:g.type,lineWidth:g.width},new a(f)},_getLabelPoint:function(e,t,i,n,a,o,r){switch(e="inner"===e||"inside"===e?"center":e){case"center":return"center"==r?t+n/2:"left"==r?t+10:t+n-10;case"left":return"auto"===o?i.x-10:"center"==r?i.centerX-Math.max(n,a)/2-o:"right"==r?t-(a>n?a-n:0)-o:i.x-o;default:return"auto"===o?i.x+i.width+10:"center"==r?i.centerX+Math.max(n,a)/2+o:"right"==r?i.x+i.width+o:t+Math.max(n,a)+o}},_getLabelLineStartPoint:function(e,t,i,n,a){return"center"==a?t.centerX:n>i?e+Math.min(i,n)/2:e+Math.max(i,n)/2},_needLabel:function(e,t,i){return this.deepQuery([t,e],"itemStyle."+(i?"emphasis":"normal")+".label.show")},_needLabelLine:function(e,t,i){return this.deepQuery([t,e],"itemStyle."+(i?"emphasis":"normal")+".labelLine.show")},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()}},h.inherits(t,i),e("../chart").define("funnel",t),t}),i("echarts/chart/eventRiver",["require","./base","../layout/eventRiver","zrender/shape/Polygon","../component/axis","../component/grid","../component/dataZoom","../config","../util/ecData","../util/date","zrender/tool/util","zrender/tool/color","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o);var r=this;r._ondragend=function(){r.isDragend=!0},this.refresh(a)}var i=e("./base"),n=e("../layout/eventRiver"),a=e("zrender/shape/Polygon");e("../component/axis"),e("../component/grid"),e("../component/dataZoom");var o=e("../config");o.eventRiver={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,itemStyle:{normal:{borderColor:"rgba(0,0,0,0)",borderWidth:1,label:{show:!0,position:"inside",formatter:"{b}"}},emphasis:{borderColor:"rgba(0,0,0,0)",borderWidth:1,label:{show:!0}}}};var r=e("../util/ecData"),s=e("../util/date"),l=e("zrender/tool/util"),h=e("zrender/tool/color");return t.prototype={type:o.CHART_TYPE_EVENTRIVER,_buildShape:function(){var e=this.series;this.selectedMap={},this._dataPreprocessing();for(var t=this.component.legend,i=[],a=0;an;n++)if(i[n].type===this.type){e=this.component.xAxis.getAxis(i[n].xAxisIndex||0);for(var o=0,r=i[n].data.length;r>o;o++){t=i[n].data[o].evolution;for(var l=0,h=t.length;h>l;l++)t[l].timeScale=e.getCoord(s.getNewDate(t[l].time)-0),t[l].valueScale=Math.pow(t[l].value,.8)}}this._intervalX=Math.round(this.component.grid.getWidth()/40)},_drawEventRiver:function(){for(var e=this.series,t=0;ta)){for(var o=[],r=[],s=0;a>s;s++)o.push(n[s].timeScale),r.push(n[s].valueScale);var l=[];l.push([o[0],i]);var s=0;for(s=0;a-1>s;s++)l.push([(o[s]+o[s+1])/2,r[s]/-2+i]);for(l.push([(o[s]+(o[s]+t))/2,r[s]/-2+i]),l.push([o[s]+t,i]),l.push([(o[s]+(o[s]+t))/2,r[s]/2+i]),s=a-1;s>0;s--)l.push([(o[s]+o[s-1])/2,r[s-1]/2+i]);return l}},ondragend:function(e,t){this.isDragend&&e.target&&(t.dragOut=!0,t.dragIn=!0,t.needRefresh=!1,this.isDragend=!1)},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()}},l.inherits(t,i),e("../chart").define("eventRiver",t),t}),i("echarts/layout/eventRiver",["require"],function(){function e(e,i,o){function r(e,t){var i=e.importance,n=t.importance;return i>n?-1:n>i?1:0}for(var s=4,l=0;l=e)return[0];for(var t=[];e--;)t.push(0);return t}(),u=c.slice(0),y=[],g=0,b=0,l=0;l.5?.5:1,r=t.y,s=(t.height-n)/i,l=0,h=e.length;h>l;l++){var m=e[l];m.y=r+s*m.y+m._offset*o,delete m.time,delete m.value,delete m.xpx,delete m.ypx,delete m._offset;for(var V=m.evolution,U=0,d=V.length;d>U;U++)V[U].valueScale*=s}}function i(e,t,i,n){if(e===i)throw new Error("x0 is equal with x1!!!");if(t===n)return function(){return t};var a=(t-n)/(e-i),o=(n*e-t*i)/(e-i);return function(e){return a*e+o}}function n(e,t,n){var a=~~t,o=e.time.length;e.xpx=[],e.ypx=[];for(var r,s=0,l=0,h=0,m=0,V=0;o>s;s++){l=~~e.time[s],m=e.value[s]/2,s===o-1?(h=l+a,V=0):(h=~~e.time[s+1],V=e.value[s+1]/2),r=i(l,m,h,V);for(var U=l;h>U;U++)e.xpx.push(U-n),e.ypx.push(r(U))}e.xpx.push(h-n),e.ypx.push(V)}function a(e,t,i){for(var n,a=0,o=t.xpx.length,r=0;o>r;r++)n=i(t,r),a=Math.max(a,n+e[t.xpx[r]]);for(r=0;o>r;r++)n=i(t,r),e[t.xpx[r]]=a+n;return a}return e}),i("echarts/chart/venn",["require","./base","zrender/shape/Text","zrender/shape/Circle","zrender/shape/Path","../config","../util/ecData","zrender/tool/util","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Circle"),o=e("zrender/shape/Path"),r=e("../config");r.venn={zlevel:0,z:1,calculable:!1};var s=e("../util/ecData"),l=e("zrender/tool/util");return t.prototype={type:r.CHART_TYPE_VENN,_buildShape:function(){this.selectedMap={},this._symbol=this.option.symbolList,this._queryTarget,this._dropBoxList=[],this._vennDataCounter=0;for(var e=this.series,t=this.component.legend,i=0;ia[1].value?(t=this.zr.getHeight()/3,i=t*Math.sqrt(a[1].value)/Math.sqrt(a[0].value)):(i=this.zr.getHeight()/3,t=i*Math.sqrt(a[0].value)/Math.sqrt(a[1].value));var o=this.zr.getWidth()/2-t,r=(t+i)/2*Math.sqrt(a[2].value)/Math.sqrt((a[0].value+a[1].value)/2),s=t+i;0!==a[2].value&&(s=this._getCoincideLength(a[0].value,a[1].value,a[2].value,t,i,r,Math.abs(t-i),t+i));var l=o+s,h=this.zr.getHeight()/2;if(this._buildItem(e,0,a[0],o,h,t),this._buildItem(e,1,a[1],l,h,i),0!==a[2].value&&a[2].value!==a[0].value&&a[2].value!==a[1].value){var m=(t*t-i*i)/(2*s)+s/2,V=s/2-(t*t-i*i)/(2*s),U=Math.sqrt(t*t-m*m),d=0,p=0;a[0].value>a[1].value&&o+m>l&&(p=1),a[0].valuel&&(d=1),this._buildCoincideItem(e,2,a[2],o+m,h-U,h+U,t,i,d,p)}},_getCoincideLength:function(e,t,i,n,a,o,r,s){var l=(n*n-a*a)/(2*o)+o/2,h=o/2-(n*n-a*a)/(2*o),m=Math.acos(l/n),V=Math.acos(h/a),U=n*n*Math.PI,d=m*n*n-l*n*Math.sin(m)+V*a*a-h*a*Math.sin(V),p=d/U,c=i/e,u=Math.abs(p/c);return u>.999&&1.001>u?o:.999>=u?(s=o,o=(o+r)/2,this._getCoincideLength(e,t,i,n,a,o,r,s)):(r=o,o=(o+s)/2,this._getCoincideLength(e,t,i,n,a,o,r,s))},_buildItem:function(e,t,i,n,a,o){var r=this.series,l=r[e],h=this.getCircle(e,t,i,n,a,o);if(s.pack(h,l,e,i,t,i.name),this.shapeList.push(h),l.itemStyle.normal.label.show){var m=this.getLabel(e,t,i,n,a,o);s.pack(m,l,e,l.data[t],t,l.data[t].name),this.shapeList.push(m)}},_buildCoincideItem:function(e,t,i,n,a,r,l,h,m,V){var U=this.series,d=U[e],p=[i,d],c=this.deepMerge(p,"itemStyle.normal")||{},u=this.deepMerge(p,"itemStyle.emphasis")||{},y=c.color||this.zr.getColor(t),g=u.color||this.zr.getColor(t),b="M"+n+","+a+"A"+l+","+l+",0,"+m+",1,"+n+","+r+"A"+h+","+h+",0,"+V+",1,"+n+","+a,f={color:y,path:b},k={zlevel:d.zlevel,z:d.z,style:f,highlightStyle:{color:g,lineWidth:u.borderWidth,strokeColor:u.borderColor}};k=new o(k),k.buildPathArray&&(k.style.pathArray=k.buildPathArray(f.path)),s.pack(k,U[e],0,i,t,i.name),this.shapeList.push(k)},getCircle:function(e,t,i,n,o,r){var s=this.series[e],l=[i,s],h=this.deepMerge(l,"itemStyle.normal")||{},m=this.deepMerge(l,"itemStyle.emphasis")||{},V=h.color||this.zr.getColor(t),U=m.color||this.zr.getColor(t),d={zlevel:s.zlevel,z:s.z,clickable:!0,style:{x:n,y:o,r:r,brushType:"fill",opacity:1,color:V},highlightStyle:{color:U,lineWidth:m.borderWidth,strokeColor:m.borderColor}};return this.deepQuery([i,s,this.option],"calculable")&&(this.setCalculable(d),d.draggable=!0),new a(d)},getLabel:function(e,t,i,a,o,r){var s=this.series[e],l=s.itemStyle,h=[i,s],m=this.deepMerge(h,"itemStyle.normal")||{},V="normal",U=l[V].label,d=U.textStyle||{},p=this.getLabelText(t,i,V),c=this.getFont(d),u=m.color||this.zr.getColor(t),y=d.fontSize||12,g={zlevel:s.zlevel,z:s.z,style:{x:a,y:o-r-y,color:d.color||u,text:p,textFont:c,textAlign:"center"}};return new n(g)},getLabelText:function(e,t,i){var n=this.series,a=n[0],o=this.deepQuery([t,a],"itemStyle."+i+".label.formatter");return o?"function"==typeof o?o(a.name,t.name,t.value):"string"==typeof o?(o=o.replace("{a}","{a0}").replace("{b}","{b0}").replace("{c}","{c0}"),o=o.replace("{a0}",a.name).replace("{b0}",t.name).replace("{c0}",t.value)):void 0:t.name},refresh:function(e){e&&(this.option=e,this.series=e.series),this._buildShape()}},l.inherits(t,i),e("../chart").define("venn",t),t}),i("echarts/chart/treemap",["require","./base","zrender/tool/area","zrender/shape/Rectangle","zrender/shape/Text","zrender/shape/Line","../layout/TreeMap","../data/Tree","../config","../util/ecData","zrender/config","zrender/tool/event","zrender/tool/util","zrender/tool/color","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a);var r=this;r._onclick=function(e){return r.__onclick(e)},r.zr.on(V.EVENT.CLICK,r._onclick)}var i=e("./base"),n=e("zrender/tool/area"),a=e("zrender/shape/Rectangle"),o=e("zrender/shape/Text"),r=e("zrender/shape/Line"),s=e("../layout/TreeMap"),l=e("../data/Tree"),h=e("../config");h.treemap={zlevel:0,z:1,calculable:!1,clickable:!0,center:["50%","50%"],size:["80%","80%"],root:"",itemStyle:{normal:{label:{ +show:!0,x:5,y:12,textStyle:{align:"left",color:"#000",fontFamily:"Arial",fontSize:13,fontStyle:"normal",fontWeight:"normal"}},breadcrumb:{show:!0,textStyle:{}},borderWidth:1,borderColor:"#ccc",childBorderWidth:1,childBorderColor:"#ccc"},emphasis:{}}};var m=e("../util/ecData"),V=e("zrender/config"),U=(e("zrender/tool/event"),e("zrender/tool/util")),d=e("zrender/tool/color");return t.prototype={type:h.CHART_TYPE_TREEMAP,refresh:function(e){this.clear(),e&&(this.option=e,this.series=this.option.series),this._treesMap={};for(var t=this.series,i=this.component.legend,n=0;nt.width||e.normal.label.y+U>t.height)&&(h=""):h="",e.emphasis.label.show?(s.x+u>t.width||s.y+y>t.height)&&(p=""):p="";var g={style:{textX:t.x+e.normal.label.x,textY:t.y+e.normal.label.y,text:h,textPosition:"specific",textColor:o.color,textFont:m},highlightStyle:{textX:t.x+e.emphasis.label.x,textY:t.y+e.emphasis.label.y,text:p,textColor:s.color,textPosition:"specific"}};return g},getLabelText:function(e,t,i){return i?"function"==typeof i?i.call(this.myChart,e,t):"string"==typeof i?(i=i.replace("{b}","{b0}").replace("{c}","{c0}"),i=i.replace("{b0}",e).replace("{c0}",t)):void 0:e},_buildChildrenTreemap:function(e,t,i,n){for(var a=i.width*i.height,o=0,r=[],l=0;l ":"")},V),clickable:!0,highlightStyle:p});m.set(u,"seriesIndex",t),m.set(u,"name",a[c]),i+=u.getRect(u.style).width,this.shapeList.push(u)}},__onclick:function(e){var t=e.target;if(t){var i=m.get(t,"seriesIndex"),n=m.get(t,"name"),a=this._treesMap[i],o=a.getNodeById(n);o&&o.children.length&&this._buildTreemap(o,i)}}},U.inherits(t,i),e("../chart").define("treemap",t),t}),i("echarts/layout/TreeMap",["require"],function(){function e(e){({x:e.x,y:e.y,width:e.width,height:e.height});this.x=e.x,this.y=e.y,this.width=e.width,this.height=e.height}return e.prototype.run=function(e){var t=[];return this._squarify(e,{x:this.x,y:this.y,width:this.width,height:this.height},t),t},e.prototype._squarify=function(e,t,i){var n="VERTICAL",a=t.width,o=t.height;t.widthl;l++)r[s].y+=r[l].height}var h={};if("VERTICAL"==n){for(var m=0;ml;l++){var h=i*e[l]/o;a.push({width:s,height:h})}return a},e.prototype._isFirstBetter=function(e,t){var i=e[0].height/e[0].width;i=i>1?1/i:i;var n=t[0].height/t[0].width;return n=n>1?1/n:n,Math.abs(i-1)<=Math.abs(n-1)?!0:!1},e}),i("echarts/data/Tree",["require","zrender/tool/util"],function(e){function t(e,t){this.id=e,this.depth=0,this.height=0,this.children=[],this.parent=null,this.data=t||null}function i(e){this.root=new t(e)}var n=e("zrender/tool/util");return t.prototype.add=function(e){var t=this.children;e.parent!==this&&(t.push(e),e.parent=this)},t.prototype.remove=function(e){var t=this.children,i=n.indexOf(t,e);i>=0&&(t.splice(i,1),e.parent=null)},t.prototype.traverse=function(e,t){e.call(t,this);for(var i=0;it&&(t=n.height)}this.height=t+1},t.prototype.getNodeById=function(e){if(this.id===e)return this;for(var t=0;t0&&this._buildLink(i,e)},this);var n=e.roam===!0||"move"===e.roam,a=e.roam===!0||"scale"===e.roam;this.zr.modLayer(this.getZlevelBase(),{panable:n,zoomable:a}),(this.query("markPoint.effect.show")||this.query("markLine.effect.show"))&&this.zr.modLayer(m.EFFECT_ZLEVEL,{panable:n,zoomable:a}),this.addShapeList()},_buildItem:function(e,t,i){var n=[e.data,t],r=this.deepQuery(n,"symbol"),s=this.deepMerge(n,"itemStyle.normal")||{},l=this.deepMerge(n,"itemStyle.emphasis")||{},h=s.color||this.zr.getColor(),m=l.color||this.zr.getColor(),U=-e.layout.angle||0;e.id===this.tree.root.id&&(U=0);var d="right";Math.abs(U)>=Math.PI/2&&Math.abs(U)<3*Math.PI/2&&(U+=Math.PI,d="left");var p=[U,e.layout.position[0],e.layout.position[1]],c=new a({zlevel:this.getZlevelBase(),z:this.getZBase()+1,rotation:p,clickable:this.deepQuery(n,"clickable"),style:{x:e.layout.position[0]-.5*e.layout.width,y:e.layout.position[1]-.5*e.layout.height,width:e.layout.width,height:e.layout.height,iconType:r,color:h,brushType:"both",lineWidth:s.borderWidth,strokeColor:s.borderColor},highlightStyle:{color:m,lineWidth:l.borderWidth,strokeColor:l.borderColor}});c.style.iconType.match("image")&&(c.style.image=c.style.iconType.replace(new RegExp("^image:\\/\\/"),""),c=new o({rotation:p,style:c.style,highlightStyle:c.highlightStyle,clickable:c.clickable,zlevel:this.getZlevelBase(),z:this.getZBase()})),this.deepQuery(n,"itemStyle.normal.label.show")&&(c.style.text=null==e.data.label?e.id:e.data.label,c.style.textPosition=this.deepQuery(n,"itemStyle.normal.label.position"),"radial"===t.orient&&"inside"!==c.style.textPosition&&(c.style.textPosition=d),c.style.textColor=this.deepQuery(n,"itemStyle.normal.label.textStyle.color"),c.style.textFont=this.getFont(this.deepQuery(n,"itemStyle.normal.label.textStyle")||{})),this.deepQuery(n,"itemStyle.emphasis.label.show")&&(c.highlightStyle.textPosition=this.deepQuery(n,"itemStyle.emphasis.label.position"),c.highlightStyle.textColor=this.deepQuery(n,"itemStyle.emphasis.label.textStyle.color"),c.highlightStyle.textFont=this.getFont(this.deepQuery(n,"itemStyle.emphasis.label.textStyle")||{})),V.pack(c,t,i,e.data,0,e.id),this.shapeList.push(c)},_buildLink:function(e,t){var i=t.itemStyle.normal.lineStyle;if("broken"===i.type)return void this._buildBrokenLine(e,i,t);for(var n=0;nr&&(t=r),r>n&&(n=r)}e.layout.position[0]=e.children.length>0?(t+n)/2:0;var s=this._layerOffsets[e.depth]||0;if(s>e.layout.position[0]){var l=s-e.layout.position[0];this._shiftSubtree(e,l);for(var a=e.depth+1;ai;i++)this._buildTextShape(e[i],0,i);this.addShapeList()},_buildTextShape:function(e,t,i){var a=this.series,o=a[t],s=o.name||"",h=o.data[i],m=[h,o],V=this.component.legend,U=V?V.getColor(s):this.zr.getColor(t),d=this.deepMerge(m,"itemStyle.normal")||{},p=this.deepMerge(m,"itemStyle.emphasis")||{},c=this.getItemStyleColor(d.color,t,i,h)||U,u=this.getItemStyleColor(p.color,t,i,h)||("string"==typeof c?l.lift(c,-.2):c),y=new n({zlevel:o.zlevel,z:o.z,hoverable:!0,clickable:this.deepQuery(m,"clickable"),style:{x:0,y:0,text:e.text,color:c,textFont:[e.style,e.weight,e.size+"px",e.font].join(" "),textBaseline:"alphabetic",textAlign:"center"},highlightStyle:{brushType:p.borderWidth?"both":"fill",color:u,lineWidth:p.borderWidth||0,strokeColor:p.borderColor},position:[e.x,e.y],rotation:[-e.rotate/180*Math.PI,0,0]});r.pack(y,o,t,h,i,h.name),this.shapeList.push(y)}},s.inherits(t,i),e("../chart").define("wordCloud",t),t}),i("echarts/layout/WordCloud",["require","../layout/WordCloudRectZero","zrender/tool/util"],function(e){function t(e){this._init(e)}var i=e("../layout/WordCloudRectZero"),n=e("zrender/tool/util");return t.prototype={start:function(){function e(){p.totalArea=r,U.autoSizeCal.enable&&p._autoCalTextSize(m,r,a,o,U.autoSizeCal.minSize),V.timer&&clearInterval(V.timer),V.timer=setInterval(t,0),t()}function t(){for(var e,t=+new Date,i=m.length;+new Date-t>1,e.y=d[1]>>1,p._cloudSprite(e,m,s),e.hasText&&p._place(n,e,h)&&(l.push(e),e.x-=d[0]>>1,e.y-=d[1]>>1);s>=i&&(p.stop(),p._fixTagPosition(l),V.endcallback(l))}var n=null,a=0,o=0,r=0,s=-1,l=[],h=null,m=this.wordsdata,V=this.defaultOption,U=V.wordletype,d=V.size,p=this,c=new i({type:U.type,width:d[0],height:d[1]});return c.calculate(function(t){n=t.initarr,a=t.maxWit,o=t.maxHit,r=t.area,h=t.imgboard,e()},this),this},_fixTagPosition:function(e){for(var t=this.defaultOption.center,i=0,n=e.length;n>i;i++)e[i].x+=t[0],e[i].y+=t[1]},stop:function(){return this.defaultOption.timer&&(clearInterval(this.defaultOption.timer),this.defaultOption.timer=null),this},end:function(e){return e&&(this.defaultOption.endcallback=e),this},_init:function(e){this.defaultOption={},this._initProperty(e),this._initMethod(e),this._initCanvas(),this._initData(e.data)},_initData:function(e){var t=this,i=t.defaultOption;this.wordsdata=e.map(function(e,n){return e.text=i.text.call(t,e,n),e.font=i.font.call(t,e,n),e.style=i.fontStyle.call(t,e,n),e.weight=i.fontWeight.call(t,e,n),e.rotate=i.rotate.call(t,e,n),e.size=~~i.fontSize.call(t,e,n),e.padding=i.padding.call(t,e,n),e}).sort(function(e,t){return t.value-e.value})},_initMethod:function(e){function t(e){return e.name}function i(){return"sans-serif"}function n(){return"normal"}function a(e){return e.value}function o(){return 0}function r(e){return function(){return e[Math.round(Math.random()*(e.length-1))]}}function s(){return 0}function l(e){var t=e[0]/e[1];return function(e){return[t*(e*=.1)*Math.cos(e),e*Math.sin(e)]}}function h(e){var t=4,i=t*e[0]/e[1],n=0,a=0;return function(e){var o=0>e?-1:1;switch(Math.sqrt(1+4*o*e)-o&3){case 0:n+=i;break;case 1:a+=t;break;case 2:n-=i;break;default:a-=t}return[n,a]}}function m(e){return"function"==typeof e?e:function(){return e}}var V=this.defaultOption;V.text=e.text?m(e.text):t,V.font=e.font?m(e.font):i,V.fontSize=e.fontSize?m(e.fontSize):a,V.fontStyle=e.fontStyle?m(e.fontStyle):n,V.fontWeight=e.fontWeight?m(e.fontWeight):n,V.rotate=e.rotate?r(e.rotate):o,V.padding=e.padding?m(e.padding):s,V.center=e.center,V.spiral=l,V.endcallback=function(){},V.rectangularSpiral=h,V.archimedeanSpiral=l},_initProperty:function(e){var t=this.defaultOption;t.size=e.size||[256,256],t.wordletype=e.wordletype,t.words=e.words||[],t.timeInterval=1/0,t.timer=null,t.spirals={archimedean:t.archimedeanSpiral,rectangular:t.rectangularSpiral},n.merge(t,{size:[256,256],wordletype:{type:"RECT",areaPresent:.058,autoSizeCal:{enable:!0,minSize:12}}})},_initCanvas:function(){var e,t=Math.PI/180,i=64,n=2048,a=1;"undefined"!=typeof document?(e=document.createElement("canvas"),e.width=1,e.height=1,a=Math.sqrt(e.getContext("2d").getImageData(0,0,1,1).data.length>>2),e.width=(i<<5)/a,e.height=n/a):e=new Canvas(i<<5,n);var o=e.getContext("2d");o.fillStyle=o.strokeStyle="red",o.textAlign="center",this.defaultOption.c=o,this.defaultOption.cw=i,this.defaultOption.ch=n,this.defaultOption.ratio=a,this.defaultOption.cloudRadians=t},_cloudSprite:function(e,t,i){if(!e.sprite){var n=this.defaultOption.cw,a=this.defaultOption.ch,o=this.defaultOption.c,r=this.defaultOption.ratio,s=this.defaultOption.cloudRadians;o.clearRect(0,0,(n<<5)/r,a/r);var l=0,h=0,m=0,V=t.length;for(--i;++i>5<<5,d=~~Math.max(Math.abs(y+g),Math.abs(y-g))}else U=U+31>>5<<5;if(d>m&&(m=d),l+U>=n<<5&&(l=0,h+=m,m=0),h+d>=a)break;o.translate((l+(U>>1))/r,(h+(d>>1))/r),e.rotate&&o.rotate(e.rotate*s),o.fillText(e.text,0,0),e.padding&&(o.lineWidth=2*e.padding,o.strokeText(e.text,0,0)),o.restore(),e.width=U,e.height=d,e.xoff=l,e.yoff=h,e.x1=U>>1,e.y1=d>>1,e.x0=-e.x1,e.y0=-e.y1,e.hasText=!0,l+=U}for(var f=o.getImageData(0,0,(n<<5)/r,a/r).data,k=[];--i>=0;)if(e=t[i],e.hasText){for(var U=e.width,x=U>>5,d=e.y1-e.y0,_=0;d*x>_;_++)k[_]=0;if(l=e.xoff,null==l)return;h=e.yoff;for(var L=0,W=-1,X=0;d>X;X++){for(var _=0;U>_;_++){var v=x*X+(_>>5),w=f[(h+X)*(n<<5)+(l+_)<<2]?1<<31-_%32:0;k[v]|=w,L|=w}L?W=X:(e.y0++,d--,X--,h++)}e.y1=e.y0+W,e.sprite=k.slice(0,(e.y1-e.y0)*x)}}},_place:function(e,t,i){function n(e,t,i){i>>=5;for(var n,a=e.sprite,o=e.width>>5,r=e.x-(o<<4),s=127&r,l=32-s,h=e.y1-e.y0,m=(e.y+e.y0)*i+(r>>5),V=0;h>V;V++){n=0;for(var U=0;o>=U;U++)if((n<U?(n=a[V*o+U])>>>s:0))&t[m+U])return!0;m+=i}return!1}function a(e,t){return t.row[e.y]&&t.cloumn[e.x]&&e.x>=t.row[e.y].start&&e.x<=t.row[e.y].end&&e.y>=t.cloumn[e.x].start&&e.y<=t.cloumn[e.x].end}for(var o,r,s,l=this.defaultOption.size,h=([{x:0,y:0},{x:l[0],y:l[1]}],t.x),m=t.y,V=Math.sqrt(l[0]*l[0]+l[1]*l[1]),U=this.defaultOption.spiral(l),d=Math.random()<.5?1:-1,p=-d;(o=U(p+=d))&&(r=~~o[0],s=~~o[1],!(Math.min(r,s)>V));)if(t.x=h+r,t.y=m+s,!(t.x+t.x0<0||t.y+t.y0<0||t.x+t.x1>l[0]||t.y+t.y1>l[1])&&!n(t,e,l[0])&&a(t,i)){for(var c,u=t.sprite,y=t.width>>5,g=l[0]>>5,b=t.x-(y<<4),f=127&b,k=32-f,x=t.y1-t.y0,_=(t.y+t.y0)*g+(b>>5),L=0;x>L;L++){c=0;for(var W=0;y>=W;W++)e[_+W]|=c<W?(c=u[L*y+W])>>>f:0);_+=g}return delete t.sprite,!0}return!1},_autoCalTextSize:function(e,t,i,n,a){function o(e){c.clearRect(0,0,(d<<5)/u,p/u),c.save(),c.font=e.style+" "+e.weight+" "+~~((e.size+1)/u)+"px "+e.font;var t=c.measureText(e.text+"m").width*u,r=e.size<<1;t=t+31>>5<<5,c.restore(),e.aw=t,e.ah=r;var s,l,h;if(e.rotate){var m=Math.sin(e.rotate*y),V=Math.cos(e.rotate*y),g=t*V,b=t*m,f=r*V,k=r*m;l=Math.max(Math.abs(g+k),Math.abs(g-k))+31>>5<<5,h=~~Math.max(Math.abs(b+f),Math.abs(b-f))}return e.size<=U||e.rotate&&t*r<=e.area&&i>=l&&n>=h||t*r<=e.area&&i>=t&&n>=r?void(e.area=t*r):(s=e.rotate&&l>i&&h>n?Math.min(i/l,n/h):t>i||r>n?Math.min(i/t,n/r):Math.sqrt(e.area/(e.aw*e.ah)),e.size=~~(s*e.size),e.sizel?l:V:l,s.area=t*s.areapre,s.totalarea=t,o(s)}},t}),i("echarts/layout/WordCloudRectZero",["require"],function(){function e(e){this.defaultOption={type:"RECT"},this._init(e)}return e.prototype={RECT:"_calculateRect",_init:function(e){this._initOption(e),this._initCanvas()},_initOption:function(e){for(k in e)this.defaultOption[k]=e[k]},_initCanvas:function(){var e=document.createElement("canvas");e.width=1,e.height=1;var t=Math.sqrt(e.getContext("2d").getImageData(0,0,1,1).data.length>>2);if(e.width=this.defaultOption.width,e.height=this.defaultOption.height,e.getContext)var i=e.getContext("2d");this.canvas=e,this.ctx=i,this.ratio=t},calculate:function(e,t){var i=this.defaultOption.type,n=this[i];this[n].call(this,e,t)},_calculateReturn:function(e,t,i){t.call(i,e)},_calculateRect:function(e,t){var i={},n=this.defaultOption.width>>5<<5,a=this.defaultOption.height;i.initarr=this._rectZeroArray(n*a),i.area=n*a,i.maxHit=a,i.maxWit=n,i.imgboard=this._rectBoard(n,a),this._calculateReturn(i,e,t)},_rectBoard:function(e,t){for(var i=[],n=0;t>n;n++)i.push({y:n,start:0,end:e});for(var a=[],n=0;e>n;n++)a.push({x:n,start:0,end:t});return{row:i,cloumn:a}},_rectZeroArray:function(e){for(var t=[],i=e,n=-1;++ni;++i)if(e[i].type===a.CHART_TYPE_HEATMAP){e[i]=this.reformOption(e[i]);var o=new n(e[i]),s=o.getCanvas(e[i].data,this.zr.getWidth(),this.zr.getHeight()),l=new r({position:[0,0],scale:[1,1],hoverable:this.option.hoverable,style:{x:0,y:0,image:s,width:s.width,height:s.height}});this.shapeList.push(l)}this.addShapeList()}},o.inherits(t,i),e("../chart").define("heatmap",t),t});var n=t("zrender");n.tool={color:t("zrender/tool/color"),math:t("zrender/tool/math"),util:t("zrender/tool/util"),vector:t("zrender/tool/vector"),area:t("zrender/tool/area"),event:t("zrender/tool/event")},n.animation={Animation:t("zrender/animation/Animation"),Cip:t("zrender/animation/Clip"),easing:t("zrender/animation/easing")};var a=t("echarts");a.config=t("echarts/config"),a.util={mapData:{params:t("echarts/util/mapData/params")}},t("echarts/chart/line"),t("echarts/chart/bar"),t("echarts/chart/scatter"),t("echarts/chart/k"),t("echarts/chart/pie"),t("echarts/chart/radar"),t("echarts/chart/chord"),t("echarts/chart/force"),t("echarts/chart/map"),t("echarts/chart/gauge"),t("echarts/chart/funnel"),t("echarts/chart/eventRiver"),t("echarts/chart/venn"),t("echarts/chart/treemap"),t("echarts/chart/tree"),t("echarts/chart/wordCloud"),t("echarts/chart/heatmap"),e.echarts=a,e.zrender=n}(window); + +layui.define('echartsTheme', function(exports){ + exports('echarts', echarts); +}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/lib/extend/echartsTheme.js b/AdminSrc/AdminHost/wwwroot/admin/dist/lib/extend/echartsTheme.js new file mode 100644 index 0000000..ad02dec --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/lib/extend/echartsTheme.js @@ -0,0 +1,2 @@ +/** layuiAdmin.pro-v1.4.0 LPPL License By https://www.layui.com/admin/ */ +;layui.define(function(e){e("echartsTheme",{color:["#009688","#1E9FFF","#5FB878","#FFB980","#D87A80","#8d98b3","#e5cf0d","#97b552","#95706d","#dc69aa","#07a2a4","#9a7fd1","#588dd5","#f5994e","#c05050","#59678c","#c9ab00","#7eb00a","#6f5553","#c14089"],title:{textStyle:{fontWeight:"normal",color:"#666"}},dataRange:{itemWidth:15,color:["#009688","#e0ffff"]},toolbox:{color:["#1e90ff","#1e90ff","#1e90ff","#1e90ff"],effectiveColor:"#ff4500"},tooltip:{backgroundColor:"rgba(50,50,50,0.5)",axisPointer:{type:"line",lineStyle:{color:"#009688"},crossStyle:{color:"#008acd"},shadowStyle:{color:"rgba(200,200,200,0.2)"}}},dataZoom:{dataBackgroundColor:"#efefff",fillerColor:"rgba(182,162,222,0.2)",handleColor:"#008acd"},grid:{borderColor:"#eee"},categoryAxis:{axisLine:{lineStyle:{color:"#009688"}},axisTick:{show:!1},splitLine:{lineStyle:{color:["#eee"]}}},valueAxis:{axisLine:{lineStyle:{color:"#009688"}},splitArea:{show:!0,areaStyle:{color:["rgba(250,250,250,0.1)","rgba(200,200,200,0.1)"]}},splitLine:{lineStyle:{color:["#eee"]}}},polar:{axisLine:{lineStyle:{color:"#ddd"}},splitArea:{show:!0,areaStyle:{color:["rgba(250,250,250,0.2)","rgba(200,200,200,0.2)"]}},splitLine:{lineStyle:{color:"#ddd"}}},timeline:{lineStyle:{color:"#009688"},controlStyle:{normal:{color:"#009688"},emphasis:{color:"#009688"}},symbol:"emptyCircle",symbolSize:3},bar:{itemStyle:{normal:{barBorderRadius:2},emphasis:{barBorderRadius:2}}},line:{smooth:!0,symbol:"emptyCircle",symbolSize:3},k:{itemStyle:{normal:{color:"#d87a80",color0:"#2ec7c9",lineStyle:{color:"#d87a80",color0:"#2ec7c9"}}}},scatter:{symbol:"circle",symbolSize:4},radar:{symbol:"emptyCircle",symbolSize:3},map:{itemStyle:{normal:{areaStyle:{color:"#ddd"},label:{textStyle:{color:"#d87a80"}}},emphasis:{areaStyle:{color:"#fe994e"}}}},force:{itemStyle:{normal:{linkStyle:{color:"#1e90ff"}}}},chord:{itemStyle:{normal:{borderWidth:1,borderColor:"rgba(128, 128, 128, 0.5)",chordStyle:{lineStyle:{color:"rgba(128, 128, 128, 0.5)"}}},emphasis:{borderWidth:1,borderColor:"rgba(128, 128, 128, 0.5)",chordStyle:{lineStyle:{color:"rgba(128, 128, 128, 0.5)"}}}}},gauge:{axisLine:{lineStyle:{color:[[.2,"#2ec7c9"],[.8,"#5ab1ef"],[1,"#d87a80"]],width:10}},axisTick:{splitNumber:10,length:15,lineStyle:{color:"auto"}},splitLine:{length:22,lineStyle:{color:"auto"}},pointer:{width:5}},textStyle:{fontFamily:"微软雅黑, Arial, Verdana, sans-serif"}})}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/lib/view.js b/AdminSrc/AdminHost/wwwroot/admin/dist/lib/view.js new file mode 100644 index 0000000..08199bf --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/lib/view.js @@ -0,0 +1,2 @@ +/** layuiAdmin.pro-v1.4.0 LPPL License By https://www.layui.com/admin/ */ +;layui.define(["laytpl","layer"],function(e){var t=layui.jquery,a=layui.laytpl,n=layui.layer,r=layui.setter,o=(layui.device(),layui.hint()),i=function(e){return new d(e)},s="LAY_app_body",d=function(e){this.id=e,this.container=t("#"+(e||s))};i.loading=function(e){e.append(this.elemLoad=t(''))},i.removeLoad=function(){this.elemLoad&&this.elemLoad.remove()},i.exit=function(){layui.data(r.tableName,{key:r.request.tokenName,remove:!0}),location.hash="/user/login"},i.req=function(e){var a=e.success,n=e.error,o=r.request,s=r.response,d=function(){return r.debug?"
URL:"+e.url:""};if(e.data=e.data||{},e.headers=e.headers||{},o.tokenName){var l="string"==typeof e.data?JSON.parse(e.data):e.data;e.data[o.tokenName]=o.tokenName in l?e.data[o.tokenName]:layui.data(r.tableName)[o.tokenName]||"",e.headers[o.tokenName]=o.tokenName in e.headers?e.headers[o.tokenName]:layui.data(r.tableName)[o.tokenName]||""}return delete e.success,delete e.error,t.ajax(t.extend({type:"get",dataType:"json",success:function(t){var n=s.statusCode;if(t[s.statusName]==n.ok)"function"==typeof e.done&&e.done(t);else if(t[s.statusName]==n.logout)i.exit();else{var r=["Error: "+(t[s.msgName]||"返回状态码异常"),d()].join("");i.error(r)}"function"==typeof a&&a(t)},error:function(e,t){var a=["请求异常,请重试
错误信息:"+t,d()].join("");i.error(a),"function"==typeof n&&n(res)}},e))},i.popup=function(e){var a=e.success,r=e.skin;return delete e.success,delete e.skin,n.open(t.extend({type:1,title:"提示",content:"",id:"LAY-system-view-popup",skin:"layui-layer-admin"+(r?" "+r:""),shadeClose:!0,closeBtn:!1,success:function(e,r){var o=t('ဆ');e.append(o),o.on("click",function(){n.close(r)}),"function"==typeof a&&a.apply(this,arguments)}},e))},i.error=function(e,a){return i.popup(t.extend({content:e,maxWidth:300,offset:"t",anim:6,id:"LAY_adminError"},a))},d.prototype.render=function(e,a){var n=this;layui.router();return e=r.views+e+r.engine,t("#"+s).children(".layadmin-loading").remove(),i.loading(n.container),t.ajax({url:e,type:"get",dataType:"html",data:{v:layui.cache.version},success:function(e){e="
"+e+"
";var r=t(e).find("title"),o=r.text()||(e.match(/\([\s\S]*)\<\/title>/)||[])[1],s={title:o,body:e};r.remove(),n.params=a||{},n.then&&(n.then(s),delete n.then),n.parse(e),i.removeLoad(),n.done&&(n.done(s),delete n.done)},error:function(e){return i.removeLoad(),n.render.isError?i.error("请求视图文件异常,状态:"+e.status):(404===e.status?n.render("template/tips/404"):n.render("template/tips/error"),void(n.render.isError=!0))}}),n},d.prototype.parse=function(e,n,r){var s=this,d="object"==typeof e,l=d?e:t(e),u=d?e:l.find("*[template]"),c=function(e){var n=a(e.dataElem.html()),o=t.extend({params:y.params},e.res);e.dataElem.after(n.render(o)),"function"==typeof r&&r();try{e.done&&new Function("d",e.done)(o)}catch(i){console.error(e.dataElem[0],"\n存在错误回调脚本\n\n",i)}},y=layui.router();l.find("title").remove(),s.container[n?"after":"html"](l.children()),y.params=s.params||{};for(var p=u.length;p>0;p--)!function(){var e=u.eq(p-1),t=e.attr("lay-done")||e.attr("lay-then"),n=a(e.attr("lay-url")||"").render(y),r=a(e.attr("lay-data")||"").render(y),s=a(e.attr("lay-headers")||"").render(y);try{r=new Function("return "+r+";")()}catch(d){o.error("lay-data: "+d.message),r={}}try{s=new Function("return "+s+";")()}catch(d){o.error("lay-headers: "+d.message),s=s||{}}n?i.req({type:e.attr("lay-type")||"get",url:n,data:r,dataType:"json",headers:s,success:function(a){c({dataElem:e,res:a,done:t})}}):c({dataElem:e,done:t})}();return s},d.prototype.send=function(e,t){var n=a(e||this.container.html()).render(t||{});return this.container.html(n),this},d.prototype.refresh=function(e){var t=this,a=t.container.next(),n=a.attr("lay-templateid");return t.id!=n?t:(t.parse(t.container,"refresh",function(){t.container.siblings('[lay-templateid="'+t.id+'"]:last').remove(),"function"==typeof e&&e()}),t)},d.prototype.then=function(e){return this.then=e,this},d.prototype.done=function(e){return this.done=e,this},e("view",i)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/signalr.min.js b/AdminSrc/AdminHost/wwwroot/admin/dist/signalr.min.js new file mode 100644 index 0000000..0ba87de --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/signalr.min.js @@ -0,0 +1,2 @@ +var t,e;t=self,e=()=>(()=>{var t={d:(e,s)=>{for(var i in s)t.o(s,i)&&!t.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:s[i]})}};t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),t.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),t.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"t",{value:!0})};var e,s={};t.r(s),t.d(s,{AbortError:()=>r,DefaultHttpClient:()=>H,HttpClient:()=>d,HttpError:()=>i,HttpResponse:()=>u,HttpTransportType:()=>F,HubConnection:()=>q,HubConnectionBuilder:()=>tt,HubConnectionState:()=>A,JsonHubProtocol:()=>Y,LogLevel:()=>e,MessageType:()=>x,NullLogger:()=>f,Subject:()=>U,TimeoutError:()=>n,TransferFormat:()=>B,VERSION:()=>p});class i extends Error{constructor(t,e){const s=new.target.prototype;super(`${t}: Status code '${e}'`),this.statusCode=e,this.__proto__=s}}class n extends Error{constructor(t="A timeout occurred."){const e=new.target.prototype;super(t),this.__proto__=e}}class r extends Error{constructor(t="An abort occurred."){const e=new.target.prototype;super(t),this.__proto__=e}}class o extends Error{constructor(t,e){const s=new.target.prototype;super(t),this.transport=e,this.errorType="UnsupportedTransportError",this.__proto__=s}}class h extends Error{constructor(t,e){const s=new.target.prototype;super(t),this.transport=e,this.errorType="DisabledTransportError",this.__proto__=s}}class c extends Error{constructor(t,e){const s=new.target.prototype;super(t),this.transport=e,this.errorType="FailedToStartTransportError",this.__proto__=s}}class a extends Error{constructor(t){const e=new.target.prototype;super(t),this.errorType="FailedToNegotiateWithServerError",this.__proto__=e}}class l extends Error{constructor(t,e){const s=new.target.prototype;super(t),this.innerErrors=e,this.__proto__=s}}class u{constructor(t,e,s){this.statusCode=t,this.statusText=e,this.content=s}}class d{get(t,e){return this.send({...e,method:"GET",url:t})}post(t,e){return this.send({...e,method:"POST",url:t})}delete(t,e){return this.send({...e,method:"DELETE",url:t})}getCookieString(t){return""}}!function(t){t[t.Trace=0]="Trace",t[t.Debug=1]="Debug",t[t.Information=2]="Information",t[t.Warning=3]="Warning",t[t.Error=4]="Error",t[t.Critical=5]="Critical",t[t.None=6]="None"}(e||(e={}));class f{constructor(){}log(t,e){}}f.instance=new f;const p="8.0.7";class w{static isRequired(t,e){if(null==t)throw new Error(`The '${e}' argument is required.`)}static isNotEmpty(t,e){if(!t||t.match(/^\s*$/))throw new Error(`The '${e}' argument should not be empty.`)}static isIn(t,e,s){if(!(t in e))throw new Error(`Unknown ${s} value: ${t}.`)}}class g{static get isBrowser(){return!g.isNode&&"object"==typeof window&&"object"==typeof window.document}static get isWebWorker(){return!g.isNode&&"object"==typeof self&&"importScripts"in self}static get isReactNative(){return!g.isNode&&"object"==typeof window&&void 0===window.document}static get isNode(){return"undefined"!=typeof process&&process.release&&"node"===process.release.name}}function m(t,e){let s="";return y(t)?(s=`Binary data of length ${t.byteLength}`,e&&(s+=`. Content: '${function(t){const e=new Uint8Array(t);let s="";return e.forEach((t=>{s+=`0x${t<16?"0":""}${t.toString(16)} `})),s.substr(0,s.length-1)}(t)}'`)):"string"==typeof t&&(s=`String data of length ${t.length}`,e&&(s+=`. Content: '${t}'`)),s}function y(t){return t&&"undefined"!=typeof ArrayBuffer&&(t instanceof ArrayBuffer||t.constructor&&"ArrayBuffer"===t.constructor.name)}async function b(t,s,i,n,r,o){const h={},[c,a]=$();h[c]=a,t.log(e.Trace,`(${s} transport) sending data. ${m(r,o.logMessageContent)}.`);const l=y(r)?"arraybuffer":"text",u=await i.post(n,{content:r,headers:{...h,...o.headers},responseType:l,timeout:o.timeout,withCredentials:o.withCredentials});t.log(e.Trace,`(${s} transport) request complete. Response status: ${u.statusCode}.`)}class v{constructor(t,e){this.i=t,this.h=e}dispose(){const t=this.i.observers.indexOf(this.h);t>-1&&this.i.observers.splice(t,1),0===this.i.observers.length&&this.i.cancelCallback&&this.i.cancelCallback().catch((t=>{}))}}class E{constructor(t){this.l=t,this.out=console}log(t,s){if(t>=this.l){const i=`[${(new Date).toISOString()}] ${e[t]}: ${s}`;switch(t){case e.Critical:case e.Error:this.out.error(i);break;case e.Warning:this.out.warn(i);break;case e.Information:this.out.info(i);break;default:this.out.log(i)}}}}function $(){let t="X-SignalR-User-Agent";return g.isNode&&(t="User-Agent"),[t,C(p,S(),g.isNode?"NodeJS":"Browser",k())]}function C(t,e,s,i){let n="Microsoft SignalR/";const r=t.split(".");return n+=`${r[0]}.${r[1]}`,n+=` (${t}; `,n+=e&&""!==e?`${e}; `:"Unknown OS; ",n+=`${s}`,n+=i?`; ${i}`:"; Unknown Runtime Version",n+=")",n}function S(){if(!g.isNode)return"";switch(process.platform){case"win32":return"Windows NT";case"darwin":return"macOS";case"linux":return"Linux";default:return process.platform}}function k(){if(g.isNode)return process.versions.node}function P(t){return t.stack?t.stack:t.message?t.message:`${t}`}class T extends d{constructor(e){if(super(),this.u=e,"undefined"==typeof fetch||g.isNode){const t=require;this.p=new(t("tough-cookie").CookieJar),"undefined"==typeof fetch?this.m=t("node-fetch"):this.m=fetch,this.m=t("fetch-cookie")(this.m,this.p)}else this.m=fetch.bind(function(){if("undefined"!=typeof globalThis)return globalThis;if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if(void 0!==t.g)return t.g;throw new Error("could not find global")}());if("undefined"==typeof AbortController){const t=require;this.v=t("abort-controller")}else this.v=AbortController}async send(t){if(t.abortSignal&&t.abortSignal.aborted)throw new r;if(!t.method)throw new Error("No method defined.");if(!t.url)throw new Error("No url defined.");const s=new this.v;let o;t.abortSignal&&(t.abortSignal.onabort=()=>{s.abort(),o=new r});let h,c=null;if(t.timeout){const i=t.timeout;c=setTimeout((()=>{s.abort(),this.u.log(e.Warning,"Timeout from HTTP request."),o=new n}),i)}""===t.content&&(t.content=void 0),t.content&&(t.headers=t.headers||{},y(t.content)?t.headers["Content-Type"]="application/octet-stream":t.headers["Content-Type"]="text/plain;charset=UTF-8");try{h=await this.m(t.url,{body:t.content,cache:"no-cache",credentials:!0===t.withCredentials?"include":"same-origin",headers:{"X-Requested-With":"XMLHttpRequest",...t.headers},method:t.method,mode:"cors",redirect:"follow",signal:s.signal})}catch(t){if(o)throw o;throw this.u.log(e.Warning,`Error from HTTP request. ${t}.`),t}finally{c&&clearTimeout(c),t.abortSignal&&(t.abortSignal.onabort=null)}if(!h.ok){const t=await I(h,"text");throw new i(t||h.statusText,h.status)}const a=I(h,t.responseType),l=await a;return new u(h.status,h.statusText,l)}getCookieString(t){let e="";return g.isNode&&this.p&&this.p.getCookies(t,((t,s)=>e=s.join("; "))),e}}function I(t,e){let s;switch(e){case"arraybuffer":s=t.arrayBuffer();break;case"text":default:s=t.text();break;case"blob":case"document":case"json":throw new Error(`${e} is not supported.`)}return s}class _ extends d{constructor(t){super(),this.u=t}send(t){return t.abortSignal&&t.abortSignal.aborted?Promise.reject(new r):t.method?t.url?new Promise(((s,o)=>{const h=new XMLHttpRequest;h.open(t.method,t.url,!0),h.withCredentials=void 0===t.withCredentials||t.withCredentials,h.setRequestHeader("X-Requested-With","XMLHttpRequest"),""===t.content&&(t.content=void 0),t.content&&(y(t.content)?h.setRequestHeader("Content-Type","application/octet-stream"):h.setRequestHeader("Content-Type","text/plain;charset=UTF-8"));const c=t.headers;c&&Object.keys(c).forEach((t=>{h.setRequestHeader(t,c[t])})),t.responseType&&(h.responseType=t.responseType),t.abortSignal&&(t.abortSignal.onabort=()=>{h.abort(),o(new r)}),t.timeout&&(h.timeout=t.timeout),h.onload=()=>{t.abortSignal&&(t.abortSignal.onabort=null),h.status>=200&&h.status<300?s(new u(h.status,h.statusText,h.response||h.responseText)):o(new i(h.response||h.responseText||h.statusText,h.status))},h.onerror=()=>{this.u.log(e.Warning,`Error from HTTP request. ${h.status}: ${h.statusText}.`),o(new i(h.statusText,h.status))},h.ontimeout=()=>{this.u.log(e.Warning,"Timeout from HTTP request."),o(new n)},h.send(t.content)})):Promise.reject(new Error("No url defined.")):Promise.reject(new Error("No method defined."))}}class H extends d{constructor(t){if(super(),"undefined"!=typeof fetch||g.isNode)this.$=new T(t);else{if("undefined"==typeof XMLHttpRequest)throw new Error("No usable HttpClient found.");this.$=new _(t)}}send(t){return t.abortSignal&&t.abortSignal.aborted?Promise.reject(new r):t.method?t.url?this.$.send(t):Promise.reject(new Error("No url defined.")):Promise.reject(new Error("No method defined."))}getCookieString(t){return this.$.getCookieString(t)}}class D{static write(t){return`${t}${D.RecordSeparator}`}static parse(t){if(t[t.length-1]!==D.RecordSeparator)throw new Error("Message is incomplete.");const e=t.split(D.RecordSeparator);return e.pop(),e}}D.RecordSeparatorCode=30,D.RecordSeparator=String.fromCharCode(D.RecordSeparatorCode);class R{writeHandshakeRequest(t){return D.write(JSON.stringify(t))}parseHandshakeResponse(t){let e,s;if(y(t)){const i=new Uint8Array(t),n=i.indexOf(D.RecordSeparatorCode);if(-1===n)throw new Error("Message is incomplete.");const r=n+1;e=String.fromCharCode.apply(null,Array.prototype.slice.call(i.slice(0,r))),s=i.byteLength>r?i.slice(r).buffer:null}else{const i=t,n=i.indexOf(D.RecordSeparator);if(-1===n)throw new Error("Message is incomplete.");const r=n+1;e=i.substring(0,r),s=i.length>r?i.substring(r):null}const i=D.parse(e),n=JSON.parse(i[0]);if(n.type)throw new Error("Expected a handshake response from the server.");return[s,n]}}var x,A;!function(t){t[t.Invocation=1]="Invocation",t[t.StreamItem=2]="StreamItem",t[t.Completion=3]="Completion",t[t.StreamInvocation=4]="StreamInvocation",t[t.CancelInvocation=5]="CancelInvocation",t[t.Ping=6]="Ping",t[t.Close=7]="Close",t[t.Ack=8]="Ack",t[t.Sequence=9]="Sequence"}(x||(x={}));class U{constructor(){this.observers=[]}next(t){for(const e of this.observers)e.next(t)}error(t){for(const e of this.observers)e.error&&e.error(t)}complete(){for(const t of this.observers)t.complete&&t.complete()}subscribe(t){return this.observers.push(t),new v(this,t)}}class L{constructor(t,e,s){this.C=1e5,this.S=[],this.k=0,this.P=!1,this.T=1,this.I=0,this._=0,this.H=!1,this.D=t,this.R=e,this.C=s}async A(t){const e=this.D.writeMessage(t);let s=Promise.resolve();if(this.U(t)){this.k++;let t=()=>{},i=()=>{};y(e)?this._+=e.byteLength:this._+=e.length,this._>=this.C&&(s=new Promise(((e,s)=>{t=e,i=s}))),this.S.push(new N(e,this.k,t,i))}try{this.H||await this.R.send(e)}catch{this.L()}await s}N(t){let e=-1;for(let s=0;sthis.T?this.R.stop(new Error("Sequence ID greater than amount of messages we've received.")):this.T=t.sequenceId}L(){this.H=!0,this.P=!0}async B(){const t=0!==this.S.length?this.S[0].q:this.k+1;await this.R.send(this.D.writeMessage({type:x.Sequence,sequenceId:t}));const e=this.S;for(const t of e)await this.R.send(t.M);this.H=!1}X(t){null!=t||(t=new Error("Unable to reconnect to server."));for(const e of this.S)e.J(t)}U(t){switch(t.type){case x.Invocation:case x.StreamItem:case x.Completion:case x.StreamInvocation:case x.CancelInvocation:return!0;case x.Close:case x.Sequence:case x.Ping:case x.Ack:return!1}}O(){void 0===this.V&&(this.V=setTimeout((async()=>{try{this.H||await this.R.send(this.D.writeMessage({type:x.Ack,sequenceId:this.I}))}catch{}clearTimeout(this.V),this.V=void 0}),1e3))}}class N{constructor(t,e,s,i){this.M=t,this.q=e,this.j=s,this.J=i}}!function(t){t.Disconnected="Disconnected",t.Connecting="Connecting",t.Connected="Connected",t.Disconnecting="Disconnecting",t.Reconnecting="Reconnecting"}(A||(A={}));class q{static create(t,e,s,i,n,r,o){return new q(t,e,s,i,n,r,o)}constructor(t,s,i,n,r,o,h){this.K=0,this.G=()=>{this.u.log(e.Warning,"The page is being frozen, this will likely lead to the connection being closed and messages being lost. For more information see the docs at https://learn.microsoft.com/aspnet/core/signalr/javascript-client#bsleep")},w.isRequired(t,"connection"),w.isRequired(s,"logger"),w.isRequired(i,"protocol"),this.serverTimeoutInMilliseconds=null!=r?r:3e4,this.keepAliveIntervalInMilliseconds=null!=o?o:15e3,this.Y=null!=h?h:1e5,this.u=s,this.D=i,this.connection=t,this.Z=n,this.tt=new R,this.connection.onreceive=t=>this.et(t),this.connection.onclose=t=>this.st(t),this.it={},this.nt={},this.rt=[],this.ot=[],this.ht=[],this.ct=0,this.lt=!1,this.ut=A.Disconnected,this.dt=!1,this.ft=this.D.writeMessage({type:x.Ping})}get state(){return this.ut}get connectionId(){return this.connection&&this.connection.connectionId||null}get baseUrl(){return this.connection.baseUrl||""}set baseUrl(t){if(this.ut!==A.Disconnected&&this.ut!==A.Reconnecting)throw new Error("The HubConnection must be in the Disconnected or Reconnecting state to change the url.");if(!t)throw new Error("The HubConnection url must be a valid url.");this.connection.baseUrl=t}start(){return this.wt=this.gt(),this.wt}async gt(){if(this.ut!==A.Disconnected)return Promise.reject(new Error("Cannot start a HubConnection that is not in the 'Disconnected' state."));this.ut=A.Connecting,this.u.log(e.Debug,"Starting HubConnection.");try{await this.yt(),g.isBrowser&&window.document.addEventListener("freeze",this.G),this.ut=A.Connected,this.dt=!0,this.u.log(e.Debug,"HubConnection connected successfully.")}catch(t){return this.ut=A.Disconnected,this.u.log(e.Debug,`HubConnection failed to start successfully because of error '${t}'.`),Promise.reject(t)}}async yt(){this.bt=void 0,this.lt=!1;const t=new Promise(((t,e)=>{this.vt=t,this.Et=e}));await this.connection.start(this.D.transferFormat);try{let s=this.D.version;this.connection.features.reconnect||(s=1);const i={protocol:this.D.name,version:s};if(this.u.log(e.Debug,"Sending handshake request."),await this.$t(this.tt.writeHandshakeRequest(i)),this.u.log(e.Information,`Using HubProtocol '${this.D.name}'.`),this.Ct(),this.St(),this.kt(),await t,this.bt)throw this.bt;!!this.connection.features.reconnect&&(this.Pt=new L(this.D,this.connection,this.Y),this.connection.features.disconnected=this.Pt.L.bind(this.Pt),this.connection.features.resend=()=>{if(this.Pt)return this.Pt.B()}),this.connection.features.inherentKeepAlive||await this.$t(this.ft)}catch(t){throw this.u.log(e.Debug,`Hub handshake failed with error '${t}' during start(). Stopping HubConnection.`),this.Ct(),this.Tt(),await this.connection.stop(t),t}}async stop(){const t=this.wt;this.connection.features.reconnect=!1,this.It=this._t(),await this.It;try{await t}catch(t){}}_t(t){if(this.ut===A.Disconnected)return this.u.log(e.Debug,`Call to HubConnection.stop(${t}) ignored because it is already in the disconnected state.`),Promise.resolve();if(this.ut===A.Disconnecting)return this.u.log(e.Debug,`Call to HttpConnection.stop(${t}) ignored because the connection is already in the disconnecting state.`),this.It;const s=this.ut;return this.ut=A.Disconnecting,this.u.log(e.Debug,"Stopping HubConnection."),this.Ht?(this.u.log(e.Debug,"Connection stopped during reconnect delay. Done reconnecting."),clearTimeout(this.Ht),this.Ht=void 0,this.Dt(),Promise.resolve()):(s===A.Connected&&this.Rt(),this.Ct(),this.Tt(),this.bt=t||new r("The connection was stopped before the hub handshake could complete."),this.connection.stop(t))}async Rt(){try{await this.xt(this.At())}catch{}}stream(t,...e){const[s,i]=this.Ut(e),n=this.Lt(t,e,i);let r;const o=new U;return o.cancelCallback=()=>{const t=this.Nt(n.invocationId);return delete this.it[n.invocationId],r.then((()=>this.xt(t)))},this.it[n.invocationId]=(t,e)=>{e?o.error(e):t&&(t.type===x.Completion?t.error?o.error(new Error(t.error)):o.complete():o.next(t.item))},r=this.xt(n).catch((t=>{o.error(t),delete this.it[n.invocationId]})),this.qt(s,r),o}$t(t){return this.kt(),this.connection.send(t)}xt(t){return this.Pt?this.Pt.A(t):this.$t(this.D.writeMessage(t))}send(t,...e){const[s,i]=this.Ut(e),n=this.xt(this.Mt(t,e,!0,i));return this.qt(s,n),n}invoke(t,...e){const[s,i]=this.Ut(e),n=this.Mt(t,e,!1,i);return new Promise(((t,e)=>{this.it[n.invocationId]=(s,i)=>{i?e(i):s&&(s.type===x.Completion?s.error?e(new Error(s.error)):t(s.result):e(new Error(`Unexpected message type: ${s.type}`)))};const i=this.xt(n).catch((t=>{e(t),delete this.it[n.invocationId]}));this.qt(s,i)}))}on(t,e){t&&e&&(t=t.toLowerCase(),this.nt[t]||(this.nt[t]=[]),-1===this.nt[t].indexOf(e)&&this.nt[t].push(e))}off(t,e){if(!t)return;t=t.toLowerCase();const s=this.nt[t];if(s)if(e){const i=s.indexOf(e);-1!==i&&(s.splice(i,1),0===s.length&&delete this.nt[t])}else delete this.nt[t]}onclose(t){t&&this.rt.push(t)}onreconnecting(t){t&&this.ot.push(t)}onreconnected(t){t&&this.ht.push(t)}et(t){if(this.Ct(),this.lt||(t=this.jt(t),this.lt=!0),t){const s=this.D.parseMessages(t,this.u);for(const t of s)if(!this.Pt||this.Pt.W(t))switch(t.type){case x.Invocation:this.Wt(t).catch((t=>{this.u.log(e.Error,`Invoke client method threw error: ${P(t)}`)}));break;case x.StreamItem:case x.Completion:{const s=this.it[t.invocationId];if(s){t.type===x.Completion&&delete this.it[t.invocationId];try{s(t)}catch(t){this.u.log(e.Error,`Stream callback threw error: ${P(t)}`)}}break}case x.Ping:break;case x.Close:{this.u.log(e.Information,"Close message received from server.");const s=t.error?new Error("Server returned an error on close: "+t.error):void 0;!0===t.allowReconnect?this.connection.stop(s):this.It=this._t(s);break}case x.Ack:this.Pt&&this.Pt.N(t);break;case x.Sequence:this.Pt&&this.Pt.F(t);break;default:this.u.log(e.Warning,`Invalid message type: ${t.type}.`)}}this.St()}jt(t){let s,i;try{[i,s]=this.tt.parseHandshakeResponse(t)}catch(t){const s="Error parsing handshake response: "+t;this.u.log(e.Error,s);const i=new Error(s);throw this.Et(i),i}if(s.error){const t="Server returned handshake error: "+s.error;this.u.log(e.Error,t);const i=new Error(t);throw this.Et(i),i}return this.u.log(e.Debug,"Server handshake complete."),this.vt(),i}kt(){this.connection.features.inherentKeepAlive||(this.K=(new Date).getTime()+this.keepAliveIntervalInMilliseconds,this.Tt())}St(){if(!(this.connection.features&&this.connection.features.inherentKeepAlive||(this.Ot=setTimeout((()=>this.serverTimeout()),this.serverTimeoutInMilliseconds),void 0!==this.Ft))){let t=this.K-(new Date).getTime();t<0&&(t=0),this.Ft=setTimeout((async()=>{if(this.ut===A.Connected)try{await this.$t(this.ft)}catch{this.Tt()}}),t)}}serverTimeout(){this.connection.stop(new Error("Server timeout elapsed without receiving a message from the server."))}async Wt(t){const s=t.target.toLowerCase(),i=this.nt[s];if(!i)return this.u.log(e.Warning,`No client method with the name '${s}' found.`),void(t.invocationId&&(this.u.log(e.Warning,`No result given for '${s}' method and invocation ID '${t.invocationId}'.`),await this.xt(this.Bt(t.invocationId,"Client didn't provide a result.",null))));const n=i.slice(),r=!!t.invocationId;let o,h,c;for(const i of n)try{const n=o;o=await i.apply(this,t.arguments),r&&o&&n&&(this.u.log(e.Error,`Multiple results provided for '${s}'. Sending error to server.`),c=this.Bt(t.invocationId,"Client provided multiple results.",null)),h=void 0}catch(t){h=t,this.u.log(e.Error,`A callback for the method '${s}' threw error '${t}'.`)}c?await this.xt(c):r?(h?c=this.Bt(t.invocationId,`${h}`,null):void 0!==o?c=this.Bt(t.invocationId,null,o):(this.u.log(e.Warning,`No result given for '${s}' method and invocation ID '${t.invocationId}'.`),c=this.Bt(t.invocationId,"Client didn't provide a result.",null)),await this.xt(c)):o&&this.u.log(e.Error,`Result given for '${s}' method but server is not expecting a result.`)}st(t){this.u.log(e.Debug,`HubConnection.connectionClosed(${t}) called while in state ${this.ut}.`),this.bt=this.bt||t||new r("The underlying connection was closed before the hub handshake could complete."),this.vt&&this.vt(),this.Xt(t||new Error("Invocation canceled due to the underlying connection being closed.")),this.Ct(),this.Tt(),this.ut===A.Disconnecting?this.Dt(t):this.ut===A.Connected&&this.Z?this.Jt(t):this.ut===A.Connected&&this.Dt(t)}Dt(t){if(this.dt){this.ut=A.Disconnected,this.dt=!1,this.Pt&&(this.Pt.X(null!=t?t:new Error("Connection closed.")),this.Pt=void 0),g.isBrowser&&window.document.removeEventListener("freeze",this.G);try{this.rt.forEach((e=>e.apply(this,[t])))}catch(s){this.u.log(e.Error,`An onclose callback called with error '${t}' threw error '${s}'.`)}}}async Jt(t){const s=Date.now();let i=0,n=void 0!==t?t:new Error("Attempting to reconnect due to a unknown error."),r=this.zt(i++,0,n);if(null===r)return this.u.log(e.Debug,"Connection not reconnecting because the IRetryPolicy returned null on the first reconnect attempt."),void this.Dt(t);if(this.ut=A.Reconnecting,t?this.u.log(e.Information,`Connection reconnecting because of error '${t}'.`):this.u.log(e.Information,"Connection reconnecting."),0!==this.ot.length){try{this.ot.forEach((e=>e.apply(this,[t])))}catch(s){this.u.log(e.Error,`An onreconnecting callback called with error '${t}' threw error '${s}'.`)}if(this.ut!==A.Reconnecting)return void this.u.log(e.Debug,"Connection left the reconnecting state in onreconnecting callback. Done reconnecting.")}for(;null!==r;){if(this.u.log(e.Information,`Reconnect attempt number ${i} will start in ${r} ms.`),await new Promise((t=>{this.Ht=setTimeout(t,r)})),this.Ht=void 0,this.ut!==A.Reconnecting)return void this.u.log(e.Debug,"Connection left the reconnecting state during reconnect delay. Done reconnecting.");try{if(await this.yt(),this.ut=A.Connected,this.u.log(e.Information,"HubConnection reconnected successfully."),0!==this.ht.length)try{this.ht.forEach((t=>t.apply(this,[this.connection.connectionId])))}catch(t){this.u.log(e.Error,`An onreconnected callback called with connectionId '${this.connection.connectionId}; threw error '${t}'.`)}return}catch(t){if(this.u.log(e.Information,`Reconnect attempt failed because of error '${t}'.`),this.ut!==A.Reconnecting)return this.u.log(e.Debug,`Connection moved to the '${this.ut}' from the reconnecting state during reconnect attempt. Done reconnecting.`),void(this.ut===A.Disconnecting&&this.Dt());n=t instanceof Error?t:new Error(t.toString()),r=this.zt(i++,Date.now()-s,n)}}this.u.log(e.Information,`Reconnect retries have been exhausted after ${Date.now()-s} ms and ${i} failed attempts. Connection disconnecting.`),this.Dt()}zt(t,s,i){try{return this.Z.nextRetryDelayInMilliseconds({elapsedMilliseconds:s,previousRetryCount:t,retryReason:i})}catch(i){return this.u.log(e.Error,`IRetryPolicy.nextRetryDelayInMilliseconds(${t}, ${s}) threw error '${i}'.`),null}}Xt(t){const s=this.it;this.it={},Object.keys(s).forEach((i=>{const n=s[i];try{n(null,t)}catch(s){this.u.log(e.Error,`Stream 'error' callback called with '${t}' threw error: ${P(s)}`)}}))}Tt(){this.Ft&&(clearTimeout(this.Ft),this.Ft=void 0)}Ct(){this.Ot&&clearTimeout(this.Ot)}Mt(t,e,s,i){if(s)return 0!==i.length?{arguments:e,streamIds:i,target:t,type:x.Invocation}:{arguments:e,target:t,type:x.Invocation};{const s=this.ct;return this.ct++,0!==i.length?{arguments:e,invocationId:s.toString(),streamIds:i,target:t,type:x.Invocation}:{arguments:e,invocationId:s.toString(),target:t,type:x.Invocation}}}qt(t,e){if(0!==t.length){e||(e=Promise.resolve());for(const s in t)t[s].subscribe({complete:()=>{e=e.then((()=>this.xt(this.Bt(s))))},error:t=>{let i;i=t instanceof Error?t.message:t&&t.toString?t.toString():"Unknown error",e=e.then((()=>this.xt(this.Bt(s,i))))},next:t=>{e=e.then((()=>this.xt(this.Vt(s,t))))}})}}Ut(t){const e=[],s=[];for(let i=0;i0)&&(e=!1,this.Zt=await this.Yt()),this.te(t);const s=await this.Qt.send(t);return e&&401===s.statusCode&&this.Yt?(this.Zt=await this.Yt(),this.te(t),await this.Qt.send(t)):s}te(t){t.headers||(t.headers={}),this.Zt?t.headers[W.Authorization]=`Bearer ${this.Zt}`:this.Yt&&t.headers[W.Authorization]&&delete t.headers[W.Authorization]}getCookieString(t){return this.Qt.getCookieString(t)}}var F,B;!function(t){t[t.None=0]="None",t[t.WebSockets=1]="WebSockets",t[t.ServerSentEvents=2]="ServerSentEvents",t[t.LongPolling=4]="LongPolling"}(F||(F={})),function(t){t[t.Text=1]="Text",t[t.Binary=2]="Binary"}(B||(B={}));class X{constructor(){this.ee=!1,this.onabort=null}abort(){this.ee||(this.ee=!0,this.onabort&&this.onabort())}get signal(){return this}get aborted(){return this.ee}}class J{get pollAborted(){return this.se.aborted}constructor(t,e,s){this.$=t,this.u=e,this.se=new X,this.ie=s,this.ne=!1,this.onreceive=null,this.onclose=null}async connect(t,s){if(w.isRequired(t,"url"),w.isRequired(s,"transferFormat"),w.isIn(s,B,"transferFormat"),this.re=t,this.u.log(e.Trace,"(LongPolling transport) Connecting."),s===B.Binary&&"undefined"!=typeof XMLHttpRequest&&"string"!=typeof(new XMLHttpRequest).responseType)throw new Error("Binary protocols over XmlHttpRequest not implementing advanced features are not supported.");const[n,r]=$(),o={[n]:r,...this.ie.headers},h={abortSignal:this.se.signal,headers:o,timeout:1e5,withCredentials:this.ie.withCredentials};s===B.Binary&&(h.responseType="arraybuffer");const c=`${t}&_=${Date.now()}`;this.u.log(e.Trace,`(LongPolling transport) polling: ${c}.`);const a=await this.$.get(c,h);200!==a.statusCode?(this.u.log(e.Error,`(LongPolling transport) Unexpected response code: ${a.statusCode}.`),this.oe=new i(a.statusText||"",a.statusCode),this.ne=!1):this.ne=!0,this.he=this.ce(this.re,h)}async ce(t,s){try{for(;this.ne;)try{const n=`${t}&_=${Date.now()}`;this.u.log(e.Trace,`(LongPolling transport) polling: ${n}.`);const r=await this.$.get(n,s);204===r.statusCode?(this.u.log(e.Information,"(LongPolling transport) Poll terminated by server."),this.ne=!1):200!==r.statusCode?(this.u.log(e.Error,`(LongPolling transport) Unexpected response code: ${r.statusCode}.`),this.oe=new i(r.statusText||"",r.statusCode),this.ne=!1):r.content?(this.u.log(e.Trace,`(LongPolling transport) data received. ${m(r.content,this.ie.logMessageContent)}.`),this.onreceive&&this.onreceive(r.content)):this.u.log(e.Trace,"(LongPolling transport) Poll timed out, reissuing.")}catch(t){this.ne?t instanceof n?this.u.log(e.Trace,"(LongPolling transport) Poll timed out, reissuing."):(this.oe=t,this.ne=!1):this.u.log(e.Trace,`(LongPolling transport) Poll errored after shutdown: ${t.message}`)}}finally{this.u.log(e.Trace,"(LongPolling transport) Polling complete."),this.pollAborted||this.ae()}}async send(t){return this.ne?b(this.u,"LongPolling",this.$,this.re,t,this.ie):Promise.reject(new Error("Cannot send until the transport is connected"))}async stop(){this.u.log(e.Trace,"(LongPolling transport) Stopping polling."),this.ne=!1,this.se.abort();try{await this.he,this.u.log(e.Trace,`(LongPolling transport) sending DELETE request to ${this.re}.`);const t={},[s,n]=$();t[s]=n;const r={headers:{...t,...this.ie.headers},timeout:this.ie.timeout,withCredentials:this.ie.withCredentials};let o;try{await this.$.delete(this.re,r)}catch(t){o=t}o?o instanceof i&&(404===o.statusCode?this.u.log(e.Trace,"(LongPolling transport) A 404 response was returned from sending a DELETE request."):this.u.log(e.Trace,`(LongPolling transport) Error sending a DELETE request: ${o}`)):this.u.log(e.Trace,"(LongPolling transport) DELETE request accepted.")}finally{this.u.log(e.Trace,"(LongPolling transport) Stop finished."),this.ae()}}ae(){if(this.onclose){let t="(LongPolling transport) Firing onclose event.";this.oe&&(t+=" Error: "+this.oe),this.u.log(e.Trace,t),this.onclose(this.oe)}}}class z{constructor(t,e,s,i){this.$=t,this.Zt=e,this.u=s,this.ie=i,this.onreceive=null,this.onclose=null}async connect(t,s){return w.isRequired(t,"url"),w.isRequired(s,"transferFormat"),w.isIn(s,B,"transferFormat"),this.u.log(e.Trace,"(SSE transport) Connecting."),this.re=t,this.Zt&&(t+=(t.indexOf("?")<0?"?":"&")+`access_token=${encodeURIComponent(this.Zt)}`),new Promise(((i,n)=>{let r,o=!1;if(s===B.Text){if(g.isBrowser||g.isWebWorker)r=new this.ie.EventSource(t,{withCredentials:this.ie.withCredentials});else{const e=this.$.getCookieString(t),s={};s.Cookie=e;const[i,n]=$();s[i]=n,r=new this.ie.EventSource(t,{withCredentials:this.ie.withCredentials,headers:{...s,...this.ie.headers}})}try{r.onmessage=t=>{if(this.onreceive)try{this.u.log(e.Trace,`(SSE transport) data received. ${m(t.data,this.ie.logMessageContent)}.`),this.onreceive(t.data)}catch(t){return void this.le(t)}},r.onerror=t=>{o?this.le():n(new Error("EventSource failed to connect. The connection could not be found on the server, either the connection ID is not present on the server, or a proxy is refusing/buffering the connection. If you have multiple servers check that sticky sessions are enabled."))},r.onopen=()=>{this.u.log(e.Information,`SSE connected to ${this.re}`),this.ue=r,o=!0,i()}}catch(t){return void n(t)}}else n(new Error("The Server-Sent Events transport only supports the 'Text' transfer format"))}))}async send(t){return this.ue?b(this.u,"SSE",this.$,this.re,t,this.ie):Promise.reject(new Error("Cannot send until the transport is connected"))}stop(){return this.le(),Promise.resolve()}le(t){this.ue&&(this.ue.close(),this.ue=void 0,this.onclose&&this.onclose(t))}}class V{constructor(t,e,s,i,n,r){this.u=s,this.Yt=e,this.de=i,this.fe=n,this.$=t,this.onreceive=null,this.onclose=null,this.pe=r}async connect(t,s){let i;return w.isRequired(t,"url"),w.isRequired(s,"transferFormat"),w.isIn(s,B,"transferFormat"),this.u.log(e.Trace,"(WebSockets transport) Connecting."),this.Yt&&(i=await this.Yt()),new Promise(((n,r)=>{let o;t=t.replace(/^http/,"ws");const h=this.$.getCookieString(t);let c=!1;if(g.isNode||g.isReactNative){const e={},[s,n]=$();e[s]=n,i&&(e[W.Authorization]=`Bearer ${i}`),h&&(e[W.Cookie]=h),o=new this.fe(t,void 0,{headers:{...e,...this.pe}})}else i&&(t+=(t.indexOf("?")<0?"?":"&")+`access_token=${encodeURIComponent(i)}`);o||(o=new this.fe(t)),s===B.Binary&&(o.binaryType="arraybuffer"),o.onopen=s=>{this.u.log(e.Information,`WebSocket connected to ${t}.`),this.we=o,c=!0,n()},o.onerror=t=>{let s=null;s="undefined"!=typeof ErrorEvent&&t instanceof ErrorEvent?t.error:"There was an error with the transport",this.u.log(e.Information,`(WebSockets transport) ${s}.`)},o.onmessage=t=>{if(this.u.log(e.Trace,`(WebSockets transport) data received. ${m(t.data,this.de)}.`),this.onreceive)try{this.onreceive(t.data)}catch(t){return void this.le(t)}},o.onclose=t=>{if(c)this.le(t);else{let e=null;e="undefined"!=typeof ErrorEvent&&t instanceof ErrorEvent?t.error:"WebSocket failed to connect. The connection could not be found on the server, either the endpoint may not be a SignalR endpoint, the connection ID is not present on the server, or there is a proxy blocking WebSockets. If you have multiple servers check that sticky sessions are enabled.",r(new Error(e))}}}))}send(t){return this.we&&this.we.readyState===this.fe.OPEN?(this.u.log(e.Trace,`(WebSockets transport) sending data. ${m(t,this.de)}.`),this.we.send(t),Promise.resolve()):Promise.reject("WebSocket is not in the OPEN state")}stop(){return this.we&&this.le(void 0),Promise.resolve()}le(t){this.we&&(this.we.onclose=()=>{},this.we.onmessage=()=>{},this.we.onerror=()=>{},this.we.close(),this.we=void 0),this.u.log(e.Trace,"(WebSockets transport) socket closed."),this.onclose&&(!this.ge(t)||!1!==t.wasClean&&1e3===t.code?t instanceof Error?this.onclose(t):this.onclose():this.onclose(new Error(`WebSocket closed with status code: ${t.code} (${t.reason||"no reason given"}).`)))}ge(t){return t&&"boolean"==typeof t.wasClean&&"number"==typeof t.code}}class K{constructor(t,s={}){var i;if(this.me=()=>{},this.features={},this.ye=1,w.isRequired(t,"url"),this.u=void 0===(i=s.logger)?new E(e.Information):null===i?f.instance:void 0!==i.log?i:new E(i),this.baseUrl=this.be(t),(s=s||{}).logMessageContent=void 0!==s.logMessageContent&&s.logMessageContent,"boolean"!=typeof s.withCredentials&&void 0!==s.withCredentials)throw new Error("withCredentials option was not a 'boolean' or 'undefined' value");s.withCredentials=void 0===s.withCredentials||s.withCredentials,s.timeout=void 0===s.timeout?1e5:s.timeout;let n=null,r=null;if(g.isNode){const t=require;n=t("ws"),r=t("eventsource")}g.isNode||"undefined"==typeof WebSocket||s.WebSocket?g.isNode&&!s.WebSocket&&n&&(s.WebSocket=n):s.WebSocket=WebSocket,g.isNode||"undefined"==typeof EventSource||s.EventSource?g.isNode&&!s.EventSource&&void 0!==r&&(s.EventSource=r):s.EventSource=EventSource,this.$=new O(s.httpClient||new H(this.u),s.accessTokenFactory),this.ut="Disconnected",this.dt=!1,this.ie=s,this.onreceive=null,this.onclose=null}async start(t){if(t=t||B.Binary,w.isIn(t,B,"transferFormat"),this.u.log(e.Debug,`Starting connection with transfer format '${B[t]}'.`),"Disconnected"!==this.ut)return Promise.reject(new Error("Cannot start an HttpConnection that is not in the 'Disconnected' state."));if(this.ut="Connecting",this.ve=this.yt(t),await this.ve,"Disconnecting"===this.ut){const t="Failed to start the HttpConnection before stop() was called.";return this.u.log(e.Error,t),await this.It,Promise.reject(new r(t))}if("Connected"!==this.ut){const t="HttpConnection.startInternal completed gracefully but didn't enter the connection into the connected state!";return this.u.log(e.Error,t),Promise.reject(new r(t))}this.dt=!0}send(t){return"Connected"!==this.ut?Promise.reject(new Error("Cannot send data if the connection is not in the 'Connected' State.")):(this.Ee||(this.Ee=new G(this.transport)),this.Ee.send(t))}async stop(t){return"Disconnected"===this.ut?(this.u.log(e.Debug,`Call to HttpConnection.stop(${t}) ignored because the connection is already in the disconnected state.`),Promise.resolve()):"Disconnecting"===this.ut?(this.u.log(e.Debug,`Call to HttpConnection.stop(${t}) ignored because the connection is already in the disconnecting state.`),this.It):(this.ut="Disconnecting",this.It=new Promise((t=>{this.me=t})),await this._t(t),void await this.It)}async _t(t){this.$e=t;try{await this.ve}catch(t){}if(this.transport){try{await this.transport.stop()}catch(t){this.u.log(e.Error,`HttpConnection.transport.stop() threw error '${t}'.`),this.Ce()}this.transport=void 0}else this.u.log(e.Debug,"HttpConnection.transport is undefined in HttpConnection.stop() because start() failed.")}async yt(t){let s=this.baseUrl;this.Yt=this.ie.accessTokenFactory,this.$.Yt=this.Yt;try{if(this.ie.skipNegotiation){if(this.ie.transport!==F.WebSockets)throw new Error("Negotiation can only be skipped when using the WebSocket transport directly.");this.transport=this.Se(F.WebSockets),await this.ke(s,t)}else{let e=null,i=0;do{if(e=await this.Pe(s),"Disconnecting"===this.ut||"Disconnected"===this.ut)throw new r("The connection was stopped during negotiation.");if(e.error)throw new Error(e.error);if(e.ProtocolVersion)throw new Error("Detected a connection attempt to an ASP.NET SignalR Server. This client only supports connecting to an ASP.NET Core SignalR Server. See https://aka.ms/signalr-core-differences for details.");if(e.url&&(s=e.url),e.accessToken){const t=e.accessToken;this.Yt=()=>t,this.$.Zt=t,this.$.Yt=void 0}i++}while(e.url&&i<100);if(100===i&&e.url)throw new Error("Negotiate redirection limit exceeded.");await this.Te(s,this.ie.transport,e,t)}this.transport instanceof J&&(this.features.inherentKeepAlive=!0),"Connecting"===this.ut&&(this.u.log(e.Debug,"The HttpConnection connected successfully."),this.ut="Connected")}catch(t){return this.u.log(e.Error,"Failed to start the connection: "+t),this.ut="Disconnected",this.transport=void 0,this.me(),Promise.reject(t)}}async Pe(t){const s={},[n,r]=$();s[n]=r;const o=this.Ie(t);this.u.log(e.Debug,`Sending negotiation request: ${o}.`);try{const t=await this.$.post(o,{content:"",headers:{...s,...this.ie.headers},timeout:this.ie.timeout,withCredentials:this.ie.withCredentials});if(200!==t.statusCode)return Promise.reject(new Error(`Unexpected status code returned from negotiate '${t.statusCode}'`));const e=JSON.parse(t.content);return(!e.negotiateVersion||e.negotiateVersion<1)&&(e.connectionToken=e.connectionId),e.useStatefulReconnect&&!0!==this.ie._e?Promise.reject(new a("Client didn't negotiate Stateful Reconnect but the server did.")):e}catch(t){let s="Failed to complete negotiation with the server: "+t;return t instanceof i&&404===t.statusCode&&(s+=" Either this is not a SignalR endpoint or there is a proxy blocking the connection."),this.u.log(e.Error,s),Promise.reject(new a(s))}}He(t,e){return e?t+(-1===t.indexOf("?")?"?":"&")+`id=${e}`:t}async Te(t,s,i,n){let o=this.He(t,i.connectionToken);if(this.De(s))return this.u.log(e.Debug,"Connection was provided an instance of ITransport, using that directly."),this.transport=s,await this.ke(o,n),void(this.connectionId=i.connectionId);const h=[],a=i.availableTransports||[];let u=i;for(const i of a){const a=this.Re(i,s,n,!0===(null==u?void 0:u.useStatefulReconnect));if(a instanceof Error)h.push(`${i.transport} failed:`),h.push(a);else if(this.De(a)){if(this.transport=a,!u){try{u=await this.Pe(t)}catch(t){return Promise.reject(t)}o=this.He(t,u.connectionToken)}try{return await this.ke(o,n),void(this.connectionId=u.connectionId)}catch(t){if(this.u.log(e.Error,`Failed to start the transport '${i.transport}': ${t}`),u=void 0,h.push(new c(`${i.transport} failed: ${t}`,F[i.transport])),"Connecting"!==this.ut){const t="Failed to select transport before stop() was called.";return this.u.log(e.Debug,t),Promise.reject(new r(t))}}}}return h.length>0?Promise.reject(new l(`Unable to connect to the server with any of the available transports. ${h.join(" ")}`,h)):Promise.reject(new Error("None of the transports supported by the client are supported by the server."))}Se(t){switch(t){case F.WebSockets:if(!this.ie.WebSocket)throw new Error("'WebSocket' is not supported in your environment.");return new V(this.$,this.Yt,this.u,this.ie.logMessageContent,this.ie.WebSocket,this.ie.headers||{});case F.ServerSentEvents:if(!this.ie.EventSource)throw new Error("'EventSource' is not supported in your environment.");return new z(this.$,this.$.Zt,this.u,this.ie);case F.LongPolling:return new J(this.$,this.u,this.ie);default:throw new Error(`Unknown transport: ${t}.`)}}ke(t,e){return this.transport.onreceive=this.onreceive,this.features.reconnect?this.transport.onclose=async s=>{let i=!1;if(this.features.reconnect){try{this.features.disconnected(),await this.transport.connect(t,e),await this.features.resend()}catch{i=!0}i&&this.Ce(s)}else this.Ce(s)}:this.transport.onclose=t=>this.Ce(t),this.transport.connect(t,e)}Re(t,s,i,n){const r=F[t.transport];if(null==r)return this.u.log(e.Debug,`Skipping transport '${t.transport}' because it is not supported by this client.`),new Error(`Skipping transport '${t.transport}' because it is not supported by this client.`);if(!function(t,e){return!t||0!=(e&t)}(s,r))return this.u.log(e.Debug,`Skipping transport '${F[r]}' because it was disabled by the client.`),new h(`'${F[r]}' is disabled by the client.`,r);if(!(t.transferFormats.map((t=>B[t])).indexOf(i)>=0))return this.u.log(e.Debug,`Skipping transport '${F[r]}' because it does not support the requested transfer format '${B[i]}'.`),new Error(`'${F[r]}' does not support ${B[i]}.`);if(r===F.WebSockets&&!this.ie.WebSocket||r===F.ServerSentEvents&&!this.ie.EventSource)return this.u.log(e.Debug,`Skipping transport '${F[r]}' because it is not supported in your environment.'`),new o(`'${F[r]}' is not supported in your environment.`,r);this.u.log(e.Debug,`Selecting transport '${F[r]}'.`);try{return this.features.reconnect=r===F.WebSockets?n:void 0,this.Se(r)}catch(t){return t}}De(t){return t&&"object"==typeof t&&"connect"in t}Ce(t){if(this.u.log(e.Debug,`HttpConnection.stopConnection(${t}) called while in state ${this.ut}.`),this.transport=void 0,t=this.$e||t,this.$e=void 0,"Disconnected"!==this.ut){if("Connecting"===this.ut)throw this.u.log(e.Warning,`Call to HttpConnection.stopConnection(${t}) was ignored because the connection is still in the connecting state.`),new Error(`HttpConnection.stopConnection(${t}) was called while the connection is still in the connecting state.`);if("Disconnecting"===this.ut&&this.me(),t?this.u.log(e.Error,`Connection disconnected with error '${t}'.`):this.u.log(e.Information,"Connection disconnected."),this.Ee&&(this.Ee.stop().catch((t=>{this.u.log(e.Error,`TransportSendQueue.stop() threw error '${t}'.`)})),this.Ee=void 0),this.connectionId=void 0,this.ut="Disconnected",this.dt){this.dt=!1;try{this.onclose&&this.onclose(t)}catch(s){this.u.log(e.Error,`HttpConnection.onclose(${t}) threw error '${s}'.`)}}}else this.u.log(e.Debug,`Call to HttpConnection.stopConnection(${t}) was ignored because the connection is already in the disconnected state.`)}be(t){if(0===t.lastIndexOf("https://",0)||0===t.lastIndexOf("http://",0))return t;if(!g.isBrowser)throw new Error(`Cannot resolve '${t}'.`);const s=window.document.createElement("a");return s.href=t,this.u.log(e.Information,`Normalizing '${t}' to '${s.href}'.`),s.href}Ie(t){const e=new URL(t);e.pathname.endsWith("/")?e.pathname+="negotiate":e.pathname+="/negotiate";const s=new URLSearchParams(e.searchParams);return s.has("negotiateVersion")||s.append("negotiateVersion",this.ye.toString()),s.has("useStatefulReconnect")?"true"===s.get("useStatefulReconnect")&&(this.ie._e=!0):!0===this.ie._e&&s.append("useStatefulReconnect","true"),e.search=s.toString(),e.toString()}}class G{constructor(t){this.xe=t,this.Ae=[],this.Ue=!0,this.Le=new Q,this.Ne=new Q,this.qe=this.Me()}send(t){return this.je(t),this.Ne||(this.Ne=new Q),this.Ne.promise}stop(){return this.Ue=!1,this.Le.resolve(),this.qe}je(t){if(this.Ae.length&&typeof this.Ae[0]!=typeof t)throw new Error(`Expected data to be of type ${typeof this.Ae} but was of type ${typeof t}`);this.Ae.push(t),this.Le.resolve()}async Me(){for(;;){if(await this.Le.promise,!this.Ue){this.Ne&&this.Ne.reject("Connection stopped.");break}this.Le=new Q;const t=this.Ne;this.Ne=void 0;const e="string"==typeof this.Ae[0]?this.Ae.join(""):G.We(this.Ae);this.Ae.length=0;try{await this.xe.send(e),t.resolve()}catch(e){t.reject(e)}}}static We(t){const e=t.map((t=>t.byteLength)).reduce(((t,e)=>t+e)),s=new Uint8Array(e);let i=0;for(const e of t)s.set(new Uint8Array(e),i),i+=e.byteLength;return s.buffer}}class Q{constructor(){this.promise=new Promise(((t,e)=>[this.j,this.Oe]=[t,e]))}resolve(){this.j()}reject(t){this.Oe(t)}}class Y{constructor(){this.name="json",this.version=2,this.transferFormat=B.Text}parseMessages(t,s){if("string"!=typeof t)throw new Error("Invalid input for JSON hub protocol. Expected a string.");if(!t)return[];null===s&&(s=f.instance);const i=D.parse(t),n=[];for(const t of i){const i=JSON.parse(t);if("number"!=typeof i.type)throw new Error("Invalid payload.");switch(i.type){case x.Invocation:this.U(i);break;case x.StreamItem:this.Fe(i);break;case x.Completion:this.Be(i);break;case x.Ping:case x.Close:break;case x.Ack:this.Xe(i);break;case x.Sequence:this.Je(i);break;default:s.log(e.Information,"Unknown message type '"+i.type+"' ignored.");continue}n.push(i)}return n}writeMessage(t){return D.write(JSON.stringify(t))}U(t){this.ze(t.target,"Invalid payload for Invocation message."),void 0!==t.invocationId&&this.ze(t.invocationId,"Invalid payload for Invocation message.")}Fe(t){if(this.ze(t.invocationId,"Invalid payload for StreamItem message."),void 0===t.item)throw new Error("Invalid payload for StreamItem message.")}Be(t){if(t.result&&t.error)throw new Error("Invalid payload for Completion message.");!t.result&&t.error&&this.ze(t.error,"Invalid payload for Completion message."),this.ze(t.invocationId,"Invalid payload for Completion message.")}Xe(t){if("number"!=typeof t.sequenceId)throw new Error("Invalid SequenceId for Ack message.")}Je(t){if("number"!=typeof t.sequenceId)throw new Error("Invalid SequenceId for Sequence message.")}ze(t,e){if("string"!=typeof t||""===t)throw new Error(e)}}const Z={trace:e.Trace,debug:e.Debug,info:e.Information,information:e.Information,warn:e.Warning,warning:e.Warning,error:e.Error,critical:e.Critical,none:e.None};class tt{configureLogging(t){if(w.isRequired(t,"logging"),void 0!==t.log)this.logger=t;else if("string"==typeof t){const e=function(t){const e=Z[t.toLowerCase()];if(void 0!==e)return e;throw new Error(`Unknown log level: ${t}`)}(t);this.logger=new E(e)}else this.logger=new E(t);return this}withUrl(t,e){return w.isRequired(t,"url"),w.isNotEmpty(t,"url"),this.url=t,this.httpConnectionOptions="object"==typeof e?{...this.httpConnectionOptions,...e}:{...this.httpConnectionOptions,transport:e},this}withHubProtocol(t){return w.isRequired(t,"protocol"),this.protocol=t,this}withAutomaticReconnect(t){if(this.reconnectPolicy)throw new Error("A reconnectPolicy has already been set.");return t?Array.isArray(t)?this.reconnectPolicy=new j(t):this.reconnectPolicy=t:this.reconnectPolicy=new j,this}withServerTimeout(t){return w.isRequired(t,"milliseconds"),this.Ve=t,this}withKeepAliveInterval(t){return w.isRequired(t,"milliseconds"),this.Ke=t,this}withStatefulReconnect(t){return void 0===this.httpConnectionOptions&&(this.httpConnectionOptions={}),this.httpConnectionOptions._e=!0,this.Y=null==t?void 0:t.bufferSize,this}build(){const t=this.httpConnectionOptions||{};if(void 0===t.logger&&(t.logger=this.logger),!this.url)throw new Error("The 'HubConnectionBuilder.withUrl' method must be called before building the connection.");const e=new K(this.url,t);return q.create(e,this.logger||f.instance,this.protocol||new Y,this.reconnectPolicy,this.Ve,this.Ke,this.Y)}}return Uint8Array.prototype.indexOf||Object.defineProperty(Uint8Array.prototype,"indexOf",{value:Array.prototype.indexOf,writable:!0}),Uint8Array.prototype.slice||Object.defineProperty(Uint8Array.prototype,"slice",{value:function(t,e){return new Uint8Array(Array.prototype.slice.call(this,t,e))},writable:!0}),Uint8Array.prototype.forEach||Object.defineProperty(Uint8Array.prototype,"forEach",{value:Array.prototype.forEach,writable:!0}),s})(),"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.signalR=e():t.signalR=e(); +//# sourceMappingURL=signalr.min.js.map \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/style/admin.css b/AdminSrc/AdminHost/wwwroot/admin/dist/style/admin.css new file mode 100644 index 0000000..b4e3dac --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/style/admin.css @@ -0,0 +1,2 @@ +/** layuiAdmin.pro-v1.4.0 LPPL License By https://www.layui.com/admin/ */ +html #layuicss-layuiAdmin{display:none;position:absolute;width:1989px}::-webkit-input-placeholder{color:#ccc}html{background-color:#f2f2f2;color:#666}.layadmin-tabsbody-item,[template]{display:none}[lay-href],[lay-tips],[layadmin-event]{cursor:pointer}.layui-layout-admin .layui-header{position:fixed;top:0;left:0;width:100%;height:50px}.layui-layout-admin .layui-header .layui-nav .layui-nav-child a{color:#333}.layui-layout-admin .layui-side{width:220px;top:0;z-index:1001}.layui-layout-admin .layui-header .layui-nav .layui-nav-item,.layui-layout-admin .layui-logo{height:50px;line-height:50px}.layui-layout-admin .layui-logo{position:fixed;left:0;top:0;z-index:1002;width:220px;height:49px;padding:0 15px;box-sizing:border-box;overflow:hidden;font-weight:300;background-repeat:no-repeat;background-position:center center}.layadmin-pagetabs,.layui-layout-admin .layui-body,.layui-layout-admin .layui-footer,.layui-layout-admin .layui-layout-left{left:220px}.layadmin-pagetabs{position:fixed;top:50px;right:0;z-index:999}.layadmin-pagetabs .layui-breadcrumb{padding:0 15px}.layui-layout-admin .layui-body{position:fixed;top:90px;bottom:0}.layui-layout-admin .layui-body .layadmin-tabsbody-item{position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden;overflow-y:auto}.layui-layout-admin .layui-header .layui-nav-img{width:26px;height:26px}.layui-layout-admin .layui-header .layui-nav-child{top:55px}.layui-layout-admin .layui-header .layui-layout-right .layui-nav-child{left:auto;right:0}.layui-layout-admin .layui-header .layui-nav .layui-nav-child dd.layui-this,.layui-layout-admin .layui-header .layui-nav .layui-nav-child dd.layui-this a{background:0 0}.layadmin-pagetabs,.layui-layout-admin .layui-body,.layui-layout-admin .layui-footer,.layui-layout-admin .layui-header .layui-layout-right,.layui-layout-admin .layui-header .layui-nav .layui-nav-item,.layui-layout-admin .layui-layout-left,.layui-layout-admin .layui-logo,.layui-layout-admin .layui-side{transition:all .3s;-webkit-transition:all .3s}.layui-icon-login-qq{color:#3492ED}.layui-icon-login-wechat{color:#4DAF29}.layui-icon-login-weibo{color:#CF1900}.layui-form[wid100] .layui-form-label{width:100px}.layui-form[wid100] .layui-input-block{margin-left:130px}@media screen and (max-width:450px){.layui-form[wid100] .layui-form-item .layui-input-inline{margin-left:132px}.layui-form[wid100] .layui-form-item .layui-input-inline+.layui-form-mid{margin-left:130px}}.layui-form-item .layui-input-company{width:auto;padding-right:10px;line-height:38px}.layui-bg-white{background-color:#fff}.layadmin-loading{position:absolute;left:50%;top:50%;margin:-16px -15px;font-size:30px;color:#c2c2c2}.layadmin-fixed{position:fixed;left:0;top:0;z-index:999}.layadmin-link{color:#029789!important}.layadmin-link:hover{opacity:.8}.layui-layer-admin .layui-layer-title{height:50px;line-height:50px;border:0;background-color:#20222A;color:#fff}.layui-layer-admin i[close]{position:absolute;padding:5px;right:10px;top:12px;color:#fff;cursor:pointer}.layui-layer-admin .layui-layer-content{padding:20px;line-height:22px}.layui-layer-admin .layui-layer-content cite{font-style:normal;color:#FF5722}.layui-layer-adminRight{top:50px!important;bottom:0;box-shadow:1px 1px 10px rgba(0,0,0,.1);border-radius:0;overflow:auto}.layadmin-note .layui-layer-content{padding:0}.layadmin-note textarea{display:block;width:300px;height:132px;min-width:300px;min-height:132px;line-height:20px;padding:10px 20px;border:none;box-sizing:border-box;color:#666;word-wrap:break-word}.layui-layout-admin .layui-layout-left{padding:0 10px}.layui-layout-admin .layui-layout-left .layui-nav-item{margin:0 20px}.layui-layout-admin .layui-input-search{display:inline-block;vertical-align:middle;height:32px;border:none;cursor:text}.layui-layout-admin .layui-layout-left a,.layui-layout-admin .layui-layout-right{padding:0}.layui-header .layui-nav-item .layui-icon{position:relative;top:1px;font-size:16px}.layui-header .layui-layout-right .layui-badge-dot{margin-left:0}.layui-header .layui-nav .layui-this:after,.layui-layout-admin .layui-header .layui-nav-bar{top:0!important;bottom:auto;height:3px;background-color:#fff;background-color:rgba(255,255,255,.3)}.layadmin-body-shade{position:fixed;display:none;left:0;right:0;top:0;bottom:0;background-color:rgba(0,0,0,.3);z-index:1000}.layui-side-menu .layui-side-scroll{width:240px}.layui-side-menu .layui-nav{width:220px;margin-top:50px;background:0 0}.layui-side-menu .layui-nav .layui-nav-item a{height:40px;line-height:40px;padding-left:45px;padding-right:30px}.layui-side-menu .layui-nav .layui-nav-item>a{padding-top:8px;padding-bottom:8px}.layui-side-menu .layui-nav .layui-nav-item a:hover{background:0 0}.layui-side-menu .layui-nav .layui-nav-itemed>.layui-nav-child{padding:5px 0}.layui-side-menu .layui-nav .layui-nav-item .layui-icon{position:absolute;top:50%;left:20px;margin-top:-19px}.layui-side-menu .layui-nav .layui-nav-child .layui-nav-child{background:0 0!important}.layui-side-menu .layui-nav .layui-nav-child .layui-nav-child a{padding-left:60px}.layui-side-menu .layui-nav .layui-nav-more{right:15px}@media screen and (max-width:992px){.layui-layout-admin .layui-side{transform:translate3d(-220px,0,0);-webkit-transform:translate3d(-220px,0,0);width:220px}.layadmin-pagetabs,.layui-layout-admin .layui-body,.layui-layout-admin .layui-footer,.layui-layout-admin .layui-layout-left{left:0}}.layadmin-side-shrink .layui-layout-admin .layui-logo{width:60px;background-image:url(res/logo.png)}.layadmin-side-shrink .layui-layout-admin .layui-logo span{display:none}.layadmin-side-shrink .layui-side{left:0;width:60px}.layadmin-side-shrink .layadmin-pagetabs,.layadmin-side-shrink .layui-layout-admin .layui-body,.layadmin-side-shrink .layui-layout-admin .layui-footer,.layadmin-side-shrink .layui-layout-admin .layui-layout-left{left:60px}.layadmin-side-shrink .layui-side-menu .layui-nav{position:static;width:60px}.layadmin-side-shrink .layui-side-menu .layui-nav-item{position:static}.layadmin-side-shrink .layui-side-menu .layui-nav-item>a{padding-right:0}.layadmin-side-shrink .layui-side-menu .layui-nav-item cite,.layadmin-side-shrink .layui-side-menu .layui-nav>.layui-nav-item>.layui-nav-child,.layadmin-side-shrink .layui-side-menu .layui-nav>.layui-nav-item>a .layui-nav-more{display:none;padding:8px 0;width:200px}.layadmin-side-shrink .layui-side-menu .layui-nav>.layui-nav-itemed>a{background:rgba(0,0,0,.3)}.layadmin-side-spread-sm .layadmin-pagetabs,.layadmin-side-spread-sm .layui-layout-admin .layui-body,.layadmin-side-spread-sm .layui-layout-admin .layui-footer,.layadmin-side-spread-sm .layui-layout-admin .layui-layout-left{left:0;transform:translate3d(220px,0,0);-webkit-transform:translate3d(220px,0,0)}.layadmin-side-spread-sm .layui-layout-admin .layui-layout-right{transform:translate3d(220px,0,0);-webkit-transform:translate3d(220px,0,0)}.layadmin-side-spread-sm .layui-side{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0)}.layadmin-side-spread-sm .layadmin-body-shade{display:block}.layadmin-pagetabs .layui-tab-title li:first-child .layui-tab-close,.layadmin-tabs-select.layui-nav .layui-nav-bar,.layadmin-tabs-select.layui-nav .layui-nav-more{display:none}.layadmin-pagetabs{height:40px;line-height:40px;padding:0 80px 0 40px;background-color:#fff;box-sizing:border-box;box-shadow:0 1px 2px 0 rgba(0,0,0,.1)}.layadmin-pagetabs .layadmin-tabs-control{position:absolute;top:0;width:40px;height:100%;text-align:center;cursor:pointer;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box;border-left:1px solid #f6f6f6}.layadmin-pagetabs .layadmin-tabs-control:hover{background-color:#f6f6f6}.layadmin-pagetabs .layui-icon-prev{left:0;border-left:none;border-right:1px solid #f6f6f6}.layadmin-pagetabs .layui-icon-next{right:40px}.layadmin-pagetabs .layui-icon-down{right:0}.layadmin-tabs-select.layui-nav{position:absolute;left:0;top:0;width:100%;height:100%;padding:0;background:0 0}.layadmin-tabs-select.layui-nav .layui-nav-item{line-height:40px}.layadmin-tabs-select.layui-nav .layui-nav-item>a{height:40px}.layadmin-tabs-select.layui-nav .layui-nav-item a{color:#666}.layadmin-tabs-select.layui-nav .layui-nav-child{top:40px;left:auto;right:0}.layadmin-tabs-select.layui-nav .layui-nav-child dd.layui-this,.layadmin-tabs-select.layui-nav .layui-nav-child dd.layui-this a{background-color:#f2f2f2!important;color:#333}.layadmin-pagetabs .layui-tab{margin:0;overflow:hidden}.layadmin-pagetabs .layui-tab-title{height:40px;border:none}.layadmin-pagetabs .layui-tab-title li{min-width:0;line-height:40px;max-width:160px;text-overflow:ellipsis;padding-right:40px;overflow:hidden;border-right:1px solid #f6f6f6;vertical-align:top}.layadmin-pagetabs .layui-tab-title li:first-child{padding-right:15px}.layadmin-pagetabs .layui-tab-title li .layui-tab-close{position:absolute;right:8px;top:50%;margin:-7px 0 0;width:16px;height:16px;line-height:16px;border-radius:50%;font-size:12px}.layadmin-pagetabs .layui-tab-title li:after{content:'';position:absolute;top:0;left:0;width:0;height:2px;border-radius:0;background-color:#292B34;transition:all .3s;-webkit-transition:all .3s}.layadmin-pagetabs .layui-tab-title li:hover:after{width:100%}.layadmin-pagetabs .layui-tab-title li.layui-this,.layadmin-pagetabs .layui-tab-title li:hover{background-color:#f6f6f6}.layadmin-pagetabs .layui-tab-title li.layui-this:after{width:100%;border:none;height:2px;background-color:#292B34}.layadmin-tabspage-none .layui-layout-admin .layui-header{border-bottom:none;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layadmin-tabspage-none .layui-layout-admin .layui-body{top:50px}.layadmin-tabspage-none .layadmin-header{display:block}.layadmin-tabspage-none .layadmin-header .layui-breadcrumb{border-top:1px solid #f6f6f6}.layui-layout-admin .layui-header{border-bottom:1px solid #f6f6f6;box-sizing:border-box;background-color:#fff}.layui-layout-admin .layui-header a,.layui-layout-admin .layui-header a cite{color:#333}.layui-layout-admin .layui-header a:hover{color:#000}.layui-layout-admin .layui-header .layui-nav .layui-nav-more{border-top-color:#666}.layui-layout-admin .layui-header .layui-nav .layui-nav-mored{border-color:transparent transparent #666}.layui-layout-admin .layui-header .layui-nav .layui-this:after,.layui-layout-admin .layui-header .layui-nav-bar{height:2px;background-color:#20222A}.layui-layout-admin .layui-logo{background-color:#20222A;box-shadow:0 1px 2px 0 rgba(0,0,0,.15)}.layui-layout-admin .layui-logo,.layui-layout-admin .layui-logo a{color:#fff;color:rgba(255,255,255,.8)}.layui-side-menu{box-shadow:1px 0 2px 0 rgba(0,0,0,.05)}.layui-layout-admin .layui-footer{padding:10px 0;text-align:center;box-shadow:0 -1px 2px 0 rgba(0,0,0,.05)}.layadmin-setTheme-side,.layui-side-menu{background-color:#20222A;color:#fff}.layadmin-setTheme-header,.layui-layout-admin .layui-footer{background-color:#fff}.layui-tab-admin .layui-tab-title{background-color:#393D49;color:#fff}.layui-fluid{padding:15px}.layadmin-header{display:none;height:50px;line-height:50px;margin-bottom:0;border-radius:0}.layadmin-header .layui-breadcrumb{padding:0 15px}.layui-card-header{position:relative}.layui-card-header .layui-icon{line-height:initial;position:absolute;right:15px;top:50%;margin-top:-7px}.layadmin-iframe{position:absolute;width:100%;height:100%;left:0;top:0;right:0;bottom:0}.layadmin-carousel{height:185px!important;background-color:#fff}.layadmin-carousel .layui-carousel-ind li{background-color:#e2e2e2}.layadmin-carousel .layui-carousel-ind li:hover{background-color:#c2c2c2}.layadmin-carousel .layui-carousel-ind li.layui-this{background-color:#999}.layadmin-carousel .layui-carousel,.layadmin-carousel>[carousel-item]>*{background-color:#fff}.layadmin-carousel .layui-col-space10{margin:0}.layadmin-carousel .layui-carousel-ind{position:absolute;top:-41px;text-align:right}.layadmin-carousel .layui-carousel-ind ul{background:0 0}.layui-card .layui-tab-brief .layui-tab-title{height:42px;border-bottom-color:#f6f6f6}.layui-card .layui-tab-brief .layui-tab-title li{margin:0 15px;padding:0;line-height:42px}.layui-card .layui-tab-brief .layui-tab-title li.layui-this{color:#333}.layui-card .layui-tab-brief .layui-tab-title .layui-this:after{height:43px}.layui-card .layui-tab-brief .layui-tab-content{padding:15px}.layui-card .layui-table-view{margin:0}.layadmin-shortcut li{text-align:center}.layadmin-shortcut li .layui-icon{display:inline-block;width:100%;height:60px;line-height:60px;text-align:center;border-radius:2px;font-size:30px;background-color:#F8F8F8;color:#333;transition:all .3s;-webkit-transition:all .3s}.layadmin-shortcut li cite{position:relative;top:2px;display:block;color:#666;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;font-size:14px}.layadmin-shortcut li:hover .layui-icon{background-color:#f2f2f2}.layadmin-backlog .layadmin-backlog-body{display:block;padding:10px 15px;background-color:#f8f8f8;color:#999;border-radius:2px;transition:all .3s;-webkit-transition:all .3s}.layadmin-backlog-body h3{padding-bottom:10px;font-size:12px}.layadmin-backlog-body p cite{font-style:normal;font-size:30px;font-weight:300;color:#009688}.layadmin-backlog-body:hover{background-color:#f2f2f2;color:#888}.layadmin-dataview{height:332px!important}.layadmin-dataview>[carousel-item]:before{display:none}.layadmin-dataview>[carousel-item]>div{height:332px}.layadmin-takerates{padding-top:5px}.layadmin-takerates .layui-progress{margin:50px 0 60px}.layadmin-takerates .layui-progress:last-child{margin-bottom:10px}.layadmin-takerates .layui-progress h3{position:absolute;right:0;top:-35px;color:#999;font-size:14px}.layadmin-takerates .layui-progress-bar{text-align:left}.layadmin-takerates .layui-progress-text{top:-35px;line-height:26px;font-size:26px}.layadmin-news{height:60px!important;padding:5px 0}.layadmin-news a{display:block;line-height:60px;text-align:center}.layadmin-news .layui-carousel-ind{height:45px}.layadmin-list li{margin-bottom:6px;padding-bottom:6px;border-bottom-color:#f6f6f6;list-style-position:inside;list-style-type:disc;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layadmin-list li a{color:#666}.layadmin-list li a:hover{color:#009688}.layadmin-list li:last-child{border:none;padding:0;margin:0}.layadmin-text p{margin-bottom:10px;text-indent:2em}.layadmin-text p:last-child{margin:0}.layadmin-font-em{font-size:13px;color:#758697}.layui-card-header .layui-a-tips{position:absolute;right:15px;color:#01AAED}.layuiadmin-card-text{background-color:#f8f8f8;color:#777;padding:24px}.layuiadmin-card-text .layui-text-top{padding-bottom:10px}.layuiadmin-card-text .layui-text-top i{margin-right:10px;font-size:24px;color:#009688}.layuiadmin-card-text .layui-text-top a{line-height:24px;font-size:16px;vertical-align:top}.layuiadmin-card-text .layui-text-center{height:44px;line-height:22px;margin-bottom:10px;overflow:hidden}.layuiadmin-card-text .layui-text-bottom{position:relative}.layuiadmin-card-text .layui-text-bottom a{color:#777;font-size:12px;text-overflow:ellipsis;word-break:break-all}.layuiadmin-card-text .layui-text-bottom span{color:#CCC;font-size:12px;position:absolute;right:0}.layuiadmin-badge,.layuiadmin-btn-group,.layuiadmin-span-color{position:absolute;right:15px}.layuiadmin-card-link a:hover,.layuiadmin-card-team li a:hover,.layuiadmin-card-text a:hover{color:#01AAED;transition:all .3s}.layuiadmin-card-status{padding:0 10px 10px}.layuiadmin-card-status dd{padding:15px 0;border-bottom:1px solid #EEE;display:-webkit-flex;display:flex}.layuiadmin-card-status dd:last-child{border:none}.layuiadmin-card-status dd div.layui-status-img,.layuiadmin-card-team .layui-team-img{width:32px;height:32px;border-radius:50%;background-color:#009688;margin-right:15px}.layuiadmin-card-status dd div.layui-status-img a{width:100%;height:100%;display:inline-block;text-align:center;line-height:32px}.layuiadmin-card-status dd div.layui-status-img img,.layuiadmin-card-team .layui-team-img img{width:50%;height:50%}.layuiadmin-card-status dd div a{color:#01AAED}.layuiadmin-card-status dd div span{color:#BBB}.layuiadmin-card-link{padding-left:10px;font-size:0}.layuiadmin-card-link a{display:inline-block;width:25%;color:#666;font-size:14px;margin-bottom:12px}.layuiadmin-card-link button{vertical-align:top}.layuiadmin-card-link button:hover{color:#009688}.layuiadmin-card-team li{padding:10px 0 10px 10px}.layuiadmin-card-team .layui-team-img{display:inline-block;margin-right:8px;width:24px;height:24px;text-align:center;line-height:24px}.layuiadmin-card-team span{color:#777}.layuiadmin-badge{top:50%;margin-top:-9px;color:#01AAED}.layuiadmin-card-list{padding:15px}.layuiadmin-card-list p.layuiadmin-big-font{font-size:36px;color:#666;line-height:36px;padding:5px 0 10px;overflow:hidden;text-overflow:ellipsis;word-break:break-all;white-space:nowrap}.layuiadmin-card-list p.layuiadmin-normal-font{padding-bottom:10px;font-size:20px;color:#666;line-height:24px}.layuiadmin-span-color{font-size:14px}.layuiadmin-span-color i{padding-left:5px}.layuiadmin-card-status li{position:relative;padding:10px 0;border-bottom:1px solid #EEE}.layuiadmin-card-status li h3{padding-bottom:5px;font-weight:700}.layuiadmin-card-status li p{padding-bottom:10px}.layuiadmin-card-status li>span{color:#999}.layuiadmin-home2-usernote .layuiadmin-reply{display:none;position:absolute;right:0;bottom:12px}.layuiadmin-home2-usernote li:hover .layuiadmin-reply{display:block}.layuiadmin-page-table td span{color:#2F4056}.layuiadmin-page-table td span.first{color:#FF5722}.layuiadmin-page-table td span.second{color:#FFB800}.layuiadmin-page-table td span.third{color:#5FB878}.layuiAdmin-msg-detail h1{font-size:16px}.layuiAdmin-msg-detail .layui-card-header{height:auto;line-height:30px;padding:15px}.layuiAdmin-msg-detail .layui-card-header span{padding:0 5px;color:#999}.layuiAdmin-msg-detail .layui-card-header span:first-child{padding-left:0}.layuiAdmin-msg-detail .layui-card-body{padding:15px}.layuiadmin-content-bread{padding-bottom:20px}.layuiadmin-order-progress{position:relative;top:12px}.layui-card-header.layuiadmin-card-header-auto{padding-top:15px;padding-bottom:15px;height:auto}.layuiadmin-card-header-auto i.layuiadmin-button-btn{position:relative;right:0;top:0;vertical-align:middle}.layuiadmin-card-header-auto .layui-form-item:last-child{margin-bottom:0}.layadmin-setTheme{padding:15px;overflow-x:hidden}.layadmin-setTheme>h5{padding:20px 0 10px;color:#000}.layadmin-setTheme>h5:first-child{padding-top:0}.layadmin-setTheme-color{width:330px;font-size:0}.layadmin-setTheme-color li{position:relative;display:inline-block;vertical-align:top;width:80px;height:50px;margin:0 15px 15px 0;background-color:#f2f2f2;cursor:pointer;font-size:12px;color:#666}.layadmin-setTheme-color li:after{content:'';position:absolute;z-index:20;top:50%;left:50%;width:1px;height:0;border:1px solid #f2f2f2;transition:all .3s;-webkit-transition:all .3s;opacity:0}.layadmin-setTheme-color li.layui-this:after,.layadmin-setTheme-color li:hover:after{width:100%;height:100%;padding:4px;top:-5px;left:-5px;border-color:#5FB878;opacity:1}.layadmin-setTheme-header{position:relative;z-index:10;height:10px;border-top:1px solid #f2f2f2;border-right:1px solid #f2f2f2}.layadmin-setTheme-side{position:absolute;left:0;top:0;width:20px;height:100%;z-index:11;box-shadow:1px 0 2px 0 rgba(0,0,0,.05)}.layadmin-setTheme-logo{position:absolute;left:0;top:0;width:100%;height:10px;box-shadow:0 1px 2px 0 rgba(0,0,0,.15)}.layadmin-form-right{text-align:right}.layadmin-about p{margin-bottom:10px}.layadmin-menu-list .layui-card-header{height:50px;line-height:50px;font-size:16px}.layadmin-menu-list .layui-card-header:active{background-color:#f2f2f2}.layadmin-menu-list .layui-card-header .layui-icon{position:relative;top:1px;left:0;display:inline-block;margin:0 10px;font-size:18px}@-webkit-keyframes layui-rl{from{-webkit-transform:translate3d(100%,0,0)}to{-webkit-transform:translate3d(0,0,0)}}@keyframes layui-rl{from{transform:translate3d(100%,0,0)}to{transform:translate3d(0,0,0)}}.layui-anim-rl{-webkit-animation-name:layui-rl;animation-name:layui-rl}@-webkit-keyframes layui-lr{from{-webkit-transform:translate3d(0 0,0);opacity:1}to{-webkit-transform:translate3d(100%,0,0);opacity:1}}@keyframes layui-lr{from{transform:translate3d(0,0,0)}to{transform:translate3d(100%,0,0)}}.layui-anim-lr,.layui-anim-rl.layer-anim-close{-webkit-animation-name:layui-lr;animation-name:layui-lr}.layadmin-tips{margin-top:30px;text-align:center}.layadmin-tips .layui-icon[face]{display:inline-block;font-size:300px;color:#393D49}.layadmin-tips .layui-text{width:500px;margin:30px auto;padding-top:20px;border-top:5px solid #009688;font-size:16px}.layadmin-tips h1{font-size:100px;line-height:100px;color:#009688}.layadmin-tips .layui-text .layui-anim{display:inline-block}@media screen and (max-width:768px){.layadmin-panel-selection{margin:0;width:auto}.layui-body .layui-nav .layui-nav-item{display:block}.layui-layout-admin .layui-body .layadmin-tabsbody-item{-webkit-overflow-scrolling:touch;overflow:auto}} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/style/login.css b/AdminSrc/AdminHost/wwwroot/admin/dist/style/login.css new file mode 100644 index 0000000..5107713 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/style/login.css @@ -0,0 +1,2 @@ +/** layuiAdmin.pro-v1.4.0 LPPL License By https://www.layui.com/admin/ */ +#LAY_app,body,html{height:100%}.layui-layout-body{overflow:auto}#LAY-user-login,.layadmin-user-display-show{display:block!important}.layadmin-user-login{position:relative;left:0;top:0;padding:110px 0;min-height:100%;box-sizing:border-box}.layadmin-user-login-main{width:375px;margin:0 auto;box-sizing:border-box}.layadmin-user-login-box{padding:20px}.layadmin-user-login-header{text-align:center}.layadmin-user-login-header h2{margin-bottom:10px;font-weight:300;font-size:30px;color:#000}.layadmin-user-login-header p{font-weight:300;color:#999}.layadmin-user-login-body .layui-form-item{position:relative}.layadmin-user-login-icon{position:absolute;left:1px;top:1px;width:38px;line-height:36px;text-align:center;color:#d2d2d2}.layadmin-user-login-body .layui-form-item .layui-input{padding-left:38px}.layadmin-user-login-codeimg{max-height:38px;width:100%;cursor:pointer;box-sizing:border-box}.layadmin-user-login-other{position:relative;font-size:0;line-height:38px;padding-top:20px}.layadmin-user-login-other>*{display:inline-block;vertical-align:middle;margin-right:10px;font-size:14px}.layadmin-user-login-other .layui-icon{position:relative;top:2px;font-size:26px}.layadmin-user-login-other a:hover{opacity:.8}.layadmin-user-jump-change{float:right}.layadmin-user-login-footer{position:absolute;left:0;bottom:0;width:100%;line-height:30px;padding:20px;text-align:center;box-sizing:border-box;color:rgba(0,0,0,.5)}.layadmin-user-login-footer span{padding:0 5px}.layadmin-user-login-footer a{padding:0 5px;color:rgba(0,0,0,.5)}.layadmin-user-login-footer a:hover{color:rgba(0,0,0,1)}.layadmin-user-login-main[bgimg]{background-color:#fff;box-shadow:0 0 5px rgba(0,0,0,.05)}.ladmin-user-login-theme{position:fixed;bottom:0;left:0;width:100%;text-align:center}.ladmin-user-login-theme ul{display:inline-block;padding:5px;background-color:#fff}.ladmin-user-login-theme ul li{display:inline-block;vertical-align:top;width:64px;height:43px;cursor:pointer;transition:all .3s;-webkit-transition:all .3s;background-color:#f2f2f2}.ladmin-user-login-theme ul li:hover{opacity:.9}@media screen and (max-width:768px){.layadmin-user-login{padding-top:60px}.layadmin-user-login-main{width:300px}.layadmin-user-login-box{padding:10px}} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/style/res/bg-none.jpg b/AdminSrc/AdminHost/wwwroot/admin/dist/style/res/bg-none.jpg new file mode 100644 index 0000000..b7c9e7b Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/dist/style/res/bg-none.jpg differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/style/res/layui-logo.jpg b/AdminSrc/AdminHost/wwwroot/admin/dist/style/res/layui-logo.jpg new file mode 100644 index 0000000..da24fdf Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/dist/style/res/layui-logo.jpg differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/style/res/logo-black.png b/AdminSrc/AdminHost/wwwroot/admin/dist/style/res/logo-black.png new file mode 100644 index 0000000..73e5ebc Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/dist/style/res/logo-black.png differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/style/res/logo.png b/AdminSrc/AdminHost/wwwroot/admin/dist/style/res/logo.png new file mode 100644 index 0000000..ac1e00b Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/dist/style/res/logo.png differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/style/res/template/character.jpg b/AdminSrc/AdminHost/wwwroot/admin/dist/style/res/template/character.jpg new file mode 100644 index 0000000..ba5e4d1 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/dist/style/res/template/character.jpg differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/style/res/template/huge.jpg b/AdminSrc/AdminHost/wwwroot/admin/dist/style/res/template/huge.jpg new file mode 100644 index 0000000..ce8acbd Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/dist/style/res/template/huge.jpg differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/style/res/template/portrait.png b/AdminSrc/AdminHost/wwwroot/admin/dist/style/res/template/portrait.png new file mode 100644 index 0000000..a6760af Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/dist/style/res/template/portrait.png differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/style/template.css b/AdminSrc/AdminHost/wwwroot/admin/dist/style/template.css new file mode 100644 index 0000000..0340c1d --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/style/template.css @@ -0,0 +1,2 @@ +/** layuiAdmin.pro-v1.4.0 LPPL License By https://www.layui.com/admin/ */ +.layadmin-panel-selection{width:768px;margin:30px auto}.layadmin-panel-selection .layui-panel-window{padding:30px 50px;border-top-color:#ddd;text-align:center}.layadmin-panel-selection .layui-panel-window h2{padding-bottom:15px;font-size:18px}.layadmin-panel-selection .layui-panel-window ul{margin-top:15px;text-align:left}.layadmin-homepage-panel .text-center,.layadmin-maillist-fluid .layadmin-text-center{text-align:center}.layadmin-panel-selection .layui-btn-container{margin-top:30px}.layadmin-panel-selection .layui-btn-container .layui-btn{width:100%}.layadmin-maillist-fluid .layadmin-contact-box{padding:20px;background-color:#fff;border:1px solid #e7eaec;overflow:hidden}.layadmin-maillist-fluid .layadmin-text-center img{max-width:80%;border-radius:50%;margin-top:5px}.layadmin-maillist-fluid .layadmin-font-blod{font-weight:600}.layadmin-maillist-fluid .layadmin-maillist-img{margin-top:5px}.layadmin-maillist-fluid .layadmin-title{margin:5px 0 10px}.layadmin-maillist-fluid .layadmin-textimg{line-height:25px;margin-bottom:10px}.layadmin-maillist-fluid .layadmin-address{line-height:1.5;margin-bottom:20px}.layadmin-maillist-fluid .layadmin-padding-left20{padding-left:20px}.layadmin-homepage-shadow{box-shadow:0 1px 1px rgba(0,0,0,.05);background-color:#fff;border-radius:0;border:1px solid #e7ecf3}.layadmin-homepage-panel{margin-bottom:15px}.layadmin-homepage-information{padding:15px;border-bottom:1px solid #e9e9e9}.layadmin-homepage-pad-ver{padding-top:15px;padding-bottom:15px}.layadmin-homepage-pad-img{box-shadow:0 0 0 4px rgba(0,0,0,.1);border-radius:50%}.layadmin-homepage-font{font-weight:600;color:#2b425b;font-size:1.2em}.layadmin-homepage-min-font{margin:5px 0 10px;font-size:.9em;color:#afb9c3}.layadmin-homepage-pad-ver a{line-height:1.1em;font-size:1.3em;vertical-align:middle;cursor:pointer;background-color:transparent;color:inherit;padding:6px 12px}.layadmin-homepage-pad-ver a:hover{background:#5FB878;color:#fff}.layadmin-homepage-about{padding:15px;font-weight:600;color:#2b425b}.layadmin-homepage-list-group{font-size:.9em;line-height:1.25;margin-bottom:5px}.layadmin-homepage-list-group li{padding:5px 15px;border:1px solid transparent;margin-bottom:-1px;border-width:1px 0;border-radius:0;background-color:transparent;color:inherit}.layadmin-homepage-list-group li i{font-size:1.333em;line-height:1.095em;vertical-align:middle;margin-right:4px}.layadmin-homepage-list-group li a.color{color:#337ab7}.layadmin-homepage-pad-hor{padding-left:15px;padding-right:15px;border-bottom:15px;color:#758697;text-indent:20px}.layadmin-homepage-list-inline{margin-left:15px;margin-right:15px;padding-bottom:20px}.layadmin-homepage-list-inline a{display:inline-block}.layadmin-homepage-list-inline .layui-btn{font-size:.9em;line-height:1.42857;vertical-align:middle;height:auto;padding:4px 7px;margin:0 10px 10px 0}.layadmin-homepage-text-center{text-align:center;margin-bottom:15px}.layadmin-homepage-padding15{padding:15px;margin-bottom:15px}.layadmin-homepage-padding8{padding:0 8px}.layadmin-homepage-paddingmb{margin:0 -7.5px}.layadmin-homepage-content{margin-left:15px;padding:0}.layadmin-homepage-content .new-section-xs{margin:12px 0;color:inherit;border:0!important;height:0;box-sizing:content-box}.layadmin-homepage-content .h4{font-size:16px;font-weight:600;color:#2b425b}.layadmin-homepage-content small{color:#afb9c3}.layadmin-homepage-text-center .layui-icon{color:#FFB800;padding-right:5px}.layadmin-homepage-padding15 .layui-col-sm5 a{font-size:11px;height:auto;line-height:1.5;padding:5px 10px;float:right}.layadmin-homepage-padding15 .layui-btn-normal{margin:0 15px}.layadmin-homepage-list-imgtxt .layui-col-sm10,.layadmin-homepage-list-imgtxt .layui-col-sm2{background:0 0}.layadmin-homepage-list-imgtxt .panel-body{padding:15px 20px 25px;overflow:hidden;margin-bottom:15px}.layadmin-homepage-list-imgtxt .panel-body .media-left{display:block;float:left;vertical-align:top;padding-right:10px}.layadmin-homepage-list-imgtxt .panel-body .media-left img{border-radius:50%}.layadmin-homepage-list-imgtxt .media-body{width:auto;display:block;overflow:hidden}.layadmin-homepage-list-imgtxt .media-body .pad-btm{padding-bottom:15px}.layadmin-homepage-list-imgtxt .media-body .pad-btm p:first-child{padding-bottom:5px}.layadmin-homepage-list-imgtxt .media-body .min-font{margin-bottom:10px}.layadmin-homepage-list-imgtxt .media-body .min-font .layui-breadcrumb a{font-size:11px}.layui-breadcrumb span[lay-separator]{margin:0 5px}.layadmin-homepage-list-imgtxt .media-body .pad-btm .fontColor a{font-weight:600;color:#337ab7}.layadmin-homepage-list-imgtxt .media-body .pad-btm .fontColor span{color:#758697;font-weight:600}.layadmin-homepage-list-imgtxt .media-body .h-img{display:block;max-width:100%;height:auto;margin-top:10px}.layadmin-homepage-list-imgtxt .img-xs{width:32px;height:32px;border-radius:50%}.layadmin-homepage-list-imgtxt .media-body .media{margin-top:15px;overflow:hidden}.layadmin-homepage-list-imgtxt .media-body .media .media-right{float:right;padding-top:10px}.layadmin-homepage-list-imgtxt .media-body .media .media-right .list-inline{margin-bottom:10px}.layadmin-homepage-list-imgtxt .media-body .media .list-inline li{padding:0 5px;display:inline-block}.layadmin-homepage-list-imgtxt .media-body .media .media-right .list-inline li span{font-weight:600}.layadmin-homepage-list-imgtxt .media-body .media .media-left{display:block;overflow:hidden;width:auto}.layadmin-homepage-list-imgtxt .media-body .media .media-left .font-blod{font-weight:700;color:#758697}.layadmin-homepage-list-imgtxt .media-body .media-list{padding-top:15px;margin-top:15px;border-top:1px solid #e9e9e9}.layadmin-homepage-list-imgtxt .media-body .media-list .media-item{padding-bottom:15px;margin-top:15px}.layadmin-homepage-list-imgtxt .media-body .media-list .media-item-left{display:inline-block;padding-right:10px;margin-bottom:5px}.layadmin-homepage-list-imgtxt .media-body .media-list .media-item-left img{display:block;float:left}.layadmin-homepage-list-imgtxt .media-body .media-list .media-text{overflow:hidden;width:auto;display:inline-block}.layadmin-homepage-list-imgtxt .media-body .media-list .media-text a{margin-right:10px;font-weight:600;display:inline-block}.layadmin-homepage-list-imgtxt .media-body .media-list .media-text div:nth-child(2){margin-top:5px}.layadmin-homepage-list-imgtxt .media-body .media-list .layui-btn{height:24px;line-height:24px;font-size:12px;padding:0 20px;margin-bottom:10px}.homepage-top .layui-card-body img{width:100%}.homepage-top .layui-card-body .margin-top10{margin-top:10px}.homepage-top .layui-card-body .layui-btn{width:100%;display:block}.homepage-top{padding-bottom:20px}.layadmin-privateletterlist-item{position:relative;display:block;padding:10px 15px}.homepage-bottom .layui-card-body{padding:0}.homepage-bottom .layui-card-body img{width:32px;height:32px;border-radius:50%;margin-top:10px}.homepage-bottom .layui-card-body .meida-left{display:table-cell;padding-right:10px}.homepage-bottom .layui-card-body .meida-right{display:table-cell;vertical-align:top}.homepage-bottom .layui-card-body a:hover{background:#F2F2F2}.homepage-bottom .layui-card-body{background:#fff}.layui-card-header .panel-title .layui-icon{position:relative;left:0;right:0}.layadmin-cmdlist-fluid{padding-bottom:60px}.cmdlist-container{background:#fff;border:1px solid transparent}.cmdlist-container:hover{border:1px solid #e8e8e8}.cmdlist-container img{width:100%}.cmdlist-text{padding:20px}.cmdlist-text .info{height:40px;font-size:14px;line-height:20px;width:100%;overflow:hidden;color:#666;margin-bottom:10px}.cmdlist-text .price{font-size:14px}.cmdlist-text .price b{margin-right:20px}.cmdlist-text .price p{display:inline-block}.cmdlist-text .flow{text-align:right;float:right}#demo0{text-align:center}.layadmin-message-fluid .layui-col-md12{background:#fff;height:auto;padding-bottom:50px}.layadmin-message-fluid .layui-input-block{margin-left:0}.layadmin-message-fluid .layui-form{padding:45px 40px 0}.layadmin-message-fluid .layui-form-label{text-align:left;font-size:18px;padding-left:10px}.layadmin-message-fluid .layui-textarea{min-height:100px;font-size:16px}.layadmin-message-fluid .layui-input-right{float:right}.layadmin-messag-icon{overflow:hidden;float:left;margin-top:4px}.layadmin-messag-icon .layui-icon{font-size:24px;line-height:30px;margin-right:15px;color:#C4CBCF}.message-content{padding:0 40px}.message-content .media-body{margin-bottom:60px}.message-content .media-body .pad-btm{padding-bottom:0}.message-content .media-left{float:left;margin-right:10px}.message-content .media-left img{border-radius:50%}.message-text{padding-top:10px}.message-content-btn{text-align:center}.message-content .layui-btn{height:auto;line-height:26px;padding:5px 30px;font-size:16px}.layadmin-serach-main .layui-card-header{height:auto;line-height:24px;padding:15px}.layadmin-serach-list{margin-bottom:10px;padding:10px 0;border-bottom:1px solid #f6f6f6}.layadmin-serach-list h3{padding:10px 0}.layadmin-serach-list h3 .layui-badge{top:-2px}.layadmin-serach-list p{color:#666}.layadmin-serach-list li{margin-bottom:20px;padding-bottom:20px;clear:both}.layui-serachlist-cover{float:left;margin-right:15px}.layui-serachlist-cover img{width:90px;height:90px}.layadmin-caller{background:#fff;padding:30px}.layadmin-caller em{font-style:normal}.layadmin-caller .caller-fl{float:left}.layadmin-caller .caller-fr{float:right}.layadmin-caller .caller-seach{position:relative;padding-bottom:40px}.layadmin-caller .caller-seach .caller-icon{font-size:18px;position:absolute;top:9px}.layadmin-caller .caller-seach-icon{left:6px}.layadmin-caller .caller-dump-icon{right:6px;cursor:pointer}.layadmin-caller .caller-pl32{padding:0 32px}.layadmin-caller .caller-tab{margin:0}.layadmin-caller .caller-contar{padding-bottom:20px}.layadmin-caller .caller-contar .caller-item{padding:25px 0;overflow:hidden;border-bottom:1px solid #e0e0e0}.layadmin-caller .caller-contar .caller-item .caller-main{margin-left:20px}.layadmin-caller .caller-contar .caller-item .caller-main p{line-height:100%;padding:8px 0}.layadmin-caller .caller-contar .caller-item .caller-main p:first-child{padding-top:0}.layadmin-caller .caller-contar .caller-item .caller-main em{margin-left:5px}.layadmin-caller .caller-contar .caller-item .caller-main .caller-adds i{padding-right:5px;margin:0}.layadmin-caller .caller-contar .caller-item .caller-main .caller-adds{padding-bottom:12px}.layadmin-caller .caller-contar .caller-iconset i{margin:0 5px}.layadmin-caller .caller-contar .caller-iconset i:first-child{margin-left:0}.layadmin-caller .caller-contar button{margin-top:22px}.layadmin-caller .caller-contar .caller-img{width:40px;height:40px;border-radius:100%} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/activity/lottery/edit.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/activity/lottery/edit.html new file mode 100644 index 0000000..958697a --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/activity/lottery/edit.html @@ -0,0 +1 @@ +
此页面已废弃,奖池配置已整合到列表页
diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/activity/lottery/list.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/activity/lottery/list.html new file mode 100644 index 0000000..d046dc3 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/activity/lottery/list.html @@ -0,0 +1,708 @@ +奖池抽奖活动 + + + +
+ +
+
活动配置
+
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
留空=立即开始
+
+
+ +
+ +
+
留空=不限制
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+
单用户最大抽奖次数(0=不限制)
+
+
+
+
+ + +
+
奖池等级
+
+
+
    +
  • 炮台奖池
  • +
  • 战神奖池
  • +
  • 翅膀奖池
  • +
+
+
+
+ + + + +
+
+
+
+
+
+
+
+ + + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/background/recharge.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/background/recharge.html new file mode 100644 index 0000000..4a54194 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/background/recharge.html @@ -0,0 +1,298 @@ + + + + + 后台充值/扣除 + + + + + + + + +
+
+
后台充值/扣除
+
+ +
+
+ +
+ + +
支持ID或用户名搜索
+
+ +
+ +
+ +
+ + +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+
+ + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ + +
+
+
+
+ + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/beautifulnumber/list.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/beautifulnumber/list.html new file mode 100644 index 0000000..b2c08ef --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/beautifulnumber/list.html @@ -0,0 +1,715 @@ + +靓号管理 + + + +
+
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ + +
+
+
+ +
+
+
+ + + + + +
+

+ +
+ + +
+
+
+ + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/beautifulnumber/rules.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/beautifulnumber/rules.html new file mode 100644 index 0000000..25861c9 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/beautifulnumber/rules.html @@ -0,0 +1,520 @@ + +靓号规则配置 + + + +
+
+
+
+ + + + +
+
+
+
+ + + + +
+
+
+ + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/config/TaskForm.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/config/TaskForm.html new file mode 100644 index 0000000..17c4533 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/config/TaskForm.html @@ -0,0 +1,59 @@ +
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/config/TaskList.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/config/TaskList.html new file mode 100644 index 0000000..a29d2de --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/config/TaskList.html @@ -0,0 +1,231 @@ + +任务管理 + + +
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+ +
+ +
+ + +
+
+
+ + \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/customer/chatlog.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/customer/chatlog.html new file mode 100644 index 0000000..8dc4383 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/customer/chatlog.html @@ -0,0 +1,254 @@ + +聊天记录 + + + +
+
+
+ 聊天记录 +
+ +
+
+
+
+
+
+
+ + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/customer/conversation.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/customer/conversation.html new file mode 100644 index 0000000..06a8972 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/customer/conversation.html @@ -0,0 +1,215 @@ + +会话管理 + + + +
+
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ + +
+
+
+ +
+
+
+ +
+

+ +
+ + +
+
+
+ + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/customer/list.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/customer/list.html new file mode 100644 index 0000000..22d466d --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/customer/list.html @@ -0,0 +1,452 @@ + +客服管理 + + + +
+
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ + +
+
+
+ +
+
+
+ + +
+

+ +
+ + +
+
+
+ + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/customer/service.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/customer/service.html new file mode 100644 index 0000000..d710867 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/customer/service.html @@ -0,0 +1,1353 @@ + +在线客服 + +
+ +
+ +
+ 选择客服: + + 状态: + + 离线 + (请先在"客服管理"中添加客服账号) +
+ +
+
+ +
+
+
+ 会话列表 + 0 +
+
+
+
+ + +
+
+
+ 请选择会话 + +
+ + +
+
+ +

请选择左侧会话开始聊天

+
+
+ + +
+
+ 您好 + 稍等 + 结束 + + 图片 + + +
+
+ + +
+
+
+
+
+
+ + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/email/emaillist.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/email/emaillist.html new file mode 100644 index 0000000..8826568 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/email/emaillist.html @@ -0,0 +1,238 @@ + +邮件管理 + + + +
+
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ + +
+
+
+ +
+
+
+ + + + + + + + +
+
+
+ + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/battleorder.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/battleorder.html new file mode 100644 index 0000000..e24cbac --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/battleorder.html @@ -0,0 +1,646 @@ +战令配置 + + + +
+
+
基础配置
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+ +
+
等级配置
+
+
+ + + + +
+
+
+
+ +
+
进阶配置
+
+
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/boss.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/boss.html new file mode 100644 index 0000000..b1f52e8 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/boss.html @@ -0,0 +1,2237 @@ + +Boss配置 + + + + + + + +
+
+
+
+ + + + +
+
+ 场景筛选: +
+
+
+
+
+
    +
  • 幸运轮盘
  • +
  • 小丑扑克
  • +
  • 幸运飞碟
  • +
  • 全屏秒怪
  • +
  • 范围秒怪
  • +
  • 星际巡航
  • +
  • 烈焰风暴
  • +
  • 破坏球
  • +
  • 机械蝎
  • +
  • 神龙转盘
  • +
  • 概率击杀
  • +
+
+ +
+
+ +
+
+
+ +
+
+ 基础配置 +
+ +
+
+
+
+
+
+ 选项列表 +
+ +
+
+
+
+ +
+
+ +
+
+
+ +
+
+ 基础配置 +
+ +
+
+
+
+
+
+ +
+
+ 基础配置 +
+ +
+
+
+
+
+
+ +
+
+ 基础配置 +
+ +
+
+
+
+
+
+
+ +
+
+ 基础配置 +
+ +
+
+
+
+
+
+
+ +
+
+ 基础配置 +
+ +
+
+
+
+
+
+
+ +
+
+ 基础配置 +
+ +
+
+
+
+
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/bossdrop.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/bossdrop.html new file mode 100644 index 0000000..d23b2ac --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/bossdrop.html @@ -0,0 +1,179 @@ +Boss道具掉落配置 + + + +
+
+
+
+ + + + +
+
+
+
+
+ +
+ +
+
总权重 = 不掉落权重 + 各掉落项权重之和
+
+
+
+ +
+
+
+
+
+ +
+
掉落道具列表(所有Boss通用)
+
+
+ + +
+
+
+
+
+ + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/botai.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/botai.html new file mode 100644 index 0000000..1853365 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/botai.html @@ -0,0 +1,393 @@ + +机器人AI配置 + + + + + +
+
+
+
+ + + + +
+
+
+
+ +
全局设置 +
+
机器人总开关
+
active=正常 | idle=待机 | aggressive=激进
+
1.0=正常, >1容易杀, <1难杀
+
0=不自动刷新
+
+
+ +
技能配置 +
+
每隔多少秒重新掷骰子决定技能组合
+
+
自动瞄准最近鱼
+
+
+
+
+
开火速度翻倍
+
+
+
+
+
一次3发
+
+
+
+
+
消耗翻倍
+
+
+
+
+
+ + + +
Active 行为参数 +
+
+
+
+
0.9=经常开火偶尔停顿
+
+
+
+
+
+
+
+
+
0=纯距离, 1=纯分数
+
+
+
+
+
+
+
+ +
Idle 行为参数 +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
Aggressive 行为参数 +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
倍数策略 +
+
+
对应炮倍列表下标,0=最低档
+
当前金币/进场金币 < 此值
+
当前金币/进场金币 > 此值
+
+
+
+
+
不会降到低于此值
+
+
+
+
+ +
Boss策略 +
+
+
FishTypeEnum 的 int 值,逗号分隔
+
+
无Boss时定点三发概率
+
+
+
+
Boss数 > 此值开启散射
+
Boss数 ≤ 散射阈值时的概率
+
+
+
+
+
+
+
+ +
退出条件 +
+
+
超过此值时退出(盈利离场),0=不检测
+
低于此值时退出(输完离场)
+
+
+
+
+
+
+
+
+ +
+
+
+
+ + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/botprofile.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/botprofile.html new file mode 100644 index 0000000..799e15a --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/botprofile.html @@ -0,0 +1,313 @@ +机器人头像配置 + + + +
+
+
+
+
+
+
+ + + + + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/chessconfig.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/chessconfig.html new file mode 100644 index 0000000..e28872b --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/chessconfig.html @@ -0,0 +1,220 @@ + +游戏房间配置 + + + +
+
+
中国象棋 - 开房权限
+
+
+
+ +
+ + + +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+
捕鱼 - 手动选座权限
+
+
+
+ +
+ + + +
+
+ +
+
+
+ +
+
+ + + +
+
+
+ + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/chesshub_test.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/chesshub_test.html new file mode 100644 index 0000000..2c39d77 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/chesshub_test.html @@ -0,0 +1,111 @@ + + + + +象棋 Hub 流程测试 + + + +

象棋 Hub 流程测试

+
+ + + + + + + + + +
+ + + + + +
+
+ + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/diamondshop.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/diamondshop.html new file mode 100644 index 0000000..c2c7074 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/diamondshop.html @@ -0,0 +1,359 @@ + +钻石商城配置 + + + +
+
+
+
+
+
+
+ + + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/emptyroomrate.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/emptyroomrate.html new file mode 100644 index 0000000..a5c6a00 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/emptyroomrate.html @@ -0,0 +1,211 @@ +空房率配置 + + + +
+
+
+
+
+
+
+ + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/fish.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/fish.html new file mode 100644 index 0000000..e703dd0 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/fish.html @@ -0,0 +1,458 @@ +鱼种配置 + + + +
+
+
+
+ + + + + +
+
+
+
+
+
+
+ + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/fisharray.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/fisharray.html new file mode 100644 index 0000000..ba8692c --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/fisharray.html @@ -0,0 +1,384 @@ + +鱼阵配置 + + + +
+
+
+
+ + + + + +
+
+
+
+
+
+
+ + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/fishingreturn.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/fishingreturn.html new file mode 100644 index 0000000..79034a8 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/fishingreturn.html @@ -0,0 +1,164 @@ + +捕鱼返金币活动配置 + + + +
+
+
+
+ + + +
+
+
+
+

活动说明:

+

1. 用户每天捕鱼消耗金币的千分之一,第二天可领取返还

+

2. 例如:第一天捕鱼消耗 1000 万金币,第二天可领取 1 万金币

+

3. 每日返利上限可配置,0 表示无上限

+
+
+
+ +
+ +
+
+
+ +
+ +
+
千分之一 = 0.001(例如:消耗1000金币,返还1金币)
+
+
+ +
+ +
+
0 = 无上限
+
+
+ +
+ + + + + + + + + + + +
昨日消耗金币返利比例可领取金币
请输入返利比例查看示例
+
+
+
+
+
+
+ + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/goldshop.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/goldshop.html new file mode 100644 index 0000000..c990279 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/goldshop.html @@ -0,0 +1,354 @@ + +金币商城配置 + + + +
+
+
+
+
+
+
+ + + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/kill.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/kill.html new file mode 100644 index 0000000..cc6f907 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/kill.html @@ -0,0 +1,335 @@ + +击杀配置 + + + + + +
+
+
+
+ + + + +
+
+
+
+
+ 用户设置 +
+
+ +
+ +
+
公式: 原始玩家值 = -(当前余额-累计充值-注册赠送) / 此值, 玩家因子 = 1+原始玩家值。值越大调节越平缓。
+
+
+ +
+ +
+
玩家因子最小值(下限)。
默认0.3=盈利再多也保持30%击杀率; 改为0=可能完全打不死鱼; 改为1=盈利再高也不压鱼
+
+
+ +
+ +
+
玩家因子最大值(上限)。
默认2.0=亏损再多最高200%击杀率; 改为1=亏损再多也不补偿; 改为5=亏损玩家可获5倍击杀率(易刷钱)
+
+
+ 系统设置 +
+
+ +
+ +
+
已弃用,实际由下方系统日收益替代。保留仅作参考
+
+
+ +
+ +
+
公式: 系统差值=(当日盈利-日目标)/此值, 系统因子=1+系统差值。值越大调节越平缓。
+
+
+ +
+ +
+
系统因子最小值(下限)。
默认0.95=系统亏损再大最低95%击杀率; 改为0.5=系统亏损时可以压到50%; 改为0=系统亏损时可完全禁止击杀(危险)
+
+
+ +
+ +
+
系统因子最大值(上限)。
默认1.05=盈利再多最高105%; 改为1.2=系统可上调20%击杀率刺激消费; 改为1=关闭系统调节(永远固定1.0)
+
+
+ +
+ +
+
当日系统净盈利的锚点值。实际盈利高于此→调高击杀率鼓励消费;低于此→调低击杀率回收金币。
+
+
+ +
+ +
+
击杀获得金币 ≥ 此值时才触发全局播报,0=全部播报
+
+
+ 限制设置 +
+
+ +
+ +
+
相同IP关联超过此数量的用户会被屏蔽
+
+
+ +
+ +
+
公式: 被屏蔽用户直接使用此值作为玩家因子(跳过盈亏调节)。正常用户使用各自因子配置中的系统因子(默认1=不调节)。默认0.2=黑名单击杀率16%左右(KillWeight=8000时)。值越大击杀率越高(无限制范围,注意风险)
+
+
+ 补偿系数 (CompensateQuota > 0 时生效) +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
在用户因子基础上按鱼种额外乘以系数(提升击杀率)。公式: 最终用户因子 = 限制范围(玩家因子 × 鱼种系数, 下限, 上限)
+
+
+ 罚款系数 (PenaltyQuota > 0 时生效) +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
在用户因子基础上按鱼种额外乘以系数(降低击杀率)。公式: 最终用户因子 = 限制范围(玩家因子 × 鱼种系数, 下限, 上限)
+
+
+
+
+
+ + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/monthcard.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/monthcard.html new file mode 100644 index 0000000..4b8bcb7 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/monthcard.html @@ -0,0 +1,574 @@ + +月卡配置 + + + +
+
+
+
+
+
+
+ + + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/prop.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/prop.html new file mode 100644 index 0000000..54c67f9 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/prop.html @@ -0,0 +1,532 @@ + +道具配置 + + + +
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/propfragment.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/propfragment.html new file mode 100644 index 0000000..ec9d41b --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/propfragment.html @@ -0,0 +1,526 @@ + +道具碎片配置 + + + +
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/rankingreward.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/rankingreward.html new file mode 100644 index 0000000..24a582c --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/rankingreward.html @@ -0,0 +1,432 @@ + +排行榜奖励配置 + + + + + +
+
+
+
+ + + +
+
+
+
+
+ +
+ +
+
关闭后所有排行榜奖励将不发放
+
+
+ +
+ +
+
开启后前端请求排行榜将提示维护中
+
+
+ +
+ +
+
+
+
+
+
+
+ + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/register.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/register.html new file mode 100644 index 0000000..cca2fa5 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/register.html @@ -0,0 +1,431 @@ + +注册配置 + + + +
+
+
+
+
+ + + + +
+
+
+
+ 基础配置 +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ 初始道具 +
+ + +
+
+
+
+
+
+
+ + + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/relief.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/relief.html new file mode 100644 index 0000000..cbfff23 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/relief.html @@ -0,0 +1,161 @@ + +救济金配置 + + + +
+
+
+
+ + + + +
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+ + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/robotkill.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/robotkill.html new file mode 100644 index 0000000..121b6bb --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/robotkill.html @@ -0,0 +1,317 @@ + +机器人击杀播报配置 + + + +
+
+
+
+ + + + + +
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+
+ + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/room.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/room.html new file mode 100644 index 0000000..0436aae --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/room.html @@ -0,0 +1,330 @@ + +房间配置 + + + +
+
+ +
+
+
+
+
+ + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/roomfish.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/roomfish.html new file mode 100644 index 0000000..aa91b7b --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/roomfish.html @@ -0,0 +1,680 @@ + +出鱼配置 + + + +
+
+
+
+
    +
  • 出鱼配置
  • + +
+
+
+
+
+
+
+
+
+
游戏类型选择
+
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/roomfishprobability.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/roomfishprobability.html new file mode 100644 index 0000000..346712b --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/roomfishprobability.html @@ -0,0 +1,531 @@ + + + + + 出鱼概率配置 + + + + +
+
+
+
+ + + + +
+
+
+
+
+
+
游戏类型选择
+
+
+ + + + +
+
+
+
+
房间等级筛选
+
+
+ + + + +
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/scratchcard.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/scratchcard.html new file mode 100644 index 0000000..c68adc8 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/scratchcard.html @@ -0,0 +1,349 @@ + +刮刮卡配置 + + + +
+
+
+
+
+
+
+ + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/sign.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/sign.html new file mode 100644 index 0000000..a13feb4 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/sign.html @@ -0,0 +1,378 @@ + +签到配置 + + + +
+
+
+
+
+
+
+ + + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/socket_test.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/socket_test.html new file mode 100644 index 0000000..2c39d77 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/socket_test.html @@ -0,0 +1,111 @@ + + + + +象棋 Hub 流程测试 + + + +

象棋 Hub 流程测试

+
+ + + + + + + + + +
+ + + + + +
+
+ + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/torpedo.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/torpedo.html new file mode 100644 index 0000000..be4e93d --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/torpedo.html @@ -0,0 +1,197 @@ + +鱼雷配置 + + + + + +
+
+
+
+ + + +
+
+
+
+
+
+
+ + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/userlevel.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/userlevel.html new file mode 100644 index 0000000..1324b81 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/userlevel.html @@ -0,0 +1,443 @@ +用户等级配置 + + + +
+
+
+
+
+
+
+ + + + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/vip.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/vip.html new file mode 100644 index 0000000..e7dae4d --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/vip.html @@ -0,0 +1,604 @@ + +VIP等级配置 + + + +
+
+
+
+ VIP经验计算规则: + VIP经验 = 实际现金充值金额 × 10 + VIP经验包经验。 + 金币、钻石余额、象棋或捕鱼输赢以及“累计充值金币”均不参与VIP经验计算。 +
+
+
+
+
+ + + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/index.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/index.html new file mode 100644 index 0000000..c4bf662 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/index.html @@ -0,0 +1,180 @@ + +
+
+
+
+ + +
+
+
数据概览
+
+ + + +
+
+
+
+
    +
  • 今日热搜
  • +
  • 今日热帖
  • +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + +
+
+ + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/layout.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/layout.html new file mode 100644 index 0000000..8a0b359 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/layout.html @@ -0,0 +1,287 @@ +
+
+ + +
    +
  • + + + +
  • +
  • + + + +
  • +
  • + + + +
  • +
  • + +
  • +
+
+ + +
+
+ +
+
+ + +
+
+
+ +
+
    +
  • +
+
+
+ + +
+
+ +
+
+ + +
+
+ + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/mail/index.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/mail/index.html new file mode 100644 index 0000000..80e87e5 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/mail/index.html @@ -0,0 +1,346 @@ +邮件列表 + + +
+ +
+ +
+ + +
+ + +
+ + +
+
+ + +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+
+ +
+
+ +
+ + +
+ + +
+ +
+ +
+ + +
+
+
+ + +
+ +
+ +
+
+
+ +
+ +
+
+
+ + \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/mail/static.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/mail/static.html new file mode 100644 index 0000000..db62af5 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/mail/static.html @@ -0,0 +1,107 @@ +邮件统计 + + + +
+
+
+
+
+
-
+
总邮件数
+
+
+
+
+
+
+
-
+
今日发送
+
+
+
+
+
+
+
-
+
本月发送
+
+
+
+
+
+
+
-
+
未领取
+
+
+
+
+ +
+
+
+
+
-
+
已领取
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/notice/list.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/notice/list.html new file mode 100644 index 0000000..1a01283 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/notice/list.html @@ -0,0 +1,408 @@ +公告管理 + + + + + +
+
+
+
+ + + + +
+
+
+ + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/room/roomlist.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/room/roomlist.html new file mode 100644 index 0000000..a749da5 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/room/roomlist.html @@ -0,0 +1,948 @@ + +房间管理 + + + +
+ +
+
    +
  • 捕鱼房间
  • +
  • 象棋房间
  • +
+
+ +
+
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ + + + +
+
+
+ +
+
+
+
+
+
总房间数
+
+

0

+
+
+
+
+
+
在线玩家
+
+

0

+
+
+
+
+
+
机器人
+
+

0

+
+
+
+
+
+
总人数
+
+

0

+
+
+
+
+
+ + +
+ + +
+
+
+ + +
+
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ + + + +
+
+
+ +
+
+
+
+
+
总房间数
+
+

0

+
+
+
+
+
+
空房率
+
+

0

+
+
+
+
+
+
进行中
+
+

0

+
+
+
+
+
+
已结束
+
+

0

+
+
+
+
+
+
黑方玩家
+
+

0

+
+
+
+
+
+
红方玩家
+
+

0

+
+
+
+
+
+ +
+ + +
+
+
+
+
+
+ + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/set/system/email.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/set/system/email.html new file mode 100644 index 0000000..96e7192 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/set/system/email.html @@ -0,0 +1,68 @@ + + +邮件服务 + + + +
+
+
+
+
邮件服务
+
+ +
+
+ +
+ +
+
如:smtp.163.com
+
+
+ +
+ +
+
一般为 25 或 465
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+
+ +
+
+
+
+
+ + \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/set/system/website.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/set/system/website.html new file mode 100644 index 0000000..3c84cdd --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/set/system/website.html @@ -0,0 +1,93 @@ +网站设置 + + + +
+
+
+
+
网站设置
+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
分钟
+
本地开发一般推荐设置为 0,线上环境建议设置为 10。
+
+
+ +
+ +
+
KB
+
提示:1 M = 1024 KB
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+
+ +
+
+
+
+
+ + \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/set/user/about.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/set/user/about.html new file mode 100644 index 0000000..bb1c03f --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/set/user/about.html @@ -0,0 +1,21 @@ + +
版本信息
+
+ + +
+ +
关于版权
+
+ +
+ layuiAdmin 受国家计算机软件著作权保护,未经官网正规渠道授权擅自公开产品源文件、以及直接对产品二次出售的,我们将保留追究法律责任的权利。 +
+

© 2018 layui.com 版权所有

+
\ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/set/user/info.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/set/user/info.html new file mode 100644 index 0000000..25bed2b --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/set/user/info.html @@ -0,0 +1,98 @@ + +设置我的资料 + + + +
+
+
+
+
设置我的资料
+
+ +
+
+ +
+ +
+
当前角色不可更改为其它角色
+
+
+ +
+ +
+
不可修改。一般用于后台登入名
+
+
+ +
+ +
+
+
+ +
+ + +
+
+
+ +
+ +
+
+ + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
+
+
+
+ + \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/set/user/password.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/set/user/password.html new file mode 100644 index 0000000..170a6b1 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/set/user/password.html @@ -0,0 +1,53 @@ +设置我的密码 + + + +
+
+
+
+
修改密码
+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
6到16个字符
+
+
+ +
+ +
+
+
+
+ +
+
+
+ +
+
+
+
+
+ + \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/system/faqmanage.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/system/faqmanage.html new file mode 100644 index 0000000..1cea435 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/system/faqmanage.html @@ -0,0 +1,683 @@ + +常见问题管理 + + + + + + + +
+
+ +
+
+ +
+
+
+ + +
+
+ 请选择分类 + +
+
+
+
+
+ + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/system/feedbackmanage.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/system/feedbackmanage.html new file mode 100644 index 0000000..06f52d9 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/system/feedbackmanage.html @@ -0,0 +1,377 @@ + +反馈管理 + + + +
+
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ + +
+
+
+ +
+
+
+ + + + + + + + + + +
+
+
+ + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/system/operationlog.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/system/operationlog.html new file mode 100644 index 0000000..0a112f0 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/system/operationlog.html @@ -0,0 +1,335 @@ + +操作日志 + + + +
+
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ + +
+
+
+ +
+
+
+ + + + + + + + +
+
+
+ + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/system/userloginlog.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/system/userloginlog.html new file mode 100644 index 0000000..db7203f --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/system/userloginlog.html @@ -0,0 +1,340 @@ + +登录日志 + + + +
+
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ + +
+
+
+ +
+
+
+ + + + + + + + + + +
+
+
+ + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/adminform.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/adminform.html new file mode 100644 index 0000000..5c17b8b --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/adminform.html @@ -0,0 +1,143 @@ + + +
+ +
+ +
+ + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + +
+
+ +
+ +
+ +
+
+
+ + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/bannerform.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/bannerform.html new file mode 100644 index 0000000..2e0dd44 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/bannerform.html @@ -0,0 +1,207 @@ + + +
+ +
+ +
+ + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+
+
+ + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/bannerlist.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/bannerlist.html new file mode 100644 index 0000000..c57cf05 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/bannerlist.html @@ -0,0 +1,96 @@ + + +广告位 + +
+ +
+ +
+
+
+
+
+ +
+ +
+
+ + +
+ +
+
+
+ +
+
+ +
+ +
+ + +
+
+
+ + \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/dic.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/dic.html new file mode 100644 index 0000000..a78348e --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/dic.html @@ -0,0 +1,233 @@ + + +字典管理 + + + +
+
+ +
+
+ +
+ +
+ + +
+
+
+ + + \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/dicform.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/dicform.html new file mode 100644 index 0000000..9d6d6be --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/dicform.html @@ -0,0 +1,82 @@ + + +
+
+ +
+ + + +
+
+ +
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ +
+
+
+ + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/list.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/list.html new file mode 100644 index 0000000..572172b --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/list.html @@ -0,0 +1,136 @@ + + +后台管理员 + + + +
+
+
+
+
+ +
+ +
+
+ + +
+ +
+
+
+ +
+
+ +
+ +
+ + +
+
+
+ + \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/nav.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/nav.html new file mode 100644 index 0000000..5a8372f --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/nav.html @@ -0,0 +1,231 @@ + + +菜单管理 + + + +
+
+ +
+
+ +
+ +
+ + +
+
+
+ + + \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/navform.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/navform.html new file mode 100644 index 0000000..eb53163 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/navform.html @@ -0,0 +1,56 @@ + + +
+
+ +
+ + + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+
+ +
+ +
+
+
+ + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/role.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/role.html new file mode 100644 index 0000000..00201cb --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/role.html @@ -0,0 +1,90 @@ + + +角色管理 + + + +
+
+ +
+
+ +
+ +
+ + +
+
+
+ + \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/roleform.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/roleform.html new file mode 100644 index 0000000..3a13330 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/roleform.html @@ -0,0 +1,42 @@ + + +
+
+ +
+ + +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/roletree.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/roletree.html new file mode 100644 index 0000000..4860fbb --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/administrators/roletree.html @@ -0,0 +1,155 @@ + + +
+ +
+ +
+ + +
+
+
+ +
+ +
+
+ +
+ + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/assetchange/assetchangelog.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/assetchange/assetchangelog.html new file mode 100644 index 0000000..b5fa891 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/assetchange/assetchangelog.html @@ -0,0 +1,312 @@ +金币变动记录 + + + + +
+
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ + +
+
+
+ +
+
+
+ + + + + + + + +
+
+
+ + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/forget.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/forget.html new file mode 100644 index 0000000..ceca75a --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/forget.html @@ -0,0 +1,144 @@ + + + + + + + \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/login.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/login.html new file mode 100644 index 0000000..86b2b31 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/login.html @@ -0,0 +1,90 @@ + + + + + + + \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/reg.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/reg.html new file mode 100644 index 0000000..b00c701 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/reg.html @@ -0,0 +1,125 @@ + + + + + + + \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/user/factorlist.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/user/factorlist.html new file mode 100644 index 0000000..1abbce6 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/user/factorlist.html @@ -0,0 +1,416 @@ + +用户因子配置 + + + +
+
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + +
+
+
+
+
+
+ +
+
+
+ + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/user/fenghao.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/user/fenghao.html new file mode 100644 index 0000000..e74078a --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/user/fenghao.html @@ -0,0 +1,56 @@ + + +
+
+ +
+ +
+
+ + +
+ +
+ +
+
+ + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/user/list.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/user/list.html new file mode 100644 index 0000000..d472b65 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/user/list.html @@ -0,0 +1,1419 @@ + +用户管理 + + + + + +
+
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + + +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+
+ +
+
+
+ +
+ +
+
+
+
+
+
+
+ + + + + +
+ +
+ + +
+
+
+ + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/user/userdetail.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/user/userdetail.html new file mode 100644 index 0000000..3edcf96 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/user/userdetail.html @@ -0,0 +1,357 @@ + +用户详情 + + + +
+
+
+
+
基本信息
+
+
+
+
+
+
+
+
+
+
+ + + + +
+
+
+
+
    +
  • 资产信息
  • +
  • 统计信息
  • +
  • 装备背包
  • +
+
+
+
+
+
+
+
+
+
+
+
+ + diff --git a/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/user/userform.html b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/user/userform.html new file mode 100644 index 0000000..a839059 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/dist/views/user/user/userform.html @@ -0,0 +1,71 @@ + + +
+
+ +
+ +
+
+ + +
+ +
+ +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/index.html b/AdminSrc/AdminHost/wwwroot/admin/index.html new file mode 100644 index 0000000..3cb6c11 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/index.html @@ -0,0 +1,42 @@ + + + + + + + 朋客捕鱼后台管理 + + + + + + + +
+ + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/console/prograss.js b/AdminSrc/AdminHost/wwwroot/admin/json/console/prograss.js new file mode 100644 index 0000000..13a093b --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/console/prograss.js @@ -0,0 +1,36 @@ +{ + "code": 0 + ,"msg": "" + ,"count": "100" + ,"data": [{ + "prograss": "开会" + ,"time": "一小时" + ,"complete": "已完成" + ,"LAY_CHECKED": true + },{ + "prograss": "项目开发" + ,"time": "两小时" + ,"complete": "进行中" + ,"LAY_CHECKED": true + },{ + "prograss": "陪吃饭" + ,"time": "一小时" + ,"complete": "未完成" + },{ + "prograss": "修改小bug" + ,"time": "半小时" + ,"complete": "未完成" + },{ + "prograss": "修改大bug" + ,"time": "两小时" + ,"complete": "未完成" + },{ + "prograss": "修改小bug" + ,"time": "半小时" + ,"complete": "未完成" + },{ + "prograss": "修改大bug" + ,"time": "两小时" + ,"complete": "未完成" + }] +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/console/top-card.js b/AdminSrc/AdminHost/wwwroot/admin/json/console/top-card.js new file mode 100644 index 0000000..51ee9bb --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/console/top-card.js @@ -0,0 +1,76 @@ +{ + "code": 0 + ,"msg": "" + ,"count": "100" + ,"data": [{ + "id": 111 + ,"title": "社区开始接受 “赞助商广告” 投放" + ,"username": "贤心" + ,"channel": "公告" + ,"href": "http://fly.layui.com/jie/15697/" + ,"crt": 61632 + },{ + "id": 222 + ,"title": "layui 一周年" + ,"username": "猫吃" + ,"channel": "讨论" + ,"href": "http://fly.layui.com/jie/16622/" + ,"crt": 61632 + },{ + "id": 333 + ,"title": "四个月的前端" + ,"username": "fd" + ,"channel": "分享" + ,"href": "http://fly.layui.com/jie/16651/" + ,"crt": 61632 + },{ + "id": 333 + ,"title": "如何评价LayUI和他的作者闲心" + ,"username": "纸飞机" + ,"channel": "提问" + ,"href": "http://fly.layui.com/jie/9352/" + ,"crt": 61632 + },{ + "id": 333 + ,"title": "如何评价LayUI和他的作者闲心" + ,"username": "纸飞机" + ,"channel": "提问" + ,"href": "http://fly.layui.com/jie/9352/" + ,"crt": 61632 + },{ + "id": 333 + ,"title": "如何评价LayUI和他的作者闲心" + ,"username": "纸飞机" + ,"channel": "提问" + ,"href": "http://fly.layui.com/jie/9352/" + ,"crt": 61632 + },{ + "id": 333 + ,"title": "如何评价LayUI和他的作者闲心" + ,"username": "纸飞机" + ,"channel": "提问" + ,"href": "http://fly.layui.com/jie/9352/" + ,"crt": 61632 + },{ + "id": 333 + ,"title": "如何评价LayUI和他的作者闲心" + ,"username": "纸飞机" + ,"channel": "提问" + ,"href": "http://fly.layui.com/jie/9352/" + ,"crt": 61632 + },{ + "id": 333 + ,"title": "如何评价LayUI和他的作者闲心" + ,"username": "纸飞机" + ,"channel": "提问" + ,"href": "http://fly.layui.com/jie/9352/" + ,"crt": 61632 + },{ + "id": 333 + ,"title": "如何评价LayUI和他的作者闲心" + ,"username": "纸飞机" + ,"channel": "提问" + ,"href": "http://fly.layui.com/jie/9352/" + ,"crt": 61632 + }] +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/console/top-search.js b/AdminSrc/AdminHost/wwwroot/admin/json/console/top-search.js new file mode 100644 index 0000000..9750e5e --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/console/top-search.js @@ -0,0 +1,46 @@ +{ + "code": 0 + ,"msg": "" + ,"count": "100" + ,"data": [{ + "keywords": "贤心是男是女" + ,"frequency": 8520 + ,"userNums": 2216 + },{ + "keywords": "Java程序员能找到女朋友吗" + ,"frequency": 666 + ,"userNums": 333 + },{ + "keywords": "此表格是静态模拟数据" + ,"frequency": 666 + ,"userNums": 333 + },{ + "keywords": "layui官方教程" + ,"frequency": 666 + ,"userNums": 333 + },{ + "keywords": "layui官方教程" + ,"frequency": 666 + ,"userNums": 333 + },{ + "keywords": "layui官方教程" + ,"frequency": 666 + ,"userNums": 333 + },{ + "keywords": "layui官方教程" + ,"frequency": 666 + ,"userNums": 333 + },{ + "keywords": "layui官方教程" + ,"frequency": 666 + ,"userNums": 333 + },{ + "keywords": "layui官方教程" + ,"frequency": 666 + ,"userNums": 333 + },{ + "keywords": "layui官方教程" + ,"frequency": 666 + ,"userNums": 333 + }] +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/content/comment.js b/AdminSrc/AdminHost/wwwroot/admin/json/content/comment.js new file mode 100644 index 0000000..45b8c3f --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/content/comment.js @@ -0,0 +1,56 @@ +{ + "code": 0 + ,"msg": "" + ,"count": "100" + ,"data": [{ + "id": "001" + ,"reviewers": "赵" + ,"content": "我又爱上编程了" + ,"commtime": 20160312 + },{ + "id": "002" + ,"reviewers": "钱" + ,"content": "女生出门要小心" + ,"commtime": 20160821 + },{ + "id": "003" + ,"reviewers": "孙" + ,"content": "框架就用layui" + ,"commtime": 20161212 + },{ + "id": "004" + ,"reviewers": "李" + ,"content": "心姐么么哒" + ,"commtime": 20170311 + },{ + "id": "005" + ,"reviewers": "周" + ,"content": "希望明天是个好天气" + ,"commtime": 20170612 + },{ + "id": "006" + ,"reviewers": "吴" + ,"content": "我又爱上编程了" + ,"commtime": 20171112 + },{ + "id": "007" + ,"reviewers": "郑" + ,"content": "女生出门要小心" + ,"commtime": 20171230 + },{ + "id": "008" + ,"reviewers": "王" + ,"content": "框架就用layui" + ,"commtime": 20180112 + },{ + "id": "009" + ,"reviewers": "冯" + ,"content": "心姐么么哒" + ,"commtime": 20180221 + },{ + "id": "010" + ,"reviewers": "陈" + ,"content": "希望明天是个好天气" + ,"commtime": 20180312 + }] +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/content/list.js b/AdminSrc/AdminHost/wwwroot/admin/json/content/list.js new file mode 100644 index 0000000..b70f3e7 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/content/list.js @@ -0,0 +1,62 @@ +{ + "code": 0 + ,"msg": "" + ,"count": "100" + ,"data": [{ + "id": "001" + ,"label": "美食" + ,"title": "舌尖上的中国第一季" + ,"author": "作者-1" + ,"content": "通过中华美食的多个侧面,来展现食物给中国人生活带来的仪式、伦理等方面的文化;见识中国特色食材以及与食物相关、构成中国美食特有气质的一系列元素;了解中华饮食文化的精致和源远流长" + ,"uploadtime": 20121204 + ,"status": true + },{ + "id": "002" + ,"label": "美食" + ,"title": "舌尖上的中国第二季" + ,"author": "作者-2" + ,"content": "以食物为窗口,读懂中国——通过美食,使人们可以有滋有味地认知这个古老的东方国度。“一方水土一方人”,本片将通过展示人们日常生活中与美食相关的多重侧面,描绘与感知中国人的文化传统、家族观念、生活态度与故土难离。人们收获、保存、烹饪、生产美食,并在其过程中留存和传承食物所承载的味觉记忆、饮食习俗、文化样态与家常情感。" + ,"uploadtime": 20141204 + ,"status": false + },{ + "id": "003" + ,"label": "美食" + ,"title": "舌尖上的中国第三季" + ,"author": "作者-3" + ,"content": "以食物为窗口,读懂中国——通过美食,使人们可以有滋有味地认知这个古老的东方国度。“一方水土一方人”,本片将通过展示人们日常生活中与美食相关的多重侧面,描绘与感知中国人的文化传统、家族观念、生活态度与故土难离。人们收获、保存、烹饪、生产美食,并在其过程中留存和传承食物所承载的味觉记忆、饮食习俗、文化样态与家常情感将世界美食和中国美食进行比照。春耕、夏耘、秋收、冬藏,天人合一的东方哲学让中国饮食依时而变,智慧灵动,中医营养摄生学说创造了食材运用的新天地,儒家人伦道德则把心意和家的味道端上我们的餐桌。淘洗历史,糅合时光,一代又一代的中国人在天地间升起烟火,用至精至诚的心意烹制食物,一餐一食之间,中国人展示个性,确认归属,构建文明,理解和把握着世界的奥妙。" + ,"uploadtime": 20161204 + ,"status": false + },{ + "id": "004" + ,"label": "历史" + ,"title": "诸葛亮骂王朗" + ,"author": "作者-1" + ,"content": "皓首匹夫!苍髯老贼!你即将命归于九泉之下,届时,有何面目见汉朝二十四代先帝?二臣贼子!你枉活七十有六,一生未立寸功,只会摇唇舞舌,助曹为虐!一条断脊之犬,还敢在我军阵前狺狺狂吠!我从未见过如此厚颜无耻之人!!!" + ,"uploadtime": 20180201 + ,"status": false + },{ + "id": "005" + ,"label": "新闻" + ,"title": "新时代特色中国梦" + ,"author": "作者-1" + ,"content": "今天,我们比历史上任何时期都更接近、更有信心和能力实现中华民族伟大复兴的目标。新时代已经到来,蓝图已经绘就,中国梦离我们越来越近了。" + ,"uploadtime": 20180512 + ,"status": false + },{ + "id": "006" + ,"label": "新闻" + ,"title": "新时代特色中国梦" + ,"author": "作者-2" + ,"content": "梦想不会主动走向我们,只有我们去主动实现梦想。行百里者半九十。虽然中国梦离我们越来越近了,但是要实现中国梦,还要靠我们以永不懈怠的精神状态、功在不舍的坚强意志,不忘初心,继续前进。" + ,"uploadtime": 20180514 + ,"status": false + },{ + "id": "007" + ,"label": "体育" + ,"title": "皇马大战利物浦" + ,"author": "作者-3" + ,"content": "对欧足联而言,更想要产生个新冠军。连续三年都是同一个冠军队,这会毁掉欧冠……”格里姆表态,“皇马有梦幻般的阵容,但从促进竞争的角度而言,另一支球队获胜会更好。" + ,"uploadtime": 20180515 + ,"status": false + }] +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/content/tags.js b/AdminSrc/AdminHost/wwwroot/admin/json/content/tags.js new file mode 100644 index 0000000..6ca85cd --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/content/tags.js @@ -0,0 +1,21 @@ +{ + "code": 0 + ,"msg": "" + ,"count": "100" + ,"data": [{ + "id": "001" + ,"tags": "美食" + },{ + "id": "002" + ,"tags": "新闻" + },{ + "id": "003" + ,"tags": "八卦" + },{ + "id": "004" + ,"tags": "体育" + },{ + "id": "005" + ,"tags": "音乐" + }] +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/forum/list.js b/AdminSrc/AdminHost/wwwroot/admin/json/forum/list.js new file mode 100644 index 0000000..144e75b --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/forum/list.js @@ -0,0 +1,62 @@ +{ + "code": 0 + ,"msg": "" + ,"count": "100" + ,"data": [{ + "id": "1001" + ,"poster": "赵" + ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg" + ,"content": "为什么花儿这么么红" + ,"posttime": 20160805 + ,"top": false + },{ + "id": "1002" + ,"poster": "钱" + ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg" + ,"content": "喜欢胡歌,赞赞赞" + ,"posttime": 20161205 + ,"top": true + },{ + "id": "1003" + ,"poster": "孙" + ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg" + ,"content": "明天就要考试了,好紧张,求保佑" + ,"posttime": 20170405 + ,"top": false + },{ + "id": "1004" + ,"poster": "李" + ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg" + ,"content": "希望明天是个好天气" + ,"posttime": 20171005 + ,"top": false + },{ + "id": "1005" + ,"poster": "周" + ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg" + ,"content": "女追男隔层纱,是不是真的" + ,"posttime": 20180205 + ,"top": false + },{ + "id": "1006" + ,"poster": "吴" + ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg" + ,"content": "竟然有人跳楼,年轻人想不开啊!" + ,"posttime": 20180512 + ,"top": false + },{ + "id": "1007" + ,"poster": "郑" + ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg" + ,"content": "大家一定不能学那个年轻人,珍爱生命啊" + ,"posttime": 20180512 + ,"top": false + },{ + "id": "1008" + ,"poster": "王" + ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg" + ,"content": "想知道南昌哪里有好吃的西安肉夹馍" + ,"posttime": 20180514 + ,"top": false + }] +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/forum/replys.js b/AdminSrc/AdminHost/wwwroot/admin/json/forum/replys.js new file mode 100644 index 0000000..0703695 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/forum/replys.js @@ -0,0 +1,69 @@ +{ + "code": 0 + ,"msg": "" + ,"count": "100" + ,"data": [{ + "id": "001" + ,"replyer": "吴" + ,"cardid": "1002" + ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg" + ,"content": "有眼光,我也喜欢胡歌!" + ,"replytime": 20161205 + },{ + "id": "002" + ,"replyer": "郑" + ,"cardid": "1002" + ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg" + ,"content": "同上同上。" + ,"replytime": 20161205 + },{ + "id": "003" + ,"replyer": "王" + ,"cardid": "1003" + ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg" + ,"content": "能过一定过,不能过紧张也没用" + ,"replytime": 20170405 + },{ + "id": "004" + ,"replyer": "冯" + ,"cardid": "1001" + ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg" + ,"content": "可能因为你流鼻血了。" + ,"replytime": 20170405 + },{ + "id": "005" + ,"replyer": "陈" + ,"cardid": "1003" + ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg" + ,"content": "加油加油,看好你" + ,"replytime": 20170405 + },{ + "id": "006" + ,"replyer": "褚" + ,"cardid": "1005" + ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg" + ,"content": "纯属放屁" + ,"replytime": 20180207 + },{ + "id": "007" + ,"replyer": "卫" + ,"cardid": "1005" + ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg" + ,"content": "可以试试" + ,"replytime": 20180207 + },{ + "id": "006" + ,"replyer": "蒋" + ,"cardid": "1006" + ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg" + ,"content": "是啊是啊,太恐怖了。" + ,"replytime": 20180512 + },{ + "id": "007" + ,"replyer": "沈" + ,"cardid": "1008" + ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg" + ,"content": "魏家凉皮的凉皮就很不错奥。" + ,"replytime": 20180515 + }] +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/layer/photos.js b/AdminSrc/AdminHost/wwwroot/admin/json/layer/photos.js new file mode 100644 index 0000000..7daedc3 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/layer/photos.js @@ -0,0 +1,39 @@ +{ + "code": 0, + "msg": "", + "title": "JSON请求的相册", + "id": 8, + "start": 0, + "data": [ + { + "alt": "layer", + "pid": 109, + "src": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg", + "thumb": "" + }, + { + "alt": "说好的,一起Fly", + "pid": 110, + "src": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4kebemcj20ga09saa1.jpg", + "thumb": "" + }, + { + "alt": "佟丽娅女神", + "pid": 111, + "src": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg", + "thumb": "" + }, + { + "alt": "凤姐是个好人", + "pid": 112, + "src": "https://wx3.sinaimg.cn/mw690/5db11ff4gy1fmx4kec9vuj20b20dwmyk.jpg", + "thumb": "" + }, + { + "alt": "星空如此深邃", + "pid": 113, + "src": "https://wx3.sinaimg.cn/mw690/5db11ff4gy1fmx4keca8ag208g06iglw.gif", + "thumb": "" + } + ] +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/layim/getList.js b/AdminSrc/AdminHost/wwwroot/admin/json/layim/getList.js new file mode 100644 index 0000000..aa88110 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/layim/getList.js @@ -0,0 +1,96 @@ +{ + "code": 0 + ,"msg": "" + ,"data": { + "mine": { + "username": "纸飞机" + ,"id": "100000" + ,"status": "online" + ,"sign": "在深邃的编码世界,做一枚轻盈的纸飞机" + ,"avatar": "//res.layui.com/images/fly/avatar/00.jpg" + } + ,"friend": [{ + "groupname": "知名人物" + ,"id": 0 + ,"list": [{ + "username": "贤心" + ,"id": "100001" + ,"avatar": "//tva1.sinaimg.cn/crop.0.0.118.118.180/5db11ff4gw1e77d3nqrv8j203b03cweg.jpg" + ,"sign": "这些都是测试数据,实际使用请严格按照该格式返回" + ,"status": "online" + },{ + "username": "刘涛tamia" + ,"id": "100001222" + ,"sign": "如约而至,不负姊妹欢乐颂" + ,"avatar": "//tva4.sinaimg.cn/crop.0.1.1125.1125.180/475bb144jw8f9nwebnuhkj20v90vbwh9.jpg" + },{ + "username": "谢楠" + ,"id": "10034001" + ,"avatar": "//tva2.sinaimg.cn/crop.1.0.747.747.180/633f068fjw8f9h040n951j20ku0kr74t.jpg" + ,"sign": "" + },{ + "username": "马小云" + ,"id": "168168" + ,"avatar": "//tva1.sinaimg.cn/crop.0.0.180.180.180/7fde8b93jw1e8qgp5bmzyj2050050aa8.jpg" + ,"sign": "让天下没有难写的代码" + },{ + "username": "徐小峥" + ,"id": "666666" + ,"avatar": "//tva1.sinaimg.cn/crop.0.0.512.512.180/6a4acad5jw8eqi6yaholjj20e80e8t9f.jpg" + ,"sign": "代码在囧途,也要写到底" + }] + },{ + "groupname": "网红声优" + ,"id": 1 + ,"list": [{ + "username": "罗玉凤" + ,"id": "121286" + ,"avatar": "//tva4.sinaimg.cn/crop.0.0.640.640.180/4a02849cjw8fc8vn18vktj20hs0hs75v.jpg" + ,"sign": "在自己实力不济的时候,不要去相信什么媒体和记者。他们不是善良的人,有时候候他们的采访对当事人而言就是陷阱" + },{ + "username": "Z_子晴" + ,"id": "108101" + ,"avatar": "//tva1.sinaimg.cn/crop.0.23.1242.1242.180/8693225ajw8fbimjimpjwj20yi0zs77l.jpg" + ,"sign": "微电商达人" + },{ + "username": "大鱼_MsYuyu" + ,"id": "12123454" + ,"avatar": "//tva2.sinaimg.cn/crop.0.0.512.512.180/005LMAegjw8f2bp9qg4mrj30e80e8dg5.jpg" + ,"sign": "我瘋了!這也太準了吧 超級笑點低" + },{ + "username": "醋醋cucu" + ,"id": "102101" + ,"avatar": "//tva2.sinaimg.cn/crop.0.0.640.640.180/648fbe5ejw8ethmg0u9egj20hs0ht0tn.jpg" + ,"sign": "" + },{ + "username": "柏雪近在它香" + ,"id": "3435343" + ,"avatar": "//tva2.sinaimg.cn/crop.0.8.751.751.180/961a9be5jw8fczq7q98i7j20kv0lcwfn.jpg" + ,"sign": "" + }] + },{ + "groupname": "女神艺人" + ,"id": 2 + ,"list": [{ + "username": "王祖贤" + ,"id": "76543" + ,"avatar": "//wx2.sinaimg.cn/mw690/5db11ff4gy1flxmew7edlj203d03wt8n.jpg" + ,"sign": "我爱贤心" + },{ + "username": "佟丽娅" + ,"id": "4803920" + ,"avatar": "//tva3.sinaimg.cn/crop.0.0.750.750.180/5033b6dbjw8etqysyifpkj20ku0kuwfw.jpg" + ,"sign": "我也爱贤心吖吖啊" + }] + }] + ,"group": [{ + "groupname": "前端群" + ,"id": "101" + ,"avatar": "//tva1.sinaimg.cn/crop.0.0.200.200.50/006q8Q6bjw8f20zsdem2mj305k05kdfw.jpg" + },{ + "groupname": "Fly社区官方群" + ,"id": "102" + ,"avatar": "//tva2.sinaimg.cn/crop.0.0.199.199.180/005Zseqhjw1eplix1brxxj305k05kjrf.jpg" + }] + } +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/layim/getMembers.js b/AdminSrc/AdminHost/wwwroot/admin/json/layim/getMembers.js new file mode 100644 index 0000000..66dcba0 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/layim/getMembers.js @@ -0,0 +1,67 @@ +{ + "code": 0 + ,"msg": "" + ,"data": { + "list": [{ + "username": "贤心" + ,"id": "100001" + ,"avatar": "//tva1.sinaimg.cn/crop.0.0.118.118.180/5db11ff4gw1e77d3nqrv8j203b03cweg.jpg" + ,"sign": "这些都是测试数据,实际使用请严格按照该格式返回" + },{ + "username": "Z_子晴" + ,"id": "108101" + ,"avatar": "//tva1.sinaimg.cn/crop.0.23.1242.1242.180/8693225ajw8fbimjimpjwj20yi0zs77l.jpg" + ,"sign": "微电商达人" + },{ + "username": "Lemon_CC" + ,"id": "102101" + ,"avatar": "//tva4.sinaimg.cn/crop.0.0.180.180.180/6d424ea5jw1e8qgp5bmzyj2050050aa8.jpg" + ,"sign": "" + },{ + "username": "马小云" + ,"id": "168168" + ,"avatar": "//tva1.sinaimg.cn/crop.0.0.180.180.180/7fde8b93jw1e8qgp5bmzyj2050050aa8.jpg" + ,"sign": "让天下没有难写的代码" + },{ + "username": "徐小峥" + ,"id": "666666" + ,"avatar": "//tva1.sinaimg.cn/crop.0.0.512.512.180/6a4acad5jw8eqi6yaholjj20e80e8t9f.jpg" + ,"sign": "代码在囧途,也要写到底" + },{ + "username": "罗玉凤" + ,"id": "121286" + ,"avatar": "//tva4.sinaimg.cn/crop.0.0.640.640.180/4a02849cjw8fc8vn18vktj20hs0hs75v.jpg" + ,"sign": "在自己实力不济的时候,不要去相信什么媒体和记者。他们不是善良的人,有时候候他们的采访对当事人而言就是陷阱" + },{ + "username": "刘涛tamia" + ,"id": "100001222" + ,"avatar": "//tva4.sinaimg.cn/crop.0.1.1125.1125.180/475bb144jw8f9nwebnuhkj20v90vbwh9.jpg" + ,"sign": "如约而至,不负姊妹欢乐颂" + },{ + "username": "大鱼_MsYuyu" + ,"id": "12123454" + ,"avatar": "//tva2.sinaimg.cn/crop.0.0.512.512.180/005LMAegjw8f2bp9qg4mrj30e80e8dg5.jpg" + ,"sign": "我瘋了!這也太準了吧 超級笑點低" + },{ + "username": "谢楠" + ,"id": "10034001" + ,"avatar": "//tva2.sinaimg.cn/crop.1.0.747.747.180/633f068fjw8f9h040n951j20ku0kr74t.jpg" + ,"sign": "" + },{ + "username": "柏雪近在它香" + ,"id": "3435343" + ,"avatar": "//tva2.sinaimg.cn/crop.0.8.751.751.180/961a9be5jw8fczq7q98i7j20kv0lcwfn.jpg" + ,"sign": "" + },{ + "username": "林心如" + ,"id": "76543" + ,"avatar": "//tva3.sinaimg.cn/crop.0.0.512.512.180/48f122e6jw8fcmi072lkyj20e80e8t9i.jpg" + ,"sign": "我爱贤心" + },{ + "username": "佟丽娅" + ,"id": "4803920" + ,"avatar": "//tva3.sinaimg.cn/crop.0.0.750.750.180/5033b6dbjw8etqysyifpkj20ku0kuwfw.jpg" + ,"sign": "我也爱贤心吖吖啊" + }] + } +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/mall/order.js b/AdminSrc/AdminHost/wwwroot/admin/json/mall/order.js new file mode 100644 index 0000000..9ce2971 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/mall/order.js @@ -0,0 +1,42 @@ +{ + "code": 0 + ,"msg": "" + ,"count": "100" + ,"data": [{ + "invoice": "X123565541" + ,"username": "张小三" + ,"orderDate": "2017-11-10" + ,"amount": 800 + ,"status": 1 + },{ + "invoice": "X123565542" + ,"username": "李小四" + ,"orderDate": "2017-11-10" + ,"amount": 800 + ,"status": 0 + },{ + "invoice": "X123565543" + ,"username": "王老五" + ,"orderDate": "2017-11-10" + ,"amount": 800 + ,"status": 1 + },{ + "invoice": "X123565544" + ,"username": "赵小六" + ,"orderDate": "2017-11-09" + ,"amount": 1600 + ,"status": 1 + },{ + "invoice": "X123565545" + ,"username": "孙小七" + ,"orderDate": "2017-11-09" + ,"amount": 1600 + ,"status": -1 + },{ + "invoice": "X123565546" + ,"username": "周小八" + ,"orderDate": "2017-11-08" + ,"amount": 2600 + ,"status": 1 + }] +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/menu.js b/AdminSrc/AdminHost/wwwroot/admin/json/menu.js new file mode 100644 index 0000000..16b76d5 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/menu.js @@ -0,0 +1,54 @@ + { + "name": "system", + "title": "系统设置", + "spread": true, + "list": [{ + "name": "website", + "title": "网站设置" + }, { + "name": "email", + "title": "邮件服务" + }, { + "name": "operationlog", + "title": "操作日志", + "jump": "system/operationlog" + }, { + "name": "userloginlog", + "title": "登录日志", + "jump": "system/userloginlog" + }, { + "name": "feedbackmanage", + "title": "反馈管理", + "jump": "system/feedbackmanage" + }, { + "name": "noticemanage", + "title": "公告管理", + "jump": "notice/list" + }, { + "name": "faqmanage", + "title": "常见问题", + "jump": "system/faqmanage" + }] + }, + { + "name": "userfactor", + "title": "用户管理", + "spread": true, + "list": [{ + "name": "factorlist", + "title": "用户因子配置", + "jump": "user/user/factorlist" + }, { + "name": "userlist", + "title": "用户列表", + "jump": "user/user/list" + }, { + "name": "emailmanage", + "title": "邮件管理", + "jump": "email/emaillist" + }, { + "name": "assetchangelog", + "title": "金币变动记录", + "jump": "user/assetchange/assetchangelog" + }] + } \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/message/all.js b/AdminSrc/AdminHost/wwwroot/admin/json/message/all.js new file mode 100644 index 0000000..da50293 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/message/all.js @@ -0,0 +1,46 @@ +{ + "code": 0 + ,"msg": "" + ,"count": 60 + ,"data": [{ + "id": 123 + ,"title": "你好新朋友,感谢使用 layuiAdmin" + ,"time": 1510363800000 + }, { + "id": 111 + ,"title": "贤心发来了一段私信" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "贤心发来了一段私信" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "贤心发来了一段私信" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "贤心发来了一段私信" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "贤心发来了一段私信" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "贤心发来了一段私信" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "贤心发来了一段私信" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "贤心发来了一段私信" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "贤心发来了一段私信" + ,"time": 1507447570000 + }] +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/message/detail.js b/AdminSrc/AdminHost/wwwroot/admin/json/message/detail.js new file mode 100644 index 0000000..010b950 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/message/detail.js @@ -0,0 +1,10 @@ +{ + "code": 0 + ,"msg": "" + ,"data": { + "id": 111 + ,"title": "你好新朋友,感谢使用 layuiAdmin" + ,"content": "

一直以来,layui 秉承无偿开源的初心,虔诚致力于服务各层次前后端 Web 开发者,在商业横飞的当今时代,这一信念从未动摇。即便身单力薄,仍然重拾决心,埋头造轮,以尽可能地填补产品本身的缺口。在过去的一段的时间,我一直在寻求持久之道,已维持你眼前所见的一切。而 layuiAdmin 是我们尝试解决的手段之一。我相信真正有爱于 layui 生态的你,定然不会错过这一拥抱吧。

子曰:君子不用防,小人防不住。请务必通过官网正规渠道,获得 layuiAdmin!

—— 贤心(layui.com)

" + ,"time": 1510363800000 + } +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/message/direct.js b/AdminSrc/AdminHost/wwwroot/admin/json/message/direct.js new file mode 100644 index 0000000..8f0ddbe --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/message/direct.js @@ -0,0 +1,46 @@ +{ + "code": 0 + ,"msg": "" + ,"count": 60 + ,"data": [{ + "id": 123 + ,"title": "贤心发来了一段私信" + ,"time": 1510363800000 + }, { + "id": 111 + ,"title": "贤心发来了一段私信" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "贤心发来了一段私信" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "贤心发来了一段私信" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "贤心发来了一段私信" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "贤心发来了一段私信" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "贤心发来了一段私信" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "贤心发来了一段私信" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "贤心发来了一段私信" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "贤心发来了一段私信" + ,"time": 1507447570000 + }] +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/message/new.js b/AdminSrc/AdminHost/wwwroot/admin/json/message/new.js new file mode 100644 index 0000000..668f4b5 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/message/new.js @@ -0,0 +1,7 @@ +{ + "code": 0 + ,"msg": "" + ,"data": { + "newmsg": 3 + } +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/message/notice.js b/AdminSrc/AdminHost/wwwroot/admin/json/message/notice.js new file mode 100644 index 0000000..665f677 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/message/notice.js @@ -0,0 +1,46 @@ +{ + "code": 0 + ,"msg": "" + ,"count": 60 + ,"data": [{ + "id": 123 + ,"title": "你好新朋友,感谢使用 layuiAdmin" + ,"time": 1510363800000 + }, { + "id": 111 + ,"title": "你好新朋友,感谢使用 layuiAdmin" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "你好新朋友,感谢使用 layuiAdmin" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "你好新朋友,感谢使用 layuiAdmin" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "你好新朋友,感谢使用 layuiAdmin" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "你好新朋友,感谢使用 layuiAdmin" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "你好新朋友,感谢使用 layuiAdmin" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "你好新朋友,感谢使用 layuiAdmin" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "你好新朋友,感谢使用 layuiAdmin" + ,"time": 1510212370000 + }, { + "id": 111 + ,"title": "你好新朋友,感谢使用 layuiAdmin" + ,"time": 1507447570000 + }] +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/table/demo.js b/AdminSrc/AdminHost/wwwroot/admin/json/table/demo.js new file mode 100644 index 0000000..f84425c --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/table/demo.js @@ -0,0 +1,2 @@ + +{"code":0,"msg":"","count":3000000,"data":[{"id":"10001","username":"杜甫","email":"xianxin@layui.com","sex":"男","city":"浙江杭州","sign":"点击此处,显示更多。当内容超出时,点击单元格会自动显示更多内容。","experience":"116","ip":"192.168.0.8","logins":"108","joinTime":"2016-10-14"},{"id":"10002","username":"李白","email":"xianxin@layui.com","sex":"男","city":"浙江杭州","sign":"君不见,黄河之水天上来,奔流到海不复回。 君不见,高堂明镜悲白发,朝如青丝暮成雪。 人生得意须尽欢,莫使金樽空对月。 天生我材必有用,千金散尽还复来。 烹羊宰牛且为乐,会须一饮三百杯。 岑夫子,丹丘生,将进酒,杯莫停。 与君歌一曲,请君为我倾耳听。(倾耳听 一作:侧耳听) 钟鼓馔玉不足贵,但愿长醉不复醒。(不足贵 一作:何足贵;不复醒 一作:不愿醒/不用醒) 古来圣贤皆寂寞,惟有饮者留其名。(古来 一作:自古;惟 通:唯) 陈王昔时宴平乐,斗酒十千恣欢谑。 主人何为言少钱,径须沽取对君酌。 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。","experience":"12","ip":"192.168.0.8","logins":"106","joinTime":"2016-10-14","LAY_CHECKED":true},{"id":"10003","username":"王勃","email":"xianxin@layui.com","sex":"男","city":"浙江杭州","sign":"人生恰似一场修行","experience":"65","ip":"192.168.0.8","logins":"106","joinTime":"2016-10-14"},{"id":"10004","username":"李清照","email":"xianxin@layui.com","sex":"女","city":"浙江杭州","sign":"人生恰似一场修行","experience":"666","ip":"192.168.0.8","logins":"106","joinTime":"2016-10-14"},{"id":"10005","username":"冰心","email":"xianxin@layui.com","sex":"女","city":"浙江杭州","sign":"人生恰似一场修行","experience":"86","ip":"192.168.0.8","logins":"106","joinTime":"2016-10-14"},{"id":"10006","username":"贤心","email":"xianxin@layui.com","sex":"男","city":"浙江杭州","sign":"人生恰似一场修行","experience":"12","ip":"192.168.0.8","logins":"106","joinTime":"2016-10-14"},{"id":"10007","username":"贤心","email":"xianxin@layui.com","sex":"男","city":"浙江杭州","sign":"人生恰似一场修行","experience":"16","ip":"192.168.0.8","logins":"106","joinTime":"2016-10-14"},{"id":"10008","username":"贤心","email":"xianxin@layui.com","sex":"男","city":"浙江杭州","sign":"人生恰似一场修行","experience":"106","ip":"192.168.0.8","logins":"106","joinTime":"2016-10-14"}]} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/table/demo2.js b/AdminSrc/AdminHost/wwwroot/admin/json/table/demo2.js new file mode 100644 index 0000000..5aad42a --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/table/demo2.js @@ -0,0 +1,2 @@ + +{"code":0,"msg":"","count":66,"data":[{"username":"张小三","amount":18,"province":"浙江","city":"杭州","zone":"西湖区","street":"西溪街道","address":"西溪花园","house":"30栋1单元"},{"username":"李小四","amount":39,"province":"江苏","city":"苏州","zone":"姑苏区","street":"丝绸路","address":"天墅之城","house":"9幢2单元"},{"username":"王小五","amount":8,"province":"江西","city":"南昌","zone":"青山湖区","street":"艾溪湖办事处","address":"中兴和园","house":"1幢3单元"},{"username":"赵小六","amount":16,"province":"福建","city":"泉州","zone":"丰泽区","street":"南洋街道","address":"南洋村","house":"6幢1单元"},{"username":"孙小七","amount":12,"province":"湖北","city":"武汉","zone":"武昌区","street":"武昌大道","address":"两湖花园","house":"16幢2单元"},{"username":"周小八","amount":11,"province":"安徽","city":"黄山","zone":"黄山区","street":"汤口镇","address":"温泉村","house":"21号"}]} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/table/demo3.js b/AdminSrc/AdminHost/wwwroot/admin/json/table/demo3.js new file mode 100644 index 0000000..346d7d9 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/table/demo3.js @@ -0,0 +1,2 @@ + +{"status":200,"message":"","total":8,"rows":{"item":[{"id":"10001","username":"杜甫","email":"xianxin@layui.com","sex":"男","city":"浙江杭州","sign":"点击此处,显示更多。当内容超出时,点击单元格会自动显示更多内容。","experience":"116","ip":"192.168.0.8","logins":"108","joinTime":"2016-10-14"},{"id":"10002","username":"李白","email":"xianxin@layui.com","sex":"男","city":"浙江杭州","sign":"君不见,黄河之水天上来,奔流到海不复回。 君不见,高堂明镜悲白发,朝如青丝暮成雪。 人生得意须尽欢,莫使金樽空对月。 天生我材必有用,千金散尽还复来。 烹羊宰牛且为乐,会须一饮三百杯。 岑夫子,丹丘生,将进酒,杯莫停。 与君歌一曲,请君为我倾耳听。(倾耳听 一作:侧耳听) 钟鼓馔玉不足贵,但愿长醉不复醒。(不足贵 一作:何足贵;不复醒 一作:不愿醒/不用醒) 古来圣贤皆寂寞,惟有饮者留其名。(古来 一作:自古;惟 通:唯) 陈王昔时宴平乐,斗酒十千恣欢谑。 主人何为言少钱,径须沽取对君酌。 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。","experience":"12","ip":"192.168.0.8","logins":"106","joinTime":"2016-10-14"},{"id":"10003","username":"王勃","email":"xianxin@layui.com","sex":"男","city":"浙江杭州","sign":"人生恰似一场修行","experience":"65","ip":"192.168.0.8","logins":"106","joinTime":"2016-10-14"},{"id":"10004","username":"李清照","email":"xianxin@layui.com","sex":"女","city":"浙江杭州","sign":"人生恰似一场修行","experience":"666","ip":"192.168.0.8","logins":"106","joinTime":"2016-10-14"},{"id":"10005","username":"冰心","email":"xianxin@layui.com","sex":"女","city":"浙江杭州","sign":"人生恰似一场修行","experience":"86","ip":"192.168.0.8","logins":"106","joinTime":"2016-10-14"},{"id":"10006","username":"贤心","email":"xianxin@layui.com","sex":"男","city":"浙江杭州","sign":"人生恰似一场修行","experience":"12","ip":"192.168.0.8","logins":"106","joinTime":"2016-10-14"},{"id":"10007","username":"贤心","email":"xianxin@layui.com","sex":"男","city":"浙江杭州","sign":"人生恰似一场修行","experience":"16","ip":"192.168.0.8","logins":"106","joinTime":"2016-10-14"},{"id":"10008","username":"贤心","email":"xianxin@layui.com","sex":"男","city":"浙江杭州","sign":"人生恰似一场修行","experience":"106","ip":"192.168.0.8","logins":"106","joinTime":"2016-10-14"}]}} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/table/user.js b/AdminSrc/AdminHost/wwwroot/admin/json/table/user.js new file mode 100644 index 0000000..240c7aa --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/table/user.js @@ -0,0 +1,2 @@ + +{"code":0,"msg":"","count":1000,"data":[{"id":10000,"username":"user-0","sex":"女","city":"城市-0","sign":"签名-0","experience":255,"logins":24,"wealth":82830700,"classify":"作家","score":57},{"id":10001,"username":"user-1","sex":"男","city":"城市-1","sign":"签名-1","experience":884,"logins":58,"wealth":64928690,"classify":"词人","score":27},{"id":10002,"username":"user-2","sex":"女","city":"城市-2","sign":"签名-2","experience":650,"logins":77,"wealth":6298078,"classify":"酱油","score":31},{"id":10003,"username":"user-3","sex":"女","city":"城市-3","sign":"签名-3","experience":362,"logins":157,"wealth":37117017,"classify":"诗人","score":68},{"id":10004,"username":"user-4","sex":"男","city":"城市-4","sign":"签名-4","experience":807,"logins":51,"wealth":76263262,"classify":"作家","score":6},{"id":10005,"username":"user-5","sex":"女","city":"城市-5","sign":"签名-5","experience":173,"logins":68,"wealth":60344147,"classify":"作家","score":87},{"id":10006,"username":"user-6","sex":"女","city":"城市-6","sign":"签名-6","experience":982,"logins":37,"wealth":57768166,"classify":"作家","score":34},{"id":10007,"username":"user-7","sex":"男","city":"城市-7","sign":"签名-7","experience":727,"logins":150,"wealth":82030578,"classify":"作家","score":28},{"id":10008,"username":"user-8","sex":"男","city":"城市-8","sign":"签名-8","experience":951,"logins":133,"wealth":16503371,"classify":"词人","score":14},{"id":10009,"username":"user-9","sex":"女","city":"城市-9","sign":"签名-9","experience":484,"logins":25,"wealth":86801934,"classify":"词人","score":75}]} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/table/user30.js b/AdminSrc/AdminHost/wwwroot/admin/json/table/user30.js new file mode 100644 index 0000000..0246bbd --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/table/user30.js @@ -0,0 +1,2 @@ + +{"code":0,"msg":"","count":1000,"data":[{"id":10000,"username":"user-0","sex":"女","city":"城市-0","sign":"签名-0","experience":255,"logins":24,"wealth":82830700,"classify":"作家","score":57},{"id":10001,"username":"user-1","sex":"男","city":"城市-1","sign":"签名-1","experience":884,"logins":58,"wealth":64928690,"classify":"词人","score":27},{"id":10002,"username":"user-2","sex":"女","city":"城市-2","sign":"签名-2","experience":650,"logins":77,"wealth":6298078,"classify":"酱油","score":31},{"id":10003,"username":"user-3","sex":"女","city":"城市-3","sign":"签名-3","experience":362,"logins":157,"wealth":37117017,"classify":"诗人","score":68},{"id":10004,"username":"user-4","sex":"男","city":"城市-4","sign":"签名-4","experience":807,"logins":51,"wealth":76263262,"classify":"作家","score":6},{"id":10005,"username":"user-5","sex":"女","city":"城市-5","sign":"签名-5","experience":173,"logins":68,"wealth":60344147,"classify":"作家","score":87},{"id":10006,"username":"user-6","sex":"女","city":"城市-6","sign":"签名-6","experience":982,"logins":37,"wealth":57768166,"classify":"作家","score":34},{"id":10007,"username":"user-7","sex":"男","city":"城市-7","sign":"签名-7","experience":727,"logins":150,"wealth":82030578,"classify":"作家","score":28},{"id":10008,"username":"user-8","sex":"男","city":"城市-8","sign":"签名-8","experience":951,"logins":133,"wealth":16503371,"classify":"词人","score":14},{"id":10009,"username":"user-9","sex":"女","city":"城市-9","sign":"签名-9","experience":484,"logins":25,"wealth":86801934,"classify":"词人","score":75},{"id":10010,"username":"user-10","sex":"女","city":"城市-10","sign":"签名-10","experience":1016,"logins":182,"wealth":71294671,"classify":"诗人","score":34},{"id":10011,"username":"user-11","sex":"女","city":"城市-11","sign":"签名-11","experience":492,"logins":107,"wealth":8062783,"classify":"诗人","score":6},{"id":10012,"username":"user-12","sex":"女","city":"城市-12","sign":"签名-12","experience":106,"logins":176,"wealth":42622704,"classify":"词人","score":54},{"id":10013,"username":"user-13","sex":"男","city":"城市-13","sign":"签名-13","experience":1047,"logins":94,"wealth":59508583,"classify":"诗人","score":63},{"id":10014,"username":"user-14","sex":"男","city":"城市-14","sign":"签名-14","experience":873,"logins":116,"wealth":72549912,"classify":"词人","score":8},{"id":10015,"username":"user-15","sex":"女","city":"城市-15","sign":"签名-15","experience":1068,"logins":27,"wealth":52737025,"classify":"作家","score":28},{"id":10016,"username":"user-16","sex":"女","city":"城市-16","sign":"签名-16","experience":862,"logins":168,"wealth":37069775,"classify":"酱油","score":86},{"id":10017,"username":"user-17","sex":"女","city":"城市-17","sign":"签名-17","experience":1060,"logins":187,"wealth":66099525,"classify":"作家","score":69},{"id":10018,"username":"user-18","sex":"女","city":"城市-18","sign":"签名-18","experience":866,"logins":88,"wealth":81722326,"classify":"词人","score":74},{"id":10019,"username":"user-19","sex":"女","city":"城市-19","sign":"签名-19","experience":682,"logins":106,"wealth":68647362,"classify":"词人","score":51},{"id":10020,"username":"user-20","sex":"男","city":"城市-20","sign":"签名-20","experience":770,"logins":24,"wealth":92420248,"classify":"诗人","score":87},{"id":10021,"username":"user-21","sex":"男","city":"城市-21","sign":"签名-21","experience":184,"logins":131,"wealth":71566045,"classify":"词人","score":99},{"id":10022,"username":"user-22","sex":"男","city":"城市-22","sign":"签名-22","experience":739,"logins":152,"wealth":60907929,"classify":"作家","score":18},{"id":10023,"username":"user-23","sex":"女","city":"城市-23","sign":"签名-23","experience":127,"logins":82,"wealth":14765943,"classify":"作家","score":30},{"id":10024,"username":"user-24","sex":"女","city":"城市-24","sign":"签名-24","experience":212,"logins":133,"wealth":59011052,"classify":"词人","score":76},{"id":10025,"username":"user-25","sex":"女","city":"城市-25","sign":"签名-25","experience":938,"logins":182,"wealth":91183097,"classify":"作家","score":69},{"id":10026,"username":"user-26","sex":"男","city":"城市-26","sign":"签名-26","experience":978,"logins":7,"wealth":48008413,"classify":"作家","score":65},{"id":10027,"username":"user-27","sex":"女","city":"城市-27","sign":"签名-27","experience":371,"logins":44,"wealth":64419691,"classify":"诗人","score":60},{"id":10028,"username":"user-28","sex":"女","city":"城市-28","sign":"签名-28","experience":977,"logins":21,"wealth":75935022,"classify":"作家","score":37},{"id":10029,"username":"user-29","sex":"男","city":"城市-29","sign":"签名-29","experience":647,"logins":107,"wealth":97450636,"classify":"酱油","score":27}]} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/tree.json b/AdminSrc/AdminHost/wwwroot/admin/json/tree.json new file mode 100644 index 0000000..9cf2378 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/tree.json @@ -0,0 +1,5078 @@ +{ + "code": 0, + "count": 1000, + "data": [ + { + "id": 1, + "name": "User-1", + "type": 4, + "status": 2, + "score": 28, + "experience": 54981, + "sex": "ÄÐ", + "city": "Àö½­ÊÐ", + "description": "-", + "createTime": "2014-06-04 12:29:55", + "parentId": null, + "children": [ + { + "id": 2, + "name": "User-2", + "type": 2, + "status": 3, + "score": 75, + "experience": 43884, + "sex": "Ů", + "city": "´óÀí°××å×ÔÖÎÖÝ", + "description": "-", + "createTime": "1971-11-03 19:15:43", + "parentId": null, + "children": [ + { + "id": 3, + "name": "User-3", + "type": 2, + "status": 3, + "score": 72, + "experience": 75912, + "sex": "Ů", + "city": "μÄÏÊÐ", + "description": "-", + "createTime": "2022-01-17 01:48:02", + "parentId": null, + "children": [ + { + "id": 4, + "name": "User-4", + "type": 3, + "status": 3, + "score": 21, + "experience": 23198, + "sex": "ÄÐ", + "city": "º£Íâ", + "description": "-", + "createTime": "1986-11-06 23:56:45", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 5, + "name": "User-5", + "type": 3, + "status": 3, + "score": 89, + "experience": 25710, + "sex": "Ů", + "city": "ÑγÇÊÐ", + "description": "-", + "createTime": "2007-10-03 21:44:59", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 6, + "name": "User-6", + "type": 2, + "status": 4, + "score": 70, + "experience": 51144, + "sex": "ÄÐ", + "city": "ÒæÑôÊÐ", + "description": "-", + "createTime": "2017-02-21 00:26:02", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 7, + "name": "User-7", + "type": 5, + "status": 3, + "score": 24, + "experience": 64919, + "sex": "ÄÐ", + "city": "¹ó¸ÛÊÐ", + "description": "-", + "createTime": "1981-05-14 17:52:03", + "parentId": null, + "children": [ + { + "id": 8, + "name": "User-8", + "type": 6, + "status": 2, + "score": 2, + "experience": 80656, + "sex": "ÄÐ", + "city": "ËÞǨÊÐ", + "description": "-", + "createTime": "1984-05-24 20:44:26", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 9, + "name": "User-9", + "type": 6, + "status": 2, + "score": 58, + "experience": 2414, + "sex": "Ů", + "city": "ËÞÖÝÊÐ", + "description": "-", + "createTime": "2015-05-06 00:39:19", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 10, + "name": "User-10", + "type": 4, + "status": 2, + "score": 89, + "experience": 97592, + "sex": "Ů", + "city": "ÇÕÖÝÊÐ", + "description": "-", + "createTime": "1985-05-26 03:50:09", + "parentId": null, + "children": [ + { + "id": 11, + "name": "User-11", + "type": 2, + "status": 2, + "score": 85, + "experience": 37406, + "sex": "Ů", + "city": "»ÆÄϲØ×å×ÔÖÎÖÝ", + "description": "-", + "createTime": "2022-10-09 11:51:44", + "parentId": null, + "children": [ + { + "id": 12, + "name": "User-12", + "type": 4, + "status": 3, + "score": 40, + "experience": 13714, + "sex": "Ů", + "city": "ǭ¶«ÄÏÃç×嶱×å×ÔÖÎÖÝ", + "description": "-", + "createTime": "1991-09-01 09:19:11", + "parentId": null, + "children": [ + { + "id": 13, + "name": "User-13", + "type": 5, + "status": 4, + "score": 47, + "experience": 89189, + "sex": "ÄÐ", + "city": "½ð²ýÊÐ", + "description": "-", + "createTime": "1978-12-03 09:59:56", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 14, + "name": "User-14", + "type": 2, + "status": 3, + "score": 53, + "experience": 10739, + "sex": "Ů", + "city": "ÉϺ£ÊÐ", + "description": "-", + "createTime": "1989-03-31 19:08:12", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 15, + "name": "User-15", + "type": 5, + "status": 2, + "score": 76, + "experience": 40019, + "sex": "ÄÐ", + "city": "×ñÒåÊÐ", + "description": "-", + "createTime": "1996-12-12 16:34:05", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 16, + "name": "User-16", + "type": 3, + "status": 1, + "score": 81, + "experience": 30559, + "sex": "ÄÐ", + "city": "¿ª·âÊÐ", + "description": "-", + "createTime": "1979-09-24 03:53:59", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 17, + "name": "User-17", + "type": 6, + "status": 4, + "score": 16, + "experience": 56549, + "sex": "Ů", + "city": "Äþ²¨ÊÐ", + "description": "-", + "createTime": "1994-06-30 15:07:08", + "parentId": null, + "children": [ + { + "id": 18, + "name": "User-18", + "type": 2, + "status": 2, + "score": 22, + "experience": 31311, + "sex": "ÄÐ", + "city": "ǭ¶«ÄÏÃç×嶱×å×ÔÖÎÖÝ", + "description": "-", + "createTime": "1995-10-07 06:13:07", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 19, + "name": "User-19", + "type": 3, + "status": 1, + "score": 23, + "experience": 63334, + "sex": "Ů", + "city": "À뵺", + "description": "-", + "createTime": "2002-09-25 11:36:07", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 20, + "name": "User-20", + "type": 2, + "status": 2, + "score": 30, + "experience": 5650, + "sex": "ÄÐ", + "city": "Ðí²ýÊÐ", + "description": "-", + "createTime": "2001-08-08 14:25:42", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 21, + "name": "User-21", + "type": 2, + "status": 1, + "score": 74, + "experience": 71912, + "sex": "Ů", + "city": "º£±±²Ø×å×ÔÖÎÖÝ", + "description": "-", + "createTime": "2016-10-18 15:54:30", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 22, + "name": "User-22", + "type": 2, + "status": 3, + "score": 87, + "experience": 65197, + "sex": "Ů", + "city": "¶¨Î÷ÊÐ", + "description": "-", + "createTime": "1991-01-09 18:26:58", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 23, + "name": "User-23", + "type": 2, + "status": 4, + "score": 73, + "experience": 27868, + "sex": "ÄÐ", + "city": "Íþº£ÊÐ", + "description": "-", + "createTime": "1981-10-13 18:52:11", + "parentId": null, + "children": [ + { + "id": 24, + "name": "User-24", + "type": 4, + "status": 2, + "score": 99, + "experience": 69882, + "sex": "Ů", + "city": "ÖØÇìÊÐ", + "description": "-", + "createTime": "1990-09-26 19:08:20", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 25, + "name": "User-25", + "type": 3, + "status": 2, + "score": 82, + "experience": 25619, + "sex": "Ů", + "city": "°ÄÃŰ뵺", + "description": "-", + "createTime": "1991-02-16 04:19:14", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 26, + "name": "User-26", + "type": 4, + "status": 2, + "score": 2, + "experience": 8058, + "sex": "ÄÐ", + "city": "°¢ÀïµØÇø", + "description": "-", + "createTime": "2002-10-19 09:44:05", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 27, + "name": "User-27", + "type": 4, + "status": 4, + "score": 95, + "experience": 68763, + "sex": "ÄÐ", + "city": "Ìì½òÊÐ", + "description": "-", + "createTime": "2002-12-24 23:10:26", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 28, + "name": "User-28", + "type": 2, + "status": 4, + "score": 91, + "experience": 33513, + "sex": "Ů", + "city": "ÁÙÒÊÊÐ", + "description": "-", + "createTime": "2003-02-04 13:35:09", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 29, + "name": "User-29", + "type": 1, + "status": 1, + "score": 23, + "experience": 71620, + "sex": "ÄÐ", + "city": "À­ÈøÊÐ", + "description": "-", + "createTime": "2020-12-22 10:11:11", + "parentId": null, + "children": [ + { + "id": 30, + "name": "User-30", + "type": 3, + "status": 3, + "score": 13, + "experience": 32398, + "sex": "Ů", + "city": "ÎäÍþÊÐ", + "description": "-", + "createTime": "1982-10-26 11:27:06", + "parentId": null, + "children": [ + { + "id": 31, + "name": "User-31", + "type": 4, + "status": 1, + "score": 93, + "experience": 89245, + "sex": "ÄÐ", + "city": "³þÐÛÒÍ×å×ÔÖÎÖÝ", + "description": "-", + "createTime": "1979-10-05 12:28:39", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 32, + "name": "User-32", + "type": 6, + "status": 4, + "score": 31, + "experience": 73504, + "sex": "Ů", + "city": "ÉϺ£ÊÐ", + "description": "-", + "createTime": "1991-01-11 06:55:04", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 33, + "name": "User-33", + "type": 5, + "status": 4, + "score": 27, + "experience": 95824, + "sex": "Ů", + "city": "ӥ̶ÊÐ", + "description": "-", + "createTime": "2009-06-17 04:15:06", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 34, + "name": "User-34", + "type": 4, + "status": 1, + "score": 37, + "experience": 63563, + "sex": "ÄÐ", + "city": "ºìºӹþÄá×åÒÍ×å×ÔÖÎÖÝ", + "description": "-", + "createTime": "1979-01-12 13:19:02", + "parentId": null, + "children": [ + { + "id": 35, + "name": "User-35", + "type": 4, + "status": 2, + "score": 81, + "experience": 46868, + "sex": "ÄÐ", + "city": "µºê´ö×徰ÆÄ×å×ÔÖÎÖÝ", + "description": "-", + "createTime": "1981-10-24 01:48:43", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 36, + "name": "User-36", + "type": 2, + "status": 1, + "score": 92, + "experience": 70256, + "sex": "Ů", + "city": "ÏÃÃÅÊÐ", + "description": "-", + "createTime": "1998-05-23 22:54:20", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 37, + "name": "User-37", + "type": 6, + "status": 2, + "score": 25, + "experience": 24689, + "sex": "Ů", + "city": "ÌúÁëÊÐ", + "description": "-", + "createTime": "1980-05-03 04:42:32", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 38, + "name": "User-38", + "type": 4, + "status": 4, + "score": 83, + "experience": 96973, + "sex": "ÄÐ", + "city": "Î人ÊÐ", + "description": "-", + "createTime": "1979-11-04 03:18:53", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 39, + "name": "User-39", + "type": 4, + "status": 2, + "score": 37, + "experience": 23248, + "sex": "Ů", + "city": "ǭ¶«ÄÏÃç×嶱×å×ÔÖÎÖÝ", + "description": "-", + "createTime": "2017-03-03 14:54:05", + "parentId": null, + "children": [ + { + "id": 40, + "name": "User-40", + "type": 5, + "status": 3, + "score": 53, + "experience": 89498, + "sex": "Ů", + "city": "ͳ·¬µØÇø", + "description": "-", + "createTime": "2005-01-14 16:36:11", + "parentId": null, + "children": [ + { + "id": 41, + "name": "User-41", + "type": 4, + "status": 3, + "score": 13, + "experience": 47225, + "sex": "Ů", + "city": "ÖØÇìÊÐ", + "description": "-", + "createTime": "1994-07-14 23:17:37", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 42, + "name": "User-42", + "type": 2, + "status": 2, + "score": 54, + "experience": 67027, + "sex": "ÄÐ", + "city": "ÀöˮÊÐ", + "description": "-", + "createTime": "2019-04-06 23:40:35", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 43, + "name": "User-43", + "type": 2, + "status": 2, + "score": 59, + "experience": 16009, + "sex": "ÄÐ", + "city": "нç", + "description": "-", + "createTime": "1972-11-10 06:24:19", + "parentId": null, + "children": [ + { + "id": 44, + "name": "User-44", + "type": 6, + "status": 3, + "score": 26, + "experience": 48609, + "sex": "Ů", + "city": "¶«ݸÊÐ", + "description": "-", + "createTime": "1993-04-21 21:27:36", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 45, + "name": "User-45", + "type": 1, + "status": 2, + "score": 28, + "experience": 13681, + "sex": "Ů", + "city": "³£µÂÊÐ", + "description": "-", + "createTime": "2016-01-19 16:21:48", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 46, + "name": "User-46", + "type": 1, + "status": 2, + "score": 77, + "experience": 50932, + "sex": "ÄÐ", + "city": "Î人ÊÐ", + "description": "-", + "createTime": "1977-11-26 05:13:27", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 47, + "name": "User-47", + "type": 3, + "status": 1, + "score": 10, + "experience": 19599, + "sex": "ÄÐ", + "city": "³¤ÖÎÊÐ", + "description": "-", + "createTime": "1980-10-28 04:42:20", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 48, + "name": "User-48", + "type": 6, + "status": 3, + "score": 50, + "experience": 63403, + "sex": "ÄÐ", + "city": "Ïã¸۵º", + "description": "-", + "createTime": "1974-05-23 17:23:13", + "parentId": null, + "children": [ + { + "id": 49, + "name": "User-49", + "type": 2, + "status": 1, + "score": 7, + "experience": 21161, + "sex": "ÄÐ", + "city": "÷ÖÝÊÐ", + "description": "-", + "createTime": "1977-05-01 15:25:24", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 50, + "name": "User-50", + "type": 5, + "status": 2, + "score": 34, + "experience": 93741, + "sex": "ÄÐ", + "city": "¼¦Î÷ÊÐ", + "description": "-", + "createTime": "2018-04-14 23:13:38", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 51, + "name": "User-51", + "type": 2, + "status": 2, + "score": 92, + "experience": 36687, + "sex": "Ů", + "city": "ÎÂÖÝÊÐ", + "description": "-", + "createTime": "1993-06-04 04:00:14", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 52, + "name": "User-52", + "type": 6, + "status": 2, + "score": 14, + "experience": 47342, + "sex": "ÄÐ", + "city": "ÖØÇìÊÐ", + "description": "-", + "createTime": "1972-02-26 22:46:51", + "parentId": null, + "children": [ + { + "id": 53, + "name": "User-53", + "type": 1, + "status": 3, + "score": 97, + "experience": 40784, + "sex": "ÄÐ", + "city": "ÉÛÑôÊÐ", + "description": "-", + "createTime": "1976-12-27 01:00:37", + "parentId": null, + "children": [ + { + "id": 54, + "name": "User-54", + "type": 4, + "status": 3, + "score": 93, + "experience": 10865, + "sex": "ÄÐ", + "city": "ÁúÑÒÊÐ", + "description": "-", + "createTime": "2001-09-03 02:08:42", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 55, + "name": "User-55", + "type": 1, + "status": 2, + "score": 56, + "experience": 68232, + "sex": "ÄÐ", + "city": "¸ÓÖÝÊÐ", + "description": "-", + "createTime": "1995-12-13 08:29:10", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 56, + "name": "User-56", + "type": 1, + "status": 2, + "score": 46, + "experience": 68897, + "sex": "Ů", + "city": "¹þÃܵØÇø", + "description": "-", + "createTime": "2007-08-05 00:54:06", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 57, + "name": "User-57", + "type": 4, + "status": 3, + "score": 68, + "experience": 58983, + "sex": "Ů", + "city": "±±¾©ÊÐ", + "description": "-", + "createTime": "1979-03-14 13:21:33", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 58, + "name": "User-58", + "type": 5, + "status": 1, + "score": 6, + "experience": 17343, + "sex": "ÄÐ", + "city": "ÃçÀõÏØ", + "description": "-", + "createTime": "1996-01-21 18:43:11", + "parentId": null, + "children": [ + { + "id": 59, + "name": "User-59", + "type": 5, + "status": 2, + "score": 98, + "experience": 75262, + "sex": "Ů", + "city": "»³»¯ÊÐ", + "description": "-", + "createTime": "2022-06-28 12:25:50", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 60, + "name": "User-60", + "type": 3, + "status": 3, + "score": 3, + "experience": 5817, + "sex": "Ů", + "city": "ÈýÑÇÊÐ", + "description": "-", + "createTime": "1993-10-13 21:54:57", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 61, + "name": "User-61", + "type": 2, + "status": 3, + "score": 3, + "experience": 65548, + "sex": "ÄÐ", + "city": "̨ÖÝÊÐ", + "description": "-", + "createTime": "2017-11-06 13:16:14", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 62, + "name": "User-62", + "type": 5, + "status": 3, + "score": 37, + "experience": 33679, + "sex": "Ů", + "city": "ÁÉԴÊÐ", + "description": "-", + "createTime": "2002-10-19 22:53:23", + "parentId": null, + "children": [ + { + "id": 63, + "name": "User-63", + "type": 5, + "status": 3, + "score": 12, + "experience": 91033, + "sex": "Ů", + "city": "Òø´¨ÊÐ", + "description": "-", + "createTime": "1973-04-17 07:33:35", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 64, + "name": "User-64", + "type": 3, + "status": 2, + "score": 87, + "experience": 30560, + "sex": "ÄÐ", + "city": "²ý¶¼µØÇø", + "description": "-", + "createTime": "1992-06-13 23:04:16", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 65, + "name": "User-65", + "type": 5, + "status": 2, + "score": 27, + "experience": 17982, + "sex": "Ů", + "city": "ÉÌÂåÊÐ", + "description": "-", + "createTime": "2008-08-22 09:14:10", + "parentId": null, + "children": [ + { + "id": 66, + "name": "User-66", + "type": 3, + "status": 3, + "score": 91, + "experience": 47135, + "sex": "Ů", + "city": "À뵺", + "description": "-", + "createTime": "1971-01-27 18:29:48", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 67, + "name": "User-67", + "type": 2, + "status": 1, + "score": 19, + "experience": 31440, + "sex": "Ů", + "city": "ËæÖÝÊÐ", + "description": "-", + "createTime": "1979-10-14 10:30:22", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 68, + "name": "User-68", + "type": 5, + "status": 1, + "score": 88, + "experience": 48196, + "sex": "ÄÐ", + "city": "³еÂÊÐ", + "description": "-", + "createTime": "1996-02-07 03:52:51", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 69, + "name": "User-69", + "type": 5, + "status": 1, + "score": 46, + "experience": 45341, + "sex": "Ů", + "city": "ǭ¶«ÄÏÃç×嶱×å×ÔÖÎÖÝ", + "description": "-", + "createTime": "1995-05-08 20:53:45", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 70, + "name": "User-70", + "type": 3, + "status": 3, + "score": 19, + "experience": 66961, + "sex": "Ů", + "city": "¹ÌԭÊÐ", + "description": "-", + "createTime": "1992-04-11 09:13:05", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 71, + "name": "User-71", + "type": 1, + "status": 3, + "score": 4, + "experience": 95553, + "sex": "Ů", + "city": "ÄÇÇúµØÇø", + "description": "-", + "createTime": "2019-07-31 00:30:49", + "parentId": null, + "children": [ + { + "id": 72, + "name": "User-72", + "type": 4, + "status": 4, + "score": 89, + "experience": 27410, + "sex": "ÄÐ", + "city": "ºØÖÝÊÐ", + "description": "-", + "createTime": "1990-09-07 03:02:32", + "parentId": null, + "children": [ + { + "id": 73, + "name": "User-73", + "type": 6, + "status": 4, + "score": 93, + "experience": 84018, + "sex": "ÄÐ", + "city": "ÑŰ²ÊÐ", + "description": "-", + "createTime": "1972-01-18 02:00:25", + "parentId": null, + "children": [ + { + "id": 74, + "name": "User-74", + "type": 1, + "status": 4, + "score": 22, + "experience": 23025, + "sex": "Ů", + "city": "¼ÃÄÏÊÐ", + "description": "-", + "createTime": "1991-12-18 23:27:07", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 75, + "name": "User-75", + "type": 5, + "status": 2, + "score": 75, + "experience": 58006, + "sex": "ÄÐ", + "city": "нç", + "description": "-", + "createTime": "2004-03-03 09:28:00", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 76, + "name": "User-76", + "type": 2, + "status": 1, + "score": 79, + "experience": 86538, + "sex": "ÄÐ", + "city": "¹ûÂ岨×å×ÔÖÎÖÝ", + "description": "-", + "createTime": "2000-02-09 12:26:36", + "parentId": null, + "children": [ + { + "id": 77, + "name": "User-77", + "type": 2, + "status": 3, + "score": 60, + "experience": 61903, + "sex": "Ů", + "city": "ºôÂױ´¶ûÊÐ", + "description": "-", + "createTime": "1991-04-19 19:31:38", + "parentId": null, + "children": [ + { + "id": 78, + "name": "User-78", + "type": 4, + "status": 2, + "score": 67, + "experience": 10844, + "sex": "Ů", + "city": "°°ɽÊÐ", + "description": "-", + "createTime": "2017-03-26 15:43:27", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 79, + "name": "User-79", + "type": 4, + "status": 2, + "score": 46, + "experience": 25354, + "sex": "ÄÐ", + "city": "¼¦Î÷ÊÐ", + "description": "-", + "createTime": "2018-01-30 03:43:56", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 80, + "name": "User-80", + "type": 5, + "status": 3, + "score": 13, + "experience": 30626, + "sex": "Ů", + "city": "ÓñϪÊÐ", + "description": "-", + "createTime": "1984-03-18 11:35:15", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 81, + "name": "User-81", + "type": 4, + "status": 3, + "score": 34, + "experience": 97578, + "sex": "Ů", + "city": "ÐÅÑôÊÐ", + "description": "-", + "createTime": "2004-08-20 12:21:16", + "parentId": null, + "children": [ + { + "id": 82, + "name": "User-82", + "type": 6, + "status": 3, + "score": 38, + "experience": 7285, + "sex": "ÄÐ", + "city": "ÖÛɽÊÐ", + "description": "-", + "createTime": "2001-03-16 07:04:17", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 83, + "name": "User-83", + "type": 3, + "status": 1, + "score": 51, + "experience": 41380, + "sex": "Ů", + "city": "·ðɽÊÐ", + "description": "-", + "createTime": "1998-06-01 18:21:57", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 84, + "name": "User-84", + "type": 2, + "status": 3, + "score": 37, + "experience": 19153, + "sex": "Ů", + "city": "Ò˱öÊÐ", + "description": "-", + "createTime": "1985-10-30 09:16:58", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 85, + "name": "User-85", + "type": 1, + "status": 1, + "score": 94, + "experience": 63371, + "sex": "ÄÐ", + "city": "»´ÄÏÊÐ", + "description": "-", + "createTime": "2019-02-28 22:24:25", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 86, + "name": "User-86", + "type": 2, + "status": 4, + "score": 67, + "experience": 25315, + "sex": "ÄÐ", + "city": "ǭÎ÷Äϲ¼ÒÀ×åÃç×å×ÔÖÎÖÝ", + "description": "-", + "createTime": "2011-11-29 07:06:26", + "parentId": null, + "children": [ + { + "id": 87, + "name": "User-87", + "type": 4, + "status": 4, + "score": 52, + "experience": 10751, + "sex": "Ů", + "city": "À뵺", + "description": "-", + "createTime": "2022-08-05 23:21:27", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 88, + "name": "User-88", + "type": 4, + "status": 2, + "score": 65, + "experience": 38077, + "sex": "Ů", + "city": "»ÆʯÊÐ", + "description": "-", + "createTime": "2007-12-12 15:47:51", + "parentId": null, + "children": [ + { + "id": 89, + "name": "User-89", + "type": 6, + "status": 2, + "score": 78, + "experience": 78006, + "sex": "ÄÐ", + "city": "º£¿ÚÊÐ", + "description": "-", + "createTime": "2007-10-20 18:46:39", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 90, + "name": "User-90", + "type": 3, + "status": 3, + "score": 66, + "experience": 91901, + "sex": "Ů", + "city": "ÉϺ£ÊÐ", + "description": "-", + "createTime": "1993-08-25 20:32:32", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 91, + "name": "User-91", + "type": 3, + "status": 3, + "score": 61, + "experience": 26129, + "sex": "Ů", + "city": "°×ɽÊÐ", + "description": "-", + "createTime": "2002-01-04 16:12:16", + "parentId": null, + "children": [ + { + "id": 92, + "name": "User-92", + "type": 5, + "status": 3, + "score": 19, + "experience": 34580, + "sex": "ÄÐ", + "city": "ÇìÑôÊÐ", + "description": "-", + "createTime": "1987-02-28 01:36:59", + "parentId": null, + "children": [ + { + "id": 93, + "name": "User-93", + "type": 4, + "status": 4, + "score": 7, + "experience": 40805, + "sex": "Ů", + "city": "¹ãÖÝÊÐ", + "description": "-", + "createTime": "1986-02-23 02:19:01", + "parentId": null, + "children": [ + { + "id": 94, + "name": "User-94", + "type": 4, + "status": 2, + "score": 28, + "experience": 85777, + "sex": "ÄÐ", + "city": "²ý¼ª»Ø×å×ÔÖÎÖÝ", + "description": "-", + "createTime": "1987-02-21 18:49:17", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 95, + "name": "User-95", + "type": 3, + "status": 3, + "score": 33, + "experience": 50551, + "sex": "Ů", + "city": "ÈýÃ÷ÊÐ", + "description": "-", + "createTime": "2013-04-24 20:49:56", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 96, + "name": "User-96", + "type": 2, + "status": 2, + "score": 21, + "experience": 19915, + "sex": "Ů", + "city": "»ÆʯÊÐ", + "description": "-", + "createTime": "2017-05-09 12:17:42", + "parentId": null, + "children": [ + { + "id": 97, + "name": "User-97", + "type": 3, + "status": 3, + "score": 25, + "experience": 22618, + "sex": "Ů", + "city": "ÉÇβÊÐ", + "description": "-", + "createTime": "1977-03-13 12:50:50", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 98, + "name": "User-98", + "type": 6, + "status": 2, + "score": 14, + "experience": 43979, + "sex": "Ů", + "city": "ÎÂÖÝÊÐ", + "description": "-", + "createTime": "1991-04-10 20:49:11", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 99, + "name": "User-99", + "type": 3, + "status": 2, + "score": 82, + "experience": 24670, + "sex": "ÄÐ", + "city": "¹ó¸ÛÊÐ", + "description": "-", + "createTime": "2012-12-19 08:28:58", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 100, + "name": "User-100", + "type": 4, + "status": 3, + "score": 64, + "experience": 84287, + "sex": "Ů", + "city": "ÕżҽçÊÐ", + "description": "-", + "createTime": "2000-09-28 06:14:34", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 101, + "name": "User-101", + "type": 3, + "status": 4, + "score": 68, + "experience": 39312, + "sex": "ÄÐ", + "city": "ÓñÊ÷²Ø×å×ÔÖÎÖÝ", + "description": "-", + "createTime": "2020-09-20 05:35:35", + "parentId": null, + "children": [ + { + "id": 102, + "name": "User-102", + "type": 3, + "status": 1, + "score": 74, + "experience": 16276, + "sex": "Ů", + "city": "ÑӰ²ÊÐ", + "description": "-", + "createTime": "1980-10-04 17:59:56", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 103, + "name": "User-103", + "type": 5, + "status": 2, + "score": 91, + "experience": 67473, + "sex": "ÄÐ", + "city": "ÌÒ԰ÏØ", + "description": "-", + "createTime": "2007-01-04 07:46:21", + "parentId": null, + "children": [ + { + "id": 104, + "name": "User-104", + "type": 1, + "status": 3, + "score": 3, + "experience": 91897, + "sex": "ÄÐ", + "city": "Ӫ¿ÚÊÐ", + "description": "-", + "createTime": "2012-07-04 00:39:19", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 105, + "name": "User-105", + "type": 5, + "status": 2, + "score": 36, + "experience": 12972, + "sex": "ÄÐ", + "city": "µÂÖÝÊÐ", + "description": "-", + "createTime": "1993-06-04 03:52:48", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 106, + "name": "User-106", + "type": 2, + "status": 3, + "score": 60, + "experience": 58793, + "sex": "Ů", + "city": "¿ª·âÊÐ", + "description": "-", + "createTime": "2003-10-28 05:15:25", + "parentId": null, + "children": [ + { + "id": 107, + "name": "User-107", + "type": 6, + "status": 3, + "score": 70, + "experience": 88564, + "sex": "Ů", + "city": "´óÀí°××å×ÔÖÎÖÝ", + "description": "-", + "createTime": "1991-03-19 01:51:41", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 108, + "name": "User-108", + "type": 2, + "status": 2, + "score": 85, + "experience": 47918, + "sex": "ÄÐ", + "city": "½ðÃÅÏØ", + "description": "-", + "createTime": "2015-06-18 04:18:20", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 109, + "name": "User-109", + "type": 2, + "status": 2, + "score": 15, + "experience": 72530, + "sex": "Ů", + "city": "ÉϺ£ÊÐ", + "description": "-", + "createTime": "1997-10-10 20:26:03", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 110, + "name": "User-110", + "type": 2, + "status": 2, + "score": 83, + "experience": 26538, + "sex": "ÄÐ", + "city": "ÐÂÖñÊÐ", + "description": "-", + "createTime": "2007-07-26 23:09:20", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 111, + "name": "User-111", + "type": 4, + "status": 2, + "score": 43, + "experience": 42129, + "sex": "ÄÐ", + "city": "³à·åÊÐ", + "description": "-", + "createTime": "2015-12-17 09:23:18", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 112, + "name": "User-112", + "type": 4, + "status": 1, + "score": 74, + "experience": 61862, + "sex": "Ů", + "city": "Ϋ·»ÊÐ", + "description": "-", + "createTime": "2018-02-12 13:13:10", + "parentId": null, + "children": [ + { + "id": 113, + "name": "User-113", + "type": 1, + "status": 2, + "score": 65, + "experience": 52650, + "sex": "ÄÐ", + "city": "µºê´ö×徰ÆÄ×å×ÔÖÎÖÝ", + "description": "-", + "createTime": "2011-04-13 09:19:21", + "parentId": null, + "children": [ + { + "id": 114, + "name": "User-114", + "type": 3, + "status": 1, + "score": 82, + "experience": 53304, + "sex": "ÄÐ", + "city": "ÒæÑôÊÐ", + "description": "-", + "createTime": "2021-09-25 03:56:20", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 115, + "name": "User-115", + "type": 3, + "status": 3, + "score": 32, + "experience": 1231, + "sex": "ÄÐ", + "city": "¦µ×ÊÐ", + "description": "-", + "createTime": "1984-10-28 18:20:13", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 116, + "name": "User-116", + "type": 3, + "status": 3, + "score": 89, + "experience": 65939, + "sex": "Ů", + "city": "²ý¶¼µØÇø", + "description": "-", + "createTime": "1982-10-31 15:16:26", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 117, + "name": "User-117", + "type": 2, + "status": 4, + "score": 15, + "experience": 19416, + "sex": "Ů", + "city": "³¤ÖÎÊÐ", + "description": "-", + "createTime": "1990-04-09 13:29:32", + "parentId": null, + "children": [ + { + "id": 118, + "name": "User-118", + "type": 5, + "status": 2, + "score": 97, + "experience": 49212, + "sex": "Ů", + "city": "ÄÇÇúµØÇø", + "description": "-", + "createTime": "2018-12-15 15:50:57", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 119, + "name": "User-119", + "type": 2, + "status": 3, + "score": 82, + "experience": 19392, + "sex": "ÄÐ", + "city": "º£Íâ", + "description": "-", + "createTime": "2016-03-01 20:52:25", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 120, + "name": "User-120", + "type": 5, + "status": 4, + "score": 51, + "experience": 78906, + "sex": "Ů", + "city": "¾ÅÁú", + "description": "-", + "createTime": "1970-01-23 05:58:55", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 121, + "name": "User-121", + "type": 1, + "status": 2, + "score": 62, + "experience": 67953, + "sex": "Ů", + "city": "ÖÐɽÊÐ", + "description": "-", + "createTime": "1980-03-31 19:15:07", + "parentId": null, + "children": [ + { + "id": 122, + "name": "User-122", + "type": 3, + "status": 2, + "score": 42, + "experience": 75027, + "sex": "ÄÐ", + "city": "Ïã¸۵º", + "description": "-", + "createTime": "1991-11-08 11:29:20", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 123, + "name": "User-123", + "type": 4, + "status": 1, + "score": 27, + "experience": 50832, + "sex": "ÄÐ", + "city": "ĵµ¤½­ÊÐ", + "description": "-", + "createTime": "1987-10-23 04:08:04", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 124, + "name": "User-124", + "type": 4, + "status": 3, + "score": 20, + "experience": 43261, + "sex": "ÄÐ", + "city": "²×ÖÝÊÐ", + "description": "-", + "createTime": "2008-06-13 20:20:22", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 125, + "name": "User-125", + "type": 5, + "status": 2, + "score": 61, + "experience": 50399, + "sex": "Ů", + "city": "ɽÄϵØÇø", + "description": "-", + "createTime": "2015-12-14 21:59:46", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 126, + "name": "User-126", + "type": 5, + "status": 2, + "score": 88, + "experience": 26933, + "sex": "Ů", + "city": "ÑïÖÝÊÐ", + "description": "-", + "createTime": "1971-07-16 11:58:22", + "parentId": null, + "children": [ + { + "id": 127, + "name": "User-127", + "type": 1, + "status": 3, + "score": 86, + "experience": 15913, + "sex": "Ů", + "city": "Äþ²¨ÊÐ", + "description": "-", + "createTime": "1979-06-01 23:52:36", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 128, + "name": "User-128", + "type": 5, + "status": 2, + "score": 61, + "experience": 74072, + "sex": "ÄÐ", + "city": "ÎÚÀ¼²첼ÊÐ", + "description": "-", + "createTime": "1997-09-24 16:31:03", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 129, + "name": "User-129", + "type": 1, + "status": 3, + "score": 39, + "experience": 94200, + "sex": "ÄÐ", + "city": "Ïã¸۵º", + "description": "-", + "createTime": "1990-04-22 15:12:45", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 130, + "name": "User-130", + "type": 3, + "status": 3, + "score": 78, + "experience": 59502, + "sex": "ÄÐ", + "city": "Ìì½òÊÐ", + "description": "-", + "createTime": "2011-01-03 07:20:25", + "parentId": null, + "children": [ + { + "id": 131, + "name": "User-131", + "type": 2, + "status": 3, + "score": 29, + "experience": 16545, + "sex": "ÄÐ", + "city": "µÂÑôÊÐ", + "description": "-", + "createTime": "2001-05-07 05:02:42", + "parentId": null, + "children": [ + { + "id": 132, + "name": "User-132", + "type": 3, + "status": 3, + "score": 53, + "experience": 8310, + "sex": "ÄÐ", + "city": "ÏåÑôÊÐ", + "description": "-", + "createTime": "1996-05-12 11:23:20", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 133, + "name": "User-133", + "type": 2, + "status": 3, + "score": 6, + "experience": 10610, + "sex": "ÄÐ", + "city": "º£¿ÚÊÐ", + "description": "-", + "createTime": "2013-05-11 17:50:19", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 134, + "name": "User-134", + "type": 4, + "status": 2, + "score": 67, + "experience": 70882, + "sex": "ÄÐ", + "city": "×ñÒåÊÐ", + "description": "-", + "createTime": "2014-03-04 22:55:14", + "parentId": null, + "children": [ + { + "id": 135, + "name": "User-135", + "type": 4, + "status": 3, + "score": 34, + "experience": 87799, + "sex": "Ů", + "city": "ÃçÀõÏØ", + "description": "-", + "createTime": "1990-04-13 14:44:06", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 136, + "name": "User-136", + "type": 6, + "status": 1, + "score": 66, + "experience": 58817, + "sex": "ÄÐ", + "city": "´óÁ¬ÊÐ", + "description": "-", + "createTime": "1990-04-28 21:04:33", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 137, + "name": "User-137", + "type": 6, + "status": 2, + "score": 74, + "experience": 95991, + "sex": "ÄÐ", + "city": "ÄÇÇúµØÇø", + "description": "-", + "createTime": "1994-06-04 16:01:44", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 138, + "name": "User-138", + "type": 1, + "status": 2, + "score": 99, + "experience": 71832, + "sex": "ÄÐ", + "city": "°¢ÀïµØÇø", + "description": "-", + "createTime": "1988-03-10 13:17:59", + "parentId": null, + "children": [ + { + "id": 139, + "name": "User-139", + "type": 6, + "status": 4, + "score": 36, + "experience": 86381, + "sex": "Ů", + "city": "ºÊÔóÊÐ", + "description": "-", + "createTime": "2021-04-22 22:27:06", + "parentId": null, + "children": [ + { + "id": 140, + "name": "User-140", + "type": 6, + "status": 3, + "score": 36, + "experience": 43655, + "sex": "Ů", + "city": "ͨÁÉÊÐ", + "description": "-", + "createTime": "2001-12-20 09:14:52", + "parentId": null, + "children": [ + { + "id": 141, + "name": "User-141", + "type": 3, + "status": 2, + "score": 10, + "experience": 65976, + "sex": "Ů", + "city": "ÑŰ²ÊÐ", + "description": "-", + "createTime": "1996-08-28 19:08:53", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 142, + "name": "User-142", + "type": 6, + "status": 4, + "score": 89, + "experience": 9828, + "sex": "ÄÐ", + "city": "°×ɽÊÐ", + "description": "-", + "createTime": "1985-09-21 14:58:12", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 143, + "name": "User-143", + "type": 6, + "status": 2, + "score": 1, + "experience": 84064, + "sex": "Ů", + "city": "ÖØÇìÊÐ", + "description": "-", + "createTime": "1973-11-04 08:28:54", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 144, + "name": "User-144", + "type": 5, + "status": 2, + "score": 46, + "experience": 51038, + "sex": "Ů", + "city": "ÄϲýÊÐ", + "description": "-", + "createTime": "2010-01-27 02:05:48", + "parentId": null, + "children": [ + { + "id": 145, + "name": "User-145", + "type": 1, + "status": 3, + "score": 82, + "experience": 53656, + "sex": "Ů", + "city": "ÓñÁÖÊÐ", + "description": "-", + "createTime": "1996-05-21 10:13:12", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 146, + "name": "User-146", + "type": 6, + "status": 4, + "score": 24, + "experience": 10700, + "sex": "ÄÐ", + "city": "³à·åÊÐ", + "description": "-", + "createTime": "1998-03-08 12:08:46", + "parentId": null, + "children": [ + { + "id": 147, + "name": "User-147", + "type": 3, + "status": 1, + "score": 94, + "experience": 85060, + "sex": "Ů", + "city": "×Թ±ÊÐ", + "description": "-", + "createTime": "2002-07-29 08:02:19", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 148, + "name": "User-148", + "type": 5, + "status": 2, + "score": 93, + "experience": 24255, + "sex": "ÄÐ", + "city": "ÑγÇÊÐ", + "description": "-", + "createTime": "2020-02-01 14:30:19", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 149, + "name": "User-149", + "type": 2, + "status": 4, + "score": 18, + "experience": 78062, + "sex": "Ů", + "city": "Äڽ­ÊÐ", + "description": "-", + "createTime": "2003-02-26 08:59:31", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 150, + "name": "User-150", + "type": 4, + "status": 2, + "score": 13, + "experience": 48858, + "sex": "Ů", + "city": "ÉϺ£ÊÐ", + "description": "-", + "createTime": "1985-05-14 18:47:46", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 151, + "name": "User-151", + "type": 2, + "status": 3, + "score": 36, + "experience": 12807, + "sex": "ÄÐ", + "city": "ÖÛɽÊÐ", + "description": "-", + "createTime": "2004-12-04 23:49:41", + "parentId": null, + "children": [ + { + "id": 152, + "name": "User-152", + "type": 2, + "status": 1, + "score": 60, + "experience": 38168, + "sex": "Ů", + "city": "¿¦ʲµØÇø", + "description": "-", + "createTime": "1985-09-17 01:12:06", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 153, + "name": "User-153", + "type": 6, + "status": 1, + "score": 77, + "experience": 74590, + "sex": "ÄÐ", + "city": "Ìì½òÊÐ", + "description": "-", + "createTime": "1970-02-02 10:02:55", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 154, + "name": "User-154", + "type": 5, + "status": 2, + "score": 92, + "experience": 76944, + "sex": "Ů", + "city": "Áٲ×ÊÐ", + "description": "-", + "createTime": "2013-12-06 17:42:05", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 155, + "name": "User-155", + "type": 3, + "status": 2, + "score": 29, + "experience": 78692, + "sex": "ÄÐ", + "city": "ÇػʵºÊÐ", + "description": "-", + "createTime": "2016-07-16 14:25:28", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 156, + "name": "User-156", + "type": 4, + "status": 2, + "score": 79, + "experience": 99919, + "sex": "Ů", + "city": "Á¹ɽÒÍ×å×ÔÖÎÖÝ", + "description": "-", + "createTime": "2010-07-15 10:21:19", + "parentId": null, + "children": [ + { + "id": 157, + "name": "User-157", + "type": 5, + "status": 3, + "score": 91, + "experience": 52354, + "sex": "ÄÐ", + "city": "ͭÈÊÊÐ", + "description": "-", + "createTime": "1977-03-20 09:15:54", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 158, + "name": "User-158", + "type": 5, + "status": 2, + "score": 22, + "experience": 51977, + "sex": "Ů", + "city": "ËÞÖÝÊÐ", + "description": "-", + "createTime": "2016-11-17 20:01:17", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 159, + "name": "User-159", + "type": 1, + "status": 2, + "score": 43, + "experience": 46650, + "sex": "Ů", + "city": "²×ÖÝÊÐ", + "description": "-", + "createTime": "1987-09-05 06:14:08", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 160, + "name": "User-160", + "type": 6, + "status": 2, + "score": 57, + "experience": 7416, + "sex": "ÄÐ", + "city": "ÅìºþÏØ", + "description": "-", + "createTime": "1974-08-10 20:09:38", + "parentId": null, + "children": [ + { + "id": 161, + "name": "User-161", + "type": 5, + "status": 1, + "score": 53, + "experience": 12421, + "sex": "ÄÐ", + "city": "°¢¿ËËյØÇø", + "description": "-", + "createTime": "1998-02-07 11:52:05", + "parentId": null, + "children": [ + { + "id": 162, + "name": "User-162", + "type": 3, + "status": 2, + "score": 100, + "experience": 19507, + "sex": "Ů", + "city": "ËæÖÝÊÐ", + "description": "-", + "createTime": "2014-01-31 07:58:18", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 163, + "name": "User-163", + "type": 2, + "status": 2, + "score": 12, + "experience": 35637, + "sex": "ÄÐ", + "city": "À­ÈøÊÐ", + "description": "-", + "createTime": "1983-10-02 10:31:23", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 164, + "name": "User-164", + "type": 6, + "status": 3, + "score": 65, + "experience": 42198, + "sex": "ÄÐ", + "city": "Ïã¸۵º", + "description": "-", + "createTime": "1987-12-22 14:34:32", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 165, + "name": "User-165", + "type": 2, + "status": 2, + "score": 73, + "experience": 40495, + "sex": "Ů", + "city": "Ìì½òÊÐ", + "description": "-", + "createTime": "1992-11-29 08:54:58", + "parentId": null, + "children": [ + { + "id": 166, + "name": "User-166", + "type": 3, + "status": 3, + "score": 83, + "experience": 62007, + "sex": "ÄÐ", + "city": "ÖØÇìÊÐ", + "description": "-", + "createTime": "1992-10-01 19:14:47", + "parentId": null, + "children": [ + { + "id": 167, + "name": "User-167", + "type": 5, + "status": 4, + "score": 75, + "experience": 18137, + "sex": "Ů", + "city": "°²˳ÊÐ", + "description": "-", + "createTime": "2011-10-10 19:40:42", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 168, + "name": "User-168", + "type": 4, + "status": 3, + "score": 80, + "experience": 95421, + "sex": "ÄÐ", + "city": "ÎâÖÒÊÐ", + "description": "-", + "createTime": "1972-10-27 14:58:59", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 169, + "name": "User-169", + "type": 6, + "status": 3, + "score": 10, + "experience": 2784, + "sex": "ÄÐ", + "city": "ÒÁ´ºÊÐ", + "description": "-", + "createTime": "1992-07-06 23:16:42", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 170, + "name": "User-170", + "type": 5, + "status": 3, + "score": 68, + "experience": 54101, + "sex": "ÄÐ", + "city": "ºØÖÝÊÐ", + "description": "-", + "createTime": "1970-01-21 21:50:15", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 171, + "name": "User-171", + "type": 5, + "status": 3, + "score": 38, + "experience": 51261, + "sex": "ÄÐ", + "city": "ÉϺ£ÊÐ", + "description": "-", + "createTime": "1982-11-14 19:25:51", + "parentId": null, + "children": [ + { + "id": 172, + "name": "User-172", + "type": 3, + "status": 2, + "score": 4, + "experience": 73963, + "sex": "ÄÐ", + "city": "ÐìÖÝÊÐ", + "description": "-", + "createTime": "1993-04-15 02:08:57", + "parentId": null, + "children": [ + { + "id": 173, + "name": "User-173", + "type": 3, + "status": 1, + "score": 51, + "experience": 68723, + "sex": "Ů", + "city": "ÇൺÊÐ", + "description": "-", + "createTime": "2015-10-21 10:53:20", + "parentId": null, + "children": [ + { + "id": 174, + "name": "User-174", + "type": 3, + "status": 3, + "score": 68, + "experience": 62848, + "sex": "Ů", + "city": "ÖܿÚÊÐ", + "description": "-", + "createTime": "2015-12-19 01:15:13", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 175, + "name": "User-175", + "type": 2, + "status": 3, + "score": 87, + "experience": 30871, + "sex": "Ů", + "city": "ÉÇͷÊÐ", + "description": "-", + "createTime": "1982-12-29 02:15:08", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 176, + "name": "User-176", + "type": 6, + "status": 2, + "score": 7, + "experience": 80089, + "sex": "ÄÐ", + "city": "¼ªÁÖÊÐ", + "description": "-", + "createTime": "2003-02-25 18:41:27", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 177, + "name": "User-177", + "type": 5, + "status": 4, + "score": 11, + "experience": 21782, + "sex": "Ů", + "city": "ÎÚÀ¼²첼ÊÐ", + "description": "-", + "createTime": "2014-10-10 20:45:07", + "parentId": null, + "children": [ + { + "id": 178, + "name": "User-178", + "type": 2, + "status": 2, + "score": 85, + "experience": 87330, + "sex": "Ů", + "city": "ÈýÑÇÊÐ", + "description": "-", + "createTime": "1990-12-25 14:48:30", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 179, + "name": "User-179", + "type": 1, + "status": 1, + "score": 28, + "experience": 58951, + "sex": "ÄÐ", + "city": "Ìì½òÊÐ", + "description": "-", + "createTime": "2007-09-14 00:42:03", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 180, + "name": "User-180", + "type": 5, + "status": 3, + "score": 74, + "experience": 83136, + "sex": "ÄÐ", + "city": "¸§ÖÝÊÐ", + "description": "-", + "createTime": "1990-08-17 16:49:05", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 181, + "name": "User-181", + "type": 1, + "status": 1, + "score": 37, + "experience": 40840, + "sex": "Ů", + "city": "ÈýÑÇÊÐ", + "description": "-", + "createTime": "2000-05-12 08:01:46", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 182, + "name": "User-182", + "type": 1, + "status": 3, + "score": 40, + "experience": 86857, + "sex": "Ů", + "city": "ÈýÑÇÊÐ", + "description": "-", + "createTime": "1981-03-30 01:02:44", + "parentId": null, + "children": [ + { + "id": 183, + "name": "User-183", + "type": 3, + "status": 1, + "score": 26, + "experience": 50377, + "sex": "ÄÐ", + "city": "³ç×óÊÐ", + "description": "-", + "createTime": "1998-03-18 08:42:14", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 184, + "name": "User-184", + "type": 5, + "status": 3, + "score": 25, + "experience": 54099, + "sex": "Ů", + "city": "º£¿ÚÊÐ", + "description": "-", + "createTime": "1980-01-26 12:11:04", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 185, + "name": "User-185", + "type": 6, + "status": 3, + "score": 87, + "experience": 80569, + "sex": "Ů", + "city": "Ô˳ÇÊÐ", + "description": "-", + "createTime": "2006-06-17 02:03:31", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 186, + "name": "User-186", + "type": 6, + "status": 3, + "score": 36, + "experience": 98204, + "sex": "ÄÐ", + "city": "±ϽÚÊÐ", + "description": "-", + "createTime": "1973-12-17 13:58:14", + "parentId": null, + "children": [ + { + "id": 187, + "name": "User-187", + "type": 2, + "status": 2, + "score": 50, + "experience": 6656, + "sex": "Ů", + "city": "³£µÂÊÐ", + "description": "-", + "createTime": "1977-05-19 04:12:32", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 188, + "name": "User-188", + "type": 5, + "status": 2, + "score": 51, + "experience": 70421, + "sex": "ÄÐ", + "city": "ÑŰ²ÊÐ", + "description": "-", + "createTime": "1992-05-19 11:41:49", + "parentId": null, + "children": [ + { + "id": 189, + "name": "User-189", + "type": 3, + "status": 3, + "score": 86, + "experience": 10970, + "sex": "Ů", + "city": "¤ÄÏÊÐ", + "description": "-", + "createTime": "1986-07-20 03:40:31", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 190, + "name": "User-190", + "type": 6, + "status": 2, + "score": 81, + "experience": 35296, + "sex": "ÄÐ", + "city": "ÖØÇìÊÐ", + "description": "-", + "createTime": "1994-08-03 11:42:24", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 191, + "name": "User-191", + "type": 2, + "status": 3, + "score": 36, + "experience": 60289, + "sex": "Ů", + "city": "±õÖÝÊÐ", + "description": "-", + "createTime": "1981-11-09 18:18:23", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 192, + "name": "User-192", + "type": 1, + "status": 3, + "score": 80, + "experience": 84656, + "sex": "Ů", + "city": "¹ûÂ岨×å×ÔÖÎÖÝ", + "description": "-", + "createTime": "1986-02-13 13:31:38", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 193, + "name": "User-193", + "type": 5, + "status": 2, + "score": 1, + "experience": 14433, + "sex": "ÄÐ", + "city": "ÁٷÚÊÐ", + "description": "-", + "createTime": "2006-03-03 20:42:43", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 194, + "name": "User-194", + "type": 3, + "status": 4, + "score": 53, + "experience": 22962, + "sex": "Ů", + "city": "¸ÓÖÝÊÐ", + "description": "-", + "createTime": "2003-09-23 05:57:47", + "parentId": null, + "children": [ + { + "id": 195, + "name": "User-195", + "type": 3, + "status": 4, + "score": 78, + "experience": 80409, + "sex": "ÄÐ", + "city": "½ú³ÇÊÐ", + "description": "-", + "createTime": "2022-04-16 13:45:56", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 196, + "name": "User-196", + "type": 3, + "status": 2, + "score": 83, + "experience": 35535, + "sex": "Ů", + "city": "ÇìÑôÊÐ", + "description": "-", + "createTime": "2012-12-04 08:46:54", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 197, + "name": "User-197", + "type": 3, + "status": 2, + "score": 77, + "experience": 83542, + "sex": "Ů", + "city": "½õÖÝÊÐ", + "description": "-", + "createTime": "2000-04-28 15:35:04", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 198, + "name": "User-198", + "type": 3, + "status": 4, + "score": 83, + "experience": 62489, + "sex": "Ů", + "city": "ÎÂÖÝÊÐ", + "description": "-", + "createTime": "1989-12-11 18:50:29", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 199, + "name": "User-199", + "type": 2, + "status": 3, + "score": 81, + "experience": 74602, + "sex": "ÄÐ", + "city": "×Թ±ÊÐ", + "description": "-", + "createTime": "1996-10-30 22:16:31", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 200, + "name": "User-200", + "type": 6, + "status": 2, + "score": 31, + "experience": 28502, + "sex": "ÄÐ", + "city": "ÒËÀ¼ÏØ", + "description": "-", + "createTime": "1991-03-29 10:56:11", + "parentId": null, + "children": [ + { + "id": 201, + "name": "User-201", + "type": 5, + "status": 3, + "score": 23, + "experience": 45619, + "sex": "ÄÐ", + "city": "ÉÌÂåÊÐ", + "description": "-", + "createTime": "1997-11-04 08:13:06", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 202, + "name": "User-202", + "type": 5, + "status": 3, + "score": 7, + "experience": 7566, + "sex": "Ů", + "city": "ËæÖÝÊÐ", + "description": "-", + "createTime": "1981-08-19 01:15:48", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 203, + "name": "User-203", + "type": 1, + "status": 3, + "score": 63, + "experience": 94626, + "sex": "ÄÐ", + "city": "Î÷ÄþÊÐ", + "description": "-", + "createTime": "1986-04-30 06:19:17", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 204, + "name": "User-204", + "type": 3, + "status": 3, + "score": 33, + "experience": 85619, + "sex": "Ů", + "city": "¹þÃܵØÇø", + "description": "-", + "createTime": "1977-09-15 16:53:05", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 205, + "name": "User-205", + "type": 3, + "status": 2, + "score": 95, + "experience": 66286, + "sex": "ÄÐ", + "city": "°²¿µÊÐ", + "description": "-", + "createTime": "1994-09-09 20:34:24", + "parentId": null, + "children": [ + { + "id": 206, + "name": "User-206", + "type": 5, + "status": 3, + "score": 48, + "experience": 93916, + "sex": "ÄÐ", + "city": "ÅÊ֦»¨ÊÐ", + "description": "-", + "createTime": "1996-05-16 00:14:46", + "parentId": null, + "children": [ + { + "id": 207, + "name": "User-207", + "type": 5, + "status": 3, + "score": 97, + "experience": 37124, + "sex": "Ů", + "city": "ºôÂױ´¶ûÊÐ", + "description": "-", + "createTime": "2009-06-18 14:55:19", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 208, + "name": "User-208", + "type": 2, + "status": 3, + "score": 77, + "experience": 37342, + "sex": "Ů", + "city": "¾ÅÁú", + "description": "-", + "createTime": "2007-07-30 00:07:45", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 209, + "name": "User-209", + "type": 4, + "status": 1, + "score": 77, + "experience": 82846, + "sex": "ÄÐ", + "city": "ÑïÖÝÊÐ", + "description": "-", + "createTime": "1984-05-17 17:37:13", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 210, + "name": "User-210", + "type": 3, + "status": 1, + "score": 5, + "experience": 32873, + "sex": "Ů", + "city": "º£Íâ", + "description": "-", + "createTime": "1971-05-24 11:38:48", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 211, + "name": "User-211", + "type": 5, + "status": 2, + "score": 74, + "experience": 85519, + "sex": "ÄÐ", + "city": "ÇػʵºÊÐ", + "description": "-", + "createTime": "1970-01-17 07:29:46", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 212, + "name": "User-212", + "type": 4, + "status": 1, + "score": 33, + "experience": 80395, + "sex": "ÄÐ", + "city": "°×ɽÊÐ", + "description": "-", + "createTime": "2005-01-01 03:15:22", + "parentId": null, + "children": [ + { + "id": 213, + "name": "User-213", + "type": 4, + "status": 2, + "score": 55, + "experience": 17077, + "sex": "Ů", + "city": "±ϽÚÊÐ", + "description": "-", + "createTime": "2020-01-13 21:32:59", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 214, + "name": "User-214", + "type": 3, + "status": 2, + "score": 38, + "experience": 57625, + "sex": "Ů", + "city": "º£¿ÚÊÐ", + "description": "-", + "createTime": "2006-09-06 16:58:42", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 215, + "name": "User-215", + "type": 6, + "status": 2, + "score": 99, + "experience": 64592, + "sex": "Ů", + "city": "¹ûÂ岨×å×ÔÖÎÖÝ", + "description": "-", + "createTime": "1987-07-29 17:20:38", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 216, + "name": "User-216", + "type": 5, + "status": 2, + "score": 44, + "experience": 69081, + "sex": "ÄÐ", + "city": "Ìì½òÊÐ", + "description": "-", + "createTime": "1978-08-01 12:58:10", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 217, + "name": "User-217", + "type": 4, + "status": 2, + "score": 57, + "experience": 58398, + "sex": "ÄÐ", + "city": "µ¤¶«ÊÐ", + "description": "-", + "createTime": "1997-07-14 13:37:19", + "parentId": null, + "children": [ + { + "id": 218, + "name": "User-218", + "type": 3, + "status": 2, + "score": 11, + "experience": 65346, + "sex": "ÄÐ", + "city": "°ÙɫÊÐ", + "description": "-", + "createTime": "1977-12-01 15:05:38", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 219, + "name": "User-219", + "type": 3, + "status": 2, + "score": 49, + "experience": 62808, + "sex": "Ů", + "city": "ÌÒ԰ÏØ", + "description": "-", + "createTime": "1987-03-29 01:00:57", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 220, + "name": "User-220", + "type": 5, + "status": 2, + "score": 49, + "experience": 57282, + "sex": "Ů", + "city": "ÆնýÊÐ", + "description": "-", + "createTime": "2017-09-27 13:21:02", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 221, + "name": "User-221", + "type": 4, + "status": 2, + "score": 10, + "experience": 3034, + "sex": "ÄÐ", + "city": "ÈýɳÊÐ", + "description": "-", + "createTime": "1974-11-04 11:57:29", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 222, + "name": "User-222", + "type": 2, + "status": 4, + "score": 93, + "experience": 12235, + "sex": "ÄÐ", + "city": "º£ÄϲØ×å×ÔÖÎÖÝ", + "description": "-", + "createTime": "1975-11-26 14:47:08", + "parentId": null, + "children": [ + { + "id": 223, + "name": "User-223", + "type": 1, + "status": 3, + "score": 61, + "experience": 49467, + "sex": "ÄÐ", + "city": "°ÄÃŰ뵺", + "description": "-", + "createTime": "2023-04-09 00:28:41", + "parentId": null, + "children": [ + { + "id": 224, + "name": "User-224", + "type": 6, + "status": 3, + "score": 26, + "experience": 65118, + "sex": "Ů", + "city": "ÅÊ֦»¨ÊÐ", + "description": "-", + "createTime": "2013-03-04 09:08:30", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 225, + "name": "User-225", + "type": 4, + "status": 1, + "score": 38, + "experience": 86342, + "sex": "ÄÐ", + "city": "ÁÙÏĻØ×å×ÔÖÎÖÝ", + "description": "-", + "createTime": "1992-06-15 02:13:04", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 226, + "name": "User-226", + "type": 3, + "status": 2, + "score": 3, + "experience": 32179, + "sex": "Ů", + "city": "¾ÅÁú", + "description": "-", + "createTime": "2009-03-13 06:48:47", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 227, + "name": "User-227", + "type": 1, + "status": 3, + "score": 96, + "experience": 38847, + "sex": "ÄÐ", + "city": "÷ÖÝÊÐ", + "description": "-", + "createTime": "2020-04-16 09:43:04", + "parentId": null, + "children": [ + { + "id": 228, + "name": "User-228", + "type": 4, + "status": 4, + "score": 33, + "experience": 93101, + "sex": "Ů", + "city": "°ÄÃŰ뵺", + "description": "-", + "createTime": "1995-04-06 14:46:40", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 229, + "name": "User-229", + "type": 3, + "status": 1, + "score": 5, + "experience": 12628, + "sex": "ÄÐ", + "city": "²©¶ûËþÀ­ÃɹÅ×ÔÖÎÖÝ", + "description": "-", + "createTime": "2000-08-07 19:23:07", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 230, + "name": "User-230", + "type": 3, + "status": 3, + "score": 67, + "experience": 7013, + "sex": "Ů", + "city": "³¤ÖÎÊÐ", + "description": "-", + "createTime": "2002-12-14 10:11:11", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 231, + "name": "User-231", + "type": 4, + "status": 2, + "score": 37, + "experience": 61813, + "sex": "Ů", + "city": "²©¶ûËþÀ­ÃɹÅ×ÔÖÎÖÝ", + "description": "-", + "createTime": "1970-06-27 23:24:44", + "parentId": null, + "children": [ + { + "id": 232, + "name": "User-232", + "type": 5, + "status": 2, + "score": 43, + "experience": 20578, + "sex": "ÄÐ", + "city": "¹ó¸ÛÊÐ", + "description": "-", + "createTime": "1976-02-18 15:40:16", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 233, + "name": "User-233", + "type": 1, + "status": 2, + "score": 4, + "experience": 19621, + "sex": "Ů", + "city": "°ÄÃŰ뵺", + "description": "-", + "createTime": "2020-02-28 08:36:12", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 234, + "name": "User-234", + "type": 5, + "status": 2, + "score": 57, + "experience": 15400, + "sex": "ÄÐ", + "city": "º£¶«ÊÐ", + "description": "-", + "createTime": "1976-11-22 23:04:12", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 235, + "name": "User-235", + "type": 4, + "status": 4, + "score": 18, + "experience": 36190, + "sex": "ÄÐ", + "city": "º£±±²Ø×å×ÔÖÎÖÝ", + "description": "-", + "createTime": "1978-01-30 19:43:36", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 236, + "name": "User-236", + "type": 5, + "status": 4, + "score": 69, + "experience": 51254, + "sex": "Ů", + "city": "±±¾©ÊÐ", + "description": "-", + "createTime": "2014-02-15 04:54:05", + "parentId": null, + "children": [ + { + "id": 237, + "name": "User-237", + "type": 2, + "status": 2, + "score": 99, + "experience": 34620, + "sex": "Ů", + "city": "ºӳØÊÐ", + "description": "-", + "createTime": "2011-02-22 01:43:24", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 238, + "name": "User-238", + "type": 5, + "status": 3, + "score": 94, + "experience": 56612, + "sex": "Ů", + "city": "°¢À­ÉÆÃË", + "description": "-", + "createTime": "1996-04-13 12:44:00", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 239, + "name": "User-239", + "type": 2, + "status": 4, + "score": 27, + "experience": 1648, + "sex": "Ů", + "city": "³¤ɳÊÐ", + "description": "-", + "createTime": "1989-06-01 07:38:48", + "parentId": null, + "children": [ + { + "id": 240, + "name": "User-240", + "type": 4, + "status": 2, + "score": 35, + "experience": 97895, + "sex": "ÄÐ", + "city": "ÉϺ£ÊÐ", + "description": "-", + "createTime": "2002-04-19 15:07:58", + "parentId": null, + "children": [ + { + "id": 241, + "name": "User-241", + "type": 3, + "status": 1, + "score": 15, + "experience": 48229, + "sex": "Ů", + "city": "Àȷ»ÊÐ", + "description": "-", + "createTime": "1997-04-12 20:09:02", + "parentId": null, + "children": [ + { + "id": 242, + "name": "User-242", + "type": 4, + "status": 4, + "score": 3, + "experience": 95377, + "sex": "Ů", + "city": "ºױÚÊÐ", + "description": "-", + "createTime": "1994-10-20 05:40:00", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 243, + "name": "User-243", + "type": 4, + "status": 1, + "score": 5, + "experience": 52728, + "sex": "ÄÐ", + "city": "ȪÖÝÊÐ", + "description": "-", + "createTime": "2014-07-16 01:39:38", + "parentId": null, + "children": [ + { + "id": 244, + "name": "User-244", + "type": 5, + "status": 4, + "score": 80, + "experience": 51006, + "sex": "Ů", + "city": "À뵺", + "description": "-", + "createTime": "1998-04-08 03:47:48", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 245, + "name": "User-245", + "type": 2, + "status": 4, + "score": 88, + "experience": 19853, + "sex": "ÄÐ", + "city": "ËÄƽÊÐ", + "description": "-", + "createTime": "1998-08-15 16:27:36", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 246, + "name": "User-246", + "type": 6, + "status": 4, + "score": 52, + "experience": 63371, + "sex": "Ů", + "city": "ÕØÇìÊÐ", + "description": "-", + "createTime": "2010-12-14 06:37:33", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 247, + "name": "User-247", + "type": 4, + "status": 2, + "score": 40, + "experience": 65183, + "sex": "ÄÐ", + "city": "Ϋ·»ÊÐ", + "description": "-", + "createTime": "1975-07-09 23:34:16", + "parentId": null, + "children": [ + { + "id": 248, + "name": "User-248", + "type": 1, + "status": 3, + "score": 65, + "experience": 19079, + "sex": "ÄÐ", + "city": "Ò˱öÊÐ", + "description": "-", + "createTime": "2013-03-01 13:33:15", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 249, + "name": "User-249", + "type": 6, + "status": 2, + "score": 80, + "experience": 37432, + "sex": "ÄÐ", + "city": "ÁٷÚÊÐ", + "description": "-", + "createTime": "2003-02-04 13:42:18", + "parentId": null, + "children": [ + { + "id": 250, + "name": "User-250", + "type": 3, + "status": 3, + "score": 76, + "experience": 91326, + "sex": "Ů", + "city": "̫ԭÊÐ", + "description": "-", + "createTime": "1997-03-04 20:12:43", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 251, + "name": "User-251", + "type": 1, + "status": 1, + "score": 29, + "experience": 93151, + "sex": "Ů", + "city": "Ӫ¿ÚÊÐ", + "description": "-", + "createTime": "1972-08-25 03:17:26", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 252, + "name": "User-252", + "type": 2, + "status": 2, + "score": 93, + "experience": 1882, + "sex": "Ů", + "city": "º£Íâ", + "description": "-", + "createTime": "2021-08-31 04:19:35", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 253, + "name": "User-253", + "type": 2, + "status": 4, + "score": 14, + "experience": 97501, + "sex": "Ů", + "city": "ËÄƽÊÐ", + "description": "-", + "createTime": "1991-03-16 04:18:45", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 254, + "name": "User-254", + "type": 3, + "status": 2, + "score": 43, + "experience": 77813, + "sex": "Ů", + "city": "ÄÇÇúµØÇø", + "description": "-", + "createTime": "2015-12-11 17:36:46", + "parentId": null, + "children": [ + { + "id": 255, + "name": "User-255", + "type": 4, + "status": 3, + "score": 7, + "experience": 88376, + "sex": "ÄÐ", + "city": "¹óÑôÊÐ", + "description": "-", + "createTime": "1991-12-09 10:31:04", + "parentId": null, + "children": [ + { + "id": 256, + "name": "User-256", + "type": 5, + "status": 3, + "score": 24, + "experience": 66923, + "sex": "ÄÐ", + "city": "º£¶«ÊÐ", + "description": "-", + "createTime": "2007-10-09 21:30:27", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 257, + "name": "User-257", + "type": 1, + "status": 2, + "score": 56, + "experience": 16966, + "sex": "Ů", + "city": "°ÄÃŰ뵺", + "description": "-", + "createTime": "1971-08-07 14:04:06", + "parentId": null, + "children": [ + { + "id": 258, + "name": "User-258", + "type": 3, + "status": 3, + "score": 43, + "experience": 68317, + "sex": "ÄÐ", + "city": "º¼ÖÝÊÐ", + "description": "-", + "createTime": "2000-06-23 23:43:22", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 259, + "name": "User-259", + "type": 3, + "status": 2, + "score": 19, + "experience": 65900, + "sex": "ÄÐ", + "city": "º¼ÖÝÊÐ", + "description": "-", + "createTime": "1972-11-02 03:14:29", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 260, + "name": "User-260", + "type": 2, + "status": 2, + "score": 33, + "experience": 26268, + "sex": "Ů", + "city": "°üͷÊÐ", + "description": "-", + "createTime": "1997-09-19 07:05:41", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 261, + "name": "User-261", + "type": 5, + "status": 1, + "score": 38, + "experience": 60653, + "sex": "Ů", + "city": "ÖÛɽÊÐ", + "description": "-", + "createTime": "1993-02-09 22:11:03", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 262, + "name": "User-262", + "type": 1, + "status": 2, + "score": 14, + "experience": 22944, + "sex": "ÄÐ", + "city": "ËÄƽÊÐ", + "description": "-", + "createTime": "1979-09-12 21:59:09", + "parentId": null, + "children": [ + { + "id": 263, + "name": "User-263", + "type": 2, + "status": 2, + "score": 95, + "experience": 42730, + "sex": "ÄÐ", + "city": "ÏÌÄþÊÐ", + "description": "-", + "createTime": "1971-07-06 13:35:24", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 264, + "name": "User-264", + "type": 3, + "status": 2, + "score": 8, + "experience": 81923, + "sex": "Ů", + "city": "ͭÁêÊÐ", + "description": "-", + "createTime": "2017-10-06 07:55:26", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 265, + "name": "User-265", + "type": 5, + "status": 2, + "score": 45, + "experience": 34796, + "sex": "ÄÐ", + "city": "¼ªÁÖÊÐ", + "description": "-", + "createTime": "1978-04-13 03:09:01", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 266, + "name": "User-266", + "type": 1, + "status": 2, + "score": 33, + "experience": 36888, + "sex": "Ů", + "city": "ÉÛÑôÊÐ", + "description": "-", + "createTime": "1986-08-10 22:38:19", + "parentId": null, + "children": [ + { + "id": 267, + "name": "User-267", + "type": 4, + "status": 3, + "score": 68, + "experience": 86617, + "sex": "Ů", + "city": "ÈÕÕÕÊÐ", + "description": "-", + "createTime": "1988-09-20 23:59:03", + "parentId": null, + "children": [ + { + "id": 268, + "name": "User-268", + "type": 5, + "status": 2, + "score": 87, + "experience": 38669, + "sex": "ÄÐ", + "city": "½õÖÝÊÐ", + "description": "-", + "createTime": "2003-01-29 15:05:06", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 269, + "name": "User-269", + "type": 2, + "status": 4, + "score": 94, + "experience": 55962, + "sex": "Ů", + "city": "ÏÌÑôÊÐ", + "description": "-", + "createTime": "1999-05-31 06:27:39", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 270, + "name": "User-270", + "type": 4, + "status": 1, + "score": 67, + "experience": 37707, + "sex": "ÄÐ", + "city": "ÎâÖÒÊÐ", + "description": "-", + "createTime": "1984-02-08 15:38:35", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 271, + "name": "User-271", + "type": 4, + "status": 2, + "score": 24, + "experience": 42013, + "sex": "Ů", + "city": "±¦¼¦ÊÐ", + "description": "-", + "createTime": "2013-10-19 09:10:48", + "parentId": null, + "children": [ + { + "id": 272, + "name": "User-272", + "type": 5, + "status": 4, + "score": 7, + "experience": 86631, + "sex": "ÄÐ", + "city": "»ÆʯÊÐ", + "description": "-", + "createTime": "1983-02-15 19:44:19", + "parentId": null, + "children": [ + { + "id": 273, + "name": "User-273", + "type": 5, + "status": 1, + "score": 5, + "experience": 90121, + "sex": "Ů", + "city": "»´°²ÊÐ", + "description": "-", + "createTime": "1986-05-10 21:35:11", + "parentId": null, + "children": [ + { + "id": 274, + "name": "User-274", + "type": 1, + "status": 3, + "score": 97, + "experience": 74832, + "sex": "ÄÐ", + "city": "ËÄƽÊÐ", + "description": "-", + "createTime": "1996-08-04 00:38:03", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 275, + "name": "User-275", + "type": 2, + "status": 2, + "score": 42, + "experience": 45129, + "sex": "ÄÐ", + "city": "²ý¶¼µØÇø", + "description": "-", + "createTime": "1983-01-14 21:58:01", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 276, + "name": "User-276", + "type": 4, + "status": 3, + "score": 2, + "experience": 40565, + "sex": "Ů", + "city": "ÆնýÊÐ", + "description": "-", + "createTime": "1998-03-28 19:05:33", + "parentId": null, + "children": [ + { + "id": 277, + "name": "User-277", + "type": 2, + "status": 1, + "score": 6, + "experience": 27426, + "sex": "ÄÐ", + "city": "°²˳ÊÐ", + "description": "-", + "createTime": "2023-01-17 10:34:05", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 278, + "name": "User-278", + "type": 4, + "status": 2, + "score": 36, + "experience": 22014, + "sex": "ÄÐ", + "city": "ÓÜÁÖÊÐ", + "description": "-", + "createTime": "1993-01-12 09:41:01", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 279, + "name": "User-279", + "type": 4, + "status": 1, + "score": 43, + "experience": 35756, + "sex": "Ů", + "city": "Ìì½òÊÐ", + "description": "-", + "createTime": "2002-03-20 11:28:25", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 280, + "name": "User-280", + "type": 2, + "status": 3, + "score": 94, + "experience": 59280, + "sex": "Ů", + "city": "ËÉԭÊÐ", + "description": "-", + "createTime": "2008-09-28 10:43:16", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 281, + "name": "User-281", + "type": 5, + "status": 3, + "score": 77, + "experience": 83642, + "sex": "ÄÐ", + "city": "ÉÇͷÊÐ", + "description": "-", + "createTime": "2016-07-11 13:48:25", + "parentId": null, + "children": [ + { + "id": 282, + "name": "User-282", + "type": 2, + "status": 3, + "score": 16, + "experience": 75399, + "sex": "ÄÐ", + "city": "ÄÏƽÊÐ", + "description": "-", + "createTime": "2020-04-11 16:46:07", + "parentId": null, + "children": [ + { + "id": 283, + "name": "User-283", + "type": 2, + "status": 2, + "score": 53, + "experience": 57226, + "sex": "ÄÐ", + "city": "±±¾©ÊÐ", + "description": "-", + "createTime": "1995-03-17 00:42:50", + "parentId": null, + "children": [ + { + "id": 284, + "name": "User-284", + "type": 3, + "status": 2, + "score": 19, + "experience": 84763, + "sex": "ÄÐ", + "city": "°ÄÃŰ뵺", + "description": "-", + "createTime": "2017-08-15 18:16:29", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 285, + "name": "User-285", + "type": 3, + "status": 3, + "score": 39, + "experience": 67178, + "sex": "Ů", + "city": "ÄϲýÊÐ", + "description": "-", + "createTime": "1992-07-26 05:30:51", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 286, + "name": "User-286", + "type": 2, + "status": 1, + "score": 90, + "experience": 92236, + "sex": "Ů", + "city": "ïÃûÊÐ", + "description": "-", + "createTime": "1987-09-26 10:59:31", + "parentId": null, + "children": [ + { + "id": 287, + "name": "User-287", + "type": 1, + "status": 1, + "score": 53, + "experience": 52079, + "sex": "ÄÐ", + "city": "¹ÌԭÊÐ", + "description": "-", + "createTime": "1995-01-10 00:22:30", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 288, + "name": "User-288", + "type": 2, + "status": 3, + "score": 65, + "experience": 87314, + "sex": "ÄÐ", + "city": "À뵺", + "description": "-", + "createTime": "1985-10-29 13:49:20", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 289, + "name": "User-289", + "type": 5, + "status": 1, + "score": 25, + "experience": 97910, + "sex": "ÄÐ", + "city": "À뵺", + "description": "-", + "createTime": "2007-04-29 01:09:20", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 290, + "name": "User-290", + "type": 4, + "status": 2, + "score": 41, + "experience": 19698, + "sex": "ÄÐ", + "city": "б±ÊÐ", + "description": "-", + "createTime": "2009-03-16 07:50:46", + "parentId": null, + "children": [ + { + "id": 291, + "name": "User-291", + "type": 6, + "status": 2, + "score": 14, + "experience": 60523, + "sex": "ÄÐ", + "city": "À­ÈøÊÐ", + "description": "-", + "createTime": "2018-06-11 05:19:27", + "parentId": null, + "children": [ + { + "id": 292, + "name": "User-292", + "type": 5, + "status": 1, + "score": 14, + "experience": 87381, + "sex": "ÄÐ", + "city": "פÂíµêÊÐ", + "description": "-", + "createTime": "2002-03-09 18:35:26", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 293, + "name": "User-293", + "type": 3, + "status": 3, + "score": 12, + "experience": 59971, + "sex": "ÄÐ", + "city": "ÖØÇìÊÐ", + "description": "-", + "createTime": "2012-08-30 00:01:37", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 294, + "name": "User-294", + "type": 5, + "status": 1, + "score": 71, + "experience": 74009, + "sex": "ÄÐ", + "city": "ºӳØÊÐ", + "description": "-", + "createTime": "2012-03-24 15:15:00", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 295, + "name": "User-295", + "type": 3, + "status": 1, + "score": 6, + "experience": 87494, + "sex": "ÄÐ", + "city": "ÓÀÖÝÊÐ", + "description": "-", + "createTime": "1988-07-31 14:42:20", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 296, + "name": "User-296", + "type": 4, + "status": 3, + "score": 88, + "experience": 78667, + "sex": "Ů", + "city": "¾ÅÁú", + "description": "-", + "createTime": "2007-06-11 13:02:07", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 297, + "name": "User-297", + "type": 3, + "status": 2, + "score": 17, + "experience": 11516, + "sex": "Ů", + "city": "³»ÖÝÊÐ", + "description": "-", + "createTime": "1983-11-27 13:30:47", + "parentId": null, + "children": [ + { + "id": 298, + "name": "User-298", + "type": 5, + "status": 3, + "score": 97, + "experience": 44819, + "sex": "ÄÐ", + "city": "ÉϺ£ÊÐ", + "description": "-", + "createTime": "1988-07-02 10:53:42", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 299, + "name": "User-299", + "type": 2, + "status": 4, + "score": 88, + "experience": 53431, + "sex": "ÄÐ", + "city": "Ïã¸۵º", + "description": "-", + "createTime": "2022-12-23 15:25:05", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 300, + "name": "User-300", + "type": 5, + "status": 3, + "score": 69, + "experience": 24017, + "sex": "Ů", + "city": "ÖØÇìÊÐ", + "description": "-", + "createTime": "2003-12-12 04:04:15", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 301, + "name": "User-301", + "type": 6, + "status": 3, + "score": 72, + "experience": 73262, + "sex": "ÄÐ", + "city": "±±¾©ÊÐ", + "description": "-", + "createTime": "1985-11-06 02:27:38", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 302, + "name": "User-302", + "type": 5, + "status": 3, + "score": 32, + "experience": 21824, + "sex": "Ů", + "city": "Òø´¨ÊÐ", + "description": "-", + "createTime": "2012-09-12 05:57:24", + "parentId": null, + "children": [ + { + "id": 303, + "name": "User-303", + "type": 3, + "status": 4, + "score": 8, + "experience": 68289, + "sex": "Ů", + "city": "Õò½­ÊÐ", + "description": "-", + "createTime": "2010-11-13 05:13:14", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 304, + "name": "User-304", + "type": 4, + "status": 3, + "score": 81, + "experience": 76781, + "sex": "ÄÐ", + "city": "±£ɽÊÐ", + "description": "-", + "createTime": "1975-08-13 20:37:37", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 305, + "name": "User-305", + "type": 2, + "status": 2, + "score": 39, + "experience": 17590, + "sex": "Ů", + "city": "´óÀí°××å×ÔÖÎÖÝ", + "description": "-", + "createTime": "1974-06-07 22:14:59", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 306, + "name": "User-306", + "type": 4, + "status": 4, + "score": 39, + "experience": 72010, + "sex": "Ů", + "city": "ÎýÁֹùÀÕÃË", + "description": "-", + "createTime": "1984-05-30 20:38:58", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 307, + "name": "User-307", + "type": 5, + "status": 4, + "score": 52, + "experience": 56848, + "sex": "Ů", + "city": "°¢ÀïµØÇø", + "description": "-", + "createTime": "1970-01-10 06:41:10", + "parentId": null, + "children": [ + { + "id": 308, + "name": "User-308", + "type": 4, + "status": 2, + "score": 45, + "experience": 48753, + "sex": "Ů", + "city": "ÖØÇìÊÐ", + "description": "-", + "createTime": "1973-06-22 14:59:33", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 309, + "name": "User-309", + "type": 2, + "status": 4, + "score": 45, + "experience": 3713, + "sex": "ÄÐ", + "city": "³»ÖÝÊÐ", + "description": "-", + "createTime": "1997-01-21 13:06:44", + "parentId": null, + "children": [ + { + "id": 310, + "name": "User-310", + "type": 2, + "status": 2, + "score": 33, + "experience": 80153, + "sex": "ÄÐ", + "city": "ÉϺ£ÊÐ", + "description": "-", + "createTime": "1982-05-27 16:55:13", + "parentId": null, + "children": [ + { + "id": 311, + "name": "User-311", + "type": 1, + "status": 3, + "score": 67, + "experience": 92653, + "sex": "ÄÐ", + "city": "Îں£ÊÐ", + "description": "-", + "createTime": "2012-12-19 19:14:46", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 312, + "name": "User-312", + "type": 5, + "status": 2, + "score": 40, + "experience": 99153, + "sex": "Ů", + "city": "°ÍÖÐÊÐ", + "description": "-", + "createTime": "1978-06-08 02:16:05", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 313, + "name": "User-313", + "type": 2, + "status": 1, + "score": 7, + "experience": 66644, + "sex": "Ů", + "city": "¹óÑôÊÐ", + "description": "-", + "createTime": "1993-12-13 16:21:03", + "parentId": null, + "children": [ + { + "id": 314, + "name": "User-314", + "type": 6, + "status": 1, + "score": 48, + "experience": 69828, + "sex": "ÄÐ", + "city": "ÖØÇìÊÐ", + "description": "-", + "createTime": "1977-09-05 20:19:37", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + }, + { + "id": 315, + "name": "User-315", + "type": 5, + "status": 2, + "score": 30, + "experience": 82185, + "sex": "Ů", + "city": "°²¿µÊÐ", + "description": "-", + "createTime": "2014-10-31 23:50:51", + "parentId": null, + "children": [ + { + "id": 316, + "name": "User-316", + "type": 1, + "status": 4, + "score": 45, + "experience": 4589, + "sex": "Ů", + "city": "ͭÈÊÊÐ", + "description": "-", + "createTime": "2005-09-08 14:35:12", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 317, + "name": "User-317", + "type": 4, + "status": 2, + "score": 48, + "experience": 55422, + "sex": "Ů", + "city": "ËÞÖÝÊÐ", + "description": "-", + "createTime": "1992-12-31 05:06:18", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 318, + "name": "User-318", + "type": 5, + "status": 1, + "score": 80, + "experience": 3519, + "sex": "ÄÐ", + "city": "¸·ÑôÊÐ", + "description": "-", + "createTime": "1998-11-01 22:11:08", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 319, + "name": "User-319", + "type": 4, + "status": 2, + "score": 64, + "experience": 10387, + "sex": "Ů", + "city": "нç", + "description": "-", + "createTime": "1995-02-23 03:01:51", + "parentId": null, + "children": [ + { + "id": 320, + "name": "User-320", + "type": 5, + "status": 2, + "score": 92, + "experience": 63866, + "sex": "Ů", + "city": "ÐÂÓàÊÐ", + "description": "-", + "createTime": "2006-09-13 05:20:48", + "parentId": null, + "children": [ + { + "id": 321, + "name": "User-321", + "type": 6, + "status": 2, + "score": 36, + "experience": 32018, + "sex": "ÄÐ", + "city": "¼ÎÐËÊÐ", + "description": "-", + "createTime": "2012-12-23 12:41:04", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 322, + "name": "User-322", + "type": 5, + "status": 3, + "score": 58, + "experience": 86419, + "sex": "Ů", + "city": "ÖêÖÞÊÐ", + "description": "-", + "createTime": "2010-01-31 03:49:51", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 323, + "name": "User-323", + "type": 1, + "status": 4, + "score": 84, + "experience": 76545, + "sex": "Ů", + "city": "º£±±²Ø×å×ÔÖÎÖÝ", + "description": "-", + "createTime": "2020-06-28 07:50:36", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 324, + "name": "User-324", + "type": 4, + "status": 2, + "score": 51, + "experience": 28561, + "sex": "ÄÐ", + "city": "ÈýɳÊÐ", + "description": "-", + "createTime": "2021-01-02 13:13:22", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + } + ], + "isParent": true + }, + { + "id": 325, + "name": "User-325", + "type": 3, + "status": 3, + "score": 62, + "experience": 94793, + "sex": "Ů", + "city": "¼ÎÓø¹ØÊÐ", + "description": "-", + "createTime": "1990-02-26 16:03:01", + "parentId": null, + "children": [ + { + "id": 326, + "name": "User-326", + "type": 4, + "status": 4, + "score": 70, + "experience": 19861, + "sex": "ÄÐ", + "city": "¼Ñľ˹ÊÐ", + "description": "-", + "createTime": "1971-09-13 13:37:06", + "parentId": null, + "children": [ + { + "id": 327, + "name": "User-327", + "type": 1, + "status": 2, + "score": 10, + "experience": 1866, + "sex": "Ů", + "city": "ÖØÇìÊÐ", + "description": "-", + "createTime": "1991-08-01 14:53:52", + "parentId": null, + "children": [ + { + "id": 328, + "name": "User-328", + "type": 6, + "status": 3, + "score": 97, + "experience": 81309, + "sex": "Ů", + "city": "ÖØÇìÊÐ", + "description": "-", + "createTime": "1973-06-11 16:06:26", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 329, + "name": "User-329", + "type": 5, + "status": 3, + "score": 36, + "experience": 2334, + "sex": "Ů", + "city": "нç", + "description": "-", + "createTime": "1989-01-06 11:00:47", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 330, + "name": "User-330", + "type": 4, + "status": 2, + "score": 75, + "experience": 19904, + "sex": "Ů", + "city": "˷ÖÝÊÐ", + "description": "-", + "createTime": "2003-06-01 14:59:33", + "parentId": null, + "children": [], + "isParent": false + }, + { + "id": 331, + "name": "User-331", + "type": 6, + "status": 4, + "score": 98, + "experience": 30101, + "sex": "Ů", + "city": "°²¿µÊÐ", + "description": "-", + "createTime": "2003-05-14 13:25:56", + "parentId": null, + "children": [], + "isParent": false + } + ], + "isParent": true + } + ], + "isParent": true + } + ], + "isParent": true + } + ] +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/upload/demo.js b/AdminSrc/AdminHost/wwwroot/admin/json/upload/demo.js new file mode 100644 index 0000000..77674fe --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/upload/demo.js @@ -0,0 +1,7 @@ +{ + "code": 0, + "msg": "", + "data": { + "src": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg" + } +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/user/forget.js b/AdminSrc/AdminHost/wwwroot/admin/json/user/forget.js new file mode 100644 index 0000000..836bba4 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/user/forget.js @@ -0,0 +1,7 @@ +{ + "code": 0 + ,"msg": "注册成功" + ,"data": { + + } +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/user/login.js b/AdminSrc/AdminHost/wwwroot/admin/json/user/login.js new file mode 100644 index 0000000..ff906d5 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/user/login.js @@ -0,0 +1,7 @@ +{ + "code": 0 + ,"msg": "登入成功" + ,"data": { + "access_token": "c262e61cd13ad99fc650e6908c7e5e65b63d2f32185ecfed6b801ee3fbdd5c0a" + } +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/user/logout.js b/AdminSrc/AdminHost/wwwroot/admin/json/user/logout.js new file mode 100644 index 0000000..9fd1ff2 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/user/logout.js @@ -0,0 +1,5 @@ +{ + "code": 0 + ,"msg": "退出成功" + ,"data": null +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/user/reg.js b/AdminSrc/AdminHost/wwwroot/admin/json/user/reg.js new file mode 100644 index 0000000..836bba4 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/user/reg.js @@ -0,0 +1,7 @@ +{ + "code": 0 + ,"msg": "注册成功" + ,"data": { + + } +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/user/resetpass.js b/AdminSrc/AdminHost/wwwroot/admin/json/user/resetpass.js new file mode 100644 index 0000000..836bba4 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/user/resetpass.js @@ -0,0 +1,7 @@ +{ + "code": 0 + ,"msg": "注册成功" + ,"data": { + + } +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/user/session.js b/AdminSrc/AdminHost/wwwroot/admin/json/user/session.js new file mode 100644 index 0000000..54ce1ef --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/user/session.js @@ -0,0 +1,9 @@ +{ + "code": 0 + ,"msg": "" + ,"data": { + "username": "贤心" + ,"sex": "男" + ,"role": 1 + } +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/user/sms.js b/AdminSrc/AdminHost/wwwroot/admin/json/user/sms.js new file mode 100644 index 0000000..836bba4 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/user/sms.js @@ -0,0 +1,7 @@ +{ + "code": 0 + ,"msg": "注册成功" + ,"data": { + + } +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/useradmin/mangadmin.js b/AdminSrc/AdminHost/wwwroot/admin/json/useradmin/mangadmin.js new file mode 100644 index 0000000..fa2e636 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/useradmin/mangadmin.js @@ -0,0 +1,78 @@ +{ + "code": 0 + ,"msg": "" + ,"count": "100" + ,"data": [{ + "id": "1001" + ,"loginname": "admin" + ,"telphone": "11111111111" + ,"email": "111@qq.com" + ,"role": "超级管理员" + ,"jointime": "20150217" + ,"audit": true + },{ + "id": "1002" + ,"loginname": "common-1" + ,"telphone": "22222222222" + ,"email": "222@qq.com" + ,"role": "管理员" + ,"jointime": "20160217" + ,"audit": false + },{ + "id": "1003" + ,"loginname": "common-2" + ,"telphone": "33333333333" + ,"email": "333@qq.com" + ,"role": "管理员" + ,"jointime": "20161012" + ,"audit": false + },{ + "id": "1004" + ,"loginname": "common-3" + ,"telphone": "44444444444" + ,"email": "444@qq.com" + ,"role": "管理员" + ,"jointime": "20170518" + ,"audit": true + },{ + "id": "1005" + ,"loginname": "common-4" + ,"telphone": "55555555555" + ,"email": "555@qq.com" + ,"role": "管理员" + ,"jointime": "20180101" + ,"audit": false + },{ + "id": "1006" + ,"loginname": "common-5" + ,"telphone": "66666666666" + ,"email": "666@qq.com" + ,"role": "管理员" + ,"jointime": "20160217" + ,"audit": false + },{ + "id": "1007" + ,"loginname": "common-6" + ,"telphone": "77777777777" + ,"email": "777@qq.com" + ,"role": "管理员" + ,"jointime": "20161012" + ,"audit": false + },{ + "id": "1008" + ,"loginname": "common-7" + ,"telphone": "88888888888" + ,"email": "888@qq.com" + ,"role": "管理员" + ,"jointime": "20170518" + ,"audit": true + },{ + "id": "1009" + ,"loginname": "common-8" + ,"telphone": "99999999999" + ,"email": "999@qq.com" + ,"role": "管理员" + ,"jointime": "20180101" + ,"audit": false + }] +} diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/useradmin/webuser.js b/AdminSrc/AdminHost/wwwroot/admin/json/useradmin/webuser.js new file mode 100644 index 0000000..02a7b41 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/useradmin/webuser.js @@ -0,0 +1,143 @@ +{ + "code": 0 + ,"msg": "" + ,"count": "100" + ,"data": [{ + "id": "001" + ,"username": "用户-1" + ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg" + ,"phone": 12345678901 + ,"email": "11111@qq.com" + ,"sex": "男" + ,"ip": "1111111" + ,"jointime": 20171204 + },{ + "id": "002" + ,"username": "用户-2" + ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg" + ,"phone": 12345678901 + ,"email": "11111@qq.com" + ,"sex": "男" + ,"ip": "1111111" + ,"jointime": 20171204 + },{ + "id": "003" + ,"username": "用户-3" + ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg" + ,"phone": 12345678901 + ,"email": "11111@qq.com" + ,"sex": "女" + ,"ip": "1111111" + ,"jointime": 20171011 + ,"LAY_CHECKED": true + },{ + "id": "004" + ,"username": "用户-4" + ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg" + ,"phone": 12345678901 + ,"email": "11111@qq.com" + ,"sex": "男" + ,"ip": "1111111" + ,"jointime": 20160505 + },{ + "id": "005" + ,"username": "用户-5" + ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg" + ,"phone": 12345678901 + ,"email": "11111@qq.com" + ,"sex": "男" + ,"ip": "1111111" + ,"jointime": 20171204 + },{ + "id": "006" + ,"username": "用户-6" + ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg" + ,"phone": 12345678901 + ,"email": "11111@qq.com" + ,"sex": "男" + ,"ip": "1111111" + ,"jointime": 20171204 + },{ + "id": "007" + ,"username": "用户-7" + ,"avatar": "https://wx3.sinaimg.cn/mw690/5db11ff4gy1fmx4keca8ag208g06iglw.gif" + ,"phone": 12345678901 + ,"email": "11111@qq.com" + ,"sex": "男" + ,"ip": "1111111" + ,"jointime": 20180210 + },{ + "id": "008" + ,"username": "用户-8" + ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg" + ,"phone": 12345678901 + ,"email": "11111@qq.com" + ,"sex": "女" + ,"ip": "1111111" + ,"jointime": 20171204 + },{ + "id": "009" + ,"username": "用户-9" + ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg" + ,"phone": 12345678901 + ,"email": "11111@qq.com" + ,"sex": "女" + ,"ip": "1111111" + ,"jointime": 20171204 + },{ + "id": "010" + ,"username": "用户-10" + ,"avatar": "https://wx4.sinaimg.cn/mw1024/5db11ff4gy1fmx4keaw9pj20dw08caa4.jpg" + ,"phone": 12345678901 + ,"email": "11111@qq.com" + ,"sex": "男" + ,"ip": "1111111" + ,"jointime": 20170719 + },{ + "id": "011" + ,"username": "用户-11" + ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg" + ,"phone": 12345678901 + ,"email": "11111@qq.com" + ,"sex": "男" + ,"ip": "1111111" + ,"jointime": 20171204 + },{ + "id": "012" + ,"username": "用户-12" + ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg" + ,"phone": 12345678901 + ,"email": "11111@qq.com" + ,"sex": "女" + ,"ip": "1111111" + ,"jointime": 20171204 + },{ + "id": "013" + ,"username": "用户-13" + ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg" + ,"phone": 12345678901 + ,"email": "11111@qq.com" + ,"sex": "女" + ,"ip": "1111111" + ,"jointime": 20171204 + ,"LAY_CHECKED": true + },{ + "id": "014" + ,"username": "用户-14" + ,"avatar": "https://wx3.sinaimg.cn/mw690/5db11ff4gy1fmx4keca8ag208g06iglw.gif" + ,"phone": 12345678901 + ,"email": "11111@qq.com" + ,"sex": "男" + ,"ip": "1111111" + ,"jointime": 20171204 + },{ + "id": "015" + ,"username": "用户-15" + ,"avatar": "https://wx2.sinaimg.cn/mw690/5db11ff4gy1fmx4kec5bvj20eb0h3mxh.jpg" + ,"phone": 12345678901 + ,"email": "11111@qq.com" + ,"sex": "男" + ,"ip": "1111111" + ,"jointime": 20171204 + }] +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/json/workorder/demo.js b/AdminSrc/AdminHost/wwwroot/admin/json/workorder/demo.js new file mode 100644 index 0000000..81066c2 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/json/workorder/demo.js @@ -0,0 +1,78 @@ +{ + "code": 0 + ,"msg": "" + ,"count": "100" + ,"data": [{ + "orderid": 111 + ,"title": "移动支付踏入马来西亚,聚合支付紧随其后" + ,"attr": "公告" + ,"progress": "25%" + ,"submit": "贤心" + ,"accept": "员工-1" + ,"state": "处理中" + },{ + "orderid": 222 + ,"title": "凡科拖拽式免费建站神器,享双重优惠!" + ,"attr": "讨论" + ,"progress": "100%" + ,"submit": "猫吃" + ,"accept": "员工-1" + ,"state": "已处理" + },{ + "orderid": 333 + ,"title": "看着别人的老板给员工送汽车有感" + ,"attr": "分享" + ,"progress": "0%" + ,"submit": "纸飞机" + ,"accept": "" + ,"state": "未分配" + },{ + "orderid": 444 + ,"title": "DISCUZ的云平台应该彻底完了" + ,"attr": "提问" + ,"progress": "0%" + ,"submit": "纸飞机" + ,"accept": "" + ,"state": "未分配" + },{ + "orderid": 555 + ,"title": "现在个人网站还有必要长期坚持下去吗?" + ,"attr": "提问" + ,"progress": "50%" + ,"submit": "纸飞机" + ,"accept": "员工-2" + ,"state": "处理中" + },{ + "orderid": 666 + ,"title": "向北京公安局投诉了京东商城" + ,"attr": "公告" + ,"progress": "25%" + ,"submit": "纸飞机" + ,"accept": "员工-3" + ,"state": "处理中" + },{ + "orderid": 777 + ,"title": "游戏 网页美工,一个月多少工资才正常?" + ,"attr": "提问" + ,"progress": "100%" + ,"submit": "纸飞机" + ,"accept": "员工-1" + ,"state": "已处理" + },{ + "orderid": 888 + ,"title": "几年没来了,蓝色理想帖子这么少了啊" + ,"attr": "提问" + ,"progress": "0%" + ,"submit": "纸飞机" + ,"accept": "" + ,"state": "未分配" + },{ + "orderid": 999 + ,"title": "我的天,求推荐靠谱的学习网站" + ,"attr": "提问" + ,"progress": "50%" + ,"submit": "纸飞机" + ,"accept": "员工-2" + ,"state": "处理中" + }] +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/layui.css b/AdminSrc/AdminHost/wwwroot/admin/layui/css/layui.css new file mode 100644 index 0000000..70bae88 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/css/layui.css @@ -0,0 +1 @@ +blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}img{display:inline-block;border:none;vertical-align:middle}li{list-style:none}table{border-collapse:collapse;border-spacing:0}h1,h2,h3,h4,h5,h6{font-weight:700}h5,h6{font-size:100%}button,input,select,textarea{font-size:100%}button,input,optgroup,option,select,textarea{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;outline:0}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}body{line-height:1.6;color:rgba(0,0,0,.85);font-size:14px;font-family:Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif}hr{height:0;line-height:0;margin:10px 0;padding:0;border:none;border-bottom:1px solid #eee;clear:both;overflow:hidden;background:0 0}a{color:#333;text-decoration:none}a cite{font-style:normal}.layui-border-box,.layui-border-box *{box-sizing:border-box}.layui-box,.layui-box *{box-sizing:content-box}.layui-clear{clear:both}.layui-clear:after{content:'\20';clear:both;display:block;height:0}.layui-clear-space{word-spacing:-5px}.layui-inline{position:relative;display:inline-block;vertical-align:middle}.layui-edge{position:relative;display:inline-block;vertical-align:middle;width:0;height:0;border-width:6px;border-style:dashed;border-color:transparent;overflow:hidden}.layui-edge-top{top:-4px;border-bottom-color:#999;border-bottom-style:solid}.layui-edge-right{border-left-color:#999;border-left-style:solid}.layui-edge-bottom{top:2px;border-top-color:#999;border-top-style:solid}.layui-edge-left{border-right-color:#999;border-right-style:solid}.layui-elip,.layui-ellip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-disabled,.layui-icon,.layui-unselect{user-select:none}.layui-disabled,.layui-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-show-v{visibility:visible!important}.layui-hide-v{visibility:hidden!important}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=293);src:url(../font/iconfont.eot?v=293#iefix) format('embedded-opentype'),url(../font/iconfont.woff2?v=293) format('woff2'),url(../font/iconfont.woff?v=293) format('woff'),url(../font/iconfont.ttf?v=293) format('truetype'),url(../font/iconfont.svg?v=293#layui-icon) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-icon-sound:before{content:"\e69d"}.layui-icon-bot:before{content:"\e7d6"}.layui-icon-leaf:before{content:"\e701"}.layui-icon-folder:before{content:"\eabe"}.layui-icon-folder-open:before{content:"\eac1"}.layui-icon-gitee:before{content:"\e69b"}.layui-icon-github:before{content:"\e6a7"}.layui-icon-disabled:before{content:"\e6cc"}.layui-icon-moon:before{content:"\e6c2"}.layui-icon-error:before{content:"\e693"}.layui-icon-success:before{content:"\e697"}.layui-icon-question:before{content:"\e699"}.layui-icon-lock:before{content:"\e69a"}.layui-icon-eye:before{content:"\e695"}.layui-icon-eye-invisible:before{content:"\e696"}.layui-icon-backspace:before{content:"\e694"}.layui-icon-tips-fill:before{content:"\eb2e"}.layui-icon-test:before{content:"\e692"}.layui-icon-clear:before{content:"\e788"}.layui-icon-heart-fill:before{content:"\e68f"}.layui-icon-light:before{content:"\e748"}.layui-icon-music:before{content:"\e690"}.layui-icon-time:before{content:"\e68d"}.layui-icon-ie:before{content:"\e7bb"}.layui-icon-firefox:before{content:"\e686"}.layui-icon-at:before{content:"\e687"}.layui-icon-bluetooth:before{content:"\e689"}.layui-icon-chrome:before{content:"\e68a"}.layui-icon-edge:before{content:"\e68b"}.layui-icon-heart:before{content:"\e68c"}.layui-icon-key:before{content:"\e683"}.layui-icon-android:before{content:"\e684"}.layui-icon-mike:before{content:"\e6dc"}.layui-icon-mute:before{content:"\e685"}.layui-icon-gift:before{content:"\e627"}.layui-icon-windows:before{content:"\e67f"}.layui-icon-ios:before{content:"\e680"}.layui-icon-logout:before{content:"\e682"}.layui-icon-wifi:before{content:"\e7e0"}.layui-icon-rss:before{content:"\e808"}.layui-icon-email:before{content:"\e618"}.layui-icon-reduce-circle:before{content:"\e616"}.layui-icon-transfer:before{content:"\e691"}.layui-icon-service:before{content:"\e626"}.layui-icon-addition:before{content:"\e624"}.layui-icon-subtraction:before{content:"\e67e"}.layui-icon-slider:before{content:"\e714"}.layui-icon-print:before{content:"\e66d"}.layui-icon-export:before{content:"\e67d"}.layui-icon-cols:before{content:"\e610"}.layui-icon-screen-full:before{content:"\e622"}.layui-icon-screen-restore:before{content:"\e758"}.layui-icon-rate-half:before{content:"\e6c9"}.layui-icon-rate-solid:before{content:"\e67a"}.layui-icon-rate:before{content:"\e67b"}.layui-icon-cellphone:before{content:"\e678"}.layui-icon-vercode:before{content:"\e679"}.layui-icon-login-weibo:before{content:"\e675"}.layui-icon-login-qq:before{content:"\e676"}.layui-icon-login-wechat:before{content:"\e677"}.layui-icon-username:before{content:"\e66f"}.layui-icon-password:before{content:"\e673"}.layui-icon-refresh-3:before{content:"\e9aa"}.layui-icon-auz:before{content:"\e672"}.layui-icon-shrink-right:before{content:"\e668"}.layui-icon-spread-left:before{content:"\e66b"}.layui-icon-snowflake:before{content:"\e6b1"}.layui-icon-tips:before{content:"\e702"}.layui-icon-note:before{content:"\e66e"}.layui-icon-senior:before{content:"\e674"}.layui-icon-refresh-1:before{content:"\e666"}.layui-icon-refresh:before{content:"\e669"}.layui-icon-flag:before{content:"\e66c"}.layui-icon-theme:before{content:"\e66a"}.layui-icon-notice:before{content:"\e667"}.layui-icon-console:before{content:"\e665"}.layui-icon-website:before{content:"\e7ae"}.layui-icon-face-surprised:before{content:"\e664"}.layui-icon-set:before{content:"\e716"}.layui-icon-template:before{content:"\e663"}.layui-icon-app:before{content:"\e653"}.layui-icon-template-1:before{content:"\e656"}.layui-icon-home:before{content:"\e68e"}.layui-icon-female:before{content:"\e661"}.layui-icon-male:before{content:"\e662"}.layui-icon-tread:before{content:"\e6c5"}.layui-icon-praise:before{content:"\e6c6"}.layui-icon-rmb:before{content:"\e65e"}.layui-icon-more:before{content:"\e65f"}.layui-icon-camera:before{content:"\e660"}.layui-icon-cart-simple:before{content:"\e698"}.layui-icon-face-cry:before{content:"\e69c"}.layui-icon-face-smile:before{content:"\e6af"}.layui-icon-survey:before{content:"\e6b2"}.layui-icon-read:before{content:"\e705"}.layui-icon-location:before{content:"\e715"}.layui-icon-dollar:before{content:"\e659"}.layui-icon-diamond:before{content:"\e735"}.layui-icon-return:before{content:"\e65c"}.layui-icon-camera-fill:before{content:"\e65d"}.layui-icon-fire:before{content:"\e756"}.layui-icon-more-vertical:before{content:"\e671"}.layui-icon-cart:before{content:"\e657"}.layui-icon-star-fill:before{content:"\e658"}.layui-icon-prev:before{content:"\e65a"}.layui-icon-next:before{content:"\e65b"}.layui-icon-upload:before{content:"\e67c"}.layui-icon-upload-drag:before{content:"\e681"}.layui-icon-user:before{content:"\e770"}.layui-icon-file-b:before{content:"\e655"}.layui-icon-component:before{content:"\e857"}.layui-icon-find-fill:before{content:"\e670"}.layui-icon-loading:before{content:"\e63d"}.layui-icon-loading-1:before{content:"\e63e"}.layui-icon-add-1:before{content:"\e654"}.layui-icon-pause:before{content:"\e651"}.layui-icon-play:before{content:"\e652"}.layui-icon-video:before{content:"\e6ed"}.layui-icon-headset:before{content:"\e6fc"}.layui-icon-voice:before{content:"\e688"}.layui-icon-speaker:before{content:"\e645"}.layui-icon-fonts-del:before{content:"\e64f"}.layui-icon-fonts-html:before{content:"\e64b"}.layui-icon-fonts-code:before{content:"\e64e"}.layui-icon-fonts-strong:before{content:"\e62b"}.layui-icon-unlink:before{content:"\e64d"}.layui-icon-picture:before{content:"\e64a"}.layui-icon-link:before{content:"\e64c"}.layui-icon-face-smile-b:before{content:"\e650"}.layui-icon-align-center:before{content:"\e647"}.layui-icon-align-right:before{content:"\e648"}.layui-icon-align-left:before{content:"\e649"}.layui-icon-fonts-u:before{content:"\e646"}.layui-icon-fonts-i:before{content:"\e644"}.layui-icon-tabs:before{content:"\e62a"}.layui-icon-circle:before{content:"\e63f"}.layui-icon-radio:before{content:"\e643"}.layui-icon-share:before{content:"\e641"}.layui-icon-edit:before{content:"\e642"}.layui-icon-delete:before{content:"\e640"}.layui-icon-engine:before{content:"\e628"}.layui-icon-chart-screen:before{content:"\e629"}.layui-icon-chart:before{content:"\e62c"}.layui-icon-table:before{content:"\e62d"}.layui-icon-tree:before{content:"\e62e"}.layui-icon-upload-circle:before{content:"\e62f"}.layui-icon-templeate-1:before{content:"\e630"}.layui-icon-util:before{content:"\e631"}.layui-icon-layouts:before{content:"\e632"}.layui-icon-prev-circle:before{content:"\e633"}.layui-icon-carousel:before{content:"\e634"}.layui-icon-code-circle:before{content:"\e635"}.layui-icon-water:before{content:"\e636"}.layui-icon-date:before{content:"\e637"}.layui-icon-layer:before{content:"\e638"}.layui-icon-fonts-clear:before{content:"\e639"}.layui-icon-dialogue:before{content:"\e63a"}.layui-icon-cellphone-fine:before{content:"\e63b"}.layui-icon-form:before{content:"\e63c"}.layui-icon-file:before{content:"\e621"}.layui-icon-triangle-r:before{content:"\e623"}.layui-icon-triangle-d:before{content:"\e625"}.layui-icon-set-sm:before{content:"\e620"}.layui-icon-add-circle:before{content:"\e61f"}.layui-icon-layim-download:before{content:"\e61e"}.layui-icon-layim-uploadfile:before{content:"\e61d"}.layui-icon-404:before{content:"\e61c"}.layui-icon-about:before{content:"\e60b"}.layui-icon-layim-theme:before{content:"\e61b"}.layui-icon-down:before{content:"\e61a"}.layui-icon-up:before{content:"\e619"}.layui-icon-circle-dot:before{content:"\e617"}.layui-icon-set-fill:before{content:"\e614"}.layui-icon-search:before{content:"\e615"}.layui-icon-friends:before{content:"\e612"}.layui-icon-group:before{content:"\e613"}.layui-icon-reply-fill:before{content:"\e611"}.layui-icon-menu-fill:before{content:"\e60f"}.layui-icon-face-smile-fine:before{content:"\e60c"}.layui-icon-picture-fine:before{content:"\e60d"}.layui-icon-log:before{content:"\e60e"}.layui-icon-list:before{content:"\e60a"}.layui-icon-release:before{content:"\e609"}.layui-icon-add-circle-fine:before{content:"\e608"}.layui-icon-ok:before{content:"\e605"}.layui-icon-help:before{content:"\e607"}.layui-icon-chat:before{content:"\e606"}.layui-icon-top:before{content:"\e604"}.layui-icon-right:before{content:"\e602"}.layui-icon-left:before{content:"\e603"}.layui-icon-star:before{content:"\e600"}.layui-icon-download-circle:before{content:"\e601"}.layui-icon-close:before{content:"\1006"}.layui-icon-close-fill:before{content:"\1007"}.layui-icon-ok-circle:before{content:"\1005"}.layui-main{position:relative;width:1160px;margin:0 auto}.layui-header{position:relative;z-index:1000;height:60px}.layui-header a:hover{transition:all .5s;-webkit-transition:all .5s}.layui-side{position:fixed;left:0;top:0;bottom:0;z-index:999;width:200px;overflow-x:hidden}.layui-side-scroll{position:relative;width:220px;height:100%;overflow-x:hidden}.layui-body{position:relative;left:200px;right:0;top:0;bottom:0;width:auto;box-sizing:border-box}.layui-layout-body{overflow-x:hidden}.layui-layout-admin .layui-header{position:fixed;top:0;left:0;right:0;background-color:#23292e}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{position:absolute;top:60px;padding-bottom:44px}.layui-layout-admin .layui-main{width:auto;margin:0 15px}.layui-layout-admin .layui-footer{position:fixed;left:200px;right:0;bottom:0;z-index:990;height:44px;line-height:44px;padding:0 15px;box-shadow:-1px 0 4px rgb(0 0 0 / 12%);background-color:#fafafa}.layui-layout-admin .layui-logo{position:absolute;left:0;top:0;width:200px;height:100%;line-height:60px;text-align:center;color:#16baaa;font-size:16px;box-shadow:0 1px 2px 0 rgb(0 0 0 / 15%)}.layui-layout-admin .layui-header .layui-nav{background:0 0}.layui-layout-left{position:absolute!important;left:200px;top:0}.layui-layout-right{position:absolute!important;right:0;top:0}.layui-container{position:relative;margin:0 auto;box-sizing:border-box}.layui-fluid{position:relative;margin:0 auto;padding:0 15px}.layui-row:after,.layui-row:before{content:"";display:block;clear:both}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9,.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9,.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9,.layui-col-xl1,.layui-col-xl10,.layui-col-xl11,.layui-col-xl12,.layui-col-xl2,.layui-col-xl3,.layui-col-xl4,.layui-col-xl5,.layui-col-xl6,.layui-col-xl7,.layui-col-xl8,.layui-col-xl9,.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{position:relative;display:block;box-sizing:border-box}.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{float:left}.layui-col-xs1{width:8.33333333%}.layui-col-xs2{width:16.66666667%}.layui-col-xs3{width:25%}.layui-col-xs4{width:33.33333333%}.layui-col-xs5{width:41.66666667%}.layui-col-xs6{width:50%}.layui-col-xs7{width:58.33333333%}.layui-col-xs8{width:66.66666667%}.layui-col-xs9{width:75%}.layui-col-xs10{width:83.33333333%}.layui-col-xs11{width:91.66666667%}.layui-col-xs12{width:100%}.layui-col-xs-offset1{margin-left:8.33333333%}.layui-col-xs-offset2{margin-left:16.66666667%}.layui-col-xs-offset3{margin-left:25%}.layui-col-xs-offset4{margin-left:33.33333333%}.layui-col-xs-offset5{margin-left:41.66666667%}.layui-col-xs-offset6{margin-left:50%}.layui-col-xs-offset7{margin-left:58.33333333%}.layui-col-xs-offset8{margin-left:66.66666667%}.layui-col-xs-offset9{margin-left:75%}.layui-col-xs-offset10{margin-left:83.33333333%}.layui-col-xs-offset11{margin-left:91.66666667%}.layui-col-xs-offset12{margin-left:100%}@media screen and (max-width:767.98px){.layui-container{padding:0 15px}.layui-hide-xs{display:none!important}.layui-show-xs-block{display:block!important}.layui-show-xs-inline{display:inline!important}.layui-show-xs-inline-block{display:inline-block!important}}@media screen and (min-width:768px){.layui-container{width:720px}.layui-hide-sm{display:none!important}.layui-show-sm-block{display:block!important}.layui-show-sm-inline{display:inline!important}.layui-show-sm-inline-block{display:inline-block!important}.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9{float:left}.layui-col-sm1{width:8.33333333%}.layui-col-sm2{width:16.66666667%}.layui-col-sm3{width:25%}.layui-col-sm4{width:33.33333333%}.layui-col-sm5{width:41.66666667%}.layui-col-sm6{width:50%}.layui-col-sm7{width:58.33333333%}.layui-col-sm8{width:66.66666667%}.layui-col-sm9{width:75%}.layui-col-sm10{width:83.33333333%}.layui-col-sm11{width:91.66666667%}.layui-col-sm12{width:100%}.layui-col-sm-offset1{margin-left:8.33333333%}.layui-col-sm-offset2{margin-left:16.66666667%}.layui-col-sm-offset3{margin-left:25%}.layui-col-sm-offset4{margin-left:33.33333333%}.layui-col-sm-offset5{margin-left:41.66666667%}.layui-col-sm-offset6{margin-left:50%}.layui-col-sm-offset7{margin-left:58.33333333%}.layui-col-sm-offset8{margin-left:66.66666667%}.layui-col-sm-offset9{margin-left:75%}.layui-col-sm-offset10{margin-left:83.33333333%}.layui-col-sm-offset11{margin-left:91.66666667%}.layui-col-sm-offset12{margin-left:100%}}@media screen and (min-width:992px){.layui-container{width:960px}.layui-hide-md{display:none!important}.layui-show-md-block{display:block!important}.layui-show-md-inline{display:inline!important}.layui-show-md-inline-block{display:inline-block!important}.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9{float:left}.layui-col-md1{width:8.33333333%}.layui-col-md2{width:16.66666667%}.layui-col-md3{width:25%}.layui-col-md4{width:33.33333333%}.layui-col-md5{width:41.66666667%}.layui-col-md6{width:50%}.layui-col-md7{width:58.33333333%}.layui-col-md8{width:66.66666667%}.layui-col-md9{width:75%}.layui-col-md10{width:83.33333333%}.layui-col-md11{width:91.66666667%}.layui-col-md12{width:100%}.layui-col-md-offset1{margin-left:8.33333333%}.layui-col-md-offset2{margin-left:16.66666667%}.layui-col-md-offset3{margin-left:25%}.layui-col-md-offset4{margin-left:33.33333333%}.layui-col-md-offset5{margin-left:41.66666667%}.layui-col-md-offset6{margin-left:50%}.layui-col-md-offset7{margin-left:58.33333333%}.layui-col-md-offset8{margin-left:66.66666667%}.layui-col-md-offset9{margin-left:75%}.layui-col-md-offset10{margin-left:83.33333333%}.layui-col-md-offset11{margin-left:91.66666667%}.layui-col-md-offset12{margin-left:100%}}@media screen and (min-width:1200px){.layui-container{width:1150px}.layui-hide-lg{display:none!important}.layui-show-lg-block{display:block!important}.layui-show-lg-inline{display:inline!important}.layui-show-lg-inline-block{display:inline-block!important}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9{float:left}.layui-col-lg1{width:8.33333333%}.layui-col-lg2{width:16.66666667%}.layui-col-lg3{width:25%}.layui-col-lg4{width:33.33333333%}.layui-col-lg5{width:41.66666667%}.layui-col-lg6{width:50%}.layui-col-lg7{width:58.33333333%}.layui-col-lg8{width:66.66666667%}.layui-col-lg9{width:75%}.layui-col-lg10{width:83.33333333%}.layui-col-lg11{width:91.66666667%}.layui-col-lg12{width:100%}.layui-col-lg-offset1{margin-left:8.33333333%}.layui-col-lg-offset2{margin-left:16.66666667%}.layui-col-lg-offset3{margin-left:25%}.layui-col-lg-offset4{margin-left:33.33333333%}.layui-col-lg-offset5{margin-left:41.66666667%}.layui-col-lg-offset6{margin-left:50%}.layui-col-lg-offset7{margin-left:58.33333333%}.layui-col-lg-offset8{margin-left:66.66666667%}.layui-col-lg-offset9{margin-left:75%}.layui-col-lg-offset10{margin-left:83.33333333%}.layui-col-lg-offset11{margin-left:91.66666667%}.layui-col-lg-offset12{margin-left:100%}}@media screen and (min-width:1400px){.layui-container{width:1330px}.layui-hide-xl{display:none!important}.layui-show-xl-block{display:block!important}.layui-show-xl-inline{display:inline!important}.layui-show-xl-inline-block{display:inline-block!important}.layui-col-xl1,.layui-col-xl10,.layui-col-xl11,.layui-col-xl12,.layui-col-xl2,.layui-col-xl3,.layui-col-xl4,.layui-col-xl5,.layui-col-xl6,.layui-col-xl7,.layui-col-xl8,.layui-col-xl9{float:left}.layui-col-xl1{width:8.33333333%}.layui-col-xl2{width:16.66666667%}.layui-col-xl3{width:25%}.layui-col-xl4{width:33.33333333%}.layui-col-xl5{width:41.66666667%}.layui-col-xl6{width:50%}.layui-col-xl7{width:58.33333333%}.layui-col-xl8{width:66.66666667%}.layui-col-xl9{width:75%}.layui-col-xl10{width:83.33333333%}.layui-col-xl11{width:91.66666667%}.layui-col-xl12{width:100%}.layui-col-xl-offset1{margin-left:8.33333333%}.layui-col-xl-offset2{margin-left:16.66666667%}.layui-col-xl-offset3{margin-left:25%}.layui-col-xl-offset4{margin-left:33.33333333%}.layui-col-xl-offset5{margin-left:41.66666667%}.layui-col-xl-offset6{margin-left:50%}.layui-col-xl-offset7{margin-left:58.33333333%}.layui-col-xl-offset8{margin-left:66.66666667%}.layui-col-xl-offset9{margin-left:75%}.layui-col-xl-offset10{margin-left:83.33333333%}.layui-col-xl-offset11{margin-left:91.66666667%}.layui-col-xl-offset12{margin-left:100%}}.layui-col-space1{margin:-.5px}.layui-col-space1>*{padding:.5px}.layui-col-space2{margin:-1px}.layui-col-space2>*{padding:1px}.layui-col-space4{margin:-2px}.layui-col-space4>*{padding:2px}.layui-col-space5{margin:-2.5px}.layui-col-space5>*{padding:2.5px}.layui-col-space6{margin:-3px}.layui-col-space6>*{padding:3px}.layui-col-space8{margin:-4px}.layui-col-space8>*{padding:4px}.layui-col-space10{margin:-5px}.layui-col-space10>*{padding:5px}.layui-col-space12{margin:-6px}.layui-col-space12>*{padding:6px}.layui-col-space14{margin:-7px}.layui-col-space14>*{padding:7px}.layui-col-space15{margin:-7.5px}.layui-col-space15>*{padding:7.5px}.layui-col-space16{margin:-8px}.layui-col-space16>*{padding:8px}.layui-col-space18{margin:-9px}.layui-col-space18>*{padding:9px}.layui-col-space20{margin:-10px}.layui-col-space20>*{padding:10px}.layui-col-space22{margin:-11px}.layui-col-space22>*{padding:11px}.layui-col-space24{margin:-12px}.layui-col-space24>*{padding:12px}.layui-col-space25{margin:-12.5px}.layui-col-space25>*{padding:12.5px}.layui-col-space26{margin:-13px}.layui-col-space26>*{padding:13px}.layui-col-space28{margin:-14px}.layui-col-space28>*{padding:14px}.layui-col-space30{margin:-15px}.layui-col-space30>*{padding:15px}.layui-col-space32{margin:-16px}.layui-col-space32>*{padding:16px}.layui-padding-1{padding:4px!important}.layui-padding-2{padding:8px!important}.layui-padding-3{padding:16px!important}.layui-padding-4{padding:32px!important}.layui-padding-5{padding:48px!important}.layui-margin-1{margin:4px!important}.layui-margin-2{margin:8px!important}.layui-margin-3{margin:16px!important}.layui-margin-4{margin:32px!important}.layui-margin-5{margin:48px!important}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;appearance:none;-webkit-appearance:none;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:1.8;border-left:5px solid #16b777;border-radius:0 2px 2px 0;background-color:#fafafa}.layui-quote-nm{border-style:solid;border-width:1px;border-left-width:5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border-width:1px;border-style:solid}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px}.layui-field-title{margin:16px 0;border-width:0;border-top-width:1px}.layui-field-box{padding:15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#eee}.layui-progress-bar{position:absolute;left:0;top:0;width:0;max-width:100%;height:6px;border-radius:20px;text-align:right;background-color:#16b777;transition:all .3s;-webkit-transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px}.layui-progress-text{position:relative;top:-20px;line-height:18px;font-size:12px;color:#5f5f5f}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border-width:1px;border-style:solid;border-radius:2px}.layui-colla-content,.layui-colla-item{border-top-width:1px;border-top-style:solid}.layui-colla-item:first-child{border-top:none}.layui-colla-title{position:relative;height:42px;line-height:42px;padding:0 15px 0 35px;color:#333;background-color:#fafafa;cursor:pointer;font-size:14px;overflow:hidden}.layui-colla-content{display:none;padding:10px 15px;line-height:1.6;color:#5f5f5f}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-card{margin-bottom:15px;border-radius:2px;background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layui-card:last-child{margin-bottom:0}.layui-card-body,.layui-card-header{position:relative;padding:10px 15px}.layui-card-header{border-bottom:1px solid #f8f8f8;color:#333;border-radius:2px 2px 0 0;font-size:14px}.layui-card-body .layui-table{margin:5px 0}.layui-card .layui-tab{margin:0}.layui-panel{position:relative;border-width:1px;border-style:solid;border-radius:2px;box-shadow:1px 1px 4px rgb(0 0 0 / 8%);background-color:#fff;color:#5f5f5f}.layui-panel-window{position:relative;padding:15px;border-radius:0;border-top:5px solid #eee;background-color:#fff}.layui-auxiliar-moving{position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;background:0 0;z-index:9999999999;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.layui-scrollbar-hide{overflow:hidden!important}.layui-bg-red{background-color:#ff5722!important;color:#fff!important}.layui-bg-orange{background-color:#ffb800!important;color:#fff!important}.layui-bg-green{background-color:#16baaa!important;color:#fff!important}.layui-bg-cyan{background-color:#2f4056!important;color:#fff!important}.layui-bg-blue{background-color:#1e9fff!important;color:#fff!important}.layui-bg-purple{background-color:#a233c6!important;color:#fff!important}.layui-bg-black{background-color:#2f363c!important;color:#fff!important}.layui-bg-gray{background-color:#fafafa!important;color:#5f5f5f!important}.layui-badge-rim,.layui-border,.layui-colla-content,.layui-colla-item,.layui-collapse,.layui-elem-field,.layui-form-pane .layui-form-item[pane],.layui-form-pane .layui-form-label,.layui-input,.layui-input-split,.layui-panel,.layui-quote-nm,.layui-select,.layui-tab-bar,.layui-tab-card,.layui-tab-title,.layui-tab-title .layui-this:after,.layui-textarea{border-color:#eee}.layui-border{border-width:1px;border-style:solid;color:#5f5f5f!important}.layui-border-red{border-width:1px;border-style:solid;border-color:#ff5722!important;color:#ff5722!important}.layui-border-orange{border-width:1px;border-style:solid;border-color:#ffb800!important;color:#ffb800!important}.layui-border-green{border-width:1px;border-style:solid;border-color:#16baaa!important;color:#16baaa!important}.layui-border-cyan{border-width:1px;border-style:solid;border-color:#2f4056!important;color:#2f4056!important}.layui-border-blue{border-width:1px;border-style:solid;border-color:#1e9fff!important;color:#1e9fff!important}.layui-border-purple{border-width:1px;border-style:solid;border-color:#a233c6!important;color:#a233c6!important}.layui-border-black{border-width:1px;border-style:solid;border-color:#2f363c!important;color:#2f363c!important}hr.layui-border-black,hr.layui-border-blue,hr.layui-border-cyan,hr.layui-border-green,hr.layui-border-orange,hr.layui-border-purple,hr.layui-border-red{border-width:0 0 1px}.layui-timeline-item:before{background-color:#eee}.layui-text{line-height:1.8;font-size:14px}.layui-text h1{margin:32px 0;font-size:32px}.layui-text h2{margin:24px 0;font-size:24px}.layui-text h3{margin:16px 0;font-size:18px}.layui-text h4{margin:11px 0;font-size:16px}.layui-text h5{margin:11px 0;font-size:14px}.layui-text h6{margin:11px 0;font-size:13px}.layui-text p{margin:15px 0}.layui-text p:first-child{margin-top:0}.layui-text p:last-child{margin-bottom:0}.layui-text hr{margin:15px 0}.layui-text ol,.layui-text ul{padding-left:15px}.layui-text ul li{margin-top:5px;list-style-type:disc}.layui-text ol li{margin-top:5px;list-style-type:decimal}.layui-text ol ul>li,.layui-text ul ul>li{list-style-type:disc}.layui-text ol li>p:first-child,.layui-text ul li>p:first-child{margin-top:0;margin-bottom:0}.layui-text :where(a:not(.layui-btn)){color:#01aaed}.layui-text :where(a:not(.layui-btn):hover){text-decoration:underline}.layui-text blockquote:not(.layui-elem-quote){margin:15px 0;padding:5px 15px;border-left:5px solid #eee}.layui-text pre>code:not(.layui-code){display:block;padding:15px;font-family:"Courier New",Consolas,"Lucida Console",monospace}.layui-text-em,.layui-word-aux{color:#999!important;padding-left:5px!important;padding-right:5px!important}.layui-font-12{font-size:12px!important}.layui-font-13{font-size:13px!important}.layui-font-14{font-size:14px!important}.layui-font-16{font-size:16px!important}.layui-font-18{font-size:18px!important}.layui-font-20{font-size:20px!important}.layui-font-22{font-size:22px!important}.layui-font-24{font-size:24px!important}.layui-font-26{font-size:26px!important}.layui-font-28{font-size:28px!important}.layui-font-30{font-size:30px!important}.layui-font-32{font-size:32px!important}.layui-font-red{color:#ff5722!important}.layui-font-orange{color:#ffb800!important}.layui-font-green{color:#16baaa!important}.layui-font-cyan{color:#2f4056!important}.layui-font-blue{color:#01aaed!important}.layui-font-purple{color:#a233c6!important}.layui-font-black{color:#000!important}.layui-font-gray{color:#c2c2c2!important}.layui-btn{display:inline-block;vertical-align:middle;height:38px;line-height:38px;border:1px solid transparent;padding:0 18px;background-color:#16baaa;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border-radius:2px;cursor:pointer;user-select:none}.layui-btn:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}.layui-btn:active{opacity:1;filter:alpha(opacity=100)}.layui-btn+.layui-btn{margin-left:10px}.layui-btn-container{word-spacing:-5px}.layui-btn-container .layui-btn{margin-right:10px;margin-bottom:10px;word-spacing:normal}.layui-btn-container .layui-btn+.layui-btn{margin-left:0}.layui-table .layui-btn-container .layui-btn{margin-bottom:9px}.layui-btn-radius{border-radius:100px}.layui-btn .layui-icon{padding:0 2px;vertical-align:middle\0;vertical-align:bottom}.layui-btn-primary{border-color:#d2d2d2;background:0 0;color:#5f5f5f}.layui-btn-primary:hover{border-color:#16baaa;color:#333}.layui-btn-normal{background-color:#1e9fff}.layui-btn-warm{background-color:#ffb800}.layui-btn-danger{background-color:#ff5722}.layui-btn-checked{background-color:#16b777}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border-color:#eee!important;background-color:#fbfbfb!important;color:#d2d2d2!important;cursor:not-allowed!important;opacity:1}.layui-btn-lg{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-sm{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-xs{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-xs i{font-size:12px!important}.layui-btn-group{display:inline-block;vertical-align:middle;font-size:0}.layui-btn-group .layui-btn{margin-left:0!important;margin-right:0!important;border-left:1px solid rgba(255,255,255,.5);border-radius:0}.layui-btn-group .layui-btn-primary{border-left:none}.layui-btn-group .layui-btn-primary:hover{border-color:#d2d2d2;color:#16baaa}.layui-btn-group .layui-btn:first-child{border-left:none;border-radius:2px 0 0 2px}.layui-btn-group .layui-btn-primary:first-child{border-left:1px solid #d2d2d2}.layui-btn-group .layui-btn:last-child{border-radius:0 2px 2px 0}.layui-btn-group .layui-btn+.layui-btn{margin-left:0}.layui-btn-group+.layui-btn-group{margin-left:10px}.layui-btn-fluid{width:100%}.layui-input,.layui-select,.layui-textarea{height:38px;line-height:1.3;line-height:38px\9;border-width:1px;border-style:solid;background-color:#fff;color:rgba(0,0,0,.85);border-radius:2px}.layui-input::-webkit-input-placeholder,.layui-select::-webkit-input-placeholder,.layui-textarea::-webkit-input-placeholder{line-height:1.3}.layui-input,.layui-textarea{display:block;width:100%;padding-left:10px}.layui-input:hover,.layui-textarea:hover{border-color:#d2d2d2!important}.layui-input:focus,.layui-textarea:focus{border-color:#16b777!important;box-shadow:0 0 0 3px rgba(22,183,119,.08)}.layui-textarea{position:relative;min-height:100px;height:auto;line-height:20px;padding:6px 10px;resize:vertical}.layui-input[disabled],.layui-textarea[disabled]{background-color:#fafafa}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form [lay-ignore]{display:initial}.layui-form-item{position:relative;margin-bottom:15px;clear:both}.layui-form-item:after{content:'\20';clear:both;display:block;height:0}.layui-form-label{position:relative;float:left;display:block;padding:9px 15px;width:80px;font-weight:400;line-height:20px;text-align:right}.layui-form-label-col{display:block;float:none;padding:9px 0;line-height:20px;text-align:left}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block,.layui-input-inline{position:relative}.layui-input-block{margin-left:110px;min-height:36px}.layui-input-inline{display:inline-block;vertical-align:middle}.layui-form-item .layui-input-inline{float:left;width:190px;margin-right:10px}.layui-form-text .layui-input-inline{width:auto}.layui-form-mid{position:relative;float:left;display:block;padding:9px 0!important;line-height:20px;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border-color:#ff5722!important;box-shadow:0 0 0 3px rgba(255,87,34,.08)}.layui-input-prefix,.layui-input-split,.layui-input-suffix,.layui-input-suffix .layui-input-affix{position:absolute;right:0;top:0;padding:0 10px;width:35px;height:100%;text-align:center;transition:all .3s;box-sizing:border-box}.layui-input-prefix{left:0;border-radius:2px 0 0 2px}.layui-input-suffix{right:0;border-radius:0 2px 2px 0}.layui-input-split{border-width:1px;border-style:solid}.layui-input-prefix .layui-icon,.layui-input-split .layui-icon,.layui-input-suffix .layui-icon{position:relative;font-size:16px;color:#5f5f5f;transition:all .3s}.layui-input-group{position:relative;display:table;box-sizing:border-box}.layui-input-group>*{display:table-cell;vertical-align:middle;position:relative}.layui-input-group .layui-input{padding-right:15px}.layui-input-group>.layui-input-prefix{width:auto;border-right:0}.layui-input-group>.layui-input-suffix{width:auto;border-left:0}.layui-input-group .layui-input-split{white-space:nowrap}.layui-input-wrap{position:relative;line-height:38px}.layui-input-wrap .layui-input{padding-right:35px}.layui-input-wrap .layui-input::-ms-clear,.layui-input-wrap .layui-input::-ms-reveal{display:none}.layui-input-wrap .layui-input-prefix+.layui-input,.layui-input-wrap .layui-input-prefix~* .layui-input{padding-left:35px}.layui-input-wrap .layui-input-split+.layui-input,.layui-input-wrap .layui-input-split~* .layui-input{padding-left:45px}.layui-input-wrap .layui-input-prefix~.layui-form-select{position:static}.layui-input-wrap .layui-input-prefix,.layui-input-wrap .layui-input-split,.layui-input-wrap .layui-input-suffix{pointer-events:none}.layui-input-wrap .layui-input:hover+.layui-input-split{border-color:#d2d2d2}.layui-input-wrap .layui-input:focus+.layui-input-split{border-color:#16b777}.layui-input-wrap .layui-input.layui-form-danger:focus+.layui-input-split{border-color:#ff5722}.layui-input-wrap .layui-input-prefix.layui-input-split{border-width:0;border-right-width:1px}.layui-input-wrap .layui-input-suffix.layui-input-split{border-width:0;border-left-width:1px}.layui-input-affix{line-height:38px}.layui-input-suffix .layui-input-affix{right:auto;left:-35px}.layui-input-affix .layui-icon{color:rgba(0,0,0,.8);pointer-events:auto!important;cursor:pointer}.layui-input-affix .layui-icon-clear{color:rgba(0,0,0,.3)}.layui-input-affix .layui-icon:hover{color:rgba(0,0,0,.6)}.layui-input-wrap .layui-input-number{width:24px;padding:0}.layui-input-wrap .layui-input-number .layui-icon{position:absolute;right:0;width:100%;height:50%;line-height:normal;font-size:12px}.layui-input-wrap .layui-input-number .layui-icon:before{position:absolute;left:50%;top:50%;margin-top:-6px;margin-left:-6px}.layui-input-wrap .layui-input-number .layui-icon-up{top:0;border-bottom:1px solid #eee}.layui-input-wrap .layui-input-number .layui-icon-down{bottom:0}.layui-input-wrap .layui-input-number .layui-icon:hover{font-weight:700}.layui-input-wrap .layui-input[type=number]::-webkit-inner-spin-button,.layui-input-wrap .layui-input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none!important}.layui-input-wrap .layui-input[type=number]{-moz-appearance:textfield;-webkit-appearance:textfield;appearance:textfield}.layui-input-wrap .layui-input.layui-input-number-invalid,.layui-input-wrap .layui-input.layui-input-number-out-of-range{color:#ff5722}.layui-form-select{position:relative;color:#5f5f5f}.layui-form-select .layui-input{padding-right:30px;cursor:pointer}.layui-form-select .layui-edge{position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#c2c2c2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.layui-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #eee;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:1px 1px 4px rgb(0 0 0 / 8%);box-sizing:border-box}.layui-form-select dl dd,.layui-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layui-form-select dl dt{font-size:12px;color:#999}.layui-form-select dl dd{cursor:pointer}.layui-form-select dl dd:hover{background-color:#f8f8f8;-webkit-transition:.5s all;transition:.5s all}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-select-tips{padding-left:10px!important;color:#999}.layui-form-select dl dd.layui-this{background-color:#f8f8f8;color:#16b777;font-weight:700}.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.layui-form-selected .layui-edge{margin-top:-3px\0}:root .layui-form-selected .layui-edge{margin-top:-9px\0/IE9}.layui-form-selectup dl{top:auto;bottom:42px}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-panel-wrap{position:absolute;z-index:99999999}.layui-select-panel-wrap dl{position:relative;display:block;top:0}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;display:inline-block;vertical-align:middle;height:30px;line-height:30px;margin-right:10px;padding-right:30px;background-color:#fff;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.layui-form-checkbox>*{display:inline-block;vertical-align:middle}.layui-form-checkbox>div{padding:0 11px;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.layui-form-checkbox>div>.layui-icon{line-height:normal}.layui-form-checkbox:hover>div{background-color:#c2c2c2}.layui-form-checkbox>i{position:absolute;right:0;top:0;width:30px;height:100%;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;color:rgba(255,255,255,0);font-size:20px;text-align:center;box-sizing:border-box}.layui-form-checkbox:hover>i{border-color:#c2c2c2;color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#16b777}.layui-form-checked:hover>div,.layui-form-checked>div{background-color:#16b777}.layui-form-checked:hover>i,.layui-form-checked>i{color:#16b777}.layui-form-item .layui-form-checkbox{margin-top:4px}.layui-form-checkbox.layui-checkbox-disabled>div{background-color:#eee!important}.layui-form [lay-checkbox]{display:none}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;min-width:18px;min-height:18px;border:none!important;margin-right:0;padding-left:24px;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary]>div{margin-top:-1px;padding-left:0;padding-right:15px;line-height:18px;background:0 0;color:#5f5f5f}.layui-form-checkbox[lay-skin=primary]>i{right:auto;left:0;width:16px;height:16px;line-height:14px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover>i{border-color:#16b777;color:#fff}.layui-form-checked[lay-skin=primary]>i{border-color:#16b777!important;background-color:#16b777;color:#fff}.layui-checkbox-disabled[lay-skin=primary]>div{background:0 0!important}.layui-form-checked.layui-checkbox-disabled[lay-skin=primary]>i{background:#eee!important;border-color:#eee!important}.layui-checkbox-disabled[lay-skin=primary]:hover>i{border-color:#d2d2d2}.layui-form-item .layui-form-checkbox[lay-skin=primary]{margin-top:10px}.layui-form-checkbox[lay-skin=primary]>.layui-icon-indeterminate{border-color:#16b777}.layui-form-checkbox[lay-skin=primary]>.layui-icon-indeterminate:before{content:'';display:inline-block;vertical-align:middle;position:relative;width:50%;height:1px;margin:-1px auto 0;background-color:#16b777}.layui-form-switch{position:relative;display:inline-block;vertical-align:middle;height:24px;line-height:22px;min-width:44px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;box-sizing:border-box;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch>i{position:absolute;left:5px;top:3px;width:16px;height:16px;border-radius:20px;background-color:#d2d2d2;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch>div{position:relative;top:0;margin-left:21px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#16b777;background-color:#16b777}.layui-form-onswitch>i{left:100%;margin-left:-21px;background-color:#fff}.layui-form-onswitch>div{margin-left:0;margin-right:21px;color:#fff!important}.layui-form-checkbox[lay-skin=none] *,.layui-form-radio[lay-skin=none] *{box-sizing:border-box}.layui-form-checkbox[lay-skin=none],.layui-form-radio[lay-skin=none]{position:relative;min-height:20px;margin:0;padding:0;height:auto;line-height:normal}.layui-form-checkbox[lay-skin=none]>div,.layui-form-radio[lay-skin=none]>div{position:relative;top:0;left:0;cursor:pointer;z-index:10;color:inherit;background-color:inherit}.layui-form-checkbox[lay-skin=none]>i,.layui-form-radio[lay-skin=none]>i{display:none}.layui-form-checkbox[lay-skin=none].layui-checkbox-disabled>div,.layui-form-radio[lay-skin=none].layui-radio-disabled>div{cursor:not-allowed}.layui-checkbox-disabled{border-color:#eee!important}.layui-checkbox-disabled>div{color:#c2c2c2!important}.layui-checkbox-disabled>i{border-color:#eee!important}.layui-checkbox-disabled:hover>i{color:#fff!important}.layui-form-checkbox[lay-skin=tag].layui-form-checked.layui-checkbox-disabled>i{color:#c2c2c2}.layui-form-checkbox[lay-skin=tag].layui-form-checked.layui-checkbox-disabled:hover>i{color:#c2c2c2!important}.layui-form-radio{display:inline-block;vertical-align:middle;line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio>*{display:inline-block;vertical-align:middle;font-size:14px}.layui-form-radio>i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio:hover>*,.layui-form-radioed,.layui-form-radioed>i{color:#16b777}.layui-radio-disabled>i{color:#eee!important}.layui-radio-disabled>*{color:#c2c2c2!important}.layui-form [lay-radio]{display:none}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border-width:1px;border-style:solid;border-radius:2px 0 0 2px;text-align:center;background-color:#fafafa;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;box-sizing:border-box}.layui-form-pane .layui-input-inline{margin-left:-1px}.layui-form-pane .layui-input-block{margin-left:110px;left:-1px}.layui-form-pane .layui-input{border-radius:0 2px 2px 0}.layui-form-pane .layui-form-text .layui-form-label{float:none;width:100%;border-radius:2px;box-sizing:border-box;text-align:left}.layui-form-pane .layui-form-text .layui-input-inline{display:block;margin:0;top:-1px;clear:both}.layui-form-pane .layui-form-text .layui-input-block{margin:0;left:0;top:-1px}.layui-form-pane .layui-form-text .layui-textarea{min-height:100px;border-radius:0 0 2px 2px}.layui-form-pane .layui-form-checkbox{margin:4px 0 4px 10px}.layui-form-pane .layui-form-radio,.layui-form-pane .layui-form-switch{margin-top:6px;margin-left:10px}.layui-form-pane .layui-form-item[pane]{position:relative;border-width:1px;border-style:solid}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0;border-right-width:1px}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}@media screen and (max-width:450px){.layui-form-item .layui-form-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-form-item .layui-inline{display:block;margin-right:0;margin-bottom:20px;clear:both}.layui-form-item .layui-inline:after{content:'\20';clear:both;display:block;height:0}.layui-form-item .layui-input-inline{display:block;float:none;left:-3px;width:auto!important;margin:0 0 10px 112px}.layui-form-item .layui-input-inline+.layui-form-mid{margin-left:110px;top:-5px;padding:0}.layui-form-item .layui-form-checkbox{margin-right:5px;margin-bottom:5px}}.layui-laypage{display:inline-block;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>a:first-child,.layui-laypage>a:first-child em{border-radius:2px 0 0 2px}.layui-laypage>a:last-child,.layui-laypage>a:last-child em{border-radius:0 2px 2px 0}.layui-laypage>:first-child{margin-left:0!important}.layui-laypage>:last-child{margin-right:0!important}.layui-laypage a,.layui-laypage button,.layui-laypage input,.layui-laypage select,.layui-laypage span{border:1px solid #eee}.layui-laypage a,.layui-laypage span{display:inline-block;vertical-align:middle;padding:0 15px;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-laypage a[data-page]{color:#333}.layui-laypage a{text-decoration:none!important;cursor:pointer}.layui-laypage a:hover{color:#16baaa}.layui-laypage em{font-style:normal}.layui-laypage .layui-laypage-spr{color:#999;font-weight:700}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#16baaa}.layui-laypage-em{border-radius:2px}.layui-laypage-next em,.layui-laypage-prev em{font-family:Sim sun;font-size:16px}.layui-laypage .layui-laypage-count,.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh,.layui-laypage .layui-laypage-skip{margin-left:10px;margin-right:10px;padding:0;border:none}.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh{vertical-align:top}.layui-laypage .layui-laypage-refresh i{font-size:18px;cursor:pointer}.layui-laypage select{height:22px;padding:3px;border-radius:2px;cursor:pointer}.layui-laypage .layui-laypage-skip{height:30px;line-height:30px;color:#999}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box}.layui-laypage input{display:inline-block;width:40px;margin:0 10px;padding:0 3px;text-align:center}.layui-laypage input:focus,.layui-laypage select:focus{border-color:#16baaa!important}.layui-laypage button{margin-left:10px;padding:0 10px;cursor:pointer}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px;clear:both}.layui-flow-more a{height:32px;line-height:32px}.layui-flow-more a *{display:inline-block;vertical-align:top}.layui-flow-more a cite{padding:0 20px;border-radius:3px;background-color:#eee;color:#333;font-style:normal}.layui-flow-more a cite:hover{opacity:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-table{width:100%;margin:10px 0;background-color:#fff;color:#5f5f5f}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table th{text-align:left;font-weight:600}.layui-table-mend{background-color:#fff}.layui-table-click,.layui-table-hover,.layui-table[lay-even] tbody tr:nth-child(even){background-color:#f8f8f8}.layui-table-checked{background-color:#dbfbf0}.layui-table-checked.layui-table-click,.layui-table-checked.layui-table-hover{background-color:#abf8dd}.layui-table-disabled-transition *,.layui-table-disabled-transition :after,.layui-table-disabled-transition :before{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}.layui-table td,.layui-table th,.layui-table-col-set,.layui-table-fixed-r,.layui-table-grid-down,.layui-table-header,.layui-table-mend,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-total,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-width:1px;border-style:solid;border-color:#eee}.layui-table td,.layui-table th{position:relative;padding:9px 15px;min-height:20px;line-height:20px;font-size:14px}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border-width:0;border-bottom-width:1px}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border-width:0;border-right-width:1px}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-table img{max-width:100px}.layui-table[lay-size=lg] td,.layui-table[lay-size=lg] th{padding-top:15px;padding-right:30px;padding-bottom:15px;padding-left:30px}.layui-table-view .layui-table[lay-size=lg] .layui-table-cell{height:50px;line-height:40px}.layui-table[lay-size=sm] td,.layui-table[lay-size=sm] th{padding-top:5px;padding-right:10px;padding-bottom:5px;padding-left:10px;font-size:12px}.layui-table-view .layui-table[lay-size=sm] .layui-table-cell{height:30px;line-height:20px;padding-top:5px;padding-left:11px;padding-right:11px}.layui-table[lay-data],.layui-table[lay-options]{display:none}.layui-table-box{position:relative;overflow:hidden}.layui-table-view{clear:both;position:relative;border-right:none}.layui-table-view:after{content:"";position:absolute;top:0;right:0;width:1px;height:100%;background-color:#eee;z-index:101}.layui-table-view .layui-table{position:relative;width:auto;margin:0;border:0;border-collapse:separate}.layui-table-view .layui-table[lay-skin=line]{border-width:0;border-right-width:1px}.layui-table-view .layui-table[lay-skin=row]{border-width:0;border-bottom-width:1px}.layui-table-view .layui-table td,.layui-table-view .layui-table th{padding:0;border-top:none;border-left:none}.layui-table-view .layui-table th [lay-event],.layui-table-view .layui-table th.layui-unselect .layui-table-cell span{cursor:pointer}.layui-table-view .layui-table td,.layui-table-view .layui-table th span{cursor:default}.layui-table-view .layui-table td[data-edit]{cursor:text}.layui-table-view .layui-table td[data-edit]:hover:after{position:absolute;left:0;top:0;width:100%;height:100%;box-sizing:border-box;border:1px solid #16b777;pointer-events:none;content:""}.layui-table-view .layui-form-checkbox[lay-skin=primary] i{width:18px;height:18px;line-height:16px}.layui-table-view .layui-form-radio{line-height:0;padding:0}.layui-table-view .layui-form-radio>i{margin:0;font-size:20px}.layui-table-init{position:absolute;left:0;top:0;right:0;bottom:0;margin:0;z-index:199;transition:opacity .1s;user-select:none}.layui-table-loading-icon{position:absolute;width:100%\0;left:50%;left:auto\0;top:50%;margin-top:-15px\0;transform:translate(-50%,-50%);transform:none\0;text-align:center}.layui-table-loading-icon .layui-icon{font-size:30px;color:#c2c2c2}.layui-table-header{border-width:0;border-bottom-width:1px;overflow:hidden}.layui-table-header .layui-table{margin-bottom:-1px}.layui-table-column{position:relative;width:100%;min-height:41px;padding:8px 16px;border-width:0;border-bottom-width:1px}.layui-table-column .layui-btn-container{margin-bottom:-8px}.layui-table-column .layui-btn-container .layui-btn{margin-right:8px;margin-bottom:8px}.layui-table-tool .layui-inline[lay-event]{position:relative;width:26px;height:26px;padding:5px;line-height:16px;margin-right:10px;text-align:center;color:#333;border:1px solid #ccc;cursor:pointer;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool .layui-inline[lay-event]:hover{border:1px solid #999}.layui-table-tool-temp{padding-right:120px}.layui-table-tool-self{position:absolute;right:17px;top:10px}.layui-table-tool .layui-table-tool-self .layui-inline[lay-event]{margin:0 0 0 10px}.layui-table-tool-panel{position:absolute;top:29px;left:-1px;z-index:399;padding:5px 0!important;min-width:150px;min-height:40px;border:1px solid #d2d2d2;text-align:left;overflow-y:auto;background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-table-tool-panel li{padding:0 10px;margin:0!important;line-height:30px;list-style-type:none!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{width:100%}.layui-table-tool-panel li:hover{background-color:#f8f8f8}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{padding-left:28px}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] i{position:absolute;left:0;top:0}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] span{padding:0}.layui-table-tool .layui-table-tool-self .layui-table-tool-panel{left:auto;right:-1px}.layui-table-col-set{position:absolute;right:0;top:0;width:20px;height:100%;border-width:0;border-left-width:1px;background-color:#fff}.layui-table-sort{width:10px;height:20px;margin-left:5px;cursor:pointer!important}.layui-table-sort .layui-edge{position:absolute;left:5px;border-width:5px}.layui-table-sort .layui-table-sort-asc{top:3px;border-top:none;border-bottom-style:solid;border-bottom-color:#b2b2b2}.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color:#5f5f5f}.layui-table-sort .layui-table-sort-desc{bottom:5px;border-bottom:none;border-top-style:solid;border-top-color:#b2b2b2}.layui-table-sort .layui-table-sort-desc:hover{border-top-color:#5f5f5f}.layui-table-sort[lay-sort=asc] .layui-table-sort-asc{border-bottom-color:#000}.layui-table-sort[lay-sort=desc] .layui-table-sort-desc{border-top-color:#000}.layui-table-cell{height:38px;line-height:28px;padding:6px 15px;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;box-sizing:border-box}.layui-table-cell .layui-form-checkbox[lay-skin=primary]{top:-1px;padding:0}.layui-table-cell .layui-form-checkbox[lay-skin=primary]>div{padding-left:24px}.layui-table-cell .layui-table-link{color:#01aaed}.layui-table-cell .layui-btn{vertical-align:inherit}.layui-table-cell[align=center]{-webkit-box-pack:center}.layui-table-cell[align=right]{-webkit-box-pack:end}.laytable-cell-checkbox,.laytable-cell-numbers,.laytable-cell-radio,.laytable-cell-space{text-align:center;-webkit-box-pack:center}.layui-table-body{position:relative;overflow:auto;margin-bottom:-1px}.layui-table-body .layui-none{line-height:26px;padding:30px 15px;text-align:center;color:#999}.layui-table-fixed{position:absolute;left:0;top:0;z-index:101}.layui-table-fixed .layui-table-body{overflow:hidden}.layui-table-fixed-l{box-shadow:1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r{left:auto;right:0;border-width:0;border-left-width:1px;box-shadow:-1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r .layui-table-header{position:relative;overflow:visible}.layui-table-mend{position:absolute;right:-49px;top:0;height:100%;width:50px;border-width:0;border-left-width:1px}.layui-table-tool{position:relative;width:100%;min-height:50px;line-height:30px;padding:10px 15px;border-width:0;border-bottom-width:1px}.layui-table-tool .layui-btn-container{margin-bottom:-10px}.layui-table-total{margin-bottom:-1px;border-width:0;border-top-width:1px;overflow:hidden}.layui-table-page{border-width:0;border-top-width:1px;margin-bottom:-1px;white-space:nowrap;overflow:hidden}.layui-table-page>div{height:26px}.layui-table-page .layui-laypage{margin:0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span{height:26px;line-height:26px;margin-bottom:10px;border:none;background:0 0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span.layui-laypage-curr{padding:0 12px}.layui-table-page .layui-laypage span{margin-left:0;padding:0}.layui-table-page .layui-laypage .layui-laypage-prev{margin-left:-11px!important}.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left:0;top:0;padding:0}.layui-table-page .layui-laypage button,.layui-table-page .layui-laypage input{height:26px;line-height:26px}.layui-table-page .layui-laypage input{width:40px}.layui-table-page .layui-laypage button{padding:0 10px}.layui-table-page select{height:18px}.layui-table-pagebar{float:right;line-height:23px}.layui-table-pagebar .layui-btn-sm{margin-top:-1px}.layui-table-pagebar .layui-btn-xs{margin-top:2px}.layui-table-view select[lay-ignore]{display:inline-block}.layui-table-patch .layui-table-cell{padding:0;width:30px}.layui-table-edit{position:absolute;left:0;top:0;z-index:189;min-width:100%;min-height:100%;padding:5px 14px;border-radius:0;box-shadow:1px 1px 20px rgba(0,0,0,.15);background-color:#fff}.layui-table-edit:focus{border-color:#16b777!important}input.layui-input.layui-table-edit{height:100%}select.layui-table-edit{padding:0 0 0 10px;border-color:#d2d2d2}.layui-table-view .layui-form-checkbox,.layui-table-view .layui-form-radio,.layui-table-view .layui-form-switch{top:0;margin:0}.layui-table-view .layui-form-checkbox{top:-1px;height:26px;line-height:26px}.layui-table-view .layui-form-checkbox i{height:26px}.layui-table-grid .layui-table-cell{overflow:visible}.layui-table-grid-down{position:absolute;top:0;right:0;width:24px;height:100%;padding:5px 0;border-width:0;border-left-width:1px;text-align:center;background-color:#fff;color:#999;cursor:pointer}.layui-table-grid-down .layui-icon{position:absolute;top:50%;left:50%;margin:-8px 0 0 -8px;font-size:14px}.layui-table-grid-down:hover{background-color:#fbfbfb}.layui-table-expanded{height:95px}.layui-table-expanded .layui-table-cell,.layui-table-view .layui-table[lay-size=lg] .layui-table-expanded .layui-table-cell,.layui-table-view .layui-table[lay-size=sm] .layui-table-expanded .layui-table-cell{height:auto;max-height:94px;white-space:normal;text-overflow:clip}.layui-table-cell-c{position:absolute;bottom:-10px;right:50%;margin-right:-9px;width:20px;height:20px;line-height:18px;cursor:pointer;text-align:center;background-color:#fff;border:1px solid #eee;border-radius:50%;z-index:1000;transition:.3s all;font-size:14px}.layui-table-cell-c:hover{border-color:#16b777}.layui-table-expanded td:hover .layui-table-cell{overflow:auto}.layui-table-main>.layui-table>tbody>tr:last-child>td>.layui-table-cell-c{bottom:0}body .layui-table-tips .layui-layer-content{background:0 0;padding:0;box-shadow:0 1px 6px rgba(0,0,0,.12)}.layui-table-tips-main{margin:-49px 0 0 -1px;max-height:150px;padding:8px 15px;font-size:14px;overflow-y:scroll;background-color:#fff;color:#5f5f5f}.layui-table-tips-c{position:absolute;right:-3px;top:-13px;width:20px;height:20px;padding:3px;cursor:pointer;background-color:#5f5f5f;border-radius:50%;color:#fff}.layui-table-tips-c:hover{background-color:#777}.layui-table-tips-c:before{position:relative;right:-2px}.layui-table-tree-nodeIcon{max-width:20px}.layui-table-tree-nodeIcon>*{width:100%}.layui-table-tree-flexIcon,.layui-table-tree-nodeIcon{margin-right:2px}.layui-table-tree-flexIcon{cursor:pointer}.layui-upload-file{display:none!important;opacity:.01;filter:Alpha(opacity=1)}.layui-upload-list{margin:11px 0}.layui-upload-choose{max-width:200px;padding:0 10px;color:#999;font-size:14px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-upload-drag{position:relative;display:inline-block;padding:30px;border:1px dashed #e2e2e2;background-color:#fff;text-align:center;cursor:pointer;color:#999}.layui-upload-drag .layui-icon{font-size:50px;color:#16baaa}.layui-upload-drag[lay-over]{border-color:#16baaa}.layui-upload-form{display:inline-block}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-wrap{position:relative;display:inline-block;vertical-align:middle}.layui-upload-wrap .layui-upload-file{display:block!important;position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-btn-container .layui-upload-choose{padding-left:0}.layui-menu{position:relative;margin:5px 0;background-color:#fff;box-sizing:border-box}.layui-menu *{box-sizing:border-box}.layui-menu li,.layui-menu-body-title,.layui-menu-body-title a{padding:5px 15px;color:initial}.layui-menu li{position:relative;margin:0 0 1px;line-height:26px;color:rgba(0,0,0,.8);font-size:14px;white-space:nowrap;cursor:pointer;transition:all .3s}.layui-menu li:hover{background-color:#f8f8f8}.layui-menu li.layui-disabled,.layui-menu li.layui-disabled *{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important}.layui-menu-item-parent:hover>.layui-menu-body-panel{display:block;animation-name:layui-fadein;animation-duration:.3s;animation-fill-mode:both;animation-delay:.2s}.layui-menu-item-group>.layui-menu-body-title,.layui-menu-item-parent>.layui-menu-body-title{padding-right:38px}.layui-menu .layui-menu-item-divider:hover,.layui-menu .layui-menu-item-group:hover,.layui-menu .layui-menu-item-none:hover{background:0 0;cursor:default}.layui-menu .layui-menu-item-group>ul{margin:5px 0 -5px}.layui-menu .layui-menu-item-group>.layui-menu-body-title{color:rgba(0,0,0,.35);user-select:none}.layui-menu .layui-menu-item-none{color:rgba(0,0,0,.35);cursor:default}.layui-menu .layui-menu-item-none{text-align:center}.layui-menu .layui-menu-item-divider{margin:5px 0;padding:0;height:0;line-height:0;border-bottom:1px solid #eee;overflow:hidden}.layui-menu .layui-menu-item-down:hover,.layui-menu .layui-menu-item-up:hover{cursor:pointer}.layui-menu .layui-menu-item-up>.layui-menu-body-title{color:rgba(0,0,0,.8)}.layui-menu .layui-menu-item-up>ul{visibility:hidden;height:0;overflow:hidden}.layui-menu .layui-menu-item-down>.layui-menu-body-title>.layui-icon-down{transform:rotate(180deg)}.layui-menu .layui-menu-item-up>.layui-menu-body-title>.layui-icon-up{transform:rotate(-180deg)}.layui-menu .layui-menu-item-down:hover>.layui-menu-body-title>.layui-icon,.layui-menu .layui-menu-item-up>.layui-menu-body-title:hover>.layui-icon{color:#000}.layui-menu .layui-menu-item-down>ul{visibility:visible;height:auto}.layui-menu .layui-menu-item-checked,.layui-menu .layui-menu-item-checked2{background-color:#f8f8f8!important;color:#16b777}.layui-menu .layui-menu-item-checked a,.layui-menu .layui-menu-item-checked2 a{color:#16b777}.layui-menu .layui-menu-item-checked:after{position:absolute;right:-1px;top:0;bottom:0;border-right:3px solid #16b777;content:""}.layui-menu-body-title{position:relative;margin:-5px -15px;overflow:hidden;text-overflow:ellipsis}.layui-menu-body-title a{display:block;margin:-5px -15px;color:rgba(0,0,0,.8)}.layui-menu-body-title a:hover{transition:all .3s}.layui-menu-body-title>.layui-icon{position:absolute;right:15px;top:50%;margin-top:-6px;line-height:normal;font-size:14px;transition:all .2s;-webkit-transition:all .2s}.layui-menu-body-title>.layui-icon:hover{transition:all .3s}.layui-menu-body-title>.layui-icon-right{right:14px}.layui-menu-body-panel{display:none;position:absolute;top:-7px;left:100%;z-index:1000;margin-left:13px;padding:5px 0}.layui-menu-body-panel:before{content:"";position:absolute;width:20px;left:-16px;top:0;bottom:0}.layui-menu-body-panel-left{left:auto;right:100%;margin:0 13px 0}.layui-menu-body-panel-left:before{left:auto;right:-16px}.layui-menu-lg li{line-height:32px}.layui-menu-lg .layui-menu-body-title a:hover,.layui-menu-lg li:hover{background:0 0;color:#16b777}.layui-menu-lg li .layui-menu-body-panel{margin-left:14px}.layui-menu-lg li .layui-menu-body-panel-left{margin:0 15px 0}.layui-dropdown{position:absolute;left:-999999px;top:-999999px;z-index:77777777;margin:5px 0;min-width:100px}.layui-dropdown:before{content:"";position:absolute;width:100%;height:6px;left:0;top:-6px}.layui-dropdown-shade{top:0;left:0;width:100%;height:100%;position:fixed;pointer-events:auto}.layui-tabs{position:relative}.layui-tabs.layui-hide-v{overflow:hidden}.layui-tabs-header{position:relative;left:0;height:40px;padding:0!important;white-space:nowrap;font-size:0;transition:all .16s;-webkit-transition:all .16s}.layui-tabs-header:after,.layui-tabs-scroll:after{content:"";position:absolute;left:0;bottom:0;z-index:0;width:100%;border-bottom:1px solid #eee}.layui-tabs-header li{position:relative;display:inline-block;vertical-align:middle;line-height:40px;margin:0!important;padding:0 16px;text-align:center;cursor:pointer;font-size:14px;transition:all .16s;-webkit-transition:all .16s}.layui-tabs-header li:first-child{margin-left:0}.layui-tabs-header li a{display:block;padding:0 16px;margin:0 -16px;color:inherit}.layui-tabs-header li a:hover{text-decoration:none}.layui-tabs-header .layui-this,.layui-tabs-header li:hover{color:#16baaa}.layui-tabs-header .layui-this:after{content:"";position:absolute;left:0;top:0;z-index:1;width:100%;height:100%;border-bottom:3px solid #16baaa;box-sizing:border-box;pointer-events:none}.layui-tabs-header .layui-badge,.layui-tabs-header .layui-badge-dot{left:5px;top:-1px}.layui-tabs-scroll{position:relative;overflow:hidden;padding:0 40px}.layui-tabs-scroll .layui-tabs-header:after{display:none;content:none;border:0}.layui-tabs-bar .layui-icon{position:absolute;left:0;top:0;z-index:3;width:40px;height:100%;line-height:40px;border:1px solid #eee;text-align:center;cursor:pointer;box-sizing:border-box;background-color:#fff;box-shadow:2px 0 5px 0 rgb(0 0 0 / 6%)}.layui-tabs-bar .layui-icon-next{left:auto;right:0;box-shadow:-2px 0 5px 0 rgb(0 0 0 / 6%)}.layui-tabs-header li .layui-tabs-close{position:relative;display:inline-block;width:16px;height:16px;line-height:18px;margin-left:8px;top:0;text-align:center;font-size:12px;color:#959595;border-radius:50%;font-weight:700;transition:all .16s;-webkit-transition:all .16s}.layui-tabs-header li .layui-tabs-close:hover{background-color:#ff5722;color:#fff}.layui-tabs-header li[lay-closable=false] .layui-tabs-close{display:none}.layui-tabs-body{padding:16px 0}.layui-tabs-item{display:none}.layui-tabs-card>.layui-tabs-header .layui-this{background-color:#fff}.layui-tabs-card>.layui-tabs-header .layui-this:after{border:1px solid #eee;border-bottom-color:#fff;border-radius:2px 2px 0 0}.layui-tabs-card>.layui-tabs-header li:first-child.layui-this:after{margin-left:-1px}.layui-tabs-card>.layui-tabs-header li:last-child.layui-this:after{margin-right:-1px}.layui-tabs-card.layui-panel>.layui-tabs-header .layui-this:after{border-top:0;border-radius:0}.layui-tabs-card.layui-panel>.layui-tabs-body{padding:16px}.layui-nav{position:relative;padding:0 15px;background-color:#2f363c;color:#fff;border-radius:2px;font-size:0;box-sizing:border-box}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;margin-top:0;list-style:none;vertical-align:middle;line-height:60px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#fff;color:rgba(255,255,255,.7);transition:all .3s;-webkit-transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar{content:"";position:absolute;left:0;top:0;width:0;height:3px;background-color:#16b777;transition:all .2s;-webkit-transition:all .2s;pointer-events:none}.layui-nav-bar{z-index:1000}.layui-nav[lay-bar=disabled] .layui-nav-bar{display:none}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff;text-decoration:none}.layui-nav .layui-this:after{top:auto;bottom:0;width:100%}.layui-nav-img{width:30px;height:30px;margin-right:10px;border-radius:50%}.layui-nav .layui-nav-more{position:absolute;top:0;right:3px;left:auto!important;margin-top:0;font-size:12px;cursor:pointer;transition:all .2s;-webkit-transition:all .2s}.layui-nav .layui-nav-mored,.layui-nav-itemed>a .layui-nav-more{transform:rotate(180deg)}.layui-nav-child{display:none;position:absolute;left:0;top:65px;min-width:100%;line-height:36px;padding:5px 0;box-shadow:0 2px 4px rgba(0,0,0,.12);border:1px solid #eee;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap;box-sizing:border-box}.layui-nav .layui-nav-child a{color:#5f5f5f;color:rgba(0,0,0,.8)}.layui-nav .layui-nav-child a:hover{background-color:#f8f8f8;color:rgba(0,0,0,.8)}.layui-nav-child dd{margin:1px 0;position:relative}.layui-nav-child dd.layui-this{background-color:#f8f8f8;color:#000}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-child-r{left:auto;right:0}.layui-nav-child-c{text-align:center}.layui-nav.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:40px}.layui-nav-tree .layui-nav-item a{position:relative;height:40px;line-height:40px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item>a{padding-top:5px;padding-bottom:5px}.layui-nav-tree .layui-nav-more{right:15px}.layui-nav-tree .layui-nav-item>a .layui-nav-more{padding:5px 0}.layui-nav-tree .layui-nav-bar{width:5px;height:0}.layui-side .layui-nav-tree .layui-nav-bar{width:2px}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-nav-child dd.layui-this a,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#16baaa;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{color:#fff!important}.layui-nav-tree .layui-nav-bar{background-color:#16baaa}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;background:0 0;background-color:rgba(0,0,0,.3);box-shadow:none}.layui-nav-tree .layui-nav-child dd{margin:0}.layui-nav-tree .layui-nav-child a{color:#fff;color:rgba(255,255,255,.7)}.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-itemed>.layui-nav-child,.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display:block}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-nav-tree.layui-bg-gray a,.layui-nav.layui-bg-gray .layui-nav-item a{color:#373737;color:rgba(0,0,0,.8)}.layui-nav-tree.layui-bg-gray .layui-nav-itemed>a{color:#000!important}.layui-nav.layui-bg-gray .layui-this a{color:#16b777}.layui-nav-tree.layui-bg-gray .layui-nav-child{padding-left:11px;background:0 0}.layui-nav-tree.layui-bg-gray .layui-nav-child dd.layui-this,.layui-nav-tree.layui-bg-gray .layui-nav-child dd.layui-this a,.layui-nav-tree.layui-bg-gray .layui-this,.layui-nav-tree.layui-bg-gray .layui-this>a{background:0 0!important;color:#16b777!important;font-weight:700}.layui-nav-tree.layui-bg-gray .layui-nav-bar{background-color:#16b777}.layui-breadcrumb{visibility:hidden;font-size:0}.layui-breadcrumb>*{font-size:14px}.layui-breadcrumb a{color:#999!important}.layui-breadcrumb a:hover{color:#16b777!important}.layui-breadcrumb a cite{color:#5f5f5f;font-style:normal}.layui-breadcrumb span[lay-separator]{margin:0 10px;color:#999}.layui-tab{margin:10px 0;text-align:left!important}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab .layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;transition:all .2s;-webkit-transition:all .2s}.layui-tab .layui-tab-title:after{content:"";border-bottom-color:#eee;border-bottom-width:1px;border-style:none none solid;bottom:0;left:0;right:auto;top:auto;pointer-events:none;position:absolute;width:100%;z-index:8}.layui-tab .layui-tab-title li{display:inline-block;vertical-align:middle;font-size:14px;transition:all .2s;-webkit-transition:all .2s}.layui-tab .layui-tab-title li{position:relative;line-height:40px;min-width:65px;margin:0;padding:0 15px;text-align:center;cursor:pointer}.layui-tab .layui-tab-title li a{display:block;padding:0 15px;margin:0 -15px}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:"";width:100%;height:40px;border-width:1px;border-bottom-width:1px;border-style:solid;border-bottom-color:#fff;border-radius:2px 2px 0 0;box-sizing:border-box;pointer-events:none;z-index:9}.layui-tab-bar{box-sizing:border-box;position:absolute;right:0;top:0;z-index:10;width:30px;height:40px;line-height:40px;border-width:1px;border-style:solid;border-radius:2px;text-align:center;background-color:#fff;cursor:pointer}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item{display:none}.layui-tab-more{padding-right:30px;height:auto!important;white-space:normal!important}.layui-tab-more li.layui-this:after{border-bottom-color:#eee;border-radius:2px}.layui-tab-more .layui-tab-bar .layui-icon{top:-2px;top:3px\0;-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root .layui-tab-more .layui-tab-bar .layui-icon{top:-2px\0/IE9}.layui-tab-content{padding:15px 0}.layui-tab-title li .layui-tab-close{position:relative;display:inline-block;width:18px;height:18px;line-height:20px;margin-left:8px;top:1px;text-align:center;font-size:14px;color:#c2c2c2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li .layui-tab-close:hover{border-radius:2px;background-color:#ff5722;color:#fff}.layui-tab-brief>.layui-tab-title .layui-this{color:#16baaa}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after{border:none;border-radius:0;border-bottom:2px solid #16b777}.layui-tab-card{border-width:1px;border-style:solid;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#fafafa}.layui-tab-card>.layui-tab-title li{margin-right:-1px;margin-left:-1px}.layui-tab-card>.layui-tab-title .layui-this{background-color:#fff}.layui-tab-card>.layui-tab-title .layui-this:after{border-top:none;border-width:1px;border-bottom-color:#fff}.layui-tab-card>.layui-tab-title .layui-tab-bar{height:40px;line-height:40px;border-radius:0;border-top:none;border-right:none}.layui-tab-card>.layui-tab-more .layui-this{background:0 0;color:#16b777}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-timeline{padding-left:5px}.layui-timeline-item{position:relative;padding-bottom:20px}.layui-timeline-axis{position:absolute;left:-5px;top:0;z-index:10;width:20px;height:20px;line-height:20px;background-color:#fff;color:#16b777;border-radius:50%;text-align:center;cursor:pointer}.layui-timeline-axis:hover{color:#ff5722}.layui-timeline-item:before{content:"";position:absolute;left:5px;top:0;z-index:0;width:1px;height:100%}.layui-timeline-item:first-child:before{display:block}.layui-timeline-item:last-child:before{display:none}.layui-timeline-content{padding-left:25px}.layui-timeline-title{position:relative;margin-bottom:10px;line-height:22px}.layui-badge,.layui-badge-dot,.layui-badge-rim{position:relative;display:inline-block;padding:0 6px;font-size:12px;text-align:center;background-color:#ff5722;color:#fff;border-radius:2px}.layui-badge{height:18px;line-height:18px}.layui-badge-dot{width:8px;height:8px;padding:0;border-radius:50%}.layui-badge-rim{height:18px;line-height:18px;border-width:1px;border-style:solid;background-color:#fff;color:#5f5f5f}.layui-btn .layui-badge,.layui-btn .layui-badge-dot{margin-left:5px}.layui-nav .layui-badge,.layui-nav .layui-badge-dot{position:absolute;top:50%;margin:-5px 6px 0}.layui-nav .layui-badge{margin-top:-10px}.layui-tab-title .layui-badge,.layui-tab-title .layui-badge-dot{left:5px;top:-2px}.layui-carousel{position:relative;left:0;top:0;background-color:#f8f8f8}.layui-carousel>[carousel-item]{position:relative;width:100%;height:100%;overflow:hidden}.layui-carousel>[carousel-item]:before{position:absolute;content:'\e63d';left:50%;top:50%;width:100px;line-height:20px;margin:-10px 0 0 -50px;text-align:center;color:#c2c2c2;font-family:layui-icon!important;font-size:30px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-carousel>[carousel-item]>*{display:none;position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f8f8f8;transition-duration:.3s;-webkit-transition-duration:.3s}.layui-carousel-updown>*{-webkit-transition:.3s ease-in-out up;transition:.3s ease-in-out up}.layui-carousel-arrow{display:none\0;opacity:0;position:absolute;left:10px;top:50%;margin-top:-18px;width:36px;height:36px;line-height:36px;text-align:center;font-size:20px;border:none 0;border-radius:50%;background-color:rgba(0,0,0,.2);color:#fff;-webkit-transition-duration:.3s;transition-duration:.3s;cursor:pointer}.layui-carousel-arrow[lay-type=add]{left:auto!important;right:10px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow{opacity:1;left:20px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel[lay-arrow=none] .layui-carousel-arrow{display:none}.layui-carousel-arrow:hover,.layui-carousel-ind ul:hover{background-color:rgba(0,0,0,.35)}.layui-carousel:hover .layui-carousel-arrow{display:block\0;opacity:1;left:20px}.layui-carousel:hover .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel-ind{position:relative;top:-35px;width:100%;line-height:0!important;text-align:center;font-size:0}.layui-carousel[lay-indicator=outside]{margin-bottom:30px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind{top:10px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind ul{background-color:rgba(0,0,0,.5)}.layui-carousel[lay-indicator=none] .layui-carousel-ind{display:none}.layui-carousel-ind ul{display:inline-block;padding:5px;background-color:rgba(0,0,0,.2);border-radius:10px;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind ul li{display:inline-block;width:10px;height:10px;margin:0 3px;font-size:14px;background-color:#eee;background-color:rgba(255,255,255,.5);border-radius:50%;cursor:pointer;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind ul li:hover{background-color:rgba(255,255,255,.7)}.layui-carousel-ind ul li.layui-this{background-color:#fff}.layui-carousel>[carousel-item]>.layui-carousel-next,.layui-carousel>[carousel-item]>.layui-carousel-prev,.layui-carousel>[carousel-item]>.layui-this{display:block}.layui-carousel>[carousel-item]>.layui-this{-webkit-transform:translateX(0);transform:translateX(0)}.layui-carousel>[carousel-item]>.layui-carousel-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}.layui-carousel>[carousel-item]>.layui-carousel-next{-webkit-transform:translateX(100%);transform:translateX(100%)}.layui-carousel>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel>[carousel-item]>.layui-carousel-prev.layui-carousel-right{-webkit-transform:translateX(0);transform:translateX(0)}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-left{-webkit-transform:translateX(-100%);transform:translateX(-100%)}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-right{-webkit-transform:translateX(100%);transform:translateX(100%)}.layui-carousel[lay-anim=updown] .layui-carousel-arrow{left:50%!important;top:20px;margin:0 0 0 -18px}.layui-carousel[lay-anim=updown] .layui-carousel-arrow[lay-type=add]{top:auto!important;bottom:20px}.layui-carousel[lay-anim=updown] .layui-carousel-ind{position:absolute;top:50%;right:20px;width:auto;height:auto}.layui-carousel[lay-anim=updown] .layui-carousel-ind ul{padding:3px 5px}.layui-carousel[lay-anim=updown] .layui-carousel-ind li{display:block;margin:6px 0}.layui-carousel[lay-anim=updown]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this{-webkit-transform:translateY(0);transform:translateY(0)}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev{-webkit-transform:translateY(-100%);transform:translateY(-100%)}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next{-webkit-transform:translateY(100%);transform:translateY(100%)}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{-webkit-transform:translateY(0);transform:translateY(0)}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-left{-webkit-transform:translateY(-100%);transform:translateY(-100%)}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-right{-webkit-transform:translateY(100%);transform:translateY(100%)}.layui-carousel[lay-anim=fade]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev{opacity:0}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{opacity:1}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-right{opacity:0}.layui-fixbar{position:fixed;right:16px;bottom:16px;z-index:999999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;text-align:center;cursor:pointer;font-size:30px;background-color:#9f9f9f;color:#fff;border-radius:2px;opacity:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}body .layui-util-face .layui-layer-content{padding:0;background-color:#fff;color:#5f5f5f;box-shadow:none}.layui-util-face .layui-layer-TipsG{display:none}.layui-util-face ul{position:relative;width:372px;padding:10px;border:1px solid #d9d9d9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-util-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-code{display:block;position:relative;padding:15px;line-height:20px;border:1px solid #eee;border-left-width:6px;background-color:#fff;color:#333;font-family:"Courier New",Consolas,"Lucida Console",monospace;font-size:12px}.layui-transfer-box,.layui-transfer-header,.layui-transfer-search{border-width:0;border-style:solid;border-color:#eee}.layui-transfer-box{position:relative;display:inline-block;vertical-align:middle;border-width:1px;width:200px;height:360px;border-radius:2px;background-color:#fff}.layui-transfer-box .layui-form-checkbox{width:100%;margin:0!important}.layui-transfer-header{height:38px;line-height:38px;padding:0 11px;border-bottom-width:1px}.layui-transfer-search{position:relative;padding:11px;border-bottom-width:1px}.layui-transfer-search .layui-input{height:32px;padding-left:30px;font-size:12px}.layui-transfer-search .layui-icon-search{position:absolute;left:20px;top:50%;line-height:normal;margin-top:-8px;color:#5f5f5f}.layui-transfer-active{margin:0 15px;display:inline-block;vertical-align:middle}.layui-transfer-active .layui-btn{display:block;margin:0;padding:0 15px;background-color:#16b777;border-color:#16b777;color:#fff}.layui-transfer-active .layui-btn-disabled{background-color:#fbfbfb;border-color:#eee;color:#d2d2d2}.layui-transfer-active .layui-btn:first-child{margin-bottom:15px}.layui-transfer-active .layui-btn .layui-icon{margin:0;font-size:14px!important}.layui-transfer-data{padding:5px 0;overflow:auto}.layui-transfer-data li{height:32px;line-height:32px;margin-top:0!important;padding:0 11px;list-style-type:none!important}.layui-transfer-data li:hover{background-color:#f8f8f8;transition:.5s all}.layui-transfer-data .layui-none{padding:15px 11px;text-align:center;color:#999}.layui-rate,.layui-rate *{display:inline-block;vertical-align:middle}.layui-rate{padding:11px 6px 11px 0;font-size:0}.layui-rate li{margin-top:0!important}.layui-rate li i.layui-icon{font-size:20px;color:#ffb800}.layui-rate li i.layui-icon{margin-right:5px;transition:all .3s;-webkit-transition:all .3s}.layui-rate li i:hover,.layui-rate-hover{cursor:pointer;transform:scale(1.12);-webkit-transform:scale(1.12)}.layui-rate[readonly] li i:hover{cursor:default;transform:scale(1)}.layui-colorpicker{width:38px;height:38px;border:1px solid #eee;padding:5px;border-radius:2px;line-height:24px;display:inline-block;cursor:pointer;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-colorpicker:hover{border-color:#d2d2d2}.layui-colorpicker.layui-colorpicker-lg{width:44px;height:44px;line-height:30px}.layui-colorpicker.layui-colorpicker-sm{width:30px;height:30px;line-height:20px;padding:3px}.layui-colorpicker.layui-colorpicker-xs{width:22px;height:22px;line-height:16px;padding:1px}.layui-colorpicker-trigger-bgcolor{display:block;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);border-radius:2px}.layui-colorpicker-trigger-span{display:block;height:100%;box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:2px;text-align:center}.layui-colorpicker-trigger-i{display:inline-block;color:#fff;font-size:12px}.layui-colorpicker-trigger-i.layui-icon-close{color:#999}.layui-colorpicker-main{position:absolute;left:-999999px;top:-999999px;z-index:77777777;width:280px;margin:5px 0;padding:7px;background:#fff;border:1px solid #d2d2d2;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-colorpicker-main-wrapper{height:180px;position:relative}.layui-colorpicker-basis{width:260px;height:100%;position:relative;overflow:hidden}.layui-colorpicker-basis-white{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.layui-colorpicker-basis-black{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(0deg,#000,transparent)}.layui-colorpicker-basis-cursor{width:10px;height:10px;border:1px solid #fff;border-radius:50%;position:absolute;top:0;right:100%;cursor:pointer;transform:translate(-50%,-50%)}.layui-colorpicker-side{position:absolute;top:0;right:0;width:12px;height:100%;background:linear-gradient(red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.layui-colorpicker-side-slider{width:100%;height:5px;box-shadow:0 0 1px #888;box-sizing:border-box;background:#fff;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;left:0}.layui-colorpicker-main-alpha{display:none;height:12px;margin-top:7px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-alpha-bgcolor{height:100%;position:relative}.layui-colorpicker-alpha-slider{width:5px;height:100%;box-shadow:0 0 1px #888;box-sizing:border-box;background:#fff;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;top:0}.layui-colorpicker-main-pre{padding-top:7px;font-size:0}.layui-colorpicker-pre{width:20px;height:20px;border-radius:2px;display:inline-block;margin-left:6px;margin-bottom:7px;cursor:pointer}.layui-colorpicker-pre:nth-child(11n+1){margin-left:0}.layui-colorpicker-pre-isalpha{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-pre.layui-this{box-shadow:0 0 3px 2px rgba(0,0,0,.15)}.layui-colorpicker-pre>div{height:100%;border-radius:2px}.layui-colorpicker-main-input{text-align:right;padding-top:7px}.layui-colorpicker-main-input .layui-btn-container .layui-btn{margin:0 0 0 10px}.layui-colorpicker-main-input div.layui-inline{float:left;font-size:14px}.layui-colorpicker-main-input input.layui-input{width:168px;height:30px;color:#5f5f5f;padding-left:5px}.layui-slider{height:4px;background:#eee;border-radius:3px;position:relative;cursor:pointer}.layui-slider-bar{border-radius:3px;position:absolute;height:100%}.layui-slider-step{position:absolute;top:0;width:4px;height:4px;border-radius:50%;background:#fff;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.layui-slider-wrap{width:36px;height:36px;position:absolute;top:-16px;-webkit-transform:translateX(-50%);transform:translateX(-50%);z-index:10;text-align:center}.layui-slider-wrap-btn{width:12px;height:12px;border-radius:50%;background:#fff;display:inline-block;vertical-align:middle;cursor:pointer;transition:.3s}.layui-slider-wrap:after{content:"";height:100%;display:inline-block;vertical-align:middle}.layui-slider-wrap-btn.layui-slider-hover,.layui-slider-wrap-btn:hover{transform:scale(1.2)}.layui-slider-wrap-btn.layui-disabled:hover{transform:scale(1)!important}.layui-slider-tips{position:absolute;top:-42px;z-index:77777777;white-space:nowrap;-webkit-transform:translateX(-50%);transform:translateX(-50%);color:#fff;background:#000;border-radius:3px;height:25px;line-height:25px;padding:0 10px}.layui-slider-tips:after{content:"";position:absolute;bottom:-12px;left:50%;margin-left:-6px;width:0;height:0;border-width:6px;border-style:solid;border-color:#000 transparent transparent transparent}.layui-slider-input{width:70px;height:32px;border:1px solid #eee;border-radius:3px;font-size:16px;line-height:32px;position:absolute;right:0;top:-14px;box-sizing:border-box}.layui-slider-input-btn{position:absolute;top:0;right:0;width:20px;height:100%;border-left:1px solid #eee}.layui-slider-input-btn i{cursor:pointer;position:absolute;right:0;bottom:0;width:20px;height:50%;font-size:12px;line-height:16px;text-align:center;color:#999}.layui-slider-input-btn i:first-child{top:0;border-bottom:1px solid #eee}.layui-slider-input-txt{height:100%;font-size:14px}.layui-slider-input-txt input{height:100%;border:none;padding-right:21px}.layui-slider-input-btn i:hover{color:#16baaa}.layui-slider-vertical{width:4px;margin-left:33px}.layui-slider-vertical .layui-slider-bar{width:4px}.layui-slider-vertical .layui-slider-step{top:auto;left:0;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-wrap{top:auto;left:-16px;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-tips{top:auto;left:2px}@media \0screen{.layui-slider-wrap-btn{margin-left:-20px}.layui-slider-vertical .layui-slider-wrap-btn{margin-left:0;margin-bottom:-20px}.layui-slider-vertical .layui-slider-tips{margin-left:-8px}.layui-slider>span{margin-left:8px}}.layui-tree{line-height:22px}.layui-tree .layui-form-checkbox{margin:0!important}.layui-tree-set{width:100%;position:relative}.layui-tree-pack{display:none;padding-left:20px;position:relative}.layui-tree-line .layui-tree-pack{padding-left:27px}.layui-tree-line .layui-tree-set .layui-tree-set:after{content:"";position:absolute;top:14px;left:-9px;width:17px;height:0;border-top:1px dotted #c0c4cc}.layui-tree-entry{position:relative;padding:3px 0;height:26px;white-space:nowrap}.layui-tree-entry:hover{background-color:#eee}.layui-tree-line .layui-tree-entry:hover{background-color:rgba(0,0,0,0)}.layui-tree-line .layui-tree-entry:hover .layui-tree-txt{color:#999;text-decoration:underline;transition:.3s}.layui-tree-main{display:inline-block;vertical-align:middle;cursor:pointer;padding-right:10px}.layui-tree-line .layui-tree-set:before{content:"";position:absolute;top:0;left:-9px;width:0;height:100%;border-left:1px dotted #c0c4cc}.layui-tree-line .layui-tree-set.layui-tree-setLineShort:before{height:13px}.layui-tree-line .layui-tree-set.layui-tree-setHide:before{height:0}.layui-tree-iconClick{display:inline-block;vertical-align:middle;position:relative;height:20px;line-height:20px;margin:0 10px;color:#c0c4cc}.layui-tree-icon{height:14px;line-height:12px;width:14px;text-align:center;border:1px solid #c0c4cc}.layui-tree-iconClick .layui-icon{font-size:18px}.layui-tree-icon .layui-icon{font-size:12px;color:#5f5f5f}.layui-tree-iconArrow{padding:0 5px}.layui-tree-iconArrow:after{content:"";position:absolute;left:4px;top:3px;z-index:100;width:0;height:0;border-width:5px;border-style:solid;border-color:transparent transparent transparent #c0c4cc;transition:.5s}.layui-tree-spread>.layui-tree-entry .layui-tree-iconClick>.layui-tree-iconArrow:after{transform:rotate(90deg) translate(3px,4px)}.layui-tree-txt{display:inline-block;vertical-align:middle;color:#555}.layui-tree-search{margin-bottom:15px;color:#5f5f5f}.layui-tree-btnGroup{visibility:hidden;display:inline-block;vertical-align:middle;position:relative}.layui-tree-btnGroup .layui-icon{display:inline-block;vertical-align:middle;padding:0 2px;cursor:pointer}.layui-tree-btnGroup .layui-icon:hover{color:#999;transition:.3s}.layui-tree-entry:hover .layui-tree-btnGroup{visibility:visible}.layui-tree-editInput{position:relative;display:inline-block;vertical-align:middle;height:20px;line-height:20px;padding:0;border:none;background-color:rgba(0,0,0,.05)}.layui-tree-emptyText{text-align:center;color:#999}.layui-anim{-webkit-animation-duration:.3s;-webkit-animation-fill-mode:both;animation-duration:.3s;animation-fill-mode:both}.layui-anim.layui-icon{display:inline-block}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.layui-trans,.layui-trans a{transition:all .2s;-webkit-transition:all .2s}@-webkit-keyframes layui-rotate{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes layui-rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}.layui-anim-rotate{-webkit-animation-name:layui-rotate;animation-name:layui-rotate;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes layui-up{from{-webkit-transform:translate3d(0,100%,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-up{from{transform:translate3d(0,100%,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-up{-webkit-animation-name:layui-up;animation-name:layui-up}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,15px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,15px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@keyframes layui-down{0%{opacity:.3;transform:translate3d(0,-100%,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-down{animation-name:layui-down}@keyframes layui-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-downbit{animation-name:layui-downbit}@-webkit-keyframes layui-scale{0%{opacity:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.3;-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scale{-webkit-animation-name:layui-scale;animation-name:layui-scale}@-webkit-keyframes layui-scale-spring{0%{opacity:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;transform:scale(.5)}80%{opacity:.8;transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@keyframes layui-scalesmall{0%{opacity:.3;transform:scale(1.5)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall{animation-name:layui-scalesmall}@keyframes layui-scalesmall-spring{0%{opacity:.3;transform:scale(1.5)}80%{opacity:.8;transform:scale(.9)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall-spring{animation-name:layui-scalesmall-spring}@-webkit-keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}@keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}.layui-anim-fadein{-webkit-animation-name:layui-fadein;animation-name:layui-fadein}@-webkit-keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}.layui-anim-fadeout{-webkit-animation-name:layui-fadeout;animation-name:layui-fadeout}html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-wrap{font-size:13px;font-family:"Courier New",Consolas,"Lucida Console",monospace}.layui-code-view{display:block;position:relative;padding:0!important;border:1px solid #eee;border-left-width:6px;background-color:#fff;color:#333}.layui-code-view pre{margin:0!important}.layui-code-header{position:relative;z-index:3;padding:0 11px;height:40px;line-height:40px;border-bottom:1px solid #eee;background-color:#fafafa;font-size:12px}.layui-code-header>.layui-code-header-about{position:absolute;right:11px;top:0;color:#b7b7b7}.layui-code-header-about>a{padding-left:10px}.layui-code-wrap{position:relative;display:block;z-index:1;margin:0!important;padding:11px 0!important;overflow-x:hidden;overflow-y:auto}.layui-code-line{position:relative;line-height:19px;margin:0!important}.layui-code-line-number{position:absolute;left:0;top:0;padding:0 8px;min-width:45px;height:100%;text-align:right;user-select:none;white-space:nowrap;overflow:hidden}.layui-code-line-content{padding:0 11px;word-wrap:break-word;white-space:pre-wrap}.layui-code-ln-mode>.layui-code-wrap>.layui-code-line{padding-left:45px}.layui-code-ln-side{position:absolute;left:0;top:0;bottom:0;z-index:0;width:45px;border-right:1px solid #eee;border-color:rgb(126 122 122 / 15%);background-color:#fafafa;pointer-events:none}.layui-code-nowrap>.layui-code-wrap{overflow:auto}.layui-code-nowrap>.layui-code-wrap>.layui-code-line>.layui-code-line-content{white-space:pre;word-wrap:normal}.layui-code-nowrap>.layui-code-ln-side{border-right-width:0!important;background:0 0!important}.layui-code-fixbar{position:absolute;top:8px;right:11px;padding-right:45px;z-index:5}.layui-code-fixbar>span{position:absolute;right:0;top:0;padding:0 8px;color:#777;transition:all .3s}.layui-code-fixbar>span:hover{color:#16b777}.layui-code-copy{display:none;cursor:pointer}.layui-code-preview>.layui-code-view>.layui-code-fixbar .layui-code-copy{display:none!important}.layui-code-view:hover>.layui-code-fixbar .layui-code-copy{display:block}.layui-code-view:hover>.layui-code-fixbar .layui-code-lang-marker{display:none}.layui-code-theme-dark,.layui-code-theme-dark>.layui-code-header{border-color:rgb(126 122 122 / 15%);background-color:#1f1f1f}.layui-code-theme-dark{border-width:1px;color:#ccc}.layui-code-theme-dark>.layui-code-ln-side{border-right-color:#2a2a2a;background:0 0;color:#6e7681}.layui-code textarea{display:none}.layui-code-preview>.layui-code,.layui-code-preview>.layui-code-view{margin:0}.layui-code-preview>.layui-tab{position:relative;z-index:1;margin-bottom:0}.layui-code-preview .layui-code-item{display:none;border-top-width:0}.layui-code-item-preview{position:relative;padding:16px}.layui-code-item-preview>iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:none}.layui-code-tools{position:absolute;right:11px;top:8px;line-height:normal}.layui-code-tools>i{display:inline-block;margin-left:6px;padding:3px;cursor:pointer}.layui-code-tools>i.layui-icon-file-b{color:#999}.layui-code-tools>i:hover{color:#16b777}.layui-code-full{position:fixed;left:0;top:0;z-index:1111111;width:100%;height:100%;background-color:#fff}.layui-code-full .layui-code-item{width:100%!important;border-width:0!important}.layui-code-full .layui-code-item,.layui-code-full .layui-code-view,.layui-code-full .layui-code-wrap{height:calc(100vh - 51px)!important;box-sizing:border-box}.layui-code-full .layui-code-item-preview{overflow:auto}.layui-code-view.layui-code-hl{line-height:20px!important;border-left-width:1px}.layui-code-view.layui-code-hl>.layui-code-ln-side{background-color:transparent}.layui-code-theme-dark.layui-code-hl,.layui-code-theme-dark.layui-code-hl>.layui-code-ln-side{border-color:rgb(126 122 122 / 15%)}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate,.layui-laydate *{box-sizing:border-box}.layui-laydate{position:absolute;z-index:99999999;margin:5px 0;border-radius:2px;font-size:14px;line-height:normal;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}.layui-laydate-shade{top:0;left:0;width:100%;height:100%;position:fixed;pointer-events:auto}@keyframes laydate-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-laydate{animation-name:laydate-downbit}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;padding:0 5px;color:#999;font-size:18px;cursor:pointer}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;box-sizing:border-box;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-set-ym span{padding:0 10px;cursor:pointer}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:0;text-align:center}.layui-laydate-content th{font-weight:400}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.laydate-day-holidays:before{position:absolute;left:0;top:0;font-size:12px;transform:scale(.7)}.laydate-day-holidays:before{content:'\4F11';color:#ff5722}.laydate-day-holidays[type=workdays]:before{content:'\73ED';color:inherit}.layui-laydate .layui-this .laydate-day-holidays:before{color:#fff}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px}.layui-laydate-footer span{display:inline-block;vertical-align:top;height:26px;line-height:24px;padding:0 10px;border:1px solid #c9c9c9;border-radius:2px;background-color:#fff;font-size:12px;cursor:pointer;white-space:nowrap;transition:all .3s}.layui-laydate-footer span:hover{color:#16b777}.layui-laydate-footer span.layui-laydate-preview{cursor:default;border-color:transparent!important}.layui-laydate-footer span.layui-laydate-preview:hover{color:#777}.layui-laydate-footer span:first-child.layui-laydate-preview{padding-left:0}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{margin:0 0 0 -1px;border-radius:0}.laydate-footer-btns span:first-child{border-radius:2px 0 0 2px}.laydate-footer-btns span:last-child{border-radius:0 2px 2px 0}.layui-laydate-shortcut{width:80px;padding:6px 0;display:inline-block;vertical-align:top;overflow:auto;max-height:276px;text-align:center}.layui-laydate-shortcut+.layui-laydate-main{display:inline-block;border-left:1px solid #e2e2e2}.layui-laydate-shortcut>li{padding:5px 8px;cursor:pointer;line-height:18px}.layui-laydate .layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;box-sizing:border-box;background-color:#fff}.layui-laydate .layui-laydate-list>li{position:relative;display:inline-block;width:33.3%;height:36px;line-height:36px;margin:3px 0;vertical-align:middle;text-align:center;cursor:pointer;list-style:none}.layui-laydate .laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list{display:table}.layui-laydate .laydate-time-list>li{display:table-cell;height:100%;margin:0;line-height:normal;cursor:default}.layui-laydate .laydate-time-list p{position:relative;top:-4px;margin:0;line-height:29px}.layui-laydate .laydate-time-list ol{height:181px;overflow:hidden}.layui-laydate .laydate-time-list>li:hover ol{overflow-y:auto}.layui-laydate .laydate-time-list ol li{width:130%;padding-left:33px;height:30px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate .laydate-time-list-hide-1 ol li{padding-left:53px}.layui-laydate .laydate-time-list-hide-2 ol li{padding-left:117px}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px;color:#ff5722}.layui-laydate-range{width:546px}.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle;max-width:50%}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content,.layui-laydate-range .laydate-main-list-1 .layui-laydate-header{border-left:1px solid #e2e2e2}.layui-laydate-range.layui-laydate-linkage .laydate-main-list-0 .laydate-next-m,.layui-laydate-range.layui-laydate-linkage .laydate-main-list-0 .laydate-next-y,.layui-laydate-range.layui-laydate-linkage .laydate-main-list-1 .laydate-prev-m,.layui-laydate-range.layui-laydate-linkage .laydate-main-list-1 .laydate-prev-y{display:none}.layui-laydate-range.layui-laydate-linkage .laydate-main-list-1 .layui-laydate-content,.layui-laydate-range.layui-laydate-linkage .laydate-main-list-1 .layui-laydate-header{border-left-style:dashed}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#777}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#16b777}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{color:#333}.layui-laydate-content td{color:#777}.layui-laydate-content td.laydate-day-now{color:#16b777}.layui-laydate-content td.laydate-day-now:after{content:'';position:absolute;width:100%;height:30px;left:0;top:0;border:1px solid #16b777;box-sizing:border-box}.layui-laydate-linkage .layui-laydate-content td.laydate-selected>div{background-color:#cffae9;transition:all .3s}.layui-laydate-linkage .laydate-selected:hover>div{background-color:#cffae9!important}.layui-laydate-content td.laydate-selected:after,.layui-laydate-content td:hover:after{content:none}.layui-laydate-content td>div:hover,.layui-laydate-list li:hover,.layui-laydate-shortcut>li:hover{background-color:#eee;color:#333;transition:all .3s}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.layui-laydate-linkage .laydate-selected.laydate-day-next>div,.layui-laydate-linkage .laydate-selected.laydate-day-prev>div{background:0 0!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#ff5722}.laydate-day-mark::after{background-color:#16b777}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#16b777}.layui-laydate .layui-this,.layui-laydate .layui-this>div{background-color:#16b777!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.layui-laydate .layui-this.laydate-disabled,.layui-laydate .layui-this.laydate-disabled>div{background-color:#eee!important}.layui-laydate-content td>div{padding:7px 0;height:100%}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#16baaa}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-molv .layui-this,.laydate-theme-molv .layui-this>div{background-color:#16baaa!important}.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead{border:1px solid #e2e2e2}.layui-laydate-linkage.laydate-theme-grid .laydate-selected,.layui-laydate-linkage.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#16baaa!important}.layui-laydate-linkage.laydate-theme-grid .laydate-selected.laydate-day-next,.layui-laydate-linkage.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px}.laydate-theme-grid .layui-laydate-content td>div{height:29px;margin-top:-1px}.laydate-theme-circle .layui-laydate-content td.layui-this>div,.laydate-theme-circle .layui-laydate-content td>div{width:28px;height:28px;line-height:28px;border-radius:14px;margin:0 4px;padding:0}.layui-laydate.laydate-theme-circle .layui-laydate-content table td.layui-this{background-color:transparent!important}.laydate-theme-grid.laydate-theme-circle .layui-laydate-content td>div{margin:0 3.5px}.laydate-theme-fullpanel .layui-laydate-main{width:526px}.laydate-theme-fullpanel .layui-laydate-list{width:252px;left:272px}.laydate-theme-fullpanel .laydate-set-ym span{display:none}.laydate-theme-fullpanel .laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-theme-fullpanel .laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-theme-fullpanel .laydate-time-show .layui-laydate-header .layui-icon{display:inline-block!important}.laydate-theme-fullpanel .laydate-btns-time{display:none}.laydate-theme-fullpanel .laydate-time-list-hide-1 ol li{padding-left:49px}.laydate-theme-fullpanel .laydate-time-list-hide-2 ol li{padding-left:107px}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{opacity:0;transition:opacity .35s cubic-bezier(.34,.69,.1,1);top:0;left:0;width:100%;height:100%}.layui-layer{-webkit-overflow-scrolling:touch}.layui-layer{top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #b2b2b2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(data:image/gif;base64,R0lGODlhJQAlAJECAL3L2AYrTv///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgACACwAAAAAJQAlAAACi5SPqcvtDyGYIFpF690i8xUw3qJBwUlSadmcLqYmGQu6KDIeM13beGzYWWy3DlB4IYaMk+Dso2RWkFCfLPcRvFbZxFLUDTt21BW56TyjRep1e20+i+eYMR145W2eefj+6VFmgTQi+ECVY8iGxcg35phGo/iDFwlTyXWphwlm1imGRdcnuqhHeop6UAAAIfkEBQoAAgAsEAACAAQACwAAAgWMj6nLXAAh+QQFCgACACwVAAUACgALAAACFZQvgRi92dyJcVJlLobUdi8x4bIhBQAh+QQFCgACACwXABEADAADAAACBYyPqcsFACH5BAUKAAIALBUAFQAKAAsAAAITlGKZwWoMHYxqtmplxlNT7ixGAQAh+QQFCgACACwQABgABAALAAACBYyPqctcACH5BAUKAAIALAUAFQAKAAsAAAIVlC+BGL3Z3IlxUmUuhtR2LzHhsiEFACH5BAUKAAIALAEAEQAMAAMAAAIFjI+pywUAIfkEBQoAAgAsBQAFAAoACwAAAhOUYJnAagwdjGq2amXGU1PuLEYBACH5BAUKAAIALBAAAgAEAAsAAAIFhI+py1wAIfkEBQoAAgAsFQAFAAoACwAAAhWUL4AIvdnciXFSZS6G1HYvMeGyIQUAIfkEBQoAAgAsFwARAAwAAwAAAgWEj6nLBQAh+QQFCgACACwVABUACgALAAACE5RgmcBqDB2MarZqZcZTU+4sRgEAIfkEBQoAAgAsEAAYAAQACwAAAgWEj6nLXAAh+QQFCgACACwFABUACgALAAACFZQvgAi92dyJcVJlLobUdi8x4bIhBQAh+QQFCgACACwBABEADAADAAACBYSPqcsFADs=) #fff center center no-repeat}.layui-layer-btn a,.layui-layer-setwin span{display:inline-block;vertical-align:middle}.layui-layer-move{display:none;position:fixed;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@-webkit-keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@keyframes layer-slide-down{from{transform:translate3d(0,-100%,0)}to{transform:translate3d(0,0,0)}}@keyframes layer-slide-down-out{from{transform:translate3d(0,0,0)}to{transform:translate3d(0,-100%,0)}}.layer-anim-slide-down{animation-name:layer-slide-down}.layer-anim-slide-down-out{animation-name:layer-slide-down-out}@keyframes layer-slide-left{from{transform:translate3d(100%,0,0)}to{transform:translate3d(0,0,0)}}@keyframes layer-slide-left-out{from{transform:translate3d(0,0,0)}to{transform:translate3d(100%,0,0)}}.layer-anim-slide-left{animation-name:layer-slide-left}.layer-anim-slide-left-out{animation-name:layer-slide-left-out}@keyframes layer-slide-up{from{transform:translate3d(0,100%,0)}to{transform:translate3d(0,0,0)}}@keyframes layer-slide-up-out{from{transform:translate3d(0,0,0)}to{transform:translate3d(0,100%,0)}}.layer-anim-slide-up{animation-name:layer-slide-up}.layer-anim-slide-up-out{animation-name:layer-slide-up-out}@keyframes layer-slide-right{from{transform:translate3d(-100%,0,0)}to{transform:translate3d(0,0,0)}}@keyframes layer-slide-right-out{from{transform:translate3d(0,0,0)}to{transform:translate3d(-100%,0,0)}}.layer-anim-slide-right{animation-name:layer-slide-right}.layer-anim-slide-right-out{animation-name:layer-slide-right-out}.layui-layer-title{padding:0 81px 0 16px;height:50px;line-height:50px;border-bottom:1px solid #f0f0f0;font-size:14px;color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;top:16px;font-size:0;line-height:initial}.layui-layer-setwin span{position:relative;width:16px;height:16px;line-height:18px;margin-left:10px;text-align:center;font-size:16px;cursor:pointer;color:#000;_overflow:hidden;box-sizing:border-box}.layui-layer-setwin .layui-layer-min:before{content:'';position:absolute;width:12px;border-bottom:1px solid #2e2d3c;left:50%;top:50%;margin:-.5px 0 0 -6px;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover:before{background-color:#2d93ca}.layui-layer-setwin .layui-layer-max:after,.layui-layer-setwin .layui-layer-max:before{content:'';position:absolute;left:50%;top:50%;z-index:1;width:9px;height:9px;margin:-5px 0 0 -5px;border:1px solid #2e2d3c}.layui-layer-setwin .layui-layer-max:hover:after,.layui-layer-setwin .layui-layer-max:hover:before{border-color:#2d93ca}.layui-layer-setwin .layui-layer-min:hover:before{background-color:#2d93ca}.layui-layer-setwin .layui-layer-maxmin:after,.layui-layer-setwin .layui-layer-maxmin:before{width:7px;height:7px;margin:-3px 0 0 -3px;background-color:#fff}.layui-layer-setwin .layui-layer-maxmin:after{z-index:0;margin:-5px 0 0 -1px}.layui-layer-setwin .layui-layer-close{cursor:pointer}.layui-layer-setwin .layui-layer-close:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;color:#fff;background-color:#787878;padding:3px;border:3px solid;width:28px;height:28px;font-size:16px;font-weight:bolder;border-radius:50%;margin-left:0}.layui-layer-setwin .layui-layer-close2:hover{opacity:unset;background-color:#3888f6}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:30px;line-height:30px;margin:5px 5px 0;padding:0 16px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none;box-sizing:border-box}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:transparent;background-color:#1e9fff;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-btn-is-loading{opacity:.5!important;cursor:not-allowed!important;cursor:wait!important;overflow:hidden;white-space:nowrap;-webkit-user-select:none;-ms-user-select:none;user-select:none}.layui-layer-btn-is-loading .layui-layer-btn-loading-icon{margin-right:8px;font-size:14px}.layui-layer-dialog{min-width:240px}.layui-layer-dialog .layui-layer-content{position:relative;padding:16px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-face{position:absolute;top:18px;left:16px;color:#959595;font-size:32px;_left:-40px}.layui-layer-dialog .layui-layer-content .layui-icon-tips{color:#f39b12}.layui-layer-dialog .layui-layer-content .layui-icon-success{color:#16b777}.layui-layer-dialog .layui-layer-content .layui-icon-error{top:19px;color:#ff5722}.layui-layer-dialog .layui-layer-content .layui-icon-question{color:#ffb800}.layui-layer-dialog .layui-layer-content .layui-icon-lock{color:#787878}.layui-layer-dialog .layui-layer-content .layui-icon-face-cry{color:#ff5722}.layui-layer-dialog .layui-layer-content .layui-icon-face-smile{color:#16b777}.layui-layer-rim{border:6px solid #8d8d8d;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #d3d4d3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-close{color:#fff}.layui-layer-hui .layui-layer-content{padding:11px 24px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:18px 24px 18px 58px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:76px;height:38px;line-height:38px;text-align:center}.layui-layer-loading-icon{font-size:38px;color:#959595}.layui-layer-loading2{text-align:center}.layui-layer-loading-2{position:relative;height:38px}.layui-layer-loading-2:after,.layui-layer-loading-2:before{content:'';position:absolute;left:50%;top:50%;width:38px;height:38px;margin:-19px 0 0 -19px;border-radius:50%;border:3px solid #d2d2d2;box-sizing:border-box}.layui-layer-loading-2:after{border-color:transparent;border-left-color:#1e9fff}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan .layui-layer-title{background:#4476a7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;border-top:1px solid #e9e7e7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#e9e7e7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#c9c5c5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92b8b1}.layui-layer-lan .layui-layer-setwin .layui-icon,.layui-layer-molv .layui-layer-setwin .layui-icon{color:#fff}.layui-layer-win10{border:1px solid #aaa;box-shadow:1px 1px 6px rgba(0,0,0,.3);border-radius:none}.layui-layer-win10 .layui-layer-title{height:32px;line-height:32px;padding-left:8px;border-bottom:none;font-size:12px}.layui-layer-win10 .layui-layer-setwin{right:0;top:0}.layui-layer-win10 .layui-layer-setwin span{margin-left:0;width:32px;height:32px;padding:8px}.layui-layer-win10.layui-layer-page .layui-layer-setwin span{width:38px}.layui-layer-win10 .layui-layer-setwin span:hover{background-color:#e5e5e5}.layui-layer-win10 .layui-layer-setwin span.layui-icon-close:hover{background-color:#e81123;color:#fff}.layui-layer-win10.layui-layer-dialog .layui-layer-content{padding:8px 16px 32px;color:#0033bc}.layui-layer-win10.layui-layer-dialog .layui-layer-padding{padding-top:18px;padding-left:58px}.layui-layer-win10 .layui-layer-btn{padding:5px 5px 10px;border-top:1px solid #dfdfdf;background-color:#f0f0f0}.layui-layer-win10 .layui-layer-btn a{height:20px;line-height:18px;background-color:#e1e1e1;border-color:#adadad;color:#000;font-size:12px;transition:all .3s}.layui-layer-win10 .layui-layer-btn a:hover{border-color:#2a8edd;background-color:#e5f1fb}.layui-layer-win10 .layui-layer-btn .layui-layer-btn0{border-color:#0078d7}.layui-layer-prompt .layui-layer-input{display:block;width:260px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:16px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;display:inline-block;vertical-align:top;border-left:1px solid transparent;border-right:1px solid transparent;min-width:80px;max-width:300px;padding:0 16px;text-align:center;cursor:default;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:51px;border-left-color:#eee;border-right-color:#eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left-color:transparent}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{background:0 0;box-shadow:none}.layui-layer-photos .layui-layer-content{overflow:visible;text-align:center}.layui-layer-photos .layer-layer-photos-main img{position:relative;width:100%;display:inline-block;vertical-align:top}.layui-layer-photos-next,.layui-layer-photos-prev{position:fixed;top:50%;width:52px;height:52px;line-height:52px;margin-top:-26px;cursor:pointer;font-size:52px;color:#717171}.layui-layer-photos-prev{left:32px}.layui-layer-photos-next{right:32px}.layui-layer-photos-next:hover,.layui-layer-photos-prev:hover{color:#959595}.layui-layer-photos-toolbar{position:fixed;left:0;right:0;bottom:0;width:100%;height:52px;line-height:52px;background-color:rgba(0,0,0,.32);color:#fff;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;font-size:0}.layui-layer-photos-toolbar>*{display:inline-block;vertical-align:top;padding:0 16px;font-size:12px;color:#fff}.layui-layer-photos-toolbar *{font-size:12px}.layui-layer-photos-header{top:0;bottom:auto}.layui-layer-photos-header>span{cursor:pointer}.layui-layer-photos-header>span:hover{background-color:rgba(51,51,51,.32)}.layui-layer-photos-header .layui-icon{font-size:18px}.layui-layer-photos-footer>h3{max-width:65%;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-layer-photos-footer a:hover{text-decoration:underline}.layui-layer-photos-footer em{font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/layui.mobile.css b/AdminSrc/AdminHost/wwwroot/admin/layui/css/layui.mobile.css new file mode 100644 index 0000000..7835392 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/css/layui.mobile.css @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,legend,li,ol,p,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}html{font:12px 'Helvetica Neue','PingFang SC',STHeitiSC-Light,Helvetica,Arial,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0)}a{text-decoration:none;background:0 0}a:active,a:hover{outline:0}table{border-collapse:collapse;border-spacing:0}li{list-style:none}b,strong{font-weight:700}h1,h2,h3,h4,h5,h6{font-weight:500}address,cite,dfn,em,var{font-style:normal}dfn{font-style:italic}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}img{border:0;vertical-align:bottom}.layui-inline,input,label{vertical-align:middle}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0;outline:0}button,select{text-transform:none}select{-webkit-appearance:none;border:none}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=1.0.7);src:url(../font/iconfont.eot?v=1.0.7#iefix) format('embedded-opentype'),url(../font/iconfont.woff?v=1.0.7) format('woff'),url(../font/iconfont.ttf?v=1.0.7) format('truetype'),url(../font/iconfont.svg?v=1.0.7#iconfont) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-box,.layui-box *{-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;box-sizing:content-box!important}.layui-border-box,.layui-border-box *{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-inline{position:relative;display:inline-block;*display:inline;*zoom:1}.layui-edge,.layui-upload-iframe{position:absolute;width:0;height:0}.layui-edge{border-style:dashed;border-color:transparent;overflow:hidden}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-disabled,.layui-disabled:active{background-color:#d2d2d2!important;color:#fff!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-upload-iframe{border:0;visibility:hidden}.layui-upload-enter{border:1px solid #009E94;background-color:#009E94;color:#fff;-webkit-transform:scale(1.1);transform:scale(1.1)}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}@-webkit-keyframes layui-m-anim-left{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes layui-m-anim-left{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.layui-m-anim-left{-webkit-animation-name:layui-m-anim-left;animation-name:layui-m-anim-left}@-webkit-keyframes layui-m-anim-right{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes layui-m-anim-right{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.layui-m-anim-right{-webkit-animation-name:layui-m-anim-right;animation-name:layui-m-anim-right}@-webkit-keyframes layui-m-anim-lout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes layui-m-anim-lout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.layui-m-anim-lout{-webkit-animation-name:layui-m-anim-lout;animation-name:layui-m-anim-lout}@-webkit-keyframes layui-m-anim-rout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes layui-m-anim-rout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(100%);transform:translateX(100%)}}.layui-m-anim-rout{-webkit-animation-name:layui-m-anim-rout;animation-name:layui-m-anim-rout}.layui-m-layer{position:relative;z-index:19891014}.layui-m-layer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/code.css b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/code.css new file mode 100644 index 0000000..9143a25 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/code.css @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #e2e2e2;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:32px;line-height:32px;border-bottom:1px solid #e2e2e2}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/laydate/default/laydate.css b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/laydate/default/laydate.css new file mode 100644 index 0000000..b900971 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/laydate/default/laydate.css @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + .laydate-set-ym,.layui-laydate,.layui-laydate *,.layui-laydate-list{box-sizing:border-box}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:laydate-upbit;animation-name:laydate-upbit}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}@-webkit-keyframes laydate-upbit{from{-webkit-transform:translate3d(0,20px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes laydate-upbit{from{transform:translate3d(0,20px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon,.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.laydate-set-ym span,.layui-laydate-header i{padding:0 5px;cursor:pointer}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;color:#999;font-size:18px}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:5px;text-align:center}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;height:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px 20px}.layui-laydate-footer span{margin-right:15px;display:inline-block;cursor:pointer;font-size:12px}.layui-laydate-footer span:hover{color:#5FB878}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{height:26px;line-height:26px;margin:0 0 0 -1px;padding:0 10px;border:1px solid #C9C9C9;background-color:#fff;white-space:nowrap;vertical-align:top;border-radius:2px}.layui-laydate-list>li,.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;background-color:#fff}.layui-laydate-list>li{position:relative;width:33.3%;height:36px;line-height:36px;margin:3px 0;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px}.layui-laydate-range{width:546px}.layui-laydate-range .laydate-main-list-0 .laydate-next-m,.layui-laydate-range .laydate-main-list-0 .laydate-next-y,.layui-laydate-range .laydate-main-list-1 .laydate-prev-m,.layui-laydate-range .laydate-main-list-1 .laydate-prev-y{display:none}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5FB878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{font-weight:400;color:#333}.layui-laydate-content td{color:#666}.layui-laydate-content td.laydate-selected{background-color:#00F7DE}.laydate-selected:hover{background-color:#00F7DE!important}.layui-laydate-content td:hover,.layui-laydate-list li:hover{background-color:#eaeaea;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#FF5722}.laydate-day-mark::after{background-color:#5FB878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5FB878}.layui-laydate .layui-this{background-color:#009688!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead,.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layer/default/icon-ext.png b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layer/default/icon-ext.png new file mode 100644 index 0000000..bbbb669 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layer/default/icon-ext.png differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layer/default/icon.png b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layer/default/icon.png new file mode 100644 index 0000000..3e17da8 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layer/default/icon.png differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layer/default/layer.css b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layer/default/layer.css new file mode 100644 index 0000000..5b52fa3 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layer/default/layer.css @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + .layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto; background-color:rgba(0,0,0,.1)}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:230px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:43px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layer/default/loading-0.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layer/default/loading-0.gif new file mode 100644 index 0000000..6f3c953 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layer/default/loading-0.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layer/default/loading-1.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layer/default/loading-1.gif new file mode 100644 index 0000000..db3a483 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layer/default/loading-1.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layer/default/loading-2.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layer/default/loading-2.gif new file mode 100644 index 0000000..5bb90fd Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layer/default/loading-2.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/html/chatlog.html b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/html/chatlog.html new file mode 100644 index 0000000..bc4476e --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/html/chatlog.html @@ -0,0 +1,96 @@ + + + + + + + +聊天记录 + + + + + + +
+
    +
    + +
    + + + + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/html/find.html b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/html/find.html new file mode 100644 index 0000000..78a40eb --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/html/find.html @@ -0,0 +1,38 @@ + + + + + + + +发现 + + + + + + +
    +
    此为自定义的【查找】页面,因需求不一,所以官方暂不提供该模版结构与样式,实际使用时,可移至该文件到你的项目中,对页面自行把控。 +
    文件所在目录(相对于layui.js):/css/modules/layim/html/find.html
    +
    + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/html/getmsg.json b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/html/getmsg.json new file mode 100644 index 0000000..9a859e9 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/html/getmsg.json @@ -0,0 +1,87 @@ +{ + "code": 0, + "pages": 1, + "data": [ + { + "id": 76, + "content": "申请添加你为好友", + "uid": 168, + "from": 166488, + "from_group": 0, + "type": 1, + "remark": "有问题要问", + "href": null, + "read": 1, + "time": "刚刚", + "user": { + "id": 166488, + "avatar": "http://q.qlogo.cn/qqapp/101235792/B704597964F9BD0DB648292D1B09F7E8/100", + "username": "李彦宏", + "sign": null + } + }, + { + "id": 75, + "content": "申请添加你为好友", + "uid": 168, + "from": 347592, + "from_group": 0, + "type": 1, + "remark": "你好啊!", + "href": null, + "read": 1, + "time": "刚刚", + "user": { + "id": 347592, + "avatar": "http://q.qlogo.cn/qqapp/101235792/B78751375E0531675B1272AD994BA875/100", + "username": "麻花疼", + "sign": null + } + }, + { + "id": 62, + "content": "雷军 拒绝了你的好友申请", + "uid": 168, + "from": null, + "from_group": null, + "type": 1, + "remark": null, + "href": null, + "read": 1, + "time": "10天前", + "user": { + "id": null + } + }, + { + "id": 60, + "content": "马小云 已经同意你的好友申请", + "uid": 168, + "from": null, + "from_group": null, + "type": 1, + "remark": null, + "href": null, + "read": 1, + "time": "10天前", + "user": { + "id": null + } + }, + { + "id": 61, + "content": "贤心 已经同意你的好友申请", + "uid": 168, + "from": null, + "from_group": null, + "type": 1, + "remark": null, + "href": null, + "read": 1, + "time": "10天前", + "user": { + "id": null + } + } + ] +} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/html/mobile.html b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/html/mobile.html new file mode 100644 index 0000000..0bc4b70 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/html/mobile.html @@ -0,0 +1,289 @@ + + + + + + + LayIM 移动版 + + + + + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/html/msgbox.html b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/html/msgbox.html new file mode 100644 index 0000000..a528809 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/html/msgbox.html @@ -0,0 +1,208 @@ + + + + + + + +消息盒子 + + + + + + +
      + +
      +
      注意:这些都是模拟数据,实际使用时,需将其中的模拟接口改为你的项目真实接口。 +
      该模版文件所在目录(相对于layui.js):/css/modules/layim/html/msgbox.html
      +
      + + + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/layim.css b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/layim.css new file mode 100644 index 0000000..6851987 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/layim.css @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ +html #layuicss-skinlayimcss{display:none;position:absolute;width:1989px}body .layui-layim,body .layui-layim-chat{border:1px solid #D9D9D9;border-color:rgba(0,0,0,.05);background-repeat:no-repeat;background-color:#F6F6F6;color:#333;font-family:\5FAE\8F6F\96C5\9ED1}body .layui-layim-chat{background-size:cover}body .layui-layim .layui-layer-title{height:110px;border-bottom:none;background:0 0}.layui-layim-main{position:relative;top:-98px;left:0}body .layui-layim .layui-layer-content,body .layui-layim-chat .layui-layer-content{overflow:visible}.layui-layim cite,.layui-layim em,.layui-layim-chat cite,.layui-layim-chat em{font-style:normal}.layui-layim-info{height:50px;font-size:0;padding:0 15px}.layui-layim-info *{font-size:14px}.layim-tab-content li h5 *,.layui-layim-info div,.layui-layim-skin li,.layui-layim-tab li,.layui-layim-tool li{display:inline-block;vertical-align:top;*zoom:1;*display:inline}.layim-tab-content li h5 span,.layui-layim-info .layui-layim-user,.layui-layim-list li p,.layui-layim-list li span,.layui-layim-remark{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layui-layim-info .layui-layim-user{max-width:150px;margin-right:5px;font-size:16px}.layui-layim-status{position:relative;top:2px;line-height:19px;cursor:pointer}.layim-status-online{color:#3FDD86}.layim-status-hide{color:#DD691D}.layim-menu-box{display:none;position:absolute;z-index:100;top:24px;left:-31px;padding:5px 0;width:85px;border:1px solid #E2E2E2;border-radius:2px;background-color:#fff;box-shadow:1px 1px 20px rgba(0,0,0,.1)}.layim-menu-box li{position:relative;line-height:22px;padding-left:30px;font-size:12px}.layim-menu-box li cite{padding-right:5px;font-size:14px}.layim-menu-box li i{display:none;position:absolute;left:8px;top:0;font-weight:700;color:#5FB878}.layim-menu-box .layim-this i{display:block}.layim-menu-box li:hover{background-color:#eee}.layui-layim-remark{position:relative;left:-6px;display:block;width:100%;border:1px solid transparent;margin-top:8px;padding:0 5px;height:26px;line-height:26px;background:0 0;border-radius:2px}.layui-layim-remark:focus,.layui-layim-remark:hover{border:1px solid #d2d2d2;border-color:rgba(0,0,0,.15)}.layui-layim-remark:focus{background-color:#fff}.layui-layim-tab{margin-top:10px;padding:9px 0;font-size:0}.layui-layim-tab li{position:relative;width:33.33%;height:24px;line-height:24px;font-size:22px;text-align:center;color:#666;color:rgba(0,0,0,.6);cursor:pointer}.layim-tab-two li{width:50%}.layui-layim-tab li.layim-this:after{content:'';position:absolute;left:0;bottom:-9px;width:100%;height:3px;background-color:#3FDD86}.layui-layim-tab li.layim-hide{display:none}.layui-layim-tab li:hover{opacity:.8;filter:Alpha(opacity=80)}.layim-tab-content{display:none;padding:10px 0;height:349px;overflow:hidden;background-color:#fff;background-color:rgba(255,255,255,.9)}.layim-tab-content:hover{overflow-y:auto}.layim-tab-content li h5{position:relative;margin-right:15px;padding-left:30px;height:28px;line-height:28px;cursor:pointer;font-size:0;white-space:nowrap;overflow:hidden}.layim-tab-content li h5 *{font-size:14px}.layim-tab-content li h5 span{max-width:125px}.layim-tab-content li h5 i{position:absolute;left:12px;top:0;color:#C9BDBB}.layim-tab-content li h5 em{padding-left:5px;color:#999}.layim-tab-content li h5[lay-type=true] i{top:2px}.layim-tab-content li ul{display:none;margin-bottom:10px}.layui-layim-list li{position:relative;height:42px;padding:5px 15px 5px 60px;font-size:0;cursor:pointer}.layui-layim-list li:hover{background-color:#F2F2F2;background-color:rgba(0,0,0,.05)}.layui-layim-list li.layim-null{height:20px;line-height:20px;padding:0;font-size:14px;color:#999;text-align:center;cursor:default}.layui-layim-list li.layim-null:hover{background:0 0}.layui-layim-list li *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:14px}.layui-layim-list li span{margin-top:4px;max-width:155px}.layui-layim-list li img{position:absolute;left:15px;top:8px;width:36px;height:36px;border-radius:100%}.layui-layim-list li p{display:block;padding-right:30px;line-height:18px;font-size:12px;color:#999}.layui-layim-list li .layim-msg-status{display:none;position:absolute;right:10px;bottom:7px;padding:0 5px;height:16px;line-height:16px;border-radius:16px;text-align:center;font-size:10px;background-color:#F74C31;color:#fff}.layim-list-gray{-webkit-filter:grayscale(100%);-ms-filter:grayscale(100%);filter:grayscale(100%);filter:gray}.layui-layim-tool{padding:0 10px;font-size:0;background-color:#F6F6F6;border-radius:0 0 2px 2px}.layui-layim-tool li{position:relative;width:48px;height:37px;line-height:40px;text-align:center;font-size:22px;cursor:pointer}.layui-layim-tool li:active{background-color:#e2e2e2}.layui-layim-tool .layim-tool-msgbox{line-height:37px}.layui-layim-tool .layim-tool-find{line-height:38px}.layui-layim-tool .layim-tool-skin{font-size:26px}.layim-tool-msgbox span{display:none;position:absolute;left:12px;top:-12px;height:20px;line-height:20px;padding:0 10px;border-radius:2px;background-color:#33DF83;color:#fff;font-size:12px;-webkit-animation-duration:1s;animation-duration:1s}.layim-tool-msgbox .layer-anim-05{display:block}.layui-layim-search{display:none;position:absolute;bottom:5px;left:5px;height:28px;line-height:28px}.layui-layim-search input{width:210px;padding:0 30px 0 10px;height:30px;line-height:30px;border:none;border-radius:3px;background-color:#ddd}.layui-layim-search label{position:absolute;right:6px;top:4px;font-size:20px;cursor:pointer;color:#333;font-weight:400}.layui-layim-skin{margin:10px 0 0 10px;font-size:0}.layui-layim-skin li{margin:0 10px 10px 0;line-height:60px;text-align:center;background-color:#f6f6f6}.layui-layim-skin li,.layui-layim-skin li img{width:86px;height:60px;cursor:pointer}.layui-layim-skin li img:hover{opacity:.8;filter:Alpha(opacity=80)}.layui-layim-skin li cite{font-size:14px;font-style:normal}body .layui-layim-chat{background-color:#fff}body .layui-layim-chat-list{width:760px}body .layui-layim-chat .layui-layer-title{height:80px;border-bottom:none;background-color:#F8F8F8;background-color:rgba(245,245,245,.7)}body .layui-layim-chat .layui-layer-content{background:0 0}.layim-chat-list li *,.layui-layim-min .layui-layer-content *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:14px}.layim-chat-list{display:none;position:absolute;z-index:1000;top:-80px;width:200px;height:100%;background-color:#D9D9D9;overflow:hidden;font-size:0}.layim-chat-list:hover{overflow-y:auto}.layim-chat-list li,.layui-layim-min .layui-layer-content{position:relative;margin:5px;padding:5px 30px 5px 5px;line-height:40px;cursor:pointer;border-radius:3px}.layim-chat-list li img,.layui-layim-min .layui-layer-content img{width:40px;height:40px;border-radius:100%}.layui-layim-photos{cursor:crosshair}.layim-chat-list li{white-space:nowrap}.layim-chat-list li span,.layui-layim-min .layui-layer-content span{width:100px;padding-left:10px;font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layim-chat-list li span cite{color:#999;padding-left:10px}.layim-chat-list li:hover{background-color:#E2E2E2}.layim-chat-list li.layim-this{background-color:#F3F3F3}.layim-chat-list li .layui-icon{display:none;position:absolute;right:5px;top:7px;color:#555;font-size:22px}.layim-chat-list li .layui-icon:hover{color:#c00}.layim-chat-list li:hover .layui-icon{display:inline-block}.layim-chat-system{margin:10px 0;text-align:center}.layim-chat-system span{display:inline-block;line-height:30px;padding:0 15px;border-radius:3px;background-color:#e2e2e2;cursor:default;font-size:14px}.layim-chat{display:none;position:relative;background-color:#fff;background-color:rgba(255,255,255,.9)}.layim-chat-title{position:absolute;top:-80px;height:80px}.layim-chat-other{position:relative;top:15px;left:15px;padding-left:60px;cursor:default}.layim-chat-other img{position:absolute;left:0;top:0;width:50px;height:50px;border-radius:100%}.layim-chat-username{position:relative;top:5px;font-size:18px}.layim-chat-status{margin-top:6px;font-size:14px;color:#999}.layim-chat-group .layim-chat-other .layim-chat-username{cursor:pointer}.layim-chat-group .layim-chat-other .layim-chat-username em{padding:0 10px;color:#999}.layim-chat-main{height:262px;padding:15px 15px 5px;overflow-x:hidden;overflow-y:auto}.layim-chat-main ul li{position:relative;font-size:0;margin-bottom:10px;padding-left:60px;min-height:68px}.layim-chat-text,.layim-chat-user{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:14px}.layim-chat-user{position:absolute;left:3px}.layim-chat-user img{width:40px;height:40px;border-radius:100%}.layim-chat-user cite{position:absolute;left:60px;top:-2px;width:500px;line-height:24px;font-size:12px;white-space:nowrap;color:#999;text-align:left;font-style:normal}.layim-chat-user cite i{padding-left:15px;font-style:normal}.layim-chat-text{position:relative;line-height:22px;margin-top:25px;padding:8px 15px;background-color:#e2e2e2;border-radius:3px;color:#333;word-break:break-all;max-width:462px\9}.layim-chat-text:after{content:'';position:absolute;left:-10px;top:13px;width:0;height:0;border-style:solid dashed dashed;border-color:#e2e2e2 transparent transparent;overflow:hidden;border-width:10px}.layim-chat-text a{color:#33DF83}.layim-chat-text img{max-width:100%;vertical-align:middle}.layim-chat-text .layui-layim-file,.layui-layim-file{display:block;text-align:center}.layim-chat-text .layui-layim-file{color:#333}.layui-layim-file:hover{opacity:.9}.layui-layim-file i{font-size:80px;line-height:80px}.layui-layim-file cite{display:block;line-height:20px;font-size:14px}.layui-layim-audio{text-align:center;cursor:pointer}.layui-layim-audio .layui-icon{position:relative;top:5px;font-size:24px}.layui-layim-audio p{margin-top:3px}.layui-layim-video{width:120px;height:80px;line-height:80px;background-color:#333;text-align:center;border-radius:3px}.layui-layim-video .layui-icon{font-size:36px;cursor:pointer;color:#fff}.layim-chat-main ul .layim-chat-system{min-height:0;padding:0}.layim-chat-main ul .layim-chat-mine{text-align:right;padding-left:0;padding-right:60px}.layim-chat-mine .layim-chat-user{left:auto;right:3px}.layim-chat-mine .layim-chat-user cite{left:auto;right:60px;text-align:right}.layim-chat-mine .layim-chat-user cite i{padding-left:0;padding-right:15px}.layim-chat-mine .layim-chat-text{margin-left:0;text-align:left;background-color:#5FB878;color:#fff}.layim-chat-mine .layim-chat-text:after{left:auto;right:-10px;border-top-color:#5FB878}.layim-chat-mine .layim-chat-text a{color:#fff}.layim-chat-footer{border-top:1px solid #F1F1F1}.layim-chat-tool{position:relative;padding:0 8px;height:38px;line-height:38px;font-size:0}.layim-chat-tool span{position:relative;margin:0 10px;display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:24px;cursor:pointer}.layim-chat-tool .layim-tool-log{position:absolute;right:5px;font-size:14px}.layim-tool-log i{position:relative;top:2px;margin-right:5px;font-size:20px;color:#999}.layim-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}body .layui-layim-face{margin:10px 0 0 -18px;border:none;background:0 0}body .layui-layim-face .layui-layer-content{padding:0;background-color:#fff;color:#666;box-shadow:none}.layui-layim-face .layui-layer-TipsG{display:none}.layui-layim-face ul{position:relative;width:372px;padding:10px;border:1px solid #D9D9D9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-layim-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-layim-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layim-chat-textarea{margin-left:10px}.layim-chat-textarea textarea{display:block;width:100%;padding:5px 0 0;height:68px;line-height:20px;border:none;overflow:auto;resize:none;background:0 0}.layim-chat-textarea textarea:focus{outline:0}.layim-chat-bottom{position:relative;height:46px}.layim-chat-send{position:absolute;right:15px;top:3px;height:32px;line-height:32px;font-size:0;cursor:pointer}.layim-chat-send span{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:14px;line-height:32px;margin-left:5px;padding:0 20px;background-color:#5FB878;color:#fff;border-radius:3px}.layim-chat-send span:hover{background-color:#69BC80}.layim-chat-send span:active{background-color:#59B573}.layim-chat-send .layim-send-btn{border-radius:3px 0 0 3px}.layim-chat-send .layim-send-set{position:relative;width:30px;height:32px;margin-left:0;padding:0;border-left:1px solid #85C998;border-radius:0 3px 3px 0}.layim-send-set .layui-edge{position:absolute;top:14px;left:9px;border-width:6px;border-top-style:solid;border-top-color:#fff}.layim-chat-send .layim-menu-box{left:auto;right:0;top:33px;width:180px;padding:10px 0}.layim-chat-send .layim-menu-box li{padding-right:15px;line-height:28px}body .layui-layim-min{border:1px solid #D9D9D9}.layui-layim-min .layui-layer-content{margin:0 5px;padding:5px 10px;white-space:nowrap}.layui-layim-close .layui-layer-content span{width:auto;max-width:120px}body .layui-layim-members{margin:25px 0 0 -75px;border:none;background:0 0}body .layui-layim-members .layui-layer-content{padding:0;background:0 0;color:#666;box-shadow:none}.layui-layim-members .layui-layer-TipsG{display:none}.layui-layim-members ul{position:relative;width:578px;height:200px;padding:10px 10px 0;border:1px solid #D9D9D9;background-color:#fff;background-color:rgba(255,255,255,.9);box-shadow:none;overflow:hidden;font-size:0}.layui-layim-members ul:hover{overflow:auto}.layim-add-img,.layim-add-remark,.layui-layim-members li{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:14px}.layui-layim-members li{width:112px;margin:10px 0;text-align:center}.layui-layim-members li a{position:relative;display:inline-block;max-width:100%}.layui-layim-members li a:after{content:'';position:absolute;width:46px;height:46px;left:50%;margin-left:-23px;top:0;border:1px solid #eee;border-color:rgba(0,0,0,.1);border-radius:100%}.layui-layim-members li img{width:48px;height:48px;border-radius:100%}.layui-layim-members li:hover{opacity:.9}.layui-layim-members li a cite{display:block;padding:0 3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}body .layui-layim-contextmenu{margin:70px 0 0 30px;width:200px;padding:5px 0;border:1px solid #ccc;background:#fff;border-radius:0;box-shadow:0 0 5px rgba(0,0,0,.2)}body .layui-layim-contextmenu .layui-layer-content{padding:0;background-color:#fff;color:#333;font-size:14px;box-shadow:none}.layui-layim-contextmenu .layui-layer-TipsG{display:none}.layui-layim-contextmenu li{padding:0 15px 0 35px;cursor:pointer;line-height:30px}.layui-layim-contextmenu li:hover{background-color:#F2F2F2}.layim-add-box{margin:15px;font-size:0}.layim-add-img img,.layim-add-remark p{margin-bottom:10px}.layim-add-img{width:100px;margin-right:20px;text-align:center}.layim-add-img img{width:100px;height:100px}.layim-add-remark{width:280px}.layim-add-remark .layui-select{width:100%;margin-bottom:10px}.layim-add-remark .layui-textarea{height:80px;min-height:80px;resize:none}.layim-tab-content,.layui-layim-face ul,.layui-layim-tab{margin-bottom:0}.layim-tab-content li h5{margin-top:0;margin-bottom:0},.layui-layim-face img{vertical-align:bottom}.layim-chat-other span{color:#444}.layim-chat-other span cite{padding:0 15px;color:#999}.layim-chat-other:hover{text-decoration:none} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/mobile/layim.css b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/mobile/layim.css new file mode 100644 index 0000000..3127160 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/mobile/layim.css @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ +.layim-tab-content li h5,.layui-layim-list li{border-bottom:1px solid #f2f2f2;cursor:pointer}html #layuicss-skinlayim-mobilecss{display:none;position:absolute;width:1989px}.layim-tab-content li h5 *,.layui-layim-skin li,.layui-layim-tab li,.layui-layim-tool li{display:inline-block;vertical-align:top;*zoom:1;*display:inline}.layim-tab-content li h5 span,.layui-layim-list li p,.layui-layim-list li span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layui-layim-tab{position:absolute;bottom:0;left:0;right:0;height:50px;border-top:1px solid #f2f2f2;background-color:#fff}.layui-layim-tab li{position:relative;width:33.33%;height:50px;text-align:center;color:#666;color:rgba(0,0,0,.6);cursor:pointer}.layui-layim-tab li .layui-icon{position:relative;top:7px;font-size:25px}.layui-layim-tab li span{position:relative;bottom:-3px;display:block;font-size:12px}.layui-layim-tab li[lay-type=more] .layui-icon{top:4px;font-size:22px}.layui-layim-tab li.layim-this{color:#3FDD86}.layim-new{display:none;position:absolute;top:5px;left:50%;margin-left:15px;width:10px;height:10px;border-radius:10px;background-color:#F74C31;color:#fff}.layim-list-top .layim-new{position:relative;vertical-align:top;top:10px;left:initial;margin-left:5px}.layim-list-top i.layui-show{display:inline-block!important}.layim-tab-content,.layim-tab-content li ul{display:none}.layui-layim{position:fixed;left:0;right:0;top:50px;bottom:50px;overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch}.layim-tab-content li h5{position:relative;padding-left:35px;height:45px;line-height:45px;font-size:0;white-space:nowrap;overflow:hidden}.layim-tab-content li h5 *{font-size:17px}.layim-tab-content li h5 span{max-width:80%}.layim-tab-content li h5 i{position:absolute;left:12px;top:0;color:#C9BDBB}.layim-tab-content li h5 em{padding-left:5px;color:#999}.layim-list-friend,.layim-list-group{background-color:#fff}.layui-layim-list li{position:relative;height:42px;padding:5px 15px 5px 60px;font-size:0}.layui-layim-list li:active{background-color:#F2F2F2;background-color:rgba(0,0,0,.05)}.layui-layim-list li.layim-null{height:20px;line-height:20px;padding:10px 0;color:#999;text-align:center;cursor:default;font-size:14px}.layim-list-history li.layim-null{padding:30px 0;border-bottom:none;background-color:#eee}.layui-layim-list li *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:17px}.layui-layim-list li span{margin-top:2px;max-width:155px;font-size:17px}.layui-layim-list li img{position:absolute;left:12px;top:8px;width:36px;height:36px;border-radius:100%}.layui-layim-list li p{display:block;padding-right:30px;line-height:18px;font-size:13px;color:#999}.layui-layim-list li .layim-msg-status{display:none;position:absolute;right:10px;bottom:7px;padding:0 5px;height:17px;line-height:17px;border-radius:17px;text-align:center;font-size:10px;background-color:#F74C31;color:#fff}.layim-list-gray{-webkit-filter:grayscale(100%);-ms-filter:grayscale(100%);filter:grayscale(100%);filter:gray}.layim-list-top{background-color:#fff;font-size:17px}.layim-list-top li{position:relative;padding:0 15px 0 50px;line-height:45px;border-bottom:1px solid #f2f2f2;cursor:pointer}.layim-list-top li:last-child{margin-bottom:10px;border-bottom:none}.layim-list-top li .layui-icon{position:absolute;left:12px;top:0;margin-right:10px;color:#36373C;font-size:24px}.layim-list-top li[layim-event=newFriend] .layui-icon{left:15px}.layim-panel,.layim-title{position:fixed;left:0;right:0;top:0}.layim-list-top li[layim-event=group] .layui-icon{font-size:20px}.layim-list-top li[layim-event=about] .layui-icon{font-size:25px}.layim-panel{bottom:0;background-color:#eee;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}.layim-title{height:50px;line-height:50px;padding:0 15px;background-color:#36373C;color:#fff;font-size:18px}.layim-chat-status{padding-left:15px;font-size:14px;opacity:.7}.layim-title .layim-chat-back{display:inline-block;vertical-align:middle;position:relative;padding:0 15px;margin-left:-10px;top:0;font-size:24px;cursor:pointer}.layim-chat-detail{position:absolute;right:0;top:0;padding:0 15px;font-size:18px;cursor:pointer}.layim-chat-main,.layim-content{position:fixed;top:50px;left:0;right:0;overflow-y:auto;overflow-x:hidden}.layim-chat-detail:active,.layim-title .layim-chat-back:active{opacity:.8}.layui-layim .layim-title{text-align:left}.layui-layim .layim-title p{padding:0 15px}.layim-content{bottom:0}.layim-chat-main{width:100%;bottom:85px;padding:15px;-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layim-chat-main ul{overflow-x:hidden}.layim-chat-main ul li{position:relative;font-size:0;margin-bottom:10px;padding-left:60px;min-height:68px}.layim-chat-text,.layim-chat-user{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:15px}.layim-chat-user{position:absolute;left:3px}.layim-chat-user img{width:40px;height:40px;border-radius:100%}.layim-chat-user cite{position:absolute;left:60px;top:-2px;width:500px;line-height:24px;font-size:12px;white-space:nowrap;color:#999;text-align:left;font-style:normal}.layim-chat-user cite i{padding-left:15px;font-style:normal}.layim-chat-text{position:relative;min-height:22px;line-height:22px;margin-top:25px;padding:8px 15px;background-color:#fff;border-radius:3px;color:#333;word-break:break-all}.layim-chat-text:after{content:'';position:absolute;left:-10px;top:13px;width:0;height:0;border-style:solid dashed dashed;border-color:#fff transparent transparent;overflow:hidden;border-width:10px}.layim-chat-text a{color:#33DF83}.layim-chat-text img{max-width:100%;vertical-align:middle}.layim-chat-text .layui-layim-file,.layui-layim-file{display:block;text-align:center}.layim-chat-text .layui-layim-file{color:#333}.layui-layim-file:active{opacity:.9}.layui-layim-file i{font-size:80px;line-height:80px}.layui-layim-file cite{display:block;line-height:20px;font-size:17px}.layui-layim-audio{text-align:center;cursor:pointer}.layui-layim-audio .layui-icon{position:relative;top:5px;font-size:24px}.layui-layim-audio p{margin-top:3px}.layui-layim-video{width:120px;height:80px;line-height:80px;background-color:#333;text-align:center;border-radius:3px}.layui-layim-video .layui-icon{font-size:36px;cursor:pointer;color:#fff}.layim-chat-main ul .layim-chat-mine{text-align:right;padding-left:0;padding-right:60px}.layim-chat-mine .layim-chat-user{left:auto;right:3px}.layim-chat-mine .layim-chat-user cite{left:auto;right:60px;text-align:right}.layim-chat-mine .layim-chat-user cite i{padding-left:0;padding-right:15px}.layim-chat-mine .layim-chat-text{margin-left:0;text-align:left;background-color:#5FB878;color:#fff}.layim-chat-mine .layim-chat-text:after{left:auto;right:-10px;border-top-color:#5FB878}.layim-chat-mine .layim-chat-text a{color:#fff}.layim-chat-main ul .layim-chat-system{min-height:0;margin:20px 0 5px;padding:0}.layim-chat-system{margin:10px 0;text-align:center}.layim-chat-system span{display:inline-block;line-height:30px;padding:0 15px;border-radius:3px;background-color:#ddd;color:#fff;font-size:14px;cursor:pointer}.layim-chat-footer{position:fixed;bottom:0;left:10px;right:10px;height:80px}.layim-chat-send{display:-webkit-box;display:-webkit-flex;display:flex}.layim-chat-send input{-webkit-box-flex:1;-webkit-flex:1;flex:1;height:40px;padding-left:5px;border:0;background-color:#fff;border-radius:3px}.layim-chat-send button{border-radius:3px;height:40px;padding:0 20px;border:0;margin-left:10px;background-color:#5FB878;color:#fff}.layim-chat-tool{position:relative;width:100%;overflow-x:auto;padding:0;height:38px;line-height:38px;margin-top:3px;font-size:0;white-space:nowrap}.layim-chat-tool span{position:relative;margin:0 15px;display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:28px;cursor:pointer}.layim-chat-tool .layim-tool-log{position:absolute;right:5px;font-size:14px}.layim-tool-log i{position:relative;top:2px;margin-right:5px;font-size:20px;color:#999}.layim-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layim-layer{position:fixed;bottom:85px;left:10px;right:10px;margin:0 auto}.layui-layim-face{position:relative;max-height:180px;overflow:auto;padding:10px;font-size:0}.layui-layim-face li{cursor:pointer;display:inline-block;vertical-align:bottom;padding:5px 2px;text-align:center;width:10%;-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-layim-face li img{width:22px;height:22px}.layim-about{font-size:17px}.layim-about .layui-m-layercont{text-align:left}.layim-about .layui-m-layercont p{line-height:30px}.layim-about .layui-m-layercont a{color:#01AAED} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/skin/1.jpg b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/skin/1.jpg new file mode 100644 index 0000000..d9f9926 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/skin/1.jpg differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/skin/2.jpg b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/skin/2.jpg new file mode 100644 index 0000000..0bffb50 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/skin/2.jpg differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/skin/3.jpg b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/skin/3.jpg new file mode 100644 index 0000000..53ba921 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/skin/3.jpg differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/skin/4.jpg b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/skin/4.jpg new file mode 100644 index 0000000..83b4738 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/skin/4.jpg differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/skin/5.jpg b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/skin/5.jpg new file mode 100644 index 0000000..8ed74b9 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/skin/5.jpg differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/skin/logo.jpg b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/skin/logo.jpg new file mode 100644 index 0000000..26c7358 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/skin/logo.jpg differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/voice/default.mp3 b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/voice/default.mp3 new file mode 100644 index 0000000..90013c5 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/css/modules/layim/voice/default.mp3 differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/font/iconfont.eot b/AdminSrc/AdminHost/wwwroot/admin/layui/font/iconfont.eot new file mode 100644 index 0000000..3164c9f Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/font/iconfont.eot differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/font/iconfont.svg b/AdminSrc/AdminHost/wwwroot/admin/layui/font/iconfont.svg new file mode 100644 index 0000000..5151073 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/font/iconfont.svg @@ -0,0 +1,409 @@ + + + + Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/font/iconfont.ttf b/AdminSrc/AdminHost/wwwroot/admin/layui/font/iconfont.ttf new file mode 100644 index 0000000..8f49efb Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/font/iconfont.ttf differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/font/iconfont.woff b/AdminSrc/AdminHost/wwwroot/admin/layui/font/iconfont.woff new file mode 100644 index 0000000..62d3491 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/font/iconfont.woff differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/font/iconfont.woff2 b/AdminSrc/AdminHost/wwwroot/admin/layui/font/iconfont.woff2 new file mode 100644 index 0000000..a3d8774 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/font/iconfont.woff2 differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/0.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/0.gif new file mode 100644 index 0000000..a63f0d5 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/0.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/1.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/1.gif new file mode 100644 index 0000000..b2b78b2 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/1.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/10.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/10.gif new file mode 100644 index 0000000..556c7e3 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/10.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/11.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/11.gif new file mode 100644 index 0000000..2bfc58b Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/11.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/12.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/12.gif new file mode 100644 index 0000000..1c321c7 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/12.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/13.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/13.gif new file mode 100644 index 0000000..300bbc2 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/13.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/14.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/14.gif new file mode 100644 index 0000000..43b6d0a Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/14.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/15.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/15.gif new file mode 100644 index 0000000..c9f25fa Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/15.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/16.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/16.gif new file mode 100644 index 0000000..34f28e4 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/16.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/17.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/17.gif new file mode 100644 index 0000000..39cd035 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/17.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/18.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/18.gif new file mode 100644 index 0000000..7bce299 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/18.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/19.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/19.gif new file mode 100644 index 0000000..adac542 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/19.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/2.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/2.gif new file mode 100644 index 0000000..7edbb58 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/2.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/20.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/20.gif new file mode 100644 index 0000000..50631a6 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/20.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/21.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/21.gif new file mode 100644 index 0000000..b984212 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/21.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/22.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/22.gif new file mode 100644 index 0000000..1f0bd8b Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/22.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/23.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/23.gif new file mode 100644 index 0000000..e05e0f9 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/23.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/24.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/24.gif new file mode 100644 index 0000000..f35928a Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/24.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/25.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/25.gif new file mode 100644 index 0000000..0b4a883 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/25.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/26.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/26.gif new file mode 100644 index 0000000..45c4fb5 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/26.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/27.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/27.gif new file mode 100644 index 0000000..7a4c013 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/27.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/28.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/28.gif new file mode 100644 index 0000000..fc5a0cf Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/28.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/29.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/29.gif new file mode 100644 index 0000000..5dd7442 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/29.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/3.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/3.gif new file mode 100644 index 0000000..86df67b Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/3.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/30.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/30.gif new file mode 100644 index 0000000..b751f98 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/30.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/31.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/31.gif new file mode 100644 index 0000000..c9476d7 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/31.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/32.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/32.gif new file mode 100644 index 0000000..9931b06 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/32.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/33.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/33.gif new file mode 100644 index 0000000..59111a3 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/33.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/34.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/34.gif new file mode 100644 index 0000000..a334548 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/34.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/35.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/35.gif new file mode 100644 index 0000000..a932264 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/35.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/36.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/36.gif new file mode 100644 index 0000000..6de432a Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/36.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/37.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/37.gif new file mode 100644 index 0000000..d05f2da Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/37.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/38.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/38.gif new file mode 100644 index 0000000..8b1c88a Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/38.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/39.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/39.gif new file mode 100644 index 0000000..38b84a5 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/39.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/4.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/4.gif new file mode 100644 index 0000000..d52200c Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/4.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/40.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/40.gif new file mode 100644 index 0000000..ae42991 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/40.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/41.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/41.gif new file mode 100644 index 0000000..b9c715c Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/41.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/42.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/42.gif new file mode 100644 index 0000000..0eb1434 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/42.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/43.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/43.gif new file mode 100644 index 0000000..ac0b700 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/43.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/44.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/44.gif new file mode 100644 index 0000000..ad44497 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/44.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/45.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/45.gif new file mode 100644 index 0000000..6837fca Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/45.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/46.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/46.gif new file mode 100644 index 0000000..d62916d Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/46.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/47.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/47.gif new file mode 100644 index 0000000..58a0836 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/47.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/48.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/48.gif new file mode 100644 index 0000000..7ffd161 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/48.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/49.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/49.gif new file mode 100644 index 0000000..959b992 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/49.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/5.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/5.gif new file mode 100644 index 0000000..4e8b09f Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/5.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/50.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/50.gif new file mode 100644 index 0000000..6e22e7f Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/50.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/51.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/51.gif new file mode 100644 index 0000000..ad3f4d3 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/51.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/52.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/52.gif new file mode 100644 index 0000000..39f8a22 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/52.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/53.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/53.gif new file mode 100644 index 0000000..a181ee7 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/53.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/54.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/54.gif new file mode 100644 index 0000000..e289d92 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/54.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/55.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/55.gif new file mode 100644 index 0000000..4351083 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/55.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/56.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/56.gif new file mode 100644 index 0000000..e0eff22 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/56.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/57.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/57.gif new file mode 100644 index 0000000..0bf130f Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/57.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/58.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/58.gif new file mode 100644 index 0000000..0f06508 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/58.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/59.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/59.gif new file mode 100644 index 0000000..7081e4f Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/59.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/6.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/6.gif new file mode 100644 index 0000000..f7715bf Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/6.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/60.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/60.gif new file mode 100644 index 0000000..6e15f89 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/60.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/61.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/61.gif new file mode 100644 index 0000000..f092d7e Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/61.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/62.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/62.gif new file mode 100644 index 0000000..7fe4984 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/62.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/63.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/63.gif new file mode 100644 index 0000000..cf8e23e Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/63.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/64.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/64.gif new file mode 100644 index 0000000..a779719 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/64.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/65.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/65.gif new file mode 100644 index 0000000..7bb98f2 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/65.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/66.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/66.gif new file mode 100644 index 0000000..bb6d077 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/66.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/67.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/67.gif new file mode 100644 index 0000000..6e33f7c Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/67.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/68.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/68.gif new file mode 100644 index 0000000..1a6c400 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/68.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/69.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/69.gif new file mode 100644 index 0000000..a02f0b2 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/69.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/7.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/7.gif new file mode 100644 index 0000000..e6d4db8 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/7.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/70.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/70.gif new file mode 100644 index 0000000..416c5c1 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/70.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/71.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/71.gif new file mode 100644 index 0000000..c17d60c Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/71.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/8.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/8.gif new file mode 100644 index 0000000..66f967b Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/8.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/9.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/9.gif new file mode 100644 index 0000000..6044740 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/images/face/9.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/carousel.js b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/carousel.js new file mode 100644 index 0000000..2c4521b --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/carousel.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t="carousel",a="layui-this",l=">*[carousel-item]>*",o="layui-carousel-left",r="layui-carousel-right",d="layui-carousel-prev",s="layui-carousel-next",u="layui-carousel-arrow",c="layui-carousel-ind",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(a),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(clearInterval(e.timer),e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['",'"].join(""));n.elem.attr("lay-arrow",n.arrow),n.elem.find("."+u)[0]&&n.elem.find("."+u).remove(),n.elem.append(t),t.on("click",function(){var n=i(this),t=n.attr("lay-type");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['
        ',function(){var i=[];return layui.each(e.elemItem,function(e){i.push("")}),i.join("")}(),"
      "].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+c)[0]&&n.elem.find("."+c).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-(t.height()/2)),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide("add",a-n.index):a/g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('
      1. '+o.replace(/[\r\t\n]+/g,"
      2. ")+"
      "),c.find(">.layui-code-h3")[0]||c.prepend('

      '+(c.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"

      ");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/colorpicker.js b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/colorpicker.js new file mode 100644 index 0000000..0fc6395 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/colorpicker.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var i=layui.jquery,o={config:{},index:layui.colorpicker?layui.colorpicker.index+1e4:0,set:function(e){var o=this;return o.config=i.extend({},o.config,e),o},on:function(e,i){return layui.onevent.call(this,"colorpicker",e,i)}},r=function(){var e=this,i=e.config;return{config:i}},t="colorpicker",n="layui-show",l="layui-colorpicker",c=".layui-colorpicker-main",a="layui-icon-down",s="layui-icon-close",f="layui-colorpicker-trigger-span",d="layui-colorpicker-trigger-i",u="layui-colorpicker-side",p="layui-colorpicker-side-slider",g="layui-colorpicker-basis",v="layui-colorpicker-alpha-bgcolor",h="layui-colorpicker-alpha-slider",m="layui-colorpicker-basis-cursor",b="layui-colorpicker-main-input",k=function(e){var i={h:0,s:0,b:0},o=Math.min(e.r,e.g,e.b),r=Math.max(e.r,e.g,e.b),t=r-o;return i.b=r,i.s=0!=r?255*t/r:0,0!=i.s?e.r==r?i.h=(e.g-e.b)/t:e.g==r?i.h=2+(e.b-e.r)/t:i.h=4+(e.r-e.g)/t:i.h=-1,r==o&&(i.h=0),i.h*=60,i.h<0&&(i.h+=360),i.s*=100/255,i.b*=100/255,i},y=function(e){var e=e.indexOf("#")>-1?e.substring(1):e;if(3==e.length){var i=e.split("");e=i[0]+i[0]+i[1]+i[1]+i[2]+i[2]}e=parseInt(e,16);var o={r:e>>16,g:(65280&e)>>8,b:255&e};return k(o)},x=function(e){var i={},o=e.h,r=255*e.s/100,t=255*e.b/100;if(0==r)i.r=i.g=i.b=t;else{var n=t,l=(255-r)*t/255,c=(n-l)*(o%60)/60;360==o&&(o=0),o<60?(i.r=n,i.b=l,i.g=l+c):o<120?(i.g=n,i.b=l,i.r=n-c):o<180?(i.g=n,i.r=l,i.b=l+c):o<240?(i.b=n,i.r=l,i.g=n-c):o<300?(i.b=n,i.g=l,i.r=l+c):o<360?(i.r=n,i.g=l,i.b=n-c):(i.r=0,i.g=0,i.b=0)}return{r:Math.round(i.r),g:Math.round(i.g),b:Math.round(i.b)}},C=function(e){var o=x(e),r=[o.r.toString(16),o.g.toString(16),o.b.toString(16)];return i.each(r,function(e,i){1==i.length&&(r[e]="0"+i)}),r.join("")},P=function(e){var i=/[0-9]{1,3}/g,o=e.match(i)||[];return{r:o[0],g:o[1],b:o[2]}},B=i(window),w=i(document),D=function(e){var r=this;r.index=++o.index,r.config=i.extend({},r.config,o.config,e),r.render()};D.prototype.config={color:"",size:null,alpha:!1,format:"hex",predefine:!1,colors:["#009688","#5FB878","#1E9FFF","#FF5722","#FFB800","#01AAED","#999","#c00","#ff8c00","#ffd700","#90ee90","#00ced1","#1e90ff","#c71585","rgb(0, 186, 189)","rgb(255, 120, 0)","rgb(250, 212, 0)","#393D49","rgba(0,0,0,.5)","rgba(255, 69, 0, 0.68)","rgba(144, 240, 144, 0.5)","rgba(31, 147, 255, 0.73)"]},D.prototype.render=function(){var e=this,o=e.config,r=i(['
      ',"",'3&&(o.alpha&&"rgb"==o.format||(e="#"+C(k(P(o.color))))),"background: "+e):e}()+'">','',"","","
      "].join("")),t=i(o.elem);o.size&&r.addClass("layui-colorpicker-"+o.size),t.addClass("layui-inline").html(e.elemColorBox=r),e.color=e.elemColorBox.find("."+f)[0].style.background,e.events()},D.prototype.renderPicker=function(){var e=this,o=e.config,r=e.elemColorBox[0],t=e.elemPicker=i(['
      ','
      ','
      ','
      ','
      ','
      ',"
      ",'
      ','
      ',"
      ","
      ",'
      ','
      ','
      ',"
      ","
      ",function(){if(o.predefine){var e=['
      '];return layui.each(o.colors,function(i,o){e.push(['
      ','
      ',"
      "].join(""))}),e.push("
      "),e.join("")}return""}(),'
      ','
      ','',"
      ",'
      ','','',"","
      "].join(""));e.elemColorBox.find("."+f)[0];i(c)[0]&&i(c).data("index")==e.index?e.removePicker(D.thisElemInd):(e.removePicker(D.thisElemInd),i("body").append(t)),D.thisElemInd=e.index,D.thisColor=r.style.background,e.position(),e.pickerEvents()},D.prototype.removePicker=function(e){var o=this;o.config;return i("#layui-colorpicker"+(e||o.index)).remove(),o},D.prototype.position=function(){var e=this,i=e.config,o=e.bindElem||e.elemColorBox[0],r=e.elemPicker[0],t=o.getBoundingClientRect(),n=r.offsetWidth,l=r.offsetHeight,c=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},a=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},s=5,f=t.left,d=t.bottom;f-=(n-o.offsetWidth)/2,d+=s,f+n+s>a("width")?f=a("width")-n-s:fa()&&(d=t.top>l?t.top-l:a()-l,d-=2*s),i.position&&(r.style.position=i.position),r.style.left=f+("fixed"===i.position?0:c(1))+"px",r.style.top=d+("fixed"===i.position?0:c())+"px"},D.prototype.val=function(){var e=this,i=(e.config,e.elemColorBox.find("."+f)),o=e.elemPicker.find("."+b),r=i[0],t=r.style.backgroundColor;if(t){var n=k(P(t)),l=i.attr("lay-type");if(e.select(n.h,n.s,n.b),"torgb"===l&&o.find("input").val(t),"rgba"===l){var c=P(t);if(3==(t.match(/[0-9]{1,3}/g)||[]).length)o.find("input").val("rgba("+c.r+", "+c.g+", "+c.b+", 1)"),e.elemPicker.find("."+h).css("left",280);else{o.find("input").val(t);var a=280*t.slice(t.lastIndexOf(",")+1,t.length-1);e.elemPicker.find("."+h).css("left",a)}e.elemPicker.find("."+v)[0].style.background="linear-gradient(to right, rgba("+c.r+", "+c.g+", "+c.b+", 0), rgb("+c.r+", "+c.g+", "+c.b+"))"}}else e.select(0,100,100),o.find("input").val(""),e.elemPicker.find("."+v)[0].style.background="",e.elemPicker.find("."+h).css("left",280)},D.prototype.side=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=r.attr("lay-type"),n=e.elemPicker.find("."+u),l=e.elemPicker.find("."+p),c=e.elemPicker.find("."+g),y=e.elemPicker.find("."+m),C=e.elemPicker.find("."+v),w=e.elemPicker.find("."+h),D=l[0].offsetTop/180*360,E=100-(y[0].offsetTop+3)/180*100,H=(y[0].offsetLeft+3)/260*100,W=Math.round(w[0].offsetLeft/280*100)/100,j=e.elemColorBox.find("."+d),F=e.elemPicker.find(".layui-colorpicker-pre").children("div"),L=function(i,n,l,c){e.select(i,n,l);var f=x({h:i,s:n,b:l});if(j.addClass(a).removeClass(s),r[0].style.background="rgb("+f.r+", "+f.g+", "+f.b+")","torgb"===t&&e.elemPicker.find("."+b).find("input").val("rgb("+f.r+", "+f.g+", "+f.b+")"),"rgba"===t){var d=0;d=280*c,w.css("left",d),e.elemPicker.find("."+b).find("input").val("rgba("+f.r+", "+f.g+", "+f.b+", "+c+")"),r[0].style.background="rgba("+f.r+", "+f.g+", "+f.b+", "+c+")",C[0].style.background="linear-gradient(to right, rgba("+f.r+", "+f.g+", "+f.b+", 0), rgb("+f.r+", "+f.g+", "+f.b+"))"}o.change&&o.change(e.elemPicker.find("."+b).find("input").val())},M=i(['
      t&&(r=t);var l=r/180*360;D=l,L(l,H,E,W),e.preventDefault()};Y(r),e.preventDefault()}),n.on("click",function(e){var o=e.clientY-i(this).offset().top;o<0&&(o=0),o>this.offsetHeight&&(o=this.offsetHeight);var r=o/180*360;D=r,L(r,H,E,W),e.preventDefault()}),y.on("mousedown",function(e){var i=this.offsetTop,o=this.offsetLeft,r=e.clientY,t=e.clientX,n=function(e){var n=i+(e.clientY-r),l=o+(e.clientX-t),a=c[0].offsetHeight-3,s=c[0].offsetWidth-3;n<-3&&(n=-3),n>a&&(n=a),l<-3&&(l=-3),l>s&&(l=s);var f=(l+3)/260*100,d=100-(n+3)/180*100;E=d,H=f,L(D,f,d,W),e.preventDefault()};layui.stope(e),Y(n),e.preventDefault()}),c.on("mousedown",function(e){var o=e.clientY-i(this).offset().top-3+B.scrollTop(),r=e.clientX-i(this).offset().left-3+B.scrollLeft();o<-3&&(o=-3),o>this.offsetHeight-3&&(o=this.offsetHeight-3),r<-3&&(r=-3),r>this.offsetWidth-3&&(r=this.offsetWidth-3);var t=(r+3)/260*100,n=100-(o+3)/180*100;E=n,H=t,L(D,t,n,W),e.preventDefault(),y.trigger(e,"mousedown")}),w.on("mousedown",function(e){var i=this.offsetLeft,o=e.clientX,r=function(e){var r=i+(e.clientX-o),t=C[0].offsetWidth;r<0&&(r=0),r>t&&(r=t);var n=Math.round(r/280*100)/100;W=n,L(D,H,E,n),e.preventDefault()};Y(r),e.preventDefault()}),C.on("click",function(e){var o=e.clientX-i(this).offset().left;o<0&&(o=0),o>this.offsetWidth&&(o=this.offsetWidth);var r=Math.round(o/280*100)/100;W=r,L(D,H,E,r),e.preventDefault()}),F.each(function(){i(this).on("click",function(){i(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e,o=this.style.backgroundColor,r=k(P(o)),t=o.slice(o.lastIndexOf(",")+1,o.length-1);D=r.h,H=r.s,E=r.b,3==(o.match(/[0-9]{1,3}/g)||[]).length&&(t=1),W=t,e=280*t,L(r.h,r.s,r.b,t)})})},D.prototype.select=function(e,i,o,r){var t=this,n=(t.config,C({h:e,s:100,b:100})),l=C({h:e,s:i,b:o}),c=e/360*180,a=180-o/100*180-3,s=i/100*260-3;t.elemPicker.find("."+p).css("top",c),t.elemPicker.find("."+g)[0].style.background="#"+n,t.elemPicker.find("."+m).css({top:a,left:s}),"change"!==r&&t.elemPicker.find("."+b).find("input").val("#"+l)},D.prototype.pickerEvents=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=e.elemPicker.find("."+b+" input"),n={clear:function(i){r[0].style.background="",e.elemColorBox.find("."+d).removeClass(a).addClass(s),e.color="",o.done&&o.done(""),e.removePicker()},confirm:function(i,n){var l=t.val(),c=l,f={};if(l.indexOf(",")>-1){if(f=k(P(l)),e.select(f.h,f.s,f.b),r[0].style.background=c="#"+C(f),(l.match(/[0-9]{1,3}/g)||[]).length>3&&"rgba"===r.attr("lay-type")){var u=280*l.slice(l.lastIndexOf(",")+1,l.length-1);e.elemPicker.find("."+h).css("left",u),r[0].style.background=l,c=l}}else f=y(l),r[0].style.background=c="#"+C(f),e.elemColorBox.find("."+d).removeClass(s).addClass(a);return"change"===n?(e.select(f.h,f.s,f.b,n),void(o.change&&o.change(c))):(e.color=l,o.done&&o.done(l),void e.removePicker())}};e.elemPicker.on("click","*[colorpicker-events]",function(){var e=i(this),o=e.attr("colorpicker-events");n[o]&&n[o].call(this,e)}),t.on("keyup",function(e){var o=i(this);n.confirm.call(this,o,13===e.keyCode?null:"change")})},D.prototype.events=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f);e.elemColorBox.on("click",function(){e.renderPicker(),i(c)[0]&&(e.val(),e.side())}),o.elem[0]&&!e.elemColorBox[0].eventHandler&&(w.on("click",function(o){if(!i(o.target).hasClass(l)&&!i(o.target).parents("."+l)[0]&&!i(o.target).hasClass(c.replace(/\./g,""))&&!i(o.target).parents(c)[0]&&e.elemPicker){if(e.color){var t=k(P(e.color));e.select(t.h,t.s,t.b)}else e.elemColorBox.find("."+d).removeClass(a).addClass(s);r[0].style.background=e.color||"",e.removePicker()}}),B.on("resize",function(){return!(!e.elemPicker||!i(c)[0])&&void e.position()}),e.elemColorBox[0].eventHandler=!0)},o.render=function(e){var i=new D(e);return r.call(i)},e(t,o)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/element.js b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/element.js new file mode 100644 index 0000000..290a1e8 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/element.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(t){"use strict";var a=layui.$,i=(layui.hint(),layui.device()),e="element",l="layui-this",n="layui-show",s=function(){this.config={}};s.prototype.set=function(t){var i=this;return a.extend(!0,i.config,t),i},s.prototype.on=function(t,a){return layui.onevent.call(this,e,t,a)},s.prototype.tabAdd=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.children(".layui-tab-bar"),o=l.children(".layui-tab-content"),r='
    • "+(i.title||"unnaming")+"
    • ";return s[0]?s.before(r):n.append(r),o.append('
      '+(i.content||"")+"
      "),f.hideTabMore(!0),f.tabAuto(),this},s.prototype.tabDelete=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabDelete(null,s),this},s.prototype.tabChange=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabClick.call(s[0],null,null,s),this},s.prototype.tab=function(t){t=t||{},b.on("click",t.headerElem,function(i){var e=a(this).index();f.tabClick.call(this,i,e,null,t)})},s.prototype.progress=function(t,i){var e="layui-progress",l=a("."+e+"[lay-filter="+t+"]"),n=l.find("."+e+"-bar"),s=n.find("."+e+"-text");return n.css("width",i),s.text(i),this};var o=".layui-nav",r="layui-nav-item",c="layui-nav-bar",u="layui-nav-tree",d="layui-nav-child",y="layui-nav-more",h="layui-anim layui-anim-upbit",f={tabClick:function(t,i,s,o){o=o||{};var r=s||a(this),i=i||r.parent().children("li").index(r),c=o.headerElem?r.parent():r.parents(".layui-tab").eq(0),u=o.bodyElem?a(o.bodyElem):c.children(".layui-tab-content").children(".layui-tab-item"),d=r.find("a"),y=c.attr("lay-filter");"javascript:;"!==d.attr("href")&&"_blank"===d.attr("target")||(r.addClass(l).siblings().removeClass(l),u.eq(i).addClass(n).siblings().removeClass(n)),layui.event.call(this,e,"tab("+y+")",{elem:c,index:i})},tabDelete:function(t,i){var n=i||a(this).parent(),s=n.index(),o=n.parents(".layui-tab").eq(0),r=o.children(".layui-tab-content").children(".layui-tab-item"),c=o.attr("lay-filter");n.hasClass(l)&&(n.next()[0]?f.tabClick.call(n.next()[0],null,s+1):n.prev()[0]&&f.tabClick.call(n.prev()[0],null,s-1)),n.remove(),r.eq(s).remove(),setTimeout(function(){f.tabAuto()},50),layui.event.call(this,e,"tabDelete("+c+")",{elem:o,index:s})},tabAuto:function(){var t="layui-tab-more",e="layui-tab-bar",l="layui-tab-close",n=this;a(".layui-tab").each(function(){var s=a(this),o=s.children(".layui-tab-title"),r=(s.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),c=a('');if(n===window&&8!=i.ie&&f.hideTabMore(!0),s.attr("lay-allowClose")&&o.find("li").each(function(){var t=a(this);if(!t.find("."+l)[0]){var i=a('ဆ');i.on("click",f.tabDelete),t.append(i)}}),"string"!=typeof s.attr("lay-unauto"))if(o.prop("scrollWidth")>o.outerWidth()+1){if(o.find("."+e)[0])return;o.append(c),s.attr("overflow",""),c.on("click",function(a){o[this.title?"removeClass":"addClass"](t),this.title=this.title?"":"收缩"})}else o.find("."+e).remove(),s.removeAttr("overflow")})},hideTabMore:function(t){var i=a(".layui-tab-title");t!==!0&&"tabmore"===a(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=a(this),i=t.parents(o),n=i.attr("lay-filter"),s=t.parent(),c=t.siblings("."+d),y="string"==typeof s.attr("lay-unselect");"javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||y||c[0]||(i.find("."+l).removeClass(l),s.addClass(l)),i.hasClass(u)&&(c.removeClass(h),c[0]&&(s["none"===c.css("display")?"addClass":"removeClass"](r+"ed"),"all"===i.attr("lay-shrink")&&s.siblings().removeClass(r+"ed"))),layui.event.call(this,e,"nav("+n+")",t)},collapse:function(){var t=a(this),i=t.find(".layui-colla-icon"),l=t.siblings(".layui-colla-content"),s=t.parents(".layui-collapse").eq(0),o=s.attr("lay-filter"),r="none"===l.css("display");if("string"==typeof s.attr("lay-accordion")){var c=s.children(".layui-colla-item").children("."+n);c.siblings(".layui-colla-title").children(".layui-colla-icon").html(""),c.removeClass(n)}l[r?"addClass":"removeClass"](n),i.html(r?"":""),layui.event.call(this,e,"collapse("+o+")",{title:t,content:l,show:r})}};s.prototype.init=function(t,e){var l=function(){return e?'[lay-filter="'+e+'"]':""}(),s={tab:function(){f.tabAuto.call({})},nav:function(){var t=200,e={},s={},p={},b=function(l,o,r){var c=a(this),f=c.find("."+d);o.hasClass(u)?l.css({top:c.position().top,height:c.children("a").outerHeight(),opacity:1}):(f.addClass(h),l.css({left:c.position().left+parseFloat(c.css("marginLeft")),top:c.position().top+c.height()-l.height()}),e[r]=setTimeout(function(){l.css({width:c.width(),opacity:1})},i.ie&&i.ie<10?0:t),clearTimeout(p[r]),"block"===f.css("display")&&clearTimeout(s[r]),s[r]=setTimeout(function(){f.addClass(n),c.find("."+y).addClass(y+"d")},300))};a(o+l).each(function(i){var l=a(this),o=a(''),h=l.find("."+r);l.find("."+c)[0]||(l.append(o),h.on("mouseenter",function(){b.call(this,o,l,i)}).on("mouseleave",function(){l.hasClass(u)||(clearTimeout(s[i]),s[i]=setTimeout(function(){l.find("."+d).removeClass(n),l.find("."+y).removeClass(y+"d")},300))}),l.on("mouseleave",function(){clearTimeout(e[i]),p[i]=setTimeout(function(){l.hasClass(u)?o.css({height:0,top:o.position().top+o.height()/2,opacity:0}):o.css({width:0,left:o.position().left+o.width()/2,opacity:0})},t)})),h.find("a").each(function(){var t=a(this),i=(t.parent(),t.siblings("."+d));i[0]&&!t.children("."+y)[0]&&t.append(''),t.off("click",f.clickThis).on("click",f.clickThis)})})},breadcrumb:function(){var t=".layui-breadcrumb";a(t+l).each(function(){var t=a(this),i="lay-separator",e=t.attr(i)||"/",l=t.find("a");l.next("span["+i+"]")[0]||(l.each(function(t){t!==l.length-1&&a(this).after(""+e+"")}),t.css("visibility","visible"))})},progress:function(){var t="layui-progress";a("."+t+l).each(function(){var i=a(this),e=i.find(".layui-progress-bar"),l=e.attr("lay-percent");e.css("width",function(){return/^.+\/.+$/.test(l)?100*new Function("return "+l)()+"%":l}()),i.attr("lay-showPercent")&&setTimeout(function(){e.html(''+l+"")},350)})},collapse:function(){var t="layui-collapse";a("."+t+l).each(function(){var t=a(this).find(".layui-colla-item");t.each(function(){var t=a(this),i=t.find(".layui-colla-title"),e=t.find(".layui-colla-content"),l="none"===e.css("display");i.find(".layui-colla-icon").remove(),i.append(''+(l?"":"")+""),i.off("click",f.collapse).on("click",f.collapse)})})}};return s[t]?s[t]():layui.each(s,function(t,a){a()})},s.prototype.render=s.prototype.init;var p=new s,b=a(document);p.render();var v=".layui-tab-title li";b.on("click",v,f.tabClick),b.on("click",f.hideTabMore),a(window).on("resize",f.tabAuto),t(e,p)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/flow.js b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/flow.js new file mode 100644 index 0000000..924c78d --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/flow.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var f=l(e.elem);if(f[0]){var m=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,v=e.end||"没有更多了",y=e.scrollElem&&e.scrollElem!==document,d="加载更多",h=l('");f.find(".layui-flow-more")[0]||f.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(v):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(m.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),!i&&f.width()&&(r=setTimeout(function(){var i=y?e.height():l(window).height(),n=y?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var m=e.attr("lay-src");layui.img(m,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",m).removeAttr("lay-src"),l[0]&&f(l),i++})}},f=function(e,o){var f=a?(o||n).height():l(window).height(),m=n.scrollTop(),u=m+f;if(t.lazyimg.elem=l(r),e)c(e,f);else for(var s=0;su)break}};if(f(),!o){var m;n.on("scroll",function(){var e=l(this);m&&clearTimeout(m),m=setTimeout(function(){f(null,e)},50)}),o=!0}return f},e("flow",new o)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/form.js b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/form.js new file mode 100644 index 0000000..818dd39 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/form.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define("layer",function(e){"use strict";var t=layui.$,i=layui.layer,a=layui.hint(),n=layui.device(),l="form",r=".layui-form",s="layui-this",o="layui-hide",c="layui-disabled",u=function(){this.config={verify:{required:[/[\S]+/,"必填项不能为空"],phone:[/^1\d{10}$/,"请输入正确的手机号"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"邮箱格式不正确"],url:[/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/,"链接格式不正确"],number:function(e){if(!e||isNaN(e))return"只能填写数字"},date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"日期格式不正确"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"请输入正确的身份证号"]}}};u.prototype.set=function(e){var i=this;return t.extend(!0,i.config,e),i},u.prototype.verify=function(e){var i=this;return t.extend(!0,i.config.verify,e),i},u.prototype.on=function(e,t){return layui.onevent.call(this,l,e,t)},u.prototype.val=function(e,i){var a=this,n=t(r+'[lay-filter="'+e+'"]');return n.each(function(e,a){var n=t(this);layui.each(i,function(e,t){var i,a=n.find('[name="'+e+'"]');a[0]&&(i=a[0].type,"checkbox"===i?a[0].checked=t:"radio"===i?a.each(function(){this.value==t&&(this.checked=!0)}):a.val(t))})}),f.render(null,e),a.getValue(e)},u.prototype.getValue=function(e,i){i=i||t(r+'[lay-filter="'+e+'"]').eq(0);var a={},n={},l=i.find("input,select,textarea");return layui.each(l,function(e,t){if(t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name){if(/^.*\[\]$/.test(t.name)){var i=t.name.match(/^(.*)\[\]$/g)[0];a[i]=0|a[i],t.name=t.name.replace(/^(.*)\[\]$/,"$1["+a[i]++ +"]")}/^checkbox|radio$/.test(t.type)&&!t.checked||(n[t.name]=t.value)}}),n},u.prototype.render=function(e,i){var n=this,u=t(r+function(){return i?'[lay-filter="'+i+'"]':""}()),d={select:function(){var e,i="请选择",a="layui-form-select",n="layui-select-title",r="layui-select-none",d="",f=u.find("select"),v=function(i,l){t(i.target).parent().hasClass(n)&&!l||(t("."+a).removeClass(a+"ed "+a+"up"),e&&d&&e.val(d)),e=null},y=function(i,u,f){var y,p=t(this),m=i.find("."+n),k=m.find("input"),g=i.find("dl"),x=g.children("dd"),b=this.selectedIndex;if(!u){var C=function(){var e=i.offset().top+i.outerHeight()+5-h.scrollTop(),t=g.outerHeight();b=p[0].selectedIndex,i.addClass(a+"ed"),x.removeClass(o),y=null,x.eq(b).addClass(s).siblings().removeClass(s),e+t>h.height()&&e>=t&&i.addClass(a+"up"),T()},w=function(e){i.removeClass(a+"ed "+a+"up"),k.blur(),y=null,e||$(k.val(),function(e){var i=p[0].selectedIndex;e&&(d=t(p[0].options[i]).html(),0===i&&d===k.attr("placeholder")&&(d=""),k.val(d||""))})},T=function(){var e=g.children("dd."+s);if(e[0]){var t=e.position().top,i=g.height(),a=e.height();t>i&&g.scrollTop(t+g.scrollTop()-i+a-5),t<0&&g.scrollTop(t+g.scrollTop()-5)}};m.on("click",function(e){i.hasClass(a+"ed")?w():(v(e,!0),C()),g.find("."+r).remove()}),m.find(".layui-edge").on("click",function(){k.focus()}),k.on("keyup",function(e){var t=e.keyCode;9===t&&C()}).on("keydown",function(e){var t=e.keyCode;9===t&&w();var i=function(t,a){var n,l;e.preventDefault();var r=function(){var e=g.children("dd."+s);if(g.children("dd."+o)[0]&&"next"===t){var i=g.children("dd:not(."+o+",."+c+")"),n=i.eq(0).index();if(n>=0&&n无匹配项

      '):g.find("."+r).remove()},"keyup"),""===t&&g.find("."+r).remove(),void T())};f&&k.on("keyup",q).on("blur",function(i){var a=p[0].selectedIndex;e=k,d=t(p[0].options[a]).html(),0===a&&d===k.attr("placeholder")&&(d=""),setTimeout(function(){$(k.val(),function(e){d||k.val("")},"blur")},200)}),x.on("click",function(){var e=t(this),a=e.attr("lay-value"),n=p.attr("lay-filter");return!e.hasClass(c)&&(e.hasClass("layui-select-tips")?k.val(""):(k.val(e.text()),e.addClass(s)),e.siblings().removeClass(s),p.val(a).removeClass("layui-form-danger"),layui.event.call(this,l,"select("+n+")",{elem:p[0],value:a,othis:i}),w(!0),!1)}),i.find("dl>dt").on("click",function(e){return!1}),t(document).off("click",v).on("click",v)}};f.each(function(e,l){var r=t(this),o=r.next("."+a),u=this.disabled,d=l.value,f=t(l.options[l.selectedIndex]),v=l.options[0];if("string"==typeof r.attr("lay-ignore"))return r.show();var h="string"==typeof r.attr("lay-search"),p=v?v.value?i:v.innerHTML||i:i,m=t(['
      ','
      ','','
      ','
      ',function(e){var t=[];return layui.each(e,function(e,a){0!==e||a.value?"optgroup"===a.tagName.toLowerCase()?t.push("
      "+a.label+"
      "):t.push('
      '+a.innerHTML+"
      "):t.push('
      '+(a.innerHTML||i)+"
      ")}),0===t.length&&t.push('
      没有选项
      '),t.join("")}(r.find("*"))+"
      ","
      "].join(""));o[0]&&o.remove(),r.after(m),y.call(this,m,u,h)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},i=u.find("input[type=checkbox]"),a=function(e,i){var a=t(this);e.on("click",function(){var t=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(i[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(i[1]).find("em").text(n[0])),layui.event.call(a[0],l,i[2]+"("+t+")",{elem:a[0],value:a[0].value,othis:e}))})};i.each(function(i,n){var l=t(this),r=l.attr("lay-skin"),s=(l.attr("lay-text")||"").split("|"),o=this.disabled;"switch"===r&&(r="_"+r);var u=e[r]||e.checkbox;if("string"==typeof l.attr("lay-ignore"))return l.show();var d=l.next("."+u[0]),f=t(['
      ",function(){var e=n.title.replace(/\s/g,""),t={checkbox:[e?""+n.title+"":"",''].join(""),_switch:""+((n.checked?s[0]:s[1])||"")+""};return t[r]||t.checkbox}(),"
      "].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e="layui-form-radio",i=["",""],a=u.find("input[type=radio]"),n=function(a){var n=t(this),s="layui-anim-scaleSpring";a.on("click",function(){var o=n[0].name,c=n.parents(r),u=n.attr("lay-filter"),d=c.find("input[name="+o.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(d,function(){var a=t(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(s).html(i[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(s).html(i[0]),layui.event.call(n[0],l,"radio("+u+")",{elem:n[0],value:n[0].value,othis:a}))})};a.each(function(a,l){var r=t(this),s=r.next("."+e),o=this.disabled;if("string"==typeof r.attr("lay-ignore"))return r.show();s[0]&&s.remove();var u=t(['
      ',''+i[l.checked?0:1]+"","
      "+function(){var e=l.title||"";return"string"==typeof r.next().attr("lay-radio")&&(e=r.next().html(),r.next().remove()),e}()+"
      ","
      "].join(""));r.after(u),n.call(this,u)})}};return e?d[e]?d[e]():a.error("不支持的"+e+"表单渲染"):layui.each(d,function(e,t){t()}),n};var d=function(){var e=null,a=f.config.verify,s="layui-form-danger",o={},c=t(this),u=c.parents(r),d=u.find("*[lay-verify]"),v=c.parents("form")[0],h=c.attr("lay-filter");return layui.each(d,function(l,r){var o=t(this),c=o.attr("lay-verify").split("|"),u=o.attr("lay-verType"),d=o.val();if(o.removeClass(s),layui.each(c,function(t,l){var c,f="",v="function"==typeof a[l];if(a[l]){var c=v?f=a[l](d,r):!a[l][0].test(d);if(f=f||a[l][1],"required"===l&&(f=o.attr("lay-reqText")||f),c)return"tips"===u?i.tips(f,function(){return"string"==typeof o.attr("lay-ignore")||"select"!==r.tagName.toLowerCase()&&!/^checkbox|radio$/.test(r.type)?o:o.next()}(),{tips:1}):"alert"===u?i.alert(f,{title:"提示",shadeClose:!0}):i.msg(f,{icon:5,shift:6}),n.android||n.ios||setTimeout(function(){r.focus()},7),o.addClass(s),e=!0}}),e)return e}),!e&&(o=f.getValue(null,u),layui.event.call(this,l,"submit("+h+")",{elem:this,form:v,field:o}))},f=new u,v=t(document),h=t(window);f.render(),v.on("reset",r,function(){var e=t(this).attr("lay-filter");setTimeout(function(){f.render(null,e)},50)}),v.on("submit",r,d).on("click","*[lay-submit]",d),e(l,f)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/jquery.js b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/jquery.js new file mode 100644 index 0000000..10d8c2b --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/jquery.js @@ -0,0 +1,5 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){function n(e){var t=!!e&&"length"in e&&e.length,n=pe.type(e);return"function"!==n&&!pe.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e,t,n){if(pe.isFunction(t))return pe.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return pe.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(Ce.test(t))return pe.filter(t,e,n);t=pe.filter(t,e)}return pe.grep(e,function(e){return pe.inArray(e,t)>-1!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t={};return pe.each(e.match(De)||[],function(e,n){t[n]=!0}),t}function a(){re.addEventListener?(re.removeEventListener("DOMContentLoaded",s),e.removeEventListener("load",s)):(re.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(re.addEventListener||"load"===e.event.type||"complete"===re.readyState)&&(a(),pe.ready())}function u(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(_e,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:qe.test(n)?pe.parseJSON(n):n)}catch(i){}pe.data(e,t,n)}else n=void 0}return n}function l(e){var t;for(t in e)if(("data"!==t||!pe.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,r){if(He(e)){var i,o,a=pe.expando,s=e.nodeType,u=s?pe.cache:e,l=s?e[a]:e[a]&&a;if(l&&u[l]&&(r||u[l].data)||void 0!==n||"string"!=typeof t)return l||(l=s?e[a]=ne.pop()||pe.guid++:a),u[l]||(u[l]=s?{}:{toJSON:pe.noop}),"object"!=typeof t&&"function"!=typeof t||(r?u[l]=pe.extend(u[l],t):u[l].data=pe.extend(u[l].data,t)),o=u[l],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[pe.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[pe.camelCase(t)])):i=o,i}}function f(e,t,n){if(He(e)){var r,i,o=e.nodeType,a=o?pe.cache:e,s=o?e[pe.expando]:pe.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){pe.isArray(t)?t=t.concat(pe.map(t,pe.camelCase)):t in r?t=[t]:(t=pe.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!l(r):!pe.isEmptyObject(r))return}(n||(delete a[s].data,l(a[s])))&&(o?pe.cleanData([e],!0):fe.deleteExpando||a!=a.window?delete a[s]:a[s]=void 0)}}}function d(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:function(){return pe.css(e,t,"")},u=s(),l=n&&n[3]||(pe.cssNumber[t]?"":"px"),c=(pe.cssNumber[t]||"px"!==l&&+u)&&Me.exec(pe.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do o=o||".5",c/=o,pe.style(e,t,c+l);while(o!==(o=s()/u)&&1!==o&&--a)}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}function p(e){var t=ze.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function h(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||pe.nodeName(r,t)?o.push(r):pe.merge(o,h(r,t));return void 0===t||t&&pe.nodeName(e,t)?pe.merge([e],o):o}function g(e,t){for(var n,r=0;null!=(n=e[r]);r++)pe._data(n,"globalEval",!t||pe._data(t[r],"globalEval"))}function m(e){Be.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,y=p(t),v=[],x=0;x"!==f[1]||Ve.test(a)?0:u:u.firstChild,o=a&&a.childNodes.length;o--;)pe.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(pe.merge(v,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=y.lastChild}else v.push(t.createTextNode(a));for(u&&y.removeChild(u),fe.appendChecked||pe.grep(h(v,"input"),m),x=0;a=v[x++];)if(r&&pe.inArray(a,r)>-1)i&&i.push(a);else if(s=pe.contains(a.ownerDocument,a),u=h(y.appendChild(a),"script"),s&&g(u),n)for(o=0;a=u[o++];)Ie.test(a.type||"")&&n.push(a);return u=null,y}function v(){return!0}function x(){return!1}function b(){try{return re.activeElement}catch(e){}}function w(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)w(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=x;else if(!i)return e;return 1===o&&(a=i,i=function(e){return pe().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=pe.guid++)),e.each(function(){pe.event.add(this,t,i,r,n)})}function T(e,t){return pe.nodeName(e,"table")&&pe.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function C(e){return e.type=(null!==pe.find.attr(e,"type"))+"/"+e.type,e}function E(e){var t=it.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function N(e,t){if(1===t.nodeType&&pe.hasData(e)){var n,r,i,o=pe._data(e),a=pe._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;r1&&"string"==typeof p&&!fe.checkClone&&rt.test(p))return e.each(function(i){var o=e.eq(i);g&&(t[0]=p.call(this,i,o.html())),S(o,t,n,r)});if(f&&(l=y(t,e[0].ownerDocument,!1,e,r),i=l.firstChild,1===l.childNodes.length&&(l=i),i||r)){for(s=pe.map(h(l,"script"),C),a=s.length;c")).appendTo(t.documentElement),t=(ut[0].contentWindow||ut[0].contentDocument).document,t.write(),t.close(),n=D(e,t),ut.detach()),lt[e]=n),n}function L(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function H(e){if(e in Et)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=Ct.length;n--;)if(e=Ct[n]+t,e in Et)return e}function q(e,t){for(var n,r,i,o=[],a=0,s=e.length;a=0&&n=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==pe.type(e)||e.nodeType||pe.isWindow(e))return!1;try{if(e.constructor&&!ce.call(e,"constructor")&&!ce.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(!fe.ownFirst)for(t in e)return ce.call(e,t);for(t in e);return void 0===t||ce.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ue[le.call(e)]||"object":typeof e},globalEval:function(t){t&&pe.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(ge,"ms-").replace(me,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var r,i=0;if(n(e))for(r=e.length;iT.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[P]=!0,e}function i(e){var t=H.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function d(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,n,r){for(var i=0,o=n.length;i-1&&(r[l]=!(a[l]=f))}}else x=m(x===a?x.splice(h,x.length):x),o?o(null,a,x,u):Q.apply(a,x)})}function v(e){for(var t,n,r,i=e.length,o=T.relative[e[0].type],a=o||T.relative[" "],s=o?1:0,u=p(function(e){return e===t},a,!0),l=p(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var i=!o&&(r||n!==A)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,i}];s1&&h(c),s>1&&d(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s0,o=e.length>0,a=function(r,a,s,u,l){var c,f,d,p=0,h="0",g=r&&[],y=[],v=A,x=r||o&&T.find.TAG("*",l),b=W+=null==v?1:Math.random()||.1,w=x.length;for(l&&(A=a===H||a||l);h!==w&&null!=(c=x[h]);h++){if(o&&c){for(f=0,a||c.ownerDocument===H||(L(c),s=!_);d=e[f++];)if(d(c,a||H,s)){u.push(c);break}l&&(W=b)}i&&((c=!d&&c)&&p--,r&&g.push(c))}if(p+=h,i&&h!==p){for(f=0;d=n[f++];)d(g,y,a,s);if(r){if(p>0)for(;h--;)g[h]||y[h]||(y[h]=G.call(u));y=m(y)}Q.apply(u,y),l&&!r&&y.length>0&&p+n.length>1&&t.uniqueSort(u)}return l&&(W=b,A=v),g};return i?r(a):a}var b,w,T,C,E,N,k,S,A,D,j,L,H,q,_,F,M,O,R,P="sizzle"+1*new Date,B=e.document,W=0,I=0,$=n(),z=n(),X=n(),U=function(e,t){return e===t&&(j=!0),0},V=1<<31,Y={}.hasOwnProperty,J=[],G=J.pop,K=J.push,Q=J.push,Z=J.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),ce=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),de=new RegExp("^"+re+"$"),pe={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ve=/[+~]/,xe=/'|\\/g,be=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),we=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Te=function(){L()};try{Q.apply(J=Z.call(B.childNodes),B.childNodes),J[B.childNodes.length].nodeType}catch(Ce){Q={apply:J.length?function(e,t){K.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},E=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},L=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:B;return r!==H&&9===r.nodeType&&r.documentElement?(H=r,q=H.documentElement,_=!E(H),(n=H.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Te,!1):n.attachEvent&&n.attachEvent("onunload",Te)),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(H.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=me.test(H.getElementsByClassName),w.getById=i(function(e){return q.appendChild(e).id=P,!H.getElementsByName||!H.getElementsByName(P).length}),w.getById?(T.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&_){var n=t.getElementById(e);return n?[n]:[]}},T.filter.ID=function(e){var t=e.replace(be,we);return function(e){return e.getAttribute("id")===t}}):(delete T.find.ID,T.filter.ID=function(e){var t=e.replace(be,we);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),T.find.TAG=w.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):w.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},T.find.CLASS=w.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&_)return t.getElementsByClassName(e)},M=[],F=[],(w.qsa=me.test(H.querySelectorAll))&&(i(function(e){q.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||F.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+P+"-]").length||F.push("~="),e.querySelectorAll(":checked").length||F.push(":checked"),e.querySelectorAll("a#"+P+"+*").length||F.push(".#.+[+~]")}),i(function(e){var t=H.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&F.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||F.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),F.push(",.*:")})),(w.matchesSelector=me.test(O=q.matches||q.webkitMatchesSelector||q.mozMatchesSelector||q.oMatchesSelector||q.msMatchesSelector))&&i(function(e){w.disconnectedMatch=O.call(e,"div"),O.call(e,"[s!='']:x"),M.push("!=",oe)}),F=F.length&&new RegExp(F.join("|")),M=M.length&&new RegExp(M.join("|")),t=me.test(q.compareDocumentPosition),R=t||me.test(q.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},U=t?function(e,t){if(e===t)return j=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!w.sortDetached&&t.compareDocumentPosition(e)===n?e===H||e.ownerDocument===B&&R(B,e)?-1:t===H||t.ownerDocument===B&&R(B,t)?1:D?ee(D,e)-ee(D,t):0:4&n?-1:1)}:function(e,t){if(e===t)return j=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,s=[e],u=[t];if(!i||!o)return e===H?-1:t===H?1:i?-1:o?1:D?ee(D,e)-ee(D,t):0;if(i===o)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]===B?-1:u[r]===B?1:0},H):H},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==H&&L(e),n=n.replace(ce,"='$1']"),w.matchesSelector&&_&&!X[n+" "]&&(!M||!M.test(n))&&(!F||!F.test(n)))try{var r=O.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,H,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==H&&L(e),R(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==H&&L(e);var n=T.attrHandle[t.toLowerCase()],r=n&&Y.call(T.attrHandle,t.toLowerCase())?n(e,t,!_):void 0;return void 0!==r?r:w.attributes||!_?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(j=!w.detectDuplicates,D=!w.sortStable&&e.slice(0),e.sort(U),j){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return D=null,e},C=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=C(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,we),e[3]=(e[3]||e[4]||e[5]||"").replace(be,we),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=N(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(be,we).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=$[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&$(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(ae," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s,x=!1;if(m){if(o){for(;g;){for(d=t;d=d[g];)if(s?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(d=m,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}), +l=c[e]||[],p=l[0]===W&&l[1],x=p&&l[2],d=p&&m.childNodes[p];d=++p&&d&&d[g]||(x=p=0)||h.pop();)if(1===d.nodeType&&++x&&d===t){c[e]=[W,p,x];break}}else if(v&&(d=t,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),l=c[e]||[],p=l[0]===W&&l[1],x=p),x===!1)for(;(d=++p&&d&&d[g]||(x=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==y:1!==d.nodeType)||!++x||(v&&(f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),c[e]=[W,x]),d!==t)););return x-=i,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var i,o=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[P]?o(n):o.length>1?(i=[e,e,"",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=ee(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=k(e.replace(se,"$1"));return i[P]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,we),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:r(function(e){return de.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(be,we).toLowerCase(),function(t){var n;do if(n=_?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===q},focus:function(e){return e===H.activeElement&&(!H.hasFocus||H.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(a=o[0]).type&&w.getById&&9===t.nodeType&&_&&T.relative[o[1].type]){if(t=(T.find.ID(a.matches[0].replace(be,we),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(a=o[i],!T.relative[s=a.type]);)if((u=T.find[s])&&(r=u(a.matches[0].replace(be,we),ve.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&d(o),!e)return Q.apply(n,r),n;break}}return(l||k(e,f))(r,t,!_,n,!t||ve.test(e)&&c(t.parentNode)||t),n},w.sortStable=P.split("").sort(U).join("")===P,w.detectDuplicates=!!j,L(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(H.createElement("div"))}),i(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);pe.find=ve,pe.expr=ve.selectors,pe.expr[":"]=pe.expr.pseudos,pe.uniqueSort=pe.unique=ve.uniqueSort,pe.text=ve.getText,pe.isXMLDoc=ve.isXML,pe.contains=ve.contains;var xe=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&pe(e).is(n))break;r.push(e)}return r},be=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},we=pe.expr.match.needsContext,Te=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Ce=/^.[^:#\[\.,]*$/;pe.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?pe.find.matchesSelector(r,e)?[r]:[]:pe.find.matches(e,pe.grep(t,function(e){return 1===e.nodeType}))},pe.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(pe(e).filter(function(){for(t=0;t1?pe.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&we.test(e)?pe(e):e||[],!1).length}});var Ee,Ne=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ke=pe.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||Ee,"string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:Ne.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof pe?t[0]:t,pe.merge(this,pe.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:re,!0)),Te.test(r[1])&&pe.isPlainObject(t))for(r in t)pe.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}if(i=re.getElementById(r[2]),i&&i.parentNode){if(i.id!==r[2])return Ee.find(e);this.length=1,this[0]=i}return this.context=re,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):pe.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(pe):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),pe.makeArray(e,this))};ke.prototype=pe.fn,Ee=pe(re);var Se=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};pe.fn.extend({has:function(e){var t,n=pe(e,this),r=n.length;return this.filter(function(){for(t=0;t-1:1===n.nodeType&&pe.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?pe.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?pe.inArray(this[0],pe(e)):pe.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(pe.uniqueSort(pe.merge(this.get(),pe(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),pe.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return xe(e,"parentNode")},parentsUntil:function(e,t,n){return xe(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return xe(e,"nextSibling")},prevAll:function(e){return xe(e,"previousSibling")},nextUntil:function(e,t,n){return xe(e,"nextSibling",n)},prevUntil:function(e,t,n){return xe(e,"previousSibling",n)},siblings:function(e){return be((e.parentNode||{}).firstChild,e)},children:function(e){return be(e.firstChild)},contents:function(e){return pe.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:pe.merge([],e.childNodes)}},function(e,t){pe.fn[e]=function(n,r){var i=pe.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=pe.filter(r,i)),this.length>1&&(Ae[e]||(i=pe.uniqueSort(i)),Se.test(e)&&(i=i.reverse())),this.pushStack(i)}});var De=/\S+/g;pe.Callbacks=function(e){e="string"==typeof e?o(e):pe.extend({},e);var t,n,r,i,a=[],s=[],u=-1,l=function(){for(i=e.once,r=t=!0;s.length;u=-1)for(n=s.shift();++u-1;)a.splice(n,1),n<=u&&u--}),this},has:function(e){return e?pe.inArray(e,a)>-1:a.length>0},empty:function(){return a&&(a=[]),this},disable:function(){return i=s=[],a=n="",this},disabled:function(){return!a},lock:function(){return i=!0,n||c.disable(),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},pe.extend({Deferred:function(e){var t=[["resolve","done",pe.Callbacks("once memory"),"resolved"],["reject","fail",pe.Callbacks("once memory"),"rejected"],["notify","progress",pe.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return pe.Deferred(function(n){pe.each(t,function(t,o){var a=pe.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&pe.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?pe.extend(e,r):r}},i={};return r.pipe=r.then,pe.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=ie.call(arguments),a=o.length,s=1!==a||e&&pe.isFunction(e.promise)?a:0,u=1===s?e:pe.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?ie.call(arguments):i,r===t?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(a>1)for(t=new Array(a),n=new Array(a),r=new Array(a);i0||(je.resolveWith(re,[pe]),pe.fn.triggerHandler&&(pe(re).triggerHandler("ready"),pe(re).off("ready"))))}}),pe.ready.promise=function(t){if(!je)if(je=pe.Deferred(),"complete"===re.readyState||"loading"!==re.readyState&&!re.documentElement.doScroll)e.setTimeout(pe.ready);else if(re.addEventListener)re.addEventListener("DOMContentLoaded",s),e.addEventListener("load",s);else{re.attachEvent("onreadystatechange",s),e.attachEvent("onload",s);var n=!1;try{n=null==e.frameElement&&re.documentElement}catch(r){}n&&n.doScroll&&!function i(){if(!pe.isReady){try{n.doScroll("left")}catch(t){return e.setTimeout(i,50)}a(),pe.ready()}}()}return je.promise(t)},pe.ready.promise();var Le;for(Le in pe(fe))break;fe.ownFirst="0"===Le,fe.inlineBlockNeedsLayout=!1,pe(function(){var e,t,n,r;n=re.getElementsByTagName("body")[0],n&&n.style&&(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",fe.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=re.createElement("div");fe.deleteExpando=!0;try{delete e.test}catch(t){fe.deleteExpando=!1}e=null}();var He=function(e){var t=pe.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||t!==!0&&e.getAttribute("classid")===t)},qe=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,_e=/([A-Z])/g;pe.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?pe.cache[e[pe.expando]]:e[pe.expando],!!e&&!l(e)},data:function(e,t,n){return c(e,t,n)},removeData:function(e,t){return f(e,t)},_data:function(e,t,n){return c(e,t,n,!0)},_removeData:function(e,t){return f(e,t,!0)}}),pe.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=pe.data(o),1===o.nodeType&&!pe._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=pe.camelCase(r.slice(5)),u(o,r,i[r])));pe._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){pe.data(this,e)}):arguments.length>1?this.each(function(){pe.data(this,e,t)}):o?u(o,e,pe.data(o,e)):void 0},removeData:function(e){return this.each(function(){pe.removeData(this,e)})}}),pe.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=pe._data(e,t),n&&(!r||pe.isArray(n)?r=pe._data(e,t,pe.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=pe.queue(e,t),r=n.length,i=n.shift(),o=pe._queueHooks(e,t),a=function(){pe.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return pe._data(e,n)||pe._data(e,n,{empty:pe.Callbacks("once memory").add(function(){pe._removeData(e,t+"queue"),pe._removeData(e,n)})})}}),pe.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length
      a",fe.leadingWhitespace=3===e.firstChild.nodeType,fe.tbody=!e.getElementsByTagName("tbody").length,fe.htmlSerialize=!!e.getElementsByTagName("link").length,fe.html5Clone="<:nav>"!==re.createElement("nav").cloneNode(!0).outerHTML,n.type="checkbox",n.checked=!0,t.appendChild(n),fe.appendChecked=n.checked,e.innerHTML="",fe.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue,t.appendChild(e),n=re.createElement("input"),n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),e.appendChild(n),fe.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,fe.noCloneEvent=!!e.addEventListener,e[pe.expando]=1,fe.attributes=!e.getAttribute(pe.expando)}();var Xe={option:[1,""],legend:[1,"
      ","
      "],area:[1,"",""],param:[1,"",""],thead:[1,"","
      "],tr:[2,"","
      "],col:[2,"","
      "],td:[3,"","
      "],_default:fe.htmlSerialize?[0,"",""]:[1,"X
      ","
      "]};Xe.optgroup=Xe.option,Xe.tbody=Xe.tfoot=Xe.colgroup=Xe.caption=Xe.thead,Xe.th=Xe.td;var Ue=/<|&#?\w+;/,Ve=/-1&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,t=t[pe.expando]?t:new pe.Event(p,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:pe.makeArray(n,[t]),l=pe.event.special[p]||{},i||!l.trigger||l.trigger.apply(r,n)!==!1)){if(!i&&!l.noBubble&&!pe.isWindow(r)){for(u=l.delegateType||p,Ke.test(u+p)||(s=s.parentNode);s;s=s.parentNode)d.push(s),c=s;c===(r.ownerDocument||re)&&d.push(c.defaultView||c.parentWindow||e)}for(f=0;(s=d[f++])&&!t.isPropagationStopped();)t.type=f>1?u:l.bindType||p,o=(pe._data(s,"events")||{})[t.type]&&pe._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&He(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=p,!i&&!t.isDefaultPrevented()&&(!l._default||l._default.apply(d.pop(),n)===!1)&&He(r)&&a&&r[p]&&!pe.isWindow(r)){c=r[a],c&&(r[a]=null),pe.event.triggered=p;try{r[p]()}catch(g){}pe.event.triggered=void 0,c&&(r[a]=c)}return t.result}},dispatch:function(e){e=pe.event.fix(e);var t,n,r,i,o,a=[],s=ie.call(arguments),u=(pe._data(this,"events")||{})[e.type]||[],l=pe.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(a=pe.event.handlers.call(this,e,u),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((pe.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,u=e.target;if(s&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n-1:pe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s]","i"),tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,nt=/\s*$/g,at=p(re),st=at.appendChild(re.createElement("div"));pe.extend({htmlPrefilter:function(e){return e.replace(tt,"<$1>")},clone:function(e,t,n){var r,i,o,a,s,u=pe.contains(e.ownerDocument,e);if(fe.html5Clone||pe.isXMLDoc(e)||!et.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(st.innerHTML=e.outerHTML,st.removeChild(o=st.firstChild)),!(fe.noCloneEvent&&fe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||pe.isXMLDoc(e)))for(r=h(o),s=h(e),a=0;null!=(i=s[a]);++a)r[a]&&k(i,r[a]);if(t)if(n)for(s=s||h(e),r=r||h(o),a=0;null!=(i=s[a]);a++)N(i,r[a]);else N(e,o);return r=h(o,"script"),r.length>0&&g(r,!u&&h(e,"script")),r=s=i=null,o},cleanData:function(e,t){for(var n,r,i,o,a=0,s=pe.expando,u=pe.cache,l=fe.attributes,c=pe.event.special;null!=(n=e[a]);a++)if((t||He(n))&&(i=n[s],o=i&&u[i])){if(o.events)for(r in o.events)c[r]?pe.event.remove(n,r):pe.removeEvent(n,r,o.handle);u[i]&&(delete u[i],l||"undefined"==typeof n.removeAttribute?n[s]=void 0:n.removeAttribute(s),ne.push(i))}}}),pe.fn.extend({domManip:S,detach:function(e){return A(this,e,!0)},remove:function(e){return A(this,e)},text:function(e){return Pe(this,function(e){return void 0===e?pe.text(this):this.empty().append((this[0]&&this[0].ownerDocument||re).createTextNode(e))},null,e,arguments.length)},append:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.appendChild(e)}})},prepend:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&pe.cleanData(h(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&pe.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return pe.clone(this,e,t)})},html:function(e){return Pe(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e)return 1===t.nodeType?t.innerHTML.replace(Ze,""):void 0;if("string"==typeof e&&!nt.test(e)&&(fe.htmlSerialize||!et.test(e))&&(fe.leadingWhitespace||!$e.test(e))&&!Xe[(We.exec(e)||["",""])[1].toLowerCase()]){e=pe.htmlPrefilter(e);try{for(;nt",t=l.getElementsByTagName("td"),t[0].style.cssText="margin:0;border:0;padding:0;display:none",o=0===t[0].offsetHeight,o&&(t[0].style.display="",t[1].style.display="none",o=0===t[0].offsetHeight)),f.removeChild(u)}var n,r,i,o,a,s,u=re.createElement("div"),l=re.createElement("div");l.style&&(l.style.cssText="float:left;opacity:.5",fe.opacity="0.5"===l.style.opacity,fe.cssFloat=!!l.style.cssFloat,l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",fe.clearCloneStyle="content-box"===l.style.backgroundClip,u=re.createElement("div"),u.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",l.innerHTML="",u.appendChild(l),fe.boxSizing=""===l.style.boxSizing||""===l.style.MozBoxSizing||""===l.style.WebkitBoxSizing,pe.extend(fe,{reliableHiddenOffsets:function(){return null==n&&t(),o},boxSizingReliable:function(){return null==n&&t(),i},pixelMarginRight:function(){return null==n&&t(),r},pixelPosition:function(){return null==n&&t(),n},reliableMarginRight:function(){return null==n&&t(),a},reliableMarginLeft:function(){return null==n&&t(),s}}))}();var ht,gt,mt=/^(top|right|bottom|left)$/;e.getComputedStyle?(ht=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n.getPropertyValue(t)||n[t]:void 0,""!==a&&void 0!==a||pe.contains(e.ownerDocument,e)||(a=pe.style(e,t)),n&&!fe.pixelMarginRight()&&ft.test(a)&&ct.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o),void 0===a?a:a+""}):pt.currentStyle&&(ht=function(e){return e.currentStyle},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n[t]:void 0,null==a&&s&&s[t]&&(a=s[t]),ft.test(a)&&!mt.test(t)&&(r=s.left,i=e.runtimeStyle,o=i&&i.left,o&&(i.left=e.currentStyle.left),s.left="fontSize"===t?"1em":a,a=s.pixelLeft+"px",s.left=r,o&&(i.left=o)),void 0===a?a:a+""||"auto"});var yt=/alpha\([^)]*\)/i,vt=/opacity\s*=\s*([^)]*)/i,xt=/^(none|table(?!-c[ea]).+)/,bt=new RegExp("^("+Fe+")(.*)$","i"),wt={position:"absolute",visibility:"hidden",display:"block"},Tt={letterSpacing:"0",fontWeight:"400"},Ct=["Webkit","O","Moz","ms"],Et=re.createElement("div").style;pe.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=gt(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":fe.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=pe.camelCase(t),u=e.style;if(t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:u[t];if(o=typeof n,"string"===o&&(i=Me.exec(n))&&i[1]&&(n=d(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(pe.cssNumber[s]?"":"px")),fe.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),!(a&&"set"in a&&void 0===(n=a.set(e,n,r)))))try{u[t]=n}catch(l){}}},css:function(e,t,n,r){var i,o,a,s=pe.camelCase(t);return t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],a&&"get"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=gt(e,t,r)),"normal"===o&&t in Tt&&(o=Tt[t]),""===n||n?(i=parseFloat(o),n===!0||isFinite(i)?i||0:o):o}}),pe.each(["height","width"],function(e,t){pe.cssHooks[t]={get:function(e,n,r){if(n)return xt.test(pe.css(e,"display"))&&0===e.offsetWidth?dt(e,wt,function(){return M(e,t,r)}):M(e,t,r)},set:function(e,n,r){var i=r&&ht(e);return _(e,n,r?F(e,t,r,fe.boxSizing&&"border-box"===pe.css(e,"boxSizing",!1,i),i):0)}}}),fe.opacity||(pe.cssHooks.opacity={get:function(e,t){return vt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=pe.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===pe.trim(o.replace(yt,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=yt.test(o)?o.replace(yt,i):o+" "+i)}}),pe.cssHooks.marginRight=L(fe.reliableMarginRight,function(e,t){if(t)return dt(e,{display:"inline-block"},gt,[e,"marginRight"])}),pe.cssHooks.marginLeft=L(fe.reliableMarginLeft,function(e,t){if(t)return(parseFloat(gt(e,"marginLeft"))||(pe.contains(e.ownerDocument,e)?e.getBoundingClientRect().left-dt(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}):0))+"px"}),pe.each({margin:"",padding:"",border:"Width"},function(e,t){pe.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+Oe[r]+t]=o[r]||o[r-2]||o[0];return i}},ct.test(e)||(pe.cssHooks[e+t].set=_)}),pe.fn.extend({css:function(e,t){return Pe(this,function(e,t,n){var r,i,o={},a=0;if(pe.isArray(t)){for(r=ht(e),i=t.length;a1)},show:function(){return q(this,!0)},hide:function(){return q(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Re(this)?pe(this).show():pe(this).hide()})}}),pe.Tween=O,O.prototype={constructor:O,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||pe.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(pe.cssNumber[n]?"":"px")},cur:function(){var e=O.propHooks[this.prop];return e&&e.get?e.get(this):O.propHooks._default.get(this)},run:function(e){var t,n=O.propHooks[this.prop];return this.options.duration?this.pos=t=pe.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):O.propHooks._default.set(this),this}},O.prototype.init.prototype=O.prototype,O.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=pe.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){pe.fx.step[e.prop]?pe.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[pe.cssProps[e.prop]]&&!pe.cssHooks[e.prop]?e.elem[e.prop]=e.now:pe.style(e.elem,e.prop,e.now+e.unit)}}},O.propHooks.scrollTop=O.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},pe.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},pe.fx=O.prototype.init,pe.fx.step={};var Nt,kt,St=/^(?:toggle|show|hide)$/,At=/queueHooks$/;pe.Animation=pe.extend($,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,Me.exec(t),n),n}]},tweener:function(e,t){pe.isFunction(e)?(t=e,e=["*"]):e=e.match(De);for(var n,r=0,i=e.length;r
      a",e=n.getElementsByTagName("a")[0],t.setAttribute("type","checkbox"),n.appendChild(t),e=n.getElementsByTagName("a")[0],e.style.cssText="top:1px",fe.getSetAttribute="t"!==n.className,fe.style=/top/.test(e.getAttribute("style")),fe.hrefNormalized="/a"===e.getAttribute("href"),fe.checkOn=!!t.value,fe.optSelected=i.selected,fe.enctype=!!re.createElement("form").enctype,r.disabled=!0,fe.optDisabled=!i.disabled,t=re.createElement("input"),t.setAttribute("value",""),fe.input=""===t.getAttribute("value"),t.value="t",t.setAttribute("type","radio"),fe.radioValue="t"===t.value}();var Dt=/\r/g,jt=/[\x20\t\r\n\f]+/g;pe.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=pe.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,pe(this).val()):e,null==i?i="":"number"==typeof i?i+="":pe.isArray(i)&&(i=pe.map(i,function(e){return null==e?"":e+""})),t=pe.valHooks[this.type]||pe.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return t=pe.valHooks[i.type]||pe.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(Dt,""):null==n?"":n)}}}),pe.extend({valHooks:{option:{get:function(e){var t=pe.find.attr(e,"value");return null!=t?t:pe.trim(pe.text(e)).replace(jt," ")}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||i<0,a=o?null:[],s=o?i+1:r.length,u=i<0?s:o?i:0;u-1)try{r.selected=n=!0}catch(s){r.scrollHeight}else r.selected=!1;return n||(e.selectedIndex=-1),i}}}}),pe.each(["radio","checkbox"],function(){pe.valHooks[this]={set:function(e,t){if(pe.isArray(t))return e.checked=pe.inArray(pe(e).val(),t)>-1}},fe.checkOn||(pe.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Lt,Ht,qt=pe.expr.attrHandle,_t=/^(?:checked|selected)$/i,Ft=fe.getSetAttribute,Mt=fe.input;pe.fn.extend({attr:function(e,t){return Pe(this,pe.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){pe.removeAttr(this,e)})}}),pe.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?pe.prop(e,t,n):(1===o&&pe.isXMLDoc(e)||(t=t.toLowerCase(),i=pe.attrHooks[t]||(pe.expr.match.bool.test(t)?Ht:Lt)),void 0!==n?null===n?void pe.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:(r=pe.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!fe.radioValue&&"radio"===t&&pe.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(De);if(o&&1===e.nodeType)for(;n=o[i++];)r=pe.propFix[n]||n,pe.expr.match.bool.test(n)?Mt&&Ft||!_t.test(n)?e[r]=!1:e[pe.camelCase("default-"+n)]=e[r]=!1:pe.attr(e,n,""),e.removeAttribute(Ft?n:r)}}),Ht={set:function(e,t,n){return t===!1?pe.removeAttr(e,n):Mt&&Ft||!_t.test(n)?e.setAttribute(!Ft&&pe.propFix[n]||n,n):e[pe.camelCase("default-"+n)]=e[n]=!0,n}},pe.each(pe.expr.match.bool.source.match(/\w+/g),function(e,t){var n=qt[t]||pe.find.attr;Mt&&Ft||!_t.test(t)?qt[t]=function(e,t,r){var i,o;return r||(o=qt[t],qt[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,qt[t]=o),i}:qt[t]=function(e,t,n){if(!n)return e[pe.camelCase("default-"+t)]?t.toLowerCase():null}}),Mt&&Ft||(pe.attrHooks.value={set:function(e,t,n){return pe.nodeName(e,"input")?void(e.defaultValue=t):Lt&&Lt.set(e,t,n)}}),Ft||(Lt={set:function(e,t,n){var r=e.getAttributeNode(n);if(r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="","value"===n||t===e.getAttribute(n))return t}},qt.id=qt.name=qt.coords=function(e,t,n){var r;if(!n)return(r=e.getAttributeNode(t))&&""!==r.value?r.value:null},pe.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);if(n&&n.specified)return n.value},set:Lt.set},pe.attrHooks.contenteditable={set:function(e,t,n){Lt.set(e,""!==t&&t,n)}},pe.each(["width","height"],function(e,t){pe.attrHooks[t]={set:function(e,n){if(""===n)return e.setAttribute(t,"auto"),n}}})),fe.style||(pe.attrHooks.style={get:function(e){return e.style.cssText||void 0},set:function(e,t){return e.style.cssText=t+""}});var Ot=/^(?:input|select|textarea|button|object)$/i,Rt=/^(?:a|area)$/i;pe.fn.extend({prop:function(e,t){return Pe(this,pe.prop,e,t,arguments.length>1)},removeProp:function(e){return e=pe.propFix[e]||e,this.each(function(){try{this[e]=void 0,delete this[e]}catch(t){}})}}),pe.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&pe.isXMLDoc(e)||(t=pe.propFix[t]||t,i=pe.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=pe.find.attr(e,"tabindex");return t?parseInt(t,10):Ot.test(e.nodeName)||Rt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),fe.hrefNormalized||pe.each(["href","src"],function(e,t){pe.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),fe.optSelected||(pe.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),pe.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){pe.propFix[this.toLowerCase()]=this}),fe.enctype||(pe.propFix.enctype="encoding");var Pt=/[\t\r\n\f]/g;pe.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).addClass(e.call(this,t,z(this)))});if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).removeClass(e.call(this,t,z(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):pe.isFunction(e)?this.each(function(n){pe(this).toggleClass(e.call(this,n,z(this),t),t)}):this.each(function(){var t,r,i,o;if("string"===n)for(r=0,i=pe(this),o=e.match(De)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||(t=z(this),t&&pe._data(this,"__className__",t),pe.attr(this,"class",t||e===!1?"":pe._data(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(n)+" ").replace(Pt," ").indexOf(t)>-1)return!0;return!1}}),pe.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){pe.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),pe.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}});var Bt=e.location,Wt=pe.now(),It=/\?/,$t=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;pe.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,r=null,i=pe.trim(t+"");return i&&!pe.trim(i.replace($t,function(e,t,i,o){return n&&t&&(r=0),0===r?e:(n=i||t,r+=!o-!i,"")}))?Function("return "+i)():pe.error("Invalid JSON: "+t)},pe.parseXML=function(t){var n,r;if(!t||"string"!=typeof t)return null;try{e.DOMParser?(r=new e.DOMParser,n=r.parseFromString(t,"text/xml")):(n=new e.ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(i){n=void 0}return n&&n.documentElement&&!n.getElementsByTagName("parsererror").length||pe.error("Invalid XML: "+t),n};var zt=/#.*$/,Xt=/([?&])_=[^&]*/,Ut=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Vt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Yt=/^(?:GET|HEAD)$/,Jt=/^\/\//,Gt=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Kt={},Qt={},Zt="*/".concat("*"),en=Bt.href,tn=Gt.exec(en.toLowerCase())||[];pe.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:en,type:"GET",isLocal:Vt.test(tn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":pe.parseJSON,"text xml":pe.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?V(V(e,pe.ajaxSettings),t):V(pe.ajaxSettings,e)},ajaxPrefilter:X(Kt),ajaxTransport:X(Qt),ajax:function(t,n){function r(t,n,r,i){var o,f,v,x,w,C=n;2!==b&&(b=2,u&&e.clearTimeout(u),c=void 0,s=i||"",T.readyState=t>0?4:0,o=t>=200&&t<300||304===t,r&&(x=Y(d,T,r)),x=J(d,x,T,o),o?(d.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(pe.lastModified[a]=w),w=T.getResponseHeader("etag"),w&&(pe.etag[a]=w)),204===t||"HEAD"===d.type?C="nocontent":304===t?C="notmodified":(C=x.state,f=x.data,v=x.error,o=!v)):(v=C,!t&&C||(C="error",t<0&&(t=0))),T.status=t,T.statusText=(n||C)+"",o?g.resolveWith(p,[f,C,T]):g.rejectWith(p,[T,C,v]),T.statusCode(y),y=void 0,l&&h.trigger(o?"ajaxSuccess":"ajaxError",[T,d,o?f:v]),m.fireWith(p,[T,C]),l&&(h.trigger("ajaxComplete",[T,d]),--pe.active||pe.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,d=pe.ajaxSetup({},n),p=d.context||d,h=d.context&&(p.nodeType||p.jquery)?pe(p):pe.event,g=pe.Deferred(),m=pe.Callbacks("once memory"),y=d.statusCode||{},v={},x={},b=0,w="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!f)for(f={};t=Ut.exec(s);)f[t[1].toLowerCase()]=t[2];t=f[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=x[n]=x[n]||e,v[e]=t),this},overrideMimeType:function(e){return b||(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(b<2)for(t in e)y[t]=[y[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||w;return c&&c.abort(t),r(0,t),this}};if(g.promise(T).complete=m.add,T.success=T.done,T.error=T.fail,d.url=((t||d.url||en)+"").replace(zt,"").replace(Jt,tn[1]+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=pe.trim(d.dataType||"*").toLowerCase().match(De)||[""],null==d.crossDomain&&(i=Gt.exec(d.url.toLowerCase()),d.crossDomain=!(!i||i[1]===tn[1]&&i[2]===tn[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(tn[3]||("http:"===tn[1]?"80":"443")))),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=pe.param(d.data,d.traditional)),U(Kt,d,n,T),2===b)return T;l=pe.event&&d.global,l&&0===pe.active++&&pe.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Yt.test(d.type),a=d.url,d.hasContent||(d.data&&(a=d.url+=(It.test(a)?"&":"?")+d.data,delete d.data),d.cache===!1&&(d.url=Xt.test(a)?a.replace(Xt,"$1_="+Wt++):a+(It.test(a)?"&":"?")+"_="+Wt++)),d.ifModified&&(pe.lastModified[a]&&T.setRequestHeader("If-Modified-Since",pe.lastModified[a]),pe.etag[a]&&T.setRequestHeader("If-None-Match",pe.etag[a])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&T.setRequestHeader("Content-Type",d.contentType),T.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Zt+"; q=0.01":""):d.accepts["*"]);for(o in d.headers)T.setRequestHeader(o,d.headers[o]);if(d.beforeSend&&(d.beforeSend.call(p,T,d)===!1||2===b))return T.abort();w="abort";for(o in{success:1,error:1,complete:1})T[o](d[o]);if(c=U(Qt,d,n,T)){if(T.readyState=1,l&&h.trigger("ajaxSend",[T,d]),2===b)return T;d.async&&d.timeout>0&&(u=e.setTimeout(function(){T.abort("timeout")},d.timeout));try{b=1,c.send(v,r)}catch(C){if(!(b<2))throw C;r(-1,C)}}else r(-1,"No Transport");return T},getJSON:function(e,t,n){return pe.get(e,t,n,"json")},getScript:function(e,t){return pe.get(e,void 0,t,"script")}}),pe.each(["get","post"],function(e,t){pe[t]=function(e,n,r,i){return pe.isFunction(n)&&(i=i||r,r=n,n=void 0),pe.ajax(pe.extend({url:e,type:t,dataType:i,data:n,success:r},pe.isPlainObject(e)&&e))}}),pe._evalUrl=function(e){return pe.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},pe.fn.extend({wrapAll:function(e){if(pe.isFunction(e))return this.each(function(t){pe(this).wrapAll(e.call(this,t))});if(this[0]){var t=pe(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return pe.isFunction(e)?this.each(function(t){pe(this).wrapInner(e.call(this,t))}):this.each(function(){var t=pe(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=pe.isFunction(e);return this.each(function(n){pe(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){pe.nodeName(this,"body")||pe(this).replaceWith(this.childNodes)}).end()}}),pe.expr.filters.hidden=function(e){return fe.reliableHiddenOffsets()?e.offsetWidth<=0&&e.offsetHeight<=0&&!e.getClientRects().length:K(e)},pe.expr.filters.visible=function(e){return!pe.expr.filters.hidden(e)};var nn=/%20/g,rn=/\[\]$/,on=/\r?\n/g,an=/^(?:submit|button|image|reset|file)$/i,sn=/^(?:input|select|textarea|keygen)/i;pe.param=function(e,t){var n,r=[],i=function(e,t){t=pe.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=pe.ajaxSettings&&pe.ajaxSettings.traditional),pe.isArray(e)||e.jquery&&!pe.isPlainObject(e))pe.each(e,function(){i(this.name,this.value)});else for(n in e)Q(n,e[n],t,i);return r.join("&").replace(nn,"+")},pe.fn.extend({serialize:function(){return pe.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=pe.prop(this,"elements");return e?pe.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!pe(this).is(":disabled")&&sn.test(this.nodeName)&&!an.test(e)&&(this.checked||!Be.test(e))}).map(function(e,t){var n=pe(this).val();return null==n?null:pe.isArray(n)?pe.map(n,function(e){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),pe.ajaxSettings.xhr=void 0!==e.ActiveXObject?function(){return this.isLocal?ee():re.documentMode>8?Z():/^(get|post|head|put|delete|options)$/i.test(this.type)&&Z()||ee()}:Z;var un=0,ln={},cn=pe.ajaxSettings.xhr();e.attachEvent&&e.attachEvent("onunload",function(){for(var e in ln)ln[e](void 0,!0)}),fe.cors=!!cn&&"withCredentials"in cn,cn=fe.ajax=!!cn,cn&&pe.ajaxTransport(function(t){if(!t.crossDomain||fe.cors){var n;return{send:function(r,i){var o,a=t.xhr(),s=++un;if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(o in t.xhrFields)a[o]=t.xhrFields[o];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||r["X-Requested-With"]||(r["X-Requested-With"]="XMLHttpRequest");for(o in r)void 0!==r[o]&&a.setRequestHeader(o,r[o]+"");a.send(t.hasContent&&t.data||null),n=function(e,r){var o,u,l;if(n&&(r||4===a.readyState))if(delete ln[s],n=void 0,a.onreadystatechange=pe.noop,r)4!==a.readyState&&a.abort();else{l={},o=a.status,"string"==typeof a.responseText&&(l.text=a.responseText);try{u=a.statusText}catch(c){u=""}o||!t.isLocal||t.crossDomain?1223===o&&(o=204):o=l.text?200:404}l&&i(o,u,l,a.getAllResponseHeaders())},t.async?4===a.readyState?e.setTimeout(n):a.onreadystatechange=ln[s]=n:n()},abort:function(){n&&n(void 0,!0)}}}}),pe.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return pe.globalEval(e),e}}}),pe.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),pe.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=re.head||pe("head")[0]||re.documentElement;return{send:function(r,i){t=re.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){(n||!t.readyState||/loaded|complete/.test(t.readyState))&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||i(200,"success"))},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(void 0,!0)}}}});var fn=[],dn=/(=)\?(?=&|$)|\?\?/;pe.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=fn.pop()||pe.expando+"_"+Wt++;return this[e]=!0,e}}),pe.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=pe.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(It.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||pe.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?pe(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,fn.push(i)),a&&pe.isFunction(o)&&o(a[0]),a=o=void 0}),"script"}),pe.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||re;var r=Te.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=y([e],t,i),i&&i.length&&pe(i).remove(),pe.merge([],r.childNodes))};var pn=pe.fn.load;return pe.fn.load=function(e,t,n){if("string"!=typeof e&&pn)return pn.apply(this,arguments);var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=pe.trim(e.slice(s,e.length)),e=e.slice(0,s)),pe.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&pe.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?pe("
      ").append(pe.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},pe.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){pe.fn[t]=function(e){return this.on(t,e)}}),pe.expr.filters.animated=function(e){return pe.grep(pe.timers,function(t){return e===t.elem}).length},pe.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=pe.css(e,"position"),f=pe(e),d={};"static"===c&&(e.style.position="relative"),s=f.offset(),o=pe.css(e,"top"),u=pe.css(e,"left"),l=("absolute"===c||"fixed"===c)&&pe.inArray("auto",[o,u])>-1,l?(r=f.position(),a=r.top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),pe.isFunction(t)&&(t=t.call(e,n,pe.extend({},s))),null!=t.top&&(d.top=t.top-s.top+a),null!=t.left&&(d.left=t.left-s.left+i),"using"in t?t.using.call(e,d):f.css(d)}},pe.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){pe.offset.setOffset(this,e,t)});var t,n,r={top:0,left:0},i=this[0],o=i&&i.ownerDocument;if(o)return t=o.documentElement,pe.contains(t,i)?("undefined"!=typeof i.getBoundingClientRect&&(r=i.getBoundingClientRect()),n=te(o),{top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:r.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):r},position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===pe.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),pe.nodeName(e[0],"html")||(n=e.offset()),n.top+=pe.css(e[0],"borderTopWidth",!0),n.left+=pe.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-pe.css(r,"marginTop",!0),left:t.left-n.left-pe.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){ +for(var e=this.offsetParent;e&&!pe.nodeName(e,"html")&&"static"===pe.css(e,"position");)e=e.offsetParent;return e||pt})}}),pe.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);pe.fn[e]=function(r){return Pe(this,function(e,r,i){var o=te(e);return void 0===i?o?t in o?o[t]:o.document.documentElement[r]:e[r]:void(o?o.scrollTo(n?pe(o).scrollLeft():i,n?i:pe(o).scrollTop()):e[r]=i)},e,r,arguments.length,null)}}),pe.each(["top","left"],function(e,t){pe.cssHooks[t]=L(fe.pixelPosition,function(e,n){if(n)return n=gt(e,t),ft.test(n)?pe(e).position()[t]+"px":n})}),pe.each({Height:"height",Width:"width"},function(e,t){pe.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){pe.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),a=n||(r===!0||i===!0?"margin":"border");return Pe(this,function(t,n,r){var i;return pe.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):void 0===r?pe.css(t,n,a):pe.style(t,n,r,a)},t,o?r:void 0,o,null)}})}),pe.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),pe.fn.size=function(){return this.length},pe.fn.andSelf=pe.fn.addBack,layui.define(function(e){layui.$=pe,e("jquery",pe)}),pe}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/laydate.js b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/laydate.js new file mode 100644 index 0000000..0766cb5 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/laydate.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;!function(){"use strict";var e=window.layui&&layui.define,t={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,n=t.length-1,a=n;a>0;a--)if("interactive"===t[a].readyState){e=t[a].src;break}return e||t[n].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),getStyle:function(e,t){var n=e.currentStyle?e.currentStyle:window.getComputedStyle(e,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](t)},link:function(e,a,i){if(n.path){var r=document.getElementsByTagName("head")[0],o=document.createElement("link");"string"==typeof a&&(i=a);var s=(i||e).replace(/\.|\//g,""),l="layuicss-"+s,d=0;o.rel="stylesheet",o.href=n.path+e,o.id=l,document.getElementById(l)||r.appendChild(o),"function"==typeof a&&!function c(){return++d>80?window.console&&console.error("laydate.css: Invalid"):void(1989===parseInt(t.getStyle(document.getElementById(l),"width"))?a():setTimeout(c,100))}()}}},n={v:"5.0.9",config:{},index:window.laydate&&window.laydate.v?1e5:0,path:t.getPath,set:function(e){var t=this;return t.config=w.extend({},t.config,e),t},ready:function(a){var i="laydate",r="",o=(e?"modules/laydate/":"theme/")+"default/laydate.css?v="+n.v+r;return e?layui.addcss(o,a,i):t.link(o,a,i),this}},a=function(){var e=this;return{hint:function(t){e.hint.call(e,t)},config:e.config}},i="laydate",r=".layui-laydate",o="layui-this",s="laydate-disabled",l="开始日期超出了结束日期
      建议重新选择",d=[100,2e5],c="layui-laydate-static",m="layui-laydate-list",u="laydate-selected",h="layui-laydate-hint",y="laydate-day-prev",f="laydate-day-next",p="layui-laydate-footer",g=".laydate-btns-confirm",v="laydate-time-text",D=".laydate-btns-time",T=function(e){var t=this;t.index=++n.index,t.config=w.extend({},t.config,n.config,e),n.ready(function(){t.init()})},w=function(e){return new C(e)},C=function(e){for(var t=0,n="object"==typeof e?[e]:(this.selector=e,document.querySelectorAll(e||null));t0)return n[0].getAttribute(e)}():n.each(function(n,a){a.setAttribute(e,t)})},C.prototype.removeAttr=function(e){return this.each(function(t,n){n.removeAttribute(e)})},C.prototype.html=function(e){return this.each(function(t,n){n.innerHTML=e})},C.prototype.val=function(e){return this.each(function(t,n){n.value=e})},C.prototype.append=function(e){return this.each(function(t,n){"object"==typeof e?n.appendChild(e):n.innerHTML=n.innerHTML+e})},C.prototype.remove=function(e){return this.each(function(t,n){e?n.removeChild(e):n.parentNode.removeChild(n)})},C.prototype.on=function(e,t){return this.each(function(n,a){a.attachEvent?a.attachEvent("on"+e,function(e){e.target=e.srcElement,t.call(a,e)}):a.addEventListener(e,t,!1)})},C.prototype.off=function(e,t){return this.each(function(n,a){a.detachEvent?a.detachEvent("on"+e,t):a.removeEventListener(e,t,!1)})},T.isLeapYear=function(e){return e%4===0&&e%100!==0||e%400===0},T.prototype.config={type:"date",range:!1,format:"yyyy-MM-dd",value:null,isInitValue:!0,min:"1900-1-1",max:"2099-12-31",trigger:"focus",show:!1,showBottom:!0,btns:["clear","now","confirm"],lang:"cn",theme:"default",position:null,calendar:!1,mark:{},zIndex:null,done:null,change:null},T.prototype.lang=function(){var e=this,t=e.config,n={cn:{weeks:["日","一","二","三","四","五","六"],time:["时","分","秒"],timeTips:"选择时间",startTime:"开始时间",endTime:"结束时间",dateTips:"返回日期",month:["一","二","三","四","五","六","七","八","九","十","十一","十二"],tools:{confirm:"确定",clear:"清空",now:"现在"}},en:{weeks:["Su","Mo","Tu","We","Th","Fr","Sa"],time:["Hours","Minutes","Seconds"],timeTips:"Select Time",startTime:"Start Time",endTime:"End Time",dateTips:"Select Date",month:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],tools:{confirm:"Confirm",clear:"Clear",now:"Now"}}};return n[t.lang]||n.cn},T.prototype.init=function(){var e=this,t=e.config,n="yyyy|y|MM|M|dd|d|HH|H|mm|m|ss|s",a="static"===t.position,i={year:"yyyy",month:"yyyy-MM",date:"yyyy-MM-dd",time:"HH:mm:ss",datetime:"yyyy-MM-dd HH:mm:ss"};t.elem=w(t.elem),t.eventElem=w(t.eventElem),t.elem[0]&&(t.range===!0&&(t.range="-"),t.format===i.date&&(t.format=i[t.type]),e.format=t.format.match(new RegExp(n+"|.","g"))||[],e.EXP_IF="",e.EXP_SPLIT="",w.each(e.format,function(t,a){var i=new RegExp(n).test(a)?"\\d{"+function(){return new RegExp(n).test(e.format[0===t?t+1:t-1]||"")?/^yyyy|y$/.test(a)?4:a.length:/^yyyy$/.test(a)?"1,4":/^y$/.test(a)?"1,308":"1,2"}()+"}":"\\"+a;e.EXP_IF=e.EXP_IF+i,e.EXP_SPLIT=e.EXP_SPLIT+"("+i+")"}),e.EXP_IF=new RegExp("^"+(t.range?e.EXP_IF+"\\s\\"+t.range+"\\s"+e.EXP_IF:e.EXP_IF)+"$"),e.EXP_SPLIT=new RegExp("^"+e.EXP_SPLIT+"$",""),e.isInput(t.elem[0])||"focus"===t.trigger&&(t.trigger="click"),t.elem.attr("lay-key")||(t.elem.attr("lay-key",e.index),t.eventElem.attr("lay-key",e.index)),t.mark=w.extend({},t.calendar&&"cn"===t.lang?{"0-1-1":"元旦","0-2-14":"情人","0-3-8":"妇女","0-3-12":"植树","0-4-1":"愚人","0-5-1":"劳动","0-5-4":"青年","0-6-1":"儿童","0-9-10":"教师","0-9-18":"国耻","0-10-1":"国庆","0-12-25":"圣诞"}:{},t.mark),w.each(["min","max"],function(e,n){var a=[],i=[];if("number"==typeof t[n]){var r=t[n],o=(new Date).getTime(),s=864e5,l=new Date(r?r0)return!0;var a=w.elem("div",{"class":"layui-laydate-header"}),i=[function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-y"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-m"});return e.innerHTML="",e}(),function(){var e=w.elem("div",{"class":"laydate-set-ym"}),t=w.elem("span"),n=w.elem("span");return e.appendChild(t),e.appendChild(n),e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-m"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-y"});return e.innerHTML="",e}()],d=w.elem("div",{"class":"layui-laydate-content"}),c=w.elem("table"),m=w.elem("thead"),u=w.elem("tr");w.each(i,function(e,t){a.appendChild(t)}),m.appendChild(u),w.each(new Array(6),function(e){var t=c.insertRow(0);w.each(new Array(7),function(a){if(0===e){var i=w.elem("th");i.innerHTML=n.weeks[a],u.appendChild(i)}t.insertCell(a)})}),c.insertBefore(m,c.children[0]),d.appendChild(c),r[e]=w.elem("div",{"class":"layui-laydate-main laydate-main-list-"+e}),r[e].appendChild(a),r[e].appendChild(d),o.push(i),s.push(d),l.push(c)}),w(d).html(function(){var e=[],i=[];return"datetime"===t.type&&e.push(''+n.timeTips+""),w.each(t.btns,function(e,r){var o=n.tools[r]||"btn";t.range&&"now"===r||(a&&"clear"===r&&(o="cn"===t.lang?"重置":"Reset"),i.push(''+o+""))}),e.push('"),e.join("")}()),w.each(r,function(e,t){i.appendChild(t)}),t.showBottom&&i.appendChild(d),/^#/.test(t.theme)){var m=w.elem("style"),u=["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} .layui-this{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,e.elemID).replace(/{{theme}}/g,t.theme);"styleSheet"in m?(m.setAttribute("type","text/css"),m.styleSheet.cssText=u):m.innerHTML=u,w(i).addClass("laydate-theme-molv"),i.appendChild(m)}e.remove(T.thisElemDate),a?t.elem.append(i):(document.body.appendChild(i),e.position()),e.checkDate().calendar(),e.changeEvent(),T.thisElemDate=e.elemID,"function"==typeof t.ready&&t.ready(w.extend({},t.dateTime,{month:t.dateTime.month+1}))},T.prototype.remove=function(e){var t=this,n=(t.config,w("#"+(e||t.elemID)));return n.hasClass(c)||t.checkDate(function(){n.remove()}),t},T.prototype.position=function(){var e=this,t=e.config,n=e.bindElem||t.elem[0],a=n.getBoundingClientRect(),i=e.elem.offsetWidth,r=e.elem.offsetHeight,o=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},s=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},l=5,d=a.left,c=a.bottom;d+i+l>s("width")&&(d=s("width")-i-l),c+r+l>s()&&(c=a.top>r?a.top-r:s()-r,c-=2*l),t.position&&(e.elem.style.position=t.position),e.elem.style.left=d+("fixed"===t.position?0:o(1))+"px",e.elem.style.top=c+("fixed"===t.position?0:o())+"px"},T.prototype.hint=function(e){var t=this,n=(t.config,w.elem("div",{"class":h}));t.elem&&(n.innerHTML=e||"",w(t.elem).find("."+h).remove(),t.elem.appendChild(n),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){w(t.elem).find("."+h).remove()},3e3))},T.prototype.getAsYM=function(e,t,n){return n?t--:t++,t<0&&(t=11,e--),t>11&&(t=0,e++),[e,t]},T.prototype.systemDate=function(e){var t=e||new Date;return{year:t.getFullYear(),month:t.getMonth(),date:t.getDate(),hours:e?e.getHours():0,minutes:e?e.getMinutes():0,seconds:e?e.getSeconds():0}},T.prototype.checkDate=function(e){var t,a,i=this,r=(new Date,i.config),o=r.dateTime=r.dateTime||i.systemDate(),s=i.bindElem||r.elem[0],l=(i.isInput(s)?"val":"html",i.isInput(s)?s.value:"static"===r.position?"":s.innerHTML),c=function(e){e.year>d[1]&&(e.year=d[1],a=!0),e.month>11&&(e.month=11,a=!0),e.hours>23&&(e.hours=0,a=!0),e.minutes>59&&(e.minutes=0,e.hours++,a=!0),e.seconds>59&&(e.seconds=0,e.minutes++,a=!0),t=n.getEndDate(e.month+1,e.year),e.date>t&&(e.date=t,a=!0)},m=function(e,t,n){var o=["startTime","endTime"];t=(t.match(i.EXP_SPLIT)||[]).slice(1),n=n||0,r.range&&(i[o[n]]=i[o[n]]||{}),w.each(i.format,function(s,l){var c=parseFloat(t[s]);t[s].length必须遵循下述格式:
      "+(r.range?r.format+" "+r.range+" "+r.format:r.format)+"
      已为你重置"),a=!0):l&&l.constructor===Date?r.dateTime=i.systemDate(l):(r.dateTime=i.systemDate(),delete i.startState,delete i.endState,delete i.startDate,delete i.endDate,delete i.startTime,delete i.endTime),c(o),a&&l&&i.setValue(r.range?i.endDate?i.parse():"":i.parse()),e&&e(),i)},T.prototype.mark=function(e,t){var n,a=this,i=a.config;return w.each(i.mark,function(e,a){var i=e.split("-");i[0]!=t[0]&&0!=i[0]||i[1]!=t[1]&&0!=i[1]||i[2]!=t[2]||(n=a||t[2])}),n&&e.html(''+n+""),a},T.prototype.limit=function(e,t,n,a){var i,r=this,o=r.config,l={},d=o[n>41?"endDate":"dateTime"],c=w.extend({},d,t||{});return w.each({now:c,min:o.min,max:o.max},function(e,t){l[e]=r.newDate(w.extend({year:t.year,month:t.month,date:t.date},function(){var e={};return w.each(a,function(n,a){e[a]=t[a]}),e}())).getTime()}),i=l.nowl.max,e&&e[i?"addClass":"removeClass"](s),i},T.prototype.calendar=function(e){var t,a,i,r=this,s=r.config,l=e||s.dateTime,c=new Date,m=r.lang(),u="date"!==s.type&&"datetime"!==s.type,h=e?1:0,y=w(r.table[h]).find("td"),f=w(r.elemHeader[h][2]).find("span");if(l.yeard[1]&&(l.year=d[1],r.hint("最高只能支持到公元"+d[1]+"年")),r.firstDate||(r.firstDate=w.extend({},l)),c.setFullYear(l.year,l.month,1),t=c.getDay(),a=n.getEndDate(l.month||12,l.year),i=n.getEndDate(l.month+1,l.year),w.each(y,function(e,n){var d=[l.year,l.month],c=0;n=w(n),n.removeAttr("class"),e=t&&e=n.firstDate.year&&(r.month=a.max.month,r.date=a.max.date),n.limit(w(i),r,t),M++}),w(u[f?0:1]).attr("lay-ym",M-8+"-"+T[1]).html(b+p+" - "+(M-1+p))}else if("month"===e)w.each(new Array(12),function(e){var i=w.elem("li",{"lay-ym":e}),s={year:T[0],month:e};e+1==T[1]&&w(i).addClass(o),i.innerHTML=r.month[e]+(f?"月":""),d.appendChild(i),T[0]=n.firstDate.year&&(s.date=a.max.date),n.limit(w(i),s,t)}),w(u[f?0:1]).attr("lay-ym",T[0]+"-"+T[1]).html(T[0]+p);else if("time"===e){var E=function(){w(d).find("ol").each(function(e,a){w(a).find("li").each(function(a,i){n.limit(w(i),[{hours:a},{hours:n[x].hours,minutes:a},{hours:n[x].hours,minutes:n[x].minutes,seconds:a}][e],t,[["hours"],["hours","minutes"],["hours","minutes","seconds"]][e])})}),a.range||n.limit(w(n.footer).find(g),n[x],0,["hours","minutes","seconds"])};a.range?n[x]||(n[x]={hours:0,minutes:0,seconds:0}):n[x]=i,w.each([24,60,60],function(e,t){var a=w.elem("li"),i=["

      "+r.time[e]+"

        "];w.each(new Array(t),function(t){i.push(""+w.digit(t,2)+"")}),a.innerHTML=i.join("")+"
      ",d.appendChild(a)}),E()}if(y&&h.removeChild(y),h.appendChild(d),"year"===e||"month"===e)w(n.elemMain[t]).addClass("laydate-ym-show"),w(d).find("li").on("click",function(){var r=0|w(this).attr("lay-ym");if(!w(this).hasClass(s)){if(0===t)i[e]=r,l&&(n.startDate[e]=r),n.limit(w(n.footer).find(g),null,0);else if(l)n.endDate[e]=r;else{var c="year"===e?n.getAsYM(r,T[1]-1,"sub"):n.getAsYM(T[0],r,"sub");w.extend(i,{year:c[0],month:c[1]})}"year"===a.type||"month"===a.type?(w(d).find("."+o).removeClass(o),w(this).addClass(o),"month"===a.type&&"year"===e&&(n.listYM[t][0]=r,l&&(n[["startDate","endDate"][t]].year=r),n.list("month",t))):(n.checkDate("limit").calendar(),n.closeList()),n.setBtnStatus(),a.range||n.done(null,"change"),w(n.footer).find(D).removeClass(s)}});else{var S=w.elem("span",{"class":v}),k=function(){w(d).find("ol").each(function(e){var t=this,a=w(t).find("li");t.scrollTop=30*(n[x][C[e]]-2),t.scrollTop<=0&&a.each(function(e,n){if(!w(this).hasClass(s))return t.scrollTop=30*(e-2),!0})})},H=w(c[2]).find("."+v);k(),S.innerHTML=a.range?[r.startTime,r.endTime][t]:r.timeTips,w(n.elemMain[t]).addClass("laydate-time-show"),H[0]&&H.remove(),c[2].appendChild(S),w(d).find("ol").each(function(e){var t=this;w(t).find("li").on("click",function(){var r=0|this.innerHTML;w(this).hasClass(s)||(a.range?n[x][C[e]]=r:i[C[e]]=r,w(t).find("."+o).removeClass(o),w(this).addClass(o),E(),k(),(n.endDate||"time"===a.type)&&n.done(null,"change"),n.setBtnStatus())})})}return n},T.prototype.listYM=[],T.prototype.closeList=function(){var e=this;e.config;w.each(e.elemCont,function(t,n){w(this).find("."+m).remove(),w(e.elemMain[t]).removeClass("laydate-ym-show laydate-time-show")}),w(e.elem).find("."+v).remove()},T.prototype.setBtnStatus=function(e,t,n){var a,i=this,r=i.config,o=w(i.footer).find(g),d=r.range&&"date"!==r.type&&"time"!==r.type;d&&(t=t||i.startDate,n=n||i.endDate,a=i.newDate(t).getTime()>i.newDate(n).getTime(),i.limit(null,t)||i.limit(null,n)?o.addClass(s):o[a?"addClass":"removeClass"](s),e&&a&&i.hint("string"==typeof e?l.replace(/日期/g,e):l))},T.prototype.parse=function(e,t){var n=this,a=n.config,i=t||(e?w.extend({},n.endDate,n.endTime):a.range?w.extend({},n.startDate,n.startTime):a.dateTime),r=n.format.concat();return w.each(r,function(e,t){/yyyy|y/.test(t)?r[e]=w.digit(i.year,t.length):/MM|M/.test(t)?r[e]=w.digit(i.month+1,t.length):/dd|d/.test(t)?r[e]=w.digit(i.date,t.length):/HH|H/.test(t)?r[e]=w.digit(i.hours,t.length):/mm|m/.test(t)?r[e]=w.digit(i.minutes,t.length):/ss|s/.test(t)&&(r[e]=w.digit(i.seconds,t.length))}),a.range&&!e?r.join("")+" "+a.range+" "+n.parse(1):r.join("")},T.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},T.prototype.setValue=function(e){var t=this,n=t.config,a=t.bindElem||n.elem[0],i=t.isInput(a)?"val":"html";return"static"===n.position||w(a)[i](e||""),this},T.prototype.stampRange=function(){var e,t,n=this,a=n.config,i=w(n.elem).find("td");if(a.range&&!n.endDate&&w(n.footer).find(g).addClass(s),n.endDate)return e=n.newDate({year:n.startDate.year,month:n.startDate.month,date:n.startDate.date}).getTime(),t=n.newDate({year:n.endDate.year,month:n.endDate.month,date:n.endDate.date}).getTime(),e>t?n.hint(l):void w.each(i,function(a,i){var r=w(i).attr("lay-ymd").split("-"),s=n.newDate({year:r[0],month:r[1]-1,date:r[2]}).getTime();w(i).removeClass(u+" "+o),s!==e&&s!==t||w(i).addClass(w(i).hasClass(y)||w(i).hasClass(f)?u:o),s>e&&s','
      '+f+"
      ",'
      ','',"
      ","
      "].join(""));return l.ie&&l.ie<8?c.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),s.call(a,m,c[0],y),c.addClass("layui-hide").after(m),a.index)},c.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},c.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},c.prototype.setContent=function(t,i,a){var l=u(t);l[0]&&(a?e(l[0].document.body).append(i):e(l[0].document.body).html(i),layedit.sync(t))},c.prototype.sync=function(t){var i=u(t);if(i[0]){var a=e("#"+i[1].attr("textarea"));a.val(d(i[0].document.body.innerHTML))}},c.prototype.getSelection=function(t){var e=u(t);if(e[0]){var i=m(e[0].document);return document.selection?i.text:i.toString()}};var s=function(t,i,a){var l=this,n=t.find("iframe");n.css({height:a.height}).on("load",function(){var o=n.contents(),r=n.prop("contentWindow"),c=o.find("head"),s=e([""].join("")),u=o.find("body");c.append(s),u.attr("contenteditable","true").css({"min-height":a.height}).html(i.value||""),y.apply(l,[r,n,i,a]),g.call(l,r,t,a)})},u=function(t){var i=e("#LAY_layedit_"+t),a=i.prop("contentWindow");return[a,i]},d=function(t){return 8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),t},y=function(t,a,n,o){var r=t.document,c=e(r.body);c.on("keydown",function(t){var e=t.keyCode;if(13===e){var a=m(r),l=p(a),n=l.parentNode;if("pre"===n.tagName.toLowerCase()){if(t.shiftKey)return;return i.msg("请暂时用shift+enter"),!1}r.execCommand("formatBlock",!1,"

      ")}}),e(n).parents("form").on("submit",function(){var t=c.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),c.on("paste",function(e){r.execCommand("formatBlock",!1,"

      "),setTimeout(function(){f.call(t,c),n.value=c.html()},100)})},f=function(t){var i=this;i.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),e(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},m=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},p=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,i,a){var l=this.document,n=document.createElement(t);for(var o in i)n.setAttribute(o,i[o]);if(n.removeAttribute("text"),l.selection){var r=a.text||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.pasteHTML(e(n).prop("outerHTML")),a.select()}else{var r=a.toString()||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.deleteContents(),a.insertNode(n)}},h=function(t,i){var a=this.document,l="layedit-tool-active",n=p(m(a)),o=function(e){return t.find(".layedit-tool-"+e)};i&&i[i.hasClass(l)?"removeClass":"addClass"](l),t.find(">i").removeClass(l),o("unlink").addClass(r),e(n).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||o("b").addClass(l),"i"!==t&&"em"!==t||o("i").addClass(l),"u"===t&&o("u").addClass(l),"strike"===t&&o("d").addClass(l),"p"===t&&("center"===e?o("center").addClass(l):"right"===e?o("right").addClass(l):o("left").addClass(l)),"a"===t&&(o("link").addClass(l),o("unlink").removeClass(r))})},g=function(t,a,l){var n=t.document,o=e(n.body),c={link:function(i){var a=p(i),l=e(a).parent();b.call(o,{href:l.attr("href"),target:l.attr("target")},function(e){var a=l[0];"A"===a.tagName?a.href=e.url:v.call(t,"a",{target:e.target,href:e.url,text:e.url},i)})},unlink:function(t){n.execCommand("unlink")},face:function(e){x.call(this,function(i){v.call(t,"img",{src:i.src,alt:i.alt},e)})},image:function(a){var n=this;layui.use("upload",function(o){var r=l.uploadImage||{};o.render({url:r.url,method:r.type,elem:e(n).find("input")[0],done:function(e){0==e.code?(e.data=e.data||{},v.call(t,"img",{src:e.data.src,alt:e.data.title},a)):i.msg(e.msg||"上传失败")}})})},code:function(e){k.call(o,function(i){v.call(t,"pre",{text:i.code,"lay-lang":i.lang},e)})},help:function(){i.open({type:2,title:"帮助",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["http://www.layui.com/about/layedit/help.html","no"]})}},s=a.find(".layui-layedit-tool"),u=function(){var i=e(this),a=i.attr("layedit-event"),l=i.attr("lay-command");if(!i.hasClass(r)){o.focus();var u=m(n);u.commonAncestorContainer;l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand("formatBlock",!1,"

      "),setTimeout(function(){o.focus()},10)):c[a]&&c[a].call(this,u),h.call(t,s,i)}},d=/image/;s.find(">i").on("mousedown",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)||u.call(this)}).on("click",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)&&u.call(this)}),o.on("click",function(){h.call(t,s),i.close(x.index)})},b=function(t,e){var l=this,n=i.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"超链接",skin:"layui-layer-msg",content:['

        ','
      • ','','
        ','',"
        ","
      • ",'
      • ','','
        ','",'","
        ","
      • ",'
      • ','','',"
      • ","
      "].join(""),success:function(t,n){var o="submit(layedit-link-yes)";a.render("radio"),t.find(".layui-btn-primary").on("click",function(){i.close(n),l.focus()}),a.on(o,function(t){i.close(b.index),e&&e(t.field)})}});b.index=n},x=function(t){var a=function(){var t=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],e={};return layui.each(t,function(t,i){e[i]=layui.cache.dir+"images/face/"+t+".gif"}),e}();return x.hide=x.hide||function(t){"face"!==e(t.target).attr("layedit-event")&&i.close(x.index)},x.index=i.tips(function(){var t=[];return layui.each(a,function(e,i){t.push('
    • '+e+'
    • ')}),'
        '+t.join("")+"
      "}(),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(l,n){l.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){t&&t({src:a[this.title],alt:this.title}),i.close(n)}),e(document).off("click",x.hide).on("click",x.hide)}})},k=function(t){var e=this,l=i.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"插入代码",skin:"layui-layer-msg",content:['
        ','
      • ','','
        ','","
        ","
      • ",'
      • ','','
        ','',"
        ","
      • ",'
      • ','','',"
      • ","
      "].join(""),success:function(l,n){var o="submit(layedit-code-yes)";a.render("select"),l.find(".layui-btn-primary").on("click",function(){i.close(n),e.focus()}),a.on(o,function(e){i.close(k.index),t&&t(e.field)})}});k.index=l},C={html:'',strong:'',italic:'',underline:'',del:'',"|":'',left:'',center:'',right:'',link:'',unlink:'',face:'',image:'',code:'',help:''},w=new c;t(n,w)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/layer.js b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/layer.js new file mode 100644 index 0000000..03e780c --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/layer.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,i=t.length-1,n=i;n>0;n--)if("interactive"===t[n].readyState){e=t[n].src;break}return e||t[i].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"],getStyle:function(t,i){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](i)},link:function(t,i,n){if(r.path){var a=document.getElementsByTagName("head")[0],s=document.createElement("link");"string"==typeof i&&(n=i);var l=(n||t).replace(/\.|\//g,""),f="layuicss-"+l,c=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,document.getElementById(f)||a.appendChild(s),"function"==typeof i&&!function u(){return++c>80?e.console&&console.error("layer.css: Invalid"):void(1989===parseInt(o.getStyle(document.getElementById(f),"width"))?i():setTimeout(u,100))}()}}},r={v:"3.1.1",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):o.link("theme/"+e.extend),this):this},ready:function(e){var t="layer",i="",n=(a?"modules/layer/":"theme/")+"default/layer.css?v="+r.v+i;return a?layui.addcss(n,e,t):o.link(n,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),document.body?t.creat():setTimeout(function(){t.creat()},30)};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim-00","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'
      '+(f?r.title[0]:r.title)+"
      ":"";return r.zIndex=s,t([r.shade?'
      ':"",'
      '+(e&&2!=r.type?"":u)+'
      '+(0==r.type&&r.icon!==-1?'':"")+(1==r.type&&e?"":r.content||"")+'
      '+function(){var e=c?'':"";return r.closeBtn&&(e+=''),e}()+""+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t'+r.btn[t]+"";return'
      '+e+"
      "}():"")+(r.resize?'':"")+"
      "],u,i('
      ')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"","auto"];t.content='';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}if(e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),i("#layui-layer-shade"+e.index).css({"background-color":t.shade[1]||"#000",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]){var u="layer-anim "+l.anim[t.anim];e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data("isOutAnim",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i("#"+l[0]+e);""===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find("."+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css("padding-top"))))};switch(a.type){case 2:u("iframe");break;default:""===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u("."+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u("."+l[5])):u("."+l[5])}return t},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;af&&(a=f),ou&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("isOutAnim")&&t.addClass("layer-anim "+a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),r.ie&&r.ie<10||!t.data("isOutAnim")?f():setTimeout(function(){f()},200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'":function(){return''}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(t){s=t.find(".layui-layer-input"),s.val(e.value||"").focus(),"function"==typeof f&&f(t)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n="layui-this",a=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,a="";if(e>0)for(a=''+t[0].title+"";i"+t[i].title+"";return a}(),content:'
        '+function(){var e=t.length,i=1,a="";if(e>0)for(a='
      • '+(t[0].content||"no content")+"
      • ";i'+(t[i].content||"no content")+"";return a}()+"
      ",success:function(t){var o=t.find(".layui-layer-title").children(),r=t.find(".layui-layer-tabmain").children();o.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),"function"==typeof e.change&&e.change(o)}),"function"==typeof a&&a(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]'+(u[d].alt||
      '+(u.length>1?'':"")+'
      '+(u[d].alt||"")+""+s.imgIndex+"/"+u.length+"
      ",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常
      是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/layim.js b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/layim.js new file mode 100644 index 0000000..73b22b0 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/layim.js @@ -0,0 +1,3 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ +;layui.define(["layer","laytpl","upload"],function(i){var a="3.9.1",e=layui.$,t=layui.layer,n=layui.laytpl,l=layui.device(),s="layui-show",o="layim-this",d=20,r={},c=function(){this.v=a,e("body").on("click","*[layim-event]",function(i){var a=e(this),t=a.attr("layim-event");ti[t]?ti[t].call(this,a,i):""})};c.prototype.config=function(i){var a=[];if(layui.each(Array(5),function(i){a.push(layui.cache.dir+"css/modules/layim/skin/"+(i+1)+".jpg")}),i=i||{},i.skin=i.skin||[],layui.each(i.skin,function(i,e){a.unshift(e)}),i.skin=a,i=e.extend({isfriend:!0,isgroup:!0,voice:"default.mp3"},i),window.JSON&&window.JSON.parse)return H(i),this},c.prototype.on=function(i,a){return"function"==typeof a&&(r[i]?r[i].push(a):r[i]=[a]),this},c.prototype.cache=function(){return j},c.prototype.chat=function(i){if(window.JSON&&window.JSON.parse)return z(i),this},c.prototype.setChatMin=function(){return N(),this},c.prototype.setChatStatus=function(i){var a=_();if(a){var e=a.elem.find(".layim-chat-status");return e.html(i),this}},c.prototype.getMessage=function(i){return K(i),this},c.prototype.notice=function(i){return J(i),this},c.prototype.add=function(i){return M(i),this},c.prototype.setFriendGroup=function(i){return M(i,"setGroup"),this},c.prototype.msgbox=function(i){return V(i),this},c.prototype.addList=function(i){return P(i),this},c.prototype.removeList=function(i){return W(i),this},c.prototype.setFriendStatus=function(i,a){var t=e(".layim-friend"+i);t["online"===a?"removeClass":"addClass"]("layim-list-gray")},c.prototype.content=function(i){return layui.data.content(i)};var u=function(i){var a={friend:"该分组下暂无好友",group:"暂无群组",history:"暂无历史会话"};return i=i||{},i.item=i.item||"d."+i.type,["{{# var length = 0; layui.each("+i.item+", function(i, data){ length++; }}",'
    • {{ data.username||data.groupname||data.name||"佚名" }}

      {{ data.remark||data.sign||"" }}

      new
    • ',"{{# }); if(length === 0){ }}",'
    • '+(a[i.type]||"暂无数据")+"
    • ","{{# } }}"].join("")},y=['
      ','
      ','
      {{ d.mine.username }}
      ','
      ','{{# if(d.mine.status === "online"){ }}','','{{# } else if(d.mine.status === "hide") { }}','',"{{# } }}",'
        ','
      • 在线
      • ','
      • 隐身
      • ',"
      ","
      ",'',"
      ",'
        ','
      • ','
      • ','
      • ',"
      ",'
        ','{{# layui.each(d.friend, function(index, item){ var spread = d.local["spread"+index]; }}',"
      • ",'
        {{# if(spread === "true"){ }}{{# } else { }}{{# } }}{{ item.groupname||"未命名分组"+index }}( {{ (item.list||[]).length }})
        ','
          ',u({type:"friend",item:"item.list",index:"index"}),"
        ","
      • ","{{# }); if(d.friend.length === 0){ }}",'
        • 暂无联系人
        ',"{{# } }}","
      ",'
        ',"
      • ",'
          ',u({type:"group"}),"
        ","
      • ","
      ",'
        ',"
      • ",'
          ',u({type:"history"}),"
        ","
      • ","
      ",'
        ',"
      • ",'',"
      • ","
      ",'
        ','',"{{# if(d.base.msgbox){ }}",'
      • ',"{{# } }}","{{# if(d.base.find){ }}",'
      • ',"{{# } }}",'
      • ',"{{# if(!d.base.copyright){ }}",'
      • ',"{{# } }}","
      ",'',"
      "].join(""),m=['
        ',"{{# layui.each(d.skin, function(index, item){ }}",'
      • ',"{{# }); }}",'
      • 简约
      • ',"
      "].join(""),f=['
      ','
      ','
      ','{{ d.data.name||"佚名" }} {{d.data.temporary ? "临时会话" : ""}} {{# if(d.data.type==="group"){ }} {{# } }}','

      ',"
      ","
      ",'
      ',"
        ","
        ",'","
        "].join(""),p=['
        ','

        {{ d.data.name||"" }}

        ','
        ','{{# if(d.data.type === "friend" && d.type === "setGroup"){ }}',"

        选择分组

        ",'{{# } if(d.data.type === "friend"){ }}','","{{# } }}",'{{# if(d.data.type === "group"){ }}',"

        请输入验证信息

        ",'{{# } if(d.type !== "setGroup"){ }}','',"{{# } }}","
        ","
        "].join(""),h=['
      • ','
        ',"{{# if(d.mine){ }}",'{{ layui.data.date(d.timestamp) }}{{ d.username||"佚名" }}',"{{# } else { }}",'{{ d.username||"佚名" }}{{ layui.data.date(d.timestamp) }}',"{{# } }}","
        ",'
        {{ layui.data.content(d.content||" ") }}
        ',"
      • "].join(""),v='
      • {{ d.data.name||"佚名" }}{{# if(!d.base.brief){ }}ဇ{{# } }}
      • ',g=function(i){return i<10?"0"+(0|i):i};layui.data.date=function(i){var a=new Date(i||new Date);return a.getFullYear()+"-"+g(a.getMonth()+1)+"-"+g(a.getDate())+" "+g(a.getHours())+":"+g(a.getMinutes())+":"+g(a.getSeconds())},layui.data.content=function(i){var a=function(i){return new RegExp("\\n*\\["+(i||"")+"(code|pre|div|span|p|table|thead|th|tbody|tr|td|ul|li|ol|li|dl|dt|dd|h2|h3|h4|h5)([\\s\\S]*?)\\]\\n*","g")};return i=(i||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""").replace(/@(\S+)(\s+?|$)/g,'@$1$2').replace(/face\[([^\s\[\]]+?)\]/g,function(i){var a=i.replace(/^face/g,"");return''+a+''}).replace(/img\[([^\s]+?)\]/g,function(i){return''}).replace(/file\([\s\S]+?\)\[[\s\S]*?\]/g,function(i){var a=(i.match(/file\(([\s\S]+?)\)\[/)||[])[1],e=(i.match(/\)\[([\s\S]*?)\]/)||[])[1];return a?''+(e||a)+"":i}).replace(/audio\[([^\s]+?)\]/g,function(i){return'

        音频消息

        '}).replace(/video\[([^\s]+?)\]/g,function(i){return'
        '}).replace(/a\([\s\S]+?\)\[[\s\S]*?\]/g,function(i){var a=(i.match(/a\(([\s\S]+?)\)\[/)||[])[1],e=(i.match(/\)\[([\s\S]*?)\]/)||[])[1];return a?''+(e||a)+"":i}).replace(a(),"<$1 $2>").replace(a("/"),"").replace(/\n/g,"
        ")};var x,b,w,k,C,S=function(i,a,n){return i=i||{},e.ajax({url:i.url,type:i.type||"get",data:i.data,dataType:i.dataType||"json",cache:!1,success:function(i){0==i.code?a&&a(i.data||{}):t.msg(i.msg||(n||"Error")+": LAYIM_NOT_GET_DATA",{time:5e3})},error:function(i,a){window.console&&console.log&&console.error("LAYIM_DATE_ERROR:"+a)}})},j={message:{},chat:[]},H=function(i){var a=i.init||{};return mine=a.mine||{},local=layui.data("layim")[mine.id]||{},obj={base:i,local:local,mine:mine,history:local.history||{}},create=function(a){var t=a.mine||{},l=layui.data("layim")[t.id]||{},s={base:i,local:l,mine:t,friend:a.friend||[],group:a.group||[],history:l.history||{}};j=e.extend(j,s),L(n(y).render(s)),(l.close||i.min)&&T(),layui.each(r.ready,function(i,a){a&&a(s)})},j=e.extend(j,obj),i.brief?layui.each(r.ready,function(i,a){a&&a(obj)}):void(a.url?S(a,create,"INIT"):create(a))},L=function(i){return t.open({type:1,area:["260px","520px"],skin:"layui-box layui-layim",title:"​",offset:"rb",id:"layui-layim",shade:!1,anim:2,resize:!1,content:i,success:function(i){x=i,R(i),j.base.right&&i.css("margin-left","-"+j.base.right),b&&t.close(b.attr("times"));var a=[],n=i.find(".layim-list-history");n.find("li").each(function(){a.push(e(this).prop("outerHTML"))}),a.length>0&&(a.reverse(),n.html(a.join(""))),A(),ti.sign()},cancel:function(i){T();var a=layui.data("layim")[j.mine.id]||{};return a.close=!0,layui.data("layim",{key:j.mine.id,value:a}),!1}})},A=function(){x.on("contextmenu",function(i){return i.cancelBubble=!0,i.returnValue=!1,!1});var i=function(){t.closeAll("tips")};x.find(".layim-list-history").on("contextmenu","li",function(a){var n=e(this),l='
        • 移除该会话
        • 清空全部会话列表
        ';n.hasClass("layim-null")||(t.tips(l,this,{tips:1,time:0,anim:5,fixed:!0,skin:"layui-box layui-layim-contextmenu",success:function(i){var a=function(i){ii(i)};i.off("mousedown",a).on("mousedown",a)}}),e(document).off("mousedown",i).on("mousedown",i),e(window).off("resize",i).on("resize",i))})},T=function(i){return b&&t.close(b.attr("times")),x&&x.hide(),j.mine=j.mine||{},t.open({type:1,title:!1,id:"layui-layim-close",skin:"layui-box layui-layim-min layui-layim-close",shade:!1,closeBtn:!1,anim:2,offset:"rb",resize:!1,content:''+(i||j.base.title||"我的LayIM")+"",move:"#layui-layim-close img",success:function(i,a){b=i,j.base.right&&i.css("margin-left","-"+j.base.right),i.on("click",function(){t.close(a),x.show();var i=layui.data("layim")[j.mine.id]||{};delete i.close,layui.data("layim",{key:j.mine.id,value:i})})}})},z=function(i){i=i||{};var a=e("#layui-layim-chat"),l={data:i,base:j.base,local:j.local};if(!i.id)return t.msg("非法用户");if(a[0]){var s=w.find(".layim-chat-list"),o=s.find(".layim-chatlist-"+i.type+i.id),d=w.find(".layui-layer-max").hasClass("layui-layer-maxmin"),c=a.children(".layim-chat-box");return"none"===w.css("display")&&w.show(),k&&t.close(k.attr("times")),1!==s.find("li").length||o[0]||(d||w.css("width",800),s.css({height:w.height()}).show(),c.css("margin-left","200px")),o[0]||(s.append(n(v).render(l)),c.append(n(f).render(l)),I(i),E()),O(s.find(".layim-chatlist-"+i.type+i.id)),o[0]||U(),$(i),Q(),C}l.first=!0;var u=C=t.open({type:1,area:"600px",skin:"layui-box layui-layim-chat",id:"layui-layim-chat",title:"​",shade:!1,maxmin:!0,offset:i.offset||"auto",anim:i.anim||0,closeBtn:!j.base.brief&&1,content:n('
          '+v+'
        '+f+"
        ").render(l),success:function(a){w=a,a.css({"min-width":"500px","min-height":"420px"}),I(i),"function"==typeof i.success&&i.success(a),Q(),R(a),$(i),U(),q(),layui.each(r.chatChange,function(i,a){a&&a(_())}),a.on("dblclick",".layui-layim-photos",function(){var i=this.src;t.close(z.photosIndex),t.photos({photos:{data:[{alt:"大图模式",src:i}]},shade:.01,closeBtn:2,anim:0,resize:!1,success:function(i,a){z.photosIndex=a}})})},full:function(i){t.style(u,{width:"100%",height:"100%"},!0),E()},resizing:E,restore:E,min:function(){return N(),!1},end:function(){t.closeAll("tips"),w=null}});return u},I=function(i){e(".layim-"+i.type+i.id).each(function(){e(this).hasClass("layim-list-gray")&&layui.layim.setFriendStatus(i.id,"offline")})},E=function(){var i=w.find(".layim-chat-list"),a=w.find(".layim-chat-main"),e=w.height();i.css({height:e}),a.css({height:e-20-80-158})},N=function(i){var a=i||_().data,n=layui.layim.cache().base;w&&!i&&w.hide(),t.close(N.index),N.index=t.open({type:1,title:!1,skin:"layui-box layui-layim-min",shade:!1,closeBtn:!1,anim:a.anim||2,offset:"b",move:"#layui-layim-min",resize:!1,area:["182px","50px"],content:''+a.name+"",success:function(a,l){i||(k=a),n.minRight&&t.style(l,{left:e(window).width()-a.outerWidth()-parseFloat(n.minRight)}),a.find(".layui-layer-content span").on("click",function(){t.close(l),i?layui.each(j.chat,function(i,a){z(a)}):w.show(),i&&(j.chat=[],Z())}),a.find(".layui-layer-content img").on("click",function(i){ii(i)})}})},M=function(i,a){return i=i||{},t.close(M.index),M.index=t.open({type:1,area:"430px",title:{friend:"添加好友",group:"加入群组"}[i.type]||"",shade:!1,resize:!1,btn:a?["确认","取消"]:["发送申请","关闭"],content:n(p).render({data:{name:i.username||i.groupname,avatar:i.avatar,group:i.group||parent.layui.layim.cache().friend||[],type:i.type},type:a}),yes:function(e,t){var n=t.find("#LAY_layimGroup"),l=t.find("#LAY_layimRemark");a?i.submit&&i.submit(n.val(),e):i.submit&&i.submit(n.val(),l.val(),e)}})},O=function(i,a){i=i||e(".layim-chat-list ."+o);var n=i.index()===-1?0:i.index(),l=".layim-chat",d=w.find(l).eq(n),c=w.find(".layui-layer-max").hasClass("layui-layer-maxmin");if(a){i.hasClass(o)&&O(0===n?i.next():i.prev());var u=w.find(l).length;return 1===u?t.close(C):(i.remove(),d.remove(),2===u&&(w.find(".layim-chat-list").hide(),c||w.css("width","600px"),w.find(".layim-chat-box").css("margin-left",0)),!1)}i.addClass(o).siblings().removeClass(o),d.addClass(s).siblings(l).removeClass(s),d.find("textarea").focus(),layui.each(r.chatChange,function(i,a){a&&a(_())}),q()},q=function(){var i=_(),a=j.message[i.data.type+i.data.id];a&&delete j.message[i.data.type+i.data.id]},_=c.prototype.thisChat=function(){if(w){var i=e(".layim-chat-list ."+o).index(),a=w.find(".layim-chat").eq(i),t=JSON.parse(decodeURIComponent(a.find(".layim-chat-tool").data("json")));return{elem:a,data:t,textarea:a.find("textarea")}}},R=function(i){var a=layui.data("layim")[j.mine.id]||{},e=a.skin;i.css({"background-image":e?"url("+e+")":function(){return j.base.initSkin?"url("+(layui.cache.dir+"css/modules/layim/skin/"+j.base.initSkin)+")":"none"}()})},$=function(i){var a=layui.data("layim")[j.mine.id]||{},e={},t=a.history||{},l=t[i.type+i.id];if(x){var s=x.find(".layim-list-history");if(i.historyTime=(new Date).getTime(),t[i.type+i.id]=i,a.history=t,layui.data("layim",{key:j.mine.id,value:a}),!l){e[i.type+i.id]=i;var o=n(u({type:"history",item:"d.data"})).render({data:e});s.prepend(o),s.find(".layim-null").remove()}}},D=function(){var i={username:j.mine?j.mine.username:"访客",avatar:j.mine?j.mine.avatar:layui.cache.dir+"css/pc/layim/skin/logo.jpg",id:j.mine?j.mine.id:null,mine:!0},a=_(),e=a.elem.find(".layim-chat-main ul"),l=j.base.maxLength||3e3;if(i.content=a.textarea.val(),""!==i.content.replace(/\s/g,"")){if(i.content.length>l)return t.msg("内容最长不能超过"+l+"个字符");e.append(n(h).render(i));var s={mine:i,to:a.data},o={username:s.mine.username,avatar:s.mine.avatar,id:s.to.id,type:s.to.type,content:s.mine.content,timestamp:(new Date).getTime(),mine:!0};B(o),layui.each(r.sendMessage,function(i,a){a&&a(s)})}Z(),a.textarea.val("").focus()},J=function(i){if(i=i||{},window.Notification)if("granted"===Notification.permission){new Notification(i.title||"",{body:i.content||"",icon:i.avatar||"http://tp2.sinaimg.cn/5488749285/50/5719808192/1"})}else Notification.requestPermission()},F=function(){if(!(l.ie&&l.ie<9)){var i=document.createElement("audio");i.src=layui.cache.dir+"css/modules/layim/voice/"+j.base.voice,i.play()}},G={},K=function(i){i=i||{};var a=e(".layim-chatlist-"+i.type+i.id),t={},l=a.index();if(i.timestamp=i.timestamp||(new Date).getTime(),i.fromid==j.mine.id&&(i.mine=!0),i.system||B(i),G=JSON.parse(JSON.stringify(i)),j.base.voice&&F(),!w&&i.content||l===-1){if(j.message[i.type+i.id])j.message[i.type+i.id].push(i);else if(j.message[i.type+i.id]=[i],"friend"===i.type){var s;layui.each(j.friend,function(a,e){if(layui.each(e.list,function(a,e){if(e.id==i.id)return e.type="friend",e.name=e.username,j.chat.push(e),s=!0}),s)return!0}),s||(i.name=i.username,i.temporary=!0,j.chat.push(i))}else if("group"===i.type){var o;layui.each(j.group,function(a,e){if(e.id==i.id)return e.type="group",e.name=e.groupname,j.chat.push(e),o=!0}),o||(i.name=i.groupname,j.chat.push(i))}else i.name=i.name||i.username||i.groupname,j.chat.push(i);if("group"===i.type&&layui.each(j.group,function(a,e){if(e.id==i.id)return t.avatar=e.avatar,!0}),!i.system)return j.base.notice&&J({title:"来自 "+i.username+" 的消息",content:i.content,avatar:t.avatar||i.avatar}),N({name:"收到新消息",avatar:t.avatar||i.avatar,anim:6})}if(w){var d=_();d.data.type+d.data.id!==i.type+i.id&&(a.addClass("layui-anim layer-anim-06"),setTimeout(function(){a.removeClass("layui-anim layer-anim-06")},300));var r=w.find(".layim-chat").eq(l),c=r.find(".layim-chat-main ul");i.system?l!==-1&&c.append('
      • '+i.content+"
      • "):""!==i.content.replace(/\s/g,"")&&c.append(n(h).render(i)),Z()}},Y="layui-anim-loop layer-anim-05",V=function(i){var a=x.find(".layim-tool-msgbox");a.find("span").addClass(Y).html(i)},B=function(i){var a=layui.data("layim")[j.mine.id]||{};a.chatlog=a.chatlog||{};var e=a.chatlog[i.type+i.id];if(e){var t;layui.each(e,function(a,e){e.timestamp===i.timestamp&&e.type===i.type&&e.id===i.id&&e.content===i.content&&(t=!0)}),t||i.fromid==j.mine.id||e.push(i),e.length>d&&e.shift()}else a.chatlog[i.type+i.id]=[i];layui.data("layim",{key:j.mine.id,value:a})},U=function(){var i=layui.data("layim")[j.mine.id]||{},a=_(),e=i.chatlog||{},t=a.elem.find(".layim-chat-main ul");layui.each(e[a.data.type+a.data.id],function(i,a){t.append(n(h).render(a))}),Z()},P=function(i){var a,e={},l=x.find(".layim-list-"+i.type);if(j[i.type])if("friend"===i.type)layui.each(j.friend,function(n,l){if(i.groupid==l.id)return layui.each(j.friend[n].list,function(e,t){if(t.id==i.id)return a=!0}),a?t.msg("好友 ["+(i.username||"")+"] 已经存在列表中",{anim:6}):(j.friend[n].list=j.friend[n].list||[],e[j.friend[n].list.length]=i,i.groupIndex=n,j.friend[n].list.push(i),!0)});else if("group"===i.type){if(layui.each(j.group,function(e,t){if(t.id==i.id)return a=!0}),a)return t.msg("您已是 ["+(i.groupname||"")+"] 的群成员",{anim:6});e[j.group.length]=i,j.group.push(i)}if(!a){var s=n(u({type:i.type,item:"d.data",index:"friend"===i.type?"data.groupIndex":null})).render({data:e});if("friend"===i.type){var o=l.find(">li").eq(i.groupIndex);o.find(".layui-layim-list").append(s),o.find(".layim-count").html(j.friend[i.groupIndex].list.length),o.find(".layim-null")[0]&&o.find(".layim-null").remove()}else"group"===i.type&&(l.append(s),l.find(".layim-null")[0]&&l.find(".layim-null").remove())}},W=function(i){var a=x.find(".layim-list-"+i.type);j[i.type]&&("friend"===i.type?layui.each(j.friend,function(e,t){layui.each(t.list,function(t,n){if(i.id==n.id){var l=a.find(">li").eq(e);l.find(".layui-layim-list>li");return l.find(".layui-layim-list>li").eq(t).remove(),j.friend[e].list.splice(t,1),l.find(".layim-count").html(j.friend[e].list.length),0===j.friend[e].list.length&&l.find(".layui-layim-list").html('
      • 该分组下已无好友了
      • '),!0}})}):"group"===i.type&&layui.each(j.group,function(e,t){if(i.id==t.id)return a.find(">li").eq(e).remove(),j.group.splice(e,1),0===j.group.length&&a.html('
      • 暂无群组
      • '),!0}))},Z=function(){var i=_(),a=i.elem.find(".layim-chat-main"),e=a.find("ul"),t=e.find("li").length;if(t>=d){var n=e.find("li").eq(0);e.prev().hasClass("layim-chat-system")||e.before('
        查看更多记录
        '),t>d&&n.remove()}a.scrollTop(a[0].scrollHeight+1e3),a.find("ul li:last").find("img").load(function(){a.scrollTop(a[0].scrollHeight+1e3)})},Q=function(){var i=_(),a=i.textarea;a.focus(),a.off("keydown").on("keydown",function(i){var e=layui.data("layim")[j.mine.id]||{},t=i.keyCode;if("Ctrl+Enter"===e.sendHotKey)return void(i.ctrlKey&&13===t&&D());if(13===t){if(i.ctrlKey)return a.val(a.val()+"\n");if(i.shiftKey)return;i.preventDefault(),D()}})},X=function(){var i=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],a={};return layui.each(i,function(i,e){a[e]=layui.cache.dir+"images/face/"+i+".gif"}),a}(),ii=layui.stope,ai=function(i,a){var e,t=i.value;i.focus(),document.selection?(e=document.selection.createRange(),document.selection.empty(),e.text=a):(e=[t.substring(0,i.selectionStart),a,t.substr(i.selectionEnd)],i.focus(),i.value=e.join(""))},ei="layui-anim-upbit",ti={status:function(i,a){var t=function(){i.next().hide().removeClass(ei)},n=i.attr("lay-type");if("show"===n)ii(a),i.next().show().addClass(ei),e(document).off("click",t).on("click",t);else{var l=i.parent().prev();i.addClass(o).siblings().removeClass(o),l.html(i.find("cite").html()),l.removeClass("layim-status-"+("online"===n?"hide":"online")).addClass("layim-status-"+n),layui.each(r.online,function(i,a){a&&a(n)})}},sign:function(){var i=x.find(".layui-layim-remark");i.on("change",function(){var i=this.value;layui.each(r.sign,function(a,e){e&&e(i)})}),i.on("keyup",function(i){var a=i.keyCode;13===a&&this.blur()})},tab:function(i){var a,e=".layim-tab-content",t=x.find(".layui-layim-tab>li");"number"==typeof i?(a=i,i=t.eq(a)):a=i.index(),a>2?t.removeClass(o):(ti.tab.index=a,i.addClass(o).siblings().removeClass(o)),x.find(e).eq(a).addClass(s).siblings(e).removeClass(s)},spread:function(i){var a=i.attr("lay-type"),e="true"===a?"false":"true",t=layui.data("layim")[j.mine.id]||{};i.next()["true"===a?"removeClass":"addClass"](s),t["spread"+i.parent().index()]=e,layui.data("layim",{key:j.mine.id,value:t}),i.attr("lay-type",e),i.find(".layui-icon").html("true"===e?"":"")},search:function(i){var a=x.find(".layui-layim-search"),e=x.find("#layui-layim-search"),t=a.find("input"),n=function(i){var a=t.val().replace(/\s/);if(""===a)ti.tab(0|ti.tab.index);else{for(var n=[],l=j.friend||[],s=j.group||[],o="",d=0;d0)for(var u=0;u'+(n[u].username||n[u].groupname||"佚名")+"

        "+(n[u].remark||n[u].sign||"")+"

        ";else o='
      • 无搜索结果
      • ';e.html(o),ti.tab(3)}};!j.base.isfriend&&j.base.isgroup?ti.tab.index=1:j.base.isfriend||j.base.isgroup||(ti.tab.index=2),a.show(),t.focus(),t.off("keyup",n).on("keyup",n)},closeSearch:function(i){i.parent().hide(),ti.tab(0|ti.tab.index)},msgbox:function(){var i=x.find(".layim-tool-msgbox");return t.close(ti.msgbox.index),i.find("span").removeClass(Y).html(""),ti.msgbox.index=t.open({type:2,title:"消息盒子",shade:!1,maxmin:!0,area:["600px","520px"],skin:"layui-box layui-layer-border",resize:!1,content:j.base.msgbox})},find:function(){return t.close(ti.find.index),ti.find.index=t.open({type:2,title:"查找",shade:!1,maxmin:!0,area:["1000px","520px"],skin:"layui-box layui-layer-border",resize:!1,content:j.base.find})},skin:function(){t.open({type:1,title:"更换背景",shade:!1,area:"300px",skin:"layui-box layui-layer-border",id:"layui-layim-skin",zIndex:66666666,resize:!1,content:n(m).render({skin:j.base.skin})})},about:function(){t.alert("版本: "+a+'
        版权所有:layim.layui.com',{title:"关于 LayIM",shade:!1})},setSkin:function(i){var a=i.attr("src"),e=layui.data("layim")[j.mine.id]||{};e.skin=a,a||delete e.skin,layui.data("layim",{key:j.mine.id,value:e});try{x.css({"background-image":a?"url("+a+")":"none"}),w.css({"background-image":a?"url("+a+")":"none"})}catch(t){}layui.each(r.setSkin,function(i,e){var t=(a||"").replace(layui.cache.dir+"css/modules/layim/skin/","");e&&e(t,a)})},chat:function(i){var a=layui.data("layim")[j.mine.id]||{},e=i.data("type"),t=i.data("index"),n=i.attr("data-list")||i.index(),l={};"friend"===e?l=j[e][t].list[n]:"group"===e?l=j[e][n]:"history"===e&&(l=(a.history||{})[t]||{}),l.name=l.name||l.username||l.groupname,"history"!==e&&(l.type=e),z(l)},tabChat:function(i){O(i)},closeChat:function(i,a){O(i.parent(),1),ii(a)},closeThisChat:function(){O(null,1)},groupMembers:function(i,a){var n=i.find(".layui-icon"),l=function(){n.html(""),i.data("down",null),t.close(ti.groupMembers.index)},s=function(i){ii(i)};i.data("down")?l():(n.html(""),i.data("down",!0),ti.groupMembers.index=t.tips('
          ',i,{tips:3,time:0,anim:5,fixed:!0,skin:"layui-box layui-layim-members",success:function(a){var t=j.base.members||{},n=_(),s=a.find(".layim-members-list"),o="",d={},c=w.find(".layui-layer-max").hasClass("layui-layer-maxmin"),u="none"===w.find(".layim-chat-list").css("display");c&&s.css({width:e(window).width()-22-(u||200)}),t.data=e.extend(t.data,{id:n.data.id}),S(t,function(a){layui.each(a.list,function(i,a){o+='
        • '+a.username+"
        • ",d[a.id]=a}),s.html(o),i.find(".layim-chat-members").html(a.members||(a.list||[]).length+"人"),s.find("li").on("click",function(){var i=e(this).data("uid"),a=d[i];z({name:a.username,type:"friend",avatar:a.avatar,id:a.id}),l()}),layui.each(r.members,function(i,e){e&&e(a)})}),a.on("mousedown",function(i){ii(i)})}}),e(document).off("mousedown",l).on("mousedown",l),e(window).off("resize",l).on("resize",l),i.off("mousedown",s).on("mousedown",s))},send:function(){D()},setSend:function(i,a){var t=ti.setSend.box=i.siblings(".layim-menu-box"),n=i.attr("lay-type");if("show"===n)ii(a),t.show().addClass(ei),e(document).off("click",ti.setSendHide).on("click",ti.setSendHide);else{i.addClass(o).siblings().removeClass(o);var l=layui.data("layim")[j.mine.id]||{};l.sendHotKey=n,layui.data("layim",{key:j.mine.id,value:l}),ti.setSendHide(a,i.parent())}},setSendHide:function(i,a){(a||ti.setSend.box).hide().removeClass(ei)},face:function(i,a){var n="",l=_();for(var s in X)n+='
        • ';n='
            '+n+"
          ",ti.face.index=t.tips(n,i,{tips:1,time:0,fixed:!0,skin:"layui-box layui-layim-face",success:function(i){i.find(".layim-face-list>li").on("mousedown",function(i){ii(i)}).on("click",function(){ai(l.textarea[0],"face"+this.title+" "),t.close(ti.face.index); +})}}),e(document).off("mousedown",ti.faceHide).on("mousedown",ti.faceHide),e(window).off("resize",ti.faceHide).on("resize",ti.faceHide),ii(a)},faceHide:function(){t.close(ti.face.index)},image:function(i){var a=i.data("type")||"images",e={images:"uploadImage",file:"uploadFile"},n=_(),l=j.base[e[a]]||{};layui.upload.render({url:l.url||"",method:l.type,elem:i.find("input")[0],accept:a,done:function(i){0==i.code?(i.data=i.data||{},"images"===a?ai(n.textarea[0],"img["+(i.data.src||"")+"]"):"file"===a&&ai(n.textarea[0],"file("+(i.data.src||"")+")["+(i.data.name||"下载文件")+"]"),D()):t.msg(i.msg||"上传失败")}})},media:function(i){var a=i.data("type"),n={audio:"音频",video:"视频"},l=_();t.prompt({title:"请输入网络"+n[a]+"地址",shade:!1,offset:[i.offset().top-e(window).scrollTop()-158+"px",i.offset().left+"px"]},function(i,e){ai(l.textarea[0],a+"["+i+"]"),D(),t.close(e)})},extend:function(i){var a=i.attr("lay-filter"),e=_();layui.each(r["tool("+a+")"],function(a,t){t&&t.call(i,function(i){ai(e.textarea[0],i)},D,e)})},playAudio:function(i){var a=i.data("audio"),e=a||document.createElement("audio"),n=function(){e.pause(),i.removeAttr("status"),i.find("i").html("")};return i.data("error")?t.msg("播放音频源异常"):e.play?void(i.attr("status")?n():(a||(e.src=i.data("src")),e.play(),i.attr("status","pause"),i.data("audio",e),i.find("i").html(""),e.onended=function(){n()},e.onerror=function(){t.msg("播放音频源异常"),i.data("error",!0),n()})):t.msg("您的浏览器不支持audio")},playVideo:function(i){var a=i.data("src"),e=document.createElement("video");return e.play?(t.close(ti.playVideo.index),void(ti.playVideo.index=t.open({type:1,title:"播放视频",area:["460px","300px"],maxmin:!0,shade:!1,content:'
          '}))):t.msg("您的浏览器不支持video")},chatLog:function(i){var a=_();return j.base.chatLog?(t.close(ti.chatLog.index),ti.chatLog.index=t.open({type:2,maxmin:!0,title:"与 "+a.data.name+" 的聊天记录",area:["450px","100%"],shade:!1,offset:"rb",skin:"layui-box",anim:2,id:"layui-layim-chatlog",content:j.base.chatLog+"?id="+a.data.id+"&type="+a.data.type})):t.msg("未开启更多聊天记录")},menuHistory:function(i,a){var n=layui.data("layim")[j.mine.id]||{},l=i.parent(),s=i.data("type"),o=x.find(".layim-list-history"),d='
        • 暂无历史会话
        • ';if("one"===s){var r=n.history;delete r[l.data("index")],n.history=r,layui.data("layim",{key:j.mine.id,value:n}),e(".layim-list-history li.layim-"+l.data("index")).remove(),0===o.find("li").length&&o.html(d)}else"all"===s&&(delete n.history,layui.data("layim",{key:j.mine.id,value:n}),o.html(d));t.closeAll("tips")}};i("layim",new c)}).addcss("modules/layim/layim.css?v=3.9.1","skinlayimcss"); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/laypage.js b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/laypage.js new file mode 100644 index 0000000..2e2ab0d --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/laypage.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?''+a.prev+"":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push(''+(a.first||1)+"");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r2&&e.push('…');r<=u;r++)r===a.curr?e.push('"+r+""):e.push(''+r+"");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1…'),0!==t&&e.push(''+(a.last||a.pages)+"")),e.join("")}(),next:function(){return a.next?''+a.next+"":""}(),count:'共 '+a.count+" 条",limit:function(){var e=['"}(),refresh:['','',""].join(""),skip:function(){return['到第','','页',""].join("")}()};return['
          ',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"
          "].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;oi.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){a.target=a.srcElement,t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/laytpl.js b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/laytpl.js new file mode 100644 index 0000000..11cc3c4 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/laytpl.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/mobile.js b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/mobile.js new file mode 100644 index 0000000..ebda601 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/mobile.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define(function(i){i("layui.mobile",layui.v)});layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)});layui.define(function(e){"use strict";var t=(window,document),i="querySelectorAll",n="getElementsByClassName",a=function(e){return t[i](e)},s={type:0,shade:!0,shadeClose:!0,fixed:!0,anim:"scale"},l={extend:function(e){var t=JSON.parse(JSON.stringify(s));for(var i in e)t[i]=e[i];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener("click",function(e){t.call(this,e)},!1)};var o=0,r=["layui-m-layer"],d=function(e){var t=this;t.config=l.extend(e),t.view()};d.prototype.view=function(){var e=this,i=e.config,s=t.createElement("div");e.id=s.id=r[0]+o,s.setAttribute("class",r[0]+" "+r[0]+(i.type||0)),s.setAttribute("index",o);var l=function(){var e="object"==typeof i.title;return i.title?'

          '+(e?i.title[0]:i.title)+"

          ":""}(),d=function(){"string"==typeof i.btn&&(i.btn=[i.btn]);var e,t=(i.btn||[]).length;return 0!==t&&i.btn?(e=''+i.btn[0]+"",2===t&&(e=''+i.btn[1]+""+e),'
          '+e+"
          "):""}();if(i.fixed||(i.top=i.hasOwnProperty("top")?i.top:100,i.style=i.style||"",i.style+=" top:"+(t.body.scrollTop+i.top)+"px"),2===i.type&&(i.content='

          '+(i.content||"")+"

          "),i.skin&&(i.anim="up"),"msg"===i.skin&&(i.shade=!1),s.innerHTML=(i.shade?"
          ':"")+'
          "+l+'
          '+i.content+"
          "+d+"
          ",!i.type||2===i.type){var y=t[n](r[0]+i.type),u=y.length;u>=1&&c.close(y[0].getAttribute("index"))}document.body.appendChild(s);var m=e.elem=a("#"+e.id)[0];i.success&&i.success(m),e.index=o++,e.action(i,m)},d.prototype.action=function(e,t){var i=this;e.time&&(l.timer[i.index]=setTimeout(function(){c.close(i.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),c.close(i.index)):e.yes?e.yes(i.index):c.close(i.index)};if(e.btn)for(var s=t[n]("layui-m-layerbtn")[0].children,o=s.length,r=0;r0&&e-1 in t)}function s(t){return A.call(t,function(t){return null!=t})}function u(t){return t.length>0?T.fn.concat.apply([],t):t}function c(t){return t.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function l(t){return t in F?F[t]:F[t]=new RegExp("(^|\\s)"+t+"(\\s|$)")}function f(t,e){return"number"!=typeof e||k[c(t)]?e:e+"px"}function h(t){var e,n;return $[t]||(e=L.createElement(t),L.body.appendChild(e),n=getComputedStyle(e,"").getPropertyValue("display"),e.parentNode.removeChild(e),"none"==n&&(n="block"),$[t]=n),$[t]}function p(t){return"children"in t?D.call(t.children):T.map(t.childNodes,function(t){if(1==t.nodeType)return t})}function d(t,e){var n,r=t?t.length:0;for(n=0;n]*>/,R=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Z=/^(?:body|html)$/i,q=/([A-Z])/g,H=["val","css","html","text","data","width","height","offset"],I=["after","prepend","before","append"],V=L.createElement("table"),_=L.createElement("tr"),B={tr:L.createElement("tbody"),tbody:V,thead:V,tfoot:V,td:_,th:_,"*":L.createElement("div")},U=/complete|loaded|interactive/,X=/^[\w-]*$/,J={},W=J.toString,Y={},G=L.createElement("div"),K={tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},Q=Array.isArray||function(t){return t instanceof Array};return Y.matches=function(t,e){if(!e||!t||1!==t.nodeType)return!1;var n=t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.oMatchesSelector||t.matchesSelector;if(n)return n.call(t,e);var r,i=t.parentNode,o=!i;return o&&(i=G).appendChild(t),r=~Y.qsa(i,e).indexOf(t),o&&G.removeChild(t),r},C=function(t){return t.replace(/-+(.)?/g,function(t,e){return e?e.toUpperCase():""})},N=function(t){return A.call(t,function(e,n){return t.indexOf(e)==n})},Y.fragment=function(t,e,n){var r,i,a;return R.test(t)&&(r=T(L.createElement(RegExp.$1))),r||(t.replace&&(t=t.replace(z,"<$1>")),e===E&&(e=M.test(t)&&RegExp.$1),e in B||(e="*"),a=B[e],a.innerHTML=""+t,r=T.each(D.call(a.childNodes),function(){a.removeChild(this)})),o(n)&&(i=T(r),T.each(n,function(t,e){H.indexOf(t)>-1?i[t](e):i.attr(t,e)})),r},Y.Z=function(t,e){return new d(t,e)},Y.isZ=function(t){return t instanceof Y.Z},Y.init=function(t,n){var r;if(!t)return Y.Z();if("string"==typeof t)if(t=t.trim(),"<"==t[0]&&M.test(t))r=Y.fragment(t,RegExp.$1,n),t=null;else{if(n!==E)return T(n).find(t);r=Y.qsa(L,t)}else{if(e(t))return T(L).ready(t);if(Y.isZ(t))return t;if(Q(t))r=s(t);else if(i(t))r=[t],t=null;else if(M.test(t))r=Y.fragment(t.trim(),RegExp.$1,n),t=null;else{if(n!==E)return T(n).find(t);r=Y.qsa(L,t)}}return Y.Z(r,t)},T=function(t,e){return Y.init(t,e)},T.extend=function(t){var e,n=D.call(arguments,1);return"boolean"==typeof t&&(e=t,t=n.shift()),n.forEach(function(n){m(t,n,e)}),t},Y.qsa=function(t,e){var n,r="#"==e[0],i=!r&&"."==e[0],o=r||i?e.slice(1):e,a=X.test(o);return t.getElementById&&a&&r?(n=t.getElementById(o))?[n]:[]:1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType?[]:D.call(a&&!r&&t.getElementsByClassName?i?t.getElementsByClassName(o):t.getElementsByTagName(e):t.querySelectorAll(e))},T.contains=L.documentElement.contains?function(t,e){return t!==e&&t.contains(e)}:function(t,e){for(;e&&(e=e.parentNode);)if(e===t)return!0;return!1},T.type=t,T.isFunction=e,T.isWindow=n,T.isArray=Q,T.isPlainObject=o,T.isEmptyObject=function(t){var e;for(e in t)return!1;return!0},T.isNumeric=function(t){var e=Number(t),n=typeof t;return null!=t&&"boolean"!=n&&("string"!=n||t.length)&&!isNaN(e)&&isFinite(e)||!1},T.inArray=function(t,e,n){return O.indexOf.call(e,t,n)},T.camelCase=C,T.trim=function(t){return null==t?"":String.prototype.trim.call(t)},T.uuid=0,T.support={},T.expr={},T.noop=function(){},T.map=function(t,e){var n,r,i,o=[];if(a(t))for(r=0;r=0?t:t+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each(function(){null!=this.parentNode&&this.parentNode.removeChild(this)})},each:function(t){return O.every.call(this,function(e,n){return t.call(e,n,e)!==!1}),this},filter:function(t){return e(t)?this.not(this.not(t)):T(A.call(this,function(e){return Y.matches(e,t)}))},add:function(t,e){return T(N(this.concat(T(t,e))))},is:function(t){return this.length>0&&Y.matches(this[0],t)},not:function(t){var n=[];if(e(t)&&t.call!==E)this.each(function(e){t.call(this,e)||n.push(this)});else{var r="string"==typeof t?this.filter(t):a(t)&&e(t.item)?D.call(t):T(t);this.forEach(function(t){r.indexOf(t)<0&&n.push(t)})}return T(n)},has:function(t){return this.filter(function(){return i(t)?T.contains(this,t):T(this).find(t).size()})},eq:function(t){return t===-1?this.slice(t):this.slice(t,+t+1)},first:function(){var t=this[0];return t&&!i(t)?t:T(t)},last:function(){var t=this[this.length-1];return t&&!i(t)?t:T(t)},find:function(t){var e,n=this;return e=t?"object"==typeof t?T(t).filter(function(){var t=this;return O.some.call(n,function(e){return T.contains(e,t)})}):1==this.length?T(Y.qsa(this[0],t)):this.map(function(){return Y.qsa(this,t)}):T()},closest:function(t,e){var n=[],i="object"==typeof t&&T(t);return this.each(function(o,a){for(;a&&!(i?i.indexOf(a)>=0:Y.matches(a,t));)a=a!==e&&!r(a)&&a.parentNode;a&&n.indexOf(a)<0&&n.push(a)}),T(n)},parents:function(t){for(var e=[],n=this;n.length>0;)n=T.map(n,function(t){if((t=t.parentNode)&&!r(t)&&e.indexOf(t)<0)return e.push(t),t});return v(e,t)},parent:function(t){return v(N(this.pluck("parentNode")),t)},children:function(t){return v(this.map(function(){return p(this)}),t)},contents:function(){return this.map(function(){return this.contentDocument||D.call(this.childNodes)})},siblings:function(t){return v(this.map(function(t,e){return A.call(p(e.parentNode),function(t){return t!==e})}),t)},empty:function(){return this.each(function(){this.innerHTML=""})},pluck:function(t){return T.map(this,function(e){return e[t]})},show:function(){return this.each(function(){"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=h(this.nodeName))})},replaceWith:function(t){return this.before(t).remove()},wrap:function(t){var n=e(t);if(this[0]&&!n)var r=T(t).get(0),i=r.parentNode||this.length>1;return this.each(function(e){T(this).wrapAll(n?t.call(this,e):i?r.cloneNode(!0):r)})},wrapAll:function(t){if(this[0]){T(this[0]).before(t=T(t));for(var e;(e=t.children()).length;)t=e.first();T(t).append(this)}return this},wrapInner:function(t){var n=e(t);return this.each(function(e){var r=T(this),i=r.contents(),o=n?t.call(this,e):t;i.length?i.wrapAll(o):r.append(o)})},unwrap:function(){return this.parent().each(function(){T(this).replaceWith(T(this).children())}),this},clone:function(){return this.map(function(){return this.cloneNode(!0)})},hide:function(){return this.css("display","none")},toggle:function(t){return this.each(function(){var e=T(this);(t===E?"none"==e.css("display"):t)?e.show():e.hide()})},prev:function(t){return T(this.pluck("previousElementSibling")).filter(t||"*")},next:function(t){return T(this.pluck("nextElementSibling")).filter(t||"*")},html:function(t){return 0 in arguments?this.each(function(e){var n=this.innerHTML;T(this).empty().append(g(this,t,e,n))}):0 in this?this[0].innerHTML:null},text:function(t){return 0 in arguments?this.each(function(e){var n=g(this,t,e,this.textContent);this.textContent=null==n?"":""+n}):0 in this?this.pluck("textContent").join(""):null},attr:function(t,e){var n;return"string"!=typeof t||1 in arguments?this.each(function(n){if(1===this.nodeType)if(i(t))for(j in t)y(this,j,t[j]);else y(this,t,g(this,e,n,this.getAttribute(t)))}):0 in this&&1==this[0].nodeType&&null!=(n=this[0].getAttribute(t))?n:E},removeAttr:function(t){return this.each(function(){1===this.nodeType&&t.split(" ").forEach(function(t){y(this,t)},this)})},prop:function(t,e){return t=K[t]||t,1 in arguments?this.each(function(n){this[t]=g(this,e,n,this[t])}):this[0]&&this[0][t]},removeProp:function(t){return t=K[t]||t,this.each(function(){delete this[t]})},data:function(t,e){var n="data-"+t.replace(q,"-$1").toLowerCase(),r=1 in arguments?this.attr(n,e):this.attr(n);return null!==r?b(r):E},val:function(t){return 0 in arguments?(null==t&&(t=""),this.each(function(e){this.value=g(this,t,e,this.value)})):this[0]&&(this[0].multiple?T(this[0]).find("option").filter(function(){return this.selected}).pluck("value"):this[0].value)},offset:function(t){if(t)return this.each(function(e){var n=T(this),r=g(this,t,e,n.offset()),i=n.offsetParent().offset(),o={top:r.top-i.top,left:r.left-i.left};"static"==n.css("position")&&(o.position="relative"),n.css(o)});if(!this.length)return null;if(L.documentElement!==this[0]&&!T.contains(L.documentElement,this[0]))return{top:0,left:0};var e=this[0].getBoundingClientRect();return{left:e.left+window.pageXOffset,top:e.top+window.pageYOffset,width:Math.round(e.width),height:Math.round(e.height)}},css:function(e,n){if(arguments.length<2){var r=this[0];if("string"==typeof e){if(!r)return;return r.style[C(e)]||getComputedStyle(r,"").getPropertyValue(e)}if(Q(e)){if(!r)return;var i={},o=getComputedStyle(r,"");return T.each(e,function(t,e){i[e]=r.style[C(e)]||o.getPropertyValue(e)}),i}}var a="";if("string"==t(e))n||0===n?a=c(e)+":"+f(e,n):this.each(function(){this.style.removeProperty(c(e))});else for(j in e)e[j]||0===e[j]?a+=c(j)+":"+f(j,e[j])+";":this.each(function(){this.style.removeProperty(c(j))});return this.each(function(){this.style.cssText+=";"+a})},index:function(t){return t?this.indexOf(T(t)[0]):this.parent().children().indexOf(this[0])},hasClass:function(t){return!!t&&O.some.call(this,function(t){return this.test(x(t))},l(t))},addClass:function(t){return t?this.each(function(e){if("className"in this){S=[];var n=x(this),r=g(this,t,e,n);r.split(/\s+/g).forEach(function(t){T(this).hasClass(t)||S.push(t)},this),S.length&&x(this,n+(n?" ":"")+S.join(" "))}}):this},removeClass:function(t){return this.each(function(e){if("className"in this){if(t===E)return x(this,"");S=x(this),g(this,t,e,S).split(/\s+/g).forEach(function(t){S=S.replace(l(t)," ")}),x(this,S.trim())}})},toggleClass:function(t,e){return t?this.each(function(n){var r=T(this),i=g(this,t,n,x(this));i.split(/\s+/g).forEach(function(t){(e===E?!r.hasClass(t):e)?r.addClass(t):r.removeClass(t)})}):this},scrollTop:function(t){if(this.length){var e="scrollTop"in this[0];return t===E?e?this[0].scrollTop:this[0].pageYOffset:this.each(e?function(){this.scrollTop=t}:function(){this.scrollTo(this.scrollX,t)})}},scrollLeft:function(t){if(this.length){var e="scrollLeft"in this[0];return t===E?e?this[0].scrollLeft:this[0].pageXOffset:this.each(e?function(){this.scrollLeft=t}:function(){this.scrollTo(t,this.scrollY)})}},position:function(){if(this.length){var t=this[0],e=this.offsetParent(),n=this.offset(),r=Z.test(e[0].nodeName)?{top:0,left:0}:e.offset();return n.top-=parseFloat(T(t).css("margin-top"))||0,n.left-=parseFloat(T(t).css("margin-left"))||0,r.top+=parseFloat(T(e[0]).css("border-top-width"))||0,r.left+=parseFloat(T(e[0]).css("border-left-width"))||0,{top:n.top-r.top,left:n.left-r.left}}},offsetParent:function(){return this.map(function(){for(var t=this.offsetParent||L.body;t&&!Z.test(t.nodeName)&&"static"==T(t).css("position");)t=t.offsetParent;return t})}},T.fn.detach=T.fn.remove,["width","height"].forEach(function(t){var e=t.replace(/./,function(t){return t[0].toUpperCase()});T.fn[t]=function(i){var o,a=this[0];return i===E?n(a)?a["inner"+e]:r(a)?a.documentElement["scroll"+e]:(o=this.offset())&&o[t]:this.each(function(e){a=T(this),a.css(t,g(this,i,e,a[t]()))})}}),I.forEach(function(e,n){var r=n%2;T.fn[e]=function(){var e,i,o=T.map(arguments,function(n){var r=[];return e=t(n),"array"==e?(n.forEach(function(t){return t.nodeType!==E?r.push(t):T.zepto.isZ(t)?r=r.concat(t.get()):void(r=r.concat(Y.fragment(t)))}),r):"object"==e||null==n?n:Y.fragment(n)}),a=this.length>1;return o.length<1?this:this.each(function(t,e){i=r?e:e.parentNode,e=0==n?e.nextSibling:1==n?e.firstChild:2==n?e:null;var s=T.contains(L.documentElement,i);o.forEach(function(t){if(a)t=t.cloneNode(!0);else if(!i)return T(t).remove();i.insertBefore(t,e),s&&w(t,function(t){if(!(null==t.nodeName||"SCRIPT"!==t.nodeName.toUpperCase()||t.type&&"text/javascript"!==t.type||t.src)){var e=t.ownerDocument?t.ownerDocument.defaultView:window;e.eval.call(e,t.innerHTML)}})})})},T.fn[r?e+"To":"insert"+(n?"Before":"After")]=function(t){return T(t)[e](this),this}}),Y.Z.prototype=d.prototype=T.fn,Y.uniq=N,Y.deserializeValue=b,T.zepto=Y,T}();!function(t){function e(t){return t._zid||(t._zid=h++)}function n(t,n,o,a){if(n=r(n),n.ns)var s=i(n.ns);return(v[e(t)]||[]).filter(function(t){return t&&(!n.e||t.e==n.e)&&(!n.ns||s.test(t.ns))&&(!o||e(t.fn)===e(o))&&(!a||t.sel==a)})}function r(t){var e=(""+t).split(".");return{e:e[0],ns:e.slice(1).sort().join(" ")}}function i(t){return new RegExp("(?:^| )"+t.replace(" "," .* ?")+"(?: |$)")}function o(t,e){return t.del&&!y&&t.e in x||!!e}function a(t){return b[t]||y&&x[t]||t}function s(n,i,s,u,l,h,p){var d=e(n),m=v[d]||(v[d]=[]);i.split(/\s/).forEach(function(e){if("ready"==e)return t(document).ready(s);var i=r(e);i.fn=s,i.sel=l,i.e in b&&(s=function(e){var n=e.relatedTarget;if(!n||n!==this&&!t.contains(this,n))return i.fn.apply(this,arguments)}),i.del=h;var d=h||s;i.proxy=function(t){if(t=c(t),!t.isImmediatePropagationStopped()){t.data=u;var e=d.apply(n,t._args==f?[t]:[t].concat(t._args));return e===!1&&(t.preventDefault(),t.stopPropagation()),e}},i.i=m.length,m.push(i),"addEventListener"in n&&n.addEventListener(a(i.e),i.proxy,o(i,p))})}function u(t,r,i,s,u){var c=e(t);(r||"").split(/\s/).forEach(function(e){n(t,e,i,s).forEach(function(e){delete v[c][e.i],"removeEventListener"in t&&t.removeEventListener(a(e.e),e.proxy,o(e,u))})})}function c(e,n){return!n&&e.isDefaultPrevented||(n||(n=e),t.each(T,function(t,r){var i=n[t];e[t]=function(){return this[r]=w,i&&i.apply(n,arguments)},e[r]=E}),e.timeStamp||(e.timeStamp=Date.now()),(n.defaultPrevented!==f?n.defaultPrevented:"returnValue"in n?n.returnValue===!1:n.getPreventDefault&&n.getPreventDefault())&&(e.isDefaultPrevented=w)),e}function l(t){var e,n={originalEvent:t};for(e in t)j.test(e)||t[e]===f||(n[e]=t[e]);return c(n,t)}var f,h=1,p=Array.prototype.slice,d=t.isFunction,m=function(t){return"string"==typeof t},v={},g={},y="onfocusin"in window,x={focus:"focusin",blur:"focusout"},b={mouseenter:"mouseover",mouseleave:"mouseout"};g.click=g.mousedown=g.mouseup=g.mousemove="MouseEvents",t.event={add:s,remove:u},t.proxy=function(n,r){var i=2 in arguments&&p.call(arguments,2);if(d(n)){var o=function(){return n.apply(r,i?i.concat(p.call(arguments)):arguments)};return o._zid=e(n),o}if(m(r))return i?(i.unshift(n[r],n),t.proxy.apply(null,i)):t.proxy(n[r],n);throw new TypeError("expected function")},t.fn.bind=function(t,e,n){return this.on(t,e,n)},t.fn.unbind=function(t,e){return this.off(t,e)},t.fn.one=function(t,e,n,r){return this.on(t,e,n,r,1)};var w=function(){return!0},E=function(){return!1},j=/^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,T={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};t.fn.delegate=function(t,e,n){return this.on(e,t,n)},t.fn.undelegate=function(t,e,n){return this.off(e,t,n)},t.fn.live=function(e,n){return t(document.body).delegate(this.selector,e,n),this},t.fn.die=function(e,n){return t(document.body).undelegate(this.selector,e,n),this},t.fn.on=function(e,n,r,i,o){var a,c,h=this;return e&&!m(e)?(t.each(e,function(t,e){h.on(t,n,r,e,o)}),h):(m(n)||d(i)||i===!1||(i=r,r=n,n=f),i!==f&&r!==!1||(i=r,r=f),i===!1&&(i=E),h.each(function(f,h){o&&(a=function(t){return u(h,t.type,i),i.apply(this,arguments)}),n&&(c=function(e){var r,o=t(e.target).closest(n,h).get(0);if(o&&o!==h)return r=t.extend(l(e),{currentTarget:o,liveFired:h}),(a||i).apply(o,[r].concat(p.call(arguments,1)))}),s(h,e,i,r,n,c||a)}))},t.fn.off=function(e,n,r){var i=this;return e&&!m(e)?(t.each(e,function(t,e){i.off(t,n,e)}),i):(m(n)||d(r)||r===!1||(r=n,n=f),r===!1&&(r=E),i.each(function(){u(this,e,r,n)}))},t.fn.trigger=function(e,n){return e=m(e)||t.isPlainObject(e)?t.Event(e):c(e),e._args=n,this.each(function(){e.type in x&&"function"==typeof this[e.type]?this[e.type]():"dispatchEvent"in this?this.dispatchEvent(e):t(this).triggerHandler(e,n)})},t.fn.triggerHandler=function(e,r){var i,o;return this.each(function(a,s){i=l(m(e)?t.Event(e):e),i._args=r,i.target=s,t.each(n(s,e.type||e),function(t,e){if(o=e.proxy(i),i.isImmediatePropagationStopped())return!1})}),o},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function(e){t.fn[e]=function(t){return 0 in arguments?this.bind(e,t):this.trigger(e)}}),t.Event=function(t,e){m(t)||(e=t,t=e.type);var n=document.createEvent(g[t]||"Events"),r=!0;if(e)for(var i in e)"bubbles"==i?r=!!e[i]:n[i]=e[i];return n.initEvent(t,r,!0),c(n)}}(e),function(t){function e(e,n,r){var i=t.Event(n);return t(e).trigger(i,r),!i.isDefaultPrevented()}function n(t,n,r,i){if(t.global)return e(n||x,r,i)}function r(e){e.global&&0===t.active++&&n(e,null,"ajaxStart")}function i(e){e.global&&!--t.active&&n(e,null,"ajaxStop")}function o(t,e){var r=e.context;return e.beforeSend.call(r,t,e)!==!1&&n(e,r,"ajaxBeforeSend",[t,e])!==!1&&void n(e,r,"ajaxSend",[t,e])}function a(t,e,r,i){var o=r.context,a="success";r.success.call(o,t,a,e),i&&i.resolveWith(o,[t,a,e]),n(r,o,"ajaxSuccess",[e,r,t]),u(a,e,r)}function s(t,e,r,i,o){var a=i.context;i.error.call(a,r,e,t),o&&o.rejectWith(a,[r,e,t]),n(i,a,"ajaxError",[r,i,t||e]),u(e,r,i)}function u(t,e,r){var o=r.context;r.complete.call(o,e,t),n(r,o,"ajaxComplete",[e,r]),i(r)}function c(t,e,n){if(n.dataFilter==l)return t;var r=n.context;return n.dataFilter.call(r,t,e)}function l(){}function f(t){return t&&(t=t.split(";",2)[0]),t&&(t==T?"html":t==j?"json":w.test(t)?"script":E.test(t)&&"xml")||"text"}function h(t,e){return""==e?t:(t+"&"+e).replace(/[&?]{1,2}/,"?")}function p(e){e.processData&&e.data&&"string"!=t.type(e.data)&&(e.data=t.param(e.data,e.traditional)),!e.data||e.type&&"GET"!=e.type.toUpperCase()&&"jsonp"!=e.dataType||(e.url=h(e.url,e.data),e.data=void 0)}function d(e,n,r,i){return t.isFunction(n)&&(i=r,r=n,n=void 0),t.isFunction(r)||(i=r,r=void 0),{url:e,data:n,success:r,dataType:i}}function m(e,n,r,i){var o,a=t.isArray(n),s=t.isPlainObject(n);t.each(n,function(n,u){o=t.type(u),i&&(n=r?i:i+"["+(s||"object"==o||"array"==o?n:"")+"]"),!i&&a?e.add(u.name,u.value):"array"==o||!r&&"object"==o?m(e,u,r,n):e.add(n,u)})}var v,g,y=+new Date,x=window.document,b=/)<[^<]*)*<\/script>/gi,w=/^(?:text|application)\/javascript/i,E=/^(?:text|application)\/xml/i,j="application/json",T="text/html",S=/^\s*$/,C=x.createElement("a");C.href=window.location.href,t.active=0,t.ajaxJSONP=function(e,n){if(!("type"in e))return t.ajax(e);var r,i,u=e.jsonpCallback,c=(t.isFunction(u)?u():u)||"Zepto"+y++,l=x.createElement("script"),f=window[c],h=function(e){t(l).triggerHandler("error",e||"abort")},p={abort:h};return n&&n.promise(p),t(l).on("load error",function(o,u){clearTimeout(i),t(l).off().remove(),"error"!=o.type&&r?a(r[0],p,e,n):s(null,u||"error",p,e,n),window[c]=f,r&&t.isFunction(f)&&f(r[0]),f=r=void 0}),o(p,e)===!1?(h("abort"),p):(window[c]=function(){r=arguments},l.src=e.url.replace(/\?(.+)=\?/,"?$1="+c),x.head.appendChild(l),e.timeout>0&&(i=setTimeout(function(){h("timeout")},e.timeout)),p)},t.ajaxSettings={type:"GET",beforeSend:l,success:l,error:l,complete:l,context:null,global:!0,xhr:function(){return new window.XMLHttpRequest},accepts:{script:"text/javascript, application/javascript, application/x-javascript",json:j,xml:"application/xml, text/xml",html:T,text:"text/plain"},crossDomain:!1,timeout:0,processData:!0,cache:!0,dataFilter:l},t.ajax=function(e){var n,i,u=t.extend({},e||{}),d=t.Deferred&&t.Deferred();for(v in t.ajaxSettings)void 0===u[v]&&(u[v]=t.ajaxSettings[v]);r(u),u.crossDomain||(n=x.createElement("a"),n.href=u.url,n.href=n.href,u.crossDomain=C.protocol+"//"+C.host!=n.protocol+"//"+n.host),u.url||(u.url=window.location.toString()),(i=u.url.indexOf("#"))>-1&&(u.url=u.url.slice(0,i)),p(u);var m=u.dataType,y=/\?.+=\?/.test(u.url);if(y&&(m="jsonp"),u.cache!==!1&&(e&&e.cache===!0||"script"!=m&&"jsonp"!=m)||(u.url=h(u.url,"_="+Date.now())),"jsonp"==m)return y||(u.url=h(u.url,u.jsonp?u.jsonp+"=?":u.jsonp===!1?"":"callback=?")),t.ajaxJSONP(u,d);var b,w=u.accepts[m],E={},j=function(t,e){E[t.toLowerCase()]=[t,e]},T=/^([\w-]+:)\/\//.test(u.url)?RegExp.$1:window.location.protocol,N=u.xhr(),O=N.setRequestHeader;if(d&&d.promise(N),u.crossDomain||j("X-Requested-With","XMLHttpRequest"),j("Accept",w||"*/*"),(w=u.mimeType||w)&&(w.indexOf(",")>-1&&(w=w.split(",",2)[0]),N.overrideMimeType&&N.overrideMimeType(w)),(u.contentType||u.contentType!==!1&&u.data&&"GET"!=u.type.toUpperCase())&&j("Content-Type",u.contentType||"application/x-www-form-urlencoded"),u.headers)for(g in u.headers)j(g,u.headers[g]);if(N.setRequestHeader=j,N.onreadystatechange=function(){if(4==N.readyState){N.onreadystatechange=l,clearTimeout(b);var e,n=!1;if(N.status>=200&&N.status<300||304==N.status||0==N.status&&"file:"==T){if(m=m||f(u.mimeType||N.getResponseHeader("content-type")),"arraybuffer"==N.responseType||"blob"==N.responseType)e=N.response;else{e=N.responseText;try{e=c(e,m,u),"script"==m?(0,eval)(e):"xml"==m?e=N.responseXML:"json"==m&&(e=S.test(e)?null:t.parseJSON(e))}catch(r){n=r}if(n)return s(n,"parsererror",N,u,d)}a(e,N,u,d)}else s(N.statusText||null,N.status?"error":"abort",N,u,d)}},o(N,u)===!1)return N.abort(),s(null,"abort",N,u,d),N;var P=!("async"in u)||u.async;if(N.open(u.type,u.url,P,u.username,u.password),u.xhrFields)for(g in u.xhrFields)N[g]=u.xhrFields[g];for(g in E)O.apply(N,E[g]);return u.timeout>0&&(b=setTimeout(function(){N.onreadystatechange=l,N.abort(),s(null,"timeout",N,u,d)},u.timeout)),N.send(u.data?u.data:null),N},t.get=function(){return t.ajax(d.apply(null,arguments))},t.post=function(){var e=d.apply(null,arguments);return e.type="POST",t.ajax(e)},t.getJSON=function(){var e=d.apply(null,arguments);return e.dataType="json",t.ajax(e)},t.fn.load=function(e,n,r){if(!this.length)return this;var i,o=this,a=e.split(/\s/),s=d(e,n,r),u=s.success;return a.length>1&&(s.url=a[0],i=a[1]),s.success=function(e){o.html(i?t("
          ").html(e.replace(b,"")).find(i):e),u&&u.apply(o,arguments)},t.ajax(s),this};var N=encodeURIComponent;t.param=function(e,n){var r=[];return r.add=function(e,n){t.isFunction(n)&&(n=n()),null==n&&(n=""),this.push(N(e)+"="+N(n))},m(r,e,n),r.join("&").replace(/%20/g,"+")}}(e),function(t){t.fn.serializeArray=function(){var e,n,r=[],i=function(t){return t.forEach?t.forEach(i):void r.push({name:e,value:t})};return this[0]&&t.each(this[0].elements,function(r,o){n=o.type,e=o.name,e&&"fieldset"!=o.nodeName.toLowerCase()&&!o.disabled&&"submit"!=n&&"reset"!=n&&"button"!=n&&"file"!=n&&("radio"!=n&&"checkbox"!=n||o.checked)&&i(t(o).val())}),r},t.fn.serialize=function(){var t=[];return this.serializeArray().forEach(function(e){t.push(encodeURIComponent(e.name)+"="+encodeURIComponent(e.value))}),t.join("&")},t.fn.submit=function(e){if(0 in arguments)this.bind("submit",e);else if(this.length){var n=t.Event("submit");this.eq(0).trigger(n),n.isDefaultPrevented()||this.get(0).submit()}return this}}(e),function(){try{getComputedStyle(void 0)}catch(t){var e=getComputedStyle;window.getComputedStyle=function(t,n){try{return e(t,n)}catch(r){return null}}}}(),t("zepto",e)});layui.define(function(i){i("layim-mobile",layui.v)});layui["layui.mobile"]||layui.config({base:layui.cache.dir+"lay/modules/mobile/"}).extend({"layer-mobile":"layer-mobile",zepto:"zepto","upload-mobile":"upload-mobile","layim-mobile":"layim-mobile"}),layui.define(["layer-mobile","zepto","layim-mobile"],function(l){l("mobile",{layer:layui["layer-mobile"],layim:layui["layim-mobile"]})}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/rate.js b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/rate.js new file mode 100644 index 0000000..7feef34 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/rate.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var a=layui.jquery,i={config:{},index:layui.rate?layui.rate.index+1e4:0,set:function(e){var i=this;return i.config=a.extend({},i.config,e),i},on:function(e,a){return layui.onevent.call(this,n,e,a)}},l=function(){var e=this,a=e.config;return{setvalue:function(a){e.setvalue.call(e,a)},config:a}},n="rate",t="layui-rate",o="layui-icon-rate",s="layui-icon-rate-solid",u="layui-icon-rate-half",r="layui-icon-rate-solid layui-icon-rate-half",c="layui-icon-rate-solid layui-icon-rate",f="layui-icon-rate layui-icon-rate-half",v=function(e){var l=this;l.index=++i.index,l.config=a.extend({},l.config,i.config,e),l.render()};v.prototype.config={length:5,text:!1,readonly:!1,half:!1,value:0,theme:""},v.prototype.render=function(){var e=this,i=e.config,l=i.theme?'style="color: '+i.theme+';"':"";i.elem=a(i.elem),parseInt(i.value)!==i.value&&(i.half||(i.value=Math.ceil(i.value)-i.value<.5?Math.ceil(i.value):Math.floor(i.value)));for(var n='
            ",u=1;u<=i.length;u++){var r='
          • ";i.half&&parseInt(i.value)!==i.value&&u==Math.ceil(i.value)?n=n+'
          • ":n+=r}n+="
          "+(i.text?''+i.value+"星":"")+"";var c=i.elem,f=c.next("."+t);f[0]&&f.remove(),e.elemTemp=a(n),i.span=e.elemTemp.next("span"),i.setText&&i.setText(i.value),c.html(e.elemTemp),c.addClass("layui-inline"),i.readonly||e.action()},v.prototype.setvalue=function(e){var a=this,i=a.config;i.value=e,a.render()},v.prototype.action=function(){var e=this,i=e.config,l=e.elemTemp,n=l.find("i").width();l.children("li").each(function(e){var t=e+1,v=a(this);v.on("click",function(e){if(i.value=t,i.half){var o=e.pageX-a(this).offset().left;o<=n/2&&(i.value=i.value-.5)}i.text&&l.next("span").text(i.value+"星"),i.choose&&i.choose(i.value),i.setText&&i.setText(i.value)}),v.on("mousemove",function(e){if(l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+t+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half){var c=e.pageX-a(this).offset().left;c<=n/2&&v.children("i").addClass(u).removeClass(s)}}),v.on("mouseleave",function(){l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+Math.floor(i.value)+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half&&parseInt(i.value)!==i.value&&l.children("li:eq("+Math.floor(i.value)+")").children("i").addClass(u).removeClass(c)})})},v.prototype.events=function(){var e=this;e.config},i.render=function(e){var a=new v(e);return l.call(a)},e(n,i)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/slider.js b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/slider.js new file mode 100644 index 0000000..6f824a9 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/slider.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var i=layui.jquery,t={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,n,e,i)}},a=function(){var e=this,i=e.config;return{setValue:function(i,t){return e.slide("set",i,t||0)},config:i}},n="slider",l="layui-disabled",s="layui-slider",r="layui-slider-bar",o="layui-slider-wrap",u="layui-slider-wrap-btn",d="layui-slider-tips",v="layui-slider-input",c="layui-slider-input-txt",m="layui-slider-input-btn",p="layui-slider-hover",f=function(e){var a=this;a.index=++t.index,a.config=i.extend({},a.config,t.config,e),a.render()};f.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,input:!1,range:!1,height:200,disabled:!1,theme:"#009688"},f.prototype.render=function(){var e=this,t=e.config;if(t.step<1&&(t.step=1),t.maxt.min?a:t.min,t.value[1]=n>t.min?n:t.min,t.value[0]=t.value[0]>t.max?t.max:t.value[0],t.value[1]=t.value[1]>t.max?t.max:t.value[1];var r=Math.floor((t.value[0]-t.min)/(t.max-t.min)*100),v=Math.floor((t.value[1]-t.min)/(t.max-t.min)*100),m=v-r+"%";r+="%",v+="%"}else{"object"==typeof t.value&&(t.value=Math.min.apply(null,t.value)),t.valuet.max&&(t.value=t.max);var m=Math.floor((t.value-t.min)/(t.max-t.min)*100)+"%"}var p=t.disabled?"#c2c2c2":t.theme,f='
          '+(t.tips?'
          ':"")+'
          '+(t.range?'
          ':"")+"
          ",h=i(t.elem),y=h.next("."+s);if(y[0]&&y.remove(),e.elemTemp=i(f),t.range?(e.elemTemp.find("."+o).eq(0).data("value",t.value[0]),e.elemTemp.find("."+o).eq(1).data("value",t.value[1])):e.elemTemp.find("."+o).data("value",t.value),h.html(e.elemTemp),"vertical"===t.type&&e.elemTemp.height(t.height+"px"),t.showstep){for(var g=(t.max-t.min)/t.step,b="",x=1;x
          ')}e.elemTemp.append(b)}if(t.input&&!t.range){var w=i('
          ');h.css("position","relative"),h.append(w),h.find("."+c).children("input").val(t.value),"vertical"===t.type?w.css({left:0,top:-48}):e.elemTemp.css("margin-right",w.outerWidth()+15)}t.disabled?(e.elemTemp.addClass(l),e.elemTemp.find("."+u).addClass(l)):e.slide(),e.elemTemp.find("."+u).on("mouseover",function(){var a="vertical"===t.type?t.height:e.elemTemp[0].offsetWidth,n=e.elemTemp.find("."+o),l="vertical"===t.type?a-i(this).parent()[0].offsetTop-n.height():i(this).parent()[0].offsetLeft,s=l/a*100,r=i(this).parent().data("value"),u=t.setTips?t.setTips(r):r;e.elemTemp.find("."+d).html(u),"vertical"===t.type?e.elemTemp.find("."+d).css({bottom:s+"%","margin-bottom":"20px",display:"inline-block"}):e.elemTemp.find("."+d).css({left:s+"%",display:"inline-block"})}).on("mouseout",function(){e.elemTemp.find("."+d).css("display","none")})},f.prototype.slide=function(e,t,a){var n=this,l=n.config,s=n.elemTemp,f=function(){return"vertical"===l.type?l.height:s[0].offsetWidth},h=s.find("."+o),y=s.next("."+v),g=y.children("."+c).children("input").val(),b=100/((l.max-l.min)/Math.ceil(l.step)),x=function(e,i){e=Math.ceil(e)*b>100?Math.ceil(e)*b:Math.round(e)*b,e=e>100?100:e,h.eq(i).css("vertical"===l.type?"bottom":"left",e+"%");var t=T(h[0].offsetLeft),a=l.range?T(h[1].offsetLeft):0;"vertical"===l.type?(s.find("."+d).css({bottom:e+"%","margin-bottom":"20px"}),t=T(f()-h[0].offsetTop-h.height()),a=l.range?T(f()-h[1].offsetTop-h.height()):0):s.find("."+d).css("left",e+"%"),t=t>100?100:t,a=a>100?100:a;var n=Math.min(t,a),o=Math.abs(t-a);"vertical"===l.type?s.find("."+r).css({height:o+"%",bottom:n+"%"}):s.find("."+r).css({width:o+"%",left:n+"%"});var u=l.min+Math.round((l.max-l.min)*e/100);if(g=u,y.children("."+c).children("input").val(g),h.eq(i).data("value",u),u=l.setTips?l.setTips(u):u,s.find("."+d).html(u),l.range){var v=[h.eq(0).data("value"),h.eq(1).data("value")];v[0]>v[1]&&v.reverse()}l.change&&l.change(l.range?v:u)},T=function(e){var i=e/f()*100/b,t=Math.round(i)*b;return e==f()&&(t=Math.ceil(i)*b),t},w=i(['
          f()&&(r=f());var o=r/f()*100/b;x(o,e),t.addClass(p),s.find("."+d).show(),i.preventDefault()},o=function(){t.removeClass(p),s.find("."+d).hide()};M(r,o)})}),s.on("click",function(e){var t=i("."+u);if(!t.is(event.target)&&0===t.has(event.target).length&&t.length){var a,n="vertical"===l.type?f()-e.clientY+i(this).offset().top:e.clientX-i(this).offset().left;n<0&&(n=0),n>f()&&(n=f());var s=n/f()*100/b;a=l.range?"vertical"===l.type?Math.abs(n-parseInt(i(h[0]).css("bottom")))>Math.abs(n-parseInt(i(h[1]).css("bottom")))?1:0:Math.abs(n-h[0].offsetLeft)>Math.abs(n-h[1].offsetLeft)?1:0:0,x(s,a),e.preventDefault()}}),y.hover(function(){var e=i(this);e.children("."+m).fadeIn("fast")},function(){var e=i(this);e.children("."+m).fadeOut("fast")}),y.children("."+m).children("i").each(function(e){i(this).on("click",function(){g=1==e?g-l.stepl.max?l.max:Number(g)+l.step;var i=(g-l.min)/(l.max-l.min)*100/b;x(i,0)})});var q=function(){var e=this.value;e=isNaN(e)?0:e,e=el.max?l.max:e,this.value=e;var i=(e-l.min)/(l.max-l.min)*100/b;x(i,0)};y.children("."+c).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),q.call(this))}).on("change",q)},f.prototype.events=function(){var e=this;e.config},t.render=function(e){var i=new f(e);return a.call(i)},e(n,t)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/table.js b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/table.js new file mode 100644 index 0000000..0882b71 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/table.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define(["laytpl","laypage","layer","form","util"],function(e){"use strict";var t=layui.$,i=layui.laytpl,a=layui.laypage,l=layui.layer,n=layui.form,o=(layui.util,layui.hint()),r=layui.device(),d={config:{checkName:"LAY_CHECKED",indexName:"LAY_TABLE_INDEX"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,y,e,t)}},c=function(){var e=this,t=e.config,i=t.id||t.index;return i&&(c.that[i]=e,c.config[i]=t),{config:t,reload:function(t){e.reload.call(e,t)},setColsWidth:function(){e.setColsWidth.call(e)},resize:function(){e.resize.call(e)}}},s=function(e){var t=c.config[e];return t||o.error("The ID option was not found in the table instance"),t||null},u=function(e,a,l,n){var o=e.templet?function(){return"function"==typeof e.templet?e.templet(l):i(t(e.templet).html()||String(a)).render(l)}():a;return n?t("
          "+o+"
          ").text():o},y="table",h=".layui-table",f="layui-hide",p="layui-none",v="layui-table-view",m=".layui-table-tool",g=".layui-table-box",b=".layui-table-init",x=".layui-table-header",k=".layui-table-body",C=".layui-table-main",w=".layui-table-fixed",T=".layui-table-fixed-l",A=".layui-table-fixed-r",L=".layui-table-total",N=".layui-table-page",S=".layui-table-sort",R="layui-table-edit",W="layui-table-hover",_=function(e){var t='{{#if(item2.colspan){}} colspan="{{item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{item2.rowspan}}"{{#}}}';return e=e||{},['',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',function(){return e.fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':""}(),"{{# var isSort = !(item2.colGroup) && item2.sort; }}",'",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
          ','
          ','{{# if(item2.type === "checkbox"){ }}','',"{{# } else { }}",'{{item2.title||""}}',"{{# if(isSort){ }}",'',"{{# } }}","{{# } }}","
          ","
          "].join("")},E=['',"","
          "].join(""),z=['
          ',"{{# if(d.data.toolbar){ }}",'
          ','
          ','
          ',"
          ","{{# } }}",'
          ',"{{# if(d.data.loading){ }}",'
          ','',"
          ","{{# } }}","{{# var left, right; }}",'
          ',_(),"
          ",'
          ',E,"
          ","{{# if(left){ }}",'
          ','
          ',_({fixed:!0}),"
          ",'
          ',E,"
          ","
          ","{{# }; }}","{{# if(right){ }}",'
          ','
          ',_({fixed:"right"}),'
          ',"
          ",'
          ',E,"
          ","
          ","{{# }; }}","
          ","{{# if(d.data.totalRow){ }}",'
          ','','',"
          ","
          ","{{# } }}","{{# if(d.data.page){ }}",'
          ','
          ',"
          ","{{# } }}","","
          "].join(""),H=t(window),j=t(document),F=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};F.prototype.config={limit:10,loading:!0,cellMinWidth:60,defaultToolbar:["filter","exports","print"],autoSort:!0,text:{none:"无数据"}},F.prototype.render=function(){var e=this,a=e.config;if(a.elem=t(a.elem),a.where=a.where||{},a.id=a.id||a.elem.attr("id")||e.index,a.request=t.extend({pageName:"page",limitName:"limit"},a.request),a.response=t.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",totalRowName:"totalRow",countName:"count"},a.response),"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,e.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return e;a.height&&/^full-\d+$/.test(a.height)&&(e.fullHeightGap=a.height.split("-")[1],a.height=H.height()-e.fullHeightGap),e.setInit();var l=a.elem,n=l.next("."+v),o=e.elem=t(i(z).render({VIEW_CLASS:v,data:a,index:e.index}));if(a.index=e.index,e.key=a.id||a.index,n[0]&&n.remove(),l.after(o),e.layTool=o.find(m),e.layBox=o.find(g),e.layHeader=o.find(x),e.layMain=o.find(C),e.layBody=o.find(k),e.layFixed=o.find(w),e.layFixLeft=o.find(T),e.layFixRight=o.find(A),e.layTotal=o.find(L),e.layPage=o.find(N),e.renderToolbar(),e.fullSize(),a.cols.length>1){var r=e.layFixed.find(x).find("th");r.height(e.layHeader.height()-1-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom")))}e.pullData(e.page),e.events()},F.prototype.initOpts=function(e){var t=this,i=(t.config,{checkbox:48,radio:48,space:15,numbers:40});e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||i[e.type])},F.prototype.setInit=function(e){var t=this,i=t.config;return i.clientWidth=i.width||function(){var e=function(t){var a,l;t=t||i.elem.parent(),a=t.width();try{l="none"===t.css("display")}catch(n){}return!t[0]||a&&!l?a:e(t.parent())};return e()}(),"width"===e?i.clientWidth:void layui.each(i.cols,function(e,a){layui.each(a,function(l,n){if(!n)return void a.splice(l,1);if(n.key=e+"-"+l,n.hide=n.hide||!1,n.colGroup||n.colspan>1){var o=0;layui.each(i.cols[e+1],function(t,i){i.HAS_PARENT||o>1&&o==n.colspan||(i.HAS_PARENT=!0,i.parentKey=e+"-"+l,o+=parseInt(i.colspan>1?i.colspan:1))}),n.colGroup=!0}t.initOpts(n)})})},F.prototype.renderToolbar=function(){var e=this,a=e.config,l=['
          ','
          ','
          '].join(""),n=e.layTool.find(".layui-table-tool-temp");if("default"===a.toolbar)n.html(l);else if("string"==typeof a.toolbar){var o=t(a.toolbar).html()||"";o&&n.html(i(o).render(a))}var r={filter:{title:"筛选列",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols"},exports:{title:"导出",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export"},print:{title:"打印",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print"}},d=[];"object"==typeof a.defaultToolbar&&layui.each(a.defaultToolbar,function(e,t){var i="string"==typeof t?r[t]:t;i&&d.push('
          ')}),e.layTool.find(".layui-table-tool-self").html(d.join(""))},F.prototype.setParentCol=function(e,t){var i=this,a=i.config,l=i.layHeader.find('th[data-key="'+a.index+"-"+t+'"]'),n=parseInt(l.attr("colspan"))||0;if(l[0]){var o=t.split("-"),r=a.cols[o[0]][o[1]];e?n--:n++,l.attr("colspan",n),l[n<1?"addClass":"removeClass"](f),r.colspan=n,r.hide=n<1;var d=l.data("parentkey");d&&i.setParentCol(e,d)}},F.prototype.setColsPatch=function(){var e=this,t=e.config;layui.each(t.cols,function(t,i){layui.each(i,function(t,i){i.hide&&e.setParentCol(i.hide,i.parentKey)})})},F.prototype.setColsWidth=function(){var e=this,t=e.config,i=0,a=0,l=0,n=0,o=e.setInit("width");e.eachCols(function(e,t){t.hide||i++}),o=o-function(){return"line"===t.skin||"nob"===t.skin?2:i+1}()-e.getScrollWidth(e.layMain[0])-1;var r=function(e){layui.each(t.cols,function(i,r){layui.each(r,function(i,d){var c=0,s=d.minWidth||t.cellMinWidth;return d?void(d.colGroup||d.hide||(e?l&&ln&&a&&(l=(o-n)/a)};r(),r(!0),e.autoColNums=a,e.eachCols(function(i,a){var n=a.minWidth||t.cellMinWidth;a.colGroup||a.hide||(0===a.width?e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(l>=n?l:n)+"px"}):/\d+%$/.test(a.width)&&e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(parseFloat(a.width)/100*o)+"px"}))});var d=e.layMain.width()-e.getScrollWidth(e.layMain[0])-e.layMain.children("table").outerWidth();if(e.autoColNums&&d>=-i&&d<=i){var c=function(t){var i;return t=t||e.layHeader.eq(0).find("thead th:last-child"),i=t.data("field"),!i&&t.prev()[0]?c(t.prev()):t},s=c(),u=s.data("key");e.getCssRule(u,function(t){var i=t.style.width||s.outerWidth();t.style.width=parseFloat(i)+d+"px",e.layMain.height()-e.layMain.prop("clientHeight")>0&&(t.style.width=parseFloat(t.style.width)-1+"px")})}e.loading(!0)},F.prototype.resize=function(){var e=this;e.fullSize(),e.setColsWidth(),e.scrollPatch()},F.prototype.reload=function(e){var i=this;e=e||{},delete i.haveInit,e.data&&e.data.constructor===Array&&delete i.config.data,i.config=t.extend(!0,{},i.config,e),i.render()},F.prototype.errorView=function(e){var i=this,a=i.layMain.find("."+p),l=t('
          '+(e||"Error")+"
          ");a[0]&&(i.layNone.remove(),a.remove()),i.layFixed.addClass(f),i.layMain.find("tbody").html(""),i.layMain.append(i.layNone=l),d.cache[i.key]=[]},F.prototype.page=1,F.prototype.pullData=function(e){var i=this,a=i.config,l=a.request,n=a.response,o=function(){"object"==typeof a.initSort&&i.sort(a.initSort.field,a.initSort.type)};if(i.startTime=(new Date).getTime(),a.url){var r={};r[l.pageName]=e,r[l.limitName]=a.limit;var d=t.extend(r,a.where);a.contentType&&0==a.contentType.indexOf("application/json")&&(d=JSON.stringify(d)),i.loading(),t.ajax({type:a.method||"get",url:a.url,contentType:a.contentType,data:d,dataType:"json",headers:a.headers||{},success:function(t){"function"==typeof a.parseData&&(t=a.parseData(t)||t),t[n.statusName]!=n.statusCode?(i.renderForm(),i.errorView(t[n.msgName]||'返回的数据不符合规范,正确的成功状态码应为:"'+n.statusName+'": '+n.statusCode)):(i.renderData(t,e,t[n.countName]),o(),a.time=(new Date).getTime()-i.startTime+" ms"),i.setColsWidth(),"function"==typeof a.done&&a.done(t,e,t[n.countName])},error:function(e,t){i.errorView("数据接口请求异常:"+t),i.renderForm(),i.setColsWidth()}})}else if(a.data&&a.data.constructor===Array){var c={},s=e*a.limit-a.limit;c[n.dataName]=a.data.concat().splice(s,a.limit),c[n.countName]=a.data.length,"object"==typeof a.totalRow&&(c[n.totalRowName]=t.extend({},a.totalRow)),i.renderData(c,e,c[n.countName]),o(),i.setColsWidth(),"function"==typeof a.done&&a.done(c,e,c[n.countName])}},F.prototype.eachCols=function(e){var t=this;return d.eachCols(null,e,t.config.cols),t},F.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,y=e[s.response.dataName]||[],h=e[s.response.totalRowName],v=[],m=[],g=[],b=function(){var e;return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(y,function(a,l){var o=[],y=[],h=[],p=a+s.limit*(n-1)+1;0!==l.length&&(r||(l[d.config.indexName]=a),c.eachCols(function(n,r){var c=r.field||n,v=s.index+"-"+r.key,m=l[c];if(void 0!==m&&null!==m||(m=""),!r.colGroup){var g=['','
          '+function(){var n=t.extend(!0,{LAY_INDEX:p},l),o=d.config.checkName;switch(r.type){case"checkbox":return'";case"radio":return n[o]&&(e=a),'';case"numbers":return p}return r.toolbar?i(t(r.toolbar).html()||"").render(n):u(r,m,n)}(),"
          "].join("");o.push(g),r.fixed&&"right"!==r.fixed&&y.push(g),"right"===r.fixed&&h.push(g)}}),v.push(''+o.join("")+""),m.push(''+y.join("")+""),g.push(''+h.join("")+""))}),c.layBody.scrollTop(0),c.layMain.find("."+p).remove(),c.layMain.find("tbody").html(v.join("")),c.layFixLeft.find("tbody").html(m.join("")),c.layFixRight.find("tbody").html(g.join("")),c.renderForm(),"number"==typeof e&&c.setThisRowChecked(e),c.syncCheckAll(),c.haveInit?c.scrollPatch():setTimeout(function(){c.scrollPatch()},50),c.haveInit=!0,l.close(c.tipsIndex),s.HAS_SET_COLS_PATCH||c.setColsPatch(),void(s.HAS_SET_COLS_PATCH=!0))};return d.cache[c.key]=y,c.layPage[0==o||0===y.length&&1==n?"addClass":"removeClass"](f),r?b():0===y.length?(c.renderForm(),c.errorView(s.text.none)):(c.layFixed.removeClass(f),b(),c.renderTotal(y,h),void(s.page&&(s.page=t.extend({elem:"layui-table-page"+s.index,count:o,limit:s.limit,limits:s.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(c.page=e.curr,s.limit=e.limit,c.pullData(e.curr))}},s.page),s.page.count=o,a.render(s.page))))},F.prototype.renderTotal=function(e,t){var i=this,a=i.config,l={};if(a.totalRow){layui.each(e,function(e,t){0!==t.length&&i.eachCols(function(e,i){var a=i.field||e,n=t[a];i.totalRow&&(l[a]=(l[a]||0)+(parseFloat(n)||0))})}),i.dataTotal={};var n=[];i.eachCols(function(e,o){var r=o.field||e,d=function(){var e=o.totalRowText||"",i=parseFloat(l[r]).toFixed(2),a={};return a[r]=i,i=u(o,i,a),t?t[o.field]||e:o.totalRow?i||e:e}(),c=['','
          '+d,"
          "].join("");o.field&&(i.dataTotal[r]=d),n.push(c)}),i.layTotal.find("tbody").html(""+n.join("")+"")}},F.prototype.getColElem=function(e,t){var i=this,a=i.config;return e.eq(0).find(".laytable-cell-"+(a.index+"-"+t)+":eq(0)")},F.prototype.renderForm=function(e){n.render(e,"LAY-table-"+this.index)},F.prototype.setThisRowChecked=function(e){var t=this,i=(t.config,"layui-table-click"),a=t.layBody.find('tr[data-index="'+e+'"]');a.addClass(i).siblings("tr").removeClass(i)},F.prototype.sort=function(e,i,a,l){var n,r,c=this,s={},u=c.config,h=u.elem.attr("lay-filter"),f=d.cache[c.key];"string"==typeof e&&c.layHeader.find("th").each(function(i,a){var l=t(this),o=l.data("field");if(o===e)return e=l,n=o,!1});try{var n=n||e.data("field"),p=e.data("key");if(c.sortKey&&!a&&n===c.sortKey.field&&i===c.sortKey.sort)return;var v=c.layHeader.find("th .laytable-cell-"+p).find(S);c.layHeader.find("th").find(S).removeAttr("lay-sort"),v.attr("lay-sort",i||null),c.layFixed.find("th")}catch(m){return o.error("Table modules: Did not match to field")}c.sortKey={field:n,sort:i},u.autoSort&&("asc"===i?r=layui.sort(f,n):"desc"===i?r=layui.sort(f,n,!0):(r=layui.sort(f,d.config.indexName),delete c.sortKey)),s[u.response.dataName]=r||f,c.renderData(s,c.page,c.count,!0),l&&layui.event.call(e,y,"sort("+h+")",{field:n,type:i})},F.prototype.loading=function(e){var i=this,a=i.config;a.loading&&(e?(i.layInit&&i.layInit.remove(),delete i.layInit,i.layBox.find(b).remove()):(i.layInit=t(['
          ','',"
          "].join("")),i.layBox.append(i.layInit)))},F.prototype.setCheckData=function(e,t){var i=this,a=i.config,l=d.cache[i.key];l[e]&&l[e].constructor!==Array&&(l[e][a.checkName]=t)},F.prototype.syncCheckAll=function(){var e=this,t=e.config,i=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(i){return e.eachCols(function(e,a){"checkbox"===a.type&&(a[t.checkName]=i)}),i};i[0]&&(d.checkStatus(e.key).isAll?(i[0].checked||(i.prop("checked",!0),e.renderForm("checkbox")),a(!0)):(i[0].checked&&(i.prop("checked",!1),e.renderForm("checkbox")),a(!1)))},F.prototype.getCssRule=function(e,t){var i=this,a=i.elem.find("style")[0],l=a.sheet||a.styleSheet||{},n=l.cssRules||l.rules;layui.each(n,function(i,a){if(a.selectorText===".laytable-cell-"+e)return t(a),!0})},F.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=H.height()-t.fullHeightGap,a<135&&(a=135),t.elem.css("height",a)),a&&(e=parseFloat(a)-(t.layHeader.outerHeight()||38),i.toolbar&&(e-=t.layTool.outerHeight()||50),i.totalRow&&(e-=t.layTotal.outerHeight()||40),i.page&&(e-=t.layPage.outerHeight()||41),t.layMain.css("height",e-2))},F.prototype.getScrollWidth=function(e){var t=0;return e?t=e.offsetWidth-e.clientWidth:(e=document.createElement("div"),e.style.width="100px",e.style.height="100px",e.style.overflowY="scroll",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},F.prototype.scrollPatch=function(){var e=this,i=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),l=e.layMain.height()-e.layMain.prop("clientHeight"),n=(e.getScrollWidth(e.layMain[0]),i.outerWidth()-e.layMain.width()),o=function(e){if(a&&l){if(e=e.eq(0),!e.find(".layui-table-patch")[0]){var i=t('
          ');i.find("div").css({width:a}),e.find("tr").append(i)}}else e.find(".layui-table-patch").remove()};o(e.layHeader),o(e.layTotal);var r=e.layMain.height(),d=r-l;e.layFixed.find(k).css("height",i.height()>=d?d:"auto"),e.layFixRight[n>0?"removeClass":"addClass"](f),e.layFixRight.css("right",a-1)},F.prototype.events=function(){var e,i=this,a=i.config,o=t("body"),c={},s=i.layHeader.find("th"),h=".layui-table-cell",p=a.elem.attr("lay-filter");i.layTool.on("click","*[lay-event]",function(e){var o=t(this),c=o.attr("lay-event"),s=function(e){var l=t(e.list),n=t('
            ');n.html(l),a.height&&n.css("max-height",a.height-(i.layTool.outerHeight()||50)),o.find(".layui-table-tool-panel")[0]||o.append(n),i.renderForm(),n.on("click",function(e){layui.stope(e)}),e.done&&e.done(n,l)};switch(layui.stope(e),j.trigger("table.tool.panel.remove"),l.close(i.tipsIndex),c){case"LAYTABLE_COLS":s({list:function(){var e=[];return i.eachCols(function(t,i){i.field&&"normal"==i.type&&e.push('
          • ')}),e.join("")}(),done:function(){n.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var l=t(e.elem),n=this.checked,o=l.data("key"),r=l.data("parentkey");layui.each(a.cols,function(e,t){layui.each(t,function(t,l){if(e+"-"+t===o){var d=l.hide;l.hide=!n,i.elem.find('*[data-key="'+a.index+"-"+o+'"]')[n?"removeClass":"addClass"](f),d!=l.hide&&i.setParentCol(!n,r),i.resize()}})})})}});break;case"LAYTABLE_EXPORT":r.ie?l.tips("导出功能不支持 IE,请用 Chrome 等高级浏览器导出",this,{tips:3}):s({list:function(){return['
          • 导出到 Csv 文件
          • ','
          • 导出到 Excel 文件
          • '].join("")}(),done:function(e,l){l.on("click",function(){var e=t(this).data("type");d.exportFile.call(i,a.id,null,e)})}});break;case"LAYTABLE_PRINT":var u=window.open("打印窗口","_blank"),h=[""].join(""),v=t(i.layHeader.html());v.append(i.layMain.find("table").html()),v.append(i.layTotal.find("table").html()),v.find("th.layui-table-patch").remove(),v.find(".layui-table-col-special").remove(),u.document.write(h+v.prop("outerHTML")),u.document.close(),u.print(),u.close()}layui.event.call(this,y,"toolbar("+p+")",t.extend({event:c,config:a},{}))}),s.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;i.data("unresize")||c.resizeStart||(c.allowResize=i.width()-l<=10,o.css("cursor",c.allowResize?"col-resize":""))}).on("mouseleave",function(){t(this);c.resizeStart||o.css("cursor","")}).on("mousedown",function(e){var l=t(this);if(c.allowResize){var n=l.data("key");e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],i.getCssRule(n,function(e){var t=e.style.width||l.outerWidth();c.rule=e,c.ruleWidth=parseFloat(t),c.minWidth=l.data("minwidth")||a.cellMinWidth})}}),j.on("mousemove",function(t){if(c.resizeStart){if(t.preventDefault(),c.rule){var a=c.ruleWidth+t.clientX-c.offset[0];a');return n[0].value=i.data("content")||l.text(),i.find("."+R)[0]||i.append(n),n.focus(),void layui.stope(e)}}).on("mouseenter","td",function(){b.call(this)}).on("mouseleave","td",function(){b.call(this,"hide")});var g="layui-table-grid-down",b=function(e){var i=t(this),a=i.children(h);if(!i.data("off"))if(e)i.find(".layui-table-grid-down").remove();else if(a.prop("scrollWidth")>a.outerWidth()){if(a.find("."+g)[0])return;i.append('
            ')}};i.layBody.on("click","."+g,function(e){var n=t(this),o=n.parent(),d=o.children(h);i.tipsIndex=l.tips(['
            ',d.html(),"
            ",''].join(""),d[0],{tips:[3,""],time:-1,anim:-1,maxWidth:r.ios||r.android?300:i.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){l.close(t)})}}),layui.stope(e)}),i.layBody.on("click","*[lay-event]",function(){var e=t(this),a=e.parents("tr").eq(0).data("index");layui.event.call(this,y,"tool("+p+")",v.call(this,{event:e.attr("lay-event")})),i.setThisRowChecked(a)}),i.layMain.on("scroll",function(){var e=t(this),a=e.scrollLeft(),n=e.scrollTop();i.layHeader.scrollLeft(a),i.layTotal.scrollLeft(a),i.layFixed.find(k).scrollTop(n),l.close(i.tipsIndex)}),H.on("resize",function(){i.resize()})},function(){j.on("click",function(){j.trigger("table.remove.tool.panel")}),j.on("table.remove.tool.panel",function(){t(".layui-table-tool-panel").remove()})}(),d.init=function(e,i){i=i||{};var a=this,l=t(e?'table[lay-filter="'+e+'"]':h+"[lay-data]"),n="Table element property lay-data configuration item has a syntax error: ";return l.each(function(){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){o.error(n+l)}var c=[],s=t.extend({elem:this,cols:[],data:[],skin:a.attr("lay-skin"),size:a.attr("lay-size"),even:"string"==typeof a.attr("lay-even")},d.config,i,l);e&&a.hide(),a.find("thead>tr").each(function(e){s.cols[e]=[],t(this).children().each(function(i){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){return o.error(n+l)}var d=t.extend({title:a.text(),colspan:a.attr("colspan")||0,rowspan:a.attr("rowspan")||0},l);d.colspan<2&&c.push(d),s.cols[e].push(d)})}),a.find("tbody>tr").each(function(e){var i=t(this),a={};i.children("td").each(function(e,i){var l=t(this),n=l.data("field");if(n)return a[n]=l.html()}),layui.each(c,function(e,t){var l=i.children("td").eq(e);a[t.field]=l.html()}),s.data[e]=a}),d.render(s)}),a},c.that={},c.config={},d.eachCols=function(e,i,a){var l=c.config[e]||{},n=[],o=0;a=t.extend(!0,[],a||l.cols),layui.each(a,function(e,t){layui.each(t,function(t,i){if(i.colGroup){var l=0;o++,i.CHILD_COLS=[],layui.each(a[e+1],function(e,t){t.PARENT_COL_INDEX||l>1&&l==i.colspan||(t.PARENT_COL_INDEX=o,i.CHILD_COLS.push(t),l+=parseInt(t.colspan>1?t.colspan:1))})}i.PARENT_COL_INDEX||n.push(i)})});var r=function(e){layui.each(e||n,function(e,t){return t.CHILD_COLS?r(t.CHILD_COLS):void("function"==typeof i&&i(e,t))})};r()},d.checkStatus=function(e){var t=0,i=0,a=[],l=d.cache[e]||[];return layui.each(l,function(e,l){return l.constructor===Array?void i++:void(l[d.config.checkName]&&(t++,a.push(d.clearCacheKey(l))))}),{data:a,isAll:!!l.length&&t===l.length-i}},d.exportFile=function(e,t,i){var a=this;t=t||d.clearCacheKey(d.cache[e]),i=i||"csv";var l=c.config[e]||{},n={csv:"text/csv",xls:"application/vnd.ms-excel"}[i],s=document.createElement("a");return r.ie?o.error("IE_NOT_SUPPORT_EXPORTS"):(s.href="data:"+n+";charset=utf-8,\ufeff"+encodeURIComponent(function(){var i=[],l=[],n=[];return layui.each(t,function(t,a){var n=[];"object"==typeof e?(layui.each(e,function(e,a){0==t&&i.push(a||"")}),layui.each(d.clearCacheKey(a),function(e,t){n.push('"'+(t||"")+'"')})):d.eachCols(e,function(e,l){if(l.field&&"normal"==l.type&&!l.hide){var o=a[l.field];void 0!==o&&null!==o||(o=""),0==t&&i.push(l.title||""),n.push('"'+u(l,o,a,"text")+'"')}}),l.push(n.join(","))}),layui.each(a.dataTotal,function(e,t){n.push(t)}),i.join(",")+"\r\n"+l.join("\r\n")+"\r\n"+n.join(",")}()),s.download=(l.title||"table_"+(l.index||""))+"."+i,document.body.appendChild(s),s.click(),void document.body.removeChild(s))},d.resize=function(e){if(e){var t=s(e);if(!t)return;c.that[e].resize()}else layui.each(c.that,function(){this.resize()})},d.reload=function(e,t){var i=s(e);if(i){var a=c.that[e];return a.reload(t),c.call(a)}},d.render=function(e){var t=new F(e);return c.call(t)},d.clearCacheKey=function(e){return e=t.extend({},e),delete e[d.config.checkName],delete e[d.config.indexName],e},d.init(),e(y,d)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/transfer.js b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/transfer.js new file mode 100644 index 0000000..2483921 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/transfer.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define(["laytpl","form"],function(e){"use strict";var a=layui.$,t=layui.laytpl,n=layui.form,i="transfer",l={config:{},index:layui[i]?layui[i].index+1e4:0,set:function(e){var t=this;return t.config=a.extend({},t.config,e),t},on:function(e,a){return layui.onevent.call(this,i,e,a)}},r=function(){var e=this,a=e.config,t=a.id||e.index;return r.that[t]=e,r.config[t]=a,{config:a,reload:function(a){e.reload.call(e,a)},getData:function(){return e.getData.call(e)}}},c="layui-hide",o="layui-btn-disabled",d="layui-none",s="layui-transfer-box",u="layui-transfer-header",h="layui-transfer-search",f="layui-transfer-active",y="layui-transfer-data",p=function(e){return e=e||{},['
            ','
            ','","
            ","{{# if(d.data.showSearch){ }}",'","{{# } }}",'
              ',"
              "].join("")},v=['
              ',p({index:0,checkAllName:"layTransferLeftCheckAll"}),'
              ','",'","
              ",p({index:1,checkAllName:"layTransferRightCheckAll"}),"
              "].join(""),x=function(e){var t=this;t.index=++l.index,t.config=a.extend({},t.config,l.config,e),t.render()};x.prototype.config={title:["列表一","列表二"],width:200,height:360,data:[],value:[],showSearch:!1,id:"",text:{none:"无数据",searchNone:"无匹配数据"}},x.prototype.reload=function(e){var t=this;layui.each(e,function(e,a){a.constructor===Array&&delete t.config[e]}),t.config=a.extend(!0,{},t.config,e),t.render()},x.prototype.render=function(){var e=this,n=e.config,i=e.elem=a(t(v).render({data:n,index:e.index})),l=n.elem=a(n.elem);l[0]&&(n.data=n.data||[],n.value=n.value||[],e.key=n.id||e.index,l.html(e.elem),e.layBox=e.elem.find("."+s),e.layHeader=e.elem.find("."+u),e.laySearch=e.elem.find("."+h),e.layData=i.find("."+y),e.layBtn=i.find("."+f+" .layui-btn"),e.layBox.css({width:n.width,height:n.height}),e.layData.css({height:function(){return n.height-e.layHeader.outerHeight()-e.laySearch.outerHeight()-2}()}),e.renderData(),e.events())},x.prototype.renderData=function(){var e=this,a=(e.config,[{checkName:"layTransferLeftCheck",views:[]},{checkName:"layTransferRightCheck",views:[]}]);e.parseData(function(e){var t=e.selected?1:0,n=["
            • ",'',"
            • "].join("");a[t].views.push(n),delete e.selected}),e.layData.eq(0).html(a[0].views.join("")),e.layData.eq(1).html(a[1].views.join("")),e.renderCheckBtn()},x.prototype.renderForm=function(e){n.render(e,"LAY-transfer-"+this.index)},x.prototype.renderCheckBtn=function(e){var t=this,n=t.config;e=e||{},t.layBox.each(function(i){var l=a(this),r=l.find("."+y),d=l.find("."+u).find('input[type="checkbox"]'),s=r.find('input[type="checkbox"]'),h=0,f=!1;if(s.each(function(){var e=a(this).data("hide");(this.checked||this.disabled||e)&&h++,this.checked&&!e&&(f=!0)}),d.prop("checked",f&&h===s.length),t.layBtn.eq(i)[f?"removeClass":"addClass"](o),!e.stopNone){var p=r.children("li:not(."+c+")").length;t.noneView(r,p?"":n.text.none)}}),t.renderForm("checkbox")},x.prototype.noneView=function(e,t){var n=a('

              '+(t||"")+"

              ");e.find("."+d)[0]&&e.find("."+d).remove(),t.replace(/\s/g,"")&&e.append(n)},x.prototype.setValue=function(){var e=this,t=e.config,n=[];return e.layBox.eq(1).find("."+y+' input[type="checkbox"]').each(function(){var e=a(this).data("hide");e||n.push(this.value)}),t.value=n,e},x.prototype.parseData=function(e){var t=this,n=t.config,i=[];return layui.each(n.data,function(t,l){l=("function"==typeof n.parseData?n.parseData(l):l)||l,i.push(l=a.extend({},l)),layui.each(n.value,function(e,a){a==l.value&&(l.selected=!0)}),e&&e(l)}),n.data=i,t},x.prototype.getData=function(e){var a=this,t=a.config,n=[];return a.setValue(),layui.each(e||t.value,function(e,a){layui.each(t.data,function(e,t){delete t.selected,a==t.value&&n.push(t)})}),n},x.prototype.events=function(){var e=this,t=e.config;e.elem.on("click",'input[lay-filter="layTransferCheckbox"]+',function(){var t=a(this).prev(),n=t[0].checked,i=t.parents("."+s).eq(0).find("."+y);t[0].disabled||("all"===t.attr("lay-type")&&i.find('input[type="checkbox"]').each(function(){this.disabled||(this.checked=n)}),e.renderCheckBtn({stopNone:!0}))}),e.layBtn.on("click",function(){var n=a(this),i=n.data("index"),l=e.layBox.eq(i),r=[];if(!n.hasClass(o)){e.layBox.eq(i).each(function(t){var n=a(this),i=n.find("."+y);i.children("li").each(function(){var t=a(this),n=t.find('input[type="checkbox"]'),i=n.data("hide");n[0].checked&&!i&&(n[0].checked=!1,l.siblings("."+s).find("."+y).append(t.clone()),t.remove(),r.push(n[0].value)),e.setValue()})}),e.renderCheckBtn();var c=l.siblings("."+s).find("."+h+" input");""===c.val()||c.trigger("keyup"),t.onchange&&t.onchange(e.getData(r),i)}}),e.laySearch.find("input").on("keyup",function(){var n=this.value,i=a(this).parents("."+h).eq(0).siblings("."+y),l=i.children("li");l.each(function(){var e=a(this),t=e.find('input[type="checkbox"]'),i=t[0].title.indexOf(n)!==-1;e[i?"removeClass":"addClass"](c),t.data("hide",!i)}),e.renderCheckBtn();var r=l.length===i.children("li."+c).length;e.noneView(i,r?t.text.searchNone:"")})},r.that={},r.config={},l.reload=function(e,a){var t=r.that[e];return t.reload(a),r.call(t)},l.getData=function(e){var a=r.that[e];return a.getData()},l.render=function(e){var a=new x(e);return r.call(a)},e(i,l)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/tree.js b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/tree.js new file mode 100644 index 0000000..c9c93a2 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/tree.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define("form",function(e){"use strict";var i=layui.$,a=layui.form,n=layui.layer,t="tree",r={config:{},index:layui[t]?layui[t].index+1e4:0,set:function(e){var a=this;return a.config=i.extend({},a.config,e),a},on:function(e,i){return layui.onevent.call(this,t,e,i)}},l=function(){var e=this,i=e.config,a=i.id||e.index;return l.that[a]=e,l.config[a]=i,{config:i,reload:function(i){e.reload.call(e,i)},getChecked:function(){return e.getChecked.call(e)},setChecked:function(i){return e.setChecked.call(e,i)}}},c="layui-hide",d="layui-disabled",s="layui-tree-set",o="layui-tree-iconClick",h="layui-icon-addition",u="layui-icon-subtraction",p="layui-tree-entry",f="layui-tree-main",y="layui-tree-txt",v="layui-tree-pack",C="layui-tree-spread",k="layui-tree-setLineShort",m="layui-tree-showLine",x="layui-tree-lineExtend",b=function(e){var a=this;a.index=++r.index,a.config=i.extend({},a.config,r.config,e),a.render()};b.prototype.config={data:[],showCheckbox:!1,showLine:!0,accordion:!1,onlyIconControl:!1,isJump:!1,edit:!1,text:{defaultNodeName:"未命名",none:"无数据"}},b.prototype.reload=function(e){var a=this;layui.each(e,function(e,i){i.constructor===Array&&delete a.config[e]}),a.config=i.extend(!0,{},a.config,e),a.render()},b.prototype.render=function(){var e=this,a=e.config;e.checkids=[];var n=i('
              ');e.tree(n);var t=a.elem=i(a.elem);if(t[0]){if(e.key=a.id||e.index,e.elem=n,e.elemNone=i('
              '+a.text.none+"
              "),t.html(e.elem),0==e.elem.find(".layui-tree-set").length)return e.elem.append(e.elemNone);a.showCheckbox&&e.renderForm("checkbox"),e.elem.find(".layui-tree-set").each(function(){var e=i(this);e.parent(".layui-tree-pack")[0]||e.addClass("layui-tree-setHide"),!e.next()[0]&&e.parents(".layui-tree-pack").eq(1).hasClass("layui-tree-lineExtend")&&e.addClass(k),e.next()[0]||e.parents(".layui-tree-set").eq(0).next()[0]||e.addClass(k)}),e.events()}},b.prototype.renderForm=function(e){a.render(e,"LAY-tree-"+this.index)},b.prototype.tree=function(e,a){var n=this,t=n.config,r=a||t.data;layui.each(r,function(a,r){var l=r.children&&r.children.length>0,o=i('
              '),h=i(['
              ','
              ','
              ',function(){return t.showLine?l?'':'':''}(),function(){return t.showCheckbox?'':""}(),function(){return t.isJump&&r.href?''+(r.title||r.label||t.text.defaultNodeName)+"":''+(r.title||r.label||t.text.defaultNodeName)+""}(),"
              ",function(){if(!t.edit)return"";var e={add:'',update:'',del:''},i=['
              '];return t.edit===!0&&(t.edit=["update","del"]),"object"==typeof t.edit?(layui.each(t.edit,function(a,n){i.push(e[n]||"")}),i.join("")+"
              "):void 0}(),"
              "].join(""));l&&(h.append(o),n.tree(o,r.children)),e.append(h),h.prev("."+s)[0]&&h.prev().children(".layui-tree-pack").addClass("layui-tree-showLine"),l||h.parent(".layui-tree-pack").addClass("layui-tree-lineExtend"),n.spread(h,r),t.showCheckbox&&(r.checked&&n.checkids.push(r.id),n.checkClick(h,r)),t.edit&&n.operate(h,r)})},b.prototype.spread=function(e,a){var n=this,t=n.config,r=e.children("."+p),l=r.children("."+f),c=r.find("."+o),k=r.find("."+y),m=t.onlyIconControl?c:l,x="";m.on("click",function(i){var a=e.children("."+v),n=m.children(".layui-icon")[0]?m.children(".layui-icon"):m.find(".layui-tree-icon").children(".layui-icon");if(a[0]){if(e.hasClass(C))e.removeClass(C),a.slideUp(200),n.removeClass(u).addClass(h);else if(e.addClass(C),a.slideDown(200),n.addClass(u).removeClass(h),t.accordion){var r=e.siblings("."+s);r.removeClass(C),r.children("."+v).slideUp(200),r.find(".layui-tree-icon").children(".layui-icon").removeClass(u).addClass(h)}}else x="normal"}),k.on("click",function(){var n=i(this);n.hasClass(d)||(x=e.hasClass(C)?t.onlyIconControl?"open":"close":t.onlyIconControl?"close":"open",t.click&&t.click({elem:e,state:x,data:a}))})},b.prototype.setCheckbox=function(e,i,a){var n=this,t=(n.config,a.prop("checked"));if(!a.prop("disabled")){if("object"==typeof i.children||e.find("."+v)[0]){var r=e.find("."+v).find('input[same="layuiTreeCheck"]');r.each(function(){this.disabled||(this.checked=t)})}var l=function(e){if(e.parents("."+s)[0]){var i,a=e.parent("."+v),n=a.parent(),r=a.prev().find('input[same="layuiTreeCheck"]');t?r.prop("checked",t):(a.find('input[same="layuiTreeCheck"]').each(function(){this.checked&&(i=!0)}),i||r.prop("checked",!1)),l(n)}};l(e),n.renderForm("checkbox")}},b.prototype.checkClick=function(e,a){var n=this,t=n.config,r=e.children("."+p),l=r.children("."+f);l.on("click",'input[same="layuiTreeCheck"]+',function(r){layui.stope(r);var l=i(this).prev(),c=l.prop("checked");l.prop("disabled")||(n.setCheckbox(e,a,l),t.oncheck&&t.oncheck({elem:e,checked:c,data:a}))})},b.prototype.operate=function(e,a){var t=this,r=t.config,l=e.children("."+p),d=l.children("."+f);l.children(".layui-tree-btnGroup").on("click",".layui-icon",function(l){layui.stope(l);var f=i(this).data("type"),b=e.children("."+v),g={data:a,type:f,elem:e};if("add"==f){b[0]||(r.showLine?(d.find("."+o).addClass("layui-tree-icon"),d.find("."+o).children(".layui-icon").addClass(h).removeClass("layui-icon-file")):d.find(".layui-tree-iconArrow").removeClass(c),e.append('
              '));var w=r.operate&&r.operate(g),N={};if(N.title=r.text.defaultNodeName,N.id=w,t.tree(e.children("."+v),[N]),r.showLine)if(b[0])b.hasClass(x)||b.addClass(x),e.find("."+v).each(function(){i(this).children("."+s).last().addClass(k)}),b.children("."+s).last().prev().hasClass(k)?b.children("."+s).last().prev().removeClass(k):b.children("."+s).last().removeClass(k),!e.parent("."+v)[0]&&e.next()[0]&&b.children("."+s).last().removeClass(k);else{var T=e.siblings("."+s),L=1,A=e.parent("."+v);layui.each(T,function(e,a){i(a).children("."+v)[0]||(L=0)}),1==L?(T.children("."+v).addClass(m),T.children("."+v).children("."+s).removeClass(k),e.children("."+v).addClass(m),A.removeClass(x),A.children("."+s).last().children("."+v).children("."+s).last().addClass(k)):e.children("."+v).children("."+s).addClass(k)}if(!r.showCheckbox)return;if(d.find('input[same="layuiTreeCheck"]')[0].checked){var I=e.children("."+v).children("."+s).last();I.find('input[same="layuiTreeCheck"]')[0].checked=!0}t.renderForm("checkbox")}else if("update"==f){var F=d.children("."+y).html();d.children("."+y).html(""),d.append(''),d.children(".layui-tree-editInput").val(F).focus();var j=function(e){var i=e.val().trim();i=i?i:r.text.defaultNodeName,e.remove(),d.children("."+y).html(i),g.data.title=i,r.operate&&r.operate(g)};d.children(".layui-tree-editInput").blur(function(){j(i(this))}),d.children(".layui-tree-editInput").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),j(i(this)))})}else n.confirm('确认删除该节点 "'+(a.title||"")+'" 吗?',function(a){if(r.operate&&r.operate(g),g.status="remove",n.close(a),!e.prev("."+s)[0]&&!e.next("."+s)[0]&&!e.parent("."+v)[0])return e.remove(),void t.elem.append(t.elemNone);if(e.siblings("."+s).children("."+p)[0]){if(r.showCheckbox){var l=function(e){if(e.parents("."+s)[0]){var a=e.siblings("."+s).children("."+p),n=e.parent("."+v).prev(),r=n.find('input[same="layuiTreeCheck"]')[0],c=1,d=0;0==r.checked&&(a.each(function(e,a){var n=i(a).find('input[same="layuiTreeCheck"]')[0];0!=n.checked||n.disabled||(c=0),n.disabled||(d=1)}),1==c&&1==d&&(r.checked=!0,t.renderForm("checkbox"),l(n.parent("."+s))))}};l(e)}if(r.showLine){var d=e.siblings("."+s),h=1,f=e.parent("."+v);layui.each(d,function(e,a){i(a).children("."+v)[0]||(h=0)}),1==h?(b[0]||(f.removeClass(x),d.children("."+v).addClass(m),d.children("."+v).children("."+s).removeClass(k)),e.next()[0]?f.children("."+s).last().children("."+v).children("."+s).last().addClass(k):e.prev().children("."+v).children("."+s).last().addClass(k),e.next()[0]||e.parents("."+s)[1]||e.parents("."+s).eq(0).next()[0]||e.prev("."+s).addClass(k)):!e.next()[0]&&e.hasClass(k)&&e.prev().addClass(k)}}else{var y=e.parent("."+v).prev();if(r.showLine){y.find("."+o).removeClass("layui-tree-icon"),y.find("."+o).children(".layui-icon").removeClass(u).addClass("layui-icon-file");var w=y.parents("."+v).eq(0);w.addClass(x),w.children("."+s).each(function(){i(this).children("."+v).children("."+s).last().addClass(k)})}else y.find(".layui-tree-iconArrow").addClass(c);e.parents("."+s).eq(0).removeClass(C),e.parent("."+v).remove()}e.remove()})})},b.prototype.events=function(){var e=this,a=e.config;e.elem.find(".layui-tree-checkedFirst");e.setChecked(e.checkids),e.elem.find(".layui-tree-search").on("keyup",function(){var n=i(this),t=n.val(),r=n.nextAll(),l=[];r.find("."+y).each(function(){var e=i(this).parents("."+p);if(i(this).html().indexOf(t)!=-1){l.push(i(this).parent());var a=function(e){e.addClass("layui-tree-searchShow"),e.parent("."+v)[0]&&a(e.parent("."+v).parent("."+s))};a(e.parent("."+s))}}),r.find("."+p).each(function(){var e=i(this).parent("."+s);e.hasClass("layui-tree-searchShow")||e.addClass(c)}),0==r.find(".layui-tree-searchShow").length&&e.elem.append(e.elemNone),a.onsearch&&a.onsearch({elem:l})}),e.elem.find(".layui-tree-search").on("keydown",function(){i(this).nextAll().find("."+p).each(function(){var e=i(this).parent("."+s);e.removeClass("layui-tree-searchShow "+c)}),i(".layui-tree-emptyText")[0]&&i(".layui-tree-emptyText").remove()})},b.prototype.getChecked=function(){var e=this,a=e.config,n=[],t=[];e.elem.find(".layui-form-checked").each(function(){n.push(i(this).prev()[0].value)});var r=function(e,a){layui.each(e,function(e,t){layui.each(n,function(e,n){if(t.id==n){var l=i.extend({},t);return delete l.children,a.push(l),t.children&&(l.children=[],r(t.children,l.children)),!0}})})};return r(i.extend({},a.data),t),t},b.prototype.setChecked=function(e){var a=this;a.config;a.elem.find("."+s).each(function(a,n){var t=i(this).data("id"),r=i(n).children("."+p).find('input[same="layuiTreeCheck"]'),l=r.next();if("number"==typeof e){if(t==e)return r[0].checked||l.click(),!1}else"object"==typeof e&&layui.each(e,function(e,i){if(i==t&&!r[0].checked)return l.click(),!0})})},l.that={},l.config={},r.reload=function(e,i){var a=l.that[e];return a.reload(i),l.call(a)},r.getChecked=function(e){var i=l.that[e];return i.getChecked()},r.setChecked=function(e,i){var a=l.that[e];return a.setChecked(i)},r.render=function(e){var i=new b(e);return l.call(i)},e(t,r)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/upload.js b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/upload.js new file mode 100644 index 0000000..9298ecf --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/upload.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define("layer",function(e){"use strict";var t=layui.$,i=layui.layer,n=layui.hint(),o=layui.device(),a={config:{},set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,r,e,t)}},l=function(){var e=this;return{upload:function(t){e.upload.call(e,t)},reload:function(t){e.reload.call(e,t)},config:e.config}},r="upload",u="layui-upload-file",c="layui-upload-form",f="layui-upload-iframe",s="layui-upload-choose",p=function(e){var i=this;i.config=t.extend({},i.config,a.config,e),i.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",acceptMime:"",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},p.prototype.render=function(e){var i=this,e=i.config;e.elem=t(e.elem),e.bindAction=t(e.bindAction),i.file(),i.events()},p.prototype.file=function(){var e=this,i=e.config,n=e.elemFile=t(['"].join("")),a=i.elem.next();(a.hasClass(u)||a.hasClass(c))&&a.remove(),o.ie&&o.ie<10&&i.elem.wrap('
              '),e.isFile()?(e.elemFile=i.elem,i.field=i.elem[0].name):i.elem.after(n),o.ie&&o.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,i=e.config,n=t(''),o=t(['
              ',"
              "].join(""));t("#"+f)[0]||t("body").append(n),i.elem.next().hasClass(c)||(e.elemFile.wrap(o),i.elem.next("."+c).append(function(){var e=[];return layui.each(i.data,function(t,i){i="function"==typeof i?i():i,e.push('')}),e.join("")}()))},p.prototype.msg=function(e){return i.msg(e,{icon:2,shift:6})},p.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},p.prototype.preview=function(e){var t=this;window.FileReader&&layui.each(t.chooseFiles,function(t,i){var n=new FileReader;n.readAsDataURL(i),n.onload=function(){e&&e(t,i,this.result)}})},p.prototype.upload=function(e,i){var n,a=this,l=a.config,r=a.elemFile[0],u=function(){var i=0,n=0,o=e||a.files||a.chooseFiles||r.files,u=function(){l.multiple&&i+n===a.fileLength&&"function"==typeof l.allDone&&l.allDone({total:a.fileLength,successful:i,aborted:n})};layui.each(o,function(e,o){var r=new FormData;r.append(l.field,o),layui.each(l.data,function(e,t){t="function"==typeof t?t():t,r.append(e,t)});var c={url:l.url,type:"post",data:r,contentType:!1,processData:!1,dataType:"json",headers:l.headers||{},success:function(t){i++,d(e,t),u()},error:function(){n++,a.msg("请求上传接口出现异常"),m(e),u()}};"function"==typeof l.progress&&(c.xhr=function(){var e=t.ajaxSettings.xhr();return e.upload.addEventListener("progress",function(e){if(e.lengthComputable){var t=Math.floor(e.loaded/e.total*100);l.progress(t,l.item[0],e)}}),e}),t.ajax(c)})},c=function(){var e=t("#"+f);a.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var t,i=e.contents().find("body");try{t=i.text()}catch(n){a.msg("获取上传后的响应信息出现异常"),clearInterval(p.timer),m()}t&&(clearInterval(p.timer),i.html(""),d(0,t))},30)},d=function(e,t){if(a.elemFile.next("."+s).remove(),r.value="","object"!=typeof t)try{t=JSON.parse(t)}catch(i){return t={},a.msg("请对上传接口返回有效JSON")}"function"==typeof l.done&&l.done(t,e||0,function(e){a.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){a.upload(e)})},h=l.exts,v=function(){var t=[];return layui.each(e||a.chooseFiles,function(e,i){t.push(i.name)}),t}(),g={preview:function(e){a.preview(e)},upload:function(e,t){var i={};i[e]=t,a.upload(i)},pushFile:function(){return a.files=a.files||{},layui.each(a.chooseFiles,function(e,t){a.files[e]=t}),a.files},resetFile:function(e,t,i){var n=new File([t],i);a.files=a.files||{},a.files[e]=n}},y=function(){if("choose"!==i&&!l.auto||(l.choose&&l.choose(g),"choose"!==i))return l.before&&l.before(g),o.ie?o.ie>9?u():c():void u()};if(v=0===v.length?r.value.match(/[^\/\\]+\..+/g)||[]||"":v,0!==v.length){switch(l.accept){case"file":if(h&&!RegExp("\\w\\.("+h+")$","i").test(escape(v)))return a.msg("选择的文件中包含不支持的格式"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(h||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(v)))return a.msg("选择的视频中包含不支持的格式"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(h||"mp3|wav|mid")+")$","i").test(escape(v)))return a.msg("选择的音频中包含不支持的格式"),r.value="";break;default:if(layui.each(v,function(e,t){RegExp("\\w\\.("+(h||"jpg|png|gif|bmp|jpeg$")+")","i").test(escape(t))||(n=!0)}),n)return a.msg("选择的图片中包含不支持的格式"),r.value=""}if(a.fileLength=function(){var t=0,i=e||a.files||a.chooseFiles||r.files;return layui.each(i,function(){t++}),t}(),l.number&&a.fileLength>l.number)return a.msg("同时最多只能上传的数量为:"+l.number);if(l.size>0&&!(o.ie&&o.ie<10)){var F;if(layui.each(a.chooseFiles,function(e,t){if(t.size>1024*l.size){var i=l.size/1024;i=i>=1?i.toFixed(2)+"MB":l.size+"KB",r.value="",F=i}}),F)return a.msg("文件不能超过"+F)}y()}},p.prototype.reload=function(e){e=e||{},delete e.elem,delete e.bindAction;var i=this,e=i.config=t.extend({},i.config,a.config,e),n=e.elem.next();n.attr({name:e.name,accept:e.acceptMime,multiple:e.multiple})},p.prototype.events=function(){var e=this,i=e.config,a=function(t){e.chooseFiles={},layui.each(t,function(t,i){var n=(new Date).getTime();e.chooseFiles[n+"-"+t]=i})},l=function(t,n){var o=e.elemFile,a=t.length>1?t.length+"个文件":(t[0]||{}).name||o[0].value.match(/[^\/\\]+\..+/g)||[]||"";o.next().hasClass(s)&&o.next().remove(),e.upload(null,"choose"),e.isFile()||i.choose||o.after(''+a+"")};i.elem.off("upload.start").on("upload.start",function(){var o=t(this),a=o.attr("lay-data");if(a)try{a=new Function("return "+a)(),e.config=t.extend({},i,a)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+a)}e.config.item=o,e.elemFile[0].click()}),o.ie&&o.ie<10||i.elem.off("upload.over").on("upload.over",function(){var e=t(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=t(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,o){var r=t(this),u=o.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),a(u),i.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var t=this.files||[];a(t),i.auto?e.upload():l(t)}),i.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),i.elem.data("haveEvents")||(e.elemFile.on("change",function(){t(this).trigger("upload.change")}),i.elem.on("click",function(){e.isFile()||t(this).trigger("upload.start")}),i.drag&&i.elem.on("dragover",function(e){e.preventDefault(),t(this).trigger("upload.over")}).on("dragleave",function(e){t(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),t(this).trigger("upload.drop",e)}),i.bindAction.on("click",function(){t(this).trigger("upload.action")}),i.elem.data("haveEvents",!0))},a.render=function(e){var t=new p(e);return l.call(t)},e(r,a)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/util.js b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/util.js new file mode 100644 index 0000000..fdc1ec2 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/lay/modules/util.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var t=layui.$,i={fixbar:function(e){var i,n,a="layui-fixbar",o="layui-fixbar-top",r=t(document),l=t("body");e=t.extend({showHeight:200},e),e.bar1=e.bar1===!0?"":e.bar1,e.bar2=e.bar2===!0?"":e.bar2,e.bgcolor=e.bgcolor?"background-color:"+e.bgcolor:"";var c=[e.bar1,e.bar2,""],u=t(['
                ',e.bar1?'
              • '+c[0]+"
              • ":"",e.bar2?'
              • '+c[1]+"
              • ":"",'
              • '+c[2]+"
              • ","
              "].join("")),g=u.find("."+o),s=function(){var t=r.scrollTop();t>=e.showHeight?i||(g.show(),i=1):i&&(g.hide(),i=0)};t("."+a)[0]||("object"==typeof e.css&&u.css(e.css),l.append(u),s(),u.find("li").on("click",function(){var i=t(this),n=i.attr("lay-type");"top"===n&&t("html,body").animate({scrollTop:0},200),e.click&&e.click.call(this,n)}),r.on("scroll",function(){clearTimeout(n),n=setTimeout(function(){s()},100)}))},countdown:function(e,t,i){var n=this,a="function"==typeof t,o=new Date(e).getTime(),r=new Date(!t||a?(new Date).getTime():t).getTime(),l=o-r,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];a&&(i=t);var u=setTimeout(function(){n.countdown(e,r+1e3,i)},1e3);return i&&i(l>0?c:[0,0,0,0],t,u),l<=0&&clearTimeout(u),u},timeAgo:function(e,t){var i=this,n=[[],[]],a=(new Date).getTime()-new Date(e).getTime();return a>26784e5?(a=new Date(e),n[0][0]=i.digit(a.getFullYear(),4),n[0][1]=i.digit(a.getMonth()+1),n[0][2]=i.digit(a.getDate()),t||(n[1][0]=i.digit(a.getHours()),n[1][1]=i.digit(a.getMinutes()),n[1][2]=i.digit(a.getSeconds())),n[0].join("-")+" "+n[1].join(":")):a>=864e5?(a/1e3/60/60/24|0)+"天前":a>=36e5?(a/1e3/60/60|0)+"小时前":a>=18e4?(a/1e3/60|0)+"分钟前":a<0?"未来":"刚刚"},digit:function(e,t){var i="";e=String(e),t=t||2;for(var n=e.length;n/g,">").replace(/'/g,"'").replace(/"/g,""")},event:function(e,n,a){var o=t("body");return a=a||"click",n=i.event[e]=t.extend(!0,i.event[e],n)||{},i.event.UTIL_EVENT_CALLBACK=i.event.UTIL_EVENT_CALLBACK||{},o.off(a,"*["+e+"]",i.event.UTIL_EVENT_CALLBACK[e]),i.event.UTIL_EVENT_CALLBACK[e]=function(){var i=t(this),a=i.attr(e);"function"==typeof n[a]&&n[a].call(this,i)},o.on(a,"*["+e+"]",i.event.UTIL_EVENT_CALLBACK[e]),n}};!function(e,t,i){"$:nomunge";function n(){a=t[l](function(){o.each(function(){var t=e(this),i=t.width(),n=t.height(),a=e.data(this,u);(i!==a.w||n!==a.h)&&t.trigger(c,[a.w=i,a.h=n])}),n()},r[g])}var a,o=e([]),r=e.resize=e.extend(e.resize,{}),l="setTimeout",c="resize",u=c+"-special-event",g="delay",s="throttleWindow";r[g]=250,r[s]=!0,e.event.special[c]={setup:function(){if(!r[s]&&this[l])return!1;var t=e(this);o=o.add(t),e.data(this,u,{w:t.width(),h:t.height()}),1===o.length&&n()},teardown:function(){if(!r[s]&&this[l])return!1;var t=e(this);o=o.not(t),t.removeData(u),o.length||clearTimeout(a)},add:function(t){function n(t,n,o){var r=e(this),l=e.data(this,u)||{};l.w=n!==i?n:r.width(),l.h=o!==i?o:r.height(),a.apply(this,arguments)}if(!r[s]&&this[l])return!1;var a;return e.isFunction(t)?(a=t,n):(a=t.handler,void(t.handler=n))}}}(t,window),e("util",i)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/layui.all.js b/AdminSrc/AdminHost/wwwroot/admin/layui/layui.all.js new file mode 100644 index 0000000..af3355c --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/layui.all.js @@ -0,0 +1,5 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;!function(e){"use strict";var t=document,n={modules:{},status:{},timeout:10,event:{}},r=function(){this.v="2.5.6"},o=function(){var e=t.currentScript?t.currentScript.src:function(){for(var e,n=t.scripts,r=n.length-1,o=r;o>0;o--)if("interactive"===n[o].readyState){e=n[o].src;break}return e||n[r].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),a=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},i="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),u={layer:"modules/layer",laydate:"modules/laydate",laypage:"modules/laypage",laytpl:"modules/laytpl",layim:"modules/layim",layedit:"modules/layedit",form:"modules/form",upload:"modules/upload",transfer:"modules/transfer",tree:"modules/tree",table:"modules/table",element:"modules/element",rate:"modules/rate",colorpicker:"modules/colorpicker",slider:"modules/slider",carousel:"modules/carousel",flow:"modules/flow",util:"modules/util",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"../layui.all"};r.prototype.cache=n,r.prototype.define=function(e,t){var r=this,o="function"==typeof e,a=function(){var e=function(e,t){layui[e]=t,n.status[e]=!0};return"function"==typeof t&&t(function(r,o){e(r,o),n.callback[r]=function(){t(e)}}),this};return o&&(t=e,e=[]),!layui["layui.all"]&&layui["layui.mobile"]?a.call(r):(r.use(e,a),r)},r.prototype.use=function(e,r,l){function c(e,t){var r="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||r.test((e.currentTarget||e.srcElement).readyState))&&(n.modules[d]=t,y.removeChild(h),function o(){return++m>1e3*n.timeout/4?a(d+" is not a valid module"):void(n.status[d]?s():setTimeout(o,4))}())}function s(){l.push(layui[d]),e.length>1?p.use(e.slice(1),r,l):"function"==typeof r&&r.apply(layui,l)}var p=this,f=n.dir=n.dir?n.dir:o,y=t.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(p.each(e,function(t,n){"jquery"===n&&e.splice(t,1)}),layui.jquery=layui.$=jQuery);var d=e[0],m=0;if(l=l||[],n.host=n.host||(f.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&u[d]||!layui["layui.all"]&&layui["layui.mobile"]&&u[d])return s(),p;var v=(u[d]?f+"lay/":/^\{\/\}/.test(p.modules[d])?"":n.base||"")+(p.modules[d]||d)+".js";if(v=v.replace(/^\{\/\}/,""),!n.modules[d]&&layui[d]&&(n.modules[d]=v),n.modules[d])!function g(){return++m>1e3*n.timeout/4?a(d+" is not a valid module"):void("string"==typeof n.modules[d]&&n.status[d]?s():setTimeout(g,4))}();else{var h=t.createElement("script");h.async=!0,h.charset="utf-8",h.src=v+function(){var e=n.version===!0?n.v||(new Date).getTime():n.version||"";return e?"?v="+e:""}(),y.appendChild(h),!h.attachEvent||h.attachEvent.toString&&h.attachEvent.toString().indexOf("[native code")<0||i?h.addEventListener("load",function(e){c(e,v)},!1):h.attachEvent("onreadystatechange",function(e){c(e,v)}),n.modules[d]=v}return p},r.prototype.getStyle=function(t,n){var r=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return r[r.getPropertyValue?"getPropertyValue":"getAttribute"](n)},r.prototype.link=function(e,r,o){var i=this,u=t.createElement("link"),l=t.getElementsByTagName("head")[0];"string"==typeof r&&(o=r);var c=(o||e).replace(/\.|\//g,""),s=u.id="layuicss-"+c,p=0;return u.rel="stylesheet",u.href=e+(n.debug?"?v="+(new Date).getTime():""),u.media="all",t.getElementById(s)||l.appendChild(u),"function"!=typeof r?i:(function f(){return++p>1e3*n.timeout/100?a(e+" timeout"):void(1989===parseInt(i.getStyle(t.getElementById(s),"width"))?function(){r()}():setTimeout(f,100))}(),i)},n.callback={},r.prototype.factory=function(e){if(layui[e])return"function"==typeof n.callback[e]?n.callback[e]:null},r.prototype.addcss=function(e,t,r){return layui.link(n.dir+"css/"+e,t,r)},r.prototype.img=function(e,t,n){var r=new Image;return r.src=e,r.complete?t(r):(r.onload=function(){r.onload=null,"function"==typeof t&&t(r)},void(r.onerror=function(e){r.onerror=null,"function"==typeof n&&n(e)}))},r.prototype.config=function(e){e=e||{};for(var t in e)n[t]=e[t];return this},r.prototype.modules=function(){var e={};for(var t in u)e[t]=u[t];return e}(),r.prototype.extend=function(e){var t=this;e=e||{};for(var n in e)t[n]||t.modules[n]?a("模块名 "+n+" 已被占用"):t.modules[n]=e[n];return t},r.prototype.router=function(e){var t=this,e=e||location.hash,n={path:[],search:{},hash:(e.match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(e)?(e=e.replace(/^#\//,""),n.href="/"+e,e=e.replace(/([^#])(#.*$)/,"$1").split("/")||[],t.each(e,function(e,t){/^\w+=/.test(t)?function(){t=t.split("="),n.search[t[0]]=t[1]}():n.path.push(t)}),n):n},r.prototype.url=function(e){var t=this,n={pathname:function(){var t=e?function(){var t=(e.match(/\.[^.]+?\/.+/)||[])[0]||"";return t.replace(/^[^\/]+/,"").replace(/\?.+/,"")}():location.pathname;return t.replace(/^\//,"").split("/")}(),search:function(){var n={},r=(e?function(){var t=(e.match(/\?.+/)||[])[0]||"";return t.replace(/\#.+/,"")}():location.search).replace(/^\?+/,"").split("&");return t.each(r,function(e,t){var r=t.indexOf("="),o=function(){return r<0?t.substr(0,t.length):0!==r&&t.substr(0,r)}();o&&(n[o]=r>0?t.substr(r+1):null)}),n}(),hash:t.router(function(){return e?(e.match(/#.+/)||[])[0]||"":location.hash}())};return n},r.prototype.data=function(t,n,r){if(t=t||"layui",r=r||localStorage,e.JSON&&e.JSON.parse){if(null===n)return delete r[t];n="object"==typeof n?n:{key:n};try{var o=JSON.parse(r[t])}catch(a){var o={}}return"value"in n&&(o[n.key]=n.value),n.remove&&delete o[n.key],r[t]=JSON.stringify(o),n.key?o[n.key]:o}},r.prototype.sessionData=function(e,t){return this.data(e,t,sessionStorage)},r.prototype.device=function(t){var n=navigator.userAgent.toLowerCase(),r=function(e){var t=new RegExp(e+"/([^\\s\\_\\-]+)");return e=(n.match(t)||[])[1],e||!1},o={os:function(){return/windows/.test(n)?"windows":/linux/.test(n)?"linux":/iphone|ipod|ipad|ios/.test(n)?"ios":/mac/.test(n)?"mac":void 0}(),ie:function(){return!!(e.ActiveXObject||"ActiveXObject"in e)&&((n.match(/msie\s(\d+)/)||[])[1]||"11")}(),weixin:r("micromessenger")};return t&&!o[t]&&(o[t]=r(t)),o.android=/android/.test(n),o.ios="ios"===o.os,o.mobile=!(!o.android&&!o.ios),o},r.prototype.hint=function(){return{error:a}},r.prototype.each=function(e,t){var n,r=this;if("function"!=typeof t)return r;if(e=e||[],e.constructor===Object){for(n in e)if(t.call(e[n],n,e[n]))break}else for(n=0;na?1:o/g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)});layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?''+a.prev+"":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push(''+(a.first||1)+"");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r2&&e.push('…');r<=u;r++)r===a.curr?e.push('"+r+""):e.push(''+r+"");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1…'),0!==t&&e.push(''+(a.last||a.pages)+"")),e.join("")}(),next:function(){return a.next?''+a.next+"":""}(),count:'共 '+a.count+" 条",limit:function(){var e=['"}(),refresh:['','',""].join(""),skip:function(){return['到第','','页',""].join("")}()};return['
              ',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"
              "].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;oi.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){a.target=a.srcElement,t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)});!function(){"use strict";var e=window.layui&&layui.define,t={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,n=t.length-1,a=n;a>0;a--)if("interactive"===t[a].readyState){e=t[a].src;break}return e||t[n].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),getStyle:function(e,t){var n=e.currentStyle?e.currentStyle:window.getComputedStyle(e,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](t)},link:function(e,a,i){if(n.path){var r=document.getElementsByTagName("head")[0],o=document.createElement("link");"string"==typeof a&&(i=a);var s=(i||e).replace(/\.|\//g,""),l="layuicss-"+s,d=0;o.rel="stylesheet",o.href=n.path+e,o.id=l,document.getElementById(l)||r.appendChild(o),"function"==typeof a&&!function c(){return++d>80?window.console&&console.error("laydate.css: Invalid"):void(1989===parseInt(t.getStyle(document.getElementById(l),"width"))?a():setTimeout(c,100))}()}}},n={v:"5.0.9",config:{},index:window.laydate&&window.laydate.v?1e5:0,path:t.getPath,set:function(e){var t=this;return t.config=w.extend({},t.config,e),t},ready:function(a){var i="laydate",r="",o=(e?"modules/laydate/":"theme/")+"default/laydate.css?v="+n.v+r;return e?layui.addcss(o,a,i):t.link(o,a,i),this}},a=function(){var e=this;return{hint:function(t){e.hint.call(e,t)},config:e.config}},i="laydate",r=".layui-laydate",o="layui-this",s="laydate-disabled",l="开始日期超出了结束日期
              建议重新选择",d=[100,2e5],c="layui-laydate-static",m="layui-laydate-list",u="laydate-selected",h="layui-laydate-hint",y="laydate-day-prev",f="laydate-day-next",p="layui-laydate-footer",g=".laydate-btns-confirm",v="laydate-time-text",D=".laydate-btns-time",T=function(e){var t=this;t.index=++n.index,t.config=w.extend({},t.config,n.config,e),n.ready(function(){t.init()})},w=function(e){return new C(e)},C=function(e){for(var t=0,n="object"==typeof e?[e]:(this.selector=e,document.querySelectorAll(e||null));t0)return n[0].getAttribute(e)}():n.each(function(n,a){a.setAttribute(e,t)})},C.prototype.removeAttr=function(e){return this.each(function(t,n){n.removeAttribute(e)})},C.prototype.html=function(e){return this.each(function(t,n){n.innerHTML=e})},C.prototype.val=function(e){return this.each(function(t,n){n.value=e})},C.prototype.append=function(e){return this.each(function(t,n){"object"==typeof e?n.appendChild(e):n.innerHTML=n.innerHTML+e})},C.prototype.remove=function(e){return this.each(function(t,n){e?n.removeChild(e):n.parentNode.removeChild(n)})},C.prototype.on=function(e,t){return this.each(function(n,a){a.attachEvent?a.attachEvent("on"+e,function(e){e.target=e.srcElement,t.call(a,e)}):a.addEventListener(e,t,!1)})},C.prototype.off=function(e,t){return this.each(function(n,a){a.detachEvent?a.detachEvent("on"+e,t):a.removeEventListener(e,t,!1)})},T.isLeapYear=function(e){return e%4===0&&e%100!==0||e%400===0},T.prototype.config={type:"date",range:!1,format:"yyyy-MM-dd",value:null,isInitValue:!0,min:"1900-1-1",max:"2099-12-31",trigger:"focus",show:!1,showBottom:!0,btns:["clear","now","confirm"],lang:"cn",theme:"default",position:null,calendar:!1,mark:{},zIndex:null,done:null,change:null},T.prototype.lang=function(){var e=this,t=e.config,n={cn:{weeks:["日","一","二","三","四","五","六"],time:["时","分","秒"],timeTips:"选择时间",startTime:"开始时间",endTime:"结束时间",dateTips:"返回日期",month:["一","二","三","四","五","六","七","八","九","十","十一","十二"],tools:{confirm:"确定",clear:"清空",now:"现在"}},en:{weeks:["Su","Mo","Tu","We","Th","Fr","Sa"],time:["Hours","Minutes","Seconds"],timeTips:"Select Time",startTime:"Start Time",endTime:"End Time",dateTips:"Select Date",month:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],tools:{confirm:"Confirm",clear:"Clear",now:"Now"}}};return n[t.lang]||n.cn},T.prototype.init=function(){var e=this,t=e.config,n="yyyy|y|MM|M|dd|d|HH|H|mm|m|ss|s",a="static"===t.position,i={year:"yyyy",month:"yyyy-MM",date:"yyyy-MM-dd",time:"HH:mm:ss",datetime:"yyyy-MM-dd HH:mm:ss"};t.elem=w(t.elem),t.eventElem=w(t.eventElem),t.elem[0]&&(t.range===!0&&(t.range="-"),t.format===i.date&&(t.format=i[t.type]),e.format=t.format.match(new RegExp(n+"|.","g"))||[],e.EXP_IF="",e.EXP_SPLIT="",w.each(e.format,function(t,a){var i=new RegExp(n).test(a)?"\\d{"+function(){return new RegExp(n).test(e.format[0===t?t+1:t-1]||"")?/^yyyy|y$/.test(a)?4:a.length:/^yyyy$/.test(a)?"1,4":/^y$/.test(a)?"1,308":"1,2"}()+"}":"\\"+a;e.EXP_IF=e.EXP_IF+i,e.EXP_SPLIT=e.EXP_SPLIT+"("+i+")"}),e.EXP_IF=new RegExp("^"+(t.range?e.EXP_IF+"\\s\\"+t.range+"\\s"+e.EXP_IF:e.EXP_IF)+"$"),e.EXP_SPLIT=new RegExp("^"+e.EXP_SPLIT+"$",""),e.isInput(t.elem[0])||"focus"===t.trigger&&(t.trigger="click"),t.elem.attr("lay-key")||(t.elem.attr("lay-key",e.index),t.eventElem.attr("lay-key",e.index)),t.mark=w.extend({},t.calendar&&"cn"===t.lang?{"0-1-1":"元旦","0-2-14":"情人","0-3-8":"妇女","0-3-12":"植树","0-4-1":"愚人","0-5-1":"劳动","0-5-4":"青年","0-6-1":"儿童","0-9-10":"教师","0-9-18":"国耻","0-10-1":"国庆","0-12-25":"圣诞"}:{},t.mark),w.each(["min","max"],function(e,n){var a=[],i=[];if("number"==typeof t[n]){var r=t[n],o=(new Date).getTime(),s=864e5,l=new Date(r?r0)return!0;var a=w.elem("div",{"class":"layui-laydate-header"}),i=[function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-y"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-m"});return e.innerHTML="",e}(),function(){var e=w.elem("div",{"class":"laydate-set-ym"}),t=w.elem("span"),n=w.elem("span");return e.appendChild(t),e.appendChild(n),e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-m"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-y"});return e.innerHTML="",e}()],d=w.elem("div",{"class":"layui-laydate-content"}),c=w.elem("table"),m=w.elem("thead"),u=w.elem("tr");w.each(i,function(e,t){a.appendChild(t)}),m.appendChild(u),w.each(new Array(6),function(e){var t=c.insertRow(0);w.each(new Array(7),function(a){if(0===e){var i=w.elem("th");i.innerHTML=n.weeks[a],u.appendChild(i)}t.insertCell(a)})}),c.insertBefore(m,c.children[0]),d.appendChild(c),r[e]=w.elem("div",{"class":"layui-laydate-main laydate-main-list-"+e}),r[e].appendChild(a),r[e].appendChild(d),o.push(i),s.push(d),l.push(c)}),w(d).html(function(){var e=[],i=[];return"datetime"===t.type&&e.push(''+n.timeTips+""),w.each(t.btns,function(e,r){var o=n.tools[r]||"btn";t.range&&"now"===r||(a&&"clear"===r&&(o="cn"===t.lang?"重置":"Reset"),i.push(''+o+""))}),e.push('"),e.join("")}()),w.each(r,function(e,t){i.appendChild(t)}),t.showBottom&&i.appendChild(d),/^#/.test(t.theme)){var m=w.elem("style"),u=["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} .layui-this{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,e.elemID).replace(/{{theme}}/g,t.theme);"styleSheet"in m?(m.setAttribute("type","text/css"),m.styleSheet.cssText=u):m.innerHTML=u,w(i).addClass("laydate-theme-molv"),i.appendChild(m)}e.remove(T.thisElemDate),a?t.elem.append(i):(document.body.appendChild(i),e.position()),e.checkDate().calendar(),e.changeEvent(),T.thisElemDate=e.elemID,"function"==typeof t.ready&&t.ready(w.extend({},t.dateTime,{month:t.dateTime.month+1}))},T.prototype.remove=function(e){var t=this,n=(t.config,w("#"+(e||t.elemID)));return n.hasClass(c)||t.checkDate(function(){n.remove()}),t},T.prototype.position=function(){var e=this,t=e.config,n=e.bindElem||t.elem[0],a=n.getBoundingClientRect(),i=e.elem.offsetWidth,r=e.elem.offsetHeight,o=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},s=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},l=5,d=a.left,c=a.bottom;d+i+l>s("width")&&(d=s("width")-i-l),c+r+l>s()&&(c=a.top>r?a.top-r:s()-r,c-=2*l),t.position&&(e.elem.style.position=t.position),e.elem.style.left=d+("fixed"===t.position?0:o(1))+"px",e.elem.style.top=c+("fixed"===t.position?0:o())+"px"},T.prototype.hint=function(e){var t=this,n=(t.config,w.elem("div",{"class":h}));t.elem&&(n.innerHTML=e||"",w(t.elem).find("."+h).remove(),t.elem.appendChild(n),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){w(t.elem).find("."+h).remove()},3e3))},T.prototype.getAsYM=function(e,t,n){return n?t--:t++,t<0&&(t=11,e--),t>11&&(t=0,e++),[e,t]},T.prototype.systemDate=function(e){var t=e||new Date;return{year:t.getFullYear(),month:t.getMonth(),date:t.getDate(),hours:e?e.getHours():0,minutes:e?e.getMinutes():0,seconds:e?e.getSeconds():0}},T.prototype.checkDate=function(e){var t,a,i=this,r=(new Date,i.config),o=r.dateTime=r.dateTime||i.systemDate(),s=i.bindElem||r.elem[0],l=(i.isInput(s)?"val":"html",i.isInput(s)?s.value:"static"===r.position?"":s.innerHTML),c=function(e){e.year>d[1]&&(e.year=d[1],a=!0),e.month>11&&(e.month=11,a=!0),e.hours>23&&(e.hours=0,a=!0),e.minutes>59&&(e.minutes=0,e.hours++,a=!0),e.seconds>59&&(e.seconds=0,e.minutes++,a=!0),t=n.getEndDate(e.month+1,e.year),e.date>t&&(e.date=t,a=!0)},m=function(e,t,n){var o=["startTime","endTime"];t=(t.match(i.EXP_SPLIT)||[]).slice(1),n=n||0,r.range&&(i[o[n]]=i[o[n]]||{}),w.each(i.format,function(s,l){var c=parseFloat(t[s]);t[s].length必须遵循下述格式:
              "+(r.range?r.format+" "+r.range+" "+r.format:r.format)+"
              已为你重置"),a=!0):l&&l.constructor===Date?r.dateTime=i.systemDate(l):(r.dateTime=i.systemDate(),delete i.startState,delete i.endState,delete i.startDate,delete i.endDate,delete i.startTime,delete i.endTime),c(o),a&&l&&i.setValue(r.range?i.endDate?i.parse():"":i.parse()),e&&e(),i)},T.prototype.mark=function(e,t){var n,a=this,i=a.config;return w.each(i.mark,function(e,a){var i=e.split("-");i[0]!=t[0]&&0!=i[0]||i[1]!=t[1]&&0!=i[1]||i[2]!=t[2]||(n=a||t[2])}),n&&e.html(''+n+""),a},T.prototype.limit=function(e,t,n,a){var i,r=this,o=r.config,l={},d=o[n>41?"endDate":"dateTime"],c=w.extend({},d,t||{});return w.each({now:c,min:o.min,max:o.max},function(e,t){l[e]=r.newDate(w.extend({year:t.year,month:t.month,date:t.date},function(){var e={};return w.each(a,function(n,a){e[a]=t[a]}),e}())).getTime()}),i=l.nowl.max,e&&e[i?"addClass":"removeClass"](s),i},T.prototype.calendar=function(e){var t,a,i,r=this,s=r.config,l=e||s.dateTime,c=new Date,m=r.lang(),u="date"!==s.type&&"datetime"!==s.type,h=e?1:0,y=w(r.table[h]).find("td"),f=w(r.elemHeader[h][2]).find("span");if(l.yeard[1]&&(l.year=d[1],r.hint("最高只能支持到公元"+d[1]+"年")),r.firstDate||(r.firstDate=w.extend({},l)),c.setFullYear(l.year,l.month,1),t=c.getDay(),a=n.getEndDate(l.month||12,l.year),i=n.getEndDate(l.month+1,l.year),w.each(y,function(e,n){var d=[l.year,l.month],c=0;n=w(n),n.removeAttr("class"),e=t&&e=n.firstDate.year&&(r.month=a.max.month,r.date=a.max.date),n.limit(w(i),r,t),M++}),w(u[f?0:1]).attr("lay-ym",M-8+"-"+T[1]).html(b+p+" - "+(M-1+p))}else if("month"===e)w.each(new Array(12),function(e){var i=w.elem("li",{"lay-ym":e}),s={year:T[0],month:e};e+1==T[1]&&w(i).addClass(o),i.innerHTML=r.month[e]+(f?"月":""),d.appendChild(i),T[0]=n.firstDate.year&&(s.date=a.max.date),n.limit(w(i),s,t)}),w(u[f?0:1]).attr("lay-ym",T[0]+"-"+T[1]).html(T[0]+p);else if("time"===e){var E=function(){w(d).find("ol").each(function(e,a){w(a).find("li").each(function(a,i){n.limit(w(i),[{hours:a},{hours:n[x].hours,minutes:a},{hours:n[x].hours,minutes:n[x].minutes,seconds:a}][e],t,[["hours"],["hours","minutes"],["hours","minutes","seconds"]][e])})}),a.range||n.limit(w(n.footer).find(g),n[x],0,["hours","minutes","seconds"])};a.range?n[x]||(n[x]={hours:0,minutes:0,seconds:0}):n[x]=i,w.each([24,60,60],function(e,t){var a=w.elem("li"),i=["

              "+r.time[e]+"

                "];w.each(new Array(t),function(t){i.push(""+w.digit(t,2)+"")}),a.innerHTML=i.join("")+"
              ",d.appendChild(a)}),E()}if(y&&h.removeChild(y),h.appendChild(d),"year"===e||"month"===e)w(n.elemMain[t]).addClass("laydate-ym-show"),w(d).find("li").on("click",function(){var r=0|w(this).attr("lay-ym");if(!w(this).hasClass(s)){if(0===t)i[e]=r,l&&(n.startDate[e]=r),n.limit(w(n.footer).find(g),null,0);else if(l)n.endDate[e]=r;else{var c="year"===e?n.getAsYM(r,T[1]-1,"sub"):n.getAsYM(T[0],r,"sub");w.extend(i,{year:c[0],month:c[1]})}"year"===a.type||"month"===a.type?(w(d).find("."+o).removeClass(o),w(this).addClass(o),"month"===a.type&&"year"===e&&(n.listYM[t][0]=r,l&&(n[["startDate","endDate"][t]].year=r),n.list("month",t))):(n.checkDate("limit").calendar(),n.closeList()),n.setBtnStatus(),a.range||n.done(null,"change"),w(n.footer).find(D).removeClass(s)}});else{var S=w.elem("span",{"class":v}),k=function(){w(d).find("ol").each(function(e){var t=this,a=w(t).find("li");t.scrollTop=30*(n[x][C[e]]-2),t.scrollTop<=0&&a.each(function(e,n){if(!w(this).hasClass(s))return t.scrollTop=30*(e-2),!0})})},H=w(c[2]).find("."+v);k(),S.innerHTML=a.range?[r.startTime,r.endTime][t]:r.timeTips,w(n.elemMain[t]).addClass("laydate-time-show"),H[0]&&H.remove(),c[2].appendChild(S),w(d).find("ol").each(function(e){var t=this;w(t).find("li").on("click",function(){var r=0|this.innerHTML;w(this).hasClass(s)||(a.range?n[x][C[e]]=r:i[C[e]]=r,w(t).find("."+o).removeClass(o),w(this).addClass(o),E(),k(),(n.endDate||"time"===a.type)&&n.done(null,"change"),n.setBtnStatus())})})}return n},T.prototype.listYM=[],T.prototype.closeList=function(){var e=this;e.config;w.each(e.elemCont,function(t,n){w(this).find("."+m).remove(),w(e.elemMain[t]).removeClass("laydate-ym-show laydate-time-show")}),w(e.elem).find("."+v).remove()},T.prototype.setBtnStatus=function(e,t,n){var a,i=this,r=i.config,o=w(i.footer).find(g),d=r.range&&"date"!==r.type&&"time"!==r.type;d&&(t=t||i.startDate,n=n||i.endDate,a=i.newDate(t).getTime()>i.newDate(n).getTime(),i.limit(null,t)||i.limit(null,n)?o.addClass(s):o[a?"addClass":"removeClass"](s),e&&a&&i.hint("string"==typeof e?l.replace(/日期/g,e):l))},T.prototype.parse=function(e,t){var n=this,a=n.config,i=t||(e?w.extend({},n.endDate,n.endTime):a.range?w.extend({},n.startDate,n.startTime):a.dateTime),r=n.format.concat();return w.each(r,function(e,t){/yyyy|y/.test(t)?r[e]=w.digit(i.year,t.length):/MM|M/.test(t)?r[e]=w.digit(i.month+1,t.length):/dd|d/.test(t)?r[e]=w.digit(i.date,t.length):/HH|H/.test(t)?r[e]=w.digit(i.hours,t.length):/mm|m/.test(t)?r[e]=w.digit(i.minutes,t.length):/ss|s/.test(t)&&(r[e]=w.digit(i.seconds,t.length))}),a.range&&!e?r.join("")+" "+a.range+" "+n.parse(1):r.join("")},T.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},T.prototype.setValue=function(e){var t=this,n=t.config,a=t.bindElem||n.elem[0],i=t.isInput(a)?"val":"html";return"static"===n.position||w(a)[i](e||""),this},T.prototype.stampRange=function(){var e,t,n=this,a=n.config,i=w(n.elem).find("td");if(a.range&&!n.endDate&&w(n.footer).find(g).addClass(s),n.endDate)return e=n.newDate({year:n.startDate.year,month:n.startDate.month,date:n.startDate.date}).getTime(),t=n.newDate({year:n.endDate.year,month:n.endDate.month,date:n.endDate.date}).getTime(),e>t?n.hint(l):void w.each(i,function(a,i){var r=w(i).attr("lay-ymd").split("-"),s=n.newDate({year:r[0],month:r[1]-1,date:r[2]}).getTime();w(i).removeClass(u+" "+o),s!==e&&s!==t||w(i).addClass(w(i).hasClass(y)||w(i).hasClass(f)?u:o),s>e&&s0&&t-1 in e)}function r(e,t,n){if(pe.isFunction(t))return pe.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return pe.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(Ce.test(t))return pe.filter(t,e,n);t=pe.filter(t,e)}return pe.grep(e,function(e){return pe.inArray(e,t)>-1!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t={};return pe.each(e.match(De)||[],function(e,n){t[n]=!0}),t}function a(){re.addEventListener?(re.removeEventListener("DOMContentLoaded",s),e.removeEventListener("load",s)):(re.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(re.addEventListener||"load"===e.event.type||"complete"===re.readyState)&&(a(),pe.ready())}function u(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(_e,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:qe.test(n)?pe.parseJSON(n):n)}catch(i){}pe.data(e,t,n)}else n=void 0}return n}function l(e){var t;for(t in e)if(("data"!==t||!pe.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,r){if(He(e)){var i,o,a=pe.expando,s=e.nodeType,u=s?pe.cache:e,l=s?e[a]:e[a]&&a;if(l&&u[l]&&(r||u[l].data)||void 0!==n||"string"!=typeof t)return l||(l=s?e[a]=ne.pop()||pe.guid++:a),u[l]||(u[l]=s?{}:{toJSON:pe.noop}),"object"!=typeof t&&"function"!=typeof t||(r?u[l]=pe.extend(u[l],t):u[l].data=pe.extend(u[l].data,t)),o=u[l],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[pe.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[pe.camelCase(t)])):i=o,i}}function f(e,t,n){if(He(e)){var r,i,o=e.nodeType,a=o?pe.cache:e,s=o?e[pe.expando]:pe.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){pe.isArray(t)?t=t.concat(pe.map(t,pe.camelCase)):t in r?t=[t]:(t=pe.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!l(r):!pe.isEmptyObject(r))return}(n||(delete a[s].data,l(a[s])))&&(o?pe.cleanData([e],!0):fe.deleteExpando||a!=a.window?delete a[s]:a[s]=void 0)}}}function d(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:function(){return pe.css(e,t,"")},u=s(),l=n&&n[3]||(pe.cssNumber[t]?"":"px"),c=(pe.cssNumber[t]||"px"!==l&&+u)&&Me.exec(pe.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do o=o||".5",c/=o,pe.style(e,t,c+l);while(o!==(o=s()/u)&&1!==o&&--a)}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}function p(e){var t=ze.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function h(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||pe.nodeName(r,t)?o.push(r):pe.merge(o,h(r,t));return void 0===t||t&&pe.nodeName(e,t)?pe.merge([e],o):o}function g(e,t){for(var n,r=0;null!=(n=e[r]);r++)pe._data(n,"globalEval",!t||pe._data(t[r],"globalEval"))}function m(e){Be.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,y=p(t),v=[],x=0;x"!==f[1]||Ve.test(a)?0:u:u.firstChild,o=a&&a.childNodes.length;o--;)pe.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(pe.merge(v,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=y.lastChild}else v.push(t.createTextNode(a));for(u&&y.removeChild(u),fe.appendChecked||pe.grep(h(v,"input"),m),x=0;a=v[x++];)if(r&&pe.inArray(a,r)>-1)i&&i.push(a);else if(s=pe.contains(a.ownerDocument,a),u=h(y.appendChild(a),"script"),s&&g(u),n)for(o=0;a=u[o++];)Ie.test(a.type||"")&&n.push(a);return u=null,y}function v(){return!0}function x(){return!1}function b(){try{return re.activeElement}catch(e){}}function w(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)w(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=x;else if(!i)return e;return 1===o&&(a=i,i=function(e){return pe().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=pe.guid++)),e.each(function(){pe.event.add(this,t,i,r,n)})}function T(e,t){return pe.nodeName(e,"table")&&pe.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function C(e){return e.type=(null!==pe.find.attr(e,"type"))+"/"+e.type,e}function E(e){var t=it.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function N(e,t){if(1===t.nodeType&&pe.hasData(e)){var n,r,i,o=pe._data(e),a=pe._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;r1&&"string"==typeof p&&!fe.checkClone&&rt.test(p))return e.each(function(i){var o=e.eq(i);g&&(t[0]=p.call(this,i,o.html())),S(o,t,n,r)});if(f&&(l=y(t,e[0].ownerDocument,!1,e,r),i=l.firstChild,1===l.childNodes.length&&(l=i),i||r)){for(s=pe.map(h(l,"script"),C),a=s.length;c")).appendTo(t.documentElement),t=(ut[0].contentWindow||ut[0].contentDocument).document,t.write(),t.close(),n=D(e,t),ut.detach()),lt[e]=n),n}function L(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function H(e){if(e in Et)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=Ct.length;n--;)if(e=Ct[n]+t,e in Et)return e}function q(e,t){for(var n,r,i,o=[],a=0,s=e.length;a=0&&n=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==pe.type(e)||e.nodeType||pe.isWindow(e))return!1;try{if(e.constructor&&!ce.call(e,"constructor")&&!ce.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(!fe.ownFirst)for(t in e)return ce.call(e,t);for(t in e);return void 0===t||ce.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ue[le.call(e)]||"object":typeof e},globalEval:function(t){t&&pe.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(ge,"ms-").replace(me,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var r,i=0;if(n(e))for(r=e.length;iT.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[P]=!0,e}function i(e){var t=H.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function d(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,n,r){for(var i=0,o=n.length;i-1&&(r[l]=!(a[l]=f))}}else x=m(x===a?x.splice(h,x.length):x),o?o(null,a,x,u):Q.apply(a,x)})}function v(e){for(var t,n,r,i=e.length,o=T.relative[e[0].type],a=o||T.relative[" "],s=o?1:0,u=p(function(e){return e===t},a,!0),l=p(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var i=!o&&(r||n!==A)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,i}];s1&&h(c),s>1&&d(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s0,o=e.length>0,a=function(r,a,s,u,l){var c,f,d,p=0,h="0",g=r&&[],y=[],v=A,x=r||o&&T.find.TAG("*",l),b=W+=null==v?1:Math.random()||.1,w=x.length;for(l&&(A=a===H||a||l);h!==w&&null!=(c=x[h]);h++){if(o&&c){for(f=0,a||c.ownerDocument===H||(L(c),s=!_);d=e[f++];)if(d(c,a||H,s)){u.push(c);break}l&&(W=b)}i&&((c=!d&&c)&&p--,r&&g.push(c))}if(p+=h,i&&h!==p){for(f=0;d=n[f++];)d(g,y,a,s);if(r){if(p>0)for(;h--;)g[h]||y[h]||(y[h]=G.call(u));y=m(y)}Q.apply(u,y),l&&!r&&y.length>0&&p+n.length>1&&t.uniqueSort(u)}return l&&(W=b,A=v),g};return i?r(a):a}var b,w,T,C,E,N,k,S,A,D,j,L,H,q,_,F,M,O,R,P="sizzle"+1*new Date,B=e.document,W=0,I=0,$=n(),z=n(),X=n(),U=function(e,t){return e===t&&(j=!0),0},V=1<<31,Y={}.hasOwnProperty,J=[],G=J.pop,K=J.push,Q=J.push,Z=J.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),ce=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),de=new RegExp("^"+re+"$"),pe={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ve=/[+~]/,xe=/'|\\/g,be=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),we=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Te=function(){L()};try{Q.apply(J=Z.call(B.childNodes),B.childNodes),J[B.childNodes.length].nodeType}catch(Ce){Q={apply:J.length?function(e,t){K.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},E=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},L=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:B;return r!==H&&9===r.nodeType&&r.documentElement?(H=r,q=H.documentElement,_=!E(H),(n=H.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Te,!1):n.attachEvent&&n.attachEvent("onunload",Te)),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(H.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=me.test(H.getElementsByClassName),w.getById=i(function(e){return q.appendChild(e).id=P,!H.getElementsByName||!H.getElementsByName(P).length}),w.getById?(T.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&_){var n=t.getElementById(e);return n?[n]:[]}},T.filter.ID=function(e){var t=e.replace(be,we);return function(e){return e.getAttribute("id")===t}}):(delete T.find.ID,T.filter.ID=function(e){var t=e.replace(be,we);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),T.find.TAG=w.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):w.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},T.find.CLASS=w.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&_)return t.getElementsByClassName(e)},M=[],F=[],(w.qsa=me.test(H.querySelectorAll))&&(i(function(e){q.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||F.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+P+"-]").length||F.push("~="),e.querySelectorAll(":checked").length||F.push(":checked"),e.querySelectorAll("a#"+P+"+*").length||F.push(".#.+[+~]")}),i(function(e){var t=H.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&F.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||F.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),F.push(",.*:")})),(w.matchesSelector=me.test(O=q.matches||q.webkitMatchesSelector||q.mozMatchesSelector||q.oMatchesSelector||q.msMatchesSelector))&&i(function(e){w.disconnectedMatch=O.call(e,"div"),O.call(e,"[s!='']:x"),M.push("!=",oe)}),F=F.length&&new RegExp(F.join("|")),M=M.length&&new RegExp(M.join("|")),t=me.test(q.compareDocumentPosition),R=t||me.test(q.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},U=t?function(e,t){if(e===t)return j=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!w.sortDetached&&t.compareDocumentPosition(e)===n?e===H||e.ownerDocument===B&&R(B,e)?-1:t===H||t.ownerDocument===B&&R(B,t)?1:D?ee(D,e)-ee(D,t):0:4&n?-1:1)}:function(e,t){if(e===t)return j=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,s=[e],u=[t];if(!i||!o)return e===H?-1:t===H?1:i?-1:o?1:D?ee(D,e)-ee(D,t):0;if(i===o)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]===B?-1:u[r]===B?1:0},H):H},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==H&&L(e),n=n.replace(ce,"='$1']"),w.matchesSelector&&_&&!X[n+" "]&&(!M||!M.test(n))&&(!F||!F.test(n)))try{var r=O.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,H,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==H&&L(e),R(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==H&&L(e);var n=T.attrHandle[t.toLowerCase()],r=n&&Y.call(T.attrHandle,t.toLowerCase())?n(e,t,!_):void 0;return void 0!==r?r:w.attributes||!_?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(j=!w.detectDuplicates,D=!w.sortStable&&e.slice(0),e.sort(U),j){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return D=null,e},C=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=C(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,we),e[3]=(e[3]||e[4]||e[5]||"").replace(be,we),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=N(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(be,we).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=$[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&$(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(ae," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s,x=!1;if(m){if(o){for(;g;){for(d=t;d=d[g];)if(s?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(d=m,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}), +l=c[e]||[],p=l[0]===W&&l[1],x=p&&l[2],d=p&&m.childNodes[p];d=++p&&d&&d[g]||(x=p=0)||h.pop();)if(1===d.nodeType&&++x&&d===t){c[e]=[W,p,x];break}}else if(v&&(d=t,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),l=c[e]||[],p=l[0]===W&&l[1],x=p),x===!1)for(;(d=++p&&d&&d[g]||(x=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==y:1!==d.nodeType)||!++x||(v&&(f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),c[e]=[W,x]),d!==t)););return x-=i,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var i,o=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[P]?o(n):o.length>1?(i=[e,e,"",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=ee(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=k(e.replace(se,"$1"));return i[P]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,we),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:r(function(e){return de.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(be,we).toLowerCase(),function(t){var n;do if(n=_?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===q},focus:function(e){return e===H.activeElement&&(!H.hasFocus||H.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(a=o[0]).type&&w.getById&&9===t.nodeType&&_&&T.relative[o[1].type]){if(t=(T.find.ID(a.matches[0].replace(be,we),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(a=o[i],!T.relative[s=a.type]);)if((u=T.find[s])&&(r=u(a.matches[0].replace(be,we),ve.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&d(o),!e)return Q.apply(n,r),n;break}}return(l||k(e,f))(r,t,!_,n,!t||ve.test(e)&&c(t.parentNode)||t),n},w.sortStable=P.split("").sort(U).join("")===P,w.detectDuplicates=!!j,L(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(H.createElement("div"))}),i(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);pe.find=ve,pe.expr=ve.selectors,pe.expr[":"]=pe.expr.pseudos,pe.uniqueSort=pe.unique=ve.uniqueSort,pe.text=ve.getText,pe.isXMLDoc=ve.isXML,pe.contains=ve.contains;var xe=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&pe(e).is(n))break;r.push(e)}return r},be=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},we=pe.expr.match.needsContext,Te=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Ce=/^.[^:#\[\.,]*$/;pe.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?pe.find.matchesSelector(r,e)?[r]:[]:pe.find.matches(e,pe.grep(t,function(e){return 1===e.nodeType}))},pe.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(pe(e).filter(function(){for(t=0;t1?pe.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&we.test(e)?pe(e):e||[],!1).length}});var Ee,Ne=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ke=pe.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||Ee,"string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:Ne.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof pe?t[0]:t,pe.merge(this,pe.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:re,!0)),Te.test(r[1])&&pe.isPlainObject(t))for(r in t)pe.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}if(i=re.getElementById(r[2]),i&&i.parentNode){if(i.id!==r[2])return Ee.find(e);this.length=1,this[0]=i}return this.context=re,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):pe.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(pe):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),pe.makeArray(e,this))};ke.prototype=pe.fn,Ee=pe(re);var Se=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};pe.fn.extend({has:function(e){var t,n=pe(e,this),r=n.length;return this.filter(function(){for(t=0;t-1:1===n.nodeType&&pe.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?pe.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?pe.inArray(this[0],pe(e)):pe.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(pe.uniqueSort(pe.merge(this.get(),pe(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),pe.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return xe(e,"parentNode")},parentsUntil:function(e,t,n){return xe(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return xe(e,"nextSibling")},prevAll:function(e){return xe(e,"previousSibling")},nextUntil:function(e,t,n){return xe(e,"nextSibling",n)},prevUntil:function(e,t,n){return xe(e,"previousSibling",n)},siblings:function(e){return be((e.parentNode||{}).firstChild,e)},children:function(e){return be(e.firstChild)},contents:function(e){return pe.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:pe.merge([],e.childNodes)}},function(e,t){pe.fn[e]=function(n,r){var i=pe.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=pe.filter(r,i)),this.length>1&&(Ae[e]||(i=pe.uniqueSort(i)),Se.test(e)&&(i=i.reverse())),this.pushStack(i)}});var De=/\S+/g;pe.Callbacks=function(e){e="string"==typeof e?o(e):pe.extend({},e);var t,n,r,i,a=[],s=[],u=-1,l=function(){for(i=e.once,r=t=!0;s.length;u=-1)for(n=s.shift();++u-1;)a.splice(n,1),n<=u&&u--}),this},has:function(e){return e?pe.inArray(e,a)>-1:a.length>0},empty:function(){return a&&(a=[]),this},disable:function(){return i=s=[],a=n="",this},disabled:function(){return!a},lock:function(){return i=!0,n||c.disable(),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},pe.extend({Deferred:function(e){var t=[["resolve","done",pe.Callbacks("once memory"),"resolved"],["reject","fail",pe.Callbacks("once memory"),"rejected"],["notify","progress",pe.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return pe.Deferred(function(n){pe.each(t,function(t,o){var a=pe.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&pe.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?pe.extend(e,r):r}},i={};return r.pipe=r.then,pe.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=ie.call(arguments),a=o.length,s=1!==a||e&&pe.isFunction(e.promise)?a:0,u=1===s?e:pe.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?ie.call(arguments):i,r===t?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(a>1)for(t=new Array(a),n=new Array(a),r=new Array(a);i0||(je.resolveWith(re,[pe]),pe.fn.triggerHandler&&(pe(re).triggerHandler("ready"),pe(re).off("ready"))))}}),pe.ready.promise=function(t){if(!je)if(je=pe.Deferred(),"complete"===re.readyState||"loading"!==re.readyState&&!re.documentElement.doScroll)e.setTimeout(pe.ready);else if(re.addEventListener)re.addEventListener("DOMContentLoaded",s),e.addEventListener("load",s);else{re.attachEvent("onreadystatechange",s),e.attachEvent("onload",s);var n=!1;try{n=null==e.frameElement&&re.documentElement}catch(r){}n&&n.doScroll&&!function i(){if(!pe.isReady){try{n.doScroll("left")}catch(t){return e.setTimeout(i,50)}a(),pe.ready()}}()}return je.promise(t)},pe.ready.promise();var Le;for(Le in pe(fe))break;fe.ownFirst="0"===Le,fe.inlineBlockNeedsLayout=!1,pe(function(){var e,t,n,r;n=re.getElementsByTagName("body")[0],n&&n.style&&(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",fe.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=re.createElement("div");fe.deleteExpando=!0;try{delete e.test}catch(t){fe.deleteExpando=!1}e=null}();var He=function(e){var t=pe.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||t!==!0&&e.getAttribute("classid")===t)},qe=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,_e=/([A-Z])/g;pe.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?pe.cache[e[pe.expando]]:e[pe.expando],!!e&&!l(e)},data:function(e,t,n){return c(e,t,n)},removeData:function(e,t){return f(e,t)},_data:function(e,t,n){return c(e,t,n,!0)},_removeData:function(e,t){return f(e,t,!0)}}),pe.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=pe.data(o),1===o.nodeType&&!pe._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=pe.camelCase(r.slice(5)),u(o,r,i[r])));pe._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){pe.data(this,e)}):arguments.length>1?this.each(function(){pe.data(this,e,t)}):o?u(o,e,pe.data(o,e)):void 0},removeData:function(e){return this.each(function(){pe.removeData(this,e)})}}),pe.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=pe._data(e,t),n&&(!r||pe.isArray(n)?r=pe._data(e,t,pe.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=pe.queue(e,t),r=n.length,i=n.shift(),o=pe._queueHooks(e,t),a=function(){pe.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return pe._data(e,n)||pe._data(e,n,{empty:pe.Callbacks("once memory").add(function(){pe._removeData(e,t+"queue"),pe._removeData(e,n)})})}}),pe.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length
              a",fe.leadingWhitespace=3===e.firstChild.nodeType,fe.tbody=!e.getElementsByTagName("tbody").length,fe.htmlSerialize=!!e.getElementsByTagName("link").length,fe.html5Clone="<:nav>"!==re.createElement("nav").cloneNode(!0).outerHTML,n.type="checkbox",n.checked=!0,t.appendChild(n),fe.appendChecked=n.checked,e.innerHTML="",fe.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue,t.appendChild(e),n=re.createElement("input"),n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),e.appendChild(n),fe.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,fe.noCloneEvent=!!e.addEventListener,e[pe.expando]=1,fe.attributes=!e.getAttribute(pe.expando)}();var Xe={option:[1,""],legend:[1,"
              ","
              "],area:[1,"",""],param:[1,"",""],thead:[1,"","
              "],tr:[2,"","
              "],col:[2,"","
              "],td:[3,"","
              "],_default:fe.htmlSerialize?[0,"",""]:[1,"X
              ","
              "]};Xe.optgroup=Xe.option,Xe.tbody=Xe.tfoot=Xe.colgroup=Xe.caption=Xe.thead,Xe.th=Xe.td;var Ue=/<|&#?\w+;/,Ve=/-1&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,t=t[pe.expando]?t:new pe.Event(p,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:pe.makeArray(n,[t]),l=pe.event.special[p]||{},i||!l.trigger||l.trigger.apply(r,n)!==!1)){if(!i&&!l.noBubble&&!pe.isWindow(r)){for(u=l.delegateType||p,Ke.test(u+p)||(s=s.parentNode);s;s=s.parentNode)d.push(s),c=s;c===(r.ownerDocument||re)&&d.push(c.defaultView||c.parentWindow||e)}for(f=0;(s=d[f++])&&!t.isPropagationStopped();)t.type=f>1?u:l.bindType||p,o=(pe._data(s,"events")||{})[t.type]&&pe._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&He(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=p,!i&&!t.isDefaultPrevented()&&(!l._default||l._default.apply(d.pop(),n)===!1)&&He(r)&&a&&r[p]&&!pe.isWindow(r)){c=r[a],c&&(r[a]=null),pe.event.triggered=p;try{r[p]()}catch(g){}pe.event.triggered=void 0,c&&(r[a]=c)}return t.result}},dispatch:function(e){e=pe.event.fix(e);var t,n,r,i,o,a=[],s=ie.call(arguments),u=(pe._data(this,"events")||{})[e.type]||[],l=pe.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(a=pe.event.handlers.call(this,e,u),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((pe.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,u=e.target;if(s&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n-1:pe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s]","i"),tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,nt=/\s*$/g,at=p(re),st=at.appendChild(re.createElement("div"));pe.extend({htmlPrefilter:function(e){return e.replace(tt,"<$1>")},clone:function(e,t,n){var r,i,o,a,s,u=pe.contains(e.ownerDocument,e);if(fe.html5Clone||pe.isXMLDoc(e)||!et.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(st.innerHTML=e.outerHTML,st.removeChild(o=st.firstChild)),!(fe.noCloneEvent&&fe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||pe.isXMLDoc(e)))for(r=h(o),s=h(e),a=0;null!=(i=s[a]);++a)r[a]&&k(i,r[a]);if(t)if(n)for(s=s||h(e),r=r||h(o),a=0;null!=(i=s[a]);a++)N(i,r[a]);else N(e,o);return r=h(o,"script"),r.length>0&&g(r,!u&&h(e,"script")),r=s=i=null,o},cleanData:function(e,t){for(var n,r,i,o,a=0,s=pe.expando,u=pe.cache,l=fe.attributes,c=pe.event.special;null!=(n=e[a]);a++)if((t||He(n))&&(i=n[s],o=i&&u[i])){if(o.events)for(r in o.events)c[r]?pe.event.remove(n,r):pe.removeEvent(n,r,o.handle);u[i]&&(delete u[i],l||"undefined"==typeof n.removeAttribute?n[s]=void 0:n.removeAttribute(s),ne.push(i))}}}),pe.fn.extend({domManip:S,detach:function(e){return A(this,e,!0)},remove:function(e){return A(this,e)},text:function(e){return Pe(this,function(e){return void 0===e?pe.text(this):this.empty().append((this[0]&&this[0].ownerDocument||re).createTextNode(e))},null,e,arguments.length)},append:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.appendChild(e)}})},prepend:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&pe.cleanData(h(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&pe.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return pe.clone(this,e,t)})},html:function(e){return Pe(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e)return 1===t.nodeType?t.innerHTML.replace(Ze,""):void 0;if("string"==typeof e&&!nt.test(e)&&(fe.htmlSerialize||!et.test(e))&&(fe.leadingWhitespace||!$e.test(e))&&!Xe[(We.exec(e)||["",""])[1].toLowerCase()]){e=pe.htmlPrefilter(e);try{for(;nt",t=l.getElementsByTagName("td"),t[0].style.cssText="margin:0;border:0;padding:0;display:none",o=0===t[0].offsetHeight,o&&(t[0].style.display="",t[1].style.display="none",o=0===t[0].offsetHeight)),f.removeChild(u)}var n,r,i,o,a,s,u=re.createElement("div"),l=re.createElement("div");l.style&&(l.style.cssText="float:left;opacity:.5",fe.opacity="0.5"===l.style.opacity,fe.cssFloat=!!l.style.cssFloat,l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",fe.clearCloneStyle="content-box"===l.style.backgroundClip,u=re.createElement("div"),u.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",l.innerHTML="",u.appendChild(l),fe.boxSizing=""===l.style.boxSizing||""===l.style.MozBoxSizing||""===l.style.WebkitBoxSizing,pe.extend(fe,{reliableHiddenOffsets:function(){return null==n&&t(),o},boxSizingReliable:function(){return null==n&&t(),i},pixelMarginRight:function(){return null==n&&t(),r},pixelPosition:function(){return null==n&&t(),n},reliableMarginRight:function(){return null==n&&t(),a},reliableMarginLeft:function(){return null==n&&t(),s}}))}();var ht,gt,mt=/^(top|right|bottom|left)$/;e.getComputedStyle?(ht=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n.getPropertyValue(t)||n[t]:void 0,""!==a&&void 0!==a||pe.contains(e.ownerDocument,e)||(a=pe.style(e,t)),n&&!fe.pixelMarginRight()&&ft.test(a)&&ct.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o),void 0===a?a:a+""}):pt.currentStyle&&(ht=function(e){return e.currentStyle},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n[t]:void 0,null==a&&s&&s[t]&&(a=s[t]),ft.test(a)&&!mt.test(t)&&(r=s.left,i=e.runtimeStyle,o=i&&i.left,o&&(i.left=e.currentStyle.left),s.left="fontSize"===t?"1em":a,a=s.pixelLeft+"px",s.left=r,o&&(i.left=o)),void 0===a?a:a+""||"auto"});var yt=/alpha\([^)]*\)/i,vt=/opacity\s*=\s*([^)]*)/i,xt=/^(none|table(?!-c[ea]).+)/,bt=new RegExp("^("+Fe+")(.*)$","i"),wt={position:"absolute",visibility:"hidden",display:"block"},Tt={letterSpacing:"0",fontWeight:"400"},Ct=["Webkit","O","Moz","ms"],Et=re.createElement("div").style;pe.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=gt(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":fe.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=pe.camelCase(t),u=e.style;if(t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:u[t];if(o=typeof n,"string"===o&&(i=Me.exec(n))&&i[1]&&(n=d(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(pe.cssNumber[s]?"":"px")),fe.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),!(a&&"set"in a&&void 0===(n=a.set(e,n,r)))))try{u[t]=n}catch(l){}}},css:function(e,t,n,r){var i,o,a,s=pe.camelCase(t);return t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],a&&"get"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=gt(e,t,r)),"normal"===o&&t in Tt&&(o=Tt[t]),""===n||n?(i=parseFloat(o),n===!0||isFinite(i)?i||0:o):o}}),pe.each(["height","width"],function(e,t){pe.cssHooks[t]={get:function(e,n,r){if(n)return xt.test(pe.css(e,"display"))&&0===e.offsetWidth?dt(e,wt,function(){return M(e,t,r)}):M(e,t,r)},set:function(e,n,r){var i=r&&ht(e);return _(e,n,r?F(e,t,r,fe.boxSizing&&"border-box"===pe.css(e,"boxSizing",!1,i),i):0)}}}),fe.opacity||(pe.cssHooks.opacity={get:function(e,t){return vt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=pe.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===pe.trim(o.replace(yt,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=yt.test(o)?o.replace(yt,i):o+" "+i)}}),pe.cssHooks.marginRight=L(fe.reliableMarginRight,function(e,t){if(t)return dt(e,{display:"inline-block"},gt,[e,"marginRight"])}),pe.cssHooks.marginLeft=L(fe.reliableMarginLeft,function(e,t){if(t)return(parseFloat(gt(e,"marginLeft"))||(pe.contains(e.ownerDocument,e)?e.getBoundingClientRect().left-dt(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}):0))+"px"}),pe.each({margin:"",padding:"",border:"Width"},function(e,t){pe.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+Oe[r]+t]=o[r]||o[r-2]||o[0];return i}},ct.test(e)||(pe.cssHooks[e+t].set=_)}),pe.fn.extend({css:function(e,t){return Pe(this,function(e,t,n){var r,i,o={},a=0;if(pe.isArray(t)){for(r=ht(e),i=t.length;a1)},show:function(){return q(this,!0)},hide:function(){return q(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Re(this)?pe(this).show():pe(this).hide()})}}),pe.Tween=O,O.prototype={constructor:O,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||pe.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(pe.cssNumber[n]?"":"px")},cur:function(){var e=O.propHooks[this.prop];return e&&e.get?e.get(this):O.propHooks._default.get(this)},run:function(e){var t,n=O.propHooks[this.prop];return this.options.duration?this.pos=t=pe.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):O.propHooks._default.set(this),this}},O.prototype.init.prototype=O.prototype,O.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=pe.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){pe.fx.step[e.prop]?pe.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[pe.cssProps[e.prop]]&&!pe.cssHooks[e.prop]?e.elem[e.prop]=e.now:pe.style(e.elem,e.prop,e.now+e.unit)}}},O.propHooks.scrollTop=O.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},pe.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},pe.fx=O.prototype.init,pe.fx.step={};var Nt,kt,St=/^(?:toggle|show|hide)$/,At=/queueHooks$/;pe.Animation=pe.extend($,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,Me.exec(t),n),n}]},tweener:function(e,t){pe.isFunction(e)?(t=e,e=["*"]):e=e.match(De);for(var n,r=0,i=e.length;r
              a",e=n.getElementsByTagName("a")[0],t.setAttribute("type","checkbox"),n.appendChild(t),e=n.getElementsByTagName("a")[0],e.style.cssText="top:1px",fe.getSetAttribute="t"!==n.className,fe.style=/top/.test(e.getAttribute("style")),fe.hrefNormalized="/a"===e.getAttribute("href"),fe.checkOn=!!t.value,fe.optSelected=i.selected,fe.enctype=!!re.createElement("form").enctype,r.disabled=!0,fe.optDisabled=!i.disabled,t=re.createElement("input"),t.setAttribute("value",""),fe.input=""===t.getAttribute("value"),t.value="t",t.setAttribute("type","radio"),fe.radioValue="t"===t.value}();var Dt=/\r/g,jt=/[\x20\t\r\n\f]+/g;pe.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=pe.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,pe(this).val()):e,null==i?i="":"number"==typeof i?i+="":pe.isArray(i)&&(i=pe.map(i,function(e){return null==e?"":e+""})),t=pe.valHooks[this.type]||pe.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return t=pe.valHooks[i.type]||pe.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(Dt,""):null==n?"":n)}}}),pe.extend({valHooks:{option:{get:function(e){var t=pe.find.attr(e,"value");return null!=t?t:pe.trim(pe.text(e)).replace(jt," ")}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||i<0,a=o?null:[],s=o?i+1:r.length,u=i<0?s:o?i:0;u-1)try{r.selected=n=!0}catch(s){r.scrollHeight}else r.selected=!1;return n||(e.selectedIndex=-1),i}}}}),pe.each(["radio","checkbox"],function(){pe.valHooks[this]={set:function(e,t){if(pe.isArray(t))return e.checked=pe.inArray(pe(e).val(),t)>-1}},fe.checkOn||(pe.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Lt,Ht,qt=pe.expr.attrHandle,_t=/^(?:checked|selected)$/i,Ft=fe.getSetAttribute,Mt=fe.input;pe.fn.extend({attr:function(e,t){return Pe(this,pe.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){pe.removeAttr(this,e)})}}),pe.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?pe.prop(e,t,n):(1===o&&pe.isXMLDoc(e)||(t=t.toLowerCase(),i=pe.attrHooks[t]||(pe.expr.match.bool.test(t)?Ht:Lt)),void 0!==n?null===n?void pe.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:(r=pe.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!fe.radioValue&&"radio"===t&&pe.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(De);if(o&&1===e.nodeType)for(;n=o[i++];)r=pe.propFix[n]||n,pe.expr.match.bool.test(n)?Mt&&Ft||!_t.test(n)?e[r]=!1:e[pe.camelCase("default-"+n)]=e[r]=!1:pe.attr(e,n,""),e.removeAttribute(Ft?n:r)}}),Ht={set:function(e,t,n){return t===!1?pe.removeAttr(e,n):Mt&&Ft||!_t.test(n)?e.setAttribute(!Ft&&pe.propFix[n]||n,n):e[pe.camelCase("default-"+n)]=e[n]=!0,n}},pe.each(pe.expr.match.bool.source.match(/\w+/g),function(e,t){var n=qt[t]||pe.find.attr;Mt&&Ft||!_t.test(t)?qt[t]=function(e,t,r){var i,o;return r||(o=qt[t],qt[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,qt[t]=o),i}:qt[t]=function(e,t,n){if(!n)return e[pe.camelCase("default-"+t)]?t.toLowerCase():null}}),Mt&&Ft||(pe.attrHooks.value={set:function(e,t,n){return pe.nodeName(e,"input")?void(e.defaultValue=t):Lt&&Lt.set(e,t,n)}}),Ft||(Lt={set:function(e,t,n){var r=e.getAttributeNode(n);if(r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="","value"===n||t===e.getAttribute(n))return t}},qt.id=qt.name=qt.coords=function(e,t,n){var r;if(!n)return(r=e.getAttributeNode(t))&&""!==r.value?r.value:null},pe.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);if(n&&n.specified)return n.value},set:Lt.set},pe.attrHooks.contenteditable={set:function(e,t,n){Lt.set(e,""!==t&&t,n)}},pe.each(["width","height"],function(e,t){pe.attrHooks[t]={set:function(e,n){if(""===n)return e.setAttribute(t,"auto"),n}}})),fe.style||(pe.attrHooks.style={get:function(e){return e.style.cssText||void 0},set:function(e,t){return e.style.cssText=t+""}});var Ot=/^(?:input|select|textarea|button|object)$/i,Rt=/^(?:a|area)$/i;pe.fn.extend({prop:function(e,t){return Pe(this,pe.prop,e,t,arguments.length>1)},removeProp:function(e){return e=pe.propFix[e]||e,this.each(function(){try{this[e]=void 0,delete this[e]}catch(t){}})}}),pe.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&pe.isXMLDoc(e)||(t=pe.propFix[t]||t,i=pe.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=pe.find.attr(e,"tabindex");return t?parseInt(t,10):Ot.test(e.nodeName)||Rt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),fe.hrefNormalized||pe.each(["href","src"],function(e,t){pe.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),fe.optSelected||(pe.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),pe.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){pe.propFix[this.toLowerCase()]=this}),fe.enctype||(pe.propFix.enctype="encoding");var Pt=/[\t\r\n\f]/g;pe.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).addClass(e.call(this,t,z(this)))});if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).removeClass(e.call(this,t,z(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):pe.isFunction(e)?this.each(function(n){pe(this).toggleClass(e.call(this,n,z(this),t),t)}):this.each(function(){var t,r,i,o;if("string"===n)for(r=0,i=pe(this),o=e.match(De)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||(t=z(this),t&&pe._data(this,"__className__",t),pe.attr(this,"class",t||e===!1?"":pe._data(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(n)+" ").replace(Pt," ").indexOf(t)>-1)return!0;return!1}}),pe.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){pe.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),pe.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}});var Bt=e.location,Wt=pe.now(),It=/\?/,$t=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;pe.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,r=null,i=pe.trim(t+"");return i&&!pe.trim(i.replace($t,function(e,t,i,o){return n&&t&&(r=0),0===r?e:(n=i||t,r+=!o-!i,"")}))?Function("return "+i)():pe.error("Invalid JSON: "+t)},pe.parseXML=function(t){var n,r;if(!t||"string"!=typeof t)return null;try{e.DOMParser?(r=new e.DOMParser,n=r.parseFromString(t,"text/xml")):(n=new e.ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(i){n=void 0}return n&&n.documentElement&&!n.getElementsByTagName("parsererror").length||pe.error("Invalid XML: "+t),n};var zt=/#.*$/,Xt=/([?&])_=[^&]*/,Ut=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Vt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Yt=/^(?:GET|HEAD)$/,Jt=/^\/\//,Gt=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Kt={},Qt={},Zt="*/".concat("*"),en=Bt.href,tn=Gt.exec(en.toLowerCase())||[];pe.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:en,type:"GET",isLocal:Vt.test(tn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":pe.parseJSON,"text xml":pe.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?V(V(e,pe.ajaxSettings),t):V(pe.ajaxSettings,e)},ajaxPrefilter:X(Kt),ajaxTransport:X(Qt),ajax:function(t,n){function r(t,n,r,i){var o,f,v,x,w,C=n;2!==b&&(b=2,u&&e.clearTimeout(u),c=void 0,s=i||"",T.readyState=t>0?4:0,o=t>=200&&t<300||304===t,r&&(x=Y(d,T,r)),x=J(d,x,T,o),o?(d.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(pe.lastModified[a]=w),w=T.getResponseHeader("etag"),w&&(pe.etag[a]=w)),204===t||"HEAD"===d.type?C="nocontent":304===t?C="notmodified":(C=x.state,f=x.data,v=x.error,o=!v)):(v=C,!t&&C||(C="error",t<0&&(t=0))),T.status=t,T.statusText=(n||C)+"",o?g.resolveWith(p,[f,C,T]):g.rejectWith(p,[T,C,v]),T.statusCode(y),y=void 0,l&&h.trigger(o?"ajaxSuccess":"ajaxError",[T,d,o?f:v]),m.fireWith(p,[T,C]),l&&(h.trigger("ajaxComplete",[T,d]),--pe.active||pe.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,d=pe.ajaxSetup({},n),p=d.context||d,h=d.context&&(p.nodeType||p.jquery)?pe(p):pe.event,g=pe.Deferred(),m=pe.Callbacks("once memory"),y=d.statusCode||{},v={},x={},b=0,w="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!f)for(f={};t=Ut.exec(s);)f[t[1].toLowerCase()]=t[2];t=f[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=x[n]=x[n]||e,v[e]=t),this},overrideMimeType:function(e){return b||(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(b<2)for(t in e)y[t]=[y[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||w;return c&&c.abort(t),r(0,t),this}};if(g.promise(T).complete=m.add,T.success=T.done,T.error=T.fail,d.url=((t||d.url||en)+"").replace(zt,"").replace(Jt,tn[1]+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=pe.trim(d.dataType||"*").toLowerCase().match(De)||[""],null==d.crossDomain&&(i=Gt.exec(d.url.toLowerCase()),d.crossDomain=!(!i||i[1]===tn[1]&&i[2]===tn[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(tn[3]||("http:"===tn[1]?"80":"443")))),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=pe.param(d.data,d.traditional)),U(Kt,d,n,T),2===b)return T;l=pe.event&&d.global,l&&0===pe.active++&&pe.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Yt.test(d.type),a=d.url,d.hasContent||(d.data&&(a=d.url+=(It.test(a)?"&":"?")+d.data,delete d.data),d.cache===!1&&(d.url=Xt.test(a)?a.replace(Xt,"$1_="+Wt++):a+(It.test(a)?"&":"?")+"_="+Wt++)),d.ifModified&&(pe.lastModified[a]&&T.setRequestHeader("If-Modified-Since",pe.lastModified[a]),pe.etag[a]&&T.setRequestHeader("If-None-Match",pe.etag[a])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&T.setRequestHeader("Content-Type",d.contentType),T.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Zt+"; q=0.01":""):d.accepts["*"]);for(o in d.headers)T.setRequestHeader(o,d.headers[o]);if(d.beforeSend&&(d.beforeSend.call(p,T,d)===!1||2===b))return T.abort();w="abort";for(o in{success:1,error:1,complete:1})T[o](d[o]);if(c=U(Qt,d,n,T)){if(T.readyState=1,l&&h.trigger("ajaxSend",[T,d]),2===b)return T;d.async&&d.timeout>0&&(u=e.setTimeout(function(){T.abort("timeout")},d.timeout));try{b=1,c.send(v,r)}catch(C){if(!(b<2))throw C;r(-1,C)}}else r(-1,"No Transport");return T},getJSON:function(e,t,n){return pe.get(e,t,n,"json")},getScript:function(e,t){return pe.get(e,void 0,t,"script")}}),pe.each(["get","post"],function(e,t){pe[t]=function(e,n,r,i){return pe.isFunction(n)&&(i=i||r,r=n,n=void 0),pe.ajax(pe.extend({url:e,type:t,dataType:i,data:n,success:r},pe.isPlainObject(e)&&e))}}),pe._evalUrl=function(e){return pe.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},pe.fn.extend({wrapAll:function(e){if(pe.isFunction(e))return this.each(function(t){pe(this).wrapAll(e.call(this,t))});if(this[0]){var t=pe(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return pe.isFunction(e)?this.each(function(t){pe(this).wrapInner(e.call(this,t))}):this.each(function(){var t=pe(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=pe.isFunction(e);return this.each(function(n){pe(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){pe.nodeName(this,"body")||pe(this).replaceWith(this.childNodes)}).end()}}),pe.expr.filters.hidden=function(e){return fe.reliableHiddenOffsets()?e.offsetWidth<=0&&e.offsetHeight<=0&&!e.getClientRects().length:K(e)},pe.expr.filters.visible=function(e){return!pe.expr.filters.hidden(e)};var nn=/%20/g,rn=/\[\]$/,on=/\r?\n/g,an=/^(?:submit|button|image|reset|file)$/i,sn=/^(?:input|select|textarea|keygen)/i;pe.param=function(e,t){var n,r=[],i=function(e,t){t=pe.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=pe.ajaxSettings&&pe.ajaxSettings.traditional),pe.isArray(e)||e.jquery&&!pe.isPlainObject(e))pe.each(e,function(){i(this.name,this.value)});else for(n in e)Q(n,e[n],t,i);return r.join("&").replace(nn,"+")},pe.fn.extend({serialize:function(){return pe.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=pe.prop(this,"elements");return e?pe.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!pe(this).is(":disabled")&&sn.test(this.nodeName)&&!an.test(e)&&(this.checked||!Be.test(e))}).map(function(e,t){var n=pe(this).val();return null==n?null:pe.isArray(n)?pe.map(n,function(e){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),pe.ajaxSettings.xhr=void 0!==e.ActiveXObject?function(){return this.isLocal?ee():re.documentMode>8?Z():/^(get|post|head|put|delete|options)$/i.test(this.type)&&Z()||ee()}:Z;var un=0,ln={},cn=pe.ajaxSettings.xhr();e.attachEvent&&e.attachEvent("onunload",function(){for(var e in ln)ln[e](void 0,!0)}),fe.cors=!!cn&&"withCredentials"in cn,cn=fe.ajax=!!cn,cn&&pe.ajaxTransport(function(t){if(!t.crossDomain||fe.cors){var n;return{send:function(r,i){var o,a=t.xhr(),s=++un;if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(o in t.xhrFields)a[o]=t.xhrFields[o];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||r["X-Requested-With"]||(r["X-Requested-With"]="XMLHttpRequest");for(o in r)void 0!==r[o]&&a.setRequestHeader(o,r[o]+"");a.send(t.hasContent&&t.data||null),n=function(e,r){var o,u,l;if(n&&(r||4===a.readyState))if(delete ln[s],n=void 0,a.onreadystatechange=pe.noop,r)4!==a.readyState&&a.abort();else{l={},o=a.status,"string"==typeof a.responseText&&(l.text=a.responseText);try{u=a.statusText}catch(c){u=""}o||!t.isLocal||t.crossDomain?1223===o&&(o=204):o=l.text?200:404}l&&i(o,u,l,a.getAllResponseHeaders())},t.async?4===a.readyState?e.setTimeout(n):a.onreadystatechange=ln[s]=n:n()},abort:function(){n&&n(void 0,!0)}}}}),pe.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return pe.globalEval(e),e}}}),pe.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),pe.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=re.head||pe("head")[0]||re.documentElement;return{send:function(r,i){t=re.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){(n||!t.readyState||/loaded|complete/.test(t.readyState))&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||i(200,"success"))},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(void 0,!0)}}}});var fn=[],dn=/(=)\?(?=&|$)|\?\?/;pe.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=fn.pop()||pe.expando+"_"+Wt++;return this[e]=!0,e}}),pe.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=pe.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(It.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||pe.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?pe(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,fn.push(i)),a&&pe.isFunction(o)&&o(a[0]),a=o=void 0}),"script"}),pe.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||re;var r=Te.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=y([e],t,i),i&&i.length&&pe(i).remove(),pe.merge([],r.childNodes))};var pn=pe.fn.load;return pe.fn.load=function(e,t,n){if("string"!=typeof e&&pn)return pn.apply(this,arguments);var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=pe.trim(e.slice(s,e.length)),e=e.slice(0,s)),pe.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&pe.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?pe("
              ").append(pe.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},pe.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){pe.fn[t]=function(e){return this.on(t,e)}}),pe.expr.filters.animated=function(e){return pe.grep(pe.timers,function(t){return e===t.elem}).length},pe.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=pe.css(e,"position"),f=pe(e),d={};"static"===c&&(e.style.position="relative"),s=f.offset(),o=pe.css(e,"top"),u=pe.css(e,"left"),l=("absolute"===c||"fixed"===c)&&pe.inArray("auto",[o,u])>-1,l?(r=f.position(),a=r.top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),pe.isFunction(t)&&(t=t.call(e,n,pe.extend({},s))),null!=t.top&&(d.top=t.top-s.top+a),null!=t.left&&(d.left=t.left-s.left+i),"using"in t?t.using.call(e,d):f.css(d)}},pe.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){pe.offset.setOffset(this,e,t)});var t,n,r={top:0,left:0},i=this[0],o=i&&i.ownerDocument;if(o)return t=o.documentElement,pe.contains(t,i)?("undefined"!=typeof i.getBoundingClientRect&&(r=i.getBoundingClientRect()),n=te(o),{top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:r.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):r},position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===pe.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),pe.nodeName(e[0],"html")||(n=e.offset()),n.top+=pe.css(e[0],"borderTopWidth",!0),n.left+=pe.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-pe.css(r,"marginTop",!0),left:t.left-n.left-pe.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){ +for(var e=this.offsetParent;e&&!pe.nodeName(e,"html")&&"static"===pe.css(e,"position");)e=e.offsetParent;return e||pt})}}),pe.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);pe.fn[e]=function(r){return Pe(this,function(e,r,i){var o=te(e);return void 0===i?o?t in o?o[t]:o.document.documentElement[r]:e[r]:void(o?o.scrollTo(n?pe(o).scrollLeft():i,n?i:pe(o).scrollTop()):e[r]=i)},e,r,arguments.length,null)}}),pe.each(["top","left"],function(e,t){pe.cssHooks[t]=L(fe.pixelPosition,function(e,n){if(n)return n=gt(e,t),ft.test(n)?pe(e).position()[t]+"px":n})}),pe.each({Height:"height",Width:"width"},function(e,t){pe.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){pe.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),a=n||(r===!0||i===!0?"margin":"border");return Pe(this,function(t,n,r){var i;return pe.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):void 0===r?pe.css(t,n,a):pe.style(t,n,r,a)},t,o?r:void 0,o,null)}})}),pe.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),pe.fn.size=function(){return this.length},pe.fn.andSelf=pe.fn.addBack,layui.define(function(e){layui.$=pe,e("jquery",pe)}),pe});!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,i=t.length-1,n=i;n>0;n--)if("interactive"===t[n].readyState){e=t[n].src;break}return e||t[i].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"],getStyle:function(t,i){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](i)},link:function(t,i,n){if(r.path){var a=document.getElementsByTagName("head")[0],s=document.createElement("link");"string"==typeof i&&(n=i);var l=(n||t).replace(/\.|\//g,""),f="layuicss-"+l,c=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,document.getElementById(f)||a.appendChild(s),"function"==typeof i&&!function u(){return++c>80?e.console&&console.error("layer.css: Invalid"):void(1989===parseInt(o.getStyle(document.getElementById(f),"width"))?i():setTimeout(u,100))}()}}},r={v:"3.1.1",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):o.link("theme/"+e.extend),this):this},ready:function(e){var t="layer",i="",n=(a?"modules/layer/":"theme/")+"default/layer.css?v="+r.v+i;return a?layui.addcss(n,e,t):o.link(n,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),document.body?t.creat():setTimeout(function(){t.creat()},30)};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim-00","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'
              '+(f?r.title[0]:r.title)+"
              ":"";return r.zIndex=s,t([r.shade?'
              ':"",'
              '+(e&&2!=r.type?"":u)+'
              '+(0==r.type&&r.icon!==-1?'':"")+(1==r.type&&e?"":r.content||"")+'
              '+function(){var e=c?'':"";return r.closeBtn&&(e+=''),e}()+""+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t'+r.btn[t]+"";return'
              '+e+"
              "}():"")+(r.resize?'':"")+"
              "],u,i('
              ')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"","auto"];t.content='';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}if(e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),i("#layui-layer-shade"+e.index).css({"background-color":t.shade[1]||"#000",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]){var u="layer-anim "+l.anim[t.anim];e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data("isOutAnim",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i("#"+l[0]+e);""===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find("."+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css("padding-top"))))};switch(a.type){case 2:u("iframe");break;default:""===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u("."+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u("."+l[5])):u("."+l[5])}return t},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;af&&(a=f),ou&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("isOutAnim")&&t.addClass("layer-anim "+a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),r.ie&&r.ie<10||!t.data("isOutAnim")?f():setTimeout(function(){f()},200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'":function(){return''}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(t){s=t.find(".layui-layer-input"),s.val(e.value||"").focus(),"function"==typeof f&&f(t)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n="layui-this",a=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,a="";if(e>0)for(a=''+t[0].title+"";i"+t[i].title+"";return a}(),content:'
                '+function(){var e=t.length,i=1,a="";if(e>0)for(a='
              • '+(t[0].content||"no content")+"
              • ";i'+(t[i].content||"no content")+"";return a}()+"
              ",success:function(t){var o=t.find(".layui-layer-title").children(),r=t.find(".layui-layer-tabmain").children();o.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),"function"==typeof e.change&&e.change(o)}),"function"==typeof a&&a(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]'+(u[d].alt||
              '+(u.length>1?'':"")+'
              '+(u[d].alt||"")+""+s.imgIndex+"/"+u.length+"
              ",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常
              是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window);layui.define("jquery",function(t){"use strict";var a=layui.$,i=(layui.hint(),layui.device()),e="element",l="layui-this",n="layui-show",s=function(){this.config={}};s.prototype.set=function(t){var i=this;return a.extend(!0,i.config,t),i},s.prototype.on=function(t,a){return layui.onevent.call(this,e,t,a)},s.prototype.tabAdd=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.children(".layui-tab-bar"),o=l.children(".layui-tab-content"),r='
            • "+(i.title||"unnaming")+"
            • ";return s[0]?s.before(r):n.append(r),o.append('
              '+(i.content||"")+"
              "),f.hideTabMore(!0),f.tabAuto(),this},s.prototype.tabDelete=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabDelete(null,s),this},s.prototype.tabChange=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabClick.call(s[0],null,null,s),this},s.prototype.tab=function(t){t=t||{},b.on("click",t.headerElem,function(i){var e=a(this).index();f.tabClick.call(this,i,e,null,t)})},s.prototype.progress=function(t,i){var e="layui-progress",l=a("."+e+"[lay-filter="+t+"]"),n=l.find("."+e+"-bar"),s=n.find("."+e+"-text");return n.css("width",i),s.text(i),this};var o=".layui-nav",r="layui-nav-item",c="layui-nav-bar",u="layui-nav-tree",d="layui-nav-child",y="layui-nav-more",h="layui-anim layui-anim-upbit",f={tabClick:function(t,i,s,o){o=o||{};var r=s||a(this),i=i||r.parent().children("li").index(r),c=o.headerElem?r.parent():r.parents(".layui-tab").eq(0),u=o.bodyElem?a(o.bodyElem):c.children(".layui-tab-content").children(".layui-tab-item"),d=r.find("a"),y=c.attr("lay-filter");"javascript:;"!==d.attr("href")&&"_blank"===d.attr("target")||(r.addClass(l).siblings().removeClass(l),u.eq(i).addClass(n).siblings().removeClass(n)),layui.event.call(this,e,"tab("+y+")",{elem:c,index:i})},tabDelete:function(t,i){var n=i||a(this).parent(),s=n.index(),o=n.parents(".layui-tab").eq(0),r=o.children(".layui-tab-content").children(".layui-tab-item"),c=o.attr("lay-filter");n.hasClass(l)&&(n.next()[0]?f.tabClick.call(n.next()[0],null,s+1):n.prev()[0]&&f.tabClick.call(n.prev()[0],null,s-1)),n.remove(),r.eq(s).remove(),setTimeout(function(){f.tabAuto()},50),layui.event.call(this,e,"tabDelete("+c+")",{elem:o,index:s})},tabAuto:function(){var t="layui-tab-more",e="layui-tab-bar",l="layui-tab-close",n=this;a(".layui-tab").each(function(){var s=a(this),o=s.children(".layui-tab-title"),r=(s.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),c=a('');if(n===window&&8!=i.ie&&f.hideTabMore(!0),s.attr("lay-allowClose")&&o.find("li").each(function(){var t=a(this);if(!t.find("."+l)[0]){var i=a('ဆ');i.on("click",f.tabDelete),t.append(i)}}),"string"!=typeof s.attr("lay-unauto"))if(o.prop("scrollWidth")>o.outerWidth()+1){if(o.find("."+e)[0])return;o.append(c),s.attr("overflow",""),c.on("click",function(a){o[this.title?"removeClass":"addClass"](t),this.title=this.title?"":"收缩"})}else o.find("."+e).remove(),s.removeAttr("overflow")})},hideTabMore:function(t){var i=a(".layui-tab-title");t!==!0&&"tabmore"===a(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=a(this),i=t.parents(o),n=i.attr("lay-filter"),s=t.parent(),c=t.siblings("."+d),y="string"==typeof s.attr("lay-unselect");"javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||y||c[0]||(i.find("."+l).removeClass(l),s.addClass(l)),i.hasClass(u)&&(c.removeClass(h),c[0]&&(s["none"===c.css("display")?"addClass":"removeClass"](r+"ed"),"all"===i.attr("lay-shrink")&&s.siblings().removeClass(r+"ed"))),layui.event.call(this,e,"nav("+n+")",t)},collapse:function(){var t=a(this),i=t.find(".layui-colla-icon"),l=t.siblings(".layui-colla-content"),s=t.parents(".layui-collapse").eq(0),o=s.attr("lay-filter"),r="none"===l.css("display");if("string"==typeof s.attr("lay-accordion")){var c=s.children(".layui-colla-item").children("."+n);c.siblings(".layui-colla-title").children(".layui-colla-icon").html(""),c.removeClass(n)}l[r?"addClass":"removeClass"](n),i.html(r?"":""),layui.event.call(this,e,"collapse("+o+")",{title:t,content:l,show:r})}};s.prototype.init=function(t,e){var l=function(){return e?'[lay-filter="'+e+'"]':""}(),s={tab:function(){f.tabAuto.call({})},nav:function(){var t=200,e={},s={},p={},b=function(l,o,r){var c=a(this),f=c.find("."+d);o.hasClass(u)?l.css({top:c.position().top,height:c.children("a").outerHeight(),opacity:1}):(f.addClass(h),l.css({left:c.position().left+parseFloat(c.css("marginLeft")),top:c.position().top+c.height()-l.height()}),e[r]=setTimeout(function(){l.css({width:c.width(),opacity:1})},i.ie&&i.ie<10?0:t),clearTimeout(p[r]),"block"===f.css("display")&&clearTimeout(s[r]),s[r]=setTimeout(function(){f.addClass(n),c.find("."+y).addClass(y+"d")},300))};a(o+l).each(function(i){var l=a(this),o=a(''),h=l.find("."+r);l.find("."+c)[0]||(l.append(o),h.on("mouseenter",function(){b.call(this,o,l,i)}).on("mouseleave",function(){l.hasClass(u)||(clearTimeout(s[i]),s[i]=setTimeout(function(){l.find("."+d).removeClass(n),l.find("."+y).removeClass(y+"d")},300))}),l.on("mouseleave",function(){clearTimeout(e[i]),p[i]=setTimeout(function(){l.hasClass(u)?o.css({height:0,top:o.position().top+o.height()/2,opacity:0}):o.css({width:0,left:o.position().left+o.width()/2,opacity:0})},t)})),h.find("a").each(function(){var t=a(this),i=(t.parent(),t.siblings("."+d));i[0]&&!t.children("."+y)[0]&&t.append(''),t.off("click",f.clickThis).on("click",f.clickThis)})})},breadcrumb:function(){var t=".layui-breadcrumb";a(t+l).each(function(){var t=a(this),i="lay-separator",e=t.attr(i)||"/",l=t.find("a");l.next("span["+i+"]")[0]||(l.each(function(t){t!==l.length-1&&a(this).after(""+e+"")}),t.css("visibility","visible"))})},progress:function(){var t="layui-progress";a("."+t+l).each(function(){var i=a(this),e=i.find(".layui-progress-bar"),l=e.attr("lay-percent");e.css("width",function(){return/^.+\/.+$/.test(l)?100*new Function("return "+l)()+"%":l}()),i.attr("lay-showPercent")&&setTimeout(function(){e.html(''+l+"")},350)})},collapse:function(){var t="layui-collapse";a("."+t+l).each(function(){var t=a(this).find(".layui-colla-item");t.each(function(){var t=a(this),i=t.find(".layui-colla-title"),e=t.find(".layui-colla-content"),l="none"===e.css("display");i.find(".layui-colla-icon").remove(),i.append(''+(l?"":"")+""),i.off("click",f.collapse).on("click",f.collapse)})})}};return s[t]?s[t]():layui.each(s,function(t,a){a()})},s.prototype.render=s.prototype.init;var p=new s,b=a(document);p.render();var v=".layui-tab-title li";b.on("click",v,f.tabClick),b.on("click",f.hideTabMore),a(window).on("resize",f.tabAuto),t(e,p)});layui.define("layer",function(e){"use strict";var t=layui.$,i=layui.layer,n=layui.hint(),o=layui.device(),a={config:{},set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,r,e,t)}},l=function(){var e=this;return{upload:function(t){e.upload.call(e,t)},reload:function(t){e.reload.call(e,t)},config:e.config}},r="upload",u="layui-upload-file",c="layui-upload-form",f="layui-upload-iframe",s="layui-upload-choose",p=function(e){var i=this;i.config=t.extend({},i.config,a.config,e),i.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",acceptMime:"",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},p.prototype.render=function(e){var i=this,e=i.config;e.elem=t(e.elem),e.bindAction=t(e.bindAction),i.file(),i.events()},p.prototype.file=function(){var e=this,i=e.config,n=e.elemFile=t(['"].join("")),a=i.elem.next();(a.hasClass(u)||a.hasClass(c))&&a.remove(),o.ie&&o.ie<10&&i.elem.wrap('
              '),e.isFile()?(e.elemFile=i.elem,i.field=i.elem[0].name):i.elem.after(n),o.ie&&o.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,i=e.config,n=t(''),o=t(['
              ',"
              "].join(""));t("#"+f)[0]||t("body").append(n),i.elem.next().hasClass(c)||(e.elemFile.wrap(o),i.elem.next("."+c).append(function(){var e=[];return layui.each(i.data,function(t,i){i="function"==typeof i?i():i,e.push('')}),e.join("")}()))},p.prototype.msg=function(e){return i.msg(e,{icon:2,shift:6})},p.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},p.prototype.preview=function(e){var t=this;window.FileReader&&layui.each(t.chooseFiles,function(t,i){var n=new FileReader;n.readAsDataURL(i),n.onload=function(){e&&e(t,i,this.result)}})},p.prototype.upload=function(e,i){var n,a=this,l=a.config,r=a.elemFile[0],u=function(){var i=0,n=0,o=e||a.files||a.chooseFiles||r.files,u=function(){l.multiple&&i+n===a.fileLength&&"function"==typeof l.allDone&&l.allDone({total:a.fileLength,successful:i,aborted:n})};layui.each(o,function(e,o){var r=new FormData;r.append(l.field,o),layui.each(l.data,function(e,t){t="function"==typeof t?t():t,r.append(e,t)});var c={url:l.url,type:"post",data:r,contentType:!1,processData:!1,dataType:"json",headers:l.headers||{},success:function(t){i++,d(e,t),u()},error:function(){n++,a.msg("请求上传接口出现异常"),m(e),u()}};"function"==typeof l.progress&&(c.xhr=function(){var e=t.ajaxSettings.xhr();return e.upload.addEventListener("progress",function(e){if(e.lengthComputable){var t=Math.floor(e.loaded/e.total*100);l.progress(t,l.item[0],e)}}),e}),t.ajax(c)})},c=function(){var e=t("#"+f);a.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var t,i=e.contents().find("body");try{t=i.text()}catch(n){a.msg("获取上传后的响应信息出现异常"),clearInterval(p.timer),m()}t&&(clearInterval(p.timer),i.html(""),d(0,t))},30)},d=function(e,t){if(a.elemFile.next("."+s).remove(),r.value="","object"!=typeof t)try{t=JSON.parse(t)}catch(i){return t={},a.msg("请对上传接口返回有效JSON")}"function"==typeof l.done&&l.done(t,e||0,function(e){a.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){a.upload(e)})},h=l.exts,v=function(){var t=[];return layui.each(e||a.chooseFiles,function(e,i){t.push(i.name)}),t}(),g={preview:function(e){a.preview(e)},upload:function(e,t){var i={};i[e]=t,a.upload(i)},pushFile:function(){return a.files=a.files||{},layui.each(a.chooseFiles,function(e,t){a.files[e]=t}),a.files},resetFile:function(e,t,i){var n=new File([t],i);a.files=a.files||{},a.files[e]=n}},y=function(){if("choose"!==i&&!l.auto||(l.choose&&l.choose(g),"choose"!==i))return l.before&&l.before(g),o.ie?o.ie>9?u():c():void u()};if(v=0===v.length?r.value.match(/[^\/\\]+\..+/g)||[]||"":v,0!==v.length){switch(l.accept){case"file":if(h&&!RegExp("\\w\\.("+h+")$","i").test(escape(v)))return a.msg("选择的文件中包含不支持的格式"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(h||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(v)))return a.msg("选择的视频中包含不支持的格式"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(h||"mp3|wav|mid")+")$","i").test(escape(v)))return a.msg("选择的音频中包含不支持的格式"),r.value="";break;default:if(layui.each(v,function(e,t){RegExp("\\w\\.("+(h||"jpg|png|gif|bmp|jpeg$")+")","i").test(escape(t))||(n=!0)}),n)return a.msg("选择的图片中包含不支持的格式"),r.value=""}if(a.fileLength=function(){var t=0,i=e||a.files||a.chooseFiles||r.files;return layui.each(i,function(){t++}),t}(),l.number&&a.fileLength>l.number)return a.msg("同时最多只能上传的数量为:"+l.number);if(l.size>0&&!(o.ie&&o.ie<10)){var F;if(layui.each(a.chooseFiles,function(e,t){if(t.size>1024*l.size){var i=l.size/1024;i=i>=1?i.toFixed(2)+"MB":l.size+"KB",r.value="",F=i}}),F)return a.msg("文件不能超过"+F)}y()}},p.prototype.reload=function(e){e=e||{},delete e.elem,delete e.bindAction;var i=this,e=i.config=t.extend({},i.config,a.config,e),n=e.elem.next();n.attr({name:e.name,accept:e.acceptMime,multiple:e.multiple})},p.prototype.events=function(){var e=this,i=e.config,a=function(t){e.chooseFiles={},layui.each(t,function(t,i){var n=(new Date).getTime();e.chooseFiles[n+"-"+t]=i})},l=function(t,n){var o=e.elemFile,a=t.length>1?t.length+"个文件":(t[0]||{}).name||o[0].value.match(/[^\/\\]+\..+/g)||[]||"";o.next().hasClass(s)&&o.next().remove(),e.upload(null,"choose"),e.isFile()||i.choose||o.after(''+a+"")};i.elem.off("upload.start").on("upload.start",function(){var o=t(this),a=o.attr("lay-data");if(a)try{a=new Function("return "+a)(),e.config=t.extend({},i,a)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+a)}e.config.item=o,e.elemFile[0].click()}),o.ie&&o.ie<10||i.elem.off("upload.over").on("upload.over",function(){var e=t(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=t(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,o){var r=t(this),u=o.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),a(u),i.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var t=this.files||[];a(t),i.auto?e.upload():l(t)}),i.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),i.elem.data("haveEvents")||(e.elemFile.on("change",function(){t(this).trigger("upload.change")}),i.elem.on("click",function(){e.isFile()||t(this).trigger("upload.start")}),i.drag&&i.elem.on("dragover",function(e){e.preventDefault(),t(this).trigger("upload.over")}).on("dragleave",function(e){t(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),t(this).trigger("upload.drop",e)}),i.bindAction.on("click",function(){t(this).trigger("upload.action")}),i.elem.data("haveEvents",!0))},a.render=function(e){var t=new p(e);return l.call(t)},e(r,a)});layui.define("jquery",function(e){"use strict";var i=layui.jquery,t={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,n,e,i)}},a=function(){var e=this,i=e.config;return{setValue:function(i,t){return e.slide("set",i,t||0)},config:i}},n="slider",l="layui-disabled",s="layui-slider",r="layui-slider-bar",o="layui-slider-wrap",u="layui-slider-wrap-btn",d="layui-slider-tips",v="layui-slider-input",c="layui-slider-input-txt",m="layui-slider-input-btn",p="layui-slider-hover",f=function(e){var a=this;a.index=++t.index,a.config=i.extend({},a.config,t.config,e),a.render()};f.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,input:!1,range:!1,height:200,disabled:!1,theme:"#009688"},f.prototype.render=function(){var e=this,t=e.config;if(t.step<1&&(t.step=1),t.maxt.min?a:t.min,t.value[1]=n>t.min?n:t.min,t.value[0]=t.value[0]>t.max?t.max:t.value[0],t.value[1]=t.value[1]>t.max?t.max:t.value[1];var r=Math.floor((t.value[0]-t.min)/(t.max-t.min)*100),v=Math.floor((t.value[1]-t.min)/(t.max-t.min)*100),m=v-r+"%";r+="%",v+="%"}else{"object"==typeof t.value&&(t.value=Math.min.apply(null,t.value)),t.valuet.max&&(t.value=t.max);var m=Math.floor((t.value-t.min)/(t.max-t.min)*100)+"%"}var p=t.disabled?"#c2c2c2":t.theme,f='
              '+(t.tips?'
              ':"")+'
              '+(t.range?'
              ':"")+"
              ",h=i(t.elem),y=h.next("."+s);if(y[0]&&y.remove(),e.elemTemp=i(f),t.range?(e.elemTemp.find("."+o).eq(0).data("value",t.value[0]),e.elemTemp.find("."+o).eq(1).data("value",t.value[1])):e.elemTemp.find("."+o).data("value",t.value),h.html(e.elemTemp),"vertical"===t.type&&e.elemTemp.height(t.height+"px"),t.showstep){for(var g=(t.max-t.min)/t.step,b="",x=1;x
              ')}e.elemTemp.append(b)}if(t.input&&!t.range){var w=i('
              ');h.css("position","relative"),h.append(w),h.find("."+c).children("input").val(t.value),"vertical"===t.type?w.css({left:0,top:-48}):e.elemTemp.css("margin-right",w.outerWidth()+15)}t.disabled?(e.elemTemp.addClass(l),e.elemTemp.find("."+u).addClass(l)):e.slide(),e.elemTemp.find("."+u).on("mouseover",function(){var a="vertical"===t.type?t.height:e.elemTemp[0].offsetWidth,n=e.elemTemp.find("."+o),l="vertical"===t.type?a-i(this).parent()[0].offsetTop-n.height():i(this).parent()[0].offsetLeft,s=l/a*100,r=i(this).parent().data("value"),u=t.setTips?t.setTips(r):r;e.elemTemp.find("."+d).html(u),"vertical"===t.type?e.elemTemp.find("."+d).css({bottom:s+"%","margin-bottom":"20px",display:"inline-block"}):e.elemTemp.find("."+d).css({left:s+"%",display:"inline-block"})}).on("mouseout",function(){e.elemTemp.find("."+d).css("display","none")})},f.prototype.slide=function(e,t,a){var n=this,l=n.config,s=n.elemTemp,f=function(){return"vertical"===l.type?l.height:s[0].offsetWidth},h=s.find("."+o),y=s.next("."+v),g=y.children("."+c).children("input").val(),b=100/((l.max-l.min)/Math.ceil(l.step)),x=function(e,i){e=Math.ceil(e)*b>100?Math.ceil(e)*b:Math.round(e)*b,e=e>100?100:e,h.eq(i).css("vertical"===l.type?"bottom":"left",e+"%");var t=T(h[0].offsetLeft),a=l.range?T(h[1].offsetLeft):0;"vertical"===l.type?(s.find("."+d).css({bottom:e+"%","margin-bottom":"20px"}),t=T(f()-h[0].offsetTop-h.height()),a=l.range?T(f()-h[1].offsetTop-h.height()):0):s.find("."+d).css("left",e+"%"),t=t>100?100:t,a=a>100?100:a;var n=Math.min(t,a),o=Math.abs(t-a);"vertical"===l.type?s.find("."+r).css({height:o+"%",bottom:n+"%"}):s.find("."+r).css({width:o+"%",left:n+"%"});var u=l.min+Math.round((l.max-l.min)*e/100);if(g=u,y.children("."+c).children("input").val(g),h.eq(i).data("value",u),u=l.setTips?l.setTips(u):u,s.find("."+d).html(u),l.range){var v=[h.eq(0).data("value"),h.eq(1).data("value")];v[0]>v[1]&&v.reverse()}l.change&&l.change(l.range?v:u)},T=function(e){var i=e/f()*100/b,t=Math.round(i)*b;return e==f()&&(t=Math.ceil(i)*b),t},w=i(['
              f()&&(r=f());var o=r/f()*100/b;x(o,e),t.addClass(p),s.find("."+d).show(),i.preventDefault()},o=function(){t.removeClass(p),s.find("."+d).hide()};M(r,o)})}),s.on("click",function(e){var t=i("."+u);if(!t.is(event.target)&&0===t.has(event.target).length&&t.length){var a,n="vertical"===l.type?f()-e.clientY+i(this).offset().top:e.clientX-i(this).offset().left;n<0&&(n=0),n>f()&&(n=f());var s=n/f()*100/b;a=l.range?"vertical"===l.type?Math.abs(n-parseInt(i(h[0]).css("bottom")))>Math.abs(n-parseInt(i(h[1]).css("bottom")))?1:0:Math.abs(n-h[0].offsetLeft)>Math.abs(n-h[1].offsetLeft)?1:0:0,x(s,a),e.preventDefault()}}),y.hover(function(){var e=i(this);e.children("."+m).fadeIn("fast")},function(){var e=i(this);e.children("."+m).fadeOut("fast")}),y.children("."+m).children("i").each(function(e){i(this).on("click",function(){g=1==e?g-l.stepl.max?l.max:Number(g)+l.step;var i=(g-l.min)/(l.max-l.min)*100/b;x(i,0)})});var q=function(){var e=this.value;e=isNaN(e)?0:e,e=el.max?l.max:e,this.value=e;var i=(e-l.min)/(l.max-l.min)*100/b;x(i,0)};y.children("."+c).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),q.call(this))}).on("change",q)},f.prototype.events=function(){var e=this;e.config},t.render=function(e){var i=new f(e);return a.call(i)},e(n,t)});layui.define("jquery",function(e){"use strict";var i=layui.jquery,o={config:{},index:layui.colorpicker?layui.colorpicker.index+1e4:0,set:function(e){var o=this;return o.config=i.extend({},o.config,e),o},on:function(e,i){return layui.onevent.call(this,"colorpicker",e,i)}},r=function(){var e=this,i=e.config;return{config:i}},t="colorpicker",n="layui-show",l="layui-colorpicker",c=".layui-colorpicker-main",a="layui-icon-down",s="layui-icon-close",f="layui-colorpicker-trigger-span",d="layui-colorpicker-trigger-i",u="layui-colorpicker-side",p="layui-colorpicker-side-slider",g="layui-colorpicker-basis",v="layui-colorpicker-alpha-bgcolor",h="layui-colorpicker-alpha-slider",m="layui-colorpicker-basis-cursor",b="layui-colorpicker-main-input",k=function(e){var i={h:0,s:0,b:0},o=Math.min(e.r,e.g,e.b),r=Math.max(e.r,e.g,e.b),t=r-o;return i.b=r,i.s=0!=r?255*t/r:0,0!=i.s?e.r==r?i.h=(e.g-e.b)/t:e.g==r?i.h=2+(e.b-e.r)/t:i.h=4+(e.r-e.g)/t:i.h=-1,r==o&&(i.h=0),i.h*=60,i.h<0&&(i.h+=360),i.s*=100/255,i.b*=100/255,i},y=function(e){var e=e.indexOf("#")>-1?e.substring(1):e;if(3==e.length){var i=e.split("");e=i[0]+i[0]+i[1]+i[1]+i[2]+i[2]}e=parseInt(e,16);var o={r:e>>16,g:(65280&e)>>8,b:255&e};return k(o)},x=function(e){var i={},o=e.h,r=255*e.s/100,t=255*e.b/100;if(0==r)i.r=i.g=i.b=t;else{var n=t,l=(255-r)*t/255,c=(n-l)*(o%60)/60;360==o&&(o=0),o<60?(i.r=n,i.b=l,i.g=l+c):o<120?(i.g=n,i.b=l,i.r=n-c):o<180?(i.g=n,i.r=l,i.b=l+c):o<240?(i.b=n,i.r=l,i.g=n-c):o<300?(i.b=n,i.g=l,i.r=l+c):o<360?(i.r=n,i.g=l,i.b=n-c):(i.r=0,i.g=0,i.b=0)}return{r:Math.round(i.r),g:Math.round(i.g),b:Math.round(i.b)}},C=function(e){var o=x(e),r=[o.r.toString(16),o.g.toString(16),o.b.toString(16)];return i.each(r,function(e,i){1==i.length&&(r[e]="0"+i)}),r.join("")},P=function(e){var i=/[0-9]{1,3}/g,o=e.match(i)||[];return{r:o[0],g:o[1],b:o[2]}},B=i(window),w=i(document),D=function(e){var r=this;r.index=++o.index,r.config=i.extend({},r.config,o.config,e),r.render()};D.prototype.config={color:"",size:null,alpha:!1,format:"hex",predefine:!1,colors:["#009688","#5FB878","#1E9FFF","#FF5722","#FFB800","#01AAED","#999","#c00","#ff8c00","#ffd700","#90ee90","#00ced1","#1e90ff","#c71585","rgb(0, 186, 189)","rgb(255, 120, 0)","rgb(250, 212, 0)","#393D49","rgba(0,0,0,.5)","rgba(255, 69, 0, 0.68)","rgba(144, 240, 144, 0.5)","rgba(31, 147, 255, 0.73)"]},D.prototype.render=function(){var e=this,o=e.config,r=i(['
              ',"",'3&&(o.alpha&&"rgb"==o.format||(e="#"+C(k(P(o.color))))),"background: "+e):e}()+'">','',"","","
              "].join("")),t=i(o.elem);o.size&&r.addClass("layui-colorpicker-"+o.size),t.addClass("layui-inline").html(e.elemColorBox=r),e.color=e.elemColorBox.find("."+f)[0].style.background,e.events()},D.prototype.renderPicker=function(){var e=this,o=e.config,r=e.elemColorBox[0],t=e.elemPicker=i(['
              ','
              ','
              ','
              ','
              ','
              ',"
              ",'
              ','
              ',"
              ","
              ",'
              ','
              ','
              ',"
              ","
              ",function(){if(o.predefine){var e=['
              '];return layui.each(o.colors,function(i,o){e.push(['
              ','
              ',"
              "].join(""))}),e.push("
              "),e.join("")}return""}(),'
              ','
              ','',"
              ",'
              ','','',"","
              "].join(""));e.elemColorBox.find("."+f)[0];i(c)[0]&&i(c).data("index")==e.index?e.removePicker(D.thisElemInd):(e.removePicker(D.thisElemInd),i("body").append(t)),D.thisElemInd=e.index,D.thisColor=r.style.background,e.position(),e.pickerEvents()},D.prototype.removePicker=function(e){var o=this;o.config;return i("#layui-colorpicker"+(e||o.index)).remove(),o},D.prototype.position=function(){var e=this,i=e.config,o=e.bindElem||e.elemColorBox[0],r=e.elemPicker[0],t=o.getBoundingClientRect(),n=r.offsetWidth,l=r.offsetHeight,c=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},a=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},s=5,f=t.left,d=t.bottom;f-=(n-o.offsetWidth)/2,d+=s,f+n+s>a("width")?f=a("width")-n-s:fa()&&(d=t.top>l?t.top-l:a()-l,d-=2*s),i.position&&(r.style.position=i.position),r.style.left=f+("fixed"===i.position?0:c(1))+"px",r.style.top=d+("fixed"===i.position?0:c())+"px"},D.prototype.val=function(){var e=this,i=(e.config,e.elemColorBox.find("."+f)),o=e.elemPicker.find("."+b),r=i[0],t=r.style.backgroundColor;if(t){var n=k(P(t)),l=i.attr("lay-type");if(e.select(n.h,n.s,n.b),"torgb"===l&&o.find("input").val(t),"rgba"===l){var c=P(t);if(3==(t.match(/[0-9]{1,3}/g)||[]).length)o.find("input").val("rgba("+c.r+", "+c.g+", "+c.b+", 1)"),e.elemPicker.find("."+h).css("left",280);else{o.find("input").val(t);var a=280*t.slice(t.lastIndexOf(",")+1,t.length-1);e.elemPicker.find("."+h).css("left",a)}e.elemPicker.find("."+v)[0].style.background="linear-gradient(to right, rgba("+c.r+", "+c.g+", "+c.b+", 0), rgb("+c.r+", "+c.g+", "+c.b+"))"}}else e.select(0,100,100),o.find("input").val(""),e.elemPicker.find("."+v)[0].style.background="",e.elemPicker.find("."+h).css("left",280)},D.prototype.side=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=r.attr("lay-type"),n=e.elemPicker.find("."+u),l=e.elemPicker.find("."+p),c=e.elemPicker.find("."+g),y=e.elemPicker.find("."+m),C=e.elemPicker.find("."+v),w=e.elemPicker.find("."+h),D=l[0].offsetTop/180*360,E=100-(y[0].offsetTop+3)/180*100,H=(y[0].offsetLeft+3)/260*100,W=Math.round(w[0].offsetLeft/280*100)/100,j=e.elemColorBox.find("."+d),F=e.elemPicker.find(".layui-colorpicker-pre").children("div"),L=function(i,n,l,c){e.select(i,n,l);var f=x({h:i,s:n,b:l});if(j.addClass(a).removeClass(s),r[0].style.background="rgb("+f.r+", "+f.g+", "+f.b+")","torgb"===t&&e.elemPicker.find("."+b).find("input").val("rgb("+f.r+", "+f.g+", "+f.b+")"),"rgba"===t){var d=0;d=280*c,w.css("left",d),e.elemPicker.find("."+b).find("input").val("rgba("+f.r+", "+f.g+", "+f.b+", "+c+")"),r[0].style.background="rgba("+f.r+", "+f.g+", "+f.b+", "+c+")",C[0].style.background="linear-gradient(to right, rgba("+f.r+", "+f.g+", "+f.b+", 0), rgb("+f.r+", "+f.g+", "+f.b+"))"}o.change&&o.change(e.elemPicker.find("."+b).find("input").val())},M=i(['
              t&&(r=t);var l=r/180*360;D=l,L(l,H,E,W),e.preventDefault()};Y(r),e.preventDefault()}),n.on("click",function(e){var o=e.clientY-i(this).offset().top;o<0&&(o=0),o>this.offsetHeight&&(o=this.offsetHeight);var r=o/180*360;D=r,L(r,H,E,W),e.preventDefault()}),y.on("mousedown",function(e){var i=this.offsetTop,o=this.offsetLeft,r=e.clientY,t=e.clientX,n=function(e){var n=i+(e.clientY-r),l=o+(e.clientX-t),a=c[0].offsetHeight-3,s=c[0].offsetWidth-3;n<-3&&(n=-3),n>a&&(n=a),l<-3&&(l=-3),l>s&&(l=s);var f=(l+3)/260*100,d=100-(n+3)/180*100;E=d,H=f,L(D,f,d,W),e.preventDefault()};layui.stope(e),Y(n),e.preventDefault()}),c.on("mousedown",function(e){var o=e.clientY-i(this).offset().top-3+B.scrollTop(),r=e.clientX-i(this).offset().left-3+B.scrollLeft();o<-3&&(o=-3),o>this.offsetHeight-3&&(o=this.offsetHeight-3),r<-3&&(r=-3),r>this.offsetWidth-3&&(r=this.offsetWidth-3);var t=(r+3)/260*100,n=100-(o+3)/180*100;E=n,H=t,L(D,t,n,W),e.preventDefault(),y.trigger(e,"mousedown")}),w.on("mousedown",function(e){var i=this.offsetLeft,o=e.clientX,r=function(e){var r=i+(e.clientX-o),t=C[0].offsetWidth;r<0&&(r=0),r>t&&(r=t);var n=Math.round(r/280*100)/100;W=n,L(D,H,E,n),e.preventDefault()};Y(r),e.preventDefault()}),C.on("click",function(e){var o=e.clientX-i(this).offset().left;o<0&&(o=0),o>this.offsetWidth&&(o=this.offsetWidth);var r=Math.round(o/280*100)/100;W=r,L(D,H,E,r),e.preventDefault()}),F.each(function(){i(this).on("click",function(){i(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e,o=this.style.backgroundColor,r=k(P(o)),t=o.slice(o.lastIndexOf(",")+1,o.length-1);D=r.h,H=r.s,E=r.b,3==(o.match(/[0-9]{1,3}/g)||[]).length&&(t=1),W=t,e=280*t,L(r.h,r.s,r.b,t)})})},D.prototype.select=function(e,i,o,r){var t=this,n=(t.config,C({h:e,s:100,b:100})),l=C({h:e,s:i,b:o}),c=e/360*180,a=180-o/100*180-3,s=i/100*260-3;t.elemPicker.find("."+p).css("top",c),t.elemPicker.find("."+g)[0].style.background="#"+n,t.elemPicker.find("."+m).css({top:a,left:s}),"change"!==r&&t.elemPicker.find("."+b).find("input").val("#"+l)},D.prototype.pickerEvents=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=e.elemPicker.find("."+b+" input"),n={clear:function(i){r[0].style.background="",e.elemColorBox.find("."+d).removeClass(a).addClass(s),e.color="",o.done&&o.done(""),e.removePicker()},confirm:function(i,n){var l=t.val(),c=l,f={};if(l.indexOf(",")>-1){if(f=k(P(l)),e.select(f.h,f.s,f.b),r[0].style.background=c="#"+C(f),(l.match(/[0-9]{1,3}/g)||[]).length>3&&"rgba"===r.attr("lay-type")){var u=280*l.slice(l.lastIndexOf(",")+1,l.length-1);e.elemPicker.find("."+h).css("left",u),r[0].style.background=l,c=l}}else f=y(l),r[0].style.background=c="#"+C(f),e.elemColorBox.find("."+d).removeClass(s).addClass(a);return"change"===n?(e.select(f.h,f.s,f.b,n),void(o.change&&o.change(c))):(e.color=l,o.done&&o.done(l),void e.removePicker())}};e.elemPicker.on("click","*[colorpicker-events]",function(){var e=i(this),o=e.attr("colorpicker-events");n[o]&&n[o].call(this,e)}),t.on("keyup",function(e){var o=i(this);n.confirm.call(this,o,13===e.keyCode?null:"change")})},D.prototype.events=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f);e.elemColorBox.on("click",function(){e.renderPicker(),i(c)[0]&&(e.val(),e.side())}),o.elem[0]&&!e.elemColorBox[0].eventHandler&&(w.on("click",function(o){if(!i(o.target).hasClass(l)&&!i(o.target).parents("."+l)[0]&&!i(o.target).hasClass(c.replace(/\./g,""))&&!i(o.target).parents(c)[0]&&e.elemPicker){if(e.color){var t=k(P(e.color));e.select(t.h,t.s,t.b)}else e.elemColorBox.find("."+d).removeClass(a).addClass(s);r[0].style.background=e.color||"",e.removePicker()}}),B.on("resize",function(){return!(!e.elemPicker||!i(c)[0])&&void e.position()}),e.elemColorBox[0].eventHandler=!0)},o.render=function(e){var i=new D(e);return r.call(i)},e(t,o)});layui.define("layer",function(e){"use strict";var t=layui.$,i=layui.layer,a=layui.hint(),n=layui.device(),l="form",r=".layui-form",s="layui-this",o="layui-hide",c="layui-disabled",u=function(){this.config={verify:{required:[/[\S]+/,"必填项不能为空"],phone:[/^1\d{10}$/,"请输入正确的手机号"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"邮箱格式不正确"],url:[/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/,"链接格式不正确"],number:function(e){if(!e||isNaN(e))return"只能填写数字"},date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"日期格式不正确"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"请输入正确的身份证号"]}}};u.prototype.set=function(e){var i=this;return t.extend(!0,i.config,e),i},u.prototype.verify=function(e){var i=this;return t.extend(!0,i.config.verify,e),i},u.prototype.on=function(e,t){return layui.onevent.call(this,l,e,t)},u.prototype.val=function(e,i){var a=this,n=t(r+'[lay-filter="'+e+'"]');return n.each(function(e,a){var n=t(this);layui.each(i,function(e,t){var i,a=n.find('[name="'+e+'"]');a[0]&&(i=a[0].type,"checkbox"===i?a[0].checked=t:"radio"===i?a.each(function(){this.value==t&&(this.checked=!0)}):a.val(t))})}),f.render(null,e),a.getValue(e)},u.prototype.getValue=function(e,i){i=i||t(r+'[lay-filter="'+e+'"]').eq(0);var a={},n={},l=i.find("input,select,textarea");return layui.each(l,function(e,t){if(t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name){if(/^.*\[\]$/.test(t.name)){var i=t.name.match(/^(.*)\[\]$/g)[0];a[i]=0|a[i],t.name=t.name.replace(/^(.*)\[\]$/,"$1["+a[i]++ +"]")}/^checkbox|radio$/.test(t.type)&&!t.checked||(n[t.name]=t.value)}}),n},u.prototype.render=function(e,i){var n=this,u=t(r+function(){return i?'[lay-filter="'+i+'"]':""}()),d={select:function(){var e,i="请选择",a="layui-form-select",n="layui-select-title",r="layui-select-none",d="",f=u.find("select"),v=function(i,l){t(i.target).parent().hasClass(n)&&!l||(t("."+a).removeClass(a+"ed "+a+"up"),e&&d&&e.val(d)),e=null},y=function(i,u,f){var y,p=t(this),m=i.find("."+n),k=m.find("input"),g=i.find("dl"),x=g.children("dd"),b=this.selectedIndex;if(!u){var C=function(){var e=i.offset().top+i.outerHeight()+5-h.scrollTop(),t=g.outerHeight();b=p[0].selectedIndex,i.addClass(a+"ed"),x.removeClass(o),y=null,x.eq(b).addClass(s).siblings().removeClass(s),e+t>h.height()&&e>=t&&i.addClass(a+"up"),T()},w=function(e){i.removeClass(a+"ed "+a+"up"),k.blur(),y=null,e||$(k.val(),function(e){var i=p[0].selectedIndex;e&&(d=t(p[0].options[i]).html(),0===i&&d===k.attr("placeholder")&&(d=""),k.val(d||""))})},T=function(){var e=g.children("dd."+s);if(e[0]){var t=e.position().top,i=g.height(),a=e.height();t>i&&g.scrollTop(t+g.scrollTop()-i+a-5),t<0&&g.scrollTop(t+g.scrollTop()-5)}};m.on("click",function(e){i.hasClass(a+"ed")?w():(v(e,!0),C()),g.find("."+r).remove()}),m.find(".layui-edge").on("click",function(){k.focus()}),k.on("keyup",function(e){var t=e.keyCode;9===t&&C()}).on("keydown",function(e){var t=e.keyCode;9===t&&w();var i=function(t,a){var n,l;e.preventDefault();var r=function(){var e=g.children("dd."+s);if(g.children("dd."+o)[0]&&"next"===t){var i=g.children("dd:not(."+o+",."+c+")"),n=i.eq(0).index();if(n>=0&&n无匹配项

              '):g.find("."+r).remove()},"keyup"),""===t&&g.find("."+r).remove(),void T())};f&&k.on("keyup",q).on("blur",function(i){var a=p[0].selectedIndex;e=k,d=t(p[0].options[a]).html(),0===a&&d===k.attr("placeholder")&&(d=""),setTimeout(function(){$(k.val(),function(e){d||k.val("")},"blur")},200)}),x.on("click",function(){var e=t(this),a=e.attr("lay-value"),n=p.attr("lay-filter");return!e.hasClass(c)&&(e.hasClass("layui-select-tips")?k.val(""):(k.val(e.text()),e.addClass(s)),e.siblings().removeClass(s),p.val(a).removeClass("layui-form-danger"),layui.event.call(this,l,"select("+n+")",{elem:p[0],value:a,othis:i}),w(!0),!1)}),i.find("dl>dt").on("click",function(e){return!1}),t(document).off("click",v).on("click",v)}};f.each(function(e,l){var r=t(this),o=r.next("."+a),u=this.disabled,d=l.value,f=t(l.options[l.selectedIndex]),v=l.options[0];if("string"==typeof r.attr("lay-ignore"))return r.show();var h="string"==typeof r.attr("lay-search"),p=v?v.value?i:v.innerHTML||i:i,m=t(['
              ','
              ','','
              ','
              ',function(e){var t=[];return layui.each(e,function(e,a){0!==e||a.value?"optgroup"===a.tagName.toLowerCase()?t.push("
              "+a.label+"
              "):t.push('
              '+a.innerHTML+"
              "):t.push('
              '+(a.innerHTML||i)+"
              ")}),0===t.length&&t.push('
              没有选项
              '),t.join("")}(r.find("*"))+"
              ","
              "].join(""));o[0]&&o.remove(),r.after(m),y.call(this,m,u,h)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},i=u.find("input[type=checkbox]"),a=function(e,i){var a=t(this);e.on("click",function(){var t=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(i[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(i[1]).find("em").text(n[0])),layui.event.call(a[0],l,i[2]+"("+t+")",{elem:a[0],value:a[0].value,othis:e}))})};i.each(function(i,n){var l=t(this),r=l.attr("lay-skin"),s=(l.attr("lay-text")||"").split("|"),o=this.disabled;"switch"===r&&(r="_"+r);var u=e[r]||e.checkbox;if("string"==typeof l.attr("lay-ignore"))return l.show();var d=l.next("."+u[0]),f=t(['
              ",function(){var e=n.title.replace(/\s/g,""),t={checkbox:[e?""+n.title+"":"",''].join(""),_switch:""+((n.checked?s[0]:s[1])||"")+""};return t[r]||t.checkbox}(),"
              "].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e="layui-form-radio",i=["",""],a=u.find("input[type=radio]"),n=function(a){var n=t(this),s="layui-anim-scaleSpring";a.on("click",function(){var o=n[0].name,c=n.parents(r),u=n.attr("lay-filter"),d=c.find("input[name="+o.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(d,function(){var a=t(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(s).html(i[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(s).html(i[0]),layui.event.call(n[0],l,"radio("+u+")",{elem:n[0],value:n[0].value,othis:a}))})};a.each(function(a,l){var r=t(this),s=r.next("."+e),o=this.disabled;if("string"==typeof r.attr("lay-ignore"))return r.show();s[0]&&s.remove();var u=t(['
              ',''+i[l.checked?0:1]+"","
              "+function(){var e=l.title||"";return"string"==typeof r.next().attr("lay-radio")&&(e=r.next().html(),r.next().remove()),e}()+"
              ","
              "].join(""));r.after(u),n.call(this,u)})}};return e?d[e]?d[e]():a.error("不支持的"+e+"表单渲染"):layui.each(d,function(e,t){t()}),n};var d=function(){var e=null,a=f.config.verify,s="layui-form-danger",o={},c=t(this),u=c.parents(r),d=u.find("*[lay-verify]"),v=c.parents("form")[0],h=c.attr("lay-filter");return layui.each(d,function(l,r){var o=t(this),c=o.attr("lay-verify").split("|"),u=o.attr("lay-verType"),d=o.val();if(o.removeClass(s),layui.each(c,function(t,l){var c,f="",v="function"==typeof a[l];if(a[l]){var c=v?f=a[l](d,r):!a[l][0].test(d);if(f=f||a[l][1],"required"===l&&(f=o.attr("lay-reqText")||f),c)return"tips"===u?i.tips(f,function(){return"string"==typeof o.attr("lay-ignore")||"select"!==r.tagName.toLowerCase()&&!/^checkbox|radio$/.test(r.type)?o:o.next()}(),{tips:1}):"alert"===u?i.alert(f,{title:"提示",shadeClose:!0}):i.msg(f,{icon:5,shift:6}),n.android||n.ios||setTimeout(function(){r.focus()},7),o.addClass(s),e=!0}}),e)return e}),!e&&(o=f.getValue(null,u),layui.event.call(this,l,"submit("+h+")",{elem:this,form:v,field:o}))},f=new u,v=t(document),h=t(window);f.render(),v.on("reset",r,function(){var e=t(this).attr("lay-filter");setTimeout(function(){f.render(null,e)},50)}),v.on("submit",r,d).on("click","*[lay-submit]",d),e(l,f)});layui.define("form",function(e){"use strict";var i=layui.$,a=layui.form,n=layui.layer,t="tree",r={config:{},index:layui[t]?layui[t].index+1e4:0,set:function(e){var a=this;return a.config=i.extend({},a.config,e),a},on:function(e,i){return layui.onevent.call(this,t,e,i)}},l=function(){var e=this,i=e.config,a=i.id||e.index;return l.that[a]=e,l.config[a]=i,{config:i,reload:function(i){e.reload.call(e,i)},getChecked:function(){return e.getChecked.call(e)},setChecked:function(i){return e.setChecked.call(e,i)}}},c="layui-hide",d="layui-disabled",s="layui-tree-set",o="layui-tree-iconClick",h="layui-icon-addition",u="layui-icon-subtraction",p="layui-tree-entry",f="layui-tree-main",y="layui-tree-txt",v="layui-tree-pack",C="layui-tree-spread",k="layui-tree-setLineShort",m="layui-tree-showLine",x="layui-tree-lineExtend",b=function(e){var a=this;a.index=++r.index,a.config=i.extend({},a.config,r.config,e),a.render()};b.prototype.config={data:[],showCheckbox:!1,showLine:!0,accordion:!1,onlyIconControl:!1,isJump:!1,edit:!1,text:{defaultNodeName:"未命名",none:"无数据"}},b.prototype.reload=function(e){var a=this;layui.each(e,function(e,i){i.constructor===Array&&delete a.config[e]}),a.config=i.extend(!0,{},a.config,e),a.render()},b.prototype.render=function(){var e=this,a=e.config;e.checkids=[];var n=i('
              ');e.tree(n);var t=a.elem=i(a.elem);if(t[0]){if(e.key=a.id||e.index,e.elem=n,e.elemNone=i('
              '+a.text.none+"
              "),t.html(e.elem),0==e.elem.find(".layui-tree-set").length)return e.elem.append(e.elemNone);a.showCheckbox&&e.renderForm("checkbox"),e.elem.find(".layui-tree-set").each(function(){var e=i(this);e.parent(".layui-tree-pack")[0]||e.addClass("layui-tree-setHide"),!e.next()[0]&&e.parents(".layui-tree-pack").eq(1).hasClass("layui-tree-lineExtend")&&e.addClass(k),e.next()[0]||e.parents(".layui-tree-set").eq(0).next()[0]||e.addClass(k)}),e.events()}},b.prototype.renderForm=function(e){a.render(e,"LAY-tree-"+this.index)},b.prototype.tree=function(e,a){var n=this,t=n.config,r=a||t.data;layui.each(r,function(a,r){var l=r.children&&r.children.length>0,o=i('
              '),h=i(['
              ','
              ','
              ',function(){return t.showLine?l?'':'':''}(),function(){return t.showCheckbox?'':""}(),function(){return t.isJump&&r.href?''+(r.title||r.label||t.text.defaultNodeName)+"":''+(r.title||r.label||t.text.defaultNodeName)+""}(),"
              ",function(){if(!t.edit)return"";var e={add:'',update:'',del:''},i=['
              '];return t.edit===!0&&(t.edit=["update","del"]),"object"==typeof t.edit?(layui.each(t.edit,function(a,n){i.push(e[n]||"")}),i.join("")+"
              "):void 0}(),"
              "].join(""));l&&(h.append(o),n.tree(o,r.children)),e.append(h),h.prev("."+s)[0]&&h.prev().children(".layui-tree-pack").addClass("layui-tree-showLine"),l||h.parent(".layui-tree-pack").addClass("layui-tree-lineExtend"),n.spread(h,r),t.showCheckbox&&(r.checked&&n.checkids.push(r.id),n.checkClick(h,r)),t.edit&&n.operate(h,r)})},b.prototype.spread=function(e,a){var n=this,t=n.config,r=e.children("."+p),l=r.children("."+f),c=r.find("."+o),k=r.find("."+y),m=t.onlyIconControl?c:l,x="";m.on("click",function(i){var a=e.children("."+v),n=m.children(".layui-icon")[0]?m.children(".layui-icon"):m.find(".layui-tree-icon").children(".layui-icon");if(a[0]){if(e.hasClass(C))e.removeClass(C),a.slideUp(200),n.removeClass(u).addClass(h);else if(e.addClass(C),a.slideDown(200),n.addClass(u).removeClass(h),t.accordion){var r=e.siblings("."+s);r.removeClass(C),r.children("."+v).slideUp(200),r.find(".layui-tree-icon").children(".layui-icon").removeClass(u).addClass(h)}}else x="normal"}),k.on("click",function(){var n=i(this);n.hasClass(d)||(x=e.hasClass(C)?t.onlyIconControl?"open":"close":t.onlyIconControl?"close":"open",t.click&&t.click({elem:e,state:x,data:a}))})},b.prototype.setCheckbox=function(e,i,a){var n=this,t=(n.config,a.prop("checked"));if(!a.prop("disabled")){if("object"==typeof i.children||e.find("."+v)[0]){var r=e.find("."+v).find('input[same="layuiTreeCheck"]');r.each(function(){this.disabled||(this.checked=t)})}var l=function(e){if(e.parents("."+s)[0]){var i,a=e.parent("."+v),n=a.parent(),r=a.prev().find('input[same="layuiTreeCheck"]');t?r.prop("checked",t):(a.find('input[same="layuiTreeCheck"]').each(function(){this.checked&&(i=!0)}),i||r.prop("checked",!1)),l(n)}};l(e),n.renderForm("checkbox")}},b.prototype.checkClick=function(e,a){var n=this,t=n.config,r=e.children("."+p),l=r.children("."+f);l.on("click",'input[same="layuiTreeCheck"]+',function(r){layui.stope(r);var l=i(this).prev(),c=l.prop("checked");l.prop("disabled")||(n.setCheckbox(e,a,l),t.oncheck&&t.oncheck({elem:e,checked:c,data:a}))})},b.prototype.operate=function(e,a){var t=this,r=t.config,l=e.children("."+p),d=l.children("."+f);l.children(".layui-tree-btnGroup").on("click",".layui-icon",function(l){layui.stope(l);var f=i(this).data("type"),b=e.children("."+v),g={data:a,type:f,elem:e};if("add"==f){b[0]||(r.showLine?(d.find("."+o).addClass("layui-tree-icon"),d.find("."+o).children(".layui-icon").addClass(h).removeClass("layui-icon-file")):d.find(".layui-tree-iconArrow").removeClass(c),e.append('
              '));var w=r.operate&&r.operate(g),N={};if(N.title=r.text.defaultNodeName,N.id=w,t.tree(e.children("."+v),[N]),r.showLine)if(b[0])b.hasClass(x)||b.addClass(x),e.find("."+v).each(function(){i(this).children("."+s).last().addClass(k)}),b.children("."+s).last().prev().hasClass(k)?b.children("."+s).last().prev().removeClass(k):b.children("."+s).last().removeClass(k),!e.parent("."+v)[0]&&e.next()[0]&&b.children("."+s).last().removeClass(k);else{var T=e.siblings("."+s),L=1,A=e.parent("."+v);layui.each(T,function(e,a){i(a).children("."+v)[0]||(L=0)}),1==L?(T.children("."+v).addClass(m),T.children("."+v).children("."+s).removeClass(k),e.children("."+v).addClass(m),A.removeClass(x),A.children("."+s).last().children("."+v).children("."+s).last().addClass(k)):e.children("."+v).children("."+s).addClass(k)}if(!r.showCheckbox)return;if(d.find('input[same="layuiTreeCheck"]')[0].checked){var I=e.children("."+v).children("."+s).last();I.find('input[same="layuiTreeCheck"]')[0].checked=!0}t.renderForm("checkbox")}else if("update"==f){var F=d.children("."+y).html();d.children("."+y).html(""),d.append(''),d.children(".layui-tree-editInput").val(F).focus();var j=function(e){var i=e.val().trim();i=i?i:r.text.defaultNodeName,e.remove(),d.children("."+y).html(i),g.data.title=i,r.operate&&r.operate(g)};d.children(".layui-tree-editInput").blur(function(){j(i(this))}),d.children(".layui-tree-editInput").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),j(i(this)))})}else n.confirm('确认删除该节点 "'+(a.title||"")+'" 吗?',function(a){if(r.operate&&r.operate(g),g.status="remove",n.close(a),!e.prev("."+s)[0]&&!e.next("."+s)[0]&&!e.parent("."+v)[0])return e.remove(),void t.elem.append(t.elemNone);if(e.siblings("."+s).children("."+p)[0]){if(r.showCheckbox){var l=function(e){if(e.parents("."+s)[0]){var a=e.siblings("."+s).children("."+p),n=e.parent("."+v).prev(),r=n.find('input[same="layuiTreeCheck"]')[0],c=1,d=0;0==r.checked&&(a.each(function(e,a){var n=i(a).find('input[same="layuiTreeCheck"]')[0];0!=n.checked||n.disabled||(c=0),n.disabled||(d=1)}),1==c&&1==d&&(r.checked=!0,t.renderForm("checkbox"),l(n.parent("."+s))))}};l(e)}if(r.showLine){var d=e.siblings("."+s),h=1,f=e.parent("."+v);layui.each(d,function(e,a){i(a).children("."+v)[0]||(h=0)}),1==h?(b[0]||(f.removeClass(x),d.children("."+v).addClass(m),d.children("."+v).children("."+s).removeClass(k)),e.next()[0]?f.children("."+s).last().children("."+v).children("."+s).last().addClass(k):e.prev().children("."+v).children("."+s).last().addClass(k),e.next()[0]||e.parents("."+s)[1]||e.parents("."+s).eq(0).next()[0]||e.prev("."+s).addClass(k)):!e.next()[0]&&e.hasClass(k)&&e.prev().addClass(k)}}else{var y=e.parent("."+v).prev();if(r.showLine){y.find("."+o).removeClass("layui-tree-icon"),y.find("."+o).children(".layui-icon").removeClass(u).addClass("layui-icon-file");var w=y.parents("."+v).eq(0);w.addClass(x),w.children("."+s).each(function(){i(this).children("."+v).children("."+s).last().addClass(k)})}else y.find(".layui-tree-iconArrow").addClass(c);e.parents("."+s).eq(0).removeClass(C),e.parent("."+v).remove()}e.remove()})})},b.prototype.events=function(){var e=this,a=e.config;e.elem.find(".layui-tree-checkedFirst");e.setChecked(e.checkids),e.elem.find(".layui-tree-search").on("keyup",function(){var n=i(this),t=n.val(),r=n.nextAll(),l=[];r.find("."+y).each(function(){var e=i(this).parents("."+p);if(i(this).html().indexOf(t)!=-1){l.push(i(this).parent());var a=function(e){e.addClass("layui-tree-searchShow"),e.parent("."+v)[0]&&a(e.parent("."+v).parent("."+s))};a(e.parent("."+s))}}),r.find("."+p).each(function(){var e=i(this).parent("."+s);e.hasClass("layui-tree-searchShow")||e.addClass(c)}),0==r.find(".layui-tree-searchShow").length&&e.elem.append(e.elemNone),a.onsearch&&a.onsearch({elem:l})}),e.elem.find(".layui-tree-search").on("keydown",function(){i(this).nextAll().find("."+p).each(function(){var e=i(this).parent("."+s);e.removeClass("layui-tree-searchShow "+c)}),i(".layui-tree-emptyText")[0]&&i(".layui-tree-emptyText").remove()})},b.prototype.getChecked=function(){var e=this,a=e.config,n=[],t=[];e.elem.find(".layui-form-checked").each(function(){n.push(i(this).prev()[0].value)});var r=function(e,a){layui.each(e,function(e,t){layui.each(n,function(e,n){if(t.id==n){var l=i.extend({},t);return delete l.children,a.push(l),t.children&&(l.children=[],r(t.children,l.children)),!0}})})};return r(i.extend({},a.data),t),t},b.prototype.setChecked=function(e){var a=this;a.config;a.elem.find("."+s).each(function(a,n){var t=i(this).data("id"),r=i(n).children("."+p).find('input[same="layuiTreeCheck"]'),l=r.next();if("number"==typeof e){if(t==e)return r[0].checked||l.click(),!1}else"object"==typeof e&&layui.each(e,function(e,i){if(i==t&&!r[0].checked)return l.click(),!0})})},l.that={},l.config={},r.reload=function(e,i){var a=l.that[e];return a.reload(i),l.call(a)},r.getChecked=function(e){var i=l.that[e];return i.getChecked()},r.setChecked=function(e,i){var a=l.that[e];return a.setChecked(i)},r.render=function(e){var i=new b(e);return l.call(i)},e(t,r)});layui.define(["laytpl","form"],function(e){"use strict";var a=layui.$,t=layui.laytpl,n=layui.form,i="transfer",l={config:{},index:layui[i]?layui[i].index+1e4:0,set:function(e){var t=this;return t.config=a.extend({},t.config,e),t},on:function(e,a){return layui.onevent.call(this,i,e,a)}},r=function(){var e=this,a=e.config,t=a.id||e.index;return r.that[t]=e,r.config[t]=a,{config:a,reload:function(a){e.reload.call(e,a)},getData:function(){return e.getData.call(e)}}},c="layui-hide",o="layui-btn-disabled",d="layui-none",s="layui-transfer-box",u="layui-transfer-header",h="layui-transfer-search",f="layui-transfer-active",y="layui-transfer-data",p=function(e){return e=e||{},['
              ','
              ','","
              ","{{# if(d.data.showSearch){ }}",'","{{# } }}",'
                ',"
                "].join("")},v=['
                ',p({index:0,checkAllName:"layTransferLeftCheckAll"}),'
                ','",'","
                ",p({index:1,checkAllName:"layTransferRightCheckAll"}),"
                "].join(""),x=function(e){var t=this;t.index=++l.index,t.config=a.extend({},t.config,l.config,e),t.render()};x.prototype.config={title:["列表一","列表二"],width:200,height:360,data:[],value:[],showSearch:!1,id:"",text:{none:"无数据",searchNone:"无匹配数据"}},x.prototype.reload=function(e){var t=this;layui.each(e,function(e,a){a.constructor===Array&&delete t.config[e]}),t.config=a.extend(!0,{},t.config,e),t.render()},x.prototype.render=function(){var e=this,n=e.config,i=e.elem=a(t(v).render({data:n,index:e.index})),l=n.elem=a(n.elem);l[0]&&(n.data=n.data||[],n.value=n.value||[],e.key=n.id||e.index,l.html(e.elem),e.layBox=e.elem.find("."+s),e.layHeader=e.elem.find("."+u),e.laySearch=e.elem.find("."+h),e.layData=i.find("."+y),e.layBtn=i.find("."+f+" .layui-btn"),e.layBox.css({width:n.width,height:n.height}),e.layData.css({height:function(){return n.height-e.layHeader.outerHeight()-e.laySearch.outerHeight()-2}()}),e.renderData(),e.events())},x.prototype.renderData=function(){var e=this,a=(e.config,[{checkName:"layTransferLeftCheck",views:[]},{checkName:"layTransferRightCheck",views:[]}]);e.parseData(function(e){var t=e.selected?1:0,n=["
              • ",'',"
              • "].join("");a[t].views.push(n),delete e.selected}),e.layData.eq(0).html(a[0].views.join("")),e.layData.eq(1).html(a[1].views.join("")),e.renderCheckBtn()},x.prototype.renderForm=function(e){n.render(e,"LAY-transfer-"+this.index)},x.prototype.renderCheckBtn=function(e){var t=this,n=t.config;e=e||{},t.layBox.each(function(i){var l=a(this),r=l.find("."+y),d=l.find("."+u).find('input[type="checkbox"]'),s=r.find('input[type="checkbox"]'),h=0,f=!1;if(s.each(function(){var e=a(this).data("hide");(this.checked||this.disabled||e)&&h++,this.checked&&!e&&(f=!0)}),d.prop("checked",f&&h===s.length),t.layBtn.eq(i)[f?"removeClass":"addClass"](o),!e.stopNone){var p=r.children("li:not(."+c+")").length;t.noneView(r,p?"":n.text.none)}}),t.renderForm("checkbox")},x.prototype.noneView=function(e,t){var n=a('

                '+(t||"")+"

                ");e.find("."+d)[0]&&e.find("."+d).remove(),t.replace(/\s/g,"")&&e.append(n)},x.prototype.setValue=function(){var e=this,t=e.config,n=[];return e.layBox.eq(1).find("."+y+' input[type="checkbox"]').each(function(){var e=a(this).data("hide");e||n.push(this.value)}),t.value=n,e},x.prototype.parseData=function(e){var t=this,n=t.config,i=[];return layui.each(n.data,function(t,l){l=("function"==typeof n.parseData?n.parseData(l):l)||l,i.push(l=a.extend({},l)),layui.each(n.value,function(e,a){a==l.value&&(l.selected=!0)}),e&&e(l)}),n.data=i,t},x.prototype.getData=function(e){var a=this,t=a.config,n=[];return a.setValue(),layui.each(e||t.value,function(e,a){layui.each(t.data,function(e,t){delete t.selected,a==t.value&&n.push(t)})}),n},x.prototype.events=function(){var e=this,t=e.config;e.elem.on("click",'input[lay-filter="layTransferCheckbox"]+',function(){var t=a(this).prev(),n=t[0].checked,i=t.parents("."+s).eq(0).find("."+y);t[0].disabled||("all"===t.attr("lay-type")&&i.find('input[type="checkbox"]').each(function(){this.disabled||(this.checked=n)}),e.renderCheckBtn({stopNone:!0}))}),e.layBtn.on("click",function(){var n=a(this),i=n.data("index"),l=e.layBox.eq(i),r=[];if(!n.hasClass(o)){e.layBox.eq(i).each(function(t){var n=a(this),i=n.find("."+y);i.children("li").each(function(){var t=a(this),n=t.find('input[type="checkbox"]'),i=n.data("hide");n[0].checked&&!i&&(n[0].checked=!1,l.siblings("."+s).find("."+y).append(t.clone()),t.remove(),r.push(n[0].value)),e.setValue()})}),e.renderCheckBtn();var c=l.siblings("."+s).find("."+h+" input");""===c.val()||c.trigger("keyup"),t.onchange&&t.onchange(e.getData(r),i)}}),e.laySearch.find("input").on("keyup",function(){var n=this.value,i=a(this).parents("."+h).eq(0).siblings("."+y),l=i.children("li");l.each(function(){var e=a(this),t=e.find('input[type="checkbox"]'),i=t[0].title.indexOf(n)!==-1;e[i?"removeClass":"addClass"](c),t.data("hide",!i)}),e.renderCheckBtn();var r=l.length===i.children("li."+c).length;e.noneView(i,r?t.text.searchNone:"")})},r.that={},r.config={},l.reload=function(e,a){var t=r.that[e];return t.reload(a),r.call(t)},l.getData=function(e){var a=r.that[e];return a.getData()},l.render=function(e){var a=new x(e);return r.call(a)},e(i,l)});layui.define(["laytpl","laypage","layer","form","util"],function(e){"use strict";var t=layui.$,i=layui.laytpl,a=layui.laypage,l=layui.layer,n=layui.form,o=(layui.util,layui.hint()),r=layui.device(),d={config:{checkName:"LAY_CHECKED",indexName:"LAY_TABLE_INDEX"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,y,e,t)}},c=function(){var e=this,t=e.config,i=t.id||t.index;return i&&(c.that[i]=e,c.config[i]=t),{config:t,reload:function(t){e.reload.call(e,t)},setColsWidth:function(){e.setColsWidth.call(e)},resize:function(){e.resize.call(e)}}},s=function(e){var t=c.config[e];return t||o.error("The ID option was not found in the table instance"),t||null},u=function(e,a,l,n){var o=e.templet?function(){return"function"==typeof e.templet?e.templet(l):i(t(e.templet).html()||String(a)).render(l)}():a;return n?t("
                "+o+"
                ").text():o},y="table",h=".layui-table",f="layui-hide",p="layui-none",v="layui-table-view",m=".layui-table-tool",g=".layui-table-box",b=".layui-table-init",x=".layui-table-header",k=".layui-table-body",C=".layui-table-main",w=".layui-table-fixed",T=".layui-table-fixed-l",A=".layui-table-fixed-r",L=".layui-table-total",N=".layui-table-page",S=".layui-table-sort",R="layui-table-edit",W="layui-table-hover",_=function(e){var t='{{#if(item2.colspan){}} colspan="{{item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{item2.rowspan}}"{{#}}}';return e=e||{},['',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',function(){return e.fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':""}(),"{{# var isSort = !(item2.colGroup) && item2.sort; }}",'",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
                ','
                ','{{# if(item2.type === "checkbox"){ }}','',"{{# } else { }}",'{{item2.title||""}}',"{{# if(isSort){ }}",'',"{{# } }}","{{# } }}","
                ","
                "].join("")},E=['',"","
                "].join(""),z=['
                ',"{{# if(d.data.toolbar){ }}",'
                ','
                ','
                ',"
                ","{{# } }}",'
                ',"{{# if(d.data.loading){ }}",'
                ','',"
                ","{{# } }}","{{# var left, right; }}",'
                ',_(),"
                ",'
                ',E,"
                ","{{# if(left){ }}",'
                ','
                ',_({fixed:!0}),"
                ",'
                ',E,"
                ","
                ","{{# }; }}","{{# if(right){ }}",'
                ','
                ',_({fixed:"right"}),'
                ',"
                ",'
                ',E,"
                ","
                ","{{# }; }}","
                ","{{# if(d.data.totalRow){ }}",'
                ','','',"
                ","
                ","{{# } }}","{{# if(d.data.page){ }}",'
                ','
                ',"
                ","{{# } }}","","
                "].join(""),H=t(window),j=t(document),F=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};F.prototype.config={limit:10,loading:!0,cellMinWidth:60,defaultToolbar:["filter","exports","print"],autoSort:!0,text:{none:"无数据"}},F.prototype.render=function(){var e=this,a=e.config;if(a.elem=t(a.elem),a.where=a.where||{},a.id=a.id||a.elem.attr("id")||e.index,a.request=t.extend({pageName:"page",limitName:"limit"},a.request),a.response=t.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",totalRowName:"totalRow",countName:"count"},a.response),"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,e.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return e;a.height&&/^full-\d+$/.test(a.height)&&(e.fullHeightGap=a.height.split("-")[1],a.height=H.height()-e.fullHeightGap),e.setInit();var l=a.elem,n=l.next("."+v),o=e.elem=t(i(z).render({VIEW_CLASS:v,data:a,index:e.index}));if(a.index=e.index,e.key=a.id||a.index,n[0]&&n.remove(),l.after(o),e.layTool=o.find(m),e.layBox=o.find(g),e.layHeader=o.find(x),e.layMain=o.find(C),e.layBody=o.find(k),e.layFixed=o.find(w),e.layFixLeft=o.find(T),e.layFixRight=o.find(A),e.layTotal=o.find(L),e.layPage=o.find(N),e.renderToolbar(),e.fullSize(),a.cols.length>1){var r=e.layFixed.find(x).find("th");r.height(e.layHeader.height()-1-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom")))}e.pullData(e.page),e.events()},F.prototype.initOpts=function(e){var t=this,i=(t.config,{checkbox:48,radio:48,space:15,numbers:40});e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||i[e.type])},F.prototype.setInit=function(e){var t=this,i=t.config;return i.clientWidth=i.width||function(){var e=function(t){var a,l;t=t||i.elem.parent(),a=t.width();try{l="none"===t.css("display")}catch(n){}return!t[0]||a&&!l?a:e(t.parent())};return e()}(),"width"===e?i.clientWidth:void layui.each(i.cols,function(e,a){layui.each(a,function(l,n){if(!n)return void a.splice(l,1);if(n.key=e+"-"+l,n.hide=n.hide||!1,n.colGroup||n.colspan>1){var o=0;layui.each(i.cols[e+1],function(t,i){i.HAS_PARENT||o>1&&o==n.colspan||(i.HAS_PARENT=!0,i.parentKey=e+"-"+l,o+=parseInt(i.colspan>1?i.colspan:1))}),n.colGroup=!0}t.initOpts(n)})})},F.prototype.renderToolbar=function(){var e=this,a=e.config,l=['
                ','
                ','
                '].join(""),n=e.layTool.find(".layui-table-tool-temp");if("default"===a.toolbar)n.html(l);else if("string"==typeof a.toolbar){var o=t(a.toolbar).html()||"";o&&n.html(i(o).render(a))}var r={filter:{title:"筛选列",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols"},exports:{title:"导出",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export"},print:{title:"打印",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print"}},d=[];"object"==typeof a.defaultToolbar&&layui.each(a.defaultToolbar,function(e,t){var i="string"==typeof t?r[t]:t;i&&d.push('
                ')}),e.layTool.find(".layui-table-tool-self").html(d.join(""))},F.prototype.setParentCol=function(e,t){var i=this,a=i.config,l=i.layHeader.find('th[data-key="'+a.index+"-"+t+'"]'),n=parseInt(l.attr("colspan"))||0;if(l[0]){var o=t.split("-"),r=a.cols[o[0]][o[1]];e?n--:n++,l.attr("colspan",n),l[n<1?"addClass":"removeClass"](f),r.colspan=n,r.hide=n<1;var d=l.data("parentkey");d&&i.setParentCol(e,d)}},F.prototype.setColsPatch=function(){var e=this,t=e.config;layui.each(t.cols,function(t,i){layui.each(i,function(t,i){i.hide&&e.setParentCol(i.hide,i.parentKey)})})},F.prototype.setColsWidth=function(){var e=this,t=e.config,i=0,a=0,l=0,n=0,o=e.setInit("width");e.eachCols(function(e,t){t.hide||i++}),o=o-function(){return"line"===t.skin||"nob"===t.skin?2:i+1}()-e.getScrollWidth(e.layMain[0])-1;var r=function(e){layui.each(t.cols,function(i,r){layui.each(r,function(i,d){var c=0,s=d.minWidth||t.cellMinWidth;return d?void(d.colGroup||d.hide||(e?l&&ln&&a&&(l=(o-n)/a)};r(),r(!0),e.autoColNums=a,e.eachCols(function(i,a){var n=a.minWidth||t.cellMinWidth;a.colGroup||a.hide||(0===a.width?e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(l>=n?l:n)+"px"}):/\d+%$/.test(a.width)&&e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(parseFloat(a.width)/100*o)+"px"}))});var d=e.layMain.width()-e.getScrollWidth(e.layMain[0])-e.layMain.children("table").outerWidth();if(e.autoColNums&&d>=-i&&d<=i){var c=function(t){var i;return t=t||e.layHeader.eq(0).find("thead th:last-child"),i=t.data("field"),!i&&t.prev()[0]?c(t.prev()):t},s=c(),u=s.data("key");e.getCssRule(u,function(t){var i=t.style.width||s.outerWidth();t.style.width=parseFloat(i)+d+"px",e.layMain.height()-e.layMain.prop("clientHeight")>0&&(t.style.width=parseFloat(t.style.width)-1+"px")})}e.loading(!0)},F.prototype.resize=function(){var e=this;e.fullSize(),e.setColsWidth(),e.scrollPatch()},F.prototype.reload=function(e){var i=this;e=e||{},delete i.haveInit,e.data&&e.data.constructor===Array&&delete i.config.data,i.config=t.extend(!0,{},i.config,e),i.render()},F.prototype.errorView=function(e){var i=this,a=i.layMain.find("."+p),l=t('
                '+(e||"Error")+"
                ");a[0]&&(i.layNone.remove(),a.remove()),i.layFixed.addClass(f),i.layMain.find("tbody").html(""),i.layMain.append(i.layNone=l),d.cache[i.key]=[]},F.prototype.page=1,F.prototype.pullData=function(e){var i=this,a=i.config,l=a.request,n=a.response,o=function(){"object"==typeof a.initSort&&i.sort(a.initSort.field,a.initSort.type)};if(i.startTime=(new Date).getTime(),a.url){var r={};r[l.pageName]=e,r[l.limitName]=a.limit;var d=t.extend(r,a.where);a.contentType&&0==a.contentType.indexOf("application/json")&&(d=JSON.stringify(d)),i.loading(),t.ajax({type:a.method||"get",url:a.url,contentType:a.contentType,data:d,dataType:"json",headers:a.headers||{},success:function(t){"function"==typeof a.parseData&&(t=a.parseData(t)||t),t[n.statusName]!=n.statusCode?(i.renderForm(),i.errorView(t[n.msgName]||'返回的数据不符合规范,正确的成功状态码应为:"'+n.statusName+'": '+n.statusCode)):(i.renderData(t,e,t[n.countName]),o(),a.time=(new Date).getTime()-i.startTime+" ms"),i.setColsWidth(),"function"==typeof a.done&&a.done(t,e,t[n.countName])},error:function(e,t){i.errorView("数据接口请求异常:"+t),i.renderForm(),i.setColsWidth()}})}else if(a.data&&a.data.constructor===Array){var c={},s=e*a.limit-a.limit;c[n.dataName]=a.data.concat().splice(s,a.limit),c[n.countName]=a.data.length,"object"==typeof a.totalRow&&(c[n.totalRowName]=t.extend({},a.totalRow)),i.renderData(c,e,c[n.countName]),o(),i.setColsWidth(),"function"==typeof a.done&&a.done(c,e,c[n.countName])}},F.prototype.eachCols=function(e){var t=this;return d.eachCols(null,e,t.config.cols),t},F.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,y=e[s.response.dataName]||[],h=e[s.response.totalRowName],v=[],m=[],g=[],b=function(){var e;return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(y,function(a,l){var o=[],y=[],h=[],p=a+s.limit*(n-1)+1;0!==l.length&&(r||(l[d.config.indexName]=a),c.eachCols(function(n,r){var c=r.field||n,v=s.index+"-"+r.key,m=l[c];if(void 0!==m&&null!==m||(m=""),!r.colGroup){var g=['','
                '+function(){var n=t.extend(!0,{LAY_INDEX:p},l),o=d.config.checkName;switch(r.type){case"checkbox":return'";case"radio":return n[o]&&(e=a),'';case"numbers":return p}return r.toolbar?i(t(r.toolbar).html()||"").render(n):u(r,m,n)}(),"
                "].join("");o.push(g),r.fixed&&"right"!==r.fixed&&y.push(g),"right"===r.fixed&&h.push(g)}}),v.push(''+o.join("")+""),m.push(''+y.join("")+""),g.push(''+h.join("")+""))}),c.layBody.scrollTop(0),c.layMain.find("."+p).remove(),c.layMain.find("tbody").html(v.join("")),c.layFixLeft.find("tbody").html(m.join("")),c.layFixRight.find("tbody").html(g.join("")),c.renderForm(),"number"==typeof e&&c.setThisRowChecked(e),c.syncCheckAll(),c.haveInit?c.scrollPatch():setTimeout(function(){c.scrollPatch()},50),c.haveInit=!0,l.close(c.tipsIndex),s.HAS_SET_COLS_PATCH||c.setColsPatch(),void(s.HAS_SET_COLS_PATCH=!0))};return d.cache[c.key]=y,c.layPage[0==o||0===y.length&&1==n?"addClass":"removeClass"](f),r?b():0===y.length?(c.renderForm(),c.errorView(s.text.none)):(c.layFixed.removeClass(f),b(),c.renderTotal(y,h),void(s.page&&(s.page=t.extend({elem:"layui-table-page"+s.index,count:o,limit:s.limit,limits:s.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(c.page=e.curr,s.limit=e.limit,c.pullData(e.curr))}},s.page),s.page.count=o,a.render(s.page))))},F.prototype.renderTotal=function(e,t){var i=this,a=i.config,l={};if(a.totalRow){layui.each(e,function(e,t){0!==t.length&&i.eachCols(function(e,i){var a=i.field||e,n=t[a];i.totalRow&&(l[a]=(l[a]||0)+(parseFloat(n)||0))})}),i.dataTotal={};var n=[];i.eachCols(function(e,o){var r=o.field||e,d=function(){var e=o.totalRowText||"",i=parseFloat(l[r]).toFixed(2),a={};return a[r]=i,i=u(o,i,a),t?t[o.field]||e:o.totalRow?i||e:e}(),c=['','
                '+d,"
                "].join("");o.field&&(i.dataTotal[r]=d),n.push(c)}),i.layTotal.find("tbody").html(""+n.join("")+"")}},F.prototype.getColElem=function(e,t){var i=this,a=i.config;return e.eq(0).find(".laytable-cell-"+(a.index+"-"+t)+":eq(0)")},F.prototype.renderForm=function(e){n.render(e,"LAY-table-"+this.index)},F.prototype.setThisRowChecked=function(e){var t=this,i=(t.config,"layui-table-click"),a=t.layBody.find('tr[data-index="'+e+'"]');a.addClass(i).siblings("tr").removeClass(i)},F.prototype.sort=function(e,i,a,l){var n,r,c=this,s={},u=c.config,h=u.elem.attr("lay-filter"),f=d.cache[c.key];"string"==typeof e&&c.layHeader.find("th").each(function(i,a){var l=t(this),o=l.data("field");if(o===e)return e=l,n=o,!1});try{var n=n||e.data("field"),p=e.data("key");if(c.sortKey&&!a&&n===c.sortKey.field&&i===c.sortKey.sort)return;var v=c.layHeader.find("th .laytable-cell-"+p).find(S);c.layHeader.find("th").find(S).removeAttr("lay-sort"),v.attr("lay-sort",i||null),c.layFixed.find("th")}catch(m){return o.error("Table modules: Did not match to field")}c.sortKey={field:n,sort:i},u.autoSort&&("asc"===i?r=layui.sort(f,n):"desc"===i?r=layui.sort(f,n,!0):(r=layui.sort(f,d.config.indexName),delete c.sortKey)),s[u.response.dataName]=r||f,c.renderData(s,c.page,c.count,!0),l&&layui.event.call(e,y,"sort("+h+")",{field:n,type:i})},F.prototype.loading=function(e){var i=this,a=i.config;a.loading&&(e?(i.layInit&&i.layInit.remove(),delete i.layInit,i.layBox.find(b).remove()):(i.layInit=t(['
                ','',"
                "].join("")),i.layBox.append(i.layInit)))},F.prototype.setCheckData=function(e,t){var i=this,a=i.config,l=d.cache[i.key];l[e]&&l[e].constructor!==Array&&(l[e][a.checkName]=t)},F.prototype.syncCheckAll=function(){var e=this,t=e.config,i=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(i){return e.eachCols(function(e,a){"checkbox"===a.type&&(a[t.checkName]=i)}),i};i[0]&&(d.checkStatus(e.key).isAll?(i[0].checked||(i.prop("checked",!0),e.renderForm("checkbox")),a(!0)):(i[0].checked&&(i.prop("checked",!1),e.renderForm("checkbox")),a(!1)))},F.prototype.getCssRule=function(e,t){var i=this,a=i.elem.find("style")[0],l=a.sheet||a.styleSheet||{},n=l.cssRules||l.rules;layui.each(n,function(i,a){if(a.selectorText===".laytable-cell-"+e)return t(a),!0})},F.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=H.height()-t.fullHeightGap,a<135&&(a=135),t.elem.css("height",a)),a&&(e=parseFloat(a)-(t.layHeader.outerHeight()||38),i.toolbar&&(e-=t.layTool.outerHeight()||50),i.totalRow&&(e-=t.layTotal.outerHeight()||40),i.page&&(e-=t.layPage.outerHeight()||41),t.layMain.css("height",e-2))},F.prototype.getScrollWidth=function(e){var t=0;return e?t=e.offsetWidth-e.clientWidth:(e=document.createElement("div"),e.style.width="100px",e.style.height="100px",e.style.overflowY="scroll",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},F.prototype.scrollPatch=function(){var e=this,i=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),l=e.layMain.height()-e.layMain.prop("clientHeight"),n=(e.getScrollWidth(e.layMain[0]),i.outerWidth()-e.layMain.width()),o=function(e){if(a&&l){if(e=e.eq(0),!e.find(".layui-table-patch")[0]){var i=t('
                ');i.find("div").css({width:a}),e.find("tr").append(i)}}else e.find(".layui-table-patch").remove()};o(e.layHeader),o(e.layTotal);var r=e.layMain.height(),d=r-l;e.layFixed.find(k).css("height",i.height()>=d?d:"auto"),e.layFixRight[n>0?"removeClass":"addClass"](f),e.layFixRight.css("right",a-1)},F.prototype.events=function(){var e,i=this,a=i.config,o=t("body"),c={},s=i.layHeader.find("th"),h=".layui-table-cell",p=a.elem.attr("lay-filter");i.layTool.on("click","*[lay-event]",function(e){var o=t(this),c=o.attr("lay-event"),s=function(e){var l=t(e.list),n=t('
                  ');n.html(l),a.height&&n.css("max-height",a.height-(i.layTool.outerHeight()||50)),o.find(".layui-table-tool-panel")[0]||o.append(n),i.renderForm(),n.on("click",function(e){layui.stope(e)}),e.done&&e.done(n,l)};switch(layui.stope(e),j.trigger("table.tool.panel.remove"),l.close(i.tipsIndex),c){case"LAYTABLE_COLS":s({list:function(){var e=[];return i.eachCols(function(t,i){i.field&&"normal"==i.type&&e.push('
                • ')}),e.join("")}(),done:function(){n.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var l=t(e.elem),n=this.checked,o=l.data("key"),r=l.data("parentkey");layui.each(a.cols,function(e,t){layui.each(t,function(t,l){if(e+"-"+t===o){var d=l.hide;l.hide=!n,i.elem.find('*[data-key="'+a.index+"-"+o+'"]')[n?"removeClass":"addClass"](f),d!=l.hide&&i.setParentCol(!n,r),i.resize()}})})})}});break;case"LAYTABLE_EXPORT":r.ie?l.tips("导出功能不支持 IE,请用 Chrome 等高级浏览器导出",this,{tips:3}):s({list:function(){return['
                • 导出到 Csv 文件
                • ','
                • 导出到 Excel 文件
                • '].join("")}(),done:function(e,l){l.on("click",function(){var e=t(this).data("type");d.exportFile.call(i,a.id,null,e)})}});break;case"LAYTABLE_PRINT":var u=window.open("打印窗口","_blank"),h=[""].join(""),v=t(i.layHeader.html());v.append(i.layMain.find("table").html()),v.append(i.layTotal.find("table").html()),v.find("th.layui-table-patch").remove(),v.find(".layui-table-col-special").remove(),u.document.write(h+v.prop("outerHTML")),u.document.close(),u.print(),u.close()}layui.event.call(this,y,"toolbar("+p+")",t.extend({event:c,config:a},{}))}),s.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;i.data("unresize")||c.resizeStart||(c.allowResize=i.width()-l<=10,o.css("cursor",c.allowResize?"col-resize":""))}).on("mouseleave",function(){t(this);c.resizeStart||o.css("cursor","")}).on("mousedown",function(e){var l=t(this);if(c.allowResize){var n=l.data("key");e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],i.getCssRule(n,function(e){var t=e.style.width||l.outerWidth();c.rule=e,c.ruleWidth=parseFloat(t),c.minWidth=l.data("minwidth")||a.cellMinWidth})}}),j.on("mousemove",function(t){if(c.resizeStart){if(t.preventDefault(),c.rule){var a=c.ruleWidth+t.clientX-c.offset[0];a');return n[0].value=i.data("content")||l.text(),i.find("."+R)[0]||i.append(n),n.focus(),void layui.stope(e)}}).on("mouseenter","td",function(){b.call(this)}).on("mouseleave","td",function(){b.call(this,"hide")});var g="layui-table-grid-down",b=function(e){var i=t(this),a=i.children(h);if(!i.data("off"))if(e)i.find(".layui-table-grid-down").remove();else if(a.prop("scrollWidth")>a.outerWidth()){if(a.find("."+g)[0])return;i.append('
                  ')}};i.layBody.on("click","."+g,function(e){var n=t(this),o=n.parent(),d=o.children(h);i.tipsIndex=l.tips(['
                  ',d.html(),"
                  ",''].join(""),d[0],{tips:[3,""],time:-1,anim:-1,maxWidth:r.ios||r.android?300:i.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){l.close(t)})}}),layui.stope(e)}),i.layBody.on("click","*[lay-event]",function(){var e=t(this),a=e.parents("tr").eq(0).data("index");layui.event.call(this,y,"tool("+p+")",v.call(this,{event:e.attr("lay-event")})),i.setThisRowChecked(a)}),i.layMain.on("scroll",function(){var e=t(this),a=e.scrollLeft(),n=e.scrollTop();i.layHeader.scrollLeft(a),i.layTotal.scrollLeft(a),i.layFixed.find(k).scrollTop(n),l.close(i.tipsIndex)}),H.on("resize",function(){i.resize()})},function(){j.on("click",function(){j.trigger("table.remove.tool.panel")}),j.on("table.remove.tool.panel",function(){t(".layui-table-tool-panel").remove()})}(),d.init=function(e,i){i=i||{};var a=this,l=t(e?'table[lay-filter="'+e+'"]':h+"[lay-data]"),n="Table element property lay-data configuration item has a syntax error: ";return l.each(function(){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){o.error(n+l)}var c=[],s=t.extend({elem:this,cols:[],data:[],skin:a.attr("lay-skin"),size:a.attr("lay-size"),even:"string"==typeof a.attr("lay-even")},d.config,i,l);e&&a.hide(),a.find("thead>tr").each(function(e){s.cols[e]=[],t(this).children().each(function(i){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){return o.error(n+l)}var d=t.extend({title:a.text(),colspan:a.attr("colspan")||0,rowspan:a.attr("rowspan")||0},l);d.colspan<2&&c.push(d),s.cols[e].push(d)})}),a.find("tbody>tr").each(function(e){var i=t(this),a={};i.children("td").each(function(e,i){var l=t(this),n=l.data("field");if(n)return a[n]=l.html()}),layui.each(c,function(e,t){var l=i.children("td").eq(e);a[t.field]=l.html()}),s.data[e]=a}),d.render(s)}),a},c.that={},c.config={},d.eachCols=function(e,i,a){var l=c.config[e]||{},n=[],o=0;a=t.extend(!0,[],a||l.cols),layui.each(a,function(e,t){layui.each(t,function(t,i){if(i.colGroup){var l=0;o++,i.CHILD_COLS=[],layui.each(a[e+1],function(e,t){t.PARENT_COL_INDEX||l>1&&l==i.colspan||(t.PARENT_COL_INDEX=o,i.CHILD_COLS.push(t),l+=parseInt(t.colspan>1?t.colspan:1))})}i.PARENT_COL_INDEX||n.push(i)})});var r=function(e){layui.each(e||n,function(e,t){return t.CHILD_COLS?r(t.CHILD_COLS):void("function"==typeof i&&i(e,t))})};r()},d.checkStatus=function(e){var t=0,i=0,a=[],l=d.cache[e]||[];return layui.each(l,function(e,l){return l.constructor===Array?void i++:void(l[d.config.checkName]&&(t++,a.push(d.clearCacheKey(l))))}),{data:a,isAll:!!l.length&&t===l.length-i}},d.exportFile=function(e,t,i){var a=this;t=t||d.clearCacheKey(d.cache[e]),i=i||"csv";var l=c.config[e]||{},n={csv:"text/csv",xls:"application/vnd.ms-excel"}[i],s=document.createElement("a");return r.ie?o.error("IE_NOT_SUPPORT_EXPORTS"):(s.href="data:"+n+";charset=utf-8,\ufeff"+encodeURIComponent(function(){var i=[],l=[],n=[];return layui.each(t,function(t,a){var n=[];"object"==typeof e?(layui.each(e,function(e,a){0==t&&i.push(a||"")}),layui.each(d.clearCacheKey(a),function(e,t){n.push('"'+(t||"")+'"')})):d.eachCols(e,function(e,l){if(l.field&&"normal"==l.type&&!l.hide){var o=a[l.field];void 0!==o&&null!==o||(o=""),0==t&&i.push(l.title||""),n.push('"'+u(l,o,a,"text")+'"')}}),l.push(n.join(","))}),layui.each(a.dataTotal,function(e,t){n.push(t)}),i.join(",")+"\r\n"+l.join("\r\n")+"\r\n"+n.join(",")}()),s.download=(l.title||"table_"+(l.index||""))+"."+i,document.body.appendChild(s),s.click(),void document.body.removeChild(s))},d.resize=function(e){if(e){var t=s(e);if(!t)return;c.that[e].resize()}else layui.each(c.that,function(){this.resize()})},d.reload=function(e,t){var i=s(e);if(i){var a=c.that[e];return a.reload(t),c.call(a)}},d.render=function(e){var t=new F(e);return c.call(t)},d.clearCacheKey=function(e){return e=t.extend({},e),delete e[d.config.checkName],delete e[d.config.indexName],e},d.init(),e(y,d)});layui.define("jquery",function(e){"use strict";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t="carousel",a="layui-this",l=">*[carousel-item]>*",o="layui-carousel-left",r="layui-carousel-right",d="layui-carousel-prev",s="layui-carousel-next",u="layui-carousel-arrow",c="layui-carousel-ind",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(a),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(clearInterval(e.timer),e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['",'"].join(""));n.elem.attr("lay-arrow",n.arrow),n.elem.find("."+u)[0]&&n.elem.find("."+u).remove(),n.elem.append(t),t.on("click",function(){var n=i(this),t=n.attr("lay-type");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['
                    ',function(){var i=[];return layui.each(e.elemItem,function(e){i.push("")}),i.join("")}(),"
                  "].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+c)[0]&&n.elem.find("."+c).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-(t.height()/2)),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide("add",a-n.index):a",u=1;u<=i.length;u++){var r='
                • ";i.half&&parseInt(i.value)!==i.value&&u==Math.ceil(i.value)?n=n+'
                • ":n+=r}n+=""+(i.text?''+i.value+"星":"")+"";var c=i.elem,f=c.next("."+t);f[0]&&f.remove(),e.elemTemp=a(n),i.span=e.elemTemp.next("span"),i.setText&&i.setText(i.value),c.html(e.elemTemp),c.addClass("layui-inline"),i.readonly||e.action()},v.prototype.setvalue=function(e){var a=this,i=a.config;i.value=e,a.render()},v.prototype.action=function(){var e=this,i=e.config,l=e.elemTemp,n=l.find("i").width();l.children("li").each(function(e){var t=e+1,v=a(this);v.on("click",function(e){if(i.value=t,i.half){var o=e.pageX-a(this).offset().left;o<=n/2&&(i.value=i.value-.5)}i.text&&l.next("span").text(i.value+"星"),i.choose&&i.choose(i.value),i.setText&&i.setText(i.value)}),v.on("mousemove",function(e){if(l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+t+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half){var c=e.pageX-a(this).offset().left;c<=n/2&&v.children("i").addClass(u).removeClass(s)}}),v.on("mouseleave",function(){l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+Math.floor(i.value)+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half&&parseInt(i.value)!==i.value&&l.children("li:eq("+Math.floor(i.value)+")").children("i").addClass(u).removeClass(c)})})},v.prototype.events=function(){var e=this;e.config},i.render=function(e){var a=new v(e);return l.call(a)},e(n,i)});layui.define("jquery",function(e){"use strict";var t=layui.$,i={fixbar:function(e){var i,n,a="layui-fixbar",o="layui-fixbar-top",r=t(document),l=t("body");e=t.extend({showHeight:200},e),e.bar1=e.bar1===!0?"":e.bar1,e.bar2=e.bar2===!0?"":e.bar2,e.bgcolor=e.bgcolor?"background-color:"+e.bgcolor:"";var c=[e.bar1,e.bar2,""],u=t(['
                    ',e.bar1?'
                  • '+c[0]+"
                  • ":"",e.bar2?'
                  • '+c[1]+"
                  • ":"",'
                  • '+c[2]+"
                  • ","
                  "].join("")),g=u.find("."+o),s=function(){var t=r.scrollTop();t>=e.showHeight?i||(g.show(),i=1):i&&(g.hide(),i=0)};t("."+a)[0]||("object"==typeof e.css&&u.css(e.css),l.append(u),s(),u.find("li").on("click",function(){var i=t(this),n=i.attr("lay-type");"top"===n&&t("html,body").animate({scrollTop:0},200),e.click&&e.click.call(this,n)}),r.on("scroll",function(){clearTimeout(n),n=setTimeout(function(){s()},100)}))},countdown:function(e,t,i){var n=this,a="function"==typeof t,o=new Date(e).getTime(),r=new Date(!t||a?(new Date).getTime():t).getTime(),l=o-r,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];a&&(i=t);var u=setTimeout(function(){n.countdown(e,r+1e3,i)},1e3);return i&&i(l>0?c:[0,0,0,0],t,u),l<=0&&clearTimeout(u),u},timeAgo:function(e,t){var i=this,n=[[],[]],a=(new Date).getTime()-new Date(e).getTime();return a>26784e5?(a=new Date(e),n[0][0]=i.digit(a.getFullYear(),4),n[0][1]=i.digit(a.getMonth()+1),n[0][2]=i.digit(a.getDate()),t||(n[1][0]=i.digit(a.getHours()),n[1][1]=i.digit(a.getMinutes()),n[1][2]=i.digit(a.getSeconds())),n[0].join("-")+" "+n[1].join(":")):a>=864e5?(a/1e3/60/60/24|0)+"天前":a>=36e5?(a/1e3/60/60|0)+"小时前":a>=18e4?(a/1e3/60|0)+"分钟前":a<0?"未来":"刚刚"},digit:function(e,t){var i="";e=String(e),t=t||2;for(var n=e.length;n/g,">").replace(/'/g,"'").replace(/"/g,""")},event:function(e,n,a){var o=t("body");return a=a||"click",n=i.event[e]=t.extend(!0,i.event[e],n)||{},i.event.UTIL_EVENT_CALLBACK=i.event.UTIL_EVENT_CALLBACK||{},o.off(a,"*["+e+"]",i.event.UTIL_EVENT_CALLBACK[e]),i.event.UTIL_EVENT_CALLBACK[e]=function(){var i=t(this),a=i.attr(e);"function"==typeof n[a]&&n[a].call(this,i)},o.on(a,"*["+e+"]",i.event.UTIL_EVENT_CALLBACK[e]),n}};!function(e,t,i){"$:nomunge";function n(){a=t[l](function(){o.each(function(){var t=e(this),i=t.width(),n=t.height(),a=e.data(this,u);(i!==a.w||n!==a.h)&&t.trigger(c,[a.w=i,a.h=n])}),n()},r[g])}var a,o=e([]),r=e.resize=e.extend(e.resize,{}),l="setTimeout",c="resize",u=c+"-special-event",g="delay",s="throttleWindow";r[g]=250,r[s]=!0,e.event.special[c]={setup:function(){if(!r[s]&&this[l])return!1;var t=e(this);o=o.add(t),e.data(this,u,{w:t.width(),h:t.height()}),1===o.length&&n()},teardown:function(){if(!r[s]&&this[l])return!1;var t=e(this);o=o.not(t),t.removeData(u),o.length||clearTimeout(a)},add:function(t){function n(t,n,o){var r=e(this),l=e.data(this,u)||{};l.w=n!==i?n:r.width(),l.h=o!==i?o:r.height(),a.apply(this,arguments)}if(!r[s]&&this[l])return!1;var a;return e.isFunction(t)?(a=t,n):(a=t.handler,void(t.handler=n))}}}(t,window),e("util",i)});layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var f=l(e.elem);if(f[0]){var m=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,v=e.end||"没有更多了",y=e.scrollElem&&e.scrollElem!==document,d="加载更多",h=l('");f.find(".layui-flow-more")[0]||f.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(v):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(m.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),!i&&f.width()&&(r=setTimeout(function(){var i=y?e.height():l(window).height(),n=y?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var m=e.attr("lay-src");layui.img(m,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",m).removeAttr("lay-src"),l[0]&&f(l),i++})}},f=function(e,o){var f=a?(o||n).height():l(window).height(),m=n.scrollTop(),u=m+f;if(t.lazyimg.elem=l(r),e)c(e,f);else for(var s=0;su)break}};if(f(),!o){var m;n.on("scroll",function(){var e=l(this);m&&clearTimeout(m),m=setTimeout(function(){f(null,e)},50)}),o=!0}return f},e("flow",new o)});layui.define(["layer","form"],function(t){"use strict";var e=layui.$,i=layui.layer,a=layui.form,l=(layui.hint(),layui.device()),n="layedit",o="layui-show",r="layui-disabled",c=function(){var t=this;t.index=0,t.config={tool:["strong","italic","underline","del","|","left","center","right","|","link","unlink","face","image"],hideTool:[],height:280}};c.prototype.set=function(t){var i=this;return e.extend(!0,i.config,t),i},c.prototype.on=function(t,e){return layui.onevent(n,t,e)},c.prototype.build=function(t,i){i=i||{};var a=this,n=a.config,r="layui-layedit",c=e("string"==typeof t?"#"+t:t),u="LAY_layedit_"+ ++a.index,d=c.next("."+r),y=e.extend({},n,i),f=function(){var t=[],e={};return layui.each(y.hideTool,function(t,i){e[i]=!0}),layui.each(y.tool,function(i,a){C[a]&&!e[a]&&t.push(C[a])}),t.join("")}(),m=e(['
                  ','
                  '+f+"
                  ",'
                  ','',"
                  ","
                  "].join(""));return l.ie&&l.ie<8?c.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),s.call(a,m,c[0],y),c.addClass("layui-hide").after(m),a.index)},c.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},c.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},c.prototype.setContent=function(t,i,a){var l=u(t);l[0]&&(a?e(l[0].document.body).append(i):e(l[0].document.body).html(i),layedit.sync(t))},c.prototype.sync=function(t){var i=u(t);if(i[0]){var a=e("#"+i[1].attr("textarea"));a.val(d(i[0].document.body.innerHTML))}},c.prototype.getSelection=function(t){var e=u(t);if(e[0]){var i=m(e[0].document);return document.selection?i.text:i.toString()}};var s=function(t,i,a){var l=this,n=t.find("iframe");n.css({height:a.height}).on("load",function(){var o=n.contents(),r=n.prop("contentWindow"),c=o.find("head"),s=e([""].join("")),u=o.find("body");c.append(s),u.attr("contenteditable","true").css({"min-height":a.height}).html(i.value||""),y.apply(l,[r,n,i,a]),g.call(l,r,t,a)})},u=function(t){var i=e("#LAY_layedit_"+t),a=i.prop("contentWindow");return[a,i]},d=function(t){return 8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),t},y=function(t,a,n,o){var r=t.document,c=e(r.body);c.on("keydown",function(t){var e=t.keyCode;if(13===e){var a=m(r),l=p(a),n=l.parentNode;if("pre"===n.tagName.toLowerCase()){if(t.shiftKey)return;return i.msg("请暂时用shift+enter"),!1}r.execCommand("formatBlock",!1,"

                  ")}}),e(n).parents("form").on("submit",function(){var t=c.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),c.on("paste",function(e){r.execCommand("formatBlock",!1,"

                  "),setTimeout(function(){f.call(t,c),n.value=c.html()},100)})},f=function(t){var i=this;i.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),e(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},m=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},p=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,i,a){var l=this.document,n=document.createElement(t);for(var o in i)n.setAttribute(o,i[o]);if(n.removeAttribute("text"),l.selection){var r=a.text||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.pasteHTML(e(n).prop("outerHTML")),a.select()}else{var r=a.toString()||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.deleteContents(),a.insertNode(n)}},h=function(t,i){var a=this.document,l="layedit-tool-active",n=p(m(a)),o=function(e){return t.find(".layedit-tool-"+e)};i&&i[i.hasClass(l)?"removeClass":"addClass"](l),t.find(">i").removeClass(l),o("unlink").addClass(r),e(n).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||o("b").addClass(l),"i"!==t&&"em"!==t||o("i").addClass(l),"u"===t&&o("u").addClass(l),"strike"===t&&o("d").addClass(l),"p"===t&&("center"===e?o("center").addClass(l):"right"===e?o("right").addClass(l):o("left").addClass(l)),"a"===t&&(o("link").addClass(l),o("unlink").removeClass(r))})},g=function(t,a,l){var n=t.document,o=e(n.body),c={link:function(i){var a=p(i),l=e(a).parent();b.call(o,{href:l.attr("href"),target:l.attr("target")},function(e){var a=l[0];"A"===a.tagName?a.href=e.url:v.call(t,"a",{target:e.target,href:e.url,text:e.url},i)})},unlink:function(t){n.execCommand("unlink")},face:function(e){x.call(this,function(i){v.call(t,"img",{src:i.src,alt:i.alt},e)})},image:function(a){var n=this;layui.use("upload",function(o){var r=l.uploadImage||{};o.render({url:r.url,method:r.type,elem:e(n).find("input")[0],done:function(e){0==e.code?(e.data=e.data||{},v.call(t,"img",{src:e.data.src,alt:e.data.title},a)):i.msg(e.msg||"上传失败")}})})},code:function(e){k.call(o,function(i){v.call(t,"pre",{text:i.code,"lay-lang":i.lang},e)})},help:function(){i.open({type:2,title:"帮助",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["http://www.layui.com/about/layedit/help.html","no"]})}},s=a.find(".layui-layedit-tool"),u=function(){var i=e(this),a=i.attr("layedit-event"),l=i.attr("lay-command");if(!i.hasClass(r)){o.focus();var u=m(n);u.commonAncestorContainer;l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand("formatBlock",!1,"

                  "),setTimeout(function(){o.focus()},10)):c[a]&&c[a].call(this,u),h.call(t,s,i)}},d=/image/;s.find(">i").on("mousedown",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)||u.call(this)}).on("click",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)&&u.call(this)}),o.on("click",function(){h.call(t,s),i.close(x.index)})},b=function(t,e){var l=this,n=i.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"超链接",skin:"layui-layer-msg",content:['

                    ','
                  • ','','
                    ','',"
                    ","
                  • ",'
                  • ','','
                    ','",'","
                    ","
                  • ",'
                  • ','','',"
                  • ","
                  "].join(""),success:function(t,n){var o="submit(layedit-link-yes)";a.render("radio"),t.find(".layui-btn-primary").on("click",function(){i.close(n),l.focus()}),a.on(o,function(t){i.close(b.index),e&&e(t.field)})}});b.index=n},x=function(t){var a=function(){var t=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],e={};return layui.each(t,function(t,i){e[i]=layui.cache.dir+"images/face/"+t+".gif"}),e}();return x.hide=x.hide||function(t){"face"!==e(t.target).attr("layedit-event")&&i.close(x.index)},x.index=i.tips(function(){var t=[];return layui.each(a,function(e,i){t.push('
                • '+e+'
                • ')}),'
                    '+t.join("")+"
                  "}(),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(l,n){l.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){t&&t({src:a[this.title],alt:this.title}),i.close(n)}),e(document).off("click",x.hide).on("click",x.hide)}})},k=function(t){var e=this,l=i.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"插入代码",skin:"layui-layer-msg",content:['
                    ','
                  • ','','
                    ','","
                    ","
                  • ",'
                  • ','','
                    ','',"
                    ","
                  • ",'
                  • ','','',"
                  • ","
                  "].join(""),success:function(l,n){var o="submit(layedit-code-yes)";a.render("select"),l.find(".layui-btn-primary").on("click",function(){i.close(n),e.focus()}),a.on(o,function(e){i.close(k.index),t&&t(e.field)})}});k.index=l},C={html:'',strong:'',italic:'',underline:'',del:'',"|":'',left:'',center:'',right:'',link:'',unlink:'',face:'',image:'',code:'',help:''},w=new c;t(n,w)});layui.define("jquery",function(e){"use strict";var a=layui.$,l="http://www.layui.com/doc/modules/code.html";e("code",function(e){var t=[];e=e||{},e.elem=a(e.elem||".layui-code"),e.about=!("about"in e)||e.about,e.elem.each(function(){t.push(this)}),layui.each(t.reverse(),function(t,i){var c=a(i),o=c.html();(c.attr("lay-encode")||e.encode)&&(o=o.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('
                  1. '+o.replace(/[\r\t\n]+/g,"
                  2. ")+"
                  "),c.find(">.layui-code-h3")[0]||c.prepend('

                  '+(c.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"

                  ");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/layui.js b/AdminSrc/AdminHost/wwwroot/admin/layui/layui.js new file mode 100644 index 0000000..af940c9 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/layui.js @@ -0,0 +1 @@ +/** v2.11.2 | MIT Licensed */;!function(h){"use strict";var e,d=h.document,v=h.location,m={timeout:10,debug:!1,version:!1},g={modules:{},status:{},event:{},callback:{}},r=function(){this.v="2.11.2"},t=h.LAYUI_GLOBAL||{},b=(e=d.currentScript&&"SCRIPT"===d.currentScript.tagName.toUpperCase()?d.currentScript.src:function(){for(var e,t=d.getElementsByTagName("script"),n=t.length-1,r=n;01e3*m.timeout/5?j(o+" is not a valid module","error"):void((i?layui[o]=h[a.api]:g.status[o])?u():setTimeout(t,5))}()},0===n.length||layui["layui.all"]&&E[o]?u():(p=i?a.src:a,y=(E[o]?y+"modules/":p?"":m.base)+(p=(p=p||o).replace(/\s/g,"").replace(/\.js[^\/\.]*$/,""))+".js",!g.modules[o]&&layui[o]&&(g.modules[o]=y),g.modules[o]?c():(l=d.getElementsByTagName("head")[0],(s=d.createElement("script"))["async"]=!0,s.charset="utf-8",s.src=y+((p=!0===m.version?m.v||(new Date).getTime():m.version||"")?"?v="+p:""),l.appendChild(s),N(s,function(){l.removeChild(s),c()},function(){l.removeChild(s)}),g.modules[o]=y))),f},r.prototype.modules=Object.assign({},E),r.prototype.extend=function(e){var t,n,r=m.base||"",o=/^\{\/\}/;for(t in e=e||{})this[t]||this.modules[t]?j("the "+t+" module already exists, extend failure"):("string"==typeof(n=e[t])&&(n=((r=o.test(n)?"":r)+n).replace(o,"")),this.modules[t]=n);return this},r.prototype.disuse=function(e){var n=this;return e=n.isArray(e)?e:[e],n.each(e,function(e,t){delete n[t],delete E[t],delete n.modules[t],delete g.status[t],delete g.modules[t]}),n},r.prototype.getStyle=function(e,t){e=e.currentStyle||h.getComputedStyle(e,null);return e.getPropertyValue?e.getPropertyValue(t):e.getAttribute(t.replace(/-(\w)/g,function(e,t){return t?t.toUpperCase():""}))},r.prototype.link=function(n,r,o){var a,i=this,e=d.getElementsByTagName("head")[0],t="function"==typeof r;if("string"==typeof r&&(o=r),"object"==typeof n)return a="array"===i.type(o),i.each(n,function(e,t){i.link(t,e===n.length-1&&r,a&&o[e])});o="layuicss-"+(o=o||n.replace(/^(#|(http(s?)):\/\/|\/\/)|\.|\/|\?.+/g,""));var u=d.getElementById(o);return u||((u=d.createElement("link")).href=n+(m.debug?"?v="+(new Date).getTime():""),u.rel="stylesheet",u.id=o,e.appendChild(u)),"complete"===u.__lay_readyState__?t&&r(u):N(u,function(){u.__lay_readyState__="complete",t&&r(u)},function(){j(n+" load error","error"),e.removeChild(u)}),i},r.prototype.addcss=function(e,t,n){return layui.link(m.dir+"css/"+e,t,n)},r.prototype.factory=function(e){if(layui[e])return"function"==typeof m.callback[e]?m.callback[e]:null},r.prototype.img=function(e,t,n){var r=new Image;if(r.src=e,r.complete)return t(r);r.onload=function(){r.onload=null,"function"==typeof t&&t(r)},r.onerror=function(e){r.onerror=null,"function"==typeof n&&n(e)}},r.prototype.router=r.prototype.hash=function(e){var n={path:[],pathname:[],search:{},hash:((e=e||v.hash).match(/[^#](#.*$)/)||[])[1]||"",href:""};return/^#/.test(e)&&(e=e.replace(/^#/,""),e=(n.href=e).replace(/([^#])(#.*$)/,"$1").split("/")||[],this.each(e,function(e,t){/^\w+=/.test(t)?(t=t.split("="),n.search[t[0]]=t[1]):n.path.push(t)}),n.pathname=n.path),n},r.prototype.url=function(e){var o,t,n=this;return{pathname:(e?((e.match(/\.[^.]+?\/.+/)||[])[0]||"").replace(/^[^\/]+/,"").replace(/\?.+/,""):v.pathname).replace(/^\//,"").split("/"),search:(o={},t=(e?((e.match(/\?.+/)||[])[0]||"").replace(/\#.+/,""):v.search).replace(/^\?+/,"").split("&"),n.each(t,function(e,t){var n=t.indexOf("="),r=n<0?t.substr(0,t.length):0!==n&&t.substr(0,n);r&&(o[r]=0(d.innerHeight||h.documentElement.clientHeight)},p.getStyleRules=function(t,n){if(t)return t=(t=t.sheet||t.styleSheet||{}).cssRules||t.rules,"function"==typeof n&&layui.each(t,function(t,e){if(n(e,t))return!0}),t},p.style=function(t){t=t||{};var e=p.elem("style"),n=t.text||"",i=t.target;if(n)return"styleSheet"in e?(e.setAttribute("type","text/css"),e.styleSheet.cssText=n):e.innerHTML=n,e.id="LAY-STYLE-"+(t.id||(n=p.style.index||0,p.style.index++,"DF-"+n)),i&&((t=p(i).find("#"+e.id))[0]&&t.remove(),p(i).append(e)),e},p.position=function(t,e,n){var i,r,o,c,a,u,s,f,l;e&&(n=n||{},t!==h&&t!==p("body")[0]||(n.clickType="right"),i="right"===n.clickType?{left:(i=n.e||d.event||{}).clientX,top:i.clientY,right:i.clientX,bottom:i.clientY}:t.getBoundingClientRect(),a=e.offsetWidth,u=e.offsetHeight,r=function(t){return h.body[t=t?"scrollLeft":"scrollTop"]|h.documentElement[t]},o=function(t){return h.documentElement[t?"clientWidth":"clientHeight"]},c="margin"in n?n.margin:5,l=i.left,"center"===n.align?l-=(a-t.offsetWidth)/2:"right"===n.align&&(l=l-a+t.offsetWidth),(l=l+a+c>o("width")?o("width")-a-c:l)o()&&(i.top>u+c&&i.top<=o()?a=i.top-u-2*c:n.allowBottomOut||(a=o()-u-2*c)<0&&(a=0)),(u=n.position)&&(e.style.position=u),s=n.offset?n.offset[0]:0,f=n.offset?n.offset[1]:0,e.style.left=l+("fixed"===u?0:r(1))+s+"px",e.style.top=a+("fixed"===u?0:r())+f+"px",p.hasScrollbar()||(l=e.getBoundingClientRect(),!n.SYSTEM_RELOAD&&l.bottom+c>o()&&(n.SYSTEM_RELOAD=!0,setTimeout(function(){p.position(t,e,n)},50))))},p.options=function(t,e){if(e="object"==typeof e?e:{attr:e},t===h)return{};var t=p(t),n=e.attr||"lay-options",t=t.attr(n);try{return new Function("return "+(t||"{}"))()}catch(i){return layui.hint().error(e.errorText||[n+'="'+t+'"',"\n parseerror: "+i].join("\n"),"error"),{}}},p.isTopElem=function(n){var t=[h,p("body")[0]],i=!1;return p.each(t,function(t,e){if(e===n)return i=!0}),i},p.clipboard={writeText:function(n){var i=String(n.text);function t(){var t=h.createElement("textarea");t.value=i,t.style.position="fixed",t.style.opacity="0",t.style.top="0px",t.style.left="0px",h.body.appendChild(t),t.select();try{h.execCommand("copy"),"function"==typeof n.done&&n.done()}catch(e){"function"==typeof n.error&&n.error(e)}finally{t.remove?t.remove():h.body.removeChild(t)}}navigator&&"clipboard"in navigator?navigator.clipboard.writeText(i).then(n.done,function(){t()}):t()}},p.passiveSupported=function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});d.addEventListener("test",null,e),d.removeEventListener("test",null,e)}catch(n){}return t}(),p.touchEventsSupported=function(){return"ontouchstart"in d},p.touchSwipe=function(t,e){var n,i,r,o,c=e,a=p(t)[0],u=!("preventDefault"in c)||c.preventDefault;a&&p.touchEventsSupported()&&(n={pointerStart:{x:0,y:0},pointerEnd:{x:0,y:0},distanceX:0,distanceY:0,direction:"none",timeStart:null},e=function(t){1===t.touches.length&&(a.addEventListener("touchmove",i,!!p.passiveSupported&&{passive:!1}),a.addEventListener("touchend",r),a.addEventListener("touchcancel",r),n.timeStart=Date.now(),n.pointerStart.x=n.pointerEnd.x=t.touches[0].clientX,n.pointerStart.y=n.pointerEnd.y=t.touches[0].clientY,n.distanceX=n.distanceY=0,n.direction="none",c.onTouchStart)&&c.onTouchStart(t,n)},i=function(t){u&&t.preventDefault(),n.pointerEnd.x=t.touches[0].clientX,n.pointerEnd.y=t.touches[0].clientY,n.distanceX=n.pointerStart.x-n.pointerEnd.x,n.distanceY=n.pointerStart.y-n.pointerEnd.y,Math.abs(n.distanceX)>Math.abs(n.distanceY)?n.direction=0]|&(?=#?[a-zA-Z0-9]+)/g;return e===undefined||null===e?"":r.test(e+="")?e.replace(r,function(e){return"&#"+e.charCodeAt(0)+";"}):e}},m=function(e,r){return new RegExp(e,r||"g")},g=function(e,r,t){r=r||{};var e="Laytpl "+((r=Object.assign({errorContext:""},r)).type||"")+"Error: "+e,n=r.errorContext;return delete r.errorContext,"object"==typeof console&&console.error(e,"\n",n,"\n",r),"function"==typeof t&&t(r),e},o={open:"{{",close:"}}",cache:!0,condense:!0,tagStyle:""},t=function(e,r){var t=this;r=t.config=Object.assign({template:e},o,r),t.vars=Object.assign({include:function(e,r){e=document.getElementById(e),e=e?e.innerHTML:"";return e?t.render(e,r):""}},n),t.compile(r.template)},r=(t.prototype.render=function(r,t){var n=this,o=n.config,c=r?n.compile(r):n.compilerCache||n.compile(o.template),e=function(){t=t||o.data||{};try{return c(t)}catch(e){return r=r||o.template,g(e,{errorContext:n.extractErrorContext(r,t),template:r,type:"Render"},o.error)}}();return o.cache&&!r&&(n.compilerCache=c),e},t.prototype.compile=function(e){var t=this,o=t.config,c=o.open,a=o.close,i=o.condense,u=m,l="\u2028";if("string"!=typeof e||!e)return function(){return""};var p=function(e,r){e=["(?:"+c+(e[0]||"")+"\\s*)","("+(e[1]||"[\\s\\S]")+"*?)","(?:\\s*"+(e[2]||"")+a+")"];return(r=r||{}).before&&e.unshift(r.before),r.after&&e.push(r.after),u(e.join(""))},r=i?["",""]:["(?:(?:\\n)*\\s*)","(?:\\s*?)"],f={before:r[0],after:r[1]},s=function(e,r){return e=(e=i?e:e.replace(u(l),r?"":"\n")).replace(/\\(\\|")/g,"$1")},n=t.parse=function(e){var n,r,t;return(e=e||"")&&(e=(e=(e=i?e.replace(/\t/g," ").replace(/\s+/g," "):e).replace(u("([}\\]])"+a),"$1 "+a).replace(/(?=\\|")/g,"\\").replace(/\r?\n/g,i?"":l)).replace(p(["!","","!"],f),function(e,r){return r=r.replace(u(c+"|"+a),function(e){return e.replace(/(?=.)/g,"\\")})}),n=function(e){return['";',e,'__laytpl__+="'].join("\n")},r=function(e,r,t){return t&&(r="-"===r?"":"_escape",t=s(t,!0))?n("__laytpl__+="+r+"("+t+");"):""},t=function(e,r){return r?(r=s(r),n(r)):""},e="modern"===o.tagStyle?(e=(e=e.replace(p(["#"],f),"")).replace(p(["(=|-)"]),r)).replace(p([],f),t):(e=e.replace(p(["#"],f),t)).replace(p(["(=|-)*"]),r),i||(e=e.replace(u(l),"\\n"))),e},r=t.createCompiler=function(e,r){return r=r||d(e),new Function("laytpl","return "+r)(t.vars)},d=t.createBuilder=function(e,r){return r=r||["function(d){",'"use strict";','var __laytpl__="",'+function(){var e,r=[];for(e in t.vars)r.push(("escape"===e?"_":"")+e+"=laytpl."+e);return r.join(",")}()+";",'__laytpl__="'+n(e)+'";',"return __laytpl__;","};"].join("\n")};try{return r(e)}catch(y){return delete t.compilerCache,function(){return g(y,{errorContext:t.extractErrorContext(e),template:e,type:"Compile"},o.error)}}},t.prototype.extractErrorContext=function(e,r){var t=1,o=e.split(/\r?\n/g),n=(e=e.replace(/(?=^)/gm,function(){return"/*LINE:"+t+++"*/"}),this.createBuilder(e)),c=n.split(/\r?\n/),a="laytpl.builder.map";try{n+="\n//# sourceURL="+a;var i=this.createCompiler(e,n);r&&i(r)}catch(l){var e=m(a.replace(/\./g,"\\.")+":(\\d+)","i"),n=(l.stack.match(e)||[])[1]||0,u=function(e,r){var r=r?/\/\*LINE:(\d+)\*\/[^*]*$/:/\/\*LINE:(\d+)\*\//;return!(r=(String(c[e-1]).match(r)||[])[1])&&0n.pages?n.curr=n.pages:n.curr<1&&(n.curr=1),r<0?r=1:r>n.pages&&(r=n.pages),n.prev="prev"in n?n.prev:"\u4e0a\u4e00\u9875",n.next="next"in n?n.next:"\u4e0b\u4e00\u9875",n.pages>r?Math.ceil((n.curr+(1'+n.prev+"":"",page:function(){var e=[];if(n.count<1)return"";1'+(n.first||1)+"");var a=Math.floor((r-1)/2),t=1n.pages?n.pages:a:r;for(i-t...');t<=i;t++)t===n.curr?e.push('"+t+""):e.push(''+t+"");return n.pages>r&&n.pages>i&&!1!==n.last&&(i+1...'),0!==r)&&e.push(''+(n.last||n.pages)+""),e.join("")}(),next:n.next?''+n.next+"":"",count:''+(e="object"==typeof n.countText?n.countText:["\u5171 "," \u6761"])[0]+n.count+e[1]+"",limit:(i=['"),refresh:['','',""].join(""),skip:[''+(e="object"==typeof n.skipText?n.skipText:["\u5230\u7b2c","\u9875","\u786e\u5b9a"])[0],'',e[1]+'",""].join("")};return['
                  ',(t=[],layui.each(n.layout,function(e,a){l[a]&&t.push(l[a])}),t.join("")),"
                  "].join("")},t.prototype.jump=function(e,a){if(e){var t=this,i=t.config,n=e.children,r=e[c]("button")[0],u=e[c]("input")[0],e=e[c]("select")[0],l=function(){var e=Number(u.value.replace(/\s|\D/g,""));e&&(i.curr=e,t.render())};if(a)return l();for(var s=0,p=n.length;si.pages||(i.curr=e,t.render())});e&&o.on(e,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),r&&o.on(r,"click",function(){l()})}},t.prototype.skip=function(t){var i,e;t&&(i=this,e=t[c]("input")[0])&&o.on(e,"keyup",function(e){var a=this.value,e=e.keyCode;/^(37|38|39|40)$/.test(e)||(/\D/.test(a)&&(this.value=a.replace(/\D/,"")),13===e&&i.jump(t,!0))})},t.prototype.render=function(e){var a=this,t=a.config,i=a.type(),n=a.view(),i=(2===i?t.elem&&(t.elem.innerHTML=n):3===i?t.elem.html(n):r[u](t.elem)&&(r[u](t.elem).innerHTML=n),t.jump&&t.jump(t,e),r[u]("layui-laypage-"+t.index));a.jump(i),t.hash&&!e&&(location.hash="!"+t.hash+"="+t.curr),a.skip(i)},{render:function(e){return new t(e).index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(a,e,t){return a.attachEvent?a.attachEvent("on"+e,function(e){e.target=e.srcElement,t.call(a,e)}):a.addEventListener(e,t,!1),this}});e("laypage",o)});!function(i,D){"use strict";var n=i.layui&&layui.define,l={getPath:i.lay&&lay.getPath?lay.getPath:"",link:function(e,t,a){T.path&&i.lay&&lay.layui&&lay.layui.link(T.path+e,t,a)}},e=i.LAYUI_GLOBAL||{},a="laydate",d="lay-"+a+"-id",T={v:"5.6.0",config:{weekStart:0},index:i.laydate&&i.laydate.v?1e5:0,path:e.laydate_dir||l.getPath,set:function(e){var t=this;return t.config=lay.extend({},t.config,e),t},ready:function(e){var t="laydate",a=(n?"modules/":"")+"laydate.css?v="+T.v;return n?layui["layui.all"]?"function"==typeof e&&e():layui.addcss(a,e,t):l.link(a,e,t),this}},s=function(){var t=this,e=t.config.id;return(s.that[e]=t).inst={hint:function(e){t.hint.call(t,e)},reload:function(e){t.reload.call(t,e)},config:t.config}},M="layui-this",C="laydate-disabled",h=[100,2e5],v="layui-laydate-static",b="layui-laydate-list",o="laydate-selected",r="layui-laydate-hint",y="laydate-day-prev",m="laydate-day-next",E=".laydate-btns-confirm",L="laydate-time-text",I="laydate-btns-time",x="layui-laydate-preview",w="layui-laydate-shade",k=function(e){var t,a=this,n=(a.index=++T.index,a.config=lay.extend({},a.config,T.config,e),lay(e.elem||a.config.elem));return 1\u8bf7\u91cd\u65b0\u9009\u62e9",invalidDate:"\u4e0d\u5728\u6709\u6548\u65e5\u671f\u6216\u65f6\u95f4\u8303\u56f4\u5185",formatError:["\u65e5\u671f\u683c\u5f0f\u4e0d\u5408\u6cd5
                  \u5fc5\u987b\u9075\u5faa\u4e0b\u8ff0\u683c\u5f0f\uff1a
                  ","
                  \u5df2\u4e3a\u4f60\u91cd\u7f6e"],preview:"\u5f53\u524d\u9009\u4e2d\u7684\u7ed3\u679c"},en:{weeks:["Su","Mo","Tu","We","Th","Fr","Sa"],time:["Hours","Minutes","Seconds"],timeTips:"Select Time",startTime:"Start Time",endTime:"End Time",dateTips:"Select Date",month:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],tools:{confirm:"Confirm",clear:"Clear",now:"Now"},timeout:"End time cannot be less than start Time
                  Please re-select",invalidDate:"Invalid date",formatError:["The date format error
                  Must be followed\uff1a
                  ","
                  It has been reset"],preview:"The selected result"}};return e[this.config.lang]||e.cn},k.prototype.markerOfChineseFestivals={"0-1-1":"\u5143\u65e6","0-2-14":"\u60c5\u4eba","0-3-8":"\u5987\u5973","0-3-12":"\u690d\u6811","0-4-1":"\u611a\u4eba","0-5-1":"\u52b3\u52a8","0-5-4":"\u9752\u5e74","0-6-1":"\u513f\u7ae5","0-9-10":"\u6559\u5e08","0-10-1":"\u56fd\u5e86","0-12-25":"\u5723\u8bde"},k.prototype.reload=function(e){this.config=lay.extend({},this.config,e),this.init()},k.prototype.init=function(){var r=this,o=r.config,e="static"===o.position,t={year:"yyyy",month:"yyyy-MM",date:"yyyy-MM-dd",time:"HH:mm:ss",datetime:"yyyy-MM-dd HH:mm:ss"};o.elem=lay(o.elem),o.eventElem=lay(o.eventElem),o.elem[0]&&("array"!==layui.type(o.theme)&&(o.theme=[o.theme]),o.fullPanel&&("datetime"!==o.type||o.range)&&delete o.fullPanel,r.rangeStr=o.range?"string"==typeof o.range?o.range:"-":"",r.rangeLinked=!(!o.range||!o.rangeLinked||"date"!==o.type&&"datetime"!==o.type),r.autoCalendarModel=function(){var e=r.rangeLinked;return r.rangeLinked=o.range&&("date"===o.type||"datetime"===o.type)&&(!r.startDate||!r.endDate||r.startDate&&r.endDate&&r.startDate.year===r.endDate.year&&r.startDate.month===r.endDate.month),lay(r.elem)[r.rangeLinked?"addClass":"removeClass"]("layui-laydate-linkage"),r.rangeLinked!=e},r.autoCalendarModel.auto=r.rangeLinked&&"auto"===o.rangeLinked,"array"===layui.type(o.range)&&(r.rangeElem=[lay(o.range[0]),lay(o.range[1])]),t[o.type]||(i.console&&console.error&&console.error("laydate type error:'"+o.type+"' is not supported"),o.type="date"),o.format===t.date&&(o.format=t[o.type]||t.date),r.format=s.formatArr(o.format),o.weekStart&&!/^[0-6]$/.test(o.weekStart)&&(t=r.lang(),o.weekStart=t.weeks.indexOf(o.weekStart),-1===o.weekStart)&&(o.weekStart=0),r.EXP_IF="",r.EXP_SPLIT="",lay.each(r.format,function(e,t){e=new RegExp(u).test(t)?"\\d{"+(new RegExp(u).test(r.format[0===e?e+1:e-1]||"")?/^yyyy|y$/.test(t)?4:t.length:/^yyyy$/.test(t)?"1,4":/^y$/.test(t)?"1,308":"1,2")+"}":"\\"+t;r.EXP_IF=r.EXP_IF+e,r.EXP_SPLIT=r.EXP_SPLIT+"("+e+")"}),r.EXP_IF_ONE=new RegExp("^"+r.EXP_IF+"$"),r.EXP_IF=new RegExp("^"+(o.range?r.EXP_IF+"\\s\\"+r.rangeStr+"\\s"+r.EXP_IF:r.EXP_IF)+"$"),r.EXP_SPLIT=new RegExp("^"+r.EXP_SPLIT+"$",""),r.isInput(o.elem[0])||"focus"===o.trigger&&(o.trigger="click"),o.elem.attr("lay-key",r.index),o.eventElem.attr("lay-key",r.index),o.elem.attr(d,o.id),lay.each(["min","max"],function(e,t){var a=[],n=[];if("number"==typeof o[t])var i=o[t],l=new Date,l=r.newDate({year:l.getFullYear(),month:l.getMonth(),date:l.getDate(),hours:e?23:0,minutes:e?59:0,seconds:e?59:0}).getTime(),e=new Date(i?i<864e5?l+864e5*i:i:l),a=[e.getFullYear(),e.getMonth()+1,e.getDate()],n=[e.getHours(),e.getMinutes(),e.getSeconds()];else if("string"==typeof o[t])a=(o[t].match(/\d+-\d+-\d+/)||[""])[0].split("-"),n=(o[t].match(/\d+:\d+:\d+/)||[""])[0].split(":");else if("object"==typeof o[t])return o[t];o[t]={year:0|a[0]||(new Date).getFullYear(),month:a[1]?(0|a[1])-1:(new Date).getMonth(),date:0|a[2]||(new Date).getDate(),hours:0|n[0],minutes:0|n[1],seconds:0|n[2]}}),r.elemID="layui-laydate"+o.elem.attr("lay-key"),(o.show||e)&&r.render(),e||r.events(),"function"==typeof o.formatToDisplay&&(r.isInput(o.elem[0])?r.formatToDisplay(o.elem[0],o.formatToDisplay):(t=r.rangeElem)&&(r.formatToDisplay(t[0][0],o.formatToDisplay),r.formatToDisplay(t[1][0],o.formatToDisplay))),o.value)&&o.isInitValue&&("date"===layui.type(o.value)?r.setValue(r.parse(0,r.systemDate(o.value))):r.setValue(o.value))},k.prototype.render=function(){var a,n,i,l,r=this,o=r.config,d=r.lang(),s="static"===o.position,y=r.elem=lay.elem("div",{id:r.elemID,"class":["layui-laydate",o.range?" layui-laydate-range":"",r.rangeLinked?" layui-laydate-linkage":"",s?" "+v:"",o.fullPanel?" laydate-theme-fullpanel":"",(a="",lay.each(o.theme,function(e,t){"default"===t||/^#/.test(t)||(a+=" laydate-theme-"+t)}),a)].join("")}),m=r.elemMain=[],u=r.elemHeader=[],c=r.elemCont=[],h=r.table=[],e=r.footer=lay.elem("div",{"class":"layui-laydate-footer"}),t=r.shortcut=lay.elem("ul",{"class":"layui-laydate-shortcut"}),p=(o.zIndex&&(y.style.zIndex=o.zIndex),lay.each(new Array(2),function(e){if(!o.range&&0'+d.timeTips+""),(o.range||"datetime"!==o.type||o.fullPanel)&&p.push(''),lay.each(o.btns,function(e,t){var a=d.tools[t]||"btn";o.range&&"now"===t||(s&&"clear"===t&&(a="cn"===o.lang?"\u91cd\u7f6e":"Reset"),n.push(''+a+""))}),p.push('"),p.join(""))),o.shortcuts&&(y.appendChild(t),lay(t).html((i=[],lay.each(o.shortcuts,function(e,t){i.push('
                • '+t.text+"
                • ")}),i.join(""))).find("li").on("click",function(e){var t=o.shortcuts[this.dataset.index]||{},t=("function"==typeof t.value?t.value():t.value)||[],n=(layui.isArray(t)||(t=[t]),o.type),t=(lay.each(t,function(e,t){var a=[o.dateTime,r.endDate][e];"time"===n&&"date"!==layui.type(t)?r.EXP_IF.test(t)&&(t=(t.match(r.EXP_SPLIT)||[]).slice(1),lay.extend(a,{hours:0|t[0],minutes:0|t[2],seconds:0|t[4]})):lay.extend(a,r.systemDate("date"===layui.type(t)?t:new Date(t))),"time"!==n&&"datetime"!==n||(r[["startTime","endTime"][e]]={hours:a.hours,minutes:a.minutes,seconds:a.seconds}),0===e?r.startDate=lay.extend({},a):r.endState=!0,"year"===n||"month"===n||"time"===n?r.listYM[e]=[a.year,a.month+1]:e&&r.autoCalendarModel.auto&&r.autoCalendarModel()}),r.checkDate("limit").calendar(null,null,"init"),lay(r.footer).find("."+I).removeClass(C));t&&"date"===t.attr("lay-type")&&t[0].click(),r.done(null,"change"),lay(this).addClass(M),"static"!==o.position&&r.setValue(r.parse()).done().remove()})),lay.each(m,function(e,t){y.appendChild(t)}),o.showBottom&&y.appendChild(e),lay.elem("style")),f=[],g=!0,t=(lay.each(o.theme,function(e,t){g&&/^#/.test(t)?(g=!(l=!0),f.push(["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} li.layui-this,#{{id}} td.layui-this>div{background-color:{{theme}} !important;}",-1!==o.theme.indexOf("circle")?"":"#{{id}} .layui-this{background-color:{{theme}} !important;}","#{{id}} .laydate-day-now{color:{{theme}} !important;}","#{{id}} .laydate-day-now:after{border-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,r.elemID).replace(/{{theme}}/g,t))):!g&&/^#/.test(t)&&f.push(["#{{id}} .laydate-selected>div{background-color:{{theme}} !important;}","#{{id}} .laydate-selected:hover>div{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,r.elemID).replace(/{{theme}}/g,t))}),o.shortcuts&&o.range&&f.push("#{{id}}.layui-laydate-range{width: 628px;}".replace(/{{id}}/g,r.elemID)),f.length&&(f=f.join(""),"styleSheet"in p?(p.setAttribute("type","text/css"),p.styleSheet.cssText=f):p.innerHTML=f,l&&lay(y).addClass("laydate-theme-molv"),y.appendChild(p)),r.remove(k.thisElemDate),T.thisId=o.id,s?o.elem.append(y):(D.body.appendChild(y),r.position()),o.shade?'
                  ':"");y.insertAdjacentHTML("beforebegin",t),r.checkDate().calendar(null,0,"init"),r.changeEvent(),k.thisElemDate=r.elemID,r.renderAdditional(),"function"==typeof o.ready&&o.ready(lay.extend({},o.dateTime,{month:o.dateTime.month+1})),r.preview()},k.prototype.remove=function(e){var t=this,a=t.config,n=lay("#"+(e||t.elemID));return n[0]&&(n.hasClass(v)||t.checkDate(function(){n.remove(),delete t.startDate,delete t.endDate,delete t.endState,delete t.startTime,delete t.endTime,delete T.thisId,"function"==typeof a.close&&a.close(t)}),lay("."+w).remove()),t},k.prototype.position=function(){var e=this.config;return lay.position(e.elem[0],this.elem,{position:e.position}),this},k.prototype.hint=function(e){var t=this,a=(t.config,lay.elem("div",{"class":r}));t.elem&&(a.innerHTML=(e="object"==typeof e?e||{}:{content:e}).content||"",lay(t.elem).find("."+r).remove(),t.elem.appendChild(a),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){lay(t.elem).find("."+r).remove()},"ms"in e?e.ms:3e3))},k.prototype.getAsYM=function(e,t,a){return a?t--:t++,t<0&&(t=11,e--),11h[1]&&(e.year=h[1],o=!0),11t)&&(e.date=t,o=!0)},c=function(n,i,l){var r=["startTime","endTime"];i=(i.match(d.EXP_SPLIT)||[]).slice(1),l=l||0,s.range&&(d[r[l]]=d[r[l]]||{}),lay.each(d.format,function(e,t){var a=parseFloat(i[e]);i[e].lengthd.getDateTime(s.max)?(r=s.dateTime=lay.extend({},s.max),i=!0):d.getDateTime(r)d.getDateTime(s.max))&&(d.endDate=lay.extend({},s.max),i=!0),d.startTime={hours:s.dateTime.hours,minutes:s.dateTime.minutes,seconds:s.dateTime.seconds},d.endTime={hours:d.endDate.hours,minutes:d.endDate.minutes,seconds:d.endDate.seconds},"month"===s.type)&&(s.dateTime.date=1,d.endDate.date=1),i&&m&&(d.setValue(d.parse()),d.hint("value "+l.invalidDate+l.formatError[1])),d.startDate=d.startDate||m&&lay.extend({},s.dateTime),d.autoCalendarModel.auto&&d.autoCalendarModel(),d.endState=!s.range||!d.rangeLinked||!(!d.startDate||!d.endDate),e&&e()),d},k.prototype.markRender=function(e,a,t){var n;"object"==typeof t?lay.each(t||{},function(e,t){e=e.split("-");e[0]!=a[0]&&0!=e[0]||e[1]!=a[1]&&0!=e[1]||e[2]!=a[2]||(n=t||a[2])}):"string"==typeof t&&(n=t||a[2]),n&&e.find("div").html(''+n+"")},k.prototype.mark=function(t,a){var n=this,e=n.config,i=function(e){n.markRender(t,a,e)};return e.calendar&&"cn"===e.lang&&i(n.markerOfChineseFestivals),"function"==typeof e.mark?e.mark({year:a[0],month:a[1],date:a[2]},i):"object"==typeof e.mark&&i(e.mark),n},k.prototype.holidaysRender=function(r,o,e){var d=["holidays","workdays"],s=function(e,t,a){e.find("div").html(["",a,""].join(""))};"array"===layui.type(e)?lay.each(e,function(l,e){lay.each(e,function(e,t){var a,n,i;t=t,a=r.attr("lay-ymd"),n=t.split("-"),i=a.split("-"),lay.each(n,function(e,t){n[e]=parseInt(t,10)}),lay.each(i,function(e,t){i[e]=parseInt(t,10)}),n.join("-")===i.join("-")&&s(r,d[l],o[2])})}):"string"==typeof e&&-1!==d.indexOf(e)&&s(r,e,o[2])},k.prototype.holidays=function(t,a){var n=this,e=n.config,i=function(e){n.holidaysRender(t,a,e)};return"function"==typeof e.holidays?e.holidays({year:a[0],month:a[1],date:a[2]},i):"array"===layui.type(e.holidays)&&i(e.holidays),n},k.prototype.cellRender=function(t,e,a){var n=this.config;return"function"==typeof n.cellRender&&n.cellRender(e,function(e){"string"==typeof e?lay(t).html(e):"object"==typeof e&&lay(t).html("").append(lay(e)[0])},{originElem:t,type:a}),this},k.prototype.startOfYear=function(e){e=new Date(e);return e.setFullYear(e.getFullYear(),0,1),e.setHours(0,0,0,0),e},k.prototype.endOfYear=function(e){var e=new Date(e),t=e.getFullYear();return e.setFullYear(t+1,0,0),e.setHours(23,59,59,999),e},k.prototype.startOfMonth=function(e){e=new Date(e);return e.setDate(1),e.setHours(0,0,0,0),e},k.prototype.endOfMonth=function(e){var e=new Date(e),t=e.getMonth();return e.setFullYear(e.getFullYear(),t+1,0),e.setHours(23,59,59,999),e},k.prototype.addDays=function(e,t){e=new Date(e);return t&&e.setDate(e.getDate()+t),e},k.prototype.isDisabledYearOrMonth=function(e,t,a){for(var n=this,i=n.config,l="year"===t?n.startOfYear(e):n.startOfMonth(e),t="year"===t?n.endOfYear(e):n.endOfMonth(e),r=Math.floor((t.getTime()-l.getTime())/864e5)+1,o=0,d=0;d(t.time?0:41)?i.endDate:e.dateTime;return lay.each({now:lay.extend({},a,t.date||{}),min:e.min,max:e.max},function(e,a){var n;l[e]=i.newDate(lay.extend({year:a.year,month:"year"===t.type?0:a.month,date:"year"===t.type||"month"===t.type?1:a.date},(n={},lay.each(t.time,function(e,t){n[t]=a[t]}),n))).getTime()}),a=l.nowh[1]&&(s.year=h[1],d.hint(y.invalidDate)),d.firstDate||(d.firstDate=lay.extend({},s)),n.setFullYear(s.year,s.month,1),l=(n.getDay()+(7-a.weekStart))%7,r=T.getEndDate(s.month||12,s.year),o=T.getEndDate(s.month+1,s.year),lay.each(u,function(e,t){var a,n=[s.year,s.month];(t=lay(t)).removeAttr("class"),e"+n[2]+"
                  "),d.mark(t,n).holidays(t,n).limit({elem:t,date:{year:n[0],month:n[1]-1,date:n[2]},index:e,rangeType:i,disabledType:"date"}),d.cellRender(t,{year:n[0],month:n[1],date:n[2]},"date")}),lay(c[0]).attr("lay-ym",s.year+"-"+(s.month+1)),lay(c[1]).attr("lay-ym",s.year+"-"+(s.month+1)),d.panelYM||(d.panelYM={}),d.panelYM[i]={year:s.year,month:s.month},"cn"===a.lang?(lay(c[0]).attr("lay-type","year").html(s.year+" \u5e74"),lay(c[1]).attr("lay-type","month").html(s.month+1+" \u6708")):(lay(c[0]).attr("lay-type","month").html(y.month[s.month]),lay(c[1]).attr("lay-type","year").html(s.year)),m&&(a.range?!e&&"init"===t||(d.listYM=[[(d.startDate||a.dateTime).year,(d.startDate||a.dateTime).month+1],[d.endDate.year,d.endDate.month+1]],d.list(a.type,0).list(a.type,1),"time"===a.type?d.setBtnStatus("\u65f6\u95f4",lay.extend({},d.systemDate(),d.startTime),lay.extend({},d.systemDate(),d.endTime)):d.setBtnStatus(!0)):(d.listYM=[[s.year,s.month+1]],d.list(a.type,0))),a.range&&"init"===t&&(d.rangeLinked?(n=d.getAsYM(s.year,s.month,i?"sub":null),d.calendar(lay.extend({},s,{year:n[0],month:n[1]}),1-i)):d.calendar(null,1-i)),a.range||(u=["hours","minutes","seconds"],d.limit({elem:lay(d.footer).find(".laydate-btns-now"),date:d.systemDate(/^(datetime|time)$/.test(a.type)?new Date:null),index:0,time:u,disabledType:"datetime"}),d.limit({elem:lay(d.footer).find(E),index:0,time:u,disabledType:"datetime"})),d.setBtnStatus(),lay(d.shortcut).find("li."+M).removeClass(M),a.range&&!m&&"init"!==t&&d.stampRange(),d},k.prototype.list=function(n,i){var l,r,e,a,o,d,t,s=this,y=s.config,m=s.rangeLinked?y.dateTime:[y.dateTime,s.endDate][i],u=s.lang(),c=y.range&&"date"!==y.type&&"datetime"!==y.type,h=lay.elem("ul",{"class":b+" "+{year:"laydate-year-list",month:"laydate-month-list",time:"laydate-time-list"}[n]}),p=s.elemHeader[i],f=lay(p[2]).find("span"),g=s.elemCont[i||0],D=lay(g).find("."+b)[0],T="cn"===y.lang,v=T?"\u5e74":"",x=s.listYM[i]||{},w=["hours","minutes","seconds"],k=["startTime","endTime"][i];return x[0]<1&&(x[0]=1),"year"===n?(e=l=x[0]-7,l<1&&(e=l=1),lay.each(new Array(15),function(e){var t=lay.elem("li",{"lay-ym":l}),a={year:l,month:0,date:1};l==x[0]&&lay(t).addClass(M),t.innerHTML=l+v,h.appendChild(t),s.limit({elem:lay(t),date:a,index:i,type:n,rangeType:i,disabledType:"date"}),s.cellRender(t,{year:l,month:1,date:1},"year"),l++}),lay(f[T?0:1]).attr("lay-ym",l-8+"-"+x[1]).html(e+v+" - "+(l-1)+v)):"month"===n?(lay.each(new Array(12),function(e){var t=lay.elem("li",{"lay-ym":e}),a={year:x[0],month:e,date:1};e+1==x[1]&&lay(t).addClass(M),t.innerHTML=u.month[e]+(T?"\u6708":""),h.appendChild(t),s.limit({elem:lay(t),date:a,index:i,type:n,rangeType:i,disabledType:"date"}),s.cellRender(t,{year:x[0],month:e+1,date:1},"month")}),lay(f[T?0:1]).attr("lay-ym",x[0]+"-"+x[1]).html(x[0]+v)):"time"===n&&(r=function(){lay(h).find("ol").each(function(a,e){lay(e).find("li").each(function(e,t){s.limit({elem:lay(t),date:[{hours:e},{hours:s[k].hours,minutes:e},{hours:s[k].hours,minutes:s[k].minutes,seconds:e}][a],index:i,rangeType:i,disabledType:"time",time:[["hours"],["hours","minutes"],["hours","minutes","seconds"]][a]})})}),y.range||s.limit({elem:lay(s.footer).find(E),date:s[k],index:0,time:["hours","minutes","seconds"],disabledType:"datetime"})},y.range?s[k]||(s[k]="startTime"===k?m:s.endDate):s[k]=m,lay.each([24,60,60],function(t,e){var a=lay.elem("li"),n=["

                  "+u.time[t]+"

                    "];lay.each(new Array(e),function(e){n.push(""+lay.digit(e,2)+"")}),a.innerHTML=n.join("")+"
                  ",h.appendChild(a)}),r(),e=-1!==y.format.indexOf("H"),f=-1!==y.format.indexOf("m"),t=-1!==y.format.indexOf("s"),a=h.children,o=0,lay.each([e,f,t],function(e,t){t||(a[e].className+=" layui-hide",o++)}),h.className+=" laydate-time-list-hide-"+o),D&&g.removeChild(D),g.appendChild(h),"year"===n||"month"===n?(lay(s.elemMain[i]).addClass("laydate-ym-show"),lay(h).find("li").on("click",function(){var e,t,a=0|lay(this).attr("lay-ym");lay(this).hasClass(C)||(s.rangeLinked?lay.extend(m,{year:"year"===n?a:x[0],month:"year"===n?x[1]-1:a}):m[n]=a,e=-1!==["year","month"].indexOf(y.type),t="year"===n&&-1!==["date","datetime"].indexOf(y.type),e||t?(lay(h).find("."+M).removeClass(M),lay(this).addClass(M),("month"===y.type&&"year"===n||t)&&(s.listYM[i][0]=a,c&&((i?s.endDate:m).year=a),s.list("month",i))):(s.checkDate("limit").calendar(m,i,"init"),s.closeList()),s.setBtnStatus(),!y.range&&y.autoConfirm&&("month"===y.type&&"month"===n||"year"===y.type&&"year"===n)&&s.setValue(s.parse()).done().remove(),s.autoCalendarModel.auto&&!s.rangeLinked?s.choose(lay(g).find("td.layui-this"),i):s.endState&&s.done(null,"change"),lay(s.footer).find("."+I).removeClass(C))})):(f=lay.elem("span",{"class":L}),d=function(){lay(h).find("ol").each(function(e){var a=this,t=lay(a).find("li");a.scrollTop=30*(s[k][w[e]]-2),a.scrollTop<=0&&t.each(function(e,t){if(!lay(this).hasClass(C))return a.scrollTop=30*(e-2),!0})})},t=lay(p[2]).find("."+L),d(),f.innerHTML=y.range?[u.startTime,u.endTime][i]:u.timeTips,lay(s.elemMain[i]).addClass("laydate-time-show"),t[0]&&t.remove(),p[2].appendChild(f),(D=lay(h).find("ol")).each(function(t){var a=this;lay(a).find("li").on("click",function(){var e=0|this.innerHTML;lay(this).hasClass(C)||(y.range?s[k][w[t]]=e:m[w[t]]=e,lay(a).find("."+M).removeClass(M),lay(this).addClass(M),r(),d(),!s.endDate&&"time"!==y.type&&"datetime"!==y.type||s.done(null,"change"),s.setBtnStatus())})}),layui.device().mobile&&D.css({overflowY:"auto",touchAction:"pan-y"})),s},k.prototype.listYM=[],k.prototype.closeList=function(){var a=this;a.config;lay.each(a.elemCont,function(e,t){lay(this).find("."+b).remove(),lay(a.elemMain[e]).removeClass("laydate-ym-show laydate-time-show")}),lay(a.elem).find("."+L).remove()},k.prototype.setBtnStatus=function(e,t,a){var n=this,i=n.config,l=n.lang(),r=lay(n.footer).find(E),o="datetime"===i.type||"time"===i.type?["hours","minutes","seconds"]:undefined;i.range&&(t=t||(n.rangeLinked?n.startDate:i.dateTime),a=a||n.endDate,i=!n.endState||n.newDate(t).getTime()>n.newDate(a).getTime(),n.limit({date:t,disabledType:"datetime",time:o,rangeType:0})||n.limit({date:a,disabledType:"datetime",time:o,rangeType:1})?r.addClass(C):r[i?"addClass":"removeClass"](C),e)&&i&&n.hint("string"==typeof e?l.timeout.replace(/\u65e5\u671f/g,e):l.timeout)},k.prototype.parse=function(e,t){var a=this,n=a.config,i=a.rangeLinked?a.startDate:n.dateTime,t=t||("end"==e?lay.extend({},a.endDate,a.endTime):n.range?lay.extend({},i||n.dateTime,a.startTime):n.dateTime),i=T.parse(t,a.format,1);return n.range&&e===undefined?i+" "+a.rangeStr+" "+a.parse("end"):i},k.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},k.prototype.getDateTime=function(e){return this.newDate(e).getTime()},k.prototype.formatToDisplay=function(e,t){var a=this,n=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,"value");Object.defineProperty(e,"value",lay.extend({},n,{get:function(){return this.getAttribute("lay-date")},set:function(e){n.set.call(this,t.call(a,e)),this.setAttribute("lay-date",e)}}))},k.prototype.setValue=function(e){var t,a=this,n=a.config,i=n.elem[0];return"static"!==n.position&&(e=e||"",a.isInput(i)?lay(i).val(e):(t=a.rangeElem)?("array"!==layui.type(e)&&(e=e.split(" "+a.rangeStr+" ")),t[0].val(e[0]||""),t[1].val(e[1]||"")):(0===lay(i).find("*").length&&(t="function"==typeof n.formatToDisplay?n.formatToDisplay(e):e,lay(i).html(t)),lay(i).attr("lay-date",e))),a},k.prototype.preview=function(){var e,t=this,a=t.config;a.isPreview&&(e=lay(t.elem).find("."+x),a=!a.range||(t.rangeLinked?t.endState:t.endDate)?t.parse():"",e.html(a),e.html())&&(e.css({color:"#16b777"}),setTimeout(function(){e.css({color:"#777"})},300))},k.prototype.renderAdditional=function(){this.config.fullPanel&&this.list("time",0)},k.prototype.stampRange=function(){var n,i=this,l=i.config,r=i.rangeLinked?i.startDate:l.dateTime,e=lay(i.elem).find("td");l.range&&!i.endState&&lay(i.footer).find(E).addClass(C),r=r&&i.newDate({year:r.year,month:r.month,date:r.date}).getTime(),n=i.endState&&i.endDate&&i.newDate({year:i.endDate.year,month:i.endDate.month,date:i.endDate.date}).getTime(),lay.each(e,function(e,t){var a=lay(t).attr("lay-ymd").split("-"),a=i.newDate({year:a[0],month:a[1]-1,date:a[2]}).getTime();l.rangeLinked&&!i.startDate&&a===i.newDate(i.systemDate()).getTime()&&lay(t).addClass(lay(t).hasClass(y)||lay(t).hasClass(m)?"":"laydate-day-now"),lay(t).removeClass(o+" "+M),a!==r&&a!==n||(i.rangeLinked||!i.rangeLinked&&(e<42?a===r:a===n))&&lay(t).addClass(lay(t).hasClass(y)||lay(t).hasClass(m)?o:M),rn.getDateTime(i.max)&&(n[t]={hours:i.max.hours,minutes:i.max.minutes,seconds:i.max.seconds},lay.extend(l,n[t])))}),a||(n.startDate=lay.extend({},l)),n.endState&&!n.limit({date:n.rangeLinked?n.startDate:n.thisDateTime(1-a),disabledType:"date"})&&(((r=n.endState&&n.autoCalendarModel.auto?n.autoCalendarModel():r)||n.rangeLinked&&n.endState)&&n.newDate(n.startDate)>n.newDate(n.endDate)&&(n.startDate.year===n.endDate.year&&n.startDate.month===n.endDate.month&&n.startDate.date===n.endDate.date&&(o=n.startTime,n.startTime=n.endTime,n.endTime=o),o=n.startDate,n.startDate=lay.extend({},n.endDate,n.startTime),i.dateTime=lay.extend({},n.startDate),n.endDate=lay.extend({},o,n.endTime)),r)&&(i.dateTime=lay.extend({},n.startDate)),n.rangeLinked?(e=n.checkPanelDate(l,t),o=lay.extend({},l),d=r||e&&e.needFullRender?"init":null,e=e?e.index:t,n.calendar(o,e,d)):n.calendar(null,a,r?"init":null),n.endState&&n.done(null,"change")):"static"===i.position?n.calendar().done().done(null,"change"):"date"===i.type?i.autoConfirm?n.setValue(n.parse()).done().remove():n.calendar().done(null,"change"):"datetime"===i.type&&n.calendar().done(null,"change"))},k.prototype.tool=function(t,e){var a=this,n=a.config,i=a.lang(),l=n.dateTime,r="static"===n.position,o={datetime:function(){lay(t).hasClass(C)||(a.list("time",0),n.range&&a.list("time",1),lay(t).attr("lay-type","date").html(a.lang().dateTips))},date:function(){a.closeList(),lay(t).attr("lay-type","datetime").html(a.lang().timeTips)},clear:function(){r&&(lay.extend(l,a.firstDate),a.calendar()),n.range&&(delete n.dateTime,delete a.endDate,delete a.startTime,delete a.endTime),a.setValue(""),a.done(null,"onClear").done(["",{},{}]).remove()},now:function(){var e=new Date;if(lay(t).hasClass(C))return a.hint(i.tools.now+", "+i.invalidDate);lay.extend(l,a.systemDate(),{hours:e.getHours(),minutes:e.getMinutes(),seconds:e.getSeconds()}),a.setValue(a.parse()),r&&a.calendar(),a.done(null,"onNow").done().remove()},confirm:function(){if(n.range){if(lay(t).hasClass(C))return("time"===n.type?a.startTime&&a.endTime&&a.newDate(a.startTime)>a.newDate(a.endTime):a.startDate&&a.endDate&&a.newDate(lay.extend({},a.startDate,a.startTime||{}))>a.newDate(lay.extend({},a.endDate,a.endTime||{})))?a.hint("time"===n.type?i.timeout.replace(/\u65e5\u671f/g,"\u65f6\u95f4"):i.timeout):a.hint(i.invalidDate)}else if(lay(t).hasClass(C))return a.hint(i.invalidDate);a.setValue(a.parse()),a.done(null,"onConfirm").done().remove()}};o[e]&&o[e]()},k.prototype.change=function(n){var i=this,l=i.config,r=i.thisDateTime(n),o=l.range&&("year"===l.type||"month"===l.type),d=i.elemCont[n||0],s=i.listYM[n],e=function(e){var t=lay(d).find(".laydate-year-list")[0],a=lay(d).find(".laydate-month-list")[0];return t&&(s[0]=e?s[0]-15:s[0]+15,i.list("year",n)),a&&(e?s[0]--:s[0]++,i.list("month",n)),(t||a)&&(lay.extend(r,{year:s[0]}),o&&(r.year=s[0]),l.range||i.done(null,"change"),l.range||i.limit({elem:lay(i.footer).find(E),date:{year:s[0]},disabledType:"datetime"})),i.setBtnStatus(),t||a};return{prevYear:function(){e("sub")||(i.rangeLinked?(l.dateTime.year--,i.checkDate("limit").calendar(null,null,"init")):(r.year--,i.checkDate("limit").calendar(null,n),i.autoCalendarModel.auto?i.choose(lay(d).find("td.layui-this"),n):i.done(null,"change")))},prevMonth:function(){var e,t;i.rangeLinked?(t=i.panelYM[0],t=i.getAsYM(t.year,t.month,"sub"),e=lay.extend({},l.dateTime,i.panelYM[0],{year:t[0],month:t[1]}),i.checkDate("limit").calendar(e,null,"init")):(t=i.getAsYM(r.year,r.month,"sub"),lay.extend(r,{year:t[0],month:t[1]}),i.checkDate("limit").calendar(null,null,"init"),i.autoCalendarModel.auto?i.choose(lay(d).find("td.layui-this"),n):i.done(null,"change"))},nextMonth:function(){var e,t;i.rangeLinked?(t=i.panelYM[0],t=i.getAsYM(t.year,t.month),e=lay.extend({},l.dateTime,i.panelYM[0],{year:t[0],month:t[1]}),i.checkDate("limit").calendar(e,null,"init")):(t=i.getAsYM(r.year,r.month),lay.extend(r,{year:t[0],month:t[1]}),i.checkDate("limit").calendar(null,null,"init"),i.autoCalendarModel.auto?i.choose(lay(d).find("td.layui-this"),n):i.done(null,"change"))},nextYear:function(){e()||(i.rangeLinked?(l.dateTime.year++,i.checkDate("limit").calendar(null,0,"init")):(r.year++,i.checkDate("limit").calendar(null,n),i.autoCalendarModel.auto?i.choose(lay(d).find("td.layui-this"),n):i.done(null,"change")))}}},k.prototype.changeEvent=function(){var i=this;i.config;lay(i.elem).on("click",function(e){lay.stope(e)}).on("mousedown",function(e){lay.stope(e)}),lay.each(i.elemHeader,function(n,e){lay(e[0]).on("click",function(e){i.change(n).prevYear()}),lay(e[1]).on("click",function(e){i.change(n).prevMonth()}),lay(e[2]).find("span").on("click",function(e){var t=lay(this),a=t.attr("lay-ym"),t=t.attr("lay-type");a&&(a=a.split("-"),i.listYM[n]=[0|a[0],0|a[1]],i.list(t,n),lay(i.footer).find("."+I).addClass(C))}),lay(e[3]).on("click",function(e){i.change(n).nextMonth()}),lay(e[4]).on("click",function(e){i.change(n).nextYear()})}),lay.each(i.table,function(e,t){lay(t).find("td").on("click",function(){i.choose(lay(this),e)})}),lay(i.footer).find("span").on("click",function(){var e=lay(this).attr("lay-type");i.tool(this,e)})},k.prototype.isInput=function(e){return/input|textarea/.test(e.tagName.toLocaleLowerCase())||/INPUT|TEXTAREA/.test(e.tagName)},k.prototype.events=function(){var e,t=this,a=t.config;a.elem[0]&&!a.elem[0].eventHandler&&(a.elem.on(a.trigger,e=function(){T.thisId!==a.id&&t.render()}),a.elem[0].eventHandler=!0,a.eventElem.on(a.trigger,e),t.unbind=function(){t.remove(),a.elem.off(a.trigger,e),a.elem.removeAttr("lay-key"),a.elem.removeAttr(d),a.elem[0].eventHandler=!1,a.eventElem.off(a.trigger,e),a.eventElem.removeAttr("lay-key"),delete s.that[a.id]})},s.that={},s.getThis=function(e){var t=s.that[e];return!t&&n&&layui.hint().error(e?a+" instance with ID '"+e+"' not found":"ID argument required"),t},l.run=function(n){n(D).on("mousedown",function(e){var t,a;T.thisId&&(t=s.getThis(T.thisId))&&(a=t.config,e.target===a.elem[0]||e.target===a.eventElem[0]||e.target===n(a.closeStop)[0]||a.elem[0]&&a.elem[0].contains(e.target)||t.remove())}).on("keydown",function(e){var t;T.thisId&&(t=s.getThis(T.thisId))&&"static"!==t.config.position&&13===e.keyCode&&n("#"+t.elemID)[0]&&t.elemID===k.thisElemDate&&(e.preventDefault(),n(t.footer).find(E)[0].click())}),n(i).on("resize",function(){if(T.thisId){var e=s.getThis(T.thisId);if(e)return!(!e.elem||!n(".layui-laydate")[0])&&void e.position()}})},T.render=function(e){e=new k(e);return s.call(e)},T.reload=function(e,t){e=s.getThis(e);if(e)return e.reload(t)},T.getInst=function(e){e=s.getThis(e);if(e)return e.inst},T.hint=function(e,t){e=s.getThis(e);if(e)return e.hint(t)},T.unbind=function(e){e=s.getThis(e);if(e)return e.unbind()},T.close=function(e){e=s.getThis(e||T.thisId);if(e)return e.remove()},T.parse=function(a,n,i){return a=a||{},n=((n="string"==typeof n?s.formatArr(n):n)||[]).concat(),lay.each(n,function(e,t){/yyyy|y/.test(t)?n[e]=lay.digit(a.year,t.length):/MM|M/.test(t)?n[e]=lay.digit(a.month+(i||0),t.length):/dd|d/.test(t)?n[e]=lay.digit(a.date,t.length):/HH|H/.test(t)?n[e]=lay.digit(a.hours,t.length):/mm|m/.test(t)?n[e]=lay.digit(a.minutes,t.length):/ss|s/.test(t)&&(n[e]=lay.digit(a.seconds,t.length))}),n.join("")},T.getEndDate=function(e,t){var a=new Date;return a.setFullYear(t||a.getFullYear(),e||a.getMonth()+1,1),new Date(a.getTime()-864e5).getDate()},n?(T.ready(),layui.define("lay",function(e){T.path=layui.cache.dir,l.run(lay),e(a,T)})):"function"==typeof define&&define.amd?define(function(){return l.run(lay),T}):(T.ready(),l.run(i.lay),i.laydate=T)}(window,window.document);!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e):function(e){if(e.document)return t(e);throw new Error("jQuery requires a window with a document")}:t(e)}("undefined"!=typeof window?window:this,function(T,M){"use strict";var t=[],R=Object.getPrototypeOf,a=t.slice,I=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},W=t.push,b=t.indexOf,F={},$=F.toString,B=F.hasOwnProperty,_=B.toString,z=_.call(Object),g={},v=function v(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},X=function X(e){return null!=e&&e===e.window},C=T.document,U={type:!0,src:!0,nonce:!0,noModule:!0};function V(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in U)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function G(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?F[$.call(e)]||"object":typeof e}var e="3.7.1",Y=/HTML$/i,S=function(e,t){return new S.fn.init(e,t)};function J(e){var t=!!e&&"length"in e&&e.length,n=G(e);return!v(e)&&!X(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+n+")"+n+"*"),xe=new RegExp(n+"|>"),be=new RegExp(s),we=new RegExp("^"+e+"$"),Te={ID:new RegExp("^#("+e+")"),CLASS:new RegExp("^\\.("+e+")"),TAG:new RegExp("^("+e+"|[*])"),ATTR:new RegExp("^"+o),PSEUDO:new RegExp("^"+s),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+n+"*(even|odd|(([+-]|)(\\d*)n|)"+n+"*(?:([+-]|)"+n+"*(\\d+)|))"+n+"*\\)|)","i"),bool:new RegExp("^(?:"+ge+")$","i"),needsContext:new RegExp("^"+n+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+n+"*((?:-\\d)?\\d*)"+n+"*\\)|)(?=[^-]|$)","i")},Ce=/^(?:input|select|textarea|button)$/i,Se=/^h\d$/i,Ee=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ke=/[+~]/,f=new RegExp("\\\\[\\da-fA-F]{1,6}"+n+"?|\\\\([^\\r\\n\\f])","g"),d=function(e,t){e="0x"+e.slice(1)-65536;return t||(e<0?String.fromCharCode(65536+e):String.fromCharCode(e>>10|55296,1023&e|56320))},je=function(){Oe()},Ae=Ie(function(e){return!0===e.disabled&&x(e,"fieldset")},{dir:"parentNode",next:"legend"});try{j.apply(t=a.call(i.childNodes),i.childNodes),t[i.childNodes.length].nodeType}catch(sr){j={apply:function(e,t){ue.apply(e,a.call(t))},call:function(e){ue.apply(e,a.call(arguments,1))}}}function N(e,t,n,r){var i,o,s,a,u,l,c=t&&t.ownerDocument,f=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==f&&9!==f&&11!==f)return n;if(!r&&(Oe(t),t=t||E,k)){if(11!==f&&(a=Ee.exec(e)))if(i=a[1]){if(9===f){if(!(l=t.getElementById(i)))return n;if(l.id===i)return j.call(n,l),n}else if(c&&(l=c.getElementById(i))&&N.contains(t,l)&&l.id===i)return j.call(n,l),n}else{if(a[2])return j.apply(n,t.getElementsByTagName(e)),n;if((i=a[3])&&t.getElementsByClassName)return j.apply(n,t.getElementsByClassName(i)),n}if(!(pe[e+" "]||p&&p.test(e))){if(l=e,c=t,1===f&&(xe.test(e)||ve.test(e))){for((c=ke.test(e)&&He(t.parentNode)||t)==t&&g.scope||((s=t.getAttribute("id"))?s=S.escapeSelector(s):t.setAttribute("id",s=A)),o=(u=Me(e)).length;o--;)u[o]=(s?"#"+s:":scope")+" "+Re(u[o]);l=u.join(",")}try{return j.apply(n,c.querySelectorAll(l)),n}catch(d){pe(e,!0)}finally{s===A&&t.removeAttribute("id")}}}return _e(e.replace(ee,"$1"),t,n,r)}function De(){var n=[];function r(e,t){return n.push(e+" ")>w.cacheLength&&delete r[n.shift()],r[e+" "]=t}return r}function u(e){return e[A]=!0,e}function Ne(e){var t=E.createElement("fieldset");try{return!!e(t)}catch(sr){return!1}finally{t.parentNode&&t.parentNode.removeChild(t)}}function qe(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function Le(s){return u(function(o){return o=+o,u(function(e,t){for(var n,r=s([],e.length,o),i=r.length;i--;)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function He(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function Oe(e){var e=e?e.ownerDocument||e:i;return e!=E&&9===e.nodeType&&e.documentElement&&(r=(E=e).documentElement,k=!S.isXMLDoc(E),ae=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&i!=E&&(e=E.defaultView)&&e.top!==e&&e.addEventListener("unload",je),g.getById=Ne(function(e){return r.appendChild(e).id=S.expando,!E.getElementsByName||!E.getElementsByName(S.expando).length}),g.disconnectedMatch=Ne(function(e){return ae.call(e,"*")}),g.scope=Ne(function(){return E.querySelectorAll(":scope")}),g.cssHas=Ne(function(){try{E.querySelector(":has(*,:jqfake)")}catch(sr){return 1}}),g.getById?(w.filter.ID=function(e){var t=e.replace(f,d);return function(e){return e.getAttribute("id")===t}},w.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&k)return(e=t.getElementById(e))?[e]:[]}):(w.filter.ID=function(e){var t=e.replace(f,d);return function(e){e="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return e&&e.value===t}},w.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&k){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];for(i=t.getElementsByName(e),r=0;o=i[r++];)if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),w.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},w.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&k)return t.getElementsByClassName(e)},p=[],Ne(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||p.push("\\["+n+"*(?:value|"+ge+")"),e.querySelectorAll("[id~="+A+"-]").length||p.push("~="),e.querySelectorAll("a#"+A+"+*").length||p.push(".#.+[+~]"),e.querySelectorAll(":checked").length||p.push(":checked"),(t=E.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&p.push(":enabled",":disabled"),(t=E.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||p.push("\\["+n+"*name"+n+"*="+n+"*(?:''|\"\")")}),g.cssHas||p.push(":has"),p=p.length&&new RegExp(p.join("|")),he=function(e,t){var n;return e===t?(se=!0,0):(n=!e.compareDocumentPosition-!t.compareDocumentPosition)||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!g.sortDetached&&t.compareDocumentPosition(e)===n?e===E||e.ownerDocument==i&&N.contains(i,e)?-1:t===E||t.ownerDocument==i&&N.contains(i,t)?1:oe?b.call(oe,e)-b.call(oe,t):0:4&n?-1:1)}),E}for(re in N.matches=function(e,t){return N(e,null,null,t)},N.matchesSelector=function(e,t){if(Oe(e),k&&!pe[t+" "]&&(!p||!p.test(t)))try{var n=ae.call(e,t);if(n||g.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(sr){pe(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(f,d),e[3]=(e[3]||e[4]||e[5]||"").replace(f,d),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||N.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&N.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return Te.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&be.test(n)&&(t=(t=Me(n,!0))&&n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(f,d).toLowerCase();return"*"===e?function(){return!0}:function(e){return x(e,t)}},CLASS:function(e){var t=ce[e+" "];return t||(t=new RegExp("(^|"+n+")"+e+"("+n+"|$)"))&&ce(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(t,n,r){return function(e){e=N.attr(e,t);return null==e?"!="===n:!n||(e+="","="===n?e===r:"!="===n?e!==r:"^="===n?r&&0===e.indexOf(r):"*="===n?r&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function Ge(e,n,r){return v(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/,Ke=((S.fn.init=function(e,t,n){if(e){if(n=n||Ye,"string"!=typeof e)return e.nodeType?(this[0]=e,this.length=1,this):v(e)?n.ready!==undefined?n.ready(e):e(S):S.makeArray(e,this);if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:Je.exec(e))||!r[1]&&t)return(!t||t.jquery?t||n:this.constructor(t)).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),Ve.test(r[1])&&S.isPlainObject(t))for(var r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r])}else(n=C.getElementById(r[2]))&&(this[0]=n,this.length=1)}return this}).prototype=S.fn,Ye=S(C),/^(?:parents|prev(?:Until|All))/),Qe={children:!0,contents:!0,next:!0,prev:!0};function Ze(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Et=/^$|^module$|\/(?:java|ecma)script/i,h=(o=C.createDocumentFragment().appendChild(C.createElement("div")),(s=C.createElement("input")).setAttribute("type","radio"),s.setAttribute("checked","checked"),s.setAttribute("name","t"),o.appendChild(s),g.checkClone=o.cloneNode(!0).cloneNode(!0).lastChild.checked,o.innerHTML="",g.noCloneChecked=!!o.cloneNode(!0).lastChild.defaultValue,o.innerHTML="",g.option=!!o.lastChild,{thead:[1,"","
                  "],col:[2,"","
                  "],tr:[2,"","
                  "],td:[3,"","
                  "],_default:[0,"",""]});function y(e,t){var n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[];return t===undefined||t&&x(e,t)?S.merge([e],n):n}function kt(e,t){for(var n=0,r=e.length;n",""]);var jt=/<|&#?\w+;/;function At(e,t,n,r,i){for(var o,s,a,u,l,c=t.createDocumentFragment(),f=[],d=0,p=e.length;d\s*$/g;function Rt(e,t){return x(e,"table")&&x(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function It(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Wt(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Ft(e,t){var n,r,i,o;if(1===t.nodeType){if(m.hasData(e)&&(o=m.get(e).events))for(i in m.remove(t,"handle events"),o)for(n=0,r=o[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}}),[]),ir=/(=)\?(?=&|$)|\?\?/,or=(S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=rr.pop()||S.expando+"_"+Hn.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,s=!1!==e.jsonp&&(ir.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&ir.test(e.data)&&"data");if(s||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,s?e[s]=e[s].replace(ir,"$1"+r):!1!==e.jsonp&&(e.url+=(On.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=T[r],T[r]=function(){o=arguments},n.always(function(){i===undefined?S(T).removeProp(r):T[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,rr.push(r)),o&&v(i)&&i(o[0]),o=i=undefined}),"script"}),g.createHTMLDocument=((e=C.implementation.createHTMLDocument("").body).innerHTML="
                  ",2===e.childNodes.length),S.parseHTML=function(e,t,n){var r;return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(g.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),r=!n&&[],(n=Ve.exec(e))?[t.createElement(n[1])]:(n=At([e],t,r),r&&r.length&&S(r).remove(),S.merge([],n.childNodes)))},S.fn.load=function(e,t,n){var r,i,o,s=this,a=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){s.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,s,a=S.css(e,"position"),u=S(e),l={};"static"===a&&(e.style.position="relative"),o=u.offset(),r=S.css(e,"top"),s=S.css(e,"left"),a=("absolute"===a||"fixed"===a)&&-1<(r+s).indexOf("auto")?(i=(a=u.position()).top,a.left):(i=parseFloat(r)||0,parseFloat(s)||0),null!=(t=v(t)?t.call(e,n,S.extend({},o)):t).top&&(l.top=t.top-o.top+i),null!=t.left&&(l.left=t.left-o.left+a),"using"in t?t.using.call(e,l):u.css(l)}},S.fn.extend({offset:function(t){var e,n;return arguments.length?t===undefined?this:this.each(function(e){S.offset.setOffset(this,t,e)}):(n=this[0])?n.getClientRects().length?(e=n.getBoundingClientRect(),n=n.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{for(t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position");)e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===S.css(e,"position");)e=e.offsetParent;return e||yt})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return c(this,function(e,t,n){var r;if(X(e)?r=e:9===e.nodeType&&(r=e.defaultView),n===undefined)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=on(g.pixelPosition,function(e,t){if(t)return t=rn(e,n),Jt.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(s,a){S.each({padding:"inner"+s,content:a,"":"outer"+s},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return c(this,function(e,t,n){var r;return X(e)?0===o.indexOf("outer")?e["inner"+s]:e.document.documentElement["client"+s]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+s],r["scroll"+s],e.body["offset"+s],r["offset"+s],r["client"+s])):n===undefined?S.css(e,t,i):S.style(e,t,n,i)},a,n?e:undefined,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0'+(s?a.title[0]:a.title)+"
                  ":"";return a.zIndex=o,t([a.shade?'
                  ':"",'
                  '+(e&&2!=a.type?"":s)+"'+(n=["layui-icon-tips","layui-icon-success","layui-icon-error","layui-icon-question","layui-icon-lock","layui-icon-face-cry","layui-icon-face-smile"],o="layui-anim layui-anim-rotate layui-anim-loop",0==a.type&&-1!==a.icon?'':3==a.type?(i=["layui-icon-loading","layui-icon-loading-1"],2==a.icon?'
                  ':''):"")+((1!=a.type||!e)&&a.content||"")+'
                  '+(n=[],r&&(n.push(''),n.push('')),a.closeBtn&&n.push(''),n.join(""))+"
                  "+(a.btn?function(){var e="";"string"==typeof a.btn&&(a.btn=[a.btn]);for(var t,i=0,n=a.btn.length;i'+a.btn[i]+"";return'
                  '+e+"
                  "}():"")+(a.resize?'':"")+"
                  "],s,h('
                  ')),this},t.pt.creat=function(){var e,t,i,n,a=this,o=a.config,s=a.index,r="object"==typeof(d=o.content),l=h("body"),c=function(e){var t;o.shift&&(o.anim=o.shift),u.anim[o.anim]&&(t="layer-anim "+u.anim[o.anim],e.addClass(t).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){h(this).removeClass(t)}))};if(o.id&&h("."+u[0]).find("#"+o.id)[0])e=h("#"+o.id).closest("."+u[0]),t=e.attr("times"),i=e.data("config"),n=h("#"+u.SHADE+t),"min"===(e.data("maxminStatus")||{})?v.restore(t):i.hideOnClose&&(n.show(),e.show(),c(e),setTimeout(function(){n.css({opacity:n.data(y)})},10));else{switch(o.removeFocus&&document.activeElement&&document.activeElement.blur(),"string"==typeof o.area&&(o.area="auto"===o.area?["",""]:[o.area,""]),6==v.ie&&(o.fixed=!1),o.type){case 0:o.btn="btn"in o?o.btn:f.btn[0],v.closeAll("dialog");break;case 2:var d=o.content=r?o.content:[o.content||"","auto"];o.content='';break;case 3:delete o.title,delete o.closeBtn,-1===o.icon&&o.icon,v.closeAll("loading");break;case 4:r||(o.content=[o.content,"body"]),o.follow=o.content[1],o.content=o.content[0]+'',delete o.title,o.tips="object"==typeof o.tips?o.tips:[o.tips,!0],o.tipsMore||v.closeAll("tips")}a.vessel(r,function(e,t,i){l.append(e[0]),r?2==o.type||4==o.type?h("body").append(e[1]):d.parents("."+u[0])[0]||(d.data("display",d.css("display")).show().addClass("layui-layer-wrap").wrap(e[1]),h("#"+u[0]+s).find("."+u[5]).before(t)):l.append(e[1]),h("#"+u.MOVE)[0]||l.append(f.moveElem=i),a.layero=h("#"+u[0]+s),a.shadeo=h("#"+u.SHADE+s),o.scrollbar||f.setScrollbar(s)}).auto(s),a.shadeo.css({"background-color":o.shade[1]||"#000",opacity:o.shade[0]||o.shade,transition:o.shade[2]||""}),a.shadeo.data(y,o.shade[0]||o.shade),2==o.type&&6==v.ie&&a.layero.find("iframe").attr("src",d[0]),4==o.type?a.tips():(a.offset(),parseInt(f.getStyle(document.getElementById(u.MOVE),"z-index"))||(a.layero.css("visibility","hidden"),v.ready(function(){a.offset(),a.layero.css("visibility","visible")}))),!o.fixed||f.events.resize[a.index]||(f.events.resize[a.index]=function(){a.resize()},g.on("resize",f.events.resize[a.index])),a.layero.data("config",o),o.time<=0||setTimeout(function(){v.close(a.index)},o.time),a.move().callback(),c(a.layero)}},t.pt.resize=function(){var e=this,t=e.config;e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(e.index),4==t.type&&e.tips()},t.pt.auto=function(e){var t=this.config,i=h("#"+u[0]+e),n=((""===t.area[0]||"auto"===t.area[0])&&0t.maxWidth)&&i.width(t.maxWidth),[i.innerWidth(),i.innerHeight()]),a=i.find(u[1]).outerHeight()||0,o=i.find("."+u[6]).outerHeight()||0,e=function(e){(e=i.find(e)).height(n[1]-a-o-2*(0|parseFloat(e.css("padding-top"))))};return 2===t.type?e("iframe"):""===t.area[1]||"auto"===t.area[1]?0t.maxHeight?(n[1]=t.maxHeight,e("."+u[5])):t.fixed&&n[1]>=g.height()&&(n[1]=g.height(),e("."+u[5])):e("."+u[5]),this},t.pt.offset=function(){var e=this,t=e.config,i=e.layero,n=[i.outerWidth(),i.outerHeight()],a="object"==typeof t.offset;e.offsetTop=(g.height()-n[1])/2,e.offsetLeft=(g.width()-n[0])/2,a?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=g.width()-n[0]:"b"===t.offset?e.offsetTop=g.height()-n[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=g.height()-n[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=g.width()-n[0]):"rb"===t.offset?(e.offsetTop=g.height()-n[1],e.offsetLeft=g.width()-n[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?g.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?g.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=g.scrollTop(),e.offsetLeft+=g.scrollLeft()),"min"===i.data("maxminStatus")&&(e.offsetTop=g.height()-(i.find(u[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},t.pt.tips=function(){var e=this.config,t=this.layero,i=[t.outerWidth(),t.outerHeight()],n=h(e.follow),a={width:(n=n[0]?n:h("body")).outerWidth(),height:n.outerHeight(),top:n.offset().top,left:n.offset().left},o=t.find(".layui-layer-TipsG"),n=e.tips[0];e.tips[1]||o.remove(),a.autoLeft=function(){0'):e.removeClass("layui-layer-btn-is-loading").removeAttr("disabled").find(".layui-layer-btn-loading-icon").remove()},t.pt.callback=function(){var n=this,a=n.layero,o=n.config;n.openLayer(),o.success&&(2==o.type?a.find("iframe").on("load",function(){o.success(a,n.index,n)}):o.success(a,n.index,n)),6==v.ie&&n.IE6(a),a.find("."+u[6]).children("a").on("click",function(){var e,t=h(this),i=t.index();t.attr("disabled")||(o.btnAsync?(e=0===i?o.yes||o.btn1:o["btn"+(i+1)],n.loading=function(e){n.btnLoading(t,e)},e?f.promiseLikeResolve(e.call(o,n.index,a,n)).then(function(e){!1!==e&&v.close(n.index)},function(e){e!==m&&p.console&&p.console.error("layer error hint: "+e)}):v.close(n.index)):0===i?o.yes?o.yes(n.index,a,n):o.btn1?o.btn1(n.index,a,n):v.close(n.index):!1!==(o["btn"+(i+1)]&&o["btn"+(i+1)](n.index,a,n))&&v.close(n.index))}),a.find("."+u[7]).on("click",function(){!1!==(o.cancel&&o.cancel(n.index,a,n))&&v.close(n.index)}),o.shadeClose&&n.shadeo.on("click",function(){v.close(n.index)}),a.find(".layui-layer-min").on("click",function(){!1!==(o.min&&o.min(a,n.index,n))&&v.min(n.index,o)}),a.find(".layui-layer-max").on("click",function(){h(this).hasClass("layui-layer-maxmin")?(v.restore(n.index),o.restore&&o.restore(a,n.index,n)):(v.full(n.index,o),setTimeout(function(){o.full&&o.full(a,n.index,n)},100))}),o.end&&(f.end[n.index]=o.end),o.beforeEnd&&(f.beforeEnd[n.index]=h.proxy(o.beforeEnd,o,a,n.index,n))},f.reselect=function(){h.each(h("select"),function(e,t){var i=h(this);i.parents("."+u[0])[0]||1==i.attr("layer")&&h("."+u[0]).length<1&&i.removeAttr("layer").show()})},t.pt.IE6=function(e){h("select").each(function(e,t){var i=h(this);i.parents("."+u[0])[0]||"none"!==i.css("display")&&i.attr({layer:"1"}).hide()})},t.pt.openLayer=function(){v.zIndex=this.config.zIndex,v.setTop=function(e){return v.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",function(){v.zIndex++,e.css("z-index",v.zIndex+1)}),v.zIndex}},f.record=function(e){if(!e[0])return p.console&&console.error("index error");var t=e.attr("type"),i=e.find(".layui-layer-content"),t=t===f.type[2]?i.children("iframe"):i,n=[e[0].style.width||f.getStyle(e[0],"width"),e[0].style.height||f.getStyle(e[0],"height"),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:n}),i.data(l,f.getStyle(t[0],"height"))},f.setScrollbar=function(e){u.html.css("overflow","hidden")},f.restScrollbar=function(t){u.html.css("overflow")&&0===h("."+u[0]).filter(function(){var e=h(this);return!1===(e.data("config")||{}).scrollbar&&"min"!==e.data("maxminStatus")&&e.attr("times")!==String(t)}).length&&u.html.css("overflow","")},f.promiseLikeResolve=function(e){var t=h.Deferred();return e&&"function"==typeof e.then?e.then(t.resolve,t.reject):t.resolve(e),t.promise()},(p.layer=v).getChildFrame=function(e,t){return t=t||h("."+u[4]).attr("times"),h("#"+u[0]+t).find("iframe").contents().find(e)},v.getFrameIndex=function(e){if(e)return h("#"+e).parents("."+u[4]).attr("times")},v.iframeAuto=function(e){var t,i,n;e&&(t=v.getChildFrame("html",e).outerHeight(),i=(e=h("#"+u[0]+e)).find(u[1]).outerHeight()||0,n=e.find("."+u[6]).outerHeight()||0,e.css({height:t+i+n}),e.find("iframe").css({height:t}))},v.iframeSrc=function(e,t){h("#"+u[0]+e).find("iframe").attr("src",t)},v.style=function(e,t,i){var e=h("#"+u[0]+e),n=e.find(".layui-layer-content"),a=e.attr("type"),o=e.find(u[1]).outerHeight()||0,s=e.find("."+u[6]).outerHeight()||0;e.attr("minLeft");a!==f.type[3]&&a!==f.type[4]&&(i||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-o-s<=64&&(t.height=64+o+s)),e.css(t),s=e.find("."+u[6]).outerHeight()||0,a===f.type[2]?e.find("iframe").css({height:("number"==typeof t.height?t.height:e.height())-o-s}):n.css({height:("number"==typeof t.height?t.height:e.height())-o-s-parseFloat(n.css("padding-top"))-parseFloat(n.css("padding-bottom"))}))},v.min=function(e,t){var i,n,a,o,s,r,l=h("#"+u[0]+e),c=l.data("maxminStatus");"min"!==c&&("max"===c&&v.restore(e),l.data("maxminStatus","min"),t=t||l.data("config")||{},c=h("#"+u.SHADE+e),i=l.find(".layui-layer-min"),n=l.find(u[1]).outerHeight()||0,o=(a="string"==typeof(o=l.attr("minLeft")))?o:181*f.minStackIndex+"px",s=l.css("position"),r={width:180,height:n,position:"fixed",overflow:"hidden"},f.record(l),0g.width()&&(o=g.width()-180-(f.minStackArr.edgeIndex=f.minStackArr.edgeIndex||0,f.minStackArr.edgeIndex+=3))<0&&(o=0),t.minStack&&(r.left=o,r.top=g.height()-n,a||f.minStackIndex++,l.attr("minLeft",o)),l.attr("position",s),v.style(e,r,!0),i.hide(),"page"===l.attr("type")&&l.find(u[4]).hide(),f.restScrollbar(e),c.hide())},v.restore=function(e){var t=h("#"+u[0]+e),i=h("#"+u.SHADE+e),n=t.find(".layui-layer-content"),a=t.attr("area").split(","),o=t.attr("type"),s=t.data("config")||{},r=n.data(l);t.removeData("maxminStatus"),v.style(e,{width:a[0],height:a[1],top:parseFloat(a[2]),left:parseFloat(a[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===o&&t.find(u[4]).show(),s.scrollbar?f.restScrollbar(e):f.setScrollbar(e),r!==m&&(n.removeData(l),(o===f.type[2]?n.children("iframe"):n).css({height:r})),i.show()},v.full=function(t){var i=h("#"+u[0]+t),e=i.data("maxminStatus");"max"!==e&&("min"===e&&v.restore(t),i.data("maxminStatus","max"),f.record(i),f.setScrollbar(t),setTimeout(function(){var e="fixed"===i.css("position");v.style(t,{top:e?0:g.scrollTop(),left:e?0:g.scrollLeft(),width:"100%",height:"100%"},!0),i.find(".layui-layer-min").hide()},100))},v.title=function(e,t){h("#"+u[0]+(t||v.index)).find(u[1]).html(e)},v.close=function(s,r){var e,t,l=(e=h("."+u[0]).children("#"+s).closest("."+u[0]))[0]?(s=e.attr("times"),e):h("#"+u[0]+s),c=l.attr("type"),i=l.data("config")||{},d=i.id&&i.hideOnClose;l[0]&&(t=function(){var o={slideDown:"layer-anim-slide-down-out",slideLeft:"layer-anim-slide-left-out",slideUp:"layer-anim-slide-up-out",slideRight:"layer-anim-slide-right-out"}[i.anim]||"layer-anim-close",e=function(){var e="layui-layer-wrap";if(d)return l.removeClass("layer-anim "+o),l.hide();if(c===f.type[1]&&"object"===l.attr("conType")){l.children(":not(."+u[5]+")").remove();for(var t=l.find("."+e),i=0;i<2;i++)t.unwrap();t.css("display",t.data("display")).removeClass(e)}else{if(c===f.type[2])try{var n=h("#"+u[4]+s)[0];n.contentWindow.document.write(""),n.contentWindow.close(),l.find("."+u[5])[0].removeChild(n)}catch(a){}l[0].innerHTML="",l.remove()}"function"==typeof f.end[s]&&f.end[s](),delete f.end[s],"function"==typeof r&&r(),f.events.resize[s]&&(g.off("resize",f.events.resize[s]),delete f.events.resize[s])},t=h("#"+u.SHADE+s);v.ie&&v.ie<10||!i.isOutAnim?t[d?"hide":"remove"]():(t.css({opacity:0}),setTimeout(function(){t[d?"hide":"remove"]()},350)),i.isOutAnim&&l.addClass("layer-anim "+o),6==v.ie&&f.reselect(),f.restScrollbar(s),"string"==typeof l.attr("minLeft")&&(f.minStackIndex--,f.minStackArr.push(l.attr("minLeft"))),v.ie&&v.ie<10||!i.isOutAnim?e():setTimeout(function(){e()},200)},d||"function"!=typeof f.beforeEnd[s]?(delete f.beforeEnd[s],t()):f.promiseLikeResolve(f.beforeEnd[s]()).then(function(e){!1!==e&&(delete f.beforeEnd[s],t())},function(e){e!==m&&p.console&&p.console.error("layer error hint: "+e)}))},v.closeAll=function(n,a){"function"==typeof n&&(a=n,n=null);var o=h("."+u[0]);h.each(o,function(e){var t=h(this),i=n?t.attr("type")===n:1;i&&v.close(t.attr("times"),e===o.length-1?a:null)}),0===o.length&&"function"==typeof a&&a()},v.closeLast=function(i,e){var t,n=[],a=h.isArray(i);h("string"==typeof i?".layui-layer-"+i:".layui-layer").each(function(e,t){t=h(t);if(a&&-1===i.indexOf(t.attr("type"))||"none"===t.css("display"))return!0;n.push(Number(t.attr("times")))}),0":'",s=i.success;return delete i.success,v.open(h.extend({type:1,btn:["\u786e\u5b9a","\u53d6\u6d88"],content:o,skin:"layui-layer-prompt"+x("prompt"),maxWidth:g.width(),success:function(e){(a=e.find(".layui-layer-input")).val(i.value||"").focus(),"function"==typeof s&&s(e)},resize:!1,yes:function(e){var t=a.val();t.length>(i.maxlength||500)?v.tips("\u6700\u591a\u8f93\u5165"+(i.maxlength||500)+"\u4e2a\u5b57\u7b26",a,{tips:1}):n&&n(t,e,a)}},i))},v.tab=function(n){var a=(n=n||{}).tab||{},o="layui-this",s=n.success;return delete n.success,v.open(h.extend({type:1,skin:"layui-layer-tab"+x("tab"),resize:!1,title:function(){var e=a.length,t=1,i="";if(0'+a[0].title+"";t"+a[t].title+"";return i}(),content:'
                    '+function(){var e=a.length,t=1,i="";if(0'+(a[0].content||"no content")+"";t'+(a[t].content||"no content")+"";return i}()+"
                  ",success:function(e){var t=e.find(".layui-layer-title").children(),i=e.find(".layui-layer-tabmain").children();t.on("mousedown",function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0;var e=h(this),t=e.index();e.addClass(o).siblings().removeClass(o),i.eq(t).show().siblings().hide(),"function"==typeof n.change&&n.change(t)}),"function"==typeof s&&s(e)}},n))},v.photos=function(n,e,a){var s={};if((n=h.extend(!0,{toolbar:!0,footer:!0},n)).photos){var t=!("string"==typeof n.photos||n.photos instanceof h),i=t?n.photos:{},o=i.data||[],r=i.start||0,l=n.success;if(s.imgIndex=1+(0|r),n.img=n.img||"img",delete n.success,t){if(0===o.length)return v.msg("\u6ca1\u6709\u56fe\u7247")}else{var c=h(n.photos),d=function(){o=[],c.find(n.img).each(function(e){var t=h(this);t.attr("layer-index",e),o.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("lay-src")||t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(d(),e||c.on("click",n.img,function(){d();var e=h(this).attr("layer-index");v.photos(h.extend(n,{photos:{start:e,data:o,tab:n.tab},full:n.full}),!0)}),!e)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=o.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>o.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){var t;s.end||(t=e.keyCode,e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&v.close(s.index))},s.tabimg=function(e){if(!(o.length<=1))return i.start=s.imgIndex-1,v.close(s.index),v.photos(n,!0,e)},s.isNumber=function(e){return"number"==typeof e&&!isNaN(e)},s.image={},s.getTransform=function(e){var t=[],i=e.rotate,n=e.scaleX,e=e.scale;return s.isNumber(i)&&0!==i&&t.push("rotate("+i+"deg)"),s.isNumber(n)&&1!==n&&t.push("scaleX("+n+")"),s.isNumber(e)&&t.push("scale("+e+")"),t.length?t.join(" "):"none"},s.event=function(e,i,n){var a,o;s.main.find(".layui-layer-photos-prev").on("click",function(e){e.preventDefault(),s.imgprev(!0)}),s.main.find(".layui-layer-photos-next").on("click",function(e){e.preventDefault(),s.imgnext(!0)}),h(document).on("keyup",s.keyup),e.off("click").on("click","*[toolbar-event]",function(){var e=h(this);switch(e.attr("toolbar-event")){case"rotate":s.image.rotate=((s.image.rotate||0)+Number(e.attr("data-option")))%360,s.imgElem.css({transform:s.getTransform(s.image)});break;case"scalex":s.image.scaleX=-1===s.image.scaleX?1:-1,s.imgElem.css({transform:s.getTransform(s.image)});break;case"zoom":var t=Number(e.attr("data-option"));s.image.scale=(s.image.scale||1)+t,t<0&&s.image.scale<0-t&&(s.image.scale=0-t),s.imgElem.css({transform:s.getTransform(s.image)});break;case"reset":s.image.scaleX=1,s.image.scale=1,s.image.rotate=0,s.imgElem.css({transform:"none"});break;case"close":v.close(i)}n.offset(),n.auto(i)}),s.main.on("mousewheel DOMMouseScroll",function(e){var t=e.originalEvent.wheelDelta||-e.originalEvent.detail,i=s.main.find('[toolbar-event="zoom"]');(0n)&&("left"===t.direction?s.imgnext(!0):"right"===t.direction&&s.imgprev(!0))},h.each([n.shadeo,s.main],function(e,t){a.touchSwipe(t,{onTouchEnd:o})}))},s.loadi=v.load(1,{shade:!("shade"in n)&&[.9,m,"unset"],scrollbar:!1});var t=o[r].src,f=function(e){v.close(s.loadi);var t,i=o[r].alt||"";a&&(n.anim=-1),s.index=v.open(h.extend({type:1,id:"layui-layer-photos",area:(e=[e.width,e.height],t=[h(p).width()-100,h(p).height()-100],!n.full&&(t[0]'+i+''+(t=['
                  '],1','','',"
                  "].join("")),n.toolbar&&t.push(['
                  ','','','','','','',"
                  "].join("")),n.footer&&t.push(['"].join("")),t.push("
                  "),t.join(""))+"
                  ",success:function(e,t,i){s.main=e.find(".layer-layer-photos-main"),s.footer=e.find(".layui-layer-photos-footer"),s.imgElem=s.main.children("img"),s.event(e,t,i),n.tab&&n.tab(o[r],e),"function"==typeof l&&l(e)},end:function(){s.end=!0,h(document).off("keyup",s.keyup)}},n))},u=function(){v.close(s.loadi),v.msg("\u5f53\u524d\u56fe\u7247\u5730\u5740\u5f02\u5e38\uff0c
                  \u662f\u5426\u7ee7\u7eed\u67e5\u770b\u4e0b\u4e00\u5f20\uff1f",{time:3e4,btn:["\u4e0b\u4e00\u5f20","\u4e0d\u770b\u4e86"],yes:function(){1").addClass(o));layui.each(i.bars,function(t,e){var n=s('
                • ');n.addClass(e.icon).attr({"lay-type":e.type,style:e.style||(i.bgcolor?"background-color: "+i.bgcolor:"")}).html(e.content),n.on("click",function(){var t=s(this).attr("lay-type");"top"===t&&("body"===i.target?s("html,body"):c).animate({scrollTop:0},i.duration),"function"==typeof i.click&&i.click.call(this,t)}),"object"===layui.type(i.on)&&layui.each(i.on,function(t,e){n.on(t,function(){var t=s(this).attr("lay-type");"function"==typeof e&&e.call(this,t)})}),"top"===e.type&&(n.addClass("layui-fixbar-top"),r=n),l.append(n)}),u.find("."+o).remove(),"object"==typeof i.css&&l.css(i.css),u.append(l),r&&(e=function e(){return c.scrollTop()>=i.margin?t||(r.show(),t=1):t&&(r.hide(),t=0),e}()),c.on("scroll",function(){e&&(clearTimeout(n),n=setTimeout(function(){e()},100))})},countdown:function(i){i=s.extend(!0,{date:new Date,now:new Date},i);var r=arguments,o=(1]|&(?=#?[a-zA-Z0-9]+)/g.test(t+="")?t.replace(/&(?=#?[a-zA-Z0-9]+;?)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,"""):t},unescape:function(t){return t===undefined||null===t?"":String(t).replace(/\"/g,'"').replace(/\'/g,"'").replace(/\>/g,">").replace(/\</g,"<").replace(/\&/g,"&")},openWin:function(t){var e=(t=t||{}).window||window.open(t.url||"",t.target,t.specs);t.url||(e.document.open("text/html","replace"),e.document.write(t.content||""),e.document.close())},toVisibleArea:function(t){var e,n,i,r,o,a,u,c;(t=s.extend({margin:160,duration:200,type:"y"},t)).scrollElem[0]&&t.thisElem[0]&&(u=t.thisElem,i=(o="y"===t.type)?"top":"left",r=(e=t.scrollElem)[n=o?"scrollTop":"scrollLeft"](),o=e[o?"height":"width"](),a=e.offset()[i],c={},(u=u.offset()[i]-a)>o-t.margin||u."+v,T=function(e){var i=this;i.index=++h.index,i.config=c.extend({},i.config,h.config,e),i.init()};T.prototype.config={trigger:"click",content:"",className:"",style:"",show:!1,isAllowSpread:!0,isSpreadItem:!0,data:[],delay:[200,300],shade:0,accordion:!1,closeOnClick:!0},T.prototype.reload=function(e,i){var t=this;t.config=c.extend({},t.config,e),t.init(!0,i)},T.prototype.init=function(e,i){var t=this,n=t.config,a=c(n.elem);return 1",(t="href"in i?''+o+"":o,n?'
                  '+t+("parent"===l?'':"group"===l&&d.isAllowSpread?'':"")+"
                  ":'
                  '+t+"
                  "),"
                • "].join(""))).data("item",i),n&&(a=c('
                  '),t=c("
                    "),"parent"===l?(a.append(u(t,i[s.children])),o.append(a)):o.append(u(t,i[s.children]))),r.append(o))}),r},t=['
                    ',"
                    "].join(""),n=d.content||(n=c('
                      '),0\u6682\u65e0\u6570\u636e'),n),a=g.findMainElem(d.id);"reloadData"===e&&a.length?(i=o.mainElem=a).html(n):((i=o.mainElem=c(t)).append(n),i.addClass(d.className),i.attr("style",d.style),o.remove(h.thisId),d.target.append(i),d.elem.data(f,!0),e=d.shade?'
                      ':"",i.before(e),"mouseenter"===d.trigger&&i.on("mouseenter",function(){clearTimeout(g.timer)}).on("mouseleave",function(){o.delayRemove()})),o.position(),h.thisId=d.id,i.find(".layui-menu").on(l,function(e){layui.stope(e)}),i.find(".layui-menu li").on("click",function(e){var i=c(this),t=i.data("item")||{},n=t[s.children]&&0n.width()&&(t.addClass(x),(i=t[0].getBoundingClientRect()).left<0)&&t.removeClass(x),i.bottom>n.height())&&t.eq(0).css("margin-top",-(i.bottom-n.height()+5))}).on("mouseleave",t,function(e){var i=c(this).children("."+C);i.removeClass(x),i.css("margin-top",0)}),h.close=function(e){e=g.getThis(e);return e?(e.remove(),g.call(e)):this},h.open=function(e){e=g.getThis(e);return e?(e.render(),g.call(e)):this},h.reload=function(e,i,t){e=g.getThis(e);return e?(e.reload(i,t),g.call(e)):this},h.reloadData=function(){var t=c.extend([],arguments),n=(t[2]="reloadData",new RegExp("^("+["data","templet","content"].join("|")+")$"));return layui.each(t[1],function(e,i){n.test(e)||delete t[1][e]}),h.reload.apply(null,t)},h.render=function(e){e=new T(e);return g.call(e)},e(r,h)});layui.define(["jquery","lay"],function(e){"use strict";var x=layui.$,b=layui.lay,m={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var t=this;return t.config=x.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,i,e,t)}},i="slider",f="layui-disabled",T="layui-slider-bar",w="layui-slider-wrap",M="layui-slider-wrap-btn",L="layui-slider-tips",E="layui-slider-input-txt",Y="layui-slider-hover",t=function(e){var t=this;t.index=++m.index,t.config=x.extend({},t.config,m.config,e),t.render()};t.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,tipsAlways:!1,input:!1,range:!1,height:200,disabled:!1,theme:"#16baaa"},t.prototype.precision=function(){var e=this.config,e=x.map([e.min,e.max,e.step],function(e,t){e=String(e).split(".");return e[1]?e[1].length:0});return Math.max.apply(null,e)},t.prototype.render=function(){var n=this,a=n.config,e=x(a.elem);if(1a.max&&(a.value=a.max),l=(a.value-a.min)/(a.max-a.min)*100+"%");var t,e=a.disabled?"#c2c2c2":a.theme,i='
                      '+(a.tips?'
                      ":"")+'
                      '+(a.range?'
                      ':"")+"
                      ",l=x(a.elem),s=l.next(".layui-slider");if(s[0]&&s.remove(),n.elemTemp=x(i),a.range?(n.elemTemp.find("."+w).eq(0).data("value",a.value[0]),n.elemTemp.find("."+w).eq(1).data("value",a.value[1])):n.elemTemp.find("."+w).data("value",a.value),l.html(n.elemTemp),"vertical"===a.type&&n.elemTemp.height(a.height+"px"),a.showstep){for(var o=(a.max-a.min)/a.step,r="",u=1;u<1+o;u++){var c=100*u/o;c<100&&(r+='
                      ')}n.elemTemp.append(r)}function d(e){e=e.parent().data("value"),e=a.setTips?a.setTips(e):e;n.elemTemp.find("."+L).html(e)}function p(e){var t="vertical"===a.type?a.height:n.elemTemp[0].offsetWidth,i=n.elemTemp.find("."+w);return("vertical"===a.type?t-e.parent()[0].offsetTop-i.height():e.parent()[0].offsetLeft)/t*100}function v(e){"vertical"===a.type?n.elemTemp.find("."+L).css({bottom:e+"%","margin-bottom":"20px",display:"inline-block"}):n.elemTemp.find("."+L).css({left:e+"%",display:"inline-block"})}a.input&&!a.range&&(e=x('
                      '),l.css("position","relative"),l.append(e),l.find("."+E).children("input").val(a.value),"vertical"===a.type?e.css({left:0,top:-48}):n.elemTemp.css("margin-right",e.outerWidth()+15)),a.disabled?(n.elemTemp.addClass(f),n.elemTemp.find("."+M).addClass(f)):n.slide(),a.tips&&(a.tipsAlways?(d(s=n.elemTemp.find("."+M)),v(p(s))):n.elemTemp.find("."+M).on("mouseover",function(){d(x(this));var e=p(x(this));clearTimeout(t),t=setTimeout(function(){v(e)},300)}).on("mouseout",function(){clearTimeout(t),a.tipsAlways||n.elemTemp.find("."+L).css("display","none")}))},t.prototype.slide=function(e,t,i){var u=this,c=u.config,d=u.elemTemp,p=function(){return"vertical"===c.type?c.height:d[0].offsetWidth},v=d.find("."+w),o=d.next(".layui-slider-input"),r=o.children("."+E).children("input").val(),m=100/((c.max-c.min)/c.step),f=u.precision(),h=function(e,t,i){e=(e=100<(e=100n[1]&&n.reverse(),u.value=c.range?n:l,c.change&&c.change(u.value),"done"===i&&c.done&&c.done(u.value)},y=function(e){var t=e/p()*100/m,i=Math.round(t)*m;return i=e==p()?Math.ceil(t)*m:i},g=x(['
                      p()?p():t)/p()*100/m;h(t,o),r.addClass(Y),d.find("."+L).show(),e.preventDefault()},n=function(e){r.removeClass(Y),c.tipsAlways||setTimeout(function(){d.find("."+L).hide()},e)},a=function(){n&&n(b.touchEventsSupported()?1e3:0),g.remove(),c.done&&c.done(u.value),b.touchEventsSupported()&&(t[0].removeEventListener("touchmove",i,!!b.passiveSupported&&{passive:!1}),t[0].removeEventListener("touchend",a),t[0].removeEventListener("touchcancel",a))},x("#LAY-slider-moving")[0]||x("body").append(g),g.on("mousemove",i),g.on("mouseup",a).on("mouseleave",a),b.touchEventsSupported()&&(t[0].addEventListener("touchmove",i,!!b.passiveSupported&&{passive:!1}),t[0].addEventListener("touchend",a),t[0].addEventListener("touchcancel",a))})}),d.on("click",function(e){var t=x("."+M),i=x(this);!t.is(event.target)&&0===t.has(event.target).length&&t.length&&(i=(t=(t=(t="vertical"===c.type?p()-e.clientY+i.offset().top-x(window).scrollTop():e.clientX-i.offset().left-x(window).scrollLeft())<0?0:t)>p()?p():t)/p()*100/m,t=c.range?"vertical"===c.type?Math.abs(t-parseInt(x(v[0]).css("bottom")))>Math.abs(t-parseInt(x(v[1]).css("bottom")))?1:0:Math.abs(t-v[0].offsetLeft)>Math.abs(t-v[1].offsetLeft)?1:0:0,h(i,t,"done"),e.preventDefault())}),o.children(".layui-slider-input-btn").children("i").each(function(t){x(this).on("click",function(){r=o.children("."+E).children("input").val();var e=((r=1==t?r-c.stepc.max?c.max:Number(r)+c.step)-c.min)/(c.max-c.min)*100/m;h(e,0,"done")})});var n=function(){var e=this.value,e=(e=(e=(e=isNaN(e)?0:e)c.max?c.max:e,((this.value=e)-c.min)/(c.max-c.min)*100/m);h(e,0,"done")};o.children("."+E).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),n.call(this))}).on("change",n)},t.prototype.events=function(){this.config},m.render=function(e){e=new t(e);return function(){var i=this,n=i.config;return{setValue:function(e,t){return e=(e=e>n.max?n.max:e)',"",'','',"","","
                      "].join("")),t=i.elem=x(i.elem);i.size&&o.addClass("layui-colorpicker-"+i.size),t.addClass("layui-inline").html(e.elemColorBox=o),i.id="id"in i?i.id:t.attr("id")||e.index,e.color=e.elemColorBox.find("."+T)[0].style.background,e.events()},s.prototype.renderPicker=function(){var o,e=this,i=e.config,t=e.elemColorBox[0],n=e.elemPicker=x(['
                      ','
                      ','
                      ','
                      ','
                      ','
                      ',"
                      ",'
                      ','
                      ',"
                      ","
                      ",'
                      ','
                      ','
                      ',"
                      ","
                      ",i.predefine?(o=['
                      '],layui.each(i.colors,function(e,i){o.push(['
                      ','
                      ',"
                      "].join(""))}),o.push("
                      "),o.join("")):"",'
                      ','
                      ','',"
                      ",'
                      ','','',"","
                      "].join(""));e.elemColorBox.find("."+T)[0];x(c)[0]&&x(c).data("index")==e.index?e.removePicker(s.thisElemInd):(e.removePicker(s.thisElemInd),x("body").append(n)),r.thisId=i.id,s.thisElemInd=e.index,s.thisColor=t.style.background,e.position(),e.pickerEvents()},s.prototype.removePicker=function(e){var i=this.config,e=x("#layui-colorpicker"+(e||this.index));return e[0]&&(e.remove(),delete r.thisId,"function"==typeof i.close)&&i.close(this.color),this},s.prototype.position=function(){var e=this,i=e.config;return P.position(e.bindElem||e.elemColorBox[0],e.elemPicker[0],{position:i.position,align:"center"}),e},s.prototype.val=function(){var e,i=this,o=(i.config,i.elemColorBox.find("."+T)),t=i.elemPicker.find("."+X),n=o[0].style.backgroundColor;n?(e=j(L(n)),o=o.attr("lay-type"),i.select(e.h,e.s,e.b),"torgb"===o?t.find("input").val(n):"rgba"===o?(o=L(n),3===(n.match(/[0-9]{1,3}/g)||[]).length?(t.find("input").val("rgba("+o.r+", "+o.g+", "+o.b+", 1)"),i.elemPicker.find("."+Y).css("left",280)):(t.find("input").val(n),n=280*n.slice(n.lastIndexOf(",")+1,n.length-1),i.elemPicker.find("."+Y).css("left",n)),i.elemPicker.find("."+D)[0].style.background="linear-gradient(to right, rgba("+o.r+", "+o.g+", "+o.b+", 0), rgb("+o.r+", "+o.g+", "+o.b+"))"):t.find("input").val("#"+H(e))):(i.select(0,100,100),t.find("input").val(""),i.elemPicker.find("."+D)[0].style.background="",i.elemPicker.find("."+Y).css("left",280))},s.prototype.side=function(){var r=this,l=r.config,c=r.elemColorBox.find("."+T),a=c.attr("lay-type"),s=r.elemPicker.find(".layui-colorpicker-side"),o=r.elemPicker.find("."+I),d=r.elemPicker.find("."+E),t=r.elemPicker.find("."+M),u=r.elemPicker.find("."+D),f=r.elemPicker.find("."+Y),p=o[0].offsetTop/180*360,h=100-t[0].offsetTop/180*100,g=t[0].offsetLeft/260*100,v=Math.round(f[0].offsetLeft/280*100)/100,m=r.elemColorBox.find("."+B),e=r.elemPicker.find(".layui-colorpicker-pre").children("div"),y=function(e,i,o,t){r.select(e,i,o);var n=F({h:e,s:i,b:o}),e=H({h:e,s:i,b:o}),i=r.elemPicker.find("."+X).find("input");m.addClass(C).removeClass(w),c[0].style.background="rgb("+n.r+", "+n.g+", "+n.b+")","torgb"===a?i.val("rgb("+n.r+", "+n.g+", "+n.b+")"):"rgba"===a?(f.css("left",280*t),i.val("rgba("+n.r+", "+n.g+", "+n.b+", "+t+")"),c[0].style.background="rgba("+n.r+", "+n.g+", "+n.b+", "+t+")",u[0].style.background="linear-gradient(to right, rgba("+n.r+", "+n.g+", "+n.b+", 0), rgb("+n.r+", "+n.g+", "+n.b+"))"):i.val("#"+e),l.change&&l.change(x.trim(r.elemPicker.find("."+X).find("input").val()))},i=x(['
                      '].join("")),b=function(e){x("#LAY-colorpicker-moving")[0]||x("body").append(i),i.on("mousemove",e),i.on("mouseup",function(){i.remove()}).on("mouseleave",function(){i.remove()})},n=!0,k=!0;o.on("mousedown",function(e,i){var t=this.offsetTop,n=(e.clientY===undefined?i:e).clientY;k&&layui.stope(e),b(function(e){var i=t+(e.clientY-n),o=s[0].offsetHeight,o=(i=o<(i=i<0?0:i)?o:i)/180*360;y(p=o,g,h,v),e.preventDefault()}),e.preventDefault()}),s.on("mousedown",function(e){var i=e.clientY-x(this).offset().top+W.scrollTop(),i=(i=(i=i<0?0:i)>this.offsetHeight?this.offsetHeight:i)/180*360;y(p=i,g,h,v),e.preventDefault(),n&&o.trigger("mousedown",e)}),t.on("mousedown",function(e,i){var r=this.offsetTop,l=this.offsetLeft,c=(e.clientY===undefined?i:e).clientY,a=(e.clientX===undefined?i:e).clientX;k&&layui.stope(e),b(function(e){var i=r+(e.clientY-c),o=l+(e.clientX-a),t=d[0].offsetHeight,n=d[0].offsetWidth,n=(o=n<(o=o<0?0:o)?n:o)/260*100,o=100-(i=t<(i=i<0?0:i)?t:i)/180*100;y(p,g=n,h=o,v),e.preventDefault()}),e.preventDefault()}),d.on("mousedown",function(e){var i=e.clientY-x(this).offset().top+W.scrollTop(),o=e.clientX-x(this).offset().left+W.scrollLeft(),o=((i=i<0?0:i)>this.offsetHeight&&(i=this.offsetHeight),(o=(o=o<0?0:o)>this.offsetWidth?this.offsetWidth:o)/260*100),i=100-i/180*100;y(p,g=o,h=i,v),layui.stope(e),e.preventDefault(),n&&t.trigger("mousedown",e)}),f.on("mousedown",function(e,i){var t=this.offsetLeft,n=(e.clientX===undefined?i:e).clientX;k&&layui.stope(e),b(function(e){var i=t+(e.clientX-n),o=u[0].offsetWidth,o=(o<(i=i<0?0:i)&&(i=o),Math.round(i/280*100)/100);y(p,g,h,v=o),e.preventDefault()}),e.preventDefault()}),u.on("mousedown",function(e){var i=e.clientX-x(this).offset().left,i=((i=i<0?0:i)>this.offsetWidth&&(i=this.offsetWidth),Math.round(i/280*100)/100);y(p,g,h,v=i),e.preventDefault(),n&&f.trigger("mousedown",e)}),e.each(function(){x(this).on("click",function(){x(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e=this.style.backgroundColor,i=j(L(e)),o=e.slice(e.lastIndexOf(",")+1,e.length-1);p=i.h,g=i.s,h=i.b,3===(e.match(/[0-9]{1,3}/g)||[]).length&&(o=1),v=o,y(i.h,i.s,i.b,o)})}),P.touchEventsSupported()&&layui.each([{elem:s,eventType:"mousedown"},{elem:u,eventType:"mousedown"},{elem:d,eventType:"mousedown"}],function(e,t){P.touchSwipe(t.elem,{onTouchStart:function(){k=n=!1},onTouchMove:function(e){var i,o;e=e,i=t.eventType,e=e.touches[0],(o=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,e.screenX,e.screenY,e.clientX,e.clientY,!1,!1,!1,!1,0,null),e.target.dispatchEvent(o)},onTouchEnd:function(){i.remove(),k=n=!0}})})},s.prototype.select=function(e,i,o,t){this.config;var n=H({h:e,s:100,b:100}),e=(H({h:e,s:i,b:o}),e/360*180),o=180-o/100*180,i=i/100*260,r=this.elemPicker.find("."+E)[0];this.elemPicker.find("."+I).css("top",e),r.style.background="#"+n,this.elemPicker.find("."+M).css({top:o/r.offsetHeight*100+"%",left:i/r.offsetWidth*100+"%"})},s.prototype.pickerEvents=function(){var c=this,a=c.config,s=c.elemColorBox.find("."+T),d=c.elemPicker.find("."+X+" input"),o={clear:function(e){s[0].style.background="",c.elemColorBox.find("."+B).removeClass(C).addClass(w),c.color="",a.done&&a.done(""),c.removePicker()},confirm:function(e,i){var o,t,n,r,l=x.trim(d.val());-1>16,g:(65280&n)>>8,b:255&n},t=j(r),s[0].style.background=o="#"+H(t),c.elemColorBox.find("."+B).removeClass(w).addClass(C)),"change"===i?(c.select(t.h,t.s,t.b,i),a.change&&a.change(o)):(c.color=l,a.done&&a.done(l),c.removePicker())}};c.elemPicker.on("click","*[colorpicker-events]",function(){var e=x(this),i=e.attr("colorpicker-events");o[i]&&o[i].call(this,e)}),d.on("keyup",function(e){var i=x(this);o.confirm.call(this,i,13===e.keyCode?null:"change")})},s.prototype.events=function(){var e=this;e.config;e.elemColorBox.on("click",function(){e.renderPicker(),x(c)[0]&&(e.val(),e.side())})},a.on(i,function(e){var i,o,t;r.thisId&&(i=n.getThis(r.thisId))&&(o=i.config,t=i.elemColorBox.find("."+T),x(e.target).hasClass(l)||x(e.target).parents("."+l)[0]||x(e.target).hasClass(c.replace(/\./g,""))||x(e.target).parents(c)[0]||i.elemPicker&&(i.color?(e=j(L(i.color)),i.select(e.h,e.s,e.b)):i.elemColorBox.find("."+B).removeClass(C).addClass(w),t[0].style.background=i.color||"","function"==typeof o.cancel&&o.cancel(i.color),i.removePicker()))}),W.on("resize",function(){if(r.thisId){var e=n.getThis(r.thisId);if(e)return!(!e.elemPicker||!x(c)[0])&&void e.position()}}),n.that={},n.getThis=function(e){var i=n.that[e];return i||o.error(e?t+" instance with ID '"+e+"' not found":"ID argument required"),i},r.render=function(e){e=new s(e);return n.call(e)},e(t,r)});layui.define("jquery",function(t){"use strict";var u=layui.$,d=(layui.hint(),layui.device()),r="element",y="layui-this",f="layui-show",c=".layui-tab-title",i=function(){this.config={}},h=(i.prototype.set=function(t){return u.extend(!0,this.config,t),this},i.prototype.on=function(t,i){return layui.onevent.call(this,r,t,i)},i.prototype.tabAdd=function(t,i){var a,e=u(".layui-tab[lay-filter="+t+"]"),l=e.children(c),n=l.children(".layui-tab-bar"),s=e.children(".layui-tab-content"),o=""+(i.title||"unnaming")+"";return n[0]?n.before(o):l.append(o),s.append('
                      "+(i.content||"")+"
                      "),i.change&&this.tabChange(t,i.id),l.data("LAY_TAB_CHANGE",i.change),w.tabAuto(i.change?"change":null,e),this},i.prototype.tabDelete=function(t,i,a){t=u(".layui-tab[lay-filter="+t+"]").children(c).find('>li[lay-id="'+i+'"]');return w.tabDelete.call(t[0],{liElem:t,force:a}),this},i.prototype.tabChange=function(t,i,a){t=u(".layui-tab[lay-filter="+t+"]").children(c).find('>li[lay-id="'+i+'"]');return w.tabClick.call(t[0],{liElem:t,force:a}),this},i.prototype.tab=function(a){a=a||{},e.on("click",a.headerElem,function(t){var i=u(a.headerElem).index(u(this));w.tabClick.call(this,{index:i,options:a})})},i.prototype.progress=function(t,i){var a="layui-progress",t=u("."+a+"[lay-filter="+t+"]").find("."+a+"-bar"),a=t.find("."+a+"-text");return t.css("width",function(){return/^.+\/.+$/.test(i)?100*new Function("return "+i)()+"%":i}).attr("lay-percent",i),a.text(i),this},".layui-nav"),p="layui-nav-item",b="layui-nav-bar",v="layui-nav-tree",m="layui-nav-child",g="layui-nav-more",C="layui-anim layui-anim-upbit",w={tabClick:function(t){var i=(t=t||{}).options||{},a=t.liElem||u(this),e=i.headerElem?a.parent():a.parents(".layui-tab").eq(0),i=i.bodyElem?u(i.bodyElem):e.children(".layui-tab-content").children(".layui-tab-item"),l=a.find("a"),l="javascript:;"!==l.attr("href")&&"_blank"===l.attr("target"),n="string"==typeof a.attr("lay-unselect"),s=e.attr("lay-filter"),o=a.attr("lay-id"),c="index"in t?t.index:a.parent().children("li").index(a);if(!t.force){var t=a.siblings("."+y);if(!1===layui.event.call(this,r,"tabBeforeChange("+s+")",{elem:e,from:{index:a.parent().children("li").index(t),id:t.attr("lay-id")},to:{index:c,id:o}}))return}l||n||(a.addClass(y).siblings().removeClass(y),(o?t=(t=i.filter('[lay-id="'+o+'"]')).length?t:i.eq(c):i.eq(c)).addClass(f).siblings().removeClass(f)),layui.event.call(this,r,"tab("+s+")",{elem:e,index:c,id:o})},tabDelete:function(t){var i=(t=t||{}).liElem||u(this).parent(),a=i.parent().children("li").index(i),e=i.closest(".layui-tab"),l=e.children(".layui-tab-content").children(".layui-tab-item"),n=e.attr("lay-filter"),s=i.attr("lay-id");if(!t.force&&!1===layui.event.call(i[0],r,"tabBeforeDelete("+n+")",{elem:e,index:a,id:s}))return;i.hasClass(y)&&(i.next()[0]&&i.next().is("li")?w.tabClick.call(i.next()[0],{index:a+1}):i.prev()[0]&&i.prev().is("li")&&w.tabClick.call(i.prev()[0],null,a-1)),i.remove(),(s?t=(t=l.filter('[lay-id="'+s+'"]')).length?t:l.eq(a):l.eq(a)).remove(),setTimeout(function(){w.tabAuto(null,e)},50),layui.event.call(this,r,"tabDelete("+n+")",{elem:e,index:a,id:s})},tabAuto:function(l,t){var n="layui-tab-more",s="layui-tab-bar",o="layui-tab-close",c=this;(t||u(".layui-tab")).each(function(){var t=u(this),a=t.children(".layui-tab-title"),i=(t.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),i=u(''),e=(c===window&&d.ie,t.attr("lay-allowclose"));e&&"false"!==e&&a.find("li").each(function(){var t,i=u(this);i.find("."+o)[0]||"false"===i.attr("lay-allowclose")||((t=u('')).on("click",function(t){w.tabDelete.call(this,{e:t})}),i.append(t))}),"string"!=typeof t.attr("lay-unauto")&&(a.prop("scrollWidth")>a.outerWidth()+1||a.find("li").length&&a.height()>(e=a.find("li").eq(0).height())+e/2?("change"===l&&a.data("LAY_TAB_CHANGE")&&a.addClass(n),a.find("."+s)[0]||(a.append(i),t.attr("overflow",""),i.on("click",function(t){var i=a.hasClass(n);a[i?"removeClass":"addClass"](n)}))):(a.find("."+s).remove(),t.removeAttr("overflow")))})},hideTabMore:function(t){var i=u(".layui-tab-title");!0!==t&&"tabmore"===u(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=u(this),i=t.closest(h),a=i.attr("lay-filter"),e=t.parent(),l=t.siblings("."+m),n="string"==typeof e.attr("lay-unselect");if("javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||n||l[0]||(i.find("."+y).removeClass(y),e.addClass(y)),i.hasClass(v)){var n=p+"ed",s=!e.hasClass(n),o=function(){u(this).css({display:""}),i.children("."+b).css({opacity:0})};if(l.is(":animated"))return;l.removeClass(C),l[0]&&(s?(l.slideDown(200,o),e.addClass(n)):(e.removeClass(n),l.show().slideUp(200,o)),"string"!=typeof i.attr("lay-accordion")&&"all"!==i.attr("lay-shrink")||((s=e.siblings("."+n)).removeClass(n),s.children("."+m).show().stop().slideUp(200,o)))}layui.event.call(this,r,"nav("+a+")",t)},collapse:function(){var t=u(this),i=t.find(".layui-colla-icon"),a=t.siblings(".layui-colla-content"),e=t.parents(".layui-collapse").eq(0),l=e.attr("lay-filter"),n="none"===a.css("display");"string"==typeof e.attr("lay-accordion")&&((e=e.children(".layui-colla-item").children("."+f)).siblings(".layui-colla-title").children(".layui-colla-icon").html(""),e.removeClass(f)),a[n?"addClass":"removeClass"](f),i.html(n?"":""),layui.event.call(this,r,"collapse("+l+")",{title:t,content:a,show:n})}},a=(i.prototype.render=i.prototype.init=function(t,i){var a="string"==typeof i&&i?'[lay-filter="'+i+'"]':"",e={tab:function(t){t=t||u(".layui-tab"+a);w.tabAuto.call({},null,t)},nav:function(t){var s={},o={},c={},r="layui-nav-title";(t||u(h+a)).each(function(t){var i=u(this),a=u(''),e=i.find("."+p),l=i.find("."+b);l[0]&&l.remove(),i.append(a),(i.hasClass(v)?e.find("dd,>."+r):e).off("mouseenter.lay_nav").on("mouseenter.lay_nav",function(){!function(t,i,a){var e,l=u(this),n=l.find("."+m);i.hasClass(v)?n[0]||(e=l.children("."+r),t.css({top:l.offset().top-i.offset().top,height:(e[0]?e:l).outerHeight(),opacity:1})):(n.addClass(C),n.hasClass("layui-nav-child-c")&&n.css({left:-(n.outerWidth()-l.width())/2}),n[0]?t.css({left:t.position().left+t.width()/2,width:0,opacity:0}):t.css({left:l.position().left+parseFloat(l.css("marginLeft")),top:l.position().top+l.height()-t.height()}),s[a]=setTimeout(function(){t.css({width:n[0]?0:l.width(),opacity:n[0]?0:1})},d.ie&&d.ie<10?0:200),clearTimeout(c[a]),"block"===n.css("display")&&clearTimeout(o[a]),o[a]=setTimeout(function(){n.addClass(f),l.find("."+g).addClass(g+"d")},300))}.call(this,a,i,t)}).off("mouseleave.lay_nav").on("mouseleave.lay_nav",function(){i.hasClass(v)?a.css({height:0,opacity:0}):(clearTimeout(o[t]),o[t]=setTimeout(function(){i.find("."+m).removeClass(f),i.find("."+g).removeClass(g+"d")},300))}),i.off("mouseleave.lay_nav").on("mouseleave.lay_nav",function(){clearTimeout(s[t]),c[t]=setTimeout(function(){i.hasClass(v)||a.css({width:0,left:a.position().left+a.width()/2,opacity:0})},200)}),e.find("a").each(function(){var t=u(this);t.parent();t.siblings("."+m)[0]&&!t.children("."+g)[0]&&t.append(''),t.off("click",w.clickThis).on("click",w.clickThis)})})},breadcrumb:function(t){(t||u(".layui-breadcrumb"+a)).each(function(){var t=u(this),i="lay-separator",a=t.attr(i)||"/",e=t.find("a");e.next("span["+i+"]")[0]||(e.each(function(t){t!==e.length-1&&u(this).after(""+a+"")}),t.css("visibility","visible"))})},progress:function(t){var e="layui-progress";(t||u("."+e+a)).each(function(){var t=u(this),i=t.find(".layui-progress-bar"),a=i.attr("lay-percent");i.css("width",function(){return/^.+\/.+$/.test(a)?100*new Function("return "+a)()+"%":a}),t.attr("lay-showpercent")&&setTimeout(function(){i.html(''+a+"")},350)})},collapse:function(t){(t||u(".layui-collapse"+a)).each(function(){u(this).find(".layui-colla-item").each(function(){var t=u(this),i=t.find(".layui-colla-title"),t="none"===t.find(".layui-colla-content").css("display");i.find(".layui-colla-icon").remove(),i.append(''+(t?"":"")+""),i.off("click",w.collapse).on("click",w.collapse)})})}};return t&&"object"==typeof i&&i instanceof u?e[t](i):e[t]?e[t]():layui.each(e,function(t,i){i()})},new i),e=u(document);u(function(){a.render()}),e.on("click",".layui-tab-title li",w.tabClick),u(window).on("resize",w.tabAuto),t(r,a)});layui.define(["lay","layer"],function(e){"use strict";var F=layui.$,a=layui.lay,t=layui.layer,R=layui.device(),i="upload",s="layui_"+i+"_index",w={config:{},index:layui[i]?layui[i].index+1e4:0,set:function(e){var t=this;return t.config=F.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,i,e,t)}},o=function(){var t=this,e=t.config.id;return{upload:function(e){t.upload.call(t,e)},reload:function(e){t.reload.call(t,e)},config:(o.that[e]=t).config}},r="layui-upload-file",l="layui-upload-form",E="layui-upload-iframe",L="layui-upload-choose",T="UPLOADING",D=function(e){var t=this;t.index=++w.index,t.config=F.extend({},t.config,w.config,e),t.render()};D.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",force:"",field:"file",acceptMime:"",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1,text:{"cross-domain":"Cross-domain requests are not supported","data-format-error":"Please return JSON data format","check-error":"",error:"","limit-number":null,"limit-size":null}},D.prototype.reload=function(e){var t=this;t.config=F.extend({},t.config,e),t.render(!0)},D.prototype.render=function(e){var t=this,i=t.config,n=F(i.elem);return 1"].join("")),n=t.elem.next();(n.hasClass(r)||n.hasClass(l))&&n.remove(),R.ie&&R.ie<10&&t.elem.wrap('
                      '),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(i),R.ie&&R.ie<10&&e.initIE()},D.prototype.initIE=function(){var i,e=this.config,t=F(''),n=F(['
                      ',"
                      "].join(""));F("#"+E)[0]||F("body").append(t),e.elem.next().hasClass(l)||(this.elemFile.wrap(n),e.elem.next("."+l).append((i=[],layui.each(e.data,function(e,t){t="function"==typeof t?t():t,i.push('')}),i.join(""))))},D.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},D.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},D.prototype.preview=function(n){window.FileReader&&layui.each(this.chooseFiles,function(e,t){var i=new FileReader;i.readAsDataURL(t),i.onload=function(){n&&n(e,t,this.result)}})},D.prototype.upload=function(e,t){var i,n,a,o,r,u=this,f=u.config,s=f.text||{},l=u.elemFile[0],c=function(){return e||u.files||u.chooseFiles||l.files},d=function(){var a=0,o=0,r=c(),l=function(){f.multiple&&a+o===u.fileLength&&"function"==typeof f.allDone&&f.allDone({total:u.fileLength,successful:a,failed:o})},i=function(i){var n=new FormData,t=function(e){i.unified?layui.each(r,function(e,t){delete t[T]}):delete e[T]};if(layui.each(f.data,function(e,t){t="function"==typeof t?i.unified?t():t(i.index,i.file):t,n.append(e,t)}),i.unified)layui.each(r,function(e,t){t[T]||(t[T]=!0,n.append(f.field,t))});else{if(i.file[T])return;n.append(f.field,i.file),i.file[T]=!0}var e={url:f.url,type:"post",data:n,dataType:f.dataType||"json",contentType:!1,processData:!1,headers:f.headers||{},success:function(e){f.unified?a+=u.fileLength:a++,m(i.index,e),l(i.index),t(i.file)},error:function(e){f.unified?o+=u.fileLength:o++,u.msg(s.error||["Upload failed, please try again.","status: "+(e.status||"")+" - "+(e.statusText||"error")].join("
                      ")),g(i.index,e.responseText,e),l(i.index),t(i.file)}};"function"==typeof f.progress&&(e.xhr=function(){var e=F.ajaxSettings.xhr();return e.upload.addEventListener("progress",function(e){var t;e.lengthComputable&&(t=Math.floor(e.loaded/e.total*100),f.progress(t,(f.item||f.elem)[0],e,i.index))}),e}),F.ajax(e)};f.unified?i({unified:!0,index:0}):layui.each(r,function(e,t){i({index:e,file:t})})},p=function(){var n=F("#"+E);u.elemFile.parent().submit(),clearInterval(D.timer),D.timer=setInterval(function(){var e,t=n.contents().find("body");try{e=t.text()}catch(i){u.msg(s["cross-domain"]),clearInterval(D.timer),g()}e&&(clearInterval(D.timer),t.html(""),m(0,e))},30)},h=function(e){if("json"===f.force&&"object"!=typeof e)try{return{status:"CONVERTED",data:JSON.parse(e)}}catch(t){return u.msg(s["data-format-error"]),{status:"FORMAT_ERROR",data:{}}}return{status:"DO_NOTHING",data:{}}},m=function(e,t){u.elemFile.next("."+L).remove(),l.value="";var i=h(t);switch(i.status){case"CONVERTED":t=i.data;break;case"FORMAT_ERROR":return}"function"==typeof f.done&&f.done(t,e||0,function(e){u.upload(e)})},g=function(e,t,i){f.auto&&(l.value="");var n=h(t);switch(n.status){case"CONVERTED":t=n.data;break;case"FORMAT_ERROR":return}"function"==typeof f.error&&f.error(e||0,function(e){u.upload(e)},t,i)},v=f.exts,y=(n=[],layui.each(e||u.chooseFiles,function(e,t){n.push(t.name)}),n),x={preview:function(e){u.preview(e)},upload:function(e,t){var i={};i[e]=t,u.upload(i)},pushFile:function(){return u.files=u.files||{},layui.each(u.chooseFiles,function(e,t){u.files[e]=t}),u.files},resetFile:function(e,t,i){t=new File([t],i);u.files=u.files||{},u.files[e]=t},getChooseFiles:function(){return u.chooseFiles}},b={file:"\u6587\u4ef6",images:"\u56fe\u7247",video:"\u89c6\u9891",audio:"\u97f3\u9891"}[f.accept]||"\u6587\u4ef6",y=0===y.length?l.value.match(/[^\/\\]+\..+/g)||[]:y;if(0!==y.length){switch(f.accept){case"file":layui.each(y,function(e,t){if(v&&!RegExp(".\\.("+v+")$","i").test(escape(t)))return i=!0});break;case"video":layui.each(y,function(e,t){if(!RegExp(".\\.("+(v||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(t)))return i=!0});break;case"audio":layui.each(y,function(e,t){if(!RegExp(".\\.("+(v||"mp3|wav|mid")+")$","i").test(escape(t)))return i=!0});break;default:layui.each(y,function(e,t){if(!RegExp(".\\.("+(v||"jpg|png|gif|bmp|jpeg|svg|webp")+")$","i").test(escape(t)))return i=!0})}if(i)return u.msg(s["check-error"]||"\u9009\u62e9\u7684"+b+"\u4e2d\u5305\u542b\u4e0d\u652f\u6301\u7684\u683c\u5f0f"),l.value="";if("choose"!==t&&!f.auto||(f.choose&&f.choose(x),"choose"!==t)){if(u.fileLength=(a=0,b=c(),layui.each(b,function(){a++}),a),f.number&&u.fileLength>f.number)return u.msg("function"==typeof s["limit-number"]?s["limit-number"](f,u.fileLength):"\u540c\u65f6\u6700\u591a\u53ea\u80fd\u4e0a\u4f20: "+f.number+" \u4e2a\u6587\u4ef6
                      \u60a8\u5f53\u524d\u5df2\u7ecf\u9009\u62e9\u4e86: "+u.fileLength+" \u4e2a\u6587\u4ef6");if(01024*f.size&&(t=1<=(t=f.size/1024)?t.toFixed(2)+"MB":f.size+"KB",l.value="",o=t)}),o)return u.msg("function"==typeof s["limit-size"]?s["limit-size"](f,o):"\u6587\u4ef6\u5927\u5c0f\u4e0d\u80fd\u8d85\u8fc7 "+o);r=function(){if(R.ie)return(9'+e+"")},l=function(i){var n=!0;return layui.each(a.files,function(e,t){if(!(n=!(t.name===i.name)))return!0}),n},u=function(e){var i=function(e){e.ext=e.name.substr(e.name.lastIndexOf(".")+1).toLowerCase(),e.sizes=w.util.parseSize(e.size)};return e instanceof FileList?layui.each(e,function(e,t){i(t)}):i(e),e},f=function(e){var i;return(e=e||[]).length?a.files?(i=[],layui.each(e,function(e,t){l(t)&&i.push(u(t))}),i):u(e):[]};n.elem.off("upload.start").on("upload.start",function(){var e=F(this);a.config.item=e,a.elemFile[0].click()}),R.ie&&R.ie<10||n.elem.off("upload.over").on("upload.over",function(){F(this).attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){F(this).removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(e,t){var i=F(this),t=f(t.originalEvent.dataTransfer.files);i.removeAttr("lay-over"),o(t),n.auto?a.upload():r(t)}),a.elemFile.on("change",function(){var e=f(this.files);0!==e.length&&(o(e),n.auto?a.upload():r(e))}),n.bindAction.off("upload.action").on("upload.action",function(){a.upload()}),n.elem.data(s)||(n.elem.on("click",function(){a.isFile()||F(this).trigger("upload.start")}),n.drag&&n.elem.on("dragover",function(e){e.preventDefault(),F(this).trigger("upload.over")}).on("dragleave",function(e){F(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),F(this).trigger("upload.drop",e)}),n.bindAction.on("click",function(){F(this).trigger("upload.action")}),n.elem.data(s,n.id))},w.util={parseSize:function(e,t){var i,n;return t=t||2,null!=e&&e?(i="string"==typeof e?parseFloat(e):e,n=Math.floor(Math.log(i)/Math.log(1024)),(e=(e=i/Math.pow(1024,n))%1==0?e:parseFloat(e.toFixed(t)))+["Bytes","Kb","Mb","Gb","Tb","Pb","Eb","Zb","Yb"][n]):"0"},promiseLikeResolve:function(e){var t=F.Deferred();return e&&"function"==typeof e.then?e.then(t.resolve,t.reject):t.resolve(e),t.promise()}},o.that={},o.getThis=function(e){var t=o.that[e];return t||hint.error(e?i+" instance with ID '"+e+"' not found":"ID argument required"),t},w.render=function(e){e=new D(e);return o.call(e)},e(i,w)});layui.define(["lay","layer","util"],function(e){"use strict";var T=layui.$,h=layui.layer,d=layui.util,l=layui.hint(),_=(layui.device(),"form"),p=".layui-form",E="layui-this",O="layui-hide",A="layui-disabled",y="layui-input-number-invalid",f=lay.ie&&8===parseFloat(lay.ie)||void 0===Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,"checked"),t=function(){this.config={verify:{required:function(e){if(!/[\S]+/.test(e)||e===undefined||null===e)return"\u5fc5\u586b\u9879\u4e0d\u80fd\u4e3a\u7a7a"},phone:function(e){if(e&&!/^1\d{10}$/.test(e))return"\u624b\u673a\u53f7\u683c\u5f0f\u4e0d\u6b63\u786e"},email:function(e){if(e&&!/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(e))return"\u90ae\u7bb1\u683c\u5f0f\u4e0d\u6b63\u786e"},url:function(e){if(e&&!/^(#|(http(s?)):\/\/|\/\/)[^\s]+\.[^\s]+$/.test(e))return"\u94fe\u63a5\u683c\u5f0f\u4e0d\u6b63\u786e"},number:function(e){if(e&&isNaN(e))return"\u53ea\u80fd\u586b\u5199\u6570\u5b57"},date:function(e){if(e&&!/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/.test(e))return"\u65e5\u671f\u683c\u5f0f\u4e0d\u6b63\u786e"},identity:function(e){if(e&&!/(^\d{15}$)|(^\d{17}(x|X|\d)$)/.test(e))return"\u8eab\u4efd\u8bc1\u53f7\u683c\u5f0f\u4e0d\u6b63\u786e"}},autocomplete:null}},i=(t.prototype.set=function(e){return T.extend(!0,this.config,e),this},t.prototype.verify=function(e){return T.extend(!0,this.config.verify,e),this},t.prototype.getFormElem=function(e){return T(p+(e?'[lay-filter="'+e+'"]':""))},t.prototype.on=function(e,t){return layui.onevent.call(this,_,e,t)},t.prototype.val=function(e,o){return this.getFormElem(e).each(function(e,t){var i,a,n,l,r=T(this);for(i in o)lay.hasOwn(o,i)&&(n=o[i],(l=r.find('[name="'+i+'"]'))[0])&&("checkbox"===(a=l[0].type)?l[0].checked=n:"radio"===a?l.each(function(){this.checked=this.value==n+""}):l.val(n))}),r.render(null,e),this.getValue(e)},t.prototype.getValue=function(e,t){t=t||this.getFormElem(e);var n={},l={},e=t.find("input,select,textarea");return layui.each(e,function(e,t){var i,a=T(this);t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name&&(/^.*\[\]$/.test(t.name)&&(i=t.name.match(/^(.*)\[\]$/g)[0],n[i]=0|n[i],i=t.name.replace(/^(.*)\[\]$/,"$1["+n[i]+++"]")),/^(checkbox|radio)$/.test(t.type)&&!t.checked||(l[i||t.name]="SELECT"===this.tagName&&"string"==typeof this.getAttribute("multiple")?a.val()||[]:this.value))}),l},t.prototype.render=function(e,t){var u=this,i=u.config,a=T(p+(t?'[lay-filter="'+t+'"]':"")),n={input:function(e){var e=e||a.find("input,textarea"),h=(i.autocomplete&&e.attr("autocomplete",i.autocomplete),function(e,t){var i=e.val(),a=Number(i),n=Number(e.attr("step"))||1,l=Number(e.attr("min")),r=Number(e.attr("max")),o=Number(e.attr("lay-precision")),s="click"!==t&&""===i,c="init"===t,u=isNaN(a),d="string"==typeof e.attr("lay-step-strictly");if(e.toggleClass(y,u),!u){if("click"===t){if("text"===e[0].type&&"string"==typeof e.attr("readonly"))return;a=!!T(this).index()?a-n:a+n}u=function(e){return((e.toString().match(/\.(\d+$)/)||[])[1]||"").length},o=0<=o?o:Math.max(u(n),u(i));s||(c||r<=(a=(a=d?Math.round(a/n)*n:a)<=l?l:a)&&(a=r),0===o?a=parseInt(a):0'),e=layui.isArray(i.value)?i.value:[i.value],e=T((a=[],layui.each(e,function(e,t){a.push('')}),a.join(""))),n=(t.append(e),i.split&&t.addClass("layui-input-split"),i.className&&t.addClass(i.className),r.next("."+u)),l=(n[0]&&n.remove(),r.parent().hasClass(s)||r.wrap('
                      '),r.next("."+c));l[0]?((n=l.find("."+u))[0]&&n.remove(),l.prepend(t),r.css("padding-right",function(){return(r.closest(".layui-input-group")[0]?0:l.outerWidth())+t.outerWidth()})):(t.addClass(c),r.after(t)),"auto"===i.show&&d(t,r.val()),"function"==typeof i.init&&i.init.call(this,r,i),r.on("input propertychange",function(){var e=this.value;"auto"===i.show&&d(t,e)}),r.on("blur",function(){"function"==typeof i.blur&&i.blur.call(this,r,i)}),e.on("click",function(){var e=r.attr("lay-filter");T(this).hasClass(A)||("function"==typeof i.click&&i.click.call(this,r,i),layui.event.call(this,_,"input-affix("+e+")",{elem:r[0],affix:o,options:i}))})},p={eye:{value:"eye-invisible",click:function(e,t){var i="LAY_FORM_INPUT_AFFIX_SHOW",a=e.data(i);e.attr("type",a?"password":"text").data(i,!a),n({value:a?"eye-invisible":"eye"})}},clear:{value:"clear",click:function(e){e.val("").focus(),d(T(this).parent(),null)},show:"auto",disabled:e},number:{value:["up","down"],split:!0,className:"layui-input-number",disabled:r.is("[disabled]"),init:function(a){var e,n,l,t,i,r;"text"!==a.attr("type")&&"text"!==a[0].type||(l=n=!(e=".lay_input_number"),t="string"==typeof a.attr("readonly"),i="string"==typeof a.attr("lay-wheel"),r=a.next(".layui-input-number").children("i"),a.attr("lay-input-mirror",a.val()),a.off(e),a.on("keydown"+e,function(e){n=!1,8!==e.keyCode&&46!==e.keyCode||(n=!0),t||2!==r.length||38!==e.keyCode&&40!==e.keyCode||(e.preventDefault(),r.eq(38===e.keyCode?0:1).click())}),a.on("input"+e+" propertychange"+e,function(e){var t,i;l||"propertychange"===e.type&&"value"!==e.originalEvent.propertyName||(n||""===(e=this.value)||"00"!==e.slice(0,2)&&!e.match(/\s/g)&&!((t=e.match(/\./g))&&1=Math.abs(e.deltaY)?e.deltaX:e.deltaY):"mousewheel"===e.type?t=-e.originalEvent.wheelDelta:"DOMMouseScroll"===e.type&&(t=e.originalEvent.detail),r.eq(0S.height()&&t<=e&&l.addClass(C+"up"),h(),s&&g.off("mousedown.lay_select_ieph").on("mousedown.lay_select_ieph",function(){m[0].__ieph=!0,setTimeout(function(){m[0].__ieph=!1},60)}),n=lay.onClickOutside((a?l:g)[0],function(){p(),k&&m.val(k)},{ignore:v,detectIframe:!0,capture:!1})},p=function(e){v.parent().removeClass(C+"ed "+C+"up"),m.blur(),u&&g.children("."+N).remove(),"function"==typeof n&&(n(),n=null),a&&(l.detach(),T(window).off("resize.lay_select_resize")),e||y(m.val(),function(e){var t=f[0].selectedIndex;e&&(k=T(f[0].options[t]).prop("text"),0===t&&k===m.attr("placeholder")&&(k=""),m.val(k||""))})},h=function(){var e,t,i=g.children("dd."+E);i[0]&&(e=i.position().top,t=g.height(),i=i.height(),t").addClass(N).attr("lay-value",n).text(n),a=(i=g.children().eq(0)).hasClass("layui-select-tips"),i[a?"after":"before"](t)):e?g.find("."+w)[0]||g.append('

                      \u65e0\u5339\u914d\u9879

                      '):g.find("."+w).remove()},"keyup"),""===n&&(f.val(""),g.find("."+E).removeClass(E),(f[0].options[0]||{}).value||g.children("dd:eq(0)").addClass(E),g.find("."+w).remove(),u)&&g.children("."+N).remove(),void h()))},50)).on("blur",function(e){var t=f[0].selectedIndex;k=T(f[0].options[t]).prop("text"),0===t&&k===m.attr("placeholder")&&(k=""),setTimeout(function(){y(m.val(),function(e){k||m.val("")},"blur")},200)}),g.on("click","dd",function(){var e,t,i=T(this),a=i.attr("lay-value"),n=f.attr("lay-filter");return i.hasClass(A)||(u&&i.hasClass(N)&&(t=(e=T("
                      "].join(""));i.after(l),function(t,i){var a=T(this),e=a.attr("lay-skin")||"primary",n="switch"===e,e="primary"===e;t.on("click",function(){var e=a.attr("lay-filter");a[0].disabled||(a[0].indeterminate&&(a[0].indeterminate=!1),a[0].checked=!a[0].checked,layui.event.call(a[0],_,i[2]+"("+e+")",{elem:a[0],value:a[0].value,othis:t}))}),u.syncAppearanceOnPropChanged(this,"checked",function(){var e;n&&(e=(t.next("*[lay-checkbox]")[0]?t.next().html():a.attr("title")||"").split("|"),t.children("div").html(!this.checked&&e[1]||e[0])),t.toggleClass(i[1],this.checked)}),e&&u.syncAppearanceOnPropChanged(this,"indeterminate",function(){this.indeterminate?t.children(".layui-icon-ok").removeClass("layui-icon-ok").addClass(c.SUBTRA):t.children("."+c.SUBTRA).removeClass(c.SUBTRA).addClass("layui-icon-ok")})}.call(this,l,r)})},radio:function(e){var s="layui-form-radio",c=["layui-icon-radio","layui-icon-circle"],e=e||a.find("input[type=radio]");e.each(function(e,t){var i=T(this),a=i.next("."+s),n=this.disabled,l=i.attr("lay-skin");if(i.closest("[lay-ignore]").length)return i.show();f&&v.call(t,"lay-form-sync-checked",t.checked),a[0]&&a.remove();var a=d.escape(t.title||""),r=[],o=(i.next("[lay-radio]")[0]&&(a=(o=i.next()).html()||"",1",'',"
                      "+a+"
                      ","
                      "].join("")));i.after(o),function(i){var a=T(this),n="layui-anim-scaleSpring";i.on("click",function(){var e=a.attr("lay-filter");a[0].disabled||(a[0].checked=!0,layui.event.call(a[0],_,"radio("+e+")",{elem:a[0],value:a[0].value,othis:i}))}),u.syncAppearanceOnPropChanged(this,"checked",function(){var e,t=this;t.checked?(i.addClass(s+"ed"),i.children(".layui-icon").addClass(n+" "+c[0]),e=a.parents(p).find("input[name="+t.name.replace(/(\.|#|\[|\])/g,"\\$1")+"]"),layui.each(e,function(){t!==this&&(this.checked=!1)})):(i.removeClass(s+"ed"),i.children(".layui-icon").removeClass(n+" "+c[0]).addClass(c[1]))})}.call(this,o)})}},t=function(){layui.each(n,function(e,t){t()})};return"object"===layui.type(e)?T(e).is(p)?(a=T(e),t()):e.each(function(e,t){var i=T(t);i.closest(p).length&&("SELECT"===t.tagName?n.select(i):"INPUT"===t.tagName&&("checkbox"===(t=t.type)||"radio"===t?n[t](i):n.input(i)))}):e?n[e]?n[e]():l.error('\u4e0d\u652f\u6301\u7684 "'+e+'" \u8868\u5355\u6e32\u67d3'):t(),u},t.prototype.syncAppearanceOnPropChanged=f?function(e,t,i){var a=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,t);Object.defineProperty(e,t,lay.extend({},a,{get:function(){return"string"==typeof this.getAttribute("lay-form-sync-"+t)},set:function(e){v.call(this,"lay-form-sync-"+t,e),i.call(this)}}))}:function(e,t,i){var a=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,t);Object.defineProperty(e,t,lay.extend({},a,{get:function(){return a.get.call(this)},set:function(e){a.set.call(this,e),i.call(this)}}))},t.prototype.validate=function(e){var u,d=this.config.verify,p="layui-form-danger";return!(e=T(e))[0]||(e.attr("lay-verify")!==undefined||!1!==this.validate(e.find("*[lay-verify]")))&&(layui.each(e,function(e,r){var o=T(this),t=(o.attr("lay-verify")||"").split("|"),s=o.attr("lay-vertype"),c="string"==typeof(c=o.val())?T.trim(c):c;if(o.removeClass(p),layui.each(t,function(e,t){var i="",a=d[t];if(a){var n="function"==typeof a?i=a(c,r):!a[0].test(c),l="select"===r.tagName.toLowerCase()||/^(checkbox|radio)$/.test(r.type),i=i||a[1];if("required"===t&&(i=o.attr("lay-reqtext")||i),n)return"tips"===s?h.tips(i,!o.closest("[lay-ignore]").length&&l?o.next():o,{tips:1}):"alert"===s?h.alert(i,{title:"\u63d0\u793a",shadeClose:!0}):/\b(string|number)\b/.test(typeof i)&&h.msg(i,{icon:5,shift:6}),setTimeout(function(){(l?o.next().find("input"):r).focus()},7),o.addClass(p),u=!0}}),u)return u}),!u)},t.prototype.submit=function(e,t){var i={},a=T(this),e="string"==typeof e?e:a.attr("lay-filter"),n=this.getFormElem?this.getFormElem(e):a.parents(p).eq(0),l=n.find("*[lay-verify]");return!!r.validate(l)&&(i=r.getValue(null,n),l={elem:this.getFormElem?window.event&&window.event.target:this,form:(this.getFormElem?n:a.parents("form"))[0],field:i},"function"==typeof t&&t(l),layui.event.call(this,_,"submit("+e+")",l))});function v(e,t){var i=!!t,t=2===arguments.length&&!t;return null!==this.getAttribute(e)?i||(this.removeAttribute(e),!1):!t&&(this.setAttribute(e,""),!0)}var m=["-",".","e","E","+"];var r=new t,t=T(document),S=T(window);T(function(){r.render()}),t.on("reset",p,function(){var e=T(this).attr("lay-filter");setTimeout(function(){r.render(null,e)},50)}),t.on("submit",p,i).on("click","*[lay-submit]",i),e(_,r)});layui.define(["lay","laytpl","laypage","form","util"],function(s){"use strict";var f=layui.$,r=layui.lay,m=layui.laytpl,p=layui.laypage,g=layui.layer,i=layui.form,v=layui.util,b=layui.hint(),x=layui.device(),k={config:{checkName:"LAY_CHECKED",indexName:"LAY_INDEX",initIndexName:"LAY_INDEX_INIT",numbersName:"LAY_NUM",disabledName:"LAY_DISABLED"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){return this.config=f.extend({},this.config,e),this},on:function(e,t){return layui.onevent.call(this,R,e,t)}},w=function(){var a=this,e=a.config,i=e.id||e.index;return{config:e,reload:function(e,t){a.reload.call(a,e,t)},reloadData:function(e,t){k.reloadData(i,e,t)},setColsWidth:function(){a.setColsWidth.call(a)},resize:function(){a.resize.call(a)}}},C=function(e){var t=w.that[e];return t||b.error(e?"The table instance with ID '"+e+"' not found":"ID argument required"),t||null},l=function(e){var t=w.config[e];return t||b.error(e?"The table instance with ID '"+e+"' not found":"ID argument required"),t||null},T=function(e){var t=this.config||{},a=(e=e||{}).item3,i=e.content;"numbers"===a.type&&(i=e.tplData[k.config.numbersName]);("escape"in a?a:t).escape&&(i=v.escape(i));t=e.text&&a.exportTemplet||a.templet||a.toolbar;return t&&(i="function"==typeof t?t.call(a,e.tplData,e.obj):m(function(e){try{return r(e).html()}catch(t){return e}}(t)||String(i)).render(f.extend({LAY_COL:a},e.tplData))),e.text?f("
                      "+i+"
                      ").text():i},R="table",N="lay-"+R+"-id",t=".layui-table",W="layui-hide",y="layui-hide-v",h="layui-none",_="layui-table-view",o=".layui-table-header",D=".layui-table-body",I=".layui-table-fixed-r",P=".layui-table-pageview",L=".layui-table-sort",A="layui-table-checked",E="layui-table-edit",M="layui-table-hover",u="laytable-cell-group",F="layui-table-col-special",S="layui-table-tool-panel",H="layui-table-expanded",O="layui-table-disabled-transition",j="LAY_TABLE_MOVE_DICT",e=function(e){return['',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',(e=e||{}).fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':"","{{# var isSort = !(item2.colGroup) && item2.sort; }}",'",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
                      ','
                      ','{{# if(item2.type === "checkbox"){ }}','',"{{# } else { }}",'{{-item2.title||""}}',"{{# if(isSort){ }}",'',"{{# } }}","{{# } }}","
                      ","
                      "].join("")},a=['',"","
                      "].join(""),B=[,"{{# if(d.data.toolbar){ }}",'
                      ','
                      ','
                      ',"
                      ","{{# } }}",'
                      ',"{{# if(d.data.loading){ }}",'
                      ','
                      ','{{# if(typeof d.data.loading === "string"){ }}',"{{- d.data.loading}}","{{# } else{ }}",'',"{{# } }}","
                      ","
                      ","{{# } }}","{{# var left, right; }}",'
                      ',e(),"
                      ",'
                      ',a,"
                      ","{{# if(left){ }}",'
                      ','
                      ',e({fixed:!0}),"
                      ",'
                      ',a,"
                      ","
                      ","{{# }; }}","{{# if(right){ }}",'
                      ','
                      ',e({fixed:"right"}),'
                      ',"
                      ",'
                      ',a,"
                      ","
                      ","{{# }; }}","
                      ","{{# if(d.data.totalRow){ }}",'
                      ','','',"
                      ","
                      ","{{# } }}",'
                      ','
                      ',"
                      "].join(""),d=f(window),z=f(document),n=function(e){this.index=++k.index,this.config=f.extend({},this.config,k.config,e),this.render()},c=(n.prototype.config={limit:10,loading:!0,escape:!0,cellMinWidth:60,cellMaxWidth:Number.MAX_VALUE,editTrigger:"click",defaultToolbar:["filter","exports","print"],defaultContextmenu:!0,autoSort:!0,text:{none:"\u65e0\u6570\u636e"},cols:[]},n.prototype.render=function(e){var t=this,a=t.config,i=(a.elem=f(a.elem),a.where=a.where||{},a.id="id"in a?a.id:a.elem.attr("id")||t.index);if(w.that[i]=t,(w.config[i]=a).request=f.extend({pageName:"page",limitName:"limit"},a.request),a.response=f.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",totalRowName:"totalRow",countName:"count"},a.response),null!==a.page&&"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,t.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return t;if(a.elem.attr("lay-filter")||a.elem.attr("lay-filter",a.id),"reloadData"===e)return t.pullData(t.page,{type:"reloadData"});a.index=t.index,t.key=a.id||a.index,t.setInit(),a.height&&/^full-.+$/.test(a.height)?(t.fullHeightGap=a.height.split("-")[1],a.height=d.height()-(parseFloat(t.fullHeightGap)||0)):a.height&&/^#\w+\S*-.+$/.test(a.height)?(i=a.height.split("-"),t.parentHeightGap=i.pop(),t.parentDiv=i.join("-"),a.height=f(t.parentDiv).height()-(parseFloat(t.parentHeightGap)||0)):"function"==typeof a.height&&(t.customHeightFunc=a.height,a.height=t.customHeightFunc());var l,e=a.elem,i=e.next("."+_),n=t.elem=f("
                      ");n.addClass((l=[_,_+"-"+t.index,"layui-form","layui-border-box"],a.className&&l.push(a.className),l.join(" "))).attr(((l={"lay-filter":"LAY-TABLE-FORM-DF-"+t.index,style:(l=[],a.width&&l.push("width:"+a.width+"px;"),l.join(""))})[N]=a.id,l)).html(m(B,{open:"{{",close:"}}",tagStyle:"legacy"}).render({data:a,index:t.index})),t.renderStyle(),i[0]&&i.remove(),e.after(n),t.layTool=n.find(".layui-table-tool"),t.layBox=n.find(".layui-table-box"),t.layHeader=n.find(o),t.layMain=n.find(".layui-table-main"),t.layBody=n.find(D),t.layFixed=n.find(".layui-table-fixed"),t.layFixLeft=n.find(".layui-table-fixed-l"),t.layFixRight=n.find(I),t.layTotal=n.find(".layui-table-total"),t.layPage=n.find(".layui-table-page"),t.renderToolbar(),t.renderPagebar(),t.fullSize(),t.setColsWidth({isInit:!0}),t.pullData(t.page),t.events()},n.prototype.initOpts=function(e){this.config;e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||{checkbox:50,radio:50,space:30,numbers:60}[e.type])},n.prototype.setInit=function(e){var n,a,d=this,r=d.config;if(r.clientWidth=r.width||(n=function(e){var t,a;e=e||r.elem.parent(),t=d.getContentWidth(e);try{a="none"===e.css("display")}catch(l){}var i=e.parent();return e[0]&&i&&i[0]&&(!t||a)?n(i):t})(),"width"===e)return r.clientWidth;r.height=r.maxHeight||r.height,r.css&&-1===r.css.indexOf(_)&&(a=r.css.split("}"),layui.each(a,function(e,t){t&&(a[e]="."+_+"-"+d.index+" "+t)}),r.css=a.join("}"));var c=function(a,e,i,l){var n,o;l?(l.key=[r.index,a,i].join("-"),l.colspan=l.colspan||0,l.rowspan=l.rowspan||0,d.initOpts(l),(n=a+(parseInt(l.rowspan)||1)) td:hover > .layui-table-cell{overflow: auto;}"].concat(x.ie?[".layui-table-edit{height: "+i+";}","td[data-edit]:hover:after{height: "+i+";}"]:[]),function(e,t){t&&o.push(a+" "+t)})),l.css&&o.push(l.css),r.style({target:this.elem[0],text:o.join(""),id:"DF-table-"+n})},n.prototype.renderToolbar=function(){var l,o=this,e=o.config,d=e.elem.attr("lay-filter"),t=['
                      ','
                      ','
                      '].join(""),a=o.layTool.find(".layui-table-tool-temp"),n=("default"===e.toolbar?a.html(t):"string"==typeof e.toolbar&&(t=f(e.toolbar).html()||"")&&a.html(m(t).render(e)),{filter:{title:"\u7b5b\u9009\u5217",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols",onClick:function(e){var a,n=e.config;(0,e.openPanel)({list:(a=[],o.eachCols(function(e,t){t.field&&"normal"==t.type&&a.push('
                    • "+(t.fieldTitle||t.title||t.field)+"
                    • ").text())+'" lay-filter="LAY_TABLE_TOOL_COLS">')}),a.join("")),done:function(){i.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var e=f(e.elem),t=this.checked,a=e.data("key"),i=o.col(a),l=i.hide,e=e.data("parentkey");i.key&&(i.hide=!t,o.elem.find('*[data-key="'+a+'"]')[t?"removeClass":"addClass"](W),l!=i.hide&&o.setParentCol(!t,e),o.resize(),layui.event.call(this,R,"colToggled("+d+")",{col:i,config:n}))})}})}},exports:{title:"\u5bfc\u51fa",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export",onClick:function(e){var t=e.data,a=e.config,i=e.openPanel,e=e.elem;if(!t.length)return g.tips("\u5f53\u524d\u8868\u683c\u65e0\u6570\u636e",e,{tips:3});x.ie?g.tips("\u5bfc\u51fa\u529f\u80fd\u4e0d\u652f\u6301 IE\uff0c\u8bf7\u7528 Chrome \u7b49\u9ad8\u7ea7\u6d4f\u89c8\u5668\u5bfc\u51fa",e,{tips:3}):i({list:['
                    • \u5bfc\u51fa CSV \u6587\u4ef6
                    • '].join(""),done:function(e,t){t.on("click",function(){var e=f(this).data("type");k.exportFile.call(o,a.id,null,e)})}})}},print:{title:"\u6253\u5370",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print",onClick:function(e){var t=e.data;if(!t.length)return g.tips("\u5f53\u524d\u8868\u683c\u65e0\u6570\u636e",e.elem,{tips:3});var t=window.open("about:blank","_blank"),e=[""].join(""),a=f(o.layHeader.html());a.append(o.layMain.find("table").html()),a.append(o.layTotal.find("table").html()),a.find("th.layui-table-patch").remove(),a.find("thead>tr>th."+F).filter(function(e,t){return!f(t).children("."+u).length}).remove(),a.find("tbody>tr>td."+F).remove(),t.document.write(e+a.prop("outerHTML")),t.document.close(),layui.device("edg").edg?(t.onafterprint=t.close,t.print()):(t.print(),t.close())}}});"object"==typeof e.defaultToolbar&&(l=[],e.defaultToolbar=f.map(e.defaultToolbar,function(e,t){var a="string"==typeof e,i=a?n[e]:e;return i&&(!(i=i.name&&n[i.name]?f.extend({},n[i.name],i):i).name&&a&&(i.name=e),l.push('
                      ')),i}),o.layTool.find(".layui-table-tool-self").html(l.join("")))},n.prototype.renderPagebar=function(){var e,t=this.config,a=this.layPagebar=f('
                      ');t.pagebar&&((e=f(t.pagebar).html()||"")&&a.append(m(e).render(t)),this.layPage.append(a))},n.prototype.setParentCol=function(e,t){var a=this.config,i=this.layHeader.find('th[data-key="'+t+'"]'),l=parseInt(i.attr("colspan"))||0;i[0]&&(t=t.split("-"),t=a.cols[t[1]][t[2]],e?l--:l++,i.attr("colspan",l),i[l?"removeClass":"addClass"](W),t.colspan2=l,t.hide=l<1,a=i.data("parentkey"))&&this.setParentCol(e,a)},n.prototype.setColsPatch=function(){var a=this,e=a.config;layui.each(e.cols,function(e,t){layui.each(t,function(e,t){t.hide&&a.setParentCol(t.hide,t.parentKey)})})},n.prototype.setGroupWidth=function(i){var e,l=this;l.config.cols.length<=1||((e=l.layHeader.find((i?"th[data-key="+i.data("parentkey")+"]>":"")+"."+u)).css("width",0),layui.each(e.get().reverse(),function(){var e=f(this),t=e.parent().data("key"),a=0;l.layHeader.eq(0).find("th[data-parentkey="+t+"]").width(function(e,t){f(this).hasClass(W)||0o.layMain.prop("clientHeight")&&(e.style.width=parseFloat(e.style.width)-i+"px")}),!p&&h?y.width(o.getContentWidth(l)):y.width("auto"),o.setGroupWidth()},n.prototype.resize=function(){var e=this;e.layMain&&("isConnected"in e.layMain[0]?e.layMain[0].isConnected:f.contains(document.body,e.layMain[0]))&&(e.fullSize(),e.setColsWidth(),e.scrollPatch())},n.prototype.reload=function(e,t,a){var i=this;e=e||{},delete i.haveInit,layui.each(e,function(e,t){"array"===layui.type(t)&&delete i.config[e]}),i.config=f.extend(t,{},i.config,e),"reloadData"!==a&&(layui.each(i.config.cols,function(e,t){layui.each(t,function(e,t){delete t.colspan2})}),delete i.config.HAS_SET_COLS_PATCH),i.render(a)},n.prototype.errorView=function(e){var t=this,a=t.layMain.find("."+h),e=f('
                      '+(e||"Error")+"
                      ");a[0]&&(t.layNone.remove(),a.remove()),t.layFixed.addClass(W),t.layMain.find("tbody").html(""),t.layMain.append(t.layNone=e),t.layTotal.addClass(y),t.layPage.find(P).addClass(y),k.cache[t.key]=[],t.syncCheckAll(),t.renderForm(),t.setColsWidth(),t.loading(!1)},n.prototype.page=1,n.prototype.pullData=function(i,l){var e,t,n=this,o=n.config,a=(o.HAS_SET_COLS_PATCH||n.setColsPatch(),o.HAS_SET_COLS_PATCH=!0,o.request),d=o.response,r=function(){"object"==typeof o.initSort&&n.sort({field:o.initSort.field,type:o.initSort.type,reloadType:l.type})},c=function(e,t){n.setColsWidth(),n.loading(!1),"function"==typeof o.done&&o.done(e,i,e[d.countName],t)};l=l||{},"function"==typeof o.before&&o.before(o),n.startTime=(new Date).getTime(),l.renderData?((e={})[d.dataName]=k.cache[n.key],e[d.countName]=o.url?"object"===layui.type(o.page)?o.page.count:e[d.dataName].length:o.data.length,"object"==typeof o.totalRow&&(e[d.totalRowName]=f.extend({},n.totalRow)),n.renderData({res:e,curr:i,count:e[d.countName],type:l.type,sort:!0}),c(e,"renderData")):o.url?(t={},o.page&&(t[a.pageName]=i,t[a.limitName]=o.limit),a=f.extend(t,o.where),o.contentType&&0==o.contentType.indexOf("application/json")&&(a=JSON.stringify(a)),n.loading(!0),n._xhr&&4!==n._xhr.readyState&&(n._xhrAbort=!0,n._xhr.abort()),n._xhr=f.ajax({type:o.method||"get",url:o.url,contentType:o.contentType,data:a,dataType:o.dataType||"json",jsonpCallback:o.jsonpCallback,headers:o.headers||{},complete:"function"==typeof o.complete?o.complete:undefined,success:function(e){var t,a;(e="function"==typeof o.parseData?o.parseData(e)||e:e)[d.statusName]!=d.statusCode?n.errorView(e[d.msgName]||'\u8fd4\u56de\u7684\u6570\u636e\u4e0d\u7b26\u5408\u89c4\u8303\uff0c\u6b63\u786e\u7684\u6210\u529f\u72b6\u6001\u7801\u5e94\u4e3a\uff1a"'+d.statusName+'": '+d.statusCode):(t=e[d.countName],(a=Math.ceil(t/o.limit)||1)','
                      "+function(){var e,t=f.extend(!0,{LAY_COL:l},o),a=k.config.checkName,i=k.config.disabledName;switch(l.type){case"checkbox":return'';case"radio":return'';case"numbers":return c}return l.toolbar?m(f(l.toolbar).html()||"").render(t):T.call(s,{item3:l,content:n,tplData:t})}(),"
                      "].join(""),i.push(e),l.fixed&&"right"!==l.fixed&&d.push(e),"right"===l.fixed&&r.push(e))}),e=['data-index="'+e+'"'],o[k.config.checkName]&&e.push('class="'+A+'"'),e=e.join(" "),y.push(""+i.join("")+""),h.push(""+d.join("")+""),p.push(""+r.join("")+""))}),{trs:y,trs_fixed:h,trs_fixed_r:p}},k.getTrHtml=function(e,t){e=C(e);return e.getTrHtml(t,null,e.page)},n.prototype.renderData=function(e){var a=this,i=a.config,t=e.res,l=e.curr,n=a.count=e.count,o=e.sort,d=t[i.response.dataName]||[],t=t[i.response.totalRowName],r=[],c=[],s=[],u=function(){if(!o&&a.sortKey)return a.sort({field:a.sortKey.field,type:a.sortKey.sort,pull:!0,reloadType:e.type});a.getTrHtml(d,o,l,{trs:r,trs_fixed:c,trs_fixed_r:s}),"fixed"===i.scrollPos&&"reloadData"===e.type||a.layBody.scrollTop(0),"reset"===i.scrollPos&&a.layBody.scrollLeft(0),a.layMain.find("."+h).remove(),a.layMain.find("tbody").html(r.join("")),a.layFixLeft.find("tbody").html(c.join("")),a.layFixRight.find("tbody").html(s.join("")),a.syncCheckAll(),a.renderForm(),a.fullSize(),a.haveInit?a.scrollPatch():setTimeout(function(){a.scrollPatch()},50),a.haveInit=!0,g.close(a.tipsIndex)};return k.cache[a.key]=d,a.layTotal[0==d.length?"addClass":"removeClass"](y),a.layPage[i.page||i.pagebar?"removeClass":"addClass"](W),a.layPage.find(P)[!i.page||0==n||0===d.length&&1==l?"addClass":"removeClass"](y),0===d.length?a.errorView(i.text.none):(a.layFixLeft.removeClass(W),o?u():(u(),a.renderTotal(d,t),a.layTotal&&a.layTotal.removeClass(W),void(i.page&&(i.page=f.extend({elem:"layui-table-page"+i.index,count:n,limit:i.limit,limits:i.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(a.page=e.curr,i.limit=e.limit,a.pullData(e.curr))}},i.page),i.page.count=n,p.render(i.page)))))},k.renderData=function(e){e=C(e);e&&e.pullData(e.page,{renderData:!0,type:"reloadData"})},n.prototype.renderTotal=function(e,o){var d,r=this,c=r.config,s={};c.totalRow&&(layui.each(e,function(e,i){"array"===layui.type(i)&&0===i.length||r.eachCols(function(e,t){var e=t.field||e,a=i[e];t.totalRow&&(s[e]=(s[e]||0)+(parseFloat(a)||0))})}),r.dataTotal=[],d=[],r.eachCols(function(e,t){var e=t.field||e,a=o&&o[t.field],i="totalRowDecimals"in t?t.totalRowDecimals:2,i=s[e]?parseFloat(s[e]||0).toFixed(i):"",i=(n=t.totalRowText||"",(l={LAY_COL:t})[e]=i,l=t.totalRow&&T.call(r,{item3:t,content:i,tplData:l})||n,a||l),l="string"==typeof(n=t.totalRow||c.totalRow)?m(n).render(f.extend({TOTAL_NUMS:a||s[e],TOTAL_ROW:o||{},LAY_COL:t},t)):i,n=(t.field&&r.dataTotal.push({field:t.field,total:f("
                      "+l+"
                      ").text()}),['','
                      "+l,"
                      "].join(""));d.push(n)}),e=r.layTotal.find(".layui-table-patch"),r.layTotal.find("tbody").html(""+d.join("")+(e.length?e.get(0).outerHTML:"")+""))},n.prototype.getColElem=function(e,t){return e.eq(0).find(".laytable-cell-"+t+":eq(0)")},n.prototype.renderForm=function(e){this.config;var t=this.elem.attr("lay-filter");i.render(e,t)},n.prototype.renderFormByElem=function(a){layui.each(["input","select"],function(e,t){i.render(a.find(t))})},n.prototype.syncCheckAll=function(){var a,e=this,i=e.config,t=e.layHeader.find('input[name="layTableCheckbox"]'),l=k.checkStatus(e.key);t[0]&&(a=l.isAll,e.eachCols(function(e,t){"checkbox"===t.type&&(t[i.checkName]=a)}),t.prop({checked:l.isAll,indeterminate:!l.isAll&&l.data.length}))},n.prototype.setRowActive=function(e,t,a){this.config;e=this.layBody.find('tr[data-index="'+e+'"]');if(t=t||"layui-table-click",a)return e.removeClass(t);e.addClass(t),e.siblings("tr").removeClass(t)},n.prototype.setRowChecked=function(i){var a,e,l,t,n,o,d,r=this,c=r.config,s="all"===i.index,u="array"===layui.type(i.index),y=s||u;c.tree&&c.tree.view||y&&(r.layBox.addClass(O),"radio"===i.type)||(u&&(a={},layui.each(i.index,function(e,t){a[t]=!0}),i.index=a),e=r.layBody.children(".layui-table").children("tbody"),d=y?"tr":'tr[data-index="'+i.index+'"]',d=e.children(d),e=s?d:d.filter(u?function(){var e=f(this).data("index");return i.index[e]}:'[data-index="'+i.index+'"]'),i=f.extend({type:"checkbox"},i),l=k.cache[r.key],t="checked"in i,n=function(e){return"radio"===i.type||(t?i.checked:!e)},e.each(function(){var e=f(this),t=e.attr("data-index"),a=l[t];t&&"array"!==layui.type(a)&&!a[c.disabledName]&&(a=a[c.checkName]=n(e.hasClass(A)),e.toggleClass(A,!!a),"radio"===i.type)&&(o=t,e.siblings().removeClass(A))}),o&&layui.each(l,function(e,t){Number(o)!==Number(e)&&delete t[c.checkName]}),d=(u=(s=e.children("td").children(".layui-table-cell").children('input[lay-type="'+({radio:"layTableRadio",checkbox:"layTableCheckbox"}[i.type]||"checkbox")+'"]:not(:disabled)')).last()).closest(I),("radio"===i.type&&d.hasClass(W)?s.first():s).prop("checked",n(u.prop("checked"))),r.syncCheckAll(),y&&setTimeout(function(){r.layBox.removeClass(O)},100))},n.prototype.sort=function(l){var e,t=this,a={},i=t.config,n=i.elem.attr("lay-filter"),o=k.cache[t.key];"string"==typeof(l=l||{}).field&&(d=l.field,t.layHeader.find("th").each(function(e,t){var a=f(this),i=a.data("field");if(i===l.field)return l.field=a,d=i,!1}));try{var d=d||l.field.data("field"),r=l.field.data("key");if(t.sortKey&&!l.pull&&d===t.sortKey.field&&l.type===t.sortKey.sort)return;var c=t.layHeader.find("th .laytable-cell-"+r).find(L);t.layHeader.find("th").find(L).removeAttr("lay-sort"),c.attr("lay-sort",l.type||null),t.layFixed.find("th")}catch(s){b.error("Table modules: sort field '"+d+"' not matched")}t.sortKey={field:d,sort:l.type},i.autoSort&&("asc"===l.type?e=layui.sort(o,d,null,!0):"desc"===l.type?e=layui.sort(o,d,!0,!0):(e=layui.sort(o,k.config.initIndexName,null,!0),delete t.sortKey,delete i.initSort)),a[i.response.dataName]=e||o,t.renderData({res:a,curr:t.page,count:t.count,sort:!0,type:l.reloadType}),l.fromEvent&&(i.initSort={field:d,type:l.type},layui.event.call(l.field,R,"sort("+n+")",f.extend({config:i},i.initSort)))},n.prototype.loading=function(e){this.config.loading&&this.layBox.find(".layui-table-init").toggleClass(W,!e)},n.prototype.cssRules=function(t,a){var e=this.elem.children("style")[0];r.getStyleRules(e,function(e){if(e.selectorText===".laytable-cell-"+t)return a(e),!0})},n.prototype.fullSize=function(){var e,a,i=this,t=i.config,l=t.height;i.fullHeightGap?(l=d.height()-i.fullHeightGap)<135&&(l=135):i.parentDiv&&i.parentHeightGap?(l=f(i.parentDiv).height()-i.parentHeightGap)<135&&(l=135):i.customHeightFunc&&(l=i.customHeightFunc())<135&&(l=135),1
                      ')).find("div").css({width:a}),e.find("tr").append(t)):e.find(".layui-table-patch").remove()};n(e.layHeader),n(e.layTotal);n=e.layMain.height()-i;e.layFixed.find(D).css("height",t.height()>=n?n:"auto").scrollTop(e.layMain.scrollTop()),e.layFixRight[k.cache[e.key]&&k.cache[e.key].length&&0');a.html(t),s.height&&a.css("max-height",s.height-(c.layTool.outerHeight()||50)),i.find("."+S)[0]||i.append(a),c.renderForm(),a.on("click",function(e){layui.stope(e)}),e.done&&e.done(a,t)};layui.stope(e),z.trigger("table.tool.panel.remove"),g.close(c.tipsIndex),layui.each(s.defaultToolbar,function(e,t){if(t.layEvent===a)return"function"==typeof t.onClick&&t.onClick({data:l,config:s,openPanel:n,elem:i}),!0}),layui.event.call(this,R,"toolbar("+o+")",f.extend({event:a,config:s},{}))}),c.layHeader.on("click","*[lay-event]",function(e){var t=f(this),a=t.attr("lay-event"),t=t.closest("th").data("key"),t=c.col(t);layui.event.call(this,R,"colTool("+o+")",f.extend({event:a,config:s,col:t},{}))}),c.layPagebar.on("click","*[lay-event]",function(e){var t=f(this).attr("lay-event");layui.event.call(this,R,"pagebar("+o+")",f.extend({event:t,config:s},{}))}),e.on("mousemove",function(e){var t=f(this),a=t.offset().left,e=e.clientX-a;t.data("unresize")||w.eventMoveElem||(r.allowResize=t.width()-e<=10,d.css("cursor",r.allowResize?"col-resize":""))}).on("mouseleave",function(){f(this);w.eventMoveElem||(r.allowResize=!1,d.css("cursor",""))}).on("mousedown",function(e){var t,a=f(this);r.allowResize&&(t=a.data("key"),e.preventDefault(),r.offset=[e.clientX,e.clientY],c.cssRules(t,function(e){var t=e.style.width||a.outerWidth();r.rule=e,r.ruleWidth=parseFloat(t),r.minWidth=a.data("minwidth")||s.cellMinWidth,r.maxWidth=a.data("maxwidth")||s.cellMaxWidth}),a.data(j,r),w.eventMoveElem=a)}),w.docEvent||z.on("mousemove",function(e){var t,a;w.eventMoveElem&&(t=w.eventMoveElem.data(j)||{},w.eventMoveElem.data("resizing",1),e.preventDefault(),t.rule)&&(e=t.ruleWidth+e.clientX-t.offset[0],a=w.eventMoveElem.closest("."+_).attr(N),a=C(a))&&((e=et.maxWidth&&(e=t.maxWidth),t.rule.style.width=e+"px",a.setGroupWidth(w.eventMoveElem),g.close(c.tipsIndex))}).on("mouseup",function(e){var t,a,i,l,n;w.eventMoveElem&&(i=(t=w.eventMoveElem).closest("."+_).attr(N),a=C(i))&&(i=t.data("key"),l=a.col(i),n=a.config.elem.attr("lay-filter"),r={},d.css("cursor",""),a.scrollPatch(),t.removeData(j),delete w.eventMoveElem,a.cssRules(i,function(e){l.width=parseFloat(e.style.width),layui.event.call(t[0],R,"colResized("+n+")",{col:l,config:a.config})}))}),w.docEvent=!0,e.on("click",function(e){var t=f(this),a=t.find(L),i=a.attr("lay-sort");if(!a[0]||1===t.data("resizing"))return t.removeData("resizing");c.sort({field:t,type:"asc"===i?"desc":"desc"===i?null:"asc",fromEvent:!0})}).find(L+" .layui-edge ").on("click",function(e){var t=f(this),a=t.index(),t=t.parents("th").eq(0).data("field");layui.stope(e),0===a?c.sort({field:t,type:"asc",fromEvent:!0}):c.sort({field:t,type:"desc",fromEvent:!0})}),c.commonMember=function(e){var a=f(this).parents("tr").eq(0).data("index"),t=c.layBody.find('tr[data-index="'+a+'"]'),i=(k.cache[c.key]||[])[a]||{},l={tr:t,config:s,data:k.clearCacheKey(i),dataCache:i,index:a,del:function(){k.cache[c.key][a]=[],t.remove(),c.scrollPatch()},update:function(e,t){c.updateRow({index:a,data:e=e||{},related:t},function(e,t){l.data[e]=t})},setRowChecked:function(e){c.setRowChecked(f.extend({index:a},e))}};return f.extend(l,e)}),t=(c.elem.on("click",'input[name="layTableCheckbox"]+',function(e){var t=f(this),a=t.closest("td"),t=t.prev(),i=(c.layBody.find('input[name="layTableCheckbox"]'),t.parents("tr").eq(0).data("index")),l=t[0].checked,n="layTableAllChoose"===t.attr("lay-filter");t[0].disabled||(n?c.setRowChecked({index:"all",checked:l}):c.setRowChecked({index:i,checked:l}),layui.stope(e),layui.event.call(t[0],R,"checkbox("+o+")",y.call(t[0],{checked:l,type:n?"all":"one",getCol:function(){return c.col(a.data("key"))}})))}),c.elem.on("click",'input[lay-type="layTableRadio"]+',function(e){var t=f(this),a=t.closest("td"),t=t.prev(),i=t[0].checked,l=t.parents("tr").eq(0).data("index");if(layui.stope(e),t[0].disabled)return!1;c.setRowChecked({type:"radio",index:l}),layui.event.call(t[0],R,"radio("+o+")",y.call(t[0],{checked:i,getCol:function(){return c.col(a.data("key"))}}))}),c.layBody.on("mouseenter","tr",function(){var e=f(this),t=e.index();e.data("off")||c.layBody.find("tr:eq("+t+")").addClass(M)}).on("mouseleave","tr",function(){var e=f(this),t=e.index();e.data("off")||c.layBody.find("tr:eq("+t+")").removeClass(M)}).on("click","tr",function(e){t.call(this,"row",e)}).on("dblclick","tr",function(e){t.call(this,"rowDouble",e)}).on("contextmenu","tr",function(e){s.defaultContextmenu||e.preventDefault(),t.call(this,"rowContextmenu",e)}),function(e,t){var a=f(this);if(!a.data("off")){if("rowContextmenu"!==e){var i=[".layui-form-checkbox",".layui-form-switch",".layui-form-radio","[lay-unrow]"].join(",");if(f(t.target).is(i)||f(t.target).closest(i)[0])return}layui.event.call(this,R,e+"("+o+")",y.call(a.children("td")[0],{e:t}))}}),n=function(e,t){var a,i,l;(e=f(e)).data("off")||(l=e.data("field"),i=e.data("key"),i=c.col(i),a=e.closest("tr").data("index"),a=k.cache[c.key][a],e.children(u),(i="function"==typeof i.edit?i.edit(a):i.edit)&&((i=f("textarea"===i?'':''))[0].value=(l=e.data("content")||a[l])===undefined||null===l?"":l,e.find("."+E)[0]||e.append(i),i.focus(),t)&&layui.stope(t))},i=(c.layBody.on("change","."+E,function(){var e=f(this),t=e.parent(),a=this.value,i=e.parent().data("field"),e=e.closest("tr").data("index"),e=k.cache[c.key][e],l=y.call(t[0],{value:a,field:i,oldValue:e[i],td:t,reedit:function(){setTimeout(function(){n(l.td);var e={};e[i]=l.oldValue,l.update(e)})},getCol:function(){return c.col(t.data("key"))}}),e={};e[i]=a,l.update(e),layui.event.call(t[0],R,"edit("+o+")",l)}).on("blur","."+E,function(){f(this).remove()}),c.layBody.on(s.editTrigger,"td",function(e){n(this,e)}).on("mouseenter","td",function(){a.call(this)}).on("mouseleave","td",function(){a.call(this,"hide")}),c.layTotal.on("mouseenter","td",function(){a.call(this)}).on("mouseleave","td",function(){a.call(this,"hide")}),"layui-table-grid-down"),a=function(e){var t=f(this),a=t.children(u);t.data("off")||t.parent().hasClass(H)||(e?t.find(".layui-table-grid-down").remove():!(a.prop("scrollWidth")>a.prop("clientWidth")||0'))},l=function(e,t){var a=f(this),i=a.parent(),l=i.data("key"),n=c.col(l),o=i.parent().data("index"),d=i.children(u),i="layui-table-cell-c",r=f('');"tips"===(t=t||n.expandedMode||s.cellExpandedMode)?c.tipsIndex=g.tips(['
                      ',d.html(),"
                      ",''].join(""),d[0],{tips:[3,""],time:-1,anim:-1,maxWidth:x.ios||x.android?300:c.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){g.close(t)})}}):(c.elem.find("."+i).trigger("click"),c.cssRules(l,function(e){var t=e.style.width,a=n.expandedWidth||s.cellExpandedWidth;atr").each(function(i){n.cols[i]=[],f(this).children().each(function(e){var t=f(this),a=t.attr("lay-data"),a=r.options(this,{attr:a?"lay-data":null,errorText:d+(a||t.attr("lay-options"))}),t=f.extend({title:t.text(),colspan:parseInt(t.attr("colspan"))||1,rowspan:parseInt(t.attr("rowspan"))||1},a);n.cols[i].push(t)})}),e.find("tbody>tr")),t=k.render(n);!a.length||o.data||t.config.url||(l=0,k.eachCols(t.config.id,function(e,i){a.each(function(e){n.data[e]=n.data[e]||{};var t=f(this),a=i.field;n.data[e][a]=t.children("td").eq(l).html()}),l++}),t.reloadData({data:n.data}))}),this},w.that={},w.config={},function(a,i,e,l){var n,o;l.colGroup&&(n=0,a++,l.CHILD_COLS=[],o=e+(parseInt(l.rowspan)||1),layui.each(i[o],function(e,t){t.parentKey?t.parentKey===l.key&&(t.PARENT_COL_INDEX=a,l.CHILD_COLS.push(t),c(a,i,o,t)):t.PARENT_COL_INDEX||1<=n&&n==(l.colspan||1)||(t.PARENT_COL_INDEX=a,l.CHILD_COLS.push(t),n+=parseInt(1td').filter('[data-field="'+e+'"]')}}})).replace(/"/g,'""'),n.push(a='"'+a+'"')):t.field&&"normal"!==t.type&&0==i&&(u[t.field]=!0)}),c.push(n.join(","))}),o&&layui.each(o.dataTotal,function(e,t){u[t.field]||s.push('"'+(t.total||"")+'"')}),r.join(",")+"\r\n"+c.join("\r\n")+"\r\n"+s.join(","))),d.download=(a.title||l.title||"table_"+(l.index||""))+"."+i,document.body.appendChild(d),d.click(),document.body.removeChild(d)},k.getOptions=l,k.hideCol=function(e,l){var n=C(e);n&&("boolean"===layui.type(l)?n.eachCols(function(e,t){var a=t.key,i=n.col(a),t=t.parentKey;i.hide!=l&&(i=i.hide=l,n.elem.find('*[data-key="'+a+'"]')[i?"addClass":"removeClass"](W),n.setParentCol(i,t))}):(l=layui.isArray(l)?l:[l],layui.each(l,function(e,l){n.eachCols(function(e,t){var a,i;l.field===t.field&&(a=t.key,i=n.col(a),t=t.parentKey,"hide"in l)&&i.hide!=l.hide&&(i=i.hide=!!l.hide,n.elem.find('*[data-key="'+a+'"]')[i?"addClass":"removeClass"](W),n.setParentCol(i,t))})})),f("."+S).remove(),n.resize())},k.reload=function(e,t,a,i){if(l(e))return(e=C(e)).reload(t,a,i),w.call(e)},k.reloadData=function(){var a=f.extend([],arguments),i=(a[3]="reloadData",new RegExp("^("+["elem","id","cols","width","height","maxHeight","toolbar","defaultToolbar","className","css","pagebar"].join("|")+")$"));return layui.each(a[1],function(e,t){i.test(e)&&delete a[1][e]}),k.reload.apply(null,a)},k.render=function(e){e=new n(e);return w.call(e)},k.clearCacheKey=function(e){return delete(e=f.extend({},e))[k.config.checkName],delete e[k.config.indexName],delete e[k.config.initIndexName],delete e[k.config.numbersName],delete e[k.config.disabledName],e},f(function(){k.init()}),s(R,k)});layui.define(["table"],function(e){"use strict";var A=layui.$,h=layui.form,P=layui.table,y=layui.hint(),B={config:{},on:P.on,eachCols:P.eachCols,index:P.index,set:function(e){var t=this;return t.config=A.extend({},t.config,e),t},resize:P.resize,getOptions:P.getOptions,hideCol:P.hideCol,renderData:P.renderData},i=function(){var a=this,e=a.config,n=e.id||e.index;return{config:e,reload:function(e,t){a.reload.call(a,e,t)},reloadData:function(e,t){B.reloadData(n,e,t)}}},j=function(e){var t=i.that[e];return t||y.error(e?"The treeTable instance with ID '"+e+"' not found":"ID argument required"),t||null},F="lay-table-id",L="layui-hide",s=".layui-table-body",q=".layui-table-main",R=".layui-table-fixed-l",Y=".layui-table-fixed-r",l="layui-table-checked",m="layui-table-tree",z="LAY_DATA_INDEX",b="LAY_DATA_INDEX_HISTORY",f="LAY_PARENT_INDEX",g="LAY_CHECKBOX_HALF",H="LAY_EXPAND",X="LAY_HAS_EXPANDED",V="LAY_ASYNC_STATUS",n=["all","parent","children","none"],t=/<[^>]+?>/,p=["flexIconClose","flexIconOpen","iconClose","iconOpen","iconLeaf","icon"],a=function(e){var t=this;t.index=++B.index,t.config=A.extend(!0,{},t.config,B.config,e),t.init(),t.render()},x=function(n,i,e){var l=P.cache[n];layui.each(e||l,function(e,t){var a=t[z]||"";-1!==a.indexOf("-")&&(l[a]=t),t[i]&&x(n,i,t[i])})},d=function(d,a,e){var r=j(d),o=("reloadData"!==e&&(r.status={expand:{}}),A.extend(!0,{},r.getOptions(),a)),n=o.tree,c=n.customName.children,i=n.customName.id,l=(delete a.hasNumberCol,delete a.hasChecboxCol,delete a.hasRadioCol,P.eachCols(null,function(e,t){"numbers"===t.type?a.hasNumberCol=!0:"checkbox"===t.type?a.hasChecboxCol=!0:"radio"===t.type&&(a.hasRadioCol=!0)},o.cols),a.parseData),u=a.done;"reloadData"===e&&"fixed"===o.scrollPos&&(r.scrollTopCache=r.config.elem.next().find(s).scrollTop()),o.url?e&&(!l||l.mod)||(a.parseData=function(){var e=this,t=arguments,a=t[0],t=("function"===layui.type(l)&&(a=l.apply(e,t)||t[0]),e.response.dataName);return n.data.isSimpleData&&!n["async"].enable&&(a[t]=r.flatToTree(a[t])),N(a[t],function(e){e[H]=H in e?e[H]:e[i]!==undefined&&r.status.expand[e[i]]},c),e.autoSort&&e.initSort&&e.initSort.type&&layui.sort(a[t],e.initSort.field,"desc"===e.initSort.type,!0),r.initData(a[t]),a},a.parseData.mod=!0):a.data!==undefined&&(a.data=a.data||[],n.data.isSimpleData&&(a.data=r.flatToTree(a.data)),r.initData(a.data)),e&&(!u||u.mod)||(a.done=function(){var e,t=arguments,a=t[3],n="renderData"===a,i=(n||delete r.isExpandAll,this.elem.next()),l=(r.updateStatus(null,{LAY_HAS_EXPANDED:!1}),x(d,c),i.find('[name="layTableCheckbox"][lay-filter="layTableAllChoose"]'));if(l.length&&(e=B.checkStatus(d),l.prop({checked:e.isAll&&e.data.length,indeterminate:!e.isAll&&e.data.length})),!n&&o.autoSort&&o.initSort&&o.initSort.type&&B.sort(d),r.renderTreeTable(i),"reloadData"===a&&"fixed"===this.scrollPos&&i.find(s).scrollTop(r.scrollTopCache),"function"===layui.type(u))return u.apply(this,t)},a.done.mod=!0),a&&a.tree&&a.tree.view&&layui.each(p,function(e,t){a.tree.view[t]!==undefined&&(a.tree.view[t]=r.normalizedIcon(a.tree.view[t]))})};a.prototype.init=function(){var e=this.config,t=e.tree.data.cascade,t=(-1===n.indexOf(t)&&(e.tree.data.cascade="all"),P.render(A.extend({},e,{data:[],url:"",done:null}))),a=t.config.id;(i.that[a]=this).tableIns=t,d(a,e)},a.prototype.config={tree:{customName:{children:"children",isParent:"isParent",name:"name",id:"id",pid:"parentId",icon:"icon"},view:{indent:14,flexIconClose:'',flexIconOpen:'',showIcon:!0,icon:"",iconClose:'',iconOpen:'',iconLeaf:'',showFlexIconIfNotParent:!1,dblClickExpand:!0,expandAllDefault:!1},data:{isSimpleData:!1,rootPid:null,cascade:"all"},"async":{enable:!1,url:"",type:null,contentType:null,headers:null,where:null,autoParam:[]},callback:{beforeExpand:null,onExpand:null}}},a.prototype.normalizedIcon=function(e){return e?t.test(e)?e:'':""},a.prototype.getOptions=function(){return this.tableIns?P.getOptions(this.tableIns.config.id):this.config},a.prototype.flatToTree=function(e){var n,i,l,d,r,o,c,u,t=this.getOptions(),a=t.tree,s=a.customName;return e=e||P.cache[t.id],t=e,n=s.id,i=s.pid,l=s.children,d=a.data.rootPid,n=n||"id",i=i||"parentId",l=l||"children",c={},u=[],layui.each(t,function(e,t){r=n+t[n],o=n+t[i],c[r]||(c[r]={},c[r][l]=[]);var a={};a[l]=c[r][l],c[r]=A.extend({},t,a),((d?c[r][i]===d:!c[r][i])?u:(c[o]||(c[o]={},c[o][l]=[]),c[o][l])).push(c[r])}),u},a.prototype.treeToFlat=function(e,n,i){var l=this,d=l.getOptions().tree.customName,r=d.children,o=d.pid,c=[];return layui.each(e,function(e,t){var e=(i?i+"-":"")+e,a=A.extend({},t);a[o]="undefined"!=typeof t[o]?t[o]:n,c.push(a),c=c.concat(l.treeToFlat(t[r],t[d.id],e))}),c},a.prototype.getTreeNode=function(e){var t,a=this;return e?(t=a.getOptions().tree,t.customName,{data:e,dataIndex:e[z],getParentNode:function(){return a.getNodeByIndex(e[f])}}):y.error("\u627e\u4e0d\u5230\u8282\u70b9\u6570\u636e")},a.prototype.getNodeByIndex=function(t){var a,e,n=this,i=n.getNodeDataByIndex(t);return i?((e=n.getOptions()).tree.customName.parent,a=e.id,(e={data:i,dataIndex:i[z],getParentNode:function(){return n.getNodeByIndex(i[f])},update:function(e){return B.updateNode(a,t,e)},remove:function(){return B.removeNode(a,t)},expand:function(e){return B.expandNode(a,A.extend({},e,{index:t}))},setChecked:function(e){return B.setRowChecked(a,A.extend({},e,{index:t}))}}).dataIndex=t,e):y.error("\u627e\u4e0d\u5230\u8282\u70b9\u6570\u636e")},a.prototype.getNodeById=function(a){var e=this.getOptions(),n=e.tree.customName.id,i="",e=B.getData(e.id,!0);if(layui.each(e,function(e,t){if(t[n]===a)return i=t[z],!0}),i)return this.getNodeByIndex(i)},a.prototype.getNodeDataByIndex=function(e,t,a){var n=this.getOptions(),i=n.tree,n=P.cache[n.id],l=n[e];if("delete"!==a&&l)return A.extend(l,a),t?A.extend({},l):l;for(var d=n,r=String(e).split("-"),o=0,c=i.customName.children;o
                      '),N=function(e){y[V]="success",y[s.children]=e,c.initData(y[s.children],y[z]),J(t,!0,!p&&n,i,l)},C=m.format,"function"===layui.type(C)?C(y,o,N):(I=A.extend({},m.where||o.where),C=m.autoParam,layui.each(C,function(e,t){t=t.split("=");I[t[0].trim()]=y[(t[1]||t[0]).trim()]}),(C=m.contentType||o.contentType)&&0==C.indexOf("application/json")&&(I=JSON.stringify(I)),O=m.method||o.method,D=m.dataType||o.dataType,T=m.jsonpCallback||o.jsonpCallback,_=m.headers||o.headers,k=m.parseData||o.parseData,w=m.response||o.response,A.ajax({type:O||"get",url:b,contentType:C,data:I,dataType:D||"json",jsonpCallback:T,headers:_||{},success:function(e){(e="function"==typeof k?k.call(o,e)||e:e)[w.statusName]!=w.statusCode?(y[V]="error",y[H]=!1,g.html('')):N(e[w.dataName])},error:function(e,t){y[V]="error",y[H]=!1,"function"==typeof o.error&&o.error(e,t)}})),h;y[X]=!0,v.length&&(!o.initSort||o.url&&!o.autoSort||((m=o.initSort).type?layui.sort(v,m.field,"desc"===m.type,!0):layui.sort(v,P.config.indexName,null,!0)),c.initData(y[s.children],y[z]),O=P.getTrHtml(r,v,null,null,e),S={trs:A(O.trs.join("")),trs_fixed:A(O.trs_fixed.join("")),trs_fixed_r:A(O.trs_fixed_r.join(""))},E=(e.split("-").length-1||0)+1,layui.each(v,function(e,t){S.trs.eq(e).attr({"data-index":t[z],"lay-data-index":t[z],"data-level":E}).data("index",t[z]),S.trs_fixed.eq(e).attr({"data-index":t[z],"lay-data-index":t[z],"data-level":E}).data("index",t[z]),S.trs_fixed_r.eq(e).attr({"data-index":t[z],"lay-data-index":t[z],"data-level":E}).data("index",t[z])}),d.find(q).find('tbody tr[lay-data-index="'+e+'"]').after(S.trs),d.find(R).find('tbody tr[lay-data-index="'+e+'"]').after(S.trs_fixed),d.find(Y).find('tbody tr[lay-data-index="'+e+'"]').after(S.trs_fixed_r),c.renderTreeTable(S.trs,E),n)&&!p&&layui.each(v,function(e,t){J({dataIndex:t[z],trElem:d.find('tr[lay-data-index="'+t[z]+'"]').first(),tableViewElem:d,tableId:r,options:o},a,n,i,l)})}else c.isExpandAll=!1,(n&&!p?(layui.each(v,function(e,t){J({dataIndex:t[z],trElem:d.find('tr[lay-data-index="'+t[z]+'"]').first(),tableViewElem:d,tableId:r,options:o},a,n,i,l)}),d.find(v.map(function(e,t,a){return'tr[lay-data-index="'+e[z]+'"]'}).join(","))):(b=c.treeToFlat(v,y[s.id],e),d.find(b.map(function(e,t,a){return'tr[lay-data-index="'+e[z]+'"]'}).join(",")))).addClass(L);U("resize-"+r,function(){B.resize(r)},0)(),l&&"loading"!==y[V]&&(C=u.callback.onExpand,"function"===layui.type(C))&&C(r,y,x)}return h},v=(B.expandNode=function(e,t){var a,n,i,e=j(e);if(e)return a=(t=t||{}).index,n=t.expandFlag,i=t.inherit,t=t.callbackFlag,e=e.getOptions().elem.next(),J({trElem:e.find('tr[lay-data-index="'+a+'"]').first()},n,i,null,t)},B.expandAll=function(a,e){if("boolean"!==layui.type(e))return y.error("expandAll \u7684\u5c55\u5f00\u72b6\u6001\u53c2\u6570\u53ea\u63a5\u6536true/false");var t=j(a);if(t){t.isExpandAll=e;var n=t.getOptions(),i=n.tree,l=n.elem.next(),d=i.customName.isParent,r=i.customName.id,o=i.view.showFlexIconIfNotParent;if(e){e=B.getData(a,!0);if(i["async"].enable){var c=!0;if(layui.each(e,function(e,t){if(t[d]&&!t[V])return!(c=!1)}),!c)return void layui.each(B.getData(a),function(e,t){B.expandNode(a,{index:t[z],expandFlag:!0,inherit:!0})})}var u=!0;if(layui.each(e,function(e,t){if(t[d]&&!t[X])return!(u=!1)}),u)t.updateStatus(null,function(e){(e[d]||o)&&(e[H]=!0,e[r]!==undefined)&&(t.status.expand[e[r]]=!0)}),l.find('tbody tr[data-level!="0"]').removeClass(L),l.find(".layui-table-tree-flexIcon").html(i.view.flexIconOpen),i.view.showIcon&&l.find(".layui-table-tree-nodeIcon:not(.layui-table-tree-iconCustom,.layui-table-tree-iconLeaf)").html(i.view.iconOpen);else{if(t.updateStatus(null,function(e){(e[d]||o)&&(e[H]=!0,e[X]=!0,e[r]!==undefined)&&(t.status.expand[e[r]]=!0)}),n.initSort&&n.initSort.type&&n.autoSort)return B.sort(a);var s,n=P.getTrHtml(a,e),f={trs:A(n.trs.join("")),trs_fixed:A(n.trs_fixed.join("")),trs_fixed_r:A(n.trs_fixed_r.join(""))};layui.each(e,function(e,t){var a=t[z].split("-").length-1;s={"data-index":t[z],"lay-data-index":t[z],"data-level":a},f.trs.eq(e).attr(s).data("index",t[z]),f.trs_fixed.eq(e).attr(s).data("index",t[z]),f.trs_fixed_r.eq(e).attr(s).data("index",t[z])}),layui.each(["main","fixed-l","fixed-r"],function(e,t){l.find(".layui-table-"+t+" tbody").html(f[["trs","trs_fixed","trs_fixed_r"][e]])}),t.renderTreeTable(l,0,!1)}}else t.updateStatus(null,function(e){(e[d]||o)&&(e[H]=!1,e[r]!==undefined)&&(t.status.expand[e[r]]=!1)}),l.find('.layui-table-box tbody tr[data-level!="0"]').addClass(L),l.find(".layui-table-tree-flexIcon").html(i.view.flexIconClose),i.view.showIcon&&l.find(".layui-table-tree-nodeIcon:not(.layui-table-tree-iconCustom,.layui-table-tree-iconLeaf)").html(i.view.iconClose);B.resize(a)}},a.prototype.updateNodeIcon=function(e){var t=this.getOptions().tree||{},a=e.scopeEl,n=e.isExpand,e=e.isParent;a.find(".layui-table-tree-flexIcon").css("visibility",e||t.view.showFlexIconIfNotParent?"visible":"hidden").html(n?t.view.flexIconOpen:t.view.flexIconClose),t.view.showIcon&&(a=a.find(".layui-table-tree-nodeIcon:not(.layui-table-tree-iconCustom)"),n=e?n?t.view.iconOpen:t.view.iconClose:t.view.iconLeaf,a.toggleClass("layui-table-tree-iconLeaf",!e).html(n))},a.prototype.renderTreeTable=function(e,t,a){var l=this,n=l.getOptions(),d=n.elem.next(),i=(d.hasClass(m)||d.addClass(m),n.id),r=n.tree||{},o=(r.data,r.view||{}),c=r.customName||{},u=c.isParent,s=(d.attr("lay-filter"),l),f=n.data.length,y=((t=t||0)||(d.find(".layui-table-body tr:not([data-level])").attr("data-level",t),layui.each(P.cache[i],function(e,t){f&&(t[z]=String(e));t=t[z];d.find('.layui-table-main tbody tr[data-level="0"]:eq('+e+")").attr("lay-data-index",t),d.find('.layui-table-fixed-l tbody tr[data-level="0"]:eq('+e+")").attr("lay-data-index",t),d.find('.layui-table-fixed-r tbody tr[data-level="0"]:eq('+e+")").attr("lay-data-index",t)})),null),p=c.name,x=o.indent||14;if(layui.each(e.find('td[data-field="'+p+'"]'),function(e,t){var a,n,i=(t=A(t)).closest("tr"),t=t.children(".layui-table-cell");t.hasClass("layui-table-tree-item")||(n=i.attr("lay-data-index"))&&(i=d.find('tr[lay-data-index="'+n+'"]'),(a=s.getNodeDataByIndex(n))[H]&&a[u]&&((y=y||{})[n]=!0),a[g]&&i.find('input[type="checkbox"][name="layTableCheckbox"]').prop("indeterminate",!0),n=t.html(),(t=i.find('td[data-field="'+p+'"]>div.layui-table-cell')).addClass("layui-table-tree-item"),t.html(['
                      ',a[H]?o.flexIconOpen:o.flexIconClose,"
                      ",o.showIcon?'
                      '+(l.normalizedIcon(a[c.icon])||o.icon||(a[u]?a[H]?o.iconOpen:o.iconClose:o.iconLeaf)||"")+"
                      ":"",n].join("")).find(".layui-table-tree-flexIcon").on("click",function(e){layui.stope(e),J({trElem:i},null,null,null,!0)}))}),!t&&r.view.expandAllDefault&&l.isExpandAll===undefined)return B.expandAll(i,!0);(!1!==a&&y?(layui.each(y,function(e,t){e=d.find('tr[lay-data-index="'+e+'"]');e.find(".layui-table-tree-flexIcon").html(o.flexIconOpen),J({trElem:e.first()},!0)}),U("renderTreeTable2-"+i,function(){h.render(A(".layui-table-tree["+F+'="'+i+'"]'))},0)):U("renderTreeTable-"+i,function(){n.hasNumberCol&&v(l),h.render(A(".layui-table-tree["+F+'="'+i+'"]'))},0))()},function(a){var e=a.getOptions(),t=e.elem.next(),n=0,i=t.find(".layui-table-main tbody tr"),l=t.find(".layui-table-fixed-l tbody tr"),d=t.find(".layui-table-fixed-r tbody tr");layui.each(a.treeToFlat(P.cache[e.id]),function(e,t){t.LAY_HIDE||(a.getNodeDataByIndex(t[z]).LAY_NUM=++n,i.eq(e).find(".laytable-cell-numbers").html(n),l.eq(e).find(".laytable-cell-numbers").html(n),d.eq(e).find(".laytable-cell-numbers").html(n))})}),N=(a.prototype.render=function(e){var t=this;t.tableIns=P["reloadData"===e?"reloadData":"reload"](t.tableIns.config.id,A.extend(!0,{},t.config)),t.config=t.tableIns.config},a.prototype.reload=function(e,t,a){var n=this;e=e||{},delete n.haveInit,layui.each(e,function(e,t){"array"===layui.type(t)&&delete n.config[e]}),d(n.getOptions().id,e,a||!0),n.config=A.extend(t,{},n.config,e),n.render(a)},B.reloadData=function(){var e=A.extend(!0,[],arguments);return e[3]="reloadData",B.reload.apply(null,e)},function(e,a,n,i){var l=[];return layui.each(e,function(e,t){"function"===layui.type(a)?a(t):A.extend(t,a),l.push(A.extend({},t)),i||(l=l.concat(N(t[n],a,n,i)))}),l}),o=(a.prototype.updateStatus=function(e,t,a){var n=this.getOptions(),i=n.tree;return e=e||P.cache[n.id],N(e,t,i.customName.children,a)},a.prototype.getTableData=function(){var e=this.getOptions();return P.cache[e.id]},B.updateStatus=function(e,t,a){var e=j(e),n=e.getOptions();return a=a||(n.url?P.cache[n.id]:n.data),e.updateStatus(a,t)},B.sort=function(e){var t,a,i,l,n,d=j(e);d&&(n=(t=d.getOptions()).tree,a=B.getData(e),i=n.customName.children,l=function(e,a,n){layui.sort(e,a,n,!0),layui.each(e,function(e,t){l(t[i]||[],a,n)})},t.autoSort)&&((n=t.initSort).type?l(a,n.field,"desc"===n.type):l(a,P.config.indexName,null),P.cache[e]=a,d.initData(a),B.renderData(e))},function(n){var t=n.config.id,i=j(t),a=n.data=B.getNodeDataByIndex(t,n.index),l=a[z],d=(n.dataIndex=l,n.update);n.update=function(){var e=arguments,t=(A.extend(i.getNodeDataByIndex(l),e[0]),d.apply(this,e)),a=n.config.tree.customName.name;return a in e[0]&&n.tr.find('td[data-field="'+a+'"]').children("div.layui-table-cell").removeClass("layui-table-tree-item"),i.renderTreeTable(n.tr,n.tr.attr("data-level"),!1),t},n.del=function(){B.removeNode(t,a)},n.setRowChecked=function(e){B.setRowChecked(t,{index:a,checked:e})}}),u=(B.updateNode=function(e,a,t){var n,i,l,d,r,o=j(e);o&&((d=o.getOptions()).tree,d=(n=d.elem.next()).find('tr[lay-data-index="'+a+'"]'),i=d.attr("data-index"),l=d.attr("data-level"),t)&&(d=o.getNodeDataByIndex(a,!1,t),r=P.getTrHtml(e,[d]),layui.each(["main","fixed-l","fixed-r"],function(e,t){n.find(".layui-table-"+t+' tbody tr[lay-data-index="'+a+'"]').replaceWith(A(r[["trs","trs_fixed","trs_fixed_r"][e]].join("")).attr({"data-index":i,"lay-data-index":a,"data-level":l}).data("index",i))}),o.renderTreeTable(n.find('tr[lay-data-index="'+a+'"]'),l))},B.removeNode=function(e,t,a){var n,i,l,d,r,o,c,u,s=j(e);s&&(i=(u=(n=s.getOptions()).tree).customName.isParent,l=u.customName.children,d=n.elem.next(),r=[],o=P.cache[e],t=s.getNodeDataByIndex("string"===layui.type(t)?t:t[z],!1,"delete"),c=s.getNodeDataByIndex(t[f]),s.updateCheckStatus(c),u=s.treeToFlat([t],t[u.customName.pid],t[f]),layui.each(u,function(e,t){t=t[z];r.push('tr[lay-data-index="'+t+'"]'),-1!==t.indexOf("-")&&delete o[t]}),d.find(r.join(",")).remove(),t=s.initData(),function(){for(var e in o)-1!==e.indexOf("-")&&e!==o[e][z]&&delete o[e]}(),layui.each(s.treeToFlat(t),function(e,t){t[b]&&t[b]!==t[z]&&d.find('tr[lay-data-index="'+t[b]+'"]').attr({"data-index":t[z],"lay-data-index":t[z]}).data("index",t[z])}),layui.each(o,function(e,t){d.find('tr[data-level="0"][lay-data-index="'+t[z]+'"]').attr("data-index",e).data("index",e)}),n.hasNumberCol&&v(s),c&&(u=d.find('tr[lay-data-index="'+c[z]+'"]'),a||(c[i]=!(!c[l]||!c[l].length)),s.updateNodeIcon({scopeEl:u,isExpand:c[H],isParent:c[i]})),B.resize(e))},B.addNodes=function(e,t){var a=j(e);if(a){var n=a.getOptions(),i=n.tree,l=n.elem.next(),d=P.config.checkName,r=(t=t||{}).parentIndex,o=t.index,c=t.data,t=t.focus,u=(r="number"===layui.type(r)?r.toString():r)?a.getNodeDataByIndex(r):null,o="number"===layui.type(o)?o:-1,c=A.extend(!0,[],layui.isArray(c)?c:[c]);layui.each(c,function(e,t){d in t||!u||(t[d]=u[d])}),a.getTableData();if(u){var s=i.customName.isParent,f=i.customName.children;u[s]=!0;var y=(y=u[f])?(p=y.splice(-1===o?y.length:o),u[f]=y.concat(c,p)):u[f]=c,f=(a.updateStatus(y,function(e){(e[s]||i.view.showFlexIconIfNotParent)&&(e[X]=!1)}),a.treeToFlat(y));l.find(f.map(function(e){return'tr[lay-data-index="'+e[z]+'"]'}).join(",")).remove(),a.initData(),u[X]=!1,u[V]="local",J({trElem:l.find('tr[lay-data-index="'+r+'"]')},!0)}else{var p=P.cache[e].splice(-1===o?P.cache[e].length:o);if(P.cache[e]=P.cache[e].concat(c,p),n.url||(n.page?(y=n.page,n.data.splice.apply(n.data,[y.limit*(y.curr-1),y.limit].concat(P.cache[e]))):n.data=P.cache[e]),a.initData(),l.find(".layui-none").length)return P.renderData(e),c;var x,f=P.getTrHtml(e,c),h={trs:A(f.trs.join("")),trs_fixed:A(f.trs_fixed.join("")),trs_fixed_r:A(f.trs_fixed_r.join(""))},r=(layui.each(c,function(e,t){x={"data-index":t[z],"lay-data-index":t[z],"data-level":"0"},h.trs.eq(e).attr(x).data("index",t[z]),h.trs_fixed.eq(e).attr(x).data("index",t[z]),h.trs_fixed_r.eq(e).attr(x).data("index",t[z])}),parseInt(c[0][z])-1),y=l.find(q),n=l.find(R),f=l.find(Y);-1==r?y.find('tr[data-level="0"][data-index="0"]')[0]?(y.find('tr[data-level="0"][data-index="0"]').before(h.trs),n.find('tr[data-level="0"][data-index="0"]').before(h.trs_fixed),f.find('tr[data-level="0"][data-index="0"]').before(h.trs_fixed_r)):(y.find("tbody").prepend(h.trs),n.find("tbody").prepend(h.trs_fixed),f.find("tbody").prepend(h.trs_fixed_r)):-1===o?(y.find("tbody").append(h.trs),n.find("tbody").append(h.trs_fixed),f.find("tbody").append(h.trs_fixed_r)):(r=p[0][b],y.find('tr[data-level="0"][data-index="'+r+'"]').before(h.trs),n.find('tr[data-level="0"][data-index="'+r+'"]').before(h.trs_fixed),f.find('tr[data-level="0"][data-index="'+r+'"]').before(h.trs_fixed_r)),layui.each(P.cache[e],function(e,t){l.find('tr[data-level="0"][lay-data-index="'+t[z]+'"]').attr("data-index",e).data("index",e)}),a.renderTreeTable(l.find(c.map(function(e,t,a){return'tr[lay-data-index="'+e[z]+'"]'}).join(",")))}return a.updateCheckStatus(u),u&&(o=l.find('tr[lay-data-index="'+u[z]+'"]'),a.updateNodeIcon({scopeEl:o,isExpand:u[H],isParent:u[s]})),B.resize(e),t&&l.find(q).find('tr[lay-data-index="'+c[0][z]+'"]').get(0).scrollIntoViewIfNeeded(),c}},B.checkStatus=function(e,n){var i,t,a,l=j(e);if(l)return l=l.getOptions().tree,i=P.config.checkName,t=B.getData(e,!0).filter(function(e,t,a){return e[i]||n&&e[g]}),a=!0,layui.each("all"===l.data.cascade?P.cache[e]:B.getData(e,!0),function(e,t){if(!t[i])return!(a=!1)}),{data:t,isAll:a}},B.on("sort",function(e){var e=e.config,t=e.elem.next(),e=e.id;t.hasClass(m)&&B.sort(e)}),B.on("row",function(e){e.config.elem.next().hasClass(m)&&o(e)}),B.on("rowDouble",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(m)&&(o(e),(t.tree||{}).view.dblClickExpand)&&J({trElem:e.tr.first()},null,null,null,!0)}),B.on("rowContextmenu",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(m)&&o(e)}),B.on("tool",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(m)&&o(e)}),B.on("edit",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(m)&&(o(e),e.field===t.tree.customName.name)&&((a={})[e.field]=e.value,e.update(a))}),B.on("radio",function(e){var t=e.config,a=t.elem.next(),t=t.id;a.hasClass(m)&&(a=j(t),o(e),u.call(a,e.tr,e.checked))}),a.prototype.setRowCheckedClass=function(e,t){var a=this.getOptions(),n=(e.data("index"),a.elem.next());e[t?"addClass":"removeClass"](l),e.each(function(){var e=A(this).data("index");n.find('.layui-table-fixed-r tbody tr[data-index="'+e+'"]')[t?"addClass":"removeClass"](l)})},a.prototype.updateCheckStatus=function(e,t){var a,n,i,l,d,r,o,c=this,u=c.getOptions();return!!u.hasChecboxCol&&(a=u.tree,n=u.id,i=u.elem.next(),l=P.config.checkName,"all"!==(d=a.data.cascade)&&"parent"!==d||!e||(d=c.updateParentCheckStatus(e,"boolean"===layui.type(t)?t:null),layui.each(d,function(e,t){var a=i.find('tr[lay-data-index="'+t[z]+'"] input[name="layTableCheckbox"]:not(:disabled)'),n=t[l];c.setRowCheckedClass(a.closest("tr"),n),a.prop({checked:n,indeterminate:t[g]})})),o=!(r=!0),0<(e=(e="all"===a.data.cascade?P.cache[n]:B.getData(n,!0)).filter(function(e){return!e[u.disabledName]})).length?layui.each(e,function(e,t){if((t[l]||t[g])&&(o=!0),t[l]||(r=!1),o&&!r)return!0}):r=!1,o=o&&!r,i.find('input[name="layTableCheckbox"][lay-filter="layTableAllChoose"]').prop({checked:r,indeterminate:o}),r)},a.prototype.updateParentCheckStatus=function(a,n){var i,e=this.getOptions(),t=e.tree,e=e.id,l=P.config.checkName,t=t.customName.children,d=[];return!(a[g]=!1)===n?a[t].length?layui.each(a[t],function(e,t){if(!t[l])return n=!1,a[g]=!0}):n=!1:!1===n?layui.each(a[t],function(e,t){if(t[l]||t[g])return a[g]=!0}):(n=!1,i=0,layui.each(a[t],function(e,t){t[l]&&i++}),n=a[t].length?a[t].length===i:a[l],a[g]=!n&&0li"],n.bodyElem=["."+C.CONST.BODY+":eq(0)",">."+C.CONST.ITEM],n.getContainer=function(){var e=n.documentElem||t.elem;return{header:{elem:e.find(n.headerElem[0]),items:e.find(n.headerElem.join(""))},body:{elem:e.find(n.bodyElem[0]),items:e.find(n.bodyElem.join(""))}}},"array"===layui.type(t.header)?"string"==typeof t.header[0]?(n.headerElem=t.header.concat(),n.documentElem=p(document)):(n.elemView=p('
                      '),t.className&&n.elemView.addClass(t.className),a=p('
                        '),i=p('
                        '),layui.each(t.header,function(e,t){t=n.renderHeaderItem(t);a.append(t)}),layui.each(t.body,function(e,t){t=n.renderBodyItem(t);i.append(t)}),n.elemView.append(a).append(i),t.elem.html(n.elemView)):n.renderClose(),"array"===layui.type(t.body)&&"string"==typeof t.body[0]&&(n.documentElem=p(document),n.bodyElem=t.body.concat()),n.data());"index"in t&&e.index!=t.index?n.change(n.findHeaderItem(t.index),!0):-1===e.index&&n.change(n.findHeaderItem(0),!0),n.roll("auto"),t.elem.hasClass(C.CONST.CLASS_HIDEV)&&t.elem.removeClass(C.CONST.CLASS_HIDEV),"function"==typeof t.afterRender&&t.afterRender(e),layui.event.call(t.elem[0],C.CONST.MOD_NAME,"afterRender("+t.id+")",e)},events:function(){var e,t=this,a=t.config,i=t.getContainer(),n=C.CONST.MOD_NAME,i=(t.documentElem?i.header:a).elem,a=a.trigger+(".lay_"+n+"_trigger"),n=t.documentElem?t.headerElem[1]:t.headerElem.join("");i.off(a).on(a,n,function(){t.change(p(this))}),r.onresize||(p(window).on("resize",function(){clearTimeout(e),e=setTimeout(function(){layui.each(C.cache.id,function(e){e=C.getInst(e);e&&e.roll("init")})},50)}),r.onresize=!0)}}),r={},t=C.Class;t.prototype.add=function(e){var t,a,i=this,n=(i.config,i.getContainer()),r=i.renderHeaderItem(e),d=i.renderBodyItem(e),o=i.data();e=p.extend({active:!0},e),/(before|after)/.test(e.mode)?(a=(t=e.hasOwnProperty("index"))?i.findHeaderItem(e.index):o.thisHeaderItem,t=t?i.findBodyItem(e.index):o.thisHeaderItem,a[e.mode](r),t[e.mode](d)):(a={prepend:"prepend",append:"append"}[e.mode||"append"]||"append",n.header.elem[a](r),n.body.elem[a](d)),e.active?i.change(r,!0):i.roll("auto"),"function"==typeof e.done&&e.done(p.extend(o,{headerItem:r,bodyItem:d}))},t.prototype.close=function(e,t){if(e&&e[0]){var a=this,i=a.config,n=e.index();if(e[0]&&"false"!==e.attr("lay-closable")){var r=a.data();if(!t)if(!1===layui.event.call(e[0],C.CONST.MOD_NAME,"beforeClose("+i.id+")",p.extend(r,{index:e.index()})))return;e.hasClass(C.CONST.CLASS_THIS)&&(e.next()[0]?a.change(e.next(),!0):e.prev()[0]&&a.change(e.prev(),!0)),e.remove(),a.findBodyItem(n).remove(),a.roll("auto",n);r=a.data();layui.event.call(r.thisHeaderItem[0],C.CONST.MOD_NAME,"afterClose("+i.id+")",r)}}},t.prototype.closeMult=function(e,t){var a,i=this,n=i.config,r=i.getContainer(),d=i.data(),o=r.header.items,l=r.body.items,r='[lay-closable="false"]',s=":not("+r+")",d=(t=t===undefined?d.index:t,o.each(function(e){var t=p(this).attr("lay-closable");t&&l.eq(e).attr("lay-closable",t)}),"false"!==d.thisHeaderItem.attr("lay-closable")&&("all"!==e&&e?t!==d.index&&i.change(i.findHeaderItem(t),!0):(a=o.filter(":gt("+d.index+")"+r).eq(0),r=p(o.filter(":lt("+d.index+")"+r).get().reverse()).eq(0),a[0]?i.change(a,!0):r[0]&&i.change(r,!0))),("other"===e?(o.eq(t).siblings(s).remove(),l.eq(t).siblings(s)):"right"===e?(o.filter(":gt("+t+")"+s).remove(),l.filter(":gt("+t+")"+s)):(o.filter(s).remove(),l.filter(s))).remove(),i.roll("auto"),i.data());layui.event.call(d.thisHeaderItem[0],C.CONST.MOD_NAME,"afterClose("+n.id+")",d)},t.prototype.change=function(e,t){if(e&&e[0]){var a=this,i=a.config,n=e.attr("lay-id")||e.index(),r=e.find("a"),r="string"==typeof r.attr("href")&&"_blank"===r.attr("target"),d="string"==typeof e.attr("lay-unselect");if(!r&&!d){r=a.data();if(!t)if(!1===layui.event.call(e[0],C.CONST.MOD_NAME,"beforeChange("+i.id+")",p.extend(r,{from:{index:r.index,headerItem:r.thisHeaderItem},to:{index:e.index(),headerItem:e}})))return;e.addClass(C.CONST.CLASS_THIS).siblings().removeClass(C.CONST.CLASS_THIS),a.findBodyItem(n).addClass(C.CONST.CLASS_SHOW).siblings().removeClass(C.CONST.CLASS_SHOW),a.roll("auto",n);r=a.data();layui.event.call(r.thisHeaderItem[0],C.CONST.MOD_NAME,"afterChange("+i.id+")",r)}}},t.prototype.renderHeaderItem=function(e){var t=this.config,t=p(e.headerItem||t.headerItem||"
                      • ");return t.html(e.title||"New Tab").attr("lay-id",e.id),this.appendClose(t,e),t},t.prototype.renderBodyItem=function(e){var t=this.config,t=p(e.bodyItem||t.bodyItem||'
                        ');return t.html(e.content||"").attr("lay-id",e.id),t},t.prototype.appendClose=function(e,t){var a=this;a.config.closable&&0!=(t=t||{}).closable&&"false"!==e.attr("lay-closable")&&!e.find("."+C.CONST.CLOSE)[0]&&((t=p('')).on("click",function(){return a.close(p(this).parent()),!1}),e.append(t))},t.prototype.renderClose=function(){var t=this,a=t.config;t.getContainer().header.items.each(function(){var e=p(this);a.closable?t.appendClose(e):e.find("."+C.CONST.CLOSE).remove()})},t.prototype.roll=function(e,i){var n=this,t=n.config,a=n.getContainer(),r=a.header.elem,d=a.header.items,a=r.prop("scrollWidth"),o=Math.ceil(r.outerWidth()),l=r.data("left")||0,s="scroll"===t.headerMode,c="layui-tabs-scroll",f="layui-tabs-bar",u=["layui-icon-prev","layui-icon-next"],m={elem:p('
                        '),bar:p(['
                        ','','',"
                        "].join(""))};if("normal"!==t.headerMode){var h,y=r.parent("."+c);if(s||!s&&o=o-l)return r.css("left",-a).data("left",-a),!1}),l=r.data("left")||0,y.find("."+u[0])[l<0?"removeClass":"addClass"](C.CONST.CLASS_DISABLED),y.find("."+u[1])[0')),n=(e.tree(a),i.elem=p(i.elem));if(n[0]){if(e.key=i.id||e.index,e.elem=a,e.elemNone=p('
                        '+i.text.none+"
                        "),n.html(e.elem),0==e.elem.find(".layui-tree-set").length)return e.elem.append(e.elemNone);i.showCheckbox&&e.renderForm("checkbox"),e.elem.find(".layui-tree-set").each(function(){var e=p(this);e.parent(".layui-tree-pack")[0]||e.addClass("layui-tree-setHide"),!e.next()[0]&&e.parents(".layui-tree-pack").eq(1).hasClass("layui-tree-lineExtend")&&e.addClass(T),e.next()[0]||e.parents(".layui-tree-set").eq(0).next()[0]||e.addClass(T)}),e.events()}},l.prototype.renderForm=function(e){i.render(e,"LAY-tree-"+this.index)},l.prototype.tree=function(r,e){var d=this,s=d.config,o=s.customName,e=e||s.data;layui.each(e,function(e,i){var a,n,t=i[o.children]&&0"),c=p(['
                        ','
                        ','
                        ',s.showLine?t?'':'':'',s.showCheckbox?'':"",s.isJump&&i.href?''+(i[o.title]||i.label||s.text.defaultNodeName)+"":''+(i[o.title]||i.label||s.text.defaultNodeName)+"","
                        ",s.edit?(a={add:'',update:'',del:''},n=['
                        '],!0===s.edit&&(s.edit=["update","del"]),"object"==typeof s.edit?(layui.each(s.edit,function(e,i){n.push(a[i]||"")}),n.join("")+"
                        "):void 0):"","
                        "].join(""));t&&(c.append(l),d.tree(l,i[o.children])),r.append(c),c.prev("."+k)[0]&&c.prev().children(".layui-tree-pack").addClass("layui-tree-showLine"),t||c.parent(".layui-tree-pack").addClass("layui-tree-lineExtend"),d.spread(c,i),s.showCheckbox&&(i.checked&&d.checkids.push(i[o.id]),d.checkClick(c,i)),s.edit&&d.operate(c,i)})},l.prototype.spread=function(n,t){var l=this,c=l.config,e=n.children("."+b),i=e.children("."+g),a=i.find('input[same="layuiTreeCheck"]'),r=e.find("."+C),e=e.find("."+w),d=c.onlyIconControl?r:i,s="";d.on("click",function(e){var i=n.children("."+N),a=(d.children(".layui-icon")[0]?d:d.find(".layui-tree-icon")).children(".layui-icon");i[0]?n.hasClass(F)?(n.removeClass(F),i.slideUp(200),a.removeClass(x).addClass(v),l.updateFieldValue(t,"spread",!1)):(n.addClass(F),i.slideDown(200),a.addClass(x).removeClass(v),l.updateFieldValue(t,"spread",!0),c.accordion&&((i=n.siblings("."+k)).removeClass(F),i.children("."+N).slideUp(200),i.find(".layui-tree-icon").children(".layui-icon").removeClass(x).addClass(v))):s="normal"}),e.on("click",function(){p(this).hasClass(u)||(s=n.hasClass(F)?c.onlyIconControl?"open":"close":c.onlyIconControl?"close":"open",a[0]&&l.updateFieldValue(t,"checked",a.prop("checked")),c.click&&c.click({elem:n,state:s,data:t}))})},l.prototype.updateFieldValue=function(e,i,a){i in e&&(e[i]=a)},l.prototype.setCheckbox=function(e,i,a){var t,n=this,l=n.config.customName,c=a.prop("checked");a.prop("disabled")||("object"!=typeof i[l.children]&&!e.find("."+N)[0]||e.find("."+N).find('input[same="layuiTreeCheck"]').each(function(e){this.disabled||((e=i[l.children][e])&&n.updateFieldValue(e,"checked",c),n.updateFieldValue(this,"checked",c))}),(t=function(e){var i,a,n;e.parents("."+k)[0]&&(a=(e=e.parent("."+N)).parent(),n=e.prev().find('input[same="layuiTreeCheck"]'),c?n.prop("checked",c):(e.find('input[same="layuiTreeCheck"]').each(function(){this.checked&&(i=!0)}),i||n.prop("checked",!1)),t(a))})(e),n.renderForm("checkbox"))},l.prototype.checkClick=function(a,n){var t=this,l=t.config;a.children("."+b).children("."+g).on("click",'input[same="layuiTreeCheck"]+',function(e){layui.stope(e);var e=p(this).prev(),i=e.prop("checked");e.prop("disabled")||(t.setCheckbox(a,n,e),t.updateFieldValue(n,"checked",i),l.oncheck&&l.oncheck({elem:a,checked:i,data:n}))})},l.prototype.operate=function(r,d){var s=this,o=s.config,u=o.customName,e=r.children("."+b),h=e.children("."+g);e.children(".layui-tree-btnGroup").on("click",".layui-icon",function(e){layui.stope(e);var i,e=p(this).data("type"),n=r.children("."+N),t={data:d,type:e,elem:r};if("add"==e){n[0]||(o.showLine?(h.find("."+C).addClass("layui-tree-icon"),h.find("."+C).children(".layui-icon").addClass(v).removeClass("layui-icon-file")):h.find(".layui-tree-iconArrow").removeClass(m),r.append('
                        '));var a,l=o.operate&&o.operate(t),c={};if(c[u.title]=o.text.defaultNodeName,c[u.id]=l,s.tree(r.children("."+N),[c]),o.showLine&&(n[0]?(n.hasClass(S)||n.addClass(S),r.find("."+N).each(function(){p(this).children("."+k).last().addClass(T)}),(n.children("."+k).last().prev().hasClass(T)?n.children("."+k).last().prev():n.children("."+k).last()).removeClass(T),!r.parent("."+N)[0]&&r.next()[0]&&n.children("."+k).last().removeClass(T)):(l=r.siblings("."+k),a=1,c=r.parent("."+N),layui.each(l,function(e,i){p(i).children("."+N)[0]||(a=0)}),(1==a?(l.children("."+N).addClass(L),l.children("."+N).children("."+k).removeClass(T),r.children("."+N).addClass(L),c.removeClass(S),c.children("."+k).last().children("."+N).children("."+k).last()):r.children("."+N).children("."+k)).addClass(T))),!o.showCheckbox)return;h.find('input[same="layuiTreeCheck"]')[0].checked&&(r.children("."+N).children("."+k).last().find('input[same="layuiTreeCheck"]')[0].checked=!0),s.renderForm("checkbox")}else"update"==e?(l=h.children("."+w).html(),h.children("."+w).html(""),h.append(''),h.children(".layui-tree-editInput").val(f.unescape(l)).focus(),i=function(e){var i=f.escape(e.val().trim())||o.text.defaultNodeName;e.remove(),h.children("."+w).html(i),t.data[u.title]=i,o.operate&&o.operate(t)},h.children(".layui-tree-editInput").blur(function(){i(p(this))}),h.children(".layui-tree-editInput").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),i(p(this)))})):y.confirm('\u786e\u8ba4\u5220\u9664\u8be5\u8282\u70b9 "'+(d[u.title]||"")+'" \u5417\uff1f',function(e){var l,a,i;o.operate&&o.operate(t),t.status="remove",y.close(e),r.prev("."+k)[0]||r.next("."+k)[0]||r.parent("."+N)[0]?(r.siblings("."+k).children("."+b)[0]?(o.showCheckbox&&(l=function(e){var i,a,n,t;e.parents("."+k)[0]&&(i=e.siblings("."+k).children("."+b),a=(e=e.parent("."+N).prev()).find('input[same="layuiTreeCheck"]')[0],n=1,(t=0)==a.checked)&&(i.each(function(e,i){i=p(i).find('input[same="layuiTreeCheck"]')[0];0!=i.checked||i.disabled||(n=0),i.disabled||(t=1)}),1==n)&&1==t&&(a.checked=!0,s.renderForm("checkbox"),l(e.parent("."+k)))})(r),o.showLine&&(e=r.siblings("."+k),a=1,i=r.parent("."+N),layui.each(e,function(e,i){p(i).children("."+N)[0]||(a=0)}),1==a?(n[0]||(i.removeClass(S),e.children("."+N).addClass(L),e.children("."+N).children("."+k).removeClass(T)),(r.next()[0]?i.children("."+k).last():r.prev()).children("."+N).children("."+k).last().addClass(T),r.next()[0]||r.parents("."+k)[1]||r.parents("."+k).eq(0).next()[0]||r.prev("."+k).addClass(T)):!r.next()[0]&&r.hasClass(T)&&r.prev().addClass(T))):(e=r.parent("."+N).prev(),o.showLine?(e.find("."+C).removeClass("layui-tree-icon"),e.find("."+C).children(".layui-icon").removeClass(x).addClass("layui-icon-file"),(i=e.parents("."+N).eq(0)).addClass(S),i.children("."+k).each(function(){p(this).children("."+N).children("."+k).last().addClass(T)})):e.find(".layui-tree-iconArrow").addClass(m),r.parents("."+k).eq(0).removeClass(F),r.parent("."+N).remove()),r.remove()):(r.remove(),s.elem.append(s.elemNone))})})},l.prototype.events=function(){var i=this,t=i.config;i.elem.find(".layui-tree-checkedFirst");i.setChecked(i.checkids),i.elem.find(".layui-tree-search").on("keyup",function(){var e=p(this),a=e.val(),e=e.nextAll(),n=[];e.find("."+w).each(function(){var i,e=p(this).parents("."+b);-1!=p(this).html().indexOf(a)&&(n.push(p(this).parent()),(i=function(e){e.addClass("layui-tree-searchShow"),e.parent("."+N)[0]&&i(e.parent("."+N).parent("."+k))})(e.parent("."+k)))}),e.find("."+b).each(function(){var e=p(this).parent("."+k);e.hasClass("layui-tree-searchShow")||e.addClass(m)}),0==e.find(".layui-tree-searchShow").length&&i.elem.append(i.elemNone),t.onsearch&&t.onsearch({elem:n})}),i.elem.find(".layui-tree-search").on("keydown",function(){p(this).nextAll().find("."+b).each(function(){p(this).parent("."+k).removeClass("layui-tree-searchShow "+m)}),p(".layui-tree-emptyText")[0]&&p(".layui-tree-emptyText").remove()})},l.prototype.getChecked=function(){var t=this,e=t.config,l=e.customName,i=[],a=[],c=(t.elem.find(".layui-form-checked").each(function(){i.push(p(this).prev()[0].value)}),function(e,n){layui.each(e,function(e,a){layui.each(i,function(e,i){if(a[l.id]==i)return t.updateFieldValue(a,"checked",!0),delete(i=p.extend({},a))[l.children],n.push(i),a[l.children]&&(i[l.children]=[],c(a[l.children],i[l.children])),!0})})});return c(p.extend({},e.data),a),a},l.prototype.setChecked=function(l){this.config;this.elem.find("."+k).each(function(e,i){var a=p(this).data("id"),n=p(i).children("."+b).find('input[same="layuiTreeCheck"]'),t=n.next();if("number"==typeof l){if(a.toString()==l.toString())return n[0].checked||t.click(),!1}else"object"==typeof l&&layui.each(l,function(e,i){if(i.toString()==a.toString()&&!n[0].checked)return t.click(),!0})})},n.that={},n.config={},t.reload=function(e,i){e=n.that[e];return e.reload(i),n.call(e)},t.getChecked=function(e){return n.that[e].getChecked()},t.setChecked=function(e,i){return n.that[e].setChecked(i)},t.render=function(e){e=new l(e);return n.call(e)},e(a,t)});layui.define(["laytpl","form"],function(e){"use strict";var d=layui.$,n=layui.laytpl,t=layui.form,a="transfer",i={config:{},index:layui[a]?layui[a].index+1e4:0,set:function(e){var t=this;return t.config=d.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,a,e,t)}},l=function(){var t=this,e=t.config,a=e.id||t.index;return l.that[a]=t,{config:l.config[a]=e,reload:function(e){t.reload.call(t,e)},getData:function(){return t.getData.call(t)}}},s="layui-hide",u="layui-btn-disabled",c="layui-none",r="layui-transfer-box",h="layui-transfer-header",o="layui-transfer-search",f="layui-transfer-data",y=function(e){return['
                        ','
                        ','","
                        ","{{# if(d.data.showSearch){ }}",'","{{# } }}",'
                          ',"
                          "].join("")},p=['
                          ',y({index:0,checkAllName:"layTransferLeftCheckAll"}),'
                          ','",'","
                          ",y({index:1,checkAllName:"layTransferRightCheckAll"}),"
                          "].join(""),v=function(e){var t=this;t.index=++i.index,t.config=d.extend({},t.config,i.config,e),t.render()};v.prototype.config={title:["\u5217\u8868\u4e00","\u5217\u8868\u4e8c"],width:200,height:360,data:[],value:[],showSearch:!1,id:"",text:{none:"\u65e0\u6570\u636e",searchNone:"\u65e0\u5339\u914d\u6570\u636e"}},v.prototype.reload=function(e){var t=this;t.config=d.extend({},t.config,e),t.render()},v.prototype.render=function(){var e=this,t=e.config,a=e.elem=d(n(p,{open:"{{",close:"}}",tagStyle:"legacy"}).render({data:t,index:e.index})),i=t.elem=d(t.elem);i[0]&&(t.data=t.data||[],t.value=t.value||[],t.id="id"in t?t.id:elem.attr("id")||e.index,e.key=t.id,i.html(e.elem),e.layBox=e.elem.find("."+r),e.layHeader=e.elem.find("."+h),e.laySearch=e.elem.find("."+o),e.layData=a.find("."+f),e.layBtn=a.find(".layui-transfer-active .layui-btn"),e.layBox.css({width:t.width,height:t.height}),e.layData.css({height:(i=t.height-e.layHeader.outerHeight(),t.showSearch&&(i-=e.laySearch.outerHeight()),i-2)}),e.renderData(),e.events())},v.prototype.renderData=function(){var e=this,t=e.config,l=[{checkName:"layTransferLeftCheck",views:[]},{checkName:"layTransferRightCheck",views:[]}];e.parseData(function(a){var i=a.selected?1:0,n=["
                        • ",'',"
                        • "].join("");i?layui.each(t.value,function(e,t){t==a.value&&a.selected&&(l[i].views[e]=n)}):l[i].views.push(n),delete a.selected}),e.layData.eq(0).html(l[0].views.join("")),e.layData.eq(1).html(l[1].views.join("")),e.renderCheckBtn()},v.prototype.renderForm=function(e){t.render(e,"LAY-transfer-"+this.index)},v.prototype.renderCheckBtn=function(c){var r=this,o=r.config;c=c||{},r.layBox.each(function(e){var t=d(this),a=t.find("."+f),t=t.find("."+h).find('input[type="checkbox"]'),i=a.find('input[type="checkbox"]'),n=0,l=!1;i.each(function(){var e=d(this).data("hide");(this.checked||this.disabled||e)&&n++,this.checked&&!e&&(l=!0)}),t.prop("checked",l&&n===i.length),r.layBtn.eq(e)[l?"removeClass":"addClass"](u),c.stopNone||(i=a.children("li:not(."+s+")").length,r.noneView(a,i?"":o.text.none))}),r.renderForm("checkbox")},v.prototype.noneView=function(e,t){var a=d('

                          '+(t||"")+"

                          ");e.find("."+c)[0]&&e.find("."+c).remove(),t.replace(/\s/g,"")&&e.append(a)},v.prototype.setValue=function(){var e=this.config,t=[];return this.layBox.eq(1).find("."+f+' input[type="checkbox"]').each(function(){d(this).data("hide")||t.push(this.value)}),e.value=t,this},v.prototype.parseData=function(t){var i=this.config,n=[];return layui.each(i.data,function(e,a){a=("function"==typeof i.parseData?i.parseData(a):a)||a,n.push(a=d.extend({},a)),layui.each(i.value,function(e,t){t==a.value&&(a.selected=!0)}),t&&t(a)}),i.data=n,this},v.prototype.getData=function(e){var t=this.config,i=[];return this.setValue(),layui.each(e||t.value,function(e,a){layui.each(t.data,function(e,t){delete t.selected,a==t.value&&i.push(t)})}),i},v.prototype.transfer=function(e,t){var a,i=this,n=i.config,l=i.layBox.eq(e),c=[],t=(t?((a=(t=t).find('input[type="checkbox"]'))[0].checked=!1,l.siblings("."+r).find("."+f).append(t.clone()),t.remove(),c.push(a[0].value),i.setValue()):l.each(function(e){d(this).find("."+f).children("li").each(function(){var e=d(this),t=e.find('input[type="checkbox"]'),a=t.data("hide");t[0].checked&&!a&&(t[0].checked=!1,l.siblings("."+r).find("."+f).append(e.clone()),e.remove(),c.push(t[0].value)),i.setValue()})}),i.renderCheckBtn(),l.siblings("."+r).find("."+o+" input"));""!==t.val()&&t.trigger("keyup"),n.onchange&&n.onchange(i.getData(c),e)},v.prototype.events=function(){var n=this,l=n.config;n.elem.on("click",'input[lay-filter="layTransferCheckbox"]+',function(){var e=d(this).prev(),t=e[0].checked,a=e.parents("."+r).eq(0).find("."+f);e[0].disabled||("all"===e.attr("lay-type")&&a.find('input[type="checkbox"]').each(function(){this.disabled||(this.checked=t)}),setTimeout(function(){n.renderCheckBtn({stopNone:!0})},0))}),n.elem.on("dblclick","."+f+">li",function(e){var t=d(this),a=t.children('input[type="checkbox"]'),i=t.parent().parent().data("index");a[0].disabled||!1!==("function"==typeof l.dblclick?l.dblclick({elem:t,data:n.getData([a[0].value])[0],index:i}):null)&&n.transfer(i,t)}),n.layBtn.on("click",function(){var e=d(this),t=e.data("index");e.hasClass(u)||n.transfer(t)}),n.laySearch.find("input").on("keyup",function(){var i=this.value,e=d(this).parents("."+o).eq(0).siblings("."+f),t=e.children("li"),t=(t.each(function(){var e=d(this),t=e.find('input[type="checkbox"]'),a=t[0].title,a=("cs"!==l.showSearch&&(a=a.toLowerCase(),i=i.toLowerCase()),-1!==a.indexOf(i));e[a?"removeClass":"addClass"](s),t.data("hide",!a)}),n.renderCheckBtn(),t.length===e.children("li."+s).length);n.noneView(e,t?l.text.searchNone:"")})},l.that={},l.config={},i.reload=function(e,t){e=l.that[e];return e.reload(t),l.call(e)},i.getData=function(e){return l.that[e].getData()},i.render=function(e){e=new v(e);return l.call(e)},e(a,i)});layui.define(["jquery","lay"],function(e){"use strict";var o=layui.$,l=layui.lay,t=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=o.extend({},n.config,e),n},on:function(e,n){return layui.onevent.call(this,r,e,n)}}),r="carousel",s="layui-this",u="layui-carousel-left",c="layui-carousel-right",m="layui-carousel-prev",h="layui-carousel-next",a="layui-carousel-arrow",d="layui-carousel-ind",n=function(e){var n=this;n.config=o.extend({},n.config,t.config,e),n.render()};n.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},n.prototype.render=function(){var e=this,n=e.config,i=o(n.elem);if(1*[carousel-item]>*"),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(s),e.indicator(),e.arrow(),e.autoplay(),1=this.elemItem.length?0:e},n.prototype.addIndex=function(e){var n=this.config;n.index=n.index+(e=e||1),n.index>=this.elemItem.length&&(n.index=0)},n.prototype.subIndex=function(e){var n=this.config;n.index=n.index-(e=e||1),n.index<0&&(n.index=this.elemItem.length-1)},n.prototype.autoplay=function(){var e=this,n=e.config,i=e.elemItem.length;n.autoplay&&(clearInterval(e.timer),1',''].join(""));e.elem.attr("lay-arrow",e.arrow),e.elem.find("."+a)[0]&&e.elem.find("."+a).remove(),1i.index?n.slide("add",e-i.index):e
                            ',(n=[],layui.each(e.elemItem,function(e){n.push("")}),n.join("")),"
                          "].join(""));i.elem.attr("lay-indicator",i.indicator),i.elem.find("."+d)[0]&&i.elem.find("."+d).remove(),1t[a?"height":"width"]()/3)&&o.slide(0"),i=1;i<=a.length;i++){var n='
                        • ";a.half&&parseInt(a.value)!==a.value&&i==Math.ceil(a.value)?t=t+'
                        • ":t+=n}t+="",a.text&&(t+=''+a.value+"");var s=a.elem,o=s.next("."+c.ELEM);o[0]&&o.remove(),e.elemTemplate=u(t),a.span=e.elemTemplate.next("span"),a.setText&&a.setText(a.value),s.html(e.elemTemplate),s.addClass("layui-inline"),a.readonly||e.action()},extendsInstance:function(){var a=this,l=a.config;return{setvalue:function(e){l.value=e,a.render()}}}}),c=l.CONST;l.Class.prototype.action=function(){var n=this.config,t=this.elemTemplate,i=t.find("i").width(),l=t.children("li");l.each(function(e){var a=e+1,l=u(this);l.on("click",function(e){n.value=a,n.half&&e.pageX-u(this).offset().left<=i/2&&(n.value=n.value-.5),n.text&&t.next("span").text(n.value),n.choose&&n.choose(n.value),n.setText&&n.setText(n.value)}),l.on("mousemove",function(e){t.find("i").each(function(){u(this).addClass(c.ICON_RATE).removeClass(c.ICON_SOLID_HALF)}),t.find("i:lt("+a+")").each(function(){u(this).addClass(c.ICON_RATE_SOLID).removeClass(c.ICON_HALF_RATE)}),n.half&&e.pageX-u(this).offset().left<=i/2&&l.children("i").addClass(c.ICON_RATE_HALF).removeClass(c.ICON_RATE_SOLID)}),l.on("mouseleave",function(){t.find("i").each(function(){u(this).addClass(c.ICON_RATE).removeClass(c.ICON_SOLID_HALF)}),t.find("i:lt("+Math.floor(n.value)+")").each(function(){u(this).addClass(c.ICON_RATE_SOLID).removeClass(c.ICON_HALF_RATE)}),n.half&&parseInt(n.value)!==n.value&&t.children("li:eq("+Math.floor(n.value)+")").children("i").addClass(c.ICON_RATE_HALF).removeClass(c.ICON_SOLID_RATE)})}),a.touchSwipe(t,{onTouchMove:function(e,a){var i;Date.now()-a.timeStart<=200||(a=e.touches[0].pageX,e=t.width()/n.length,a=(a-t.offset().left)/e,(i=(i=(e=a%1)<=.5&&n.half?.5+(a-e):Math.ceil(a))>n.length?n.length:i)<0&&(i=0),l.each(function(e){var a=u(this).children("i"),l=Math.ceil(i)-e==1,t=Math.ceil(i)>e,e=i-e==.5;t?(a.addClass(c.ICON_RATE_SOLID).removeClass(c.ICON_HALF_RATE),n.half&&e&&a.addClass(c.ICON_RATE_HALF).removeClass(c.ICON_RATE_SOLID)):a.addClass(c.ICON_RATE).removeClass(c.ICON_SOLID_HALF),a.toggleClass("layui-rate-hover",l)}),n.value=i,n.text&&t.next("span").text(n.value),n.setText&&n.setText(n.value))},onTouchEnd:function(e,a){Date.now()-a.timeStart<=200||(t.find("i").removeClass("layui-rate-hover"),n.choose&&n.choose(n.value),n.setText&&n.setText(n.value))}})},e(c.MOD_NAME,l)});layui.define("jquery",function(o){"use strict";var w=layui.$,l=function(o){};l.prototype.load=function(o){var i,n,r,l,c,m,e,t,a,f,s,u,p,d,y,g=this,h=0,v=w((o=o||{}).elem);if(v[0])return c=w(o.scrollElem||document),m="mb"in o?o.mb:50,e=!("isAuto"in o)||o.isAuto,t=o.moreText||"\u52a0\u8f7d\u66f4\u591a",a=o.end||"\u6ca1\u6709\u66f4\u591a\u4e86",f="top"===(o.direction||"bottom"),g._cleanup(v,c),s=o.scrollElem&&o.scrollElem!==document,p=w('"),v.find(".layui-flow-more")[0]||v[f?"prepend":"append"](p),d=function(o,l){var e=s?c.prop("scrollHeight"):document.documentElement.scrollHeight,t=c.scrollTop();o=w(o),p[f?"after":"before"](o),(l=0==l||null)?p.html(a):p.find("a").html(u),n=l,i=null,r&&r(),f&&(o=s?c.prop("scrollHeight"):document.documentElement.scrollHeight,1===h?c.scrollTop(o):1'),"function"==typeof o.done&&o.done(++h,d)})(),p.find("a").on("click.flow",function(){w(this);n||i||y()}),o.isLazyimg&&(r=g.lazyimg({elem:o.elem+" img",scrollElem:o.scrollElem,direction:o.direction})),e&&c.on("scroll.flow",function(){var e=w(this),t=e.scrollTop();l&&clearTimeout(l),!n&&v.width()&&(l=setTimeout(function(){var o=(s?e:w(window)).height(),l=s?e.prop("scrollHeight"):document.documentElement.scrollHeight;(f?t<=m:l-t-o<=m)&&!i&&y()},100))}),g},l.prototype.lazyimg=function(o){var l,m=this,a=0,f=w((o=o||{}).scrollElem||document),s=o.elem||"img",n="top"===(o.direction||"bottom"),u=o.scrollElem&&o.scrollElem!==document,p=function(l,o){var e,t=f.scrollTop(),o=t+o,i=u?l.offset().top-f.offset().top+t:l.offset().top;(n?i+l.height():i)>=t&&i<=o&&l.attr("lay-src")&&(e=l.attr("lay-src"),layui.img(e,function(){var o=m.lazyimg.elem.eq(a);l.attr("src",e).removeAttr("lay-src"),o[0]&&r(o),a++},function(){m.lazyimg.elem.eq(a);l.removeAttr("lay-src")}))},r=function(o,l){var e=(u?l||f:w(window)).height(),t=f.scrollTop(),i=t+e;if(m.lazyimg.elem=w(s),o)p(o,e);else for(var n=0;n"),preview:"Preview"},wordWrap:!0,lang:"text",highlighter:!1,langMarker:!1},R=layui.code?layui.code.index+1e4:0,j=function(e){return String(e).replace(/\s+$/,"").replace(/^\n|\n$/,"")};e("code",function(l,e){var o,i,t,a,n,d,c,s,r,u,y,p,E,f,h,v,m,L,_,M,C,g={config:l=x.extend(!0,{},T,l),reload:function(e){layui.code(this.updateOptions(e))},updateOptions:function(e){return delete(e=e||{}).elem,x.extend(!0,l,e)},reloadCode:function(e){layui.code(this.updateOptions(e),"reloadCode")}},w=x(l.elem);return 1',l.ln?['
                          ',D.digit(t+1)+".","
                          "].join(""):"",'
                          ',e||" ","
                          ",""].join("")})}},a=l.code,n=function(e){return"function"==typeof l.codeParse?l.codeParse(e,l):e},"reloadCode"===e?o.children(".layui-code-wrap").html(w(n(a)).html):(d=layui.code.index=++R,o.attr("lay-code-index",d),(M=A.CDDE_DATA_CLASS in o.data())&&o.attr("class",o.data(A.CDDE_DATA_CLASS)||""),M||o.data(A.CDDE_DATA_CLASS,o.attr("class")),c={copy:{className:"file-b",title:["\u590d\u5236\u4ee3\u7801"],event:function(e){var t=D.unescape(n(l.code)),a="function"==typeof l.onCopy;lay.clipboard.writeText({text:t,done:function(){if(a&&!1===l.onCopy(t,!0))return;W.msg("\u5df2\u590d\u5236",{icon:1})},error:function(){if(a&&!1===l.onCopy(t,!1))return;W.msg("\u590d\u5236\u5931\u8d25",{icon:2})}})}}},function b(){var e=o.parent("."+A.ELEM_PREVIEW),t=e.children("."+A.ELEM_TAB),a=e.children("."+A.ELEM_ITEM+"-preview");return t.remove(),a.remove(),e[0]&&o.unwrap(),b}(),l.preview&&(M="LAY-CODE-DF-"+d,f=l.layout||["code","preview"],s="iframe"===l.preview,E=x('
                          '),C=x('
                          '),r=x('
                          '),_=x('
                          '),u=x('
                          '),l.id&&E.attr("id",l.id),E.addClass(l.className),C.attr("lay-filter",M),layui.each(f,function(e,t){var a=x('
                        • ');0===e&&a.addClass("layui-this"),a.html(l.text[t]),r.append(a)}),x.extend(c,{full:{className:"screen-full",title:["\u6700\u5927\u5316\u663e\u793a","\u8fd8\u539f\u663e\u793a"],event:function(e){var e=e.elem,t=e.closest("."+A.ELEM_PREVIEW),a="layui-icon-"+this.className,i="layui-icon-screen-restore",l=this.title,o=x("html,body"),n="layui-scrollbar-hide";e.hasClass(a)?(t.addClass(A.ELEM_FULL),e.removeClass(a).addClass(i),e.attr("title",l[1]),o.addClass(n)):(t.removeClass(A.ELEM_FULL),e.removeClass(i).addClass(a),e.attr("title",l[0]),o.removeClass(n))}},window:{className:"release",title:["\u5728\u65b0\u7a97\u53e3\u9884\u89c8"],event:function(e){D.openWin({content:n(l.code)})}}}),l.copy&&("array"===layui.type(l.tools)?-1===l.tools.indexOf("copy")&&l.tools.unshift("copy"):l.tools=["copy"]),u.on("click",">i",function(){var e=x(this),t=e.data("type"),e={elem:e,type:t,options:l,rawCode:l.code,finalCode:D.unescape(n(l.code))};c[t]&&"function"==typeof c[t].event&&c[t].event(e),"function"==typeof l.toolsEvent&&l.toolsEvent(e)}),l.addTools&&l.tools&&(l.tools=[].concat(l.tools,l.addTools)),layui.each(l.tools,function(e,t){var a="object"==typeof t,i=a?t:c[t]||{className:t,title:[t]},l=i.className||i.type,o=i.title||[""],a=a?i.type||l:t;a&&(c[a]||((t={})[a]=i,x.extend(c,t)),u.append(''))}),o.addClass(A.ELEM_ITEM).wrap(E),C.append(r),l.tools&&C.append(u),o.before(C),s&&_.html(''),y=function(e){var t=e.children("iframe")[0];s&&t?t.srcdoc=n(l.code):e.html(l.code),setTimeout(function(){"function"==typeof l.done&&l.done({container:e,options:l,render:function(){N.render(e.find(".layui-form")),S.render(),I.render({elem:["."+A.ELEM_PREVIEW,".layui-tabs"].join(" ")})}})},3)},"preview"===f[0]?(_.addClass(A.ELEM_SHOW),o.before(_),y(_)):o.addClass(A.ELEM_SHOW).after(_),l.previewStyle=[l.style,l.previewStyle].join(""),_.attr("style",l.previewStyle),S.on("tab("+M+")",function(e){var t=x(this),a=x(e.elem).closest("."+A.ELEM_PREVIEW).find("."+A.ELEM_ITEM),e=a.eq(e.index);a.removeClass(A.ELEM_SHOW),e.addClass(A.ELEM_SHOW),"preview"===t.attr("lay-id")&&y(e),L()})),p=x(''),o.addClass((E=["layui-code-view layui-border-box"],l.wordWrap||E.push("layui-code-nowrap"),E.join(" "))),(C=l.theme||l.skin)&&(o.removeClass("layui-code-theme-dark layui-code-theme-light"),o.addClass("layui-code-theme-"+C)),l.highlighter&&o.addClass([l.highlighter,"language-"+l.lang,"layui-code-hl"].join(" ")),f=w(l.encode?D.escape(n(a)):a),h=f.lines,o.html(p.html(f.html)),l.ln&&o.append('
                          '),l.height&&p.css("max-height",l.height),l.codeStyle=[l.style,l.codeStyle].join(""),l.codeStyle&&p.attr("style",function(e,t){return(t||"")+l.codeStyle}),v=[{selector:">.layui-code-wrap>.layui-code-line{}",setValue:function(e,t){e.style["padding-left"]=t+"px"}},{selector:">.layui-code-wrap>.layui-code-line>.layui-code-line-number{}",setValue:function(e,t){e.style.width=t+"px"}},{selector:">.layui-code-ln-side{}",setValue:function(e,t){e.style.width=t+"px"}}],m=lay.style({target:o[0],id:"DF-code-"+d,text:x.map(x.map(v,function(e){return e.selector}),function(e,t){return['.layui-code-view[lay-code-index="'+d+'"]',e].join(" ")}).join("")}),L=function b(){var e,i;return l.ln&&(e=Math.floor(h.length/100),i=p.children("."+A.ELEM_LINE).last().children("."+A.ELEM_LINE_NUM).outerWidth(),o.addClass(A.ELEM_LN_MODE),e)&&A.LINE_RAW_WIDTH
                        • ')).html(l.title||l.text.code),o.prepend(_)),M=x('
                          '),l.copy&&!l.preview&&((C=x(['','',""].join(""))).on("click",function(){c.copy.event()}),M.append(C)),l.langMarker&&M.append(''+l.lang+""),l.about&&M.append(l.about),o.append(M),l.preview||setTimeout(function(){"function"==typeof l.done&&l.done({})},3),l.elem.length===1+d&&"function"==typeof l.allDone&&l.allDone())),g})}),layui["layui.all"]||layui.addcss("modules/code.css?v=6","skincodecss"); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/layui.css b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/layui.css new file mode 100644 index 0000000..70bae88 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/layui.css @@ -0,0 +1 @@ +blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}img{display:inline-block;border:none;vertical-align:middle}li{list-style:none}table{border-collapse:collapse;border-spacing:0}h1,h2,h3,h4,h5,h6{font-weight:700}h5,h6{font-size:100%}button,input,select,textarea{font-size:100%}button,input,optgroup,option,select,textarea{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;outline:0}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}body{line-height:1.6;color:rgba(0,0,0,.85);font-size:14px;font-family:Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif}hr{height:0;line-height:0;margin:10px 0;padding:0;border:none;border-bottom:1px solid #eee;clear:both;overflow:hidden;background:0 0}a{color:#333;text-decoration:none}a cite{font-style:normal}.layui-border-box,.layui-border-box *{box-sizing:border-box}.layui-box,.layui-box *{box-sizing:content-box}.layui-clear{clear:both}.layui-clear:after{content:'\20';clear:both;display:block;height:0}.layui-clear-space{word-spacing:-5px}.layui-inline{position:relative;display:inline-block;vertical-align:middle}.layui-edge{position:relative;display:inline-block;vertical-align:middle;width:0;height:0;border-width:6px;border-style:dashed;border-color:transparent;overflow:hidden}.layui-edge-top{top:-4px;border-bottom-color:#999;border-bottom-style:solid}.layui-edge-right{border-left-color:#999;border-left-style:solid}.layui-edge-bottom{top:2px;border-top-color:#999;border-top-style:solid}.layui-edge-left{border-right-color:#999;border-right-style:solid}.layui-elip,.layui-ellip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-disabled,.layui-icon,.layui-unselect{user-select:none}.layui-disabled,.layui-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-show-v{visibility:visible!important}.layui-hide-v{visibility:hidden!important}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=293);src:url(../font/iconfont.eot?v=293#iefix) format('embedded-opentype'),url(../font/iconfont.woff2?v=293) format('woff2'),url(../font/iconfont.woff?v=293) format('woff'),url(../font/iconfont.ttf?v=293) format('truetype'),url(../font/iconfont.svg?v=293#layui-icon) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-icon-sound:before{content:"\e69d"}.layui-icon-bot:before{content:"\e7d6"}.layui-icon-leaf:before{content:"\e701"}.layui-icon-folder:before{content:"\eabe"}.layui-icon-folder-open:before{content:"\eac1"}.layui-icon-gitee:before{content:"\e69b"}.layui-icon-github:before{content:"\e6a7"}.layui-icon-disabled:before{content:"\e6cc"}.layui-icon-moon:before{content:"\e6c2"}.layui-icon-error:before{content:"\e693"}.layui-icon-success:before{content:"\e697"}.layui-icon-question:before{content:"\e699"}.layui-icon-lock:before{content:"\e69a"}.layui-icon-eye:before{content:"\e695"}.layui-icon-eye-invisible:before{content:"\e696"}.layui-icon-backspace:before{content:"\e694"}.layui-icon-tips-fill:before{content:"\eb2e"}.layui-icon-test:before{content:"\e692"}.layui-icon-clear:before{content:"\e788"}.layui-icon-heart-fill:before{content:"\e68f"}.layui-icon-light:before{content:"\e748"}.layui-icon-music:before{content:"\e690"}.layui-icon-time:before{content:"\e68d"}.layui-icon-ie:before{content:"\e7bb"}.layui-icon-firefox:before{content:"\e686"}.layui-icon-at:before{content:"\e687"}.layui-icon-bluetooth:before{content:"\e689"}.layui-icon-chrome:before{content:"\e68a"}.layui-icon-edge:before{content:"\e68b"}.layui-icon-heart:before{content:"\e68c"}.layui-icon-key:before{content:"\e683"}.layui-icon-android:before{content:"\e684"}.layui-icon-mike:before{content:"\e6dc"}.layui-icon-mute:before{content:"\e685"}.layui-icon-gift:before{content:"\e627"}.layui-icon-windows:before{content:"\e67f"}.layui-icon-ios:before{content:"\e680"}.layui-icon-logout:before{content:"\e682"}.layui-icon-wifi:before{content:"\e7e0"}.layui-icon-rss:before{content:"\e808"}.layui-icon-email:before{content:"\e618"}.layui-icon-reduce-circle:before{content:"\e616"}.layui-icon-transfer:before{content:"\e691"}.layui-icon-service:before{content:"\e626"}.layui-icon-addition:before{content:"\e624"}.layui-icon-subtraction:before{content:"\e67e"}.layui-icon-slider:before{content:"\e714"}.layui-icon-print:before{content:"\e66d"}.layui-icon-export:before{content:"\e67d"}.layui-icon-cols:before{content:"\e610"}.layui-icon-screen-full:before{content:"\e622"}.layui-icon-screen-restore:before{content:"\e758"}.layui-icon-rate-half:before{content:"\e6c9"}.layui-icon-rate-solid:before{content:"\e67a"}.layui-icon-rate:before{content:"\e67b"}.layui-icon-cellphone:before{content:"\e678"}.layui-icon-vercode:before{content:"\e679"}.layui-icon-login-weibo:before{content:"\e675"}.layui-icon-login-qq:before{content:"\e676"}.layui-icon-login-wechat:before{content:"\e677"}.layui-icon-username:before{content:"\e66f"}.layui-icon-password:before{content:"\e673"}.layui-icon-refresh-3:before{content:"\e9aa"}.layui-icon-auz:before{content:"\e672"}.layui-icon-shrink-right:before{content:"\e668"}.layui-icon-spread-left:before{content:"\e66b"}.layui-icon-snowflake:before{content:"\e6b1"}.layui-icon-tips:before{content:"\e702"}.layui-icon-note:before{content:"\e66e"}.layui-icon-senior:before{content:"\e674"}.layui-icon-refresh-1:before{content:"\e666"}.layui-icon-refresh:before{content:"\e669"}.layui-icon-flag:before{content:"\e66c"}.layui-icon-theme:before{content:"\e66a"}.layui-icon-notice:before{content:"\e667"}.layui-icon-console:before{content:"\e665"}.layui-icon-website:before{content:"\e7ae"}.layui-icon-face-surprised:before{content:"\e664"}.layui-icon-set:before{content:"\e716"}.layui-icon-template:before{content:"\e663"}.layui-icon-app:before{content:"\e653"}.layui-icon-template-1:before{content:"\e656"}.layui-icon-home:before{content:"\e68e"}.layui-icon-female:before{content:"\e661"}.layui-icon-male:before{content:"\e662"}.layui-icon-tread:before{content:"\e6c5"}.layui-icon-praise:before{content:"\e6c6"}.layui-icon-rmb:before{content:"\e65e"}.layui-icon-more:before{content:"\e65f"}.layui-icon-camera:before{content:"\e660"}.layui-icon-cart-simple:before{content:"\e698"}.layui-icon-face-cry:before{content:"\e69c"}.layui-icon-face-smile:before{content:"\e6af"}.layui-icon-survey:before{content:"\e6b2"}.layui-icon-read:before{content:"\e705"}.layui-icon-location:before{content:"\e715"}.layui-icon-dollar:before{content:"\e659"}.layui-icon-diamond:before{content:"\e735"}.layui-icon-return:before{content:"\e65c"}.layui-icon-camera-fill:before{content:"\e65d"}.layui-icon-fire:before{content:"\e756"}.layui-icon-more-vertical:before{content:"\e671"}.layui-icon-cart:before{content:"\e657"}.layui-icon-star-fill:before{content:"\e658"}.layui-icon-prev:before{content:"\e65a"}.layui-icon-next:before{content:"\e65b"}.layui-icon-upload:before{content:"\e67c"}.layui-icon-upload-drag:before{content:"\e681"}.layui-icon-user:before{content:"\e770"}.layui-icon-file-b:before{content:"\e655"}.layui-icon-component:before{content:"\e857"}.layui-icon-find-fill:before{content:"\e670"}.layui-icon-loading:before{content:"\e63d"}.layui-icon-loading-1:before{content:"\e63e"}.layui-icon-add-1:before{content:"\e654"}.layui-icon-pause:before{content:"\e651"}.layui-icon-play:before{content:"\e652"}.layui-icon-video:before{content:"\e6ed"}.layui-icon-headset:before{content:"\e6fc"}.layui-icon-voice:before{content:"\e688"}.layui-icon-speaker:before{content:"\e645"}.layui-icon-fonts-del:before{content:"\e64f"}.layui-icon-fonts-html:before{content:"\e64b"}.layui-icon-fonts-code:before{content:"\e64e"}.layui-icon-fonts-strong:before{content:"\e62b"}.layui-icon-unlink:before{content:"\e64d"}.layui-icon-picture:before{content:"\e64a"}.layui-icon-link:before{content:"\e64c"}.layui-icon-face-smile-b:before{content:"\e650"}.layui-icon-align-center:before{content:"\e647"}.layui-icon-align-right:before{content:"\e648"}.layui-icon-align-left:before{content:"\e649"}.layui-icon-fonts-u:before{content:"\e646"}.layui-icon-fonts-i:before{content:"\e644"}.layui-icon-tabs:before{content:"\e62a"}.layui-icon-circle:before{content:"\e63f"}.layui-icon-radio:before{content:"\e643"}.layui-icon-share:before{content:"\e641"}.layui-icon-edit:before{content:"\e642"}.layui-icon-delete:before{content:"\e640"}.layui-icon-engine:before{content:"\e628"}.layui-icon-chart-screen:before{content:"\e629"}.layui-icon-chart:before{content:"\e62c"}.layui-icon-table:before{content:"\e62d"}.layui-icon-tree:before{content:"\e62e"}.layui-icon-upload-circle:before{content:"\e62f"}.layui-icon-templeate-1:before{content:"\e630"}.layui-icon-util:before{content:"\e631"}.layui-icon-layouts:before{content:"\e632"}.layui-icon-prev-circle:before{content:"\e633"}.layui-icon-carousel:before{content:"\e634"}.layui-icon-code-circle:before{content:"\e635"}.layui-icon-water:before{content:"\e636"}.layui-icon-date:before{content:"\e637"}.layui-icon-layer:before{content:"\e638"}.layui-icon-fonts-clear:before{content:"\e639"}.layui-icon-dialogue:before{content:"\e63a"}.layui-icon-cellphone-fine:before{content:"\e63b"}.layui-icon-form:before{content:"\e63c"}.layui-icon-file:before{content:"\e621"}.layui-icon-triangle-r:before{content:"\e623"}.layui-icon-triangle-d:before{content:"\e625"}.layui-icon-set-sm:before{content:"\e620"}.layui-icon-add-circle:before{content:"\e61f"}.layui-icon-layim-download:before{content:"\e61e"}.layui-icon-layim-uploadfile:before{content:"\e61d"}.layui-icon-404:before{content:"\e61c"}.layui-icon-about:before{content:"\e60b"}.layui-icon-layim-theme:before{content:"\e61b"}.layui-icon-down:before{content:"\e61a"}.layui-icon-up:before{content:"\e619"}.layui-icon-circle-dot:before{content:"\e617"}.layui-icon-set-fill:before{content:"\e614"}.layui-icon-search:before{content:"\e615"}.layui-icon-friends:before{content:"\e612"}.layui-icon-group:before{content:"\e613"}.layui-icon-reply-fill:before{content:"\e611"}.layui-icon-menu-fill:before{content:"\e60f"}.layui-icon-face-smile-fine:before{content:"\e60c"}.layui-icon-picture-fine:before{content:"\e60d"}.layui-icon-log:before{content:"\e60e"}.layui-icon-list:before{content:"\e60a"}.layui-icon-release:before{content:"\e609"}.layui-icon-add-circle-fine:before{content:"\e608"}.layui-icon-ok:before{content:"\e605"}.layui-icon-help:before{content:"\e607"}.layui-icon-chat:before{content:"\e606"}.layui-icon-top:before{content:"\e604"}.layui-icon-right:before{content:"\e602"}.layui-icon-left:before{content:"\e603"}.layui-icon-star:before{content:"\e600"}.layui-icon-download-circle:before{content:"\e601"}.layui-icon-close:before{content:"\1006"}.layui-icon-close-fill:before{content:"\1007"}.layui-icon-ok-circle:before{content:"\1005"}.layui-main{position:relative;width:1160px;margin:0 auto}.layui-header{position:relative;z-index:1000;height:60px}.layui-header a:hover{transition:all .5s;-webkit-transition:all .5s}.layui-side{position:fixed;left:0;top:0;bottom:0;z-index:999;width:200px;overflow-x:hidden}.layui-side-scroll{position:relative;width:220px;height:100%;overflow-x:hidden}.layui-body{position:relative;left:200px;right:0;top:0;bottom:0;width:auto;box-sizing:border-box}.layui-layout-body{overflow-x:hidden}.layui-layout-admin .layui-header{position:fixed;top:0;left:0;right:0;background-color:#23292e}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{position:absolute;top:60px;padding-bottom:44px}.layui-layout-admin .layui-main{width:auto;margin:0 15px}.layui-layout-admin .layui-footer{position:fixed;left:200px;right:0;bottom:0;z-index:990;height:44px;line-height:44px;padding:0 15px;box-shadow:-1px 0 4px rgb(0 0 0 / 12%);background-color:#fafafa}.layui-layout-admin .layui-logo{position:absolute;left:0;top:0;width:200px;height:100%;line-height:60px;text-align:center;color:#16baaa;font-size:16px;box-shadow:0 1px 2px 0 rgb(0 0 0 / 15%)}.layui-layout-admin .layui-header .layui-nav{background:0 0}.layui-layout-left{position:absolute!important;left:200px;top:0}.layui-layout-right{position:absolute!important;right:0;top:0}.layui-container{position:relative;margin:0 auto;box-sizing:border-box}.layui-fluid{position:relative;margin:0 auto;padding:0 15px}.layui-row:after,.layui-row:before{content:"";display:block;clear:both}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9,.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9,.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9,.layui-col-xl1,.layui-col-xl10,.layui-col-xl11,.layui-col-xl12,.layui-col-xl2,.layui-col-xl3,.layui-col-xl4,.layui-col-xl5,.layui-col-xl6,.layui-col-xl7,.layui-col-xl8,.layui-col-xl9,.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{position:relative;display:block;box-sizing:border-box}.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{float:left}.layui-col-xs1{width:8.33333333%}.layui-col-xs2{width:16.66666667%}.layui-col-xs3{width:25%}.layui-col-xs4{width:33.33333333%}.layui-col-xs5{width:41.66666667%}.layui-col-xs6{width:50%}.layui-col-xs7{width:58.33333333%}.layui-col-xs8{width:66.66666667%}.layui-col-xs9{width:75%}.layui-col-xs10{width:83.33333333%}.layui-col-xs11{width:91.66666667%}.layui-col-xs12{width:100%}.layui-col-xs-offset1{margin-left:8.33333333%}.layui-col-xs-offset2{margin-left:16.66666667%}.layui-col-xs-offset3{margin-left:25%}.layui-col-xs-offset4{margin-left:33.33333333%}.layui-col-xs-offset5{margin-left:41.66666667%}.layui-col-xs-offset6{margin-left:50%}.layui-col-xs-offset7{margin-left:58.33333333%}.layui-col-xs-offset8{margin-left:66.66666667%}.layui-col-xs-offset9{margin-left:75%}.layui-col-xs-offset10{margin-left:83.33333333%}.layui-col-xs-offset11{margin-left:91.66666667%}.layui-col-xs-offset12{margin-left:100%}@media screen and (max-width:767.98px){.layui-container{padding:0 15px}.layui-hide-xs{display:none!important}.layui-show-xs-block{display:block!important}.layui-show-xs-inline{display:inline!important}.layui-show-xs-inline-block{display:inline-block!important}}@media screen and (min-width:768px){.layui-container{width:720px}.layui-hide-sm{display:none!important}.layui-show-sm-block{display:block!important}.layui-show-sm-inline{display:inline!important}.layui-show-sm-inline-block{display:inline-block!important}.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9{float:left}.layui-col-sm1{width:8.33333333%}.layui-col-sm2{width:16.66666667%}.layui-col-sm3{width:25%}.layui-col-sm4{width:33.33333333%}.layui-col-sm5{width:41.66666667%}.layui-col-sm6{width:50%}.layui-col-sm7{width:58.33333333%}.layui-col-sm8{width:66.66666667%}.layui-col-sm9{width:75%}.layui-col-sm10{width:83.33333333%}.layui-col-sm11{width:91.66666667%}.layui-col-sm12{width:100%}.layui-col-sm-offset1{margin-left:8.33333333%}.layui-col-sm-offset2{margin-left:16.66666667%}.layui-col-sm-offset3{margin-left:25%}.layui-col-sm-offset4{margin-left:33.33333333%}.layui-col-sm-offset5{margin-left:41.66666667%}.layui-col-sm-offset6{margin-left:50%}.layui-col-sm-offset7{margin-left:58.33333333%}.layui-col-sm-offset8{margin-left:66.66666667%}.layui-col-sm-offset9{margin-left:75%}.layui-col-sm-offset10{margin-left:83.33333333%}.layui-col-sm-offset11{margin-left:91.66666667%}.layui-col-sm-offset12{margin-left:100%}}@media screen and (min-width:992px){.layui-container{width:960px}.layui-hide-md{display:none!important}.layui-show-md-block{display:block!important}.layui-show-md-inline{display:inline!important}.layui-show-md-inline-block{display:inline-block!important}.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9{float:left}.layui-col-md1{width:8.33333333%}.layui-col-md2{width:16.66666667%}.layui-col-md3{width:25%}.layui-col-md4{width:33.33333333%}.layui-col-md5{width:41.66666667%}.layui-col-md6{width:50%}.layui-col-md7{width:58.33333333%}.layui-col-md8{width:66.66666667%}.layui-col-md9{width:75%}.layui-col-md10{width:83.33333333%}.layui-col-md11{width:91.66666667%}.layui-col-md12{width:100%}.layui-col-md-offset1{margin-left:8.33333333%}.layui-col-md-offset2{margin-left:16.66666667%}.layui-col-md-offset3{margin-left:25%}.layui-col-md-offset4{margin-left:33.33333333%}.layui-col-md-offset5{margin-left:41.66666667%}.layui-col-md-offset6{margin-left:50%}.layui-col-md-offset7{margin-left:58.33333333%}.layui-col-md-offset8{margin-left:66.66666667%}.layui-col-md-offset9{margin-left:75%}.layui-col-md-offset10{margin-left:83.33333333%}.layui-col-md-offset11{margin-left:91.66666667%}.layui-col-md-offset12{margin-left:100%}}@media screen and (min-width:1200px){.layui-container{width:1150px}.layui-hide-lg{display:none!important}.layui-show-lg-block{display:block!important}.layui-show-lg-inline{display:inline!important}.layui-show-lg-inline-block{display:inline-block!important}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9{float:left}.layui-col-lg1{width:8.33333333%}.layui-col-lg2{width:16.66666667%}.layui-col-lg3{width:25%}.layui-col-lg4{width:33.33333333%}.layui-col-lg5{width:41.66666667%}.layui-col-lg6{width:50%}.layui-col-lg7{width:58.33333333%}.layui-col-lg8{width:66.66666667%}.layui-col-lg9{width:75%}.layui-col-lg10{width:83.33333333%}.layui-col-lg11{width:91.66666667%}.layui-col-lg12{width:100%}.layui-col-lg-offset1{margin-left:8.33333333%}.layui-col-lg-offset2{margin-left:16.66666667%}.layui-col-lg-offset3{margin-left:25%}.layui-col-lg-offset4{margin-left:33.33333333%}.layui-col-lg-offset5{margin-left:41.66666667%}.layui-col-lg-offset6{margin-left:50%}.layui-col-lg-offset7{margin-left:58.33333333%}.layui-col-lg-offset8{margin-left:66.66666667%}.layui-col-lg-offset9{margin-left:75%}.layui-col-lg-offset10{margin-left:83.33333333%}.layui-col-lg-offset11{margin-left:91.66666667%}.layui-col-lg-offset12{margin-left:100%}}@media screen and (min-width:1400px){.layui-container{width:1330px}.layui-hide-xl{display:none!important}.layui-show-xl-block{display:block!important}.layui-show-xl-inline{display:inline!important}.layui-show-xl-inline-block{display:inline-block!important}.layui-col-xl1,.layui-col-xl10,.layui-col-xl11,.layui-col-xl12,.layui-col-xl2,.layui-col-xl3,.layui-col-xl4,.layui-col-xl5,.layui-col-xl6,.layui-col-xl7,.layui-col-xl8,.layui-col-xl9{float:left}.layui-col-xl1{width:8.33333333%}.layui-col-xl2{width:16.66666667%}.layui-col-xl3{width:25%}.layui-col-xl4{width:33.33333333%}.layui-col-xl5{width:41.66666667%}.layui-col-xl6{width:50%}.layui-col-xl7{width:58.33333333%}.layui-col-xl8{width:66.66666667%}.layui-col-xl9{width:75%}.layui-col-xl10{width:83.33333333%}.layui-col-xl11{width:91.66666667%}.layui-col-xl12{width:100%}.layui-col-xl-offset1{margin-left:8.33333333%}.layui-col-xl-offset2{margin-left:16.66666667%}.layui-col-xl-offset3{margin-left:25%}.layui-col-xl-offset4{margin-left:33.33333333%}.layui-col-xl-offset5{margin-left:41.66666667%}.layui-col-xl-offset6{margin-left:50%}.layui-col-xl-offset7{margin-left:58.33333333%}.layui-col-xl-offset8{margin-left:66.66666667%}.layui-col-xl-offset9{margin-left:75%}.layui-col-xl-offset10{margin-left:83.33333333%}.layui-col-xl-offset11{margin-left:91.66666667%}.layui-col-xl-offset12{margin-left:100%}}.layui-col-space1{margin:-.5px}.layui-col-space1>*{padding:.5px}.layui-col-space2{margin:-1px}.layui-col-space2>*{padding:1px}.layui-col-space4{margin:-2px}.layui-col-space4>*{padding:2px}.layui-col-space5{margin:-2.5px}.layui-col-space5>*{padding:2.5px}.layui-col-space6{margin:-3px}.layui-col-space6>*{padding:3px}.layui-col-space8{margin:-4px}.layui-col-space8>*{padding:4px}.layui-col-space10{margin:-5px}.layui-col-space10>*{padding:5px}.layui-col-space12{margin:-6px}.layui-col-space12>*{padding:6px}.layui-col-space14{margin:-7px}.layui-col-space14>*{padding:7px}.layui-col-space15{margin:-7.5px}.layui-col-space15>*{padding:7.5px}.layui-col-space16{margin:-8px}.layui-col-space16>*{padding:8px}.layui-col-space18{margin:-9px}.layui-col-space18>*{padding:9px}.layui-col-space20{margin:-10px}.layui-col-space20>*{padding:10px}.layui-col-space22{margin:-11px}.layui-col-space22>*{padding:11px}.layui-col-space24{margin:-12px}.layui-col-space24>*{padding:12px}.layui-col-space25{margin:-12.5px}.layui-col-space25>*{padding:12.5px}.layui-col-space26{margin:-13px}.layui-col-space26>*{padding:13px}.layui-col-space28{margin:-14px}.layui-col-space28>*{padding:14px}.layui-col-space30{margin:-15px}.layui-col-space30>*{padding:15px}.layui-col-space32{margin:-16px}.layui-col-space32>*{padding:16px}.layui-padding-1{padding:4px!important}.layui-padding-2{padding:8px!important}.layui-padding-3{padding:16px!important}.layui-padding-4{padding:32px!important}.layui-padding-5{padding:48px!important}.layui-margin-1{margin:4px!important}.layui-margin-2{margin:8px!important}.layui-margin-3{margin:16px!important}.layui-margin-4{margin:32px!important}.layui-margin-5{margin:48px!important}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;appearance:none;-webkit-appearance:none;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:1.8;border-left:5px solid #16b777;border-radius:0 2px 2px 0;background-color:#fafafa}.layui-quote-nm{border-style:solid;border-width:1px;border-left-width:5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border-width:1px;border-style:solid}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px}.layui-field-title{margin:16px 0;border-width:0;border-top-width:1px}.layui-field-box{padding:15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#eee}.layui-progress-bar{position:absolute;left:0;top:0;width:0;max-width:100%;height:6px;border-radius:20px;text-align:right;background-color:#16b777;transition:all .3s;-webkit-transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px}.layui-progress-text{position:relative;top:-20px;line-height:18px;font-size:12px;color:#5f5f5f}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border-width:1px;border-style:solid;border-radius:2px}.layui-colla-content,.layui-colla-item{border-top-width:1px;border-top-style:solid}.layui-colla-item:first-child{border-top:none}.layui-colla-title{position:relative;height:42px;line-height:42px;padding:0 15px 0 35px;color:#333;background-color:#fafafa;cursor:pointer;font-size:14px;overflow:hidden}.layui-colla-content{display:none;padding:10px 15px;line-height:1.6;color:#5f5f5f}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-card{margin-bottom:15px;border-radius:2px;background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layui-card:last-child{margin-bottom:0}.layui-card-body,.layui-card-header{position:relative;padding:10px 15px}.layui-card-header{border-bottom:1px solid #f8f8f8;color:#333;border-radius:2px 2px 0 0;font-size:14px}.layui-card-body .layui-table{margin:5px 0}.layui-card .layui-tab{margin:0}.layui-panel{position:relative;border-width:1px;border-style:solid;border-radius:2px;box-shadow:1px 1px 4px rgb(0 0 0 / 8%);background-color:#fff;color:#5f5f5f}.layui-panel-window{position:relative;padding:15px;border-radius:0;border-top:5px solid #eee;background-color:#fff}.layui-auxiliar-moving{position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;background:0 0;z-index:9999999999;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.layui-scrollbar-hide{overflow:hidden!important}.layui-bg-red{background-color:#ff5722!important;color:#fff!important}.layui-bg-orange{background-color:#ffb800!important;color:#fff!important}.layui-bg-green{background-color:#16baaa!important;color:#fff!important}.layui-bg-cyan{background-color:#2f4056!important;color:#fff!important}.layui-bg-blue{background-color:#1e9fff!important;color:#fff!important}.layui-bg-purple{background-color:#a233c6!important;color:#fff!important}.layui-bg-black{background-color:#2f363c!important;color:#fff!important}.layui-bg-gray{background-color:#fafafa!important;color:#5f5f5f!important}.layui-badge-rim,.layui-border,.layui-colla-content,.layui-colla-item,.layui-collapse,.layui-elem-field,.layui-form-pane .layui-form-item[pane],.layui-form-pane .layui-form-label,.layui-input,.layui-input-split,.layui-panel,.layui-quote-nm,.layui-select,.layui-tab-bar,.layui-tab-card,.layui-tab-title,.layui-tab-title .layui-this:after,.layui-textarea{border-color:#eee}.layui-border{border-width:1px;border-style:solid;color:#5f5f5f!important}.layui-border-red{border-width:1px;border-style:solid;border-color:#ff5722!important;color:#ff5722!important}.layui-border-orange{border-width:1px;border-style:solid;border-color:#ffb800!important;color:#ffb800!important}.layui-border-green{border-width:1px;border-style:solid;border-color:#16baaa!important;color:#16baaa!important}.layui-border-cyan{border-width:1px;border-style:solid;border-color:#2f4056!important;color:#2f4056!important}.layui-border-blue{border-width:1px;border-style:solid;border-color:#1e9fff!important;color:#1e9fff!important}.layui-border-purple{border-width:1px;border-style:solid;border-color:#a233c6!important;color:#a233c6!important}.layui-border-black{border-width:1px;border-style:solid;border-color:#2f363c!important;color:#2f363c!important}hr.layui-border-black,hr.layui-border-blue,hr.layui-border-cyan,hr.layui-border-green,hr.layui-border-orange,hr.layui-border-purple,hr.layui-border-red{border-width:0 0 1px}.layui-timeline-item:before{background-color:#eee}.layui-text{line-height:1.8;font-size:14px}.layui-text h1{margin:32px 0;font-size:32px}.layui-text h2{margin:24px 0;font-size:24px}.layui-text h3{margin:16px 0;font-size:18px}.layui-text h4{margin:11px 0;font-size:16px}.layui-text h5{margin:11px 0;font-size:14px}.layui-text h6{margin:11px 0;font-size:13px}.layui-text p{margin:15px 0}.layui-text p:first-child{margin-top:0}.layui-text p:last-child{margin-bottom:0}.layui-text hr{margin:15px 0}.layui-text ol,.layui-text ul{padding-left:15px}.layui-text ul li{margin-top:5px;list-style-type:disc}.layui-text ol li{margin-top:5px;list-style-type:decimal}.layui-text ol ul>li,.layui-text ul ul>li{list-style-type:disc}.layui-text ol li>p:first-child,.layui-text ul li>p:first-child{margin-top:0;margin-bottom:0}.layui-text :where(a:not(.layui-btn)){color:#01aaed}.layui-text :where(a:not(.layui-btn):hover){text-decoration:underline}.layui-text blockquote:not(.layui-elem-quote){margin:15px 0;padding:5px 15px;border-left:5px solid #eee}.layui-text pre>code:not(.layui-code){display:block;padding:15px;font-family:"Courier New",Consolas,"Lucida Console",monospace}.layui-text-em,.layui-word-aux{color:#999!important;padding-left:5px!important;padding-right:5px!important}.layui-font-12{font-size:12px!important}.layui-font-13{font-size:13px!important}.layui-font-14{font-size:14px!important}.layui-font-16{font-size:16px!important}.layui-font-18{font-size:18px!important}.layui-font-20{font-size:20px!important}.layui-font-22{font-size:22px!important}.layui-font-24{font-size:24px!important}.layui-font-26{font-size:26px!important}.layui-font-28{font-size:28px!important}.layui-font-30{font-size:30px!important}.layui-font-32{font-size:32px!important}.layui-font-red{color:#ff5722!important}.layui-font-orange{color:#ffb800!important}.layui-font-green{color:#16baaa!important}.layui-font-cyan{color:#2f4056!important}.layui-font-blue{color:#01aaed!important}.layui-font-purple{color:#a233c6!important}.layui-font-black{color:#000!important}.layui-font-gray{color:#c2c2c2!important}.layui-btn{display:inline-block;vertical-align:middle;height:38px;line-height:38px;border:1px solid transparent;padding:0 18px;background-color:#16baaa;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border-radius:2px;cursor:pointer;user-select:none}.layui-btn:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}.layui-btn:active{opacity:1;filter:alpha(opacity=100)}.layui-btn+.layui-btn{margin-left:10px}.layui-btn-container{word-spacing:-5px}.layui-btn-container .layui-btn{margin-right:10px;margin-bottom:10px;word-spacing:normal}.layui-btn-container .layui-btn+.layui-btn{margin-left:0}.layui-table .layui-btn-container .layui-btn{margin-bottom:9px}.layui-btn-radius{border-radius:100px}.layui-btn .layui-icon{padding:0 2px;vertical-align:middle\0;vertical-align:bottom}.layui-btn-primary{border-color:#d2d2d2;background:0 0;color:#5f5f5f}.layui-btn-primary:hover{border-color:#16baaa;color:#333}.layui-btn-normal{background-color:#1e9fff}.layui-btn-warm{background-color:#ffb800}.layui-btn-danger{background-color:#ff5722}.layui-btn-checked{background-color:#16b777}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border-color:#eee!important;background-color:#fbfbfb!important;color:#d2d2d2!important;cursor:not-allowed!important;opacity:1}.layui-btn-lg{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-sm{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-xs{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-xs i{font-size:12px!important}.layui-btn-group{display:inline-block;vertical-align:middle;font-size:0}.layui-btn-group .layui-btn{margin-left:0!important;margin-right:0!important;border-left:1px solid rgba(255,255,255,.5);border-radius:0}.layui-btn-group .layui-btn-primary{border-left:none}.layui-btn-group .layui-btn-primary:hover{border-color:#d2d2d2;color:#16baaa}.layui-btn-group .layui-btn:first-child{border-left:none;border-radius:2px 0 0 2px}.layui-btn-group .layui-btn-primary:first-child{border-left:1px solid #d2d2d2}.layui-btn-group .layui-btn:last-child{border-radius:0 2px 2px 0}.layui-btn-group .layui-btn+.layui-btn{margin-left:0}.layui-btn-group+.layui-btn-group{margin-left:10px}.layui-btn-fluid{width:100%}.layui-input,.layui-select,.layui-textarea{height:38px;line-height:1.3;line-height:38px\9;border-width:1px;border-style:solid;background-color:#fff;color:rgba(0,0,0,.85);border-radius:2px}.layui-input::-webkit-input-placeholder,.layui-select::-webkit-input-placeholder,.layui-textarea::-webkit-input-placeholder{line-height:1.3}.layui-input,.layui-textarea{display:block;width:100%;padding-left:10px}.layui-input:hover,.layui-textarea:hover{border-color:#d2d2d2!important}.layui-input:focus,.layui-textarea:focus{border-color:#16b777!important;box-shadow:0 0 0 3px rgba(22,183,119,.08)}.layui-textarea{position:relative;min-height:100px;height:auto;line-height:20px;padding:6px 10px;resize:vertical}.layui-input[disabled],.layui-textarea[disabled]{background-color:#fafafa}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form [lay-ignore]{display:initial}.layui-form-item{position:relative;margin-bottom:15px;clear:both}.layui-form-item:after{content:'\20';clear:both;display:block;height:0}.layui-form-label{position:relative;float:left;display:block;padding:9px 15px;width:80px;font-weight:400;line-height:20px;text-align:right}.layui-form-label-col{display:block;float:none;padding:9px 0;line-height:20px;text-align:left}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block,.layui-input-inline{position:relative}.layui-input-block{margin-left:110px;min-height:36px}.layui-input-inline{display:inline-block;vertical-align:middle}.layui-form-item .layui-input-inline{float:left;width:190px;margin-right:10px}.layui-form-text .layui-input-inline{width:auto}.layui-form-mid{position:relative;float:left;display:block;padding:9px 0!important;line-height:20px;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border-color:#ff5722!important;box-shadow:0 0 0 3px rgba(255,87,34,.08)}.layui-input-prefix,.layui-input-split,.layui-input-suffix,.layui-input-suffix .layui-input-affix{position:absolute;right:0;top:0;padding:0 10px;width:35px;height:100%;text-align:center;transition:all .3s;box-sizing:border-box}.layui-input-prefix{left:0;border-radius:2px 0 0 2px}.layui-input-suffix{right:0;border-radius:0 2px 2px 0}.layui-input-split{border-width:1px;border-style:solid}.layui-input-prefix .layui-icon,.layui-input-split .layui-icon,.layui-input-suffix .layui-icon{position:relative;font-size:16px;color:#5f5f5f;transition:all .3s}.layui-input-group{position:relative;display:table;box-sizing:border-box}.layui-input-group>*{display:table-cell;vertical-align:middle;position:relative}.layui-input-group .layui-input{padding-right:15px}.layui-input-group>.layui-input-prefix{width:auto;border-right:0}.layui-input-group>.layui-input-suffix{width:auto;border-left:0}.layui-input-group .layui-input-split{white-space:nowrap}.layui-input-wrap{position:relative;line-height:38px}.layui-input-wrap .layui-input{padding-right:35px}.layui-input-wrap .layui-input::-ms-clear,.layui-input-wrap .layui-input::-ms-reveal{display:none}.layui-input-wrap .layui-input-prefix+.layui-input,.layui-input-wrap .layui-input-prefix~* .layui-input{padding-left:35px}.layui-input-wrap .layui-input-split+.layui-input,.layui-input-wrap .layui-input-split~* .layui-input{padding-left:45px}.layui-input-wrap .layui-input-prefix~.layui-form-select{position:static}.layui-input-wrap .layui-input-prefix,.layui-input-wrap .layui-input-split,.layui-input-wrap .layui-input-suffix{pointer-events:none}.layui-input-wrap .layui-input:hover+.layui-input-split{border-color:#d2d2d2}.layui-input-wrap .layui-input:focus+.layui-input-split{border-color:#16b777}.layui-input-wrap .layui-input.layui-form-danger:focus+.layui-input-split{border-color:#ff5722}.layui-input-wrap .layui-input-prefix.layui-input-split{border-width:0;border-right-width:1px}.layui-input-wrap .layui-input-suffix.layui-input-split{border-width:0;border-left-width:1px}.layui-input-affix{line-height:38px}.layui-input-suffix .layui-input-affix{right:auto;left:-35px}.layui-input-affix .layui-icon{color:rgba(0,0,0,.8);pointer-events:auto!important;cursor:pointer}.layui-input-affix .layui-icon-clear{color:rgba(0,0,0,.3)}.layui-input-affix .layui-icon:hover{color:rgba(0,0,0,.6)}.layui-input-wrap .layui-input-number{width:24px;padding:0}.layui-input-wrap .layui-input-number .layui-icon{position:absolute;right:0;width:100%;height:50%;line-height:normal;font-size:12px}.layui-input-wrap .layui-input-number .layui-icon:before{position:absolute;left:50%;top:50%;margin-top:-6px;margin-left:-6px}.layui-input-wrap .layui-input-number .layui-icon-up{top:0;border-bottom:1px solid #eee}.layui-input-wrap .layui-input-number .layui-icon-down{bottom:0}.layui-input-wrap .layui-input-number .layui-icon:hover{font-weight:700}.layui-input-wrap .layui-input[type=number]::-webkit-inner-spin-button,.layui-input-wrap .layui-input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none!important}.layui-input-wrap .layui-input[type=number]{-moz-appearance:textfield;-webkit-appearance:textfield;appearance:textfield}.layui-input-wrap .layui-input.layui-input-number-invalid,.layui-input-wrap .layui-input.layui-input-number-out-of-range{color:#ff5722}.layui-form-select{position:relative;color:#5f5f5f}.layui-form-select .layui-input{padding-right:30px;cursor:pointer}.layui-form-select .layui-edge{position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#c2c2c2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.layui-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #eee;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:1px 1px 4px rgb(0 0 0 / 8%);box-sizing:border-box}.layui-form-select dl dd,.layui-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layui-form-select dl dt{font-size:12px;color:#999}.layui-form-select dl dd{cursor:pointer}.layui-form-select dl dd:hover{background-color:#f8f8f8;-webkit-transition:.5s all;transition:.5s all}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-select-tips{padding-left:10px!important;color:#999}.layui-form-select dl dd.layui-this{background-color:#f8f8f8;color:#16b777;font-weight:700}.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.layui-form-selected .layui-edge{margin-top:-3px\0}:root .layui-form-selected .layui-edge{margin-top:-9px\0/IE9}.layui-form-selectup dl{top:auto;bottom:42px}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-panel-wrap{position:absolute;z-index:99999999}.layui-select-panel-wrap dl{position:relative;display:block;top:0}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;display:inline-block;vertical-align:middle;height:30px;line-height:30px;margin-right:10px;padding-right:30px;background-color:#fff;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.layui-form-checkbox>*{display:inline-block;vertical-align:middle}.layui-form-checkbox>div{padding:0 11px;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.layui-form-checkbox>div>.layui-icon{line-height:normal}.layui-form-checkbox:hover>div{background-color:#c2c2c2}.layui-form-checkbox>i{position:absolute;right:0;top:0;width:30px;height:100%;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;color:rgba(255,255,255,0);font-size:20px;text-align:center;box-sizing:border-box}.layui-form-checkbox:hover>i{border-color:#c2c2c2;color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#16b777}.layui-form-checked:hover>div,.layui-form-checked>div{background-color:#16b777}.layui-form-checked:hover>i,.layui-form-checked>i{color:#16b777}.layui-form-item .layui-form-checkbox{margin-top:4px}.layui-form-checkbox.layui-checkbox-disabled>div{background-color:#eee!important}.layui-form [lay-checkbox]{display:none}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;min-width:18px;min-height:18px;border:none!important;margin-right:0;padding-left:24px;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary]>div{margin-top:-1px;padding-left:0;padding-right:15px;line-height:18px;background:0 0;color:#5f5f5f}.layui-form-checkbox[lay-skin=primary]>i{right:auto;left:0;width:16px;height:16px;line-height:14px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover>i{border-color:#16b777;color:#fff}.layui-form-checked[lay-skin=primary]>i{border-color:#16b777!important;background-color:#16b777;color:#fff}.layui-checkbox-disabled[lay-skin=primary]>div{background:0 0!important}.layui-form-checked.layui-checkbox-disabled[lay-skin=primary]>i{background:#eee!important;border-color:#eee!important}.layui-checkbox-disabled[lay-skin=primary]:hover>i{border-color:#d2d2d2}.layui-form-item .layui-form-checkbox[lay-skin=primary]{margin-top:10px}.layui-form-checkbox[lay-skin=primary]>.layui-icon-indeterminate{border-color:#16b777}.layui-form-checkbox[lay-skin=primary]>.layui-icon-indeterminate:before{content:'';display:inline-block;vertical-align:middle;position:relative;width:50%;height:1px;margin:-1px auto 0;background-color:#16b777}.layui-form-switch{position:relative;display:inline-block;vertical-align:middle;height:24px;line-height:22px;min-width:44px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;box-sizing:border-box;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch>i{position:absolute;left:5px;top:3px;width:16px;height:16px;border-radius:20px;background-color:#d2d2d2;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch>div{position:relative;top:0;margin-left:21px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#16b777;background-color:#16b777}.layui-form-onswitch>i{left:100%;margin-left:-21px;background-color:#fff}.layui-form-onswitch>div{margin-left:0;margin-right:21px;color:#fff!important}.layui-form-checkbox[lay-skin=none] *,.layui-form-radio[lay-skin=none] *{box-sizing:border-box}.layui-form-checkbox[lay-skin=none],.layui-form-radio[lay-skin=none]{position:relative;min-height:20px;margin:0;padding:0;height:auto;line-height:normal}.layui-form-checkbox[lay-skin=none]>div,.layui-form-radio[lay-skin=none]>div{position:relative;top:0;left:0;cursor:pointer;z-index:10;color:inherit;background-color:inherit}.layui-form-checkbox[lay-skin=none]>i,.layui-form-radio[lay-skin=none]>i{display:none}.layui-form-checkbox[lay-skin=none].layui-checkbox-disabled>div,.layui-form-radio[lay-skin=none].layui-radio-disabled>div{cursor:not-allowed}.layui-checkbox-disabled{border-color:#eee!important}.layui-checkbox-disabled>div{color:#c2c2c2!important}.layui-checkbox-disabled>i{border-color:#eee!important}.layui-checkbox-disabled:hover>i{color:#fff!important}.layui-form-checkbox[lay-skin=tag].layui-form-checked.layui-checkbox-disabled>i{color:#c2c2c2}.layui-form-checkbox[lay-skin=tag].layui-form-checked.layui-checkbox-disabled:hover>i{color:#c2c2c2!important}.layui-form-radio{display:inline-block;vertical-align:middle;line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio>*{display:inline-block;vertical-align:middle;font-size:14px}.layui-form-radio>i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio:hover>*,.layui-form-radioed,.layui-form-radioed>i{color:#16b777}.layui-radio-disabled>i{color:#eee!important}.layui-radio-disabled>*{color:#c2c2c2!important}.layui-form [lay-radio]{display:none}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border-width:1px;border-style:solid;border-radius:2px 0 0 2px;text-align:center;background-color:#fafafa;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;box-sizing:border-box}.layui-form-pane .layui-input-inline{margin-left:-1px}.layui-form-pane .layui-input-block{margin-left:110px;left:-1px}.layui-form-pane .layui-input{border-radius:0 2px 2px 0}.layui-form-pane .layui-form-text .layui-form-label{float:none;width:100%;border-radius:2px;box-sizing:border-box;text-align:left}.layui-form-pane .layui-form-text .layui-input-inline{display:block;margin:0;top:-1px;clear:both}.layui-form-pane .layui-form-text .layui-input-block{margin:0;left:0;top:-1px}.layui-form-pane .layui-form-text .layui-textarea{min-height:100px;border-radius:0 0 2px 2px}.layui-form-pane .layui-form-checkbox{margin:4px 0 4px 10px}.layui-form-pane .layui-form-radio,.layui-form-pane .layui-form-switch{margin-top:6px;margin-left:10px}.layui-form-pane .layui-form-item[pane]{position:relative;border-width:1px;border-style:solid}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0;border-right-width:1px}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}@media screen and (max-width:450px){.layui-form-item .layui-form-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-form-item .layui-inline{display:block;margin-right:0;margin-bottom:20px;clear:both}.layui-form-item .layui-inline:after{content:'\20';clear:both;display:block;height:0}.layui-form-item .layui-input-inline{display:block;float:none;left:-3px;width:auto!important;margin:0 0 10px 112px}.layui-form-item .layui-input-inline+.layui-form-mid{margin-left:110px;top:-5px;padding:0}.layui-form-item .layui-form-checkbox{margin-right:5px;margin-bottom:5px}}.layui-laypage{display:inline-block;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>a:first-child,.layui-laypage>a:first-child em{border-radius:2px 0 0 2px}.layui-laypage>a:last-child,.layui-laypage>a:last-child em{border-radius:0 2px 2px 0}.layui-laypage>:first-child{margin-left:0!important}.layui-laypage>:last-child{margin-right:0!important}.layui-laypage a,.layui-laypage button,.layui-laypage input,.layui-laypage select,.layui-laypage span{border:1px solid #eee}.layui-laypage a,.layui-laypage span{display:inline-block;vertical-align:middle;padding:0 15px;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-laypage a[data-page]{color:#333}.layui-laypage a{text-decoration:none!important;cursor:pointer}.layui-laypage a:hover{color:#16baaa}.layui-laypage em{font-style:normal}.layui-laypage .layui-laypage-spr{color:#999;font-weight:700}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#16baaa}.layui-laypage-em{border-radius:2px}.layui-laypage-next em,.layui-laypage-prev em{font-family:Sim sun;font-size:16px}.layui-laypage .layui-laypage-count,.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh,.layui-laypage .layui-laypage-skip{margin-left:10px;margin-right:10px;padding:0;border:none}.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh{vertical-align:top}.layui-laypage .layui-laypage-refresh i{font-size:18px;cursor:pointer}.layui-laypage select{height:22px;padding:3px;border-radius:2px;cursor:pointer}.layui-laypage .layui-laypage-skip{height:30px;line-height:30px;color:#999}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box}.layui-laypage input{display:inline-block;width:40px;margin:0 10px;padding:0 3px;text-align:center}.layui-laypage input:focus,.layui-laypage select:focus{border-color:#16baaa!important}.layui-laypage button{margin-left:10px;padding:0 10px;cursor:pointer}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px;clear:both}.layui-flow-more a{height:32px;line-height:32px}.layui-flow-more a *{display:inline-block;vertical-align:top}.layui-flow-more a cite{padding:0 20px;border-radius:3px;background-color:#eee;color:#333;font-style:normal}.layui-flow-more a cite:hover{opacity:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-table{width:100%;margin:10px 0;background-color:#fff;color:#5f5f5f}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table th{text-align:left;font-weight:600}.layui-table-mend{background-color:#fff}.layui-table-click,.layui-table-hover,.layui-table[lay-even] tbody tr:nth-child(even){background-color:#f8f8f8}.layui-table-checked{background-color:#dbfbf0}.layui-table-checked.layui-table-click,.layui-table-checked.layui-table-hover{background-color:#abf8dd}.layui-table-disabled-transition *,.layui-table-disabled-transition :after,.layui-table-disabled-transition :before{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}.layui-table td,.layui-table th,.layui-table-col-set,.layui-table-fixed-r,.layui-table-grid-down,.layui-table-header,.layui-table-mend,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-total,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-width:1px;border-style:solid;border-color:#eee}.layui-table td,.layui-table th{position:relative;padding:9px 15px;min-height:20px;line-height:20px;font-size:14px}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border-width:0;border-bottom-width:1px}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border-width:0;border-right-width:1px}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-table img{max-width:100px}.layui-table[lay-size=lg] td,.layui-table[lay-size=lg] th{padding-top:15px;padding-right:30px;padding-bottom:15px;padding-left:30px}.layui-table-view .layui-table[lay-size=lg] .layui-table-cell{height:50px;line-height:40px}.layui-table[lay-size=sm] td,.layui-table[lay-size=sm] th{padding-top:5px;padding-right:10px;padding-bottom:5px;padding-left:10px;font-size:12px}.layui-table-view .layui-table[lay-size=sm] .layui-table-cell{height:30px;line-height:20px;padding-top:5px;padding-left:11px;padding-right:11px}.layui-table[lay-data],.layui-table[lay-options]{display:none}.layui-table-box{position:relative;overflow:hidden}.layui-table-view{clear:both;position:relative;border-right:none}.layui-table-view:after{content:"";position:absolute;top:0;right:0;width:1px;height:100%;background-color:#eee;z-index:101}.layui-table-view .layui-table{position:relative;width:auto;margin:0;border:0;border-collapse:separate}.layui-table-view .layui-table[lay-skin=line]{border-width:0;border-right-width:1px}.layui-table-view .layui-table[lay-skin=row]{border-width:0;border-bottom-width:1px}.layui-table-view .layui-table td,.layui-table-view .layui-table th{padding:0;border-top:none;border-left:none}.layui-table-view .layui-table th [lay-event],.layui-table-view .layui-table th.layui-unselect .layui-table-cell span{cursor:pointer}.layui-table-view .layui-table td,.layui-table-view .layui-table th span{cursor:default}.layui-table-view .layui-table td[data-edit]{cursor:text}.layui-table-view .layui-table td[data-edit]:hover:after{position:absolute;left:0;top:0;width:100%;height:100%;box-sizing:border-box;border:1px solid #16b777;pointer-events:none;content:""}.layui-table-view .layui-form-checkbox[lay-skin=primary] i{width:18px;height:18px;line-height:16px}.layui-table-view .layui-form-radio{line-height:0;padding:0}.layui-table-view .layui-form-radio>i{margin:0;font-size:20px}.layui-table-init{position:absolute;left:0;top:0;right:0;bottom:0;margin:0;z-index:199;transition:opacity .1s;user-select:none}.layui-table-loading-icon{position:absolute;width:100%\0;left:50%;left:auto\0;top:50%;margin-top:-15px\0;transform:translate(-50%,-50%);transform:none\0;text-align:center}.layui-table-loading-icon .layui-icon{font-size:30px;color:#c2c2c2}.layui-table-header{border-width:0;border-bottom-width:1px;overflow:hidden}.layui-table-header .layui-table{margin-bottom:-1px}.layui-table-column{position:relative;width:100%;min-height:41px;padding:8px 16px;border-width:0;border-bottom-width:1px}.layui-table-column .layui-btn-container{margin-bottom:-8px}.layui-table-column .layui-btn-container .layui-btn{margin-right:8px;margin-bottom:8px}.layui-table-tool .layui-inline[lay-event]{position:relative;width:26px;height:26px;padding:5px;line-height:16px;margin-right:10px;text-align:center;color:#333;border:1px solid #ccc;cursor:pointer;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool .layui-inline[lay-event]:hover{border:1px solid #999}.layui-table-tool-temp{padding-right:120px}.layui-table-tool-self{position:absolute;right:17px;top:10px}.layui-table-tool .layui-table-tool-self .layui-inline[lay-event]{margin:0 0 0 10px}.layui-table-tool-panel{position:absolute;top:29px;left:-1px;z-index:399;padding:5px 0!important;min-width:150px;min-height:40px;border:1px solid #d2d2d2;text-align:left;overflow-y:auto;background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-table-tool-panel li{padding:0 10px;margin:0!important;line-height:30px;list-style-type:none!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{width:100%}.layui-table-tool-panel li:hover{background-color:#f8f8f8}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{padding-left:28px}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] i{position:absolute;left:0;top:0}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] span{padding:0}.layui-table-tool .layui-table-tool-self .layui-table-tool-panel{left:auto;right:-1px}.layui-table-col-set{position:absolute;right:0;top:0;width:20px;height:100%;border-width:0;border-left-width:1px;background-color:#fff}.layui-table-sort{width:10px;height:20px;margin-left:5px;cursor:pointer!important}.layui-table-sort .layui-edge{position:absolute;left:5px;border-width:5px}.layui-table-sort .layui-table-sort-asc{top:3px;border-top:none;border-bottom-style:solid;border-bottom-color:#b2b2b2}.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color:#5f5f5f}.layui-table-sort .layui-table-sort-desc{bottom:5px;border-bottom:none;border-top-style:solid;border-top-color:#b2b2b2}.layui-table-sort .layui-table-sort-desc:hover{border-top-color:#5f5f5f}.layui-table-sort[lay-sort=asc] .layui-table-sort-asc{border-bottom-color:#000}.layui-table-sort[lay-sort=desc] .layui-table-sort-desc{border-top-color:#000}.layui-table-cell{height:38px;line-height:28px;padding:6px 15px;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;box-sizing:border-box}.layui-table-cell .layui-form-checkbox[lay-skin=primary]{top:-1px;padding:0}.layui-table-cell .layui-form-checkbox[lay-skin=primary]>div{padding-left:24px}.layui-table-cell .layui-table-link{color:#01aaed}.layui-table-cell .layui-btn{vertical-align:inherit}.layui-table-cell[align=center]{-webkit-box-pack:center}.layui-table-cell[align=right]{-webkit-box-pack:end}.laytable-cell-checkbox,.laytable-cell-numbers,.laytable-cell-radio,.laytable-cell-space{text-align:center;-webkit-box-pack:center}.layui-table-body{position:relative;overflow:auto;margin-bottom:-1px}.layui-table-body .layui-none{line-height:26px;padding:30px 15px;text-align:center;color:#999}.layui-table-fixed{position:absolute;left:0;top:0;z-index:101}.layui-table-fixed .layui-table-body{overflow:hidden}.layui-table-fixed-l{box-shadow:1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r{left:auto;right:0;border-width:0;border-left-width:1px;box-shadow:-1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r .layui-table-header{position:relative;overflow:visible}.layui-table-mend{position:absolute;right:-49px;top:0;height:100%;width:50px;border-width:0;border-left-width:1px}.layui-table-tool{position:relative;width:100%;min-height:50px;line-height:30px;padding:10px 15px;border-width:0;border-bottom-width:1px}.layui-table-tool .layui-btn-container{margin-bottom:-10px}.layui-table-total{margin-bottom:-1px;border-width:0;border-top-width:1px;overflow:hidden}.layui-table-page{border-width:0;border-top-width:1px;margin-bottom:-1px;white-space:nowrap;overflow:hidden}.layui-table-page>div{height:26px}.layui-table-page .layui-laypage{margin:0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span{height:26px;line-height:26px;margin-bottom:10px;border:none;background:0 0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span.layui-laypage-curr{padding:0 12px}.layui-table-page .layui-laypage span{margin-left:0;padding:0}.layui-table-page .layui-laypage .layui-laypage-prev{margin-left:-11px!important}.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left:0;top:0;padding:0}.layui-table-page .layui-laypage button,.layui-table-page .layui-laypage input{height:26px;line-height:26px}.layui-table-page .layui-laypage input{width:40px}.layui-table-page .layui-laypage button{padding:0 10px}.layui-table-page select{height:18px}.layui-table-pagebar{float:right;line-height:23px}.layui-table-pagebar .layui-btn-sm{margin-top:-1px}.layui-table-pagebar .layui-btn-xs{margin-top:2px}.layui-table-view select[lay-ignore]{display:inline-block}.layui-table-patch .layui-table-cell{padding:0;width:30px}.layui-table-edit{position:absolute;left:0;top:0;z-index:189;min-width:100%;min-height:100%;padding:5px 14px;border-radius:0;box-shadow:1px 1px 20px rgba(0,0,0,.15);background-color:#fff}.layui-table-edit:focus{border-color:#16b777!important}input.layui-input.layui-table-edit{height:100%}select.layui-table-edit{padding:0 0 0 10px;border-color:#d2d2d2}.layui-table-view .layui-form-checkbox,.layui-table-view .layui-form-radio,.layui-table-view .layui-form-switch{top:0;margin:0}.layui-table-view .layui-form-checkbox{top:-1px;height:26px;line-height:26px}.layui-table-view .layui-form-checkbox i{height:26px}.layui-table-grid .layui-table-cell{overflow:visible}.layui-table-grid-down{position:absolute;top:0;right:0;width:24px;height:100%;padding:5px 0;border-width:0;border-left-width:1px;text-align:center;background-color:#fff;color:#999;cursor:pointer}.layui-table-grid-down .layui-icon{position:absolute;top:50%;left:50%;margin:-8px 0 0 -8px;font-size:14px}.layui-table-grid-down:hover{background-color:#fbfbfb}.layui-table-expanded{height:95px}.layui-table-expanded .layui-table-cell,.layui-table-view .layui-table[lay-size=lg] .layui-table-expanded .layui-table-cell,.layui-table-view .layui-table[lay-size=sm] .layui-table-expanded .layui-table-cell{height:auto;max-height:94px;white-space:normal;text-overflow:clip}.layui-table-cell-c{position:absolute;bottom:-10px;right:50%;margin-right:-9px;width:20px;height:20px;line-height:18px;cursor:pointer;text-align:center;background-color:#fff;border:1px solid #eee;border-radius:50%;z-index:1000;transition:.3s all;font-size:14px}.layui-table-cell-c:hover{border-color:#16b777}.layui-table-expanded td:hover .layui-table-cell{overflow:auto}.layui-table-main>.layui-table>tbody>tr:last-child>td>.layui-table-cell-c{bottom:0}body .layui-table-tips .layui-layer-content{background:0 0;padding:0;box-shadow:0 1px 6px rgba(0,0,0,.12)}.layui-table-tips-main{margin:-49px 0 0 -1px;max-height:150px;padding:8px 15px;font-size:14px;overflow-y:scroll;background-color:#fff;color:#5f5f5f}.layui-table-tips-c{position:absolute;right:-3px;top:-13px;width:20px;height:20px;padding:3px;cursor:pointer;background-color:#5f5f5f;border-radius:50%;color:#fff}.layui-table-tips-c:hover{background-color:#777}.layui-table-tips-c:before{position:relative;right:-2px}.layui-table-tree-nodeIcon{max-width:20px}.layui-table-tree-nodeIcon>*{width:100%}.layui-table-tree-flexIcon,.layui-table-tree-nodeIcon{margin-right:2px}.layui-table-tree-flexIcon{cursor:pointer}.layui-upload-file{display:none!important;opacity:.01;filter:Alpha(opacity=1)}.layui-upload-list{margin:11px 0}.layui-upload-choose{max-width:200px;padding:0 10px;color:#999;font-size:14px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-upload-drag{position:relative;display:inline-block;padding:30px;border:1px dashed #e2e2e2;background-color:#fff;text-align:center;cursor:pointer;color:#999}.layui-upload-drag .layui-icon{font-size:50px;color:#16baaa}.layui-upload-drag[lay-over]{border-color:#16baaa}.layui-upload-form{display:inline-block}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-wrap{position:relative;display:inline-block;vertical-align:middle}.layui-upload-wrap .layui-upload-file{display:block!important;position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-btn-container .layui-upload-choose{padding-left:0}.layui-menu{position:relative;margin:5px 0;background-color:#fff;box-sizing:border-box}.layui-menu *{box-sizing:border-box}.layui-menu li,.layui-menu-body-title,.layui-menu-body-title a{padding:5px 15px;color:initial}.layui-menu li{position:relative;margin:0 0 1px;line-height:26px;color:rgba(0,0,0,.8);font-size:14px;white-space:nowrap;cursor:pointer;transition:all .3s}.layui-menu li:hover{background-color:#f8f8f8}.layui-menu li.layui-disabled,.layui-menu li.layui-disabled *{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important}.layui-menu-item-parent:hover>.layui-menu-body-panel{display:block;animation-name:layui-fadein;animation-duration:.3s;animation-fill-mode:both;animation-delay:.2s}.layui-menu-item-group>.layui-menu-body-title,.layui-menu-item-parent>.layui-menu-body-title{padding-right:38px}.layui-menu .layui-menu-item-divider:hover,.layui-menu .layui-menu-item-group:hover,.layui-menu .layui-menu-item-none:hover{background:0 0;cursor:default}.layui-menu .layui-menu-item-group>ul{margin:5px 0 -5px}.layui-menu .layui-menu-item-group>.layui-menu-body-title{color:rgba(0,0,0,.35);user-select:none}.layui-menu .layui-menu-item-none{color:rgba(0,0,0,.35);cursor:default}.layui-menu .layui-menu-item-none{text-align:center}.layui-menu .layui-menu-item-divider{margin:5px 0;padding:0;height:0;line-height:0;border-bottom:1px solid #eee;overflow:hidden}.layui-menu .layui-menu-item-down:hover,.layui-menu .layui-menu-item-up:hover{cursor:pointer}.layui-menu .layui-menu-item-up>.layui-menu-body-title{color:rgba(0,0,0,.8)}.layui-menu .layui-menu-item-up>ul{visibility:hidden;height:0;overflow:hidden}.layui-menu .layui-menu-item-down>.layui-menu-body-title>.layui-icon-down{transform:rotate(180deg)}.layui-menu .layui-menu-item-up>.layui-menu-body-title>.layui-icon-up{transform:rotate(-180deg)}.layui-menu .layui-menu-item-down:hover>.layui-menu-body-title>.layui-icon,.layui-menu .layui-menu-item-up>.layui-menu-body-title:hover>.layui-icon{color:#000}.layui-menu .layui-menu-item-down>ul{visibility:visible;height:auto}.layui-menu .layui-menu-item-checked,.layui-menu .layui-menu-item-checked2{background-color:#f8f8f8!important;color:#16b777}.layui-menu .layui-menu-item-checked a,.layui-menu .layui-menu-item-checked2 a{color:#16b777}.layui-menu .layui-menu-item-checked:after{position:absolute;right:-1px;top:0;bottom:0;border-right:3px solid #16b777;content:""}.layui-menu-body-title{position:relative;margin:-5px -15px;overflow:hidden;text-overflow:ellipsis}.layui-menu-body-title a{display:block;margin:-5px -15px;color:rgba(0,0,0,.8)}.layui-menu-body-title a:hover{transition:all .3s}.layui-menu-body-title>.layui-icon{position:absolute;right:15px;top:50%;margin-top:-6px;line-height:normal;font-size:14px;transition:all .2s;-webkit-transition:all .2s}.layui-menu-body-title>.layui-icon:hover{transition:all .3s}.layui-menu-body-title>.layui-icon-right{right:14px}.layui-menu-body-panel{display:none;position:absolute;top:-7px;left:100%;z-index:1000;margin-left:13px;padding:5px 0}.layui-menu-body-panel:before{content:"";position:absolute;width:20px;left:-16px;top:0;bottom:0}.layui-menu-body-panel-left{left:auto;right:100%;margin:0 13px 0}.layui-menu-body-panel-left:before{left:auto;right:-16px}.layui-menu-lg li{line-height:32px}.layui-menu-lg .layui-menu-body-title a:hover,.layui-menu-lg li:hover{background:0 0;color:#16b777}.layui-menu-lg li .layui-menu-body-panel{margin-left:14px}.layui-menu-lg li .layui-menu-body-panel-left{margin:0 15px 0}.layui-dropdown{position:absolute;left:-999999px;top:-999999px;z-index:77777777;margin:5px 0;min-width:100px}.layui-dropdown:before{content:"";position:absolute;width:100%;height:6px;left:0;top:-6px}.layui-dropdown-shade{top:0;left:0;width:100%;height:100%;position:fixed;pointer-events:auto}.layui-tabs{position:relative}.layui-tabs.layui-hide-v{overflow:hidden}.layui-tabs-header{position:relative;left:0;height:40px;padding:0!important;white-space:nowrap;font-size:0;transition:all .16s;-webkit-transition:all .16s}.layui-tabs-header:after,.layui-tabs-scroll:after{content:"";position:absolute;left:0;bottom:0;z-index:0;width:100%;border-bottom:1px solid #eee}.layui-tabs-header li{position:relative;display:inline-block;vertical-align:middle;line-height:40px;margin:0!important;padding:0 16px;text-align:center;cursor:pointer;font-size:14px;transition:all .16s;-webkit-transition:all .16s}.layui-tabs-header li:first-child{margin-left:0}.layui-tabs-header li a{display:block;padding:0 16px;margin:0 -16px;color:inherit}.layui-tabs-header li a:hover{text-decoration:none}.layui-tabs-header .layui-this,.layui-tabs-header li:hover{color:#16baaa}.layui-tabs-header .layui-this:after{content:"";position:absolute;left:0;top:0;z-index:1;width:100%;height:100%;border-bottom:3px solid #16baaa;box-sizing:border-box;pointer-events:none}.layui-tabs-header .layui-badge,.layui-tabs-header .layui-badge-dot{left:5px;top:-1px}.layui-tabs-scroll{position:relative;overflow:hidden;padding:0 40px}.layui-tabs-scroll .layui-tabs-header:after{display:none;content:none;border:0}.layui-tabs-bar .layui-icon{position:absolute;left:0;top:0;z-index:3;width:40px;height:100%;line-height:40px;border:1px solid #eee;text-align:center;cursor:pointer;box-sizing:border-box;background-color:#fff;box-shadow:2px 0 5px 0 rgb(0 0 0 / 6%)}.layui-tabs-bar .layui-icon-next{left:auto;right:0;box-shadow:-2px 0 5px 0 rgb(0 0 0 / 6%)}.layui-tabs-header li .layui-tabs-close{position:relative;display:inline-block;width:16px;height:16px;line-height:18px;margin-left:8px;top:0;text-align:center;font-size:12px;color:#959595;border-radius:50%;font-weight:700;transition:all .16s;-webkit-transition:all .16s}.layui-tabs-header li .layui-tabs-close:hover{background-color:#ff5722;color:#fff}.layui-tabs-header li[lay-closable=false] .layui-tabs-close{display:none}.layui-tabs-body{padding:16px 0}.layui-tabs-item{display:none}.layui-tabs-card>.layui-tabs-header .layui-this{background-color:#fff}.layui-tabs-card>.layui-tabs-header .layui-this:after{border:1px solid #eee;border-bottom-color:#fff;border-radius:2px 2px 0 0}.layui-tabs-card>.layui-tabs-header li:first-child.layui-this:after{margin-left:-1px}.layui-tabs-card>.layui-tabs-header li:last-child.layui-this:after{margin-right:-1px}.layui-tabs-card.layui-panel>.layui-tabs-header .layui-this:after{border-top:0;border-radius:0}.layui-tabs-card.layui-panel>.layui-tabs-body{padding:16px}.layui-nav{position:relative;padding:0 15px;background-color:#2f363c;color:#fff;border-radius:2px;font-size:0;box-sizing:border-box}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;margin-top:0;list-style:none;vertical-align:middle;line-height:60px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#fff;color:rgba(255,255,255,.7);transition:all .3s;-webkit-transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar{content:"";position:absolute;left:0;top:0;width:0;height:3px;background-color:#16b777;transition:all .2s;-webkit-transition:all .2s;pointer-events:none}.layui-nav-bar{z-index:1000}.layui-nav[lay-bar=disabled] .layui-nav-bar{display:none}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff;text-decoration:none}.layui-nav .layui-this:after{top:auto;bottom:0;width:100%}.layui-nav-img{width:30px;height:30px;margin-right:10px;border-radius:50%}.layui-nav .layui-nav-more{position:absolute;top:0;right:3px;left:auto!important;margin-top:0;font-size:12px;cursor:pointer;transition:all .2s;-webkit-transition:all .2s}.layui-nav .layui-nav-mored,.layui-nav-itemed>a .layui-nav-more{transform:rotate(180deg)}.layui-nav-child{display:none;position:absolute;left:0;top:65px;min-width:100%;line-height:36px;padding:5px 0;box-shadow:0 2px 4px rgba(0,0,0,.12);border:1px solid #eee;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap;box-sizing:border-box}.layui-nav .layui-nav-child a{color:#5f5f5f;color:rgba(0,0,0,.8)}.layui-nav .layui-nav-child a:hover{background-color:#f8f8f8;color:rgba(0,0,0,.8)}.layui-nav-child dd{margin:1px 0;position:relative}.layui-nav-child dd.layui-this{background-color:#f8f8f8;color:#000}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-child-r{left:auto;right:0}.layui-nav-child-c{text-align:center}.layui-nav.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:40px}.layui-nav-tree .layui-nav-item a{position:relative;height:40px;line-height:40px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item>a{padding-top:5px;padding-bottom:5px}.layui-nav-tree .layui-nav-more{right:15px}.layui-nav-tree .layui-nav-item>a .layui-nav-more{padding:5px 0}.layui-nav-tree .layui-nav-bar{width:5px;height:0}.layui-side .layui-nav-tree .layui-nav-bar{width:2px}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-nav-child dd.layui-this a,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#16baaa;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{color:#fff!important}.layui-nav-tree .layui-nav-bar{background-color:#16baaa}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;background:0 0;background-color:rgba(0,0,0,.3);box-shadow:none}.layui-nav-tree .layui-nav-child dd{margin:0}.layui-nav-tree .layui-nav-child a{color:#fff;color:rgba(255,255,255,.7)}.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-itemed>.layui-nav-child,.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display:block}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-nav-tree.layui-bg-gray a,.layui-nav.layui-bg-gray .layui-nav-item a{color:#373737;color:rgba(0,0,0,.8)}.layui-nav-tree.layui-bg-gray .layui-nav-itemed>a{color:#000!important}.layui-nav.layui-bg-gray .layui-this a{color:#16b777}.layui-nav-tree.layui-bg-gray .layui-nav-child{padding-left:11px;background:0 0}.layui-nav-tree.layui-bg-gray .layui-nav-child dd.layui-this,.layui-nav-tree.layui-bg-gray .layui-nav-child dd.layui-this a,.layui-nav-tree.layui-bg-gray .layui-this,.layui-nav-tree.layui-bg-gray .layui-this>a{background:0 0!important;color:#16b777!important;font-weight:700}.layui-nav-tree.layui-bg-gray .layui-nav-bar{background-color:#16b777}.layui-breadcrumb{visibility:hidden;font-size:0}.layui-breadcrumb>*{font-size:14px}.layui-breadcrumb a{color:#999!important}.layui-breadcrumb a:hover{color:#16b777!important}.layui-breadcrumb a cite{color:#5f5f5f;font-style:normal}.layui-breadcrumb span[lay-separator]{margin:0 10px;color:#999}.layui-tab{margin:10px 0;text-align:left!important}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab .layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;transition:all .2s;-webkit-transition:all .2s}.layui-tab .layui-tab-title:after{content:"";border-bottom-color:#eee;border-bottom-width:1px;border-style:none none solid;bottom:0;left:0;right:auto;top:auto;pointer-events:none;position:absolute;width:100%;z-index:8}.layui-tab .layui-tab-title li{display:inline-block;vertical-align:middle;font-size:14px;transition:all .2s;-webkit-transition:all .2s}.layui-tab .layui-tab-title li{position:relative;line-height:40px;min-width:65px;margin:0;padding:0 15px;text-align:center;cursor:pointer}.layui-tab .layui-tab-title li a{display:block;padding:0 15px;margin:0 -15px}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:"";width:100%;height:40px;border-width:1px;border-bottom-width:1px;border-style:solid;border-bottom-color:#fff;border-radius:2px 2px 0 0;box-sizing:border-box;pointer-events:none;z-index:9}.layui-tab-bar{box-sizing:border-box;position:absolute;right:0;top:0;z-index:10;width:30px;height:40px;line-height:40px;border-width:1px;border-style:solid;border-radius:2px;text-align:center;background-color:#fff;cursor:pointer}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item{display:none}.layui-tab-more{padding-right:30px;height:auto!important;white-space:normal!important}.layui-tab-more li.layui-this:after{border-bottom-color:#eee;border-radius:2px}.layui-tab-more .layui-tab-bar .layui-icon{top:-2px;top:3px\0;-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root .layui-tab-more .layui-tab-bar .layui-icon{top:-2px\0/IE9}.layui-tab-content{padding:15px 0}.layui-tab-title li .layui-tab-close{position:relative;display:inline-block;width:18px;height:18px;line-height:20px;margin-left:8px;top:1px;text-align:center;font-size:14px;color:#c2c2c2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li .layui-tab-close:hover{border-radius:2px;background-color:#ff5722;color:#fff}.layui-tab-brief>.layui-tab-title .layui-this{color:#16baaa}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after{border:none;border-radius:0;border-bottom:2px solid #16b777}.layui-tab-card{border-width:1px;border-style:solid;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#fafafa}.layui-tab-card>.layui-tab-title li{margin-right:-1px;margin-left:-1px}.layui-tab-card>.layui-tab-title .layui-this{background-color:#fff}.layui-tab-card>.layui-tab-title .layui-this:after{border-top:none;border-width:1px;border-bottom-color:#fff}.layui-tab-card>.layui-tab-title .layui-tab-bar{height:40px;line-height:40px;border-radius:0;border-top:none;border-right:none}.layui-tab-card>.layui-tab-more .layui-this{background:0 0;color:#16b777}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-timeline{padding-left:5px}.layui-timeline-item{position:relative;padding-bottom:20px}.layui-timeline-axis{position:absolute;left:-5px;top:0;z-index:10;width:20px;height:20px;line-height:20px;background-color:#fff;color:#16b777;border-radius:50%;text-align:center;cursor:pointer}.layui-timeline-axis:hover{color:#ff5722}.layui-timeline-item:before{content:"";position:absolute;left:5px;top:0;z-index:0;width:1px;height:100%}.layui-timeline-item:first-child:before{display:block}.layui-timeline-item:last-child:before{display:none}.layui-timeline-content{padding-left:25px}.layui-timeline-title{position:relative;margin-bottom:10px;line-height:22px}.layui-badge,.layui-badge-dot,.layui-badge-rim{position:relative;display:inline-block;padding:0 6px;font-size:12px;text-align:center;background-color:#ff5722;color:#fff;border-radius:2px}.layui-badge{height:18px;line-height:18px}.layui-badge-dot{width:8px;height:8px;padding:0;border-radius:50%}.layui-badge-rim{height:18px;line-height:18px;border-width:1px;border-style:solid;background-color:#fff;color:#5f5f5f}.layui-btn .layui-badge,.layui-btn .layui-badge-dot{margin-left:5px}.layui-nav .layui-badge,.layui-nav .layui-badge-dot{position:absolute;top:50%;margin:-5px 6px 0}.layui-nav .layui-badge{margin-top:-10px}.layui-tab-title .layui-badge,.layui-tab-title .layui-badge-dot{left:5px;top:-2px}.layui-carousel{position:relative;left:0;top:0;background-color:#f8f8f8}.layui-carousel>[carousel-item]{position:relative;width:100%;height:100%;overflow:hidden}.layui-carousel>[carousel-item]:before{position:absolute;content:'\e63d';left:50%;top:50%;width:100px;line-height:20px;margin:-10px 0 0 -50px;text-align:center;color:#c2c2c2;font-family:layui-icon!important;font-size:30px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-carousel>[carousel-item]>*{display:none;position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f8f8f8;transition-duration:.3s;-webkit-transition-duration:.3s}.layui-carousel-updown>*{-webkit-transition:.3s ease-in-out up;transition:.3s ease-in-out up}.layui-carousel-arrow{display:none\0;opacity:0;position:absolute;left:10px;top:50%;margin-top:-18px;width:36px;height:36px;line-height:36px;text-align:center;font-size:20px;border:none 0;border-radius:50%;background-color:rgba(0,0,0,.2);color:#fff;-webkit-transition-duration:.3s;transition-duration:.3s;cursor:pointer}.layui-carousel-arrow[lay-type=add]{left:auto!important;right:10px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow{opacity:1;left:20px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel[lay-arrow=none] .layui-carousel-arrow{display:none}.layui-carousel-arrow:hover,.layui-carousel-ind ul:hover{background-color:rgba(0,0,0,.35)}.layui-carousel:hover .layui-carousel-arrow{display:block\0;opacity:1;left:20px}.layui-carousel:hover .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel-ind{position:relative;top:-35px;width:100%;line-height:0!important;text-align:center;font-size:0}.layui-carousel[lay-indicator=outside]{margin-bottom:30px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind{top:10px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind ul{background-color:rgba(0,0,0,.5)}.layui-carousel[lay-indicator=none] .layui-carousel-ind{display:none}.layui-carousel-ind ul{display:inline-block;padding:5px;background-color:rgba(0,0,0,.2);border-radius:10px;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind ul li{display:inline-block;width:10px;height:10px;margin:0 3px;font-size:14px;background-color:#eee;background-color:rgba(255,255,255,.5);border-radius:50%;cursor:pointer;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind ul li:hover{background-color:rgba(255,255,255,.7)}.layui-carousel-ind ul li.layui-this{background-color:#fff}.layui-carousel>[carousel-item]>.layui-carousel-next,.layui-carousel>[carousel-item]>.layui-carousel-prev,.layui-carousel>[carousel-item]>.layui-this{display:block}.layui-carousel>[carousel-item]>.layui-this{-webkit-transform:translateX(0);transform:translateX(0)}.layui-carousel>[carousel-item]>.layui-carousel-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}.layui-carousel>[carousel-item]>.layui-carousel-next{-webkit-transform:translateX(100%);transform:translateX(100%)}.layui-carousel>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel>[carousel-item]>.layui-carousel-prev.layui-carousel-right{-webkit-transform:translateX(0);transform:translateX(0)}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-left{-webkit-transform:translateX(-100%);transform:translateX(-100%)}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-right{-webkit-transform:translateX(100%);transform:translateX(100%)}.layui-carousel[lay-anim=updown] .layui-carousel-arrow{left:50%!important;top:20px;margin:0 0 0 -18px}.layui-carousel[lay-anim=updown] .layui-carousel-arrow[lay-type=add]{top:auto!important;bottom:20px}.layui-carousel[lay-anim=updown] .layui-carousel-ind{position:absolute;top:50%;right:20px;width:auto;height:auto}.layui-carousel[lay-anim=updown] .layui-carousel-ind ul{padding:3px 5px}.layui-carousel[lay-anim=updown] .layui-carousel-ind li{display:block;margin:6px 0}.layui-carousel[lay-anim=updown]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this{-webkit-transform:translateY(0);transform:translateY(0)}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev{-webkit-transform:translateY(-100%);transform:translateY(-100%)}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next{-webkit-transform:translateY(100%);transform:translateY(100%)}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{-webkit-transform:translateY(0);transform:translateY(0)}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-left{-webkit-transform:translateY(-100%);transform:translateY(-100%)}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-right{-webkit-transform:translateY(100%);transform:translateY(100%)}.layui-carousel[lay-anim=fade]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev{opacity:0}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{opacity:1}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-right{opacity:0}.layui-fixbar{position:fixed;right:16px;bottom:16px;z-index:999999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;text-align:center;cursor:pointer;font-size:30px;background-color:#9f9f9f;color:#fff;border-radius:2px;opacity:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}body .layui-util-face .layui-layer-content{padding:0;background-color:#fff;color:#5f5f5f;box-shadow:none}.layui-util-face .layui-layer-TipsG{display:none}.layui-util-face ul{position:relative;width:372px;padding:10px;border:1px solid #d9d9d9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-util-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-code{display:block;position:relative;padding:15px;line-height:20px;border:1px solid #eee;border-left-width:6px;background-color:#fff;color:#333;font-family:"Courier New",Consolas,"Lucida Console",monospace;font-size:12px}.layui-transfer-box,.layui-transfer-header,.layui-transfer-search{border-width:0;border-style:solid;border-color:#eee}.layui-transfer-box{position:relative;display:inline-block;vertical-align:middle;border-width:1px;width:200px;height:360px;border-radius:2px;background-color:#fff}.layui-transfer-box .layui-form-checkbox{width:100%;margin:0!important}.layui-transfer-header{height:38px;line-height:38px;padding:0 11px;border-bottom-width:1px}.layui-transfer-search{position:relative;padding:11px;border-bottom-width:1px}.layui-transfer-search .layui-input{height:32px;padding-left:30px;font-size:12px}.layui-transfer-search .layui-icon-search{position:absolute;left:20px;top:50%;line-height:normal;margin-top:-8px;color:#5f5f5f}.layui-transfer-active{margin:0 15px;display:inline-block;vertical-align:middle}.layui-transfer-active .layui-btn{display:block;margin:0;padding:0 15px;background-color:#16b777;border-color:#16b777;color:#fff}.layui-transfer-active .layui-btn-disabled{background-color:#fbfbfb;border-color:#eee;color:#d2d2d2}.layui-transfer-active .layui-btn:first-child{margin-bottom:15px}.layui-transfer-active .layui-btn .layui-icon{margin:0;font-size:14px!important}.layui-transfer-data{padding:5px 0;overflow:auto}.layui-transfer-data li{height:32px;line-height:32px;margin-top:0!important;padding:0 11px;list-style-type:none!important}.layui-transfer-data li:hover{background-color:#f8f8f8;transition:.5s all}.layui-transfer-data .layui-none{padding:15px 11px;text-align:center;color:#999}.layui-rate,.layui-rate *{display:inline-block;vertical-align:middle}.layui-rate{padding:11px 6px 11px 0;font-size:0}.layui-rate li{margin-top:0!important}.layui-rate li i.layui-icon{font-size:20px;color:#ffb800}.layui-rate li i.layui-icon{margin-right:5px;transition:all .3s;-webkit-transition:all .3s}.layui-rate li i:hover,.layui-rate-hover{cursor:pointer;transform:scale(1.12);-webkit-transform:scale(1.12)}.layui-rate[readonly] li i:hover{cursor:default;transform:scale(1)}.layui-colorpicker{width:38px;height:38px;border:1px solid #eee;padding:5px;border-radius:2px;line-height:24px;display:inline-block;cursor:pointer;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-colorpicker:hover{border-color:#d2d2d2}.layui-colorpicker.layui-colorpicker-lg{width:44px;height:44px;line-height:30px}.layui-colorpicker.layui-colorpicker-sm{width:30px;height:30px;line-height:20px;padding:3px}.layui-colorpicker.layui-colorpicker-xs{width:22px;height:22px;line-height:16px;padding:1px}.layui-colorpicker-trigger-bgcolor{display:block;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);border-radius:2px}.layui-colorpicker-trigger-span{display:block;height:100%;box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:2px;text-align:center}.layui-colorpicker-trigger-i{display:inline-block;color:#fff;font-size:12px}.layui-colorpicker-trigger-i.layui-icon-close{color:#999}.layui-colorpicker-main{position:absolute;left:-999999px;top:-999999px;z-index:77777777;width:280px;margin:5px 0;padding:7px;background:#fff;border:1px solid #d2d2d2;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-colorpicker-main-wrapper{height:180px;position:relative}.layui-colorpicker-basis{width:260px;height:100%;position:relative;overflow:hidden}.layui-colorpicker-basis-white{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.layui-colorpicker-basis-black{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(0deg,#000,transparent)}.layui-colorpicker-basis-cursor{width:10px;height:10px;border:1px solid #fff;border-radius:50%;position:absolute;top:0;right:100%;cursor:pointer;transform:translate(-50%,-50%)}.layui-colorpicker-side{position:absolute;top:0;right:0;width:12px;height:100%;background:linear-gradient(red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.layui-colorpicker-side-slider{width:100%;height:5px;box-shadow:0 0 1px #888;box-sizing:border-box;background:#fff;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;left:0}.layui-colorpicker-main-alpha{display:none;height:12px;margin-top:7px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-alpha-bgcolor{height:100%;position:relative}.layui-colorpicker-alpha-slider{width:5px;height:100%;box-shadow:0 0 1px #888;box-sizing:border-box;background:#fff;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;top:0}.layui-colorpicker-main-pre{padding-top:7px;font-size:0}.layui-colorpicker-pre{width:20px;height:20px;border-radius:2px;display:inline-block;margin-left:6px;margin-bottom:7px;cursor:pointer}.layui-colorpicker-pre:nth-child(11n+1){margin-left:0}.layui-colorpicker-pre-isalpha{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-pre.layui-this{box-shadow:0 0 3px 2px rgba(0,0,0,.15)}.layui-colorpicker-pre>div{height:100%;border-radius:2px}.layui-colorpicker-main-input{text-align:right;padding-top:7px}.layui-colorpicker-main-input .layui-btn-container .layui-btn{margin:0 0 0 10px}.layui-colorpicker-main-input div.layui-inline{float:left;font-size:14px}.layui-colorpicker-main-input input.layui-input{width:168px;height:30px;color:#5f5f5f;padding-left:5px}.layui-slider{height:4px;background:#eee;border-radius:3px;position:relative;cursor:pointer}.layui-slider-bar{border-radius:3px;position:absolute;height:100%}.layui-slider-step{position:absolute;top:0;width:4px;height:4px;border-radius:50%;background:#fff;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.layui-slider-wrap{width:36px;height:36px;position:absolute;top:-16px;-webkit-transform:translateX(-50%);transform:translateX(-50%);z-index:10;text-align:center}.layui-slider-wrap-btn{width:12px;height:12px;border-radius:50%;background:#fff;display:inline-block;vertical-align:middle;cursor:pointer;transition:.3s}.layui-slider-wrap:after{content:"";height:100%;display:inline-block;vertical-align:middle}.layui-slider-wrap-btn.layui-slider-hover,.layui-slider-wrap-btn:hover{transform:scale(1.2)}.layui-slider-wrap-btn.layui-disabled:hover{transform:scale(1)!important}.layui-slider-tips{position:absolute;top:-42px;z-index:77777777;white-space:nowrap;-webkit-transform:translateX(-50%);transform:translateX(-50%);color:#fff;background:#000;border-radius:3px;height:25px;line-height:25px;padding:0 10px}.layui-slider-tips:after{content:"";position:absolute;bottom:-12px;left:50%;margin-left:-6px;width:0;height:0;border-width:6px;border-style:solid;border-color:#000 transparent transparent transparent}.layui-slider-input{width:70px;height:32px;border:1px solid #eee;border-radius:3px;font-size:16px;line-height:32px;position:absolute;right:0;top:-14px;box-sizing:border-box}.layui-slider-input-btn{position:absolute;top:0;right:0;width:20px;height:100%;border-left:1px solid #eee}.layui-slider-input-btn i{cursor:pointer;position:absolute;right:0;bottom:0;width:20px;height:50%;font-size:12px;line-height:16px;text-align:center;color:#999}.layui-slider-input-btn i:first-child{top:0;border-bottom:1px solid #eee}.layui-slider-input-txt{height:100%;font-size:14px}.layui-slider-input-txt input{height:100%;border:none;padding-right:21px}.layui-slider-input-btn i:hover{color:#16baaa}.layui-slider-vertical{width:4px;margin-left:33px}.layui-slider-vertical .layui-slider-bar{width:4px}.layui-slider-vertical .layui-slider-step{top:auto;left:0;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-wrap{top:auto;left:-16px;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-tips{top:auto;left:2px}@media \0screen{.layui-slider-wrap-btn{margin-left:-20px}.layui-slider-vertical .layui-slider-wrap-btn{margin-left:0;margin-bottom:-20px}.layui-slider-vertical .layui-slider-tips{margin-left:-8px}.layui-slider>span{margin-left:8px}}.layui-tree{line-height:22px}.layui-tree .layui-form-checkbox{margin:0!important}.layui-tree-set{width:100%;position:relative}.layui-tree-pack{display:none;padding-left:20px;position:relative}.layui-tree-line .layui-tree-pack{padding-left:27px}.layui-tree-line .layui-tree-set .layui-tree-set:after{content:"";position:absolute;top:14px;left:-9px;width:17px;height:0;border-top:1px dotted #c0c4cc}.layui-tree-entry{position:relative;padding:3px 0;height:26px;white-space:nowrap}.layui-tree-entry:hover{background-color:#eee}.layui-tree-line .layui-tree-entry:hover{background-color:rgba(0,0,0,0)}.layui-tree-line .layui-tree-entry:hover .layui-tree-txt{color:#999;text-decoration:underline;transition:.3s}.layui-tree-main{display:inline-block;vertical-align:middle;cursor:pointer;padding-right:10px}.layui-tree-line .layui-tree-set:before{content:"";position:absolute;top:0;left:-9px;width:0;height:100%;border-left:1px dotted #c0c4cc}.layui-tree-line .layui-tree-set.layui-tree-setLineShort:before{height:13px}.layui-tree-line .layui-tree-set.layui-tree-setHide:before{height:0}.layui-tree-iconClick{display:inline-block;vertical-align:middle;position:relative;height:20px;line-height:20px;margin:0 10px;color:#c0c4cc}.layui-tree-icon{height:14px;line-height:12px;width:14px;text-align:center;border:1px solid #c0c4cc}.layui-tree-iconClick .layui-icon{font-size:18px}.layui-tree-icon .layui-icon{font-size:12px;color:#5f5f5f}.layui-tree-iconArrow{padding:0 5px}.layui-tree-iconArrow:after{content:"";position:absolute;left:4px;top:3px;z-index:100;width:0;height:0;border-width:5px;border-style:solid;border-color:transparent transparent transparent #c0c4cc;transition:.5s}.layui-tree-spread>.layui-tree-entry .layui-tree-iconClick>.layui-tree-iconArrow:after{transform:rotate(90deg) translate(3px,4px)}.layui-tree-txt{display:inline-block;vertical-align:middle;color:#555}.layui-tree-search{margin-bottom:15px;color:#5f5f5f}.layui-tree-btnGroup{visibility:hidden;display:inline-block;vertical-align:middle;position:relative}.layui-tree-btnGroup .layui-icon{display:inline-block;vertical-align:middle;padding:0 2px;cursor:pointer}.layui-tree-btnGroup .layui-icon:hover{color:#999;transition:.3s}.layui-tree-entry:hover .layui-tree-btnGroup{visibility:visible}.layui-tree-editInput{position:relative;display:inline-block;vertical-align:middle;height:20px;line-height:20px;padding:0;border:none;background-color:rgba(0,0,0,.05)}.layui-tree-emptyText{text-align:center;color:#999}.layui-anim{-webkit-animation-duration:.3s;-webkit-animation-fill-mode:both;animation-duration:.3s;animation-fill-mode:both}.layui-anim.layui-icon{display:inline-block}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.layui-trans,.layui-trans a{transition:all .2s;-webkit-transition:all .2s}@-webkit-keyframes layui-rotate{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes layui-rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}.layui-anim-rotate{-webkit-animation-name:layui-rotate;animation-name:layui-rotate;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes layui-up{from{-webkit-transform:translate3d(0,100%,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-up{from{transform:translate3d(0,100%,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-up{-webkit-animation-name:layui-up;animation-name:layui-up}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,15px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,15px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@keyframes layui-down{0%{opacity:.3;transform:translate3d(0,-100%,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-down{animation-name:layui-down}@keyframes layui-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-downbit{animation-name:layui-downbit}@-webkit-keyframes layui-scale{0%{opacity:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.3;-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scale{-webkit-animation-name:layui-scale;animation-name:layui-scale}@-webkit-keyframes layui-scale-spring{0%{opacity:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;transform:scale(.5)}80%{opacity:.8;transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@keyframes layui-scalesmall{0%{opacity:.3;transform:scale(1.5)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall{animation-name:layui-scalesmall}@keyframes layui-scalesmall-spring{0%{opacity:.3;transform:scale(1.5)}80%{opacity:.8;transform:scale(.9)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall-spring{animation-name:layui-scalesmall-spring}@-webkit-keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}@keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}.layui-anim-fadein{-webkit-animation-name:layui-fadein;animation-name:layui-fadein}@-webkit-keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}.layui-anim-fadeout{-webkit-animation-name:layui-fadeout;animation-name:layui-fadeout}html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-wrap{font-size:13px;font-family:"Courier New",Consolas,"Lucida Console",monospace}.layui-code-view{display:block;position:relative;padding:0!important;border:1px solid #eee;border-left-width:6px;background-color:#fff;color:#333}.layui-code-view pre{margin:0!important}.layui-code-header{position:relative;z-index:3;padding:0 11px;height:40px;line-height:40px;border-bottom:1px solid #eee;background-color:#fafafa;font-size:12px}.layui-code-header>.layui-code-header-about{position:absolute;right:11px;top:0;color:#b7b7b7}.layui-code-header-about>a{padding-left:10px}.layui-code-wrap{position:relative;display:block;z-index:1;margin:0!important;padding:11px 0!important;overflow-x:hidden;overflow-y:auto}.layui-code-line{position:relative;line-height:19px;margin:0!important}.layui-code-line-number{position:absolute;left:0;top:0;padding:0 8px;min-width:45px;height:100%;text-align:right;user-select:none;white-space:nowrap;overflow:hidden}.layui-code-line-content{padding:0 11px;word-wrap:break-word;white-space:pre-wrap}.layui-code-ln-mode>.layui-code-wrap>.layui-code-line{padding-left:45px}.layui-code-ln-side{position:absolute;left:0;top:0;bottom:0;z-index:0;width:45px;border-right:1px solid #eee;border-color:rgb(126 122 122 / 15%);background-color:#fafafa;pointer-events:none}.layui-code-nowrap>.layui-code-wrap{overflow:auto}.layui-code-nowrap>.layui-code-wrap>.layui-code-line>.layui-code-line-content{white-space:pre;word-wrap:normal}.layui-code-nowrap>.layui-code-ln-side{border-right-width:0!important;background:0 0!important}.layui-code-fixbar{position:absolute;top:8px;right:11px;padding-right:45px;z-index:5}.layui-code-fixbar>span{position:absolute;right:0;top:0;padding:0 8px;color:#777;transition:all .3s}.layui-code-fixbar>span:hover{color:#16b777}.layui-code-copy{display:none;cursor:pointer}.layui-code-preview>.layui-code-view>.layui-code-fixbar .layui-code-copy{display:none!important}.layui-code-view:hover>.layui-code-fixbar .layui-code-copy{display:block}.layui-code-view:hover>.layui-code-fixbar .layui-code-lang-marker{display:none}.layui-code-theme-dark,.layui-code-theme-dark>.layui-code-header{border-color:rgb(126 122 122 / 15%);background-color:#1f1f1f}.layui-code-theme-dark{border-width:1px;color:#ccc}.layui-code-theme-dark>.layui-code-ln-side{border-right-color:#2a2a2a;background:0 0;color:#6e7681}.layui-code textarea{display:none}.layui-code-preview>.layui-code,.layui-code-preview>.layui-code-view{margin:0}.layui-code-preview>.layui-tab{position:relative;z-index:1;margin-bottom:0}.layui-code-preview .layui-code-item{display:none;border-top-width:0}.layui-code-item-preview{position:relative;padding:16px}.layui-code-item-preview>iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:none}.layui-code-tools{position:absolute;right:11px;top:8px;line-height:normal}.layui-code-tools>i{display:inline-block;margin-left:6px;padding:3px;cursor:pointer}.layui-code-tools>i.layui-icon-file-b{color:#999}.layui-code-tools>i:hover{color:#16b777}.layui-code-full{position:fixed;left:0;top:0;z-index:1111111;width:100%;height:100%;background-color:#fff}.layui-code-full .layui-code-item{width:100%!important;border-width:0!important}.layui-code-full .layui-code-item,.layui-code-full .layui-code-view,.layui-code-full .layui-code-wrap{height:calc(100vh - 51px)!important;box-sizing:border-box}.layui-code-full .layui-code-item-preview{overflow:auto}.layui-code-view.layui-code-hl{line-height:20px!important;border-left-width:1px}.layui-code-view.layui-code-hl>.layui-code-ln-side{background-color:transparent}.layui-code-theme-dark.layui-code-hl,.layui-code-theme-dark.layui-code-hl>.layui-code-ln-side{border-color:rgb(126 122 122 / 15%)}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate,.layui-laydate *{box-sizing:border-box}.layui-laydate{position:absolute;z-index:99999999;margin:5px 0;border-radius:2px;font-size:14px;line-height:normal;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}.layui-laydate-shade{top:0;left:0;width:100%;height:100%;position:fixed;pointer-events:auto}@keyframes laydate-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-laydate{animation-name:laydate-downbit}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;padding:0 5px;color:#999;font-size:18px;cursor:pointer}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;box-sizing:border-box;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-set-ym span{padding:0 10px;cursor:pointer}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:0;text-align:center}.layui-laydate-content th{font-weight:400}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.laydate-day-holidays:before{position:absolute;left:0;top:0;font-size:12px;transform:scale(.7)}.laydate-day-holidays:before{content:'\4F11';color:#ff5722}.laydate-day-holidays[type=workdays]:before{content:'\73ED';color:inherit}.layui-laydate .layui-this .laydate-day-holidays:before{color:#fff}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px}.layui-laydate-footer span{display:inline-block;vertical-align:top;height:26px;line-height:24px;padding:0 10px;border:1px solid #c9c9c9;border-radius:2px;background-color:#fff;font-size:12px;cursor:pointer;white-space:nowrap;transition:all .3s}.layui-laydate-footer span:hover{color:#16b777}.layui-laydate-footer span.layui-laydate-preview{cursor:default;border-color:transparent!important}.layui-laydate-footer span.layui-laydate-preview:hover{color:#777}.layui-laydate-footer span:first-child.layui-laydate-preview{padding-left:0}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{margin:0 0 0 -1px;border-radius:0}.laydate-footer-btns span:first-child{border-radius:2px 0 0 2px}.laydate-footer-btns span:last-child{border-radius:0 2px 2px 0}.layui-laydate-shortcut{width:80px;padding:6px 0;display:inline-block;vertical-align:top;overflow:auto;max-height:276px;text-align:center}.layui-laydate-shortcut+.layui-laydate-main{display:inline-block;border-left:1px solid #e2e2e2}.layui-laydate-shortcut>li{padding:5px 8px;cursor:pointer;line-height:18px}.layui-laydate .layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;box-sizing:border-box;background-color:#fff}.layui-laydate .layui-laydate-list>li{position:relative;display:inline-block;width:33.3%;height:36px;line-height:36px;margin:3px 0;vertical-align:middle;text-align:center;cursor:pointer;list-style:none}.layui-laydate .laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list{display:table}.layui-laydate .laydate-time-list>li{display:table-cell;height:100%;margin:0;line-height:normal;cursor:default}.layui-laydate .laydate-time-list p{position:relative;top:-4px;margin:0;line-height:29px}.layui-laydate .laydate-time-list ol{height:181px;overflow:hidden}.layui-laydate .laydate-time-list>li:hover ol{overflow-y:auto}.layui-laydate .laydate-time-list ol li{width:130%;padding-left:33px;height:30px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate .laydate-time-list-hide-1 ol li{padding-left:53px}.layui-laydate .laydate-time-list-hide-2 ol li{padding-left:117px}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px;color:#ff5722}.layui-laydate-range{width:546px}.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle;max-width:50%}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content,.layui-laydate-range .laydate-main-list-1 .layui-laydate-header{border-left:1px solid #e2e2e2}.layui-laydate-range.layui-laydate-linkage .laydate-main-list-0 .laydate-next-m,.layui-laydate-range.layui-laydate-linkage .laydate-main-list-0 .laydate-next-y,.layui-laydate-range.layui-laydate-linkage .laydate-main-list-1 .laydate-prev-m,.layui-laydate-range.layui-laydate-linkage .laydate-main-list-1 .laydate-prev-y{display:none}.layui-laydate-range.layui-laydate-linkage .laydate-main-list-1 .layui-laydate-content,.layui-laydate-range.layui-laydate-linkage .laydate-main-list-1 .layui-laydate-header{border-left-style:dashed}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#777}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#16b777}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{color:#333}.layui-laydate-content td{color:#777}.layui-laydate-content td.laydate-day-now{color:#16b777}.layui-laydate-content td.laydate-day-now:after{content:'';position:absolute;width:100%;height:30px;left:0;top:0;border:1px solid #16b777;box-sizing:border-box}.layui-laydate-linkage .layui-laydate-content td.laydate-selected>div{background-color:#cffae9;transition:all .3s}.layui-laydate-linkage .laydate-selected:hover>div{background-color:#cffae9!important}.layui-laydate-content td.laydate-selected:after,.layui-laydate-content td:hover:after{content:none}.layui-laydate-content td>div:hover,.layui-laydate-list li:hover,.layui-laydate-shortcut>li:hover{background-color:#eee;color:#333;transition:all .3s}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.layui-laydate-linkage .laydate-selected.laydate-day-next>div,.layui-laydate-linkage .laydate-selected.laydate-day-prev>div{background:0 0!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#ff5722}.laydate-day-mark::after{background-color:#16b777}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#16b777}.layui-laydate .layui-this,.layui-laydate .layui-this>div{background-color:#16b777!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.layui-laydate .layui-this.laydate-disabled,.layui-laydate .layui-this.laydate-disabled>div{background-color:#eee!important}.layui-laydate-content td>div{padding:7px 0;height:100%}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#16baaa}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-molv .layui-this,.laydate-theme-molv .layui-this>div{background-color:#16baaa!important}.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead{border:1px solid #e2e2e2}.layui-laydate-linkage.laydate-theme-grid .laydate-selected,.layui-laydate-linkage.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#16baaa!important}.layui-laydate-linkage.laydate-theme-grid .laydate-selected.laydate-day-next,.layui-laydate-linkage.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px}.laydate-theme-grid .layui-laydate-content td>div{height:29px;margin-top:-1px}.laydate-theme-circle .layui-laydate-content td.layui-this>div,.laydate-theme-circle .layui-laydate-content td>div{width:28px;height:28px;line-height:28px;border-radius:14px;margin:0 4px;padding:0}.layui-laydate.laydate-theme-circle .layui-laydate-content table td.layui-this{background-color:transparent!important}.laydate-theme-grid.laydate-theme-circle .layui-laydate-content td>div{margin:0 3.5px}.laydate-theme-fullpanel .layui-laydate-main{width:526px}.laydate-theme-fullpanel .layui-laydate-list{width:252px;left:272px}.laydate-theme-fullpanel .laydate-set-ym span{display:none}.laydate-theme-fullpanel .laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-theme-fullpanel .laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-theme-fullpanel .laydate-time-show .layui-laydate-header .layui-icon{display:inline-block!important}.laydate-theme-fullpanel .laydate-btns-time{display:none}.laydate-theme-fullpanel .laydate-time-list-hide-1 ol li{padding-left:49px}.laydate-theme-fullpanel .laydate-time-list-hide-2 ol li{padding-left:107px}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{opacity:0;transition:opacity .35s cubic-bezier(.34,.69,.1,1);top:0;left:0;width:100%;height:100%}.layui-layer{-webkit-overflow-scrolling:touch}.layui-layer{top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #b2b2b2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(data:image/gif;base64,R0lGODlhJQAlAJECAL3L2AYrTv///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgACACwAAAAAJQAlAAACi5SPqcvtDyGYIFpF690i8xUw3qJBwUlSadmcLqYmGQu6KDIeM13beGzYWWy3DlB4IYaMk+Dso2RWkFCfLPcRvFbZxFLUDTt21BW56TyjRep1e20+i+eYMR145W2eefj+6VFmgTQi+ECVY8iGxcg35phGo/iDFwlTyXWphwlm1imGRdcnuqhHeop6UAAAIfkEBQoAAgAsEAACAAQACwAAAgWMj6nLXAAh+QQFCgACACwVAAUACgALAAACFZQvgRi92dyJcVJlLobUdi8x4bIhBQAh+QQFCgACACwXABEADAADAAACBYyPqcsFACH5BAUKAAIALBUAFQAKAAsAAAITlGKZwWoMHYxqtmplxlNT7ixGAQAh+QQFCgACACwQABgABAALAAACBYyPqctcACH5BAUKAAIALAUAFQAKAAsAAAIVlC+BGL3Z3IlxUmUuhtR2LzHhsiEFACH5BAUKAAIALAEAEQAMAAMAAAIFjI+pywUAIfkEBQoAAgAsBQAFAAoACwAAAhOUYJnAagwdjGq2amXGU1PuLEYBACH5BAUKAAIALBAAAgAEAAsAAAIFhI+py1wAIfkEBQoAAgAsFQAFAAoACwAAAhWUL4AIvdnciXFSZS6G1HYvMeGyIQUAIfkEBQoAAgAsFwARAAwAAwAAAgWEj6nLBQAh+QQFCgACACwVABUACgALAAACE5RgmcBqDB2MarZqZcZTU+4sRgEAIfkEBQoAAgAsEAAYAAQACwAAAgWEj6nLXAAh+QQFCgACACwFABUACgALAAACFZQvgAi92dyJcVJlLobUdi8x4bIhBQAh+QQFCgACACwBABEADAADAAACBYSPqcsFADs=) #fff center center no-repeat}.layui-layer-btn a,.layui-layer-setwin span{display:inline-block;vertical-align:middle}.layui-layer-move{display:none;position:fixed;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@-webkit-keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@keyframes layer-slide-down{from{transform:translate3d(0,-100%,0)}to{transform:translate3d(0,0,0)}}@keyframes layer-slide-down-out{from{transform:translate3d(0,0,0)}to{transform:translate3d(0,-100%,0)}}.layer-anim-slide-down{animation-name:layer-slide-down}.layer-anim-slide-down-out{animation-name:layer-slide-down-out}@keyframes layer-slide-left{from{transform:translate3d(100%,0,0)}to{transform:translate3d(0,0,0)}}@keyframes layer-slide-left-out{from{transform:translate3d(0,0,0)}to{transform:translate3d(100%,0,0)}}.layer-anim-slide-left{animation-name:layer-slide-left}.layer-anim-slide-left-out{animation-name:layer-slide-left-out}@keyframes layer-slide-up{from{transform:translate3d(0,100%,0)}to{transform:translate3d(0,0,0)}}@keyframes layer-slide-up-out{from{transform:translate3d(0,0,0)}to{transform:translate3d(0,100%,0)}}.layer-anim-slide-up{animation-name:layer-slide-up}.layer-anim-slide-up-out{animation-name:layer-slide-up-out}@keyframes layer-slide-right{from{transform:translate3d(-100%,0,0)}to{transform:translate3d(0,0,0)}}@keyframes layer-slide-right-out{from{transform:translate3d(0,0,0)}to{transform:translate3d(-100%,0,0)}}.layer-anim-slide-right{animation-name:layer-slide-right}.layer-anim-slide-right-out{animation-name:layer-slide-right-out}.layui-layer-title{padding:0 81px 0 16px;height:50px;line-height:50px;border-bottom:1px solid #f0f0f0;font-size:14px;color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;top:16px;font-size:0;line-height:initial}.layui-layer-setwin span{position:relative;width:16px;height:16px;line-height:18px;margin-left:10px;text-align:center;font-size:16px;cursor:pointer;color:#000;_overflow:hidden;box-sizing:border-box}.layui-layer-setwin .layui-layer-min:before{content:'';position:absolute;width:12px;border-bottom:1px solid #2e2d3c;left:50%;top:50%;margin:-.5px 0 0 -6px;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover:before{background-color:#2d93ca}.layui-layer-setwin .layui-layer-max:after,.layui-layer-setwin .layui-layer-max:before{content:'';position:absolute;left:50%;top:50%;z-index:1;width:9px;height:9px;margin:-5px 0 0 -5px;border:1px solid #2e2d3c}.layui-layer-setwin .layui-layer-max:hover:after,.layui-layer-setwin .layui-layer-max:hover:before{border-color:#2d93ca}.layui-layer-setwin .layui-layer-min:hover:before{background-color:#2d93ca}.layui-layer-setwin .layui-layer-maxmin:after,.layui-layer-setwin .layui-layer-maxmin:before{width:7px;height:7px;margin:-3px 0 0 -3px;background-color:#fff}.layui-layer-setwin .layui-layer-maxmin:after{z-index:0;margin:-5px 0 0 -1px}.layui-layer-setwin .layui-layer-close{cursor:pointer}.layui-layer-setwin .layui-layer-close:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;color:#fff;background-color:#787878;padding:3px;border:3px solid;width:28px;height:28px;font-size:16px;font-weight:bolder;border-radius:50%;margin-left:0}.layui-layer-setwin .layui-layer-close2:hover{opacity:unset;background-color:#3888f6}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:30px;line-height:30px;margin:5px 5px 0;padding:0 16px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none;box-sizing:border-box}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:transparent;background-color:#1e9fff;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-btn-is-loading{opacity:.5!important;cursor:not-allowed!important;cursor:wait!important;overflow:hidden;white-space:nowrap;-webkit-user-select:none;-ms-user-select:none;user-select:none}.layui-layer-btn-is-loading .layui-layer-btn-loading-icon{margin-right:8px;font-size:14px}.layui-layer-dialog{min-width:240px}.layui-layer-dialog .layui-layer-content{position:relative;padding:16px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-face{position:absolute;top:18px;left:16px;color:#959595;font-size:32px;_left:-40px}.layui-layer-dialog .layui-layer-content .layui-icon-tips{color:#f39b12}.layui-layer-dialog .layui-layer-content .layui-icon-success{color:#16b777}.layui-layer-dialog .layui-layer-content .layui-icon-error{top:19px;color:#ff5722}.layui-layer-dialog .layui-layer-content .layui-icon-question{color:#ffb800}.layui-layer-dialog .layui-layer-content .layui-icon-lock{color:#787878}.layui-layer-dialog .layui-layer-content .layui-icon-face-cry{color:#ff5722}.layui-layer-dialog .layui-layer-content .layui-icon-face-smile{color:#16b777}.layui-layer-rim{border:6px solid #8d8d8d;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #d3d4d3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-close{color:#fff}.layui-layer-hui .layui-layer-content{padding:11px 24px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:18px 24px 18px 58px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:76px;height:38px;line-height:38px;text-align:center}.layui-layer-loading-icon{font-size:38px;color:#959595}.layui-layer-loading2{text-align:center}.layui-layer-loading-2{position:relative;height:38px}.layui-layer-loading-2:after,.layui-layer-loading-2:before{content:'';position:absolute;left:50%;top:50%;width:38px;height:38px;margin:-19px 0 0 -19px;border-radius:50%;border:3px solid #d2d2d2;box-sizing:border-box}.layui-layer-loading-2:after{border-color:transparent;border-left-color:#1e9fff}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan .layui-layer-title{background:#4476a7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;border-top:1px solid #e9e7e7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#e9e7e7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#c9c5c5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92b8b1}.layui-layer-lan .layui-layer-setwin .layui-icon,.layui-layer-molv .layui-layer-setwin .layui-icon{color:#fff}.layui-layer-win10{border:1px solid #aaa;box-shadow:1px 1px 6px rgba(0,0,0,.3);border-radius:none}.layui-layer-win10 .layui-layer-title{height:32px;line-height:32px;padding-left:8px;border-bottom:none;font-size:12px}.layui-layer-win10 .layui-layer-setwin{right:0;top:0}.layui-layer-win10 .layui-layer-setwin span{margin-left:0;width:32px;height:32px;padding:8px}.layui-layer-win10.layui-layer-page .layui-layer-setwin span{width:38px}.layui-layer-win10 .layui-layer-setwin span:hover{background-color:#e5e5e5}.layui-layer-win10 .layui-layer-setwin span.layui-icon-close:hover{background-color:#e81123;color:#fff}.layui-layer-win10.layui-layer-dialog .layui-layer-content{padding:8px 16px 32px;color:#0033bc}.layui-layer-win10.layui-layer-dialog .layui-layer-padding{padding-top:18px;padding-left:58px}.layui-layer-win10 .layui-layer-btn{padding:5px 5px 10px;border-top:1px solid #dfdfdf;background-color:#f0f0f0}.layui-layer-win10 .layui-layer-btn a{height:20px;line-height:18px;background-color:#e1e1e1;border-color:#adadad;color:#000;font-size:12px;transition:all .3s}.layui-layer-win10 .layui-layer-btn a:hover{border-color:#2a8edd;background-color:#e5f1fb}.layui-layer-win10 .layui-layer-btn .layui-layer-btn0{border-color:#0078d7}.layui-layer-prompt .layui-layer-input{display:block;width:260px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:16px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;display:inline-block;vertical-align:top;border-left:1px solid transparent;border-right:1px solid transparent;min-width:80px;max-width:300px;padding:0 16px;text-align:center;cursor:default;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:51px;border-left-color:#eee;border-right-color:#eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left-color:transparent}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{background:0 0;box-shadow:none}.layui-layer-photos .layui-layer-content{overflow:visible;text-align:center}.layui-layer-photos .layer-layer-photos-main img{position:relative;width:100%;display:inline-block;vertical-align:top}.layui-layer-photos-next,.layui-layer-photos-prev{position:fixed;top:50%;width:52px;height:52px;line-height:52px;margin-top:-26px;cursor:pointer;font-size:52px;color:#717171}.layui-layer-photos-prev{left:32px}.layui-layer-photos-next{right:32px}.layui-layer-photos-next:hover,.layui-layer-photos-prev:hover{color:#959595}.layui-layer-photos-toolbar{position:fixed;left:0;right:0;bottom:0;width:100%;height:52px;line-height:52px;background-color:rgba(0,0,0,.32);color:#fff;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;font-size:0}.layui-layer-photos-toolbar>*{display:inline-block;vertical-align:top;padding:0 16px;font-size:12px;color:#fff}.layui-layer-photos-toolbar *{font-size:12px}.layui-layer-photos-header{top:0;bottom:auto}.layui-layer-photos-header>span{cursor:pointer}.layui-layer-photos-header>span:hover{background-color:rgba(51,51,51,.32)}.layui-layer-photos-header .layui-icon{font-size:18px}.layui-layer-photos-footer>h3{max-width:65%;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-layer-photos-footer a:hover{text-decoration:underline}.layui-layer-photos-footer em{font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/layui.mobile.css b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/layui.mobile.css new file mode 100644 index 0000000..7835392 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/layui.mobile.css @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,legend,li,ol,p,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}html{font:12px 'Helvetica Neue','PingFang SC',STHeitiSC-Light,Helvetica,Arial,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0)}a{text-decoration:none;background:0 0}a:active,a:hover{outline:0}table{border-collapse:collapse;border-spacing:0}li{list-style:none}b,strong{font-weight:700}h1,h2,h3,h4,h5,h6{font-weight:500}address,cite,dfn,em,var{font-style:normal}dfn{font-style:italic}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}img{border:0;vertical-align:bottom}.layui-inline,input,label{vertical-align:middle}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0;outline:0}button,select{text-transform:none}select{-webkit-appearance:none;border:none}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=1.0.7);src:url(../font/iconfont.eot?v=1.0.7#iefix) format('embedded-opentype'),url(../font/iconfont.woff?v=1.0.7) format('woff'),url(../font/iconfont.ttf?v=1.0.7) format('truetype'),url(../font/iconfont.svg?v=1.0.7#iconfont) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-box,.layui-box *{-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;box-sizing:content-box!important}.layui-border-box,.layui-border-box *{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-inline{position:relative;display:inline-block;*display:inline;*zoom:1}.layui-edge,.layui-upload-iframe{position:absolute;width:0;height:0}.layui-edge{border-style:dashed;border-color:transparent;overflow:hidden}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-disabled,.layui-disabled:active{background-color:#d2d2d2!important;color:#fff!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-upload-iframe{border:0;visibility:hidden}.layui-upload-enter{border:1px solid #009E94;background-color:#009E94;color:#fff;-webkit-transform:scale(1.1);transform:scale(1.1)}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}@-webkit-keyframes layui-m-anim-left{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes layui-m-anim-left{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.layui-m-anim-left{-webkit-animation-name:layui-m-anim-left;animation-name:layui-m-anim-left}@-webkit-keyframes layui-m-anim-right{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes layui-m-anim-right{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.layui-m-anim-right{-webkit-animation-name:layui-m-anim-right;animation-name:layui-m-anim-right}@-webkit-keyframes layui-m-anim-lout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes layui-m-anim-lout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.layui-m-anim-lout{-webkit-animation-name:layui-m-anim-lout;animation-name:layui-m-anim-lout}@-webkit-keyframes layui-m-anim-rout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes layui-m-anim-rout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(100%);transform:translateX(100%)}}.layui-m-anim-rout{-webkit-animation-name:layui-m-anim-rout;animation-name:layui-m-anim-rout}.layui-m-layer{position:relative;z-index:19891014}.layui-m-layer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/code.css b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/code.css new file mode 100644 index 0000000..9143a25 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/code.css @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #e2e2e2;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:32px;line-height:32px;border-bottom:1px solid #e2e2e2}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/laydate/default/laydate.css b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/laydate/default/laydate.css new file mode 100644 index 0000000..b900971 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/laydate/default/laydate.css @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + .laydate-set-ym,.layui-laydate,.layui-laydate *,.layui-laydate-list{box-sizing:border-box}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:laydate-upbit;animation-name:laydate-upbit}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}@-webkit-keyframes laydate-upbit{from{-webkit-transform:translate3d(0,20px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes laydate-upbit{from{transform:translate3d(0,20px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon,.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.laydate-set-ym span,.layui-laydate-header i{padding:0 5px;cursor:pointer}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;color:#999;font-size:18px}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:5px;text-align:center}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;height:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px 20px}.layui-laydate-footer span{margin-right:15px;display:inline-block;cursor:pointer;font-size:12px}.layui-laydate-footer span:hover{color:#5FB878}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{height:26px;line-height:26px;margin:0 0 0 -1px;padding:0 10px;border:1px solid #C9C9C9;background-color:#fff;white-space:nowrap;vertical-align:top;border-radius:2px}.layui-laydate-list>li,.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;background-color:#fff}.layui-laydate-list>li{position:relative;width:33.3%;height:36px;line-height:36px;margin:3px 0;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px}.layui-laydate-range{width:546px}.layui-laydate-range .laydate-main-list-0 .laydate-next-m,.layui-laydate-range .laydate-main-list-0 .laydate-next-y,.layui-laydate-range .laydate-main-list-1 .laydate-prev-m,.layui-laydate-range .laydate-main-list-1 .laydate-prev-y{display:none}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5FB878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{font-weight:400;color:#333}.layui-laydate-content td{color:#666}.layui-laydate-content td.laydate-selected{background-color:#00F7DE}.laydate-selected:hover{background-color:#00F7DE!important}.layui-laydate-content td:hover,.layui-laydate-list li:hover{background-color:#eaeaea;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#FF5722}.laydate-day-mark::after{background-color:#5FB878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5FB878}.layui-laydate .layui-this{background-color:#009688!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead,.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layer/default/icon-ext.png b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layer/default/icon-ext.png new file mode 100644 index 0000000..bbbb669 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layer/default/icon-ext.png differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layer/default/icon.png b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layer/default/icon.png new file mode 100644 index 0000000..3e17da8 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layer/default/icon.png differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layer/default/layer.css b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layer/default/layer.css new file mode 100644 index 0000000..032ae12 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layer/default/layer.css @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + .layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:230px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:43px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layer/default/loading-0.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layer/default/loading-0.gif new file mode 100644 index 0000000..6f3c953 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layer/default/loading-0.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layer/default/loading-1.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layer/default/loading-1.gif new file mode 100644 index 0000000..db3a483 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layer/default/loading-1.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layer/default/loading-2.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layer/default/loading-2.gif new file mode 100644 index 0000000..5bb90fd Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layer/default/loading-2.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/layim.css b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/layim.css new file mode 100644 index 0000000..6851987 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/layim.css @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ +html #layuicss-skinlayimcss{display:none;position:absolute;width:1989px}body .layui-layim,body .layui-layim-chat{border:1px solid #D9D9D9;border-color:rgba(0,0,0,.05);background-repeat:no-repeat;background-color:#F6F6F6;color:#333;font-family:\5FAE\8F6F\96C5\9ED1}body .layui-layim-chat{background-size:cover}body .layui-layim .layui-layer-title{height:110px;border-bottom:none;background:0 0}.layui-layim-main{position:relative;top:-98px;left:0}body .layui-layim .layui-layer-content,body .layui-layim-chat .layui-layer-content{overflow:visible}.layui-layim cite,.layui-layim em,.layui-layim-chat cite,.layui-layim-chat em{font-style:normal}.layui-layim-info{height:50px;font-size:0;padding:0 15px}.layui-layim-info *{font-size:14px}.layim-tab-content li h5 *,.layui-layim-info div,.layui-layim-skin li,.layui-layim-tab li,.layui-layim-tool li{display:inline-block;vertical-align:top;*zoom:1;*display:inline}.layim-tab-content li h5 span,.layui-layim-info .layui-layim-user,.layui-layim-list li p,.layui-layim-list li span,.layui-layim-remark{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layui-layim-info .layui-layim-user{max-width:150px;margin-right:5px;font-size:16px}.layui-layim-status{position:relative;top:2px;line-height:19px;cursor:pointer}.layim-status-online{color:#3FDD86}.layim-status-hide{color:#DD691D}.layim-menu-box{display:none;position:absolute;z-index:100;top:24px;left:-31px;padding:5px 0;width:85px;border:1px solid #E2E2E2;border-radius:2px;background-color:#fff;box-shadow:1px 1px 20px rgba(0,0,0,.1)}.layim-menu-box li{position:relative;line-height:22px;padding-left:30px;font-size:12px}.layim-menu-box li cite{padding-right:5px;font-size:14px}.layim-menu-box li i{display:none;position:absolute;left:8px;top:0;font-weight:700;color:#5FB878}.layim-menu-box .layim-this i{display:block}.layim-menu-box li:hover{background-color:#eee}.layui-layim-remark{position:relative;left:-6px;display:block;width:100%;border:1px solid transparent;margin-top:8px;padding:0 5px;height:26px;line-height:26px;background:0 0;border-radius:2px}.layui-layim-remark:focus,.layui-layim-remark:hover{border:1px solid #d2d2d2;border-color:rgba(0,0,0,.15)}.layui-layim-remark:focus{background-color:#fff}.layui-layim-tab{margin-top:10px;padding:9px 0;font-size:0}.layui-layim-tab li{position:relative;width:33.33%;height:24px;line-height:24px;font-size:22px;text-align:center;color:#666;color:rgba(0,0,0,.6);cursor:pointer}.layim-tab-two li{width:50%}.layui-layim-tab li.layim-this:after{content:'';position:absolute;left:0;bottom:-9px;width:100%;height:3px;background-color:#3FDD86}.layui-layim-tab li.layim-hide{display:none}.layui-layim-tab li:hover{opacity:.8;filter:Alpha(opacity=80)}.layim-tab-content{display:none;padding:10px 0;height:349px;overflow:hidden;background-color:#fff;background-color:rgba(255,255,255,.9)}.layim-tab-content:hover{overflow-y:auto}.layim-tab-content li h5{position:relative;margin-right:15px;padding-left:30px;height:28px;line-height:28px;cursor:pointer;font-size:0;white-space:nowrap;overflow:hidden}.layim-tab-content li h5 *{font-size:14px}.layim-tab-content li h5 span{max-width:125px}.layim-tab-content li h5 i{position:absolute;left:12px;top:0;color:#C9BDBB}.layim-tab-content li h5 em{padding-left:5px;color:#999}.layim-tab-content li h5[lay-type=true] i{top:2px}.layim-tab-content li ul{display:none;margin-bottom:10px}.layui-layim-list li{position:relative;height:42px;padding:5px 15px 5px 60px;font-size:0;cursor:pointer}.layui-layim-list li:hover{background-color:#F2F2F2;background-color:rgba(0,0,0,.05)}.layui-layim-list li.layim-null{height:20px;line-height:20px;padding:0;font-size:14px;color:#999;text-align:center;cursor:default}.layui-layim-list li.layim-null:hover{background:0 0}.layui-layim-list li *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:14px}.layui-layim-list li span{margin-top:4px;max-width:155px}.layui-layim-list li img{position:absolute;left:15px;top:8px;width:36px;height:36px;border-radius:100%}.layui-layim-list li p{display:block;padding-right:30px;line-height:18px;font-size:12px;color:#999}.layui-layim-list li .layim-msg-status{display:none;position:absolute;right:10px;bottom:7px;padding:0 5px;height:16px;line-height:16px;border-radius:16px;text-align:center;font-size:10px;background-color:#F74C31;color:#fff}.layim-list-gray{-webkit-filter:grayscale(100%);-ms-filter:grayscale(100%);filter:grayscale(100%);filter:gray}.layui-layim-tool{padding:0 10px;font-size:0;background-color:#F6F6F6;border-radius:0 0 2px 2px}.layui-layim-tool li{position:relative;width:48px;height:37px;line-height:40px;text-align:center;font-size:22px;cursor:pointer}.layui-layim-tool li:active{background-color:#e2e2e2}.layui-layim-tool .layim-tool-msgbox{line-height:37px}.layui-layim-tool .layim-tool-find{line-height:38px}.layui-layim-tool .layim-tool-skin{font-size:26px}.layim-tool-msgbox span{display:none;position:absolute;left:12px;top:-12px;height:20px;line-height:20px;padding:0 10px;border-radius:2px;background-color:#33DF83;color:#fff;font-size:12px;-webkit-animation-duration:1s;animation-duration:1s}.layim-tool-msgbox .layer-anim-05{display:block}.layui-layim-search{display:none;position:absolute;bottom:5px;left:5px;height:28px;line-height:28px}.layui-layim-search input{width:210px;padding:0 30px 0 10px;height:30px;line-height:30px;border:none;border-radius:3px;background-color:#ddd}.layui-layim-search label{position:absolute;right:6px;top:4px;font-size:20px;cursor:pointer;color:#333;font-weight:400}.layui-layim-skin{margin:10px 0 0 10px;font-size:0}.layui-layim-skin li{margin:0 10px 10px 0;line-height:60px;text-align:center;background-color:#f6f6f6}.layui-layim-skin li,.layui-layim-skin li img{width:86px;height:60px;cursor:pointer}.layui-layim-skin li img:hover{opacity:.8;filter:Alpha(opacity=80)}.layui-layim-skin li cite{font-size:14px;font-style:normal}body .layui-layim-chat{background-color:#fff}body .layui-layim-chat-list{width:760px}body .layui-layim-chat .layui-layer-title{height:80px;border-bottom:none;background-color:#F8F8F8;background-color:rgba(245,245,245,.7)}body .layui-layim-chat .layui-layer-content{background:0 0}.layim-chat-list li *,.layui-layim-min .layui-layer-content *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:14px}.layim-chat-list{display:none;position:absolute;z-index:1000;top:-80px;width:200px;height:100%;background-color:#D9D9D9;overflow:hidden;font-size:0}.layim-chat-list:hover{overflow-y:auto}.layim-chat-list li,.layui-layim-min .layui-layer-content{position:relative;margin:5px;padding:5px 30px 5px 5px;line-height:40px;cursor:pointer;border-radius:3px}.layim-chat-list li img,.layui-layim-min .layui-layer-content img{width:40px;height:40px;border-radius:100%}.layui-layim-photos{cursor:crosshair}.layim-chat-list li{white-space:nowrap}.layim-chat-list li span,.layui-layim-min .layui-layer-content span{width:100px;padding-left:10px;font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layim-chat-list li span cite{color:#999;padding-left:10px}.layim-chat-list li:hover{background-color:#E2E2E2}.layim-chat-list li.layim-this{background-color:#F3F3F3}.layim-chat-list li .layui-icon{display:none;position:absolute;right:5px;top:7px;color:#555;font-size:22px}.layim-chat-list li .layui-icon:hover{color:#c00}.layim-chat-list li:hover .layui-icon{display:inline-block}.layim-chat-system{margin:10px 0;text-align:center}.layim-chat-system span{display:inline-block;line-height:30px;padding:0 15px;border-radius:3px;background-color:#e2e2e2;cursor:default;font-size:14px}.layim-chat{display:none;position:relative;background-color:#fff;background-color:rgba(255,255,255,.9)}.layim-chat-title{position:absolute;top:-80px;height:80px}.layim-chat-other{position:relative;top:15px;left:15px;padding-left:60px;cursor:default}.layim-chat-other img{position:absolute;left:0;top:0;width:50px;height:50px;border-radius:100%}.layim-chat-username{position:relative;top:5px;font-size:18px}.layim-chat-status{margin-top:6px;font-size:14px;color:#999}.layim-chat-group .layim-chat-other .layim-chat-username{cursor:pointer}.layim-chat-group .layim-chat-other .layim-chat-username em{padding:0 10px;color:#999}.layim-chat-main{height:262px;padding:15px 15px 5px;overflow-x:hidden;overflow-y:auto}.layim-chat-main ul li{position:relative;font-size:0;margin-bottom:10px;padding-left:60px;min-height:68px}.layim-chat-text,.layim-chat-user{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:14px}.layim-chat-user{position:absolute;left:3px}.layim-chat-user img{width:40px;height:40px;border-radius:100%}.layim-chat-user cite{position:absolute;left:60px;top:-2px;width:500px;line-height:24px;font-size:12px;white-space:nowrap;color:#999;text-align:left;font-style:normal}.layim-chat-user cite i{padding-left:15px;font-style:normal}.layim-chat-text{position:relative;line-height:22px;margin-top:25px;padding:8px 15px;background-color:#e2e2e2;border-radius:3px;color:#333;word-break:break-all;max-width:462px\9}.layim-chat-text:after{content:'';position:absolute;left:-10px;top:13px;width:0;height:0;border-style:solid dashed dashed;border-color:#e2e2e2 transparent transparent;overflow:hidden;border-width:10px}.layim-chat-text a{color:#33DF83}.layim-chat-text img{max-width:100%;vertical-align:middle}.layim-chat-text .layui-layim-file,.layui-layim-file{display:block;text-align:center}.layim-chat-text .layui-layim-file{color:#333}.layui-layim-file:hover{opacity:.9}.layui-layim-file i{font-size:80px;line-height:80px}.layui-layim-file cite{display:block;line-height:20px;font-size:14px}.layui-layim-audio{text-align:center;cursor:pointer}.layui-layim-audio .layui-icon{position:relative;top:5px;font-size:24px}.layui-layim-audio p{margin-top:3px}.layui-layim-video{width:120px;height:80px;line-height:80px;background-color:#333;text-align:center;border-radius:3px}.layui-layim-video .layui-icon{font-size:36px;cursor:pointer;color:#fff}.layim-chat-main ul .layim-chat-system{min-height:0;padding:0}.layim-chat-main ul .layim-chat-mine{text-align:right;padding-left:0;padding-right:60px}.layim-chat-mine .layim-chat-user{left:auto;right:3px}.layim-chat-mine .layim-chat-user cite{left:auto;right:60px;text-align:right}.layim-chat-mine .layim-chat-user cite i{padding-left:0;padding-right:15px}.layim-chat-mine .layim-chat-text{margin-left:0;text-align:left;background-color:#5FB878;color:#fff}.layim-chat-mine .layim-chat-text:after{left:auto;right:-10px;border-top-color:#5FB878}.layim-chat-mine .layim-chat-text a{color:#fff}.layim-chat-footer{border-top:1px solid #F1F1F1}.layim-chat-tool{position:relative;padding:0 8px;height:38px;line-height:38px;font-size:0}.layim-chat-tool span{position:relative;margin:0 10px;display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:24px;cursor:pointer}.layim-chat-tool .layim-tool-log{position:absolute;right:5px;font-size:14px}.layim-tool-log i{position:relative;top:2px;margin-right:5px;font-size:20px;color:#999}.layim-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}body .layui-layim-face{margin:10px 0 0 -18px;border:none;background:0 0}body .layui-layim-face .layui-layer-content{padding:0;background-color:#fff;color:#666;box-shadow:none}.layui-layim-face .layui-layer-TipsG{display:none}.layui-layim-face ul{position:relative;width:372px;padding:10px;border:1px solid #D9D9D9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-layim-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-layim-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layim-chat-textarea{margin-left:10px}.layim-chat-textarea textarea{display:block;width:100%;padding:5px 0 0;height:68px;line-height:20px;border:none;overflow:auto;resize:none;background:0 0}.layim-chat-textarea textarea:focus{outline:0}.layim-chat-bottom{position:relative;height:46px}.layim-chat-send{position:absolute;right:15px;top:3px;height:32px;line-height:32px;font-size:0;cursor:pointer}.layim-chat-send span{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:14px;line-height:32px;margin-left:5px;padding:0 20px;background-color:#5FB878;color:#fff;border-radius:3px}.layim-chat-send span:hover{background-color:#69BC80}.layim-chat-send span:active{background-color:#59B573}.layim-chat-send .layim-send-btn{border-radius:3px 0 0 3px}.layim-chat-send .layim-send-set{position:relative;width:30px;height:32px;margin-left:0;padding:0;border-left:1px solid #85C998;border-radius:0 3px 3px 0}.layim-send-set .layui-edge{position:absolute;top:14px;left:9px;border-width:6px;border-top-style:solid;border-top-color:#fff}.layim-chat-send .layim-menu-box{left:auto;right:0;top:33px;width:180px;padding:10px 0}.layim-chat-send .layim-menu-box li{padding-right:15px;line-height:28px}body .layui-layim-min{border:1px solid #D9D9D9}.layui-layim-min .layui-layer-content{margin:0 5px;padding:5px 10px;white-space:nowrap}.layui-layim-close .layui-layer-content span{width:auto;max-width:120px}body .layui-layim-members{margin:25px 0 0 -75px;border:none;background:0 0}body .layui-layim-members .layui-layer-content{padding:0;background:0 0;color:#666;box-shadow:none}.layui-layim-members .layui-layer-TipsG{display:none}.layui-layim-members ul{position:relative;width:578px;height:200px;padding:10px 10px 0;border:1px solid #D9D9D9;background-color:#fff;background-color:rgba(255,255,255,.9);box-shadow:none;overflow:hidden;font-size:0}.layui-layim-members ul:hover{overflow:auto}.layim-add-img,.layim-add-remark,.layui-layim-members li{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:14px}.layui-layim-members li{width:112px;margin:10px 0;text-align:center}.layui-layim-members li a{position:relative;display:inline-block;max-width:100%}.layui-layim-members li a:after{content:'';position:absolute;width:46px;height:46px;left:50%;margin-left:-23px;top:0;border:1px solid #eee;border-color:rgba(0,0,0,.1);border-radius:100%}.layui-layim-members li img{width:48px;height:48px;border-radius:100%}.layui-layim-members li:hover{opacity:.9}.layui-layim-members li a cite{display:block;padding:0 3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}body .layui-layim-contextmenu{margin:70px 0 0 30px;width:200px;padding:5px 0;border:1px solid #ccc;background:#fff;border-radius:0;box-shadow:0 0 5px rgba(0,0,0,.2)}body .layui-layim-contextmenu .layui-layer-content{padding:0;background-color:#fff;color:#333;font-size:14px;box-shadow:none}.layui-layim-contextmenu .layui-layer-TipsG{display:none}.layui-layim-contextmenu li{padding:0 15px 0 35px;cursor:pointer;line-height:30px}.layui-layim-contextmenu li:hover{background-color:#F2F2F2}.layim-add-box{margin:15px;font-size:0}.layim-add-img img,.layim-add-remark p{margin-bottom:10px}.layim-add-img{width:100px;margin-right:20px;text-align:center}.layim-add-img img{width:100px;height:100px}.layim-add-remark{width:280px}.layim-add-remark .layui-select{width:100%;margin-bottom:10px}.layim-add-remark .layui-textarea{height:80px;min-height:80px;resize:none}.layim-tab-content,.layui-layim-face ul,.layui-layim-tab{margin-bottom:0}.layim-tab-content li h5{margin-top:0;margin-bottom:0},.layui-layim-face img{vertical-align:bottom}.layim-chat-other span{color:#444}.layim-chat-other span cite{padding:0 15px;color:#999}.layim-chat-other:hover{text-decoration:none} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/mobile/layim.css b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/mobile/layim.css new file mode 100644 index 0000000..3127160 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/mobile/layim.css @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ +.layim-tab-content li h5,.layui-layim-list li{border-bottom:1px solid #f2f2f2;cursor:pointer}html #layuicss-skinlayim-mobilecss{display:none;position:absolute;width:1989px}.layim-tab-content li h5 *,.layui-layim-skin li,.layui-layim-tab li,.layui-layim-tool li{display:inline-block;vertical-align:top;*zoom:1;*display:inline}.layim-tab-content li h5 span,.layui-layim-list li p,.layui-layim-list li span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layui-layim-tab{position:absolute;bottom:0;left:0;right:0;height:50px;border-top:1px solid #f2f2f2;background-color:#fff}.layui-layim-tab li{position:relative;width:33.33%;height:50px;text-align:center;color:#666;color:rgba(0,0,0,.6);cursor:pointer}.layui-layim-tab li .layui-icon{position:relative;top:7px;font-size:25px}.layui-layim-tab li span{position:relative;bottom:-3px;display:block;font-size:12px}.layui-layim-tab li[lay-type=more] .layui-icon{top:4px;font-size:22px}.layui-layim-tab li.layim-this{color:#3FDD86}.layim-new{display:none;position:absolute;top:5px;left:50%;margin-left:15px;width:10px;height:10px;border-radius:10px;background-color:#F74C31;color:#fff}.layim-list-top .layim-new{position:relative;vertical-align:top;top:10px;left:initial;margin-left:5px}.layim-list-top i.layui-show{display:inline-block!important}.layim-tab-content,.layim-tab-content li ul{display:none}.layui-layim{position:fixed;left:0;right:0;top:50px;bottom:50px;overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch}.layim-tab-content li h5{position:relative;padding-left:35px;height:45px;line-height:45px;font-size:0;white-space:nowrap;overflow:hidden}.layim-tab-content li h5 *{font-size:17px}.layim-tab-content li h5 span{max-width:80%}.layim-tab-content li h5 i{position:absolute;left:12px;top:0;color:#C9BDBB}.layim-tab-content li h5 em{padding-left:5px;color:#999}.layim-list-friend,.layim-list-group{background-color:#fff}.layui-layim-list li{position:relative;height:42px;padding:5px 15px 5px 60px;font-size:0}.layui-layim-list li:active{background-color:#F2F2F2;background-color:rgba(0,0,0,.05)}.layui-layim-list li.layim-null{height:20px;line-height:20px;padding:10px 0;color:#999;text-align:center;cursor:default;font-size:14px}.layim-list-history li.layim-null{padding:30px 0;border-bottom:none;background-color:#eee}.layui-layim-list li *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:17px}.layui-layim-list li span{margin-top:2px;max-width:155px;font-size:17px}.layui-layim-list li img{position:absolute;left:12px;top:8px;width:36px;height:36px;border-radius:100%}.layui-layim-list li p{display:block;padding-right:30px;line-height:18px;font-size:13px;color:#999}.layui-layim-list li .layim-msg-status{display:none;position:absolute;right:10px;bottom:7px;padding:0 5px;height:17px;line-height:17px;border-radius:17px;text-align:center;font-size:10px;background-color:#F74C31;color:#fff}.layim-list-gray{-webkit-filter:grayscale(100%);-ms-filter:grayscale(100%);filter:grayscale(100%);filter:gray}.layim-list-top{background-color:#fff;font-size:17px}.layim-list-top li{position:relative;padding:0 15px 0 50px;line-height:45px;border-bottom:1px solid #f2f2f2;cursor:pointer}.layim-list-top li:last-child{margin-bottom:10px;border-bottom:none}.layim-list-top li .layui-icon{position:absolute;left:12px;top:0;margin-right:10px;color:#36373C;font-size:24px}.layim-list-top li[layim-event=newFriend] .layui-icon{left:15px}.layim-panel,.layim-title{position:fixed;left:0;right:0;top:0}.layim-list-top li[layim-event=group] .layui-icon{font-size:20px}.layim-list-top li[layim-event=about] .layui-icon{font-size:25px}.layim-panel{bottom:0;background-color:#eee;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}.layim-title{height:50px;line-height:50px;padding:0 15px;background-color:#36373C;color:#fff;font-size:18px}.layim-chat-status{padding-left:15px;font-size:14px;opacity:.7}.layim-title .layim-chat-back{display:inline-block;vertical-align:middle;position:relative;padding:0 15px;margin-left:-10px;top:0;font-size:24px;cursor:pointer}.layim-chat-detail{position:absolute;right:0;top:0;padding:0 15px;font-size:18px;cursor:pointer}.layim-chat-main,.layim-content{position:fixed;top:50px;left:0;right:0;overflow-y:auto;overflow-x:hidden}.layim-chat-detail:active,.layim-title .layim-chat-back:active{opacity:.8}.layui-layim .layim-title{text-align:left}.layui-layim .layim-title p{padding:0 15px}.layim-content{bottom:0}.layim-chat-main{width:100%;bottom:85px;padding:15px;-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layim-chat-main ul{overflow-x:hidden}.layim-chat-main ul li{position:relative;font-size:0;margin-bottom:10px;padding-left:60px;min-height:68px}.layim-chat-text,.layim-chat-user{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:15px}.layim-chat-user{position:absolute;left:3px}.layim-chat-user img{width:40px;height:40px;border-radius:100%}.layim-chat-user cite{position:absolute;left:60px;top:-2px;width:500px;line-height:24px;font-size:12px;white-space:nowrap;color:#999;text-align:left;font-style:normal}.layim-chat-user cite i{padding-left:15px;font-style:normal}.layim-chat-text{position:relative;min-height:22px;line-height:22px;margin-top:25px;padding:8px 15px;background-color:#fff;border-radius:3px;color:#333;word-break:break-all}.layim-chat-text:after{content:'';position:absolute;left:-10px;top:13px;width:0;height:0;border-style:solid dashed dashed;border-color:#fff transparent transparent;overflow:hidden;border-width:10px}.layim-chat-text a{color:#33DF83}.layim-chat-text img{max-width:100%;vertical-align:middle}.layim-chat-text .layui-layim-file,.layui-layim-file{display:block;text-align:center}.layim-chat-text .layui-layim-file{color:#333}.layui-layim-file:active{opacity:.9}.layui-layim-file i{font-size:80px;line-height:80px}.layui-layim-file cite{display:block;line-height:20px;font-size:17px}.layui-layim-audio{text-align:center;cursor:pointer}.layui-layim-audio .layui-icon{position:relative;top:5px;font-size:24px}.layui-layim-audio p{margin-top:3px}.layui-layim-video{width:120px;height:80px;line-height:80px;background-color:#333;text-align:center;border-radius:3px}.layui-layim-video .layui-icon{font-size:36px;cursor:pointer;color:#fff}.layim-chat-main ul .layim-chat-mine{text-align:right;padding-left:0;padding-right:60px}.layim-chat-mine .layim-chat-user{left:auto;right:3px}.layim-chat-mine .layim-chat-user cite{left:auto;right:60px;text-align:right}.layim-chat-mine .layim-chat-user cite i{padding-left:0;padding-right:15px}.layim-chat-mine .layim-chat-text{margin-left:0;text-align:left;background-color:#5FB878;color:#fff}.layim-chat-mine .layim-chat-text:after{left:auto;right:-10px;border-top-color:#5FB878}.layim-chat-mine .layim-chat-text a{color:#fff}.layim-chat-main ul .layim-chat-system{min-height:0;margin:20px 0 5px;padding:0}.layim-chat-system{margin:10px 0;text-align:center}.layim-chat-system span{display:inline-block;line-height:30px;padding:0 15px;border-radius:3px;background-color:#ddd;color:#fff;font-size:14px;cursor:pointer}.layim-chat-footer{position:fixed;bottom:0;left:10px;right:10px;height:80px}.layim-chat-send{display:-webkit-box;display:-webkit-flex;display:flex}.layim-chat-send input{-webkit-box-flex:1;-webkit-flex:1;flex:1;height:40px;padding-left:5px;border:0;background-color:#fff;border-radius:3px}.layim-chat-send button{border-radius:3px;height:40px;padding:0 20px;border:0;margin-left:10px;background-color:#5FB878;color:#fff}.layim-chat-tool{position:relative;width:100%;overflow-x:auto;padding:0;height:38px;line-height:38px;margin-top:3px;font-size:0;white-space:nowrap}.layim-chat-tool span{position:relative;margin:0 15px;display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:28px;cursor:pointer}.layim-chat-tool .layim-tool-log{position:absolute;right:5px;font-size:14px}.layim-tool-log i{position:relative;top:2px;margin-right:5px;font-size:20px;color:#999}.layim-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layim-layer{position:fixed;bottom:85px;left:10px;right:10px;margin:0 auto}.layui-layim-face{position:relative;max-height:180px;overflow:auto;padding:10px;font-size:0}.layui-layim-face li{cursor:pointer;display:inline-block;vertical-align:bottom;padding:5px 2px;text-align:center;width:10%;-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-layim-face li img{width:22px;height:22px}.layim-about{font-size:17px}.layim-about .layui-m-layercont{text-align:left}.layim-about .layui-m-layercont p{line-height:30px}.layim-about .layui-m-layercont a{color:#01AAED} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/skin/1.jpg b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/skin/1.jpg new file mode 100644 index 0000000..d9f9926 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/skin/1.jpg differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/skin/2.jpg b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/skin/2.jpg new file mode 100644 index 0000000..0bffb50 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/skin/2.jpg differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/skin/3.jpg b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/skin/3.jpg new file mode 100644 index 0000000..53ba921 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/skin/3.jpg differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/skin/4.jpg b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/skin/4.jpg new file mode 100644 index 0000000..83b4738 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/skin/4.jpg differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/skin/5.jpg b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/skin/5.jpg new file mode 100644 index 0000000..8ed74b9 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/skin/5.jpg differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/skin/logo.jpg b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/skin/logo.jpg new file mode 100644 index 0000000..26c7358 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/skin/logo.jpg differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/voice/default.mp3 b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/voice/default.mp3 new file mode 100644 index 0000000..90013c5 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/css/modules/layim/voice/default.mp3 differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/font/iconfont.eot b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/font/iconfont.eot new file mode 100644 index 0000000..3164c9f Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/font/iconfont.eot differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/font/iconfont.svg b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/font/iconfont.svg new file mode 100644 index 0000000..5151073 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/font/iconfont.svg @@ -0,0 +1,409 @@ + + + + Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/font/iconfont.ttf b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/font/iconfont.ttf new file mode 100644 index 0000000..8f49efb Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/font/iconfont.ttf differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/font/iconfont.woff b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/font/iconfont.woff new file mode 100644 index 0000000..62d3491 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/font/iconfont.woff differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/font/iconfont.woff2 b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/font/iconfont.woff2 new file mode 100644 index 0000000..a3d8774 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/font/iconfont.woff2 differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/0.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/0.gif new file mode 100644 index 0000000..a63f0d5 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/0.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/1.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/1.gif new file mode 100644 index 0000000..b2b78b2 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/1.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/10.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/10.gif new file mode 100644 index 0000000..556c7e3 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/10.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/11.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/11.gif new file mode 100644 index 0000000..2bfc58b Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/11.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/12.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/12.gif new file mode 100644 index 0000000..1c321c7 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/12.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/13.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/13.gif new file mode 100644 index 0000000..300bbc2 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/13.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/14.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/14.gif new file mode 100644 index 0000000..43b6d0a Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/14.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/15.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/15.gif new file mode 100644 index 0000000..c9f25fa Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/15.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/16.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/16.gif new file mode 100644 index 0000000..34f28e4 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/16.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/17.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/17.gif new file mode 100644 index 0000000..39cd035 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/17.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/18.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/18.gif new file mode 100644 index 0000000..7bce299 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/18.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/19.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/19.gif new file mode 100644 index 0000000..adac542 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/19.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/2.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/2.gif new file mode 100644 index 0000000..7edbb58 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/2.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/20.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/20.gif new file mode 100644 index 0000000..50631a6 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/20.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/21.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/21.gif new file mode 100644 index 0000000..b984212 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/21.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/22.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/22.gif new file mode 100644 index 0000000..1f0bd8b Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/22.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/23.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/23.gif new file mode 100644 index 0000000..e05e0f9 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/23.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/24.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/24.gif new file mode 100644 index 0000000..f35928a Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/24.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/25.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/25.gif new file mode 100644 index 0000000..0b4a883 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/25.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/26.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/26.gif new file mode 100644 index 0000000..45c4fb5 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/26.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/27.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/27.gif new file mode 100644 index 0000000..7a4c013 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/27.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/28.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/28.gif new file mode 100644 index 0000000..fc5a0cf Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/28.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/29.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/29.gif new file mode 100644 index 0000000..5dd7442 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/29.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/3.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/3.gif new file mode 100644 index 0000000..86df67b Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/3.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/30.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/30.gif new file mode 100644 index 0000000..b751f98 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/30.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/31.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/31.gif new file mode 100644 index 0000000..c9476d7 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/31.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/32.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/32.gif new file mode 100644 index 0000000..9931b06 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/32.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/33.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/33.gif new file mode 100644 index 0000000..59111a3 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/33.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/34.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/34.gif new file mode 100644 index 0000000..a334548 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/34.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/35.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/35.gif new file mode 100644 index 0000000..a932264 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/35.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/36.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/36.gif new file mode 100644 index 0000000..6de432a Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/36.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/37.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/37.gif new file mode 100644 index 0000000..d05f2da Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/37.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/38.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/38.gif new file mode 100644 index 0000000..8b1c88a Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/38.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/39.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/39.gif new file mode 100644 index 0000000..38b84a5 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/39.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/4.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/4.gif new file mode 100644 index 0000000..d52200c Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/4.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/40.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/40.gif new file mode 100644 index 0000000..ae42991 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/40.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/41.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/41.gif new file mode 100644 index 0000000..b9c715c Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/41.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/42.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/42.gif new file mode 100644 index 0000000..0eb1434 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/42.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/43.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/43.gif new file mode 100644 index 0000000..ac0b700 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/43.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/44.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/44.gif new file mode 100644 index 0000000..ad44497 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/44.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/45.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/45.gif new file mode 100644 index 0000000..6837fca Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/45.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/46.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/46.gif new file mode 100644 index 0000000..d62916d Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/46.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/47.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/47.gif new file mode 100644 index 0000000..58a0836 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/47.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/48.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/48.gif new file mode 100644 index 0000000..7ffd161 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/48.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/49.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/49.gif new file mode 100644 index 0000000..959b992 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/49.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/5.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/5.gif new file mode 100644 index 0000000..4e8b09f Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/5.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/50.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/50.gif new file mode 100644 index 0000000..6e22e7f Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/50.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/51.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/51.gif new file mode 100644 index 0000000..ad3f4d3 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/51.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/52.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/52.gif new file mode 100644 index 0000000..39f8a22 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/52.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/53.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/53.gif new file mode 100644 index 0000000..a181ee7 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/53.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/54.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/54.gif new file mode 100644 index 0000000..e289d92 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/54.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/55.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/55.gif new file mode 100644 index 0000000..4351083 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/55.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/56.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/56.gif new file mode 100644 index 0000000..e0eff22 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/56.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/57.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/57.gif new file mode 100644 index 0000000..0bf130f Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/57.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/58.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/58.gif new file mode 100644 index 0000000..0f06508 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/58.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/59.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/59.gif new file mode 100644 index 0000000..7081e4f Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/59.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/6.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/6.gif new file mode 100644 index 0000000..f7715bf Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/6.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/60.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/60.gif new file mode 100644 index 0000000..6e15f89 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/60.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/61.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/61.gif new file mode 100644 index 0000000..f092d7e Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/61.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/62.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/62.gif new file mode 100644 index 0000000..7fe4984 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/62.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/63.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/63.gif new file mode 100644 index 0000000..cf8e23e Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/63.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/64.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/64.gif new file mode 100644 index 0000000..a779719 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/64.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/65.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/65.gif new file mode 100644 index 0000000..7bb98f2 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/65.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/66.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/66.gif new file mode 100644 index 0000000..bb6d077 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/66.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/67.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/67.gif new file mode 100644 index 0000000..6e33f7c Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/67.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/68.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/68.gif new file mode 100644 index 0000000..1a6c400 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/68.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/69.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/69.gif new file mode 100644 index 0000000..a02f0b2 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/69.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/7.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/7.gif new file mode 100644 index 0000000..e6d4db8 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/7.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/70.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/70.gif new file mode 100644 index 0000000..416c5c1 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/70.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/71.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/71.gif new file mode 100644 index 0000000..c17d60c Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/71.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/8.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/8.gif new file mode 100644 index 0000000..66f967b Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/8.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/9.gif b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/9.gif new file mode 100644 index 0000000..6044740 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/images/face/9.gif differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/carousel.js b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/carousel.js new file mode 100644 index 0000000..2c4521b --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/carousel.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t="carousel",a="layui-this",l=">*[carousel-item]>*",o="layui-carousel-left",r="layui-carousel-right",d="layui-carousel-prev",s="layui-carousel-next",u="layui-carousel-arrow",c="layui-carousel-ind",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(a),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(clearInterval(e.timer),e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['",'"].join(""));n.elem.attr("lay-arrow",n.arrow),n.elem.find("."+u)[0]&&n.elem.find("."+u).remove(),n.elem.append(t),t.on("click",function(){var n=i(this),t=n.attr("lay-type");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['
                            ',function(){var i=[];return layui.each(e.elemItem,function(e){i.push("")}),i.join("")}(),"
                          "].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+c)[0]&&n.elem.find("."+c).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-(t.height()/2)),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide("add",a-n.index):a/g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('
                          1. '+o.replace(/[\r\t\n]+/g,"
                          2. ")+"
                          "),c.find(">.layui-code-h3")[0]||c.prepend('

                          '+(c.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"

                          ");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/colorpicker.js b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/colorpicker.js new file mode 100644 index 0000000..0fc6395 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/colorpicker.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var i=layui.jquery,o={config:{},index:layui.colorpicker?layui.colorpicker.index+1e4:0,set:function(e){var o=this;return o.config=i.extend({},o.config,e),o},on:function(e,i){return layui.onevent.call(this,"colorpicker",e,i)}},r=function(){var e=this,i=e.config;return{config:i}},t="colorpicker",n="layui-show",l="layui-colorpicker",c=".layui-colorpicker-main",a="layui-icon-down",s="layui-icon-close",f="layui-colorpicker-trigger-span",d="layui-colorpicker-trigger-i",u="layui-colorpicker-side",p="layui-colorpicker-side-slider",g="layui-colorpicker-basis",v="layui-colorpicker-alpha-bgcolor",h="layui-colorpicker-alpha-slider",m="layui-colorpicker-basis-cursor",b="layui-colorpicker-main-input",k=function(e){var i={h:0,s:0,b:0},o=Math.min(e.r,e.g,e.b),r=Math.max(e.r,e.g,e.b),t=r-o;return i.b=r,i.s=0!=r?255*t/r:0,0!=i.s?e.r==r?i.h=(e.g-e.b)/t:e.g==r?i.h=2+(e.b-e.r)/t:i.h=4+(e.r-e.g)/t:i.h=-1,r==o&&(i.h=0),i.h*=60,i.h<0&&(i.h+=360),i.s*=100/255,i.b*=100/255,i},y=function(e){var e=e.indexOf("#")>-1?e.substring(1):e;if(3==e.length){var i=e.split("");e=i[0]+i[0]+i[1]+i[1]+i[2]+i[2]}e=parseInt(e,16);var o={r:e>>16,g:(65280&e)>>8,b:255&e};return k(o)},x=function(e){var i={},o=e.h,r=255*e.s/100,t=255*e.b/100;if(0==r)i.r=i.g=i.b=t;else{var n=t,l=(255-r)*t/255,c=(n-l)*(o%60)/60;360==o&&(o=0),o<60?(i.r=n,i.b=l,i.g=l+c):o<120?(i.g=n,i.b=l,i.r=n-c):o<180?(i.g=n,i.r=l,i.b=l+c):o<240?(i.b=n,i.r=l,i.g=n-c):o<300?(i.b=n,i.g=l,i.r=l+c):o<360?(i.r=n,i.g=l,i.b=n-c):(i.r=0,i.g=0,i.b=0)}return{r:Math.round(i.r),g:Math.round(i.g),b:Math.round(i.b)}},C=function(e){var o=x(e),r=[o.r.toString(16),o.g.toString(16),o.b.toString(16)];return i.each(r,function(e,i){1==i.length&&(r[e]="0"+i)}),r.join("")},P=function(e){var i=/[0-9]{1,3}/g,o=e.match(i)||[];return{r:o[0],g:o[1],b:o[2]}},B=i(window),w=i(document),D=function(e){var r=this;r.index=++o.index,r.config=i.extend({},r.config,o.config,e),r.render()};D.prototype.config={color:"",size:null,alpha:!1,format:"hex",predefine:!1,colors:["#009688","#5FB878","#1E9FFF","#FF5722","#FFB800","#01AAED","#999","#c00","#ff8c00","#ffd700","#90ee90","#00ced1","#1e90ff","#c71585","rgb(0, 186, 189)","rgb(255, 120, 0)","rgb(250, 212, 0)","#393D49","rgba(0,0,0,.5)","rgba(255, 69, 0, 0.68)","rgba(144, 240, 144, 0.5)","rgba(31, 147, 255, 0.73)"]},D.prototype.render=function(){var e=this,o=e.config,r=i(['
                          ',"",'3&&(o.alpha&&"rgb"==o.format||(e="#"+C(k(P(o.color))))),"background: "+e):e}()+'">','',"","","
                          "].join("")),t=i(o.elem);o.size&&r.addClass("layui-colorpicker-"+o.size),t.addClass("layui-inline").html(e.elemColorBox=r),e.color=e.elemColorBox.find("."+f)[0].style.background,e.events()},D.prototype.renderPicker=function(){var e=this,o=e.config,r=e.elemColorBox[0],t=e.elemPicker=i(['
                          ','
                          ','
                          ','
                          ','
                          ','
                          ',"
                          ",'
                          ','
                          ',"
                          ","
                          ",'
                          ','
                          ','
                          ',"
                          ","
                          ",function(){if(o.predefine){var e=['
                          '];return layui.each(o.colors,function(i,o){e.push(['
                          ','
                          ',"
                          "].join(""))}),e.push("
                          "),e.join("")}return""}(),'
                          ','
                          ','',"
                          ",'
                          ','','',"","
                          "].join(""));e.elemColorBox.find("."+f)[0];i(c)[0]&&i(c).data("index")==e.index?e.removePicker(D.thisElemInd):(e.removePicker(D.thisElemInd),i("body").append(t)),D.thisElemInd=e.index,D.thisColor=r.style.background,e.position(),e.pickerEvents()},D.prototype.removePicker=function(e){var o=this;o.config;return i("#layui-colorpicker"+(e||o.index)).remove(),o},D.prototype.position=function(){var e=this,i=e.config,o=e.bindElem||e.elemColorBox[0],r=e.elemPicker[0],t=o.getBoundingClientRect(),n=r.offsetWidth,l=r.offsetHeight,c=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},a=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},s=5,f=t.left,d=t.bottom;f-=(n-o.offsetWidth)/2,d+=s,f+n+s>a("width")?f=a("width")-n-s:fa()&&(d=t.top>l?t.top-l:a()-l,d-=2*s),i.position&&(r.style.position=i.position),r.style.left=f+("fixed"===i.position?0:c(1))+"px",r.style.top=d+("fixed"===i.position?0:c())+"px"},D.prototype.val=function(){var e=this,i=(e.config,e.elemColorBox.find("."+f)),o=e.elemPicker.find("."+b),r=i[0],t=r.style.backgroundColor;if(t){var n=k(P(t)),l=i.attr("lay-type");if(e.select(n.h,n.s,n.b),"torgb"===l&&o.find("input").val(t),"rgba"===l){var c=P(t);if(3==(t.match(/[0-9]{1,3}/g)||[]).length)o.find("input").val("rgba("+c.r+", "+c.g+", "+c.b+", 1)"),e.elemPicker.find("."+h).css("left",280);else{o.find("input").val(t);var a=280*t.slice(t.lastIndexOf(",")+1,t.length-1);e.elemPicker.find("."+h).css("left",a)}e.elemPicker.find("."+v)[0].style.background="linear-gradient(to right, rgba("+c.r+", "+c.g+", "+c.b+", 0), rgb("+c.r+", "+c.g+", "+c.b+"))"}}else e.select(0,100,100),o.find("input").val(""),e.elemPicker.find("."+v)[0].style.background="",e.elemPicker.find("."+h).css("left",280)},D.prototype.side=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=r.attr("lay-type"),n=e.elemPicker.find("."+u),l=e.elemPicker.find("."+p),c=e.elemPicker.find("."+g),y=e.elemPicker.find("."+m),C=e.elemPicker.find("."+v),w=e.elemPicker.find("."+h),D=l[0].offsetTop/180*360,E=100-(y[0].offsetTop+3)/180*100,H=(y[0].offsetLeft+3)/260*100,W=Math.round(w[0].offsetLeft/280*100)/100,j=e.elemColorBox.find("."+d),F=e.elemPicker.find(".layui-colorpicker-pre").children("div"),L=function(i,n,l,c){e.select(i,n,l);var f=x({h:i,s:n,b:l});if(j.addClass(a).removeClass(s),r[0].style.background="rgb("+f.r+", "+f.g+", "+f.b+")","torgb"===t&&e.elemPicker.find("."+b).find("input").val("rgb("+f.r+", "+f.g+", "+f.b+")"),"rgba"===t){var d=0;d=280*c,w.css("left",d),e.elemPicker.find("."+b).find("input").val("rgba("+f.r+", "+f.g+", "+f.b+", "+c+")"),r[0].style.background="rgba("+f.r+", "+f.g+", "+f.b+", "+c+")",C[0].style.background="linear-gradient(to right, rgba("+f.r+", "+f.g+", "+f.b+", 0), rgb("+f.r+", "+f.g+", "+f.b+"))"}o.change&&o.change(e.elemPicker.find("."+b).find("input").val())},M=i(['
                          t&&(r=t);var l=r/180*360;D=l,L(l,H,E,W),e.preventDefault()};Y(r),e.preventDefault()}),n.on("click",function(e){var o=e.clientY-i(this).offset().top;o<0&&(o=0),o>this.offsetHeight&&(o=this.offsetHeight);var r=o/180*360;D=r,L(r,H,E,W),e.preventDefault()}),y.on("mousedown",function(e){var i=this.offsetTop,o=this.offsetLeft,r=e.clientY,t=e.clientX,n=function(e){var n=i+(e.clientY-r),l=o+(e.clientX-t),a=c[0].offsetHeight-3,s=c[0].offsetWidth-3;n<-3&&(n=-3),n>a&&(n=a),l<-3&&(l=-3),l>s&&(l=s);var f=(l+3)/260*100,d=100-(n+3)/180*100;E=d,H=f,L(D,f,d,W),e.preventDefault()};layui.stope(e),Y(n),e.preventDefault()}),c.on("mousedown",function(e){var o=e.clientY-i(this).offset().top-3+B.scrollTop(),r=e.clientX-i(this).offset().left-3+B.scrollLeft();o<-3&&(o=-3),o>this.offsetHeight-3&&(o=this.offsetHeight-3),r<-3&&(r=-3),r>this.offsetWidth-3&&(r=this.offsetWidth-3);var t=(r+3)/260*100,n=100-(o+3)/180*100;E=n,H=t,L(D,t,n,W),e.preventDefault(),y.trigger(e,"mousedown")}),w.on("mousedown",function(e){var i=this.offsetLeft,o=e.clientX,r=function(e){var r=i+(e.clientX-o),t=C[0].offsetWidth;r<0&&(r=0),r>t&&(r=t);var n=Math.round(r/280*100)/100;W=n,L(D,H,E,n),e.preventDefault()};Y(r),e.preventDefault()}),C.on("click",function(e){var o=e.clientX-i(this).offset().left;o<0&&(o=0),o>this.offsetWidth&&(o=this.offsetWidth);var r=Math.round(o/280*100)/100;W=r,L(D,H,E,r),e.preventDefault()}),F.each(function(){i(this).on("click",function(){i(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e,o=this.style.backgroundColor,r=k(P(o)),t=o.slice(o.lastIndexOf(",")+1,o.length-1);D=r.h,H=r.s,E=r.b,3==(o.match(/[0-9]{1,3}/g)||[]).length&&(t=1),W=t,e=280*t,L(r.h,r.s,r.b,t)})})},D.prototype.select=function(e,i,o,r){var t=this,n=(t.config,C({h:e,s:100,b:100})),l=C({h:e,s:i,b:o}),c=e/360*180,a=180-o/100*180-3,s=i/100*260-3;t.elemPicker.find("."+p).css("top",c),t.elemPicker.find("."+g)[0].style.background="#"+n,t.elemPicker.find("."+m).css({top:a,left:s}),"change"!==r&&t.elemPicker.find("."+b).find("input").val("#"+l)},D.prototype.pickerEvents=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=e.elemPicker.find("."+b+" input"),n={clear:function(i){r[0].style.background="",e.elemColorBox.find("."+d).removeClass(a).addClass(s),e.color="",o.done&&o.done(""),e.removePicker()},confirm:function(i,n){var l=t.val(),c=l,f={};if(l.indexOf(",")>-1){if(f=k(P(l)),e.select(f.h,f.s,f.b),r[0].style.background=c="#"+C(f),(l.match(/[0-9]{1,3}/g)||[]).length>3&&"rgba"===r.attr("lay-type")){var u=280*l.slice(l.lastIndexOf(",")+1,l.length-1);e.elemPicker.find("."+h).css("left",u),r[0].style.background=l,c=l}}else f=y(l),r[0].style.background=c="#"+C(f),e.elemColorBox.find("."+d).removeClass(s).addClass(a);return"change"===n?(e.select(f.h,f.s,f.b,n),void(o.change&&o.change(c))):(e.color=l,o.done&&o.done(l),void e.removePicker())}};e.elemPicker.on("click","*[colorpicker-events]",function(){var e=i(this),o=e.attr("colorpicker-events");n[o]&&n[o].call(this,e)}),t.on("keyup",function(e){var o=i(this);n.confirm.call(this,o,13===e.keyCode?null:"change")})},D.prototype.events=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f);e.elemColorBox.on("click",function(){e.renderPicker(),i(c)[0]&&(e.val(),e.side())}),o.elem[0]&&!e.elemColorBox[0].eventHandler&&(w.on("click",function(o){if(!i(o.target).hasClass(l)&&!i(o.target).parents("."+l)[0]&&!i(o.target).hasClass(c.replace(/\./g,""))&&!i(o.target).parents(c)[0]&&e.elemPicker){if(e.color){var t=k(P(e.color));e.select(t.h,t.s,t.b)}else e.elemColorBox.find("."+d).removeClass(a).addClass(s);r[0].style.background=e.color||"",e.removePicker()}}),B.on("resize",function(){return!(!e.elemPicker||!i(c)[0])&&void e.position()}),e.elemColorBox[0].eventHandler=!0)},o.render=function(e){var i=new D(e);return r.call(i)},e(t,o)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/element.js b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/element.js new file mode 100644 index 0000000..290a1e8 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/element.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(t){"use strict";var a=layui.$,i=(layui.hint(),layui.device()),e="element",l="layui-this",n="layui-show",s=function(){this.config={}};s.prototype.set=function(t){var i=this;return a.extend(!0,i.config,t),i},s.prototype.on=function(t,a){return layui.onevent.call(this,e,t,a)},s.prototype.tabAdd=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.children(".layui-tab-bar"),o=l.children(".layui-tab-content"),r='
                        • "+(i.title||"unnaming")+"
                        • ";return s[0]?s.before(r):n.append(r),o.append('
                          '+(i.content||"")+"
                          "),f.hideTabMore(!0),f.tabAuto(),this},s.prototype.tabDelete=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabDelete(null,s),this},s.prototype.tabChange=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabClick.call(s[0],null,null,s),this},s.prototype.tab=function(t){t=t||{},b.on("click",t.headerElem,function(i){var e=a(this).index();f.tabClick.call(this,i,e,null,t)})},s.prototype.progress=function(t,i){var e="layui-progress",l=a("."+e+"[lay-filter="+t+"]"),n=l.find("."+e+"-bar"),s=n.find("."+e+"-text");return n.css("width",i),s.text(i),this};var o=".layui-nav",r="layui-nav-item",c="layui-nav-bar",u="layui-nav-tree",d="layui-nav-child",y="layui-nav-more",h="layui-anim layui-anim-upbit",f={tabClick:function(t,i,s,o){o=o||{};var r=s||a(this),i=i||r.parent().children("li").index(r),c=o.headerElem?r.parent():r.parents(".layui-tab").eq(0),u=o.bodyElem?a(o.bodyElem):c.children(".layui-tab-content").children(".layui-tab-item"),d=r.find("a"),y=c.attr("lay-filter");"javascript:;"!==d.attr("href")&&"_blank"===d.attr("target")||(r.addClass(l).siblings().removeClass(l),u.eq(i).addClass(n).siblings().removeClass(n)),layui.event.call(this,e,"tab("+y+")",{elem:c,index:i})},tabDelete:function(t,i){var n=i||a(this).parent(),s=n.index(),o=n.parents(".layui-tab").eq(0),r=o.children(".layui-tab-content").children(".layui-tab-item"),c=o.attr("lay-filter");n.hasClass(l)&&(n.next()[0]?f.tabClick.call(n.next()[0],null,s+1):n.prev()[0]&&f.tabClick.call(n.prev()[0],null,s-1)),n.remove(),r.eq(s).remove(),setTimeout(function(){f.tabAuto()},50),layui.event.call(this,e,"tabDelete("+c+")",{elem:o,index:s})},tabAuto:function(){var t="layui-tab-more",e="layui-tab-bar",l="layui-tab-close",n=this;a(".layui-tab").each(function(){var s=a(this),o=s.children(".layui-tab-title"),r=(s.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),c=a('');if(n===window&&8!=i.ie&&f.hideTabMore(!0),s.attr("lay-allowClose")&&o.find("li").each(function(){var t=a(this);if(!t.find("."+l)[0]){var i=a('ဆ');i.on("click",f.tabDelete),t.append(i)}}),"string"!=typeof s.attr("lay-unauto"))if(o.prop("scrollWidth")>o.outerWidth()+1){if(o.find("."+e)[0])return;o.append(c),s.attr("overflow",""),c.on("click",function(a){o[this.title?"removeClass":"addClass"](t),this.title=this.title?"":"收缩"})}else o.find("."+e).remove(),s.removeAttr("overflow")})},hideTabMore:function(t){var i=a(".layui-tab-title");t!==!0&&"tabmore"===a(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=a(this),i=t.parents(o),n=i.attr("lay-filter"),s=t.parent(),c=t.siblings("."+d),y="string"==typeof s.attr("lay-unselect");"javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||y||c[0]||(i.find("."+l).removeClass(l),s.addClass(l)),i.hasClass(u)&&(c.removeClass(h),c[0]&&(s["none"===c.css("display")?"addClass":"removeClass"](r+"ed"),"all"===i.attr("lay-shrink")&&s.siblings().removeClass(r+"ed"))),layui.event.call(this,e,"nav("+n+")",t)},collapse:function(){var t=a(this),i=t.find(".layui-colla-icon"),l=t.siblings(".layui-colla-content"),s=t.parents(".layui-collapse").eq(0),o=s.attr("lay-filter"),r="none"===l.css("display");if("string"==typeof s.attr("lay-accordion")){var c=s.children(".layui-colla-item").children("."+n);c.siblings(".layui-colla-title").children(".layui-colla-icon").html(""),c.removeClass(n)}l[r?"addClass":"removeClass"](n),i.html(r?"":""),layui.event.call(this,e,"collapse("+o+")",{title:t,content:l,show:r})}};s.prototype.init=function(t,e){var l=function(){return e?'[lay-filter="'+e+'"]':""}(),s={tab:function(){f.tabAuto.call({})},nav:function(){var t=200,e={},s={},p={},b=function(l,o,r){var c=a(this),f=c.find("."+d);o.hasClass(u)?l.css({top:c.position().top,height:c.children("a").outerHeight(),opacity:1}):(f.addClass(h),l.css({left:c.position().left+parseFloat(c.css("marginLeft")),top:c.position().top+c.height()-l.height()}),e[r]=setTimeout(function(){l.css({width:c.width(),opacity:1})},i.ie&&i.ie<10?0:t),clearTimeout(p[r]),"block"===f.css("display")&&clearTimeout(s[r]),s[r]=setTimeout(function(){f.addClass(n),c.find("."+y).addClass(y+"d")},300))};a(o+l).each(function(i){var l=a(this),o=a(''),h=l.find("."+r);l.find("."+c)[0]||(l.append(o),h.on("mouseenter",function(){b.call(this,o,l,i)}).on("mouseleave",function(){l.hasClass(u)||(clearTimeout(s[i]),s[i]=setTimeout(function(){l.find("."+d).removeClass(n),l.find("."+y).removeClass(y+"d")},300))}),l.on("mouseleave",function(){clearTimeout(e[i]),p[i]=setTimeout(function(){l.hasClass(u)?o.css({height:0,top:o.position().top+o.height()/2,opacity:0}):o.css({width:0,left:o.position().left+o.width()/2,opacity:0})},t)})),h.find("a").each(function(){var t=a(this),i=(t.parent(),t.siblings("."+d));i[0]&&!t.children("."+y)[0]&&t.append(''),t.off("click",f.clickThis).on("click",f.clickThis)})})},breadcrumb:function(){var t=".layui-breadcrumb";a(t+l).each(function(){var t=a(this),i="lay-separator",e=t.attr(i)||"/",l=t.find("a");l.next("span["+i+"]")[0]||(l.each(function(t){t!==l.length-1&&a(this).after(""+e+"")}),t.css("visibility","visible"))})},progress:function(){var t="layui-progress";a("."+t+l).each(function(){var i=a(this),e=i.find(".layui-progress-bar"),l=e.attr("lay-percent");e.css("width",function(){return/^.+\/.+$/.test(l)?100*new Function("return "+l)()+"%":l}()),i.attr("lay-showPercent")&&setTimeout(function(){e.html(''+l+"")},350)})},collapse:function(){var t="layui-collapse";a("."+t+l).each(function(){var t=a(this).find(".layui-colla-item");t.each(function(){var t=a(this),i=t.find(".layui-colla-title"),e=t.find(".layui-colla-content"),l="none"===e.css("display");i.find(".layui-colla-icon").remove(),i.append(''+(l?"":"")+""),i.off("click",f.collapse).on("click",f.collapse)})})}};return s[t]?s[t]():layui.each(s,function(t,a){a()})},s.prototype.render=s.prototype.init;var p=new s,b=a(document);p.render();var v=".layui-tab-title li";b.on("click",v,f.tabClick),b.on("click",f.hideTabMore),a(window).on("resize",f.tabAuto),t(e,p)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/flow.js b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/flow.js new file mode 100644 index 0000000..924c78d --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/flow.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var f=l(e.elem);if(f[0]){var m=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,v=e.end||"没有更多了",y=e.scrollElem&&e.scrollElem!==document,d="加载更多",h=l('");f.find(".layui-flow-more")[0]||f.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(v):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(m.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),!i&&f.width()&&(r=setTimeout(function(){var i=y?e.height():l(window).height(),n=y?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var m=e.attr("lay-src");layui.img(m,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",m).removeAttr("lay-src"),l[0]&&f(l),i++})}},f=function(e,o){var f=a?(o||n).height():l(window).height(),m=n.scrollTop(),u=m+f;if(t.lazyimg.elem=l(r),e)c(e,f);else for(var s=0;su)break}};if(f(),!o){var m;n.on("scroll",function(){var e=l(this);m&&clearTimeout(m),m=setTimeout(function(){f(null,e)},50)}),o=!0}return f},e("flow",new o)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/form.js b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/form.js new file mode 100644 index 0000000..818dd39 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/form.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define("layer",function(e){"use strict";var t=layui.$,i=layui.layer,a=layui.hint(),n=layui.device(),l="form",r=".layui-form",s="layui-this",o="layui-hide",c="layui-disabled",u=function(){this.config={verify:{required:[/[\S]+/,"必填项不能为空"],phone:[/^1\d{10}$/,"请输入正确的手机号"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"邮箱格式不正确"],url:[/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/,"链接格式不正确"],number:function(e){if(!e||isNaN(e))return"只能填写数字"},date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"日期格式不正确"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"请输入正确的身份证号"]}}};u.prototype.set=function(e){var i=this;return t.extend(!0,i.config,e),i},u.prototype.verify=function(e){var i=this;return t.extend(!0,i.config.verify,e),i},u.prototype.on=function(e,t){return layui.onevent.call(this,l,e,t)},u.prototype.val=function(e,i){var a=this,n=t(r+'[lay-filter="'+e+'"]');return n.each(function(e,a){var n=t(this);layui.each(i,function(e,t){var i,a=n.find('[name="'+e+'"]');a[0]&&(i=a[0].type,"checkbox"===i?a[0].checked=t:"radio"===i?a.each(function(){this.value==t&&(this.checked=!0)}):a.val(t))})}),f.render(null,e),a.getValue(e)},u.prototype.getValue=function(e,i){i=i||t(r+'[lay-filter="'+e+'"]').eq(0);var a={},n={},l=i.find("input,select,textarea");return layui.each(l,function(e,t){if(t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name){if(/^.*\[\]$/.test(t.name)){var i=t.name.match(/^(.*)\[\]$/g)[0];a[i]=0|a[i],t.name=t.name.replace(/^(.*)\[\]$/,"$1["+a[i]++ +"]")}/^checkbox|radio$/.test(t.type)&&!t.checked||(n[t.name]=t.value)}}),n},u.prototype.render=function(e,i){var n=this,u=t(r+function(){return i?'[lay-filter="'+i+'"]':""}()),d={select:function(){var e,i="请选择",a="layui-form-select",n="layui-select-title",r="layui-select-none",d="",f=u.find("select"),v=function(i,l){t(i.target).parent().hasClass(n)&&!l||(t("."+a).removeClass(a+"ed "+a+"up"),e&&d&&e.val(d)),e=null},y=function(i,u,f){var y,p=t(this),m=i.find("."+n),k=m.find("input"),g=i.find("dl"),x=g.children("dd"),b=this.selectedIndex;if(!u){var C=function(){var e=i.offset().top+i.outerHeight()+5-h.scrollTop(),t=g.outerHeight();b=p[0].selectedIndex,i.addClass(a+"ed"),x.removeClass(o),y=null,x.eq(b).addClass(s).siblings().removeClass(s),e+t>h.height()&&e>=t&&i.addClass(a+"up"),T()},w=function(e){i.removeClass(a+"ed "+a+"up"),k.blur(),y=null,e||$(k.val(),function(e){var i=p[0].selectedIndex;e&&(d=t(p[0].options[i]).html(),0===i&&d===k.attr("placeholder")&&(d=""),k.val(d||""))})},T=function(){var e=g.children("dd."+s);if(e[0]){var t=e.position().top,i=g.height(),a=e.height();t>i&&g.scrollTop(t+g.scrollTop()-i+a-5),t<0&&g.scrollTop(t+g.scrollTop()-5)}};m.on("click",function(e){i.hasClass(a+"ed")?w():(v(e,!0),C()),g.find("."+r).remove()}),m.find(".layui-edge").on("click",function(){k.focus()}),k.on("keyup",function(e){var t=e.keyCode;9===t&&C()}).on("keydown",function(e){var t=e.keyCode;9===t&&w();var i=function(t,a){var n,l;e.preventDefault();var r=function(){var e=g.children("dd."+s);if(g.children("dd."+o)[0]&&"next"===t){var i=g.children("dd:not(."+o+",."+c+")"),n=i.eq(0).index();if(n>=0&&n无匹配项

                          '):g.find("."+r).remove()},"keyup"),""===t&&g.find("."+r).remove(),void T())};f&&k.on("keyup",q).on("blur",function(i){var a=p[0].selectedIndex;e=k,d=t(p[0].options[a]).html(),0===a&&d===k.attr("placeholder")&&(d=""),setTimeout(function(){$(k.val(),function(e){d||k.val("")},"blur")},200)}),x.on("click",function(){var e=t(this),a=e.attr("lay-value"),n=p.attr("lay-filter");return!e.hasClass(c)&&(e.hasClass("layui-select-tips")?k.val(""):(k.val(e.text()),e.addClass(s)),e.siblings().removeClass(s),p.val(a).removeClass("layui-form-danger"),layui.event.call(this,l,"select("+n+")",{elem:p[0],value:a,othis:i}),w(!0),!1)}),i.find("dl>dt").on("click",function(e){return!1}),t(document).off("click",v).on("click",v)}};f.each(function(e,l){var r=t(this),o=r.next("."+a),u=this.disabled,d=l.value,f=t(l.options[l.selectedIndex]),v=l.options[0];if("string"==typeof r.attr("lay-ignore"))return r.show();var h="string"==typeof r.attr("lay-search"),p=v?v.value?i:v.innerHTML||i:i,m=t(['
                          ','
                          ','','
                          ','
                          ',function(e){var t=[];return layui.each(e,function(e,a){0!==e||a.value?"optgroup"===a.tagName.toLowerCase()?t.push("
                          "+a.label+"
                          "):t.push('
                          '+a.innerHTML+"
                          "):t.push('
                          '+(a.innerHTML||i)+"
                          ")}),0===t.length&&t.push('
                          没有选项
                          '),t.join("")}(r.find("*"))+"
                          ","
                          "].join(""));o[0]&&o.remove(),r.after(m),y.call(this,m,u,h)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},i=u.find("input[type=checkbox]"),a=function(e,i){var a=t(this);e.on("click",function(){var t=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(i[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(i[1]).find("em").text(n[0])),layui.event.call(a[0],l,i[2]+"("+t+")",{elem:a[0],value:a[0].value,othis:e}))})};i.each(function(i,n){var l=t(this),r=l.attr("lay-skin"),s=(l.attr("lay-text")||"").split("|"),o=this.disabled;"switch"===r&&(r="_"+r);var u=e[r]||e.checkbox;if("string"==typeof l.attr("lay-ignore"))return l.show();var d=l.next("."+u[0]),f=t(['
                          ",function(){var e=n.title.replace(/\s/g,""),t={checkbox:[e?""+n.title+"":"",''].join(""),_switch:""+((n.checked?s[0]:s[1])||"")+""};return t[r]||t.checkbox}(),"
                          "].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e="layui-form-radio",i=["",""],a=u.find("input[type=radio]"),n=function(a){var n=t(this),s="layui-anim-scaleSpring";a.on("click",function(){var o=n[0].name,c=n.parents(r),u=n.attr("lay-filter"),d=c.find("input[name="+o.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(d,function(){var a=t(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(s).html(i[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(s).html(i[0]),layui.event.call(n[0],l,"radio("+u+")",{elem:n[0],value:n[0].value,othis:a}))})};a.each(function(a,l){var r=t(this),s=r.next("."+e),o=this.disabled;if("string"==typeof r.attr("lay-ignore"))return r.show();s[0]&&s.remove();var u=t(['
                          ',''+i[l.checked?0:1]+"","
                          "+function(){var e=l.title||"";return"string"==typeof r.next().attr("lay-radio")&&(e=r.next().html(),r.next().remove()),e}()+"
                          ","
                          "].join(""));r.after(u),n.call(this,u)})}};return e?d[e]?d[e]():a.error("不支持的"+e+"表单渲染"):layui.each(d,function(e,t){t()}),n};var d=function(){var e=null,a=f.config.verify,s="layui-form-danger",o={},c=t(this),u=c.parents(r),d=u.find("*[lay-verify]"),v=c.parents("form")[0],h=c.attr("lay-filter");return layui.each(d,function(l,r){var o=t(this),c=o.attr("lay-verify").split("|"),u=o.attr("lay-verType"),d=o.val();if(o.removeClass(s),layui.each(c,function(t,l){var c,f="",v="function"==typeof a[l];if(a[l]){var c=v?f=a[l](d,r):!a[l][0].test(d);if(f=f||a[l][1],"required"===l&&(f=o.attr("lay-reqText")||f),c)return"tips"===u?i.tips(f,function(){return"string"==typeof o.attr("lay-ignore")||"select"!==r.tagName.toLowerCase()&&!/^checkbox|radio$/.test(r.type)?o:o.next()}(),{tips:1}):"alert"===u?i.alert(f,{title:"提示",shadeClose:!0}):i.msg(f,{icon:5,shift:6}),n.android||n.ios||setTimeout(function(){r.focus()},7),o.addClass(s),e=!0}}),e)return e}),!e&&(o=f.getValue(null,u),layui.event.call(this,l,"submit("+h+")",{elem:this,form:v,field:o}))},f=new u,v=t(document),h=t(window);f.render(),v.on("reset",r,function(){var e=t(this).attr("lay-filter");setTimeout(function(){f.render(null,e)},50)}),v.on("submit",r,d).on("click","*[lay-submit]",d),e(l,f)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/jquery.js b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/jquery.js new file mode 100644 index 0000000..10d8c2b --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/jquery.js @@ -0,0 +1,5 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){function n(e){var t=!!e&&"length"in e&&e.length,n=pe.type(e);return"function"!==n&&!pe.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e,t,n){if(pe.isFunction(t))return pe.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return pe.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(Ce.test(t))return pe.filter(t,e,n);t=pe.filter(t,e)}return pe.grep(e,function(e){return pe.inArray(e,t)>-1!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t={};return pe.each(e.match(De)||[],function(e,n){t[n]=!0}),t}function a(){re.addEventListener?(re.removeEventListener("DOMContentLoaded",s),e.removeEventListener("load",s)):(re.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(re.addEventListener||"load"===e.event.type||"complete"===re.readyState)&&(a(),pe.ready())}function u(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(_e,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:qe.test(n)?pe.parseJSON(n):n)}catch(i){}pe.data(e,t,n)}else n=void 0}return n}function l(e){var t;for(t in e)if(("data"!==t||!pe.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,r){if(He(e)){var i,o,a=pe.expando,s=e.nodeType,u=s?pe.cache:e,l=s?e[a]:e[a]&&a;if(l&&u[l]&&(r||u[l].data)||void 0!==n||"string"!=typeof t)return l||(l=s?e[a]=ne.pop()||pe.guid++:a),u[l]||(u[l]=s?{}:{toJSON:pe.noop}),"object"!=typeof t&&"function"!=typeof t||(r?u[l]=pe.extend(u[l],t):u[l].data=pe.extend(u[l].data,t)),o=u[l],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[pe.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[pe.camelCase(t)])):i=o,i}}function f(e,t,n){if(He(e)){var r,i,o=e.nodeType,a=o?pe.cache:e,s=o?e[pe.expando]:pe.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){pe.isArray(t)?t=t.concat(pe.map(t,pe.camelCase)):t in r?t=[t]:(t=pe.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!l(r):!pe.isEmptyObject(r))return}(n||(delete a[s].data,l(a[s])))&&(o?pe.cleanData([e],!0):fe.deleteExpando||a!=a.window?delete a[s]:a[s]=void 0)}}}function d(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:function(){return pe.css(e,t,"")},u=s(),l=n&&n[3]||(pe.cssNumber[t]?"":"px"),c=(pe.cssNumber[t]||"px"!==l&&+u)&&Me.exec(pe.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do o=o||".5",c/=o,pe.style(e,t,c+l);while(o!==(o=s()/u)&&1!==o&&--a)}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}function p(e){var t=ze.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function h(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||pe.nodeName(r,t)?o.push(r):pe.merge(o,h(r,t));return void 0===t||t&&pe.nodeName(e,t)?pe.merge([e],o):o}function g(e,t){for(var n,r=0;null!=(n=e[r]);r++)pe._data(n,"globalEval",!t||pe._data(t[r],"globalEval"))}function m(e){Be.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,y=p(t),v=[],x=0;x"!==f[1]||Ve.test(a)?0:u:u.firstChild,o=a&&a.childNodes.length;o--;)pe.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(pe.merge(v,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=y.lastChild}else v.push(t.createTextNode(a));for(u&&y.removeChild(u),fe.appendChecked||pe.grep(h(v,"input"),m),x=0;a=v[x++];)if(r&&pe.inArray(a,r)>-1)i&&i.push(a);else if(s=pe.contains(a.ownerDocument,a),u=h(y.appendChild(a),"script"),s&&g(u),n)for(o=0;a=u[o++];)Ie.test(a.type||"")&&n.push(a);return u=null,y}function v(){return!0}function x(){return!1}function b(){try{return re.activeElement}catch(e){}}function w(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)w(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=x;else if(!i)return e;return 1===o&&(a=i,i=function(e){return pe().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=pe.guid++)),e.each(function(){pe.event.add(this,t,i,r,n)})}function T(e,t){return pe.nodeName(e,"table")&&pe.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function C(e){return e.type=(null!==pe.find.attr(e,"type"))+"/"+e.type,e}function E(e){var t=it.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function N(e,t){if(1===t.nodeType&&pe.hasData(e)){var n,r,i,o=pe._data(e),a=pe._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;r1&&"string"==typeof p&&!fe.checkClone&&rt.test(p))return e.each(function(i){var o=e.eq(i);g&&(t[0]=p.call(this,i,o.html())),S(o,t,n,r)});if(f&&(l=y(t,e[0].ownerDocument,!1,e,r),i=l.firstChild,1===l.childNodes.length&&(l=i),i||r)){for(s=pe.map(h(l,"script"),C),a=s.length;c")).appendTo(t.documentElement),t=(ut[0].contentWindow||ut[0].contentDocument).document,t.write(),t.close(),n=D(e,t),ut.detach()),lt[e]=n),n}function L(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function H(e){if(e in Et)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=Ct.length;n--;)if(e=Ct[n]+t,e in Et)return e}function q(e,t){for(var n,r,i,o=[],a=0,s=e.length;a=0&&n=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==pe.type(e)||e.nodeType||pe.isWindow(e))return!1;try{if(e.constructor&&!ce.call(e,"constructor")&&!ce.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(!fe.ownFirst)for(t in e)return ce.call(e,t);for(t in e);return void 0===t||ce.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ue[le.call(e)]||"object":typeof e},globalEval:function(t){t&&pe.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(ge,"ms-").replace(me,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var r,i=0;if(n(e))for(r=e.length;iT.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[P]=!0,e}function i(e){var t=H.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function d(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,n,r){for(var i=0,o=n.length;i-1&&(r[l]=!(a[l]=f))}}else x=m(x===a?x.splice(h,x.length):x),o?o(null,a,x,u):Q.apply(a,x)})}function v(e){for(var t,n,r,i=e.length,o=T.relative[e[0].type],a=o||T.relative[" "],s=o?1:0,u=p(function(e){return e===t},a,!0),l=p(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var i=!o&&(r||n!==A)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,i}];s1&&h(c),s>1&&d(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s0,o=e.length>0,a=function(r,a,s,u,l){var c,f,d,p=0,h="0",g=r&&[],y=[],v=A,x=r||o&&T.find.TAG("*",l),b=W+=null==v?1:Math.random()||.1,w=x.length;for(l&&(A=a===H||a||l);h!==w&&null!=(c=x[h]);h++){if(o&&c){for(f=0,a||c.ownerDocument===H||(L(c),s=!_);d=e[f++];)if(d(c,a||H,s)){u.push(c);break}l&&(W=b)}i&&((c=!d&&c)&&p--,r&&g.push(c))}if(p+=h,i&&h!==p){for(f=0;d=n[f++];)d(g,y,a,s);if(r){if(p>0)for(;h--;)g[h]||y[h]||(y[h]=G.call(u));y=m(y)}Q.apply(u,y),l&&!r&&y.length>0&&p+n.length>1&&t.uniqueSort(u)}return l&&(W=b,A=v),g};return i?r(a):a}var b,w,T,C,E,N,k,S,A,D,j,L,H,q,_,F,M,O,R,P="sizzle"+1*new Date,B=e.document,W=0,I=0,$=n(),z=n(),X=n(),U=function(e,t){return e===t&&(j=!0),0},V=1<<31,Y={}.hasOwnProperty,J=[],G=J.pop,K=J.push,Q=J.push,Z=J.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),ce=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),de=new RegExp("^"+re+"$"),pe={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ve=/[+~]/,xe=/'|\\/g,be=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),we=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Te=function(){L()};try{Q.apply(J=Z.call(B.childNodes),B.childNodes),J[B.childNodes.length].nodeType}catch(Ce){Q={apply:J.length?function(e,t){K.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},E=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},L=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:B;return r!==H&&9===r.nodeType&&r.documentElement?(H=r,q=H.documentElement,_=!E(H),(n=H.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Te,!1):n.attachEvent&&n.attachEvent("onunload",Te)),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(H.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=me.test(H.getElementsByClassName),w.getById=i(function(e){return q.appendChild(e).id=P,!H.getElementsByName||!H.getElementsByName(P).length}),w.getById?(T.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&_){var n=t.getElementById(e);return n?[n]:[]}},T.filter.ID=function(e){var t=e.replace(be,we);return function(e){return e.getAttribute("id")===t}}):(delete T.find.ID,T.filter.ID=function(e){var t=e.replace(be,we);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),T.find.TAG=w.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):w.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},T.find.CLASS=w.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&_)return t.getElementsByClassName(e)},M=[],F=[],(w.qsa=me.test(H.querySelectorAll))&&(i(function(e){q.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||F.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+P+"-]").length||F.push("~="),e.querySelectorAll(":checked").length||F.push(":checked"),e.querySelectorAll("a#"+P+"+*").length||F.push(".#.+[+~]")}),i(function(e){var t=H.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&F.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||F.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),F.push(",.*:")})),(w.matchesSelector=me.test(O=q.matches||q.webkitMatchesSelector||q.mozMatchesSelector||q.oMatchesSelector||q.msMatchesSelector))&&i(function(e){w.disconnectedMatch=O.call(e,"div"),O.call(e,"[s!='']:x"),M.push("!=",oe)}),F=F.length&&new RegExp(F.join("|")),M=M.length&&new RegExp(M.join("|")),t=me.test(q.compareDocumentPosition),R=t||me.test(q.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},U=t?function(e,t){if(e===t)return j=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!w.sortDetached&&t.compareDocumentPosition(e)===n?e===H||e.ownerDocument===B&&R(B,e)?-1:t===H||t.ownerDocument===B&&R(B,t)?1:D?ee(D,e)-ee(D,t):0:4&n?-1:1)}:function(e,t){if(e===t)return j=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,s=[e],u=[t];if(!i||!o)return e===H?-1:t===H?1:i?-1:o?1:D?ee(D,e)-ee(D,t):0;if(i===o)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]===B?-1:u[r]===B?1:0},H):H},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==H&&L(e),n=n.replace(ce,"='$1']"),w.matchesSelector&&_&&!X[n+" "]&&(!M||!M.test(n))&&(!F||!F.test(n)))try{var r=O.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,H,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==H&&L(e),R(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==H&&L(e);var n=T.attrHandle[t.toLowerCase()],r=n&&Y.call(T.attrHandle,t.toLowerCase())?n(e,t,!_):void 0;return void 0!==r?r:w.attributes||!_?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(j=!w.detectDuplicates,D=!w.sortStable&&e.slice(0),e.sort(U),j){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return D=null,e},C=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=C(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,we),e[3]=(e[3]||e[4]||e[5]||"").replace(be,we),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=N(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(be,we).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=$[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&$(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(ae," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s,x=!1;if(m){if(o){for(;g;){for(d=t;d=d[g];)if(s?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(d=m,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}), +l=c[e]||[],p=l[0]===W&&l[1],x=p&&l[2],d=p&&m.childNodes[p];d=++p&&d&&d[g]||(x=p=0)||h.pop();)if(1===d.nodeType&&++x&&d===t){c[e]=[W,p,x];break}}else if(v&&(d=t,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),l=c[e]||[],p=l[0]===W&&l[1],x=p),x===!1)for(;(d=++p&&d&&d[g]||(x=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==y:1!==d.nodeType)||!++x||(v&&(f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),c[e]=[W,x]),d!==t)););return x-=i,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var i,o=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[P]?o(n):o.length>1?(i=[e,e,"",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=ee(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=k(e.replace(se,"$1"));return i[P]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,we),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:r(function(e){return de.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(be,we).toLowerCase(),function(t){var n;do if(n=_?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===q},focus:function(e){return e===H.activeElement&&(!H.hasFocus||H.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(a=o[0]).type&&w.getById&&9===t.nodeType&&_&&T.relative[o[1].type]){if(t=(T.find.ID(a.matches[0].replace(be,we),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(a=o[i],!T.relative[s=a.type]);)if((u=T.find[s])&&(r=u(a.matches[0].replace(be,we),ve.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&d(o),!e)return Q.apply(n,r),n;break}}return(l||k(e,f))(r,t,!_,n,!t||ve.test(e)&&c(t.parentNode)||t),n},w.sortStable=P.split("").sort(U).join("")===P,w.detectDuplicates=!!j,L(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(H.createElement("div"))}),i(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);pe.find=ve,pe.expr=ve.selectors,pe.expr[":"]=pe.expr.pseudos,pe.uniqueSort=pe.unique=ve.uniqueSort,pe.text=ve.getText,pe.isXMLDoc=ve.isXML,pe.contains=ve.contains;var xe=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&pe(e).is(n))break;r.push(e)}return r},be=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},we=pe.expr.match.needsContext,Te=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Ce=/^.[^:#\[\.,]*$/;pe.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?pe.find.matchesSelector(r,e)?[r]:[]:pe.find.matches(e,pe.grep(t,function(e){return 1===e.nodeType}))},pe.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(pe(e).filter(function(){for(t=0;t1?pe.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&we.test(e)?pe(e):e||[],!1).length}});var Ee,Ne=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ke=pe.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||Ee,"string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:Ne.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof pe?t[0]:t,pe.merge(this,pe.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:re,!0)),Te.test(r[1])&&pe.isPlainObject(t))for(r in t)pe.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}if(i=re.getElementById(r[2]),i&&i.parentNode){if(i.id!==r[2])return Ee.find(e);this.length=1,this[0]=i}return this.context=re,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):pe.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(pe):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),pe.makeArray(e,this))};ke.prototype=pe.fn,Ee=pe(re);var Se=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};pe.fn.extend({has:function(e){var t,n=pe(e,this),r=n.length;return this.filter(function(){for(t=0;t-1:1===n.nodeType&&pe.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?pe.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?pe.inArray(this[0],pe(e)):pe.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(pe.uniqueSort(pe.merge(this.get(),pe(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),pe.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return xe(e,"parentNode")},parentsUntil:function(e,t,n){return xe(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return xe(e,"nextSibling")},prevAll:function(e){return xe(e,"previousSibling")},nextUntil:function(e,t,n){return xe(e,"nextSibling",n)},prevUntil:function(e,t,n){return xe(e,"previousSibling",n)},siblings:function(e){return be((e.parentNode||{}).firstChild,e)},children:function(e){return be(e.firstChild)},contents:function(e){return pe.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:pe.merge([],e.childNodes)}},function(e,t){pe.fn[e]=function(n,r){var i=pe.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=pe.filter(r,i)),this.length>1&&(Ae[e]||(i=pe.uniqueSort(i)),Se.test(e)&&(i=i.reverse())),this.pushStack(i)}});var De=/\S+/g;pe.Callbacks=function(e){e="string"==typeof e?o(e):pe.extend({},e);var t,n,r,i,a=[],s=[],u=-1,l=function(){for(i=e.once,r=t=!0;s.length;u=-1)for(n=s.shift();++u-1;)a.splice(n,1),n<=u&&u--}),this},has:function(e){return e?pe.inArray(e,a)>-1:a.length>0},empty:function(){return a&&(a=[]),this},disable:function(){return i=s=[],a=n="",this},disabled:function(){return!a},lock:function(){return i=!0,n||c.disable(),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},pe.extend({Deferred:function(e){var t=[["resolve","done",pe.Callbacks("once memory"),"resolved"],["reject","fail",pe.Callbacks("once memory"),"rejected"],["notify","progress",pe.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return pe.Deferred(function(n){pe.each(t,function(t,o){var a=pe.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&pe.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?pe.extend(e,r):r}},i={};return r.pipe=r.then,pe.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=ie.call(arguments),a=o.length,s=1!==a||e&&pe.isFunction(e.promise)?a:0,u=1===s?e:pe.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?ie.call(arguments):i,r===t?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(a>1)for(t=new Array(a),n=new Array(a),r=new Array(a);i0||(je.resolveWith(re,[pe]),pe.fn.triggerHandler&&(pe(re).triggerHandler("ready"),pe(re).off("ready"))))}}),pe.ready.promise=function(t){if(!je)if(je=pe.Deferred(),"complete"===re.readyState||"loading"!==re.readyState&&!re.documentElement.doScroll)e.setTimeout(pe.ready);else if(re.addEventListener)re.addEventListener("DOMContentLoaded",s),e.addEventListener("load",s);else{re.attachEvent("onreadystatechange",s),e.attachEvent("onload",s);var n=!1;try{n=null==e.frameElement&&re.documentElement}catch(r){}n&&n.doScroll&&!function i(){if(!pe.isReady){try{n.doScroll("left")}catch(t){return e.setTimeout(i,50)}a(),pe.ready()}}()}return je.promise(t)},pe.ready.promise();var Le;for(Le in pe(fe))break;fe.ownFirst="0"===Le,fe.inlineBlockNeedsLayout=!1,pe(function(){var e,t,n,r;n=re.getElementsByTagName("body")[0],n&&n.style&&(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",fe.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=re.createElement("div");fe.deleteExpando=!0;try{delete e.test}catch(t){fe.deleteExpando=!1}e=null}();var He=function(e){var t=pe.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||t!==!0&&e.getAttribute("classid")===t)},qe=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,_e=/([A-Z])/g;pe.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?pe.cache[e[pe.expando]]:e[pe.expando],!!e&&!l(e)},data:function(e,t,n){return c(e,t,n)},removeData:function(e,t){return f(e,t)},_data:function(e,t,n){return c(e,t,n,!0)},_removeData:function(e,t){return f(e,t,!0)}}),pe.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=pe.data(o),1===o.nodeType&&!pe._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=pe.camelCase(r.slice(5)),u(o,r,i[r])));pe._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){pe.data(this,e)}):arguments.length>1?this.each(function(){pe.data(this,e,t)}):o?u(o,e,pe.data(o,e)):void 0},removeData:function(e){return this.each(function(){pe.removeData(this,e)})}}),pe.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=pe._data(e,t),n&&(!r||pe.isArray(n)?r=pe._data(e,t,pe.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=pe.queue(e,t),r=n.length,i=n.shift(),o=pe._queueHooks(e,t),a=function(){pe.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return pe._data(e,n)||pe._data(e,n,{empty:pe.Callbacks("once memory").add(function(){pe._removeData(e,t+"queue"),pe._removeData(e,n)})})}}),pe.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length
                          a",fe.leadingWhitespace=3===e.firstChild.nodeType,fe.tbody=!e.getElementsByTagName("tbody").length,fe.htmlSerialize=!!e.getElementsByTagName("link").length,fe.html5Clone="<:nav>"!==re.createElement("nav").cloneNode(!0).outerHTML,n.type="checkbox",n.checked=!0,t.appendChild(n),fe.appendChecked=n.checked,e.innerHTML="",fe.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue,t.appendChild(e),n=re.createElement("input"),n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),e.appendChild(n),fe.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,fe.noCloneEvent=!!e.addEventListener,e[pe.expando]=1,fe.attributes=!e.getAttribute(pe.expando)}();var Xe={option:[1,""],legend:[1,"
                          ","
                          "],area:[1,"",""],param:[1,"",""],thead:[1,"","
                          "],tr:[2,"","
                          "],col:[2,"","
                          "],td:[3,"","
                          "],_default:fe.htmlSerialize?[0,"",""]:[1,"X
                          ","
                          "]};Xe.optgroup=Xe.option,Xe.tbody=Xe.tfoot=Xe.colgroup=Xe.caption=Xe.thead,Xe.th=Xe.td;var Ue=/<|&#?\w+;/,Ve=/-1&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,t=t[pe.expando]?t:new pe.Event(p,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:pe.makeArray(n,[t]),l=pe.event.special[p]||{},i||!l.trigger||l.trigger.apply(r,n)!==!1)){if(!i&&!l.noBubble&&!pe.isWindow(r)){for(u=l.delegateType||p,Ke.test(u+p)||(s=s.parentNode);s;s=s.parentNode)d.push(s),c=s;c===(r.ownerDocument||re)&&d.push(c.defaultView||c.parentWindow||e)}for(f=0;(s=d[f++])&&!t.isPropagationStopped();)t.type=f>1?u:l.bindType||p,o=(pe._data(s,"events")||{})[t.type]&&pe._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&He(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=p,!i&&!t.isDefaultPrevented()&&(!l._default||l._default.apply(d.pop(),n)===!1)&&He(r)&&a&&r[p]&&!pe.isWindow(r)){c=r[a],c&&(r[a]=null),pe.event.triggered=p;try{r[p]()}catch(g){}pe.event.triggered=void 0,c&&(r[a]=c)}return t.result}},dispatch:function(e){e=pe.event.fix(e);var t,n,r,i,o,a=[],s=ie.call(arguments),u=(pe._data(this,"events")||{})[e.type]||[],l=pe.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(a=pe.event.handlers.call(this,e,u),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((pe.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,u=e.target;if(s&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n-1:pe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s]","i"),tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,nt=/\s*$/g,at=p(re),st=at.appendChild(re.createElement("div"));pe.extend({htmlPrefilter:function(e){return e.replace(tt,"<$1>")},clone:function(e,t,n){var r,i,o,a,s,u=pe.contains(e.ownerDocument,e);if(fe.html5Clone||pe.isXMLDoc(e)||!et.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(st.innerHTML=e.outerHTML,st.removeChild(o=st.firstChild)),!(fe.noCloneEvent&&fe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||pe.isXMLDoc(e)))for(r=h(o),s=h(e),a=0;null!=(i=s[a]);++a)r[a]&&k(i,r[a]);if(t)if(n)for(s=s||h(e),r=r||h(o),a=0;null!=(i=s[a]);a++)N(i,r[a]);else N(e,o);return r=h(o,"script"),r.length>0&&g(r,!u&&h(e,"script")),r=s=i=null,o},cleanData:function(e,t){for(var n,r,i,o,a=0,s=pe.expando,u=pe.cache,l=fe.attributes,c=pe.event.special;null!=(n=e[a]);a++)if((t||He(n))&&(i=n[s],o=i&&u[i])){if(o.events)for(r in o.events)c[r]?pe.event.remove(n,r):pe.removeEvent(n,r,o.handle);u[i]&&(delete u[i],l||"undefined"==typeof n.removeAttribute?n[s]=void 0:n.removeAttribute(s),ne.push(i))}}}),pe.fn.extend({domManip:S,detach:function(e){return A(this,e,!0)},remove:function(e){return A(this,e)},text:function(e){return Pe(this,function(e){return void 0===e?pe.text(this):this.empty().append((this[0]&&this[0].ownerDocument||re).createTextNode(e))},null,e,arguments.length)},append:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.appendChild(e)}})},prepend:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&pe.cleanData(h(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&pe.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return pe.clone(this,e,t)})},html:function(e){return Pe(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e)return 1===t.nodeType?t.innerHTML.replace(Ze,""):void 0;if("string"==typeof e&&!nt.test(e)&&(fe.htmlSerialize||!et.test(e))&&(fe.leadingWhitespace||!$e.test(e))&&!Xe[(We.exec(e)||["",""])[1].toLowerCase()]){e=pe.htmlPrefilter(e);try{for(;nt",t=l.getElementsByTagName("td"),t[0].style.cssText="margin:0;border:0;padding:0;display:none",o=0===t[0].offsetHeight,o&&(t[0].style.display="",t[1].style.display="none",o=0===t[0].offsetHeight)),f.removeChild(u)}var n,r,i,o,a,s,u=re.createElement("div"),l=re.createElement("div");l.style&&(l.style.cssText="float:left;opacity:.5",fe.opacity="0.5"===l.style.opacity,fe.cssFloat=!!l.style.cssFloat,l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",fe.clearCloneStyle="content-box"===l.style.backgroundClip,u=re.createElement("div"),u.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",l.innerHTML="",u.appendChild(l),fe.boxSizing=""===l.style.boxSizing||""===l.style.MozBoxSizing||""===l.style.WebkitBoxSizing,pe.extend(fe,{reliableHiddenOffsets:function(){return null==n&&t(),o},boxSizingReliable:function(){return null==n&&t(),i},pixelMarginRight:function(){return null==n&&t(),r},pixelPosition:function(){return null==n&&t(),n},reliableMarginRight:function(){return null==n&&t(),a},reliableMarginLeft:function(){return null==n&&t(),s}}))}();var ht,gt,mt=/^(top|right|bottom|left)$/;e.getComputedStyle?(ht=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n.getPropertyValue(t)||n[t]:void 0,""!==a&&void 0!==a||pe.contains(e.ownerDocument,e)||(a=pe.style(e,t)),n&&!fe.pixelMarginRight()&&ft.test(a)&&ct.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o),void 0===a?a:a+""}):pt.currentStyle&&(ht=function(e){return e.currentStyle},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n[t]:void 0,null==a&&s&&s[t]&&(a=s[t]),ft.test(a)&&!mt.test(t)&&(r=s.left,i=e.runtimeStyle,o=i&&i.left,o&&(i.left=e.currentStyle.left),s.left="fontSize"===t?"1em":a,a=s.pixelLeft+"px",s.left=r,o&&(i.left=o)),void 0===a?a:a+""||"auto"});var yt=/alpha\([^)]*\)/i,vt=/opacity\s*=\s*([^)]*)/i,xt=/^(none|table(?!-c[ea]).+)/,bt=new RegExp("^("+Fe+")(.*)$","i"),wt={position:"absolute",visibility:"hidden",display:"block"},Tt={letterSpacing:"0",fontWeight:"400"},Ct=["Webkit","O","Moz","ms"],Et=re.createElement("div").style;pe.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=gt(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":fe.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=pe.camelCase(t),u=e.style;if(t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:u[t];if(o=typeof n,"string"===o&&(i=Me.exec(n))&&i[1]&&(n=d(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(pe.cssNumber[s]?"":"px")),fe.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),!(a&&"set"in a&&void 0===(n=a.set(e,n,r)))))try{u[t]=n}catch(l){}}},css:function(e,t,n,r){var i,o,a,s=pe.camelCase(t);return t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],a&&"get"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=gt(e,t,r)),"normal"===o&&t in Tt&&(o=Tt[t]),""===n||n?(i=parseFloat(o),n===!0||isFinite(i)?i||0:o):o}}),pe.each(["height","width"],function(e,t){pe.cssHooks[t]={get:function(e,n,r){if(n)return xt.test(pe.css(e,"display"))&&0===e.offsetWidth?dt(e,wt,function(){return M(e,t,r)}):M(e,t,r)},set:function(e,n,r){var i=r&&ht(e);return _(e,n,r?F(e,t,r,fe.boxSizing&&"border-box"===pe.css(e,"boxSizing",!1,i),i):0)}}}),fe.opacity||(pe.cssHooks.opacity={get:function(e,t){return vt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=pe.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===pe.trim(o.replace(yt,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=yt.test(o)?o.replace(yt,i):o+" "+i)}}),pe.cssHooks.marginRight=L(fe.reliableMarginRight,function(e,t){if(t)return dt(e,{display:"inline-block"},gt,[e,"marginRight"])}),pe.cssHooks.marginLeft=L(fe.reliableMarginLeft,function(e,t){if(t)return(parseFloat(gt(e,"marginLeft"))||(pe.contains(e.ownerDocument,e)?e.getBoundingClientRect().left-dt(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}):0))+"px"}),pe.each({margin:"",padding:"",border:"Width"},function(e,t){pe.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+Oe[r]+t]=o[r]||o[r-2]||o[0];return i}},ct.test(e)||(pe.cssHooks[e+t].set=_)}),pe.fn.extend({css:function(e,t){return Pe(this,function(e,t,n){var r,i,o={},a=0;if(pe.isArray(t)){for(r=ht(e),i=t.length;a1)},show:function(){return q(this,!0)},hide:function(){return q(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Re(this)?pe(this).show():pe(this).hide()})}}),pe.Tween=O,O.prototype={constructor:O,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||pe.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(pe.cssNumber[n]?"":"px")},cur:function(){var e=O.propHooks[this.prop];return e&&e.get?e.get(this):O.propHooks._default.get(this)},run:function(e){var t,n=O.propHooks[this.prop];return this.options.duration?this.pos=t=pe.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):O.propHooks._default.set(this),this}},O.prototype.init.prototype=O.prototype,O.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=pe.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){pe.fx.step[e.prop]?pe.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[pe.cssProps[e.prop]]&&!pe.cssHooks[e.prop]?e.elem[e.prop]=e.now:pe.style(e.elem,e.prop,e.now+e.unit)}}},O.propHooks.scrollTop=O.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},pe.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},pe.fx=O.prototype.init,pe.fx.step={};var Nt,kt,St=/^(?:toggle|show|hide)$/,At=/queueHooks$/;pe.Animation=pe.extend($,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,Me.exec(t),n),n}]},tweener:function(e,t){pe.isFunction(e)?(t=e,e=["*"]):e=e.match(De);for(var n,r=0,i=e.length;r
                          a",e=n.getElementsByTagName("a")[0],t.setAttribute("type","checkbox"),n.appendChild(t),e=n.getElementsByTagName("a")[0],e.style.cssText="top:1px",fe.getSetAttribute="t"!==n.className,fe.style=/top/.test(e.getAttribute("style")),fe.hrefNormalized="/a"===e.getAttribute("href"),fe.checkOn=!!t.value,fe.optSelected=i.selected,fe.enctype=!!re.createElement("form").enctype,r.disabled=!0,fe.optDisabled=!i.disabled,t=re.createElement("input"),t.setAttribute("value",""),fe.input=""===t.getAttribute("value"),t.value="t",t.setAttribute("type","radio"),fe.radioValue="t"===t.value}();var Dt=/\r/g,jt=/[\x20\t\r\n\f]+/g;pe.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=pe.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,pe(this).val()):e,null==i?i="":"number"==typeof i?i+="":pe.isArray(i)&&(i=pe.map(i,function(e){return null==e?"":e+""})),t=pe.valHooks[this.type]||pe.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return t=pe.valHooks[i.type]||pe.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(Dt,""):null==n?"":n)}}}),pe.extend({valHooks:{option:{get:function(e){var t=pe.find.attr(e,"value");return null!=t?t:pe.trim(pe.text(e)).replace(jt," ")}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||i<0,a=o?null:[],s=o?i+1:r.length,u=i<0?s:o?i:0;u-1)try{r.selected=n=!0}catch(s){r.scrollHeight}else r.selected=!1;return n||(e.selectedIndex=-1),i}}}}),pe.each(["radio","checkbox"],function(){pe.valHooks[this]={set:function(e,t){if(pe.isArray(t))return e.checked=pe.inArray(pe(e).val(),t)>-1}},fe.checkOn||(pe.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Lt,Ht,qt=pe.expr.attrHandle,_t=/^(?:checked|selected)$/i,Ft=fe.getSetAttribute,Mt=fe.input;pe.fn.extend({attr:function(e,t){return Pe(this,pe.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){pe.removeAttr(this,e)})}}),pe.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?pe.prop(e,t,n):(1===o&&pe.isXMLDoc(e)||(t=t.toLowerCase(),i=pe.attrHooks[t]||(pe.expr.match.bool.test(t)?Ht:Lt)),void 0!==n?null===n?void pe.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:(r=pe.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!fe.radioValue&&"radio"===t&&pe.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(De);if(o&&1===e.nodeType)for(;n=o[i++];)r=pe.propFix[n]||n,pe.expr.match.bool.test(n)?Mt&&Ft||!_t.test(n)?e[r]=!1:e[pe.camelCase("default-"+n)]=e[r]=!1:pe.attr(e,n,""),e.removeAttribute(Ft?n:r)}}),Ht={set:function(e,t,n){return t===!1?pe.removeAttr(e,n):Mt&&Ft||!_t.test(n)?e.setAttribute(!Ft&&pe.propFix[n]||n,n):e[pe.camelCase("default-"+n)]=e[n]=!0,n}},pe.each(pe.expr.match.bool.source.match(/\w+/g),function(e,t){var n=qt[t]||pe.find.attr;Mt&&Ft||!_t.test(t)?qt[t]=function(e,t,r){var i,o;return r||(o=qt[t],qt[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,qt[t]=o),i}:qt[t]=function(e,t,n){if(!n)return e[pe.camelCase("default-"+t)]?t.toLowerCase():null}}),Mt&&Ft||(pe.attrHooks.value={set:function(e,t,n){return pe.nodeName(e,"input")?void(e.defaultValue=t):Lt&&Lt.set(e,t,n)}}),Ft||(Lt={set:function(e,t,n){var r=e.getAttributeNode(n);if(r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="","value"===n||t===e.getAttribute(n))return t}},qt.id=qt.name=qt.coords=function(e,t,n){var r;if(!n)return(r=e.getAttributeNode(t))&&""!==r.value?r.value:null},pe.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);if(n&&n.specified)return n.value},set:Lt.set},pe.attrHooks.contenteditable={set:function(e,t,n){Lt.set(e,""!==t&&t,n)}},pe.each(["width","height"],function(e,t){pe.attrHooks[t]={set:function(e,n){if(""===n)return e.setAttribute(t,"auto"),n}}})),fe.style||(pe.attrHooks.style={get:function(e){return e.style.cssText||void 0},set:function(e,t){return e.style.cssText=t+""}});var Ot=/^(?:input|select|textarea|button|object)$/i,Rt=/^(?:a|area)$/i;pe.fn.extend({prop:function(e,t){return Pe(this,pe.prop,e,t,arguments.length>1)},removeProp:function(e){return e=pe.propFix[e]||e,this.each(function(){try{this[e]=void 0,delete this[e]}catch(t){}})}}),pe.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&pe.isXMLDoc(e)||(t=pe.propFix[t]||t,i=pe.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=pe.find.attr(e,"tabindex");return t?parseInt(t,10):Ot.test(e.nodeName)||Rt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),fe.hrefNormalized||pe.each(["href","src"],function(e,t){pe.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),fe.optSelected||(pe.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),pe.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){pe.propFix[this.toLowerCase()]=this}),fe.enctype||(pe.propFix.enctype="encoding");var Pt=/[\t\r\n\f]/g;pe.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).addClass(e.call(this,t,z(this)))});if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).removeClass(e.call(this,t,z(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):pe.isFunction(e)?this.each(function(n){pe(this).toggleClass(e.call(this,n,z(this),t),t)}):this.each(function(){var t,r,i,o;if("string"===n)for(r=0,i=pe(this),o=e.match(De)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||(t=z(this),t&&pe._data(this,"__className__",t),pe.attr(this,"class",t||e===!1?"":pe._data(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(n)+" ").replace(Pt," ").indexOf(t)>-1)return!0;return!1}}),pe.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){pe.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),pe.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}});var Bt=e.location,Wt=pe.now(),It=/\?/,$t=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;pe.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,r=null,i=pe.trim(t+"");return i&&!pe.trim(i.replace($t,function(e,t,i,o){return n&&t&&(r=0),0===r?e:(n=i||t,r+=!o-!i,"")}))?Function("return "+i)():pe.error("Invalid JSON: "+t)},pe.parseXML=function(t){var n,r;if(!t||"string"!=typeof t)return null;try{e.DOMParser?(r=new e.DOMParser,n=r.parseFromString(t,"text/xml")):(n=new e.ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(i){n=void 0}return n&&n.documentElement&&!n.getElementsByTagName("parsererror").length||pe.error("Invalid XML: "+t),n};var zt=/#.*$/,Xt=/([?&])_=[^&]*/,Ut=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Vt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Yt=/^(?:GET|HEAD)$/,Jt=/^\/\//,Gt=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Kt={},Qt={},Zt="*/".concat("*"),en=Bt.href,tn=Gt.exec(en.toLowerCase())||[];pe.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:en,type:"GET",isLocal:Vt.test(tn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":pe.parseJSON,"text xml":pe.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?V(V(e,pe.ajaxSettings),t):V(pe.ajaxSettings,e)},ajaxPrefilter:X(Kt),ajaxTransport:X(Qt),ajax:function(t,n){function r(t,n,r,i){var o,f,v,x,w,C=n;2!==b&&(b=2,u&&e.clearTimeout(u),c=void 0,s=i||"",T.readyState=t>0?4:0,o=t>=200&&t<300||304===t,r&&(x=Y(d,T,r)),x=J(d,x,T,o),o?(d.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(pe.lastModified[a]=w),w=T.getResponseHeader("etag"),w&&(pe.etag[a]=w)),204===t||"HEAD"===d.type?C="nocontent":304===t?C="notmodified":(C=x.state,f=x.data,v=x.error,o=!v)):(v=C,!t&&C||(C="error",t<0&&(t=0))),T.status=t,T.statusText=(n||C)+"",o?g.resolveWith(p,[f,C,T]):g.rejectWith(p,[T,C,v]),T.statusCode(y),y=void 0,l&&h.trigger(o?"ajaxSuccess":"ajaxError",[T,d,o?f:v]),m.fireWith(p,[T,C]),l&&(h.trigger("ajaxComplete",[T,d]),--pe.active||pe.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,d=pe.ajaxSetup({},n),p=d.context||d,h=d.context&&(p.nodeType||p.jquery)?pe(p):pe.event,g=pe.Deferred(),m=pe.Callbacks("once memory"),y=d.statusCode||{},v={},x={},b=0,w="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!f)for(f={};t=Ut.exec(s);)f[t[1].toLowerCase()]=t[2];t=f[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=x[n]=x[n]||e,v[e]=t),this},overrideMimeType:function(e){return b||(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(b<2)for(t in e)y[t]=[y[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||w;return c&&c.abort(t),r(0,t),this}};if(g.promise(T).complete=m.add,T.success=T.done,T.error=T.fail,d.url=((t||d.url||en)+"").replace(zt,"").replace(Jt,tn[1]+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=pe.trim(d.dataType||"*").toLowerCase().match(De)||[""],null==d.crossDomain&&(i=Gt.exec(d.url.toLowerCase()),d.crossDomain=!(!i||i[1]===tn[1]&&i[2]===tn[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(tn[3]||("http:"===tn[1]?"80":"443")))),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=pe.param(d.data,d.traditional)),U(Kt,d,n,T),2===b)return T;l=pe.event&&d.global,l&&0===pe.active++&&pe.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Yt.test(d.type),a=d.url,d.hasContent||(d.data&&(a=d.url+=(It.test(a)?"&":"?")+d.data,delete d.data),d.cache===!1&&(d.url=Xt.test(a)?a.replace(Xt,"$1_="+Wt++):a+(It.test(a)?"&":"?")+"_="+Wt++)),d.ifModified&&(pe.lastModified[a]&&T.setRequestHeader("If-Modified-Since",pe.lastModified[a]),pe.etag[a]&&T.setRequestHeader("If-None-Match",pe.etag[a])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&T.setRequestHeader("Content-Type",d.contentType),T.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Zt+"; q=0.01":""):d.accepts["*"]);for(o in d.headers)T.setRequestHeader(o,d.headers[o]);if(d.beforeSend&&(d.beforeSend.call(p,T,d)===!1||2===b))return T.abort();w="abort";for(o in{success:1,error:1,complete:1})T[o](d[o]);if(c=U(Qt,d,n,T)){if(T.readyState=1,l&&h.trigger("ajaxSend",[T,d]),2===b)return T;d.async&&d.timeout>0&&(u=e.setTimeout(function(){T.abort("timeout")},d.timeout));try{b=1,c.send(v,r)}catch(C){if(!(b<2))throw C;r(-1,C)}}else r(-1,"No Transport");return T},getJSON:function(e,t,n){return pe.get(e,t,n,"json")},getScript:function(e,t){return pe.get(e,void 0,t,"script")}}),pe.each(["get","post"],function(e,t){pe[t]=function(e,n,r,i){return pe.isFunction(n)&&(i=i||r,r=n,n=void 0),pe.ajax(pe.extend({url:e,type:t,dataType:i,data:n,success:r},pe.isPlainObject(e)&&e))}}),pe._evalUrl=function(e){return pe.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},pe.fn.extend({wrapAll:function(e){if(pe.isFunction(e))return this.each(function(t){pe(this).wrapAll(e.call(this,t))});if(this[0]){var t=pe(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return pe.isFunction(e)?this.each(function(t){pe(this).wrapInner(e.call(this,t))}):this.each(function(){var t=pe(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=pe.isFunction(e);return this.each(function(n){pe(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){pe.nodeName(this,"body")||pe(this).replaceWith(this.childNodes)}).end()}}),pe.expr.filters.hidden=function(e){return fe.reliableHiddenOffsets()?e.offsetWidth<=0&&e.offsetHeight<=0&&!e.getClientRects().length:K(e)},pe.expr.filters.visible=function(e){return!pe.expr.filters.hidden(e)};var nn=/%20/g,rn=/\[\]$/,on=/\r?\n/g,an=/^(?:submit|button|image|reset|file)$/i,sn=/^(?:input|select|textarea|keygen)/i;pe.param=function(e,t){var n,r=[],i=function(e,t){t=pe.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=pe.ajaxSettings&&pe.ajaxSettings.traditional),pe.isArray(e)||e.jquery&&!pe.isPlainObject(e))pe.each(e,function(){i(this.name,this.value)});else for(n in e)Q(n,e[n],t,i);return r.join("&").replace(nn,"+")},pe.fn.extend({serialize:function(){return pe.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=pe.prop(this,"elements");return e?pe.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!pe(this).is(":disabled")&&sn.test(this.nodeName)&&!an.test(e)&&(this.checked||!Be.test(e))}).map(function(e,t){var n=pe(this).val();return null==n?null:pe.isArray(n)?pe.map(n,function(e){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),pe.ajaxSettings.xhr=void 0!==e.ActiveXObject?function(){return this.isLocal?ee():re.documentMode>8?Z():/^(get|post|head|put|delete|options)$/i.test(this.type)&&Z()||ee()}:Z;var un=0,ln={},cn=pe.ajaxSettings.xhr();e.attachEvent&&e.attachEvent("onunload",function(){for(var e in ln)ln[e](void 0,!0)}),fe.cors=!!cn&&"withCredentials"in cn,cn=fe.ajax=!!cn,cn&&pe.ajaxTransport(function(t){if(!t.crossDomain||fe.cors){var n;return{send:function(r,i){var o,a=t.xhr(),s=++un;if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(o in t.xhrFields)a[o]=t.xhrFields[o];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||r["X-Requested-With"]||(r["X-Requested-With"]="XMLHttpRequest");for(o in r)void 0!==r[o]&&a.setRequestHeader(o,r[o]+"");a.send(t.hasContent&&t.data||null),n=function(e,r){var o,u,l;if(n&&(r||4===a.readyState))if(delete ln[s],n=void 0,a.onreadystatechange=pe.noop,r)4!==a.readyState&&a.abort();else{l={},o=a.status,"string"==typeof a.responseText&&(l.text=a.responseText);try{u=a.statusText}catch(c){u=""}o||!t.isLocal||t.crossDomain?1223===o&&(o=204):o=l.text?200:404}l&&i(o,u,l,a.getAllResponseHeaders())},t.async?4===a.readyState?e.setTimeout(n):a.onreadystatechange=ln[s]=n:n()},abort:function(){n&&n(void 0,!0)}}}}),pe.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return pe.globalEval(e),e}}}),pe.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),pe.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=re.head||pe("head")[0]||re.documentElement;return{send:function(r,i){t=re.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){(n||!t.readyState||/loaded|complete/.test(t.readyState))&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||i(200,"success"))},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(void 0,!0)}}}});var fn=[],dn=/(=)\?(?=&|$)|\?\?/;pe.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=fn.pop()||pe.expando+"_"+Wt++;return this[e]=!0,e}}),pe.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=pe.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(It.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||pe.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?pe(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,fn.push(i)),a&&pe.isFunction(o)&&o(a[0]),a=o=void 0}),"script"}),pe.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||re;var r=Te.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=y([e],t,i),i&&i.length&&pe(i).remove(),pe.merge([],r.childNodes))};var pn=pe.fn.load;return pe.fn.load=function(e,t,n){if("string"!=typeof e&&pn)return pn.apply(this,arguments);var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=pe.trim(e.slice(s,e.length)),e=e.slice(0,s)),pe.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&pe.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?pe("
                          ").append(pe.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},pe.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){pe.fn[t]=function(e){return this.on(t,e)}}),pe.expr.filters.animated=function(e){return pe.grep(pe.timers,function(t){return e===t.elem}).length},pe.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=pe.css(e,"position"),f=pe(e),d={};"static"===c&&(e.style.position="relative"),s=f.offset(),o=pe.css(e,"top"),u=pe.css(e,"left"),l=("absolute"===c||"fixed"===c)&&pe.inArray("auto",[o,u])>-1,l?(r=f.position(),a=r.top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),pe.isFunction(t)&&(t=t.call(e,n,pe.extend({},s))),null!=t.top&&(d.top=t.top-s.top+a),null!=t.left&&(d.left=t.left-s.left+i),"using"in t?t.using.call(e,d):f.css(d)}},pe.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){pe.offset.setOffset(this,e,t)});var t,n,r={top:0,left:0},i=this[0],o=i&&i.ownerDocument;if(o)return t=o.documentElement,pe.contains(t,i)?("undefined"!=typeof i.getBoundingClientRect&&(r=i.getBoundingClientRect()),n=te(o),{top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:r.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):r},position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===pe.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),pe.nodeName(e[0],"html")||(n=e.offset()),n.top+=pe.css(e[0],"borderTopWidth",!0),n.left+=pe.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-pe.css(r,"marginTop",!0),left:t.left-n.left-pe.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){ +for(var e=this.offsetParent;e&&!pe.nodeName(e,"html")&&"static"===pe.css(e,"position");)e=e.offsetParent;return e||pt})}}),pe.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);pe.fn[e]=function(r){return Pe(this,function(e,r,i){var o=te(e);return void 0===i?o?t in o?o[t]:o.document.documentElement[r]:e[r]:void(o?o.scrollTo(n?pe(o).scrollLeft():i,n?i:pe(o).scrollTop()):e[r]=i)},e,r,arguments.length,null)}}),pe.each(["top","left"],function(e,t){pe.cssHooks[t]=L(fe.pixelPosition,function(e,n){if(n)return n=gt(e,t),ft.test(n)?pe(e).position()[t]+"px":n})}),pe.each({Height:"height",Width:"width"},function(e,t){pe.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){pe.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),a=n||(r===!0||i===!0?"margin":"border");return Pe(this,function(t,n,r){var i;return pe.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):void 0===r?pe.css(t,n,a):pe.style(t,n,r,a)},t,o?r:void 0,o,null)}})}),pe.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),pe.fn.size=function(){return this.length},pe.fn.andSelf=pe.fn.addBack,layui.define(function(e){layui.$=pe,e("jquery",pe)}),pe}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/laydate.js b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/laydate.js new file mode 100644 index 0000000..0766cb5 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/laydate.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;!function(){"use strict";var e=window.layui&&layui.define,t={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,n=t.length-1,a=n;a>0;a--)if("interactive"===t[a].readyState){e=t[a].src;break}return e||t[n].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),getStyle:function(e,t){var n=e.currentStyle?e.currentStyle:window.getComputedStyle(e,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](t)},link:function(e,a,i){if(n.path){var r=document.getElementsByTagName("head")[0],o=document.createElement("link");"string"==typeof a&&(i=a);var s=(i||e).replace(/\.|\//g,""),l="layuicss-"+s,d=0;o.rel="stylesheet",o.href=n.path+e,o.id=l,document.getElementById(l)||r.appendChild(o),"function"==typeof a&&!function c(){return++d>80?window.console&&console.error("laydate.css: Invalid"):void(1989===parseInt(t.getStyle(document.getElementById(l),"width"))?a():setTimeout(c,100))}()}}},n={v:"5.0.9",config:{},index:window.laydate&&window.laydate.v?1e5:0,path:t.getPath,set:function(e){var t=this;return t.config=w.extend({},t.config,e),t},ready:function(a){var i="laydate",r="",o=(e?"modules/laydate/":"theme/")+"default/laydate.css?v="+n.v+r;return e?layui.addcss(o,a,i):t.link(o,a,i),this}},a=function(){var e=this;return{hint:function(t){e.hint.call(e,t)},config:e.config}},i="laydate",r=".layui-laydate",o="layui-this",s="laydate-disabled",l="开始日期超出了结束日期
                          建议重新选择",d=[100,2e5],c="layui-laydate-static",m="layui-laydate-list",u="laydate-selected",h="layui-laydate-hint",y="laydate-day-prev",f="laydate-day-next",p="layui-laydate-footer",g=".laydate-btns-confirm",v="laydate-time-text",D=".laydate-btns-time",T=function(e){var t=this;t.index=++n.index,t.config=w.extend({},t.config,n.config,e),n.ready(function(){t.init()})},w=function(e){return new C(e)},C=function(e){for(var t=0,n="object"==typeof e?[e]:(this.selector=e,document.querySelectorAll(e||null));t0)return n[0].getAttribute(e)}():n.each(function(n,a){a.setAttribute(e,t)})},C.prototype.removeAttr=function(e){return this.each(function(t,n){n.removeAttribute(e)})},C.prototype.html=function(e){return this.each(function(t,n){n.innerHTML=e})},C.prototype.val=function(e){return this.each(function(t,n){n.value=e})},C.prototype.append=function(e){return this.each(function(t,n){"object"==typeof e?n.appendChild(e):n.innerHTML=n.innerHTML+e})},C.prototype.remove=function(e){return this.each(function(t,n){e?n.removeChild(e):n.parentNode.removeChild(n)})},C.prototype.on=function(e,t){return this.each(function(n,a){a.attachEvent?a.attachEvent("on"+e,function(e){e.target=e.srcElement,t.call(a,e)}):a.addEventListener(e,t,!1)})},C.prototype.off=function(e,t){return this.each(function(n,a){a.detachEvent?a.detachEvent("on"+e,t):a.removeEventListener(e,t,!1)})},T.isLeapYear=function(e){return e%4===0&&e%100!==0||e%400===0},T.prototype.config={type:"date",range:!1,format:"yyyy-MM-dd",value:null,isInitValue:!0,min:"1900-1-1",max:"2099-12-31",trigger:"focus",show:!1,showBottom:!0,btns:["clear","now","confirm"],lang:"cn",theme:"default",position:null,calendar:!1,mark:{},zIndex:null,done:null,change:null},T.prototype.lang=function(){var e=this,t=e.config,n={cn:{weeks:["日","一","二","三","四","五","六"],time:["时","分","秒"],timeTips:"选择时间",startTime:"开始时间",endTime:"结束时间",dateTips:"返回日期",month:["一","二","三","四","五","六","七","八","九","十","十一","十二"],tools:{confirm:"确定",clear:"清空",now:"现在"}},en:{weeks:["Su","Mo","Tu","We","Th","Fr","Sa"],time:["Hours","Minutes","Seconds"],timeTips:"Select Time",startTime:"Start Time",endTime:"End Time",dateTips:"Select Date",month:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],tools:{confirm:"Confirm",clear:"Clear",now:"Now"}}};return n[t.lang]||n.cn},T.prototype.init=function(){var e=this,t=e.config,n="yyyy|y|MM|M|dd|d|HH|H|mm|m|ss|s",a="static"===t.position,i={year:"yyyy",month:"yyyy-MM",date:"yyyy-MM-dd",time:"HH:mm:ss",datetime:"yyyy-MM-dd HH:mm:ss"};t.elem=w(t.elem),t.eventElem=w(t.eventElem),t.elem[0]&&(t.range===!0&&(t.range="-"),t.format===i.date&&(t.format=i[t.type]),e.format=t.format.match(new RegExp(n+"|.","g"))||[],e.EXP_IF="",e.EXP_SPLIT="",w.each(e.format,function(t,a){var i=new RegExp(n).test(a)?"\\d{"+function(){return new RegExp(n).test(e.format[0===t?t+1:t-1]||"")?/^yyyy|y$/.test(a)?4:a.length:/^yyyy$/.test(a)?"1,4":/^y$/.test(a)?"1,308":"1,2"}()+"}":"\\"+a;e.EXP_IF=e.EXP_IF+i,e.EXP_SPLIT=e.EXP_SPLIT+"("+i+")"}),e.EXP_IF=new RegExp("^"+(t.range?e.EXP_IF+"\\s\\"+t.range+"\\s"+e.EXP_IF:e.EXP_IF)+"$"),e.EXP_SPLIT=new RegExp("^"+e.EXP_SPLIT+"$",""),e.isInput(t.elem[0])||"focus"===t.trigger&&(t.trigger="click"),t.elem.attr("lay-key")||(t.elem.attr("lay-key",e.index),t.eventElem.attr("lay-key",e.index)),t.mark=w.extend({},t.calendar&&"cn"===t.lang?{"0-1-1":"元旦","0-2-14":"情人","0-3-8":"妇女","0-3-12":"植树","0-4-1":"愚人","0-5-1":"劳动","0-5-4":"青年","0-6-1":"儿童","0-9-10":"教师","0-9-18":"国耻","0-10-1":"国庆","0-12-25":"圣诞"}:{},t.mark),w.each(["min","max"],function(e,n){var a=[],i=[];if("number"==typeof t[n]){var r=t[n],o=(new Date).getTime(),s=864e5,l=new Date(r?r0)return!0;var a=w.elem("div",{"class":"layui-laydate-header"}),i=[function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-y"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-m"});return e.innerHTML="",e}(),function(){var e=w.elem("div",{"class":"laydate-set-ym"}),t=w.elem("span"),n=w.elem("span");return e.appendChild(t),e.appendChild(n),e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-m"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-y"});return e.innerHTML="",e}()],d=w.elem("div",{"class":"layui-laydate-content"}),c=w.elem("table"),m=w.elem("thead"),u=w.elem("tr");w.each(i,function(e,t){a.appendChild(t)}),m.appendChild(u),w.each(new Array(6),function(e){var t=c.insertRow(0);w.each(new Array(7),function(a){if(0===e){var i=w.elem("th");i.innerHTML=n.weeks[a],u.appendChild(i)}t.insertCell(a)})}),c.insertBefore(m,c.children[0]),d.appendChild(c),r[e]=w.elem("div",{"class":"layui-laydate-main laydate-main-list-"+e}),r[e].appendChild(a),r[e].appendChild(d),o.push(i),s.push(d),l.push(c)}),w(d).html(function(){var e=[],i=[];return"datetime"===t.type&&e.push(''+n.timeTips+""),w.each(t.btns,function(e,r){var o=n.tools[r]||"btn";t.range&&"now"===r||(a&&"clear"===r&&(o="cn"===t.lang?"重置":"Reset"),i.push(''+o+""))}),e.push('"),e.join("")}()),w.each(r,function(e,t){i.appendChild(t)}),t.showBottom&&i.appendChild(d),/^#/.test(t.theme)){var m=w.elem("style"),u=["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} .layui-this{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,e.elemID).replace(/{{theme}}/g,t.theme);"styleSheet"in m?(m.setAttribute("type","text/css"),m.styleSheet.cssText=u):m.innerHTML=u,w(i).addClass("laydate-theme-molv"),i.appendChild(m)}e.remove(T.thisElemDate),a?t.elem.append(i):(document.body.appendChild(i),e.position()),e.checkDate().calendar(),e.changeEvent(),T.thisElemDate=e.elemID,"function"==typeof t.ready&&t.ready(w.extend({},t.dateTime,{month:t.dateTime.month+1}))},T.prototype.remove=function(e){var t=this,n=(t.config,w("#"+(e||t.elemID)));return n.hasClass(c)||t.checkDate(function(){n.remove()}),t},T.prototype.position=function(){var e=this,t=e.config,n=e.bindElem||t.elem[0],a=n.getBoundingClientRect(),i=e.elem.offsetWidth,r=e.elem.offsetHeight,o=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},s=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},l=5,d=a.left,c=a.bottom;d+i+l>s("width")&&(d=s("width")-i-l),c+r+l>s()&&(c=a.top>r?a.top-r:s()-r,c-=2*l),t.position&&(e.elem.style.position=t.position),e.elem.style.left=d+("fixed"===t.position?0:o(1))+"px",e.elem.style.top=c+("fixed"===t.position?0:o())+"px"},T.prototype.hint=function(e){var t=this,n=(t.config,w.elem("div",{"class":h}));t.elem&&(n.innerHTML=e||"",w(t.elem).find("."+h).remove(),t.elem.appendChild(n),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){w(t.elem).find("."+h).remove()},3e3))},T.prototype.getAsYM=function(e,t,n){return n?t--:t++,t<0&&(t=11,e--),t>11&&(t=0,e++),[e,t]},T.prototype.systemDate=function(e){var t=e||new Date;return{year:t.getFullYear(),month:t.getMonth(),date:t.getDate(),hours:e?e.getHours():0,minutes:e?e.getMinutes():0,seconds:e?e.getSeconds():0}},T.prototype.checkDate=function(e){var t,a,i=this,r=(new Date,i.config),o=r.dateTime=r.dateTime||i.systemDate(),s=i.bindElem||r.elem[0],l=(i.isInput(s)?"val":"html",i.isInput(s)?s.value:"static"===r.position?"":s.innerHTML),c=function(e){e.year>d[1]&&(e.year=d[1],a=!0),e.month>11&&(e.month=11,a=!0),e.hours>23&&(e.hours=0,a=!0),e.minutes>59&&(e.minutes=0,e.hours++,a=!0),e.seconds>59&&(e.seconds=0,e.minutes++,a=!0),t=n.getEndDate(e.month+1,e.year),e.date>t&&(e.date=t,a=!0)},m=function(e,t,n){var o=["startTime","endTime"];t=(t.match(i.EXP_SPLIT)||[]).slice(1),n=n||0,r.range&&(i[o[n]]=i[o[n]]||{}),w.each(i.format,function(s,l){var c=parseFloat(t[s]);t[s].length必须遵循下述格式:
                          "+(r.range?r.format+" "+r.range+" "+r.format:r.format)+"
                          已为你重置"),a=!0):l&&l.constructor===Date?r.dateTime=i.systemDate(l):(r.dateTime=i.systemDate(),delete i.startState,delete i.endState,delete i.startDate,delete i.endDate,delete i.startTime,delete i.endTime),c(o),a&&l&&i.setValue(r.range?i.endDate?i.parse():"":i.parse()),e&&e(),i)},T.prototype.mark=function(e,t){var n,a=this,i=a.config;return w.each(i.mark,function(e,a){var i=e.split("-");i[0]!=t[0]&&0!=i[0]||i[1]!=t[1]&&0!=i[1]||i[2]!=t[2]||(n=a||t[2])}),n&&e.html(''+n+""),a},T.prototype.limit=function(e,t,n,a){var i,r=this,o=r.config,l={},d=o[n>41?"endDate":"dateTime"],c=w.extend({},d,t||{});return w.each({now:c,min:o.min,max:o.max},function(e,t){l[e]=r.newDate(w.extend({year:t.year,month:t.month,date:t.date},function(){var e={};return w.each(a,function(n,a){e[a]=t[a]}),e}())).getTime()}),i=l.nowl.max,e&&e[i?"addClass":"removeClass"](s),i},T.prototype.calendar=function(e){var t,a,i,r=this,s=r.config,l=e||s.dateTime,c=new Date,m=r.lang(),u="date"!==s.type&&"datetime"!==s.type,h=e?1:0,y=w(r.table[h]).find("td"),f=w(r.elemHeader[h][2]).find("span");if(l.yeard[1]&&(l.year=d[1],r.hint("最高只能支持到公元"+d[1]+"年")),r.firstDate||(r.firstDate=w.extend({},l)),c.setFullYear(l.year,l.month,1),t=c.getDay(),a=n.getEndDate(l.month||12,l.year),i=n.getEndDate(l.month+1,l.year),w.each(y,function(e,n){var d=[l.year,l.month],c=0;n=w(n),n.removeAttr("class"),e=t&&e=n.firstDate.year&&(r.month=a.max.month,r.date=a.max.date),n.limit(w(i),r,t),M++}),w(u[f?0:1]).attr("lay-ym",M-8+"-"+T[1]).html(b+p+" - "+(M-1+p))}else if("month"===e)w.each(new Array(12),function(e){var i=w.elem("li",{"lay-ym":e}),s={year:T[0],month:e};e+1==T[1]&&w(i).addClass(o),i.innerHTML=r.month[e]+(f?"月":""),d.appendChild(i),T[0]=n.firstDate.year&&(s.date=a.max.date),n.limit(w(i),s,t)}),w(u[f?0:1]).attr("lay-ym",T[0]+"-"+T[1]).html(T[0]+p);else if("time"===e){var E=function(){w(d).find("ol").each(function(e,a){w(a).find("li").each(function(a,i){n.limit(w(i),[{hours:a},{hours:n[x].hours,minutes:a},{hours:n[x].hours,minutes:n[x].minutes,seconds:a}][e],t,[["hours"],["hours","minutes"],["hours","minutes","seconds"]][e])})}),a.range||n.limit(w(n.footer).find(g),n[x],0,["hours","minutes","seconds"])};a.range?n[x]||(n[x]={hours:0,minutes:0,seconds:0}):n[x]=i,w.each([24,60,60],function(e,t){var a=w.elem("li"),i=["

                          "+r.time[e]+"

                            "];w.each(new Array(t),function(t){i.push(""+w.digit(t,2)+"")}),a.innerHTML=i.join("")+"
                          ",d.appendChild(a)}),E()}if(y&&h.removeChild(y),h.appendChild(d),"year"===e||"month"===e)w(n.elemMain[t]).addClass("laydate-ym-show"),w(d).find("li").on("click",function(){var r=0|w(this).attr("lay-ym");if(!w(this).hasClass(s)){if(0===t)i[e]=r,l&&(n.startDate[e]=r),n.limit(w(n.footer).find(g),null,0);else if(l)n.endDate[e]=r;else{var c="year"===e?n.getAsYM(r,T[1]-1,"sub"):n.getAsYM(T[0],r,"sub");w.extend(i,{year:c[0],month:c[1]})}"year"===a.type||"month"===a.type?(w(d).find("."+o).removeClass(o),w(this).addClass(o),"month"===a.type&&"year"===e&&(n.listYM[t][0]=r,l&&(n[["startDate","endDate"][t]].year=r),n.list("month",t))):(n.checkDate("limit").calendar(),n.closeList()),n.setBtnStatus(),a.range||n.done(null,"change"),w(n.footer).find(D).removeClass(s)}});else{var S=w.elem("span",{"class":v}),k=function(){w(d).find("ol").each(function(e){var t=this,a=w(t).find("li");t.scrollTop=30*(n[x][C[e]]-2),t.scrollTop<=0&&a.each(function(e,n){if(!w(this).hasClass(s))return t.scrollTop=30*(e-2),!0})})},H=w(c[2]).find("."+v);k(),S.innerHTML=a.range?[r.startTime,r.endTime][t]:r.timeTips,w(n.elemMain[t]).addClass("laydate-time-show"),H[0]&&H.remove(),c[2].appendChild(S),w(d).find("ol").each(function(e){var t=this;w(t).find("li").on("click",function(){var r=0|this.innerHTML;w(this).hasClass(s)||(a.range?n[x][C[e]]=r:i[C[e]]=r,w(t).find("."+o).removeClass(o),w(this).addClass(o),E(),k(),(n.endDate||"time"===a.type)&&n.done(null,"change"),n.setBtnStatus())})})}return n},T.prototype.listYM=[],T.prototype.closeList=function(){var e=this;e.config;w.each(e.elemCont,function(t,n){w(this).find("."+m).remove(),w(e.elemMain[t]).removeClass("laydate-ym-show laydate-time-show")}),w(e.elem).find("."+v).remove()},T.prototype.setBtnStatus=function(e,t,n){var a,i=this,r=i.config,o=w(i.footer).find(g),d=r.range&&"date"!==r.type&&"time"!==r.type;d&&(t=t||i.startDate,n=n||i.endDate,a=i.newDate(t).getTime()>i.newDate(n).getTime(),i.limit(null,t)||i.limit(null,n)?o.addClass(s):o[a?"addClass":"removeClass"](s),e&&a&&i.hint("string"==typeof e?l.replace(/日期/g,e):l))},T.prototype.parse=function(e,t){var n=this,a=n.config,i=t||(e?w.extend({},n.endDate,n.endTime):a.range?w.extend({},n.startDate,n.startTime):a.dateTime),r=n.format.concat();return w.each(r,function(e,t){/yyyy|y/.test(t)?r[e]=w.digit(i.year,t.length):/MM|M/.test(t)?r[e]=w.digit(i.month+1,t.length):/dd|d/.test(t)?r[e]=w.digit(i.date,t.length):/HH|H/.test(t)?r[e]=w.digit(i.hours,t.length):/mm|m/.test(t)?r[e]=w.digit(i.minutes,t.length):/ss|s/.test(t)&&(r[e]=w.digit(i.seconds,t.length))}),a.range&&!e?r.join("")+" "+a.range+" "+n.parse(1):r.join("")},T.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},T.prototype.setValue=function(e){var t=this,n=t.config,a=t.bindElem||n.elem[0],i=t.isInput(a)?"val":"html";return"static"===n.position||w(a)[i](e||""),this},T.prototype.stampRange=function(){var e,t,n=this,a=n.config,i=w(n.elem).find("td");if(a.range&&!n.endDate&&w(n.footer).find(g).addClass(s),n.endDate)return e=n.newDate({year:n.startDate.year,month:n.startDate.month,date:n.startDate.date}).getTime(),t=n.newDate({year:n.endDate.year,month:n.endDate.month,date:n.endDate.date}).getTime(),e>t?n.hint(l):void w.each(i,function(a,i){var r=w(i).attr("lay-ymd").split("-"),s=n.newDate({year:r[0],month:r[1]-1,date:r[2]}).getTime();w(i).removeClass(u+" "+o),s!==e&&s!==t||w(i).addClass(w(i).hasClass(y)||w(i).hasClass(f)?u:o),s>e&&s','
                          '+f+"
                          ",'
                          ','',"
                          ","
                          "].join(""));return l.ie&&l.ie<8?c.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),s.call(a,m,c[0],y),c.addClass("layui-hide").after(m),a.index)},c.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},c.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},c.prototype.setContent=function(t,i,a){var l=u(t);l[0]&&(a?e(l[0].document.body).append(i):e(l[0].document.body).html(i),layedit.sync(t))},c.prototype.sync=function(t){var i=u(t);if(i[0]){var a=e("#"+i[1].attr("textarea"));a.val(d(i[0].document.body.innerHTML))}},c.prototype.getSelection=function(t){var e=u(t);if(e[0]){var i=m(e[0].document);return document.selection?i.text:i.toString()}};var s=function(t,i,a){var l=this,n=t.find("iframe");n.css({height:a.height}).on("load",function(){var o=n.contents(),r=n.prop("contentWindow"),c=o.find("head"),s=e([""].join("")),u=o.find("body");c.append(s),u.attr("contenteditable","true").css({"min-height":a.height}).html(i.value||""),y.apply(l,[r,n,i,a]),g.call(l,r,t,a)})},u=function(t){var i=e("#LAY_layedit_"+t),a=i.prop("contentWindow");return[a,i]},d=function(t){return 8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),t},y=function(t,a,n,o){var r=t.document,c=e(r.body);c.on("keydown",function(t){var e=t.keyCode;if(13===e){var a=m(r),l=p(a),n=l.parentNode;if("pre"===n.tagName.toLowerCase()){if(t.shiftKey)return;return i.msg("请暂时用shift+enter"),!1}r.execCommand("formatBlock",!1,"

                          ")}}),e(n).parents("form").on("submit",function(){var t=c.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),c.on("paste",function(e){r.execCommand("formatBlock",!1,"

                          "),setTimeout(function(){f.call(t,c),n.value=c.html()},100)})},f=function(t){var i=this;i.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),e(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},m=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},p=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,i,a){var l=this.document,n=document.createElement(t);for(var o in i)n.setAttribute(o,i[o]);if(n.removeAttribute("text"),l.selection){var r=a.text||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.pasteHTML(e(n).prop("outerHTML")),a.select()}else{var r=a.toString()||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.deleteContents(),a.insertNode(n)}},h=function(t,i){var a=this.document,l="layedit-tool-active",n=p(m(a)),o=function(e){return t.find(".layedit-tool-"+e)};i&&i[i.hasClass(l)?"removeClass":"addClass"](l),t.find(">i").removeClass(l),o("unlink").addClass(r),e(n).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||o("b").addClass(l),"i"!==t&&"em"!==t||o("i").addClass(l),"u"===t&&o("u").addClass(l),"strike"===t&&o("d").addClass(l),"p"===t&&("center"===e?o("center").addClass(l):"right"===e?o("right").addClass(l):o("left").addClass(l)),"a"===t&&(o("link").addClass(l),o("unlink").removeClass(r))})},g=function(t,a,l){var n=t.document,o=e(n.body),c={link:function(i){var a=p(i),l=e(a).parent();b.call(o,{href:l.attr("href"),target:l.attr("target")},function(e){var a=l[0];"A"===a.tagName?a.href=e.url:v.call(t,"a",{target:e.target,href:e.url,text:e.url},i)})},unlink:function(t){n.execCommand("unlink")},face:function(e){x.call(this,function(i){v.call(t,"img",{src:i.src,alt:i.alt},e)})},image:function(a){var n=this;layui.use("upload",function(o){var r=l.uploadImage||{};o.render({url:r.url,method:r.type,elem:e(n).find("input")[0],done:function(e){0==e.code?(e.data=e.data||{},v.call(t,"img",{src:e.data.src,alt:e.data.title},a)):i.msg(e.msg||"上传失败")}})})},code:function(e){k.call(o,function(i){v.call(t,"pre",{text:i.code,"lay-lang":i.lang},e)})},help:function(){i.open({type:2,title:"帮助",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["http://www.layui.com/about/layedit/help.html","no"]})}},s=a.find(".layui-layedit-tool"),u=function(){var i=e(this),a=i.attr("layedit-event"),l=i.attr("lay-command");if(!i.hasClass(r)){o.focus();var u=m(n);u.commonAncestorContainer;l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand("formatBlock",!1,"

                          "),setTimeout(function(){o.focus()},10)):c[a]&&c[a].call(this,u),h.call(t,s,i)}},d=/image/;s.find(">i").on("mousedown",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)||u.call(this)}).on("click",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)&&u.call(this)}),o.on("click",function(){h.call(t,s),i.close(x.index)})},b=function(t,e){var l=this,n=i.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"超链接",skin:"layui-layer-msg",content:['

                            ','
                          • ','','
                            ','',"
                            ","
                          • ",'
                          • ','','
                            ','",'","
                            ","
                          • ",'
                          • ','','',"
                          • ","
                          "].join(""),success:function(t,n){var o="submit(layedit-link-yes)";a.render("radio"),t.find(".layui-btn-primary").on("click",function(){i.close(n),l.focus()}),a.on(o,function(t){i.close(b.index),e&&e(t.field)})}});b.index=n},x=function(t){var a=function(){var t=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],e={};return layui.each(t,function(t,i){e[i]=layui.cache.dir+"images/face/"+t+".gif"}),e}();return x.hide=x.hide||function(t){"face"!==e(t.target).attr("layedit-event")&&i.close(x.index)},x.index=i.tips(function(){var t=[];return layui.each(a,function(e,i){t.push('
                        • '+e+'
                        • ')}),'
                            '+t.join("")+"
                          "}(),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(l,n){l.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){t&&t({src:a[this.title],alt:this.title}),i.close(n)}),e(document).off("click",x.hide).on("click",x.hide)}})},k=function(t){var e=this,l=i.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"插入代码",skin:"layui-layer-msg",content:['
                            ','
                          • ','','
                            ','","
                            ","
                          • ",'
                          • ','','
                            ','',"
                            ","
                          • ",'
                          • ','','',"
                          • ","
                          "].join(""),success:function(l,n){var o="submit(layedit-code-yes)";a.render("select"),l.find(".layui-btn-primary").on("click",function(){i.close(n),e.focus()}),a.on(o,function(e){i.close(k.index),t&&t(e.field)})}});k.index=l},C={html:'',strong:'',italic:'',underline:'',del:'',"|":'',left:'',center:'',right:'',link:'',unlink:'',face:'',image:'',code:'',help:''},w=new c;t(n,w)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/layer.js b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/layer.js new file mode 100644 index 0000000..03e780c --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/layer.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,i=t.length-1,n=i;n>0;n--)if("interactive"===t[n].readyState){e=t[n].src;break}return e||t[i].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"],getStyle:function(t,i){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](i)},link:function(t,i,n){if(r.path){var a=document.getElementsByTagName("head")[0],s=document.createElement("link");"string"==typeof i&&(n=i);var l=(n||t).replace(/\.|\//g,""),f="layuicss-"+l,c=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,document.getElementById(f)||a.appendChild(s),"function"==typeof i&&!function u(){return++c>80?e.console&&console.error("layer.css: Invalid"):void(1989===parseInt(o.getStyle(document.getElementById(f),"width"))?i():setTimeout(u,100))}()}}},r={v:"3.1.1",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):o.link("theme/"+e.extend),this):this},ready:function(e){var t="layer",i="",n=(a?"modules/layer/":"theme/")+"default/layer.css?v="+r.v+i;return a?layui.addcss(n,e,t):o.link(n,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),document.body?t.creat():setTimeout(function(){t.creat()},30)};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim-00","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'
                          '+(f?r.title[0]:r.title)+"
                          ":"";return r.zIndex=s,t([r.shade?'
                          ':"",'
                          '+(e&&2!=r.type?"":u)+'
                          '+(0==r.type&&r.icon!==-1?'':"")+(1==r.type&&e?"":r.content||"")+'
                          '+function(){var e=c?'':"";return r.closeBtn&&(e+=''),e}()+""+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t'+r.btn[t]+"";return'
                          '+e+"
                          "}():"")+(r.resize?'':"")+"
                          "],u,i('
                          ')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"","auto"];t.content='';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}if(e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),i("#layui-layer-shade"+e.index).css({"background-color":t.shade[1]||"#000",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]){var u="layer-anim "+l.anim[t.anim];e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data("isOutAnim",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i("#"+l[0]+e);""===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find("."+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css("padding-top"))))};switch(a.type){case 2:u("iframe");break;default:""===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u("."+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u("."+l[5])):u("."+l[5])}return t},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;af&&(a=f),ou&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("isOutAnim")&&t.addClass("layer-anim "+a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),r.ie&&r.ie<10||!t.data("isOutAnim")?f():setTimeout(function(){f()},200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'":function(){return''}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(t){s=t.find(".layui-layer-input"),s.val(e.value||"").focus(),"function"==typeof f&&f(t)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n="layui-this",a=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,a="";if(e>0)for(a=''+t[0].title+"";i"+t[i].title+"";return a}(),content:'
                            '+function(){var e=t.length,i=1,a="";if(e>0)for(a='
                          • '+(t[0].content||"no content")+"
                          • ";i'+(t[i].content||"no content")+"";return a}()+"
                          ",success:function(t){var o=t.find(".layui-layer-title").children(),r=t.find(".layui-layer-tabmain").children();o.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),"function"==typeof e.change&&e.change(o)}),"function"==typeof a&&a(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]'+(u[d].alt||
                          '+(u.length>1?'':"")+'
                          '+(u[d].alt||"")+""+s.imgIndex+"/"+u.length+"
                          ",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常
                          是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/layim.js b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/layim.js new file mode 100644 index 0000000..73b22b0 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/layim.js @@ -0,0 +1,3 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ +;layui.define(["layer","laytpl","upload"],function(i){var a="3.9.1",e=layui.$,t=layui.layer,n=layui.laytpl,l=layui.device(),s="layui-show",o="layim-this",d=20,r={},c=function(){this.v=a,e("body").on("click","*[layim-event]",function(i){var a=e(this),t=a.attr("layim-event");ti[t]?ti[t].call(this,a,i):""})};c.prototype.config=function(i){var a=[];if(layui.each(Array(5),function(i){a.push(layui.cache.dir+"css/modules/layim/skin/"+(i+1)+".jpg")}),i=i||{},i.skin=i.skin||[],layui.each(i.skin,function(i,e){a.unshift(e)}),i.skin=a,i=e.extend({isfriend:!0,isgroup:!0,voice:"default.mp3"},i),window.JSON&&window.JSON.parse)return H(i),this},c.prototype.on=function(i,a){return"function"==typeof a&&(r[i]?r[i].push(a):r[i]=[a]),this},c.prototype.cache=function(){return j},c.prototype.chat=function(i){if(window.JSON&&window.JSON.parse)return z(i),this},c.prototype.setChatMin=function(){return N(),this},c.prototype.setChatStatus=function(i){var a=_();if(a){var e=a.elem.find(".layim-chat-status");return e.html(i),this}},c.prototype.getMessage=function(i){return K(i),this},c.prototype.notice=function(i){return J(i),this},c.prototype.add=function(i){return M(i),this},c.prototype.setFriendGroup=function(i){return M(i,"setGroup"),this},c.prototype.msgbox=function(i){return V(i),this},c.prototype.addList=function(i){return P(i),this},c.prototype.removeList=function(i){return W(i),this},c.prototype.setFriendStatus=function(i,a){var t=e(".layim-friend"+i);t["online"===a?"removeClass":"addClass"]("layim-list-gray")},c.prototype.content=function(i){return layui.data.content(i)};var u=function(i){var a={friend:"该分组下暂无好友",group:"暂无群组",history:"暂无历史会话"};return i=i||{},i.item=i.item||"d."+i.type,["{{# var length = 0; layui.each("+i.item+", function(i, data){ length++; }}",'
                        • {{ data.username||data.groupname||data.name||"佚名" }}

                          {{ data.remark||data.sign||"" }}

                          new
                        • ',"{{# }); if(length === 0){ }}",'
                        • '+(a[i.type]||"暂无数据")+"
                        • ","{{# } }}"].join("")},y=['
                          ','
                          ','
                          {{ d.mine.username }}
                          ','
                          ','{{# if(d.mine.status === "online"){ }}','','{{# } else if(d.mine.status === "hide") { }}','',"{{# } }}",'
                            ','
                          • 在线
                          • ','
                          • 隐身
                          • ',"
                          ","
                          ",'',"
                          ",'
                            ','
                          • ','
                          • ','
                          • ',"
                          ",'
                            ','{{# layui.each(d.friend, function(index, item){ var spread = d.local["spread"+index]; }}',"
                          • ",'
                            {{# if(spread === "true"){ }}{{# } else { }}{{# } }}{{ item.groupname||"未命名分组"+index }}( {{ (item.list||[]).length }})
                            ','
                              ',u({type:"friend",item:"item.list",index:"index"}),"
                            ","
                          • ","{{# }); if(d.friend.length === 0){ }}",'
                            • 暂无联系人
                            ',"{{# } }}","
                          ",'
                            ',"
                          • ",'
                              ',u({type:"group"}),"
                            ","
                          • ","
                          ",'
                            ',"
                          • ",'
                              ',u({type:"history"}),"
                            ","
                          • ","
                          ",'
                            ',"
                          • ",'',"
                          • ","
                          ",'
                            ','',"{{# if(d.base.msgbox){ }}",'
                          • ',"{{# } }}","{{# if(d.base.find){ }}",'
                          • ',"{{# } }}",'
                          • ',"{{# if(!d.base.copyright){ }}",'
                          • ',"{{# } }}","
                          ",'',"
                          "].join(""),m=['
                            ',"{{# layui.each(d.skin, function(index, item){ }}",'
                          • ',"{{# }); }}",'
                          • 简约
                          • ',"
                          "].join(""),f=['
                          ','
                          ','
                          ','{{ d.data.name||"佚名" }} {{d.data.temporary ? "临时会话" : ""}} {{# if(d.data.type==="group"){ }} {{# } }}','

                          ',"
                          ","
                          ",'
                          ',"
                            ","
                            ",'","
                            "].join(""),p=['
                            ','

                            {{ d.data.name||"" }}

                            ','
                            ','{{# if(d.data.type === "friend" && d.type === "setGroup"){ }}',"

                            选择分组

                            ",'{{# } if(d.data.type === "friend"){ }}','","{{# } }}",'{{# if(d.data.type === "group"){ }}',"

                            请输入验证信息

                            ",'{{# } if(d.type !== "setGroup"){ }}','',"{{# } }}","
                            ","
                            "].join(""),h=['
                          • ','
                            ',"{{# if(d.mine){ }}",'{{ layui.data.date(d.timestamp) }}{{ d.username||"佚名" }}',"{{# } else { }}",'{{ d.username||"佚名" }}{{ layui.data.date(d.timestamp) }}',"{{# } }}","
                            ",'
                            {{ layui.data.content(d.content||" ") }}
                            ',"
                          • "].join(""),v='
                          • {{ d.data.name||"佚名" }}{{# if(!d.base.brief){ }}ဇ{{# } }}
                          • ',g=function(i){return i<10?"0"+(0|i):i};layui.data.date=function(i){var a=new Date(i||new Date);return a.getFullYear()+"-"+g(a.getMonth()+1)+"-"+g(a.getDate())+" "+g(a.getHours())+":"+g(a.getMinutes())+":"+g(a.getSeconds())},layui.data.content=function(i){var a=function(i){return new RegExp("\\n*\\["+(i||"")+"(code|pre|div|span|p|table|thead|th|tbody|tr|td|ul|li|ol|li|dl|dt|dd|h2|h3|h4|h5)([\\s\\S]*?)\\]\\n*","g")};return i=(i||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""").replace(/@(\S+)(\s+?|$)/g,'@$1$2').replace(/face\[([^\s\[\]]+?)\]/g,function(i){var a=i.replace(/^face/g,"");return''+a+''}).replace(/img\[([^\s]+?)\]/g,function(i){return''}).replace(/file\([\s\S]+?\)\[[\s\S]*?\]/g,function(i){var a=(i.match(/file\(([\s\S]+?)\)\[/)||[])[1],e=(i.match(/\)\[([\s\S]*?)\]/)||[])[1];return a?''+(e||a)+"":i}).replace(/audio\[([^\s]+?)\]/g,function(i){return'

                            音频消息

                            '}).replace(/video\[([^\s]+?)\]/g,function(i){return'
                            '}).replace(/a\([\s\S]+?\)\[[\s\S]*?\]/g,function(i){var a=(i.match(/a\(([\s\S]+?)\)\[/)||[])[1],e=(i.match(/\)\[([\s\S]*?)\]/)||[])[1];return a?''+(e||a)+"":i}).replace(a(),"<$1 $2>").replace(a("/"),"").replace(/\n/g,"
                            ")};var x,b,w,k,C,S=function(i,a,n){return i=i||{},e.ajax({url:i.url,type:i.type||"get",data:i.data,dataType:i.dataType||"json",cache:!1,success:function(i){0==i.code?a&&a(i.data||{}):t.msg(i.msg||(n||"Error")+": LAYIM_NOT_GET_DATA",{time:5e3})},error:function(i,a){window.console&&console.log&&console.error("LAYIM_DATE_ERROR:"+a)}})},j={message:{},chat:[]},H=function(i){var a=i.init||{};return mine=a.mine||{},local=layui.data("layim")[mine.id]||{},obj={base:i,local:local,mine:mine,history:local.history||{}},create=function(a){var t=a.mine||{},l=layui.data("layim")[t.id]||{},s={base:i,local:l,mine:t,friend:a.friend||[],group:a.group||[],history:l.history||{}};j=e.extend(j,s),L(n(y).render(s)),(l.close||i.min)&&T(),layui.each(r.ready,function(i,a){a&&a(s)})},j=e.extend(j,obj),i.brief?layui.each(r.ready,function(i,a){a&&a(obj)}):void(a.url?S(a,create,"INIT"):create(a))},L=function(i){return t.open({type:1,area:["260px","520px"],skin:"layui-box layui-layim",title:"​",offset:"rb",id:"layui-layim",shade:!1,anim:2,resize:!1,content:i,success:function(i){x=i,R(i),j.base.right&&i.css("margin-left","-"+j.base.right),b&&t.close(b.attr("times"));var a=[],n=i.find(".layim-list-history");n.find("li").each(function(){a.push(e(this).prop("outerHTML"))}),a.length>0&&(a.reverse(),n.html(a.join(""))),A(),ti.sign()},cancel:function(i){T();var a=layui.data("layim")[j.mine.id]||{};return a.close=!0,layui.data("layim",{key:j.mine.id,value:a}),!1}})},A=function(){x.on("contextmenu",function(i){return i.cancelBubble=!0,i.returnValue=!1,!1});var i=function(){t.closeAll("tips")};x.find(".layim-list-history").on("contextmenu","li",function(a){var n=e(this),l='
                            • 移除该会话
                            • 清空全部会话列表
                            ';n.hasClass("layim-null")||(t.tips(l,this,{tips:1,time:0,anim:5,fixed:!0,skin:"layui-box layui-layim-contextmenu",success:function(i){var a=function(i){ii(i)};i.off("mousedown",a).on("mousedown",a)}}),e(document).off("mousedown",i).on("mousedown",i),e(window).off("resize",i).on("resize",i))})},T=function(i){return b&&t.close(b.attr("times")),x&&x.hide(),j.mine=j.mine||{},t.open({type:1,title:!1,id:"layui-layim-close",skin:"layui-box layui-layim-min layui-layim-close",shade:!1,closeBtn:!1,anim:2,offset:"rb",resize:!1,content:''+(i||j.base.title||"我的LayIM")+"",move:"#layui-layim-close img",success:function(i,a){b=i,j.base.right&&i.css("margin-left","-"+j.base.right),i.on("click",function(){t.close(a),x.show();var i=layui.data("layim")[j.mine.id]||{};delete i.close,layui.data("layim",{key:j.mine.id,value:i})})}})},z=function(i){i=i||{};var a=e("#layui-layim-chat"),l={data:i,base:j.base,local:j.local};if(!i.id)return t.msg("非法用户");if(a[0]){var s=w.find(".layim-chat-list"),o=s.find(".layim-chatlist-"+i.type+i.id),d=w.find(".layui-layer-max").hasClass("layui-layer-maxmin"),c=a.children(".layim-chat-box");return"none"===w.css("display")&&w.show(),k&&t.close(k.attr("times")),1!==s.find("li").length||o[0]||(d||w.css("width",800),s.css({height:w.height()}).show(),c.css("margin-left","200px")),o[0]||(s.append(n(v).render(l)),c.append(n(f).render(l)),I(i),E()),O(s.find(".layim-chatlist-"+i.type+i.id)),o[0]||U(),$(i),Q(),C}l.first=!0;var u=C=t.open({type:1,area:"600px",skin:"layui-box layui-layim-chat",id:"layui-layim-chat",title:"​",shade:!1,maxmin:!0,offset:i.offset||"auto",anim:i.anim||0,closeBtn:!j.base.brief&&1,content:n('
                              '+v+'
                            '+f+"
                            ").render(l),success:function(a){w=a,a.css({"min-width":"500px","min-height":"420px"}),I(i),"function"==typeof i.success&&i.success(a),Q(),R(a),$(i),U(),q(),layui.each(r.chatChange,function(i,a){a&&a(_())}),a.on("dblclick",".layui-layim-photos",function(){var i=this.src;t.close(z.photosIndex),t.photos({photos:{data:[{alt:"大图模式",src:i}]},shade:.01,closeBtn:2,anim:0,resize:!1,success:function(i,a){z.photosIndex=a}})})},full:function(i){t.style(u,{width:"100%",height:"100%"},!0),E()},resizing:E,restore:E,min:function(){return N(),!1},end:function(){t.closeAll("tips"),w=null}});return u},I=function(i){e(".layim-"+i.type+i.id).each(function(){e(this).hasClass("layim-list-gray")&&layui.layim.setFriendStatus(i.id,"offline")})},E=function(){var i=w.find(".layim-chat-list"),a=w.find(".layim-chat-main"),e=w.height();i.css({height:e}),a.css({height:e-20-80-158})},N=function(i){var a=i||_().data,n=layui.layim.cache().base;w&&!i&&w.hide(),t.close(N.index),N.index=t.open({type:1,title:!1,skin:"layui-box layui-layim-min",shade:!1,closeBtn:!1,anim:a.anim||2,offset:"b",move:"#layui-layim-min",resize:!1,area:["182px","50px"],content:''+a.name+"",success:function(a,l){i||(k=a),n.minRight&&t.style(l,{left:e(window).width()-a.outerWidth()-parseFloat(n.minRight)}),a.find(".layui-layer-content span").on("click",function(){t.close(l),i?layui.each(j.chat,function(i,a){z(a)}):w.show(),i&&(j.chat=[],Z())}),a.find(".layui-layer-content img").on("click",function(i){ii(i)})}})},M=function(i,a){return i=i||{},t.close(M.index),M.index=t.open({type:1,area:"430px",title:{friend:"添加好友",group:"加入群组"}[i.type]||"",shade:!1,resize:!1,btn:a?["确认","取消"]:["发送申请","关闭"],content:n(p).render({data:{name:i.username||i.groupname,avatar:i.avatar,group:i.group||parent.layui.layim.cache().friend||[],type:i.type},type:a}),yes:function(e,t){var n=t.find("#LAY_layimGroup"),l=t.find("#LAY_layimRemark");a?i.submit&&i.submit(n.val(),e):i.submit&&i.submit(n.val(),l.val(),e)}})},O=function(i,a){i=i||e(".layim-chat-list ."+o);var n=i.index()===-1?0:i.index(),l=".layim-chat",d=w.find(l).eq(n),c=w.find(".layui-layer-max").hasClass("layui-layer-maxmin");if(a){i.hasClass(o)&&O(0===n?i.next():i.prev());var u=w.find(l).length;return 1===u?t.close(C):(i.remove(),d.remove(),2===u&&(w.find(".layim-chat-list").hide(),c||w.css("width","600px"),w.find(".layim-chat-box").css("margin-left",0)),!1)}i.addClass(o).siblings().removeClass(o),d.addClass(s).siblings(l).removeClass(s),d.find("textarea").focus(),layui.each(r.chatChange,function(i,a){a&&a(_())}),q()},q=function(){var i=_(),a=j.message[i.data.type+i.data.id];a&&delete j.message[i.data.type+i.data.id]},_=c.prototype.thisChat=function(){if(w){var i=e(".layim-chat-list ."+o).index(),a=w.find(".layim-chat").eq(i),t=JSON.parse(decodeURIComponent(a.find(".layim-chat-tool").data("json")));return{elem:a,data:t,textarea:a.find("textarea")}}},R=function(i){var a=layui.data("layim")[j.mine.id]||{},e=a.skin;i.css({"background-image":e?"url("+e+")":function(){return j.base.initSkin?"url("+(layui.cache.dir+"css/modules/layim/skin/"+j.base.initSkin)+")":"none"}()})},$=function(i){var a=layui.data("layim")[j.mine.id]||{},e={},t=a.history||{},l=t[i.type+i.id];if(x){var s=x.find(".layim-list-history");if(i.historyTime=(new Date).getTime(),t[i.type+i.id]=i,a.history=t,layui.data("layim",{key:j.mine.id,value:a}),!l){e[i.type+i.id]=i;var o=n(u({type:"history",item:"d.data"})).render({data:e});s.prepend(o),s.find(".layim-null").remove()}}},D=function(){var i={username:j.mine?j.mine.username:"访客",avatar:j.mine?j.mine.avatar:layui.cache.dir+"css/pc/layim/skin/logo.jpg",id:j.mine?j.mine.id:null,mine:!0},a=_(),e=a.elem.find(".layim-chat-main ul"),l=j.base.maxLength||3e3;if(i.content=a.textarea.val(),""!==i.content.replace(/\s/g,"")){if(i.content.length>l)return t.msg("内容最长不能超过"+l+"个字符");e.append(n(h).render(i));var s={mine:i,to:a.data},o={username:s.mine.username,avatar:s.mine.avatar,id:s.to.id,type:s.to.type,content:s.mine.content,timestamp:(new Date).getTime(),mine:!0};B(o),layui.each(r.sendMessage,function(i,a){a&&a(s)})}Z(),a.textarea.val("").focus()},J=function(i){if(i=i||{},window.Notification)if("granted"===Notification.permission){new Notification(i.title||"",{body:i.content||"",icon:i.avatar||"http://tp2.sinaimg.cn/5488749285/50/5719808192/1"})}else Notification.requestPermission()},F=function(){if(!(l.ie&&l.ie<9)){var i=document.createElement("audio");i.src=layui.cache.dir+"css/modules/layim/voice/"+j.base.voice,i.play()}},G={},K=function(i){i=i||{};var a=e(".layim-chatlist-"+i.type+i.id),t={},l=a.index();if(i.timestamp=i.timestamp||(new Date).getTime(),i.fromid==j.mine.id&&(i.mine=!0),i.system||B(i),G=JSON.parse(JSON.stringify(i)),j.base.voice&&F(),!w&&i.content||l===-1){if(j.message[i.type+i.id])j.message[i.type+i.id].push(i);else if(j.message[i.type+i.id]=[i],"friend"===i.type){var s;layui.each(j.friend,function(a,e){if(layui.each(e.list,function(a,e){if(e.id==i.id)return e.type="friend",e.name=e.username,j.chat.push(e),s=!0}),s)return!0}),s||(i.name=i.username,i.temporary=!0,j.chat.push(i))}else if("group"===i.type){var o;layui.each(j.group,function(a,e){if(e.id==i.id)return e.type="group",e.name=e.groupname,j.chat.push(e),o=!0}),o||(i.name=i.groupname,j.chat.push(i))}else i.name=i.name||i.username||i.groupname,j.chat.push(i);if("group"===i.type&&layui.each(j.group,function(a,e){if(e.id==i.id)return t.avatar=e.avatar,!0}),!i.system)return j.base.notice&&J({title:"来自 "+i.username+" 的消息",content:i.content,avatar:t.avatar||i.avatar}),N({name:"收到新消息",avatar:t.avatar||i.avatar,anim:6})}if(w){var d=_();d.data.type+d.data.id!==i.type+i.id&&(a.addClass("layui-anim layer-anim-06"),setTimeout(function(){a.removeClass("layui-anim layer-anim-06")},300));var r=w.find(".layim-chat").eq(l),c=r.find(".layim-chat-main ul");i.system?l!==-1&&c.append('
                          • '+i.content+"
                          • "):""!==i.content.replace(/\s/g,"")&&c.append(n(h).render(i)),Z()}},Y="layui-anim-loop layer-anim-05",V=function(i){var a=x.find(".layim-tool-msgbox");a.find("span").addClass(Y).html(i)},B=function(i){var a=layui.data("layim")[j.mine.id]||{};a.chatlog=a.chatlog||{};var e=a.chatlog[i.type+i.id];if(e){var t;layui.each(e,function(a,e){e.timestamp===i.timestamp&&e.type===i.type&&e.id===i.id&&e.content===i.content&&(t=!0)}),t||i.fromid==j.mine.id||e.push(i),e.length>d&&e.shift()}else a.chatlog[i.type+i.id]=[i];layui.data("layim",{key:j.mine.id,value:a})},U=function(){var i=layui.data("layim")[j.mine.id]||{},a=_(),e=i.chatlog||{},t=a.elem.find(".layim-chat-main ul");layui.each(e[a.data.type+a.data.id],function(i,a){t.append(n(h).render(a))}),Z()},P=function(i){var a,e={},l=x.find(".layim-list-"+i.type);if(j[i.type])if("friend"===i.type)layui.each(j.friend,function(n,l){if(i.groupid==l.id)return layui.each(j.friend[n].list,function(e,t){if(t.id==i.id)return a=!0}),a?t.msg("好友 ["+(i.username||"")+"] 已经存在列表中",{anim:6}):(j.friend[n].list=j.friend[n].list||[],e[j.friend[n].list.length]=i,i.groupIndex=n,j.friend[n].list.push(i),!0)});else if("group"===i.type){if(layui.each(j.group,function(e,t){if(t.id==i.id)return a=!0}),a)return t.msg("您已是 ["+(i.groupname||"")+"] 的群成员",{anim:6});e[j.group.length]=i,j.group.push(i)}if(!a){var s=n(u({type:i.type,item:"d.data",index:"friend"===i.type?"data.groupIndex":null})).render({data:e});if("friend"===i.type){var o=l.find(">li").eq(i.groupIndex);o.find(".layui-layim-list").append(s),o.find(".layim-count").html(j.friend[i.groupIndex].list.length),o.find(".layim-null")[0]&&o.find(".layim-null").remove()}else"group"===i.type&&(l.append(s),l.find(".layim-null")[0]&&l.find(".layim-null").remove())}},W=function(i){var a=x.find(".layim-list-"+i.type);j[i.type]&&("friend"===i.type?layui.each(j.friend,function(e,t){layui.each(t.list,function(t,n){if(i.id==n.id){var l=a.find(">li").eq(e);l.find(".layui-layim-list>li");return l.find(".layui-layim-list>li").eq(t).remove(),j.friend[e].list.splice(t,1),l.find(".layim-count").html(j.friend[e].list.length),0===j.friend[e].list.length&&l.find(".layui-layim-list").html('
                          • 该分组下已无好友了
                          • '),!0}})}):"group"===i.type&&layui.each(j.group,function(e,t){if(i.id==t.id)return a.find(">li").eq(e).remove(),j.group.splice(e,1),0===j.group.length&&a.html('
                          • 暂无群组
                          • '),!0}))},Z=function(){var i=_(),a=i.elem.find(".layim-chat-main"),e=a.find("ul"),t=e.find("li").length;if(t>=d){var n=e.find("li").eq(0);e.prev().hasClass("layim-chat-system")||e.before('
                            查看更多记录
                            '),t>d&&n.remove()}a.scrollTop(a[0].scrollHeight+1e3),a.find("ul li:last").find("img").load(function(){a.scrollTop(a[0].scrollHeight+1e3)})},Q=function(){var i=_(),a=i.textarea;a.focus(),a.off("keydown").on("keydown",function(i){var e=layui.data("layim")[j.mine.id]||{},t=i.keyCode;if("Ctrl+Enter"===e.sendHotKey)return void(i.ctrlKey&&13===t&&D());if(13===t){if(i.ctrlKey)return a.val(a.val()+"\n");if(i.shiftKey)return;i.preventDefault(),D()}})},X=function(){var i=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],a={};return layui.each(i,function(i,e){a[e]=layui.cache.dir+"images/face/"+i+".gif"}),a}(),ii=layui.stope,ai=function(i,a){var e,t=i.value;i.focus(),document.selection?(e=document.selection.createRange(),document.selection.empty(),e.text=a):(e=[t.substring(0,i.selectionStart),a,t.substr(i.selectionEnd)],i.focus(),i.value=e.join(""))},ei="layui-anim-upbit",ti={status:function(i,a){var t=function(){i.next().hide().removeClass(ei)},n=i.attr("lay-type");if("show"===n)ii(a),i.next().show().addClass(ei),e(document).off("click",t).on("click",t);else{var l=i.parent().prev();i.addClass(o).siblings().removeClass(o),l.html(i.find("cite").html()),l.removeClass("layim-status-"+("online"===n?"hide":"online")).addClass("layim-status-"+n),layui.each(r.online,function(i,a){a&&a(n)})}},sign:function(){var i=x.find(".layui-layim-remark");i.on("change",function(){var i=this.value;layui.each(r.sign,function(a,e){e&&e(i)})}),i.on("keyup",function(i){var a=i.keyCode;13===a&&this.blur()})},tab:function(i){var a,e=".layim-tab-content",t=x.find(".layui-layim-tab>li");"number"==typeof i?(a=i,i=t.eq(a)):a=i.index(),a>2?t.removeClass(o):(ti.tab.index=a,i.addClass(o).siblings().removeClass(o)),x.find(e).eq(a).addClass(s).siblings(e).removeClass(s)},spread:function(i){var a=i.attr("lay-type"),e="true"===a?"false":"true",t=layui.data("layim")[j.mine.id]||{};i.next()["true"===a?"removeClass":"addClass"](s),t["spread"+i.parent().index()]=e,layui.data("layim",{key:j.mine.id,value:t}),i.attr("lay-type",e),i.find(".layui-icon").html("true"===e?"":"")},search:function(i){var a=x.find(".layui-layim-search"),e=x.find("#layui-layim-search"),t=a.find("input"),n=function(i){var a=t.val().replace(/\s/);if(""===a)ti.tab(0|ti.tab.index);else{for(var n=[],l=j.friend||[],s=j.group||[],o="",d=0;d0)for(var u=0;u'+(n[u].username||n[u].groupname||"佚名")+"

                            "+(n[u].remark||n[u].sign||"")+"

                            ";else o='
                          • 无搜索结果
                          • ';e.html(o),ti.tab(3)}};!j.base.isfriend&&j.base.isgroup?ti.tab.index=1:j.base.isfriend||j.base.isgroup||(ti.tab.index=2),a.show(),t.focus(),t.off("keyup",n).on("keyup",n)},closeSearch:function(i){i.parent().hide(),ti.tab(0|ti.tab.index)},msgbox:function(){var i=x.find(".layim-tool-msgbox");return t.close(ti.msgbox.index),i.find("span").removeClass(Y).html(""),ti.msgbox.index=t.open({type:2,title:"消息盒子",shade:!1,maxmin:!0,area:["600px","520px"],skin:"layui-box layui-layer-border",resize:!1,content:j.base.msgbox})},find:function(){return t.close(ti.find.index),ti.find.index=t.open({type:2,title:"查找",shade:!1,maxmin:!0,area:["1000px","520px"],skin:"layui-box layui-layer-border",resize:!1,content:j.base.find})},skin:function(){t.open({type:1,title:"更换背景",shade:!1,area:"300px",skin:"layui-box layui-layer-border",id:"layui-layim-skin",zIndex:66666666,resize:!1,content:n(m).render({skin:j.base.skin})})},about:function(){t.alert("版本: "+a+'
                            版权所有:layim.layui.com',{title:"关于 LayIM",shade:!1})},setSkin:function(i){var a=i.attr("src"),e=layui.data("layim")[j.mine.id]||{};e.skin=a,a||delete e.skin,layui.data("layim",{key:j.mine.id,value:e});try{x.css({"background-image":a?"url("+a+")":"none"}),w.css({"background-image":a?"url("+a+")":"none"})}catch(t){}layui.each(r.setSkin,function(i,e){var t=(a||"").replace(layui.cache.dir+"css/modules/layim/skin/","");e&&e(t,a)})},chat:function(i){var a=layui.data("layim")[j.mine.id]||{},e=i.data("type"),t=i.data("index"),n=i.attr("data-list")||i.index(),l={};"friend"===e?l=j[e][t].list[n]:"group"===e?l=j[e][n]:"history"===e&&(l=(a.history||{})[t]||{}),l.name=l.name||l.username||l.groupname,"history"!==e&&(l.type=e),z(l)},tabChat:function(i){O(i)},closeChat:function(i,a){O(i.parent(),1),ii(a)},closeThisChat:function(){O(null,1)},groupMembers:function(i,a){var n=i.find(".layui-icon"),l=function(){n.html(""),i.data("down",null),t.close(ti.groupMembers.index)},s=function(i){ii(i)};i.data("down")?l():(n.html(""),i.data("down",!0),ti.groupMembers.index=t.tips('
                              ',i,{tips:3,time:0,anim:5,fixed:!0,skin:"layui-box layui-layim-members",success:function(a){var t=j.base.members||{},n=_(),s=a.find(".layim-members-list"),o="",d={},c=w.find(".layui-layer-max").hasClass("layui-layer-maxmin"),u="none"===w.find(".layim-chat-list").css("display");c&&s.css({width:e(window).width()-22-(u||200)}),t.data=e.extend(t.data,{id:n.data.id}),S(t,function(a){layui.each(a.list,function(i,a){o+='
                            • '+a.username+"
                            • ",d[a.id]=a}),s.html(o),i.find(".layim-chat-members").html(a.members||(a.list||[]).length+"人"),s.find("li").on("click",function(){var i=e(this).data("uid"),a=d[i];z({name:a.username,type:"friend",avatar:a.avatar,id:a.id}),l()}),layui.each(r.members,function(i,e){e&&e(a)})}),a.on("mousedown",function(i){ii(i)})}}),e(document).off("mousedown",l).on("mousedown",l),e(window).off("resize",l).on("resize",l),i.off("mousedown",s).on("mousedown",s))},send:function(){D()},setSend:function(i,a){var t=ti.setSend.box=i.siblings(".layim-menu-box"),n=i.attr("lay-type");if("show"===n)ii(a),t.show().addClass(ei),e(document).off("click",ti.setSendHide).on("click",ti.setSendHide);else{i.addClass(o).siblings().removeClass(o);var l=layui.data("layim")[j.mine.id]||{};l.sendHotKey=n,layui.data("layim",{key:j.mine.id,value:l}),ti.setSendHide(a,i.parent())}},setSendHide:function(i,a){(a||ti.setSend.box).hide().removeClass(ei)},face:function(i,a){var n="",l=_();for(var s in X)n+='
                            • ';n='
                                '+n+"
                              ",ti.face.index=t.tips(n,i,{tips:1,time:0,fixed:!0,skin:"layui-box layui-layim-face",success:function(i){i.find(".layim-face-list>li").on("mousedown",function(i){ii(i)}).on("click",function(){ai(l.textarea[0],"face"+this.title+" "),t.close(ti.face.index); +})}}),e(document).off("mousedown",ti.faceHide).on("mousedown",ti.faceHide),e(window).off("resize",ti.faceHide).on("resize",ti.faceHide),ii(a)},faceHide:function(){t.close(ti.face.index)},image:function(i){var a=i.data("type")||"images",e={images:"uploadImage",file:"uploadFile"},n=_(),l=j.base[e[a]]||{};layui.upload.render({url:l.url||"",method:l.type,elem:i.find("input")[0],accept:a,done:function(i){0==i.code?(i.data=i.data||{},"images"===a?ai(n.textarea[0],"img["+(i.data.src||"")+"]"):"file"===a&&ai(n.textarea[0],"file("+(i.data.src||"")+")["+(i.data.name||"下载文件")+"]"),D()):t.msg(i.msg||"上传失败")}})},media:function(i){var a=i.data("type"),n={audio:"音频",video:"视频"},l=_();t.prompt({title:"请输入网络"+n[a]+"地址",shade:!1,offset:[i.offset().top-e(window).scrollTop()-158+"px",i.offset().left+"px"]},function(i,e){ai(l.textarea[0],a+"["+i+"]"),D(),t.close(e)})},extend:function(i){var a=i.attr("lay-filter"),e=_();layui.each(r["tool("+a+")"],function(a,t){t&&t.call(i,function(i){ai(e.textarea[0],i)},D,e)})},playAudio:function(i){var a=i.data("audio"),e=a||document.createElement("audio"),n=function(){e.pause(),i.removeAttr("status"),i.find("i").html("")};return i.data("error")?t.msg("播放音频源异常"):e.play?void(i.attr("status")?n():(a||(e.src=i.data("src")),e.play(),i.attr("status","pause"),i.data("audio",e),i.find("i").html(""),e.onended=function(){n()},e.onerror=function(){t.msg("播放音频源异常"),i.data("error",!0),n()})):t.msg("您的浏览器不支持audio")},playVideo:function(i){var a=i.data("src"),e=document.createElement("video");return e.play?(t.close(ti.playVideo.index),void(ti.playVideo.index=t.open({type:1,title:"播放视频",area:["460px","300px"],maxmin:!0,shade:!1,content:'
                              '}))):t.msg("您的浏览器不支持video")},chatLog:function(i){var a=_();return j.base.chatLog?(t.close(ti.chatLog.index),ti.chatLog.index=t.open({type:2,maxmin:!0,title:"与 "+a.data.name+" 的聊天记录",area:["450px","100%"],shade:!1,offset:"rb",skin:"layui-box",anim:2,id:"layui-layim-chatlog",content:j.base.chatLog+"?id="+a.data.id+"&type="+a.data.type})):t.msg("未开启更多聊天记录")},menuHistory:function(i,a){var n=layui.data("layim")[j.mine.id]||{},l=i.parent(),s=i.data("type"),o=x.find(".layim-list-history"),d='
                            • 暂无历史会话
                            • ';if("one"===s){var r=n.history;delete r[l.data("index")],n.history=r,layui.data("layim",{key:j.mine.id,value:n}),e(".layim-list-history li.layim-"+l.data("index")).remove(),0===o.find("li").length&&o.html(d)}else"all"===s&&(delete n.history,layui.data("layim",{key:j.mine.id,value:n}),o.html(d));t.closeAll("tips")}};i("layim",new c)}).addcss("modules/layim/layim.css?v=3.9.1","skinlayimcss"); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/laypage.js b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/laypage.js new file mode 100644 index 0000000..2e2ab0d --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/laypage.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?''+a.prev+"":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push(''+(a.first||1)+"");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r2&&e.push('…');r<=u;r++)r===a.curr?e.push('"+r+""):e.push(''+r+"");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1…'),0!==t&&e.push(''+(a.last||a.pages)+"")),e.join("")}(),next:function(){return a.next?''+a.next+"":""}(),count:'共 '+a.count+" 条",limit:function(){var e=['"}(),refresh:['','',""].join(""),skip:function(){return['到第','','页',""].join("")}()};return['
                              ',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"
                              "].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;oi.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){a.target=a.srcElement,t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/laytpl.js b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/laytpl.js new file mode 100644 index 0000000..11cc3c4 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/laytpl.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/mobile.js b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/mobile.js new file mode 100644 index 0000000..ebda601 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/mobile.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define(function(i){i("layui.mobile",layui.v)});layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)});layui.define(function(e){"use strict";var t=(window,document),i="querySelectorAll",n="getElementsByClassName",a=function(e){return t[i](e)},s={type:0,shade:!0,shadeClose:!0,fixed:!0,anim:"scale"},l={extend:function(e){var t=JSON.parse(JSON.stringify(s));for(var i in e)t[i]=e[i];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener("click",function(e){t.call(this,e)},!1)};var o=0,r=["layui-m-layer"],d=function(e){var t=this;t.config=l.extend(e),t.view()};d.prototype.view=function(){var e=this,i=e.config,s=t.createElement("div");e.id=s.id=r[0]+o,s.setAttribute("class",r[0]+" "+r[0]+(i.type||0)),s.setAttribute("index",o);var l=function(){var e="object"==typeof i.title;return i.title?'

                              '+(e?i.title[0]:i.title)+"

                              ":""}(),d=function(){"string"==typeof i.btn&&(i.btn=[i.btn]);var e,t=(i.btn||[]).length;return 0!==t&&i.btn?(e=''+i.btn[0]+"",2===t&&(e=''+i.btn[1]+""+e),'
                              '+e+"
                              "):""}();if(i.fixed||(i.top=i.hasOwnProperty("top")?i.top:100,i.style=i.style||"",i.style+=" top:"+(t.body.scrollTop+i.top)+"px"),2===i.type&&(i.content='

                              '+(i.content||"")+"

                              "),i.skin&&(i.anim="up"),"msg"===i.skin&&(i.shade=!1),s.innerHTML=(i.shade?"
                              ':"")+'
                              "+l+'
                              '+i.content+"
                              "+d+"
                              ",!i.type||2===i.type){var y=t[n](r[0]+i.type),u=y.length;u>=1&&c.close(y[0].getAttribute("index"))}document.body.appendChild(s);var m=e.elem=a("#"+e.id)[0];i.success&&i.success(m),e.index=o++,e.action(i,m)},d.prototype.action=function(e,t){var i=this;e.time&&(l.timer[i.index]=setTimeout(function(){c.close(i.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),c.close(i.index)):e.yes?e.yes(i.index):c.close(i.index)};if(e.btn)for(var s=t[n]("layui-m-layerbtn")[0].children,o=s.length,r=0;r0&&e-1 in t)}function s(t){return A.call(t,function(t){return null!=t})}function u(t){return t.length>0?T.fn.concat.apply([],t):t}function c(t){return t.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function l(t){return t in F?F[t]:F[t]=new RegExp("(^|\\s)"+t+"(\\s|$)")}function f(t,e){return"number"!=typeof e||k[c(t)]?e:e+"px"}function h(t){var e,n;return $[t]||(e=L.createElement(t),L.body.appendChild(e),n=getComputedStyle(e,"").getPropertyValue("display"),e.parentNode.removeChild(e),"none"==n&&(n="block"),$[t]=n),$[t]}function p(t){return"children"in t?D.call(t.children):T.map(t.childNodes,function(t){if(1==t.nodeType)return t})}function d(t,e){var n,r=t?t.length:0;for(n=0;n]*>/,R=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Z=/^(?:body|html)$/i,q=/([A-Z])/g,H=["val","css","html","text","data","width","height","offset"],I=["after","prepend","before","append"],V=L.createElement("table"),_=L.createElement("tr"),B={tr:L.createElement("tbody"),tbody:V,thead:V,tfoot:V,td:_,th:_,"*":L.createElement("div")},U=/complete|loaded|interactive/,X=/^[\w-]*$/,J={},W=J.toString,Y={},G=L.createElement("div"),K={tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},Q=Array.isArray||function(t){return t instanceof Array};return Y.matches=function(t,e){if(!e||!t||1!==t.nodeType)return!1;var n=t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.oMatchesSelector||t.matchesSelector;if(n)return n.call(t,e);var r,i=t.parentNode,o=!i;return o&&(i=G).appendChild(t),r=~Y.qsa(i,e).indexOf(t),o&&G.removeChild(t),r},C=function(t){return t.replace(/-+(.)?/g,function(t,e){return e?e.toUpperCase():""})},N=function(t){return A.call(t,function(e,n){return t.indexOf(e)==n})},Y.fragment=function(t,e,n){var r,i,a;return R.test(t)&&(r=T(L.createElement(RegExp.$1))),r||(t.replace&&(t=t.replace(z,"<$1>")),e===E&&(e=M.test(t)&&RegExp.$1),e in B||(e="*"),a=B[e],a.innerHTML=""+t,r=T.each(D.call(a.childNodes),function(){a.removeChild(this)})),o(n)&&(i=T(r),T.each(n,function(t,e){H.indexOf(t)>-1?i[t](e):i.attr(t,e)})),r},Y.Z=function(t,e){return new d(t,e)},Y.isZ=function(t){return t instanceof Y.Z},Y.init=function(t,n){var r;if(!t)return Y.Z();if("string"==typeof t)if(t=t.trim(),"<"==t[0]&&M.test(t))r=Y.fragment(t,RegExp.$1,n),t=null;else{if(n!==E)return T(n).find(t);r=Y.qsa(L,t)}else{if(e(t))return T(L).ready(t);if(Y.isZ(t))return t;if(Q(t))r=s(t);else if(i(t))r=[t],t=null;else if(M.test(t))r=Y.fragment(t.trim(),RegExp.$1,n),t=null;else{if(n!==E)return T(n).find(t);r=Y.qsa(L,t)}}return Y.Z(r,t)},T=function(t,e){return Y.init(t,e)},T.extend=function(t){var e,n=D.call(arguments,1);return"boolean"==typeof t&&(e=t,t=n.shift()),n.forEach(function(n){m(t,n,e)}),t},Y.qsa=function(t,e){var n,r="#"==e[0],i=!r&&"."==e[0],o=r||i?e.slice(1):e,a=X.test(o);return t.getElementById&&a&&r?(n=t.getElementById(o))?[n]:[]:1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType?[]:D.call(a&&!r&&t.getElementsByClassName?i?t.getElementsByClassName(o):t.getElementsByTagName(e):t.querySelectorAll(e))},T.contains=L.documentElement.contains?function(t,e){return t!==e&&t.contains(e)}:function(t,e){for(;e&&(e=e.parentNode);)if(e===t)return!0;return!1},T.type=t,T.isFunction=e,T.isWindow=n,T.isArray=Q,T.isPlainObject=o,T.isEmptyObject=function(t){var e;for(e in t)return!1;return!0},T.isNumeric=function(t){var e=Number(t),n=typeof t;return null!=t&&"boolean"!=n&&("string"!=n||t.length)&&!isNaN(e)&&isFinite(e)||!1},T.inArray=function(t,e,n){return O.indexOf.call(e,t,n)},T.camelCase=C,T.trim=function(t){return null==t?"":String.prototype.trim.call(t)},T.uuid=0,T.support={},T.expr={},T.noop=function(){},T.map=function(t,e){var n,r,i,o=[];if(a(t))for(r=0;r=0?t:t+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each(function(){null!=this.parentNode&&this.parentNode.removeChild(this)})},each:function(t){return O.every.call(this,function(e,n){return t.call(e,n,e)!==!1}),this},filter:function(t){return e(t)?this.not(this.not(t)):T(A.call(this,function(e){return Y.matches(e,t)}))},add:function(t,e){return T(N(this.concat(T(t,e))))},is:function(t){return this.length>0&&Y.matches(this[0],t)},not:function(t){var n=[];if(e(t)&&t.call!==E)this.each(function(e){t.call(this,e)||n.push(this)});else{var r="string"==typeof t?this.filter(t):a(t)&&e(t.item)?D.call(t):T(t);this.forEach(function(t){r.indexOf(t)<0&&n.push(t)})}return T(n)},has:function(t){return this.filter(function(){return i(t)?T.contains(this,t):T(this).find(t).size()})},eq:function(t){return t===-1?this.slice(t):this.slice(t,+t+1)},first:function(){var t=this[0];return t&&!i(t)?t:T(t)},last:function(){var t=this[this.length-1];return t&&!i(t)?t:T(t)},find:function(t){var e,n=this;return e=t?"object"==typeof t?T(t).filter(function(){var t=this;return O.some.call(n,function(e){return T.contains(e,t)})}):1==this.length?T(Y.qsa(this[0],t)):this.map(function(){return Y.qsa(this,t)}):T()},closest:function(t,e){var n=[],i="object"==typeof t&&T(t);return this.each(function(o,a){for(;a&&!(i?i.indexOf(a)>=0:Y.matches(a,t));)a=a!==e&&!r(a)&&a.parentNode;a&&n.indexOf(a)<0&&n.push(a)}),T(n)},parents:function(t){for(var e=[],n=this;n.length>0;)n=T.map(n,function(t){if((t=t.parentNode)&&!r(t)&&e.indexOf(t)<0)return e.push(t),t});return v(e,t)},parent:function(t){return v(N(this.pluck("parentNode")),t)},children:function(t){return v(this.map(function(){return p(this)}),t)},contents:function(){return this.map(function(){return this.contentDocument||D.call(this.childNodes)})},siblings:function(t){return v(this.map(function(t,e){return A.call(p(e.parentNode),function(t){return t!==e})}),t)},empty:function(){return this.each(function(){this.innerHTML=""})},pluck:function(t){return T.map(this,function(e){return e[t]})},show:function(){return this.each(function(){"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=h(this.nodeName))})},replaceWith:function(t){return this.before(t).remove()},wrap:function(t){var n=e(t);if(this[0]&&!n)var r=T(t).get(0),i=r.parentNode||this.length>1;return this.each(function(e){T(this).wrapAll(n?t.call(this,e):i?r.cloneNode(!0):r)})},wrapAll:function(t){if(this[0]){T(this[0]).before(t=T(t));for(var e;(e=t.children()).length;)t=e.first();T(t).append(this)}return this},wrapInner:function(t){var n=e(t);return this.each(function(e){var r=T(this),i=r.contents(),o=n?t.call(this,e):t;i.length?i.wrapAll(o):r.append(o)})},unwrap:function(){return this.parent().each(function(){T(this).replaceWith(T(this).children())}),this},clone:function(){return this.map(function(){return this.cloneNode(!0)})},hide:function(){return this.css("display","none")},toggle:function(t){return this.each(function(){var e=T(this);(t===E?"none"==e.css("display"):t)?e.show():e.hide()})},prev:function(t){return T(this.pluck("previousElementSibling")).filter(t||"*")},next:function(t){return T(this.pluck("nextElementSibling")).filter(t||"*")},html:function(t){return 0 in arguments?this.each(function(e){var n=this.innerHTML;T(this).empty().append(g(this,t,e,n))}):0 in this?this[0].innerHTML:null},text:function(t){return 0 in arguments?this.each(function(e){var n=g(this,t,e,this.textContent);this.textContent=null==n?"":""+n}):0 in this?this.pluck("textContent").join(""):null},attr:function(t,e){var n;return"string"!=typeof t||1 in arguments?this.each(function(n){if(1===this.nodeType)if(i(t))for(j in t)y(this,j,t[j]);else y(this,t,g(this,e,n,this.getAttribute(t)))}):0 in this&&1==this[0].nodeType&&null!=(n=this[0].getAttribute(t))?n:E},removeAttr:function(t){return this.each(function(){1===this.nodeType&&t.split(" ").forEach(function(t){y(this,t)},this)})},prop:function(t,e){return t=K[t]||t,1 in arguments?this.each(function(n){this[t]=g(this,e,n,this[t])}):this[0]&&this[0][t]},removeProp:function(t){return t=K[t]||t,this.each(function(){delete this[t]})},data:function(t,e){var n="data-"+t.replace(q,"-$1").toLowerCase(),r=1 in arguments?this.attr(n,e):this.attr(n);return null!==r?b(r):E},val:function(t){return 0 in arguments?(null==t&&(t=""),this.each(function(e){this.value=g(this,t,e,this.value)})):this[0]&&(this[0].multiple?T(this[0]).find("option").filter(function(){return this.selected}).pluck("value"):this[0].value)},offset:function(t){if(t)return this.each(function(e){var n=T(this),r=g(this,t,e,n.offset()),i=n.offsetParent().offset(),o={top:r.top-i.top,left:r.left-i.left};"static"==n.css("position")&&(o.position="relative"),n.css(o)});if(!this.length)return null;if(L.documentElement!==this[0]&&!T.contains(L.documentElement,this[0]))return{top:0,left:0};var e=this[0].getBoundingClientRect();return{left:e.left+window.pageXOffset,top:e.top+window.pageYOffset,width:Math.round(e.width),height:Math.round(e.height)}},css:function(e,n){if(arguments.length<2){var r=this[0];if("string"==typeof e){if(!r)return;return r.style[C(e)]||getComputedStyle(r,"").getPropertyValue(e)}if(Q(e)){if(!r)return;var i={},o=getComputedStyle(r,"");return T.each(e,function(t,e){i[e]=r.style[C(e)]||o.getPropertyValue(e)}),i}}var a="";if("string"==t(e))n||0===n?a=c(e)+":"+f(e,n):this.each(function(){this.style.removeProperty(c(e))});else for(j in e)e[j]||0===e[j]?a+=c(j)+":"+f(j,e[j])+";":this.each(function(){this.style.removeProperty(c(j))});return this.each(function(){this.style.cssText+=";"+a})},index:function(t){return t?this.indexOf(T(t)[0]):this.parent().children().indexOf(this[0])},hasClass:function(t){return!!t&&O.some.call(this,function(t){return this.test(x(t))},l(t))},addClass:function(t){return t?this.each(function(e){if("className"in this){S=[];var n=x(this),r=g(this,t,e,n);r.split(/\s+/g).forEach(function(t){T(this).hasClass(t)||S.push(t)},this),S.length&&x(this,n+(n?" ":"")+S.join(" "))}}):this},removeClass:function(t){return this.each(function(e){if("className"in this){if(t===E)return x(this,"");S=x(this),g(this,t,e,S).split(/\s+/g).forEach(function(t){S=S.replace(l(t)," ")}),x(this,S.trim())}})},toggleClass:function(t,e){return t?this.each(function(n){var r=T(this),i=g(this,t,n,x(this));i.split(/\s+/g).forEach(function(t){(e===E?!r.hasClass(t):e)?r.addClass(t):r.removeClass(t)})}):this},scrollTop:function(t){if(this.length){var e="scrollTop"in this[0];return t===E?e?this[0].scrollTop:this[0].pageYOffset:this.each(e?function(){this.scrollTop=t}:function(){this.scrollTo(this.scrollX,t)})}},scrollLeft:function(t){if(this.length){var e="scrollLeft"in this[0];return t===E?e?this[0].scrollLeft:this[0].pageXOffset:this.each(e?function(){this.scrollLeft=t}:function(){this.scrollTo(t,this.scrollY)})}},position:function(){if(this.length){var t=this[0],e=this.offsetParent(),n=this.offset(),r=Z.test(e[0].nodeName)?{top:0,left:0}:e.offset();return n.top-=parseFloat(T(t).css("margin-top"))||0,n.left-=parseFloat(T(t).css("margin-left"))||0,r.top+=parseFloat(T(e[0]).css("border-top-width"))||0,r.left+=parseFloat(T(e[0]).css("border-left-width"))||0,{top:n.top-r.top,left:n.left-r.left}}},offsetParent:function(){return this.map(function(){for(var t=this.offsetParent||L.body;t&&!Z.test(t.nodeName)&&"static"==T(t).css("position");)t=t.offsetParent;return t})}},T.fn.detach=T.fn.remove,["width","height"].forEach(function(t){var e=t.replace(/./,function(t){return t[0].toUpperCase()});T.fn[t]=function(i){var o,a=this[0];return i===E?n(a)?a["inner"+e]:r(a)?a.documentElement["scroll"+e]:(o=this.offset())&&o[t]:this.each(function(e){a=T(this),a.css(t,g(this,i,e,a[t]()))})}}),I.forEach(function(e,n){var r=n%2;T.fn[e]=function(){var e,i,o=T.map(arguments,function(n){var r=[];return e=t(n),"array"==e?(n.forEach(function(t){return t.nodeType!==E?r.push(t):T.zepto.isZ(t)?r=r.concat(t.get()):void(r=r.concat(Y.fragment(t)))}),r):"object"==e||null==n?n:Y.fragment(n)}),a=this.length>1;return o.length<1?this:this.each(function(t,e){i=r?e:e.parentNode,e=0==n?e.nextSibling:1==n?e.firstChild:2==n?e:null;var s=T.contains(L.documentElement,i);o.forEach(function(t){if(a)t=t.cloneNode(!0);else if(!i)return T(t).remove();i.insertBefore(t,e),s&&w(t,function(t){if(!(null==t.nodeName||"SCRIPT"!==t.nodeName.toUpperCase()||t.type&&"text/javascript"!==t.type||t.src)){var e=t.ownerDocument?t.ownerDocument.defaultView:window;e.eval.call(e,t.innerHTML)}})})})},T.fn[r?e+"To":"insert"+(n?"Before":"After")]=function(t){return T(t)[e](this),this}}),Y.Z.prototype=d.prototype=T.fn,Y.uniq=N,Y.deserializeValue=b,T.zepto=Y,T}();!function(t){function e(t){return t._zid||(t._zid=h++)}function n(t,n,o,a){if(n=r(n),n.ns)var s=i(n.ns);return(v[e(t)]||[]).filter(function(t){return t&&(!n.e||t.e==n.e)&&(!n.ns||s.test(t.ns))&&(!o||e(t.fn)===e(o))&&(!a||t.sel==a)})}function r(t){var e=(""+t).split(".");return{e:e[0],ns:e.slice(1).sort().join(" ")}}function i(t){return new RegExp("(?:^| )"+t.replace(" "," .* ?")+"(?: |$)")}function o(t,e){return t.del&&!y&&t.e in x||!!e}function a(t){return b[t]||y&&x[t]||t}function s(n,i,s,u,l,h,p){var d=e(n),m=v[d]||(v[d]=[]);i.split(/\s/).forEach(function(e){if("ready"==e)return t(document).ready(s);var i=r(e);i.fn=s,i.sel=l,i.e in b&&(s=function(e){var n=e.relatedTarget;if(!n||n!==this&&!t.contains(this,n))return i.fn.apply(this,arguments)}),i.del=h;var d=h||s;i.proxy=function(t){if(t=c(t),!t.isImmediatePropagationStopped()){t.data=u;var e=d.apply(n,t._args==f?[t]:[t].concat(t._args));return e===!1&&(t.preventDefault(),t.stopPropagation()),e}},i.i=m.length,m.push(i),"addEventListener"in n&&n.addEventListener(a(i.e),i.proxy,o(i,p))})}function u(t,r,i,s,u){var c=e(t);(r||"").split(/\s/).forEach(function(e){n(t,e,i,s).forEach(function(e){delete v[c][e.i],"removeEventListener"in t&&t.removeEventListener(a(e.e),e.proxy,o(e,u))})})}function c(e,n){return!n&&e.isDefaultPrevented||(n||(n=e),t.each(T,function(t,r){var i=n[t];e[t]=function(){return this[r]=w,i&&i.apply(n,arguments)},e[r]=E}),e.timeStamp||(e.timeStamp=Date.now()),(n.defaultPrevented!==f?n.defaultPrevented:"returnValue"in n?n.returnValue===!1:n.getPreventDefault&&n.getPreventDefault())&&(e.isDefaultPrevented=w)),e}function l(t){var e,n={originalEvent:t};for(e in t)j.test(e)||t[e]===f||(n[e]=t[e]);return c(n,t)}var f,h=1,p=Array.prototype.slice,d=t.isFunction,m=function(t){return"string"==typeof t},v={},g={},y="onfocusin"in window,x={focus:"focusin",blur:"focusout"},b={mouseenter:"mouseover",mouseleave:"mouseout"};g.click=g.mousedown=g.mouseup=g.mousemove="MouseEvents",t.event={add:s,remove:u},t.proxy=function(n,r){var i=2 in arguments&&p.call(arguments,2);if(d(n)){var o=function(){return n.apply(r,i?i.concat(p.call(arguments)):arguments)};return o._zid=e(n),o}if(m(r))return i?(i.unshift(n[r],n),t.proxy.apply(null,i)):t.proxy(n[r],n);throw new TypeError("expected function")},t.fn.bind=function(t,e,n){return this.on(t,e,n)},t.fn.unbind=function(t,e){return this.off(t,e)},t.fn.one=function(t,e,n,r){return this.on(t,e,n,r,1)};var w=function(){return!0},E=function(){return!1},j=/^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,T={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};t.fn.delegate=function(t,e,n){return this.on(e,t,n)},t.fn.undelegate=function(t,e,n){return this.off(e,t,n)},t.fn.live=function(e,n){return t(document.body).delegate(this.selector,e,n),this},t.fn.die=function(e,n){return t(document.body).undelegate(this.selector,e,n),this},t.fn.on=function(e,n,r,i,o){var a,c,h=this;return e&&!m(e)?(t.each(e,function(t,e){h.on(t,n,r,e,o)}),h):(m(n)||d(i)||i===!1||(i=r,r=n,n=f),i!==f&&r!==!1||(i=r,r=f),i===!1&&(i=E),h.each(function(f,h){o&&(a=function(t){return u(h,t.type,i),i.apply(this,arguments)}),n&&(c=function(e){var r,o=t(e.target).closest(n,h).get(0);if(o&&o!==h)return r=t.extend(l(e),{currentTarget:o,liveFired:h}),(a||i).apply(o,[r].concat(p.call(arguments,1)))}),s(h,e,i,r,n,c||a)}))},t.fn.off=function(e,n,r){var i=this;return e&&!m(e)?(t.each(e,function(t,e){i.off(t,n,e)}),i):(m(n)||d(r)||r===!1||(r=n,n=f),r===!1&&(r=E),i.each(function(){u(this,e,r,n)}))},t.fn.trigger=function(e,n){return e=m(e)||t.isPlainObject(e)?t.Event(e):c(e),e._args=n,this.each(function(){e.type in x&&"function"==typeof this[e.type]?this[e.type]():"dispatchEvent"in this?this.dispatchEvent(e):t(this).triggerHandler(e,n)})},t.fn.triggerHandler=function(e,r){var i,o;return this.each(function(a,s){i=l(m(e)?t.Event(e):e),i._args=r,i.target=s,t.each(n(s,e.type||e),function(t,e){if(o=e.proxy(i),i.isImmediatePropagationStopped())return!1})}),o},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function(e){t.fn[e]=function(t){return 0 in arguments?this.bind(e,t):this.trigger(e)}}),t.Event=function(t,e){m(t)||(e=t,t=e.type);var n=document.createEvent(g[t]||"Events"),r=!0;if(e)for(var i in e)"bubbles"==i?r=!!e[i]:n[i]=e[i];return n.initEvent(t,r,!0),c(n)}}(e),function(t){function e(e,n,r){var i=t.Event(n);return t(e).trigger(i,r),!i.isDefaultPrevented()}function n(t,n,r,i){if(t.global)return e(n||x,r,i)}function r(e){e.global&&0===t.active++&&n(e,null,"ajaxStart")}function i(e){e.global&&!--t.active&&n(e,null,"ajaxStop")}function o(t,e){var r=e.context;return e.beforeSend.call(r,t,e)!==!1&&n(e,r,"ajaxBeforeSend",[t,e])!==!1&&void n(e,r,"ajaxSend",[t,e])}function a(t,e,r,i){var o=r.context,a="success";r.success.call(o,t,a,e),i&&i.resolveWith(o,[t,a,e]),n(r,o,"ajaxSuccess",[e,r,t]),u(a,e,r)}function s(t,e,r,i,o){var a=i.context;i.error.call(a,r,e,t),o&&o.rejectWith(a,[r,e,t]),n(i,a,"ajaxError",[r,i,t||e]),u(e,r,i)}function u(t,e,r){var o=r.context;r.complete.call(o,e,t),n(r,o,"ajaxComplete",[e,r]),i(r)}function c(t,e,n){if(n.dataFilter==l)return t;var r=n.context;return n.dataFilter.call(r,t,e)}function l(){}function f(t){return t&&(t=t.split(";",2)[0]),t&&(t==T?"html":t==j?"json":w.test(t)?"script":E.test(t)&&"xml")||"text"}function h(t,e){return""==e?t:(t+"&"+e).replace(/[&?]{1,2}/,"?")}function p(e){e.processData&&e.data&&"string"!=t.type(e.data)&&(e.data=t.param(e.data,e.traditional)),!e.data||e.type&&"GET"!=e.type.toUpperCase()&&"jsonp"!=e.dataType||(e.url=h(e.url,e.data),e.data=void 0)}function d(e,n,r,i){return t.isFunction(n)&&(i=r,r=n,n=void 0),t.isFunction(r)||(i=r,r=void 0),{url:e,data:n,success:r,dataType:i}}function m(e,n,r,i){var o,a=t.isArray(n),s=t.isPlainObject(n);t.each(n,function(n,u){o=t.type(u),i&&(n=r?i:i+"["+(s||"object"==o||"array"==o?n:"")+"]"),!i&&a?e.add(u.name,u.value):"array"==o||!r&&"object"==o?m(e,u,r,n):e.add(n,u)})}var v,g,y=+new Date,x=window.document,b=/)<[^<]*)*<\/script>/gi,w=/^(?:text|application)\/javascript/i,E=/^(?:text|application)\/xml/i,j="application/json",T="text/html",S=/^\s*$/,C=x.createElement("a");C.href=window.location.href,t.active=0,t.ajaxJSONP=function(e,n){if(!("type"in e))return t.ajax(e);var r,i,u=e.jsonpCallback,c=(t.isFunction(u)?u():u)||"Zepto"+y++,l=x.createElement("script"),f=window[c],h=function(e){t(l).triggerHandler("error",e||"abort")},p={abort:h};return n&&n.promise(p),t(l).on("load error",function(o,u){clearTimeout(i),t(l).off().remove(),"error"!=o.type&&r?a(r[0],p,e,n):s(null,u||"error",p,e,n),window[c]=f,r&&t.isFunction(f)&&f(r[0]),f=r=void 0}),o(p,e)===!1?(h("abort"),p):(window[c]=function(){r=arguments},l.src=e.url.replace(/\?(.+)=\?/,"?$1="+c),x.head.appendChild(l),e.timeout>0&&(i=setTimeout(function(){h("timeout")},e.timeout)),p)},t.ajaxSettings={type:"GET",beforeSend:l,success:l,error:l,complete:l,context:null,global:!0,xhr:function(){return new window.XMLHttpRequest},accepts:{script:"text/javascript, application/javascript, application/x-javascript",json:j,xml:"application/xml, text/xml",html:T,text:"text/plain"},crossDomain:!1,timeout:0,processData:!0,cache:!0,dataFilter:l},t.ajax=function(e){var n,i,u=t.extend({},e||{}),d=t.Deferred&&t.Deferred();for(v in t.ajaxSettings)void 0===u[v]&&(u[v]=t.ajaxSettings[v]);r(u),u.crossDomain||(n=x.createElement("a"),n.href=u.url,n.href=n.href,u.crossDomain=C.protocol+"//"+C.host!=n.protocol+"//"+n.host),u.url||(u.url=window.location.toString()),(i=u.url.indexOf("#"))>-1&&(u.url=u.url.slice(0,i)),p(u);var m=u.dataType,y=/\?.+=\?/.test(u.url);if(y&&(m="jsonp"),u.cache!==!1&&(e&&e.cache===!0||"script"!=m&&"jsonp"!=m)||(u.url=h(u.url,"_="+Date.now())),"jsonp"==m)return y||(u.url=h(u.url,u.jsonp?u.jsonp+"=?":u.jsonp===!1?"":"callback=?")),t.ajaxJSONP(u,d);var b,w=u.accepts[m],E={},j=function(t,e){E[t.toLowerCase()]=[t,e]},T=/^([\w-]+:)\/\//.test(u.url)?RegExp.$1:window.location.protocol,N=u.xhr(),O=N.setRequestHeader;if(d&&d.promise(N),u.crossDomain||j("X-Requested-With","XMLHttpRequest"),j("Accept",w||"*/*"),(w=u.mimeType||w)&&(w.indexOf(",")>-1&&(w=w.split(",",2)[0]),N.overrideMimeType&&N.overrideMimeType(w)),(u.contentType||u.contentType!==!1&&u.data&&"GET"!=u.type.toUpperCase())&&j("Content-Type",u.contentType||"application/x-www-form-urlencoded"),u.headers)for(g in u.headers)j(g,u.headers[g]);if(N.setRequestHeader=j,N.onreadystatechange=function(){if(4==N.readyState){N.onreadystatechange=l,clearTimeout(b);var e,n=!1;if(N.status>=200&&N.status<300||304==N.status||0==N.status&&"file:"==T){if(m=m||f(u.mimeType||N.getResponseHeader("content-type")),"arraybuffer"==N.responseType||"blob"==N.responseType)e=N.response;else{e=N.responseText;try{e=c(e,m,u),"script"==m?(0,eval)(e):"xml"==m?e=N.responseXML:"json"==m&&(e=S.test(e)?null:t.parseJSON(e))}catch(r){n=r}if(n)return s(n,"parsererror",N,u,d)}a(e,N,u,d)}else s(N.statusText||null,N.status?"error":"abort",N,u,d)}},o(N,u)===!1)return N.abort(),s(null,"abort",N,u,d),N;var P=!("async"in u)||u.async;if(N.open(u.type,u.url,P,u.username,u.password),u.xhrFields)for(g in u.xhrFields)N[g]=u.xhrFields[g];for(g in E)O.apply(N,E[g]);return u.timeout>0&&(b=setTimeout(function(){N.onreadystatechange=l,N.abort(),s(null,"timeout",N,u,d)},u.timeout)),N.send(u.data?u.data:null),N},t.get=function(){return t.ajax(d.apply(null,arguments))},t.post=function(){var e=d.apply(null,arguments);return e.type="POST",t.ajax(e)},t.getJSON=function(){var e=d.apply(null,arguments);return e.dataType="json",t.ajax(e)},t.fn.load=function(e,n,r){if(!this.length)return this;var i,o=this,a=e.split(/\s/),s=d(e,n,r),u=s.success;return a.length>1&&(s.url=a[0],i=a[1]),s.success=function(e){o.html(i?t("
                              ").html(e.replace(b,"")).find(i):e),u&&u.apply(o,arguments)},t.ajax(s),this};var N=encodeURIComponent;t.param=function(e,n){var r=[];return r.add=function(e,n){t.isFunction(n)&&(n=n()),null==n&&(n=""),this.push(N(e)+"="+N(n))},m(r,e,n),r.join("&").replace(/%20/g,"+")}}(e),function(t){t.fn.serializeArray=function(){var e,n,r=[],i=function(t){return t.forEach?t.forEach(i):void r.push({name:e,value:t})};return this[0]&&t.each(this[0].elements,function(r,o){n=o.type,e=o.name,e&&"fieldset"!=o.nodeName.toLowerCase()&&!o.disabled&&"submit"!=n&&"reset"!=n&&"button"!=n&&"file"!=n&&("radio"!=n&&"checkbox"!=n||o.checked)&&i(t(o).val())}),r},t.fn.serialize=function(){var t=[];return this.serializeArray().forEach(function(e){t.push(encodeURIComponent(e.name)+"="+encodeURIComponent(e.value))}),t.join("&")},t.fn.submit=function(e){if(0 in arguments)this.bind("submit",e);else if(this.length){var n=t.Event("submit");this.eq(0).trigger(n),n.isDefaultPrevented()||this.get(0).submit()}return this}}(e),function(){try{getComputedStyle(void 0)}catch(t){var e=getComputedStyle;window.getComputedStyle=function(t,n){try{return e(t,n)}catch(r){return null}}}}(),t("zepto",e)});layui.define(function(i){i("layim-mobile",layui.v)});layui["layui.mobile"]||layui.config({base:layui.cache.dir+"lay/modules/mobile/"}).extend({"layer-mobile":"layer-mobile",zepto:"zepto","upload-mobile":"upload-mobile","layim-mobile":"layim-mobile"}),layui.define(["layer-mobile","zepto","layim-mobile"],function(l){l("mobile",{layer:layui["layer-mobile"],layim:layui["layim-mobile"]})}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/rate.js b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/rate.js new file mode 100644 index 0000000..7feef34 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/rate.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var a=layui.jquery,i={config:{},index:layui.rate?layui.rate.index+1e4:0,set:function(e){var i=this;return i.config=a.extend({},i.config,e),i},on:function(e,a){return layui.onevent.call(this,n,e,a)}},l=function(){var e=this,a=e.config;return{setvalue:function(a){e.setvalue.call(e,a)},config:a}},n="rate",t="layui-rate",o="layui-icon-rate",s="layui-icon-rate-solid",u="layui-icon-rate-half",r="layui-icon-rate-solid layui-icon-rate-half",c="layui-icon-rate-solid layui-icon-rate",f="layui-icon-rate layui-icon-rate-half",v=function(e){var l=this;l.index=++i.index,l.config=a.extend({},l.config,i.config,e),l.render()};v.prototype.config={length:5,text:!1,readonly:!1,half:!1,value:0,theme:""},v.prototype.render=function(){var e=this,i=e.config,l=i.theme?'style="color: '+i.theme+';"':"";i.elem=a(i.elem),parseInt(i.value)!==i.value&&(i.half||(i.value=Math.ceil(i.value)-i.value<.5?Math.ceil(i.value):Math.floor(i.value)));for(var n='
                                ",u=1;u<=i.length;u++){var r='
                              • ";i.half&&parseInt(i.value)!==i.value&&u==Math.ceil(i.value)?n=n+'
                              • ":n+=r}n+="
                              "+(i.text?''+i.value+"星":"")+"";var c=i.elem,f=c.next("."+t);f[0]&&f.remove(),e.elemTemp=a(n),i.span=e.elemTemp.next("span"),i.setText&&i.setText(i.value),c.html(e.elemTemp),c.addClass("layui-inline"),i.readonly||e.action()},v.prototype.setvalue=function(e){var a=this,i=a.config;i.value=e,a.render()},v.prototype.action=function(){var e=this,i=e.config,l=e.elemTemp,n=l.find("i").width();l.children("li").each(function(e){var t=e+1,v=a(this);v.on("click",function(e){if(i.value=t,i.half){var o=e.pageX-a(this).offset().left;o<=n/2&&(i.value=i.value-.5)}i.text&&l.next("span").text(i.value+"星"),i.choose&&i.choose(i.value),i.setText&&i.setText(i.value)}),v.on("mousemove",function(e){if(l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+t+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half){var c=e.pageX-a(this).offset().left;c<=n/2&&v.children("i").addClass(u).removeClass(s)}}),v.on("mouseleave",function(){l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+Math.floor(i.value)+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half&&parseInt(i.value)!==i.value&&l.children("li:eq("+Math.floor(i.value)+")").children("i").addClass(u).removeClass(c)})})},v.prototype.events=function(){var e=this;e.config},i.render=function(e){var a=new v(e);return l.call(a)},e(n,i)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/slider.js b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/slider.js new file mode 100644 index 0000000..6f824a9 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/slider.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var i=layui.jquery,t={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,n,e,i)}},a=function(){var e=this,i=e.config;return{setValue:function(i,t){return e.slide("set",i,t||0)},config:i}},n="slider",l="layui-disabled",s="layui-slider",r="layui-slider-bar",o="layui-slider-wrap",u="layui-slider-wrap-btn",d="layui-slider-tips",v="layui-slider-input",c="layui-slider-input-txt",m="layui-slider-input-btn",p="layui-slider-hover",f=function(e){var a=this;a.index=++t.index,a.config=i.extend({},a.config,t.config,e),a.render()};f.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,input:!1,range:!1,height:200,disabled:!1,theme:"#009688"},f.prototype.render=function(){var e=this,t=e.config;if(t.step<1&&(t.step=1),t.maxt.min?a:t.min,t.value[1]=n>t.min?n:t.min,t.value[0]=t.value[0]>t.max?t.max:t.value[0],t.value[1]=t.value[1]>t.max?t.max:t.value[1];var r=Math.floor((t.value[0]-t.min)/(t.max-t.min)*100),v=Math.floor((t.value[1]-t.min)/(t.max-t.min)*100),m=v-r+"%";r+="%",v+="%"}else{"object"==typeof t.value&&(t.value=Math.min.apply(null,t.value)),t.valuet.max&&(t.value=t.max);var m=Math.floor((t.value-t.min)/(t.max-t.min)*100)+"%"}var p=t.disabled?"#c2c2c2":t.theme,f='
                              '+(t.tips?'
                              ':"")+'
                              '+(t.range?'
                              ':"")+"
                              ",h=i(t.elem),y=h.next("."+s);if(y[0]&&y.remove(),e.elemTemp=i(f),t.range?(e.elemTemp.find("."+o).eq(0).data("value",t.value[0]),e.elemTemp.find("."+o).eq(1).data("value",t.value[1])):e.elemTemp.find("."+o).data("value",t.value),h.html(e.elemTemp),"vertical"===t.type&&e.elemTemp.height(t.height+"px"),t.showstep){for(var g=(t.max-t.min)/t.step,b="",x=1;x
                              ')}e.elemTemp.append(b)}if(t.input&&!t.range){var w=i('
                              ');h.css("position","relative"),h.append(w),h.find("."+c).children("input").val(t.value),"vertical"===t.type?w.css({left:0,top:-48}):e.elemTemp.css("margin-right",w.outerWidth()+15)}t.disabled?(e.elemTemp.addClass(l),e.elemTemp.find("."+u).addClass(l)):e.slide(),e.elemTemp.find("."+u).on("mouseover",function(){var a="vertical"===t.type?t.height:e.elemTemp[0].offsetWidth,n=e.elemTemp.find("."+o),l="vertical"===t.type?a-i(this).parent()[0].offsetTop-n.height():i(this).parent()[0].offsetLeft,s=l/a*100,r=i(this).parent().data("value"),u=t.setTips?t.setTips(r):r;e.elemTemp.find("."+d).html(u),"vertical"===t.type?e.elemTemp.find("."+d).css({bottom:s+"%","margin-bottom":"20px",display:"inline-block"}):e.elemTemp.find("."+d).css({left:s+"%",display:"inline-block"})}).on("mouseout",function(){e.elemTemp.find("."+d).css("display","none")})},f.prototype.slide=function(e,t,a){var n=this,l=n.config,s=n.elemTemp,f=function(){return"vertical"===l.type?l.height:s[0].offsetWidth},h=s.find("."+o),y=s.next("."+v),g=y.children("."+c).children("input").val(),b=100/((l.max-l.min)/Math.ceil(l.step)),x=function(e,i){e=Math.ceil(e)*b>100?Math.ceil(e)*b:Math.round(e)*b,e=e>100?100:e,h.eq(i).css("vertical"===l.type?"bottom":"left",e+"%");var t=T(h[0].offsetLeft),a=l.range?T(h[1].offsetLeft):0;"vertical"===l.type?(s.find("."+d).css({bottom:e+"%","margin-bottom":"20px"}),t=T(f()-h[0].offsetTop-h.height()),a=l.range?T(f()-h[1].offsetTop-h.height()):0):s.find("."+d).css("left",e+"%"),t=t>100?100:t,a=a>100?100:a;var n=Math.min(t,a),o=Math.abs(t-a);"vertical"===l.type?s.find("."+r).css({height:o+"%",bottom:n+"%"}):s.find("."+r).css({width:o+"%",left:n+"%"});var u=l.min+Math.round((l.max-l.min)*e/100);if(g=u,y.children("."+c).children("input").val(g),h.eq(i).data("value",u),u=l.setTips?l.setTips(u):u,s.find("."+d).html(u),l.range){var v=[h.eq(0).data("value"),h.eq(1).data("value")];v[0]>v[1]&&v.reverse()}l.change&&l.change(l.range?v:u)},T=function(e){var i=e/f()*100/b,t=Math.round(i)*b;return e==f()&&(t=Math.ceil(i)*b),t},w=i(['
                              f()&&(r=f());var o=r/f()*100/b;x(o,e),t.addClass(p),s.find("."+d).show(),i.preventDefault()},o=function(){t.removeClass(p),s.find("."+d).hide()};M(r,o)})}),s.on("click",function(e){var t=i("."+u);if(!t.is(event.target)&&0===t.has(event.target).length&&t.length){var a,n="vertical"===l.type?f()-e.clientY+i(this).offset().top:e.clientX-i(this).offset().left;n<0&&(n=0),n>f()&&(n=f());var s=n/f()*100/b;a=l.range?"vertical"===l.type?Math.abs(n-parseInt(i(h[0]).css("bottom")))>Math.abs(n-parseInt(i(h[1]).css("bottom")))?1:0:Math.abs(n-h[0].offsetLeft)>Math.abs(n-h[1].offsetLeft)?1:0:0,x(s,a),e.preventDefault()}}),y.hover(function(){var e=i(this);e.children("."+m).fadeIn("fast")},function(){var e=i(this);e.children("."+m).fadeOut("fast")}),y.children("."+m).children("i").each(function(e){i(this).on("click",function(){g=1==e?g-l.stepl.max?l.max:Number(g)+l.step;var i=(g-l.min)/(l.max-l.min)*100/b;x(i,0)})});var q=function(){var e=this.value;e=isNaN(e)?0:e,e=el.max?l.max:e,this.value=e;var i=(e-l.min)/(l.max-l.min)*100/b;x(i,0)};y.children("."+c).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),q.call(this))}).on("change",q)},f.prototype.events=function(){var e=this;e.config},t.render=function(e){var i=new f(e);return a.call(i)},e(n,t)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/table.js b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/table.js new file mode 100644 index 0000000..0882b71 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/table.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define(["laytpl","laypage","layer","form","util"],function(e){"use strict";var t=layui.$,i=layui.laytpl,a=layui.laypage,l=layui.layer,n=layui.form,o=(layui.util,layui.hint()),r=layui.device(),d={config:{checkName:"LAY_CHECKED",indexName:"LAY_TABLE_INDEX"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,y,e,t)}},c=function(){var e=this,t=e.config,i=t.id||t.index;return i&&(c.that[i]=e,c.config[i]=t),{config:t,reload:function(t){e.reload.call(e,t)},setColsWidth:function(){e.setColsWidth.call(e)},resize:function(){e.resize.call(e)}}},s=function(e){var t=c.config[e];return t||o.error("The ID option was not found in the table instance"),t||null},u=function(e,a,l,n){var o=e.templet?function(){return"function"==typeof e.templet?e.templet(l):i(t(e.templet).html()||String(a)).render(l)}():a;return n?t("
                              "+o+"
                              ").text():o},y="table",h=".layui-table",f="layui-hide",p="layui-none",v="layui-table-view",m=".layui-table-tool",g=".layui-table-box",b=".layui-table-init",x=".layui-table-header",k=".layui-table-body",C=".layui-table-main",w=".layui-table-fixed",T=".layui-table-fixed-l",A=".layui-table-fixed-r",L=".layui-table-total",N=".layui-table-page",S=".layui-table-sort",R="layui-table-edit",W="layui-table-hover",_=function(e){var t='{{#if(item2.colspan){}} colspan="{{item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{item2.rowspan}}"{{#}}}';return e=e||{},['',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',function(){return e.fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':""}(),"{{# var isSort = !(item2.colGroup) && item2.sort; }}",'",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
                              ','
                              ','{{# if(item2.type === "checkbox"){ }}','',"{{# } else { }}",'{{item2.title||""}}',"{{# if(isSort){ }}",'',"{{# } }}","{{# } }}","
                              ","
                              "].join("")},E=['',"","
                              "].join(""),z=['
                              ',"{{# if(d.data.toolbar){ }}",'
                              ','
                              ','
                              ',"
                              ","{{# } }}",'
                              ',"{{# if(d.data.loading){ }}",'
                              ','',"
                              ","{{# } }}","{{# var left, right; }}",'
                              ',_(),"
                              ",'
                              ',E,"
                              ","{{# if(left){ }}",'
                              ','
                              ',_({fixed:!0}),"
                              ",'
                              ',E,"
                              ","
                              ","{{# }; }}","{{# if(right){ }}",'
                              ','
                              ',_({fixed:"right"}),'
                              ',"
                              ",'
                              ',E,"
                              ","
                              ","{{# }; }}","
                              ","{{# if(d.data.totalRow){ }}",'
                              ','','',"
                              ","
                              ","{{# } }}","{{# if(d.data.page){ }}",'
                              ','
                              ',"
                              ","{{# } }}","","
                              "].join(""),H=t(window),j=t(document),F=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};F.prototype.config={limit:10,loading:!0,cellMinWidth:60,defaultToolbar:["filter","exports","print"],autoSort:!0,text:{none:"无数据"}},F.prototype.render=function(){var e=this,a=e.config;if(a.elem=t(a.elem),a.where=a.where||{},a.id=a.id||a.elem.attr("id")||e.index,a.request=t.extend({pageName:"page",limitName:"limit"},a.request),a.response=t.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",totalRowName:"totalRow",countName:"count"},a.response),"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,e.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return e;a.height&&/^full-\d+$/.test(a.height)&&(e.fullHeightGap=a.height.split("-")[1],a.height=H.height()-e.fullHeightGap),e.setInit();var l=a.elem,n=l.next("."+v),o=e.elem=t(i(z).render({VIEW_CLASS:v,data:a,index:e.index}));if(a.index=e.index,e.key=a.id||a.index,n[0]&&n.remove(),l.after(o),e.layTool=o.find(m),e.layBox=o.find(g),e.layHeader=o.find(x),e.layMain=o.find(C),e.layBody=o.find(k),e.layFixed=o.find(w),e.layFixLeft=o.find(T),e.layFixRight=o.find(A),e.layTotal=o.find(L),e.layPage=o.find(N),e.renderToolbar(),e.fullSize(),a.cols.length>1){var r=e.layFixed.find(x).find("th");r.height(e.layHeader.height()-1-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom")))}e.pullData(e.page),e.events()},F.prototype.initOpts=function(e){var t=this,i=(t.config,{checkbox:48,radio:48,space:15,numbers:40});e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||i[e.type])},F.prototype.setInit=function(e){var t=this,i=t.config;return i.clientWidth=i.width||function(){var e=function(t){var a,l;t=t||i.elem.parent(),a=t.width();try{l="none"===t.css("display")}catch(n){}return!t[0]||a&&!l?a:e(t.parent())};return e()}(),"width"===e?i.clientWidth:void layui.each(i.cols,function(e,a){layui.each(a,function(l,n){if(!n)return void a.splice(l,1);if(n.key=e+"-"+l,n.hide=n.hide||!1,n.colGroup||n.colspan>1){var o=0;layui.each(i.cols[e+1],function(t,i){i.HAS_PARENT||o>1&&o==n.colspan||(i.HAS_PARENT=!0,i.parentKey=e+"-"+l,o+=parseInt(i.colspan>1?i.colspan:1))}),n.colGroup=!0}t.initOpts(n)})})},F.prototype.renderToolbar=function(){var e=this,a=e.config,l=['
                              ','
                              ','
                              '].join(""),n=e.layTool.find(".layui-table-tool-temp");if("default"===a.toolbar)n.html(l);else if("string"==typeof a.toolbar){var o=t(a.toolbar).html()||"";o&&n.html(i(o).render(a))}var r={filter:{title:"筛选列",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols"},exports:{title:"导出",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export"},print:{title:"打印",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print"}},d=[];"object"==typeof a.defaultToolbar&&layui.each(a.defaultToolbar,function(e,t){var i="string"==typeof t?r[t]:t;i&&d.push('
                              ')}),e.layTool.find(".layui-table-tool-self").html(d.join(""))},F.prototype.setParentCol=function(e,t){var i=this,a=i.config,l=i.layHeader.find('th[data-key="'+a.index+"-"+t+'"]'),n=parseInt(l.attr("colspan"))||0;if(l[0]){var o=t.split("-"),r=a.cols[o[0]][o[1]];e?n--:n++,l.attr("colspan",n),l[n<1?"addClass":"removeClass"](f),r.colspan=n,r.hide=n<1;var d=l.data("parentkey");d&&i.setParentCol(e,d)}},F.prototype.setColsPatch=function(){var e=this,t=e.config;layui.each(t.cols,function(t,i){layui.each(i,function(t,i){i.hide&&e.setParentCol(i.hide,i.parentKey)})})},F.prototype.setColsWidth=function(){var e=this,t=e.config,i=0,a=0,l=0,n=0,o=e.setInit("width");e.eachCols(function(e,t){t.hide||i++}),o=o-function(){return"line"===t.skin||"nob"===t.skin?2:i+1}()-e.getScrollWidth(e.layMain[0])-1;var r=function(e){layui.each(t.cols,function(i,r){layui.each(r,function(i,d){var c=0,s=d.minWidth||t.cellMinWidth;return d?void(d.colGroup||d.hide||(e?l&&ln&&a&&(l=(o-n)/a)};r(),r(!0),e.autoColNums=a,e.eachCols(function(i,a){var n=a.minWidth||t.cellMinWidth;a.colGroup||a.hide||(0===a.width?e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(l>=n?l:n)+"px"}):/\d+%$/.test(a.width)&&e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(parseFloat(a.width)/100*o)+"px"}))});var d=e.layMain.width()-e.getScrollWidth(e.layMain[0])-e.layMain.children("table").outerWidth();if(e.autoColNums&&d>=-i&&d<=i){var c=function(t){var i;return t=t||e.layHeader.eq(0).find("thead th:last-child"),i=t.data("field"),!i&&t.prev()[0]?c(t.prev()):t},s=c(),u=s.data("key");e.getCssRule(u,function(t){var i=t.style.width||s.outerWidth();t.style.width=parseFloat(i)+d+"px",e.layMain.height()-e.layMain.prop("clientHeight")>0&&(t.style.width=parseFloat(t.style.width)-1+"px")})}e.loading(!0)},F.prototype.resize=function(){var e=this;e.fullSize(),e.setColsWidth(),e.scrollPatch()},F.prototype.reload=function(e){var i=this;e=e||{},delete i.haveInit,e.data&&e.data.constructor===Array&&delete i.config.data,i.config=t.extend(!0,{},i.config,e),i.render()},F.prototype.errorView=function(e){var i=this,a=i.layMain.find("."+p),l=t('
                              '+(e||"Error")+"
                              ");a[0]&&(i.layNone.remove(),a.remove()),i.layFixed.addClass(f),i.layMain.find("tbody").html(""),i.layMain.append(i.layNone=l),d.cache[i.key]=[]},F.prototype.page=1,F.prototype.pullData=function(e){var i=this,a=i.config,l=a.request,n=a.response,o=function(){"object"==typeof a.initSort&&i.sort(a.initSort.field,a.initSort.type)};if(i.startTime=(new Date).getTime(),a.url){var r={};r[l.pageName]=e,r[l.limitName]=a.limit;var d=t.extend(r,a.where);a.contentType&&0==a.contentType.indexOf("application/json")&&(d=JSON.stringify(d)),i.loading(),t.ajax({type:a.method||"get",url:a.url,contentType:a.contentType,data:d,dataType:"json",headers:a.headers||{},success:function(t){"function"==typeof a.parseData&&(t=a.parseData(t)||t),t[n.statusName]!=n.statusCode?(i.renderForm(),i.errorView(t[n.msgName]||'返回的数据不符合规范,正确的成功状态码应为:"'+n.statusName+'": '+n.statusCode)):(i.renderData(t,e,t[n.countName]),o(),a.time=(new Date).getTime()-i.startTime+" ms"),i.setColsWidth(),"function"==typeof a.done&&a.done(t,e,t[n.countName])},error:function(e,t){i.errorView("数据接口请求异常:"+t),i.renderForm(),i.setColsWidth()}})}else if(a.data&&a.data.constructor===Array){var c={},s=e*a.limit-a.limit;c[n.dataName]=a.data.concat().splice(s,a.limit),c[n.countName]=a.data.length,"object"==typeof a.totalRow&&(c[n.totalRowName]=t.extend({},a.totalRow)),i.renderData(c,e,c[n.countName]),o(),i.setColsWidth(),"function"==typeof a.done&&a.done(c,e,c[n.countName])}},F.prototype.eachCols=function(e){var t=this;return d.eachCols(null,e,t.config.cols),t},F.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,y=e[s.response.dataName]||[],h=e[s.response.totalRowName],v=[],m=[],g=[],b=function(){var e;return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(y,function(a,l){var o=[],y=[],h=[],p=a+s.limit*(n-1)+1;0!==l.length&&(r||(l[d.config.indexName]=a),c.eachCols(function(n,r){var c=r.field||n,v=s.index+"-"+r.key,m=l[c];if(void 0!==m&&null!==m||(m=""),!r.colGroup){var g=['','
                              '+function(){var n=t.extend(!0,{LAY_INDEX:p},l),o=d.config.checkName;switch(r.type){case"checkbox":return'";case"radio":return n[o]&&(e=a),'';case"numbers":return p}return r.toolbar?i(t(r.toolbar).html()||"").render(n):u(r,m,n)}(),"
                              "].join("");o.push(g),r.fixed&&"right"!==r.fixed&&y.push(g),"right"===r.fixed&&h.push(g)}}),v.push(''+o.join("")+""),m.push(''+y.join("")+""),g.push(''+h.join("")+""))}),c.layBody.scrollTop(0),c.layMain.find("."+p).remove(),c.layMain.find("tbody").html(v.join("")),c.layFixLeft.find("tbody").html(m.join("")),c.layFixRight.find("tbody").html(g.join("")),c.renderForm(),"number"==typeof e&&c.setThisRowChecked(e),c.syncCheckAll(),c.haveInit?c.scrollPatch():setTimeout(function(){c.scrollPatch()},50),c.haveInit=!0,l.close(c.tipsIndex),s.HAS_SET_COLS_PATCH||c.setColsPatch(),void(s.HAS_SET_COLS_PATCH=!0))};return d.cache[c.key]=y,c.layPage[0==o||0===y.length&&1==n?"addClass":"removeClass"](f),r?b():0===y.length?(c.renderForm(),c.errorView(s.text.none)):(c.layFixed.removeClass(f),b(),c.renderTotal(y,h),void(s.page&&(s.page=t.extend({elem:"layui-table-page"+s.index,count:o,limit:s.limit,limits:s.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(c.page=e.curr,s.limit=e.limit,c.pullData(e.curr))}},s.page),s.page.count=o,a.render(s.page))))},F.prototype.renderTotal=function(e,t){var i=this,a=i.config,l={};if(a.totalRow){layui.each(e,function(e,t){0!==t.length&&i.eachCols(function(e,i){var a=i.field||e,n=t[a];i.totalRow&&(l[a]=(l[a]||0)+(parseFloat(n)||0))})}),i.dataTotal={};var n=[];i.eachCols(function(e,o){var r=o.field||e,d=function(){var e=o.totalRowText||"",i=parseFloat(l[r]).toFixed(2),a={};return a[r]=i,i=u(o,i,a),t?t[o.field]||e:o.totalRow?i||e:e}(),c=['','
                              '+d,"
                              "].join("");o.field&&(i.dataTotal[r]=d),n.push(c)}),i.layTotal.find("tbody").html(""+n.join("")+"")}},F.prototype.getColElem=function(e,t){var i=this,a=i.config;return e.eq(0).find(".laytable-cell-"+(a.index+"-"+t)+":eq(0)")},F.prototype.renderForm=function(e){n.render(e,"LAY-table-"+this.index)},F.prototype.setThisRowChecked=function(e){var t=this,i=(t.config,"layui-table-click"),a=t.layBody.find('tr[data-index="'+e+'"]');a.addClass(i).siblings("tr").removeClass(i)},F.prototype.sort=function(e,i,a,l){var n,r,c=this,s={},u=c.config,h=u.elem.attr("lay-filter"),f=d.cache[c.key];"string"==typeof e&&c.layHeader.find("th").each(function(i,a){var l=t(this),o=l.data("field");if(o===e)return e=l,n=o,!1});try{var n=n||e.data("field"),p=e.data("key");if(c.sortKey&&!a&&n===c.sortKey.field&&i===c.sortKey.sort)return;var v=c.layHeader.find("th .laytable-cell-"+p).find(S);c.layHeader.find("th").find(S).removeAttr("lay-sort"),v.attr("lay-sort",i||null),c.layFixed.find("th")}catch(m){return o.error("Table modules: Did not match to field")}c.sortKey={field:n,sort:i},u.autoSort&&("asc"===i?r=layui.sort(f,n):"desc"===i?r=layui.sort(f,n,!0):(r=layui.sort(f,d.config.indexName),delete c.sortKey)),s[u.response.dataName]=r||f,c.renderData(s,c.page,c.count,!0),l&&layui.event.call(e,y,"sort("+h+")",{field:n,type:i})},F.prototype.loading=function(e){var i=this,a=i.config;a.loading&&(e?(i.layInit&&i.layInit.remove(),delete i.layInit,i.layBox.find(b).remove()):(i.layInit=t(['
                              ','',"
                              "].join("")),i.layBox.append(i.layInit)))},F.prototype.setCheckData=function(e,t){var i=this,a=i.config,l=d.cache[i.key];l[e]&&l[e].constructor!==Array&&(l[e][a.checkName]=t)},F.prototype.syncCheckAll=function(){var e=this,t=e.config,i=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(i){return e.eachCols(function(e,a){"checkbox"===a.type&&(a[t.checkName]=i)}),i};i[0]&&(d.checkStatus(e.key).isAll?(i[0].checked||(i.prop("checked",!0),e.renderForm("checkbox")),a(!0)):(i[0].checked&&(i.prop("checked",!1),e.renderForm("checkbox")),a(!1)))},F.prototype.getCssRule=function(e,t){var i=this,a=i.elem.find("style")[0],l=a.sheet||a.styleSheet||{},n=l.cssRules||l.rules;layui.each(n,function(i,a){if(a.selectorText===".laytable-cell-"+e)return t(a),!0})},F.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=H.height()-t.fullHeightGap,a<135&&(a=135),t.elem.css("height",a)),a&&(e=parseFloat(a)-(t.layHeader.outerHeight()||38),i.toolbar&&(e-=t.layTool.outerHeight()||50),i.totalRow&&(e-=t.layTotal.outerHeight()||40),i.page&&(e-=t.layPage.outerHeight()||41),t.layMain.css("height",e-2))},F.prototype.getScrollWidth=function(e){var t=0;return e?t=e.offsetWidth-e.clientWidth:(e=document.createElement("div"),e.style.width="100px",e.style.height="100px",e.style.overflowY="scroll",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},F.prototype.scrollPatch=function(){var e=this,i=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),l=e.layMain.height()-e.layMain.prop("clientHeight"),n=(e.getScrollWidth(e.layMain[0]),i.outerWidth()-e.layMain.width()),o=function(e){if(a&&l){if(e=e.eq(0),!e.find(".layui-table-patch")[0]){var i=t('
                              ');i.find("div").css({width:a}),e.find("tr").append(i)}}else e.find(".layui-table-patch").remove()};o(e.layHeader),o(e.layTotal);var r=e.layMain.height(),d=r-l;e.layFixed.find(k).css("height",i.height()>=d?d:"auto"),e.layFixRight[n>0?"removeClass":"addClass"](f),e.layFixRight.css("right",a-1)},F.prototype.events=function(){var e,i=this,a=i.config,o=t("body"),c={},s=i.layHeader.find("th"),h=".layui-table-cell",p=a.elem.attr("lay-filter");i.layTool.on("click","*[lay-event]",function(e){var o=t(this),c=o.attr("lay-event"),s=function(e){var l=t(e.list),n=t('
                                ');n.html(l),a.height&&n.css("max-height",a.height-(i.layTool.outerHeight()||50)),o.find(".layui-table-tool-panel")[0]||o.append(n),i.renderForm(),n.on("click",function(e){layui.stope(e)}),e.done&&e.done(n,l)};switch(layui.stope(e),j.trigger("table.tool.panel.remove"),l.close(i.tipsIndex),c){case"LAYTABLE_COLS":s({list:function(){var e=[];return i.eachCols(function(t,i){i.field&&"normal"==i.type&&e.push('
                              • ')}),e.join("")}(),done:function(){n.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var l=t(e.elem),n=this.checked,o=l.data("key"),r=l.data("parentkey");layui.each(a.cols,function(e,t){layui.each(t,function(t,l){if(e+"-"+t===o){var d=l.hide;l.hide=!n,i.elem.find('*[data-key="'+a.index+"-"+o+'"]')[n?"removeClass":"addClass"](f),d!=l.hide&&i.setParentCol(!n,r),i.resize()}})})})}});break;case"LAYTABLE_EXPORT":r.ie?l.tips("导出功能不支持 IE,请用 Chrome 等高级浏览器导出",this,{tips:3}):s({list:function(){return['
                              • 导出到 Csv 文件
                              • ','
                              • 导出到 Excel 文件
                              • '].join("")}(),done:function(e,l){l.on("click",function(){var e=t(this).data("type");d.exportFile.call(i,a.id,null,e)})}});break;case"LAYTABLE_PRINT":var u=window.open("打印窗口","_blank"),h=[""].join(""),v=t(i.layHeader.html());v.append(i.layMain.find("table").html()),v.append(i.layTotal.find("table").html()),v.find("th.layui-table-patch").remove(),v.find(".layui-table-col-special").remove(),u.document.write(h+v.prop("outerHTML")),u.document.close(),u.print(),u.close()}layui.event.call(this,y,"toolbar("+p+")",t.extend({event:c,config:a},{}))}),s.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;i.data("unresize")||c.resizeStart||(c.allowResize=i.width()-l<=10,o.css("cursor",c.allowResize?"col-resize":""))}).on("mouseleave",function(){t(this);c.resizeStart||o.css("cursor","")}).on("mousedown",function(e){var l=t(this);if(c.allowResize){var n=l.data("key");e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],i.getCssRule(n,function(e){var t=e.style.width||l.outerWidth();c.rule=e,c.ruleWidth=parseFloat(t),c.minWidth=l.data("minwidth")||a.cellMinWidth})}}),j.on("mousemove",function(t){if(c.resizeStart){if(t.preventDefault(),c.rule){var a=c.ruleWidth+t.clientX-c.offset[0];a');return n[0].value=i.data("content")||l.text(),i.find("."+R)[0]||i.append(n),n.focus(),void layui.stope(e)}}).on("mouseenter","td",function(){b.call(this)}).on("mouseleave","td",function(){b.call(this,"hide")});var g="layui-table-grid-down",b=function(e){var i=t(this),a=i.children(h);if(!i.data("off"))if(e)i.find(".layui-table-grid-down").remove();else if(a.prop("scrollWidth")>a.outerWidth()){if(a.find("."+g)[0])return;i.append('
                                ')}};i.layBody.on("click","."+g,function(e){var n=t(this),o=n.parent(),d=o.children(h);i.tipsIndex=l.tips(['
                                ',d.html(),"
                                ",''].join(""),d[0],{tips:[3,""],time:-1,anim:-1,maxWidth:r.ios||r.android?300:i.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){l.close(t)})}}),layui.stope(e)}),i.layBody.on("click","*[lay-event]",function(){var e=t(this),a=e.parents("tr").eq(0).data("index");layui.event.call(this,y,"tool("+p+")",v.call(this,{event:e.attr("lay-event")})),i.setThisRowChecked(a)}),i.layMain.on("scroll",function(){var e=t(this),a=e.scrollLeft(),n=e.scrollTop();i.layHeader.scrollLeft(a),i.layTotal.scrollLeft(a),i.layFixed.find(k).scrollTop(n),l.close(i.tipsIndex)}),H.on("resize",function(){i.resize()})},function(){j.on("click",function(){j.trigger("table.remove.tool.panel")}),j.on("table.remove.tool.panel",function(){t(".layui-table-tool-panel").remove()})}(),d.init=function(e,i){i=i||{};var a=this,l=t(e?'table[lay-filter="'+e+'"]':h+"[lay-data]"),n="Table element property lay-data configuration item has a syntax error: ";return l.each(function(){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){o.error(n+l)}var c=[],s=t.extend({elem:this,cols:[],data:[],skin:a.attr("lay-skin"),size:a.attr("lay-size"),even:"string"==typeof a.attr("lay-even")},d.config,i,l);e&&a.hide(),a.find("thead>tr").each(function(e){s.cols[e]=[],t(this).children().each(function(i){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){return o.error(n+l)}var d=t.extend({title:a.text(),colspan:a.attr("colspan")||0,rowspan:a.attr("rowspan")||0},l);d.colspan<2&&c.push(d),s.cols[e].push(d)})}),a.find("tbody>tr").each(function(e){var i=t(this),a={};i.children("td").each(function(e,i){var l=t(this),n=l.data("field");if(n)return a[n]=l.html()}),layui.each(c,function(e,t){var l=i.children("td").eq(e);a[t.field]=l.html()}),s.data[e]=a}),d.render(s)}),a},c.that={},c.config={},d.eachCols=function(e,i,a){var l=c.config[e]||{},n=[],o=0;a=t.extend(!0,[],a||l.cols),layui.each(a,function(e,t){layui.each(t,function(t,i){if(i.colGroup){var l=0;o++,i.CHILD_COLS=[],layui.each(a[e+1],function(e,t){t.PARENT_COL_INDEX||l>1&&l==i.colspan||(t.PARENT_COL_INDEX=o,i.CHILD_COLS.push(t),l+=parseInt(t.colspan>1?t.colspan:1))})}i.PARENT_COL_INDEX||n.push(i)})});var r=function(e){layui.each(e||n,function(e,t){return t.CHILD_COLS?r(t.CHILD_COLS):void("function"==typeof i&&i(e,t))})};r()},d.checkStatus=function(e){var t=0,i=0,a=[],l=d.cache[e]||[];return layui.each(l,function(e,l){return l.constructor===Array?void i++:void(l[d.config.checkName]&&(t++,a.push(d.clearCacheKey(l))))}),{data:a,isAll:!!l.length&&t===l.length-i}},d.exportFile=function(e,t,i){var a=this;t=t||d.clearCacheKey(d.cache[e]),i=i||"csv";var l=c.config[e]||{},n={csv:"text/csv",xls:"application/vnd.ms-excel"}[i],s=document.createElement("a");return r.ie?o.error("IE_NOT_SUPPORT_EXPORTS"):(s.href="data:"+n+";charset=utf-8,\ufeff"+encodeURIComponent(function(){var i=[],l=[],n=[];return layui.each(t,function(t,a){var n=[];"object"==typeof e?(layui.each(e,function(e,a){0==t&&i.push(a||"")}),layui.each(d.clearCacheKey(a),function(e,t){n.push('"'+(t||"")+'"')})):d.eachCols(e,function(e,l){if(l.field&&"normal"==l.type&&!l.hide){var o=a[l.field];void 0!==o&&null!==o||(o=""),0==t&&i.push(l.title||""),n.push('"'+u(l,o,a,"text")+'"')}}),l.push(n.join(","))}),layui.each(a.dataTotal,function(e,t){n.push(t)}),i.join(",")+"\r\n"+l.join("\r\n")+"\r\n"+n.join(",")}()),s.download=(l.title||"table_"+(l.index||""))+"."+i,document.body.appendChild(s),s.click(),void document.body.removeChild(s))},d.resize=function(e){if(e){var t=s(e);if(!t)return;c.that[e].resize()}else layui.each(c.that,function(){this.resize()})},d.reload=function(e,t){var i=s(e);if(i){var a=c.that[e];return a.reload(t),c.call(a)}},d.render=function(e){var t=new F(e);return c.call(t)},d.clearCacheKey=function(e){return e=t.extend({},e),delete e[d.config.checkName],delete e[d.config.indexName],e},d.init(),e(y,d)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/transfer.js b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/transfer.js new file mode 100644 index 0000000..2483921 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/transfer.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define(["laytpl","form"],function(e){"use strict";var a=layui.$,t=layui.laytpl,n=layui.form,i="transfer",l={config:{},index:layui[i]?layui[i].index+1e4:0,set:function(e){var t=this;return t.config=a.extend({},t.config,e),t},on:function(e,a){return layui.onevent.call(this,i,e,a)}},r=function(){var e=this,a=e.config,t=a.id||e.index;return r.that[t]=e,r.config[t]=a,{config:a,reload:function(a){e.reload.call(e,a)},getData:function(){return e.getData.call(e)}}},c="layui-hide",o="layui-btn-disabled",d="layui-none",s="layui-transfer-box",u="layui-transfer-header",h="layui-transfer-search",f="layui-transfer-active",y="layui-transfer-data",p=function(e){return e=e||{},['
                                ','
                                ','","
                                ","{{# if(d.data.showSearch){ }}",'","{{# } }}",'
                                  ',"
                                  "].join("")},v=['
                                  ',p({index:0,checkAllName:"layTransferLeftCheckAll"}),'
                                  ','",'","
                                  ",p({index:1,checkAllName:"layTransferRightCheckAll"}),"
                                  "].join(""),x=function(e){var t=this;t.index=++l.index,t.config=a.extend({},t.config,l.config,e),t.render()};x.prototype.config={title:["列表一","列表二"],width:200,height:360,data:[],value:[],showSearch:!1,id:"",text:{none:"无数据",searchNone:"无匹配数据"}},x.prototype.reload=function(e){var t=this;layui.each(e,function(e,a){a.constructor===Array&&delete t.config[e]}),t.config=a.extend(!0,{},t.config,e),t.render()},x.prototype.render=function(){var e=this,n=e.config,i=e.elem=a(t(v).render({data:n,index:e.index})),l=n.elem=a(n.elem);l[0]&&(n.data=n.data||[],n.value=n.value||[],e.key=n.id||e.index,l.html(e.elem),e.layBox=e.elem.find("."+s),e.layHeader=e.elem.find("."+u),e.laySearch=e.elem.find("."+h),e.layData=i.find("."+y),e.layBtn=i.find("."+f+" .layui-btn"),e.layBox.css({width:n.width,height:n.height}),e.layData.css({height:function(){return n.height-e.layHeader.outerHeight()-e.laySearch.outerHeight()-2}()}),e.renderData(),e.events())},x.prototype.renderData=function(){var e=this,a=(e.config,[{checkName:"layTransferLeftCheck",views:[]},{checkName:"layTransferRightCheck",views:[]}]);e.parseData(function(e){var t=e.selected?1:0,n=["
                                • ",'',"
                                • "].join("");a[t].views.push(n),delete e.selected}),e.layData.eq(0).html(a[0].views.join("")),e.layData.eq(1).html(a[1].views.join("")),e.renderCheckBtn()},x.prototype.renderForm=function(e){n.render(e,"LAY-transfer-"+this.index)},x.prototype.renderCheckBtn=function(e){var t=this,n=t.config;e=e||{},t.layBox.each(function(i){var l=a(this),r=l.find("."+y),d=l.find("."+u).find('input[type="checkbox"]'),s=r.find('input[type="checkbox"]'),h=0,f=!1;if(s.each(function(){var e=a(this).data("hide");(this.checked||this.disabled||e)&&h++,this.checked&&!e&&(f=!0)}),d.prop("checked",f&&h===s.length),t.layBtn.eq(i)[f?"removeClass":"addClass"](o),!e.stopNone){var p=r.children("li:not(."+c+")").length;t.noneView(r,p?"":n.text.none)}}),t.renderForm("checkbox")},x.prototype.noneView=function(e,t){var n=a('

                                  '+(t||"")+"

                                  ");e.find("."+d)[0]&&e.find("."+d).remove(),t.replace(/\s/g,"")&&e.append(n)},x.prototype.setValue=function(){var e=this,t=e.config,n=[];return e.layBox.eq(1).find("."+y+' input[type="checkbox"]').each(function(){var e=a(this).data("hide");e||n.push(this.value)}),t.value=n,e},x.prototype.parseData=function(e){var t=this,n=t.config,i=[];return layui.each(n.data,function(t,l){l=("function"==typeof n.parseData?n.parseData(l):l)||l,i.push(l=a.extend({},l)),layui.each(n.value,function(e,a){a==l.value&&(l.selected=!0)}),e&&e(l)}),n.data=i,t},x.prototype.getData=function(e){var a=this,t=a.config,n=[];return a.setValue(),layui.each(e||t.value,function(e,a){layui.each(t.data,function(e,t){delete t.selected,a==t.value&&n.push(t)})}),n},x.prototype.events=function(){var e=this,t=e.config;e.elem.on("click",'input[lay-filter="layTransferCheckbox"]+',function(){var t=a(this).prev(),n=t[0].checked,i=t.parents("."+s).eq(0).find("."+y);t[0].disabled||("all"===t.attr("lay-type")&&i.find('input[type="checkbox"]').each(function(){this.disabled||(this.checked=n)}),e.renderCheckBtn({stopNone:!0}))}),e.layBtn.on("click",function(){var n=a(this),i=n.data("index"),l=e.layBox.eq(i),r=[];if(!n.hasClass(o)){e.layBox.eq(i).each(function(t){var n=a(this),i=n.find("."+y);i.children("li").each(function(){var t=a(this),n=t.find('input[type="checkbox"]'),i=n.data("hide");n[0].checked&&!i&&(n[0].checked=!1,l.siblings("."+s).find("."+y).append(t.clone()),t.remove(),r.push(n[0].value)),e.setValue()})}),e.renderCheckBtn();var c=l.siblings("."+s).find("."+h+" input");""===c.val()||c.trigger("keyup"),t.onchange&&t.onchange(e.getData(r),i)}}),e.laySearch.find("input").on("keyup",function(){var n=this.value,i=a(this).parents("."+h).eq(0).siblings("."+y),l=i.children("li");l.each(function(){var e=a(this),t=e.find('input[type="checkbox"]'),i=t[0].title.indexOf(n)!==-1;e[i?"removeClass":"addClass"](c),t.data("hide",!i)}),e.renderCheckBtn();var r=l.length===i.children("li."+c).length;e.noneView(i,r?t.text.searchNone:"")})},r.that={},r.config={},l.reload=function(e,a){var t=r.that[e];return t.reload(a),r.call(t)},l.getData=function(e){var a=r.that[e];return a.getData()},l.render=function(e){var a=new x(e);return r.call(a)},e(i,l)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/tree.js b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/tree.js new file mode 100644 index 0000000..c9c93a2 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/tree.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define("form",function(e){"use strict";var i=layui.$,a=layui.form,n=layui.layer,t="tree",r={config:{},index:layui[t]?layui[t].index+1e4:0,set:function(e){var a=this;return a.config=i.extend({},a.config,e),a},on:function(e,i){return layui.onevent.call(this,t,e,i)}},l=function(){var e=this,i=e.config,a=i.id||e.index;return l.that[a]=e,l.config[a]=i,{config:i,reload:function(i){e.reload.call(e,i)},getChecked:function(){return e.getChecked.call(e)},setChecked:function(i){return e.setChecked.call(e,i)}}},c="layui-hide",d="layui-disabled",s="layui-tree-set",o="layui-tree-iconClick",h="layui-icon-addition",u="layui-icon-subtraction",p="layui-tree-entry",f="layui-tree-main",y="layui-tree-txt",v="layui-tree-pack",C="layui-tree-spread",k="layui-tree-setLineShort",m="layui-tree-showLine",x="layui-tree-lineExtend",b=function(e){var a=this;a.index=++r.index,a.config=i.extend({},a.config,r.config,e),a.render()};b.prototype.config={data:[],showCheckbox:!1,showLine:!0,accordion:!1,onlyIconControl:!1,isJump:!1,edit:!1,text:{defaultNodeName:"未命名",none:"无数据"}},b.prototype.reload=function(e){var a=this;layui.each(e,function(e,i){i.constructor===Array&&delete a.config[e]}),a.config=i.extend(!0,{},a.config,e),a.render()},b.prototype.render=function(){var e=this,a=e.config;e.checkids=[];var n=i('
                                  ');e.tree(n);var t=a.elem=i(a.elem);if(t[0]){if(e.key=a.id||e.index,e.elem=n,e.elemNone=i('
                                  '+a.text.none+"
                                  "),t.html(e.elem),0==e.elem.find(".layui-tree-set").length)return e.elem.append(e.elemNone);a.showCheckbox&&e.renderForm("checkbox"),e.elem.find(".layui-tree-set").each(function(){var e=i(this);e.parent(".layui-tree-pack")[0]||e.addClass("layui-tree-setHide"),!e.next()[0]&&e.parents(".layui-tree-pack").eq(1).hasClass("layui-tree-lineExtend")&&e.addClass(k),e.next()[0]||e.parents(".layui-tree-set").eq(0).next()[0]||e.addClass(k)}),e.events()}},b.prototype.renderForm=function(e){a.render(e,"LAY-tree-"+this.index)},b.prototype.tree=function(e,a){var n=this,t=n.config,r=a||t.data;layui.each(r,function(a,r){var l=r.children&&r.children.length>0,o=i('
                                  '),h=i(['
                                  ','
                                  ','
                                  ',function(){return t.showLine?l?'':'':''}(),function(){return t.showCheckbox?'':""}(),function(){return t.isJump&&r.href?''+(r.title||r.label||t.text.defaultNodeName)+"":''+(r.title||r.label||t.text.defaultNodeName)+""}(),"
                                  ",function(){if(!t.edit)return"";var e={add:'',update:'',del:''},i=['
                                  '];return t.edit===!0&&(t.edit=["update","del"]),"object"==typeof t.edit?(layui.each(t.edit,function(a,n){i.push(e[n]||"")}),i.join("")+"
                                  "):void 0}(),"
                                  "].join(""));l&&(h.append(o),n.tree(o,r.children)),e.append(h),h.prev("."+s)[0]&&h.prev().children(".layui-tree-pack").addClass("layui-tree-showLine"),l||h.parent(".layui-tree-pack").addClass("layui-tree-lineExtend"),n.spread(h,r),t.showCheckbox&&(r.checked&&n.checkids.push(r.id),n.checkClick(h,r)),t.edit&&n.operate(h,r)})},b.prototype.spread=function(e,a){var n=this,t=n.config,r=e.children("."+p),l=r.children("."+f),c=r.find("."+o),k=r.find("."+y),m=t.onlyIconControl?c:l,x="";m.on("click",function(i){var a=e.children("."+v),n=m.children(".layui-icon")[0]?m.children(".layui-icon"):m.find(".layui-tree-icon").children(".layui-icon");if(a[0]){if(e.hasClass(C))e.removeClass(C),a.slideUp(200),n.removeClass(u).addClass(h);else if(e.addClass(C),a.slideDown(200),n.addClass(u).removeClass(h),t.accordion){var r=e.siblings("."+s);r.removeClass(C),r.children("."+v).slideUp(200),r.find(".layui-tree-icon").children(".layui-icon").removeClass(u).addClass(h)}}else x="normal"}),k.on("click",function(){var n=i(this);n.hasClass(d)||(x=e.hasClass(C)?t.onlyIconControl?"open":"close":t.onlyIconControl?"close":"open",t.click&&t.click({elem:e,state:x,data:a}))})},b.prototype.setCheckbox=function(e,i,a){var n=this,t=(n.config,a.prop("checked"));if(!a.prop("disabled")){if("object"==typeof i.children||e.find("."+v)[0]){var r=e.find("."+v).find('input[same="layuiTreeCheck"]');r.each(function(){this.disabled||(this.checked=t)})}var l=function(e){if(e.parents("."+s)[0]){var i,a=e.parent("."+v),n=a.parent(),r=a.prev().find('input[same="layuiTreeCheck"]');t?r.prop("checked",t):(a.find('input[same="layuiTreeCheck"]').each(function(){this.checked&&(i=!0)}),i||r.prop("checked",!1)),l(n)}};l(e),n.renderForm("checkbox")}},b.prototype.checkClick=function(e,a){var n=this,t=n.config,r=e.children("."+p),l=r.children("."+f);l.on("click",'input[same="layuiTreeCheck"]+',function(r){layui.stope(r);var l=i(this).prev(),c=l.prop("checked");l.prop("disabled")||(n.setCheckbox(e,a,l),t.oncheck&&t.oncheck({elem:e,checked:c,data:a}))})},b.prototype.operate=function(e,a){var t=this,r=t.config,l=e.children("."+p),d=l.children("."+f);l.children(".layui-tree-btnGroup").on("click",".layui-icon",function(l){layui.stope(l);var f=i(this).data("type"),b=e.children("."+v),g={data:a,type:f,elem:e};if("add"==f){b[0]||(r.showLine?(d.find("."+o).addClass("layui-tree-icon"),d.find("."+o).children(".layui-icon").addClass(h).removeClass("layui-icon-file")):d.find(".layui-tree-iconArrow").removeClass(c),e.append('
                                  '));var w=r.operate&&r.operate(g),N={};if(N.title=r.text.defaultNodeName,N.id=w,t.tree(e.children("."+v),[N]),r.showLine)if(b[0])b.hasClass(x)||b.addClass(x),e.find("."+v).each(function(){i(this).children("."+s).last().addClass(k)}),b.children("."+s).last().prev().hasClass(k)?b.children("."+s).last().prev().removeClass(k):b.children("."+s).last().removeClass(k),!e.parent("."+v)[0]&&e.next()[0]&&b.children("."+s).last().removeClass(k);else{var T=e.siblings("."+s),L=1,A=e.parent("."+v);layui.each(T,function(e,a){i(a).children("."+v)[0]||(L=0)}),1==L?(T.children("."+v).addClass(m),T.children("."+v).children("."+s).removeClass(k),e.children("."+v).addClass(m),A.removeClass(x),A.children("."+s).last().children("."+v).children("."+s).last().addClass(k)):e.children("."+v).children("."+s).addClass(k)}if(!r.showCheckbox)return;if(d.find('input[same="layuiTreeCheck"]')[0].checked){var I=e.children("."+v).children("."+s).last();I.find('input[same="layuiTreeCheck"]')[0].checked=!0}t.renderForm("checkbox")}else if("update"==f){var F=d.children("."+y).html();d.children("."+y).html(""),d.append(''),d.children(".layui-tree-editInput").val(F).focus();var j=function(e){var i=e.val().trim();i=i?i:r.text.defaultNodeName,e.remove(),d.children("."+y).html(i),g.data.title=i,r.operate&&r.operate(g)};d.children(".layui-tree-editInput").blur(function(){j(i(this))}),d.children(".layui-tree-editInput").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),j(i(this)))})}else n.confirm('确认删除该节点 "'+(a.title||"")+'" 吗?',function(a){if(r.operate&&r.operate(g),g.status="remove",n.close(a),!e.prev("."+s)[0]&&!e.next("."+s)[0]&&!e.parent("."+v)[0])return e.remove(),void t.elem.append(t.elemNone);if(e.siblings("."+s).children("."+p)[0]){if(r.showCheckbox){var l=function(e){if(e.parents("."+s)[0]){var a=e.siblings("."+s).children("."+p),n=e.parent("."+v).prev(),r=n.find('input[same="layuiTreeCheck"]')[0],c=1,d=0;0==r.checked&&(a.each(function(e,a){var n=i(a).find('input[same="layuiTreeCheck"]')[0];0!=n.checked||n.disabled||(c=0),n.disabled||(d=1)}),1==c&&1==d&&(r.checked=!0,t.renderForm("checkbox"),l(n.parent("."+s))))}};l(e)}if(r.showLine){var d=e.siblings("."+s),h=1,f=e.parent("."+v);layui.each(d,function(e,a){i(a).children("."+v)[0]||(h=0)}),1==h?(b[0]||(f.removeClass(x),d.children("."+v).addClass(m),d.children("."+v).children("."+s).removeClass(k)),e.next()[0]?f.children("."+s).last().children("."+v).children("."+s).last().addClass(k):e.prev().children("."+v).children("."+s).last().addClass(k),e.next()[0]||e.parents("."+s)[1]||e.parents("."+s).eq(0).next()[0]||e.prev("."+s).addClass(k)):!e.next()[0]&&e.hasClass(k)&&e.prev().addClass(k)}}else{var y=e.parent("."+v).prev();if(r.showLine){y.find("."+o).removeClass("layui-tree-icon"),y.find("."+o).children(".layui-icon").removeClass(u).addClass("layui-icon-file");var w=y.parents("."+v).eq(0);w.addClass(x),w.children("."+s).each(function(){i(this).children("."+v).children("."+s).last().addClass(k)})}else y.find(".layui-tree-iconArrow").addClass(c);e.parents("."+s).eq(0).removeClass(C),e.parent("."+v).remove()}e.remove()})})},b.prototype.events=function(){var e=this,a=e.config;e.elem.find(".layui-tree-checkedFirst");e.setChecked(e.checkids),e.elem.find(".layui-tree-search").on("keyup",function(){var n=i(this),t=n.val(),r=n.nextAll(),l=[];r.find("."+y).each(function(){var e=i(this).parents("."+p);if(i(this).html().indexOf(t)!=-1){l.push(i(this).parent());var a=function(e){e.addClass("layui-tree-searchShow"),e.parent("."+v)[0]&&a(e.parent("."+v).parent("."+s))};a(e.parent("."+s))}}),r.find("."+p).each(function(){var e=i(this).parent("."+s);e.hasClass("layui-tree-searchShow")||e.addClass(c)}),0==r.find(".layui-tree-searchShow").length&&e.elem.append(e.elemNone),a.onsearch&&a.onsearch({elem:l})}),e.elem.find(".layui-tree-search").on("keydown",function(){i(this).nextAll().find("."+p).each(function(){var e=i(this).parent("."+s);e.removeClass("layui-tree-searchShow "+c)}),i(".layui-tree-emptyText")[0]&&i(".layui-tree-emptyText").remove()})},b.prototype.getChecked=function(){var e=this,a=e.config,n=[],t=[];e.elem.find(".layui-form-checked").each(function(){n.push(i(this).prev()[0].value)});var r=function(e,a){layui.each(e,function(e,t){layui.each(n,function(e,n){if(t.id==n){var l=i.extend({},t);return delete l.children,a.push(l),t.children&&(l.children=[],r(t.children,l.children)),!0}})})};return r(i.extend({},a.data),t),t},b.prototype.setChecked=function(e){var a=this;a.config;a.elem.find("."+s).each(function(a,n){var t=i(this).data("id"),r=i(n).children("."+p).find('input[same="layuiTreeCheck"]'),l=r.next();if("number"==typeof e){if(t==e)return r[0].checked||l.click(),!1}else"object"==typeof e&&layui.each(e,function(e,i){if(i==t&&!r[0].checked)return l.click(),!0})})},l.that={},l.config={},r.reload=function(e,i){var a=l.that[e];return a.reload(i),l.call(a)},r.getChecked=function(e){var i=l.that[e];return i.getChecked()},r.setChecked=function(e,i){var a=l.that[e];return a.setChecked(i)},r.render=function(e){var i=new b(e);return l.call(i)},e(t,r)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/upload.js b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/upload.js new file mode 100644 index 0000000..9298ecf --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/upload.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define("layer",function(e){"use strict";var t=layui.$,i=layui.layer,n=layui.hint(),o=layui.device(),a={config:{},set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,r,e,t)}},l=function(){var e=this;return{upload:function(t){e.upload.call(e,t)},reload:function(t){e.reload.call(e,t)},config:e.config}},r="upload",u="layui-upload-file",c="layui-upload-form",f="layui-upload-iframe",s="layui-upload-choose",p=function(e){var i=this;i.config=t.extend({},i.config,a.config,e),i.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",acceptMime:"",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},p.prototype.render=function(e){var i=this,e=i.config;e.elem=t(e.elem),e.bindAction=t(e.bindAction),i.file(),i.events()},p.prototype.file=function(){var e=this,i=e.config,n=e.elemFile=t(['"].join("")),a=i.elem.next();(a.hasClass(u)||a.hasClass(c))&&a.remove(),o.ie&&o.ie<10&&i.elem.wrap('
                                  '),e.isFile()?(e.elemFile=i.elem,i.field=i.elem[0].name):i.elem.after(n),o.ie&&o.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,i=e.config,n=t(''),o=t(['
                                  ',"
                                  "].join(""));t("#"+f)[0]||t("body").append(n),i.elem.next().hasClass(c)||(e.elemFile.wrap(o),i.elem.next("."+c).append(function(){var e=[];return layui.each(i.data,function(t,i){i="function"==typeof i?i():i,e.push('')}),e.join("")}()))},p.prototype.msg=function(e){return i.msg(e,{icon:2,shift:6})},p.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},p.prototype.preview=function(e){var t=this;window.FileReader&&layui.each(t.chooseFiles,function(t,i){var n=new FileReader;n.readAsDataURL(i),n.onload=function(){e&&e(t,i,this.result)}})},p.prototype.upload=function(e,i){var n,a=this,l=a.config,r=a.elemFile[0],u=function(){var i=0,n=0,o=e||a.files||a.chooseFiles||r.files,u=function(){l.multiple&&i+n===a.fileLength&&"function"==typeof l.allDone&&l.allDone({total:a.fileLength,successful:i,aborted:n})};layui.each(o,function(e,o){var r=new FormData;r.append(l.field,o),layui.each(l.data,function(e,t){t="function"==typeof t?t():t,r.append(e,t)});var c={url:l.url,type:"post",data:r,contentType:!1,processData:!1,dataType:"json",headers:l.headers||{},success:function(t){i++,d(e,t),u()},error:function(){n++,a.msg("请求上传接口出现异常"),m(e),u()}};"function"==typeof l.progress&&(c.xhr=function(){var e=t.ajaxSettings.xhr();return e.upload.addEventListener("progress",function(e){if(e.lengthComputable){var t=Math.floor(e.loaded/e.total*100);l.progress(t,l.item[0],e)}}),e}),t.ajax(c)})},c=function(){var e=t("#"+f);a.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var t,i=e.contents().find("body");try{t=i.text()}catch(n){a.msg("获取上传后的响应信息出现异常"),clearInterval(p.timer),m()}t&&(clearInterval(p.timer),i.html(""),d(0,t))},30)},d=function(e,t){if(a.elemFile.next("."+s).remove(),r.value="","object"!=typeof t)try{t=JSON.parse(t)}catch(i){return t={},a.msg("请对上传接口返回有效JSON")}"function"==typeof l.done&&l.done(t,e||0,function(e){a.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){a.upload(e)})},h=l.exts,v=function(){var t=[];return layui.each(e||a.chooseFiles,function(e,i){t.push(i.name)}),t}(),g={preview:function(e){a.preview(e)},upload:function(e,t){var i={};i[e]=t,a.upload(i)},pushFile:function(){return a.files=a.files||{},layui.each(a.chooseFiles,function(e,t){a.files[e]=t}),a.files},resetFile:function(e,t,i){var n=new File([t],i);a.files=a.files||{},a.files[e]=n}},y=function(){if("choose"!==i&&!l.auto||(l.choose&&l.choose(g),"choose"!==i))return l.before&&l.before(g),o.ie?o.ie>9?u():c():void u()};if(v=0===v.length?r.value.match(/[^\/\\]+\..+/g)||[]||"":v,0!==v.length){switch(l.accept){case"file":if(h&&!RegExp("\\w\\.("+h+")$","i").test(escape(v)))return a.msg("选择的文件中包含不支持的格式"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(h||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(v)))return a.msg("选择的视频中包含不支持的格式"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(h||"mp3|wav|mid")+")$","i").test(escape(v)))return a.msg("选择的音频中包含不支持的格式"),r.value="";break;default:if(layui.each(v,function(e,t){RegExp("\\w\\.("+(h||"jpg|png|gif|bmp|jpeg$")+")","i").test(escape(t))||(n=!0)}),n)return a.msg("选择的图片中包含不支持的格式"),r.value=""}if(a.fileLength=function(){var t=0,i=e||a.files||a.chooseFiles||r.files;return layui.each(i,function(){t++}),t}(),l.number&&a.fileLength>l.number)return a.msg("同时最多只能上传的数量为:"+l.number);if(l.size>0&&!(o.ie&&o.ie<10)){var F;if(layui.each(a.chooseFiles,function(e,t){if(t.size>1024*l.size){var i=l.size/1024;i=i>=1?i.toFixed(2)+"MB":l.size+"KB",r.value="",F=i}}),F)return a.msg("文件不能超过"+F)}y()}},p.prototype.reload=function(e){e=e||{},delete e.elem,delete e.bindAction;var i=this,e=i.config=t.extend({},i.config,a.config,e),n=e.elem.next();n.attr({name:e.name,accept:e.acceptMime,multiple:e.multiple})},p.prototype.events=function(){var e=this,i=e.config,a=function(t){e.chooseFiles={},layui.each(t,function(t,i){var n=(new Date).getTime();e.chooseFiles[n+"-"+t]=i})},l=function(t,n){var o=e.elemFile,a=t.length>1?t.length+"个文件":(t[0]||{}).name||o[0].value.match(/[^\/\\]+\..+/g)||[]||"";o.next().hasClass(s)&&o.next().remove(),e.upload(null,"choose"),e.isFile()||i.choose||o.after(''+a+"")};i.elem.off("upload.start").on("upload.start",function(){var o=t(this),a=o.attr("lay-data");if(a)try{a=new Function("return "+a)(),e.config=t.extend({},i,a)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+a)}e.config.item=o,e.elemFile[0].click()}),o.ie&&o.ie<10||i.elem.off("upload.over").on("upload.over",function(){var e=t(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=t(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,o){var r=t(this),u=o.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),a(u),i.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var t=this.files||[];a(t),i.auto?e.upload():l(t)}),i.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),i.elem.data("haveEvents")||(e.elemFile.on("change",function(){t(this).trigger("upload.change")}),i.elem.on("click",function(){e.isFile()||t(this).trigger("upload.start")}),i.drag&&i.elem.on("dragover",function(e){e.preventDefault(),t(this).trigger("upload.over")}).on("dragleave",function(e){t(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),t(this).trigger("upload.drop",e)}),i.bindAction.on("click",function(){t(this).trigger("upload.action")}),i.elem.data("haveEvents",!0))},a.render=function(e){var t=new p(e);return l.call(t)},e(r,a)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/util.js b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/util.js new file mode 100644 index 0000000..fdc1ec2 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/lay/modules/util.js @@ -0,0 +1,2 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var t=layui.$,i={fixbar:function(e){var i,n,a="layui-fixbar",o="layui-fixbar-top",r=t(document),l=t("body");e=t.extend({showHeight:200},e),e.bar1=e.bar1===!0?"":e.bar1,e.bar2=e.bar2===!0?"":e.bar2,e.bgcolor=e.bgcolor?"background-color:"+e.bgcolor:"";var c=[e.bar1,e.bar2,""],u=t(['
                                    ',e.bar1?'
                                  • '+c[0]+"
                                  • ":"",e.bar2?'
                                  • '+c[1]+"
                                  • ":"",'
                                  • '+c[2]+"
                                  • ","
                                  "].join("")),g=u.find("."+o),s=function(){var t=r.scrollTop();t>=e.showHeight?i||(g.show(),i=1):i&&(g.hide(),i=0)};t("."+a)[0]||("object"==typeof e.css&&u.css(e.css),l.append(u),s(),u.find("li").on("click",function(){var i=t(this),n=i.attr("lay-type");"top"===n&&t("html,body").animate({scrollTop:0},200),e.click&&e.click.call(this,n)}),r.on("scroll",function(){clearTimeout(n),n=setTimeout(function(){s()},100)}))},countdown:function(e,t,i){var n=this,a="function"==typeof t,o=new Date(e).getTime(),r=new Date(!t||a?(new Date).getTime():t).getTime(),l=o-r,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];a&&(i=t);var u=setTimeout(function(){n.countdown(e,r+1e3,i)},1e3);return i&&i(l>0?c:[0,0,0,0],t,u),l<=0&&clearTimeout(u),u},timeAgo:function(e,t){var i=this,n=[[],[]],a=(new Date).getTime()-new Date(e).getTime();return a>26784e5?(a=new Date(e),n[0][0]=i.digit(a.getFullYear(),4),n[0][1]=i.digit(a.getMonth()+1),n[0][2]=i.digit(a.getDate()),t||(n[1][0]=i.digit(a.getHours()),n[1][1]=i.digit(a.getMinutes()),n[1][2]=i.digit(a.getSeconds())),n[0].join("-")+" "+n[1].join(":")):a>=864e5?(a/1e3/60/60/24|0)+"天前":a>=36e5?(a/1e3/60/60|0)+"小时前":a>=18e4?(a/1e3/60|0)+"分钟前":a<0?"未来":"刚刚"},digit:function(e,t){var i="";e=String(e),t=t||2;for(var n=e.length;n/g,">").replace(/'/g,"'").replace(/"/g,""")},event:function(e,n,a){var o=t("body");return a=a||"click",n=i.event[e]=t.extend(!0,i.event[e],n)||{},i.event.UTIL_EVENT_CALLBACK=i.event.UTIL_EVENT_CALLBACK||{},o.off(a,"*["+e+"]",i.event.UTIL_EVENT_CALLBACK[e]),i.event.UTIL_EVENT_CALLBACK[e]=function(){var i=t(this),a=i.attr(e);"function"==typeof n[a]&&n[a].call(this,i)},o.on(a,"*["+e+"]",i.event.UTIL_EVENT_CALLBACK[e]),n}};!function(e,t,i){"$:nomunge";function n(){a=t[l](function(){o.each(function(){var t=e(this),i=t.width(),n=t.height(),a=e.data(this,u);(i!==a.w||n!==a.h)&&t.trigger(c,[a.w=i,a.h=n])}),n()},r[g])}var a,o=e([]),r=e.resize=e.extend(e.resize,{}),l="setTimeout",c="resize",u=c+"-special-event",g="delay",s="throttleWindow";r[g]=250,r[s]=!0,e.event.special[c]={setup:function(){if(!r[s]&&this[l])return!1;var t=e(this);o=o.add(t),e.data(this,u,{w:t.width(),h:t.height()}),1===o.length&&n()},teardown:function(){if(!r[s]&&this[l])return!1;var t=e(this);o=o.not(t),t.removeData(u),o.length||clearTimeout(a)},add:function(t){function n(t,n,o){var r=e(this),l=e.data(this,u)||{};l.w=n!==i?n:r.width(),l.h=o!==i?o:r.height(),a.apply(this,arguments)}if(!r[s]&&this[l])return!1;var a;return e.isFunction(t)?(a=t,n):(a=t.handler,void(t.handler=n))}}}(t,window),e("util",i)}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/layui.js b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/layui.js new file mode 100644 index 0000000..af940c9 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/layui.js @@ -0,0 +1 @@ +/** v2.11.2 | MIT Licensed */;!function(h){"use strict";var e,d=h.document,v=h.location,m={timeout:10,debug:!1,version:!1},g={modules:{},status:{},event:{},callback:{}},r=function(){this.v="2.11.2"},t=h.LAYUI_GLOBAL||{},b=(e=d.currentScript&&"SCRIPT"===d.currentScript.tagName.toUpperCase()?d.currentScript.src:function(){for(var e,t=d.getElementsByTagName("script"),n=t.length-1,r=n;01e3*m.timeout/5?j(o+" is not a valid module","error"):void((i?layui[o]=h[a.api]:g.status[o])?u():setTimeout(t,5))}()},0===n.length||layui["layui.all"]&&E[o]?u():(p=i?a.src:a,y=(E[o]?y+"modules/":p?"":m.base)+(p=(p=p||o).replace(/\s/g,"").replace(/\.js[^\/\.]*$/,""))+".js",!g.modules[o]&&layui[o]&&(g.modules[o]=y),g.modules[o]?c():(l=d.getElementsByTagName("head")[0],(s=d.createElement("script"))["async"]=!0,s.charset="utf-8",s.src=y+((p=!0===m.version?m.v||(new Date).getTime():m.version||"")?"?v="+p:""),l.appendChild(s),N(s,function(){l.removeChild(s),c()},function(){l.removeChild(s)}),g.modules[o]=y))),f},r.prototype.modules=Object.assign({},E),r.prototype.extend=function(e){var t,n,r=m.base||"",o=/^\{\/\}/;for(t in e=e||{})this[t]||this.modules[t]?j("the "+t+" module already exists, extend failure"):("string"==typeof(n=e[t])&&(n=((r=o.test(n)?"":r)+n).replace(o,"")),this.modules[t]=n);return this},r.prototype.disuse=function(e){var n=this;return e=n.isArray(e)?e:[e],n.each(e,function(e,t){delete n[t],delete E[t],delete n.modules[t],delete g.status[t],delete g.modules[t]}),n},r.prototype.getStyle=function(e,t){e=e.currentStyle||h.getComputedStyle(e,null);return e.getPropertyValue?e.getPropertyValue(t):e.getAttribute(t.replace(/-(\w)/g,function(e,t){return t?t.toUpperCase():""}))},r.prototype.link=function(n,r,o){var a,i=this,e=d.getElementsByTagName("head")[0],t="function"==typeof r;if("string"==typeof r&&(o=r),"object"==typeof n)return a="array"===i.type(o),i.each(n,function(e,t){i.link(t,e===n.length-1&&r,a&&o[e])});o="layuicss-"+(o=o||n.replace(/^(#|(http(s?)):\/\/|\/\/)|\.|\/|\?.+/g,""));var u=d.getElementById(o);return u||((u=d.createElement("link")).href=n+(m.debug?"?v="+(new Date).getTime():""),u.rel="stylesheet",u.id=o,e.appendChild(u)),"complete"===u.__lay_readyState__?t&&r(u):N(u,function(){u.__lay_readyState__="complete",t&&r(u)},function(){j(n+" load error","error"),e.removeChild(u)}),i},r.prototype.addcss=function(e,t,n){return layui.link(m.dir+"css/"+e,t,n)},r.prototype.factory=function(e){if(layui[e])return"function"==typeof m.callback[e]?m.callback[e]:null},r.prototype.img=function(e,t,n){var r=new Image;if(r.src=e,r.complete)return t(r);r.onload=function(){r.onload=null,"function"==typeof t&&t(r)},r.onerror=function(e){r.onerror=null,"function"==typeof n&&n(e)}},r.prototype.router=r.prototype.hash=function(e){var n={path:[],pathname:[],search:{},hash:((e=e||v.hash).match(/[^#](#.*$)/)||[])[1]||"",href:""};return/^#/.test(e)&&(e=e.replace(/^#/,""),e=(n.href=e).replace(/([^#])(#.*$)/,"$1").split("/")||[],this.each(e,function(e,t){/^\w+=/.test(t)?(t=t.split("="),n.search[t[0]]=t[1]):n.path.push(t)}),n.pathname=n.path),n},r.prototype.url=function(e){var o,t,n=this;return{pathname:(e?((e.match(/\.[^.]+?\/.+/)||[])[0]||"").replace(/^[^\/]+/,"").replace(/\?.+/,""):v.pathname).replace(/^\//,"").split("/"),search:(o={},t=(e?((e.match(/\?.+/)||[])[0]||"").replace(/\#.+/,""):v.search).replace(/^\?+/,"").split("&"),n.each(t,function(e,t){var n=t.indexOf("="),r=n<0?t.substr(0,t.length):0!==n&&t.substr(0,n);r&&(o[r]=0(d.innerHeight||h.documentElement.clientHeight)},p.getStyleRules=function(t,n){if(t)return t=(t=t.sheet||t.styleSheet||{}).cssRules||t.rules,"function"==typeof n&&layui.each(t,function(t,e){if(n(e,t))return!0}),t},p.style=function(t){t=t||{};var e=p.elem("style"),n=t.text||"",i=t.target;if(n)return"styleSheet"in e?(e.setAttribute("type","text/css"),e.styleSheet.cssText=n):e.innerHTML=n,e.id="LAY-STYLE-"+(t.id||(n=p.style.index||0,p.style.index++,"DF-"+n)),i&&((t=p(i).find("#"+e.id))[0]&&t.remove(),p(i).append(e)),e},p.position=function(t,e,n){var i,r,o,c,a,u,s,f,l;e&&(n=n||{},t!==h&&t!==p("body")[0]||(n.clickType="right"),i="right"===n.clickType?{left:(i=n.e||d.event||{}).clientX,top:i.clientY,right:i.clientX,bottom:i.clientY}:t.getBoundingClientRect(),a=e.offsetWidth,u=e.offsetHeight,r=function(t){return h.body[t=t?"scrollLeft":"scrollTop"]|h.documentElement[t]},o=function(t){return h.documentElement[t?"clientWidth":"clientHeight"]},c="margin"in n?n.margin:5,l=i.left,"center"===n.align?l-=(a-t.offsetWidth)/2:"right"===n.align&&(l=l-a+t.offsetWidth),(l=l+a+c>o("width")?o("width")-a-c:l)o()&&(i.top>u+c&&i.top<=o()?a=i.top-u-2*c:n.allowBottomOut||(a=o()-u-2*c)<0&&(a=0)),(u=n.position)&&(e.style.position=u),s=n.offset?n.offset[0]:0,f=n.offset?n.offset[1]:0,e.style.left=l+("fixed"===u?0:r(1))+s+"px",e.style.top=a+("fixed"===u?0:r())+f+"px",p.hasScrollbar()||(l=e.getBoundingClientRect(),!n.SYSTEM_RELOAD&&l.bottom+c>o()&&(n.SYSTEM_RELOAD=!0,setTimeout(function(){p.position(t,e,n)},50))))},p.options=function(t,e){if(e="object"==typeof e?e:{attr:e},t===h)return{};var t=p(t),n=e.attr||"lay-options",t=t.attr(n);try{return new Function("return "+(t||"{}"))()}catch(i){return layui.hint().error(e.errorText||[n+'="'+t+'"',"\n parseerror: "+i].join("\n"),"error"),{}}},p.isTopElem=function(n){var t=[h,p("body")[0]],i=!1;return p.each(t,function(t,e){if(e===n)return i=!0}),i},p.clipboard={writeText:function(n){var i=String(n.text);function t(){var t=h.createElement("textarea");t.value=i,t.style.position="fixed",t.style.opacity="0",t.style.top="0px",t.style.left="0px",h.body.appendChild(t),t.select();try{h.execCommand("copy"),"function"==typeof n.done&&n.done()}catch(e){"function"==typeof n.error&&n.error(e)}finally{t.remove?t.remove():h.body.removeChild(t)}}navigator&&"clipboard"in navigator?navigator.clipboard.writeText(i).then(n.done,function(){t()}):t()}},p.passiveSupported=function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});d.addEventListener("test",null,e),d.removeEventListener("test",null,e)}catch(n){}return t}(),p.touchEventsSupported=function(){return"ontouchstart"in d},p.touchSwipe=function(t,e){var n,i,r,o,c=e,a=p(t)[0],u=!("preventDefault"in c)||c.preventDefault;a&&p.touchEventsSupported()&&(n={pointerStart:{x:0,y:0},pointerEnd:{x:0,y:0},distanceX:0,distanceY:0,direction:"none",timeStart:null},e=function(t){1===t.touches.length&&(a.addEventListener("touchmove",i,!!p.passiveSupported&&{passive:!1}),a.addEventListener("touchend",r),a.addEventListener("touchcancel",r),n.timeStart=Date.now(),n.pointerStart.x=n.pointerEnd.x=t.touches[0].clientX,n.pointerStart.y=n.pointerEnd.y=t.touches[0].clientY,n.distanceX=n.distanceY=0,n.direction="none",c.onTouchStart)&&c.onTouchStart(t,n)},i=function(t){u&&t.preventDefault(),n.pointerEnd.x=t.touches[0].clientX,n.pointerEnd.y=t.touches[0].clientY,n.distanceX=n.pointerStart.x-n.pointerEnd.x,n.distanceY=n.pointerStart.y-n.pointerEnd.y,Math.abs(n.distanceX)>Math.abs(n.distanceY)?n.direction=0]|&(?=#?[a-zA-Z0-9]+)/g;return e===undefined||null===e?"":r.test(e+="")?e.replace(r,function(e){return"&#"+e.charCodeAt(0)+";"}):e}},m=function(e,r){return new RegExp(e,r||"g")},g=function(e,r,t){r=r||{};var e="Laytpl "+((r=Object.assign({errorContext:""},r)).type||"")+"Error: "+e,n=r.errorContext;return delete r.errorContext,"object"==typeof console&&console.error(e,"\n",n,"\n",r),"function"==typeof t&&t(r),e},o={open:"{{",close:"}}",cache:!0,condense:!0,tagStyle:""},t=function(e,r){var t=this;r=t.config=Object.assign({template:e},o,r),t.vars=Object.assign({include:function(e,r){e=document.getElementById(e),e=e?e.innerHTML:"";return e?t.render(e,r):""}},n),t.compile(r.template)},r=(t.prototype.render=function(r,t){var n=this,o=n.config,c=r?n.compile(r):n.compilerCache||n.compile(o.template),e=function(){t=t||o.data||{};try{return c(t)}catch(e){return r=r||o.template,g(e,{errorContext:n.extractErrorContext(r,t),template:r,type:"Render"},o.error)}}();return o.cache&&!r&&(n.compilerCache=c),e},t.prototype.compile=function(e){var t=this,o=t.config,c=o.open,a=o.close,i=o.condense,u=m,l="\u2028";if("string"!=typeof e||!e)return function(){return""};var p=function(e,r){e=["(?:"+c+(e[0]||"")+"\\s*)","("+(e[1]||"[\\s\\S]")+"*?)","(?:\\s*"+(e[2]||"")+a+")"];return(r=r||{}).before&&e.unshift(r.before),r.after&&e.push(r.after),u(e.join(""))},r=i?["",""]:["(?:(?:\\n)*\\s*)","(?:\\s*?)"],f={before:r[0],after:r[1]},s=function(e,r){return e=(e=i?e:e.replace(u(l),r?"":"\n")).replace(/\\(\\|")/g,"$1")},n=t.parse=function(e){var n,r,t;return(e=e||"")&&(e=(e=(e=i?e.replace(/\t/g," ").replace(/\s+/g," "):e).replace(u("([}\\]])"+a),"$1 "+a).replace(/(?=\\|")/g,"\\").replace(/\r?\n/g,i?"":l)).replace(p(["!","","!"],f),function(e,r){return r=r.replace(u(c+"|"+a),function(e){return e.replace(/(?=.)/g,"\\")})}),n=function(e){return['";',e,'__laytpl__+="'].join("\n")},r=function(e,r,t){return t&&(r="-"===r?"":"_escape",t=s(t,!0))?n("__laytpl__+="+r+"("+t+");"):""},t=function(e,r){return r?(r=s(r),n(r)):""},e="modern"===o.tagStyle?(e=(e=e.replace(p(["#"],f),"")).replace(p(["(=|-)"]),r)).replace(p([],f),t):(e=e.replace(p(["#"],f),t)).replace(p(["(=|-)*"]),r),i||(e=e.replace(u(l),"\\n"))),e},r=t.createCompiler=function(e,r){return r=r||d(e),new Function("laytpl","return "+r)(t.vars)},d=t.createBuilder=function(e,r){return r=r||["function(d){",'"use strict";','var __laytpl__="",'+function(){var e,r=[];for(e in t.vars)r.push(("escape"===e?"_":"")+e+"=laytpl."+e);return r.join(",")}()+";",'__laytpl__="'+n(e)+'";',"return __laytpl__;","};"].join("\n")};try{return r(e)}catch(y){return delete t.compilerCache,function(){return g(y,{errorContext:t.extractErrorContext(e),template:e,type:"Compile"},o.error)}}},t.prototype.extractErrorContext=function(e,r){var t=1,o=e.split(/\r?\n/g),n=(e=e.replace(/(?=^)/gm,function(){return"/*LINE:"+t+++"*/"}),this.createBuilder(e)),c=n.split(/\r?\n/),a="laytpl.builder.map";try{n+="\n//# sourceURL="+a;var i=this.createCompiler(e,n);r&&i(r)}catch(l){var e=m(a.replace(/\./g,"\\.")+":(\\d+)","i"),n=(l.stack.match(e)||[])[1]||0,u=function(e,r){var r=r?/\/\*LINE:(\d+)\*\/[^*]*$/:/\/\*LINE:(\d+)\*\//;return!(r=(String(c[e-1]).match(r)||[])[1])&&0n.pages?n.curr=n.pages:n.curr<1&&(n.curr=1),r<0?r=1:r>n.pages&&(r=n.pages),n.prev="prev"in n?n.prev:"\u4e0a\u4e00\u9875",n.next="next"in n?n.next:"\u4e0b\u4e00\u9875",n.pages>r?Math.ceil((n.curr+(1'+n.prev+"":"",page:function(){var e=[];if(n.count<1)return"";1'+(n.first||1)+"");var a=Math.floor((r-1)/2),t=1n.pages?n.pages:a:r;for(i-t...');t<=i;t++)t===n.curr?e.push('"+t+""):e.push(''+t+"");return n.pages>r&&n.pages>i&&!1!==n.last&&(i+1...'),0!==r)&&e.push(''+(n.last||n.pages)+""),e.join("")}(),next:n.next?''+n.next+"":"",count:''+(e="object"==typeof n.countText?n.countText:["\u5171 "," \u6761"])[0]+n.count+e[1]+"",limit:(i=['"),refresh:['','',""].join(""),skip:[''+(e="object"==typeof n.skipText?n.skipText:["\u5230\u7b2c","\u9875","\u786e\u5b9a"])[0],'',e[1]+'",""].join("")};return['
                                  ',(t=[],layui.each(n.layout,function(e,a){l[a]&&t.push(l[a])}),t.join("")),"
                                  "].join("")},t.prototype.jump=function(e,a){if(e){var t=this,i=t.config,n=e.children,r=e[c]("button")[0],u=e[c]("input")[0],e=e[c]("select")[0],l=function(){var e=Number(u.value.replace(/\s|\D/g,""));e&&(i.curr=e,t.render())};if(a)return l();for(var s=0,p=n.length;si.pages||(i.curr=e,t.render())});e&&o.on(e,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),r&&o.on(r,"click",function(){l()})}},t.prototype.skip=function(t){var i,e;t&&(i=this,e=t[c]("input")[0])&&o.on(e,"keyup",function(e){var a=this.value,e=e.keyCode;/^(37|38|39|40)$/.test(e)||(/\D/.test(a)&&(this.value=a.replace(/\D/,"")),13===e&&i.jump(t,!0))})},t.prototype.render=function(e){var a=this,t=a.config,i=a.type(),n=a.view(),i=(2===i?t.elem&&(t.elem.innerHTML=n):3===i?t.elem.html(n):r[u](t.elem)&&(r[u](t.elem).innerHTML=n),t.jump&&t.jump(t,e),r[u]("layui-laypage-"+t.index));a.jump(i),t.hash&&!e&&(location.hash="!"+t.hash+"="+t.curr),a.skip(i)},{render:function(e){return new t(e).index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(a,e,t){return a.attachEvent?a.attachEvent("on"+e,function(e){e.target=e.srcElement,t.call(a,e)}):a.addEventListener(e,t,!1),this}});e("laypage",o)});!function(i,D){"use strict";var n=i.layui&&layui.define,l={getPath:i.lay&&lay.getPath?lay.getPath:"",link:function(e,t,a){T.path&&i.lay&&lay.layui&&lay.layui.link(T.path+e,t,a)}},e=i.LAYUI_GLOBAL||{},a="laydate",d="lay-"+a+"-id",T={v:"5.6.0",config:{weekStart:0},index:i.laydate&&i.laydate.v?1e5:0,path:e.laydate_dir||l.getPath,set:function(e){var t=this;return t.config=lay.extend({},t.config,e),t},ready:function(e){var t="laydate",a=(n?"modules/":"")+"laydate.css?v="+T.v;return n?layui["layui.all"]?"function"==typeof e&&e():layui.addcss(a,e,t):l.link(a,e,t),this}},s=function(){var t=this,e=t.config.id;return(s.that[e]=t).inst={hint:function(e){t.hint.call(t,e)},reload:function(e){t.reload.call(t,e)},config:t.config}},M="layui-this",C="laydate-disabled",h=[100,2e5],v="layui-laydate-static",b="layui-laydate-list",o="laydate-selected",r="layui-laydate-hint",y="laydate-day-prev",m="laydate-day-next",E=".laydate-btns-confirm",L="laydate-time-text",I="laydate-btns-time",x="layui-laydate-preview",w="layui-laydate-shade",k=function(e){var t,a=this,n=(a.index=++T.index,a.config=lay.extend({},a.config,T.config,e),lay(e.elem||a.config.elem));return 1\u8bf7\u91cd\u65b0\u9009\u62e9",invalidDate:"\u4e0d\u5728\u6709\u6548\u65e5\u671f\u6216\u65f6\u95f4\u8303\u56f4\u5185",formatError:["\u65e5\u671f\u683c\u5f0f\u4e0d\u5408\u6cd5
                                  \u5fc5\u987b\u9075\u5faa\u4e0b\u8ff0\u683c\u5f0f\uff1a
                                  ","
                                  \u5df2\u4e3a\u4f60\u91cd\u7f6e"],preview:"\u5f53\u524d\u9009\u4e2d\u7684\u7ed3\u679c"},en:{weeks:["Su","Mo","Tu","We","Th","Fr","Sa"],time:["Hours","Minutes","Seconds"],timeTips:"Select Time",startTime:"Start Time",endTime:"End Time",dateTips:"Select Date",month:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],tools:{confirm:"Confirm",clear:"Clear",now:"Now"},timeout:"End time cannot be less than start Time
                                  Please re-select",invalidDate:"Invalid date",formatError:["The date format error
                                  Must be followed\uff1a
                                  ","
                                  It has been reset"],preview:"The selected result"}};return e[this.config.lang]||e.cn},k.prototype.markerOfChineseFestivals={"0-1-1":"\u5143\u65e6","0-2-14":"\u60c5\u4eba","0-3-8":"\u5987\u5973","0-3-12":"\u690d\u6811","0-4-1":"\u611a\u4eba","0-5-1":"\u52b3\u52a8","0-5-4":"\u9752\u5e74","0-6-1":"\u513f\u7ae5","0-9-10":"\u6559\u5e08","0-10-1":"\u56fd\u5e86","0-12-25":"\u5723\u8bde"},k.prototype.reload=function(e){this.config=lay.extend({},this.config,e),this.init()},k.prototype.init=function(){var r=this,o=r.config,e="static"===o.position,t={year:"yyyy",month:"yyyy-MM",date:"yyyy-MM-dd",time:"HH:mm:ss",datetime:"yyyy-MM-dd HH:mm:ss"};o.elem=lay(o.elem),o.eventElem=lay(o.eventElem),o.elem[0]&&("array"!==layui.type(o.theme)&&(o.theme=[o.theme]),o.fullPanel&&("datetime"!==o.type||o.range)&&delete o.fullPanel,r.rangeStr=o.range?"string"==typeof o.range?o.range:"-":"",r.rangeLinked=!(!o.range||!o.rangeLinked||"date"!==o.type&&"datetime"!==o.type),r.autoCalendarModel=function(){var e=r.rangeLinked;return r.rangeLinked=o.range&&("date"===o.type||"datetime"===o.type)&&(!r.startDate||!r.endDate||r.startDate&&r.endDate&&r.startDate.year===r.endDate.year&&r.startDate.month===r.endDate.month),lay(r.elem)[r.rangeLinked?"addClass":"removeClass"]("layui-laydate-linkage"),r.rangeLinked!=e},r.autoCalendarModel.auto=r.rangeLinked&&"auto"===o.rangeLinked,"array"===layui.type(o.range)&&(r.rangeElem=[lay(o.range[0]),lay(o.range[1])]),t[o.type]||(i.console&&console.error&&console.error("laydate type error:'"+o.type+"' is not supported"),o.type="date"),o.format===t.date&&(o.format=t[o.type]||t.date),r.format=s.formatArr(o.format),o.weekStart&&!/^[0-6]$/.test(o.weekStart)&&(t=r.lang(),o.weekStart=t.weeks.indexOf(o.weekStart),-1===o.weekStart)&&(o.weekStart=0),r.EXP_IF="",r.EXP_SPLIT="",lay.each(r.format,function(e,t){e=new RegExp(u).test(t)?"\\d{"+(new RegExp(u).test(r.format[0===e?e+1:e-1]||"")?/^yyyy|y$/.test(t)?4:t.length:/^yyyy$/.test(t)?"1,4":/^y$/.test(t)?"1,308":"1,2")+"}":"\\"+t;r.EXP_IF=r.EXP_IF+e,r.EXP_SPLIT=r.EXP_SPLIT+"("+e+")"}),r.EXP_IF_ONE=new RegExp("^"+r.EXP_IF+"$"),r.EXP_IF=new RegExp("^"+(o.range?r.EXP_IF+"\\s\\"+r.rangeStr+"\\s"+r.EXP_IF:r.EXP_IF)+"$"),r.EXP_SPLIT=new RegExp("^"+r.EXP_SPLIT+"$",""),r.isInput(o.elem[0])||"focus"===o.trigger&&(o.trigger="click"),o.elem.attr("lay-key",r.index),o.eventElem.attr("lay-key",r.index),o.elem.attr(d,o.id),lay.each(["min","max"],function(e,t){var a=[],n=[];if("number"==typeof o[t])var i=o[t],l=new Date,l=r.newDate({year:l.getFullYear(),month:l.getMonth(),date:l.getDate(),hours:e?23:0,minutes:e?59:0,seconds:e?59:0}).getTime(),e=new Date(i?i<864e5?l+864e5*i:i:l),a=[e.getFullYear(),e.getMonth()+1,e.getDate()],n=[e.getHours(),e.getMinutes(),e.getSeconds()];else if("string"==typeof o[t])a=(o[t].match(/\d+-\d+-\d+/)||[""])[0].split("-"),n=(o[t].match(/\d+:\d+:\d+/)||[""])[0].split(":");else if("object"==typeof o[t])return o[t];o[t]={year:0|a[0]||(new Date).getFullYear(),month:a[1]?(0|a[1])-1:(new Date).getMonth(),date:0|a[2]||(new Date).getDate(),hours:0|n[0],minutes:0|n[1],seconds:0|n[2]}}),r.elemID="layui-laydate"+o.elem.attr("lay-key"),(o.show||e)&&r.render(),e||r.events(),"function"==typeof o.formatToDisplay&&(r.isInput(o.elem[0])?r.formatToDisplay(o.elem[0],o.formatToDisplay):(t=r.rangeElem)&&(r.formatToDisplay(t[0][0],o.formatToDisplay),r.formatToDisplay(t[1][0],o.formatToDisplay))),o.value)&&o.isInitValue&&("date"===layui.type(o.value)?r.setValue(r.parse(0,r.systemDate(o.value))):r.setValue(o.value))},k.prototype.render=function(){var a,n,i,l,r=this,o=r.config,d=r.lang(),s="static"===o.position,y=r.elem=lay.elem("div",{id:r.elemID,"class":["layui-laydate",o.range?" layui-laydate-range":"",r.rangeLinked?" layui-laydate-linkage":"",s?" "+v:"",o.fullPanel?" laydate-theme-fullpanel":"",(a="",lay.each(o.theme,function(e,t){"default"===t||/^#/.test(t)||(a+=" laydate-theme-"+t)}),a)].join("")}),m=r.elemMain=[],u=r.elemHeader=[],c=r.elemCont=[],h=r.table=[],e=r.footer=lay.elem("div",{"class":"layui-laydate-footer"}),t=r.shortcut=lay.elem("ul",{"class":"layui-laydate-shortcut"}),p=(o.zIndex&&(y.style.zIndex=o.zIndex),lay.each(new Array(2),function(e){if(!o.range&&0'+d.timeTips+""),(o.range||"datetime"!==o.type||o.fullPanel)&&p.push(''),lay.each(o.btns,function(e,t){var a=d.tools[t]||"btn";o.range&&"now"===t||(s&&"clear"===t&&(a="cn"===o.lang?"\u91cd\u7f6e":"Reset"),n.push(''+a+""))}),p.push('"),p.join(""))),o.shortcuts&&(y.appendChild(t),lay(t).html((i=[],lay.each(o.shortcuts,function(e,t){i.push('
                                • '+t.text+"
                                • ")}),i.join(""))).find("li").on("click",function(e){var t=o.shortcuts[this.dataset.index]||{},t=("function"==typeof t.value?t.value():t.value)||[],n=(layui.isArray(t)||(t=[t]),o.type),t=(lay.each(t,function(e,t){var a=[o.dateTime,r.endDate][e];"time"===n&&"date"!==layui.type(t)?r.EXP_IF.test(t)&&(t=(t.match(r.EXP_SPLIT)||[]).slice(1),lay.extend(a,{hours:0|t[0],minutes:0|t[2],seconds:0|t[4]})):lay.extend(a,r.systemDate("date"===layui.type(t)?t:new Date(t))),"time"!==n&&"datetime"!==n||(r[["startTime","endTime"][e]]={hours:a.hours,minutes:a.minutes,seconds:a.seconds}),0===e?r.startDate=lay.extend({},a):r.endState=!0,"year"===n||"month"===n||"time"===n?r.listYM[e]=[a.year,a.month+1]:e&&r.autoCalendarModel.auto&&r.autoCalendarModel()}),r.checkDate("limit").calendar(null,null,"init"),lay(r.footer).find("."+I).removeClass(C));t&&"date"===t.attr("lay-type")&&t[0].click(),r.done(null,"change"),lay(this).addClass(M),"static"!==o.position&&r.setValue(r.parse()).done().remove()})),lay.each(m,function(e,t){y.appendChild(t)}),o.showBottom&&y.appendChild(e),lay.elem("style")),f=[],g=!0,t=(lay.each(o.theme,function(e,t){g&&/^#/.test(t)?(g=!(l=!0),f.push(["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} li.layui-this,#{{id}} td.layui-this>div{background-color:{{theme}} !important;}",-1!==o.theme.indexOf("circle")?"":"#{{id}} .layui-this{background-color:{{theme}} !important;}","#{{id}} .laydate-day-now{color:{{theme}} !important;}","#{{id}} .laydate-day-now:after{border-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,r.elemID).replace(/{{theme}}/g,t))):!g&&/^#/.test(t)&&f.push(["#{{id}} .laydate-selected>div{background-color:{{theme}} !important;}","#{{id}} .laydate-selected:hover>div{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,r.elemID).replace(/{{theme}}/g,t))}),o.shortcuts&&o.range&&f.push("#{{id}}.layui-laydate-range{width: 628px;}".replace(/{{id}}/g,r.elemID)),f.length&&(f=f.join(""),"styleSheet"in p?(p.setAttribute("type","text/css"),p.styleSheet.cssText=f):p.innerHTML=f,l&&lay(y).addClass("laydate-theme-molv"),y.appendChild(p)),r.remove(k.thisElemDate),T.thisId=o.id,s?o.elem.append(y):(D.body.appendChild(y),r.position()),o.shade?'
                                  ':"");y.insertAdjacentHTML("beforebegin",t),r.checkDate().calendar(null,0,"init"),r.changeEvent(),k.thisElemDate=r.elemID,r.renderAdditional(),"function"==typeof o.ready&&o.ready(lay.extend({},o.dateTime,{month:o.dateTime.month+1})),r.preview()},k.prototype.remove=function(e){var t=this,a=t.config,n=lay("#"+(e||t.elemID));return n[0]&&(n.hasClass(v)||t.checkDate(function(){n.remove(),delete t.startDate,delete t.endDate,delete t.endState,delete t.startTime,delete t.endTime,delete T.thisId,"function"==typeof a.close&&a.close(t)}),lay("."+w).remove()),t},k.prototype.position=function(){var e=this.config;return lay.position(e.elem[0],this.elem,{position:e.position}),this},k.prototype.hint=function(e){var t=this,a=(t.config,lay.elem("div",{"class":r}));t.elem&&(a.innerHTML=(e="object"==typeof e?e||{}:{content:e}).content||"",lay(t.elem).find("."+r).remove(),t.elem.appendChild(a),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){lay(t.elem).find("."+r).remove()},"ms"in e?e.ms:3e3))},k.prototype.getAsYM=function(e,t,a){return a?t--:t++,t<0&&(t=11,e--),11h[1]&&(e.year=h[1],o=!0),11t)&&(e.date=t,o=!0)},c=function(n,i,l){var r=["startTime","endTime"];i=(i.match(d.EXP_SPLIT)||[]).slice(1),l=l||0,s.range&&(d[r[l]]=d[r[l]]||{}),lay.each(d.format,function(e,t){var a=parseFloat(i[e]);i[e].lengthd.getDateTime(s.max)?(r=s.dateTime=lay.extend({},s.max),i=!0):d.getDateTime(r)d.getDateTime(s.max))&&(d.endDate=lay.extend({},s.max),i=!0),d.startTime={hours:s.dateTime.hours,minutes:s.dateTime.minutes,seconds:s.dateTime.seconds},d.endTime={hours:d.endDate.hours,minutes:d.endDate.minutes,seconds:d.endDate.seconds},"month"===s.type)&&(s.dateTime.date=1,d.endDate.date=1),i&&m&&(d.setValue(d.parse()),d.hint("value "+l.invalidDate+l.formatError[1])),d.startDate=d.startDate||m&&lay.extend({},s.dateTime),d.autoCalendarModel.auto&&d.autoCalendarModel(),d.endState=!s.range||!d.rangeLinked||!(!d.startDate||!d.endDate),e&&e()),d},k.prototype.markRender=function(e,a,t){var n;"object"==typeof t?lay.each(t||{},function(e,t){e=e.split("-");e[0]!=a[0]&&0!=e[0]||e[1]!=a[1]&&0!=e[1]||e[2]!=a[2]||(n=t||a[2])}):"string"==typeof t&&(n=t||a[2]),n&&e.find("div").html(''+n+"")},k.prototype.mark=function(t,a){var n=this,e=n.config,i=function(e){n.markRender(t,a,e)};return e.calendar&&"cn"===e.lang&&i(n.markerOfChineseFestivals),"function"==typeof e.mark?e.mark({year:a[0],month:a[1],date:a[2]},i):"object"==typeof e.mark&&i(e.mark),n},k.prototype.holidaysRender=function(r,o,e){var d=["holidays","workdays"],s=function(e,t,a){e.find("div").html(["",a,""].join(""))};"array"===layui.type(e)?lay.each(e,function(l,e){lay.each(e,function(e,t){var a,n,i;t=t,a=r.attr("lay-ymd"),n=t.split("-"),i=a.split("-"),lay.each(n,function(e,t){n[e]=parseInt(t,10)}),lay.each(i,function(e,t){i[e]=parseInt(t,10)}),n.join("-")===i.join("-")&&s(r,d[l],o[2])})}):"string"==typeof e&&-1!==d.indexOf(e)&&s(r,e,o[2])},k.prototype.holidays=function(t,a){var n=this,e=n.config,i=function(e){n.holidaysRender(t,a,e)};return"function"==typeof e.holidays?e.holidays({year:a[0],month:a[1],date:a[2]},i):"array"===layui.type(e.holidays)&&i(e.holidays),n},k.prototype.cellRender=function(t,e,a){var n=this.config;return"function"==typeof n.cellRender&&n.cellRender(e,function(e){"string"==typeof e?lay(t).html(e):"object"==typeof e&&lay(t).html("").append(lay(e)[0])},{originElem:t,type:a}),this},k.prototype.startOfYear=function(e){e=new Date(e);return e.setFullYear(e.getFullYear(),0,1),e.setHours(0,0,0,0),e},k.prototype.endOfYear=function(e){var e=new Date(e),t=e.getFullYear();return e.setFullYear(t+1,0,0),e.setHours(23,59,59,999),e},k.prototype.startOfMonth=function(e){e=new Date(e);return e.setDate(1),e.setHours(0,0,0,0),e},k.prototype.endOfMonth=function(e){var e=new Date(e),t=e.getMonth();return e.setFullYear(e.getFullYear(),t+1,0),e.setHours(23,59,59,999),e},k.prototype.addDays=function(e,t){e=new Date(e);return t&&e.setDate(e.getDate()+t),e},k.prototype.isDisabledYearOrMonth=function(e,t,a){for(var n=this,i=n.config,l="year"===t?n.startOfYear(e):n.startOfMonth(e),t="year"===t?n.endOfYear(e):n.endOfMonth(e),r=Math.floor((t.getTime()-l.getTime())/864e5)+1,o=0,d=0;d(t.time?0:41)?i.endDate:e.dateTime;return lay.each({now:lay.extend({},a,t.date||{}),min:e.min,max:e.max},function(e,a){var n;l[e]=i.newDate(lay.extend({year:a.year,month:"year"===t.type?0:a.month,date:"year"===t.type||"month"===t.type?1:a.date},(n={},lay.each(t.time,function(e,t){n[t]=a[t]}),n))).getTime()}),a=l.nowh[1]&&(s.year=h[1],d.hint(y.invalidDate)),d.firstDate||(d.firstDate=lay.extend({},s)),n.setFullYear(s.year,s.month,1),l=(n.getDay()+(7-a.weekStart))%7,r=T.getEndDate(s.month||12,s.year),o=T.getEndDate(s.month+1,s.year),lay.each(u,function(e,t){var a,n=[s.year,s.month];(t=lay(t)).removeAttr("class"),e"+n[2]+"
                                  "),d.mark(t,n).holidays(t,n).limit({elem:t,date:{year:n[0],month:n[1]-1,date:n[2]},index:e,rangeType:i,disabledType:"date"}),d.cellRender(t,{year:n[0],month:n[1],date:n[2]},"date")}),lay(c[0]).attr("lay-ym",s.year+"-"+(s.month+1)),lay(c[1]).attr("lay-ym",s.year+"-"+(s.month+1)),d.panelYM||(d.panelYM={}),d.panelYM[i]={year:s.year,month:s.month},"cn"===a.lang?(lay(c[0]).attr("lay-type","year").html(s.year+" \u5e74"),lay(c[1]).attr("lay-type","month").html(s.month+1+" \u6708")):(lay(c[0]).attr("lay-type","month").html(y.month[s.month]),lay(c[1]).attr("lay-type","year").html(s.year)),m&&(a.range?!e&&"init"===t||(d.listYM=[[(d.startDate||a.dateTime).year,(d.startDate||a.dateTime).month+1],[d.endDate.year,d.endDate.month+1]],d.list(a.type,0).list(a.type,1),"time"===a.type?d.setBtnStatus("\u65f6\u95f4",lay.extend({},d.systemDate(),d.startTime),lay.extend({},d.systemDate(),d.endTime)):d.setBtnStatus(!0)):(d.listYM=[[s.year,s.month+1]],d.list(a.type,0))),a.range&&"init"===t&&(d.rangeLinked?(n=d.getAsYM(s.year,s.month,i?"sub":null),d.calendar(lay.extend({},s,{year:n[0],month:n[1]}),1-i)):d.calendar(null,1-i)),a.range||(u=["hours","minutes","seconds"],d.limit({elem:lay(d.footer).find(".laydate-btns-now"),date:d.systemDate(/^(datetime|time)$/.test(a.type)?new Date:null),index:0,time:u,disabledType:"datetime"}),d.limit({elem:lay(d.footer).find(E),index:0,time:u,disabledType:"datetime"})),d.setBtnStatus(),lay(d.shortcut).find("li."+M).removeClass(M),a.range&&!m&&"init"!==t&&d.stampRange(),d},k.prototype.list=function(n,i){var l,r,e,a,o,d,t,s=this,y=s.config,m=s.rangeLinked?y.dateTime:[y.dateTime,s.endDate][i],u=s.lang(),c=y.range&&"date"!==y.type&&"datetime"!==y.type,h=lay.elem("ul",{"class":b+" "+{year:"laydate-year-list",month:"laydate-month-list",time:"laydate-time-list"}[n]}),p=s.elemHeader[i],f=lay(p[2]).find("span"),g=s.elemCont[i||0],D=lay(g).find("."+b)[0],T="cn"===y.lang,v=T?"\u5e74":"",x=s.listYM[i]||{},w=["hours","minutes","seconds"],k=["startTime","endTime"][i];return x[0]<1&&(x[0]=1),"year"===n?(e=l=x[0]-7,l<1&&(e=l=1),lay.each(new Array(15),function(e){var t=lay.elem("li",{"lay-ym":l}),a={year:l,month:0,date:1};l==x[0]&&lay(t).addClass(M),t.innerHTML=l+v,h.appendChild(t),s.limit({elem:lay(t),date:a,index:i,type:n,rangeType:i,disabledType:"date"}),s.cellRender(t,{year:l,month:1,date:1},"year"),l++}),lay(f[T?0:1]).attr("lay-ym",l-8+"-"+x[1]).html(e+v+" - "+(l-1)+v)):"month"===n?(lay.each(new Array(12),function(e){var t=lay.elem("li",{"lay-ym":e}),a={year:x[0],month:e,date:1};e+1==x[1]&&lay(t).addClass(M),t.innerHTML=u.month[e]+(T?"\u6708":""),h.appendChild(t),s.limit({elem:lay(t),date:a,index:i,type:n,rangeType:i,disabledType:"date"}),s.cellRender(t,{year:x[0],month:e+1,date:1},"month")}),lay(f[T?0:1]).attr("lay-ym",x[0]+"-"+x[1]).html(x[0]+v)):"time"===n&&(r=function(){lay(h).find("ol").each(function(a,e){lay(e).find("li").each(function(e,t){s.limit({elem:lay(t),date:[{hours:e},{hours:s[k].hours,minutes:e},{hours:s[k].hours,minutes:s[k].minutes,seconds:e}][a],index:i,rangeType:i,disabledType:"time",time:[["hours"],["hours","minutes"],["hours","minutes","seconds"]][a]})})}),y.range||s.limit({elem:lay(s.footer).find(E),date:s[k],index:0,time:["hours","minutes","seconds"],disabledType:"datetime"})},y.range?s[k]||(s[k]="startTime"===k?m:s.endDate):s[k]=m,lay.each([24,60,60],function(t,e){var a=lay.elem("li"),n=["

                                  "+u.time[t]+"

                                    "];lay.each(new Array(e),function(e){n.push(""+lay.digit(e,2)+"")}),a.innerHTML=n.join("")+"
                                  ",h.appendChild(a)}),r(),e=-1!==y.format.indexOf("H"),f=-1!==y.format.indexOf("m"),t=-1!==y.format.indexOf("s"),a=h.children,o=0,lay.each([e,f,t],function(e,t){t||(a[e].className+=" layui-hide",o++)}),h.className+=" laydate-time-list-hide-"+o),D&&g.removeChild(D),g.appendChild(h),"year"===n||"month"===n?(lay(s.elemMain[i]).addClass("laydate-ym-show"),lay(h).find("li").on("click",function(){var e,t,a=0|lay(this).attr("lay-ym");lay(this).hasClass(C)||(s.rangeLinked?lay.extend(m,{year:"year"===n?a:x[0],month:"year"===n?x[1]-1:a}):m[n]=a,e=-1!==["year","month"].indexOf(y.type),t="year"===n&&-1!==["date","datetime"].indexOf(y.type),e||t?(lay(h).find("."+M).removeClass(M),lay(this).addClass(M),("month"===y.type&&"year"===n||t)&&(s.listYM[i][0]=a,c&&((i?s.endDate:m).year=a),s.list("month",i))):(s.checkDate("limit").calendar(m,i,"init"),s.closeList()),s.setBtnStatus(),!y.range&&y.autoConfirm&&("month"===y.type&&"month"===n||"year"===y.type&&"year"===n)&&s.setValue(s.parse()).done().remove(),s.autoCalendarModel.auto&&!s.rangeLinked?s.choose(lay(g).find("td.layui-this"),i):s.endState&&s.done(null,"change"),lay(s.footer).find("."+I).removeClass(C))})):(f=lay.elem("span",{"class":L}),d=function(){lay(h).find("ol").each(function(e){var a=this,t=lay(a).find("li");a.scrollTop=30*(s[k][w[e]]-2),a.scrollTop<=0&&t.each(function(e,t){if(!lay(this).hasClass(C))return a.scrollTop=30*(e-2),!0})})},t=lay(p[2]).find("."+L),d(),f.innerHTML=y.range?[u.startTime,u.endTime][i]:u.timeTips,lay(s.elemMain[i]).addClass("laydate-time-show"),t[0]&&t.remove(),p[2].appendChild(f),(D=lay(h).find("ol")).each(function(t){var a=this;lay(a).find("li").on("click",function(){var e=0|this.innerHTML;lay(this).hasClass(C)||(y.range?s[k][w[t]]=e:m[w[t]]=e,lay(a).find("."+M).removeClass(M),lay(this).addClass(M),r(),d(),!s.endDate&&"time"!==y.type&&"datetime"!==y.type||s.done(null,"change"),s.setBtnStatus())})}),layui.device().mobile&&D.css({overflowY:"auto",touchAction:"pan-y"})),s},k.prototype.listYM=[],k.prototype.closeList=function(){var a=this;a.config;lay.each(a.elemCont,function(e,t){lay(this).find("."+b).remove(),lay(a.elemMain[e]).removeClass("laydate-ym-show laydate-time-show")}),lay(a.elem).find("."+L).remove()},k.prototype.setBtnStatus=function(e,t,a){var n=this,i=n.config,l=n.lang(),r=lay(n.footer).find(E),o="datetime"===i.type||"time"===i.type?["hours","minutes","seconds"]:undefined;i.range&&(t=t||(n.rangeLinked?n.startDate:i.dateTime),a=a||n.endDate,i=!n.endState||n.newDate(t).getTime()>n.newDate(a).getTime(),n.limit({date:t,disabledType:"datetime",time:o,rangeType:0})||n.limit({date:a,disabledType:"datetime",time:o,rangeType:1})?r.addClass(C):r[i?"addClass":"removeClass"](C),e)&&i&&n.hint("string"==typeof e?l.timeout.replace(/\u65e5\u671f/g,e):l.timeout)},k.prototype.parse=function(e,t){var a=this,n=a.config,i=a.rangeLinked?a.startDate:n.dateTime,t=t||("end"==e?lay.extend({},a.endDate,a.endTime):n.range?lay.extend({},i||n.dateTime,a.startTime):n.dateTime),i=T.parse(t,a.format,1);return n.range&&e===undefined?i+" "+a.rangeStr+" "+a.parse("end"):i},k.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},k.prototype.getDateTime=function(e){return this.newDate(e).getTime()},k.prototype.formatToDisplay=function(e,t){var a=this,n=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,"value");Object.defineProperty(e,"value",lay.extend({},n,{get:function(){return this.getAttribute("lay-date")},set:function(e){n.set.call(this,t.call(a,e)),this.setAttribute("lay-date",e)}}))},k.prototype.setValue=function(e){var t,a=this,n=a.config,i=n.elem[0];return"static"!==n.position&&(e=e||"",a.isInput(i)?lay(i).val(e):(t=a.rangeElem)?("array"!==layui.type(e)&&(e=e.split(" "+a.rangeStr+" ")),t[0].val(e[0]||""),t[1].val(e[1]||"")):(0===lay(i).find("*").length&&(t="function"==typeof n.formatToDisplay?n.formatToDisplay(e):e,lay(i).html(t)),lay(i).attr("lay-date",e))),a},k.prototype.preview=function(){var e,t=this,a=t.config;a.isPreview&&(e=lay(t.elem).find("."+x),a=!a.range||(t.rangeLinked?t.endState:t.endDate)?t.parse():"",e.html(a),e.html())&&(e.css({color:"#16b777"}),setTimeout(function(){e.css({color:"#777"})},300))},k.prototype.renderAdditional=function(){this.config.fullPanel&&this.list("time",0)},k.prototype.stampRange=function(){var n,i=this,l=i.config,r=i.rangeLinked?i.startDate:l.dateTime,e=lay(i.elem).find("td");l.range&&!i.endState&&lay(i.footer).find(E).addClass(C),r=r&&i.newDate({year:r.year,month:r.month,date:r.date}).getTime(),n=i.endState&&i.endDate&&i.newDate({year:i.endDate.year,month:i.endDate.month,date:i.endDate.date}).getTime(),lay.each(e,function(e,t){var a=lay(t).attr("lay-ymd").split("-"),a=i.newDate({year:a[0],month:a[1]-1,date:a[2]}).getTime();l.rangeLinked&&!i.startDate&&a===i.newDate(i.systemDate()).getTime()&&lay(t).addClass(lay(t).hasClass(y)||lay(t).hasClass(m)?"":"laydate-day-now"),lay(t).removeClass(o+" "+M),a!==r&&a!==n||(i.rangeLinked||!i.rangeLinked&&(e<42?a===r:a===n))&&lay(t).addClass(lay(t).hasClass(y)||lay(t).hasClass(m)?o:M),rn.getDateTime(i.max)&&(n[t]={hours:i.max.hours,minutes:i.max.minutes,seconds:i.max.seconds},lay.extend(l,n[t])))}),a||(n.startDate=lay.extend({},l)),n.endState&&!n.limit({date:n.rangeLinked?n.startDate:n.thisDateTime(1-a),disabledType:"date"})&&(((r=n.endState&&n.autoCalendarModel.auto?n.autoCalendarModel():r)||n.rangeLinked&&n.endState)&&n.newDate(n.startDate)>n.newDate(n.endDate)&&(n.startDate.year===n.endDate.year&&n.startDate.month===n.endDate.month&&n.startDate.date===n.endDate.date&&(o=n.startTime,n.startTime=n.endTime,n.endTime=o),o=n.startDate,n.startDate=lay.extend({},n.endDate,n.startTime),i.dateTime=lay.extend({},n.startDate),n.endDate=lay.extend({},o,n.endTime)),r)&&(i.dateTime=lay.extend({},n.startDate)),n.rangeLinked?(e=n.checkPanelDate(l,t),o=lay.extend({},l),d=r||e&&e.needFullRender?"init":null,e=e?e.index:t,n.calendar(o,e,d)):n.calendar(null,a,r?"init":null),n.endState&&n.done(null,"change")):"static"===i.position?n.calendar().done().done(null,"change"):"date"===i.type?i.autoConfirm?n.setValue(n.parse()).done().remove():n.calendar().done(null,"change"):"datetime"===i.type&&n.calendar().done(null,"change"))},k.prototype.tool=function(t,e){var a=this,n=a.config,i=a.lang(),l=n.dateTime,r="static"===n.position,o={datetime:function(){lay(t).hasClass(C)||(a.list("time",0),n.range&&a.list("time",1),lay(t).attr("lay-type","date").html(a.lang().dateTips))},date:function(){a.closeList(),lay(t).attr("lay-type","datetime").html(a.lang().timeTips)},clear:function(){r&&(lay.extend(l,a.firstDate),a.calendar()),n.range&&(delete n.dateTime,delete a.endDate,delete a.startTime,delete a.endTime),a.setValue(""),a.done(null,"onClear").done(["",{},{}]).remove()},now:function(){var e=new Date;if(lay(t).hasClass(C))return a.hint(i.tools.now+", "+i.invalidDate);lay.extend(l,a.systemDate(),{hours:e.getHours(),minutes:e.getMinutes(),seconds:e.getSeconds()}),a.setValue(a.parse()),r&&a.calendar(),a.done(null,"onNow").done().remove()},confirm:function(){if(n.range){if(lay(t).hasClass(C))return("time"===n.type?a.startTime&&a.endTime&&a.newDate(a.startTime)>a.newDate(a.endTime):a.startDate&&a.endDate&&a.newDate(lay.extend({},a.startDate,a.startTime||{}))>a.newDate(lay.extend({},a.endDate,a.endTime||{})))?a.hint("time"===n.type?i.timeout.replace(/\u65e5\u671f/g,"\u65f6\u95f4"):i.timeout):a.hint(i.invalidDate)}else if(lay(t).hasClass(C))return a.hint(i.invalidDate);a.setValue(a.parse()),a.done(null,"onConfirm").done().remove()}};o[e]&&o[e]()},k.prototype.change=function(n){var i=this,l=i.config,r=i.thisDateTime(n),o=l.range&&("year"===l.type||"month"===l.type),d=i.elemCont[n||0],s=i.listYM[n],e=function(e){var t=lay(d).find(".laydate-year-list")[0],a=lay(d).find(".laydate-month-list")[0];return t&&(s[0]=e?s[0]-15:s[0]+15,i.list("year",n)),a&&(e?s[0]--:s[0]++,i.list("month",n)),(t||a)&&(lay.extend(r,{year:s[0]}),o&&(r.year=s[0]),l.range||i.done(null,"change"),l.range||i.limit({elem:lay(i.footer).find(E),date:{year:s[0]},disabledType:"datetime"})),i.setBtnStatus(),t||a};return{prevYear:function(){e("sub")||(i.rangeLinked?(l.dateTime.year--,i.checkDate("limit").calendar(null,null,"init")):(r.year--,i.checkDate("limit").calendar(null,n),i.autoCalendarModel.auto?i.choose(lay(d).find("td.layui-this"),n):i.done(null,"change")))},prevMonth:function(){var e,t;i.rangeLinked?(t=i.panelYM[0],t=i.getAsYM(t.year,t.month,"sub"),e=lay.extend({},l.dateTime,i.panelYM[0],{year:t[0],month:t[1]}),i.checkDate("limit").calendar(e,null,"init")):(t=i.getAsYM(r.year,r.month,"sub"),lay.extend(r,{year:t[0],month:t[1]}),i.checkDate("limit").calendar(null,null,"init"),i.autoCalendarModel.auto?i.choose(lay(d).find("td.layui-this"),n):i.done(null,"change"))},nextMonth:function(){var e,t;i.rangeLinked?(t=i.panelYM[0],t=i.getAsYM(t.year,t.month),e=lay.extend({},l.dateTime,i.panelYM[0],{year:t[0],month:t[1]}),i.checkDate("limit").calendar(e,null,"init")):(t=i.getAsYM(r.year,r.month),lay.extend(r,{year:t[0],month:t[1]}),i.checkDate("limit").calendar(null,null,"init"),i.autoCalendarModel.auto?i.choose(lay(d).find("td.layui-this"),n):i.done(null,"change"))},nextYear:function(){e()||(i.rangeLinked?(l.dateTime.year++,i.checkDate("limit").calendar(null,0,"init")):(r.year++,i.checkDate("limit").calendar(null,n),i.autoCalendarModel.auto?i.choose(lay(d).find("td.layui-this"),n):i.done(null,"change")))}}},k.prototype.changeEvent=function(){var i=this;i.config;lay(i.elem).on("click",function(e){lay.stope(e)}).on("mousedown",function(e){lay.stope(e)}),lay.each(i.elemHeader,function(n,e){lay(e[0]).on("click",function(e){i.change(n).prevYear()}),lay(e[1]).on("click",function(e){i.change(n).prevMonth()}),lay(e[2]).find("span").on("click",function(e){var t=lay(this),a=t.attr("lay-ym"),t=t.attr("lay-type");a&&(a=a.split("-"),i.listYM[n]=[0|a[0],0|a[1]],i.list(t,n),lay(i.footer).find("."+I).addClass(C))}),lay(e[3]).on("click",function(e){i.change(n).nextMonth()}),lay(e[4]).on("click",function(e){i.change(n).nextYear()})}),lay.each(i.table,function(e,t){lay(t).find("td").on("click",function(){i.choose(lay(this),e)})}),lay(i.footer).find("span").on("click",function(){var e=lay(this).attr("lay-type");i.tool(this,e)})},k.prototype.isInput=function(e){return/input|textarea/.test(e.tagName.toLocaleLowerCase())||/INPUT|TEXTAREA/.test(e.tagName)},k.prototype.events=function(){var e,t=this,a=t.config;a.elem[0]&&!a.elem[0].eventHandler&&(a.elem.on(a.trigger,e=function(){T.thisId!==a.id&&t.render()}),a.elem[0].eventHandler=!0,a.eventElem.on(a.trigger,e),t.unbind=function(){t.remove(),a.elem.off(a.trigger,e),a.elem.removeAttr("lay-key"),a.elem.removeAttr(d),a.elem[0].eventHandler=!1,a.eventElem.off(a.trigger,e),a.eventElem.removeAttr("lay-key"),delete s.that[a.id]})},s.that={},s.getThis=function(e){var t=s.that[e];return!t&&n&&layui.hint().error(e?a+" instance with ID '"+e+"' not found":"ID argument required"),t},l.run=function(n){n(D).on("mousedown",function(e){var t,a;T.thisId&&(t=s.getThis(T.thisId))&&(a=t.config,e.target===a.elem[0]||e.target===a.eventElem[0]||e.target===n(a.closeStop)[0]||a.elem[0]&&a.elem[0].contains(e.target)||t.remove())}).on("keydown",function(e){var t;T.thisId&&(t=s.getThis(T.thisId))&&"static"!==t.config.position&&13===e.keyCode&&n("#"+t.elemID)[0]&&t.elemID===k.thisElemDate&&(e.preventDefault(),n(t.footer).find(E)[0].click())}),n(i).on("resize",function(){if(T.thisId){var e=s.getThis(T.thisId);if(e)return!(!e.elem||!n(".layui-laydate")[0])&&void e.position()}})},T.render=function(e){e=new k(e);return s.call(e)},T.reload=function(e,t){e=s.getThis(e);if(e)return e.reload(t)},T.getInst=function(e){e=s.getThis(e);if(e)return e.inst},T.hint=function(e,t){e=s.getThis(e);if(e)return e.hint(t)},T.unbind=function(e){e=s.getThis(e);if(e)return e.unbind()},T.close=function(e){e=s.getThis(e||T.thisId);if(e)return e.remove()},T.parse=function(a,n,i){return a=a||{},n=((n="string"==typeof n?s.formatArr(n):n)||[]).concat(),lay.each(n,function(e,t){/yyyy|y/.test(t)?n[e]=lay.digit(a.year,t.length):/MM|M/.test(t)?n[e]=lay.digit(a.month+(i||0),t.length):/dd|d/.test(t)?n[e]=lay.digit(a.date,t.length):/HH|H/.test(t)?n[e]=lay.digit(a.hours,t.length):/mm|m/.test(t)?n[e]=lay.digit(a.minutes,t.length):/ss|s/.test(t)&&(n[e]=lay.digit(a.seconds,t.length))}),n.join("")},T.getEndDate=function(e,t){var a=new Date;return a.setFullYear(t||a.getFullYear(),e||a.getMonth()+1,1),new Date(a.getTime()-864e5).getDate()},n?(T.ready(),layui.define("lay",function(e){T.path=layui.cache.dir,l.run(lay),e(a,T)})):"function"==typeof define&&define.amd?define(function(){return l.run(lay),T}):(T.ready(),l.run(i.lay),i.laydate=T)}(window,window.document);!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e):function(e){if(e.document)return t(e);throw new Error("jQuery requires a window with a document")}:t(e)}("undefined"!=typeof window?window:this,function(T,M){"use strict";var t=[],R=Object.getPrototypeOf,a=t.slice,I=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},W=t.push,b=t.indexOf,F={},$=F.toString,B=F.hasOwnProperty,_=B.toString,z=_.call(Object),g={},v=function v(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},X=function X(e){return null!=e&&e===e.window},C=T.document,U={type:!0,src:!0,nonce:!0,noModule:!0};function V(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in U)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function G(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?F[$.call(e)]||"object":typeof e}var e="3.7.1",Y=/HTML$/i,S=function(e,t){return new S.fn.init(e,t)};function J(e){var t=!!e&&"length"in e&&e.length,n=G(e);return!v(e)&&!X(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+n+")"+n+"*"),xe=new RegExp(n+"|>"),be=new RegExp(s),we=new RegExp("^"+e+"$"),Te={ID:new RegExp("^#("+e+")"),CLASS:new RegExp("^\\.("+e+")"),TAG:new RegExp("^("+e+"|[*])"),ATTR:new RegExp("^"+o),PSEUDO:new RegExp("^"+s),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+n+"*(even|odd|(([+-]|)(\\d*)n|)"+n+"*(?:([+-]|)"+n+"*(\\d+)|))"+n+"*\\)|)","i"),bool:new RegExp("^(?:"+ge+")$","i"),needsContext:new RegExp("^"+n+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+n+"*((?:-\\d)?\\d*)"+n+"*\\)|)(?=[^-]|$)","i")},Ce=/^(?:input|select|textarea|button)$/i,Se=/^h\d$/i,Ee=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ke=/[+~]/,f=new RegExp("\\\\[\\da-fA-F]{1,6}"+n+"?|\\\\([^\\r\\n\\f])","g"),d=function(e,t){e="0x"+e.slice(1)-65536;return t||(e<0?String.fromCharCode(65536+e):String.fromCharCode(e>>10|55296,1023&e|56320))},je=function(){Oe()},Ae=Ie(function(e){return!0===e.disabled&&x(e,"fieldset")},{dir:"parentNode",next:"legend"});try{j.apply(t=a.call(i.childNodes),i.childNodes),t[i.childNodes.length].nodeType}catch(sr){j={apply:function(e,t){ue.apply(e,a.call(t))},call:function(e){ue.apply(e,a.call(arguments,1))}}}function N(e,t,n,r){var i,o,s,a,u,l,c=t&&t.ownerDocument,f=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==f&&9!==f&&11!==f)return n;if(!r&&(Oe(t),t=t||E,k)){if(11!==f&&(a=Ee.exec(e)))if(i=a[1]){if(9===f){if(!(l=t.getElementById(i)))return n;if(l.id===i)return j.call(n,l),n}else if(c&&(l=c.getElementById(i))&&N.contains(t,l)&&l.id===i)return j.call(n,l),n}else{if(a[2])return j.apply(n,t.getElementsByTagName(e)),n;if((i=a[3])&&t.getElementsByClassName)return j.apply(n,t.getElementsByClassName(i)),n}if(!(pe[e+" "]||p&&p.test(e))){if(l=e,c=t,1===f&&(xe.test(e)||ve.test(e))){for((c=ke.test(e)&&He(t.parentNode)||t)==t&&g.scope||((s=t.getAttribute("id"))?s=S.escapeSelector(s):t.setAttribute("id",s=A)),o=(u=Me(e)).length;o--;)u[o]=(s?"#"+s:":scope")+" "+Re(u[o]);l=u.join(",")}try{return j.apply(n,c.querySelectorAll(l)),n}catch(d){pe(e,!0)}finally{s===A&&t.removeAttribute("id")}}}return _e(e.replace(ee,"$1"),t,n,r)}function De(){var n=[];function r(e,t){return n.push(e+" ")>w.cacheLength&&delete r[n.shift()],r[e+" "]=t}return r}function u(e){return e[A]=!0,e}function Ne(e){var t=E.createElement("fieldset");try{return!!e(t)}catch(sr){return!1}finally{t.parentNode&&t.parentNode.removeChild(t)}}function qe(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function Le(s){return u(function(o){return o=+o,u(function(e,t){for(var n,r=s([],e.length,o),i=r.length;i--;)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function He(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function Oe(e){var e=e?e.ownerDocument||e:i;return e!=E&&9===e.nodeType&&e.documentElement&&(r=(E=e).documentElement,k=!S.isXMLDoc(E),ae=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&i!=E&&(e=E.defaultView)&&e.top!==e&&e.addEventListener("unload",je),g.getById=Ne(function(e){return r.appendChild(e).id=S.expando,!E.getElementsByName||!E.getElementsByName(S.expando).length}),g.disconnectedMatch=Ne(function(e){return ae.call(e,"*")}),g.scope=Ne(function(){return E.querySelectorAll(":scope")}),g.cssHas=Ne(function(){try{E.querySelector(":has(*,:jqfake)")}catch(sr){return 1}}),g.getById?(w.filter.ID=function(e){var t=e.replace(f,d);return function(e){return e.getAttribute("id")===t}},w.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&k)return(e=t.getElementById(e))?[e]:[]}):(w.filter.ID=function(e){var t=e.replace(f,d);return function(e){e="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return e&&e.value===t}},w.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&k){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];for(i=t.getElementsByName(e),r=0;o=i[r++];)if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),w.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},w.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&k)return t.getElementsByClassName(e)},p=[],Ne(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||p.push("\\["+n+"*(?:value|"+ge+")"),e.querySelectorAll("[id~="+A+"-]").length||p.push("~="),e.querySelectorAll("a#"+A+"+*").length||p.push(".#.+[+~]"),e.querySelectorAll(":checked").length||p.push(":checked"),(t=E.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&p.push(":enabled",":disabled"),(t=E.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||p.push("\\["+n+"*name"+n+"*="+n+"*(?:''|\"\")")}),g.cssHas||p.push(":has"),p=p.length&&new RegExp(p.join("|")),he=function(e,t){var n;return e===t?(se=!0,0):(n=!e.compareDocumentPosition-!t.compareDocumentPosition)||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!g.sortDetached&&t.compareDocumentPosition(e)===n?e===E||e.ownerDocument==i&&N.contains(i,e)?-1:t===E||t.ownerDocument==i&&N.contains(i,t)?1:oe?b.call(oe,e)-b.call(oe,t):0:4&n?-1:1)}),E}for(re in N.matches=function(e,t){return N(e,null,null,t)},N.matchesSelector=function(e,t){if(Oe(e),k&&!pe[t+" "]&&(!p||!p.test(t)))try{var n=ae.call(e,t);if(n||g.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(sr){pe(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(f,d),e[3]=(e[3]||e[4]||e[5]||"").replace(f,d),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||N.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&N.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return Te.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&be.test(n)&&(t=(t=Me(n,!0))&&n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(f,d).toLowerCase();return"*"===e?function(){return!0}:function(e){return x(e,t)}},CLASS:function(e){var t=ce[e+" "];return t||(t=new RegExp("(^|"+n+")"+e+"("+n+"|$)"))&&ce(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(t,n,r){return function(e){e=N.attr(e,t);return null==e?"!="===n:!n||(e+="","="===n?e===r:"!="===n?e!==r:"^="===n?r&&0===e.indexOf(r):"*="===n?r&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function Ge(e,n,r){return v(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/,Ke=((S.fn.init=function(e,t,n){if(e){if(n=n||Ye,"string"!=typeof e)return e.nodeType?(this[0]=e,this.length=1,this):v(e)?n.ready!==undefined?n.ready(e):e(S):S.makeArray(e,this);if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:Je.exec(e))||!r[1]&&t)return(!t||t.jquery?t||n:this.constructor(t)).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),Ve.test(r[1])&&S.isPlainObject(t))for(var r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r])}else(n=C.getElementById(r[2]))&&(this[0]=n,this.length=1)}return this}).prototype=S.fn,Ye=S(C),/^(?:parents|prev(?:Until|All))/),Qe={children:!0,contents:!0,next:!0,prev:!0};function Ze(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Et=/^$|^module$|\/(?:java|ecma)script/i,h=(o=C.createDocumentFragment().appendChild(C.createElement("div")),(s=C.createElement("input")).setAttribute("type","radio"),s.setAttribute("checked","checked"),s.setAttribute("name","t"),o.appendChild(s),g.checkClone=o.cloneNode(!0).cloneNode(!0).lastChild.checked,o.innerHTML="",g.noCloneChecked=!!o.cloneNode(!0).lastChild.defaultValue,o.innerHTML="",g.option=!!o.lastChild,{thead:[1,"","
                                  "],col:[2,"","
                                  "],tr:[2,"","
                                  "],td:[3,"","
                                  "],_default:[0,"",""]});function y(e,t){var n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[];return t===undefined||t&&x(e,t)?S.merge([e],n):n}function kt(e,t){for(var n=0,r=e.length;n",""]);var jt=/<|&#?\w+;/;function At(e,t,n,r,i){for(var o,s,a,u,l,c=t.createDocumentFragment(),f=[],d=0,p=e.length;d\s*$/g;function Rt(e,t){return x(e,"table")&&x(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function It(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Wt(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Ft(e,t){var n,r,i,o;if(1===t.nodeType){if(m.hasData(e)&&(o=m.get(e).events))for(i in m.remove(t,"handle events"),o)for(n=0,r=o[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}}),[]),ir=/(=)\?(?=&|$)|\?\?/,or=(S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=rr.pop()||S.expando+"_"+Hn.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,s=!1!==e.jsonp&&(ir.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&ir.test(e.data)&&"data");if(s||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,s?e[s]=e[s].replace(ir,"$1"+r):!1!==e.jsonp&&(e.url+=(On.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=T[r],T[r]=function(){o=arguments},n.always(function(){i===undefined?S(T).removeProp(r):T[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,rr.push(r)),o&&v(i)&&i(o[0]),o=i=undefined}),"script"}),g.createHTMLDocument=((e=C.implementation.createHTMLDocument("").body).innerHTML="
                                  ",2===e.childNodes.length),S.parseHTML=function(e,t,n){var r;return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(g.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),r=!n&&[],(n=Ve.exec(e))?[t.createElement(n[1])]:(n=At([e],t,r),r&&r.length&&S(r).remove(),S.merge([],n.childNodes)))},S.fn.load=function(e,t,n){var r,i,o,s=this,a=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){s.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,s,a=S.css(e,"position"),u=S(e),l={};"static"===a&&(e.style.position="relative"),o=u.offset(),r=S.css(e,"top"),s=S.css(e,"left"),a=("absolute"===a||"fixed"===a)&&-1<(r+s).indexOf("auto")?(i=(a=u.position()).top,a.left):(i=parseFloat(r)||0,parseFloat(s)||0),null!=(t=v(t)?t.call(e,n,S.extend({},o)):t).top&&(l.top=t.top-o.top+i),null!=t.left&&(l.left=t.left-o.left+a),"using"in t?t.using.call(e,l):u.css(l)}},S.fn.extend({offset:function(t){var e,n;return arguments.length?t===undefined?this:this.each(function(e){S.offset.setOffset(this,t,e)}):(n=this[0])?n.getClientRects().length?(e=n.getBoundingClientRect(),n=n.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{for(t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position");)e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===S.css(e,"position");)e=e.offsetParent;return e||yt})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return c(this,function(e,t,n){var r;if(X(e)?r=e:9===e.nodeType&&(r=e.defaultView),n===undefined)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=on(g.pixelPosition,function(e,t){if(t)return t=rn(e,n),Jt.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(s,a){S.each({padding:"inner"+s,content:a,"":"outer"+s},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return c(this,function(e,t,n){var r;return X(e)?0===o.indexOf("outer")?e["inner"+s]:e.document.documentElement["client"+s]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+s],r["scroll"+s],e.body["offset"+s],r["offset"+s],r["client"+s])):n===undefined?S.css(e,t,i):S.style(e,t,n,i)},a,n?e:undefined,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0'+(s?a.title[0]:a.title)+"
                                  ":"";return a.zIndex=o,t([a.shade?'
                                  ':"",'
                                  '+(e&&2!=a.type?"":s)+"'+(n=["layui-icon-tips","layui-icon-success","layui-icon-error","layui-icon-question","layui-icon-lock","layui-icon-face-cry","layui-icon-face-smile"],o="layui-anim layui-anim-rotate layui-anim-loop",0==a.type&&-1!==a.icon?'':3==a.type?(i=["layui-icon-loading","layui-icon-loading-1"],2==a.icon?'
                                  ':''):"")+((1!=a.type||!e)&&a.content||"")+'
                                  '+(n=[],r&&(n.push(''),n.push('')),a.closeBtn&&n.push(''),n.join(""))+"
                                  "+(a.btn?function(){var e="";"string"==typeof a.btn&&(a.btn=[a.btn]);for(var t,i=0,n=a.btn.length;i'+a.btn[i]+"";return'
                                  '+e+"
                                  "}():"")+(a.resize?'':"")+"
                                  "],s,h('
                                  ')),this},t.pt.creat=function(){var e,t,i,n,a=this,o=a.config,s=a.index,r="object"==typeof(d=o.content),l=h("body"),c=function(e){var t;o.shift&&(o.anim=o.shift),u.anim[o.anim]&&(t="layer-anim "+u.anim[o.anim],e.addClass(t).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){h(this).removeClass(t)}))};if(o.id&&h("."+u[0]).find("#"+o.id)[0])e=h("#"+o.id).closest("."+u[0]),t=e.attr("times"),i=e.data("config"),n=h("#"+u.SHADE+t),"min"===(e.data("maxminStatus")||{})?v.restore(t):i.hideOnClose&&(n.show(),e.show(),c(e),setTimeout(function(){n.css({opacity:n.data(y)})},10));else{switch(o.removeFocus&&document.activeElement&&document.activeElement.blur(),"string"==typeof o.area&&(o.area="auto"===o.area?["",""]:[o.area,""]),6==v.ie&&(o.fixed=!1),o.type){case 0:o.btn="btn"in o?o.btn:f.btn[0],v.closeAll("dialog");break;case 2:var d=o.content=r?o.content:[o.content||"","auto"];o.content='';break;case 3:delete o.title,delete o.closeBtn,-1===o.icon&&o.icon,v.closeAll("loading");break;case 4:r||(o.content=[o.content,"body"]),o.follow=o.content[1],o.content=o.content[0]+'',delete o.title,o.tips="object"==typeof o.tips?o.tips:[o.tips,!0],o.tipsMore||v.closeAll("tips")}a.vessel(r,function(e,t,i){l.append(e[0]),r?2==o.type||4==o.type?h("body").append(e[1]):d.parents("."+u[0])[0]||(d.data("display",d.css("display")).show().addClass("layui-layer-wrap").wrap(e[1]),h("#"+u[0]+s).find("."+u[5]).before(t)):l.append(e[1]),h("#"+u.MOVE)[0]||l.append(f.moveElem=i),a.layero=h("#"+u[0]+s),a.shadeo=h("#"+u.SHADE+s),o.scrollbar||f.setScrollbar(s)}).auto(s),a.shadeo.css({"background-color":o.shade[1]||"#000",opacity:o.shade[0]||o.shade,transition:o.shade[2]||""}),a.shadeo.data(y,o.shade[0]||o.shade),2==o.type&&6==v.ie&&a.layero.find("iframe").attr("src",d[0]),4==o.type?a.tips():(a.offset(),parseInt(f.getStyle(document.getElementById(u.MOVE),"z-index"))||(a.layero.css("visibility","hidden"),v.ready(function(){a.offset(),a.layero.css("visibility","visible")}))),!o.fixed||f.events.resize[a.index]||(f.events.resize[a.index]=function(){a.resize()},g.on("resize",f.events.resize[a.index])),a.layero.data("config",o),o.time<=0||setTimeout(function(){v.close(a.index)},o.time),a.move().callback(),c(a.layero)}},t.pt.resize=function(){var e=this,t=e.config;e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(e.index),4==t.type&&e.tips()},t.pt.auto=function(e){var t=this.config,i=h("#"+u[0]+e),n=((""===t.area[0]||"auto"===t.area[0])&&0t.maxWidth)&&i.width(t.maxWidth),[i.innerWidth(),i.innerHeight()]),a=i.find(u[1]).outerHeight()||0,o=i.find("."+u[6]).outerHeight()||0,e=function(e){(e=i.find(e)).height(n[1]-a-o-2*(0|parseFloat(e.css("padding-top"))))};return 2===t.type?e("iframe"):""===t.area[1]||"auto"===t.area[1]?0t.maxHeight?(n[1]=t.maxHeight,e("."+u[5])):t.fixed&&n[1]>=g.height()&&(n[1]=g.height(),e("."+u[5])):e("."+u[5]),this},t.pt.offset=function(){var e=this,t=e.config,i=e.layero,n=[i.outerWidth(),i.outerHeight()],a="object"==typeof t.offset;e.offsetTop=(g.height()-n[1])/2,e.offsetLeft=(g.width()-n[0])/2,a?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=g.width()-n[0]:"b"===t.offset?e.offsetTop=g.height()-n[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=g.height()-n[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=g.width()-n[0]):"rb"===t.offset?(e.offsetTop=g.height()-n[1],e.offsetLeft=g.width()-n[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?g.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?g.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=g.scrollTop(),e.offsetLeft+=g.scrollLeft()),"min"===i.data("maxminStatus")&&(e.offsetTop=g.height()-(i.find(u[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},t.pt.tips=function(){var e=this.config,t=this.layero,i=[t.outerWidth(),t.outerHeight()],n=h(e.follow),a={width:(n=n[0]?n:h("body")).outerWidth(),height:n.outerHeight(),top:n.offset().top,left:n.offset().left},o=t.find(".layui-layer-TipsG"),n=e.tips[0];e.tips[1]||o.remove(),a.autoLeft=function(){0'):e.removeClass("layui-layer-btn-is-loading").removeAttr("disabled").find(".layui-layer-btn-loading-icon").remove()},t.pt.callback=function(){var n=this,a=n.layero,o=n.config;n.openLayer(),o.success&&(2==o.type?a.find("iframe").on("load",function(){o.success(a,n.index,n)}):o.success(a,n.index,n)),6==v.ie&&n.IE6(a),a.find("."+u[6]).children("a").on("click",function(){var e,t=h(this),i=t.index();t.attr("disabled")||(o.btnAsync?(e=0===i?o.yes||o.btn1:o["btn"+(i+1)],n.loading=function(e){n.btnLoading(t,e)},e?f.promiseLikeResolve(e.call(o,n.index,a,n)).then(function(e){!1!==e&&v.close(n.index)},function(e){e!==m&&p.console&&p.console.error("layer error hint: "+e)}):v.close(n.index)):0===i?o.yes?o.yes(n.index,a,n):o.btn1?o.btn1(n.index,a,n):v.close(n.index):!1!==(o["btn"+(i+1)]&&o["btn"+(i+1)](n.index,a,n))&&v.close(n.index))}),a.find("."+u[7]).on("click",function(){!1!==(o.cancel&&o.cancel(n.index,a,n))&&v.close(n.index)}),o.shadeClose&&n.shadeo.on("click",function(){v.close(n.index)}),a.find(".layui-layer-min").on("click",function(){!1!==(o.min&&o.min(a,n.index,n))&&v.min(n.index,o)}),a.find(".layui-layer-max").on("click",function(){h(this).hasClass("layui-layer-maxmin")?(v.restore(n.index),o.restore&&o.restore(a,n.index,n)):(v.full(n.index,o),setTimeout(function(){o.full&&o.full(a,n.index,n)},100))}),o.end&&(f.end[n.index]=o.end),o.beforeEnd&&(f.beforeEnd[n.index]=h.proxy(o.beforeEnd,o,a,n.index,n))},f.reselect=function(){h.each(h("select"),function(e,t){var i=h(this);i.parents("."+u[0])[0]||1==i.attr("layer")&&h("."+u[0]).length<1&&i.removeAttr("layer").show()})},t.pt.IE6=function(e){h("select").each(function(e,t){var i=h(this);i.parents("."+u[0])[0]||"none"!==i.css("display")&&i.attr({layer:"1"}).hide()})},t.pt.openLayer=function(){v.zIndex=this.config.zIndex,v.setTop=function(e){return v.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",function(){v.zIndex++,e.css("z-index",v.zIndex+1)}),v.zIndex}},f.record=function(e){if(!e[0])return p.console&&console.error("index error");var t=e.attr("type"),i=e.find(".layui-layer-content"),t=t===f.type[2]?i.children("iframe"):i,n=[e[0].style.width||f.getStyle(e[0],"width"),e[0].style.height||f.getStyle(e[0],"height"),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:n}),i.data(l,f.getStyle(t[0],"height"))},f.setScrollbar=function(e){u.html.css("overflow","hidden")},f.restScrollbar=function(t){u.html.css("overflow")&&0===h("."+u[0]).filter(function(){var e=h(this);return!1===(e.data("config")||{}).scrollbar&&"min"!==e.data("maxminStatus")&&e.attr("times")!==String(t)}).length&&u.html.css("overflow","")},f.promiseLikeResolve=function(e){var t=h.Deferred();return e&&"function"==typeof e.then?e.then(t.resolve,t.reject):t.resolve(e),t.promise()},(p.layer=v).getChildFrame=function(e,t){return t=t||h("."+u[4]).attr("times"),h("#"+u[0]+t).find("iframe").contents().find(e)},v.getFrameIndex=function(e){if(e)return h("#"+e).parents("."+u[4]).attr("times")},v.iframeAuto=function(e){var t,i,n;e&&(t=v.getChildFrame("html",e).outerHeight(),i=(e=h("#"+u[0]+e)).find(u[1]).outerHeight()||0,n=e.find("."+u[6]).outerHeight()||0,e.css({height:t+i+n}),e.find("iframe").css({height:t}))},v.iframeSrc=function(e,t){h("#"+u[0]+e).find("iframe").attr("src",t)},v.style=function(e,t,i){var e=h("#"+u[0]+e),n=e.find(".layui-layer-content"),a=e.attr("type"),o=e.find(u[1]).outerHeight()||0,s=e.find("."+u[6]).outerHeight()||0;e.attr("minLeft");a!==f.type[3]&&a!==f.type[4]&&(i||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-o-s<=64&&(t.height=64+o+s)),e.css(t),s=e.find("."+u[6]).outerHeight()||0,a===f.type[2]?e.find("iframe").css({height:("number"==typeof t.height?t.height:e.height())-o-s}):n.css({height:("number"==typeof t.height?t.height:e.height())-o-s-parseFloat(n.css("padding-top"))-parseFloat(n.css("padding-bottom"))}))},v.min=function(e,t){var i,n,a,o,s,r,l=h("#"+u[0]+e),c=l.data("maxminStatus");"min"!==c&&("max"===c&&v.restore(e),l.data("maxminStatus","min"),t=t||l.data("config")||{},c=h("#"+u.SHADE+e),i=l.find(".layui-layer-min"),n=l.find(u[1]).outerHeight()||0,o=(a="string"==typeof(o=l.attr("minLeft")))?o:181*f.minStackIndex+"px",s=l.css("position"),r={width:180,height:n,position:"fixed",overflow:"hidden"},f.record(l),0g.width()&&(o=g.width()-180-(f.minStackArr.edgeIndex=f.minStackArr.edgeIndex||0,f.minStackArr.edgeIndex+=3))<0&&(o=0),t.minStack&&(r.left=o,r.top=g.height()-n,a||f.minStackIndex++,l.attr("minLeft",o)),l.attr("position",s),v.style(e,r,!0),i.hide(),"page"===l.attr("type")&&l.find(u[4]).hide(),f.restScrollbar(e),c.hide())},v.restore=function(e){var t=h("#"+u[0]+e),i=h("#"+u.SHADE+e),n=t.find(".layui-layer-content"),a=t.attr("area").split(","),o=t.attr("type"),s=t.data("config")||{},r=n.data(l);t.removeData("maxminStatus"),v.style(e,{width:a[0],height:a[1],top:parseFloat(a[2]),left:parseFloat(a[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===o&&t.find(u[4]).show(),s.scrollbar?f.restScrollbar(e):f.setScrollbar(e),r!==m&&(n.removeData(l),(o===f.type[2]?n.children("iframe"):n).css({height:r})),i.show()},v.full=function(t){var i=h("#"+u[0]+t),e=i.data("maxminStatus");"max"!==e&&("min"===e&&v.restore(t),i.data("maxminStatus","max"),f.record(i),f.setScrollbar(t),setTimeout(function(){var e="fixed"===i.css("position");v.style(t,{top:e?0:g.scrollTop(),left:e?0:g.scrollLeft(),width:"100%",height:"100%"},!0),i.find(".layui-layer-min").hide()},100))},v.title=function(e,t){h("#"+u[0]+(t||v.index)).find(u[1]).html(e)},v.close=function(s,r){var e,t,l=(e=h("."+u[0]).children("#"+s).closest("."+u[0]))[0]?(s=e.attr("times"),e):h("#"+u[0]+s),c=l.attr("type"),i=l.data("config")||{},d=i.id&&i.hideOnClose;l[0]&&(t=function(){var o={slideDown:"layer-anim-slide-down-out",slideLeft:"layer-anim-slide-left-out",slideUp:"layer-anim-slide-up-out",slideRight:"layer-anim-slide-right-out"}[i.anim]||"layer-anim-close",e=function(){var e="layui-layer-wrap";if(d)return l.removeClass("layer-anim "+o),l.hide();if(c===f.type[1]&&"object"===l.attr("conType")){l.children(":not(."+u[5]+")").remove();for(var t=l.find("."+e),i=0;i<2;i++)t.unwrap();t.css("display",t.data("display")).removeClass(e)}else{if(c===f.type[2])try{var n=h("#"+u[4]+s)[0];n.contentWindow.document.write(""),n.contentWindow.close(),l.find("."+u[5])[0].removeChild(n)}catch(a){}l[0].innerHTML="",l.remove()}"function"==typeof f.end[s]&&f.end[s](),delete f.end[s],"function"==typeof r&&r(),f.events.resize[s]&&(g.off("resize",f.events.resize[s]),delete f.events.resize[s])},t=h("#"+u.SHADE+s);v.ie&&v.ie<10||!i.isOutAnim?t[d?"hide":"remove"]():(t.css({opacity:0}),setTimeout(function(){t[d?"hide":"remove"]()},350)),i.isOutAnim&&l.addClass("layer-anim "+o),6==v.ie&&f.reselect(),f.restScrollbar(s),"string"==typeof l.attr("minLeft")&&(f.minStackIndex--,f.minStackArr.push(l.attr("minLeft"))),v.ie&&v.ie<10||!i.isOutAnim?e():setTimeout(function(){e()},200)},d||"function"!=typeof f.beforeEnd[s]?(delete f.beforeEnd[s],t()):f.promiseLikeResolve(f.beforeEnd[s]()).then(function(e){!1!==e&&(delete f.beforeEnd[s],t())},function(e){e!==m&&p.console&&p.console.error("layer error hint: "+e)}))},v.closeAll=function(n,a){"function"==typeof n&&(a=n,n=null);var o=h("."+u[0]);h.each(o,function(e){var t=h(this),i=n?t.attr("type")===n:1;i&&v.close(t.attr("times"),e===o.length-1?a:null)}),0===o.length&&"function"==typeof a&&a()},v.closeLast=function(i,e){var t,n=[],a=h.isArray(i);h("string"==typeof i?".layui-layer-"+i:".layui-layer").each(function(e,t){t=h(t);if(a&&-1===i.indexOf(t.attr("type"))||"none"===t.css("display"))return!0;n.push(Number(t.attr("times")))}),0":'",s=i.success;return delete i.success,v.open(h.extend({type:1,btn:["\u786e\u5b9a","\u53d6\u6d88"],content:o,skin:"layui-layer-prompt"+x("prompt"),maxWidth:g.width(),success:function(e){(a=e.find(".layui-layer-input")).val(i.value||"").focus(),"function"==typeof s&&s(e)},resize:!1,yes:function(e){var t=a.val();t.length>(i.maxlength||500)?v.tips("\u6700\u591a\u8f93\u5165"+(i.maxlength||500)+"\u4e2a\u5b57\u7b26",a,{tips:1}):n&&n(t,e,a)}},i))},v.tab=function(n){var a=(n=n||{}).tab||{},o="layui-this",s=n.success;return delete n.success,v.open(h.extend({type:1,skin:"layui-layer-tab"+x("tab"),resize:!1,title:function(){var e=a.length,t=1,i="";if(0'+a[0].title+"";t"+a[t].title+"";return i}(),content:'
                                    '+function(){var e=a.length,t=1,i="";if(0'+(a[0].content||"no content")+"";t'+(a[t].content||"no content")+"";return i}()+"
                                  ",success:function(e){var t=e.find(".layui-layer-title").children(),i=e.find(".layui-layer-tabmain").children();t.on("mousedown",function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0;var e=h(this),t=e.index();e.addClass(o).siblings().removeClass(o),i.eq(t).show().siblings().hide(),"function"==typeof n.change&&n.change(t)}),"function"==typeof s&&s(e)}},n))},v.photos=function(n,e,a){var s={};if((n=h.extend(!0,{toolbar:!0,footer:!0},n)).photos){var t=!("string"==typeof n.photos||n.photos instanceof h),i=t?n.photos:{},o=i.data||[],r=i.start||0,l=n.success;if(s.imgIndex=1+(0|r),n.img=n.img||"img",delete n.success,t){if(0===o.length)return v.msg("\u6ca1\u6709\u56fe\u7247")}else{var c=h(n.photos),d=function(){o=[],c.find(n.img).each(function(e){var t=h(this);t.attr("layer-index",e),o.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("lay-src")||t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(d(),e||c.on("click",n.img,function(){d();var e=h(this).attr("layer-index");v.photos(h.extend(n,{photos:{start:e,data:o,tab:n.tab},full:n.full}),!0)}),!e)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=o.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>o.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){var t;s.end||(t=e.keyCode,e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&v.close(s.index))},s.tabimg=function(e){if(!(o.length<=1))return i.start=s.imgIndex-1,v.close(s.index),v.photos(n,!0,e)},s.isNumber=function(e){return"number"==typeof e&&!isNaN(e)},s.image={},s.getTransform=function(e){var t=[],i=e.rotate,n=e.scaleX,e=e.scale;return s.isNumber(i)&&0!==i&&t.push("rotate("+i+"deg)"),s.isNumber(n)&&1!==n&&t.push("scaleX("+n+")"),s.isNumber(e)&&t.push("scale("+e+")"),t.length?t.join(" "):"none"},s.event=function(e,i,n){var a,o;s.main.find(".layui-layer-photos-prev").on("click",function(e){e.preventDefault(),s.imgprev(!0)}),s.main.find(".layui-layer-photos-next").on("click",function(e){e.preventDefault(),s.imgnext(!0)}),h(document).on("keyup",s.keyup),e.off("click").on("click","*[toolbar-event]",function(){var e=h(this);switch(e.attr("toolbar-event")){case"rotate":s.image.rotate=((s.image.rotate||0)+Number(e.attr("data-option")))%360,s.imgElem.css({transform:s.getTransform(s.image)});break;case"scalex":s.image.scaleX=-1===s.image.scaleX?1:-1,s.imgElem.css({transform:s.getTransform(s.image)});break;case"zoom":var t=Number(e.attr("data-option"));s.image.scale=(s.image.scale||1)+t,t<0&&s.image.scale<0-t&&(s.image.scale=0-t),s.imgElem.css({transform:s.getTransform(s.image)});break;case"reset":s.image.scaleX=1,s.image.scale=1,s.image.rotate=0,s.imgElem.css({transform:"none"});break;case"close":v.close(i)}n.offset(),n.auto(i)}),s.main.on("mousewheel DOMMouseScroll",function(e){var t=e.originalEvent.wheelDelta||-e.originalEvent.detail,i=s.main.find('[toolbar-event="zoom"]');(0n)&&("left"===t.direction?s.imgnext(!0):"right"===t.direction&&s.imgprev(!0))},h.each([n.shadeo,s.main],function(e,t){a.touchSwipe(t,{onTouchEnd:o})}))},s.loadi=v.load(1,{shade:!("shade"in n)&&[.9,m,"unset"],scrollbar:!1});var t=o[r].src,f=function(e){v.close(s.loadi);var t,i=o[r].alt||"";a&&(n.anim=-1),s.index=v.open(h.extend({type:1,id:"layui-layer-photos",area:(e=[e.width,e.height],t=[h(p).width()-100,h(p).height()-100],!n.full&&(t[0]'+i+''+(t=['
                                  '],1','','',"
                                  "].join("")),n.toolbar&&t.push(['
                                  ','','','','','','',"
                                  "].join("")),n.footer&&t.push(['"].join("")),t.push("
                                  "),t.join(""))+"
                                  ",success:function(e,t,i){s.main=e.find(".layer-layer-photos-main"),s.footer=e.find(".layui-layer-photos-footer"),s.imgElem=s.main.children("img"),s.event(e,t,i),n.tab&&n.tab(o[r],e),"function"==typeof l&&l(e)},end:function(){s.end=!0,h(document).off("keyup",s.keyup)}},n))},u=function(){v.close(s.loadi),v.msg("\u5f53\u524d\u56fe\u7247\u5730\u5740\u5f02\u5e38\uff0c
                                  \u662f\u5426\u7ee7\u7eed\u67e5\u770b\u4e0b\u4e00\u5f20\uff1f",{time:3e4,btn:["\u4e0b\u4e00\u5f20","\u4e0d\u770b\u4e86"],yes:function(){1").addClass(o));layui.each(i.bars,function(t,e){var n=s('
                                • ');n.addClass(e.icon).attr({"lay-type":e.type,style:e.style||(i.bgcolor?"background-color: "+i.bgcolor:"")}).html(e.content),n.on("click",function(){var t=s(this).attr("lay-type");"top"===t&&("body"===i.target?s("html,body"):c).animate({scrollTop:0},i.duration),"function"==typeof i.click&&i.click.call(this,t)}),"object"===layui.type(i.on)&&layui.each(i.on,function(t,e){n.on(t,function(){var t=s(this).attr("lay-type");"function"==typeof e&&e.call(this,t)})}),"top"===e.type&&(n.addClass("layui-fixbar-top"),r=n),l.append(n)}),u.find("."+o).remove(),"object"==typeof i.css&&l.css(i.css),u.append(l),r&&(e=function e(){return c.scrollTop()>=i.margin?t||(r.show(),t=1):t&&(r.hide(),t=0),e}()),c.on("scroll",function(){e&&(clearTimeout(n),n=setTimeout(function(){e()},100))})},countdown:function(i){i=s.extend(!0,{date:new Date,now:new Date},i);var r=arguments,o=(1]|&(?=#?[a-zA-Z0-9]+)/g.test(t+="")?t.replace(/&(?=#?[a-zA-Z0-9]+;?)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,"""):t},unescape:function(t){return t===undefined||null===t?"":String(t).replace(/\"/g,'"').replace(/\'/g,"'").replace(/\>/g,">").replace(/\</g,"<").replace(/\&/g,"&")},openWin:function(t){var e=(t=t||{}).window||window.open(t.url||"",t.target,t.specs);t.url||(e.document.open("text/html","replace"),e.document.write(t.content||""),e.document.close())},toVisibleArea:function(t){var e,n,i,r,o,a,u,c;(t=s.extend({margin:160,duration:200,type:"y"},t)).scrollElem[0]&&t.thisElem[0]&&(u=t.thisElem,i=(o="y"===t.type)?"top":"left",r=(e=t.scrollElem)[n=o?"scrollTop":"scrollLeft"](),o=e[o?"height":"width"](),a=e.offset()[i],c={},(u=u.offset()[i]-a)>o-t.margin||u."+v,T=function(e){var i=this;i.index=++h.index,i.config=c.extend({},i.config,h.config,e),i.init()};T.prototype.config={trigger:"click",content:"",className:"",style:"",show:!1,isAllowSpread:!0,isSpreadItem:!0,data:[],delay:[200,300],shade:0,accordion:!1,closeOnClick:!0},T.prototype.reload=function(e,i){var t=this;t.config=c.extend({},t.config,e),t.init(!0,i)},T.prototype.init=function(e,i){var t=this,n=t.config,a=c(n.elem);return 1",(t="href"in i?''+o+"":o,n?'
                                  '+t+("parent"===l?'':"group"===l&&d.isAllowSpread?'':"")+"
                                  ":'
                                  '+t+"
                                  "),"
                                • "].join(""))).data("item",i),n&&(a=c('
                                  '),t=c("
                                    "),"parent"===l?(a.append(u(t,i[s.children])),o.append(a)):o.append(u(t,i[s.children]))),r.append(o))}),r},t=['
                                    ',"
                                    "].join(""),n=d.content||(n=c('
                                      '),0\u6682\u65e0\u6570\u636e'),n),a=g.findMainElem(d.id);"reloadData"===e&&a.length?(i=o.mainElem=a).html(n):((i=o.mainElem=c(t)).append(n),i.addClass(d.className),i.attr("style",d.style),o.remove(h.thisId),d.target.append(i),d.elem.data(f,!0),e=d.shade?'
                                      ':"",i.before(e),"mouseenter"===d.trigger&&i.on("mouseenter",function(){clearTimeout(g.timer)}).on("mouseleave",function(){o.delayRemove()})),o.position(),h.thisId=d.id,i.find(".layui-menu").on(l,function(e){layui.stope(e)}),i.find(".layui-menu li").on("click",function(e){var i=c(this),t=i.data("item")||{},n=t[s.children]&&0n.width()&&(t.addClass(x),(i=t[0].getBoundingClientRect()).left<0)&&t.removeClass(x),i.bottom>n.height())&&t.eq(0).css("margin-top",-(i.bottom-n.height()+5))}).on("mouseleave",t,function(e){var i=c(this).children("."+C);i.removeClass(x),i.css("margin-top",0)}),h.close=function(e){e=g.getThis(e);return e?(e.remove(),g.call(e)):this},h.open=function(e){e=g.getThis(e);return e?(e.render(),g.call(e)):this},h.reload=function(e,i,t){e=g.getThis(e);return e?(e.reload(i,t),g.call(e)):this},h.reloadData=function(){var t=c.extend([],arguments),n=(t[2]="reloadData",new RegExp("^("+["data","templet","content"].join("|")+")$"));return layui.each(t[1],function(e,i){n.test(e)||delete t[1][e]}),h.reload.apply(null,t)},h.render=function(e){e=new T(e);return g.call(e)},e(r,h)});layui.define(["jquery","lay"],function(e){"use strict";var x=layui.$,b=layui.lay,m={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var t=this;return t.config=x.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,i,e,t)}},i="slider",f="layui-disabled",T="layui-slider-bar",w="layui-slider-wrap",M="layui-slider-wrap-btn",L="layui-slider-tips",E="layui-slider-input-txt",Y="layui-slider-hover",t=function(e){var t=this;t.index=++m.index,t.config=x.extend({},t.config,m.config,e),t.render()};t.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,tipsAlways:!1,input:!1,range:!1,height:200,disabled:!1,theme:"#16baaa"},t.prototype.precision=function(){var e=this.config,e=x.map([e.min,e.max,e.step],function(e,t){e=String(e).split(".");return e[1]?e[1].length:0});return Math.max.apply(null,e)},t.prototype.render=function(){var n=this,a=n.config,e=x(a.elem);if(1a.max&&(a.value=a.max),l=(a.value-a.min)/(a.max-a.min)*100+"%");var t,e=a.disabled?"#c2c2c2":a.theme,i='
                                      '+(a.tips?'
                                      ":"")+'
                                      '+(a.range?'
                                      ':"")+"
                                      ",l=x(a.elem),s=l.next(".layui-slider");if(s[0]&&s.remove(),n.elemTemp=x(i),a.range?(n.elemTemp.find("."+w).eq(0).data("value",a.value[0]),n.elemTemp.find("."+w).eq(1).data("value",a.value[1])):n.elemTemp.find("."+w).data("value",a.value),l.html(n.elemTemp),"vertical"===a.type&&n.elemTemp.height(a.height+"px"),a.showstep){for(var o=(a.max-a.min)/a.step,r="",u=1;u<1+o;u++){var c=100*u/o;c<100&&(r+='
                                      ')}n.elemTemp.append(r)}function d(e){e=e.parent().data("value"),e=a.setTips?a.setTips(e):e;n.elemTemp.find("."+L).html(e)}function p(e){var t="vertical"===a.type?a.height:n.elemTemp[0].offsetWidth,i=n.elemTemp.find("."+w);return("vertical"===a.type?t-e.parent()[0].offsetTop-i.height():e.parent()[0].offsetLeft)/t*100}function v(e){"vertical"===a.type?n.elemTemp.find("."+L).css({bottom:e+"%","margin-bottom":"20px",display:"inline-block"}):n.elemTemp.find("."+L).css({left:e+"%",display:"inline-block"})}a.input&&!a.range&&(e=x('
                                      '),l.css("position","relative"),l.append(e),l.find("."+E).children("input").val(a.value),"vertical"===a.type?e.css({left:0,top:-48}):n.elemTemp.css("margin-right",e.outerWidth()+15)),a.disabled?(n.elemTemp.addClass(f),n.elemTemp.find("."+M).addClass(f)):n.slide(),a.tips&&(a.tipsAlways?(d(s=n.elemTemp.find("."+M)),v(p(s))):n.elemTemp.find("."+M).on("mouseover",function(){d(x(this));var e=p(x(this));clearTimeout(t),t=setTimeout(function(){v(e)},300)}).on("mouseout",function(){clearTimeout(t),a.tipsAlways||n.elemTemp.find("."+L).css("display","none")}))},t.prototype.slide=function(e,t,i){var u=this,c=u.config,d=u.elemTemp,p=function(){return"vertical"===c.type?c.height:d[0].offsetWidth},v=d.find("."+w),o=d.next(".layui-slider-input"),r=o.children("."+E).children("input").val(),m=100/((c.max-c.min)/c.step),f=u.precision(),h=function(e,t,i){e=(e=100<(e=100n[1]&&n.reverse(),u.value=c.range?n:l,c.change&&c.change(u.value),"done"===i&&c.done&&c.done(u.value)},y=function(e){var t=e/p()*100/m,i=Math.round(t)*m;return i=e==p()?Math.ceil(t)*m:i},g=x(['
                                      p()?p():t)/p()*100/m;h(t,o),r.addClass(Y),d.find("."+L).show(),e.preventDefault()},n=function(e){r.removeClass(Y),c.tipsAlways||setTimeout(function(){d.find("."+L).hide()},e)},a=function(){n&&n(b.touchEventsSupported()?1e3:0),g.remove(),c.done&&c.done(u.value),b.touchEventsSupported()&&(t[0].removeEventListener("touchmove",i,!!b.passiveSupported&&{passive:!1}),t[0].removeEventListener("touchend",a),t[0].removeEventListener("touchcancel",a))},x("#LAY-slider-moving")[0]||x("body").append(g),g.on("mousemove",i),g.on("mouseup",a).on("mouseleave",a),b.touchEventsSupported()&&(t[0].addEventListener("touchmove",i,!!b.passiveSupported&&{passive:!1}),t[0].addEventListener("touchend",a),t[0].addEventListener("touchcancel",a))})}),d.on("click",function(e){var t=x("."+M),i=x(this);!t.is(event.target)&&0===t.has(event.target).length&&t.length&&(i=(t=(t=(t="vertical"===c.type?p()-e.clientY+i.offset().top-x(window).scrollTop():e.clientX-i.offset().left-x(window).scrollLeft())<0?0:t)>p()?p():t)/p()*100/m,t=c.range?"vertical"===c.type?Math.abs(t-parseInt(x(v[0]).css("bottom")))>Math.abs(t-parseInt(x(v[1]).css("bottom")))?1:0:Math.abs(t-v[0].offsetLeft)>Math.abs(t-v[1].offsetLeft)?1:0:0,h(i,t,"done"),e.preventDefault())}),o.children(".layui-slider-input-btn").children("i").each(function(t){x(this).on("click",function(){r=o.children("."+E).children("input").val();var e=((r=1==t?r-c.stepc.max?c.max:Number(r)+c.step)-c.min)/(c.max-c.min)*100/m;h(e,0,"done")})});var n=function(){var e=this.value,e=(e=(e=(e=isNaN(e)?0:e)c.max?c.max:e,((this.value=e)-c.min)/(c.max-c.min)*100/m);h(e,0,"done")};o.children("."+E).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),n.call(this))}).on("change",n)},t.prototype.events=function(){this.config},m.render=function(e){e=new t(e);return function(){var i=this,n=i.config;return{setValue:function(e,t){return e=(e=e>n.max?n.max:e)',"",'','',"","","
                                      "].join("")),t=i.elem=x(i.elem);i.size&&o.addClass("layui-colorpicker-"+i.size),t.addClass("layui-inline").html(e.elemColorBox=o),i.id="id"in i?i.id:t.attr("id")||e.index,e.color=e.elemColorBox.find("."+T)[0].style.background,e.events()},s.prototype.renderPicker=function(){var o,e=this,i=e.config,t=e.elemColorBox[0],n=e.elemPicker=x(['
                                      ','
                                      ','
                                      ','
                                      ','
                                      ','
                                      ',"
                                      ",'
                                      ','
                                      ',"
                                      ","
                                      ",'
                                      ','
                                      ','
                                      ',"
                                      ","
                                      ",i.predefine?(o=['
                                      '],layui.each(i.colors,function(e,i){o.push(['
                                      ','
                                      ',"
                                      "].join(""))}),o.push("
                                      "),o.join("")):"",'
                                      ','
                                      ','',"
                                      ",'
                                      ','','',"","
                                      "].join(""));e.elemColorBox.find("."+T)[0];x(c)[0]&&x(c).data("index")==e.index?e.removePicker(s.thisElemInd):(e.removePicker(s.thisElemInd),x("body").append(n)),r.thisId=i.id,s.thisElemInd=e.index,s.thisColor=t.style.background,e.position(),e.pickerEvents()},s.prototype.removePicker=function(e){var i=this.config,e=x("#layui-colorpicker"+(e||this.index));return e[0]&&(e.remove(),delete r.thisId,"function"==typeof i.close)&&i.close(this.color),this},s.prototype.position=function(){var e=this,i=e.config;return P.position(e.bindElem||e.elemColorBox[0],e.elemPicker[0],{position:i.position,align:"center"}),e},s.prototype.val=function(){var e,i=this,o=(i.config,i.elemColorBox.find("."+T)),t=i.elemPicker.find("."+X),n=o[0].style.backgroundColor;n?(e=j(L(n)),o=o.attr("lay-type"),i.select(e.h,e.s,e.b),"torgb"===o?t.find("input").val(n):"rgba"===o?(o=L(n),3===(n.match(/[0-9]{1,3}/g)||[]).length?(t.find("input").val("rgba("+o.r+", "+o.g+", "+o.b+", 1)"),i.elemPicker.find("."+Y).css("left",280)):(t.find("input").val(n),n=280*n.slice(n.lastIndexOf(",")+1,n.length-1),i.elemPicker.find("."+Y).css("left",n)),i.elemPicker.find("."+D)[0].style.background="linear-gradient(to right, rgba("+o.r+", "+o.g+", "+o.b+", 0), rgb("+o.r+", "+o.g+", "+o.b+"))"):t.find("input").val("#"+H(e))):(i.select(0,100,100),t.find("input").val(""),i.elemPicker.find("."+D)[0].style.background="",i.elemPicker.find("."+Y).css("left",280))},s.prototype.side=function(){var r=this,l=r.config,c=r.elemColorBox.find("."+T),a=c.attr("lay-type"),s=r.elemPicker.find(".layui-colorpicker-side"),o=r.elemPicker.find("."+I),d=r.elemPicker.find("."+E),t=r.elemPicker.find("."+M),u=r.elemPicker.find("."+D),f=r.elemPicker.find("."+Y),p=o[0].offsetTop/180*360,h=100-t[0].offsetTop/180*100,g=t[0].offsetLeft/260*100,v=Math.round(f[0].offsetLeft/280*100)/100,m=r.elemColorBox.find("."+B),e=r.elemPicker.find(".layui-colorpicker-pre").children("div"),y=function(e,i,o,t){r.select(e,i,o);var n=F({h:e,s:i,b:o}),e=H({h:e,s:i,b:o}),i=r.elemPicker.find("."+X).find("input");m.addClass(C).removeClass(w),c[0].style.background="rgb("+n.r+", "+n.g+", "+n.b+")","torgb"===a?i.val("rgb("+n.r+", "+n.g+", "+n.b+")"):"rgba"===a?(f.css("left",280*t),i.val("rgba("+n.r+", "+n.g+", "+n.b+", "+t+")"),c[0].style.background="rgba("+n.r+", "+n.g+", "+n.b+", "+t+")",u[0].style.background="linear-gradient(to right, rgba("+n.r+", "+n.g+", "+n.b+", 0), rgb("+n.r+", "+n.g+", "+n.b+"))"):i.val("#"+e),l.change&&l.change(x.trim(r.elemPicker.find("."+X).find("input").val()))},i=x(['
                                      '].join("")),b=function(e){x("#LAY-colorpicker-moving")[0]||x("body").append(i),i.on("mousemove",e),i.on("mouseup",function(){i.remove()}).on("mouseleave",function(){i.remove()})},n=!0,k=!0;o.on("mousedown",function(e,i){var t=this.offsetTop,n=(e.clientY===undefined?i:e).clientY;k&&layui.stope(e),b(function(e){var i=t+(e.clientY-n),o=s[0].offsetHeight,o=(i=o<(i=i<0?0:i)?o:i)/180*360;y(p=o,g,h,v),e.preventDefault()}),e.preventDefault()}),s.on("mousedown",function(e){var i=e.clientY-x(this).offset().top+W.scrollTop(),i=(i=(i=i<0?0:i)>this.offsetHeight?this.offsetHeight:i)/180*360;y(p=i,g,h,v),e.preventDefault(),n&&o.trigger("mousedown",e)}),t.on("mousedown",function(e,i){var r=this.offsetTop,l=this.offsetLeft,c=(e.clientY===undefined?i:e).clientY,a=(e.clientX===undefined?i:e).clientX;k&&layui.stope(e),b(function(e){var i=r+(e.clientY-c),o=l+(e.clientX-a),t=d[0].offsetHeight,n=d[0].offsetWidth,n=(o=n<(o=o<0?0:o)?n:o)/260*100,o=100-(i=t<(i=i<0?0:i)?t:i)/180*100;y(p,g=n,h=o,v),e.preventDefault()}),e.preventDefault()}),d.on("mousedown",function(e){var i=e.clientY-x(this).offset().top+W.scrollTop(),o=e.clientX-x(this).offset().left+W.scrollLeft(),o=((i=i<0?0:i)>this.offsetHeight&&(i=this.offsetHeight),(o=(o=o<0?0:o)>this.offsetWidth?this.offsetWidth:o)/260*100),i=100-i/180*100;y(p,g=o,h=i,v),layui.stope(e),e.preventDefault(),n&&t.trigger("mousedown",e)}),f.on("mousedown",function(e,i){var t=this.offsetLeft,n=(e.clientX===undefined?i:e).clientX;k&&layui.stope(e),b(function(e){var i=t+(e.clientX-n),o=u[0].offsetWidth,o=(o<(i=i<0?0:i)&&(i=o),Math.round(i/280*100)/100);y(p,g,h,v=o),e.preventDefault()}),e.preventDefault()}),u.on("mousedown",function(e){var i=e.clientX-x(this).offset().left,i=((i=i<0?0:i)>this.offsetWidth&&(i=this.offsetWidth),Math.round(i/280*100)/100);y(p,g,h,v=i),e.preventDefault(),n&&f.trigger("mousedown",e)}),e.each(function(){x(this).on("click",function(){x(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e=this.style.backgroundColor,i=j(L(e)),o=e.slice(e.lastIndexOf(",")+1,e.length-1);p=i.h,g=i.s,h=i.b,3===(e.match(/[0-9]{1,3}/g)||[]).length&&(o=1),v=o,y(i.h,i.s,i.b,o)})}),P.touchEventsSupported()&&layui.each([{elem:s,eventType:"mousedown"},{elem:u,eventType:"mousedown"},{elem:d,eventType:"mousedown"}],function(e,t){P.touchSwipe(t.elem,{onTouchStart:function(){k=n=!1},onTouchMove:function(e){var i,o;e=e,i=t.eventType,e=e.touches[0],(o=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,e.screenX,e.screenY,e.clientX,e.clientY,!1,!1,!1,!1,0,null),e.target.dispatchEvent(o)},onTouchEnd:function(){i.remove(),k=n=!0}})})},s.prototype.select=function(e,i,o,t){this.config;var n=H({h:e,s:100,b:100}),e=(H({h:e,s:i,b:o}),e/360*180),o=180-o/100*180,i=i/100*260,r=this.elemPicker.find("."+E)[0];this.elemPicker.find("."+I).css("top",e),r.style.background="#"+n,this.elemPicker.find("."+M).css({top:o/r.offsetHeight*100+"%",left:i/r.offsetWidth*100+"%"})},s.prototype.pickerEvents=function(){var c=this,a=c.config,s=c.elemColorBox.find("."+T),d=c.elemPicker.find("."+X+" input"),o={clear:function(e){s[0].style.background="",c.elemColorBox.find("."+B).removeClass(C).addClass(w),c.color="",a.done&&a.done(""),c.removePicker()},confirm:function(e,i){var o,t,n,r,l=x.trim(d.val());-1>16,g:(65280&n)>>8,b:255&n},t=j(r),s[0].style.background=o="#"+H(t),c.elemColorBox.find("."+B).removeClass(w).addClass(C)),"change"===i?(c.select(t.h,t.s,t.b,i),a.change&&a.change(o)):(c.color=l,a.done&&a.done(l),c.removePicker())}};c.elemPicker.on("click","*[colorpicker-events]",function(){var e=x(this),i=e.attr("colorpicker-events");o[i]&&o[i].call(this,e)}),d.on("keyup",function(e){var i=x(this);o.confirm.call(this,i,13===e.keyCode?null:"change")})},s.prototype.events=function(){var e=this;e.config;e.elemColorBox.on("click",function(){e.renderPicker(),x(c)[0]&&(e.val(),e.side())})},a.on(i,function(e){var i,o,t;r.thisId&&(i=n.getThis(r.thisId))&&(o=i.config,t=i.elemColorBox.find("."+T),x(e.target).hasClass(l)||x(e.target).parents("."+l)[0]||x(e.target).hasClass(c.replace(/\./g,""))||x(e.target).parents(c)[0]||i.elemPicker&&(i.color?(e=j(L(i.color)),i.select(e.h,e.s,e.b)):i.elemColorBox.find("."+B).removeClass(C).addClass(w),t[0].style.background=i.color||"","function"==typeof o.cancel&&o.cancel(i.color),i.removePicker()))}),W.on("resize",function(){if(r.thisId){var e=n.getThis(r.thisId);if(e)return!(!e.elemPicker||!x(c)[0])&&void e.position()}}),n.that={},n.getThis=function(e){var i=n.that[e];return i||o.error(e?t+" instance with ID '"+e+"' not found":"ID argument required"),i},r.render=function(e){e=new s(e);return n.call(e)},e(t,r)});layui.define("jquery",function(t){"use strict";var u=layui.$,d=(layui.hint(),layui.device()),r="element",y="layui-this",f="layui-show",c=".layui-tab-title",i=function(){this.config={}},h=(i.prototype.set=function(t){return u.extend(!0,this.config,t),this},i.prototype.on=function(t,i){return layui.onevent.call(this,r,t,i)},i.prototype.tabAdd=function(t,i){var a,e=u(".layui-tab[lay-filter="+t+"]"),l=e.children(c),n=l.children(".layui-tab-bar"),s=e.children(".layui-tab-content"),o=""+(i.title||"unnaming")+"";return n[0]?n.before(o):l.append(o),s.append('
                                      "+(i.content||"")+"
                                      "),i.change&&this.tabChange(t,i.id),l.data("LAY_TAB_CHANGE",i.change),w.tabAuto(i.change?"change":null,e),this},i.prototype.tabDelete=function(t,i,a){t=u(".layui-tab[lay-filter="+t+"]").children(c).find('>li[lay-id="'+i+'"]');return w.tabDelete.call(t[0],{liElem:t,force:a}),this},i.prototype.tabChange=function(t,i,a){t=u(".layui-tab[lay-filter="+t+"]").children(c).find('>li[lay-id="'+i+'"]');return w.tabClick.call(t[0],{liElem:t,force:a}),this},i.prototype.tab=function(a){a=a||{},e.on("click",a.headerElem,function(t){var i=u(a.headerElem).index(u(this));w.tabClick.call(this,{index:i,options:a})})},i.prototype.progress=function(t,i){var a="layui-progress",t=u("."+a+"[lay-filter="+t+"]").find("."+a+"-bar"),a=t.find("."+a+"-text");return t.css("width",function(){return/^.+\/.+$/.test(i)?100*new Function("return "+i)()+"%":i}).attr("lay-percent",i),a.text(i),this},".layui-nav"),p="layui-nav-item",b="layui-nav-bar",v="layui-nav-tree",m="layui-nav-child",g="layui-nav-more",C="layui-anim layui-anim-upbit",w={tabClick:function(t){var i=(t=t||{}).options||{},a=t.liElem||u(this),e=i.headerElem?a.parent():a.parents(".layui-tab").eq(0),i=i.bodyElem?u(i.bodyElem):e.children(".layui-tab-content").children(".layui-tab-item"),l=a.find("a"),l="javascript:;"!==l.attr("href")&&"_blank"===l.attr("target"),n="string"==typeof a.attr("lay-unselect"),s=e.attr("lay-filter"),o=a.attr("lay-id"),c="index"in t?t.index:a.parent().children("li").index(a);if(!t.force){var t=a.siblings("."+y);if(!1===layui.event.call(this,r,"tabBeforeChange("+s+")",{elem:e,from:{index:a.parent().children("li").index(t),id:t.attr("lay-id")},to:{index:c,id:o}}))return}l||n||(a.addClass(y).siblings().removeClass(y),(o?t=(t=i.filter('[lay-id="'+o+'"]')).length?t:i.eq(c):i.eq(c)).addClass(f).siblings().removeClass(f)),layui.event.call(this,r,"tab("+s+")",{elem:e,index:c,id:o})},tabDelete:function(t){var i=(t=t||{}).liElem||u(this).parent(),a=i.parent().children("li").index(i),e=i.closest(".layui-tab"),l=e.children(".layui-tab-content").children(".layui-tab-item"),n=e.attr("lay-filter"),s=i.attr("lay-id");if(!t.force&&!1===layui.event.call(i[0],r,"tabBeforeDelete("+n+")",{elem:e,index:a,id:s}))return;i.hasClass(y)&&(i.next()[0]&&i.next().is("li")?w.tabClick.call(i.next()[0],{index:a+1}):i.prev()[0]&&i.prev().is("li")&&w.tabClick.call(i.prev()[0],null,a-1)),i.remove(),(s?t=(t=l.filter('[lay-id="'+s+'"]')).length?t:l.eq(a):l.eq(a)).remove(),setTimeout(function(){w.tabAuto(null,e)},50),layui.event.call(this,r,"tabDelete("+n+")",{elem:e,index:a,id:s})},tabAuto:function(l,t){var n="layui-tab-more",s="layui-tab-bar",o="layui-tab-close",c=this;(t||u(".layui-tab")).each(function(){var t=u(this),a=t.children(".layui-tab-title"),i=(t.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),i=u(''),e=(c===window&&d.ie,t.attr("lay-allowclose"));e&&"false"!==e&&a.find("li").each(function(){var t,i=u(this);i.find("."+o)[0]||"false"===i.attr("lay-allowclose")||((t=u('')).on("click",function(t){w.tabDelete.call(this,{e:t})}),i.append(t))}),"string"!=typeof t.attr("lay-unauto")&&(a.prop("scrollWidth")>a.outerWidth()+1||a.find("li").length&&a.height()>(e=a.find("li").eq(0).height())+e/2?("change"===l&&a.data("LAY_TAB_CHANGE")&&a.addClass(n),a.find("."+s)[0]||(a.append(i),t.attr("overflow",""),i.on("click",function(t){var i=a.hasClass(n);a[i?"removeClass":"addClass"](n)}))):(a.find("."+s).remove(),t.removeAttr("overflow")))})},hideTabMore:function(t){var i=u(".layui-tab-title");!0!==t&&"tabmore"===u(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=u(this),i=t.closest(h),a=i.attr("lay-filter"),e=t.parent(),l=t.siblings("."+m),n="string"==typeof e.attr("lay-unselect");if("javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||n||l[0]||(i.find("."+y).removeClass(y),e.addClass(y)),i.hasClass(v)){var n=p+"ed",s=!e.hasClass(n),o=function(){u(this).css({display:""}),i.children("."+b).css({opacity:0})};if(l.is(":animated"))return;l.removeClass(C),l[0]&&(s?(l.slideDown(200,o),e.addClass(n)):(e.removeClass(n),l.show().slideUp(200,o)),"string"!=typeof i.attr("lay-accordion")&&"all"!==i.attr("lay-shrink")||((s=e.siblings("."+n)).removeClass(n),s.children("."+m).show().stop().slideUp(200,o)))}layui.event.call(this,r,"nav("+a+")",t)},collapse:function(){var t=u(this),i=t.find(".layui-colla-icon"),a=t.siblings(".layui-colla-content"),e=t.parents(".layui-collapse").eq(0),l=e.attr("lay-filter"),n="none"===a.css("display");"string"==typeof e.attr("lay-accordion")&&((e=e.children(".layui-colla-item").children("."+f)).siblings(".layui-colla-title").children(".layui-colla-icon").html(""),e.removeClass(f)),a[n?"addClass":"removeClass"](f),i.html(n?"":""),layui.event.call(this,r,"collapse("+l+")",{title:t,content:a,show:n})}},a=(i.prototype.render=i.prototype.init=function(t,i){var a="string"==typeof i&&i?'[lay-filter="'+i+'"]':"",e={tab:function(t){t=t||u(".layui-tab"+a);w.tabAuto.call({},null,t)},nav:function(t){var s={},o={},c={},r="layui-nav-title";(t||u(h+a)).each(function(t){var i=u(this),a=u(''),e=i.find("."+p),l=i.find("."+b);l[0]&&l.remove(),i.append(a),(i.hasClass(v)?e.find("dd,>."+r):e).off("mouseenter.lay_nav").on("mouseenter.lay_nav",function(){!function(t,i,a){var e,l=u(this),n=l.find("."+m);i.hasClass(v)?n[0]||(e=l.children("."+r),t.css({top:l.offset().top-i.offset().top,height:(e[0]?e:l).outerHeight(),opacity:1})):(n.addClass(C),n.hasClass("layui-nav-child-c")&&n.css({left:-(n.outerWidth()-l.width())/2}),n[0]?t.css({left:t.position().left+t.width()/2,width:0,opacity:0}):t.css({left:l.position().left+parseFloat(l.css("marginLeft")),top:l.position().top+l.height()-t.height()}),s[a]=setTimeout(function(){t.css({width:n[0]?0:l.width(),opacity:n[0]?0:1})},d.ie&&d.ie<10?0:200),clearTimeout(c[a]),"block"===n.css("display")&&clearTimeout(o[a]),o[a]=setTimeout(function(){n.addClass(f),l.find("."+g).addClass(g+"d")},300))}.call(this,a,i,t)}).off("mouseleave.lay_nav").on("mouseleave.lay_nav",function(){i.hasClass(v)?a.css({height:0,opacity:0}):(clearTimeout(o[t]),o[t]=setTimeout(function(){i.find("."+m).removeClass(f),i.find("."+g).removeClass(g+"d")},300))}),i.off("mouseleave.lay_nav").on("mouseleave.lay_nav",function(){clearTimeout(s[t]),c[t]=setTimeout(function(){i.hasClass(v)||a.css({width:0,left:a.position().left+a.width()/2,opacity:0})},200)}),e.find("a").each(function(){var t=u(this);t.parent();t.siblings("."+m)[0]&&!t.children("."+g)[0]&&t.append(''),t.off("click",w.clickThis).on("click",w.clickThis)})})},breadcrumb:function(t){(t||u(".layui-breadcrumb"+a)).each(function(){var t=u(this),i="lay-separator",a=t.attr(i)||"/",e=t.find("a");e.next("span["+i+"]")[0]||(e.each(function(t){t!==e.length-1&&u(this).after(""+a+"")}),t.css("visibility","visible"))})},progress:function(t){var e="layui-progress";(t||u("."+e+a)).each(function(){var t=u(this),i=t.find(".layui-progress-bar"),a=i.attr("lay-percent");i.css("width",function(){return/^.+\/.+$/.test(a)?100*new Function("return "+a)()+"%":a}),t.attr("lay-showpercent")&&setTimeout(function(){i.html(''+a+"")},350)})},collapse:function(t){(t||u(".layui-collapse"+a)).each(function(){u(this).find(".layui-colla-item").each(function(){var t=u(this),i=t.find(".layui-colla-title"),t="none"===t.find(".layui-colla-content").css("display");i.find(".layui-colla-icon").remove(),i.append(''+(t?"":"")+""),i.off("click",w.collapse).on("click",w.collapse)})})}};return t&&"object"==typeof i&&i instanceof u?e[t](i):e[t]?e[t]():layui.each(e,function(t,i){i()})},new i),e=u(document);u(function(){a.render()}),e.on("click",".layui-tab-title li",w.tabClick),u(window).on("resize",w.tabAuto),t(r,a)});layui.define(["lay","layer"],function(e){"use strict";var F=layui.$,a=layui.lay,t=layui.layer,R=layui.device(),i="upload",s="layui_"+i+"_index",w={config:{},index:layui[i]?layui[i].index+1e4:0,set:function(e){var t=this;return t.config=F.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,i,e,t)}},o=function(){var t=this,e=t.config.id;return{upload:function(e){t.upload.call(t,e)},reload:function(e){t.reload.call(t,e)},config:(o.that[e]=t).config}},r="layui-upload-file",l="layui-upload-form",E="layui-upload-iframe",L="layui-upload-choose",T="UPLOADING",D=function(e){var t=this;t.index=++w.index,t.config=F.extend({},t.config,w.config,e),t.render()};D.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",force:"",field:"file",acceptMime:"",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1,text:{"cross-domain":"Cross-domain requests are not supported","data-format-error":"Please return JSON data format","check-error":"",error:"","limit-number":null,"limit-size":null}},D.prototype.reload=function(e){var t=this;t.config=F.extend({},t.config,e),t.render(!0)},D.prototype.render=function(e){var t=this,i=t.config,n=F(i.elem);return 1"].join("")),n=t.elem.next();(n.hasClass(r)||n.hasClass(l))&&n.remove(),R.ie&&R.ie<10&&t.elem.wrap('
                                      '),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(i),R.ie&&R.ie<10&&e.initIE()},D.prototype.initIE=function(){var i,e=this.config,t=F(''),n=F(['
                                      ',"
                                      "].join(""));F("#"+E)[0]||F("body").append(t),e.elem.next().hasClass(l)||(this.elemFile.wrap(n),e.elem.next("."+l).append((i=[],layui.each(e.data,function(e,t){t="function"==typeof t?t():t,i.push('')}),i.join(""))))},D.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},D.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},D.prototype.preview=function(n){window.FileReader&&layui.each(this.chooseFiles,function(e,t){var i=new FileReader;i.readAsDataURL(t),i.onload=function(){n&&n(e,t,this.result)}})},D.prototype.upload=function(e,t){var i,n,a,o,r,u=this,f=u.config,s=f.text||{},l=u.elemFile[0],c=function(){return e||u.files||u.chooseFiles||l.files},d=function(){var a=0,o=0,r=c(),l=function(){f.multiple&&a+o===u.fileLength&&"function"==typeof f.allDone&&f.allDone({total:u.fileLength,successful:a,failed:o})},i=function(i){var n=new FormData,t=function(e){i.unified?layui.each(r,function(e,t){delete t[T]}):delete e[T]};if(layui.each(f.data,function(e,t){t="function"==typeof t?i.unified?t():t(i.index,i.file):t,n.append(e,t)}),i.unified)layui.each(r,function(e,t){t[T]||(t[T]=!0,n.append(f.field,t))});else{if(i.file[T])return;n.append(f.field,i.file),i.file[T]=!0}var e={url:f.url,type:"post",data:n,dataType:f.dataType||"json",contentType:!1,processData:!1,headers:f.headers||{},success:function(e){f.unified?a+=u.fileLength:a++,m(i.index,e),l(i.index),t(i.file)},error:function(e){f.unified?o+=u.fileLength:o++,u.msg(s.error||["Upload failed, please try again.","status: "+(e.status||"")+" - "+(e.statusText||"error")].join("
                                      ")),g(i.index,e.responseText,e),l(i.index),t(i.file)}};"function"==typeof f.progress&&(e.xhr=function(){var e=F.ajaxSettings.xhr();return e.upload.addEventListener("progress",function(e){var t;e.lengthComputable&&(t=Math.floor(e.loaded/e.total*100),f.progress(t,(f.item||f.elem)[0],e,i.index))}),e}),F.ajax(e)};f.unified?i({unified:!0,index:0}):layui.each(r,function(e,t){i({index:e,file:t})})},p=function(){var n=F("#"+E);u.elemFile.parent().submit(),clearInterval(D.timer),D.timer=setInterval(function(){var e,t=n.contents().find("body");try{e=t.text()}catch(i){u.msg(s["cross-domain"]),clearInterval(D.timer),g()}e&&(clearInterval(D.timer),t.html(""),m(0,e))},30)},h=function(e){if("json"===f.force&&"object"!=typeof e)try{return{status:"CONVERTED",data:JSON.parse(e)}}catch(t){return u.msg(s["data-format-error"]),{status:"FORMAT_ERROR",data:{}}}return{status:"DO_NOTHING",data:{}}},m=function(e,t){u.elemFile.next("."+L).remove(),l.value="";var i=h(t);switch(i.status){case"CONVERTED":t=i.data;break;case"FORMAT_ERROR":return}"function"==typeof f.done&&f.done(t,e||0,function(e){u.upload(e)})},g=function(e,t,i){f.auto&&(l.value="");var n=h(t);switch(n.status){case"CONVERTED":t=n.data;break;case"FORMAT_ERROR":return}"function"==typeof f.error&&f.error(e||0,function(e){u.upload(e)},t,i)},v=f.exts,y=(n=[],layui.each(e||u.chooseFiles,function(e,t){n.push(t.name)}),n),x={preview:function(e){u.preview(e)},upload:function(e,t){var i={};i[e]=t,u.upload(i)},pushFile:function(){return u.files=u.files||{},layui.each(u.chooseFiles,function(e,t){u.files[e]=t}),u.files},resetFile:function(e,t,i){t=new File([t],i);u.files=u.files||{},u.files[e]=t},getChooseFiles:function(){return u.chooseFiles}},b={file:"\u6587\u4ef6",images:"\u56fe\u7247",video:"\u89c6\u9891",audio:"\u97f3\u9891"}[f.accept]||"\u6587\u4ef6",y=0===y.length?l.value.match(/[^\/\\]+\..+/g)||[]:y;if(0!==y.length){switch(f.accept){case"file":layui.each(y,function(e,t){if(v&&!RegExp(".\\.("+v+")$","i").test(escape(t)))return i=!0});break;case"video":layui.each(y,function(e,t){if(!RegExp(".\\.("+(v||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(t)))return i=!0});break;case"audio":layui.each(y,function(e,t){if(!RegExp(".\\.("+(v||"mp3|wav|mid")+")$","i").test(escape(t)))return i=!0});break;default:layui.each(y,function(e,t){if(!RegExp(".\\.("+(v||"jpg|png|gif|bmp|jpeg|svg|webp")+")$","i").test(escape(t)))return i=!0})}if(i)return u.msg(s["check-error"]||"\u9009\u62e9\u7684"+b+"\u4e2d\u5305\u542b\u4e0d\u652f\u6301\u7684\u683c\u5f0f"),l.value="";if("choose"!==t&&!f.auto||(f.choose&&f.choose(x),"choose"!==t)){if(u.fileLength=(a=0,b=c(),layui.each(b,function(){a++}),a),f.number&&u.fileLength>f.number)return u.msg("function"==typeof s["limit-number"]?s["limit-number"](f,u.fileLength):"\u540c\u65f6\u6700\u591a\u53ea\u80fd\u4e0a\u4f20: "+f.number+" \u4e2a\u6587\u4ef6
                                      \u60a8\u5f53\u524d\u5df2\u7ecf\u9009\u62e9\u4e86: "+u.fileLength+" \u4e2a\u6587\u4ef6");if(01024*f.size&&(t=1<=(t=f.size/1024)?t.toFixed(2)+"MB":f.size+"KB",l.value="",o=t)}),o)return u.msg("function"==typeof s["limit-size"]?s["limit-size"](f,o):"\u6587\u4ef6\u5927\u5c0f\u4e0d\u80fd\u8d85\u8fc7 "+o);r=function(){if(R.ie)return(9'+e+"")},l=function(i){var n=!0;return layui.each(a.files,function(e,t){if(!(n=!(t.name===i.name)))return!0}),n},u=function(e){var i=function(e){e.ext=e.name.substr(e.name.lastIndexOf(".")+1).toLowerCase(),e.sizes=w.util.parseSize(e.size)};return e instanceof FileList?layui.each(e,function(e,t){i(t)}):i(e),e},f=function(e){var i;return(e=e||[]).length?a.files?(i=[],layui.each(e,function(e,t){l(t)&&i.push(u(t))}),i):u(e):[]};n.elem.off("upload.start").on("upload.start",function(){var e=F(this);a.config.item=e,a.elemFile[0].click()}),R.ie&&R.ie<10||n.elem.off("upload.over").on("upload.over",function(){F(this).attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){F(this).removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(e,t){var i=F(this),t=f(t.originalEvent.dataTransfer.files);i.removeAttr("lay-over"),o(t),n.auto?a.upload():r(t)}),a.elemFile.on("change",function(){var e=f(this.files);0!==e.length&&(o(e),n.auto?a.upload():r(e))}),n.bindAction.off("upload.action").on("upload.action",function(){a.upload()}),n.elem.data(s)||(n.elem.on("click",function(){a.isFile()||F(this).trigger("upload.start")}),n.drag&&n.elem.on("dragover",function(e){e.preventDefault(),F(this).trigger("upload.over")}).on("dragleave",function(e){F(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),F(this).trigger("upload.drop",e)}),n.bindAction.on("click",function(){F(this).trigger("upload.action")}),n.elem.data(s,n.id))},w.util={parseSize:function(e,t){var i,n;return t=t||2,null!=e&&e?(i="string"==typeof e?parseFloat(e):e,n=Math.floor(Math.log(i)/Math.log(1024)),(e=(e=i/Math.pow(1024,n))%1==0?e:parseFloat(e.toFixed(t)))+["Bytes","Kb","Mb","Gb","Tb","Pb","Eb","Zb","Yb"][n]):"0"},promiseLikeResolve:function(e){var t=F.Deferred();return e&&"function"==typeof e.then?e.then(t.resolve,t.reject):t.resolve(e),t.promise()}},o.that={},o.getThis=function(e){var t=o.that[e];return t||hint.error(e?i+" instance with ID '"+e+"' not found":"ID argument required"),t},w.render=function(e){e=new D(e);return o.call(e)},e(i,w)});layui.define(["lay","layer","util"],function(e){"use strict";var T=layui.$,h=layui.layer,d=layui.util,l=layui.hint(),_=(layui.device(),"form"),p=".layui-form",E="layui-this",O="layui-hide",A="layui-disabled",y="layui-input-number-invalid",f=lay.ie&&8===parseFloat(lay.ie)||void 0===Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,"checked"),t=function(){this.config={verify:{required:function(e){if(!/[\S]+/.test(e)||e===undefined||null===e)return"\u5fc5\u586b\u9879\u4e0d\u80fd\u4e3a\u7a7a"},phone:function(e){if(e&&!/^1\d{10}$/.test(e))return"\u624b\u673a\u53f7\u683c\u5f0f\u4e0d\u6b63\u786e"},email:function(e){if(e&&!/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(e))return"\u90ae\u7bb1\u683c\u5f0f\u4e0d\u6b63\u786e"},url:function(e){if(e&&!/^(#|(http(s?)):\/\/|\/\/)[^\s]+\.[^\s]+$/.test(e))return"\u94fe\u63a5\u683c\u5f0f\u4e0d\u6b63\u786e"},number:function(e){if(e&&isNaN(e))return"\u53ea\u80fd\u586b\u5199\u6570\u5b57"},date:function(e){if(e&&!/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/.test(e))return"\u65e5\u671f\u683c\u5f0f\u4e0d\u6b63\u786e"},identity:function(e){if(e&&!/(^\d{15}$)|(^\d{17}(x|X|\d)$)/.test(e))return"\u8eab\u4efd\u8bc1\u53f7\u683c\u5f0f\u4e0d\u6b63\u786e"}},autocomplete:null}},i=(t.prototype.set=function(e){return T.extend(!0,this.config,e),this},t.prototype.verify=function(e){return T.extend(!0,this.config.verify,e),this},t.prototype.getFormElem=function(e){return T(p+(e?'[lay-filter="'+e+'"]':""))},t.prototype.on=function(e,t){return layui.onevent.call(this,_,e,t)},t.prototype.val=function(e,o){return this.getFormElem(e).each(function(e,t){var i,a,n,l,r=T(this);for(i in o)lay.hasOwn(o,i)&&(n=o[i],(l=r.find('[name="'+i+'"]'))[0])&&("checkbox"===(a=l[0].type)?l[0].checked=n:"radio"===a?l.each(function(){this.checked=this.value==n+""}):l.val(n))}),r.render(null,e),this.getValue(e)},t.prototype.getValue=function(e,t){t=t||this.getFormElem(e);var n={},l={},e=t.find("input,select,textarea");return layui.each(e,function(e,t){var i,a=T(this);t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name&&(/^.*\[\]$/.test(t.name)&&(i=t.name.match(/^(.*)\[\]$/g)[0],n[i]=0|n[i],i=t.name.replace(/^(.*)\[\]$/,"$1["+n[i]+++"]")),/^(checkbox|radio)$/.test(t.type)&&!t.checked||(l[i||t.name]="SELECT"===this.tagName&&"string"==typeof this.getAttribute("multiple")?a.val()||[]:this.value))}),l},t.prototype.render=function(e,t){var u=this,i=u.config,a=T(p+(t?'[lay-filter="'+t+'"]':"")),n={input:function(e){var e=e||a.find("input,textarea"),h=(i.autocomplete&&e.attr("autocomplete",i.autocomplete),function(e,t){var i=e.val(),a=Number(i),n=Number(e.attr("step"))||1,l=Number(e.attr("min")),r=Number(e.attr("max")),o=Number(e.attr("lay-precision")),s="click"!==t&&""===i,c="init"===t,u=isNaN(a),d="string"==typeof e.attr("lay-step-strictly");if(e.toggleClass(y,u),!u){if("click"===t){if("text"===e[0].type&&"string"==typeof e.attr("readonly"))return;a=!!T(this).index()?a-n:a+n}u=function(e){return((e.toString().match(/\.(\d+$)/)||[])[1]||"").length},o=0<=o?o:Math.max(u(n),u(i));s||(c||r<=(a=(a=d?Math.round(a/n)*n:a)<=l?l:a)&&(a=r),0===o?a=parseInt(a):0'),e=layui.isArray(i.value)?i.value:[i.value],e=T((a=[],layui.each(e,function(e,t){a.push('')}),a.join(""))),n=(t.append(e),i.split&&t.addClass("layui-input-split"),i.className&&t.addClass(i.className),r.next("."+u)),l=(n[0]&&n.remove(),r.parent().hasClass(s)||r.wrap('
                                      '),r.next("."+c));l[0]?((n=l.find("."+u))[0]&&n.remove(),l.prepend(t),r.css("padding-right",function(){return(r.closest(".layui-input-group")[0]?0:l.outerWidth())+t.outerWidth()})):(t.addClass(c),r.after(t)),"auto"===i.show&&d(t,r.val()),"function"==typeof i.init&&i.init.call(this,r,i),r.on("input propertychange",function(){var e=this.value;"auto"===i.show&&d(t,e)}),r.on("blur",function(){"function"==typeof i.blur&&i.blur.call(this,r,i)}),e.on("click",function(){var e=r.attr("lay-filter");T(this).hasClass(A)||("function"==typeof i.click&&i.click.call(this,r,i),layui.event.call(this,_,"input-affix("+e+")",{elem:r[0],affix:o,options:i}))})},p={eye:{value:"eye-invisible",click:function(e,t){var i="LAY_FORM_INPUT_AFFIX_SHOW",a=e.data(i);e.attr("type",a?"password":"text").data(i,!a),n({value:a?"eye-invisible":"eye"})}},clear:{value:"clear",click:function(e){e.val("").focus(),d(T(this).parent(),null)},show:"auto",disabled:e},number:{value:["up","down"],split:!0,className:"layui-input-number",disabled:r.is("[disabled]"),init:function(a){var e,n,l,t,i,r;"text"!==a.attr("type")&&"text"!==a[0].type||(l=n=!(e=".lay_input_number"),t="string"==typeof a.attr("readonly"),i="string"==typeof a.attr("lay-wheel"),r=a.next(".layui-input-number").children("i"),a.attr("lay-input-mirror",a.val()),a.off(e),a.on("keydown"+e,function(e){n=!1,8!==e.keyCode&&46!==e.keyCode||(n=!0),t||2!==r.length||38!==e.keyCode&&40!==e.keyCode||(e.preventDefault(),r.eq(38===e.keyCode?0:1).click())}),a.on("input"+e+" propertychange"+e,function(e){var t,i;l||"propertychange"===e.type&&"value"!==e.originalEvent.propertyName||(n||""===(e=this.value)||"00"!==e.slice(0,2)&&!e.match(/\s/g)&&!((t=e.match(/\./g))&&1=Math.abs(e.deltaY)?e.deltaX:e.deltaY):"mousewheel"===e.type?t=-e.originalEvent.wheelDelta:"DOMMouseScroll"===e.type&&(t=e.originalEvent.detail),r.eq(0S.height()&&t<=e&&l.addClass(C+"up"),h(),s&&g.off("mousedown.lay_select_ieph").on("mousedown.lay_select_ieph",function(){m[0].__ieph=!0,setTimeout(function(){m[0].__ieph=!1},60)}),n=lay.onClickOutside((a?l:g)[0],function(){p(),k&&m.val(k)},{ignore:v,detectIframe:!0,capture:!1})},p=function(e){v.parent().removeClass(C+"ed "+C+"up"),m.blur(),u&&g.children("."+N).remove(),"function"==typeof n&&(n(),n=null),a&&(l.detach(),T(window).off("resize.lay_select_resize")),e||y(m.val(),function(e){var t=f[0].selectedIndex;e&&(k=T(f[0].options[t]).prop("text"),0===t&&k===m.attr("placeholder")&&(k=""),m.val(k||""))})},h=function(){var e,t,i=g.children("dd."+E);i[0]&&(e=i.position().top,t=g.height(),i=i.height(),t").addClass(N).attr("lay-value",n).text(n),a=(i=g.children().eq(0)).hasClass("layui-select-tips"),i[a?"after":"before"](t)):e?g.find("."+w)[0]||g.append('

                                      \u65e0\u5339\u914d\u9879

                                      '):g.find("."+w).remove()},"keyup"),""===n&&(f.val(""),g.find("."+E).removeClass(E),(f[0].options[0]||{}).value||g.children("dd:eq(0)").addClass(E),g.find("."+w).remove(),u)&&g.children("."+N).remove(),void h()))},50)).on("blur",function(e){var t=f[0].selectedIndex;k=T(f[0].options[t]).prop("text"),0===t&&k===m.attr("placeholder")&&(k=""),setTimeout(function(){y(m.val(),function(e){k||m.val("")},"blur")},200)}),g.on("click","dd",function(){var e,t,i=T(this),a=i.attr("lay-value"),n=f.attr("lay-filter");return i.hasClass(A)||(u&&i.hasClass(N)&&(t=(e=T("
                                      "].join(""));i.after(l),function(t,i){var a=T(this),e=a.attr("lay-skin")||"primary",n="switch"===e,e="primary"===e;t.on("click",function(){var e=a.attr("lay-filter");a[0].disabled||(a[0].indeterminate&&(a[0].indeterminate=!1),a[0].checked=!a[0].checked,layui.event.call(a[0],_,i[2]+"("+e+")",{elem:a[0],value:a[0].value,othis:t}))}),u.syncAppearanceOnPropChanged(this,"checked",function(){var e;n&&(e=(t.next("*[lay-checkbox]")[0]?t.next().html():a.attr("title")||"").split("|"),t.children("div").html(!this.checked&&e[1]||e[0])),t.toggleClass(i[1],this.checked)}),e&&u.syncAppearanceOnPropChanged(this,"indeterminate",function(){this.indeterminate?t.children(".layui-icon-ok").removeClass("layui-icon-ok").addClass(c.SUBTRA):t.children("."+c.SUBTRA).removeClass(c.SUBTRA).addClass("layui-icon-ok")})}.call(this,l,r)})},radio:function(e){var s="layui-form-radio",c=["layui-icon-radio","layui-icon-circle"],e=e||a.find("input[type=radio]");e.each(function(e,t){var i=T(this),a=i.next("."+s),n=this.disabled,l=i.attr("lay-skin");if(i.closest("[lay-ignore]").length)return i.show();f&&v.call(t,"lay-form-sync-checked",t.checked),a[0]&&a.remove();var a=d.escape(t.title||""),r=[],o=(i.next("[lay-radio]")[0]&&(a=(o=i.next()).html()||"",1",'',"
                                      "+a+"
                                      ","
                                      "].join("")));i.after(o),function(i){var a=T(this),n="layui-anim-scaleSpring";i.on("click",function(){var e=a.attr("lay-filter");a[0].disabled||(a[0].checked=!0,layui.event.call(a[0],_,"radio("+e+")",{elem:a[0],value:a[0].value,othis:i}))}),u.syncAppearanceOnPropChanged(this,"checked",function(){var e,t=this;t.checked?(i.addClass(s+"ed"),i.children(".layui-icon").addClass(n+" "+c[0]),e=a.parents(p).find("input[name="+t.name.replace(/(\.|#|\[|\])/g,"\\$1")+"]"),layui.each(e,function(){t!==this&&(this.checked=!1)})):(i.removeClass(s+"ed"),i.children(".layui-icon").removeClass(n+" "+c[0]).addClass(c[1]))})}.call(this,o)})}},t=function(){layui.each(n,function(e,t){t()})};return"object"===layui.type(e)?T(e).is(p)?(a=T(e),t()):e.each(function(e,t){var i=T(t);i.closest(p).length&&("SELECT"===t.tagName?n.select(i):"INPUT"===t.tagName&&("checkbox"===(t=t.type)||"radio"===t?n[t](i):n.input(i)))}):e?n[e]?n[e]():l.error('\u4e0d\u652f\u6301\u7684 "'+e+'" \u8868\u5355\u6e32\u67d3'):t(),u},t.prototype.syncAppearanceOnPropChanged=f?function(e,t,i){var a=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,t);Object.defineProperty(e,t,lay.extend({},a,{get:function(){return"string"==typeof this.getAttribute("lay-form-sync-"+t)},set:function(e){v.call(this,"lay-form-sync-"+t,e),i.call(this)}}))}:function(e,t,i){var a=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,t);Object.defineProperty(e,t,lay.extend({},a,{get:function(){return a.get.call(this)},set:function(e){a.set.call(this,e),i.call(this)}}))},t.prototype.validate=function(e){var u,d=this.config.verify,p="layui-form-danger";return!(e=T(e))[0]||(e.attr("lay-verify")!==undefined||!1!==this.validate(e.find("*[lay-verify]")))&&(layui.each(e,function(e,r){var o=T(this),t=(o.attr("lay-verify")||"").split("|"),s=o.attr("lay-vertype"),c="string"==typeof(c=o.val())?T.trim(c):c;if(o.removeClass(p),layui.each(t,function(e,t){var i="",a=d[t];if(a){var n="function"==typeof a?i=a(c,r):!a[0].test(c),l="select"===r.tagName.toLowerCase()||/^(checkbox|radio)$/.test(r.type),i=i||a[1];if("required"===t&&(i=o.attr("lay-reqtext")||i),n)return"tips"===s?h.tips(i,!o.closest("[lay-ignore]").length&&l?o.next():o,{tips:1}):"alert"===s?h.alert(i,{title:"\u63d0\u793a",shadeClose:!0}):/\b(string|number)\b/.test(typeof i)&&h.msg(i,{icon:5,shift:6}),setTimeout(function(){(l?o.next().find("input"):r).focus()},7),o.addClass(p),u=!0}}),u)return u}),!u)},t.prototype.submit=function(e,t){var i={},a=T(this),e="string"==typeof e?e:a.attr("lay-filter"),n=this.getFormElem?this.getFormElem(e):a.parents(p).eq(0),l=n.find("*[lay-verify]");return!!r.validate(l)&&(i=r.getValue(null,n),l={elem:this.getFormElem?window.event&&window.event.target:this,form:(this.getFormElem?n:a.parents("form"))[0],field:i},"function"==typeof t&&t(l),layui.event.call(this,_,"submit("+e+")",l))});function v(e,t){var i=!!t,t=2===arguments.length&&!t;return null!==this.getAttribute(e)?i||(this.removeAttribute(e),!1):!t&&(this.setAttribute(e,""),!0)}var m=["-",".","e","E","+"];var r=new t,t=T(document),S=T(window);T(function(){r.render()}),t.on("reset",p,function(){var e=T(this).attr("lay-filter");setTimeout(function(){r.render(null,e)},50)}),t.on("submit",p,i).on("click","*[lay-submit]",i),e(_,r)});layui.define(["lay","laytpl","laypage","form","util"],function(s){"use strict";var f=layui.$,r=layui.lay,m=layui.laytpl,p=layui.laypage,g=layui.layer,i=layui.form,v=layui.util,b=layui.hint(),x=layui.device(),k={config:{checkName:"LAY_CHECKED",indexName:"LAY_INDEX",initIndexName:"LAY_INDEX_INIT",numbersName:"LAY_NUM",disabledName:"LAY_DISABLED"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){return this.config=f.extend({},this.config,e),this},on:function(e,t){return layui.onevent.call(this,R,e,t)}},w=function(){var a=this,e=a.config,i=e.id||e.index;return{config:e,reload:function(e,t){a.reload.call(a,e,t)},reloadData:function(e,t){k.reloadData(i,e,t)},setColsWidth:function(){a.setColsWidth.call(a)},resize:function(){a.resize.call(a)}}},C=function(e){var t=w.that[e];return t||b.error(e?"The table instance with ID '"+e+"' not found":"ID argument required"),t||null},l=function(e){var t=w.config[e];return t||b.error(e?"The table instance with ID '"+e+"' not found":"ID argument required"),t||null},T=function(e){var t=this.config||{},a=(e=e||{}).item3,i=e.content;"numbers"===a.type&&(i=e.tplData[k.config.numbersName]);("escape"in a?a:t).escape&&(i=v.escape(i));t=e.text&&a.exportTemplet||a.templet||a.toolbar;return t&&(i="function"==typeof t?t.call(a,e.tplData,e.obj):m(function(e){try{return r(e).html()}catch(t){return e}}(t)||String(i)).render(f.extend({LAY_COL:a},e.tplData))),e.text?f("
                                      "+i+"
                                      ").text():i},R="table",N="lay-"+R+"-id",t=".layui-table",W="layui-hide",y="layui-hide-v",h="layui-none",_="layui-table-view",o=".layui-table-header",D=".layui-table-body",I=".layui-table-fixed-r",P=".layui-table-pageview",L=".layui-table-sort",A="layui-table-checked",E="layui-table-edit",M="layui-table-hover",u="laytable-cell-group",F="layui-table-col-special",S="layui-table-tool-panel",H="layui-table-expanded",O="layui-table-disabled-transition",j="LAY_TABLE_MOVE_DICT",e=function(e){return['',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',(e=e||{}).fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':"","{{# var isSort = !(item2.colGroup) && item2.sort; }}",'",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
                                      ','
                                      ','{{# if(item2.type === "checkbox"){ }}','',"{{# } else { }}",'{{-item2.title||""}}',"{{# if(isSort){ }}",'',"{{# } }}","{{# } }}","
                                      ","
                                      "].join("")},a=['',"","
                                      "].join(""),B=[,"{{# if(d.data.toolbar){ }}",'
                                      ','
                                      ','
                                      ',"
                                      ","{{# } }}",'
                                      ',"{{# if(d.data.loading){ }}",'
                                      ','
                                      ','{{# if(typeof d.data.loading === "string"){ }}',"{{- d.data.loading}}","{{# } else{ }}",'',"{{# } }}","
                                      ","
                                      ","{{# } }}","{{# var left, right; }}",'
                                      ',e(),"
                                      ",'
                                      ',a,"
                                      ","{{# if(left){ }}",'
                                      ','
                                      ',e({fixed:!0}),"
                                      ",'
                                      ',a,"
                                      ","
                                      ","{{# }; }}","{{# if(right){ }}",'
                                      ','
                                      ',e({fixed:"right"}),'
                                      ',"
                                      ",'
                                      ',a,"
                                      ","
                                      ","{{# }; }}","
                                      ","{{# if(d.data.totalRow){ }}",'
                                      ','','',"
                                      ","
                                      ","{{# } }}",'
                                      ','
                                      ',"
                                      "].join(""),d=f(window),z=f(document),n=function(e){this.index=++k.index,this.config=f.extend({},this.config,k.config,e),this.render()},c=(n.prototype.config={limit:10,loading:!0,escape:!0,cellMinWidth:60,cellMaxWidth:Number.MAX_VALUE,editTrigger:"click",defaultToolbar:["filter","exports","print"],defaultContextmenu:!0,autoSort:!0,text:{none:"\u65e0\u6570\u636e"},cols:[]},n.prototype.render=function(e){var t=this,a=t.config,i=(a.elem=f(a.elem),a.where=a.where||{},a.id="id"in a?a.id:a.elem.attr("id")||t.index);if(w.that[i]=t,(w.config[i]=a).request=f.extend({pageName:"page",limitName:"limit"},a.request),a.response=f.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",totalRowName:"totalRow",countName:"count"},a.response),null!==a.page&&"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,t.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return t;if(a.elem.attr("lay-filter")||a.elem.attr("lay-filter",a.id),"reloadData"===e)return t.pullData(t.page,{type:"reloadData"});a.index=t.index,t.key=a.id||a.index,t.setInit(),a.height&&/^full-.+$/.test(a.height)?(t.fullHeightGap=a.height.split("-")[1],a.height=d.height()-(parseFloat(t.fullHeightGap)||0)):a.height&&/^#\w+\S*-.+$/.test(a.height)?(i=a.height.split("-"),t.parentHeightGap=i.pop(),t.parentDiv=i.join("-"),a.height=f(t.parentDiv).height()-(parseFloat(t.parentHeightGap)||0)):"function"==typeof a.height&&(t.customHeightFunc=a.height,a.height=t.customHeightFunc());var l,e=a.elem,i=e.next("."+_),n=t.elem=f("
                                      ");n.addClass((l=[_,_+"-"+t.index,"layui-form","layui-border-box"],a.className&&l.push(a.className),l.join(" "))).attr(((l={"lay-filter":"LAY-TABLE-FORM-DF-"+t.index,style:(l=[],a.width&&l.push("width:"+a.width+"px;"),l.join(""))})[N]=a.id,l)).html(m(B,{open:"{{",close:"}}",tagStyle:"legacy"}).render({data:a,index:t.index})),t.renderStyle(),i[0]&&i.remove(),e.after(n),t.layTool=n.find(".layui-table-tool"),t.layBox=n.find(".layui-table-box"),t.layHeader=n.find(o),t.layMain=n.find(".layui-table-main"),t.layBody=n.find(D),t.layFixed=n.find(".layui-table-fixed"),t.layFixLeft=n.find(".layui-table-fixed-l"),t.layFixRight=n.find(I),t.layTotal=n.find(".layui-table-total"),t.layPage=n.find(".layui-table-page"),t.renderToolbar(),t.renderPagebar(),t.fullSize(),t.setColsWidth({isInit:!0}),t.pullData(t.page),t.events()},n.prototype.initOpts=function(e){this.config;e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||{checkbox:50,radio:50,space:30,numbers:60}[e.type])},n.prototype.setInit=function(e){var n,a,d=this,r=d.config;if(r.clientWidth=r.width||(n=function(e){var t,a;e=e||r.elem.parent(),t=d.getContentWidth(e);try{a="none"===e.css("display")}catch(l){}var i=e.parent();return e[0]&&i&&i[0]&&(!t||a)?n(i):t})(),"width"===e)return r.clientWidth;r.height=r.maxHeight||r.height,r.css&&-1===r.css.indexOf(_)&&(a=r.css.split("}"),layui.each(a,function(e,t){t&&(a[e]="."+_+"-"+d.index+" "+t)}),r.css=a.join("}"));var c=function(a,e,i,l){var n,o;l?(l.key=[r.index,a,i].join("-"),l.colspan=l.colspan||0,l.rowspan=l.rowspan||0,d.initOpts(l),(n=a+(parseInt(l.rowspan)||1)) td:hover > .layui-table-cell{overflow: auto;}"].concat(x.ie?[".layui-table-edit{height: "+i+";}","td[data-edit]:hover:after{height: "+i+";}"]:[]),function(e,t){t&&o.push(a+" "+t)})),l.css&&o.push(l.css),r.style({target:this.elem[0],text:o.join(""),id:"DF-table-"+n})},n.prototype.renderToolbar=function(){var l,o=this,e=o.config,d=e.elem.attr("lay-filter"),t=['
                                      ','
                                      ','
                                      '].join(""),a=o.layTool.find(".layui-table-tool-temp"),n=("default"===e.toolbar?a.html(t):"string"==typeof e.toolbar&&(t=f(e.toolbar).html()||"")&&a.html(m(t).render(e)),{filter:{title:"\u7b5b\u9009\u5217",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols",onClick:function(e){var a,n=e.config;(0,e.openPanel)({list:(a=[],o.eachCols(function(e,t){t.field&&"normal"==t.type&&a.push('
                                    • "+(t.fieldTitle||t.title||t.field)+"
                                    • ").text())+'" lay-filter="LAY_TABLE_TOOL_COLS">')}),a.join("")),done:function(){i.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var e=f(e.elem),t=this.checked,a=e.data("key"),i=o.col(a),l=i.hide,e=e.data("parentkey");i.key&&(i.hide=!t,o.elem.find('*[data-key="'+a+'"]')[t?"removeClass":"addClass"](W),l!=i.hide&&o.setParentCol(!t,e),o.resize(),layui.event.call(this,R,"colToggled("+d+")",{col:i,config:n}))})}})}},exports:{title:"\u5bfc\u51fa",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export",onClick:function(e){var t=e.data,a=e.config,i=e.openPanel,e=e.elem;if(!t.length)return g.tips("\u5f53\u524d\u8868\u683c\u65e0\u6570\u636e",e,{tips:3});x.ie?g.tips("\u5bfc\u51fa\u529f\u80fd\u4e0d\u652f\u6301 IE\uff0c\u8bf7\u7528 Chrome \u7b49\u9ad8\u7ea7\u6d4f\u89c8\u5668\u5bfc\u51fa",e,{tips:3}):i({list:['
                                    • \u5bfc\u51fa CSV \u6587\u4ef6
                                    • '].join(""),done:function(e,t){t.on("click",function(){var e=f(this).data("type");k.exportFile.call(o,a.id,null,e)})}})}},print:{title:"\u6253\u5370",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print",onClick:function(e){var t=e.data;if(!t.length)return g.tips("\u5f53\u524d\u8868\u683c\u65e0\u6570\u636e",e.elem,{tips:3});var t=window.open("about:blank","_blank"),e=[""].join(""),a=f(o.layHeader.html());a.append(o.layMain.find("table").html()),a.append(o.layTotal.find("table").html()),a.find("th.layui-table-patch").remove(),a.find("thead>tr>th."+F).filter(function(e,t){return!f(t).children("."+u).length}).remove(),a.find("tbody>tr>td."+F).remove(),t.document.write(e+a.prop("outerHTML")),t.document.close(),layui.device("edg").edg?(t.onafterprint=t.close,t.print()):(t.print(),t.close())}}});"object"==typeof e.defaultToolbar&&(l=[],e.defaultToolbar=f.map(e.defaultToolbar,function(e,t){var a="string"==typeof e,i=a?n[e]:e;return i&&(!(i=i.name&&n[i.name]?f.extend({},n[i.name],i):i).name&&a&&(i.name=e),l.push('
                                      ')),i}),o.layTool.find(".layui-table-tool-self").html(l.join("")))},n.prototype.renderPagebar=function(){var e,t=this.config,a=this.layPagebar=f('
                                      ');t.pagebar&&((e=f(t.pagebar).html()||"")&&a.append(m(e).render(t)),this.layPage.append(a))},n.prototype.setParentCol=function(e,t){var a=this.config,i=this.layHeader.find('th[data-key="'+t+'"]'),l=parseInt(i.attr("colspan"))||0;i[0]&&(t=t.split("-"),t=a.cols[t[1]][t[2]],e?l--:l++,i.attr("colspan",l),i[l?"removeClass":"addClass"](W),t.colspan2=l,t.hide=l<1,a=i.data("parentkey"))&&this.setParentCol(e,a)},n.prototype.setColsPatch=function(){var a=this,e=a.config;layui.each(e.cols,function(e,t){layui.each(t,function(e,t){t.hide&&a.setParentCol(t.hide,t.parentKey)})})},n.prototype.setGroupWidth=function(i){var e,l=this;l.config.cols.length<=1||((e=l.layHeader.find((i?"th[data-key="+i.data("parentkey")+"]>":"")+"."+u)).css("width",0),layui.each(e.get().reverse(),function(){var e=f(this),t=e.parent().data("key"),a=0;l.layHeader.eq(0).find("th[data-parentkey="+t+"]").width(function(e,t){f(this).hasClass(W)||0o.layMain.prop("clientHeight")&&(e.style.width=parseFloat(e.style.width)-i+"px")}),!p&&h?y.width(o.getContentWidth(l)):y.width("auto"),o.setGroupWidth()},n.prototype.resize=function(){var e=this;e.layMain&&("isConnected"in e.layMain[0]?e.layMain[0].isConnected:f.contains(document.body,e.layMain[0]))&&(e.fullSize(),e.setColsWidth(),e.scrollPatch())},n.prototype.reload=function(e,t,a){var i=this;e=e||{},delete i.haveInit,layui.each(e,function(e,t){"array"===layui.type(t)&&delete i.config[e]}),i.config=f.extend(t,{},i.config,e),"reloadData"!==a&&(layui.each(i.config.cols,function(e,t){layui.each(t,function(e,t){delete t.colspan2})}),delete i.config.HAS_SET_COLS_PATCH),i.render(a)},n.prototype.errorView=function(e){var t=this,a=t.layMain.find("."+h),e=f('
                                      '+(e||"Error")+"
                                      ");a[0]&&(t.layNone.remove(),a.remove()),t.layFixed.addClass(W),t.layMain.find("tbody").html(""),t.layMain.append(t.layNone=e),t.layTotal.addClass(y),t.layPage.find(P).addClass(y),k.cache[t.key]=[],t.syncCheckAll(),t.renderForm(),t.setColsWidth(),t.loading(!1)},n.prototype.page=1,n.prototype.pullData=function(i,l){var e,t,n=this,o=n.config,a=(o.HAS_SET_COLS_PATCH||n.setColsPatch(),o.HAS_SET_COLS_PATCH=!0,o.request),d=o.response,r=function(){"object"==typeof o.initSort&&n.sort({field:o.initSort.field,type:o.initSort.type,reloadType:l.type})},c=function(e,t){n.setColsWidth(),n.loading(!1),"function"==typeof o.done&&o.done(e,i,e[d.countName],t)};l=l||{},"function"==typeof o.before&&o.before(o),n.startTime=(new Date).getTime(),l.renderData?((e={})[d.dataName]=k.cache[n.key],e[d.countName]=o.url?"object"===layui.type(o.page)?o.page.count:e[d.dataName].length:o.data.length,"object"==typeof o.totalRow&&(e[d.totalRowName]=f.extend({},n.totalRow)),n.renderData({res:e,curr:i,count:e[d.countName],type:l.type,sort:!0}),c(e,"renderData")):o.url?(t={},o.page&&(t[a.pageName]=i,t[a.limitName]=o.limit),a=f.extend(t,o.where),o.contentType&&0==o.contentType.indexOf("application/json")&&(a=JSON.stringify(a)),n.loading(!0),n._xhr&&4!==n._xhr.readyState&&(n._xhrAbort=!0,n._xhr.abort()),n._xhr=f.ajax({type:o.method||"get",url:o.url,contentType:o.contentType,data:a,dataType:o.dataType||"json",jsonpCallback:o.jsonpCallback,headers:o.headers||{},complete:"function"==typeof o.complete?o.complete:undefined,success:function(e){var t,a;(e="function"==typeof o.parseData?o.parseData(e)||e:e)[d.statusName]!=d.statusCode?n.errorView(e[d.msgName]||'\u8fd4\u56de\u7684\u6570\u636e\u4e0d\u7b26\u5408\u89c4\u8303\uff0c\u6b63\u786e\u7684\u6210\u529f\u72b6\u6001\u7801\u5e94\u4e3a\uff1a"'+d.statusName+'": '+d.statusCode):(t=e[d.countName],(a=Math.ceil(t/o.limit)||1)','
                                      "+function(){var e,t=f.extend(!0,{LAY_COL:l},o),a=k.config.checkName,i=k.config.disabledName;switch(l.type){case"checkbox":return'';case"radio":return'';case"numbers":return c}return l.toolbar?m(f(l.toolbar).html()||"").render(t):T.call(s,{item3:l,content:n,tplData:t})}(),"
                                      "].join(""),i.push(e),l.fixed&&"right"!==l.fixed&&d.push(e),"right"===l.fixed&&r.push(e))}),e=['data-index="'+e+'"'],o[k.config.checkName]&&e.push('class="'+A+'"'),e=e.join(" "),y.push(""+i.join("")+""),h.push(""+d.join("")+""),p.push(""+r.join("")+""))}),{trs:y,trs_fixed:h,trs_fixed_r:p}},k.getTrHtml=function(e,t){e=C(e);return e.getTrHtml(t,null,e.page)},n.prototype.renderData=function(e){var a=this,i=a.config,t=e.res,l=e.curr,n=a.count=e.count,o=e.sort,d=t[i.response.dataName]||[],t=t[i.response.totalRowName],r=[],c=[],s=[],u=function(){if(!o&&a.sortKey)return a.sort({field:a.sortKey.field,type:a.sortKey.sort,pull:!0,reloadType:e.type});a.getTrHtml(d,o,l,{trs:r,trs_fixed:c,trs_fixed_r:s}),"fixed"===i.scrollPos&&"reloadData"===e.type||a.layBody.scrollTop(0),"reset"===i.scrollPos&&a.layBody.scrollLeft(0),a.layMain.find("."+h).remove(),a.layMain.find("tbody").html(r.join("")),a.layFixLeft.find("tbody").html(c.join("")),a.layFixRight.find("tbody").html(s.join("")),a.syncCheckAll(),a.renderForm(),a.fullSize(),a.haveInit?a.scrollPatch():setTimeout(function(){a.scrollPatch()},50),a.haveInit=!0,g.close(a.tipsIndex)};return k.cache[a.key]=d,a.layTotal[0==d.length?"addClass":"removeClass"](y),a.layPage[i.page||i.pagebar?"removeClass":"addClass"](W),a.layPage.find(P)[!i.page||0==n||0===d.length&&1==l?"addClass":"removeClass"](y),0===d.length?a.errorView(i.text.none):(a.layFixLeft.removeClass(W),o?u():(u(),a.renderTotal(d,t),a.layTotal&&a.layTotal.removeClass(W),void(i.page&&(i.page=f.extend({elem:"layui-table-page"+i.index,count:n,limit:i.limit,limits:i.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(a.page=e.curr,i.limit=e.limit,a.pullData(e.curr))}},i.page),i.page.count=n,p.render(i.page)))))},k.renderData=function(e){e=C(e);e&&e.pullData(e.page,{renderData:!0,type:"reloadData"})},n.prototype.renderTotal=function(e,o){var d,r=this,c=r.config,s={};c.totalRow&&(layui.each(e,function(e,i){"array"===layui.type(i)&&0===i.length||r.eachCols(function(e,t){var e=t.field||e,a=i[e];t.totalRow&&(s[e]=(s[e]||0)+(parseFloat(a)||0))})}),r.dataTotal=[],d=[],r.eachCols(function(e,t){var e=t.field||e,a=o&&o[t.field],i="totalRowDecimals"in t?t.totalRowDecimals:2,i=s[e]?parseFloat(s[e]||0).toFixed(i):"",i=(n=t.totalRowText||"",(l={LAY_COL:t})[e]=i,l=t.totalRow&&T.call(r,{item3:t,content:i,tplData:l})||n,a||l),l="string"==typeof(n=t.totalRow||c.totalRow)?m(n).render(f.extend({TOTAL_NUMS:a||s[e],TOTAL_ROW:o||{},LAY_COL:t},t)):i,n=(t.field&&r.dataTotal.push({field:t.field,total:f("
                                      "+l+"
                                      ").text()}),['','
                                      "+l,"
                                      "].join(""));d.push(n)}),e=r.layTotal.find(".layui-table-patch"),r.layTotal.find("tbody").html(""+d.join("")+(e.length?e.get(0).outerHTML:"")+""))},n.prototype.getColElem=function(e,t){return e.eq(0).find(".laytable-cell-"+t+":eq(0)")},n.prototype.renderForm=function(e){this.config;var t=this.elem.attr("lay-filter");i.render(e,t)},n.prototype.renderFormByElem=function(a){layui.each(["input","select"],function(e,t){i.render(a.find(t))})},n.prototype.syncCheckAll=function(){var a,e=this,i=e.config,t=e.layHeader.find('input[name="layTableCheckbox"]'),l=k.checkStatus(e.key);t[0]&&(a=l.isAll,e.eachCols(function(e,t){"checkbox"===t.type&&(t[i.checkName]=a)}),t.prop({checked:l.isAll,indeterminate:!l.isAll&&l.data.length}))},n.prototype.setRowActive=function(e,t,a){this.config;e=this.layBody.find('tr[data-index="'+e+'"]');if(t=t||"layui-table-click",a)return e.removeClass(t);e.addClass(t),e.siblings("tr").removeClass(t)},n.prototype.setRowChecked=function(i){var a,e,l,t,n,o,d,r=this,c=r.config,s="all"===i.index,u="array"===layui.type(i.index),y=s||u;c.tree&&c.tree.view||y&&(r.layBox.addClass(O),"radio"===i.type)||(u&&(a={},layui.each(i.index,function(e,t){a[t]=!0}),i.index=a),e=r.layBody.children(".layui-table").children("tbody"),d=y?"tr":'tr[data-index="'+i.index+'"]',d=e.children(d),e=s?d:d.filter(u?function(){var e=f(this).data("index");return i.index[e]}:'[data-index="'+i.index+'"]'),i=f.extend({type:"checkbox"},i),l=k.cache[r.key],t="checked"in i,n=function(e){return"radio"===i.type||(t?i.checked:!e)},e.each(function(){var e=f(this),t=e.attr("data-index"),a=l[t];t&&"array"!==layui.type(a)&&!a[c.disabledName]&&(a=a[c.checkName]=n(e.hasClass(A)),e.toggleClass(A,!!a),"radio"===i.type)&&(o=t,e.siblings().removeClass(A))}),o&&layui.each(l,function(e,t){Number(o)!==Number(e)&&delete t[c.checkName]}),d=(u=(s=e.children("td").children(".layui-table-cell").children('input[lay-type="'+({radio:"layTableRadio",checkbox:"layTableCheckbox"}[i.type]||"checkbox")+'"]:not(:disabled)')).last()).closest(I),("radio"===i.type&&d.hasClass(W)?s.first():s).prop("checked",n(u.prop("checked"))),r.syncCheckAll(),y&&setTimeout(function(){r.layBox.removeClass(O)},100))},n.prototype.sort=function(l){var e,t=this,a={},i=t.config,n=i.elem.attr("lay-filter"),o=k.cache[t.key];"string"==typeof(l=l||{}).field&&(d=l.field,t.layHeader.find("th").each(function(e,t){var a=f(this),i=a.data("field");if(i===l.field)return l.field=a,d=i,!1}));try{var d=d||l.field.data("field"),r=l.field.data("key");if(t.sortKey&&!l.pull&&d===t.sortKey.field&&l.type===t.sortKey.sort)return;var c=t.layHeader.find("th .laytable-cell-"+r).find(L);t.layHeader.find("th").find(L).removeAttr("lay-sort"),c.attr("lay-sort",l.type||null),t.layFixed.find("th")}catch(s){b.error("Table modules: sort field '"+d+"' not matched")}t.sortKey={field:d,sort:l.type},i.autoSort&&("asc"===l.type?e=layui.sort(o,d,null,!0):"desc"===l.type?e=layui.sort(o,d,!0,!0):(e=layui.sort(o,k.config.initIndexName,null,!0),delete t.sortKey,delete i.initSort)),a[i.response.dataName]=e||o,t.renderData({res:a,curr:t.page,count:t.count,sort:!0,type:l.reloadType}),l.fromEvent&&(i.initSort={field:d,type:l.type},layui.event.call(l.field,R,"sort("+n+")",f.extend({config:i},i.initSort)))},n.prototype.loading=function(e){this.config.loading&&this.layBox.find(".layui-table-init").toggleClass(W,!e)},n.prototype.cssRules=function(t,a){var e=this.elem.children("style")[0];r.getStyleRules(e,function(e){if(e.selectorText===".laytable-cell-"+t)return a(e),!0})},n.prototype.fullSize=function(){var e,a,i=this,t=i.config,l=t.height;i.fullHeightGap?(l=d.height()-i.fullHeightGap)<135&&(l=135):i.parentDiv&&i.parentHeightGap?(l=f(i.parentDiv).height()-i.parentHeightGap)<135&&(l=135):i.customHeightFunc&&(l=i.customHeightFunc())<135&&(l=135),1
                                      ')).find("div").css({width:a}),e.find("tr").append(t)):e.find(".layui-table-patch").remove()};n(e.layHeader),n(e.layTotal);n=e.layMain.height()-i;e.layFixed.find(D).css("height",t.height()>=n?n:"auto").scrollTop(e.layMain.scrollTop()),e.layFixRight[k.cache[e.key]&&k.cache[e.key].length&&0');a.html(t),s.height&&a.css("max-height",s.height-(c.layTool.outerHeight()||50)),i.find("."+S)[0]||i.append(a),c.renderForm(),a.on("click",function(e){layui.stope(e)}),e.done&&e.done(a,t)};layui.stope(e),z.trigger("table.tool.panel.remove"),g.close(c.tipsIndex),layui.each(s.defaultToolbar,function(e,t){if(t.layEvent===a)return"function"==typeof t.onClick&&t.onClick({data:l,config:s,openPanel:n,elem:i}),!0}),layui.event.call(this,R,"toolbar("+o+")",f.extend({event:a,config:s},{}))}),c.layHeader.on("click","*[lay-event]",function(e){var t=f(this),a=t.attr("lay-event"),t=t.closest("th").data("key"),t=c.col(t);layui.event.call(this,R,"colTool("+o+")",f.extend({event:a,config:s,col:t},{}))}),c.layPagebar.on("click","*[lay-event]",function(e){var t=f(this).attr("lay-event");layui.event.call(this,R,"pagebar("+o+")",f.extend({event:t,config:s},{}))}),e.on("mousemove",function(e){var t=f(this),a=t.offset().left,e=e.clientX-a;t.data("unresize")||w.eventMoveElem||(r.allowResize=t.width()-e<=10,d.css("cursor",r.allowResize?"col-resize":""))}).on("mouseleave",function(){f(this);w.eventMoveElem||(r.allowResize=!1,d.css("cursor",""))}).on("mousedown",function(e){var t,a=f(this);r.allowResize&&(t=a.data("key"),e.preventDefault(),r.offset=[e.clientX,e.clientY],c.cssRules(t,function(e){var t=e.style.width||a.outerWidth();r.rule=e,r.ruleWidth=parseFloat(t),r.minWidth=a.data("minwidth")||s.cellMinWidth,r.maxWidth=a.data("maxwidth")||s.cellMaxWidth}),a.data(j,r),w.eventMoveElem=a)}),w.docEvent||z.on("mousemove",function(e){var t,a;w.eventMoveElem&&(t=w.eventMoveElem.data(j)||{},w.eventMoveElem.data("resizing",1),e.preventDefault(),t.rule)&&(e=t.ruleWidth+e.clientX-t.offset[0],a=w.eventMoveElem.closest("."+_).attr(N),a=C(a))&&((e=et.maxWidth&&(e=t.maxWidth),t.rule.style.width=e+"px",a.setGroupWidth(w.eventMoveElem),g.close(c.tipsIndex))}).on("mouseup",function(e){var t,a,i,l,n;w.eventMoveElem&&(i=(t=w.eventMoveElem).closest("."+_).attr(N),a=C(i))&&(i=t.data("key"),l=a.col(i),n=a.config.elem.attr("lay-filter"),r={},d.css("cursor",""),a.scrollPatch(),t.removeData(j),delete w.eventMoveElem,a.cssRules(i,function(e){l.width=parseFloat(e.style.width),layui.event.call(t[0],R,"colResized("+n+")",{col:l,config:a.config})}))}),w.docEvent=!0,e.on("click",function(e){var t=f(this),a=t.find(L),i=a.attr("lay-sort");if(!a[0]||1===t.data("resizing"))return t.removeData("resizing");c.sort({field:t,type:"asc"===i?"desc":"desc"===i?null:"asc",fromEvent:!0})}).find(L+" .layui-edge ").on("click",function(e){var t=f(this),a=t.index(),t=t.parents("th").eq(0).data("field");layui.stope(e),0===a?c.sort({field:t,type:"asc",fromEvent:!0}):c.sort({field:t,type:"desc",fromEvent:!0})}),c.commonMember=function(e){var a=f(this).parents("tr").eq(0).data("index"),t=c.layBody.find('tr[data-index="'+a+'"]'),i=(k.cache[c.key]||[])[a]||{},l={tr:t,config:s,data:k.clearCacheKey(i),dataCache:i,index:a,del:function(){k.cache[c.key][a]=[],t.remove(),c.scrollPatch()},update:function(e,t){c.updateRow({index:a,data:e=e||{},related:t},function(e,t){l.data[e]=t})},setRowChecked:function(e){c.setRowChecked(f.extend({index:a},e))}};return f.extend(l,e)}),t=(c.elem.on("click",'input[name="layTableCheckbox"]+',function(e){var t=f(this),a=t.closest("td"),t=t.prev(),i=(c.layBody.find('input[name="layTableCheckbox"]'),t.parents("tr").eq(0).data("index")),l=t[0].checked,n="layTableAllChoose"===t.attr("lay-filter");t[0].disabled||(n?c.setRowChecked({index:"all",checked:l}):c.setRowChecked({index:i,checked:l}),layui.stope(e),layui.event.call(t[0],R,"checkbox("+o+")",y.call(t[0],{checked:l,type:n?"all":"one",getCol:function(){return c.col(a.data("key"))}})))}),c.elem.on("click",'input[lay-type="layTableRadio"]+',function(e){var t=f(this),a=t.closest("td"),t=t.prev(),i=t[0].checked,l=t.parents("tr").eq(0).data("index");if(layui.stope(e),t[0].disabled)return!1;c.setRowChecked({type:"radio",index:l}),layui.event.call(t[0],R,"radio("+o+")",y.call(t[0],{checked:i,getCol:function(){return c.col(a.data("key"))}}))}),c.layBody.on("mouseenter","tr",function(){var e=f(this),t=e.index();e.data("off")||c.layBody.find("tr:eq("+t+")").addClass(M)}).on("mouseleave","tr",function(){var e=f(this),t=e.index();e.data("off")||c.layBody.find("tr:eq("+t+")").removeClass(M)}).on("click","tr",function(e){t.call(this,"row",e)}).on("dblclick","tr",function(e){t.call(this,"rowDouble",e)}).on("contextmenu","tr",function(e){s.defaultContextmenu||e.preventDefault(),t.call(this,"rowContextmenu",e)}),function(e,t){var a=f(this);if(!a.data("off")){if("rowContextmenu"!==e){var i=[".layui-form-checkbox",".layui-form-switch",".layui-form-radio","[lay-unrow]"].join(",");if(f(t.target).is(i)||f(t.target).closest(i)[0])return}layui.event.call(this,R,e+"("+o+")",y.call(a.children("td")[0],{e:t}))}}),n=function(e,t){var a,i,l;(e=f(e)).data("off")||(l=e.data("field"),i=e.data("key"),i=c.col(i),a=e.closest("tr").data("index"),a=k.cache[c.key][a],e.children(u),(i="function"==typeof i.edit?i.edit(a):i.edit)&&((i=f("textarea"===i?'':''))[0].value=(l=e.data("content")||a[l])===undefined||null===l?"":l,e.find("."+E)[0]||e.append(i),i.focus(),t)&&layui.stope(t))},i=(c.layBody.on("change","."+E,function(){var e=f(this),t=e.parent(),a=this.value,i=e.parent().data("field"),e=e.closest("tr").data("index"),e=k.cache[c.key][e],l=y.call(t[0],{value:a,field:i,oldValue:e[i],td:t,reedit:function(){setTimeout(function(){n(l.td);var e={};e[i]=l.oldValue,l.update(e)})},getCol:function(){return c.col(t.data("key"))}}),e={};e[i]=a,l.update(e),layui.event.call(t[0],R,"edit("+o+")",l)}).on("blur","."+E,function(){f(this).remove()}),c.layBody.on(s.editTrigger,"td",function(e){n(this,e)}).on("mouseenter","td",function(){a.call(this)}).on("mouseleave","td",function(){a.call(this,"hide")}),c.layTotal.on("mouseenter","td",function(){a.call(this)}).on("mouseleave","td",function(){a.call(this,"hide")}),"layui-table-grid-down"),a=function(e){var t=f(this),a=t.children(u);t.data("off")||t.parent().hasClass(H)||(e?t.find(".layui-table-grid-down").remove():!(a.prop("scrollWidth")>a.prop("clientWidth")||0'))},l=function(e,t){var a=f(this),i=a.parent(),l=i.data("key"),n=c.col(l),o=i.parent().data("index"),d=i.children(u),i="layui-table-cell-c",r=f('');"tips"===(t=t||n.expandedMode||s.cellExpandedMode)?c.tipsIndex=g.tips(['
                                      ',d.html(),"
                                      ",''].join(""),d[0],{tips:[3,""],time:-1,anim:-1,maxWidth:x.ios||x.android?300:c.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){g.close(t)})}}):(c.elem.find("."+i).trigger("click"),c.cssRules(l,function(e){var t=e.style.width,a=n.expandedWidth||s.cellExpandedWidth;atr").each(function(i){n.cols[i]=[],f(this).children().each(function(e){var t=f(this),a=t.attr("lay-data"),a=r.options(this,{attr:a?"lay-data":null,errorText:d+(a||t.attr("lay-options"))}),t=f.extend({title:t.text(),colspan:parseInt(t.attr("colspan"))||1,rowspan:parseInt(t.attr("rowspan"))||1},a);n.cols[i].push(t)})}),e.find("tbody>tr")),t=k.render(n);!a.length||o.data||t.config.url||(l=0,k.eachCols(t.config.id,function(e,i){a.each(function(e){n.data[e]=n.data[e]||{};var t=f(this),a=i.field;n.data[e][a]=t.children("td").eq(l).html()}),l++}),t.reloadData({data:n.data}))}),this},w.that={},w.config={},function(a,i,e,l){var n,o;l.colGroup&&(n=0,a++,l.CHILD_COLS=[],o=e+(parseInt(l.rowspan)||1),layui.each(i[o],function(e,t){t.parentKey?t.parentKey===l.key&&(t.PARENT_COL_INDEX=a,l.CHILD_COLS.push(t),c(a,i,o,t)):t.PARENT_COL_INDEX||1<=n&&n==(l.colspan||1)||(t.PARENT_COL_INDEX=a,l.CHILD_COLS.push(t),n+=parseInt(1td').filter('[data-field="'+e+'"]')}}})).replace(/"/g,'""'),n.push(a='"'+a+'"')):t.field&&"normal"!==t.type&&0==i&&(u[t.field]=!0)}),c.push(n.join(","))}),o&&layui.each(o.dataTotal,function(e,t){u[t.field]||s.push('"'+(t.total||"")+'"')}),r.join(",")+"\r\n"+c.join("\r\n")+"\r\n"+s.join(","))),d.download=(a.title||l.title||"table_"+(l.index||""))+"."+i,document.body.appendChild(d),d.click(),document.body.removeChild(d)},k.getOptions=l,k.hideCol=function(e,l){var n=C(e);n&&("boolean"===layui.type(l)?n.eachCols(function(e,t){var a=t.key,i=n.col(a),t=t.parentKey;i.hide!=l&&(i=i.hide=l,n.elem.find('*[data-key="'+a+'"]')[i?"addClass":"removeClass"](W),n.setParentCol(i,t))}):(l=layui.isArray(l)?l:[l],layui.each(l,function(e,l){n.eachCols(function(e,t){var a,i;l.field===t.field&&(a=t.key,i=n.col(a),t=t.parentKey,"hide"in l)&&i.hide!=l.hide&&(i=i.hide=!!l.hide,n.elem.find('*[data-key="'+a+'"]')[i?"addClass":"removeClass"](W),n.setParentCol(i,t))})})),f("."+S).remove(),n.resize())},k.reload=function(e,t,a,i){if(l(e))return(e=C(e)).reload(t,a,i),w.call(e)},k.reloadData=function(){var a=f.extend([],arguments),i=(a[3]="reloadData",new RegExp("^("+["elem","id","cols","width","height","maxHeight","toolbar","defaultToolbar","className","css","pagebar"].join("|")+")$"));return layui.each(a[1],function(e,t){i.test(e)&&delete a[1][e]}),k.reload.apply(null,a)},k.render=function(e){e=new n(e);return w.call(e)},k.clearCacheKey=function(e){return delete(e=f.extend({},e))[k.config.checkName],delete e[k.config.indexName],delete e[k.config.initIndexName],delete e[k.config.numbersName],delete e[k.config.disabledName],e},f(function(){k.init()}),s(R,k)});layui.define(["table"],function(e){"use strict";var A=layui.$,h=layui.form,P=layui.table,y=layui.hint(),B={config:{},on:P.on,eachCols:P.eachCols,index:P.index,set:function(e){var t=this;return t.config=A.extend({},t.config,e),t},resize:P.resize,getOptions:P.getOptions,hideCol:P.hideCol,renderData:P.renderData},i=function(){var a=this,e=a.config,n=e.id||e.index;return{config:e,reload:function(e,t){a.reload.call(a,e,t)},reloadData:function(e,t){B.reloadData(n,e,t)}}},j=function(e){var t=i.that[e];return t||y.error(e?"The treeTable instance with ID '"+e+"' not found":"ID argument required"),t||null},F="lay-table-id",L="layui-hide",s=".layui-table-body",q=".layui-table-main",R=".layui-table-fixed-l",Y=".layui-table-fixed-r",l="layui-table-checked",m="layui-table-tree",z="LAY_DATA_INDEX",b="LAY_DATA_INDEX_HISTORY",f="LAY_PARENT_INDEX",g="LAY_CHECKBOX_HALF",H="LAY_EXPAND",X="LAY_HAS_EXPANDED",V="LAY_ASYNC_STATUS",n=["all","parent","children","none"],t=/<[^>]+?>/,p=["flexIconClose","flexIconOpen","iconClose","iconOpen","iconLeaf","icon"],a=function(e){var t=this;t.index=++B.index,t.config=A.extend(!0,{},t.config,B.config,e),t.init(),t.render()},x=function(n,i,e){var l=P.cache[n];layui.each(e||l,function(e,t){var a=t[z]||"";-1!==a.indexOf("-")&&(l[a]=t),t[i]&&x(n,i,t[i])})},d=function(d,a,e){var r=j(d),o=("reloadData"!==e&&(r.status={expand:{}}),A.extend(!0,{},r.getOptions(),a)),n=o.tree,c=n.customName.children,i=n.customName.id,l=(delete a.hasNumberCol,delete a.hasChecboxCol,delete a.hasRadioCol,P.eachCols(null,function(e,t){"numbers"===t.type?a.hasNumberCol=!0:"checkbox"===t.type?a.hasChecboxCol=!0:"radio"===t.type&&(a.hasRadioCol=!0)},o.cols),a.parseData),u=a.done;"reloadData"===e&&"fixed"===o.scrollPos&&(r.scrollTopCache=r.config.elem.next().find(s).scrollTop()),o.url?e&&(!l||l.mod)||(a.parseData=function(){var e=this,t=arguments,a=t[0],t=("function"===layui.type(l)&&(a=l.apply(e,t)||t[0]),e.response.dataName);return n.data.isSimpleData&&!n["async"].enable&&(a[t]=r.flatToTree(a[t])),N(a[t],function(e){e[H]=H in e?e[H]:e[i]!==undefined&&r.status.expand[e[i]]},c),e.autoSort&&e.initSort&&e.initSort.type&&layui.sort(a[t],e.initSort.field,"desc"===e.initSort.type,!0),r.initData(a[t]),a},a.parseData.mod=!0):a.data!==undefined&&(a.data=a.data||[],n.data.isSimpleData&&(a.data=r.flatToTree(a.data)),r.initData(a.data)),e&&(!u||u.mod)||(a.done=function(){var e,t=arguments,a=t[3],n="renderData"===a,i=(n||delete r.isExpandAll,this.elem.next()),l=(r.updateStatus(null,{LAY_HAS_EXPANDED:!1}),x(d,c),i.find('[name="layTableCheckbox"][lay-filter="layTableAllChoose"]'));if(l.length&&(e=B.checkStatus(d),l.prop({checked:e.isAll&&e.data.length,indeterminate:!e.isAll&&e.data.length})),!n&&o.autoSort&&o.initSort&&o.initSort.type&&B.sort(d),r.renderTreeTable(i),"reloadData"===a&&"fixed"===this.scrollPos&&i.find(s).scrollTop(r.scrollTopCache),"function"===layui.type(u))return u.apply(this,t)},a.done.mod=!0),a&&a.tree&&a.tree.view&&layui.each(p,function(e,t){a.tree.view[t]!==undefined&&(a.tree.view[t]=r.normalizedIcon(a.tree.view[t]))})};a.prototype.init=function(){var e=this.config,t=e.tree.data.cascade,t=(-1===n.indexOf(t)&&(e.tree.data.cascade="all"),P.render(A.extend({},e,{data:[],url:"",done:null}))),a=t.config.id;(i.that[a]=this).tableIns=t,d(a,e)},a.prototype.config={tree:{customName:{children:"children",isParent:"isParent",name:"name",id:"id",pid:"parentId",icon:"icon"},view:{indent:14,flexIconClose:'',flexIconOpen:'',showIcon:!0,icon:"",iconClose:'',iconOpen:'',iconLeaf:'',showFlexIconIfNotParent:!1,dblClickExpand:!0,expandAllDefault:!1},data:{isSimpleData:!1,rootPid:null,cascade:"all"},"async":{enable:!1,url:"",type:null,contentType:null,headers:null,where:null,autoParam:[]},callback:{beforeExpand:null,onExpand:null}}},a.prototype.normalizedIcon=function(e){return e?t.test(e)?e:'':""},a.prototype.getOptions=function(){return this.tableIns?P.getOptions(this.tableIns.config.id):this.config},a.prototype.flatToTree=function(e){var n,i,l,d,r,o,c,u,t=this.getOptions(),a=t.tree,s=a.customName;return e=e||P.cache[t.id],t=e,n=s.id,i=s.pid,l=s.children,d=a.data.rootPid,n=n||"id",i=i||"parentId",l=l||"children",c={},u=[],layui.each(t,function(e,t){r=n+t[n],o=n+t[i],c[r]||(c[r]={},c[r][l]=[]);var a={};a[l]=c[r][l],c[r]=A.extend({},t,a),((d?c[r][i]===d:!c[r][i])?u:(c[o]||(c[o]={},c[o][l]=[]),c[o][l])).push(c[r])}),u},a.prototype.treeToFlat=function(e,n,i){var l=this,d=l.getOptions().tree.customName,r=d.children,o=d.pid,c=[];return layui.each(e,function(e,t){var e=(i?i+"-":"")+e,a=A.extend({},t);a[o]="undefined"!=typeof t[o]?t[o]:n,c.push(a),c=c.concat(l.treeToFlat(t[r],t[d.id],e))}),c},a.prototype.getTreeNode=function(e){var t,a=this;return e?(t=a.getOptions().tree,t.customName,{data:e,dataIndex:e[z],getParentNode:function(){return a.getNodeByIndex(e[f])}}):y.error("\u627e\u4e0d\u5230\u8282\u70b9\u6570\u636e")},a.prototype.getNodeByIndex=function(t){var a,e,n=this,i=n.getNodeDataByIndex(t);return i?((e=n.getOptions()).tree.customName.parent,a=e.id,(e={data:i,dataIndex:i[z],getParentNode:function(){return n.getNodeByIndex(i[f])},update:function(e){return B.updateNode(a,t,e)},remove:function(){return B.removeNode(a,t)},expand:function(e){return B.expandNode(a,A.extend({},e,{index:t}))},setChecked:function(e){return B.setRowChecked(a,A.extend({},e,{index:t}))}}).dataIndex=t,e):y.error("\u627e\u4e0d\u5230\u8282\u70b9\u6570\u636e")},a.prototype.getNodeById=function(a){var e=this.getOptions(),n=e.tree.customName.id,i="",e=B.getData(e.id,!0);if(layui.each(e,function(e,t){if(t[n]===a)return i=t[z],!0}),i)return this.getNodeByIndex(i)},a.prototype.getNodeDataByIndex=function(e,t,a){var n=this.getOptions(),i=n.tree,n=P.cache[n.id],l=n[e];if("delete"!==a&&l)return A.extend(l,a),t?A.extend({},l):l;for(var d=n,r=String(e).split("-"),o=0,c=i.customName.children;o
                                      '),N=function(e){y[V]="success",y[s.children]=e,c.initData(y[s.children],y[z]),J(t,!0,!p&&n,i,l)},C=m.format,"function"===layui.type(C)?C(y,o,N):(I=A.extend({},m.where||o.where),C=m.autoParam,layui.each(C,function(e,t){t=t.split("=");I[t[0].trim()]=y[(t[1]||t[0]).trim()]}),(C=m.contentType||o.contentType)&&0==C.indexOf("application/json")&&(I=JSON.stringify(I)),O=m.method||o.method,D=m.dataType||o.dataType,T=m.jsonpCallback||o.jsonpCallback,_=m.headers||o.headers,k=m.parseData||o.parseData,w=m.response||o.response,A.ajax({type:O||"get",url:b,contentType:C,data:I,dataType:D||"json",jsonpCallback:T,headers:_||{},success:function(e){(e="function"==typeof k?k.call(o,e)||e:e)[w.statusName]!=w.statusCode?(y[V]="error",y[H]=!1,g.html('')):N(e[w.dataName])},error:function(e,t){y[V]="error",y[H]=!1,"function"==typeof o.error&&o.error(e,t)}})),h;y[X]=!0,v.length&&(!o.initSort||o.url&&!o.autoSort||((m=o.initSort).type?layui.sort(v,m.field,"desc"===m.type,!0):layui.sort(v,P.config.indexName,null,!0)),c.initData(y[s.children],y[z]),O=P.getTrHtml(r,v,null,null,e),S={trs:A(O.trs.join("")),trs_fixed:A(O.trs_fixed.join("")),trs_fixed_r:A(O.trs_fixed_r.join(""))},E=(e.split("-").length-1||0)+1,layui.each(v,function(e,t){S.trs.eq(e).attr({"data-index":t[z],"lay-data-index":t[z],"data-level":E}).data("index",t[z]),S.trs_fixed.eq(e).attr({"data-index":t[z],"lay-data-index":t[z],"data-level":E}).data("index",t[z]),S.trs_fixed_r.eq(e).attr({"data-index":t[z],"lay-data-index":t[z],"data-level":E}).data("index",t[z])}),d.find(q).find('tbody tr[lay-data-index="'+e+'"]').after(S.trs),d.find(R).find('tbody tr[lay-data-index="'+e+'"]').after(S.trs_fixed),d.find(Y).find('tbody tr[lay-data-index="'+e+'"]').after(S.trs_fixed_r),c.renderTreeTable(S.trs,E),n)&&!p&&layui.each(v,function(e,t){J({dataIndex:t[z],trElem:d.find('tr[lay-data-index="'+t[z]+'"]').first(),tableViewElem:d,tableId:r,options:o},a,n,i,l)})}else c.isExpandAll=!1,(n&&!p?(layui.each(v,function(e,t){J({dataIndex:t[z],trElem:d.find('tr[lay-data-index="'+t[z]+'"]').first(),tableViewElem:d,tableId:r,options:o},a,n,i,l)}),d.find(v.map(function(e,t,a){return'tr[lay-data-index="'+e[z]+'"]'}).join(","))):(b=c.treeToFlat(v,y[s.id],e),d.find(b.map(function(e,t,a){return'tr[lay-data-index="'+e[z]+'"]'}).join(",")))).addClass(L);U("resize-"+r,function(){B.resize(r)},0)(),l&&"loading"!==y[V]&&(C=u.callback.onExpand,"function"===layui.type(C))&&C(r,y,x)}return h},v=(B.expandNode=function(e,t){var a,n,i,e=j(e);if(e)return a=(t=t||{}).index,n=t.expandFlag,i=t.inherit,t=t.callbackFlag,e=e.getOptions().elem.next(),J({trElem:e.find('tr[lay-data-index="'+a+'"]').first()},n,i,null,t)},B.expandAll=function(a,e){if("boolean"!==layui.type(e))return y.error("expandAll \u7684\u5c55\u5f00\u72b6\u6001\u53c2\u6570\u53ea\u63a5\u6536true/false");var t=j(a);if(t){t.isExpandAll=e;var n=t.getOptions(),i=n.tree,l=n.elem.next(),d=i.customName.isParent,r=i.customName.id,o=i.view.showFlexIconIfNotParent;if(e){e=B.getData(a,!0);if(i["async"].enable){var c=!0;if(layui.each(e,function(e,t){if(t[d]&&!t[V])return!(c=!1)}),!c)return void layui.each(B.getData(a),function(e,t){B.expandNode(a,{index:t[z],expandFlag:!0,inherit:!0})})}var u=!0;if(layui.each(e,function(e,t){if(t[d]&&!t[X])return!(u=!1)}),u)t.updateStatus(null,function(e){(e[d]||o)&&(e[H]=!0,e[r]!==undefined)&&(t.status.expand[e[r]]=!0)}),l.find('tbody tr[data-level!="0"]').removeClass(L),l.find(".layui-table-tree-flexIcon").html(i.view.flexIconOpen),i.view.showIcon&&l.find(".layui-table-tree-nodeIcon:not(.layui-table-tree-iconCustom,.layui-table-tree-iconLeaf)").html(i.view.iconOpen);else{if(t.updateStatus(null,function(e){(e[d]||o)&&(e[H]=!0,e[X]=!0,e[r]!==undefined)&&(t.status.expand[e[r]]=!0)}),n.initSort&&n.initSort.type&&n.autoSort)return B.sort(a);var s,n=P.getTrHtml(a,e),f={trs:A(n.trs.join("")),trs_fixed:A(n.trs_fixed.join("")),trs_fixed_r:A(n.trs_fixed_r.join(""))};layui.each(e,function(e,t){var a=t[z].split("-").length-1;s={"data-index":t[z],"lay-data-index":t[z],"data-level":a},f.trs.eq(e).attr(s).data("index",t[z]),f.trs_fixed.eq(e).attr(s).data("index",t[z]),f.trs_fixed_r.eq(e).attr(s).data("index",t[z])}),layui.each(["main","fixed-l","fixed-r"],function(e,t){l.find(".layui-table-"+t+" tbody").html(f[["trs","trs_fixed","trs_fixed_r"][e]])}),t.renderTreeTable(l,0,!1)}}else t.updateStatus(null,function(e){(e[d]||o)&&(e[H]=!1,e[r]!==undefined)&&(t.status.expand[e[r]]=!1)}),l.find('.layui-table-box tbody tr[data-level!="0"]').addClass(L),l.find(".layui-table-tree-flexIcon").html(i.view.flexIconClose),i.view.showIcon&&l.find(".layui-table-tree-nodeIcon:not(.layui-table-tree-iconCustom,.layui-table-tree-iconLeaf)").html(i.view.iconClose);B.resize(a)}},a.prototype.updateNodeIcon=function(e){var t=this.getOptions().tree||{},a=e.scopeEl,n=e.isExpand,e=e.isParent;a.find(".layui-table-tree-flexIcon").css("visibility",e||t.view.showFlexIconIfNotParent?"visible":"hidden").html(n?t.view.flexIconOpen:t.view.flexIconClose),t.view.showIcon&&(a=a.find(".layui-table-tree-nodeIcon:not(.layui-table-tree-iconCustom)"),n=e?n?t.view.iconOpen:t.view.iconClose:t.view.iconLeaf,a.toggleClass("layui-table-tree-iconLeaf",!e).html(n))},a.prototype.renderTreeTable=function(e,t,a){var l=this,n=l.getOptions(),d=n.elem.next(),i=(d.hasClass(m)||d.addClass(m),n.id),r=n.tree||{},o=(r.data,r.view||{}),c=r.customName||{},u=c.isParent,s=(d.attr("lay-filter"),l),f=n.data.length,y=((t=t||0)||(d.find(".layui-table-body tr:not([data-level])").attr("data-level",t),layui.each(P.cache[i],function(e,t){f&&(t[z]=String(e));t=t[z];d.find('.layui-table-main tbody tr[data-level="0"]:eq('+e+")").attr("lay-data-index",t),d.find('.layui-table-fixed-l tbody tr[data-level="0"]:eq('+e+")").attr("lay-data-index",t),d.find('.layui-table-fixed-r tbody tr[data-level="0"]:eq('+e+")").attr("lay-data-index",t)})),null),p=c.name,x=o.indent||14;if(layui.each(e.find('td[data-field="'+p+'"]'),function(e,t){var a,n,i=(t=A(t)).closest("tr"),t=t.children(".layui-table-cell");t.hasClass("layui-table-tree-item")||(n=i.attr("lay-data-index"))&&(i=d.find('tr[lay-data-index="'+n+'"]'),(a=s.getNodeDataByIndex(n))[H]&&a[u]&&((y=y||{})[n]=!0),a[g]&&i.find('input[type="checkbox"][name="layTableCheckbox"]').prop("indeterminate",!0),n=t.html(),(t=i.find('td[data-field="'+p+'"]>div.layui-table-cell')).addClass("layui-table-tree-item"),t.html(['
                                      ',a[H]?o.flexIconOpen:o.flexIconClose,"
                                      ",o.showIcon?'
                                      '+(l.normalizedIcon(a[c.icon])||o.icon||(a[u]?a[H]?o.iconOpen:o.iconClose:o.iconLeaf)||"")+"
                                      ":"",n].join("")).find(".layui-table-tree-flexIcon").on("click",function(e){layui.stope(e),J({trElem:i},null,null,null,!0)}))}),!t&&r.view.expandAllDefault&&l.isExpandAll===undefined)return B.expandAll(i,!0);(!1!==a&&y?(layui.each(y,function(e,t){e=d.find('tr[lay-data-index="'+e+'"]');e.find(".layui-table-tree-flexIcon").html(o.flexIconOpen),J({trElem:e.first()},!0)}),U("renderTreeTable2-"+i,function(){h.render(A(".layui-table-tree["+F+'="'+i+'"]'))},0)):U("renderTreeTable-"+i,function(){n.hasNumberCol&&v(l),h.render(A(".layui-table-tree["+F+'="'+i+'"]'))},0))()},function(a){var e=a.getOptions(),t=e.elem.next(),n=0,i=t.find(".layui-table-main tbody tr"),l=t.find(".layui-table-fixed-l tbody tr"),d=t.find(".layui-table-fixed-r tbody tr");layui.each(a.treeToFlat(P.cache[e.id]),function(e,t){t.LAY_HIDE||(a.getNodeDataByIndex(t[z]).LAY_NUM=++n,i.eq(e).find(".laytable-cell-numbers").html(n),l.eq(e).find(".laytable-cell-numbers").html(n),d.eq(e).find(".laytable-cell-numbers").html(n))})}),N=(a.prototype.render=function(e){var t=this;t.tableIns=P["reloadData"===e?"reloadData":"reload"](t.tableIns.config.id,A.extend(!0,{},t.config)),t.config=t.tableIns.config},a.prototype.reload=function(e,t,a){var n=this;e=e||{},delete n.haveInit,layui.each(e,function(e,t){"array"===layui.type(t)&&delete n.config[e]}),d(n.getOptions().id,e,a||!0),n.config=A.extend(t,{},n.config,e),n.render(a)},B.reloadData=function(){var e=A.extend(!0,[],arguments);return e[3]="reloadData",B.reload.apply(null,e)},function(e,a,n,i){var l=[];return layui.each(e,function(e,t){"function"===layui.type(a)?a(t):A.extend(t,a),l.push(A.extend({},t)),i||(l=l.concat(N(t[n],a,n,i)))}),l}),o=(a.prototype.updateStatus=function(e,t,a){var n=this.getOptions(),i=n.tree;return e=e||P.cache[n.id],N(e,t,i.customName.children,a)},a.prototype.getTableData=function(){var e=this.getOptions();return P.cache[e.id]},B.updateStatus=function(e,t,a){var e=j(e),n=e.getOptions();return a=a||(n.url?P.cache[n.id]:n.data),e.updateStatus(a,t)},B.sort=function(e){var t,a,i,l,n,d=j(e);d&&(n=(t=d.getOptions()).tree,a=B.getData(e),i=n.customName.children,l=function(e,a,n){layui.sort(e,a,n,!0),layui.each(e,function(e,t){l(t[i]||[],a,n)})},t.autoSort)&&((n=t.initSort).type?l(a,n.field,"desc"===n.type):l(a,P.config.indexName,null),P.cache[e]=a,d.initData(a),B.renderData(e))},function(n){var t=n.config.id,i=j(t),a=n.data=B.getNodeDataByIndex(t,n.index),l=a[z],d=(n.dataIndex=l,n.update);n.update=function(){var e=arguments,t=(A.extend(i.getNodeDataByIndex(l),e[0]),d.apply(this,e)),a=n.config.tree.customName.name;return a in e[0]&&n.tr.find('td[data-field="'+a+'"]').children("div.layui-table-cell").removeClass("layui-table-tree-item"),i.renderTreeTable(n.tr,n.tr.attr("data-level"),!1),t},n.del=function(){B.removeNode(t,a)},n.setRowChecked=function(e){B.setRowChecked(t,{index:a,checked:e})}}),u=(B.updateNode=function(e,a,t){var n,i,l,d,r,o=j(e);o&&((d=o.getOptions()).tree,d=(n=d.elem.next()).find('tr[lay-data-index="'+a+'"]'),i=d.attr("data-index"),l=d.attr("data-level"),t)&&(d=o.getNodeDataByIndex(a,!1,t),r=P.getTrHtml(e,[d]),layui.each(["main","fixed-l","fixed-r"],function(e,t){n.find(".layui-table-"+t+' tbody tr[lay-data-index="'+a+'"]').replaceWith(A(r[["trs","trs_fixed","trs_fixed_r"][e]].join("")).attr({"data-index":i,"lay-data-index":a,"data-level":l}).data("index",i))}),o.renderTreeTable(n.find('tr[lay-data-index="'+a+'"]'),l))},B.removeNode=function(e,t,a){var n,i,l,d,r,o,c,u,s=j(e);s&&(i=(u=(n=s.getOptions()).tree).customName.isParent,l=u.customName.children,d=n.elem.next(),r=[],o=P.cache[e],t=s.getNodeDataByIndex("string"===layui.type(t)?t:t[z],!1,"delete"),c=s.getNodeDataByIndex(t[f]),s.updateCheckStatus(c),u=s.treeToFlat([t],t[u.customName.pid],t[f]),layui.each(u,function(e,t){t=t[z];r.push('tr[lay-data-index="'+t+'"]'),-1!==t.indexOf("-")&&delete o[t]}),d.find(r.join(",")).remove(),t=s.initData(),function(){for(var e in o)-1!==e.indexOf("-")&&e!==o[e][z]&&delete o[e]}(),layui.each(s.treeToFlat(t),function(e,t){t[b]&&t[b]!==t[z]&&d.find('tr[lay-data-index="'+t[b]+'"]').attr({"data-index":t[z],"lay-data-index":t[z]}).data("index",t[z])}),layui.each(o,function(e,t){d.find('tr[data-level="0"][lay-data-index="'+t[z]+'"]').attr("data-index",e).data("index",e)}),n.hasNumberCol&&v(s),c&&(u=d.find('tr[lay-data-index="'+c[z]+'"]'),a||(c[i]=!(!c[l]||!c[l].length)),s.updateNodeIcon({scopeEl:u,isExpand:c[H],isParent:c[i]})),B.resize(e))},B.addNodes=function(e,t){var a=j(e);if(a){var n=a.getOptions(),i=n.tree,l=n.elem.next(),d=P.config.checkName,r=(t=t||{}).parentIndex,o=t.index,c=t.data,t=t.focus,u=(r="number"===layui.type(r)?r.toString():r)?a.getNodeDataByIndex(r):null,o="number"===layui.type(o)?o:-1,c=A.extend(!0,[],layui.isArray(c)?c:[c]);layui.each(c,function(e,t){d in t||!u||(t[d]=u[d])}),a.getTableData();if(u){var s=i.customName.isParent,f=i.customName.children;u[s]=!0;var y=(y=u[f])?(p=y.splice(-1===o?y.length:o),u[f]=y.concat(c,p)):u[f]=c,f=(a.updateStatus(y,function(e){(e[s]||i.view.showFlexIconIfNotParent)&&(e[X]=!1)}),a.treeToFlat(y));l.find(f.map(function(e){return'tr[lay-data-index="'+e[z]+'"]'}).join(",")).remove(),a.initData(),u[X]=!1,u[V]="local",J({trElem:l.find('tr[lay-data-index="'+r+'"]')},!0)}else{var p=P.cache[e].splice(-1===o?P.cache[e].length:o);if(P.cache[e]=P.cache[e].concat(c,p),n.url||(n.page?(y=n.page,n.data.splice.apply(n.data,[y.limit*(y.curr-1),y.limit].concat(P.cache[e]))):n.data=P.cache[e]),a.initData(),l.find(".layui-none").length)return P.renderData(e),c;var x,f=P.getTrHtml(e,c),h={trs:A(f.trs.join("")),trs_fixed:A(f.trs_fixed.join("")),trs_fixed_r:A(f.trs_fixed_r.join(""))},r=(layui.each(c,function(e,t){x={"data-index":t[z],"lay-data-index":t[z],"data-level":"0"},h.trs.eq(e).attr(x).data("index",t[z]),h.trs_fixed.eq(e).attr(x).data("index",t[z]),h.trs_fixed_r.eq(e).attr(x).data("index",t[z])}),parseInt(c[0][z])-1),y=l.find(q),n=l.find(R),f=l.find(Y);-1==r?y.find('tr[data-level="0"][data-index="0"]')[0]?(y.find('tr[data-level="0"][data-index="0"]').before(h.trs),n.find('tr[data-level="0"][data-index="0"]').before(h.trs_fixed),f.find('tr[data-level="0"][data-index="0"]').before(h.trs_fixed_r)):(y.find("tbody").prepend(h.trs),n.find("tbody").prepend(h.trs_fixed),f.find("tbody").prepend(h.trs_fixed_r)):-1===o?(y.find("tbody").append(h.trs),n.find("tbody").append(h.trs_fixed),f.find("tbody").append(h.trs_fixed_r)):(r=p[0][b],y.find('tr[data-level="0"][data-index="'+r+'"]').before(h.trs),n.find('tr[data-level="0"][data-index="'+r+'"]').before(h.trs_fixed),f.find('tr[data-level="0"][data-index="'+r+'"]').before(h.trs_fixed_r)),layui.each(P.cache[e],function(e,t){l.find('tr[data-level="0"][lay-data-index="'+t[z]+'"]').attr("data-index",e).data("index",e)}),a.renderTreeTable(l.find(c.map(function(e,t,a){return'tr[lay-data-index="'+e[z]+'"]'}).join(",")))}return a.updateCheckStatus(u),u&&(o=l.find('tr[lay-data-index="'+u[z]+'"]'),a.updateNodeIcon({scopeEl:o,isExpand:u[H],isParent:u[s]})),B.resize(e),t&&l.find(q).find('tr[lay-data-index="'+c[0][z]+'"]').get(0).scrollIntoViewIfNeeded(),c}},B.checkStatus=function(e,n){var i,t,a,l=j(e);if(l)return l=l.getOptions().tree,i=P.config.checkName,t=B.getData(e,!0).filter(function(e,t,a){return e[i]||n&&e[g]}),a=!0,layui.each("all"===l.data.cascade?P.cache[e]:B.getData(e,!0),function(e,t){if(!t[i])return!(a=!1)}),{data:t,isAll:a}},B.on("sort",function(e){var e=e.config,t=e.elem.next(),e=e.id;t.hasClass(m)&&B.sort(e)}),B.on("row",function(e){e.config.elem.next().hasClass(m)&&o(e)}),B.on("rowDouble",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(m)&&(o(e),(t.tree||{}).view.dblClickExpand)&&J({trElem:e.tr.first()},null,null,null,!0)}),B.on("rowContextmenu",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(m)&&o(e)}),B.on("tool",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(m)&&o(e)}),B.on("edit",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(m)&&(o(e),e.field===t.tree.customName.name)&&((a={})[e.field]=e.value,e.update(a))}),B.on("radio",function(e){var t=e.config,a=t.elem.next(),t=t.id;a.hasClass(m)&&(a=j(t),o(e),u.call(a,e.tr,e.checked))}),a.prototype.setRowCheckedClass=function(e,t){var a=this.getOptions(),n=(e.data("index"),a.elem.next());e[t?"addClass":"removeClass"](l),e.each(function(){var e=A(this).data("index");n.find('.layui-table-fixed-r tbody tr[data-index="'+e+'"]')[t?"addClass":"removeClass"](l)})},a.prototype.updateCheckStatus=function(e,t){var a,n,i,l,d,r,o,c=this,u=c.getOptions();return!!u.hasChecboxCol&&(a=u.tree,n=u.id,i=u.elem.next(),l=P.config.checkName,"all"!==(d=a.data.cascade)&&"parent"!==d||!e||(d=c.updateParentCheckStatus(e,"boolean"===layui.type(t)?t:null),layui.each(d,function(e,t){var a=i.find('tr[lay-data-index="'+t[z]+'"] input[name="layTableCheckbox"]:not(:disabled)'),n=t[l];c.setRowCheckedClass(a.closest("tr"),n),a.prop({checked:n,indeterminate:t[g]})})),o=!(r=!0),0<(e=(e="all"===a.data.cascade?P.cache[n]:B.getData(n,!0)).filter(function(e){return!e[u.disabledName]})).length?layui.each(e,function(e,t){if((t[l]||t[g])&&(o=!0),t[l]||(r=!1),o&&!r)return!0}):r=!1,o=o&&!r,i.find('input[name="layTableCheckbox"][lay-filter="layTableAllChoose"]').prop({checked:r,indeterminate:o}),r)},a.prototype.updateParentCheckStatus=function(a,n){var i,e=this.getOptions(),t=e.tree,e=e.id,l=P.config.checkName,t=t.customName.children,d=[];return!(a[g]=!1)===n?a[t].length?layui.each(a[t],function(e,t){if(!t[l])return n=!1,a[g]=!0}):n=!1:!1===n?layui.each(a[t],function(e,t){if(t[l]||t[g])return a[g]=!0}):(n=!1,i=0,layui.each(a[t],function(e,t){t[l]&&i++}),n=a[t].length?a[t].length===i:a[l],a[g]=!n&&0li"],n.bodyElem=["."+C.CONST.BODY+":eq(0)",">."+C.CONST.ITEM],n.getContainer=function(){var e=n.documentElem||t.elem;return{header:{elem:e.find(n.headerElem[0]),items:e.find(n.headerElem.join(""))},body:{elem:e.find(n.bodyElem[0]),items:e.find(n.bodyElem.join(""))}}},"array"===layui.type(t.header)?"string"==typeof t.header[0]?(n.headerElem=t.header.concat(),n.documentElem=p(document)):(n.elemView=p('
                                      '),t.className&&n.elemView.addClass(t.className),a=p('
                                        '),i=p('
                                        '),layui.each(t.header,function(e,t){t=n.renderHeaderItem(t);a.append(t)}),layui.each(t.body,function(e,t){t=n.renderBodyItem(t);i.append(t)}),n.elemView.append(a).append(i),t.elem.html(n.elemView)):n.renderClose(),"array"===layui.type(t.body)&&"string"==typeof t.body[0]&&(n.documentElem=p(document),n.bodyElem=t.body.concat()),n.data());"index"in t&&e.index!=t.index?n.change(n.findHeaderItem(t.index),!0):-1===e.index&&n.change(n.findHeaderItem(0),!0),n.roll("auto"),t.elem.hasClass(C.CONST.CLASS_HIDEV)&&t.elem.removeClass(C.CONST.CLASS_HIDEV),"function"==typeof t.afterRender&&t.afterRender(e),layui.event.call(t.elem[0],C.CONST.MOD_NAME,"afterRender("+t.id+")",e)},events:function(){var e,t=this,a=t.config,i=t.getContainer(),n=C.CONST.MOD_NAME,i=(t.documentElem?i.header:a).elem,a=a.trigger+(".lay_"+n+"_trigger"),n=t.documentElem?t.headerElem[1]:t.headerElem.join("");i.off(a).on(a,n,function(){t.change(p(this))}),r.onresize||(p(window).on("resize",function(){clearTimeout(e),e=setTimeout(function(){layui.each(C.cache.id,function(e){e=C.getInst(e);e&&e.roll("init")})},50)}),r.onresize=!0)}}),r={},t=C.Class;t.prototype.add=function(e){var t,a,i=this,n=(i.config,i.getContainer()),r=i.renderHeaderItem(e),d=i.renderBodyItem(e),o=i.data();e=p.extend({active:!0},e),/(before|after)/.test(e.mode)?(a=(t=e.hasOwnProperty("index"))?i.findHeaderItem(e.index):o.thisHeaderItem,t=t?i.findBodyItem(e.index):o.thisHeaderItem,a[e.mode](r),t[e.mode](d)):(a={prepend:"prepend",append:"append"}[e.mode||"append"]||"append",n.header.elem[a](r),n.body.elem[a](d)),e.active?i.change(r,!0):i.roll("auto"),"function"==typeof e.done&&e.done(p.extend(o,{headerItem:r,bodyItem:d}))},t.prototype.close=function(e,t){if(e&&e[0]){var a=this,i=a.config,n=e.index();if(e[0]&&"false"!==e.attr("lay-closable")){var r=a.data();if(!t)if(!1===layui.event.call(e[0],C.CONST.MOD_NAME,"beforeClose("+i.id+")",p.extend(r,{index:e.index()})))return;e.hasClass(C.CONST.CLASS_THIS)&&(e.next()[0]?a.change(e.next(),!0):e.prev()[0]&&a.change(e.prev(),!0)),e.remove(),a.findBodyItem(n).remove(),a.roll("auto",n);r=a.data();layui.event.call(r.thisHeaderItem[0],C.CONST.MOD_NAME,"afterClose("+i.id+")",r)}}},t.prototype.closeMult=function(e,t){var a,i=this,n=i.config,r=i.getContainer(),d=i.data(),o=r.header.items,l=r.body.items,r='[lay-closable="false"]',s=":not("+r+")",d=(t=t===undefined?d.index:t,o.each(function(e){var t=p(this).attr("lay-closable");t&&l.eq(e).attr("lay-closable",t)}),"false"!==d.thisHeaderItem.attr("lay-closable")&&("all"!==e&&e?t!==d.index&&i.change(i.findHeaderItem(t),!0):(a=o.filter(":gt("+d.index+")"+r).eq(0),r=p(o.filter(":lt("+d.index+")"+r).get().reverse()).eq(0),a[0]?i.change(a,!0):r[0]&&i.change(r,!0))),("other"===e?(o.eq(t).siblings(s).remove(),l.eq(t).siblings(s)):"right"===e?(o.filter(":gt("+t+")"+s).remove(),l.filter(":gt("+t+")"+s)):(o.filter(s).remove(),l.filter(s))).remove(),i.roll("auto"),i.data());layui.event.call(d.thisHeaderItem[0],C.CONST.MOD_NAME,"afterClose("+n.id+")",d)},t.prototype.change=function(e,t){if(e&&e[0]){var a=this,i=a.config,n=e.attr("lay-id")||e.index(),r=e.find("a"),r="string"==typeof r.attr("href")&&"_blank"===r.attr("target"),d="string"==typeof e.attr("lay-unselect");if(!r&&!d){r=a.data();if(!t)if(!1===layui.event.call(e[0],C.CONST.MOD_NAME,"beforeChange("+i.id+")",p.extend(r,{from:{index:r.index,headerItem:r.thisHeaderItem},to:{index:e.index(),headerItem:e}})))return;e.addClass(C.CONST.CLASS_THIS).siblings().removeClass(C.CONST.CLASS_THIS),a.findBodyItem(n).addClass(C.CONST.CLASS_SHOW).siblings().removeClass(C.CONST.CLASS_SHOW),a.roll("auto",n);r=a.data();layui.event.call(r.thisHeaderItem[0],C.CONST.MOD_NAME,"afterChange("+i.id+")",r)}}},t.prototype.renderHeaderItem=function(e){var t=this.config,t=p(e.headerItem||t.headerItem||"
                                      • ");return t.html(e.title||"New Tab").attr("lay-id",e.id),this.appendClose(t,e),t},t.prototype.renderBodyItem=function(e){var t=this.config,t=p(e.bodyItem||t.bodyItem||'
                                        ');return t.html(e.content||"").attr("lay-id",e.id),t},t.prototype.appendClose=function(e,t){var a=this;a.config.closable&&0!=(t=t||{}).closable&&"false"!==e.attr("lay-closable")&&!e.find("."+C.CONST.CLOSE)[0]&&((t=p('')).on("click",function(){return a.close(p(this).parent()),!1}),e.append(t))},t.prototype.renderClose=function(){var t=this,a=t.config;t.getContainer().header.items.each(function(){var e=p(this);a.closable?t.appendClose(e):e.find("."+C.CONST.CLOSE).remove()})},t.prototype.roll=function(e,i){var n=this,t=n.config,a=n.getContainer(),r=a.header.elem,d=a.header.items,a=r.prop("scrollWidth"),o=Math.ceil(r.outerWidth()),l=r.data("left")||0,s="scroll"===t.headerMode,c="layui-tabs-scroll",f="layui-tabs-bar",u=["layui-icon-prev","layui-icon-next"],m={elem:p('
                                        '),bar:p(['
                                        ','','',"
                                        "].join(""))};if("normal"!==t.headerMode){var h,y=r.parent("."+c);if(s||!s&&o=o-l)return r.css("left",-a).data("left",-a),!1}),l=r.data("left")||0,y.find("."+u[0])[l<0?"removeClass":"addClass"](C.CONST.CLASS_DISABLED),y.find("."+u[1])[0')),n=(e.tree(a),i.elem=p(i.elem));if(n[0]){if(e.key=i.id||e.index,e.elem=a,e.elemNone=p('
                                        '+i.text.none+"
                                        "),n.html(e.elem),0==e.elem.find(".layui-tree-set").length)return e.elem.append(e.elemNone);i.showCheckbox&&e.renderForm("checkbox"),e.elem.find(".layui-tree-set").each(function(){var e=p(this);e.parent(".layui-tree-pack")[0]||e.addClass("layui-tree-setHide"),!e.next()[0]&&e.parents(".layui-tree-pack").eq(1).hasClass("layui-tree-lineExtend")&&e.addClass(T),e.next()[0]||e.parents(".layui-tree-set").eq(0).next()[0]||e.addClass(T)}),e.events()}},l.prototype.renderForm=function(e){i.render(e,"LAY-tree-"+this.index)},l.prototype.tree=function(r,e){var d=this,s=d.config,o=s.customName,e=e||s.data;layui.each(e,function(e,i){var a,n,t=i[o.children]&&0"),c=p(['
                                        ','
                                        ','
                                        ',s.showLine?t?'':'':'',s.showCheckbox?'':"",s.isJump&&i.href?''+(i[o.title]||i.label||s.text.defaultNodeName)+"":''+(i[o.title]||i.label||s.text.defaultNodeName)+"","
                                        ",s.edit?(a={add:'',update:'',del:''},n=['
                                        '],!0===s.edit&&(s.edit=["update","del"]),"object"==typeof s.edit?(layui.each(s.edit,function(e,i){n.push(a[i]||"")}),n.join("")+"
                                        "):void 0):"","
                                        "].join(""));t&&(c.append(l),d.tree(l,i[o.children])),r.append(c),c.prev("."+k)[0]&&c.prev().children(".layui-tree-pack").addClass("layui-tree-showLine"),t||c.parent(".layui-tree-pack").addClass("layui-tree-lineExtend"),d.spread(c,i),s.showCheckbox&&(i.checked&&d.checkids.push(i[o.id]),d.checkClick(c,i)),s.edit&&d.operate(c,i)})},l.prototype.spread=function(n,t){var l=this,c=l.config,e=n.children("."+b),i=e.children("."+g),a=i.find('input[same="layuiTreeCheck"]'),r=e.find("."+C),e=e.find("."+w),d=c.onlyIconControl?r:i,s="";d.on("click",function(e){var i=n.children("."+N),a=(d.children(".layui-icon")[0]?d:d.find(".layui-tree-icon")).children(".layui-icon");i[0]?n.hasClass(F)?(n.removeClass(F),i.slideUp(200),a.removeClass(x).addClass(v),l.updateFieldValue(t,"spread",!1)):(n.addClass(F),i.slideDown(200),a.addClass(x).removeClass(v),l.updateFieldValue(t,"spread",!0),c.accordion&&((i=n.siblings("."+k)).removeClass(F),i.children("."+N).slideUp(200),i.find(".layui-tree-icon").children(".layui-icon").removeClass(x).addClass(v))):s="normal"}),e.on("click",function(){p(this).hasClass(u)||(s=n.hasClass(F)?c.onlyIconControl?"open":"close":c.onlyIconControl?"close":"open",a[0]&&l.updateFieldValue(t,"checked",a.prop("checked")),c.click&&c.click({elem:n,state:s,data:t}))})},l.prototype.updateFieldValue=function(e,i,a){i in e&&(e[i]=a)},l.prototype.setCheckbox=function(e,i,a){var t,n=this,l=n.config.customName,c=a.prop("checked");a.prop("disabled")||("object"!=typeof i[l.children]&&!e.find("."+N)[0]||e.find("."+N).find('input[same="layuiTreeCheck"]').each(function(e){this.disabled||((e=i[l.children][e])&&n.updateFieldValue(e,"checked",c),n.updateFieldValue(this,"checked",c))}),(t=function(e){var i,a,n;e.parents("."+k)[0]&&(a=(e=e.parent("."+N)).parent(),n=e.prev().find('input[same="layuiTreeCheck"]'),c?n.prop("checked",c):(e.find('input[same="layuiTreeCheck"]').each(function(){this.checked&&(i=!0)}),i||n.prop("checked",!1)),t(a))})(e),n.renderForm("checkbox"))},l.prototype.checkClick=function(a,n){var t=this,l=t.config;a.children("."+b).children("."+g).on("click",'input[same="layuiTreeCheck"]+',function(e){layui.stope(e);var e=p(this).prev(),i=e.prop("checked");e.prop("disabled")||(t.setCheckbox(a,n,e),t.updateFieldValue(n,"checked",i),l.oncheck&&l.oncheck({elem:a,checked:i,data:n}))})},l.prototype.operate=function(r,d){var s=this,o=s.config,u=o.customName,e=r.children("."+b),h=e.children("."+g);e.children(".layui-tree-btnGroup").on("click",".layui-icon",function(e){layui.stope(e);var i,e=p(this).data("type"),n=r.children("."+N),t={data:d,type:e,elem:r};if("add"==e){n[0]||(o.showLine?(h.find("."+C).addClass("layui-tree-icon"),h.find("."+C).children(".layui-icon").addClass(v).removeClass("layui-icon-file")):h.find(".layui-tree-iconArrow").removeClass(m),r.append('
                                        '));var a,l=o.operate&&o.operate(t),c={};if(c[u.title]=o.text.defaultNodeName,c[u.id]=l,s.tree(r.children("."+N),[c]),o.showLine&&(n[0]?(n.hasClass(S)||n.addClass(S),r.find("."+N).each(function(){p(this).children("."+k).last().addClass(T)}),(n.children("."+k).last().prev().hasClass(T)?n.children("."+k).last().prev():n.children("."+k).last()).removeClass(T),!r.parent("."+N)[0]&&r.next()[0]&&n.children("."+k).last().removeClass(T)):(l=r.siblings("."+k),a=1,c=r.parent("."+N),layui.each(l,function(e,i){p(i).children("."+N)[0]||(a=0)}),(1==a?(l.children("."+N).addClass(L),l.children("."+N).children("."+k).removeClass(T),r.children("."+N).addClass(L),c.removeClass(S),c.children("."+k).last().children("."+N).children("."+k).last()):r.children("."+N).children("."+k)).addClass(T))),!o.showCheckbox)return;h.find('input[same="layuiTreeCheck"]')[0].checked&&(r.children("."+N).children("."+k).last().find('input[same="layuiTreeCheck"]')[0].checked=!0),s.renderForm("checkbox")}else"update"==e?(l=h.children("."+w).html(),h.children("."+w).html(""),h.append(''),h.children(".layui-tree-editInput").val(f.unescape(l)).focus(),i=function(e){var i=f.escape(e.val().trim())||o.text.defaultNodeName;e.remove(),h.children("."+w).html(i),t.data[u.title]=i,o.operate&&o.operate(t)},h.children(".layui-tree-editInput").blur(function(){i(p(this))}),h.children(".layui-tree-editInput").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),i(p(this)))})):y.confirm('\u786e\u8ba4\u5220\u9664\u8be5\u8282\u70b9 "'+(d[u.title]||"")+'" \u5417\uff1f',function(e){var l,a,i;o.operate&&o.operate(t),t.status="remove",y.close(e),r.prev("."+k)[0]||r.next("."+k)[0]||r.parent("."+N)[0]?(r.siblings("."+k).children("."+b)[0]?(o.showCheckbox&&(l=function(e){var i,a,n,t;e.parents("."+k)[0]&&(i=e.siblings("."+k).children("."+b),a=(e=e.parent("."+N).prev()).find('input[same="layuiTreeCheck"]')[0],n=1,(t=0)==a.checked)&&(i.each(function(e,i){i=p(i).find('input[same="layuiTreeCheck"]')[0];0!=i.checked||i.disabled||(n=0),i.disabled||(t=1)}),1==n)&&1==t&&(a.checked=!0,s.renderForm("checkbox"),l(e.parent("."+k)))})(r),o.showLine&&(e=r.siblings("."+k),a=1,i=r.parent("."+N),layui.each(e,function(e,i){p(i).children("."+N)[0]||(a=0)}),1==a?(n[0]||(i.removeClass(S),e.children("."+N).addClass(L),e.children("."+N).children("."+k).removeClass(T)),(r.next()[0]?i.children("."+k).last():r.prev()).children("."+N).children("."+k).last().addClass(T),r.next()[0]||r.parents("."+k)[1]||r.parents("."+k).eq(0).next()[0]||r.prev("."+k).addClass(T)):!r.next()[0]&&r.hasClass(T)&&r.prev().addClass(T))):(e=r.parent("."+N).prev(),o.showLine?(e.find("."+C).removeClass("layui-tree-icon"),e.find("."+C).children(".layui-icon").removeClass(x).addClass("layui-icon-file"),(i=e.parents("."+N).eq(0)).addClass(S),i.children("."+k).each(function(){p(this).children("."+N).children("."+k).last().addClass(T)})):e.find(".layui-tree-iconArrow").addClass(m),r.parents("."+k).eq(0).removeClass(F),r.parent("."+N).remove()),r.remove()):(r.remove(),s.elem.append(s.elemNone))})})},l.prototype.events=function(){var i=this,t=i.config;i.elem.find(".layui-tree-checkedFirst");i.setChecked(i.checkids),i.elem.find(".layui-tree-search").on("keyup",function(){var e=p(this),a=e.val(),e=e.nextAll(),n=[];e.find("."+w).each(function(){var i,e=p(this).parents("."+b);-1!=p(this).html().indexOf(a)&&(n.push(p(this).parent()),(i=function(e){e.addClass("layui-tree-searchShow"),e.parent("."+N)[0]&&i(e.parent("."+N).parent("."+k))})(e.parent("."+k)))}),e.find("."+b).each(function(){var e=p(this).parent("."+k);e.hasClass("layui-tree-searchShow")||e.addClass(m)}),0==e.find(".layui-tree-searchShow").length&&i.elem.append(i.elemNone),t.onsearch&&t.onsearch({elem:n})}),i.elem.find(".layui-tree-search").on("keydown",function(){p(this).nextAll().find("."+b).each(function(){p(this).parent("."+k).removeClass("layui-tree-searchShow "+m)}),p(".layui-tree-emptyText")[0]&&p(".layui-tree-emptyText").remove()})},l.prototype.getChecked=function(){var t=this,e=t.config,l=e.customName,i=[],a=[],c=(t.elem.find(".layui-form-checked").each(function(){i.push(p(this).prev()[0].value)}),function(e,n){layui.each(e,function(e,a){layui.each(i,function(e,i){if(a[l.id]==i)return t.updateFieldValue(a,"checked",!0),delete(i=p.extend({},a))[l.children],n.push(i),a[l.children]&&(i[l.children]=[],c(a[l.children],i[l.children])),!0})})});return c(p.extend({},e.data),a),a},l.prototype.setChecked=function(l){this.config;this.elem.find("."+k).each(function(e,i){var a=p(this).data("id"),n=p(i).children("."+b).find('input[same="layuiTreeCheck"]'),t=n.next();if("number"==typeof l){if(a.toString()==l.toString())return n[0].checked||t.click(),!1}else"object"==typeof l&&layui.each(l,function(e,i){if(i.toString()==a.toString()&&!n[0].checked)return t.click(),!0})})},n.that={},n.config={},t.reload=function(e,i){e=n.that[e];return e.reload(i),n.call(e)},t.getChecked=function(e){return n.that[e].getChecked()},t.setChecked=function(e,i){return n.that[e].setChecked(i)},t.render=function(e){e=new l(e);return n.call(e)},e(a,t)});layui.define(["laytpl","form"],function(e){"use strict";var d=layui.$,n=layui.laytpl,t=layui.form,a="transfer",i={config:{},index:layui[a]?layui[a].index+1e4:0,set:function(e){var t=this;return t.config=d.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,a,e,t)}},l=function(){var t=this,e=t.config,a=e.id||t.index;return l.that[a]=t,{config:l.config[a]=e,reload:function(e){t.reload.call(t,e)},getData:function(){return t.getData.call(t)}}},s="layui-hide",u="layui-btn-disabled",c="layui-none",r="layui-transfer-box",h="layui-transfer-header",o="layui-transfer-search",f="layui-transfer-data",y=function(e){return['
                                        ','
                                        ','","
                                        ","{{# if(d.data.showSearch){ }}",'","{{# } }}",'
                                          ',"
                                          "].join("")},p=['
                                          ',y({index:0,checkAllName:"layTransferLeftCheckAll"}),'
                                          ','",'","
                                          ",y({index:1,checkAllName:"layTransferRightCheckAll"}),"
                                          "].join(""),v=function(e){var t=this;t.index=++i.index,t.config=d.extend({},t.config,i.config,e),t.render()};v.prototype.config={title:["\u5217\u8868\u4e00","\u5217\u8868\u4e8c"],width:200,height:360,data:[],value:[],showSearch:!1,id:"",text:{none:"\u65e0\u6570\u636e",searchNone:"\u65e0\u5339\u914d\u6570\u636e"}},v.prototype.reload=function(e){var t=this;t.config=d.extend({},t.config,e),t.render()},v.prototype.render=function(){var e=this,t=e.config,a=e.elem=d(n(p,{open:"{{",close:"}}",tagStyle:"legacy"}).render({data:t,index:e.index})),i=t.elem=d(t.elem);i[0]&&(t.data=t.data||[],t.value=t.value||[],t.id="id"in t?t.id:elem.attr("id")||e.index,e.key=t.id,i.html(e.elem),e.layBox=e.elem.find("."+r),e.layHeader=e.elem.find("."+h),e.laySearch=e.elem.find("."+o),e.layData=a.find("."+f),e.layBtn=a.find(".layui-transfer-active .layui-btn"),e.layBox.css({width:t.width,height:t.height}),e.layData.css({height:(i=t.height-e.layHeader.outerHeight(),t.showSearch&&(i-=e.laySearch.outerHeight()),i-2)}),e.renderData(),e.events())},v.prototype.renderData=function(){var e=this,t=e.config,l=[{checkName:"layTransferLeftCheck",views:[]},{checkName:"layTransferRightCheck",views:[]}];e.parseData(function(a){var i=a.selected?1:0,n=["
                                        • ",'',"
                                        • "].join("");i?layui.each(t.value,function(e,t){t==a.value&&a.selected&&(l[i].views[e]=n)}):l[i].views.push(n),delete a.selected}),e.layData.eq(0).html(l[0].views.join("")),e.layData.eq(1).html(l[1].views.join("")),e.renderCheckBtn()},v.prototype.renderForm=function(e){t.render(e,"LAY-transfer-"+this.index)},v.prototype.renderCheckBtn=function(c){var r=this,o=r.config;c=c||{},r.layBox.each(function(e){var t=d(this),a=t.find("."+f),t=t.find("."+h).find('input[type="checkbox"]'),i=a.find('input[type="checkbox"]'),n=0,l=!1;i.each(function(){var e=d(this).data("hide");(this.checked||this.disabled||e)&&n++,this.checked&&!e&&(l=!0)}),t.prop("checked",l&&n===i.length),r.layBtn.eq(e)[l?"removeClass":"addClass"](u),c.stopNone||(i=a.children("li:not(."+s+")").length,r.noneView(a,i?"":o.text.none))}),r.renderForm("checkbox")},v.prototype.noneView=function(e,t){var a=d('

                                          '+(t||"")+"

                                          ");e.find("."+c)[0]&&e.find("."+c).remove(),t.replace(/\s/g,"")&&e.append(a)},v.prototype.setValue=function(){var e=this.config,t=[];return this.layBox.eq(1).find("."+f+' input[type="checkbox"]').each(function(){d(this).data("hide")||t.push(this.value)}),e.value=t,this},v.prototype.parseData=function(t){var i=this.config,n=[];return layui.each(i.data,function(e,a){a=("function"==typeof i.parseData?i.parseData(a):a)||a,n.push(a=d.extend({},a)),layui.each(i.value,function(e,t){t==a.value&&(a.selected=!0)}),t&&t(a)}),i.data=n,this},v.prototype.getData=function(e){var t=this.config,i=[];return this.setValue(),layui.each(e||t.value,function(e,a){layui.each(t.data,function(e,t){delete t.selected,a==t.value&&i.push(t)})}),i},v.prototype.transfer=function(e,t){var a,i=this,n=i.config,l=i.layBox.eq(e),c=[],t=(t?((a=(t=t).find('input[type="checkbox"]'))[0].checked=!1,l.siblings("."+r).find("."+f).append(t.clone()),t.remove(),c.push(a[0].value),i.setValue()):l.each(function(e){d(this).find("."+f).children("li").each(function(){var e=d(this),t=e.find('input[type="checkbox"]'),a=t.data("hide");t[0].checked&&!a&&(t[0].checked=!1,l.siblings("."+r).find("."+f).append(e.clone()),e.remove(),c.push(t[0].value)),i.setValue()})}),i.renderCheckBtn(),l.siblings("."+r).find("."+o+" input"));""!==t.val()&&t.trigger("keyup"),n.onchange&&n.onchange(i.getData(c),e)},v.prototype.events=function(){var n=this,l=n.config;n.elem.on("click",'input[lay-filter="layTransferCheckbox"]+',function(){var e=d(this).prev(),t=e[0].checked,a=e.parents("."+r).eq(0).find("."+f);e[0].disabled||("all"===e.attr("lay-type")&&a.find('input[type="checkbox"]').each(function(){this.disabled||(this.checked=t)}),setTimeout(function(){n.renderCheckBtn({stopNone:!0})},0))}),n.elem.on("dblclick","."+f+">li",function(e){var t=d(this),a=t.children('input[type="checkbox"]'),i=t.parent().parent().data("index");a[0].disabled||!1!==("function"==typeof l.dblclick?l.dblclick({elem:t,data:n.getData([a[0].value])[0],index:i}):null)&&n.transfer(i,t)}),n.layBtn.on("click",function(){var e=d(this),t=e.data("index");e.hasClass(u)||n.transfer(t)}),n.laySearch.find("input").on("keyup",function(){var i=this.value,e=d(this).parents("."+o).eq(0).siblings("."+f),t=e.children("li"),t=(t.each(function(){var e=d(this),t=e.find('input[type="checkbox"]'),a=t[0].title,a=("cs"!==l.showSearch&&(a=a.toLowerCase(),i=i.toLowerCase()),-1!==a.indexOf(i));e[a?"removeClass":"addClass"](s),t.data("hide",!a)}),n.renderCheckBtn(),t.length===e.children("li."+s).length);n.noneView(e,t?l.text.searchNone:"")})},l.that={},l.config={},i.reload=function(e,t){e=l.that[e];return e.reload(t),l.call(e)},i.getData=function(e){return l.that[e].getData()},i.render=function(e){e=new v(e);return l.call(e)},e(a,i)});layui.define(["jquery","lay"],function(e){"use strict";var o=layui.$,l=layui.lay,t=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=o.extend({},n.config,e),n},on:function(e,n){return layui.onevent.call(this,r,e,n)}}),r="carousel",s="layui-this",u="layui-carousel-left",c="layui-carousel-right",m="layui-carousel-prev",h="layui-carousel-next",a="layui-carousel-arrow",d="layui-carousel-ind",n=function(e){var n=this;n.config=o.extend({},n.config,t.config,e),n.render()};n.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},n.prototype.render=function(){var e=this,n=e.config,i=o(n.elem);if(1*[carousel-item]>*"),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(s),e.indicator(),e.arrow(),e.autoplay(),1=this.elemItem.length?0:e},n.prototype.addIndex=function(e){var n=this.config;n.index=n.index+(e=e||1),n.index>=this.elemItem.length&&(n.index=0)},n.prototype.subIndex=function(e){var n=this.config;n.index=n.index-(e=e||1),n.index<0&&(n.index=this.elemItem.length-1)},n.prototype.autoplay=function(){var e=this,n=e.config,i=e.elemItem.length;n.autoplay&&(clearInterval(e.timer),1',''].join(""));e.elem.attr("lay-arrow",e.arrow),e.elem.find("."+a)[0]&&e.elem.find("."+a).remove(),1i.index?n.slide("add",e-i.index):e
                                            ',(n=[],layui.each(e.elemItem,function(e){n.push("")}),n.join("")),"
                                          "].join(""));i.elem.attr("lay-indicator",i.indicator),i.elem.find("."+d)[0]&&i.elem.find("."+d).remove(),1t[a?"height":"width"]()/3)&&o.slide(0"),i=1;i<=a.length;i++){var n='
                                        • ";a.half&&parseInt(a.value)!==a.value&&i==Math.ceil(a.value)?t=t+'
                                        • ":t+=n}t+="",a.text&&(t+=''+a.value+"");var s=a.elem,o=s.next("."+c.ELEM);o[0]&&o.remove(),e.elemTemplate=u(t),a.span=e.elemTemplate.next("span"),a.setText&&a.setText(a.value),s.html(e.elemTemplate),s.addClass("layui-inline"),a.readonly||e.action()},extendsInstance:function(){var a=this,l=a.config;return{setvalue:function(e){l.value=e,a.render()}}}}),c=l.CONST;l.Class.prototype.action=function(){var n=this.config,t=this.elemTemplate,i=t.find("i").width(),l=t.children("li");l.each(function(e){var a=e+1,l=u(this);l.on("click",function(e){n.value=a,n.half&&e.pageX-u(this).offset().left<=i/2&&(n.value=n.value-.5),n.text&&t.next("span").text(n.value),n.choose&&n.choose(n.value),n.setText&&n.setText(n.value)}),l.on("mousemove",function(e){t.find("i").each(function(){u(this).addClass(c.ICON_RATE).removeClass(c.ICON_SOLID_HALF)}),t.find("i:lt("+a+")").each(function(){u(this).addClass(c.ICON_RATE_SOLID).removeClass(c.ICON_HALF_RATE)}),n.half&&e.pageX-u(this).offset().left<=i/2&&l.children("i").addClass(c.ICON_RATE_HALF).removeClass(c.ICON_RATE_SOLID)}),l.on("mouseleave",function(){t.find("i").each(function(){u(this).addClass(c.ICON_RATE).removeClass(c.ICON_SOLID_HALF)}),t.find("i:lt("+Math.floor(n.value)+")").each(function(){u(this).addClass(c.ICON_RATE_SOLID).removeClass(c.ICON_HALF_RATE)}),n.half&&parseInt(n.value)!==n.value&&t.children("li:eq("+Math.floor(n.value)+")").children("i").addClass(c.ICON_RATE_HALF).removeClass(c.ICON_SOLID_RATE)})}),a.touchSwipe(t,{onTouchMove:function(e,a){var i;Date.now()-a.timeStart<=200||(a=e.touches[0].pageX,e=t.width()/n.length,a=(a-t.offset().left)/e,(i=(i=(e=a%1)<=.5&&n.half?.5+(a-e):Math.ceil(a))>n.length?n.length:i)<0&&(i=0),l.each(function(e){var a=u(this).children("i"),l=Math.ceil(i)-e==1,t=Math.ceil(i)>e,e=i-e==.5;t?(a.addClass(c.ICON_RATE_SOLID).removeClass(c.ICON_HALF_RATE),n.half&&e&&a.addClass(c.ICON_RATE_HALF).removeClass(c.ICON_RATE_SOLID)):a.addClass(c.ICON_RATE).removeClass(c.ICON_SOLID_HALF),a.toggleClass("layui-rate-hover",l)}),n.value=i,n.text&&t.next("span").text(n.value),n.setText&&n.setText(n.value))},onTouchEnd:function(e,a){Date.now()-a.timeStart<=200||(t.find("i").removeClass("layui-rate-hover"),n.choose&&n.choose(n.value),n.setText&&n.setText(n.value))}})},e(c.MOD_NAME,l)});layui.define("jquery",function(o){"use strict";var w=layui.$,l=function(o){};l.prototype.load=function(o){var i,n,r,l,c,m,e,t,a,f,s,u,p,d,y,g=this,h=0,v=w((o=o||{}).elem);if(v[0])return c=w(o.scrollElem||document),m="mb"in o?o.mb:50,e=!("isAuto"in o)||o.isAuto,t=o.moreText||"\u52a0\u8f7d\u66f4\u591a",a=o.end||"\u6ca1\u6709\u66f4\u591a\u4e86",f="top"===(o.direction||"bottom"),g._cleanup(v,c),s=o.scrollElem&&o.scrollElem!==document,p=w('"),v.find(".layui-flow-more")[0]||v[f?"prepend":"append"](p),d=function(o,l){var e=s?c.prop("scrollHeight"):document.documentElement.scrollHeight,t=c.scrollTop();o=w(o),p[f?"after":"before"](o),(l=0==l||null)?p.html(a):p.find("a").html(u),n=l,i=null,r&&r(),f&&(o=s?c.prop("scrollHeight"):document.documentElement.scrollHeight,1===h?c.scrollTop(o):1'),"function"==typeof o.done&&o.done(++h,d)})(),p.find("a").on("click.flow",function(){w(this);n||i||y()}),o.isLazyimg&&(r=g.lazyimg({elem:o.elem+" img",scrollElem:o.scrollElem,direction:o.direction})),e&&c.on("scroll.flow",function(){var e=w(this),t=e.scrollTop();l&&clearTimeout(l),!n&&v.width()&&(l=setTimeout(function(){var o=(s?e:w(window)).height(),l=s?e.prop("scrollHeight"):document.documentElement.scrollHeight;(f?t<=m:l-t-o<=m)&&!i&&y()},100))}),g},l.prototype.lazyimg=function(o){var l,m=this,a=0,f=w((o=o||{}).scrollElem||document),s=o.elem||"img",n="top"===(o.direction||"bottom"),u=o.scrollElem&&o.scrollElem!==document,p=function(l,o){var e,t=f.scrollTop(),o=t+o,i=u?l.offset().top-f.offset().top+t:l.offset().top;(n?i+l.height():i)>=t&&i<=o&&l.attr("lay-src")&&(e=l.attr("lay-src"),layui.img(e,function(){var o=m.lazyimg.elem.eq(a);l.attr("src",e).removeAttr("lay-src"),o[0]&&r(o),a++},function(){m.lazyimg.elem.eq(a);l.removeAttr("lay-src")}))},r=function(o,l){var e=(u?l||f:w(window)).height(),t=f.scrollTop(),i=t+e;if(m.lazyimg.elem=w(s),o)p(o,e);else for(var n=0;n"),preview:"Preview"},wordWrap:!0,lang:"text",highlighter:!1,langMarker:!1},R=layui.code?layui.code.index+1e4:0,j=function(e){return String(e).replace(/\s+$/,"").replace(/^\n|\n$/,"")};e("code",function(l,e){var o,i,t,a,n,d,c,s,r,u,y,p,E,f,h,v,m,L,_,M,C,g={config:l=x.extend(!0,{},T,l),reload:function(e){layui.code(this.updateOptions(e))},updateOptions:function(e){return delete(e=e||{}).elem,x.extend(!0,l,e)},reloadCode:function(e){layui.code(this.updateOptions(e),"reloadCode")}},w=x(l.elem);return 1',l.ln?['
                                          ',D.digit(t+1)+".","
                                          "].join(""):"",'
                                          ',e||" ","
                                          ",""].join("")})}},a=l.code,n=function(e){return"function"==typeof l.codeParse?l.codeParse(e,l):e},"reloadCode"===e?o.children(".layui-code-wrap").html(w(n(a)).html):(d=layui.code.index=++R,o.attr("lay-code-index",d),(M=A.CDDE_DATA_CLASS in o.data())&&o.attr("class",o.data(A.CDDE_DATA_CLASS)||""),M||o.data(A.CDDE_DATA_CLASS,o.attr("class")),c={copy:{className:"file-b",title:["\u590d\u5236\u4ee3\u7801"],event:function(e){var t=D.unescape(n(l.code)),a="function"==typeof l.onCopy;lay.clipboard.writeText({text:t,done:function(){if(a&&!1===l.onCopy(t,!0))return;W.msg("\u5df2\u590d\u5236",{icon:1})},error:function(){if(a&&!1===l.onCopy(t,!1))return;W.msg("\u590d\u5236\u5931\u8d25",{icon:2})}})}}},function b(){var e=o.parent("."+A.ELEM_PREVIEW),t=e.children("."+A.ELEM_TAB),a=e.children("."+A.ELEM_ITEM+"-preview");return t.remove(),a.remove(),e[0]&&o.unwrap(),b}(),l.preview&&(M="LAY-CODE-DF-"+d,f=l.layout||["code","preview"],s="iframe"===l.preview,E=x('
                                          '),C=x('
                                          '),r=x('
                                          '),_=x('
                                          '),u=x('
                                          '),l.id&&E.attr("id",l.id),E.addClass(l.className),C.attr("lay-filter",M),layui.each(f,function(e,t){var a=x('
                                        • ');0===e&&a.addClass("layui-this"),a.html(l.text[t]),r.append(a)}),x.extend(c,{full:{className:"screen-full",title:["\u6700\u5927\u5316\u663e\u793a","\u8fd8\u539f\u663e\u793a"],event:function(e){var e=e.elem,t=e.closest("."+A.ELEM_PREVIEW),a="layui-icon-"+this.className,i="layui-icon-screen-restore",l=this.title,o=x("html,body"),n="layui-scrollbar-hide";e.hasClass(a)?(t.addClass(A.ELEM_FULL),e.removeClass(a).addClass(i),e.attr("title",l[1]),o.addClass(n)):(t.removeClass(A.ELEM_FULL),e.removeClass(i).addClass(a),e.attr("title",l[0]),o.removeClass(n))}},window:{className:"release",title:["\u5728\u65b0\u7a97\u53e3\u9884\u89c8"],event:function(e){D.openWin({content:n(l.code)})}}}),l.copy&&("array"===layui.type(l.tools)?-1===l.tools.indexOf("copy")&&l.tools.unshift("copy"):l.tools=["copy"]),u.on("click",">i",function(){var e=x(this),t=e.data("type"),e={elem:e,type:t,options:l,rawCode:l.code,finalCode:D.unescape(n(l.code))};c[t]&&"function"==typeof c[t].event&&c[t].event(e),"function"==typeof l.toolsEvent&&l.toolsEvent(e)}),l.addTools&&l.tools&&(l.tools=[].concat(l.tools,l.addTools)),layui.each(l.tools,function(e,t){var a="object"==typeof t,i=a?t:c[t]||{className:t,title:[t]},l=i.className||i.type,o=i.title||[""],a=a?i.type||l:t;a&&(c[a]||((t={})[a]=i,x.extend(c,t)),u.append(''))}),o.addClass(A.ELEM_ITEM).wrap(E),C.append(r),l.tools&&C.append(u),o.before(C),s&&_.html(''),y=function(e){var t=e.children("iframe")[0];s&&t?t.srcdoc=n(l.code):e.html(l.code),setTimeout(function(){"function"==typeof l.done&&l.done({container:e,options:l,render:function(){N.render(e.find(".layui-form")),S.render(),I.render({elem:["."+A.ELEM_PREVIEW,".layui-tabs"].join(" ")})}})},3)},"preview"===f[0]?(_.addClass(A.ELEM_SHOW),o.before(_),y(_)):o.addClass(A.ELEM_SHOW).after(_),l.previewStyle=[l.style,l.previewStyle].join(""),_.attr("style",l.previewStyle),S.on("tab("+M+")",function(e){var t=x(this),a=x(e.elem).closest("."+A.ELEM_PREVIEW).find("."+A.ELEM_ITEM),e=a.eq(e.index);a.removeClass(A.ELEM_SHOW),e.addClass(A.ELEM_SHOW),"preview"===t.attr("lay-id")&&y(e),L()})),p=x(''),o.addClass((E=["layui-code-view layui-border-box"],l.wordWrap||E.push("layui-code-nowrap"),E.join(" "))),(C=l.theme||l.skin)&&(o.removeClass("layui-code-theme-dark layui-code-theme-light"),o.addClass("layui-code-theme-"+C)),l.highlighter&&o.addClass([l.highlighter,"language-"+l.lang,"layui-code-hl"].join(" ")),f=w(l.encode?D.escape(n(a)):a),h=f.lines,o.html(p.html(f.html)),l.ln&&o.append('
                                          '),l.height&&p.css("max-height",l.height),l.codeStyle=[l.style,l.codeStyle].join(""),l.codeStyle&&p.attr("style",function(e,t){return(t||"")+l.codeStyle}),v=[{selector:">.layui-code-wrap>.layui-code-line{}",setValue:function(e,t){e.style["padding-left"]=t+"px"}},{selector:">.layui-code-wrap>.layui-code-line>.layui-code-line-number{}",setValue:function(e,t){e.style.width=t+"px"}},{selector:">.layui-code-ln-side{}",setValue:function(e,t){e.style.width=t+"px"}}],m=lay.style({target:o[0],id:"DF-code-"+d,text:x.map(x.map(v,function(e){return e.selector}),function(e,t){return['.layui-code-view[lay-code-index="'+d+'"]',e].join(" ")}).join("")}),L=function b(){var e,i;return l.ln&&(e=Math.floor(h.length/100),i=p.children("."+A.ELEM_LINE).last().children("."+A.ELEM_LINE_NUM).outerWidth(),o.addClass(A.ELEM_LN_MODE),e)&&A.LINE_RAW_WIDTH
                                        • ')).html(l.title||l.text.code),o.prepend(_)),M=x('
                                          '),l.copy&&!l.preview&&((C=x(['','',""].join(""))).on("click",function(){c.copy.event()}),M.append(C)),l.langMarker&&M.append(''+l.lang+""),l.about&&M.append(l.about),o.append(M),l.preview||setTimeout(function(){"function"==typeof l.done&&l.done({})},3),l.elem.length===1+d&&"function"==typeof l.allDone&&l.allDone())),g})}),layui["layui.all"]||layui.addcss("modules/code.css?v=6","skincodecss"); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/rc/layuiim.js b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/layuiim.js new file mode 100644 index 0000000..1baf910 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/rc/layuiim.js @@ -0,0 +1,1244 @@ +/** layui-v2.5.6 MIT License By https://www.layui.com */; +! function (e) { + "use strict"; + var t = document, + n = { + modules: {}, + status: {}, + timeout: 10, + event: {} + }, + r = function () { + this.v = "2.5.6" + }, + o = function () { + var e = t.currentScript ? t.currentScript.src : function () { + for (var e, n = t.scripts, r = n.length - 1, o = r; o > 0; o--) + if ("interactive" === n[o].readyState) { + e = n[o].src; + break + } + return e || n[r].src + }(); + return e.substring(0, e.lastIndexOf("/") + 1) + }(), + a = function (t) { + e.console && console.error && console.error("Layui hint: " + t) + }, + i = "undefined" != typeof opera && "[object Opera]" === opera.toString(), + u = { + layer: "modules/layer", + laydate: "modules/laydate", + laypage: "modules/laypage", + laytpl: "modules/laytpl", + layim: "modules/layim", + layedit: "modules/layedit", + form: "modules/form", + upload: "modules/upload", + transfer: "modules/transfer", + tree: "modules/tree", + table: "modules/table", + element: "modules/element", + rate: "modules/rate", + colorpicker: "modules/colorpicker", + slider: "modules/slider", + carousel: "modules/carousel", + flow: "modules/flow", + util: "modules/util", + code: "modules/code", + jquery: "modules/jquery", + mobile: "modules/mobile", + "layui.all": "../layui.all" + }; + r.prototype.cache = n, r.prototype.define = function (e, t) { + var r = this, + o = "function" == typeof e, + a = function () { + var e = function (e, t) { + layui[e] = t, n.status[e] = !0 + }; + return "function" == typeof t && t(function (r, o) { + e(r, o), n.callback[r] = function () { + t(e) + } + }), this + }; + return o && (t = e, e = []), !layui["layui.all"] && layui["layui.mobile"] ? a.call(r) : (r.use(e, a), r) + }, r.prototype.use = function (e, r, l) { + function c(e, t) { + var r = "PLaySTATION 3" === navigator.platform ? /^complete$/ : /^(complete|loaded)$/; + ("load" === e.type || r.test((e.currentTarget || e.srcElement).readyState)) && (n.modules[d] = t, y.removeChild(h), function o() { + return ++m > 1e3 * n.timeout / 4 ? a(d + " is not a valid module") : void (n.status[d] ? s() : setTimeout(o, 4)) + }()) + } + + function s() { + l.push(layui[d]), e.length > 1 ? p.use(e.slice(1), r, l) : "function" == typeof r && r.apply(layui, l) + } + var p = this, + f = n.dir = n.dir ? n.dir : o, + y = t.getElementsByTagName("head")[0]; + e = "string" == typeof e ? [e] : e, window.jQuery && jQuery.fn.on && (p.each(e, function (t, n) { + "jquery" === n && e.splice(t, 1) + }), layui.jquery = layui.$ = jQuery); + var d = e[0], + m = 0; + if (l = l || [], n.host = n.host || (f.match(/\/\/([\s\S]+?)\//) || ["//" + location.host + "/"])[0], 0 === e.length || layui["layui.all"] && u[d] || !layui["layui.all"] && layui["layui.mobile"] && u[d]) return s(), p; + var v = (u[d] ? f + "lay/" : /^\{\/\}/.test(p.modules[d]) ? "" : n.base || "") + (p.modules[d] || d) + ".js"; + if (v = v.replace(/^\{\/\}/, ""), !n.modules[d] && layui[d] && (n.modules[d] = v), n.modules[d]) ! function g() { + return ++m > 1e3 * n.timeout / 4 ? a(d + " is not a valid module") : void ("string" == typeof n.modules[d] && n.status[d] ? s() : setTimeout(g, 4)) + }(); + else { + var h = t.createElement("script"); + h.async = !0, h.charset = "utf-8", h.src = v + function () { + var e = n.version === !0 ? n.v || (new Date).getTime() : n.version || ""; + return e ? "?v=" + e : "" + }(), y.appendChild(h), !h.attachEvent || h.attachEvent.toString && h.attachEvent.toString().indexOf("[native code") < 0 || i ? h.addEventListener("load", function (e) { + c(e, v) + }, !1) : h.attachEvent("onreadystatechange", function (e) { + c(e, v) + }), n.modules[d] = v + } + return p + }, r.prototype.getStyle = function (t, n) { + var r = t.currentStyle ? t.currentStyle : e.getComputedStyle(t, null); + return r[r.getPropertyValue ? "getPropertyValue" : "getAttribute"](n) + }, r.prototype.link = function (e, r, o) { + var i = this, + u = t.createElement("link"), + l = t.getElementsByTagName("head")[0]; + "string" == typeof r && (o = r); + var c = (o || e).replace(/\.|\//g, ""), + s = u.id = "layuicss-" + c, + p = 0; + return u.rel = "stylesheet", u.href = e + (n.debug ? "?v=" + (new Date).getTime() : ""), u.media = "all", t.getElementById(s) || l.appendChild(u), "function" != typeof r ? i : (function f() { + return ++p > 1e3 * n.timeout / 100 ? a(e + " timeout") : void (1989 === parseInt(i.getStyle(t.getElementById(s), "width")) ? function () { + r() + }() : setTimeout(f, 100)) + }(), i) + }, n.callback = {}, r.prototype.factory = function (e) { + if (layui[e]) return "function" == typeof n.callback[e] ? n.callback[e] : null + }, r.prototype.addcss = function (e, t, r) { + return layui.link(n.dir + "css/" + e, t, r) + }, r.prototype.img = function (e, t, n) { + var r = new Image; + return r.src = e, r.complete ? t(r) : (r.onload = function () { + r.onload = null, "function" == typeof t && t(r) + }, void (r.onerror = function (e) { + r.onerror = null, "function" == typeof n && n(e) + })) + }, r.prototype.config = function (e) { + e = e || {}; + for (var t in e) n[t] = e[t]; + return this + }, r.prototype.modules = function () { + var e = {}; + for (var t in u) e[t] = u[t]; + return e + }(), r.prototype.extend = function (e) { + var t = this; + e = e || {}; + for (var n in e) t[n] || t.modules[n] ? a("模块名 " + n + " 已被占用") : t.modules[n] = e[n]; + return t + }, r.prototype.router = function (e) { + var t = this, + e = e || location.hash, + n = { + path: [], + search: {}, + hash: (e.match(/[^#](#.*$)/) || [])[1] || "" + }; + return /^#\//.test(e) ? (e = e.replace(/^#\//, ""), n.href = "/" + e, e = e.replace(/([^#])(#.*$)/, "$1").split("/") || [], t.each(e, function (e, t) { + /^\w+=/.test(t) ? function () { + t = t.split("="), n.search[t[0]] = t[1] + }() : n.path.push(t) + }), n) : n + }, r.prototype.url = function (e) { + var t = this, + n = { + pathname: function () { + var t = e ? function () { + var t = (e.match(/\.[^.]+?\/.+/) || [])[0] || ""; + return t.replace(/^[^\/]+/, "").replace(/\?.+/, "") + }() : location.pathname; + return t.replace(/^\//, "").split("/") + }(), + search: function () { + var n = {}, + r = (e ? function () { + var t = (e.match(/\?.+/) || [])[0] || ""; + return t.replace(/\#.+/, "") + }() : location.search).replace(/^\?+/, "").split("&"); + return t.each(r, function (e, t) { + var r = t.indexOf("="), + o = function () { + return r < 0 ? t.substr(0, t.length) : 0 !== r && t.substr(0, r) + }(); + o && (n[o] = r > 0 ? t.substr(r + 1) : null) + }), n + }(), + hash: t.router(function () { + return e ? (e.match(/#.+/) || [])[0] || "" : location.hash + }()) + }; + return n + }, r.prototype.data = function (t, n, r) { + if (t = t || "layui", r = r || localStorage, e.JSON && e.JSON.parse) { + if (null === n) return delete r[t]; + n = "object" == typeof n ? n : { + key: n + }; + try { + var o = JSON.parse(r[t]) + } catch (a) { + var o = {} + } + return "value" in n && (o[n.key] = n.value), n.remove && delete o[n.key], r[t] = JSON.stringify(o), n.key ? o[n.key] : o + } + }, r.prototype.sessionData = function (e, t) { + return this.data(e, t, sessionStorage) + }, r.prototype.device = function (t) { + var n = navigator.userAgent.toLowerCase(), + r = function (e) { + var t = new RegExp(e + "/([^\\s\\_\\-]+)"); + return e = (n.match(t) || [])[1], e || !1 + }, + o = { + os: function () { + return /windows/.test(n) ? "windows" : /linux/.test(n) ? "linux" : /iphone|ipod|ipad|ios/.test(n) ? "ios" : /mac/.test(n) ? "mac" : void 0 + }(), + ie: function () { + return !!(e.ActiveXObject || "ActiveXObject" in e) && ((n.match(/msie\s(\d+)/) || [])[1] || "11") + }(), + weixin: r("micromessenger") + }; + return t && !o[t] && (o[t] = r(t)), o.android = /android/.test(n), o.ios = "ios" === o.os, o.mobile = !(!o.android && !o.ios), o + }, r.prototype.hint = function () { + return { + error: a + } + }, r.prototype.each = function (e, t) { + var n, r = this; + if ("function" != typeof t) return r; + if (e = e || [], e.constructor === Object) { + for (n in e) + if (t.call(e[n], n, e[n])) break + } else + for (n = 0; n < e.length && !t.call(e[n], n, e[n]); n++); + return r + }, r.prototype.sort = function (e, t, n) { + var r = JSON.parse(JSON.stringify(e || [])); + return t ? (r.sort(function (e, n) { + var r = /^-?\d+$/, + o = e[t], + a = n[t]; + return r.test(o) && (o = parseFloat(o)), r.test(a) && (a = parseFloat(a)), o && !a ? 1 : !o && a ? -1 : o > a ? 1 : o < a ? -1 : 0 + }), n && r.reverse(), r) : r + }, r.prototype.stope = function (t) { + t = t || e.event; + try { + t.stopPropagation() + } catch (n) { + t.cancelBubble = !0 + } + }, r.prototype.onevent = function (e, t, n) { + return "string" != typeof e || "function" != typeof n ? this : r.event(e, t, null, n) + }, r.prototype.event = r.event = function (e, t, r, o) { + var a = this, + i = null, + u = t.match(/\((.*)\)$/) || [], + l = (e + "." + t).replace(u[0], ""), + c = u[1] || "", + s = function (e, t) { + var n = t && t.call(a, r); + n === !1 && null === i && (i = !1) + }; + return o ? (n.event[l] = n.event[l] || {}, n.event[l][c] = [o], this) : (layui.each(n.event[l], function (e, t) { + return "{*}" === c ? void layui.each(t, s) : ("" === e && layui.each(t, s), void (c && e === c && layui.each(t, s))) + }), i) + }, e.layui = new r +}(window); /** layui-v2.5.6 MIT License By https://www.layui.com */; +layui.define(["layer", "laytpl", "upload"], function (i) { + var a = "3.9.1", + e = layui.$, + t = layui.layer, + n = layui.laytpl, + l = layui.device(), + s = "layui-show", + o = "layim-this", + d = 20, + r = {}, + c = function () { + this.v = a, e("body").on("click", "*[layim-event]", function (i) { + var a = e(this), + t = a.attr("layim-event"); + ti[t] ? ti[t].call(this, a, i) : "" + }) + }; + c.prototype.config = function (i) { + var a = []; + if (layui.each(Array(5), function (i) { + a.push(layui.cache.dir + "css/modules/layim/skin/" + (i + 1) + ".jpg") + }), i = i || {}, i.skin = i.skin || [], layui.each(i.skin, function (i, e) { + a.unshift(e) + }), i.skin = a, i = e.extend({ + isfriend: !0, + isgroup: !0, + voice: "default.mp3" + }, i), window.JSON && window.JSON.parse) return H(i), this + }, c.prototype.on = function (i, a) { + return "function" == typeof a && (r[i] ? r[i].push(a) : r[i] = [a]), this + }, c.prototype.cache = function () { + return j + }, c.prototype.chat = function (i) { + if (window.JSON && window.JSON.parse) return z(i), this + }, c.prototype.setChatMin = function () { + return N(), this + }, c.prototype.setChatStatus = function (i) { + var a = _(); + if (a) { + var e = a.elem.find(".layim-chat-status"); + return e.html(i), this + } + }, c.prototype.getMessage = function (i) { + return K(i), this + }, c.prototype.notice = function (i) { + return J(i), this + }, c.prototype.add = function (i) { + return M(i), this + }, c.prototype.setFriendGroup = function (i) { + return M(i, "setGroup"), this + }, c.prototype.msgbox = function (i) { + return V(i), this + }, c.prototype.addList = function (i) { + return P(i), this + }, c.prototype.removeList = function (i) { + return W(i), this + }, c.prototype.setFriendStatus = function (i, a) { + var t = e(".layim-friend" + i); + t["online" === a ? "removeClass" : "addClass"]("layim-list-gray") + }, c.prototype.content = function (i) { + return layui.data.content(i) + }; + var u = function (i) { + var a = { + friend: "该分组下暂无好友", + group: "暂无群组", + history: "暂无历史会话" + }; + return i = i || {}, i.item = i.item || "d." + i.type, ["{{# var length = 0; layui.each(" + i.item + ", function(i, data){ length++; }}", '
                                        • {{ data.username||data.groupname||data.name||"佚名" }}

                                          {{ data.remark||data.sign||"" }}

                                          new
                                        • ', "{{# }); if(length === 0){ }}", '
                                        • ' + (a[i.type] || "暂无数据") + "
                                        • ", "{{# } }}"].join("") + }, + y = ['
                                          ', '
                                          ', '
                                          {{ d.mine.username }}
                                          ', '
                                          ', '{{# if(d.mine.status === "online"){ }}', '', '{{# } else if(d.mine.status === "hide") { }}', '', "{{# } }}", '
                                            ', '
                                          • 在线
                                          • ', '
                                          • 隐身
                                          • ', "
                                          ", "
                                          ", '', "
                                          ", '
                                            ', '
                                          • ', '
                                          • ', '
                                          • ', "
                                          ", '
                                            ', '{{# layui.each(d.friend, function(index, item){ var spread = d.local["spread"+index]; }}', "
                                          • ", '
                                            {{# if(spread === "true"){ }}{{# } else { }}{{# } }}{{ item.groupname||"未命名分组"+index }}( {{ (item.list||[]).length }})
                                            ', '
                                              ', u({ + type: "friend", + item: "item.list", + index: "index" + }), "
                                            ", "
                                          • ", "{{# }); if(d.friend.length === 0){ }}", '
                                            • 暂无联系人
                                            ', "{{# } }}", "
                                          ", '
                                            ', "
                                          • ", '
                                              ', u({ + type: "group" + }), "
                                            ", "
                                          • ", "
                                          ", '
                                            ', "
                                          • ", '
                                              ', u({ + type: "history" + }), "
                                            ", "
                                          • ", "
                                          ", '
                                            ', "
                                          • ", '', "
                                          • ", "
                                          ", '
                                            ', '', "{{# if(d.base.msgbox){ }}", '
                                          • ', "{{# } }}", "{{# if(d.base.find){ }}", '
                                          • ', "{{# } }}", '
                                          • ', "{{# if(!d.base.copyright){ }}", '
                                          • ', "{{# } }}", "
                                          ", '', "
                                          "].join(""), + m = ['
                                            ', "{{# layui.each(d.skin, function(index, item){ }}", '
                                          • ', "{{# }); }}", '
                                          • 简约
                                          • ', "
                                          "].join(""), + f = ['
                                          ', '
                                          ', '
                                          ', '{{ d.data.name||"佚名" }} {{d.data.temporary ? "临时会话" : ""}} {{# if(d.data.type==="group"){ }} {{# } }}', '

                                          ', "
                                          ", "
                                          ", '
                                          ', "
                                            ", "
                                            ", '", "
                                            "].join(""), + p = ['
                                            ', '

                                            {{ d.data.name||"" }}

                                            ', '
                                            ', '{{# if(d.data.type === "friend" && d.type === "setGroup"){ }}', "

                                            选择分组

                                            ", '{{# } if(d.data.type === "friend"){ }}', '", "{{# } }}", '{{# if(d.data.type === "group"){ }}', "

                                            请输入验证信息

                                            ", '{{# } if(d.type !== "setGroup"){ }}', '', "{{# } }}", "
                                            ", "
                                            "].join(""), + h = ['
                                          • ', '
                                            ', "{{# if(d.mine){ }}", '{{ layui.data.date(d.timestamp) }}{{ d.username||"佚名" }}', "{{# } else { }}", '{{ d.username||"佚名" }}{{ layui.data.date(d.timestamp) }}', "{{# } }}", "
                                            ", '
                                            {{ layui.data.content(d.content||" ") }}
                                            ', "
                                          • "].join(""), + v = '
                                          • {{ d.data.name||"佚名" }}{{# if(!d.base.brief){ }}ဇ{{# } }}
                                          • ', + g = function (i) { + return i < 10 ? "0" + (0 | i) : i + }; + layui.data.date = function (i) { + var a = new Date(i || new Date); + return a.getFullYear() + "-" + g(a.getMonth() + 1) + "-" + g(a.getDate()) + " " + g(a.getHours()) + ":" + g(a.getMinutes()) + ":" + g(a.getSeconds()) + }, layui.data.content = function (i) { + var a = function (i) { + return new RegExp("\\n*\\[" + (i || "") + "(code|pre|div|span|p|table|thead|th|tbody|tr|td|ul|li|ol|li|dl|dt|dd|h2|h3|h4|h5)([\\s\\S]*?)\\]\\n*", "g") + }; + return i = (i || "").replace(/&(?!#?[a-zA-Z0-9]+;)/g, "&").replace(//g, ">").replace(/'/g, "'").replace(/"/g, """).replace(/@(\S+)(\s+?|$)/g, '@$1$2').replace(/face\[([^\s\[\]]+?)\]/g, function (i) { + var a = i.replace(/^face/g, ""); + return '' + a + '' + }).replace(/img\[([^\s]+?)\]/g, function (i) { + return '' + }).replace(/file\([\s\S]+?\)\[[\s\S]*?\]/g, function (i) { + var a = (i.match(/file\(([\s\S]+?)\)\[/) || [])[1], + e = (i.match(/\)\[([\s\S]*?)\]/) || [])[1]; + return a ? '' + (e || a) + "" : i + }).replace(/audio\[([^\s]+?)\]/g, function (i) { + return '

                                            音频消息

                                            ' + }).replace(/video\[([^\s]+?)\]/g, function (i) { + return '
                                            ' + }).replace(/a\([\s\S]+?\)\[[\s\S]*?\]/g, function (i) { + var a = (i.match(/a\(([\s\S]+?)\)\[/) || [])[1], + e = (i.match(/\)\[([\s\S]*?)\]/) || [])[1]; + return a ? '' + (e || a) + "" : i + }).replace(a(), "<$1 $2>").replace(a("/"), "").replace(/\n/g, "
                                            ") + }; + var x, b, w, k, C, S = function (i, a, n) { + return i = i || {}, e.ajax({ + url: i.url, + type: i.type || "get", + data: i.data, + dataType: i.dataType || "json", + cache: !1, + success: function (i) { + 0 == i.code ? a && a(i.data || {}) : t.msg(i.msg || (n || "Error") + ": LAYIM_NOT_GET_DATA", { + time: 5e3 + }) + }, + error: function (i, a) { + window.console && console.log && console.error("LAYIM_DATE_ERROR:" + a) + } + }) + }, + j = { + message: {}, + chat: [] + }, + H = function (i) { + var a = i.init || {}; + return mine = a.mine || {}, local = layui.data("layim")[mine.id] || {}, obj = { + base: i, + local: local, + mine: mine, + history: local.history || {} + }, create = function (a) { + var t = a.mine || {}, + l = layui.data("layim")[t.id] || {}, + s = { + base: i, + local: l, + mine: t, + friend: a.friend || [], + group: a.group || [], + history: l.history || {} + }; + j = e.extend(j, s), L(n(y).render(s)), (l.close || i.min) && T(), layui.each(r.ready, function (i, a) { + a && a(s) + }) + }, j = e.extend(j, obj), i.brief ? layui.each(r.ready, function (i, a) { + a && a(obj) + }) : void (a.url ? S(a, create, "INIT") : create(a)) + }, + L = function (i) { + return t.open({ + type: 1, + area: ["260px", "520px"], + skin: "layui-box layui-layim", + title: "​", + offset: "rb", + id: "layui-layim", + shade: !1, + anim: 2, + resize: !1, + content: i, + success: function (i) { + x = i, R(i), j.base.right && i.css("margin-left", "-" + j.base.right), b && t.close(b.attr("times")); + var a = [], + n = i.find(".layim-list-history"); + n.find("li").each(function () { + a.push(e(this).prop("outerHTML")) + }), a.length > 0 && (a.reverse(), n.html(a.join(""))), A(), ti.sign() + }, + cancel: function (i) { + T(); + var a = layui.data("layim")[j.mine.id] || {}; + return a.close = !0, layui.data("layim", { + key: j.mine.id, + value: a + }), !1 + } + }) + }, + A = function () { + x.on("contextmenu", function (i) { + return i.cancelBubble = !0, i.returnValue = !1, !1 + }); + var i = function () { + t.closeAll("tips") + }; + x.find(".layim-list-history").on("contextmenu", "li", function (a) { + var n = e(this), + l = '
                                            • 移除该会话
                                            • 清空全部会话列表
                                            '; + n.hasClass("layim-null") || (t.tips(l, this, { + tips: 1, + time: 0, + anim: 5, + fixed: !0, + skin: "layui-box layui-layim-contextmenu", + success: function (i) { + var a = function (i) { + ii(i) + }; + i.off("mousedown", a).on("mousedown", a) + } + }), e(document).off("mousedown", i).on("mousedown", i), e(window).off("resize", i).on("resize", i)) + }) + }, + T = function (i) { + return b && t.close(b.attr("times")), x && x.hide(), j.mine = j.mine || {}, t.open({ + type: 1, + title: !1, + id: "layui-layim-close", + skin: "layui-box layui-layim-min layui-layim-close", + shade: !1, + closeBtn: !1, + anim: 2, + offset: "rb", + resize: !1, + content: '' + (i || j.base.title || "我的LayIM") + "", + move: "#layui-layim-close img", + success: function (i, a) { + b = i, j.base.right && i.css("margin-left", "-" + j.base.right), i.on("click", function () { + t.close(a), x.show(); + var i = layui.data("layim")[j.mine.id] || {}; + delete i.close, layui.data("layim", { + key: j.mine.id, + value: i + }) + }) + } + }) + }, + z = function (i) { + i = i || {}; + var a = e("#layui-layim-chat"), + l = { + data: i, + base: j.base, + local: j.local + }; + if (!i.id) return t.msg("非法用户"); + if (a[0]) { + var s = w.find(".layim-chat-list"), + o = s.find(".layim-chatlist-" + i.type + i.id), + d = w.find(".layui-layer-max").hasClass("layui-layer-maxmin"), + c = a.children(".layim-chat-box"); + return "none" === w.css("display") && w.show(), k && t.close(k.attr("times")), 1 !== s.find("li").length || o[0] || (d || w.css("width", 800), s.css({ + height: w.height() + }).show(), c.css("margin-left", "200px")), o[0] || (s.append(n(v).render(l)), c.append(n(f).render(l)), I(i), E()), O(s.find(".layim-chatlist-" + i.type + i.id)), o[0] || U(), $(i), Q(), C + } + l.first = !0; + var u = C = t.open({ + type: 1, + area: "600px", + skin: "layui-box layui-layim-chat", + id: "layui-layim-chat", + title: "​", + shade: !1, + maxmin: !0, + offset: i.offset || "auto", + anim: i.anim || 0, + closeBtn: !j.base.brief && 1, + content: n('
                                              ' + v + '
                                            ' + f + "
                                            ").render(l), + success: function (a) { + w = a, a.css({ + "min-width": "500px", + "min-height": "420px" + }), I(i), "function" == typeof i.success && i.success(a), Q(), R(a), $(i), U(), q(), layui.each(r.chatChange, function (i, a) { + a && a(_()) + }), a.on("dblclick", ".layui-layim-photos", function () { + var i = this.src; + t.close(z.photosIndex), t.photos({ + photos: { + data: [{ + alt: "大图模式", + src: i + }] + }, + shade: .01, + closeBtn: 2, + anim: 0, + resize: !1, + success: function (i, a) { + z.photosIndex = a + } + }) + }) + }, + full: function (i) { + t.style(u, { + width: "100%", + height: "100%" + }, !0), E() + }, + resizing: E, + restore: E, + min: function () { + return N(), !1 + }, + end: function () { + t.closeAll("tips"), w = null + } + }); + return u + }, + I = function (i) { + e(".layim-" + i.type + i.id).each(function () { + e(this).hasClass("layim-list-gray") && layui.layim.setFriendStatus(i.id, "offline") + }) + }, + E = function () { + var i = w.find(".layim-chat-list"), + a = w.find(".layim-chat-main"), + e = w.height(); + i.css({ + height: e + }), a.css({ + height: e - 20 - 80 - 158 + }) + }, + N = function (i) { + var a = i || _().data, + n = layui.layim.cache().base; + w && !i && w.hide(), t.close(N.index), N.index = t.open({ + type: 1, + title: !1, + skin: "layui-box layui-layim-min", + shade: !1, + closeBtn: !1, + anim: a.anim || 2, + offset: "b", + move: "#layui-layim-min", + resize: !1, + area: ["182px", "50px"], + content: '' + a.name + "", + success: function (a, l) { + i || (k = a), n.minRight && t.style(l, { + left: e(window).width() - a.outerWidth() - parseFloat(n.minRight) + }), a.find(".layui-layer-content span").on("click", function () { + t.close(l), i ? layui.each(j.chat, function (i, a) { + z(a) + }) : w.show(), i && (j.chat = [], Z()) + }), a.find(".layui-layer-content img").on("click", function (i) { + ii(i) + }) + } + }) + }, + M = function (i, a) { + return i = i || {}, t.close(M.index), M.index = t.open({ + type: 1, + area: "430px", + title: { + friend: "添加好友", + group: "加入群组" + }[i.type] || "", + shade: !1, + resize: !1, + btn: a ? ["确认", "取消"] : ["发送申请", "关闭"], + content: n(p).render({ + data: { + name: i.username || i.groupname, + avatar: i.avatar, + group: i.group || parent.layui.layim.cache().friend || [], + type: i.type + }, + type: a + }), + yes: function (e, t) { + var n = t.find("#LAY_layimGroup"), + l = t.find("#LAY_layimRemark"); + a ? i.submit && i.submit(n.val(), e) : i.submit && i.submit(n.val(), l.val(), e) + } + }) + }, + O = function (i, a) { + i = i || e(".layim-chat-list ." + o); + var n = i.index() === -1 ? 0 : i.index(), + l = ".layim-chat", + d = w.find(l).eq(n), + c = w.find(".layui-layer-max").hasClass("layui-layer-maxmin"); + if (a) { + i.hasClass(o) && O(0 === n ? i.next() : i.prev()); + var u = w.find(l).length; + return 1 === u ? t.close(C) : (i.remove(), d.remove(), 2 === u && (w.find(".layim-chat-list").hide(), c || w.css("width", "600px"), w.find(".layim-chat-box").css("margin-left", 0)), !1) + } + i.addClass(o).siblings().removeClass(o), d.addClass(s).siblings(l).removeClass(s), d.find("textarea").focus(), layui.each(r.chatChange, function (i, a) { + a && a(_()) + }), q() + }, + q = function () { + var i = _(), + a = j.message[i.data.type + i.data.id]; + a && delete j.message[i.data.type + i.data.id] + }, + _ = c.prototype.thisChat = function () { + if (w) { + var i = e(".layim-chat-list ." + o).index(), + a = w.find(".layim-chat").eq(i), + t = JSON.parse(decodeURIComponent(a.find(".layim-chat-tool").data("json"))); + return { + elem: a, + data: t, + textarea: a.find("textarea") + } + } + }, + R = function (i) { + var a = layui.data("layim")[j.mine.id] || {}, + e = a.skin; + i.css({ + "background-image": e ? "url(" + e + ")" : function () { + return j.base.initSkin ? "url(" + (layui.cache.dir + "css/modules/layim/skin/" + j.base.initSkin) + ")" : "none" + }() + }) + }, + $ = function (i) { + var a = layui.data("layim")[j.mine.id] || {}, + e = {}, + t = a.history || {}, + l = t[i.type + i.id]; + if (x) { + var s = x.find(".layim-list-history"); + if (i.historyTime = (new Date).getTime(), t[i.type + i.id] = i, a.history = t, layui.data("layim", { + key: j.mine.id, + value: a + }), !l) { + e[i.type + i.id] = i; + var o = n(u({ + type: "history", + item: "d.data" + })).render({ + data: e + }); + s.prepend(o), s.find(".layim-null").remove() + } + } + }, + D = function () { + var i = { + username: j.mine ? j.mine.username : "访客", + avatar: j.mine ? j.mine.avatar : layui.cache.dir + "css/pc/layim/skin/logo.jpg", + id: j.mine ? j.mine.id : null, + mine: !0 + }, + a = _(), + e = a.elem.find(".layim-chat-main ul"), + l = j.base.maxLength || 3e3; + if (i.content = a.textarea.val(), "" !== i.content.replace(/\s/g, "")) { + if (i.content.length > l) return t.msg("内容最长不能超过" + l + "个字符"); + e.append(n(h).render(i)); + var s = { + mine: i, + to: a.data + }, + o = { + username: s.mine.username, + avatar: s.mine.avatar, + id: s.to.id, + type: s.to.type, + content: s.mine.content, + timestamp: (new Date).getTime(), + mine: !0 + }; + B(o), layui.each(r.sendMessage, function (i, a) { + a && a(s) + }) + } + Z(), a.textarea.val("").focus() + }, + J = function (i) { + if (i = i || {}, window.Notification) + if ("granted" === Notification.permission) { + new Notification(i.title || "", { + body: i.content || "", + icon: i.avatar || "http://tp2.sinaimg.cn/5488749285/50/5719808192/1" + }) + } else Notification.requestPermission() + }, + F = function () { + if (!(l.ie && l.ie < 9)) { + var i = document.createElement("audio"); + i.src = layui.cache.dir + "css/modules/layim/voice/" + j.base.voice, i.play() + } + }, + G = {}, + K = function (i) { + i = i || {}; + var a = e(".layim-chatlist-" + i.type + i.id), + t = {}, + l = a.index(); + if (i.timestamp = i.timestamp || (new Date).getTime(), i.fromid == j.mine.id && (i.mine = !0), i.system || B(i), G = JSON.parse(JSON.stringify(i)), j.base.voice && F(), !w && i.content || l === -1) { + if (j.message[i.type + i.id]) j.message[i.type + i.id].push(i); + else if (j.message[i.type + i.id] = [i], "friend" === i.type) { + var s; + layui.each(j.friend, function (a, e) { + if (layui.each(e.list, function (a, e) { + if (e.id == i.id) return e.type = "friend", e.name = e.username, j.chat.push(e), s = !0 + }), s) return !0 + }), s || (i.name = i.username, i.temporary = !0, j.chat.push(i)) + } else if ("group" === i.type) { + var o; + layui.each(j.group, function (a, e) { + if (e.id == i.id) return e.type = "group", e.name = e.groupname, j.chat.push(e), o = !0 + }), o || (i.name = i.groupname, j.chat.push(i)) + } else i.name = i.name || i.username || i.groupname, j.chat.push(i); + if ("group" === i.type && layui.each(j.group, function (a, e) { + if (e.id == i.id) return t.avatar = e.avatar, !0 + }), !i.system) return j.base.notice && J({ + title: "来自 " + i.username + " 的消息", + content: i.content, + avatar: t.avatar || i.avatar + }), N({ + name: "收到新消息", + avatar: t.avatar || i.avatar, + anim: 6 + }) + } + if (w) { + var d = _(); + d.data.type + d.data.id !== i.type + i.id && (a.addClass("layui-anim layer-anim-06"), setTimeout(function () { + a.removeClass("layui-anim layer-anim-06") + }, 300)); + var r = w.find(".layim-chat").eq(l), + c = r.find(".layim-chat-main ul"); + i.system ? l !== -1 && c.append('
                                          • ' + i.content + "
                                          • ") : "" !== i.content.replace(/\s/g, "") && c.append(n(h).render(i)), Z() + } + }, + Y = "layui-anim-loop layer-anim-05", + V = function (i) { + var a = x.find(".layim-tool-msgbox"); + a.find("span").addClass(Y).html(i) + }, + B = function (i) { + var a = layui.data("layim")[j.mine.id] || {}; + a.chatlog = a.chatlog || {}; + var e = a.chatlog[i.type + i.id]; + if (e) { + var t; + layui.each(e, function (a, e) { + e.timestamp === i.timestamp && e.type === i.type && e.id === i.id && e.content === i.content && (t = !0) + }), t || i.fromid == j.mine.id || e.push(i), e.length > d && e.shift() + } else a.chatlog[i.type + i.id] = [i]; + layui.data("layim", { + key: j.mine.id, + value: a + }) + }, + U = function () { + var i = layui.data("layim")[j.mine.id] || {}, + a = _(), + e = i.chatlog || {}, + t = a.elem.find(".layim-chat-main ul"); + layui.each(e[a.data.type + a.data.id], function (i, a) { + t.append(n(h).render(a)) + }), Z() + }, + P = function (i) { + var a, e = {}, + l = x.find(".layim-list-" + i.type); + if (j[i.type]) + if ("friend" === i.type) layui.each(j.friend, function (n, l) { + if (i.groupid == l.id) return layui.each(j.friend[n].list, function (e, t) { + if (t.id == i.id) return a = !0 + }), a ? t.msg("好友 [" + (i.username || "") + "] 已经存在列表中", { + anim: 6 + }) : (j.friend[n].list = j.friend[n].list || [], e[j.friend[n].list.length] = i, i.groupIndex = n, j.friend[n].list.push(i), !0) + }); + else if ("group" === i.type) { + if (layui.each(j.group, function (e, t) { + if (t.id == i.id) return a = !0 + }), a) return t.msg("您已是 [" + (i.groupname || "") + "] 的群成员", { + anim: 6 + }); + e[j.group.length] = i, j.group.push(i) + } + if (!a) { + var s = n(u({ + type: i.type, + item: "d.data", + index: "friend" === i.type ? "data.groupIndex" : null + })).render({ + data: e + }); + if ("friend" === i.type) { + var o = l.find(">li").eq(i.groupIndex); + o.find(".layui-layim-list").append(s), o.find(".layim-count").html(j.friend[i.groupIndex].list.length), o.find(".layim-null")[0] && o.find(".layim-null").remove() + } else "group" === i.type && (l.append(s), l.find(".layim-null")[0] && l.find(".layim-null").remove()) + } + }, + W = function (i) { + var a = x.find(".layim-list-" + i.type); + j[i.type] && ("friend" === i.type ? layui.each(j.friend, function (e, t) { + layui.each(t.list, function (t, n) { + if (i.id == n.id) { + var l = a.find(">li").eq(e); + l.find(".layui-layim-list>li"); + return l.find(".layui-layim-list>li").eq(t).remove(), j.friend[e].list.splice(t, 1), l.find(".layim-count").html(j.friend[e].list.length), 0 === j.friend[e].list.length && l.find(".layui-layim-list").html('
                                          • 该分组下已无好友了
                                          • '), !0 + } + }) + }) : "group" === i.type && layui.each(j.group, function (e, t) { + if (i.id == t.id) return a.find(">li").eq(e).remove(), j.group.splice(e, 1), 0 === j.group.length && a.html('
                                          • 暂无群组
                                          • '), !0 + })) + }, + Z = function () { + var i = _(), + a = i.elem.find(".layim-chat-main"), + e = a.find("ul"), + t = e.find("li").length; + if (t >= d) { + var n = e.find("li").eq(0); + e.prev().hasClass("layim-chat-system") || e.before('
                                            查看更多记录
                                            '), t > d && n.remove() + } + a.scrollTop(a[0].scrollHeight + 1e3), a.find("ul li:last").find("img").load(function () { + a.scrollTop(a[0].scrollHeight + 1e3) + }) + }, + Q = function () { + var i = _(), + a = i.textarea; + a.focus(), a.off("keydown").on("keydown", function (i) { + var e = layui.data("layim")[j.mine.id] || {}, + t = i.keyCode; + if ("Ctrl+Enter" === e.sendHotKey) return void (i.ctrlKey && 13 === t && D()); + if (13 === t) { + if (i.ctrlKey) return a.val(a.val() + "\n"); + if (i.shiftKey) return; + i.preventDefault(), D() + } + }) + }, + X = function () { + var i = ["[微笑]", "[嘻嘻]", "[哈哈]", "[可爱]", "[可怜]", "[挖鼻]", "[吃惊]", "[害羞]", "[挤眼]", "[闭嘴]", "[鄙视]", "[爱你]", "[泪]", "[偷笑]", "[亲亲]", "[生病]", "[太开心]", "[白眼]", "[右哼哼]", "[左哼哼]", "[嘘]", "[衰]", "[委屈]", "[吐]", "[哈欠]", "[抱抱]", "[怒]", "[疑问]", "[馋嘴]", "[拜拜]", "[思考]", "[汗]", "[困]", "[睡]", "[钱]", "[失望]", "[酷]", "[色]", "[哼]", "[鼓掌]", "[晕]", "[悲伤]", "[抓狂]", "[黑线]", "[阴险]", "[怒骂]", "[互粉]", "[心]", "[伤心]", "[猪头]", "[熊猫]", "[兔子]", "[ok]", "[耶]", "[good]", "[NO]", "[赞]", "[来]", "[弱]", "[草泥马]", "[神马]", "[囧]", "[浮云]", "[给力]", "[围观]", "[威武]", "[奥特曼]", "[礼物]", "[钟]", "[话筒]", "[蜡烛]", "[蛋糕]"], + a = {}; + return layui.each(i, function (i, e) { + a[e] = layui.cache.dir + "images/face/" + i + ".gif" + }), a + }(), + ii = layui.stope, + ai = function (i, a) { + var e, t = i.value; + i.focus(), document.selection ? (e = document.selection.createRange(), document.selection.empty(), e.text = a) : (e = [t.substring(0, i.selectionStart), a, t.substr(i.selectionEnd)], i.focus(), i.value = e.join("")) + }, + ei = "layui-anim-upbit", + ti = { + status: function (i, a) { + var t = function () { + i.next().hide().removeClass(ei) + }, + n = i.attr("lay-type"); + if ("show" === n) ii(a), i.next().show().addClass(ei), e(document).off("click", t).on("click", t); + else { + var l = i.parent().prev(); + i.addClass(o).siblings().removeClass(o), l.html(i.find("cite").html()), l.removeClass("layim-status-" + ("online" === n ? "hide" : "online")).addClass("layim-status-" + n), layui.each(r.online, function (i, a) { + a && a(n) + }) + } + }, + sign: function () { + var i = x.find(".layui-layim-remark"); + i.on("change", function () { + var i = this.value; + layui.each(r.sign, function (a, e) { + e && e(i) + }) + }), i.on("keyup", function (i) { + var a = i.keyCode; + 13 === a && this.blur() + }) + }, + tab: function (i) { + var a, e = ".layim-tab-content", + t = x.find(".layui-layim-tab>li"); + "number" == typeof i ? (a = i, i = t.eq(a)) : a = i.index(), a > 2 ? t.removeClass(o) : (ti.tab.index = a, i.addClass(o).siblings().removeClass(o)), x.find(e).eq(a).addClass(s).siblings(e).removeClass(s) + }, + spread: function (i) { + var a = i.attr("lay-type"), + e = "true" === a ? "false" : "true", + t = layui.data("layim")[j.mine.id] || {}; + i.next()["true" === a ? "removeClass" : "addClass"](s), t["spread" + i.parent().index()] = e, layui.data("layim", { + key: j.mine.id, + value: t + }), i.attr("lay-type", e), i.find(".layui-icon").html("true" === e ? "" : "") + }, + search: function (i) { + var a = x.find(".layui-layim-search"), + e = x.find("#layui-layim-search"), + t = a.find("input"), + n = function (i) { + var a = t.val().replace(/\s/); + if ("" === a) ti.tab(0 | ti.tab.index); + else { + for (var n = [], l = j.friend || [], s = j.group || [], o = "", d = 0; d < l.length; d++) + for (var r = 0; r < (l[d].list || []).length; r++) l[d].list[r].username.indexOf(a) !== -1 && (l[d].list[r].type = "friend", l[d].list[r].index = d, l[d].list[r].list = r, n.push(l[d].list[r])); + for (var c = 0; c < s.length; c++) s[c].groupname.indexOf(a) !== -1 && (s[c].type = "group", s[c].index = c, s[c].list = c, n.push(s[c])); + if (n.length > 0) + for (var u = 0; u < n.length; u++) o += '
                                          • ' + (n[u].username || n[u].groupname || "佚名") + "

                                            " + (n[u].remark || n[u].sign || "") + "

                                          • "; + else o = '
                                          • 无搜索结果
                                          • '; + e.html(o), ti.tab(3) + } + }; + !j.base.isfriend && j.base.isgroup ? ti.tab.index = 1 : j.base.isfriend || j.base.isgroup || (ti.tab.index = 2), a.show(), t.focus(), t.off("keyup", n).on("keyup", n) + }, + closeSearch: function (i) { + i.parent().hide(), ti.tab(0 | ti.tab.index) + }, + msgbox: function () { + var i = x.find(".layim-tool-msgbox"); + return t.close(ti.msgbox.index), i.find("span").removeClass(Y).html(""), ti.msgbox.index = t.open({ + type: 2, + title: "消息盒子", + shade: !1, + maxmin: !0, + area: ["600px", "520px"], + skin: "layui-box layui-layer-border", + resize: !1, + content: j.base.msgbox + }) + }, + find: function () { + return t.close(ti.find.index), ti.find.index = t.open({ + type: 2, + title: "查找", + shade: !1, + maxmin: !0, + area: ["1000px", "520px"], + skin: "layui-box layui-layer-border", + resize: !1, + content: j.base.find + }) + }, + skin: function () { + t.open({ + type: 1, + title: "更换背景", + shade: !1, + area: "300px", + skin: "layui-box layui-layer-border", + id: "layui-layim-skin", + zIndex: 66666666, + resize: !1, + content: n(m).render({ + skin: j.base.skin + }) + }) + }, + about: function () { + t.alert("版本: " + a + '
                                            版权所有:layim.layui.com', { + title: "关于 LayIM", + shade: !1 + }) + }, + setSkin: function (i) { + var a = i.attr("src"), + e = layui.data("layim")[j.mine.id] || {}; + e.skin = a, a || delete e.skin, layui.data("layim", { + key: j.mine.id, + value: e + }); + try { + x.css({ + "background-image": a ? "url(" + a + ")" : "none" + }), w.css({ + "background-image": a ? "url(" + a + ")" : "none" + }) + } catch (t) { } + layui.each(r.setSkin, function (i, e) { + var t = (a || "").replace(layui.cache.dir + "css/modules/layim/skin/", ""); + e && e(t, a) + }) + }, + chat: function (i) { + var a = layui.data("layim")[j.mine.id] || {}, + e = i.data("type"), + t = i.data("index"), + n = i.attr("data-list") || i.index(), + l = {}; + "friend" === e ? l = j[e][t].list[n] : "group" === e ? l = j[e][n] : "history" === e && (l = (a.history || {})[t] || {}), l.name = l.name || l.username || l.groupname, "history" !== e && (l.type = e), z(l) + }, + tabChat: function (i) { + O(i) + }, + closeChat: function (i, a) { + O(i.parent(), 1), ii(a) + }, + closeThisChat: function () { + O(null, 1) + }, + groupMembers: function (i, a) { + var n = i.find(".layui-icon"), + l = function () { + n.html(""), i.data("down", null), t.close(ti.groupMembers.index) + }, + s = function (i) { + ii(i) + }; + i.data("down") ? l() : (n.html(""), i.data("down", !0), ti.groupMembers.index = t.tips('
                                              ', i, { + tips: 3, + time: 0, + anim: 5, + fixed: !0, + skin: "layui-box layui-layim-members", + success: function (a) { + var t = j.base.members || {}, + n = _(), + s = a.find(".layim-members-list"), + o = "", + d = {}, + c = w.find(".layui-layer-max").hasClass("layui-layer-maxmin"), + u = "none" === w.find(".layim-chat-list").css("display"); + c && s.css({ + width: e(window).width() - 22 - (u || 200) + }), t.data = e.extend(t.data, { + id: n.data.id + }), S(t, function (a) { + layui.each(a.list, function (i, a) { + o += '
                                            • ' + a.username + "
                                            • ", d[a.id] = a + }), s.html(o), i.find(".layim-chat-members").html(a.members || (a.list || []).length + "人"), s.find("li").on("click", function () { + var i = e(this).data("uid"), + a = d[i]; + z({ + name: a.username, + type: "friend", + avatar: a.avatar, + id: a.id + }), l() + }), layui.each(r.members, function (i, e) { + e && e(a) + }) + }), a.on("mousedown", function (i) { + ii(i) + }) + } + }), e(document).off("mousedown", l).on("mousedown", l), e(window).off("resize", l).on("resize", l), i.off("mousedown", s).on("mousedown", s)) + }, + send: function () { + D() + }, + setSend: function (i, a) { + var t = ti.setSend.box = i.siblings(".layim-menu-box"), + n = i.attr("lay-type"); + if ("show" === n) ii(a), t.show().addClass(ei), e(document).off("click", ti.setSendHide).on("click", ti.setSendHide); + else { + i.addClass(o).siblings().removeClass(o); + var l = layui.data("layim")[j.mine.id] || {}; + l.sendHotKey = n, layui.data("layim", { + key: j.mine.id, + value: l + }), ti.setSendHide(a, i.parent()) + } + }, + setSendHide: function (i, a) { + (a || ti.setSend.box).hide().removeClass(ei) + }, + face: function (i, a) { + var n = "", + l = _(); + for (var s in X) n += '
                                            • '; + n = '
                                                ' + n + "
                                              ", ti.face.index = t.tips(n, i, { + tips: 1, + time: 0, + fixed: !0, + skin: "layui-box layui-layim-face", + success: function (i) { + i.find(".layim-face-list>li").on("mousedown", function (i) { + ii(i) + }).on("click", function () { + ai(l.textarea[0], "face" + this.title + " "), t.close(ti.face.index); + }) + } + }), e(document).off("mousedown", ti.faceHide).on("mousedown", ti.faceHide), e(window).off("resize", ti.faceHide).on("resize", ti.faceHide), ii(a) + }, + faceHide: function () { + t.close(ti.face.index) + }, + image: function (i) { + var a = i.data("type") || "images", + e = { + images: "uploadImage", + file: "uploadFile" + }, + n = _(), + l = j.base[e[a]] || {}; + layui.upload.render({ + url: l.url || "", + method: l.type, + elem: i.find("input")[0], + accept: a, + done: function (i) { + 0 == i.code ? (i.data = i.data || {}, "images" === a ? ai(n.textarea[0], "img[" + (i.data.src || "") + "]") : "file" === a && ai(n.textarea[0], "file(" + (i.data.src || "") + ")[" + (i.data.name || "下载文件") + "]"), D()) : t.msg(i.msg || "上传失败") + } + }) + }, + media: function (i) { + var a = i.data("type"), + n = { + audio: "音频", + video: "视频" + }, + l = _(); + t.prompt({ + title: "请输入网络" + n[a] + "地址", + shade: !1, + offset: [i.offset().top - e(window).scrollTop() - 158 + "px", i.offset().left + "px"] + }, function (i, e) { + ai(l.textarea[0], a + "[" + i + "]"), D(), t.close(e) + }) + }, + extend: function (i) { + var a = i.attr("lay-filter"), + e = _(); + layui.each(r["tool(" + a + ")"], function (a, t) { + t && t.call(i, function (i) { + ai(e.textarea[0], i) + }, D, e) + }) + }, + playAudio: function (i) { + var a = i.data("audio"), + e = a || document.createElement("audio"), + n = function () { + e.pause(), i.removeAttr("status"), i.find("i").html("") + }; + return i.data("error") ? t.msg("播放音频源异常") : e.play ? void (i.attr("status") ? n() : (a || (e.src = i.data("src")), e.play(), i.attr("status", "pause"), i.data("audio", e), i.find("i").html(""), e.onended = function () { + n() + }, e.onerror = function () { + t.msg("播放音频源异常"), i.data("error", !0), n() + })) : t.msg("您的浏览器不支持audio") + }, + playVideo: function (i) { + var a = i.data("src"), + e = document.createElement("video"); + return e.play ? (t.close(ti.playVideo.index), void (ti.playVideo.index = t.open({ + type: 1, + title: "播放视频", + area: ["460px", "300px"], + maxmin: !0, + shade: !1, + content: '
                                              ' + }))) : t.msg("您的浏览器不支持video") + }, + chatLog: function (i) { + var a = _(); + return j.base.chatLog ? (t.close(ti.chatLog.index), ti.chatLog.index = t.open({ + type: 2, + maxmin: !0, + title: "与 " + a.data.name + " 的聊天记录", + area: ["450px", "100%"], + shade: !1, + offset: "rb", + skin: "layui-box", + anim: 2, + id: "layui-layim-chatlog", + content: j.base.chatLog + "?id=" + a.data.id + "&type=" + a.data.type + })) : t.msg("未开启更多聊天记录") + }, + menuHistory: function (i, a) { + var n = layui.data("layim")[j.mine.id] || {}, + l = i.parent(), + s = i.data("type"), + o = x.find(".layim-list-history"), + d = '
                                            • 暂无历史会话
                                            • '; + if ("one" === s) { + var r = n.history; + delete r[l.data("index")], n.history = r, layui.data("layim", { + key: j.mine.id, + value: n + }), e(".layim-list-history li.layim-" + l.data("index")).remove(), 0 === o.find("li").length && o.html(d) + } else "all" === s && (delete n.history, layui.data("layim", { + key: j.mine.id, + value: n + }), o.html(d)); + t.closeAll("tips") + } + }; + i("layim", new c) +}).addcss("modules/layim/layim.css?v=3.9.1", "skinlayimcss"); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layui/xm-select.js b/AdminSrc/AdminHost/wwwroot/admin/layui/xm-select.js new file mode 100644 index 0000000..1814373 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layui/xm-select.js @@ -0,0 +1,9 @@ +/*! + * @Title: xm-select + * @Version: 1.2.4 + * @Description:基于layui的多选解决方案 + * @Site: https://gitee.com/maplemei/xm-select + * @Author: maplemei + * @License:Apache License 2.0 + */ +!function (e) { var t = {}; function n(o) { if (t[o]) return t[o].exports; var r = t[o] = { i: o, l: !1, exports: {} }; return e[o].call(r.exports, r, r.exports, n), r.l = !0, r.exports } n.m = e, n.c = t, n.d = function (e, t, o) { n.o(e, t) || Object.defineProperty(e, t, { enumerable: !0, get: o }) }, n.r = function (e) { "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { value: "Module" }), Object.defineProperty(e, "__esModule", { value: !0 }) }, n.t = function (e, t) { if (1 & t && (e = n(e)), 8 & t) return e; if (4 & t && "object" == typeof e && e && e.__esModule) return e; var o = Object.create(null); if (n.r(o), Object.defineProperty(o, "default", { enumerable: !0, value: e }), 2 & t && "string" != typeof e) for (var r in e) n.d(o, r, function (t) { return e[t] }.bind(null, r)); return o }, n.n = function (e) { var t = e && e.__esModule ? function () { return e.default } : function () { return e }; return n.d(t, "a", t), t }, n.o = function (e, t) { return Object.prototype.hasOwnProperty.call(e, t) }, n.p = "./", n(n.s = 214) }({ 1: function (e, t, n) { "use strict"; function o(e, t) { var n = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); t && (o = o.filter((function (t) { return Object.getOwnPropertyDescriptor(e, t).enumerable }))), n.push.apply(n, o) } return n } function r(e, t, n) { return t in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e } function i(e) { return function (e) { if (Array.isArray(e)) return a(e) }(e) || function (e) { if ("undefined" != typeof Symbol && Symbol.iterator in Object(e)) return Array.from(e) }(e) || function (e, t) { if (!e) return; if ("string" == typeof e) return a(e, t); var n = Object.prototype.toString.call(e).slice(8, -1); "Object" === n && e.constructor && (n = e.constructor.name); if ("Map" === n || "Set" === n) return Array.from(e); if ("Arguments" === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return a(e, t) }(e) || function () { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.") }() } function a(e, t) { (null == t || t > e.length) && (t = e.length); for (var n = 0, o = new Array(t); n < t; n++)o[n] = e[n]; return o } function l(e) { return e.nodeType ? e : document.querySelector(e) } function s() { for (var e = [], t = 0; t < arguments.length; t++)e.push("".concat(t + 1, ". ").concat(arguments[t])); console.warn(e.join("\n")) } function c(e) { return "[object Array]" == Object.prototype.toString.call(e) } function u(e) { return "[object Function]" == Object.prototype.toString.call(e) } function p(e) { return e -= 0, isNaN(e) && (e = 0), e } function f(e, t) { var n; for (n in t) e[n] = e[n] && "[object Object]" === e[n].toString() && t[n] && "[object Object]" === t[n].toString() ? f(e[n], t[n]) : e[n] = t[n]; return e } function d(e, t, n) { for (var o = n.value, r = i(t), a = function (n) { var i = e[n]; t.find((function (e) { return e[o] == i[o] })) || r.push(i) }, l = 0; l < e.length; l++)a(l); return r } function h() { return -1 != navigator.userAgent.indexOf("Mac OS") ? "mac" : "win" } function m(e, t, n, o) { if (e && c(e)) { var r = o.children, i = o.selected, a = o.value; e.forEach((function (e) { e.__node[i] || t.find((function (t) { return t[a] === e[a] })) ? n.push(e) : m(e[r], t, n, o) })) } } function b(e, t, n) { if (e && c(e)) return e.map((function (e) { return e = function (e) { for (var t = 1; t < arguments.length; t++){ var n = null != arguments[t] ? arguments[t] : {}; t % 2 ? o(Object(n), !0).forEach((function (t) { r(e, t, n[t]) })) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : o(Object(n)).forEach((function (t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)) })) } return e }({}, e), n.forEach((function (t) { return delete e[t] })), e[t] = b(e[t], t, n), e })) } function y(e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 100, n = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2], o = this, r = !1; return function () { for (var i = arguments.length, a = new Array(i), l = 0; l < i; l++)a[l] = arguments[l]; r || (r = !0, !n && e.call.apply(e, [o].concat(a)), setTimeout((function () { n && e.call.apply(e, [o].concat(a)), r = !1 }), t)) } } n.d(t, "g", (function () { return l })), n.d(t, "k", (function () { return s })), n.d(t, "d", (function () { return c })), n.d(t, "e", (function () { return u })), n.d(t, "i", (function () { return p })), n.d(t, "b", (function () { return f })), n.d(t, "f", (function () { return d })), n.d(t, "a", (function () { return h })), n.d(t, "j", (function () { return m })), n.d(t, "c", (function () { return b })), n.d(t, "h", (function () { return y })) }, 106: function (e, t) { e.exports = function (e) { var t = "undefined" != typeof window && window.location; if (!t) throw new Error("fixUrls requires window.location"); if (!e || "string" != typeof e) return e; var n = t.protocol + "//" + t.host, o = n + t.pathname.replace(/\/[^\/]*$/, "/"); return e.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi, (function (e, t) { var r, i = t.trim().replace(/^"(.*)"$/, (function (e, t) { return t })).replace(/^'(.*)'$/, (function (e, t) { return t })); return /^(#|data:|http:\/\/|https:\/\/|file:\/\/\/|\s*$)/i.test(i) ? e : (r = 0 === i.indexOf("//") ? i : 0 === i.indexOf("/") ? n + i : o + i.replace(/^\.\//, ""), "url(" + JSON.stringify(r) + ")") })) } }, 214: function (e, t, n) { "use strict"; n.r(t), function (e) { n(216), n(217), n(219); var t = n(42), o = n(1); window.addEventListener("click", (function () { Object.keys(t.b).forEach((function (e) { var n = t.b[e]; n && n.closed && n.closed() })) })), window.addEventListener("scroll", Object(o.h)((function () { Object.keys(t.b).forEach((function (e) { var n = t.b[e]; n && n.calcPosition && n.calcPosition() })) }))), "object" === ("undefined" == typeof exports ? "undefined" : _typeof(exports)) ? e.exports = t.c : "function" == typeof define && n(221) ? define(xmSelect) : window.layui && layui.define && layui.define((function (e) { e("xmSelect", t.c) })), window.xmSelect = t.c }.call(this, n(215)(e)) }, 215: function (e, t) { e.exports = function (e) { if (!e.webpackPolyfill) { var t = Object.create(e); t.children || (t.children = []), Object.defineProperty(t, "loaded", { enumerable: !0, get: function () { return t.l } }), Object.defineProperty(t, "id", { enumerable: !0, get: function () { return t.i } }), Object.defineProperty(t, "exports", { enumerable: !0 }), t.webpackPolyfill = 1 } return t } }, 216: function (e, t) { Array.prototype.map || (Array.prototype.map = function (e, t) { var n, o, r, i = Object(this), a = i.length >>> 0; for (t && (n = t), o = new Array(a), r = 0; r < a;){ var l, s; r in i && (l = i[r], s = e.call(n, l, r, i), o[r] = s), r++ } return o }), Array.prototype.forEach || (Array.prototype.forEach = function (e, t) { var n, o; if (null == this) throw new TypeError("this is null or not defined"); var r = Object(this), i = r.length >>> 0; if ("function" != typeof e) throw new TypeError(e + " is not a function"); for (arguments.length > 1 && (n = t), o = 0; o < i;){ var a; o in r && (a = r[o], e.call(n, a, o, r)), o++ } }), Array.prototype.filter || (Array.prototype.filter = function (e) { if (null == this) throw new TypeError; var t = Object(this), n = t.length >>> 0; if ("function" != typeof e) throw new TypeError; for (var o = [], r = arguments[1], i = 0; i < n; i++)if (i in t) { var a = t[i]; e.call(r, a, i, t) && o.push(a) } return o }), Array.prototype.find || (Array.prototype.find = function (e) { return e && (this.filter(e) || [])[0] }), Array.prototype.findIndex || (Array.prototype.findIndex = function (e) { for (var t, n = Object(this), o = n.length >>> 0, r = arguments[1], i = 0; i < o; i++)if (t = n[i], e.call(r, t, i, n)) return i; return -1 }) }, 217: function (e, t, n) { var o = n(218); "string" == typeof o && (o = [[e.i, o, ""]]); var r = { hmr: !0, transform: void 0, insertInto: void 0 }; n(28)(o, r); o.locals && (e.exports = o.locals) }, 218: function (e, t, n) { (t = n(27)(!1)).push([e.i, '@font-face {\n font-family: "xm-iconfont";\n src: url(\'//at.alicdn.com/t/font_792691_ptvyboo0bno.eot?t=1574048839056\');\n /* IE9 */\n src: url(\'//at.alicdn.com/t/font_792691_ptvyboo0bno.eot?t=1574048839056#iefix\') format(\'embedded-opentype\'), /* IE6-IE8 */ url(\'data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAksAAsAAAAAEYAAAAjeAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCEUgqTXI8lATYCJAM0CxwABCAFhG0HgTwbZQ4jEbaCkVIj+4sD3sS6BFAp9ka91ulVG4leTC/+h+3V+zyRYCTyREKkcZ+D5/u137lPdveLGJBMunoiNPOQPBMq0/FQtEKIkMRDZng69d+hOiQumAr7bJdBOEzMTU77s78mhbI58aCg7ebCs4LBTgCk+cD/4ZqWUHebipp7al3tyKOjwCV/hVyw9PdzaktxI7IMQs26/1N8gV4DI0bVut3UhCaflGGgwM3oTXg1IfRMbCsmrEnriJVeYM2eXHII4KdMMzL4OoACHgZBCTasITcReDUBE8kWPLMTCGoQaDV+eKpUPQI49r8vP6BTPIDCaiBSml3oOQX0voNPebv/u2P0AUfP1w0s5EADzYBZsNdByylo2eVq/NtRdgFpovQR5x2CIwmIZeik6/u0T/m/A7RJP00sCmmyksj/kwc+LC5BFBqDEMDDjwPiANDB9MpJTXwHmsO3YyBwWDA4OFwwJLRcRgAOBUYMDg0mHRwGTAYozsV0AgWYruDwwExDHfzwKWf4OurQ9jzQDtoF+wpistfBfluQ5bQiiJa4ZQoKhShLiMayBbyg05AIkYBoIBJEEApQy/FwYv4HchADIUBXl61dW6mpwIgyp7p8PrHddieSjhY9oqTxyPB/FGNYDklpfYh8VtaoqSgb0bKoGB17CuVUp9Ll2nS2UpNGMSw9hyirA7C6+QLyByIQS0sSSmxvArC5odZmYZMxZSiBR5OkQl0uiufxMH5eL8t3u0d4XKyuq6EMdcpNe2+oXA8p9yPa+4T1PM7+A54tc7tpl2vcAHAftnhZj2chy1CyaCRFsyMqQ5nkNnskEt2yxxZinPsOZjFm4+XWvKqLkfCGS1k4MNP82isxSMf7ZsGYvQVCNAeSSVtzWCxRdXGxyZlA2CvCEevuO7y9M2z2NWH8icydzq/qAJSp1lGvDWFp6Nw3xChJowPD+76nU+upQk6Kw9jI0Rgym9Ct8VlxMI3CSIaDCZja5tDYt0/EYra4tn0Kp3v8Rdezk8svcy1mKhoSvNcZz3LKlUe777Gmval0s7bzAc0k13LGk896V9DuvNn34N0ebKgItkQgOomuJtgQPChNI4cwa7CEWCvfk5QjJFlem6i3SfVShWi5LTFRG+JwdCNpSqbpRFwrtb1TbcRkJi/AbJJQOmfCdnswLNGVM7qqSRO1zO0Q0j5Vr3cYQ07HB0MX6KoIZhx+D9Djs2C5bXtVwvbgJHtSCIL7hjFJme4sZDdS5IlJdKUO1Qt8opn0trBafz3AX933kmCRgyMEWGZjMAkRKhwmIHJGR4ruwFCdWKYzrap2R/mvd2UKajzRAZu88pGAD90Y+02kTFCKrBSXwGGJ3wRcPCdIppTxSmHOfESRwIli0S5J/8AYDCxTGh4XZua4xvfvGx320rDK2qA8g5FlS7pWNLx71+BwgA/KZ5I0aeKmNeCNoNPl8qNHu8uHHzqaKc86fHi4vPuRI4ny+I/vjxw+clh4HXVCFvVnVFx07EHZwVhSRliTTMWSEi0h6YuS6DxCRmiin0B3L4ry6cvR0ijYexFdBL3wGQM0YOrUAZCBkLOBBtQ+xdk7omfgUv+u++admyUeXduyxLM+r/+49rPfhgEZor6GymToNYksNsZyC7ntwAH0928UpgMpxpF0ydNlsMMBw7QsxTCmu0Hf3F+/+vb99Yumhb+e9R0LBNm+4O+hu7lQ5bGjI9j5G88qQ5SLFyuEC7cwd25xoYo2j4eA4bhpM7TZhPtmc+uhVEVSMYXLWh0bfjI8dvUpvDUocPZmU4kwwOfc83wB5wPehrpD3waApbwW+fgRrZXcxw+mB/3woZT+8JFMYwRMIy2k/18qhqcKpjYeYSnIACaUoRDu0e3kQFh98R5fiI8oJqwwGZSJDSbehLzZs7zIeWTQ4UGOIs2c4j2/Q/tn7n7j9juO33On6WhURCT/wO6Y3QdmWFY0Ef6JUeGRggO7ZbtaZlh5RYKWXbLPBLc3l/5h4A0mu3ZXTZ+u6t6VHMAzZhxak50T+24NnRuaOmehRkXlqVR5lIpuwezUUDUdCuJysv8Z/0/8uNE1s7jIJIubFWnI/x7g4nAZx79yYpFoAOU3a9iwT1O/GxUxPY0ljVPv9EukI3qNrl/So2YfzasqHCroNjS0+w0tlPlsYfC6v/01ixquizJH1Kd/VK+OS3iS3rTJWmqsMPdU3B3oFyC9RSumWE/0gG36IjTysfH51IJ/5oOgNYu6p4yb5Fdufhr/Kjtu0oSyYP/WJQrz35aNFnMhtFcwb55NlNnH8Wdu1b+XZA9zqlZrhdPo/V3uBhiUlQ66h0LhbAmFYIncdFOpVMh6Fl7peqy5Z2ZdQBITO2x1Asj1dRFjIBMC3hbuUh8Ooc4W03EjAdo8UL/t0oUfyU8630bmMcw/vqDNAsC9BQD4OqCgH+ljy0UhJB8AAJA+8EmArxk5gnRLik90AElf8rBm+IMvBTWnucb3+0o0ARk+r0ZBv8sU01nnSmP45/H8Dp8C8X+iE9e+ZvXymK/sQJ5/DuqhYKebPnKmPqLYuDcIMWS2/Rjxp2s8Do821LVn6A/xMK1RKvBLK5gyDsZ5uQ6bYusmx2yqLFe4lECHDPcFhojmckuAbnCI6Cn308RI6AAJdtCICQLQyBHKhSgX5YowN6BBPIEB8VxuSfNncpAuutzPnCSiDHDEo+DsKQBPoJi4MpRktepIs2zjO5h84IEMM3ffECKSZU1ZHxfewEI4h494MuuUNNOBjuw18QKHAzEXaAcylS3m3baq9MpnKenYmfEUgCdbXTHEtTVKsvruNGv9/DuYfOAhcuKu9TeEiA9nNJTUDOUbbVkn3sv2eDJrEnVrpvcHOjJeqRsOcpYYLuxoBzKVtCOm3ZaKbtJcurw+e/zN6c7Pd6r4gqUo0WLEiiOueOITvwQkKCEJM9nO3F60y5HkqLhdqUyXZtK3lqwReQ+G40O92UhOt0x/KmKM+u7LTPMzoEBOCYtiUPfSjODiuFXjSDm2idzAoc4Tj9bs2eJYDOU7HQA=\') format(\'woff2\'), url(\'//at.alicdn.com/t/font_792691_ptvyboo0bno.woff?t=1574048839056\') format(\'woff\'), url(\'//at.alicdn.com/t/font_792691_ptvyboo0bno.ttf?t=1574048839056\') format(\'truetype\'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ url(\'//at.alicdn.com/t/font_792691_ptvyboo0bno.svg?t=1574048839056#iconfont\') format(\'svg\');\n /* iOS 4.1- */\n}\n.xm-iconfont {\n font-family: "xm-iconfont" !important;\n font-size: 16px;\n font-style: normal;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.xm-icon-quanxuan:before {\n content: "\\e62c";\n}\n.xm-icon-caidan:before {\n content: "\\e610";\n}\n.xm-icon-fanxuan:before {\n content: "\\e837";\n}\n.xm-icon-pifu:before {\n content: "\\e668";\n}\n.xm-icon-qingkong:before {\n content: "\\e63e";\n}\n.xm-icon-sousuo:before {\n content: "\\e600";\n}\n.xm-icon-danx:before {\n content: "\\e62b";\n}\n.xm-icon-duox:before {\n content: "\\e613";\n}\n.xm-icon-close:before {\n content: "\\e601";\n}\n.xm-icon-expand:before {\n content: "\\e641";\n}\n.xm-icon-banxuan:before {\n content: "\\e60d";\n}\n', ""]), e.exports = t }, 219: function (e, t, n) { var o = n(220); "string" == typeof o && (o = [[e.i, o, ""]]); var r = { hmr: !0, transform: void 0, insertInto: void 0 }; n(28)(o, r); o.locals && (e.exports = o.locals) }, 220: function (e, t, n) { (t = n(27)(!1)).push([e.i, "@-webkit-keyframes xm-upbit {\n from {\n -webkit-transform: translate3d(0, 30px, 0);\n opacity: 0.3;\n }\n to {\n -webkit-transform: translate3d(0, 0, 0);\n opacity: 1;\n }\n}\n@keyframes xm-upbit {\n from {\n transform: translate3d(0, 30px, 0);\n opacity: 0.3;\n }\n to {\n transform: translate3d(0, 0, 0);\n opacity: 1;\n }\n}\n@-webkit-keyframes loader {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n@keyframes loader {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\nxm-select {\n background-color: #FFF;\n position: relative;\n border: 1px solid #E6E6E6;\n border-radius: 2px;\n display: block;\n width: 100%;\n cursor: pointer;\n outline: none;\n}\nxm-select * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n font-size: 14px;\n font-weight: 400;\n text-overflow: ellipsis;\n user-select: none;\n -ms-user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n}\nxm-select:hover,\nxm-select:focus {\n border-color: #C0C4CC;\n}\nxm-select > .xm-tips {\n color: #999999;\n padding: 0 10px;\n position: absolute;\n display: flex;\n height: 100%;\n align-items: center;\n}\nxm-select > .xm-icon {\n display: inline-block;\n overflow: hidden;\n position: absolute;\n width: 0;\n height: 0;\n right: 10px;\n top: 50%;\n margin-top: -3px;\n cursor: pointer;\n border: 6px dashed transparent;\n border-top-color: #C2C2C2;\n border-top-style: solid;\n transition: all 0.3s;\n -webkit-transition: all 0.3s;\n}\nxm-select > .xm-icon-expand {\n margin-top: -9px;\n transform: rotate(180deg);\n}\nxm-select > .xm-label.single-row {\n position: absolute;\n top: 0;\n bottom: 0px;\n left: 0px;\n right: 30px;\n overflow: auto hidden;\n}\nxm-select > .xm-label.single-row .scroll {\n overflow-y: hidden;\n}\nxm-select > .xm-label.single-row .label-content {\n flex-wrap: nowrap;\n white-space: nowrap;\n}\nxm-select > .xm-label.auto-row .label-content {\n flex-wrap: wrap;\n padding-right: 30px !important;\n}\nxm-select > .xm-label.auto-row .xm-label-block > span {\n white-space: unset;\n height: 100%;\n}\nxm-select > .xm-label .scroll .label-content {\n display: flex;\n padding: 3px 10px;\n}\nxm-select > .xm-label .xm-label-block {\n display: flex;\n position: relative;\n padding: 0px 5px;\n margin: 2px 5px 2px 0;\n border-radius: 3px;\n align-items: baseline;\n color: #FFF;\n}\nxm-select > .xm-label .xm-label-block > span {\n display: flex;\n color: #FFF;\n white-space: nowrap;\n}\nxm-select > .xm-label .xm-label-block > i {\n color: #FFF;\n margin-left: 8px;\n font-size: 12px;\n cursor: pointer;\n display: flex;\n}\nxm-select > .xm-label .xm-label-block.disabled {\n background-color: #C2C2C2 !important;\n cursor: no-drop !important;\n}\nxm-select > .xm-label .xm-label-block.disabled > i {\n cursor: no-drop !important;\n}\nxm-select > .xm-body {\n position: absolute;\n left: 0;\n top: 42px;\n padding: 5px 0;\n z-index: 999;\n width: 100%;\n min-width: fit-content;\n border: 1px solid #E6E6E6;\n background-color: #fff;\n border-radius: 2px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);\n animation-name: xm-upbit;\n animation-duration: 0.3s;\n animation-fill-mode: both;\n}\nxm-select > .xm-body .scroll-body {\n overflow-x: hidden;\n overflow-y: auto;\n}\nxm-select > .xm-body .scroll-body::-webkit-scrollbar {\n width: 8px;\n}\nxm-select > .xm-body .scroll-body::-webkit-scrollbar-track {\n -webkit-border-radius: 2em;\n -moz-border-radius: 2em;\n -ms-border-radius: 2em;\n border-radius: 2em;\n background-color: #FFF;\n}\nxm-select > .xm-body .scroll-body::-webkit-scrollbar-thumb {\n -webkit-border-radius: 2em;\n -moz-border-radius: 2em;\n -ms-border-radius: 2em;\n border-radius: 2em;\n background-color: #C2C2C2;\n}\nxm-select > .xm-body.up {\n top: auto;\n bottom: 42px;\n}\nxm-select > .xm-body.relative {\n position: relative;\n display: block !important;\n top: 0;\n box-shadow: none;\n border: none;\n animation-name: none;\n animation-duration: 0;\n min-width: 100%;\n}\nxm-select > .xm-body .xm-group {\n cursor: default;\n}\nxm-select > .xm-body .xm-group-item {\n display: inline-block;\n cursor: pointer;\n padding: 0 10px;\n color: #999;\n font-size: 12px;\n}\nxm-select > .xm-body .xm-option {\n display: flex;\n align-items: center;\n position: relative;\n padding: 0 10px;\n cursor: pointer;\n}\nxm-select > .xm-body .xm-option-icon {\n color: transparent;\n display: flex;\n border: 1px solid #E6E6E6;\n border-radius: 3px;\n justify-content: center;\n align-items: center;\n}\nxm-select > .xm-body .xm-option-icon.xm-custom-icon {\n color: unset;\n border: unset;\n}\nxm-select > .xm-body .xm-option-icon-hidden {\n margin-right: -10px;\n}\nxm-select > .xm-body .xm-option-icon.xm-icon-danx {\n border-radius: 100%;\n}\nxm-select > .xm-body .xm-option-content {\n display: flex;\n position: relative;\n padding-left: 15px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n color: #666;\n width: calc(100% - 20px);\n}\nxm-select > .xm-body .xm-option.hide-icon .xm-option-content {\n padding-left: 0;\n}\nxm-select > .xm-body .xm-option.selected.hide-icon .xm-option-content {\n color: #FFF !important;\n}\nxm-select > .xm-body .xm-option .loader {\n width: 0.8em;\n height: 0.8em;\n margin-right: 6px;\n color: #C2C2C2;\n}\nxm-select > .xm-body .xm-select-empty {\n text-align: center;\n color: #999;\n}\nxm-select > .xm-body .disabled {\n cursor: no-drop;\n}\nxm-select > .xm-body .disabled:hover {\n background-color: #FFF;\n}\nxm-select > .xm-body .disabled .xm-option-icon {\n border-color: #C2C2C2 !important;\n}\nxm-select > .xm-body .disabled .xm-option-content {\n color: #C2C2C2 !important;\n}\nxm-select > .xm-body .disabled.selected > .xm-option-icon {\n color: #C2C2C2 !important;\n}\nxm-select > .xm-body .xm-search {\n background-color: #FFF !important;\n position: relative;\n padding: 0 10px;\n margin-bottom: 5px;\n cursor: pointer;\n}\nxm-select > .xm-body .xm-search > i {\n position: absolute;\n color: #666;\n}\nxm-select > .xm-body .xm-search-input {\n border: none;\n border-bottom: 1px solid #E6E6E6;\n padding-left: 27px;\n cursor: text;\n}\nxm-select > .xm-body .xm-paging {\n padding: 0 10px;\n display: flex;\n margin-top: 5px;\n}\nxm-select > .xm-body .xm-paging > span:first-child {\n border-radius: 2px 0 0 2px;\n}\nxm-select > .xm-body .xm-paging > span:last-child {\n border-radius: 0 2px 2px 0;\n}\nxm-select > .xm-body .xm-paging > span {\n display: flex;\n flex: auto;\n justify-content: center;\n vertical-align: middle;\n margin: 0 -1px 0 0;\n background-color: #fff;\n color: #333;\n font-size: 12px;\n border: 1px solid #e2e2e2;\n flex-wrap: nowrap;\n width: 100%;\n overflow: hidden;\n min-width: 50px;\n}\nxm-select > .xm-body .xm-toolbar {\n padding: 0 10px;\n display: flex;\n margin: -3px 0;\n cursor: default;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag {\n cursor: pointer;\n display: flex;\n margin-right: 20px;\n color: #666;\n align-items: baseline;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag:hover {\n opacity: 0.8;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag:active {\n opacity: 1;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag > i {\n margin-right: 2px;\n font-size: 14px;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag:last-child {\n margin-right: 0;\n}\nxm-select > .xm-body .xm-body-custom {\n line-height: initial;\n cursor: default;\n}\nxm-select > .xm-body .xm-body-custom * {\n box-sizing: initial;\n}\nxm-select > .xm-body .xm-tree {\n position: relative;\n}\nxm-select > .xm-body .xm-tree-icon {\n display: inline-block;\n margin-right: 3px;\n cursor: pointer;\n border: 6px dashed transparent;\n border-left-color: #C2C2C2;\n border-left-style: solid;\n transition: all 0.3s;\n -webkit-transition: all 0.3s;\n z-index: 2;\n visibility: hidden;\n}\nxm-select > .xm-body .xm-tree-icon.expand {\n margin-top: 3px;\n margin-right: 5px;\n margin-left: -2px;\n transform: rotate(90deg);\n}\nxm-select > .xm-body .xm-tree-icon.xm-visible {\n visibility: visible;\n}\nxm-select > .xm-body .xm-tree .left-line {\n position: absolute;\n left: 13px;\n width: 0;\n z-index: 1;\n border-left: 1px dotted #c0c4cc !important;\n}\nxm-select > .xm-body .xm-tree .top-line {\n position: absolute;\n left: 13px;\n height: 0;\n z-index: 1;\n border-top: 1px dotted #c0c4cc !important;\n}\nxm-select > .xm-body .xm-tree .xm-tree-icon + .top-line {\n margin-left: 1px;\n}\nxm-select > .xm-body .scroll-body > .xm-tree > .xm-option > .top-line,\nxm-select > .xm-body .scroll-body > .xm-option > .top-line {\n width: 0 !important;\n}\nxm-select > .xm-body .xm-cascader-box {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n padding: 5px 0;\n border: 1px solid #E6E6E6;\n background-color: #fff;\n border-radius: 2px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);\n margin: -1px;\n}\nxm-select > .xm-body .xm-cascader-box::before {\n content: ' ';\n position: absolute;\n width: 0;\n height: 0;\n border: 6px solid transparent;\n border-right-color: #E6E6E6;\n top: 10px;\n left: -12px;\n}\nxm-select > .xm-body .xm-cascader-box::after {\n content: ' ';\n position: absolute;\n width: 0;\n height: 0;\n border: 6px solid transparent;\n border-right-color: #fff;\n top: 10px;\n left: -11px;\n}\nxm-select > .xm-body .xm-cascader-scroll {\n height: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n}\nxm-select > .xm-body.cascader {\n width: unset;\n min-width: unset;\n}\nxm-select > .xm-body.cascader .xm-option-content {\n padding-left: 8px;\n}\nxm-select > .xm-body.cascader .disabled .xm-right-arrow {\n color: #C2C2C2 !important;\n}\nxm-select > .xm-body.cascader .hide-icon.disabled .xm-right-arrow {\n color: #999 !important;\n}\nxm-select .xm-input {\n cursor: pointer;\n border-radius: 2px;\n border-width: 1px;\n border-style: solid;\n border-color: #E6E6E6;\n display: block;\n width: 100%;\n box-sizing: border-box;\n background-color: #FFF;\n line-height: 1.3;\n padding-left: 10px;\n outline: 0;\n user-select: text;\n -ms-user-select: text;\n -moz-user-select: text;\n -webkit-user-select: text;\n}\nxm-select .dis {\n display: none;\n}\nxm-select .loading {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(255, 255, 255, 0.6);\n display: flex;\n align-items: center;\n justify-content: center;\n}\nxm-select .loader {\n border: 0.2em dotted currentcolor;\n border-radius: 50%;\n -webkit-animation: 1s loader linear infinite;\n animation: 1s loader linear infinite;\n display: inline-block;\n width: 1em;\n height: 1em;\n color: inherit;\n vertical-align: middle;\n pointer-events: none;\n}\nxm-select .xm-select-default {\n position: absolute;\n width: 100%;\n height: 100%;\n border: none;\n visibility: hidden;\n}\nxm-select .xm-select-disabled {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n cursor: no-drop;\n z-index: 2;\n opacity: 0.3;\n background-color: #FFF;\n}\nxm-select .item--divided {\n border-top: 1px solid #ebeef5;\n width: calc(100% - 20px);\n cursor: initial;\n}\nxm-select .xm-right-arrow {\n position: absolute;\n color: #666;\n right: 5px;\n top: -1px;\n font-weight: 700;\n transform: scale(0.6, 1);\n}\nxm-select .xm-right-arrow::after {\n content: '>';\n}\nxm-select[size='large'] {\n min-height: 40px;\n line-height: 40px;\n}\nxm-select[size='large'] .xm-input {\n height: 40px;\n}\nxm-select[size='large'] .xm-label .scroll .label-content {\n line-height: 34px;\n}\nxm-select[size='large'] .xm-label .xm-label-block {\n height: 30px;\n line-height: 30px;\n}\nxm-select[size='large'] .xm-body .xm-option .xm-option-icon {\n height: 20px;\n width: 20px;\n font-size: 20px;\n}\nxm-select[size='large'] .xm-paging > span {\n height: 34px;\n line-height: 34px;\n}\nxm-select[size='large'] .xm-tree .left-line {\n height: 100%;\n bottom: 20px;\n}\nxm-select[size='large'] .xm-tree .left-line-group {\n height: calc(100% - 40px);\n}\nxm-select[size='large'] .xm-tree .xm-tree-icon.xm-hidden + .top-line {\n top: 19px;\n}\nxm-select[size='large'] .item--divided {\n margin: 10px;\n}\nxm-select {\n min-height: 36px;\n line-height: 36px;\n}\nxm-select .xm-input {\n height: 36px;\n}\nxm-select .xm-label .scroll .label-content {\n line-height: 30px;\n}\nxm-select .xm-label .xm-label-block {\n height: 26px;\n line-height: 26px;\n}\nxm-select .xm-body .xm-option .xm-option-icon {\n height: 18px;\n width: 18px;\n font-size: 18px;\n}\nxm-select .xm-paging > span {\n height: 30px;\n line-height: 30px;\n}\nxm-select .xm-tree .left-line {\n height: 100%;\n bottom: 18px;\n}\nxm-select .xm-tree .left-line-group {\n height: calc(100% - 36px);\n}\nxm-select .xm-tree .xm-tree-icon.xm-hidden + .top-line {\n top: 17px;\n}\nxm-select .item--divided {\n margin: 9px;\n}\nxm-select[size='small'] {\n min-height: 32px;\n line-height: 32px;\n}\nxm-select[size='small'] .xm-input {\n height: 32px;\n}\nxm-select[size='small'] .xm-label .scroll .label-content {\n line-height: 26px;\n}\nxm-select[size='small'] .xm-label .xm-label-block {\n height: 22px;\n line-height: 22px;\n}\nxm-select[size='small'] .xm-body .xm-option .xm-option-icon {\n height: 16px;\n width: 16px;\n font-size: 16px;\n}\nxm-select[size='small'] .xm-paging > span {\n height: 26px;\n line-height: 26px;\n}\nxm-select[size='small'] .xm-tree .left-line {\n height: 100%;\n bottom: 16px;\n}\nxm-select[size='small'] .xm-tree .left-line-group {\n height: calc(100% - 32px);\n}\nxm-select[size='small'] .xm-tree .xm-tree-icon.xm-hidden + .top-line {\n top: 15px;\n}\nxm-select[size='small'] .item--divided {\n margin: 8px;\n}\nxm-select[size='mini'] {\n min-height: 28px;\n line-height: 28px;\n}\nxm-select[size='mini'] .xm-input {\n height: 28px;\n}\nxm-select[size='mini'] .xm-label .scroll .label-content {\n line-height: 22px;\n}\nxm-select[size='mini'] .xm-label .xm-label-block {\n height: 18px;\n line-height: 18px;\n}\nxm-select[size='mini'] .xm-body .xm-option .xm-option-icon {\n height: 14px;\n width: 14px;\n font-size: 14px;\n}\nxm-select[size='mini'] .xm-paging > span {\n height: 22px;\n line-height: 22px;\n}\nxm-select[size='mini'] .xm-tree .left-line {\n height: 100%;\n bottom: 14px;\n}\nxm-select[size='mini'] .xm-tree .left-line-group {\n height: calc(100% - 28px);\n}\nxm-select[size='mini'] .xm-tree .xm-tree-icon.xm-hidden + .top-line {\n top: 13px;\n}\nxm-select[size='mini'] .item--divided {\n margin: 7px;\n}\n.layui-form-pane xm-select {\n margin: -1px -1px -1px 0;\n}\n", ""]), e.exports = t }, 221: function (e, t) { (function (t) { e.exports = t }).call(this, {}) }, 27: function (e, t, n) { "use strict"; e.exports = function (e) { var t = []; return t.toString = function () { return this.map((function (t) { var n = function (e, t) { var n = e[1] || "", o = e[3]; if (!o) return n; if (t && "function" == typeof btoa) { var r = function (e) { var t = btoa(unescape(encodeURIComponent(JSON.stringify(e)))), n = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(t); return "/*# ".concat(n, " */") }(o), i = o.sources.map((function (e) { return "/*# sourceURL=".concat(o.sourceRoot || "").concat(e, " */") })); return [n].concat(i).concat([r]).join("\n") } return [n].join("\n") }(t, e); return t[2] ? "@media ".concat(t[2], " {").concat(n, "}") : n })).join("") }, t.i = function (e, n, o) { "string" == typeof e && (e = [[null, e, ""]]); var r = {}; if (o) for (var i = 0; i < this.length; i++){ var a = this[i][0]; null != a && (r[a] = !0) } for (var l = 0; l < e.length; l++){ var s = [].concat(e[l]); o && r[s[0]] || (n && (s[2] ? s[2] = "".concat(n, " and ").concat(s[2]) : s[2] = n), t.push(s)) } }, t } }, 28: function (e, t, n) { var o, r, i = {}, a = (o = function () { return window && document && document.all && !window.atob }, function () { return void 0 === r && (r = o.apply(this, arguments)), r }), l = function (e, t) { return t ? t.querySelector(e) : document.querySelector(e) }, s = function (e) { var t = {}; return function (e, n) { if ("function" == typeof e) return e(); if (void 0 === t[e]) { var o = l.call(this, e, n); if (window.HTMLIFrameElement && o instanceof window.HTMLIFrameElement) try { o = o.contentDocument.head } catch (e) { o = null } t[e] = o } return t[e] } }(), c = null, u = 0, p = [], f = n(106); function d(e, t) { for (var n = 0; n < e.length; n++){ var o = e[n], r = i[o.id]; if (r) { r.refs++; for (var a = 0; a < r.parts.length; a++)r.parts[a](o.parts[a]); for (; a < o.parts.length; a++)r.parts.push(v(o.parts[a], t)) } else { var l = []; for (a = 0; a < o.parts.length; a++)l.push(v(o.parts[a], t)); i[o.id] = { id: o.id, refs: 1, parts: l } } } } function h(e, t) { for (var n = [], o = {}, r = 0; r < e.length; r++){ var i = e[r], a = t.base ? i[0] + t.base : i[0], l = { css: i[1], media: i[2], sourceMap: i[3] }; o[a] ? o[a].parts.push(l) : n.push(o[a] = { id: a, parts: [l] }) } return n } function m(e, t) { var n = s(e.insertInto); if (!n) throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid."); var o = p[p.length - 1]; if ("top" === e.insertAt) o ? o.nextSibling ? n.insertBefore(t, o.nextSibling) : n.appendChild(t) : n.insertBefore(t, n.firstChild), p.push(t); else if ("bottom" === e.insertAt) n.appendChild(t); else { if ("object" != typeof e.insertAt || !e.insertAt.before) throw new Error("[Style Loader]\n\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\n Must be 'top', 'bottom', or Object.\n (https://github.com/webpack-contrib/style-loader#insertat)\n"); var r = s(e.insertAt.before, n); n.insertBefore(t, r) } } function b(e) { if (null === e.parentNode) return !1; e.parentNode.removeChild(e); var t = p.indexOf(e); t >= 0 && p.splice(t, 1) } function y(e) { var t = document.createElement("style"); if (void 0 === e.attrs.type && (e.attrs.type = "text/css"), void 0 === e.attrs.nonce) { var o = function () { 0; return n.nc }(); o && (e.attrs.nonce = o) } return x(t, e.attrs), m(e, t), t } function x(e, t) { Object.keys(t).forEach((function (n) { e.setAttribute(n, t[n]) })) } function v(e, t) { var n, o, r, i; if (t.transform && e.css) { if (!(i = "function" == typeof t.transform ? t.transform(e.css) : t.transform.default(e.css))) return function () { }; e.css = i } if (t.singleton) { var a = u++; n = c || (c = y(t)), o = w.bind(null, n, a, !1), r = w.bind(null, n, a, !0) } else e.sourceMap && "function" == typeof URL && "function" == typeof URL.createObjectURL && "function" == typeof URL.revokeObjectURL && "function" == typeof Blob && "function" == typeof btoa ? (n = function (e) { var t = document.createElement("link"); return void 0 === e.attrs.type && (e.attrs.type = "text/css"), e.attrs.rel = "stylesheet", x(t, e.attrs), m(e, t), t }(t), o = O.bind(null, n, t), r = function () { b(n), n.href && URL.revokeObjectURL(n.href) }) : (n = y(t), o = k.bind(null, n), r = function () { b(n) }); return o(e), function (t) { if (t) { if (t.css === e.css && t.media === e.media && t.sourceMap === e.sourceMap) return; o(e = t) } else r() } } e.exports = function (e, t) { if ("undefined" != typeof DEBUG && DEBUG && "object" != typeof document) throw new Error("The style-loader cannot be used in a non-browser environment"); (t = t || {}).attrs = "object" == typeof t.attrs ? t.attrs : {}, t.singleton || "boolean" == typeof t.singleton || (t.singleton = a()), t.insertInto || (t.insertInto = "head"), t.insertAt || (t.insertAt = "bottom"); var n = h(e, t); return d(n, t), function (e) { for (var o = [], r = 0; r < n.length; r++){ var a = n[r]; (l = i[a.id]).refs--, o.push(l) } e && d(h(e, t), t); for (r = 0; r < o.length; r++){ var l; if (0 === (l = o[r]).refs) { for (var s = 0; s < l.parts.length; s++)l.parts[s](); delete i[l.id] } } } }; var g, _ = (g = [], function (e, t) { return g[e] = t, g.filter(Boolean).join("\n") }); function w(e, t, n, o) { var r = n ? "" : o.css; if (e.styleSheet) e.styleSheet.cssText = _(t, r); else { var i = document.createTextNode(r), a = e.childNodes; a[t] && e.removeChild(a[t]), a.length ? e.insertBefore(i, a[t]) : e.appendChild(i) } } function k(e, t) { var n = t.css, o = t.media; if (o && e.setAttribute("media", o), e.styleSheet) e.styleSheet.cssText = n; else { for (; e.firstChild;)e.removeChild(e.firstChild); e.appendChild(document.createTextNode(n)) } } function O(e, t, n) { var o = n.css, r = n.sourceMap, i = void 0 === t.convertToAbsoluteUrls && r; (t.convertToAbsoluteUrls || i) && (o = f(o)), r && (o += "\n/*# sourceMappingURL=data:application/json;base64," + btoa(unescape(encodeURIComponent(JSON.stringify(r)))) + " */"); var a = new Blob([o], { type: "text/css" }), l = e.href; e.href = URL.createObjectURL(a), l && URL.revokeObjectURL(l) } }, 37: function (e) { e.exports = JSON.parse('{"a":"xm-select","b":"1.2.4","c":"https://maplemei.gitee.io/xm-select"}') }, 42: function (e, t, n) { "use strict"; n.d(t, "b", (function () { return Xe })), n.d(t, "d", (function () { return $e })), n.d(t, "a", (function () { return et })); var o, r, i, a, l, s = n(37), c = n(1), u = {}, p = [], f = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i; function d(e, t) { for (var n in t) e[n] = t[n]; return e } function h(e) { var t = e.parentNode; t && t.removeChild(e) } function m(e, t, n) { var o, r = arguments, i = {}; for (o in t) "key" !== o && "ref" !== o && (i[o] = t[o]); if (arguments.length > 3) for (n = [n], o = 3; o < arguments.length; o++)n.push(r[o]); if (null != n && (i.children = n), "function" == typeof e && null != e.defaultProps) for (o in e.defaultProps) void 0 === i[o] && (i[o] = e.defaultProps[o]); return b(e, i, t && t.key, t && t.ref, null) } function b(e, t, n, r, i) { var a = { type: e, props: t, key: n, ref: r, __k: null, __: null, __b: 0, __e: null, __d: void 0, __c: null, constructor: void 0, __v: i }; return null == i && (a.__v = a), o.vnode && o.vnode(a), a } function y(e) { return e.children } function x(e, t) { this.props = e, this.context = t } function v(e, t) { if (null == t) return e.__ ? v(e.__, e.__.__k.indexOf(e) + 1) : null; for (var n; t < e.__k.length; t++)if (null != (n = e.__k[t]) && null != n.__e) return n.__e; return "function" == typeof e.type ? v(e) : null } function g(e) { var t, n; if (null != (e = e.__) && null != e.__c) { for (e.__e = e.__c.base = null, t = 0; t < e.__k.length; t++)if (null != (n = e.__k[t]) && null != n.__e) { e.__e = e.__c.base = n.__e; break } return g(e) } } function _(e) { (!e.__d && (e.__d = !0) && r.push(e) && !w.__r++ || a !== o.debounceRendering) && ((a = o.debounceRendering) || i)(w) } function w() { for (var e; w.__r = r.length;)e = r.sort((function (e, t) { return e.__v.__b - t.__v.__b })), r = [], e.some((function (e) { var t, n, o, r, i, a, l; e.__d && (a = (i = (t = e).__v).__e, (l = t.__P) && (n = [], (o = d({}, i)).__v = o, r = A(l, i, o, t.__n, void 0 !== l.ownerSVGElement, null, n, null == a ? v(i) : a), R(n, i), r != a && g(i))) })) } function k(e, t, n, o, r, i, a, l, s, c) { var f, d, m, x, g, _, w, k = o && o.__k || p, C = k.length; for (s == u && (s = null != a ? a[0] : C ? v(o, 0) : null), n.__k = [], f = 0; f < t.length; f++)if (null != (x = n.__k[f] = null == (x = t[f]) || "boolean" == typeof x ? null : "string" == typeof x || "number" == typeof x ? b(null, x, null, null, x) : Array.isArray(x) ? b(y, { children: x }, null, null, null) : null != x.__e || null != x.__c ? b(x.type, x.props, x.key, null, x.__v) : x)) { if (x.__ = n, x.__b = n.__b + 1, null === (m = k[f]) || m && x.key == m.key && x.type === m.type) k[f] = void 0; else for (d = 0; d < C; d++){ if ((m = k[d]) && x.key == m.key && x.type === m.type) { k[d] = void 0; break } m = null } g = A(e, x, m = m || u, r, i, a, l, s, c), (d = x.ref) && m.ref != d && (w || (w = []), m.ref && w.push(m.ref, null, x), w.push(d, x.__c || g, x)), null != g ? (null == _ && (_ = g), s = O(e, x, m, k, a, g, s), "option" == n.type ? e.value = "" : "function" == typeof n.type && (n.__d = s)) : s && m.__e == s && s.parentNode != e && (s = v(m)) } if (n.__e = _, null != a && "function" != typeof n.type) for (f = a.length; f--;)null != a[f] && h(a[f]); for (f = C; f--;)null != k[f] && D(k[f], k[f]); if (w) for (f = 0; f < w.length; f++)I(w[f], w[++f], w[++f]) } function O(e, t, n, o, r, i, a) { var l, s, c; if (void 0 !== t.__d) l = t.__d, t.__d = void 0; else if (r == n || i != a || null == i.parentNode) e: if (null == a || a.parentNode !== e) e.appendChild(i), l = null; else { for (s = a, c = 0; (s = s.nextSibling) && c < o.length; c += 2)if (s == i) break e; e.insertBefore(i, a), l = a } return void 0 !== l ? l : i.nextSibling } function C(e, t, n) { "-" === t[0] ? e.setProperty(t, n) : e[t] = "number" == typeof n && !1 === f.test(t) ? n + "px" : null == n ? "" : n } function j(e, t, n, o, r) { var i, a, l, s, c; if (r ? "className" === t && (t = "class") : "class" === t && (t = "className"), "style" === t) if (i = e.style, "string" == typeof n) i.cssText = n; else { if ("string" == typeof o && (i.cssText = "", o = null), o) for (s in o) n && s in n || C(i, s, ""); if (n) for (c in n) o && n[c] === o[c] || C(i, c, n[c]) } else "o" === t[0] && "n" === t[1] ? (a = t !== (t = t.replace(/Capture$/, "")), l = t.toLowerCase(), t = (l in e ? l : t).slice(2), n ? (o || e.addEventListener(t, S, a), (e.l || (e.l = {}))[t] = n) : e.removeEventListener(t, S, a)) : "list" !== t && "tagName" !== t && "form" !== t && "type" !== t && "size" !== t && !r && t in e ? e[t] = null == n ? "" : n : "function" != typeof n && "dangerouslySetInnerHTML" !== t && (t !== (t = t.replace(/^xlink:?/, "")) ? null == n || !1 === n ? e.removeAttributeNS("http://www.w3.org/1999/xlink", t.toLowerCase()) : e.setAttributeNS("http://www.w3.org/1999/xlink", t.toLowerCase(), n) : null == n || !1 === n && !/^ar/.test(t) ? e.removeAttribute(t) : e.setAttribute(t, n)) } function S(e) { this.l[e.type](o.event ? o.event(e) : e) } function E(e, t, n) { var o, r; for (o = 0; o < e.__k.length; o++)(r = e.__k[o]) && (r.__ = e, r.__e && ("function" == typeof r.type && r.__k.length > 1 && E(r, t, n), t = O(n, r, r, e.__k, null, r.__e, t), "function" == typeof e.type && (e.__d = t))) } function A(e, t, n, r, i, a, l, s, c) { var u, p, f, h, m, b, v, g, _, w, O, C = t.type; if (void 0 !== t.constructor) return null; (u = o.__b) && u(t); try { e: if ("function" == typeof C) { if (g = t.props, _ = (u = C.contextType) && r[u.__c], w = u ? _ ? _.props.value : u.__ : r, n.__c ? v = (p = t.__c = n.__c).__ = p.__E : ("prototype" in C && C.prototype.render ? t.__c = p = new C(g, w) : (t.__c = p = new x(g, w), p.constructor = C, p.render = M), _ && _.sub(p), p.props = g, p.state || (p.state = {}), p.context = w, p.__n = r, f = p.__d = !0, p.__h = []), null == p.__s && (p.__s = p.state), null != C.getDerivedStateFromProps && (p.__s == p.state && (p.__s = d({}, p.__s)), d(p.__s, C.getDerivedStateFromProps(g, p.__s))), h = p.props, m = p.state, f) null == C.getDerivedStateFromProps && null != p.componentWillMount && p.componentWillMount(), null != p.componentDidMount && p.__h.push(p.componentDidMount); else { if (null == C.getDerivedStateFromProps && g !== h && null != p.componentWillReceiveProps && p.componentWillReceiveProps(g, w), !p.__e && null != p.shouldComponentUpdate && !1 === p.shouldComponentUpdate(g, p.__s, w) || t.__v === n.__v) { p.props = g, p.state = p.__s, t.__v !== n.__v && (p.__d = !1), p.__v = t, t.__e = n.__e, t.__k = n.__k, p.__h.length && l.push(p), E(t, s, e); break e } null != p.componentWillUpdate && p.componentWillUpdate(g, p.__s, w), null != p.componentDidUpdate && p.__h.push((function () { p.componentDidUpdate(h, m, b) })) } p.context = w, p.props = g, p.state = p.__s, (u = o.__r) && u(t), p.__d = !1, p.__v = t, p.__P = e, u = p.render(p.props, p.state, p.context), p.state = p.__s, null != p.getChildContext && (r = d(d({}, r), p.getChildContext())), f || null == p.getSnapshotBeforeUpdate || (b = p.getSnapshotBeforeUpdate(h, m)), O = null != u && u.type == y && null == u.key ? u.props.children : u, k(e, Array.isArray(O) ? O : [O], t, n, r, i, a, l, s, c), p.base = t.__e, p.__h.length && l.push(p), v && (p.__E = p.__ = null), p.__e = !1 } else null == a && t.__v === n.__v ? (t.__k = n.__k, t.__e = n.__e) : t.__e = P(n.__e, t, n, r, i, a, l, c); (u = o.diffed) && u(t) } catch (e) { t.__v = null, o.__e(e, t, n) } return t.__e } function R(e, t) { o.__c && o.__c(t, e), e.some((function (t) { try { e = t.__h, t.__h = [], e.some((function (e) { e.call(t) })) } catch (e) { o.__e(e, t.__v) } })) } function P(e, t, n, o, r, i, a, l) { var s, c, f, d, h, m = n.props, b = t.props; if (r = "svg" === t.type || r, null != i) for (s = 0; s < i.length; s++)if (null != (c = i[s]) && ((null === t.type ? 3 === c.nodeType : c.localName === t.type) || e == c)) { e = c, i[s] = null; break } if (null == e) { if (null === t.type) return document.createTextNode(b); e = r ? document.createElementNS("http://www.w3.org/2000/svg", t.type) : document.createElement(t.type, b.is && { is: b.is }), i = null, l = !1 } if (null === t.type) m !== b && e.data != b && (e.data = b); else { if (null != i && (i = p.slice.call(e.childNodes)), f = (m = n.props || u).dangerouslySetInnerHTML, d = b.dangerouslySetInnerHTML, !l) { if (null != i) for (m = {}, h = 0; h < e.attributes.length; h++)m[e.attributes[h].name] = e.attributes[h].value; (d || f) && (d && f && d.__html == f.__html || (e.innerHTML = d && d.__html || "")) } (function (e, t, n, o, r) { var i; for (i in n) "children" === i || "key" === i || i in t || j(e, i, null, n[i], o); for (i in t) r && "function" != typeof t[i] || "children" === i || "key" === i || "value" === i || "checked" === i || n[i] === t[i] || j(e, i, t[i], n[i], o) })(e, b, m, r, l), d ? t.__k = [] : (s = t.props.children, k(e, Array.isArray(s) ? s : [s], t, n, o, "foreignObject" !== t.type && r, i, a, u, l)), l || ("value" in b && void 0 !== (s = b.value) && s !== e.value && j(e, "value", s, m.value, !1), "checked" in b && void 0 !== (s = b.checked) && s !== e.checked && j(e, "checked", s, m.checked, !1)) } return e } function I(e, t, n) { try { "function" == typeof e ? e(t) : e.current = t } catch (e) { o.__e(e, n) } } function D(e, t, n) { var r, i, a; if (o.unmount && o.unmount(e), (r = e.ref) && (r.current && r.current !== e.__e || I(r, null, t)), n || "function" == typeof e.type || (n = null != (i = e.__e)), e.__e = e.__d = void 0, null != (r = e.__c)) { if (r.componentWillUnmount) try { r.componentWillUnmount() } catch (e) { o.__e(e, t) } r.base = r.__P = null } if (r = e.__k) for (a = 0; a < r.length; a++)r[a] && D(r[a], t, n); null != i && h(i) } function M(e, t, n) { return this.constructor(e, n) } function T(e, t, n) { var r, i, a; o.__ && o.__(e, t), i = (r = n === l) ? null : n && n.__k || t.__k, e = m(y, null, [e]), a = [], A(t, (r ? t : n || t).__k = e, i || u, u, void 0 !== t.ownerSVGElement, n && !r ? [n] : i ? null : t.childNodes.length ? p.slice.call(t.childNodes) : null, a, n || u, r), R(a, e) } function z(e) { return (z = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e })(e) } function L(e) { return function (e) { if (Array.isArray(e)) return V(e) }(e) || function (e) { if ("undefined" != typeof Symbol && Symbol.iterator in Object(e)) return Array.from(e) }(e) || function (e, t) { if (!e) return; if ("string" == typeof e) return V(e, t); var n = Object.prototype.toString.call(e).slice(8, -1); "Object" === n && e.constructor && (n = e.constructor.name); if ("Map" === n || "Set" === n) return Array.from(e); if ("Arguments" === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return V(e, t) }(e) || function () { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.") }() } function V(e, t) { (null == t || t > e.length) && (t = e.length); for (var n = 0, o = new Array(t); n < t; n++)o[n] = e[n]; return o } function F(e, t) { for (var n = 0; n < t.length; n++){ var o = t[n]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, o.key, o) } } function U(e, t) { return (U = Object.setPrototypeOf || function (e, t) { return e.__proto__ = t, e })(e, t) } function N(e) { var t = function () { if ("undefined" == typeof Reflect || !Reflect.construct) return !1; if (Reflect.construct.sham) return !1; if ("function" == typeof Proxy) return !0; try { return Date.prototype.toString.call(Reflect.construct(Date, [], (function () { }))), !0 } catch (e) { return !1 } }(); return function () { var n, o = K(e); if (t) { var r = K(this).constructor; n = Reflect.construct(o, arguments, r) } else n = o.apply(this, arguments); return B(this, n) } } function B(e, t) { return !t || "object" !== z(t) && "function" != typeof t ? function (e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e }(e) : t } function K(e) { return (K = Object.setPrototypeOf ? Object.getPrototypeOf : function (e) { return e.__proto__ || Object.getPrototypeOf(e) })(e) } o = { __e: function (e, t) { for (var n, o; t = t.__;)if ((n = t.__c) && !n.__) try { if (n.constructor && null != n.constructor.getDerivedStateFromError && (o = !0, n.setState(n.constructor.getDerivedStateFromError(e))), null != n.componentDidCatch && (o = !0, n.componentDidCatch(e)), o) return _(n.__E = n) } catch (t) { e = t } throw e } }, x.prototype.setState = function (e, t) { var n; n = this.__s !== this.state ? this.__s : this.__s = d({}, this.state), "function" == typeof e && (e = e(n, this.props)), e && d(n, e), null != e && this.__v && (t && this.__h.push(t), _(this)) }, x.prototype.forceUpdate = function (e) { this.__v && (this.__e = !0, e && this.__h.push(e), _(this)) }, x.prototype.render = y, r = [], i = "function" == typeof Promise ? Promise.prototype.then.bind(Promise.resolve()) : setTimeout, w.__r = 0, l = u; var H = function (e) { !function (e, t) { if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function"); e.prototype = Object.create(t && t.prototype, { constructor: { value: e, writable: !0, configurable: !0 } }), t && U(e, t) }(i, e); var t, n, o, r = N(i); function i(e) { return function (e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") }(this, i), r.call(this, e) } return t = i, (n = [{ key: "iconClick", value: function (e, t, n, o) { this.props.ck(e, t, n, !0), o.stopPropagation() } }, { key: "scrollFunc", value: function (e) { if (0 == e.wheelDeltaX) { for (var t = this.labelRef.getElementsByClassName("xm-label-block"), n = 10, o = 0; o < t.length; o++)n += t[o].getBoundingClientRect().width + 5; var r = this.labelRef.getBoundingClientRect().width, i = n > r ? n - r : r, a = this.labelRef.scrollLeft + e.deltaY; a < 0 && (a = 0), a > i && (a = i), this.labelRef.scrollLeft = a } } }, { key: "blur", value: function () { var e = this.base.querySelector(".label-search-input"); e && e.blur() } }, { key: "labelDrag", value: function (e, t) { for (var n = t.type, o = t.target; ;){ if (!o || "I" === o.tagName) return; if ("DIV" === o.tagName && "fixed" !== o.style.position) break; o = o.parentNode } if (console.log(t), "mousedown" === n) { var r = o.cloneNode(!0), i = t.pageX, a = t.pageY, l = t.offsetX, s = t.offsetY; console.log(i, a, l, s), r.style.position = "fixed", r.style.left = i - l + "px", r.style.top = a - s + "px", o.appendChild(r), console.log(r), r.onmousemove = function (e) { r.style.left = e.pageX - l + "px", r.style.top = e.pageY - s + "px" }, r.mouseup = function () { r.parentNode.removeChild(r), r.onmousemove = null, r.mouseup = null, r.mouseleave = null }, r.mouseleave = function () { console.log("mouseleave") } } else if ("mouseup" === n) for (var c = o.childNodes, u = 0; u < c.length; u++){ var p = c[u]; if ("DIV" === p.tagName) { o.removeChild(p), p.onmousemove = null; break } } t.stopPropagation() } }, { key: "componentDidMount", value: function () { this.labelRef.addEventListener && this.labelRef.addEventListener("DOMMouseScroll", this.scrollFunc.bind(this), !1), this.labelRef.attachEvent && this.labelRef.attachEvent("onmousewheel", this.scrollFunc.bind(this)), this.labelRef.onmousewheel = this.scrollFunc.bind(this) } }, { key: "render", value: function (e) { var t = this, n = e.data, o = e.prop, r = e.theme, i = e.model, a = e.sels, l = e.autoRow, s = e.tree, u = o.name, p = o.disabled, f = i.label, d = f.type, h = f[d], b = a; s.show && s.strict && s.simple && (b = [], Object(c.j)(n, a, b, o)); var y = "", x = !0, v = b.map((function (e) { return e[u] })).join(","); if ("text" === d) y = b.map((function (e) { return "".concat(h.left).concat(e[u]).concat(h.right) })).join(h.separator); else if ("block" === d) { x = !1; var g = L(b), _ = { backgroundColor: r.color }, w = h.showCount <= 0 ? g.length : h.showCount; y = g.splice(0, w).map((function (e) { var n = { width: h.showIcon ? "calc(100% - 20px)" : "100%" }; return m("div", { class: ["xm-label-block", e[p] ? "disabled" : ""].join(" "), style: _ }, h.template && Object(c.e)(h.template) ? m("span", { style: n, dangerouslySetInnerHTML: { __html: h.template(e, g) } }) : m("span", { style: n }, e[u]), h.showIcon && m("i", { class: "xm-iconfont xm-icon-close", onClick: t.iconClick.bind(t, e, !0, e[p]) })) })), g.length && y.push(m("div", { class: "xm-label-block", style: _ }, "+ ", g.length)) } else if ("search" == d) { x = !1; var k = ""; b.length && (k = b[0][u]), y = m("input", { class: "label-search-input", type: "text", placeholder: e.searchTips, style: { width: "100%", border: "none" }, value: k, onInput: function (e) { t.props.onReset(e, "labelSearch") }, onCompositionstart: function (e) { t.props.onReset(e, "labelSearch") }, compositionupdate: function (e) { t.props.onReset(e, "labelSearch") }, compositionend: function (e) { t.props.onReset(e, "labelSearch") }, onClick: function (e) { e.stopPropagation() } }) } else y = b.length && h && h.template ? h.template(n, b) : b.map((function (e) { return e[u] })).join(","); return m("div", { class: ["xm-label", l ? "auto-row" : "single-row"].join(" ") }, m("div", { class: "scroll", ref: function (e) { return t.labelRef = e } }, x ? m("div", { class: "label-content", dangerouslySetInnerHTML: { __html: y } }) : m("div", { class: "label-content", title: v }, y))) } }]) && F(t.prototype, n), o && F(t, o), i }(x); function q(e) { return (q = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e })(e) } function Y(e, t) { var n = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); t && (o = o.filter((function (t) { return Object.getOwnPropertyDescriptor(e, t).enumerable }))), n.push.apply(n, o) } return n } function Z(e) { for (var t = 1; t < arguments.length; t++){ var n = null != arguments[t] ? arguments[t] : {}; t % 2 ? Y(Object(n), !0).forEach((function (t) { Q(e, t, n[t]) })) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : Y(Object(n)).forEach((function (t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)) })) } return e } function Q(e, t, n) { return t in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e } function J(e) { return function (e) { if (Array.isArray(e)) return W(e) }(e) || function (e) { if ("undefined" != typeof Symbol && Symbol.iterator in Object(e)) return Array.from(e) }(e) || function (e, t) { if (!e) return; if ("string" == typeof e) return W(e, t); var n = Object.prototype.toString.call(e).slice(8, -1); "Object" === n && e.constructor && (n = e.constructor.name); if ("Map" === n || "Set" === n) return Array.from(e); if ("Arguments" === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return W(e, t) }(e) || function () { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.") }() } function W(e, t) { (null == t || t > e.length) && (t = e.length); for (var n = 0, o = new Array(t); n < t; n++)o[n] = e[n]; return o } function G(e, t) { for (var n = 0; n < t.length; n++){ var o = t[n]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, o.key, o) } } function X(e, t) { return (X = Object.setPrototypeOf || function (e, t) { return e.__proto__ = t, e })(e, t) } function $(e) { var t = function () { if ("undefined" == typeof Reflect || !Reflect.construct) return !1; if (Reflect.construct.sham) return !1; if ("function" == typeof Proxy) return !0; try { return Date.prototype.toString.call(Reflect.construct(Date, [], (function () { }))), !0 } catch (e) { return !1 } }(); return function () { var n, o = te(e); if (t) { var r = te(this).constructor; n = Reflect.construct(o, arguments, r) } else n = o.apply(this, arguments); return ee(this, n) } } function ee(e, t) { return !t || "object" !== q(t) && "function" != typeof t ? function (e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e }(e) : t } function te(e) { return (te = Object.setPrototypeOf ? Object.getPrototypeOf : function (e) { return e.__proto__ || Object.getPrototypeOf(e) })(e) } var ne = {}, oe = function (e) { !function (e, t) { if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function"); e.prototype = Object.create(t && t.prototype, { constructor: { value: e, writable: !0, configurable: !0 } }), t && X(e, t) }(i, e); var t, n, o, r = $(i); function i(e) { var t; return function (e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") }(this, i), (t = r.call(this, e)).setState({ filterValue: "", remote: !0, loading: !1, pageIndex: 1, totalSize: 0, val: ne }), t.searchCid = 0, t.inputOver = !0, t.__value = "", t.tempData = [], t.size = 0, t } return t = i, (n = [{ key: "optionClick", value: function (e, t, n, o) { this.props.ck(e, t, n), this.focus(), this.blockClick(o) } }, { key: "groupClick", value: function (e, t) { var n = this.props.prop, o = n.click, r = n.children, i = n.disabled, a = e[o], l = e[r].filter((function (e) { return !e[i] })); "SELECT" === a ? this.props.onReset(l, "append") : "CLEAR" === a ? this.props.onReset(l, "delete") : "AUTO" === a ? this.props.onReset(l, "auto") : Object(c.e)(a) && a(e), this.focus(), this.blockClick(t) } }, { key: "blockClick", value: function (e) { e.stopPropagation() } }, { key: "pagePrevClick", value: function () { arguments.length > 0 && void 0 !== arguments[0] || this.size; var e = this.state.pageIndex; e <= 1 || (this.changePageIndex(e - 1), this.props.pageRemote && this.postData(e - 1, !0)) } }, { key: "pageNextClick", value: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : this.size, t = this.state.pageIndex; t >= e || (this.changePageIndex(t + 1), this.props.pageRemote && this.postData(t + 1, !0)) } }, { key: "changePageIndex", value: function (e) { this.setState({ pageIndex: e }) } }, { key: "labelSearch", value: function (e) { "input" == e.type ? this.searchInput(e) : this.handleComposition(e) } }, { key: "searchInput", value: function (e) { var t = this, n = e.target.value; n !== this.__value && (this.searchCid && clearTimeout(this.searchCid), this.inputOver && (this.__value = n, this.searchCid = setTimeout((function () { t.callback = !0, t.setState({ filterValue: t.__value, remote: !0, pageIndex: 1 }) }), this.props.delay))) } }, { key: "focus", value: function () { this.searchInputRef && this.searchInputRef.focus() } }, { key: "blur", value: function () { this.searchInputRef && this.searchInputRef.blur() } }, { key: "handleComposition", value: function (e) { var t = e.type; "compositionstart" === t ? (this.inputOver = !1, this.searchCid && clearTimeout(this.searchCid)) : "compositionend" === t && (this.inputOver = !0, this.searchInput(e)) } }, { key: "postData", value: function () { var e = this, t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : this.state.pageIndex, n = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; (this.state.remote || n) && (this.callback = !1, this.setState({ loading: !0, remote: !1 }), this.blur(), this.props.remoteMethod(this.state.filterValue, (function (t) { var n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 1; setTimeout((function () { e.focus(), e.callback = !0, e.setState({ loading: !1, totalSize: n }), e.props.onReset(t, "data") }), 10) }), this.props.show, t)) } }, { key: "keydown", value: function (e, t) { var n = this, o = t.keyCode; if ("div" === e && (27 === o || 9 === o ? this.props.onReset(!1, "close") : 37 === o ? this.pagePrevClick() : 39 === o && this.pageNextClick()), this.props.enableKeyboard) { var r = this.props.prop, i = r.value, a = r.optgroup, l = r.disabled, s = this.tempData.filter((function (e) { return !e[a] && !e[l] })), c = s.length - 1; if (-1 === c) return; var u = s.findIndex((function (e) { return e[i] === n.state.val })); if (38 === o) { u <= 0 ? u = c : u > 0 && (u -= 1); var p = s[u][i]; this.setState({ val: p }), this.viewTo(p) } else if (40 === o) { -1 === u || u === c ? u = 0 : u < c && (u += 1); var f = s[u][i]; this.setState({ val: f }), this.viewTo(f) } else if (o === this.props.selectedKeyCode && this.state.val != ne) { var d = s[u]; this.optionClick(d, -1 != this.props.sels.findIndex((function (e) { return e[i] === n.state.val })), d[l], t) } } } }, { key: "viewTo", value: function (e) { if (null != this.base) { var t = this.base.querySelector('.xm-option[value="'.concat(e, '"]')); t && t.scrollIntoView(!1) } } }, { key: "componentWillReceiveProps", value: function (e) { var t = this; this.props.show != e.show && (e.show ? setTimeout((function () { "search" === e.model.label.type || (e.filterable ? t.focus() : t.base.focus()) }), 0) : (this.setState({ filterValue: "", val: ne }), this.__value = "", this.searchInputRef && (this.searchInputRef.value = ""), this.props.onReset("", "labelSearchBlur"))), this.props.__update != e.__update && this.setState({ remote: !0 }) } }, { key: "render", value: function (e) { var t, n = this, o = e.data, r = e.flatData, i = e.prop, a = e.template, l = e.theme, s = e.radio, u = e.sels, p = e.empty, f = e.filterable, d = e.filterMethod, h = e.remoteSearch, b = (e.remoteMethod, e.delay, e.searchTips), y = e.create, x = e.pageRemote, v = e.max, g = e.enableKeyboard, _ = e.enableHoverFirst, w = i.name, k = i.value, O = i.disabled, C = i.children, j = i.optgroup, S = Object(c.b)([], r); if ((x || f && h) && this.postData(), f && !h && !x) { S = S.filter((function (e, t) { return e[j] ? (delete e.__del, !0) : d(n.state.filterValue, e, t, i) })); for (var E = 0; E < S.length - 1; E++){ var A = S[E], R = S[E + 1]; A[j] && R[j] && (S[E].__del = !0) } S.length && S[S.length - 1][j] && (S[S.length - 1].__del = !0), S = S.filter((function (e) { return !e.__del })), t = this.state.filterValue && Object(c.e)(y) } var P = m("div", { class: f && "search" != e.model.label.type ? "xm-search" : "xm-search dis" }, m("i", { class: "xm-iconfont xm-icon-sousuo" }), m("input", { class: "xm-input xm-search-input", placeholder: b })), I = {}; S.filter((function (e) { return e[j] })).forEach((function (e, t) { I[t] = e, e[C].forEach((function (e) { return e.__group__index = t })) })), S = S.filter((function (e) { return !e[j] })); var D = ""; if (e.paging) { var M = x ? this.state.totalSize : Math.floor((S.length - 1) / e.pageSize) + 1; M <= 0 && (M = 1); var T = this.state.pageIndex; if (T > M && (T = M), M > 0 && T <= 0 && (T = 1), !x) { var z = (T - 1) * e.pageSize, L = z + e.pageSize; S = S.slice(z, L) } var V = { cursor: "no-drop", color: "#d2d2d2" }, F = {}, U = {}; T <= 1 && (F = V), T == M && (U = V), this.state.pageIndex !== T && this.changePageIndex(T), this.size = M, D = m("div", { class: "xm-paging" }, m("span", { style: F, onClick: this.pagePrevClick.bind(this, M) }, e.languageProp.paging.prev), m("span", null, this.state.pageIndex, " / ", M), m("span", { style: U, onClick: this.pageNextClick.bind(this, M) }, e.languageProp.paging.next)) } else e.showCount > 0 && (S = S.slice(0, e.showCount)); var N, B, K = [], H = { __tmp: !0 }; H[j] = !0, S.forEach((function (e) { var t = I[e.__group__index]; delete e.__group__index, N && !t && (t = H), t != N && (N = t, t && K.push(N)), K.push(e) })), S = K, t && null != (t = y(this.state.filterValue, Object(c.b)([], S))) && (B = S).splice.apply(B, [0, 0].concat(J((Object(c.d)(t) ? t : [t]).map((function (e) { return Z(Z({}, e), {}, { __node: {} }) }))))); var q = Object(c.b)([], S); this.tempData = q; var Y = m("div", { class: "xm-toolbar" }, e.toolbar.list.map((function (t) { var o, r = e.languageProp.toolbar[t]; o = "ALL" === t ? { icon: "xm-iconfont xm-icon-quanxuan", name: r, method: function (e) { var t = i.optgroup, o = i.disabled, r = e.filter((function (e) { return !e[t] })).filter((function (e) { return !e[o] })), a = u.filter((function (e) { return e[i.disabled] })), l = []; l = s ? a.length ? a : r.slice(0, 1) : v > 0 ? a.length >= v ? a : Object(c.f)(r.slice(0, v - a.length), a, i) : Object(c.f)(r, u, i), n.props.onReset(l, "sels") } } : "CLEAR" === t ? { icon: "xm-iconfont xm-icon-qingkong", name: r, method: function (e) { n.props.onReset(u.filter((function (e) { return e[i.disabled] })), "sels") } } : "REVERSE" === t ? { icon: "xm-iconfont xm-icon-fanxuan", name: r, method: function (e) { var t = i.optgroup, o = i.disabled, r = e.filter((function (e) { return !e[t] })).filter((function (e) { return !e[o] })), a = []; u.forEach((function (e) { var t = r.findIndex((function (t) { return t[k] === e[k] })); -1 == t ? a.push(e) : r.splice(t, 1) })); var l = a.filter((function (e) { return e[i.disabled] })), p = []; p = s ? l.length ? l : r.slice(0, 1) : v > 0 ? l.length >= v ? l : Object(c.f)(r.slice(0, v - l.length), l, i) : Object(c.f)(r, a, i), n.props.onReset(p, "sels") } } : t; var a = function (e) { "mouseenter" === e.type && (e.target.style.color = l.color), "mouseleave" === e.type && (e.target.style.color = "") }; return m("div", { class: "toolbar-tag", style: {}, onClick: function () { Object(c.e)(o.method) && o.method(q), n.focus() }, onMouseEnter: a, onMouseLeave: a }, e.toolbar.showIcon && m("i", { class: o.icon }), m("span", null, o.name)) })).filter((function (e) { return e }))), Q = "hidden" != e.model.icon; return (S = S.map((function (t) { return t[j] ? t.__tmp ? m("div", { class: "item--divided" }) : m("div", { class: "xm-group" }, m("div", { class: "xm-group-item", onClick: n.groupClick.bind(n, t) }, t[w])) : function (t) { var r = !!u.find((function (e) { return e[k] == t[k] })), i = r ? { color: l.color, border: "none" } : { borderColor: l.color }, c = {}; g && t[k] === n.state.val && (c.backgroundColor = l.hover), !Q && r && (c.backgroundColor = l.color, t[O] && (c.backgroundColor = "#C2C2C2")); var p, f, d = ["xm-option", t[O] ? " disabled" : "", r ? " selected" : "", Q ? "show-icon" : "hide-icon"].join(" "), h = ["xm-option-icon", (p = e.iconfont.select, f = e.iconfont.unselect, (p ? !r && f ? f + " xm-custom-icon" : p : 0) || "xm-iconfont " + (s ? "xm-icon-danx" : "xm-icon-duox"))].join(" "), b = function (e) { "mouseenter" === e.type ? t[O] || (g ? n.setState({ val: t[k] }) : e.target.style.backgroundColor = l.hover) : "mouseleave" === e.type && (t[O] || g || (e.target.style.backgroundColor = "")) }; return m("div", { class: d, style: c, value: t[k], onClick: n.optionClick.bind(n, t, r, t[O]), onMouseEnter: b, onMouseLeave: b }, Q && m("i", { class: h, style: i }), m("div", { class: "xm-option-content", dangerouslySetInnerHTML: { __html: a({ data: o, item: t, arr: u, name: t[w], value: t[k] }) } })) }(t) }))).length ? _ && this.state.val == ne && this.keydown("div", { keyCode: 40 }) : (!e.pageEmptyShow && (D = ""), S.push(m("div", { class: "xm-select-empty" }, p))), m("div", { onClick: this.blockClick, tabindex: "1", style: "outline: none;" }, m("div", null, e.toolbar.show && Y, P, m("div", { class: "scroll-body", style: { maxHeight: e.height } }, S), e.paging && D), this.state.loading && m("div", { class: "loading" }, m("span", { class: "loader" }))) } }, { key: "componentDidMount", value: function () { var e = this.base.querySelector(".xm-search-input"); e && (e.addEventListener("compositionstart", this.handleComposition.bind(this)), e.addEventListener("compositionupdate", this.handleComposition.bind(this)), e.addEventListener("compositionend", this.handleComposition.bind(this)), e.addEventListener("input", this.searchInput.bind(this)), this.searchInputRef = e), this.base.addEventListener("keydown", this.keydown.bind(this, "div")) } }, { key: "componentDidUpdate", value: function () { if (this.callback) { this.callback = !1; var e = this.props.filterDone; Object(c.e)(e) && e(this.state.filterValue, this.tempData || []) } } }]) && G(t.prototype, n), o && G(t, o), i }(x); function re(e) { return (re = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e })(e) } function ie(e, t) { for (var n = 0; n < t.length; n++){ var o = t[n]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, o.key, o) } } function ae(e, t) { return (ae = Object.setPrototypeOf || function (e, t) { return e.__proto__ = t, e })(e, t) } function le(e) { var t = function () { if ("undefined" == typeof Reflect || !Reflect.construct) return !1; if (Reflect.construct.sham) return !1; if ("function" == typeof Proxy) return !0; try { return Date.prototype.toString.call(Reflect.construct(Date, [], (function () { }))), !0 } catch (e) { return !1 } }(); return function () { var n, o = ce(e); if (t) { var r = ce(this).constructor; n = Reflect.construct(o, arguments, r) } else n = o.apply(this, arguments); return se(this, n) } } function se(e, t) { return !t || "object" !== re(t) && "function" != typeof t ? function (e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e }(e) : t } function ce(e) { return (ce = Object.setPrototypeOf ? Object.getPrototypeOf : function (e) { return e.__proto__ || Object.getPrototypeOf(e) })(e) } var ue = function (e) { !function (e, t) { if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function"); e.prototype = Object.create(t && t.prototype, { constructor: { value: e, writable: !0, configurable: !0 } }), t && ae(e, t) }(i, e); var t, n, o, r = le(i); function i(e) { return function (e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") }(this, i), r.call(this, e) } return t = i, (n = [{ key: "blockClick", value: function (e) { e.stopPropagation() } }, { key: "shouldComponentUpdate", value: function () { return !this.prepare } }, { key: "render", value: function (e) { return this.prepare = !0, m("div", { onClick: this.blockClick, class: "xm-body-custom" }, m("div", { class: "scroll-body", style: { maxHeight: e.height } }, m("div", { style: "margin: 5px 0", dangerouslySetInnerHTML: { __html: e.content } }))) } }]) && ie(t.prototype, n), o && ie(t, o), i }(x); function pe(e) { return (pe = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e })(e) } function fe(e, t) { for (var n = 0; n < t.length; n++){ var o = t[n]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, o.key, o) } } function de(e, t) { return (de = Object.setPrototypeOf || function (e, t) { return e.__proto__ = t, e })(e, t) } function he(e) { var t = function () { if ("undefined" == typeof Reflect || !Reflect.construct) return !1; if (Reflect.construct.sham) return !1; if ("function" == typeof Proxy) return !0; try { return Date.prototype.toString.call(Reflect.construct(Date, [], (function () { }))), !0 } catch (e) { return !1 } }(); return function () { var n, o = be(e); if (t) { var r = be(this).constructor; n = Reflect.construct(o, arguments, r) } else n = o.apply(this, arguments); return me(this, n) } } function me(e, t) { return !t || "object" !== pe(t) && "function" != typeof t ? function (e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e }(e) : t } function be(e) { return (be = Object.setPrototypeOf ? Object.getPrototypeOf : function (e) { return e.__proto__ || Object.getPrototypeOf(e) })(e) } var ye = {}, xe = function (e) { !function (e, t) { if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function"); e.prototype = Object.create(t && t.prototype, { constructor: { value: e, writable: !0, configurable: !0 } }), t && de(e, t) }(i, e); var t, n, o, r = he(i); function i(e) { var t; return function (e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") }(this, i), (t = r.call(this, e)).state = { expandedKeys: [], filterValue: "", remote: !0, loading: !1, val: ye }, t.searchCid = 0, t.inputOver = !0, t.__value = "", t.tempData = [], t.__skipAutoExpand = "", t } return t = i, (n = [{ key: "init", value: function (e) { var t = e.tree, n = e.dataObj, o = e.flatData, r = e.prop, i = r.value, a = r.optgroup, l = []; !0 === t.expandedKeys ? l = o.filter((function (e) { return !0 === e[a] })).map((function (e) { return e[i] })) : !1 === t.expandedKeys || t.expandedKeys.forEach((function (e) { l.push(e); for (var t = n[e], o = function () { var e = t[i]; -1 === l.findIndex((function (t) { return t === e })) && l.push(e), t = t.__node.parent }; t;)o() })), this.setState({ expandedKeys: l }) } }, { key: "blockClick", value: function (e) { e.stopPropagation() } }, { key: "optionClick", value: function (e, t, n, o, r) { var i = this; if ("line" === o) { if (!0 === e.__node.loading) return; var a = this.props, l = a.tree, s = a.prop, u = a.sels, p = l.clickExpand, f = l.clickCheck, d = r.target && Object(c.e)(r.target.getAttribute) && "expand" === r.target.getAttribute("type"); if (p || d) { if (!l.lazy && !e[s.optgroup]) return void this.props.ck(e, t, n); var h = e[this.props.prop.value], m = this.state.expandedKeys, b = m.findIndex((function (e) { return e === h })); -1 === b ? m.push(h) : m.splice(b, 1), this.setState({ expandedKeys: m }); var y = e[s.children]; l.lazy && y && 0 === y.length && !1 !== e.__node.loading && (e.__node.loading = !0, l.load(e, (function (t) { e.__node.loading = !1, e[s.children] = i.handlerData(t, s.children), e[s.selected] = -1 != u.findIndex((function (t) { return t[s.value] === e[s.value] })), i.props.onReset(u, "treeData") }))) } else f && (o = "checkbox") } "checkbox" === o && this.props.ck(e, t, n), this.blockClick(r) } }, { key: "handlerData", value: function (e, t) { var n = this; return e.map((function (e) { return e.__node = {}, e[t] && (e[t] = n.handlerData(e[t], t)), e })) } }, { key: "searchInput", value: function (e) { var t = this, n = e.target.value; n !== this.__value && (clearTimeout(this.searchCid), this.inputOver && (this.__value = n, this.searchCid = setTimeout((function () { t.callback = !0, t.setState({ filterValue: t.__value, remote: !0 }) }), this.props.delay))) } }, { key: "focus", value: function () { this.searchInputRef && this.searchInputRef.focus() } }, { key: "blur", value: function () { this.searchInputRef && this.searchInputRef.blur() } }, { key: "handleComposition", value: function (e) { var t = e.type; "compositionstart" === t ? (this.inputOver = !1, clearTimeout(this.searchCid)) : "compositionend" === t && (this.inputOver = !0, this.searchInput(e)) } }, { key: "filterData", value: function (e, t, n) { var o = this, r = this.props, i = r.prop, a = r.filterMethod, l = r.tree, s = i.children, c = i.optgroup, u = (i.name, i.value); return e.forEach((function (e, r) { var p, f = !!t && !a(t, e, r, i); if (l.strict ? p = !1 : f = p = !1 !== n && f, e[c]) { var d = o.filterData(e[s], t, p), h = !!t && 0 === d.filter((function (e) { return !e.__node.hidn })).length; if (!(f = (l.strict || p) && h) && o.__skipAutoExpand != t) { var m = o.state.expandedKeys; t && -1 === m.findIndex((function (t) { return t === e[u] })) && (m.push(e[u]), o.setState({ expandedKeys: m })), o.__skipAutoExpand = t } } e.__node.hidn = f })), e } }, { key: "postData", value: function () { var e = this; this.state.remote && (this.callback = !1, this.setState({ loading: !0, remote: !1 }), this.blur(), this.props.remoteMethod(this.state.filterValue, (function (t, n) { e.focus(), e.callback = !0, e.setState({ loading: !1, totalSize: n }), e.props.onReset(t, "data") }), this.props.show, 1)) } }, { key: "componentWillReceiveProps", value: function (e) { var t = this; this.props.show != e.show && (e.show ? setTimeout((function () { return t.focus() }), 0) : (this.setState({ filterValue: "", val: ye }), this.__value = "", this.__skipAutoExpand = "", this.searchInputRef && (this.searchInputRef.value = ""))) } }, { key: "componentWillMount", value: function () { this.init(this.props) } }, { key: "render", value: function (e, t) { var n = this, o = (t.expandedKeys, e.prop), r = e.empty, i = e.sels, a = e.theme, l = e.radio, s = e.template, u = e.data, p = e.tree, f = e.filterable, d = e.remoteSearch, h = e.searchTips, b = e.iconfont, y = e.enableKeyboard, x = o.name, v = o.value, g = o.disabled, _ = o.children, w = o.optgroup, k = "hidden" != e.model.icon, O = function (e, t, o) { var r = !!i.find((function (t) { return t[v] == e[v] })), c = e[g], f = !0 === e.__node.half; p.strict && (r = r || f || e.__node.selected, c = c || e.__node.disabled); var d = r ? { color: a.color, border: "none" } : { borderColor: a.color }, h = { paddingLeft: t + "px" }; y && e[v] === n.state.val && (h.backgroundColor = a.hover), !k && r && (h.backgroundColor = a.color, c && (h.backgroundColor = "#C2C2C2")); var w = ["xm-option", c ? " disabled" : "", r ? " selected" : "", k ? "show-icon" : "hide-icon"].join(" "), O = 0 !== o && "hidden" === b.parent ? "xm-option-icon-hidden" : ["xm-option-icon", (f ? b.half ? b.half + " xm-custom-icon" : 0 : 0 !== o && b.parent ? b.parent + " xm-custom-icon" : r ? b.select ? b.select : 0 : b.unselect ? b.unselect + " xm-custom-icon" : 0) || "xm-iconfont " + (l ? "xm-icon-danx" : p.strict && f ? "xm-icon-banxuan" : "xm-icon-duox")].join(" "), C = ["xm-tree-icon", o ? "expand" : "", e[_] && (e[_].length > 0 || p.lazy && !1 !== e.__node.loading) ? "xm-visible" : "xm-hidden"].join(" "), j = []; p.showFolderIcon && (j.push(m("i", { class: C, type: "expand" })), p.showLine && (o && j.push(m("i", { class: "left-line", style: { left: t - p.indent + 3 + "px" } })), j.push(m("i", { class: "top-line", style: { left: t - p.indent + 3 + "px", width: p.indent + (0 === o ? 10 : -2) + "px" } })))); var S = function (t) { "mouseenter" === t.type ? e[g] || (y ? n.setState({ val: e[v] }) : t.target.style.backgroundColor = a.hover) : "mouseleave" === t.type && (e[g] || y || (t.target.style.backgroundColor = "")) }; return m("div", { class: w, style: h, value: e[v], onClick: n.optionClick.bind(n, e, r, e[g], "line"), onMouseEnter: S, onMouseLeave: S }, j, e.__node.loading && m("span", { class: "loader" }), k && m("i", { class: O, style: d, onClick: n.optionClick.bind(n, e, r, e[g], "checkbox") }), m("div", { class: "xm-option-content", dangerouslySetInnerHTML: { __html: s({ data: u, item: e, arr: i, name: e[x], value: e[v] }) } })) }; f && (d ? this.postData() : this.filterData(u, this.state.filterValue)); var C = Object(c.b)([], u), j = Object(c.b)([], i); this.tempData = C; var S = u.map((function (e) { return function e(t, o) { if (!t.__node.hidn) { var r = t[_]; if (o += p.indent, r) { var i = -1 !== n.state.expandedKeys.findIndex((function (e) { return t[v] === e })); return 0 === r.length && (i = !1), m("div", { class: "xm-tree" }, p.showFolderIcon && p.showLine && i && r.length > 0 && m("i", { class: "left-line left-line-group", style: { left: o + 3 + "px" } }), O(t, o, 0 === r.length && (!p.lazy || p.lazy && !1 === t.__node.loading) ? 0 : i), i && m("div", { class: "xm-tree-box" }, r.map((function (t) { return e(t, o) })))) } return O(t, o, 0) } }(e, 10 - p.indent) })).filter((function (e) { return e })); function E(e, t) { t.forEach((function (t) { t[w] ? (p.strict || "hidden" === b.parent || e.push(t), E(e, t[_])) : e.push(t) })) } var A = m("div", { class: "xm-toolbar" }, e.toolbar.list.map((function (t) { var r, s = e.languageProp.toolbar[t]; r = "ALL" === t ? { icon: "xm-iconfont xm-icon-quanxuan", name: s, method: function (e) { var t = []; E(t, e), t = t.filter((function (e) { return !e[g] && !e.__node.hidn })), n.props.onReset(l ? t.slice(0, 1) : Object(c.f)(t, i, o), "treeData") } } : "CLEAR" === t ? { icon: "xm-iconfont xm-icon-qingkong", name: s, method: function (e) { n.props.onReset(i.filter((function (e) { return e[o.disabled] })), "treeData") } } : "REVERSE" === t ? { icon: "xm-iconfont xm-icon-fanxuan", name: s, method: function (e) { var t = []; E(t, e), t = t.filter((function (e) { return !e[g] && !e.__node.hidn })); var r = []; i.forEach((function (e) { var n = t.findIndex((function (t) { return t[v] === e[v] })); -1 == n ? r.push(e) : t.splice(n, 1) })), n.props.onReset(l ? r.slice(0, 1) : Object(c.f)(t, r, o), "treeData") } } : t; var u = function (e) { "mouseenter" === e.type && (e.target.style.color = a.color), "mouseleave" === e.type && (e.target.style.color = "") }; return m("div", { class: "toolbar-tag", onClick: function () { Object(c.e)(r.method) && r.method(C, j) }, onMouseEnter: u, onMouseLeave: u }, e.toolbar.showIcon && m("i", { class: r.icon }), m("span", null, r.name)) })).filter((function (e) { return e }))), R = m("div", { class: f ? "xm-search" : "xm-search dis" }, m("i", { class: "xm-iconfont xm-icon-sousuo" }), m("input", { class: "xm-input xm-search-input", placeholder: h })); return S.length || S.push(m("div", { class: "xm-select-empty" }, r)), m("div", { onClick: this.blockClick, class: "xm-body-tree" }, e.toolbar.show && A, R, m("div", { class: "scroll-body", style: { maxHeight: e.height } }, S), this.state.loading && m("div", { class: "loading" }, m("span", { class: "loader" }))) } }, { key: "componentDidMount", value: function () { var e = this.base.querySelector(".xm-search-input"); e && (e.addEventListener("compositionstart", this.handleComposition.bind(this)), e.addEventListener("compositionupdate", this.handleComposition.bind(this)), e.addEventListener("compositionend", this.handleComposition.bind(this)), e.addEventListener("input", this.searchInput.bind(this)), this.searchInputRef = e) } }, { key: "componentDidUpdate", value: function () { if (this.callback) { this.callback = !1; var e = this.props.filterDone; Object(c.e)(e) && e(this.state.filterValue, this.tempData || []) } } }]) && fe(t.prototype, n), o && fe(t, o), i }(x); function ve(e) { return (ve = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e })(e) } function ge(e, t) { for (var n = 0; n < t.length; n++){ var o = t[n]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, o.key, o) } } function _e(e, t) { return (_e = Object.setPrototypeOf || function (e, t) { return e.__proto__ = t, e })(e, t) } function we(e) { var t = function () { if ("undefined" == typeof Reflect || !Reflect.construct) return !1; if (Reflect.construct.sham) return !1; if ("function" == typeof Proxy) return !0; try { return Date.prototype.toString.call(Reflect.construct(Date, [], (function () { }))), !0 } catch (e) { return !1 } }(); return function () { var n, o = Oe(e); if (t) { var r = Oe(this).constructor; n = Reflect.construct(o, arguments, r) } else n = o.apply(this, arguments); return ke(this, n) } } function ke(e, t) { return !t || "object" !== ve(t) && "function" != typeof t ? function (e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e }(e) : t } function Oe(e) { return (Oe = Object.setPrototypeOf ? Object.getPrototypeOf : function (e) { return e.__proto__ || Object.getPrototypeOf(e) })(e) } var Ce = function (e) { !function (e, t) { if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function"); e.prototype = Object.create(t && t.prototype, { constructor: { value: e, writable: !0, configurable: !0 } }), t && _e(e, t) }(i, e); var t, n, o, r = we(i); function i(e) { var t; return function (e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") }(this, i), (t = r.call(this, e)).state = { expand: [] }, t } return t = i, (n = [{ key: "blockClick", value: function (e) { e.stopPropagation() } }, { key: "optionClick", value: function (e, t, n, o, r, i) { if ("line" === o) { if (!e.optgroup && n) return; if (!0 === e.__node.loading) return; var a = this.props, l = a.cascader, s = a.prop; if (a.sels, !l.lazy && !e[s.optgroup]) return void this.props.ck(e, t, n); var c = this.state.expand.slice(0, r + 1); c[r] = e[this.props.prop.value], this.setState({ expand: c }) } else "checkbox" === o && this.props.ck(e, t, n); this.blockClick(i) } }, { key: "componentWillReceiveProps", value: function (e) { } }, { key: "componentWillMount", value: function () { } }, { key: "render", value: function (e, t) { var n = this, o = e.prop, r = e.empty, i = e.sels, a = e.theme, l = e.radio, s = e.template, c = e.data, u = e.cascader, p = o.name, f = o.value, d = o.disabled, h = o.children, b = o.optgroup, y = "hidden" != e.model.icon, x = [], v = function t(o, r, v) { var g = o[h]; r = r + u.indent + 6; var _ = g && n.state.expand[v] === o[f]; return _ && x.push(m("div", { class: "xm-cascader-box", index: v % 4, style: { left: r + "px", width: u.indent + "px" } }, m("div", { class: "xm-cascader-scroll scroll-body" }, g.map((function (e) { return t(e, r, v + 1) }))))), function (t, o, r, x) { var v = !!i.find((function (e) { return e[f] == t[f] })), g = t[d], _ = !0 === t.__node.half; u.strict && (v = v || _ || t.__node.selected, g = g || t.__node.disabled); var w = v ? { color: a.color, border: "none" } : { borderColor: a.color }, k = t[h] && t[h].length > 0, O = { backgroundColor: "transparent" }, C = ["xm-option", g ? " disabled" : "", v ? " selected" : "", y ? "show-icon" : "hide-icon"].join(" "), j = k && "hidden" === e.iconfont.parent ? "xm-option-icon-hidden" : ["xm-option-icon", (_ ? e.iconfont.half ? e.iconfont.half + " xm-custom-icon" : 0 : k && e.iconfont.parent ? e.iconfont.parent + " xm-custom-icon" : v ? e.iconfont.select ? e.iconfont.select : 0 : e.iconfont.unselect ? e.iconfont.unselect + " xm-custom-icon" : 0) || "xm-iconfont " + (l ? "xm-icon-danx" : u.strict && _ ? "xm-icon-banxuan" : "xm-icon-duox")].join(" "); t[f] === n.state.val && (O.backgroundColor = a.hover), !y && v && (O.backgroundColor = a.color, g && (O.backgroundColor = "#C2C2C2")); var S = {}, E = {}; x && (S.color = a.color, S.fontWeight = 700, E.color = a.color); var A = function (e) { "mouseenter" === e.type ? t[d] || n.setState({ val: t[f] }) : "mouseleave" === e.type && n.setState({ val: "" }) }; return m("div", { class: C, style: O, value: t[f], onClick: n.optionClick.bind(n, t, v, g, "line", r), onMouseEnter: A, onMouseLeave: A }, y && m("i", { class: j, style: w, onClick: n.optionClick.bind(n, t, v, g, "checkbox", r) }), m("div", { class: "xm-option-content", style: S, dangerouslySetInnerHTML: { __html: s({ data: c, item: t, arr: i, name: t[p], value: t[f] }) } }), t[b] && m("div", { class: "xm-right-arrow", style: E })) }(o, 0, v, _) }, g = c.map((function (e) { return v(e, 2, 0) })).concat(x).filter((function (e) { return e })); return g.length || g.push(m("div", { class: "xm-select-empty" }, r)), m("div", { onClick: this.blockClick, class: "xm-body-cascader scroll-body", style: { width: u.indent + "px", maxHeight: e.height } }, g) } }, { key: "componentDidMount", value: function () { this.props.onReset("cascader", "class") } }]) && ge(t.prototype, n), o && ge(t, o), i }(x); function je() { return (je = Object.assign || function (e) { for (var t = 1; t < arguments.length; t++){ var n = arguments[t]; for (var o in n) Object.prototype.hasOwnProperty.call(n, o) && (e[o] = n[o]) } return e }).apply(this, arguments) } function Se(e) { return function (e) { if (Array.isArray(e)) return Ee(e) }(e) || function (e) { if ("undefined" != typeof Symbol && Symbol.iterator in Object(e)) return Array.from(e) }(e) || function (e, t) { if (!e) return; if ("string" == typeof e) return Ee(e, t); var n = Object.prototype.toString.call(e).slice(8, -1); "Object" === n && e.constructor && (n = e.constructor.name); if ("Map" === n || "Set" === n) return Array.from(e); if ("Arguments" === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return Ee(e, t) }(e) || function () { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.") }() } function Ee(e, t) { (null == t || t > e.length) && (t = e.length); for (var n = 0, o = new Array(t); n < t; n++)o[n] = e[n]; return o } function Ae(e, t) { var n = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); t && (o = o.filter((function (t) { return Object.getOwnPropertyDescriptor(e, t).enumerable }))), n.push.apply(n, o) } return n } function Re(e) { for (var t = 1; t < arguments.length; t++){ var n = null != arguments[t] ? arguments[t] : {}; t % 2 ? Ae(Object(n), !0).forEach((function (t) { Pe(e, t, n[t]) })) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : Ae(Object(n)).forEach((function (t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)) })) } return e } function Pe(e, t, n) { return t in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e } function Ie(e) { return (Ie = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e })(e) } function De(e, t) { for (var n = 0; n < t.length; n++){ var o = t[n]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, o.key, o) } } function Me(e, t) { return (Me = Object.setPrototypeOf || function (e, t) { return e.__proto__ = t, e })(e, t) } function Te(e) { var t = function () { if ("undefined" == typeof Reflect || !Reflect.construct) return !1; if (Reflect.construct.sham) return !1; if ("function" == typeof Proxy) return !0; try { return Date.prototype.toString.call(Reflect.construct(Date, [], (function () { }))), !0 } catch (e) { return !1 } }(); return function () { var n, o = Ve(e); if (t) { var r = Ve(this).constructor; n = Reflect.construct(o, arguments, r) } else n = o.apply(this, arguments); return ze(this, n) } } function ze(e, t) { return !t || "object" !== Ie(t) && "function" != typeof t ? Le(e) : t } function Le(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e } function Ve(e) { return (Ve = Object.setPrototypeOf ? Object.getPrototypeOf : function (e) { return e.__proto__ || Object.getPrototypeOf(e) })(e) } var Fe = function (e) { !function (e, t) { if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function"); e.prototype = Object.create(t && t.prototype, { constructor: { value: e, writable: !0, configurable: !0 } }), t && Me(e, t) }(i, e); var t, n, o, r = Te(i); function i(e) { var t; return function (e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") }(this, i), t = r.call(this, e), et[e.el] = Le(t), t.state = t.initState(), t.bodyView = null, t } return t = i, (n = [{ key: "initState", value: function () { return { data: [], dataObj: {}, flatData: [], sels: [], show: !1, tmpColor: "", bodyClass: "", time: 0 } } }, { key: "init", value: function (e, t) { var n, o = e.data, r = e.prop, i = e.initValue, a = e.radio, l = e.tree, s = e.cascader; if (t) { var c = {}, u = []; this.load(o, c, u, null, 0, i ? i.map((function (e) { return "object" === Ie(e) ? e[r.value] : e })) : null), n = this.exchangeValue(i || Object.keys(c).filter((function (e) { return !0 === c[e][r.selected] })), c), a && n.length > 1 && (n = n.slice(0, 1), (l.show && l.strict || s.show && s.strict) && this.clearAndReset(o, n, !1)), this.setState({ sels: n, dataObj: c, flatData: u }) } return this.setState({ data: o }), n } }, { key: "upDate", value: function (e, t) { var n = this.state.dataObj, o = this.props, r = o.prop, i = o.tree, a = o.cascader, l = r.value, s = r.disabled, u = r.children; e.map((function (e) { return n["object" === Ie(e) ? e[l] : e] })).filter((function (e) { return e })).forEach((function (e) { if (e[s] = !t, i.show && i.strict || a.show && a.strict) { if (t) for (var n = e; n;)n[s] = !1, n = n.__node.parent; !function e(n) { n[s] = !t; var o = n[u]; o && Object(c.d)(o) && o.forEach((function (t) { return e(t) })) }(e) } })), this.setState({ dataObj: n }) } }, { key: "exchangeValue", value: function (e) { var t = this, n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : this.state.dataObj, o = this.props, r = o.prop, i = o.tree, a = o.cascader, l = (o.data, r.children), s = r.value, u = e.map((function (e) { return "object" === Ie(e) ? Re(Re({}, e), {}, { __node: {} }) : n[e] })).filter((function (e) { return e })), p = Se(u); if (i.show && i.strict || a.show && a.strict) { var f = function e(t, n) { var o = n[l]; o && Object(c.d)(o) && o.forEach((function (n) { -1 === u.findIndex((function (e) { return e[s] === n[s] })) && t.push(n), e(t, n) })) }, d = {}; d[l] = u, f(p, d), p = p.filter((function (e) { return !0 !== e[t.props.prop.optgroup] })) } return p } }, { key: "value", value: function (e, t, n, o) { var r = !(arguments.length > 4 && void 0 !== arguments[4]) || arguments[4]; !1 !== t && !0 !== t && (t = this.state.show); var i = this.props, a = i.prop, l = i.tree, s = i.cascader, c = this.exchangeValue(e); if (!this.checkMax(c, c, !0)) { if (l.show && l.strict || s.show && s.strict) { var u = this.state.data; this.clearAndReset(u, c, !1), c = this.init({ data: u, prop: a }, !0) } this.resetSelectValue(c, o || c, r, n), this.setState({ show: t }) } } }, { key: "clearAndReset", value: function (e, t, n) { var o = this, r = this.props.prop, i = r.selected, a = r.disabled, l = r.children, s = r.value; e.forEach((function (e) { e[i] = -1 != t.findIndex((function (t) { return t[s] === e[s] })) || n; var r = e[l]; if (r && Object(c.d)(r) && r.length > 0) { o.clearAndReset(r, t, e[i]); var u = r.length, p = r.filter((function (e) { return !0 === e[i] || !0 === e.__node.selected })).length; e.__node.selected = p === u, e.__node.half = p > 0 && p < u || r.filter((function (e) { return !0 === e.__node.half })).length > 0, e.__node.disabled = r.filter((function (e) { return !0 === e[a] || !0 === e.__node.disabled })).length === u } })) } }, { key: "load", value: function (e, t, n, o) { var r = this, i = arguments.length > 4 && void 0 !== arguments[4] ? arguments[4] : 0, a = arguments.length > 5 ? arguments[5] : void 0, l = this.props, s = l.prop, u = l.tree, p = l.cascader, f = s.children, d = s.optgroup, h = s.value, m = s.selected, b = s.disabled; e.forEach((function (e) { e.__node = { parent: o, level: i, loading: e.__node && e.__node.loading }, a && (delete e[m], a.find((function (t) { return t === e[h] })) && (e[m] = !0)), t[e[h]] = e, n.push(e); var l = e[f]; if (l && Object(c.d)(l)) { var s = l.length; if (s > 0) { r.load(l, t, n, e, i + 1, a), e[d] = !0, (u.show && u.strict || p.show && p.strict) && (!0 === e[m] && (delete e[m], l.forEach((function (e) { return e[m] = !0 }))), !0 === e[b] && (delete e[b], l.forEach((function (e) { return e[b] = !0 })))); var y = l.filter((function (e) { return !0 === e[m] || !0 === e.__node.selected })).length; e.__node.selected = y === s, e.__node.half = y > 0 && y < s || l.filter((function (e) { return !0 === e.__node.half })).length > 0, e.__node.disabled = l.filter((function (e) { return !0 === e[b] || !0 === e.__node.disabled })).length === s } } })) } }, { key: "resetSelectValue", value: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : [], t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : [], n = arguments.length > 2 ? arguments[2] : void 0, o = !(arguments.length > 3 && void 0 !== arguments[3]) || arguments[3], r = this.props.on; if (Object(c.e)(r) && this.prepare && o) { var i = r({ arr: e, change: t, isAdd: n }); if (Object(c.d)(i)) return this.value(i, null, !1) } this.setState({ sels: e }) } }, { key: "updateBorderColor", value: function (e) { this.setState({ tmpColor: e }) } }, { key: "treeHandler", value: function (e, t, n, o, r) { var i = this, a = this.props.prop, l = a.value, s = (a.selected, a.disabled), c = a.children, u = a.optgroup, p = t[c]; if (p.filter((function (e) { return !(e[s] || e.__node.disabled) })).forEach((function (t) { if (t[u]) i.treeHandler(e, t, n, o, r); else { var a = e.findIndex((function (e) { return e[l] == t[l] })); "del" === o ? -1 != a && (e.splice(a, 1), n.push(t)) : "half" !== o && "add" !== o || -1 == a && (e.push(t), n.push(t)) } })), r) { var f = p.length, d = p.filter((function (t) { return -1 !== e.findIndex((function (e) { return e[l] === t[l] })) || !0 === t.__node.selected })).length; t.__node.selected = d === f, t.__node.half = d > 0 && d < f } } }, { key: "checkMax", value: function (e, t, n) { var o = this.props, r = o.max, i = o.maxMethod, a = o.theme, l = Object(c.i)(r), s = (n ? t.length : (Object(c.d)(e) ? e.length : 1) + t.length) > l; if (l > 0 && s) return this.updateBorderColor(a.maxColor), i && Object(c.e)(i) && i(t, e), !0 } }, { key: "itemClick", value: function (e, t, n, o) { var r = this.props, i = (r.theme, r.prop), a = r.radio, l = r.repeat, s = r.clickClose, c = (r.max, r.maxMethod, r.tree), u = r.cascader, p = r.data, f = Se(this.state.sels), d = i.value, h = (i.selected, i.disabled, i.children), m = i.optgroup; if (!n) { if (e[m] && (c.show && c.strict || u.show && u.strict)) { e[h]; var b, y = [], x = !0; if (e.__node.selected ? (b = "del", x = !1) : e.__node.half ? (b = "half", this.treeHandler(f, e, y, b), 0 === y.length && (b = "del", x = !1)) : b = "add", "half" != b && this.treeHandler(f, e, y, b), this.checkMax(y, f)) return; f = Se(this.state.sels), y = [], this.treeHandler(f, e, y, b, !0), this.resetSelectValue(f, y, x), this.setState({ data: this.state.data }) } else if (!t || l && !o) { if (this.checkMax(e, f)) return; f = a ? [e] : [].concat(Se(f), [e]), this.clearAndReset(p, f, t), this.resetSelectValue(f, [e], !t) } else { var v = f.findIndex((function (t) { return t[d] == e[d] })); -1 != v && (f.splice(v, 1), this.resetSelectValue(f, [e], !t)) } var g = e.__node.parent; if (g) { for (; g;){ var _ = g[h], w = _.length, k = _.filter((function (e) { return -1 !== f.findIndex((function (t) { return t[d] === e[d] })) || !0 === e.__node.selected })).length; g.__node.selected = k === w, g.__node.half = k > 0 && k < w || _.filter((function (e) { return !0 === e.__node.half })).length > 0, g = g.__node.parent } this.setState({ data: this.state.data }) } s && !o && this.onClick() } } }, { key: "onClick", value: function (e) { var t = this; if ("relative" !== this.props.model.type) if (this.props.disabled) !1 !== this.state.show && this.setState({ show: !1 }); else { var n = !this.state.show; if (n) { if (this.props.show && 0 == this.props.show()) return; Object.keys(Xe).filter((function (e) { return e != t.props.el })).forEach((function (e) { return Xe[e].closed() })) } else { if (this.props.hide && 0 == this.props.hide()) return; this.bodyView.scroll && this.bodyView.scroll(0, 0) } this.setState({ show: n }), e && e.stopPropagation() } } }, { key: "onReset", value: function (e, t) { var n = this; if ("data" === t) { var o = e.filter((function (e) { return !0 === e[n.props.prop.selected] })); this.resetSelectValue(Object(c.f)(o, this.state.sels, this.props.prop), o, !0); var r = []; this.load(e, {}, r), this.setState({ data: e, flatData: r }) } else "sels" === t ? this.resetSelectValue(e, e, !0) : "append" === t ? this.append(e) : "delete" === t ? this.del(e) : "auto" === t ? this.auto(e) : "treeData" === t ? this.value(e, null, !0, !1, !1) : "close" === t ? this.onClick() : "class" === t ? this.setState({ bodyClass: e }) : "labelSearchBlur" === t ? this.labelRef.blur(e) : "labelSearch" === t && this.generalRef.labelSearch(e) } }, { key: "append", value: function (e) { var t = this.exchangeValue(e); this.value(Object(c.f)(t, this.state.sels, this.props.prop), this.props.show, !0, t) } }, { key: "del", value: function (e) { var t = this.props.prop.value, n = this.state.sels, o = this.exchangeValue(e); o.forEach((function (e) { var o = n.findIndex((function (n) { return n[t] === e[t] })); -1 != o && n.splice(o, 1) })), this.value(n, this.props.show, !0, o, !1) } }, { key: "auto", value: function (e) { var t = this, n = this.props.prop.value; e.filter((function (e) { return -1 != t.state.sels.findIndex((function (t) { return t[n] === e[n] })) })).length == e.length ? this.del(e) : this.append(e) } }, { key: "changeExpandedKeys", value: function (e) { var t = this.props, n = t.tree, o = t.prop, r = this.state, i = r.dataObj, a = r.flatData; n.show && this.treeRef.init({ dataObj: i, flatData: a, prop: o, tree: { expandedKeys: e } }) } }, { key: "calcPosition", value: function () { if (this.state.show && "fixed" === this.props.model.type) { var e = this.base.getBoundingClientRect(); return Date.now() - this.state.time > 10 && this.setState({ time: Date.now() }), { position: "fixed", left: e.x, top: e.y + e.height + 4, width: e.width } } return {} } }, { key: "componentWillReceiveProps", value: function (e) { this.init(e, e.updateData) } }, { key: "componentWillMount", value: function () { this.init(this.props, !0) } }, { key: "render", value: function (e, t) { var n = this, o = e.theme, r = e.prop, i = (e.radio, e.repeat, e.clickClose, e.on, e.max, e.maxMethod, e.content), a = e.disabled, l = e.tree, s = e.submitConversion, u = { borderColor: o.color }, p = t.data, f = t.dataObj, d = t.flatData, h = t.sels, b = t.show, y = t.tmpColor, x = t.bodyClass; a && (b = !1); var v = { style: Re(Re({}, e.style), b ? u : {}), onClick: this.onClick.bind(this), ua: Object(c.a)(), size: e.size, tabindex: 1 }; y && (v.style.borderColor = y, setTimeout((function () { v.style.borderColor = "", n.updateBorderColor("") }), 300)), r.value; var g = Re(Re({}, e), {}, { data: p, sels: h, ck: this.itemClick.bind(this), title: h.map((function (e) { return e[r.name] })).join(","), onReset: this.onReset.bind(this) }), _ = Re(Re({}, e), {}, { data: p, dataObj: f, flatData: d, sels: h, ck: this.itemClick.bind(this), show: b, onReset: this.onReset.bind(this) }), w = i ? m(ue, _) : l.show ? m(xe, je({}, _, { ref: function (e) { return n.treeRef = e } })) : e.cascader.show ? m(Ce, _) : m(oe, je({}, _, { ref: function (e) { return n.generalRef = e } })), k = this.calcPosition(); return m("xm-select", v, m("input", { class: "xm-select-default", "lay-verify": e.layVerify, "lay-verType": e.layVerType, "lay-reqText": e.layReqText, name: e.name, value: s(h, r) }), m("i", { class: b ? "xm-icon xm-icon-expand" : "xm-icon" }), 0 === h.length && m("div", { class: "xm-tips" }, e.tips), m(H, je({}, g, { ref: function (e) { return n.labelRef = e } })), m("div", { class: ["xm-body", x, e.model.type, b ? "" : "dis"].join(" "), style: k, ref: function (e) { return n.bodyView = e } }, w), a && m("div", { class: "xm-select-disabled" })) } }, { key: "componentDidMount", value: function () { var e = this; this.prepare = !0, this.base.addEventListener("keydown", (function (t) { 13 === t.keyCode && e.onClick(t) })), this.input = this.base.querySelector(".xm-select-default"); var t = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; t && new t((function (t) { t.forEach((function (t) { "attributes" == t.type && "class" === t.attributeName && -1 !== e.input.className.indexOf("layui-form-danger") && (e.input.className = "xm-select-default", e.base.style.borderColor = e.props.theme.maxColor, e.base.scrollIntoView && e.base.scrollIntoView({ behavior: "smooth" })) })) })).observe(this.input, { attributes: !0 }); for (var n = this.base; n;){ if ("FORM" === n.tagName) { var o = n.querySelector('button[type="reset"]'); o && o.addEventListener("click", (function (t) { e.init(e.props, !0) })); break } n = n.parentElement } var r = this.props.done; r && r() } }, { key: "componentDidUpdate", value: function () { var e = this.props, t = e.direction, n = e.model; if ("relative" !== n.type && "fixed" !== n.type) { var o = this.base.getBoundingClientRect(); if ("auto" === t) { this.bodyView.style.display = "block", this.bodyView.style.visibility = "hidden"; var r = this.bodyView.getBoundingClientRect().height; this.bodyView.style.display = "", this.bodyView.style.visibility = ""; var i = o.y || o.top || 0, a = document.documentElement.clientHeight - i - o.height - 20; t = a > r || i < a ? "down" : "up" } "down" == t ? (this.bodyView.style.top = o.height + 4 + "px", this.bodyView.style.bottom = "auto") : (this.bodyView.style.top = "auto", this.bodyView.style.bottom = o.height + 4 + "px") } } }]) && De(t.prototype, n), o && De(t, o), i }(x), Ue = { tips: "请选择", empty: "暂无数据", searchTips: "请选择", toolbar: { ALL: "全选", CLEAR: "清空", REVERSE: "反选", SEARCH: "搜索" }, paging: { prev: "上一页", next: "下一页" } }, Ne = { zn: Ue, en: { tips: "please selected", empty: "no data", searchTips: "please search", toolbar: { ALL: "select all", CLEAR: "clear", REVERSE: "invert select", SEARCH: "search" }, paging: { prev: "prev", next: "next" } } }; function Be(e, t) { var n = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); t && (o = o.filter((function (t) { return Object.getOwnPropertyDescriptor(e, t).enumerable }))), n.push.apply(n, o) } return n } function Ke(e) { for (var t = 1; t < arguments.length; t++){ var n = null != arguments[t] ? arguments[t] : {}; t % 2 ? Be(Object(n), !0).forEach((function (t) { He(e, t, n[t]) })) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : Be(Object(n)).forEach((function (t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)) })) } return e } function He(e, t, n) { return t in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e } function qe() { return (qe = Object.assign || function (e) { for (var t = 1; t < arguments.length; t++){ var n = arguments[t]; for (var o in n) Object.prototype.hasOwnProperty.call(n, o) && (e[o] = n[o]) } return e }).apply(this, arguments) } function Ye(e) { return (Ye = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e })(e) } function Ze(e, t) { for (var n = 0; n < t.length; n++){ var o = t[n]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, o.key, o) } } var Qe = function () { function e(t) { !function (e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") }(this, e), this.init(t) } var t, n, o; return t = e, (n = [{ key: "init", value: function (e) { this.options = function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "zn", t = Ne[e] || Ue; return { language: e, languageProp: t, data: [], content: "", name: "select", layVerify: "", layVerType: "", layReqText: "", size: "medium", disabled: !1, initValue: null, create: null, tips: t.tips, empty: t.empty, delay: 500, searchTips: t.searchTips, filterable: !1, filterMethod: function (e, t, n, o) { return !e || -1 != t[o.name].indexOf(e) }, remoteSearch: !1, remoteMethod: function (e, t) { t([]) }, direction: "auto", style: {}, height: "200px", autoRow: !1, paging: !1, pageSize: 10, pageEmptyShow: !0, pageRemote: !1, radio: !1, repeat: !1, clickClose: !1, max: 0, maxMethod: function (e, t) { }, showCount: 0, enableKeyboard: !0, enableHoverFirst: !0, selectedKeyCode: 13, toolbar: { show: !1, showIcon: !0, list: ["ALL", "CLEAR"] }, tree: { show: !1, showFolderIcon: !0, showLine: !0, indent: 20, expandedKeys: [], strict: !0, lazy: !1, load: null, simple: !1, nodeType: "__node_type", clickExpand: !0, clickCheck: !0 }, cascader: { show: !1, indent: 100, strict: !0 }, prop: { name: "name", value: "value", selected: "selected", disabled: "disabled", children: "children", optgroup: "optgroup", click: "click" }, theme: { color: "#009688", maxColor: "#e54d42", hover: "#f2f2f2" }, model: { label: { type: "block", text: { left: "", right: "", separator: ", " }, block: { showCount: 0, showIcon: !0, template: null }, count: { template: function (e, t) { return "已选中 ".concat(t.length, " 项, 共 ").concat(e.length, " 项") } } }, icon: "show", type: "absolute" }, iconfont: { select: "", unselect: "", half: "", parent: "" }, show: function () { }, hide: function () { }, template: function (e) { e.item, e.sels; var t = e.name; return e.value, t }, on: function (e) { e.arr, e.item, e.selected }, submitConversion: function (e, t) { return e.map((function (e) { return e[t.value] })).join(",") }, done: function () { } } }(e.language), this.update(e) } }, { key: "update", value: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = !!e.data; this.options = Object(c.b)(this.options, e), this.options.__render_success = !1; var n = this.options.dom; if (n) { var o = this.options.data || []; if ("function" == typeof o && (o = o(), this.options.data = o), Object(c.d)(o)) return T(m(Fe, qe({}, this.options, { __update: Date.now(), updateData: t })), n), this.options.__render_success = !0, this; Object(c.k)("data数据必须为数组类型, 不能是".concat("undefined" == typeof data ? "undefined" : Ye(data), "类型")) } else Object(c.k)("没有找到渲染对象: ".concat(e.el, ", 请检查")) } }, { key: "reset", value: function () { var e = this.options.el; return this.init($e[e]), et[e].init(this.options, !0), this } }, { key: "opened", value: function () { var e = et[this.options.el]; return !e.state.show && e.onClick(), this } }, { key: "closed", value: function () { var e = et[this.options.el]; return e.state.show && e.onClick(), this } }, { key: "getValue", value: function (e) { var t = this, n = this.options, o = n.tree, r = n.prop, i = n.data, a = et[this.options.el].state.sels, l = a; o.show && o.strict && o.simple && (l = [], Object(c.j)(i, a, l, r)); var s = Object(c.c)(l, r.children, ["__node"]); return "name" === e ? s.map((function (e) { return e[t.options.prop.name] })) : "nameStr" === e ? s.map((function (e) { return e[t.options.prop.name] })).join(",") : "value" === e ? s.map((function (e) { return e[t.options.prop.value] })) : "valueStr" === e ? s.map((function (e) { return e[t.options.prop.value] })).join(",") : s } }, { key: "setValue", value: function (e, t) { var n = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; if (Object(c.d)(e)) return et[this.options.el].value(this.options.radio ? e.slice(0, 1) : e, t, n), this; Object(c.k)("请传入数组结构...") } }, { key: "append", value: function (e) { if (Object(c.d)(e)) return et[this.options.el].append(e), this; Object(c.k)("请传入数组结构...") } }, { key: "delete", value: function (e) { if (Object(c.d)(e)) return et[this.options.el].del(e), this; Object(c.k)("请传入数组结构...") } }, { key: "warning", value: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] && arguments[1], n = e || this.options.theme.maxColor; return !0 === t ? et[this.options.el].base.style.borderColor = n : et[this.options.el].updateBorderColor(n), this } }, { key: "getTreeValue", value: function (e, t) { var n = this.options, o = n.tree, r = n.cascader, i = n.prop, a = i.value; if (!o.show && !r.show) return this.getValue(e); for (var l = et[this.options.el].state.sels, s = [], u = o.nodeType, p = function (e, t) { s.find((function (t) { return t[a] === e[a] })) || ((e = Ke({}, e))[u] = t, s.push(e)) }, f = 0; f < l.length; f++){ var d = Ke({}, l[f]); for (p(d, "leaf"); d = d.__node.parent;){ var h = d.__node, m = h.half, b = h.selected; !e && b ? p(d, "parent") : t && m && !b && p(d, "half") } } return Object(c.c)(s, i.children, ["__node"]) } }, { key: "changeExpandedKeys", value: function (e) { return et[this.options.el].changeExpandedKeys(e), this } }, { key: "enable", value: function (e) { if (Object(c.d)(e)) { if (0 !== e.length) return et[this.options.el].upDate(e, !0), this } else Object(c.k)("请传入数组结构...") } }, { key: "disable", value: function (e) { if (Object(c.d)(e)) { if (0 !== e.length) return et[this.options.el].upDate(e, !1), this } else Object(c.k)("请传入数组结构...") } }, { key: "scroll", value: function (e) { var t = this.options.dom.querySelector('.xm-option[value="'.concat(e, '"]')); return t && t.scrollIntoView(!1), this } }, { key: "calcPosition", value: function () { return et[this.options.el].calcPosition(), this } }]) && Ze(t.prototype, n), o && Ze(t, o), e }(); function Je(e, t, n) { return t in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e } function We(e) { return function (e) { if (Array.isArray(e)) return Ge(e) }(e) || function (e) { if ("undefined" != typeof Symbol && Symbol.iterator in Object(e)) return Array.from(e) }(e) || function (e, t) { if (!e) return; if ("string" == typeof e) return Ge(e, t); var n = Object.prototype.toString.call(e).slice(8, -1); "Object" === n && e.constructor && (n = e.constructor.name); if ("Map" === n || "Set" === n) return Array.from(e); if ("Arguments" === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return Ge(e, t) }(e) || function () { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.") }() } function Ge(e, t) { (null == t || t > e.length) && (t = e.length); for (var n = 0, o = new Array(t); n < t; n++)o[n] = e[n]; return o } var Xe = {}, $e = {}, et = {}; t.c = { name: s.a, version: s.b, doc: s.c, KeyCode: { Enter: 13, Space: 32 }, render: function (e) { var t = e.el; if (e.dom = Object(c.g)(t), t.nodeType) { var n = "DOM_RENDER_" + Date.now() + "_" + Math.random(); t.setAttribute(s.a, n), t = "[".concat(s.a, "='").concat(n, "']"), e.el = t } $e[t] = e; var o = new Qe(e); return o && o.options.__render_success && (Xe[t] = o), o }, get: function (e, t) { var n; switch (Object.prototype.toString.call(e)) { case "[object String]": e && (n = function (t) { return t === e }); break; case "[object RegExp]": n = function (t) { return e.test(t) }; break; case "[object Function]": n = e }var o = Object.keys(Xe), r = (n ? o.filter(n) : o).map((function (e) { return Xe[e] })).filter((function (e) { return Object(c.g)(e.options.el) })); return t ? r[0] : r }, batch: function (e, t) { var n = Array.prototype.slice.call(arguments); return n.splice(0, 2), this.get(e).map((function (e) { return e[t].apply(e, We(n)) })) }, arr2tree: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : [], t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : "pid", n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : "id", o = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : "children", r = arguments.length > 4 && void 0 !== arguments[4] ? arguments[4] : 0, i = {}; return safety(e).filter((function (e) { var a = e[n], l = e[t], s = i[a], c = i[l]; return s && (e[o] = s[o]), i[a] = e, c || (c = Je({}, o, []), i[l] = c), c.push(e), n == r })) } } } }); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layuiv2/css/layui.css b/AdminSrc/AdminHost/wwwroot/admin/layuiv2/css/layui.css new file mode 100644 index 0000000..70bae88 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layuiv2/css/layui.css @@ -0,0 +1 @@ +blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}img{display:inline-block;border:none;vertical-align:middle}li{list-style:none}table{border-collapse:collapse;border-spacing:0}h1,h2,h3,h4,h5,h6{font-weight:700}h5,h6{font-size:100%}button,input,select,textarea{font-size:100%}button,input,optgroup,option,select,textarea{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;outline:0}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}body{line-height:1.6;color:rgba(0,0,0,.85);font-size:14px;font-family:Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif}hr{height:0;line-height:0;margin:10px 0;padding:0;border:none;border-bottom:1px solid #eee;clear:both;overflow:hidden;background:0 0}a{color:#333;text-decoration:none}a cite{font-style:normal}.layui-border-box,.layui-border-box *{box-sizing:border-box}.layui-box,.layui-box *{box-sizing:content-box}.layui-clear{clear:both}.layui-clear:after{content:'\20';clear:both;display:block;height:0}.layui-clear-space{word-spacing:-5px}.layui-inline{position:relative;display:inline-block;vertical-align:middle}.layui-edge{position:relative;display:inline-block;vertical-align:middle;width:0;height:0;border-width:6px;border-style:dashed;border-color:transparent;overflow:hidden}.layui-edge-top{top:-4px;border-bottom-color:#999;border-bottom-style:solid}.layui-edge-right{border-left-color:#999;border-left-style:solid}.layui-edge-bottom{top:2px;border-top-color:#999;border-top-style:solid}.layui-edge-left{border-right-color:#999;border-right-style:solid}.layui-elip,.layui-ellip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-disabled,.layui-icon,.layui-unselect{user-select:none}.layui-disabled,.layui-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-show-v{visibility:visible!important}.layui-hide-v{visibility:hidden!important}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=293);src:url(../font/iconfont.eot?v=293#iefix) format('embedded-opentype'),url(../font/iconfont.woff2?v=293) format('woff2'),url(../font/iconfont.woff?v=293) format('woff'),url(../font/iconfont.ttf?v=293) format('truetype'),url(../font/iconfont.svg?v=293#layui-icon) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-icon-sound:before{content:"\e69d"}.layui-icon-bot:before{content:"\e7d6"}.layui-icon-leaf:before{content:"\e701"}.layui-icon-folder:before{content:"\eabe"}.layui-icon-folder-open:before{content:"\eac1"}.layui-icon-gitee:before{content:"\e69b"}.layui-icon-github:before{content:"\e6a7"}.layui-icon-disabled:before{content:"\e6cc"}.layui-icon-moon:before{content:"\e6c2"}.layui-icon-error:before{content:"\e693"}.layui-icon-success:before{content:"\e697"}.layui-icon-question:before{content:"\e699"}.layui-icon-lock:before{content:"\e69a"}.layui-icon-eye:before{content:"\e695"}.layui-icon-eye-invisible:before{content:"\e696"}.layui-icon-backspace:before{content:"\e694"}.layui-icon-tips-fill:before{content:"\eb2e"}.layui-icon-test:before{content:"\e692"}.layui-icon-clear:before{content:"\e788"}.layui-icon-heart-fill:before{content:"\e68f"}.layui-icon-light:before{content:"\e748"}.layui-icon-music:before{content:"\e690"}.layui-icon-time:before{content:"\e68d"}.layui-icon-ie:before{content:"\e7bb"}.layui-icon-firefox:before{content:"\e686"}.layui-icon-at:before{content:"\e687"}.layui-icon-bluetooth:before{content:"\e689"}.layui-icon-chrome:before{content:"\e68a"}.layui-icon-edge:before{content:"\e68b"}.layui-icon-heart:before{content:"\e68c"}.layui-icon-key:before{content:"\e683"}.layui-icon-android:before{content:"\e684"}.layui-icon-mike:before{content:"\e6dc"}.layui-icon-mute:before{content:"\e685"}.layui-icon-gift:before{content:"\e627"}.layui-icon-windows:before{content:"\e67f"}.layui-icon-ios:before{content:"\e680"}.layui-icon-logout:before{content:"\e682"}.layui-icon-wifi:before{content:"\e7e0"}.layui-icon-rss:before{content:"\e808"}.layui-icon-email:before{content:"\e618"}.layui-icon-reduce-circle:before{content:"\e616"}.layui-icon-transfer:before{content:"\e691"}.layui-icon-service:before{content:"\e626"}.layui-icon-addition:before{content:"\e624"}.layui-icon-subtraction:before{content:"\e67e"}.layui-icon-slider:before{content:"\e714"}.layui-icon-print:before{content:"\e66d"}.layui-icon-export:before{content:"\e67d"}.layui-icon-cols:before{content:"\e610"}.layui-icon-screen-full:before{content:"\e622"}.layui-icon-screen-restore:before{content:"\e758"}.layui-icon-rate-half:before{content:"\e6c9"}.layui-icon-rate-solid:before{content:"\e67a"}.layui-icon-rate:before{content:"\e67b"}.layui-icon-cellphone:before{content:"\e678"}.layui-icon-vercode:before{content:"\e679"}.layui-icon-login-weibo:before{content:"\e675"}.layui-icon-login-qq:before{content:"\e676"}.layui-icon-login-wechat:before{content:"\e677"}.layui-icon-username:before{content:"\e66f"}.layui-icon-password:before{content:"\e673"}.layui-icon-refresh-3:before{content:"\e9aa"}.layui-icon-auz:before{content:"\e672"}.layui-icon-shrink-right:before{content:"\e668"}.layui-icon-spread-left:before{content:"\e66b"}.layui-icon-snowflake:before{content:"\e6b1"}.layui-icon-tips:before{content:"\e702"}.layui-icon-note:before{content:"\e66e"}.layui-icon-senior:before{content:"\e674"}.layui-icon-refresh-1:before{content:"\e666"}.layui-icon-refresh:before{content:"\e669"}.layui-icon-flag:before{content:"\e66c"}.layui-icon-theme:before{content:"\e66a"}.layui-icon-notice:before{content:"\e667"}.layui-icon-console:before{content:"\e665"}.layui-icon-website:before{content:"\e7ae"}.layui-icon-face-surprised:before{content:"\e664"}.layui-icon-set:before{content:"\e716"}.layui-icon-template:before{content:"\e663"}.layui-icon-app:before{content:"\e653"}.layui-icon-template-1:before{content:"\e656"}.layui-icon-home:before{content:"\e68e"}.layui-icon-female:before{content:"\e661"}.layui-icon-male:before{content:"\e662"}.layui-icon-tread:before{content:"\e6c5"}.layui-icon-praise:before{content:"\e6c6"}.layui-icon-rmb:before{content:"\e65e"}.layui-icon-more:before{content:"\e65f"}.layui-icon-camera:before{content:"\e660"}.layui-icon-cart-simple:before{content:"\e698"}.layui-icon-face-cry:before{content:"\e69c"}.layui-icon-face-smile:before{content:"\e6af"}.layui-icon-survey:before{content:"\e6b2"}.layui-icon-read:before{content:"\e705"}.layui-icon-location:before{content:"\e715"}.layui-icon-dollar:before{content:"\e659"}.layui-icon-diamond:before{content:"\e735"}.layui-icon-return:before{content:"\e65c"}.layui-icon-camera-fill:before{content:"\e65d"}.layui-icon-fire:before{content:"\e756"}.layui-icon-more-vertical:before{content:"\e671"}.layui-icon-cart:before{content:"\e657"}.layui-icon-star-fill:before{content:"\e658"}.layui-icon-prev:before{content:"\e65a"}.layui-icon-next:before{content:"\e65b"}.layui-icon-upload:before{content:"\e67c"}.layui-icon-upload-drag:before{content:"\e681"}.layui-icon-user:before{content:"\e770"}.layui-icon-file-b:before{content:"\e655"}.layui-icon-component:before{content:"\e857"}.layui-icon-find-fill:before{content:"\e670"}.layui-icon-loading:before{content:"\e63d"}.layui-icon-loading-1:before{content:"\e63e"}.layui-icon-add-1:before{content:"\e654"}.layui-icon-pause:before{content:"\e651"}.layui-icon-play:before{content:"\e652"}.layui-icon-video:before{content:"\e6ed"}.layui-icon-headset:before{content:"\e6fc"}.layui-icon-voice:before{content:"\e688"}.layui-icon-speaker:before{content:"\e645"}.layui-icon-fonts-del:before{content:"\e64f"}.layui-icon-fonts-html:before{content:"\e64b"}.layui-icon-fonts-code:before{content:"\e64e"}.layui-icon-fonts-strong:before{content:"\e62b"}.layui-icon-unlink:before{content:"\e64d"}.layui-icon-picture:before{content:"\e64a"}.layui-icon-link:before{content:"\e64c"}.layui-icon-face-smile-b:before{content:"\e650"}.layui-icon-align-center:before{content:"\e647"}.layui-icon-align-right:before{content:"\e648"}.layui-icon-align-left:before{content:"\e649"}.layui-icon-fonts-u:before{content:"\e646"}.layui-icon-fonts-i:before{content:"\e644"}.layui-icon-tabs:before{content:"\e62a"}.layui-icon-circle:before{content:"\e63f"}.layui-icon-radio:before{content:"\e643"}.layui-icon-share:before{content:"\e641"}.layui-icon-edit:before{content:"\e642"}.layui-icon-delete:before{content:"\e640"}.layui-icon-engine:before{content:"\e628"}.layui-icon-chart-screen:before{content:"\e629"}.layui-icon-chart:before{content:"\e62c"}.layui-icon-table:before{content:"\e62d"}.layui-icon-tree:before{content:"\e62e"}.layui-icon-upload-circle:before{content:"\e62f"}.layui-icon-templeate-1:before{content:"\e630"}.layui-icon-util:before{content:"\e631"}.layui-icon-layouts:before{content:"\e632"}.layui-icon-prev-circle:before{content:"\e633"}.layui-icon-carousel:before{content:"\e634"}.layui-icon-code-circle:before{content:"\e635"}.layui-icon-water:before{content:"\e636"}.layui-icon-date:before{content:"\e637"}.layui-icon-layer:before{content:"\e638"}.layui-icon-fonts-clear:before{content:"\e639"}.layui-icon-dialogue:before{content:"\e63a"}.layui-icon-cellphone-fine:before{content:"\e63b"}.layui-icon-form:before{content:"\e63c"}.layui-icon-file:before{content:"\e621"}.layui-icon-triangle-r:before{content:"\e623"}.layui-icon-triangle-d:before{content:"\e625"}.layui-icon-set-sm:before{content:"\e620"}.layui-icon-add-circle:before{content:"\e61f"}.layui-icon-layim-download:before{content:"\e61e"}.layui-icon-layim-uploadfile:before{content:"\e61d"}.layui-icon-404:before{content:"\e61c"}.layui-icon-about:before{content:"\e60b"}.layui-icon-layim-theme:before{content:"\e61b"}.layui-icon-down:before{content:"\e61a"}.layui-icon-up:before{content:"\e619"}.layui-icon-circle-dot:before{content:"\e617"}.layui-icon-set-fill:before{content:"\e614"}.layui-icon-search:before{content:"\e615"}.layui-icon-friends:before{content:"\e612"}.layui-icon-group:before{content:"\e613"}.layui-icon-reply-fill:before{content:"\e611"}.layui-icon-menu-fill:before{content:"\e60f"}.layui-icon-face-smile-fine:before{content:"\e60c"}.layui-icon-picture-fine:before{content:"\e60d"}.layui-icon-log:before{content:"\e60e"}.layui-icon-list:before{content:"\e60a"}.layui-icon-release:before{content:"\e609"}.layui-icon-add-circle-fine:before{content:"\e608"}.layui-icon-ok:before{content:"\e605"}.layui-icon-help:before{content:"\e607"}.layui-icon-chat:before{content:"\e606"}.layui-icon-top:before{content:"\e604"}.layui-icon-right:before{content:"\e602"}.layui-icon-left:before{content:"\e603"}.layui-icon-star:before{content:"\e600"}.layui-icon-download-circle:before{content:"\e601"}.layui-icon-close:before{content:"\1006"}.layui-icon-close-fill:before{content:"\1007"}.layui-icon-ok-circle:before{content:"\1005"}.layui-main{position:relative;width:1160px;margin:0 auto}.layui-header{position:relative;z-index:1000;height:60px}.layui-header a:hover{transition:all .5s;-webkit-transition:all .5s}.layui-side{position:fixed;left:0;top:0;bottom:0;z-index:999;width:200px;overflow-x:hidden}.layui-side-scroll{position:relative;width:220px;height:100%;overflow-x:hidden}.layui-body{position:relative;left:200px;right:0;top:0;bottom:0;width:auto;box-sizing:border-box}.layui-layout-body{overflow-x:hidden}.layui-layout-admin .layui-header{position:fixed;top:0;left:0;right:0;background-color:#23292e}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{position:absolute;top:60px;padding-bottom:44px}.layui-layout-admin .layui-main{width:auto;margin:0 15px}.layui-layout-admin .layui-footer{position:fixed;left:200px;right:0;bottom:0;z-index:990;height:44px;line-height:44px;padding:0 15px;box-shadow:-1px 0 4px rgb(0 0 0 / 12%);background-color:#fafafa}.layui-layout-admin .layui-logo{position:absolute;left:0;top:0;width:200px;height:100%;line-height:60px;text-align:center;color:#16baaa;font-size:16px;box-shadow:0 1px 2px 0 rgb(0 0 0 / 15%)}.layui-layout-admin .layui-header .layui-nav{background:0 0}.layui-layout-left{position:absolute!important;left:200px;top:0}.layui-layout-right{position:absolute!important;right:0;top:0}.layui-container{position:relative;margin:0 auto;box-sizing:border-box}.layui-fluid{position:relative;margin:0 auto;padding:0 15px}.layui-row:after,.layui-row:before{content:"";display:block;clear:both}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9,.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9,.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9,.layui-col-xl1,.layui-col-xl10,.layui-col-xl11,.layui-col-xl12,.layui-col-xl2,.layui-col-xl3,.layui-col-xl4,.layui-col-xl5,.layui-col-xl6,.layui-col-xl7,.layui-col-xl8,.layui-col-xl9,.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{position:relative;display:block;box-sizing:border-box}.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{float:left}.layui-col-xs1{width:8.33333333%}.layui-col-xs2{width:16.66666667%}.layui-col-xs3{width:25%}.layui-col-xs4{width:33.33333333%}.layui-col-xs5{width:41.66666667%}.layui-col-xs6{width:50%}.layui-col-xs7{width:58.33333333%}.layui-col-xs8{width:66.66666667%}.layui-col-xs9{width:75%}.layui-col-xs10{width:83.33333333%}.layui-col-xs11{width:91.66666667%}.layui-col-xs12{width:100%}.layui-col-xs-offset1{margin-left:8.33333333%}.layui-col-xs-offset2{margin-left:16.66666667%}.layui-col-xs-offset3{margin-left:25%}.layui-col-xs-offset4{margin-left:33.33333333%}.layui-col-xs-offset5{margin-left:41.66666667%}.layui-col-xs-offset6{margin-left:50%}.layui-col-xs-offset7{margin-left:58.33333333%}.layui-col-xs-offset8{margin-left:66.66666667%}.layui-col-xs-offset9{margin-left:75%}.layui-col-xs-offset10{margin-left:83.33333333%}.layui-col-xs-offset11{margin-left:91.66666667%}.layui-col-xs-offset12{margin-left:100%}@media screen and (max-width:767.98px){.layui-container{padding:0 15px}.layui-hide-xs{display:none!important}.layui-show-xs-block{display:block!important}.layui-show-xs-inline{display:inline!important}.layui-show-xs-inline-block{display:inline-block!important}}@media screen and (min-width:768px){.layui-container{width:720px}.layui-hide-sm{display:none!important}.layui-show-sm-block{display:block!important}.layui-show-sm-inline{display:inline!important}.layui-show-sm-inline-block{display:inline-block!important}.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9{float:left}.layui-col-sm1{width:8.33333333%}.layui-col-sm2{width:16.66666667%}.layui-col-sm3{width:25%}.layui-col-sm4{width:33.33333333%}.layui-col-sm5{width:41.66666667%}.layui-col-sm6{width:50%}.layui-col-sm7{width:58.33333333%}.layui-col-sm8{width:66.66666667%}.layui-col-sm9{width:75%}.layui-col-sm10{width:83.33333333%}.layui-col-sm11{width:91.66666667%}.layui-col-sm12{width:100%}.layui-col-sm-offset1{margin-left:8.33333333%}.layui-col-sm-offset2{margin-left:16.66666667%}.layui-col-sm-offset3{margin-left:25%}.layui-col-sm-offset4{margin-left:33.33333333%}.layui-col-sm-offset5{margin-left:41.66666667%}.layui-col-sm-offset6{margin-left:50%}.layui-col-sm-offset7{margin-left:58.33333333%}.layui-col-sm-offset8{margin-left:66.66666667%}.layui-col-sm-offset9{margin-left:75%}.layui-col-sm-offset10{margin-left:83.33333333%}.layui-col-sm-offset11{margin-left:91.66666667%}.layui-col-sm-offset12{margin-left:100%}}@media screen and (min-width:992px){.layui-container{width:960px}.layui-hide-md{display:none!important}.layui-show-md-block{display:block!important}.layui-show-md-inline{display:inline!important}.layui-show-md-inline-block{display:inline-block!important}.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9{float:left}.layui-col-md1{width:8.33333333%}.layui-col-md2{width:16.66666667%}.layui-col-md3{width:25%}.layui-col-md4{width:33.33333333%}.layui-col-md5{width:41.66666667%}.layui-col-md6{width:50%}.layui-col-md7{width:58.33333333%}.layui-col-md8{width:66.66666667%}.layui-col-md9{width:75%}.layui-col-md10{width:83.33333333%}.layui-col-md11{width:91.66666667%}.layui-col-md12{width:100%}.layui-col-md-offset1{margin-left:8.33333333%}.layui-col-md-offset2{margin-left:16.66666667%}.layui-col-md-offset3{margin-left:25%}.layui-col-md-offset4{margin-left:33.33333333%}.layui-col-md-offset5{margin-left:41.66666667%}.layui-col-md-offset6{margin-left:50%}.layui-col-md-offset7{margin-left:58.33333333%}.layui-col-md-offset8{margin-left:66.66666667%}.layui-col-md-offset9{margin-left:75%}.layui-col-md-offset10{margin-left:83.33333333%}.layui-col-md-offset11{margin-left:91.66666667%}.layui-col-md-offset12{margin-left:100%}}@media screen and (min-width:1200px){.layui-container{width:1150px}.layui-hide-lg{display:none!important}.layui-show-lg-block{display:block!important}.layui-show-lg-inline{display:inline!important}.layui-show-lg-inline-block{display:inline-block!important}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9{float:left}.layui-col-lg1{width:8.33333333%}.layui-col-lg2{width:16.66666667%}.layui-col-lg3{width:25%}.layui-col-lg4{width:33.33333333%}.layui-col-lg5{width:41.66666667%}.layui-col-lg6{width:50%}.layui-col-lg7{width:58.33333333%}.layui-col-lg8{width:66.66666667%}.layui-col-lg9{width:75%}.layui-col-lg10{width:83.33333333%}.layui-col-lg11{width:91.66666667%}.layui-col-lg12{width:100%}.layui-col-lg-offset1{margin-left:8.33333333%}.layui-col-lg-offset2{margin-left:16.66666667%}.layui-col-lg-offset3{margin-left:25%}.layui-col-lg-offset4{margin-left:33.33333333%}.layui-col-lg-offset5{margin-left:41.66666667%}.layui-col-lg-offset6{margin-left:50%}.layui-col-lg-offset7{margin-left:58.33333333%}.layui-col-lg-offset8{margin-left:66.66666667%}.layui-col-lg-offset9{margin-left:75%}.layui-col-lg-offset10{margin-left:83.33333333%}.layui-col-lg-offset11{margin-left:91.66666667%}.layui-col-lg-offset12{margin-left:100%}}@media screen and (min-width:1400px){.layui-container{width:1330px}.layui-hide-xl{display:none!important}.layui-show-xl-block{display:block!important}.layui-show-xl-inline{display:inline!important}.layui-show-xl-inline-block{display:inline-block!important}.layui-col-xl1,.layui-col-xl10,.layui-col-xl11,.layui-col-xl12,.layui-col-xl2,.layui-col-xl3,.layui-col-xl4,.layui-col-xl5,.layui-col-xl6,.layui-col-xl7,.layui-col-xl8,.layui-col-xl9{float:left}.layui-col-xl1{width:8.33333333%}.layui-col-xl2{width:16.66666667%}.layui-col-xl3{width:25%}.layui-col-xl4{width:33.33333333%}.layui-col-xl5{width:41.66666667%}.layui-col-xl6{width:50%}.layui-col-xl7{width:58.33333333%}.layui-col-xl8{width:66.66666667%}.layui-col-xl9{width:75%}.layui-col-xl10{width:83.33333333%}.layui-col-xl11{width:91.66666667%}.layui-col-xl12{width:100%}.layui-col-xl-offset1{margin-left:8.33333333%}.layui-col-xl-offset2{margin-left:16.66666667%}.layui-col-xl-offset3{margin-left:25%}.layui-col-xl-offset4{margin-left:33.33333333%}.layui-col-xl-offset5{margin-left:41.66666667%}.layui-col-xl-offset6{margin-left:50%}.layui-col-xl-offset7{margin-left:58.33333333%}.layui-col-xl-offset8{margin-left:66.66666667%}.layui-col-xl-offset9{margin-left:75%}.layui-col-xl-offset10{margin-left:83.33333333%}.layui-col-xl-offset11{margin-left:91.66666667%}.layui-col-xl-offset12{margin-left:100%}}.layui-col-space1{margin:-.5px}.layui-col-space1>*{padding:.5px}.layui-col-space2{margin:-1px}.layui-col-space2>*{padding:1px}.layui-col-space4{margin:-2px}.layui-col-space4>*{padding:2px}.layui-col-space5{margin:-2.5px}.layui-col-space5>*{padding:2.5px}.layui-col-space6{margin:-3px}.layui-col-space6>*{padding:3px}.layui-col-space8{margin:-4px}.layui-col-space8>*{padding:4px}.layui-col-space10{margin:-5px}.layui-col-space10>*{padding:5px}.layui-col-space12{margin:-6px}.layui-col-space12>*{padding:6px}.layui-col-space14{margin:-7px}.layui-col-space14>*{padding:7px}.layui-col-space15{margin:-7.5px}.layui-col-space15>*{padding:7.5px}.layui-col-space16{margin:-8px}.layui-col-space16>*{padding:8px}.layui-col-space18{margin:-9px}.layui-col-space18>*{padding:9px}.layui-col-space20{margin:-10px}.layui-col-space20>*{padding:10px}.layui-col-space22{margin:-11px}.layui-col-space22>*{padding:11px}.layui-col-space24{margin:-12px}.layui-col-space24>*{padding:12px}.layui-col-space25{margin:-12.5px}.layui-col-space25>*{padding:12.5px}.layui-col-space26{margin:-13px}.layui-col-space26>*{padding:13px}.layui-col-space28{margin:-14px}.layui-col-space28>*{padding:14px}.layui-col-space30{margin:-15px}.layui-col-space30>*{padding:15px}.layui-col-space32{margin:-16px}.layui-col-space32>*{padding:16px}.layui-padding-1{padding:4px!important}.layui-padding-2{padding:8px!important}.layui-padding-3{padding:16px!important}.layui-padding-4{padding:32px!important}.layui-padding-5{padding:48px!important}.layui-margin-1{margin:4px!important}.layui-margin-2{margin:8px!important}.layui-margin-3{margin:16px!important}.layui-margin-4{margin:32px!important}.layui-margin-5{margin:48px!important}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;appearance:none;-webkit-appearance:none;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:1.8;border-left:5px solid #16b777;border-radius:0 2px 2px 0;background-color:#fafafa}.layui-quote-nm{border-style:solid;border-width:1px;border-left-width:5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border-width:1px;border-style:solid}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px}.layui-field-title{margin:16px 0;border-width:0;border-top-width:1px}.layui-field-box{padding:15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#eee}.layui-progress-bar{position:absolute;left:0;top:0;width:0;max-width:100%;height:6px;border-radius:20px;text-align:right;background-color:#16b777;transition:all .3s;-webkit-transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px}.layui-progress-text{position:relative;top:-20px;line-height:18px;font-size:12px;color:#5f5f5f}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border-width:1px;border-style:solid;border-radius:2px}.layui-colla-content,.layui-colla-item{border-top-width:1px;border-top-style:solid}.layui-colla-item:first-child{border-top:none}.layui-colla-title{position:relative;height:42px;line-height:42px;padding:0 15px 0 35px;color:#333;background-color:#fafafa;cursor:pointer;font-size:14px;overflow:hidden}.layui-colla-content{display:none;padding:10px 15px;line-height:1.6;color:#5f5f5f}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-card{margin-bottom:15px;border-radius:2px;background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layui-card:last-child{margin-bottom:0}.layui-card-body,.layui-card-header{position:relative;padding:10px 15px}.layui-card-header{border-bottom:1px solid #f8f8f8;color:#333;border-radius:2px 2px 0 0;font-size:14px}.layui-card-body .layui-table{margin:5px 0}.layui-card .layui-tab{margin:0}.layui-panel{position:relative;border-width:1px;border-style:solid;border-radius:2px;box-shadow:1px 1px 4px rgb(0 0 0 / 8%);background-color:#fff;color:#5f5f5f}.layui-panel-window{position:relative;padding:15px;border-radius:0;border-top:5px solid #eee;background-color:#fff}.layui-auxiliar-moving{position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;background:0 0;z-index:9999999999;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.layui-scrollbar-hide{overflow:hidden!important}.layui-bg-red{background-color:#ff5722!important;color:#fff!important}.layui-bg-orange{background-color:#ffb800!important;color:#fff!important}.layui-bg-green{background-color:#16baaa!important;color:#fff!important}.layui-bg-cyan{background-color:#2f4056!important;color:#fff!important}.layui-bg-blue{background-color:#1e9fff!important;color:#fff!important}.layui-bg-purple{background-color:#a233c6!important;color:#fff!important}.layui-bg-black{background-color:#2f363c!important;color:#fff!important}.layui-bg-gray{background-color:#fafafa!important;color:#5f5f5f!important}.layui-badge-rim,.layui-border,.layui-colla-content,.layui-colla-item,.layui-collapse,.layui-elem-field,.layui-form-pane .layui-form-item[pane],.layui-form-pane .layui-form-label,.layui-input,.layui-input-split,.layui-panel,.layui-quote-nm,.layui-select,.layui-tab-bar,.layui-tab-card,.layui-tab-title,.layui-tab-title .layui-this:after,.layui-textarea{border-color:#eee}.layui-border{border-width:1px;border-style:solid;color:#5f5f5f!important}.layui-border-red{border-width:1px;border-style:solid;border-color:#ff5722!important;color:#ff5722!important}.layui-border-orange{border-width:1px;border-style:solid;border-color:#ffb800!important;color:#ffb800!important}.layui-border-green{border-width:1px;border-style:solid;border-color:#16baaa!important;color:#16baaa!important}.layui-border-cyan{border-width:1px;border-style:solid;border-color:#2f4056!important;color:#2f4056!important}.layui-border-blue{border-width:1px;border-style:solid;border-color:#1e9fff!important;color:#1e9fff!important}.layui-border-purple{border-width:1px;border-style:solid;border-color:#a233c6!important;color:#a233c6!important}.layui-border-black{border-width:1px;border-style:solid;border-color:#2f363c!important;color:#2f363c!important}hr.layui-border-black,hr.layui-border-blue,hr.layui-border-cyan,hr.layui-border-green,hr.layui-border-orange,hr.layui-border-purple,hr.layui-border-red{border-width:0 0 1px}.layui-timeline-item:before{background-color:#eee}.layui-text{line-height:1.8;font-size:14px}.layui-text h1{margin:32px 0;font-size:32px}.layui-text h2{margin:24px 0;font-size:24px}.layui-text h3{margin:16px 0;font-size:18px}.layui-text h4{margin:11px 0;font-size:16px}.layui-text h5{margin:11px 0;font-size:14px}.layui-text h6{margin:11px 0;font-size:13px}.layui-text p{margin:15px 0}.layui-text p:first-child{margin-top:0}.layui-text p:last-child{margin-bottom:0}.layui-text hr{margin:15px 0}.layui-text ol,.layui-text ul{padding-left:15px}.layui-text ul li{margin-top:5px;list-style-type:disc}.layui-text ol li{margin-top:5px;list-style-type:decimal}.layui-text ol ul>li,.layui-text ul ul>li{list-style-type:disc}.layui-text ol li>p:first-child,.layui-text ul li>p:first-child{margin-top:0;margin-bottom:0}.layui-text :where(a:not(.layui-btn)){color:#01aaed}.layui-text :where(a:not(.layui-btn):hover){text-decoration:underline}.layui-text blockquote:not(.layui-elem-quote){margin:15px 0;padding:5px 15px;border-left:5px solid #eee}.layui-text pre>code:not(.layui-code){display:block;padding:15px;font-family:"Courier New",Consolas,"Lucida Console",monospace}.layui-text-em,.layui-word-aux{color:#999!important;padding-left:5px!important;padding-right:5px!important}.layui-font-12{font-size:12px!important}.layui-font-13{font-size:13px!important}.layui-font-14{font-size:14px!important}.layui-font-16{font-size:16px!important}.layui-font-18{font-size:18px!important}.layui-font-20{font-size:20px!important}.layui-font-22{font-size:22px!important}.layui-font-24{font-size:24px!important}.layui-font-26{font-size:26px!important}.layui-font-28{font-size:28px!important}.layui-font-30{font-size:30px!important}.layui-font-32{font-size:32px!important}.layui-font-red{color:#ff5722!important}.layui-font-orange{color:#ffb800!important}.layui-font-green{color:#16baaa!important}.layui-font-cyan{color:#2f4056!important}.layui-font-blue{color:#01aaed!important}.layui-font-purple{color:#a233c6!important}.layui-font-black{color:#000!important}.layui-font-gray{color:#c2c2c2!important}.layui-btn{display:inline-block;vertical-align:middle;height:38px;line-height:38px;border:1px solid transparent;padding:0 18px;background-color:#16baaa;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border-radius:2px;cursor:pointer;user-select:none}.layui-btn:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}.layui-btn:active{opacity:1;filter:alpha(opacity=100)}.layui-btn+.layui-btn{margin-left:10px}.layui-btn-container{word-spacing:-5px}.layui-btn-container .layui-btn{margin-right:10px;margin-bottom:10px;word-spacing:normal}.layui-btn-container .layui-btn+.layui-btn{margin-left:0}.layui-table .layui-btn-container .layui-btn{margin-bottom:9px}.layui-btn-radius{border-radius:100px}.layui-btn .layui-icon{padding:0 2px;vertical-align:middle\0;vertical-align:bottom}.layui-btn-primary{border-color:#d2d2d2;background:0 0;color:#5f5f5f}.layui-btn-primary:hover{border-color:#16baaa;color:#333}.layui-btn-normal{background-color:#1e9fff}.layui-btn-warm{background-color:#ffb800}.layui-btn-danger{background-color:#ff5722}.layui-btn-checked{background-color:#16b777}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border-color:#eee!important;background-color:#fbfbfb!important;color:#d2d2d2!important;cursor:not-allowed!important;opacity:1}.layui-btn-lg{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-sm{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-xs{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-xs i{font-size:12px!important}.layui-btn-group{display:inline-block;vertical-align:middle;font-size:0}.layui-btn-group .layui-btn{margin-left:0!important;margin-right:0!important;border-left:1px solid rgba(255,255,255,.5);border-radius:0}.layui-btn-group .layui-btn-primary{border-left:none}.layui-btn-group .layui-btn-primary:hover{border-color:#d2d2d2;color:#16baaa}.layui-btn-group .layui-btn:first-child{border-left:none;border-radius:2px 0 0 2px}.layui-btn-group .layui-btn-primary:first-child{border-left:1px solid #d2d2d2}.layui-btn-group .layui-btn:last-child{border-radius:0 2px 2px 0}.layui-btn-group .layui-btn+.layui-btn{margin-left:0}.layui-btn-group+.layui-btn-group{margin-left:10px}.layui-btn-fluid{width:100%}.layui-input,.layui-select,.layui-textarea{height:38px;line-height:1.3;line-height:38px\9;border-width:1px;border-style:solid;background-color:#fff;color:rgba(0,0,0,.85);border-radius:2px}.layui-input::-webkit-input-placeholder,.layui-select::-webkit-input-placeholder,.layui-textarea::-webkit-input-placeholder{line-height:1.3}.layui-input,.layui-textarea{display:block;width:100%;padding-left:10px}.layui-input:hover,.layui-textarea:hover{border-color:#d2d2d2!important}.layui-input:focus,.layui-textarea:focus{border-color:#16b777!important;box-shadow:0 0 0 3px rgba(22,183,119,.08)}.layui-textarea{position:relative;min-height:100px;height:auto;line-height:20px;padding:6px 10px;resize:vertical}.layui-input[disabled],.layui-textarea[disabled]{background-color:#fafafa}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form [lay-ignore]{display:initial}.layui-form-item{position:relative;margin-bottom:15px;clear:both}.layui-form-item:after{content:'\20';clear:both;display:block;height:0}.layui-form-label{position:relative;float:left;display:block;padding:9px 15px;width:80px;font-weight:400;line-height:20px;text-align:right}.layui-form-label-col{display:block;float:none;padding:9px 0;line-height:20px;text-align:left}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block,.layui-input-inline{position:relative}.layui-input-block{margin-left:110px;min-height:36px}.layui-input-inline{display:inline-block;vertical-align:middle}.layui-form-item .layui-input-inline{float:left;width:190px;margin-right:10px}.layui-form-text .layui-input-inline{width:auto}.layui-form-mid{position:relative;float:left;display:block;padding:9px 0!important;line-height:20px;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border-color:#ff5722!important;box-shadow:0 0 0 3px rgba(255,87,34,.08)}.layui-input-prefix,.layui-input-split,.layui-input-suffix,.layui-input-suffix .layui-input-affix{position:absolute;right:0;top:0;padding:0 10px;width:35px;height:100%;text-align:center;transition:all .3s;box-sizing:border-box}.layui-input-prefix{left:0;border-radius:2px 0 0 2px}.layui-input-suffix{right:0;border-radius:0 2px 2px 0}.layui-input-split{border-width:1px;border-style:solid}.layui-input-prefix .layui-icon,.layui-input-split .layui-icon,.layui-input-suffix .layui-icon{position:relative;font-size:16px;color:#5f5f5f;transition:all .3s}.layui-input-group{position:relative;display:table;box-sizing:border-box}.layui-input-group>*{display:table-cell;vertical-align:middle;position:relative}.layui-input-group .layui-input{padding-right:15px}.layui-input-group>.layui-input-prefix{width:auto;border-right:0}.layui-input-group>.layui-input-suffix{width:auto;border-left:0}.layui-input-group .layui-input-split{white-space:nowrap}.layui-input-wrap{position:relative;line-height:38px}.layui-input-wrap .layui-input{padding-right:35px}.layui-input-wrap .layui-input::-ms-clear,.layui-input-wrap .layui-input::-ms-reveal{display:none}.layui-input-wrap .layui-input-prefix+.layui-input,.layui-input-wrap .layui-input-prefix~* .layui-input{padding-left:35px}.layui-input-wrap .layui-input-split+.layui-input,.layui-input-wrap .layui-input-split~* .layui-input{padding-left:45px}.layui-input-wrap .layui-input-prefix~.layui-form-select{position:static}.layui-input-wrap .layui-input-prefix,.layui-input-wrap .layui-input-split,.layui-input-wrap .layui-input-suffix{pointer-events:none}.layui-input-wrap .layui-input:hover+.layui-input-split{border-color:#d2d2d2}.layui-input-wrap .layui-input:focus+.layui-input-split{border-color:#16b777}.layui-input-wrap .layui-input.layui-form-danger:focus+.layui-input-split{border-color:#ff5722}.layui-input-wrap .layui-input-prefix.layui-input-split{border-width:0;border-right-width:1px}.layui-input-wrap .layui-input-suffix.layui-input-split{border-width:0;border-left-width:1px}.layui-input-affix{line-height:38px}.layui-input-suffix .layui-input-affix{right:auto;left:-35px}.layui-input-affix .layui-icon{color:rgba(0,0,0,.8);pointer-events:auto!important;cursor:pointer}.layui-input-affix .layui-icon-clear{color:rgba(0,0,0,.3)}.layui-input-affix .layui-icon:hover{color:rgba(0,0,0,.6)}.layui-input-wrap .layui-input-number{width:24px;padding:0}.layui-input-wrap .layui-input-number .layui-icon{position:absolute;right:0;width:100%;height:50%;line-height:normal;font-size:12px}.layui-input-wrap .layui-input-number .layui-icon:before{position:absolute;left:50%;top:50%;margin-top:-6px;margin-left:-6px}.layui-input-wrap .layui-input-number .layui-icon-up{top:0;border-bottom:1px solid #eee}.layui-input-wrap .layui-input-number .layui-icon-down{bottom:0}.layui-input-wrap .layui-input-number .layui-icon:hover{font-weight:700}.layui-input-wrap .layui-input[type=number]::-webkit-inner-spin-button,.layui-input-wrap .layui-input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none!important}.layui-input-wrap .layui-input[type=number]{-moz-appearance:textfield;-webkit-appearance:textfield;appearance:textfield}.layui-input-wrap .layui-input.layui-input-number-invalid,.layui-input-wrap .layui-input.layui-input-number-out-of-range{color:#ff5722}.layui-form-select{position:relative;color:#5f5f5f}.layui-form-select .layui-input{padding-right:30px;cursor:pointer}.layui-form-select .layui-edge{position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#c2c2c2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.layui-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #eee;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:1px 1px 4px rgb(0 0 0 / 8%);box-sizing:border-box}.layui-form-select dl dd,.layui-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layui-form-select dl dt{font-size:12px;color:#999}.layui-form-select dl dd{cursor:pointer}.layui-form-select dl dd:hover{background-color:#f8f8f8;-webkit-transition:.5s all;transition:.5s all}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-select-tips{padding-left:10px!important;color:#999}.layui-form-select dl dd.layui-this{background-color:#f8f8f8;color:#16b777;font-weight:700}.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.layui-form-selected .layui-edge{margin-top:-3px\0}:root .layui-form-selected .layui-edge{margin-top:-9px\0/IE9}.layui-form-selectup dl{top:auto;bottom:42px}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-panel-wrap{position:absolute;z-index:99999999}.layui-select-panel-wrap dl{position:relative;display:block;top:0}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;display:inline-block;vertical-align:middle;height:30px;line-height:30px;margin-right:10px;padding-right:30px;background-color:#fff;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.layui-form-checkbox>*{display:inline-block;vertical-align:middle}.layui-form-checkbox>div{padding:0 11px;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.layui-form-checkbox>div>.layui-icon{line-height:normal}.layui-form-checkbox:hover>div{background-color:#c2c2c2}.layui-form-checkbox>i{position:absolute;right:0;top:0;width:30px;height:100%;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;color:rgba(255,255,255,0);font-size:20px;text-align:center;box-sizing:border-box}.layui-form-checkbox:hover>i{border-color:#c2c2c2;color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#16b777}.layui-form-checked:hover>div,.layui-form-checked>div{background-color:#16b777}.layui-form-checked:hover>i,.layui-form-checked>i{color:#16b777}.layui-form-item .layui-form-checkbox{margin-top:4px}.layui-form-checkbox.layui-checkbox-disabled>div{background-color:#eee!important}.layui-form [lay-checkbox]{display:none}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;min-width:18px;min-height:18px;border:none!important;margin-right:0;padding-left:24px;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary]>div{margin-top:-1px;padding-left:0;padding-right:15px;line-height:18px;background:0 0;color:#5f5f5f}.layui-form-checkbox[lay-skin=primary]>i{right:auto;left:0;width:16px;height:16px;line-height:14px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover>i{border-color:#16b777;color:#fff}.layui-form-checked[lay-skin=primary]>i{border-color:#16b777!important;background-color:#16b777;color:#fff}.layui-checkbox-disabled[lay-skin=primary]>div{background:0 0!important}.layui-form-checked.layui-checkbox-disabled[lay-skin=primary]>i{background:#eee!important;border-color:#eee!important}.layui-checkbox-disabled[lay-skin=primary]:hover>i{border-color:#d2d2d2}.layui-form-item .layui-form-checkbox[lay-skin=primary]{margin-top:10px}.layui-form-checkbox[lay-skin=primary]>.layui-icon-indeterminate{border-color:#16b777}.layui-form-checkbox[lay-skin=primary]>.layui-icon-indeterminate:before{content:'';display:inline-block;vertical-align:middle;position:relative;width:50%;height:1px;margin:-1px auto 0;background-color:#16b777}.layui-form-switch{position:relative;display:inline-block;vertical-align:middle;height:24px;line-height:22px;min-width:44px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;box-sizing:border-box;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch>i{position:absolute;left:5px;top:3px;width:16px;height:16px;border-radius:20px;background-color:#d2d2d2;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch>div{position:relative;top:0;margin-left:21px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#16b777;background-color:#16b777}.layui-form-onswitch>i{left:100%;margin-left:-21px;background-color:#fff}.layui-form-onswitch>div{margin-left:0;margin-right:21px;color:#fff!important}.layui-form-checkbox[lay-skin=none] *,.layui-form-radio[lay-skin=none] *{box-sizing:border-box}.layui-form-checkbox[lay-skin=none],.layui-form-radio[lay-skin=none]{position:relative;min-height:20px;margin:0;padding:0;height:auto;line-height:normal}.layui-form-checkbox[lay-skin=none]>div,.layui-form-radio[lay-skin=none]>div{position:relative;top:0;left:0;cursor:pointer;z-index:10;color:inherit;background-color:inherit}.layui-form-checkbox[lay-skin=none]>i,.layui-form-radio[lay-skin=none]>i{display:none}.layui-form-checkbox[lay-skin=none].layui-checkbox-disabled>div,.layui-form-radio[lay-skin=none].layui-radio-disabled>div{cursor:not-allowed}.layui-checkbox-disabled{border-color:#eee!important}.layui-checkbox-disabled>div{color:#c2c2c2!important}.layui-checkbox-disabled>i{border-color:#eee!important}.layui-checkbox-disabled:hover>i{color:#fff!important}.layui-form-checkbox[lay-skin=tag].layui-form-checked.layui-checkbox-disabled>i{color:#c2c2c2}.layui-form-checkbox[lay-skin=tag].layui-form-checked.layui-checkbox-disabled:hover>i{color:#c2c2c2!important}.layui-form-radio{display:inline-block;vertical-align:middle;line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio>*{display:inline-block;vertical-align:middle;font-size:14px}.layui-form-radio>i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio:hover>*,.layui-form-radioed,.layui-form-radioed>i{color:#16b777}.layui-radio-disabled>i{color:#eee!important}.layui-radio-disabled>*{color:#c2c2c2!important}.layui-form [lay-radio]{display:none}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border-width:1px;border-style:solid;border-radius:2px 0 0 2px;text-align:center;background-color:#fafafa;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;box-sizing:border-box}.layui-form-pane .layui-input-inline{margin-left:-1px}.layui-form-pane .layui-input-block{margin-left:110px;left:-1px}.layui-form-pane .layui-input{border-radius:0 2px 2px 0}.layui-form-pane .layui-form-text .layui-form-label{float:none;width:100%;border-radius:2px;box-sizing:border-box;text-align:left}.layui-form-pane .layui-form-text .layui-input-inline{display:block;margin:0;top:-1px;clear:both}.layui-form-pane .layui-form-text .layui-input-block{margin:0;left:0;top:-1px}.layui-form-pane .layui-form-text .layui-textarea{min-height:100px;border-radius:0 0 2px 2px}.layui-form-pane .layui-form-checkbox{margin:4px 0 4px 10px}.layui-form-pane .layui-form-radio,.layui-form-pane .layui-form-switch{margin-top:6px;margin-left:10px}.layui-form-pane .layui-form-item[pane]{position:relative;border-width:1px;border-style:solid}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0;border-right-width:1px}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}@media screen and (max-width:450px){.layui-form-item .layui-form-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-form-item .layui-inline{display:block;margin-right:0;margin-bottom:20px;clear:both}.layui-form-item .layui-inline:after{content:'\20';clear:both;display:block;height:0}.layui-form-item .layui-input-inline{display:block;float:none;left:-3px;width:auto!important;margin:0 0 10px 112px}.layui-form-item .layui-input-inline+.layui-form-mid{margin-left:110px;top:-5px;padding:0}.layui-form-item .layui-form-checkbox{margin-right:5px;margin-bottom:5px}}.layui-laypage{display:inline-block;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>a:first-child,.layui-laypage>a:first-child em{border-radius:2px 0 0 2px}.layui-laypage>a:last-child,.layui-laypage>a:last-child em{border-radius:0 2px 2px 0}.layui-laypage>:first-child{margin-left:0!important}.layui-laypage>:last-child{margin-right:0!important}.layui-laypage a,.layui-laypage button,.layui-laypage input,.layui-laypage select,.layui-laypage span{border:1px solid #eee}.layui-laypage a,.layui-laypage span{display:inline-block;vertical-align:middle;padding:0 15px;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-laypage a[data-page]{color:#333}.layui-laypage a{text-decoration:none!important;cursor:pointer}.layui-laypage a:hover{color:#16baaa}.layui-laypage em{font-style:normal}.layui-laypage .layui-laypage-spr{color:#999;font-weight:700}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#16baaa}.layui-laypage-em{border-radius:2px}.layui-laypage-next em,.layui-laypage-prev em{font-family:Sim sun;font-size:16px}.layui-laypage .layui-laypage-count,.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh,.layui-laypage .layui-laypage-skip{margin-left:10px;margin-right:10px;padding:0;border:none}.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh{vertical-align:top}.layui-laypage .layui-laypage-refresh i{font-size:18px;cursor:pointer}.layui-laypage select{height:22px;padding:3px;border-radius:2px;cursor:pointer}.layui-laypage .layui-laypage-skip{height:30px;line-height:30px;color:#999}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box}.layui-laypage input{display:inline-block;width:40px;margin:0 10px;padding:0 3px;text-align:center}.layui-laypage input:focus,.layui-laypage select:focus{border-color:#16baaa!important}.layui-laypage button{margin-left:10px;padding:0 10px;cursor:pointer}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px;clear:both}.layui-flow-more a{height:32px;line-height:32px}.layui-flow-more a *{display:inline-block;vertical-align:top}.layui-flow-more a cite{padding:0 20px;border-radius:3px;background-color:#eee;color:#333;font-style:normal}.layui-flow-more a cite:hover{opacity:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-table{width:100%;margin:10px 0;background-color:#fff;color:#5f5f5f}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table th{text-align:left;font-weight:600}.layui-table-mend{background-color:#fff}.layui-table-click,.layui-table-hover,.layui-table[lay-even] tbody tr:nth-child(even){background-color:#f8f8f8}.layui-table-checked{background-color:#dbfbf0}.layui-table-checked.layui-table-click,.layui-table-checked.layui-table-hover{background-color:#abf8dd}.layui-table-disabled-transition *,.layui-table-disabled-transition :after,.layui-table-disabled-transition :before{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}.layui-table td,.layui-table th,.layui-table-col-set,.layui-table-fixed-r,.layui-table-grid-down,.layui-table-header,.layui-table-mend,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-total,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-width:1px;border-style:solid;border-color:#eee}.layui-table td,.layui-table th{position:relative;padding:9px 15px;min-height:20px;line-height:20px;font-size:14px}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border-width:0;border-bottom-width:1px}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border-width:0;border-right-width:1px}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-table img{max-width:100px}.layui-table[lay-size=lg] td,.layui-table[lay-size=lg] th{padding-top:15px;padding-right:30px;padding-bottom:15px;padding-left:30px}.layui-table-view .layui-table[lay-size=lg] .layui-table-cell{height:50px;line-height:40px}.layui-table[lay-size=sm] td,.layui-table[lay-size=sm] th{padding-top:5px;padding-right:10px;padding-bottom:5px;padding-left:10px;font-size:12px}.layui-table-view .layui-table[lay-size=sm] .layui-table-cell{height:30px;line-height:20px;padding-top:5px;padding-left:11px;padding-right:11px}.layui-table[lay-data],.layui-table[lay-options]{display:none}.layui-table-box{position:relative;overflow:hidden}.layui-table-view{clear:both;position:relative;border-right:none}.layui-table-view:after{content:"";position:absolute;top:0;right:0;width:1px;height:100%;background-color:#eee;z-index:101}.layui-table-view .layui-table{position:relative;width:auto;margin:0;border:0;border-collapse:separate}.layui-table-view .layui-table[lay-skin=line]{border-width:0;border-right-width:1px}.layui-table-view .layui-table[lay-skin=row]{border-width:0;border-bottom-width:1px}.layui-table-view .layui-table td,.layui-table-view .layui-table th{padding:0;border-top:none;border-left:none}.layui-table-view .layui-table th [lay-event],.layui-table-view .layui-table th.layui-unselect .layui-table-cell span{cursor:pointer}.layui-table-view .layui-table td,.layui-table-view .layui-table th span{cursor:default}.layui-table-view .layui-table td[data-edit]{cursor:text}.layui-table-view .layui-table td[data-edit]:hover:after{position:absolute;left:0;top:0;width:100%;height:100%;box-sizing:border-box;border:1px solid #16b777;pointer-events:none;content:""}.layui-table-view .layui-form-checkbox[lay-skin=primary] i{width:18px;height:18px;line-height:16px}.layui-table-view .layui-form-radio{line-height:0;padding:0}.layui-table-view .layui-form-radio>i{margin:0;font-size:20px}.layui-table-init{position:absolute;left:0;top:0;right:0;bottom:0;margin:0;z-index:199;transition:opacity .1s;user-select:none}.layui-table-loading-icon{position:absolute;width:100%\0;left:50%;left:auto\0;top:50%;margin-top:-15px\0;transform:translate(-50%,-50%);transform:none\0;text-align:center}.layui-table-loading-icon .layui-icon{font-size:30px;color:#c2c2c2}.layui-table-header{border-width:0;border-bottom-width:1px;overflow:hidden}.layui-table-header .layui-table{margin-bottom:-1px}.layui-table-column{position:relative;width:100%;min-height:41px;padding:8px 16px;border-width:0;border-bottom-width:1px}.layui-table-column .layui-btn-container{margin-bottom:-8px}.layui-table-column .layui-btn-container .layui-btn{margin-right:8px;margin-bottom:8px}.layui-table-tool .layui-inline[lay-event]{position:relative;width:26px;height:26px;padding:5px;line-height:16px;margin-right:10px;text-align:center;color:#333;border:1px solid #ccc;cursor:pointer;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool .layui-inline[lay-event]:hover{border:1px solid #999}.layui-table-tool-temp{padding-right:120px}.layui-table-tool-self{position:absolute;right:17px;top:10px}.layui-table-tool .layui-table-tool-self .layui-inline[lay-event]{margin:0 0 0 10px}.layui-table-tool-panel{position:absolute;top:29px;left:-1px;z-index:399;padding:5px 0!important;min-width:150px;min-height:40px;border:1px solid #d2d2d2;text-align:left;overflow-y:auto;background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-table-tool-panel li{padding:0 10px;margin:0!important;line-height:30px;list-style-type:none!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{width:100%}.layui-table-tool-panel li:hover{background-color:#f8f8f8}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{padding-left:28px}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] i{position:absolute;left:0;top:0}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] span{padding:0}.layui-table-tool .layui-table-tool-self .layui-table-tool-panel{left:auto;right:-1px}.layui-table-col-set{position:absolute;right:0;top:0;width:20px;height:100%;border-width:0;border-left-width:1px;background-color:#fff}.layui-table-sort{width:10px;height:20px;margin-left:5px;cursor:pointer!important}.layui-table-sort .layui-edge{position:absolute;left:5px;border-width:5px}.layui-table-sort .layui-table-sort-asc{top:3px;border-top:none;border-bottom-style:solid;border-bottom-color:#b2b2b2}.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color:#5f5f5f}.layui-table-sort .layui-table-sort-desc{bottom:5px;border-bottom:none;border-top-style:solid;border-top-color:#b2b2b2}.layui-table-sort .layui-table-sort-desc:hover{border-top-color:#5f5f5f}.layui-table-sort[lay-sort=asc] .layui-table-sort-asc{border-bottom-color:#000}.layui-table-sort[lay-sort=desc] .layui-table-sort-desc{border-top-color:#000}.layui-table-cell{height:38px;line-height:28px;padding:6px 15px;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;box-sizing:border-box}.layui-table-cell .layui-form-checkbox[lay-skin=primary]{top:-1px;padding:0}.layui-table-cell .layui-form-checkbox[lay-skin=primary]>div{padding-left:24px}.layui-table-cell .layui-table-link{color:#01aaed}.layui-table-cell .layui-btn{vertical-align:inherit}.layui-table-cell[align=center]{-webkit-box-pack:center}.layui-table-cell[align=right]{-webkit-box-pack:end}.laytable-cell-checkbox,.laytable-cell-numbers,.laytable-cell-radio,.laytable-cell-space{text-align:center;-webkit-box-pack:center}.layui-table-body{position:relative;overflow:auto;margin-bottom:-1px}.layui-table-body .layui-none{line-height:26px;padding:30px 15px;text-align:center;color:#999}.layui-table-fixed{position:absolute;left:0;top:0;z-index:101}.layui-table-fixed .layui-table-body{overflow:hidden}.layui-table-fixed-l{box-shadow:1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r{left:auto;right:0;border-width:0;border-left-width:1px;box-shadow:-1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r .layui-table-header{position:relative;overflow:visible}.layui-table-mend{position:absolute;right:-49px;top:0;height:100%;width:50px;border-width:0;border-left-width:1px}.layui-table-tool{position:relative;width:100%;min-height:50px;line-height:30px;padding:10px 15px;border-width:0;border-bottom-width:1px}.layui-table-tool .layui-btn-container{margin-bottom:-10px}.layui-table-total{margin-bottom:-1px;border-width:0;border-top-width:1px;overflow:hidden}.layui-table-page{border-width:0;border-top-width:1px;margin-bottom:-1px;white-space:nowrap;overflow:hidden}.layui-table-page>div{height:26px}.layui-table-page .layui-laypage{margin:0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span{height:26px;line-height:26px;margin-bottom:10px;border:none;background:0 0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span.layui-laypage-curr{padding:0 12px}.layui-table-page .layui-laypage span{margin-left:0;padding:0}.layui-table-page .layui-laypage .layui-laypage-prev{margin-left:-11px!important}.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left:0;top:0;padding:0}.layui-table-page .layui-laypage button,.layui-table-page .layui-laypage input{height:26px;line-height:26px}.layui-table-page .layui-laypage input{width:40px}.layui-table-page .layui-laypage button{padding:0 10px}.layui-table-page select{height:18px}.layui-table-pagebar{float:right;line-height:23px}.layui-table-pagebar .layui-btn-sm{margin-top:-1px}.layui-table-pagebar .layui-btn-xs{margin-top:2px}.layui-table-view select[lay-ignore]{display:inline-block}.layui-table-patch .layui-table-cell{padding:0;width:30px}.layui-table-edit{position:absolute;left:0;top:0;z-index:189;min-width:100%;min-height:100%;padding:5px 14px;border-radius:0;box-shadow:1px 1px 20px rgba(0,0,0,.15);background-color:#fff}.layui-table-edit:focus{border-color:#16b777!important}input.layui-input.layui-table-edit{height:100%}select.layui-table-edit{padding:0 0 0 10px;border-color:#d2d2d2}.layui-table-view .layui-form-checkbox,.layui-table-view .layui-form-radio,.layui-table-view .layui-form-switch{top:0;margin:0}.layui-table-view .layui-form-checkbox{top:-1px;height:26px;line-height:26px}.layui-table-view .layui-form-checkbox i{height:26px}.layui-table-grid .layui-table-cell{overflow:visible}.layui-table-grid-down{position:absolute;top:0;right:0;width:24px;height:100%;padding:5px 0;border-width:0;border-left-width:1px;text-align:center;background-color:#fff;color:#999;cursor:pointer}.layui-table-grid-down .layui-icon{position:absolute;top:50%;left:50%;margin:-8px 0 0 -8px;font-size:14px}.layui-table-grid-down:hover{background-color:#fbfbfb}.layui-table-expanded{height:95px}.layui-table-expanded .layui-table-cell,.layui-table-view .layui-table[lay-size=lg] .layui-table-expanded .layui-table-cell,.layui-table-view .layui-table[lay-size=sm] .layui-table-expanded .layui-table-cell{height:auto;max-height:94px;white-space:normal;text-overflow:clip}.layui-table-cell-c{position:absolute;bottom:-10px;right:50%;margin-right:-9px;width:20px;height:20px;line-height:18px;cursor:pointer;text-align:center;background-color:#fff;border:1px solid #eee;border-radius:50%;z-index:1000;transition:.3s all;font-size:14px}.layui-table-cell-c:hover{border-color:#16b777}.layui-table-expanded td:hover .layui-table-cell{overflow:auto}.layui-table-main>.layui-table>tbody>tr:last-child>td>.layui-table-cell-c{bottom:0}body .layui-table-tips .layui-layer-content{background:0 0;padding:0;box-shadow:0 1px 6px rgba(0,0,0,.12)}.layui-table-tips-main{margin:-49px 0 0 -1px;max-height:150px;padding:8px 15px;font-size:14px;overflow-y:scroll;background-color:#fff;color:#5f5f5f}.layui-table-tips-c{position:absolute;right:-3px;top:-13px;width:20px;height:20px;padding:3px;cursor:pointer;background-color:#5f5f5f;border-radius:50%;color:#fff}.layui-table-tips-c:hover{background-color:#777}.layui-table-tips-c:before{position:relative;right:-2px}.layui-table-tree-nodeIcon{max-width:20px}.layui-table-tree-nodeIcon>*{width:100%}.layui-table-tree-flexIcon,.layui-table-tree-nodeIcon{margin-right:2px}.layui-table-tree-flexIcon{cursor:pointer}.layui-upload-file{display:none!important;opacity:.01;filter:Alpha(opacity=1)}.layui-upload-list{margin:11px 0}.layui-upload-choose{max-width:200px;padding:0 10px;color:#999;font-size:14px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-upload-drag{position:relative;display:inline-block;padding:30px;border:1px dashed #e2e2e2;background-color:#fff;text-align:center;cursor:pointer;color:#999}.layui-upload-drag .layui-icon{font-size:50px;color:#16baaa}.layui-upload-drag[lay-over]{border-color:#16baaa}.layui-upload-form{display:inline-block}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-wrap{position:relative;display:inline-block;vertical-align:middle}.layui-upload-wrap .layui-upload-file{display:block!important;position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-btn-container .layui-upload-choose{padding-left:0}.layui-menu{position:relative;margin:5px 0;background-color:#fff;box-sizing:border-box}.layui-menu *{box-sizing:border-box}.layui-menu li,.layui-menu-body-title,.layui-menu-body-title a{padding:5px 15px;color:initial}.layui-menu li{position:relative;margin:0 0 1px;line-height:26px;color:rgba(0,0,0,.8);font-size:14px;white-space:nowrap;cursor:pointer;transition:all .3s}.layui-menu li:hover{background-color:#f8f8f8}.layui-menu li.layui-disabled,.layui-menu li.layui-disabled *{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important}.layui-menu-item-parent:hover>.layui-menu-body-panel{display:block;animation-name:layui-fadein;animation-duration:.3s;animation-fill-mode:both;animation-delay:.2s}.layui-menu-item-group>.layui-menu-body-title,.layui-menu-item-parent>.layui-menu-body-title{padding-right:38px}.layui-menu .layui-menu-item-divider:hover,.layui-menu .layui-menu-item-group:hover,.layui-menu .layui-menu-item-none:hover{background:0 0;cursor:default}.layui-menu .layui-menu-item-group>ul{margin:5px 0 -5px}.layui-menu .layui-menu-item-group>.layui-menu-body-title{color:rgba(0,0,0,.35);user-select:none}.layui-menu .layui-menu-item-none{color:rgba(0,0,0,.35);cursor:default}.layui-menu .layui-menu-item-none{text-align:center}.layui-menu .layui-menu-item-divider{margin:5px 0;padding:0;height:0;line-height:0;border-bottom:1px solid #eee;overflow:hidden}.layui-menu .layui-menu-item-down:hover,.layui-menu .layui-menu-item-up:hover{cursor:pointer}.layui-menu .layui-menu-item-up>.layui-menu-body-title{color:rgba(0,0,0,.8)}.layui-menu .layui-menu-item-up>ul{visibility:hidden;height:0;overflow:hidden}.layui-menu .layui-menu-item-down>.layui-menu-body-title>.layui-icon-down{transform:rotate(180deg)}.layui-menu .layui-menu-item-up>.layui-menu-body-title>.layui-icon-up{transform:rotate(-180deg)}.layui-menu .layui-menu-item-down:hover>.layui-menu-body-title>.layui-icon,.layui-menu .layui-menu-item-up>.layui-menu-body-title:hover>.layui-icon{color:#000}.layui-menu .layui-menu-item-down>ul{visibility:visible;height:auto}.layui-menu .layui-menu-item-checked,.layui-menu .layui-menu-item-checked2{background-color:#f8f8f8!important;color:#16b777}.layui-menu .layui-menu-item-checked a,.layui-menu .layui-menu-item-checked2 a{color:#16b777}.layui-menu .layui-menu-item-checked:after{position:absolute;right:-1px;top:0;bottom:0;border-right:3px solid #16b777;content:""}.layui-menu-body-title{position:relative;margin:-5px -15px;overflow:hidden;text-overflow:ellipsis}.layui-menu-body-title a{display:block;margin:-5px -15px;color:rgba(0,0,0,.8)}.layui-menu-body-title a:hover{transition:all .3s}.layui-menu-body-title>.layui-icon{position:absolute;right:15px;top:50%;margin-top:-6px;line-height:normal;font-size:14px;transition:all .2s;-webkit-transition:all .2s}.layui-menu-body-title>.layui-icon:hover{transition:all .3s}.layui-menu-body-title>.layui-icon-right{right:14px}.layui-menu-body-panel{display:none;position:absolute;top:-7px;left:100%;z-index:1000;margin-left:13px;padding:5px 0}.layui-menu-body-panel:before{content:"";position:absolute;width:20px;left:-16px;top:0;bottom:0}.layui-menu-body-panel-left{left:auto;right:100%;margin:0 13px 0}.layui-menu-body-panel-left:before{left:auto;right:-16px}.layui-menu-lg li{line-height:32px}.layui-menu-lg .layui-menu-body-title a:hover,.layui-menu-lg li:hover{background:0 0;color:#16b777}.layui-menu-lg li .layui-menu-body-panel{margin-left:14px}.layui-menu-lg li .layui-menu-body-panel-left{margin:0 15px 0}.layui-dropdown{position:absolute;left:-999999px;top:-999999px;z-index:77777777;margin:5px 0;min-width:100px}.layui-dropdown:before{content:"";position:absolute;width:100%;height:6px;left:0;top:-6px}.layui-dropdown-shade{top:0;left:0;width:100%;height:100%;position:fixed;pointer-events:auto}.layui-tabs{position:relative}.layui-tabs.layui-hide-v{overflow:hidden}.layui-tabs-header{position:relative;left:0;height:40px;padding:0!important;white-space:nowrap;font-size:0;transition:all .16s;-webkit-transition:all .16s}.layui-tabs-header:after,.layui-tabs-scroll:after{content:"";position:absolute;left:0;bottom:0;z-index:0;width:100%;border-bottom:1px solid #eee}.layui-tabs-header li{position:relative;display:inline-block;vertical-align:middle;line-height:40px;margin:0!important;padding:0 16px;text-align:center;cursor:pointer;font-size:14px;transition:all .16s;-webkit-transition:all .16s}.layui-tabs-header li:first-child{margin-left:0}.layui-tabs-header li a{display:block;padding:0 16px;margin:0 -16px;color:inherit}.layui-tabs-header li a:hover{text-decoration:none}.layui-tabs-header .layui-this,.layui-tabs-header li:hover{color:#16baaa}.layui-tabs-header .layui-this:after{content:"";position:absolute;left:0;top:0;z-index:1;width:100%;height:100%;border-bottom:3px solid #16baaa;box-sizing:border-box;pointer-events:none}.layui-tabs-header .layui-badge,.layui-tabs-header .layui-badge-dot{left:5px;top:-1px}.layui-tabs-scroll{position:relative;overflow:hidden;padding:0 40px}.layui-tabs-scroll .layui-tabs-header:after{display:none;content:none;border:0}.layui-tabs-bar .layui-icon{position:absolute;left:0;top:0;z-index:3;width:40px;height:100%;line-height:40px;border:1px solid #eee;text-align:center;cursor:pointer;box-sizing:border-box;background-color:#fff;box-shadow:2px 0 5px 0 rgb(0 0 0 / 6%)}.layui-tabs-bar .layui-icon-next{left:auto;right:0;box-shadow:-2px 0 5px 0 rgb(0 0 0 / 6%)}.layui-tabs-header li .layui-tabs-close{position:relative;display:inline-block;width:16px;height:16px;line-height:18px;margin-left:8px;top:0;text-align:center;font-size:12px;color:#959595;border-radius:50%;font-weight:700;transition:all .16s;-webkit-transition:all .16s}.layui-tabs-header li .layui-tabs-close:hover{background-color:#ff5722;color:#fff}.layui-tabs-header li[lay-closable=false] .layui-tabs-close{display:none}.layui-tabs-body{padding:16px 0}.layui-tabs-item{display:none}.layui-tabs-card>.layui-tabs-header .layui-this{background-color:#fff}.layui-tabs-card>.layui-tabs-header .layui-this:after{border:1px solid #eee;border-bottom-color:#fff;border-radius:2px 2px 0 0}.layui-tabs-card>.layui-tabs-header li:first-child.layui-this:after{margin-left:-1px}.layui-tabs-card>.layui-tabs-header li:last-child.layui-this:after{margin-right:-1px}.layui-tabs-card.layui-panel>.layui-tabs-header .layui-this:after{border-top:0;border-radius:0}.layui-tabs-card.layui-panel>.layui-tabs-body{padding:16px}.layui-nav{position:relative;padding:0 15px;background-color:#2f363c;color:#fff;border-radius:2px;font-size:0;box-sizing:border-box}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;margin-top:0;list-style:none;vertical-align:middle;line-height:60px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#fff;color:rgba(255,255,255,.7);transition:all .3s;-webkit-transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar{content:"";position:absolute;left:0;top:0;width:0;height:3px;background-color:#16b777;transition:all .2s;-webkit-transition:all .2s;pointer-events:none}.layui-nav-bar{z-index:1000}.layui-nav[lay-bar=disabled] .layui-nav-bar{display:none}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff;text-decoration:none}.layui-nav .layui-this:after{top:auto;bottom:0;width:100%}.layui-nav-img{width:30px;height:30px;margin-right:10px;border-radius:50%}.layui-nav .layui-nav-more{position:absolute;top:0;right:3px;left:auto!important;margin-top:0;font-size:12px;cursor:pointer;transition:all .2s;-webkit-transition:all .2s}.layui-nav .layui-nav-mored,.layui-nav-itemed>a .layui-nav-more{transform:rotate(180deg)}.layui-nav-child{display:none;position:absolute;left:0;top:65px;min-width:100%;line-height:36px;padding:5px 0;box-shadow:0 2px 4px rgba(0,0,0,.12);border:1px solid #eee;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap;box-sizing:border-box}.layui-nav .layui-nav-child a{color:#5f5f5f;color:rgba(0,0,0,.8)}.layui-nav .layui-nav-child a:hover{background-color:#f8f8f8;color:rgba(0,0,0,.8)}.layui-nav-child dd{margin:1px 0;position:relative}.layui-nav-child dd.layui-this{background-color:#f8f8f8;color:#000}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-child-r{left:auto;right:0}.layui-nav-child-c{text-align:center}.layui-nav.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:40px}.layui-nav-tree .layui-nav-item a{position:relative;height:40px;line-height:40px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item>a{padding-top:5px;padding-bottom:5px}.layui-nav-tree .layui-nav-more{right:15px}.layui-nav-tree .layui-nav-item>a .layui-nav-more{padding:5px 0}.layui-nav-tree .layui-nav-bar{width:5px;height:0}.layui-side .layui-nav-tree .layui-nav-bar{width:2px}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-nav-child dd.layui-this a,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#16baaa;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{color:#fff!important}.layui-nav-tree .layui-nav-bar{background-color:#16baaa}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;background:0 0;background-color:rgba(0,0,0,.3);box-shadow:none}.layui-nav-tree .layui-nav-child dd{margin:0}.layui-nav-tree .layui-nav-child a{color:#fff;color:rgba(255,255,255,.7)}.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-itemed>.layui-nav-child,.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display:block}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-nav-tree.layui-bg-gray a,.layui-nav.layui-bg-gray .layui-nav-item a{color:#373737;color:rgba(0,0,0,.8)}.layui-nav-tree.layui-bg-gray .layui-nav-itemed>a{color:#000!important}.layui-nav.layui-bg-gray .layui-this a{color:#16b777}.layui-nav-tree.layui-bg-gray .layui-nav-child{padding-left:11px;background:0 0}.layui-nav-tree.layui-bg-gray .layui-nav-child dd.layui-this,.layui-nav-tree.layui-bg-gray .layui-nav-child dd.layui-this a,.layui-nav-tree.layui-bg-gray .layui-this,.layui-nav-tree.layui-bg-gray .layui-this>a{background:0 0!important;color:#16b777!important;font-weight:700}.layui-nav-tree.layui-bg-gray .layui-nav-bar{background-color:#16b777}.layui-breadcrumb{visibility:hidden;font-size:0}.layui-breadcrumb>*{font-size:14px}.layui-breadcrumb a{color:#999!important}.layui-breadcrumb a:hover{color:#16b777!important}.layui-breadcrumb a cite{color:#5f5f5f;font-style:normal}.layui-breadcrumb span[lay-separator]{margin:0 10px;color:#999}.layui-tab{margin:10px 0;text-align:left!important}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab .layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;transition:all .2s;-webkit-transition:all .2s}.layui-tab .layui-tab-title:after{content:"";border-bottom-color:#eee;border-bottom-width:1px;border-style:none none solid;bottom:0;left:0;right:auto;top:auto;pointer-events:none;position:absolute;width:100%;z-index:8}.layui-tab .layui-tab-title li{display:inline-block;vertical-align:middle;font-size:14px;transition:all .2s;-webkit-transition:all .2s}.layui-tab .layui-tab-title li{position:relative;line-height:40px;min-width:65px;margin:0;padding:0 15px;text-align:center;cursor:pointer}.layui-tab .layui-tab-title li a{display:block;padding:0 15px;margin:0 -15px}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:"";width:100%;height:40px;border-width:1px;border-bottom-width:1px;border-style:solid;border-bottom-color:#fff;border-radius:2px 2px 0 0;box-sizing:border-box;pointer-events:none;z-index:9}.layui-tab-bar{box-sizing:border-box;position:absolute;right:0;top:0;z-index:10;width:30px;height:40px;line-height:40px;border-width:1px;border-style:solid;border-radius:2px;text-align:center;background-color:#fff;cursor:pointer}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item{display:none}.layui-tab-more{padding-right:30px;height:auto!important;white-space:normal!important}.layui-tab-more li.layui-this:after{border-bottom-color:#eee;border-radius:2px}.layui-tab-more .layui-tab-bar .layui-icon{top:-2px;top:3px\0;-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root .layui-tab-more .layui-tab-bar .layui-icon{top:-2px\0/IE9}.layui-tab-content{padding:15px 0}.layui-tab-title li .layui-tab-close{position:relative;display:inline-block;width:18px;height:18px;line-height:20px;margin-left:8px;top:1px;text-align:center;font-size:14px;color:#c2c2c2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li .layui-tab-close:hover{border-radius:2px;background-color:#ff5722;color:#fff}.layui-tab-brief>.layui-tab-title .layui-this{color:#16baaa}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after{border:none;border-radius:0;border-bottom:2px solid #16b777}.layui-tab-card{border-width:1px;border-style:solid;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#fafafa}.layui-tab-card>.layui-tab-title li{margin-right:-1px;margin-left:-1px}.layui-tab-card>.layui-tab-title .layui-this{background-color:#fff}.layui-tab-card>.layui-tab-title .layui-this:after{border-top:none;border-width:1px;border-bottom-color:#fff}.layui-tab-card>.layui-tab-title .layui-tab-bar{height:40px;line-height:40px;border-radius:0;border-top:none;border-right:none}.layui-tab-card>.layui-tab-more .layui-this{background:0 0;color:#16b777}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-timeline{padding-left:5px}.layui-timeline-item{position:relative;padding-bottom:20px}.layui-timeline-axis{position:absolute;left:-5px;top:0;z-index:10;width:20px;height:20px;line-height:20px;background-color:#fff;color:#16b777;border-radius:50%;text-align:center;cursor:pointer}.layui-timeline-axis:hover{color:#ff5722}.layui-timeline-item:before{content:"";position:absolute;left:5px;top:0;z-index:0;width:1px;height:100%}.layui-timeline-item:first-child:before{display:block}.layui-timeline-item:last-child:before{display:none}.layui-timeline-content{padding-left:25px}.layui-timeline-title{position:relative;margin-bottom:10px;line-height:22px}.layui-badge,.layui-badge-dot,.layui-badge-rim{position:relative;display:inline-block;padding:0 6px;font-size:12px;text-align:center;background-color:#ff5722;color:#fff;border-radius:2px}.layui-badge{height:18px;line-height:18px}.layui-badge-dot{width:8px;height:8px;padding:0;border-radius:50%}.layui-badge-rim{height:18px;line-height:18px;border-width:1px;border-style:solid;background-color:#fff;color:#5f5f5f}.layui-btn .layui-badge,.layui-btn .layui-badge-dot{margin-left:5px}.layui-nav .layui-badge,.layui-nav .layui-badge-dot{position:absolute;top:50%;margin:-5px 6px 0}.layui-nav .layui-badge{margin-top:-10px}.layui-tab-title .layui-badge,.layui-tab-title .layui-badge-dot{left:5px;top:-2px}.layui-carousel{position:relative;left:0;top:0;background-color:#f8f8f8}.layui-carousel>[carousel-item]{position:relative;width:100%;height:100%;overflow:hidden}.layui-carousel>[carousel-item]:before{position:absolute;content:'\e63d';left:50%;top:50%;width:100px;line-height:20px;margin:-10px 0 0 -50px;text-align:center;color:#c2c2c2;font-family:layui-icon!important;font-size:30px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-carousel>[carousel-item]>*{display:none;position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f8f8f8;transition-duration:.3s;-webkit-transition-duration:.3s}.layui-carousel-updown>*{-webkit-transition:.3s ease-in-out up;transition:.3s ease-in-out up}.layui-carousel-arrow{display:none\0;opacity:0;position:absolute;left:10px;top:50%;margin-top:-18px;width:36px;height:36px;line-height:36px;text-align:center;font-size:20px;border:none 0;border-radius:50%;background-color:rgba(0,0,0,.2);color:#fff;-webkit-transition-duration:.3s;transition-duration:.3s;cursor:pointer}.layui-carousel-arrow[lay-type=add]{left:auto!important;right:10px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow{opacity:1;left:20px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel[lay-arrow=none] .layui-carousel-arrow{display:none}.layui-carousel-arrow:hover,.layui-carousel-ind ul:hover{background-color:rgba(0,0,0,.35)}.layui-carousel:hover .layui-carousel-arrow{display:block\0;opacity:1;left:20px}.layui-carousel:hover .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel-ind{position:relative;top:-35px;width:100%;line-height:0!important;text-align:center;font-size:0}.layui-carousel[lay-indicator=outside]{margin-bottom:30px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind{top:10px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind ul{background-color:rgba(0,0,0,.5)}.layui-carousel[lay-indicator=none] .layui-carousel-ind{display:none}.layui-carousel-ind ul{display:inline-block;padding:5px;background-color:rgba(0,0,0,.2);border-radius:10px;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind ul li{display:inline-block;width:10px;height:10px;margin:0 3px;font-size:14px;background-color:#eee;background-color:rgba(255,255,255,.5);border-radius:50%;cursor:pointer;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind ul li:hover{background-color:rgba(255,255,255,.7)}.layui-carousel-ind ul li.layui-this{background-color:#fff}.layui-carousel>[carousel-item]>.layui-carousel-next,.layui-carousel>[carousel-item]>.layui-carousel-prev,.layui-carousel>[carousel-item]>.layui-this{display:block}.layui-carousel>[carousel-item]>.layui-this{-webkit-transform:translateX(0);transform:translateX(0)}.layui-carousel>[carousel-item]>.layui-carousel-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}.layui-carousel>[carousel-item]>.layui-carousel-next{-webkit-transform:translateX(100%);transform:translateX(100%)}.layui-carousel>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel>[carousel-item]>.layui-carousel-prev.layui-carousel-right{-webkit-transform:translateX(0);transform:translateX(0)}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-left{-webkit-transform:translateX(-100%);transform:translateX(-100%)}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-right{-webkit-transform:translateX(100%);transform:translateX(100%)}.layui-carousel[lay-anim=updown] .layui-carousel-arrow{left:50%!important;top:20px;margin:0 0 0 -18px}.layui-carousel[lay-anim=updown] .layui-carousel-arrow[lay-type=add]{top:auto!important;bottom:20px}.layui-carousel[lay-anim=updown] .layui-carousel-ind{position:absolute;top:50%;right:20px;width:auto;height:auto}.layui-carousel[lay-anim=updown] .layui-carousel-ind ul{padding:3px 5px}.layui-carousel[lay-anim=updown] .layui-carousel-ind li{display:block;margin:6px 0}.layui-carousel[lay-anim=updown]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this{-webkit-transform:translateY(0);transform:translateY(0)}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev{-webkit-transform:translateY(-100%);transform:translateY(-100%)}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next{-webkit-transform:translateY(100%);transform:translateY(100%)}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{-webkit-transform:translateY(0);transform:translateY(0)}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-left{-webkit-transform:translateY(-100%);transform:translateY(-100%)}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-right{-webkit-transform:translateY(100%);transform:translateY(100%)}.layui-carousel[lay-anim=fade]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev{opacity:0}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{opacity:1}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-right{opacity:0}.layui-fixbar{position:fixed;right:16px;bottom:16px;z-index:999999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;text-align:center;cursor:pointer;font-size:30px;background-color:#9f9f9f;color:#fff;border-radius:2px;opacity:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}body .layui-util-face .layui-layer-content{padding:0;background-color:#fff;color:#5f5f5f;box-shadow:none}.layui-util-face .layui-layer-TipsG{display:none}.layui-util-face ul{position:relative;width:372px;padding:10px;border:1px solid #d9d9d9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-util-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-code{display:block;position:relative;padding:15px;line-height:20px;border:1px solid #eee;border-left-width:6px;background-color:#fff;color:#333;font-family:"Courier New",Consolas,"Lucida Console",monospace;font-size:12px}.layui-transfer-box,.layui-transfer-header,.layui-transfer-search{border-width:0;border-style:solid;border-color:#eee}.layui-transfer-box{position:relative;display:inline-block;vertical-align:middle;border-width:1px;width:200px;height:360px;border-radius:2px;background-color:#fff}.layui-transfer-box .layui-form-checkbox{width:100%;margin:0!important}.layui-transfer-header{height:38px;line-height:38px;padding:0 11px;border-bottom-width:1px}.layui-transfer-search{position:relative;padding:11px;border-bottom-width:1px}.layui-transfer-search .layui-input{height:32px;padding-left:30px;font-size:12px}.layui-transfer-search .layui-icon-search{position:absolute;left:20px;top:50%;line-height:normal;margin-top:-8px;color:#5f5f5f}.layui-transfer-active{margin:0 15px;display:inline-block;vertical-align:middle}.layui-transfer-active .layui-btn{display:block;margin:0;padding:0 15px;background-color:#16b777;border-color:#16b777;color:#fff}.layui-transfer-active .layui-btn-disabled{background-color:#fbfbfb;border-color:#eee;color:#d2d2d2}.layui-transfer-active .layui-btn:first-child{margin-bottom:15px}.layui-transfer-active .layui-btn .layui-icon{margin:0;font-size:14px!important}.layui-transfer-data{padding:5px 0;overflow:auto}.layui-transfer-data li{height:32px;line-height:32px;margin-top:0!important;padding:0 11px;list-style-type:none!important}.layui-transfer-data li:hover{background-color:#f8f8f8;transition:.5s all}.layui-transfer-data .layui-none{padding:15px 11px;text-align:center;color:#999}.layui-rate,.layui-rate *{display:inline-block;vertical-align:middle}.layui-rate{padding:11px 6px 11px 0;font-size:0}.layui-rate li{margin-top:0!important}.layui-rate li i.layui-icon{font-size:20px;color:#ffb800}.layui-rate li i.layui-icon{margin-right:5px;transition:all .3s;-webkit-transition:all .3s}.layui-rate li i:hover,.layui-rate-hover{cursor:pointer;transform:scale(1.12);-webkit-transform:scale(1.12)}.layui-rate[readonly] li i:hover{cursor:default;transform:scale(1)}.layui-colorpicker{width:38px;height:38px;border:1px solid #eee;padding:5px;border-radius:2px;line-height:24px;display:inline-block;cursor:pointer;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-colorpicker:hover{border-color:#d2d2d2}.layui-colorpicker.layui-colorpicker-lg{width:44px;height:44px;line-height:30px}.layui-colorpicker.layui-colorpicker-sm{width:30px;height:30px;line-height:20px;padding:3px}.layui-colorpicker.layui-colorpicker-xs{width:22px;height:22px;line-height:16px;padding:1px}.layui-colorpicker-trigger-bgcolor{display:block;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);border-radius:2px}.layui-colorpicker-trigger-span{display:block;height:100%;box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:2px;text-align:center}.layui-colorpicker-trigger-i{display:inline-block;color:#fff;font-size:12px}.layui-colorpicker-trigger-i.layui-icon-close{color:#999}.layui-colorpicker-main{position:absolute;left:-999999px;top:-999999px;z-index:77777777;width:280px;margin:5px 0;padding:7px;background:#fff;border:1px solid #d2d2d2;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-colorpicker-main-wrapper{height:180px;position:relative}.layui-colorpicker-basis{width:260px;height:100%;position:relative;overflow:hidden}.layui-colorpicker-basis-white{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.layui-colorpicker-basis-black{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(0deg,#000,transparent)}.layui-colorpicker-basis-cursor{width:10px;height:10px;border:1px solid #fff;border-radius:50%;position:absolute;top:0;right:100%;cursor:pointer;transform:translate(-50%,-50%)}.layui-colorpicker-side{position:absolute;top:0;right:0;width:12px;height:100%;background:linear-gradient(red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.layui-colorpicker-side-slider{width:100%;height:5px;box-shadow:0 0 1px #888;box-sizing:border-box;background:#fff;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;left:0}.layui-colorpicker-main-alpha{display:none;height:12px;margin-top:7px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-alpha-bgcolor{height:100%;position:relative}.layui-colorpicker-alpha-slider{width:5px;height:100%;box-shadow:0 0 1px #888;box-sizing:border-box;background:#fff;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;top:0}.layui-colorpicker-main-pre{padding-top:7px;font-size:0}.layui-colorpicker-pre{width:20px;height:20px;border-radius:2px;display:inline-block;margin-left:6px;margin-bottom:7px;cursor:pointer}.layui-colorpicker-pre:nth-child(11n+1){margin-left:0}.layui-colorpicker-pre-isalpha{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-pre.layui-this{box-shadow:0 0 3px 2px rgba(0,0,0,.15)}.layui-colorpicker-pre>div{height:100%;border-radius:2px}.layui-colorpicker-main-input{text-align:right;padding-top:7px}.layui-colorpicker-main-input .layui-btn-container .layui-btn{margin:0 0 0 10px}.layui-colorpicker-main-input div.layui-inline{float:left;font-size:14px}.layui-colorpicker-main-input input.layui-input{width:168px;height:30px;color:#5f5f5f;padding-left:5px}.layui-slider{height:4px;background:#eee;border-radius:3px;position:relative;cursor:pointer}.layui-slider-bar{border-radius:3px;position:absolute;height:100%}.layui-slider-step{position:absolute;top:0;width:4px;height:4px;border-radius:50%;background:#fff;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.layui-slider-wrap{width:36px;height:36px;position:absolute;top:-16px;-webkit-transform:translateX(-50%);transform:translateX(-50%);z-index:10;text-align:center}.layui-slider-wrap-btn{width:12px;height:12px;border-radius:50%;background:#fff;display:inline-block;vertical-align:middle;cursor:pointer;transition:.3s}.layui-slider-wrap:after{content:"";height:100%;display:inline-block;vertical-align:middle}.layui-slider-wrap-btn.layui-slider-hover,.layui-slider-wrap-btn:hover{transform:scale(1.2)}.layui-slider-wrap-btn.layui-disabled:hover{transform:scale(1)!important}.layui-slider-tips{position:absolute;top:-42px;z-index:77777777;white-space:nowrap;-webkit-transform:translateX(-50%);transform:translateX(-50%);color:#fff;background:#000;border-radius:3px;height:25px;line-height:25px;padding:0 10px}.layui-slider-tips:after{content:"";position:absolute;bottom:-12px;left:50%;margin-left:-6px;width:0;height:0;border-width:6px;border-style:solid;border-color:#000 transparent transparent transparent}.layui-slider-input{width:70px;height:32px;border:1px solid #eee;border-radius:3px;font-size:16px;line-height:32px;position:absolute;right:0;top:-14px;box-sizing:border-box}.layui-slider-input-btn{position:absolute;top:0;right:0;width:20px;height:100%;border-left:1px solid #eee}.layui-slider-input-btn i{cursor:pointer;position:absolute;right:0;bottom:0;width:20px;height:50%;font-size:12px;line-height:16px;text-align:center;color:#999}.layui-slider-input-btn i:first-child{top:0;border-bottom:1px solid #eee}.layui-slider-input-txt{height:100%;font-size:14px}.layui-slider-input-txt input{height:100%;border:none;padding-right:21px}.layui-slider-input-btn i:hover{color:#16baaa}.layui-slider-vertical{width:4px;margin-left:33px}.layui-slider-vertical .layui-slider-bar{width:4px}.layui-slider-vertical .layui-slider-step{top:auto;left:0;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-wrap{top:auto;left:-16px;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-tips{top:auto;left:2px}@media \0screen{.layui-slider-wrap-btn{margin-left:-20px}.layui-slider-vertical .layui-slider-wrap-btn{margin-left:0;margin-bottom:-20px}.layui-slider-vertical .layui-slider-tips{margin-left:-8px}.layui-slider>span{margin-left:8px}}.layui-tree{line-height:22px}.layui-tree .layui-form-checkbox{margin:0!important}.layui-tree-set{width:100%;position:relative}.layui-tree-pack{display:none;padding-left:20px;position:relative}.layui-tree-line .layui-tree-pack{padding-left:27px}.layui-tree-line .layui-tree-set .layui-tree-set:after{content:"";position:absolute;top:14px;left:-9px;width:17px;height:0;border-top:1px dotted #c0c4cc}.layui-tree-entry{position:relative;padding:3px 0;height:26px;white-space:nowrap}.layui-tree-entry:hover{background-color:#eee}.layui-tree-line .layui-tree-entry:hover{background-color:rgba(0,0,0,0)}.layui-tree-line .layui-tree-entry:hover .layui-tree-txt{color:#999;text-decoration:underline;transition:.3s}.layui-tree-main{display:inline-block;vertical-align:middle;cursor:pointer;padding-right:10px}.layui-tree-line .layui-tree-set:before{content:"";position:absolute;top:0;left:-9px;width:0;height:100%;border-left:1px dotted #c0c4cc}.layui-tree-line .layui-tree-set.layui-tree-setLineShort:before{height:13px}.layui-tree-line .layui-tree-set.layui-tree-setHide:before{height:0}.layui-tree-iconClick{display:inline-block;vertical-align:middle;position:relative;height:20px;line-height:20px;margin:0 10px;color:#c0c4cc}.layui-tree-icon{height:14px;line-height:12px;width:14px;text-align:center;border:1px solid #c0c4cc}.layui-tree-iconClick .layui-icon{font-size:18px}.layui-tree-icon .layui-icon{font-size:12px;color:#5f5f5f}.layui-tree-iconArrow{padding:0 5px}.layui-tree-iconArrow:after{content:"";position:absolute;left:4px;top:3px;z-index:100;width:0;height:0;border-width:5px;border-style:solid;border-color:transparent transparent transparent #c0c4cc;transition:.5s}.layui-tree-spread>.layui-tree-entry .layui-tree-iconClick>.layui-tree-iconArrow:after{transform:rotate(90deg) translate(3px,4px)}.layui-tree-txt{display:inline-block;vertical-align:middle;color:#555}.layui-tree-search{margin-bottom:15px;color:#5f5f5f}.layui-tree-btnGroup{visibility:hidden;display:inline-block;vertical-align:middle;position:relative}.layui-tree-btnGroup .layui-icon{display:inline-block;vertical-align:middle;padding:0 2px;cursor:pointer}.layui-tree-btnGroup .layui-icon:hover{color:#999;transition:.3s}.layui-tree-entry:hover .layui-tree-btnGroup{visibility:visible}.layui-tree-editInput{position:relative;display:inline-block;vertical-align:middle;height:20px;line-height:20px;padding:0;border:none;background-color:rgba(0,0,0,.05)}.layui-tree-emptyText{text-align:center;color:#999}.layui-anim{-webkit-animation-duration:.3s;-webkit-animation-fill-mode:both;animation-duration:.3s;animation-fill-mode:both}.layui-anim.layui-icon{display:inline-block}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.layui-trans,.layui-trans a{transition:all .2s;-webkit-transition:all .2s}@-webkit-keyframes layui-rotate{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes layui-rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}.layui-anim-rotate{-webkit-animation-name:layui-rotate;animation-name:layui-rotate;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes layui-up{from{-webkit-transform:translate3d(0,100%,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-up{from{transform:translate3d(0,100%,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-up{-webkit-animation-name:layui-up;animation-name:layui-up}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,15px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,15px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@keyframes layui-down{0%{opacity:.3;transform:translate3d(0,-100%,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-down{animation-name:layui-down}@keyframes layui-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-downbit{animation-name:layui-downbit}@-webkit-keyframes layui-scale{0%{opacity:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.3;-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scale{-webkit-animation-name:layui-scale;animation-name:layui-scale}@-webkit-keyframes layui-scale-spring{0%{opacity:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;transform:scale(.5)}80%{opacity:.8;transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@keyframes layui-scalesmall{0%{opacity:.3;transform:scale(1.5)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall{animation-name:layui-scalesmall}@keyframes layui-scalesmall-spring{0%{opacity:.3;transform:scale(1.5)}80%{opacity:.8;transform:scale(.9)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall-spring{animation-name:layui-scalesmall-spring}@-webkit-keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}@keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}.layui-anim-fadein{-webkit-animation-name:layui-fadein;animation-name:layui-fadein}@-webkit-keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}.layui-anim-fadeout{-webkit-animation-name:layui-fadeout;animation-name:layui-fadeout}html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-wrap{font-size:13px;font-family:"Courier New",Consolas,"Lucida Console",monospace}.layui-code-view{display:block;position:relative;padding:0!important;border:1px solid #eee;border-left-width:6px;background-color:#fff;color:#333}.layui-code-view pre{margin:0!important}.layui-code-header{position:relative;z-index:3;padding:0 11px;height:40px;line-height:40px;border-bottom:1px solid #eee;background-color:#fafafa;font-size:12px}.layui-code-header>.layui-code-header-about{position:absolute;right:11px;top:0;color:#b7b7b7}.layui-code-header-about>a{padding-left:10px}.layui-code-wrap{position:relative;display:block;z-index:1;margin:0!important;padding:11px 0!important;overflow-x:hidden;overflow-y:auto}.layui-code-line{position:relative;line-height:19px;margin:0!important}.layui-code-line-number{position:absolute;left:0;top:0;padding:0 8px;min-width:45px;height:100%;text-align:right;user-select:none;white-space:nowrap;overflow:hidden}.layui-code-line-content{padding:0 11px;word-wrap:break-word;white-space:pre-wrap}.layui-code-ln-mode>.layui-code-wrap>.layui-code-line{padding-left:45px}.layui-code-ln-side{position:absolute;left:0;top:0;bottom:0;z-index:0;width:45px;border-right:1px solid #eee;border-color:rgb(126 122 122 / 15%);background-color:#fafafa;pointer-events:none}.layui-code-nowrap>.layui-code-wrap{overflow:auto}.layui-code-nowrap>.layui-code-wrap>.layui-code-line>.layui-code-line-content{white-space:pre;word-wrap:normal}.layui-code-nowrap>.layui-code-ln-side{border-right-width:0!important;background:0 0!important}.layui-code-fixbar{position:absolute;top:8px;right:11px;padding-right:45px;z-index:5}.layui-code-fixbar>span{position:absolute;right:0;top:0;padding:0 8px;color:#777;transition:all .3s}.layui-code-fixbar>span:hover{color:#16b777}.layui-code-copy{display:none;cursor:pointer}.layui-code-preview>.layui-code-view>.layui-code-fixbar .layui-code-copy{display:none!important}.layui-code-view:hover>.layui-code-fixbar .layui-code-copy{display:block}.layui-code-view:hover>.layui-code-fixbar .layui-code-lang-marker{display:none}.layui-code-theme-dark,.layui-code-theme-dark>.layui-code-header{border-color:rgb(126 122 122 / 15%);background-color:#1f1f1f}.layui-code-theme-dark{border-width:1px;color:#ccc}.layui-code-theme-dark>.layui-code-ln-side{border-right-color:#2a2a2a;background:0 0;color:#6e7681}.layui-code textarea{display:none}.layui-code-preview>.layui-code,.layui-code-preview>.layui-code-view{margin:0}.layui-code-preview>.layui-tab{position:relative;z-index:1;margin-bottom:0}.layui-code-preview .layui-code-item{display:none;border-top-width:0}.layui-code-item-preview{position:relative;padding:16px}.layui-code-item-preview>iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:none}.layui-code-tools{position:absolute;right:11px;top:8px;line-height:normal}.layui-code-tools>i{display:inline-block;margin-left:6px;padding:3px;cursor:pointer}.layui-code-tools>i.layui-icon-file-b{color:#999}.layui-code-tools>i:hover{color:#16b777}.layui-code-full{position:fixed;left:0;top:0;z-index:1111111;width:100%;height:100%;background-color:#fff}.layui-code-full .layui-code-item{width:100%!important;border-width:0!important}.layui-code-full .layui-code-item,.layui-code-full .layui-code-view,.layui-code-full .layui-code-wrap{height:calc(100vh - 51px)!important;box-sizing:border-box}.layui-code-full .layui-code-item-preview{overflow:auto}.layui-code-view.layui-code-hl{line-height:20px!important;border-left-width:1px}.layui-code-view.layui-code-hl>.layui-code-ln-side{background-color:transparent}.layui-code-theme-dark.layui-code-hl,.layui-code-theme-dark.layui-code-hl>.layui-code-ln-side{border-color:rgb(126 122 122 / 15%)}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate,.layui-laydate *{box-sizing:border-box}.layui-laydate{position:absolute;z-index:99999999;margin:5px 0;border-radius:2px;font-size:14px;line-height:normal;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}.layui-laydate-shade{top:0;left:0;width:100%;height:100%;position:fixed;pointer-events:auto}@keyframes laydate-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-laydate{animation-name:laydate-downbit}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;padding:0 5px;color:#999;font-size:18px;cursor:pointer}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;box-sizing:border-box;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-set-ym span{padding:0 10px;cursor:pointer}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:0;text-align:center}.layui-laydate-content th{font-weight:400}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.laydate-day-holidays:before{position:absolute;left:0;top:0;font-size:12px;transform:scale(.7)}.laydate-day-holidays:before{content:'\4F11';color:#ff5722}.laydate-day-holidays[type=workdays]:before{content:'\73ED';color:inherit}.layui-laydate .layui-this .laydate-day-holidays:before{color:#fff}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px}.layui-laydate-footer span{display:inline-block;vertical-align:top;height:26px;line-height:24px;padding:0 10px;border:1px solid #c9c9c9;border-radius:2px;background-color:#fff;font-size:12px;cursor:pointer;white-space:nowrap;transition:all .3s}.layui-laydate-footer span:hover{color:#16b777}.layui-laydate-footer span.layui-laydate-preview{cursor:default;border-color:transparent!important}.layui-laydate-footer span.layui-laydate-preview:hover{color:#777}.layui-laydate-footer span:first-child.layui-laydate-preview{padding-left:0}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{margin:0 0 0 -1px;border-radius:0}.laydate-footer-btns span:first-child{border-radius:2px 0 0 2px}.laydate-footer-btns span:last-child{border-radius:0 2px 2px 0}.layui-laydate-shortcut{width:80px;padding:6px 0;display:inline-block;vertical-align:top;overflow:auto;max-height:276px;text-align:center}.layui-laydate-shortcut+.layui-laydate-main{display:inline-block;border-left:1px solid #e2e2e2}.layui-laydate-shortcut>li{padding:5px 8px;cursor:pointer;line-height:18px}.layui-laydate .layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;box-sizing:border-box;background-color:#fff}.layui-laydate .layui-laydate-list>li{position:relative;display:inline-block;width:33.3%;height:36px;line-height:36px;margin:3px 0;vertical-align:middle;text-align:center;cursor:pointer;list-style:none}.layui-laydate .laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list{display:table}.layui-laydate .laydate-time-list>li{display:table-cell;height:100%;margin:0;line-height:normal;cursor:default}.layui-laydate .laydate-time-list p{position:relative;top:-4px;margin:0;line-height:29px}.layui-laydate .laydate-time-list ol{height:181px;overflow:hidden}.layui-laydate .laydate-time-list>li:hover ol{overflow-y:auto}.layui-laydate .laydate-time-list ol li{width:130%;padding-left:33px;height:30px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate .laydate-time-list-hide-1 ol li{padding-left:53px}.layui-laydate .laydate-time-list-hide-2 ol li{padding-left:117px}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px;color:#ff5722}.layui-laydate-range{width:546px}.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle;max-width:50%}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content,.layui-laydate-range .laydate-main-list-1 .layui-laydate-header{border-left:1px solid #e2e2e2}.layui-laydate-range.layui-laydate-linkage .laydate-main-list-0 .laydate-next-m,.layui-laydate-range.layui-laydate-linkage .laydate-main-list-0 .laydate-next-y,.layui-laydate-range.layui-laydate-linkage .laydate-main-list-1 .laydate-prev-m,.layui-laydate-range.layui-laydate-linkage .laydate-main-list-1 .laydate-prev-y{display:none}.layui-laydate-range.layui-laydate-linkage .laydate-main-list-1 .layui-laydate-content,.layui-laydate-range.layui-laydate-linkage .laydate-main-list-1 .layui-laydate-header{border-left-style:dashed}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#777}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#16b777}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{color:#333}.layui-laydate-content td{color:#777}.layui-laydate-content td.laydate-day-now{color:#16b777}.layui-laydate-content td.laydate-day-now:after{content:'';position:absolute;width:100%;height:30px;left:0;top:0;border:1px solid #16b777;box-sizing:border-box}.layui-laydate-linkage .layui-laydate-content td.laydate-selected>div{background-color:#cffae9;transition:all .3s}.layui-laydate-linkage .laydate-selected:hover>div{background-color:#cffae9!important}.layui-laydate-content td.laydate-selected:after,.layui-laydate-content td:hover:after{content:none}.layui-laydate-content td>div:hover,.layui-laydate-list li:hover,.layui-laydate-shortcut>li:hover{background-color:#eee;color:#333;transition:all .3s}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.layui-laydate-linkage .laydate-selected.laydate-day-next>div,.layui-laydate-linkage .laydate-selected.laydate-day-prev>div{background:0 0!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#ff5722}.laydate-day-mark::after{background-color:#16b777}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#16b777}.layui-laydate .layui-this,.layui-laydate .layui-this>div{background-color:#16b777!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.layui-laydate .layui-this.laydate-disabled,.layui-laydate .layui-this.laydate-disabled>div{background-color:#eee!important}.layui-laydate-content td>div{padding:7px 0;height:100%}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#16baaa}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-molv .layui-this,.laydate-theme-molv .layui-this>div{background-color:#16baaa!important}.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead{border:1px solid #e2e2e2}.layui-laydate-linkage.laydate-theme-grid .laydate-selected,.layui-laydate-linkage.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#16baaa!important}.layui-laydate-linkage.laydate-theme-grid .laydate-selected.laydate-day-next,.layui-laydate-linkage.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px}.laydate-theme-grid .layui-laydate-content td>div{height:29px;margin-top:-1px}.laydate-theme-circle .layui-laydate-content td.layui-this>div,.laydate-theme-circle .layui-laydate-content td>div{width:28px;height:28px;line-height:28px;border-radius:14px;margin:0 4px;padding:0}.layui-laydate.laydate-theme-circle .layui-laydate-content table td.layui-this{background-color:transparent!important}.laydate-theme-grid.laydate-theme-circle .layui-laydate-content td>div{margin:0 3.5px}.laydate-theme-fullpanel .layui-laydate-main{width:526px}.laydate-theme-fullpanel .layui-laydate-list{width:252px;left:272px}.laydate-theme-fullpanel .laydate-set-ym span{display:none}.laydate-theme-fullpanel .laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-theme-fullpanel .laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-theme-fullpanel .laydate-time-show .layui-laydate-header .layui-icon{display:inline-block!important}.laydate-theme-fullpanel .laydate-btns-time{display:none}.laydate-theme-fullpanel .laydate-time-list-hide-1 ol li{padding-left:49px}.laydate-theme-fullpanel .laydate-time-list-hide-2 ol li{padding-left:107px}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{opacity:0;transition:opacity .35s cubic-bezier(.34,.69,.1,1);top:0;left:0;width:100%;height:100%}.layui-layer{-webkit-overflow-scrolling:touch}.layui-layer{top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #b2b2b2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(data:image/gif;base64,R0lGODlhJQAlAJECAL3L2AYrTv///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgACACwAAAAAJQAlAAACi5SPqcvtDyGYIFpF690i8xUw3qJBwUlSadmcLqYmGQu6KDIeM13beGzYWWy3DlB4IYaMk+Dso2RWkFCfLPcRvFbZxFLUDTt21BW56TyjRep1e20+i+eYMR145W2eefj+6VFmgTQi+ECVY8iGxcg35phGo/iDFwlTyXWphwlm1imGRdcnuqhHeop6UAAAIfkEBQoAAgAsEAACAAQACwAAAgWMj6nLXAAh+QQFCgACACwVAAUACgALAAACFZQvgRi92dyJcVJlLobUdi8x4bIhBQAh+QQFCgACACwXABEADAADAAACBYyPqcsFACH5BAUKAAIALBUAFQAKAAsAAAITlGKZwWoMHYxqtmplxlNT7ixGAQAh+QQFCgACACwQABgABAALAAACBYyPqctcACH5BAUKAAIALAUAFQAKAAsAAAIVlC+BGL3Z3IlxUmUuhtR2LzHhsiEFACH5BAUKAAIALAEAEQAMAAMAAAIFjI+pywUAIfkEBQoAAgAsBQAFAAoACwAAAhOUYJnAagwdjGq2amXGU1PuLEYBACH5BAUKAAIALBAAAgAEAAsAAAIFhI+py1wAIfkEBQoAAgAsFQAFAAoACwAAAhWUL4AIvdnciXFSZS6G1HYvMeGyIQUAIfkEBQoAAgAsFwARAAwAAwAAAgWEj6nLBQAh+QQFCgACACwVABUACgALAAACE5RgmcBqDB2MarZqZcZTU+4sRgEAIfkEBQoAAgAsEAAYAAQACwAAAgWEj6nLXAAh+QQFCgACACwFABUACgALAAACFZQvgAi92dyJcVJlLobUdi8x4bIhBQAh+QQFCgACACwBABEADAADAAACBYSPqcsFADs=) #fff center center no-repeat}.layui-layer-btn a,.layui-layer-setwin span{display:inline-block;vertical-align:middle}.layui-layer-move{display:none;position:fixed;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@-webkit-keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@keyframes layer-slide-down{from{transform:translate3d(0,-100%,0)}to{transform:translate3d(0,0,0)}}@keyframes layer-slide-down-out{from{transform:translate3d(0,0,0)}to{transform:translate3d(0,-100%,0)}}.layer-anim-slide-down{animation-name:layer-slide-down}.layer-anim-slide-down-out{animation-name:layer-slide-down-out}@keyframes layer-slide-left{from{transform:translate3d(100%,0,0)}to{transform:translate3d(0,0,0)}}@keyframes layer-slide-left-out{from{transform:translate3d(0,0,0)}to{transform:translate3d(100%,0,0)}}.layer-anim-slide-left{animation-name:layer-slide-left}.layer-anim-slide-left-out{animation-name:layer-slide-left-out}@keyframes layer-slide-up{from{transform:translate3d(0,100%,0)}to{transform:translate3d(0,0,0)}}@keyframes layer-slide-up-out{from{transform:translate3d(0,0,0)}to{transform:translate3d(0,100%,0)}}.layer-anim-slide-up{animation-name:layer-slide-up}.layer-anim-slide-up-out{animation-name:layer-slide-up-out}@keyframes layer-slide-right{from{transform:translate3d(-100%,0,0)}to{transform:translate3d(0,0,0)}}@keyframes layer-slide-right-out{from{transform:translate3d(0,0,0)}to{transform:translate3d(-100%,0,0)}}.layer-anim-slide-right{animation-name:layer-slide-right}.layer-anim-slide-right-out{animation-name:layer-slide-right-out}.layui-layer-title{padding:0 81px 0 16px;height:50px;line-height:50px;border-bottom:1px solid #f0f0f0;font-size:14px;color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;top:16px;font-size:0;line-height:initial}.layui-layer-setwin span{position:relative;width:16px;height:16px;line-height:18px;margin-left:10px;text-align:center;font-size:16px;cursor:pointer;color:#000;_overflow:hidden;box-sizing:border-box}.layui-layer-setwin .layui-layer-min:before{content:'';position:absolute;width:12px;border-bottom:1px solid #2e2d3c;left:50%;top:50%;margin:-.5px 0 0 -6px;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover:before{background-color:#2d93ca}.layui-layer-setwin .layui-layer-max:after,.layui-layer-setwin .layui-layer-max:before{content:'';position:absolute;left:50%;top:50%;z-index:1;width:9px;height:9px;margin:-5px 0 0 -5px;border:1px solid #2e2d3c}.layui-layer-setwin .layui-layer-max:hover:after,.layui-layer-setwin .layui-layer-max:hover:before{border-color:#2d93ca}.layui-layer-setwin .layui-layer-min:hover:before{background-color:#2d93ca}.layui-layer-setwin .layui-layer-maxmin:after,.layui-layer-setwin .layui-layer-maxmin:before{width:7px;height:7px;margin:-3px 0 0 -3px;background-color:#fff}.layui-layer-setwin .layui-layer-maxmin:after{z-index:0;margin:-5px 0 0 -1px}.layui-layer-setwin .layui-layer-close{cursor:pointer}.layui-layer-setwin .layui-layer-close:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;color:#fff;background-color:#787878;padding:3px;border:3px solid;width:28px;height:28px;font-size:16px;font-weight:bolder;border-radius:50%;margin-left:0}.layui-layer-setwin .layui-layer-close2:hover{opacity:unset;background-color:#3888f6}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:30px;line-height:30px;margin:5px 5px 0;padding:0 16px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none;box-sizing:border-box}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:transparent;background-color:#1e9fff;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-btn-is-loading{opacity:.5!important;cursor:not-allowed!important;cursor:wait!important;overflow:hidden;white-space:nowrap;-webkit-user-select:none;-ms-user-select:none;user-select:none}.layui-layer-btn-is-loading .layui-layer-btn-loading-icon{margin-right:8px;font-size:14px}.layui-layer-dialog{min-width:240px}.layui-layer-dialog .layui-layer-content{position:relative;padding:16px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-face{position:absolute;top:18px;left:16px;color:#959595;font-size:32px;_left:-40px}.layui-layer-dialog .layui-layer-content .layui-icon-tips{color:#f39b12}.layui-layer-dialog .layui-layer-content .layui-icon-success{color:#16b777}.layui-layer-dialog .layui-layer-content .layui-icon-error{top:19px;color:#ff5722}.layui-layer-dialog .layui-layer-content .layui-icon-question{color:#ffb800}.layui-layer-dialog .layui-layer-content .layui-icon-lock{color:#787878}.layui-layer-dialog .layui-layer-content .layui-icon-face-cry{color:#ff5722}.layui-layer-dialog .layui-layer-content .layui-icon-face-smile{color:#16b777}.layui-layer-rim{border:6px solid #8d8d8d;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #d3d4d3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-close{color:#fff}.layui-layer-hui .layui-layer-content{padding:11px 24px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:18px 24px 18px 58px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:76px;height:38px;line-height:38px;text-align:center}.layui-layer-loading-icon{font-size:38px;color:#959595}.layui-layer-loading2{text-align:center}.layui-layer-loading-2{position:relative;height:38px}.layui-layer-loading-2:after,.layui-layer-loading-2:before{content:'';position:absolute;left:50%;top:50%;width:38px;height:38px;margin:-19px 0 0 -19px;border-radius:50%;border:3px solid #d2d2d2;box-sizing:border-box}.layui-layer-loading-2:after{border-color:transparent;border-left-color:#1e9fff}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan .layui-layer-title{background:#4476a7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;border-top:1px solid #e9e7e7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#e9e7e7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#c9c5c5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92b8b1}.layui-layer-lan .layui-layer-setwin .layui-icon,.layui-layer-molv .layui-layer-setwin .layui-icon{color:#fff}.layui-layer-win10{border:1px solid #aaa;box-shadow:1px 1px 6px rgba(0,0,0,.3);border-radius:none}.layui-layer-win10 .layui-layer-title{height:32px;line-height:32px;padding-left:8px;border-bottom:none;font-size:12px}.layui-layer-win10 .layui-layer-setwin{right:0;top:0}.layui-layer-win10 .layui-layer-setwin span{margin-left:0;width:32px;height:32px;padding:8px}.layui-layer-win10.layui-layer-page .layui-layer-setwin span{width:38px}.layui-layer-win10 .layui-layer-setwin span:hover{background-color:#e5e5e5}.layui-layer-win10 .layui-layer-setwin span.layui-icon-close:hover{background-color:#e81123;color:#fff}.layui-layer-win10.layui-layer-dialog .layui-layer-content{padding:8px 16px 32px;color:#0033bc}.layui-layer-win10.layui-layer-dialog .layui-layer-padding{padding-top:18px;padding-left:58px}.layui-layer-win10 .layui-layer-btn{padding:5px 5px 10px;border-top:1px solid #dfdfdf;background-color:#f0f0f0}.layui-layer-win10 .layui-layer-btn a{height:20px;line-height:18px;background-color:#e1e1e1;border-color:#adadad;color:#000;font-size:12px;transition:all .3s}.layui-layer-win10 .layui-layer-btn a:hover{border-color:#2a8edd;background-color:#e5f1fb}.layui-layer-win10 .layui-layer-btn .layui-layer-btn0{border-color:#0078d7}.layui-layer-prompt .layui-layer-input{display:block;width:260px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:16px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;display:inline-block;vertical-align:top;border-left:1px solid transparent;border-right:1px solid transparent;min-width:80px;max-width:300px;padding:0 16px;text-align:center;cursor:default;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:51px;border-left-color:#eee;border-right-color:#eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left-color:transparent}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{background:0 0;box-shadow:none}.layui-layer-photos .layui-layer-content{overflow:visible;text-align:center}.layui-layer-photos .layer-layer-photos-main img{position:relative;width:100%;display:inline-block;vertical-align:top}.layui-layer-photos-next,.layui-layer-photos-prev{position:fixed;top:50%;width:52px;height:52px;line-height:52px;margin-top:-26px;cursor:pointer;font-size:52px;color:#717171}.layui-layer-photos-prev{left:32px}.layui-layer-photos-next{right:32px}.layui-layer-photos-next:hover,.layui-layer-photos-prev:hover{color:#959595}.layui-layer-photos-toolbar{position:fixed;left:0;right:0;bottom:0;width:100%;height:52px;line-height:52px;background-color:rgba(0,0,0,.32);color:#fff;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;font-size:0}.layui-layer-photos-toolbar>*{display:inline-block;vertical-align:top;padding:0 16px;font-size:12px;color:#fff}.layui-layer-photos-toolbar *{font-size:12px}.layui-layer-photos-header{top:0;bottom:auto}.layui-layer-photos-header>span{cursor:pointer}.layui-layer-photos-header>span:hover{background-color:rgba(51,51,51,.32)}.layui-layer-photos-header .layui-icon{font-size:18px}.layui-layer-photos-footer>h3{max-width:65%;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-layer-photos-footer a:hover{text-decoration:underline}.layui-layer-photos-footer em{font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s} \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/layuiv2/font/iconfont.eot b/AdminSrc/AdminHost/wwwroot/admin/layuiv2/font/iconfont.eot new file mode 100644 index 0000000..3164c9f Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layuiv2/font/iconfont.eot differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layuiv2/font/iconfont.svg b/AdminSrc/AdminHost/wwwroot/admin/layuiv2/font/iconfont.svg new file mode 100644 index 0000000..5151073 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layuiv2/font/iconfont.svg @@ -0,0 +1,409 @@ + + + + Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AdminSrc/AdminHost/wwwroot/admin/layuiv2/font/iconfont.ttf b/AdminSrc/AdminHost/wwwroot/admin/layuiv2/font/iconfont.ttf new file mode 100644 index 0000000..8f49efb Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layuiv2/font/iconfont.ttf differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layuiv2/font/iconfont.woff b/AdminSrc/AdminHost/wwwroot/admin/layuiv2/font/iconfont.woff new file mode 100644 index 0000000..62d3491 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layuiv2/font/iconfont.woff differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layuiv2/font/iconfont.woff2 b/AdminSrc/AdminHost/wwwroot/admin/layuiv2/font/iconfont.woff2 new file mode 100644 index 0000000..a3d8774 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/admin/layuiv2/font/iconfont.woff2 differ diff --git a/AdminSrc/AdminHost/wwwroot/admin/layuiv2/layui.js b/AdminSrc/AdminHost/wwwroot/admin/layuiv2/layui.js new file mode 100644 index 0000000..af940c9 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/layuiv2/layui.js @@ -0,0 +1 @@ +/** v2.11.2 | MIT Licensed */;!function(h){"use strict";var e,d=h.document,v=h.location,m={timeout:10,debug:!1,version:!1},g={modules:{},status:{},event:{},callback:{}},r=function(){this.v="2.11.2"},t=h.LAYUI_GLOBAL||{},b=(e=d.currentScript&&"SCRIPT"===d.currentScript.tagName.toUpperCase()?d.currentScript.src:function(){for(var e,t=d.getElementsByTagName("script"),n=t.length-1,r=n;01e3*m.timeout/5?j(o+" is not a valid module","error"):void((i?layui[o]=h[a.api]:g.status[o])?u():setTimeout(t,5))}()},0===n.length||layui["layui.all"]&&E[o]?u():(p=i?a.src:a,y=(E[o]?y+"modules/":p?"":m.base)+(p=(p=p||o).replace(/\s/g,"").replace(/\.js[^\/\.]*$/,""))+".js",!g.modules[o]&&layui[o]&&(g.modules[o]=y),g.modules[o]?c():(l=d.getElementsByTagName("head")[0],(s=d.createElement("script"))["async"]=!0,s.charset="utf-8",s.src=y+((p=!0===m.version?m.v||(new Date).getTime():m.version||"")?"?v="+p:""),l.appendChild(s),N(s,function(){l.removeChild(s),c()},function(){l.removeChild(s)}),g.modules[o]=y))),f},r.prototype.modules=Object.assign({},E),r.prototype.extend=function(e){var t,n,r=m.base||"",o=/^\{\/\}/;for(t in e=e||{})this[t]||this.modules[t]?j("the "+t+" module already exists, extend failure"):("string"==typeof(n=e[t])&&(n=((r=o.test(n)?"":r)+n).replace(o,"")),this.modules[t]=n);return this},r.prototype.disuse=function(e){var n=this;return e=n.isArray(e)?e:[e],n.each(e,function(e,t){delete n[t],delete E[t],delete n.modules[t],delete g.status[t],delete g.modules[t]}),n},r.prototype.getStyle=function(e,t){e=e.currentStyle||h.getComputedStyle(e,null);return e.getPropertyValue?e.getPropertyValue(t):e.getAttribute(t.replace(/-(\w)/g,function(e,t){return t?t.toUpperCase():""}))},r.prototype.link=function(n,r,o){var a,i=this,e=d.getElementsByTagName("head")[0],t="function"==typeof r;if("string"==typeof r&&(o=r),"object"==typeof n)return a="array"===i.type(o),i.each(n,function(e,t){i.link(t,e===n.length-1&&r,a&&o[e])});o="layuicss-"+(o=o||n.replace(/^(#|(http(s?)):\/\/|\/\/)|\.|\/|\?.+/g,""));var u=d.getElementById(o);return u||((u=d.createElement("link")).href=n+(m.debug?"?v="+(new Date).getTime():""),u.rel="stylesheet",u.id=o,e.appendChild(u)),"complete"===u.__lay_readyState__?t&&r(u):N(u,function(){u.__lay_readyState__="complete",t&&r(u)},function(){j(n+" load error","error"),e.removeChild(u)}),i},r.prototype.addcss=function(e,t,n){return layui.link(m.dir+"css/"+e,t,n)},r.prototype.factory=function(e){if(layui[e])return"function"==typeof m.callback[e]?m.callback[e]:null},r.prototype.img=function(e,t,n){var r=new Image;if(r.src=e,r.complete)return t(r);r.onload=function(){r.onload=null,"function"==typeof t&&t(r)},r.onerror=function(e){r.onerror=null,"function"==typeof n&&n(e)}},r.prototype.router=r.prototype.hash=function(e){var n={path:[],pathname:[],search:{},hash:((e=e||v.hash).match(/[^#](#.*$)/)||[])[1]||"",href:""};return/^#/.test(e)&&(e=e.replace(/^#/,""),e=(n.href=e).replace(/([^#])(#.*$)/,"$1").split("/")||[],this.each(e,function(e,t){/^\w+=/.test(t)?(t=t.split("="),n.search[t[0]]=t[1]):n.path.push(t)}),n.pathname=n.path),n},r.prototype.url=function(e){var o,t,n=this;return{pathname:(e?((e.match(/\.[^.]+?\/.+/)||[])[0]||"").replace(/^[^\/]+/,"").replace(/\?.+/,""):v.pathname).replace(/^\//,"").split("/"),search:(o={},t=(e?((e.match(/\?.+/)||[])[0]||"").replace(/\#.+/,""):v.search).replace(/^\?+/,"").split("&"),n.each(t,function(e,t){var n=t.indexOf("="),r=n<0?t.substr(0,t.length):0!==n&&t.substr(0,n);r&&(o[r]=0(d.innerHeight||h.documentElement.clientHeight)},p.getStyleRules=function(t,n){if(t)return t=(t=t.sheet||t.styleSheet||{}).cssRules||t.rules,"function"==typeof n&&layui.each(t,function(t,e){if(n(e,t))return!0}),t},p.style=function(t){t=t||{};var e=p.elem("style"),n=t.text||"",i=t.target;if(n)return"styleSheet"in e?(e.setAttribute("type","text/css"),e.styleSheet.cssText=n):e.innerHTML=n,e.id="LAY-STYLE-"+(t.id||(n=p.style.index||0,p.style.index++,"DF-"+n)),i&&((t=p(i).find("#"+e.id))[0]&&t.remove(),p(i).append(e)),e},p.position=function(t,e,n){var i,r,o,c,a,u,s,f,l;e&&(n=n||{},t!==h&&t!==p("body")[0]||(n.clickType="right"),i="right"===n.clickType?{left:(i=n.e||d.event||{}).clientX,top:i.clientY,right:i.clientX,bottom:i.clientY}:t.getBoundingClientRect(),a=e.offsetWidth,u=e.offsetHeight,r=function(t){return h.body[t=t?"scrollLeft":"scrollTop"]|h.documentElement[t]},o=function(t){return h.documentElement[t?"clientWidth":"clientHeight"]},c="margin"in n?n.margin:5,l=i.left,"center"===n.align?l-=(a-t.offsetWidth)/2:"right"===n.align&&(l=l-a+t.offsetWidth),(l=l+a+c>o("width")?o("width")-a-c:l)o()&&(i.top>u+c&&i.top<=o()?a=i.top-u-2*c:n.allowBottomOut||(a=o()-u-2*c)<0&&(a=0)),(u=n.position)&&(e.style.position=u),s=n.offset?n.offset[0]:0,f=n.offset?n.offset[1]:0,e.style.left=l+("fixed"===u?0:r(1))+s+"px",e.style.top=a+("fixed"===u?0:r())+f+"px",p.hasScrollbar()||(l=e.getBoundingClientRect(),!n.SYSTEM_RELOAD&&l.bottom+c>o()&&(n.SYSTEM_RELOAD=!0,setTimeout(function(){p.position(t,e,n)},50))))},p.options=function(t,e){if(e="object"==typeof e?e:{attr:e},t===h)return{};var t=p(t),n=e.attr||"lay-options",t=t.attr(n);try{return new Function("return "+(t||"{}"))()}catch(i){return layui.hint().error(e.errorText||[n+'="'+t+'"',"\n parseerror: "+i].join("\n"),"error"),{}}},p.isTopElem=function(n){var t=[h,p("body")[0]],i=!1;return p.each(t,function(t,e){if(e===n)return i=!0}),i},p.clipboard={writeText:function(n){var i=String(n.text);function t(){var t=h.createElement("textarea");t.value=i,t.style.position="fixed",t.style.opacity="0",t.style.top="0px",t.style.left="0px",h.body.appendChild(t),t.select();try{h.execCommand("copy"),"function"==typeof n.done&&n.done()}catch(e){"function"==typeof n.error&&n.error(e)}finally{t.remove?t.remove():h.body.removeChild(t)}}navigator&&"clipboard"in navigator?navigator.clipboard.writeText(i).then(n.done,function(){t()}):t()}},p.passiveSupported=function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});d.addEventListener("test",null,e),d.removeEventListener("test",null,e)}catch(n){}return t}(),p.touchEventsSupported=function(){return"ontouchstart"in d},p.touchSwipe=function(t,e){var n,i,r,o,c=e,a=p(t)[0],u=!("preventDefault"in c)||c.preventDefault;a&&p.touchEventsSupported()&&(n={pointerStart:{x:0,y:0},pointerEnd:{x:0,y:0},distanceX:0,distanceY:0,direction:"none",timeStart:null},e=function(t){1===t.touches.length&&(a.addEventListener("touchmove",i,!!p.passiveSupported&&{passive:!1}),a.addEventListener("touchend",r),a.addEventListener("touchcancel",r),n.timeStart=Date.now(),n.pointerStart.x=n.pointerEnd.x=t.touches[0].clientX,n.pointerStart.y=n.pointerEnd.y=t.touches[0].clientY,n.distanceX=n.distanceY=0,n.direction="none",c.onTouchStart)&&c.onTouchStart(t,n)},i=function(t){u&&t.preventDefault(),n.pointerEnd.x=t.touches[0].clientX,n.pointerEnd.y=t.touches[0].clientY,n.distanceX=n.pointerStart.x-n.pointerEnd.x,n.distanceY=n.pointerStart.y-n.pointerEnd.y,Math.abs(n.distanceX)>Math.abs(n.distanceY)?n.direction=0]|&(?=#?[a-zA-Z0-9]+)/g;return e===undefined||null===e?"":r.test(e+="")?e.replace(r,function(e){return"&#"+e.charCodeAt(0)+";"}):e}},m=function(e,r){return new RegExp(e,r||"g")},g=function(e,r,t){r=r||{};var e="Laytpl "+((r=Object.assign({errorContext:""},r)).type||"")+"Error: "+e,n=r.errorContext;return delete r.errorContext,"object"==typeof console&&console.error(e,"\n",n,"\n",r),"function"==typeof t&&t(r),e},o={open:"{{",close:"}}",cache:!0,condense:!0,tagStyle:""},t=function(e,r){var t=this;r=t.config=Object.assign({template:e},o,r),t.vars=Object.assign({include:function(e,r){e=document.getElementById(e),e=e?e.innerHTML:"";return e?t.render(e,r):""}},n),t.compile(r.template)},r=(t.prototype.render=function(r,t){var n=this,o=n.config,c=r?n.compile(r):n.compilerCache||n.compile(o.template),e=function(){t=t||o.data||{};try{return c(t)}catch(e){return r=r||o.template,g(e,{errorContext:n.extractErrorContext(r,t),template:r,type:"Render"},o.error)}}();return o.cache&&!r&&(n.compilerCache=c),e},t.prototype.compile=function(e){var t=this,o=t.config,c=o.open,a=o.close,i=o.condense,u=m,l="\u2028";if("string"!=typeof e||!e)return function(){return""};var p=function(e,r){e=["(?:"+c+(e[0]||"")+"\\s*)","("+(e[1]||"[\\s\\S]")+"*?)","(?:\\s*"+(e[2]||"")+a+")"];return(r=r||{}).before&&e.unshift(r.before),r.after&&e.push(r.after),u(e.join(""))},r=i?["",""]:["(?:(?:\\n)*\\s*)","(?:\\s*?)"],f={before:r[0],after:r[1]},s=function(e,r){return e=(e=i?e:e.replace(u(l),r?"":"\n")).replace(/\\(\\|")/g,"$1")},n=t.parse=function(e){var n,r,t;return(e=e||"")&&(e=(e=(e=i?e.replace(/\t/g," ").replace(/\s+/g," "):e).replace(u("([}\\]])"+a),"$1 "+a).replace(/(?=\\|")/g,"\\").replace(/\r?\n/g,i?"":l)).replace(p(["!","","!"],f),function(e,r){return r=r.replace(u(c+"|"+a),function(e){return e.replace(/(?=.)/g,"\\")})}),n=function(e){return['";',e,'__laytpl__+="'].join("\n")},r=function(e,r,t){return t&&(r="-"===r?"":"_escape",t=s(t,!0))?n("__laytpl__+="+r+"("+t+");"):""},t=function(e,r){return r?(r=s(r),n(r)):""},e="modern"===o.tagStyle?(e=(e=e.replace(p(["#"],f),"")).replace(p(["(=|-)"]),r)).replace(p([],f),t):(e=e.replace(p(["#"],f),t)).replace(p(["(=|-)*"]),r),i||(e=e.replace(u(l),"\\n"))),e},r=t.createCompiler=function(e,r){return r=r||d(e),new Function("laytpl","return "+r)(t.vars)},d=t.createBuilder=function(e,r){return r=r||["function(d){",'"use strict";','var __laytpl__="",'+function(){var e,r=[];for(e in t.vars)r.push(("escape"===e?"_":"")+e+"=laytpl."+e);return r.join(",")}()+";",'__laytpl__="'+n(e)+'";',"return __laytpl__;","};"].join("\n")};try{return r(e)}catch(y){return delete t.compilerCache,function(){return g(y,{errorContext:t.extractErrorContext(e),template:e,type:"Compile"},o.error)}}},t.prototype.extractErrorContext=function(e,r){var t=1,o=e.split(/\r?\n/g),n=(e=e.replace(/(?=^)/gm,function(){return"/*LINE:"+t+++"*/"}),this.createBuilder(e)),c=n.split(/\r?\n/),a="laytpl.builder.map";try{n+="\n//# sourceURL="+a;var i=this.createCompiler(e,n);r&&i(r)}catch(l){var e=m(a.replace(/\./g,"\\.")+":(\\d+)","i"),n=(l.stack.match(e)||[])[1]||0,u=function(e,r){var r=r?/\/\*LINE:(\d+)\*\/[^*]*$/:/\/\*LINE:(\d+)\*\//;return!(r=(String(c[e-1]).match(r)||[])[1])&&0n.pages?n.curr=n.pages:n.curr<1&&(n.curr=1),r<0?r=1:r>n.pages&&(r=n.pages),n.prev="prev"in n?n.prev:"\u4e0a\u4e00\u9875",n.next="next"in n?n.next:"\u4e0b\u4e00\u9875",n.pages>r?Math.ceil((n.curr+(1'+n.prev+"":"",page:function(){var e=[];if(n.count<1)return"";1'+(n.first||1)+"");var a=Math.floor((r-1)/2),t=1n.pages?n.pages:a:r;for(i-t...');t<=i;t++)t===n.curr?e.push('"+t+""):e.push(''+t+"");return n.pages>r&&n.pages>i&&!1!==n.last&&(i+1...'),0!==r)&&e.push(''+(n.last||n.pages)+""),e.join("")}(),next:n.next?''+n.next+"":"",count:''+(e="object"==typeof n.countText?n.countText:["\u5171 "," \u6761"])[0]+n.count+e[1]+"",limit:(i=['"),refresh:['','',""].join(""),skip:[''+(e="object"==typeof n.skipText?n.skipText:["\u5230\u7b2c","\u9875","\u786e\u5b9a"])[0],'',e[1]+'",""].join("")};return['
                                              ',(t=[],layui.each(n.layout,function(e,a){l[a]&&t.push(l[a])}),t.join("")),"
                                              "].join("")},t.prototype.jump=function(e,a){if(e){var t=this,i=t.config,n=e.children,r=e[c]("button")[0],u=e[c]("input")[0],e=e[c]("select")[0],l=function(){var e=Number(u.value.replace(/\s|\D/g,""));e&&(i.curr=e,t.render())};if(a)return l();for(var s=0,p=n.length;si.pages||(i.curr=e,t.render())});e&&o.on(e,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),r&&o.on(r,"click",function(){l()})}},t.prototype.skip=function(t){var i,e;t&&(i=this,e=t[c]("input")[0])&&o.on(e,"keyup",function(e){var a=this.value,e=e.keyCode;/^(37|38|39|40)$/.test(e)||(/\D/.test(a)&&(this.value=a.replace(/\D/,"")),13===e&&i.jump(t,!0))})},t.prototype.render=function(e){var a=this,t=a.config,i=a.type(),n=a.view(),i=(2===i?t.elem&&(t.elem.innerHTML=n):3===i?t.elem.html(n):r[u](t.elem)&&(r[u](t.elem).innerHTML=n),t.jump&&t.jump(t,e),r[u]("layui-laypage-"+t.index));a.jump(i),t.hash&&!e&&(location.hash="!"+t.hash+"="+t.curr),a.skip(i)},{render:function(e){return new t(e).index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(a,e,t){return a.attachEvent?a.attachEvent("on"+e,function(e){e.target=e.srcElement,t.call(a,e)}):a.addEventListener(e,t,!1),this}});e("laypage",o)});!function(i,D){"use strict";var n=i.layui&&layui.define,l={getPath:i.lay&&lay.getPath?lay.getPath:"",link:function(e,t,a){T.path&&i.lay&&lay.layui&&lay.layui.link(T.path+e,t,a)}},e=i.LAYUI_GLOBAL||{},a="laydate",d="lay-"+a+"-id",T={v:"5.6.0",config:{weekStart:0},index:i.laydate&&i.laydate.v?1e5:0,path:e.laydate_dir||l.getPath,set:function(e){var t=this;return t.config=lay.extend({},t.config,e),t},ready:function(e){var t="laydate",a=(n?"modules/":"")+"laydate.css?v="+T.v;return n?layui["layui.all"]?"function"==typeof e&&e():layui.addcss(a,e,t):l.link(a,e,t),this}},s=function(){var t=this,e=t.config.id;return(s.that[e]=t).inst={hint:function(e){t.hint.call(t,e)},reload:function(e){t.reload.call(t,e)},config:t.config}},M="layui-this",C="laydate-disabled",h=[100,2e5],v="layui-laydate-static",b="layui-laydate-list",o="laydate-selected",r="layui-laydate-hint",y="laydate-day-prev",m="laydate-day-next",E=".laydate-btns-confirm",L="laydate-time-text",I="laydate-btns-time",x="layui-laydate-preview",w="layui-laydate-shade",k=function(e){var t,a=this,n=(a.index=++T.index,a.config=lay.extend({},a.config,T.config,e),lay(e.elem||a.config.elem));return 1\u8bf7\u91cd\u65b0\u9009\u62e9",invalidDate:"\u4e0d\u5728\u6709\u6548\u65e5\u671f\u6216\u65f6\u95f4\u8303\u56f4\u5185",formatError:["\u65e5\u671f\u683c\u5f0f\u4e0d\u5408\u6cd5
                                              \u5fc5\u987b\u9075\u5faa\u4e0b\u8ff0\u683c\u5f0f\uff1a
                                              ","
                                              \u5df2\u4e3a\u4f60\u91cd\u7f6e"],preview:"\u5f53\u524d\u9009\u4e2d\u7684\u7ed3\u679c"},en:{weeks:["Su","Mo","Tu","We","Th","Fr","Sa"],time:["Hours","Minutes","Seconds"],timeTips:"Select Time",startTime:"Start Time",endTime:"End Time",dateTips:"Select Date",month:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],tools:{confirm:"Confirm",clear:"Clear",now:"Now"},timeout:"End time cannot be less than start Time
                                              Please re-select",invalidDate:"Invalid date",formatError:["The date format error
                                              Must be followed\uff1a
                                              ","
                                              It has been reset"],preview:"The selected result"}};return e[this.config.lang]||e.cn},k.prototype.markerOfChineseFestivals={"0-1-1":"\u5143\u65e6","0-2-14":"\u60c5\u4eba","0-3-8":"\u5987\u5973","0-3-12":"\u690d\u6811","0-4-1":"\u611a\u4eba","0-5-1":"\u52b3\u52a8","0-5-4":"\u9752\u5e74","0-6-1":"\u513f\u7ae5","0-9-10":"\u6559\u5e08","0-10-1":"\u56fd\u5e86","0-12-25":"\u5723\u8bde"},k.prototype.reload=function(e){this.config=lay.extend({},this.config,e),this.init()},k.prototype.init=function(){var r=this,o=r.config,e="static"===o.position,t={year:"yyyy",month:"yyyy-MM",date:"yyyy-MM-dd",time:"HH:mm:ss",datetime:"yyyy-MM-dd HH:mm:ss"};o.elem=lay(o.elem),o.eventElem=lay(o.eventElem),o.elem[0]&&("array"!==layui.type(o.theme)&&(o.theme=[o.theme]),o.fullPanel&&("datetime"!==o.type||o.range)&&delete o.fullPanel,r.rangeStr=o.range?"string"==typeof o.range?o.range:"-":"",r.rangeLinked=!(!o.range||!o.rangeLinked||"date"!==o.type&&"datetime"!==o.type),r.autoCalendarModel=function(){var e=r.rangeLinked;return r.rangeLinked=o.range&&("date"===o.type||"datetime"===o.type)&&(!r.startDate||!r.endDate||r.startDate&&r.endDate&&r.startDate.year===r.endDate.year&&r.startDate.month===r.endDate.month),lay(r.elem)[r.rangeLinked?"addClass":"removeClass"]("layui-laydate-linkage"),r.rangeLinked!=e},r.autoCalendarModel.auto=r.rangeLinked&&"auto"===o.rangeLinked,"array"===layui.type(o.range)&&(r.rangeElem=[lay(o.range[0]),lay(o.range[1])]),t[o.type]||(i.console&&console.error&&console.error("laydate type error:'"+o.type+"' is not supported"),o.type="date"),o.format===t.date&&(o.format=t[o.type]||t.date),r.format=s.formatArr(o.format),o.weekStart&&!/^[0-6]$/.test(o.weekStart)&&(t=r.lang(),o.weekStart=t.weeks.indexOf(o.weekStart),-1===o.weekStart)&&(o.weekStart=0),r.EXP_IF="",r.EXP_SPLIT="",lay.each(r.format,function(e,t){e=new RegExp(u).test(t)?"\\d{"+(new RegExp(u).test(r.format[0===e?e+1:e-1]||"")?/^yyyy|y$/.test(t)?4:t.length:/^yyyy$/.test(t)?"1,4":/^y$/.test(t)?"1,308":"1,2")+"}":"\\"+t;r.EXP_IF=r.EXP_IF+e,r.EXP_SPLIT=r.EXP_SPLIT+"("+e+")"}),r.EXP_IF_ONE=new RegExp("^"+r.EXP_IF+"$"),r.EXP_IF=new RegExp("^"+(o.range?r.EXP_IF+"\\s\\"+r.rangeStr+"\\s"+r.EXP_IF:r.EXP_IF)+"$"),r.EXP_SPLIT=new RegExp("^"+r.EXP_SPLIT+"$",""),r.isInput(o.elem[0])||"focus"===o.trigger&&(o.trigger="click"),o.elem.attr("lay-key",r.index),o.eventElem.attr("lay-key",r.index),o.elem.attr(d,o.id),lay.each(["min","max"],function(e,t){var a=[],n=[];if("number"==typeof o[t])var i=o[t],l=new Date,l=r.newDate({year:l.getFullYear(),month:l.getMonth(),date:l.getDate(),hours:e?23:0,minutes:e?59:0,seconds:e?59:0}).getTime(),e=new Date(i?i<864e5?l+864e5*i:i:l),a=[e.getFullYear(),e.getMonth()+1,e.getDate()],n=[e.getHours(),e.getMinutes(),e.getSeconds()];else if("string"==typeof o[t])a=(o[t].match(/\d+-\d+-\d+/)||[""])[0].split("-"),n=(o[t].match(/\d+:\d+:\d+/)||[""])[0].split(":");else if("object"==typeof o[t])return o[t];o[t]={year:0|a[0]||(new Date).getFullYear(),month:a[1]?(0|a[1])-1:(new Date).getMonth(),date:0|a[2]||(new Date).getDate(),hours:0|n[0],minutes:0|n[1],seconds:0|n[2]}}),r.elemID="layui-laydate"+o.elem.attr("lay-key"),(o.show||e)&&r.render(),e||r.events(),"function"==typeof o.formatToDisplay&&(r.isInput(o.elem[0])?r.formatToDisplay(o.elem[0],o.formatToDisplay):(t=r.rangeElem)&&(r.formatToDisplay(t[0][0],o.formatToDisplay),r.formatToDisplay(t[1][0],o.formatToDisplay))),o.value)&&o.isInitValue&&("date"===layui.type(o.value)?r.setValue(r.parse(0,r.systemDate(o.value))):r.setValue(o.value))},k.prototype.render=function(){var a,n,i,l,r=this,o=r.config,d=r.lang(),s="static"===o.position,y=r.elem=lay.elem("div",{id:r.elemID,"class":["layui-laydate",o.range?" layui-laydate-range":"",r.rangeLinked?" layui-laydate-linkage":"",s?" "+v:"",o.fullPanel?" laydate-theme-fullpanel":"",(a="",lay.each(o.theme,function(e,t){"default"===t||/^#/.test(t)||(a+=" laydate-theme-"+t)}),a)].join("")}),m=r.elemMain=[],u=r.elemHeader=[],c=r.elemCont=[],h=r.table=[],e=r.footer=lay.elem("div",{"class":"layui-laydate-footer"}),t=r.shortcut=lay.elem("ul",{"class":"layui-laydate-shortcut"}),p=(o.zIndex&&(y.style.zIndex=o.zIndex),lay.each(new Array(2),function(e){if(!o.range&&0'+d.timeTips+""),(o.range||"datetime"!==o.type||o.fullPanel)&&p.push(''),lay.each(o.btns,function(e,t){var a=d.tools[t]||"btn";o.range&&"now"===t||(s&&"clear"===t&&(a="cn"===o.lang?"\u91cd\u7f6e":"Reset"),n.push(''+a+""))}),p.push('"),p.join(""))),o.shortcuts&&(y.appendChild(t),lay(t).html((i=[],lay.each(o.shortcuts,function(e,t){i.push('
                                            • '+t.text+"
                                            • ")}),i.join(""))).find("li").on("click",function(e){var t=o.shortcuts[this.dataset.index]||{},t=("function"==typeof t.value?t.value():t.value)||[],n=(layui.isArray(t)||(t=[t]),o.type),t=(lay.each(t,function(e,t){var a=[o.dateTime,r.endDate][e];"time"===n&&"date"!==layui.type(t)?r.EXP_IF.test(t)&&(t=(t.match(r.EXP_SPLIT)||[]).slice(1),lay.extend(a,{hours:0|t[0],minutes:0|t[2],seconds:0|t[4]})):lay.extend(a,r.systemDate("date"===layui.type(t)?t:new Date(t))),"time"!==n&&"datetime"!==n||(r[["startTime","endTime"][e]]={hours:a.hours,minutes:a.minutes,seconds:a.seconds}),0===e?r.startDate=lay.extend({},a):r.endState=!0,"year"===n||"month"===n||"time"===n?r.listYM[e]=[a.year,a.month+1]:e&&r.autoCalendarModel.auto&&r.autoCalendarModel()}),r.checkDate("limit").calendar(null,null,"init"),lay(r.footer).find("."+I).removeClass(C));t&&"date"===t.attr("lay-type")&&t[0].click(),r.done(null,"change"),lay(this).addClass(M),"static"!==o.position&&r.setValue(r.parse()).done().remove()})),lay.each(m,function(e,t){y.appendChild(t)}),o.showBottom&&y.appendChild(e),lay.elem("style")),f=[],g=!0,t=(lay.each(o.theme,function(e,t){g&&/^#/.test(t)?(g=!(l=!0),f.push(["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} li.layui-this,#{{id}} td.layui-this>div{background-color:{{theme}} !important;}",-1!==o.theme.indexOf("circle")?"":"#{{id}} .layui-this{background-color:{{theme}} !important;}","#{{id}} .laydate-day-now{color:{{theme}} !important;}","#{{id}} .laydate-day-now:after{border-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,r.elemID).replace(/{{theme}}/g,t))):!g&&/^#/.test(t)&&f.push(["#{{id}} .laydate-selected>div{background-color:{{theme}} !important;}","#{{id}} .laydate-selected:hover>div{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,r.elemID).replace(/{{theme}}/g,t))}),o.shortcuts&&o.range&&f.push("#{{id}}.layui-laydate-range{width: 628px;}".replace(/{{id}}/g,r.elemID)),f.length&&(f=f.join(""),"styleSheet"in p?(p.setAttribute("type","text/css"),p.styleSheet.cssText=f):p.innerHTML=f,l&&lay(y).addClass("laydate-theme-molv"),y.appendChild(p)),r.remove(k.thisElemDate),T.thisId=o.id,s?o.elem.append(y):(D.body.appendChild(y),r.position()),o.shade?'
                                              ':"");y.insertAdjacentHTML("beforebegin",t),r.checkDate().calendar(null,0,"init"),r.changeEvent(),k.thisElemDate=r.elemID,r.renderAdditional(),"function"==typeof o.ready&&o.ready(lay.extend({},o.dateTime,{month:o.dateTime.month+1})),r.preview()},k.prototype.remove=function(e){var t=this,a=t.config,n=lay("#"+(e||t.elemID));return n[0]&&(n.hasClass(v)||t.checkDate(function(){n.remove(),delete t.startDate,delete t.endDate,delete t.endState,delete t.startTime,delete t.endTime,delete T.thisId,"function"==typeof a.close&&a.close(t)}),lay("."+w).remove()),t},k.prototype.position=function(){var e=this.config;return lay.position(e.elem[0],this.elem,{position:e.position}),this},k.prototype.hint=function(e){var t=this,a=(t.config,lay.elem("div",{"class":r}));t.elem&&(a.innerHTML=(e="object"==typeof e?e||{}:{content:e}).content||"",lay(t.elem).find("."+r).remove(),t.elem.appendChild(a),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){lay(t.elem).find("."+r).remove()},"ms"in e?e.ms:3e3))},k.prototype.getAsYM=function(e,t,a){return a?t--:t++,t<0&&(t=11,e--),11h[1]&&(e.year=h[1],o=!0),11t)&&(e.date=t,o=!0)},c=function(n,i,l){var r=["startTime","endTime"];i=(i.match(d.EXP_SPLIT)||[]).slice(1),l=l||0,s.range&&(d[r[l]]=d[r[l]]||{}),lay.each(d.format,function(e,t){var a=parseFloat(i[e]);i[e].lengthd.getDateTime(s.max)?(r=s.dateTime=lay.extend({},s.max),i=!0):d.getDateTime(r)d.getDateTime(s.max))&&(d.endDate=lay.extend({},s.max),i=!0),d.startTime={hours:s.dateTime.hours,minutes:s.dateTime.minutes,seconds:s.dateTime.seconds},d.endTime={hours:d.endDate.hours,minutes:d.endDate.minutes,seconds:d.endDate.seconds},"month"===s.type)&&(s.dateTime.date=1,d.endDate.date=1),i&&m&&(d.setValue(d.parse()),d.hint("value "+l.invalidDate+l.formatError[1])),d.startDate=d.startDate||m&&lay.extend({},s.dateTime),d.autoCalendarModel.auto&&d.autoCalendarModel(),d.endState=!s.range||!d.rangeLinked||!(!d.startDate||!d.endDate),e&&e()),d},k.prototype.markRender=function(e,a,t){var n;"object"==typeof t?lay.each(t||{},function(e,t){e=e.split("-");e[0]!=a[0]&&0!=e[0]||e[1]!=a[1]&&0!=e[1]||e[2]!=a[2]||(n=t||a[2])}):"string"==typeof t&&(n=t||a[2]),n&&e.find("div").html(''+n+"")},k.prototype.mark=function(t,a){var n=this,e=n.config,i=function(e){n.markRender(t,a,e)};return e.calendar&&"cn"===e.lang&&i(n.markerOfChineseFestivals),"function"==typeof e.mark?e.mark({year:a[0],month:a[1],date:a[2]},i):"object"==typeof e.mark&&i(e.mark),n},k.prototype.holidaysRender=function(r,o,e){var d=["holidays","workdays"],s=function(e,t,a){e.find("div").html(["",a,""].join(""))};"array"===layui.type(e)?lay.each(e,function(l,e){lay.each(e,function(e,t){var a,n,i;t=t,a=r.attr("lay-ymd"),n=t.split("-"),i=a.split("-"),lay.each(n,function(e,t){n[e]=parseInt(t,10)}),lay.each(i,function(e,t){i[e]=parseInt(t,10)}),n.join("-")===i.join("-")&&s(r,d[l],o[2])})}):"string"==typeof e&&-1!==d.indexOf(e)&&s(r,e,o[2])},k.prototype.holidays=function(t,a){var n=this,e=n.config,i=function(e){n.holidaysRender(t,a,e)};return"function"==typeof e.holidays?e.holidays({year:a[0],month:a[1],date:a[2]},i):"array"===layui.type(e.holidays)&&i(e.holidays),n},k.prototype.cellRender=function(t,e,a){var n=this.config;return"function"==typeof n.cellRender&&n.cellRender(e,function(e){"string"==typeof e?lay(t).html(e):"object"==typeof e&&lay(t).html("").append(lay(e)[0])},{originElem:t,type:a}),this},k.prototype.startOfYear=function(e){e=new Date(e);return e.setFullYear(e.getFullYear(),0,1),e.setHours(0,0,0,0),e},k.prototype.endOfYear=function(e){var e=new Date(e),t=e.getFullYear();return e.setFullYear(t+1,0,0),e.setHours(23,59,59,999),e},k.prototype.startOfMonth=function(e){e=new Date(e);return e.setDate(1),e.setHours(0,0,0,0),e},k.prototype.endOfMonth=function(e){var e=new Date(e),t=e.getMonth();return e.setFullYear(e.getFullYear(),t+1,0),e.setHours(23,59,59,999),e},k.prototype.addDays=function(e,t){e=new Date(e);return t&&e.setDate(e.getDate()+t),e},k.prototype.isDisabledYearOrMonth=function(e,t,a){for(var n=this,i=n.config,l="year"===t?n.startOfYear(e):n.startOfMonth(e),t="year"===t?n.endOfYear(e):n.endOfMonth(e),r=Math.floor((t.getTime()-l.getTime())/864e5)+1,o=0,d=0;d(t.time?0:41)?i.endDate:e.dateTime;return lay.each({now:lay.extend({},a,t.date||{}),min:e.min,max:e.max},function(e,a){var n;l[e]=i.newDate(lay.extend({year:a.year,month:"year"===t.type?0:a.month,date:"year"===t.type||"month"===t.type?1:a.date},(n={},lay.each(t.time,function(e,t){n[t]=a[t]}),n))).getTime()}),a=l.nowh[1]&&(s.year=h[1],d.hint(y.invalidDate)),d.firstDate||(d.firstDate=lay.extend({},s)),n.setFullYear(s.year,s.month,1),l=(n.getDay()+(7-a.weekStart))%7,r=T.getEndDate(s.month||12,s.year),o=T.getEndDate(s.month+1,s.year),lay.each(u,function(e,t){var a,n=[s.year,s.month];(t=lay(t)).removeAttr("class"),e"+n[2]+"
                                              "),d.mark(t,n).holidays(t,n).limit({elem:t,date:{year:n[0],month:n[1]-1,date:n[2]},index:e,rangeType:i,disabledType:"date"}),d.cellRender(t,{year:n[0],month:n[1],date:n[2]},"date")}),lay(c[0]).attr("lay-ym",s.year+"-"+(s.month+1)),lay(c[1]).attr("lay-ym",s.year+"-"+(s.month+1)),d.panelYM||(d.panelYM={}),d.panelYM[i]={year:s.year,month:s.month},"cn"===a.lang?(lay(c[0]).attr("lay-type","year").html(s.year+" \u5e74"),lay(c[1]).attr("lay-type","month").html(s.month+1+" \u6708")):(lay(c[0]).attr("lay-type","month").html(y.month[s.month]),lay(c[1]).attr("lay-type","year").html(s.year)),m&&(a.range?!e&&"init"===t||(d.listYM=[[(d.startDate||a.dateTime).year,(d.startDate||a.dateTime).month+1],[d.endDate.year,d.endDate.month+1]],d.list(a.type,0).list(a.type,1),"time"===a.type?d.setBtnStatus("\u65f6\u95f4",lay.extend({},d.systemDate(),d.startTime),lay.extend({},d.systemDate(),d.endTime)):d.setBtnStatus(!0)):(d.listYM=[[s.year,s.month+1]],d.list(a.type,0))),a.range&&"init"===t&&(d.rangeLinked?(n=d.getAsYM(s.year,s.month,i?"sub":null),d.calendar(lay.extend({},s,{year:n[0],month:n[1]}),1-i)):d.calendar(null,1-i)),a.range||(u=["hours","minutes","seconds"],d.limit({elem:lay(d.footer).find(".laydate-btns-now"),date:d.systemDate(/^(datetime|time)$/.test(a.type)?new Date:null),index:0,time:u,disabledType:"datetime"}),d.limit({elem:lay(d.footer).find(E),index:0,time:u,disabledType:"datetime"})),d.setBtnStatus(),lay(d.shortcut).find("li."+M).removeClass(M),a.range&&!m&&"init"!==t&&d.stampRange(),d},k.prototype.list=function(n,i){var l,r,e,a,o,d,t,s=this,y=s.config,m=s.rangeLinked?y.dateTime:[y.dateTime,s.endDate][i],u=s.lang(),c=y.range&&"date"!==y.type&&"datetime"!==y.type,h=lay.elem("ul",{"class":b+" "+{year:"laydate-year-list",month:"laydate-month-list",time:"laydate-time-list"}[n]}),p=s.elemHeader[i],f=lay(p[2]).find("span"),g=s.elemCont[i||0],D=lay(g).find("."+b)[0],T="cn"===y.lang,v=T?"\u5e74":"",x=s.listYM[i]||{},w=["hours","minutes","seconds"],k=["startTime","endTime"][i];return x[0]<1&&(x[0]=1),"year"===n?(e=l=x[0]-7,l<1&&(e=l=1),lay.each(new Array(15),function(e){var t=lay.elem("li",{"lay-ym":l}),a={year:l,month:0,date:1};l==x[0]&&lay(t).addClass(M),t.innerHTML=l+v,h.appendChild(t),s.limit({elem:lay(t),date:a,index:i,type:n,rangeType:i,disabledType:"date"}),s.cellRender(t,{year:l,month:1,date:1},"year"),l++}),lay(f[T?0:1]).attr("lay-ym",l-8+"-"+x[1]).html(e+v+" - "+(l-1)+v)):"month"===n?(lay.each(new Array(12),function(e){var t=lay.elem("li",{"lay-ym":e}),a={year:x[0],month:e,date:1};e+1==x[1]&&lay(t).addClass(M),t.innerHTML=u.month[e]+(T?"\u6708":""),h.appendChild(t),s.limit({elem:lay(t),date:a,index:i,type:n,rangeType:i,disabledType:"date"}),s.cellRender(t,{year:x[0],month:e+1,date:1},"month")}),lay(f[T?0:1]).attr("lay-ym",x[0]+"-"+x[1]).html(x[0]+v)):"time"===n&&(r=function(){lay(h).find("ol").each(function(a,e){lay(e).find("li").each(function(e,t){s.limit({elem:lay(t),date:[{hours:e},{hours:s[k].hours,minutes:e},{hours:s[k].hours,minutes:s[k].minutes,seconds:e}][a],index:i,rangeType:i,disabledType:"time",time:[["hours"],["hours","minutes"],["hours","minutes","seconds"]][a]})})}),y.range||s.limit({elem:lay(s.footer).find(E),date:s[k],index:0,time:["hours","minutes","seconds"],disabledType:"datetime"})},y.range?s[k]||(s[k]="startTime"===k?m:s.endDate):s[k]=m,lay.each([24,60,60],function(t,e){var a=lay.elem("li"),n=["

                                              "+u.time[t]+"

                                                "];lay.each(new Array(e),function(e){n.push(""+lay.digit(e,2)+"")}),a.innerHTML=n.join("")+"
                                              ",h.appendChild(a)}),r(),e=-1!==y.format.indexOf("H"),f=-1!==y.format.indexOf("m"),t=-1!==y.format.indexOf("s"),a=h.children,o=0,lay.each([e,f,t],function(e,t){t||(a[e].className+=" layui-hide",o++)}),h.className+=" laydate-time-list-hide-"+o),D&&g.removeChild(D),g.appendChild(h),"year"===n||"month"===n?(lay(s.elemMain[i]).addClass("laydate-ym-show"),lay(h).find("li").on("click",function(){var e,t,a=0|lay(this).attr("lay-ym");lay(this).hasClass(C)||(s.rangeLinked?lay.extend(m,{year:"year"===n?a:x[0],month:"year"===n?x[1]-1:a}):m[n]=a,e=-1!==["year","month"].indexOf(y.type),t="year"===n&&-1!==["date","datetime"].indexOf(y.type),e||t?(lay(h).find("."+M).removeClass(M),lay(this).addClass(M),("month"===y.type&&"year"===n||t)&&(s.listYM[i][0]=a,c&&((i?s.endDate:m).year=a),s.list("month",i))):(s.checkDate("limit").calendar(m,i,"init"),s.closeList()),s.setBtnStatus(),!y.range&&y.autoConfirm&&("month"===y.type&&"month"===n||"year"===y.type&&"year"===n)&&s.setValue(s.parse()).done().remove(),s.autoCalendarModel.auto&&!s.rangeLinked?s.choose(lay(g).find("td.layui-this"),i):s.endState&&s.done(null,"change"),lay(s.footer).find("."+I).removeClass(C))})):(f=lay.elem("span",{"class":L}),d=function(){lay(h).find("ol").each(function(e){var a=this,t=lay(a).find("li");a.scrollTop=30*(s[k][w[e]]-2),a.scrollTop<=0&&t.each(function(e,t){if(!lay(this).hasClass(C))return a.scrollTop=30*(e-2),!0})})},t=lay(p[2]).find("."+L),d(),f.innerHTML=y.range?[u.startTime,u.endTime][i]:u.timeTips,lay(s.elemMain[i]).addClass("laydate-time-show"),t[0]&&t.remove(),p[2].appendChild(f),(D=lay(h).find("ol")).each(function(t){var a=this;lay(a).find("li").on("click",function(){var e=0|this.innerHTML;lay(this).hasClass(C)||(y.range?s[k][w[t]]=e:m[w[t]]=e,lay(a).find("."+M).removeClass(M),lay(this).addClass(M),r(),d(),!s.endDate&&"time"!==y.type&&"datetime"!==y.type||s.done(null,"change"),s.setBtnStatus())})}),layui.device().mobile&&D.css({overflowY:"auto",touchAction:"pan-y"})),s},k.prototype.listYM=[],k.prototype.closeList=function(){var a=this;a.config;lay.each(a.elemCont,function(e,t){lay(this).find("."+b).remove(),lay(a.elemMain[e]).removeClass("laydate-ym-show laydate-time-show")}),lay(a.elem).find("."+L).remove()},k.prototype.setBtnStatus=function(e,t,a){var n=this,i=n.config,l=n.lang(),r=lay(n.footer).find(E),o="datetime"===i.type||"time"===i.type?["hours","minutes","seconds"]:undefined;i.range&&(t=t||(n.rangeLinked?n.startDate:i.dateTime),a=a||n.endDate,i=!n.endState||n.newDate(t).getTime()>n.newDate(a).getTime(),n.limit({date:t,disabledType:"datetime",time:o,rangeType:0})||n.limit({date:a,disabledType:"datetime",time:o,rangeType:1})?r.addClass(C):r[i?"addClass":"removeClass"](C),e)&&i&&n.hint("string"==typeof e?l.timeout.replace(/\u65e5\u671f/g,e):l.timeout)},k.prototype.parse=function(e,t){var a=this,n=a.config,i=a.rangeLinked?a.startDate:n.dateTime,t=t||("end"==e?lay.extend({},a.endDate,a.endTime):n.range?lay.extend({},i||n.dateTime,a.startTime):n.dateTime),i=T.parse(t,a.format,1);return n.range&&e===undefined?i+" "+a.rangeStr+" "+a.parse("end"):i},k.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},k.prototype.getDateTime=function(e){return this.newDate(e).getTime()},k.prototype.formatToDisplay=function(e,t){var a=this,n=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,"value");Object.defineProperty(e,"value",lay.extend({},n,{get:function(){return this.getAttribute("lay-date")},set:function(e){n.set.call(this,t.call(a,e)),this.setAttribute("lay-date",e)}}))},k.prototype.setValue=function(e){var t,a=this,n=a.config,i=n.elem[0];return"static"!==n.position&&(e=e||"",a.isInput(i)?lay(i).val(e):(t=a.rangeElem)?("array"!==layui.type(e)&&(e=e.split(" "+a.rangeStr+" ")),t[0].val(e[0]||""),t[1].val(e[1]||"")):(0===lay(i).find("*").length&&(t="function"==typeof n.formatToDisplay?n.formatToDisplay(e):e,lay(i).html(t)),lay(i).attr("lay-date",e))),a},k.prototype.preview=function(){var e,t=this,a=t.config;a.isPreview&&(e=lay(t.elem).find("."+x),a=!a.range||(t.rangeLinked?t.endState:t.endDate)?t.parse():"",e.html(a),e.html())&&(e.css({color:"#16b777"}),setTimeout(function(){e.css({color:"#777"})},300))},k.prototype.renderAdditional=function(){this.config.fullPanel&&this.list("time",0)},k.prototype.stampRange=function(){var n,i=this,l=i.config,r=i.rangeLinked?i.startDate:l.dateTime,e=lay(i.elem).find("td");l.range&&!i.endState&&lay(i.footer).find(E).addClass(C),r=r&&i.newDate({year:r.year,month:r.month,date:r.date}).getTime(),n=i.endState&&i.endDate&&i.newDate({year:i.endDate.year,month:i.endDate.month,date:i.endDate.date}).getTime(),lay.each(e,function(e,t){var a=lay(t).attr("lay-ymd").split("-"),a=i.newDate({year:a[0],month:a[1]-1,date:a[2]}).getTime();l.rangeLinked&&!i.startDate&&a===i.newDate(i.systemDate()).getTime()&&lay(t).addClass(lay(t).hasClass(y)||lay(t).hasClass(m)?"":"laydate-day-now"),lay(t).removeClass(o+" "+M),a!==r&&a!==n||(i.rangeLinked||!i.rangeLinked&&(e<42?a===r:a===n))&&lay(t).addClass(lay(t).hasClass(y)||lay(t).hasClass(m)?o:M),rn.getDateTime(i.max)&&(n[t]={hours:i.max.hours,minutes:i.max.minutes,seconds:i.max.seconds},lay.extend(l,n[t])))}),a||(n.startDate=lay.extend({},l)),n.endState&&!n.limit({date:n.rangeLinked?n.startDate:n.thisDateTime(1-a),disabledType:"date"})&&(((r=n.endState&&n.autoCalendarModel.auto?n.autoCalendarModel():r)||n.rangeLinked&&n.endState)&&n.newDate(n.startDate)>n.newDate(n.endDate)&&(n.startDate.year===n.endDate.year&&n.startDate.month===n.endDate.month&&n.startDate.date===n.endDate.date&&(o=n.startTime,n.startTime=n.endTime,n.endTime=o),o=n.startDate,n.startDate=lay.extend({},n.endDate,n.startTime),i.dateTime=lay.extend({},n.startDate),n.endDate=lay.extend({},o,n.endTime)),r)&&(i.dateTime=lay.extend({},n.startDate)),n.rangeLinked?(e=n.checkPanelDate(l,t),o=lay.extend({},l),d=r||e&&e.needFullRender?"init":null,e=e?e.index:t,n.calendar(o,e,d)):n.calendar(null,a,r?"init":null),n.endState&&n.done(null,"change")):"static"===i.position?n.calendar().done().done(null,"change"):"date"===i.type?i.autoConfirm?n.setValue(n.parse()).done().remove():n.calendar().done(null,"change"):"datetime"===i.type&&n.calendar().done(null,"change"))},k.prototype.tool=function(t,e){var a=this,n=a.config,i=a.lang(),l=n.dateTime,r="static"===n.position,o={datetime:function(){lay(t).hasClass(C)||(a.list("time",0),n.range&&a.list("time",1),lay(t).attr("lay-type","date").html(a.lang().dateTips))},date:function(){a.closeList(),lay(t).attr("lay-type","datetime").html(a.lang().timeTips)},clear:function(){r&&(lay.extend(l,a.firstDate),a.calendar()),n.range&&(delete n.dateTime,delete a.endDate,delete a.startTime,delete a.endTime),a.setValue(""),a.done(null,"onClear").done(["",{},{}]).remove()},now:function(){var e=new Date;if(lay(t).hasClass(C))return a.hint(i.tools.now+", "+i.invalidDate);lay.extend(l,a.systemDate(),{hours:e.getHours(),minutes:e.getMinutes(),seconds:e.getSeconds()}),a.setValue(a.parse()),r&&a.calendar(),a.done(null,"onNow").done().remove()},confirm:function(){if(n.range){if(lay(t).hasClass(C))return("time"===n.type?a.startTime&&a.endTime&&a.newDate(a.startTime)>a.newDate(a.endTime):a.startDate&&a.endDate&&a.newDate(lay.extend({},a.startDate,a.startTime||{}))>a.newDate(lay.extend({},a.endDate,a.endTime||{})))?a.hint("time"===n.type?i.timeout.replace(/\u65e5\u671f/g,"\u65f6\u95f4"):i.timeout):a.hint(i.invalidDate)}else if(lay(t).hasClass(C))return a.hint(i.invalidDate);a.setValue(a.parse()),a.done(null,"onConfirm").done().remove()}};o[e]&&o[e]()},k.prototype.change=function(n){var i=this,l=i.config,r=i.thisDateTime(n),o=l.range&&("year"===l.type||"month"===l.type),d=i.elemCont[n||0],s=i.listYM[n],e=function(e){var t=lay(d).find(".laydate-year-list")[0],a=lay(d).find(".laydate-month-list")[0];return t&&(s[0]=e?s[0]-15:s[0]+15,i.list("year",n)),a&&(e?s[0]--:s[0]++,i.list("month",n)),(t||a)&&(lay.extend(r,{year:s[0]}),o&&(r.year=s[0]),l.range||i.done(null,"change"),l.range||i.limit({elem:lay(i.footer).find(E),date:{year:s[0]},disabledType:"datetime"})),i.setBtnStatus(),t||a};return{prevYear:function(){e("sub")||(i.rangeLinked?(l.dateTime.year--,i.checkDate("limit").calendar(null,null,"init")):(r.year--,i.checkDate("limit").calendar(null,n),i.autoCalendarModel.auto?i.choose(lay(d).find("td.layui-this"),n):i.done(null,"change")))},prevMonth:function(){var e,t;i.rangeLinked?(t=i.panelYM[0],t=i.getAsYM(t.year,t.month,"sub"),e=lay.extend({},l.dateTime,i.panelYM[0],{year:t[0],month:t[1]}),i.checkDate("limit").calendar(e,null,"init")):(t=i.getAsYM(r.year,r.month,"sub"),lay.extend(r,{year:t[0],month:t[1]}),i.checkDate("limit").calendar(null,null,"init"),i.autoCalendarModel.auto?i.choose(lay(d).find("td.layui-this"),n):i.done(null,"change"))},nextMonth:function(){var e,t;i.rangeLinked?(t=i.panelYM[0],t=i.getAsYM(t.year,t.month),e=lay.extend({},l.dateTime,i.panelYM[0],{year:t[0],month:t[1]}),i.checkDate("limit").calendar(e,null,"init")):(t=i.getAsYM(r.year,r.month),lay.extend(r,{year:t[0],month:t[1]}),i.checkDate("limit").calendar(null,null,"init"),i.autoCalendarModel.auto?i.choose(lay(d).find("td.layui-this"),n):i.done(null,"change"))},nextYear:function(){e()||(i.rangeLinked?(l.dateTime.year++,i.checkDate("limit").calendar(null,0,"init")):(r.year++,i.checkDate("limit").calendar(null,n),i.autoCalendarModel.auto?i.choose(lay(d).find("td.layui-this"),n):i.done(null,"change")))}}},k.prototype.changeEvent=function(){var i=this;i.config;lay(i.elem).on("click",function(e){lay.stope(e)}).on("mousedown",function(e){lay.stope(e)}),lay.each(i.elemHeader,function(n,e){lay(e[0]).on("click",function(e){i.change(n).prevYear()}),lay(e[1]).on("click",function(e){i.change(n).prevMonth()}),lay(e[2]).find("span").on("click",function(e){var t=lay(this),a=t.attr("lay-ym"),t=t.attr("lay-type");a&&(a=a.split("-"),i.listYM[n]=[0|a[0],0|a[1]],i.list(t,n),lay(i.footer).find("."+I).addClass(C))}),lay(e[3]).on("click",function(e){i.change(n).nextMonth()}),lay(e[4]).on("click",function(e){i.change(n).nextYear()})}),lay.each(i.table,function(e,t){lay(t).find("td").on("click",function(){i.choose(lay(this),e)})}),lay(i.footer).find("span").on("click",function(){var e=lay(this).attr("lay-type");i.tool(this,e)})},k.prototype.isInput=function(e){return/input|textarea/.test(e.tagName.toLocaleLowerCase())||/INPUT|TEXTAREA/.test(e.tagName)},k.prototype.events=function(){var e,t=this,a=t.config;a.elem[0]&&!a.elem[0].eventHandler&&(a.elem.on(a.trigger,e=function(){T.thisId!==a.id&&t.render()}),a.elem[0].eventHandler=!0,a.eventElem.on(a.trigger,e),t.unbind=function(){t.remove(),a.elem.off(a.trigger,e),a.elem.removeAttr("lay-key"),a.elem.removeAttr(d),a.elem[0].eventHandler=!1,a.eventElem.off(a.trigger,e),a.eventElem.removeAttr("lay-key"),delete s.that[a.id]})},s.that={},s.getThis=function(e){var t=s.that[e];return!t&&n&&layui.hint().error(e?a+" instance with ID '"+e+"' not found":"ID argument required"),t},l.run=function(n){n(D).on("mousedown",function(e){var t,a;T.thisId&&(t=s.getThis(T.thisId))&&(a=t.config,e.target===a.elem[0]||e.target===a.eventElem[0]||e.target===n(a.closeStop)[0]||a.elem[0]&&a.elem[0].contains(e.target)||t.remove())}).on("keydown",function(e){var t;T.thisId&&(t=s.getThis(T.thisId))&&"static"!==t.config.position&&13===e.keyCode&&n("#"+t.elemID)[0]&&t.elemID===k.thisElemDate&&(e.preventDefault(),n(t.footer).find(E)[0].click())}),n(i).on("resize",function(){if(T.thisId){var e=s.getThis(T.thisId);if(e)return!(!e.elem||!n(".layui-laydate")[0])&&void e.position()}})},T.render=function(e){e=new k(e);return s.call(e)},T.reload=function(e,t){e=s.getThis(e);if(e)return e.reload(t)},T.getInst=function(e){e=s.getThis(e);if(e)return e.inst},T.hint=function(e,t){e=s.getThis(e);if(e)return e.hint(t)},T.unbind=function(e){e=s.getThis(e);if(e)return e.unbind()},T.close=function(e){e=s.getThis(e||T.thisId);if(e)return e.remove()},T.parse=function(a,n,i){return a=a||{},n=((n="string"==typeof n?s.formatArr(n):n)||[]).concat(),lay.each(n,function(e,t){/yyyy|y/.test(t)?n[e]=lay.digit(a.year,t.length):/MM|M/.test(t)?n[e]=lay.digit(a.month+(i||0),t.length):/dd|d/.test(t)?n[e]=lay.digit(a.date,t.length):/HH|H/.test(t)?n[e]=lay.digit(a.hours,t.length):/mm|m/.test(t)?n[e]=lay.digit(a.minutes,t.length):/ss|s/.test(t)&&(n[e]=lay.digit(a.seconds,t.length))}),n.join("")},T.getEndDate=function(e,t){var a=new Date;return a.setFullYear(t||a.getFullYear(),e||a.getMonth()+1,1),new Date(a.getTime()-864e5).getDate()},n?(T.ready(),layui.define("lay",function(e){T.path=layui.cache.dir,l.run(lay),e(a,T)})):"function"==typeof define&&define.amd?define(function(){return l.run(lay),T}):(T.ready(),l.run(i.lay),i.laydate=T)}(window,window.document);!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e):function(e){if(e.document)return t(e);throw new Error("jQuery requires a window with a document")}:t(e)}("undefined"!=typeof window?window:this,function(T,M){"use strict";var t=[],R=Object.getPrototypeOf,a=t.slice,I=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},W=t.push,b=t.indexOf,F={},$=F.toString,B=F.hasOwnProperty,_=B.toString,z=_.call(Object),g={},v=function v(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},X=function X(e){return null!=e&&e===e.window},C=T.document,U={type:!0,src:!0,nonce:!0,noModule:!0};function V(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in U)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function G(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?F[$.call(e)]||"object":typeof e}var e="3.7.1",Y=/HTML$/i,S=function(e,t){return new S.fn.init(e,t)};function J(e){var t=!!e&&"length"in e&&e.length,n=G(e);return!v(e)&&!X(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+n+")"+n+"*"),xe=new RegExp(n+"|>"),be=new RegExp(s),we=new RegExp("^"+e+"$"),Te={ID:new RegExp("^#("+e+")"),CLASS:new RegExp("^\\.("+e+")"),TAG:new RegExp("^("+e+"|[*])"),ATTR:new RegExp("^"+o),PSEUDO:new RegExp("^"+s),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+n+"*(even|odd|(([+-]|)(\\d*)n|)"+n+"*(?:([+-]|)"+n+"*(\\d+)|))"+n+"*\\)|)","i"),bool:new RegExp("^(?:"+ge+")$","i"),needsContext:new RegExp("^"+n+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+n+"*((?:-\\d)?\\d*)"+n+"*\\)|)(?=[^-]|$)","i")},Ce=/^(?:input|select|textarea|button)$/i,Se=/^h\d$/i,Ee=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ke=/[+~]/,f=new RegExp("\\\\[\\da-fA-F]{1,6}"+n+"?|\\\\([^\\r\\n\\f])","g"),d=function(e,t){e="0x"+e.slice(1)-65536;return t||(e<0?String.fromCharCode(65536+e):String.fromCharCode(e>>10|55296,1023&e|56320))},je=function(){Oe()},Ae=Ie(function(e){return!0===e.disabled&&x(e,"fieldset")},{dir:"parentNode",next:"legend"});try{j.apply(t=a.call(i.childNodes),i.childNodes),t[i.childNodes.length].nodeType}catch(sr){j={apply:function(e,t){ue.apply(e,a.call(t))},call:function(e){ue.apply(e,a.call(arguments,1))}}}function N(e,t,n,r){var i,o,s,a,u,l,c=t&&t.ownerDocument,f=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==f&&9!==f&&11!==f)return n;if(!r&&(Oe(t),t=t||E,k)){if(11!==f&&(a=Ee.exec(e)))if(i=a[1]){if(9===f){if(!(l=t.getElementById(i)))return n;if(l.id===i)return j.call(n,l),n}else if(c&&(l=c.getElementById(i))&&N.contains(t,l)&&l.id===i)return j.call(n,l),n}else{if(a[2])return j.apply(n,t.getElementsByTagName(e)),n;if((i=a[3])&&t.getElementsByClassName)return j.apply(n,t.getElementsByClassName(i)),n}if(!(pe[e+" "]||p&&p.test(e))){if(l=e,c=t,1===f&&(xe.test(e)||ve.test(e))){for((c=ke.test(e)&&He(t.parentNode)||t)==t&&g.scope||((s=t.getAttribute("id"))?s=S.escapeSelector(s):t.setAttribute("id",s=A)),o=(u=Me(e)).length;o--;)u[o]=(s?"#"+s:":scope")+" "+Re(u[o]);l=u.join(",")}try{return j.apply(n,c.querySelectorAll(l)),n}catch(d){pe(e,!0)}finally{s===A&&t.removeAttribute("id")}}}return _e(e.replace(ee,"$1"),t,n,r)}function De(){var n=[];function r(e,t){return n.push(e+" ")>w.cacheLength&&delete r[n.shift()],r[e+" "]=t}return r}function u(e){return e[A]=!0,e}function Ne(e){var t=E.createElement("fieldset");try{return!!e(t)}catch(sr){return!1}finally{t.parentNode&&t.parentNode.removeChild(t)}}function qe(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function Le(s){return u(function(o){return o=+o,u(function(e,t){for(var n,r=s([],e.length,o),i=r.length;i--;)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function He(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function Oe(e){var e=e?e.ownerDocument||e:i;return e!=E&&9===e.nodeType&&e.documentElement&&(r=(E=e).documentElement,k=!S.isXMLDoc(E),ae=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&i!=E&&(e=E.defaultView)&&e.top!==e&&e.addEventListener("unload",je),g.getById=Ne(function(e){return r.appendChild(e).id=S.expando,!E.getElementsByName||!E.getElementsByName(S.expando).length}),g.disconnectedMatch=Ne(function(e){return ae.call(e,"*")}),g.scope=Ne(function(){return E.querySelectorAll(":scope")}),g.cssHas=Ne(function(){try{E.querySelector(":has(*,:jqfake)")}catch(sr){return 1}}),g.getById?(w.filter.ID=function(e){var t=e.replace(f,d);return function(e){return e.getAttribute("id")===t}},w.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&k)return(e=t.getElementById(e))?[e]:[]}):(w.filter.ID=function(e){var t=e.replace(f,d);return function(e){e="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return e&&e.value===t}},w.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&k){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];for(i=t.getElementsByName(e),r=0;o=i[r++];)if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),w.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},w.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&k)return t.getElementsByClassName(e)},p=[],Ne(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||p.push("\\["+n+"*(?:value|"+ge+")"),e.querySelectorAll("[id~="+A+"-]").length||p.push("~="),e.querySelectorAll("a#"+A+"+*").length||p.push(".#.+[+~]"),e.querySelectorAll(":checked").length||p.push(":checked"),(t=E.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&p.push(":enabled",":disabled"),(t=E.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||p.push("\\["+n+"*name"+n+"*="+n+"*(?:''|\"\")")}),g.cssHas||p.push(":has"),p=p.length&&new RegExp(p.join("|")),he=function(e,t){var n;return e===t?(se=!0,0):(n=!e.compareDocumentPosition-!t.compareDocumentPosition)||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!g.sortDetached&&t.compareDocumentPosition(e)===n?e===E||e.ownerDocument==i&&N.contains(i,e)?-1:t===E||t.ownerDocument==i&&N.contains(i,t)?1:oe?b.call(oe,e)-b.call(oe,t):0:4&n?-1:1)}),E}for(re in N.matches=function(e,t){return N(e,null,null,t)},N.matchesSelector=function(e,t){if(Oe(e),k&&!pe[t+" "]&&(!p||!p.test(t)))try{var n=ae.call(e,t);if(n||g.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(sr){pe(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(f,d),e[3]=(e[3]||e[4]||e[5]||"").replace(f,d),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||N.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&N.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return Te.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&be.test(n)&&(t=(t=Me(n,!0))&&n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(f,d).toLowerCase();return"*"===e?function(){return!0}:function(e){return x(e,t)}},CLASS:function(e){var t=ce[e+" "];return t||(t=new RegExp("(^|"+n+")"+e+"("+n+"|$)"))&&ce(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(t,n,r){return function(e){e=N.attr(e,t);return null==e?"!="===n:!n||(e+="","="===n?e===r:"!="===n?e!==r:"^="===n?r&&0===e.indexOf(r):"*="===n?r&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function Ge(e,n,r){return v(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/,Ke=((S.fn.init=function(e,t,n){if(e){if(n=n||Ye,"string"!=typeof e)return e.nodeType?(this[0]=e,this.length=1,this):v(e)?n.ready!==undefined?n.ready(e):e(S):S.makeArray(e,this);if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:Je.exec(e))||!r[1]&&t)return(!t||t.jquery?t||n:this.constructor(t)).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),Ve.test(r[1])&&S.isPlainObject(t))for(var r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r])}else(n=C.getElementById(r[2]))&&(this[0]=n,this.length=1)}return this}).prototype=S.fn,Ye=S(C),/^(?:parents|prev(?:Until|All))/),Qe={children:!0,contents:!0,next:!0,prev:!0};function Ze(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Et=/^$|^module$|\/(?:java|ecma)script/i,h=(o=C.createDocumentFragment().appendChild(C.createElement("div")),(s=C.createElement("input")).setAttribute("type","radio"),s.setAttribute("checked","checked"),s.setAttribute("name","t"),o.appendChild(s),g.checkClone=o.cloneNode(!0).cloneNode(!0).lastChild.checked,o.innerHTML="",g.noCloneChecked=!!o.cloneNode(!0).lastChild.defaultValue,o.innerHTML="",g.option=!!o.lastChild,{thead:[1,"","
                                              "],col:[2,"","
                                              "],tr:[2,"","
                                              "],td:[3,"","
                                              "],_default:[0,"",""]});function y(e,t){var n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[];return t===undefined||t&&x(e,t)?S.merge([e],n):n}function kt(e,t){for(var n=0,r=e.length;n",""]);var jt=/<|&#?\w+;/;function At(e,t,n,r,i){for(var o,s,a,u,l,c=t.createDocumentFragment(),f=[],d=0,p=e.length;d\s*$/g;function Rt(e,t){return x(e,"table")&&x(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function It(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Wt(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Ft(e,t){var n,r,i,o;if(1===t.nodeType){if(m.hasData(e)&&(o=m.get(e).events))for(i in m.remove(t,"handle events"),o)for(n=0,r=o[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}}),[]),ir=/(=)\?(?=&|$)|\?\?/,or=(S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=rr.pop()||S.expando+"_"+Hn.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,s=!1!==e.jsonp&&(ir.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&ir.test(e.data)&&"data");if(s||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,s?e[s]=e[s].replace(ir,"$1"+r):!1!==e.jsonp&&(e.url+=(On.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=T[r],T[r]=function(){o=arguments},n.always(function(){i===undefined?S(T).removeProp(r):T[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,rr.push(r)),o&&v(i)&&i(o[0]),o=i=undefined}),"script"}),g.createHTMLDocument=((e=C.implementation.createHTMLDocument("").body).innerHTML="
                                              ",2===e.childNodes.length),S.parseHTML=function(e,t,n){var r;return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(g.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),r=!n&&[],(n=Ve.exec(e))?[t.createElement(n[1])]:(n=At([e],t,r),r&&r.length&&S(r).remove(),S.merge([],n.childNodes)))},S.fn.load=function(e,t,n){var r,i,o,s=this,a=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){s.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,s,a=S.css(e,"position"),u=S(e),l={};"static"===a&&(e.style.position="relative"),o=u.offset(),r=S.css(e,"top"),s=S.css(e,"left"),a=("absolute"===a||"fixed"===a)&&-1<(r+s).indexOf("auto")?(i=(a=u.position()).top,a.left):(i=parseFloat(r)||0,parseFloat(s)||0),null!=(t=v(t)?t.call(e,n,S.extend({},o)):t).top&&(l.top=t.top-o.top+i),null!=t.left&&(l.left=t.left-o.left+a),"using"in t?t.using.call(e,l):u.css(l)}},S.fn.extend({offset:function(t){var e,n;return arguments.length?t===undefined?this:this.each(function(e){S.offset.setOffset(this,t,e)}):(n=this[0])?n.getClientRects().length?(e=n.getBoundingClientRect(),n=n.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{for(t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position");)e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===S.css(e,"position");)e=e.offsetParent;return e||yt})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return c(this,function(e,t,n){var r;if(X(e)?r=e:9===e.nodeType&&(r=e.defaultView),n===undefined)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=on(g.pixelPosition,function(e,t){if(t)return t=rn(e,n),Jt.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(s,a){S.each({padding:"inner"+s,content:a,"":"outer"+s},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return c(this,function(e,t,n){var r;return X(e)?0===o.indexOf("outer")?e["inner"+s]:e.document.documentElement["client"+s]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+s],r["scroll"+s],e.body["offset"+s],r["offset"+s],r["client"+s])):n===undefined?S.css(e,t,i):S.style(e,t,n,i)},a,n?e:undefined,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0'+(s?a.title[0]:a.title)+"
                                              ":"";return a.zIndex=o,t([a.shade?'
                                              ':"",'
                                              '+(e&&2!=a.type?"":s)+"'+(n=["layui-icon-tips","layui-icon-success","layui-icon-error","layui-icon-question","layui-icon-lock","layui-icon-face-cry","layui-icon-face-smile"],o="layui-anim layui-anim-rotate layui-anim-loop",0==a.type&&-1!==a.icon?'':3==a.type?(i=["layui-icon-loading","layui-icon-loading-1"],2==a.icon?'
                                              ':''):"")+((1!=a.type||!e)&&a.content||"")+'
                                              '+(n=[],r&&(n.push(''),n.push('')),a.closeBtn&&n.push(''),n.join(""))+"
                                              "+(a.btn?function(){var e="";"string"==typeof a.btn&&(a.btn=[a.btn]);for(var t,i=0,n=a.btn.length;i'+a.btn[i]+"";return'
                                              '+e+"
                                              "}():"")+(a.resize?'':"")+"
                                              "],s,h('
                                              ')),this},t.pt.creat=function(){var e,t,i,n,a=this,o=a.config,s=a.index,r="object"==typeof(d=o.content),l=h("body"),c=function(e){var t;o.shift&&(o.anim=o.shift),u.anim[o.anim]&&(t="layer-anim "+u.anim[o.anim],e.addClass(t).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){h(this).removeClass(t)}))};if(o.id&&h("."+u[0]).find("#"+o.id)[0])e=h("#"+o.id).closest("."+u[0]),t=e.attr("times"),i=e.data("config"),n=h("#"+u.SHADE+t),"min"===(e.data("maxminStatus")||{})?v.restore(t):i.hideOnClose&&(n.show(),e.show(),c(e),setTimeout(function(){n.css({opacity:n.data(y)})},10));else{switch(o.removeFocus&&document.activeElement&&document.activeElement.blur(),"string"==typeof o.area&&(o.area="auto"===o.area?["",""]:[o.area,""]),6==v.ie&&(o.fixed=!1),o.type){case 0:o.btn="btn"in o?o.btn:f.btn[0],v.closeAll("dialog");break;case 2:var d=o.content=r?o.content:[o.content||"","auto"];o.content='';break;case 3:delete o.title,delete o.closeBtn,-1===o.icon&&o.icon,v.closeAll("loading");break;case 4:r||(o.content=[o.content,"body"]),o.follow=o.content[1],o.content=o.content[0]+'',delete o.title,o.tips="object"==typeof o.tips?o.tips:[o.tips,!0],o.tipsMore||v.closeAll("tips")}a.vessel(r,function(e,t,i){l.append(e[0]),r?2==o.type||4==o.type?h("body").append(e[1]):d.parents("."+u[0])[0]||(d.data("display",d.css("display")).show().addClass("layui-layer-wrap").wrap(e[1]),h("#"+u[0]+s).find("."+u[5]).before(t)):l.append(e[1]),h("#"+u.MOVE)[0]||l.append(f.moveElem=i),a.layero=h("#"+u[0]+s),a.shadeo=h("#"+u.SHADE+s),o.scrollbar||f.setScrollbar(s)}).auto(s),a.shadeo.css({"background-color":o.shade[1]||"#000",opacity:o.shade[0]||o.shade,transition:o.shade[2]||""}),a.shadeo.data(y,o.shade[0]||o.shade),2==o.type&&6==v.ie&&a.layero.find("iframe").attr("src",d[0]),4==o.type?a.tips():(a.offset(),parseInt(f.getStyle(document.getElementById(u.MOVE),"z-index"))||(a.layero.css("visibility","hidden"),v.ready(function(){a.offset(),a.layero.css("visibility","visible")}))),!o.fixed||f.events.resize[a.index]||(f.events.resize[a.index]=function(){a.resize()},g.on("resize",f.events.resize[a.index])),a.layero.data("config",o),o.time<=0||setTimeout(function(){v.close(a.index)},o.time),a.move().callback(),c(a.layero)}},t.pt.resize=function(){var e=this,t=e.config;e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(e.index),4==t.type&&e.tips()},t.pt.auto=function(e){var t=this.config,i=h("#"+u[0]+e),n=((""===t.area[0]||"auto"===t.area[0])&&0t.maxWidth)&&i.width(t.maxWidth),[i.innerWidth(),i.innerHeight()]),a=i.find(u[1]).outerHeight()||0,o=i.find("."+u[6]).outerHeight()||0,e=function(e){(e=i.find(e)).height(n[1]-a-o-2*(0|parseFloat(e.css("padding-top"))))};return 2===t.type?e("iframe"):""===t.area[1]||"auto"===t.area[1]?0t.maxHeight?(n[1]=t.maxHeight,e("."+u[5])):t.fixed&&n[1]>=g.height()&&(n[1]=g.height(),e("."+u[5])):e("."+u[5]),this},t.pt.offset=function(){var e=this,t=e.config,i=e.layero,n=[i.outerWidth(),i.outerHeight()],a="object"==typeof t.offset;e.offsetTop=(g.height()-n[1])/2,e.offsetLeft=(g.width()-n[0])/2,a?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=g.width()-n[0]:"b"===t.offset?e.offsetTop=g.height()-n[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=g.height()-n[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=g.width()-n[0]):"rb"===t.offset?(e.offsetTop=g.height()-n[1],e.offsetLeft=g.width()-n[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?g.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?g.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=g.scrollTop(),e.offsetLeft+=g.scrollLeft()),"min"===i.data("maxminStatus")&&(e.offsetTop=g.height()-(i.find(u[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},t.pt.tips=function(){var e=this.config,t=this.layero,i=[t.outerWidth(),t.outerHeight()],n=h(e.follow),a={width:(n=n[0]?n:h("body")).outerWidth(),height:n.outerHeight(),top:n.offset().top,left:n.offset().left},o=t.find(".layui-layer-TipsG"),n=e.tips[0];e.tips[1]||o.remove(),a.autoLeft=function(){0'):e.removeClass("layui-layer-btn-is-loading").removeAttr("disabled").find(".layui-layer-btn-loading-icon").remove()},t.pt.callback=function(){var n=this,a=n.layero,o=n.config;n.openLayer(),o.success&&(2==o.type?a.find("iframe").on("load",function(){o.success(a,n.index,n)}):o.success(a,n.index,n)),6==v.ie&&n.IE6(a),a.find("."+u[6]).children("a").on("click",function(){var e,t=h(this),i=t.index();t.attr("disabled")||(o.btnAsync?(e=0===i?o.yes||o.btn1:o["btn"+(i+1)],n.loading=function(e){n.btnLoading(t,e)},e?f.promiseLikeResolve(e.call(o,n.index,a,n)).then(function(e){!1!==e&&v.close(n.index)},function(e){e!==m&&p.console&&p.console.error("layer error hint: "+e)}):v.close(n.index)):0===i?o.yes?o.yes(n.index,a,n):o.btn1?o.btn1(n.index,a,n):v.close(n.index):!1!==(o["btn"+(i+1)]&&o["btn"+(i+1)](n.index,a,n))&&v.close(n.index))}),a.find("."+u[7]).on("click",function(){!1!==(o.cancel&&o.cancel(n.index,a,n))&&v.close(n.index)}),o.shadeClose&&n.shadeo.on("click",function(){v.close(n.index)}),a.find(".layui-layer-min").on("click",function(){!1!==(o.min&&o.min(a,n.index,n))&&v.min(n.index,o)}),a.find(".layui-layer-max").on("click",function(){h(this).hasClass("layui-layer-maxmin")?(v.restore(n.index),o.restore&&o.restore(a,n.index,n)):(v.full(n.index,o),setTimeout(function(){o.full&&o.full(a,n.index,n)},100))}),o.end&&(f.end[n.index]=o.end),o.beforeEnd&&(f.beforeEnd[n.index]=h.proxy(o.beforeEnd,o,a,n.index,n))},f.reselect=function(){h.each(h("select"),function(e,t){var i=h(this);i.parents("."+u[0])[0]||1==i.attr("layer")&&h("."+u[0]).length<1&&i.removeAttr("layer").show()})},t.pt.IE6=function(e){h("select").each(function(e,t){var i=h(this);i.parents("."+u[0])[0]||"none"!==i.css("display")&&i.attr({layer:"1"}).hide()})},t.pt.openLayer=function(){v.zIndex=this.config.zIndex,v.setTop=function(e){return v.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",function(){v.zIndex++,e.css("z-index",v.zIndex+1)}),v.zIndex}},f.record=function(e){if(!e[0])return p.console&&console.error("index error");var t=e.attr("type"),i=e.find(".layui-layer-content"),t=t===f.type[2]?i.children("iframe"):i,n=[e[0].style.width||f.getStyle(e[0],"width"),e[0].style.height||f.getStyle(e[0],"height"),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:n}),i.data(l,f.getStyle(t[0],"height"))},f.setScrollbar=function(e){u.html.css("overflow","hidden")},f.restScrollbar=function(t){u.html.css("overflow")&&0===h("."+u[0]).filter(function(){var e=h(this);return!1===(e.data("config")||{}).scrollbar&&"min"!==e.data("maxminStatus")&&e.attr("times")!==String(t)}).length&&u.html.css("overflow","")},f.promiseLikeResolve=function(e){var t=h.Deferred();return e&&"function"==typeof e.then?e.then(t.resolve,t.reject):t.resolve(e),t.promise()},(p.layer=v).getChildFrame=function(e,t){return t=t||h("."+u[4]).attr("times"),h("#"+u[0]+t).find("iframe").contents().find(e)},v.getFrameIndex=function(e){if(e)return h("#"+e).parents("."+u[4]).attr("times")},v.iframeAuto=function(e){var t,i,n;e&&(t=v.getChildFrame("html",e).outerHeight(),i=(e=h("#"+u[0]+e)).find(u[1]).outerHeight()||0,n=e.find("."+u[6]).outerHeight()||0,e.css({height:t+i+n}),e.find("iframe").css({height:t}))},v.iframeSrc=function(e,t){h("#"+u[0]+e).find("iframe").attr("src",t)},v.style=function(e,t,i){var e=h("#"+u[0]+e),n=e.find(".layui-layer-content"),a=e.attr("type"),o=e.find(u[1]).outerHeight()||0,s=e.find("."+u[6]).outerHeight()||0;e.attr("minLeft");a!==f.type[3]&&a!==f.type[4]&&(i||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-o-s<=64&&(t.height=64+o+s)),e.css(t),s=e.find("."+u[6]).outerHeight()||0,a===f.type[2]?e.find("iframe").css({height:("number"==typeof t.height?t.height:e.height())-o-s}):n.css({height:("number"==typeof t.height?t.height:e.height())-o-s-parseFloat(n.css("padding-top"))-parseFloat(n.css("padding-bottom"))}))},v.min=function(e,t){var i,n,a,o,s,r,l=h("#"+u[0]+e),c=l.data("maxminStatus");"min"!==c&&("max"===c&&v.restore(e),l.data("maxminStatus","min"),t=t||l.data("config")||{},c=h("#"+u.SHADE+e),i=l.find(".layui-layer-min"),n=l.find(u[1]).outerHeight()||0,o=(a="string"==typeof(o=l.attr("minLeft")))?o:181*f.minStackIndex+"px",s=l.css("position"),r={width:180,height:n,position:"fixed",overflow:"hidden"},f.record(l),0g.width()&&(o=g.width()-180-(f.minStackArr.edgeIndex=f.minStackArr.edgeIndex||0,f.minStackArr.edgeIndex+=3))<0&&(o=0),t.minStack&&(r.left=o,r.top=g.height()-n,a||f.minStackIndex++,l.attr("minLeft",o)),l.attr("position",s),v.style(e,r,!0),i.hide(),"page"===l.attr("type")&&l.find(u[4]).hide(),f.restScrollbar(e),c.hide())},v.restore=function(e){var t=h("#"+u[0]+e),i=h("#"+u.SHADE+e),n=t.find(".layui-layer-content"),a=t.attr("area").split(","),o=t.attr("type"),s=t.data("config")||{},r=n.data(l);t.removeData("maxminStatus"),v.style(e,{width:a[0],height:a[1],top:parseFloat(a[2]),left:parseFloat(a[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===o&&t.find(u[4]).show(),s.scrollbar?f.restScrollbar(e):f.setScrollbar(e),r!==m&&(n.removeData(l),(o===f.type[2]?n.children("iframe"):n).css({height:r})),i.show()},v.full=function(t){var i=h("#"+u[0]+t),e=i.data("maxminStatus");"max"!==e&&("min"===e&&v.restore(t),i.data("maxminStatus","max"),f.record(i),f.setScrollbar(t),setTimeout(function(){var e="fixed"===i.css("position");v.style(t,{top:e?0:g.scrollTop(),left:e?0:g.scrollLeft(),width:"100%",height:"100%"},!0),i.find(".layui-layer-min").hide()},100))},v.title=function(e,t){h("#"+u[0]+(t||v.index)).find(u[1]).html(e)},v.close=function(s,r){var e,t,l=(e=h("."+u[0]).children("#"+s).closest("."+u[0]))[0]?(s=e.attr("times"),e):h("#"+u[0]+s),c=l.attr("type"),i=l.data("config")||{},d=i.id&&i.hideOnClose;l[0]&&(t=function(){var o={slideDown:"layer-anim-slide-down-out",slideLeft:"layer-anim-slide-left-out",slideUp:"layer-anim-slide-up-out",slideRight:"layer-anim-slide-right-out"}[i.anim]||"layer-anim-close",e=function(){var e="layui-layer-wrap";if(d)return l.removeClass("layer-anim "+o),l.hide();if(c===f.type[1]&&"object"===l.attr("conType")){l.children(":not(."+u[5]+")").remove();for(var t=l.find("."+e),i=0;i<2;i++)t.unwrap();t.css("display",t.data("display")).removeClass(e)}else{if(c===f.type[2])try{var n=h("#"+u[4]+s)[0];n.contentWindow.document.write(""),n.contentWindow.close(),l.find("."+u[5])[0].removeChild(n)}catch(a){}l[0].innerHTML="",l.remove()}"function"==typeof f.end[s]&&f.end[s](),delete f.end[s],"function"==typeof r&&r(),f.events.resize[s]&&(g.off("resize",f.events.resize[s]),delete f.events.resize[s])},t=h("#"+u.SHADE+s);v.ie&&v.ie<10||!i.isOutAnim?t[d?"hide":"remove"]():(t.css({opacity:0}),setTimeout(function(){t[d?"hide":"remove"]()},350)),i.isOutAnim&&l.addClass("layer-anim "+o),6==v.ie&&f.reselect(),f.restScrollbar(s),"string"==typeof l.attr("minLeft")&&(f.minStackIndex--,f.minStackArr.push(l.attr("minLeft"))),v.ie&&v.ie<10||!i.isOutAnim?e():setTimeout(function(){e()},200)},d||"function"!=typeof f.beforeEnd[s]?(delete f.beforeEnd[s],t()):f.promiseLikeResolve(f.beforeEnd[s]()).then(function(e){!1!==e&&(delete f.beforeEnd[s],t())},function(e){e!==m&&p.console&&p.console.error("layer error hint: "+e)}))},v.closeAll=function(n,a){"function"==typeof n&&(a=n,n=null);var o=h("."+u[0]);h.each(o,function(e){var t=h(this),i=n?t.attr("type")===n:1;i&&v.close(t.attr("times"),e===o.length-1?a:null)}),0===o.length&&"function"==typeof a&&a()},v.closeLast=function(i,e){var t,n=[],a=h.isArray(i);h("string"==typeof i?".layui-layer-"+i:".layui-layer").each(function(e,t){t=h(t);if(a&&-1===i.indexOf(t.attr("type"))||"none"===t.css("display"))return!0;n.push(Number(t.attr("times")))}),0":'",s=i.success;return delete i.success,v.open(h.extend({type:1,btn:["\u786e\u5b9a","\u53d6\u6d88"],content:o,skin:"layui-layer-prompt"+x("prompt"),maxWidth:g.width(),success:function(e){(a=e.find(".layui-layer-input")).val(i.value||"").focus(),"function"==typeof s&&s(e)},resize:!1,yes:function(e){var t=a.val();t.length>(i.maxlength||500)?v.tips("\u6700\u591a\u8f93\u5165"+(i.maxlength||500)+"\u4e2a\u5b57\u7b26",a,{tips:1}):n&&n(t,e,a)}},i))},v.tab=function(n){var a=(n=n||{}).tab||{},o="layui-this",s=n.success;return delete n.success,v.open(h.extend({type:1,skin:"layui-layer-tab"+x("tab"),resize:!1,title:function(){var e=a.length,t=1,i="";if(0'+a[0].title+"";t"+a[t].title+"";return i}(),content:'
                                                '+function(){var e=a.length,t=1,i="";if(0'+(a[0].content||"no content")+"";t'+(a[t].content||"no content")+"";return i}()+"
                                              ",success:function(e){var t=e.find(".layui-layer-title").children(),i=e.find(".layui-layer-tabmain").children();t.on("mousedown",function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0;var e=h(this),t=e.index();e.addClass(o).siblings().removeClass(o),i.eq(t).show().siblings().hide(),"function"==typeof n.change&&n.change(t)}),"function"==typeof s&&s(e)}},n))},v.photos=function(n,e,a){var s={};if((n=h.extend(!0,{toolbar:!0,footer:!0},n)).photos){var t=!("string"==typeof n.photos||n.photos instanceof h),i=t?n.photos:{},o=i.data||[],r=i.start||0,l=n.success;if(s.imgIndex=1+(0|r),n.img=n.img||"img",delete n.success,t){if(0===o.length)return v.msg("\u6ca1\u6709\u56fe\u7247")}else{var c=h(n.photos),d=function(){o=[],c.find(n.img).each(function(e){var t=h(this);t.attr("layer-index",e),o.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("lay-src")||t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(d(),e||c.on("click",n.img,function(){d();var e=h(this).attr("layer-index");v.photos(h.extend(n,{photos:{start:e,data:o,tab:n.tab},full:n.full}),!0)}),!e)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=o.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>o.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){var t;s.end||(t=e.keyCode,e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&v.close(s.index))},s.tabimg=function(e){if(!(o.length<=1))return i.start=s.imgIndex-1,v.close(s.index),v.photos(n,!0,e)},s.isNumber=function(e){return"number"==typeof e&&!isNaN(e)},s.image={},s.getTransform=function(e){var t=[],i=e.rotate,n=e.scaleX,e=e.scale;return s.isNumber(i)&&0!==i&&t.push("rotate("+i+"deg)"),s.isNumber(n)&&1!==n&&t.push("scaleX("+n+")"),s.isNumber(e)&&t.push("scale("+e+")"),t.length?t.join(" "):"none"},s.event=function(e,i,n){var a,o;s.main.find(".layui-layer-photos-prev").on("click",function(e){e.preventDefault(),s.imgprev(!0)}),s.main.find(".layui-layer-photos-next").on("click",function(e){e.preventDefault(),s.imgnext(!0)}),h(document).on("keyup",s.keyup),e.off("click").on("click","*[toolbar-event]",function(){var e=h(this);switch(e.attr("toolbar-event")){case"rotate":s.image.rotate=((s.image.rotate||0)+Number(e.attr("data-option")))%360,s.imgElem.css({transform:s.getTransform(s.image)});break;case"scalex":s.image.scaleX=-1===s.image.scaleX?1:-1,s.imgElem.css({transform:s.getTransform(s.image)});break;case"zoom":var t=Number(e.attr("data-option"));s.image.scale=(s.image.scale||1)+t,t<0&&s.image.scale<0-t&&(s.image.scale=0-t),s.imgElem.css({transform:s.getTransform(s.image)});break;case"reset":s.image.scaleX=1,s.image.scale=1,s.image.rotate=0,s.imgElem.css({transform:"none"});break;case"close":v.close(i)}n.offset(),n.auto(i)}),s.main.on("mousewheel DOMMouseScroll",function(e){var t=e.originalEvent.wheelDelta||-e.originalEvent.detail,i=s.main.find('[toolbar-event="zoom"]');(0n)&&("left"===t.direction?s.imgnext(!0):"right"===t.direction&&s.imgprev(!0))},h.each([n.shadeo,s.main],function(e,t){a.touchSwipe(t,{onTouchEnd:o})}))},s.loadi=v.load(1,{shade:!("shade"in n)&&[.9,m,"unset"],scrollbar:!1});var t=o[r].src,f=function(e){v.close(s.loadi);var t,i=o[r].alt||"";a&&(n.anim=-1),s.index=v.open(h.extend({type:1,id:"layui-layer-photos",area:(e=[e.width,e.height],t=[h(p).width()-100,h(p).height()-100],!n.full&&(t[0]'+i+''+(t=['
                                              '],1','','',"
                                              "].join("")),n.toolbar&&t.push(['
                                              ','','','','','','',"
                                              "].join("")),n.footer&&t.push(['"].join("")),t.push(""),t.join(""))+"",success:function(e,t,i){s.main=e.find(".layer-layer-photos-main"),s.footer=e.find(".layui-layer-photos-footer"),s.imgElem=s.main.children("img"),s.event(e,t,i),n.tab&&n.tab(o[r],e),"function"==typeof l&&l(e)},end:function(){s.end=!0,h(document).off("keyup",s.keyup)}},n))},u=function(){v.close(s.loadi),v.msg("\u5f53\u524d\u56fe\u7247\u5730\u5740\u5f02\u5e38\uff0c
                                              \u662f\u5426\u7ee7\u7eed\u67e5\u770b\u4e0b\u4e00\u5f20\uff1f",{time:3e4,btn:["\u4e0b\u4e00\u5f20","\u4e0d\u770b\u4e86"],yes:function(){1").addClass(o));layui.each(i.bars,function(t,e){var n=s('
                                            • ');n.addClass(e.icon).attr({"lay-type":e.type,style:e.style||(i.bgcolor?"background-color: "+i.bgcolor:"")}).html(e.content),n.on("click",function(){var t=s(this).attr("lay-type");"top"===t&&("body"===i.target?s("html,body"):c).animate({scrollTop:0},i.duration),"function"==typeof i.click&&i.click.call(this,t)}),"object"===layui.type(i.on)&&layui.each(i.on,function(t,e){n.on(t,function(){var t=s(this).attr("lay-type");"function"==typeof e&&e.call(this,t)})}),"top"===e.type&&(n.addClass("layui-fixbar-top"),r=n),l.append(n)}),u.find("."+o).remove(),"object"==typeof i.css&&l.css(i.css),u.append(l),r&&(e=function e(){return c.scrollTop()>=i.margin?t||(r.show(),t=1):t&&(r.hide(),t=0),e}()),c.on("scroll",function(){e&&(clearTimeout(n),n=setTimeout(function(){e()},100))})},countdown:function(i){i=s.extend(!0,{date:new Date,now:new Date},i);var r=arguments,o=(1]|&(?=#?[a-zA-Z0-9]+)/g.test(t+="")?t.replace(/&(?=#?[a-zA-Z0-9]+;?)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,"""):t},unescape:function(t){return t===undefined||null===t?"":String(t).replace(/\"/g,'"').replace(/\'/g,"'").replace(/\>/g,">").replace(/\</g,"<").replace(/\&/g,"&")},openWin:function(t){var e=(t=t||{}).window||window.open(t.url||"",t.target,t.specs);t.url||(e.document.open("text/html","replace"),e.document.write(t.content||""),e.document.close())},toVisibleArea:function(t){var e,n,i,r,o,a,u,c;(t=s.extend({margin:160,duration:200,type:"y"},t)).scrollElem[0]&&t.thisElem[0]&&(u=t.thisElem,i=(o="y"===t.type)?"top":"left",r=(e=t.scrollElem)[n=o?"scrollTop":"scrollLeft"](),o=e[o?"height":"width"](),a=e.offset()[i],c={},(u=u.offset()[i]-a)>o-t.margin||u."+v,T=function(e){var i=this;i.index=++h.index,i.config=c.extend({},i.config,h.config,e),i.init()};T.prototype.config={trigger:"click",content:"",className:"",style:"",show:!1,isAllowSpread:!0,isSpreadItem:!0,data:[],delay:[200,300],shade:0,accordion:!1,closeOnClick:!0},T.prototype.reload=function(e,i){var t=this;t.config=c.extend({},t.config,e),t.init(!0,i)},T.prototype.init=function(e,i){var t=this,n=t.config,a=c(n.elem);return 1",(t="href"in i?''+o+"":o,n?'
                                              '+t+("parent"===l?'':"group"===l&&d.isAllowSpread?'':"")+"
                                              ":'
                                              '+t+"
                                              "),"
                                            • "].join(""))).data("item",i),n&&(a=c('
                                              '),t=c("
                                                "),"parent"===l?(a.append(u(t,i[s.children])),o.append(a)):o.append(u(t,i[s.children]))),r.append(o))}),r},t=['
                                                ',"
                                                "].join(""),n=d.content||(n=c('
                                                  '),0\u6682\u65e0\u6570\u636e'),n),a=g.findMainElem(d.id);"reloadData"===e&&a.length?(i=o.mainElem=a).html(n):((i=o.mainElem=c(t)).append(n),i.addClass(d.className),i.attr("style",d.style),o.remove(h.thisId),d.target.append(i),d.elem.data(f,!0),e=d.shade?'
                                                  ':"",i.before(e),"mouseenter"===d.trigger&&i.on("mouseenter",function(){clearTimeout(g.timer)}).on("mouseleave",function(){o.delayRemove()})),o.position(),h.thisId=d.id,i.find(".layui-menu").on(l,function(e){layui.stope(e)}),i.find(".layui-menu li").on("click",function(e){var i=c(this),t=i.data("item")||{},n=t[s.children]&&0n.width()&&(t.addClass(x),(i=t[0].getBoundingClientRect()).left<0)&&t.removeClass(x),i.bottom>n.height())&&t.eq(0).css("margin-top",-(i.bottom-n.height()+5))}).on("mouseleave",t,function(e){var i=c(this).children("."+C);i.removeClass(x),i.css("margin-top",0)}),h.close=function(e){e=g.getThis(e);return e?(e.remove(),g.call(e)):this},h.open=function(e){e=g.getThis(e);return e?(e.render(),g.call(e)):this},h.reload=function(e,i,t){e=g.getThis(e);return e?(e.reload(i,t),g.call(e)):this},h.reloadData=function(){var t=c.extend([],arguments),n=(t[2]="reloadData",new RegExp("^("+["data","templet","content"].join("|")+")$"));return layui.each(t[1],function(e,i){n.test(e)||delete t[1][e]}),h.reload.apply(null,t)},h.render=function(e){e=new T(e);return g.call(e)},e(r,h)});layui.define(["jquery","lay"],function(e){"use strict";var x=layui.$,b=layui.lay,m={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var t=this;return t.config=x.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,i,e,t)}},i="slider",f="layui-disabled",T="layui-slider-bar",w="layui-slider-wrap",M="layui-slider-wrap-btn",L="layui-slider-tips",E="layui-slider-input-txt",Y="layui-slider-hover",t=function(e){var t=this;t.index=++m.index,t.config=x.extend({},t.config,m.config,e),t.render()};t.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,tipsAlways:!1,input:!1,range:!1,height:200,disabled:!1,theme:"#16baaa"},t.prototype.precision=function(){var e=this.config,e=x.map([e.min,e.max,e.step],function(e,t){e=String(e).split(".");return e[1]?e[1].length:0});return Math.max.apply(null,e)},t.prototype.render=function(){var n=this,a=n.config,e=x(a.elem);if(1a.max&&(a.value=a.max),l=(a.value-a.min)/(a.max-a.min)*100+"%");var t,e=a.disabled?"#c2c2c2":a.theme,i='
                                                  '+(a.tips?'
                                                  ":"")+'
                                                  '+(a.range?'
                                                  ':"")+"
                                                  ",l=x(a.elem),s=l.next(".layui-slider");if(s[0]&&s.remove(),n.elemTemp=x(i),a.range?(n.elemTemp.find("."+w).eq(0).data("value",a.value[0]),n.elemTemp.find("."+w).eq(1).data("value",a.value[1])):n.elemTemp.find("."+w).data("value",a.value),l.html(n.elemTemp),"vertical"===a.type&&n.elemTemp.height(a.height+"px"),a.showstep){for(var o=(a.max-a.min)/a.step,r="",u=1;u<1+o;u++){var c=100*u/o;c<100&&(r+='
                                                  ')}n.elemTemp.append(r)}function d(e){e=e.parent().data("value"),e=a.setTips?a.setTips(e):e;n.elemTemp.find("."+L).html(e)}function p(e){var t="vertical"===a.type?a.height:n.elemTemp[0].offsetWidth,i=n.elemTemp.find("."+w);return("vertical"===a.type?t-e.parent()[0].offsetTop-i.height():e.parent()[0].offsetLeft)/t*100}function v(e){"vertical"===a.type?n.elemTemp.find("."+L).css({bottom:e+"%","margin-bottom":"20px",display:"inline-block"}):n.elemTemp.find("."+L).css({left:e+"%",display:"inline-block"})}a.input&&!a.range&&(e=x('
                                                  '),l.css("position","relative"),l.append(e),l.find("."+E).children("input").val(a.value),"vertical"===a.type?e.css({left:0,top:-48}):n.elemTemp.css("margin-right",e.outerWidth()+15)),a.disabled?(n.elemTemp.addClass(f),n.elemTemp.find("."+M).addClass(f)):n.slide(),a.tips&&(a.tipsAlways?(d(s=n.elemTemp.find("."+M)),v(p(s))):n.elemTemp.find("."+M).on("mouseover",function(){d(x(this));var e=p(x(this));clearTimeout(t),t=setTimeout(function(){v(e)},300)}).on("mouseout",function(){clearTimeout(t),a.tipsAlways||n.elemTemp.find("."+L).css("display","none")}))},t.prototype.slide=function(e,t,i){var u=this,c=u.config,d=u.elemTemp,p=function(){return"vertical"===c.type?c.height:d[0].offsetWidth},v=d.find("."+w),o=d.next(".layui-slider-input"),r=o.children("."+E).children("input").val(),m=100/((c.max-c.min)/c.step),f=u.precision(),h=function(e,t,i){e=(e=100<(e=100n[1]&&n.reverse(),u.value=c.range?n:l,c.change&&c.change(u.value),"done"===i&&c.done&&c.done(u.value)},y=function(e){var t=e/p()*100/m,i=Math.round(t)*m;return i=e==p()?Math.ceil(t)*m:i},g=x(['
                                                  p()?p():t)/p()*100/m;h(t,o),r.addClass(Y),d.find("."+L).show(),e.preventDefault()},n=function(e){r.removeClass(Y),c.tipsAlways||setTimeout(function(){d.find("."+L).hide()},e)},a=function(){n&&n(b.touchEventsSupported()?1e3:0),g.remove(),c.done&&c.done(u.value),b.touchEventsSupported()&&(t[0].removeEventListener("touchmove",i,!!b.passiveSupported&&{passive:!1}),t[0].removeEventListener("touchend",a),t[0].removeEventListener("touchcancel",a))},x("#LAY-slider-moving")[0]||x("body").append(g),g.on("mousemove",i),g.on("mouseup",a).on("mouseleave",a),b.touchEventsSupported()&&(t[0].addEventListener("touchmove",i,!!b.passiveSupported&&{passive:!1}),t[0].addEventListener("touchend",a),t[0].addEventListener("touchcancel",a))})}),d.on("click",function(e){var t=x("."+M),i=x(this);!t.is(event.target)&&0===t.has(event.target).length&&t.length&&(i=(t=(t=(t="vertical"===c.type?p()-e.clientY+i.offset().top-x(window).scrollTop():e.clientX-i.offset().left-x(window).scrollLeft())<0?0:t)>p()?p():t)/p()*100/m,t=c.range?"vertical"===c.type?Math.abs(t-parseInt(x(v[0]).css("bottom")))>Math.abs(t-parseInt(x(v[1]).css("bottom")))?1:0:Math.abs(t-v[0].offsetLeft)>Math.abs(t-v[1].offsetLeft)?1:0:0,h(i,t,"done"),e.preventDefault())}),o.children(".layui-slider-input-btn").children("i").each(function(t){x(this).on("click",function(){r=o.children("."+E).children("input").val();var e=((r=1==t?r-c.stepc.max?c.max:Number(r)+c.step)-c.min)/(c.max-c.min)*100/m;h(e,0,"done")})});var n=function(){var e=this.value,e=(e=(e=(e=isNaN(e)?0:e)c.max?c.max:e,((this.value=e)-c.min)/(c.max-c.min)*100/m);h(e,0,"done")};o.children("."+E).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),n.call(this))}).on("change",n)},t.prototype.events=function(){this.config},m.render=function(e){e=new t(e);return function(){var i=this,n=i.config;return{setValue:function(e,t){return e=(e=e>n.max?n.max:e)',"",'','',"","","
                                                  "].join("")),t=i.elem=x(i.elem);i.size&&o.addClass("layui-colorpicker-"+i.size),t.addClass("layui-inline").html(e.elemColorBox=o),i.id="id"in i?i.id:t.attr("id")||e.index,e.color=e.elemColorBox.find("."+T)[0].style.background,e.events()},s.prototype.renderPicker=function(){var o,e=this,i=e.config,t=e.elemColorBox[0],n=e.elemPicker=x(['
                                                  ','
                                                  ','
                                                  ','
                                                  ','
                                                  ','
                                                  ',"
                                                  ",'
                                                  ','
                                                  ',"
                                                  ","
                                                  ",'
                                                  ','
                                                  ','
                                                  ',"
                                                  ","
                                                  ",i.predefine?(o=['
                                                  '],layui.each(i.colors,function(e,i){o.push(['
                                                  ','
                                                  ',"
                                                  "].join(""))}),o.push("
                                                  "),o.join("")):"",'
                                                  ','
                                                  ','',"
                                                  ",'
                                                  ','','',"","
                                                  "].join(""));e.elemColorBox.find("."+T)[0];x(c)[0]&&x(c).data("index")==e.index?e.removePicker(s.thisElemInd):(e.removePicker(s.thisElemInd),x("body").append(n)),r.thisId=i.id,s.thisElemInd=e.index,s.thisColor=t.style.background,e.position(),e.pickerEvents()},s.prototype.removePicker=function(e){var i=this.config,e=x("#layui-colorpicker"+(e||this.index));return e[0]&&(e.remove(),delete r.thisId,"function"==typeof i.close)&&i.close(this.color),this},s.prototype.position=function(){var e=this,i=e.config;return P.position(e.bindElem||e.elemColorBox[0],e.elemPicker[0],{position:i.position,align:"center"}),e},s.prototype.val=function(){var e,i=this,o=(i.config,i.elemColorBox.find("."+T)),t=i.elemPicker.find("."+X),n=o[0].style.backgroundColor;n?(e=j(L(n)),o=o.attr("lay-type"),i.select(e.h,e.s,e.b),"torgb"===o?t.find("input").val(n):"rgba"===o?(o=L(n),3===(n.match(/[0-9]{1,3}/g)||[]).length?(t.find("input").val("rgba("+o.r+", "+o.g+", "+o.b+", 1)"),i.elemPicker.find("."+Y).css("left",280)):(t.find("input").val(n),n=280*n.slice(n.lastIndexOf(",")+1,n.length-1),i.elemPicker.find("."+Y).css("left",n)),i.elemPicker.find("."+D)[0].style.background="linear-gradient(to right, rgba("+o.r+", "+o.g+", "+o.b+", 0), rgb("+o.r+", "+o.g+", "+o.b+"))"):t.find("input").val("#"+H(e))):(i.select(0,100,100),t.find("input").val(""),i.elemPicker.find("."+D)[0].style.background="",i.elemPicker.find("."+Y).css("left",280))},s.prototype.side=function(){var r=this,l=r.config,c=r.elemColorBox.find("."+T),a=c.attr("lay-type"),s=r.elemPicker.find(".layui-colorpicker-side"),o=r.elemPicker.find("."+I),d=r.elemPicker.find("."+E),t=r.elemPicker.find("."+M),u=r.elemPicker.find("."+D),f=r.elemPicker.find("."+Y),p=o[0].offsetTop/180*360,h=100-t[0].offsetTop/180*100,g=t[0].offsetLeft/260*100,v=Math.round(f[0].offsetLeft/280*100)/100,m=r.elemColorBox.find("."+B),e=r.elemPicker.find(".layui-colorpicker-pre").children("div"),y=function(e,i,o,t){r.select(e,i,o);var n=F({h:e,s:i,b:o}),e=H({h:e,s:i,b:o}),i=r.elemPicker.find("."+X).find("input");m.addClass(C).removeClass(w),c[0].style.background="rgb("+n.r+", "+n.g+", "+n.b+")","torgb"===a?i.val("rgb("+n.r+", "+n.g+", "+n.b+")"):"rgba"===a?(f.css("left",280*t),i.val("rgba("+n.r+", "+n.g+", "+n.b+", "+t+")"),c[0].style.background="rgba("+n.r+", "+n.g+", "+n.b+", "+t+")",u[0].style.background="linear-gradient(to right, rgba("+n.r+", "+n.g+", "+n.b+", 0), rgb("+n.r+", "+n.g+", "+n.b+"))"):i.val("#"+e),l.change&&l.change(x.trim(r.elemPicker.find("."+X).find("input").val()))},i=x(['
                                                  '].join("")),b=function(e){x("#LAY-colorpicker-moving")[0]||x("body").append(i),i.on("mousemove",e),i.on("mouseup",function(){i.remove()}).on("mouseleave",function(){i.remove()})},n=!0,k=!0;o.on("mousedown",function(e,i){var t=this.offsetTop,n=(e.clientY===undefined?i:e).clientY;k&&layui.stope(e),b(function(e){var i=t+(e.clientY-n),o=s[0].offsetHeight,o=(i=o<(i=i<0?0:i)?o:i)/180*360;y(p=o,g,h,v),e.preventDefault()}),e.preventDefault()}),s.on("mousedown",function(e){var i=e.clientY-x(this).offset().top+W.scrollTop(),i=(i=(i=i<0?0:i)>this.offsetHeight?this.offsetHeight:i)/180*360;y(p=i,g,h,v),e.preventDefault(),n&&o.trigger("mousedown",e)}),t.on("mousedown",function(e,i){var r=this.offsetTop,l=this.offsetLeft,c=(e.clientY===undefined?i:e).clientY,a=(e.clientX===undefined?i:e).clientX;k&&layui.stope(e),b(function(e){var i=r+(e.clientY-c),o=l+(e.clientX-a),t=d[0].offsetHeight,n=d[0].offsetWidth,n=(o=n<(o=o<0?0:o)?n:o)/260*100,o=100-(i=t<(i=i<0?0:i)?t:i)/180*100;y(p,g=n,h=o,v),e.preventDefault()}),e.preventDefault()}),d.on("mousedown",function(e){var i=e.clientY-x(this).offset().top+W.scrollTop(),o=e.clientX-x(this).offset().left+W.scrollLeft(),o=((i=i<0?0:i)>this.offsetHeight&&(i=this.offsetHeight),(o=(o=o<0?0:o)>this.offsetWidth?this.offsetWidth:o)/260*100),i=100-i/180*100;y(p,g=o,h=i,v),layui.stope(e),e.preventDefault(),n&&t.trigger("mousedown",e)}),f.on("mousedown",function(e,i){var t=this.offsetLeft,n=(e.clientX===undefined?i:e).clientX;k&&layui.stope(e),b(function(e){var i=t+(e.clientX-n),o=u[0].offsetWidth,o=(o<(i=i<0?0:i)&&(i=o),Math.round(i/280*100)/100);y(p,g,h,v=o),e.preventDefault()}),e.preventDefault()}),u.on("mousedown",function(e){var i=e.clientX-x(this).offset().left,i=((i=i<0?0:i)>this.offsetWidth&&(i=this.offsetWidth),Math.round(i/280*100)/100);y(p,g,h,v=i),e.preventDefault(),n&&f.trigger("mousedown",e)}),e.each(function(){x(this).on("click",function(){x(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e=this.style.backgroundColor,i=j(L(e)),o=e.slice(e.lastIndexOf(",")+1,e.length-1);p=i.h,g=i.s,h=i.b,3===(e.match(/[0-9]{1,3}/g)||[]).length&&(o=1),v=o,y(i.h,i.s,i.b,o)})}),P.touchEventsSupported()&&layui.each([{elem:s,eventType:"mousedown"},{elem:u,eventType:"mousedown"},{elem:d,eventType:"mousedown"}],function(e,t){P.touchSwipe(t.elem,{onTouchStart:function(){k=n=!1},onTouchMove:function(e){var i,o;e=e,i=t.eventType,e=e.touches[0],(o=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,e.screenX,e.screenY,e.clientX,e.clientY,!1,!1,!1,!1,0,null),e.target.dispatchEvent(o)},onTouchEnd:function(){i.remove(),k=n=!0}})})},s.prototype.select=function(e,i,o,t){this.config;var n=H({h:e,s:100,b:100}),e=(H({h:e,s:i,b:o}),e/360*180),o=180-o/100*180,i=i/100*260,r=this.elemPicker.find("."+E)[0];this.elemPicker.find("."+I).css("top",e),r.style.background="#"+n,this.elemPicker.find("."+M).css({top:o/r.offsetHeight*100+"%",left:i/r.offsetWidth*100+"%"})},s.prototype.pickerEvents=function(){var c=this,a=c.config,s=c.elemColorBox.find("."+T),d=c.elemPicker.find("."+X+" input"),o={clear:function(e){s[0].style.background="",c.elemColorBox.find("."+B).removeClass(C).addClass(w),c.color="",a.done&&a.done(""),c.removePicker()},confirm:function(e,i){var o,t,n,r,l=x.trim(d.val());-1>16,g:(65280&n)>>8,b:255&n},t=j(r),s[0].style.background=o="#"+H(t),c.elemColorBox.find("."+B).removeClass(w).addClass(C)),"change"===i?(c.select(t.h,t.s,t.b,i),a.change&&a.change(o)):(c.color=l,a.done&&a.done(l),c.removePicker())}};c.elemPicker.on("click","*[colorpicker-events]",function(){var e=x(this),i=e.attr("colorpicker-events");o[i]&&o[i].call(this,e)}),d.on("keyup",function(e){var i=x(this);o.confirm.call(this,i,13===e.keyCode?null:"change")})},s.prototype.events=function(){var e=this;e.config;e.elemColorBox.on("click",function(){e.renderPicker(),x(c)[0]&&(e.val(),e.side())})},a.on(i,function(e){var i,o,t;r.thisId&&(i=n.getThis(r.thisId))&&(o=i.config,t=i.elemColorBox.find("."+T),x(e.target).hasClass(l)||x(e.target).parents("."+l)[0]||x(e.target).hasClass(c.replace(/\./g,""))||x(e.target).parents(c)[0]||i.elemPicker&&(i.color?(e=j(L(i.color)),i.select(e.h,e.s,e.b)):i.elemColorBox.find("."+B).removeClass(C).addClass(w),t[0].style.background=i.color||"","function"==typeof o.cancel&&o.cancel(i.color),i.removePicker()))}),W.on("resize",function(){if(r.thisId){var e=n.getThis(r.thisId);if(e)return!(!e.elemPicker||!x(c)[0])&&void e.position()}}),n.that={},n.getThis=function(e){var i=n.that[e];return i||o.error(e?t+" instance with ID '"+e+"' not found":"ID argument required"),i},r.render=function(e){e=new s(e);return n.call(e)},e(t,r)});layui.define("jquery",function(t){"use strict";var u=layui.$,d=(layui.hint(),layui.device()),r="element",y="layui-this",f="layui-show",c=".layui-tab-title",i=function(){this.config={}},h=(i.prototype.set=function(t){return u.extend(!0,this.config,t),this},i.prototype.on=function(t,i){return layui.onevent.call(this,r,t,i)},i.prototype.tabAdd=function(t,i){var a,e=u(".layui-tab[lay-filter="+t+"]"),l=e.children(c),n=l.children(".layui-tab-bar"),s=e.children(".layui-tab-content"),o=""+(i.title||"unnaming")+"";return n[0]?n.before(o):l.append(o),s.append('
                                                  "+(i.content||"")+"
                                                  "),i.change&&this.tabChange(t,i.id),l.data("LAY_TAB_CHANGE",i.change),w.tabAuto(i.change?"change":null,e),this},i.prototype.tabDelete=function(t,i,a){t=u(".layui-tab[lay-filter="+t+"]").children(c).find('>li[lay-id="'+i+'"]');return w.tabDelete.call(t[0],{liElem:t,force:a}),this},i.prototype.tabChange=function(t,i,a){t=u(".layui-tab[lay-filter="+t+"]").children(c).find('>li[lay-id="'+i+'"]');return w.tabClick.call(t[0],{liElem:t,force:a}),this},i.prototype.tab=function(a){a=a||{},e.on("click",a.headerElem,function(t){var i=u(a.headerElem).index(u(this));w.tabClick.call(this,{index:i,options:a})})},i.prototype.progress=function(t,i){var a="layui-progress",t=u("."+a+"[lay-filter="+t+"]").find("."+a+"-bar"),a=t.find("."+a+"-text");return t.css("width",function(){return/^.+\/.+$/.test(i)?100*new Function("return "+i)()+"%":i}).attr("lay-percent",i),a.text(i),this},".layui-nav"),p="layui-nav-item",b="layui-nav-bar",v="layui-nav-tree",m="layui-nav-child",g="layui-nav-more",C="layui-anim layui-anim-upbit",w={tabClick:function(t){var i=(t=t||{}).options||{},a=t.liElem||u(this),e=i.headerElem?a.parent():a.parents(".layui-tab").eq(0),i=i.bodyElem?u(i.bodyElem):e.children(".layui-tab-content").children(".layui-tab-item"),l=a.find("a"),l="javascript:;"!==l.attr("href")&&"_blank"===l.attr("target"),n="string"==typeof a.attr("lay-unselect"),s=e.attr("lay-filter"),o=a.attr("lay-id"),c="index"in t?t.index:a.parent().children("li").index(a);if(!t.force){var t=a.siblings("."+y);if(!1===layui.event.call(this,r,"tabBeforeChange("+s+")",{elem:e,from:{index:a.parent().children("li").index(t),id:t.attr("lay-id")},to:{index:c,id:o}}))return}l||n||(a.addClass(y).siblings().removeClass(y),(o?t=(t=i.filter('[lay-id="'+o+'"]')).length?t:i.eq(c):i.eq(c)).addClass(f).siblings().removeClass(f)),layui.event.call(this,r,"tab("+s+")",{elem:e,index:c,id:o})},tabDelete:function(t){var i=(t=t||{}).liElem||u(this).parent(),a=i.parent().children("li").index(i),e=i.closest(".layui-tab"),l=e.children(".layui-tab-content").children(".layui-tab-item"),n=e.attr("lay-filter"),s=i.attr("lay-id");if(!t.force&&!1===layui.event.call(i[0],r,"tabBeforeDelete("+n+")",{elem:e,index:a,id:s}))return;i.hasClass(y)&&(i.next()[0]&&i.next().is("li")?w.tabClick.call(i.next()[0],{index:a+1}):i.prev()[0]&&i.prev().is("li")&&w.tabClick.call(i.prev()[0],null,a-1)),i.remove(),(s?t=(t=l.filter('[lay-id="'+s+'"]')).length?t:l.eq(a):l.eq(a)).remove(),setTimeout(function(){w.tabAuto(null,e)},50),layui.event.call(this,r,"tabDelete("+n+")",{elem:e,index:a,id:s})},tabAuto:function(l,t){var n="layui-tab-more",s="layui-tab-bar",o="layui-tab-close",c=this;(t||u(".layui-tab")).each(function(){var t=u(this),a=t.children(".layui-tab-title"),i=(t.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),i=u(''),e=(c===window&&d.ie,t.attr("lay-allowclose"));e&&"false"!==e&&a.find("li").each(function(){var t,i=u(this);i.find("."+o)[0]||"false"===i.attr("lay-allowclose")||((t=u('')).on("click",function(t){w.tabDelete.call(this,{e:t})}),i.append(t))}),"string"!=typeof t.attr("lay-unauto")&&(a.prop("scrollWidth")>a.outerWidth()+1||a.find("li").length&&a.height()>(e=a.find("li").eq(0).height())+e/2?("change"===l&&a.data("LAY_TAB_CHANGE")&&a.addClass(n),a.find("."+s)[0]||(a.append(i),t.attr("overflow",""),i.on("click",function(t){var i=a.hasClass(n);a[i?"removeClass":"addClass"](n)}))):(a.find("."+s).remove(),t.removeAttr("overflow")))})},hideTabMore:function(t){var i=u(".layui-tab-title");!0!==t&&"tabmore"===u(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=u(this),i=t.closest(h),a=i.attr("lay-filter"),e=t.parent(),l=t.siblings("."+m),n="string"==typeof e.attr("lay-unselect");if("javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||n||l[0]||(i.find("."+y).removeClass(y),e.addClass(y)),i.hasClass(v)){var n=p+"ed",s=!e.hasClass(n),o=function(){u(this).css({display:""}),i.children("."+b).css({opacity:0})};if(l.is(":animated"))return;l.removeClass(C),l[0]&&(s?(l.slideDown(200,o),e.addClass(n)):(e.removeClass(n),l.show().slideUp(200,o)),"string"!=typeof i.attr("lay-accordion")&&"all"!==i.attr("lay-shrink")||((s=e.siblings("."+n)).removeClass(n),s.children("."+m).show().stop().slideUp(200,o)))}layui.event.call(this,r,"nav("+a+")",t)},collapse:function(){var t=u(this),i=t.find(".layui-colla-icon"),a=t.siblings(".layui-colla-content"),e=t.parents(".layui-collapse").eq(0),l=e.attr("lay-filter"),n="none"===a.css("display");"string"==typeof e.attr("lay-accordion")&&((e=e.children(".layui-colla-item").children("."+f)).siblings(".layui-colla-title").children(".layui-colla-icon").html(""),e.removeClass(f)),a[n?"addClass":"removeClass"](f),i.html(n?"":""),layui.event.call(this,r,"collapse("+l+")",{title:t,content:a,show:n})}},a=(i.prototype.render=i.prototype.init=function(t,i){var a="string"==typeof i&&i?'[lay-filter="'+i+'"]':"",e={tab:function(t){t=t||u(".layui-tab"+a);w.tabAuto.call({},null,t)},nav:function(t){var s={},o={},c={},r="layui-nav-title";(t||u(h+a)).each(function(t){var i=u(this),a=u(''),e=i.find("."+p),l=i.find("."+b);l[0]&&l.remove(),i.append(a),(i.hasClass(v)?e.find("dd,>."+r):e).off("mouseenter.lay_nav").on("mouseenter.lay_nav",function(){!function(t,i,a){var e,l=u(this),n=l.find("."+m);i.hasClass(v)?n[0]||(e=l.children("."+r),t.css({top:l.offset().top-i.offset().top,height:(e[0]?e:l).outerHeight(),opacity:1})):(n.addClass(C),n.hasClass("layui-nav-child-c")&&n.css({left:-(n.outerWidth()-l.width())/2}),n[0]?t.css({left:t.position().left+t.width()/2,width:0,opacity:0}):t.css({left:l.position().left+parseFloat(l.css("marginLeft")),top:l.position().top+l.height()-t.height()}),s[a]=setTimeout(function(){t.css({width:n[0]?0:l.width(),opacity:n[0]?0:1})},d.ie&&d.ie<10?0:200),clearTimeout(c[a]),"block"===n.css("display")&&clearTimeout(o[a]),o[a]=setTimeout(function(){n.addClass(f),l.find("."+g).addClass(g+"d")},300))}.call(this,a,i,t)}).off("mouseleave.lay_nav").on("mouseleave.lay_nav",function(){i.hasClass(v)?a.css({height:0,opacity:0}):(clearTimeout(o[t]),o[t]=setTimeout(function(){i.find("."+m).removeClass(f),i.find("."+g).removeClass(g+"d")},300))}),i.off("mouseleave.lay_nav").on("mouseleave.lay_nav",function(){clearTimeout(s[t]),c[t]=setTimeout(function(){i.hasClass(v)||a.css({width:0,left:a.position().left+a.width()/2,opacity:0})},200)}),e.find("a").each(function(){var t=u(this);t.parent();t.siblings("."+m)[0]&&!t.children("."+g)[0]&&t.append(''),t.off("click",w.clickThis).on("click",w.clickThis)})})},breadcrumb:function(t){(t||u(".layui-breadcrumb"+a)).each(function(){var t=u(this),i="lay-separator",a=t.attr(i)||"/",e=t.find("a");e.next("span["+i+"]")[0]||(e.each(function(t){t!==e.length-1&&u(this).after(""+a+"")}),t.css("visibility","visible"))})},progress:function(t){var e="layui-progress";(t||u("."+e+a)).each(function(){var t=u(this),i=t.find(".layui-progress-bar"),a=i.attr("lay-percent");i.css("width",function(){return/^.+\/.+$/.test(a)?100*new Function("return "+a)()+"%":a}),t.attr("lay-showpercent")&&setTimeout(function(){i.html(''+a+"")},350)})},collapse:function(t){(t||u(".layui-collapse"+a)).each(function(){u(this).find(".layui-colla-item").each(function(){var t=u(this),i=t.find(".layui-colla-title"),t="none"===t.find(".layui-colla-content").css("display");i.find(".layui-colla-icon").remove(),i.append(''+(t?"":"")+""),i.off("click",w.collapse).on("click",w.collapse)})})}};return t&&"object"==typeof i&&i instanceof u?e[t](i):e[t]?e[t]():layui.each(e,function(t,i){i()})},new i),e=u(document);u(function(){a.render()}),e.on("click",".layui-tab-title li",w.tabClick),u(window).on("resize",w.tabAuto),t(r,a)});layui.define(["lay","layer"],function(e){"use strict";var F=layui.$,a=layui.lay,t=layui.layer,R=layui.device(),i="upload",s="layui_"+i+"_index",w={config:{},index:layui[i]?layui[i].index+1e4:0,set:function(e){var t=this;return t.config=F.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,i,e,t)}},o=function(){var t=this,e=t.config.id;return{upload:function(e){t.upload.call(t,e)},reload:function(e){t.reload.call(t,e)},config:(o.that[e]=t).config}},r="layui-upload-file",l="layui-upload-form",E="layui-upload-iframe",L="layui-upload-choose",T="UPLOADING",D=function(e){var t=this;t.index=++w.index,t.config=F.extend({},t.config,w.config,e),t.render()};D.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",force:"",field:"file",acceptMime:"",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1,text:{"cross-domain":"Cross-domain requests are not supported","data-format-error":"Please return JSON data format","check-error":"",error:"","limit-number":null,"limit-size":null}},D.prototype.reload=function(e){var t=this;t.config=F.extend({},t.config,e),t.render(!0)},D.prototype.render=function(e){var t=this,i=t.config,n=F(i.elem);return 1"].join("")),n=t.elem.next();(n.hasClass(r)||n.hasClass(l))&&n.remove(),R.ie&&R.ie<10&&t.elem.wrap('
                                                  '),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(i),R.ie&&R.ie<10&&e.initIE()},D.prototype.initIE=function(){var i,e=this.config,t=F(''),n=F(['
                                                  ',"
                                                  "].join(""));F("#"+E)[0]||F("body").append(t),e.elem.next().hasClass(l)||(this.elemFile.wrap(n),e.elem.next("."+l).append((i=[],layui.each(e.data,function(e,t){t="function"==typeof t?t():t,i.push('')}),i.join(""))))},D.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},D.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},D.prototype.preview=function(n){window.FileReader&&layui.each(this.chooseFiles,function(e,t){var i=new FileReader;i.readAsDataURL(t),i.onload=function(){n&&n(e,t,this.result)}})},D.prototype.upload=function(e,t){var i,n,a,o,r,u=this,f=u.config,s=f.text||{},l=u.elemFile[0],c=function(){return e||u.files||u.chooseFiles||l.files},d=function(){var a=0,o=0,r=c(),l=function(){f.multiple&&a+o===u.fileLength&&"function"==typeof f.allDone&&f.allDone({total:u.fileLength,successful:a,failed:o})},i=function(i){var n=new FormData,t=function(e){i.unified?layui.each(r,function(e,t){delete t[T]}):delete e[T]};if(layui.each(f.data,function(e,t){t="function"==typeof t?i.unified?t():t(i.index,i.file):t,n.append(e,t)}),i.unified)layui.each(r,function(e,t){t[T]||(t[T]=!0,n.append(f.field,t))});else{if(i.file[T])return;n.append(f.field,i.file),i.file[T]=!0}var e={url:f.url,type:"post",data:n,dataType:f.dataType||"json",contentType:!1,processData:!1,headers:f.headers||{},success:function(e){f.unified?a+=u.fileLength:a++,m(i.index,e),l(i.index),t(i.file)},error:function(e){f.unified?o+=u.fileLength:o++,u.msg(s.error||["Upload failed, please try again.","status: "+(e.status||"")+" - "+(e.statusText||"error")].join("
                                                  ")),g(i.index,e.responseText,e),l(i.index),t(i.file)}};"function"==typeof f.progress&&(e.xhr=function(){var e=F.ajaxSettings.xhr();return e.upload.addEventListener("progress",function(e){var t;e.lengthComputable&&(t=Math.floor(e.loaded/e.total*100),f.progress(t,(f.item||f.elem)[0],e,i.index))}),e}),F.ajax(e)};f.unified?i({unified:!0,index:0}):layui.each(r,function(e,t){i({index:e,file:t})})},p=function(){var n=F("#"+E);u.elemFile.parent().submit(),clearInterval(D.timer),D.timer=setInterval(function(){var e,t=n.contents().find("body");try{e=t.text()}catch(i){u.msg(s["cross-domain"]),clearInterval(D.timer),g()}e&&(clearInterval(D.timer),t.html(""),m(0,e))},30)},h=function(e){if("json"===f.force&&"object"!=typeof e)try{return{status:"CONVERTED",data:JSON.parse(e)}}catch(t){return u.msg(s["data-format-error"]),{status:"FORMAT_ERROR",data:{}}}return{status:"DO_NOTHING",data:{}}},m=function(e,t){u.elemFile.next("."+L).remove(),l.value="";var i=h(t);switch(i.status){case"CONVERTED":t=i.data;break;case"FORMAT_ERROR":return}"function"==typeof f.done&&f.done(t,e||0,function(e){u.upload(e)})},g=function(e,t,i){f.auto&&(l.value="");var n=h(t);switch(n.status){case"CONVERTED":t=n.data;break;case"FORMAT_ERROR":return}"function"==typeof f.error&&f.error(e||0,function(e){u.upload(e)},t,i)},v=f.exts,y=(n=[],layui.each(e||u.chooseFiles,function(e,t){n.push(t.name)}),n),x={preview:function(e){u.preview(e)},upload:function(e,t){var i={};i[e]=t,u.upload(i)},pushFile:function(){return u.files=u.files||{},layui.each(u.chooseFiles,function(e,t){u.files[e]=t}),u.files},resetFile:function(e,t,i){t=new File([t],i);u.files=u.files||{},u.files[e]=t},getChooseFiles:function(){return u.chooseFiles}},b={file:"\u6587\u4ef6",images:"\u56fe\u7247",video:"\u89c6\u9891",audio:"\u97f3\u9891"}[f.accept]||"\u6587\u4ef6",y=0===y.length?l.value.match(/[^\/\\]+\..+/g)||[]:y;if(0!==y.length){switch(f.accept){case"file":layui.each(y,function(e,t){if(v&&!RegExp(".\\.("+v+")$","i").test(escape(t)))return i=!0});break;case"video":layui.each(y,function(e,t){if(!RegExp(".\\.("+(v||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(t)))return i=!0});break;case"audio":layui.each(y,function(e,t){if(!RegExp(".\\.("+(v||"mp3|wav|mid")+")$","i").test(escape(t)))return i=!0});break;default:layui.each(y,function(e,t){if(!RegExp(".\\.("+(v||"jpg|png|gif|bmp|jpeg|svg|webp")+")$","i").test(escape(t)))return i=!0})}if(i)return u.msg(s["check-error"]||"\u9009\u62e9\u7684"+b+"\u4e2d\u5305\u542b\u4e0d\u652f\u6301\u7684\u683c\u5f0f"),l.value="";if("choose"!==t&&!f.auto||(f.choose&&f.choose(x),"choose"!==t)){if(u.fileLength=(a=0,b=c(),layui.each(b,function(){a++}),a),f.number&&u.fileLength>f.number)return u.msg("function"==typeof s["limit-number"]?s["limit-number"](f,u.fileLength):"\u540c\u65f6\u6700\u591a\u53ea\u80fd\u4e0a\u4f20: "+f.number+" \u4e2a\u6587\u4ef6
                                                  \u60a8\u5f53\u524d\u5df2\u7ecf\u9009\u62e9\u4e86: "+u.fileLength+" \u4e2a\u6587\u4ef6");if(01024*f.size&&(t=1<=(t=f.size/1024)?t.toFixed(2)+"MB":f.size+"KB",l.value="",o=t)}),o)return u.msg("function"==typeof s["limit-size"]?s["limit-size"](f,o):"\u6587\u4ef6\u5927\u5c0f\u4e0d\u80fd\u8d85\u8fc7 "+o);r=function(){if(R.ie)return(9'+e+"")},l=function(i){var n=!0;return layui.each(a.files,function(e,t){if(!(n=!(t.name===i.name)))return!0}),n},u=function(e){var i=function(e){e.ext=e.name.substr(e.name.lastIndexOf(".")+1).toLowerCase(),e.sizes=w.util.parseSize(e.size)};return e instanceof FileList?layui.each(e,function(e,t){i(t)}):i(e),e},f=function(e){var i;return(e=e||[]).length?a.files?(i=[],layui.each(e,function(e,t){l(t)&&i.push(u(t))}),i):u(e):[]};n.elem.off("upload.start").on("upload.start",function(){var e=F(this);a.config.item=e,a.elemFile[0].click()}),R.ie&&R.ie<10||n.elem.off("upload.over").on("upload.over",function(){F(this).attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){F(this).removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(e,t){var i=F(this),t=f(t.originalEvent.dataTransfer.files);i.removeAttr("lay-over"),o(t),n.auto?a.upload():r(t)}),a.elemFile.on("change",function(){var e=f(this.files);0!==e.length&&(o(e),n.auto?a.upload():r(e))}),n.bindAction.off("upload.action").on("upload.action",function(){a.upload()}),n.elem.data(s)||(n.elem.on("click",function(){a.isFile()||F(this).trigger("upload.start")}),n.drag&&n.elem.on("dragover",function(e){e.preventDefault(),F(this).trigger("upload.over")}).on("dragleave",function(e){F(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),F(this).trigger("upload.drop",e)}),n.bindAction.on("click",function(){F(this).trigger("upload.action")}),n.elem.data(s,n.id))},w.util={parseSize:function(e,t){var i,n;return t=t||2,null!=e&&e?(i="string"==typeof e?parseFloat(e):e,n=Math.floor(Math.log(i)/Math.log(1024)),(e=(e=i/Math.pow(1024,n))%1==0?e:parseFloat(e.toFixed(t)))+["Bytes","Kb","Mb","Gb","Tb","Pb","Eb","Zb","Yb"][n]):"0"},promiseLikeResolve:function(e){var t=F.Deferred();return e&&"function"==typeof e.then?e.then(t.resolve,t.reject):t.resolve(e),t.promise()}},o.that={},o.getThis=function(e){var t=o.that[e];return t||hint.error(e?i+" instance with ID '"+e+"' not found":"ID argument required"),t},w.render=function(e){e=new D(e);return o.call(e)},e(i,w)});layui.define(["lay","layer","util"],function(e){"use strict";var T=layui.$,h=layui.layer,d=layui.util,l=layui.hint(),_=(layui.device(),"form"),p=".layui-form",E="layui-this",O="layui-hide",A="layui-disabled",y="layui-input-number-invalid",f=lay.ie&&8===parseFloat(lay.ie)||void 0===Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,"checked"),t=function(){this.config={verify:{required:function(e){if(!/[\S]+/.test(e)||e===undefined||null===e)return"\u5fc5\u586b\u9879\u4e0d\u80fd\u4e3a\u7a7a"},phone:function(e){if(e&&!/^1\d{10}$/.test(e))return"\u624b\u673a\u53f7\u683c\u5f0f\u4e0d\u6b63\u786e"},email:function(e){if(e&&!/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(e))return"\u90ae\u7bb1\u683c\u5f0f\u4e0d\u6b63\u786e"},url:function(e){if(e&&!/^(#|(http(s?)):\/\/|\/\/)[^\s]+\.[^\s]+$/.test(e))return"\u94fe\u63a5\u683c\u5f0f\u4e0d\u6b63\u786e"},number:function(e){if(e&&isNaN(e))return"\u53ea\u80fd\u586b\u5199\u6570\u5b57"},date:function(e){if(e&&!/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/.test(e))return"\u65e5\u671f\u683c\u5f0f\u4e0d\u6b63\u786e"},identity:function(e){if(e&&!/(^\d{15}$)|(^\d{17}(x|X|\d)$)/.test(e))return"\u8eab\u4efd\u8bc1\u53f7\u683c\u5f0f\u4e0d\u6b63\u786e"}},autocomplete:null}},i=(t.prototype.set=function(e){return T.extend(!0,this.config,e),this},t.prototype.verify=function(e){return T.extend(!0,this.config.verify,e),this},t.prototype.getFormElem=function(e){return T(p+(e?'[lay-filter="'+e+'"]':""))},t.prototype.on=function(e,t){return layui.onevent.call(this,_,e,t)},t.prototype.val=function(e,o){return this.getFormElem(e).each(function(e,t){var i,a,n,l,r=T(this);for(i in o)lay.hasOwn(o,i)&&(n=o[i],(l=r.find('[name="'+i+'"]'))[0])&&("checkbox"===(a=l[0].type)?l[0].checked=n:"radio"===a?l.each(function(){this.checked=this.value==n+""}):l.val(n))}),r.render(null,e),this.getValue(e)},t.prototype.getValue=function(e,t){t=t||this.getFormElem(e);var n={},l={},e=t.find("input,select,textarea");return layui.each(e,function(e,t){var i,a=T(this);t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name&&(/^.*\[\]$/.test(t.name)&&(i=t.name.match(/^(.*)\[\]$/g)[0],n[i]=0|n[i],i=t.name.replace(/^(.*)\[\]$/,"$1["+n[i]+++"]")),/^(checkbox|radio)$/.test(t.type)&&!t.checked||(l[i||t.name]="SELECT"===this.tagName&&"string"==typeof this.getAttribute("multiple")?a.val()||[]:this.value))}),l},t.prototype.render=function(e,t){var u=this,i=u.config,a=T(p+(t?'[lay-filter="'+t+'"]':"")),n={input:function(e){var e=e||a.find("input,textarea"),h=(i.autocomplete&&e.attr("autocomplete",i.autocomplete),function(e,t){var i=e.val(),a=Number(i),n=Number(e.attr("step"))||1,l=Number(e.attr("min")),r=Number(e.attr("max")),o=Number(e.attr("lay-precision")),s="click"!==t&&""===i,c="init"===t,u=isNaN(a),d="string"==typeof e.attr("lay-step-strictly");if(e.toggleClass(y,u),!u){if("click"===t){if("text"===e[0].type&&"string"==typeof e.attr("readonly"))return;a=!!T(this).index()?a-n:a+n}u=function(e){return((e.toString().match(/\.(\d+$)/)||[])[1]||"").length},o=0<=o?o:Math.max(u(n),u(i));s||(c||r<=(a=(a=d?Math.round(a/n)*n:a)<=l?l:a)&&(a=r),0===o?a=parseInt(a):0'),e=layui.isArray(i.value)?i.value:[i.value],e=T((a=[],layui.each(e,function(e,t){a.push('')}),a.join(""))),n=(t.append(e),i.split&&t.addClass("layui-input-split"),i.className&&t.addClass(i.className),r.next("."+u)),l=(n[0]&&n.remove(),r.parent().hasClass(s)||r.wrap('
                                                  '),r.next("."+c));l[0]?((n=l.find("."+u))[0]&&n.remove(),l.prepend(t),r.css("padding-right",function(){return(r.closest(".layui-input-group")[0]?0:l.outerWidth())+t.outerWidth()})):(t.addClass(c),r.after(t)),"auto"===i.show&&d(t,r.val()),"function"==typeof i.init&&i.init.call(this,r,i),r.on("input propertychange",function(){var e=this.value;"auto"===i.show&&d(t,e)}),r.on("blur",function(){"function"==typeof i.blur&&i.blur.call(this,r,i)}),e.on("click",function(){var e=r.attr("lay-filter");T(this).hasClass(A)||("function"==typeof i.click&&i.click.call(this,r,i),layui.event.call(this,_,"input-affix("+e+")",{elem:r[0],affix:o,options:i}))})},p={eye:{value:"eye-invisible",click:function(e,t){var i="LAY_FORM_INPUT_AFFIX_SHOW",a=e.data(i);e.attr("type",a?"password":"text").data(i,!a),n({value:a?"eye-invisible":"eye"})}},clear:{value:"clear",click:function(e){e.val("").focus(),d(T(this).parent(),null)},show:"auto",disabled:e},number:{value:["up","down"],split:!0,className:"layui-input-number",disabled:r.is("[disabled]"),init:function(a){var e,n,l,t,i,r;"text"!==a.attr("type")&&"text"!==a[0].type||(l=n=!(e=".lay_input_number"),t="string"==typeof a.attr("readonly"),i="string"==typeof a.attr("lay-wheel"),r=a.next(".layui-input-number").children("i"),a.attr("lay-input-mirror",a.val()),a.off(e),a.on("keydown"+e,function(e){n=!1,8!==e.keyCode&&46!==e.keyCode||(n=!0),t||2!==r.length||38!==e.keyCode&&40!==e.keyCode||(e.preventDefault(),r.eq(38===e.keyCode?0:1).click())}),a.on("input"+e+" propertychange"+e,function(e){var t,i;l||"propertychange"===e.type&&"value"!==e.originalEvent.propertyName||(n||""===(e=this.value)||"00"!==e.slice(0,2)&&!e.match(/\s/g)&&!((t=e.match(/\./g))&&1=Math.abs(e.deltaY)?e.deltaX:e.deltaY):"mousewheel"===e.type?t=-e.originalEvent.wheelDelta:"DOMMouseScroll"===e.type&&(t=e.originalEvent.detail),r.eq(0S.height()&&t<=e&&l.addClass(C+"up"),h(),s&&g.off("mousedown.lay_select_ieph").on("mousedown.lay_select_ieph",function(){m[0].__ieph=!0,setTimeout(function(){m[0].__ieph=!1},60)}),n=lay.onClickOutside((a?l:g)[0],function(){p(),k&&m.val(k)},{ignore:v,detectIframe:!0,capture:!1})},p=function(e){v.parent().removeClass(C+"ed "+C+"up"),m.blur(),u&&g.children("."+N).remove(),"function"==typeof n&&(n(),n=null),a&&(l.detach(),T(window).off("resize.lay_select_resize")),e||y(m.val(),function(e){var t=f[0].selectedIndex;e&&(k=T(f[0].options[t]).prop("text"),0===t&&k===m.attr("placeholder")&&(k=""),m.val(k||""))})},h=function(){var e,t,i=g.children("dd."+E);i[0]&&(e=i.position().top,t=g.height(),i=i.height(),t").addClass(N).attr("lay-value",n).text(n),a=(i=g.children().eq(0)).hasClass("layui-select-tips"),i[a?"after":"before"](t)):e?g.find("."+w)[0]||g.append('

                                                  \u65e0\u5339\u914d\u9879

                                                  '):g.find("."+w).remove()},"keyup"),""===n&&(f.val(""),g.find("."+E).removeClass(E),(f[0].options[0]||{}).value||g.children("dd:eq(0)").addClass(E),g.find("."+w).remove(),u)&&g.children("."+N).remove(),void h()))},50)).on("blur",function(e){var t=f[0].selectedIndex;k=T(f[0].options[t]).prop("text"),0===t&&k===m.attr("placeholder")&&(k=""),setTimeout(function(){y(m.val(),function(e){k||m.val("")},"blur")},200)}),g.on("click","dd",function(){var e,t,i=T(this),a=i.attr("lay-value"),n=f.attr("lay-filter");return i.hasClass(A)||(u&&i.hasClass(N)&&(t=(e=T("
                                                  "].join(""));i.after(l),function(t,i){var a=T(this),e=a.attr("lay-skin")||"primary",n="switch"===e,e="primary"===e;t.on("click",function(){var e=a.attr("lay-filter");a[0].disabled||(a[0].indeterminate&&(a[0].indeterminate=!1),a[0].checked=!a[0].checked,layui.event.call(a[0],_,i[2]+"("+e+")",{elem:a[0],value:a[0].value,othis:t}))}),u.syncAppearanceOnPropChanged(this,"checked",function(){var e;n&&(e=(t.next("*[lay-checkbox]")[0]?t.next().html():a.attr("title")||"").split("|"),t.children("div").html(!this.checked&&e[1]||e[0])),t.toggleClass(i[1],this.checked)}),e&&u.syncAppearanceOnPropChanged(this,"indeterminate",function(){this.indeterminate?t.children(".layui-icon-ok").removeClass("layui-icon-ok").addClass(c.SUBTRA):t.children("."+c.SUBTRA).removeClass(c.SUBTRA).addClass("layui-icon-ok")})}.call(this,l,r)})},radio:function(e){var s="layui-form-radio",c=["layui-icon-radio","layui-icon-circle"],e=e||a.find("input[type=radio]");e.each(function(e,t){var i=T(this),a=i.next("."+s),n=this.disabled,l=i.attr("lay-skin");if(i.closest("[lay-ignore]").length)return i.show();f&&v.call(t,"lay-form-sync-checked",t.checked),a[0]&&a.remove();var a=d.escape(t.title||""),r=[],o=(i.next("[lay-radio]")[0]&&(a=(o=i.next()).html()||"",1",'',"
                                                  "+a+"
                                                  ","
                                                  "].join("")));i.after(o),function(i){var a=T(this),n="layui-anim-scaleSpring";i.on("click",function(){var e=a.attr("lay-filter");a[0].disabled||(a[0].checked=!0,layui.event.call(a[0],_,"radio("+e+")",{elem:a[0],value:a[0].value,othis:i}))}),u.syncAppearanceOnPropChanged(this,"checked",function(){var e,t=this;t.checked?(i.addClass(s+"ed"),i.children(".layui-icon").addClass(n+" "+c[0]),e=a.parents(p).find("input[name="+t.name.replace(/(\.|#|\[|\])/g,"\\$1")+"]"),layui.each(e,function(){t!==this&&(this.checked=!1)})):(i.removeClass(s+"ed"),i.children(".layui-icon").removeClass(n+" "+c[0]).addClass(c[1]))})}.call(this,o)})}},t=function(){layui.each(n,function(e,t){t()})};return"object"===layui.type(e)?T(e).is(p)?(a=T(e),t()):e.each(function(e,t){var i=T(t);i.closest(p).length&&("SELECT"===t.tagName?n.select(i):"INPUT"===t.tagName&&("checkbox"===(t=t.type)||"radio"===t?n[t](i):n.input(i)))}):e?n[e]?n[e]():l.error('\u4e0d\u652f\u6301\u7684 "'+e+'" \u8868\u5355\u6e32\u67d3'):t(),u},t.prototype.syncAppearanceOnPropChanged=f?function(e,t,i){var a=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,t);Object.defineProperty(e,t,lay.extend({},a,{get:function(){return"string"==typeof this.getAttribute("lay-form-sync-"+t)},set:function(e){v.call(this,"lay-form-sync-"+t,e),i.call(this)}}))}:function(e,t,i){var a=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,t);Object.defineProperty(e,t,lay.extend({},a,{get:function(){return a.get.call(this)},set:function(e){a.set.call(this,e),i.call(this)}}))},t.prototype.validate=function(e){var u,d=this.config.verify,p="layui-form-danger";return!(e=T(e))[0]||(e.attr("lay-verify")!==undefined||!1!==this.validate(e.find("*[lay-verify]")))&&(layui.each(e,function(e,r){var o=T(this),t=(o.attr("lay-verify")||"").split("|"),s=o.attr("lay-vertype"),c="string"==typeof(c=o.val())?T.trim(c):c;if(o.removeClass(p),layui.each(t,function(e,t){var i="",a=d[t];if(a){var n="function"==typeof a?i=a(c,r):!a[0].test(c),l="select"===r.tagName.toLowerCase()||/^(checkbox|radio)$/.test(r.type),i=i||a[1];if("required"===t&&(i=o.attr("lay-reqtext")||i),n)return"tips"===s?h.tips(i,!o.closest("[lay-ignore]").length&&l?o.next():o,{tips:1}):"alert"===s?h.alert(i,{title:"\u63d0\u793a",shadeClose:!0}):/\b(string|number)\b/.test(typeof i)&&h.msg(i,{icon:5,shift:6}),setTimeout(function(){(l?o.next().find("input"):r).focus()},7),o.addClass(p),u=!0}}),u)return u}),!u)},t.prototype.submit=function(e,t){var i={},a=T(this),e="string"==typeof e?e:a.attr("lay-filter"),n=this.getFormElem?this.getFormElem(e):a.parents(p).eq(0),l=n.find("*[lay-verify]");return!!r.validate(l)&&(i=r.getValue(null,n),l={elem:this.getFormElem?window.event&&window.event.target:this,form:(this.getFormElem?n:a.parents("form"))[0],field:i},"function"==typeof t&&t(l),layui.event.call(this,_,"submit("+e+")",l))});function v(e,t){var i=!!t,t=2===arguments.length&&!t;return null!==this.getAttribute(e)?i||(this.removeAttribute(e),!1):!t&&(this.setAttribute(e,""),!0)}var m=["-",".","e","E","+"];var r=new t,t=T(document),S=T(window);T(function(){r.render()}),t.on("reset",p,function(){var e=T(this).attr("lay-filter");setTimeout(function(){r.render(null,e)},50)}),t.on("submit",p,i).on("click","*[lay-submit]",i),e(_,r)});layui.define(["lay","laytpl","laypage","form","util"],function(s){"use strict";var f=layui.$,r=layui.lay,m=layui.laytpl,p=layui.laypage,g=layui.layer,i=layui.form,v=layui.util,b=layui.hint(),x=layui.device(),k={config:{checkName:"LAY_CHECKED",indexName:"LAY_INDEX",initIndexName:"LAY_INDEX_INIT",numbersName:"LAY_NUM",disabledName:"LAY_DISABLED"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){return this.config=f.extend({},this.config,e),this},on:function(e,t){return layui.onevent.call(this,R,e,t)}},w=function(){var a=this,e=a.config,i=e.id||e.index;return{config:e,reload:function(e,t){a.reload.call(a,e,t)},reloadData:function(e,t){k.reloadData(i,e,t)},setColsWidth:function(){a.setColsWidth.call(a)},resize:function(){a.resize.call(a)}}},C=function(e){var t=w.that[e];return t||b.error(e?"The table instance with ID '"+e+"' not found":"ID argument required"),t||null},l=function(e){var t=w.config[e];return t||b.error(e?"The table instance with ID '"+e+"' not found":"ID argument required"),t||null},T=function(e){var t=this.config||{},a=(e=e||{}).item3,i=e.content;"numbers"===a.type&&(i=e.tplData[k.config.numbersName]);("escape"in a?a:t).escape&&(i=v.escape(i));t=e.text&&a.exportTemplet||a.templet||a.toolbar;return t&&(i="function"==typeof t?t.call(a,e.tplData,e.obj):m(function(e){try{return r(e).html()}catch(t){return e}}(t)||String(i)).render(f.extend({LAY_COL:a},e.tplData))),e.text?f("
                                                  "+i+"
                                                  ").text():i},R="table",N="lay-"+R+"-id",t=".layui-table",W="layui-hide",y="layui-hide-v",h="layui-none",_="layui-table-view",o=".layui-table-header",D=".layui-table-body",I=".layui-table-fixed-r",P=".layui-table-pageview",L=".layui-table-sort",A="layui-table-checked",E="layui-table-edit",M="layui-table-hover",u="laytable-cell-group",F="layui-table-col-special",S="layui-table-tool-panel",H="layui-table-expanded",O="layui-table-disabled-transition",j="LAY_TABLE_MOVE_DICT",e=function(e){return['',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',(e=e||{}).fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':"","{{# var isSort = !(item2.colGroup) && item2.sort; }}",'",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
                                                  ','
                                                  ','{{# if(item2.type === "checkbox"){ }}','',"{{# } else { }}",'{{-item2.title||""}}',"{{# if(isSort){ }}",'',"{{# } }}","{{# } }}","
                                                  ","
                                                  "].join("")},a=['',"","
                                                  "].join(""),B=[,"{{# if(d.data.toolbar){ }}",'
                                                  ','
                                                  ','
                                                  ',"
                                                  ","{{# } }}",'
                                                  ',"{{# if(d.data.loading){ }}",'
                                                  ','
                                                  ','{{# if(typeof d.data.loading === "string"){ }}',"{{- d.data.loading}}","{{# } else{ }}",'',"{{# } }}","
                                                  ","
                                                  ","{{# } }}","{{# var left, right; }}",'
                                                  ',e(),"
                                                  ",'
                                                  ',a,"
                                                  ","{{# if(left){ }}",'
                                                  ','
                                                  ',e({fixed:!0}),"
                                                  ",'
                                                  ',a,"
                                                  ","
                                                  ","{{# }; }}","{{# if(right){ }}",'
                                                  ','
                                                  ',e({fixed:"right"}),'
                                                  ',"
                                                  ",'
                                                  ',a,"
                                                  ","
                                                  ","{{# }; }}","
                                                  ","{{# if(d.data.totalRow){ }}",'
                                                  ','','',"
                                                  ","
                                                  ","{{# } }}",'
                                                  ','
                                                  ',"
                                                  "].join(""),d=f(window),z=f(document),n=function(e){this.index=++k.index,this.config=f.extend({},this.config,k.config,e),this.render()},c=(n.prototype.config={limit:10,loading:!0,escape:!0,cellMinWidth:60,cellMaxWidth:Number.MAX_VALUE,editTrigger:"click",defaultToolbar:["filter","exports","print"],defaultContextmenu:!0,autoSort:!0,text:{none:"\u65e0\u6570\u636e"},cols:[]},n.prototype.render=function(e){var t=this,a=t.config,i=(a.elem=f(a.elem),a.where=a.where||{},a.id="id"in a?a.id:a.elem.attr("id")||t.index);if(w.that[i]=t,(w.config[i]=a).request=f.extend({pageName:"page",limitName:"limit"},a.request),a.response=f.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",totalRowName:"totalRow",countName:"count"},a.response),null!==a.page&&"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,t.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return t;if(a.elem.attr("lay-filter")||a.elem.attr("lay-filter",a.id),"reloadData"===e)return t.pullData(t.page,{type:"reloadData"});a.index=t.index,t.key=a.id||a.index,t.setInit(),a.height&&/^full-.+$/.test(a.height)?(t.fullHeightGap=a.height.split("-")[1],a.height=d.height()-(parseFloat(t.fullHeightGap)||0)):a.height&&/^#\w+\S*-.+$/.test(a.height)?(i=a.height.split("-"),t.parentHeightGap=i.pop(),t.parentDiv=i.join("-"),a.height=f(t.parentDiv).height()-(parseFloat(t.parentHeightGap)||0)):"function"==typeof a.height&&(t.customHeightFunc=a.height,a.height=t.customHeightFunc());var l,e=a.elem,i=e.next("."+_),n=t.elem=f("
                                                  ");n.addClass((l=[_,_+"-"+t.index,"layui-form","layui-border-box"],a.className&&l.push(a.className),l.join(" "))).attr(((l={"lay-filter":"LAY-TABLE-FORM-DF-"+t.index,style:(l=[],a.width&&l.push("width:"+a.width+"px;"),l.join(""))})[N]=a.id,l)).html(m(B,{open:"{{",close:"}}",tagStyle:"legacy"}).render({data:a,index:t.index})),t.renderStyle(),i[0]&&i.remove(),e.after(n),t.layTool=n.find(".layui-table-tool"),t.layBox=n.find(".layui-table-box"),t.layHeader=n.find(o),t.layMain=n.find(".layui-table-main"),t.layBody=n.find(D),t.layFixed=n.find(".layui-table-fixed"),t.layFixLeft=n.find(".layui-table-fixed-l"),t.layFixRight=n.find(I),t.layTotal=n.find(".layui-table-total"),t.layPage=n.find(".layui-table-page"),t.renderToolbar(),t.renderPagebar(),t.fullSize(),t.setColsWidth({isInit:!0}),t.pullData(t.page),t.events()},n.prototype.initOpts=function(e){this.config;e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||{checkbox:50,radio:50,space:30,numbers:60}[e.type])},n.prototype.setInit=function(e){var n,a,d=this,r=d.config;if(r.clientWidth=r.width||(n=function(e){var t,a;e=e||r.elem.parent(),t=d.getContentWidth(e);try{a="none"===e.css("display")}catch(l){}var i=e.parent();return e[0]&&i&&i[0]&&(!t||a)?n(i):t})(),"width"===e)return r.clientWidth;r.height=r.maxHeight||r.height,r.css&&-1===r.css.indexOf(_)&&(a=r.css.split("}"),layui.each(a,function(e,t){t&&(a[e]="."+_+"-"+d.index+" "+t)}),r.css=a.join("}"));var c=function(a,e,i,l){var n,o;l?(l.key=[r.index,a,i].join("-"),l.colspan=l.colspan||0,l.rowspan=l.rowspan||0,d.initOpts(l),(n=a+(parseInt(l.rowspan)||1)) td:hover > .layui-table-cell{overflow: auto;}"].concat(x.ie?[".layui-table-edit{height: "+i+";}","td[data-edit]:hover:after{height: "+i+";}"]:[]),function(e,t){t&&o.push(a+" "+t)})),l.css&&o.push(l.css),r.style({target:this.elem[0],text:o.join(""),id:"DF-table-"+n})},n.prototype.renderToolbar=function(){var l,o=this,e=o.config,d=e.elem.attr("lay-filter"),t=['
                                                  ','
                                                  ','
                                                  '].join(""),a=o.layTool.find(".layui-table-tool-temp"),n=("default"===e.toolbar?a.html(t):"string"==typeof e.toolbar&&(t=f(e.toolbar).html()||"")&&a.html(m(t).render(e)),{filter:{title:"\u7b5b\u9009\u5217",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols",onClick:function(e){var a,n=e.config;(0,e.openPanel)({list:(a=[],o.eachCols(function(e,t){t.field&&"normal"==t.type&&a.push('
                                                • "+(t.fieldTitle||t.title||t.field)+"").text())+'" lay-filter="LAY_TABLE_TOOL_COLS">
                                                • ')}),a.join("")),done:function(){i.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var e=f(e.elem),t=this.checked,a=e.data("key"),i=o.col(a),l=i.hide,e=e.data("parentkey");i.key&&(i.hide=!t,o.elem.find('*[data-key="'+a+'"]')[t?"removeClass":"addClass"](W),l!=i.hide&&o.setParentCol(!t,e),o.resize(),layui.event.call(this,R,"colToggled("+d+")",{col:i,config:n}))})}})}},exports:{title:"\u5bfc\u51fa",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export",onClick:function(e){var t=e.data,a=e.config,i=e.openPanel,e=e.elem;if(!t.length)return g.tips("\u5f53\u524d\u8868\u683c\u65e0\u6570\u636e",e,{tips:3});x.ie?g.tips("\u5bfc\u51fa\u529f\u80fd\u4e0d\u652f\u6301 IE\uff0c\u8bf7\u7528 Chrome \u7b49\u9ad8\u7ea7\u6d4f\u89c8\u5668\u5bfc\u51fa",e,{tips:3}):i({list:['
                                                • \u5bfc\u51fa CSV \u6587\u4ef6
                                                • '].join(""),done:function(e,t){t.on("click",function(){var e=f(this).data("type");k.exportFile.call(o,a.id,null,e)})}})}},print:{title:"\u6253\u5370",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print",onClick:function(e){var t=e.data;if(!t.length)return g.tips("\u5f53\u524d\u8868\u683c\u65e0\u6570\u636e",e.elem,{tips:3});var t=window.open("about:blank","_blank"),e=[""].join(""),a=f(o.layHeader.html());a.append(o.layMain.find("table").html()),a.append(o.layTotal.find("table").html()),a.find("th.layui-table-patch").remove(),a.find("thead>tr>th."+F).filter(function(e,t){return!f(t).children("."+u).length}).remove(),a.find("tbody>tr>td."+F).remove(),t.document.write(e+a.prop("outerHTML")),t.document.close(),layui.device("edg").edg?(t.onafterprint=t.close,t.print()):(t.print(),t.close())}}});"object"==typeof e.defaultToolbar&&(l=[],e.defaultToolbar=f.map(e.defaultToolbar,function(e,t){var a="string"==typeof e,i=a?n[e]:e;return i&&(!(i=i.name&&n[i.name]?f.extend({},n[i.name],i):i).name&&a&&(i.name=e),l.push('
                                                  ')),i}),o.layTool.find(".layui-table-tool-self").html(l.join("")))},n.prototype.renderPagebar=function(){var e,t=this.config,a=this.layPagebar=f('
                                                  ');t.pagebar&&((e=f(t.pagebar).html()||"")&&a.append(m(e).render(t)),this.layPage.append(a))},n.prototype.setParentCol=function(e,t){var a=this.config,i=this.layHeader.find('th[data-key="'+t+'"]'),l=parseInt(i.attr("colspan"))||0;i[0]&&(t=t.split("-"),t=a.cols[t[1]][t[2]],e?l--:l++,i.attr("colspan",l),i[l?"removeClass":"addClass"](W),t.colspan2=l,t.hide=l<1,a=i.data("parentkey"))&&this.setParentCol(e,a)},n.prototype.setColsPatch=function(){var a=this,e=a.config;layui.each(e.cols,function(e,t){layui.each(t,function(e,t){t.hide&&a.setParentCol(t.hide,t.parentKey)})})},n.prototype.setGroupWidth=function(i){var e,l=this;l.config.cols.length<=1||((e=l.layHeader.find((i?"th[data-key="+i.data("parentkey")+"]>":"")+"."+u)).css("width",0),layui.each(e.get().reverse(),function(){var e=f(this),t=e.parent().data("key"),a=0;l.layHeader.eq(0).find("th[data-parentkey="+t+"]").width(function(e,t){f(this).hasClass(W)||0o.layMain.prop("clientHeight")&&(e.style.width=parseFloat(e.style.width)-i+"px")}),!p&&h?y.width(o.getContentWidth(l)):y.width("auto"),o.setGroupWidth()},n.prototype.resize=function(){var e=this;e.layMain&&("isConnected"in e.layMain[0]?e.layMain[0].isConnected:f.contains(document.body,e.layMain[0]))&&(e.fullSize(),e.setColsWidth(),e.scrollPatch())},n.prototype.reload=function(e,t,a){var i=this;e=e||{},delete i.haveInit,layui.each(e,function(e,t){"array"===layui.type(t)&&delete i.config[e]}),i.config=f.extend(t,{},i.config,e),"reloadData"!==a&&(layui.each(i.config.cols,function(e,t){layui.each(t,function(e,t){delete t.colspan2})}),delete i.config.HAS_SET_COLS_PATCH),i.render(a)},n.prototype.errorView=function(e){var t=this,a=t.layMain.find("."+h),e=f('
                                                  '+(e||"Error")+"
                                                  ");a[0]&&(t.layNone.remove(),a.remove()),t.layFixed.addClass(W),t.layMain.find("tbody").html(""),t.layMain.append(t.layNone=e),t.layTotal.addClass(y),t.layPage.find(P).addClass(y),k.cache[t.key]=[],t.syncCheckAll(),t.renderForm(),t.setColsWidth(),t.loading(!1)},n.prototype.page=1,n.prototype.pullData=function(i,l){var e,t,n=this,o=n.config,a=(o.HAS_SET_COLS_PATCH||n.setColsPatch(),o.HAS_SET_COLS_PATCH=!0,o.request),d=o.response,r=function(){"object"==typeof o.initSort&&n.sort({field:o.initSort.field,type:o.initSort.type,reloadType:l.type})},c=function(e,t){n.setColsWidth(),n.loading(!1),"function"==typeof o.done&&o.done(e,i,e[d.countName],t)};l=l||{},"function"==typeof o.before&&o.before(o),n.startTime=(new Date).getTime(),l.renderData?((e={})[d.dataName]=k.cache[n.key],e[d.countName]=o.url?"object"===layui.type(o.page)?o.page.count:e[d.dataName].length:o.data.length,"object"==typeof o.totalRow&&(e[d.totalRowName]=f.extend({},n.totalRow)),n.renderData({res:e,curr:i,count:e[d.countName],type:l.type,sort:!0}),c(e,"renderData")):o.url?(t={},o.page&&(t[a.pageName]=i,t[a.limitName]=o.limit),a=f.extend(t,o.where),o.contentType&&0==o.contentType.indexOf("application/json")&&(a=JSON.stringify(a)),n.loading(!0),n._xhr&&4!==n._xhr.readyState&&(n._xhrAbort=!0,n._xhr.abort()),n._xhr=f.ajax({type:o.method||"get",url:o.url,contentType:o.contentType,data:a,dataType:o.dataType||"json",jsonpCallback:o.jsonpCallback,headers:o.headers||{},complete:"function"==typeof o.complete?o.complete:undefined,success:function(e){var t,a;(e="function"==typeof o.parseData?o.parseData(e)||e:e)[d.statusName]!=d.statusCode?n.errorView(e[d.msgName]||'\u8fd4\u56de\u7684\u6570\u636e\u4e0d\u7b26\u5408\u89c4\u8303\uff0c\u6b63\u786e\u7684\u6210\u529f\u72b6\u6001\u7801\u5e94\u4e3a\uff1a"'+d.statusName+'": '+d.statusCode):(t=e[d.countName],(a=Math.ceil(t/o.limit)||1)','
                                                  "+function(){var e,t=f.extend(!0,{LAY_COL:l},o),a=k.config.checkName,i=k.config.disabledName;switch(l.type){case"checkbox":return'';case"radio":return'';case"numbers":return c}return l.toolbar?m(f(l.toolbar).html()||"").render(t):T.call(s,{item3:l,content:n,tplData:t})}(),"
                                                  "].join(""),i.push(e),l.fixed&&"right"!==l.fixed&&d.push(e),"right"===l.fixed&&r.push(e))}),e=['data-index="'+e+'"'],o[k.config.checkName]&&e.push('class="'+A+'"'),e=e.join(" "),y.push(""+i.join("")+""),h.push(""+d.join("")+""),p.push(""+r.join("")+""))}),{trs:y,trs_fixed:h,trs_fixed_r:p}},k.getTrHtml=function(e,t){e=C(e);return e.getTrHtml(t,null,e.page)},n.prototype.renderData=function(e){var a=this,i=a.config,t=e.res,l=e.curr,n=a.count=e.count,o=e.sort,d=t[i.response.dataName]||[],t=t[i.response.totalRowName],r=[],c=[],s=[],u=function(){if(!o&&a.sortKey)return a.sort({field:a.sortKey.field,type:a.sortKey.sort,pull:!0,reloadType:e.type});a.getTrHtml(d,o,l,{trs:r,trs_fixed:c,trs_fixed_r:s}),"fixed"===i.scrollPos&&"reloadData"===e.type||a.layBody.scrollTop(0),"reset"===i.scrollPos&&a.layBody.scrollLeft(0),a.layMain.find("."+h).remove(),a.layMain.find("tbody").html(r.join("")),a.layFixLeft.find("tbody").html(c.join("")),a.layFixRight.find("tbody").html(s.join("")),a.syncCheckAll(),a.renderForm(),a.fullSize(),a.haveInit?a.scrollPatch():setTimeout(function(){a.scrollPatch()},50),a.haveInit=!0,g.close(a.tipsIndex)};return k.cache[a.key]=d,a.layTotal[0==d.length?"addClass":"removeClass"](y),a.layPage[i.page||i.pagebar?"removeClass":"addClass"](W),a.layPage.find(P)[!i.page||0==n||0===d.length&&1==l?"addClass":"removeClass"](y),0===d.length?a.errorView(i.text.none):(a.layFixLeft.removeClass(W),o?u():(u(),a.renderTotal(d,t),a.layTotal&&a.layTotal.removeClass(W),void(i.page&&(i.page=f.extend({elem:"layui-table-page"+i.index,count:n,limit:i.limit,limits:i.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(a.page=e.curr,i.limit=e.limit,a.pullData(e.curr))}},i.page),i.page.count=n,p.render(i.page)))))},k.renderData=function(e){e=C(e);e&&e.pullData(e.page,{renderData:!0,type:"reloadData"})},n.prototype.renderTotal=function(e,o){var d,r=this,c=r.config,s={};c.totalRow&&(layui.each(e,function(e,i){"array"===layui.type(i)&&0===i.length||r.eachCols(function(e,t){var e=t.field||e,a=i[e];t.totalRow&&(s[e]=(s[e]||0)+(parseFloat(a)||0))})}),r.dataTotal=[],d=[],r.eachCols(function(e,t){var e=t.field||e,a=o&&o[t.field],i="totalRowDecimals"in t?t.totalRowDecimals:2,i=s[e]?parseFloat(s[e]||0).toFixed(i):"",i=(n=t.totalRowText||"",(l={LAY_COL:t})[e]=i,l=t.totalRow&&T.call(r,{item3:t,content:i,tplData:l})||n,a||l),l="string"==typeof(n=t.totalRow||c.totalRow)?m(n).render(f.extend({TOTAL_NUMS:a||s[e],TOTAL_ROW:o||{},LAY_COL:t},t)):i,n=(t.field&&r.dataTotal.push({field:t.field,total:f("
                                                  "+l+"
                                                  ").text()}),['','
                                                  "+l,"
                                                  "].join(""));d.push(n)}),e=r.layTotal.find(".layui-table-patch"),r.layTotal.find("tbody").html(""+d.join("")+(e.length?e.get(0).outerHTML:"")+""))},n.prototype.getColElem=function(e,t){return e.eq(0).find(".laytable-cell-"+t+":eq(0)")},n.prototype.renderForm=function(e){this.config;var t=this.elem.attr("lay-filter");i.render(e,t)},n.prototype.renderFormByElem=function(a){layui.each(["input","select"],function(e,t){i.render(a.find(t))})},n.prototype.syncCheckAll=function(){var a,e=this,i=e.config,t=e.layHeader.find('input[name="layTableCheckbox"]'),l=k.checkStatus(e.key);t[0]&&(a=l.isAll,e.eachCols(function(e,t){"checkbox"===t.type&&(t[i.checkName]=a)}),t.prop({checked:l.isAll,indeterminate:!l.isAll&&l.data.length}))},n.prototype.setRowActive=function(e,t,a){this.config;e=this.layBody.find('tr[data-index="'+e+'"]');if(t=t||"layui-table-click",a)return e.removeClass(t);e.addClass(t),e.siblings("tr").removeClass(t)},n.prototype.setRowChecked=function(i){var a,e,l,t,n,o,d,r=this,c=r.config,s="all"===i.index,u="array"===layui.type(i.index),y=s||u;c.tree&&c.tree.view||y&&(r.layBox.addClass(O),"radio"===i.type)||(u&&(a={},layui.each(i.index,function(e,t){a[t]=!0}),i.index=a),e=r.layBody.children(".layui-table").children("tbody"),d=y?"tr":'tr[data-index="'+i.index+'"]',d=e.children(d),e=s?d:d.filter(u?function(){var e=f(this).data("index");return i.index[e]}:'[data-index="'+i.index+'"]'),i=f.extend({type:"checkbox"},i),l=k.cache[r.key],t="checked"in i,n=function(e){return"radio"===i.type||(t?i.checked:!e)},e.each(function(){var e=f(this),t=e.attr("data-index"),a=l[t];t&&"array"!==layui.type(a)&&!a[c.disabledName]&&(a=a[c.checkName]=n(e.hasClass(A)),e.toggleClass(A,!!a),"radio"===i.type)&&(o=t,e.siblings().removeClass(A))}),o&&layui.each(l,function(e,t){Number(o)!==Number(e)&&delete t[c.checkName]}),d=(u=(s=e.children("td").children(".layui-table-cell").children('input[lay-type="'+({radio:"layTableRadio",checkbox:"layTableCheckbox"}[i.type]||"checkbox")+'"]:not(:disabled)')).last()).closest(I),("radio"===i.type&&d.hasClass(W)?s.first():s).prop("checked",n(u.prop("checked"))),r.syncCheckAll(),y&&setTimeout(function(){r.layBox.removeClass(O)},100))},n.prototype.sort=function(l){var e,t=this,a={},i=t.config,n=i.elem.attr("lay-filter"),o=k.cache[t.key];"string"==typeof(l=l||{}).field&&(d=l.field,t.layHeader.find("th").each(function(e,t){var a=f(this),i=a.data("field");if(i===l.field)return l.field=a,d=i,!1}));try{var d=d||l.field.data("field"),r=l.field.data("key");if(t.sortKey&&!l.pull&&d===t.sortKey.field&&l.type===t.sortKey.sort)return;var c=t.layHeader.find("th .laytable-cell-"+r).find(L);t.layHeader.find("th").find(L).removeAttr("lay-sort"),c.attr("lay-sort",l.type||null),t.layFixed.find("th")}catch(s){b.error("Table modules: sort field '"+d+"' not matched")}t.sortKey={field:d,sort:l.type},i.autoSort&&("asc"===l.type?e=layui.sort(o,d,null,!0):"desc"===l.type?e=layui.sort(o,d,!0,!0):(e=layui.sort(o,k.config.initIndexName,null,!0),delete t.sortKey,delete i.initSort)),a[i.response.dataName]=e||o,t.renderData({res:a,curr:t.page,count:t.count,sort:!0,type:l.reloadType}),l.fromEvent&&(i.initSort={field:d,type:l.type},layui.event.call(l.field,R,"sort("+n+")",f.extend({config:i},i.initSort)))},n.prototype.loading=function(e){this.config.loading&&this.layBox.find(".layui-table-init").toggleClass(W,!e)},n.prototype.cssRules=function(t,a){var e=this.elem.children("style")[0];r.getStyleRules(e,function(e){if(e.selectorText===".laytable-cell-"+t)return a(e),!0})},n.prototype.fullSize=function(){var e,a,i=this,t=i.config,l=t.height;i.fullHeightGap?(l=d.height()-i.fullHeightGap)<135&&(l=135):i.parentDiv&&i.parentHeightGap?(l=f(i.parentDiv).height()-i.parentHeightGap)<135&&(l=135):i.customHeightFunc&&(l=i.customHeightFunc())<135&&(l=135),1
                                                  ')).find("div").css({width:a}),e.find("tr").append(t)):e.find(".layui-table-patch").remove()};n(e.layHeader),n(e.layTotal);n=e.layMain.height()-i;e.layFixed.find(D).css("height",t.height()>=n?n:"auto").scrollTop(e.layMain.scrollTop()),e.layFixRight[k.cache[e.key]&&k.cache[e.key].length&&0');a.html(t),s.height&&a.css("max-height",s.height-(c.layTool.outerHeight()||50)),i.find("."+S)[0]||i.append(a),c.renderForm(),a.on("click",function(e){layui.stope(e)}),e.done&&e.done(a,t)};layui.stope(e),z.trigger("table.tool.panel.remove"),g.close(c.tipsIndex),layui.each(s.defaultToolbar,function(e,t){if(t.layEvent===a)return"function"==typeof t.onClick&&t.onClick({data:l,config:s,openPanel:n,elem:i}),!0}),layui.event.call(this,R,"toolbar("+o+")",f.extend({event:a,config:s},{}))}),c.layHeader.on("click","*[lay-event]",function(e){var t=f(this),a=t.attr("lay-event"),t=t.closest("th").data("key"),t=c.col(t);layui.event.call(this,R,"colTool("+o+")",f.extend({event:a,config:s,col:t},{}))}),c.layPagebar.on("click","*[lay-event]",function(e){var t=f(this).attr("lay-event");layui.event.call(this,R,"pagebar("+o+")",f.extend({event:t,config:s},{}))}),e.on("mousemove",function(e){var t=f(this),a=t.offset().left,e=e.clientX-a;t.data("unresize")||w.eventMoveElem||(r.allowResize=t.width()-e<=10,d.css("cursor",r.allowResize?"col-resize":""))}).on("mouseleave",function(){f(this);w.eventMoveElem||(r.allowResize=!1,d.css("cursor",""))}).on("mousedown",function(e){var t,a=f(this);r.allowResize&&(t=a.data("key"),e.preventDefault(),r.offset=[e.clientX,e.clientY],c.cssRules(t,function(e){var t=e.style.width||a.outerWidth();r.rule=e,r.ruleWidth=parseFloat(t),r.minWidth=a.data("minwidth")||s.cellMinWidth,r.maxWidth=a.data("maxwidth")||s.cellMaxWidth}),a.data(j,r),w.eventMoveElem=a)}),w.docEvent||z.on("mousemove",function(e){var t,a;w.eventMoveElem&&(t=w.eventMoveElem.data(j)||{},w.eventMoveElem.data("resizing",1),e.preventDefault(),t.rule)&&(e=t.ruleWidth+e.clientX-t.offset[0],a=w.eventMoveElem.closest("."+_).attr(N),a=C(a))&&((e=et.maxWidth&&(e=t.maxWidth),t.rule.style.width=e+"px",a.setGroupWidth(w.eventMoveElem),g.close(c.tipsIndex))}).on("mouseup",function(e){var t,a,i,l,n;w.eventMoveElem&&(i=(t=w.eventMoveElem).closest("."+_).attr(N),a=C(i))&&(i=t.data("key"),l=a.col(i),n=a.config.elem.attr("lay-filter"),r={},d.css("cursor",""),a.scrollPatch(),t.removeData(j),delete w.eventMoveElem,a.cssRules(i,function(e){l.width=parseFloat(e.style.width),layui.event.call(t[0],R,"colResized("+n+")",{col:l,config:a.config})}))}),w.docEvent=!0,e.on("click",function(e){var t=f(this),a=t.find(L),i=a.attr("lay-sort");if(!a[0]||1===t.data("resizing"))return t.removeData("resizing");c.sort({field:t,type:"asc"===i?"desc":"desc"===i?null:"asc",fromEvent:!0})}).find(L+" .layui-edge ").on("click",function(e){var t=f(this),a=t.index(),t=t.parents("th").eq(0).data("field");layui.stope(e),0===a?c.sort({field:t,type:"asc",fromEvent:!0}):c.sort({field:t,type:"desc",fromEvent:!0})}),c.commonMember=function(e){var a=f(this).parents("tr").eq(0).data("index"),t=c.layBody.find('tr[data-index="'+a+'"]'),i=(k.cache[c.key]||[])[a]||{},l={tr:t,config:s,data:k.clearCacheKey(i),dataCache:i,index:a,del:function(){k.cache[c.key][a]=[],t.remove(),c.scrollPatch()},update:function(e,t){c.updateRow({index:a,data:e=e||{},related:t},function(e,t){l.data[e]=t})},setRowChecked:function(e){c.setRowChecked(f.extend({index:a},e))}};return f.extend(l,e)}),t=(c.elem.on("click",'input[name="layTableCheckbox"]+',function(e){var t=f(this),a=t.closest("td"),t=t.prev(),i=(c.layBody.find('input[name="layTableCheckbox"]'),t.parents("tr").eq(0).data("index")),l=t[0].checked,n="layTableAllChoose"===t.attr("lay-filter");t[0].disabled||(n?c.setRowChecked({index:"all",checked:l}):c.setRowChecked({index:i,checked:l}),layui.stope(e),layui.event.call(t[0],R,"checkbox("+o+")",y.call(t[0],{checked:l,type:n?"all":"one",getCol:function(){return c.col(a.data("key"))}})))}),c.elem.on("click",'input[lay-type="layTableRadio"]+',function(e){var t=f(this),a=t.closest("td"),t=t.prev(),i=t[0].checked,l=t.parents("tr").eq(0).data("index");if(layui.stope(e),t[0].disabled)return!1;c.setRowChecked({type:"radio",index:l}),layui.event.call(t[0],R,"radio("+o+")",y.call(t[0],{checked:i,getCol:function(){return c.col(a.data("key"))}}))}),c.layBody.on("mouseenter","tr",function(){var e=f(this),t=e.index();e.data("off")||c.layBody.find("tr:eq("+t+")").addClass(M)}).on("mouseleave","tr",function(){var e=f(this),t=e.index();e.data("off")||c.layBody.find("tr:eq("+t+")").removeClass(M)}).on("click","tr",function(e){t.call(this,"row",e)}).on("dblclick","tr",function(e){t.call(this,"rowDouble",e)}).on("contextmenu","tr",function(e){s.defaultContextmenu||e.preventDefault(),t.call(this,"rowContextmenu",e)}),function(e,t){var a=f(this);if(!a.data("off")){if("rowContextmenu"!==e){var i=[".layui-form-checkbox",".layui-form-switch",".layui-form-radio","[lay-unrow]"].join(",");if(f(t.target).is(i)||f(t.target).closest(i)[0])return}layui.event.call(this,R,e+"("+o+")",y.call(a.children("td")[0],{e:t}))}}),n=function(e,t){var a,i,l;(e=f(e)).data("off")||(l=e.data("field"),i=e.data("key"),i=c.col(i),a=e.closest("tr").data("index"),a=k.cache[c.key][a],e.children(u),(i="function"==typeof i.edit?i.edit(a):i.edit)&&((i=f("textarea"===i?'':''))[0].value=(l=e.data("content")||a[l])===undefined||null===l?"":l,e.find("."+E)[0]||e.append(i),i.focus(),t)&&layui.stope(t))},i=(c.layBody.on("change","."+E,function(){var e=f(this),t=e.parent(),a=this.value,i=e.parent().data("field"),e=e.closest("tr").data("index"),e=k.cache[c.key][e],l=y.call(t[0],{value:a,field:i,oldValue:e[i],td:t,reedit:function(){setTimeout(function(){n(l.td);var e={};e[i]=l.oldValue,l.update(e)})},getCol:function(){return c.col(t.data("key"))}}),e={};e[i]=a,l.update(e),layui.event.call(t[0],R,"edit("+o+")",l)}).on("blur","."+E,function(){f(this).remove()}),c.layBody.on(s.editTrigger,"td",function(e){n(this,e)}).on("mouseenter","td",function(){a.call(this)}).on("mouseleave","td",function(){a.call(this,"hide")}),c.layTotal.on("mouseenter","td",function(){a.call(this)}).on("mouseleave","td",function(){a.call(this,"hide")}),"layui-table-grid-down"),a=function(e){var t=f(this),a=t.children(u);t.data("off")||t.parent().hasClass(H)||(e?t.find(".layui-table-grid-down").remove():!(a.prop("scrollWidth")>a.prop("clientWidth")||0'))},l=function(e,t){var a=f(this),i=a.parent(),l=i.data("key"),n=c.col(l),o=i.parent().data("index"),d=i.children(u),i="layui-table-cell-c",r=f('');"tips"===(t=t||n.expandedMode||s.cellExpandedMode)?c.tipsIndex=g.tips(['
                                                  ',d.html(),"
                                                  ",''].join(""),d[0],{tips:[3,""],time:-1,anim:-1,maxWidth:x.ios||x.android?300:c.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){g.close(t)})}}):(c.elem.find("."+i).trigger("click"),c.cssRules(l,function(e){var t=e.style.width,a=n.expandedWidth||s.cellExpandedWidth;atr").each(function(i){n.cols[i]=[],f(this).children().each(function(e){var t=f(this),a=t.attr("lay-data"),a=r.options(this,{attr:a?"lay-data":null,errorText:d+(a||t.attr("lay-options"))}),t=f.extend({title:t.text(),colspan:parseInt(t.attr("colspan"))||1,rowspan:parseInt(t.attr("rowspan"))||1},a);n.cols[i].push(t)})}),e.find("tbody>tr")),t=k.render(n);!a.length||o.data||t.config.url||(l=0,k.eachCols(t.config.id,function(e,i){a.each(function(e){n.data[e]=n.data[e]||{};var t=f(this),a=i.field;n.data[e][a]=t.children("td").eq(l).html()}),l++}),t.reloadData({data:n.data}))}),this},w.that={},w.config={},function(a,i,e,l){var n,o;l.colGroup&&(n=0,a++,l.CHILD_COLS=[],o=e+(parseInt(l.rowspan)||1),layui.each(i[o],function(e,t){t.parentKey?t.parentKey===l.key&&(t.PARENT_COL_INDEX=a,l.CHILD_COLS.push(t),c(a,i,o,t)):t.PARENT_COL_INDEX||1<=n&&n==(l.colspan||1)||(t.PARENT_COL_INDEX=a,l.CHILD_COLS.push(t),n+=parseInt(1td').filter('[data-field="'+e+'"]')}}})).replace(/"/g,'""'),n.push(a='"'+a+'"')):t.field&&"normal"!==t.type&&0==i&&(u[t.field]=!0)}),c.push(n.join(","))}),o&&layui.each(o.dataTotal,function(e,t){u[t.field]||s.push('"'+(t.total||"")+'"')}),r.join(",")+"\r\n"+c.join("\r\n")+"\r\n"+s.join(","))),d.download=(a.title||l.title||"table_"+(l.index||""))+"."+i,document.body.appendChild(d),d.click(),document.body.removeChild(d)},k.getOptions=l,k.hideCol=function(e,l){var n=C(e);n&&("boolean"===layui.type(l)?n.eachCols(function(e,t){var a=t.key,i=n.col(a),t=t.parentKey;i.hide!=l&&(i=i.hide=l,n.elem.find('*[data-key="'+a+'"]')[i?"addClass":"removeClass"](W),n.setParentCol(i,t))}):(l=layui.isArray(l)?l:[l],layui.each(l,function(e,l){n.eachCols(function(e,t){var a,i;l.field===t.field&&(a=t.key,i=n.col(a),t=t.parentKey,"hide"in l)&&i.hide!=l.hide&&(i=i.hide=!!l.hide,n.elem.find('*[data-key="'+a+'"]')[i?"addClass":"removeClass"](W),n.setParentCol(i,t))})})),f("."+S).remove(),n.resize())},k.reload=function(e,t,a,i){if(l(e))return(e=C(e)).reload(t,a,i),w.call(e)},k.reloadData=function(){var a=f.extend([],arguments),i=(a[3]="reloadData",new RegExp("^("+["elem","id","cols","width","height","maxHeight","toolbar","defaultToolbar","className","css","pagebar"].join("|")+")$"));return layui.each(a[1],function(e,t){i.test(e)&&delete a[1][e]}),k.reload.apply(null,a)},k.render=function(e){e=new n(e);return w.call(e)},k.clearCacheKey=function(e){return delete(e=f.extend({},e))[k.config.checkName],delete e[k.config.indexName],delete e[k.config.initIndexName],delete e[k.config.numbersName],delete e[k.config.disabledName],e},f(function(){k.init()}),s(R,k)});layui.define(["table"],function(e){"use strict";var A=layui.$,h=layui.form,P=layui.table,y=layui.hint(),B={config:{},on:P.on,eachCols:P.eachCols,index:P.index,set:function(e){var t=this;return t.config=A.extend({},t.config,e),t},resize:P.resize,getOptions:P.getOptions,hideCol:P.hideCol,renderData:P.renderData},i=function(){var a=this,e=a.config,n=e.id||e.index;return{config:e,reload:function(e,t){a.reload.call(a,e,t)},reloadData:function(e,t){B.reloadData(n,e,t)}}},j=function(e){var t=i.that[e];return t||y.error(e?"The treeTable instance with ID '"+e+"' not found":"ID argument required"),t||null},F="lay-table-id",L="layui-hide",s=".layui-table-body",q=".layui-table-main",R=".layui-table-fixed-l",Y=".layui-table-fixed-r",l="layui-table-checked",m="layui-table-tree",z="LAY_DATA_INDEX",b="LAY_DATA_INDEX_HISTORY",f="LAY_PARENT_INDEX",g="LAY_CHECKBOX_HALF",H="LAY_EXPAND",X="LAY_HAS_EXPANDED",V="LAY_ASYNC_STATUS",n=["all","parent","children","none"],t=/<[^>]+?>/,p=["flexIconClose","flexIconOpen","iconClose","iconOpen","iconLeaf","icon"],a=function(e){var t=this;t.index=++B.index,t.config=A.extend(!0,{},t.config,B.config,e),t.init(),t.render()},x=function(n,i,e){var l=P.cache[n];layui.each(e||l,function(e,t){var a=t[z]||"";-1!==a.indexOf("-")&&(l[a]=t),t[i]&&x(n,i,t[i])})},d=function(d,a,e){var r=j(d),o=("reloadData"!==e&&(r.status={expand:{}}),A.extend(!0,{},r.getOptions(),a)),n=o.tree,c=n.customName.children,i=n.customName.id,l=(delete a.hasNumberCol,delete a.hasChecboxCol,delete a.hasRadioCol,P.eachCols(null,function(e,t){"numbers"===t.type?a.hasNumberCol=!0:"checkbox"===t.type?a.hasChecboxCol=!0:"radio"===t.type&&(a.hasRadioCol=!0)},o.cols),a.parseData),u=a.done;"reloadData"===e&&"fixed"===o.scrollPos&&(r.scrollTopCache=r.config.elem.next().find(s).scrollTop()),o.url?e&&(!l||l.mod)||(a.parseData=function(){var e=this,t=arguments,a=t[0],t=("function"===layui.type(l)&&(a=l.apply(e,t)||t[0]),e.response.dataName);return n.data.isSimpleData&&!n["async"].enable&&(a[t]=r.flatToTree(a[t])),N(a[t],function(e){e[H]=H in e?e[H]:e[i]!==undefined&&r.status.expand[e[i]]},c),e.autoSort&&e.initSort&&e.initSort.type&&layui.sort(a[t],e.initSort.field,"desc"===e.initSort.type,!0),r.initData(a[t]),a},a.parseData.mod=!0):a.data!==undefined&&(a.data=a.data||[],n.data.isSimpleData&&(a.data=r.flatToTree(a.data)),r.initData(a.data)),e&&(!u||u.mod)||(a.done=function(){var e,t=arguments,a=t[3],n="renderData"===a,i=(n||delete r.isExpandAll,this.elem.next()),l=(r.updateStatus(null,{LAY_HAS_EXPANDED:!1}),x(d,c),i.find('[name="layTableCheckbox"][lay-filter="layTableAllChoose"]'));if(l.length&&(e=B.checkStatus(d),l.prop({checked:e.isAll&&e.data.length,indeterminate:!e.isAll&&e.data.length})),!n&&o.autoSort&&o.initSort&&o.initSort.type&&B.sort(d),r.renderTreeTable(i),"reloadData"===a&&"fixed"===this.scrollPos&&i.find(s).scrollTop(r.scrollTopCache),"function"===layui.type(u))return u.apply(this,t)},a.done.mod=!0),a&&a.tree&&a.tree.view&&layui.each(p,function(e,t){a.tree.view[t]!==undefined&&(a.tree.view[t]=r.normalizedIcon(a.tree.view[t]))})};a.prototype.init=function(){var e=this.config,t=e.tree.data.cascade,t=(-1===n.indexOf(t)&&(e.tree.data.cascade="all"),P.render(A.extend({},e,{data:[],url:"",done:null}))),a=t.config.id;(i.that[a]=this).tableIns=t,d(a,e)},a.prototype.config={tree:{customName:{children:"children",isParent:"isParent",name:"name",id:"id",pid:"parentId",icon:"icon"},view:{indent:14,flexIconClose:'',flexIconOpen:'',showIcon:!0,icon:"",iconClose:'',iconOpen:'',iconLeaf:'',showFlexIconIfNotParent:!1,dblClickExpand:!0,expandAllDefault:!1},data:{isSimpleData:!1,rootPid:null,cascade:"all"},"async":{enable:!1,url:"",type:null,contentType:null,headers:null,where:null,autoParam:[]},callback:{beforeExpand:null,onExpand:null}}},a.prototype.normalizedIcon=function(e){return e?t.test(e)?e:'':""},a.prototype.getOptions=function(){return this.tableIns?P.getOptions(this.tableIns.config.id):this.config},a.prototype.flatToTree=function(e){var n,i,l,d,r,o,c,u,t=this.getOptions(),a=t.tree,s=a.customName;return e=e||P.cache[t.id],t=e,n=s.id,i=s.pid,l=s.children,d=a.data.rootPid,n=n||"id",i=i||"parentId",l=l||"children",c={},u=[],layui.each(t,function(e,t){r=n+t[n],o=n+t[i],c[r]||(c[r]={},c[r][l]=[]);var a={};a[l]=c[r][l],c[r]=A.extend({},t,a),((d?c[r][i]===d:!c[r][i])?u:(c[o]||(c[o]={},c[o][l]=[]),c[o][l])).push(c[r])}),u},a.prototype.treeToFlat=function(e,n,i){var l=this,d=l.getOptions().tree.customName,r=d.children,o=d.pid,c=[];return layui.each(e,function(e,t){var e=(i?i+"-":"")+e,a=A.extend({},t);a[o]="undefined"!=typeof t[o]?t[o]:n,c.push(a),c=c.concat(l.treeToFlat(t[r],t[d.id],e))}),c},a.prototype.getTreeNode=function(e){var t,a=this;return e?(t=a.getOptions().tree,t.customName,{data:e,dataIndex:e[z],getParentNode:function(){return a.getNodeByIndex(e[f])}}):y.error("\u627e\u4e0d\u5230\u8282\u70b9\u6570\u636e")},a.prototype.getNodeByIndex=function(t){var a,e,n=this,i=n.getNodeDataByIndex(t);return i?((e=n.getOptions()).tree.customName.parent,a=e.id,(e={data:i,dataIndex:i[z],getParentNode:function(){return n.getNodeByIndex(i[f])},update:function(e){return B.updateNode(a,t,e)},remove:function(){return B.removeNode(a,t)},expand:function(e){return B.expandNode(a,A.extend({},e,{index:t}))},setChecked:function(e){return B.setRowChecked(a,A.extend({},e,{index:t}))}}).dataIndex=t,e):y.error("\u627e\u4e0d\u5230\u8282\u70b9\u6570\u636e")},a.prototype.getNodeById=function(a){var e=this.getOptions(),n=e.tree.customName.id,i="",e=B.getData(e.id,!0);if(layui.each(e,function(e,t){if(t[n]===a)return i=t[z],!0}),i)return this.getNodeByIndex(i)},a.prototype.getNodeDataByIndex=function(e,t,a){var n=this.getOptions(),i=n.tree,n=P.cache[n.id],l=n[e];if("delete"!==a&&l)return A.extend(l,a),t?A.extend({},l):l;for(var d=n,r=String(e).split("-"),o=0,c=i.customName.children;o
                                                  '),N=function(e){y[V]="success",y[s.children]=e,c.initData(y[s.children],y[z]),J(t,!0,!p&&n,i,l)},C=m.format,"function"===layui.type(C)?C(y,o,N):(I=A.extend({},m.where||o.where),C=m.autoParam,layui.each(C,function(e,t){t=t.split("=");I[t[0].trim()]=y[(t[1]||t[0]).trim()]}),(C=m.contentType||o.contentType)&&0==C.indexOf("application/json")&&(I=JSON.stringify(I)),O=m.method||o.method,D=m.dataType||o.dataType,T=m.jsonpCallback||o.jsonpCallback,_=m.headers||o.headers,k=m.parseData||o.parseData,w=m.response||o.response,A.ajax({type:O||"get",url:b,contentType:C,data:I,dataType:D||"json",jsonpCallback:T,headers:_||{},success:function(e){(e="function"==typeof k?k.call(o,e)||e:e)[w.statusName]!=w.statusCode?(y[V]="error",y[H]=!1,g.html('')):N(e[w.dataName])},error:function(e,t){y[V]="error",y[H]=!1,"function"==typeof o.error&&o.error(e,t)}})),h;y[X]=!0,v.length&&(!o.initSort||o.url&&!o.autoSort||((m=o.initSort).type?layui.sort(v,m.field,"desc"===m.type,!0):layui.sort(v,P.config.indexName,null,!0)),c.initData(y[s.children],y[z]),O=P.getTrHtml(r,v,null,null,e),S={trs:A(O.trs.join("")),trs_fixed:A(O.trs_fixed.join("")),trs_fixed_r:A(O.trs_fixed_r.join(""))},E=(e.split("-").length-1||0)+1,layui.each(v,function(e,t){S.trs.eq(e).attr({"data-index":t[z],"lay-data-index":t[z],"data-level":E}).data("index",t[z]),S.trs_fixed.eq(e).attr({"data-index":t[z],"lay-data-index":t[z],"data-level":E}).data("index",t[z]),S.trs_fixed_r.eq(e).attr({"data-index":t[z],"lay-data-index":t[z],"data-level":E}).data("index",t[z])}),d.find(q).find('tbody tr[lay-data-index="'+e+'"]').after(S.trs),d.find(R).find('tbody tr[lay-data-index="'+e+'"]').after(S.trs_fixed),d.find(Y).find('tbody tr[lay-data-index="'+e+'"]').after(S.trs_fixed_r),c.renderTreeTable(S.trs,E),n)&&!p&&layui.each(v,function(e,t){J({dataIndex:t[z],trElem:d.find('tr[lay-data-index="'+t[z]+'"]').first(),tableViewElem:d,tableId:r,options:o},a,n,i,l)})}else c.isExpandAll=!1,(n&&!p?(layui.each(v,function(e,t){J({dataIndex:t[z],trElem:d.find('tr[lay-data-index="'+t[z]+'"]').first(),tableViewElem:d,tableId:r,options:o},a,n,i,l)}),d.find(v.map(function(e,t,a){return'tr[lay-data-index="'+e[z]+'"]'}).join(","))):(b=c.treeToFlat(v,y[s.id],e),d.find(b.map(function(e,t,a){return'tr[lay-data-index="'+e[z]+'"]'}).join(",")))).addClass(L);U("resize-"+r,function(){B.resize(r)},0)(),l&&"loading"!==y[V]&&(C=u.callback.onExpand,"function"===layui.type(C))&&C(r,y,x)}return h},v=(B.expandNode=function(e,t){var a,n,i,e=j(e);if(e)return a=(t=t||{}).index,n=t.expandFlag,i=t.inherit,t=t.callbackFlag,e=e.getOptions().elem.next(),J({trElem:e.find('tr[lay-data-index="'+a+'"]').first()},n,i,null,t)},B.expandAll=function(a,e){if("boolean"!==layui.type(e))return y.error("expandAll \u7684\u5c55\u5f00\u72b6\u6001\u53c2\u6570\u53ea\u63a5\u6536true/false");var t=j(a);if(t){t.isExpandAll=e;var n=t.getOptions(),i=n.tree,l=n.elem.next(),d=i.customName.isParent,r=i.customName.id,o=i.view.showFlexIconIfNotParent;if(e){e=B.getData(a,!0);if(i["async"].enable){var c=!0;if(layui.each(e,function(e,t){if(t[d]&&!t[V])return!(c=!1)}),!c)return void layui.each(B.getData(a),function(e,t){B.expandNode(a,{index:t[z],expandFlag:!0,inherit:!0})})}var u=!0;if(layui.each(e,function(e,t){if(t[d]&&!t[X])return!(u=!1)}),u)t.updateStatus(null,function(e){(e[d]||o)&&(e[H]=!0,e[r]!==undefined)&&(t.status.expand[e[r]]=!0)}),l.find('tbody tr[data-level!="0"]').removeClass(L),l.find(".layui-table-tree-flexIcon").html(i.view.flexIconOpen),i.view.showIcon&&l.find(".layui-table-tree-nodeIcon:not(.layui-table-tree-iconCustom,.layui-table-tree-iconLeaf)").html(i.view.iconOpen);else{if(t.updateStatus(null,function(e){(e[d]||o)&&(e[H]=!0,e[X]=!0,e[r]!==undefined)&&(t.status.expand[e[r]]=!0)}),n.initSort&&n.initSort.type&&n.autoSort)return B.sort(a);var s,n=P.getTrHtml(a,e),f={trs:A(n.trs.join("")),trs_fixed:A(n.trs_fixed.join("")),trs_fixed_r:A(n.trs_fixed_r.join(""))};layui.each(e,function(e,t){var a=t[z].split("-").length-1;s={"data-index":t[z],"lay-data-index":t[z],"data-level":a},f.trs.eq(e).attr(s).data("index",t[z]),f.trs_fixed.eq(e).attr(s).data("index",t[z]),f.trs_fixed_r.eq(e).attr(s).data("index",t[z])}),layui.each(["main","fixed-l","fixed-r"],function(e,t){l.find(".layui-table-"+t+" tbody").html(f[["trs","trs_fixed","trs_fixed_r"][e]])}),t.renderTreeTable(l,0,!1)}}else t.updateStatus(null,function(e){(e[d]||o)&&(e[H]=!1,e[r]!==undefined)&&(t.status.expand[e[r]]=!1)}),l.find('.layui-table-box tbody tr[data-level!="0"]').addClass(L),l.find(".layui-table-tree-flexIcon").html(i.view.flexIconClose),i.view.showIcon&&l.find(".layui-table-tree-nodeIcon:not(.layui-table-tree-iconCustom,.layui-table-tree-iconLeaf)").html(i.view.iconClose);B.resize(a)}},a.prototype.updateNodeIcon=function(e){var t=this.getOptions().tree||{},a=e.scopeEl,n=e.isExpand,e=e.isParent;a.find(".layui-table-tree-flexIcon").css("visibility",e||t.view.showFlexIconIfNotParent?"visible":"hidden").html(n?t.view.flexIconOpen:t.view.flexIconClose),t.view.showIcon&&(a=a.find(".layui-table-tree-nodeIcon:not(.layui-table-tree-iconCustom)"),n=e?n?t.view.iconOpen:t.view.iconClose:t.view.iconLeaf,a.toggleClass("layui-table-tree-iconLeaf",!e).html(n))},a.prototype.renderTreeTable=function(e,t,a){var l=this,n=l.getOptions(),d=n.elem.next(),i=(d.hasClass(m)||d.addClass(m),n.id),r=n.tree||{},o=(r.data,r.view||{}),c=r.customName||{},u=c.isParent,s=(d.attr("lay-filter"),l),f=n.data.length,y=((t=t||0)||(d.find(".layui-table-body tr:not([data-level])").attr("data-level",t),layui.each(P.cache[i],function(e,t){f&&(t[z]=String(e));t=t[z];d.find('.layui-table-main tbody tr[data-level="0"]:eq('+e+")").attr("lay-data-index",t),d.find('.layui-table-fixed-l tbody tr[data-level="0"]:eq('+e+")").attr("lay-data-index",t),d.find('.layui-table-fixed-r tbody tr[data-level="0"]:eq('+e+")").attr("lay-data-index",t)})),null),p=c.name,x=o.indent||14;if(layui.each(e.find('td[data-field="'+p+'"]'),function(e,t){var a,n,i=(t=A(t)).closest("tr"),t=t.children(".layui-table-cell");t.hasClass("layui-table-tree-item")||(n=i.attr("lay-data-index"))&&(i=d.find('tr[lay-data-index="'+n+'"]'),(a=s.getNodeDataByIndex(n))[H]&&a[u]&&((y=y||{})[n]=!0),a[g]&&i.find('input[type="checkbox"][name="layTableCheckbox"]').prop("indeterminate",!0),n=t.html(),(t=i.find('td[data-field="'+p+'"]>div.layui-table-cell')).addClass("layui-table-tree-item"),t.html(['
                                                  ',a[H]?o.flexIconOpen:o.flexIconClose,"
                                                  ",o.showIcon?'
                                                  '+(l.normalizedIcon(a[c.icon])||o.icon||(a[u]?a[H]?o.iconOpen:o.iconClose:o.iconLeaf)||"")+"
                                                  ":"",n].join("")).find(".layui-table-tree-flexIcon").on("click",function(e){layui.stope(e),J({trElem:i},null,null,null,!0)}))}),!t&&r.view.expandAllDefault&&l.isExpandAll===undefined)return B.expandAll(i,!0);(!1!==a&&y?(layui.each(y,function(e,t){e=d.find('tr[lay-data-index="'+e+'"]');e.find(".layui-table-tree-flexIcon").html(o.flexIconOpen),J({trElem:e.first()},!0)}),U("renderTreeTable2-"+i,function(){h.render(A(".layui-table-tree["+F+'="'+i+'"]'))},0)):U("renderTreeTable-"+i,function(){n.hasNumberCol&&v(l),h.render(A(".layui-table-tree["+F+'="'+i+'"]'))},0))()},function(a){var e=a.getOptions(),t=e.elem.next(),n=0,i=t.find(".layui-table-main tbody tr"),l=t.find(".layui-table-fixed-l tbody tr"),d=t.find(".layui-table-fixed-r tbody tr");layui.each(a.treeToFlat(P.cache[e.id]),function(e,t){t.LAY_HIDE||(a.getNodeDataByIndex(t[z]).LAY_NUM=++n,i.eq(e).find(".laytable-cell-numbers").html(n),l.eq(e).find(".laytable-cell-numbers").html(n),d.eq(e).find(".laytable-cell-numbers").html(n))})}),N=(a.prototype.render=function(e){var t=this;t.tableIns=P["reloadData"===e?"reloadData":"reload"](t.tableIns.config.id,A.extend(!0,{},t.config)),t.config=t.tableIns.config},a.prototype.reload=function(e,t,a){var n=this;e=e||{},delete n.haveInit,layui.each(e,function(e,t){"array"===layui.type(t)&&delete n.config[e]}),d(n.getOptions().id,e,a||!0),n.config=A.extend(t,{},n.config,e),n.render(a)},B.reloadData=function(){var e=A.extend(!0,[],arguments);return e[3]="reloadData",B.reload.apply(null,e)},function(e,a,n,i){var l=[];return layui.each(e,function(e,t){"function"===layui.type(a)?a(t):A.extend(t,a),l.push(A.extend({},t)),i||(l=l.concat(N(t[n],a,n,i)))}),l}),o=(a.prototype.updateStatus=function(e,t,a){var n=this.getOptions(),i=n.tree;return e=e||P.cache[n.id],N(e,t,i.customName.children,a)},a.prototype.getTableData=function(){var e=this.getOptions();return P.cache[e.id]},B.updateStatus=function(e,t,a){var e=j(e),n=e.getOptions();return a=a||(n.url?P.cache[n.id]:n.data),e.updateStatus(a,t)},B.sort=function(e){var t,a,i,l,n,d=j(e);d&&(n=(t=d.getOptions()).tree,a=B.getData(e),i=n.customName.children,l=function(e,a,n){layui.sort(e,a,n,!0),layui.each(e,function(e,t){l(t[i]||[],a,n)})},t.autoSort)&&((n=t.initSort).type?l(a,n.field,"desc"===n.type):l(a,P.config.indexName,null),P.cache[e]=a,d.initData(a),B.renderData(e))},function(n){var t=n.config.id,i=j(t),a=n.data=B.getNodeDataByIndex(t,n.index),l=a[z],d=(n.dataIndex=l,n.update);n.update=function(){var e=arguments,t=(A.extend(i.getNodeDataByIndex(l),e[0]),d.apply(this,e)),a=n.config.tree.customName.name;return a in e[0]&&n.tr.find('td[data-field="'+a+'"]').children("div.layui-table-cell").removeClass("layui-table-tree-item"),i.renderTreeTable(n.tr,n.tr.attr("data-level"),!1),t},n.del=function(){B.removeNode(t,a)},n.setRowChecked=function(e){B.setRowChecked(t,{index:a,checked:e})}}),u=(B.updateNode=function(e,a,t){var n,i,l,d,r,o=j(e);o&&((d=o.getOptions()).tree,d=(n=d.elem.next()).find('tr[lay-data-index="'+a+'"]'),i=d.attr("data-index"),l=d.attr("data-level"),t)&&(d=o.getNodeDataByIndex(a,!1,t),r=P.getTrHtml(e,[d]),layui.each(["main","fixed-l","fixed-r"],function(e,t){n.find(".layui-table-"+t+' tbody tr[lay-data-index="'+a+'"]').replaceWith(A(r[["trs","trs_fixed","trs_fixed_r"][e]].join("")).attr({"data-index":i,"lay-data-index":a,"data-level":l}).data("index",i))}),o.renderTreeTable(n.find('tr[lay-data-index="'+a+'"]'),l))},B.removeNode=function(e,t,a){var n,i,l,d,r,o,c,u,s=j(e);s&&(i=(u=(n=s.getOptions()).tree).customName.isParent,l=u.customName.children,d=n.elem.next(),r=[],o=P.cache[e],t=s.getNodeDataByIndex("string"===layui.type(t)?t:t[z],!1,"delete"),c=s.getNodeDataByIndex(t[f]),s.updateCheckStatus(c),u=s.treeToFlat([t],t[u.customName.pid],t[f]),layui.each(u,function(e,t){t=t[z];r.push('tr[lay-data-index="'+t+'"]'),-1!==t.indexOf("-")&&delete o[t]}),d.find(r.join(",")).remove(),t=s.initData(),function(){for(var e in o)-1!==e.indexOf("-")&&e!==o[e][z]&&delete o[e]}(),layui.each(s.treeToFlat(t),function(e,t){t[b]&&t[b]!==t[z]&&d.find('tr[lay-data-index="'+t[b]+'"]').attr({"data-index":t[z],"lay-data-index":t[z]}).data("index",t[z])}),layui.each(o,function(e,t){d.find('tr[data-level="0"][lay-data-index="'+t[z]+'"]').attr("data-index",e).data("index",e)}),n.hasNumberCol&&v(s),c&&(u=d.find('tr[lay-data-index="'+c[z]+'"]'),a||(c[i]=!(!c[l]||!c[l].length)),s.updateNodeIcon({scopeEl:u,isExpand:c[H],isParent:c[i]})),B.resize(e))},B.addNodes=function(e,t){var a=j(e);if(a){var n=a.getOptions(),i=n.tree,l=n.elem.next(),d=P.config.checkName,r=(t=t||{}).parentIndex,o=t.index,c=t.data,t=t.focus,u=(r="number"===layui.type(r)?r.toString():r)?a.getNodeDataByIndex(r):null,o="number"===layui.type(o)?o:-1,c=A.extend(!0,[],layui.isArray(c)?c:[c]);layui.each(c,function(e,t){d in t||!u||(t[d]=u[d])}),a.getTableData();if(u){var s=i.customName.isParent,f=i.customName.children;u[s]=!0;var y=(y=u[f])?(p=y.splice(-1===o?y.length:o),u[f]=y.concat(c,p)):u[f]=c,f=(a.updateStatus(y,function(e){(e[s]||i.view.showFlexIconIfNotParent)&&(e[X]=!1)}),a.treeToFlat(y));l.find(f.map(function(e){return'tr[lay-data-index="'+e[z]+'"]'}).join(",")).remove(),a.initData(),u[X]=!1,u[V]="local",J({trElem:l.find('tr[lay-data-index="'+r+'"]')},!0)}else{var p=P.cache[e].splice(-1===o?P.cache[e].length:o);if(P.cache[e]=P.cache[e].concat(c,p),n.url||(n.page?(y=n.page,n.data.splice.apply(n.data,[y.limit*(y.curr-1),y.limit].concat(P.cache[e]))):n.data=P.cache[e]),a.initData(),l.find(".layui-none").length)return P.renderData(e),c;var x,f=P.getTrHtml(e,c),h={trs:A(f.trs.join("")),trs_fixed:A(f.trs_fixed.join("")),trs_fixed_r:A(f.trs_fixed_r.join(""))},r=(layui.each(c,function(e,t){x={"data-index":t[z],"lay-data-index":t[z],"data-level":"0"},h.trs.eq(e).attr(x).data("index",t[z]),h.trs_fixed.eq(e).attr(x).data("index",t[z]),h.trs_fixed_r.eq(e).attr(x).data("index",t[z])}),parseInt(c[0][z])-1),y=l.find(q),n=l.find(R),f=l.find(Y);-1==r?y.find('tr[data-level="0"][data-index="0"]')[0]?(y.find('tr[data-level="0"][data-index="0"]').before(h.trs),n.find('tr[data-level="0"][data-index="0"]').before(h.trs_fixed),f.find('tr[data-level="0"][data-index="0"]').before(h.trs_fixed_r)):(y.find("tbody").prepend(h.trs),n.find("tbody").prepend(h.trs_fixed),f.find("tbody").prepend(h.trs_fixed_r)):-1===o?(y.find("tbody").append(h.trs),n.find("tbody").append(h.trs_fixed),f.find("tbody").append(h.trs_fixed_r)):(r=p[0][b],y.find('tr[data-level="0"][data-index="'+r+'"]').before(h.trs),n.find('tr[data-level="0"][data-index="'+r+'"]').before(h.trs_fixed),f.find('tr[data-level="0"][data-index="'+r+'"]').before(h.trs_fixed_r)),layui.each(P.cache[e],function(e,t){l.find('tr[data-level="0"][lay-data-index="'+t[z]+'"]').attr("data-index",e).data("index",e)}),a.renderTreeTable(l.find(c.map(function(e,t,a){return'tr[lay-data-index="'+e[z]+'"]'}).join(",")))}return a.updateCheckStatus(u),u&&(o=l.find('tr[lay-data-index="'+u[z]+'"]'),a.updateNodeIcon({scopeEl:o,isExpand:u[H],isParent:u[s]})),B.resize(e),t&&l.find(q).find('tr[lay-data-index="'+c[0][z]+'"]').get(0).scrollIntoViewIfNeeded(),c}},B.checkStatus=function(e,n){var i,t,a,l=j(e);if(l)return l=l.getOptions().tree,i=P.config.checkName,t=B.getData(e,!0).filter(function(e,t,a){return e[i]||n&&e[g]}),a=!0,layui.each("all"===l.data.cascade?P.cache[e]:B.getData(e,!0),function(e,t){if(!t[i])return!(a=!1)}),{data:t,isAll:a}},B.on("sort",function(e){var e=e.config,t=e.elem.next(),e=e.id;t.hasClass(m)&&B.sort(e)}),B.on("row",function(e){e.config.elem.next().hasClass(m)&&o(e)}),B.on("rowDouble",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(m)&&(o(e),(t.tree||{}).view.dblClickExpand)&&J({trElem:e.tr.first()},null,null,null,!0)}),B.on("rowContextmenu",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(m)&&o(e)}),B.on("tool",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(m)&&o(e)}),B.on("edit",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(m)&&(o(e),e.field===t.tree.customName.name)&&((a={})[e.field]=e.value,e.update(a))}),B.on("radio",function(e){var t=e.config,a=t.elem.next(),t=t.id;a.hasClass(m)&&(a=j(t),o(e),u.call(a,e.tr,e.checked))}),a.prototype.setRowCheckedClass=function(e,t){var a=this.getOptions(),n=(e.data("index"),a.elem.next());e[t?"addClass":"removeClass"](l),e.each(function(){var e=A(this).data("index");n.find('.layui-table-fixed-r tbody tr[data-index="'+e+'"]')[t?"addClass":"removeClass"](l)})},a.prototype.updateCheckStatus=function(e,t){var a,n,i,l,d,r,o,c=this,u=c.getOptions();return!!u.hasChecboxCol&&(a=u.tree,n=u.id,i=u.elem.next(),l=P.config.checkName,"all"!==(d=a.data.cascade)&&"parent"!==d||!e||(d=c.updateParentCheckStatus(e,"boolean"===layui.type(t)?t:null),layui.each(d,function(e,t){var a=i.find('tr[lay-data-index="'+t[z]+'"] input[name="layTableCheckbox"]:not(:disabled)'),n=t[l];c.setRowCheckedClass(a.closest("tr"),n),a.prop({checked:n,indeterminate:t[g]})})),o=!(r=!0),0<(e=(e="all"===a.data.cascade?P.cache[n]:B.getData(n,!0)).filter(function(e){return!e[u.disabledName]})).length?layui.each(e,function(e,t){if((t[l]||t[g])&&(o=!0),t[l]||(r=!1),o&&!r)return!0}):r=!1,o=o&&!r,i.find('input[name="layTableCheckbox"][lay-filter="layTableAllChoose"]').prop({checked:r,indeterminate:o}),r)},a.prototype.updateParentCheckStatus=function(a,n){var i,e=this.getOptions(),t=e.tree,e=e.id,l=P.config.checkName,t=t.customName.children,d=[];return!(a[g]=!1)===n?a[t].length?layui.each(a[t],function(e,t){if(!t[l])return n=!1,a[g]=!0}):n=!1:!1===n?layui.each(a[t],function(e,t){if(t[l]||t[g])return a[g]=!0}):(n=!1,i=0,layui.each(a[t],function(e,t){t[l]&&i++}),n=a[t].length?a[t].length===i:a[l],a[g]=!n&&0li"],n.bodyElem=["."+C.CONST.BODY+":eq(0)",">."+C.CONST.ITEM],n.getContainer=function(){var e=n.documentElem||t.elem;return{header:{elem:e.find(n.headerElem[0]),items:e.find(n.headerElem.join(""))},body:{elem:e.find(n.bodyElem[0]),items:e.find(n.bodyElem.join(""))}}},"array"===layui.type(t.header)?"string"==typeof t.header[0]?(n.headerElem=t.header.concat(),n.documentElem=p(document)):(n.elemView=p('
                                                  '),t.className&&n.elemView.addClass(t.className),a=p('
                                                    '),i=p('
                                                    '),layui.each(t.header,function(e,t){t=n.renderHeaderItem(t);a.append(t)}),layui.each(t.body,function(e,t){t=n.renderBodyItem(t);i.append(t)}),n.elemView.append(a).append(i),t.elem.html(n.elemView)):n.renderClose(),"array"===layui.type(t.body)&&"string"==typeof t.body[0]&&(n.documentElem=p(document),n.bodyElem=t.body.concat()),n.data());"index"in t&&e.index!=t.index?n.change(n.findHeaderItem(t.index),!0):-1===e.index&&n.change(n.findHeaderItem(0),!0),n.roll("auto"),t.elem.hasClass(C.CONST.CLASS_HIDEV)&&t.elem.removeClass(C.CONST.CLASS_HIDEV),"function"==typeof t.afterRender&&t.afterRender(e),layui.event.call(t.elem[0],C.CONST.MOD_NAME,"afterRender("+t.id+")",e)},events:function(){var e,t=this,a=t.config,i=t.getContainer(),n=C.CONST.MOD_NAME,i=(t.documentElem?i.header:a).elem,a=a.trigger+(".lay_"+n+"_trigger"),n=t.documentElem?t.headerElem[1]:t.headerElem.join("");i.off(a).on(a,n,function(){t.change(p(this))}),r.onresize||(p(window).on("resize",function(){clearTimeout(e),e=setTimeout(function(){layui.each(C.cache.id,function(e){e=C.getInst(e);e&&e.roll("init")})},50)}),r.onresize=!0)}}),r={},t=C.Class;t.prototype.add=function(e){var t,a,i=this,n=(i.config,i.getContainer()),r=i.renderHeaderItem(e),d=i.renderBodyItem(e),o=i.data();e=p.extend({active:!0},e),/(before|after)/.test(e.mode)?(a=(t=e.hasOwnProperty("index"))?i.findHeaderItem(e.index):o.thisHeaderItem,t=t?i.findBodyItem(e.index):o.thisHeaderItem,a[e.mode](r),t[e.mode](d)):(a={prepend:"prepend",append:"append"}[e.mode||"append"]||"append",n.header.elem[a](r),n.body.elem[a](d)),e.active?i.change(r,!0):i.roll("auto"),"function"==typeof e.done&&e.done(p.extend(o,{headerItem:r,bodyItem:d}))},t.prototype.close=function(e,t){if(e&&e[0]){var a=this,i=a.config,n=e.index();if(e[0]&&"false"!==e.attr("lay-closable")){var r=a.data();if(!t)if(!1===layui.event.call(e[0],C.CONST.MOD_NAME,"beforeClose("+i.id+")",p.extend(r,{index:e.index()})))return;e.hasClass(C.CONST.CLASS_THIS)&&(e.next()[0]?a.change(e.next(),!0):e.prev()[0]&&a.change(e.prev(),!0)),e.remove(),a.findBodyItem(n).remove(),a.roll("auto",n);r=a.data();layui.event.call(r.thisHeaderItem[0],C.CONST.MOD_NAME,"afterClose("+i.id+")",r)}}},t.prototype.closeMult=function(e,t){var a,i=this,n=i.config,r=i.getContainer(),d=i.data(),o=r.header.items,l=r.body.items,r='[lay-closable="false"]',s=":not("+r+")",d=(t=t===undefined?d.index:t,o.each(function(e){var t=p(this).attr("lay-closable");t&&l.eq(e).attr("lay-closable",t)}),"false"!==d.thisHeaderItem.attr("lay-closable")&&("all"!==e&&e?t!==d.index&&i.change(i.findHeaderItem(t),!0):(a=o.filter(":gt("+d.index+")"+r).eq(0),r=p(o.filter(":lt("+d.index+")"+r).get().reverse()).eq(0),a[0]?i.change(a,!0):r[0]&&i.change(r,!0))),("other"===e?(o.eq(t).siblings(s).remove(),l.eq(t).siblings(s)):"right"===e?(o.filter(":gt("+t+")"+s).remove(),l.filter(":gt("+t+")"+s)):(o.filter(s).remove(),l.filter(s))).remove(),i.roll("auto"),i.data());layui.event.call(d.thisHeaderItem[0],C.CONST.MOD_NAME,"afterClose("+n.id+")",d)},t.prototype.change=function(e,t){if(e&&e[0]){var a=this,i=a.config,n=e.attr("lay-id")||e.index(),r=e.find("a"),r="string"==typeof r.attr("href")&&"_blank"===r.attr("target"),d="string"==typeof e.attr("lay-unselect");if(!r&&!d){r=a.data();if(!t)if(!1===layui.event.call(e[0],C.CONST.MOD_NAME,"beforeChange("+i.id+")",p.extend(r,{from:{index:r.index,headerItem:r.thisHeaderItem},to:{index:e.index(),headerItem:e}})))return;e.addClass(C.CONST.CLASS_THIS).siblings().removeClass(C.CONST.CLASS_THIS),a.findBodyItem(n).addClass(C.CONST.CLASS_SHOW).siblings().removeClass(C.CONST.CLASS_SHOW),a.roll("auto",n);r=a.data();layui.event.call(r.thisHeaderItem[0],C.CONST.MOD_NAME,"afterChange("+i.id+")",r)}}},t.prototype.renderHeaderItem=function(e){var t=this.config,t=p(e.headerItem||t.headerItem||"
                                                  • ");return t.html(e.title||"New Tab").attr("lay-id",e.id),this.appendClose(t,e),t},t.prototype.renderBodyItem=function(e){var t=this.config,t=p(e.bodyItem||t.bodyItem||'
                                                    ');return t.html(e.content||"").attr("lay-id",e.id),t},t.prototype.appendClose=function(e,t){var a=this;a.config.closable&&0!=(t=t||{}).closable&&"false"!==e.attr("lay-closable")&&!e.find("."+C.CONST.CLOSE)[0]&&((t=p('')).on("click",function(){return a.close(p(this).parent()),!1}),e.append(t))},t.prototype.renderClose=function(){var t=this,a=t.config;t.getContainer().header.items.each(function(){var e=p(this);a.closable?t.appendClose(e):e.find("."+C.CONST.CLOSE).remove()})},t.prototype.roll=function(e,i){var n=this,t=n.config,a=n.getContainer(),r=a.header.elem,d=a.header.items,a=r.prop("scrollWidth"),o=Math.ceil(r.outerWidth()),l=r.data("left")||0,s="scroll"===t.headerMode,c="layui-tabs-scroll",f="layui-tabs-bar",u=["layui-icon-prev","layui-icon-next"],m={elem:p('
                                                    '),bar:p(['
                                                    ','','',"
                                                    "].join(""))};if("normal"!==t.headerMode){var h,y=r.parent("."+c);if(s||!s&&o=o-l)return r.css("left",-a).data("left",-a),!1}),l=r.data("left")||0,y.find("."+u[0])[l<0?"removeClass":"addClass"](C.CONST.CLASS_DISABLED),y.find("."+u[1])[0')),n=(e.tree(a),i.elem=p(i.elem));if(n[0]){if(e.key=i.id||e.index,e.elem=a,e.elemNone=p('
                                                    '+i.text.none+"
                                                    "),n.html(e.elem),0==e.elem.find(".layui-tree-set").length)return e.elem.append(e.elemNone);i.showCheckbox&&e.renderForm("checkbox"),e.elem.find(".layui-tree-set").each(function(){var e=p(this);e.parent(".layui-tree-pack")[0]||e.addClass("layui-tree-setHide"),!e.next()[0]&&e.parents(".layui-tree-pack").eq(1).hasClass("layui-tree-lineExtend")&&e.addClass(T),e.next()[0]||e.parents(".layui-tree-set").eq(0).next()[0]||e.addClass(T)}),e.events()}},l.prototype.renderForm=function(e){i.render(e,"LAY-tree-"+this.index)},l.prototype.tree=function(r,e){var d=this,s=d.config,o=s.customName,e=e||s.data;layui.each(e,function(e,i){var a,n,t=i[o.children]&&0"),c=p(['
                                                    ','
                                                    ','
                                                    ',s.showLine?t?'':'':'',s.showCheckbox?'':"",s.isJump&&i.href?''+(i[o.title]||i.label||s.text.defaultNodeName)+"":''+(i[o.title]||i.label||s.text.defaultNodeName)+"","
                                                    ",s.edit?(a={add:'',update:'',del:''},n=['
                                                    '],!0===s.edit&&(s.edit=["update","del"]),"object"==typeof s.edit?(layui.each(s.edit,function(e,i){n.push(a[i]||"")}),n.join("")+"
                                                    "):void 0):"","
                                                    "].join(""));t&&(c.append(l),d.tree(l,i[o.children])),r.append(c),c.prev("."+k)[0]&&c.prev().children(".layui-tree-pack").addClass("layui-tree-showLine"),t||c.parent(".layui-tree-pack").addClass("layui-tree-lineExtend"),d.spread(c,i),s.showCheckbox&&(i.checked&&d.checkids.push(i[o.id]),d.checkClick(c,i)),s.edit&&d.operate(c,i)})},l.prototype.spread=function(n,t){var l=this,c=l.config,e=n.children("."+b),i=e.children("."+g),a=i.find('input[same="layuiTreeCheck"]'),r=e.find("."+C),e=e.find("."+w),d=c.onlyIconControl?r:i,s="";d.on("click",function(e){var i=n.children("."+N),a=(d.children(".layui-icon")[0]?d:d.find(".layui-tree-icon")).children(".layui-icon");i[0]?n.hasClass(F)?(n.removeClass(F),i.slideUp(200),a.removeClass(x).addClass(v),l.updateFieldValue(t,"spread",!1)):(n.addClass(F),i.slideDown(200),a.addClass(x).removeClass(v),l.updateFieldValue(t,"spread",!0),c.accordion&&((i=n.siblings("."+k)).removeClass(F),i.children("."+N).slideUp(200),i.find(".layui-tree-icon").children(".layui-icon").removeClass(x).addClass(v))):s="normal"}),e.on("click",function(){p(this).hasClass(u)||(s=n.hasClass(F)?c.onlyIconControl?"open":"close":c.onlyIconControl?"close":"open",a[0]&&l.updateFieldValue(t,"checked",a.prop("checked")),c.click&&c.click({elem:n,state:s,data:t}))})},l.prototype.updateFieldValue=function(e,i,a){i in e&&(e[i]=a)},l.prototype.setCheckbox=function(e,i,a){var t,n=this,l=n.config.customName,c=a.prop("checked");a.prop("disabled")||("object"!=typeof i[l.children]&&!e.find("."+N)[0]||e.find("."+N).find('input[same="layuiTreeCheck"]').each(function(e){this.disabled||((e=i[l.children][e])&&n.updateFieldValue(e,"checked",c),n.updateFieldValue(this,"checked",c))}),(t=function(e){var i,a,n;e.parents("."+k)[0]&&(a=(e=e.parent("."+N)).parent(),n=e.prev().find('input[same="layuiTreeCheck"]'),c?n.prop("checked",c):(e.find('input[same="layuiTreeCheck"]').each(function(){this.checked&&(i=!0)}),i||n.prop("checked",!1)),t(a))})(e),n.renderForm("checkbox"))},l.prototype.checkClick=function(a,n){var t=this,l=t.config;a.children("."+b).children("."+g).on("click",'input[same="layuiTreeCheck"]+',function(e){layui.stope(e);var e=p(this).prev(),i=e.prop("checked");e.prop("disabled")||(t.setCheckbox(a,n,e),t.updateFieldValue(n,"checked",i),l.oncheck&&l.oncheck({elem:a,checked:i,data:n}))})},l.prototype.operate=function(r,d){var s=this,o=s.config,u=o.customName,e=r.children("."+b),h=e.children("."+g);e.children(".layui-tree-btnGroup").on("click",".layui-icon",function(e){layui.stope(e);var i,e=p(this).data("type"),n=r.children("."+N),t={data:d,type:e,elem:r};if("add"==e){n[0]||(o.showLine?(h.find("."+C).addClass("layui-tree-icon"),h.find("."+C).children(".layui-icon").addClass(v).removeClass("layui-icon-file")):h.find(".layui-tree-iconArrow").removeClass(m),r.append('
                                                    '));var a,l=o.operate&&o.operate(t),c={};if(c[u.title]=o.text.defaultNodeName,c[u.id]=l,s.tree(r.children("."+N),[c]),o.showLine&&(n[0]?(n.hasClass(S)||n.addClass(S),r.find("."+N).each(function(){p(this).children("."+k).last().addClass(T)}),(n.children("."+k).last().prev().hasClass(T)?n.children("."+k).last().prev():n.children("."+k).last()).removeClass(T),!r.parent("."+N)[0]&&r.next()[0]&&n.children("."+k).last().removeClass(T)):(l=r.siblings("."+k),a=1,c=r.parent("."+N),layui.each(l,function(e,i){p(i).children("."+N)[0]||(a=0)}),(1==a?(l.children("."+N).addClass(L),l.children("."+N).children("."+k).removeClass(T),r.children("."+N).addClass(L),c.removeClass(S),c.children("."+k).last().children("."+N).children("."+k).last()):r.children("."+N).children("."+k)).addClass(T))),!o.showCheckbox)return;h.find('input[same="layuiTreeCheck"]')[0].checked&&(r.children("."+N).children("."+k).last().find('input[same="layuiTreeCheck"]')[0].checked=!0),s.renderForm("checkbox")}else"update"==e?(l=h.children("."+w).html(),h.children("."+w).html(""),h.append(''),h.children(".layui-tree-editInput").val(f.unescape(l)).focus(),i=function(e){var i=f.escape(e.val().trim())||o.text.defaultNodeName;e.remove(),h.children("."+w).html(i),t.data[u.title]=i,o.operate&&o.operate(t)},h.children(".layui-tree-editInput").blur(function(){i(p(this))}),h.children(".layui-tree-editInput").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),i(p(this)))})):y.confirm('\u786e\u8ba4\u5220\u9664\u8be5\u8282\u70b9 "'+(d[u.title]||"")+'" \u5417\uff1f',function(e){var l,a,i;o.operate&&o.operate(t),t.status="remove",y.close(e),r.prev("."+k)[0]||r.next("."+k)[0]||r.parent("."+N)[0]?(r.siblings("."+k).children("."+b)[0]?(o.showCheckbox&&(l=function(e){var i,a,n,t;e.parents("."+k)[0]&&(i=e.siblings("."+k).children("."+b),a=(e=e.parent("."+N).prev()).find('input[same="layuiTreeCheck"]')[0],n=1,(t=0)==a.checked)&&(i.each(function(e,i){i=p(i).find('input[same="layuiTreeCheck"]')[0];0!=i.checked||i.disabled||(n=0),i.disabled||(t=1)}),1==n)&&1==t&&(a.checked=!0,s.renderForm("checkbox"),l(e.parent("."+k)))})(r),o.showLine&&(e=r.siblings("."+k),a=1,i=r.parent("."+N),layui.each(e,function(e,i){p(i).children("."+N)[0]||(a=0)}),1==a?(n[0]||(i.removeClass(S),e.children("."+N).addClass(L),e.children("."+N).children("."+k).removeClass(T)),(r.next()[0]?i.children("."+k).last():r.prev()).children("."+N).children("."+k).last().addClass(T),r.next()[0]||r.parents("."+k)[1]||r.parents("."+k).eq(0).next()[0]||r.prev("."+k).addClass(T)):!r.next()[0]&&r.hasClass(T)&&r.prev().addClass(T))):(e=r.parent("."+N).prev(),o.showLine?(e.find("."+C).removeClass("layui-tree-icon"),e.find("."+C).children(".layui-icon").removeClass(x).addClass("layui-icon-file"),(i=e.parents("."+N).eq(0)).addClass(S),i.children("."+k).each(function(){p(this).children("."+N).children("."+k).last().addClass(T)})):e.find(".layui-tree-iconArrow").addClass(m),r.parents("."+k).eq(0).removeClass(F),r.parent("."+N).remove()),r.remove()):(r.remove(),s.elem.append(s.elemNone))})})},l.prototype.events=function(){var i=this,t=i.config;i.elem.find(".layui-tree-checkedFirst");i.setChecked(i.checkids),i.elem.find(".layui-tree-search").on("keyup",function(){var e=p(this),a=e.val(),e=e.nextAll(),n=[];e.find("."+w).each(function(){var i,e=p(this).parents("."+b);-1!=p(this).html().indexOf(a)&&(n.push(p(this).parent()),(i=function(e){e.addClass("layui-tree-searchShow"),e.parent("."+N)[0]&&i(e.parent("."+N).parent("."+k))})(e.parent("."+k)))}),e.find("."+b).each(function(){var e=p(this).parent("."+k);e.hasClass("layui-tree-searchShow")||e.addClass(m)}),0==e.find(".layui-tree-searchShow").length&&i.elem.append(i.elemNone),t.onsearch&&t.onsearch({elem:n})}),i.elem.find(".layui-tree-search").on("keydown",function(){p(this).nextAll().find("."+b).each(function(){p(this).parent("."+k).removeClass("layui-tree-searchShow "+m)}),p(".layui-tree-emptyText")[0]&&p(".layui-tree-emptyText").remove()})},l.prototype.getChecked=function(){var t=this,e=t.config,l=e.customName,i=[],a=[],c=(t.elem.find(".layui-form-checked").each(function(){i.push(p(this).prev()[0].value)}),function(e,n){layui.each(e,function(e,a){layui.each(i,function(e,i){if(a[l.id]==i)return t.updateFieldValue(a,"checked",!0),delete(i=p.extend({},a))[l.children],n.push(i),a[l.children]&&(i[l.children]=[],c(a[l.children],i[l.children])),!0})})});return c(p.extend({},e.data),a),a},l.prototype.setChecked=function(l){this.config;this.elem.find("."+k).each(function(e,i){var a=p(this).data("id"),n=p(i).children("."+b).find('input[same="layuiTreeCheck"]'),t=n.next();if("number"==typeof l){if(a.toString()==l.toString())return n[0].checked||t.click(),!1}else"object"==typeof l&&layui.each(l,function(e,i){if(i.toString()==a.toString()&&!n[0].checked)return t.click(),!0})})},n.that={},n.config={},t.reload=function(e,i){e=n.that[e];return e.reload(i),n.call(e)},t.getChecked=function(e){return n.that[e].getChecked()},t.setChecked=function(e,i){return n.that[e].setChecked(i)},t.render=function(e){e=new l(e);return n.call(e)},e(a,t)});layui.define(["laytpl","form"],function(e){"use strict";var d=layui.$,n=layui.laytpl,t=layui.form,a="transfer",i={config:{},index:layui[a]?layui[a].index+1e4:0,set:function(e){var t=this;return t.config=d.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,a,e,t)}},l=function(){var t=this,e=t.config,a=e.id||t.index;return l.that[a]=t,{config:l.config[a]=e,reload:function(e){t.reload.call(t,e)},getData:function(){return t.getData.call(t)}}},s="layui-hide",u="layui-btn-disabled",c="layui-none",r="layui-transfer-box",h="layui-transfer-header",o="layui-transfer-search",f="layui-transfer-data",y=function(e){return['
                                                    ','
                                                    ','","
                                                    ","{{# if(d.data.showSearch){ }}",'","{{# } }}",'
                                                      ',"
                                                      "].join("")},p=['
                                                      ',y({index:0,checkAllName:"layTransferLeftCheckAll"}),'
                                                      ','",'","
                                                      ",y({index:1,checkAllName:"layTransferRightCheckAll"}),"
                                                      "].join(""),v=function(e){var t=this;t.index=++i.index,t.config=d.extend({},t.config,i.config,e),t.render()};v.prototype.config={title:["\u5217\u8868\u4e00","\u5217\u8868\u4e8c"],width:200,height:360,data:[],value:[],showSearch:!1,id:"",text:{none:"\u65e0\u6570\u636e",searchNone:"\u65e0\u5339\u914d\u6570\u636e"}},v.prototype.reload=function(e){var t=this;t.config=d.extend({},t.config,e),t.render()},v.prototype.render=function(){var e=this,t=e.config,a=e.elem=d(n(p,{open:"{{",close:"}}",tagStyle:"legacy"}).render({data:t,index:e.index})),i=t.elem=d(t.elem);i[0]&&(t.data=t.data||[],t.value=t.value||[],t.id="id"in t?t.id:elem.attr("id")||e.index,e.key=t.id,i.html(e.elem),e.layBox=e.elem.find("."+r),e.layHeader=e.elem.find("."+h),e.laySearch=e.elem.find("."+o),e.layData=a.find("."+f),e.layBtn=a.find(".layui-transfer-active .layui-btn"),e.layBox.css({width:t.width,height:t.height}),e.layData.css({height:(i=t.height-e.layHeader.outerHeight(),t.showSearch&&(i-=e.laySearch.outerHeight()),i-2)}),e.renderData(),e.events())},v.prototype.renderData=function(){var e=this,t=e.config,l=[{checkName:"layTransferLeftCheck",views:[]},{checkName:"layTransferRightCheck",views:[]}];e.parseData(function(a){var i=a.selected?1:0,n=["
                                                    • ",'',"
                                                    • "].join("");i?layui.each(t.value,function(e,t){t==a.value&&a.selected&&(l[i].views[e]=n)}):l[i].views.push(n),delete a.selected}),e.layData.eq(0).html(l[0].views.join("")),e.layData.eq(1).html(l[1].views.join("")),e.renderCheckBtn()},v.prototype.renderForm=function(e){t.render(e,"LAY-transfer-"+this.index)},v.prototype.renderCheckBtn=function(c){var r=this,o=r.config;c=c||{},r.layBox.each(function(e){var t=d(this),a=t.find("."+f),t=t.find("."+h).find('input[type="checkbox"]'),i=a.find('input[type="checkbox"]'),n=0,l=!1;i.each(function(){var e=d(this).data("hide");(this.checked||this.disabled||e)&&n++,this.checked&&!e&&(l=!0)}),t.prop("checked",l&&n===i.length),r.layBtn.eq(e)[l?"removeClass":"addClass"](u),c.stopNone||(i=a.children("li:not(."+s+")").length,r.noneView(a,i?"":o.text.none))}),r.renderForm("checkbox")},v.prototype.noneView=function(e,t){var a=d('

                                                      '+(t||"")+"

                                                      ");e.find("."+c)[0]&&e.find("."+c).remove(),t.replace(/\s/g,"")&&e.append(a)},v.prototype.setValue=function(){var e=this.config,t=[];return this.layBox.eq(1).find("."+f+' input[type="checkbox"]').each(function(){d(this).data("hide")||t.push(this.value)}),e.value=t,this},v.prototype.parseData=function(t){var i=this.config,n=[];return layui.each(i.data,function(e,a){a=("function"==typeof i.parseData?i.parseData(a):a)||a,n.push(a=d.extend({},a)),layui.each(i.value,function(e,t){t==a.value&&(a.selected=!0)}),t&&t(a)}),i.data=n,this},v.prototype.getData=function(e){var t=this.config,i=[];return this.setValue(),layui.each(e||t.value,function(e,a){layui.each(t.data,function(e,t){delete t.selected,a==t.value&&i.push(t)})}),i},v.prototype.transfer=function(e,t){var a,i=this,n=i.config,l=i.layBox.eq(e),c=[],t=(t?((a=(t=t).find('input[type="checkbox"]'))[0].checked=!1,l.siblings("."+r).find("."+f).append(t.clone()),t.remove(),c.push(a[0].value),i.setValue()):l.each(function(e){d(this).find("."+f).children("li").each(function(){var e=d(this),t=e.find('input[type="checkbox"]'),a=t.data("hide");t[0].checked&&!a&&(t[0].checked=!1,l.siblings("."+r).find("."+f).append(e.clone()),e.remove(),c.push(t[0].value)),i.setValue()})}),i.renderCheckBtn(),l.siblings("."+r).find("."+o+" input"));""!==t.val()&&t.trigger("keyup"),n.onchange&&n.onchange(i.getData(c),e)},v.prototype.events=function(){var n=this,l=n.config;n.elem.on("click",'input[lay-filter="layTransferCheckbox"]+',function(){var e=d(this).prev(),t=e[0].checked,a=e.parents("."+r).eq(0).find("."+f);e[0].disabled||("all"===e.attr("lay-type")&&a.find('input[type="checkbox"]').each(function(){this.disabled||(this.checked=t)}),setTimeout(function(){n.renderCheckBtn({stopNone:!0})},0))}),n.elem.on("dblclick","."+f+">li",function(e){var t=d(this),a=t.children('input[type="checkbox"]'),i=t.parent().parent().data("index");a[0].disabled||!1!==("function"==typeof l.dblclick?l.dblclick({elem:t,data:n.getData([a[0].value])[0],index:i}):null)&&n.transfer(i,t)}),n.layBtn.on("click",function(){var e=d(this),t=e.data("index");e.hasClass(u)||n.transfer(t)}),n.laySearch.find("input").on("keyup",function(){var i=this.value,e=d(this).parents("."+o).eq(0).siblings("."+f),t=e.children("li"),t=(t.each(function(){var e=d(this),t=e.find('input[type="checkbox"]'),a=t[0].title,a=("cs"!==l.showSearch&&(a=a.toLowerCase(),i=i.toLowerCase()),-1!==a.indexOf(i));e[a?"removeClass":"addClass"](s),t.data("hide",!a)}),n.renderCheckBtn(),t.length===e.children("li."+s).length);n.noneView(e,t?l.text.searchNone:"")})},l.that={},l.config={},i.reload=function(e,t){e=l.that[e];return e.reload(t),l.call(e)},i.getData=function(e){return l.that[e].getData()},i.render=function(e){e=new v(e);return l.call(e)},e(a,i)});layui.define(["jquery","lay"],function(e){"use strict";var o=layui.$,l=layui.lay,t=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=o.extend({},n.config,e),n},on:function(e,n){return layui.onevent.call(this,r,e,n)}}),r="carousel",s="layui-this",u="layui-carousel-left",c="layui-carousel-right",m="layui-carousel-prev",h="layui-carousel-next",a="layui-carousel-arrow",d="layui-carousel-ind",n=function(e){var n=this;n.config=o.extend({},n.config,t.config,e),n.render()};n.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},n.prototype.render=function(){var e=this,n=e.config,i=o(n.elem);if(1*[carousel-item]>*"),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(s),e.indicator(),e.arrow(),e.autoplay(),1=this.elemItem.length?0:e},n.prototype.addIndex=function(e){var n=this.config;n.index=n.index+(e=e||1),n.index>=this.elemItem.length&&(n.index=0)},n.prototype.subIndex=function(e){var n=this.config;n.index=n.index-(e=e||1),n.index<0&&(n.index=this.elemItem.length-1)},n.prototype.autoplay=function(){var e=this,n=e.config,i=e.elemItem.length;n.autoplay&&(clearInterval(e.timer),1',''].join(""));e.elem.attr("lay-arrow",e.arrow),e.elem.find("."+a)[0]&&e.elem.find("."+a).remove(),1i.index?n.slide("add",e-i.index):e
                                                        ',(n=[],layui.each(e.elemItem,function(e){n.push("")}),n.join("")),"
                                                      "].join(""));i.elem.attr("lay-indicator",i.indicator),i.elem.find("."+d)[0]&&i.elem.find("."+d).remove(),1t[a?"height":"width"]()/3)&&o.slide(0"),i=1;i<=a.length;i++){var n='
                                                    • ";a.half&&parseInt(a.value)!==a.value&&i==Math.ceil(a.value)?t=t+'
                                                    • ":t+=n}t+="",a.text&&(t+=''+a.value+"");var s=a.elem,o=s.next("."+c.ELEM);o[0]&&o.remove(),e.elemTemplate=u(t),a.span=e.elemTemplate.next("span"),a.setText&&a.setText(a.value),s.html(e.elemTemplate),s.addClass("layui-inline"),a.readonly||e.action()},extendsInstance:function(){var a=this,l=a.config;return{setvalue:function(e){l.value=e,a.render()}}}}),c=l.CONST;l.Class.prototype.action=function(){var n=this.config,t=this.elemTemplate,i=t.find("i").width(),l=t.children("li");l.each(function(e){var a=e+1,l=u(this);l.on("click",function(e){n.value=a,n.half&&e.pageX-u(this).offset().left<=i/2&&(n.value=n.value-.5),n.text&&t.next("span").text(n.value),n.choose&&n.choose(n.value),n.setText&&n.setText(n.value)}),l.on("mousemove",function(e){t.find("i").each(function(){u(this).addClass(c.ICON_RATE).removeClass(c.ICON_SOLID_HALF)}),t.find("i:lt("+a+")").each(function(){u(this).addClass(c.ICON_RATE_SOLID).removeClass(c.ICON_HALF_RATE)}),n.half&&e.pageX-u(this).offset().left<=i/2&&l.children("i").addClass(c.ICON_RATE_HALF).removeClass(c.ICON_RATE_SOLID)}),l.on("mouseleave",function(){t.find("i").each(function(){u(this).addClass(c.ICON_RATE).removeClass(c.ICON_SOLID_HALF)}),t.find("i:lt("+Math.floor(n.value)+")").each(function(){u(this).addClass(c.ICON_RATE_SOLID).removeClass(c.ICON_HALF_RATE)}),n.half&&parseInt(n.value)!==n.value&&t.children("li:eq("+Math.floor(n.value)+")").children("i").addClass(c.ICON_RATE_HALF).removeClass(c.ICON_SOLID_RATE)})}),a.touchSwipe(t,{onTouchMove:function(e,a){var i;Date.now()-a.timeStart<=200||(a=e.touches[0].pageX,e=t.width()/n.length,a=(a-t.offset().left)/e,(i=(i=(e=a%1)<=.5&&n.half?.5+(a-e):Math.ceil(a))>n.length?n.length:i)<0&&(i=0),l.each(function(e){var a=u(this).children("i"),l=Math.ceil(i)-e==1,t=Math.ceil(i)>e,e=i-e==.5;t?(a.addClass(c.ICON_RATE_SOLID).removeClass(c.ICON_HALF_RATE),n.half&&e&&a.addClass(c.ICON_RATE_HALF).removeClass(c.ICON_RATE_SOLID)):a.addClass(c.ICON_RATE).removeClass(c.ICON_SOLID_HALF),a.toggleClass("layui-rate-hover",l)}),n.value=i,n.text&&t.next("span").text(n.value),n.setText&&n.setText(n.value))},onTouchEnd:function(e,a){Date.now()-a.timeStart<=200||(t.find("i").removeClass("layui-rate-hover"),n.choose&&n.choose(n.value),n.setText&&n.setText(n.value))}})},e(c.MOD_NAME,l)});layui.define("jquery",function(o){"use strict";var w=layui.$,l=function(o){};l.prototype.load=function(o){var i,n,r,l,c,m,e,t,a,f,s,u,p,d,y,g=this,h=0,v=w((o=o||{}).elem);if(v[0])return c=w(o.scrollElem||document),m="mb"in o?o.mb:50,e=!("isAuto"in o)||o.isAuto,t=o.moreText||"\u52a0\u8f7d\u66f4\u591a",a=o.end||"\u6ca1\u6709\u66f4\u591a\u4e86",f="top"===(o.direction||"bottom"),g._cleanup(v,c),s=o.scrollElem&&o.scrollElem!==document,p=w('"),v.find(".layui-flow-more")[0]||v[f?"prepend":"append"](p),d=function(o,l){var e=s?c.prop("scrollHeight"):document.documentElement.scrollHeight,t=c.scrollTop();o=w(o),p[f?"after":"before"](o),(l=0==l||null)?p.html(a):p.find("a").html(u),n=l,i=null,r&&r(),f&&(o=s?c.prop("scrollHeight"):document.documentElement.scrollHeight,1===h?c.scrollTop(o):1'),"function"==typeof o.done&&o.done(++h,d)})(),p.find("a").on("click.flow",function(){w(this);n||i||y()}),o.isLazyimg&&(r=g.lazyimg({elem:o.elem+" img",scrollElem:o.scrollElem,direction:o.direction})),e&&c.on("scroll.flow",function(){var e=w(this),t=e.scrollTop();l&&clearTimeout(l),!n&&v.width()&&(l=setTimeout(function(){var o=(s?e:w(window)).height(),l=s?e.prop("scrollHeight"):document.documentElement.scrollHeight;(f?t<=m:l-t-o<=m)&&!i&&y()},100))}),g},l.prototype.lazyimg=function(o){var l,m=this,a=0,f=w((o=o||{}).scrollElem||document),s=o.elem||"img",n="top"===(o.direction||"bottom"),u=o.scrollElem&&o.scrollElem!==document,p=function(l,o){var e,t=f.scrollTop(),o=t+o,i=u?l.offset().top-f.offset().top+t:l.offset().top;(n?i+l.height():i)>=t&&i<=o&&l.attr("lay-src")&&(e=l.attr("lay-src"),layui.img(e,function(){var o=m.lazyimg.elem.eq(a);l.attr("src",e).removeAttr("lay-src"),o[0]&&r(o),a++},function(){m.lazyimg.elem.eq(a);l.removeAttr("lay-src")}))},r=function(o,l){var e=(u?l||f:w(window)).height(),t=f.scrollTop(),i=t+e;if(m.lazyimg.elem=w(s),o)p(o,e);else for(var n=0;n"),preview:"Preview"},wordWrap:!0,lang:"text",highlighter:!1,langMarker:!1},R=layui.code?layui.code.index+1e4:0,j=function(e){return String(e).replace(/\s+$/,"").replace(/^\n|\n$/,"")};e("code",function(l,e){var o,i,t,a,n,d,c,s,r,u,y,p,E,f,h,v,m,L,_,M,C,g={config:l=x.extend(!0,{},T,l),reload:function(e){layui.code(this.updateOptions(e))},updateOptions:function(e){return delete(e=e||{}).elem,x.extend(!0,l,e)},reloadCode:function(e){layui.code(this.updateOptions(e),"reloadCode")}},w=x(l.elem);return 1',l.ln?['
                                                      ',D.digit(t+1)+".","
                                                      "].join(""):"",'
                                                      ',e||" ","
                                                      ",""].join("")})}},a=l.code,n=function(e){return"function"==typeof l.codeParse?l.codeParse(e,l):e},"reloadCode"===e?o.children(".layui-code-wrap").html(w(n(a)).html):(d=layui.code.index=++R,o.attr("lay-code-index",d),(M=A.CDDE_DATA_CLASS in o.data())&&o.attr("class",o.data(A.CDDE_DATA_CLASS)||""),M||o.data(A.CDDE_DATA_CLASS,o.attr("class")),c={copy:{className:"file-b",title:["\u590d\u5236\u4ee3\u7801"],event:function(e){var t=D.unescape(n(l.code)),a="function"==typeof l.onCopy;lay.clipboard.writeText({text:t,done:function(){if(a&&!1===l.onCopy(t,!0))return;W.msg("\u5df2\u590d\u5236",{icon:1})},error:function(){if(a&&!1===l.onCopy(t,!1))return;W.msg("\u590d\u5236\u5931\u8d25",{icon:2})}})}}},function b(){var e=o.parent("."+A.ELEM_PREVIEW),t=e.children("."+A.ELEM_TAB),a=e.children("."+A.ELEM_ITEM+"-preview");return t.remove(),a.remove(),e[0]&&o.unwrap(),b}(),l.preview&&(M="LAY-CODE-DF-"+d,f=l.layout||["code","preview"],s="iframe"===l.preview,E=x('
                                                      '),C=x('
                                                      '),r=x('
                                                      '),_=x('
                                                      '),u=x('
                                                      '),l.id&&E.attr("id",l.id),E.addClass(l.className),C.attr("lay-filter",M),layui.each(f,function(e,t){var a=x('
                                                    • ');0===e&&a.addClass("layui-this"),a.html(l.text[t]),r.append(a)}),x.extend(c,{full:{className:"screen-full",title:["\u6700\u5927\u5316\u663e\u793a","\u8fd8\u539f\u663e\u793a"],event:function(e){var e=e.elem,t=e.closest("."+A.ELEM_PREVIEW),a="layui-icon-"+this.className,i="layui-icon-screen-restore",l=this.title,o=x("html,body"),n="layui-scrollbar-hide";e.hasClass(a)?(t.addClass(A.ELEM_FULL),e.removeClass(a).addClass(i),e.attr("title",l[1]),o.addClass(n)):(t.removeClass(A.ELEM_FULL),e.removeClass(i).addClass(a),e.attr("title",l[0]),o.removeClass(n))}},window:{className:"release",title:["\u5728\u65b0\u7a97\u53e3\u9884\u89c8"],event:function(e){D.openWin({content:n(l.code)})}}}),l.copy&&("array"===layui.type(l.tools)?-1===l.tools.indexOf("copy")&&l.tools.unshift("copy"):l.tools=["copy"]),u.on("click",">i",function(){var e=x(this),t=e.data("type"),e={elem:e,type:t,options:l,rawCode:l.code,finalCode:D.unescape(n(l.code))};c[t]&&"function"==typeof c[t].event&&c[t].event(e),"function"==typeof l.toolsEvent&&l.toolsEvent(e)}),l.addTools&&l.tools&&(l.tools=[].concat(l.tools,l.addTools)),layui.each(l.tools,function(e,t){var a="object"==typeof t,i=a?t:c[t]||{className:t,title:[t]},l=i.className||i.type,o=i.title||[""],a=a?i.type||l:t;a&&(c[a]||((t={})[a]=i,x.extend(c,t)),u.append(''))}),o.addClass(A.ELEM_ITEM).wrap(E),C.append(r),l.tools&&C.append(u),o.before(C),s&&_.html(''),y=function(e){var t=e.children("iframe")[0];s&&t?t.srcdoc=n(l.code):e.html(l.code),setTimeout(function(){"function"==typeof l.done&&l.done({container:e,options:l,render:function(){N.render(e.find(".layui-form")),S.render(),I.render({elem:["."+A.ELEM_PREVIEW,".layui-tabs"].join(" ")})}})},3)},"preview"===f[0]?(_.addClass(A.ELEM_SHOW),o.before(_),y(_)):o.addClass(A.ELEM_SHOW).after(_),l.previewStyle=[l.style,l.previewStyle].join(""),_.attr("style",l.previewStyle),S.on("tab("+M+")",function(e){var t=x(this),a=x(e.elem).closest("."+A.ELEM_PREVIEW).find("."+A.ELEM_ITEM),e=a.eq(e.index);a.removeClass(A.ELEM_SHOW),e.addClass(A.ELEM_SHOW),"preview"===t.attr("lay-id")&&y(e),L()})),p=x(''),o.addClass((E=["layui-code-view layui-border-box"],l.wordWrap||E.push("layui-code-nowrap"),E.join(" "))),(C=l.theme||l.skin)&&(o.removeClass("layui-code-theme-dark layui-code-theme-light"),o.addClass("layui-code-theme-"+C)),l.highlighter&&o.addClass([l.highlighter,"language-"+l.lang,"layui-code-hl"].join(" ")),f=w(l.encode?D.escape(n(a)):a),h=f.lines,o.html(p.html(f.html)),l.ln&&o.append('
                                                      '),l.height&&p.css("max-height",l.height),l.codeStyle=[l.style,l.codeStyle].join(""),l.codeStyle&&p.attr("style",function(e,t){return(t||"")+l.codeStyle}),v=[{selector:">.layui-code-wrap>.layui-code-line{}",setValue:function(e,t){e.style["padding-left"]=t+"px"}},{selector:">.layui-code-wrap>.layui-code-line>.layui-code-line-number{}",setValue:function(e,t){e.style.width=t+"px"}},{selector:">.layui-code-ln-side{}",setValue:function(e,t){e.style.width=t+"px"}}],m=lay.style({target:o[0],id:"DF-code-"+d,text:x.map(x.map(v,function(e){return e.selector}),function(e,t){return['.layui-code-view[lay-code-index="'+d+'"]',e].join(" ")}).join("")}),L=function b(){var e,i;return l.ln&&(e=Math.floor(h.length/100),i=p.children("."+A.ELEM_LINE).last().children("."+A.ELEM_LINE_NUM).outerWidth(),o.addClass(A.ELEM_LN_MODE),e)&&A.LINE_RAW_WIDTH
                                                    • ')).html(l.title||l.text.code),o.prepend(_)),M=x('
                                                      '),l.copy&&!l.preview&&((C=x(['','',""].join(""))).on("click",function(){c.copy.event()}),M.append(C)),l.langMarker&&M.append(''+l.lang+""),l.about&&M.append(l.about),o.append(M),l.preview||setTimeout(function(){"function"==typeof l.done&&l.done({})},3),l.elem.length===1+d&&"function"==typeof l.allDone&&l.allDone())),g})}),layui["layui.all"]||layui.addcss("modules/code.css?v=6","skincodecss"); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/admin/lib/wangEditor/wangEditor.min.js b/AdminSrc/AdminHost/wwwroot/admin/lib/wangEditor/wangEditor.min.js new file mode 100644 index 0000000..1763b60 --- /dev/null +++ b/AdminSrc/AdminHost/wwwroot/admin/lib/wangEditor/wangEditor.min.js @@ -0,0 +1,16 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.wangEditor=t():e.wangEditor=t()}(window,function(){return o={},i.m=n=[function(e,t){e.exports=function(e){return e&&e.__esModule?e:{default:e}}},function(e,t,n){e.exports=n(142)},function(e,t,n){"use strict";n.r(t),n.d(t,"__extends",function(){return i}),n.d(t,"__assign",function(){return r}),n.d(t,"__rest",function(){return a}),n.d(t,"__decorate",function(){return l}),n.d(t,"__param",function(){return u}),n.d(t,"__metadata",function(){return s}),n.d(t,"__awaiter",function(){return c}),n.d(t,"__generator",function(){return f}),n.d(t,"__createBinding",function(){return d}),n.d(t,"__exportStar",function(){return p}),n.d(t,"__values",function(){return h}),n.d(t,"__read",function(){return A}),n.d(t,"__spread",function(){return v}),n.d(t,"__spreadArrays",function(){return m}),n.d(t,"__spreadArray",function(){return g}),n.d(t,"__await",function(){return y}),n.d(t,"__asyncGenerator",function(){return w}),n.d(t,"__asyncDelegator",function(){return x}),n.d(t,"__asyncValues",function(){return _}),n.d(t,"__makeTemplateObject",function(){return E}),n.d(t,"__importStar",function(){return C}),n.d(t,"__importDefault",function(){return S}),n.d(t,"__classPrivateFieldGet",function(){return M}),n.d(t,"__classPrivateFieldSet",function(){return D}); +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +var o=function(e,t){return(o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}o(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var r=function(){return(r=Object.assign||function(e){for(var t,n=1,o=arguments.length;na[0]&&t[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function A(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var o,i,r=n.call(e),a=[];try{for(;(void 0===t||0]+>/g,function(){return""})},w.prototype.html=function(e){var t=this.elems[0];return e?(t.innerHTML=e,this):t.innerHTML},w.prototype.val=function(){var e=this.elems[0];return(0,l.default)(e=e.value).call(e)},w.prototype.focus=function(){return(0,u.default)(this).call(this,function(e){e.focus()})},w.prototype.prev=function(){return x(this.elems[0].previousElementSibling)},w.prototype.next=function(){return x(this.elems[0].nextElementSibling)},w.prototype.getNextSibling=function(){return x(this.elems[0].nextSibling)},w.prototype.parent=function(){return x(this.elems[0].parentElement)},w.prototype.parentUntil=function(e,t){t=t||this.elems[0];if("BODY"===t.nodeName)return null;t=t.parentElement;return null===t?null:t.matches(e)?x(t):this.parentUntil(e,t)},w.prototype.parentUntilEditor=function(e,t,n){n=n||this.elems[0];if(x(n).equal(t.$textContainerElem)||x(n).equal(t.$toolbarElem))return null;n=n.parentElement;return null===n?null:n.matches(e)?x(n):this.parentUntilEditor(e,t,n)},w.prototype.equal=function(e){return e instanceof w?this.elems[0]===e.elems[0]:e instanceof HTMLElement&&this.elems[0]===e},w.prototype.insertBefore=function(e){var n=x(e).elems[0];return n?(0,u.default)(this).call(this,function(e){var t=n.parentNode;null!=t&&t.insertBefore(e,n)}):this},w.prototype.insertAfter=function(e){var n=x(e).elems[0],o=n&&n.nextSibling;return n?(0,u.default)(this).call(this,function(e){var t=n.parentNode;o?t.insertBefore(e,o):t.appendChild(e)}):this},w.prototype.data=function(e,t){if(null==t)return this.dataSource.get(e);this.dataSource.set(e,t)},w.prototype.getNodeTop=function(e){if(this.length<1)return this;var t=this.parent();return e.$textElem.equal(this)||e.$textElem.equal(t)?this:(t.prior=this,t.getNodeTop(e))},w.prototype.getOffsetData=function(){var e=this.elems[0];return{top:e.offsetTop,left:e.offsetLeft,width:e.offsetWidth,height:e.offsetHeight,parent:e.offsetParent}},w.prototype.scrollTop=function(e){this.elems[0].scrollTo({top:e})},w);function w(e){if(this.elems=[],this.length=this.elems.length,this.dataSource=new s.default,e){if(e instanceof w)return e;var t,n=[],o=e instanceof Node?e.nodeType:-1;this.selector=e,1===o||9===o?n=[e]:(t=e)&&(t instanceof HTMLCollection||t instanceof NodeList)?n=v.toArray(e):e instanceof Array?n=e:"string"==typeof e&&(t=(0,l.default)(o=e.replace("/\n/mg","")).call(o),n=0===(0,c.default)(t).call(t,"<")?(e=t,(o=document.createElement("div")).innerHTML=e,o=o.children,v.toArray(o)):(t=t,t=document.querySelectorAll(t),v.toArray(t)));var i=n.length;if(!i)return this;for(var r=0;r/gm,">").replace(/"/gm,""").replace(/(\r\n|\r|\n)/g,"
                                                      ")},t.replaceSpecialSymbol=function(e){return e.replace(/</gm,"<").replace(/>/gm,">").replace(/"/gm,'"')},t.forEach=function(e,t){for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n))if(!1===t(n,e[n]))break},t.arrForEach=function(e,t){for(var n,o=e.length||0,i=0;i

                                                      ',t.EMPTY_P_LAST_REGEX=/

                                                      <\/p>$/gim,t.EMPTY_P_REGEX=/

                                                      /gim},function(n,e,t){(function(e){function t(e){return e&&e.Math==Math&&e}n.exports=t("object"==typeof globalThis&&globalThis)||t("object"==typeof window&&window)||t("object"==typeof self&&self)||t("object"==typeof e&&e)||Function("return this")()}).call(this,t(145))},function(e,t){e.exports={}},function(e,t,n){var o=n(8),i=n(74),r=n(16),a=n(64),l=n(76),n=n(106),u=i("wks"),s=o.Symbol,c=n?s:s&&s.withoutSetter||a;e.exports=function(e){return r(u,e)||(l&&r(s,e)?u[e]=s[e]:u[e]=c("Symbol."+e)),u[e]}},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){var o=n(9),i=n(16),r=n(93),a=n(18).f;e.exports=function(e){var t=o.Symbol||(o.Symbol={});i(t,e)||a(t,e,{value:r.f(e)})}},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,n){n=n(11);e.exports=!n(function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})},function(e,t,n){var o=n(9);e.exports=function(e){return o[e+"Prototype"]}},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t,n){e.exports=n(192)},function(e,t,n){var o=n(14),i=n(100),r=n(25),a=n(60),l=Object.defineProperty;t.f=o?l:function(e,t,n){if(r(e),t=a(t,!0),r(n),i)try{return l(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){var o=n(14),i=n(18),r=n(48);e.exports=o?function(e,t,n){return i.f(e,t,r(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,i){"use strict";var n,o,l=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},r=(o={},function(e){if(void 0===o[e]){var t=document.querySelector(e);if(window.HTMLIFrameElement&&t instanceof window.HTMLIFrameElement)try{t=t.contentDocument.head}catch(e){t=null}o[e]=t}return o[e]}),s=[];function c(e){for(var t=-1,n=0;n'),s.append(i),i.on("click",function(){c.remove()}),r=A.default('

                                                        '),a=A.default('
                                                        '),s.append(r).append(a),(i=e.height)&&a.css("height",i+"px").css("overflow-y","auto"),i=e.tabs||[],l=[],u=[],(0,d.default)(i).call(i,function(e,t){var n,o,i;e&&(n=e.title||"",e=e.tpl||"",o=A.default('
                                                      • '+n+"
                                                      • "),r.append(o),i=A.default(e),a.append(i),l.push(o),u.push(i),0===t?(o.data("active",!0),o.addClass("w-e-active")):i.hide(),o.on("click",function(){o.data("active")||((0,d.default)(l).call(l,function(e){e.data("active",!1),e.removeClass("w-e-active")}),(0,d.default)(u).call(u,function(e){e.hide()}),o.data("active",!0),o.addClass("w-e-active"),i.show())}))}),s.on("click",function(e){e.stopPropagation()}),f.$elem.append(s),e.setLinkValue&&e.setLinkValue(s,"text"),e.setLinkValue&&e.setLinkValue(s,"link"),(0,d.default)(i).call(i,function(e,a){e&&(e=e.events||[],(0,d.default)(e).call(e,function(e){function t(t){return h.__awaiter(c,void 0,void 0,function(){return h.__generator(this,function(e){switch(e.label){case 0:return t.stopPropagation(),[4,i(t)];case 1:return e.sent()&&this.remove(),[2]}})})}var n=e.selector,o=e.type,i=e.fn||v.EMPTY_FN,r=u[a],e=null!==(e=e.bindEnter)&&void 0!==e&&e;(0,p.default)(r).call(r,n).on(o,t),e&&"click"===o&&r.on("keyup",function(e){13==e.keyCode&&t(e)})}))}),(s=(0,p.default)(s).call(s,"input[type=text],textarea")).length&&s.get(0).focus(),m.hideCurAllPanels(),f.setPanel(this),m.createdMenus.add(f))},m.prototype.remove=function(){var e=this.menu,t=this.$container;t&&t.remove(),m.createdMenus.delete(e)},m.hideCurAllPanels=function(){var e;0!==m.createdMenus.size&&(0,d.default)(e=m.createdMenus).call(e,function(e){e=e.panel;e&&e.remove()})},m.createdMenus=new o.default,m);function m(e,t){this.menu=e,this.conf=t,this.$container=A.default('
                                                        ');e=e.editor;e.txt.eventHooks.clickEvents.push(m.hideCurAllPanels),e.txt.eventHooks.toolbarClickEvents.push(m.hideCurAllPanels),e.txt.eventHooks.dropListMenuHoverEvents.push(m.hideCurAllPanels)}t.default=o},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){var o=n(62),i=Math.min;e.exports=function(e){return 0
                                                        ");o.addClass("w-e-tooltip-item-wrapper "),o.append(n),l.append(o),n.on("click",function(e){e.preventDefault(),t.onClick(r,a)&&i.remove()})})},a.prototype.create=function(){var e=this.editor,t=this.$container;this.appendMenus();var n=this.getPositionData(),o=n.top,n=n.left;t.css("top",o+"px"),t.css("left",n+"px"),t.css("z-index",e.zIndex.get("tooltip")),(this._isInsertTextContainer?this.editor.$textContainerElem:f.default("body")).append(t),this._show=!0,e.beforeDestroy((0,r.default)(t=this.remove).call(t,this)),e.txt.eventHooks.onBlurEvents.push((0,r.default)(e=this.remove).call(e,this))},a.prototype.remove=function(){this.$container.remove(),this._show=!1},(0,i.default)(a.prototype,"isShow",{get:function(){return this._show},enumerable:!1,configurable:!0}),a);function a(e,t,n){this.editor=e,this.$targetElem=t,this.conf=n,this._show=!1,this._isInsertTextContainer=!1;n=f.default("
                                                        ");n.addClass("w-e-tooltip"),this.$container=n}t.default=i},function(e,t,n){var r=n(41);e.exports=function(o,i,e){if(r(o),void 0===i)return o;switch(e){case 0:return function(){return o.call(i)};case 1:return function(e){return o.call(i,e)};case 2:return function(e,t){return o.call(i,e,t)};case 3:return function(e,t,n){return o.call(i,e,t,n)}}return function(){return o.apply(i,arguments)}}},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},function(e,t,n){var o,i,r,a,l,u,s,c,f=n(165),d=n(8),p=n(13),h=n(19),A=n(16),v=n(63),n=n(51),d=d.WeakMap;s=f?(o=new d,i=o.get,r=o.has,a=o.set,l=function(e,t){return a.call(o,e,t),t},u=function(e){return i.call(o,e)||{}},function(e){return r.call(o,e)}):(n[c=v("state")]=!0,l=function(e,t){return h(e,c,t),t},u=function(e){return A(e,c)?e[c]:{}},function(e){return A(e,c)}),e.exports={set:l,get:u,has:s,enforce:function(e){return s(e)?u(e):l(e,{})},getterFor:function(n){return function(e){var t;if(!p(e)||(t=u(e)).type!==n)throw TypeError("Incompatible receiver, "+n+" required");return t}}}},function(e,t){e.exports=!0},function(e,t){e.exports={}},function(e,t,n){e.exports=n(261)},function(e,t,n){e.exports=n(265)},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(4));(0,i.default)(t,"__esModule",{value:!0}),t.createElementFragment=t.createDocumentFragment=t.createElement=t.insertBefore=t.getEndPoint=t.getStartPoint=t.updateRange=t.filterSelectionNodes=void 0;var i=n(2),a=n(137),l=i.__importDefault(n(3));function u(e){return document.createElement(e)}t.filterSelectionNodes=function(e){var n=[];return(0,r.default)(e).call(e,function(e){var t=e.getNodeName();t!==a.ListType.OrderedList&&t!==a.ListType.UnorderedList?n.push(e):e.prior?n.push(e.prior):null!=(e=e.children())&&(0,r.default)(e).call(e,function(e){n.push(l.default(e))})}),n},t.updateRange=function(e,t,n){var o=e.selection,e=document.createRange();1=t.length?{value:void 0,done:!0}:(n=o(t,n),e.index+=n.length,{value:n,done:!1})})},function(e,t){e.exports={}},function(e,t,n){var o=n(107),i=n(80);e.exports=Object.keys||function(e){return o(e,i)}},function(e,t,n){var i=n(19);e.exports=function(e,t,n,o){o&&o.enumerable?e[t]=n:i(e,t,n)}},function(e,t,n){n(173);var o,i=n(174),r=n(8),a=n(65),l=n(19),u=n(44),s=n(10)("toStringTag");for(o in i){var c=r[o],c=c&&c.prototype;c&&a(c)!==s&&l(c,s,o),u[o]=u.Array}},function(e,t,n){var o=n(34);e.exports=Array.isArray||function(e){return"Array"==o(e)}},function(e,t,n){var o=n(11),i=n(10),r=n(86),a=i("species");e.exports=function(t){return 51<=r||!o(function(){var e=[];return(e.constructor={})[a]=function(){return{foo:1}},1!==e[t](Boolean).foo})}},function(e,t,n){e.exports=n(222)},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0}),t.ListHandle=void 0;var o=n(2).__importDefault(n(373)),n=function(e){this.options=e,this.selectionRangeElem=new o.default};t.ListHandle=n},function(e,t,n){"use strict";var o={}.propertyIsEnumerable,i=Object.getOwnPropertyDescriptor,r=i&&!o.call({1:2},1);t.f=r?function(e){e=i(this,e);return!!e&&e.enumerable}:o},function(e,t,n){var i=n(13);e.exports=function(e,t){if(!i(e))return e;var n,o;if(t&&"function"==typeof(n=e.toString)&&!i(o=n.call(e)))return o;if("function"==typeof(n=e.valueOf)&&!i(o=n.call(e)))return o;if(!t&&"function"==typeof(n=e.toString)&&!i(o=n.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},function(e,t){},function(e,t){var n=Math.ceil,o=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(0"+e+""}var r,a=n(25),l=n(169),u=n(80),s=n(51),c=n(108),f=n(73),n=n(63),d="prototype",p="script",h=n("IE_PROTO"),A=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(e){}var e;A=r?function(e){e.write(i("")),e.close();var t=e.parentWindow.Object;return e=null,t}(r):((e=f("iframe")).style.display="none",c.appendChild(e),e.src=String("javascript:"),(e=e.contentWindow.document).open(),e.write(i("document.F=Object")),e.close(),e.F);for(var t=u.length;t--;)delete A[d][u[t]];return A()};s[h]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(o[d]=a(e),n=new o,o[d]=null,n[h]=e):n=A(),void 0===t?n:l(n,t)}},function(e,t,n){var u=n(30),s=n(35),c=n(79),n=function(l){return function(e,t,n){var o,i=u(e),r=s(i.length),a=c(n,r);if(l&&t!=t){for(;a
                                                        "),this.$textContainerElem=l.default("
                                                        "),this.$textElem=l.default("
                                                        "),this.toolbarElemId="",this.textElemId="",this.isFocus=!1,this.isComposing=!1,this.isCompatibleMode=!1,this.selection=new c.default(this),this.cmd=new f.default(this),this.txt=new d.default(this),this.menus=new p.default(this),this.zIndex=new w.default,this.change=new x.default(this),this.history=new _.default(this),this.onSelectionChange=new b.default(this);e=E.default(this),t=e.disable,e=e.enable;this.disable=t,this.enable=e,this.isEnable=!0}t.default=n},function(e,t,n){var o=n(13),i=n(55),r=n(10)("species");e.exports=function(e,t){var n;return i(e)&&("function"==typeof(n=e.constructor)&&(n===Array||i(n.prototype))||o(n)&&null===(n=n[r]))&&(n=void 0),new(void 0===n?Array:n)(0===t?0:t)}},function(e,t,n){e.exports=n(185)},function(e,t,n){var o=n(49),n="["+n(68)+"]",i=RegExp("^"+n+n+"*"),r=RegExp(n+n+"*$"),n=function(t){return function(e){e=String(o(e));return 1&t&&(e=e.replace(i,"")),2&t&&(e=e.replace(r,"")),e}};e.exports={start:n(1),end:n(2),trim:n(3)}},function(e,t,n){e.exports=n(205)},function(t,e,n){var o=n(227),i=n(230);function r(e){return t.exports=r="function"==typeof i&&"symbol"==typeof o?function(e){return typeof e}:function(e){return e&&"function"==typeof i&&e.constructor===i&&e!==i.prototype?"symbol":typeof e},r(e)}t.exports=r},function(e,t,n){n=n(10);t.f=n},function(e,t,n){e.exports=n(306)},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(4));(0,i.default)(t,"__esModule",{value:!0});var a=n(2).__importDefault(n(33)),i=(l.prototype.clickHandler=function(e){},l.prototype.active=function(){this._active=!0,this.$elem.addClass("w-e-active")},l.prototype.unActive=function(){this._active=!1,this.$elem.removeClass("w-e-active")},(0,i.default)(l.prototype,"isActive",{get:function(){return this._active},enumerable:!1,configurable:!0}),l);function l(e,n){var o=this;this.$elem=e,this.editor=n,this._active=!1,e.on("click",function(e){var t;a.default.hideCurAllPanels(),(0,r.default)(t=n.txt.eventHooks.menuClickEvents).call(t,function(e){return e()}),e.stopPropagation(),null!=n.selection.getRange()&&o.clickHandler(e)})}t.default=i},function(e,o,t){"use strict";var n=t(0),i=n(t(1)),r=n(t(28));function a(e){for(var t,n=e.elems[0];n&&(0,r.default)(t=o.EXTRA_TAG).call(t,n.nodeName);)if("A"===(n=n.parentElement).nodeName)return n}(0,i.default)(o,"__esModule",{value:!0}),o.getParentNodeA=o.EXTRA_TAG=void 0,o.EXTRA_TAG=["B","FONT","I","STRIKE"],o.getParentNodeA=a,o.default=function(e){var t=e.selection.getSelectionContainerElem();return!(null===(e=null==t?void 0:t.elems)||void 0===e||!e.length)&&("A"===t.getNodeName()||!(!(t=a(t))||"A"!==t.nodeName))}},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),_=o(n(57)),E=o(n(4)),b=o(n(27));(0,i.default)(t,"__esModule",{value:!0});var i=n(2),C=n(6),S=i.__importDefault(n(135)),M=i.__importDefault(n(136)),n=(r.prototype.insertImg=function(e,t,n){function o(e,t){return void 0===t&&(t="validate."),i.i18next.t(t+e)}var i=this.editor,r=i.config,a=(a=e.replace(//g,">")).replace("'",'"'),l="";n&&(l=n.replace("'",'"'),l="data-href='"+encodeURIComponent(l)+"' ");var u="";t&&(u="alt='"+(u=(u=t.replace(//g,">")).replace("'",'"'))+"' "),i.cmd.do("insertHTML","'),r.linkImgCallback(e,t,n);var s=document.createElement("img");s.onload=function(){s=null},s.onerror=function(){r.customAlert(o("插入图片错误"),"error","wangEditor: "+o("插入图片错误")+","+o("图片链接")+' "'+e+'",'+o("下载链接失败")),s=null},s.onabort=function(){return s=null},s.src=e},r.prototype.uploadImg=function(e){var i,o,r,t,a,l,n,u,s,c,f,d,p,h,A,v,m,g,y,w,x=this;e.length&&(i=this.editor,o=i.config,r=function(e){return i.i18next.t("validate."+e)},g=o.uploadImgServer,t=o.uploadImgShowBase64,a=o.uploadImgMaxSize,l=a/1024/1024,n=o.uploadImgMaxLength,u=o.uploadFileName,s=o.uploadImgParams,c=o.uploadImgParamsWithUrl,f=o.uploadImgHeaders,d=o.uploadImgHooks,p=o.uploadImgTimeout,w=o.withCredentials,((h=o.customUploadImg)||g||t)&&(A=[],v=[],C.arrForEach(e,function(e){var t,n,o;e&&(t=e.name||e.type.replace("/","."),n=e.size,t&&n&&(o=i.config.uploadImgAccept.join("|"),!1!==new RegExp(".("+o+")$","i").test(t)?an?o.customAlert(r("一次最多上传")+n+r("张图片"),"warning"):h&&"function"==typeof h?h(A,(0,_.default)(y=this.insertImg).call(y,this)):(m=new FormData,(0,E.default)(A).call(A,function(e,t){var n=u||e.name;1i;)a(o,n=t[i++])&&(~u(r,n)||r.push(n));return r}},function(e,t,n){n=n(36);e.exports=n("document","documentElement")},function(e,t,n){n=n(8);e.exports=n.Promise},function(e,t,n){var i=n(53);e.exports=function(e,t,n){for(var o in t)n&&n.unsafe&&e[o]?e[o]=t[o]:i(e,o,t[o],n);return e}},function(e,t,n){"use strict";var o=n(36),i=n(18),r=n(10),a=n(14),l=r("species");e.exports=function(e){var t=o(e),e=i.f;a&&t&&!t[l]&&e(t,l,{configurable:!0,get:function(){return this}})}},function(e,t,n){var o=n(10),i=n(44),r=o("iterator"),a=Array.prototype;e.exports=function(e){return void 0!==e&&(i.Array===e||a[r]===e)}},function(e,t,n){var o=n(65),i=n(44),r=n(10)("iterator");e.exports=function(e){if(null!=e)return e[r]||e["@@iterator"]||i[o(e)]}},function(e,t,n){var r=n(25);e.exports=function(t,e,n,o){try{return o?e(r(n)[0],n[1]):e(n)}catch(e){var i=t.return;throw void 0!==i&&r(i.call(t)),e}}},function(e,t,n){var i=n(10)("iterator"),r=!1;try{var o=0,a={next:function(){return{done:!!o++}},return:function(){r=!0}};a[i]=function(){return this},Array.from(a,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!r)return!1;var n=!1;try{var o={};o[i]=function(){return{next:function(){return{done:n=!0}}}},e(o)}catch(e){}return n}},function(e,t,n){var o=n(25),i=n(41),r=n(10)("species");e.exports=function(e,t){var n,e=o(e).constructor;return void 0===e||null==(n=o(e)[r])?t:i(n)}},function(e,t,n){function o(e){var t;x.hasOwnProperty(e)&&(t=x[e],delete x[e],t())}function i(e){return function(){o(e)}}function r(e){o(e.data)}var a,l=n(8),u=n(11),s=n(34),c=n(40),f=n(108),d=n(73),p=n(118),h=l.location,A=l.setImmediate,v=l.clearImmediate,m=l.process,g=l.MessageChannel,y=l.Dispatch,w=0,x={},_="onreadystatechange",n=function(e){l.postMessage(e+"",h.protocol+"//"+h.host)};A&&v||(A=function(e){for(var t=[],n=1;n"+e+"

                                                        "}return i=(i=i.replace(/<(\d)/gm,function(e,t){return"<"+t})).replace(/<(\/?meta.*?)>/gim,""),i=l.default(i,t,n)},t.getPasteImgs=function(e){var o=[];return u(e)||(e=null===(e=e.clipboardData)||void 0===e?void 0:e.items)&&(0,r.default)(a).call(a,e,function(e,t){var n=t.type;/image/i.test(n)&&o.push(t.getAsFile())}),o}},function(e,t,n){e.exports=n(294)},function(e,t,n){e.exports=n(310)},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),l=o(n(4)),u=o(n(46));(0,i.default)(t,"__esModule",{value:!0});var s=n(2).__importDefault(n(3)),c=n(7),i=(r.prototype.show=function(){this.hideTimeoutId&&clearTimeout(this.hideTimeoutId);var e,t,n=this.menu.$elem,o=this.$container;this._show||(this.rendered?o.show():(e=n.getBoundingClientRect().height||0,t=this.conf.width||100,o.css("margin-top",e+"px").css("width",t+"px"),n.append(o),this.rendered=!0),this._show=!0)},r.prototype.hide=function(){var e=this.$container;this._show&&(e.hide(),this._show=!1)},(0,i.default)(r.prototype,"isShow",{get:function(){return this._show},enumerable:!1,configurable:!0}),r);function r(e,t){var o=this;this.hideTimeoutId=0,this.menu=e,this.conf=t;var n=s.default('
                                                        '),i=s.default("

                                                        "+t.title+"

                                                        ");i.addClass("w-e-dp-title"),n.append(i);var e=t.list||[],i=t.type||"list",r=t.clickHandler||c.EMPTY_FN,a=s.default('
                                                          ');(0,l.default)(e).call(e,function(e){var t=e.$elem,n=e.value,e=s.default('
                                                        • ');t&&(e.append(t),a.append(e),e.on("click",function(e){r(n),e.stopPropagation(),o.hideTimeoutId=(0,u.default)(function(){o.hide()})}))}),n.append(a),n.on("mouseleave",function(){o.hideTimeoutId=(0,u.default)(function(){o.hide()})}),this.$container=n,this.rendered=!1,this._show=!1}t.default=i},function(e,t,n){"use strict";var o=n(0),r=o(n(92)),i=o(n(1)),a=o(n(4));(0,i.default)(t,"__esModule",{value:!0});var l=n(6);t.default=function(e,o){var i=new XMLHttpRequest;if(i.open("POST",e),i.timeout=o.timeout||1e4,i.ontimeout=function(){console.error("wangEditor - 请求超时"),o.onTimeout&&o.onTimeout(i)},i.upload&&(i.upload.onprogress=function(e){var t=e.loaded/e.total;o.onProgress&&o.onProgress(t,e)}),o.headers&&(0,a.default)(l).call(l,o.headers,function(e,t){i.setRequestHeader(e,t)}),i.withCredentials=!!o.withCredentials,o.beforeSend){e=o.beforeSend(i);if(e&&"object"===(0,r.default)(e)&&e.prevent)return e.msg}return i.onreadystatechange=function(){if(4===i.readyState){var e=i.status;if(!(e<200||300<=e&&e<400)){if(400<=e)return console.error("wangEditor - XHR 报错,状态码 "+e),void(o.onError&&o.onError(i));var t,n=i.responseText;if("object"!==(0,r.default)(n))try{t=JSON.parse(n)}catch(e){return console.error("wangEditor - 返回结果不是 JSON 格式",n),void(o.onFail&&o.onFail(i,n))}else t=n;o.onSuccess(i,t)}}},i.send(o.formData||null),i}},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(342)),a=o(n(46));(0,i.default)(t,"__esModule",{value:!0});var l=n(2).__importDefault(n(3)),n=(u.prototype.show=function(e){var t,n=this;this.isShow||(this.isShow=!0,t=this.$bar,this.$textContainer.append(t),100<(0,r.default)()-this.time&&e<=1&&(t.css("width",100*e+"%"),this.time=(0,r.default)()),(e=this.timeoutId)&&clearTimeout(e),this.timeoutId=(0,a.default)(function(){n.hide()},500))},u.prototype.hide=function(){this.$bar.remove(),this.isShow=!1,this.time=0,this.timeoutId=0},u);function u(e){this.editor=e,this.$textContainer=e.$textContainerElem,this.$bar=l.default('
                                                          '),this.isShow=!1,this.time=0,this.timeoutId=0}t.default=n},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0}),t.ListType=void 0;var i,o=n(2),r=o.__importDefault(n(3)),a=o.__importDefault(n(24)),u=n(47),s=o.__importStar(n(371));(n=i=t.ListType||(t.ListType={})).OrderedList="OL",n.UnorderedList="UL";var l,o=(l=a.default,o.__extends(c,l),c.prototype.command=function(e){void 0!==this.editor.selection.getSelectionContainerElem()&&(this.handleSelectionRangeNodes(e),this.tryChangeActive())},c.prototype.validator=function(e,t,n){return!(!e.length||!t.length||n.equal(e)||n.equal(t))},c.prototype.handleSelectionRangeNodes=function(e){var t,n=this.editor,o=n.selection,i=e.toLowerCase(),r=o.getSelectionContainerElem(),a=o.getSelectionStartElem().getNodeTop(n),l=o.getSelectionEndElem().getNodeTop(n);this.validator(a,l,n.$textElem)&&(o=null==(t=o.getRange())?void 0:t.collapsed,n.$textElem.equal(r)||(r=r.getNodeTop(n)),i={editor:n,listType:e,listTarget:i,$selectionElem:r,$startElem:a,$endElem:l},l=this.isOrderElem(r)?s.ClassType.Wrap:this.isOrderElem(a)&&this.isOrderElem(l)?s.ClassType.Join:this.isOrderElem(a)?s.ClassType.StartJoin:this.isOrderElem(l)?s.ClassType.EndJoin:s.ClassType.Other,t=new s.default(s.createListHandle(l,i,t)),u.updateRange(n,t.getSelectionRangeElem(),!!o))},c.prototype.isOrderElem=function(e){e=e.getNodeName();return e===i.OrderedList||e===i.UnorderedList},c.prototype.tryChangeActive=function(){},c);function c(e){var t=this,n=r.default('
                                                          \n \n
                                                          '),o={width:130,title:"序列",type:"list",list:[{$elem:r.default('\n

                                                          \n \n '+e.i18next.t("menus.dropListMenu.list.无序列表")+"\n

                                                          "),value:i.UnorderedList},{$elem:r.default('

                                                          \n \n '+e.i18next.t("menus.dropListMenu.list.有序列表")+"\n

                                                          "),value:i.OrderedList}],clickHandler:function(e){t.command(e)}};return t=l.call(this,n,e,o)||this}t.default=o},function(e,t,n){e.exports=n(395)},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0}),t.default=function(e){return!(null==(e=e.selection.getSelectionContainerElem())||!e.length)&&!("CODE"!=e.getNodeName()&&"PRE"!=e.getNodeName()&&"CODE"!=e.parent().getNodeName()&&"PRE"!=e.parent().getNodeName()&&!/hljs/.test(e.parent().attr("class")))}},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(29));(0,i.default)(t,"__esModule",{value:!0}),t.todo=void 0;var a=n(2).__importDefault(n(3)),l=(u.prototype.init=function(){var e=this.$child,t=this.getInputContainer();e&&e.insertAfter(t)},u.prototype.getInput=function(){var e=this.$todo;return(0,r.default)(e).call(e,"input")},u.prototype.getInputContainer=function(){return this.getInput().parent()},u.prototype.getTodo=function(){return this.$todo},u);function u(e){this.template='

                                                          ',this.checked=!1,this.$todo=a.default(this.template),this.$child=null===(e=null==e?void 0:e.childNodes())||void 0===e?void 0:e.clone(!0)}t.todo=l,t.default=function(e){return(e=new l(e)).init(),e}},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o=n(2);n(146),n(148),n(152),n(154),n(156),n(158),n(160);var i=o.__importDefault(n(87));o.__exportStar(n(442),t);try{document}catch(e){throw new Error("请在浏览器环境下运行")}t.default=i.default},function(e,t,n){n=n(143);e.exports=n},function(e,t,n){n(144);var o=n(9).Object,e=e.exports=function(e,t,n){return o.defineProperty(e,t,n)};o.defineProperty.sham&&(e.sham=!0)},function(e,t,n){var o=n(5),i=n(14);o({target:"Object",stat:!0,forced:!i,sham:!i},{defineProperty:n(18).f})},function(e,t){var n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){var o=n(20),i=n(147);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);n={insert:"head",singleton:!1},o(i,n);e.exports=i.locals||{}},function(e,t,n){(t=n(21)(!1)).push([e.i,'.w-e-toolbar,\n.w-e-text-container,\n.w-e-menu-panel {\n padding: 0;\n margin: 0;\n box-sizing: border-box;\n background-color: #fff;\n /*表情菜单样式*/\n /*分割线样式*/\n}\n.w-e-toolbar h1,\n.w-e-text-container h1,\n.w-e-menu-panel h1 {\n font-size: 32px !important;\n}\n.w-e-toolbar h2,\n.w-e-text-container h2,\n.w-e-menu-panel h2 {\n font-size: 24px !important;\n}\n.w-e-toolbar h3,\n.w-e-text-container h3,\n.w-e-menu-panel h3 {\n font-size: 18.72px !important;\n}\n.w-e-toolbar h4,\n.w-e-text-container h4,\n.w-e-menu-panel h4 {\n font-size: 16px !important;\n}\n.w-e-toolbar h5,\n.w-e-text-container h5,\n.w-e-menu-panel h5 {\n font-size: 13.28px !important;\n}\n.w-e-toolbar p,\n.w-e-text-container p,\n.w-e-menu-panel p {\n font-size: 16px !important;\n}\n.w-e-toolbar .eleImg,\n.w-e-text-container .eleImg,\n.w-e-menu-panel .eleImg {\n cursor: pointer;\n display: inline-block;\n font-size: 18px;\n padding: 0 3px;\n}\n.w-e-toolbar *,\n.w-e-text-container *,\n.w-e-menu-panel * {\n padding: 0;\n margin: 0;\n box-sizing: border-box;\n}\n.w-e-toolbar hr,\n.w-e-text-container hr,\n.w-e-menu-panel hr {\n cursor: pointer;\n display: block;\n height: 0px;\n border: 0;\n border-top: 3px solid #ccc;\n margin: 20px 0;\n}\n.w-e-clear-fix:after {\n content: "";\n display: table;\n clear: both;\n}\n.w-e-drop-list-item {\n position: relative;\n top: 1px;\n padding-right: 7px;\n color: #333 !important;\n}\n.w-e-drop-list-tl {\n padding-left: 10px;\n text-align: left;\n}\n',""]),e.exports=t},function(e,t,n){var o=n(20),i=n(149);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);n={insert:"head",singleton:!1},o(i,n);e.exports=i.locals||{}},function(e,t,n){var o=n(21),i=n(150),n=n(151);t=o(!1);n=i(n);t.push([e.i,"@font-face {\n font-family: 'w-e-icon';\n src: url("+n+') format(\'truetype\');\n font-weight: normal;\n font-style: normal;\n}\n[class^="w-e-icon-"],\n[class*=" w-e-icon-"] {\n /* use !important to prevent issues with browser extensions that change fonts */\n font-family: \'w-e-icon\' !important;\n speak: none;\n font-style: normal;\n font-weight: normal;\n font-variant: normal;\n text-transform: none;\n line-height: 1;\n /* Better Font Rendering =========== */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.w-e-icon-close:before {\n content: "\\f00d";\n}\n.w-e-icon-upload2:before {\n content: "\\e9c6";\n}\n.w-e-icon-trash-o:before {\n content: "\\f014";\n}\n.w-e-icon-header:before {\n content: "\\f1dc";\n}\n.w-e-icon-pencil2:before {\n content: "\\e906";\n}\n.w-e-icon-paint-brush:before {\n content: "\\f1fc";\n}\n.w-e-icon-image:before {\n content: "\\e90d";\n}\n.w-e-icon-play:before {\n content: "\\e912";\n}\n.w-e-icon-location:before {\n content: "\\e947";\n}\n.w-e-icon-undo:before {\n content: "\\e965";\n}\n.w-e-icon-redo:before {\n content: "\\e966";\n}\n.w-e-icon-quotes-left:before {\n content: "\\e977";\n}\n.w-e-icon-list-numbered:before {\n content: "\\e9b9";\n}\n.w-e-icon-list2:before {\n content: "\\e9bb";\n}\n.w-e-icon-link:before {\n content: "\\e9cb";\n}\n.w-e-icon-happy:before {\n content: "\\e9df";\n}\n.w-e-icon-bold:before {\n content: "\\ea62";\n}\n.w-e-icon-underline:before {\n content: "\\ea63";\n}\n.w-e-icon-italic:before {\n content: "\\ea64";\n}\n.w-e-icon-strikethrough:before {\n content: "\\ea65";\n}\n.w-e-icon-table2:before {\n content: "\\ea71";\n}\n.w-e-icon-paragraph-left:before {\n content: "\\ea77";\n}\n.w-e-icon-paragraph-center:before {\n content: "\\ea78";\n}\n.w-e-icon-paragraph-right:before {\n content: "\\ea79";\n}\n.w-e-icon-paragraph-justify:before {\n content: "\\ea7a";\n}\n.w-e-icon-terminal:before {\n content: "\\f120";\n}\n.w-e-icon-page-break:before {\n content: "\\ea68";\n}\n.w-e-icon-cancel-circle:before {\n content: "\\ea0d";\n}\n.w-e-icon-font:before {\n content: "\\ea5c";\n}\n.w-e-icon-text-heigh:before {\n content: "\\ea5f";\n}\n.w-e-icon-paint-format:before {\n content: "\\e90c";\n}\n.w-e-icon-indent-increase:before {\n content: "\\ea7b";\n}\n.w-e-icon-indent-decrease:before {\n content: "\\ea7c";\n}\n.w-e-icon-row-height:before {\n content: "\\e9be";\n}\n.w-e-icon-fullscreen_exit:before {\n content: "\\e900";\n}\n.w-e-icon-fullscreen:before {\n content: "\\e901";\n}\n.w-e-icon-split-line:before {\n content: "\\ea0b";\n}\n.w-e-icon-checkbox-checked:before {\n content: "\\ea52";\n}\n',""]),e.exports=t},function(e,t,n){"use strict";e.exports=function(e,t){return t=t||{},"string"!=typeof(e=e&&e.__esModule?e.default:e)?e:(/^['"].*['"]$/.test(e)&&(e=e.slice(1,-1)),t.hash&&(e+=t.hash),/["'() \t\n]/.test(e)||t.needQuotes?'"'.concat(e.replace(/"/g,'\\"').replace(/\n/g,"\\n"),'"'):e)}},function(e,t,n){"use strict";n.r(t),t.default="data:font/woff;base64,d09GRgABAAAAABskAAsAAAAAGtgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIPFWNtYXAAAAFoAAABHAAAARz2mfAgZ2FzcAAAAoQAAAAIAAAACAAAABBnbHlmAAACjAAAFXwAABV8IH7+mGhlYWQAABgIAAAANgAAADYb6gumaGhlYQAAGEAAAAAkAAAAJAkjBWlobXR4AAAYZAAAAKQAAACkmYcEbmxvY2EAABkIAAAAVAAAAFReAmKYbWF4cAAAGVwAAAAgAAAAIAA0ALZuYW1lAAAZfAAAAYYAAAGGmUoJ+3Bvc3QAABsEAAAAIAAAACAAAwAAAAMD7wGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA8fwDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEAQAAAAA8ACAABAAcAAEAIOkB6QbpDekS6UfpZul36bnpu+m+6cbpy+nf6gvqDepS6lzqX+pl6nHqfPAN8BTxIPHc8fz//f//AAAAAAAg6QDpBukM6RLpR+ll6Xfpuem76b7pxunL6d/qC+oN6lLqXOpf6mLqcep38A3wFPEg8dzx/P/9//8AAf/jFwQXABb7FvcWwxamFpYWVRZUFlIWSxZHFjQWCRYIFcQVuxW5FbcVrBWnEBcQEQ8GDksOLAADAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAAEAEEAAQO/A38ABQALABEAFwAAATMVIREzAxEhFSMVATUzESE1ETUhESM1Av/A/sJ+fgE+wP4Cfv7CAT5+Ar9+AT78ggE+fsACvsD+wn7+An7+wsAAAAAABABBAAEDvwN/AAUACwARABcAAAEhESM1IxM1MxEhNQERIRUjFREVMxUhEQKBAT5+wMB+/sL9wAE+wMD+wgN//sLA/X7A/sJ+AcIBPn7A/v7AfgE+AAAAAAIAAP/ABAADwAAEABMAAAE3AScBAy4BJxM3ASMBAyUBNQEHAYCAAcBA/kCfFzsyY4ABgMD+gMACgAGA/oBOAUBAAcBA/kD+nTI7FwERTgGA/oD9gMABgMD+gIAAAgAA/8AEAAOAACkALQAAAREjNTQmIyEiBh0BFBYzITI2PQEzESEVIyIGFREUFjsBMjY1ETQmKwE1ASE1IQQAwCYa/UAaJiYaAsAaJoD9wCANExMNgA0TEw0gAUD9QALAAYABgEAaJiYawBomJhpA/wCAEw3+wA0TEw0BQA0TQAGAQAAABAAAAAAEAAOAABAAIQAtADQAAAE4ATEROAExITgBMRE4ATEhNSEiBhURFBYzITI2NRE0JiMHFAYjIiY1NDYzMhYTITUTATM3A8D8gAOA/IAaJiYaA4AaJiYagDgoKDg4KCg4QP0A4AEAQOADQP0AAwBAJhr9ABomJhoDABom4Cg4OCgoODj9uIABgP7AwAAAAgAAAEAEAANAADgAPAAAASYnLgEnJiMiBw4BBwYHBgcOAQcGFRQXHgEXFhcWFx4BFxYzMjc+ATc2NzY3PgE3NjU0Jy4BJyYnARENAQPVNjg5djw9Pz89PHY5ODYLBwgLAwMDAwsIBws2ODl2PD0/Pz08djk4NgsHCAsDAwMDCwgHC/2rAUD+wAMgCAYGCAICAgIIBgYIKSoqWS0uLy8uLVkqKikIBgYIAgICAggGBggpKipZLS4vLy4tWSoqKf3gAYDAwAAAAAACAMD/wANAA8AAGwAnAAABIgcOAQcGFRQXHgEXFjEwNz4BNzY1NCcuAScmAyImNTQ2MzIWFRQGAgBCOzpXGRkyMngyMjIyeDIyGRlXOjtCUHBwUFBwcAPAGRlXOjtCeH19zEFBQUHMfX14Qjs6VxkZ/gBwUFBwcFBQcAAAAQAAAAAEAAOAACsAAAEiBw4BBwYHJxEhJz4BMzIXHgEXFhUUBw4BBwYHFzY3PgE3NjU0Jy4BJyYjAgA1MjJcKSkjlgGAkDWLUFBFRmkeHgkJIhgYHlUoICAtDAwoKIteXWoDgAoLJxscI5b+gJA0PB4eaUZFUCsoKUkgIRpgIysrYjY2OWpdXosoKAABAAAAAAQAA4AAKgAAExQXHgEXFhc3JicuAScmNTQ3PgE3NjMyFhcHIREHJicuAScmIyIHDgEHBgAMDC0gIChVHhgYIgkJHh5pRkVQUIs1kAGAliMpKVwyMjVqXV6LKCgBgDk2NmIrKyNgGiEgSSkoK1BFRmkeHjw0kAGAliMcGycLCigoi15dAAAAAAIAAABABAEDAAAmAE0AABMyFx4BFxYVFAcOAQcGIyInLgEnJjUnNDc+ATc2MxUiBgcOAQc+ASEyFx4BFxYVFAcOAQcGIyInLgEnJjUnNDc+ATc2MxUiBgcOAQc+AeEuKSk9ERISET0pKS4uKSk9ERIBIyN6UlFdQHUtCRAHCBICSS4pKT0REhIRPSkpLi4pKT0REgEjI3pSUV1AdS0JEAcIEgIAEhE9KSkuLikpPRESEhE9KSkuIF1RUnojI4AwLggTCgIBEhE9KSkuLikpPRESEhE9KSkuIF1RUnojI4AwLggTCgIBAAAGAED/wAQAA8AAAwAHAAsAEQAdACkAACUhFSERIRUhESEVIScRIzUjNRMVMxUjNTc1IzUzFRURIzUzNSM1MzUjNQGAAoD9gAKA/YACgP2AwEBAQIDAgIDAwICAgICAgAIAgAIAgMD/AMBA/fIyQJI8MkCS7v7AQEBAQEAABgAA/8AEAAPAAAMABwALABcAIwAvAAABIRUhESEVIREhFSEBNDYzMhYVFAYjIiYRNDYzMhYVFAYjIiYRNDYzMhYVFAYjIiYBgAKA/YACgP2AAoD9gP6ASzU1S0s1NUtLNTVLSzU1S0s1NUtLNTVLA4CA/wCA/wCAA0A1S0s1NUtL/rU1S0s1NUtL/rU1S0s1NUtLAAUAAABABWADAAADAAcACwAOABEAABMhFSEVIRUhFSEVIQEXNzUnBwADgPyAA4D8gAOA/IAD4MDAwMADAMBAwEDAAUDAwEDAwAAAAAADAAAAAAQAA6AAAwANABQAADchFSElFSE1EyEVITUhJQkBIxEjEQAEAPwABAD8AIABAAEAAQD9YAEgASDggEBAwEBAAQCAgMABIP7g/wABAAAAAAACAB7/zAPiA7QAMwBkAAABIiYnJicmNDc2PwE+ATMyFhcWFxYUBwYPAQYiJyY0PwE2NCcuASMiBg8BBhQXFhQHDgEjAyImJyYnJjQ3Nj8BNjIXFhQPAQYUFx4BMzI2PwE2NCcmNDc2MhcWFxYUBwYPAQ4BIwG4ChMIIxISEhIjwCNZMTFZIyMSEhISI1gPLA8PD1gpKRQzHBwzFMApKQ8PCBMKuDFZIyMSEhISI1gPLA8PD1gpKRQzHBwzFMApKQ8PDysQIxISEhIjwCNZMQFECAckLS1eLS0kwCIlJSIkLS1eLS0kVxAQDysPWCl0KRQVFRTAKXQpDysQBwj+iCUiJC0tXi0tJFcQEA8rD1gpdCkUFRUUwCl0KQ8rEA8PJC0tXi0tJMAiJQAAAAAFAAD/wAQAA8AAGwA3AFMAXwBrAAAFMjc+ATc2NTQnLgEnJiMiBw4BBwYVFBceARcWEzIXHgEXFhUUBw4BBwYjIicuAScmNTQ3PgE3NhMyNz4BNzY3BgcOAQcGIyInLgEnJicWFx4BFxYnNDYzMhYVFAYjIiYlNDYzMhYVFAYjIiYCAGpdXosoKCgoi15dampdXosoKCgoi15dalZMTHEgISEgcUxMVlZMTHEgISEgcUxMVisrKlEmJiMFHBtWODc/Pzc4VhscBSMmJlEqK9UlGxslJRsbJQGAJRsbJSUbGyVAKCiLXl1qal1eiygoKCiLXl1qal1eiygoA6AhIHFMTFZWTExxICEhIHFMTFZWTExxICH+CQYGFRAQFEM6OlYYGRkYVjo6QxQQEBUGBvcoODgoKDg4KCg4OCgoODgAAAEAAAFABAACQAAPAAATFRQWMyEyNj0BNCYjISIGABMNA8ANExMN/EANEwIgwA0TEw3ADRMTAAAAAwAA/8AEAAPAABsANwBDAAABIgcOAQcGFRQXHgEXFjMyNz4BNzY1NCcuAScmAyInLgEnJjU0Nz4BNzYzMhceARcWFRQHDgEHBhMHJwcXBxc3FzcnNwIAal1eiygoKCiLXl1qal1eiygoKCiLXl1qVkxMcSAhISBxTExWVkxMcSAhISBxTExKoKBgoKBgoKBgoKADwCgoi15dampdXosoKCgoi15dampdXosoKPxgISBxTExWVkxMcSAhISBxTExWVkxMcSAhAqCgoGCgoGCgoGCgoAACAAD/wAQAA8AADwAVAAABISIGFREUFjMhMjY1ETQmASc3FwEXA4D9ADVLSzUDADVLS/4L7VqTATNaA8BLNf0ANUtLNQMANUv85e5akgEyWgAAAAABAGX/wAObA8AAKQAAASImIyIHDgEHBhUUFjMuATU0NjcwBwYCBwYHFSETMzcjNx4BMzI2Nw4BAyBEaEZxU1RtGhtJSAYNZUoQEEs8PFkBPWzGLNc0LVUmLlAYHT0DsBAeHWE+P0FNOwsmN5lvA31+/sWPkCMZAgCA9gkPN2sJBwAAAAACAAAAAAQAA4AACQAXAAAlMwcnMxEjNxcjJREnIxEzFSE1MxEjBxEDgICgoICAoKCA/wBAwID+gIDAQMDAwAIAwMDA/wCA/UBAQALAgAEAAAMAwAAAA0ADgAAWAB8AKAAAAT4BNTQnLgEnJiMhESEyNz4BNzY1NCYBMzIWFRQGKwETIxEzMhYVFAYCxBwgFBRGLi81/sABgDUvLkYUFET+hGUqPDwpZp+fnyw+PgHbIlQvNS8uRhQU/IAUFEYuLzVGdAFGSzU1S/6AAQBLNTVLAAAAAAIAwAAAA0ADgAAfACMAAAEzERQHDgEHBiMiJy4BJyY1ETMRFBYXHgEzMjY3PgE1ASEVIQLAgBkZVzo7QkI7OlcZGYAbGBxJKChJHBgb/gACgP2AA4D+YDw0NU4WFxcWTjU0PAGg/mAeOBcYGxsYFzge/qCAAAAAAAEAgAAAA4ADgAALAAABFSMBMxUhNTMBIzUDgID+wID+QIABQIADgED9AEBAAwBAAAEAAAAABAADgAA9AAABFSMeARUUBgcOASMiJicuATUzFBYzMjY1NCYjITUhLgEnLgE1NDY3PgEzMhYXHgEVIzQmIyIGFRQWMzIWFwQA6xUWNTAscT4+cSwwNYByTk5yck7+AAEsAgQBMDU1MCxxPj5xLDA1gHJOTnJyTjtuKwHAQB1BIjViJCEkJCEkYjU0TEw0NExAAQMBJGI1NWIkISQkISRiNTRMTDQ0TCEfAAAACgAAAAAEAAOAAAMABwALAA8AEwAXABsAHwAjACcAABMRIREBNSEVHQEhNQEVITUjFSE1ESEVISUhFSERNSEVASEVISE1IRUABAD9gAEA/wABAP8AQP8AAQD/AAKAAQD/AAEA/IABAP8AAoABAAOA/IADgP3AwMBAwMACAMDAwMD/AMDAwAEAwMD+wMDAwAAABQAAAAAEAAOAAAMABwALAA8AEwAAEyEVIRUhFSERIRUhESEVIREhFSEABAD8AAKA/YACgP2ABAD8AAQA/AADgIBAgP8AgAFAgP8AgAAAAAAFAAAAAAQAA4AAAwAHAAsADwATAAATIRUhFyEVIREhFSEDIRUhESEVIQAEAPwAwAKA/YACgP2AwAQA/AAEAPwAA4CAQID/AIABQID/AIAAAAUAAAAABAADgAADAAcACwAPABMAABMhFSEFIRUhESEVIQEhFSERIRUhAAQA/AABgAKA/YACgP2A/oAEAPwABAD8AAOAgECA/wCAAUCA/wCAAAAAAAUAAAAABAADgAADAAcACwAPABMAABMhFSEVIRUhFSEVIRUhFSEVIRUhAAQA/AAEAPwABAD8AAQA/AAEAPwAA4CAQIBAgECAQIAAAAAGAAAAAAQAA4AAAwAHAAsADwATABYAABMhFSEFIRUhFSEVIRUhFSEFIRUhGQEFAAQA/AABgAKA/YACgP2AAoD9gP6ABAD8AAEAA4CAQIBAgECAQIABAAGAwAAAAAYAAAAABAADgAADAAcACwAPABMAFgAAEyEVIQUhFSEVIRUhFSEVIQUhFSEBESUABAD8AAGAAoD9gAKA/YACgP2A/oAEAPwAAQD/AAOAgECAQIBAgECAAoD+gMAAAQA/AD8C5gLmACwAACUUDwEGIyIvAQcGIyIvASY1ND8BJyY1ND8BNjMyHwE3NjMyHwEWFRQPARcWFQLmEE4QFxcQqKgQFxYQThAQqKgQEE4QFhcQqKgQFxcQThAQqKgQwxYQThAQqKgQEE4QFhcQqKgQFxcQThAQqKgQEE4QFxcQqKgQFwAAAAYAAAAAAyUDbgAUACgAPABNAFUAggAAAREUBwYrASInJjURNDc2OwEyFxYVMxEUBwYrASInJjURNDc2OwEyFxYXERQHBisBIicmNRE0NzY7ATIXFhMRIREUFxYXFjMhMjc2NzY1ASEnJicjBgcFFRQHBisBERQHBiMhIicmNREjIicmPQE0NzY7ATc2NzY7ATIXFh8BMzIXFhUBJQYFCCQIBQYGBQgkCAUGkgUFCCUIBQUFBQglCAUFkgUFCCUIBQUFBQglCAUFSf4ABAQFBAIB2wIEBAQE/oABABsEBrUGBAH3BgUINxobJv4lJhsbNwgFBQUFCLEoCBcWF7cXFhYJKLAIBQYCEv63CAUFBQUIAUkIBQYGBQj+twgFBQUFCAFJCAUGBgUI/rcIBQUFBQgBSQgFBgYF/lsCHf3jDQsKBQUFBQoLDQJmQwUCAgVVJAgGBf3jMCIjISIvAiAFBggkCAUFYBUPDw8PFWAFBQgAAgAHAEkDtwKvABoALgAACQEGIyIvASY1ND8BJyY1ND8BNjMyFwEWFRQHARUUBwYjISInJj0BNDc2MyEyFxYBTv72BgcIBR0GBuHhBgYdBQgHBgEKBgYCaQUFCP3bCAUFBQUIAiUIBQUBhf72BgYcBggHBuDhBgcHBh0FBf71BQgHBv77JQgFBQUFCCUIBQUFBQAAAAEAIwAAA90DbgCzAAAlIicmIyIHBiMiJyY1NDc2NzY3Njc2PQE0JyYjISIHBh0BFBcWFxYzFhcWFRQHBiMiJyYjIgcGIyInJjU0NzY3Njc2NzY9ARE0NTQ1NCc0JyYnJicmJyYnJiMiJyY1NDc2MzIXFjMyNzYzMhcWFRQHBiMGBwYHBh0BFBcWMyEyNzY9ATQnJicmJyY1NDc2MzIXFjMyNzYzMhcWFRQHBgciBwYHBhURFBcWFxYXMhcWFRQHBiMDwRkzMhoZMjMZDQgHCQoNDBEQChIBBxX+fhYHARUJEhMODgwLBwcOGzU1GhgxMRgNBwcJCQsMEA8JEgECAQIDBAQFCBIRDQ0KCwcHDho1NRoYMDEYDgcHCQoMDRAQCBQBBw8BkA4HARQKFxcPDgcHDhkzMhkZMTEZDgcHCgoNDRARCBQUCRERDg0KCwcHDgACAgICDAsPEQkJAQEDAwUMROAMBQMDBQzUUQ0GAQIBCAgSDwwNAgICAgwMDhEICQECAwMFDUUhAdACDQ0ICA4OCgoLCwcHAwYBAQgIEg8MDQICAgINDA8RCAgBAgEGDFC2DAcBAQcMtlAMBgEBBgcWDwwNAgICAg0MDxEICAEBAgYNT/3mRAwGAgIBCQgRDwwNAAACAAD/twP/A7cAEwA5AAABMhcWFRQHAgcGIyInJjU0NwE2MwEWFxYfARYHBiMiJyYnJicmNRYXFhcWFxYzMjc2NzY3Njc2NzY3A5soHh4avkw3RUg0NDUBbSEp/fgXJicvAQJMTHtHNjYhIRARBBMUEBASEQkXCA8SExUVHR0eHikDtxsaKCQz/plGNDU0SUkwAUsf/bErHx8NKHpNTBobLi86OkQDDw4LCwoKFiUbGhERCgsEBAIAAQAAAAAAAIWwaoFfDzz1AAsEAAAAAADbteOZAAAAANu145kAAP+3BWADwAAAAAgAAgAAAAAAAAABAAADwP/AAAAFgAAA//8FYAABAAAAAAAAAAAAAAAAAAAAKQQAAAAAAAAAAAAAAAIAAAAEAABBBAAAQQQAAAAEAAAABAAAAAQAAAAEAADABAAAAAQAAAAEAAAABAAAQAQAAAAFgAAABAAAAAQAAB4EAAAABAAAAAQAAAAEAAAABAAAZQQAAAAEAADABAAAwAQAAIAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAMlAD8DJQAAA74ABwQAACMD/wAAAAAAAAAKABQAHgBKAHYApADmAS4BkgHQAhYCXALQAw4DWAN+A6gEPgTeBPoFZAWOBdAF+AY6BnYGjgbmBy4HVgd+B6gHzgf8CCoIbgkmCXAKYgq+AAEAAAApALQACgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAHAAAAAQAAAAAAAgAHAGAAAQAAAAAAAwAHADYAAQAAAAAABAAHAHUAAQAAAAAABQALABUAAQAAAAAABgAHAEsAAQAAAAAACgAaAIoAAwABBAkAAQAOAAcAAwABBAkAAgAOAGcAAwABBAkAAwAOAD0AAwABBAkABAAOAHwAAwABBAkABQAWACAAAwABBAkABgAOAFIAAwABBAkACgA0AKRpY29tb29uAGkAYwBvAG0AbwBvAG5WZXJzaW9uIDEuMABWAGUAcgBzAGkAbwBuACAAMQAuADBpY29tb29uAGkAYwBvAG0AbwBvAG5pY29tb29uAGkAYwBvAG0AbwBvAG5SZWd1bGFyAFIAZQBnAHUAbABhAHJpY29tb29uAGkAYwBvAG0AbwBvAG5Gb250IGdlbmVyYXRlZCBieSBJY29Nb29uLgBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"},function(e,t,n){var o=n(20),i=n(153);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);n={insert:"head",singleton:!1},o(i,n);e.exports=i.locals||{}},function(e,t,n){(t=n(21)(!1)).push([e.i,'.w-e-toolbar {\n display: flex;\n padding: 0 6px;\n flex-wrap: wrap;\n position: relative;\n /* 单个菜单 */\n}\n.w-e-toolbar .w-e-menu {\n position: relative;\n display: flex;\n width: 40px;\n height: 40px;\n align-items: center;\n justify-content: center;\n text-align: center;\n cursor: pointer;\n}\n.w-e-toolbar .w-e-menu i {\n color: #999;\n}\n.w-e-toolbar .w-e-menu:hover {\n background-color: #F6F6F6;\n}\n.w-e-toolbar .w-e-menu:hover i {\n color: #333;\n}\n.w-e-toolbar .w-e-active i {\n color: #1e88e5;\n}\n.w-e-toolbar .w-e-active:hover i {\n color: #1e88e5;\n}\n.w-e-menu-tooltip {\n position: absolute;\n display: flex;\n color: #f1f1f1;\n background-color: rgba(0, 0, 0, 0.75);\n box-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n padding: 4px 5px 6px;\n justify-content: center;\n align-items: center;\n}\n.w-e-menu-tooltip-up::after {\n content: "";\n position: absolute;\n top: 100%;\n left: 50%;\n margin-left: -5px;\n border: 5px solid rgba(0, 0, 0, 0);\n border-top-color: rgba(0, 0, 0, 0.73);\n}\n.w-e-menu-tooltip-down::after {\n content: "";\n position: absolute;\n bottom: 100%;\n left: 50%;\n margin-left: -5px;\n border: 5px solid rgba(0, 0, 0, 0);\n border-bottom-color: rgba(0, 0, 0, 0.73);\n}\n.w-e-menu-tooltip-item-wrapper {\n font-size: 14px;\n margin: 0 5px;\n}\n',""]),e.exports=t},function(e,t,n){var o=n(20),i=n(155);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);n={insert:"head",singleton:!1},o(i,n);e.exports=i.locals||{}},function(e,t,n){(t=n(21)(!1)).push([e.i,'.w-e-text-container {\n position: relative;\n height: 100%;\n}\n.w-e-text-container .w-e-progress {\n position: absolute;\n background-color: #1e88e5;\n top: 0;\n left: 0;\n height: 1px;\n}\n.w-e-text-container .placeholder {\n color: #D4D4D4;\n position: absolute;\n font-size: 11pt;\n line-height: 22px;\n left: 10px;\n top: 10px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n z-index: -1;\n}\n.w-e-text {\n padding: 0 10px;\n overflow-y: auto;\n}\n.w-e-text p,\n.w-e-text h1,\n.w-e-text h2,\n.w-e-text h3,\n.w-e-text h4,\n.w-e-text h5,\n.w-e-text table,\n.w-e-text pre {\n margin: 10px 0;\n line-height: 1.5;\n}\n.w-e-text ul,\n.w-e-text ol {\n margin: 10px 0 10px 20px;\n}\n.w-e-text blockquote {\n display: block;\n border-left: 8px solid #d0e5f2;\n padding: 5px 10px;\n margin: 10px 0;\n line-height: 1.4;\n font-size: 100%;\n background-color: #f1f1f1;\n}\n.w-e-text code {\n display: inline-block;\n background-color: #f1f1f1;\n border-radius: 3px;\n padding: 3px 5px;\n margin: 0 3px;\n}\n.w-e-text pre code {\n display: block;\n}\n.w-e-text table {\n border-top: 1px solid #ccc;\n border-left: 1px solid #ccc;\n}\n.w-e-text table td,\n.w-e-text table th {\n border-bottom: 1px solid #ccc;\n border-right: 1px solid #ccc;\n padding: 3px 5px;\n min-height: 30px;\n height: 30px;\n}\n.w-e-text table th {\n border-bottom: 2px solid #ccc;\n text-align: center;\n background-color: #f1f1f1;\n}\n.w-e-text:focus {\n outline: none;\n}\n.w-e-text img {\n cursor: pointer;\n}\n.w-e-text img:hover {\n box-shadow: 0 0 5px #333;\n}\n.w-e-text .w-e-todo {\n margin: 0 0 0 20px;\n}\n.w-e-text .w-e-todo li {\n list-style: none;\n font-size: 1em;\n}\n.w-e-text .w-e-todo li span:nth-child(1) {\n position: relative;\n left: -18px;\n}\n.w-e-text .w-e-todo li span:nth-child(1) input {\n position: absolute;\n margin-right: 3px;\n}\n.w-e-text .w-e-todo li span:nth-child(1) input[type=checkbox] {\n top: 50%;\n margin-top: -6px;\n}\n.w-e-tooltip {\n position: absolute;\n display: flex;\n color: #f1f1f1;\n background-color: rgba(0, 0, 0, 0.75);\n box-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n padding: 4px 5px 6px;\n justify-content: center;\n align-items: center;\n}\n.w-e-tooltip-up::after {\n content: "";\n position: absolute;\n top: 100%;\n left: 50%;\n margin-left: -5px;\n border: 5px solid rgba(0, 0, 0, 0);\n border-top-color: rgba(0, 0, 0, 0.73);\n}\n.w-e-tooltip-down::after {\n content: "";\n position: absolute;\n bottom: 100%;\n left: 50%;\n margin-left: -5px;\n border: 5px solid rgba(0, 0, 0, 0);\n border-bottom-color: rgba(0, 0, 0, 0.73);\n}\n.w-e-tooltip-item-wrapper {\n cursor: pointer;\n font-size: 14px;\n margin: 0 5px;\n}\n.w-e-tooltip-item-wrapper:hover {\n color: #ccc;\n text-decoration: underline;\n}\n',""]),e.exports=t},function(e,t,n){var o=n(20),i=n(157);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);n={insert:"head",singleton:!1},o(i,n);e.exports=i.locals||{}},function(e,t,n){(t=n(21)(!1)).push([e.i,'.w-e-menu .w-e-panel-container {\n position: absolute;\n top: 0;\n left: 50%;\n border: 1px solid #ccc;\n border-top: 0;\n box-shadow: 1px 1px 2px #ccc;\n color: #333;\n background-color: #fff;\n text-align: left;\n /* 为 emotion panel 定制的样式 */\n /* 上传图片、上传视频的 panel 定制样式 */\n}\n.w-e-menu .w-e-panel-container .w-e-panel-close {\n position: absolute;\n right: 0;\n top: 0;\n padding: 5px;\n margin: 2px 5px 0 0;\n cursor: pointer;\n color: #999;\n}\n.w-e-menu .w-e-panel-container .w-e-panel-close:hover {\n color: #333;\n}\n.w-e-menu .w-e-panel-container .w-e-panel-tab-title {\n list-style: none;\n display: flex;\n font-size: 14px;\n margin: 2px 10px 0 10px;\n border-bottom: 1px solid #f1f1f1;\n}\n.w-e-menu .w-e-panel-container .w-e-panel-tab-title .w-e-item {\n padding: 3px 5px;\n color: #999;\n cursor: pointer;\n margin: 0 3px;\n position: relative;\n top: 1px;\n}\n.w-e-menu .w-e-panel-container .w-e-panel-tab-title .w-e-active {\n color: #333;\n border-bottom: 1px solid #333;\n cursor: default;\n font-weight: 700;\n}\n.w-e-menu .w-e-panel-container .w-e-panel-tab-content {\n padding: 10px 15px 10px 15px;\n font-size: 16px;\n /* 输入框的样式 */\n /* 按钮的样式 */\n}\n.w-e-menu .w-e-panel-container .w-e-panel-tab-content input:focus,\n.w-e-menu .w-e-panel-container .w-e-panel-tab-content textarea:focus,\n.w-e-menu .w-e-panel-container .w-e-panel-tab-content button:focus {\n outline: none;\n}\n.w-e-menu .w-e-panel-container .w-e-panel-tab-content textarea {\n width: 100%;\n border: 1px solid #ccc;\n padding: 5px;\n margin-top: 10px;\n}\n.w-e-menu .w-e-panel-container .w-e-panel-tab-content textarea:focus {\n border-color: #1e88e5;\n}\n.w-e-menu .w-e-panel-container .w-e-panel-tab-content input[type=text] {\n border: none;\n border-bottom: 1px solid #ccc;\n font-size: 14px;\n height: 20px;\n color: #333;\n text-align: left;\n}\n.w-e-menu .w-e-panel-container .w-e-panel-tab-content input[type=text].small {\n width: 30px;\n text-align: center;\n}\n.w-e-menu .w-e-panel-container .w-e-panel-tab-content input[type=text].block {\n display: block;\n width: 100%;\n margin: 10px 0;\n}\n.w-e-menu .w-e-panel-container .w-e-panel-tab-content input[type=text]:focus {\n border-bottom: 2px solid #1e88e5;\n}\n.w-e-menu .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button {\n font-size: 14px;\n color: #1e88e5;\n border: none;\n padding: 5px 10px;\n background-color: #fff;\n cursor: pointer;\n border-radius: 3px;\n}\n.w-e-menu .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.left {\n float: left;\n margin-right: 10px;\n}\n.w-e-menu .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.right {\n float: right;\n margin-left: 10px;\n}\n.w-e-menu .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.gray {\n color: #999;\n}\n.w-e-menu .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.red {\n color: #c24f4a;\n}\n.w-e-menu .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button:hover {\n background-color: #f1f1f1;\n}\n.w-e-menu .w-e-panel-container .w-e-panel-tab-content .w-e-button-container:after {\n content: "";\n display: table;\n clear: both;\n}\n.w-e-menu .w-e-panel-container .w-e-emoticon-container .w-e-item {\n cursor: pointer;\n font-size: 18px;\n padding: 0 3px;\n display: inline-block;\n}\n.w-e-menu .w-e-panel-container .w-e-up-img-container,\n.w-e-menu .w-e-panel-container .w-e-up-video-container {\n text-align: center;\n}\n.w-e-menu .w-e-panel-container .w-e-up-img-container .w-e-up-btn,\n.w-e-menu .w-e-panel-container .w-e-up-video-container .w-e-up-btn {\n display: inline-block;\n color: #999;\n cursor: pointer;\n font-size: 60px;\n line-height: 1;\n}\n.w-e-menu .w-e-panel-container .w-e-up-img-container .w-e-up-btn:hover,\n.w-e-menu .w-e-panel-container .w-e-up-video-container .w-e-up-btn:hover {\n color: #333;\n}\n',""]),e.exports=t},function(e,t,n){var o=n(20),i=n(159);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);n={insert:"head",singleton:!1},o(i,n);e.exports=i.locals||{}},function(e,t,n){(t=n(21)(!1)).push([e.i,".w-e-toolbar .w-e-droplist {\n position: absolute;\n left: 0;\n top: 0;\n background-color: #fff;\n border: 1px solid #f1f1f1;\n border-right-color: #ccc;\n border-bottom-color: #ccc;\n}\n.w-e-toolbar .w-e-droplist .w-e-dp-title {\n text-align: center;\n color: #999;\n line-height: 2;\n border-bottom: 1px solid #f1f1f1;\n font-size: 13px;\n}\n.w-e-toolbar .w-e-droplist ul.w-e-list {\n list-style: none;\n line-height: 1;\n}\n.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item {\n color: #333;\n padding: 5px 0;\n}\n.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item:hover {\n background-color: #f1f1f1;\n}\n.w-e-toolbar .w-e-droplist ul.w-e-block {\n list-style: none;\n text-align: left;\n padding: 5px;\n}\n.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item {\n display: inline-block;\n padding: 3px 5px;\n}\n.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item:hover {\n background-color: #f1f1f1;\n}\n",""]),e.exports=t},function(e,t,n){"use strict";n=n(0)(n(161));Element.prototype.matches||(Element.prototype.matches=function(e){for(var t=this.ownerDocument.querySelectorAll(e),n=t.length;0<=n&&t.item(n)!==this;n--);return-1=t.length?{value:e.target=void 0,done:!0}:"keys"==n?{value:o,done:!1}:"values"==n?{value:t[o],done:!1}:{value:[o,t[o]],done:!1}},"values"),r.Arguments=r.Array,i("keys"),i("values"),i("entries")},function(e,t){e.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},function(e,t,n){"use strict";function A(e){var t;return!(!x(e)||"function"!=typeof(t=e.then))&&t}function r(f,d,p){var h;d.notified||(d.notified=!0,h=d.reactions,N(function(){for(var e=d.value,t=1==d.state,n=0;h.length>n;){var o,i,r,a=h[n++],l=t?a.ok:a.fail,u=a.resolve,s=a.reject,c=a.domain;try{l?(t||(2===d.rejection&&ne(f,d),d.rejection=1),!0===l?o=e:(c&&c.enter(),o=l(e),c&&(c.exit(),r=!0)),o===a.promise?s($("Promise-chain cycle")):(i=A(o))?i.call(o,u,s):u(o)):s(e)}catch(e){c&&!r&&c.exit(),s(e)}}d.reactions=[],d.notified=!1,p&&!d.rejection&&ee(f,d)}))}function a(e,t,n){var o;X?((o=V.createEvent("Event")).promise=t,o.reason=n,o.initEvent(e,!1,!0),p.dispatchEvent(o)):o={promise:t,reason:n},(t=p["on"+e])?t(o):e===Z&&B("Unhandled promise rejection",n)}function l(t,n,o,i){return function(e){t(n,o,e,i)}}function u(e,t,n,o){t.done||(t.done=!0,o&&(t=o),t.value=n,t.state=2,r(e,t,!0))}var o,i,s,c,f=n(5),d=n(43),p=n(8),h=n(36),v=n(109),m=n(53),g=n(110),y=n(37),w=n(111),x=n(13),_=n(41),E=n(83),b=n(34),C=n(102),S=n(66),M=n(115),D=n(116),k=n(117).set,N=n(176),T=n(119),B=n(177),I=n(85),R=n(120),P=n(42),H=n(101),F=n(10),L=n(86),Q=F("species"),O="Promise",U=P.get,j=P.set,Y=P.getterFor(O),z=v,$=p.TypeError,V=p.document,G=p.process,J=h("fetch"),K=I.f,W=K,q="process"==b(G),X=!!(V&&V.createEvent&&p.dispatchEvent),Z="unhandledrejection",H=H(O,function(){if(!(C(z)!==String(z))){if(66===L)return!0;if(!q&&"function"!=typeof PromiseRejectionEvent)return!0}if(d&&!z.prototype.finally)return!0;if(51<=L&&/native code/.test(z))return!1;function e(e){e(function(){},function(){})}var t=z.resolve(1);return(t.constructor={})[Q]=e,!(t.then(function(){})instanceof e)}),M=H||!M(function(e){z.all(e).catch(function(){})}),ee=function(o,i){k.call(p,function(){var e,t=i.value,n=te(i);if(n&&(e=R(function(){q?G.emit("unhandledRejection",t,o):a(Z,o,t)}),i.rejection=q||te(i)?2:1,e.error))throw e.value})},te=function(e){return 1!==e.rejection&&!e.parent},ne=function(e,t){k.call(p,function(){q?G.emit("rejectionHandled",e):a("rejectionhandled",e,t.value)})},oe=function(n,o,e,t){if(!o.done){o.done=!0,t&&(o=t);try{if(n===e)throw $("Promise can't be resolved itself");var i=A(e);i?N(function(){var t={done:!1};try{i.call(e,l(oe,n,t,o),l(u,n,t,o))}catch(e){u(n,t,e,o)}}):(o.value=e,o.state=1,r(n,o,!1))}catch(e){u(n,{done:!1},e,o)}}};H&&(z=function(e){E(this,z,O),_(e),o.call(this);var t=U(this);try{e(l(oe,this,t),l(u,this,t))}catch(e){u(this,t,e)}},(o=function(){j(this,{type:O,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=g(z.prototype,{then:function(e,t){var n=Y(this),o=K(D(this,z));return o.ok="function"!=typeof e||e,o.fail="function"==typeof t&&t,o.domain=q?G.domain:void 0,n.parent=!0,n.reactions.push(o),0!=n.state&&r(this,n,!1),o.promise},catch:function(e){return this.then(void 0,e)}}),i=function(){var e=new o,t=U(e);this.promise=e,this.resolve=l(oe,e,t),this.reject=l(u,e,t)},I.f=K=function(e){return e===z||e===s?new i:W(e)},d||"function"!=typeof v||(c=v.prototype.then,m(v.prototype,"then",function(e,t){var n=this;return new z(function(e,t){c.call(n,e,t)}).then(e,t)},{unsafe:!0}),"function"==typeof J&&f({global:!0,enumerable:!0,forced:!0},{fetch:function(){return T(z,J.apply(p,arguments))}}))),f({global:!0,wrap:!0,forced:H},{Promise:z}),y(z,O,!1,!0),w(O),s=h(O),f({target:O,stat:!0,forced:H},{reject:function(e){var t=K(this);return t.reject.call(void 0,e),t.promise}}),f({target:O,stat:!0,forced:d||H},{resolve:function(e){return T(d&&this===s?z:this,e)}}),f({target:O,stat:!0,forced:M},{all:function(e){var l=this,t=K(l),u=t.resolve,s=t.reject,n=R(function(){var o=_(l.resolve),i=[],r=0,a=1;S(e,function(e){var t=r++,n=!1;i.push(void 0),a++,o.call(l,e).then(function(e){n||(n=!0,i[t]=e,--a||u(i))},s)}),--a||u(i)});return n.error&&s(n.value),t.promise},race:function(e){var n=this,o=K(n),i=o.reject,t=R(function(){var t=_(n.resolve);S(e,function(e){t.call(n,e).then(o.resolve,i)})});return t.error&&i(t.value),o.promise}})},function(e,t,n){var o,i,r,a,l,u,s,c,f=n(8),d=n(71).f,p=n(34),h=n(117).set,A=n(118),v=f.MutationObserver||f.WebKitMutationObserver,m=f.process,n=f.Promise,g="process"==p(m),d=d(f,"queueMicrotask"),d=d&&d.value;d||(o=function(){var e,t;for(g&&(e=m.domain)&&e.exit();i;){t=i.fn,i=i.next;try{t()}catch(e){throw i?a():r=void 0,e}}r=void 0,e&&e.enter()},a=g?function(){m.nextTick(o)}:v&&!A?(l=!0,u=document.createTextNode(""),new v(o).observe(u,{characterData:!0}),function(){u.data=l=!l}):n&&n.resolve?(s=n.resolve(void 0),c=s.then,function(){c.call(s,o)}):function(){h.call(f,o)}),e.exports=d||function(e){e={fn:e,next:void 0};r&&(r.next=e),i||(i=e,a()),r=e}},function(e,t,n){var o=n(8);e.exports=function(e,t){var n=o.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}},function(e,t,n){"use strict";var o=n(5),s=n(41),i=n(85),r=n(120),c=n(66);o({target:"Promise",stat:!0},{allSettled:function(e){var l=this,t=i.f(l),u=t.resolve,n=t.reject,o=r(function(){var o=s(l.resolve),i=[],r=0,a=1;c(e,function(e){var t=r++,n=!1;i.push(void 0),a++,o.call(l,e).then(function(e){n||(n=!0,i[t]={status:"fulfilled",value:e},--a||u(i))},function(e){n||(n=!0,i[t]={status:"rejected",reason:e},--a||u(i))})}),--a||u(i)});return o.error&&n(o.value),t.promise}})},function(e,t,n){"use strict";var o=n(5),i=n(43),r=n(109),a=n(11),l=n(36),u=n(116),s=n(119),n=n(53);o({target:"Promise",proto:!0,real:!0,forced:!!r&&a(function(){r.prototype.finally.call({then:function(){}},function(){})})},{finally:function(t){var n=u(this,l("Promise")),e="function"==typeof t;return this.then(e?function(e){return s(n,t()).then(function(){return e})}:t,e?function(e){return s(n,t()).then(function(){throw e})}:t)}}),i||"function"!=typeof r||r.prototype.finally||n(r.prototype,"finally",l("Promise").prototype.finally)},function(e,t,n){n(54);var o=n(181),i=n(65),r=Array.prototype,a={DOMTokenList:!0,NodeList:!0};e.exports=function(e){var t=e.forEach;return e===r||e instanceof Array&&t===r.forEach||a.hasOwnProperty(i(e))?o:t}},function(e,t,n){n=n(182);e.exports=n},function(e,t,n){n(183);n=n(15);e.exports=n("Array").forEach},function(e,t,n){"use strict";var o=n(5),n=n(184);o({target:"Array",proto:!0,forced:[].forEach!=n},{forEach:n})},function(e,t,n){"use strict";var o=n(32).forEach,i=n(67),n=n(22),i=i("forEach"),n=n("forEach");e.exports=i&&n?[].forEach:function(e,t){return o(this,e,1>>0||(a.test(e)?16:10))}:r},function(e,t,n){n=n(262);e.exports=n},function(e,t,n){var o=n(263),i=Array.prototype;e.exports=function(e){var t=e.slice;return e===i||e instanceof Array&&t===i.slice?o:t}},function(e,t,n){n(264);n=n(15);e.exports=n("Array").slice},function(e,t,n){"use strict";var o=n(5),s=n(13),c=n(55),f=n(79),d=n(35),p=n(30),h=n(69),i=n(10),r=n(56),n=n(22),r=r("slice"),n=n("slice",{ACCESSORS:!0,0:0,1:2}),A=i("species"),v=[].slice,m=Math.max;o({target:"Array",proto:!0,forced:!r||!n},{slice:function(e,t){var n,o,i,r=p(this),a=d(r.length),l=f(e,a),u=f(void 0===t?a:t,a);if(c(r)&&(("function"==typeof(n=r.constructor)&&(n===Array||c(n.prototype))||s(n)&&null===(n=n[A]))&&(n=void 0),n===Array||void 0===n))return v.call(r,l,u);for(o=new(void 0===n?Array:n)(m(u-l,0)),i=0;l​"),t.cmd.do("insertElem",e),this.createRangeByElem(e,!0))}catch(e){}},s.prototype.createRangeByElems=function(e,t){var n=(window.getSelection?window:document).getSelection();null!=n&&n.removeAllRanges();n=document.createRange();n.setStart(e,0),n.setEnd(t,t.childNodes.length||1),this.saveRange(n),this.restoreSelection()},s.prototype.createRangeByElem=function(e,t,n){var o;e.length&&(o=e.elems[0],e=document.createRange(),n?e.selectNodeContents(o):e.selectNode(o),null!=t&&(e.collapse(t),t||(this.saveRange(e),this.editor.selection.moveCursor(o))),this.saveRange(e))},s.prototype.getSelectionRangeTopNodes=function(){var e=null===(t=this.getSelectionStartElem())||void 0===t?void 0:t.getNodeTop(this.editor),t=null===(t=this.getSelectionEndElem())||void 0===t?void 0:t.getNodeTop(this.editor);return this.recordSelectionNodes(l.default(e),l.default(t))},s.prototype.moveCursor=function(e,t){var n=this.getRange(),o=3===e.nodeType?null===(o=e.nodeValue)||void 0===o?void 0:o.length:e.childNodes.length;(a.UA.isFirefox||a.UA.isIE())&&0!==o&&(3!==e.nodeType&&"BR"!==e.childNodes[o-1].nodeName||--o);o=null!=t?t:o;n&&e&&(n.setStart(e,o),n.setEnd(e,o),this.restoreSelection())},s.prototype.getCursorPos=function(){var e=window.getSelection();return null==e?void 0:e.anchorOffset},s.prototype.clearWindowSelectionRange=function(){var e=window.getSelection();e&&e.removeAllRanges()},s.prototype.recordSelectionNodes=function(e,t){var n=[],o=!0;try{for(var i=e,r=this.editor.$textElem;o;){var a=null==i?void 0:i.getNodeTop(this.editor);"BODY"===a.getNodeName()&&(o=!1),0<\/p>/gim,"")).replace(A.EMPTY_P_LAST_REGEX,"")).replace(A.EMPTY_P_REGEX,"

                                                          ")).match(/<(img|br|hr|input)[^>]*>/gi);return null!==i&&(0,a.default)(i).call(i,function(e){e.match(/\/>/)||(o=o.replace(e,e.substring(0,e.length-1)+"/>"))}),o}""===(e=(0,l.default)(e).call(e))&&(e=A.EMPTY_P),0!==(0,u.default)(e).call(e,"<")&&(e="

                                                          "+e+"

                                                          "),n.html(e),t.initSelection()},v.prototype.setJSON=function(e){var t=h.default(e).children(),e=this.editor.$textElem;t&&e.replaceChildAll(t)},v.prototype.getJSON=function(){var e=this.editor.$textElem;return p.default(e)},v.prototype.text=function(e){var t=this.editor,n=t.$textElem;if(null==e)return n.text().replace(/\u200b/gm,"");n.text("

                                                          "+e+"

                                                          "),t.initSelection()},v.prototype.append=function(e){var t=this.editor;0!==(0,u.default)(e).call(e,"<")&&(e="

                                                          "+e+"

                                                          "),this.html(this.html()+e),t.initSelection()},v.prototype._saveRange=function(){var t=this.editor,n=t.$textElem,e=c.default(document);function o(){t.selection.saveRange(),t.menus.changeActive()}function i(){o(),e.off("mouseup",i)}function r(){e.on("mouseup",i),n.off("mouseleave",r)}n.on("keyup",o),n.on("click",function e(){o(),n.off("click",e)}),n.on("mousedown",function(){n.on("mouseleave",r)}),n.on("mouseup",function(e){n.off("mouseleave",r),(0,s.default)(function(){null!==t.selection.getRange()&&o()},0)})},v.prototype._bindEventHooks=function(){var o=this.editor,e=o.$textElem,i=this.eventHooks;function t(e){e.preventDefault()}e.on("click",function(t){var e=i.clickEvents;(0,a.default)(e).call(e,function(e){return e(t)})}),e.on("keyup",function(t){var e;13===t.keyCode&&(e=i.enterUpEvents,(0,a.default)(e).call(e,function(e){return e(t)}))}),e.on("keyup",function(t){var e=i.keyupEvents;(0,a.default)(e).call(e,function(e){return e(t)})}),e.on("keydown",function(t){var e=i.keydownEvents;(0,a.default)(e).call(e,function(e){return e(t)})}),e.on("keyup",function(t){var e;8!==t.keyCode&&46!==t.keyCode||(e=i.deleteUpEvents,(0,a.default)(e).call(e,function(e){return e(t)}))}),e.on("keydown",function(t){var e;8!==t.keyCode&&46!==t.keyCode||(e=i.deleteDownEvents,(0,a.default)(e).call(e,function(e){return e(t)}))}),e.on("paste",function(t){var e;d.UA.isIE()||(t.preventDefault(),e=i.pasteEvents,(0,a.default)(e).call(e,function(e){return e(t)}))}),e.on("keydown",function(e){(o.isFocus||o.isCompatibleMode)&&(e.ctrlKey||e.metaKey)&&90===e.keyCode&&(e.preventDefault(),e.shiftKey?o.history.restore():o.history.revoke())}),e.on("keyup",function(t){var e;9===t.keyCode&&(t.preventDefault(),e=i.tabUpEvents,(0,a.default)(e).call(e,function(e){return e(t)}))}),e.on("keydown",function(t){var e;9===t.keyCode&&(t.preventDefault(),e=i.tabDownEvents,(0,a.default)(e).call(e,function(e){return e(t)}))}),e.on("scroll",d.throttle(function(t){var e=i.textScrollEvents;(0,a.default)(e).call(e,function(e){return e(t)})},100)),c.default(document).on("dragleave",t).on("drop",t).on("dragenter",t).on("dragover",t),o.beforeDestroy(function(){c.default(document).off("dragleave",t).off("drop",t).off("dragenter",t).off("dragover",t)}),e.on("drop",function(t){t.preventDefault();var e=i.dropEvents;(0,a.default)(e).call(e,function(e){return e(t)})}),e.on("click",function(e){var t,n=null,e=e.target,e=c.default(e);"A"===e.getNodeName()?n=e:null!=(t=e.parentUntil("a"))&&(n=t),n&&(t=i.linkClickEvents,(0,a.default)(t).call(t,function(e){return e(n)}))}),e.on("click",function(e){var t=null,n=e.target,n=c.default(n);"IMG"!==n.getNodeName()||n.elems[0].getAttribute("data-emoji")||(e.stopPropagation(),t=n),t&&(n=i.imgClickEvents,(0,a.default)(n).call(n,function(e){return e(t)}))}),e.on("click",function(e){var t,n=null,e=e.target,e=c.default(e);"PRE"===e.getNodeName()?n=e:null!==(t=e.parentUntil("pre"))&&(n=t),n&&(t=i.codeClickEvents,(0,a.default)(t).call(t,function(e){return e(n)}))}),e.on("click",function(e){var t=null,e=e.target,e=c.default(e);"HR"===e.getNodeName()&&(t=e),t&&(o.selection.createRangeByElem(t),o.selection.restoreSelection(),e=i.splitLineEvents,(0,a.default)(e).call(e,function(e){return e(t)}))}),o.$toolbarElem.on("click",function(t){var e=i.toolbarClickEvents;(0,a.default)(e).call(e,function(e){return e(t)})}),o.$textContainerElem.on("mousedown",function(e){e=e.target;c.default(e).hasClass("w-e-img-drag-rb")&&(e=i.imgDragBarMouseDownEvents,(0,a.default)(e).call(e,function(e){return e()}))}),e.on("click",function(t){var n=null,e=t.target;(n=c.default(e).parentUntilEditor("TABLE",o,e))&&(e=i.tableClickEvents,(0,a.default)(e).call(e,function(e){return e(n,t)}))}),e.on("keydown",function(t){var e;13===t.keyCode&&(e=i.enterDownEvents,(0,a.default)(e).call(e,function(e){return e(t)}))}),e.on("click",function(e){var t=null,n=e.target,n=c.default(n);"VIDEO"===n.getNodeName()&&(e.stopPropagation(),t=n),t&&(n=i.videoClickEvents,(0,a.default)(n).call(n,function(e){return e(t)}))})},v);function v(e){this.editor=e,this.eventHooks={onBlurEvents:[],changeEvents:[],dropEvents:[],clickEvents:[],keydownEvents:[],keyupEvents:[],tabUpEvents:[],tabDownEvents:[],enterUpEvents:[],enterDownEvents:[],deleteUpEvents:[],deleteDownEvents:[],pasteEvents:[],linkClickEvents:[],codeClickEvents:[],textScrollEvents:[],toolbarClickEvents:[],imgClickEvents:[],imgDragBarMouseDownEvents:[],tableClickEvents:[],menuClickEvents:[],dropListMenuHoverEvents:[],splitLineEvents:[],videoClickEvents:[]}}t.default=n},function(e,t,n){n=n(284);e.exports=n},function(e,t,n){var o=n(285),i=Array.prototype;e.exports=function(e){var t=e.find;return e===i||e instanceof Array&&t===i.find?o:t}},function(e,t,n){n(286);n=n(15);e.exports=n("Array").find},function(e,t,n){"use strict";var o=n(5),i=n(32).find,r=n(82),a=n(22),n="find",l=!0,a=a(n);n in[]&&Array(1).find(function(){l=!1}),o({target:"Array",proto:!0,forced:l||!a},{find:function(e,t){return i(this,e,1
                                                          "!==n.html()&&("FONT"!==t.getNodeName()||""!==t.text()||"monospace"!==t.attr("face"))?n.equal(e)&&("P"===t.getNodeName()&&null===t.attr("data-we-empty-p")||t.text()||i(t)):i(n)}),t.push(function(e){var t;o.selection.saveRange(null===(t=getSelection())||void 0===t?void 0:t.getRangeAt(0)),o.selection.getSelectionContainerElem().id===o.textElemId&&(e.preventDefault(),o.cmd.do("insertHTML","


                                                          "))})}},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(17)),a=o(n(28));(0,i.default)(t,"__esModule",{value:!0}),t.cutToKeepP=void 0;var i=n(2),l=n(7),u=i.__importDefault(n(3));t.cutToKeepP=function(n,e){e.push(function(e){var t;88===e.keyCode&&(t=n.$textElem,(e=(0,r.default)(e=t.html().toLowerCase()).call(e))&&"
                                                          "!==e||(e=u.default(l.EMPTY_P),t.html(" "),t.append(e),n.selection.createRangeByElem(e,!1,!0),n.selection.restoreSelection(),n.selection.moveCursor(e.getNode(),0)))})},t.default=function(i,e,t){e.push(function(){var e=i.$textElem,t=i.$textElem.html(),n=i.$textElem.text(),o=(0,r.default)(t).call(t),t=["


                                                          ","
                                                          ",'

                                                          ',l.EMPTY_P];!/^\s*$/.test(n)||o&&!(0,a.default)(t).call(t,o)||(e.html(l.EMPTY_P),e=e.getNode(),i.selection.createRangeByElems(e.childNodes[0],e.childNodes[0]),e=i.selection.getSelectionContainerElem(),i.selection.restoreSelection(),i.selection.moveCursor(e.getNode(),0))}),t.push(function(e){var t=i.$textElem;(0,r.default)(t=t.html().toLowerCase()).call(t)===l.EMPTY_P&&e.preventDefault()})}},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0}),t.default=function(n,e){e.push(function(){var e,t;!n.cmd.queryCommandSupported("insertHTML")||(e=n.selection.getSelectionContainerElem())&&(t=e.parent(),e=e.getNodeName(),t=t.getNodeName(),"CODE"==e||"CODE"===t||"PRE"===t||/hljs/.test(t)?n.cmd.do("insertHTML",n.config.languageTab):n.cmd.do("insertHTML","    "))})}},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(17)),h=o(n(4));(0,i.default)(t,"__esModule",{value:!0});var A=n(131),v=n(6),m=n(7);function g(e){var e=(0,r.default)(t=e.replace(/
                                                          /gim,"

                                                          ").replace(/<\/div>/gim,"

                                                          ")).call(t),t=document.createElement("div");return t.innerHTML=e,t.innerHTML.replace(/

                                                          <\/p>/gim,"")}t.default=function(p,e){e.push(function(e){var t=p.config,n=t.pasteFilterStyle,o=t.pasteIgnoreImg,i=t.pasteTextHandle,r=A.getPasteHtml(e,n,o),a=(a=A.getPasteText(e)).replace(/\n/gm,"
                                                          "),l=p.selection.getSelectionContainerElem();if(l){var o=null==l?void 0:l.getNodeName(),u=null==l?void 0:l.getNodeTop(p),e="";if(u.elems[0]&&(e=null==u?void 0:u.getNodeName()),"CODE"===o||"PRE"===e)return i&&v.isFunction(i)&&(a=""+(i(a)||"")),void p.cmd.do("insertHTML",a.replace(/
                                                          |/gm,"\n").replace(/<[^>]+>/gm,""));if(m.urlRegex.test(a)&&n){i&&v.isFunction(i)&&(a=""+(i(a)||""));var o=a.replace(m.urlRegex,function(e){return''+e+""}),e=p.selection.getRange(),s=document.createElement("div"),c=document.createDocumentFragment();if(s.innerHTML=o,null==e)return;for(;s.childNodes.length;)c.append(s.childNodes[0]);o=c.querySelectorAll("a");return(0,h.default)(o).call(o,function(e){e.innerText=e.href}),e.insertNode&&(e.deleteContents(),e.insertNode(c)),void p.selection.clearWindowSelectionRange()}if(r)try{if(i&&v.isFunction(i)&&(r=""+(i(r)||"")),/[\.\#\@]?\w+[ ]+\{[^}]*\}/.test(r)&&n)p.cmd.do("insertHTML",""+g(a));else{var f=g(r);if(function(e){if(""!==e){var t=document.createElement("div");return t.innerHTML=e,"P"===(null===(t=t.firstChild)||void 0===t?void 0:t.nodeName)}}(f)){var d=p.$textElem;if(p.cmd.do("insertHTML",f),d.equal(l))return void p.selection.createEmptyRange();!function(e){if(null!=e&&e.length){e=e.elems[0];return"P"===e.nodeName&&"
                                                          "===e.innerHTML}}(u)||u.remove()}else p.cmd.do("insertHTML",f)}}catch(e){i&&v.isFunction(i)&&(a=""+(i(a)||"")),p.cmd.do("insertHTML",""+g(a))}}})}},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(17)),c=o(n(4)),f=o(n(28));(0,i.default)(t,"__esModule",{value:!0});var i=n(2),d=n(293),p=i.__importDefault(n(297));function h(e,t){var n;return e=(0,r.default)(n=e.toLowerCase()).call(n),d.IGNORE_TAGS.has(e)?1:!(!t||"img"!==e)}t.default=function(e,a,l){void 0===a&&(a=!0),void 0===l&&(l=!1);var u=[],t="";function s(e){(e=(0,r.default)(e).call(e))&&(d.EMPTY_TAGS.has(e)||(t=e))}(new p.default).parse(e,{startElement:function(e,t){var n,o,i,r;s(e),h(e,l)||(n=d.NECESSARY_ATTRS.get(e)||[],o=[],(0,c.default)(t).call(t,function(e){var t=e.name;"style"!==t?!1!==(0,f.default)(n).call(n,t)&&o.push(e):a||o.push(e)}),i=o,t="",t="<"+(e=e),r=[],(0,c.default)(i).call(i,function(e){r.push(e.name+'="'+e.value+'"')}),0",u.push(t))},characters:function(e){e&&(h(t,l)||u.push(e))},endElement:function(e){h(e,l)||(e="",u.push(e),t="")},comment:function(e){s(e)}});var n,e=u.join("");return n=/(.*?)<\/span>/,e=e.replace(/.*?<\/span>/gi,function(e){e=e.match(n);return null==e?"":e[1]})}},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(132)),n=o(n(121));(0,i.default)(t,"__esModule",{value:!0}),t.TOP_LEVEL_TAGS=t.EMPTY_TAGS=t.NECESSARY_ATTRS=t.IGNORE_TAGS=void 0,t.IGNORE_TAGS=new r.default(["doctype","!doctype","html","head","meta","body","script","style","link","frame","iframe","title","svg","center","o:p"]),t.NECESSARY_ATTRS=new n.default([["img",["src","alt"]],["a",["href","target"]],["td",["colspan","rowspan"]],["th",["colspan","rowspan"]]]),t.EMPTY_TAGS=new r.default(["area","base","basefont","br","col","hr","img","input","isindex","embed"]),t.TOP_LEVEL_TAGS=new r.default(["h1","h2","h3","h4","h5","p","ul","ol","table","blockquote","pre","hr","form"])},function(e,t,n){n=n(295);e.exports=n},function(e,t,n){n(296),n(61),n(50),n(54);n=n(9);e.exports=n.Set},function(e,t,n){"use strict";var o=n(122),n=n(124);e.exports=o("Set",function(t){return function(e){return t(this,arguments.length?e:void 0)}},n)},function(e,t){function n(){}n.prototype={handler:null,startTagRe:/^<([^>\s\/]+)((\s+[^=>\s]+(\s*=\s*((\"[^"]*\")|(\'[^']*\')|[^>\s]+))?)*)\s*\/?\s*>/m,endTagRe:/^<\/([^>\s]+)[^>]*>/m,attrRe:/([^=\s]+)(\s*=\s*((\"([^"]*)\")|(\'([^']*)\')|[^>\s]+))?/gm,parse:function(e,t){t&&(this.contentHandler=t);for(var n,o,i,r=!1,a=this;0\n

                                                          \n
                                                          \n
                                                          \n
                                                          ');l.css("visibility","hidden"),r.append(l),l.css("z-index",i.zIndex.get("tooltip"));var u=0;function s(){u&&clearTimeout(u)}function c(){s(),l.css("visibility","hidden")}r.on("mouseover",function(e){var t,n,o,e=e.target,e=v.default(e);e.isContain(r)?c():(null!=e.parentUntil(".w-e-droplist")?c():e.attr("data-title")?(o=e.attr("data-title"),n=e):null!=(t=e.parentUntil(".w-e-menu"))&&(o=t.attr("data-title"),n=t),o&&n?(s(),t=n.getOffsetData(),l.text(i.i18next.t("menus.title."+o)),n=l.getOffsetData(),o=t.left+t.width/2-n.width/2,l.css("left",o+"px"),"up"===a?l.css("top",t.top-n.height-8+"px"):"down"===a&&l.css("top",t.top+t.height+8+"px"),u=(0,h.default)(function(){l.css("visibility","visible")},200)):c())}).on("mouseleave",function(){c()})},m.prototype._addToToolbar=function(){var e,t=this.editor.$toolbarElem;(0,d.default)(e=this.menuList).call(e,function(e){e=e.$elem;e&&t.append(e)})},m.prototype.menuFind=function(e){for(var t=this.menuList,n=0,o=t.length;n\n \n
                                                          ');return o.call(this,t,e)||this}t.default=i},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(27)),a=o(n(29)),d=o(n(4)),l=o(n(317)),u=o(n(28));(0,i.default)(t,"__esModule",{value:!0});var s,o=n(2),i=o.__importDefault(n(24)),p=o.__importDefault(n(3)),c=n(6),h=n(7),o=(s=i.default,o.__extends(f,s),f.prototype.command=function(e){var t,n=this.editor,o=n.selection.getSelectionContainerElem();if(o&&n.$textElem.equal(o))this.setMultilineHead(e);else{if(-1<(0,r.default)(t=["OL","UL","LI","TABLE","TH","TR","CODE","HR"]).call(t,p.default(o).getNodeName()))return;n.cmd.do("formatBlock",e)}"

                                                          "!==e&&this.addUidForSelectionElem()},f.prototype.addUidForSelectionElem=function(){var e=this.editor.selection.getSelectionContainerElem(),t=c.getRandomCode();p.default(e).attr("id",t)},f.prototype.addListenerCatalog=function(){var e=this;this.editor.txt.eventHooks.changeEvents.push(function(){e.getCatalogs()})},f.prototype.getCatalogs=function(){var e=this.editor,t=this.editor.$textElem,e=e.config.onCatalogChange,t=(0,a.default)(t).call(t,"h1,h2,h3,h4,h5"),r=[];(0,d.default)(t).call(t,function(e,t){var n=p.default(e),o=n.attr("id"),i=n.getNodeName(),e=n.text();o||(o=c.getRandomCode(),n.attr("id",o)),e&&r.push({tag:i,id:o,text:e})}),(0,l.default)(this.oldCatalogs)!==(0,l.default)(r)&&(this.oldCatalogs=r,e&&e(r))},f.prototype.setMultilineHead=function(i){var r=this,n=this.editor,e=n.selection,t=null===(o=e.getSelectionContainerElem())||void 0===o?void 0:o.elems[0],a=["IMG","VIDEO","TABLE","TH","TR","UL","OL","PRE","HR","BLOCKQUOTE"],o=p.default(e.getSelectionStartElem()),l=p.default(e.getSelectionEndElem());l.elems[0].outerHTML!==p.default(h.EMPTY_P).elems[0].outerHTML||l.elems[0].nextSibling||(l=l.prev());var u=[];u.push(o.getNodeTop(n));var s=[],o=null===(o=e.getRange())||void 0===o?void 0:o.commonAncestorContainer.childNodes;null!=o&&(0,d.default)(o).call(o,function(e,t){e===u[0].getNode()&&s.push(t),e===l.getNodeTop(n).getNode()&&s.push(t)});for(var c=0;u[c].getNode()!==l.getNodeTop(n).getNode();){if(!u[c].elems[0])return;var f=p.default(u[c].next().getNode());u.push(f),c++}null!=u&&(0,d.default)(u).call(u,function(e,t){var n,o;r.hasTag(e,a)||(n=p.default(i),o=e.parent().getNode(),n.html(""+e.html()),o.insertBefore(n.getNode(),e.getNode()),e.remove())}),e.createRangeByElems(t.children[s[0]],t.children[s[1]])},f.prototype.hasTag=function(e,t){var n=this;if(!e)return!1;if((0,u.default)(t).call(t,null==e?void 0:e.getNodeName()))return!0;var o=!1;return null!==(e=e.children())&&void 0!==e&&(0,d.default)(e).call(e,function(e){o=n.hasTag(p.default(e),t)}),o},f.prototype.tryChangeActive=function(){var e=this.editor.cmd.queryCommandValue("formatBlock");/^h/i.test(e)?this.active():this.unActive()},f);function f(e){var t=this,n=p.default('

                                                          '),o={width:100,title:"设置标题",type:"list",list:[{$elem:p.default("

                                                          H1

                                                          "),value:"

                                                          "},{$elem:p.default("

                                                          H2

                                                          "),value:"

                                                          "},{$elem:p.default("

                                                          H3

                                                          "),value:"

                                                          "},{$elem:p.default("

                                                          H4

                                                          "),value:"

                                                          "},{$elem:p.default("

                                                          H5
                                                          "),value:"
                                                          "},{$elem:p.default("

                                                          "+e.i18next.t("menus.dropListMenu.head.正文")+"

                                                          "),value:"

                                                          "}],clickHandler:function(e){t.command(e)}},t=s.call(this,n,e,o)||this;return e.config.onCatalogChange&&(t.oldCatalogs=[],t.addListenerCatalog(),t.getCatalogs()),t}t.default=o},function(e,t,n){e.exports=n(318)},function(e,t,n){n=n(319);e.exports=n},function(e,t,n){n(320);var o=n(9);o.JSON||(o.JSON={stringify:JSON.stringify}),e.exports=function(e,t,n){return o.JSON.stringify.apply(null,arguments)}},function(e,t,n){function i(e,t,n){var o=n.charAt(t-1),t=n.charAt(t+1);return u.test(e)&&!s.test(t)||s.test(e)&&!u.test(o)?"\\u"+e.charCodeAt(0).toString(16):e}var o=n(5),r=n(36),n=n(11),a=r("JSON","stringify"),l=/[\uD800-\uDFFF]/g,u=/^[\uD800-\uDBFF]$/,s=/^[\uDC00-\uDFFF]$/,n=n(function(){return'"\\udf06\\ud834"'!==a("\udf06\ud834")||'"\\udead"'!==a("\udead")});a&&o({target:"JSON",stat:!0,forced:n},{stringify:function(e,t,n){var o=a.apply(null,arguments);return"string"==typeof o?o.replace(l,i):o}})},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(17));(0,i.default)(t,"__esModule",{value:!0});var a,o=n(2),i=o.__importDefault(n(38)),l=o.__importDefault(n(3)),u=o.__importDefault(n(322)),s=o.__importStar(n(96)),c=o.__importDefault(n(33)),f=o.__importDefault(n(324)),d=n(7),o=(a=i.default,o.__extends(p,a),p.prototype.clickHandler=function(){var e,t=this.editor,n=t.selection.getSelectionContainerElem(),o=t.$textElem,i=o.html();(0,r.default)(i).call(i)===d.EMPTY_P&&(e=o.children(),t.selection.createRangeByElem(e,!0,!0),n=t.selection.getSelectionContainerElem()),n&&t.$textElem.equal(n)||(this.isActive?(o=i="",(e=t.selection.getSelectionContainerElem())&&("A"!==e.getNodeName()&&(n=s.getParentNodeA(e),e=l.default(n)),i=e.elems[0].innerText,o=e.attr("href"),this.createPanel(i,o))):t.selection.isSelectionEmpty()?this.createPanel("",""):this.createPanel(t.selection.getSelectionText(),""))},p.prototype.createPanel=function(e,t){t=u.default(this.editor,e,t);new c.default(this,t).create()},p.prototype.tryChangeActive=function(){var e=this.editor;s.default(e)?this.active():this.unActive()},p);function p(e){var t=l.default('

                                                          '),n=a.call(this,t,e)||this;return f.default(e),n}t.default=o},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),h=o(n(28)),A=o(n(17)),a=o(n(29));(0,i.default)(t,"__esModule",{value:!0});var i=n(2),l=n(6),v=i.__importDefault(n(3)),m=i.__importStar(n(96)),g=n(323);t.default=function(c,i,r){var o,f=l.getRandom("input-link"),d=l.getRandom("input-text"),e=l.getRandom("btn-ok"),t=l.getRandom("btn-del"),n=m.default(c)?"inline-block":"none";function p(){var e;!m.default(c)||(e=c.selection.getSelectionContainerElem())&&(c.selection.createRangeByElem(e),c.selection.restoreSelection(),o=e)}return{width:300,height:0,tabs:[{title:c.i18next.t("menus.panelMenus.link.链接"),tpl:'
                                                          \n \n \n \n \n
                                                          \n \n \n
                                                          \n
                                                          ",events:[{selector:"#"+e,type:"click",fn:function(){var e=c.selection.getSelectionContainerElem(),t=null==e?void 0:e.elems[0];c.selection.restoreSelection();var n=c.selection.getSelectionRangeTopNodes()[0].getNode(),o=window.getSelection(),i=v.default("#"+f),r=v.default("#"+d),i=(0,A.default)(a=i.val()).call(a),r=(0,A.default)(a=r.val()).call(a),a="";!o||null!=o&&o.isCollapsed||(a=null===(l=g.insertHtml(o,n))||void 0===l?void 0:(0,A.default)(l).call(l));var l,u,n=null==a?void 0:a.replace(/<.*?>/g,""),a=null!==(l=null==n?void 0:n.length)&&void 0!==l?l:0;if(a<=r.length&&(l=r.substring(0,a),u=r.substring(a),n===l&&(r=n+u)),i&&function(e,t){if(t=c.config.linkCheck(e,t),void 0!==t){if(!0===t)return 1;c.config.customAlert(t,"warning")}}(r=r||i,i)){if("A"===(null==t?void 0:t.nodeName))return t.setAttribute("href",i),t.innerText=r,!0;if("A"!==(null==t?void 0:t.nodeName)&&(0,h.default)(u=m.EXTRA_TAG).call(u,t.nodeName)){var s=m.getParentNodeA(e);if(s)return s.setAttribute("href",i),t.innerText=r,!0}return s=i,i=(t=r).replace(//g,">"),r=v.default(''+i+""),(i=r.elems[0]).innerText=t,i.href=s,m.default(c)&&p(),c.cmd.do("insertElem",r),!0}},bindEnter:!0},{selector:"#"+t,type:"click",fn:function(){var e,t,n;return m.default(c)&&(p(),"A"===o.getNodeName()?(t=(n=o.elems[0]).parentElement)&&(0,h.default)(e=m.EXTRA_TAG).call(e,t.nodeName)?t.innerHTML=n.innerHTML:c.cmd.do("insertHTML",""+n.innerHTML+""):(n=m.getParentNodeA(o).innerHTML,c.cmd.do("insertHTML",""+n+""))),!0}}]}],setLinkValue:function(e,t){var n="",o="";"text"===t&&(n="#"+d,o=i),"link"===t&&(n="#"+f,o=r),(0,a.default)(e).call(e,n).elems[0].value=o}}}},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(4));function p(e,t){for(var n=e,o=e;n.textContent!==t&&((o=n).parentNode&&(n=null==n?void 0:n.parentNode),"P"!==(null==n?void 0:n.nodeName)););return o}function h(e,t){var n,o=e.nodeName,i="";return 3===e.nodeType||/^(h|H)[1-6]$/.test(o)?t:(1===e.nodeType&&((n=e.getAttribute("style"))&&(i=i+' style="'+n+'"'),(n=e.getAttribute("face"))&&(i=i+' face="'+n+'"'),(e=e.getAttribute("color"))&&(i=i+' color="'+e+'"')),"<"+(o=o.toLowerCase())+i+">"+t+"")}function A(e,t,n,o){for(var i,r=null===(i=t.textContent)||void 0===i?void 0:i.substring(n,o),a=t,l="";r=l=h(a,null!=r?r:""),a=null==a?void 0:a.parentElement,a&&a.textContent!==e;);return l}function v(e,t){return(0,r.default)(e).call(e,function(e){t=h(e,t)}),t}(0,i.default)(t,"__esModule",{value:!0}),t.insertHtml=t.createPartHtml=t.makeHtmlString=t.getTopNode=void 0,t.getTopNode=p,t.makeHtmlString=h,t.createPartHtml=A,t.insertHtml=function(e,t){var n=e.anchorNode,o=e.focusNode,i=e.anchorOffset,r=e.focusOffset,a=null!==(s=t.textContent)&&void 0!==s?s:"",l=function(e){var t,n=null!==(t=e.textContent)&&void 0!==t?t:"",o=[];for(;(null==e?void 0:e.textContent)===n;)"P"!==e.nodeName&&"TABLE"!==e.nodeName&&o.push(e),e=e.childNodes[0];return o}(t),e="",u="",s="",t=n,c=o,f=n;if(null!=n&&n.isEqualNode(null!=o?o:null))return v(l,A(a,n,i,r));for(n&&(e=A(a,n,null!=i?i:0)),o&&(s=A(a,o,0,r)),n&&(t=p(n,a)),o&&(c=p(o,a)),f=null!==(t=null==t?void 0:t.nextSibling)&&void 0!==t?t:n;null==f||!f.isEqualNode(null!=c?c:null);){"#text"===(null==f?void 0:f.nodeName)?u+=null==f?void 0:f.textContent:(d=null===(d=null===(d=null==f?void 0:f.firstChild)||void 0===d?void 0:d.parentElement)||void 0===d?void 0:d.innerHTML,f&&(u+=h(f,null!=d?d:"")));var d=null!==(d=null==f?void 0:f.nextSibling)&&void 0!==d?d:f;if(d===f)break;f=d}return v(l,""+e+u+s)}},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o=n(2).__importDefault(n(325));t.default=function(e){o.default(e)}},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(28));(0,i.default)(t,"__esModule",{value:!0});var i=n(2),a=i.__importDefault(n(3)),l=i.__importDefault(n(39)),u=n(96);function s(n){var o;return{showLinkTooltip:function(e){var t=[{$elem:a.default(""+n.i18next.t("menus.panelMenus.link.查看链接")+""),onClick:function(e,t){t=t.attr("href");return window.open(t,"_target"),!0}},{$elem:a.default(""+n.i18next.t("menus.panelMenus.link.取消链接")+""),onClick:function(e,t){e.selection.createRangeByElem(t),e.selection.restoreSelection();var n,o,i=t.childNodes();return"IMG"===(null==i?void 0:i.getNodeName())?(o=null===(n=null===(o=e.selection.getSelectionContainerElem())||void 0===o?void 0:o.children())||void 0===n?void 0:n.elems[0].children[0],e.cmd.do("insertHTML","")):(o=(n=t.elems[0]).innerHTML,(t=n.parentElement)&&(0,r.default)(n=u.EXTRA_TAG).call(n,t.nodeName)?t.innerHTML=o:e.cmd.do("insertHTML",""+o+"")),!0}}];(o=new l.default(n,e,t)).create()},hideLinkTooltip:function(){o&&(o.remove(),o=null)}}}t.default=function(e){var t=(n=s(e)).showLinkTooltip,n=n.hideLinkTooltip;e.txt.eventHooks.linkClickEvents.push(t),e.txt.eventHooks.clickEvents.push(n),e.txt.eventHooks.keyupEvents.push(n),e.txt.eventHooks.toolbarClickEvents.push(n),e.txt.eventHooks.menuClickEvents.push(n),e.txt.eventHooks.textScrollEvents.push(n)}},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o,i=n(2),r=i.__importDefault(n(23)),a=i.__importDefault(n(3)),i=(o=r.default,i.__extends(l,o),l.prototype.clickHandler=function(){var e=this.editor,t=e.selection.isSelectionEmpty();t&&e.selection.createEmptyRange(),e.cmd.do("italic"),t&&(e.selection.collapseRange(),e.selection.restoreSelection())},l.prototype.tryChangeActive=function(){this.editor.cmd.queryCommandState("italic")?this.active():this.unActive()},l);function l(e){var t=a.default('
                                                          \n \n
                                                          ');return o.call(this,t,e)||this}t.default=i},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o,i=n(2),r=i.__importDefault(n(23)),a=i.__importDefault(n(3)),i=(o=r.default,i.__extends(l,o),l.prototype.clickHandler=function(){var e=this.editor,t=e.selection.isSelectionEmpty();t&&e.selection.createEmptyRange(),e.cmd.do("underline"),t&&(e.selection.collapseRange(),e.selection.restoreSelection())},l.prototype.tryChangeActive=function(){this.editor.cmd.queryCommandState("underline")?this.active():this.unActive()},l);function l(e){var t=a.default('
                                                          \n \n
                                                          ');return o.call(this,t,e)||this}t.default=i},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o,i=n(2),r=i.__importDefault(n(23)),a=i.__importDefault(n(3)),i=(o=r.default,i.__extends(l,o),l.prototype.clickHandler=function(){var e=this.editor,t=e.selection.isSelectionEmpty();t&&e.selection.createEmptyRange(),e.cmd.do("strikeThrough"),t&&(e.selection.collapseRange(),e.selection.restoreSelection())},l.prototype.tryChangeActive=function(){this.editor.cmd.queryCommandState("strikeThrough")?this.active():this.unActive()},l);function l(e){var t=a.default('
                                                          \n \n
                                                          ');return o.call(this,t,e)||this}t.default=i},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var i,o=n(2),r=o.__importDefault(n(24)),a=o.__importDefault(n(3)),l=o.__importDefault(n(330)),o=(i=r.default,o.__extends(u,i),u.prototype.command=function(e){var t,n,o=this.editor,i=o.selection.isSelectionEmpty(),r=null===(n=o.selection.getSelectionContainerElem())||void 0===n?void 0:n.elems[0];null!=r&&(t="p"!==(null==r?void 0:r.nodeName.toLowerCase()),n=(null==r?void 0:r.getAttribute("face"))===e,i&&(t&&!n&&(n=o.selection.getSelectionRangeTopNodes(),o.selection.createRangeByElem(n[0]),o.selection.moveCursor(n[0].elems[0])),o.selection.setRangeToElem(r),o.selection.createEmptyRange()),o.cmd.do("fontName",e),i&&(o.selection.collapseRange(),o.selection.restoreSelection()))},u.prototype.tryChangeActive=function(){},u);function u(e){var t=this,n=a.default('
                                                          \n \n
                                                          '),o={width:100,title:"设置字体",type:"list",list:new l.default(e.config.fontNames).getItemList(),clickHandler:function(e){t.command(e)}};return t=i.call(this,n,e,o)||this}t.default=o},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(4));(0,i.default)(t,"__esModule",{value:!0});var a=n(2).__importDefault(n(3)),n=(l.prototype.getItemList=function(){return this.itemList},l);function l(e){var n=this;this.itemList=[],(0,r.default)(e).call(e,function(e){var t="string"==typeof e?e:e.value,e="string"==typeof e?e:e.name;n.itemList.push({$elem:a.default("

                                                          "+e+"

                                                          "),value:e})})}t.default=n},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var i,o=n(2),r=o.__importDefault(n(24)),a=o.__importDefault(n(3)),l=o.__importDefault(n(332)),o=(i=r.default,o.__extends(u,i),u.prototype.command=function(e){var t,n=this.editor,o=n.selection.isSelectionEmpty();null!=(null===(t=n.selection.getSelectionContainerElem())||void 0===t?void 0:t.elems[0])&&(n.cmd.do("fontSize",e),o&&(n.selection.collapseRange(),n.selection.restoreSelection()))},u.prototype.tryChangeActive=function(){},u);function u(e){var t=this,n=a.default('
                                                          \n \n
                                                          '),o={width:160,title:"设置字号",type:"list",list:new l.default(e.config.fontSizes).getItemList(),clickHandler:function(e){t.command(e)}};return t=i.call(this,n,e,o)||this}t.default=o},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o=n(2).__importDefault(n(3)),n=(i.prototype.getItemList=function(){return this.itemList},i);function i(e){for(var t in this.itemList=[],e){var n=e[t];this.itemList.push({$elem:o.default('

                                                          '+n.name+"

                                                          "),value:n.value})}}t.default=n},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(4)),a=o(n(27));(0,i.default)(t,"__esModule",{value:!0});var l,o=n(2),i=o.__importDefault(n(24)),u=o.__importDefault(n(3)),s=["LI"],c=["BLOCKQUOTE"],o=(l=i.default,o.__extends(f,l),f.prototype.command=function(t){var e=this.editor,n=e.selection,o=n.getSelectionContainerElem();n.saveRange();e=e.selection.getSelectionRangeTopNodes();if(null!=o&&o.length)if(this.isSpecialNode(o,e[0])||this.isSpecialTopNode(e[0])){o=this.getSpecialNodeUntilTop(o,e[0]);if(null==o)return;u.default(o).css("text-align",t)}else(0,r.default)(e).call(e,function(e){e.css("text-align",t)});n.restoreSelection()},f.prototype.getSpecialNodeUntilTop=function(e,t){for(var n=e.elems[0],o=t.elems[0];null!=n;){if(-1!==(0,a.default)(s).call(s,null==n?void 0:n.nodeName))return n;if(n.parentNode===o)return n;n=n.parentNode}return n},f.prototype.isSpecialNode=function(e,t){t=this.getSpecialNodeUntilTop(e,t);return null!=t&&-1!==(0,a.default)(s).call(s,t.nodeName)},f.prototype.isSpecialTopNode=function(e){return null!=e&&-1!==(0,a.default)(c).call(c,null===(e=e.elems[0])||void 0===e?void 0:e.nodeName)},f.prototype.tryChangeActive=function(){},f);function f(e){var t=this,n=u.default('
                                                          '),o={width:100,title:"对齐方式",type:"list",list:[{$elem:u.default('

                                                          \n \n '+e.i18next.t("menus.dropListMenu.justify.靠左")+"\n

                                                          "),value:"left"},{$elem:u.default('

                                                          \n \n '+e.i18next.t("menus.dropListMenu.justify.居中")+"\n

                                                          "),value:"center"},{$elem:u.default('

                                                          \n \n '+e.i18next.t("menus.dropListMenu.justify.靠右")+"\n

                                                          "),value:"right"},{$elem:u.default('

                                                          \n \n '+e.i18next.t("menus.dropListMenu.justify.两端")+"\n

                                                          "),value:"justify"}],clickHandler:function(e){t.command(e)}};return t=l.call(this,n,e,o)||this}t.default=o},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),l=o(n(4));(0,i.default)(t,"__esModule",{value:!0});var r,o=n(2),u=o.__importDefault(n(3)),i=o.__importDefault(n(23)),a=o.__importDefault(n(335)),s=o.__importDefault(n(336)),c=n(7),o=(r=i.default,o.__extends(f,r),f.prototype.clickHandler=function(){var e=this.editor,t=e.selection.isSelectionEmpty(),n=e.selection.getSelectionRangeTopNodes(),o=n[n.length-1];if("BLOCKQUOTE"!==this.getTopNodeName()){var i=s.default(n);e.$textElem.equal(o)?(r=null===(r=e.selection.getSelectionContainerElem())||void 0===r?void 0:r.elems[0],e.selection.createRangeByElems(r.children[0],r.children[0]),n=e.selection.getSelectionRangeTopNodes(),i=s.default(n),o.append(i)):i.insertAfter(o),this.delSelectNode(n);var r=null===(r=i.childNodes())||void 0===r?void 0:r.last().getNode();return null==r?void 0:(r.textContent?e.selection.moveCursor(r):e.selection.moveCursor(r,0),this.tryChangeActive(),void u.default(c.EMPTY_P).insertAfter(i))}var r=u.default(o.childNodes()),i=r.length,a=o;(0,l.default)(r).call(r,function(e){e=u.default(e);e.insertAfter(a),a=e}),o.remove(),e.selection.moveCursor(r.elems[i-1]),this.tryChangeActive(),t&&(e.selection.collapseRange(),e.selection.restoreSelection())},f.prototype.tryChangeActive=function(){var e;"BLOCKQUOTE"===(null===(e=this.editor.selection.getSelectionRangeTopNodes()[0])||void 0===e?void 0:e.getNodeName())?this.active():this.unActive()},f.prototype.getTopNodeName=function(){var e=this.editor.selection.getSelectionRangeTopNodes()[0];return null==e?void 0:e.getNodeName()},f.prototype.delSelectNode=function(e){(0,l.default)(e).call(e,function(e){e.remove()})},f);function f(e){var t=u.default('
                                                          \n \n
                                                          '),n=r.call(this,t,e)||this;return a.default(e),n}t.default=o},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o=n(2),r=n(7),a=o.__importDefault(n(3));t.default=function(i){i.txt.eventHooks.enterDownEvents.push(function(e){var t,n=i.selection.getSelectionContainerElem(),o=i.selection.getSelectionRangeTopNodes()[0];"BLOCKQUOTE"===(null==o?void 0:o.getNodeName())&&("BLOCKQUOTE"===n.getNodeName()&&(t=null===(t=n.childNodes())||void 0===t?void 0:t.getNode(),i.selection.moveCursor(t)),""===n.text()&&(e.preventDefault(),n.remove(),(n=a.default(r.EMPTY_P)).insertAfter(o),i.selection.moveCursor(n.getNode(),0)),""===o.text()&&o.remove())})}},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(4));(0,i.default)(t,"__esModule",{value:!0});var a=n(2).__importDefault(n(3));t.default=function(e){var t=a.default("
                                                          ");return(0,r.default)(e).call(e,function(e){t.append(e.clone(!0))}),t}},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(26));(0,i.default)(t,"__esModule",{value:!0});var a,o=n(2),i=o.__importDefault(n(24)),l=o.__importDefault(n(3)),u=n(6),o=(a=i.default,o.__extends(s,a),s.prototype.command=function(e){var t,n=this.editor,o=n.selection.isSelectionEmpty(),i=null===(t=n.selection.getSelectionContainerElem())||void 0===t?void 0:t.elems[0];null!=i&&(t="p"!==(null==i?void 0:i.nodeName.toLowerCase()),i=null==i?void 0:i.style.backgroundColor,i=u.hexToRgb(e)===i,o&&(t&&!i&&(i=n.selection.getSelectionRangeTopNodes(),n.selection.createRangeByElem(i[0]),n.selection.moveCursor(i[0].elems[0])),n.selection.createEmptyRange()),n.cmd.do("backColor",e),o&&(n.selection.collapseRange(),n.selection.restoreSelection()))},s.prototype.tryChangeActive=function(){},s);function s(e){var t=this,n=l.default('
                                                          \n \n
                                                          '),o={width:120,title:"背景颜色",type:"inline-block",list:(0,r.default)(o=e.config.colors).call(o,function(e){return{$elem:l.default(''),value:e}}),clickHandler:function(e){t.command(e)}};return t=a.call(this,n,e,o)||this}t.default=o},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(26));(0,i.default)(t,"__esModule",{value:!0});var a,o=n(2),i=o.__importDefault(n(24)),l=o.__importDefault(n(3)),o=(a=i.default,o.__extends(u,a),u.prototype.command=function(e){var t,n=this.editor,o=n.selection.isSelectionEmpty(),i=null===(t=n.selection.getSelectionContainerElem())||void 0===t?void 0:t.elems[0];null!=i&&(t=n.selection.getSelectionText(),"A"===i.nodeName&&i.textContent===t&&(t=l.default("​").getNode(),i.appendChild(t)),n.cmd.do("foreColor",e),o&&(n.selection.collapseRange(),n.selection.restoreSelection()))},u.prototype.tryChangeActive=function(){},u);function u(e){var t=this,n=l.default('
                                                          \n \n
                                                          '),o={width:120,title:"文字颜色",type:"inline-block",list:(0,r.default)(o=e.config.colors).call(o,function(e){return{$elem:l.default(''),value:e}}),clickHandler:function(e){t.command(e)}};return t=a.call(this,n,e,o)||this}t.default=o},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o,i=n(2),r=i.__importDefault(n(3)),a=i.__importDefault(n(33)),l=i.__importDefault(n(38)),u=i.__importDefault(n(340)),s=i.__importDefault(n(346)),i=(o=l.default,i.__extends(c,o),c.prototype.clickHandler=function(){this.createPanel("")},c.prototype.createPanel=function(e){e=u.default(this.editor,e);new a.default(this,e).create()},c.prototype.tryChangeActive=function(){},c);function c(e){var t=r.default('
                                                          \n \n
                                                          '),n=o.call(this,t,e)||this;return s.default(e),n}t.default=i},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),u=o(n(17));(0,i.default)(t,"__esModule",{value:!0});var i=n(2),s=n(6),c=i.__importDefault(n(3)),f=i.__importDefault(n(341)),d=n(7);t.default=function(t,e){var n=t.config,o=new f.default(t),i=s.getRandom("input-iframe"),r=s.getRandom("btn-ok"),a=s.getRandom("input-upload"),l=s.getRandom("btn-local-ok");return l=[{title:t.i18next.t("menus.panelMenus.video.上传视频"),tpl:'
                                                          \n
                                                          \n \n
                                                          \n
                                                          \n \n
                                                          \n
                                                          ',events:[{selector:"#"+l,type:"click",fn:function(){var e=c.default("#"+a).elems[0];if(!e)return!0;e.click()}},{selector:"#"+a,type:"change",fn:function(){var e=c.default("#"+a).elems[0];if(!e)return!0;e=e.files;return e.length&&o.uploadVideo(e),!0}}]},{title:t.i18next.t("menus.panelMenus.video.插入视频"),tpl:'
                                                          \n "/>\n \n
                                                          \n \n
                                                          \n
                                                          ",events:[{selector:"#"+r,type:"click",fn:function(){var e=c.default("#"+i),e=(0,u.default)(e=e.val()).call(e);if(e&&function(e){if(!0===(e=t.config.onlineVideoCheck(e)))return 1;"string"==typeof e&&t.config.customAlert(e,"error")}(e))return e=e,t.cmd.do("insertHTML",e+d.EMPTY_P),t.config.onlineVideoCallback(e),!0},bindEnter:!0}]}],r={width:300,height:0,tabs:[]},window.FileReader&&(n.uploadVideoServer||n.customUploadVideo)&&r.tabs.push(l[0]),n.showLinkVideo&&r.tabs.push(l[1]),r}},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),w=o(n(133)),x=o(n(57)),_=o(n(4)),E=o(n(27));(0,i.default)(t,"__esModule",{value:!0});var i=n(2),b=n(6),C=i.__importDefault(n(135)),S=i.__importDefault(n(136)),r=n(7),a=n(6),n=(l.prototype.uploadVideo=function(e){var o,i,r,a,l,t,n,u,s,c,f,d,p,h,A,v,m,g,y=this;e.length&&(o=this.editor,i=o.config,r=function(e){return o.i18next.t("validate."+e)},v=i.uploadVideoServer,a=i.uploadVideoMaxSize/1024,l=i.uploadVideoName,t=i.uploadVideoParams,n=i.uploadVideoParamsWithUrl,u=i.uploadVideoHeaders,s=i.uploadVideoHooks,c=i.uploadVideoTimeout,g=i.withVideoCredentials,f=i.customUploadVideo,d=i.uploadVideoAccept,p=[],h=[],b.arrForEach(e,function(e){var t=e.name,n=e.size/1024/1024;t&&n&&(d instanceof Array?(0,w.default)(d).call(d,function(e){return e===t.split(".")[t.split(".").length-1]})?a

                                                          ​

                                                          '):o.cmd.do("insertHTML",''+r.EMPTY_P),(n=document.createElement("video")).onload=function(){n=null},n.onerror=function(){i.customAlert(t("插入视频错误"),"error","wangEditor: "+t("插入视频错误")+","+t("视频链接")+' "'+e+'",'+t("下载链接失败")),n=null},n.onabort=function(){return n=null},n.src=e)},l);function l(e){this.editor=e}t.default=n},function(e,t,n){e.exports=n(343)},function(e,t,n){n=n(344);e.exports=n},function(e,t,n){n(345);n=n(9);e.exports=n.Date.now},function(e,t,n){n(5)({target:"Date",stat:!0},{now:function(){return(new Date).getTime()}})},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o=n(2),i=o.__importDefault(n(347)),r=o.__importDefault(n(349));t.default=function(e){i.default(e),r.default(e)}},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0}),t.createShowHideFn=void 0;var o=n(2),r=o.__importDefault(n(3)),a=o.__importDefault(n(39)),l=o.__importDefault(n(348));function i(n){function o(e,t){return void 0===t&&(t=""),n.i18next.t(t+e)}var i;return{showVideoTooltip:function(e){var t=[{$elem:r.default(""),onClick:function(e,t){return t.remove(),!0}},{$elem:r.default("100%"),onClick:function(e,t){return t.attr("width","100%"),t.removeAttr("height"),!0}},{$elem:r.default("50%"),onClick:function(e,t){return t.attr("width","50%"),t.removeAttr("height"),!0}},{$elem:r.default("30%"),onClick:function(e,t){return t.attr("width","30%"),t.removeAttr("height"),!0}},{$elem:r.default(""+o("重置")+""),onClick:function(e,t){return t.removeAttr("width"),t.removeAttr("height"),!0}},{$elem:r.default(""+o("menus.justify.靠左")+""),onClick:function(e,t){return l.default(t,"left"),!0}},{$elem:r.default(""+o("menus.justify.居中")+""),onClick:function(e,t){return l.default(t,"center"),!0}},{$elem:r.default(""+o("menus.justify.靠右")+""),onClick:function(e,t){return l.default(t,"right"),!0}}];(i=new a.default(n,e,t)).create()},hideVideoTooltip:function(){i&&(i.remove(),i=null)}}}t.createShowHideFn=i,t.default=function(e){var t=(n=i(e)).showVideoTooltip,n=n.hideVideoTooltip;e.txt.eventHooks.videoClickEvents.push(t),e.txt.eventHooks.clickEvents.push(n),e.txt.eventHooks.keyupEvents.push(n),e.txt.eventHooks.toolbarClickEvents.push(n),e.txt.eventHooks.menuClickEvents.push(n),e.txt.eventHooks.textScrollEvents.push(n),e.txt.eventHooks.changeEvents.push(n)}},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(28));(0,i.default)(t,"__esModule",{value:!0});var a=n(2).__importDefault(n(3));t.default=function(e,t){(e=function(e,t){var n,o=e.elems[0];for(;null!=o;){if((0,r.default)(t).call(t,null==o?void 0:o.nodeName))return o;if("BODY"===(null===(n=null==o?void 0:o.parentNode)||void 0===n?void 0:n.nodeName))return null;o=o.parentNode}return o}(e,["P"]))&&a.default(e).css("text-align",t)}},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var i=n(6);t.default=function(n){var e,o;i.UA.isFirefox&&(e=n.txt,o=n.selection,e.eventHooks.keydownEvents.push(function(e){var t=o.getSelectionContainerElem();!t||(t=(t=t.getNodeTop(n)).length&&t.prev().length?t.prev():null)&&t.attr("data-we-video-p")&&0===o.getCursorPos()&&8===e.keyCode&&t.remove()}))}},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(26));(0,i.default)(t,"__esModule",{value:!0});var a,o=n(2),l=n(7),u=o.__importDefault(n(3)),s=o.__importDefault(n(33)),i=o.__importDefault(n(38)),c=o.__importDefault(n(351)),f=o.__importDefault(n(364)),o=(a=i.default,o.__extends(d,a),d.prototype.clickHandler=function(){this.imgPanelConfig.onlyUploadConf||this.createPanel()},d.prototype.createPanel=function(){var e=this.imgPanelConfig,e=new s.default(this,e);this.setPanel(e),e.create()},d.prototype.tryChangeActive=function(){},d);function d(e){var t,n=this,o=u.default('
                                                          '),i=f.default(e);return i.onlyUploadConf&&(o=i.onlyUploadConf.$elem,(0,r.default)(t=i.onlyUploadConf.events).call(t,function(e){var t=e.type,n=e.fn||l.EMPTY_FN;o.on(t,function(e){e.stopPropagation(),n(e)})})),(n=a.call(this,o,e)||this).imgPanelConfig=i,c.default(e),n}t.default=o},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o=n(2),i=o.__importDefault(n(352)),r=o.__importDefault(n(353)),a=o.__importDefault(n(354)),l=o.__importDefault(n(362)),u=o.__importDefault(n(363));t.default=function(e){i.default(e),r.default(e),a.default(e),l.default(e),u.default(e)}},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o=n(2),r=n(131),a=o.__importDefault(n(97));function i(e,t){var n,o,i;!function(e){for(var t=(null===(e=e.clipboardData)||void 0===e?void 0:e.types)||[],n=0;n\n
                                                          \n
                                                          \n ')).hide(),t.append(n),n);function o(){(0,g.default)(r).call(r,".w-e-img-drag-mask").hide()}return m=r,(v=a).on("click",function(e){e.stopPropagation()}),v.on("mousedown",".w-e-img-drag-rb",function(e){var t,n,o,i,r,a,l,u,s,c,f;function d(){f.off("mousemove",p),f.off("mouseup",h)}function p(e){e.stopPropagation(),e.preventDefault(),s=i+(e.clientX-t),c=r+(e.clientY-n),s/c!=u&&(c=s/u),s=(0,y.default)(s.toFixed(2)),c=(0,y.default)(c.toFixed(2)),(0,g.default)(v).call(v,".w-e-img-drag-show-size").text(s.toFixed(2).replace(".00","")+"px * "+c.toFixed(2).replace(".00","")+"px"),x(v,s,c,a,l)}function h(){A.attr("width",s+""),A.attr("height",c+"");var e=A.getBoundingClientRect();x(v,s,c,e.left-o.left,e.top-o.top),d()}e.preventDefault(),A&&(t=e.clientX,n=e.clientY,o=m.getBoundingClientRect(),e=A.getBoundingClientRect(),i=e.width,r=e.height,a=e.left-o.left,l=e.top-o.top,u=i/r,s=i,c=r,(f=w.default(document)).on("mousemove",p),f.on("mouseup",h),f.on("mouseleave",d))}),w.default(document).on("click",o),e.beforeDestroy(function(){w.default(document).off("click",o)}),{showDrag:function(e){if(l.UA.isIE())return!1;var t,n,o,i;e&&(n=a,o=A=e,i=(t=r).getBoundingClientRect(),e=o.getBoundingClientRect(),t=e.width.toFixed(2),o=e.height.toFixed(2),(0,g.default)(n).call(n,".w-e-img-drag-show-size").text(t+"px * "+o+"px"),x(n,(0,y.default)(t),(0,y.default)(o),e.left-i.left,e.top-i.top),n.show())},hideDrag:o}}t.createShowHideFn=r,t.default=function(e){var t=(n=r(e)).showDrag,n=n.hideDrag;e.txt.eventHooks.imgClickEvents.push(t),e.txt.eventHooks.textScrollEvents.push(n),e.txt.eventHooks.keyupEvents.push(n),e.txt.eventHooks.toolbarClickEvents.push(n),e.txt.eventHooks.menuClickEvents.push(n),e.txt.eventHooks.changeEvents.push(n)}},function(e,t,n){e.exports=n(356)},function(e,t,n){n=n(357);e.exports=n},function(e,t,n){n(358);n=n(9);e.exports=n.parseFloat},function(e,t,n){var o=n(5),n=n(359);o({global:!0,forced:parseFloat!=n},{parseFloat:n})},function(e,t,n){var o=n(8),i=n(90).trim,n=n(68),r=o.parseFloat,n=1/r(n+"-0")!=-1/0;e.exports=n?function(e){var t=i(String(e)),e=r(t);return 0===e&&"-"==t.charAt(0)?-0:e}:r},function(e,t,n){var o=n(20),i=n(361);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);n={insert:"head",singleton:!1},o(i,n);e.exports=i.locals||{}},function(e,t,n){(t=n(21)(!1)).push([e.i,".w-e-text-container {\n overflow: hidden;\n}\n.w-e-img-drag-mask {\n position: absolute;\n z-index: 1;\n border: 1px dashed #ccc;\n box-sizing: border-box;\n}\n.w-e-img-drag-mask .w-e-img-drag-rb {\n position: absolute;\n right: -5px;\n bottom: -5px;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: #ccc;\n cursor: se-resize;\n}\n.w-e-img-drag-mask .w-e-img-drag-show-size {\n min-width: 110px;\n height: 22px;\n line-height: 22px;\n font-size: 14px;\n color: #999;\n position: absolute;\n left: 0;\n top: 0;\n background-color: #999;\n color: #fff;\n border-radius: 2px;\n padding: 0 5px;\n}\n",""]),e.exports=t},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0}),t.createShowHideFn=void 0;var o=n(2),r=o.__importDefault(n(3)),a=o.__importDefault(n(39));function i(n){function o(e,t){return void 0===t&&(t=""),n.i18next.t(t+e)}var i;return{showImgTooltip:function(e){var t=[{$elem:r.default(""),onClick:function(e,t){return e.selection.createRangeByElem(t),e.selection.restoreSelection(),e.cmd.do("delete"),!0}},{$elem:r.default("30%"),onClick:function(e,t){return t.attr("width","30%"),t.removeAttr("height"),!0}},{$elem:r.default("50%"),onClick:function(e,t){return t.attr("width","50%"),t.removeAttr("height"),!0}},{$elem:r.default("100%"),onClick:function(e,t){return t.attr("width","100%"),t.removeAttr("height"),!0}}];t.push({$elem:r.default(""+o("重置")+""),onClick:function(e,t){return t.removeAttr("width"),t.removeAttr("height"),!0}}),e.attr("data-href")&&t.push({$elem:r.default(""+o("查看链接")+""),onClick:function(e,t){t=t.attr("data-href");return t&&(t=decodeURIComponent(t),window.open(t,"_target")),!0}}),(i=new a.default(n,e,t)).create()},hideImgTooltip:function(){i&&(i.remove(),i=null)}}}t.createShowHideFn=i,t.default=function(e){var t=(n=i(e)).showImgTooltip,n=n.hideImgTooltip;e.txt.eventHooks.imgClickEvents.push(t),e.txt.eventHooks.clickEvents.push(n),e.txt.eventHooks.keyupEvents.push(n),e.txt.eventHooks.toolbarClickEvents.push(n),e.txt.eventHooks.menuClickEvents.push(n),e.txt.eventHooks.textScrollEvents.push(n),e.txt.eventHooks.imgDragBarMouseDownEvents.push(n),e.txt.eventHooks.changeEvents.push(n)}},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0}),t.default=function(e){var t=e.txt,a=e.selection;t.eventHooks.keydownEvents.push(function(e){var t=a.getSelectionContainerElem(),n=a.getRange();if(n&&t&&8===e.keyCode&&a.isSelectionEmpty()){var o=n.startContainer,n=n.startOffset,i=null;if(0===n)for(;o!==t.elems[0]&&t.elems[0].contains(o)&&o.parentNode&&!i;){if(o.previousSibling){i=o.previousSibling;break}o=o.parentNode}else 3!==o.nodeType&&(i=o.childNodes[n-1]);if(i){for(var r=i;r.childNodes.length;)r=r.childNodes[r.childNodes.length-1];r instanceof HTMLElement&&"IMG"===r.tagName&&(r.remove(),e.preventDefault())}}})}},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),A=o(n(26)),v=o(n(17));(0,i.default)(t,"__esModule",{value:!0});var i=n(2),m=i.__importDefault(n(3)),g=n(6),y=i.__importDefault(n(97));t.default=function(n){function e(e,t){return void 0===t&&(t="menus.panelMenus.image."),n.i18next.t(t+e)}var o=n.config,i=new y.default(n),r=g.getRandom("up-trigger-id"),a=g.getRandom("up-file-id"),l=g.getRandom("input-link-url"),u=g.getRandom("input-link-url-alt"),s=g.getRandom("input-link-url-href"),t=g.getRandom("btn-link");function c(e,t,n){return'
                                                          \n
                                                          \n \n
                                                          \n
                                                          \n \n
                                                          \n
                                                          '}var f=1===o.uploadImgMaxLength?"":'multiple="multiple"',d=(0,A.default)(h=o.uploadImgAccept).call(h,function(e){return"image/"+e}).join(","),p=[{selector:"#"+r,type:"click",fn:function(){var e=o.uploadImgFromMedia;if(e&&"function"==typeof e)return e(),!0;e=m.default("#"+a).elems[0];if(!e)return!0;e.click()}},{selector:"#"+a,type:"change",fn:function(){var e=m.default("#"+a).elems[0];if(!e)return!0;var t=e.files;return null!=t&&t.length&&i.uploadImg(t),e&&(e.value=""),!0}}],h=[''];return o.showLinkImgAlt&&h.push('\n '),o.showLinkImgHref&&h.push('\n '),t=[{title:e("上传图片"),tpl:c("w-e-up-img-container","w-e-icon-upload2",""),events:p},{title:e("网络图片"),tpl:"
                                                          \n "+h.join("")+'\n
                                                          \n \n
                                                          \n
                                                          ",events:[{selector:"#"+t,type:"click",fn:function(){var e,t,n=m.default("#"+l),n=(0,v.default)(n=n.val()).call(n);if(n&&(o.showLinkImgAlt&&(e=(0,v.default)(e=m.default("#"+u).val()).call(e)),o.showLinkImgHref&&(t=(0,v.default)(t=m.default("#"+s).val()).call(t)),function(e){if(!0===(e=o.linkImgCheck(e)))return 1;"string"==typeof e&&o.customAlert(e,"error")}(n)))return i.insertImg(n,e,t),!0},bindEnter:!0}]}],p={width:300,height:0,tabs:[],onlyUploadConf:{$elem:m.default(c("w-e-menu","w-e-icon-image","图片")),events:p}},window.FileReader&&(o.uploadImgShowBase64||o.uploadImgServer||o.customUploadImg||o.uploadImgFromMedia)&&p.tabs.push(t[0]),o.showLinkImg&&(p.tabs.push(t[1]),p.onlyUploadConf=void 0),p}},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(4));(0,i.default)(t,"__esModule",{value:!0});var a,o=n(2),l=o.__importDefault(n(3)),i=o.__importDefault(n(24)),u=o.__importDefault(n(366)),o=(a=i.default,o.__extends(s,a),s.prototype.command=function(t){var e,n=this.editor,o=n.selection.getSelectionContainerElem();o&&n.$textElem.equal(o)?0<(e=n.selection.getSelectionRangeTopNodes()).length&&(0,r.default)(e).call(e,function(e){u.default(l.default(e),t,n)}):o&&0\n \n '),o={width:130,title:"设置缩进",type:"list",list:[{$elem:l.default('

                                                          \n \n '+e.i18next.t("menus.dropListMenu.indent.增加缩进")+"\n

                                                          "),value:"increase"},{$elem:l.default('

                                                          \n \n '+e.i18next.t("menus.dropListMenu.indent.减少缩进")+"\n

                                                          "),value:"decrease"}],clickHandler:function(e){t.command(e)}};return t=a.call(this,n,e,o)||this}t.default=o},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(45)),a=o(n(17));(0,i.default)(t,"__esModule",{value:!0});var i=n(2),l=i.__importDefault(n(367)),u=i.__importDefault(n(368)),s=/^(\d+)(\w+)$/,c=/^(\d+)%$/;function f(e){var t=e.config.indentation;if("string"==typeof t){if(s.test(t)){var e=(0,r.default)(n=(0,a.default)(t).call(t).match(s)).call(n,1,3),n=e[0],e=e[1];return{value:Number(n),unit:e}}if(c.test(t))return{value:Number((0,a.default)(t).call(t).match(c)[1]),unit:"%"}}else if(void 0!==t.value&&t.unit)return t;return{value:2,unit:"em"}}t.default=function(e,t,n){e=e.getNodeTop(n),/^(P|H[0-9]*)$/.test(e.getNodeName())&&("increase"===t?l.default(e,f(n)):"decrease"===t&&u.default(e,f(n)))}},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(45));(0,i.default)(t,"__esModule",{value:!0}),t.default=function(e,t){var n=e.elems[0];""===n.style.paddingLeft?e.css("padding-left",t.value+t.unit):(n=n.style.paddingLeft,n=(0,r.default)(n).call(n,0,n.length-t.unit.length),n=Number(n)+t.value,e.css("padding-left",""+n+t.unit))}},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(45));(0,i.default)(t,"__esModule",{value:!0}),t.default=function(e,t){var n=e.elems[0];""!==n.style.paddingLeft&&(n=n.style.paddingLeft,n=(0,r.default)(n).call(n,0,n.length-t.unit.length),0<(n=Number(n)-t.value)?e.css("padding-left",""+n+t.unit):e.css("padding-left",""))}},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o,i=n(2),r=i.__importDefault(n(3)),a=i.__importDefault(n(38)),l=i.__importDefault(n(33)),u=i.__importDefault(n(370)),i=(o=a.default,i.__extends(s,o),s.prototype.createPanel=function(){var e=u.default(this.editor);new l.default(this,e).create()},s.prototype.clickHandler=function(){this.createPanel()},s.prototype.tryChangeActive=function(){},s);function s(e){var t=r.default('

                                                          \n \n
                                                          ');return o.call(this,t,e)||this}t.default=i},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(26)),a=o(n(70)),l=o(n(17));(0,i.default)(t,"__esModule",{value:!0});var u=n(2).__importDefault(n(3));t.default=function(o){var e=o.config.emotions;return{width:300,height:230,tabs:(0,r.default)(e).call(e,function(e){return{title:o.i18next.t("menus.panelMenus.emoticon."+e.title),tpl:"
                                                          "+(n=[],(n="image"==(t=e).type?(n=(0,r.default)(e=t.content).call(e,function(e){return"string"==typeof e?"":'\n ['+e.alt+']\n '}),(0,a.default)(n).call(n,function(e){return""!==e})):(0,r.default)(t=t.content).call(t,function(e){return''+e+""})).join("").replace(/ /g,""))+"
                                                          ",events:[{selector:".eleImg",type:"click",fn:function(e){var t=u.default(e.target);return t="IMG"===t.getNodeName()?(0,l.default)(e=t.parent().html()).call(e):""+t.html()+"",o.cmd.do("insertHTML",t),!0}}]};var t,n})}}},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0}),t.createListHandle=t.ClassType=void 0;var o,i=n(2),r=i.__importDefault(n(3)),a=i.__importDefault(n(372)),l=i.__importDefault(n(374)),u=i.__importDefault(n(375)),s=i.__importDefault(n(376)),i=i.__importDefault(n(377));(n=o=t.ClassType||(t.ClassType={})).Wrap="WrapListHandle",n.Join="JoinListHandle",n.StartJoin="StartJoinListHandle",n.EndJoin="EndJoinListHandle",n.Other="OtherListHandle";var c={WrapListHandle:a.default,JoinListHandle:l.default,StartJoinListHandle:u.default,EndJoinListHandle:s.default,OtherListHandle:i.default};t.createListHandle=function(e,t,n){if(e===o.Other&&void 0===n)throw new Error("other 类需要传入 range");return e!==o.Other?new c[e](t):new c[e](t,n)};f.prototype.getSelectionRangeElem=function(){return r.default(this.handle.selectionRangeElem.get())},i=f;function f(e){this.handle=e,this.handle.exec()}t.default=i},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),A=o(n(4));(0,i.default)(t,"__esModule",{value:!0});var r,o=n(2),v=o.__importDefault(n(3)),i=n(58),m=n(47),o=(r=i.ListHandle,o.__extends(a,r),a.prototype.exec=function(){var t,e=this.options,n=e.listType,o=e.listTarget,i=e.$selectionElem,r=e.$startElem,a=e.$endElem,l=[],u=null==i?void 0:i.getNodeName(),e=r.prior,s=a.prior;if((r.prior||a.prior)&&(null!=e&&e.prev().length||null!=s&&s.next().length)){for(var c=e;c.length;)l.push(c),c=null!=s&&s.equal(c)?v.default(void 0):c.next();var e=e.prev(),f=s.next();if(u===n?t=m.createElementFragment(l,m.createDocumentFragment(),"p"):(t=m.createElement(o),(0,A.default)(l).call(l,function(e){t.append(e.elems[0])})),e.length&&f.length){for(var d=[];f.length;)d.push(f),f=f.next();var p,h=m.createElement(u);(0,A.default)(d).call(d,function(e){h.append(e.elems[0])}),v.default(h).insertAfter(i),this.selectionRangeElem.set(t),(p=i.next()).length?m.insertBefore(i,t,p.elems[0]):i.parent().elems[0].append(t)}else e.length?(this.selectionRangeElem.set(t),(p=i.next()).length?m.insertBefore(i,t,p.elems[0]):i.parent().elems[0].append(t)):(this.selectionRangeElem.set(t),m.insertBefore(i,t,i.elems[0]))}else(0,A.default)(p=null==i?void 0:i.children()).call(p,function(e){l.push(v.default(e))}),u===n?t=m.createElementFragment(l,m.createDocumentFragment(),"p"):(t=m.createElement(o),(0,A.default)(l).call(l,function(e){t.appendChild(e.elems[0])})),this.selectionRangeElem.set(t),m.insertBefore(i,t,i.elems[0]),i.remove()},a);function a(e){return r.call(this,e)||this}t.default=o},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(4));(0,i.default)(t,"__esModule",{value:!0});a.prototype.set=function(e){var t,n;e instanceof DocumentFragment&&(n=[],(0,r.default)(t=e.childNodes).call(t,function(e){n.push(e)}),e=n),this._element=e},a.prototype.get=function(){return this._element},a.prototype.clear=function(){this._element=null},i=a;function a(){this._element=null}t.default=i},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),m=o(n(4));(0,i.default)(t,"__esModule",{value:!0});var r,o=n(2),g=o.__importDefault(n(3)),i=n(58),y=n(47),o=(r=i.ListHandle,o.__extends(a,r),a.prototype.exec=function(){var t,e=this.options,n=e.editor,o=e.listType,i=e.listTarget,r=e.$startElem,e=e.$endElem,a=n.selection.getSelectionRangeTopNodes(),n=null==r?void 0:r.getNodeName();if(n===(null==e?void 0:e.getNodeName()))if(2\n \n '),o={width:100,title:"设置行高",type:"list",list:new u.default(t,t.config.lineHeights).getItemList(),clickHandler:function(e){t.selection.saveRange(),n.command(e)}};return n=l.call(this,e,t,o)||this}t.default=o},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(4));(0,i.default)(t,"__esModule",{value:!0});var a=n(2).__importDefault(n(3)),n=(l.prototype.getItemList=function(){return this.itemList},l);function l(e,t){var n=this;this.itemList=[{$elem:a.default(""+e.i18next.t("默认")+""),value:""}],(0,r.default)(t).call(t,function(e){n.itemList.push({$elem:a.default(""+e+""),value:e})})}t.default=n},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o,i=n(2),r=i.__importDefault(n(3)),n=i.__importDefault(n(23)),i=(o=n.default,i.__extends(a,o),a.prototype.clickHandler=function(){var e=this.editor;e.history.revoke();var t=e.$textElem.children();null!=t&&t.length&&(t=t.last(),e.selection.createRangeByElem(t,!1,!0),e.selection.restoreSelection())},a.prototype.tryChangeActive=function(){this.editor.isCompatibleMode||(this.editor.history.size[0]?this.active():this.unActive())},a);function a(e){var t=r.default('
                                                          \n \n
                                                          ');return o.call(this,t,e)||this}t.default=i},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o,i=n(2),r=i.__importDefault(n(3)),n=i.__importDefault(n(23)),i=(o=n.default,i.__extends(a,o),a.prototype.clickHandler=function(){var e=this.editor;e.history.restore();var t=e.$textElem.children();null!=t&&t.length&&(t=t.last(),e.selection.createRangeByElem(t,!1,!0),e.selection.restoreSelection())},a.prototype.tryChangeActive=function(){this.editor.isCompatibleMode||(this.editor.history.size[1]?this.active():this.unActive())},a);function a(e){var t=r.default('
                                                          \n \n
                                                          ');return o.call(this,t,e)||this}t.default=i},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o,i=n(2),r=i.__importDefault(n(38)),a=i.__importDefault(n(3)),l=i.__importDefault(n(383)),u=i.__importDefault(n(33)),s=i.__importDefault(n(392)),i=(o=r.default,i.__extends(c,o),c.prototype.clickHandler=function(){this.createPanel()},c.prototype.createPanel=function(){var e=l.default(this.editor);new u.default(this,e).create()},c.prototype.tryChangeActive=function(){},c);function c(e){var t=a.default('
                                                          '),n=o.call(this,t,e)||this;return s.default(e),n}t.default=i},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(384));(0,i.default)(t,"__esModule",{value:!0});var i=n(2),l=n(6),u=i.__importDefault(n(3));n(389);var s=i.__importDefault(n(391));function c(e){return 0\n
                                                          \n '+a("创建")+'\n \n '+a(t+"行")+'\n \n '+(a(t+"列")+a(t+"的")+a(t+"表格"))+'\n
                                                          \n
                                                          \n \n
                                                          \n ",events:[{selector:"#"+e,type:"click",fn:function(){var e=Number(u.default("#"+i).val()),t=Number(u.default("#"+r).val());return c(t)&&c(e)?(o.createAction(t,e),!0):(n.config.customAlert("表格行列请输入正整数","warning"),!1)},bindEnter:!0}]}];return(e={width:330,height:0,tabs:[]}).tabs.push(a[0]),e}},function(e,t,n){e.exports=n(385)},function(e,t,n){n=n(386);e.exports=n},function(e,t,n){n(387);n=n(9);e.exports=n.Number.isInteger},function(e,t,n){n(5)({target:"Number",stat:!0},{isInteger:n(388)})},function(e,t,n){var o=n(13),i=Math.floor;e.exports=function(e){return!o(e)&&isFinite(e)&&i(e)===e}},function(e,t,n){var o=n(20),i=n(390);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);n={insert:"head",singleton:!1},o(i,n);e.exports=i.locals||{}},function(e,t,n){(t=n(21)(!1)).push([e.i,".w-e-table {\n display: flex;\n}\n.w-e-table .w-e-table-input {\n width: 40px;\n text-align: center!important;\n margin: 0 5px;\n}\n",""]),e.exports=t},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o=n(2),a=n(7),r=o.__importDefault(n(3)),n=(i.prototype.createAction=function(e,t){var n=this.editor,o=r.default(n.selection.getSelectionContainerElem()),i=r.default(o.elems[0]).parentUntilEditor("UL",n),o=r.default(o.elems[0]).parentUntilEditor("OL",n);i||o||(t=this.createTableHtml(e,t),n.cmd.do("insertHTML",t))},i.prototype.createTableHtml=function(e,t){for(var n="",o="",i=0;i":"";n=n+""+o+""}return''+n+"
                                                          "+a.EMPTY_P},i);function i(e){this.editor=e}t.default=n},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o=n(2).__importDefault(n(393)),i=n(400);t.default=function(e){o.default(e),i.bindEventKeyboardEvent(e),i.bindClickEvent(e)}},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o=n(2),l=o.__importDefault(n(3)),i=o.__importDefault(n(39)),u=o.__importDefault(n(394)),r=o.__importDefault(n(399)),s=n(7);function a(n){var o;return{showTableTooltip:function(e){var a=new r.default(n),t=function(e,t){return void 0===t&&(t="menus.panelMenus.table."),n.i18next.t(t+e)},t=[{$elem:l.default(""+t("删除表格")+""),onClick:function(e,t){return e.selection.createRangeByElem(t),e.selection.restoreSelection(),e.cmd.do("insertHTML",s.EMPTY_P),!0}},{$elem:l.default(""+t("添加行")+""),onClick:function(e,t){if(c(e))return!0;var n=l.default(e.selection.getSelectionStartElem()),o=a.getRowNode(n.elems[0]);if(!o)return!0;n=Number(a.getCurrentRowIndex(t.elems[0],o)),o=a.getTableHtml(t.elems[0]),n=f(t,n=a.getTableHtml(u.default.ProcessingRow(l.default(o),n).elems[0]));return e.selection.createRangeByElem(t),e.selection.restoreSelection(),e.cmd.do("insertHTML",n),!0}},{$elem:l.default(""+t("删除行")+""),onClick:function(e,t){if(c(e))return!0;var n=l.default(e.selection.getSelectionStartElem()),o=a.getRowNode(n.elems[0]);if(!o)return!0;var i=Number(a.getCurrentRowIndex(t.elems[0],o)),r=a.getTableHtml(t.elems[0]),n=u.default.DeleteRow(l.default(r),i).elems[0].children[0].children.length,o="";return e.selection.createRangeByElem(t),e.selection.restoreSelection(),o=f(t,o=0===n?s.EMPTY_P:a.getTableHtml(u.default.DeleteRow(l.default(r),i).elems[0])),e.cmd.do("insertHTML",o),!0}},{$elem:l.default(""+t("添加列")+""),onClick:function(e,t){if(c(e))return!0;var n=l.default(e.selection.getSelectionStartElem()),o=a.getCurrentColIndex(n.elems[0]),n=a.getTableHtml(t.elems[0]),o=f(t,o=a.getTableHtml(u.default.ProcessingCol(l.default(n),o).elems[0]));return e.selection.createRangeByElem(t),e.selection.restoreSelection(),e.cmd.do("insertHTML",o),!0}},{$elem:l.default(""+t("删除列")+""),onClick:function(e,t){if(c(e))return!0;var n=l.default(e.selection.getSelectionStartElem()),o=a.getCurrentColIndex(n.elems[0]),i=a.getTableHtml(t.elems[0]),n=u.default.DeleteCol(l.default(i),o),i=n.elems[0].children[0].children[0].children.length,o="";return e.selection.createRangeByElem(t),e.selection.restoreSelection(),o=f(t,o=0===i?s.EMPTY_P:a.getTableHtml(n.elems[0])),e.cmd.do("insertHTML",o),!0}},{$elem:l.default(""+t("设置表头")+""),onClick:function(e,t){if(c(e))return!0;var n=l.default(e.selection.getSelectionStartElem()),o=a.getRowNode(n.elems[0]);if(!o)return!0;n=Number(a.getCurrentRowIndex(t.elems[0],o));0!==n&&(n=0);o=a.getTableHtml(t.elems[0]),n=f(t,n=a.getTableHtml(u.default.setTheHeader(l.default(o),n,"th").elems[0]));return e.selection.createRangeByElem(t),e.selection.restoreSelection(),e.cmd.do("insertHTML",n),!0}},{$elem:l.default(""+t("取消表头")+""),onClick:function(e,t){var n=l.default(e.selection.getSelectionStartElem()),o=a.getRowNode(n.elems[0]);if(!o)return!0;n=Number(a.getCurrentRowIndex(t.elems[0],o));0!==n&&(n=0);o=a.getTableHtml(t.elems[0]),n=f(t,n=a.getTableHtml(u.default.setTheHeader(l.default(o),n,"td").elems[0]));return e.selection.createRangeByElem(t),e.selection.restoreSelection(),e.cmd.do("insertHTML",n),!0}}];(o=new i.default(n,e,t)).create()},hideTableTooltip:function(){o&&(o.remove(),o=null)}}}function c(e){var t=e.selection.getSelectionStartElem(),e=e.selection.getSelectionEndElem();return(null==t?void 0:t.elems[0])!==(null==e?void 0:e.elems[0])}function f(e,t){e=e.elems[0].nextSibling;return e&&"
                                                          "!==e.innerHTML||(t+=""+s.EMPTY_P),t}t.default=function(e){var t=(n=a(e)).showTableTooltip,n=n.hideTableTooltip;e.txt.eventHooks.tableClickEvents.push(t),e.txt.eventHooks.clickEvents.push(n),e.txt.eventHooks.keyupEvents.push(n),e.txt.eventHooks.toolbarClickEvents.push(n),e.txt.eventHooks.menuClickEvents.push(n),e.txt.eventHooks.textScrollEvents.push(n)}},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),l=o(n(45)),u=o(n(91)),s=o(n(4)),c=o(n(138));(0,i.default)(t,"__esModule",{value:!0});var f=n(2).__importDefault(n(3));function d(e,t){for(;0!==e.children.length;)e.removeChild(e.children[0]);for(var n=0;n'+l.default(e).html()+""},u);function u(e){this.editor=e}t.default=n},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0}),t.bindEventKeyboardEvent=t.bindClickEvent=void 0;var i=n(2).__importDefault(n(3));t.bindClickEvent=function(o){o.txt.eventHooks.tableClickEvents.push(function(e,t){var n;3<=t.detail&&((n=window.getSelection())&&(t=n.focusNode,n=n.anchorNode,n=i.default(null==n?void 0:n.parentElement),e.isContain(i.default(t))||(t="TD"===n.elems[0].tagName?n:n.parentUntilEditor("td",o))&&(null!=(n=o.selection.getRange())&&n.setEnd(t.elems[0],t.elems[0].childNodes.length),o.selection.restoreSelection())))})},t.bindEventKeyboardEvent=function(o){var e=o.txt,i=o.selection;e.eventHooks.keydownEvents.push(function(e){o.selection.saveRange();var t,n=i.getSelectionContainerElem();!n||(n=(t=n.getNodeTop(o)).length&&t.prev().length?t.prev():null)&&"TABLE"===n.getNodeName()&&i.isSelectionEmpty()&&0===i.getCursorPos()&&8===e.keyCode&&(!!(n=t.next()).length&&function(e){if(e.length){e=e.elems[0];return"P"===e.nodeName&&"
                                                          "===e.innerHTML}}(t)&&(t.remove(),o.selection.setRangeToElem(n.elems[0])),e.preventDefault())})}},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),a=o(n(26));(0,i.default)(t,"__esModule",{value:!0}),t.formatCodeHtml=void 0;var o=n(2),i=o.__importDefault(n(38)),r=o.__importDefault(n(3)),l=n(6),u=o.__importDefault(n(402)),s=o.__importDefault(n(139)),c=o.__importDefault(n(33)),f=o.__importDefault(n(403));t.formatCodeHtml=function(e,t){return t&&(t=function e(t){var n;var o=t.match(//gm);if(!o||!o.length)return t;var i=(0,a.default)(n=l.deepClone(o)).call(n,function(e){return(e=e.replace(/]+>/,"")).replace(/<\/span>/,"")});for(var r=0;r/g))||(0,a.default)(o).call(o,function(e){n=n.replace(e,e.replace(/<\/code>/g,"\n").replace(/
                                                          /g,""))}),t=n,t=l.replaceSpecialSymbol(t));var n,o};var d,o=(d=i.default,o.__extends(p,d),p.prototype.insertLineCode=function(e){var t=this.editor,e=r.default(""+e+"");t.cmd.do("insertElem",e),t.selection.createRangeByElem(e,!1),t.selection.restoreSelection()},p.prototype.clickHandler=function(){var e=this.editor,t=e.selection.getSelectionText();this.isActive||(e.selection.isSelectionEmpty()?this.createPanel("",""):this.insertLineCode(t))},p.prototype.createPanel=function(e,t){t=u.default(this.editor,e,t);new c.default(this,t).create()},p.prototype.tryChangeActive=function(){var e=this.editor;s.default(e)?this.active():this.unActive()},p);function p(e){var t=r.default('
                                                          '),n=d.call(this,t,e)||this;return f.default(e),n}t.default=o},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),s=o(n(26));(0,i.default)(t,"__esModule",{value:!0});var i=n(2),c=n(6),f=i.__importDefault(n(3)),d=i.__importDefault(n(139)),p=n(7);t.default=function(o,e,t){var n,i=c.getRandom("input-iframe"),r=c.getRandom("select"),a=c.getRandom("btn-ok");function l(e,t){var n;d.default(o)&&function(){if(!d.default(o))return;var e=o.selection.getSelectionStartElem(),e=null==e?void 0:e.getNodeTop(o);if(!e)return;o.selection.createRangeByElem(e),o.selection.restoreSelection(),0}(),(null===(n=o.selection.getSelectionStartElem())||void 0===n?void 0:n.elems[0].innerHTML)&&o.cmd.do("insertHTML",p.EMPTY_P);t=t.replace(//g,">");o.highlight&&(t=o.highlight.highlightAuto(t).value),o.cmd.do("insertHTML",'
                                                          '+t+"
                                                          ");t=o.selection.getSelectionStartElem(),t=null==t?void 0:t.getNodeTop(o);0===(null==t?void 0:t.getNextSibling().elems.length)&&f.default(p.EMPTY_P).insertAfter(t)}function u(e){return o.i18next.t(e)}return{width:500,height:0,tabs:[{title:u("menus.panelMenus.code.插入代码"),tpl:'
                                                          \n \n \n
                                                          \n \n
                                                          \n
                                                          ",events:[{selector:"#"+a,type:"click",fn:function(){var e=document.getElementById(i),t=f.default("#"+r).val(),e=e.value;if(e)return!d.default(o)&&(l(t,e),!0)}}]}]}}},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o=n(2),i=o.__importDefault(n(404)),r=o.__importDefault(n(405));t.default=function(e){i.default(e),r.default(e)}},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0}),t.createShowHideFn=void 0;var o=n(2),r=o.__importDefault(n(3)),a=o.__importDefault(n(39));function i(o){var i;return{showCodeTooltip:function(e){var t,n=[{$elem:r.default(""+(n="删除代码",void 0===t&&(t="menus.panelMenus.code."),o.i18next.t(t+n))+""),onClick:function(e,t){return t.remove(),!0}}];(i=new a.default(o,e,n)).create()},hideCodeTooltip:function(){i&&(i.remove(),i=null)}}}t.createShowHideFn=i,t.default=function(e){var t=(n=i(e)).showCodeTooltip,n=n.hideCodeTooltip;e.txt.eventHooks.codeClickEvents.push(t),e.txt.eventHooks.clickEvents.push(n),e.txt.eventHooks.toolbarClickEvents.push(n),e.txt.eventHooks.menuClickEvents.push(n),e.txt.eventHooks.textScrollEvents.push(n)}},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o=n(2),a=n(7),l=o.__importDefault(n(3));t.default=function(o){var i=o.$textElem,r=o.selection,e=o.txt.eventHooks.keydownEvents;e.push(function(e){var t;40===e.keyCode&&(t=r.getSelectionContainerElem(),e=null===(e=i.children())||void 0===e?void 0:e.last(),"XMP"===(null==t?void 0:t.elems[0].tagName)&&"PRE"===(null==e?void 0:e.elems[0].tagName)&&(e=l.default(a.EMPTY_P),i.append(e)))}),e.push(function(e){o.selection.saveRange();var t,n=r.getSelectionContainerElem();n&&(n=null==(t=n.getNodeTop(o))?void 0:t.prev(),t=null==t?void 0:t.getNextSibling(),n.length&&"PRE"===(null==n?void 0:n.getNodeName())&&0===t.length&&0===r.getCursorPos()&&8===e.keyCode&&(e=l.default(a.EMPTY_P),i.append(e)))})}},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o,i=n(2),r=i.__importDefault(n(23)),a=i.__importDefault(n(3)),l=i.__importDefault(n(407)),u=n(6),s=n(7),i=(o=r.default,i.__extends(c,o),c.prototype.clickHandler=function(){var e,t=this.editor,n=t.selection.getRange(),o=t.selection.getSelectionContainerElem();null!=o&&o.length&&(t=(e=a.default(o.elems[0])).parentUntil("TABLE",o.elems[0]),o=e.children(),"CODE"!==e.getNodeName()&&(t&&"TABLE"===a.default(t.elems[0]).getNodeName()||(!o||0===o.length||"IMG"!==a.default(o.elems[0]).getNodeName()||null!=n&&n.collapsed)&&this.createSplitLine()))},c.prototype.createSplitLine=function(){var e="
                                                          "+s.EMPTY_P;u.UA.isFirefox&&(e="

                                                          "),this.editor.cmd.do("insertHTML",e)},c.prototype.tryChangeActive=function(){},c);function c(e){var t=a.default('
                                                          '),n=o.call(this,t,e)||this;return l.default(e),n}t.default=i},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o=n(2).__importDefault(n(408));t.default=function(e){o.default(e)}},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o=n(2),i=o.__importDefault(n(3)),r=o.__importDefault(n(39));function a(n){var o;return{showSplitLineTooltip:function(e){var t=[{$elem:i.default(""+n.i18next.t("menus.panelMenus.删除")+""),onClick:function(e,t){return e.selection.createRangeByElem(t),e.selection.restoreSelection(),e.cmd.do("delete"),!0}}];(o=new r.default(n,e,t)).create()},hideSplitLineTooltip:function(){o&&(o.remove(),o=null)}}}t.default=function(e){var t=(n=a(e)).showSplitLineTooltip,n=n.hideSplitLineTooltip;e.txt.eventHooks.splitLineEvents.push(t),e.txt.eventHooks.clickEvents.push(n),e.txt.eventHooks.keyupEvents.push(n),e.txt.eventHooks.toolbarClickEvents.push(n),e.txt.eventHooks.menuClickEvents.push(n),e.txt.eventHooks.textScrollEvents.push(n)}},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(4));(0,i.default)(t,"__esModule",{value:!0});var a,o=n(2),l=o.__importDefault(n(3)),i=o.__importDefault(n(23)),u=n(98),s=o.__importDefault(n(415)),c=o.__importDefault(n(140)),o=(a=i.default,o.__extends(f,a),f.prototype.clickHandler=function(){var e=this.editor;u.isAllTodo(e)?(this.cancelTodo(),this.tryChangeActive()):this.setTodo()},f.prototype.tryChangeActive=function(){u.isAllTodo(this.editor)?this.active():this.unActive()},f.prototype.setTodo=function(){var o=this.editor,e=o.selection.getSelectionRangeTopNodes();(0,r.default)(e).call(e,function(e){var t,n;"P"===(null==e?void 0:e.getNodeName())&&(n=null===(n=(t=c.default(e).getTodo()).children())||void 0===n?void 0:n.getNode(),t.insertAfter(e),o.selection.moveCursor(n),e.remove())}),this.tryChangeActive()},f.prototype.cancelTodo=function(){var o=this.editor,e=o.selection.getSelectionRangeTopNodes();(0,r.default)(e).call(e,function(e){var t=null===(n=null===(t=e.childNodes())||void 0===t?void 0:t.childNodes())||void 0===n?void 0:n.clone(!0),n=l.default("

                                                          ");n.append(t),n.insertAfter(e),null!==(t=n.childNodes())&&void 0!==t&&t.get(0).remove(),o.selection.moveCursor(n.getNode()),e.remove()})},f);function f(e){var t=l.default('
                                                          \n \n
                                                          '),n=a.call(this,t,e)||this;return s.default(e),n}t.default=o},function(e,t,n){e.exports=n(411)},function(e,t,n){n=n(412);e.exports=n},function(e,t,n){var o=n(413),i=Array.prototype;e.exports=function(e){var t=e.every;return e===i||e instanceof Array&&t===i.every?o:t}},function(e,t,n){n(414);n=n(15);e.exports=n("Array").every},function(e,t,n){"use strict";var o=n(5),i=n(32).every,r=n(67),n=n(22),r=r("every"),n=n("every");o({target:"Array",proto:!0,forced:!r||!n},{every:function(e,t){return i(this,e,1")),p.insertAfter(u),f&&""!==(null==f?void 0:f.textContent)?l.moveCursor(d):("BR"!==(null==f?void 0:f.nodeName)&&v.default("
                                                          ").insertAfter(e),l.moveCursor(d,1))}}),h.txt.eventHooks.deleteUpEvents.push(function(){var e=h.selection.getSelectionRangeTopNodes()[0];e&&y.isTodo(e)&&""===e.text()&&(v.default(w.EMPTY_P).insertAfter(e),e.remove())}),h.txt.eventHooks.deleteDownEvents.push(function(e){if(m.isAllTodo(h)){var t=h.selection,n=t.getSelectionRangeTopNodes()[0],o=null===(l=n.childNodes())||void 0===l?void 0:l.getNode(),i=v.default("

                                                          "),r=i.getNode(),a=null===(u=window.getSelection())||void 0===u?void 0:u.anchorNode,l=t.getCursorPos(),u=a.previousSibling;if(""===n.text()){e.preventDefault();a=v.default(w.EMPTY_P);return a.insertAfter(n),n.remove(),void t.moveCursor(a.getNode(),0)}"SPAN"===(null==u?void 0:u.nodeName)&&"INPUT"===u.childNodes[0].nodeName&&0===l&&(e.preventDefault(),null!=o&&(0,A.default)(o=o.childNodes).call(o,function(e,t){0!==t&&r.appendChild(e.cloneNode(!0))}),i.insertAfter(n),n.remove())}}),h.txt.eventHooks.clickEvents.push(function(e){e&&e.target instanceof HTMLInputElement&&"checkbox"===e.target.type&&(e.target.checked?e.target.setAttribute("checked","true"):e.target.removeAttribute("checked"))})}},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0}),t.selectorValidator=void 0;var o=n(2),s=o.__importDefault(n(3)),c=n(6),f=n(7),d=o.__importDefault(n(130)),p="1px solid #c9d8db",h="#FFF",A="1px solid #EEE";t.default=function(e){var t=e.toolbarSelector,n=s.default(t),o=e.textSelector,i=e.config.height,r=e.i18next,a=s.default("
                                                          "),l=s.default("
                                                          "),t=null;null==o?(u=n.children(),n.append(a).append(l),a.css("background-color",h).css("border",p).css("border-bottom",A),l.css("border",p).css("border-top","none").css("height",i+"px")):(n.append(a),t=s.default(o).children(),s.default(o).append(l),u=l.children()),(n=s.default("
                                                          ")).attr("contenteditable","true").css("width","100%").css("height","100%"),(o=(o=e.config.placeholder)!==d.default.placeholder?s.default("
                                                          "+o+"
                                                          "):s.default("
                                                          "+r.t(o)+"
                                                          ")).addClass("placeholder"),u&&u.length?(n.append(u),o.hide()):n.append(s.default(f.EMPTY_P)),t&&t.length&&(n.append(t),o.hide()),l.append(n),l.append(o),a.addClass("w-e-toolbar").css("z-index",e.zIndex.get("toolbar")),l.addClass("w-e-text-container"),l.css("z-index",e.zIndex.get()),n.addClass("w-e-text");var u=c.getRandom("toolbar-elem");a.attr("id",u),t=c.getRandom("text-elem"),n.attr("id",t),(o=l.getBoundingClientRect().height)!==n.getBoundingClientRect().height&&n.css("min-height",o+"px"),e.$toolbarElem=a,e.$textContainerElem=l,e.$textElem=n,e.toolbarElemId=u,e.textElemId=t},t.selectorValidator=function(e){var t="data-we-id",n=/^wangEditor-\d+$/,o=e.textSelector,i=e.toolbarSelector,r={bar:s.default("
                                                          "),text:s.default("
                                                          ")};if(null==i)throw new Error("错误:初始化编辑器时候未传入任何参数,请查阅文档");if(r.bar=s.default(i),!r.bar.elems.length)throw new Error("无效的节点选择器:"+i);if(n.test(r.bar.attr(t)))throw new Error("初始化节点已存在编辑器实例,无法重复创建编辑器");if(o){if(r.text=s.default(o),!r.text.elems.length)throw new Error("无效的节点选择器:"+o);if(n.test(r.text.attr(t)))throw new Error("初始化节点已存在编辑器实例,无法重复创建编辑器")}r.bar.attr(t,e.id),r.text.attr(t,e.id),e.beforeDestroy(function(){r.bar.removeAttr(t),r.text.removeAttr(t)})}},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var a=n(2).__importDefault(n(3)),l=n(7);t.default=function e(t,n){var o=t.$textElem,i=o.children();if(!i||!i.length)return o.append(a.default(l.EMPTY_P)),void e(t);var r=i.last();if(n&&(i=r.html().toLowerCase(),n=r.getNodeName(),"
                                                          "!==i&&"
                                                          "!==i||"P"!==n))return o.append(a.default(l.EMPTY_P)),void e(t);t.selection.createRangeByElem(r,!1,!0),t.config.focus?t.selection.restoreSelection():t.selection.clearWindowSelectionRange()}},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(4));(0,i.default)(t,"__esModule",{value:!0});var a=n(2).__importDefault(n(3));function l(e){(0,e.config.onfocus)(e.txt.html()||"")}t.default=function(e){var n,t;(n=e).txt.eventHooks.changeEvents.push(function(){var e,t=n.config.onchange;t&&(e=n.txt.html()||"",n.isFocus=!0,t(e)),n.txt.togglePlaceholder()}),function(i){function e(e){var t=e.target,n=a.default(t),o=i.$textElem,t=i.$toolbarElem,o=o.isContain(n),n=t.isContain(n),e=t.elems[0]==e.target;o?(i.isFocus||l(i),i.isFocus=!0):n&&!e||!i.isFocus||(n=(o=i).config.onblur,e=o.txt.html()||"",(0,r.default)(o=o.txt.eventHooks.onBlurEvents).call(o,function(e){return e()}),n(e),i.isFocus=!1)}i.isFocus=!1,document.activeElement===i.$textElem.elems[0]&&i.config.focus&&(l(i),i.isFocus=!0);a.default(document).on("click",e),i.beforeDestroy(function(){a.default(document).off("click",e)})}(e),(t=e).$textElem.on("compositionstart",function(){t.isComposing=!0,t.txt.togglePlaceholder()}).on("compositionend",function(){t.isComposing=!1,t.txt.togglePlaceholder()})}},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0}),t.default=function(e){var t=e.config,n=t.lang,o=t.languages;if(null==e.i18next)e.i18next={t:function(e){e=e.split(".");return e[e.length-1]}};else try{e.i18next.init({ns:"wangEditor",lng:n,defaultNS:"wangEditor",resources:o})}catch(e){throw new Error("i18next:"+e)}}},function(e,o,t){"use strict";var n=t(0),i=n(t(1)),r=n(t(29));(0,i.default)(o,"__esModule",{value:!0}),o.setUnFullScreen=o.setFullScreen=void 0;var a=t(2).__importDefault(t(3));t(421);var l="w-e-icon-fullscreen",u="w-e-icon-fullscreen_exit",s="w-e-full-screen-editor";o.setFullScreen=function(e){var t=a.default(e.toolbarSelector),n=e.$textContainerElem,o=e.$toolbarElem,i=(0,r.default)(o).call(o,"i."+l),e=e.config;i.removeClass(l),i.addClass(u),t.addClass(s),t.css("z-index",e.zIndexFullScreen);o=o.getBoundingClientRect();n.css("height","calc(100% - "+o.height+"px)")},o.setUnFullScreen=function(e){var t=a.default(e.toolbarSelector),n=e.$textContainerElem,o=e.$toolbarElem,o=(0,r.default)(o).call(o,"i."+u),e=e.config;o.removeClass(u),o.addClass(l),t.removeClass(s),t.css("z-index","auto"),n.css("height",e.height+"px")};o.default=function(t){var e,n;t.textSelector||t.config.showFullScreen&&(e=t.$toolbarElem,(n=a.default('
                                                          \n \n
                                                          ')).on("click",function(e){(0,r.default)(e=a.default(e.currentTarget)).call(e,"i").hasClass(l)?(n.attr("data-title","取消全屏"),o.setFullScreen(t)):(n.attr("data-title","全屏"),o.setUnFullScreen(t))}),e.append(n))}},function(e,t,n){var o=n(20),i=n(422);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);n={insert:"head",singleton:!1},o(i,n);e.exports=i.locals||{}},function(e,t,n){(t=n(21)(!1)).push([e.i,".w-e-full-screen-editor {\n position: fixed;\n width: 100%!important;\n height: 100%!important;\n left: 0;\n top: 0;\n}\n",""]),e.exports=t},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(29));(0,i.default)(t,"__esModule",{value:!0});t.default=function(e,t){var n=e.isEnable?e.$textElem:(0,r.default)(n=e.$textContainerElem).call(n,".w-e-content-mantle"),t=(0,r.default)(n).call(n,"[id='"+t+"']").getOffsetData().top;n.scrollTop(t)}},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o=n(2).__importDefault(n(129)),i={menu:2,panel:2,toolbar:1,tooltip:1,textContainer:1},n=(r.prototype.get=function(e){return e&&this.tier[e]?this.baseZIndex+this.tier[e]:this.baseZIndex},r.prototype.init=function(e){this.baseZIndex==o.default.zIndex&&(this.baseZIndex=e.config.zIndex)},r);function r(){this.tier=i,this.baseZIndex=o.default.zIndex}t.default=n},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),a=o(n(70)),r=o(n(4));(0,i.default)(t,"__esModule",{value:!0});var o=n(2),i=o.__importDefault(n(426)),l=n(6),u=n(7);var s,o=(s=i.default,o.__extends(c,s),c.prototype.save=function(){this.data.length&&(this.editor.history.save(this.data),this.data.length=0,this.emit())},c.prototype.emit=function(){var e;(0,r.default)(e=this.editor.txt.eventHooks.changeEvents).call(e,function(e){return e()})},c.prototype.observe=function(){var e=this;s.prototype.observe.call(this,this.editor.$textElem.elems[0]);var t=this.editor.config.onchangeTimeout;this.asyncSave=l.debounce(function(){e.save()},t),this.editor.isCompatibleMode||this.editor.$textElem.on("compositionend",function(){e.asyncSave()})},c);function c(i){var r=s.call(this,function(e,t){var n,o;if(n=e,o=t.target,e=(0,a.default)(n).call(n,function(e){var t=e.type,n=e.target,e=e.attributeName;return"attributes"!=t||"attributes"==t&&("contenteditable"==e||n!=o)}),(n=r.data).push.apply(n,e),i.isCompatibleMode)r.asyncSave();else if(!i.isComposing)return r.asyncSave()})||this;return r.editor=i,r.data=[],r.asyncSave=u.EMPTY_FN,r}t.default=o},function(e,t,n){"use strict";n=n(0)(n(1));(0,n.default)(t,"__esModule",{value:!0});(0,n.default)(o.prototype,"target",{get:function(){return this.node},enumerable:!1,configurable:!0}),o.prototype.observe=function(e){this.node instanceof Node||(this.node=e,this.connect())},o.prototype.connect=function(){if(this.node)return this.observer.observe(this.node,this.options),this;throw new Error("还未初始化绑定,请您先绑定有效的 Node 节点")},o.prototype.disconnect=function(){var e=this.observer.takeRecords();e.length&&this.callback(e),this.observer.disconnect()},n=o;function o(t,e){var n=this;this.options={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,characterData:!0,characterDataOldValue:!0},this.callback=function(e){t(e,n)},this.observer=new MutationObserver(this.callback),e&&(this.options=e)}t.default=n},function(e,t,n){"use strict";var o=n(0)(n(1));(0,o.default)(t,"__esModule",{value:!0});var i=n(2),r=i.__importDefault(n(428)),a=i.__importDefault(n(435)),l=i.__importDefault(n(436)),o=((0,o.default)(u.prototype,"size",{get:function(){return this.scroll.size},enumerable:!1,configurable:!0}),u.prototype.observe=function(){this.content.observe(),this.scroll.observe(),this.editor.isCompatibleMode||this.range.observe()},u.prototype.save=function(e){e.length&&(this.content.save(e),this.scroll.save(),this.editor.isCompatibleMode||this.range.save())},u.prototype.revoke=function(){this.editor.change.disconnect();var e=this.content.revoke();e&&(this.scroll.revoke(),this.editor.isCompatibleMode||(this.range.revoke(),this.editor.$textElem.focus())),this.editor.change.connect(),e&&this.editor.change.emit()},u.prototype.restore=function(){this.editor.change.disconnect();var e=this.content.restore();e&&(this.scroll.restore(),this.editor.isCompatibleMode||(this.range.restore(),this.editor.$textElem.focus())),this.editor.change.connect(),e&&this.editor.change.emit()},u);function u(e){this.editor=e,this.content=new r.default(e),this.scroll=new a.default(e),this.range=new l.default(e)}t.default=o},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o=n(2),i=o.__importDefault(n(429)),r=o.__importDefault(n(433)),n=(a.prototype.observe=function(){this.editor.isCompatibleMode?this.cache=new r.default(this.editor):this.cache=new i.default(this.editor),this.cache.observe()},a.prototype.save=function(e){this.editor.isCompatibleMode?this.cache.save():this.cache.compile(e)},a.prototype.revoke=function(){var e;return null===(e=this.cache)||void 0===e?void 0:e.revoke()},a.prototype.restore=function(){var e;return null===(e=this.cache)||void 0===e?void 0:e.restore()},a);function a(e){this.editor=e}t.default=n},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o,i=n(2),r=i.__importDefault(n(99)),a=i.__importDefault(n(431)),l=n(432),i=(o=r.default,i.__extends(u,o),u.prototype.observe=function(){this.resetMaxSize(this.editor.config.historyMaxSize)},u.prototype.compile=function(e){return this.save(a.default(e)),this},u.prototype.revoke=function(){return o.prototype.revoke.call(this,function(e){l.revoke(e)})},u.prototype.restore=function(){return o.prototype.restore.call(this,function(e){l.restore(e)})},u);function u(e){var t=o.call(this,e.config.historyMaxSize)||this;return t.editor=e,t}t.default=i},function(e,t,n){"use strict";n=n(0)(n(1));(0,n.default)(t,"__esModule",{value:!0}),t.CeilStack=void 0;o.prototype.resetMax=function(e){e=Math.abs(e),this.reset||isNaN(e)||(this.max=e,this.reset=!0)},(0,n.default)(o.prototype,"size",{get:function(){return this.data.length},enumerable:!1,configurable:!0}),o.prototype.instack=function(e){return this.data.unshift(e),this.max&&this.size>this.max&&(this.data.length=this.max),this},o.prototype.outstack=function(){return this.data.shift()},o.prototype.clear=function(){return this.data.length=0,this},n=o;function o(e){void 0===e&&(e=0),this.data=[],this.max=0,this.reset=!1,(e=Math.abs(e))&&(this.max=e)}t.CeilStack=n},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),u=o(n(4)),s=o(n(27));(0,i.default)(t,"__esModule",{value:!0}),t.compliePosition=t.complieNodes=t.compileValue=t.compileType=void 0;var c=n(6);function f(e){switch(e){case"childList":return"node";case"attributes":return"attr";default:return"text"}}function d(e){switch(e.type){case"attributes":return e.target.getAttribute(e.attributeName)||"";case"characterData":return e.target.textContent;default:return""}}function p(e){var t={};return e.addedNodes.length&&(t.add=c.toArray(e.addedNodes)),e.removedNodes.length&&(t.remove=c.toArray(e.removedNodes)),t}function h(e){e=e.previousSibling?{type:"before",target:e.previousSibling}:e.nextSibling?{type:"after",target:e.nextSibling}:{type:"parent",target:e.target};return e}t.compileType=f,t.compileValue=d,t.complieNodes=p,t.compliePosition=h;var A=["UL","OL","H1","H2","H3","H4","H5","H6"];function v(e,t){for(var n=0,o=t.length-1;0this.max;)this.data.shift();return this.point=this.size-1,this},a.prototype.current=function(){return this.data[this.point]},a.prototype.prev=function(){if(this.isRe||(this.isRe=!0),this.point--,!(this.point<0))return this.current();this.point=0},a.prototype.next=function(){if(this.isRe||(this.isRe=!0),this.point++,!(this.point>=this.size))return this.current();this.point=this.size-1},i=a;function a(){this.data=[],this.max=0,this.point=0,this.isRe=!1}t.TailChain=i},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});var o,i=n(2),n=i.__importDefault(n(99)),i=(o=n.default,i.__extends(r,o),r.prototype.observe=function(){var e=this;this.target=this.editor.$textElem.elems[0],this.editor.$textElem.on("scroll",function(){e.last=e.target.scrollTop}),this.resetMaxSize(this.editor.config.historyMaxSize)},r.prototype.save=function(){return o.prototype.save.call(this,[this.last,this.target.scrollTop]),this},r.prototype.revoke=function(){var t=this;return o.prototype.revoke.call(this,function(e){t.target.scrollTop=e[0]})},r.prototype.restore=function(){var t=this;return o.prototype.restore.call(this,function(e){t.target.scrollTop=e[1]})},r);function r(e){var t=o.call(this,e.config.historyMaxSize)||this;return t.editor=e,t.last=0,t.target=e.$textElem.elems[0],t}t.default=i},function(e,t,n){"use strict";var o=n(0)(n(1));(0,o.default)(t,"__esModule",{value:!0});var i=n(2),r=i.__importDefault(n(99)),a=i.__importDefault(n(3)),l=n(6);function u(e){return{start:[e.startContainer,e.startOffset],end:[e.endContainer,e.endOffset],root:e.commonAncestorContainer,collapsed:e.collapsed}}var s,o=(s=r.default,i.__extends(c,s),(0,o.default)(c.prototype,"rangeHandle",{get:function(){var e=document.getSelection();return e&&e.rangeCount?e.getRangeAt(0):document.createRange()},enumerable:!1,configurable:!0}),c.prototype.observe=function(){var t=this;function e(){var e=t.rangeHandle;t.root!==e.commonAncestorContainer&&!t.root.contains(e.commonAncestorContainer)||t.editor.isComposing||t.updateLastRange()}this.root=this.editor.$textElem.elems[0],this.resetMaxSize(this.editor.config.historyMaxSize),a.default(document).on("selectionchange",e),this.editor.beforeDestroy(function(){a.default(document).off("selectionchange",e)}),t.editor.$textElem.on("keydown",function(e){"Backspace"!=e.key&&"Delete"!=e.key||t.updateLastRange()})},c.prototype.save=function(){var e=u(this.rangeHandle);return s.prototype.save.call(this,[this.lastRange,e]),this.lastRange=e,this},c.prototype.set=function(e){try{if(e){var t=this.rangeHandle;return t.setStart.apply(t,e.start),t.setEnd.apply(t,e.end),this.editor.menus.changeActive(),!0}}catch(e){return!1}return!1},c.prototype.revoke=function(){var t=this;return s.prototype.revoke.call(this,function(e){t.set(e[0])})},c.prototype.restore=function(){var t=this;return s.prototype.restore.call(this,function(e){t.set(e[1])})},c);function c(e){var t=s.call(this,e.config.historyMaxSize)||this;return t.editor=e,t.lastRange=u(document.createRange()),t.root=e.$textElem.elems[0],t.updateLastRange=l.debounce(function(){t.lastRange=u(t.rangeHandle)},e.config.onchangeTimeout),t}t.default=o},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),a=o(n(29));(0,i.default)(t,"__esModule",{value:!0});var l=n(2).__importDefault(n(3));n(438),t.default=function(n){var o,i,r=!1;return n.txt.eventHooks.changeEvents.push(function(){r&&(0,a.default)(o).call(o,".w-e-content-preview").html(n.$textElem.html())}),{disable:function(){var e,t;r||(n.$textElem.hide(),e=n.zIndex.get("textContainer"),t=n.txt.html(),o=l.default('
                                                          \n
                                                          '+t+"
                                                          \n
                                                          "),n.$textContainerElem.append(o),t=n.zIndex.get("menu"),i=l.default('
                                                          '),n.$toolbarElem.append(i),r=!0,n.isEnable=!1)},enable:function(){r&&(o.remove(),i.remove(),n.$textElem.show(),r=!1,n.isEnable=!0)}}}},function(e,t,n){var o=n(20),i=n(439);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);n={insert:"head",singleton:!1},o(i,n);e.exports=i.locals||{}},function(e,t,n){(t=n(21)(!1)).push([e.i,".w-e-content-mantle {\n width: 100%;\n height: 100%;\n overflow-y: auto;\n}\n.w-e-content-mantle .w-e-content-preview {\n width: 100%;\n min-height: 100%;\n padding: 0 10px;\n line-height: 1.5;\n}\n.w-e-content-mantle .w-e-content-preview img {\n cursor: default;\n}\n.w-e-content-mantle .w-e-content-preview img:hover {\n box-shadow: none;\n}\n.w-e-menue-mantle {\n position: absolute;\n height: 100%;\n width: 100%;\n top: 0;\n left: 0;\n}\n",""]),e.exports=t},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0});o.prototype.emit=function(){var e,t=this.editor.config.onSelectionChange;t&&((e=this.editor.selection).saveRange(),e.isSelectionEmpty()||t({text:e.getSelectionText(),html:null===(t=e.getSelectionContainerElem())||void 0===t?void 0:t.elems[0].innerHTML,selection:e}))},n=o;function o(e){var t=this;this.editor=e;function n(){document.activeElement===e.$textElem.elems[0]&&t.emit()}window.document.addEventListener("selectionchange",n),this.editor.beforeDestroy(function(){window.document.removeEventListener("selectionchange",n)})}t.default=n},function(e,t,n){"use strict";var o=n(0),i=o(n(1)),r=o(n(128)),a=o(n(94)),l=o(n(4));(0,i.default)(t,"__esModule",{value:!0}),t.registerPlugin=void 0;var u=n(2).__importDefault(n(87)),s=n(6);t.registerPlugin=function(e,t,n){if(!e)throw new TypeError("name is not define");if(!t)throw new TypeError("options is not define");if(!t.intention)throw new TypeError("options.intention is not define");if(t.intention&&"function"!=typeof t.intention)throw new TypeError("options.intention is not function");n[e]&&console.warn("plugin "+e+" 已存在,已覆盖。"),n[e]=t},t.default=function(o){var e=(0,r.default)({},s.deepClone(u.default.globalPluginsFunctionList),s.deepClone(o.pluginsFunctionList)),e=(0,a.default)(e);(0,l.default)(e).call(e,function(e){var t=e[0],n=e[1];console.info("plugin "+t+" initializing");e=n.intention,n=n.config;e(o,n),console.info("plugin "+t+" initialization complete")})}},function(e,t,n){"use strict";(0,n(0)(n(1)).default)(t,"__esModule",{value:!0})}],i.c=o,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(t,e){if(1&e&&(t=i(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)i.d(n,o,function(e){return t[e]}.bind(null,o));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=141).default;function i(e){if(o[e])return o[e].exports;var t=o[e]={i:e,l:!1,exports:{}};return n[e].call(t.exports,t,t.exports,i),t.l=!0,t.exports}var n,o}); \ No newline at end of file diff --git a/AdminSrc/AdminHost/wwwroot/image/会员列表.png b/AdminSrc/AdminHost/wwwroot/image/会员列表.png new file mode 100644 index 0000000..2eb8c14 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/image/会员列表.png differ diff --git a/AdminSrc/AdminHost/wwwroot/image/微信图片_20260326142824_546_781.png b/AdminSrc/AdminHost/wwwroot/image/微信图片_20260326142824_546_781.png new file mode 100644 index 0000000..f8cd1b2 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/image/微信图片_20260326142824_546_781.png differ diff --git a/AdminSrc/AdminHost/wwwroot/image/微信图片_20260326142827_547_781.png b/AdminSrc/AdminHost/wwwroot/image/微信图片_20260326142827_547_781.png new file mode 100644 index 0000000..98c1ffb Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/image/微信图片_20260326142827_547_781.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40210.png b/AdminSrc/AdminHost/wwwroot/uploads/40210.png new file mode 100644 index 0000000..e7688f4 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40210.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40211.png b/AdminSrc/AdminHost/wwwroot/uploads/40211.png new file mode 100644 index 0000000..ed9c7e6 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40211.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40212.png b/AdminSrc/AdminHost/wwwroot/uploads/40212.png new file mode 100644 index 0000000..f326020 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40212.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40213.png b/AdminSrc/AdminHost/wwwroot/uploads/40213.png new file mode 100644 index 0000000..8af7631 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40213.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40214.png b/AdminSrc/AdminHost/wwwroot/uploads/40214.png new file mode 100644 index 0000000..75675b2 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40214.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40215.png b/AdminSrc/AdminHost/wwwroot/uploads/40215.png new file mode 100644 index 0000000..0fe907f Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40215.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40216.png b/AdminSrc/AdminHost/wwwroot/uploads/40216.png new file mode 100644 index 0000000..cccd801 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40216.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40217.png b/AdminSrc/AdminHost/wwwroot/uploads/40217.png new file mode 100644 index 0000000..b0e4e5b Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40217.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40218.png b/AdminSrc/AdminHost/wwwroot/uploads/40218.png new file mode 100644 index 0000000..51bf73f Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40218.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40219.png b/AdminSrc/AdminHost/wwwroot/uploads/40219.png new file mode 100644 index 0000000..8b99e07 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40219.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40220.png b/AdminSrc/AdminHost/wwwroot/uploads/40220.png new file mode 100644 index 0000000..a075d35 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40220.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40221.png b/AdminSrc/AdminHost/wwwroot/uploads/40221.png new file mode 100644 index 0000000..35816c7 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40221.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40222.png b/AdminSrc/AdminHost/wwwroot/uploads/40222.png new file mode 100644 index 0000000..03316b6 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40222.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40223.png b/AdminSrc/AdminHost/wwwroot/uploads/40223.png new file mode 100644 index 0000000..99557fc Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40223.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40224.png b/AdminSrc/AdminHost/wwwroot/uploads/40224.png new file mode 100644 index 0000000..6580bb8 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40224.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40225.png b/AdminSrc/AdminHost/wwwroot/uploads/40225.png new file mode 100644 index 0000000..547d3c2 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40225.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40226.png b/AdminSrc/AdminHost/wwwroot/uploads/40226.png new file mode 100644 index 0000000..cea2064 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40226.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40227.png b/AdminSrc/AdminHost/wwwroot/uploads/40227.png new file mode 100644 index 0000000..a3d6414 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40227.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40228.png b/AdminSrc/AdminHost/wwwroot/uploads/40228.png new file mode 100644 index 0000000..0145c6a Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40228.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40229.png b/AdminSrc/AdminHost/wwwroot/uploads/40229.png new file mode 100644 index 0000000..7d2ce5c Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40229.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40230.png b/AdminSrc/AdminHost/wwwroot/uploads/40230.png new file mode 100644 index 0000000..7b6d695 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40230.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40231.png b/AdminSrc/AdminHost/wwwroot/uploads/40231.png new file mode 100644 index 0000000..cd55f48 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40231.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40232.png b/AdminSrc/AdminHost/wwwroot/uploads/40232.png new file mode 100644 index 0000000..d5956d8 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40232.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40233.png b/AdminSrc/AdminHost/wwwroot/uploads/40233.png new file mode 100644 index 0000000..b21f0e6 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40233.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40234.png b/AdminSrc/AdminHost/wwwroot/uploads/40234.png new file mode 100644 index 0000000..f4cfd77 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40234.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40235.png b/AdminSrc/AdminHost/wwwroot/uploads/40235.png new file mode 100644 index 0000000..a1904b7 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40235.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40236.png b/AdminSrc/AdminHost/wwwroot/uploads/40236.png new file mode 100644 index 0000000..d3e435f Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40236.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40307.png b/AdminSrc/AdminHost/wwwroot/uploads/40307.png new file mode 100644 index 0000000..1f172e4 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40307.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40308.png b/AdminSrc/AdminHost/wwwroot/uploads/40308.png new file mode 100644 index 0000000..7157fb3 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40308.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/40309.png b/AdminSrc/AdminHost/wwwroot/uploads/40309.png new file mode 100644 index 0000000..15ea589 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/40309.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/aee62b4fbca64a1b950b05d6ce6a5704.jpg b/AdminSrc/AdminHost/wwwroot/uploads/aee62b4fbca64a1b950b05d6ce6a5704.jpg new file mode 100644 index 0000000..2e39195 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/aee62b4fbca64a1b950b05d6ce6a5704.jpg differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/c479b2167bed465f9b6d11ff1177c1ab.jpg b/AdminSrc/AdminHost/wwwroot/uploads/c479b2167bed465f9b6d11ff1177c1ab.jpg new file mode 100644 index 0000000..2e39195 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/c479b2167bed465f9b6d11ff1177c1ab.jpg differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/f1dabf4e993e4c74950628cb3ea6f486.jpg b/AdminSrc/AdminHost/wwwroot/uploads/f1dabf4e993e4c74950628cb3ea6f486.jpg new file mode 100644 index 0000000..2e39195 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/f1dabf4e993e4c74950628cb3ea6f486.jpg differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/救赎圣域.png b/AdminSrc/AdminHost/wwwroot/uploads/救赎圣域.png new file mode 100644 index 0000000..f95f8ef Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/救赎圣域.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/星际战舰.png b/AdminSrc/AdminHost/wwwroot/uploads/星际战舰.png new file mode 100644 index 0000000..837ff22 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/星际战舰.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/星际穿梭.png b/AdminSrc/AdminHost/wwwroot/uploads/星际穿梭.png new file mode 100644 index 0000000..11e2475 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/星际穿梭.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/春华锦簇.png b/AdminSrc/AdminHost/wwwroot/uploads/春华锦簇.png new file mode 100644 index 0000000..09e8c81 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/春华锦簇.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/普天同庆.png b/AdminSrc/AdminHost/wwwroot/uploads/普天同庆.png new file mode 100644 index 0000000..fc4720c Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/普天同庆.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/暗域侵扰.png b/AdminSrc/AdminHost/wwwroot/uploads/暗域侵扰.png new file mode 100644 index 0000000..e31e171 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/暗域侵扰.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/极度深寒.png b/AdminSrc/AdminHost/wwwroot/uploads/极度深寒.png new file mode 100644 index 0000000..47e06a8 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/极度深寒.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/树影轻舞.png b/AdminSrc/AdminHost/wwwroot/uploads/树影轻舞.png new file mode 100644 index 0000000..9b44880 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/树影轻舞.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/梦华水晶.png b/AdminSrc/AdminHost/wwwroot/uploads/梦华水晶.png new file mode 100644 index 0000000..63dbcad Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/梦华水晶.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/梦幻之翼.png b/AdminSrc/AdminHost/wwwroot/uploads/梦幻之翼.png new file mode 100644 index 0000000..b44fe76 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/梦幻之翼.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/梦魇鬼魅.png b/AdminSrc/AdminHost/wwwroot/uploads/梦魇鬼魅.png new file mode 100644 index 0000000..85b2608 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/梦魇鬼魅.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/森林之心.png b/AdminSrc/AdminHost/wwwroot/uploads/森林之心.png new file mode 100644 index 0000000..34b8c09 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/森林之心.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/森林秘宝.png b/AdminSrc/AdminHost/wwwroot/uploads/森林秘宝.png new file mode 100644 index 0000000..67cfdc0 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/森林秘宝.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/次元光翼.png b/AdminSrc/AdminHost/wwwroot/uploads/次元光翼.png new file mode 100644 index 0000000..6b4d3c8 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/次元光翼.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/武林至尊.png b/AdminSrc/AdminHost/wwwroot/uploads/武林至尊.png new file mode 100644 index 0000000..ec5385c Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/武林至尊.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/武装斗神.png b/AdminSrc/AdminHost/wwwroot/uploads/武装斗神.png new file mode 100644 index 0000000..4680005 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/武装斗神.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/永冻领域.png b/AdminSrc/AdminHost/wwwroot/uploads/永冻领域.png new file mode 100644 index 0000000..9def51e Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/永冻领域.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/沙滩明珠.png b/AdminSrc/AdminHost/wwwroot/uploads/沙滩明珠.png new file mode 100644 index 0000000..05f72f6 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/沙滩明珠.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/洛神云翼.png b/AdminSrc/AdminHost/wwwroot/uploads/洛神云翼.png new file mode 100644 index 0000000..6eb7d0b Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/洛神云翼.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/洛神萌仙.png b/AdminSrc/AdminHost/wwwroot/uploads/洛神萌仙.png new file mode 100644 index 0000000..96e5e78 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/洛神萌仙.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/流光之梦.png b/AdminSrc/AdminHost/wwwroot/uploads/流光之梦.png new file mode 100644 index 0000000..6acbb9b Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/流光之梦.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/流光华彩.png b/AdminSrc/AdminHost/wwwroot/uploads/流光华彩.png new file mode 100644 index 0000000..5215322 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/流光华彩.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/流光祥翼.png b/AdminSrc/AdminHost/wwwroot/uploads/流光祥翼.png new file mode 100644 index 0000000..e601499 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/流光祥翼.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/流火之焰.png b/AdminSrc/AdminHost/wwwroot/uploads/流火之焰.png new file mode 100644 index 0000000..0ee578c Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/流火之焰.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/浪漫之翼.png b/AdminSrc/AdminHost/wwwroot/uploads/浪漫之翼.png new file mode 100644 index 0000000..2ab1baa Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/浪漫之翼.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/深海之眼.png b/AdminSrc/AdminHost/wwwroot/uploads/深海之眼.png new file mode 100644 index 0000000..4f851cc Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/深海之眼.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/炽核振羽.png b/AdminSrc/AdminHost/wwwroot/uploads/炽核振羽.png new file mode 100644 index 0000000..eb773f9 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/炽核振羽.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/焰翎之翼.png b/AdminSrc/AdminHost/wwwroot/uploads/焰翎之翼.png new file mode 100644 index 0000000..9fbc3c2 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/焰翎之翼.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/熔核湮兽.png b/AdminSrc/AdminHost/wwwroot/uploads/熔核湮兽.png new file mode 100644 index 0000000..41d80cf Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/熔核湮兽.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/狂暴雷龙.png b/AdminSrc/AdminHost/wwwroot/uploads/狂暴雷龙.png new file mode 100644 index 0000000..6bde4d4 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/狂暴雷龙.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/玄冰烈焰.png b/AdminSrc/AdminHost/wwwroot/uploads/玄冰烈焰.png new file mode 100644 index 0000000..e123f3d Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/玄冰烈焰.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/环游世界.png b/AdminSrc/AdminHost/wwwroot/uploads/环游世界.png new file mode 100644 index 0000000..35f24b6 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/环游世界.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/珍珠之翼.png b/AdminSrc/AdminHost/wwwroot/uploads/珍珠之翼.png new file mode 100644 index 0000000..48791e6 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/珍珠之翼.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/甜心教主.png b/AdminSrc/AdminHost/wwwroot/uploads/甜心教主.png new file mode 100644 index 0000000..7f17ce7 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/甜心教主.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/神龙大侠.png b/AdminSrc/AdminHost/wwwroot/uploads/神龙大侠.png new file mode 100644 index 0000000..3388a83 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/神龙大侠.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/祥麟瑞凤.png b/AdminSrc/AdminHost/wwwroot/uploads/祥麟瑞凤.png new file mode 100644 index 0000000..0a94cfe Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/祥麟瑞凤.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/祥龙九天.png b/AdminSrc/AdminHost/wwwroot/uploads/祥龙九天.png new file mode 100644 index 0000000..b244b11 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/祥龙九天.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/福狮之心.png b/AdminSrc/AdminHost/wwwroot/uploads/福狮之心.png new file mode 100644 index 0000000..27ae84d Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/福狮之心.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/福狮之翼.png b/AdminSrc/AdminHost/wwwroot/uploads/福狮之翼.png new file mode 100644 index 0000000..36ece70 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/福狮之翼.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/福粽灵羽.png b/AdminSrc/AdminHost/wwwroot/uploads/福粽灵羽.png new file mode 100644 index 0000000..542222c Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/福粽灵羽.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/突击猎手.png b/AdminSrc/AdminHost/wwwroot/uploads/突击猎手.png new file mode 100644 index 0000000..81c332d Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/突击猎手.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/紫晶龙翼.png b/AdminSrc/AdminHost/wwwroot/uploads/紫晶龙翼.png new file mode 100644 index 0000000..16514e1 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/紫晶龙翼.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/绝对零度.png b/AdminSrc/AdminHost/wwwroot/uploads/绝对零度.png new file mode 100644 index 0000000..732dfc2 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/绝对零度.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/能量核心.png b/AdminSrc/AdminHost/wwwroot/uploads/能量核心.png new file mode 100644 index 0000000..577840a Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/能量核心.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/脉冲音波.png b/AdminSrc/AdminHost/wwwroot/uploads/脉冲音波.png new file mode 100644 index 0000000..17c0fec Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/脉冲音波.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/自由之翼.png b/AdminSrc/AdminHost/wwwroot/uploads/自由之翼.png new file mode 100644 index 0000000..a93e13a Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/自由之翼.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/舞兔映月.png b/AdminSrc/AdminHost/wwwroot/uploads/舞兔映月.png new file mode 100644 index 0000000..508ca22 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/舞兔映月.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/苍刃出鞘.png b/AdminSrc/AdminHost/wwwroot/uploads/苍刃出鞘.png new file mode 100644 index 0000000..a0ec8cb Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/苍刃出鞘.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/苍星之翼.png b/AdminSrc/AdminHost/wwwroot/uploads/苍星之翼.png new file mode 100644 index 0000000..533fe51 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/苍星之翼.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/苍炎至尊.png b/AdminSrc/AdminHost/wwwroot/uploads/苍炎至尊.png new file mode 100644 index 0000000..0427f72 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/苍炎至尊.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/荧光之星.png b/AdminSrc/AdminHost/wwwroot/uploads/荧光之星.png new file mode 100644 index 0000000..a2bf3db Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/荧光之星.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/萌娃驾到.png b/AdminSrc/AdminHost/wwwroot/uploads/萌娃驾到.png new file mode 100644 index 0000000..3aa7e93 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/萌娃驾到.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/蔚蓝绽放.png b/AdminSrc/AdminHost/wwwroot/uploads/蔚蓝绽放.png new file mode 100644 index 0000000..7ecbb1c Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/蔚蓝绽放.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/虎啸山林.png b/AdminSrc/AdminHost/wwwroot/uploads/虎啸山林.png new file mode 100644 index 0000000..b5db915 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/虎啸山林.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/虚空之光.png b/AdminSrc/AdminHost/wwwroot/uploads/虚空之光.png new file mode 100644 index 0000000..59ae79c Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/虚空之光.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/蚩尤虎魄.png b/AdminSrc/AdminHost/wwwroot/uploads/蚩尤虎魄.png new file mode 100644 index 0000000..aff8f03 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/蚩尤虎魄.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/蛮荒神牛.png b/AdminSrc/AdminHost/wwwroot/uploads/蛮荒神牛.png new file mode 100644 index 0000000..5d0cb0d Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/蛮荒神牛.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/蜻蜓之夏.png b/AdminSrc/AdminHost/wwwroot/uploads/蜻蜓之夏.png new file mode 100644 index 0000000..221689a Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/蜻蜓之夏.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/血翼狂潮.png b/AdminSrc/AdminHost/wwwroot/uploads/血翼狂潮.png new file mode 100644 index 0000000..a4ed14f Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/血翼狂潮.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/诸葛神弩.png b/AdminSrc/AdminHost/wwwroot/uploads/诸葛神弩.png new file mode 100644 index 0000000..8272e02 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/诸葛神弩.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/赤眼灼炎.png b/AdminSrc/AdminHost/wwwroot/uploads/赤眼灼炎.png new file mode 100644 index 0000000..66e6316 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/赤眼灼炎.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/醒狮纳吉.png b/AdminSrc/AdminHost/wwwroot/uploads/醒狮纳吉.png new file mode 100644 index 0000000..4505ffd Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/醒狮纳吉.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/金福满堂.png b/AdminSrc/AdminHost/wwwroot/uploads/金福满堂.png new file mode 100644 index 0000000..b1794bc Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/金福满堂.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/金秋之心.png b/AdminSrc/AdminHost/wwwroot/uploads/金秋之心.png new file mode 100644 index 0000000..a6c1ef7 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/金秋之心.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/金秋之翼.png b/AdminSrc/AdminHost/wwwroot/uploads/金秋之翼.png new file mode 100644 index 0000000..5ee5433 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/金秋之翼.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/金色童年.png b/AdminSrc/AdminHost/wwwroot/uploads/金色童年.png new file mode 100644 index 0000000..13dbae9 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/金色童年.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/闪耀冰晶.png b/AdminSrc/AdminHost/wwwroot/uploads/闪耀冰晶.png new file mode 100644 index 0000000..77e81bd Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/闪耀冰晶.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/雷神之怒.png b/AdminSrc/AdminHost/wwwroot/uploads/雷神之怒.png new file mode 100644 index 0000000..eb86f20 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/雷神之怒.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/雷霆万钧.png b/AdminSrc/AdminHost/wwwroot/uploads/雷霆万钧.png new file mode 100644 index 0000000..d8d68eb Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/雷霆万钧.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/音律幻羽.png b/AdminSrc/AdminHost/wwwroot/uploads/音律幻羽.png new file mode 100644 index 0000000..e4dbdec Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/音律幻羽.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/风暴之心.png b/AdminSrc/AdminHost/wwwroot/uploads/风暴之心.png new file mode 100644 index 0000000..e3ffe98 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/风暴之心.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/飞鱼双翅.png b/AdminSrc/AdminHost/wwwroot/uploads/飞鱼双翅.png new file mode 100644 index 0000000..28b9e84 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/飞鱼双翅.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/飞龙在天.png b/AdminSrc/AdminHost/wwwroot/uploads/飞龙在天.png new file mode 100644 index 0000000..23cc624 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/飞龙在天.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/鸿兔先锋.png b/AdminSrc/AdminHost/wwwroot/uploads/鸿兔先锋.png new file mode 100644 index 0000000..0364958 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/鸿兔先锋.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/鸿福展翅.png b/AdminSrc/AdminHost/wwwroot/uploads/鸿福展翅.png new file mode 100644 index 0000000..e27fb28 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/鸿福展翅.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/麒麟瑞兽.png b/AdminSrc/AdminHost/wwwroot/uploads/麒麟瑞兽.png new file mode 100644 index 0000000..29e463c Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/麒麟瑞兽.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/黑龙吐息.png b/AdminSrc/AdminHost/wwwroot/uploads/黑龙吐息.png new file mode 100644 index 0000000..6208d79 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/黑龙吐息.png differ diff --git a/AdminSrc/AdminHost/wwwroot/uploads/龙舟先锋.png b/AdminSrc/AdminHost/wwwroot/uploads/龙舟先锋.png new file mode 100644 index 0000000..a1409b6 Binary files /dev/null and b/AdminSrc/AdminHost/wwwroot/uploads/龙舟先锋.png differ diff --git a/AdminSrc/AdminService/Admin/AdminOperationLogService.cs b/AdminSrc/AdminService/Admin/AdminOperationLogService.cs new file mode 100644 index 0000000..b559670 --- /dev/null +++ b/AdminSrc/AdminService/Admin/AdminOperationLogService.cs @@ -0,0 +1,51 @@ +using Common; +using Domain.Admin.Admin; +using Domain.Admin.Admin.Param; +using MongoRepository; +using MongoRepository.Config; + +namespace AdminService.Admin +{ + public class AdminOperationLogService : IAdminOperationLogService + { + private readonly IMongoBaseRepository _logRepo; + + public AdminOperationLogService(IMongoBaseRepository logRepo) + { + _logRepo = logRepo; + } + + public async Task AddLog(AdminOperationLog log) + { + try + { + await _logRepo.InsertOneAsync(log); + return true; + } + catch + { + return false; + } + } + + public async Task<(List list, long count)> QueryPage(OperationLogQueryParam param) + { + var result = await _logRepo.QueryPageAsync( + filterExpression: x => + (string.IsNullOrEmpty(param.AdminId) || x.AdminId == param.AdminId) && + (string.IsNullOrEmpty(param.AdminName) || (x.AdminName != null && x.AdminName.Contains(param.AdminName))) && + (!param.Module.HasValue || x.Module == param.Module) && + (!param.StartTime.HasValue || x.OperateTime >= param.StartTime) && + (!param.EndTime.HasValue || x.OperateTime <= param.EndTime) && + (!param.Status.HasValue || x.Status == param.Status) && + x.HttpMethod != "GET", + orderExpression: x => x.OperateTime, + desc: true, + pageSize: param.PageSize, + pageIndex: param.PageIndex + ); + + return (result.list.ToList(), result.count); + } + } +} diff --git a/AdminSrc/AdminService/Admin/OperationLogHelper.cs b/AdminSrc/AdminService/Admin/OperationLogHelper.cs new file mode 100644 index 0000000..35a450f --- /dev/null +++ b/AdminSrc/AdminService/Admin/OperationLogHelper.cs @@ -0,0 +1,68 @@ +using System.Security.Claims; +using Domain.Admin.Admin; +using Domain.Admin.Admin.ENum; +using Microsoft.AspNetCore.Http; + +namespace AdminService.Admin +{ + public static class OperationLogHelper + { + public static AdminOperationLog CreateLog( + EnumOperationModule module, + string actionType, + string description, + string httpMethod, + string requestPath, + string? requestParams = null, + string? response = null, + int status = 1) + { + return new AdminOperationLog + { + Module = (int)module, + ActionType = actionType, + Description = description, + HttpMethod = httpMethod, + RequestPath = requestPath, + RequestParams = requestParams, + Response = response, + Status = status, + OperateTime = DateTime.Now + }; + } + + public static (string? adminId, string? adminName) GetAdminInfo(ClaimsPrincipal? user) + { + if (user == null) return (null, null); + + var adminId = user.FindFirst("uid")?.Value; + var adminName = user.FindFirst("dname")?.Value; + + if (string.IsNullOrEmpty(adminName)) + { + adminName = user.FindFirst(ClaimTypes.Name)?.Value; + } + + return (adminId, adminName); + } + + public static void FillAdminInfo(AdminOperationLog log, ClaimsPrincipal? user) + { + var (adminId, adminName) = GetAdminInfo(user); + log.AdminId = adminId; + log.AdminName = adminName; + } + + public static string? GetClientIp(HttpContext? context) + { + if (context == null) return null; + + var ip = context.Request.Headers["X-Forwarded-For"].FirstOrDefault(); + if (string.IsNullOrEmpty(ip)) + { + ip = context.Connection.RemoteIpAddress?.ToString(); + } + return ip; + } + } +} diff --git a/AdminSrc/AdminService/AdminService.csproj b/AdminSrc/AdminService/AdminService.csproj new file mode 100644 index 0000000..400fcf2 --- /dev/null +++ b/AdminSrc/AdminService/AdminService.csproj @@ -0,0 +1,28 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + + + + + + + + + diff --git a/AdminSrc/AdminService/AutoMapperConfig.cs b/AdminSrc/AdminService/AutoMapperConfig.cs new file mode 100644 index 0000000..cca3cbf --- /dev/null +++ b/AdminSrc/AdminService/AutoMapperConfig.cs @@ -0,0 +1,40 @@ +using AdminService.Notices.Param; +using AdminService.System.Param; +using AdminService.System.Response; +using AdminService.Notices.Param; +using AutoMapper; +using CommonDomain; +using UserDomain.Entity; +using Domain.Admin.Admin; +using UserDomain.Entity; + +namespace AdminService +{ + public class AutoMapperConfig : Profile + { + public AutoMapperConfig() + { + #region Admin + //param To Entity + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + + CreateMap(); + + CreateMap(); + CreateMap(); + #endregion + + #region Notice + CreateMap(); + CreateMap(); + #endregion + + #region Task + CreateMap(); + #endregion + } + } +} diff --git a/AdminSrc/AdminService/BeautifulNumber/BeautifulNumberGenerator.cs b/AdminSrc/AdminService/BeautifulNumber/BeautifulNumberGenerator.cs new file mode 100644 index 0000000..ec00084 --- /dev/null +++ b/AdminSrc/AdminService/BeautifulNumber/BeautifulNumberGenerator.cs @@ -0,0 +1,220 @@ +namespace AdminService.BeautifulNumber; + +public class BeautifulNumberGenerator +{ + public static List GenerateAllPossibleNumbersForRule(string rule) + { + var parts = ParseRuleIntoParts(rule); + int totalLength = parts.Sum(p => p.Length); + if (totalLength != 8) + { + string details = string.Join(", ", parts.Select(p => $"'{p.OriginalString}'({p.Type}, {p.Length}位)")); + throw new ArgumentException($"规则 '{rule}' 解析后的总长度为 {totalLength} 位,不符合要求的8位。详情: [{details}]"); + } + + var partCombinations = new List>(); + foreach (var part in parts) + { + partCombinations.Add(GenerateCombinationsForPart(part)); + } + + var finalNumbers = CartesianProduct(partCombinations); + return finalNumbers.Distinct().ToList(); + } + + private class RulePart + { + public string OriginalString { get; set; } + public PartType Type { get; set; } + public int Length { get; set; } + public string UniqueLetters { get; set; } + public bool HasPlaceholder { get; set; } + } + + private enum PartType + { + Sequential, + FixedGroup, // K, T, KK, TT, KKT, TTKK etc. + Individual, // X + FixedNumber // 8888 + } + + private static List ParseRuleIntoParts(string rule) + { + var parts = new List(); + int i = 0; + while (i < rule.Length) + { + char c = rule[i]; + + if (char.IsDigit(c)) + { + int start = i; + while (i < rule.Length && char.IsDigit(rule[i])) i++; + parts.Add(new RulePart { OriginalString = rule.Substring(start, i - start), Type = PartType.FixedNumber, Length = i - start }); + continue; + } + + if (c >= 'A' && c <= 'H') + { + int start = i; + int direction = 0; + if (i + 1 < rule.Length && char.IsUpper(rule[i + 1]) && (rule[i + 1] >= 'A' && rule[i + 1] <= 'H')) + { + direction = rule[i + 1] > c ? 1 : -1; + i++; + while (i + 1 < rule.Length && char.IsUpper(rule[i + 1]) && (rule[i + 1] >= 'A' && rule[i + 1] <= 'H') && rule[i + 1] - rule[i] == direction) + { + i++; + } + } + bool hasPlaceholder = (i + 1 < rule.Length && rule[i + 1] == 'X'); + if (hasPlaceholder) i++; + + int sequenceLength = i - start + 1; + parts.Add(new RulePart { OriginalString = rule.Substring(start, sequenceLength), Type = PartType.Sequential, Length = sequenceLength, HasPlaceholder = hasPlaceholder }); + i++; + continue; + } + + if (c == 'X') + { + int start = i; + while (i < rule.Length && rule[i] == 'X') i++; + parts.Add(new RulePart { OriginalString = rule.Substring(start, i - start), Type = PartType.Individual, Length = i - start }); + continue; + } + + if (c == 'K' || c == 'T') + { + int start = i; + while (i < rule.Length && (rule[i] == 'K' || rule[i] == 'T')) i++; + string pattern = rule.Substring(start, i - start); + string uniqueLtrs = new string(pattern.Distinct().OrderBy(ch => ch).ToArray()); + parts.Add(new RulePart { OriginalString = pattern, Type = PartType.FixedGroup, Length = pattern.Length, UniqueLetters = uniqueLtrs }); + continue; + } + + i++; + } + return parts; + } + + private static List GenerateCombinationsForPart(RulePart part) + { + switch (part.Type) + { + case PartType.Sequential: + return GenerateSequentialNumbersWithPlaceholder(part.OriginalString, part.HasPlaceholder); + case PartType.FixedGroup: + return GenerateFixedGroupNumbers(part.OriginalString, part.UniqueLetters); + case PartType.Individual: + return GenerateIndividualNumbers(part.OriginalString.Length); + case PartType.FixedNumber: + return new List { part.OriginalString }; + default: + return new List(); + } + } + + private static List GenerateSequentialNumbersWithPlaceholder(string seqRule, bool hasPlaceholder) + { + string sequenceRule = hasPlaceholder ? seqRule.Substring(0, seqRule.Length - 1) : seqRule; + int length = sequenceRule.Length; + if (length == 0) return new List { "" }; + + var baseSequences = new List(); + bool isAscending = length > 1 && sequenceRule[1] > sequenceRule[0]; + + if (isAscending) + { + int maxStart = 10 - length; + for (int start = 0; start <= maxStart; start++) + { + string num = ""; + for (int i = 0; i < length; i++) num += (start + i).ToString(); + baseSequences.Add(num); + } + } + else + { + int minStart = length - 1; + for (int start = 9; start >= minStart; start--) + { + string num = ""; + for (int i = 0; i < length; i++) num += (start - i).ToString(); + baseSequences.Add(num); + } + } + + if (!hasPlaceholder) + { + return baseSequences; + } + + var finalSequences = new List(); + var digits = new List { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }; + foreach (var seq in baseSequences) + { + foreach (var digit in digits) + { + finalSequences.Add(seq + digit); + } + } + return finalSequences; + } + + private static List GenerateFixedGroupNumbers(string pattern, string uniqueLetters) + { + var allCombinations = new List>(); + foreach (char letter in uniqueLetters) + { + var letterValues = new List(); + for (int i = 0; i < 10; i++) letterValues.Add(i.ToString()); + allCombinations.Add(letterValues); + } + + var letterAssignments = CartesianProduct(allCombinations); + var results = new List(); + foreach (var assignment in letterAssignments) + { + var map = new Dictionary(); + for (int i = 0; i < uniqueLetters.Length; i++) + { + map[uniqueLetters[i]] = assignment[i].ToString(); + } + + string number = ""; + foreach (char c in pattern) + { + number += map[c]; + } + results.Add(number); + } + return results; + } + + private static List GenerateIndividualNumbers(int length) + { + var allCombinations = new List>(); + for (int i = 0; i < length; i++) + { + var digitList = new List(); + for (int j = 0; j < 10; j++) digitList.Add(j.ToString()); + allCombinations.Add(digitList); + } + return CartesianProduct(allCombinations); + } + + private static List CartesianProduct(List> listOfLists) + { + IEnumerable result = new[] { "" }; + foreach (var list in listOfLists) + { + result = from r in result + from l in list + select r + l; + } + return result.ToList(); + } +} diff --git a/AdminSrc/AdminService/BeautifulNumber/BeautifulNumberService.cs b/AdminSrc/AdminService/BeautifulNumber/BeautifulNumberService.cs new file mode 100644 index 0000000..84e5e35 --- /dev/null +++ b/AdminSrc/AdminService/BeautifulNumber/BeautifulNumberService.cs @@ -0,0 +1,491 @@ +using System.Linq.Expressions; +using AdminDomain.BeautifulNumber; +using AdminDomain.Entity; +using Common; +using Common.Utils; +using CommonInfrastructure.Response; +using Microsoft.Extensions.Logging; +using MongoDB.Driver; +using MongoRepository; +using RedisService; +using UserDomain.Entity; +using XAct; + +namespace AdminService.BeautifulNumber +{ + public class BeautifulNumberService : IBeautifulNumberService + { + private readonly IMongoBaseRepository _beautifulNumberMongo; + private readonly IMongoBaseRepository _ruleMongo; + private readonly IMongoBaseRepository _userMongo; + private readonly IRedisService _cache; + + public BeautifulNumberService( + IMongoBaseRepository beautifulNumberMongo, + IMongoBaseRepository ruleMongo, + IMongoBaseRepository userMongo, + IRedisService cache) + { + _beautifulNumberMongo = beautifulNumberMongo; + _ruleMongo = ruleMongo; + _userMongo = userMongo; + _cache = cache; + } + + public async Task<(List list, long count)> GetList(BeautifulNumberListParam param) + { + Expression> filter = c => true; + + if (!string.IsNullOrEmpty(param.level)) + { + filter = filter.And(c => c.Level == param.level); + } + + if (param.status.HasValue) + { + filter = filter.And(c => c.Status == (BeautifulNumberStatus)param.status.Value); + } + + if (!string.IsNullOrEmpty(param.numberSearch)) + { + filter = filter.And(c => c.Number.Contains(param.numberSearch)); + } + + var (total, list) = await _beautifulNumberMongo.QueryPageAsync(filter, c => c.CreateTime, false, param.size, param.page); + + return (list, total); + } + + public async Task<(List list, long count)> GetAvailableList(BeautifulNumberListParam param) + { + param.status = (int)BeautifulNumberStatus.Available; + return await GetList(param); + } + + public async Task<(bool isok, string msg)> Purchase(string number, LoginUser loginUser) + { + var config = await _beautifulNumberMongo.FindOneAsync(c => c.Number == number); + if (config == null) + { + return (false, "靓号不存在"); + } + + if (config.Status != BeautifulNumberStatus.Available) + { + return (false, "靓号不可购买"); + } + + var user = await _userMongo.FindByIdAsync(loginUser.UserId); + if (user == null) + { + return (false, "用户不存在"); + } + + if (user.Assets.Gold < config.Price) + { + return (false, "金币不足"); + } + + user.Assets.Gold -= config.Price; + config.Status = BeautifulNumberStatus.Sold; + config.SaleTime = DateTime.Now.ToTimeStamp(); + config.BuyerUserId = loginUser.UserId; + config.UserId = loginUser.UserId; + + await _userMongo.ReplaceOneAsync(user); + await _beautifulNumberMongo.ReplaceOneAsync(config); + + return (true, "购买成功"); + } + + public async Task CheckNumber(string number) + { + var config = await _beautifulNumberMongo.FindOneAsync(c => c.Number == number); + if (config != null) + { + return config; + } + + var isUsed = _userMongo.Count(c => c.BaseInfo.Number == number) > 0; + + + return new BeautifulNumberConfig + { + Number = number, + RuleName = config.RuleName, + Level = config.Level, + Price = config.Price, + Status = isUsed ? BeautifulNumberStatus.Sold : BeautifulNumberStatus.Normal + }; + } + + + + public async Task<(bool isok, string msg)> Delete(string id) + { + var config = await _beautifulNumberMongo.FindByIdAsync(id); + if (config == null) + { + return (false, "靓号不存在"); + } + + if (config.Status == BeautifulNumberStatus.Sold) + { + return (false, "靓号已售出,无法删除"); + } + + await _beautifulNumberMongo.DeleteByIdAsync(id); + return (true, "删除成功"); + } + + public async Task<(bool isok, string msg)> SetToNormal(string id) + { + var config = await _beautifulNumberMongo.FindByIdAsync(id); + if (config == null) + { + return (false, "靓号不存在"); + } + + config.Status = BeautifulNumberStatus.Normal; + await _beautifulNumberMongo.ReplaceOneAsync(config); + return (true, "设置成功"); + } + + public async Task<(bool isok, string msg)> Freeze(string id) + { + var config = await _beautifulNumberMongo.FindByIdAsync(id); + if (config == null) + { + return (false, "靓号不存在"); + } + + config.Status = BeautifulNumberStatus.Frozen; + await _beautifulNumberMongo.ReplaceOneAsync(config); + return (true, "冻结成功"); + } + + public async Task<(bool isok, string msg)> Unfreeze(string id) + { + var config = await _beautifulNumberMongo.FindByIdAsync(id); + if (config == null) + { + return (false, "靓号不存在"); + } + + config.Status = BeautifulNumberStatus.Available; + await _beautifulNumberMongo.ReplaceOneAsync(config); + return (true, "解冻成功"); + } + + public async Task<(bool isok, string msg)> UpdatePrice(string id, long price) + { + var config = await _beautifulNumberMongo.FindByIdAsync(id); + if (config == null) + { + return (false, "靓号不存在"); + } + + config.Price = price; + await _beautifulNumberMongo.ReplaceOneAsync(config); + return (true, "价格修改成功"); + } + + public async Task<(bool isok, string msg)> UpdateNumber(string id, string level, long price) + { + var config = await _beautifulNumberMongo.FindByIdAsync(id); + if (config == null) + { + return (false, "靓号不存在"); + } + + config.Level = level; + config.Price = price; + await _beautifulNumberMongo.ReplaceOneAsync(config); + return (true, "修改成功"); + } + + public async Task<(bool isok, string msg)> BindToUser(string number, string userId) + { + var config = await _beautifulNumberMongo.FindOneAsync(c => c.Number == number); + if (config == null) + { + return (false, "靓号不存在"); + } + + config.UserId = userId; + await _beautifulNumberMongo.ReplaceOneAsync(config); + return (true, "绑定成功"); + } + + public async Task> GetRules() + { + var filter = Builders.Filter.Empty; + var sort = Builders.Sort.Ascending(c => c.Sort); + var (_, list) = await _ruleMongo.QueryPageAsync(filter, sort, true, 100, 1); + return list; + } + + public async Task<(bool isok, string msg)> AddRule(BeautifulNumberRule rule) + { + try + { + await _ruleMongo.InsertOneAsync(rule); + return (true, "添加成功"); + } + catch (Exception ex) + { + return (false, "添加失败: " + ex.Message); + } + } + + public async Task<(bool isok, string msg)> UpdateRule(BeautifulNumberRule rule) + { + try + { + var existing = await _ruleMongo.FindByIdAsync(rule.Id); + if (existing == null) + return (false, "规则不存在"); + + existing.RuleName = rule.RuleName; + + existing.Level = rule.Level; + existing.Price = rule.Price; + existing.Sort = rule.Sort; + existing.IsEnable = rule.IsEnable; + + await _ruleMongo.ReplaceOneAsync(existing); + return (true, "更新成功"); + } + catch (Exception ex) + { + return (false, "更新失败: " + ex.Message); + } + } + + public async Task<(bool isok, string msg)> DeleteRule(string id) + { + try + { + await _ruleMongo.DeleteByIdAsync(id); + return (true, "删除成功"); + } + catch (Exception ex) + { + return (false, "删除失败: " + ex.Message); + } + } + + public async Task<(bool isok, string msg)> GiveToUser(string number, string userId) + { + try + { + var user = await _userMongo.FindByIdAsync(userId); + if (user == null) + return (false, "用户不存在"); + + var config = await _beautifulNumberMongo.FindOneAsync(c => c.Number == number); + if (config != null) + { + if (config.Status == BeautifulNumberStatus.Sold) + return (false, "靓号已售出"); + + config.Status = BeautifulNumberStatus.Sold; + config.UserId = userId; + config.BuyerUserId = userId; + config.SaleTime = DateTime.Now.ToTimeStamp(); + await _beautifulNumberMongo.ReplaceOneAsync(config); + } + + user.BaseInfo.Number = number; + await _userMongo.ReplaceOneAsync(user); + + return (true, "赠送成功"); + } + catch (Exception ex) + { + return (false, "赠送失败: " + ex.Message); + } + } + + public async Task<(bool isok, string msg, int count)> InitBeautifulNumbers() + { + try + { + var rules = await GetRules(); + if (rules == null || rules.Count == 0) + { + return (false, "请先初始化规则", 0); + } + + var soldNumbers = new HashSet(); + var allConfigs = await _beautifulNumberMongo.FilterByAsync(c => c.Status == BeautifulNumberStatus.Sold); + foreach (var config in allConfigs) + { + soldNumbers.Add(config.Number); + } + + var existingNumbers = new HashSet(); + var existingConfigs = await _beautifulNumberMongo.FilterByAsync(c => true); + foreach (var config in existingConfigs) + { + existingNumbers.Add(config.Number); + } + + var newNumbers = new List(); + foreach (var rule in rules) + { + if (!rule.IsEnable) continue; + var numbers = BeautifulNumberGenerator.GenerateAllPossibleNumbersForRule(rule.RuleName); + + foreach (var num in numbers) + { + if (existingNumbers.Contains(num) || soldNumbers.Contains(num) || newNumbers.Any(c=>c.Number==num)) + continue; + + newNumbers.Add(new BeautifulNumberConfig() { Level=rule.Level, Number=num, Price=rule.Price, RuleName=rule.RuleName + }); + existingNumbers.Add(num); + } + } + + if (newNumbers.Count > 0) + { + await _beautifulNumberMongo.InsertManyAsync(newNumbers); + } + + return (true, $"初始化成功,新增 {newNumbers.Count} 个靓号", newNumbers.Count); + } + catch (Exception ex) + { + return (false, "初始化失败: " + ex.Message, 0); + } + } + + + public async Task<(bool isok, string msg)> UpdateRules(List rules) + { + try + { + await _ruleMongo.DeleteManyAsync(c => true); + + if (rules.Count > 0) + { + await _ruleMongo.InsertManyAsync(rules); + } + + return (true, "规则更新成功"); + } + catch (Exception ex) + { + return (false, "规则更新失败: " + ex.Message); + } + } + + public async Task<(bool isok, string msg)> InitRules() + { + var existingRules = _ruleMongo.Count(c => true); + if (existingRules > 0) + { + return (true, "规则已初始化"); + } + + var rules = new List + { + + + }; + + await _ruleMongo.InsertManyAsync(rules); + return (true, "规则初始化成功"); + } + + public async Task<(bool isok, string msg)> AddNumber(string number, string level, long price) + { + try + { + if (string.IsNullOrWhiteSpace(number)) + return (false, "靓号不能为空"); + + number = number.Trim(); + + var existing = await _beautifulNumberMongo.FindOneAsync(c => c.Number == number); + if (existing != null) + return (false, "靓号已存在: " + number); + + var config = new BeautifulNumberConfig + { + Number = number, + Level = level ?? "D", + Price = price, + + Status = 0, + CreateTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds() + }; + + await _beautifulNumberMongo.InsertOneAsync(config); + return (true, "添加成功"); + } + catch (Exception ex) + { + return (false, "添加失败: " + ex.Message); + } + } + + public async Task<(bool isok, string msg, int successCount, int failCount)> BatchAddNumbers(List numbers, string level, long price) + { + if (numbers == null || numbers.Count == 0) + return (false, "号码列表不能为空", 0, 0); + + var successCount = 0; + var failCount = 0; + var failNumbers = new List(); + + foreach (var number in numbers) + { + if (string.IsNullOrWhiteSpace(number)) + { + failCount++; + failNumbers.Add(number); + continue; + } + + var num = number.Trim(); + try + { + var existing = await _beautifulNumberMongo.FindOneAsync(c => c.Number == num); + if (existing != null) + { + failCount++; + failNumbers.Add(num + "(已存在)"); + continue; + } + + var config = new BeautifulNumberConfig + { + Number = num, + Level = level ?? "D", + Price = price, + Status = 0, + CreateTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds() + }; + + await _beautifulNumberMongo.InsertOneAsync(config); + successCount++; + } + catch + { + failCount++; + failNumbers.Add(num); + } + } + + var msg = string.IsNullOrEmpty(failNumbers.FirstOrDefault()) + ? $"成功添加 {successCount} 个靓号" + : $"成功 {successCount} 个,失败 {failCount} 个: {string.Join(", ", failNumbers.Take(10))}"; + + return (true, msg, successCount, failCount); + } + + + } +} diff --git a/AdminSrc/AdminService/BeautifulNumber/IBeautifulNumberService.cs b/AdminSrc/AdminService/BeautifulNumber/IBeautifulNumberService.cs new file mode 100644 index 0000000..d0d807f --- /dev/null +++ b/AdminSrc/AdminService/BeautifulNumber/IBeautifulNumberService.cs @@ -0,0 +1,70 @@ +using AdminDomain.Entity; +using Common; +using Common.CommonModel; +using CommonInfrastructure.Response; +using UserDomain.Entity; +using UserDomain.Enum; + +namespace AdminService.BeautifulNumber +{ + public interface IBeautifulNumberService + { + Task<(List list, long count)> GetList(BeautifulNumberListParam param); + + Task<(List list, long count)> GetAvailableList(BeautifulNumberListParam param); + + Task<(bool isok, string msg)> Purchase(string number, LoginUser loginUser); + + Task CheckNumber(string number); + + + + Task<(bool isok, string msg)> Delete(string id); + + Task<(bool isok, string msg)> SetToNormal(string id); + + Task<(bool isok, string msg)> Freeze(string id); + + Task<(bool isok, string msg)> Unfreeze(string id); + + Task<(bool isok, string msg)> UpdatePrice(string id, long price); + + Task<(bool isok, string msg)> UpdateNumber(string id, string level, long price); + + Task<(bool isok, string msg)> BindToUser(string number, string userId); + + Task> GetRules(); + + Task<(bool isok, string msg)> AddRule(BeautifulNumberRule rule); + + Task<(bool isok, string msg)> UpdateRule(BeautifulNumberRule rule); + + Task<(bool isok, string msg)> DeleteRule(string id); + + Task<(bool isok, string msg)> GiveToUser(string number, string userId); + + Task<(bool isok, string msg, int count)> InitBeautifulNumbers(); + + Task<(bool isok, string msg)> UpdateRules(List rules); + + Task<(bool isok, string msg)> InitRules(); + + Task<(bool isok, string msg)> AddNumber(string number, string level, long price); + + Task<(bool isok, string msg, int successCount, int failCount)> BatchAddNumbers(List numbers, string level, long price); + } + + public class BeautifulNumberListParam + { + public int page { get; set; } = 1; + + public int size { get; set; } = 20; + + public string? level { get; set; } + + public int? status { get; set; } + + public string? numberSearch { get; set; } + + } +} diff --git a/AdminSrc/AdminService/Customer/CustomerService.cs b/AdminSrc/AdminService/Customer/CustomerService.cs new file mode 100644 index 0000000..1f18d5f --- /dev/null +++ b/AdminSrc/AdminService/Customer/CustomerService.cs @@ -0,0 +1,207 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using AdminDomain.Customer; +using AdminDomain.Customer.Param; +using CustomerService.Domain.Entity; +using MongoDB.Driver; +using MongoRepository; + +namespace AdminService.Customer +{ + public class CustomerService : ICustomerService + { + private readonly IMongoBaseRepository _customerRepo; + private readonly IMongoBaseRepository _conversationRepo; + private readonly IMongoBaseRepository _messageRepo; + + public CustomerService( + IMongoBaseRepository customerRepo, + IMongoBaseRepository conversationRepo, + IMongoBaseRepository messageRepo) + { + _customerRepo = customerRepo; + _conversationRepo = conversationRepo; + _messageRepo = messageRepo; + } + + public async Task<(bool isOk, string msg, CustomerEntity? customer)> AddCustomer(AddCustomerParam param) + { + var allCustomers = await _customerRepo.FilterByAsync(x => true); + var existCustomer = allCustomers.FirstOrDefault(x => x.UserId == param.UserId); + if (existCustomer != null) + { + return (false, "该用户已是客服", null); + } + + var customer = new CustomerEntity + { + UserId = param.UserId, + UserName = param.UserName, + Avatar = param.Avatar, + Status = 0, + CreateTime = DateTime.Now + }; + + await _customerRepo.InsertOneAsync(customer); + return (true, "添加成功", customer); + } + + public async Task<(bool isOk, string msg)> UpdateCustomer(UpdateCustomerParam param) + { + var customer = await _customerRepo.FindByIdAsync(param.Id); + if (customer == null) + { + return (false, "客服不存在"); + } + + var filter = Builders.Filter.Eq(x => x.Id, param.Id); + var update = Builders.Update + .Set(x => x.UserName, param.UserName) + .Set(x => x.Avatar, param.Avatar) + .Set(x => x.Status, param.Status); + + await _customerRepo.UpdateByIdAsync(param.Id, update); + return (true, "更新成功"); + } + + public async Task<(bool isOk, string msg)> DeleteCustomer(string id) + { + var customer = await _customerRepo.FindByIdAsync(id); + if (customer == null) + { + return (false, "客服不存在"); + } + + await _customerRepo.DeleteByIdAsync(id); + return (true, "删除成功"); + } + + public async Task<(bool isOk, string msg, List? customers, int total)> GetCustomerList(GetCustomerListParam param) + { + var list = await _customerRepo.FilterByAsync(x => true); + + if (!string.IsNullOrEmpty(param.UserName)) + { + list = list.Where(x => x.UserName != null && x.UserName.Contains(param.UserName)).ToList(); + } + + if (param.Status.HasValue) + { + list = list.Where(x => x.Status == param.Status.Value).ToList(); + } + + var total = list.Count; + var pagedList = list.Skip((param.PageIndex - 1) * param.PageSize).Take(param.PageSize).ToList(); + + return (true, "获取成功", pagedList, total); + } + + public async Task<(bool isOk, string msg, CustomerEntity? customer)> GetCustomerById(string id) + { + var customer = await _customerRepo.FindByIdAsync(id); + if (customer == null) + { + return (false, "客服不存在", null); + } + return (true, "获取成功", customer); + } + + public async Task<(bool isOk, string msg, ConversationEntity? conversation)> GetConversationById(string id) + { + var conversation = await _conversationRepo.FindByIdAsync(id); + if (conversation == null) + { + return (false, "会话不存在", null); + } + return (true, "获取成功", conversation); + } + + public async Task<(bool isOk, string msg, List? conversations, int total)> GetConversationList(GetConversationListParam param) + { + var list = await _conversationRepo.FilterByAsync(x => true); + + if (!string.IsNullOrEmpty(param.UserId)) + { + list = list.Where(x => x.UserId == param.UserId).ToList(); + } + + if (!string.IsNullOrEmpty(param.CustomerId)) + { + list = list.Where(x => x.CustomerId == param.CustomerId).ToList(); + } + + if (param.Status.HasValue) + { + list = list.Where(x => x.Status == param.Status.Value).ToList(); + } + + var total = list.Count; + var pagedList = list.Skip((param.PageIndex - 1) * param.PageSize).Take(param.PageSize).ToList(); + + return (true, "获取成功", pagedList, total); + } + + public async Task<(bool isOk, string msg)> DeleteConversation(string conversationId) + { + if (string.IsNullOrWhiteSpace(conversationId)) + return (false, "会话ID不能为空"); + + var conversation = await _conversationRepo.FindByIdAsync(conversationId); + if (conversation == null) + return (false, "会话不存在"); + + var messages = await _messageRepo.FilterByAsync(x => x.ConversationId == conversationId); + foreach (var message in messages) + await _messageRepo.DeleteByIdAsync(message.Id); + + await _conversationRepo.DeleteByIdAsync(conversationId); + return (true, "删除成功"); + } + + public async Task<(bool isOk, string msg, List? messages)> GetChatLog(string conversationId) + { + var conversation = await _conversationRepo.FindByIdAsync(conversationId); + if (conversation == null) + { + return (false, "会话不存在", null); + } + + var allMessages = await _messageRepo.FilterByAsync(x => true); + var messages = allMessages.Where(x => x.ConversationId == conversationId).ToList(); + return (true, "获取成功", messages); + } + + public async Task<(bool isOk, string msg)> DeleteMessage(string id) + { + var message = await _messageRepo.FindByIdAsync(id); + if (message == null) + { + return (false, "消息不存在"); + } + + await _messageRepo.DeleteByIdAsync(id); + return (true, "删除成功"); + } + + public async Task<(bool isOk, string msg)> DeleteAllMessages(string conversationId) + { + var messages = await _messageRepo.FilterByAsync(x => x.ConversationId == conversationId); + foreach (var msg in messages) + { + await _messageRepo.DeleteByIdAsync(msg.Id); + } + return (true, "删除成功"); + } + + public async Task<(bool isOk, string msg)> DeleteMessagesBatch(List ids) + { + foreach (var id in ids) + { + await _messageRepo.DeleteByIdAsync(id); + } + return (true, "批量删除成功"); + } + } +} diff --git a/AdminSrc/AdminService/EmptyRoomRate/EmptyRoomRateConfigService.cs b/AdminSrc/AdminService/EmptyRoomRate/EmptyRoomRateConfigService.cs new file mode 100644 index 0000000..eeedd8c --- /dev/null +++ b/AdminSrc/AdminService/EmptyRoomRate/EmptyRoomRateConfigService.cs @@ -0,0 +1,101 @@ +using System.Linq.Expressions; +using Common; +using CommonDomain; +using CommonDomain.Enum; +using Microsoft.Extensions.Logging; +using MongoRepository; + +namespace AdminService.EmptyRoomRate +{ + public class EmptyRoomRateConfigService : IEmptyRoomRateConfigService + { + private readonly IMongoBaseRepository _emptyRoomRateMongo; + + public EmptyRoomRateConfigService( + IMongoBaseRepository emptyRoomRateMongo) + { + _emptyRoomRateMongo = emptyRoomRateMongo; + } + + /// + public async Task<(List list, long count)> GetList(int page, int size, GameTypeEnum? gameType, int? roomLevel) + { + Expression> filter = c => true; + + if (gameType.HasValue) + { + var type = gameType.Value; + filter = filter.And(c => c.GameType == type); + } + + if (roomLevel.HasValue) + { + var level = roomLevel.Value; + filter = filter.And(c => c.RoomLevel == level); + } + + var (total, list) = await _emptyRoomRateMongo.QueryPageAsync(filter, c => c.Id, false, size, page); + + return (list, total); + } + + /// + public async Task<(bool isok, string msg)> Add(GameTypeEnum gameType, int roomLevel, int emptyRoomRate) + { + if (emptyRoomRate < 0 || emptyRoomRate > 100) + return (false, "空房率必须在0到100之间"); + + if (gameType == GameTypeEnum.中国象棋) + roomLevel = 0; + + var existing = gameType == GameTypeEnum.中国象棋 + ? await _emptyRoomRateMongo.FindOneAsync(c => c.GameType == gameType) + : await _emptyRoomRateMongo.FindOneAsync(c => c.GameType == gameType && c.RoomLevel == roomLevel); + if (existing != null) + { + return (false, "该游戏类型与房间等级的组合已存在"); + } + + await _emptyRoomRateMongo.InsertOneAsync(new EmptyRoomRateConfig + { + GameType = gameType, + RoomLevel = roomLevel, + EmptyRoomRate = emptyRoomRate + }); + + return (true, "新增成功"); + } + + /// + public async Task<(bool isok, string msg)> Update(string id, int emptyRoomRate) + { + if (emptyRoomRate < 0 || emptyRoomRate > 100) + return (false, "空房率必须在0到100之间"); + + var config = await _emptyRoomRateMongo.FindByIdAsync(id); + if (config == null) + { + return (false, "配置不存在"); + } + + config.EmptyRoomRate = emptyRoomRate; + await _emptyRoomRateMongo.ReplaceOneAsync(config); + + return (true, "修改成功"); + } + + /// + public async Task<(bool isok, string msg)> Delete(string id) + { + var config = await _emptyRoomRateMongo.FindByIdAsync(id); + if (config == null) + { + return (false, "配置不存在"); + } + + await _emptyRoomRateMongo.DeleteByIdAsync(id); + + return (true, "删除成功"); + } + } +} diff --git a/AdminSrc/AdminService/EmptyRoomRate/IEmptyRoomRateConfigService.cs b/AdminSrc/AdminService/EmptyRoomRate/IEmptyRoomRateConfigService.cs new file mode 100644 index 0000000..8d08efd --- /dev/null +++ b/AdminSrc/AdminService/EmptyRoomRate/IEmptyRoomRateConfigService.cs @@ -0,0 +1,16 @@ +using CommonDomain; +using CommonDomain.Enum; + +namespace AdminService.EmptyRoomRate +{ + public interface IEmptyRoomRateConfigService + { + Task<(List list, long count)> GetList(int page, int size, GameTypeEnum? gameType, int? roomLevel); + + Task<(bool isok, string msg)> Add(GameTypeEnum gameType, int roomLevel, int emptyRoomRate); + + Task<(bool isok, string msg)> Update(string id, int emptyRoomRate); + + Task<(bool isok, string msg)> Delete(string id); + } +} \ No newline at end of file diff --git a/AdminSrc/AdminService/Faq/FaqService.cs b/AdminSrc/AdminService/Faq/FaqService.cs new file mode 100644 index 0000000..2702be0 --- /dev/null +++ b/AdminSrc/AdminService/Faq/FaqService.cs @@ -0,0 +1,157 @@ + +using CommonDomain; +using MongoRepository; + +namespace AdminService.Faq +{ + public class FaqService : IFaqService + { + private readonly IMongoBaseRepository _categoryRepo; + private readonly IMongoBaseRepository _questionRepo; + + public FaqService( + IMongoBaseRepository categoryRepo, + IMongoBaseRepository questionRepo) + { + _categoryRepo = categoryRepo; + _questionRepo = questionRepo; + } + + + public async Task> GetAllCategories() + { + var list = await _categoryRepo.FilterByAsync(x => x.IsEnable); + return list.OrderBy(x => x.Sort).ToList(); + } + + public async Task> GetCategoryTree() + { + var allCategories = await _categoryRepo.FilterByAsync(x => true); + var sortedList = allCategories.OrderBy(x => x.Sort).ToList(); + + var nodeDict = sortedList.ToDictionary( + x => x.Id, + x => new FaqCategoryTreeNode + { + Id = x.Id, + Name = x.Name, + Icon = x.Icon, + Sort = x.Sort, + IsEnable = x.IsEnable, + Children = new List() + } + ); + + var rootNodes = new List(); + + foreach (var category in sortedList) + { + var node = nodeDict[category.Id!]; + + if (string.IsNullOrEmpty(category.ParentId)) + { + rootNodes.Add(node); + } + else if (nodeDict.ContainsKey(category.ParentId)) + { + nodeDict[category.ParentId!].Children.Add(node); + } + else + { + rootNodes.Add(node); + } + } + + return rootNodes; + } + + public async Task GetCategoryById(string id) + { + return await _categoryRepo.FindOneAsync(x => x.Id == id); + } + + public async Task<(bool ok, string msg)> AddCategory(FaqCategory category) + { + return await _categoryRepo.InsertOneAsync(category); + } + + public async Task<(bool ok, string msg)> UpdateCategory(FaqCategory category) + { + var existing = await _categoryRepo.FindOneAsync(x => x.Id == category.Id); + if (existing == null) + return (false, "板块不存在"); + + existing.ParentId = category.ParentId; + existing.Name = category.Name; + existing.Icon = category.Icon; + existing.Sort = category.Sort; + existing.IsEnable = category.IsEnable; + + return await _categoryRepo.ReplaceOneAsync(existing); + } + + public async Task<(bool ok, string msg)> DeleteCategory(string id) + { + var hasChildren = await _categoryRepo.FindOneAsync(x => x.ParentId == id); + if (hasChildren != null) + return (false, "该分类下存在子分类,请先删除子分类"); + + var questions = await _questionRepo.FilterByAsync(x => x.CategoryId == id); + if (questions.Any()) + return (false, "该板块下存在问题,请先删除相关问题"); + + return await _categoryRepo.DeleteByIdAsync(id); + } + + + public async Task> GetQuestionsByCategory(string categoryId) + { + var list = await _questionRepo.FilterByAsync(x => x.CategoryId == categoryId && x.IsEnable); + return list.OrderBy(x => x.Sort).ToList(); + } + + public async Task<(List list, long count)> QueryQuestions(string? categoryId, int pageIndex, int pageSize) + { + var result = await _questionRepo.QueryPageAsync( + filterExpression: x => + (string.IsNullOrEmpty(categoryId) || x.CategoryId == categoryId), + orderExpression: x => x.Sort, + desc: false, + pageSize: pageSize, + pageIndex: pageIndex + ); + return (result.list?.OrderBy(x => x.Sort).ToList() ?? new List(), result.count); + } + + public async Task GetQuestionById(string id) + { + return await _questionRepo.FindOneAsync(x => x.Id == id); + } + + public async Task<(bool ok, string msg)> AddQuestion(FaqQuestion question) + { + question.CreateTime = DateTime.Now; + return await _questionRepo.InsertOneAsync(question); + } + + public async Task<(bool ok, string msg)> UpdateQuestion(FaqQuestion question) + { + var existing = await _questionRepo.FindOneAsync(x => x.Id == question.Id); + if (existing == null) + return (false, "问题不存在"); + + existing.CategoryId = question.CategoryId; + existing.Title = question.Title; + existing.Content = question.Content; + existing.Sort = question.Sort; + existing.IsEnable = question.IsEnable; + + return await _questionRepo.ReplaceOneAsync(existing); + } + + public async Task<(bool ok, string msg)> DeleteQuestion(string id) + { + return await _questionRepo.DeleteByIdAsync(id); + } + } +} diff --git a/AdminSrc/AdminService/Faq/IFaqService.cs b/AdminSrc/AdminService/Faq/IFaqService.cs new file mode 100644 index 0000000..498e639 --- /dev/null +++ b/AdminSrc/AdminService/Faq/IFaqService.cs @@ -0,0 +1,22 @@ +using CommonDomain; +using MongoRepository; + +namespace AdminService.Faq +{ + public interface IFaqService + { + Task> GetAllCategories(); + Task> GetCategoryTree(); + Task GetCategoryById(string id); + Task<(bool ok, string msg)> AddCategory(FaqCategory category); + Task<(bool ok, string msg)> UpdateCategory(FaqCategory category); + Task<(bool ok, string msg)> DeleteCategory(string id); + + Task> GetQuestionsByCategory(string categoryId); + Task<(List list, long count)> QueryQuestions(string? categoryId, int pageIndex, int pageSize); + Task GetQuestionById(string id); + Task<(bool ok, string msg)> AddQuestion(FaqQuestion question); + Task<(bool ok, string msg)> UpdateQuestion(FaqQuestion question); + Task<(bool ok, string msg)> DeleteQuestion(string id); + } +} diff --git a/AdminSrc/AdminService/GameConfigs/ActivityConfigService.cs b/AdminSrc/AdminService/GameConfigs/ActivityConfigService.cs new file mode 100644 index 0000000..afd05bf --- /dev/null +++ b/AdminSrc/AdminService/GameConfigs/ActivityConfigService.cs @@ -0,0 +1,109 @@ +using CommonDomain; +using DotNetCore.CAP; +using Microsoft.Extensions.Logging; +using MongoRepository; +using RedisService; + +namespace AdminService.GameConfigs +{ + public class ActivityConfigService : IActivityConfigService + { + private readonly IMongoBaseRepository _mongo; + private readonly IRedisService _redis; + private readonly ICapPublisher _capPublisher; + private readonly ILogger _logger; + + public ActivityConfigService( + IMongoBaseRepository mongo, + IRedisService redis, + ICapPublisher capPublisher, + ILogger logger) + { + _mongo = mongo; + _redis = redis; + _capPublisher = capPublisher; + _logger = logger; + } + + public async Task Get() + { + var config = _redis.GetActivityConfig(); + if (config == null) + { + config = await _mongo.FindOneAsync(c => true); + if (config != null) + _redis.SetActivityConfig(config); + } + + if (config != null && config.AutoStopExpired(DateTimeOffset.UtcNow.ToUnixTimeSeconds())) + { + _redis.SetActivityConfig(config); + var result = await _mongo.ReplaceOneAsync(config); + + } + return config; + } + + public async Task<(bool isok, string msg)> Update(ActivityConfig config) + { + var operationId = Guid.NewGuid().ToString("N"); + var startedAt = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + bool isadd = false; + var model = await Get(); + if (model == null) + { + isadd = true; + config.Id = Guid.NewGuid().ToString("N"); + } + else + { + config.Id = model.Id; + } + + var saveResult = isadd + ? await _mongo.InsertOneAsync(config) + : await _mongo.ReplaceOneAsync(config); + if (!saveResult.ok) + { + + return (false, saveResult.message); + } + + _redis.SetActivityConfig(config); + + var existing = _redis.GetFishingKillConfig(); + if (existing != null) + { + existing.BattleOrderIsOpen = config.BattleOrderConfig?.IsOpen ?? false; + _redis.SetFishingKillConfig(existing); + } + + + + try + { + var publishedAt = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + _capPublisher.Publish(TopicKeys.配置变更, new ConfigChangedMessage + { + ConfigType = "ActivityConfig", + OperationId = operationId, + PublishedAtUnixMs = publishedAt + }); + + } + catch (Exception ex) + { + _logger.LogError(ex, "[ActivityConfig] CAP发布失败 operationId={OperationId} topic={Topic}", operationId, TopicKeys.配置变更); + return (false, $"数据已保存,但刷新通知发布失败,操作编号:{operationId}"); + } + + return saveResult; + } + + public async Task<(bool isok, string msg)> Delete() + { + _redis.RemoveActivityConfig(); + return await _mongo.DeleteOneAsync(c => true); + } + } +} diff --git a/AdminSrc/AdminService/GameConfigs/GameConfigService.cs b/AdminSrc/AdminService/GameConfigs/GameConfigService.cs new file mode 100644 index 0000000..a4dbfbf --- /dev/null +++ b/AdminSrc/AdminService/GameConfigs/GameConfigService.cs @@ -0,0 +1,354 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AutoMapper; +using CommonDomain; +using CommonDomain.BaseModel; +using CommonDomain.Enum; +using DotNetCore.CAP; +using Microsoft.Extensions.Logging; +using MongoRepository; +using NewLife; +using RedisService; +using RedisService.Param; + +namespace AdminService.GameConfigs +{ + public class GameConfigService : IGameConfigService + { + private readonly IMongoBaseRepository _mongo; + private readonly IMapper _mapper; + private IRedisService _redis; + private readonly ICapPublisher _capPublisher; + private readonly IMongoBaseRepository _botProfileRepo; + private readonly IMongoBaseRepository _emptyRoomRateRepo; + private readonly ILogger _logger; + + public GameConfigService(IMongoBaseRepository mongo, IMapper mapper, IRedisService redis, ICapPublisher capPublisher, IMongoBaseRepository botProfileRepo, IMongoBaseRepository emptyRoomRateRepo, ILogger logger) + { + _mongo = mongo; + _mapper = mapper; + _redis = redis; + _capPublisher = capPublisher; + _botProfileRepo = botProfileRepo; + _emptyRoomRateRepo = emptyRoomRateRepo; + _logger = logger; + } + + public async Task Get() + { + var gameConfig = _redis.GetGameConfig(); + if (gameConfig == null) + { + gameConfig = await _mongo.FindOneAsync(c => true); + if (gameConfig != null) + _redis.SetGameConfig(gameConfig); + } + return gameConfig; + } + public async Task<(bool isok, string msg)> Update(GameConfig gameConfig) + { + NormalizeFishReferences(gameConfig); + var operationId = Guid.NewGuid().ToString("N"); + var startedAt = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + bool isadd = false; + var model = await Get(); + if (model == null) + { + isadd = true; + gameConfig.Id = Guid.NewGuid().ToString("N"); + } + else + { + gameConfig.Id = model.Id; + } + + var saveResult = isadd + ? await _mongo.InsertOneAsync(gameConfig) + : await _mongo.ReplaceOneAsync(gameConfig); + if (!saveResult.ok) + { + + return saveResult; + } + + _redis.SetGameConfig(gameConfig); + + + var killConfig = new FishingKillConfig + { + FishTypeConfigs = gameConfig.FishTypeConfigs?.Select(f => new FishTypeBriefConfig + { + FishNumber = f.FishNumber, + FishName = f.FishName, + FishType = f.FishType, + FishScore = f.FishScore, + KillWeight = f.KillWeight + }).ToList(), + KillConfig = gameConfig.KillConfig, + BossConfigs = gameConfig.BossConfigs, + BossDropConfig = gameConfig.BossDropConfig, + BattleOrderIsOpen = _redis.GetActivityConfig()?.BattleOrderConfig?.IsOpen ?? false + }; + _redis.SetFishingKillConfig(killConfig); + + try + { + var fishSpawnJson = FishSpawnExtractor.ExtractToJson(gameConfig); + _redis.SetFishSpawnConfig(fishSpawnJson); + + } + catch (Exception ex) + { + _logger.LogError(ex, "[FishSpawn] 出鱼配置提取失败"); + } + + try + { + var publishedAt = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + _capPublisher.Publish(TopicKeys.配置变更, new ConfigChangedMessage + { + ConfigType = "GameConfig", + OperationId = operationId, + PublishedAtUnixMs = publishedAt + }); + + } + catch (Exception ex) + { + _logger.LogError(ex, "[GameConfig] CAP配置变更事件发布失败 operationId={OperationId}", operationId); + } + + return saveResult; + } + + private static void NormalizeFishReferences(GameConfig gameConfig) + { + if (gameConfig == null) + return; + + gameConfig.FishTypeConfigs ??= new List(); + gameConfig.FishArrayConfigs ??= new List(); + gameConfig.RoomFishConfigs ??= new List(); + + var validFishNumbers = gameConfig.FishTypeConfigs + .Where(f => f != null && !string.IsNullOrWhiteSpace(f.FishNumber)) + .Select(f => f.FishNumber) + .ToHashSet(StringComparer.Ordinal); + + gameConfig.FishArrayConfigs = gameConfig.FishArrayConfigs + .Where(a => a != null + && (string.IsNullOrWhiteSpace(a.FishNumber) || validFishNumbers.Contains(a.FishNumber)) + && (string.IsNullOrWhiteSpace(a.BossFishNumber) || validFishNumbers.Contains(a.BossFishNumber))) + .ToList(); + var validArrayNumbers = gameConfig.FishArrayConfigs + .Where(a => !string.IsNullOrWhiteSpace(a.FishArrayNumber)) + .Select(a => a.FishArrayNumber) + .ToHashSet(StringComparer.Ordinal); + + bool IsValidRoomFish(RoomFishDetailConfig item) => item != null && item.Type switch + { + 1 => validFishNumbers.Contains(item.FishNumber), + 2 => validArrayNumbers.Contains(item.FishNumber), + _ => false + }; + + foreach (var roomFishConfig in gameConfig.RoomFishConfigs.Where(c => c != null)) + { + roomFishConfig.NormalFishList = (roomFishConfig.NormalFishList ?? new List()) + .Where(IsValidRoomFish).ToList(); + roomFishConfig.RoomFishLevelList = (roomFishConfig.RoomFishLevelList ?? new List()) + .Where(IsValidRoomFish).ToList(); + } + + static void CleanFishNumbers(BossConfig.BaseBossConfig config, HashSet validNumbers) + { + if (config == null) return; + config.FishNumber = (config.FishNumber ?? new List()) + .Where(validNumbers.Contains).Distinct().ToList(); + } + + var boss = gameConfig.BossConfigs; + if (boss != null) + { + boss.LuckWheel = (boss.LuckWheel ?? new List()) + .Where(c => c != null).ToList(); + boss.LuckWheel.ForEach(c => CleanFishNumbers(c, validFishNumbers)); + boss.LuckWheel = boss.LuckWheel.Where(c => c.FishNumber.Count > 0).ToList(); + + CleanFishNumbers(boss.LuckPoker, validFishNumbers); + + boss.LuckFlyDisk = (boss.LuckFlyDisk ?? new List()) + .Where(c => c != null).ToList(); + boss.LuckFlyDisk.ForEach(c => CleanFishNumbers(c, validFishNumbers)); + boss.LuckFlyDisk = boss.LuckFlyDisk.Where(c => c.FishNumber.Count > 0).ToList(); + + CleanFishNumbers(boss.FullScreen, validFishNumbers); + CleanFishNumbers(boss.Range, validFishNumbers); + CleanFishNumbers(boss.AmmunitionBox, validFishNumbers); + CleanFishNumbers(boss.InterstellarCruise, validFishNumbers); + CleanFishNumbers(boss.FlameStorm, validFishNumbers); + CleanFishNumbers(boss.Bomb, validFishNumbers); + CleanFishNumbers(boss.Scorpion, validFishNumbers); + + boss.Probability = (boss.Probability ?? new List()) + .Where(c => c != null).ToList(); + boss.Probability.ForEach(c => CleanFishNumbers(c, validFishNumbers)); + boss.Probability = boss.Probability.Where(c => c.FishNumber.Count > 0).ToList(); + + boss.LuckDragon = (boss.LuckDragon ?? new List()) + .Where(c => c != null).ToList(); + boss.LuckDragon.ForEach(c => CleanFishNumbers(c, validFishNumbers)); + boss.LuckDragon = boss.LuckDragon.Where(c => c.FishNumber.Count > 0).ToList(); + } + + if (gameConfig.RobotKillConfig != null) + { + gameConfig.RobotKillConfig.Scenes = (gameConfig.RobotKillConfig.Scenes ?? new List()) + .Where(s => s != null && validFishNumbers.Contains(s.FishNumber)) + .ToList(); + } + } + + public async Task<(bool isok, string msg)> Delete() + { + _redis.RemoveGameConfig(); + + + return await _mongo.DeleteOneAsync(c=>true); + + } + + + + public async Task> InitRoom(GameTypeEnum gameType = GameTypeEnum.None, int roomLevel = 0, GameConfig gameConfig = null) + { + + List result = new List(); + + if (gameConfig == null) + { + gameConfig = await Get(); + } + + if (gameConfig == null || gameConfig.RoomConfigs == null || gameConfig.RoomConfigs.Count == 0) + { + return result; + } + + var roomConfig = gameConfig.RoomConfigs.AsEnumerable(); + if (gameType != GameTypeEnum.None) + roomConfig = roomConfig.Where(c => c.GameType == gameType); + if (roomLevel > 0) + roomConfig = roomConfig.Where(c => c.RoomLevel == roomLevel); + + var roomList = roomConfig.ToList(); + if (roomList.Count == 0) + return result; + + var initBotProfiles = RoomBotFactory.FixedBotSeatsEnabled + ? _botProfileRepo.FilterBy(p => true).ToList() + : null; + + foreach (var item in roomList.Where(c=>c.GameType!= GameTypeEnum.中国象棋)) + { + var rateConfig = _emptyRoomRateRepo + .FilterBy(c => c.GameType == item.GameType && c.RoomLevel == item.RoomLevel && !c.IsDelete) + .FirstOrDefault(); + var botsEnabled = gameConfig.BotConfig?.Enabled == true; + var emptyRate = botsEnabled ? Math.Clamp(rateConfig?.EmptyRoomRate ?? 0, 0, 100) : 100; + var totalRoomCount = item.RoomPartitionNum * item.RoomCount; + var roomsWithBots = emptyRate > 0 + ? (int)Math.Floor(totalRoomCount * (100 - emptyRate) / 100.0) + : totalRoomCount; + var botRoomIndexes = Enumerable.Range(0, totalRoomCount) + .OrderBy(_ => global::System.Random.Shared.Next()) + .Take(roomsWithBots) + .ToHashSet(); + + for (var i = 1; i <= item.RoomPartitionNum; i++) + { + _redis.RemoveGameRoom($"{(int)item.GameType}{item.RoomLevel}{i}"); + + for (int c = 0; c < item.RoomCount; c++) + { + RedisGameRoom room = new RedisGameRoom() + { + RoomName = item.RoomName, + GameType = item.GameType, + RoomLevel = item.RoomLevel, + RoomPartition = i, + RoomNumber = c, + MaxPlayerCount = (item.GameType == GameTypeEnum.星际迷航 || item.GameType == GameTypeEnum.中国象棋) ? 2 : 4, + CurrentOnlinePlayerCount = 0, + + }; + var roomIndex = (i - 1) * item.RoomCount + c; + room.RobotCount = botsEnabled && botRoomIndexes.Contains(roomIndex) + ? global::System.Random.Shared.Next(1, room.MaxPlayerCount) + : 0; + room.RoomId = $"{(int)room.GameType}{room.RoomLevel}{room.RoomPartition}{c.ToString("00")}"; + + if (room.RobotCount > 0 && RoomBotFactory.FixedBotSeatsEnabled) + { + var fixedBots = RoomBotFactory.CreateFixedSeatBots(room, item, gameConfig, initBotProfiles); + if (fixedBots.Count > 0) + { + room.Players.AddRange(fixedBots); + room.RobotCount = fixedBots.Count; + } + } + + result.Add(room); + } + } + } + foreach (var item in result) + { + _redis.SetGameRoom(item); + } + + return result; + + } + + + public Task InitDefaultConfig() + { + return Task.FromResult("初始化配置请使用GameConfigController的Init接口"); + } + + public async Task ResetDefaultRoomConfigs() + { + var config = await Get(); + if (config == null) return; + + var chessConfigs = config.RoomConfigs?.Where(c => c.GameType == GameTypeEnum.中国象棋).ToList() ?? new List(); + + config.RoomConfigs = new List(); + + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20011", RoomName = "初级场", GameType = GameTypeEnum.风雷之渊, RoomLevel = 1, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 100000, CannonMultipleList = new List { 1000, 2000, 3000, 5000, 6000, 7000, 8000, 9000, 10000, 20000 } }); + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20012", RoomName = "中级场", GameType = GameTypeEnum.风雷之渊, RoomLevel = 2, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 1000000, CannonMultipleList = new List { 100, 200, 300, 500, 600, 700, 800, 900, 1000, 2000 } }); + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20013", RoomName = "高级场", GameType = GameTypeEnum.风雷之渊, RoomLevel = 3, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 2000000, CannonMultipleList = new List { 2000, 3000, 5000, 6000, 7000, 8000, 9000, 10000, 20000, 50000 } }); + + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20021", RoomName = "初级场", GameType = GameTypeEnum.永夜尸城, RoomLevel = 1, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 100000, CannonMultipleList = new List { 1000, 2000, 3000, 5000, 6000, 7000, 8000, 9000, 10000, 20000 } }); + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20022", RoomName = "中级场", GameType = GameTypeEnum.永夜尸城, RoomLevel = 2, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 1000000, CannonMultipleList = new List { 100, 200, 300, 500, 600, 700, 800, 900, 1000, 2000 } }); + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20023", RoomName = "高级场", GameType = GameTypeEnum.永夜尸城, RoomLevel = 3, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 2000000, CannonMultipleList = new List { 2000, 3000, 5000, 6000, 7000, 8000, 9000, 10000, 20000, 50000 } }); + + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20041", RoomName = "初级场", GameType = GameTypeEnum.星际迷航, RoomLevel = 1, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 100000, CannonMultipleList = new List { 1000, 2000, 3000, 5000, 6000, 7000, 8000, 9000, 10000, 20000 } }); + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20042", RoomName = "中级场", GameType = GameTypeEnum.星际迷航, RoomLevel = 2, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 1000000, CannonMultipleList = new List { 100, 200, 300, 500, 600, 700, 800, 900, 1000, 2000 } }); + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20043", RoomName = "高级场", GameType = GameTypeEnum.星际迷航, RoomLevel = 3, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 2000000, CannonMultipleList = new List { 2000, 3000, 5000, 6000, 7000, 8000, 9000, 10000, 20000, 50000 } }); + + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20051", RoomName = "初级场", GameType = GameTypeEnum.黑神话悟空, RoomLevel = 1, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 100000, CannonMultipleList = new List { 1000, 2000, 3000, 5000, 6000, 7000, 8000, 9000, 10000, 20000 } }); + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20052", RoomName = "中级场", GameType = GameTypeEnum.黑神话悟空, RoomLevel = 2, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 1000000, CannonMultipleList = new List { 100, 200, 300, 500, 600, 700, 800, 900, 1000, 2000 } }); + config.RoomConfigs.Add(new RoomConfig() { RoomNumber = "20053", RoomName = "高级场", GameType = GameTypeEnum.黑神话悟空, RoomLevel = 3, RoomPartitionNum = 4, RoomCount = 100, RoomGoldLimit = 2000000, CannonMultipleList = new List { 2000, 3000, 5000, 6000, 7000, 8000, 9000, 10000, 20000, 50000 } }); + + if (chessConfigs.Any()) + config.RoomConfigs.AddRange(chessConfigs); + + await Update(config); + } + } +} diff --git a/AdminSrc/AdminService/GameConfigs/IActivityConfigService.cs b/AdminSrc/AdminService/GameConfigs/IActivityConfigService.cs new file mode 100644 index 0000000..58b3f65 --- /dev/null +++ b/AdminSrc/AdminService/GameConfigs/IActivityConfigService.cs @@ -0,0 +1,13 @@ +using CommonDomain; + +namespace AdminService.GameConfigs +{ + public interface IActivityConfigService + { + Task Get(); + + Task<(bool isok, string msg)> Update(ActivityConfig config); + + Task<(bool isok, string msg)> Delete(); + } +} diff --git a/AdminSrc/AdminService/GameConfigs/IGameConfigService.cs b/AdminSrc/AdminService/GameConfigs/IGameConfigService.cs new file mode 100644 index 0000000..c6dcbab --- /dev/null +++ b/AdminSrc/AdminService/GameConfigs/IGameConfigService.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CommonDomain; +using CommonDomain.Enum; +using RedisService.Param; + +namespace AdminService.GameConfigs +{ + public interface IGameConfigService + { + + Task Get(); + Task<(bool isok, string msg)> Update(GameConfig gameConfig); + + Task<(bool isok, string msg)> Delete(); + + + Task> InitRoom(GameTypeEnum gameType = GameTypeEnum.None, int roomLevel = 0, GameConfig gameConfig = null); + + Task InitDefaultConfig(); + + Task ResetDefaultRoomConfigs(); + } +} diff --git a/AdminSrc/AdminService/ImageUpload/IImageUploadService.cs b/AdminSrc/AdminService/ImageUpload/IImageUploadService.cs new file mode 100644 index 0000000..567391c --- /dev/null +++ b/AdminSrc/AdminService/ImageUpload/IImageUploadService.cs @@ -0,0 +1,26 @@ +using Microsoft.AspNetCore.Http; + +namespace AdminService.ImageUpload +{ + public interface IImageUploadService + { + bool ValidateImage(IFormFile file, out string errorMessage); + + Task<(bool isOk, string path, string fileName, string errorMessage)> UploadImageAsync(IFormFile file, string? customName = null); + + Task> UploadBatchImagesAsync(IFormFile[] files); + } + + public class BatchUploadResult + { + public string OriginalFileName { get; set; } = string.Empty; + + public bool Success { get; set; } + + public string? Path { get; set; } + + public string? FileName { get; set; } + + public string? Message { get; set; } + } +} diff --git a/AdminSrc/AdminService/ImageUpload/ImageUploadService.cs b/AdminSrc/AdminService/ImageUpload/ImageUploadService.cs new file mode 100644 index 0000000..974e6c8 --- /dev/null +++ b/AdminSrc/AdminService/ImageUpload/ImageUploadService.cs @@ -0,0 +1,142 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Logging; + +namespace AdminService.ImageUpload +{ + public class ImageUploadService : IImageUploadService + { + private readonly ILogger _logger; + private static readonly string[] AllowedExtensions = { ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp" }; + private const long MaxFileSize = 5 * 1024 * 1024; // 5MB + private const string UploadFolder = "wwwroot/uploads/temp"; + + public ImageUploadService(ILogger logger) + { + _logger = logger; + } + + public bool ValidateImage(IFormFile file, out string errorMessage) + { + errorMessage = string.Empty; + + if (file == null || file.Length == 0) + { + errorMessage = "请选择要上传的文件"; + return false; + } + + var ext = Path.GetExtension(file.FileName).ToLowerInvariant(); + if (!AllowedExtensions.Contains(ext)) + { + errorMessage = "只支持上传图片格式:jpg、jpeg、png、gif、bmp、webp"; + return false; + } + + if (file.Length > MaxFileSize) + { + errorMessage = "文件大小不能超过5MB"; + return false; + } + + return true; + } + + public async Task<(bool isOk, string path, string fileName, string errorMessage)> UploadImageAsync(IFormFile file, string? customName = null) + { + if (!ValidateImage(file, out var errorMessage)) + { + return (false, string.Empty, string.Empty, errorMessage); + } + + try + { + var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + string fileName; + string relativePath; + + if (!string.IsNullOrWhiteSpace(customName)) + { + fileName = customName + ".png"; + var uploadPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "uploads"); + if (!Directory.Exists(uploadPath)) + Directory.CreateDirectory(uploadPath); + var filePath = Path.Combine(uploadPath, fileName); + using (var stream = new FileStream(filePath, FileMode.Create)) + { + await file.CopyToAsync(stream); + } + relativePath = $"/uploads/{fileName}?timespan={timestamp}"; + } + else + { + var ext = Path.GetExtension(file.FileName).ToLowerInvariant(); + fileName = Guid.NewGuid().ToString("N") + ext; + var uploadPath = Path.Combine(Directory.GetCurrentDirectory(), UploadFolder); + if (!Directory.Exists(uploadPath)) + Directory.CreateDirectory(uploadPath); + var filePath = Path.Combine(uploadPath, fileName); + using (var stream = new FileStream(filePath, FileMode.Create)) + { + await file.CopyToAsync(stream); + } + relativePath = $"/uploads/temp/{fileName}?timespan={timestamp}"; + } + + return (true, relativePath, fileName, string.Empty); + } + catch (Exception ex) + { + _logger.LogError(ex, "图片上传失败: {Message}", ex.Message); + return (false, string.Empty, string.Empty, $"上传失败:{ex.Message}"); + } + } + + public async Task> UploadBatchImagesAsync(IFormFile[] files) + { + var results = new List(); + + foreach (var file in files) + { + var result = new BatchUploadResult + { + OriginalFileName = file.FileName + }; + + if (file.Length == 0) + { + result.Success = false; + result.Message = "文件为空"; + results.Add(result); + continue; + } + + if (!ValidateImage(file, out var errorMessage)) + { + result.Success = false; + result.Message = errorMessage; + results.Add(result); + continue; + } + + try + { + var uploadResult = await UploadImageAsync(file); + result.Success = uploadResult.isOk; + result.Path = uploadResult.path; + result.FileName = uploadResult.fileName; + result.Message = uploadResult.errorMessage; + } + catch (Exception ex) + { + result.Success = false; + result.Message = "上传失败"; + _logger.LogError(ex, "批量上传中单个文件上传失败: {FileName}", file.FileName); + } + + results.Add(result); + } + + return results; + } + } +} diff --git a/AdminSrc/AdminService/Notices/INoticeService.cs b/AdminSrc/AdminService/Notices/INoticeService.cs new file mode 100644 index 0000000..c43fc4a --- /dev/null +++ b/AdminSrc/AdminService/Notices/INoticeService.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AdminService.Notices.Param; +using UserDomain.Entity; + +namespace AdminService.Notices +{ + public interface INoticeService + { + + Task<(bool isok, string msg)> Add(AddNoticeParam param); + Task<(bool isok, string msg)> Update(UpdateNoticeParam param); + + Task<(bool isok, string msg)> Delete(string id); + + Task Get(string id); + + + Task<(List list, long count)> GetList(GetNoticeListParam param); + + } +} diff --git a/AdminSrc/AdminService/Notices/NoticeService.cs b/AdminSrc/AdminService/Notices/NoticeService.cs new file mode 100644 index 0000000..69706b4 --- /dev/null +++ b/AdminSrc/AdminService/Notices/NoticeService.cs @@ -0,0 +1,149 @@ +using AdminService.Notices.Param; +using AutoMapper; +using Common; +using Common.Utils; +using Microsoft.Extensions.Logging; +using MongoDB.Bson; +using MongoRepository; +using UserDomain.Entity; +using System.Text.RegularExpressions; + +namespace AdminService.Notices +{ + public class NoticeService : INoticeService + { + private readonly IMongoBaseRepository _noticeMongo; + private readonly IMapper _mapper; + + + public NoticeService(IMongoBaseRepository noticeMongo, IMapper mapper) + { + _noticeMongo = noticeMongo; + _mapper = mapper; + } + + + private void MoveTempFiles(Notice notice) + { + var wwwroot = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot"); + var tempDir = Path.Combine(wwwroot, "uploads", "temp"); + var noticeDir = Path.Combine(wwwroot, "uploads", "notice"); + if (!Directory.Exists(noticeDir)) Directory.CreateDirectory(noticeDir); + + var paths = new List(); + + if (!string.IsNullOrEmpty(notice.Content)) + { + foreach (Match m in Regex.Matches(notice.Content, @"/uploads/temp/([^""'\s]+)")) + { + paths.Add(m.Value); + } + } + + if (!string.IsNullOrEmpty(notice.TopImage) && notice.TopImage.Contains("/uploads/temp/")) + paths.Add(notice.TopImage); + + if (notice.ContentImages != null) + { + foreach (var img in notice.ContentImages) + { + if (!string.IsNullOrEmpty(img) && img.Contains("/uploads/temp/")) + paths.Add(img); + } + } + + foreach (var path in paths) + { + var cleanPath = path.Split('?', '#')[0]; + var fileName = Path.GetFileName(cleanPath); + if (string.IsNullOrWhiteSpace(fileName)) + continue; + var src = Path.Combine(tempDir, fileName); + var dest = Path.Combine(noticeDir, fileName); + if (File.Exists(src)) + { + File.Move(src, dest, overwrite: true); + } + else + { + + } + } + + if (!string.IsNullOrEmpty(notice.Content)) + notice.Content = notice.Content.Replace("/uploads/temp/", "/uploads/notice/"); + if (!string.IsNullOrEmpty(notice.TopImage)) + notice.TopImage = notice.TopImage.Replace("/uploads/temp/", "/uploads/notice/"); + if (notice.ContentImages != null) + { + for (int i = 0; i < notice.ContentImages.Count; i++) + { + if (!string.IsNullOrEmpty(notice.ContentImages[i])) + notice.ContentImages[i] = notice.ContentImages[i].Replace("/uploads/temp/", "/uploads/notice/"); + } + } + } + + public async Task<(bool isok, string msg)> Add(AddNoticeParam param) + { + var model = _mapper.Map(param); + model.Id = ObjectId.GenerateNewId().ToString(); + + model.CreateTime = DateTime.Now.ToTimeStamp(); + + MoveTempFiles(model); + + return await _noticeMongo.InsertOneAsync(model); + } + public async Task<(bool isok, string msg)> Update(UpdateNoticeParam param) + { + var model = await Get(param.Id); + if (model == null) + return (false, "该条公告不存在"); + model.Title = param.Title; + model.Content = param.Content; + model.Recommend = param.Recommend; + model.TopImage = param.TopImage; + model.ContentImages = param.ContentImages; + + MoveTempFiles(model); + + return await _noticeMongo.ReplaceOneAsync(model); + } + + public async Task<(bool isok, string msg)> Delete(string id) + { + var model = await Get(id); + if (model == null) + return (false, "该条公告不存在"); + model.IsDelete = true; + return await _noticeMongo.ReplaceOneAsync(model); + } + + public async Task Get(string id) + { + var model = await _noticeMongo.FindByIdAsync(id); + if (model == null) + return null; + if (model.IsDelete) + return null; + return model; + + } + + + public async Task<(List list, long count)> GetList(GetNoticeListParam param) + { + var where = LinqExtensions.True().And(e => e.IsDelete == false); + if (!string.IsNullOrWhiteSpace(param.KeyWord)) + where = where.And(e => e.Title.Contains(param.KeyWord)); + + + var result = await _noticeMongo.QueryPageAsync(where, c => c.CreateTime, true, param.PageSize ?? 0, param.PageIndex ?? 0); + + return (result.list, result.count); + } + + + } +} diff --git a/AdminSrc/AdminService/Notices/Param/AddNoticeParam.cs b/AdminSrc/AdminService/Notices/Param/AddNoticeParam.cs new file mode 100644 index 0000000..d478ad7 --- /dev/null +++ b/AdminSrc/AdminService/Notices/Param/AddNoticeParam.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AdminService.Notices.Param +{ + public class AddNoticeParam + { + public string Title { get; set; } + public string Content { get; set; } + + public string Recommend { get; set; } + public string TopImage { get; set; } + public List ContentImages { get; set; } + } +} diff --git a/AdminSrc/AdminService/Notices/Param/GetNoticeListParam.cs b/AdminSrc/AdminService/Notices/Param/GetNoticeListParam.cs new file mode 100644 index 0000000..6adbc29 --- /dev/null +++ b/AdminSrc/AdminService/Notices/Param/GetNoticeListParam.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Common.CommonModel; + +namespace AdminService.Notices.Param +{ + public class GetNoticeListParam : BaseListPageParam + { + + } +} diff --git a/AdminSrc/AdminService/Notices/Param/UpdateNoticeParam.cs b/AdminSrc/AdminService/Notices/Param/UpdateNoticeParam.cs new file mode 100644 index 0000000..2b8e2f8 --- /dev/null +++ b/AdminSrc/AdminService/Notices/Param/UpdateNoticeParam.cs @@ -0,0 +1,7 @@ +namespace AdminService.Notices.Param +{ + public class UpdateNoticeParam : AddNoticeParam + { + public string Id { get; set; } + } +} diff --git a/AdminSrc/AdminService/System/ISystemService.cs b/AdminSrc/AdminService/System/ISystemService.cs new file mode 100644 index 0000000..effd63e --- /dev/null +++ b/AdminSrc/AdminService/System/ISystemService.cs @@ -0,0 +1,64 @@ +using AdminService.System.Param; +using AdminService.System.Response; +using CommonInfrastructure.Response; +using Domain.Admin.Admin; + +namespace AdminService.System +{ + public interface ISystemService + { + + Task<(bool isok, string msg)> AddUser(AddUserParam param); + Task<(bool isok, string msg)> UpdateUser(UpdateUserParam param); + Task<(bool isok, string msg)> UpdateUserIcon(string id, string icon); + Task<(bool isok, string msg)> UpdateUserState(string id, int state); + + + Task GetUser(string id); + + + Task GetUserByName(string userName); + Task<(bool isok, string msg, AdminUserToken? model)> UserLogin(string userName, string password); + Task<(List list, long count)> GetUserList(GetUserListParam param); + Task<(bool isok, string msg)> DeleteUser(string id); + + Task> GetUserNav(LoginUser loginUser); + + + + + + Task<(bool isok, string msg)> AddRole(AddRoleParam param); + Task<(bool isok, string msg)> UpdateRole(UpdateRoleParam param); + + Task<(bool isok, string msg)> UpdateRoleNav(UpdateRoleNavParam param); + Task<(bool isok, string msg)> DeleteRole(string id); + + Task> GetRoleList(); + + Task GetUserRole(string id); + + + Task<(bool isok, string msg)> AddNav(AddNavParam param); + + Task<(bool isok, string msg)> UpdateNav(UpdateNavParam param); + Task<(bool isok, string msg)> DeleteNav(string id); + + Task> GetNavList(string navId); + + + + Task<(bool isok, string msg)> AddDic(AddDicParam param); + + Task<(bool isok, string msg)> UpdateDic(UpdateDicParam param); + Task<(bool isok, string msg)> DeleteDic(string id); + + Task> GetDicList(string dicId); + + Task> GetDicListByCode(string code); + + Task GetDictByCode(string code); + + + } +} diff --git a/AdminSrc/AdminService/System/Param/AddDicParam.cs b/AdminSrc/AdminService/System/Param/AddDicParam.cs new file mode 100644 index 0000000..46ab524 --- /dev/null +++ b/AdminSrc/AdminService/System/Param/AddDicParam.cs @@ -0,0 +1,28 @@ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AdminService.System.Param +{ + public class AddDicParam + { + public string ParentId { set; get; } = ""; + + public string? Name { get; set; } + + public int Order { get; set; } + + public string? Icon { get; set; } + + public string? Value { get; set; } + public string? Code { get; set; } + + public string? Remark { get; set; } + + public string? Remark1 { get; set; } + + } +} diff --git a/AdminSrc/AdminService/System/Param/AddNavParam.cs b/AdminSrc/AdminService/System/Param/AddNavParam.cs new file mode 100644 index 0000000..ed50f8b --- /dev/null +++ b/AdminSrc/AdminService/System/Param/AddNavParam.cs @@ -0,0 +1,29 @@ +using Domain.Admin.Admin.ENum; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AdminService.System.Param +{ + public class AddNavParam + { + public string ParentId { set; get; } = ""; + + public string? Name { get; set; } + + public int Order { get; set; } + + public string? Icon { get; set; } + + public string? Url { get; set; } + + public int Category { get; set; } + + public string? Target { get; set; } + + public EnumResource IsResource { get; set; } + + } +} diff --git a/AdminSrc/AdminService/System/Param/AddRoleParam.cs b/AdminSrc/AdminService/System/Param/AddRoleParam.cs new file mode 100644 index 0000000..f8735ee --- /dev/null +++ b/AdminSrc/AdminService/System/Param/AddRoleParam.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AdminService.System.Param +{ + public class AddRoleParam + { + public string? RoleName { get; set; } + + public string? Description { get; set; } + } +} diff --git a/AdminSrc/AdminService/System/Param/AddUserParam.cs b/AdminSrc/AdminService/System/Param/AddUserParam.cs new file mode 100644 index 0000000..b48ec6a --- /dev/null +++ b/AdminSrc/AdminService/System/Param/AddUserParam.cs @@ -0,0 +1,16 @@ +using Common.CommonModel; + +namespace AdminService.System.Param +{ + public class AddUserParam + { + public string? UserName { get; set; } + public string? Icon { get; set; } + public string? DisplayName { get; set; } + public string? Password { get; set; } + + public BaseIdName SystemRole { get; set; } + + + } +} diff --git a/AdminSrc/AdminService/System/Param/GetUserListParam.cs b/AdminSrc/AdminService/System/Param/GetUserListParam.cs new file mode 100644 index 0000000..903b270 --- /dev/null +++ b/AdminSrc/AdminService/System/Param/GetUserListParam.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Common.CommonModel; + +namespace AdminService.System.Param +{ + public class GetUserListParam:BaseListPageParam + { + public int State { get; set; } = -1; + } +} diff --git a/AdminSrc/AdminService/System/Param/UpdateDicParam.cs b/AdminSrc/AdminService/System/Param/UpdateDicParam.cs new file mode 100644 index 0000000..0c5897a --- /dev/null +++ b/AdminSrc/AdminService/System/Param/UpdateDicParam.cs @@ -0,0 +1,7 @@ +namespace AdminService.System.Param +{ + public class UpdateDicParam : AddDicParam + { + public string? Id { get; set; } + } +} diff --git a/AdminSrc/AdminService/System/Param/UpdateNavParam.cs b/AdminSrc/AdminService/System/Param/UpdateNavParam.cs new file mode 100644 index 0000000..27d838d --- /dev/null +++ b/AdminSrc/AdminService/System/Param/UpdateNavParam.cs @@ -0,0 +1,7 @@ +namespace AdminService.System.Param +{ + public class UpdateNavParam:AddNavParam + { + public string? Id { get; set; } + } +} diff --git a/AdminSrc/AdminService/System/Param/UpdateRoleNavParam.cs b/AdminSrc/AdminService/System/Param/UpdateRoleNavParam.cs new file mode 100644 index 0000000..c56ddb5 --- /dev/null +++ b/AdminSrc/AdminService/System/Param/UpdateRoleNavParam.cs @@ -0,0 +1,15 @@ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AdminService.System.Param +{ + public class UpdateRoleNavParam + { + public string? Id { get; set; } + public List NavIds { get; set; } = new List(); + } +} diff --git a/AdminSrc/AdminService/System/Param/UpdateRoleParam.cs b/AdminSrc/AdminService/System/Param/UpdateRoleParam.cs new file mode 100644 index 0000000..47c4b76 --- /dev/null +++ b/AdminSrc/AdminService/System/Param/UpdateRoleParam.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AdminService.System.Param +{ + public class UpdateRoleParam : AddRoleParam + { + public string? Id { get; set; } + } +} diff --git a/AdminSrc/AdminService/System/Param/UpdateUserParam.cs b/AdminSrc/AdminService/System/Param/UpdateUserParam.cs new file mode 100644 index 0000000..8efb788 --- /dev/null +++ b/AdminSrc/AdminService/System/Param/UpdateUserParam.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AdminService.System.Param +{ + public class UpdateUserParam :AddUserParam + { + public string? Id { get; set; } + } +} diff --git a/AdminSrc/AdminService/System/Response/AdminUserToken.cs b/AdminSrc/AdminService/System/Response/AdminUserToken.cs new file mode 100644 index 0000000..99cb658 --- /dev/null +++ b/AdminSrc/AdminService/System/Response/AdminUserToken.cs @@ -0,0 +1,18 @@ +namespace AdminService.System.Response +{ + public class AdminUserToken + { + public string Token { get; set; } + + public string? UserName { get; set; } + + + public string? DisplayName { get; set; } + + public string? Icon { get; set; } + + + public DateTime RegisterTime { get; set; } = DateTime.Now; + public string UserId { get; set; } + } +} diff --git a/AdminSrc/AdminService/System/Response/SystemDicResponse.cs b/AdminSrc/AdminService/System/Response/SystemDicResponse.cs new file mode 100644 index 0000000..92fe953 --- /dev/null +++ b/AdminSrc/AdminService/System/Response/SystemDicResponse.cs @@ -0,0 +1,16 @@ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Domain.Admin.Admin; + +namespace AdminService.System.Response +{ + public class SystemDicResponse : SystemDic + { + public List Children { get; set; } =new List(); + + } +} diff --git a/AdminSrc/AdminService/System/Response/SystemNavigationResponse.cs b/AdminSrc/AdminService/System/Response/SystemNavigationResponse.cs new file mode 100644 index 0000000..9a04fec --- /dev/null +++ b/AdminSrc/AdminService/System/Response/SystemNavigationResponse.cs @@ -0,0 +1,15 @@ +using Domain.Admin.Admin; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AdminService.System.Response +{ + public class SystemNavigationResponse:SystemNavigation + { + public List Children { get; set; } =new List(); + + } +} diff --git a/AdminSrc/AdminService/System/SystemService.cs b/AdminSrc/AdminService/System/SystemService.cs new file mode 100644 index 0000000..fce4ebe --- /dev/null +++ b/AdminSrc/AdminService/System/SystemService.cs @@ -0,0 +1,469 @@ +using System.Security.Claims; +using AdminService.System.Param; +using AdminService.System.Response; +using AutoMapper; +using Common; +using Common.Utils; +using CommonInfrastructure.Response; +using Domain.Admin.Admin; +using Domain.Admin.Admin.ENum; +using JWTHelper; +using Microsoft.Extensions.Logging; +using MongoDB.Driver; +using MongoRepository; +using RedisHelper; + +namespace AdminService.System +{ + public class SystemService: ISystemService + { + private readonly IMongoBaseRepository _systemUserRepository; + private readonly IMongoBaseRepository _systemRoleRepository; + private readonly IMongoBaseRepository _navigationRepository; + private readonly IMongoBaseRepository _dicRepository; + private readonly ICache _cache; + private readonly IMapper _mapper; + private readonly JwtTools _jwtTools; + + public SystemService(IMongoBaseRepository systemUserRepository, IMongoBaseRepository systemRoleRepository, IMongoBaseRepository navigationRepository, IMongoBaseRepository dicRepository, ICache cache, IMapper mapper, JwtTools jwtTools) + { + _systemUserRepository = systemUserRepository; + _systemRoleRepository = systemRoleRepository; + _navigationRepository = navigationRepository; + _dicRepository = dicRepository; + _cache = cache; + _mapper = mapper; + _jwtTools = jwtTools; + } + + + + + + public async Task<(bool isok, string msg)> AddUser(AddUserParam param) + { + var model = await _systemUserRepository.FindOneAsync(c => (c.UserName == param.UserName || c.DisplayName == param.DisplayName) && c.IsDelete==false); + if (model != null) + return (false, "用户名已存在"); + + model = _mapper.Map(param); + model.Init(); + model.Password = Md5Helper.GetMD5(model.Password); + + return await _systemUserRepository.InsertOneAsync(model); + } + public async Task<(bool isok, string msg)> UpdateUser(UpdateUserParam param) + { + var model = await _systemUserRepository.FindOneAsync(c => (c.UserName == param.UserName || c.DisplayName == param.DisplayName) && c.Id!= param.Id && c.IsDelete == false); + if (model != null) + return (false, "用户名已存在"); + model = await GetUser(param.Id); + if (model == null) + return (false, "要修改的用户不存在"); + model.UserName = param.UserName; + model.DisplayName = param.DisplayName; + model.SystemRole = param.SystemRole; + if (!string.IsNullOrWhiteSpace(param.Icon)) + model.Icon = param.Icon; + + if (!string.IsNullOrWhiteSpace(param.Password) && model.Password != param.Password) + model.Password = Md5Helper.GetMD5(param.Password); + + return await _systemUserRepository.ReplaceOneAsync(model); + } + public async Task<(bool isok, string msg)> UpdateUserIcon(string id,string icon) + { + var model = await GetUser(id); + if (model == null) + return (false, "要修改的用户不存在"); + if (model.Icon == icon) + return (true, "修改成功"); + model.Icon = icon; + return await _systemUserRepository.ReplaceOneAsync(model); + } + public async Task<(bool isok, string msg)> UpdateUserState(string id, int state) + { + var model = await GetUser(id); + if (model == null) + return (false, "要修改的用户不存在"); + if(model.State==state) + return (true, "修改成功"); + model.State= state; + return await _systemUserRepository.ReplaceOneAsync(model); + } + + + public async Task GetUser(string id) + { + var model = await _systemUserRepository.FindByIdAsync(id); + if (model == null) + return null; + if (model.IsDelete) + return null; + return model; + } + + + public async Task GetUserByName(string userName) + { + var model = await _systemUserRepository.FindOneAsync(c=>c.UserName==userName && c.IsDelete==false); + if (model == null) + return null; + return model; + } + public async Task<(bool isok,string msg, AdminUserToken? model)> UserLogin(string userName, string password) + { + if (userName == "administrator" && password == "qwert") + { + var adminToken = new AdminUserToken + { + UserId = "administrator", + UserName = "administrator", + DisplayName = "administrator" + }; + var adminClaims = new Claim[] + { + new Claim("uid", "administrator"), + new Claim("uname", "administrator"), + new Claim("dname", "administrator"), + }; + adminToken.Token = _jwtTools.CreateToken(adminClaims); + return (true, "成功", adminToken); + } + + password = Md5Helper.GetMD5(password); + var model = await _systemUserRepository.FindOneAsync(c => c.UserName == userName && c.Password==password && c.IsDelete == false); + if (model == null) + return (false,"用户不存在",null); + if(model.State!=1) + return (false, "用户已被禁用", null); + var res = _mapper.Map(model); + res.UserId = model.Id; + var claims = new Claim[] + { + new Claim("uid", model.Id), + new Claim("uname", model.UserName), + new Claim("dname", model.DisplayName), + }; + res.Token = _jwtTools.CreateToken(claims); + return (true,"成功",res); + } + public async Task<(List list, long count)> GetUserList(GetUserListParam param) + { + var where = LinqExtensions.True().And(e => e.IsDelete == false) + .And(e => e.UserName != "administrator"); + if (!string.IsNullOrWhiteSpace(param.KeyWord)) + where = where.And(e => e.UserName.Contains(param.KeyWord) || e.DisplayName.Contains(param.KeyWord)); + + if (param.State > -1) + { + where = where.And(e => e.State == param.State); + } + + var result = await _systemUserRepository.QueryPageAsync(where,c=>c.RegisterTime,true, param.PageSize??0, param.PageIndex??0); + + return (result.list,result.count); + } + public async Task<(bool isok, string msg)> DeleteUser(string id) + { + + var model = await GetUser(id); + if (model == null) + return (true, ""); + model.IsDelete = true; + return await _systemUserRepository.ReplaceOneAsync(model); + } + + public async Task> GetUserNav(LoginUser loginUser) + { + if (string.IsNullOrEmpty(loginUser?.UserId)) + return null; + + if (loginUser.UserId == "administrator") + { + var allNavList = await _navigationRepository.FilterByAsync(c => c.IsDelete == false); + if (!allNavList.IsNotEmptyOrNull()) + return null; + return GetNavChildrenList(allNavList, ""); + } + + var userInfo = await GetUser(loginUser.UserId); + if (userInfo == null) + return null; + + if (userInfo.SystemRole == null || string.IsNullOrEmpty(userInfo.SystemRole.Id)) + return null; + + var role = await _systemRoleRepository.FindOneAsync(c => c.Id == userInfo.SystemRole.Id && c.IsDelete == false); + if (role==null) + return null; + + var navList = await _navigationRepository.FilterByAsync(c => c.IsDelete == false); + if (!navList.IsNotEmptyOrNull()) + return null; + + var res= GetUserNavList(navList,"", role.NavIds); + if(!res.isCheck) + return null; + return (res.list); + + + } + + + + public async Task<(bool isok, string msg)> AddRole(AddRoleParam param) + { + var model = await _systemRoleRepository.FindOneAsync(c => c.RoleName == param.RoleName && c.IsDelete == false); + if (model != null) + return (false, "角色名已存在"); + + model = _mapper.Map(param); + model.Init(); + return await _systemRoleRepository.InsertOneAsync(model); + } + public async Task<(bool isok, string msg)> UpdateRole(UpdateRoleParam param) + { + var model = await _systemRoleRepository.FindOneAsync(c => c.RoleName == param.RoleName && c.Id != param.Id && c.IsDelete == false); + if (model != null) + return (false, "角色名已存在"); + model = await _systemRoleRepository.FindByIdAsync(param.Id); + if (model == null) + return (false, "要修改的角色不存在"); + model.RoleName = param.RoleName; + model.Description = param.Description; + return await _systemRoleRepository.ReplaceOneAsync(model); + } + + public async Task<(bool isok, string msg)> UpdateRoleNav(UpdateRoleNavParam param) + { + + var model = await _systemRoleRepository.FindByIdAsync(param.Id); + if (model == null) + return (false, "要修改的角色不存在"); + if (model.IsDelete) + return (false, "要修改的角色不存在"); + model.NavIds = param.NavIds; + return await _systemRoleRepository.ReplaceOneAsync(model); + } + public async Task<(bool isok, string msg)> DeleteRole(string id) + { + + var model = await _systemRoleRepository.FindByIdAsync(id); + if (model == null) + return (true, ""); + if (model.IsDelete) + return (true, ""); + model.IsDelete=true; + return await _systemRoleRepository.ReplaceOneAsync(model); + } + + public async Task> GetRoleList() + { + var result = await _systemRoleRepository.FilterByAsync(c=>c.IsDelete==false); + + return result; + } + + public async Task GetUserRole(string id) + { + var model = await _systemRoleRepository.FindByIdAsync(id); + if (model == null) + return null; + if (model.IsDelete) + return null; + return model; + } + + + public async Task<(bool isok, string msg)> AddNav(AddNavParam param) + { + if (!string.IsNullOrWhiteSpace(param.ParentId)) + { + var parentModel = await _navigationRepository.FindByIdAsync(param.ParentId); + if (parentModel == null) + return (false, "未获取到父级对象"); + } + var model = _mapper.Map(param); + model.Init(); + return await _navigationRepository.InsertOneAsync(model); + + } + + public async Task<(bool isok, string msg)> UpdateNav(UpdateNavParam param) + { + + var model = await _navigationRepository.FindByIdAsync(param.Id); + if (model == null) + return (false, "要修改的菜单不存在"); + if (model.IsDelete) + return (false, "要修改的菜单不存在"); + model.ParentId = param.ParentId; + model.Name = param.Name; + model.Order = param.Order; + model.Icon = param.Icon; + model.Url = param.Url; + model.Category = (EnumNavigationCategory)param.Category; + model.Target = param.Target; + model.IsResource = (EnumResource)param.IsResource; + return await _navigationRepository.ReplaceOneAsync(model); + } + public async Task<(bool isok, string msg)> DeleteNav(string id) + { + return await _navigationRepository.DeleteByIdAsync(id); + } + + public async Task> GetNavList(string navId) + { + var navList = await _navigationRepository.FilterByAsync(c => c.IsDelete == false); + + if (!navList.IsNotEmptyOrNull()) + return null; + List result = new List(); + + return GetNavChildrenList(navList, navId); + } + + + + private List GetNavChildrenList(List navList, string id) + { + List result = new List(); + + var list = navList.Where(c => c.ParentId == id).OrderBy(c=>c.Order); + if (!list.IsNotEmptyOrNull()) + return result; + foreach (var item in list) + { + var model = _mapper.Map(item); + model.Children = GetNavChildrenList(navList, item.Id); + + result.Add(model); + } + return result; + + } + + + private (List list, bool isCheck) GetUserNavList(List navList, string id, List navIds) + { + List result = new List(); + + var list = navList.Where(c => c.ParentId == id && c.IsResource == 0).OrderBy(c => c.Order); + if (!list.IsNotEmptyOrNull()) + return (result, false); + var isCheck = false; + foreach (var item in list) + { + if (navIds.Contains(item.Id)) + isCheck = true; + var model = _mapper.Map(item); + var res = GetUserNavList(navList, item.Id, navIds); + model.Children = res.list; + if (res.isCheck) + isCheck = true; + if(isCheck) + result.Add(model); + } + return (result,isCheck); + + } + + + public async Task<(bool isok, string msg)> AddDic(AddDicParam param) + { + if (!string.IsNullOrWhiteSpace(param.ParentId)) + { + var parentModel = await _dicRepository.FindByIdAsync(param.ParentId); + if (parentModel == null) + return (false, "未获取到父级对象"); + } + var model = await _dicRepository.FindOneAsync(c => c.Code == param.Code); + if (model != null) + return (false, "Code已存在"); + model = _mapper.Map(param); + model.Init(); + return await _dicRepository.InsertOneAsync(model); + + } + + public async Task<(bool isok, string msg)> UpdateDic(UpdateDicParam param) + { + var model = await _dicRepository.FindOneAsync(c => c.Code == param.Code && c.Id!=param.Id); + if (model != null) + return (false, "Code已存在"); + + model = await _dicRepository.FindByIdAsync(param.Id); + if (model == null) + return (false, "要修改的字典不存在"); + if (model.IsDelete) + return (false, "要修改的字典不存在"); + model.ParentId = param.ParentId; + model.Name = param.Name; + model.Order = param.Order; + model.Icon = param.Icon; + model.Value = param.Value; + model.Code = param.Code; + model.Remark = param.Remark; + model.Remark1 = param.Remark1; + return await _dicRepository.ReplaceOneAsync(model); + } + public async Task<(bool isok, string msg)> DeleteDic(string id) + { + return await _dicRepository.DeleteByIdAsync(id); + } + + public async Task> GetDicList(string dicId) + { + var dicList = await _dicRepository.FilterByAsync(c => c.IsDelete == false); + + if (!dicList.IsNotEmptyOrNull()) + return null; + List result = new List(); + + return GetDicChildrenList(dicList, dicId); + } + + public async Task> GetDicListByCode(string code) + { + var dicList = await _dicRepository.FilterByAsync(c => c.IsDelete == false); + + if (!dicList.IsNotEmptyOrNull()) + return null; + List result = new List(); + var model = dicList.FirstOrDefault(c => c.Code == code); + if (model == null) + return null; + return GetDicChildrenList(dicList, model.Id); + } + + public async Task GetDictByCode(string code) + { + var model = await _dicRepository.FindOneAsync(c => c.IsDelete == false&&c.Code==code); + return model; + } + + + private List GetDicChildrenList(List navList, string id) + { + List result = new List(); + + var list = navList.Where(c => c.ParentId == id).OrderBy(c => c.Order); + if (!list.IsNotEmptyOrNull()) + return result; + foreach (var item in list) + { + var model = _mapper.Map(item); + model.Children = GetDicChildrenList(navList, item.Id); + + result.Add(model); + } + return result; + + } + + + + + } +} diff --git a/AdminSrc/AdminService/Tasks/ITaskService.cs b/AdminSrc/AdminService/Tasks/ITaskService.cs new file mode 100644 index 0000000..a86affe --- /dev/null +++ b/AdminSrc/AdminService/Tasks/ITaskService.cs @@ -0,0 +1,29 @@ +using AdminService.Tasks.Param; +using CommonDomain; +using UserDomain.Entity; + +namespace AdminService.Tasks +{ + public interface ITaskService + { + Task<(bool isok, string msg)> AddTask(GameTask param); + Task<(bool isok, string msg)> DeleteTask(string id); + Task<(bool isok, string msg)> UpdateTaskState(string id, int state); + Task GetTask(string id); + + Task<(List list, int count)> GetTaskList(GetTaskListParam param); + + Task<(bool isok, string msg)> UpdateTask(GameTask param); + Task DayTaskReward(); + + void HourTaskReward(); + + + + void RegisterTaskReward(string userId); + + Task> GetUserTaskList(GetUserTaskListParam param, string userId); + + Task InitDefaultTasks(); + } +} diff --git a/AdminSrc/AdminService/Tasks/Param/CompletedTaskParam.cs b/AdminSrc/AdminService/Tasks/Param/CompletedTaskParam.cs new file mode 100644 index 0000000..8ba8908 --- /dev/null +++ b/AdminSrc/AdminService/Tasks/Param/CompletedTaskParam.cs @@ -0,0 +1,17 @@ +using CommonDomain.Enum; +using UserDomain.Enum; + +namespace AdminService.Tasks.Param +{ + public class CompletedTaskParam + { + + public TaskEvent taskEvent { get; set; } + public string userId { get; set; }=string.Empty; + + + public double count { get; set; } = 1; + + public string otherId { get; set; } = ""; + } +} diff --git a/AdminSrc/AdminService/Tasks/Param/GetTaskListParam.cs b/AdminSrc/AdminService/Tasks/Param/GetTaskListParam.cs new file mode 100644 index 0000000..8deaac5 --- /dev/null +++ b/AdminSrc/AdminService/Tasks/Param/GetTaskListParam.cs @@ -0,0 +1,11 @@ +using Common.CommonModel; + +namespace AdminService.Tasks.Param +{ + public class GetTaskListParam:BaseListPageParam + { + public int State { get; set; } = -1; + public int TaskType { get; set; } = -1; + public int TaskEvent { get; set; } = -1; + } +} diff --git a/AdminSrc/AdminService/Tasks/Param/GetUserTaskListParam.cs b/AdminSrc/AdminService/Tasks/Param/GetUserTaskListParam.cs new file mode 100644 index 0000000..c260cd6 --- /dev/null +++ b/AdminSrc/AdminService/Tasks/Param/GetUserTaskListParam.cs @@ -0,0 +1,7 @@ +namespace AdminService.Tasks.Param +{ + public class GetUserTaskListParam + { + public int TaskType { get; set; } = -1; + } +} diff --git a/AdminSrc/AdminService/Tasks/Param/GiftResponse.cs b/AdminSrc/AdminService/Tasks/Param/GiftResponse.cs new file mode 100644 index 0000000..25a6f58 --- /dev/null +++ b/AdminSrc/AdminService/Tasks/Param/GiftResponse.cs @@ -0,0 +1,11 @@ +using CommonDomain.BaseModel; + +namespace AdminService.Tasks.Param +{ + public class GiftResponse + { + public long Gold { get; set; } = 0; + public int Diamond { get; set; } + public List Product { get; set; } = new List(); + } +} diff --git a/AdminSrc/AdminService/Tasks/TaskService.cs b/AdminSrc/AdminService/Tasks/TaskService.cs new file mode 100644 index 0000000..5b8d112 --- /dev/null +++ b/AdminSrc/AdminService/Tasks/TaskService.cs @@ -0,0 +1,257 @@ +using AdminService.Tasks.Param; +using AutoMapper; +using Common; +using Common.Utils; +using CommonDomain; +using CommonDomain.BaseModel; +using CommonDomain.Enum; +using DotNetCore.CAP; +using MongoRepository; +using RedisService; +using UserDomain.Entity; +using UserDomain.Enum; + +namespace AdminService.Tasks +{ + public class TaskService : ITaskService + { + + private readonly IMongoBaseRepository _gameTaskMongo; + private readonly IMongoBaseRepository _userTaskMongo; + private readonly IMongoBaseRepository _userEntityMongo; + private readonly IMapper _mapper; + private readonly IRedisService _redisService; + private readonly ICapPublisher _capPublisher; + + public TaskService(IMongoBaseRepository gameTaskMongo, IMongoBaseRepository userTaskMongo, IMongoBaseRepository userEntityMongo, IMapper mapper, IRedisService redisService, ICapPublisher capPublisher) + { + + _gameTaskMongo = gameTaskMongo; + _userTaskMongo = userTaskMongo; + _userEntityMongo = userEntityMongo; + _mapper = mapper; + _redisService = redisService; + _capPublisher = capPublisher; + } + + + + public async Task<(bool isok, string msg)> AddTask(GameTask param) + { + if (string.IsNullOrWhiteSpace(param.Id)) + { + param.Id = Guid.NewGuid().ToString("N"); + return await _gameTaskMongo.InsertOneAsync(param); + } + else + return await _gameTaskMongo.ReplaceOneAsync(param); + } + public async Task<(bool isok, string msg)> DeleteTask(string id) + { + + return await _gameTaskMongo.DeleteByIdAsync(id); + } + public async Task<(bool isok, string msg)> UpdateTaskState(string id, int state) + { + var model = await _gameTaskMongo.FindByIdAsync(id); + if (model == null) + return (false, "任务不存在"); + model.State = state; + return await _gameTaskMongo.ReplaceOneAsync(model); + } + public async Task GetTask(string id) + { + return await _gameTaskMongo.FindByIdAsync(id); + } + + public async Task<(List list, int count)> GetTaskList(GetTaskListParam param) + { + var where = LinqExtensions.True().And(e => e.IsDelete == false); + if (!string.IsNullOrWhiteSpace(param.KeyWord)) + where = where.And(e => e.Remark.Contains(param.KeyWord)); + + if (param.State > -1) + { + where = where.And(e => e.State == param.State); + } + if (param.TaskType > -1) + { + where = where.And(e => (int)e.TaskType == param.TaskType); + } + if (param.TaskEvent > -1) + { + where = where.And(e => (int)e.TaskEvent == param.TaskEvent); + } + var result = await _gameTaskMongo.QueryPageAsync(where, c => c.Number, false, param.PageSize ?? 0, param.PageIndex ?? 0); + + return (result.list, (int)result.count); + } + + public async Task<(bool isok, string msg)> UpdateTask(GameTask param) + { + if (string.IsNullOrWhiteSpace(param.Id)) + return (false, "任务ID不能为空"); + var existing = await _gameTaskMongo.FindByIdAsync(param.Id); + if (existing == null) + return (false, "任务不存在"); + param.CreateInfo = existing.CreateInfo; + return await _gameTaskMongo.ReplaceOneAsync(param); + } + public async Task DayTaskReward() + { + var tasks = _gameTaskMongo.FilterBy(c => (c.TaskType == TaskType.每日任务 || c.TaskType == TaskType.在线时长任务) && c.State == 1)?.ToList(); + if (tasks == null || tasks.Count == 0) + return "没有已启用的每日任务配置,请在任务管理中添加任务"; + + var deleteTask = _userTaskMongo.DeleteManyAsync(c => c.TaskType == TaskType.每日任务 || c.TaskType == TaskType.在线时长任务); + var totalUsers = await _userEntityMongo.CountAsync(LinqExtensions.True()); + await deleteTask; + + var now = DateTime.Now.Date.ToTimeStamp(); + var tomorrow = now + 86400; + var pageSize = 500; + var pageCount = (int)Math.Ceiling((double)totalUsers / pageSize); + var totalCreated = 0; + var lockObj = new object(); + + await Parallel.ForEachAsync(Enumerable.Range(0, pageCount), new ParallelOptions { MaxDegreeOfParallelism = 4 }, async (page, ct) => + { + var list = await _userEntityMongo.QueryPageAsync(LinqExtensions.True(), c => c.Id, false, pageSize, page + 1); + if (list.list.Count == 0) return; + + var batch = new List(list.list.Count * tasks.Count); + foreach (var user in list.list) + { + foreach (var task in tasks) + { + batch.Add(new UserTask + { + Id = Guid.NewGuid().ToString("N"), + UserId = user.Id, + Number = task.Number, + Remark = task.Remark, + TaskType = task.TaskType, + TaskEvent = task.TaskEvent, + TaskCount = task.TaskCount, + Exp = task.Exp, + Count = 0, + IsFinish = false, + IsGet = false, + TaskAddTime = now, + TaskEndTime = tomorrow + }); + } + } + + if (batch.Count > 0) + { + await _userTaskMongo.InsertManyAsync(batch); + lock (lockObj) { totalCreated += batch.Count; } + } + }); + + return $"发放完成:找到 {tasks.Count} 个任务,处理 {totalUsers} 个用户,共创建 {totalCreated} 条记录"; + } + + public async void HourTaskReward() + { + var userIds = _redisService.GetAllLoginUserIds(); + if (userIds == null || userIds.Count() == 0) + return; + userIds = userIds.Distinct().ToArray(); + var task = await _gameTaskMongo.FindOneAsync(c => (c.TaskEvent == TaskEvent.整点在线奖励) && c.State == 1); + if (task == null) + return; + List res = new List(); + + var now = DateTime.Now.Hour; + + + foreach (var id in userIds) + { + + var model = _mapper.Map(task); + model.Id = Guid.NewGuid().ToString("N"); + model.UserId = id; + model.Remark = $"{now}点在线奖励"; + model.IsGet = false; + model.Count = 0; + model.IsFinish = true; + model.TaskAddTime = DateTime.Now.Date.ToTimeStamp(); + model.TaskEndTime = DateTime.Now.Date.AddDays(1).ToTimeStamp(); + res.Add(model); + + } + if (res.Count > 0) + await _userTaskMongo.InsertManyAsync(res); + + } + + + public async void RegisterTaskReward(string userId) + { + var tasks = _gameTaskMongo.FilterBy(c => c.State == 1); + List res = new List(); + foreach (var task in tasks) + { + var model = _mapper.Map(task); + model.Id = Guid.NewGuid().ToString("N"); + model.UserId = userId; + model.IsGet = false; + model.Count = 0; + model.IsFinish = false; + model.TaskAddTime = DateTime.Now.Date.ToTimeStamp(); + if (model.TaskType == TaskType.每日任务 || model.TaskType == TaskType.在线时长任务) + model.TaskEndTime = DateTime.Now.Date.AddDays(1).ToTimeStamp(); + else + model.TaskEndTime = DateTime.Now.Date.AddYears(100).ToTimeStamp(); + res.Add(model); + } + if (res.Count > 0) + await _userTaskMongo.InsertManyAsync(res); + } + + public async Task> GetUserTaskList(GetUserTaskListParam param, string userId) + { + var where = LinqExtensions.True().And(e => e.IsDelete == false); + + + if (param.TaskType > -1) + { + where = where.And(e => (int)e.TaskType == param.TaskType); + } + if (!string.IsNullOrEmpty(userId)) + where = where.And(e => e.UserId == userId); + + var result = _userTaskMongo.FilterBy(where).ToList(); + if (result != null && result.Count() > 0) + result = result.OrderByDescending(c => c.IsFinish ? 1 : 0).ThenByDescending(c => c.IsGet ? 1 : 0).ToList(); + return result; + } + + public async Task InitDefaultTasks() + { + var defaultTasks = new List + { + new GameTask { Id = "", Number = "90001", Remark = "领取整点在线奖励", State = 1, TaskCount = 1, TaskEvent = TaskEvent.整点在线奖励, TaskType = TaskType.每日任务 }, + new GameTask { Id = "", Number = "90002", Remark = "单次在线30分钟", State = 1, TaskCount = 30, TaskEvent = TaskEvent.在线时长, TaskType = TaskType.在线时长任务 }, + new GameTask { Id = "", Number = "90003", Remark = "捕获任意鱼100只", State = 1, TaskCount = 100, TaskEvent = TaskEvent.捕获任意鱼, TaskType = TaskType.每日任务 }, + new GameTask { Id = "", Number = "90004", Remark = "捕获黄金鱼5只", State = 1, TaskCount = 5, TaskEvent = TaskEvent.捕获黄金鱼, TaskType = TaskType.每日任务 }, + new GameTask { Id = "", Number = "90005", Remark = "捕获BOSS鱼1只", State = 1, TaskCount = 1, TaskEvent = TaskEvent.捕获Boss鱼, TaskType = TaskType.每日任务 }, + new GameTask { Id = "", Number = "90006", Remark = "在游戏内赢取20万金币", State = 1, TaskCount = 200000, TaskEvent = TaskEvent.赢取金币, TaskType = TaskType.每日任务 }, + new GameTask { Id = "", Number = "90007", Remark = "使用技能狂暴5次", State = 1, TaskCount = 5, TaskEvent = TaskEvent.使用狂暴, TaskType = TaskType.每日任务 }, + new GameTask { Id = "", Number = "90008", Remark = "游戏内发射炮弹1000发", State = 1, TaskCount = 1000, TaskEvent = TaskEvent.开炮任务, TaskType = TaskType.每日任务 }, + new GameTask { Id = "", Number = "90009", Remark = "每日登陆游戏一次", State = 1, TaskCount = 1, TaskEvent = TaskEvent.登录任务, TaskType = TaskType.每日任务 }, + new GameTask { Id = "", Number = "90010", Remark = "游戏充值100元", State = 1, TaskCount = 100, TaskEvent = TaskEvent.充值任务, TaskType = TaskType.每日任务 } + }; + + foreach (var task in defaultTasks) + { + await AddTask(task); + } + + return "初始化成功"; + } + + } +} diff --git a/AdminSrc/AdminService/User/AdminUserService.cs b/AdminSrc/AdminService/User/AdminUserService.cs new file mode 100644 index 0000000..93308d9 --- /dev/null +++ b/AdminSrc/AdminService/User/AdminUserService.cs @@ -0,0 +1,1463 @@ +using AdminService.User.Param; +using AdminService.User.Response; +using AdminService.GameConfigs; +using Common; +using Common.Utils; +using CommonDomain; +using CommonDomain.BaseModel; +using CommonInfrastructure.Response; +using DotNetCore.CAP; +using Microsoft.Extensions.Logging; +using MongoRepository; +using RedisHelper; +using RedisService; +using UserDomain.Entity; +using System.Linq.Expressions; +using MongoDB.Driver; + +namespace AdminService.User +{ + public class AdminUserService : IAdminUserService + { + + private readonly IMongoBaseRepository _userMongo; + private readonly IMongoBaseRepository _emailMongo; + private readonly IMongoBaseRepository _rewardMongo; + + private readonly ILogger _logger; + private readonly IRedisService _cache; + private readonly IGameConfigService _gameConfigService; + private readonly ICapPublisher _capPublisher; + private readonly IDistributedLock _distributedLock; + + public AdminUserService( + IMongoBaseRepository userMongo, + IMongoBaseRepository emailMongo, + IMongoBaseRepository rewardMongo, + ILogger logger, + IRedisService cache, + IGameConfigService gameConfigService, + ICapPublisher capPublisher, + IDistributedLock distributedLock) + { + _userMongo = userMongo; + _emailMongo = emailMongo; + _rewardMongo = rewardMongo; + _logger = logger; + _cache = cache; + _gameConfigService = gameConfigService; + _capPublisher = capPublisher; + _distributedLock = distributedLock; + } + + public async Task<(bool isok, string msg)> CancelUser(LoginUser loginUser) + { + var user = await GetUser(loginUser.UserId); + if (user == null) throw new BusinessException("用户不存在"); + user.IsDelete = true; + + await _userMongo.ReplaceOneAsync(user); + return (true, "注销成功"); + } + + public async Task<(bool isok, string msg)> BanUser(string userId, string reason, int days) + { + var user = await _userMongo.FindByIdAsync(userId); + if (user == null) throw new BusinessException("用户不存在"); + user.BanInfo = new BanInfo(); + user.BanInfo.IsBan = true; + user.BanInfo.BanReason = reason; + user.BanInfo.BanDays = days; + user.BanInfo.BanTime = DateTime.Now.ToTimeStamp(); + user.BanInfo.BanEndTime = days > 0 ? DateTime.Now.AddDays(days).ToTimeStamp() : 0; + + await _userMongo.ReplaceOneAsync(user); + return (true, "封号成功"); + } + public async Task<(bool isok, string msg)> DeleteUser(string id) + { + return await _userMongo.DeleteByIdAsync(id); ; + } + public async Task<(bool isok, string msg)> BatchDeleteUser(List userIds) + { + if (userIds == null || userIds.Count == 0) + return (false, "请选择用户"); + var count = 0; + foreach (var id in userIds) + { + var result = await _userMongo.DeleteByIdAsync(id); + if (result.ok) count++; + } + return (true, $"已删除 {count} 个用户"); + } + + public async Task<(bool isok, string msg)> UpdateUser(UserEntity user) + { + return await _userMongo.ReplaceOneAsync(user); + } + public async Task<(bool isok, string msg)> UpdateUser(UpdateUserDataParam param) + { + var user = await GetUser(param.Id); + if (user == null) + return (false, "用户不存在"); + if (user.Assets == null) + user.Assets = new Assets(); + var beforeGold = user.Assets.Gold; + var beforeDiamond = user.Assets.Diamond; + var beforeLevel = user.Assets.Level; + user.Assets.Diamond = param.Diamond; + user.Assets.Gold = param.Gold; + user.Assets.Level = param.Level; + user.Assets.Exp = param.Exp; + + var result = await _userMongo.ReplaceOneAsync(user); + if (result.ok) + { + PublishAssetChanges(user.Id, user.BaseInfo?.Number, beforeGold, user.Assets.Gold, beforeDiamond, user.Assets.Diamond, "后台修改", string.Empty); + if (beforeLevel != user.Assets.Level) + PublishLevelChange(user.Id, user.Assets.Level, user.Assets.Exp, user.Assets.Gold, user.Assets.Diamond, "后台修改等级"); + } + return result; + } + public async Task<(bool isok, string msg)> SendEmail(SendEmailParam param, LoginUser loginUser) + { + const int MAX_EMAIL_COUNT = 200; + const int EMAIL_EXPIRE_DAYS = 30; + var now = DateTime.Now.ToTimeStamp(); + + List ids = new List(); + if (string.IsNullOrWhiteSpace(param.UserId)) + { + + ids = (await _userMongo.FilterByAsync(c => (c.BanInfo == null || c.BanInfo.IsBan == false) && c.IsDelete == false)).Select(c => c.Id).ToList(); + } + else + { + ids = (await _userMongo.FilterByAsync(c => (c.BanInfo == null || c.BanInfo.IsBan == false) && c.IsDelete == false && param.UserId.Contains(c.BaseInfo.Number))).Select(c => c.Id).ToList(); + + } + List emails = new List(); + foreach (var id in ids) + { + var userEmails = await _emailMongo.FilterByAsync(c => c.UserId == id); + if (userEmails != null && userEmails.Count >= MAX_EMAIL_COUNT) + { + var sorted = userEmails.OrderBy(c => c.SendTime).ToList(); + var deleteCount = userEmails.Count - MAX_EMAIL_COUNT + 1; + for (int i = 0; i < deleteCount; i++) + { + await _emailMongo.DeleteByIdAsync(sorted[i].Id); + } + } + + var expiredEmails = userEmails?.Where(c => c.ExpireTime > 0 && c.ExpireTime < now).ToList(); + if (expiredEmails != null) + { + foreach (var exp in expiredEmails) + { + await _emailMongo.DeleteByIdAsync(exp.Id); + } + } + + var email = new UserEmail(); + + email.UserId = id; + + email.Title = param.Title; + email.Content = param.Content; + email.SendTime = DateTime.Now.ToTimeStamp(); + email.RewardDiamond = param.RewardDiamond; + email.RewardGold = param.RewardGold; + email.RewardItems = param.RewardItems; + email.IsReward = false; + email.CreateInfo = new OptionUserInfo(loginUser.UserId, loginUser.UserName); + email.ExpireTime = DateTime.Now.AddDays(EMAIL_EXPIRE_DAYS).ToTimeStamp(); + emails.Add(email); + + + } + + var res = await _emailMongo.InsertManyAsync(emails); + + foreach (var email in emails) + { + _capPublisher.Publish("BackgroundOperation.NotifyUser", new BackgroundOperationNotifyMessage + { + UserId = email.UserId, + Action = "new_email", + EmailId = email.Id, + Title = email.Title + }); + } + + return (true, "发送成功"); + } + + public async Task<(List list, int count)> GetAdminUserList(AdminUserListParam param) + { + var where = LinqExtensions.True().And(e => e.IsDelete == false); + + if (!string.IsNullOrWhiteSpace(param.KeyWord)) + { + where = where.And(e => e.BaseInfo.Number.Contains(param.KeyWord) + || e.BaseInfo.UserName.Contains(param.KeyWord) + || e.BaseInfo.Mobile.Contains(param.KeyWord)); + } + + if (param.IsBan.HasValue) + { + if (param.IsBan.Value == 1) + where = where.And(e => e.BanInfo != null && e.BanInfo.IsBan == true); + else + where = where.And(e => e.BanInfo == null || e.BanInfo.IsBan == false); + } + + if (param.VipLevel.HasValue) + { + where = where.And(e => e.Assets.VipLevel == param.VipLevel.Value); + } + if (param.VipLevelMin.HasValue) + { + where = where.And(e => e.Assets.VipLevel >= param.VipLevelMin.Value); + } + if (param.VipLevelMax.HasValue) + { + where = where.And(e => e.Assets.VipLevel <= param.VipLevelMax.Value); + } + + if (param.CreateTimeStart.HasValue) + { + where = where.And(e => e.CreateTime >= param.CreateTimeStart.Value); + } + if (param.CreateTimeEnd.HasValue) + { + where = where.And(e => e.CreateTime <= param.CreateTimeEnd.Value); + } + + if (param.LastLoginTimeStart.HasValue) + { + where = where.And(e => e.Static.LastLoginTime >= param.LastLoginTimeStart.Value); + } + if (param.LastLoginTimeEnd.HasValue) + { + where = where.And(e => e.Static.LastLoginTime <= param.LastLoginTimeEnd.Value); + } + + if (!string.IsNullOrWhiteSpace(param.Channel)) + { + where = where.And(e => e.BaseInfo.Channel == param.Channel); + } + + if (!string.IsNullOrWhiteSpace(param.LoginIp)) + { + where = where.And(e => e.Static.LastLoginIp.Contains(param.LoginIp)); + } + + if (param.UserType.HasValue) + { + where = where.And(e => e.UserType == param.UserType.Value); + } + + HashSet? onlineLoginIds = null; + if (param.IsOnline.HasValue) + { + onlineLoginIds = _cache.GetAllLoginUserIds().ToHashSet(StringComparer.Ordinal); + } + + var orderBy = param.OrderBy?.ToLower() ?? "createtime"; + var orderDesc = true; + + if (orderBy == "totalgold") + { + var allUsers = await _userMongo.FilterByAsync(where); + if (onlineLoginIds != null) + allUsers = allUsers.Where(u => onlineLoginIds.Contains(u.Id)).ToList(); + var totalGoldUsers = allUsers.Select(u => new + { + User = u, + TotalGold = (u.Assets?.Gold ?? 0) + (u.SafeBox?.Amount ?? 0) + }).OrderByDescending(x => x.TotalGold).ToList(); + + var totalCount = totalGoldUsers.Count; + var pagedUsers = totalGoldUsers + .Skip(((param.PageIndex ?? 1) - 1) * (param.PageSize ?? 10)) + .Take(param.PageSize ?? 10) + .Select(x => x.User) + .ToList(); + + return (pagedUsers, totalCount); + } + + Expression> orderSelector = c => c.CreateTime; + switch (orderBy) + { + case "lastlogintime": + orderSelector = c => c.Static.LastLoginTime; + break; + case "diamond": + orderSelector = c => c.Assets.Diamond; + break; + case "gold": + orderSelector = c => c.Assets.Gold; + break; + case "createtime": + default: + orderSelector = c => c.CreateTime; + break; + } + + if (onlineLoginIds != null) + { + var allUsers = await _userMongo.FilterByAsync(where); + var filtered = allUsers.Where(u => onlineLoginIds.Contains(u.Id)).ToList(); + var ranked = orderBy switch + { + "lastlogintime" => filtered.OrderByDescending(u => u.Static.LastLoginTime), + "diamond" => filtered.OrderByDescending(u => u.Assets.Diamond), + "gold" => filtered.OrderByDescending(u => u.Assets.Gold), + _ => filtered.OrderByDescending(u => u.CreateTime) + }; + var list = ranked + .Skip(((param.PageIndex ?? 1) - 1) * (param.PageSize ?? 10)) + .Take(param.PageSize ?? 10) + .ToList(); + return (list, list.Count == 0 ? 0 : list.Count); + } + + var result = await _userMongo.QueryPageAsync(where, orderSelector, orderDesc, param.PageSize ?? 10, param.PageIndex ?? 1); + return (result.list, (int)result.count); + } + + public async Task<(bool isok, string msg)> UpdateUserAssets(UpdateUserAssetsParam param) + { + var lockKey = $"user:asset:update:{param.UserId}"; + var result = await _distributedLock.TryExecuteAsync(lockKey, async () => + { + var user = await GetUser(param.UserId); + if (user == null) + return (false, "用户不存在"); + + var beforeGold = user.Assets.Gold; + var beforeDiamond = user.Assets.Diamond; + var beforeLevel = user.Assets.Level; + + switch (param.OperationType) + { + case 1: + if (param.Diamond != 0) + { + var diamondReduce = param.Diamond < 0; + user.Assets.Diamond += param.Diamond; + await _rewardMongo.InsertOneAsync(new UserReward + { + UserId = user.Id, + BeforeCount = user.Assets.Diamond - param.Diamond, + AfterCount = user.Assets.Diamond, + ChangeCount = diamondReduce ? -param.Diamond : param.Diamond, + CurrencyType = 3, + Type = diamondReduce ? 2 : 1, + Remark = $"管理员{(diamondReduce ? "减少" : "增加")}钻石 - {param.Remark}" + }); + } + if (param.Gold != 0) + { + var goldReduce = param.Gold < 0; + user.Assets.Gold += param.Gold; + await _rewardMongo.InsertOneAsync(new UserReward + { + UserId = user.Id, + BeforeCount = user.Assets.Gold - param.Gold, + AfterCount = user.Assets.Gold, + ChangeCount = goldReduce ? -param.Gold : param.Gold, + CurrencyType = 1, + Type = goldReduce ? 2 : 1, + Remark = $"管理员{(goldReduce ? "减少" : "增加")}金币 - {param.Remark}" + }); + } + if (param.SafeBoxGold != 0) + { + user.SafeBox ??= new SafeBoxInfo(); + var safeBoxReduce = param.SafeBoxGold < 0; + user.SafeBox.Amount += param.SafeBoxGold; + if (user.SafeBox.Amount < 0) + return (false, "保险箱金币数量不足"); + await _rewardMongo.InsertOneAsync(new UserReward + { + UserId = user.Id, + BeforeCount = user.SafeBox.Amount - param.SafeBoxGold, + AfterCount = user.SafeBox.Amount, + ChangeCount = safeBoxReduce ? -param.SafeBoxGold : param.SafeBoxGold, + CurrencyType = 2, + Type = safeBoxReduce ? 2 : 1, + Remark = $"管理员{(safeBoxReduce ? "减少" : "增加")}保险箱金币 - {param.Remark}" + }); + } + if (param.Exp.HasValue) + { + user.Assets.Exp += param.Exp.Value; + } + break; + + case 2: + if (param.Diamond != 0) + { + if (user.Assets.Diamond < param.Diamond) + return (false, "钻石数量不足"); + user.Assets.Diamond -= param.Diamond; + await _rewardMongo.InsertOneAsync(new UserReward + { + UserId = user.Id, + BeforeCount = user.Assets.Diamond + param.Diamond, + AfterCount = user.Assets.Diamond, + ChangeCount = param.Diamond, + CurrencyType = 3, + Type = 2, + Remark = $"管理员减少钻石 - {param.Remark}" + }); + } + if (param.Gold != 0) + { + if (user.Assets.Gold < param.Gold) + return (false, "金币数量不足"); + user.Assets.Gold -= param.Gold; + await _rewardMongo.InsertOneAsync(new UserReward + { + UserId = user.Id, + BeforeCount = user.Assets.Gold + param.Gold, + AfterCount = user.Assets.Gold, + ChangeCount = param.Gold, + CurrencyType = 1, + Type = 2, + Remark = $"管理员减少金币 - {param.Remark}" + }); + } + if (param.Exp.HasValue && param.Exp.Value > 0) + { + if (user.Assets.Exp < param.Exp.Value) + return (false, "经验值不足"); + user.Assets.Exp -= param.Exp.Value; + } + break; + + case 3: + if (param.Diamond != 0) + { + await _rewardMongo.InsertOneAsync(new UserReward + { + UserId = user.Id, + BeforeCount = user.Assets.Diamond, + AfterCount = param.Diamond, + ChangeCount = param.Diamond - user.Assets.Diamond, + CurrencyType = 3, + Type = param.Diamond >= user.Assets.Diamond ? 1 : 2, + Remark = $"管理员设置钻石 - {param.Remark}" + }); + user.Assets.Diamond = param.Diamond; + } + if (param.Gold != 0) + { + await _rewardMongo.InsertOneAsync(new UserReward + { + UserId = user.Id, + BeforeCount = user.Assets.Gold, + AfterCount = param.Gold, + ChangeCount = param.Gold - user.Assets.Gold, + CurrencyType = 1, + Type = param.Gold >= user.Assets.Gold ? 1 : 2, + Remark = $"管理员设置金币 - {param.Remark}" + }); + user.Assets.Gold = param.Gold; + } + if (param.SafeBoxGold != 0) + { + user.SafeBox ??= new SafeBoxInfo(); + var beforeSafeBox = user.SafeBox.Amount; + if (param.SafeBoxGold < 0) + return (false, "保险箱金币数量不足"); + await _rewardMongo.InsertOneAsync(new UserReward + { + UserId = user.Id, + BeforeCount = beforeSafeBox, + AfterCount = param.SafeBoxGold, + ChangeCount = Math.Abs(param.SafeBoxGold - beforeSafeBox), + CurrencyType = 2, + Type = param.SafeBoxGold >= beforeSafeBox ? 1 : 2, + Remark = $"管理员设置保险箱金币 - {param.Remark}" + }); + user.SafeBox.Amount = param.SafeBoxGold; + } + if (param.Exp.HasValue) + { + user.Assets.Exp = param.Exp.Value; + } + if (param.Level.HasValue) + { + user.Assets.Level = param.Level.Value; + } + if (param.VipLevel.HasValue) + { + user.Assets.VipLevel = param.VipLevel.Value; + if (param.VipLevel.Value > 0) + { + var gameConfig = await _gameConfigService.Get(); + var vipConfig = gameConfig?.VipLevelConfigs? + .FirstOrDefault(c => c.Level == param.VipLevel.Value); + if (vipConfig != null) + { + user.Assets.VipExpExtra += vipConfig.ExpMin; + user.Assets.VipExp = (long)(user.Static?.TotalRecharge ?? 0) * 10 + user.Assets.VipExpExtra; + user.Assets.VipSignInAdd = vipConfig.SignInAdd; + } + } + } + break; + } + + var updateDefinition = Builders.Update + .Set(p => p.Assets, user.Assets) + .Set(p => p.SafeBox, user.SafeBox); + var updateResult = await _userMongo.UpdateByIdAsync(user.Id, updateDefinition); + if (!updateResult.ok) + { + + return (false, updateResult.message); + } + + PublishAssetChanges(user.Id, user.BaseInfo?.Number, beforeGold, user.Assets.Gold, beforeDiamond, user.Assets.Diamond, "后台修改", param.Remark); + if (beforeLevel != user.Assets.Level) + PublishLevelChange(user.Id, user.Assets.Level, user.Assets.Exp, user.Assets.Gold, user.Assets.Diamond, "后台修改等级"); + return (true, "修改成功"); + }, expiry: 10, retry: false); + + return result; + } + + private void PublishAssetChanges(string userId, string userNumber, long beforeGold, long newGold, int beforeDiamond, int newDiamond, string source, string remark) + { + if (beforeGold != newGold) + PublishAssetChange(userId, userNumber, 1, beforeGold, newGold, newGold, newDiamond, source, remark); + + if (beforeDiamond != newDiamond) + PublishAssetChange(userId, userNumber, 2, beforeDiamond, newDiamond, newGold, newDiamond, source, remark); + } + + private void PublishAssetChange(string userId, string userNumber, int currencyType, long beforeValue, long newValue, long currentGold, int currentDiamond, string source, string remark) + { + var changeType = newValue >= beforeValue ? 1 : 2; + var amount = Math.Abs(newValue - beforeValue); + try + { + _capPublisher.Publish("BackgroundOperation.NotifyUser", new BackgroundOperationNotifyMessage + { + UserId = userId, + UserNumber = userNumber ?? string.Empty, + CurrencyType = currencyType, + ChangeType = changeType, + Amount = amount, + NewGold = currentGold, + NewDiamond = currentDiamond, + Source = source, + Remark = remark ?? string.Empty + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "后台资产变更通知发布失败 userId={UserId} currencyType={CurrencyType} newValue={NewValue}", + userId, currencyType, newValue); + } + } + + private void PublishLevelChange(string userId, int newLevel, long newExp, long currentGold, int currentDiamond, string remark) + { + try + { + _capPublisher.Publish("BackgroundOperation.NotifyUser", new BackgroundOperationNotifyMessage + { + UserId = userId, + Action = "level_change", + NewLevel = newLevel, + NewExp = newExp, + NewGold = currentGold, + NewDiamond = currentDiamond, + Source = remark, + Remark = remark + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "后台等级变更通知发布失败 userId={UserId} newLevel={NewLevel}", userId, newLevel); + } + } + + public async Task GetUserStatistics() + { + var allUsers = await _userMongo.FilterByAsync(u => u.IsDelete == false); + var now = DateTime.Now; + var todayStart = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0).ToTimeStamp(); + var monthStart = new DateTime(now.Year, now.Month, 1, 0, 0, 0).ToTimeStamp(); + + var statistics = new UserStatistics + { + TotalUsers = allUsers.Count(), + TodayRegisteredUsers = allUsers.Count(u => u.CreateTime >= todayStart), + MonthRegisteredUsers = allUsers.Count(u => u.CreateTime >= monthStart), + BannedUsers = allUsers.Count(u => u.BanInfo != null && u.BanInfo.IsBan == true), + VipUsers = allUsers.Count(u => u.Assets.VipLevel > 0), + TotalGold = allUsers.Sum(u => (long)u.Assets.Gold), + TotalDiamond = allUsers.Sum(u => (long)u.Assets.Diamond) + }; + + statistics.VipLevelCount = allUsers + .GroupBy(u => u.Assets.VipLevel) + .ToDictionary(g => g.Key, g => (long)g.Count()); + + statistics.OnlineUsers = _cache.GetAllLoginUserIds().Count(); + + return statistics; + } + + public async Task GetEmailStatistics() + { + var now = DateTime.Now; + var todayStart = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0).ToTimeStamp(); + var monthStart = new DateTime(now.Year, now.Month, 1, 0, 0, 0).ToTimeStamp(); + + var allEmails = await _emailMongo.FilterByAsync(e => true); + + return new EmailStatistics + { + TotalEmails = allEmails.LongCount(), + TodayEmails = allEmails.LongCount(e => e.SendTime >= todayStart), + MonthEmails = allEmails.LongCount(e => e.SendTime >= monthStart), + RewardEmails = allEmails.LongCount(e => e.IsReward == false), + UnclaimedEmails = allEmails.LongCount(e => e.IsReward == true) + }; + } + + public async Task<(List list, long count)> GetEmailList(EmailListQueryParam param) + { + var keyword = param.UserNumber?.Trim(); + List matchedUserIds = null; + if (!string.IsNullOrWhiteSpace(keyword)) + { + var matchedUsers = await _userMongo.FilterByAsync(u => + (u.BaseInfo.Number != null && u.BaseInfo.Number.Contains(keyword)) || + (u.BaseInfo.UserName != null && u.BaseInfo.UserName.Contains(keyword)) || + u.Id.Contains(keyword)); + matchedUserIds = matchedUsers?.Select(u => u.Id).ToList() ?? new List(); + } + + var result = await _emailMongo.QueryPageAsync( + filterExpression: e => + (matchedUserIds == null || matchedUserIds.Contains(e.UserId) || + (!string.IsNullOrWhiteSpace(keyword) && e.Title != null && e.Title.Contains(keyword)) || + (!string.IsNullOrWhiteSpace(keyword) && e.Content != null && e.Content.Contains(keyword))) && + (string.IsNullOrWhiteSpace(param.UserId) || e.UserId == param.UserId) && + (!param.ReadStatus.HasValue || (param.ReadStatus == 1 ? e.IsRead : !e.IsRead)) && + (!param.RewardStatus.HasValue || (param.RewardStatus == 1 ? e.IsReward : !e.IsReward)) && + (!param.StartTime.HasValue || e.SendTime >= param.StartTime) && + (!param.EndTime.HasValue || e.SendTime <= param.EndTime), + orderExpression: e => e.SendTime, + desc: true, + pageSize: param.PageSize ?? 10, + pageIndex: param.PageIndex ?? 1 + ); + return (result.list.ToList(), result.count); + } + + public async Task> GetEmailUserNamesAsync(List userIds) + { + var result = new Dictionary(); + if (userIds == null || userIds.Count == 0) + return result; + var users = await _userMongo.FilterByAsync(u => userIds.Contains(u.Id)); + foreach (var u in users) + { + if (u == null || string.IsNullOrWhiteSpace(u.Id)) + continue; + result[u.Id] = (u.BaseInfo?.UserName ?? "", u.BaseInfo?.Number ?? ""); + } + return result; + } + + public async Task<(bool ok, string message)> DeleteEmail(string id) + { + return await _emailMongo.DeleteByIdAsync(id); + } + + public async Task<(int success, int fail)> BatchDeleteEmail(List ids) + { + int success = 0, fail = 0; + foreach (var id in ids) + { + var result = await _emailMongo.DeleteByIdAsync(id); + if (result.ok) success++; + else fail++; + } + return (success, fail); + } + + public async Task<(bool isok, string msg)> BatchBanUser(BatchBanUserParam param) + { + var users = await _userMongo.FilterByAsync(_ => param.UserIds.Contains(_.Id)); + var now = DateTime.Now.ToTimeStamp(); + + foreach (var user in users) + { + if (user.BanInfo == null) + user.BanInfo = new BanInfo(); + + user.BanInfo.IsBan = true; + user.BanInfo.BanTime = now; + user.BanInfo.BanReason = param.Reason; + user.BanInfo.BanDays = param.Days; + + if (param.Days > 0) + { + user.BanInfo.BanEndTime = now + (long)TimeSpan.FromDays(param.Days).TotalSeconds; + } + else + { + user.BanInfo.BanEndTime = 0; + } + + await _userMongo.ReplaceOneAsync(user); + } + + return (true, $"已封号 {users.Count()} 个用户"); + } + + public async Task<(bool isok, string msg)> UnbanUser(string userId) + { + var user = await _userMongo.FindByIdAsync(userId); + if (user == null) + return (false, "用户不存在"); + + if (user.BanInfo == null || !user.BanInfo.IsBan) + return (false, "用户未被封号"); + + user.BanInfo.IsBan = false; + await _userMongo.ReplaceOneAsync(user); + + return (true, "解封成功"); + } + + public async Task<(bool isok, string msg)> BatchSendEmail(BatchSendEmailParam param) + { + const int MAX_EMAIL_COUNT = 200; + var now = DateTime.Now.ToTimeStamp(); + var expireDays = param.ExpireDays > 0 ? param.ExpireDays : 30; + var expireTime = DateTime.Now.AddDays(expireDays).ToTimeStamp(); + + List userIds; + + if (param.UserIds == null || param.UserIds.Count == 0) + { + var users = await _userMongo.FilterByAsync(u => u.IsDelete == false && (u.BanInfo == null || u.BanInfo.IsBan == false)); + userIds = users.Select(u => u.Id).ToList(); + } + else + { + var users = await _userMongo.FilterByAsync(u => param.UserIds.Contains(u.BaseInfo.Number)); + userIds = users.Select(u => u.Id).ToList(); + } + + var emails = new List(); + foreach (var userId in userIds) + { + var userEmails = await _emailMongo.FilterByAsync(c => c.UserId == userId); + if (userEmails != null && userEmails.Count >= MAX_EMAIL_COUNT) + { + var sorted = userEmails.OrderBy(c => c.SendTime).ToList(); + var deleteCount = userEmails.Count - MAX_EMAIL_COUNT + 1; + for (int i = 0; i < deleteCount; i++) + { + await _emailMongo.DeleteByIdAsync(sorted[i].Id); + } + } + + var expiredEmails = userEmails?.Where(c => c.ExpireTime > 0 && c.ExpireTime < now).ToList(); + if (expiredEmails != null) + { + foreach (var exp in expiredEmails) + { + await _emailMongo.DeleteByIdAsync(exp.Id); + } + } + + var email = new UserEmail + { + UserId = userId, + Title = param.Title, + Content = param.Content, + RewardGold = param.Gold, + RewardDiamond = param.Diamond, + RewardItems = param.Props, + SendTime = DateTime.Now.ToTimeStamp(), + ExpireTime = expireTime, + IsRead = false, + IsReward = !(param.Gold > 0 || param.Diamond > 0 || (param.Props != null && param.Props.Count > 0)) + }; + + emails.Add(email); + } + + await _emailMongo.InsertManyAsync(emails); + + foreach (var email in emails) + { + _capPublisher.Publish("BackgroundOperation.NotifyUser", new BackgroundOperationNotifyMessage + { + UserId = email.UserId, + Action = "new_email", + EmailId = email.Id, + Title = email.Title + }); + } + + return (true, $"已发送 {emails.Count} 封邮件"); + } + + + public async Task GetUser(string id) + { + var model = await _userMongo.FindOneAsync(c => c.Id == id || c.BaseInfo.Number == id); + if (model == null) + return null; + if (model.BanInfo != null && model.BanInfo.IsBan) + { + if (DateTime.Now.ToTimeStamp() > model.BanInfo.BanEndTime) + { + model.BanInfo.IsBan = false; + model.BanInfo.BanDays = 0; + model.BanInfo.BanEndTime = 0; + model.BanInfo.BanReason = ""; + model.BanInfo.BanTime = 0; + await _userMongo.ReplaceOneAsync(model); + return model; + } + + throw new BusinessException("用户已被封禁 原因:" + model.BanInfo.BanReason + " 到期时间" + model.BanInfo.BanEndTime.ToDateTime().ToString("yyyy-MM-dd hh:mm")); + } + if (model.IsDelete) + throw new BusinessException("用户已被删除"); + return model; + } + + public async Task<(bool isok, string msg)> SetUserType(string userId, int userType) + { + var user = await _userMongo.FindByIdAsync(userId); + if (user == null) + return (false, "用户不存在"); + + if (userType < 1 || userType > 3) + return (false, "用户类型无效,只能为1(普通用户)、2(代理商)、3(内部人员)"); + + user.UserType = userType; + await _userMongo.ReplaceOneAsync(user); + return (true, "设置成功"); + } + + public async Task<(bool isok, string msg)> BatchSetUserType(List userIds, int userType) + { + if (userIds == null || userIds.Count == 0) + return (false, "请选择用户"); + + if (userType < 1 || userType > 3) + return (false, "用户类型无效,只能为1(普通用户)、2(代理商)、3(内部人员)"); + + var count = 0; + foreach (var userId in userIds) + { + var user = await _userMongo.FindByIdAsync(userId); + if (user != null) + { + user.UserType = userType; + await _userMongo.ReplaceOneAsync(user); + count++; + } + } + + return (true, $"已设置 {count} 个用户的类型"); + } + + public async Task<(bool isok, string msg)> SetBlackUser(string userId, bool isBlack) + { + var operationId = Guid.NewGuid().ToString("N"); + var startedAt = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + var user = await _userMongo.FindByIdAsync(userId); + if (user == null) + return (false, "用户不存在"); + + user.PlayerFactor ??= new PlayerFactor(); + user.PlayerFactor.IsBlack = isBlack; + + if (isBlack) + { + var gameConfig = await _gameConfigService.Get(); + user.PlayerFactor.ViolateValue = 0.01; + user.PlayerFactor.CompensateRate = new CompensateRateParam + { + BossRate = 0.01, + GoldRate = 0.01, + SpecialRate = 0.01, + Ordinary = 0.01 + }; + user.PlayerFactor.PenaltyRate = new CompensateRateParam + { + BossRate = 0.01, + GoldRate = 0.01, + SpecialRate = 0.01, + Ordinary = 0.01 + }; + } + else + { + var gameConfig = await _gameConfigService.Get(); + user.PlayerFactor.ViolateValue = gameConfig.KillConfig.ViolateValue; + user.PlayerFactor.CompensateRate = gameConfig.KillConfig.CompensateRate; + user.PlayerFactor.PenaltyRate = gameConfig.KillConfig.PenaltyRate; + user.PlayerFactor.CompensateQuota = 0; + user.PlayerFactor.PenaltyQuota = 0; + } + + var saveResult = await _userMongo.ReplaceOneAsync(user); + if (!saveResult.ok) + { + + return (false, saveResult.message); + } + + if (!PublishFactorChanged(userId, operationId, isBlack ? "AddBlacklist" : "RemoveBlacklist", startedAt)) + return (false, $"数据已保存,但刷新通知发布失败,操作编号:{operationId}"); + return (true, isBlack ? "已屏蔽用户" : "已取消屏蔽"); + } + + public async Task<(bool isok, string msg)> BatchSetBlackUser(List userIds, bool isBlack) + { + if (userIds == null || userIds.Count == 0) + return (false, "请选择用户"); + + var count = 0; + var failedCount = 0; + foreach (var userId in userIds) + { + var operationId = Guid.NewGuid().ToString("N"); + var startedAt = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + var user = await _userMongo.FindByIdAsync(userId); + if (user != null) + { + user.PlayerFactor ??= new PlayerFactor(); + user.PlayerFactor.IsBlack = isBlack; + + if (isBlack) + { + user.PlayerFactor.ViolateValue = 0.01; + user.PlayerFactor.CompensateRate = new CompensateRateParam + { + BossRate = 0.01, + GoldRate = 0.01, + SpecialRate = 0.01, + Ordinary = 0.01 + }; + user.PlayerFactor.PenaltyRate = new CompensateRateParam + { + BossRate = 0.01, + GoldRate = 0.01, + SpecialRate = 0.01, + Ordinary = 0.01 + }; + } + else + { + var gameConfig = await _gameConfigService.Get(); + user.PlayerFactor.ViolateValue = gameConfig.KillConfig.ViolateValue; + user.PlayerFactor.CompensateRate = gameConfig.KillConfig.CompensateRate; + user.PlayerFactor.PenaltyRate = gameConfig.KillConfig.PenaltyRate; + user.PlayerFactor.CompensateQuota = 0; + user.PlayerFactor.PenaltyQuota = 0; + } + + var saveResult = await _userMongo.ReplaceOneAsync(user); + if (saveResult.ok) + { + + if (PublishFactorChanged(userId, operationId, isBlack ? "BatchAddBlacklist" : "BatchRemoveBlacklist", startedAt)) + count++; + else + failedCount++; + } + else + { + failedCount++; + + } + } + } + + return (failedCount == 0, + isBlack ? $"已屏蔽 {count} 个用户,失败 {failedCount} 个" : $"已取消屏蔽 {count} 个用户,失败 {failedCount} 个"); + } + + public async Task<(bool isok, string msg)> UpdateUserFactor(string userId, PlayerFactor factor) + { + var operationId = Guid.NewGuid().ToString("N"); + var startedAt = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + var user = await _userMongo.FindByIdAsync(userId); + if (user == null) + return (false, "用户不存在"); + + if (user.PlayerFactor == null) + user.PlayerFactor = new PlayerFactor(); + + var existing = user.PlayerFactor; + existing.ViolateValue = factor.ViolateValue; + existing.MissRate = factor.MissRate; + if (factor.CompensateQuota > 0) + { + var currentGold = user.Assets?.Gold ?? 0; + var session = _cache.GetRedisUserCId(userId); + if (!string.IsNullOrWhiteSpace(session?.RoomId)) + { + var room = _cache.GetGameRoom(session.RoomId); + var onlinePlayer = room?.Players?.FirstOrDefault(p => p.UserId == userId); + if (onlinePlayer != null) + currentGold = onlinePlayer.Gold; + } + + existing.CompensateStartGold = currentGold; + existing.CompensateTargetGold = checked(currentGold + factor.CompensateQuota); + } + else + { + existing.CompensateStartGold = 0; + existing.CompensateTargetGold = 0; + } + existing.CompensateQuota = factor.CompensateQuota; + existing.PenaltyQuota = factor.PenaltyQuota; + existing.CompensateRate = factor.CompensateRate; + existing.PenaltyRate = factor.PenaltyRate; + existing.AdditionalFactor = factor.AdditionalFactor; + existing.IsBlack = existing.IsBlack; + existing.IsIgnore = existing.IsIgnore; + existing.StartingBonus = existing.StartingBonus; + + var saveResult = await _userMongo.ReplaceOneAsync(user); + if (!saveResult.ok) + { + + return (false, saveResult.message); + } + + + try + { + var publishedAt = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + _capPublisher.Publish(TopicKeys.因子变更, new PlayerFactorChangedMessage + { + UserId = userId, + ChangeType = "UpdateFactor", + OperationId = operationId, + PublishedAtUnixMs = publishedAt + }); + + } + catch (Exception ex) + { + _logger.LogError(ex, "[FactorChange] CAP发布失败 operationId={OperationId} topic={Topic} userId={UserId}", + operationId, TopicKeys.因子变更, userId); + return (false, $"数据已保存,但刷新通知发布失败,操作编号:{operationId}"); + } + + return (true, "更新成功"); + } + + public async Task GetBlackFactorConfig() + { + return new PlayerFactor + { + IsBlack = true, + ViolateValue = 0.01, + CompensateRate = new CompensateRateParam + { + BossRate = 0.01, + GoldRate = 0.01, + SpecialRate = 0.01, + Ordinary = 0.01 + }, + PenaltyRate = new CompensateRateParam + { + BossRate = 0.01, + GoldRate = 0.01, + SpecialRate = 0.01, + Ordinary = 0.01 + }, + CompensateQuota = 0, + PenaltyQuota = 0 + }; + } + + public async Task<(bool isok, string msg)> ResetUserFactor(string userId) + { + var operationId = Guid.NewGuid().ToString("N"); + var startedAt = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + var user = await _userMongo.FindByIdAsync(userId); + if (user == null) + return (false, "用户不存在"); + + var gameConfig = await _gameConfigService.Get(); + user.PlayerFactor = new PlayerFactor + { + IsBlack = false, + ViolateValue = gameConfig.KillConfig.ViolateValue, + CompensateRate = gameConfig.KillConfig.CompensateRate, + PenaltyRate = gameConfig.KillConfig.PenaltyRate, + CompensateQuota = 0, + PenaltyQuota = 0 + }; + + var saveResult = await _userMongo.ReplaceOneAsync(user); + if (!saveResult.ok) + { + + return (false, saveResult.message); + } + + if (!PublishFactorChanged(userId, operationId, "ResetFactor", startedAt)) + return (false, $"数据已保存,但刷新通知发布失败,操作编号:{operationId}"); + return (true, "重置成功"); + } + + private bool PublishFactorChanged(string userId, string operationId, string changeType, long startedAt) + { + try + { + var publishedAt = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + _capPublisher.Publish(TopicKeys.因子变更, new PlayerFactorChangedMessage + { + UserId = userId, + ChangeType = changeType, + OperationId = operationId, + PublishedAtUnixMs = publishedAt + }); + + return true; + } + catch (Exception ex) + { + _logger.LogError(ex, "[FactorChange] CAP发布失败 operationId={OperationId} changeType={ChangeType} topic={Topic} userId={UserId}", + operationId, changeType, TopicKeys.因子变更, userId); + return false; + } + } + + public async Task<(bool isok, string msg)> InitUserPassword(string userId) + { + if (string.IsNullOrWhiteSpace(userId)) + return (false, "用户不存在"); + + userId = userId.Trim(); + var user = await GetUser(userId); + if (user == null) + { + + return (false, "用户不存在"); + } + + user.BaseInfo.Password = Md5Helper.GetMD5("123456"); + await _userMongo.ReplaceOneAsync(user); + return (true, "用户密码已初始化为123456"); + } + + public async Task<(bool isok, string msg)> InitSafeBoxPassword(string userId) + { + if (string.IsNullOrWhiteSpace(userId)) + return (false, "用户不存在"); + + userId = userId.Trim(); + var user = await GetUser(userId); + if (user == null) + { + + return (false, "用户不存在"); + } + + user.SafeBox ??= new SafeBoxInfo(); + user.SafeBox.Password = Common.Utils.Md5Helper.GetMD5("123456"); + await _userMongo.ReplaceOneAsync(user); + return (true, "保险箱密码已初始化为123456"); + } + + public async Task<(List list, int count)> GetUserFactorList(UserFactorListParam param) + { + var where = LinqExtensions.True().And(e => e.IsDelete == false); + + if (!string.IsNullOrWhiteSpace(param.KeyWord)) + { + where = where.And(e => (e.BaseInfo != null && (e.BaseInfo.UserName.Contains(param.KeyWord) || e.BaseInfo.Number.Contains(param.KeyWord) || e.BaseInfo.Mobile.Contains(param.KeyWord)))); + } + + if (!string.IsNullOrWhiteSpace(param.RegisterIp)) + { + where = where.And(e => e.RegisterIp != null && e.RegisterIp.Contains(param.RegisterIp)); + } + + if (!string.IsNullOrWhiteSpace(param.LoginIp)) + { + where = where.And(e => e.Static != null && e.Static.LastLoginIp != null && e.Static.LastLoginIp.Contains(param.LoginIp)); + } + + if (param.IsBlack.HasValue) + { + if (param.IsBlack.Value) + { + where = where.And(e => e.PlayerFactor != null && e.PlayerFactor.IsBlack); + } + else + { + where = where.And(e => e.PlayerFactor == null || !e.PlayerFactor.IsBlack); + } + } + + HashSet? onlineLoginIds = null; + if (param.IsOnline.HasValue) + { + onlineLoginIds = _cache.GetAllLoginUserIds().ToHashSet(StringComparer.Ordinal); + } + + List resultList; + long totalCount; + + if (onlineLoginIds != null) + { + var allUsers = await _userMongo.FilterByAsync(where); + IEnumerable filtered = allUsers.Where(u => onlineLoginIds.Contains(u.Id)); + if (!string.IsNullOrWhiteSpace(param.IpCountOp) && param.IpCount.HasValue) + { + var onlineIpGroups = filtered + .Where(u => !string.IsNullOrEmpty(u.RegisterIp)) + .GroupBy(u => u.RegisterIp) + .Where(g => { + var count = g.Count(); + return param.IpCountOp switch + { + "gt" => count > param.IpCount.Value, + "gte" => count >= param.IpCount.Value, + "lt" => count < param.IpCount.Value, + "lte" => count <= param.IpCount.Value, + "eq" => count == param.IpCount.Value, + _ => true + }; + }) + .SelectMany(g => g) + .Select(u => u.Id) + .ToHashSet(); + filtered = filtered.Where(u => onlineIpGroups.Contains(u.Id)); + } + var ranked = filtered.OrderByDescending(u => u.CreateTime); + resultList = ranked + .Skip(((param.PageIndex ?? 1) - 1) * (param.PageSize ?? 15)) + .Take(param.PageSize ?? 15) + .ToList(); + totalCount = ranked.Count(); + } + else if (!string.IsNullOrWhiteSpace(param.IpCountOp) && param.IpCount.HasValue) + { + var allUsers = await _userMongo.FilterByAsync(where); + var ipGroups = allUsers + .Where(u => !string.IsNullOrEmpty(u.RegisterIp)) + .GroupBy(u => u.RegisterIp) + .Where(g => { + var count = g.Count(); + return param.IpCountOp switch + { + "gt" => count > param.IpCount.Value, + "gte" => count >= param.IpCount.Value, + "lt" => count < param.IpCount.Value, + "lte" => count <= param.IpCount.Value, + "eq" => count == param.IpCount.Value, + _ => true + }; + }) + .SelectMany(g => g) + .Select(u => u.Id) + .ToHashSet(); + + where = where.And(e => ipGroups.Contains(e.Id)); + var filteredResult = await _userMongo.QueryPageAsync(where, c => c.CreateTime, true, param.PageSize ?? 15, param.PageIndex ?? 1); + resultList = filteredResult.list; + totalCount = filteredResult.count; + } + else + { + var result = await _userMongo.QueryPageAsync(where, c => c.CreateTime, true, param.PageSize ?? 15, param.PageIndex ?? 1); + resultList = result.list; + totalCount = result.count; + } + + return (resultList, (int)totalCount); + } + + public async Task> GetUsersByRegisterIps(List registerIps) + { + var filter = Builders.Filter.In(u => u.RegisterIp, registerIps); + return await _userMongo.FilterByAsync(filter); + } + + + + public async Task> GetUserProps(string userId) + { + var user = await _userMongo.FindByIdAsync(userId); + return user?.Props ?? new List(); + } + + public async Task<(bool isok, string msg)> AddUserProp(string userId, string propNumber, int count) + { + var user = await _userMongo.FindByIdAsync(userId); + if (user == null) return (false, "用户不存在"); + if (count <= 0) return (false, "数量必须大于0"); + + var prop = user.Props.FirstOrDefault(p => p.Number == propNumber); + if (prop != null) + { + prop.Count += count; + } + else + { + var gameConfig = _cache.GetGameConfig(); + var propConfig = gameConfig.PropConfig.FirstOrDefault(c => c.Number == propNumber); + if (propConfig == null) return (false, "道具配置不存在"); + + user.Props.Add(new BaseProductCount + { + Number = propConfig.Number, + Name = propConfig.Name, + Type = propConfig.Type, + ImageUrl = propConfig.ImageUrl, + Count = count + }); + } + + var update = Builders.Update.Set(p => p.Props, user.Props); + var (ok, message) = await _userMongo.UpdateByIdAsync(user.Id, update); + if (ok) + { + _capPublisher.Publish("BackgroundOperation.NotifyUser", new BackgroundOperationNotifyMessage + { + UserId = userId, + Action = "backpack_add", + PropNumber = propNumber, + Count = count + }); + } + return (ok, message); + } + + public async Task<(bool isok, string msg)> UpdateUserPropCount(string userId, string propNumber, int count) + { + var user = await _userMongo.FindByIdAsync(userId); + if (user == null) return (false, "用户不存在"); + + var prop = user.Props.FirstOrDefault(p => p.Number == propNumber); + if (prop == null) return (false, "道具不存在"); + + if (count <= 0) + { + user.Props.Remove(prop); + } + else + { + prop.Count = count; + } + + var update = Builders.Update.Set(p => p.Props, user.Props); + var (ok, message) = await _userMongo.UpdateByIdAsync(user.Id, update); + if (ok) + { + _capPublisher.Publish("BackgroundOperation.NotifyUser", new BackgroundOperationNotifyMessage + { + UserId = userId, + Action = count <= 0 ? "backpack_delete" : "backpack_update", + PropNumber = propNumber, + Count = count + }); + } + return (ok, message); + } + + public async Task<(bool isok, string msg)> DeleteUserProp(string userId, string propNumber) + { + var user = await _userMongo.FindByIdAsync(userId); + if (user == null) return (false, "用户不存在"); + + var prop = user.Props.FirstOrDefault(p => p.Number == propNumber); + if (prop == null) return (false, "道具不存在"); + + user.Props.Remove(prop); + + var update = Builders.Update.Set(p => p.Props, user.Props); + var (ok, message) = await _userMongo.UpdateByIdAsync(user.Id, update); + if (ok) + { + _capPublisher.Publish("BackgroundOperation.NotifyUser", new BackgroundOperationNotifyMessage + { + UserId = userId, + Action = "backpack_delete", + PropNumber = propNumber + }); + } + return (ok, message); + } + + public async Task<(int total, int updated, string msg)> SyncAllUserLevel() + { + var gameConfig = await _gameConfigService.Get(); + if (gameConfig == null) + return (0, 0, "游戏配置不存在"); + + var allUsers = await _userMongo.FilterByAsync(u => !u.IsDelete); + int updated = 0; + + foreach (var user in allUsers) + { + bool changed = false; + + var exp = user.Assets.Exp; + var levelConfig = gameConfig.UserLevelConfigs + .FirstOrDefault(c => exp >= c.ExpMin && exp < c.ExpMax); + if (levelConfig != null && levelConfig.Level != user.Assets.Level) + { + user.Assets.Level = levelConfig.Level; + changed = true; + } + + var vipExp = user.Static.TotalRecharge * 10 + user.Assets.VipExpExtra; + user.Assets.VipExp = (long)vipExp; + var vipLevelConfig = gameConfig.VipLevelConfigs + .FirstOrDefault(c => vipExp >= c.ExpMin && vipExp < c.ExpMax); + if (vipLevelConfig != null && vipLevelConfig.Level != user.Assets.VipLevel) + { + user.Assets.VipLevel = vipLevelConfig.Level; + user.Assets.VipSignInAdd = vipLevelConfig.SignInAdd; + changed = true; + } + + if (changed) + { + var update = Builders.Update + .Set(p => p.Assets.Level, user.Assets.Level) + .Set(p => p.Assets.VipLevel, user.Assets.VipLevel) + .Set(p => p.Assets.VipExp, user.Assets.VipExp) + .Set(p => p.Assets.VipExpExtra, user.Assets.VipExpExtra) + .Set(p => p.Assets.VipSignInAdd, user.Assets.VipSignInAdd); + await _userMongo.UpdateByIdAsync(user.Id, update); + updated++; + } + } + + return (allUsers.Count, updated, $"共 {allUsers.Count} 个玩家,更新了 {updated} 个"); + } + + } +} diff --git a/AdminSrc/AdminService/User/IAdminUserService.cs b/AdminSrc/AdminService/User/IAdminUserService.cs new file mode 100644 index 0000000..551ab25 --- /dev/null +++ b/AdminSrc/AdminService/User/IAdminUserService.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AdminService.System.Response; +using AdminService.User.Param; +using AdminService.User.Response; +using Common; +using Common.Utils; +using CommonDomain.BaseModel; +using CommonInfrastructure.Response; +using MongoRepository; +using UserDomain.Entity; + +namespace AdminService.User +{ + public interface IAdminUserService + { + + + Task<(bool isok, string msg)> CancelUser(LoginUser loginUser); + + Task<(bool isok, string msg)> BanUser(string userId, string reason, int days); + Task<(bool isok, string msg)> DeleteUser(string id); + Task<(bool isok, string msg)> UpdateUser(UserEntity user); + Task<(bool isok, string msg)> UpdateUser(UpdateUserDataParam param); + Task<(bool isok, string msg)> SendEmail(SendEmailParam param, LoginUser loginUser); + + Task GetUser(string id); + + Task<(List list, int count)> GetAdminUserList(AdminUserListParam param); + + Task<(bool isok, string msg)> UpdateUserAssets(UpdateUserAssetsParam param); + + Task GetUserStatistics(); + + Task GetEmailStatistics(); + + Task<(bool isok, string msg)> BatchBanUser(BatchBanUserParam param); + + Task<(bool isok, string msg)> UnbanUser(string userId); + + Task<(bool isok, string msg)> BatchSendEmail(BatchSendEmailParam param); + + Task<(bool isok, string msg)> SetUserType(string userId, int userType); + + Task<(bool isok, string msg)> BatchSetUserType(List userIds, int userType); + + Task<(bool isok, string msg)> SetBlackUser(string userId, bool isBlack); + + Task<(bool isok, string msg)> BatchSetBlackUser(List userIds, bool isBlack); + + Task<(bool isok, string msg)> BatchDeleteUser(List userIds); + + Task<(bool isok, string msg)> UpdateUserFactor(string userId, PlayerFactor factor); + + Task GetBlackFactorConfig(); + + Task<(bool isok, string msg)> ResetUserFactor(string userId); + + + + Task<(bool isok, string msg)> InitUserPassword(string userId); + + Task<(bool isok, string msg)> InitSafeBoxPassword(string userId); + + Task<(List list, int count)> GetUserFactorList(UserFactorListParam param); + + Task> GetUsersByRegisterIps(List registerIps); + + + + Task> GetUserProps(string userId); + + Task<(bool isok, string msg)> AddUserProp(string userId, string propNumber, int count); + + Task<(bool isok, string msg)> UpdateUserPropCount(string userId, string propNumber, int count); + + Task<(bool isok, string msg)> DeleteUserProp(string userId, string propNumber); + + Task<(int total, int updated, string msg)> SyncAllUserLevel(); + + + + Task<(List list, long count)> GetEmailList(Param.EmailListQueryParam param); + + Task> GetEmailUserNamesAsync(List userIds); + + Task<(bool ok, string message)> DeleteEmail(string id); + + Task<(int success, int fail)> BatchDeleteEmail(List ids); + + + } +} diff --git a/AdminSrc/AdminService/User/Param/AdminUserListParam.cs b/AdminSrc/AdminService/User/Param/AdminUserListParam.cs new file mode 100644 index 0000000..6a49822 --- /dev/null +++ b/AdminSrc/AdminService/User/Param/AdminUserListParam.cs @@ -0,0 +1,62 @@ +using Common.CommonModel; + +namespace AdminService.User.Param +{ + public class AdminUserListParam : BaseListPageParam + { + public string KeyWord { get; set; } = ""; + + public int? IsBan { get; set; } + + public int? VipLevel { get; set; } + + public int? VipLevelMin { get; set; } + + public int? VipLevelMax { get; set; } + + public long? CreateTimeStart { get; set; } + + public long? CreateTimeEnd { get; set; } + + public long? LastLoginTimeStart { get; set; } + + public long? LastLoginTimeEnd { get; set; } + + public string Channel { get; set; } = ""; + + public string LoginIp { get; set; } = ""; + + public string RegisterIp { get; set; } = ""; + + public bool? IsBlack { get; set; } + + public string IpCountOp { get; set; } = ""; + + public int? IpCount { get; set; } + + public string IpType { get; set; } = "register"; + + public int? UserType { get; set; } + + public bool? IsOnline { get; set; } + + public string OrderBy { get; set; } = "createTime"; + } + + public class UserFactorListParam : BaseListPageParam + { + public string KeyWord { get; set; } = ""; + + public string RegisterIp { get; set; } = ""; + + public string LoginIp { get; set; } = ""; + + public bool? IsBlack { get; set; } + + public bool? IsOnline { get; set; } + + public string IpCountOp { get; set; } = ""; + + public int? IpCount { get; set; } + } +} diff --git a/AdminSrc/AdminService/User/Param/BatchBanUserParam.cs b/AdminSrc/AdminService/User/Param/BatchBanUserParam.cs new file mode 100644 index 0000000..e9454fa --- /dev/null +++ b/AdminSrc/AdminService/User/Param/BatchBanUserParam.cs @@ -0,0 +1,11 @@ +namespace AdminService.User.Param +{ + public class BatchBanUserParam + { + public List UserIds { get; set; } = new(); + + public string Reason { get; set; } = ""; + + public int Days { get; set; } = 0; + } +} diff --git a/AdminSrc/AdminService/User/Param/BatchSendEmailParam.cs b/AdminSrc/AdminService/User/Param/BatchSendEmailParam.cs new file mode 100644 index 0000000..c5a8600 --- /dev/null +++ b/AdminSrc/AdminService/User/Param/BatchSendEmailParam.cs @@ -0,0 +1,21 @@ +using CommonDomain.BaseModel; + +namespace AdminService.User.Param +{ + public class BatchSendEmailParam + { + public List? UserIds { get; set; } + + public string Title { get; set; } = ""; + + public string Content { get; set; } = ""; + + public long Gold { get; set; } = 0; + + public int Diamond { get; set; } = 0; + + public List Props { get; set; }=new List(); + + public int ExpireDays { get; set; } = 30; + } +} diff --git a/AdminSrc/AdminService/User/Param/EmailListQueryParam.cs b/AdminSrc/AdminService/User/Param/EmailListQueryParam.cs new file mode 100644 index 0000000..2729702 --- /dev/null +++ b/AdminSrc/AdminService/User/Param/EmailListQueryParam.cs @@ -0,0 +1,14 @@ +namespace AdminService.User.Param +{ + public class EmailListQueryParam + { + public int? PageIndex { get; set; } = 1; + public int? PageSize { get; set; } = 10; + public string? UserNumber { get; set; } + public string? UserId { get; set; } + public int? ReadStatus { get; set; } + public int? RewardStatus { get; set; } + public long? StartTime { get; set; } + public long? EndTime { get; set; } + } +} diff --git a/AdminSrc/AdminService/User/Param/SendEmailParam.cs b/AdminSrc/AdminService/User/Param/SendEmailParam.cs new file mode 100644 index 0000000..4ca4fe6 --- /dev/null +++ b/AdminSrc/AdminService/User/Param/SendEmailParam.cs @@ -0,0 +1,17 @@ +using CommonDomain.BaseModel; + +namespace AdminService.User.Param +{ + public class SendEmailParam + { + + + public string? UserId { get; set; } + public string? Title { get; set; } + public string? Content { get; set; } + public int RewardDiamond { get; set; } = 0; + public long RewardGold { get; set; } = 0; + public List? RewardItems { get; set; } = null; + + } +} diff --git a/AdminSrc/AdminService/User/Param/UpdateUserAssetsParam.cs b/AdminSrc/AdminService/User/Param/UpdateUserAssetsParam.cs new file mode 100644 index 0000000..598bec9 --- /dev/null +++ b/AdminSrc/AdminService/User/Param/UpdateUserAssetsParam.cs @@ -0,0 +1,23 @@ +namespace AdminService.User.Param +{ + public class UpdateUserAssetsParam + { + public string UserId { get; set; } = ""; + + public int Diamond { get; set; } = 0; + + public long Gold { get; set; } = 0; + + public long SafeBoxGold { get; set; } = 0; + + public int? Level { get; set; } + + public long? Exp { get; set; } + + public int? VipLevel { get; set; } + + public int OperationType { get; set; } = 3; + + public string Remark { get; set; } = ""; + } +} diff --git a/AdminSrc/AdminService/User/Param/UpdateUserDataParam.cs b/AdminSrc/AdminService/User/Param/UpdateUserDataParam.cs new file mode 100644 index 0000000..50e9e72 --- /dev/null +++ b/AdminSrc/AdminService/User/Param/UpdateUserDataParam.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AdminService.User.Param +{ + public class UpdateUserDataParam + { + + public string Id { get; set; } + public int Diamond { get; set; } = 0; + public long Gold { get; set; } = 0; + public int Level { get; set; } = 1; + public long Exp { get; set; } = 0; + } +} diff --git a/AdminSrc/AdminService/User/Param/UserAssetChangeQueryParam.cs b/AdminSrc/AdminService/User/Param/UserAssetChangeQueryParam.cs new file mode 100644 index 0000000..0bb881d --- /dev/null +++ b/AdminSrc/AdminService/User/Param/UserAssetChangeQueryParam.cs @@ -0,0 +1,26 @@ +using Common.CommonModel; +using System.Collections.Generic; + +namespace AdminService.User.Param +{ + public class UserAssetChangeQueryParam : BaseListPageParam + { + public string UserId { get; set; } = ""; + + public string KeyWord { get; set; } = ""; + + public List CurrencyTypes { get; set; } + + public List ChangeTypes { get; set; } + + public List Sources { get; set; } + + public List ExcludeSources { get; set; } + + public int? CurrencyType { get; set; } + + public long? TimeStart { get; set; } + + public long? TimeEnd { get; set; } + } +} diff --git a/AdminSrc/AdminService/User/Param/UserManagementParam.cs b/AdminSrc/AdminService/User/Param/UserManagementParam.cs new file mode 100644 index 0000000..512d503 --- /dev/null +++ b/AdminSrc/AdminService/User/Param/UserManagementParam.cs @@ -0,0 +1,59 @@ +using System.Collections.Generic; +using CommonDomain.BaseModel; +using UserDomain.Entity; + +namespace AdminService.User.Param +{ + public class BatchSetUserTypeParam + { + public List UserIds { get; set; } = new List(); + + public int UserType { get; set; } = 1; + } + + public class BatchSetBlackUserParam + { + public List UserIds { get; set; } = new List(); + + public bool IsBlack { get; set; } + } + + public class UpdateUserFactorParam + { + public string UserId { get; set; } = ""; + + public PlayerFactor Factor { get; set; } = new PlayerFactor(); + } + + public class UpdateUserFactorFlatParam + { + public string UserId { get; set; } = ""; + public double ViolateValue { get; set; } = 0.2; + public double MissRate { get; set; } = 0; + public int CompensateQuota { get; set; } = 0; + public int PenaltyQuota { get; set; } = 0; + public CompensateRateParam CompensateRate { get; set; } = new CompensateRateParam(); + public CompensateRateParam PenaltyRate { get; set; } = new CompensateRateParam(); + + public double AdditionalFactor { get; set; } = 0; + } + + public class BatchDeleteUserParam + { + public List UserIds { get; set; } = new List(); + } + + public class UpdateUserFactorPartialParam + { + public string UserId { get; set; } = ""; + public double? ViolateValue { get; set; } + public double? MissRate { get; set; } + public int? CompensateQuota { get; set; } + public int? PenaltyQuota { get; set; } + public CompensateRateParam CompensateRate { get; set; } + public CompensateRateParam PenaltyRate { get; set; } + public bool? IsBlack { get; set; } + public bool? IsIgnore { get; set; } + public long? StartingBonus { get; set; } + } +} diff --git a/AdminSrc/AdminService/User/Response/EmailStatistics.cs b/AdminSrc/AdminService/User/Response/EmailStatistics.cs new file mode 100644 index 0000000..eb10761 --- /dev/null +++ b/AdminSrc/AdminService/User/Response/EmailStatistics.cs @@ -0,0 +1,11 @@ +namespace AdminService.User.Response +{ + public class EmailStatistics + { + public long TotalEmails { get; set; } + public long RewardEmails { get; set; } + public long UnclaimedEmails { get; set; } + public long TodayEmails { get; set; } + public long MonthEmails { get; set; } + } +} \ No newline at end of file diff --git a/AdminSrc/AdminService/User/Response/UserStatistics.cs b/AdminSrc/AdminService/User/Response/UserStatistics.cs new file mode 100644 index 0000000..f2aa2d5 --- /dev/null +++ b/AdminSrc/AdminService/User/Response/UserStatistics.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AdminService.User.Response +{ + public class UserStatistics + { + public long TotalUsers { get; set; } + + public long TodayRegisteredUsers { get; set; } + + public long MonthRegisteredUsers { get; set; } + + public long OnlineUsers { get; set; } + + public long BannedUsers { get; set; } + + public long VipUsers { get; set; } + + public Dictionary VipLevelCount { get; set; } = new(); + + public long TotalGold { get; set; } + + public long TotalDiamond { get; set; } + } +} diff --git a/ApiLogService/ApiLogService.cs b/ApiLogService/ApiLogService.cs new file mode 100644 index 0000000..924b1b3 --- /dev/null +++ b/ApiLogService/ApiLogService.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ApiLogService +{ + public class ApiLogService : MongoBaseService, IApiLogService + { + private readonly IMongoBaseRepository _dal; + public ApiLogService(IMongoBaseRepository dal) + { + _dal = dal; + base.baseDal = dal; + } + } +} diff --git a/ApiLogService/ApiLogService.csproj b/ApiLogService/ApiLogService.csproj new file mode 100644 index 0000000..fa71b7a --- /dev/null +++ b/ApiLogService/ApiLogService.csproj @@ -0,0 +1,9 @@ + + + + net8.0 + enable + enable + + + diff --git a/ChessGameHost/.dockerignore b/ChessGameHost/.dockerignore new file mode 100644 index 0000000..fe1152b --- /dev/null +++ b/ChessGameHost/.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/ChessGameHost/ChessGameHost.csproj b/ChessGameHost/ChessGameHost.csproj new file mode 100644 index 0000000..d567f74 --- /dev/null +++ b/ChessGameHost/ChessGameHost.csproj @@ -0,0 +1,38 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + + + + + + + + + + + + Always + + + Always + + + + diff --git a/ChessGameHost/Config/system.json b/ChessGameHost/Config/system.json new file mode 100644 index 0000000..adc595f --- /dev/null +++ b/ChessGameHost/Config/system.json @@ -0,0 +1,50 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "urls": "http://*:8005", + + + "AllowedHosts": "*", + "JwtConfig": { + "TokenKey": "token", + "Issuer": "admin", + "Audience": "", // "Audience": "", + "SecretKey": "henanhuashengchongwuyouxiangongsikejizhongxin", + "ValidateIssuer": false, + "ValidateAudience": false, + "ValidateIssuerSigningKey": false, + "ValidateLifetime": false + + }, + "ConnectionStrings": { + "PgSqlConnection": "host=localhost;database=data_0524;user id=data_0524;password=123456;" + }, + "CapConfig": { + "Host": "localhost", + "UserName": "admin", + "Password": "123456", + "VirtualHost": "/", + "PGLogHost": "host=localhost;database=data_0524;user id=data_0524;password=123456;" + }, + "RedisConfig": { + "Host": "localhost", + "Port": 6378, + "UserName": "", + "Password": "123456", + "Database": 1 + }, + "MongoDbSettings": { + "username": "root", + "password": "root23456", + "ServerUrl": "mongodb://localhost:27018" + }, + "WXConfig": { + "AppId": "wxceab9ce5b4474219", + "Secret": "5a291d7b295c76da579611da3f83e059", + "Url": "https://api.weixin.qq.com" + } +} diff --git a/ChessGameHost/Extension/CapExtension.cs b/ChessGameHost/Extension/CapExtension.cs new file mode 100644 index 0000000..720a71b --- /dev/null +++ b/ChessGameHost/Extension/CapExtension.cs @@ -0,0 +1,57 @@ +using DotNetCore.CAP; +using DotNetCore.CAP.Messages; + +namespace ChessGameHost.Extension +{ + public static class CapExtension + { + public static IServiceCollection AddCap(this IServiceCollection services, IConfiguration configuration) + { + services.AddCap(x => + { + x.UseDashboard(); + x.UseRabbitMQ(rb => + { + rb.HostName = configuration["CapConfig:Host"]; + rb.UserName = configuration["CapConfig:UserName"]; + rb.Password = configuration["CapConfig:Password"]; + rb.VirtualHost = configuration["CapConfig:VirtualHost"]; + rb.ExchangeName = "cap.exchange"; + }); + x.UsePostgreSql(op => + { + op.ConnectionString = configuration["CapConfig:PGLogHost"]; + op.Schema = "public"; + }); + + + + x.SucceedMessageExpiredAfter = 7 * 24 * 3600; + x.FailedRetryCount = 5; + x.FailedRetryInterval = 10; + x.FailedThresholdCallback = ObjFailedThresholdCallback; + + + }); + + services.AddTransient(); + services.AddTransient(); + + return services; + } + + private static async void ObjFailedThresholdCallback(FailedInfo failed) + { + var exception = failed.Message.Headers["cap-exception"] ?? string.Empty; + var name = failed.Message.GetName(); + if (failed.MessageType == MessageType.Publish) + { + + } + else + { + + } + } + } +} \ No newline at end of file diff --git a/ChessGameHost/Middleware/ApiLoggingMiddleware.cs b/ChessGameHost/Middleware/ApiLoggingMiddleware.cs new file mode 100644 index 0000000..bdb77b8 --- /dev/null +++ b/ChessGameHost/Middleware/ApiLoggingMiddleware.cs @@ -0,0 +1,169 @@ + +using System.Text; +using Common; +using CommonDomain; +using CommonService; +using Newtonsoft.Json; + +namespace ChessGameHost.Middleware +{ + public class ApiLoggingMiddleware + { + private readonly RequestDelegate _next; + private readonly ILogger _logger; + private readonly IApiLogService _apiLogService; + + public ApiLoggingMiddleware(RequestDelegate next, ILogger logger, IApiLogService apiLogService) + { + _next = next; + _logger = logger; + _apiLogService = apiLogService; + } + public async Task Invoke(HttpContext httpContext) + { + var request = httpContext.Request; + if (request.Path.StartsWithSegments(new PathString("/api")) && request.Method.ToLower() != "options") + { + var requestTime = DateTime.Now; + var requestBodyContent = string.Empty; + var originalRequest = httpContext.Response.Body; + if (request.Method == "POST") + { + request.EnableBuffering(); + requestBodyContent = await new StreamReader(request.Body).ReadToEndAsync(); + request.Body.Position = 0; + } + + try + { + using (var responseBody = new MemoryStream()) + { + var response = httpContext.Response; + response.Body = responseBody; + await _next(httpContext); + string responseBodyContent = null; + responseBodyContent = await FormatResponse(response); + await responseBody.CopyToAsync(originalRequest); + + string token = string.Empty, version = string.Empty, userAgent = string.Empty, source = string.Empty, deviceId = string.Empty, device = string.Empty, ip = string.Empty,sign=string.Empty; + if (httpContext.Request != null && httpContext.Request.Headers != null) + { + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Token"])) + { + token = httpContext.Request.Headers["Token"] + ""; } + + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Version"])) + { + version = httpContext.Request.Headers["Version"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["User-Agent"])) + { + userAgent = httpContext.Request.Headers["User-Agent"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Source"])) + { + source = httpContext.Request.Headers["Source"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["DeviceId"])) + { + deviceId = httpContext.Request.Headers["DeviceId"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Device"])) + { + device = httpContext.Request.Headers["Device"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Ip"])) + { + ip = httpContext.Request.Headers["Ip"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Sign"])) + { + sign = httpContext.Request.Headers["Sign"] + ""; + } + } + string allResponseContent = responseBodyContent; + try + { + if (!string.IsNullOrEmpty(responseBodyContent)) + { + BaseResponse baseResponse = JsonConvert.DeserializeObject>(responseBodyContent); + if (baseResponse != null && baseResponse.Data != null) + { + baseResponse.Data = null; + } + responseBodyContent = JsonConvert.SerializeObject(baseResponse); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "API响应日志脱敏序列化失败 path={Path}", request.Path); +} + var now = DateTime.Now; + var apilog = new ApiLog() + { + requestTime = now, + accessToken = token, + clientIP = httpContext.Connection.RemoteIpAddress.ToString(), + consumeTime = (DateTime.Now - requestTime).Milliseconds, + requestHead= JsonConvert.SerializeObject(httpContext.Request.Headers), + requestUrl = request.Path, + requestMethod = request.Method.ToLower(), + requestQuery = request.QueryString.ToString(), + requestBody = requestBodyContent, + httpStatus = httpContext.Response.StatusCode, + responseBody = responseBodyContent, + userAgent = userAgent, + device= device, + deviceId= deviceId, + ip=ip, + source=source, + version=version, + sign=sign + }; + await _apiLogService.InsertOneAsync(apilog); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "API日志记录失败 path={Path}", request.Path); + } + finally + { + httpContext.Response.Body = originalRequest; + } + } + else + { + await _next(httpContext); + } + } + private async Task FormatRequest(Microsoft.AspNetCore.Http.HttpRequest request) + { + var body = request.Body; + request.EnableBuffering(); + var buffer = new byte[Convert.ToInt32(request.ContentLength)]; + await request.Body.ReadAsync(buffer, 0, buffer.Length); + var bodyAsText = Encoding.UTF8.GetString(buffer); + request.Body = body; + return bodyAsText; + } + + private async Task FormatResponse(HttpResponse response) + { + response.Body.Seek(0, SeekOrigin.Begin); + string text = await new StreamReader(response.Body).ReadToEndAsync(); + response.Body.Seek(0, SeekOrigin.Begin); + //return $"{response.StatusCode}: {text}"; + return text; + } + } + + public static class ApiLoggingMiddlewareExtensions + { + public static IApplicationBuilder UseApiLogging(this IApplicationBuilder app) + { + return app.UseMiddleware(); + } + } +} + diff --git a/ChessGameHost/Middleware/AutofacModule.cs b/ChessGameHost/Middleware/AutofacModule.cs new file mode 100644 index 0000000..8753423 --- /dev/null +++ b/ChessGameHost/Middleware/AutofacModule.cs @@ -0,0 +1,40 @@ + +using Autofac; +using ChessGameService; +using CommonService; +using MongoRepository; + +namespace ChessGameHost.Middleware +{ + public class AutofacModule : Module + { + protected override void Load(ContainerBuilder builder) + { + builder.RegisterGeneric(typeof(MongoBaseRepository<>)).As(typeof(IMongoBaseRepository<>)).InstancePerLifetimeScope(); + builder.RegisterGeneric(typeof(MongoBaseService<>)).As(typeof(IMongoBaseService<>)).InstancePerLifetimeScope(); + + // var assembly = typeof(Program).Assembly; + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterAssemblyTypes(typeof(ApiLogService).Assembly) + .Where(t => t.Name.EndsWith("Service")) + .AsImplementedInterfaces() + .InstancePerLifetimeScope(); + builder.RegisterAssemblyTypes(typeof(ChessGameService.ChessGameService).Assembly) + .Where(t => t.Name.EndsWith("Service")) + .AsImplementedInterfaces() + .InstancePerLifetimeScope(); + builder.RegisterAssemblyTypes(typeof(UserService.User.UserService).Assembly) + .Where(t => t.Name.EndsWith("Service")) + .AsImplementedInterfaces() + .InstancePerLifetimeScope(); + + + + } + } + +} diff --git a/ChessGameHost/Middleware/HubExceptionFilter.cs b/ChessGameHost/Middleware/HubExceptionFilter.cs new file mode 100644 index 0000000..cdad0ed --- /dev/null +++ b/ChessGameHost/Middleware/HubExceptionFilter.cs @@ -0,0 +1,61 @@ +using Common.Utils; +using CommonDomain; +using CommonService; +using Microsoft.AspNetCore.SignalR; + +namespace ChessGameHost.Middleware +{ + public class HubExceptionFilter : IHubFilter + { + private readonly ILogger _logger; + private readonly IApiLogService _apiLogService; + + public HubExceptionFilter(ILogger logger, IApiLogService apiLogService) + { + _logger = logger; + _apiLogService = apiLogService; + } + + public async ValueTask InvokeMethodAsync(HubInvocationContext invocationContext, Func> next) + { + if (invocationContext.HubMethodName == "SyncGameData") + return await next(invocationContext); + + var apilog = new ApiLog() + { + requestTime = DateTime.Now, + accessToken = "", + clientIP = invocationContext.Context.ConnectionId, + consumeTime = 0, + requestHead = null, + requestUrl = invocationContext.HubMethodName, + requestMethod = "Socket", + requestQuery = null, + requestBody = invocationContext.HubMethodArguments.ToJson(), + httpStatus = 200, + responseBody = null, + userAgent = null, + device = null, + deviceId = null, + ip = null, + source = null, + version = null, + sign = null + }; + try + { + + await _apiLogService.InsertOneAsync(apilog); + return await next(invocationContext); + } + catch (Exception e) + { + apilog.httpStatus = 500; + apilog.responseBody = e.Message; + await _apiLogService.InsertOneAsync(apilog); + _logger.LogError(e, "HubExceptionMiddleware捕获异常"); + return null; + } + } + } +} diff --git a/ChessGameHost/Middleware/MovementFilter.cs b/ChessGameHost/Middleware/MovementFilter.cs new file mode 100644 index 0000000..0ea3b45 --- /dev/null +++ b/ChessGameHost/Middleware/MovementFilter.cs @@ -0,0 +1,65 @@ +using Common.Utils; +using Microsoft.AspNetCore.SignalR; +using System.Collections.Concurrent; + +namespace ChessGameHost.Middleware +{ + public class MovementFilter : IHubFilter + { + public async ValueTask InvokeMethodAsync( + HubInvocationContext context, + Func> next) + { + var arguments = context.HubMethodArguments; + { + + + //if (context.HubMethodName == "ChangeUserData" ) + //{ + // var obj = arguments[0].ToJson().ToObject(); + + // if (obj.Type == 8 || obj.Type == 6 || obj.Type == 7 || obj.Type == 4) + // { + // if (!RateLimiter.Allow(context.Context.ConnectionId)) + // { + // } + // } + //} + } + return await next(context); + } + } + + public static class RateLimiter + { + private static readonly ConcurrentDictionary _rates = new(); + + public static bool Allow(string connectionId) + { + var now = DateTime.UtcNow; + var rate = _rates.GetOrAdd(connectionId, id => new RateData()); + + if (rate.Tokens < 30) + { + rate.Tokens++; + rate.LastUpdate = now; + return true; + } + + if ((now - rate.LastUpdate).TotalMilliseconds > 33) + { + rate.Tokens = 1; + rate.LastUpdate = now; + return true; + } + + return false; + } + + private class RateData + { + public int Tokens { get; set; } = 30; + public DateTime LastUpdate { get; set; } = DateTime.UtcNow; + } + } +} diff --git a/ChessGameHost/Program.cs b/ChessGameHost/Program.cs new file mode 100644 index 0000000..482bf0d --- /dev/null +++ b/ChessGameHost/Program.cs @@ -0,0 +1,232 @@ +using Autofac; +using Autofac.Extensions.DependencyInjection; +using ChessGameHost.Extension; +using ChessGameHost.Middleware; +using ChessGameService; +using Common; +using Common.Request; +using CommonService; + +using JWTHelper; +using MessagePack; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Microsoft.Extensions.Options; +using MongoRepository.Config; +using NLog.Extensions.Logging; +using NLog.Web; +using RedisHelper; +using RedisService; +using SharpAbp.Infrastructure.Api.Middleware; +using System.Text.Json; +using UserService; +using static Common.Utils.DateTimeTools; +using ChessGameHost.Services; + +Environment.SetEnvironmentVariable("SERVICE_NAME", + Environment.GetEnvironmentVariable("SERVICE_NAME") + ?? System.Reflection.Assembly.GetEntryAssembly()?.GetName().Name + ?? "ChessGameHost"); +Environment.SetEnvironmentVariable("INSTANCE_ID", + Environment.GetEnvironmentVariable("INSTANCE_ID") ?? "default"); + +var builder = WebApplication.CreateBuilder(args); +string instanceId = Environment.GetEnvironmentVariable("INSTANCE_ID") ?? "Unknown"; + +builder.Services.AddSingleton(sp => new AppInstanceId { Id = instanceId }); +// Add services to the container. +builder.Services.AddControllers(); + +builder.Logging.AddNLog(); +builder.Host.UseNLog(); + +builder.Configuration.AddJsonFile(Path.Combine("Config", "system.json"), optional: true); +builder.Services.Configure(builder.Configuration.GetSection(nameof(MongoDbSettings))); +builder.Services.AddSingleton(sp => sp.GetRequiredService>().Value); + + + + +builder.Services.AddSignalR(hubOptions => +{ + + + hubOptions.MaximumReceiveMessageSize = 64 * 1024; // 64KB + hubOptions.StreamBufferCapacity = 512; + hubOptions.ClientTimeoutInterval = TimeSpan.FromSeconds(70); + hubOptions.KeepAliveInterval = TimeSpan.FromSeconds(15); + + hubOptions.AddFilter(); + hubOptions.AddFilter(); + + + +}).AddJsonProtocol(); + +builder.Services.Configure(x => +{ + x.MultipartBodyLengthLimit = 1024 * 1024 * 16; +}); + + +builder.Services.AddMemoryCache(); +builder.Services.AddControllers().AddJsonOptions(configure => +{ + configure.JsonSerializerOptions.Converters.Add(new DatetimeJsonConverter()); + +}); + + +builder.Services.AddSingleton(); +builder.Services.AddSingleton, HubSend>(); +builder.Services.AddSingleton(); +builder.Services.AddAutoMapper(typeof(AutoMapperConfig)); + +builder.Services.AddHostedService(); +builder.Services.AddHostedService(); + +builder.Services.AddHealthChecks() + .AddCheck("self", () => HealthCheckResult.Healthy(), tags: new[] { "self" }); + + + + + +builder.Services.AddCors(options => +{ + options.AddPolicy("Cors", policy => + { + + policy + //.WithOrigins(urls) + .SetIsOriginAllowed(_ => true) + .AllowAnyHeader() + //.WithHeaders("x-signalr-user-agent", "content-type", "authorization") + .AllowAnyMethod() + .AllowCredentials() + ; + }); + + +}); + +#region jwt + +builder.Services.AddCustomJwt(builder.Configuration); + +#endregion + +#region redis + +builder.Services.AddRedisCacheSingleton(builder.Configuration); + +#endregion + +builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); +builder.Host.ConfigureContainer(builder => +{ + builder.RegisterModule(); +}); + +#region Cap + +builder.Services.AddCap(builder.Configuration); +#endregion + + + +var app = builder.Build(); + +using (var scope = app.Services.CreateScope()) +{ + var redis = scope.ServiceProvider.GetRequiredService(); + var chessService = scope.ServiceProvider.GetRequiredService(); + var logger = scope.ServiceProvider.GetRequiredService>(); + try + { + redis.ClearAllLoginUserIds(); + var rooms = redis.GetAllChessRooms() ?? new List(); + var resetRooms = 0; + var disconnectedRooms = 0; + var affectedUserIds = new HashSet(); + var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + + foreach (var room in rooms.Where(r => r?.users?.Count > 0)) + { + foreach (var user in room.users.Where(u => !string.IsNullOrWhiteSpace(u.userId))) + affectedUserIds.Add(user.userId); + + if (room.state != 2) + { + chessService.ExitRoom(room); + resetRooms++; + continue; + } + + foreach (var user in room.users) + { + user.IsLeave = true; + user.DisconnectTime = now; + user.Cid = string.Empty; + } + redis.SetChessRoom(room); + disconnectedRooms++; + } + + foreach (var userId in affectedUserIds) + await chessService.UpdateUserGameType(userId, 0); + + } + catch (Exception ex) + { + logger.LogError(ex, "[Startup] 清除象棋玩家登录 cid 失败(非关键,不影响启动)"); + } +} + +// Configure the HTTP request pipeline. +if (app.Environment.IsDevelopment()) +{ + +} +app.UseApiLogging(); +app.UseRouting(); +app.UseGlobalExceptionHandler(); + + +app.UseStaticFiles(); +app.UseCors("Cors"); +app.UseAuthentication(); +app.UseAuthorization(); + +app.MapHub("/chessgamehub", options => +{ + options.Transports = Microsoft.AspNetCore.Http.Connections.HttpTransportType.WebSockets; +}); + +app.MapControllers(); + +app.MapHealthChecks("/health", new HealthCheckOptions +{ + Predicate = _ => true, + ResponseWriter = async (context, report) => + { + context.Response.ContentType = "application/json"; + var result = new + { + status = report.Status.ToString(), + checks = report.Entries.Select(e => new + { + name = e.Key, + status = e.Value.Status.ToString(), + description = e.Value.Description, + duration = e.Value.Duration.TotalMilliseconds + }), + totalDuration = report.TotalDuration.TotalMilliseconds + }; + await context.Response.WriteAsync(JsonSerializer.Serialize(result)); + } +}); + +app.Run(); diff --git a/ChessGameHost/Properties/launchSettings.json b/ChessGameHost/Properties/launchSettings.json new file mode 100644 index 0000000..8d9aa7f --- /dev/null +++ b/ChessGameHost/Properties/launchSettings.json @@ -0,0 +1,29 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:21784", + "sslPort": 0 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:5290", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/ChessGameHost/Services/ChessBotService.cs b/ChessGameHost/Services/ChessBotService.cs new file mode 100644 index 0000000..ac1933d --- /dev/null +++ b/ChessGameHost/Services/ChessBotService.cs @@ -0,0 +1,267 @@ +using ChessGameDomain; +using ChessGameService; +using CommonDomain; +using CommonDomain.BaseModel; +using CommonDomain.Enum; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using MongoRepository; +using RedisHelper; +using RedisService; +using Common.Redis; + +namespace ChessGameHost.Services; + +public class ChessBotService : BackgroundService +{ + private readonly ILogger _logger; + private readonly IServiceScopeFactory _scopeFactory; + private readonly IHubContext _hubContext; + private static readonly Random _random = new(); + + public ChessBotService( + ILogger logger, + IServiceScopeFactory scopeFactory, + IHubContext hubContext) + { + _logger = logger; + _scopeFactory = scopeFactory; + _hubContext = hubContext; + } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + await Task.Delay(TimeSpan.FromSeconds(10), stoppingToken); + + await CleanStaleRooms(); + + while (!stoppingToken.IsCancellationRequested) + { + try + { + using var scope = _scopeFactory.CreateScope(); + var redisService = scope.ServiceProvider.GetRequiredService(); + var distributedLock = scope.ServiceProvider.GetRequiredService(); + var emptyRoomRateRepo = scope.ServiceProvider.GetRequiredService>(); + + var rooms = redisService.GetAllChessRooms(); + if (rooms == null) rooms = new List(); + + if (rooms.Count > 0) + { + var robotRoomAllowance = await EnsureChessEmptyRoomRate( + emptyRoomRateRepo, redisService, distributedLock, rooms); + + var candidateRooms = rooms.Where(r => + r != null + && r.state == 0 + && (r.users == null || r.users.Count == 0) + && r.robotCount == 0 + ).ToList(); + + int maxBatch = Math.Min(Math.Min(candidateRooms.Count, robotRoomAllowance), 5); + for (int i = 0; i < maxBatch; i++) + { + var candidate = candidateRooms[i]; + ChessGameRoom? updatedRoom = null; + await distributedLock.TryExecuteAsync( + $"{RedisKey.DistributedLockPrefix}chess:room:{candidate.RoomId}", + () => + { + var target = redisService.GetChessRoom(candidate.RoomId); + if (target == null || target.state == 3 || + (target.users != null && target.users.Count > 0)) + return Task.CompletedTask; + + target.robotCount = 1; + target.state = 1; + if (string.IsNullOrEmpty(target.password)) + target.password = _random.Next(100000, 999999).ToString(); + + redisService.SetChessRoom(target); + updatedRoom = target; + return Task.CompletedTask; + }, + expiry: 10); + + if (updatedRoom != null) + await _hubContext.Clients.Group(ChessGameHub.LobbyGroup).SendAsync("JoinRoomNotice", updatedRoom); + } + + } + + } + catch (Exception ex) + { + _logger.LogError(ex, "ChessBotService 执行异常"); + } + + await Task.Delay(TimeSpan.FromMinutes(2), stoppingToken); + } + } + + private async Task CleanStaleRooms() + { + try + { + using var scope = _scopeFactory.CreateScope(); + var redisService = scope.ServiceProvider.GetRequiredService(); + var distributedLock = scope.ServiceProvider.GetRequiredService(); + + var rooms = redisService.GetAllChessRooms(); + if (rooms == null) return; + + var staleRooms = rooms.Where(r => r != null + && (r.users == null || r.users.Count == 0) + && (r.state == 3 || (r.state == 1 && string.IsNullOrWhiteSpace(r.createUserId)))) + .ToList(); + + if (staleRooms.Count == 0) return; + + foreach (var room in staleRooms) + { + await distributedLock.TryExecuteAsync( + $"{RedisKey.DistributedLockPrefix}chess:room:{room.RoomId}", + () => + { + var target = redisService.GetChessRoom(room.RoomId); + if (target == null) return Task.CompletedTask; + + if (target.state == 1 && string.IsNullOrWhiteSpace(target.createUserId) + && (target.users == null || target.users.Count == 0)) + { + redisService.RemoveChessRoom(target.RoomId); + return Task.CompletedTask; + } + + target.users = new List(); + target.state = 0; + target.password = ""; + target.createUserId = ""; + target.gold = 0; + target.gameType = 0; + target.robotCount = 0; + target.IsGameEnded = false; + target.EndGameRequests?.Clear(); + target.PendingWinUserId = null; + target.TimeoutLoserUserId = ""; + target.LastActiveTime = 0; + + redisService.SetChessRoom(target); + return Task.CompletedTask; + }, + expiry: 5); + + await Task.Delay(50); + } + + } + catch (Exception ex) + { + _logger.LogError(ex, "[ChessBot] 启动清理异常"); + } + } + + private async Task EnsureChessEmptyRoomRate( + IMongoBaseRepository emptyRoomRateRepo, + IRedisService redisService, + IDistributedLock distributedLock, + List rooms) + { + try + { + var chessConfigs = emptyRoomRateRepo + .FilterBy(c => c.GameType == GameTypeEnum.中国象棋 && !c.IsDelete) + .ToList(); + if (chessConfigs == null || chessConfigs.Count == 0) + return 0; + + var threshold = chessConfigs.Max(c => c.EmptyRoomRate); + if (threshold <= 0) + return rooms.Count; + + if (rooms == null || rooms.Count == 0) + return 0; + + var total = rooms.Count(r => r != null); + var requiredEmpty = (int)Math.Ceiling(total * Math.Clamp(threshold, 0, 100) / 100.0); + var empty = rooms.Count(IsAvailableEmptyRoom); + var needRelease = Math.Max(0, requiredEmpty - empty); + + if (needRelease > 0) + { + var robotOnlyRooms = rooms + .Where(r => r != null && !HasActiveHuman(r) && r.robotCount > 0) + .OrderBy(r => r.CreateTime) + .Take(needRelease) + .ToList(); + + foreach (var room in robotOnlyRooms) + { + ChessGameRoom? releasedRoom = null; + await distributedLock.TryExecuteAsync( + $"{RedisKey.DistributedLockPrefix}chess:room:{room.RoomId}", + () => + { + var target = redisService.GetChessRoom(room.RoomId); + if (target == null || HasActiveHuman(target) || target.robotCount <= 0) + return Task.CompletedTask; + + ResetToEmptyRoom(target); + redisService.SetChessRoom(target); + releasedRoom = target; + return Task.CompletedTask; + }, + expiry: 10, + retry: true, + retryDelay: 50); + + if (releasedRoom != null) + { + empty++; + await _hubContext.Clients.Group(ChessGameHub.LobbyGroup) + .SendAsync("ExitRoomNotice", releasedRoom); + } + } + } + + return Math.Max(0, empty - requiredEmpty); + } + catch (Exception ex) + { + _logger.LogError(ex, "ChessBotService 维护空房率失败"); + return 0; + } + } + + private static bool IsAvailableEmptyRoom(ChessGameRoom room) + { + return room != null + && !HasActiveHuman(room) + && room.robotCount == 0 + && room.state != 2; + } + + private static void ResetToEmptyRoom(ChessGameRoom room) + { + room.users = new List(); + room.state = 0; + room.password = ""; + room.createUserId = ""; + room.gold = 0; + room.gameType = 0; + room.robotCount = 0; + room.IsGameEnded = false; + room.EndGameRequests?.Clear(); + room.PendingWinUserId = null; + room.TimeoutLoserUserId = ""; + room.LastActiveTime = 0; + } + + private static bool HasActiveHuman(ChessGameRoom room) + { + return room?.users != null && room.users.Any(u => u != null && !u.IsLeave); + } +} diff --git a/ChessGameHost/Services/ChessTimeoutService.cs b/ChessGameHost/Services/ChessTimeoutService.cs new file mode 100644 index 0000000..b2a6f12 --- /dev/null +++ b/ChessGameHost/Services/ChessTimeoutService.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using ChessGameService; +using ChessGameDomain; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; + +namespace ChessGameHost.Services +{ + public class ChessTimeoutService : BackgroundService + { + private readonly ILogger _logger; + + private readonly IChessGameService _chessService; + + private readonly IHubContext _hubContext; + + public ChessTimeoutService( + ILogger logger, + IChessGameService chessService, + IHubContext hubContext) + { + _logger = logger; + _chessService = chessService; + _hubContext = hubContext; + } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + while (!stoppingToken.IsCancellationRequested) + { + try + { + await CheckAllRoomsTimeout(); + } + catch (Exception ex) + { + _logger.LogError(ex, "检查象棋断线/挂起超时时发生错误"); + } + + await Task.Delay(TimeSpan.FromSeconds(10), stoppingToken); + } + } + + private async Task CheckAllRoomsTimeout() + { + var playingRooms = _chessService.GetAllPlayingRooms(); + if (playingRooms == null || !playingRooms.Any()) + return; + + var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + + foreach (var room in playingRooms) + { + foreach (var user in room.users) + { + if (user.IsLeave && user.DisconnectTime > 0) + { + var timeout = room.TimeoutSeconds > 0 ? room.TimeoutSeconds : 60; + if ((now - user.DisconnectTime) > timeout) + { + var winUserId = room.users + .FirstOrDefault(u => u.userId != user.userId)?.userId ?? ""; + + var settledConnectionIds = room.users + .Where(u => !string.IsNullOrWhiteSpace(u.Cid)) + .Select(u => u.Cid) + .Distinct() + .ToList(); + var (success, message, endRoom) = await _chessService.EndGame(room.RoomId, winUserId); + if (!success || endRoom == null) + { + break; + } + + await _hubContext.Clients.Group(room.RoomId).SendAsync("GameEnd", new + { + winUserId, + room = endRoom + }); + await _hubContext.Clients.Group(ChessGameHub.LobbyGroup).SendAsync("ExitRoomNotice", endRoom); + await _hubContext.Clients.Clients(settledConnectionIds).SendAsync("ExitRoomNotice", endRoom); + foreach (var connectionId in settledConnectionIds) + { + await _hubContext.Groups.RemoveFromGroupAsync(connectionId, room.RoomId); + await _hubContext.Groups.AddToGroupAsync(connectionId, ChessGameHub.LobbyGroup); + } + + break; + } + } + } + + var latestRoom = _chessService.GetRoom(room.RoomId); + if (latestRoom != null && latestRoom.state == 2) + await CheckRoomAfk(latestRoom); + } + } + + private async Task CheckRoomAfk(ChessGameRoom room) + { + if (room.state != 2 || room.users == null || room.users.Count < 2) + return; + + if (!room.users.Any(u => u.IsAfk)) + return; + + var settledConnectionIds = room.users + .Where(u => !string.IsNullOrWhiteSpace(u.Cid)) + .Select(u => u.Cid) + .Distinct() + .ToList(); + + var (isTimeout, loserUserId) = await _chessService.CheckRoomAfkTimeout(room.RoomId); + if (!isTimeout || string.IsNullOrEmpty(loserUserId)) + return; + + var winUserId = room.users.FirstOrDefault(u => u.userId != loserUserId)?.userId ?? ""; + var endRoom = _chessService.GetRoom(room.RoomId); + await _hubContext.Clients.Group(room.RoomId).SendAsync("GameEnd", new + { + winUserId, + room = endRoom + }); + await _hubContext.Clients.Group(ChessGameHub.LobbyGroup).SendAsync("ExitRoomNotice", endRoom); + await _hubContext.Clients.Clients(settledConnectionIds).SendAsync("ExitRoomNotice", endRoom); + foreach (var connectionId in settledConnectionIds) + { + await _hubContext.Groups.RemoveFromGroupAsync(connectionId, room.RoomId); + await _hubContext.Groups.AddToGroupAsync(connectionId, ChessGameHub.LobbyGroup); + } + } + } +} diff --git a/ChessGameHost/appsettings.Development.json b/ChessGameHost/appsettings.Development.json new file mode 100644 index 0000000..8d00523 --- /dev/null +++ b/ChessGameHost/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Error", + "Microsoft.AspNetCore": "Error" + } + } +} diff --git a/ChessGameHost/appsettings.json b/ChessGameHost/appsettings.json new file mode 100644 index 0000000..44d718f --- /dev/null +++ b/ChessGameHost/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Error", + "Microsoft.AspNetCore": "Error" + } + }, + "AllowedHosts": "*" +} diff --git a/ChessGameHost/docker-compose.yaml b/ChessGameHost/docker-compose.yaml new file mode 100644 index 0000000..2bf3faf --- /dev/null +++ b/ChessGameHost/docker-compose.yaml @@ -0,0 +1,8 @@ +name: webapi +services: + 0524chess: + image: 0524chess + container_name: '0524chess' + restart: always + ports: + - '5242:80' \ No newline at end of file diff --git a/ChessGameSrc/ChessGameDomain/ChessGameDomain.csproj b/ChessGameSrc/ChessGameDomain/ChessGameDomain.csproj new file mode 100644 index 0000000..29d54fa --- /dev/null +++ b/ChessGameSrc/ChessGameDomain/ChessGameDomain.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + diff --git a/ChessGameSrc/ChessGameDomain/ChessGameRoom.cs b/ChessGameSrc/ChessGameDomain/ChessGameRoom.cs new file mode 100644 index 0000000..a33c584 --- /dev/null +++ b/ChessGameSrc/ChessGameDomain/ChessGameRoom.cs @@ -0,0 +1,44 @@ +using System.ComponentModel.DataAnnotations.Schema; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; + +namespace ChessGameDomain +{ + [BsonCollection("game_room", ServiceDatabases.Chess)] + [BsonIgnoreExtraElements] + public class ChessGameRoom : MongoBaseEntity + { + [Column(TypeName = "jsonb")] + public List users { get; set; } = new List(); + public string RoomId { get; set; } + + public DateTime CreateTime { get; set; } + + public int gameType { get; set; } + + public string password { get; set; } + + public string createUserId { get; set; } + + public int state { get; set; } = 1; + public long gold { get; set; } = 1000; + + public int robotCount { get; set; } = 0; + + public Dictionary EndGameRequests { get; set; } = new Dictionary(); + + public long LastActiveTime { get; set; } = 0; + + public int TimeoutSeconds { get; set; } = 60; + + public int AfkTimeoutSeconds { get; set; } = 120; + + public string TimeoutLoserUserId { get; set; } = ""; + + public string PendingWinUserId { get; set; } = ""; + + public bool IsGameEnded { get; set; } = false; + } +} diff --git a/ChessGameSrc/ChessGameDomain/RedisChessGameUser.cs b/ChessGameSrc/ChessGameDomain/RedisChessGameUser.cs new file mode 100644 index 0000000..e473d63 --- /dev/null +++ b/ChessGameSrc/ChessGameDomain/RedisChessGameUser.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ChessGameDomain +{ + public class RedisChessGameUser + { + + public string Cid { get; set; } + public string userId { get; set; } + public string userName { get; set; } + + public string userAvatar { get; set; } + + public int type { get; set; } + public bool IsLeave { get; set; } = false; + + public bool IsReady { get; set; } = false; + public long Gold { get; set; } = 0; + + public long DisconnectTime { get; set; } = 0; + + public bool IsAfk { get; set; } = false; + + public long AfkTime { get; set; } = 0; + } +} diff --git a/ChessGameSrc/ChessGameService/ChessGameHub.cs b/ChessGameSrc/ChessGameService/ChessGameHub.cs new file mode 100644 index 0000000..8e8865e --- /dev/null +++ b/ChessGameSrc/ChessGameService/ChessGameHub.cs @@ -0,0 +1,600 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using ChessGameDomain; +using ChessGameService.Param; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.Logging; +using RedisService; +using XAct; + +namespace ChessGameService +{ + public class ChessGameHub : Hub + { + public const string LobbyGroup = "chess_lobby"; + private readonly ILogger _logger; + private readonly IChessGameService _chessService; + private readonly IRedisService _redisService; + + public ChessGameHub(ILogger logger, IChessGameService chessService, IRedisService redisService) + { + _logger = logger; + _chessService = chessService; + _redisService = redisService; + } + + private async Task JoinLobbyAsync(string connectionId) + { + var cid = string.IsNullOrWhiteSpace(connectionId) ? Context.ConnectionId : connectionId; + await Groups.AddToGroupAsync(cid, LobbyGroup); + } + + private async Task LeaveLobbyAsync(string connectionId) + { + var cid = string.IsNullOrWhiteSpace(connectionId) ? Context.ConnectionId : connectionId; + await Groups.RemoveFromGroupAsync(cid, LobbyGroup); + } + + private async Task JoinLobbyBatchAsync(IEnumerable connectionIds) + { + foreach (var connectionId in connectionIds.Distinct()) + { + try + { + await Groups.AddToGroupAsync(connectionId, LobbyGroup); + } + catch (Exception ex) + { + _logger.LogError(ex, "[ChessLobby] 加入大厅组失败 cid={Cid}", connectionId); + } + } + } + + + public override async Task OnConnectedAsync() + { + var cid = Context.ConnectionId; + var reconnectUserId = Context.GetHttpContext()?.Request?.Query["userId"].ToString(); + + var room = !string.IsNullOrWhiteSpace(reconnectUserId) + ? _redisService.GetAllChessRooms()?.FirstOrDefault(r => r.users.Any(u => u.userId == reconnectUserId && (r.state == 1 || r.state == 2 || r.IsGameEnded))) + : _chessService.GetUserRoom(cid); + if (room != null) + { + var user = room.users.FirstOrDefault(c => c.Cid == cid || c.userId == reconnectUserId); + if (user != null) + { + if (!user.IsLeave && user.Cid != cid) + { + await Clients.Caller.SendAsync("GameError", "用户已在其他连接中在线"); + + await base.OnConnectedAsync(); + return; + } + + user.Cid = cid; + user.DisconnectTime = 0; + user.IsLeave = false; + room.robotCount = Math.Clamp(room.robotCount, 0, Math.Max(0, 2 - room.users.Count)); + _redisService.SetChessRoom(room); + + var otherUser = room.users.FirstOrDefault(c => c.Cid != cid); + if (otherUser != null) + { + await Clients.Group(room.RoomId).SendAsync("Reconnect", new + { + userId = user.userId, + userName = user.userName + }); + + } + + + } + +await Clients.Caller.SendAsync("BeginGame", room); + + await Groups.AddToGroupAsync(cid, room.RoomId); + } + else + { + await JoinLobbyAsync(cid); + } + } + + public override async Task OnDisconnectedAsync(Exception? exception) + { + var cid = Context.ConnectionId; + + var room = _chessService.GetUserRoom(cid); + if (room != null) + { + var user = room.users.FirstOrDefault(c => c.Cid == cid); + + if (user != null) + { + if (room.state == 2 && room.users.Count == 2) + { + user.DisconnectTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + user.IsLeave = true; + var timeoutSeconds = room.TimeoutSeconds > 0 ? room.TimeoutSeconds : 60; + user.Cid = string.Empty; + + if (room.users.All(u => u.IsLeave)) + { + var affectedUserIds = room.users.Select(u => u.userId).Distinct().ToList(); + _chessService.ExitRoom(room); + await Task.WhenAll(affectedUserIds.Select(id => _chessService.UpdateUserGameType(id, 0))); +await Clients.Group(LobbyGroup).SendAsync("ExitRoomNotice", room); + } + else + { + _redisService.SetChessRoom(room); + + await Clients.Group(room.RoomId).SendAsync("Disconnect", new + { + userId = user.userId, + disconnectTime = user.DisconnectTime, + timeoutSeconds = timeoutSeconds + }); + } + + } + else + { + var affectedUserIds = room.createUserId == user.userId + ? room.users.Where(u => u != null).Select(u => u.userId).Distinct().ToList() + : new List { user.userId }; + var (_, _, updatedRoom) = _chessService.ExitRoom(room.RoomId, user.userId); + await Task.WhenAll(affectedUserIds.Select(id => _chessService.UpdateUserGameType(id, 0))); + await Groups.RemoveFromGroupAsync(Context.ConnectionId, room.RoomId); + if (updatedRoom != null && updatedRoom.users != null && updatedRoom.users.Count > 0) + { + await Clients.Group(updatedRoom.RoomId).SendAsync("BeginGame", updatedRoom); + } + await Clients.Group(LobbyGroup).SendAsync("ExitRoomNotice", updatedRoom ?? room); + } + } + } + } + + public async Task JoinGame(string gameId, string pwd, string userId) + { + string cid = Context.ConnectionId; + var (success, message, room) = await _chessService.JoinGameAsync(gameId, pwd, userId, cid); + + if (!success) + { + await Clients.Caller.SendAsync("GameError", message); + return; + } + + await _chessService.UpdateUserGameType(userId, 3, room.RoomId); + + await Groups.AddToGroupAsync(cid, room.RoomId); + await LeaveLobbyAsync(cid); + await Clients.Caller.SendAsync("JoinRoom", room); + await Clients.Group(room.RoomId).SendAsync("BeginGame", room); + await Clients.Group(room.RoomId).SendAsync("RoomStateNotice", room); + await Clients.Group(LobbyGroup).SendAsync("JoinRoomNotice", room); + if (room.users.Count == 2 && room.state == 1) + { + var redUser = room.users.FirstOrDefault(u => u.type == 2); + await Clients.Group(room.RoomId).SendAsync("GoldConfigRequired", new + { + targetUserId = redUser?.userId, + room + }); + } + } + + public async Task StartGame(string gameId, string userId) + { + if (!IsCaller(gameId, userId)) return; + var (success, message, room) = _chessService.StartGame(gameId, userId); + if (!success) + { + await Clients.Caller.SendAsync("GameError", message); + return; + } + + var redUser = room.users.FirstOrDefault(u => u.type == 2); + await Clients.Group(room.RoomId).SendAsync("GoldConfigRequired", new + { + targetUserId = redUser?.userId, + room + }); + } + + public async Task GameReady(string gameId, string userId) + { + if (!IsCaller(gameId, userId)) return; + var (success, message, allReady) = _chessService.GameReady(gameId, userId); + + if (!success) + { + await Clients.Caller.SendAsync("GameError", message); + return; + } + + var room = _chessService.GetRoom(gameId); + await Clients.Groups(room.RoomId).SendAsync("ReadyNotice", userId); + + if (allReady) + { + await Clients.Groups(room.RoomId).SendAsync("AllBeginTime", room); + } + } + + public async Task EndGame(string gameId, string winUserId) + { + if (!IsCallerInRoom(gameId)) return; + var settledConnectionIds = GetRoomConnectionIds(gameId); + var (success, message, room) = await _chessService.EndGame(gameId, winUserId); + + if (!success) + { + await Clients.Caller.SendAsync("GameError", message); + return; + } + + await Clients.Group(room.RoomId).SendAsync("GameEnd", new + { + winUserId = winUserId, + room = room + }); + await Clients.Group(LobbyGroup).SendAsync("ExitRoomNotice", room); + await JoinLobbyBatchAsync(settledConnectionIds); + await RemoveConnectionsFromRoomGroupAsync(room.RoomId, settledConnectionIds, "EndGame"); + } + + public async Task RestartGame(string gameId, string userId) + { + if (!IsCaller(gameId, userId)) + { + var room0 = _chessService.GetRoom(gameId); + if (room0 == null || room0.createUserId != userId) + { + await Clients.Caller.SendAsync("GameError", "无权操作"); + return; + } + } + var (success, message, room) = _chessService.RestartGame(gameId, userId); + + if (!success) + { + await Clients.Caller.SendAsync("GameError", message); + return; + } + + await Groups.AddToGroupAsync(Context.ConnectionId, room.RoomId); + await LeaveLobbyAsync(Context.ConnectionId); + await Clients.Caller.SendAsync("RestartGameSuccess", room); + await Clients.Group(LobbyGroup).SendAsync("RestartRoomNotice", room); + } + + public async Task RequestEndGame(string gameId, string userId, string winUserId) + { + if (!IsCaller(gameId, userId)) return; + if (string.IsNullOrEmpty(userId)) + { + await Clients.Caller.SendAsync("GameError", "参数异常"); + return; + } + + var settledConnectionIds = GetRoomConnectionIds(gameId); + var (success, message, room, allConfirmed) = await _chessService.RequestEndGame(gameId, userId, winUserId); + + if (!success) + { + await Clients.Caller.SendAsync("GameError", message); + return; + } + + if (allConfirmed) + { + await Clients.Group(room.RoomId).SendAsync("GameEnd", new + { + winUserId = winUserId, + room = room + }); + await Clients.Group(LobbyGroup).SendAsync("ExitRoomNotice", room); + await JoinLobbyBatchAsync(settledConnectionIds); + await RemoveConnectionsFromRoomGroupAsync(room.RoomId, settledConnectionIds, "RequestEndGame"); + } + else + { + var otherUserId = room.users.FirstOrDefault(u => u.userId != userId)?.userId; + if (!string.IsNullOrEmpty(otherUserId)) + { + await Clients.Group(room.RoomId).SendAsync("OpponentRequestEnd", userId); + } + await Clients.Caller.SendAsync("EndGameRequestSent", message); + } + } + + public async Task Heartbeat(string gameId) + { + var userId = Context.GetHttpContext()?.Request?.Query["userId"].ToString(); + if (string.IsNullOrEmpty(userId)) + { + return; + } + if (!IsCaller(gameId, userId)) return; + + await _chessService.UpdateUserActiveTime(gameId, userId); + } + + public async Task SetPlayerAfk(string gameId, string userId) + { + if (!IsCaller(gameId, userId)) return; + await _chessService.SetPlayerAfk(gameId, userId); + await Clients.Group(gameId).SendAsync("PlayerAfkNotice", new { userId }); + var room = _chessService.GetRoom(gameId); + if (room != null) + { + await Clients.Group(gameId).SendAsync("RoomStateNotice", room); + } + } + + public async Task CancelPlayerAfk(string gameId, string userId) + { + if (!IsCaller(gameId, userId)) return; + await _chessService.CancelPlayerAfk(gameId, userId); + await Clients.Group(gameId).SendAsync("PlayerCancelAfkNotice", new { userId }); + var room = _chessService.GetRoom(gameId); + if (room != null) + { + await Clients.Caller.SendAsync("BeginGame", room); + await Clients.Group(gameId).SendAsync("RoomStateNotice", room); + } + } + + public async Task CheckTimeout(string gameId) + { + if (!IsCallerInRoom(gameId)) return; + var beforeEndRoom = _redisService.GetChessRoom(gameId); + var settledConnectionIds = GetRoomConnectionIds(beforeEndRoom); + var (isTimeout, loserUserId) = await _chessService.CheckRoomTimeout(gameId); + + if (isTimeout) + { + var room = _redisService.GetChessRoom(gameId); + if (room != null && beforeEndRoom != null) + { + await Clients.Group(room.RoomId).SendAsync("GameEnd", new + { + winUserId = beforeEndRoom.users.FirstOrDefault(u => u.userId != loserUserId)?.userId ?? "", + room = room + }); + await Clients.Group(LobbyGroup).SendAsync("ExitRoomNotice", room); + await JoinLobbyBatchAsync(settledConnectionIds); + await RemoveConnectionsFromRoomGroupAsync(room.RoomId, settledConnectionIds, "CheckTimeout"); + } + } + } + + public async Task ExitRoom(string gameId, string userId) + { + if (!IsCaller(gameId, userId)) return; + var beforeExitRoom = _chessService.GetRoom(gameId); + var beforeExitUserIds = beforeExitRoom?.users? + .Where(u => u != null).Select(u => u.userId).Distinct().ToList() + ?? new List { userId }; + var beforeExitConnectionIds = GetRoomConnectionIds(beforeExitRoom); + var (success, message, room) = _chessService.ExitRoom(gameId, userId); + + if (!success) + { + await Clients.Caller.SendAsync("GameError", message); + return; + } + + var affectedUserIds = room.users == null || room.users.Count == 0 + ? beforeExitUserIds + : new List { userId }; + await Task.WhenAll(affectedUserIds.Select(id => _chessService.UpdateUserGameType(id, 0))); + await Groups.RemoveFromGroupAsync(Context.ConnectionId, gameId); + await JoinLobbyAsync(Context.ConnectionId); + + if (room.users == null || room.users.Count == 0) + { + await Clients.Group(LobbyGroup).SendAsync("ExitRoomNotice", room); + } + else + { + await Clients.Group(room.RoomId).SendAsync("ExitRoomSuccess", userId); + await Clients.Group(room.RoomId).SendAsync("BeginGame", room); + await Clients.Group(room.RoomId).SendAsync("RoomStateNotice", room); + await Clients.Group(LobbyGroup).SendAsync("ExitRoomNotice", room); + } + + } + public async Task CreateRoom(CreateRoomParam param) + { + string cid = Context.ConnectionId; + var (success, message, room) = await _chessService.CreateRoomAsync(param, cid); + + if (!success) + { + await Clients.Caller.SendAsync("GameError", message); + return; + } + + await _chessService.UpdateUserGameType(param.userId, 3, room.RoomId); + + await Clients.Caller.SendAsync("BeginGame", room); + await Groups.AddToGroupAsync(cid, room.RoomId); + await LeaveLobbyAsync(cid); + await Clients.Group(LobbyGroup).SendAsync("CreateRoomNotice", room); + + } + + public async Task GoldConfig(string gameId, long gold, string userId) + { + if (!IsCaller(gameId, userId)) return; + var (success, message, room) = _chessService.GoldConfig(gameId, gold, userId); + + if (!success) + { + await Clients.Caller.SendAsync("GameError", message); + return; + } + + await Clients.Groups(room.RoomId).SendAsync("GoldConfigSuccess", room); + await Clients.Group(room.RoomId).SendAsync("GoldConfigRoomNotice", room); + } + + public async Task GetRoomList(int partition = 0) + { + await JoinLobbyAsync(Context.ConnectionId); + var list = _chessService.GetRoomList(partition, 100); + await Clients.Caller.SendAsync("GetRoomList", list); + } + + public async Task GetRoomState(string gameId) + { + var room = string.IsNullOrWhiteSpace(gameId) ? null : _chessService.GetRoom(gameId); + if (room == null || !IsCallerInRoom(gameId)) + { + await Clients.Caller.SendAsync("GameError", "房间不存在或当前连接不在房间中"); + return; + } + + await Clients.Caller.SendAsync("RoomStateNotice", room); + } + + public async Task KickPlayer(string gameId, string targetUserId) + { + var room = string.IsNullOrWhiteSpace(gameId) ? null : _chessService.GetRoom(gameId); + var caller = room?.users?.FirstOrDefault(u => u.Cid == Context.ConnectionId && !u.IsLeave); + if (room == null || caller == null) + { + await Clients.Caller.SendAsync("GameError", "房间不存在或当前连接不在房间中"); + return; + } + if (room.createUserId != caller.userId) + { + await Clients.Caller.SendAsync("GameError", "只有房主可以踢人"); + return; + } + if (room.state == 2) + { + await Clients.Caller.SendAsync("GameError", "游戏进行中不能踢人"); + return; + } + if (string.IsNullOrWhiteSpace(targetUserId) || targetUserId == caller.userId) + { + await Clients.Caller.SendAsync("GameError", "不能踢出自己"); + return; + } + + var target = room.users.FirstOrDefault(u => u.userId == targetUserId); + if (target == null) + { + await Clients.Caller.SendAsync("GameError", "目标玩家不在房间中"); + return; + } + + var targetCid = target.Cid; + var (success, message, updatedRoom) = _chessService.ExitRoom(gameId, targetUserId); + if (!success) + { + await Clients.Caller.SendAsync("GameError", message); + return; + } + + await _chessService.UpdateUserGameType(targetUserId, 0); + if (!string.IsNullOrWhiteSpace(targetCid)) + { + await Clients.Client(targetCid).SendAsync("KickedFromRoom", new { gameId, userId = targetUserId }); + await Groups.RemoveFromGroupAsync(targetCid, gameId); + await JoinLobbyAsync(targetCid); + } + + await Clients.Group(gameId).SendAsync("RoomStateNotice", updatedRoom); + await Clients.Group(gameId).SendAsync("BeginGame", updatedRoom); + await Clients.Group(LobbyGroup).SendAsync("ExitRoomNotice", updatedRoom); + } + + public async Task SyncGameData(string gameId, string data) + { + var room = _redisService.GetChessRoom(gameId); + var otherUser = room?.users?.FirstOrDefault(u => u.Cid != Context.ConnectionId); + if (otherUser != null && !otherUser.IsLeave) + await Clients.Client(otherUser.Cid).SendAsync("SyncGameData", data); + } + + public async Task GameOperation(string gameId, int type, string data) + { + var userId = Context.GetHttpContext()?.Request?.Query["userId"].ToString(); + if (!string.IsNullOrEmpty(userId)) + { + if (!IsCaller(gameId, userId)) return; + await _chessService.UpdateUserActiveTime(gameId, userId); + } + + if (type == 2 && !string.IsNullOrEmpty(userId)) + { + var room = _redisService.GetChessRoom(gameId); + if (room != null && room.state == 2) + { + var winUserId = room.users.FirstOrDefault(u => u.userId != userId)?.userId ?? ""; + await EndGame(gameId, winUserId); + return; + } + } + + await Clients.Group(gameId).SendAsync("GameOperation", new { type, data }); + } + + private bool IsCaller(string gameId, string userId) + { + var room = string.IsNullOrWhiteSpace(gameId) ? null : _chessService.GetRoom(gameId); + return room?.users?.Any(u => u.userId == userId && u.Cid == Context.ConnectionId && !u.IsLeave) == true; + } + + private bool IsCallerInRoom(string gameId) + { + var room = string.IsNullOrWhiteSpace(gameId) ? null : _chessService.GetRoom(gameId); + return room?.users?.Any(u => u.Cid == Context.ConnectionId && !u.IsLeave) == true; + } + + private List GetRoomConnectionIds(string gameId) + { + return GetRoomConnectionIds(_redisService.GetChessRoom(gameId)); + } + + private static List GetRoomConnectionIds(ChessGameRoom? room) + { + return room?.users? + .Where(user => !string.IsNullOrWhiteSpace(user.Cid)) + .Select(user => user.Cid) + .Distinct() + .ToList() ?? new List(); + } + + private async Task RemoveConnectionsFromRoomGroupAsync( + string roomId, IEnumerable connectionIds, string reason) + { + foreach (var connectionId in connectionIds.Distinct()) + { + try + { + await Groups.RemoveFromGroupAsync(connectionId, roomId); + } + catch (Exception ex) + { + _logger.LogError(ex, + "[ChessGroup] 结算退组失败 roomId={RoomId} cid={Cid} reason={Reason}", + roomId, connectionId, reason); + } + } + } + + } +} diff --git a/ChessGameSrc/ChessGameService/ChessGameService.cs b/ChessGameSrc/ChessGameService/ChessGameService.cs new file mode 100644 index 0000000..a58c54d --- /dev/null +++ b/ChessGameSrc/ChessGameService/ChessGameService.cs @@ -0,0 +1,918 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using ChessGameDomain; +using ChessGameService.Param; +using Common.Redis; +using CommonDomain; +using CommonDomain.BaseModel; +using CommonDomain.Enum; +using DotNetCore.CAP; +using Microsoft.Extensions.Logging; +using RedisHelper; +using RedisService; +using UserDomain.Enum; +using UserService; +using UserService.Param; +using UserService.User; + +namespace ChessGameService +{ + public class ChessGameService : IChessGameService + { + private readonly IRedisService _redisService; + private readonly ILogger _logger; + private readonly IDistributedLock _distributedLock; + private readonly IUserService _userService; + private readonly ICapPublisher _capPublisher; + + public ChessGameService(IRedisService redisService, ILogger logger, IDistributedLock distributedLock, IUserService userService, ICapPublisher capPublisher) + { + _redisService = redisService; + _logger = logger; + _distributedLock = distributedLock; + _userService = userService; + _capPublisher = capPublisher; + } + + public async Task<(bool isok, string msg, ChessGameRoom room)> CreateRoomAsync(CreateRoomParam param, string cid) + { + var user = await _userService.GetUser(param.userId); + if (user == null) + return (false, "用户不存在", null); + + var gameConfig = _redisService.GetGameConfig(); + if (gameConfig == null) + return (false, "游戏配置不存在", null); + + return await _distributedLock.TryExecuteAsync( + $"{RedisKey.DistributedLockPrefix}chess:room:{param.roomId}", + () => + { + var room = _redisService.GetChessRoom(param.roomId); + + if (room == null) + { + return Task.FromResult<(bool isok, string msg, ChessGameRoom room)>((false, "房间不存在", null)); + } + + var allRooms = _redisService.GetAllChessRooms(); + if (allRooms != null) + { + foreach (var oldRoom in allRooms) + { + if (oldRoom.RoomId == param.roomId) continue; + var oldUser = oldRoom.users?.FirstOrDefault(u => u.userId == param.userId); + if (oldUser != null) + { + if (oldRoom.createUserId == param.userId) + { + oldRoom.users = new List(); + oldRoom.state = 3; + oldRoom.password = ""; + oldRoom.createUserId = ""; + oldRoom.gold = 0; + oldRoom.gameType = 0; + oldRoom.robotCount = 0; + oldRoom.IsGameEnded = false; + oldRoom.EndGameRequests?.Clear(); + oldRoom.PendingWinUserId = null; + oldRoom.TimeoutLoserUserId = ""; + oldRoom.LastActiveTime = 0; + } + else + { + oldRoom.users.Remove(oldUser); + if (oldRoom.users.Count == 0) + { + oldRoom.state = 3; + oldRoom.password = ""; + oldRoom.createUserId = ""; + oldRoom.gold = 0; + oldRoom.gameType = 0; + oldRoom.robotCount = 0; + oldRoom.IsGameEnded = false; + } + else + { + oldRoom.gold = 0; + } + } + _redisService.SetChessRoom(oldRoom); + } + } + } + + if ((room.state == 3 && room.users.Count == 0) || room.state == 0) + { + bool isCreareRoom = false; + if (gameConfig.ChessConfig.CreateRoomLimit.Any(c=>c==3)) + isCreareRoom = true; + if (gameConfig.ChessConfig.CreateRoomLimit.Any(c => c == 1) && user.Assets.VipLevel > 0) + { + var vipLevels = gameConfig.ChessConfig.CreateRoomVipLevels ?? new List(); + if (vipLevels.Count == 0 || vipLevels.Contains(user.Assets.VipLevel)) + isCreareRoom = true; + } + if (gameConfig.ChessConfig.CreateRoomLimit.Any(c => c == 2) && user.UserType==2) + isCreareRoom = true; + if (!isCreareRoom) + { + var roles = new List(); + if (gameConfig.ChessConfig.CreateRoomLimit.Any(c => c == 1)) roles.Add("VIP"); + if (gameConfig.ChessConfig.CreateRoomLimit.Any(c => c == 2)) roles.Add("代理"); + var msg = roles.Count > 0 ? $"只有{string.Join("/", roles)}才能配置密码" : "没有权限配置密码"; + return Task.FromResult<(bool isok, string msg, ChessGameRoom room)>((false, msg, null)); + } + room.users = new List() { new RedisChessGameUser + { + Cid = cid, + userId = param.userId, + userName = user.BaseInfo.UserName, + userAvatar = user.BaseInfo.AvatarUrl, + Gold = user.Assets.Gold, + type = param.gameType, + IsLeave = false, + IsReady = false + }}; + room.gameType = param.gameType; + room.password = param.password; + room.createUserId = param.userId; + room.gold = param.gold; + room.state = 1; + room.robotCount = 0; + room.IsGameEnded = false; + } + else if (room.users.Any(c => c.userId == param.userId)) + { + var existing = room.users.First(c => c.userId == param.userId); + existing.Cid = cid; + existing.IsLeave = false; + existing.DisconnectTime = 0; + room.robotCount = Math.Clamp(room.robotCount, 0, Math.Max(0, 2 - room.users.Count)); + _redisService.SetChessRoom(room); + return Task.FromResult<(bool isok, string msg, ChessGameRoom room)>((true, "", room)); + } + else if (room.state == 3) + return Task.FromResult<(bool isok, string msg, ChessGameRoom room)>((false, "上一局玩家尚未退出", room)); + else if (room.users.Count + room.robotCount >= 2 || room.state == 2) + return Task.FromResult<(bool isok, string msg, ChessGameRoom room)>((false, "当前房间已有玩家", room)); + else + { + var firstPlayerType = room.gameType; + var secondPlayerType = firstPlayerType == 1 ? 2 : 1; + room.users.Add(new RedisChessGameUser + { + Cid = cid, + userId = param.userId, + userName = user.BaseInfo.UserName, + userAvatar = user.BaseInfo.AvatarUrl, + Gold = user.Assets.Gold, + type = secondPlayerType, + IsLeave = false, + IsReady = false + }); + room.state = 1; + } + + _redisService.SetChessRoom(room); + + + return Task.FromResult<(bool isok, string msg, ChessGameRoom room)>((true, "", room)); + }, + expiry: 10 + ); + } + + public async Task<(bool success, string message, ChessGameRoom room)> JoinGameAsync(string gameId, string pwd, string userId, string cid) + { + var user = await _userService.GetUser(userId); + if (user == null) + return (false, "用户不存在", null); + return await _distributedLock.TryExecuteAsync( + $"{RedisKey.DistributedLockPrefix}chess:room:{gameId}", + () => + { + var room = _redisService.GetChessRoom(gameId); + + if (room == null || room.state == 3) + { + return Task.FromResult((false, "房间不存在", (ChessGameRoom)null)); + } + + if (string.IsNullOrEmpty(room.password)) + { + return Task.FromResult((false, "房间未设置密码,无法进入", (ChessGameRoom)null)); + } + + if (room.password != pwd) + { + return Task.FromResult((false, "密码错误", (ChessGameRoom)null)); + } + + if (room.users.Any(c => c.userId == userId)) + { + var existing = room.users.First(c => c.userId == userId); + existing.Cid = cid; + existing.IsLeave = false; + existing.DisconnectTime = 0; + room.robotCount = Math.Clamp(room.robotCount, 0, Math.Max(0, 2 - room.users.Count)); + _redisService.SetChessRoom(room); + return Task.FromResult((true, "", room)); + } + + if (room.state == 3 && room.IsGameEnded && room.users.Count < 2) + { + var secondPlayerType = room.gameType == 1 ? 2 : 1; + room.users.Add(new RedisChessGameUser + { + Cid = cid, + userId = userId, + Gold = user.Assets.Gold, + userName = user.BaseInfo.UserName, + userAvatar = user.BaseInfo.AvatarUrl, + type = secondPlayerType, + IsLeave = false, + IsReady = false + }); + room.robotCount = 0; + room.state = 1; + room.IsGameEnded = false; + room.gold = 0; + _redisService.SetChessRoom(room); + return Task.FromResult((true, "", room)); + } + + if (room.users.Count + room.robotCount >= 2) + { + return Task.FromResult((false, "房间已满", (ChessGameRoom)null)); + } + + room.users.Add(new RedisChessGameUser + { + Cid = cid, + userId = userId, + Gold = user.Assets.Gold, + userName = user.BaseInfo.UserName, + userAvatar = user.BaseInfo.AvatarUrl, + type = room.gameType == 1 ? 2 : 1, + IsLeave = false, + IsReady = false + }); + room.robotCount = 0; + + _redisService.SetChessRoom(room); + + + return Task.FromResult((true, "", room)); + }, + expiry: 10 + ); + } + + public List GetRoomList(int partition, int maxRooms = 100) + { + var existingRooms = _redisService.GetAllChessRooms(); + if (existingRooms == null || existingRooms.Count == 0) + return new List(); + + return existingRooms + .Where(c => c != null + && (partition <= 0 || GetChessRoomPartition(c.RoomId) == partition) + && !(c.state == 1 + && string.IsNullOrWhiteSpace(c.createUserId) + && (c.users == null || c.users.Count == 0))) + .OrderBy(c => c.RoomId) + .Take(maxRooms) + .ToList(); + } + + private static int GetChessRoomPartition(string roomId) + { + if (string.IsNullOrWhiteSpace(roomId) || roomId.Length < 4) + return 0; + + var partitionText = roomId.Substring(1, roomId.Length - 3); + return int.TryParse(partitionText, out var partition) ? partition : 0; + } + + public (bool success, string message, ChessGameRoom room) StartGame(string gameId, string userId) + { + var room = _redisService.GetChessRoom(gameId); + if (room == null || room.state == 3) + return (false, "房间不存在", null); + if (room.state != 1) + return (false, "游戏已开始", null); + if (room.createUserId != userId) + return (false, "只有房主才能开始游戏", null); + if (room.users.Count < 2) + return (false, "人数不足,无法开始", null); + return (true, "", room); + } + + public (bool success, string message, bool allReady) GameReady(string gameId, string userId) + { + if (string.IsNullOrWhiteSpace(gameId) || string.IsNullOrWhiteSpace(userId)) + return (false, "房间或玩家参数不能为空", false); + + return _distributedLock.TryExecute( + $"{RedisKey.DistributedLockPrefix}chess:room:{gameId}", + () => + { + var room = _redisService.GetChessRoom(gameId); + if (room == null || room.state == 3) + return (false, "房间不存在", false); + + var user = room.users.FirstOrDefault(c => c.userId == userId); + if (user == null) + return (false, "玩家不存在", false); + if (room.gold == 0) + return (false, "未设置金币", false); + + user.IsReady = true; + var allReady = room.users.Count >= 2 && room.users.All(c => c.IsReady); + if (allReady) + room.state = 2; + _redisService.SetChessRoom(room); + + return (true, "", allReady); + }, + expiry: 10, + retry: true, + retryDelay: 20); + } + + + public async Task<(bool success, string message, ChessGameRoom room)> EndGame(string gameId, string winUserId) + { + return await _distributedLock.TryExecuteAsync( + $"{RedisKey.DistributedLockPrefix}chess:room:{gameId}", + async () => + { + var room = _redisService.GetChessRoom(gameId); + if (room == null) + return (false, "房间不存在", null); + if (room.state != 2 || room.IsGameEnded) + return (true, "游戏已结束", room); + if (!string.IsNullOrWhiteSpace(winUserId) && !room.users.Any(u => u.userId == winUserId)) + return (false, "胜者不在房间中", (ChessGameRoom)null); + + room.state = 3; + room.IsGameEnded = true; + _redisService.SetChessRoom(room); + if (!string.IsNullOrWhiteSpace(winUserId)) + { + var loser = room.users.FirstOrDefault(u => u.userId != winUserId); + var winner = room.users.FirstOrDefault(u => u.userId == winUserId); + var winnerName = winner?.userName ?? ""; + var loserName = loser?.userName ?? ""; + var loserId = loser?.userId ?? ""; + + var winnerEntity = winner != null ? await _userService.GetUser(winner.userId) : null; + var loserEntity = loser != null ? await _userService.GetUser(loser.userId) : null; + var realLoserGold = loserEntity?.Assets.Gold ?? 0; + var actualBet = Math.Min(room.gold, realLoserGold); + + if (actualBet > 0) + { + if (loserEntity != null) + { + var deductRemark = $"房间号({room.RoomId}) {winnerName}({winner?.userId})赢得对局 {loserName}({loserId})输 金额{actualBet}"; + var deductResult = await _userService.UpdateAssets(new UserAssetParam() + { + ChangeType = UserAssetChangeTypeEnum.减少, + Gold = actualBet, + TotalRechargeGoldDelta = -actualBet, + Remark = deductRemark, + Source = RewardSource.象棋, + UserId = loserEntity.Id, + RoomInfo = room.RoomId, + OtherUserId = winUserId + }); + if (!deductResult.isok) + { + room.state = 2; + room.IsGameEnded = false; + _redisService.SetChessRoom(room); + return (false, "结算失败:" + deductResult.msg, room); + } + loser.Gold = Math.Max(0, realLoserGold - actualBet); + } + + if (winnerEntity != null) + { + var winRemark = $"房间号({room.RoomId}) {winnerName}({winner?.userId})赢得对局 {loserName}({loserId})输 金额{actualBet}"; + var winResult = await _userService.UpdateAssets(new UserAssetParam() + { + ChangeType = UserAssetChangeTypeEnum.增加, + Gold = actualBet, + TotalRechargeGoldDelta = actualBet, + Remark = winRemark, + Source = RewardSource.象棋, + UserId = winnerEntity.Id, + RoomInfo = room.RoomId, + OtherUserId = loserId + }); + if (!winResult.isok) + { + if (loserEntity != null) + { + await _userService.UpdateAssets(new UserAssetParam() + { + ChangeType = UserAssetChangeTypeEnum.增加, + Gold = actualBet, + TotalRechargeGoldDelta = actualBet, + Remark = $"房间号({room.RoomId}) 结算异常回退 {winnerName}({winner?.userId}) 金额{actualBet}", + Source = RewardSource.象棋, + UserId = loserEntity.Id, + RoomInfo = room.RoomId, + OtherUserId = winUserId + }); + } + } + winner.Gold = winnerEntity.Assets.Gold + actualBet; + } + + var newWinnerEntity = winnerEntity != null ? await _userService.GetUser(winnerEntity.Id) : null; + var newLoserEntity = loserEntity != null ? await _userService.GetUser(loserEntity.Id) : null; + + if (winnerEntity != null) + { + var newWinnerGold = newWinnerEntity?.Assets.Gold ?? winnerEntity.Assets.Gold; + _capPublisher.Publish("BackgroundOperation.NotifyUser", new BackgroundOperationNotifyMessage + { + UserId = winnerEntity.Id, + CurrencyType = 1, + ChangeType = 1, + Amount = actualBet, + NewGold = newWinnerGold, + Source = "象棋对局胜利", + Remark = $"房间号({room.RoomId})赢得{actualBet}金币" + }); + } + + if (loserEntity != null) + { + var newLoserGold = newLoserEntity?.Assets.Gold ?? loser.Gold; + _capPublisher.Publish("BackgroundOperation.NotifyUser", new BackgroundOperationNotifyMessage + { + UserId = loserEntity.Id, + CurrencyType = 1, + ChangeType = 2, + Amount = actualBet, + NewGold = newLoserGold, + Source = "象棋对局失败", + Remark = $"房间号({room.RoomId})输掉{actualBet}金币" + }); + } + } + } + + var userIds = room.users?.Select(u => u.userId).Where(id => !string.IsNullOrWhiteSpace(id)).ToList() + ?? new List(); + room.gold = 0; + room.gameType = 0; + room.robotCount = 0; + room.EndGameRequests?.Clear(); + room.PendingWinUserId = null; + room.TimeoutLoserUserId = ""; + room.LastActiveTime = 0; + room.users.Clear(); + _redisService.SetChessRoom(room); + + foreach (var userId in userIds) + { + try + { + await UpdateUserGameType(userId, 0); + } + catch (Exception ex) + { + _logger.LogError(ex, "[象棋] EndGame 清除游戏状态失败 userId={UserId}", userId); + } + } + + return (true, "", room); + }, + expiry: 30, + retry: false); + } + + public (bool success, string message, ChessGameRoom room) RestartGame(string gameId, string userId) + { + var room = _redisService.GetChessRoom(gameId); + if (room == null) + { + return (false, "房间不存在", null); + } + + if (room.state == 3 && room.IsGameEnded) + { + room.state = 1; + room.IsGameEnded = false; + room.gold = 0; + room.robotCount = 0; + room.EndGameRequests?.Clear(); + room.PendingWinUserId = null; + room.TimeoutLoserUserId = ""; + room.LastActiveTime = 0; + if (room.users == null) room.users = new List(); + + var existingUser = room.users.FirstOrDefault(u => u.userId == userId); + if (existingUser == null) + { + room.users.Add(new RedisChessGameUser + { + userId = userId, + userName = "", + type = room.gameType, + IsLeave = false, + IsReady = false + }); + } + else + { + existingUser.IsReady = false; + existingUser.IsLeave = false; + existingUser.DisconnectTime = 0; + } + + _redisService.SetChessRoom(room); + return (true, "", room); + } + + if (!room.IsGameEnded) + { + return (false, "对局尚未结束,无法重新开始", null); + } + + var user = room.users.FirstOrDefault(u => u.userId == userId); + if (user == null) + { + return (false, "对局已结束,房间已释放,请重新创建房间", null); + } + + room.state = 1; + room.IsGameEnded = false; + room.gold = 0; + room.EndGameRequests?.Clear(); + room.PendingWinUserId = null; + room.TimeoutLoserUserId = ""; + room.LastActiveTime = 0; + + foreach (var u in room.users) + { + u.IsReady = false; + } + + _redisService.SetChessRoom(room); + + return (true, "", room); + } + + public async Task<(bool success, string message, ChessGameRoom room, bool allConfirmed)> RequestEndGame(string gameId, string userId, string winUserId) + { + var room = _redisService.GetChessRoom(gameId); + if (room == null || room.state == 3) + { + return (false, "房间不存在", null, false); + } + + if (room.state != 2) + { + return (false, "游戏未开始", null, false); + } + + var user = room.users.FirstOrDefault(u => u.userId == userId); + if (user == null) + { + return (false, "参数异常", null, false); + } + if (!string.IsNullOrWhiteSpace(winUserId) && !room.users.Any(u => u.userId == winUserId)) + return (false, "胜者不在房间中", null, false); + + if (room.EndGameRequests == null) + room.EndGameRequests = new Dictionary(); + + room.EndGameRequests[userId] = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + + if (!string.IsNullOrEmpty(winUserId) && string.IsNullOrEmpty(room.PendingWinUserId)) + { + room.PendingWinUserId = winUserId; + } + + _redisService.SetChessRoom(room); + + var roomUserIds = room.users.Select(u => u.userId).ToHashSet(); + var confirmedCount = room.EndGameRequests.Keys.Count(roomUserIds.Contains); + + if (confirmedCount >= room.users.Count && room.users.Count >= 2) + { + string finalWinUserId = room.PendingWinUserId ?? ""; + + room.EndGameRequests.Clear(); + room.PendingWinUserId = null; + _redisService.SetChessRoom(room); + + var result = await EndGame(gameId, finalWinUserId); + return (result.success, result.message, result.room, true); + } + + return (true, "等待对方确认结束", room, false); + } + + public async Task<(bool isTimeout, string loserUserId)> CheckRoomTimeout(string gameId) + { + var room = _redisService.GetChessRoom(gameId); + if (room == null || room.state != 2) + { + return (false, ""); + } + + var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + var timeout = room.TimeoutSeconds > 0 ? room.TimeoutSeconds : 60; + + foreach (var user in room.users) + { + if (user.IsLeave && user.DisconnectTime > 0 && (now - user.DisconnectTime) > timeout) + { + var winUserId = room.users.FirstOrDefault(u => u.userId != user.userId)?.userId ?? ""; + + + + room.TimeoutLoserUserId = user.userId; + _redisService.SetChessRoom(room); + + await EndGame(gameId, winUserId); + + return (true, user.userId); + } + } + + return (false, ""); + } + + public async Task<(bool isTimeout, string loserUserId)> CheckRoomAfkTimeout(string gameId) + { + var room = _redisService.GetChessRoom(gameId); + if (room == null || room.state != 2 || room.users.Count < 2) + { + return (false, ""); + } + + var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + var afkUsers = room.users.Where(u => u.IsAfk && u.AfkTime > 0).OrderBy(u => u.AfkTime).ToList(); + + if (afkUsers.Count == 2) + { + var firstAfkUser = afkUsers[0]; + var winUserId = room.users.FirstOrDefault(u => u.userId != firstAfkUser.userId)?.userId ?? ""; + await EndGame(gameId, winUserId); + return (true, firstAfkUser.userId); + } + + if (afkUsers.Count == 1) + { + var afkUser = afkUsers[0]; + var timeout = room.AfkTimeoutSeconds > 0 ? room.AfkTimeoutSeconds : 120; + if ((now - afkUser.AfkTime) > timeout) + { + var winUserId = room.users.FirstOrDefault(u => u.userId != afkUser.userId)?.userId ?? ""; + await EndGame(gameId, winUserId); + return (true, afkUser.userId); + } + } + + return (false, ""); + } + + public async Task UpdateUserActiveTime(string gameId, string userId) + { + var room = _redisService.GetChessRoom(gameId); + if (room == null || room.state != 2) + { + return; + } + + var user = room.users.FirstOrDefault(u => u.userId == userId); + if (user == null) + { + return; + } + + room.LastActiveTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + _redisService.SetChessRoom(room); + } + + public async Task SetPlayerAfk(string gameId, string userId) + { + var room = string.IsNullOrWhiteSpace(gameId) ? null : _redisService.GetChessRoom(gameId); + var user = room?.users?.FirstOrDefault(u => u.userId == userId); + if (user == null) + { + return; + } + user.IsAfk = true; + user.AfkTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + _redisService.SetChessRoom(room); + await Task.CompletedTask; + } + + public async Task CancelPlayerAfk(string gameId, string userId) + { + var room = string.IsNullOrWhiteSpace(gameId) ? null : _redisService.GetChessRoom(gameId); + var user = room?.users?.FirstOrDefault(u => u.userId == userId); + if (user == null) + { + return; + } + user.IsAfk = false; + user.AfkTime = 0; + _redisService.SetChessRoom(room); + await Task.CompletedTask; + } + + public bool ExitRoom(ChessGameRoom room) + { + + room.users = new List(); + room.state = 3; + room.password = ""; + room.createUserId = ""; + room.gold = 0; + room.gameType = 0; + room.robotCount = 0; + room.IsGameEnded = false; + room.EndGameRequests?.Clear(); + room.PendingWinUserId = null; + room.TimeoutLoserUserId = ""; + room.LastActiveTime = 0; + _redisService.SetChessRoom(room); + return true; + } + + public (bool isok, string msg, ChessGameRoom room) ExitRoom(string gameId, string userId) + { + var room = _redisService.GetChessRoom(gameId); + if (room == null) + { + return (false, "房间不存在", null); + } + if (room.state == 3 && (room.users == null || room.users.Count == 0)) + { + ExitRoom(room); + return (true, "房间已清空", room); + } + + var user = room.users.FirstOrDefault(c => c.userId == userId); + if (user == null) + { + return (false, "玩家不存在", null); + } + + if (room.state == 2) + { + user.IsLeave = true; + user.DisconnectTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + user.Cid = string.Empty; + if (room.users.All(u => u.IsLeave)) + { + ExitRoom(room); + return (true, "所有玩家已退出,房间已重置", room); + } + + _redisService.SetChessRoom(room); + return (true, "玩家已退出,等待其他玩家", room); + } + + if (room.createUserId == userId) + { + ExitRoom(room); + return (true, "房主退出,房间已清空", room); + } + + room.users.Remove(user); + + if (room.users.Count == 0 || (room.state == 3 && room.users.Count <= 1)) + { + ExitRoom(room); + return (true, "房间已清空", room); + } + + room.gold = 0; + room.robotCount = Math.Clamp(room.robotCount, 0, Math.Max(0, 2 - room.users.Count)); + _redisService.SetChessRoom(room); + + return (true, "", room); + } + + public (bool isok, string msg, ChessGameRoom room) AdminKickPlayer(string gameId, string userId) + { + var room = _redisService.GetChessRoom(gameId); + if (room == null) + return (false, "房间不存在", null); + if (room.state == 2) + return (false, "游戏进行中不能直接踢人,请先结束对局", room); + + var user = room.users?.FirstOrDefault(c => c.userId == userId); + if (user == null) + return (false, "玩家不存在", room); + + room.users.Remove(user); + if (room.users.Count == 0) + { + ExitRoom(room); + return (true, "玩家已踢出,房间已重置", room); + } + + if (room.createUserId == userId) + room.createUserId = room.users[0].userId; + room.state = 1; + room.gold = 0; + room.IsGameEnded = false; + room.EndGameRequests?.Clear(); + room.PendingWinUserId = null; + room.TimeoutLoserUserId = string.Empty; + room.LastActiveTime = 0; + room.robotCount = Math.Clamp(room.robotCount, 0, Math.Max(0, 2 - room.users.Count)); + foreach (var remainingUser in room.users) + remainingUser.IsReady = false; + _redisService.SetChessRoom(room); + return (true, "玩家已踢出", room); + } + + public async Task UpdateUserGameType(string userId, int gameType, string roomNumber = "") + { + try + { + var user = await _userService.GetUser(userId); + if (user != null) + { + user.Static.CurrentGameType = gameType; + user.Static.RoomNumber = gameType > 0 ? (roomNumber ?? string.Empty) : string.Empty; + await _userService.UpdateUser(user); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "更新用户当前游戏类型失败 userId={UserId} gameType={GameType} roomNumber={RoomNumber}", userId, gameType, roomNumber); + } + } + + public (bool success, string message, ChessGameRoom room) GoldConfig(string gameId, long gold, string userId) + { + var room = _redisService.GetChessRoom(gameId); + if (room == null || room.state == 3) + { + return (false, "房间不存在", null); + } + var gameconfig= _redisService.GetGameConfig(); + if (gameconfig==null) + { + return (false, "游戏配置不存在", null); + } + if(gold c.type == 2 && c.userId == userId)) + return (false, "只有红方才可以配置金币", null); + + + + var redPlayer = room.users.FirstOrDefault(c => c.type == 2); + if (redPlayer != null && redPlayer.Gold < gold) + return (false, "金币不足", null); + room.gold = gold; + _redisService.SetChessRoom(room); + + + + return (true, "", room); + } + + public ChessGameRoom GetUserRoom(string cid) + { + var rooms = _redisService.GetAllChessRooms(); + if (rooms == null) return null; + + return rooms.FirstOrDefault(c => c.users.Any(d => d.Cid == cid && (c.state == 1 || c.state == 2))); + } + + + public ChessGameRoom GetRoom(string gameId) + { + return _redisService.GetChessRoom(gameId); + } + + public List GetAllPlayingRooms() + { + var allRooms = _redisService.GetAllChessRooms(); + if (allRooms == null) + return new List(); + + return allRooms.Where(r => r != null && r.state == 2).ToList(); + } + } +} diff --git a/ChessGameSrc/ChessGameService/ChessGameService.csproj b/ChessGameSrc/ChessGameService/ChessGameService.csproj new file mode 100644 index 0000000..77f4d41 --- /dev/null +++ b/ChessGameSrc/ChessGameService/ChessGameService.csproj @@ -0,0 +1,20 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + diff --git a/ChessGameSrc/ChessGameService/IChessGameService.cs b/ChessGameSrc/ChessGameService/IChessGameService.cs new file mode 100644 index 0000000..e723fbd --- /dev/null +++ b/ChessGameSrc/ChessGameService/IChessGameService.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ChessGameDomain; +using ChessGameService.Param; + +namespace ChessGameService +{ + public interface IChessGameService + { + Task<(bool isok, string msg, ChessGameRoom room)> CreateRoomAsync(CreateRoomParam param, string cid); + + Task<(bool success, string message, ChessGameRoom room)> JoinGameAsync(string gameId, string pwd, string userId, string cid); + + List GetRoomList(int partition, int maxRooms = 100); + + (bool success, string message, ChessGameRoom room) StartGame(string gameId, string userId); + + (bool success, string message, bool allReady) GameReady(string gameId, string userId); + + + Task<(bool success, string message, ChessGameRoom room)> EndGame(string gameId, string winUserId); + + (bool success, string message, ChessGameRoom room) RestartGame(string gameId, string userId); + + Task<(bool success, string message, ChessGameRoom room, bool allConfirmed)> RequestEndGame(string gameId, string userId, string endRequestId); + + Task<(bool isTimeout, string loserUserId)> CheckRoomTimeout(string gameId); + + Task<(bool isTimeout, string loserUserId)> CheckRoomAfkTimeout(string gameId); + + Task UpdateUserActiveTime(string gameId, string userId); + + Task SetPlayerAfk(string gameId, string userId); + + Task CancelPlayerAfk(string gameId, string userId); + bool ExitRoom(ChessGameRoom room); + + (bool isok, string msg, ChessGameRoom room) ExitRoom(string gameId, string userId); + + (bool isok, string msg, ChessGameRoom room) AdminKickPlayer(string gameId, string userId); + + (bool success, string message, ChessGameRoom room) GoldConfig(string gameId, long gold, string userId); + + ChessGameRoom GetUserRoom(string cid); + + ChessGameRoom GetRoom(string gameId); + + List GetAllPlayingRooms(); + + Task UpdateUserGameType(string userId, int gameType, string roomNumber = ""); + } +} diff --git a/ChessGameSrc/ChessGameService/Param/CreateRoomParam.cs b/ChessGameSrc/ChessGameService/Param/CreateRoomParam.cs new file mode 100644 index 0000000..4df8ea2 --- /dev/null +++ b/ChessGameSrc/ChessGameService/Param/CreateRoomParam.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ChessGameService.Param +{ + public class CreateRoomParam + { + + public string roomId { get; set; } + + public string userId { get; set; } + /// + + + public int gameType { get; set; } + + public string password { get; set; } + + public long gold { get; set; } = 0; + } +} diff --git a/ChessGameSrc/ChessGameService/Subscribers/AdminKickChessPlayerSubscriber.cs b/ChessGameSrc/ChessGameService/Subscribers/AdminKickChessPlayerSubscriber.cs new file mode 100644 index 0000000..eda1940 --- /dev/null +++ b/ChessGameSrc/ChessGameService/Subscribers/AdminKickChessPlayerSubscriber.cs @@ -0,0 +1,66 @@ +using CommonDomain; +using DotNetCore.CAP; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.Logging; + +namespace ChessGameService.Subscribers; + +public sealed class AdminKickChessPlayerSubscriber : ICapSubscribe +{ + private readonly IChessGameService _chessService; + private readonly IHubContext _hubContext; + + public AdminKickChessPlayerSubscriber( + IChessGameService chessService, + IHubContext hubContext) + { + _chessService = chessService; + _hubContext = hubContext; + } + + [CapSubscribe(TopicKeys.后台踢出象棋玩家)] + public async Task Handle(AdminKickChessPlayerMessage message) + { + if (string.IsNullOrWhiteSpace(message.RoomId) || string.IsNullOrWhiteSpace(message.UserId)) + { + return; + } + + var room = _chessService.GetRoom(message.RoomId); + var target = room?.users?.FirstOrDefault(u => u.userId == message.UserId); + if (room == null || target == null) + { + return; + } + + if (room.state == 2) + { + return; + } + + var targetCid = target.Cid; + var (success, resultMessage, updatedRoom) = _chessService.AdminKickPlayer(message.RoomId, message.UserId); + if (!success || updatedRoom == null) + { + return; + } + + await _chessService.UpdateUserGameType(message.UserId, 0); + if (!string.IsNullOrWhiteSpace(targetCid)) + { + await _hubContext.Clients.Client(targetCid).SendAsync("KickedFromRoom", new + { + gameId = message.RoomId, + userId = message.UserId, + reason = string.IsNullOrWhiteSpace(message.Reason) ? "被管理员移出房间" : message.Reason, + source = "admin" + }); + await _hubContext.Groups.RemoveFromGroupAsync(targetCid, message.RoomId); + await _hubContext.Groups.AddToGroupAsync(targetCid, ChessGameHub.LobbyGroup); + } + + await _hubContext.Clients.Group(message.RoomId).SendAsync("RoomStateNotice", updatedRoom); + await _hubContext.Clients.Group(message.RoomId).SendAsync("BeginGame", updatedRoom); + await _hubContext.Clients.Group(ChessGameHub.LobbyGroup).SendAsync("ExitRoomNotice", updatedRoom); + } +} diff --git a/ChessGameSrc/ChessGameService/Subscribers/ChessLoginSubscriber.cs b/ChessGameSrc/ChessGameService/Subscribers/ChessLoginSubscriber.cs new file mode 100644 index 0000000..cc75ee8 --- /dev/null +++ b/ChessGameSrc/ChessGameService/Subscribers/ChessLoginSubscriber.cs @@ -0,0 +1,83 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using ChessGameService; +using CommonDomain; +using DotNetCore.CAP; +using Microsoft.Extensions.Logging; +using RedisService; + +namespace ChessGameService.Subscribers +{ + public class ChessLoginSubscriber : ICapSubscribe + { + private readonly IChessGameService _chessService; + private readonly IRedisService _redisService; + private readonly ICapPublisher _capPublisher; + private readonly ILogger _logger; + + public ChessLoginSubscriber( + IChessGameService chessService, + IRedisService redisService, + ICapPublisher capPublisher, + ILogger logger) + { + _chessService = chessService; + _redisService = redisService; + _capPublisher = capPublisher; + _logger = logger; + } + + [CapSubscribe(TopicKeys.登录绑定)] + public async Task HandleLoginBind(LoginBindMessage msg) + { + if (string.IsNullOrWhiteSpace(msg.UserId)) + return; + + var rooms = _redisService.GetAllChessRooms(); + if (rooms == null) + return; + + foreach (var room in rooms) + { + if (room == null || room.state != 2 || room.IsGameEnded) + continue; + + var player = room.users?.FirstOrDefault(u => u.userId == msg.UserId); + if (player == null) + continue; + + var winnerUserId = room.users.FirstOrDefault(u => u.userId != msg.UserId)?.userId ?? ""; + if (string.IsNullOrWhiteSpace(winnerUserId)) + { + continue; + } + + try + { + await _chessService.EndGame(room.RoomId, winnerUserId); + await _capPublisher.PublishAsync(TopicKeys.登录结果通知, new LoginBindResultMessage + { + UserId = msg.UserId, + RoomId = room.RoomId, + OperationId = msg.OperationId, + Success = true + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "[象棋] 登录结算失败 userId={UserId} roomId={RoomId}", msg.UserId, room.RoomId); + await _capPublisher.PublishAsync(TopicKeys.登录结果通知, new LoginBindResultMessage + { + UserId = msg.UserId, + RoomId = room.RoomId, + OperationId = msg.OperationId, + Success = false, + Error = ex.Message + }); + } + return; + } + } + } +} diff --git a/CommonDomain/ActivityConfig.cs b/CommonDomain/ActivityConfig.cs new file mode 100644 index 0000000..83ab418 --- /dev/null +++ b/CommonDomain/ActivityConfig.cs @@ -0,0 +1,163 @@ +using System.Collections.Generic; +using Common.Utils; +using CommonDomain.BaseModel; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; + +namespace CommonDomain +{ + [BsonCollection("activity_config", "data_0524")] + [BsonIgnoreExtraElements] + public class ActivityConfig : MongoBaseEntity + { + public BattleOrderConfig BattleOrderConfig { get; set; } = new BattleOrderConfig(); + + public ReliefConfig ReliefConfig { get; set; } = new ReliefConfig(); + + public List SignConfigs { get; set; } = new List(); + + public List GoldShopConfigs { get; set; } = new List(); + + public List DiamondShopConfigs { get; set; } = new List(); + + public RegisterConfig RegisterConfig { get; set; } = new RegisterConfig(); + + public FishingReturnConfig FishingReturnConfig { get; set; } = new FishingReturnConfig(); + + + public LotteryActivityConfig LotteryActivityConfig { get; set; } = new LotteryActivityConfig(); + + public RankingRewardConfig RankingRewardConfig { get; set; } = new RankingRewardConfig(); + + public bool AutoStopExpired(long now) + { + var lottery = LotteryActivityConfig; + if (lottery != null && lottery.IsOpen && lottery.EndTime > 0 && now >= lottery.EndTime) + { + lottery.IsOpen = false; + return true; + } + return false; + } + } + + public class RankingRewardConfig + { + public bool IsEnabled { get; set; } + public bool IsMaintaining { get; set; } + public string MaintainingMessage { get; set; } = "当前排行榜正在维护中,请稍后再试"; + public List Groups { get; set; } = new(); + } + + public class RankingRewardGroup + { + public int RankingType { get; set; } + public string Name { get; set; } = ""; + public List Rewards { get; set; } = new(); + } + + public class RankingRewardItem + { + public int RankMin { get; set; } + public int RankMax { get; set; } + public long Gold { get; set; } + public int Diamond { get; set; } + public List Items { get; set; } = new(); + } +} + +namespace CommonDomain.BaseModel +{ + [BsonIgnoreExtraElements] + public class SignConfig + { + public int Order { get; set; } = 0; + public long Gold { get; set; } = 0; + public string Name { get; set; } = string.Empty; + public string Icon { get; set; } = string.Empty; + public double Probability { get; set; } = 0; + } + + [BsonIgnoreExtraElements] + public class ReliefConfig + { + public bool IsOpen { get; set; } = true; + public long Gold { get; set; } = 10000; + public int Count { get; set; } = 3; + public int Limit { get; set; } = 10000; + } + + [BsonIgnoreExtraElements] + public class GoldShopConfig + { + public string Number { get; set; } = string.Empty; + public string Name { get; set; } = string.Empty; + public string Icon { get; set; } = string.Empty; + public long Gold { get; set; } = 0; + public int Diamond { get; set; } = 0; + public int DealerDiamond { get; set; } = 0; + public bool IsFirst { get; set; } = false; + } + + [BsonIgnoreExtraElements] + public class DiamondShopConfig + { + public string Number { get; set; } = string.Empty; + public string Name { get; set; } = string.Empty; + public string Icon { get; set; } = string.Empty; + public int Diamond { get; set; } = 0; + public double Money { get; set; } = 0; + public double DealerMoney { get; set; } = 0; + public bool IsFirst { get; set; } = false; + } + + [BsonIgnoreExtraElements] + public class RegisterConfig + { + public int InitGold { get; set; } = 10000; + public int InitDiamond { get; set; } = 100; + public List InitProductList { get; set; } = new List(); + } + + [BsonIgnoreExtraElements] + public class BattleOrderConfig + { + public bool IsOpen { get; set; } = true; + public long EndTime { get; set; } = DateTime.Now.Date.AddDays(30).ToTimeStamp(); + public string RuleDesc { get; set; } = string.Empty; + public string BuyDesc { get; set; } = string.Empty; + public string AdvanceGiftDesc { get; set; } = string.Empty; + public List LevelConfig { get; set; } = new List(); + public List AdvanceGift { get; set; } = new List(); + + public class AdvanceGiftConfig + { + public int Type { get; set; } = 0; + public string Name { get; set; } = string.Empty; + public int Count { get; set; } = 100; + public string ImageUrl { get; set; } = string.Empty; + public int PayType { get; set; } = 0; + public int PayCount { get; set; } = 0; + public List GiftList { get; set; } = new List(); + } + + public class BattleOrderLevelConfig + { + public int Level { get; set; } = 0; + public long Exp { get; set; } = 0; + public List NormalGiftList { get; set; } = new List(); + public List LuxuryGiftList { get; set; } = new List(); + public List SupremeGiftList { get; set; } = new List(); + public int PayType { get; set; } = 0; + public int PayCount { get; set; } = 0; + } + } + + public class FishingReturnConfig + { + public bool IsEnabled { get; set; } = false; + public double ReturnRate { get; set; } = 0.001; + public long DailyMaxReturn { get; set; } = 0; + } +} diff --git a/CommonDomain/AdminKickChessPlayerMessage.cs b/CommonDomain/AdminKickChessPlayerMessage.cs new file mode 100644 index 0000000..b857f2a --- /dev/null +++ b/CommonDomain/AdminKickChessPlayerMessage.cs @@ -0,0 +1,8 @@ +namespace CommonDomain; + +public sealed class AdminKickChessPlayerMessage +{ + public string RoomId { get; set; } = string.Empty; + public string UserId { get; set; } = string.Empty; + public string Reason { get; set; } = "被管理员移出房间"; +} diff --git a/CommonDomain/ApiLog.cs b/CommonDomain/ApiLog.cs new file mode 100644 index 0000000..885720e --- /dev/null +++ b/CommonDomain/ApiLog.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; + +namespace CommonDomain +{ + [BsonCollection("api_log_{yyyyMM}", "data_0524")] + [BsonIgnoreExtraElements] + public class ApiLog : MongoBaseEntity + { + public string clientIP { get; set; } + /// + /// token + /// + public string accessToken { get; set; } + public long consumeTime { get; set; } + public string requestUrl { get; set; } + public string requestMethod { get; set; } + public string requestQuery { get; set; } + public string requestBody { get; set; } + public string requestHead { get; set; } + public int httpStatus { get; set; } + public string responseBody { get; set; } + /// + /// agent + /// + public string userAgent { get; set; } + [BsonDateTimeOptions(Kind = DateTimeKind.Local)] + public DateTime requestTime { get; set; } = DateTime.Now; + public string version { get; set; } + public string source { get; set; } + public string device { get; set; } + public string deviceId { get; set; } + public string ip { get; set; } + public string sign { get; set; } + } +} diff --git a/CommonDomain/BackgroundOperationLog.cs b/CommonDomain/BackgroundOperationLog.cs new file mode 100644 index 0000000..5fe574c --- /dev/null +++ b/CommonDomain/BackgroundOperationLog.cs @@ -0,0 +1,28 @@ +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; + +namespace CommonDomain +{ + [BsonCollection("background_operation_log", ServiceDatabases.User)] + public class BackgroundOperationLog : MongoBaseEntity + { + public string AdminUserId { get; set; } = string.Empty; + + public string AdminUserName { get; set; } = string.Empty; + + public string TargetUserId { get; set; } = string.Empty; + + public string TargetUserName { get; set; } = string.Empty; + + public int OperationType { get; set; } = 1; + + public int CurrencyType { get; set; } = 1; + + public long Amount { get; set; } = 0; + + public string Remark { get; set; } = string.Empty; + + public long OperationTime { get; set; } = 0; + } +} diff --git a/CommonDomain/BaseModel/BaseIdCount.cs b/CommonDomain/BaseModel/BaseIdCount.cs new file mode 100644 index 0000000..8e96be2 --- /dev/null +++ b/CommonDomain/BaseModel/BaseIdCount.cs @@ -0,0 +1,20 @@ +using MongoDB.Bson.Serialization.Attributes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CommonDomain.BaseModel +{ + [BsonIgnoreExtraElements] + public class BaseIdCount + { + /// + /// Id + /// + public string Id { get; set; } + + public int Count { get; set; } + } +} diff --git a/CommonDomain/BaseModel/BaseIdName.cs b/CommonDomain/BaseModel/BaseIdName.cs new file mode 100644 index 0000000..eec7a18 --- /dev/null +++ b/CommonDomain/BaseModel/BaseIdName.cs @@ -0,0 +1,19 @@ +using MongoDB.Bson.Serialization.Attributes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CommonDomain.BaseModel +{ + [BsonIgnoreExtraElements] + public class BaseIdName + { + /// + /// Id + /// + public string Id { get; set; } + public string Name { get; set; } + } +} diff --git a/CommonDomain/BaseModel/BaseProduct.cs b/CommonDomain/BaseModel/BaseProduct.cs new file mode 100644 index 0000000..337dc2b --- /dev/null +++ b/CommonDomain/BaseModel/BaseProduct.cs @@ -0,0 +1,18 @@ +using CommonDomain.Enum; + +namespace CommonDomain.BaseModel +{ + public class BaseProduct + { + public string Number { get; set; } = string.Empty; + public string Name { get; set; } = string.Empty; + public string Desc { get; set; } = string.Empty; + public string ImageUrl { get; set; } = string.Empty; + + public virtual ProductTypeEnum Type { get; set; } = 0; + + public int Level { get; set; } = 0; + + + } +} diff --git a/CommonDomain/BaseModel/BaseProductCount.cs b/CommonDomain/BaseModel/BaseProductCount.cs new file mode 100644 index 0000000..57cb519 --- /dev/null +++ b/CommonDomain/BaseModel/BaseProductCount.cs @@ -0,0 +1,9 @@ +namespace CommonDomain.BaseModel +{ + public class BaseProductCount :BaseProduct + { + public int Count { get; set; } + + + } +} diff --git a/CommonDomain/BaseModel/BaseTitleValue.cs b/CommonDomain/BaseModel/BaseTitleValue.cs new file mode 100644 index 0000000..ada4522 --- /dev/null +++ b/CommonDomain/BaseModel/BaseTitleValue.cs @@ -0,0 +1,16 @@ +using MongoDB.Bson.Serialization.Attributes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CommonDomain.BaseModel +{ + [BsonIgnoreExtraElements] + public class BaseTitleValue + { + public string Title { get; set; } + public string Value { get; set; } + } +} diff --git a/CommonDomain/BaseModel/FishSpawnConfig.cs b/CommonDomain/BaseModel/FishSpawnConfig.cs new file mode 100644 index 0000000..fa2a552 --- /dev/null +++ b/CommonDomain/BaseModel/FishSpawnConfig.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; + +namespace CommonDomain.BaseModel +{ + public class FishSpawnConfigStoreModel + { + public Dictionary Levels { get; set; } = new Dictionary(); + } + + public class FishSpawnLevelConfig + { + public int GameType { get; set; } + + public int RoomLevel { get; set; } + + public List Probabilities { get; set; } = new List(); + + public List Fishes { get; set; } = new List(); + + public List FishArrays { get; set; } = new List(); + } + + public class FishSpawnProbability + { + public int Type { get; set; } + + public int FishType { get; set; } + + public int FirstFishCountMin { get; set; } + + public int FirstFishCountMax { get; set; } + + public int TimeMin { get; set; } + + public int TimeMax { get; set; } + + public int CountMin { get; set; } + + public int CountMax { get; set; } + + public int MaxCountMin { get; set; } + + public int MaxCountMax { get; set; } + } + + public class FishSpawnFish + { + public string FishNumber { get; set; } = string.Empty; + + public int FishWeight { get; set; } + + public int Times { get; set; } + + public int MaxCount { get; set; } + + public int FishType { get; set; } + + public List PathList { get; set; } = new List(); + } + + public class FishSpawnArray + { + public string FishArrayNumber { get; set; } = string.Empty; + + public string ArrayNumber { get; set; } = string.Empty; + + public string FishNumber { get; set; } = string.Empty; + + public int FishCount { get; set; } + + public string BossFishNumber { get; set; } = string.Empty; + + public int BossCount { get; set; } + + public double GenerateFrequency { get; set; } + } +} diff --git a/CommonDomain/BaseModel/GameBaseConfig.cs b/CommonDomain/BaseModel/GameBaseConfig.cs new file mode 100644 index 0000000..8456d67 --- /dev/null +++ b/CommonDomain/BaseModel/GameBaseConfig.cs @@ -0,0 +1,867 @@ +using Amazon.SecurityToken.Model.Internal.MarshallTransformations; +using Common.Utils; +using System.Text.Json.Serialization; +using CommonDomain.Enum; +using MongoDB.Bson.Serialization.Attributes; +using static CommonDomain.BaseModel.BossConfig.BossBombConfig; + +namespace CommonDomain.BaseModel +{ + public static class GlobalRandom + { + private static readonly Random _instance = new Random(); + private static readonly object _lock = new object(); + + public static int Next(int maxValue) => Next(0, maxValue); + + public static int Next(int minValue, int maxValue) + { + lock (_lock) + { + return _instance.Next(minValue, maxValue); + } + } + + public static long NextInt64(long minValue, long maxValue) + { + lock (_lock) + { + return _instance.NextInt64(minValue, maxValue); + } + } + + public static int NextInclusive(int value1, int value2) + { + var minValue = Math.Min(value1, value2); + var maxValue = Math.Max(value1, value2); + if (minValue == maxValue) + return minValue; + + lock (_lock) + { + return (int)_instance.NextInt64(minValue, (long)maxValue + 1); + } + } + + public static double NextDouble() + { + lock (_lock) + { + return _instance.NextDouble(); + } + } + } + [BsonIgnoreExtraElements] + public class FishTypeConfig + { + public string FishNumber { get; set; } = string.Empty; + + public string FishName { get; set; } = string.Empty; + + + public string FishBrief { get; set; } = string.Empty; + + public FishTypeEnum FishType { get; set; } + + + public int FishScore { get; set; } = 0; + + public int KillWeight { get; set; } = 0; + + [BsonElement("pathList")] + public List PathList { get; set; } = new List(); + + public string FishImage { get; set; } = string.Empty; + + public string FishMultipleDesc { get; set; } = string.Empty; + } + + [BsonIgnoreExtraElements] + public class RoomConfig + { + public string RoomNumber { get; set; } = string.Empty; + + public string RoomName { get; set; } = string.Empty; + + public GameTypeEnum GameType { get; set; } + + public int RoomLevel { get; set; } = 0; + + public int RoomPartitionNum { get; set; } = 0; + + public int RoomCount { get; set; } = 0; + + public int RoomGoldLimit { get; set; } = 0; + + public List CannonMultipleList { get; set; } = new List(); + + } + + [BsonIgnoreExtraElements] + public class RoomFishConfig + { + public GameTypeEnum GameType { get; set; } + + public List NormalFishList { get; set; } = new List(); + + + public List RoomFishLevelList { get; set; } = new List(); + + + + public List RoomFishProbabilityList { get; set; } = new List(); + + + } + public class RoomFishProbabilityConfig + { + + public int RoomLevel { get; set; } = 0; + public int Type { get; set; } = 0; + + public FishTypeEnum FishType { get; set; } + + public List FirstFishCountRange { get; set; } + public List TimeRange { get; set; } + + + public List CountRange { get; set; } + + + public List MaxCountRange { get; set; } + + + } + + [BsonIgnoreExtraElements] + public class RoomFishLevelConfig : RoomFishDetailConfig + { + public int RoomLevel { get; set; } = 0; + + + } + + [BsonIgnoreExtraElements] + public class RoomFishDetailConfig + { + + public int Type { get; set; } = 0; + + public string FishNumber { get; set; } = string.Empty; + public int FishWeight { get; set; } = 0; + public int FishFrequency { get; set; } = 0; + public int MaxCount { get; set; } = 0; + + public int Times { get; set; } = 0; + } + + [BsonIgnoreExtraElements] + public class FishArrayConfig + { + public FishArrayConfig() + { + } + + public FishArrayConfig(string fishArrayNumber, string name, string fishNumber, int fishCount, string bossFishNumber, int boosCount, string arrayNumber, List thresholdList) + { + FishArrayNumber = fishArrayNumber; + Name = name; + FishNumber = fishNumber; + FishCount = fishCount; + BossFishNumber = bossFishNumber; + BoosCount = boosCount; + ArrayNumber = arrayNumber; + ThresholdList = thresholdList; + } + + public string FishArrayNumber { get; set; } = string.Empty; + + public string Name { get; set; } = string.Empty; + + public string FishNumber { get; set; } = string.Empty; + public int FishCount { get; set; } = 0; + + public string BossFishNumber { get; set; } = string.Empty; + + public int BoosCount { get; set; } = 0; + + public string ArrayNumber { get; set; } = string.Empty; + + + public List ThresholdList { get; set; } = new List(); + + public double GenerateFrequency { get; set; } = 0.2; + + } + [BsonIgnoreExtraElements] + public class UserLevelConfig + { + public int Level { get; set; } = 0; + public long ExpMin { get; set; } = 0; + public long ExpMax { get; set; } = 0; + + public long Gold { get; set; } = 0; + public int Diamond { get; set; } = 0; + + public List ProductList { get; set; } = new List(); + + public List GiftList { get; set; } = new List(); + } + [BsonIgnoreExtraElements] + public class PropInfConfig : BasePropInfo + { + public List GameNumber { get; set; } = new List(); + + public int Day { get; set; } = 0; + } + + [BsonIgnoreExtraElements] + public class PropFragmentConfig : BasePropInfo + { + public int FragmentCount { get; set; } = 0; + public string ProductNumber { get; set; } = string.Empty; + } + [BsonIgnoreExtraElements] + public class BasePropInfo : BaseProduct + { + public SaleTypeEnum SaleType { get; set; } = SaleTypeEnum.金币; + + public int Price { get; set; } = 0; + public int SaleCount { get; set; } = 1; + + public int VIPPrice { get; set; } = 0; + + public int DealerPrice { get; set; } = 0; + + public bool IsEnable { get; set; } = true; + + public bool IsSale { get; set; } = true; + } + [BsonIgnoreExtraElements] + public class VipLevelConfig + { + public int Level { get; set; } = 0; + + public long ExpMax { get; set; } = 0; + + public long ExpMin { get; set; } = 0; + + public double SignInAdd { get; set; } = 0; + + public string Remark { get; set; } = string.Empty; + + public List GiftList { get; set; } = new List(); + + public List DailyGift { get; set; } = new List(); + + + } + [BsonIgnoreExtraElements] + public class GiftConfig + { + + public int Type { get; set; } = 0; + + public string OtherId { get; set; } = string.Empty; + + public bool IsRandom { get; set; } = false; + + public int Count { get; set; } = 0; + + public int MinCount { get; set; } = 0; + + public int MaxCount { get; set; } = 0; + + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public BaseProduct? Product { get; set; } + + } + + + [BsonIgnoreExtraElements] + public class KillConfig + { + + public int NormalizationFactorPlayer { get; set; } = 50000; + public double MinPlayerModifier { get; set; } = 0.3; + public double MaxPlayerModifier { get; set; } = 2.0; + public int TargetSystemProfit { get; set; } = 1000000; + public int NormalizationFactorSystem { get; set; } = 10000000; + public double MinSystemModifier { get; set; } = 0.95; + public double MaxSystemModifier { get; set; } = 1.05; + + public int DaySystemGold { get; set; } = 100000; + + public int IPCount { get; set; } = 5; + + public double ViolateValue { get; set; } = 0.2; + public CompensateRateParam CompensateRate { get; set; } = new CompensateRateParam(); + + + public CompensateRateParam PenaltyRate { get; set; } = new CompensateRateParam(); + + public long GlobalAnnounceMinGold { get; set; } = 0; + + } + + [BsonIgnoreExtraElements] + public class CompensateRateParam + { + public double BossRate { get; set; } = 1; + + + public double GoldRate { get; set; } = 1; + + + public double SpecialRate { get; set; } = 1; + + public double Ordinary { get; set; } = 1; + } + + [BsonIgnoreExtraElements] + public class BossConfig + { + + public List LuckWheel { get; set; } = new List(); + + public LuckPokerConfig LuckPoker { get; set; } = new LuckPokerConfig(); + + public List LuckFlyDisk { get; set; } = new List(); + + public BaseBossConfig FullScreen { get; set; } = new BaseBossConfig(); + public BaseBossConfig Range { get; set; } = new BaseBossConfig(); + + public AmmunitionBoxConfig AmmunitionBox { get; set; } = new AmmunitionBoxConfig(); + + public InterstellarCruiseConfig InterstellarCruise { get; set; } = new InterstellarCruiseConfig(); + + public BossFlameStormConfig FlameStorm { get; set; } = new BossFlameStormConfig(); + + public BossBombConfig Bomb { get; set; } = new BossBombConfig(); + + public BossScorpionConfig Scorpion { get; set; } = new BossScorpionConfig(); + + public List Probability { get; set; } = new List(); + + public List LuckDragon { get; set; } = new List(); + + + public static int GetBossProbabilityConfigResponse(List configParams) + { + int totalWeight = configParams.Sum(p => p.TriggerRate); + + if (totalWeight <= 0) + { + return 0; + } + + int randomValue = GlobalRandom.Next(0, totalWeight); + + int currentWeightSum = 0; + foreach (var param in configParams) + { + currentWeightSum += param.TriggerRate; + + if (randomValue < currentWeightSum) + { + return GlobalRandom.NextInclusive(param.Min, param.Max); + } + } + + return 0; + } + + + public static CruiseConfigCount GetRandomCountConfigOption(List options) + { + if (options == null || !options.Any()) + { + return null; + } + + long totalWeight = options.Sum(o => (long)o.TriggerRate); + + if (totalWeight <= 0) + { + return null; + } + + long randomValue = GlobalRandom.NextInt64(0, totalWeight); + + long currentWeightSum = 0; + foreach (var option in options) + { + currentWeightSum += option.TriggerRate; + + if (randomValue < currentWeightSum) + { + return option; + } + } + + return options.FirstOrDefault(o => o.TriggerRate > 0); + } + + + public class CruiseConfigCount + { + + public int Count { get; set; } + public int TriggerRate { get; set; } = 0; + + public int KillRate { get; set; } = 0; + + } + + public class LuckDragonConfig:BaseBossConfig + { + + + public List OuterConfig { get; set; } = new List(); + public List MiddleConfig { get; set; } = new List(); + + public List InnerConfig { get; set; } = new List(); + + public (List option, int beizhu, string ringName) GetResponse() + { + int beishu = 1; + var result = new List(); + string ringName = "外圈"; + int outerResult = GetBossProbabilityConfigResponse(OuterConfig); + result.Add(outerResult); + if (outerResult == -1) + { + int middleResult = GetBossProbabilityConfigResponse(MiddleConfig); + result.Add(middleResult); + if (middleResult == -1) + { + int innerResult = GetBossProbabilityConfigResponse(InnerConfig); + result.Add(innerResult); + beishu = innerResult; + ringName = "内圈"; + } + else { + beishu = middleResult; + ringName = "中圈"; + } + } + else { + beishu = outerResult; + ringName = "外圈"; + } + + return (result, beishu, ringName); + } + + + + } + + public class BossBombConfig:BaseBossConfig + { + public List CountConfig { get; set; } = new List(); + + public List OneDeathConfig { get; set; } = new List(); + + public List TwoDeathConfig { get; set; } = new List(); + + public (int beishu, int type) GetResponse(string fishId) + { + + int beishu = 0; + var countConfig = GetRandomCountConfigOption(CountConfig); + if (countConfig == null) + return (1, 1); + if (countConfig.Count == 1) + { + beishu = GetBossProbabilityConfigResponse(OneDeathConfig); + return (beishu, 1); + } + else + { + beishu = GetBossProbabilityConfigResponse(TwoDeathConfig); + return (beishu, 2); + } + } + + } + + public class ScorpionItemCountConfig + { + public int Count { get; set; } = 0; + public int Weight { get; set; } = 0; + } + + public class ScorpionItemConfig + { + public string PropNumber { get; set; } = string.Empty; + public int Count { get; set; } = 0; + public int Weight { get; set; } = 0; + } + + public class BossScorpionConfig : BaseBossConfig + { + public List ItemCountConfig { get; set; } = new List(); + + public List ItemConfig { get; set; } = new List(); + + public List GoldConfig { get; set; } = new List(); + + public int CompositeMultiplier { get; set; } = 650; + + public double KillProbability { get { return CompositeMultiplier <= 0 ? 0 : 1.0 / CompositeMultiplier; } } + + public double ComputedWeight { get { return CompositeMultiplier <= 0 ? 0 : 10000.0 / CompositeMultiplier; } } + + private static ScorpionItemCountConfig GetRandomItemCount(List options) + { + if (options == null || !options.Any()) return null; + long totalWeight = options.Sum(o => (long)o.Weight); + if (totalWeight <= 0) return null; + long randomValue = GlobalRandom.NextInt64(0, totalWeight); + long currentWeightSum = 0; + foreach (var option in options) + { + currentWeightSum += option.Weight; + if (randomValue < currentWeightSum) + return option; + } + return options.FirstOrDefault(o => o.Weight > 0); + } + + private static ScorpionItemConfig GetRandomItem(List options) + { + if (options == null || !options.Any()) return null; + long totalWeight = options.Sum(o => (long)o.Weight); + if (totalWeight <= 0) return null; + long randomValue = GlobalRandom.NextInt64(0, totalWeight); + long currentWeightSum = 0; + foreach (var option in options) + { + currentWeightSum += option.Weight; + if (randomValue < currentWeightSum) + return option; + } + return options.FirstOrDefault(o => o.Weight > 0); + } + + public (int beishu, List items) GetResponse() + { + int beishu = GetBossProbabilityConfigResponse(GoldConfig); + + var items = new List(); + var countConfig = GetRandomItemCount(ItemCountConfig); + int itemCount = countConfig?.Count ?? 0; + for (int i = 0; i < itemCount; i++) + { + var item = GetRandomItem(ItemConfig); + if (item != null) + items.Add(item); + } + return (beishu, items); + } + } + + public class BossFlameStormConfig : BaseBossConfig + { + + public List CountConfig { get; set; } = new List(); + + public List> DeathConfigs { get; set; } = new List>(); + + + + public (bool isKill, int beishu, string fishId, int animId) GetResponse(string fishId) + { + var countConfig = GetRandomCountConfigOption(CountConfig); + if (countConfig == null) + return (true, 1, fishId, GlobalRandom.Next(2, 5)); + + if (DeathConfigs.Count == 0) + return (countConfig.Count > 1, 1, fishId, countConfig.Count > 1 ? GlobalRandom.Next(2, 5) : 1); + + int index = Math.Max(0, countConfig.Count - 1); + if (index >= DeathConfigs.Count) + index = DeathConfigs.Count - 1; + + int beishu = GetBossProbabilityConfigResponse(DeathConfigs[index]); + + if (countConfig.Count == 1) + return (false, beishu, fishId, 1); + + return (true, beishu, fishId, GlobalRandom.Next(2, 5)); + } + + + } + public class InterstellarCruiseConfig : BaseBossConfig + { + + public List CountConfig { get; set; } = new List(); + + public List> DeathConfigs { get; set; } = new List>(); + + + public (bool isKill, int beishu, string fishId, int animId) GetResponse(string fishId) + { + var countConfig = GetRandomCountConfigOption(CountConfig); + if (countConfig == null) + return (true, 1, fishId, GlobalRandom.Next(2, 5)); + + if (DeathConfigs.Count == 0) + return (countConfig.Count > 1, 1, fishId, countConfig.Count > 1 ? GlobalRandom.Next(2, 5) : 1); + + int index = Math.Max(0, countConfig.Count - 1); + if (index >= DeathConfigs.Count) + index = DeathConfigs.Count - 1; + + int beishu = GetBossProbabilityConfigResponse(DeathConfigs[index]); + + if (countConfig.Count == 1) + return (false, beishu, fishId, 1); + + return (true, beishu, fishId, GlobalRandom.Next(2, 5)); + } + + + } + public class BossProbabilityConfig : BaseBossConfig + { + + public List configParams { get; set; } = new List(); + + + public int GetResponse() + { + int totalWeight = configParams.Sum(p => p.TriggerRate); + + if (totalWeight <= 0) + { + return 0; + } + + int randomValue = GlobalRandom.Next(0, totalWeight); + + int currentWeightSum = 0; + foreach (var param in configParams) + { + currentWeightSum += param.TriggerRate; + + if (randomValue < currentWeightSum) + { + return GlobalRandom.NextInclusive(param.Min, param.Max); + } + } + + return 0; + } + + + } + public class AmmunitionBoxConfig : BaseBossConfig + { + public List OptionList { get; set; } = new List(); + public List GetResponse() + { + var opt = RandomBossOption.GetRandomBossOption(OptionList); + if (opt == null) + return null; + return new List() { opt }; + } + } + + public class LuckFlyDiskConfig : BaseBossConfig + { + + public List InnerOptionList { get; set; } = new List(); + public List OuterOptionList { get; set; } = new List(); + + public List GetResponse() + { + List result = new List(); + var opt = RandomBossOption.GetRandomBossOption(InnerOptionList); + result.Add(opt); + var opt1 = RandomBossOption.GetRandomBossOption(OuterOptionList); + result.Add(opt1); + return result; + + } + } + public class LuckPokerConfig : BaseBossConfig + { + public List OptionList { get; set; } = new List(); + + public List GetResponse() + { + var opt = RandomBossOption.GetRandomBossOption(OptionList); + if (opt == null) + return null; + return new List() { opt }; + } + } + public class LuckWheelConfig : BaseBossConfig + { + public List OptionList { get; set; } = new List(); + + public List CountList { get; set; } = new List(); + public List GetResponse() + { + List count = new List(); + List option = new List(); + + foreach (var item in CountList) + { + if (item.TriggerRate >= 100) + { + count.Add(item.OptionId); + continue; + } + if (GlobalRandom.Next(100) < item.TriggerRate) + { + count.Add(item.OptionId); + continue; + } + break; + } + foreach (var item in count) + { + var opt = RandomBossOption.GetRandomBossOption(OptionList); + if (opt == null) + continue; + option.Add(opt); + } + return option; + } + + } + + public class BaseBossConfig + { + public List FishNumber { get; set; } = new List(); + } + + public class BossProbabilityConfigParam + { + public BossProbabilityConfigParam(int min, int max, int triggerRate) + { + Min = min; + Max = max; + TriggerRate = triggerRate; + } + + public int Min { get; set; } + public int Max { get; set; } + public int TriggerRate { get; set; } = 0; + } + } + + public class BossDropItemConfig + { + public string PropNumber { get; set; } = string.Empty; + public string PropName { get; set; } = string.Empty; + public int Count { get; set; } = 1; + public int Weight { get; set; } = 0; + } + + public class BossDropConfig + { + public int NoDropWeight { get; set; } = 5000; + public List DropItems { get; set; } = new List(); + } + + public class BossOptionBaseParam + { + public BossOptionBaseParam(double optionId, int triggerRate, double score = 0) + { + OptionId = optionId; + TriggerRate = triggerRate; + Score = score; + } + + public double OptionId { get; set; } + + + public int TriggerRate { get; set; } = 0; + + public double Score { get; set; } = 0; + } + public static class RandomBossOption + { + public static BossOptionBaseParam GetRandomBossOption(List options) + { + if (options == null || !options.Any()) + { + return null; + } + + long totalWeight = options.Sum(o => (long)o.TriggerRate); + + if (totalWeight <= 0) + { + return null; + } + + long randomValue = GlobalRandom.NextInt64(0, totalWeight); + + long currentWeightSum = 0; + foreach (var option in options) + { + currentWeightSum += option.TriggerRate; + + if (randomValue < currentWeightSum) + { + return option; + } + } + + return options.FirstOrDefault(o => o.TriggerRate > 0); + } + } + + public class ScratchCardConfig + { + + public int Type { get; set; } = 0; + + public BaseProduct? BaseProduct { get; set; } + + + public int Count { get; set; } = 0; + + public int Weight { get; set; } = 0; + } + + public class ChessConfig + { + public List CreateRoomLimit { get; set; } = new List(); + + public long MinBetGold { get; set; } = 1000; + + public List BetGoldLimits { get; set; } = new List(); + + public List CreateRoomVipLevels { get; set; } = new List(); + + } + + public class FishRoomConfig + { + public List SeatSelectLimit { get; set; } = new List(); + + public List SeatSelectVipLevels { get; set; } = new List(); + } + + public class TorpedoRewardConfig + { + public int MinGold { get; set; } + public int MaxGold { get; set; } + public int Weight { get; set; } + } + + public class TorpedoItemConfig + { + public string Number { get; set; } = string.Empty; + public string Name { get; set; } = string.Empty; + public string Color { get; set; } = string.Empty; + public List RewardRanges { get; set; } = new(); + } +} diff --git a/CommonDomain/BaseModel/UserAssetSyncParam.cs b/CommonDomain/BaseModel/UserAssetSyncParam.cs new file mode 100644 index 0000000..d448377 --- /dev/null +++ b/CommonDomain/BaseModel/UserAssetSyncParam.cs @@ -0,0 +1,14 @@ +namespace CommonDomain.BaseModel +{ + public class UserAssetSyncParam + { + public string UserId { get; set; } + public int CurrencyType { get; set; } + public int ChangeType { get; set; } + public long Amount { get; set; } + public long NewGold { get; set; } + public int NewDiamond { get; set; } + public string Source { get; set; } + public string Remark { get; set; } + } +} diff --git a/CommonDomain/BattleOrderGiftProductHelper.cs b/CommonDomain/BattleOrderGiftProductHelper.cs new file mode 100644 index 0000000..69d3aeb --- /dev/null +++ b/CommonDomain/BattleOrderGiftProductHelper.cs @@ -0,0 +1,56 @@ +using CommonDomain.BaseModel; + +namespace CommonDomain; + +public static class BattleOrderGiftProductHelper +{ + public static void Enrich(BattleOrderConfig? battleOrder, GameConfig? gameConfig) + { + if (battleOrder == null || gameConfig == null) return; + + var gifts = (battleOrder.LevelConfig ?? new List()) + .SelectMany(level => + (level.NormalGiftList ?? new List()) + .Concat(level.LuxuryGiftList ?? new List()) + .Concat(level.SupremeGiftList ?? new List())) + .Concat((battleOrder.AdvanceGift ?? new List()) + .SelectMany(advance => advance.GiftList ?? new List())); + + foreach (var gift in gifts) + EnrichGift(gift, gameConfig); + } + + private static void EnrichGift(GiftConfig gift, GameConfig gameConfig) + { + if (gift.Type != 3 || string.IsNullOrWhiteSpace(gift.OtherId)) return; + + var number = gift.OtherId.Trim(); + var fragment = gameConfig.PropFragments?.FirstOrDefault(item => item.Number == number); + BaseProduct? product = fragment; + var imageUrl = fragment?.ImageUrl ?? string.Empty; + + if (fragment != null && string.IsNullOrWhiteSpace(imageUrl)) + { + imageUrl = gameConfig.PropConfig? + .FirstOrDefault(item => item.Number == fragment.ProductNumber)?.ImageUrl ?? string.Empty; + } + + if (product == null) + { + product = gameConfig.PropConfig?.FirstOrDefault(item => item.Number == number); + imageUrl = product?.ImageUrl ?? string.Empty; + } + + if (product == null) return; + + gift.Product = new BaseProduct + { + Number = product.Number, + Name = product.Name, + Desc = product.Desc, + ImageUrl = imageUrl, + Type = product.Type, + Level = product.Level + }; + } +} diff --git a/CommonDomain/BotProfileEntity.cs b/CommonDomain/BotProfileEntity.cs new file mode 100644 index 0000000..e497ead --- /dev/null +++ b/CommonDomain/BotProfileEntity.cs @@ -0,0 +1,15 @@ +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; + +namespace CommonDomain +{ + [BsonCollection("bot_avatar_config", "data_0524")] + [BsonIgnoreExtraElements] + public class BotProfileEntity : MongoBaseEntity + { + public string Name { get; set; } = string.Empty; + + public string Avatar { get; set; } = string.Empty; + } +} diff --git a/CommonDomain/CapMessageModels.cs b/CommonDomain/CapMessageModels.cs new file mode 100644 index 0000000..0d99085 --- /dev/null +++ b/CommonDomain/CapMessageModels.cs @@ -0,0 +1,82 @@ +namespace CommonDomain +{ + public class BackgroundOperationNotifyMessage + { + public string UserId { get; set; } = string.Empty; + public string UserNumber { get; set; } = string.Empty; + public string Action { get; set; } = string.Empty; + public string Title { get; set; } = string.Empty; + public string EmailId { get; set; } = string.Empty; + public string PropNumber { get; set; } = string.Empty; + public int Count { get; set; } + public int CurrencyType { get; set; } + public int ChangeType { get; set; } + public long Amount { get; set; } + public long NewGold { get; set; } + public int NewDiamond { get; set; } + public string Source { get; set; } = string.Empty; + public string Remark { get; set; } = string.Empty; + public int NewLevel { get; set; } + public long NewExp { get; set; } + } + + public class PlayerFactorChangedMessage + { + public string UserId { get; set; } = string.Empty; + public string ChangeType { get; set; } = string.Empty; + public string OperationId { get; set; } = string.Empty; + public long PublishedAtUnixMs { get; set; } + } + + public class ConfigChangedMessage + { + public string ConfigType { get; set; } = string.Empty; + public string OperationId { get; set; } = string.Empty; + public long PublishedAtUnixMs { get; set; } + } + + public class LoginBindMessage + { + public string UserId { get; set; } = string.Empty; + public string OperationId { get; set; } = string.Empty; + } + + public class LoginBindResultMessage + { + public string UserId { get; set; } = string.Empty; + public string RoomId { get; set; } = string.Empty; + public string OperationId { get; set; } = string.Empty; + public bool Success { get; set; } = true; + public string Error { get; set; } = string.Empty; + } + + public class LotteryDrawMessage + { + public string UserId { get; set; } = string.Empty; + public string PrizeId { get; set; } = string.Empty; + public string PrizeName { get; set; } = string.Empty; + public int Type { get; set; } + public long Count { get; set; } + public string OtherId { get; set; } = string.Empty; + } + + public class TempSpawnFishMessage + { + public string RoomId { get; set; } = string.Empty; + public string FishNumber { get; set; } = string.Empty; + public int Count { get; set; } = 1; + public int? RouteId { get; set; } + public int? Seconds { get; set; } + public string OperationId { get; set; } = string.Empty; + public long PublishedAtUnixMs { get; set; } + } + + public class SummonCardFishMessage + { + public string UserId { get; set; } = string.Empty; + public string RoomId { get; set; } = string.Empty; + public int FishType { get; set; } + public string OperationId { get; set; } = string.Empty; + public long PublishedAtUnixMs { get; set; } + } +} diff --git a/CommonDomain/CommonDomain.csproj b/CommonDomain/CommonDomain.csproj new file mode 100644 index 0000000..d26f45b --- /dev/null +++ b/CommonDomain/CommonDomain.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + diff --git a/CommonDomain/EmptyRoomRateConfig.cs b/CommonDomain/EmptyRoomRateConfig.cs new file mode 100644 index 0000000..f4cbee4 --- /dev/null +++ b/CommonDomain/EmptyRoomRateConfig.cs @@ -0,0 +1,18 @@ +using CommonDomain.Enum; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; + +namespace CommonDomain +{ + [BsonCollection("empty_room_rate_config", "data_0524")] + [BsonIgnoreExtraElements] + public class EmptyRoomRateConfig : MongoBaseEntity + { + public GameTypeEnum GameType { get; set; } + + public int RoomLevel { get; set; } = 0; + + public int EmptyRoomRate { get; set; } = 30; + } +} diff --git a/CommonDomain/Enum/FishTypeEnum.cs b/CommonDomain/Enum/FishTypeEnum.cs new file mode 100644 index 0000000..71c6fc1 --- /dev/null +++ b/CommonDomain/Enum/FishTypeEnum.cs @@ -0,0 +1,11 @@ +namespace CommonDomain.Enum +{ + public enum FishTypeEnum + { + 普通鱼=1, + Boss鱼=2, + 黄金鱼=3, + 特殊鱼=4, + 特殊Boss=5 + } +} diff --git a/CommonDomain/Enum/GameTypeEnum.cs b/CommonDomain/Enum/GameTypeEnum.cs new file mode 100644 index 0000000..0d64940 --- /dev/null +++ b/CommonDomain/Enum/GameTypeEnum.cs @@ -0,0 +1,12 @@ +namespace CommonDomain.Enum +{ + public enum GameTypeEnum + { + None=0, + 风雷之渊=1, + 永夜尸城=2, + 中国象棋=3, + 星际迷航=4, + 黑神话悟空=5 + } +} diff --git a/CommonDomain/Enum/ProductTypeEnum.cs b/CommonDomain/Enum/ProductTypeEnum.cs new file mode 100644 index 0000000..f930e8c --- /dev/null +++ b/CommonDomain/Enum/ProductTypeEnum.cs @@ -0,0 +1,35 @@ +namespace CommonDomain.Enum +{ + public enum ProductTypeEnum + { + 炮台=1, + 翅膀=2, + 炮塔碎片=3, + 翅膀碎片=4, + 战神=5, + 战神碎片=6, + 刮刮卡=7, + 改名卡=8, + 大喇叭=9, + 技能=10, + 召唤卡=11, + VipExp=12, + 鱼雷=13, + } + public static class ProductType + { + public static List MoreProductTypeList = new List + { + ProductTypeEnum.炮塔碎片, + ProductTypeEnum.翅膀碎片, + ProductTypeEnum.战神碎片, + ProductTypeEnum.刮刮卡, + ProductTypeEnum.改名卡, + ProductTypeEnum.大喇叭, + ProductTypeEnum.技能, + ProductTypeEnum.召唤卡, + ProductTypeEnum.VipExp, + ProductTypeEnum.鱼雷, + }; + } +} diff --git a/CommonDomain/Enum/SaleTypeEnum.cs b/CommonDomain/Enum/SaleTypeEnum.cs new file mode 100644 index 0000000..3b8531d --- /dev/null +++ b/CommonDomain/Enum/SaleTypeEnum.cs @@ -0,0 +1,8 @@ +namespace CommonDomain.Enum +{ + public enum SaleTypeEnum + { + 金币=1, + 钻石=2 + } +} diff --git a/CommonDomain/Enum/TaskType.cs b/CommonDomain/Enum/TaskType.cs new file mode 100644 index 0000000..d6c8799 --- /dev/null +++ b/CommonDomain/Enum/TaskType.cs @@ -0,0 +1,21 @@ +namespace CommonDomain.Enum +{ + public enum TaskType + { + 每日任务=1, + 在线时长任务=2 + } + public enum TaskEvent + { + 整点在线奖励=1, + 在线时长=2, + 捕获任意鱼=3, + 捕获黄金鱼=4, + 捕获Boss鱼=5, + 赢取金币=6, + 使用狂暴=7, + 开炮任务=8, + 登录任务=9, + 充值任务=10 + } +} diff --git a/CommonDomain/ErrorCodes.cs b/CommonDomain/ErrorCodes.cs new file mode 100644 index 0000000..0036cc7 --- /dev/null +++ b/CommonDomain/ErrorCodes.cs @@ -0,0 +1,22 @@ +namespace CommonDomain +{ + public static class ErrorCodes + { + public const int 未知错误 = 0; + public const int 房间已满 = 1001; + public const int 金币不足 = 1002; + public const int 房间不存在 = 1003; + public const int 玩家不在房间 = 1004; + public const int 签名错误 = 1005; + public const int 请求已过期 = 1006; + public const int 鱼配置不存在 = 1007; + public const int 子弹参数无效 = 1008; + public const int 金币参数超出范围 = 1009; + public const int 连接用户不匹配 = 1010; + public const int 用户不存在 = 1011; + public const int 道具配置不存在 = 1012; + public const int 道具数量不足 = 1013; + public const int 钻石不足 = 1014; + public const int 炮倍参数无效 = 1015; + } +} diff --git a/CommonDomain/Faq.cs b/CommonDomain/Faq.cs new file mode 100644 index 0000000..5cc425a --- /dev/null +++ b/CommonDomain/Faq.cs @@ -0,0 +1,62 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; + +namespace CommonDomain +{ + [BsonCollection("faq_category", "data_0524")] + [BsonIgnoreExtraElements] + public class FaqCategory : MongoBaseEntity + { + [BsonElement("parentid")] + public string? ParentId { get; set; } + + [BsonElement("name")] + public string? Name { get; set; } + + [BsonElement("icon")] + public string? Icon { get; set; } + + [BsonElement("sort")] + public int Sort { get; set; } = 0; + + [BsonElement("isenable")] + public bool IsEnable { get; set; } = true; + } + + [BsonCollection("faq_question", "data_0524")] + [BsonIgnoreExtraElements] + public class FaqQuestion : MongoBaseEntity + { + [BsonElement("categoryid")] + public string? CategoryId { get; set; } + + [BsonElement("title")] + public string? Title { get; set; } + + [BsonElement("content")] + public string? Content { get; set; } + + [BsonElement("sort")] + public int Sort { get; set; } = 0; + + [BsonElement("isenable")] + public bool IsEnable { get; set; } = true; + + [BsonElement("createtime")] + [BsonDateTimeOptions(Kind = DateTimeKind.Local, DateOnly = false)] + public DateTime CreateTime { get; set; } = DateTime.Now; + } + + public class FaqCategoryTreeNode + { + public string? Id { get; set; } + public string? Name { get; set; } + public string? Icon { get; set; } + public int Sort { get; set; } + public bool IsEnable { get; set; } + public List Children { get; set; } = new(); + public int QuestionCount { get; set; } + } +} diff --git a/CommonDomain/FishSpawnExtractor.cs b/CommonDomain/FishSpawnExtractor.cs new file mode 100644 index 0000000..7cebc62 --- /dev/null +++ b/CommonDomain/FishSpawnExtractor.cs @@ -0,0 +1,183 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using CommonDomain.BaseModel; +using CommonDomain.Enum; +using Microsoft.Extensions.Logging; + +namespace CommonDomain +{ + public static class FishSpawnExtractor + { + public static string ExtractToJson(GameConfig gameConfig, ILogger logger = null) + { + var model = Extract(gameConfig, logger); + if (model == null || model.Levels.Count == 0) + { + + return "{}"; + } + + var json = JsonSerializer.Serialize(model, new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + WriteIndented = false + }); + + + return json; + } + + public static FishSpawnConfigStoreModel Extract(GameConfig gameConfig, ILogger logger = null) + { + var result = new FishSpawnConfigStoreModel(); + + if (gameConfig?.RoomConfigs == null || gameConfig.RoomConfigs.Count == 0) + { + + return result; + } + + var fishTypeDict = gameConfig.FishTypeConfigs? + .Where(f => f != null && !string.IsNullOrWhiteSpace(f.FishNumber)) + .ToDictionary(f => f.FishNumber, f => f) + ?? new Dictionary(); + + var fishArrayDict = gameConfig.FishArrayConfigs? + .Where(a => a != null && !string.IsNullOrWhiteSpace(a.FishArrayNumber)) + .ToDictionary(a => a.FishArrayNumber, a => a) + ?? new Dictionary(); + + foreach (var roomCfg in gameConfig.RoomConfigs) + { + if (roomCfg == null) continue; + + var roomFishCfg = gameConfig.RoomFishConfigs? + .FirstOrDefault(r => r.GameType == roomCfg.GameType); + + if (roomFishCfg == null) + { + + continue; + } + + int roomLevel = roomCfg.RoomLevel; + + var levelKey = $"{(int)roomCfg.GameType}:{roomLevel}"; + if (result.Levels.ContainsKey(levelKey)) continue; + + var levelConfig = new FishSpawnLevelConfig + { + GameType = (int)roomCfg.GameType, + RoomLevel = roomLevel + }; + + if (roomFishCfg.RoomFishProbabilityList != null) + { + foreach (var prob in roomFishCfg.RoomFishProbabilityList) + { + if (prob == null || prob.RoomLevel != roomLevel) continue; + + levelConfig.Probabilities.Add(new FishSpawnProbability + { + Type = prob.Type, + FishType = (int)prob.FishType, + FirstFishCountMin = prob.FirstFishCountRange != null && prob.FirstFishCountRange.Count > 0 ? prob.FirstFishCountRange[0] : 0, + FirstFishCountMax = prob.FirstFishCountRange != null && prob.FirstFishCountRange.Count > 1 ? prob.FirstFishCountRange[1] : 0, + TimeMin = prob.TimeRange != null && prob.TimeRange.Count > 0 ? prob.TimeRange[0] : 3, + TimeMax = prob.TimeRange != null && prob.TimeRange.Count > 1 ? prob.TimeRange[1] : 8, + CountMin = prob.CountRange != null && prob.CountRange.Count > 0 ? prob.CountRange[0] : 1, + CountMax = prob.CountRange != null && prob.CountRange.Count > 1 ? prob.CountRange[1] : 3, + MaxCountMin = prob.MaxCountRange != null && prob.MaxCountRange.Count > 0 ? prob.MaxCountRange[0] : 5, + MaxCountMax = prob.MaxCountRange != null && prob.MaxCountRange.Count > 1 ? prob.MaxCountRange[1] : 20 + }); + } + } + + var processedFishNumbers = new HashSet(); + + if (roomFishCfg.RoomFishLevelList != null) + { + foreach (var fish in roomFishCfg.RoomFishLevelList) + { + if (fish == null || fish.RoomLevel != roomLevel) continue; + if (fish.Type != 1) continue; + if (string.IsNullOrWhiteSpace(fish.FishNumber)) continue; + + processedFishNumbers.Add(fish.FishNumber); + fishTypeDict.TryGetValue(fish.FishNumber, out var ft); + + levelConfig.Fishes.Add(new FishSpawnFish + { + FishNumber = fish.FishNumber, + FishWeight = fish.FishWeight, + Times = fish.Times, + MaxCount = fish.MaxCount, + FishType = ft != null ? (int)ft.FishType : 0, + PathList = ft?.PathList ?? new List() + }); + } + } + + if (roomFishCfg.NormalFishList != null) + { + foreach (var fish in roomFishCfg.NormalFishList) + { + if (fish == null || fish.Type != 1) continue; + if (string.IsNullOrWhiteSpace(fish.FishNumber)) continue; + if (processedFishNumbers.Contains(fish.FishNumber)) continue; + + processedFishNumbers.Add(fish.FishNumber); + fishTypeDict.TryGetValue(fish.FishNumber, out var ft); + + levelConfig.Fishes.Add(new FishSpawnFish + { + FishNumber = fish.FishNumber, + FishWeight = fish.FishWeight > 0 ? fish.FishWeight : 1, + Times = fish.Times > 0 ? fish.Times : 8, + MaxCount = fish.MaxCount > 0 ? fish.MaxCount : 20, + FishType = ft != null ? (int)ft.FishType : 0, + PathList = ft?.PathList ?? new List() + }); + } + } + + var processedArrayNumbers = new HashSet(); + + if (roomFishCfg.RoomFishLevelList != null) + { + foreach (var fish in roomFishCfg.RoomFishLevelList) + { + if (fish == null || fish.RoomLevel != roomLevel) continue; + if (fish.Type != 2) continue; + if (string.IsNullOrWhiteSpace(fish.FishNumber)) continue; + + if (!fishArrayDict.TryGetValue(fish.FishNumber, out var arrayCfg)) continue; + if (processedArrayNumbers.Contains(fish.FishNumber)) continue; + processedArrayNumbers.Add(fish.FishNumber); + + levelConfig.FishArrays.Add(new FishSpawnArray + { + FishArrayNumber = fish.FishNumber, + ArrayNumber = arrayCfg.ArrayNumber ?? string.Empty, + FishNumber = arrayCfg.FishNumber ?? string.Empty, + BossFishNumber = arrayCfg.BossFishNumber ?? string.Empty, + FishCount = arrayCfg.FishCount, + BossCount = arrayCfg.BoosCount, + GenerateFrequency = arrayCfg.GenerateFrequency + }); + } + } + + if (levelConfig.Probabilities.Count > 0 || levelConfig.Fishes.Count > 0) + { + result.Levels[levelKey] = levelConfig; + + } + } + + return result; + } + } +} diff --git a/CommonDomain/FishingKillConfig.cs b/CommonDomain/FishingKillConfig.cs new file mode 100644 index 0000000..336d290 --- /dev/null +++ b/CommonDomain/FishingKillConfig.cs @@ -0,0 +1,24 @@ +using CommonDomain.BaseModel; +using CommonDomain.Enum; + +namespace CommonDomain +{ + public class FishingKillConfig + { + public List FishTypeConfigs { get; set; } = new(); + public KillConfig KillConfig { get; set; } = new(); + public BossConfig BossConfigs { get; set; } = new(); + public BossDropConfig BossDropConfig { get; set; } = new(); + public List TorpedoConfigs { get; set; } = new(); + public bool BattleOrderIsOpen { get; set; } + } + + public class FishTypeBriefConfig + { + public string FishNumber { get; set; } = string.Empty; + public string FishName { get; set; } = string.Empty; + public FishTypeEnum FishType { get; set; } + public int FishScore { get; set; } + public int KillWeight { get; set; } + } +} diff --git a/CommonDomain/GameConfig.cs b/CommonDomain/GameConfig.cs new file mode 100644 index 0000000..f8ab8d8 --- /dev/null +++ b/CommonDomain/GameConfig.cs @@ -0,0 +1,174 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CommonDomain.BaseModel; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; + +namespace CommonDomain +{ + [BsonCollection("game_config", "data_0524")] + [BsonIgnoreExtraElements] + public class GameConfig : MongoBaseEntity + { + + [Column(TypeName = "jsonb")] + public List FishTypeConfigs { get; set; } = new List(); + + [Column(TypeName = "jsonb")] + public List RoomConfigs { get; set; } = new List(); + + [Column(TypeName = "jsonb")] + public List RoomFishConfigs { get; set; } = new List(); + + [Column(TypeName = "jsonb")] + public List FishArrayConfigs { get; set; } = new List(); + + + [Column(TypeName = "jsonb")] + public List UserLevelConfigs { get; set; } = new List(); + + + [Column(TypeName = "jsonb")] + public List PropConfig { get; set; } = new List(); + + [Column(TypeName = "jsonb")] + public List PropFragments { get; set; } = new List(); + + + public List ScratchCardConfig { get; set; } = new List(); + + + [Column(TypeName = "jsonb")] + public List VipLevelConfigs { get; set; } = new List(); + + + + + [Column(TypeName = "jsonb")] + public KillConfig KillConfig { get; set; } = new KillConfig(); + + [Column(TypeName = "jsonb")] + public BossConfig BossConfigs { get; set; } = new BossConfig(); + + + [Column(TypeName = "jsonb")] + public ChessConfig ChessConfig { get; set; } = new ChessConfig(); + + [Column(TypeName = "jsonb")] + public FishRoomConfig FishRoomConfig { get; set; } = new FishRoomConfig(); + + public BossDropConfig BossDropConfig { get; set; } = new BossDropConfig(); + + [Column(TypeName = "jsonb")] + public List TorpedoConfigs { get; set; } = new(); + + public RobotKillConfig RobotKillConfig { get; set; } = new RobotKillConfig(); + + public BotConfig BotConfig { get; set; } = new BotConfig(); + } + + public class BotConfig + { + public bool Enabled { get; set; } = true; + public string AiState { get; set; } = "active"; + public double LuckFactor { get; set; } = 1.0; + public double StateRefreshInterval { get; set; } + public BotSkillConfig Skills { get; set; } = new(); + public BotBehaviorConfig ActiveBehavior { get; set; } = new(); + public BotBehaviorConfig IdleBehavior { get; set; } = new(); + public BotBehaviorConfig AggressiveBehavior { get; set; } = new(); + public BotMultiplierConfig Multiplier { get; set; } = new(); + public BotBossStrategyConfig BossStrategy { get; set; } = new(); + public BotExitConfig ExitCondition { get; set; } = new(); + } + + public class BotSkillConfig + { + public double SkillRefreshInterval { get; set; } = 10; + public double LockProb { get; set; } + public double LockMinTime { get; set; } = 5; + public double LockMaxTime { get; set; } = 20; + public double FrenzyProb { get; set; } = 0.3; + public double FrenzyMinTime { get; set; } = 3; + public double FrenzyMaxTime { get; set; } = 8; + public double TripleProb { get; set; } = 0.5; + public double TripleMinTime { get; set; } = 4; + public double TripleMaxTime { get; set; } = 12; + public double DoubleProb { get; set; } + public double DoubleMinTime { get; set; } = 3; + public double DoubleMaxTime { get; set; } = 6; + } + + public class BotBehaviorConfig + { + public double FireIntervalMin { get; set; } = 0.3; + public double FireIntervalMax { get; set; } = 1.2; + public double FireProb { get; set; } = 0.9; + public double RotateSpeed { get; set; } = 80; + public double TargetHoldTimeMin { get; set; } = 2; + public double TargetHoldTimeMax { get; set; } = 5; + public double TargetSwitchChance { get; set; } = 0.7; + public double TargetPreferHighScore { get; set; } + public bool CanTargetBoss { get; set; } = true; + public bool CanTargetSpecial { get; set; } = true; + } + + public class BotMultiplierConfig + { + public int InitialLevelIndex { get; set; } + public double DecreaseThreshold { get; set; } = 0.5; + public double IncreaseThreshold { get; set; } = 1.5; + public int Step { get; set; } = 1; + public double CheckInterval { get; set; } = 3; + public int MinLevelIndex { get; set; } + public int MaxLevelIndex { get; set; } = -1; + } + + public class BotBossStrategyConfig + { + public List BossFishTypes { get; set; } = new() { 2, 5 }; + public bool ScatterWhenNoBoss { get; set; } = true; + public double TripleShotProb { get; set; } = 0.5; + public bool PreferMaxMultiplierBoss { get; set; } = true; + public int ScatterModeThreshold { get; set; } = 3; + public double FrenzyProb { get; set; } = 0.6; + public double FrenzyMinTime { get; set; } = 3; + public double FrenzyMaxTime { get; set; } = 8; + } + + public class BotExitConfig + { + public long ExitWhenGoldAbove { get; set; } + public long ExitWhenGoldBelow { get; set; } = 100; + public double CheckInterval { get; set; } = 5; + public bool SendLeaveRoom { get; set; } = true; + public bool ShowWaitingAfterExit { get; set; } = true; + } + + public class RobotKillConfig + { + public bool IsEnabled { get; set; } + public int IntervalSeconds { get; set; } = 5; + public List Scenes { get; set; } = new(); + } + + public class RobotKillScene + { + public string GameName { get; set; } = ""; + public string LevelName { get; set; } = ""; + public int GameType { get; set; } + public int RoomLevel { get; set; } + public int Weight { get; set; } = 1; + public string FishName { get; set; } = ""; + public string FishNumber { get; set; } = ""; + public int MultiplierMin { get; set; } = 500; + public int MultiplierMax { get; set; } = 2000; + public long JackpotMin { get; set; } = 5000000; + public long JackpotMax { get; set; } = 200000000; + } +} diff --git a/CommonDomain/GameTask.cs b/CommonDomain/GameTask.cs new file mode 100644 index 0000000..72cf9ef --- /dev/null +++ b/CommonDomain/GameTask.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CommonDomain.BaseModel; +using CommonDomain.Enum; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; + +namespace CommonDomain +{ + [BsonCollection("game_task", "data_0524")] + [BsonIgnoreExtraElements] + public class GameTask : MongoBaseEntity + { + + public int State { get; set; } = 1; + public string Number { get; set; } + + public string Remark { get; set; } + + public TaskType TaskType { get; set; } + public TaskEvent TaskEvent { get; set; } + public int TaskCount { get; set; } + + public long Exp { get; set; } + } +} diff --git a/CommonDomain/IPendingSettlementService.cs b/CommonDomain/IPendingSettlementService.cs new file mode 100644 index 0000000..7cac81d --- /dev/null +++ b/CommonDomain/IPendingSettlementService.cs @@ -0,0 +1,11 @@ +using System.Threading.Tasks; + +namespace CommonDomain +{ + public interface IPendingSettlementService + { + Task SettleGoldAsync(string userId); + + Task CleanupRoomAsync(string userId, bool force = false); + } +} diff --git a/CommonDomain/KillAnnounceParam.cs b/CommonDomain/KillAnnounceParam.cs new file mode 100644 index 0000000..4b502cb --- /dev/null +++ b/CommonDomain/KillAnnounceParam.cs @@ -0,0 +1,13 @@ +namespace CommonDomain +{ + public class KillAnnounceParam + { + public string UserName { get; set; } + public string GameTypeName { get; set; } + public string RoomName { get; set; } + public string FishName { get; set; } + public int Multiple { get; set; } + public long Gold { get; set; } + public long Timestamp { get; set; } + } +} diff --git a/CommonDomain/LotteryActivityConfig.cs b/CommonDomain/LotteryActivityConfig.cs new file mode 100644 index 0000000..a57a743 --- /dev/null +++ b/CommonDomain/LotteryActivityConfig.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using CommonDomain.BaseModel; +using MongoDB.Bson.Serialization.Attributes; +using MongoDB.Bson.Serialization.Options; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; + +namespace CommonDomain +{ + [BsonIgnoreExtraElements] + public class LotteryActivityConfig + { + public string ActivityName { get; set; } = string.Empty; + + public bool IsOpen { get; set; } = false; + + public long StartTime { get; set; } = 0; + + public long EndTime { get; set; } = 0; + + public List Pools { get; set; } = new List(); + + [BsonDictionaryOptions(DictionaryRepresentation.ArrayOfDocuments)] + public Dictionary> CostsByPool { get; set; } = new Dictionary>(); + + public int UserMaxDraw { get; set; } = 100; + } + + public class LotteryPoolLevel + { + public int PoolType { get; set; } = 1; + + public string Level { get; set; } = string.Empty; + + public int Count { get; set; } = 0; + + public int Weight { get; set; } = 10; + + public List PrizeList { get; set; } = new List(); + } + + public class LotteryPrize + { + public string PrizeId { get; set; } = string.Empty; + + public string Name { get; set; } = string.Empty; + + public string Icon { get; set; } = string.Empty; + + public int Type { get; set; } = 1; + + public long Count { get; set; } = 0; + + public string OtherId { get; set; } = string.Empty; + + public BaseProduct? Product { get; set; } + + public int Weight { get; set; } = 10; + + public int TotalCount { get; set; } = 0; + + public int DrawnCount { get; set; } = 0; + } + + +} diff --git a/CommonDomain/LotteryPrizeProductHelper.cs b/CommonDomain/LotteryPrizeProductHelper.cs new file mode 100644 index 0000000..e798c42 --- /dev/null +++ b/CommonDomain/LotteryPrizeProductHelper.cs @@ -0,0 +1,45 @@ +using CommonDomain.BaseModel; + +namespace CommonDomain; + +public static class LotteryPrizeProductHelper +{ + public static void Enrich(LotteryActivityConfig? lottery, GameConfig? gameConfig) + { + if (lottery?.Pools == null || gameConfig == null) return; + + foreach (var prize in lottery.Pools.SelectMany(pool => pool.PrizeList ?? new List())) + { + if (string.IsNullOrWhiteSpace(prize.OtherId)) continue; + + var number = prize.OtherId.Trim(); + var fragment = gameConfig.PropFragments?.FirstOrDefault(item => item.Number == number); + BaseProduct? product; + if (fragment != null) + { + prize.Type = 4; + product = fragment; + } + else + { + product = gameConfig.PropConfig?.FirstOrDefault(item => item.Number == number); + if (product == null) continue; + prize.Type = 3; + } + + var imageUrl = product.ImageUrl; + if (string.IsNullOrWhiteSpace(imageUrl) && fragment != null) + imageUrl = gameConfig.PropConfig?.FirstOrDefault(item => item.Number == fragment.ProductNumber)?.ImageUrl ?? ""; + + if (string.IsNullOrWhiteSpace(prize.Name)) prize.Name = product.Name; + if (!string.IsNullOrWhiteSpace(imageUrl)) prize.Icon = imageUrl; + prize.Product ??= new BaseProduct(); + prize.Product.Number = product.Number; + prize.Product.Name = product.Name; + prize.Product.Desc = product.Desc; + prize.Product.ImageUrl = imageUrl; + prize.Product.Type = product.Type; + prize.Product.Level = product.Level; + } + } +} diff --git a/CommonDomain/TopicKeys.cs b/CommonDomain/TopicKeys.cs new file mode 100644 index 0000000..6acce17 --- /dev/null +++ b/CommonDomain/TopicKeys.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CommonDomain +{ + public static class TopicKeys + { + + public const string 任务完成 = "Topic_0524_CompletedTask"; + + public const string 用户资产变更 = "Topic_0524_UserAssetsChanged"; + + public const string 游戏金币结算 = "Topic_0524_GameCoinsSettlement"; + public const string 用户升级 = "Topic_0524_UserLevel"; + + public const string 击杀鱼日志 = "Topic_0524_KillFishLog"; + + public const string 房间变化 = "Topic_0524_RoomChage"; + + public const string 全局击杀公告 = "Topic_0524_GlobalKillAnnounce"; + + public const string 玩家踢出 = "Topic_0524_PlayerKicked"; + + public const string 用户资产同步前端 = "Topic_0524_UserAssetSyncFrontend"; + + public const string 因子变更 = "Topic_0524_PlayerFactorChanged"; + + public const string 配置变更 = "Topic_0524_ConfigChanged"; + + public const string 登录绑定 = "Topic_0524_LoginBind"; + + public const string 拒绝回房 = "Topic_0524_DismissPendingRoom"; + + public const string 登录结果通知 = "Topic_0524_LoginBindResult"; + + public const string 临时强制出鱼 = "Topic_0524_TempSpawnFish"; + + public const string 召唤卡出鱼 = "Topic_0524_SummonCardFish"; + + public const string 后台踢出象棋玩家 = "Topic_0524_AdminKickChessPlayer"; + + } +} diff --git a/CommonService/ApiLogService.cs b/CommonService/ApiLogService.cs new file mode 100644 index 0000000..af6cdae --- /dev/null +++ b/CommonService/ApiLogService.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CommonDomain; +using MongoRepository; + +namespace CommonService +{ + public class ApiLogService : MongoBaseService, IApiLogService + { + private readonly IMongoBaseRepository _dal; + public ApiLogService(IMongoBaseRepository dal) + { + _dal = dal; + base.baseDal = dal; + } + } +} diff --git a/CommonService/BackgroundOperation/BackgroundOperationRequest.cs b/CommonService/BackgroundOperation/BackgroundOperationRequest.cs new file mode 100644 index 0000000..3b2f1d9 --- /dev/null +++ b/CommonService/BackgroundOperation/BackgroundOperationRequest.cs @@ -0,0 +1,13 @@ +namespace CommonService.BackgroundOperation +{ + public class BackgroundOperationRequest + { + public string TargetUserId { get; set; } + + public int CurrencyType { get; set; } + + public long Amount { get; set; } + + public string Remark { get; set; } = ""; + } +} diff --git a/CommonService/BackgroundOperationService.cs b/CommonService/BackgroundOperationService.cs new file mode 100644 index 0000000..78b00e5 --- /dev/null +++ b/CommonService/BackgroundOperationService.cs @@ -0,0 +1,259 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Threading.Tasks; +using Common; +using CommonDomain; +using CommonDomain.BaseModel; +using Domain.Admin.Admin; +using DotNetCore.CAP; +using Microsoft.Extensions.Logging; +using MongoDB.Driver; +using MongoRepository; +using RedisService; +using UserDomain.Entity; +using UserService.User; +using UserService.Param; +using UserDomain.Enum; + +namespace CommonService +{ + public class BackgroundOperationService : IBackgroundOperationService + { + private readonly IMongoBaseRepository _logRepo; + private readonly IUserService _userService; + private readonly ICapPublisher _capPublisher; + private readonly IMongoBaseRepository _adminRepo; + private readonly IRedisService _redisService; + private readonly ILogger _logger; + + public BackgroundOperationService( + IMongoBaseRepository logRepo, + IUserService userService, + ICapPublisher capPublisher, + IMongoBaseRepository adminRepo, + IRedisService redisService, + ILogger logger) + { + _logRepo = logRepo; + _userService = userService; + _capPublisher = capPublisher; + _adminRepo = adminRepo; + _redisService = redisService; + _logger = logger; + } + + public async Task<(bool success, string message)> Charge( + string adminUserId, string targetUserId, int currencyType, long amount, string remark) + { + var targetUser = await _userService.GetUser(targetUserId); + if (targetUser == null) + return (false, "目标用户不存在"); + + var isBuiltInAdmin = adminUserId == "administrator"; + var adminUser = isBuiltInAdmin + ? new SystemUser { Id = "administrator", UserName = "administrator" } + : await _adminRepo.FindByIdAsync(adminUserId); + if (adminUser == null) + return (false, "管理员用户不存在"); + + if (currencyType == 1) + { + targetUser.Assets.Gold += amount; + } + else if (currencyType == 2) + { + targetUser.Assets.Diamond += (int)amount; + var rechargeMoney = amount / 100.0; + targetUser.Static.TotalRecharge += rechargeMoney; + try + { + var gameConfig = _redisService.GetGameConfig(); + var newVipLevels = targetUser.VipLevelVerify(gameConfig); + if (newVipLevels != null && newVipLevels.Count > 0) + { + var levelNames = string.Join(",", newVipLevels); + _capPublisher.Publish("VipLevelUp", new + { + UserId = targetUserId, + NewLevels = newVipLevels, + Remark = $"后台充值钻石触发VIP升级: {levelNames}" + }); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "后台充值更新VIP失败 userId={UserId}", targetUserId); + } + } + else + { + return (false, "不支持的货币类型"); + } + + await _userService.UpdateUser(targetUser); + + var logId = ""; + if (!isBuiltInAdmin) + { + var log = new BackgroundOperationLog + { + AdminUserId = adminUserId, + AdminUserName = adminUser.UserName ?? adminUserId, + TargetUserId = targetUserId, + TargetUserName = targetUser.BaseInfo.UserName, + OperationType = 1, + CurrencyType = currencyType, + Amount = amount, + Remark = remark, + OperationTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds() + }; + await _logRepo.InsertOneAsync(log); + logId = log.Id; + } + + _capPublisher.Publish("UserAssetChange", new UserAssetParam + { + UserId = targetUserId, + ChangeType = UserAssetChangeTypeEnum.增加, + Gold = currencyType == 1 ? amount : 0, + Diamond = currencyType == 2 ? (int)amount : 0, + Source = RewardSource.后台操作, + Remark = $"后台充值:{remark}", + OtherId = logId, + RoomName = "后台操作", + RoomInfo = "后台充值" + }); + + _capPublisher.Publish("BackgroundOperation.NotifyUser", new BackgroundOperationNotifyMessage + { + UserId = targetUserId, + CurrencyType = currencyType, + ChangeType = 1, + Amount = amount, + NewGold = targetUser.Assets.Gold, + NewDiamond = targetUser.Assets.Diamond, + Source = "后台充值", + Remark = remark + }); + + return (true, "充值成功"); + } + + public async Task<(bool success, string message)> Deduct( + string adminUserId, string targetUserId, int currencyType, long amount, string remark) + { + var targetUser = await _userService.GetUser(targetUserId); + if (targetUser == null) + return (false, "目标用户不存在"); + + if (currencyType == 1) + { + if (targetUser.Assets.Gold < amount) + return (false, "用户金币余额不足"); + } + else if (currencyType == 2) + { + if (targetUser.Assets.Diamond < amount) + return (false, "用户钻石余额不足"); + } + else + { + return (false, "不支持的货币类型"); + } + + var isBuiltInAdmin2 = adminUserId == "administrator"; + var adminUser = isBuiltInAdmin2 + ? new SystemUser { Id = "administrator", UserName = "administrator" } + : await _adminRepo.FindByIdAsync(adminUserId); + var adminUserName = adminUser?.UserName ?? adminUserId; + + if (currencyType == 1) + { + targetUser.Assets.Gold -= amount; + } + else if (currencyType == 2) + { + targetUser.Assets.Diamond -= (int)amount; + } + + await _userService.UpdateUser(targetUser); + + var logId2 = ""; + if (!isBuiltInAdmin2) + { + var log = new BackgroundOperationLog + { + AdminUserId = adminUserId, + AdminUserName = adminUserName, + TargetUserId = targetUserId, + TargetUserName = targetUser.BaseInfo.UserName, + OperationType = 2, + CurrencyType = currencyType, + Amount = amount, + Remark = remark, + OperationTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds() + }; + await _logRepo.InsertOneAsync(log); + logId2 = log.Id; + } + + _capPublisher.Publish("UserAssetChange", new UserAssetParam + { + UserId = targetUserId, + ChangeType = UserAssetChangeTypeEnum.减少, + Gold = currencyType == 1 ? amount : 0, + Diamond = currencyType == 2 ? (int)amount : 0, + Source = RewardSource.后台操作, + Remark = $"后台扣除:{remark}", + OtherId = logId2, + RoomName = "后台操作", + RoomInfo = "后台扣除" + }); + + _capPublisher.Publish("BackgroundOperation.NotifyUser", new BackgroundOperationNotifyMessage + { + UserId = targetUserId, + CurrencyType = currencyType, + ChangeType = 2, + Amount = amount, + NewGold = targetUser.Assets.Gold, + NewDiamond = targetUser.Assets.Diamond, + Source = "后台扣除", + Remark = remark + }); + + return (true, "扣除成功"); + } + + public async Task<(List data, int total)> QueryLogs( + string? adminUserId = null, + string? targetUserId = null, + int? operationType = null, + int pageIndex = 1, + int pageSize = 20) + { + var where = LinqExtensions.True(); + if (!string.IsNullOrEmpty(adminUserId)) + where = where.And(l => l.AdminUserId == adminUserId); + if (!string.IsNullOrEmpty(targetUserId)) + where = where.And(l => l.TargetUserId == targetUserId); + if (operationType.HasValue) + where = where.And(l => l.OperationType == operationType.Value); + + var total = await _logRepo.CountAsync(where); + var (count, list) = await _logRepo.QueryPageAsync(where, l => l.OperationTime, false, pageSize, pageIndex); + + return (list, (int)total); + } + + public async Task SearchUser(string keyword) + { + var user = await _userService.SearchUser(keyword); + + + return user; + } + } +} diff --git a/CommonService/CommonService.csproj b/CommonService/CommonService.csproj new file mode 100644 index 0000000..dadb4aa --- /dev/null +++ b/CommonService/CommonService.csproj @@ -0,0 +1,23 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + + + + diff --git a/CommonService/HubSend.cs b/CommonService/HubSend.cs new file mode 100644 index 0000000..71624f8 --- /dev/null +++ b/CommonService/HubSend.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using Common; +using Common.Utils; +using CommonDomain; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.Logging; +using RedisService; +using StackExchange.Redis; + +namespace CommonService +{ + public class HubSend : IHubSend where T : Hub + { + private readonly ILogger> _logger; + private readonly IHubContext _pushHub; + private readonly IRedisService _cache; + + public HubSend(ILogger> logger, IHubContext pushHub, IRedisService cache) + { + _logger = logger; + _pushHub = pushHub; + _cache = cache; + } + + public void SendUserUserId(string userId, string methon, object obj) + { + var userRedis = _cache.GetRedisUserCId(userId); + if (userRedis != null) + { + SendUserCId(userRedis.CId, methon, obj); + } + } + + public void SendUserUserIds(List userIds, string methon, object obj) + { + foreach (var item in userIds) + { + var userRedis = _cache.GetRedisUserCId(item); + if (userRedis != null) + { + SendUserCId(userRedis.CId, methon, obj); + } + } + } + + public void SendUserCId(string cid, string methon, object obj) + { + ObserveSend(_pushHub.Clients.Client(cid).SendAsync(methon, obj), methon); + } + + public Task SendUserCIdAsync(string cid, string method, object obj) + { + return _pushHub.Clients.Client(cid).SendAsync(method, obj); + } + + public void SendUserCIds(List cids, string methon, object obj) + { + ObserveSend(_pushHub.Clients.Clients(cids).SendAsync(methon, obj), methon); + } + + public void SendGroup(string groupId, string method, object obj) + { + ObserveSend(_pushHub.Clients.Group(groupId).SendAsync(method, obj), method); + } + + public Task SendGroupAsync(string groupId, string method, object obj) + { + return _pushHub.Clients.Group(groupId).SendAsync(method, obj); + } + + public void RemoveGroup(string cid, string groupId) + { + _pushHub.Groups.RemoveFromGroupAsync(cid, groupId).GetAwaiter().GetResult(); + } + + public void GroupExcept(string cid, string groupId, string method, object obj) + { + ObserveSend(_pushHub.Clients.GroupExcept(groupId, cid).SendAsync(method, obj), method); + } + + public Task GroupExceptAsync(string cid, string groupId, string method, object obj) + { + return _pushHub.Clients.GroupExcept(groupId, cid).SendAsync(method, obj); + } + + public void AddGroup(string cid, string groupId) + { + _pushHub.Groups.AddToGroupAsync(cid, groupId).GetAwaiter().GetResult(); + } + + public void SendAll(string method, object obj) + { + ObserveSend(_pushHub.Clients.All.SendAsync(method, obj), method); + } + + private void ObserveSend(Task sendTask, string method) + { + if (sendTask.IsCompletedSuccessfully) + return; + + _ = sendTask.ContinueWith( + task => _logger.LogWarning(task.Exception, "SignalR 消息发送失败: {Method}", method), + CancellationToken.None, + TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.ExecuteSynchronously, + TaskScheduler.Default); + } + } +} diff --git a/CommonService/IApiLogService.cs b/CommonService/IApiLogService.cs new file mode 100644 index 0000000..9f778c5 --- /dev/null +++ b/CommonService/IApiLogService.cs @@ -0,0 +1,8 @@ +using CommonDomain; + +namespace CommonService +{ + public interface IApiLogService : IMongoBaseService + { + } +} diff --git a/CommonService/IBackgroundOperationService.cs b/CommonService/IBackgroundOperationService.cs new file mode 100644 index 0000000..dd7a432 --- /dev/null +++ b/CommonService/IBackgroundOperationService.cs @@ -0,0 +1,24 @@ +using System.Threading.Tasks; +using CommonDomain; +using UserDomain.Entity; + +namespace CommonService +{ + public interface IBackgroundOperationService + { + Task<(bool success, string message)> Charge( + string adminUserId, string targetUserId, int currencyType, long amount, string remark); + + Task<(bool success, string message)> Deduct( + string adminUserId, string targetUserId, int currencyType, long amount, string remark); + + Task<(List data, int total)> QueryLogs( + string? adminUserId = null, + string? targetUserId = null, + int? operationType = null, + int pageIndex = 1, + int pageSize = 20); + + Task SearchUser(string keyword); + } +} diff --git a/CommonService/IHubSend.cs b/CommonService/IHubSend.cs new file mode 100644 index 0000000..4608b75 --- /dev/null +++ b/CommonService/IHubSend.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CommonService +{ + public interface IHubSend + { + void SendUserUserId(string userId, string methon, object obj); + + void SendUserUserIds(List userIds, string methon, object obj); + + + + void SendUserCId(string cid, string methon, object obj); + + Task SendUserCIdAsync(string cid, string method, object obj); + + void SendUserCIds(List cids, string methon, object obj); + void SendGroup(string groupId, string method, object obj); + + Task SendGroupAsync(string groupId, string method, object obj); + + void RemoveGroup(string cid, string groupId); + + void GroupExcept(string cid, string groupId, string method, object obj); + + Task GroupExceptAsync(string cid, string groupId, string method, object obj); + + void AddGroup(string cid, string groupId); + + + void SendAll(string method, object obj); + } +} diff --git a/CommonService/ILotteryService.cs b/CommonService/ILotteryService.cs new file mode 100644 index 0000000..fb031e2 --- /dev/null +++ b/CommonService/ILotteryService.cs @@ -0,0 +1,17 @@ +using System.Threading.Tasks; +using CommonDomain; +using UserDomain.Entity; + +namespace CommonService +{ + public interface ILotteryService + { + + + Task GetUserStatus(string userId); + + Task<(bool success, string message, LotteryPrize? prize, long cost)> Draw(string userId); + + Task> GetUserDrawnPrizes(string userId); + } +} diff --git a/CommonService/IMongoBaseService.cs b/CommonService/IMongoBaseService.cs new file mode 100644 index 0000000..c1efe3b --- /dev/null +++ b/CommonService/IMongoBaseService.cs @@ -0,0 +1,69 @@ +using System.Linq.Expressions; +using MongoDB.Bson; +using MongoDB.Driver; +using MongoRepository; + +namespace CommonService +{ + /// + /// + /// + /// + public interface IMongoBaseService where TDocument : MongoBaseEntity + { + IQueryable AsQueryable(); + + IEnumerable FilterBy( + Expression> filterExpression); + + IEnumerable FilterBy( + Expression> filterExpression, + Expression> projectionExpression); + + TDocument FindOne(Expression> filterExpression); + + Task FindOneAsync(Expression> filterExpression); + + TDocument FindById(string id); + + Task FindByIdAsync(string id); + + (long count, List list) QueryPage(Expression> filterExpression, Expression> orderExpression, bool desc, int pageSize, int pageIndex); + + Task<(long count, List list)> QueryPageAsync(Expression> filterExpression, Expression> orderExpression, bool desc, int pageSize, int pageIndex); + + (bool ok, string message) InsertOne(TDocument document); + + Task<(bool ok, string message)> InsertOneAsync(TDocument document); + + (bool ok, string message) InsertMany(ICollection documents); + + Task<(bool ok, string message)> InsertManyAsync(ICollection documents); + + (bool ok, string message) UpdateById(string id, UpdateDefinition updateDefinition); + + Task<(bool ok, string message)> UpdateByIdAsync(string id, UpdateDefinition updateDefinition); + + (bool ok, string message) UpdateMany(Expression> filterExpression, UpdateDefinition updateDefinition); + + Task<(bool ok, string message)> UpdateManyAsync(Expression> filterExpression, UpdateDefinition updateDefinition); + + (bool ok, string message) ReplaceOne(TDocument document); + + Task<(bool ok, string message)> ReplaceOneAsync(TDocument document); + + (bool ok, string message) DeleteOne(Expression> filterExpression); + + Task<(bool ok, string message)> DeleteOneAsync(Expression> filterExpression); + + (bool ok, string message) DeleteById(string id); + + Task<(bool ok, string message)> DeleteByIdAsync(string id); + + (bool ok, string message) DeleteMany(Expression> filterExpression); + + Task<(bool ok, string message)> DeleteManyAsync(Expression> filterExpression); + + Task> Aggregate(FilterDefinition filterExpression, ProjectionDefinition group); + } +} diff --git a/CommonService/Lottery/LotteryPrizeHandler.cs b/CommonService/Lottery/LotteryPrizeHandler.cs new file mode 100644 index 0000000..b8a9e0a --- /dev/null +++ b/CommonService/Lottery/LotteryPrizeHandler.cs @@ -0,0 +1,68 @@ +using System.Threading.Tasks; +using CommonDomain.BaseModel; +using CommonDomain.Enum; +using UserDomain.Entity; +using UserService.User; +using UserService.Param; +using UserDomain.Enum; +using CommonDomain; + +namespace CommonService.Lottery +{ + public class LotteryPrizeHandler + { + private readonly IUserService _userService; + + public LotteryPrizeHandler(IUserService userService) + { + _userService = userService; + } + + public async Task Handle(LotteryDrawMessage message) + { + var user = await _userService.GetUser(message.UserId); + if (user == null) + return; + + switch (message.Type) + { + case 1: + case 2: + await _userService.UpdateAssets(new UserAssetParam + { + UserId = user.Id, + ChangeType = UserAssetChangeTypeEnum.增加, + Gold = message.Type == 1 ? message.Count : 0, + Diamond = message.Type == 2 ? (int)message.Count : 0, + Source = RewardSource.活动奖励, + Remark = $"抽奖获得{(message.Type == 1 ? "金币" : "钻石")} x{message.Count}" + }); + break; + + case 3: + case 4: + if (!string.IsNullOrEmpty(message.OtherId)) + { + var param = new UserAssetParam + { + UserId = user.Id, + ChangeType = UserAssetChangeTypeEnum.增加, + RewardItems = new List + { + new BaseProductCount + { + Number = message.OtherId, + Count = (int)message.Count + } + }, + Source = RewardSource.活动奖励, + Remark = $"抽奖获得道具 x{message.Count}" + }; + await _userService.UpdateAssets(param); + } + break; + } + } + } + +} diff --git a/CommonService/LotteryService.cs b/CommonService/LotteryService.cs new file mode 100644 index 0000000..2f545fc --- /dev/null +++ b/CommonService/LotteryService.cs @@ -0,0 +1,253 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using MongoRepository; +using MongoDB.Driver; +using CommonDomain; +using UserDomain.Entity; +using UserService.User; +using DotNetCore.CAP; +using UserService.GameConfigs; + +namespace UserService +{ + public class LotteryService : ILotteryService + { + + + private readonly IMongoBaseRepository _recordRepo; + + private readonly IMongoBaseRepository _userStatusRepo; + + private readonly IUserService _userService; + + private readonly ICapPublisher _capPublisher; + private readonly IActivityConfigService _activityConfig; + + public LotteryService( + IMongoBaseRepository recordRepo, + IMongoBaseRepository userStatusRepo, + IUserService userService, + ICapPublisher capPublisher, IActivityConfigService activityConfig) + { + + _recordRepo = recordRepo; + _userStatusRepo = userStatusRepo; + _userService = userService; + _capPublisher = capPublisher; + _activityConfig = activityConfig; + + } + + + + public async Task GetUserStatus(string userId) + { + var activityConfig = await _activityConfig.Get(); + var activity = activityConfig?.LotteryActivityConfig; + var cycleKey = BuildCycleKey(activity); + var status = await _userStatusRepo.FindOneAsync(s => s.UserId == userId ); + if (status == null) + { + status = new LotteryUserStatus + { + UserId = userId, + ActivityCycleKey = cycleKey, + ActivityStartTime = activity?.StartTime ?? 0, + ActivityEndTime = activity?.EndTime ?? 0 + }; + await _userStatusRepo.InsertOneAsync(status); + } + else if (string.IsNullOrWhiteSpace(status.ActivityCycleKey)) + { + status.ActivityCycleKey = cycleKey; + status.ActivityStartTime = activity?.StartTime ?? 0; + status.ActivityEndTime = activity?.EndTime ?? 0; + await _userStatusRepo.ReplaceOneAsync(status); + } + else if (status.ActivityCycleKey != cycleKey) + { + status.ActivityCycleKey = cycleKey; + status.ActivityStartTime = activity?.StartTime ?? 0; + status.ActivityEndTime = activity?.EndTime ?? 0; + status.DrawnPrizeIds = new List(); + status.TotalDrawCount = 0; + status.DrawCountByPool = new Dictionary(); + status.IsFinished = false; + await _userStatusRepo.ReplaceOneAsync(status); + } + return status; + } + + public async Task<(bool success, string message, LotteryPrize? prize, long cost)> Draw(string userId, int poolType = 0) + { + if (poolType < 0 || poolType > 3) + return (false, "奖池类型错误", null, 0); + + var activityConfig = await _activityConfig.Get(); + if (activityConfig?.LotteryActivityConfig == null) + return (false, "活动不存在或未开启", null, 0); + var activity = activityConfig.LotteryActivityConfig; + + var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + if (activity.EndTime > 0 && now >= activity.EndTime) + return (false, "活动已结束", null, 0); + if (!activity.IsOpen) + return (false, "活动不存在或未开启", null, 0); + if (activity.StartTime > 0 && now < activity.StartTime) + return (false, "活动未开始", null, 0); + + var effectivePoolType = poolType == 0 ? 1 : poolType; + var selectedPools = activity.Pools.Where(p => p.PoolType == effectivePoolType).ToList(); + if (selectedPools.Count == 0) + return (false, "未配置对应奖池", null, 0); + + var userStatus = await GetUserStatus(userId ); + if (userStatus.IsFinished) + return (false, "您已抽完所有奖项,活动结束", null, 0); + + if (activity.UserMaxDraw > 0 && userStatus.TotalDrawCount >= activity.UserMaxDraw) + return (false, "已达最大抽奖次数", null, 0); + + if (activity.CostsByPool?.TryGetValue(effectivePoolType, out var configuredCosts) != true + || configuredCosts == null || configuredCosts.Count == 0) + return (false, "未配置当前奖池抽奖消耗", null, 0); + userStatus.DrawCountByPool ??= new Dictionary(); + var poolDrawCount = userStatus.DrawCountByPool.GetValueOrDefault(effectivePoolType); + var costIndex = Math.Min(poolDrawCount, configuredCosts.Count - 1); + var cost = configuredCosts[costIndex]; + + var user = await _userService.GetUser(userId); + if (user == null) + return (false, "用户不存在", null, 0); + if (user.Assets.Gold < cost) + return (false, "金币不足", null, 0); + + var level = DrawLevel(selectedPools); + if (level == null) + return (false, "奖池已空", null, 0); + + var prize = DrawPrize(level, userStatus.DrawnPrizeIds); + if (prize == null) + { + prize = DrawPrizeFromAll(selectedPools, userStatus.DrawnPrizeIds); + if (prize == null) + return (false, "所有奖项已抽完", null, 0); + level = selectedPools.FirstOrDefault(p => p.PrizeList.Any(x => x.PrizeId == prize.PrizeId)); + } + + if (prize.TotalCount > 0 && prize.DrawnCount >= prize.TotalCount) + return (false, "该奖项已抽完", null, 0); + + user.Assets.Gold -= cost; + await _userService.UpdateUser(user); + + var record = new LotteryRecord + { + ActivityCycleKey = BuildCycleKey(activity), + UserId = userId, + PrizeId = prize.PrizeId, + Level = level.Level, + Cost = cost, + DrawTime = now + }; + await _recordRepo.InsertOneAsync(record); + + userStatus.DrawnPrizeIds.Add(prize.PrizeId); + userStatus.TotalDrawCount++; + userStatus.DrawCountByPool[effectivePoolType] = poolDrawCount + 1; + + var allPrizeIds = activity.Pools.SelectMany(p => p.PrizeList).Select(x => x.PrizeId).ToList(); + if (allPrizeIds.All(id => userStatus.DrawnPrizeIds.Contains(id))) + { + userStatus.IsFinished = true; + } + await _userStatusRepo.ReplaceOneAsync(userStatus); + + prize.DrawnCount++; + + _capPublisher.Publish("Lottery.DrawPrize", new LotteryDrawMessage + { + UserId = userId, + PrizeId = prize.PrizeId, + PrizeName = prize.Name, + Type = prize.Type, + Count = prize.Count, + OtherId = prize.OtherId + }); + + return (true, "抽奖成功", prize, cost); + } + + private LotteryPoolLevel? DrawLevel(List pools) + { + var availablePools = pools.Where(p => + p.PrizeList.Any(x => x.TotalCount == 0 || x.DrawnCount < x.TotalCount)).ToList(); + if (!availablePools.Any()) + return null; + + long totalWeight = availablePools.Sum(p => (long)p.Weight); + if (totalWeight <= 0) + return null; + var random = new Random(); + long randomValue = random.NextInt64(0, totalWeight); + long currentWeightSum = 0; + + foreach (var pool in availablePools) + { + currentWeightSum += pool.Weight; + if (randomValue < currentWeightSum) + return pool; + } + return availablePools.LastOrDefault(); + } + + private LotteryPrize? DrawPrize(LotteryPoolLevel level, List drawnPrizeIds) + { + var availablePrizes = level.PrizeList + .Where(p => !drawnPrizeIds.Contains(p.PrizeId) && + (p.TotalCount == 0 || p.DrawnCount < p.TotalCount)) + .ToList(); + if (!availablePrizes.Any()) + return null; + + int totalWeight = availablePrizes.Sum(p => p.Weight); + if (totalWeight <= 0) + return null; + var random = new Random(); + int randomValue = random.Next(0, totalWeight); + int currentWeightSum = 0; + + foreach (var prize in availablePrizes) + { + currentWeightSum += prize.Weight; + if (randomValue < currentWeightSum) + return prize; + } + return availablePrizes.LastOrDefault(); + } + + private LotteryPrize? DrawPrizeFromAll(List pools, List drawnPrizeIds) + { + foreach (var pool in pools.OrderByDescending(p => p.Weight)) + { + var prize = DrawPrize(pool, drawnPrizeIds); + if (prize != null) + return prize; + } + return null; + } + + public async Task> GetUserDrawnPrizes(string userId) + { + var status = await GetUserStatus(userId); + return status?.DrawnPrizeIds ?? new List(); + } + + private static string BuildCycleKey(LotteryActivityConfig? activity) + { + return activity == null ? "0:0" : $"{activity.StartTime}:{activity.EndTime}"; + } + } +} diff --git a/CommonService/MongoBaseService.cs b/CommonService/MongoBaseService.cs new file mode 100644 index 0000000..582b10f --- /dev/null +++ b/CommonService/MongoBaseService.cs @@ -0,0 +1,144 @@ +using System.Linq.Expressions; +using MongoDB.Bson; +using MongoDB.Driver; +using MongoRepository; + +namespace CommonService +{ + public class MongoBaseService : IMongoBaseService where TDocument : MongoBaseEntity, new() + { + public IMongoBaseRepository baseDal; + + public virtual IQueryable AsQueryable() + { + return baseDal.AsQueryable(); + } + + public virtual IEnumerable FilterBy( + Expression> filterExpression) + { + return baseDal.FilterBy(filterExpression); + } + + public virtual IEnumerable FilterBy( + Expression> filterExpression, + Expression> projectionExpression) + { + return baseDal.FilterBy(filterExpression, projectionExpression); + } + + public virtual TDocument FindOne(Expression> filterExpression) + { + return baseDal.FindOne(filterExpression); + } + + public virtual async Task FindOneAsync(Expression> filterExpression) + { + return await baseDal.FindOneAsync(filterExpression); + } + + public virtual TDocument FindById(string id) + { + return baseDal.FindById(id); + } + + public virtual async Task FindByIdAsync(string id) + { + return await baseDal.FindByIdAsync(id); + } + + public virtual (long count, List list) QueryPage(Expression> filterExpression, Expression> orderExpression, bool desc, int pageSize, int pageIndex) + { + return baseDal.QueryPage(filterExpression, orderExpression, desc, pageSize, pageIndex); + } + public virtual async Task<(long count, List list)> QueryPageAsync(Expression> filterExpression, Expression> orderExpression, bool desc, int pageSize, int pageIndex) + { + + return await baseDal.QueryPageAsync(filterExpression, orderExpression, desc, pageSize, pageIndex); + } + + public virtual (bool ok, string message) InsertOne(TDocument document) + { + return baseDal.InsertOne(document); + } + + public virtual async Task<(bool ok, string message)> InsertOneAsync(TDocument document) + { + return await baseDal.InsertOneAsync(document); + } + + public (bool ok, string message) InsertMany(ICollection documents) + { + return baseDal.InsertMany(documents); + } + + public virtual async Task<(bool ok, string message)> InsertManyAsync(ICollection documents) + { + return await baseDal.InsertManyAsync(documents); + } + + public virtual (bool ok, string message) UpdateById(string id, UpdateDefinition updateDefinition) + { + return baseDal.UpdateById(id, updateDefinition); + } + public virtual async Task<(bool ok, string message)> UpdateByIdAsync(string id, UpdateDefinition updateDefinition) + { + return await baseDal.UpdateByIdAsync(id, updateDefinition); + } + + public virtual (bool ok, string message) UpdateMany(Expression> filterExpression, UpdateDefinition updateDefinition) + { + return baseDal.UpdateMany(filterExpression, updateDefinition); + } + public virtual async Task<(bool ok, string message)> UpdateManyAsync(Expression> filterExpression, UpdateDefinition updateDefinition) + { + return await baseDal.UpdateManyAsync(filterExpression, updateDefinition); + } + + public (bool ok, string message) ReplaceOne(TDocument document) + { + return baseDal.ReplaceOne(document); + } + + public virtual async Task<(bool ok, string message)> ReplaceOneAsync(TDocument document) + { + return await baseDal.ReplaceOneAsync(document); + } + + public (bool ok, string message) DeleteOne(Expression> filterExpression) + { + return baseDal.DeleteOne(filterExpression); + } + + public async Task<(bool ok, string message)> DeleteOneAsync(Expression> filterExpression) + { + return await baseDal.DeleteOneAsync(filterExpression); + } + + public (bool ok, string message) DeleteById(string id) + { + return baseDal.DeleteById(id); + } + + public async Task<(bool ok, string message)> DeleteByIdAsync(string id) + { + + return await baseDal.DeleteByIdAsync(id); + } + + public (bool ok, string message) DeleteMany(Expression> filterExpression) + { + return baseDal.DeleteMany(filterExpression); + } + + public async Task<(bool ok, string message)> DeleteManyAsync(Expression> filterExpression) + { + return await baseDal.DeleteManyAsync(filterExpression); + } + public async Task> Aggregate(FilterDefinition filterExpression, ProjectionDefinition group) + { + return await baseDal.Aggregate(filterExpression, group); + } + + } +} diff --git a/CommonService/Subscribers/LotteryPrizeSubscriber.cs b/CommonService/Subscribers/LotteryPrizeSubscriber.cs new file mode 100644 index 0000000..0c9f2f9 --- /dev/null +++ b/CommonService/Subscribers/LotteryPrizeSubscriber.cs @@ -0,0 +1,21 @@ +using DotNetCore.CAP; +using CommonDomain; + +namespace CommonService.Lottery +{ + public class LotteryPrizeSubscriber : ICapSubscribe + { + private readonly LotteryPrizeHandler _handler; + + public LotteryPrizeSubscriber(LotteryPrizeHandler handler) + { + _handler = handler; + } + + [CapSubscribe("Lottery.DrawPrize")] + public async Task HandleLotteryDrawPrize(LotteryDrawMessage message) + { + await _handler.Handle(message); + } + } +} diff --git a/CustomerSrc/CustomerApi/.dockerignore b/CustomerSrc/CustomerApi/.dockerignore new file mode 100644 index 0000000..fe1152b --- /dev/null +++ b/CustomerSrc/CustomerApi/.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/CustomerSrc/CustomerApi/Controllers/CustomerController.cs b/CustomerSrc/CustomerApi/Controllers/CustomerController.cs new file mode 100644 index 0000000..6948eb8 --- /dev/null +++ b/CustomerSrc/CustomerApi/Controllers/CustomerController.cs @@ -0,0 +1,157 @@ +using Common; +using CommonInfrastructure; +using CustomerService.Customer; +using CustomerService.Domain.Entity; +using CustomerService.Domain.Response; +using Microsoft.AspNetCore.Mvc; + +namespace CustomerApi.Controllers; + +[ApiController] +[Route("customerapi/[controller]")] +public class CustomerController : BaseController +{ + private readonly ICustomerService _customerService; + + public CustomerController(ICustomerService customerService) + { + _customerService = customerService; + } + + [HttpPost("start")] + public async Task> StartConversation([FromBody] StartConversationParam param) + { + var result = await _customerService.StartConversation(param.UserId, param.UserName); + if (result.isOk) + return this.ToResult(result.conversation); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("message")] + public async Task> SendMessage([FromBody] SendMessageParam param) + { + var result = await _customerService.SendMessage(param.ConversationId, param.SenderType, param.SenderId, param.SenderName, param.ContentType, param.Content, param.SenderAvatar); + if (result.isOk) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("messages/{conversationId}")] + public async Task> GetMessages(string conversationId) + { + var result = await _customerService.GetMessages(conversationId); + if (result.isOk) + return this.ToListResult(result.messages ?? new List()); + else + return this.ToListFailResult(result.msg); + } + + [HttpGet("conversations")] + public async Task> GetConversations([FromQuery] string? customerId) + { + var result = await _customerService.GetConversations(customerId); + if (result.isOk) + return this.ToListResult(result.conversations ?? new List()); + else + return this.ToListFailResult(result.msg); + } + + [HttpGet("my-conversations")] + public async Task> GetMyConversations() + { + var userId = loginUser.UserId; + var result = await _customerService.GetUserConversations(userId); + if (result.isOk) + return this.ToListResult(result.conversations ?? new List()); + else + return this.ToListFailResult(result.msg); + } + + [HttpPost("end")] + public async Task> EndConversation([FromBody] EndConversationParam param) + { + var result = await _customerService.EndConversation(param.ConversationId); + if (result.isOk) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + + [HttpGet("online")] + public async Task> GetOnlineCustomers() + { + var result = await _customerService.GetOnlineCustomers(); + if (result.isOk) + return this.ToListResult(result.customers ?? new List()); + else + return this.ToListFailResult(result.msg); + } + + [HttpPost("status")] + public async Task> UpdateCustomerStatus([FromBody] UpdateStatusParam param) + { + var result = await _customerService.UpdateCustomerStatus(param.UserId, param.Status); + if (result.isOk) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("mark-read")] + public async Task> MarkAsRead([FromBody] MarkReadParam param) + { + var result = await _customerService.MarkAsRead(param.CustomerId, param.UserId); + if (result.isOk) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("chatlog/{conversationId}")] + public async Task> GetChatLog(string conversationId) + { + var result = await _customerService.GetMessages(conversationId); + if (result.isOk) + return this.ToListResult(result.messages ?? new List()); + else + return this.ToListFailResult(result.msg); + } +} + +public class StartConversationParam +{ + public string UserId { get; set; } = ""; + public string UserName { get; set; } = ""; +} + +public class SendMessageParam +{ + public string ConversationId { get; set; } = ""; + public int SenderType { get; set; } + public string SenderId { get; set; } = ""; + public string SenderName { get; set; } = ""; + public string? SenderAvatar { get; set; } + public int ContentType { get; set; } + public string Content { get; set; } = ""; +} + +public class EndConversationParam +{ + public string ConversationId { get; set; } = ""; +} + +public class UpdateStatusParam +{ + public string UserId { get; set; } = ""; + public int Status { get; set; } +} + +public class MarkReadParam +{ + public string CustomerId { get; set; } = ""; + + public string UserId { get; set; } = ""; +} diff --git a/CustomerSrc/CustomerApi/Controllers/ImageUploadController.cs b/CustomerSrc/CustomerApi/Controllers/ImageUploadController.cs new file mode 100644 index 0000000..e5de0ef --- /dev/null +++ b/CustomerSrc/CustomerApi/Controllers/ImageUploadController.cs @@ -0,0 +1,40 @@ +using Common; +using Microsoft.AspNetCore.Mvc; + +namespace CustomerApi.Controllers +{ + [Route("customerapi/[controller]")] + [ApiController] + public class ImageUploadController : ControllerBase + { + public class ImageUploadResponse + { + public string Path { get; set; } = ""; + } + + [HttpPost("upload")] + public async Task> UploadFile(IFormFile file) + { + if (file == null || file.Length == 0) + { + return new BaseResponse + { + Code = CommonResponseCodeEnum.ParamError, + Info = "No file uploaded." + }; + } + var guid = Guid.NewGuid().ToString("N"); + var path = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/uploads", guid + Path.GetExtension(file.FileName)); + using (var stream = new FileStream(path, FileMode.Create)) + { + await file.CopyToAsync(stream); + } + return new BaseResponse + { + Code = CommonResponseCodeEnum.Success, + Info = "上传成功", + Data = new ImageUploadResponse { Path = $"uploads/{guid + Path.GetExtension(file.FileName)}" } + }; + } + } +} diff --git a/CustomerSrc/CustomerApi/CustomerApi.csproj b/CustomerSrc/CustomerApi/CustomerApi.csproj new file mode 100644 index 0000000..5df1998 --- /dev/null +++ b/CustomerSrc/CustomerApi/CustomerApi.csproj @@ -0,0 +1,23 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + + + + diff --git a/CustomerSrc/CustomerApi/Hubs/CustomerHub.cs b/CustomerSrc/CustomerApi/Hubs/CustomerHub.cs new file mode 100644 index 0000000..d457d17 --- /dev/null +++ b/CustomerSrc/CustomerApi/Hubs/CustomerHub.cs @@ -0,0 +1,159 @@ +using Microsoft.AspNetCore.SignalR; +using CustomerService.Customer; + +namespace CustomerApi.Hubs; + +public class CustomerHub : Hub +{ + private readonly ICustomerService _customerService; + + public CustomerHub(ICustomerService customerService) + { + _customerService = customerService; + } + + public async Task JoinConversation(string conversationId) + { + await Groups.AddToGroupAsync(Context.ConnectionId, conversationId); + } + + public async Task LeaveConversation(string conversationId) + { + await Groups.RemoveFromGroupAsync(Context.ConnectionId, conversationId); + } + + public async Task JoinCustomerQueue(string customerId) + { + if (!string.IsNullOrEmpty(customerId)) + await Groups.AddToGroupAsync(Context.ConnectionId, "customer_" + customerId); + } + + public async Task LeaveCustomerQueue(string customerId) + { + if (!string.IsNullOrEmpty(customerId)) + await Groups.RemoveFromGroupAsync(Context.ConnectionId, "customer_" + customerId); + } + + public async Task SendMessage(string conversationId, int senderType, string senderId, string senderName, string? senderAvatar, int contentType, string content, string guId = "") + { + try + { + if (string.IsNullOrEmpty(conversationId) && senderType == 1) + { + var startResult = await _customerService.StartConversation(senderId, senderName, senderAvatar); + if (startResult.isOk && startResult.conversation != null) + { + conversationId = startResult.conversation.Id; + await Groups.AddToGroupAsync(Context.ConnectionId, conversationId); + + if (!string.IsNullOrEmpty(startResult.conversation.CustomerId)) + { + await Clients.Group("customer_" + startResult.conversation.CustomerId).SendAsync("OnNewConversation", new + { + conversationId = startResult.conversation.Id, + customerId = startResult.conversation.CustomerId, + customerName = startResult.conversation.CustomerName, + userId = startResult.conversation.UserId, + userName = startResult.conversation.UserName, + status = startResult.conversation.Status, + createTime = startResult.conversation.CreateTime + }); + } + } + else + { + await Clients.Caller.SendAsync("ErrorMessage", startResult.msg); + + } + } + + await Groups.AddToGroupAsync(Context.ConnectionId, conversationId); + + var result = await _customerService.SendMessage(conversationId, senderType, senderId, senderName, contentType, content, senderAvatar); + + if (result.isOk) + { + if (string.IsNullOrWhiteSpace(guId)) + guId = Guid.NewGuid().ToString("N"); + + await Clients.Group(conversationId).SendAsync("OnMessageReceived", new + { + GuId = guId, + ConversationId = conversationId, + SenderType = senderType, + SenderId = senderId, + SenderName = senderName, + SenderAvatar = senderAvatar, + ContentType = contentType, + Content = content, + CreateTime = DateTime.Now + }); + } + } + catch (Exception ex) + { + await Clients.Caller.SendAsync("ErrorMessage", ex.Message); + } + } + + public async Task StartConversation(string userId, string userName) + { + try + { + if (string.IsNullOrEmpty(userId) || string.IsNullOrEmpty(userName)) + { + await Clients.Caller.SendAsync("ErrorMessage", "参数错误"); + return; + } + + var result = await _customerService.StartConversation(userId, userName); + + if (result.isOk && result.conversation != null) + { + await Clients.Caller.SendAsync("OnConversationStarted", result.conversation); + + if (!string.IsNullOrEmpty(result.conversation.Id)) + { + await Groups.AddToGroupAsync(Context.ConnectionId, result.conversation.Id); + } + + if (!string.IsNullOrEmpty(result.conversation.CustomerId)) + { + await Clients.Group("customer_" + result.conversation.CustomerId).SendAsync("OnNewConversation", new + { + conversationId = result.conversation.Id, + customerId = result.conversation.CustomerId, + customerName = result.conversation.CustomerName, + userId = result.conversation.UserId, + userName = result.conversation.UserName, + status = result.conversation.Status, + createTime = result.conversation.CreateTime + }); + } + } + else + { + await Clients.Caller.SendAsync("ErrorMessage", result.msg); + } + } + catch (Exception ex) + { + await Clients.Caller.SendAsync("ErrorMessage", ex.Message); + } + } + + public override async Task OnConnectedAsync() + { + var userId = Context.User?.Claims?.FirstOrDefault(c => c.Type == "uid")?.Value; + if (!string.IsNullOrEmpty(userId)) + { + await Groups.AddToGroupAsync(Context.ConnectionId, "customer_" + userId); + } + await base.OnConnectedAsync(); + } + + public override async Task OnDisconnectedAsync(Exception? exception) + { + await base.OnDisconnectedAsync(exception); + } +} \ No newline at end of file diff --git a/CustomerSrc/CustomerApi/Program.cs b/CustomerSrc/CustomerApi/Program.cs new file mode 100644 index 0000000..aa8ec98 --- /dev/null +++ b/CustomerSrc/CustomerApi/Program.cs @@ -0,0 +1,12 @@ +namespace CustomerApi +{ + public partial class AssemblyMarker { } +} + +public class Program +{ + public static void Main(string[] args) + { + Console.WriteLine("CustomerApi is a library project. Use CustomerHost to run the application."); + } +} diff --git a/CustomerSrc/CustomerApi/Properties/launchSettings.json b/CustomerSrc/CustomerApi/Properties/launchSettings.json new file mode 100644 index 0000000..c67a9bf --- /dev/null +++ b/CustomerSrc/CustomerApi/Properties/launchSettings.json @@ -0,0 +1,12 @@ +{ + "profiles": { + "CustomerApi": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:8007/" + } + } +} \ No newline at end of file diff --git a/CustomerSrc/CustomerApi/wwwroot/uploads/e6f31921718c4a10aed90f483f005130.png b/CustomerSrc/CustomerApi/wwwroot/uploads/e6f31921718c4a10aed90f483f005130.png new file mode 100644 index 0000000..996bcec Binary files /dev/null and b/CustomerSrc/CustomerApi/wwwroot/uploads/e6f31921718c4a10aed90f483f005130.png differ diff --git a/CustomerSrc/CustomerHost/Config/system.json b/CustomerSrc/CustomerHost/Config/system.json new file mode 100644 index 0000000..43c7948 --- /dev/null +++ b/CustomerSrc/CustomerHost/Config/system.json @@ -0,0 +1,48 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "urls": "http://*:8006", + + "AllowedHosts": "*", + "JwtConfig": { + "TokenKey": "token", + "Issuer": "admin", + "Audience": "", + "SecretKey": "henanhuashengchongwuyouxiangongsikejizhongxin", + "ValidateIssuer": false, + "ValidateAudience": false, + "ValidateIssuerSigningKey": false, + "ValidateLifetime": false + }, + "ConnectionStrings": { + "PgSqlConnection": "host=localhost;database=data_0524;user id=data_0524;password=123456;" + }, + "CapConfig": { + "Host": "localhost", + "UserName": "admin", + "Password": "123456", + "VirtualHost": "/", + "PGLogHost": "host=localhost;database=data_0524;user id=data_0524;password=123456;" + }, + "RedisConfig": { + "Host": "localhost", + "Port": 6379, + "UserName": "", + "Password": "123456", + "Database": 1, + "ConnectionString": "localhost:6379,password=123456,defaultDatabase=2,abortConnect=false" + }, + "MongoDbSettings": { + "username": "root", + "password": "root23456", + "ServerUrl": "mongodb://localhost:27017" + }, + "CustomerService": { + "HubUrl": "/customerHub", + "MaxMessageSize": 65536 + } +} diff --git a/CustomerSrc/CustomerHost/CustomerHost.csproj b/CustomerSrc/CustomerHost/CustomerHost.csproj new file mode 100644 index 0000000..9cbbe8e --- /dev/null +++ b/CustomerSrc/CustomerHost/CustomerHost.csproj @@ -0,0 +1,45 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + + + + + + + + + + + + Always + + + Always + + + Always + + + + + + + + diff --git a/CustomerSrc/CustomerHost/Extension/CapExtension.cs b/CustomerSrc/CustomerHost/Extension/CapExtension.cs new file mode 100644 index 0000000..6593507 --- /dev/null +++ b/CustomerSrc/CustomerHost/Extension/CapExtension.cs @@ -0,0 +1,49 @@ +using DotNetCore.CAP.Messages; + +namespace CustomerHost.Extension +{ + public static class CapExtension + { + public static IServiceCollection AddCap(this IServiceCollection services, IConfiguration configuration) + { + services.AddCap(x => + { + x.UseDashboard(); + x.UseRabbitMQ(rb => + { + rb.HostName = configuration["CapConfig:Host"]; + rb.UserName = configuration["CapConfig:UserName"]; + rb.Password = configuration["CapConfig:Password"]; + rb.VirtualHost = configuration["CapConfig:VirtualHost"]; + rb.ExchangeName = "cap.exchange"; + }); + x.UsePostgreSql(op => + { + op.ConnectionString = configuration["CapConfig:PGLogHost"]; + op.Schema = "public"; + }); + + x.SucceedMessageExpiredAfter = 7 * 24 * 3600; + x.FailedRetryCount = 5; + x.FailedRetryInterval = 10; + x.FailedThresholdCallback = ObjFailedThresholdCallback; + + }); + return services; + } + + private static async void ObjFailedThresholdCallback(FailedInfo failed) + { + var exception = failed.Message.Headers["cap-exception"] ?? string.Empty; + var name = failed.Message.GetName(); + if (failed.MessageType == MessageType.Publish) + { + + } + else + { + + } + } + } +} diff --git a/CustomerSrc/CustomerHost/Middleware/ApiLoggingMiddleware.cs b/CustomerSrc/CustomerHost/Middleware/ApiLoggingMiddleware.cs new file mode 100644 index 0000000..1977fb7 --- /dev/null +++ b/CustomerSrc/CustomerHost/Middleware/ApiLoggingMiddleware.cs @@ -0,0 +1,156 @@ + +using System.Text; +using Common; +using CommonDomain; +using CommonService; +using Newtonsoft.Json; + +namespace CustomerHost.Middleware +{ + public class ApiLoggingMiddleware + { + private readonly RequestDelegate _next; + private readonly ILogger _logger; + private readonly IApiLogService _apiLogService; + + public ApiLoggingMiddleware(RequestDelegate next, ILogger logger, IApiLogService apiLogService) + { + _next = next; + _logger = logger; + _apiLogService = apiLogService; + } + public async Task Invoke(HttpContext httpContext) + { + var request = httpContext.Request; + if (request.Path.StartsWithSegments(new PathString("/api")) && request.Method.ToLower() != "options") + { + var requestTime = DateTime.Now; + var requestBodyContent = string.Empty; + var originalRequest = httpContext.Response.Body; + if (request.Method == "POST") + { + request.EnableBuffering(); + requestBodyContent = await new StreamReader(request.Body).ReadToEndAsync(); + request.Body.Position = 0; + } + + try + { + using (var responseBody = new MemoryStream()) + { + var response = httpContext.Response; + response.Body = responseBody; + await _next(httpContext); + string responseBodyContent = null; + responseBodyContent = await FormatResponse(response); + await responseBody.CopyToAsync(originalRequest); + + string token = string.Empty, version = string.Empty, userAgent = string.Empty, source = string.Empty, deviceId = string.Empty, device = string.Empty, ip = string.Empty,sign=string.Empty; + if (httpContext.Request != null && httpContext.Request.Headers != null) + { + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Token"])) + { + token = httpContext.Request.Headers["Token"] + ""; } + + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Version"])) + { + version = httpContext.Request.Headers["Version"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["User-Agent"])) + { + userAgent = httpContext.Request.Headers["User-Agent"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Source"])) + { + source = httpContext.Request.Headers["Source"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["DeviceId"])) + { + deviceId = httpContext.Request.Headers["DeviceId"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Device"])) + { + device = httpContext.Request.Headers["Device"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Ip"])) + { + ip = httpContext.Request.Headers["Ip"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Sign"])) + { + sign = httpContext.Request.Headers["Sign"] + ""; + } + } + try + { + if (!string.IsNullOrEmpty(responseBodyContent)) + { + BaseResponse baseResponse = JsonConvert.DeserializeObject>(responseBodyContent); + if (baseResponse != null && baseResponse.Data != null) + { + baseResponse.Data = null; + } + responseBodyContent = JsonConvert.SerializeObject(baseResponse); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "API响应日志脱敏序列化失败 path={Path}", request.Path); +} + var now = DateTime.Now; + var apilog = new ApiLog() + { + requestTime = now, + accessToken = token, + clientIP = httpContext.Connection.RemoteIpAddress.ToString(), + consumeTime = (DateTime.Now - requestTime).Milliseconds, + requestHead= JsonConvert.SerializeObject(httpContext.Request.Headers), + requestUrl = request.Path, + requestMethod = request.Method.ToLower(), + requestQuery = request.QueryString.ToString(), + requestBody = requestBodyContent, + httpStatus = httpContext.Response.StatusCode, + responseBody = responseBodyContent, + userAgent = userAgent, + device= device, + deviceId= deviceId, + ip=ip, + source=source, + version=version, + sign=sign + }; + await _apiLogService.InsertOneAsync(apilog); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "API日志记录失败 path={Path}", request.Path); + } + finally + { + httpContext.Response.Body = originalRequest; + } + } + else + { + await _next(httpContext); + } + } + + private async Task FormatResponse(HttpResponse response) + { + response.Body.Seek(0, SeekOrigin.Begin); + string text = await new StreamReader(response.Body).ReadToEndAsync(); + response.Body.Seek(0, SeekOrigin.Begin); + return text; + } + } + + public static class ApiLoggingMiddlewareExtensions + { + public static IApplicationBuilder UseApiLogging(this IApplicationBuilder app) + { + return app.UseMiddleware(); + } + } +} diff --git a/CustomerSrc/CustomerHost/Middleware/AutofacModule.cs b/CustomerSrc/CustomerHost/Middleware/AutofacModule.cs new file mode 100644 index 0000000..2f7600f --- /dev/null +++ b/CustomerSrc/CustomerHost/Middleware/AutofacModule.cs @@ -0,0 +1,22 @@ +using System.Reflection; +using CommonService; +using CustomerService.Customer; +using SharpAbp.Infrastructure.Api.Autofac; + +namespace CustomerHost.Middleware +{ + public class AutofacModule : ApplicationModule + { + protected override Assembly CurrentAssembly => typeof(Program).Assembly; + + protected override Assembly[] GetServiceAssemblies() + { + return new[] + { + typeof(ICustomerService).Assembly, + typeof(CustomerService.Customer.CustomerService).Assembly, + typeof(ApiLogService).Assembly + }; + } + } +} diff --git a/CustomerSrc/CustomerHost/Program.cs b/CustomerSrc/CustomerHost/Program.cs new file mode 100644 index 0000000..99ec6cc --- /dev/null +++ b/CustomerSrc/CustomerHost/Program.cs @@ -0,0 +1,174 @@ +using System.Text.Json; +using Autofac; +using Autofac.Extensions.DependencyInjection; +using CustomerApi; +using CustomerApi.Hubs; +using CustomerHost.Extension; +using CustomerHost.Middleware; + +using CustomerService.Customer; +using JWTHelper; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Microsoft.Extensions.Options; +using MongoRepository.Config; +using Newtonsoft.Json; +using NLog.Extensions.Logging; +using NLog.Web; +using RedisHelper; +using RedisService; +using SharpAbp.Infrastructure.Api.Middleware; +using StackExchange.Redis; + +Environment.SetEnvironmentVariable("SERVICE_NAME", + Environment.GetEnvironmentVariable("SERVICE_NAME") + ?? System.Reflection.Assembly.GetEntryAssembly()?.GetName().Name + ?? "CustomerHost"); +Environment.SetEnvironmentVariable("INSTANCE_ID", + Environment.GetEnvironmentVariable("INSTANCE_ID") ?? "default"); + +var builder = WebApplication.CreateBuilder(args); + +// ============================================ +// ============================================ + +builder.Services.AddControllers() + .AddApplicationPart(typeof(AssemblyMarker).Assembly) + .AddControllersAsServices(); + +builder.Logging.AddNLog(); +builder.Host.UseNLog(); + +builder.Services.AddControllers().AddNewtonsoftJson( + option => + { + option.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; + option.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local; + } +); + +builder.Configuration.AddJsonFile(Path.Combine("Config", "system.json"), optional: true); + +builder.Services.Configure(builder.Configuration.GetSection(nameof(MongoDbSettings))); +builder.Services.AddSingleton(sp => sp.GetRequiredService>().Value); + +builder.Services.AddSingleton(); + +builder.Services.AddAutoMapper(typeof(CustomerService.AutoMapperConfig)); + +builder.Services.AddHealthChecks() + .AddCheck("self", () => HealthCheckResult.Healthy(), tags: new[] { "self" }); + + + +// ============================================ +// ============================================ +builder.Services.AddSignalR(hubOptions => +{ + hubOptions.MaximumReceiveMessageSize = 64 * 1024; + hubOptions.StreamBufferCapacity = 512; + hubOptions.ClientTimeoutInterval = TimeSpan.FromSeconds(70); + hubOptions.KeepAliveInterval = TimeSpan.FromSeconds(15); +}) +.AddJsonProtocol() +.AddStackExchangeRedis(builder.Configuration["RedisConfig:ConnectionString"], options => +{ + options.Configuration.ChannelPrefix = RedisChannel.Literal("CustomerHub"); +}); + +// ============================================ +// ============================================ +builder.Services.AddCors(options => +{ + options.AddPolicy("Cors", policy => + { + policy + .SetIsOriginAllowed(_ => true) + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials(); + }); +}); + +// ============================================ +// ============================================ +builder.Services.AddCustomJwt(builder.Configuration); + +// ============================================ +// ============================================ +builder.Services.AddRedisCache(builder.Configuration); + +// ============================================ +// ============================================ +builder.Services.AddCap(builder.Configuration); + +// ============================================ +// ============================================ +builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); +builder.Host.ConfigureContainer(builder => +{ + builder.RegisterModule(); +}); + +// ============================================ +// ============================================ +var app = builder.Build(); + + + +if (app.Environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseCors("Cors"); + +var uploadPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "uploads"); +if (!Directory.Exists(uploadPath)) +{ + Directory.CreateDirectory(uploadPath); +} +app.UseStaticFiles(new StaticFileOptions +{ + FileProvider = new Microsoft.Extensions.FileProviders.PhysicalFileProvider( + Path.Combine(Directory.GetCurrentDirectory(), "wwwroot")), + RequestPath = "/uploads" +}); + +app.UseRouting(); + +app.UseAuthentication(); +app.UseAuthorization(); +app.UseApiLogging(); + +app.MapHub("/customerHub", options => +{ + options.Transports = Microsoft.AspNetCore.Http.Connections.HttpTransportType.WebSockets; +}); + +app.MapControllers(); +app.UseGlobalExceptionHandler(); +app.MapHealthChecks("/health", new HealthCheckOptions +{ + Predicate = _ => true, + ResponseWriter = async (context, report) => + { + context.Response.ContentType = "application/json"; + var result = new + { + status = report.Status.ToString(), + checks = report.Entries.Select(e => new + { + name = e.Key, + status = e.Value.Status.ToString(), + description = e.Value.Description, + duration = e.Value.Duration.TotalMilliseconds + }), + totalDuration = report.TotalDuration.TotalMilliseconds + }; + await context.Response.WriteAsync(System.Text.Json.JsonSerializer.Serialize(result)); + } +}); + +app.Run(); diff --git a/CustomerSrc/CustomerHost/Properties/launchSettings.json b/CustomerSrc/CustomerHost/Properties/launchSettings.json new file mode 100644 index 0000000..f55e3f8 --- /dev/null +++ b/CustomerSrc/CustomerHost/Properties/launchSettings.json @@ -0,0 +1,12 @@ +{ + "profiles": { + "CustomerHost": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:38200;http://localhost:38201" + } + } +} \ No newline at end of file diff --git a/CustomerSrc/CustomerHost/docker-compose.yaml b/CustomerSrc/CustomerHost/docker-compose.yaml new file mode 100644 index 0000000..e992d5a --- /dev/null +++ b/CustomerSrc/CustomerHost/docker-compose.yaml @@ -0,0 +1,8 @@ +name: webapi +services: + 0524customer: + image: 0524customer + container_name: '0524customer' + restart: always + ports: + - '5247:80' \ No newline at end of file diff --git a/CustomerSrc/CustomerService.Domain/CustomerService.Domain.csproj b/CustomerSrc/CustomerService.Domain/CustomerService.Domain.csproj new file mode 100644 index 0000000..37faaa6 --- /dev/null +++ b/CustomerSrc/CustomerService.Domain/CustomerService.Domain.csproj @@ -0,0 +1,18 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + \ No newline at end of file diff --git a/CustomerSrc/CustomerService.Domain/Entity/ConversationEntity.cs b/CustomerSrc/CustomerService.Domain/Entity/ConversationEntity.cs new file mode 100644 index 0000000..5b13db6 --- /dev/null +++ b/CustomerSrc/CustomerService.Domain/Entity/ConversationEntity.cs @@ -0,0 +1,42 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; + +namespace CustomerService.Domain.Entity; + +[BsonCollection("conversation", ServiceDatabases.Customer)] +[BsonIgnoreExtraElements] +public class ConversationEntity : MongoBaseEntity +{ + [BsonElement("userid")] + public string? UserId { get; set; } + + [BsonElement("username")] + public string? UserName { get; set; } + + [BsonElement("useravatar")] + public string? UserAvatar { get; set; } + + [BsonElement("customerid")] + public string? CustomerId { get; set; } + + [BsonElement("customername")] + public string? CustomerName { get; set; } + + [BsonElement("customeravatar")] + public string? CustomerAvatar { get; set; } + + [BsonElement("status")] + public int Status { get; set; } + + [BsonElement("createtime")] + public DateTime CreateTime { get; set; } + + [BsonElement("endtime")] + public DateTime? EndTime { get; set; } + + [BsonElement("lastreadtime")] + public DateTime? LastReadTime { get; set; } +} \ No newline at end of file diff --git a/CustomerSrc/CustomerService.Domain/Entity/CustomerEntity.cs b/CustomerSrc/CustomerService.Domain/Entity/CustomerEntity.cs new file mode 100644 index 0000000..8c39660 --- /dev/null +++ b/CustomerSrc/CustomerService.Domain/Entity/CustomerEntity.cs @@ -0,0 +1,27 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; + +namespace CustomerService.Domain.Entity; + +[BsonCollection("customer", ServiceDatabases.Customer)] +[BsonIgnoreExtraElements] +public class CustomerEntity : MongoBaseEntity +{ + [BsonElement("userid")] + public string? UserId { get; set; } + + [BsonElement("username")] + public string? UserName { get; set; } + + [BsonElement("status")] + public int Status { get; set; } + + [BsonElement("avatar")] + public string? Avatar { get; set; } + + [BsonElement("createtime")] + public DateTime CreateTime { get; set; } +} \ No newline at end of file diff --git a/CustomerSrc/CustomerService.Domain/Entity/MessageEntity.cs b/CustomerSrc/CustomerService.Domain/Entity/MessageEntity.cs new file mode 100644 index 0000000..5a6137c --- /dev/null +++ b/CustomerSrc/CustomerService.Domain/Entity/MessageEntity.cs @@ -0,0 +1,36 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; + +namespace CustomerService.Domain.Entity; + +[BsonCollection("message", ServiceDatabases.Customer)] +[BsonIgnoreExtraElements] +public class MessageEntity : MongoBaseEntity +{ + [BsonElement("conversationid")] + public string? ConversationId { get; set; } + + [BsonElement("sendertype")] + public int SenderType { get; set; } + + [BsonElement("senderid")] + public string? SenderId { get; set; } + + [BsonElement("sendername")] + public string? SenderName { get; set; } + + [BsonElement("senderavatar")] + public string? SenderAvatar { get; set; } + + [BsonElement("contenttype")] + public int ContentType { get; set; } + + [BsonElement("content")] + public string? Content { get; set; } + + [BsonElement("createtime")] + public DateTime CreateTime { get; set; } +} \ No newline at end of file diff --git a/CustomerSrc/CustomerService.Domain/Response/ConversationResponse.cs b/CustomerSrc/CustomerService.Domain/Response/ConversationResponse.cs new file mode 100644 index 0000000..365e634 --- /dev/null +++ b/CustomerSrc/CustomerService.Domain/Response/ConversationResponse.cs @@ -0,0 +1,11 @@ +using CustomerService.Domain.Entity; + +namespace CustomerService.Domain.Response +{ + public class ConversationResponse : ConversationEntity + { + public string? LastMessage { get; set; } + public int UnreadCount { get; set; } + public List? Messages { get; set; } + } +} diff --git a/CustomerSrc/CustomerService/AutoMapperConfig.cs b/CustomerSrc/CustomerService/AutoMapperConfig.cs new file mode 100644 index 0000000..cc76401 --- /dev/null +++ b/CustomerSrc/CustomerService/AutoMapperConfig.cs @@ -0,0 +1,11 @@ +using AutoMapper; + +namespace CustomerService +{ + public class AutoMapperConfig : Profile + { + public AutoMapperConfig() + { + } + } +} diff --git a/CustomerSrc/CustomerService/Customer/CustomerService.cs b/CustomerSrc/CustomerService/Customer/CustomerService.cs new file mode 100644 index 0000000..3dc3343 --- /dev/null +++ b/CustomerSrc/CustomerService/Customer/CustomerService.cs @@ -0,0 +1,292 @@ +using System.Text.RegularExpressions; +using Common; +using Common.Redis; +using CustomerService.Domain.Entity; +using CustomerService.Domain.Response; +using MongoDB.Driver; +using MongoRepository; + +using RedisHelper; + +namespace CustomerService.Customer; + +public class CustomerService : ICustomerService +{ + private readonly IMongoBaseRepository _customerRepo; + + private readonly IMongoBaseRepository _conversationRepo; + + private readonly IMongoBaseRepository _messageRepo; + + private readonly ICache _redis; + + private static readonly string REDIS_CUSTOMER_ONLINE_KEY = RedisKey.CUSTOMER_ONLINE_KEY; + + public CustomerService( + IMongoBaseRepository customerRepo, + IMongoBaseRepository conversationRepo, + IMongoBaseRepository messageRepo, + ICache redis) + { + _customerRepo = customerRepo; + _conversationRepo = conversationRepo; + _messageRepo = messageRepo; + _redis = redis; + } + + public async Task<(bool isOk, string msg, ConversationEntity? conversation)> StartConversation(string userId, string userName, string? userAvatar = null) + { + var onlineCustomers = await GetOnlineCustomerList(); + + if (onlineCustomers.Count == 0) + { + return (false, "暂无客服在线", null); + } + + var customerConversationCounts = new Dictionary(); + foreach (var c in onlineCustomers) + { + var count = (await _conversationRepo.FilterByAsync(x => x.CustomerId == c.UserId && x.Status == 1)).Count(); + customerConversationCounts[c.UserId] = count; + } + + var selectedCustomer = onlineCustomers.OrderBy(c => customerConversationCounts[c.UserId]).First(); + + var conversation = new ConversationEntity + { + UserId = userId, + UserName = userName, + UserAvatar = userAvatar, + CustomerId = selectedCustomer.UserId, + CustomerName = selectedCustomer.UserName, + CustomerAvatar = selectedCustomer.Avatar, + Status = 1, + CreateTime = DateTime.Now + }; + + await _conversationRepo.InsertOneAsync(conversation); + return (true, "success", conversation); + } + + public async Task<(bool isOk, string msg)> SendMessage(string conversationId, int senderType, string senderId, string senderName, int contentType, string content, string? senderAvatar = null) + { + var message = new MessageEntity + { + ConversationId = conversationId, + SenderType = senderType, + SenderId = senderId, + SenderName = senderName, + SenderAvatar = senderAvatar, + ContentType = contentType, + Content = content, + CreateTime = DateTime.Now + }; + + await _messageRepo.InsertOneAsync(message); + return (true, "success"); + } + + public async Task<(bool isOk, string msg, List? messages)> GetMessages(string conversationId) + { + var messages = await _messageRepo.FilterByAsync(x => x.ConversationId == conversationId); + + messages = messages.OrderBy(x => x.CreateTime).ToList(); + return (true, "success", messages); + } + + public async Task<(bool isOk, string msg, List? conversations)> GetUserConversations(string userId) + { + var conversations = await _conversationRepo.FilterByAsync(x => x.UserId == userId); + conversations = conversations.OrderByDescending(x => x.CreateTime).Take(1).ToList(); + + var responseList = new List(); + foreach (var conv in conversations) + { + var response = new ConversationResponse + { + Id = conv.Id, + UserId = conv.UserId, + UserName = conv.UserName, + UserAvatar = conv.UserAvatar, + CustomerId = conv.CustomerId, + CustomerName = conv.CustomerName, + CustomerAvatar = conv.CustomerAvatar, + Status = conv.Status, + CreateTime = conv.CreateTime, + EndTime = conv.EndTime, + LastReadTime = conv.LastReadTime + }; + + if (!string.IsNullOrEmpty(conv.Id)) + { + var messages = await _messageRepo.FilterByAsync(m => m.ConversationId == conv.Id); + messages = messages.OrderBy(m => m.CreateTime).ToList(); + var last = messages.LastOrDefault(); + response.LastMessage = last?.Content; + response.Messages = messages; + response.UnreadCount = messages.Count(m => + m.SenderType == 1 && + (conv.LastReadTime == null || m.CreateTime > conv.LastReadTime)); + } + + responseList.Add(response); + } + + return (true, "获取成功", responseList); + } + + public async Task<(bool isOk, string msg, List? conversations)> GetConversations(string? customerId) + { + List conversations; + + if (string.IsNullOrEmpty(customerId)) + { + conversations = await _conversationRepo.FilterByAsync(x => true); + } + else + { + conversations = await _conversationRepo.FilterByAsync(x => x.CustomerId == customerId); + } + + conversations = conversations.OrderByDescending(x => x.CreateTime).ToList(); + + var responseList = new List(); + foreach (var conv in conversations) + { + var response = new ConversationResponse + { + Id = conv.Id, + UserId = conv.UserId, + UserName = conv.UserName, + CustomerId = conv.CustomerId, + CustomerName = conv.CustomerName, + Status = conv.Status, + CreateTime = conv.CreateTime, + EndTime = conv.EndTime + }; + + var messages = await _messageRepo.FilterByAsync(x => x.ConversationId == conv.Id); + if (messages != null && messages.Count > 0) + { + messages = messages.OrderBy(x => x.CreateTime).ToList(); + response.Messages = messages; + var lastMsg = messages.LastOrDefault(); + response.LastMessage = lastMsg?.Content; + } + + if (messages != null && messages.Count > 0) + { + var userMessages = messages.Where(x => x.SenderType == 1); + if (conv.LastReadTime.HasValue) + { + response.UnreadCount = userMessages.Count(x => x.CreateTime > conv.LastReadTime.Value); + } + else + { + response.UnreadCount = userMessages.Count(); + } + } + + responseList.Add(response); + } + + return (true, "success", responseList); + } + + public async Task<(bool isOk, string msg)> EndConversation(string conversationId) + { + var conversation = await _conversationRepo.FindOneAsync(conversationId); + if (conversation == null) + { + return (false, "会话不存在"); + } + + conversation.Status = 2; + conversation.EndTime = DateTime.Now; + await _conversationRepo.ReplaceOneAsync(conversation); + return (true, "success"); + } + + + public async Task<(bool isOk, string msg, List? customers)> GetOnlineCustomers() + { + var onlineList = await GetOnlineCustomerList(); + return (true, "success", onlineList); + } + + public async Task<(bool isOk, string msg)> UpdateCustomerStatus(string userId, int status) + { + var customer = (await _customerRepo.FilterByAsync(x => x.UserId == userId)).FirstOrDefault(); + + if (customer == null) + { + customer = new CustomerEntity + { + UserId = userId, + Status = status, + CreateTime = DateTime.Now + }; + await _customerRepo.InsertOneAsync(customer); + } + else + { + customer.Status = status; + await _customerRepo.ReplaceOneAsync(customer); + } + + if (status == 1) + { + _redis.RemoveFromList(REDIS_CUSTOMER_ONLINE_KEY, c => c == userId); + _redis.AddToList(REDIS_CUSTOMER_ONLINE_KEY, userId); + } + else + { + _redis.RemoveFromList(REDIS_CUSTOMER_ONLINE_KEY, c => c == userId); + } + + return (true, "success"); + } + + public async Task<(bool isOk, string msg)> MarkAsRead(string customerId, string userId) + { + try + { + var filter = Builders.Filter.And( + Builders.Filter.Eq(x => x.UserId, userId) + ); + var update = Builders.Update.Set(x => x.LastReadTime, DateTime.Now); + var result = await _conversationRepo.UpdateManyAsync(filter, update); + return (result); + } + catch (Exception ex) + { + return (false, $"标记已读失败: {ex.Message}"); + } + } + + public async Task<(bool isOk, string msg, CustomerEntity? customer)> GetCustomerByUserId(string userId) + { + var customer = await _customerRepo.FindOneAsync(x => x.UserId == userId); + return (true, "success", customer); + } + + private async Task> GetOnlineCustomerList() + { + var onlineUserIds = _redis.GetList(REDIS_CUSTOMER_ONLINE_KEY); + if (onlineUserIds == null || onlineUserIds.Count == 0) + { + return new List(); + } + + var customers = new List(); + foreach (var userId in onlineUserIds) + { + var customer = await _customerRepo.FindOneAsync(x => x.UserId == userId); + if (customer != null && customer.Status == 1) + { + customers.Add(customer); + } + } + return customers; + } +} diff --git a/CustomerSrc/CustomerService/Customer/ICustomerService.cs b/CustomerSrc/CustomerService/Customer/ICustomerService.cs new file mode 100644 index 0000000..032cb6d --- /dev/null +++ b/CustomerSrc/CustomerService/Customer/ICustomerService.cs @@ -0,0 +1,28 @@ +using CustomerService.Domain.Entity; +using CustomerService.Domain.Response; + +namespace CustomerService.Customer; + +public interface ICustomerService +{ + Task<(bool isOk, string msg, ConversationEntity? conversation)> StartConversation(string userId, string userName, string? userAvatar = null); + + Task<(bool isOk, string msg)> SendMessage(string conversationId, int senderType, string senderId, string senderName, int contentType, string content, string? senderAvatar = null); + + Task<(bool isOk, string msg, List? messages)> GetMessages(string conversationId); + + Task<(bool isOk, string msg, List? conversations)> GetConversations(string? customerId); + + Task<(bool isOk, string msg, List? conversations)> GetUserConversations(string userId); + + Task<(bool isOk, string msg)> EndConversation(string conversationId); + + + Task<(bool isOk, string msg, List? customers)> GetOnlineCustomers(); + + Task<(bool isOk, string msg)> UpdateCustomerStatus(string userId, int status); + + Task<(bool isOk, string msg, CustomerEntity? customer)> GetCustomerByUserId(string userId); + + Task<(bool isOk, string msg)> MarkAsRead(string customerId, string userId); +} diff --git a/CustomerSrc/CustomerService/CustomerService.csproj b/CustomerSrc/CustomerService/CustomerService.csproj new file mode 100644 index 0000000..587f590 --- /dev/null +++ b/CustomerSrc/CustomerService/CustomerService.csproj @@ -0,0 +1,25 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FishGameSrc/FishGameHost/.dockerignore b/FishGameSrc/FishGameHost/.dockerignore new file mode 100644 index 0000000..fe1152b --- /dev/null +++ b/FishGameSrc/FishGameHost/.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/FishGameSrc/FishGameHost/Config/system.json b/FishGameSrc/FishGameHost/Config/system.json new file mode 100644 index 0000000..23caa70 --- /dev/null +++ b/FishGameSrc/FishGameHost/Config/system.json @@ -0,0 +1,59 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "urls": "http://*:8003", + + + "AllowedHosts": "*", + "JwtConfig": { + "TokenKey": "token", + "Issuer": "admin", + "Audience": "", // "Audience": "", + "SecretKey": "henanhuashengchongwuyouxiangongsikejizhongxin", + "ValidateIssuer": false, + "ValidateAudience": false, + "ValidateIssuerSigningKey": false, + "ValidateLifetime": false + + }, + "ConnectionStrings": { + "PgSqlConnection": "host=localhost;database=data_0524;user id=data_0524;password=123456;" + }, + "CapConfig": { + "Host": "localhost", + "UserName": "admin", + "Password": "123456", + "VirtualHost": "/", + "PGLogHost": "host=localhost;database=data_0524;user id=data_0524;password=123456;" + }, + "RedisConfig": { + "Host": "localhost", + "Port": 6379, + "UserName": "", + "Password": "123456", + "Database": 1 + }, + "MongoDbSettings": { + "username": "root", + "password": "root123456", + "ServerUrl": "mongodb://localhost:27017", + "Database": "data_buyu" + }, + "WXConfig": { + "AppId": "wxceab9ce5b4474219", + "Secret": "5a291d7b295c76da579611da3f83e059", + "Url": "https://api.weixin.qq.com" + }, + "BulletConfig": { + "SignKey": "63215f0afa3f5b25", + "MaxBulletPerUser": 100, + "TimeWindowSeconds": 5 + }, + "GameServerInstances": [ + "http://localhost/fishinghub?instance=1" + ] +} diff --git a/FishGameSrc/FishGameHost/Controllers/PlayerController.cs b/FishGameSrc/FishGameHost/Controllers/PlayerController.cs new file mode 100644 index 0000000..1c2d932 --- /dev/null +++ b/FishGameSrc/FishGameHost/Controllers/PlayerController.cs @@ -0,0 +1,67 @@ +using System.Security.Claims; +using System.Text; +using JWTHelper; +using Microsoft.AspNetCore.Mvc; + +namespace FishGameHost.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class PlayerController : ControllerBase +{ + private readonly JwtTools _jwtTools; + + public PlayerController(JwtTools jwtTools) + { + _jwtTools = jwtTools; + } + + [HttpPost("login")] + public IActionResult Login([FromBody] PlayerLoginRequest request) + { + if (string.IsNullOrWhiteSpace(request.UserId)) + request.UserId = "u_" + DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + if (string.IsNullOrWhiteSpace(request.Nickname)) + request.Nickname = "玩家"; + + var userIdReversed = Reverse(request.UserId); + var claims = new[] + { + new Claim("uid", userIdReversed), + new Claim("uname", request.Nickname), + }; + var token = _jwtTools.CreateToken(claims); + + return Ok(new + { + code = 200, + data = new + { + token, + player = new + { + userId = request.UserId, + playerId = 1, + nickname = request.Nickname, + gold = 100000L, + diamond = 1000, + playerlvl = 1, + viplvl = 0 + } + } + }); + } + + private static string Reverse(string s) + { + var arr = s.ToCharArray(); + Array.Reverse(arr); + return new string(arr); + } +} + +public class PlayerLoginRequest +{ + public string? UserId { get; set; } + public string? Nickname { get; set; } +} diff --git a/FishGameSrc/FishGameHost/Controllers/RoomController.cs b/FishGameSrc/FishGameHost/Controllers/RoomController.cs new file mode 100644 index 0000000..71179f8 --- /dev/null +++ b/FishGameSrc/FishGameHost/Controllers/RoomController.cs @@ -0,0 +1,71 @@ +using Common; +using CommonDomain.Enum; +using Microsoft.AspNetCore.Mvc; +using RedisService; + +namespace FishGameHost.Controllers +{ + [ApiController, Route("api/[controller]")] + public class RoomController : ControllerBase + { + private readonly IConfiguration _configuration; + private readonly IRedisService _redisService; + + public RoomController(IConfiguration configuration, IRedisService redisService) + { + _configuration = configuration; + _redisService = redisService; + } + + public class QuickJoinResult + { + public string RoomId { get; set; } = ""; + public string WebSocketUrl { get; set; } = ""; + } + + [HttpGet("QuickJoin")] + public BaseResponse QuickJoin(int gameType, int level) + { + var rooms = _redisService.GetGameRoomAllList(); + + if(rooms==null || rooms.Count()==0) + return new BaseResponse(); + var candidates = rooms?.Where(r => + r != null && + (int)r.GameType == gameType && + (level == 0 || r.RoomLevel == level) && + (r.Players?.Count ?? 0) < r.MaxPlayerCount).ToList(); + + if (candidates == null || candidates.Count == 0) + return new BaseResponse { Code = CommonResponseCodeEnum.Error, Info = "暂无可用房间" }; + + var room = candidates[Random.Shared.Next(candidates.Count)]; + + var wsUrl = ResolveWebSocketUrl(room.RoomId); + return new BaseResponse { Data = new QuickJoinResult { RoomId = room.RoomId, WebSocketUrl = wsUrl } }; + } + + private string ResolveWebSocketUrl(string roomId) + { + var instances = _configuration.GetSection("GameServerInstances").Get>(); + if (instances == null || instances.Count == 0) + return ""; + + return instances[0]; + } + + [HttpGet("Assign")] + public BaseResponse AssignRoom(string roomId) + { + if (string.IsNullOrWhiteSpace(roomId)) + return new BaseResponse { Code = CommonResponseCodeEnum.ParamError, Info = "roomId 不能为空" }; + + var wsUrl = ResolveWebSocketUrl(roomId); + if (string.IsNullOrEmpty(wsUrl)) + return new BaseResponse { Code = CommonResponseCodeEnum.Error, Info = "未配置游戏服务器实例" }; + + return new BaseResponse { Data = wsUrl }; + } + + } +} diff --git a/FishGameSrc/FishGameHost/Controllers/TimeController.cs b/FishGameSrc/FishGameHost/Controllers/TimeController.cs new file mode 100644 index 0000000..fdc3222 --- /dev/null +++ b/FishGameSrc/FishGameHost/Controllers/TimeController.cs @@ -0,0 +1,38 @@ +using Microsoft.AspNetCore.Mvc; + +namespace FishGameHost.Controllers; + +[ApiController] +[Route("fishapi/[controller]")] +public class TimeController : ControllerBase +{ + [HttpGet("GetDateTime")] + [ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)] + public IActionResult GetDateTime() + { + var dateTimeNow = DateTime.Now; + var dateTimeNowOffset = new DateTimeOffset(dateTimeNow); + var utcNow = DateTimeOffset.UtcNow; + var dateTimeNowTimestamp = dateTimeNowOffset.ToUnixTimeMilliseconds(); + var utcNowTimestamp = utcNow.ToUnixTimeMilliseconds(); + + return Ok(new + { + code = 200, + data = new + { + service = "FishApi", + timestamp = utcNowTimestamp, + dateTimeNow = dateTimeNow.ToString("yyyy-MM-dd HH:mm:ss.fff"), + dateTimeNowKind = dateTimeNow.Kind.ToString(), + dateTimeNowTimestamp, + dateTimeOffsetUtcNow = utcNow.ToString("yyyy-MM-dd HH:mm:ss.fff zzz"), + dateTimeOffsetUtcNowTimestamp = utcNowTimestamp, + differenceMs = utcNowTimestamp - dateTimeNowTimestamp, + timeZone = TimeZoneInfo.Local.Id, + utcOffset = dateTimeNowOffset.Offset.ToString(), + container = Environment.MachineName + } + }); + } +} diff --git a/FishGameSrc/FishGameHost/Extension/CapExtension.cs b/FishGameSrc/FishGameHost/Extension/CapExtension.cs new file mode 100644 index 0000000..d773f4b --- /dev/null +++ b/FishGameSrc/FishGameHost/Extension/CapExtension.cs @@ -0,0 +1,54 @@ +using DotNetCore.CAP.Messages; + +namespace FishGameHost.Extension +{ + public static class CapExtension + { + public static IServiceCollection AddCap(this IServiceCollection services, IConfiguration configuration) + { + services.AddCap(x => + { + var instanceId = Environment.GetEnvironmentVariable("INSTANCE_ID") ?? "default"; + x.DefaultGroupName = $"FishGameHost-{instanceId}"; + x.UseDashboard(); + x.UseRabbitMQ(rb => + { + rb.HostName = configuration["CapConfig:Host"]; + rb.UserName = configuration["CapConfig:UserName"]; + rb.Password = configuration["CapConfig:Password"]; + rb.VirtualHost = configuration["CapConfig:VirtualHost"]; + rb.ExchangeName = "cap.exchange"; + }); + x.UsePostgreSql(op => + { + op.ConnectionString = configuration["CapConfig:PGLogHost"]; + op.Schema = "public"; + }); + + + + x.SucceedMessageExpiredAfter = 7 * 24 * 3600; + x.FailedRetryCount = 5; + x.FailedRetryInterval = 10; + x.FailedThresholdCallback = ObjFailedThresholdCallback; + + + }); + return services; + } + + private static async void ObjFailedThresholdCallback(FailedInfo failed) + { + var exception = failed.Message.Headers["cap-exception"] ?? string.Empty; + var name = failed.Message.GetName(); + if (failed.MessageType == MessageType.Publish) + { + + } + else + { + + } + } + } +} diff --git a/FishGameSrc/FishGameHost/FishGameHost.csproj b/FishGameSrc/FishGameHost/FishGameHost.csproj new file mode 100644 index 0000000..e96195e --- /dev/null +++ b/FishGameSrc/FishGameHost/FishGameHost.csproj @@ -0,0 +1,38 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + + + + + + + + + + + + Always + + + Always + + + + diff --git a/FishGameSrc/FishGameHost/Middleware/ApiLoggingMiddleware.cs b/FishGameSrc/FishGameHost/Middleware/ApiLoggingMiddleware.cs new file mode 100644 index 0000000..4fea967 --- /dev/null +++ b/FishGameSrc/FishGameHost/Middleware/ApiLoggingMiddleware.cs @@ -0,0 +1,169 @@ + +using System.Text; +using Common; +using CommonDomain; +using CommonService; +using Newtonsoft.Json; + +namespace FishGameHost.Middleware +{ + public class ApiLoggingMiddleware + { + private readonly RequestDelegate _next; + private readonly ILogger _logger; + private readonly IApiLogService _apiLogService; + + public ApiLoggingMiddleware(RequestDelegate next, ILogger logger, IApiLogService apiLogService) + { + _next = next; + _logger = logger; + _apiLogService = apiLogService; + } + public async Task Invoke(HttpContext httpContext) + { + var request = httpContext.Request; + if (request.Path.StartsWithSegments(new PathString("/api")) && request.Method.ToLower() != "options") + { + var requestTime = DateTime.Now; + var requestBodyContent = string.Empty; + var originalRequest = httpContext.Response.Body; + if (request.Method == "POST") + { + request.EnableBuffering(); + requestBodyContent = await new StreamReader(request.Body).ReadToEndAsync(); + request.Body.Position = 0; + } + + try + { + using (var responseBody = new MemoryStream()) + { + var response = httpContext.Response; + response.Body = responseBody; + await _next(httpContext); + string responseBodyContent = null; + responseBodyContent = await FormatResponse(response); + await responseBody.CopyToAsync(originalRequest); + + string token = string.Empty, version = string.Empty, userAgent = string.Empty, source = string.Empty, deviceId = string.Empty, device = string.Empty, ip = string.Empty,sign=string.Empty; + if (httpContext.Request != null && httpContext.Request.Headers != null) + { + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Token"])) + { + token = httpContext.Request.Headers["Token"] + ""; } + + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Version"])) + { + version = httpContext.Request.Headers["Version"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["User-Agent"])) + { + userAgent = httpContext.Request.Headers["User-Agent"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Source"])) + { + source = httpContext.Request.Headers["Source"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["DeviceId"])) + { + deviceId = httpContext.Request.Headers["DeviceId"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Device"])) + { + device = httpContext.Request.Headers["Device"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Ip"])) + { + ip = httpContext.Request.Headers["Ip"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Sign"])) + { + sign = httpContext.Request.Headers["Sign"] + ""; + } + } + string allResponseContent = responseBodyContent; + try + { + if (!string.IsNullOrEmpty(responseBodyContent)) + { + BaseResponse baseResponse = JsonConvert.DeserializeObject>(responseBodyContent); + if (baseResponse != null && baseResponse.Data != null) + { + baseResponse.Data = null; + } + responseBodyContent = JsonConvert.SerializeObject(baseResponse); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "API响应日志脱敏序列化失败 path={Path}", request.Path); +} + var now = DateTime.Now; + var apilog = new ApiLog() + { + requestTime = now, + accessToken = token, + clientIP = httpContext.Connection.RemoteIpAddress.ToString(), + consumeTime = (DateTime.Now - requestTime).Milliseconds, + requestHead= JsonConvert.SerializeObject(httpContext.Request.Headers), + requestUrl = request.Path, + requestMethod = request.Method.ToLower(), + requestQuery = request.QueryString.ToString(), + requestBody = requestBodyContent, + httpStatus = httpContext.Response.StatusCode, + responseBody = responseBodyContent, + userAgent = userAgent, + device= device, + deviceId= deviceId, + ip=ip, + source=source, + version=version, + sign=sign + }; + await _apiLogService.InsertOneAsync(apilog); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "API日志记录失败 path={Path}", request.Path); + } + finally + { + httpContext.Response.Body = originalRequest; + } + } + else + { + await _next(httpContext); + } + } + private async Task FormatRequest(Microsoft.AspNetCore.Http.HttpRequest request) + { + var body = request.Body; + request.EnableBuffering(); + var buffer = new byte[Convert.ToInt32(request.ContentLength)]; + await request.Body.ReadAsync(buffer, 0, buffer.Length); + var bodyAsText = Encoding.UTF8.GetString(buffer); + request.Body = body; + return bodyAsText; + } + + private async Task FormatResponse(HttpResponse response) + { + response.Body.Seek(0, SeekOrigin.Begin); + string text = await new StreamReader(response.Body).ReadToEndAsync(); + response.Body.Seek(0, SeekOrigin.Begin); + //return $"{response.StatusCode}: {text}"; + return text; + } + } + + public static class ApiLoggingMiddlewareExtensions + { + public static IApplicationBuilder UseApiLogging(this IApplicationBuilder app) + { + return app.UseMiddleware(); + } + } +} + diff --git a/FishGameSrc/FishGameHost/Middleware/AutofacModule.cs b/FishGameSrc/FishGameHost/Middleware/AutofacModule.cs new file mode 100644 index 0000000..6c1283f --- /dev/null +++ b/FishGameSrc/FishGameHost/Middleware/AutofacModule.cs @@ -0,0 +1,66 @@ + + +using Autofac; +using CommonService; +using FishGameService.GameService; +using FishGameService.Services; +using MongoRepository; + +namespace FishGameHost.Middleware +{ + public class AutofacModule : Module + { + protected override void Load(ContainerBuilder builder) + { + builder.RegisterGeneric(typeof(MongoBaseRepository<>)).As(typeof(IMongoBaseRepository<>)).InstancePerLifetimeScope(); + builder.RegisterGeneric(typeof(MongoBaseService<>)).As(typeof(IMongoBaseService<>)).InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .SingleInstance(); + + builder.RegisterType() + .As() + .SingleInstance(); + + builder.RegisterType() + .As() + .SingleInstance(); + + builder.RegisterType() + .AsSelf() + .SingleInstance(); + + builder.RegisterAssemblyTypes(typeof(ApiLogService).Assembly) + .Where(t => t.Name.EndsWith("Service")) + .AsImplementedInterfaces() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .AsSelf() + .As() + .SingleInstance(); + + builder.RegisterAssemblyTypes(typeof(FishingGameService).Assembly) + .Where(t => t.Name.EndsWith("Service") && t != typeof(FishSpawnService) + && t != typeof(RobotKillAnnounceService)) + .AsImplementedInterfaces() + .InstancePerLifetimeScope(); + + builder.RegisterAssemblyTypes(typeof(FishingGameService).Assembly) + .Where(t => t.Name.EndsWith("Subscriber")) + .AsSelf() + .InstancePerLifetimeScope(); + builder.RegisterAssemblyTypes(typeof(UserService.User.UserService).Assembly) + .Where(t => t.Name.EndsWith("Service")) + .AsImplementedInterfaces() + .InstancePerLifetimeScope(); + } + } + +} + diff --git a/FishGameSrc/FishGameHost/Middleware/HubExceptionFilter.cs b/FishGameSrc/FishGameHost/Middleware/HubExceptionFilter.cs new file mode 100644 index 0000000..b57ffc1 --- /dev/null +++ b/FishGameSrc/FishGameHost/Middleware/HubExceptionFilter.cs @@ -0,0 +1,29 @@ +using Microsoft.AspNetCore.SignalR; + +namespace FishGameHost.Middleware +{ + public class HubExceptionFilter : IHubFilter + { + private readonly ILogger _logger; + + public HubExceptionFilter(ILogger logger) + { + _logger = logger; + } + + public async ValueTask InvokeMethodAsync( + HubInvocationContext invocationContext, + Func> next) + { + try + { + return await next(invocationContext); + } + catch (Exception e) + { + _logger.LogError(e, "Hub 调用异常: {Method}", invocationContext.HubMethodName); + return null; + } + } + } +} diff --git a/FishGameSrc/FishGameHost/Middleware/MovementFilter.cs b/FishGameSrc/FishGameHost/Middleware/MovementFilter.cs new file mode 100644 index 0000000..1cfc7d8 --- /dev/null +++ b/FishGameSrc/FishGameHost/Middleware/MovementFilter.cs @@ -0,0 +1,81 @@ +using Common.Utils; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.Logging; +using System.Collections.Concurrent; + +namespace FishGameHost.Middleware +{ + public class MovementFilter : IHubFilter + { + private readonly ILogger _logger; + private static readonly HashSet _skipMethods = new() + { + "SyncGameData", "FireCannon", "KillFish", + "BotFireCannon", "BotKillFish" + }; + + public MovementFilter(ILogger logger) + { + _logger = logger; + } + + public async ValueTask InvokeMethodAsync( + HubInvocationContext context, + Func> next) + { + var method = context.HubMethodName; + var cid = context.Context.ConnectionId; + if (!_skipMethods.Contains(method)) + { + var args = string.Join(", ", context.HubMethodArguments?.Select(a => + { + var s = a?.ToString() ?? ""; + return s.Length > 50 ? s[..50] + "..." : s; + }) ?? Array.Empty()); + + } + try + { + return await next(context); + } + catch (Exception ex) + { + _logger.LogWarning(ex, "[Socket] Hub调用异常: method={Method} cid={Cid}", method, cid); + throw; + } + } + } + + public static class RateLimiter + { + private static readonly ConcurrentDictionary _rates = new(); + + public static bool Allow(string connectionId) + { + var now = DateTime.UtcNow; + var rate = _rates.GetOrAdd(connectionId, id => new RateData()); + + if (rate.Tokens < 30) + { + rate.Tokens++; + rate.LastUpdate = now; + return true; + } + + if ((now - rate.LastUpdate).TotalMilliseconds > 33) + { + rate.Tokens = 1; + rate.LastUpdate = now; + return true; + } + + return false; + } + + private class RateData + { + public int Tokens { get; set; } = 30; + public DateTime LastUpdate { get; set; } = DateTime.UtcNow; + } + } +} diff --git a/FishGameSrc/FishGameHost/Program.cs b/FishGameSrc/FishGameHost/Program.cs new file mode 100644 index 0000000..c7ff392 --- /dev/null +++ b/FishGameSrc/FishGameHost/Program.cs @@ -0,0 +1,206 @@ +using Autofac; +using Autofac.Extensions.DependencyInjection; +using Common; +using Common.Request; +using CommonService; +using DotNetCore.CAP; +using FishGameHost.Extension; +using FishGameHost.Middleware; +using FishGameService.Config; +using FishGameService.Hubs; +using FishGameService.Subscribers; +using JWTHelper; +using MessagePack; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Microsoft.Extensions.Options; +using MongoDB.Driver; +using MongoRepository; +using MongoRepository.Config; +using NLog.Extensions.Logging; +using NLog.Web; +using RedisHelper; +using RedisService; +using UserDomain.Entity; +using SharpAbp.Infrastructure.Api.Middleware; +using StackExchange.Redis; +using System.Text.Json; +using UserService; +using static Common.Utils.DateTimeTools; + +Environment.SetEnvironmentVariable("SERVICE_NAME", + Environment.GetEnvironmentVariable("SERVICE_NAME") + ?? System.Reflection.Assembly.GetEntryAssembly()?.GetName().Name + ?? "FishGameHost"); +Environment.SetEnvironmentVariable("INSTANCE_ID", + Environment.GetEnvironmentVariable("INSTANCE_ID") ?? "default"); + +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. +string instanceId = Environment.GetEnvironmentVariable("INSTANCE_ID") ?? "Unknown"; +builder.Services.AddSingleton(sp => new AppInstanceId { Id = instanceId }); + +builder.Services.AddControllers(); + +builder.Logging.AddNLog(); +builder.Host.UseNLog(); +builder.Configuration.AddJsonFile(Path.Combine("Config", "system.json"), optional: true); +builder.Services.Configure(builder.Configuration.GetSection(nameof(MongoDbSettings))); +builder.Services.AddSingleton(sp => sp.GetRequiredService>().Value); + +string redisConn = builder.Configuration.GetConnectionString("Redis"); +if (string.IsNullOrWhiteSpace(redisConn)) +{ + var redisSection = builder.Configuration.GetSection("RedisConfig"); + var host = redisSection["Host"]; + var port = redisSection["Port"] ?? "6379"; + var password = redisSection["Password"]; + var database = redisSection["Database"] ?? "0"; + + if (string.IsNullOrWhiteSpace(host)) + { + throw new InvalidOperationException("未找到 Redis 配置:请在 ConnectionStrings:Redis 或 RedisConfig 节中配置 Redis 地址。"); + } + + redisConn = $"{host}:{port}"; + if (!string.IsNullOrEmpty(password)) + redisConn += $",password={password}"; + if (!string.IsNullOrEmpty(database)) + redisConn += $",defaultDatabase={database}"; +} + +var tempLoggerFactory = LoggerFactory.Create(builder => { builder.AddConsole(); }); +var tempLogger = tempLoggerFactory.CreateLogger("Startup"); + + +builder.Services.AddSingleton(sp => +{ + return ConnectionMultiplexer.Connect(redisConn); +}); + +builder.Services.AddSignalR(hubOptions => +{ + hubOptions.MaximumReceiveMessageSize = 64 * 1024; + hubOptions.StreamBufferCapacity = 512; + hubOptions.ClientTimeoutInterval = TimeSpan.FromSeconds(60); + hubOptions.KeepAliveInterval = TimeSpan.FromSeconds(5); + + hubOptions.AddFilter(); + hubOptions.AddFilter(); +}) +.AddJsonProtocol(); + +builder.Services.Configure(x => +{ + x.MultipartBodyLengthLimit = 1024 * 1024 * 16; +}); + +builder.Services.AddMemoryCache(); + +builder.Services.AddControllers().AddJsonOptions(configure => +{ + configure.JsonSerializerOptions.Converters.Add(new DatetimeJsonConverter()); +}); + +builder.Services.AddSingleton(); +builder.Services.AddSingleton, HubSend>(); +builder.Services.AddSingleton(); +builder.Services.AddAutoMapper(typeof(AutoMapperConfig)); + +builder.Services.AddHealthChecks() + .AddCheck("self", () => HealthCheckResult.Healthy(), tags: new[] { "self" }); + + + +builder.Services.AddCors(options => +{ + options.AddPolicy("Cors", policy => + { + policy + .SetIsOriginAllowed(_ => true) + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials(); + }); +}); + +#region jwt +builder.Services.AddCustomJwt(builder.Configuration); +#endregion + +#region redishelper +builder.Services.AddRedisCacheSingleton(builder.Configuration); +#endregion + +builder.Services.Configure(builder.Configuration.GetSection("BulletConfig")); +builder.Services.AddSingleton(sp => sp.GetRequiredService>().Value); + +builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); +builder.Host.ConfigureContainer(builder => +{ + builder.RegisterModule(); +}); + +#region Cap +builder.Services.AddTransient(); +builder.Services.AddTransient(); +builder.Services.AddTransient(); +builder.Services.AddTransient(); +builder.Services.AddCap(builder.Configuration); +#endregion + +builder.Services.AddHostedService(); +builder.Services.AddHostedService(); + +var app = builder.Build(); + + + + +// Configure the HTTP request pipeline. +if (app.Environment.IsDevelopment()) +{ +} + +app.UseApiLogging(); +app.UseRouting(); +app.UseGlobalExceptionHandler(); + +app.UseStaticFiles(); +app.UseCors("Cors"); +app.UseAuthentication(); +app.UseAuthorization(); + +app.MapHub("/fishinghub", options => +{ + options.Transports = Microsoft.AspNetCore.Http.Connections.HttpTransportType.WebSockets; +}); + +app.MapControllers(); + +app.MapHealthChecks("/health", new HealthCheckOptions +{ + Predicate = _ => true, + ResponseWriter = async (context, report) => + { + context.Response.ContentType = "application/json"; + var result = new + { + status = report.Status.ToString(), + checks = report.Entries.Select(e => new + { + name = e.Key, + status = e.Value.Status.ToString(), + description = e.Value.Description, + duration = e.Value.Duration.TotalMilliseconds + }), + totalDuration = report.TotalDuration.TotalMilliseconds + }; + await context.Response.WriteAsync(JsonSerializer.Serialize(result)); + } +}); + +app.Run(); diff --git a/FishGameSrc/FishGameHost/Properties/launchSettings.json b/FishGameSrc/FishGameHost/Properties/launchSettings.json new file mode 100644 index 0000000..1a7e205 --- /dev/null +++ b/FishGameSrc/FishGameHost/Properties/launchSettings.json @@ -0,0 +1,29 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:21082", + "sslPort": 0 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:5263", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/FishGameSrc/FishGameHost/Services/GlobalBroadcastSubscriber.cs b/FishGameSrc/FishGameHost/Services/GlobalBroadcastSubscriber.cs new file mode 100644 index 0000000..e4b2d06 --- /dev/null +++ b/FishGameSrc/FishGameHost/Services/GlobalBroadcastSubscriber.cs @@ -0,0 +1,56 @@ +using FishGameService.Hubs; +using Microsoft.AspNetCore.SignalR; +using StackExchange.Redis; + +namespace FishGameHost.Services +{ + public class GlobalBroadcastSubscriber : BackgroundService + { + private readonly IHubContext _hubContext; + private readonly IConnectionMultiplexer _redis; + private readonly ILogger _logger; + + public GlobalBroadcastSubscriber( + IHubContext hubContext, + IConnectionMultiplexer redis, + ILogger logger) + { + _hubContext = hubContext; + _redis = redis; + _logger = logger; + } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + var subscriber = _redis.GetSubscriber(); + await subscriber.SubscribeAsync("fishgame:global", async (channel, message) => + { + try + { + var msg = System.Text.Json.JsonSerializer.Deserialize((string)message); + if (msg == null) return; + + if (msg.Target == "All") + await _hubContext.Clients.All.SendAsync(msg.Event, msg.Data, stoppingToken); + else if (msg.Target == "Room" && !string.IsNullOrEmpty(msg.RoomId)) + await _hubContext.Clients.Group(msg.RoomId).SendAsync(msg.Event, msg.Data, stoppingToken); + } + catch (Exception ex) + { + _logger.LogError(ex, "全局广播处理失败"); + } + }); + + + await Task.Delay(Timeout.Infinite, stoppingToken); + } + } + + public class GlobalBroadcastMessage + { + public string Target { get; set; } = "All"; + public string? RoomId { get; set; } + public string Event { get; set; } = ""; + public object? Data { get; set; } + } +} diff --git a/FishGameSrc/FishGameHost/appsettings.Development.json b/FishGameSrc/FishGameHost/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/FishGameSrc/FishGameHost/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/FishGameSrc/FishGameHost/appsettings.json b/FishGameSrc/FishGameHost/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/FishGameSrc/FishGameHost/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/FishGameSrc/FishGameHost/docker-compose.yaml b/FishGameSrc/FishGameHost/docker-compose.yaml new file mode 100644 index 0000000..88262f0 --- /dev/null +++ b/FishGameSrc/FishGameHost/docker-compose.yaml @@ -0,0 +1,8 @@ +name: webapi +services: + 0524fishgame: + image: 0524fishgame + container_name: '0524fishgame' + restart: always + ports: + - '5243:80' \ No newline at end of file diff --git a/FishGameSrc/FishGameService/Config/BulletConfig.cs b/FishGameSrc/FishGameService/Config/BulletConfig.cs new file mode 100644 index 0000000..a027d36 --- /dev/null +++ b/FishGameSrc/FishGameService/Config/BulletConfig.cs @@ -0,0 +1,9 @@ +namespace FishGameService.Config +{ + public class BulletConfig + { + public string SignKey { get; set; } = string.Empty; + public int MaxBulletPerUser { get; set; } = 100; + public int TimeWindowSeconds { get; set; } = 5; + } +} diff --git a/FishGameSrc/FishGameService/FishGameService.csproj b/FishGameSrc/FishGameService/FishGameService.csproj new file mode 100644 index 0000000..f84ecbf --- /dev/null +++ b/FishGameSrc/FishGameService/FishGameService.csproj @@ -0,0 +1,21 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + + diff --git a/FishGameSrc/FishGameService/GameSend/FishingSendService.cs b/FishGameSrc/FishGameService/GameSend/FishingSendService.cs new file mode 100644 index 0000000..4e51a5d --- /dev/null +++ b/FishGameSrc/FishGameService/GameSend/FishingSendService.cs @@ -0,0 +1,274 @@ +using System.Text.Json; +using AutoMapper; +using Common.Utils; +using CommonService; +using FishGameService.GameSend; +using FishGameService.Hubs; +using FishGameService.Services; +using Microsoft.Extensions.Logging; +using RedisService.Param; +using StackExchange.Redis; + +namespace Service.Fishing +{ + public class FishingSendService : IFishingSendService + { + + public readonly IHubSend _hubSend; + public readonly IMapper _mapper; + private readonly ISubscriber _subscriber; + private readonly ILogger _logger; + + public FishingSendService(IHubSend hubSend, IMapper mapper, IConnectionMultiplexer redis, ILogger logger) + { + _hubSend = hubSend; + _mapper = mapper; + _subscriber = redis.GetSubscriber(); + _logger = logger; + } + public void BindSuccess(string cid) + { + _hubSend.SendUserCId(cid, "BindSuccess", "绑定成功"); + } + public void ErrorMessage(string cid, int code, string msg) + { + _hubSend.SendUserCId(cid, "Exception", new { code, message = msg }); + } + + + + public void KillNotice(string FishId, string userName, long gold = 0) + { + var msg = JsonSerializer.Serialize(new { Target = "All", Event = "KillNotice", Data = new { FishId, userName, gold } }); + _subscriber.Publish("fishgame:global", msg); + } + + public void KillNotice(string FishId, string userName, long gold, string fishName, long multiplier, + string gameTypeName, string roomName, long timestamp) + { + var text = $"恭喜玩家{userName}在{gameTypeName}{roomName}捕获 {fishName}*{multiplier}炮倍 {gold}大奖"; + var data = new + { + Text = text, + UserName = userName, + GameTypeName = gameTypeName, + RoomName = roomName, + FishName = fishName, + Multiple = multiplier, + Gold = gold, + Time = timestamp, + FishId + }; + var msg = JsonSerializer.Serialize(new { Target = "All", Event = "KillNotice", Data = data }); + _subscriber.Publish("fishgame:global", msg); + } + + public async Task SendRoomInfo(string cid, RedisGameRoom roomInfo, List activeFishes = null) + { + object payload; + List compatibilityFishPayload = null; + if (activeFishes != null && activeFishes.Count > 0) + { + var now = DateTimeOffset.UtcNow; + var activeFishPayload = activeFishes + .Where(f => string.IsNullOrWhiteSpace(f.FishArrayNumber)) + .Select(f => (object)new + { + fishId = f.FishId, + fishIds = new[] { f.FishId }, + fishNumber = f.FishNumber, + routeId = f.ClientRouteId, + fishArrayNumber = string.Empty, + createdAt = new DateTimeOffset(f.CreatedAt).ToUnixTimeMilliseconds(), + createdTime = f.CreatedAt.ToString("yyyy-MM-dd HH:mm:ss.fff"), + expireAt = new DateTimeOffset(f.ExpireAt).ToUnixTimeMilliseconds(), + expireTime = f.ExpireAt.ToString("yyyy-MM-dd HH:mm:ss.fff"), + remainingSeconds = (int)Math.Max(0, (new DateTimeOffset(f.ExpireAt) - now).TotalSeconds) + }) + .Concat( + activeFishes + .Where(f => !string.IsNullOrWhiteSpace(f.FishArrayNumber)) + .GroupBy(f => f.FishArrayNumber) + .Select(group => + { + var first = group.First(); + return (object)new + { + fishId = first.FishId, + fishIds = group.Select(f => f.FishId).ToList(), + fishNumber = string.Empty, + routeId = first.ClientRouteId, + fishArrayNumber = first.FishArrayNumber, + createdAt = new DateTimeOffset(first.CreatedAt).ToUnixTimeMilliseconds(), + createdTime = first.CreatedAt.ToString("yyyy-MM-dd HH:mm:ss.fff"), + expireAt = new DateTimeOffset(group.Min(f => f.ExpireAt)).ToUnixTimeMilliseconds(), + expireTime = group.Min(f => f.ExpireAt).ToString("yyyy-MM-dd HH:mm:ss.fff"), + remainingSeconds = (int)Math.Max(0, (new DateTimeOffset(group.Min(f => f.ExpireAt)) - now).TotalSeconds) + }; + })) + .ToList(); + compatibilityFishPayload = activeFishes + .Where(f => string.IsNullOrWhiteSpace(f.FishArrayNumber) && f.FishType == 1) + .Select(f => (object)new + { + fishId = f.FishId, + fishIds = new[] { f.FishId }, + fishNumber = f.FishNumber, + routeId = f.ClientRouteId, + fishArrayNumber = string.Empty, + createdAt = new DateTimeOffset(f.CreatedAt).ToUnixTimeMilliseconds(), + createdTime = f.CreatedAt.ToString("yyyy-MM-dd HH:mm:ss.fff"), + expireAt = new DateTimeOffset(f.ExpireAt).ToUnixTimeMilliseconds(), + expireTime = f.ExpireAt.ToString("yyyy-MM-dd HH:mm:ss.fff"), + remainingSeconds = (int)Math.Max(0, (new DateTimeOffset(f.ExpireAt) - now).TotalSeconds) + }).ToList(); + + payload = new + { + roomInfo.RoomId, + roomInfo.RoomName, + roomInfo.GameType, + roomInfo.RoomLevel, + roomInfo.RoomPartition, + roomInfo.RoomNumber, + roomInfo.MaxPlayerCount, + roomInfo.CurrentOnlinePlayerCount, + roomInfo.RobotCount, + roomInfo.Players, + roomInfo.CreateUserId, + roomInfo.SystemFactor, + activeFishes = activeFishPayload + }; + + + } + else + { + payload = roomInfo; + } + await _hubSend.SendUserCIdAsync(cid, "RoomInfo", payload); + if (compatibilityFishPayload != null && compatibilityFishPayload.Count > 0) + { + _ = SendInitialFishAfterSceneReady(cid, roomInfo.RoomId, compatibilityFishPayload); + } + } + + private async Task SendInitialFishAfterSceneReady(string cid, string roomId, List initialFishPayload) + { + try + { + await Task.Delay(300); + var syncNow = DateTimeOffset.UtcNow; + await _hubSend.SendUserCIdAsync(cid, "OnFishSpawn", new + { + type = "init", + timestamp = syncNow.ToUnixTimeMilliseconds(), + serverTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + fish = initialFishPayload + }); + + } + catch (Exception ex) + { + _logger.LogWarning(ex, + "[Socket][FishSpawnData] 首屏鱼延迟补发失败 roomId={RoomId} targetCid={Cid} fishCount={FishCount}", + roomId, cid, initialFishPayload.Count); + } + } + public void RoomKillNotice(string roomId, string fishNumber, string userId, long gold, string fishId, long timespan, double beishu = 1,long skillsGold=0,int fishScore=1, object param = null, object drop = null) + { + + var killtime=DateTime.Now.ToTimeStamp(); + + _hubSend.SendGroup(roomId, "RoomKillNotice", new { fishNumber, userId, gold, fishId, timespan, killtime, msg = $"时间:{killtime - timespan}秒", beishu, skillsGold, fishScore, param, drop }); + } + + + public void RoomDisconnectNotice(string roomId, string userId) + { + _hubSend.SendGroup(roomId, "RoomDisconnectNotice", userId); + } + + public void RoomJoinNotice(string roomId, RedisGamePlayer player) + { + _hubSend.SendGroup(roomId, "RoomJoinNotice", player); + } + + public void ChangeGunMultipleNotice(string roomId, string userId, int multiple) + { + _hubSend.SendGroup(roomId, "ChangeGunMultipleNotice", new { userId, multiple }); + } + + public void RoomFireNotice(string roomId, string userId, List bulletIds, long gold, int count, object extra = null, bool isBot = false) + { + _hubSend.SendGroup(roomId, "RoomFireNotice", new { userId, bulletIds, gold, count, extra, isBot }); + } + + public Task RoomFireNoticeAsync(string roomId, string callerCid, string userId, List bulletIds, long gold, int count, object extra = null, bool isBot = false) + { + var payload = new { userId, bulletIds, gold, count, extra, isBot }; + return Task.WhenAll( + _hubSend.SendUserCIdAsync(callerCid, "RoomFireNotice", payload), + _hubSend.GroupExceptAsync(callerCid, roomId, "RoomFireNotice", payload)); + } + + + public void SyncPlayerGold(string cid, long gold) + { + _hubSend.SendUserCId(cid, "SyncPlayerGold", gold); + } + public void SendPlayerInfo(string cid, RedisGamePlayer player) + { + _hubSend.SendUserCId(cid, "SendPlayerInfoResult", player?.Gold); + } + + + public void RoomLeaveNotice(string roomId, string userId) + { + _hubSend.SendGroup(roomId, "RoomLeaveNotice", userId); + } + + + public void BotLeaveRoomNotice(string roomId, string userId) + { + _hubSend.SendGroup(roomId, "BotLeaveRoomNotice", new { userId }); + } + + + public void ChangeControllerUser(string roomId, string userId) + { + _hubSend.SendGroup(roomId, "ChangeControllerUser", userId); + } + + public void HostDisconnectNotice(string roomId) + { + _hubSend.SendGroup(roomId, "HostDisconnect", null); + } + + + public void SyncGameData(string roomId, object data) + { + _hubSend.SendGroup(roomId, "SyncGameData", data); + } + + public void UsePropNotice(string roomId, string userId, string propNumber) + { + _hubSend.SendGroup(roomId, "UsePropNotice", new { userId, propNumber }); + } + + public void TorpedoResultNotice(string roomId, string userId, string propNumber, long gold, string color) + { + _hubSend.SendGroup(roomId, "TorpedoResultNotice", new { userId, propNumber, gold, color }); + } + + public void PlayerAfkNotice(string roomId, string userId) + { + _hubSend.SendGroup(roomId, "PlayerAfkNotice", new { userId }); + } + + public void PlayerCancelAfkNotice(string roomId, string userId) + { + _hubSend.SendGroup(roomId, "PlayerCancelAfkNotice", new { userId }); + } + } +} diff --git a/FishGameSrc/FishGameService/GameSend/IFishingSendService.cs b/FishGameSrc/FishGameService/GameSend/IFishingSendService.cs new file mode 100644 index 0000000..f9cc977 --- /dev/null +++ b/FishGameSrc/FishGameService/GameSend/IFishingSendService.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FishGameService.Services; +using RedisService.Param; + +namespace FishGameService.GameSend +{ + public interface IFishingSendService + { + + void BindSuccess(string cid); + void ErrorMessage(string cid, int code, string msg); + + + + void SyncGameData(string roomId, object data); + + void RoomKillNotice(string roomId, string fishNumber, string userId, long gold, string fishId, long timespan, double beishu = 1,long skillsGold = 0,int fishScore = 1, object param = null, object drop = null); + + void RoomJoinNotice(string roomId, RedisGamePlayer player); + + Task SendRoomInfo(string cid, RedisGameRoom roomInfo, List activeFishes = null); + + void RoomLeaveNotice(string roomId, string userId); + + void BotLeaveRoomNotice(string roomId, string userId); + + void RoomDisconnectNotice(string roomId, string userId); + + + + void ChangeControllerUser(string roomId, string userId); + + void HostDisconnectNotice(string roomId); + void UsePropNotice(string roomId, string userId, string propNumber); + + void TorpedoResultNotice(string roomId, string userId, string propNumber, long gold, string color); + void ChangeGunMultipleNotice(string roomId, string userId, int multiple); + + void RoomFireNotice(string roomId, string userId, List bulletIds, long gold, int count, object extra = null, bool isBot = false); + + Task RoomFireNoticeAsync(string roomId, string callerCid, string userId, List bulletIds, long gold, int count, object extra = null, bool isBot = false); + + + void SyncPlayerGold(string cid, long gold); + + void SendPlayerInfo(string cid, RedisGamePlayer player); + + void PlayerAfkNotice(string roomId, string userId); + void PlayerCancelAfkNotice(string roomId, string userId); + + + + + + void KillNotice(string fishNumber, string userName, long gold); + void KillNotice(string fishNumber, string userName, long gold, string fishName, long multiplier, + string gameTypeName, string roomName, long timestamp); + + + } +} diff --git a/FishGameSrc/FishGameService/GameService/FishSpawnConfigStore.cs b/FishGameSrc/FishGameService/GameService/FishSpawnConfigStore.cs new file mode 100644 index 0000000..cbe21b4 --- /dev/null +++ b/FishGameSrc/FishGameService/GameService/FishSpawnConfigStore.cs @@ -0,0 +1,143 @@ +using System; +using System.Collections.Concurrent; +using System.Linq; +using System.Text.Json; +using CommonDomain; +using CommonDomain.BaseModel; +using Microsoft.Extensions.Logging; +using RedisService; + +namespace FishGameService.GameService +{ + public class FishSpawnConfigStore + { + private readonly IRedisService _redisService; + private readonly ILogger _logger; + + private readonly ConcurrentDictionary _cache = new ConcurrentDictionary(); + + private FishSpawnConfigStoreModel _storeModel; + + private DateTime _lastLoadTime = DateTime.MinValue; + + private const int ReloadIntervalSeconds = 5; + + public FishSpawnConfigStore(IRedisService redisService, ILogger logger) + { + _redisService = redisService; + _logger = logger; + } + + public FishSpawnLevelConfig GetOrLoad(int gameType, int roomLevel) + { + var cacheKey = $"{gameType}:{roomLevel}"; + if (_cache.TryGetValue(cacheKey, out var levelConfig)) + { + return levelConfig; + } + + LoadFromRedis(); + + _cache.TryGetValue(cacheKey, out levelConfig); + if (levelConfig == null) + { + + } + return levelConfig; + } + + public void InvalidateAll() + { + _cache.Clear(); + _storeModel = null; + _lastLoadTime = DateTime.MinValue; + + } + + private void AutoExtractAndSave() + { + try + { + var gameConfig = _redisService.GetGameConfig(); + if (gameConfig != null) + { + var json = FishSpawnExtractor.ExtractToJson(gameConfig, _logger); + if (!string.IsNullOrWhiteSpace(json) && json != "{}") + { + _redisService.SetFishSpawnConfig(json); + + return; + } + } + } + catch (Exception ex) + { + _logger.LogWarning(ex, "[FishSpawnConfigStore] 从 GameConfig 提取出鱼配置失败"); + } + } + + private void LoadFromRedis() + { + if ((DateTime.Now - _lastLoadTime).TotalSeconds < ReloadIntervalSeconds && _storeModel != null) + { + + return; + } + + try + { + var json = _redisService.GetFishSpawnConfig(); + + + if (string.IsNullOrWhiteSpace(json) || json == "{}") + { + + AutoExtractAndSave(); + json = _redisService.GetFishSpawnConfig(); + if (string.IsNullOrWhiteSpace(json) || json == "{}") + { + + return; + } + } + + _storeModel = JsonSerializer.Deserialize(json, new JsonSerializerOptions + { + PropertyNameCaseInsensitive = true + }); + + if (_storeModel?.Levels == null || _storeModel.Levels.Count == 0) + { + + return; + } + + if (_storeModel.Levels.Keys.Any(k => !k.Contains(':'))) + { + + AutoExtractAndSave(); + json = _redisService.GetFishSpawnConfig(); + _storeModel = JsonSerializer.Deserialize(json, new JsonSerializerOptions + { + PropertyNameCaseInsensitive = true + }); + } + + _cache.Clear(); + foreach (var kv in _storeModel.Levels) + { + if (kv.Key.Contains(':') && kv.Value != null) + { + _cache[kv.Key] = kv.Value; + } + } + + _lastLoadTime = DateTime.Now; + } + catch (Exception ex) + { + _logger.LogError(ex, "[FishSpawnConfigStore] 从 Redis 加载出鱼配置失败"); + } + } + } +} diff --git a/FishGameSrc/FishGameService/GameService/FishingGameService.cs b/FishGameSrc/FishGameService/GameService/FishingGameService.cs new file mode 100644 index 0000000..139a015 --- /dev/null +++ b/FishGameSrc/FishGameService/GameService/FishingGameService.cs @@ -0,0 +1,3097 @@ +using System.Collections.Concurrent; +using System.Diagnostics; +using System.Numerics; +using System.Text.Json; +using AutoMapper; +using Common.Redis; +using UserDomain.Entity; +using Common.Utils; +using CommonDomain; +using CommonDomain.BaseModel; +using CommonDomain.Enum; +using CommonService; +using DotNetCore.CAP; +using FishGameService.Config; +using FishGameService.GameSend; +using FishGameService.Hubs; +using FishGameService.Services; +using FishGameService.Utils; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.Logging; +using MongoDB.Driver; +using MongoDB.Driver.Linq; +using MongoRepository; +using NewLife; +using RedisHelper; +using RedisService; +using RedisService.Param; +using UserDomain.Entity; +using UserDomain.Enum; +using UserService.Param; +using UserService.Tasks.Param; +using UserService.Hubs; +using UserService.User; +using XAct.Users; + +namespace FishGameService.GameService +{ + public class FishingGameService : IFishingGameService, IPendingSettlementService + { + + private readonly ICapPublisher _capPublisher; + private readonly IRedisService _redisService; + private readonly ILogger _logger; + private readonly IHubSend _hubGame; + private readonly IFishingSendService _sendResult; + private GameConfig _gameConfig; + private ActivityConfig _activityConfig; + private static GameConfig _sharedGameConfig; + private static ActivityConfig _sharedActivityConfig; + private static DateTime _sharedBaseConfigLastFetch = DateTime.MinValue; + private static readonly TimeSpan BaseConfigCacheDuration = TimeSpan.FromMinutes(5); + private static readonly object BaseConfigLock = new(); + private static FishingKillConfig _fishingKillConfig; + private static DateTime _fishingKillLastFetch = DateTime.MinValue; + private static readonly TimeSpan FishingKillCacheDuration = TimeSpan.FromMinutes(30); + private static readonly object _fishingKillLock = new(); + private readonly IUserService _userService; + private readonly IMapper _mapper; + private readonly IDistributedLock _distributedLock; + + + private readonly BulletConfig _bulletConfig; + private readonly IMongoBaseRepository _botProfileRepo; + private readonly IBulletTracker _bulletTracker; + private readonly IFishKillTracker _fishKillTracker; + private readonly IHubContext _hubLoginContext; + private readonly FishSpawnService _fishSpawnService; + + private static readonly ConcurrentDictionary PendingDisconnects = new(); + private static readonly int DisconnectTimeoutSeconds = 60; + + private static readonly ConcurrentDictionary PlayerFactorCache = new(); + private static readonly TimeSpan FactorRefreshInterval = TimeSpan.FromMinutes(5); + private static long _cachedSystemGold; + private static DateTime _systemGoldLastFetch = DateTime.MinValue; + private static readonly TimeSpan SystemGoldCacheDuration = TimeSpan.FromMinutes(5); + private static readonly object _systemGoldLock = new(); + + private static readonly ConcurrentDictionary _lastFactorPersist = new(); + private static readonly TimeSpan FactorPersistInterval = TimeSpan.FromSeconds(30); + + + public FishingGameService(ICapPublisher capPublisher, IRedisService redisService, IHubSend hubGame, IFishingSendService sendResult, IUserService userService, IMapper mapper, IDistributedLock distributedLock, BulletConfig bulletConfig, ILogger logger, IMongoBaseRepository botProfileRepo, IBulletTracker bulletTracker, IFishKillTracker fishKillTracker, IHubContext hubLoginContext, FishSpawnService fishSpawnService) + { + _capPublisher = capPublisher; + _redisService = redisService; + _hubGame = hubGame; + _sendResult = sendResult; + _userService = userService; + LoadBaseConfigs(redisService, out _gameConfig, out _activityConfig); + _mapper = mapper; + _distributedLock = distributedLock; + _bulletConfig = bulletConfig; + _logger = logger; + _botProfileRepo = botProfileRepo; + _bulletTracker = bulletTracker; + _fishKillTracker = fishKillTracker; + _hubLoginContext = hubLoginContext; + _fishSpawnService = fishSpawnService; + } + + private static void LoadBaseConfigs(IRedisService redisService, out GameConfig gameConfig, out ActivityConfig activityConfig) + { + var now = DateTime.UtcNow; + if (_sharedGameConfig == null || _sharedActivityConfig == null + || now - _sharedBaseConfigLastFetch > BaseConfigCacheDuration) + { + lock (BaseConfigLock) + { + if (_sharedGameConfig == null || _sharedActivityConfig == null + || now - _sharedBaseConfigLastFetch > BaseConfigCacheDuration) + { + _sharedGameConfig = redisService.GetGameConfig() ?? _sharedGameConfig; + _sharedActivityConfig = redisService.GetActivityConfig() ?? _sharedActivityConfig; + _sharedBaseConfigLastFetch = now; + } + } + } + + gameConfig = _sharedGameConfig; + activityConfig = _sharedActivityConfig; + } + + + + + + + public async Task JoinRoom(string cid, string roomId, string userId, int posituin) + { + + var existingSession = _redisService.GetRedisUserCId(userId); + if (!string.IsNullOrWhiteSpace(existingSession?.RoomId) + && existingSession.RoomId != roomId) + { + + await SettleGoldAsync(userId); + } + var room = _redisService.GetGameRoom(roomId); + + if (room == null) + { + room = new RedisGameRoom + { + RoomId = roomId, + RoomName = "新手渔场", + GameType = GameTypeEnum.风雷之渊, + RoomLevel = 1, + RoomPartition = 0, + RoomNumber = 1, + MaxPlayerCount = 4, + CurrentOnlinePlayerCount = 0, + RobotCount = 0, + Players = new List(), + CreateUserId = "" + }; + _redisService.SetGameRoom(room); + + } + + NormalizeRoomPlayerCounts(room, preserveEmptyRoomRobotPlan: true); + + var existingPlayer = room.Players.FirstOrDefault(c => c.UserId == userId && !c.IsBot); + if (existingPlayer != null) + { + + CancelPendingDisconnect(userId); + var oldCId = existingPlayer.CId; + existingPlayer.State = 0; + existingPlayer.CId = cid; + if (string.IsNullOrWhiteSpace(room.CreateUserId) + || !room.Players.Any(p => !p.IsBot && p.UserId == room.CreateUserId)) + room.CreateUserId = existingPlayer.UserId; + + if (!string.IsNullOrWhiteSpace(oldCId) && oldCId != cid) + { + + if (!string.IsNullOrWhiteSpace(roomId)) + { + var oldRoom = _redisService.GetGameRoom(roomId); + if (oldRoom != null) + { + var oldPlayer = oldRoom.Players.FirstOrDefault(p => p.UserId == userId && !p.IsBot); + if (oldPlayer != null && oldPlayer.CId == oldCId) + { + oldPlayer.CId = ""; + oldPlayer.State = 1; + _redisService.SetGameRoom(oldRoom); + + } + } + } + } + else + { + + } + + _hubGame.AddGroup(cid, roomId); + var userRedis1 = _redisService.GetRedisUserCId(userId) ?? new RedisUserCid { UserId = userId }; + userRedis1.RoomId = roomId; + userRedis1.CId = cid; + userRedis1.PartitionId = ""; + _redisService.SetRedisUserCId(userRedis1); + _redisService.SetUserId(cid, userId); + NormalizeRoomPlayerCounts(room); + + _redisService.SetGameRoom(room); + _fishSpawnService.RegisterRoom(roomId, (int)room.GameType, room.RoomLevel); + var fishes = _fishSpawnService.GetActiveFishes(roomId); + + await _sendResult.SendRoomInfo(cid, room, fishes); + _hubGame.SendUserCId(cid, "OnPlayerInfo", new + { + userId = existingPlayer.UserId, + userName = existingPlayer.UserName, + gold = existingPlayer.Gold, + diamond = existingPlayer.Diamond, + viplvl = existingPlayer.VipLevel, + cannonMultiple = existingPlayer.CannonMultiple, + cannonId = existingPlayer.CannonId, + wingsId = existingPlayer.WingsId, + position = existingPlayer.Position + }); + // _sendResult.RoomJoinNotice(roomId, existingPlayer); + _sendResult.ChangeControllerUser(roomId, room.CreateUserId); + + await SendRoomChange(room); + return; + } + + + if (RoomBotFactory.FixedBotSeatsEnabled && posituin >= 0 && RoomBotFactory.FixedBotSeats.Contains(posituin)) + { + + posituin = -1; + } + + if (room.Players.Any(c => c.Position == posituin)) + { + var occ = room.Players.Select(p => p.Position).ToHashSet(); + var nextPos = -1; + for (int p = 0; p < room.MaxPlayerCount; p++) + { + if (!occ.Contains(p) + && !(RoomBotFactory.FixedBotSeatsEnabled && RoomBotFactory.FixedBotSeats.Contains(p))) + { + nextPos = p; + break; + } + } + if (nextPos < 0) + { + + _sendResult.ErrorMessage(cid, ErrorCodes.房间已满, "房间人数已满"); + return; + } + + posituin = nextPos; + } + + if (room.Players.Count >= room.MaxPlayerCount) + { + + _sendResult.ErrorMessage(cid, ErrorCodes.房间已满, "房间人数已满"); + return; + } + + + + var existingRedis = _redisService.GetRedisUserCId(userId); + if (existingRedis != null && !string.IsNullOrWhiteSpace(existingRedis.RoomId) && existingRedis.RoomId != roomId) + { + + await CleanupRoomAsync(userId, force: true); + } + + var userRedis = _redisService.GetRedisUserCId(userId); + if (userRedis == null) + userRedis = new RedisUserCid() { UserId = userId }; + userRedis.RoomId = roomId; + userRedis.CId = cid; + userRedis.PartitionId = ""; + + + UserEntity user; + try + { + user = await _userService.GetUser(userId); + } + catch + { + user = null; + } + if (user == null) + { + + user = new UserEntity(); + user.BaseInfo.UserName = userId; + user.BaseInfo.AvatarUrl = ""; + user.Assets.Gold = 100000; + user.Assets.Diamond = 0; + user.Assets.VipLevel = 0; + } + + userRedis.UserName = user.BaseInfo.UserName ?? userId; + try + { + user.Static.RoomNumber = roomId; + user.Static.CurrentGameType = (int)room.GameType; + await _userService.UpdateUser(user); + } + catch + { + // ignore update failures + } + if (_gameConfig == null) + { + var configPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Config", "gameconfig.json"); + if (File.Exists(configPath)) + { + var json = File.ReadAllText(configPath); + _gameConfig = System.Text.Json.JsonSerializer.Deserialize(json, new System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true }); + + } + else + { + _gameConfig = new GameConfig + { + RoomConfigs = new List + { + new RoomConfig { RoomNumber = "1", RoomName = "新手渔场", GameType = GameTypeEnum.风雷之渊, RoomLevel = 1, RoomPartitionNum = 1, RoomCount = 1, RoomGoldLimit = 0, CannonMultipleList = new List { 10, 20, 50, 100, 200 } } + }, + FishRoomConfig = new FishRoomConfig { SeatSelectLimit = new List { 1, 2 } } + }; + var dir = Path.GetDirectoryName(configPath); + if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir)) Directory.CreateDirectory(dir); + var json = System.Text.Json.JsonSerializer.Serialize(_gameConfig, new System.Text.Json.JsonSerializerOptions { WriteIndented = true }); + File.WriteAllText(configPath, json); + + } + _redisService.SetGameConfig(_gameConfig); + } + + var roomConfig = _gameConfig.RoomConfigs?.Where(c => c.GameType == room.GameType && c.RoomLevel == room.RoomLevel).FirstOrDefault(); + if (roomConfig == null) + { + + roomConfig = new RoomConfig + { + RoomNumber = "1", + RoomName = "新手渔场", + GameType = GameTypeEnum.风雷之渊, + RoomLevel = 1, + RoomPartitionNum = 1, + RoomCount = 1, + RoomGoldLimit = 0, + CannonMultipleList = new List { 10, 20, 50, 100, 200 } + }; + } + + + if (user.Assets.Gold < roomConfig.RoomGoldLimit) + { + _sendResult.ErrorMessage(cid, ErrorCodes.金币不足, "金币不足 不满足房间要求"); + return; + } + + var occupied = room.Players.Select(p => p.Position).ToHashSet(); + int naturalPos = -1; + for (int p = 0; p < room.MaxPlayerCount; p++) + { + if (!occupied.Contains(p) + && !(RoomBotFactory.FixedBotSeatsEnabled && RoomBotFactory.FixedBotSeats.Contains(p))) + { + naturalPos = p; + break; + } + } + + + if (naturalPos < 0) + { + + _sendResult.ErrorMessage(cid, ErrorCodes.房间已满, "房间人数已满"); + return; + } + + if (posituin < 0) + { + posituin = naturalPos; + } + else if (posituin != naturalPos) + { + var seatLimit = _gameConfig?.FishRoomConfig?.SeatSelectLimit ?? new List(); + bool canManualSelect = false; + if (seatLimit.Any(c => c == 3)) + canManualSelect = true; + if (seatLimit.Any(c => c == 1) && user.Assets.VipLevel > 0) + { + var vipLevels = _gameConfig?.FishRoomConfig?.SeatSelectVipLevels ?? new List(); + if (vipLevels.Count == 0 || vipLevels.Contains(user.Assets.VipLevel)) + canManualSelect = true; + } + if (seatLimit.Any(c => c == 2) && user.UserType == 2) + canManualSelect = true; + if (!canManualSelect) + { + + var roles = new List(); + if (seatLimit.Any(c => c == 1)) roles.Add("VIP"); + if (seatLimit.Any(c => c == 2)) roles.Add("代理"); + var msg = roles.Count > 0 ? $"只有{string.Join("/", roles)}才能选择座位" : "没有权限选择座位"; + _sendResult.ErrorMessage(cid, ErrorCodes.未知错误, msg); + return; + } + } + + _redisService.SetUserId(cid, userId); + _redisService.SetRedisUserCId(userRedis); + + + //var systemTotal= _redisService.GetTotalRechargeAmount(); + + //var systemYue = _redisService.GetTotalUserGold(); + + //(systemTotal - systemYue) + + + + var player = new RedisGamePlayer(); + player.UserId = userId; + player.UserName = user.BaseInfo.UserName; + player.UserNumber = user.BaseInfo.Number; + player.Avatar = user.BaseInfo.AvatarUrl; + player.IsRedName = user.BaseInfo.IsRedName; + player.Level = user.Assets.Level; + player.Exp = user.Assets.Exp; + var levelCfg = _gameConfig?.UserLevelConfigs?.FirstOrDefault(c => c.Level == user.Assets.Level); + player.MaxExp = levelCfg?.ExpMax ?? 0; + player.VipLevel = user.Assets.VipLevel; + + player.Gold = user.Assets.Gold; + player.Diamond = user.Assets.Diamond; + player.CannonId = user.CannonUsing?.Number; + player.WingsId = user.WingUsing?.Number; + player.WarGodId = user.GodWarUsing?.Number; + player.CannonMultiple = roomConfig.CannonMultipleList.FirstOrDefault(); + player.BeginCoin = player.Gold; + player.MaxGold = player.Gold; + + player.Position = posituin; + player.CId = cid; + player.BeginTime = DateTime.Now.ToTimeStamp(); + player.PlayerFactor = user.PlayerFactor; + player.TotalRechargeGold = user.Static.TotalRechargeGold; + player.SafeBoxGold = user.SafeBox?.Amount ?? 0; + + room.Players.Add(player); + + + if (string.IsNullOrWhiteSpace(room.CreateUserId) + || !room.Players.Any(p => !p.IsBot && p.UserId == room.CreateUserId)) + room.CreateUserId = player.UserId; + + + room.CurrentOnlinePlayerCount++; + _hubGame.AddGroup(cid, roomId); + + _sendResult.ChangeControllerUser(roomId, room.CreateUserId); + + var latestGameConfig = _redisService.GetGameConfig() ?? _gameConfig; + _gameConfig = latestGameConfig; + var botsEnabled = latestGameConfig?.BotConfig?.Enabled == true; + if (!botsEnabled) + { + var existingBots = room.Players.Where(p => p.IsBot).ToList(); + foreach (var bot in existingBots) + await RemoveBotFromRoom(room, bot, sendLeaveRoom: true, showWaiting: false); + room.RobotCount = 0; + _redisService.SetGameRoom(room); + + } + + int diagBotCount = room.Players.Count(p => p.IsBot); + bool diagIsFirstHuman = room.Players.Count(p => !p.IsBot && p.State == 0) == 1; + + if (botsEnabled && diagIsFirstHuman) + { + int currentBotCount = room.Players.Count(p => p.IsBot); + if (currentBotCount < room.RobotCount) + { + + CreateRoomBots(room, roomConfig); + + } + else + { + + } + } + NormalizeRoomPlayerCounts(room); + room.Players = room.Players.OrderBy(c => c.Position).ToList(); + _redisService.SetGameRoom(room); + _fishSpawnService.RegisterRoom(roomId, (int)room.GameType, room.RoomLevel); + List activeFishes = _fishSpawnService.GetActiveFishes(roomId); + + await _sendResult.SendRoomInfo(cid, room, activeFishes); + _sendResult.RoomJoinNotice(roomId, player); + + _hubGame.SendGroup(roomId, "OnSeatChange", new + { + type = "join", + playerId = player.Position + 1, + position = player.Position, + playerName = player.UserName, + nickname = player.UserName, + gold = player.Gold, + diamond = player.Diamond, + vipLevel = player.VipLevel, + turretId = 1, + turretRate = 1, + turretLv = 1, + headId = 1, + roomRate = 1, + bulletPower = 1 + }); + + _hubGame.SendUserCId(cid, "OnPlayerInfo", new + { + userId = player.UserId, + userName = player.UserName, + gold = player.Gold, + diamond = player.Diamond, + viplvl = player.VipLevel, + cannonMultiple = player.CannonMultiple, + cannonId = player.CannonId, + wingsId = player.WingsId, + position = player.Position + }); + + _redisService.SetGameRoom(room); + + + + await SendRoomChange(room); + + } + + + public async Task LeaveRoom(string cid, string roomId, string userId) + { + var leaveRequestTimestamp = Stopwatch.GetTimestamp(); + if (string.IsNullOrWhiteSpace(userId)) + userId = _redisService.GetUserId(cid); + + var markedLeaving = await _distributedLock.TryExecuteAsync( + $"{RedisKey.DistributedLockPrefix}fish:gold:{roomId}:{userId}", + () => MarkPlayerLeavingAsync(cid, roomId, userId), + retry: true); + if (!markedLeaving) + return; + + await _distributedLock.TryExecuteAsync( + $"{RedisKey.DistributedLockPrefix}fish:gold:{roomId}:{userId}", + () => CompleteLeaveIfPendingAsync(cid, roomId, userId, leaveRequestTimestamp), + retry: true); + } + + private async Task CompleteLeaveIfPendingAsync(string cid, string roomId, string userId, long leaveRequestTimestamp) + { + var room = _redisService.GetGameRoom(roomId); + var player = room?.Players?.FirstOrDefault(p => p.UserId == userId && !p.IsBot); + if (player != null && player.State != 2) + { + + return; + } + + await LeaveRoomValidated(cid, roomId, userId, leaveRequestTimestamp); + } + + private Task MarkPlayerLeavingAsync(string cid, string roomId, string userId) + { + if (!IsCallerUser(cid, roomId, userId)) + { + + return Task.FromResult(false); + } + + var room = _redisService.GetGameRoom(roomId); + var player = room?.Players?.FirstOrDefault(p => p.UserId == userId && !p.IsBot); + if (room == null || player == null) + return Task.FromResult(true); + + player.State = 2; + _redisService.SetGameRoom(room); + + return Task.FromResult(true); + } + + private async Task LeaveRoomValidated(string cid, string roomId, string userId, long leaveRequestTimestamp) + { + + if (string.IsNullOrWhiteSpace(userId)) + { + userId = _redisService.GetUserId(cid); + + } + CancelPendingDisconnect(userId); + if (!IsCallerUser(cid, roomId, userId)) + { + var mappedUserId = string.IsNullOrWhiteSpace(cid) ? null : _redisService.GetUserId(cid); + var session = _redisService.GetRedisUserCId(userId); + + if (!string.IsNullOrWhiteSpace(cid)) + _hubGame.SendUserCId(cid, "KickToMainPage", new { userId }); + return; + } + + await LeaveRoomInternal(cid, roomId, userId, leaveRequestTimestamp); + + } + + private async Task LeaveRoomInternal(string cid, string roomId, string userId, long leaveRequestTimestamp = 0) + { + + var room = _redisService.GetGameRoom(roomId); + + if (room == null) + { + + if (!string.IsNullOrWhiteSpace(cid)) + _sendResult.ErrorMessage(cid, ErrorCodes.房间不存在, "房间信息不存在"); + return; + } + + var userRedis = _redisService.GetRedisUserCId(userId); + + if (userRedis != null) + { + if (userRedis.RoomId != roomId) + { + + } + } + + var playerInfo = room.Players.Where(p => p.UserId == userId).FirstOrDefault(); + + + if (playerInfo == null) + { + + await TryFlushFishingProgress(roomId, userId, null); + _redisService.ClearPlayerRuntimeData(roomId, userId); + PlayerFactorCache.TryRemove($"{roomId}|{userId}", out _); + _bulletTracker.Clear(roomId, userId); + if (!string.IsNullOrWhiteSpace(cid)) + { + _sendResult.RoomLeaveNotice(roomId, userId); + _hubGame.RemoveGroup(cid, roomId); + } + if (userRedis?.RoomId == roomId) + { + userRedis.RoomId = ""; + userRedis.CId = ""; + userRedis.PartitionId = ""; + _redisService.SetRedisUserCId(userRedis); + } + try + { + var user = await _userService.GetUser(userId); + if (user != null) + { + user.Static ??= new StaticInfo(); + user.Static.RoomNumber = string.Empty; + user.Static.CurrentGameType = 0; + await _userService.UpdateUser(user); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "LeaveRoom幂等分支清除房间状态失败 roomId={RoomId} userId={UserId}", roomId, userId); + } + return; + } + + try + { + var user = await _userService.GetUser(userId); + if (user != null) + { + user.Static ??= new StaticInfo(); + user.Static.RoomNumber = string.Empty; + user.Static.CurrentGameType = 0; + if (playerInfo.BeginTime > 0) + { + var duration = DateTime.Now.ToTimeStamp() - playerInfo.BeginTime; + if (duration > 0) + { + user.Static.OnlineTime += duration; + user.Static.GameTime += duration; + } + } + if (playerInfo.PlayerFactor != null) + { + if (playerInfo.PlayerFactor.CompensateTargetGold > 0) + { + var remainingQuota = Math.Max( + 0L, + playerInfo.PlayerFactor.CompensateTargetGold - playerInfo.Gold); + playerInfo.PlayerFactor.CompensateQuota = (int)Math.Min(int.MaxValue, remainingQuota); + if (remainingQuota <= 0) + { + playerInfo.PlayerFactor.CompensateTargetGold = 0; + playerInfo.PlayerFactor.CompensateStartGold = 0; + } + } + if (user.PlayerFactor != null) + { + user.PlayerFactor.CompensateQuota = playerInfo.PlayerFactor.CompensateQuota; + user.PlayerFactor.CompensateTargetGold = playerInfo.PlayerFactor.CompensateTargetGold; + user.PlayerFactor.CompensateStartGold = playerInfo.PlayerFactor.CompensateStartGold; + user.PlayerFactor.PenaltyQuota = playerInfo.PlayerFactor.PenaltyQuota; + } + } + await _userService.UpdateUser(user); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "LeaveRoom更新在线时长失败 roomId={RoomId} userId={UserId}", roomId, userId); + } + + + await TryFlushFishingSettlement(room, playerInfo); + + + if (!string.IsNullOrWhiteSpace(cid)) + _sendResult.SyncPlayerGold(cid, playerInfo.Gold); + + + _redisService.ClearPlayerRuntimeData(roomId, userId); + PlayerFactorCache.TryRemove($"{roomId}|{userId}", out _); + _bulletTracker.Clear(roomId, userId); + room.Players.Remove(playerInfo); + + + if (room.CreateUserId == playerInfo.UserId && room.Players.Count() > 0) + { + var onlinePlayer = room.Players.FirstOrDefault(p => !p.IsBot && p.State == 0); + var realPlayer = onlinePlayer ?? room.Players.FirstOrDefault(p => !p.IsBot); + room.CreateUserId = realPlayer?.UserId ?? string.Empty; + + if (!string.IsNullOrWhiteSpace(room.CreateUserId)) + _sendResult.ChangeControllerUser(roomId, room.CreateUserId); + } + NormalizeRoomPlayerCounts(room); + + + bool hasNoRealPlayers = !room.Players.Any(p => !p.IsBot); + if (hasNoRealPlayers) + { + var keptRobotCount = room.RobotCount; + room.Players.Clear(); + room.CreateUserId = string.Empty; + room.CurrentOnlinePlayerCount = 0; + room.RobotCount = Math.Clamp(keptRobotCount, 0, Math.Max(0, room.MaxPlayerCount)); + ClearKillFishIds(roomId); + + } + + _redisService.SetGameRoom(room); + if (hasNoRealPlayers) + _fishSpawnService.UnregisterRoom(roomId); + + + _hubGame.SendGroup(room.RoomId, "OnSeatChange", new + { + type = "leave", + userId = userId, + playerId = playerInfo.Position + 1, + position = playerInfo.Position, + showWaiting = false + }); + if (userRedis?.RoomId == roomId) + { + userRedis.RoomId = ""; + userRedis.CId = ""; + userRedis.PartitionId = ""; + _redisService.SetRedisUserCId(userRedis); + + } + if (!string.IsNullOrWhiteSpace(cid)) + { + _sendResult.RoomLeaveNotice(roomId, userId); + var leaveElapsedMs = leaveRequestTimestamp == 0 + ? -1D + : Stopwatch.GetElapsedTime(leaveRequestTimestamp).TotalMilliseconds; + + + _hubGame.RemoveGroup(cid, roomId); + + } + else + { + _hubGame.SendGroup(roomId, "RoomLeaveNotice", userId); + + } + + + + await SendRoomChange(room); + + } + + public async Task KillFish(string cid, string roomId, string userId, string fishNumber, string fihsId, long gold, long timespan, string bulletId, long timestamp, string sign) + { + return await _distributedLock.TryExecuteAsync( + $"{RedisKey.DistributedLockPrefix}fish:gold:{roomId}:{userId}", + () => KillFishInternal(cid, roomId, userId, fishNumber, fihsId, gold, timespan, bulletId, timestamp, sign), + retry: true); + } + + private async Task KillFishInternal(string cid, string roomId, string userId, string fishNumber, string fihsId, long gold, long timespan, string bulletId, long timestamp, string sign) + { + if (!VerifySign(cid, $"{roomId}|{userId}|{fishNumber}|{fihsId}|{gold}|{timespan}|{bulletId}|{timestamp}", timestamp, sign)) + { + _sendResult.ErrorMessage(cid, ErrorCodes.签名错误, "签名错误"); + return 0; + } + ; + + if (string.IsNullOrWhiteSpace(fishNumber) && + long.TryParse(fihsId, out var syncedFishId) && + _fishSpawnService.TryGetFishNumber(roomId, syncedFishId, out var resolvedFishNumber)) + { + fishNumber = resolvedFishNumber; + + } + + var killConfig = GetFishingKillConfig(); + + var fishConfig = killConfig?.FishTypeConfigs?.FirstOrDefault(c => c.FishNumber == fishNumber); + if (fishConfig == null) + { + + if (!string.IsNullOrWhiteSpace(cid)) + _sendResult.ErrorMessage(cid, ErrorCodes.鱼配置不存在, "鱼配置不存在"); + return 0; + } + var gameRoom = _redisService.GetGameRoom(roomId); + if (gameRoom == null) + { + + if (!string.IsNullOrWhiteSpace(cid)) + _sendResult.ErrorMessage(cid, ErrorCodes.房间不存在, "房间不存在"); + return 0; + } + var player = gameRoom.Players.Where(c => c.UserId == userId).FirstOrDefault(); + if (player == null) + { + + if (!string.IsNullOrWhiteSpace(cid)) + _sendResult.ErrorMessage(cid, ErrorCodes.玩家不在房间, "玩家不在房间"); + return 0; + } + if (player.State == 2) + { + + return player.Gold; + } + if (!IsCallerPlayer(cid, gameRoom, player)) + { + _hubGame.SendUserCId(cid, "KickToMainPage", new { userId }); + return player.Gold; + } + if (gold <= 0 || string.IsNullOrWhiteSpace(bulletId)) + { + _sendResult.ErrorMessage(cid, ErrorCodes.子弹参数无效, "子弹参数无效"); + return player.Gold; + } + + if (!TryConsumeBullet(roomId, userId, bulletId)) + { + + return player.Gold; + } + + var isKill = false; + var factor = 0.0; + var playerFactor = await GetPlayerFactorAsync(roomId, userId); + + long? serverFishId = null; + if (long.TryParse(fihsId, out var fishIdLong)) + { + serverFishId = fishIdLong; + if (!_fishSpawnService.ValidateFishHit(roomId, fishIdLong)) + { + return player.Gold; + } + } + + bool isMiss = false; + if (playerFactor.MissRate > 0) + { + isMiss = Random((int)(playerFactor.MissRate * 100), 10000); + } + + double killWeight = fishConfig.KillWeight; + int randomRoll = 0; + + if (!isMiss) + { + long totalGold = player.Gold + player.SafeBoxGold; + long actualProfit = totalGold - (player.TotalRechargeGold + playerFactor.StartingBonus); + double rawPlayer = -actualProfit / (_gameConfig.KillConfig.NormalizationFactorPlayer * 1.0); + double playerModifier = 1.0 + rawPlayer; + double clampedPlayer = Math.Clamp(playerModifier, _gameConfig.KillConfig.MinPlayerModifier, _gameConfig.KillConfig.MaxPlayerModifier); + string quotaInfo; + double fishRate = 1.0; + double userfactor; + if (playerFactor.IsBlack) + { + userfactor = _gameConfig.KillConfig.ViolateValue; + quotaInfo = $"黑名单 系统违规值={_gameConfig.KillConfig.ViolateValue}"; + } + else + { + if (playerFactor.CompensateQuota > 0 + && (playerFactor.CompensateTargetGold <= 0 || player.Gold < playerFactor.CompensateTargetGold)) + { + fishRate = fishConfig.FishType switch + { + FishTypeEnum.普通鱼 => playerFactor.CompensateRate.Ordinary, + FishTypeEnum.Boss鱼 or FishTypeEnum.特殊Boss => playerFactor.CompensateRate.BossRate, + FishTypeEnum.黄金鱼 => playerFactor.CompensateRate.GoldRate, + FishTypeEnum.特殊鱼 => playerFactor.CompensateRate.SpecialRate, + _ => 1.0 + }; + quotaInfo = $"补偿 Quota={playerFactor.CompensateQuota} fishRate={fishRate}"; + } + else if (playerFactor.PenaltyQuota > 0) + { + fishRate = fishConfig.FishType switch + { + FishTypeEnum.普通鱼 => playerFactor.PenaltyRate.Ordinary, + FishTypeEnum.Boss鱼 or FishTypeEnum.特殊Boss => playerFactor.PenaltyRate.BossRate, + FishTypeEnum.黄金鱼 => playerFactor.PenaltyRate.GoldRate, + FishTypeEnum.特殊鱼 => playerFactor.PenaltyRate.SpecialRate, + _ => 1.0 + }; + quotaInfo = $"罚款 Quota={playerFactor.PenaltyQuota} fishRate={fishRate}"; + } + else + { + quotaInfo = "无配额"; + } + double baseFactor = Math.Round(Math.Clamp(clampedPlayer, _gameConfig.KillConfig.MinPlayerModifier, _gameConfig.KillConfig.MaxPlayerModifier), 2); + if (Math.Abs(baseFactor - playerFactor.ViolateValue) >= 0.01) + { + playerFactor.ViolateValue = baseFactor; + player.PlayerFactor = playerFactor; + _redisService.SetPlayerFactor(roomId, userId, playerFactor); + _redisService.SetGameRoom(gameRoom); + var lastSave = _lastFactorPersist.GetOrAdd(userId, DateTime.MinValue); + if (DateTime.UtcNow - lastSave > FactorPersistInterval) + { + try + { + var user = await _userService.GetUser(userId); + if (user?.PlayerFactor != null) + { + user.PlayerFactor.ViolateValue = baseFactor; + await _userService.UpdateUser(user); + _lastFactorPersist[userId] = DateTime.UtcNow; + } + } + catch (Exception ex) + { + _logger.LogWarning(ex, "持久化平滑因子失败 userId={UserId} factor={Factor}", userId, baseFactor); + } + } + } + userfactor = playerFactor.ViolateValue * fishRate *(playerFactor.AdditionalFactor==0?1: playerFactor.AdditionalFactor); + } + var systemGold = GetSystemGoldDayCached(); + double systemFactor = 1.0 + (systemGold - _gameConfig.KillConfig.DaySystemGold) / (_gameConfig.KillConfig.NormalizationFactorSystem * 1.0); + systemFactor = Math.Clamp(systemFactor, _gameConfig.KillConfig.MinSystemModifier, _gameConfig.KillConfig.MaxSystemModifier); + factor = userfactor * systemFactor; + + SyncSystemFactorToRoom(gameRoom, systemFactor); + + double finalKillWeight = killWeight * factor; + randomRoll = System.Random.Shared.Next(10000); + isKill = randomRoll < finalKillWeight; + + + } + + long skillGold; + try + { + skillGold = checked(fishConfig.FishScore * gold); + } + catch (OverflowException) + { + _sendResult.ErrorMessage(cid, ErrorCodes.金币参数超出范围, "金币参数超出范围"); + return player.Gold; + } + (long gold, double beishu, object res) res; + if (isKill) + res = CalcSkillGold(killConfig.BossConfigs, fishNumber, (int)fishConfig.FishScore, skillGold, roomId, fihsId); + else + res = (skillGold, 0.0, (object)null); + + if (isKill) + { + bool finalKill = true; + if (fishNumber == "12030") + { + finalKill = res.res?.GetType().GetProperty("type")?.GetValue(res.res) is int t && t == 2; + } + else if (fishNumber == "12029" || fishNumber == "12034") + { + finalKill = res.res?.GetType().GetProperty("isKill")?.GetValue(res.res) is bool k && k; + } + + if (finalKill) + { + var killClaimed = serverFishId.HasValue + ? _fishSpawnService.TryMarkFishKilled(roomId, serverFishId.Value) + : fishConfig.FishType == FishTypeEnum.普通鱼 + || _fishKillTracker.TryAdd(roomId, fihsId); + if (!killClaimed) + isKill = false; + } + } + + if (isKill) + { + + + skillGold= res.gold; + player.Gold += skillGold; + if (player.Gold > player.MaxGold) player.MaxGold = player.Gold; + await TryCloseCompensateOnTargetAsync(gameRoom, player, playerFactor, roomId, userId); + + + long netGold = skillGold - gold; + if (netGold > 0) + { + if (playerFactor.CompensateQuota <= 0 && playerFactor.PenaltyQuota > 0) + { + var consumedQuota = Math.Min((long)playerFactor.PenaltyQuota, netGold); + playerFactor.PenaltyQuota -= (int)consumedQuota; + } + } + + _sendResult.RoomKillNotice(roomId, fishNumber, player.UserId, skillGold, fihsId, timespan,res.beishu, gold,fishConfig.FishScore, res.res); + await FishKillControl(cid, gameRoom, player, fishNumber, skillGold, fihsId,gold,timespan, killConfig); + + var expGain = fishConfig.FishType is FishTypeEnum.Boss鱼 or FishTypeEnum.特殊鱼 or FishTypeEnum.特殊Boss + ? 1000 : fishConfig.FishScore; + _redisService.AddFishingExpProgress(roomId, player.UserId, expGain); + + if ((fishConfig.FishType == FishTypeEnum.Boss鱼 || fishConfig.FishType == FishTypeEnum.特殊Boss || fishConfig.FishType == FishTypeEnum.特殊鱼) + && fishNumber != "12028" + && killConfig.BossDropConfig != null + && killConfig.BossDropConfig.DropItems != null + && killConfig.BossDropConfig.DropItems.Count > 0) + { + var dropConfig = killConfig.BossDropConfig; + var totalWeight = dropConfig.NoDropWeight + dropConfig.DropItems.Sum(d => d.Weight); + var roll = System.Random.Shared.Next(totalWeight); + var accumulated = 0; + BossDropItemConfig? wonItem = null; + foreach (var item in dropConfig.DropItems) + { + accumulated += item.Weight; + if (roll < accumulated) + { + wonItem = item; + break; + } + } + if (wonItem != null) + { + await _userService.UpdateAssets(new UserAssetParam + { + UserId = player.UserId, + ChangeType = UserAssetChangeTypeEnum.增加, + RewardItems = new List + { + new BaseProductCount { Number = wonItem.PropNumber, Name = wonItem.PropName, Count = wonItem.Count } + }, + Remark = $"Boss掉落-{wonItem.PropName}", + Source = RewardSource.击杀Boss, + IsAddRecord = false + }); + _sendResult.RoomKillNotice(roomId, fishNumber, player.UserId, skillGold, fihsId, timespan, res.beishu, gold, fishConfig.FishScore, drop: new { wonItem.PropNumber, wonItem.PropName, wonItem.Count }); + } + } + + if (fishNumber == "12028" && res.res != null) + { + var scorpionItems = res.res.GetType().GetProperty("items")?.GetValue(res.res) as List; + if (scorpionItems != null) + { + foreach (var item in scorpionItems) + { + var propConfig = _gameConfig.PropConfig.FirstOrDefault(p => p.Number == item.PropNumber); + var propName = propConfig?.Name ?? item.PropNumber; + await _userService.UpdateAssets(new UserAssetParam + { + UserId = player.UserId, + ChangeType = UserAssetChangeTypeEnum.增加, + RewardItems = new List + { + new BaseProductCount { Number = item.PropNumber, Name = propName, Count = item.Count } + }, + Remark = $"机械蝎掉落-{propName}", + Source = RewardSource.击杀Boss, + IsAddRecord = false + }); + _sendResult.RoomKillNotice(roomId, fishNumber, player.UserId, skillGold, fihsId, timespan, res.beishu, gold, fishConfig.FishScore, drop: new { item.PropNumber, propName, item.Count }); + } + } + } + + } + if (isKill) + { + _redisService.SetGameRoom(gameRoom); + } + _redisService.AddSystemGoldDay(gold - (isKill ? skillGold : 0)); + + return player.Gold; + } + + private void AddBullets(string roomId, string userId, List bulletIds) + { + _bulletTracker.Add(roomId, userId, bulletIds); + } + + private bool TryConsumeBullet(string roomId, string userId, string bulletId) + { + return _bulletTracker.TryConsume(roomId, userId, bulletId); + } + + private void ClearBullets(string roomId, string userId) + { + _bulletTracker.Clear(roomId, userId); + } + + private bool TryAddKillFishId(string roomId, string fishId) + { + return _fishKillTracker.TryAdd(roomId, fishId); + } + + private void ClearKillFishIds(string roomId) + { + _fishKillTracker.Clear(roomId); + } + + private async Task GetPlayerFactorAsync(string roomId, string userId) + { + var cacheKey = $"{roomId}|{userId}"; + + if (PlayerFactorCache.TryGetValue(cacheKey, out var entry) + && DateTime.UtcNow - entry.RefreshAt < FactorRefreshInterval) + return entry.Factor; + + try + { + var user = await _userService.GetUser(userId); + if (user != null && user.PlayerFactor != null) + { + PlayerFactorCache[cacheKey] = (user.PlayerFactor, DateTime.UtcNow); + var room = _redisService.GetGameRoom(roomId); + var player = room?.Players?.FirstOrDefault(p => p.UserId == userId); + if (room != null && player != null) + { + player.PlayerFactor = user.PlayerFactor; + player.SafeBoxGold = user.SafeBox?.Amount ?? 0; + _redisService.SetPlayerFactor(roomId, userId, user.PlayerFactor); + _redisService.SetGameRoom(room); + } + return user.PlayerFactor; + } + } + catch (Exception ex) + { + _logger.LogError(ex, "读取玩家因子失败,降级使用缓存值 roomId={RoomId} userId={UserId}", roomId, userId); + } + + if (PlayerFactorCache.TryGetValue(cacheKey, out var stale)) + return stale.Factor; + + return new PlayerFactor(); + } + + public static int ClearPlayerFactorCache(string userId) + { + var suffix = $"|{userId}"; + var keysToRemove = PlayerFactorCache.Keys.Where(k => k.EndsWith(suffix)).ToList(); + var removedCount = 0; + foreach (var key in keysToRemove) + { + if (PlayerFactorCache.TryRemove(key, out _)) + removedCount++; + } + return removedCount; + } + + public static void ClearAllConfigCache() + { + _sharedBaseConfigLastFetch = DateTime.MinValue; + _fishingKillLastFetch = DateTime.MinValue; + _cachedSystemGold = 0; + _systemGoldLastFetch = DateTime.MinValue; + } + + private long GetSystemGoldDayCached() + { + var now = DateTime.UtcNow; + if (_cachedSystemGold == 0 || now - _systemGoldLastFetch > SystemGoldCacheDuration) + { + lock (_systemGoldLock) + { + if (_cachedSystemGold == 0 || now - _systemGoldLastFetch > SystemGoldCacheDuration) + { + _cachedSystemGold = _redisService.GetSystemGoldDay(); + _systemGoldLastFetch = now; + } + } + } + return _cachedSystemGold; + } + + private FishingKillConfig GetFishingKillConfig() + { + var now = DateTime.UtcNow; + if (_fishingKillConfig == null || now - _fishingKillLastFetch > FishingKillCacheDuration) + { + lock (_fishingKillLock) + { + if (_fishingKillConfig == null || now - _fishingKillLastFetch > FishingKillCacheDuration) + { + var config = _redisService.GetFishingKillConfig(); + if (config != null) + { + _fishingKillConfig = config; + _fishingKillLastFetch = now; + } + else if (_gameConfig != null) + { + _fishingKillConfig = new FishingKillConfig + { + FishTypeConfigs = _gameConfig.FishTypeConfigs?.Select(f => new FishTypeBriefConfig + { + FishNumber = f.FishNumber, + FishName = f.FishName, + FishType = f.FishType, + FishScore = f.FishScore, + KillWeight = f.KillWeight + }).ToList(), + KillConfig = _gameConfig.KillConfig, + BossConfigs = _gameConfig.BossConfigs, + BossDropConfig = _gameConfig.BossDropConfig, + BattleOrderIsOpen = _activityConfig?.BattleOrderConfig?.IsOpen ?? false + }; + _fishingKillLastFetch = now; + } + } + } + } + return _fishingKillConfig ?? new FishingKillConfig + { + FishTypeConfigs = new(), + KillConfig = new(), + BossConfigs = new(), + BossDropConfig = new() + }; + } + + public async Task<(List bullets, long gold)> FireCannon(string cid, string roomId, string userId, long gold, int count, long timestamp, string sign, object extra = null) + { + return await _distributedLock.TryExecuteAsync( + $"{RedisKey.DistributedLockPrefix}fish:gold:{roomId}:{userId}", + () => FireCannonInternal(cid, roomId, userId, gold, count, timestamp, sign, extra), + retry: true); + } + + private async Task<(List bullets, long gold)> FireCannonInternal(string cid, string roomId, string userId, long gold, int count, long timestamp, string sign, object extra) + { + var result = new List(); + + if (gold <= 0 || count <= 0 || count > 100) + return (result, 0); + + if (!VerifySign(cid, $"{roomId}|{userId}|{gold}|{count}|{timestamp}", timestamp, sign)) + return (result, 0); + + var room = _redisService.GetGameRoom(roomId); + if (room == null) + { + _sendResult.ErrorMessage(cid, ErrorCodes.房间不存在, "房间信息不存在"); + return (result, 0); + } + + var player = room.Players?.FirstOrDefault(c => c.UserId == userId); + if (player == null) + { + _sendResult.ErrorMessage(cid, ErrorCodes.玩家不在房间, "玩家不在房间中"); + return (result, 0); + } + + if (player.State == 2) + { + + return (result, player.Gold); + } + + if (!IsCallerPlayer(cid, room, player)) + { + var mappedUserId = _redisService.GetUserId(cid); + var session = _redisService.GetRedisUserCId(userId); + + _hubGame.SendUserCId(cid, "KickToMainPage", new { userId }); + return (result, player.Gold); + } + + player.CannonMultiple = gold > int.MaxValue ? int.MaxValue : (int)gold; + + long totalCost; + try + { + totalCost = checked(gold * count); + } + catch (OverflowException) + { + return (result, player.Gold); + } + if (player.Gold < totalCost) + { + _sendResult.ErrorMessage(cid, ErrorCodes.金币不足, "金币不足"); + return (result, player.Gold); + } + + var goldBeforeFire = player.Gold; + player.Gold -= totalCost; + if (player.Gold < 0) + player.Gold = 0; + + for (int i = 0; i < count; i++) + { + result.Add(Guid.NewGuid().ToString("N")); + } + AddBullets(roomId, userId, result); + + + + _redisService.SetGameRoom(room); + if (player.Gold <= 0) + { + _sendResult.SyncPlayerGold(cid, player.Gold); + + } + + _sendResult.RoomFireNotice(roomId, userId, result, gold, count, extra); + + _redisService.AddFishingConsumeProgress(roomId, userId, totalCost); + + if (GetFishingKillConfig().BattleOrderIsOpen) + { + RecordFishingTaskProgress(roomId, userId, TaskEvent.开炮任务, count); + } + + return (result, player.Gold); + } + + + public async Task UseProp(string cid, string roomId, string userId, string propNumber, int diamond = 0) + { + var room = _redisService.GetGameRoom(roomId); + if (room == null) + { + _sendResult.ErrorMessage(cid, ErrorCodes.房间不存在, "房间信息不存在"); + return -1; + } + if (diamond < 0 || !IsCallerUser(cid, roomId, userId)) + { + _sendResult.ErrorMessage(cid, ErrorCodes.道具数量不足, "背包道具数量不足"); + return -1; + } + var skillConfig = _gameConfig.PropConfig.FirstOrDefault(c => c.Type == ProductTypeEnum.技能 && c.Number == propNumber); + if (skillConfig == null) + { + _sendResult.ErrorMessage(cid, ErrorCodes.道具配置不存在, "道具配置不存在"); + return -1; + + } + if (diamond > 0) + { + var player = room.Players.Where(c => c.UserId == userId).FirstOrDefault(); + if (player == null) + { + _sendResult.ErrorMessage(cid, ErrorCodes.用户不存在, "用户不存在"); + return -1; + } + if (player.Diamond < diamond) + { + _sendResult.ErrorMessage(cid, ErrorCodes.钻石不足, "玩家钻石不足"); + return -1; + } + player.Diamond -= diamond; + _redisService.SetGameRoom(room); + + _sendResult.UsePropNotice(roomId, userId, propNumber); + + _hubGame.SendUserUserId(userId, "AssetUpdated", new + { + CurrencyType = 2, + ChangeType = 2, + Amount = diamond, + NewGold = player.Gold, + NewDiamond = player.Diamond, + Source = RewardSource.道具.ToString(), + Remark = "" + }); + _capPublisher.Publish(TopicKeys.用户资产变更, new UserAssetParam() + { + ChangeType = UserAssetChangeTypeEnum.减少, + UserId = userId, + Remark = "", + Source = RewardSource.道具, + OtherId = "", + RoomName = room.RoomName, + RoomInfo = room.RoomId, + Diamond = diamond, + SyncToFrontend = false + }); + } + else + { + _sendResult.UsePropNotice(roomId, userId, propNumber); + var baseProductCount = _mapper.Map(skillConfig); + baseProductCount.Count = 1; + + _capPublisher.Publish(TopicKeys.用户资产变更, new UserAssetParam() + { + ChangeType = UserAssetChangeTypeEnum.减少, + UserId = userId, + Gold = 0, + Remark = "", + Source = RewardSource.道具, + OtherId = "", + RoomName = room.RoomName, + RoomInfo = room.RoomId, + RewardItems = new List() { baseProductCount } + }); + } + if (skillConfig.Number == "40004" && _activityConfig.BattleOrderConfig.IsOpen) + { + RecordFishingTaskProgress(roomId, userId, TaskEvent.使用狂暴, 1); + } + + if (propNumber == "40003") + { + _fishSpawnService.ExtendFishLifespan(roomId, 15); + _hubGame.SendGroup(roomId, "FishFrozen", null); + } + + try + { + var user = await _userService.GetUser(userId); + if (user != null) + { + var prop = user.Props.FirstOrDefault(p => p.Number == propNumber); + if (prop != null && prop.Count > 0) + return prop.Count; + return 0; + } + } + catch (Exception ex) + { + _logger.LogWarning(ex, "UseProp 查询道具剩余数量失败 userId={UserId} propNumber={PropNumber}", userId, propNumber); + } + return -1; + } + + public async Task UseTorpedo(string cid, string roomId, string userId, string propNumber) + { + var room = _redisService.GetGameRoom(roomId); + if (room == null) + { + _sendResult.ErrorMessage(cid, ErrorCodes.房间不存在, "房间信息不存在"); + return -1; + } + if (!IsCallerUser(cid, roomId, userId)) + return -1; + + var torpedoConfig = _gameConfig.TorpedoConfigs.FirstOrDefault(c => c.Number == propNumber); + if (torpedoConfig == null) + { + _sendResult.ErrorMessage(cid, ErrorCodes.道具配置不存在, "鱼雷配置不存在"); + return -1; + } + + var player = room.Players.FirstOrDefault(p => p.UserId == userId); + if (player == null) + { + _sendResult.ErrorMessage(cid, ErrorCodes.用户不存在, "用户不存在"); + return -1; + } + + var baseProductCount = new BaseProductCount + { + Number = propNumber, + Name = torpedoConfig.Name, + Type = ProductTypeEnum.鱼雷, + Count = 1 + }; + _capPublisher.Publish(TopicKeys.用户资产变更, new UserAssetParam() + { + ChangeType = UserAssetChangeTypeEnum.减少, + UserId = userId, + Source = RewardSource.鱼雷, + RoomName = room.RoomName, + RoomInfo = room.RoomId, + RewardItems = new List() { baseProductCount } + }); + + long randomGold = CalcTorpedoGold(torpedoConfig); + + player.Gold += randomGold; + _redisService.SetGameRoom(room); + + _sendResult.TorpedoResultNotice(roomId, userId, propNumber, randomGold, torpedoConfig.Color); + + _hubGame.SendUserUserId(userId, "AssetUpdated", new + { + CurrencyType = 1, + ChangeType = 1, + Amount = randomGold, + NewGold = player.Gold, + NewDiamond = player.Diamond, + Source = RewardSource.鱼雷.ToString(), + Remark = "" + }); + + return player.Gold; + } + + private long CalcTorpedoGold(TorpedoItemConfig config) + { + if (config.RewardRanges == null || config.RewardRanges.Count == 0) + return 0; + int totalWeight = config.RewardRanges.Sum(r => r.Weight); + if (totalWeight <= 0) + return 0; + int randomValue = GlobalRandom.Next(0, totalWeight); + int currentWeightSum = 0; + foreach (var range in config.RewardRanges) + { + currentWeightSum += range.Weight; + if (randomValue < currentWeightSum) + return GlobalRandom.NextInclusive(range.MinGold, range.MaxGold); + } + return 0; + } + + + public async Task ChangeGunMultiple(string cid, string roomId, string userId, int multiple) + { + var room = _redisService.GetGameRoom(roomId); + if (room == null) + { + _sendResult.ErrorMessage(cid, ErrorCodes.房间不存在, "房间信息不存在"); + return; + } + var player = room.Players.Where(c => c.UserId == userId).FirstOrDefault(); + if (player == null) + { + _sendResult.ErrorMessage(cid, ErrorCodes.用户不存在, "用户不存在"); + return; + } + var roomConfig = _gameConfig?.RoomConfigs?.FirstOrDefault(c => c.GameType == room.GameType && c.RoomLevel == room.RoomLevel); + if (!IsCallerPlayer(cid, room, player) || roomConfig?.CannonMultipleList?.Contains(multiple) != true) + { + _sendResult.ErrorMessage(cid, ErrorCodes.炮倍参数无效, "连接用户或炮倍参数无效"); + return; + } + player.CannonMultiple = multiple; + + _redisService.SetGameRoom(room); + + _sendResult.ChangeGunMultipleNotice(roomId, userId, multiple); + } + + public async Task GetPlayerInfo(string cid,string roomId, string userId) + { + var room = _redisService.GetGameRoom(roomId); + if (room == null) + { + _sendResult.ErrorMessage(cid, ErrorCodes.房间不存在, "房间信息不存在"); + return; + } + var callerUserId = _redisService.GetUserId(cid); + if (string.IsNullOrWhiteSpace(callerUserId) + || !room.Players.Any(p => !p.IsBot && p.UserId == callerUserId && p.CId == cid && p.State == 0)) + return; + var player = room.Players.Where(c => c.UserId == userId).FirstOrDefault(); + if (player == null) + { + _sendResult.ErrorMessage(cid, ErrorCodes.用户不存在, "用户不存在"); + return; + } + _sendResult.SendPlayerInfo(cid, player); + } + + public async Task SetPlayerAfk(string cid, string roomId, string userId) + { + var room = _redisService.GetGameRoom(roomId); + if (room == null) + { + _sendResult.ErrorMessage(cid, ErrorCodes.房间不存在, "房间信息不存在"); + return; + } + var player = room.Players.FirstOrDefault(p => p.UserId == userId && p.CId == cid); + if (player == null) + { + _sendResult.ErrorMessage(cid, ErrorCodes.用户不存在, "用户不存在"); + return; + } + player.IsAfk = true; + _redisService.SetGameRoom(room); + _sendResult.PlayerAfkNotice(roomId, userId); + } + + public async Task CancelPlayerAfk(string cid, string roomId, string userId) + { + var room = _redisService.GetGameRoom(roomId); + if (room == null) + { + _sendResult.ErrorMessage(cid, ErrorCodes.房间不存在, "房间信息不存在"); + return; + } + var player = room.Players.FirstOrDefault(p => p.UserId == userId && p.CId == cid); + if (player == null) + { + _sendResult.ErrorMessage(cid, ErrorCodes.用户不存在, "用户不存在"); + return; + } + player.IsAfk = false; + _redisService.SetGameRoom(room); + _sendResult.PlayerCancelAfkNotice(roomId, userId); + } + + + + public async Task> BotFireCannon(string cid, string roomId, string botUserId, long gold, int count) + { + if (string.IsNullOrWhiteSpace(cid) || string.IsNullOrWhiteSpace(roomId) + || string.IsNullOrWhiteSpace(botUserId) || gold <= 0 || count <= 0 || count > 100) + return new List(); + + var bulletIds = new List(); + var room = _redisService.GetGameRoom(roomId); + if (room == null) + { + + return bulletIds; + } + + var bot = room.Players?.FirstOrDefault(p => p.UserId == botUserId && p.IsBot); + if (bot == null) + { + + return bulletIds; + } + + if (gold <= int.MaxValue) + bot.CannonMultiple = (int)gold; + + long totalCost; + try + { + totalCost = checked(gold * count); + } + catch (OverflowException) + { + return bulletIds; + } + + if (bot.Gold < totalCost) + { + + + var position = bot.Position; + var exitConfig = _gameConfig?.BotConfig?.ExitCondition; + await RemoveBotFromRoom( + room, + bot, + exitConfig?.SendLeaveRoom ?? true, + exitConfig?.ShowWaitingAfterExit ?? false); + CreateReplacementBot(room, position); + _redisService.SetGameRoom(room); + + + return bulletIds; + } + + bot.Gold -= totalCost; + for (int i = 0; i < count; i++) + bulletIds.Add(Guid.NewGuid().ToString("N")); + + _redisService.SetGameRoom(room); + + try + { + await _sendResult.RoomFireNoticeAsync(roomId, cid, botUserId, bulletIds, gold, count, null, true); + } + catch (Exception ex) + { + _logger.LogError(ex, + "机器人发炮广播失败 roomId={RoomId} botUserId={BotUserId} gold={Gold} count={Count} bulletCount={BulletCount}", + roomId, botUserId, gold, count, bulletIds.Count); + throw; + } + await CheckBotExit(room, bot); + return bulletIds; + } + + public async Task BotKillFish(string cid, string roomId, string botUserId, string fishNumber, string fishId, long gold, string bulletId) + { + if (string.IsNullOrWhiteSpace(cid) || string.IsNullOrWhiteSpace(roomId) + || string.IsNullOrWhiteSpace(botUserId) || string.IsNullOrWhiteSpace(fishNumber) + || string.IsNullOrWhiteSpace(fishId) || gold <= 0) + return; + + var killConfig = GetFishingKillConfig(); + var fishConfig = killConfig.FishTypeConfigs?.FirstOrDefault(f => f.FishNumber == fishNumber); + if (fishConfig == null) + return; + + var room = _redisService.GetGameRoom(roomId); + if (room == null) + return; + + var bot = room.Players?.FirstOrDefault(p => p.UserId == botUserId && p.IsBot); + if (bot == null) + return; + + long? serverFishId = null; + if (long.TryParse(fishId, out var parsedFishId)) + { + serverFishId = parsedFishId; + if (!_fishSpawnService.ValidateFishHit(roomId, parsedFishId)) + return; + } + + double killWeight = fishConfig.KillWeight; + + if (Random(killWeight, 10000)) + { + long skillGold; + try + { + skillGold = checked(fishConfig.FishScore * gold); + } + catch (OverflowException) + { + return; + } + + (long gold, double beishu, object res) res = CalcSkillGold(killConfig.BossConfigs, fishNumber, (int)fishConfig.FishScore, skillGold, roomId, fishId); + + bool finalKill = true; + if (fishNumber == "12030") + { + finalKill = res.res?.GetType().GetProperty("type")?.GetValue(res.res) is int t && t == 2; + } + else if (fishNumber == "12029" || fishNumber == "12034") + { + finalKill = res.res?.GetType().GetProperty("isKill")?.GetValue(res.res) is bool k && k; + } + + if (finalKill) + { + var killClaimed = serverFishId.HasValue + ? _fishSpawnService.TryMarkFishKilled(roomId, serverFishId.Value) + : fishConfig.FishType == FishTypeEnum.普通鱼 + || _fishKillTracker.TryAdd(roomId, fishId); + if (!killClaimed) + return; + } + + skillGold = res.gold; + bot.Gold = skillGold > long.MaxValue - bot.Gold ? long.MaxValue : bot.Gold + skillGold; + + _sendResult.RoomKillNotice(roomId, fishNumber, botUserId, skillGold, fishId, DateTime.Now.ToTimeStamp(), res.beishu, gold, fishConfig.FishScore, res.res); + await FishKillControl(cid, room, bot, fishNumber, skillGold, fishId, gold, DateTime.Now.ToTimeStamp(), killConfig); + } + + _redisService.SetGameRoom(room); + await CheckBotExit(room, bot); + } + + private bool IsCallerUser(string cid, string roomId, string userId) + { + if (string.IsNullOrWhiteSpace(cid) || string.IsNullOrWhiteSpace(roomId) || string.IsNullOrWhiteSpace(userId)) + return false; + + var mappedUserId = _redisService.GetUserId(cid); + var userRedis = _redisService.GetRedisUserCId(userId); + return mappedUserId == userId && userRedis != null + && userRedis.CId == cid && userRedis.RoomId == roomId; + } + + private bool IsCallerPlayer(string cid, RedisGameRoom room, RedisGamePlayer player) + { + return room != null && player != null && !player.IsBot + && player.CId == cid && player.State == 0 + && IsCallerUser(cid, room.RoomId, player.UserId); + } + + private async Task ForceLeaveRoom(string roomId, string userId) + { + + await LeaveRoomInternal(null, roomId, userId); + + } + + private async Task CheckBotExit(RedisGameRoom room, RedisGamePlayer bot) + { + if (bot == null || !bot.IsBot) return; + var cfg = _gameConfig?.BotConfig?.ExitCondition; + + if (bot.Gold < bot.CannonMultiple) + { + var position = bot.Position; + + await RemoveBotFromRoom(room, bot, cfg?.SendLeaveRoom ?? true, cfg?.ShowWaitingAfterExit ?? false); + CreateReplacementBot(room, position); + _redisService.SetGameRoom(room); + return; + } + + if (cfg == null) return; + + if (cfg.ExitWhenGoldAbove > 0 && bot.Gold > cfg.ExitWhenGoldAbove) + { + + await RemoveBotFromRoom(room, bot, cfg.SendLeaveRoom, cfg.ShowWaitingAfterExit); + return; + } + + if (cfg.ExitWhenGoldBelow > 0 && bot.Gold < cfg.ExitWhenGoldBelow) + { + + await RemoveBotFromRoom(room, bot, cfg.SendLeaveRoom, cfg.ShowWaitingAfterExit); + } + } + + private async Task RemoveBotFromRoom(RedisGameRoom room, RedisGamePlayer bot, bool sendLeaveRoom, bool showWaiting) + { + if (room?.Players == null || bot == null || !room.Players.Remove(bot)) + return; + + ClearBullets(room.RoomId, bot.UserId); + NormalizeRoomPlayerCounts(room); + _redisService.SetGameRoom(room); + + if (sendLeaveRoom) + { + _sendResult.BotLeaveRoomNotice(room.RoomId, bot.UserId); + if (!string.IsNullOrWhiteSpace(bot.CId)) + _hubGame.RemoveGroup(bot.CId, room.RoomId); + } + + _hubGame.SendGroup(room.RoomId, "OnSeatChange", new + { + type = "leave", + userId = bot.UserId, + position = bot.Position, + showWaiting = showWaiting + }); + } + + private void CreateReplacementBot(RedisGameRoom room, int position) + { + if (_gameConfig?.BotConfig?.Enabled != true) + return; + + if (room?.Players == null || room.Players.Any(p => p.Position == position)) + return; + + var roomConfig = _gameConfig?.RoomConfigs? + .FirstOrDefault(c => c.GameType == room.GameType && c.RoomLevel == room.RoomLevel); + var botProfiles = _botProfileRepo.FilterBy(p => true).ToList(); + if (roomConfig?.CannonMultipleList == null || roomConfig.CannonMultipleList.Count == 0 + || botProfiles == null || botProfiles.Count == 0) + { + + return; + } + + var profile = botProfiles[System.Random.Shared.Next(botProfiles.Count)]; + var cannonMultiple = roomConfig.CannonMultipleList[System.Random.Shared.Next(roomConfig.CannonMultipleList.Count)]; + var maxMultiple = roomConfig.CannonMultipleList.Max(); + var gold = maxMultiple * System.Random.Shared.Next(100, 501); + var props = _gameConfig?.PropConfig ?? new List(); + var cannons = props.Where(p => p.Type == ProductTypeEnum.炮台 && p.IsEnable && !p.Number.StartsWith("401")).ToList(); + var wings = props.Where(p => p.Type == ProductTypeEnum.翅膀 && p.IsEnable && p.IsSale).ToList(); + var warGods = props.Where(p => p.Type == ProductTypeEnum.战神 && p.IsEnable && p.IsSale).ToList(); + + var replacementId = Guid.NewGuid().ToString("N"); + var replacementNumber = Common.Utils.RandomHelper.RandomNumbers(8); + var replacement = new RedisGamePlayer + { + UserId = replacementId, + UserNumber = replacementNumber, + UserName = profile.Name, + Avatar = profile.Avatar, + Level = System.Random.Shared.Next(1, 101), + IsBot = true, + Gold = gold, + Diamond = System.Random.Shared.Next(100, 5001), + Position = position, + CannonId = cannons.Count > 0 ? cannons[System.Random.Shared.Next(cannons.Count)].Number : string.Empty, + WingsId = wings.Count > 0 ? wings[System.Random.Shared.Next(wings.Count)].Number : string.Empty, + WarGodId = warGods.Count > 0 && System.Random.Shared.Next(5) == 0 + ? warGods[System.Random.Shared.Next(warGods.Count)].Number + : string.Empty, + CannonMultiple = cannonMultiple, + BeginCoin = gold, + BeginTime = DateTime.Now.ToTimeStamp(), + CId = string.Empty, + State = 0, + PlayerFactor = new PlayerFactor() + }; + + room.Players.Add(replacement); + NormalizeRoomPlayerCounts(room); + _sendResult.RoomJoinNotice(room.RoomId, replacement); + _hubGame.SendGroup(room.RoomId, "OnSeatChange", new + { + type = "join", + playerId = replacement.Position + 1, + position = replacement.Position, + playerName = replacement.UserName, + nickname = replacement.UserName, + gold = replacement.Gold, + diamond = replacement.Diamond, + vipLevel = replacement.VipLevel, + turretId = 1, + turretRate = 1, + turretLv = 1, + headId = 1, + roomRate = 1, + bulletPower = 1 + }); + } + + private void CreateRoomBots(RedisGameRoom room, RoomConfig roomConfig) + { + if (_gameConfig?.BotConfig?.Enabled != true) + { + room.RobotCount = 0; + + return; + } + + var botProfiles = _botProfileRepo.FilterBy(p => true).ToList(); + if (botProfiles == null || botProfiles.Count == 0) + { + + return; + } + + var maxMultiple = roomConfig.CannonMultipleList.Max(); + var occupiedPositions = room.Players.Select(p => p.Position).ToHashSet(); + var availablePositions = Enumerable.Range(0, room.MaxPlayerCount) + .Where(p => !occupiedPositions.Contains(p)) + .OrderByDescending(p => p) + .ToList(); + + int botsToCreate = Math.Min(room.RobotCount, availablePositions.Count); + + + var cannons = _gameConfig.PropConfig.Where(p => p.Type == ProductTypeEnum.炮台 && p.IsEnable && !p.Number.StartsWith("401")).ToList(); + var wings = _gameConfig.PropConfig.Where(p => p.Type == ProductTypeEnum.翅膀 && p.IsEnable && p.IsSale).ToList(); + var warGods = _gameConfig.PropConfig.Where(p => p.Type == ProductTypeEnum.战神 && p.IsEnable && p.IsSale).ToList(); + + for (int i = 0; i < botsToCreate; i++) + { + var idx = System.Random.Shared.Next(botProfiles.Count); + var profile = botProfiles[idx]; + var position = availablePositions[i]; + var gold = maxMultiple * System.Random.Shared.Next(100, 501); + var cannonIndex = System.Random.Shared.Next(roomConfig.CannonMultipleList.Count); + + var botId = Guid.NewGuid().ToString("N"); + var botNumber = Common.Utils.RandomHelper.RandomNumbers(8); + var bot = new RedisGamePlayer + { + UserId = botId, + UserNumber = botNumber, + UserName = profile.Name, + Avatar = profile.Avatar, + Level = System.Random.Shared.Next(1, 101), + IsBot = true, + Gold = gold, + Diamond = System.Random.Shared.Next(100, 1001), + Position = position, + CannonId = cannons.Count > 0 ? cannons[System.Random.Shared.Next(cannons.Count)].Number : string.Empty, + WingsId = wings.Count > 0 ? wings[System.Random.Shared.Next(wings.Count)].Number : string.Empty, + WarGodId = warGods.Count > 0 && System.Random.Shared.Next(5) == 0 + ? warGods[System.Random.Shared.Next(warGods.Count)].Number + : string.Empty, + CannonMultiple = roomConfig.CannonMultipleList[cannonIndex], + BeginCoin = gold, + BeginTime = DateTime.Now.ToTimeStamp(), + CId = string.Empty, + State = 0, + PlayerFactor = new PlayerFactor() + }; + + room.Players.Add(bot); + + + _hubGame.SendGroup(room.RoomId, "OnSeatChange", new + { + type = "join", + playerId = bot.Position + 1, + position = bot.Position, + playerName = bot.UserName, + nickname = bot.UserName, + gold = bot.Gold, + diamond = bot.Diamond, + vipLevel = bot.VipLevel, + turretId = 1, + turretRate = 1, + turretLv = 1, + headId = 1, + roomRate = 1, + bulletPower = 1 + }); + } + NormalizeRoomPlayerCounts(room); + } + + private static void NormalizeRoomPlayerCounts(RedisGameRoom room, bool preserveEmptyRoomRobotPlan = false) + { + if (room == null) return; + room.Players ??= new List(); + room.MaxPlayerCount = Math.Max(0, room.MaxPlayerCount); + room.CurrentOnlinePlayerCount = room.Players.Count(p => !p.IsBot && p.State == 0); + + if (room.Players.Count > 0 || !preserveEmptyRoomRobotPlan) + room.RobotCount = room.Players.Count(p => p.IsBot); + else + room.RobotCount = Math.Clamp(room.RobotCount, 0, room.MaxPlayerCount); + + var overflow = room.Players.Count - room.MaxPlayerCount; + if (overflow > 0) + { + var overflowBots = room.Players.Where(p => p.IsBot).Take(overflow).ToList(); + foreach (var bot in overflowBots) + room.Players.Remove(bot); + room.CurrentOnlinePlayerCount = room.Players.Count(p => !p.IsBot && p.State == 0); + room.RobotCount = room.Players.Count(p => p.IsBot); + } + } + + + public async Task HandleDisconnect(string cid) + { + string userId = null; + try + { + + userId = _redisService.GetUserId(cid); + if (string.IsNullOrWhiteSpace(userId)) + { + + return; + } + + _redisService.RemoveUserId(cid); + + var userRedis = _redisService.GetRedisUserCId(userId); + if (userRedis == null) + { + + return; + } + + if (!string.IsNullOrWhiteSpace(userRedis.CId) && userRedis.CId != cid) + { + + return; + } + + var roomId = userRedis.RoomId; + if (string.IsNullOrWhiteSpace(roomId)) + { + + return; + } + + var room = _redisService.GetGameRoom(roomId); + if (room == null) + { + userRedis.RoomId = ""; + _redisService.SetRedisUserCId(userRedis); + + return; + } + + var player = room.Players.FirstOrDefault(p => p.UserId == userId && !p.IsBot); + if (player == null) + { + userRedis.RoomId = ""; + _redisService.SetRedisUserCId(userRedis); + + return; + } + + player.State = 1; + _redisService.SetGameRoom(room); + _redisService.SetRedisUserCId(userRedis); + + + + if (room.CreateUserId == userId) + { + var nextOwner = room.Players.FirstOrDefault(p => !p.IsBot && p.State == 0 && p.UserId != userId); + if (nextOwner != null) + { + room.CreateUserId = nextOwner.UserId; + _redisService.SetGameRoom(room); + _sendResult.ChangeControllerUser(roomId, room.CreateUserId); + + } + else + { + room.CreateUserId = ""; + _redisService.SetGameRoom(room); + _sendResult.HostDisconnectNotice(roomId); + + } + } + + _sendResult.RoomDisconnectNotice(roomId, userId); + + var hasOnlinePlayer = room.Players.Any(p => !p.IsBot && p.State == 0); + if (!hasOnlinePlayer) + { + + } + + var cts = new CancellationTokenSource(); + if (PendingDisconnects.TryAdd(userId, cts)) + { + + _ = Task.Run(async () => + { + try + { + await Task.Delay(TimeSpan.FromSeconds(DisconnectTimeoutSeconds), cts.Token); + if (!cts.Token.IsCancellationRequested) + await OnDisconnectTimeout(userId, roomId); + } + catch (TaskCanceledException) + { + + } + }); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "断线处理异常 cid={Cid} userId={UserId}", cid, userId); + } + } + + private async Task FishKillControl(string cid, RedisGameRoom room, RedisGamePlayer player, string fishNumber, long addgold, string fishId, long jiangold, long timespan, FishingKillConfig killConfig) + { + + //await _distributedLock.TryExecuteAsync( + // $"{RedisKey.DistributedLockPrefix}room:kill:{roomId}:{userId}", + // () => + // { + + var fishConfig = killConfig?.FishTypeConfigs?.FirstOrDefault(c => c.FishNumber == fishNumber); + if (killConfig.BattleOrderIsOpen && fishConfig != null) + { + RecordFishingTaskProgress(room.RoomId, player.UserId, TaskEvent.赢取金币, addgold); + RecordFishingTaskProgress(room.RoomId, player.UserId, TaskEvent.捕获任意鱼, 1); + if (fishConfig.FishType == FishTypeEnum.Boss鱼 || fishConfig.FishType == FishTypeEnum.特殊Boss) + { + RecordFishingTaskProgress(room.RoomId, player.UserId, TaskEvent.捕获Boss鱼, 1); + + + } + if (fishConfig.FishType == FishTypeEnum.黄金鱼) + { + RecordFishingTaskProgress(room.RoomId, player.UserId, TaskEvent.捕获黄金鱼, 1); + + } + } + var configuredMinGold = killConfig.KillConfig.GlobalAnnounceMinGold; + if (fishConfig != null && KillAnnouncePolicy.ShouldAnnounce(addgold, configuredMinGold)) + { + + var announceTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + var gameTypeName = room.GameType.ToString(); + _sendResult.KillNotice(fishNumber, player.UserName, addgold, fishConfig?.FishName ?? "", + player.CannonMultiple, gameTypeName, room.RoomName, announceTimestamp); + _capPublisher.Publish(TopicKeys.全局击杀公告, new KillAnnounceParam + { + UserName = player.UserName, + GameTypeName = gameTypeName, + RoomName = room.RoomName, + FishName = fishConfig.FishName, + Multiple = player.CannonMultiple, + Gold = addgold, + Timestamp = announceTimestamp + }); + + } + } + + + private bool Random(double probability, int Max) + { + int randomValue = System.Random.Shared.Next(0, Max); + return randomValue < probability; + } + + private double ComputeSystemFactor() + { + var systemGold = GetSystemGoldDayCached(); + var systemFactor = 1.0 + (systemGold - _gameConfig.KillConfig.DaySystemGold) / (_gameConfig.KillConfig.NormalizationFactorSystem * 1.0); + return Math.Clamp(systemFactor, _gameConfig.KillConfig.MinSystemModifier, _gameConfig.KillConfig.MaxSystemModifier); + } + + private void SyncSystemFactorToRoom(RedisGameRoom room, double newSystemFactor) + { + double oldFactor = room.SystemFactor; + room.SystemFactor = newSystemFactor; + if (Math.Abs(newSystemFactor - oldFactor) >= 0.1) + { + _redisService.SetGameRoom(room); + } + } + + private double CalcFactor(PlayerFactor factor, FishTypeEnum fishType, long currentBalance, long totalDeposits) + { + + long actualProfit = currentBalance - (totalDeposits + factor.StartingBonus); + double rawPlayer = -actualProfit / (_gameConfig.KillConfig.NormalizationFactorPlayer * 1.0); + double playerModifier = 1.0 + rawPlayer; + playerModifier = Math.Clamp(playerModifier, _gameConfig.KillConfig.MinPlayerModifier, _gameConfig.KillConfig.MaxPlayerModifier); + + double userfactor = 1; + if (factor.IsBlack) + { + userfactor = factor.ViolateValue; + } + else + { + double fishRate = 1.0; + if (factor.CompensateQuota > 0) + { + switch (fishType) + { + case FishTypeEnum.普通鱼: + fishRate = factor.CompensateRate.Ordinary; + break; + case FishTypeEnum.Boss鱼: + case FishTypeEnum.特殊Boss: + fishRate = factor.CompensateRate.BossRate; + break; + case FishTypeEnum.黄金鱼: + fishRate = factor.CompensateRate.GoldRate; + break; + case FishTypeEnum.特殊鱼: + fishRate = factor.CompensateRate.SpecialRate; + break; + } + playerModifier *= fishRate; + } + else if (factor.PenaltyQuota > 0) + { + switch (fishType) + { + case FishTypeEnum.普通鱼: + fishRate = factor.PenaltyRate.Ordinary; + break; + case FishTypeEnum.Boss鱼: + case FishTypeEnum.特殊Boss: + fishRate = factor.PenaltyRate.BossRate; + break; + case FishTypeEnum.黄金鱼: + fishRate = factor.PenaltyRate.GoldRate; + break; + case FishTypeEnum.特殊鱼: + fishRate = factor.PenaltyRate.SpecialRate; + break; + } + playerModifier *= fishRate; + } + + playerModifier = Math.Clamp(playerModifier, _gameConfig.KillConfig.MinPlayerModifier, _gameConfig.KillConfig.MaxPlayerModifier); + userfactor = playerModifier; + } + + var systemFactor = ComputeSystemFactor(); + + return userfactor * systemFactor; + } + + private async Task TryCloseCompensateOnTargetAsync(RedisGameRoom room, RedisGamePlayer player, PlayerFactor playerFactor, string roomId, string userId) + { + if (playerFactor.CompensateQuota <= 0 || playerFactor.CompensateTargetGold <= 0 || player.Gold < playerFactor.CompensateTargetGold) + return; + + var reachedGold = player.Gold; + var closedTarget = playerFactor.CompensateTargetGold; + playerFactor.CompensateQuota = 0; + playerFactor.CompensateTargetGold = 0; + playerFactor.CompensateStartGold = 0; + player.PlayerFactor = playerFactor; + _redisService.SetPlayerFactor(roomId, userId, playerFactor); + _redisService.SetGameRoom(room); + + + try + { + var user = await _userService.GetUser(userId); + if (user?.PlayerFactor != null) + { + user.PlayerFactor.CompensateQuota = 0; + user.PlayerFactor.CompensateTargetGold = 0; + user.PlayerFactor.CompensateStartGold = 0; + await _userService.UpdateUser(user); + } + } + catch (Exception ex) + { + _logger.LogWarning(ex, "持久化补偿关闭失败 userId={UserId}", userId); + } + } + + private void RecordFishingTaskProgress(string roomId, string userId, TaskEvent taskEvent, long count) + { + _redisService.AddFishingTaskProgress(roomId, userId, (int)taskEvent, count); + } + + private async Task TryFlushFishingSettlement(RedisGameRoom room, RedisGamePlayer player) + { + var progressRewardGold = await FlushProgressAndMergeGold(room.RoomId, player, player.CId); + try + { + var gameName = room.GameType switch + { + GameTypeEnum.风雷之渊 => "风雷之渊", + GameTypeEnum.永夜尸城 => "永夜尸城", + GameTypeEnum.中国象棋 => "中国象棋", + GameTypeEnum.星际迷航 => "星际迷航", + GameTypeEnum.黑神话悟空 => "黑神话悟空", + _ => room.GameType.ToString() + }; + var settledGold = await _userService.GameCoinsSettlement(new GameCoinsSettlementParam + { + UserId = player.UserId, + BeforeGold = checked(player.BeginCoin + progressRewardGold), + AfterGold = player.Gold, + RoomSessionId = player.BeginTime, + RoomInfo = room.RoomId, + RoomName = $"{gameName}-{room.RoomName}" + }); + + return settledGold; + } + catch (Exception ex) + { + _logger.LogError(ex, "离房金币结算落库失败 roomId={RoomId} userId={UserId}", room.RoomId, player.UserId); + throw; + } + } + + private async Task TryFlushFishingProgress(string roomId, string userId, string userName) + { + try + { + await FlushFishingRuntimeProgress(roomId, userId, userName); + _redisService.ClearFishingRuntimeProgress(roomId, userId); + } + catch (Exception ex) + { + _logger.LogError(ex, "离房经验或消耗结算失败,保留Redis待下次重试 roomId={RoomId} userId={UserId}", roomId, userId); + } + + try + { + FlushFishingTaskProgress(roomId, userId); + } + catch (Exception ex) + { + _logger.LogError(ex, "离房任务结算失败,保留Redis待下次重试 roomId={RoomId} userId={UserId}", roomId, userId); + } + } + + private async Task FlushProgressAndMergeGold(string roomId, RedisGamePlayer player, string cid = null) + { + var before = await _userService.GetUser(player.UserId); + var goldBeforeProgress = before?.Assets?.Gold ?? 0; + + await TryFlushFishingProgress(roomId, player.UserId, player.UserName); + + var after = await _userService.GetUser(player.UserId); + var goldAfterProgress = after?.Assets?.Gold ?? goldBeforeProgress; + var progressRewardGold = Math.Max(0L, goldAfterProgress - goldBeforeProgress); + if (progressRewardGold <= 0) + return 0; + + player.Gold = checked(player.Gold + progressRewardGold); + if (player.Gold > player.MaxGold) player.MaxGold = player.Gold; + + + return progressRewardGold; + } + + private async Task FlushFishingRuntimeProgress(string roomId, string userId, string userName) + { + var exp = _redisService.GetFishingExpProgress(roomId, userId); + if (exp > 0) + { + (bool isok, string msg) updateResult = default; + const int maxAttempts = 5; + for (var attempt = 1; attempt <= maxAttempts; attempt++) + { + updateResult = await _userService.UpdateAssets(new UserAssetParam + { + UserId = userId, + Exp = exp, + ChangeType = UserAssetChangeTypeEnum.增加, + Source = RewardSource.击杀鱼, + Remark = "捕鱼经验结算", + RoomInfo = roomId, + IsAddRecord = false + }); + if (updateResult.isok) + break; + + if (attempt < maxAttempts) + await Task.Delay(100 * attempt); + } + + if (!updateResult.isok) + throw new InvalidOperationException( + $"捕鱼经验入库失败,Redis进度已保留。roomId={roomId}, userId={userId}, exp={exp}, message={updateResult.msg}"); + } + + var consume = _redisService.GetFishingConsumeProgress(roomId, userId); + if (consume > 0) + { + await _userService.RecordFishingConsume(consume, new CommonInfrastructure.Response.LoginUser + { + UserId = userId, + UserName = userName ?? userId + }); + } + } + + private void FlushFishingTaskProgress(string roomId, string userId) + { + var taskEvents = Enum.GetValues().Select(value => (int)value).ToArray(); + var progress = _redisService.GetFishingTaskProgress(roomId, userId, taskEvents); + foreach (var item in progress.Where(item => item.Value > 0 && Enum.IsDefined(typeof(TaskEvent), item.Key))) + { + _capPublisher.Publish(TopicKeys.任务完成, new CompletedTaskParam + { + count = item.Value, + userId = userId, + taskEvent = (TaskEvent)item.Key + }); + } + _redisService.ClearFishingTaskProgress(roomId, userId, taskEvents); + } + + public (long gold,double beishu, object res) CalcSkillGold(BossConfig bossConfig, string fishNumber,int socre, long newgold,string roomId,string fishId) + { + var gold = newgold; + if (bossConfig.LuckWheel.Any(d=>d.FishNumber.Any(c => c == fishNumber))) + { + + var luckWheel = bossConfig.LuckWheel.FirstOrDefault(d => d.FishNumber.Any(c => c == fishNumber)); + var res = luckWheel.GetResponse(); + var beishu = Convert.ToInt32(res.Sum(c => c.Score)); + gold =gold * beishu; + + return (gold, beishu* socre, new { res,count=res.Count }); + } + else if (bossConfig.LuckPoker.FishNumber.Any(c => c == fishNumber)) + { + var res = bossConfig.LuckPoker.GetResponse(); + var beishu = 1; + if(res!=null && res.Count()>0) + beishu= Convert.ToInt32(res[0].Score); + gold = gold * beishu; + + return (gold, beishu * socre, new { res, count = res.Count }); + } + else if (bossConfig.LuckFlyDisk.Any(c => c.FishNumber.Any(f => f == fishNumber))) + { + + var luckFlyDisk = bossConfig.LuckFlyDisk.FirstOrDefault(d => d.FishNumber.Any(c => c == fishNumber)); + var res = luckFlyDisk.GetResponse(); + var beishu = res.Select(c => c.Score).Aggregate(1.0, (acc, x) => acc * x); + gold = Convert.ToInt64(gold * beishu); + return (gold, beishu * socre, new { res, count = res.Count }); + } + else if (bossConfig.FullScreen.FishNumber.Any(c => c == fishNumber)) + { + return (gold, socre, null); + } + else if (bossConfig.Range.FishNumber.Any(c => c == fishNumber)) + { + + return (gold, socre, null); + + } + else if (bossConfig.Probability.Any(d=>d.FishNumber.Any(c => c == fishNumber))) + { + var probability = bossConfig.Probability.FirstOrDefault(d => d.FishNumber.Any(c => c == fishNumber)); + var res = probability.GetResponse(); + if ( res> 0) + gold = Convert.ToInt64(gold * res); + return (gold, res * socre, res); + } + + else if (bossConfig.InterstellarCruise.FishNumber.Any(c => c == fishNumber)) + { + + var res = bossConfig.InterstellarCruise.GetResponse(fishId); + gold = Convert.ToInt64(gold * res.beishu); + + + return (gold, res.beishu * socre, new + { + res.isKill, + res.beishu, + res.fishId, + res.animId + }); + } +else if (bossConfig.FlameStorm.FishNumber.Any(c => c == fishNumber)) + { + + var res = bossConfig.FlameStorm.GetResponse(fishId); + gold = Convert.ToInt64(gold * res.beishu); + + return (gold, res.beishu * socre, new + { + res.isKill, + res.beishu, + res.fishId, + res.animId + }); + } + else if (bossConfig.Bomb.FishNumber.Any(c => c == fishNumber)) + { + + var res = bossConfig.Bomb.GetResponse(fishId); + gold = Convert.ToInt64(gold * res.beishu); + + return (gold, res.beishu * socre, new + { + res.beishu, + res.type + }); + } + else if (bossConfig.Scorpion.FishNumber.Any(c => c == fishNumber)) + { + + var res = bossConfig.Scorpion.GetResponse(); + gold = Convert.ToInt64(gold * res.beishu); + + return (gold, res.beishu * socre, new + { + res.beishu, + res.items + }); + } + else if (bossConfig.LuckDragon.Any(c => c.FishNumber.Contains(fishNumber))) + { + var dragonConfig = bossConfig.LuckDragon.FirstOrDefault(c => c.FishNumber.Contains(fishNumber)); + if (dragonConfig != null) + { + var res = dragonConfig.GetResponse(); + gold = Convert.ToInt64(gold * res.beizhu); + + return (gold, res.beizhu * socre, new + { + res.option, + res.beizhu, + res.ringName, + msg = $"神龙转盘·{res.ringName},倍数x{res.beizhu}" + }); + } + } + return (gold, socre, null); + } + + public async Task SendRoomChange(RedisGameRoom room) + { + if (room == null) + return; + + await _capPublisher.PublishAsync(TopicKeys.房间变化, room); + + } + + private bool VerifySign(string cid, string rawStr, long timestamp, string sign) + { + + var serverNow = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + if (Math.Abs(serverNow - timestamp) > _bulletConfig.TimeWindowSeconds) + { + + if (!string.IsNullOrWhiteSpace(cid)) + _sendResult.ErrorMessage(cid, ErrorCodes.请求已过期, "请求已过期"); + return false; + } + if (!SignHelper.Verify(rawStr, _bulletConfig.SignKey, sign)) + { + + if (!string.IsNullOrWhiteSpace(cid)) + _sendResult.ErrorMessage(cid, ErrorCodes.签名错误, "签名错误"); + return false; + } + return true; + } + + + public Task CancelPendingDisconnect(string userId) + { + if (PendingDisconnects.TryRemove(userId, out var cts)) + { + try { cts.Cancel(); cts.Dispose(); } + catch (Exception ex) + { + _logger.LogError(ex, "取消并释放断线定时器失败 userId={UserId}", userId); + } + + } + return Task.CompletedTask; + } + + private async Task OnDisconnectTimeout(string userId, string roomId) + { + await _distributedLock.TryExecuteAsync( + $"{RedisKey.DistributedLockPrefix}fish:gold:{roomId}:{userId}", + () => OnDisconnectTimeoutInternal(userId, roomId), + retry: true); + } + + private async Task OnDisconnectTimeoutInternal(string userId, string roomId) + { + PendingDisconnects.TryRemove(userId, out _); + + + var userRedis = _redisService.GetRedisUserCId(userId); + if (userRedis == null || userRedis.RoomId != roomId) + { + + return; + } + + var room = _redisService.GetGameRoom(roomId); + if (room == null) + { + userRedis.RoomId = ""; + userRedis.CId = ""; + _redisService.SetRedisUserCId(userRedis); + return; + } + + var player = room.Players.FirstOrDefault(p => p.UserId == userId && !p.IsBot); + if (player == null || player.State != 1) + { + + return; + } + + try + { + var progressRewardGold = await FlushProgressAndMergeGold(roomId, player, player.CId); + await _userService.GameCoinsSettlement(new GameCoinsSettlementParam + { + UserId = userId, + BeforeGold = checked(player.BeginCoin + progressRewardGold), + AfterGold = player.Gold, + RoomSessionId = player.BeginTime, + RoomInfo = roomId, + RoomName = $"{room.GameType}-{room.RoomName}" + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "断线超时结算失败 userId={UserId} roomId={RoomId}", userId, roomId); + } + + try + { + await CleanupRoomAsync(userId); + } + catch (Exception ex) + { + _logger.LogError(ex, "断线超时清理房间异常 userId={UserId} roomId={RoomId}", userId, roomId); + await ForceCleanupPlayer(userId, roomId); + } + } + + private async Task SettleAndKickAllPlayers(RedisGameRoom room) + { + var roomId = room.RoomId; + + + var realPlayers = room.Players.Where(p => !p.IsBot).ToList(); + + foreach (var player in realPlayers) + { + var userId = player.UserId; + CancelPendingDisconnect(userId); + + try + { + var progressRewardGold = await FlushProgressAndMergeGold(roomId, player, player.CId); + await _userService.GameCoinsSettlement(new GameCoinsSettlementParam + { + UserId = userId, + BeforeGold = checked(player.BeginCoin + progressRewardGold), + AfterGold = player.Gold, + RoomSessionId = player.BeginTime, + RoomInfo = roomId, + RoomName = $"{room.GameType}-{room.RoomName}" + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "全员结算失败 userId={UserId} roomId={RoomId}", userId, roomId); + } + + _redisService.ClearPlayerRuntimeData(roomId, userId); + PlayerFactorCache.TryRemove($"{roomId}|{userId}", out _); + _bulletTracker.Clear(roomId, userId); + + var userRedis = _redisService.GetRedisUserCId(userId); + if (userRedis != null) + { + userRedis.RoomId = ""; + userRedis.CId = ""; + userRedis.PartitionId = ""; + _redisService.SetRedisUserCId(userRedis); + } + + room.Players.Remove(player); + _sendResult.RoomLeaveNotice(roomId, userId); + } + + int savedBotCount = room.RobotCount; + room.Players.Clear(); + room.CreateUserId = ""; + room.CurrentOnlinePlayerCount = 0; + room.RobotCount = savedBotCount > 0 ? savedBotCount : room.RobotCount; + ClearKillFishIds(roomId); + _fishSpawnService.UnregisterRoom(roomId); + NormalizeRoomPlayerCounts(room, preserveEmptyRoomRobotPlan: true); + _redisService.SetGameRoom(room); + await SendRoomChange(room); + + + } + + + #region IPendingSettlementService + + public async Task SettleGoldAsync(string userId) + { + var session = _redisService.GetRedisUserCId(userId); + var roomId = session?.RoomId ?? "none"; + return await _distributedLock.TryExecuteAsync( + $"{RedisKey.DistributedLockPrefix}fish:gold:{roomId}:{userId}", + () => SettleGoldInternalAsync(userId), + retry: true); + } + + private async Task SettleGoldInternalAsync(string userId) + { + var userRedis = _redisService.GetRedisUserCId(userId); + if (userRedis == null || string.IsNullOrWhiteSpace(userRedis.RoomId)) + { + + return string.Empty; + } + + var roomId = userRedis.RoomId; + var room = _redisService.GetGameRoom(roomId); + if (room == null) + { + + userRedis.RoomId = ""; + userRedis.CId = ""; + _redisService.SetRedisUserCId(userRedis); + return string.Empty; + } + + var player = room.Players.FirstOrDefault(p => p.UserId == userId && !p.IsBot); + if (player == null) + { + + userRedis.RoomId = ""; + userRedis.CId = ""; + _redisService.SetRedisUserCId(userRedis); + return string.Empty; + } + + + + var progressRewardGold = await FlushProgressAndMergeGold(roomId, player, player.CId); + var settledGold = await _userService.GameCoinsSettlement(new GameCoinsSettlementParam + { + UserId = userId, + BeforeGold = checked(player.BeginCoin + progressRewardGold), + AfterGold = player.Gold, + RoomSessionId = player.BeginTime, + RoomInfo = roomId, + RoomName = $"{room.GameType}-{room.RoomName}" + }); + + + + await CleanupRoomAsync(userId, force: true); + return roomId; + } + + public async Task CleanupRoomAsync(string userId, bool force = false) + { + CancelPendingDisconnect(userId); + + var userRedis = _redisService.GetRedisUserCId(userId); + if (userRedis == null || string.IsNullOrWhiteSpace(userRedis.RoomId)) + { + + return; + } + + var roomId = userRedis.RoomId; + var room = _redisService.GetGameRoom(roomId); + if (room == null) + { + userRedis.RoomId = ""; + userRedis.CId = ""; + _redisService.SetRedisUserCId(userRedis); + return; + } + + var player = room.Players.FirstOrDefault(p => p.UserId == userId && !p.IsBot); + if (player == null) + { + userRedis.RoomId = ""; + userRedis.CId = ""; + _redisService.SetRedisUserCId(userRedis); + return; + } + + if (player.State == 0 && !force) + { + + return; + } + + + + try + { + _redisService.ClearPlayerRuntimeData(roomId, userId); + } + catch (Exception ex) { _logger.LogError(ex, "CleanupRoomAsync ClearPlayerRuntimeData 失败 userId={UserId}", userId); } + PlayerFactorCache.TryRemove($"{roomId}|{userId}", out _); + try + { + _bulletTracker.Clear(roomId, userId); + } + catch (Exception ex) { _logger.LogError(ex, "CleanupRoomAsync _bulletTracker.Clear 失败 userId={UserId}", userId); } + + room.Players.Remove(player); + var leftPosition = player.Position; + + if (room.CreateUserId == userId) + { + var nextOwner = room.Players.FirstOrDefault(p => !p.IsBot); + room.CreateUserId = nextOwner?.UserId ?? ""; + if (!string.IsNullOrWhiteSpace(room.CreateUserId)) + _sendResult.ChangeControllerUser(roomId, room.CreateUserId); + } + + userRedis.RoomId = ""; + userRedis.CId = ""; + userRedis.PartitionId = ""; + try + { + _redisService.SetRedisUserCId(userRedis); + } + catch (Exception ex) + { + _logger.LogError(ex, "CleanupRoomAsync SetRedisUserCId 失败 userId={UserId}", userId); + } + + try + { + var user = await _userService.GetUser(userId); + if (user != null) + { + user.Static ??= new StaticInfo(); + user.Static.RoomNumber = string.Empty; + user.Static.CurrentGameType = 0; + await _userService.UpdateUser(user); + } + } + catch (Exception ex) { _logger.LogError(ex, "CleanupRoomAsync 清除用户房间信息失败 userId={UserId}", userId); } + + NormalizeRoomPlayerCounts(room); + try + { + _redisService.SetGameRoom(room); + } + catch (Exception ex) + { + _logger.LogError(ex, "CleanupRoomAsync SetGameRoom 失败 roomId={RoomId}", roomId); + } + try + { + _hubGame.SendGroup(roomId, "OnSeatChange", new + { + type = "leave", + userId = userId, + playerId = leftPosition + 1, + position = leftPosition, + showWaiting = false + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "CleanupRoomAsync OnSeatChange 失败 roomId={RoomId} userId={UserId}", roomId, userId); + } + try + { + _sendResult.RoomLeaveNotice(roomId, userId); + } + catch (Exception ex) + { + _logger.LogError(ex, "CleanupRoomAsync RoomLeaveNotice 失败 roomId={RoomId} userId={UserId}", roomId, userId); + } + try + { + await SendRoomChange(room); + } + catch (Exception ex) + { + _logger.LogError(ex, "CleanupRoomAsync SendRoomChange 失败 roomId={RoomId}", roomId); + } + + if (!room.Players.Any(p => !p.IsBot)) + { + _fishSpawnService.UnregisterRoom(roomId); + } + + + } + + public List GetActiveFishes(string roomId) + { + return _fishSpawnService.GetActiveFishes(roomId); + } + + private async Task ForceCleanupPlayer(string userId, string roomId) + { + try + { + var userRedis = _redisService.GetRedisUserCId(userId); + if (userRedis != null) + { + userRedis.RoomId = ""; + userRedis.CId = ""; + userRedis.PartitionId = ""; + _redisService.SetRedisUserCId(userRedis); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "ForceCleanupPlayer 清除 RedisUserCId 失败 userId={UserId}", userId); + } + + try + { + var room = _redisService.GetGameRoom(roomId); + if (room != null) + { + var player = room.Players.FirstOrDefault(p => p.UserId == userId && !p.IsBot); + if (player != null) + { + var leftPosition = player.Position; + room.Players.Remove(player); + + _redisService.SetGameRoom(room); + _hubGame.SendGroup(roomId, "OnSeatChange", new + { + type = "leave", + userId = userId, + playerId = leftPosition + 1, + position = leftPosition, + showWaiting = false + }); + } + else + { + _redisService.SetGameRoom(room); + } + } + } + catch (Exception ex) + { + _logger.LogError(ex, "ForceCleanupPlayer 移除玩家失败 userId={UserId} roomId={RoomId}", userId, roomId); + } + + try + { + _sendResult.RoomLeaveNotice(roomId, userId); + } + catch (Exception ex) + { + _logger.LogError(ex, "ForceCleanupPlayer 发送 RoomLeaveNotice 失败 userId={UserId} roomId={RoomId}", userId, roomId); + } + } + + private void SendCurrentFishState(string cid, string roomId) + { + try + { + var activeFishes = _fishSpawnService.GetActiveFishes(roomId); + if (activeFishes == null || activeFishes.Count == 0) + { + + return; + } + + var payload = new + { + type = "spawn", + timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), + serverTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + fish = activeFishes.Select(f => new + { + fishId = f.FishId, + fishIds = new[] { f.FishId }, + fishNumber = string.IsNullOrWhiteSpace(f.FishArrayNumber) ? f.FishNumber : string.Empty, + routeId = f.ClientRouteId, + fishArrayNumber = f.FishArrayNumber ?? string.Empty, + createdAt = new DateTimeOffset(f.CreatedAt).ToUnixTimeMilliseconds(), + createdTime = f.CreatedAt.ToString("yyyy-MM-dd HH:mm:ss.fff"), + expireAt = new DateTimeOffset(f.ExpireAt).ToUnixTimeMilliseconds(), + expireTime = f.ExpireAt.ToString("yyyy-MM-dd HH:mm:ss.fff"), + remainingSeconds = (int)Math.Max(0, (f.ExpireAt - DateTime.Now).TotalSeconds) + }).ToList() + }; + + + _hubGame.SendUserCId(cid, "OnFishSpawn", payload); + + } + catch (Exception ex) + { + _logger.LogError(ex, "[JoinRoom] 同步鱼状态失败: cid={Cid} roomId={RoomId}", cid, roomId); + } + } + + #endregion + } +} diff --git a/FishGameSrc/FishGameService/GameService/IBulletTracker.cs b/FishGameSrc/FishGameService/GameService/IBulletTracker.cs new file mode 100644 index 0000000..c7986b1 --- /dev/null +++ b/FishGameSrc/FishGameService/GameService/IBulletTracker.cs @@ -0,0 +1,107 @@ +using System.Collections.Concurrent; + +namespace FishGameService.GameService +{ + public interface IBulletTracker + { + void Add(string roomId, string userId, IEnumerable bulletIds); + bool TryConsume(string roomId, string userId, string bulletId); + int Count(string roomId, string userId); + void Clear(string roomId, string userId); + } + + public sealed class BulletTracker : IBulletTracker + { + private const int MaxBulletsPerPlayer = 100; + private readonly ConcurrentDictionary _players = new(); + + public void Add(string roomId, string userId, IEnumerable bulletIds) + { + var bullets = _players.GetOrAdd(Key(roomId, userId), _ => new PlayerBullets()); + lock (bullets.SyncRoot) + { + foreach (var bulletId in bulletIds) + { + if (string.IsNullOrWhiteSpace(bulletId) || !bullets.Ids.Add(bulletId)) + continue; + + bullets.Order.Enqueue(bulletId); + } + + while (bullets.Ids.Count > MaxBulletsPerPlayer && bullets.Order.Count > 0) + bullets.Ids.Remove(bullets.Order.Dequeue()); + } + } + + public bool TryConsume(string roomId, string userId, string bulletId) + { + if (string.IsNullOrWhiteSpace(bulletId) + || !_players.TryGetValue(Key(roomId, userId), out var bullets)) + return false; + + lock (bullets.SyncRoot) + return bullets.Ids.Remove(bulletId); + } + + public int Count(string roomId, string userId) + { + if (!_players.TryGetValue(Key(roomId, userId), out var bullets)) + return 0; + + lock (bullets.SyncRoot) + return bullets.Ids.Count; + } + + public void Clear(string roomId, string userId) + { + _players.TryRemove(Key(roomId, userId), out _); + } + + private static string Key(string roomId, string userId) => $"{roomId}|{userId}"; + + private sealed class PlayerBullets + { + public object SyncRoot { get; } = new(); + public HashSet Ids { get; } = new(StringComparer.Ordinal); + public Queue Order { get; } = new(); + } + } + + public interface IFishKillTracker + { + bool TryAdd(string roomId, string fishId); + void Clear(string roomId); + } + + public sealed class FishKillTracker : IFishKillTracker + { + private const int MaxFishPerRoom = 50; + private readonly ConcurrentDictionary _rooms = new(); + + public bool TryAdd(string roomId, string fishId) + { + var room = _rooms.GetOrAdd(roomId, _ => new RoomFishIds()); + lock (room.SyncRoot) + { + if (!room.Ids.Add(fishId)) + return false; + + room.Order.Enqueue(fishId); + + while (room.Ids.Count > MaxFishPerRoom && room.Order.Count > 0) + room.Ids.Remove(room.Order.Dequeue()); + + return true; + } + } + + public void Clear(string roomId) => _rooms.TryRemove(roomId, out _); + + private sealed class RoomFishIds + { + public object SyncRoot { get; } = new(); + public HashSet Ids { get; } = new(StringComparer.Ordinal); + public Queue Order { get; } = new(); + } + } +} diff --git a/FishGameSrc/FishGameService/GameService/IFishingGameService.cs b/FishGameSrc/FishGameService/GameService/IFishingGameService.cs new file mode 100644 index 0000000..7bb93f6 --- /dev/null +++ b/FishGameSrc/FishGameService/GameService/IFishingGameService.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CommonDomain; +using CommonDomain.Enum; +using FishGameService.Services; +using RedisService.Param; + +namespace FishGameService.GameService +{ + public interface IFishingGameService + { + + + + Task JoinRoom(string cid, string roomId, string userId, int posituin); + + + + Task UseProp(string cid, string roomId, string userId, string propNumber, int diamond = 0); + + Task UseTorpedo(string cid, string roomId, string userId, string propNumber); + + Task<(List bullets, long gold)> FireCannon(string cid, string roomId, string userId, long gold, int count, long timestamp, string sign, object extra = null); + + Task KillFish(string cid, string roomId, string userId, string fishNumber, string fihsId, long gold, long timespan, string bulletId, long timestamp, string sign); + + Task LeaveRoom(string cid, string roomId, string userId); + + Task ChangeGunMultiple(string cid, string roomId, string userId, int multiple); + + Task GetPlayerInfo(string cid, string roomId, string userId); + + Task CancelPendingDisconnect(string userId); + + Task HandleDisconnect(string cid); + + + Task SendRoomChange(RedisGameRoom room); + + Task SetPlayerAfk(string cid, string roomId, string userId); + Task CancelPlayerAfk(string cid, string roomId, string userId); + + List GetActiveFishes(string roomId); + + + Task> BotFireCannon(string cid, string roomId, string botUserId, long gold, int count); + + Task BotKillFish(string cid, string roomId, string botUserId, string fishNumber, string fishId, long gold, string bulletId); + + } +} diff --git a/FishGameSrc/FishGameService/GameService/ReconnectTracker.cs b/FishGameSrc/FishGameService/GameService/ReconnectTracker.cs new file mode 100644 index 0000000..499b021 --- /dev/null +++ b/FishGameSrc/FishGameService/GameService/ReconnectTracker.cs @@ -0,0 +1,20 @@ +using System.Collections.Concurrent; + +namespace FishGameService.GameService +{ + public interface IReconnectTracker + { + bool TryAdd(string userId); + + void Remove(string userId); + } + + public class ReconnectTracker : IReconnectTracker + { + private readonly ConcurrentDictionary _tracking = new(); + + public bool TryAdd(string userId) => _tracking.TryAdd(userId, 0); + + public void Remove(string userId) => _tracking.TryRemove(userId, out _); + } +} diff --git a/FishGameSrc/FishGameService/Hubs/FishGameHub.cs b/FishGameSrc/FishGameService/Hubs/FishGameHub.cs new file mode 100644 index 0000000..2041882 --- /dev/null +++ b/FishGameSrc/FishGameService/Hubs/FishGameHub.cs @@ -0,0 +1,433 @@ +using CommonDomain; +using FishGameService.GameSend; +using FishGameService.GameService; +using System.Text.Json; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.Logging; +using RedisService; +using RedisService.Param; +using UserService.Hubs; +using UserService.User; + +namespace FishGameService.Hubs +{ + public class FishGameHub : Hub + { + private readonly IFishingGameService _fishingService; + private readonly IFishingSendService _send; + private readonly IRedisService _redisService; + private readonly IUserService _userService; + private readonly ILogger _logger; + private readonly IHubContext _hubLoginContext; + + + public FishGameHub(IFishingGameService fishingService, IFishingSendService send, IRedisService redisService, IUserService userService, ILogger logger, IHubContext hubLoginContext) + { + _fishingService = fishingService; + _send = send; + _redisService = redisService; + _userService = userService; + _logger = logger; + _hubLoginContext = hubLoginContext; + } + + public override async Task OnConnectedAsync() + { + + try + { + await base.OnConnectedAsync(); + } + catch (Exception ex) + { + _logger.LogError(ex, "FishHub建立连接异常 cid={Cid}", Context.ConnectionId); + } + } + + public override async Task OnDisconnectedAsync(Exception? exception) + { + var cid = Context.ConnectionId; + var userId = _redisService.GetUserId(cid); + if (exception != null) + { + _logger.LogWarning(exception, "FishHub异常断开 cid={Cid} userId={UserId} reason={Reason}", + cid, userId, exception.Message); + } + try + { + await _fishingService.HandleDisconnect(Context.ConnectionId); + } + catch (Exception ex) + { + _logger.LogError(ex, "FishHub断线处理失败 cid={Cid} userId={UserId}", cid, userId); + } + + await base.OnDisconnectedAsync(exception); + } + + public async Task Reconnect(string userId) + { + try + { + await ReconnectInternal(userId); + } + catch (Exception ex) + { + _logger.LogError(ex, "FishHub重连异常 cid={Cid} userId={UserId}", Context.ConnectionId, userId); + throw; + } + } + + private async Task ReconnectInternal(string userId) + { + var cid = Context.ConnectionId; + + if (string.IsNullOrWhiteSpace(userId)) + { + _send.ErrorMessage(cid, ErrorCodes.用户不存在, "缺少 userId,无法重连"); + return; + } + + var userRedis = _redisService.GetRedisUserCId(userId); + if (userRedis == null) + { + userRedis = new RedisUserCid { UserId = userId, CId = cid }; + _redisService.SetRedisUserCId(userRedis); + _redisService.SetUserId(cid, userId); + _send.BindSuccess(cid); + + return; + } + + var oldCid = userRedis.CId; + if (!string.IsNullOrWhiteSpace(oldCid) && oldCid != cid) + { + + if (!string.IsNullOrWhiteSpace(userRedis.RoomId)) + { + + try { _send.RoomLeaveNotice(userRedis.RoomId, userId); } catch (Exception ex) { _logger.LogError(ex, "发送RoomLeaveNotice失败 userId={UserId} roomId={RoomId}", userId, userRedis.RoomId); } + } + + _redisService.RemoveUserId(oldCid); + try + { + if (!string.IsNullOrWhiteSpace(userRedis.RoomId)) + await Groups.RemoveFromGroupAsync(oldCid, userRedis.RoomId); + } + catch (Exception ex) + { + _logger.LogWarning(ex, "FishHub重连移除旧连接房间组失败 oldCid={OldCid} roomId={RoomId}", oldCid, userRedis.RoomId); + } + } + + userRedis.CId = cid; + _redisService.SetRedisUserCId(userRedis); + _redisService.SetUserId(cid, userId); + + if (!string.IsNullOrWhiteSpace(userRedis.RoomId)) + { + var room = _redisService.GetGameRoom(userRedis.RoomId); + if (room != null) + { + var player = room.Players.FirstOrDefault(p => p.UserId == userId); + if (player != null) + { + await _fishingService.CancelPendingDisconnect(userId); + player.CId = cid; + player.State = 0; + + bool ownerRestored = false; + if (!string.IsNullOrWhiteSpace(userId) && room.CreateUserId != userId) + { + var currentOwner = room.Players.FirstOrDefault(p => p.UserId == room.CreateUserId && !p.IsBot); + if (string.IsNullOrWhiteSpace(room.CreateUserId) + || currentOwner == null + || currentOwner.State != 0) + { + room.CreateUserId = userId; + ownerRestored = true; + } + } + + _redisService.SetGameRoom(room); + + await Groups.AddToGroupAsync(cid, room.RoomId); + + var activeFishes = _fishingService.GetActiveFishes(room.RoomId); + await _send.SendRoomInfo(cid, room, activeFishes); + _send.RoomJoinNotice(room.RoomId, player); + await Clients.Caller.SendAsync("OnPlayerInfo", new + { + userId = player.UserId, + userName = player.UserName, + gold = player.Gold, + diamond = player.Diamond, + viplvl = player.VipLevel, + cannonMultiple = player.CannonMultiple, + cannonId = player.CannonId, + wingsId = player.WingsId, + position = player.Position + }); + await Clients.Group(room.RoomId).SendAsync("OnSeatChange", new + { + type = "join", + playerId = player.Position + 1, + position = player.Position, + playerName = player.UserName, + nickname = player.UserName, + gold = player.Gold, + diamond = player.Diamond, + vipLevel = player.VipLevel, + turretId = 1, + turretRate = 1, + turretLv = 1, + headId = 1, + roomRate = 1, + bulletPower = 1 + }); + if (ownerRestored) + _send.ChangeControllerUser(room.RoomId, room.CreateUserId); + + await _fishingService.SendRoomChange(room); + + await SendActiveFishSync(room.RoomId); + + + + try + { + var user = await _userService.GetUser(userId); + if (user != null) + { + user.Static.RoomNumber = room.RoomId; + user.Static.CurrentGameType = (int)room.GameType; + await _userService.UpdateUser(user); + } + } + catch (Exception ex) + { + _logger.LogWarning(ex, "FishHub重连后更新用户状态失败 userId={UserId} roomId={RoomId}", userId, room.RoomId); + } + + try + { + await SendActiveFishSync(room.RoomId); + + } + catch (Exception ex) + { + _logger.LogWarning(ex, "FishHub重连同服务端步活跃鱼失败 userId={UserId} roomId={RoomId}", userId, room.RoomId); + } + + return; + } + } + } + + _send.BindSuccess(cid); + + } + + public async Task JoinRoom(string roomId, string userId, int posituin) + { + string cid = Context.ConnectionId; + try + { + var boundUserId = _redisService.GetUserId(cid); + if (!string.IsNullOrWhiteSpace(boundUserId) && boundUserId != userId) + { + + await Clients.Caller.SendAsync("KickToMainPage", new { userId }); + return; + } + + await _fishingService.JoinRoom(cid, roomId, userId, posituin); + + } + catch (Exception ex) + { + _logger.LogError(ex, "FishHub加入房间异常 cid={Cid} roomId={RoomId} userId={UserId} position={Position}", cid, roomId, userId, posituin); + _send.ErrorMessage(cid, ErrorCodes.未知错误, $"加入房间失败: {ex.Message}"); + } + + } + + + public async Task GetRoomInfo(string roomId) + { + string cid = Context.ConnectionId; + if (!IsConnectionInRoom(cid, roomId)) + return; + var room = _redisService.GetGameRoom(roomId); + + await Clients.Caller.SendAsync("GetRoomInfoResult", room); + + } + + public async Task SyncGameData(string roomId, object data) + { + _send.SyncGameData(roomId, data); + } + + private bool IsConnectionInRoom(string cid, string roomId) + { + if (string.IsNullOrWhiteSpace(cid) || string.IsNullOrWhiteSpace(roomId)) + return false; + + var userId = _redisService.GetUserId(cid); + if (string.IsNullOrWhiteSpace(userId)) + return false; + + var userRedis = _redisService.GetRedisUserCId(userId); + return userRedis != null && userRedis.CId == cid && userRedis.RoomId == roomId; + } + public async Task UseProp(string roomId, string userId, string propNumber, int diamond) + { + string cid = Context.ConnectionId; + + return await _fishingService.UseProp(cid, roomId, userId, propNumber, diamond); + } + + public async Task UseTorpedo(string roomId, string userId, string propNumber) + { + string cid = Context.ConnectionId; + return await _fishingService.UseTorpedo(cid, roomId, userId, propNumber); + } + + public async Task FireCannon(string roomId, string userId, long gold, int count, long timestamp, string sign, object extra = null) + { + string cid = Context.ConnectionId; + var result = extra is string extraSign && (sign == null || sign.Length != 8) + ? await _fishingService.FireCannon(cid, roomId, userId, gold, count, timestamp, extraSign, null) + : await _fishingService.FireCannon(cid, roomId, userId, gold, count, timestamp, sign, extra); + return new + { + bullets = result.bullets.Select(bulletId => new { bulletId, gold }).ToList(), + gold = result.gold, + timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() + }; + } + + public async Task KillFish(string roomId, string userId, string fishNumber, string fihsId, long gold, long timespan, string bulletId, long timestamp, string sign) + { + string cid = Context.ConnectionId; + + var currentGold = await _fishingService.KillFish(cid, roomId, userId, fishNumber, fihsId, gold, timespan, bulletId, timestamp, sign); + return new { gold = currentGold, timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }; + } + + public async Task LeaveRoom(string roomId, string userId) + { + string cid = Context.ConnectionId; + try + { + + + await _fishingService.LeaveRoom(cid, roomId, userId); + + if (IsConnectionInRoom(cid, roomId)) + { + + return; + } + + + } + catch (Exception ex) + { + _logger.LogError(ex, "FishHub离开房间异常 cid={Cid} roomId={RoomId} userId={UserId}", cid, roomId, userId); + throw; + } + + } + + public async Task ChangeGunMultiple(string roomId, string userId, int multiple) + { + string cid = Context.ConnectionId; + + await _fishingService.ChangeGunMultiple(cid, roomId, userId, multiple); + } + + + public async Task GetPlayerInfo(string roomId, string userId) + { + string cid = Context.ConnectionId; + await _fishingService.GetPlayerInfo(cid, roomId, userId); + } + + public async Task SetPlayerAfk(string roomId, string userId) + { + string cid = Context.ConnectionId; + await _fishingService.SetPlayerAfk(cid, roomId, userId); + } + + public async Task CancelPlayerAfk(string roomId, string userId) + { + string cid = Context.ConnectionId; + await _fishingService.CancelPlayerAfk(cid, roomId, userId); + + try + { + var room = _redisService.GetGameRoom(roomId); + if (room != null) + { + var activeFishes = _fishingService.GetActiveFishes(roomId); + await _send.SendRoomInfo(cid, room, activeFishes); + + } + } + catch (Exception ex) + { + _logger.LogWarning(ex, "CancelPlayerAfk 同步房间信息失败 userId={UserId} roomId={RoomId}", userId, roomId); + } + } + + private async Task SendActiveFishSync(string roomId) + { + var activeFishes = _fishingService.GetActiveFishes(roomId); + if (activeFishes == null || activeFishes.Count == 0) + return; + + var now = DateTimeOffset.UtcNow; + var syncFish = activeFishes.Select(f => new + { + fishId = f.FishId, + fishIds = new[] { f.FishId }, + fishNumber = string.IsNullOrWhiteSpace(f.FishArrayNumber) ? f.FishNumber : string.Empty, + routeId = f.ClientRouteId, + fishArrayNumber = f.FishArrayNumber ?? string.Empty, + createdAt = new DateTimeOffset(f.CreatedAt).ToUnixTimeMilliseconds(), + createdTime = f.CreatedAt.ToString("yyyy-MM-dd HH:mm:ss.fff"), + expireAt = new DateTimeOffset(f.ExpireAt).ToUnixTimeMilliseconds(), + expireTime = f.ExpireAt.ToString("yyyy-MM-dd HH:mm:ss.fff"), + remainingSeconds = (int)Math.Max(0, (new DateTimeOffset(f.ExpireAt) - now).TotalSeconds) + }).ToList(); + + var payload = new + { + type = "sync", + timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), + serverTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + fish = syncFish + }; + + + await Clients.Caller.SendAsync("OnFishSpawn", payload); + } + + + public async Task> BotFireCannon(string roomId, string botUserId, long gold, int count) + { + string cid = Context.ConnectionId; + return await _fishingService.BotFireCannon(cid, roomId, botUserId, gold, count); + } + + public async Task BotKillFish(string roomId, string botUserId, string fishNumber, string fishId, long gold, string bulletId) + { + string cid = Context.ConnectionId; + await _fishingService.BotKillFish(cid, roomId, botUserId, fishNumber, fishId, gold, bulletId); + } + + } +} diff --git a/FishGameSrc/FishGameService/Services/FishSpawnService.cs b/FishGameSrc/FishGameService/Services/FishSpawnService.cs new file mode 100644 index 0000000..dc7c64f --- /dev/null +++ b/FishGameSrc/FishGameService/Services/FishSpawnService.cs @@ -0,0 +1,1334 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Common; +using CommonDomain.BaseModel; +using CommonService; +using FishGameService.GameService; +using FishGameService.Hubs; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using RedisHelper; +using RedisService; + +namespace FishGameService.Services +{ + public class FishSpawnService : BackgroundService + { + private readonly FishSpawnConfigStore _configStore; + private readonly IHubSend _hubGame; + private readonly IRedisService _redisService; + private readonly ICache _cache; + private readonly string _instanceId; + private readonly ILogger _logger; + + private readonly ConcurrentDictionary _roomStates = new ConcurrentDictionary(); + + private const string GlobalFishIdKey = "fish:spawn:global:id"; + + private const int TickIntervalMs = 1000; + + private const int SystemFactorSyncIntervalMs = 5000; + private const double SystemFactorChangeThreshold = 0.1; + private const int SpawnOwnerLeaseSeconds = 10; + private const string SpawnOwnerKeyPrefix = "fish:spawn:owner:"; + private const string ActiveFishSnapshotKeyPrefix = "fish:spawn:snapshot:"; + private const string FishKilledKeyPrefix = "fish:spawn:killed:"; + private const string SpawnStopKeyPrefix = "fish:spawn:stop:"; + private const int ActiveFishSnapshotSeconds = 60; + private const int RestrictedFishRespawnBufferSeconds = 5; + + private const int ExpiredHitBufferSeconds = 15; + + public FishSpawnService( + FishSpawnConfigStore configStore, + IHubSend hubGame, + IRedisService redisService, + ICache cache, + AppInstanceId appInstanceId, + ILogger logger) + { + _configStore = configStore; + _hubGame = hubGame; + _redisService = redisService; + _cache = cache; + _instanceId = string.IsNullOrWhiteSpace(appInstanceId?.Id) ? "default" : appInstanceId.Id; + _logger = logger; + } + + public void RegisterRoom(string roomId, int gameType, int roomLevel) + { + var stopKey = GetSpawnStopKey(roomId); + if (_cache.Exists(stopKey)) + { + _roomStates.TryRemove(roomId, out _); + _cache.Remove(GetActiveFishSnapshotKey(roomId)); + } + _cache.Remove(stopKey); + if (_roomStates.ContainsKey(roomId)) + { + + return; + } + + if (!TryClaimSpawnOwnership(roomId)) + { + var owner = _cache.Get(GetSpawnOwnerKey(roomId)); + + return; + } + + var config = _configStore.GetOrLoad(gameType, roomLevel); + if (config == null) + { + ReleaseSpawnOwnership(roomId); + + return; + } + + var state = new RoomFishState + { + RoomId = roomId, + GameType = gameType, + RoomLevel = roomLevel, + Config = config, + }; + + var now = DateTime.UtcNow; + lock (state.Lock) + { + SpawnFishBatch(state, now); + } + + _roomStates[roomId] = state; + PersistActiveFishSnapshot(state); + + } + + public void ReloadAllRoomConfigs() + { + var now = DateTimeOffset.UtcNow; + var nowMs = now.ToUnixTimeMilliseconds(); + + foreach (var kv in _roomStates) + { + var state = kv.Value; + var newConfig = _configStore.GetOrLoad(state.GameType, state.RoomLevel); + if (newConfig != null) + { + lock (state.Lock) + { + string oldProbs = string.Join(";", + (state.Config?.Probabilities ?? new List()) + .Select(p => $"type={p.Type} fishType={p.FishType} time={p.TimeMin}-{p.TimeMax} count={p.CountMin}-{p.CountMax} max={p.MaxCountMin}-{p.MaxCountMax}")); + string newProbs = string.Join(";", + newConfig.Probabilities.Select(p => $"type={p.Type} fishType={p.FishType} time={p.TimeMin}-{p.TimeMax} count={p.CountMin}-{p.CountMax} max={p.MaxCountMin}-{p.MaxCountMax}")); + + + + + state.Config = newConfig; + state.NextSpawnByType.Clear(); + } + + } + else + { + + } + } + + } + + public void UnregisterRoom(string roomId) + { + var latestRoom = _redisService.GetGameRoom(roomId); + if (latestRoom?.Players?.Any(p => !p.IsBot && p.State == 0) == true) + { + + return; + } + + var recheckRoom = _redisService.GetGameRoom(roomId); + if (recheckRoom?.Players?.Any(p => !p.IsBot && p.State == 0) == true) + { + + return; + } + + int fishCount = 0; + if (_roomStates.TryGetValue(roomId, out var st)) + { + lock (st.Lock) { fishCount = st.ActiveFishes.Count; } + } + + _roomStates.TryRemove(roomId, out _); + _cache.Insert(GetSpawnStopKey(roomId), DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), ActiveFishSnapshotSeconds); + _cache.Remove(GetActiveFishSnapshotKey(roomId)); + _cache.Remove(GetSpawnOwnerKey(roomId)); + } + + public List GetActiveFishes(string roomId) + { + if (_roomStates.TryGetValue(roomId, out var state)) + { + lock (state.Lock) + { + var localNow = DateTime.UtcNow; + return state.ActiveFishes.Values + .Where(f => !_cache.Exists(GetFishKilledKey(roomId, f.FishId)) && IsFishWithinHitWindow(f, localNow)) + .ToList(); + } + } + var shared = _cache.Get>(GetActiveFishSnapshotKey(roomId)); + if (shared == null && _cache.Exists(GetSpawnOwnerKey(roomId)) && !_cache.Exists(GetSpawnStopKey(roomId))) + { + for (var attempt = 0; attempt < 5 && shared == null; attempt++) + { + Thread.Sleep(10); + shared = _cache.Get>(GetActiveFishSnapshotKey(roomId)); + } + } + shared ??= new List(); + var sharedNow = DateTime.UtcNow; + return shared.Where(f => f != null && !f.IsKilled && IsFishWithinHitWindow(f, sharedNow)).ToList(); + } + + public bool TryGetFishNumber(string roomId, long fishId, out string fishNumber) + { + fishNumber = string.Empty; + if (!_roomStates.TryGetValue(roomId, out var state)) + { + var sharedFish = GetActiveFishes(roomId).FirstOrDefault(f => f.FishId == fishId); + if (sharedFish == null || string.IsNullOrWhiteSpace(sharedFish.FishNumber)) + return false; + fishNumber = sharedFish.FishNumber; + return true; + } + + lock (state.Lock) + { + if (!state.ActiveFishes.TryGetValue(fishId, out var fish) || string.IsNullOrWhiteSpace(fish.FishNumber)) + return false; + + fishNumber = fish.FishNumber; + return true; + } + } + + public bool SpawnTemporaryFish(string roomId, string fishNumber, int count, int? routeId = null, int? seconds = null) + { + return SpawnTemporaryFish(roomId, fishNumber, count, out _, routeId, seconds); + } + + public bool SpawnTemporaryFish(string roomId, string fishNumber, int count, out List fishIds, + int? routeId = null, int? seconds = null) + { + return SpawnTemporaryFishCore(roomId, fishNumber, count, out fishIds, routeId, seconds, false); + } + + private bool SpawnTemporaryFishCore(string roomId, string fishNumber, int count, out List fishIds, + int? routeId, int? seconds, bool isSummonCard) + { + fishIds = new List(); + if (string.IsNullOrWhiteSpace(roomId) || string.IsNullOrWhiteSpace(fishNumber)) + return false; + + if (!_roomStates.TryGetValue(roomId, out var state)) + { + var owner = _cache.Get(GetSpawnOwnerKey(roomId)); + + return false; + } + + var spawned = new List(); + DateTime now; + int times; + + lock (state.Lock) + { + var fishCfg = (state.Config?.Fishes ?? new List()) + .FirstOrDefault(f => string.Equals(f.FishNumber, fishNumber, StringComparison.OrdinalIgnoreCase)); + if (fishCfg == null) + { + + return false; + } + + var isRestricted = fishCfg.FishType == 2 || fishCfg.FishType == 3 || + fishCfg.FishType == 4 || fishCfg.FishType == 5; + var alternateRestrictedBySide = isRestricted; + if (!isSummonCard && isRestricted && state.ActiveFishes.Values.Any(f => + !f.IsKilled && f.ExpireAt > DateTime.UtcNow && + string.Equals(f.FishNumber, fishNumber, StringComparison.Ordinal))) + { + + return false; + } + + times = (seconds.HasValue && seconds.Value > 0) ? seconds.Value + : (fishCfg.Times > 0 ? fishCfg.Times : 8); + now = DateTime.UtcNow; + var maxCount = isRestricted ? 1 : Math.Clamp(count, 1, 2000); + var random = new Random(); + bool preferOdd = true; + + for (var i = 0; i < maxCount; i++) + { + var fishId = NextFishId(); + var routePreference = alternateRestrictedBySide + ? (fishCfg.FishType == 3 ? state.PreferOddGoldenRoute : state.PreferOddRestrictedRoute) + : preferOdd; + if (!isSummonCard && !routeId.HasValue && alternateRestrictedBySide && !HasRouteForSide(fishCfg, routePreference)) + break; + var route = routeId.HasValue ? routeId.Value : PickRoute(fishCfg, random, routePreference); + preferOdd = !preferOdd; + if (alternateRestrictedBySide) + { + if (fishCfg.FishType == 3) + state.PreferOddGoldenRoute = (route & 1) == 0; + else + state.PreferOddRestrictedRoute = (route & 1) == 0; + } + + var activeFish = new ActiveFish + { + FishId = fishId, + FishNumber = fishCfg.FishNumber, + FishType = fishCfg.FishType, + RouteId = route, + CreatedAt = now, + ExpireAt = now.AddSeconds(times), + IsKilled = false, + FishArrayNumber = null, + ArrayNumber = null + }; + + state.ActiveFishes[fishId] = activeFish; + state.FishCountByType.TryGetValue(fishCfg.FishType, out var fc); + state.FishCountByType[fishCfg.FishType] = fc + 1; + + spawned.Add(new SpawnFishItem + { + FishId = fishId, + FishIds = new List { fishId }, + FishNumber = fishCfg.FishNumber, + FishType = fishCfg.FishType, + RouteId = route, + CreatedAtMs = new DateTimeOffset(now).ToUnixTimeMilliseconds(), + ExpireAtMs = new DateTimeOffset(activeFish.ExpireAt).ToUnixTimeMilliseconds() + }); + } + } + + if (spawned.Count == 0) + return false; + + var nowMs = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + var payload = new + { + type = "spawn", + timestamp = nowMs, + serverTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + fish = spawned.Select(s => new + { + fishId = s.FishId, + fishNumber = s.FishNumber, + routeId = s.RouteId, + fishArrayNumber = string.Empty, + fishIds = s.FishIds, + createdAt = s.CreatedAtMs, + createdTime = DateTimeOffset.FromUnixTimeMilliseconds(s.CreatedAtMs).ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss.fff"), + expireAt = s.ExpireAtMs, + expireTime = DateTimeOffset.FromUnixTimeMilliseconds(s.ExpireAtMs).ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss.fff"), + remainingSeconds = (int)Math.Max(0, (s.ExpireAtMs - nowMs) / 1000) + }).ToList() + }; + + _hubGame.SendGroup(roomId, "OnFishSpawn", payload); + PersistActiveFishSnapshot(state); + + fishIds = spawned.Select(s => s.FishId).ToList(); + return true; + } + + public bool SpawnSummonCardFish(string roomId, int fishType, out string fishNumber) + { + return SpawnSummonCardFish(roomId, fishType, out fishNumber, out _); + } + + public bool SpawnSummonCardFish(string roomId, int fishType, out string fishNumber, out long fishId) + { + fishNumber = string.Empty; + fishId = 0; + if (!_roomStates.TryGetValue(roomId, out var state)) + return false; + + List candidates; + lock (state.Lock) + { + candidates = (state.Config?.Fishes ?? new List()) + .Where(f => f.FishType == fishType && f.FishWeight > 0 && !string.IsNullOrWhiteSpace(f.FishNumber)) + .OrderBy(_ => Random.Shared.Next()) + .Select(f => f.FishNumber) + .Distinct() + .ToList(); + } + + + foreach (var candidate in candidates) + { + if (!SpawnTemporaryFishCore(roomId, candidate, 1, out var fishIds, null, null, true) || fishIds.Count == 0) + { + + continue; + } + fishNumber = candidate; + fishId = fishIds[0]; + + return true; + } + + return false; + } + + public void SendSummonCardFishNotice(string roomId, string userId, int fishType, string fishNumber, long fishId) + { + var room = _redisService.GetGameRoom(roomId); + var player = room?.Players?.FirstOrDefault(p => p.UserId == userId); + _hubGame.SendGroup(roomId, "SummonCardFishNotice", new + { + roomId, + userId, + userNumber = player?.UserNumber ?? string.Empty, + userName = player?.UserName ?? string.Empty, + fishType, + fishTypeName = Enum.IsDefined(typeof(CommonDomain.Enum.FishTypeEnum), fishType) + ? ((CommonDomain.Enum.FishTypeEnum)fishType).ToString() + : string.Empty, + fishNumber, + fishId + }); + + } + + public bool ValidateFishHit(string roomId, long fishId) + { + if (_cache.Exists(GetFishKilledKey(roomId, fishId))) + return false; + + if (!_roomStates.TryGetValue(roomId, out var state)) + { + var sharedFish = GetActiveFishes(roomId).FirstOrDefault(f => f.FishId == fishId); + return sharedFish != null && IsFishWithinHitWindow(sharedFish, DateTime.UtcNow); + } + + lock (state.Lock) + { + if (!state.ActiveFishes.TryGetValue(fishId, out var fish)) + return false; + if (fish.IsKilled) + return false; + if (DateTime.UtcNow > fish.ExpireAt) + { + if (fish.FishType == (int)CommonDomain.Enum.FishTypeEnum.Boss鱼 || + fish.FishType == (int)CommonDomain.Enum.FishTypeEnum.特殊Boss || + fish.FishType == (int)CommonDomain.Enum.FishTypeEnum.特殊鱼) + { + return DateTime.UtcNow <= fish.ExpireAt.AddSeconds(ExpiredHitBufferSeconds); + } + return false; + } + return true; + } + } + + public bool TryMarkFishKilled(string roomId, long fishId) + { + var killedKey = GetFishKilledKey(roomId, fishId); + if (!_cache.GetFullRedis().Add(killedKey, _instanceId, ActiveFishSnapshotSeconds)) + return false; + + if (!_roomStates.TryGetValue(roomId, out var state)) + { + var shared = _cache.Get>(GetActiveFishSnapshotKey(roomId)) ?? new List(); + var fish = shared.FirstOrDefault(f => f.FishId == fishId); + if (fish == null || fish.IsKilled || !IsFishWithinHitWindow(fish, DateTime.UtcNow)) + { + _cache.Remove(killedKey); + return false; + } + fish.IsKilled = true; + _cache.Insert(GetActiveFishSnapshotKey(roomId), shared, ActiveFishSnapshotSeconds); + return true; + } + + lock (state.Lock) + { + if (!state.ActiveFishes.TryGetValue(fishId, out var fish)) + { + _cache.Remove(killedKey); + return false; + } + if (fish.IsKilled) + { + _cache.Remove(killedKey); + return false; + } + if (DateTime.UtcNow > fish.ExpireAt) + { + if (fish.FishType == (int)CommonDomain.Enum.FishTypeEnum.Boss鱼 || + fish.FishType == (int)CommonDomain.Enum.FishTypeEnum.特殊Boss || + fish.FishType == (int)CommonDomain.Enum.FishTypeEnum.特殊鱼) + { + if (DateTime.UtcNow > fish.ExpireAt.AddSeconds(ExpiredHitBufferSeconds)) + { + _cache.Remove(killedKey); + return false; + } + } + else + { + _cache.Remove(killedKey); + return false; + } + } + + fish.IsKilled = true; + state.FishCountByType.TryGetValue(fish.FishType, out var count); + if (count > 0) + state.FishCountByType[fish.FishType] = count - 1; + + if (!string.IsNullOrEmpty(fish.FishArrayNumber)) + DecrementArrayFishCount(state, fish.FishArrayNumber); + PersistActiveFishSnapshot(state); + return true; + } + } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + + int tickCount = 0; + + while (!stoppingToken.IsCancellationRequested) + { + try + { + Tick(); + tickCount++; + if (tickCount % 5 == 0) + SyncRoomSystemFactors(); + } + catch (Exception ex) + { + _logger.LogError(ex, "[FishSpawn] Tick 异常"); + } + + await Task.Delay(TickIntervalMs, stoppingToken); + } + + + } + + private void Tick() + { + var now = DateTime.UtcNow; + var expiredRoomIds = new List(); + + foreach (var kv in _roomStates) + { + var roomId = kv.Key; + var state = kv.Value; + + if (_cache.Exists(GetSpawnStopKey(roomId))) + { + + expiredRoomIds.Add(roomId); + continue; + } + + if (!RenewSpawnOwnership(roomId)) + { + _logger.LogError("[FishSpawn] 房间出鱼权已转移,停止本机出鱼 roomId={RoomId} instanceId={InstanceId}", roomId, _instanceId); + expiredRoomIds.Add(roomId); + continue; + } + + try + { + lock (state.Lock) + { + CleanupExpiredFishes(state, now); + SpawnFishBatch(state, now); + PersistActiveFishSnapshot(state); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "[FishSpawn] 房间出鱼失败 roomId={RoomId} activeCount={Count}", roomId, state.ActiveFishes.Count); + } + } + + foreach (var roomId in expiredRoomIds) + { + _roomStates.TryRemove(roomId, out _); + } + } + + private static string GetSpawnOwnerKey(string roomId) => $"{SpawnOwnerKeyPrefix}{roomId}"; + private static string GetActiveFishSnapshotKey(string roomId) => $"{ActiveFishSnapshotKeyPrefix}{roomId}"; + private static string GetFishKilledKey(string roomId, long fishId) => $"{FishKilledKeyPrefix}{roomId}:{fishId}"; + private static string GetSpawnStopKey(string roomId) => $"{SpawnStopKeyPrefix}{roomId}"; + private long NextFishId() => _cache.IncrBy(GlobalFishIdKey, 1); + + private void PersistActiveFishSnapshot(RoomFishState state) + { + var snapshot = state.ActiveFishes.Values + .Where(f => IsFishWithinHitWindow(f, DateTime.UtcNow) && !_cache.Exists(GetFishKilledKey(state.RoomId, f.FishId))) + .Select(f => new ActiveFish + { + FishId = f.FishId, + FishNumber = f.FishNumber, + FishType = f.FishType, + RouteId = f.RouteId, + FishArrayNumber = f.FishArrayNumber, + ArrayNumber = f.ArrayNumber, + CreatedAt = f.CreatedAt, + ExpireAt = f.ExpireAt, + IsKilled = f.IsKilled + }).ToList(); + _cache.Insert(GetActiveFishSnapshotKey(state.RoomId), snapshot, ActiveFishSnapshotSeconds); + } + + private static bool IsFishWithinHitWindow(ActiveFish fish, DateTime now) + { + if (fish == null || fish.IsKilled) + return false; + if (now <= fish.ExpireAt) + return true; + var buffered = fish.FishType == (int)CommonDomain.Enum.FishTypeEnum.Boss鱼 || + fish.FishType == (int)CommonDomain.Enum.FishTypeEnum.特殊Boss || + fish.FishType == (int)CommonDomain.Enum.FishTypeEnum.特殊鱼; + return buffered && now <= fish.ExpireAt.AddSeconds(ExpiredHitBufferSeconds); + } + + private bool TryClaimSpawnOwnership(string roomId) + { + var key = GetSpawnOwnerKey(roomId); + if (_cache.GetFullRedis().Add(key, _instanceId, SpawnOwnerLeaseSeconds)) + return true; + + var owner = _cache.Get(key); + if (string.IsNullOrWhiteSpace(owner)) + return _cache.GetFullRedis().Add(key, _instanceId, SpawnOwnerLeaseSeconds); + if (!string.Equals(owner, _instanceId, StringComparison.Ordinal)) + return false; + + return _cache.Insert(key, _instanceId, SpawnOwnerLeaseSeconds); + } + + private bool RenewSpawnOwnership(string roomId) + { + var key = GetSpawnOwnerKey(roomId); + var owner = _cache.Get(key); + if (string.IsNullOrWhiteSpace(owner)) + return _cache.GetFullRedis().Add(key, _instanceId, SpawnOwnerLeaseSeconds); + if (!string.Equals(owner, _instanceId, StringComparison.Ordinal)) + return false; + + return _cache.Insert(key, _instanceId, SpawnOwnerLeaseSeconds); + } + + private void ReleaseSpawnOwnership(string roomId) + { + var key = GetSpawnOwnerKey(roomId); + var owner = _cache.Get(key); + if (string.Equals(owner, _instanceId, StringComparison.Ordinal)) + _cache.Remove(key); + } + + private void SyncRoomSystemFactors() + { + try + { + var systemGold = _redisService.GetSystemGoldDay(); + var gameConfig = _redisService.GetGameConfig(); + if (gameConfig?.KillConfig == null) + return; + + var dayTarget = gameConfig.KillConfig.DaySystemGold; + var normFactor = gameConfig.KillConfig.NormalizationFactorSystem; + var minMod = gameConfig.KillConfig.MinSystemModifier; + var maxMod = gameConfig.KillConfig.MaxSystemModifier; + + double systemFactor = 1.0 + (systemGold - dayTarget) / (normFactor * 1.0); + systemFactor = Math.Clamp(systemFactor, minMod, maxMod); + + foreach (var kv in _roomStates) + { + var room = _redisService.GetGameRoom(kv.Key); + if (room == null) continue; + + double oldFactor = room.SystemFactor; + room.SystemFactor = systemFactor; + if (Math.Abs(systemFactor - oldFactor) >= SystemFactorChangeThreshold) + { + _redisService.SetGameRoom(room); + } + } + } + catch (Exception ex) + { + _logger.LogWarning(ex, "[FishSpawn] 同步系统因子异常"); + } + } + + private int CleanupExpiredFishes(RoomFishState state, DateTime now) + { + var expiredIds = new List(); + foreach (var kv in state.ActiveFishes) + { + var fish = kv.Value; + if (fish.IsKilled) + { + expiredIds.Add(kv.Key); + continue; + } + if (!_cache.Exists(GetFishKilledKey(state.RoomId, fish.FishId)) && now <= fish.ExpireAt) + continue; + + bool isBufferedType = fish.FishType == (int)CommonDomain.Enum.FishTypeEnum.Boss鱼 || + fish.FishType == (int)CommonDomain.Enum.FishTypeEnum.特殊Boss || + fish.FishType == (int)CommonDomain.Enum.FishTypeEnum.特殊鱼; + if (isBufferedType && !_cache.Exists(GetFishKilledKey(state.RoomId, fish.FishId)) && now <= fish.ExpireAt.AddSeconds(ExpiredHitBufferSeconds)) + continue; + + expiredIds.Add(kv.Key); + } + + foreach (var fishId in expiredIds) + { + if (state.ActiveFishes.Remove(fishId, out var fish)) + { + if (fish.IsKilled) + continue; + state.FishCountByType.TryGetValue(fish.FishType, out var count); + if (count > 0) + state.FishCountByType[fish.FishType] = count - 1; + + if (!string.IsNullOrEmpty(fish.FishArrayNumber)) + DecrementArrayFishCount(state, fish.FishArrayNumber); + } + } + + return expiredIds.Count; + } + + private void SpawnFishBatch(RoomFishState state, DateTime now) + { + var config = state.Config; + if (config == null || config.Probabilities == null) return; + + var random = new Random(); + var allSpawned = new List(); + bool isFirst = !state.IsFirstBatchSpawned; + + foreach (var prob in config.Probabilities) + { + if (prob == null) continue; + + var typeKey = prob.Type == 2 ? -1 : prob.FishType; + + if (!isFirst) + { + if (!state.NextSpawnByType.TryGetValue(typeKey, out var nextTime)) + nextTime = DateTime.MinValue; + if (now < nextTime) + continue; + } + + int currentCount; + if (prob.Type == 2) + currentCount = state.ActiveArrayFishCount.Count; + else + state.FishCountByType.TryGetValue(prob.FishType, out currentCount); + if (currentCount >= prob.MaxCountMax) continue; + + var remainingCapacity = Math.Max(0, prob.MaxCountMax - currentCount); + var configuredMin = isFirst ? prob.FirstFishCountMin : prob.CountMin; + var configuredMax = isFirst ? prob.FirstFishCountMax : prob.CountMax; + configuredMin = Math.Max(0, configuredMin); + configuredMax = Math.Max(configuredMin, configuredMax); + + var requiredForFieldMinimum = !isFirst && currentCount < prob.MaxCountMin + ? prob.MaxCountMin - currentCount + : 0; + var actualMin = Math.Max(configuredMin, requiredForFieldMinimum); + var actualMax = Math.Min(configuredMax, remainingCapacity); + + if (actualMin > actualMax && currentCount < prob.MaxCountMin) + { + actualMin = requiredForFieldMinimum; + actualMax = remainingCapacity; + } + + if (actualMin > actualMax) + { + var nextDelay = random.Next( + prob.TimeMin, + Math.Max(prob.TimeMin + 1, prob.TimeMax + 1)); + state.NextSpawnByType[typeKey] = now.AddSeconds(nextDelay); + continue; + } + + var spawnCount = random.Next( + actualMin, + Math.Max(actualMin + 1, actualMax + 1)); + + if (spawnCount <= 0) + { + if (!state.NextSpawnByType.ContainsKey(typeKey)) + { + var nextDelay = random.Next(prob.TimeMin, Math.Max(prob.TimeMin + 1, prob.TimeMax + 1)); + state.NextSpawnByType[typeKey] = now.AddSeconds(nextDelay); + } + continue; + } + + var spawned = SpawnFishOfType(state, config, prob, spawnCount, now, random, isFirst); + allSpawned.AddRange(spawned); + + var delay = random.Next(prob.TimeMin, Math.Max(prob.TimeMin + 1, prob.TimeMax + 1)); + state.NextSpawnByType[typeKey] = now.AddSeconds(delay); + } + + if (!state.IsFirstBatchSpawned) + state.IsFirstBatchSpawned = true; + + if (allSpawned.Count > 0) + { + var spawnType = isFirst ? "init" : "spawn"; + foreach (var spawnedFish in allSpawned.Where(f => + string.IsNullOrWhiteSpace(f.FishArrayNumber) && + (f.FishType == 2 || f.FishType == 5))) + { + var fishIds = spawnedFish.FishIds != null && spawnedFish.FishIds.Count > 0 + ? spawnedFish.FishIds + : new List { spawnedFish.FishId }; + var spawnTime = DateTimeOffset + .FromUnixTimeMilliseconds(spawnedFish.CreatedAtMs) + .ToLocalTime() + .ToString("yyyy-MM-dd HH:mm:ss.fff"); + + + } + + var payload = new + { + type = spawnType, + timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), + serverTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + fish = allSpawned.Select(s => new + { + fishId = s.FishId, + fishNumber = string.IsNullOrWhiteSpace(s.FishArrayNumber) ? s.FishNumber : string.Empty, + routeId = s.RouteId, + fishArrayNumber = s.FishArrayNumber ?? string.Empty, + fishIds = s.FishIds, + createdAt = s.CreatedAtMs, + createdTime = DateTimeOffset.FromUnixTimeMilliseconds(s.CreatedAtMs).ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss.fff"), + expireAt = s.ExpireAtMs, + expireTime = DateTimeOffset.FromUnixTimeMilliseconds(s.ExpireAtMs).ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss.fff"), + remainingSeconds = (int)Math.Max(0, (s.ExpireAtMs - new DateTimeOffset(now).ToUnixTimeMilliseconds()) / 1000) + }).ToList() + }; + + if (!isFirst) + _hubGame.SendGroup(state.RoomId, "OnFishSpawn", payload); + + if (isFirst) + { + var fishList = string.Join(", ", allSpawned.Select(s => + { + var created = DateTimeOffset.FromUnixTimeMilliseconds(s.CreatedAtMs).ToLocalTime().ToString("HH:mm:ss.fff"); + var expire = DateTimeOffset.FromUnixTimeMilliseconds(s.ExpireAtMs).ToLocalTime().ToString("HH:mm:ss.fff"); + return $"{s.FishNumber}(id={s.FishId},c={created},e={expire})"; + })); + + } + } + } + + private List SpawnFishOfType(RoomFishState state, FishSpawnLevelConfig config, + FishSpawnProbability prob, int spawnCount, DateTime now, Random random, bool isFirst) + { + var spawned = new List(); + + var activeRestrictedFish = new HashSet(); + foreach (var af in state.ActiveFishes.Values) + { + if (!af.IsKilled && af.ExpireAt > now && + (af.FishType == 2 || af.FishType == 3 || af.FishType == 4 || af.FishType == 5)) + { + activeRestrictedFish.Add(af.FishNumber); + } + } + + var batchRouteSet = new HashSet<(string FishNumber, int RouteId)>(); + + bool preferOdd = true; + + if (prob.Type == 1) + { + var candidates = config.Fishes + .Where(f => f.FishType == prob.FishType && f.FishWeight > 0) + .ToList(); + if (candidates.Count == 0) + { + + return spawned; + } + + var maxAttempts = Math.Max(20, spawnCount * 10); + for (int attempt = 0; spawned.Count < spawnCount && attempt < maxAttempts; attempt++) + { + var alternateBySide = prob.FishType == 2 || prob.FishType == 3 || prob.FishType == 4 || prob.FishType == 5; + var requestedOdd = alternateBySide + ? (prob.FishType == 3 ? state.PreferOddGoldenRoute : state.PreferOddRestrictedRoute) + : preferOdd; + var eligibleCandidates = alternateBySide + ? candidates.Where(f => HasRouteForSide(f, requestedOdd)).ToList() + : candidates; + if (eligibleCandidates.Count == 0) + { + + break; + } + + var fishCfg = PickFishByWeight(eligibleCandidates, random); + if (fishCfg == null) continue; + + if ((fishCfg.FishType == 2 || fishCfg.FishType == 3 || fishCfg.FishType == 4 || fishCfg.FishType == 5) && + activeRestrictedFish.Contains(fishCfg.FishNumber)) + continue; + + if ((fishCfg.FishType == 2 || fishCfg.FishType == 5) && + state.NextAllowedSpawnByFishNumber.TryGetValue(fishCfg.FishNumber, out var nextAllowedAt) && + now < nextAllowedAt) + continue; + + var fishId = NextFishId(); + var routeId = PickRoute(fishCfg, random, requestedOdd); + + if (alternateBySide && ((routeId & 1) == 1) != requestedOdd) + continue; + + if ((fishCfg.FishType == 2 || fishCfg.FishType == 3 || + fishCfg.FishType == 4 || fishCfg.FishType == 5) && + state.ActiveFishes.Values.Any(f => + !f.IsKilled && f.ExpireAt > now && + string.Equals(f.FishNumber, fishCfg.FishNumber, StringComparison.Ordinal))) + continue; + + var routeKey = (fishCfg.FishNumber, routeId); + if (!batchRouteSet.Add(routeKey)) + { + if (alternateBySide) + continue; + routeId = PickRoute(fishCfg, random, !requestedOdd); + routeKey = (fishCfg.FishNumber, routeId); + if (!batchRouteSet.Add(routeKey)) + continue; + } + + if (fishCfg.FishType == 2 || fishCfg.FishType == 3 || fishCfg.FishType == 4 || fishCfg.FishType == 5) + activeRestrictedFish.Add(fishCfg.FishNumber); + + if (alternateBySide) + { + var isLeft = (routeId & 1) == 1; + if (fishCfg.FishType == 3) + state.PreferOddGoldenRoute = !isLeft; + else + state.PreferOddRestrictedRoute = !isLeft; + + } + else + { + preferOdd = !preferOdd; + } + + var times = fishCfg.Times > 0 ? fishCfg.Times : 8; + + DateTime createdAt; + if (isFirst) + { + var pastOffset = times * (0.2 + random.NextDouble() * 0.6); + createdAt = now.AddSeconds(-pastOffset); + } + else + { + createdAt = now; + } + + var activeFish = new ActiveFish + { + FishId = fishId, + FishNumber = fishCfg.FishNumber, + FishType = fishCfg.FishType, + RouteId = routeId, + CreatedAt = createdAt, + ExpireAt = createdAt.AddSeconds(times), + IsKilled = false + }; + + state.ActiveFishes[fishId] = activeFish; + if (fishCfg.FishType == 2 || fishCfg.FishType == 5) + { + state.NextAllowedSpawnByFishNumber[fishCfg.FishNumber] = + activeFish.ExpireAt.AddSeconds(RestrictedFishRespawnBufferSeconds); + } + state.FishCountByType.TryGetValue(fishCfg.FishType, out var fc); + state.FishCountByType[fishCfg.FishType] = fc + 1; + + spawned.Add(new SpawnFishItem + { + FishId = fishId, + FishIds = new List { fishId }, + FishNumber = fishCfg.FishNumber, + FishType = fishCfg.FishType, + RouteId = routeId, + CreatedAtMs = new DateTimeOffset(createdAt).ToUnixTimeMilliseconds(), + ExpireAtMs = new DateTimeOffset(activeFish.ExpireAt).ToUnixTimeMilliseconds() + }); + } + } + else if (prob.Type == 2 && config.FishArrays != null) + { + var arrayCandidates = config.FishArrays + .Where(a => a != null) + .OrderBy(_ => random.Next()) + .OrderByDescending(a => + int.TryParse(a.ArrayNumber, out var number) && + ((number & 1) == (state.PreferOddArrayNumber ? 1 : 0))) + .ToList(); + + foreach (var arrayCfg in arrayCandidates) + { + if (!int.TryParse(arrayCfg.ArrayNumber, out var arrayRouteId)) + { + + continue; + } + + if (random.NextDouble() >= arrayCfg.GenerateFrequency) continue; + + if (!string.IsNullOrEmpty(arrayCfg.BossFishNumber) && + activeRestrictedFish.Contains(arrayCfg.BossFishNumber)) + continue; + + if (!string.IsNullOrEmpty(arrayCfg.BossFishNumber) && + state.NextAllowedSpawnByFishNumber.TryGetValue(arrayCfg.BossFishNumber, out var arrayBossNextAllowedAt) && + now < arrayBossNextAllowedAt) + continue; + + var arrayCreatedAt = isFirst + ? now.AddSeconds(-15 * (0.2 + random.NextDouble() * 0.6)) + : now; + var arrayExpireAt = arrayCreatedAt.AddSeconds(15); + + var arrayItem = new SpawnFishItem + { + RouteId = arrayRouteId, + FishArrayNumber = arrayCfg.FishArrayNumber, + FishNumber = arrayCfg.FishNumber, + BossFishNumber = arrayCfg.BossFishNumber, + FishCount = arrayCfg.FishCount, + BossCount = arrayCfg.BossCount, + CreatedAtMs = new DateTimeOffset(arrayCreatedAt).ToUnixTimeMilliseconds(), + ExpireAtMs = new DateTimeOffset(arrayExpireAt).ToUnixTimeMilliseconds() + }; + + var normalFishCount = Math.Max(0, arrayCfg.FishCount); + var configuredBossFishCount = Math.Max(0, arrayCfg.BossCount); + var bossFishCount = string.IsNullOrWhiteSpace(arrayCfg.BossFishNumber) + ? 0 + : Math.Min(1, configuredBossFishCount); + if (configuredBossFishCount > bossFishCount) + { + + } + var expectedFishIdCount = normalFishCount + bossFishCount; + if (expectedFishIdCount == 0) + { + + continue; + } + + for (int fi = 0; fi < normalFishCount; fi++) + { + var fishId = NextFishId(); + var routeId = PickRouteValue(random, 1, 9, preferOdd); + var activeFish = new ActiveFish + { + FishId = fishId, + FishNumber = arrayCfg.FishNumber, + FishType = (int)CommonDomain.Enum.FishTypeEnum.普通鱼, + RouteId = routeId, + FishArrayNumber = arrayCfg.FishArrayNumber, + ArrayNumber = arrayCfg.ArrayNumber, + CreatedAt = arrayCreatedAt, + ExpireAt = arrayExpireAt, + IsKilled = false + }; + state.ActiveFishes[fishId] = activeFish; + if (fi == 0) + arrayItem.FishId = fishId; + arrayItem.FishIds.Add(fishId); + preferOdd = !preferOdd; + } + + for (int bi = 0; bi < bossFishCount; bi++) + { + var routeId = PickRouteValue(random, 1, 9, preferOdd); + + if (!string.IsNullOrEmpty(arrayCfg.BossFishNumber)) + activeRestrictedFish.Add(arrayCfg.BossFishNumber); + + var fishId = NextFishId(); + var activeFish = new ActiveFish + { + FishId = fishId, + FishNumber = arrayCfg.BossFishNumber, + FishType = (int)CommonDomain.Enum.FishTypeEnum.Boss鱼, + RouteId = routeId, + FishArrayNumber = arrayCfg.FishArrayNumber, + ArrayNumber = arrayCfg.ArrayNumber, + CreatedAt = arrayCreatedAt, + ExpireAt = arrayExpireAt, + IsKilled = false + }; + state.ActiveFishes[fishId] = activeFish; + state.NextAllowedSpawnByFishNumber[arrayCfg.BossFishNumber] = + activeFish.ExpireAt.AddSeconds(RestrictedFishRespawnBufferSeconds); + arrayItem.FishIds.Add(fishId); + preferOdd = !preferOdd; + } + + if (arrayItem.FishIds.Count != expectedFishIdCount) + { + + continue; + } + + state.ActiveArrayFishCount[arrayCfg.FishArrayNumber] = arrayItem.FishIds.Count; + spawned.Add(arrayItem); + + var isLeft = (arrayRouteId & 1) == 1; + state.PreferOddArrayNumber = !isLeft; + + + break; + } + } + + return spawned; + } + + private static string GetSpawnLogTypeName(int fishType) + { + return fishType switch + { + 1 => "普通鱼", + 2 => "Boss鱼", + 3 => "黄金鱼", + 4 => "特殊鱼", + 5 => "特殊Boss", + _ => $"未知类型({fishType})" + }; + } + + private static string GetFishTypeName(int fishType) + { + return fishType switch + { + 1 => "普通鱼", + 2 => "Boss鱼", + 3 => "黄金鱼", + 4 => "特殊鱼", + 5 => "特殊Boss", + _ => $"未知鱼类({fishType})" + }; + } + + public void ExtendFishLifespan(string roomId, int extraSeconds) + { + if (!_roomStates.TryGetValue(roomId, out var state)) + return; + + lock (state.Lock) + { + int count = 0; + foreach (var fish in state.ActiveFishes.Values) + { + if (!fish.IsKilled) + { + fish.ExpireAt = fish.ExpireAt.AddSeconds(extraSeconds); + count++; + } + } + + PersistActiveFishSnapshot(state); + } + } + + private void DecrementArrayFishCount(RoomFishState state, string arrayNumber) + { + if (!state.ActiveArrayFishCount.TryGetValue(arrayNumber, out var remaining)) + return; + remaining--; + if (remaining <= 0) + state.ActiveArrayFishCount.Remove(arrayNumber); + else + state.ActiveArrayFishCount[arrayNumber] = remaining; + } + + private FishSpawnFish PickFishByWeight(List candidates, Random random) + { + var totalWeight = candidates.Sum(f => f.FishWeight); + if (totalWeight <= 0) return candidates[random.Next(candidates.Count)]; + + var roll = random.Next(0, totalWeight); + long cumulative = 0; + foreach (var fish in candidates) + { + cumulative += fish.FishWeight; + if (roll < cumulative) + return fish; + } + return candidates.Last(); + } + + private int PickRoute(FishSpawnFish fishCfg, Random random, bool? preferOdd = null) + { + var routes = fishCfg.PathList; + if (routes == null || routes.Count == 0) + return PickRouteValue(random, 1, 8, preferOdd); + + if (preferOdd.HasValue) + { + var filtered = routes.Where(r => (r & 1) == (preferOdd.Value ? 1 : 0)).ToList(); + if (filtered.Count > 0) + return filtered[random.Next(filtered.Count)]; + } + return routes[random.Next(routes.Count)]; + } + + private static bool HasRouteForSide(FishSpawnFish fishCfg, bool preferOdd) + { + var routes = fishCfg.PathList; + return routes == null || routes.Count == 0 || + routes.Any(routeId => ((routeId & 1) == 1) == preferOdd); + } + + private int PickRouteValue(Random random, int min, int max, bool? preferOdd) + { + var candidates = Enumerable.Range(min, max - min).ToList(); + if (preferOdd.HasValue) + { + var filtered = candidates.Where(r => (r & 1) == (preferOdd.Value ? 1 : 0)).ToList(); + if (filtered.Count > 0) + return filtered[random.Next(filtered.Count)]; + } + return candidates[random.Next(candidates.Count)]; + } + } + + + public class RoomFishState + { + public int GameType { get; set; } + + public string RoomId { get; set; } + + public int RoomLevel { get; set; } + + public FishSpawnLevelConfig Config { get; set; } + + public Dictionary NextSpawnByType { get; set; } = new Dictionary(); + + public Dictionary NextAllowedSpawnByFishNumber { get; set; } = new Dictionary(); + + public bool IsFirstBatchSpawned { get; set; } + + public Dictionary ActiveFishes { get; set; } = new Dictionary(); + + public Dictionary FishCountByType { get; set; } = new Dictionary(); + + public Dictionary ActiveArrayFishCount { get; set; } = new Dictionary(); + + public bool PreferOddArrayNumber { get; set; } = true; + + public bool PreferOddRestrictedRoute { get; set; } = true; + + public bool PreferOddGoldenRoute { get; set; } = true; + + public object Lock { get; set; } = new object(); + } + + public class ActiveFish + { + public long FishId { get; set; } + + public string FishNumber { get; set; } + + public int FishType { get; set; } + + public int RouteId { get; set; } + + public string FishArrayNumber { get; set; } + + public string ArrayNumber { get; set; } + + public int ClientRouteId => !string.IsNullOrWhiteSpace(FishArrayNumber) + && int.TryParse(ArrayNumber, out var arrayRouteId) + ? arrayRouteId + : RouteId; + + public DateTime CreatedAt { get; set; } + + public DateTime ExpireAt { get; set; } + + public bool IsKilled { get; set; } + } + + public class SpawnFishItem + { + public long FishId { get; set; } + + public string FishNumber { get; set; } + + public int FishType { get; set; } + + public int RouteId { get; set; } + + public string FishArrayNumber { get; set; } + + public string BossFishNumber { get; set; } + + public int FishCount { get; set; } + + public int BossCount { get; set; } + + public List FishIds { get; set; } = new List(); + + public long ExpireAtMs { get; set; } + + public long CreatedAtMs { get; set; } + } + +} diff --git a/FishGameSrc/FishGameService/Services/KillAnnouncePolicy.cs b/FishGameSrc/FishGameService/Services/KillAnnouncePolicy.cs new file mode 100644 index 0000000..c82bfb1 --- /dev/null +++ b/FishGameSrc/FishGameService/Services/KillAnnouncePolicy.cs @@ -0,0 +1,10 @@ +namespace FishGameService.Services; + +public static class KillAnnouncePolicy +{ + public static bool ShouldAnnounce(long gold, long configuredMinGold) + { + var minGold = configuredMinGold > 0 ? configuredMinGold : 10_000_000L; + return gold >= minGold; + } +} diff --git a/FishGameSrc/FishGameService/Services/RobotKillAnnounceService.cs b/FishGameSrc/FishGameService/Services/RobotKillAnnounceService.cs new file mode 100644 index 0000000..6e927c6 --- /dev/null +++ b/FishGameSrc/FishGameService/Services/RobotKillAnnounceService.cs @@ -0,0 +1,138 @@ +using CommonDomain; +using DotNetCore.CAP; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using MongoRepository; +using RedisService; + +namespace FishGameService.Services; + +public class RobotKillAnnounceService : BackgroundService +{ + private readonly ILogger _logger; + private readonly IServiceScopeFactory _scopeFactory; + private readonly ICapPublisher _capPublisher; + private static readonly Random _random = new(); + private const int MinimumAnnounceIntervalSeconds = 30; + private static readonly TimeSpan BotProfileCacheDuration = TimeSpan.FromMinutes(5); + private List _botProfiles = new(); + private DateTime _botProfilesLastFetch = DateTime.MinValue; + private string? _lastConfigState; + private DateTime _lastConfigLogUtc = DateTime.MinValue; + + public RobotKillAnnounceService( + ILogger logger, + IServiceScopeFactory scopeFactory, + ICapPublisher capPublisher) + { + _logger = logger; + _scopeFactory = scopeFactory; + _capPublisher = capPublisher; + } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + var instanceId = Environment.GetEnvironmentVariable("INSTANCE_ID"); + if (!string.IsNullOrWhiteSpace(instanceId) && instanceId != "1" && instanceId != "default") + { + + return; + } + + await Task.Delay(TimeSpan.FromSeconds(10), stoppingToken); + + while (!stoppingToken.IsCancellationRequested) + { + try + { + using var scope = _scopeFactory.CreateScope(); + var redisService = scope.ServiceProvider.GetRequiredService(); + var botRepo = scope.ServiceProvider.GetRequiredService>(); + + var gameConfig = redisService.GetGameConfig(); + var cfg = gameConfig?.RobotKillConfig; + var configState = cfg == null ? "Missing" : !cfg.IsEnabled ? "Disabled" : cfg.Scenes == null || cfg.Scenes.Count == 0 ? "NoScenes" : "Enabled"; + if (configState != _lastConfigState || DateTime.UtcNow - _lastConfigLogUtc >= TimeSpan.FromMinutes(5)) + { + + _lastConfigState = configState; + _lastConfigLogUtc = DateTime.UtcNow; + } + + if (cfg != null && cfg.IsEnabled && cfg.Scenes != null && cfg.Scenes.Count > 0) + { + var scene = PickSceneByWeight(cfg.Scenes); + if (scene != null) + { + var botProfiles = await GetBotProfilesAsync(botRepo); + var multiplier = scene.MultiplierMin >= scene.MultiplierMax + ? scene.MultiplierMin + : _random.Next(scene.MultiplierMin, scene.MultiplierMax + 1); + var jackpot = scene.JackpotMin >= scene.JackpotMax + ? scene.JackpotMin + : _random.NextInt64(scene.JackpotMin, scene.JackpotMax + 1); + var botName = GenerateBotName(botProfiles); + + if (KillAnnouncePolicy.ShouldAnnounce(jackpot, gameConfig?.KillConfig?.GlobalAnnounceMinGold ?? 0)) + { + _capPublisher.Publish(TopicKeys.全局击杀公告, new KillAnnounceParam + { + UserName = botName, + GameTypeName = scene.GameName, + RoomName = scene.LevelName, + FishName = scene.FishName, + Multiple = multiplier, + Gold = jackpot, + Timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds() + }); + } + } + } + + var configuredInterval = cfg?.IntervalSeconds > 0 ? cfg.IntervalSeconds : MinimumAnnounceIntervalSeconds; + var interval = Math.Max(configuredInterval, MinimumAnnounceIntervalSeconds) * 1000; + await Task.Delay(interval, stoppingToken); + } + catch (OperationCanceledException) { break; } + catch (Exception ex) + { + _logger.LogError(ex, "RobotKillAnnounceService 执行异常"); + await Task.Delay(5000, stoppingToken); + } + } + } + + private async Task> GetBotProfilesAsync(IMongoBaseRepository botRepo) + { + var now = DateTime.UtcNow; + if (_botProfiles.Count > 0 && now - _botProfilesLastFetch < BotProfileCacheDuration) + return _botProfiles; + + var profiles = await botRepo.FilterByAsync(b => true) ?? new List(); + _botProfiles = profiles; + _botProfilesLastFetch = now; + return _botProfiles; + } + + private RobotKillScene? PickSceneByWeight(List scenes) + { + var totalWeight = scenes.Sum(s => s.Weight); + if (totalWeight <= 0) return null; + var roll = _random.Next(totalWeight); + var accumulated = 0; + foreach (var scene in scenes) + { + accumulated += scene.Weight; + if (roll < accumulated) return scene; + } + return scenes.LastOrDefault(); + } + + private static string GenerateBotName(List? botProfiles) + { + if (botProfiles != null && botProfiles.Count > 0) + return botProfiles[_random.Next(botProfiles.Count)].Name; + return $"玩家{_random.Next(10000, 99999)}"; + } +} diff --git a/FishGameSrc/FishGameService/Subscribers/BackgroundAssetSubscriber.cs b/FishGameSrc/FishGameService/Subscribers/BackgroundAssetSubscriber.cs new file mode 100644 index 0000000..415c8ee --- /dev/null +++ b/FishGameSrc/FishGameService/Subscribers/BackgroundAssetSubscriber.cs @@ -0,0 +1,59 @@ +using Common.Redis; +using CommonDomain; +using DotNetCore.CAP; +using FishGameService.GameSend; +using Microsoft.Extensions.Logging; +using RedisHelper; +using RedisService; + +namespace FishGameService.Subscribers +{ + public class BackgroundAssetSubscriber : ICapSubscribe + { + private readonly IRedisService _redisService; + private readonly IFishingSendService _sendResult; + private readonly IDistributedLock _distributedLock; + + public BackgroundAssetSubscriber( + IRedisService redisService, + IFishingSendService sendResult, + IDistributedLock distributedLock) + { + _redisService = redisService; + _sendResult = sendResult; + _distributedLock = distributedLock; + } + + [CapSubscribe("BackgroundOperation.NotifyUser")] + public Task HandleNotify(BackgroundOperationNotifyMessage message) + { + if (string.IsNullOrWhiteSpace(message.UserId) || message.CurrencyType != 1 || message.Amount <= 0) + return Task.CompletedTask; + + var session = _redisService.GetRedisUserCId(message.UserId); + if (string.IsNullOrWhiteSpace(session?.RoomId) || string.IsNullOrWhiteSpace(session.CId)) + return Task.CompletedTask; + + var lockKey = $"{RedisKey.DistributedLockPrefix}fish:gold:{session.RoomId}:{message.UserId}"; + _ = _distributedLock.TryExecuteAsync(lockKey, () => + { + var room = _redisService.GetGameRoom(session.RoomId); + var player = room?.Players?.FirstOrDefault(p => p.UserId == message.UserId && !p.IsBot); + if (room == null || player == null) + return Task.CompletedTask; + + var changeGold = message.ChangeType == 2 ? -message.Amount : message.Amount; + var beforeGold = player.Gold; + player.Gold = Math.Max(0L, checked(player.Gold + changeGold)); + if (player.Gold > player.MaxGold) player.MaxGold = player.Gold; + player.BeginCoin = Math.Max(0L, checked(player.BeginCoin + changeGold)); + _redisService.SetGameRoom(room); + _sendResult.SyncPlayerGold(session.CId, player.Gold); + + return Task.CompletedTask; + }, expiry: 10, retry: true, retryDelay: 100); + + return Task.CompletedTask; + } + } +} diff --git a/FishGameSrc/FishGameService/Subscribers/LoginBindSubscriber.cs b/FishGameSrc/FishGameService/Subscribers/LoginBindSubscriber.cs new file mode 100644 index 0000000..46c3a74 --- /dev/null +++ b/FishGameSrc/FishGameService/Subscribers/LoginBindSubscriber.cs @@ -0,0 +1,68 @@ +using CommonDomain; +using DotNetCore.CAP; +using Microsoft.Extensions.Logging; + +namespace FishGameService.Subscribers +{ + public class LoginBindSubscriber : ICapSubscribe + { + private readonly IPendingSettlementService _settlementService; + private readonly ICapPublisher _capPublisher; + private readonly ILogger _logger; + + public LoginBindSubscriber( + IPendingSettlementService settlementService, + ICapPublisher capPublisher, + ILogger logger) + { + _settlementService = settlementService; + _capPublisher = capPublisher; + _logger = logger; + } + + [CapSubscribe(TopicKeys.登录绑定)] + public async Task HandleLoginBind(LoginBindMessage msg) + { + try + { + var roomId = await _settlementService.SettleGoldAsync(msg.UserId); + + + if (!string.IsNullOrWhiteSpace(roomId)) + { + await _capPublisher.PublishAsync(TopicKeys.登录结果通知, new LoginBindResultMessage + { + UserId = msg.UserId, + RoomId = roomId, + OperationId = msg.OperationId, + Success = true + }); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "LoginBind 结算处理失败 userId={UserId}", msg.UserId); + await _capPublisher.PublishAsync(TopicKeys.登录结果通知, new LoginBindResultMessage + { + UserId = msg.UserId, + OperationId = msg.OperationId, + Success = false, + Error = ex.Message + }); + } + } + + [CapSubscribe(TopicKeys.拒绝回房)] + public async Task HandleDismissPendingRoom(LoginBindMessage msg) + { + try + { + await _settlementService.CleanupRoomAsync(msg.UserId, force: true); + } + catch (Exception ex) + { + _logger.LogError(ex, "DismissPendingRoom 处理失败 userId={UserId}", msg.UserId); + } + } + } +} diff --git a/FishGameSrc/FishGameService/Subscribers/PlayerFactorSubscriber.cs b/FishGameSrc/FishGameService/Subscribers/PlayerFactorSubscriber.cs new file mode 100644 index 0000000..4889221 --- /dev/null +++ b/FishGameSrc/FishGameService/Subscribers/PlayerFactorSubscriber.cs @@ -0,0 +1,93 @@ +using CommonDomain; +using DotNetCore.CAP; +using FishGameService.GameService; +using FishGameService.Services; +using Microsoft.Extensions.Logging; +using RedisService; +using UserService.User; + +namespace FishGameService.Subscribers +{ + public class PlayerFactorSubscriber : ICapSubscribe + { + private readonly FishSpawnConfigStore _fishSpawnConfigStore; + private readonly FishSpawnService _fishSpawnService; + private readonly IRedisService _redisService; + private readonly IUserService _userService; + private readonly ILogger _logger; + + public PlayerFactorSubscriber( + FishSpawnConfigStore fishSpawnConfigStore, + FishSpawnService fishSpawnService, + IRedisService redisService, + IUserService userService, + ILogger logger) + { + _fishSpawnConfigStore = fishSpawnConfigStore; + _fishSpawnService = fishSpawnService; + _redisService = redisService; + _userService = userService; + _logger = logger; + } + + [CapSubscribe(TopicKeys.因子变更)] + public async Task HandlePlayerFactorChanged(PlayerFactorChangedMessage msg) + { + var receivedAt = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + var deliveryDelay = msg.PublishedAtUnixMs > 0 ? receivedAt - msg.PublishedAtUnixMs : -1; + + try + { + var removedCount = FishingGameService.ClearPlayerFactorCache(msg.UserId); + var syncedRoom = false; + var session = _redisService.GetRedisUserCId(msg.UserId); + if (!string.IsNullOrWhiteSpace(session?.RoomId)) + { + var user = await _userService.GetUser(msg.UserId); + var room = _redisService.GetGameRoom(session.RoomId); + var player = room?.Players?.FirstOrDefault(p => p.UserId == msg.UserId); + if (user?.PlayerFactor != null && room != null && player != null) + { + player.PlayerFactor = user.PlayerFactor; + _redisService.SetPlayerFactor(room.RoomId, msg.UserId, user.PlayerFactor); + _redisService.SetGameRoom(room); + syncedRoom = true; + } + } + + + } + catch (Exception ex) + { + _logger.LogError(ex, "[FactorChange] 本地缓存刷新或生效失败 operationId={OperationId} userId={UserId} result=Failed", + msg.OperationId, msg.UserId); + throw; + } + } + + [CapSubscribe(TopicKeys.配置变更)] + public void HandleConfigChanged(ConfigChangedMessage msg) + { + var now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + var deliveryDelay = msg.PublishedAtUnixMs > 0 ? now - msg.PublishedAtUnixMs : -1; + + try + { + FishingGameService.ClearAllConfigCache(); + + _fishSpawnConfigStore.InvalidateAll(); + + _fishSpawnService.ReloadAllRoomConfigs(); + var effectiveAt = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + var elapsed = effectiveAt - now; + + } + catch (Exception ex) + { + _logger.LogError(ex, "[Config] 本地缓存刷新或配置生效失败 operationId={OperationId} ConfigType={ConfigType} result=Failed", + msg.OperationId, msg.ConfigType); + throw; + } + } + } +} diff --git a/FishGameSrc/FishGameService/Subscribers/TempSpawnFishSubscriber.cs b/FishGameSrc/FishGameService/Subscribers/TempSpawnFishSubscriber.cs new file mode 100644 index 0000000..8c81ae1 --- /dev/null +++ b/FishGameSrc/FishGameService/Subscribers/TempSpawnFishSubscriber.cs @@ -0,0 +1,66 @@ +using System; +using CommonDomain; +using DotNetCore.CAP; +using FishGameService.Services; +using Microsoft.Extensions.Logging; + +namespace FishGameService.Subscribers +{ + public class TempSpawnFishSubscriber : ICapSubscribe + { + private readonly FishSpawnService _fishSpawnService; + private readonly ILogger _logger; + + public TempSpawnFishSubscriber(FishSpawnService fishSpawnService, ILogger logger) + { + _fishSpawnService = fishSpawnService; + _logger = logger; + } + + [CapSubscribe(TopicKeys.临时强制出鱼)] + public void HandleTempSpawnFish(TempSpawnFishMessage msg) + { + var receivedAt = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + var deliveryDelay = msg.PublishedAtUnixMs > 0 ? receivedAt - msg.PublishedAtUnixMs : -1; + + try + { + var handled = _fishSpawnService.SpawnTemporaryFish(msg.RoomId, msg.FishNumber, msg.Count, msg.RouteId, msg.Seconds); + + } + catch (Exception ex) + { + _logger.LogError(ex, + "[TempSpawn] 执行失败 operationId={OperationId} roomId={RoomId} fishNumber={FishNumber} count={Count}", + msg.OperationId, msg.RoomId, msg.FishNumber, msg.Count); + throw; + } + } + + [CapSubscribe(TopicKeys.召唤卡出鱼)] + public void HandleSummonCardFish(SummonCardFishMessage msg) + { + var receivedAt = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + var deliveryDelay = msg.PublishedAtUnixMs > 0 ? receivedAt - msg.PublishedAtUnixMs : -1; + + try + { + var handled = _fishSpawnService.SpawnSummonCardFish( + msg.RoomId, msg.FishType, out var fishNumber, out var fishId); + if (handled) + { + _fishSpawnService.SendSummonCardFishNotice( + msg.RoomId, msg.UserId, msg.FishType, fishNumber, fishId); + } + + } + catch (Exception ex) + { + _logger.LogError(ex, + "[SummonCard] 召唤失败 operationId={OperationId} userId={UserId} roomId={RoomId} fishType={FishType}", + msg.OperationId, msg.UserId, msg.RoomId, msg.FishType); + throw; + } + } + } +} diff --git a/FishGameSrc/FishGameService/Utils/SignHelper.cs b/FishGameSrc/FishGameService/Utils/SignHelper.cs new file mode 100644 index 0000000..bb18dec --- /dev/null +++ b/FishGameSrc/FishGameService/Utils/SignHelper.cs @@ -0,0 +1,23 @@ +using System.Security.Cryptography; +using System.Text; + +namespace FishGameService.Utils +{ + public static class SignHelper + { + public static string Sign(string rawStr, string signKey) + { + var input = rawStr + "|" + signKey; + var hash = MD5.HashData(Encoding.UTF8.GetBytes(input)); + return Convert.ToHexString(hash).Substring(0, 8).ToLower(); + } + + public static bool Verify(string rawStr, string signKey, string expectedSign) + { + if (string.IsNullOrWhiteSpace(expectedSign)) + return false; + var computed = Sign(rawStr, signKey); + return computed == expectedSign; + } + } +} diff --git a/FishGameSrc/FishRoomHost/.dockerignore b/FishGameSrc/FishRoomHost/.dockerignore new file mode 100644 index 0000000..fe1152b --- /dev/null +++ b/FishGameSrc/FishRoomHost/.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/FishGameSrc/FishRoomHost/Config/system.json b/FishGameSrc/FishRoomHost/Config/system.json new file mode 100644 index 0000000..1c5837d --- /dev/null +++ b/FishGameSrc/FishRoomHost/Config/system.json @@ -0,0 +1,50 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "urls": "http://*:8004", + + + "AllowedHosts": "*", + "JwtConfig": { + "TokenKey": "token", + "Issuer": "admin", + "Audience": "", // "Audience": "", + "SecretKey": "henanhuashengchongwuyouxiangongsikejizhongxin", + "ValidateIssuer": false, + "ValidateAudience": false, + "ValidateIssuerSigningKey": false, + "ValidateLifetime": false + + }, + "ConnectionStrings": { + "PgSqlConnection": "host=localhost;database=data_0524;user id=data_0524;password=123456;" + }, + "CapConfig": { + "Host": "localhost", + "UserName": "admin", + "Password": "123456", + "VirtualHost": "/", + "PGLogHost": "host=localhost;database=data_0524;user id=data_0524;password=123456;" + }, + "RedisConfig": { + "Host": "localhost", + "Port": 6378, + "UserName": "", + "Password": "123456", + "Database": 2 + }, + "MongoDbSettings": { + "username": "root", + "password": "root23456", + "ServerUrl": "mongodb://localhost:27018/?authSource=admin" + }, + "WXConfig": { + "AppId": "wxceab9ce5b4474219", + "Secret": "5a291d7b295c76da579611da3f83e059", + "Url": "https://api.weixin.qq.com" + } +} diff --git a/FishGameSrc/FishRoomHost/Extension/CapExtension.cs b/FishGameSrc/FishRoomHost/Extension/CapExtension.cs new file mode 100644 index 0000000..4090980 --- /dev/null +++ b/FishGameSrc/FishRoomHost/Extension/CapExtension.cs @@ -0,0 +1,56 @@ +using DotNetCore.CAP.Messages; +using FishRoomService.MQ; + +namespace FishRoomHost.Extension +{ + public static class CapExtension + { + public static IServiceCollection AddCap(this IServiceCollection services, IConfiguration configuration) + { + services.AddCap(x => + { + x.UseDashboard(); + x.UseRabbitMQ(rb => + { + rb.HostName = configuration["CapConfig:Host"]; + rb.UserName = configuration["CapConfig:UserName"]; + rb.Password = configuration["CapConfig:Password"]; + rb.VirtualHost = configuration["CapConfig:VirtualHost"]; + rb.ExchangeName = "cap.exchange"; + }); + x.UsePostgreSql(op => + { + op.ConnectionString = configuration["CapConfig:PGLogHost"]; + op.Schema = "public"; + }); + + + + x.SucceedMessageExpiredAfter = 7 * 24 * 3600; + x.FailedRetryCount = 5; + x.FailedRetryInterval = 10; + x.FailedThresholdCallback = ObjFailedThresholdCallback; + + + }); + + + services.AddTransient(); + return services; + } + + private static async void ObjFailedThresholdCallback(FailedInfo failed) + { + var exception = failed.Message.Headers["cap-exception"] ?? string.Empty; + var name = failed.Message.GetName(); + if (failed.MessageType == MessageType.Publish) + { + + } + else + { + + } + } + } +} \ No newline at end of file diff --git a/FishGameSrc/FishRoomHost/FishRoomHost.csproj b/FishGameSrc/FishRoomHost/FishRoomHost.csproj new file mode 100644 index 0000000..c03b468 --- /dev/null +++ b/FishGameSrc/FishRoomHost/FishRoomHost.csproj @@ -0,0 +1,39 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + + + + + + + + + + + + + Always + + + Always + + + + diff --git a/FishGameSrc/FishRoomHost/Middleware/ApiLoggingMiddleware.cs b/FishGameSrc/FishRoomHost/Middleware/ApiLoggingMiddleware.cs new file mode 100644 index 0000000..32834f3 --- /dev/null +++ b/FishGameSrc/FishRoomHost/Middleware/ApiLoggingMiddleware.cs @@ -0,0 +1,169 @@ + +using System.Text; +using Common; +using CommonDomain; +using CommonService; +using Newtonsoft.Json; + +namespace FishRoomHost.Middleware +{ + public class ApiLoggingMiddleware + { + private readonly RequestDelegate _next; + private readonly ILogger _logger; + private readonly IApiLogService _apiLogService; + + public ApiLoggingMiddleware(RequestDelegate next, ILogger logger, IApiLogService apiLogService) + { + _next = next; + _logger = logger; + _apiLogService = apiLogService; + } + public async Task Invoke(HttpContext httpContext) + { + var request = httpContext.Request; + if (request.Path.StartsWithSegments(new PathString("/api")) && request.Method.ToLower() != "options") + { + var requestTime = DateTime.Now; + var requestBodyContent = string.Empty; + var originalRequest = httpContext.Response.Body; + if (request.Method == "POST") + { + request.EnableBuffering(); + requestBodyContent = await new StreamReader(request.Body).ReadToEndAsync(); + request.Body.Position = 0; + } + + try + { + using (var responseBody = new MemoryStream()) + { + var response = httpContext.Response; + response.Body = responseBody; + await _next(httpContext); + string responseBodyContent = null; + responseBodyContent = await FormatResponse(response); + await responseBody.CopyToAsync(originalRequest); + + string token = string.Empty, version = string.Empty, userAgent = string.Empty, source = string.Empty, deviceId = string.Empty, device = string.Empty, ip = string.Empty,sign=string.Empty; + if (httpContext.Request != null && httpContext.Request.Headers != null) + { + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Token"])) + { + token = httpContext.Request.Headers["Token"] + ""; } + + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Version"])) + { + version = httpContext.Request.Headers["Version"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["User-Agent"])) + { + userAgent = httpContext.Request.Headers["User-Agent"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Source"])) + { + source = httpContext.Request.Headers["Source"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["DeviceId"])) + { + deviceId = httpContext.Request.Headers["DeviceId"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Device"])) + { + device = httpContext.Request.Headers["Device"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Ip"])) + { + ip = httpContext.Request.Headers["Ip"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Sign"])) + { + sign = httpContext.Request.Headers["Sign"] + ""; + } + } + string allResponseContent = responseBodyContent; + try + { + if (!string.IsNullOrEmpty(responseBodyContent)) + { + BaseResponse baseResponse = JsonConvert.DeserializeObject>(responseBodyContent); + if (baseResponse != null && baseResponse.Data != null) + { + baseResponse.Data = null; + } + responseBodyContent = JsonConvert.SerializeObject(baseResponse); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "API响应日志脱敏序列化失败 path={Path}", request.Path); +} + var now = DateTime.Now; + var apilog = new ApiLog() + { + requestTime = now, + accessToken = token, + clientIP = httpContext.Connection.RemoteIpAddress.ToString(), + consumeTime = (DateTime.Now - requestTime).Milliseconds, + requestHead= JsonConvert.SerializeObject(httpContext.Request.Headers), + requestUrl = request.Path, + requestMethod = request.Method.ToLower(), + requestQuery = request.QueryString.ToString(), + requestBody = requestBodyContent, + httpStatus = httpContext.Response.StatusCode, + responseBody = responseBodyContent, + userAgent = userAgent, + device= device, + deviceId= deviceId, + ip=ip, + source=source, + version=version, + sign=sign + }; + await _apiLogService.InsertOneAsync(apilog); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "API日志记录失败 path={Path}", request.Path); + } + finally + { + httpContext.Response.Body = originalRequest; + } + } + else + { + await _next(httpContext); + } + } + private async Task FormatRequest(Microsoft.AspNetCore.Http.HttpRequest request) + { + var body = request.Body; + request.EnableBuffering(); + var buffer = new byte[Convert.ToInt32(request.ContentLength)]; + await request.Body.ReadAsync(buffer, 0, buffer.Length); + var bodyAsText = Encoding.UTF8.GetString(buffer); + request.Body = body; + return bodyAsText; + } + + private async Task FormatResponse(HttpResponse response) + { + response.Body.Seek(0, SeekOrigin.Begin); + string text = await new StreamReader(response.Body).ReadToEndAsync(); + response.Body.Seek(0, SeekOrigin.Begin); + //return $"{response.StatusCode}: {text}"; + return text; + } + } + + public static class ApiLoggingMiddlewareExtensions + { + public static IApplicationBuilder UseApiLogging(this IApplicationBuilder app) + { + return app.UseMiddleware(); + } + } +} + diff --git a/FishGameSrc/FishRoomHost/Middleware/AutofacModule.cs b/FishGameSrc/FishRoomHost/Middleware/AutofacModule.cs new file mode 100644 index 0000000..dd47bd5 --- /dev/null +++ b/FishGameSrc/FishRoomHost/Middleware/AutofacModule.cs @@ -0,0 +1,37 @@ + + +using Autofac; +using CommonService; +using FishRoomService.RoomService; +using MongoRepository; + +namespace FishRoomHost.Middleware +{ + public class AutofacModule : Module + { + protected override void Load(ContainerBuilder builder) + { + builder.RegisterGeneric(typeof(MongoBaseRepository<>)).As(typeof(IMongoBaseRepository<>)).InstancePerLifetimeScope(); + builder.RegisterGeneric(typeof(MongoBaseService<>)).As(typeof(IMongoBaseService<>)).InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterAssemblyTypes(typeof(ApiLogService).Assembly) + .Where(t => t.Name.EndsWith("Service")) + .AsImplementedInterfaces() + .InstancePerLifetimeScope(); + builder.RegisterAssemblyTypes(typeof(FishingRoomService).Assembly) + .Where(t => t.Name.EndsWith("Service")) + .AsImplementedInterfaces() + .InstancePerLifetimeScope(); + builder.RegisterAssemblyTypes(typeof(UserService.User.UserService).Assembly) + .Where(t => t.Name.EndsWith("Service")) + .AsImplementedInterfaces() + .InstancePerLifetimeScope(); + } + } + +} + diff --git a/FishGameSrc/FishRoomHost/Middleware/HubExceptionFilter.cs b/FishGameSrc/FishRoomHost/Middleware/HubExceptionFilter.cs new file mode 100644 index 0000000..a1487e5 --- /dev/null +++ b/FishGameSrc/FishRoomHost/Middleware/HubExceptionFilter.cs @@ -0,0 +1,29 @@ +using Microsoft.AspNetCore.SignalR; + +namespace FishRoomHost.Middleware +{ + public class HubExceptionFilter : IHubFilter + { + private readonly ILogger _logger; + + public HubExceptionFilter(ILogger logger) + { + _logger = logger; + } + + public async ValueTask InvokeMethodAsync( + HubInvocationContext invocationContext, + Func> next) + { + try + { + return await next(invocationContext); + } + catch (Exception e) + { + _logger.LogError(e, "Hub 调用异常: {Method}", invocationContext.HubMethodName); + return null; + } + } + } +} diff --git a/FishGameSrc/FishRoomHost/Middleware/MovementFilter.cs b/FishGameSrc/FishRoomHost/Middleware/MovementFilter.cs new file mode 100644 index 0000000..d45045d --- /dev/null +++ b/FishGameSrc/FishRoomHost/Middleware/MovementFilter.cs @@ -0,0 +1,65 @@ +using Common.Utils; +using Microsoft.AspNetCore.SignalR; +using System.Collections.Concurrent; + +namespace FishRoomHost.Middleware +{ + public class MovementFilter : IHubFilter + { + public async ValueTask InvokeMethodAsync( + HubInvocationContext context, + Func> next) + { + var arguments = context.HubMethodArguments; + { + + + //if (context.HubMethodName == "ChangeUserData" ) + //{ + // var obj = arguments[0].ToJson().ToObject(); + + // if (obj.Type == 8 || obj.Type == 6 || obj.Type == 7 || obj.Type == 4) + // { + // if (!RateLimiter.Allow(context.Context.ConnectionId)) + // { + // } + // } + //} + } + return await next(context); + } + } + + public static class RateLimiter + { + private static readonly ConcurrentDictionary _rates = new(); + + public static bool Allow(string connectionId) + { + var now = DateTime.UtcNow; + var rate = _rates.GetOrAdd(connectionId, id => new RateData()); + + if (rate.Tokens < 30) + { + rate.Tokens++; + rate.LastUpdate = now; + return true; + } + + if ((now - rate.LastUpdate).TotalMilliseconds > 33) + { + rate.Tokens = 1; + rate.LastUpdate = now; + return true; + } + + return false; + } + + private class RateData + { + public int Tokens { get; set; } = 30; + public DateTime LastUpdate { get; set; } = DateTime.UtcNow; + } + } +} diff --git a/FishGameSrc/FishRoomHost/Program.cs b/FishGameSrc/FishRoomHost/Program.cs new file mode 100644 index 0000000..7e91425 --- /dev/null +++ b/FishGameSrc/FishRoomHost/Program.cs @@ -0,0 +1,218 @@ +using Autofac; +using Autofac.Extensions.DependencyInjection; +using Common; +using Common.Request; +using CommonService; + +using FishRoomHost.Extension; +using FishRoomHost.Middleware; +using FishRoomService; +using FishRoomService.Hubs; +using FishRoomService.RoomService; +using JWTHelper; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Microsoft.Extensions.Options; +using MongoRepository.Config; +using NLog.Extensions.Logging; +using NLog.Web; +using RedisHelper; +using SharpAbp.Infrastructure.Api.Middleware; +using StackExchange.Redis; +using System.Text.Json; +using static Common.Utils.DateTimeTools; + +Environment.SetEnvironmentVariable("SERVICE_NAME", + Environment.GetEnvironmentVariable("SERVICE_NAME") + ?? System.Reflection.Assembly.GetEntryAssembly()?.GetName().Name + ?? "FishRoomHost"); +Environment.SetEnvironmentVariable("INSTANCE_ID", + Environment.GetEnvironmentVariable("INSTANCE_ID") ?? "default"); + +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. +string instanceId = Environment.GetEnvironmentVariable("INSTANCE_ID") ?? "Unknown"; + +builder.Services.AddSingleton(sp => new AppInstanceId { Id = instanceId }); +builder.Services.AddControllers(); +builder.Logging.AddNLog(); +builder.Host.UseNLog(); + +builder.Configuration.AddJsonFile(Path.Combine("Config", "system.json"), optional: true); +builder.Services.Configure(builder.Configuration.GetSection(nameof(MongoDbSettings))); +builder.Services.AddSingleton(sp => sp.GetRequiredService>().Value); + +string redisConn = builder.Configuration.GetConnectionString("Redis"); +if (string.IsNullOrWhiteSpace(redisConn)) +{ + var redisSection = builder.Configuration.GetSection("RedisConfig"); + var host = redisSection["Host"]; + var port = redisSection["Port"] ?? "6379"; + var password = redisSection["Password"]; + var database = redisSection["Database"] ?? "0"; + + if (string.IsNullOrWhiteSpace(host)) + { + throw new InvalidOperationException("未找到 Redis 配置:请在 ConnectionStrings:Redis 或 RedisConfig 节中配置 Redis 地址。"); + } + + redisConn = $"{host}:{port}"; + if (!string.IsNullOrEmpty(password)) + redisConn += $",password={password}"; + if (!string.IsNullOrEmpty(database)) + redisConn += $",defaultDatabase={database}"; +} + +builder.Services.AddSingleton(sp => +{ + return ConnectionMultiplexer.Connect(redisConn); +}); + +builder.Services.AddSignalR(hubOptions => +{ + hubOptions.MaximumReceiveMessageSize = 64 * 1024; + hubOptions.StreamBufferCapacity = 512; + hubOptions.ClientTimeoutInterval = TimeSpan.FromSeconds(60); + hubOptions.KeepAliveInterval = TimeSpan.FromSeconds(5); + + hubOptions.AddFilter(); + hubOptions.AddFilter(); +}) +.AddJsonProtocol(); + +builder.Services.Configure(x => +{ + x.MultipartBodyLengthLimit = 1024 * 1024 * 16; +}); + + +builder.Services.AddMemoryCache(); +builder.Services.AddControllers().AddJsonOptions(configure => +{ + configure.JsonSerializerOptions.Converters.Add(new DatetimeJsonConverter()); + +}); + + +builder.Services.AddSingleton(); +builder.Services.AddSingleton, HubSend>(); +builder.Services.AddSingleton(); +builder.Services.AddAutoMapper(typeof(AutoMapperConfig)); + +builder.Services.AddHealthChecks() + .AddCheck("self", () => HealthCheckResult.Healthy(), tags: new[] { "self" }); + + + + +builder.Services.AddCors(options => +{ + options.AddPolicy("Cors", policy => + { + policy + .SetIsOriginAllowed(_ => true) + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials(); + }); +}); + +#region jwt + +builder.Services.AddCustomJwt(builder.Configuration); + +#endregion + +#region redis + +builder.Services.AddRedisCacheSingleton(builder.Configuration); + +#endregion + +builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); +builder.Host.ConfigureContainer(builder => +{ + builder.RegisterModule(); +}); + +#region Cap + +builder.Services.AddCap(builder.Configuration); +#endregion + + + +var app = builder.Build(); + + + +// Configure the HTTP request pipeline. +if (app.Environment.IsDevelopment()) +{ + +} +app.UseApiLogging(); +app.UseRouting(); +app.UseGlobalExceptionHandler(); + + +app.UseStaticFiles(); +app.UseCors("Cors"); +app.UseAuthentication(); +app.UseAuthorization(); + +app.MapHub("/fishingroomhub", options => +{ + options.Transports = Microsoft.AspNetCore.Http.Connections.HttpTransportType.WebSockets; +}); + + +app.MapControllers(); + +app.MapHealthChecks("/health", new HealthCheckOptions +{ + Predicate = _ => true, + ResponseWriter = async (context, report) => + { + context.Response.ContentType = "application/json"; + var result = new + { + status = report.Status.ToString(), + checks = report.Entries.Select(e => new + { + name = e.Key, + status = e.Value.Status.ToString(), + description = e.Value.Description, + duration = e.Value.Duration.TotalMilliseconds + }), + totalDuration = report.TotalDuration.TotalMilliseconds + }; + await context.Response.WriteAsync(JsonSerializer.Serialize(result)); + } +}); + +using (var scope = app.Services.CreateScope()) +{ + var logger = scope.ServiceProvider.GetRequiredService>(); + try + { + var redis = scope.ServiceProvider.GetRequiredService(); + if (redis.GetGameRoomAllList()?.Any() != true) + { + var roomService = scope.ServiceProvider.GetRequiredService(); + await roomService.InitRoom(); + } + + } + catch (Exception ex) + { + logger.LogError(ex, "[Startup] 游戏房间初始化失败"); + throw; + } +} + +app.Run(); + diff --git a/FishGameSrc/FishRoomHost/Properties/launchSettings.json b/FishGameSrc/FishRoomHost/Properties/launchSettings.json new file mode 100644 index 0000000..c049921 --- /dev/null +++ b/FishGameSrc/FishRoomHost/Properties/launchSettings.json @@ -0,0 +1,22 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:6603", + "sslPort": 44370 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:8004", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/FishGameSrc/FishRoomHost/appsettings.Development.json b/FishGameSrc/FishRoomHost/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/FishGameSrc/FishRoomHost/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/FishGameSrc/FishRoomHost/appsettings.json b/FishGameSrc/FishRoomHost/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/FishGameSrc/FishRoomHost/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/FishGameSrc/FishRoomHost/docker-compose.yaml b/FishGameSrc/FishRoomHost/docker-compose.yaml new file mode 100644 index 0000000..af97809 --- /dev/null +++ b/FishGameSrc/FishRoomHost/docker-compose.yaml @@ -0,0 +1,8 @@ +name: webapi +services: + 0524fishroom: + image: 0524fishroom + container_name: '0524fishroom' + restart: always + ports: + - '5244:80' \ No newline at end of file diff --git a/FishRoomService/AutoMapperConfig.cs b/FishRoomService/AutoMapperConfig.cs new file mode 100644 index 0000000..3f241a1 --- /dev/null +++ b/FishRoomService/AutoMapperConfig.cs @@ -0,0 +1,20 @@ +using AutoMapper; +using CommonDomain.BaseModel; +using FishRoomService.RoomSend.Response; +using RedisService.Param; +using UserDomain.Entity; +using UserService.Param; +using UserService.Response; + +namespace FishRoomService +{ + public class AutoMapperConfig : Profile + { + public AutoMapperConfig() + { + + CreateMap(); + + } + } +} diff --git a/FishRoomService/FishRoomService.csproj b/FishRoomService/FishRoomService.csproj new file mode 100644 index 0000000..ba68996 --- /dev/null +++ b/FishRoomService/FishRoomService.csproj @@ -0,0 +1,21 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + + diff --git a/FishRoomService/Hubs/FishRoomHub.cs b/FishRoomService/Hubs/FishRoomHub.cs new file mode 100644 index 0000000..b36ae55 --- /dev/null +++ b/FishRoomService/Hubs/FishRoomHub.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CommonDomain.Enum; +using FishRoomService.RoomService; +using Microsoft.AspNetCore.SignalR; +using RedisService; + +namespace FishRoomService.Hubs +{ + public class FishRoomHub : Hub + { + private readonly IRedisService _redisService; + private readonly IFishingRoomService _fishingRoomService; + + public FishRoomHub(IRedisService redisService, IFishingRoomService fishingRoomService) + { + _redisService = redisService; + _fishingRoomService = fishingRoomService; + + } + + public override async Task OnConnectedAsync() + { + await base.OnConnectedAsync(); + } + + public override async Task OnDisconnectedAsync(Exception? exception) + { + await base.OnDisconnectedAsync(exception); + } + + + + public async Task GetRoomList(string userId, GameTypeEnum gameType, int roomLevel, int roomPartition) + { + string cid = Context.ConnectionId; + + await _fishingRoomService.GetRoomList(cid, userId, gameType, roomLevel, roomPartition); + + } + + public async Task GetRoomInfo(string roomId) + { + string cid = Context.ConnectionId; + var room = _redisService.GetGameRoom(roomId); + + await Clients.Caller.SendAsync("GetRoomInfoResult", room); + + } + } +} diff --git a/FishRoomService/MQ/IRoomMQService.cs b/FishRoomService/MQ/IRoomMQService.cs new file mode 100644 index 0000000..3325bc1 --- /dev/null +++ b/FishRoomService/MQ/IRoomMQService.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using RedisService.Param; + +namespace FishRoomService.MQ +{ + public interface IRoomMQService + { + Task RoomChange(RedisGameRoom room); + } +} diff --git a/FishRoomService/MQ/RoomMQService.cs b/FishRoomService/MQ/RoomMQService.cs new file mode 100644 index 0000000..f98fe15 --- /dev/null +++ b/FishRoomService/MQ/RoomMQService.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AutoMapper; +using Common.Utils; +using CommonDomain; +using CommonDomain.BaseModel; +using CommonService; +using DotNetCore.CAP; +using FishRoomService.Hubs; +using FishRoomService.RoomSend; +using Microsoft.Extensions.Logging; +using MongoRepository; +using RedisService.Param; +using RedisService; +using UserDomain.Entity; +using UserService; +using UserService.Param; +using UserService.User; + +namespace FishRoomService.MQ +{ + + public class RoomMQService : IRoomMQService, ICapSubscribe + { + private readonly IFishingRoomSendService _service; + private readonly IHubSend _hubSend; + private readonly IRedisService _redisService; + private readonly ILogger _logger; + + public RoomMQService(IFishingRoomSendService service, IHubSend hubSend, IRedisService redisService, ILogger logger) + { + _service = service; + _hubSend = hubSend; + _redisService = redisService; + _logger = logger; + } + + + + [CapSubscribe(TopicKeys.房间变化)] + public async Task RoomChange(RedisGameRoom room) + { + + _service.RoomChange(room); + + } + + [CapSubscribe(TopicKeys.用户资产同步前端)] + public async Task UserAssetSync(UserAssetSyncParam param) + { + try + { + var session = _redisService.GetRedisUserCId(param.UserId); + var cid = session?.FishRoomCId; + if (string.IsNullOrWhiteSpace(cid) && string.IsNullOrWhiteSpace(session?.RoomId)) + cid = session?.CId; + if (string.IsNullOrWhiteSpace(cid)) + return; + await _hubSend.SendUserCIdAsync(cid, "AssetUpdated", new + { + param.CurrencyType, + param.ChangeType, + param.Amount, + param.NewGold, + param.NewDiamond, + param.Source, + param.Remark + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "房间AssetUpdated推送失败 userId={UserId}", param?.UserId); + } + } + } +} diff --git a/FishRoomService/RoomSend/FishingRoomSendService.cs b/FishRoomService/RoomSend/FishingRoomSendService.cs new file mode 100644 index 0000000..e31405e --- /dev/null +++ b/FishRoomService/RoomSend/FishingRoomSendService.cs @@ -0,0 +1,38 @@ +using AutoMapper; +using CommonService; +using FishRoomService.Hubs; +using FishRoomService.RoomSend.Response; +using RedisService.Param; + +namespace FishRoomService.RoomSend +{ + public class FishingRoomSendService : IFishingRoomSendService + { + + public readonly IHubSend _roomSend; + public readonly IMapper _mapper; + + public FishingRoomSendService(IHubSend roomSend, IMapper mapper) + { + _roomSend = roomSend; + _mapper = mapper; + } + + public void GetRoomListResult(string cid, List rooms) + { + var list = _mapper.Map>(rooms); + + if (list != null) + list = list.OrderBy(c => c.RoomNumber).ToList(); + _roomSend.SendUserCId(cid, "GetRoomListResult", list); + } + + public void RoomChange(RedisGameRoom room) + { + string partition = $"{(int)room.GameType}{room.RoomLevel}{room.RoomPartition}"; + _roomSend.SendGroup(partition, "RoomChange", room); + } + + + } +} diff --git a/FishRoomService/RoomSend/IFishingRoomSendService.cs b/FishRoomService/RoomSend/IFishingRoomSendService.cs new file mode 100644 index 0000000..aefe7c7 --- /dev/null +++ b/FishRoomService/RoomSend/IFishingRoomSendService.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using RedisService.Param; + +namespace FishRoomService.RoomSend +{ + public interface IFishingRoomSendService + { + void GetRoomListResult(string cid, List rooms); + + void RoomChange(RedisGameRoom room); + } +} diff --git a/FishRoomService/RoomSend/Response/GameRoomReponse.cs b/FishRoomService/RoomSend/Response/GameRoomReponse.cs new file mode 100644 index 0000000..241b150 --- /dev/null +++ b/FishRoomService/RoomSend/Response/GameRoomReponse.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FishRoomService.RoomSend.Response +{ + public class GameRoomReponse + { + public string RoomId { get; set; } = string.Empty; + + public int MaxPlayerCount { get; set; } = 4; + + public int CurrentOnlinePlayerCount { get; set; } = 0; + + + public int RobotCount { get; set; } = 0; + + public int RoomNumber { get; set; } = 0; + } +} diff --git a/FishRoomService/RoomService/FishingRoomService.cs b/FishRoomService/RoomService/FishingRoomService.cs new file mode 100644 index 0000000..1a53a77 --- /dev/null +++ b/FishRoomService/RoomService/FishingRoomService.cs @@ -0,0 +1,185 @@ +using System.Collections.Concurrent; +using System.Text.Json; +using AutoMapper; +using CommonDomain.BaseModel; +using CommonDomain; +using CommonDomain.Enum; +using CommonService; +using DotNetCore.CAP; +using FishRoomService.Hubs; +using FishRoomService.RoomSend; +using MongoRepository; +using RedisHelper; +using RedisService; +using RedisService.Param; +using UserService.User; + +namespace FishRoomService.RoomService +{ + public class FishingRoomService : IFishingRoomService + { + + private readonly ICapPublisher _capPublisher; + private readonly IRedisService _redisService; + private readonly IHubSend _hubRoom; + private readonly IFishingRoomSendService _sendResult; + private GameConfig _gameConfig; + private readonly IUserService _userService; + private readonly IMapper _mapper; + private readonly IDistributedLock _distributedLock; + private readonly IMongoBaseRepository _botProfileRepo; + private readonly IMongoBaseRepository _emptyRoomRateRepo; + private List _initBotProfiles; + + + public FishingRoomService(ICapPublisher capPublisher, IRedisService redisService, IHubSend hubRoom, IFishingRoomSendService sendResult, IUserService userService, IMapper mapper, IDistributedLock distributedLock, IMongoBaseRepository botProfileRepo, IMongoBaseRepository emptyRoomRateRepo) + { + _capPublisher = capPublisher; + _redisService = redisService; + _hubRoom = hubRoom; + _sendResult = sendResult; + _userService = userService; + _botProfileRepo = botProfileRepo; + _emptyRoomRateRepo = emptyRoomRateRepo; + _gameConfig = redisService.GetGameConfig(); + if (_gameConfig == null) + { + var jsonPath = Path.Combine("Config", "gameconfig.json"); + if (File.Exists(jsonPath)) + { + var json = File.ReadAllText(jsonPath); + _gameConfig = JsonSerializer.Deserialize(json); + } + if (_gameConfig == null) + { + _gameConfig = new GameConfig { RoomConfigs = new List() }; + } + } + _mapper = mapper; + _distributedLock = distributedLock; + } + + + + + + public async Task GetRoomList(string cid, string userId, GameTypeEnum gameType, int roomLevel, int roomPartition) + { + string partition = $"{(int)gameType}{roomLevel}{roomPartition}"; + var userRedid = _redisService.GetRedisUserCId(userId); + if (userRedid != null) + { + if (!string.IsNullOrWhiteSpace(userRedid.PartitionId)) + _hubRoom.RemoveGroup(cid, userRedid.PartitionId); + userRedid.PartitionId = partition; + userRedid.FishRoomCId = cid; + if (string.IsNullOrWhiteSpace(userRedid.RoomId)) + userRedid.CId = cid; + } + else + { + userRedid = new RedisUserCid() { UserId = userId, PartitionId = partition, CId = cid, FishRoomCId = cid }; + } + + _redisService.SetRedisUserCId(userRedid); + + _hubRoom.AddGroup(cid, partition); + + var roomList = _redisService.GetGameRoomList(partition); + + if (roomList == null || roomList.Count() == 0) + { + await InitRoom(gameType, roomLevel, _gameConfig); + roomList = _redisService.GetGameRoomList(partition); + } + + _sendResult.GetRoomListResult(cid, roomList.ToList()); + + } + + + public async Task> InitRoom(GameTypeEnum gameType = GameTypeEnum.None, int roomLevel = 0, GameConfig gameConfig = null) + { + gameConfig ??= _gameConfig; + + List result = new List(); + gameConfig ??= _gameConfig; + + _initBotProfiles = RoomBotFactory.FixedBotSeatsEnabled + ? _botProfileRepo.FilterBy(p => true).ToList() + : null; + + var roomConfig = gameConfig?.RoomConfigs ?? new List(); + if (gameType != GameTypeEnum.None) + roomConfig = roomConfig.Where(c => c.GameType == gameType).ToList(); + if (roomLevel > 0) + roomConfig = roomConfig.Where(c => c.RoomLevel == roomLevel).ToList(); + if (roomConfig == null || roomConfig.Count() == 0) + return result; + + foreach (var item in roomConfig) + { + var rateConfig = _emptyRoomRateRepo + .FilterBy(c => c.GameType == item.GameType && c.RoomLevel == item.RoomLevel && !c.IsDelete) + .FirstOrDefault(); + var botsEnabled = gameConfig.BotConfig?.Enabled == true; + var emptyRate = botsEnabled ? Math.Clamp(rateConfig?.EmptyRoomRate ?? 0, 0, 100) : 100; + var totalRoomCount = item.RoomPartitionNum * item.RoomCount; + var roomsWithBots = emptyRate > 0 + ? (int)Math.Floor(totalRoomCount * (100 - emptyRate) / 100.0) + : totalRoomCount; + var botRoomIndexes = Enumerable.Range(0, totalRoomCount) + .OrderBy(_ => global::System.Random.Shared.Next()) + .Take(roomsWithBots) + .ToHashSet(); + + for (var i = 1; i <= item.RoomPartitionNum; i++) + { + _redisService.RemoveGameRoom($"{(int)item.GameType}{item.RoomLevel}{i}"); + + for (int c = 0; c < item.RoomCount; c++) + { + RedisGameRoom room = new RedisGameRoom() + { + RoomName = item.RoomName, + GameType = item.GameType, + RoomLevel = item.RoomLevel, + RoomPartition = i, + RoomNumber = c, + MaxPlayerCount = (item.GameType == GameTypeEnum.星际迷航 || item.GameType == GameTypeEnum.中国象棋) ? 2 : 4, + CurrentOnlinePlayerCount = 0, + + }; + var roomIndex = (i - 1) * item.RoomCount + c; + room.RobotCount = botsEnabled && botRoomIndexes.Contains(roomIndex) + ? global::System.Random.Shared.Next(1, room.MaxPlayerCount) + : 0; + room.RoomId = $"{(int)room.GameType}{room.RoomLevel}{room.RoomPartition}{c.ToString("00")}"; + + if (room.RobotCount > 0 && RoomBotFactory.FixedBotSeatsEnabled) + { + var fixedBots = RoomBotFactory.CreateFixedSeatBots(room, item, gameConfig, _initBotProfiles); + if (fixedBots.Count > 0) + { + room.Players.AddRange(fixedBots); + room.RobotCount = fixedBots.Count; + } + } + + result.Add(room); + } + } + } + foreach (var item in result) + { + _redisService.SetGameRoom(item); + } + + return result; + + } + + + + } +} diff --git a/FishRoomService/RoomService/IFishingRoomService.cs b/FishRoomService/RoomService/IFishingRoomService.cs new file mode 100644 index 0000000..501aa6f --- /dev/null +++ b/FishRoomService/RoomService/IFishingRoomService.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CommonDomain; +using CommonDomain.Enum; +using RedisService.Param; + +namespace FishRoomService.RoomService +{ + public interface IFishingRoomService + { + + + Task GetRoomList(string cid, string userId, GameTypeEnum gameType, int roomLevel, int roomPartition); + + + Task> InitRoom(GameTypeEnum gameType = GameTypeEnum.None, int roomLevel = 0, GameConfig gameConfig = null); + } +} diff --git a/Gateway/Config/system.json b/Gateway/Config/system.json new file mode 100644 index 0000000..4366c56 --- /dev/null +++ b/Gateway/Config/system.json @@ -0,0 +1,21 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "Ocelot": { + "Config": "ocelot.json" + }, + "AllowedHosts": "*", + + "RedisConfig": { + "Host": "localhost", + "Port": 6379, + "UserName": "", + "Password": "123456", + "Database": 1, + "ConnectionString": "localhost:6379,password=123456,defaultDatabase=2,abortConnect=false" + } +} diff --git a/Gateway/Gateway.csproj b/Gateway/Gateway.csproj new file mode 100644 index 0000000..7d1a5a6 --- /dev/null +++ b/Gateway/Gateway.csproj @@ -0,0 +1,38 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + Always + + + Always + + + + + + Always + + + Always + + + PreserveNewest + + + + diff --git a/Gateway/Program.cs b/Gateway/Program.cs new file mode 100644 index 0000000..ab2f537 --- /dev/null +++ b/Gateway/Program.cs @@ -0,0 +1,59 @@ + +using System.Net; +using Microsoft.AspNetCore.HttpOverrides; +using Ocelot.Cache.CacheManager; +using Ocelot.DependencyInjection; +using Ocelot.Middleware; +using Ocelot.Provider.Polly; + +var builder = WebApplication.CreateBuilder(args); + +// ============================================================================== +builder.Configuration.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true); + +builder.Configuration.AddJsonFile(Path.Combine("Config", "system.json"), optional: true); + +// ============================================================================== +builder.Services.AddOcelot(builder.Configuration) + .AddCacheManager(x => x.WithDictionaryHandle()) + .AddPolly(); + +// ============================================================================== +// ============================================================================== +builder.Services.AddHealthChecks(); + +// ============================================================================== +// ============================================================================== +builder.Services.Configure(options => +{ + options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; + + options.KnownProxies.Clear(); + options.KnownNetworks.Clear(); + + options.KnownProxies.Add(IPAddress.Parse("127.0.0.1")); + options.KnownProxies.Add(IPAddress.Parse("::1")); // IPv6 + + // options.KnownProxies.Add(IPAddress.Parse("172.17.0.1")); + // options.KnownProxies.Add(IPAddress.Parse("172.18.0.1")); + options.KnownProxies.Add(IPAddress.Parse("172.19.0.1")); + +}); + +// ============================================================================== +// ============================================================================== +var app = builder.Build(); + +// ============================================================================== +// ============================================================================== +app.UseForwardedHeaders(); + +// ============================================================================== +// ============================================================================== +app.MapHealthChecks("/health"); + +// ============================================================================== +// ============================================================================== +await app.UseOcelot(); + +app.Run(); \ No newline at end of file diff --git a/Gateway/Properties/launchSettings.json b/Gateway/Properties/launchSettings.json new file mode 100644 index 0000000..9ea9276 --- /dev/null +++ b/Gateway/Properties/launchSettings.json @@ -0,0 +1,12 @@ +{ + "profiles": { + "Gateway": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:28831;http://localhost:28832" + } + } +} \ No newline at end of file diff --git a/Gateway/appsettings.json b/Gateway/appsettings.json new file mode 100644 index 0000000..ac64636 --- /dev/null +++ b/Gateway/appsettings.json @@ -0,0 +1,13 @@ +{ + "urls": "http://*:8001", + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "Ocelot": { + "Config": "ocelot.json" + } +} diff --git a/Gateway/docker-compose.yaml b/Gateway/docker-compose.yaml new file mode 100644 index 0000000..dd38a27 --- /dev/null +++ b/Gateway/docker-compose.yaml @@ -0,0 +1,8 @@ +name: webapi +services: + 0524gateway: + image: 0524gateway + container_name: '0524gateway' + restart: always + ports: + - '8001:80' diff --git a/Gateway/ocelot.json b/Gateway/ocelot.json new file mode 100644 index 0000000..a31c68c --- /dev/null +++ b/Gateway/ocelot.json @@ -0,0 +1,88 @@ +{ + "Routes": [ + { + "DownstreamPathTemplate": "/loginhub/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { "Host": "localhost", "Port": 5245 } + ], + "UpstreamPathTemplate": "/loginhub/{everything}", + "UpstreamHttpMethod": [ "Get", "POST", "PUT", "DELETE", "OPTIONS" ] + }, + { + "DownstreamPathTemplate": "/customerHub/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { "Host": "localhost", "Port": 5247 } + ], + "UpstreamPathTemplate": "/customerHub/{everything}", + "UpstreamHttpMethod": [ "Get", "POST", "PUT", "DELETE", "OPTIONS" ] + }, + { + "DownstreamPathTemplate": "/chessgamehub/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { "Host": "localhost", "Port": 5242 } + ], + "UpstreamPathTemplate": "/chessgamehub/{everything}", + "UpstreamHttpMethod": [ "Get", "POST", "PUT", "DELETE", "OPTIONS" ] + }, + { + "DownstreamPathTemplate": "/fishingroomhub/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { "Host": "localhost", "Port": 5244 } + ], + "UpstreamPathTemplate": "/fishingroomhub/{everything}", + "UpstreamHttpMethod": [ "Get", "POST", "PUT", "DELETE", "OPTIONS" ] + }, + { + "DownstreamPathTemplate": "/fishinghub/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { "Host": "localhost", "Port": 5248 } + ], + "UpstreamPathTemplate": "/gamehub/{everything}", + "UpstreamHttpMethod": [ "Get", "POST", "PUT", "DELETE", "OPTIONS" ] + }, + { + "DownstreamPathTemplate": "/chess/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { "Host": "localhost", "Port": 5242 } + ], + "UpstreamPathTemplate": "/chess/{everything}", + "UpstreamHttpMethod": [ "Get", "POST", "PUT", "DELETE", "OPTIONS" ] + }, + { + "DownstreamPathTemplate": "/adminapi/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { "Host": "localhost", "Port": 5241 } + ], + "UpstreamPathTemplate": "/adminapi/{everything}", + "UpstreamHttpMethod": [ "Get", "POST", "PUT", "DELETE", "OPTIONS" ] + }, + { + "DownstreamPathTemplate": "/api/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { "Host": "localhost", "Port": 5245 } + ], + "UpstreamPathTemplate": "/api/{everything}", + "UpstreamHttpMethod": [ "Get", "POST", "PUT", "DELETE", "OPTIONS" ] + }, + { + "DownstreamPathTemplate": "/customerapi/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { "Host": "localhost", "Port": 5247 } + ], + "UpstreamPathTemplate": "/customerapi/{everything}", + "UpstreamHttpMethod": [ "Get", "POST", "PUT", "DELETE", "OPTIONS" ] + } + ], + "GlobalConfiguration": { + "BaseUrl": "http://localhost:8001" + } +} diff --git a/Infrastructure/Common/AppInstanceId.cs b/Infrastructure/Common/AppInstanceId.cs new file mode 100644 index 0000000..ba56fab --- /dev/null +++ b/Infrastructure/Common/AppInstanceId.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common +{ + public class AppInstanceId + { + public string Id { get; set; } + } +} diff --git a/Infrastructure/Common/BaseResponse.cs b/Infrastructure/Common/BaseResponse.cs new file mode 100644 index 0000000..8dd51c0 --- /dev/null +++ b/Infrastructure/Common/BaseResponse.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common +{ + public class BaseResponse : BaseCommonResponse + { + public T Data { get; set; } + } + + public class ListResponse : BaseCommonResponse + { + public IEnumerable Data { get; set; } + } + + public class PageResponse : BaseCommonResponse + { + public IEnumerable Data { get; set; } + public int Count { get; set; } + + } + + public class PageDataResponse : BaseCommonResponse + { + public int Count { get; set; } + public IEnumerable Data { get; set; } + } + + public class BaseCommonResponse + { + public CommonResponseCodeEnum Code { get; set; } + + public string Info { get; set; } + public BaseCommonResponse(CommonResponseCodeEnum code = CommonResponseCodeEnum.Success, string info = null) + { + Code = code; + Info = info; + } + + + } +} diff --git a/Infrastructure/Common/BlockWord/BlockWord.cs b/Infrastructure/Common/BlockWord/BlockWord.cs new file mode 100644 index 0000000..386efb0 --- /dev/null +++ b/Infrastructure/Common/BlockWord/BlockWord.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common.BlockWord +{ + public static class BlockWord + { + public const string BlockWordValue = @" +第一代领导,第二代领导,第三代领导,第四代领导,第五代领导,第六代领导,第七代领导,第1代领导,第2代领导,第3代领导,第4代领导,第5代领导,第6代领导,第7代领导,一位老同志的谈话,国办发,中办发,腐败中国,三个呆婊,你办事我放心,社会主义灭亡,打倒中国,灭亡中国,亡党亡国,粉碎四人帮,激流中国,特供,特贡,特共,zf大楼,殃视,贪污腐败,强制拆除,形式主义,政治风波,太子党,上海帮,北京帮,清华帮,红色贵族,权贵集团,河蟹社会,喝血社会,九风,9风,十七大,十7大,17da,九学,9学,四风,4风,双规,最淫官员,警匪,官匪,独夫民贼,官商勾结,城管暴力执法,强制捐款,毒豺,一党执政,一党专制,一党专政,专制政权,宪法法院,胡平,苏晓康,贺卫方,谭作人,焦国标,万润南,张志新,辛灝年,高勤荣,王炳章,高智晟,司马璐,刘晓竹,刘宾雁,魏京生,寻找林昭的灵魂,别梦成灰,谁是新中国,讨伐中宣部,异议人士,民运人士,启蒙派,选国家主席,民一主,min主,民竹,民珠,民猪,chinesedemocracy,大赦国际,国际特赦,da选,投公,公头,宪政,平反,党章,维权,昝爱宗,宪章,08宪,08xz,觉醒的中国公民日渐清楚地认识到,抿主,敏主,人拳,人木又,人quan,renquan,中国人权,中国的人权,中国新民党,群体事件,群体性事件,上中央,去中央,讨说法,请愿,请命,公开信,联名上书,万人大签名,万人骚动,截访,上访,shangfang,信访,访民,集会,组织集体,静坐,静zuo,jing坐,示威,示wei,游行,you行,油行,游xing,youxing,官逼民反,反party,反共,亢议,抵制,低制,底制,di制,抵zhi,dizhi,boycott,血书,焚烧中国国旗,baoluan,流血冲突,出现暴动,发生暴动,引起暴动,baodong,灭共,杀毙,罢工,霸工,罢考,罢餐,霸餐,罢参,罢饭,罢吃,罢食,罢课,罢ke,霸课,ba课,罢教,罢学,罢运,网特,网评员,网络评论员,五毛党,五毛们,5毛党,戒严,jieyan,jie严,戒yan,8的平方事件,知道64,八九年,贰拾年,2o年,20和谐年,贰拾周年,六四,六河蟹四,六百度四,六和谐四,陆四,陆肆,198964,5月35,89年春夏之交,64惨案,64时期,64运动,4事件,四事件,北京风波,学潮,学chao,xuechao,学百度潮,门安天,天按门,坦克压大学生,民主女神,历史的伤口,高自联,北高联,维多利亚公园,thegateofheavenlypeace,bloodisonthesquare,为了忘却的纪念,血洗京城,四二六社论,王丹,柴玲,沈彤,封从德,王超华,王维林,吾尔开希,吾尔开西,侯德健,阎明复,方励之,蒋捷连,丁子霖,辛灏年,蒋彦永,严家其,陈一咨,中华局域网,党的喉舌,互联网审查,当局严密封锁,新闻封锁,封锁消息,爱国者同盟,关闭所有论坛,网络封锁,金盾工程,gfw,无界浏览,无界网络,自由门,何清涟,中国的陷阱,汪兆钧,记者无疆界,境外媒体,维基百科,纽约时报,bbc中文网,华盛顿邮报,世界日报,东森新闻网,东森电视,基督教科学箴言报,星岛日报,亚洲周刊,泰晤士报,美联社,中央社,雅虎香港,wikipedia,youtube,googleblogger,美国之音,美国广播公司,英国金融时报,自由亚洲,中央日报,自由时报,中国时报,反分裂,威胁论,左翼联盟,钓鱼岛,保钓组织,主权,弓单,火乍,木仓,石肖,核蛋,步qiang,bao炸,爆zha,baozha,zha药,zha弹,炸dan,炸yao,zhadan,zhayao,hmtd,三硝基甲苯,六氟化铀,炸药配方,弹药配方,炸弹配方,皮箱炸弹,火药配方,人体炸弹,人肉炸弹,解放军,兵力部署,军转,军事社,8341部队,第21集团军,七大军区,7大军区,北京军区,沈阳军区,济南军区,成都军区,广州军区,南京军区,兰州军区,颜色革命,规模冲突,塔利班,基地组织,恐怖分子,恐怖份子,三股势力,印尼屠华,印尼事件,蒋公纪念歌,马英九,mayingjiu,李天羽,苏贞昌,林文漪,陈水扁,陈s扁,陈随便,阿扁,a扁,告全国同胞书,台百度湾,台完,台wan,,湾台,台湾国,台湾共和国,台军,台独,台毒,台du,taidu,twdl,支持台湾,光复民国,台湾独立,台湾问题,台海问题,台海危机,台海统一,台海大战,台海战争,台海局势,入联,入耳关,中华联邦,国民党,x民党,民进党,青天白日,闹独立,duli,fenlie,日本万岁,小泽一郎,劣等民族,汉人,汉维,维汉,维吾,吾尔,热比娅,伊力哈木,疆独,东突厥斯坦解放组织,东突解放组织,蒙古分裂分子,列确,阿旺晋美,藏人,臧人,zang人,藏民,藏m,达赖,赖达,dalai,哒赖,dl喇嘛,丹增嘉措,打砸抢,西独,藏独,葬独,臧独,藏毒,藏du,zangdu,支持zd,藏暴乱,藏青会,雪山狮子旗,拉萨,啦萨,啦沙,啦撒,拉sa,lasa,la萨,藏西,xizang,xi藏,x藏,西z,tibet,希葬,希藏,硒藏,稀藏,西脏,西奘,西葬,西臧,援藏,bjork,王千源,安拉,回教,回族,回回,回民,穆斯林,穆罕穆德,穆罕默德,默罕默德,伊斯兰,圣战组织,清真,清zhen,qingzhen,真主,阿拉伯,高丽棒子,韩国狗,满洲第三帝国,满狗,鞑子,胡的接班人,钦定接班人,习近平,平近习,xjp,习太子,习明泽,老习,温家宝,温加宝,温x,温jia宝,温宝宝,温加饱,温加保,张培莉,温云松,温如春,温jb,胡温,胡x,胡jt,胡boss,胡总,胡王八,hujintao,胡jintao,胡j涛,胡惊涛,胡景涛,胡紧掏,湖紧掏,胡紧套,锦涛,hjt,胡派,胡主席,刘永清,胡海峰,胡海清,江泽民,民泽江,江胡,江哥,江主席,江书记,江浙闽,江沢民,江浙民,择民,则民,茳泽民,zemin,ze民,老江,老j,江core,江x,江派,江zm,jzm,江戏子,江蛤蟆,江某某,江贼,江猪,江氏集团,江绵恒,江绵康,王冶坪,江泽慧,邓小平,平小邓,xiao平,邓xp,邓晓平,邓朴方,邓榕,邓质方,毛泽东,猫泽东,猫则东,chairmanmao,猫贼洞,毛zd,毛zx,z东,ze东,泽d,zedong,毛太祖,毛相,主席画像,改革历程,朱镕基,朱容基,朱镕鸡,朱容鸡,朱云来,李鹏,李peng,里鹏,李月月鸟,李小鹏,李小琳,华主席,华国,国锋,国峰,锋同志,白春礼,薄熙来,薄一波,蔡赴朝,蔡武,曹刚川,常万全,陈炳德,陈德铭,陈建国,陈良宇,陈绍基,陈同海,陈至立,戴秉国,丁一平,董建华,杜德印,杜世成,傅锐,郭伯雄,郭金龙,贺国强,胡春华,耀邦,华建敏,黄华华,黄丽满,黄兴国,回良玉,贾庆林,贾廷安,靖志远,李长春,李春城,李建国,李克强,李岚清,李沛瑶,李荣融,李瑞环,李铁映,李先念,李学举,李源潮,栗智,梁光烈,廖锡龙,林树森,林炎志,林左鸣,令计划,柳斌杰,刘奇葆,刘少奇,刘延东,刘云山,刘志军,龙新民,路甬祥,罗箭,吕祖善,马飚,马恺,孟建柱,欧广源,强卫,沈跃跃,宋平顺,粟戎生,苏树林,孙家正,铁凝,屠光绍,王东明,汪东兴,王鸿举,王沪宁,王乐泉,王洛林,王岐山,王胜俊,王太华,王学军,王兆国,王振华,吴邦国,吴定富,吴官正,无官正,吴胜利,吴仪,奚国华,习仲勋,徐才厚,许其亮,徐绍史,杨洁篪,叶剑英,由喜贵,于幼军,俞正声,袁纯清,曾培炎,曾庆红,曾宪梓,曾荫权,张德江,张定发,张高丽,张立昌,张荣坤,张志国,赵洪祝,紫阳,周生贤,周永康,朱海仑,政治局常委,中纪委,主席像,总书记,中南海,大陆当局,中国当局,北京当局,共产党,党产共,gcd,共贪党,gongchandang,阿共,共一产一党,产党共,公产党,工产党,共c党,共x党,共铲,供产,共惨,供铲党,供铲谠,供铲裆,共残党,共残主义,共产主义的幽灵,拱铲,老共,中共,中珙,中gong,gc党,贡挡,gong党,g产,狗产蛋,共残裆,恶党,邪党,共产专制,共产王朝,裆中央,土共,土g,共狗,g匪,共匪,仇共,communistparty,政府,症腐,政腐,政付,正府,政俯,政一府,政百度府,政f,zhengfu,政zhi,挡中央,档中央,中央领导,中国zf,中央zf,国wu院,中华帝国,gong和,大陆官方,北京政权,福音会,中国教徒,统一教,观音法门,清海无上师,盘古,李洪志,志洪李,李宏志,轮功,法轮,轮法功,三去车仑,氵去车仑,发论工,法x功,法o功,法0功,法一轮一功,轮子功,车仑工力,法lun,fa轮,法lg,flg,fl功,falungong,大法弟子,大纪元,dajiyuan,明慧网,明慧周报,正见网,新唐人,伪火,退党,tuidang,退dang,超越红墙,自fen,真善忍,九评,9评,9ping,九ping,jiuping,藏字石,集体自杀,自sha,zi杀,suicide,titor,逢8必灾,逢八必灾,逢9必乱,逢九必乱,朱瑟里诺,根达亚文明,诺查丹玛斯,人类灭亡进程表,按照马雅历法,推背图,推bei图,济世灵文,诸世纪,爱女人,爱液,按摩棒,拔出来,爆草,包二奶,暴干,暴奸,暴乳,爆乳,暴淫,屄,被操,被插,被干,逼奸,仓井空,插暴,操逼,操黑,操烂,肏你,肏死,操死,操我,厕奴,插比,插b,插逼,插进,插你,插我,插阴,潮吹,潮喷,成人电影,成人论坛,成人色情,成人网站,成人文学,成人小说,艳情小说,成人游戏,吃精,赤裸,抽插,扌由插,抽一插,春药,大波,大力抽送,大乳,荡妇,荡女,盗撮,多人轮,发浪,放尿,肥逼,粉穴,封面女郎,风月大陆,干死你,干穴,肛交,肛门,龟头,裹本,国产av,好嫩,豪乳,黑逼,后庭,后穴,虎骑,花花公子,换妻俱乐部,黄片,几吧,鸡吧,鸡巴,鸡奸,寂寞男,寂寞女,妓女,激情,集体淫,奸情,叫床,脚交,金鳞岂是池中物,金麟岂是池中物,精液,就去日,巨屌,菊花洞,菊门,巨奶,巨乳,菊穴,开苞,口爆,口活,口交,口射,口淫,裤袜,狂操,狂插,浪逼,浪妇,浪叫,浪女,狼友,聊性,流淫,铃木麻,凌辱,漏乳,露b,乱交,乱伦,轮暴,轮操,轮奸,裸陪,买春,美逼,美少妇,美乳,美腿,美穴,美幼,秘唇,迷奸,密穴,蜜穴,蜜液,摸奶,摸胸,母奸,奈美,奶子,男奴,内射,嫩逼,嫩女,嫩穴,捏弄,女优,炮友,砲友,喷精,屁眼,品香堂,前凸后翘,强jian,强暴,强奸处女,情趣用品,情色,拳交,全裸,群交,惹火身材,人妻,人兽,日逼,日烂,肉棒,肉逼,肉唇,肉洞,肉缝,肉棍,肉茎,肉具,揉乳,肉穴,肉欲,乳爆,乳房,乳沟,乳交,乳头,三级片,骚逼,骚比,骚女,骚水,骚穴,色逼,色界,色猫,色盟,色情网站,色区,色色,色诱,色欲,色b,少年阿宾,少修正,射爽,射颜,食精,释欲,兽奸,兽交,手淫,兽欲,熟妇,熟母,熟女,爽片,爽死我了,双臀,死逼,丝袜,丝诱,松岛枫,酥痒,汤加丽,套弄,体奸,体位,舔脚,舔阴,调教,偷欢,偷拍,推油,脱内裤,文做,我就色,无码,舞女,无修正,吸精,夏川纯,相奸,小逼,校鸡,小穴,小xue,性感妖娆,性感诱惑,性虎,性饥渴,性技巧,性交,性奴,性虐,性息,性欲,胸推,穴口,学生妹,穴图,亚情,颜射,阳具,杨思敏,要射了,夜勤病栋,一本道,一夜欢,一夜情,一ye情,阴部,淫虫,阴唇,淫荡,阴道,淫电影,阴阜,淫妇,淫河,阴核,阴户,淫贱,淫叫,淫教师,阴茎,阴精,淫浪,淫媚,淫糜,淫魔,淫母,淫女,淫虐,淫妻,淫情,淫色,淫声浪语,淫兽学园,淫书,淫术炼金士,淫水,淫娃,淫威,淫亵,淫样,淫液,淫照,阴b,应召,幼交,幼男,幼女,欲火,欲女,玉女心经,玉蒲团,玉乳,欲仙欲死,玉穴,援交,原味内衣,援助交际,张筱雨,招鸡,招妓,中年美妇,抓胸,自慰,作爱,18禁,99bb,a4u,a4y,adult,amateur,anal,a片,fuck,gay片,g点,g片,hardcore,h动画,h动漫,incest,porn,secom,sexinsex,sm女王,xiao77,xing伴侣,tokyohot,yin荡,汉芯造假,杨树宽,中印边界谈判结果,喂奶门,摸nai门,酒瓶门,脱裤门,75事件,乌鲁木齐,新疆骚乱,针刺,打针,食堂涨价,饭菜涨价,h1n1,瘟疫爆发,yangjia,y佳,yang佳,杨佳,杨j,袭警,杀警,武侯祠,川b26931,贺立旗,周正毅,px项目,骂四川,家l福,家le福,加了服,麦当劳被砸,豆腐渣,这不是天灾,龙小霞,震其国土,yuce,提前预测,地震预测,隐瞒地震,李四光预测,蟾蜍迁徙,地震来得更猛烈,八级地震毫无预报,踩踏事故,聂树斌,万里大造林,陈相贵,张丹红,尹方明,李树菲,王奉友,零八奥运艰,惨奥,奥晕,凹晕,懊运,懊孕,奥孕,奥你妈的运,反奥,628事件,weng安,wengan,翁安,瓮安事件,化工厂爆炸,讨回工资,专业代理,帮忙点一下,帮忙点下,请点击进入,详情请进入,私人侦探,私家侦探,针孔摄象,调查婚外情,信用卡提现,无抵押贷款,广告代理,原音铃声,借腹生子,代孕妈妈,代生孩子,代开发票,腾讯客服电话,销售热线,免费订购热线,低价出售,款到发货,回复可见,连锁加盟,加盟连锁,免费二级域名,免费索取,蚁力神,婴儿汤,售肾,刻章办,买小车,套牌车,玛雅网,电脑传讯,视频来源,下载速度,高清在线,全集在线,txt下载,六位qq,6位qq,位的qq,个qb,送qb,用刀横向切腹,完全自杀手册,四海帮,足球投注,地下钱庄,中国复兴党,阿波罗网,曾道人,六合彩,改卷内幕,替考试,隐形耳机,出售答案,考中答案,答an,da案,资金周转,救市,股市圈钱,崩盘,资金短缺,证监会,质押贷款,小额贷款,周小川,刘明康,尚福林,孔丹,安眠酮,代血浆,普萘洛尔,呋塞米,西布曲明,testosterone,胰岛素样生长因子,促红细胞生成素,地西泮,尼可刹米,甲睾酮,adrenaline,erythropoietin,地奈德,莫达非尼,氯噻嗪,苯巴比妥,促性腺激素,泼尼松,麻黄草,雄烯二醇,地塞米松,tamoxifen,strychnine,androst,新型毒品,杜冷丁,兴奋剂,mdma,海洛因,海luo因,heroin,diamorphine,diacetylmorphine,鸦片,阿芙蓉,咖啡因,cocain,三唑仑,美沙酮,麻古,k粉,凯他敏,ketamine,冰毒,苯丙胺,cannabis,大麻,爱他死,氯胺酮,benzodiazepines,甲基安非他明,安非他命,吗啡,morphine,摇头丸,迷药,乖乖粉,narcotic,麻醉药,精神药品,穴海,协警,纳米比亚,专业调查,有华龙,jq的来,电信路,第一夫人,党鞭,黄巨,荡尽天下,家元自称玉皇大帝,主席李世民,何祚庥,刘刚,不要沉默,后勤集团,食堂涨价,发国难财,浪漫邂逅,红满堂,张小洋,炸学校,子宫,叫晶晶的女孩,回派,社会黑暗,国之母,国母,国姆,东方微点,震惊全球,nowto,chengdu,徐明,六月飞雪,暴力虐待,暴力袭击,天府广场,粮荒,洗脑班,复制地址到地址栏,李愚蠢,中国猪,台湾猪,进化不完全的生命体,震死他们,贱人,装b,大sb,傻逼,傻b,煞逼,煞笔,刹笔,傻比,沙比,欠干,婊子养的,我日你,我操,我草,卧艹,卧槽,爆你菊,艹你,cao你,你他妈,真他妈,别他吗,草你吗,草你丫,操你妈,擦你妈,操你娘,操他妈,日你妈,干你妈,干你娘,娘西皮,狗操,狗草,狗杂种,狗日的,操你祖宗,操你全家,操你大爷,妈逼,你麻痹,麻痹的,妈了个逼,马勒,狗娘养,贱比,贱b,下贱,死全家,全家死光,全家不得好死,全家死绝,白痴,无耻,sb,杀b,你吗b,你妈的,婊子,贱货,混蛋,媚外,和弦,兼职,性伴侣,男公关,火辣,精子,射精,诱奸,强奸,做爱,性爱,发生关系,快感,处男,猛男,少妇,屌,下体,a片,内裤,浑圆,咪咪,刺激,白嫩,粉嫩,兽性,风骚,呻吟,sm,阉割,高潮,裸露,一丝不挂,脱光,干你,干死,我干,中日没有不友好的,木牛流马的污染比汽车飞机大,他们嫌我挡了城市的道路,当官靠后台,警察我们是为人民服务的,中石化说亏损,做人不能太cctv了,领导干部吃王八,工商税务两条狼,公检法是流氓,公安把秩序搞乱,剖腹一刀五千几,读不起选个学校三万起,父母下岗儿下地,裙中性运动,10八,香港总部,颠覆中国政权,烟草局,温总理,文革,文化部,文化大革命,文物局,文学城,自由亚州,自由运动,对日强硬,一部分人因年龄或健康原因将不得不退下去,一党专政,一党专制,一贯道,一国两制,国际法院,新疆独,新疆独立,找政府评理,贾庆,林黄菊,18大的人事,政变,政府,政局雾里看花,银行联合管理局,政权,正法,镇压,政治,中功,伊拉克,伊斯兰,伊斯兰运动,中共,一中一台,政治反对派,政治犯,政治风波,政治局十八,政治字眼(如两岸关系等),郑恩宠,蒋介石,中南海,中南海波澜起伏,中南海斗争,中南海高层权利斗争,中南海惊现东宫小朝廷,中南海秘闻,原子能机构,中共权斗,中共权利斗争,中南海权力斗争,中宣部,中央,治军方针定调,中央军委,中央派系斗争,中央团系,李三共志,国家安全,造反,李克强第五代领导人,李克强接班人,国家机密,国家主要部委,国军,国民党,胡紧掏,胡锦涛,胡锦滔,胡锦淘,胡景涛,国民根本大法,国庆,非典,东突厥斯坦伊斯兰运动,海关总署,国务院,国贼,海洋局,海外民运,国资委,封杀,东西南北论坛,分析,中共派系力量再达成妥协,反革命,反攻,反攻大陆,反共,反华,反恐委员会,反社会,游龙商务联盟,游戏管理员,反政府,反目,优化官员,应召,印章,反日,反人类,反腐败,反封锁,颠覆中华人民共和国政,东北独立,帝国之梦,帝国主义,弟大物勃,北京市亿霖,布局十八大,藏独,党政一把手,党中央,党风日下,邓小平,邓晓平,党禁,党退,布什,大纪元,测绘局,大陆当局,分裂,压迫,分裂中国,分裂中华人民共和国,第5代领导,第四代,多党,第五代领导,第五代领导人,第五代领导新星,第五代中共领导人,独裁,独裁政治,独夫,独立,动乱,北京,18大,1717wg.88448.com,北京当局,绑架,18da,暗杀,报警,北京政权,暴力,暴乱,暴政,爆炸,安理会,安全部,安全监管,安全局,保监会,保密室,西藏,西藏独,西藏独立,西藏天葬,西山会议,打压,爱滋,出卖,18届,18届常委,18届名单,18届委员,18届中央,18权力布局,18预测,爱国运动正名,爱国者同盟,18大的人事安排意见,18大人事变动,连战,两岸关系,两岸三地论坛,亡党,两个中国,两会,连准,秘书长,南联盟,内幕,深圳国领,深圳红岭,年轻高知团系接班,收货,收容所,示威,世华商务,事实独立,廉政大论坛,柳树中学,六四,卖国,卖国唐捷,人弹,人民报,人民报讯,天安门,天安门录影带,天安门母亲,天安门事件,天安门屠杀,天安门一代,末世论,人民大会堂,绵恒,绵恒异议人士,人民大众,人民大众时事参考,人民内情真相,人民日报,人民真实,人民真实报道,人民真实报告,人民之声,人民之声论坛,人权,人事变动,人事布局出手既稳又重,人事接班,人体炸弹,人员安排,人员变动,人质,六四民主运动,天府广场集会,通信维权,铁道部,统独,统计局,统战,美国参考,美国佬,美国之音,台*湾,台办,台独,台盟,台湾独,台湾独立,台湾共合国,台湾狗,台湾建国运动组织,台湾联盟,台湾青年独立联盟,台湾政论区,台湾自由联盟,摊牌要权,贪官,贪污犯,唐人电视台,讨伐,讨伐中宣部,缅甸,美利坚,权威主义国家的合法性理论,全国两会,蒙独,蒙古独,亲美,亲民党,亲日,青天白日旗,蒙古独立,六四事件,六四学生运动,领事馆,令狐计划,同胞书,令计划,透支,突厥斯坦,涂运普,屠杀,团派,团派政治明星,推翻,推翻社会主义制度,退党,外汇局,外交部,外交论坛,外交与方略,外蒙,外围,晚年周恩来,平反,迫害,罗蒙马格赛基金会,十大穷人,十六大,十八大,十八大权力变更,十八大人事,十八大人事安排意见,十八大人事调整,十八大未来,十八大预测,省市换班第五代冒起,省委大门集合,省政府大门集合,十八大政治局,萨达姆,萨拉托加,三个代表,如何推翻中共,瑞士金融大学,上访,上海帮,上海孤儿院,上海垮台,上海市劳动和社会保障局违规使用社保资金,社保基金会,社会主义,融资,审计署,生当作人杰之昨日重现,十八换血,十八届,十八年,商务部,商务领航,十八庆红,数据中国,刷卡,刷卡消费,双十节,刘奇葆热门人选,四川独,四川独立,出台,膏药旗,高层人事变动,加拿大皇家骑警,胡权利瓜分,胡书记,胡温,胡晓炼,胡耀邦,胡玉敏,胡泽君,胡振民,胡总书记,建国党,检查部,韩长赋,韩东方,韩联潮,韩正,韩正降职副市长,捍卫社会主义共和国,监管局,建设部,僵贼,僵贼民,姜春云,姜大明,姜洪禄,姜建清,姜伟新,姜异康,将则民,江Core,江core.江ze民,江澤民.江八,江八点.江独裁,江蛤蟆.江核心,江流氓,江戏子,江责民,江则民,江泽慧江泽林,江泽民.江贼,江贼民.江折民,江猪.江猪媳,江主,酱猪媳,抗日,抗议,教养院,教育部,老人政治,公证,公证处,共军,锦涛,共青团背景,共铲党,老江,联合行动,联大,联合国,联合起诉最高人民法院,老毛,老毛子,积克馆,共产,共产党,回民,回民暴,回民,暴动,换届隐忧,共党,大史,复转军人,公关,公馆,军长发威,军事委员会,军委,军委主席,军转安置,军转干部,公开批评中央高层领导人,公开信胡,公开信胡书记空中民主墙,鸡毛信文汇,恐怖份子,恐怖主义,纪元,公投,理想信念斗争,持不同政见,腐败,从陈良宇倒台看中国政局走势,周恩来后悔,周恩来自责,周刊纪事,周恩来忏悔,中央召开北戴河会议决定十八大高层人事,中国在统一问题上的投降主义,中国真实内容,子女任职名单,咨讯紫阳,中国政坛“清华帮”盛极而衰,中国政坛新星中的四大天王,中国政治新星,中国泛蓝联盟,中国复兴论坛,中国改革年代政治斗争,西藏论坛,中国高层权力斗争,中国高层人事变动解读,中国六四真相,中国论坛,中国媒体十大事件,中国民主党联合总部,中国社会的艾滋病,中国社会进步党,中国社会论坛,中国共产党,中国孤儿院,中国和平,中国太子,中共当局,中共独裁,中共反腐风暴大背景揭秘,中共高层变动:王兆国将任常委或取代贾庆龄,中共领导人黑幕,香港明报,星亚网络影视公司,中共十八布局,中共十八大的基层选举,中共十八大前夕,中共十八大前夕人事布局出手既稳又重,中共十八大热门人选,中共十八热门人选,中共十八人事,中共十八人事变动,中共十八人选,中国威胁论,中国问题论坛,中国移动,中国移动通信,中国银联,18大委员名单,大中国论坛,大中华论坛,18高官互调,4.25事件,钟山风雨论坛,重新评定,印尼伊斯兰祈祷团,中央政治局,中医药局,40万名车车主名单,信访局,信号,信息产业部,信用卡,信用卡空卡,信用危机,星相,版署,新生网,新势力,英雄纪念碑,九评共产党,新党,中华人民正邪,中华时事,燕南评论,央视内部晚会,中华养生益智功,中华真实报道,中华大地思考,宇明网,宇宙真理,中华大众,中华讲清,安南,东洲,北韩,鲜族,俄国,民告官,民国,民航局,民进党,民联,民意,民意论坛,民运,民阵,民政部,民猪,民主,民主潮,民主墙,民族矛盾,民族问题,诺贝尔和平奖,大法,大法弟子,dpp大法,falun,falu,发抡,发抡功,洗脑,下法轮,发轮,发伦,发伦功,发仑,发沦,发纶,发论,发论功,发论公,发正念,发囵,发愣,发瞟,罚抡,罚伦,罚仑,罚沦,罚纶,罚囵,筏抡,筏轮,筏伦,筏仑,筏沦,筏纶,筏论,筏囵,伐抡,伐轮,伐伦,伐仑,伐沦,伐论,伐囵,乏抡,乏轮,乏伦,乏仑,乏沦,乏纶,乏论,乏囵,阀抡,阀伦,阀仑,阀沦,阀纶,阀论,阀囵,法轮功,法*功,法.轮.功,法L功,法lun功,法功,法会,法抡,法抡功,法轮,法轮大法,法轮佛法,法轮功,法伦,法仑,法沦,法纶,法论,法十轮十功,法西斯,法院,法正,法谪,法谪功,法輪,法囵,法愣,珐.輪功,珐抡,珐轮,珐伦,珐仑,珐沦,五不,五不争鸣论坛,五出三进,五套功法,邝锦文,垡抡,垡轮,垡伦,垡仑,垡沦,垡纶,垡论,垡囵,茳澤民,荭志,闳志,闵维方,氵去,氵去车仑工力,转法轮,砝抡,砝轮,砝伦,砝仑,砝沦,砝纶,真、善、忍,真理教,真善美,真善忍,砝论,砝囵,泓志,屙民,珐纶,珐论,珐囵,falun,Falundafa,fa轮,Flg,弟子,地下教会,炼功,梦网洪志,轮大,抡功,轮功,伦功,摩门教,三水法轮,三唑仑,天皇,天怒,天葬,车臣,达赖,功法,讲法,基督,基督教,护法,回教,教徒,功友,大师,达赖喇嘛,虹志,鸿志,洪传,贯通两极法,光祖,洪吟,洪哲胜,洪志,宏法,观世音,宏志,弘志,古兰经,红志,车库,车仑,经文,东方红时空,风水宝地,舆论,舆论反制,风雨神州,自杀手册,自杀指南,自已的故事,自由民主论坛,自由网,自由写作奖,自制手枪,自主择业,宗教压迫,先天健康法,阻止中华人民共和国统,风雨神州论坛,东方时空,独立台湾会,访问链接,飞扬论坛,独立中文笔会,东南西北论谈,侦探设备,争鸣论坛,正帮通信公司,正见,正邪大决战,正义党论坛,北京之春民主论坛,北美讲坛,倒陈运动的最大受益人,反封锁技术,反腐败论坛,地下刊物,恶搞晚会,北美讲坛,北美论坛,地铁十号线塌方,逊克农场26队,春夏论坛,邓颖超日记,国研新闻邮件,国色天香网,春夏之交,春夏自由论坛,亚洲周刊,亚洲自由之声,博讯,邓小平和他的儿子,政坛两黑马,政坛明日之星,中國當局,中朝,中电信,中俄边界,中俄边界新约,中俄密约,致胡书记的公开信,指点江山论坛,北美自由论坛,参加者回忆录,大纪元新闻网,九-评,九.评,九、评,九—评,九成,九成新,九码,九评,新观察论坛,新华举报,新华内情,新华社,新华通论坛,大众真人真事,大家论坛,新唐人,新唐人电视台,新闻办,新闻封锁,新语丝,印尼伊斯兰祈祷团,北大三角,地论坛,9.635,9评,中华人民实话实说,杂志,E周刊,安装卫星电视,代表大会,论坛,南大论坛,南大自由论坛,强硬发言,南华早报,你说我说论坛,木子论坛,两会报道,两会新闻,轻舟快讯,热站政论网,时代论坛,时事参考,时事论坛,万维读者论坛,统独论坛,特讯,世界经济导报,世界通,超常科学,传说的胡曾联手是一种假象,大纪元,港澳办,跨世纪的良心犯,告全国股民同胞书,华岳,华岳时事论坛,华夏文摘快递,华语世界论坛,和平请愿书,华人媒体,华通时事论坛,华夏文摘,广闻,广东五元集团,广闻,红潮谎言录,告全体网民书,告中国人民解放军广大官兵书,港料,大史记,联总之声,集会,集体上访,霍英东临终遗言,大史纪,高校群体事件,传中共中央关于18大的人事安排意见,安眠酮,代血浆,普萘洛尔,呋塞米,西布曲明,testosterone,胰岛素样生长因子,促红细胞生成素,地西泮,尼可刹米,甲睾酮,adrenaline,erythropoietin,地奈德,莫达非尼,氯噻嗪,苯巴比妥,促性腺激素,泼尼松,麻黄草,雄烯二醇,地塞米松,tamoxifen,strychnine,androst,新型毒品,杜冷丁,兴奋剂,mdma,海洛因,海luo因,heroin,diamorphine,diacetylmorphine,鸦片,阿芙蓉,咖啡因,cocain,三唑仑,美沙酮,麻古,k粉,凯他敏,ketamine,冰毒,苯丙胺,cannabis,大麻,爱他死,氯胺酮,benzodiazepines,甲基安非他明,安非他命,吗啡,morphine,摇头丸,迷药,乖乖粉,narcotic,麻醉药,精神药品,爱女人,爱液,按摩棒,拔出来,爆草,包二奶,暴干,暴奸,暴乳,爆乳,暴淫,屄,被操,被插,被干,逼奸,仓井空,插暴,操逼,操黑,操烂,肏你,肏死,操死,操我,厕奴,插比,插b,插逼,插进,插你,插我,插阴,潮吹,潮喷,成人电影,成人论坛,成人色情,成人网站,成人文学,成人小说,艳情小说,成人游戏,吃精,赤裸,抽插,扌由插,抽一插,春药,大波,大力抽送,大乳,荡妇,荡女,盗撮,多人轮,发浪,放尿,肥逼,粉穴,封面女郎,风月大陆,干死你,干穴,肛交,肛门,龟头,裹本,国产av,好嫩,豪乳,黑逼,后庭,后穴,虎骑,花花公子,换妻俱乐部,黄片,几吧,鸡吧,鸡巴,鸡奸,寂寞男,寂寞女,妓女,激情,集体淫,奸情,叫床,脚交,金鳞岂是池中物,精液,就去日,巨屌,菊花洞,菊门,巨奶,巨乳,菊穴,开苞,口爆,口活,口交,口射,口淫,裤袜,狂操,狂插,浪逼,浪妇,浪叫,浪女,狼友,聊性,流淫,铃木麻,凌辱,漏乳,露b,乱交,乱伦,轮暴,轮操,轮奸,裸陪,买春,美逼,美少妇,美乳,美腿,美穴,美幼,秘唇,迷奸,密穴,蜜穴,蜜液,摸奶,摸胸,母奸,奈美,奶子,男奴,内射,嫩逼,嫩女,嫩穴,捏弄,女优,炮友,砲友,喷精,屁眼,品香堂,前凸后翘,强jian,强暴,强奸处女,情趣用品,情色,拳交,全裸,群交,惹火身材,人妻,人兽,日逼,日烂,肉棒,肉逼,肉唇,肉洞,肉缝,肉棍,肉茎,肉具,揉乳,肉穴,肉欲,乳爆,乳房,乳沟,乳交,乳头,三级片,骚逼,骚比,骚女,骚水,骚穴,色逼,色界,色猫,色盟,色情网站,色区,色色,色诱,色欲,色b,少年阿宾,少修正,射爽,射颜,食精,释欲,兽奸,兽交,手淫,兽欲,熟妇,熟母,熟女,爽片,爽死我了,双臀,死逼,丝袜,丝诱,松岛枫,酥痒,汤加丽,套弄,体奸,体位,舔脚,舔阴,调教,偷欢,偷拍,推油,脱内裤,文做,我就色,无码,舞女,无修正,吸精,夏川纯,相奸,小逼,校鸡,小穴,小xue,性感妖娆,性感诱惑,性虎,性饥渴,性技巧,性交,性奴,性虐,性息,性欲,胸推,穴口,学生妹,穴图,亚情,颜射,阳具,杨思敏,要射了,夜勤病栋,一本道,一夜欢,一夜情,一ye情,阴部,淫虫,阴唇,淫荡,阴道,淫电影,阴阜,淫妇,淫河,阴核,阴户,淫贱,淫叫,淫教师,阴茎,阴精,淫浪,淫媚,淫糜,淫魔,淫母,淫女,淫虐,淫妻,淫情,淫色,淫声浪语,淫兽学园,淫书,淫术炼金士,淫水,淫娃,淫威,淫亵,淫样,淫液,淫照,阴b,应召,幼交,幼男,幼女,欲火,欲女,玉女心经,玉蒲团,玉乳,欲仙欲死,玉穴,援交,原味内衣,援助交际,张筱雨,招鸡,招妓,中年美妇,抓胸,自慰,作爱,18禁,99bb,a4u,a4y,adult,amateur,anal,a片,fuck,gay片,g点,g片,hardcore,h动画,h动漫,incest,porn,secom,sexinsex,sm女王,xiao77,xing伴侣,tokyohot,yin荡,KC短信,KC嘉年华,广告,短信广告,短信平台,短信群发,小灵通,短信群发器,小6灵通,短信商务广告,段录定,无界浏览,无界浏览器,无界,无网界,无网界浏览,无帮国,KC提示,KC网站,电信,UP8新势力,动5感地带,白皮书,UP新势力,移3动,易达网络卡,安魂网,罢工,罢课,铃声下载,纽崔莱七折,手机复制,手机铃声,手机铃声下载,手机游戏,神7州行,网关,神通加持法,全1球通,如6意通,清仓,灵动卡,答案卫星接收机,打折机票,高薪养廉,考后付款,佳静安定片,航空售票,考前发放,成本价,诚信通手机商城,大2众卡,辅导,高利贷,联通贵宾卡,联4通,黑庄,黑马,黑手党,黑车,联通贵宾卡,联通商务通,联总,联总这声传单,联总之声传单,高息贷款,高干子弟,恭喜你的号码,恭喜您的号码,高干子女,各个银行全称,各种发票,高官,高官互调,高官子女,辅导班,复式,喝一送一,监听王,传:单,旦科,钓鱼岛,钓鱼台,当官靠后台,党校安插亲信,传九促三,客户端非法字符,刻章,大麻树脂,大麻油"; + + } +} diff --git a/Infrastructure/Common/BlockWord/BlockWordHelper.cs b/Infrastructure/Common/BlockWord/BlockWordHelper.cs new file mode 100644 index 0000000..dcc02f5 --- /dev/null +++ b/Infrastructure/Common/BlockWord/BlockWordHelper.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ToolGood.Words; + +namespace Common.BlockWord +{ + public static class BlockWordHelper + { + public static bool IsHaveBlockWord(string text) + { + if (string.IsNullOrWhiteSpace(text)) + return false; + StringSearch iwords = new StringSearch(); + iwords.SetKeywords(BlockWord.BlockWordValue.Split(',')); + return iwords.ContainsAny(text); + } + + public static string ReplaceBlockWord(string text, char replaceChar = '*') + { + StringSearch iwords = new StringSearch(); + iwords.SetKeywords(BlockWord.BlockWordValue.Split(',')); + return iwords.Replace(text, replaceChar); + } + public static List GetBlockWord(string text) + { + if (string.IsNullOrWhiteSpace(text)) + return null; + StringSearch iwords = new StringSearch(); + iwords.SetKeywords(BlockWord.BlockWordValue.Split(',')); + return iwords.FindAll(text); + } + } +} diff --git a/Infrastructure/Common/BusinessException.cs b/Infrastructure/Common/BusinessException.cs new file mode 100644 index 0000000..9c63569 --- /dev/null +++ b/Infrastructure/Common/BusinessException.cs @@ -0,0 +1,18 @@ +using System; + +namespace Common +{ + public class BusinessException : Exception + { + public int ErrorCode { get; } + + public BusinessException() : base("业务处理失败") { } + + public BusinessException(string message) : base(message) { } + + public BusinessException(string message, int errorCode) : base(message) + { + ErrorCode = errorCode; + } + } +} diff --git a/Infrastructure/Common/Common.csproj b/Infrastructure/Common/Common.csproj new file mode 100644 index 0000000..5600d83 --- /dev/null +++ b/Infrastructure/Common/Common.csproj @@ -0,0 +1,23 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + + + + diff --git a/Infrastructure/Common/CommonModel/BaseIdName.cs b/Infrastructure/Common/CommonModel/BaseIdName.cs new file mode 100644 index 0000000..ea8b5a4 --- /dev/null +++ b/Infrastructure/Common/CommonModel/BaseIdName.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common.CommonModel +{ + public class BaseIdName + { + /// + /// Id + /// + public string Id { get; set; } + public string Name { get; set; } + } +} diff --git a/Infrastructure/Common/CommonModel/BaseListPageParam.cs b/Infrastructure/Common/CommonModel/BaseListPageParam.cs new file mode 100644 index 0000000..1d1a697 --- /dev/null +++ b/Infrastructure/Common/CommonModel/BaseListPageParam.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common.CommonModel +{ + public class BaseListPageParam + { + private string _keyword = ""; + private int _page = 1; + private int _pageSize = 10; + public string KeyWord + { + get { return string.IsNullOrWhiteSpace(_keyword) ? "" : _keyword.Trim(); } + set { _keyword = string.IsNullOrWhiteSpace(value) ? "" : value.Trim(); } + } + + + public int? PageIndex + { + get { return _page <= 1 ? 1 : _page; } + set { _page = value ?? 0; } + } + + public int? PageSize + { + get { return _pageSize <= 1 ? 10 : _pageSize; } + set { _pageSize = value ?? 0; } + } + } +} diff --git a/Infrastructure/Common/Cors/CorsExtension.cs b/Infrastructure/Common/Cors/CorsExtension.cs new file mode 100644 index 0000000..d08d2b7 --- /dev/null +++ b/Infrastructure/Common/Cors/CorsExtension.cs @@ -0,0 +1,41 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common.Cors +{ + + public static class CorsExtension + { + public static IServiceCollection AddCustomCors(this IServiceCollection services) + { + services.AddCors(options => + { + options.AddPolicy("Cors", policy => + { + policy + + .SetIsOriginAllowed(_ => true) + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials() + ; + + + }); + }); + + return services; + } + + + public static void UseCustomCors(this IApplicationBuilder app) + { + app.UseCors("Cors"); + } + } +} diff --git a/Infrastructure/Common/LinqExtensions.cs b/Infrastructure/Common/LinqExtensions.cs new file mode 100644 index 0000000..27cfb7b --- /dev/null +++ b/Infrastructure/Common/LinqExtensions.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Threading.Tasks; + +namespace Common +{ + /// + /// Enables the efficient, dynamic composition of query predicates. + /// + public static class LinqExtensions + { + public static Expression Property(this Expression expression, string propertyName) + { + return Expression.Property(expression, propertyName); + } + + public static Expression AndAlso(this Expression left, Expression right) + { + return Expression.AndAlso(left, right); + } + public static Expression Call(this Expression instance, string methodName, params Expression[] arguments) + { + return Expression.Call(instance, instance.Type.GetMethod(methodName), arguments); + } + public static Expression GreaterThan(this Expression left, Expression right) + { + return Expression.GreaterThan(left, right); + } + public static Expression ToLambda(this Expression body, params ParameterExpression[] parameters) + { + return Expression.Lambda(body, parameters); + } + public static Expression> True() { return param => true; } + public static Expression> False() { return param => false; } + public static Expression> And(this Expression> first, Expression> second) + { + return first.Compose(second, Expression.AndAlso); + } + public static Expression> Or(this Expression> first, Expression> second) + { + return first.Compose(second, Expression.OrElse); + } + + /// + /// Combines the first expression with the second using the specified merge function. + /// + static Expression Compose(this Expression first, Expression second, Func merge) + { + var map = first.Parameters + .Select((f, i) => new { f, s = second.Parameters[i] }) + .ToDictionary(p => p.s, p => p.f); + var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body); + return Expression.Lambda(merge(first.Body, secondBody), first.Parameters); + } + + /// + /// ParameterRebinder + /// + private class ParameterRebinder : ExpressionVisitor + { + /// + /// The ParameterExpression map + /// + readonly Dictionary map; + /// + /// Initializes a new instance of the class. + /// + /// The map. + ParameterRebinder(Dictionary map) + { + this.map = map ?? new Dictionary(); + } + /// + /// Replaces the parameters. + /// + /// The map. + /// The exp. + /// Expression + public static Expression ReplaceParameters(Dictionary map, Expression exp) + { + return new ParameterRebinder(map).Visit(exp); + } + /// + /// Visits the parameter. + /// + /// The p. + /// Expression + protected override Expression VisitParameter(ParameterExpression p) + { + ParameterExpression replacement; + + if (map.TryGetValue(p, out replacement)) + { + p = replacement; + } + return base.VisitParameter(p); + } + } + } +} diff --git a/Infrastructure/Common/Redis/RedisKey.cs b/Infrastructure/Common/Redis/RedisKey.cs new file mode 100644 index 0000000..f79285e --- /dev/null +++ b/Infrastructure/Common/Redis/RedisKey.cs @@ -0,0 +1,55 @@ +using System; + +namespace Common.Redis +{ + public class RedisKey + { + public static string MatchingRoom => RedisKeyGenerator.GameKey("matching:room:level:{0}"); + + public static string UserCIDGID => RedisKeyGenerator.UserKey("uid:{0}"); + + public static string LoginCIDUser => RedisKeyGenerator.UserKey("cid:{0}"); + + public static string CIDUser => RedisKeyGenerator.UserKey("cid:{0}"); + + public static string VerificationCode => RedisKeyGenerator.UserKey("verification_code:{0}"); + + public static string ProductRedis => RedisKeyGenerator.UserKey("product:{0}"); + + public static string WeiXin_AccessToken => RedisKeyGenerator.CommonKey("wx_access_token"); + + public static string WeiXinUser_AccessToken => RedisKeyGenerator.CommonKey("wx_user_access_token:{0}"); + + public static string GameConfig => RedisKeyGenerator.GameKey("config"); + + public static string ActivityConfig => RedisKeyGenerator.GameKey("activity:config"); + + public static string TodayVisitsKey => RedisKeyGenerator.AdminKey("stats:visits:today"); + + public static string MonthVisitsKey => RedisKeyGenerator.AdminKey("stats:visits:month"); + + public static string TotalVisitsKey => RedisKeyGenerator.AdminKey("stats:visits:total"); + + public static string TotalTrafficKey => RedisKeyGenerator.AdminKey("stats:traffic:total"); + + public static string TodayTrafficKey => RedisKeyGenerator.AdminKey("stats:traffic:today"); + + public static string MonthTrafficKey => RedisKeyGenerator.AdminKey("stats:traffic:month"); + + public static string GameRoomIdKey => RedisKeyGenerator.GameKey("room:model:{0}_{1}"); + + public static string DistributedLockPrefix => RedisKeyGenerator.CommonKey("lock:"); + + public static string ChessRoomList => RedisKeyGenerator.GameKey("chess:room:list"); + + public static string ChessRoomKey => RedisKeyGenerator.GameKey("chess:room:{0}"); + + public static string SystemGoldDayKey => RedisKeyGenerator.GameKey("fish:gamestatic"); + + public static string CUSTOMER_ONLINE_KEY => RedisKeyGenerator.CustomerKey("online"); + + public static string FishingKillConfig => RedisKeyGenerator.GameKey("fishing:killconfig"); + + public static string FishSpawnConfig => RedisKeyGenerator.GameKey("fish:spawn:config:v1"); + } +} diff --git a/Infrastructure/Common/Redis/RedisKeyGenerator.cs b/Infrastructure/Common/Redis/RedisKeyGenerator.cs new file mode 100644 index 0000000..9e10d1f --- /dev/null +++ b/Infrastructure/Common/Redis/RedisKeyGenerator.cs @@ -0,0 +1,92 @@ +namespace Common.Redis +{ + public static class RedisKeyGenerator + { + private static readonly Dictionary ServicePrefixes = new() + { + { "user", "user-service" }, + { "admin", "admin-service" }, + { "game", "game-service" }, + { "fish", "game-service" }, + { "chess", "game-service" }, + { "customer", "customer-service" }, + { "common", "app-shared" } + }; + + public static string GetKey(string serviceName, string key, params object[] args) + { + var prefix = GetPrefix(serviceName); + var formattedKey = args.Length > 0 ? string.Format(key, args) : key; + return $"{prefix}:{formattedKey}"; + } + + private static string GetPrefix(string serviceName) + { + return ServicePrefixes.TryGetValue(serviceName.ToLower(), out var prefix) + ? prefix + : "app-shared"; + } + + public static string UserKey(string key, params object[] args) => + GetKey("user", key, args); + + public static string AdminKey(string key, params object[] args) => + GetKey("admin", key, args); + + public static string GameKey(string key, params object[] args) => + GetKey("game", key, args); + + public static string CustomerKey(string key, params object[] args) => + GetKey("customer", key, args); + + public static string CommonKey(string key, params object[] args) => + GetKey("common", key, args); + } + + public static class RedisKeyConstants + { + private const string ServicePrefix = "redis0524"; + + public static string MatchingRoom => $"{ServicePrefix}:matching:room:level_{{0}}"; + + public static string UserCIDGID => $"{ServicePrefix}:user:uid_{{0}}"; + + public static string LoginCIDUser => $"{ServicePrefix}:user:cid_{{0}}"; + + public static string CIDUser => $"{ServicePrefix}:user:cid_{{0}}"; + + public static string VerificationCode => $"{ServicePrefix}:verification_code:{{0}}"; + + public static string ProductRedis => $"{ServicePrefix}:product:{{0}}"; + + public static string WeiXin_AccessToken => $"{ServicePrefix}:wx_access_token"; + + public static string WeiXinUser_AccessToken => $"{ServicePrefix}:wx_user_access_token:{{0}}"; + + public static string GameConfig => $"{ServicePrefix}:game_config"; + + public static string TodayVisitsKey => $"{ServicePrefix}:TodayVisits"; + + public static string MonthVisitsKey => $"{ServicePrefix}:MonthVisits"; + + public static string TotalVisitsKey => $"{ServicePrefix}:TotalVisits"; + + public static string TotalTrafficKey => $"{ServicePrefix}:TotalTraffic"; + + public static string TodayTrafficKey => $"{ServicePrefix}:TodayTraffic"; + + public static string MonthTrafficKey => $"{ServicePrefix}:MonthTraffic"; + + public static string GameRoomIdKey => $"{ServicePrefix}:game:room:model:{{0}}_{{1}}"; + + public static string DistributedLockPrefix => $"{ServicePrefix}:lock:"; + + public static string ChessRoomList => $"{ServicePrefix}:chess:room:list"; + + public static string ChessRoomKey => $"{ServicePrefix}:chess:room:{{0}}"; + + public static string SystemGoldDayKey => $"{ServicePrefix}:fish:gamestatic"; + + public static string CustomerOnlineKey => "game0524:customer:online"; + } +} diff --git a/Infrastructure/Common/Request/IRequestApi.cs b/Infrastructure/Common/Request/IRequestApi.cs new file mode 100644 index 0000000..094e389 --- /dev/null +++ b/Infrastructure/Common/Request/IRequestApi.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Common.Request +{ + public interface IRequestApi + { + Task GetAsync(string host, string resource, Dictionary param, + Dictionary headerParms = null, int timeOut = 5); + + Task PostAsync(string host, string resource, object param, Dictionary queryParam = null, + Dictionary headerParms = null, int timeOut = 5); + + Task PostFormDataAsync(string host, string resource, Dictionary param); + + + Task DownloadFile(string fileName, string host, string resource, + Dictionary param = null, Dictionary headers = null); + + } +} \ No newline at end of file diff --git a/Infrastructure/Common/Request/RequestApi.cs b/Infrastructure/Common/Request/RequestApi.cs new file mode 100644 index 0000000..0522c40 --- /dev/null +++ b/Infrastructure/Common/Request/RequestApi.cs @@ -0,0 +1,202 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Common.Utils; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using RestSharp; + +namespace Common.Request +{ + public class RequestApi : IRequestApi + { + private readonly IHttpContextAccessor _httpContextAccessor; + private ILogger _logger; + private Dictionary defaultHeader = null; + + public RequestApi(IHttpContextAccessor httpContextAccessor, ILogger logger) + { + _logger = logger; + _httpContextAccessor = httpContextAccessor; + defaultHeader = new Dictionary(); + if (_httpContextAccessor.HttpContext != null && _httpContextAccessor.HttpContext.Request != null && + _httpContextAccessor.HttpContext.Request.Headers != null) + { + defaultHeader.Add("token", _httpContextAccessor.HttpContext.Request.Headers["token"].ToString() ?? ""); + } + } + + public async Task GetAsync(string host, string resource, Dictionary param = null, + Dictionary headers = null, int timeOut = 5) + { + var options = new RestClientOptions(host) + { + ThrowOnAnyError = true + }; + var restClient = new RestClient(options); + var request = new RestRequest(resource) + { + Timeout = TimeSpan.FromSeconds(timeOut) + }; + if (param != null && param.Count > 0) + { + foreach (var item in param.Where(e => e.Value != null)) + { + request.AddQueryParameter(item.Key, item.Value.ToString()); + } + } + + if (headers != null) + { + defaultHeader = headers; + } + + + + request.AddHeaders(defaultHeader); + var restResponse = await restClient.ExecuteGetAsync(request); + return HandleResponse(restResponse, resource, param); + } + + public async Task PostAsync(string host, string resource, object param, + Dictionary queryParams = null, Dictionary headers = null, int timeOut = 5) + { + var options = new RestClientOptions(host) + { + ThrowOnAnyError = true + }; + var restClient = new RestClient(options); + var request = new RestRequest(resource) + { + Timeout = TimeSpan.FromSeconds(timeOut) + }; + if (queryParams != null && queryParams.Count > 0) + { + foreach (var item in queryParams) + { + request.AddQueryParameter(item.Key, item.Value); + } + } + + if (param != null) + { + request.AddJsonBody(param); + } + + if (headers != null) + { + defaultHeader = headers; + } + + try + { + + request.AddHeaders(defaultHeader); + var restResponse = await restClient.ExecutePostAsync(request); + return HandleResponse(restResponse, resource, param); + } + catch (Exception ex) + { + return ""; + } + } + + public async Task PostFormDataAsync(string host, string resource, Dictionary param) + { + var options = new RestClientOptions(host) + { + ThrowOnAnyError = true + }; + var restClient = new RestClient(options); + var request = new RestRequest(resource); + if (param != null && param.Count > 0) + { + foreach (var item in param) + { + request.AddParameter(item.Key, item.Value.ToJson(), ParameterType.RequestBody); + } + + } + + try + { + + request.AddHeaders(defaultHeader); + var restResponse = await restClient.ExecutePostAsync(request); + return HandleResponse(restResponse, resource, param); + } + catch (Exception ex) + { + return ""; + } + } + + private string HandleResponse(RestResponse restResponse, string resource, object param) + { + if (!restResponse.IsSuccessful) + { + + return JsonConvert.SerializeObject(new {info = restResponse.ErrorMessage, code = -1}); + } + + try + { + JObject jt = Newtonsoft.Json.JsonConvert.DeserializeObject(restResponse.Content); + int code = jt["code"].ObjToInt(); + if (code != 0 && code != 401) + { + + } + } + catch (Exception ex) + { + + } + + return restResponse.Content; + } + + + public async Task DownloadFile(string fileName, string host, string resource, + Dictionary param = null, Dictionary headers = null) + { + var options = new RestClientOptions(host) + { + ThrowOnAnyError = true, + }; + var restClient = new RestClient(options); + var request = new RestRequest(resource); + if (param != null && param.Count > 0) + { + foreach (var item in param.Where(e => e.Value != null)) + { + request.AddQueryParameter(item.Key, item.Value.ToString()); + } + } + + if (headers != null) + { + defaultHeader = headers; + } + + + request.AddHeaders(defaultHeader); + + var restResponse = await restClient.DownloadDataAsync(request); + if (System.IO.File.Exists(fileName)) + { + System.IO.File.Delete(fileName); + } + using (FileStream pFileStream = new FileStream(fileName, FileMode.OpenOrCreate)) + { + pFileStream.Write(restResponse, 0, restResponse.Length); + } + + return System.IO.File.Exists(fileName); + } + } +} \ No newline at end of file diff --git a/Infrastructure/Common/SystemEnum.cs b/Infrastructure/Common/SystemEnum.cs new file mode 100644 index 0000000..a565a7d --- /dev/null +++ b/Infrastructure/Common/SystemEnum.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common +{ + public enum CommonResponseCodeEnum + { + Error = -1, + Exception = 500, + NoAuth = 401, + NoRole = 403, + TokenExpire = 1000, + + Success = 0, + NoLogin = 401, + TokenInvalid = 12, + ParamError = 13, + SignError = 14, + ResultNull = 15, + LowVersion = 16, + ResultFail = -1 + + } +} diff --git a/Infrastructure/Common/Utils/ConstValues.cs b/Infrastructure/Common/Utils/ConstValues.cs new file mode 100644 index 0000000..5bd7134 --- /dev/null +++ b/Infrastructure/Common/Utils/ConstValues.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; + +namespace Common.Utils +{ + public static class ConstValues + { + + public const int LockSecond = 5; + public const string LockNotice = "业务正在处理中,请稍后"; + + public const string DevModel = "dev"; + + } +} \ No newline at end of file diff --git a/Infrastructure/Common/Utils/ConvertExtension.cs b/Infrastructure/Common/Utils/ConvertExtension.cs new file mode 100644 index 0000000..2f87629 --- /dev/null +++ b/Infrastructure/Common/Utils/ConvertExtension.cs @@ -0,0 +1,611 @@ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Reflection; +using System.Security.Cryptography; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; +using Newtonsoft.Json; +using NPinyin; +namespace Common.Utils +{ + public static class ConvertExtension + { + /// + /// + /// + /// + /// + public static int ObjToInt(this object thisValue) + { + int reval = 0; + if (thisValue == null) return 0; + if (thisValue != null && thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval)) + { + return reval; + } + return reval; + } + public static bool ContainsAll(this IEnumerable source, IEnumerable items) + { + if (source == null || items == null) + return false; + + var sourceCounts = source.GroupBy(x => x).ToDictionary(g => g.Key, g => g.Count()); + var itemsCounts = items.GroupBy(x => x).ToDictionary(g => g.Key, g => g.Count()); + + foreach (var item in itemsCounts) + { + if (!sourceCounts.TryGetValue(item.Key, out int count) || count < item.Value) + { + return false; + } + } + + return true; + } + + public static IEnumerable RemoveRange(this IEnumerable source, IEnumerable items) + { + if (source == null) + return Enumerable.Empty(); + + if (items == null || !items.Any()) + return source; + + var list = new List(source); + + foreach (var item in items) + { + int index = list.IndexOf(item); + if (index >= 0) + { + list.RemoveAt(index); + } + } + + return list; + } + /// + /// + /// + /// + /// + /// + public static int ObjToInt(this object thisValue, int errorValue) + { + int reval = 0; + if (thisValue != null && thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval)) + { + return reval; + } + return errorValue; + } + /// + /// + /// + /// + /// + public static long ObjToLong(this object thisValue) + { + long reval = 0; + if (thisValue == null) return 0; + if (thisValue != null && thisValue != DBNull.Value && long.TryParse(thisValue.ToString(), out reval)) + { + return reval; + } + return reval; + } + + /// + /// + /// + /// + /// + public static double ObjToMoney(this object thisValue) + { + double reval = 0; + if (thisValue != null && thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out reval)) + { + return reval; + } + return 0; + } + public static T GetRandomItem(this IEnumerable thisValue) + { + if (thisValue != null && thisValue.Count() > 0) + { + int index = Random.Shared.Next(thisValue.Count()); + return thisValue.ToList()[index]; + } + else if (thisValue.Count() == 1) + { + return thisValue.ToList()[0]; + } + else + return default(T); + + } + /// + /// + /// + /// + /// + /// + public static double ObjToMoney(this object thisValue, double errorValue) + { + double reval = 0; + if (thisValue != null && thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out reval)) + { + return reval; + } + return errorValue; + } + /// + /// + /// + /// + /// + public static string ObjToString(this object thisValue) + { + if (thisValue != null) return thisValue.ToString().Trim(); + return ""; + } + /// + /// + /// + /// + /// + public static bool IsNotEmptyOrNull(this IEnumerable thisValue) + { + return thisValue != null && thisValue.Count() > 0; ; + } + /// + /// + /// + /// + /// + /// + public static string ObjToString(this object thisValue, string errorValue) + { + if (thisValue != null) return thisValue.ToString().Trim(); + return errorValue; + } + /// + /// + /// + /// + /// + public static Decimal ObjToDecimal(this object thisValue) + { + Decimal reval = 0; + if (thisValue != null && thisValue != DBNull.Value && decimal.TryParse(thisValue.ToString(), out reval)) + { + return reval; + } + return 0; + } + /// + /// + /// + /// + /// + public static double ObjToDouble(this object thisValue) + { + double reval = 0; + if (thisValue != null && thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out reval)) + { + return reval; + } + return 0; + } + + /// + /// + /// + /// + /// + /// + public static Decimal ObjToDecimal(this object thisValue, decimal errorValue) + { + Decimal reval = 0; + if (thisValue != null && thisValue != DBNull.Value && decimal.TryParse(thisValue.ToString(), out reval)) + { + return reval; + } + return errorValue; + } + /// + /// + /// + /// + /// + public static DateTime ObjToDate(this object thisValue) + { + DateTime reval = DateTime.MinValue; + if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval)) + { + reval = Convert.ToDateTime(thisValue); + } + return reval; + } + /// + /// + /// + /// + /// + /// + public static DateTime ObjToDate(this object thisValue, DateTime errorValue) + { + DateTime reval = DateTime.MinValue; + if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval)) + { + return reval; + } + return errorValue; + } + /// + /// + /// + /// + /// + public static bool ObjToBool(this object thisValue) + { + bool reval = false; + if (thisValue != null && thisValue != DBNull.Value && bool.TryParse(thisValue.ToString(), out reval)) + { + return reval; + } + return reval; + } + + public static DateTime ConvertToDateTime(this long timeStamp) + { + var dto = DateTimeOffset.FromUnixTimeSeconds(timeStamp); + return dto.ToLocalTime().DateTime; + } + public static DateTime ConvertToDateTime(this string timeStamp) + { + try + { + var dto = DateTimeOffset.FromUnixTimeSeconds(Convert.ToInt64(timeStamp)); + return dto.ToLocalTime().DateTime; + } + catch (Exception e) + { + throw new FormatException($"无效的Unix时间戳: {timeStamp}", e); + } + } + + public static string DateToTimeStamp(this DateTime thisValue) + { + DateTimeOffset dto = new DateTimeOffset(thisValue); + return dto.ToUnixTimeSeconds().ToString(); + } + public static decimal ToCeilingFixed2(this decimal value) + { + try + { + return Convert.ToInt32(Math.Ceiling(Math.Round(value * 100, 2))) / (decimal)100.0; + } + catch + { + return (decimal)0.0; + } + } + public static decimal ToFloorFixed2(this decimal value) + { + try + { + return Convert.ToInt32(Math.Floor(Math.Round(value * 100, 2))) / (decimal)100.0; + } + catch + { + return (decimal)0.0; + } + } + public static double ToCeilingFixed2(this double value) + { + try + { + return Convert.ToInt32(Math.Ceiling(Math.Round(value * 100, 2))) / 100.0; + } + catch + { + return 0.0; + } + } + + public static double ToFloorFixed2(this double value) + { + try + { + return Convert.ToInt32(Math.Floor(Math.Round(value * 100, 2))) / 100.0; + } + catch + { + return 0.0; + } + } + public static string ConvertToPinyin(this string chinese) + { + if (string.IsNullOrWhiteSpace(chinese)) + return "*"; + return Pinyin.GetPinyin(chinese).Trim().Replace(" ", "").ToUpper(); + } + + public static int ToCeilingInt(this double value) + { + try + { + return Convert.ToInt32(Math.Ceiling(Math.Round(value, 1))); + } + catch + { + return Convert.ToInt32(value); + } + } + public static int ToCeilingInt(this decimal value) + { + try + { + return Convert.ToInt32(Math.Ceiling(Math.Round(value, 1))); + } + catch + { + return Convert.ToInt32(value); + } + } + + public static string[] Remove(this string[] value, string str) + { + List valueList = value.ToList(); + if (!valueList.Contains(str)) + return value; + valueList.Remove(str); + return valueList.ToArray(); + } + public static int[] Remove(this int[] value, int str) + { + List valueList = value.ToList(); + if (!valueList.Contains(str)) + return value; + valueList.Remove(str); + return valueList.ToArray(); + } + + + // + // + // time: + public static long ToTimeStamp(this DateTime time) + { + return new DateTimeOffset(time).ToUnixTimeSeconds(); + } + + // + // + // timeStamp: + public static DateTime ToDateTime(this long timeStamp) + { + return DateTimeOffset.FromUnixTimeSeconds(timeStamp).ToLocalTime().DateTime; + } + + // + // + // obj: + public static string ToJson(this object obj) + { + return JsonConvert.SerializeObject(obj); + } + + // + // + // str: + public static T ToObject(this string str) + { + return JsonConvert.DeserializeObject(str); + } + + // + // + // str: + // + // IgnoreCapitalized: + public static string ToUrlEncode(this string str, bool IgnoreCapitalized = true) + { + return WebUtility.UrlEncode(IgnoreCapitalized ? str.ToLowerInvariant() : str); + } + + // + // + // source: + // + // T: + // + // T:System.ArgumentException: + public static T Clone(T source) + { + return JsonConvert.DeserializeObject(source.ToJson()); + } + + + // + // + // str: + public static string ToUrlDecode(this string str) + { + return WebUtility.UrlDecode(str); + } + + // + // + // str: + public static string ToBase64String(this string str) + { + return Convert.ToBase64String(Encoding.Default.GetBytes(str)); + } + + // + // + // str: + public static string ToParseBase64(this string str) + { + try + { + byte[] bytes = Convert.FromBase64String(str); + return Encoding.Default.GetString(bytes); + } + catch + { + return ""; + } + } + + // + // + // value: + public static double ToDoubleFixed2(this double value) + { + try + { + return (double)Convert.ToInt32(Math.Ceiling(Math.Round(value * 100.0, 2))) / 100.0; + } + catch + { + return 0.0; + } + } + + // + // + // value: + public static decimal ToDecimalFixed2(this decimal value) + { + try + { + return (decimal)Convert.ToInt32(Math.Ceiling(Math.Round(value * 100m, 2))) / 100m; + } + catch + { + return 0m; + } + } + + // + // + // value: + public static double ToDoubleFloor2(this double value) + { + try + { + return (double)Convert.ToInt32(Math.Floor(Math.Round(value * 100.0, 2))) / 100.0; + } + catch + { + return 0.0; + } + } + + // + // + // str: + // + public static string ToReverse(this string str) + { + return new string(str.ToCharArray().AsEnumerable().Reverse().ToArray()); + } + + // + // + // value: + public static decimal ToDecimalFloor2(this decimal value) + { + try + { + return (decimal)Convert.ToInt32(Math.Floor(Math.Round(value * 100m, 2))) / 100m; + } + catch + { + return 0m; + } + } + + // + // + // content: + public static string ToDecodeBase64(this string content) + { + byte[] bytes = Convert.FromBase64String(content); + return Encoding.UTF8.GetString(bytes); + } + + // + // + // mobile: + public static string ToHidMobile(this string mobile) + { + if (string.IsNullOrWhiteSpace(mobile)) + { + return ""; + } + + if (IsHandset(mobile)) + { + return mobile.Substring(0, 3) + "****" + mobile.Substring(mobile.Length - 4, 4); + } + + return mobile; + } + + // + // + // str_handset: + public static bool IsHandset(string str_handset) + { + return Regex.IsMatch(str_handset, "^1[3456789]\\d{9}$"); + } + + // + // + // list: + // + // T: + public static bool IsNull(this List list) + { + if (list != null) + { + return !list.Any(); + } + + return true; + } + + // + // + // source: + // + // isReplace: + // + // isToLower: + public static string ToSHA1Encrypt(this string source, bool isReplace = true, bool isToLower = false) + { + string text = BitConverter.ToString(SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(source))); + if (isReplace) + { + text = text.Replace("-", ""); + } + + if (isToLower) + { + text = text.ToLower(); + } + + return text; + } + + } +} diff --git a/Infrastructure/Common/Utils/DateTimeConverterUtf.cs b/Infrastructure/Common/Utils/DateTimeConverterUtf.cs new file mode 100644 index 0000000..4b93cb7 --- /dev/null +++ b/Infrastructure/Common/Utils/DateTimeConverterUtf.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Threading.Tasks; + +namespace Common.Utils +{ + public class DateTimeConverterUtf : JsonConverter + { + public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return DateTime.Parse(reader.GetString()!); + } + + public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) + { + var cstTime = TimeZoneInfo.ConvertTimeFromUtc(value, + TimeZoneInfo.FindSystemTimeZoneById("Asia/Shanghai")); + writer.WriteStringValue(cstTime.ToString("yyyy-MM-dd HH:mm:ss")); + } + + + } +} diff --git a/Infrastructure/Common/Utils/DateTimeTools.cs b/Infrastructure/Common/Utils/DateTimeTools.cs new file mode 100644 index 0000000..fe2fa58 --- /dev/null +++ b/Infrastructure/Common/Utils/DateTimeTools.cs @@ -0,0 +1,42 @@ +using System; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Common.Utils +{ + public static class DateTimeTools + { + + public static DateTime GetDateTimeNow() + { + return DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc); + } + + public static int GetTimeDiffDays(DateTime start, DateTime end) + { + string result = string.Empty; + TimeSpan ts1 = new TimeSpan(start.Ticks); + TimeSpan ts2 = new TimeSpan(end.Ticks); + TimeSpan ts = ts1.Subtract(ts2).Duration(); + return ts.Days; + } + public class DatetimeJsonConverter : JsonConverter + { + public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.String) + { + if (DateTime.TryParse(reader.GetString(), out DateTime date)) + return date; + } + return reader.GetDateTime(); + } + + public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) + { + writer.WriteStringValue(value.ToString("yyyy-MM-dd HH:mm:ss")); + } + } + } + +} \ No newline at end of file diff --git a/Infrastructure/Common/Utils/Md5Helper.cs b/Infrastructure/Common/Utils/Md5Helper.cs new file mode 100644 index 0000000..a4f7017 --- /dev/null +++ b/Infrastructure/Common/Utils/Md5Helper.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; + +namespace Common.Utils +{ + public static class Md5Helper + { + public static string GetMD5(string str) + { + byte[] sor = Encoding.UTF8.GetBytes(str); + MD5 md5 = MD5.Create(); + byte[] result = md5.ComputeHash(sor); + StringBuilder strbul = new StringBuilder(40); + for (int i = 0; i < result.Length; i++) + { + strbul.Append(result[i].ToString("x2")); + + } + return strbul.ToString(); + } + } +} + diff --git a/Infrastructure/Common/Utils/RandomHelper.cs b/Infrastructure/Common/Utils/RandomHelper.cs new file mode 100644 index 0000000..2882b23 --- /dev/null +++ b/Infrastructure/Common/Utils/RandomHelper.cs @@ -0,0 +1,132 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common.Utils +{ + public static class RandomHelper + { + // + // + // length: + public static string RandomNumbers(int length = 4) + { + if (length <= 4) + { + length = 4; + } + + if (length >= 8) + { + length = 8; + } + + string value = 1.ToString().PadRight(length, '0'); + string value2 = 1.ToString().PadRight(length + 1, '0'); + return Random.Shared.Next(Convert.ToInt32(value), Convert.ToInt32(value2)).ToString(); + } + + // + // + // length: + public static string RandomChars(int length = 4) + { + if (length <= 4) + { + length = 4; + } + + if (length >= 8) + { + length = 8; + } + + char[] array = new char[62] + { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', + 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', + 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', + 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', + 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', + 'y', 'z' + }; + string text = ""; + for (int i = 0; i < length; i++) + { + int num = Random.Shared.Next(0, 61); + text += array[num]; + } + + return text; + } + + // + // + // length: + public static string RandomNoRepeatNumber(int length) + { + int num = 0; + string text = string.Empty; + long num2 = DateTime.Now.Ticks + num; + num++; + Random random = new Random((int)(num2 & 0xFFFFFFFFu) | (int)(num2 >> num)); + for (int i = 0; i < length; i++) + { + int num3 = random.Next(); + text += (char)(48 + (ushort)(num3 % 10)); + } + + return text; + } + + // + // + // length: + public static string RandomNoRepeatChars(int length) + { + int num = 0; + string text = string.Empty; + long num2 = DateTime.Now.Ticks + num; + num++; + Random random = new Random((int)(num2 & 0xFFFFFFFFu) | (int)(num2 >> num)); + for (int i = 0; i < length; i++) + { + int num3 = random.Next(); + text += ((num3 % 2 != 0) ? ((char)(65 + (ushort)(num3 % 26))) : ((char)(48 + (ushort)(num3 % 10)))); + } + + return text; + } + + // + // + // allChar: + // + // length: + public static string GetRandomCode(string allChar, int length) + { + string[] array = allChar.Split(','); + string text = ""; + int num = -1; + for (int i = 0; i < length; i++) + { + int num2 = Random.Shared.Next(array.Length - 1); + while (num == num2) + { + num2 = Random.Shared.Next(array.Length - 1); + } + + num = num2; + text += array[num2]; + } + + return text; + } + + + + } +} diff --git a/Infrastructure/Common/Utils/Tool.cs b/Infrastructure/Common/Utils/Tool.cs new file mode 100644 index 0000000..a73755d --- /dev/null +++ b/Infrastructure/Common/Utils/Tool.cs @@ -0,0 +1,186 @@ +using System.Globalization; +using System.Text; +using System.Text.RegularExpressions; +using Newtonsoft.Json; +using XSystem.Security.Cryptography; + +namespace Common +{ + public static class Tools + { + + private static string GetTimeString() + { + return DateTime.Now.ToString("yyyyMMddHHmmssfff"); + } + public static string GetTimeStringRandom(string str = "") + { + return GetTimeString() + str; + } + + public static string LockKey(object param) + { + var source = JsonConvert.SerializeObject(param); + MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); + byte[] bytes = Encoding.UTF8.GetBytes(source); + string result = BitConverter.ToString(md5.ComputeHash(bytes)); + return "HSCW:RedisLock:" + result.Replace("-", "").ToLower(); + } + + public static string GetSerialNumber() + { + return DateTime.Now.ToString("yyyyMMddHHmmssfff") + Random.Shared.Next(100000, 999999); + } + + public static string ReplaceWithSpecialChar(string value, int startLen = 1, int endLen = 1, char specialChar = '*') + { + + try + { + if (string.IsNullOrEmpty(value)) + { + return value; + } + + if (value.Length < startLen + endLen) + { + return value; + } + + string startStr = value.Substring(0, startLen); + var len = value.Length - startLen - endLen; + for (int i = 0; i < len; i++) + { + startStr += specialChar; + } + startStr += value.Substring(startLen + len, endLen); + return startStr; + } + catch (Exception) + { + return value; + } + } + public static string SubStringText(string content, int length) + { + if (string.IsNullOrEmpty(content)) + { + return ""; + } + + if (content.Length <= length) + { + return content; + } + + return content.Substring(0, length); + } + public static string SubStringTextLast(string content, int length) + { + if (string.IsNullOrEmpty(content)) + { + return ""; + } + + if (content.Length <= length) + { + return content; + } + + return content.Substring(content.Length - length); + } + + + public static List PickupImgUrl(string html) + { + if (string.IsNullOrWhiteSpace(html)) + return null; + Regex regImg = new Regex(@"]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>", RegexOptions.IgnoreCase); + MatchCollection matches = regImg.Matches(html); + List lstImg = new List(); + foreach (Match match in matches) + { + lstImg.Add(match.Groups["imgUrl"].Value); + } + + return lstImg; + } + public static string NoHTML(string html) + { + string str = ""; + for (int i = 0; i < html.Length; i++) + { + if (Convert.ToInt32(Convert.ToChar(html.Substring(i, 1))) > Convert.ToInt32(Convert.ToChar(128))) + { + str += html.Substring(i, 1).ToString(); + } + } + return str; + } + + + public static string RegexSubstring(string content, string startStr, string endStr) + { + Regex rex = new Regex("(?<=(" + startStr + "))[.\\s\\S]*?(?=(" + endStr + "))", RegexOptions.Multiline | RegexOptions.Singleline); + return rex.Match(content).Value; + } + public static bool CheckIsUrl(string strValue) + { + return CheckIsFormat(@"^(http|https|ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&$%\$#\=~])*$", strValue); + } + + private static bool CheckIsFormat(string strRegex, string strValue) + { + if (strValue != null && strValue.Trim() != "") + { + Regex re = new Regex(strRegex); + if (re.IsMatch(strValue)) + { + return true; + } + + return false; + } + + return false; + } + + + public static bool IsIdCard(string idCardNumber) + { + if (string.IsNullOrEmpty(idCardNumber)) + return false; + idCardNumber = idCardNumber.ToUpper(); + + if (!Regex.IsMatch(idCardNumber, @"^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$")) + return false; + + + string birthDateString = idCardNumber.Substring(6, 8); + char genderCheckDigitChar = idCardNumber[16]; + char checkDigit = idCardNumber[17]; + + + + if (!DateTime.TryParseExact(birthDateString, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime birthDate)) + { + return false; + } + DateTime today = DateTime.Now.AddYears(18); + if (birthDate > today) + { + return false; + } + if (today.Year - birthDate.Year > 80) + { + return false; + } + if (!char.IsDigit(genderCheckDigitChar)) + { + return false; + } + return true; + } + } + +} diff --git a/Infrastructure/Common/Utils/ValidationHelper.cs b/Infrastructure/Common/Utils/ValidationHelper.cs new file mode 100644 index 0000000..5de0dc9 --- /dev/null +++ b/Infrastructure/Common/Utils/ValidationHelper.cs @@ -0,0 +1,84 @@ +using System.Text.RegularExpressions; + +namespace Common.Utils +{ + public static class ValidationHelper + { + private static readonly Regex MobileRegex = new(@"^1[3-9]\d{9}$", RegexOptions.Compiled); + + private static readonly Regex IdCardRegex = new(@"^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$", RegexOptions.Compiled); + + private static readonly Regex UserNameRegex = new(@"^[\u4e00-\u9fa5a-zA-Z0-9_]{2,20}$", RegexOptions.Compiled); + + public static bool IsValidMobile(string mobile) + { + if (string.IsNullOrWhiteSpace(mobile)) + return false; + return MobileRegex.IsMatch(mobile); + } + + public static bool IsValidIdCard(string idCard) + { + if (string.IsNullOrWhiteSpace(idCard) || idCard.Length != 18) + return false; + + if (!IdCardRegex.IsMatch(idCard)) + return false; + + return ValidateIdCardCheckSum(idCard); + } + + public static bool IsValidUserName(string userName) + { + if (string.IsNullOrWhiteSpace(userName)) + return false; + return UserNameRegex.IsMatch(userName); + } + + public static bool IsPositiveAmount(long amount) + { + return amount > 0; + } + + public static bool IsPositiveAmount(int amount) + { + return amount > 0; + } + + public static bool IsInRange(int count, int min, int max) + { + return count >= min && count <= max; + } + + public static bool IsValidLength(string value, int minLength, int maxLength) + { + if (string.IsNullOrWhiteSpace(value)) + return false; + return value.Length >= minLength && value.Length <= maxLength; + } + + public static bool IsValidPassword(string password) + { + if (string.IsNullOrWhiteSpace(password) || password.Length < 6 || password.Length > 20) + return false; + return password.Any(char.IsLetter) && password.Any(char.IsDigit); + } + + private static bool ValidateIdCardCheckSum(string idCard) + { + int[] weight = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; + char[] checkCodes = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' }; + + int sum = 0; + for (int i = 0; i < 17; i++) + { + sum += (idCard[i] - '0') * weight[i]; + } + + char expectedCheckChar = checkCodes[sum % 11]; + char actualCheckChar = char.ToUpper(idCard[17]); + + return expectedCheckChar == actualCheckChar; + } + } +} diff --git a/Infrastructure/Common/WX/Response/AccessTokenResponse.cs b/Infrastructure/Common/WX/Response/AccessTokenResponse.cs new file mode 100644 index 0000000..0e5cc74 --- /dev/null +++ b/Infrastructure/Common/WX/Response/AccessTokenResponse.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common.WX.Response +{ + public class AccessTokenResponse : WXBaseResponse + { + /// + /// access_token + /// + public string access_token { get; set; } + public int expires_in { get; set; } + + public string refresh_token { get; set; } + public string openid { get; set; } + public string scope { get; set; } + /// + /// is_snapshotuser + /// + public int is_snapshotuser { get; set; } + public string unionid { get; set; } + } +} diff --git a/Infrastructure/Common/WX/Response/GZHUserInfoResponse.cs b/Infrastructure/Common/WX/Response/GZHUserInfoResponse.cs new file mode 100644 index 0000000..e1f505d --- /dev/null +++ b/Infrastructure/Common/WX/Response/GZHUserInfoResponse.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common.WX.Response +{ + public class GZHUserInfoResponse : WXBaseResponse + { + public string openid { get; set; } + public string nickname { get; set; } + public int sex { get; set; } + public string province { get; set; } + public string city { get; set; } + public string country { get; set; } + public string headimgurl { get; set; } + public string[] privilege { get; set; } + public string unionid { get; set; } + } + +} diff --git a/Infrastructure/Common/WX/Response/TicketResponse.cs b/Infrastructure/Common/WX/Response/TicketResponse.cs new file mode 100644 index 0000000..a2ccc45 --- /dev/null +++ b/Infrastructure/Common/WX/Response/TicketResponse.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common.WX.Response +{ + public class TicketResponse: WXBaseResponse + { + /// + /// ticket + /// + public string ticket { get; set; } + public int expires_in { get; set; } + } +} diff --git a/Infrastructure/Common/WX/Response/WXBaseResponse.cs b/Infrastructure/Common/WX/Response/WXBaseResponse.cs new file mode 100644 index 0000000..fa6ffff --- /dev/null +++ b/Infrastructure/Common/WX/Response/WXBaseResponse.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common.WX.Response +{ + public class WXBaseResponse + { + public int errcode { get; set; } = 0; + public string errmsg { get; set; } + } +} diff --git a/Infrastructure/Common/WX/WXBaseHelper.cs b/Infrastructure/Common/WX/WXBaseHelper.cs new file mode 100644 index 0000000..56d5096 --- /dev/null +++ b/Infrastructure/Common/WX/WXBaseHelper.cs @@ -0,0 +1,91 @@ +using Common.Redis; +using Common.Request; +using Common.Utils; +using Common.WX.Response; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using RedisHelper; + +namespace Common.WX +{ + public class WXBaseHelper + { + private readonly IRequestApi _requestApi; + private readonly ICache _cache; + private readonly IConfiguration _configuration; + private ILogger _logger; + private readonly string appid; + private readonly string secret; + private readonly string wx_url; + + public WXBaseHelper(IRequestApi requestApi, ICache cache, IConfiguration configuration, ILogger logger) + { + _requestApi = requestApi; + _cache = cache; + _configuration = configuration; + _logger = logger; + appid = _configuration["WXConfig:AppId"]; + secret = _configuration["WXConfig:Secret"]; + wx_url = _configuration["WXConfig:Url"]; + } + + + public async Task<(bool isok,string msg,string accessToken)> GetAccessToken() + { + var accessToken = _cache.Get(RedisKey.WeiXin_AccessToken); + if (accessToken != null && !string.IsNullOrWhiteSpace(accessToken)) + { + return (true,"", accessToken); + + } + var param = new Dictionary + { + { "appid", appid }, + { "secret", secret }, + { "grant_type", "client_credential" } + }; + var result = await _requestApi.GetAsync(wx_url, "/cgi-bin/token", param); + var res = result.ToObject(); + if (res.errcode == 0) + { + _cache.Insert(RedisKey.WeiXin_AccessToken, res.access_token, 3600); + return (true, "", res.access_token); + } + else + return (false, res.errcode+"-"+ res.errmsg,null); + } + + public async Task<(bool isok, string msg, AccessTokenResponse response)> GetAccessTokenByCode(string js_code) + { + var codeRedis = _cache.Get(string.Format(RedisKey.WeiXinUser_AccessToken, js_code)); + + if (codeRedis != null) + { + return (true, "", codeRedis); + + } + var param = new Dictionary + { + { "appid", appid }, + { "secret", secret }, + { "js_code", js_code }, + { "grant_type", "authorization_code" } + }; + var result = await _requestApi.GetAsync(wx_url, "/sns/jscode2session", param); + var res = result.ToObject(); + if (res.errcode == 0) + { + _cache.Insert(string.Format(RedisKey.WeiXinUser_AccessToken, js_code), res, 6000); + return (true, res.errmsg, res); + } + else + return (false, res.errmsg, null); + } + + + + + + + } +} diff --git a/Infrastructure/CommonInfrastructure/CommonInfrastructure.csproj b/Infrastructure/CommonInfrastructure/CommonInfrastructure.csproj new file mode 100644 index 0000000..c54d24a --- /dev/null +++ b/Infrastructure/CommonInfrastructure/CommonInfrastructure.csproj @@ -0,0 +1,20 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + diff --git a/Infrastructure/CommonInfrastructure/Controllers/BaseController.cs b/Infrastructure/CommonInfrastructure/Controllers/BaseController.cs new file mode 100644 index 0000000..4148d4a --- /dev/null +++ b/Infrastructure/CommonInfrastructure/Controllers/BaseController.cs @@ -0,0 +1,39 @@ +using Common; +using CommonInfrastructure.Response; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Filters; + +namespace CommonInfrastructure +{ + public class BaseController : Controller + { + public LoginUser loginUser { get; set; } + + public override void OnActionExecuting(ActionExecutingContext filterContext) + { + var context = filterContext.HttpContext; + + loginUser = new LoginUser(); + var request = context.Request; + try + { + loginUser.UserId = context.User.Claims.FirstOrDefault(e => e.Type == "uid")?.Value; + loginUser.UserName = context.User.Claims.FirstOrDefault(e => e.Type == "uname")?.Value; + loginUser.DisplayName = context.User.Claims.FirstOrDefault(e => e.Type == "dname")?.Value; + loginUser.Icon = context.User.Claims.FirstOrDefault(e => e.Type == "avatar")?.Value; + loginUser.Number = context.User.Claims.FirstOrDefault(e => e.Type == "number")?.Value; + + loginUser.Ip = context.Request.Headers["X-Forwarded-For"].FirstOrDefault()?.Split(',').FirstOrDefault()?.Trim(); + + if (string.IsNullOrEmpty(loginUser.Ip)) + { + loginUser.Ip = context.Connection.RemoteIpAddress?.ToString() ?? ""; + } + } + catch (Exception ex) + { + filterContext.Result = new JsonResult(new BaseCommonResponse() { Code = CommonResponseCodeEnum.ParamError, Info = "请求参数异常"+ex.Message }); + } + } + } +} diff --git a/Infrastructure/CommonInfrastructure/Extension/ControllerExtension.cs b/Infrastructure/CommonInfrastructure/Extension/ControllerExtension.cs new file mode 100644 index 0000000..656b33c --- /dev/null +++ b/Infrastructure/CommonInfrastructure/Extension/ControllerExtension.cs @@ -0,0 +1,58 @@ +using Common; +using Microsoft.AspNetCore.Mvc; + +namespace CommonInfrastructure +{ + public static class ControllerExtension + { + public static BaseResponse ToFailResult( + this Controller controller, + string info) => new BaseResponse() { Info = info, Code = CommonResponseCodeEnum.ResultFail }; + + public static ListResponse ToListFailResult( + this Controller controller, + string info) => new ListResponse() + { Info = info, Code = CommonResponseCodeEnum.ResultFail }; + + public static PageResponse ToPageFailResult( + this Controller controller, + string info) => new PageResponse() + { + Code = CommonResponseCodeEnum.ResultFail, + Info = info + }; + + public static BaseResponse ToResult( + this Controller controller, + T obj, string info = null) => new BaseResponse() { Data = obj, Info = info, Code = CommonResponseCodeEnum.Success }; + + public static ListResponse ToListResult( + this Controller controller, + IEnumerable list, string info = null) => new ListResponse() + { + Data = list, + Code = CommonResponseCodeEnum.Success, + Info = info + }; + + public static PageResponse ToPageResult( + this Controller controller, + IEnumerable list, int count = 0, string info = null) => new PageResponse() + { + Code = CommonResponseCodeEnum.Success, + Info = info, + Count = count, + Data = list + }; + + public static BaseResponse ToNoLoginResult( + this Controller controller) => new BaseResponse() { Info = "未登录", Code = CommonResponseCodeEnum.NoLogin }; + + public static BaseResponse ToTokenInvalidResult( + this Controller controller) => new BaseResponse() { Info = "token失效", Code = CommonResponseCodeEnum.TokenInvalid }; + + public static BaseResponse ToParamErrorResult( + this Controller controller) => new BaseResponse() { Info = "请求参数错误", Code = CommonResponseCodeEnum.ParamError }; + + } +} diff --git a/Infrastructure/CommonInfrastructure/Middleware/AutofacModule.cs b/Infrastructure/CommonInfrastructure/Middleware/AutofacModule.cs new file mode 100644 index 0000000..5f5b720 --- /dev/null +++ b/Infrastructure/CommonInfrastructure/Middleware/AutofacModule.cs @@ -0,0 +1,27 @@ +using Autofac; +using MongoRepository; + +namespace CommonInfrastructure +{ + public class AutofacModule : Module + { + protected override void Load(ContainerBuilder builder) + { + builder.RegisterGeneric(typeof(MongoBaseRepository<>)) + .As(typeof(IMongoBaseRepository<>)) + .InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + } + + public static void RegisterServices(ContainerBuilder builder, Type serviceAssemblyType) + { + builder.RegisterAssemblyTypes(serviceAssemblyType.Assembly) + .Where(t => t.Name.EndsWith("Service")) + .AsImplementedInterfaces() + .InstancePerLifetimeScope(); + } + } +} diff --git a/Infrastructure/CommonInfrastructure/Response/LoginUser.cs b/Infrastructure/CommonInfrastructure/Response/LoginUser.cs new file mode 100644 index 0000000..45f4156 --- /dev/null +++ b/Infrastructure/CommonInfrastructure/Response/LoginUser.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CommonInfrastructure.Response +{ + public class LoginUser + { + public string? UserId{ get; set; } + public string? UserName { get; set; } + public string Number { get; set; } + + + public string? DisplayName { get; set; } + + public string? Icon { get; set; } + + public string Source { get; set; } + public string Ip { get; set; } + /// + /// token + /// + public string Token { get; set; } + + + } +} diff --git a/Infrastructure/JWTHelper/JWTConfig.cs b/Infrastructure/JWTHelper/JWTConfig.cs new file mode 100644 index 0000000..3704d12 --- /dev/null +++ b/Infrastructure/JWTHelper/JWTConfig.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JWTHelper +{ + public class JWTConfig + { + + public string TokenKey { get; set; } + + public bool ValidateIssuer { get; set; } + public string Issuer { get; set; } + + + public bool ValidateAudience { get; set; } + public string Audience { get; set; } + + public bool ValidateIssuerSigningKey { get; set; } + public string SecretKey { get; set; } + + + public bool ValidateLifetime { get; set; } + + + } +} diff --git a/Infrastructure/JWTHelper/JWTExtension.cs b/Infrastructure/JWTHelper/JWTExtension.cs new file mode 100644 index 0000000..3cfce0f --- /dev/null +++ b/Infrastructure/JWTHelper/JWTExtension.cs @@ -0,0 +1,180 @@ +using System; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.IdentityModel.Tokens; +using Newtonsoft.Json; +using System.IdentityModel.Tokens.Jwt; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + +namespace JWTHelper +{ + public static class JWTExtension + { + public static IServiceCollection AddCustomJwt(this IServiceCollection services, + IConfiguration configuration) + { + + services.AddScoped(); + services.Configure(options => { configuration.Bind("JwtConfig", options); }); + JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); + services.AddAuthentication(options => + { + options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; + }).AddJwtBearer(options => + { + var jwtSettings = new JWTConfig(); + configuration.Bind("JwtConfig", jwtSettings); + options.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/") || path.StartsWithSegments("/fishinghub") || path.StartsWithSegments("/fishingroomhub"))) + { + context.Token = accessToken; + } + else + { + try + { + context.Token = context.HttpContext.Request.Headers[jwtSettings.TokenKey].ToString(); + } + catch (Exception e) + { + context.Token = ""; + } + } + + if (!string.IsNullOrEmpty(context.Token)) + { + // var key = JwtTools.GetTokenContent(context.Token, "key"); + var userId =JwtTools.GetTokenReverseContent(context.Token, "uid"); + if (string.IsNullOrEmpty(userId)) + { + context.Token = ""; + } + //if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(userId)) + //{ + // context.Token = ""; + //} + //else + //{ + // if (Md5Helper.Encode(userId)[..8] != key) + // { + // context.Token = ""; + // } + + //} + } + + return Task.CompletedTask; + }, + OnAuthenticationFailed = context => + { + string s = context.Exception.Message; + return Task.CompletedTask; + }, + OnChallenge = context => + { + context.HandleResponse(); + var payload = JsonConvert.SerializeObject(new { code = 401, msg = "fail",info= "很抱歉,您无权访问该接口" }); + context.Response.ContentType = "application/json"; + context.Response.StatusCode = StatusCodes.Status200OK; + context.Response.WriteAsync(payload); + return Task.FromResult(0); + } + }; + var tokenValidationParameters = new TokenValidationParameters(); + + tokenValidationParameters.ValidateAudience = jwtSettings.ValidateAudience; + tokenValidationParameters.ValidAudience = jwtSettings.Audience; + + tokenValidationParameters.ValidateIssuer = jwtSettings.ValidateIssuer; + tokenValidationParameters.ValidIssuer = jwtSettings.Issuer; + + tokenValidationParameters.ValidateIssuerSigningKey = jwtSettings.ValidateIssuerSigningKey; + tokenValidationParameters.IssuerSigningKey = + new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.SecretKey)); + + tokenValidationParameters.ValidateLifetime = jwtSettings.ValidateLifetime; + options.TokenValidationParameters = tokenValidationParameters; + }); + + return services; + } + + + public static IServiceCollection AddJwt(this IServiceCollection services, + IConfiguration configuration) + { + + services.AddScoped(); + services.Configure(options => { configuration.Bind("JwtConfig", options); }); + JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); + services.AddAuthentication(options => + { + options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; + }).AddJwtBearer(options => + { + var jwtSettings = new JWTConfig(); + configuration.Bind("JwtConfig", jwtSettings); + options.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/") || path.StartsWithSegments("/fishinghub") || path.StartsWithSegments("/fishingroomhub"))) + { + context.Token = accessToken; + } + else + { + context.Token = context.HttpContext.Request.Headers[jwtSettings.TokenKey].ToString(); + } + return Task.CompletedTask; + }, + OnAuthenticationFailed = context => + { + string s = context.Exception.Message; + return Task.CompletedTask; + }, + OnChallenge = context => + { + context.HandleResponse(); + var payload = JsonConvert.SerializeObject(new { code = 401, msg = "fail",info= "很抱歉,您无权访问该接口" }); + context.Response.ContentType = "application/json"; + context.Response.StatusCode = StatusCodes.Status200OK; + context.Response.WriteAsync(payload); + return Task.FromResult(0); + } + }; + var tokenValidationParameters = new TokenValidationParameters(); + + tokenValidationParameters.ValidateAudience = jwtSettings.ValidateAudience; + tokenValidationParameters.ValidAudience = jwtSettings.Audience; + + tokenValidationParameters.ValidateIssuer = jwtSettings.ValidateIssuer; + tokenValidationParameters.ValidIssuer = jwtSettings.Issuer; + + tokenValidationParameters.ValidateIssuerSigningKey = jwtSettings.ValidateIssuerSigningKey; + tokenValidationParameters.IssuerSigningKey = + new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.SecretKey)); + + tokenValidationParameters.ValidateLifetime = jwtSettings.ValidateLifetime; + options.TokenValidationParameters = tokenValidationParameters; + }); + return services; + } + } +} diff --git a/Infrastructure/JWTHelper/JWTHelper.csproj b/Infrastructure/JWTHelper/JWTHelper.csproj new file mode 100644 index 0000000..155dc4d --- /dev/null +++ b/Infrastructure/JWTHelper/JWTHelper.csproj @@ -0,0 +1,15 @@ + + + + net8.0 + enable + enable + + + + + + + + + diff --git a/Infrastructure/JWTHelper/JwtTools.cs b/Infrastructure/JWTHelper/JwtTools.cs new file mode 100644 index 0000000..22d4b85 --- /dev/null +++ b/Infrastructure/JWTHelper/JwtTools.cs @@ -0,0 +1,125 @@ + +using Microsoft.Extensions.Options; +using Microsoft.IdentityModel.Tokens; +using System; +using System.Collections.Generic; +using System.IdentityModel.Tokens.Jwt; +using System.Linq; +using System.Security.Claims; +using System.Text; + +namespace JWTHelper +{ + public class JwtTools + { + private JWTConfig config; + + public JwtTools(IOptions opts) + { + config = opts.Value; + } + public bool ValidateToken(string token) + { + try + { + SymmetricSecurityKey key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config.SecretKey)); + var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); + + var tokenValidationParameters = new TokenValidationParameters(); + + tokenValidationParameters.ValidateAudience = config.ValidateAudience; + tokenValidationParameters.ValidAudience = config.Audience; + + tokenValidationParameters.ValidateIssuer = config.ValidateIssuer; + tokenValidationParameters.ValidIssuer = config.Issuer; + + tokenValidationParameters.ValidateIssuerSigningKey = config.ValidateIssuerSigningKey; + tokenValidationParameters.IssuerSigningKey = + new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config.SecretKey)); + + tokenValidationParameters.ValidateLifetime = config.ValidateLifetime; + SecurityToken securityToken = null; + var identiy = new JwtSecurityTokenHandler().ValidateToken(token, tokenValidationParameters, out securityToken); + return identiy.Claims.Count(n => n.Type == "uid" || n.Type == "uname") >= 2; + } + catch + { + return false; + } + + } + + + public string CreateToken(Claim[] claims) + { + var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config.SecretKey)); + var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); + var token = new JwtSecurityToken( + issuer: config.Issuer, + // audience: jwtconfig.Audience, + claims: claims, + expires: DateTime.Now.AddMinutes(60), + signingCredentials: creds + ); + + return new JwtSecurityTokenHandler().WriteToken(token); + } + + + public static string GetTokenContent(string token, string key) + { + if (!string.IsNullOrEmpty(token)) + { + try + { + var securityTokenHandler = new JwtSecurityTokenHandler(); + + var claims = securityTokenHandler.ReadJwtToken(token).Payload; + + return claims.Claims.FirstOrDefault(n => n.Type == key)?.Value ?? ""; + } + catch + { + return ""; + } + } + else + { + return ""; + } + } + + public static string GetTokenReverseContent(string token, string key) + { + if (!string.IsNullOrEmpty(token)) + { + try + { + var securityTokenHandler = new JwtSecurityTokenHandler(); + + var claims = securityTokenHandler.ReadJwtToken(token).Payload; + + return new string((claims.Claims.FirstOrDefault(n => n.Type == key)?.Value ?? "").ToCharArray() + .AsEnumerable().Reverse().ToArray()); + } + catch + { + return ""; + } + } + else + { + return ""; + } + } + + public static IEnumerable GetTokenClaim(string token) + { + var securityTokenHandler = new JwtSecurityTokenHandler(); + + var claims = securityTokenHandler.ReadJwtToken(token).Payload; + + return claims.Claims; + } + } +} diff --git a/Infrastructure/JWTHelper/Md5Helper.cs b/Infrastructure/JWTHelper/Md5Helper.cs new file mode 100644 index 0000000..2babf53 --- /dev/null +++ b/Infrastructure/JWTHelper/Md5Helper.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; + +namespace JWTHelper +{ + sealed class Md5Helper + { + public static string Encode(string ConvertString) + { + MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); + string t2 = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(ConvertString)), 4, 8); + t2 = t2.Replace("-", ""); + return t2; + } + + + } +} diff --git a/Infrastructure/MongoRepository/BsonCollectionAttribute.cs b/Infrastructure/MongoRepository/BsonCollectionAttribute.cs new file mode 100644 index 0000000..b3d1010 --- /dev/null +++ b/Infrastructure/MongoRepository/BsonCollectionAttribute.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MongoRepository.Attributes +{ + + [AttributeUsage(AttributeTargets.Class, Inherited = false)] + public class BsonCollectionAttribute : Attribute + { + public string CollectionName { get; } + public string DataBaseName { get; } + + public BsonCollectionAttribute(string collectionName, string dataBaseName) + { + CollectionName = collectionName; + DataBaseName = dataBaseName; + } + } +} diff --git a/Infrastructure/MongoRepository/Config/MongoDbSettings.cs b/Infrastructure/MongoRepository/Config/MongoDbSettings.cs new file mode 100644 index 0000000..4cdc946 --- /dev/null +++ b/Infrastructure/MongoRepository/Config/MongoDbSettings.cs @@ -0,0 +1,45 @@ +using System; + +namespace MongoRepository.Config +{ + public interface IMongoDbSettings + { + /// + /// ServerUrl + /// + public string ServerUrl { get; set; } + + public string Username { get; set; } + + public string Password { get; set; } + + public string Database { get; set; } + } + + public class MongoDbSettings : IMongoDbSettings + { + /// + /// ServerUrl + /// + public string ServerUrl { get; set; } + + public string Username { get; set; } + + public string Password { get; set; } + + public string Database { get; set; } = "data_0524"; + } + + public static class ServiceDatabases + { + public const string User = "data_0524_user"; + + public const string Admin = "data_0524_admin"; + + public const string Fish = "data_0524_fish"; + + public const string Chess = "data_0524_chess"; + + public const string Customer = "data_0524_customer"; + } +} diff --git a/Infrastructure/MongoRepository/IMongoBaseRepository.cs b/Infrastructure/MongoRepository/IMongoBaseRepository.cs new file mode 100644 index 0000000..9eba96a --- /dev/null +++ b/Infrastructure/MongoRepository/IMongoBaseRepository.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; +using MongoDB.Bson; +using MongoDB.Driver; + +namespace MongoRepository +{ + public interface IMongoBaseRepository where TDocument : MongoBaseEntity + { + IQueryable AsQueryable(); + + IEnumerable FilterBy(Expression> filterExpression); + + Task> FilterByAsync( + Expression> filterExpression); + Task> FilterByAsync( + FilterDefinition filterExpression); + IEnumerable FilterBy(FilterDefinition filterExpression); + Task CountAsync( + Expression> filterExpression); + + long Count( + Expression> filterExpression); + Task CountAsync( + FilterDefinition filterExpression); + long Count(FilterDefinition filterExpression); + + IEnumerable FilterBy( + Expression> filterExpression, + Expression> projectionExpression); + + TDocument FindOne(Expression> filterExpression); + + Task FindOneAsync(Expression> filterExpression); + TDocument FindOne(FilterDefinition filterExpression); + + Task FindOneAsync(FilterDefinition filterExpression); + TDocument FindOne(FilterDefinition filterExpression, Expression> orderExpression); + + + Task FindOneAsync(FilterDefinition filterExpression, Expression> orderExpression); + + + TDocument FindOne(Expression> filterExpression, Expression> orderExpression); + + + Task FindOneAsync(Expression> filterExpression, Expression> orderExpression); + TDocument FindById(string id); + + Task FindByIdAsync(string id); + + (long count, List list) QueryPage(Expression> filterExpression, Expression> orderExpression, bool desc, int pageSize, int pageIndex); + Task<(long count, List list)> QueryPageAsync(Expression> filterExpression, int pageSize, int pageIndex); + Task<(long count, List list)> QueryPageAsync(Expression> filterExpression, Expression> orderExpression, bool desc, int pageSize, int pageIndex); + + + Task<(long count, List list)> QueryPageAsync(Expression> filterExpression, Expression> orderExpression, bool desc, int pageSize, int pageIndex, int skipIndex); + + + Task<(long count, List list)> QueryPageAsync(FilterDefinition filterExpression, SortDefinition orderExpression, bool desc, int pageSize, int pageIndex); + Task<(long count, List list)> QueryPageAsync(FilterDefinition filterExpression, SortDefinition orderExpression, bool desc, int pageSize, int pageIndex, int skipIndex); + + + + (bool ok, string message) InsertOne(TDocument document); + + Task<(bool ok, string message)> InsertOneAsync(TDocument document); + + (bool ok, string message) InsertMany(ICollection documents); + + Task<(bool ok, string message)> InsertManyAsync(ICollection documents); + + (bool ok, string message) UpdateById(string id, UpdateDefinition updateDefinition); + + Task<(bool ok, string message)> UpdateByIdAsync(string id, UpdateDefinition updateDefinition); + + (bool ok, string message) UpdateMany(Expression> filterExpression, UpdateDefinition updateDefinition); + + Task<(bool ok, string message)> UpdateManyAsync(Expression> filterExpression, UpdateDefinition updateDefinition); + + (bool ok, string message) UpdateMany(FilterDefinition filterExpression, UpdateDefinition updateDefinition); + Task<(bool ok, string message)> UpdateManyAsync(FilterDefinition filterExpression, UpdateDefinition updateDefinition); + + + (bool ok, string message) ReplaceOne(TDocument document); + + Task<(bool ok, string message)> ReplaceOneAsync(TDocument document); + + (bool ok, string message) DeleteOne(Expression> filterExpression); + + Task<(bool ok, string message)> DeleteOneAsync(Expression> filterExpression); + + (bool ok, string message) DeleteById(string id); + + Task<(bool ok, string message)> DeleteByIdAsync(string id); + + (bool ok, string message) DeleteMany(Expression> filterExpression); + + Task<(bool ok, string message)> DeleteManyAsync(Expression> filterExpression); + + Task> Aggregate(FilterDefinition filterExpression, ProjectionDefinition group); + + + + Task> RandomData(Expression> filterExpression, int count); + + + } +} diff --git a/Infrastructure/MongoRepository/MongoBaseEntity.cs b/Infrastructure/MongoRepository/MongoBaseEntity.cs new file mode 100644 index 0000000..36d1fab --- /dev/null +++ b/Infrastructure/MongoRepository/MongoBaseEntity.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Common.Utils; +using MongoDB.Bson.Serialization.Attributes; + +namespace MongoRepository +{ + public class MongoBaseEntity + { + [BsonElement("_id")] + public string Id { get; set; } = Guid.NewGuid().ToString("N"); + + [BsonElement("isdelete")] + public bool IsDelete { get; set; } = false; + [Column(TypeName = "jsonb")] + public OptionUserInfo? CreateInfo { get; set; } + + + } + [BsonIgnoreExtraElements] + public class OptionUserInfo + { + public OptionUserInfo(string userId, string userName) + { + UserId = userId; + UserName = userName; + OptionTime = DateTime.Now.ToTimeStamp(); + } + public OptionUserInfo() + { + } + + public string UserId { get; set; } + public string UserName { get; set; } + public long OptionTime { get; set; } + } +} diff --git a/Infrastructure/MongoRepository/MongoBaseRepository.cs b/Infrastructure/MongoRepository/MongoBaseRepository.cs new file mode 100644 index 0000000..eb621d4 --- /dev/null +++ b/Infrastructure/MongoRepository/MongoBaseRepository.cs @@ -0,0 +1,702 @@ +using Common; +using MongoDB.Bson; +using MongoDB.Driver; +using MongoDB.Driver.Linq; +using MongoRepository.Attributes; +using MongoRepository.Config; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Threading.Tasks; + +using Microsoft.Extensions.Logging; + +namespace MongoRepository +{ + public class MongoBaseRepository : IMongoBaseRepository where TDocument : MongoBaseEntity + { + public readonly IMongoCollection _collection; + private readonly ILogger> _logger; + private static readonly HashSet _indexedCollections = new(); + + public MongoBaseRepository(IMongoDbSettings settings, ILogger> logger) + { + _logger = logger; + var mongoUrl = new MongoUrlBuilder($"{settings.ServerUrl.TrimEnd('/')}") + { + Username = settings.Username, + Password = settings.Password, + DatabaseName = GetDataBaseName(typeof(TDocument)) + }.ToMongoUrl(); + + var client = new MongoClient(mongoUrl); + + EnsureDatabaseAndUser(client, settings, GetDataBaseName(typeof(TDocument))); + + var database = client.GetDatabase(GetDataBaseName(typeof(TDocument))); + _collection = database.GetCollection(GetCollectionName(typeof(TDocument))); + + EnsureIndexes(database); + } + + private void EnsureIndexes(IMongoDatabase database) + { + var collectionName = GetCollectionName(typeof(TDocument)); + var key = $"{database.DatabaseNamespace.DatabaseName}:{collectionName}"; + + if (!_indexedCollections.Add(key)) + return; + + try + { + if (collectionName == "user") + { + var bsonCollection = database.GetCollection(collectionName); + var mobileIndex = new CreateIndexModel( + Builders.IndexKeys.Ascending("BaseInfo.Mobile"), + new CreateIndexOptions { Unique = true, Sparse = true, Name = "idx_baseinfo_mobile_unique" } + ); + var idCardIndex = new CreateIndexModel( + Builders.IndexKeys.Ascending("RealName.IDCard"), + new CreateIndexOptions { Unique = true, Sparse = true, Name = "idx_realname_idcard_unique" } + ); + bsonCollection.Indexes.CreateMany(new[] { mobileIndex, idCardIndex }); + + } + } + catch (Exception ex) + { + _logger.LogWarning(ex, "MongoDB 索引创建异常(可能已存在): collection={Collection}", collectionName); + } + } + + private void EnsureDatabaseAndUser(MongoClient client, IMongoDbSettings settings, string databaseName) + { + try + { + var databaseNames = client.ListDatabaseNames().ToList(); + + if (!databaseNames.Contains(databaseName)) + { + var tempDatabase = client.GetDatabase(databaseName); + var tempCollection = tempDatabase.GetCollection("temp_collection"); + + var tempDoc = new BsonDocument("temp", "init"); + tempCollection.InsertOne(tempDoc); + tempCollection.DeleteOne(new BsonDocument("temp", "init")); + } + } + catch (Exception ex) when (ex.GetType().Name == "MongoAuthenticationException") + { + + } + catch (Exception ex) + { + _logger.LogError(ex, "检查MongoDB数据库失败 database={DatabaseName}", databaseName); + } + } + + private protected string GetCollectionName(Type documentType) + { + var collectionName = ((BsonCollectionAttribute)documentType.GetCustomAttributes( + typeof(BsonCollectionAttribute), + true) + .FirstOrDefault())?.CollectionName; + var formatStr = Tools.RegexSubstring(collectionName, "{", "}"); + if (!string.IsNullOrEmpty(collectionName) && !string.IsNullOrEmpty(formatStr)) + { + collectionName = collectionName.Replace("{" + formatStr + "}", DateTime.Now.ToString(formatStr)); + } + return collectionName; + } + + private protected string GetDataBaseName(Type documentType) + { + return ((BsonCollectionAttribute)documentType.GetCustomAttributes( + typeof(BsonCollectionAttribute), + true) + .FirstOrDefault())?.DataBaseName; + } + public virtual IQueryable AsQueryable() + { + return _collection.AsQueryable(); + } + + public virtual IMongoCollection GetCollection() + { + return _collection; + } + + + public virtual IEnumerable FilterBy( + Expression> filterExpression) + { + return _collection.Find(filterExpression).ToEnumerable(); + } + public virtual async Task> FilterByAsync( + Expression> filterExpression) + { + return await _collection.Find(filterExpression).ToListAsync(); + } + public virtual async Task> FilterByAsync( + FilterDefinition filterExpression) + { + return await _collection.Find(filterExpression).ToListAsync(); + } + public virtual IEnumerable FilterBy( + FilterDefinition filterExpression) + { + return _collection.Find(filterExpression).ToEnumerable(); + } + + public virtual IEnumerable FilterBy( + Expression> filterExpression, + Expression> projectionExpression) + { + return _collection.Find(filterExpression).Project(projectionExpression).ToEnumerable(); + } + + public virtual TDocument FindOne(FilterDefinition filterExpression) + { + return _collection.Find(filterExpression).FirstOrDefault(); + } + + + public virtual Task FindOneAsync(FilterDefinition filterExpression) + { + return Task.Run(() => _collection.Find(filterExpression).FirstOrDefaultAsync()); + } + + + public virtual TDocument FindOne(Expression> filterExpression) + { + return _collection.Find(filterExpression).FirstOrDefault(); + } + + + public virtual Task FindOneAsync(Expression> filterExpression) + { + return Task.Run(() => _collection.Find(filterExpression).FirstOrDefaultAsync()); + } + + + public virtual TDocument FindOne(FilterDefinition filterExpression, Expression> orderExpression) + { + return _collection.Find(filterExpression).SortByDescending(orderExpression).FirstOrDefault(); + } + + + public virtual Task FindOneAsync(FilterDefinition filterExpression, Expression> orderExpression) + { + return Task.Run(() => _collection.Find(filterExpression).SortByDescending(orderExpression).FirstOrDefaultAsync()); + } + + + public virtual TDocument FindOne(Expression> filterExpression, Expression> orderExpression) + { + return _collection.Find(filterExpression).SortByDescending(orderExpression).FirstOrDefault(); + } + + + public virtual Task FindOneAsync(Expression> filterExpression, Expression> orderExpression) + { + return Task.Run(() => _collection.Find(filterExpression).SortByDescending(orderExpression).FirstOrDefaultAsync()); + } + + public virtual TDocument FindById(string id) + { + var filter = Builders.Filter.Eq(doc => doc.Id, id); + return _collection.Find(filter).SingleOrDefault(); + } + + public virtual Task FindByIdAsync(string id) + { + return Task.Run(() => + { + var filter = Builders.Filter.Eq(doc => doc.Id, id); + return _collection.Find(filter).SingleOrDefaultAsync(); + }); + } + public virtual (long count, List list) QueryPage(Expression> filterExpression, Expression> orderExpression, bool desc, int pageSize, int pageIndex) + { + pageSize = pageSize <= 0 ? 10 : pageSize; + pageIndex = pageIndex <= 0 ? 1 : pageIndex; + var count = _collection.Find(filterExpression).CountDocuments(); + if (count == 0) + { + return (0, new List()); + } + var query = _collection.Find(filterExpression); + if (desc) + { + query = query.SortByDescending(orderExpression); + } + else + { + query = query.SortBy(orderExpression); + } + var list = query.Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToList(); + return (count, list); + } + public virtual async Task<(long count, List list)> QueryPageAsync(Expression> filterExpression, int pageSize, int pageIndex) + { + try + { + pageSize = pageSize <= 0 ? 10 : pageSize; + pageIndex = pageIndex <= 0 ? 1 : pageIndex; + var count = await _collection.Find(filterExpression).CountDocumentsAsync(); + if (count == 0) + { + return (0, new List()); + } + + var query = _collection.Find(filterExpression); + var list = await query.Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToListAsync(); + return (count, list); + } + catch (Exception ex) + { + throw ex; + } + } + public virtual async Task<(long count, List list)> QueryPageAsync(Expression> filterExpression, + Expression> orderExpression, bool desc, int pageSize, int pageIndex) + { + try + { + pageSize = pageSize <= 0 ? 10 : pageSize; + pageIndex = pageIndex <= 0 ? 1 : pageIndex; + var count = await _collection.Find(filterExpression).CountDocumentsAsync(); + if (count == 0) + { + return (0, new List()); + } + + var query = _collection.Find(filterExpression); + if (desc) + { + query = query.SortByDescending(orderExpression); + } + else + { + query = query.SortBy(orderExpression); + } + + var list = await query.Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToListAsync(); + return (count, list); + } + catch (Exception ex) + { + throw ex; + } + } + + public virtual async Task<(long count, List list)> QueryPageAsync(Expression> filterExpression, + Expression> orderExpression, bool desc, int pageSize, int pageIndex, int skipCount) + { + try + { + pageSize = pageSize <= 0 ? 10 : pageSize; + pageIndex = pageIndex <= 0 ? 1 : pageIndex; + var count = await _collection.Find(filterExpression).CountDocumentsAsync(); + if (count == 0) + { + return (0, new List()); + } + + var query = _collection.Find(filterExpression); + if (desc) + { + query = query.SortByDescending(orderExpression); + } + else + { + query = query.SortBy(orderExpression); + } + + var list = await query.Skip((pageIndex - 1) * pageSize + skipCount).Limit(pageSize).ToListAsync(); + return (count - skipCount, list); + } + catch (Exception ex) + { + throw ex; + } + } + + public virtual async Task<(long count, List list)> QueryPageTwoOrderAsync(Expression> filterExpression, + Expression> orderExpression, Expression> thenorderExpression, bool desc, int pageSize, int pageIndex) + { + try + { + pageSize = pageSize <= 0 ? 10 : pageSize; + pageIndex = pageIndex <= 0 ? 1 : pageIndex; + var count = await _collection.Find(filterExpression).CountDocumentsAsync(); + if (count == 0) + { + return (0, new List()); + } + + var query = _collection.Find(filterExpression); + if (desc) + { + query = query.SortByDescending(orderExpression).ThenByDescending(thenorderExpression); + } + else + { + query = query.SortBy(orderExpression).ThenByDescending(thenorderExpression); + } + + var list = await query.Skip((pageIndex - 1) * pageSize ).Limit(pageSize).ToListAsync(); + return (count , list); + } + catch (Exception ex) + { + throw ex; + } + } + public virtual async Task<(long count, List list)> QueryPageAsync( + FilterDefinition filterExpression, SortDefinition orderExpression, bool desc, + int pageSize, int pageIndex) + { + try + { + pageSize = pageSize <= 0 ? 10 : pageSize; + pageIndex = pageIndex <= 0 ? 1 : pageIndex; + var count = await _collection.Find(filterExpression).CountDocumentsAsync(); + if (count == 0) + { + return (0, new List()); + } + + var query = _collection.Find(filterExpression).Sort(orderExpression); + + + var list = await query.Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToListAsync(); + return (count, list); + } + catch (Exception ex) + { + throw ex; + } + } + + + public virtual async Task<(long count, List list)> QueryPageAsync( + FilterDefinition filterExpression, SortDefinition orderExpression, bool desc, + int pageSize, int pageIndex, int skipIndex) + { + try + { + pageSize = pageSize <= 0 ? 10 : pageSize; + pageIndex = pageIndex <= 0 ? 1 : pageIndex; + var count = await _collection.Find(filterExpression).CountDocumentsAsync(); + if (count == 0) + { + return (0, new List()); + } + + var query = _collection.Find(filterExpression).Sort(orderExpression); + + + var list = await query.Skip((pageIndex - 1) * pageSize + skipIndex).Limit(pageSize).ToListAsync(); + return (count - skipIndex, list); + } + catch (Exception ex) + { + throw ex; + } + } + + + + public virtual (bool ok, string message) InsertOne(TDocument document) + { + try + { + _collection.InsertOne(document); + return (true, null); + } + catch (Exception ex) + { + + return (false, ex.Message); + } + } + + public virtual async Task<(bool ok, string message)> InsertOneAsync(TDocument document) + { + try + { + await Task.Run(() => _collection.InsertOneAsync(document)); + return (true, null); + } + catch (Exception ex) + { + + return (false, ex.Message); + } + } + + public (bool ok, string message) InsertMany(ICollection documents) + { + try + { + _collection.InsertMany(documents); + return (true, null); + } + catch (Exception ex) + { + + return (false, ex.Message); + } + } + + + public virtual async Task<(bool ok, string message)> InsertManyAsync(ICollection documents) + { + try + { + await Task.Run(() => _collection.InsertManyAsync(documents)); + return (true, null); + } + catch (Exception ex) + { + + return (false, ex.Message); + } + } + + public (bool ok, string message) ReplaceOne(TDocument document) + { + var filter = Builders.Filter.Eq(doc => doc.Id, document.Id); + + try + { + _collection.FindOneAndReplace(filter, document); + return (true, null); + } + catch (Exception ex) + { + + return (false, ex.Message); + } + + } + + public virtual (bool ok, string message) UpdateById(string id, UpdateDefinition updateDefinition) + { + var filter = Builders.Filter.Eq(doc => doc.Id, id); + var result = _collection.UpdateOne(filter, updateDefinition); + return (result.IsAcknowledged, null); + } + public virtual async Task<(bool ok, string message)> UpdateByIdAsync(string id, UpdateDefinition updateDefinition) + { + var filter = Builders.Filter.Eq(doc => doc.Id, id); + try + { + var result = await _collection.UpdateOneAsync(filter, updateDefinition); + return (result.IsAcknowledged, null); + } + catch (Exception ex) + { + + return (false, ex.Message); + } + } + public virtual async Task CountAsync( + Expression> filterExpression) + { + return await _collection.Find(filterExpression).CountDocumentsAsync(); + } + + public virtual long Count( + Expression> filterExpression) + { + return _collection.Find(filterExpression).CountDocuments(); + } + + + + public virtual async Task CountAsync( + FilterDefinition filterExpression) + { + return await _collection.Find(filterExpression).CountDocumentsAsync(); + } + + public virtual long Count( + FilterDefinition filterExpression) + { + return _collection.Find(filterExpression).CountDocuments(); + } + public virtual (bool ok, string message) UpdateMany(Expression> filterExpression, UpdateDefinition updateDefinition) + { + var result = _collection.UpdateMany(filterExpression, updateDefinition); + return (result.IsAcknowledged, null); + } + public virtual async Task<(bool ok, string message)> UpdateManyAsync(Expression> filterExpression, UpdateDefinition updateDefinition) + { + try + { + var result = await _collection.UpdateManyAsync(filterExpression, updateDefinition); + return (result.IsAcknowledged, null); + } + catch (Exception ex) + { + + return (false, ex.Message); + } + } + + public virtual (bool ok, string message) UpdateMany(FilterDefinition filterExpression, UpdateDefinition updateDefinition) + { + var result = _collection.UpdateMany(filterExpression, updateDefinition); + return (result.IsAcknowledged, null); + } + public virtual async Task<(bool ok, string message)> UpdateManyAsync(FilterDefinition filterExpression, UpdateDefinition updateDefinition) + { + try + { + var result = await _collection.UpdateManyAsync(filterExpression, updateDefinition); + return (result.IsAcknowledged, null); + } + catch (Exception ex) + { + + return (false, ex.Message); + } + } + + public virtual async Task<(bool ok, string message)> ReplaceOneAsync(TDocument document) + { + var filter = Builders.Filter.Eq(doc => doc.Id, document.Id); + try + { + await _collection.FindOneAndReplaceAsync(filter, document); + + return (true, null); + } + catch (Exception ex) + { + + return (false, ex.Message); + } + } + + public (bool ok, string message) DeleteOne(Expression> filterExpression) + { + try + { + _collection.FindOneAndDelete(filterExpression); + return (true, null); + } + catch (Exception ex) + { + + return (false, ex.Message); + } + } + + public async Task<(bool ok, string message)> DeleteOneAsync(Expression> filterExpression) + { + try + { + await Task.Run(() => _collection.FindOneAndDeleteAsync(filterExpression)); + return (true, null); + } + catch (Exception ex) + { + + return (false, ex.Message); + } + } + + public (bool ok, string message) DeleteById(string id) + { + var filter = Builders.Filter.Eq(doc => doc.Id, id); + try + { + _collection.FindOneAndDelete(filter); + return (true, null); + } + catch (Exception ex) + { + + return (false, ex.Message); + } + } + + public async Task<(bool ok, string message)> DeleteByIdAsync(string id) + { + var filter = Builders.Filter.Eq(doc => doc.Id, id); + try + { + var deleted = await _collection.FindOneAndDeleteAsync(filter); + if (deleted == null) + return (false, "记录不存在或已删除"); + return (true, null); + } + catch (Exception ex) + { + + return (false, ex.Message); + } + } + + public (bool ok, string message) DeleteMany(Expression> filterExpression) + { + try + { + _collection.DeleteMany(filterExpression); + return (true, null); + } + catch (Exception ex) + { + + return (false, ex.Message); + } + } + + public async Task<(bool ok, string message)> DeleteManyAsync(Expression> filterExpression) + { + try + { + await _collection.DeleteManyAsync(filterExpression); + + return (true, null); + } + catch (Exception ex) + { + + return (false, ex.Message); + } + } + public async Task> Aggregate(FilterDefinition filterExpression, ProjectionDefinition group) + { + try + { + var res = await Task.Run(() => _collection.Aggregate().Match(filterExpression).Group(group).ToList()); + return res; + } + catch (Exception ex) + { + return null; + } + } + + public async Task> RandomData(Expression> filterExpression, int count) + { + try + { + var res = await Task.Run(() => + _collection.AsQueryable().Where(filterExpression).Sample(count).ToList()); + return res; + } + catch (Exception ex) + { + return null; + } + } + } +} diff --git a/Infrastructure/MongoRepository/MongoRepository.csproj b/Infrastructure/MongoRepository/MongoRepository.csproj new file mode 100644 index 0000000..c48a3a4 --- /dev/null +++ b/Infrastructure/MongoRepository/MongoRepository.csproj @@ -0,0 +1,19 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + diff --git a/Infrastructure/RabbitMQHelper/Attributes/RabbitMQAttribute.cs b/Infrastructure/RabbitMQHelper/Attributes/RabbitMQAttribute.cs new file mode 100644 index 0000000..33e592e --- /dev/null +++ b/Infrastructure/RabbitMQHelper/Attributes/RabbitMQAttribute.cs @@ -0,0 +1,14 @@ +using System; + +namespace RabbitMQHelper.Attributes +{ + public class RabbitMQAttribute : Attribute + { + public string Topic { get; set; } + + public RabbitMQAttribute(string topic) + { + this.Topic = topic; + } + } +} \ No newline at end of file diff --git a/Infrastructure/RabbitMQHelper/ConsumerExecutorDescriptor.cs b/Infrastructure/RabbitMQHelper/ConsumerExecutorDescriptor.cs new file mode 100644 index 0000000..c412622 --- /dev/null +++ b/Infrastructure/RabbitMQHelper/ConsumerExecutorDescriptor.cs @@ -0,0 +1,15 @@ +using RabbitMQHelper.Attributes; +using System.Reflection; + +namespace RabbitMQHelper +{ + public class ConsumerExecutorDescriptor + { + public MethodInfo MethodInfo { get; set; } + + public TypeInfo ImplTypeInfo { get; set; } + + public RabbitMQAttribute Attribute { get; set; } + public string ClassName { get; set; } + } +} \ No newline at end of file diff --git a/Infrastructure/RabbitMQHelper/IRabbitSubscribe.cs b/Infrastructure/RabbitMQHelper/IRabbitSubscribe.cs new file mode 100644 index 0000000..f7aabcf --- /dev/null +++ b/Infrastructure/RabbitMQHelper/IRabbitSubscribe.cs @@ -0,0 +1,6 @@ +namespace RabbitMQHelper.Attributes +{ + public interface IRabbitSubscribe + { + } +} \ No newline at end of file diff --git a/Infrastructure/RabbitMQHelper/ISendMQMessage.cs b/Infrastructure/RabbitMQHelper/ISendMQMessage.cs new file mode 100644 index 0000000..4afa290 --- /dev/null +++ b/Infrastructure/RabbitMQHelper/ISendMQMessage.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace RabbitMQHelper +{ + public interface ISendMQMessage + { + Task Send(string topic, object value); + } +} \ No newline at end of file diff --git a/Infrastructure/RabbitMQHelper/InitRabbitMQSetup.cs b/Infrastructure/RabbitMQHelper/InitRabbitMQSetup.cs new file mode 100644 index 0000000..00c54ff --- /dev/null +++ b/Infrastructure/RabbitMQHelper/InitRabbitMQSetup.cs @@ -0,0 +1,85 @@ +using System; +using EasyNetQ; +using EasyNetQ.Topology; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Logging; + +namespace RabbitMQHelper +{ + public static class InitRabbitMQSetup + { + public static void AddInitMQ(this IServiceCollection services, Action setupAction, ILogger logger = null) + { + //#if NET5_0 + services.AddHttpContextAccessor();//(); +//#endif + + var options = new RabbitConfig(); + setupAction(options); + try + { + var bus = RabbitHutch.CreateBus($"host={options.Host};virtualHost={options.VirtualHost};username={options.UserName};password={options.Password}"); + bus.Advanced.Connected += delegate (object sender1, ConnectedEventArgs e1) { c_Conneted(sender1, e1, logger); }; + bus.Advanced.Disconnected += delegate (object sender1, DisconnectedEventArgs e1) { c_DisConnect(sender1, e1, logger); }; + services.AddSingleton(bus); + } + catch (Exception ex) + { + throw new Exception("MQ初始化异常:" + ex.Message); + } + services.AddSingleton(sp => options); + services.AddScoped(); + services.AddHostedService(); + + if (options.ListSubscribe != null) + { + foreach (var item in options.ListSubscribe) + { + if (options.DefaultRegisterWay.ToLower() == "singleton") + { + services.TryAddSingleton(item); + } + else if (options.DefaultRegisterWay.ToLower() == "scoped") + { + services.TryAddScoped(item); + } + else if (options.DefaultRegisterWay.ToLower() == "transient") + { + services.TryAddTransient(item); + } + + else + { + services.TryAddSingleton(item); + } + } + } + } + static void c_Conneted(object sender, EventArgs e, ILogger logger) + { + if (logger == null) + { + Console.WriteLine("RabbitMQ已链接"); + } + else + { + + } + } + static void c_DisConnect(object sender, EventArgs e, ILogger logger) + { + if (logger == null) + { + Console.WriteLine("RabbitMQ已断开"); + } + else + { + + } + } + + } + +} \ No newline at end of file diff --git a/Infrastructure/RabbitMQHelper/MQHostedService.cs b/Infrastructure/RabbitMQHelper/MQHostedService.cs new file mode 100644 index 0000000..9ea056b --- /dev/null +++ b/Infrastructure/RabbitMQHelper/MQHostedService.cs @@ -0,0 +1,123 @@ +using EasyNetQ; +using EasyNetQ.Topology; +using RabbitMQHelper.Attributes; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; +using RabbitMQHelper.Models; +using MongoDB.Driver; + +namespace RabbitMQHelper +{ + public class MQHostedService : BackgroundService + { + private readonly IServiceProvider _serviceProvider; + private readonly IBus _bus; + private readonly IRabbitConfig _mongoDBConfig; + private readonly IMongoCollection _collection; + private static readonly object lockHelper = new object(); + public MQHostedService(IServiceProvider serviceProvider, IBus bus, IRabbitConfig mongoDBConfig) + { + _serviceProvider = serviceProvider; + _bus = bus; + _mongoDBConfig = mongoDBConfig; + var database = new MongoClient(_mongoDBConfig.MongoConnectionString).GetDatabase(_mongoDBConfig.MongoDatabaseName); + _collection = database.GetCollection("mq_receive_record"); + } + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + var executorDescriptorList = new List(); + foreach (Type ty in _mongoDBConfig.ListSubscribe) + { + executorDescriptorList.AddRange(GetTopicAttributesDescription(ty.GetTypeInfo())); + } + + + var exchange = await _bus.Advanced.ExchangeDeclareAsync(_mongoDBConfig.DefaultExchange, ExchangeType.Topic); + + foreach (var item in executorDescriptorList) + { + using (var scope = _serviceProvider.GetRequiredService().CreateScope()) + { + var topic = item.Attribute.Topic; + var provider = scope.ServiceProvider; + var obj = ActivatorUtilities.GetServiceOrCreateInstance(provider, item.ImplTypeInfo.GetTypeInfo()); + + var subscriptId = $"{ item.ClassName.ToLower() }.{item.MethodInfo.Name.ToLower()}"; + + var queue = await _bus.Advanced.QueueDeclareAsync(subscriptId); + + await _bus.Advanced.BindAsync(exchange, queue, topic, null); + + _bus.Advanced.Consume(queue, (msg, info) => Task.Factory.StartNew(async () => + { + await ReceiveMessage(msg.Body, info.Queue, info.RoutingKey); + lock (lockHelper) + { + object[] parameters = new object[] { msg.Body.Data, msg.Body.Headers }; + item.MethodInfo.Invoke(obj, parameters); + } + })); + + //await _bus.PubSub.SubscribeAsync(subscriptId, async msg => + //{ + // await ReceiveMessage(msg, subscriptId, topic); + // object[] parameters = new object[] { msg.Data, msg.Headers }; + // item.MethodInfo.Invoke(obj, parameters); + + //}, x => x.WithTopic(topic).w); + } + } + await Task.Delay(Timeout.Infinite, stoppingToken); + } + public async Task ReceiveMessage(RabbitMessage msg,string subscriptId,string topic) + { + try { + //var database = new MongoClient(_mongoDBConfig.MongoConnectionString).GetDatabase(_mongoDBConfig.MongoDatabaseName); + //var collection = database.GetCollection("mq_receive_record"); + await _collection.InsertOneAsync(new ReceiveRecord(msg.RecordId, subscriptId, topic)); + } + catch (Exception ex) + { + + } + } + private IEnumerable GetTopicAttributesDescription(TypeInfo typeInfo) + { + foreach (var method in typeInfo.DeclaredMethods) + { + var topicAttr = method.GetCustomAttributes(true); + var topicAttributes = topicAttr as IList ?? topicAttr.ToList(); + + if (!topicAttributes.Any()) + { + continue; + } + + foreach (var attr in topicAttributes) + { + yield return InitDescriptor(attr, method, typeInfo, typeInfo.Name); + } + } + } + private ConsumerExecutorDescriptor InitDescriptor(RabbitMQAttribute attr, MethodInfo methodInfo, TypeInfo implType, string name) + { + var descriptor = new ConsumerExecutorDescriptor + { + Attribute = attr, + MethodInfo = methodInfo, + ImplTypeInfo = implType, + ClassName = name + }; + return descriptor; + } + } + +} \ No newline at end of file diff --git a/Infrastructure/RabbitMQHelper/Models/PublishRecord.cs b/Infrastructure/RabbitMQHelper/Models/PublishRecord.cs new file mode 100644 index 0000000..a96a93b --- /dev/null +++ b/Infrastructure/RabbitMQHelper/Models/PublishRecord.cs @@ -0,0 +1,40 @@ +using System; + + +namespace RabbitMQHelper.Models +{ + public class PublishRecord + { + public PublishRecord(string publishId, string topic,object message,bool success) + { + this.PublishId = publishId; + this.Topic = topic; + this.MessageContent = message; + this.Success = success; + } + public string id { get; set; } = Guid.NewGuid().ToString("N"); + public string PublishId { get; set; } + public string Topic { get; set; } + public object MessageContent { get; set; } + public bool Success { get; set; } + public DateTime PublishTime { get; set; } = DateTime.Now; + } + + public class ReceiveRecord + { + public ReceiveRecord(string publishId, string subscriptId, string topic) + { + this.PublishId = publishId; + this.SubscriptId = subscriptId; + this.Topic = topic; + } + + public string id { get; set; } = Guid.NewGuid().ToString("N"); + public string PublishId { get; set; } + public string SubscriptId { get; set; } + public string Topic { get; set; } + public DateTime ReceiveTime { get; set; } = DateTime.Now; + + } +} + diff --git a/Infrastructure/RabbitMQHelper/Properties/launchSettings.json b/Infrastructure/RabbitMQHelper/Properties/launchSettings.json new file mode 100644 index 0000000..bbde4be --- /dev/null +++ b/Infrastructure/RabbitMQHelper/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:60480/", + "sslPort": 44373 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "RabbitMQHelper": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:5001;http://localhost:5000" + } + } +} \ No newline at end of file diff --git a/Infrastructure/RabbitMQHelper/RabbitConfig.cs b/Infrastructure/RabbitMQHelper/RabbitConfig.cs new file mode 100644 index 0000000..ce3a91a --- /dev/null +++ b/Infrastructure/RabbitMQHelper/RabbitConfig.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; + +namespace RabbitMQHelper +{ + public interface IRabbitConfig + { + string Host { get; set; } + string VirtualHost { get; set; } + string UserName { get; set; } + string Password { get; set; } + List ListSubscribe { get; set; } + string MongoDatabaseName { get; set; } + string MongoConnectionString { get; set; } + string DefaultExchange { get; set; } + + string DefaultRegisterWay { get; set; } + } + public class RabbitConfig: IRabbitConfig + { + public string Host { get; set; } = "49.233.122.91"; + public string VirtualHost { get; set; } = "/"; + public string UserName { get; set; } = "guest"; + public string Password { get; set; } = "guest"; + public List ListSubscribe { get; set; } + public string MongoDatabaseName { get; set; } + public string MongoConnectionString { get; set; } + public string DefaultExchange { get; set; } = "hscw.default.topic"; + + + public string DefaultRegisterWay { get; set; } = "singleton"; + } +} \ No newline at end of file diff --git a/Infrastructure/RabbitMQHelper/RabbitMQHelper.csproj b/Infrastructure/RabbitMQHelper/RabbitMQHelper.csproj new file mode 100644 index 0000000..e0a6681 --- /dev/null +++ b/Infrastructure/RabbitMQHelper/RabbitMQHelper.csproj @@ -0,0 +1,18 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + diff --git a/Infrastructure/RabbitMQHelper/RabbitMessage.cs b/Infrastructure/RabbitMQHelper/RabbitMessage.cs new file mode 100644 index 0000000..3968229 --- /dev/null +++ b/Infrastructure/RabbitMQHelper/RabbitMessage.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace RabbitMQHelper +{ + public class RabbitMessage + { + public RabbitMessage(object data, Dictionary headers = null) + { + this.Data = data; + this.Headers = headers; + } + public string RecordId { get; set; } = Guid.NewGuid().ToString("N"); + public object Data { get; set; } + public Dictionary Headers { get; set; } + } +} \ No newline at end of file diff --git a/Infrastructure/RabbitMQHelper/SendMQMessage.cs b/Infrastructure/RabbitMQHelper/SendMQMessage.cs new file mode 100644 index 0000000..0c25a79 --- /dev/null +++ b/Infrastructure/RabbitMQHelper/SendMQMessage.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using EasyNetQ; +using EasyNetQ.Topology; +using RabbitMQHelper.Models; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Logging; +using MongoDB.Driver; + +namespace RabbitMQHelper +{ + public class SendMQMessage:ISendMQMessage + { + private readonly IBus _bus; + private readonly ILogger _logger; + private readonly IRabbitConfig _mongoDBConfig; + private readonly IMongoCollection _collection; + private readonly IHttpContextAccessor _httpContextAccessor; + + public SendMQMessage(IBus bus, ILogger logger, IRabbitConfig mongoDBConfig, IHttpContextAccessor httpContextAccessor) + { + _bus = bus; + _logger = logger; + _mongoDBConfig = mongoDBConfig; + _httpContextAccessor = httpContextAccessor; + var database = new MongoClient(_mongoDBConfig.MongoConnectionString).GetDatabase(_mongoDBConfig.MongoDatabaseName); + _collection = database.GetCollection("mq_publish_record"); + } + public async Task Send(string topic, object value) + { + if (!_bus.Advanced.IsConnected) + { + + return false; + } + Dictionary headers = new Dictionary(); + + if (_httpContextAccessor.HttpContext != null && _httpContextAccessor.HttpContext.Request != null && _httpContextAccessor.HttpContext.Request.Headers != null) + { + if (_httpContextAccessor.HttpContext.Request.Headers.ContainsKey("token")) + { + headers.Add("token", _httpContextAccessor.HttpContext.Request.Headers["token"].ToString() ?? ""); + } + + ; + } + bool success = false; + + var model = new RabbitMessage(value, headers); + + var exchange = await _bus.Advanced.ExchangeDeclareAsync(_mongoDBConfig.DefaultExchange, ExchangeType.Topic); + + var message = new Message(model); + await _bus.Advanced.PublishAsync(exchange, topic, false, message).ContinueWith(m => + { + if (m.IsCompleted && m.IsCompletedSuccessfully) + { + success = true; + } + else + { + _logger.LogError(m.Exception, "RabbitMQ消息推送失败 topic={Topic}", topic); + } + }); + try + { + await _collection.InsertOneAsync(new PublishRecord(model.RecordId, topic, value, success)); + } + catch (Exception ex) + { + _logger.LogError(ex, "RabbitMQ推送记录写入异常 topic={Topic}", topic); + } + + return success; + } + } +} diff --git a/Infrastructure/RedisHelper/DistributedLock.cs b/Infrastructure/RedisHelper/DistributedLock.cs new file mode 100644 index 0000000..78a6138 --- /dev/null +++ b/Infrastructure/RedisHelper/DistributedLock.cs @@ -0,0 +1,175 @@ +using Microsoft.Extensions.Logging; + +namespace RedisHelper +{ + public class DistributedLock : IDistributedLock + { + private readonly ICache _cache; + private readonly ILogger _logger; + + public DistributedLock(ICache cache, ILogger logger) + { + _cache = cache; + _logger = logger; + } + + public async Task TryExecuteAsync(string key, Func> action, int expiry = 30, bool retry = false, int retryDelay = 100) + { + string lockKey = GetLockKey(key); + string lockValue = Guid.NewGuid().ToString(); + + while (true) + { + if (TryAcquireLock(lockKey, lockValue, expiry)) + { + try + { + return await action(); + } + finally + { + ReleaseLock(lockKey, lockValue); + } + } + + if (!retry) + { +return default(T); + } + + await Task.Delay(retryDelay); + } + } + + public async Task TryExecuteAsync(string key, Func action, int expiry = 30, bool retry = false, int retryDelay = 100) + { + string lockKey = GetLockKey(key); + string lockValue = Guid.NewGuid().ToString(); + + while (true) + { + if (TryAcquireLock(lockKey, lockValue, expiry)) + { + try + { + await action(); + return true; + } + finally + { + ReleaseLock(lockKey, lockValue); + } + } + + if (!retry) + { +return false; + } + + await Task.Delay(retryDelay); + } + } + + public T TryExecute(string key, Func action, int expiry = 30, bool retry = false, int retryDelay = 100) + { + string lockKey = GetLockKey(key); + string lockValue = Guid.NewGuid().ToString(); + + while (true) + { + if (TryAcquireLock(lockKey, lockValue, expiry)) + { + try + { + return action(); + } + finally + { + ReleaseLock(lockKey, lockValue); + } + } + + if (!retry) + { +return default(T); + } + + Thread.Sleep(retryDelay); + } + } + + public bool TryExecute(string key, Action action, int expiry = 30, bool retry = false, int retryDelay = 100) + { + string lockKey = GetLockKey(key); + string lockValue = Guid.NewGuid().ToString(); + + while (true) + { + if (TryAcquireLock(lockKey, lockValue, expiry)) + { + try + { + action(); + return true; + } + finally + { + ReleaseLock(lockKey, lockValue); + } + } + + if (!retry) + { +return false; + } + + Thread.Sleep(retryDelay); + } + } + + private bool TryAcquireLock(string lockKey, string lockValue, int expiry) + { + try + { + var redis = _cache.GetFullRedis(); + + bool acquired = redis.Add(lockKey, lockValue, expiry); + + if (acquired) + { +} + + return acquired; + } + catch (Exception ex) + { + _logger.LogError(ex, $"获取分布式锁时发生错�? {lockKey}"); + return false; + } + } + + private void ReleaseLock(string lockKey, string lockValue) + { + try + { + var redis = _cache.GetFullRedis(); + + var currentValue = redis.Get(lockKey); + + if (currentValue == lockValue) + { + redis.Remove(lockKey); +} + } + catch (Exception ex) + { + _logger.LogError(ex, $"释放分布式锁时发生错�? {lockKey}"); + } + } + + private string GetLockKey(string key) + { + return $"{key}"; + } + } +} diff --git a/Infrastructure/RedisHelper/ICache.cs b/Infrastructure/RedisHelper/ICache.cs new file mode 100644 index 0000000..788a054 --- /dev/null +++ b/Infrastructure/RedisHelper/ICache.cs @@ -0,0 +1,124 @@ + +using NewLife.Caching; +using System; +using System.Collections.Generic; +using System.Text; + +namespace RedisHelper +{ + public interface ICache + { + FullRedis GetFullRedis(); + + void StartPipeline(); + + T Get(string key); + + IDictionary GetAll(List keys); + int Remove(string key); + void Clear(); + + + + void Clear(string pattern, int count = 1000); + + bool Insert(string key, T data); + + + bool Insert(string key, T data, int expireSeconds); + + + bool Insert(string key, T data, TimeSpan expireSeconds); + + + long IncrBy(string key, long value); + + bool SetAdd(string key, T value); + + bool SetContains(string key, T value); + + bool SetRemove(string key, T value); + + long SetCount(string key); + + List SetMembers(string key); + + bool InitDataToList(string key, List t); + + + + IEnumerable GetPatternKey(string pattern, int count = 1000); + + + IEnumerable GetPatternList(string pattern, int count = 1000); + + bool UpdateDataToList(string key, T t, Func predicate); + + bool Exists(string key); + + bool AddToList(string key, T t); + + bool RemoveFromList(string key, Func predicate); + + + IList GetList(string key); + + + bool InitDataToDictionary(string key, IDictionary t); + + + bool UpdateDataToDictionary(string key, T t, string dataKey); + + + bool RemoveFromDictionary(string key, string dataKey); + + Tuple,int> GetPageDescendingListFromDictionary(string key, int pageIndex, int pageSize, + Func filter, + Func sort); + + Tuple, int> GetPageDescendingListFromDictionary(string key, int pageIndex, + int pageSize, Func filter, + Func sort, int skipCount); + + Tuple,int> GetPageListFromDictionary(string key, int pageIndex, int pageSize, + Func filter, + Func sort); + + Tuple,int> GetPageListFromDictionary(string key, int pageIndex, int pageSize, + Func filter, + Func sort, int skipCount); + + + + IEnumerable GetListFromDictionary(string key, int pageIndex, int pageSize, + Func filter, + Func sort); + + + IEnumerable GetDescendingListFromDictionary(string key, int pageIndex, int pageSize, + Func filter, + Func sort); + + + + + + T GetFromDictionary(string key, string dataKey); + + + ICollection GetListFromDictionary(string key); + + + IEnumerable GetListFromDictionaryByFilter(string key, Func filter); + + int GetListCountFromDictionaryByFilter(string key, Func filter); + + bool AddTempContent(string tempId, T data, TimeSpan timeSpan); + + + T GetTempContent(string tempId); + + + + } +} diff --git a/Infrastructure/RedisHelper/IDistributedLock.cs b/Infrastructure/RedisHelper/IDistributedLock.cs new file mode 100644 index 0000000..0dfc61c --- /dev/null +++ b/Infrastructure/RedisHelper/IDistributedLock.cs @@ -0,0 +1,16 @@ +using System; +using System.Threading.Tasks; + +namespace RedisHelper +{ + public interface IDistributedLock + { + Task TryExecuteAsync(string key, Func> action, int expiry = 30, bool retry = false, int retryDelay = 100); + + Task TryExecuteAsync(string key, Func action, int expiry = 30, bool retry = false, int retryDelay = 100); + + T TryExecute(string key, Func action, int expiry = 30, bool retry = false, int retryDelay = 100); + + bool TryExecute(string key, Action action, int expiry = 30, bool retry = false, int retryDelay = 100); + } +} diff --git a/Infrastructure/RedisHelper/RedisCache.cs b/Infrastructure/RedisHelper/RedisCache.cs new file mode 100644 index 0000000..f71a982 --- /dev/null +++ b/Infrastructure/RedisHelper/RedisCache.cs @@ -0,0 +1,440 @@ +using NewLife.Caching; + +using Microsoft.Extensions.Logging; + +namespace RedisHelper +{ + public class RedisCache : ICache + { + public FullRedis fullRedis = null; + private readonly ILogger _logger; + + public RedisCache(RedisUrl config, ILogger logger) + { + _logger = logger; + fullRedis = FullRedis.Create(config.url); + fullRedis.MaxMessageSize = 16 * 1024 * 1024; + } + + public FullRedis GetFullRedis() + { + return fullRedis; + } + + ~RedisCache() + { + fullRedis.Dispose(); + } + public void StartPipeline() + { + fullRedis.StartPipeline(); + } + + public long IncrBy(string key, long value) + { + return fullRedis.Increment(key, value); + } + + public bool SetAdd(string key, T value) + { + var result = fullRedis.SADD(key, value); + return result > 0; + } + + public bool SetContains(string key, T value) + { + return fullRedis.SISMEMBER(key, value) > 0; + } + + public bool SetRemove(string key, T value) + { + return fullRedis.SREM(key, value) > 0; + } + + public long SetCount(string key) + { + return fullRedis.SCARD(key); + } + + public List SetMembers(string key) + { + return fullRedis.SMEMBERS(key).ToList(); + } + + private static readonly System.Text.Json.JsonSerializerOptions _jsonOptions = new() + { + PropertyNameCaseInsensitive = true, + WriteIndented = false + }; + + private static bool IsSimpleType(Type t) => + t == typeof(string) || t == typeof(long) || t == typeof(int) || t == typeof(bool) || t == typeof(double); + + public T Get(string key) + { + try + { + if (IsSimpleType(typeof(T))) + return fullRedis.Get(key); + + var json = fullRedis.Get(key); + if (json == null) return default; + return System.Text.Json.JsonSerializer.Deserialize(json, _jsonOptions); + } + catch + { + return default; + } + } + public IDictionary GetAll(List keys) + { + try + { + if (IsSimpleType(typeof(T))) + return fullRedis.GetAll(keys); + + var strDict = fullRedis.GetAll(keys); + if (strDict == null) return null; + var result = new Dictionary(); + foreach (var kv in strDict) + { + if (kv.Value != null) + result[kv.Key] = System.Text.Json.JsonSerializer.Deserialize(kv.Value, _jsonOptions); + } + return result; + } + catch + { + return null; + } + } + + public bool Insert(string key, T data) + { + if (IsSimpleType(typeof(T))) + return fullRedis.Set(key, data); + + var json = System.Text.Json.JsonSerializer.Serialize(data, _jsonOptions); + return fullRedis.Set(key, json); + } + + public bool Insert(string key, T data, int expireSeconds) + { + if (IsSimpleType(typeof(T))) + return fullRedis.Set(key, data, expireSeconds); + + var json = System.Text.Json.JsonSerializer.Serialize(data, _jsonOptions); + return fullRedis.Set(key, json, expireSeconds); + } + + public bool Insert(string key, T data, TimeSpan expireSeconds) + { + if (IsSimpleType(typeof(T))) + return fullRedis.Set(key, data, expireSeconds); + + var json = System.Text.Json.JsonSerializer.Serialize(data, _jsonOptions); + return fullRedis.Set(key, json, expireSeconds); + } + + public int Remove(string key) + { + return fullRedis.Remove(key); + } + + + public void Clear(string pattern, int count = 1000) + { + try + { + var keys = fullRedis.Search(pattern, count).ToArray(); + if (keys.Any()) + { + fullRedis.Remove(keys); + } + } + catch (Exception e) + { + _logger.LogError(e, "按表达式清理Redis键失败 pattern={Pattern} count={Count}", pattern, count); + } + } + + public IEnumerable GetPatternKey(string pattern, int count = 1000) + { + return fullRedis.Search(pattern, count).ToArray(); + } + + public IEnumerable GetPatternList(string pattern, int count = 1000) + { + var lstKey = fullRedis.Search(pattern, count).ToArray(); + + return lstKey.Select(item => fullRedis.Get(item)).ToList(); + } + + + + + public void Clear() + { + fullRedis.Clear(); + } + + public bool Exists(string key) + { + return fullRedis.ContainsKey(key); + } + + public IList GetList(string key) + { + return fullRedis.GetList(key); + } + + public bool AddToList(string key, T t) + { + try + { + var lst = fullRedis.GetList(key); + lst.Add(t); + return true; + } + catch (Exception ex) + { + return false; + } + } + + + public bool InitDataToList(string key, List t) + { + try + { + fullRedis.Remove(key); + var lst = fullRedis.GetList(key); + lst.Clear(); + foreach (var item in t) + { + lst.Add(item); + } + + return true; + } + catch (Exception ex) + { + return false; + } + } + + + public bool UpdateDataToList(string key, T t, Func predicate) + { + try + { + var lst = fullRedis.GetList(key); + + var data = lst.Where(predicate); + foreach (var item in data) + { + lst.Remove(item); + + } + + lst.Add(t); + return true; + } + catch (Exception ex) + { + return false; + } + } + + public bool RemoveFromList(string key, Func predicate) + { + var result = false; + var lst = fullRedis.GetList(key); + var data = lst.Where(predicate); + if (data != null) + { + foreach (var item in data) + { + result = lst.Remove(item); + } + } + + return result; + } + + + + + public bool InitDataToDictionary(string key, IDictionary t) + { + try + { + fullRedis.Remove(key); + var lst = fullRedis.GetDictionary(key); + // lst.Clear(); + foreach (var item in t) + { + lst.Add(item.Key, item.Value); + } + + return true; + } + catch (Exception ex) + { + return false; + } + } + + + public bool UpdateDataToDictionary(string key, T t, string dataKey) + { + try + { + var lst = fullRedis.GetDictionary(key); + lst.Remove(dataKey); + lst.Add(dataKey, t); + return true; + } + catch (Exception ex) + { + return false; + } + } + + public bool RemoveFromDictionary(string key, string dataKey) + { + var lst = fullRedis.GetDictionary(key); + return lst.Remove(dataKey); + } + + + public T GetFromDictionary(string key, string dataKey) + { + var lst = fullRedis.GetDictionary(key); + if (lst.ContainsKey(dataKey)) + { + return lst[dataKey]; + } + else + { + return default(T); + } + } + + public ICollection GetListFromDictionary(string key) + { + var dict = fullRedis.GetDictionary(key); + return dict.Values; + } + + public IEnumerable GetListFromDictionaryByFilter(string key, Func filter) + { + var dict = fullRedis.GetDictionary(key); + return dict.Values.Where(filter); + } + + + public int GetListCountFromDictionaryByFilter(string key, Func filter) + { + var dict = fullRedis.GetDictionary(key); + return dict.Values.Where(filter).Count(); + } + + + + public Tuple,int> GetPageDescendingListFromDictionary(string key, int pageIndex, int pageSize, Func filter, + Func sort) + { + var dict = fullRedis.GetDictionary(key); + var count = dict.Values.Where(filter).Count(); + var data= dict.Values.Where(filter) + .OrderByDescending(sort) + .Skip((pageIndex - 1) * pageSize).Take(pageSize); + return new Tuple, int>(data, count); + } + + public Tuple,int> GetPageDescendingListFromDictionary(string key, int pageIndex, int pageSize, Func filter, + Func sort,int skipCount) + { + var dict = fullRedis.GetDictionary(key); + var count = dict.Values.Where(filter).Count(); + var data= dict.Values.Where(filter) + .OrderByDescending(sort) + .Skip((pageIndex - 1) * pageSize+skipCount).Take(pageSize); + return new Tuple, int>(data, count); + } + + + public Tuple, int> GetPageListFromDictionary(string key, int pageIndex, int pageSize, + Func filter, + Func sort) + { + var dict = fullRedis.GetDictionary(key); + var count = dict.Values.Where(filter).Count(); + + var data = dict.Values.Where(filter) + .OrderBy(sort) + .Skip((pageIndex - 1) * pageSize).Take(pageSize); + + return new Tuple, int>(data, count); + } + + + public Tuple, int> GetPageListFromDictionary(string key, int pageIndex, int pageSize, + Func filter, + Func sort,int skipCount) + { + var dict = fullRedis.GetDictionary(key); + var count = dict.Values.Where(filter).Count(); + + var data = dict.Values.Where(filter) + .OrderBy(sort) + .Skip((pageIndex - 1) * pageSize+skipCount).Take(pageSize); + + return new Tuple, int>(data, count); + } + + public IEnumerable GetListFromDictionary(string key, int pageIndex, int pageSize, + Func filter, + Func sort) + { + var dict = fullRedis.GetDictionary(key); + var count = dict.Values.Where(filter).Count(); + + var data = dict.Values.Where(filter) + .OrderBy(sort) + .Skip((pageIndex - 1) * pageSize).Take(pageSize); + + return data; + } + + + public IEnumerable GetDescendingListFromDictionary(string key, int pageIndex, int pageSize, Func filter, + Func sort) + { + var dict = fullRedis.GetDictionary(key); + var data= dict.Values.Where(filter) + .OrderByDescending(sort) + .Skip((pageIndex - 1) * pageSize).Take(pageSize); + return data; + } + + + private string Temp="HS:Temp:{0}"; + + public bool AddTempContent(string tempId, T data, TimeSpan timeSpan) + { + string key = string.Format(Temp, tempId); + + return Insert(key, data, timeSpan); + + } + + + public T GetTempContent(string tempId) + { + string key = string.Format(Temp, tempId); + return Get(key); + } + } +} diff --git a/Infrastructure/RedisHelper/RedisConfig.cs b/Infrastructure/RedisHelper/RedisConfig.cs new file mode 100644 index 0000000..1e17c31 --- /dev/null +++ b/Infrastructure/RedisHelper/RedisConfig.cs @@ -0,0 +1,17 @@ +namespace RedisHelper +{ + public class RedisConfig + { + public string Host { get; set; } + + public int Port { get; set; } + public string Password { get; set; } + public string UserName { get; set; } = ""; + public int Database { get; set; } + + public override string ToString() + { + return $"Server={Host}:{Port};Password={Password};UserName={UserName};Db={Database}"; + } + } +} diff --git a/Infrastructure/RedisHelper/RedisHelper.csproj b/Infrastructure/RedisHelper/RedisHelper.csproj new file mode 100644 index 0000000..26b2054 --- /dev/null +++ b/Infrastructure/RedisHelper/RedisHelper.csproj @@ -0,0 +1,16 @@ + + + + net8.0 + enable + enable + + + + + + + + + + diff --git a/Infrastructure/RedisHelper/RedisServiceExtension.cs b/Infrastructure/RedisHelper/RedisServiceExtension.cs new file mode 100644 index 0000000..dde2c1a --- /dev/null +++ b/Infrastructure/RedisHelper/RedisServiceExtension.cs @@ -0,0 +1,49 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RedisHelper +{ + public static class RedisServiceExtension + { + public static IServiceCollection AddRedisCache(this IServiceCollection services, IConfiguration configuration) + { + services.AddSingleton(opts => + { + var setting = new RedisConfig(); + configuration.Bind("RedisConfig", setting); + return new RedisUrl { url = setting.ToString() }; + }); + services.AddScoped(); + services.AddScoped(); + return services; + } + + + public static IServiceCollection AddRedisCacheSingleton(this IServiceCollection services, IConfiguration configuration) + { + services.AddSingleton(opts => + { + var setting = new RedisConfig(); + configuration.Bind("RedisConfig", setting); + return new RedisUrl { url = setting.ToString() }; + }); + services.AddSingleton(); + services.AddSingleton(); + return services; + } + + + public static IServiceCollection AddRedisCache(this IServiceCollection services, string url) + { + services.AddSingleton(options => new RedisUrl { url = url }); + services.AddSingleton(); + services.AddSingleton(); + return services; + } + } +} diff --git a/Infrastructure/RedisHelper/RedisUrl.cs b/Infrastructure/RedisHelper/RedisUrl.cs new file mode 100644 index 0000000..eabb37f --- /dev/null +++ b/Infrastructure/RedisHelper/RedisUrl.cs @@ -0,0 +1,16 @@ +namespace RedisHelper +{ + public class RedisUrl + { + public RedisUrl() + { + + } + + //public RedisUrl(string url) + //{ + // _url = url; + //} + public string url { get; set; } + } +} \ No newline at end of file diff --git a/Infrastructure/ScheduledService/CronJobService.cs b/Infrastructure/ScheduledService/CronJobService.cs new file mode 100644 index 0000000..1094f21 --- /dev/null +++ b/Infrastructure/ScheduledService/CronJobService.cs @@ -0,0 +1,85 @@ +using Cronos; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; + +namespace ScheduledService; + +public class CronJobService : IHostedService, IDisposable +{ + private System.Timers.Timer? _timer; + private readonly CronExpression _expression; + private readonly TimeZoneInfo _timeZoneInfo; + private readonly ILogger _logger; + + public CronJobService(string cronExpression, TimeZoneInfo timeZoneInfo, ILogger? logger = null) + { + _expression = CronExpression.Parse(cronExpression, CronFormat.IncludeSeconds); + _timeZoneInfo = timeZoneInfo; + _logger = logger ?? NullLogger.Instance; + } + + public virtual async Task StartAsync(CancellationToken cancellationToken) + { + await ScheduleJob(cancellationToken); + } + + protected virtual async Task ScheduleJob(CancellationToken cancellationToken) + { + var next = _expression.GetNextOccurrence(DateTimeOffset.Now, _timeZoneInfo); + if (next.HasValue) + { + var delay = next.Value - DateTimeOffset.Now; + if (delay.TotalMilliseconds <= 0) + { + await ScheduleJob(cancellationToken); + return; + } + + _timer = new System.Timers.Timer(delay.TotalMilliseconds); + _timer.Elapsed += async (sender, args) => + { + _timer?.Dispose(); + _timer = null; + + try + { + if (!cancellationToken.IsCancellationRequested) + await DoWork(cancellationToken); + } + catch (Exception ex) + { + _logger.LogError(ex, "定时任务 DoWork 执行异常"); + } + + try + { + if (!cancellationToken.IsCancellationRequested) + await ScheduleJob(cancellationToken); + } + catch (Exception ex) + { + _logger.LogError(ex, "定时任务 ScheduleJob 调度异常"); + } + }; + _timer.Start(); + } + await Task.CompletedTask; + } + + public virtual async Task DoWork(CancellationToken cancellationToken) + { + await Task.CompletedTask; + } + + public virtual async Task StopAsync(CancellationToken cancellationToken) + { + _timer?.Stop(); + await Task.CompletedTask; + } + + public virtual void Dispose() + { + _timer?.Dispose(); + } +} diff --git a/Infrastructure/ScheduledService/ScheduleConfig.cs b/Infrastructure/ScheduledService/ScheduleConfig.cs new file mode 100644 index 0000000..64ed387 --- /dev/null +++ b/Infrastructure/ScheduledService/ScheduleConfig.cs @@ -0,0 +1,13 @@ +namespace ScheduledService; + +public interface IScheduleConfig +{ + string CronExpression { get; set; } + TimeZoneInfo TimeZoneInfo { get; set; } +} + +public class ScheduleConfig : IScheduleConfig +{ + public string CronExpression { get; set; } = "* * * * *"; + public TimeZoneInfo TimeZoneInfo { get; set; } = TimeZoneInfo.Local; +} diff --git a/Infrastructure/ScheduledService/ScheduledService.csproj b/Infrastructure/ScheduledService/ScheduledService.csproj new file mode 100644 index 0000000..381e833 --- /dev/null +++ b/Infrastructure/ScheduledService/ScheduledService.csproj @@ -0,0 +1,14 @@ + + + + net8.0 + enable + enable + + + + + + + + diff --git a/Infrastructure/ScheduledService/ScheduledServiceExtensions.cs b/Infrastructure/ScheduledService/ScheduledServiceExtensions.cs new file mode 100644 index 0000000..c7ab2bd --- /dev/null +++ b/Infrastructure/ScheduledService/ScheduledServiceExtensions.cs @@ -0,0 +1,28 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace ScheduledService; + +public static class ScheduledServiceExtensions +{ + public static IServiceCollection AddCronJob(this IServiceCollection services, Action> options) where T : CronJobService + { + if (options == null) + { + throw new ArgumentNullException(nameof(options), "Options cannot be null"); + } + + var config = new ScheduleConfig(); + options.Invoke(config); + + if (string.IsNullOrWhiteSpace(config.CronExpression)) + { + throw new ArgumentNullException(nameof(ScheduleConfig.CronExpression), "Cron expression cannot be null or empty"); + } + + services.AddSingleton>(config); + services.AddHostedService(); + + return services; + } +} diff --git a/Infrastructure/SharpAbp.Infrastructure.Api/Autofac/ApplicationModule.cs b/Infrastructure/SharpAbp.Infrastructure.Api/Autofac/ApplicationModule.cs new file mode 100644 index 0000000..f207f10 --- /dev/null +++ b/Infrastructure/SharpAbp.Infrastructure.Api/Autofac/ApplicationModule.cs @@ -0,0 +1,55 @@ +using System.Reflection; +using Autofac; +using CommonService; +using MongoRepository; +using RedisService; + +namespace SharpAbp.Infrastructure.Api.Autofac +{ + public abstract class ApplicationModule : global::Autofac.Module + { + protected abstract Assembly CurrentAssembly { get; } + + protected virtual Assembly[] GetServiceAssemblies() + { + return new[] { CurrentAssembly }; + } + + protected virtual bool RegisterMongoBaseService => true; + + protected override void Load(ContainerBuilder builder) + { + builder.RegisterGeneric(typeof(MongoBaseRepository<>)) + .As(typeof(IMongoBaseRepository<>)) + .InstancePerLifetimeScope(); + + if (RegisterMongoBaseService) + { + builder.RegisterGeneric(typeof(MongoBaseService<>)) + .As(typeof(IMongoBaseService<>)) + .InstancePerLifetimeScope(); + } + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + var serviceAssemblies = GetServiceAssemblies(); + foreach (var assembly in serviceAssemblies) + { + builder.RegisterAssemblyTypes(assembly) + .Where(t => t.Name.EndsWith("Service") && !t.IsAbstract) + .AsImplementedInterfaces() + .InstancePerLifetimeScope(); + } + + foreach (var assembly in serviceAssemblies) + { + builder.RegisterAssemblyTypes(assembly) + .Where(t => t.Name.EndsWith("Repository") && !t.IsAbstract) + .AsImplementedInterfaces() + .InstancePerLifetimeScope(); + } + } + } +} diff --git a/Infrastructure/SharpAbp.Infrastructure.Api/Configuration/AppSettings.cs b/Infrastructure/SharpAbp.Infrastructure.Api/Configuration/AppSettings.cs new file mode 100644 index 0000000..d024bbc --- /dev/null +++ b/Infrastructure/SharpAbp.Infrastructure.Api/Configuration/AppSettings.cs @@ -0,0 +1,56 @@ +namespace SharpAbp.Infrastructure.Api.Configuration +{ + public class JwtConfig + { + public string TokenKey { get; set; } = "token"; + public string Issuer { get; set; } = "admin"; + public string Audience { get; set; } = ""; + public string SecretKey { get; set; } = ""; + public bool ValidateIssuer { get; set; } = false; + public bool ValidateAudience { get; set; } = false; + public bool ValidateIssuerSigningKey { get; set; } = false; + public bool ValidateLifetime { get; set; } = false; + } + + public class CapConfig + { + public string Host { get; set; } = "localhost"; + public string UserName { get; set; } = "admin"; + public string Password { get; set; } = ""; + public string VirtualHost { get; set; } = "/"; + public string PGLogHost { get; set; } = ""; + } + + public class RedisConfig + { + public string Host { get; set; } = "localhost"; + public int Port { get; set; } = 6379; + public string UserName { get; set; } = ""; + public string Password { get; set; } = ""; + public int Database { get; set; } = 0; + } + + public class WXConfig + { + public string AppId { get; set; } = ""; + public string Secret { get; set; } = ""; + public string Url { get; set; } = ""; + } + + public class AppSettings + { + public JwtConfig JwtConfig { get; set; } = new(); + public string PgSqlConnection { get; set; } = ""; + public CapConfig CapConfig { get; set; } = new(); + public RedisConfig RedisConfig { get; set; } = new(); + public MongoDbSettings MongoDbSettings { get; set; } = new(); + public WXConfig WXConfig { get; set; } = new(); + } + + public class MongoDbSettings + { + public string Username { get; set; } = ""; + public string Password { get; set; } = ""; + public string ServerUrl { get; set; } = ""; + } +} diff --git a/Infrastructure/SharpAbp.Infrastructure.Api/Configuration/ConfigurationHelper.cs b/Infrastructure/SharpAbp.Infrastructure.Api/Configuration/ConfigurationHelper.cs new file mode 100644 index 0000000..038a951 --- /dev/null +++ b/Infrastructure/SharpAbp.Infrastructure.Api/Configuration/ConfigurationHelper.cs @@ -0,0 +1,100 @@ +namespace SharpAbp.Infrastructure.Api.Configuration +{ + public static class ConfigurationHelper + { + public static string GetString(string key, string defaultValue = null) + { + var envValue = Environment.GetEnvironmentVariable(key); + if (!string.IsNullOrEmpty(envValue)) + { + return envValue; + } + return defaultValue; + } + + public static int GetInt(string key, int defaultValue = 0) + { + var envValue = Environment.GetEnvironmentVariable(key); + if (int.TryParse(envValue, out var result)) + { + return result; + } + return defaultValue; + } + + public static bool GetBool(string key, bool defaultValue = false) + { + var envValue = Environment.GetEnvironmentVariable(key); + if (bool.TryParse(envValue, out var result)) + { + return result; + } + return defaultValue; + } + + public static string GetConnectionString(string type) + { + return type.ToLower() switch + { + "mongodb" => GetMongoDBConnectionString(), + "redis" => GetRedisConnectionString(), + "rabbitmq" => GetRabbitMQConnectionString(), + "mysql" => GetMySQLConnectionString(), + _ => throw new ArgumentException($"Unknown connection type: {type}") + }; + } + + private static string GetMongoDBConnectionString() + { + var host = GetString("MONGODB_HOST", "localhost"); + var port = GetString("MONGODB_PORT", "27017"); + var user = GetString("MONGODB_USER", ""); + var password = GetString("MONGODB_PASSWORD", ""); + var database = GetString("MONGODB_DATABASE", "data_0524"); + + if (!string.IsNullOrEmpty(user) && !string.IsNullOrEmpty(password)) + { + return $"mongodb://{user}:{password}@{host}:{port}/{database}"; + } + return $"mongodb://{host}:{port}/{database}"; + } + + private static string GetRedisConnectionString() + { + var host = GetString("REDIS_HOST", "localhost"); + var port = GetString("REDIS_PORT", "6379"); + var password = GetString("REDIS_PASSWORD", ""); + var database = GetString("REDIS_DB", "0"); + + var connectionString = $"{host}:{port}"; + if (!string.IsNullOrEmpty(password)) + { + connectionString += $",password={password}"; + } + connectionString += $",defaultDatabase={database}"; + + return connectionString; + } + + private static string GetRabbitMQConnectionString() + { + var host = GetString("RABBITMQ_HOST", "localhost"); + var port = GetString("RABBITMQ_PORT", "5672"); + var user = GetString("RABBITMQ_USER", "guest"); + var password = GetString("RABBITMQ_PASSWORD", "guest"); + + return $"amqp://{user}:{password}@{host}:{port}"; + } + + private static string GetMySQLConnectionString() + { + var host = GetString("MYSQL_HOST", "localhost"); + var port = GetString("MYSQL_PORT", "3306"); + var user = GetString("MYSQL_USER", "root"); + var password = GetString("MYSQL_PASSWORD", ""); + var database = GetString("MYSQL_DATABASE", "data_0524"); + + return $"Server={host};Port={port};Database={database};User={user};Password={password};"; + } + } +} diff --git a/Infrastructure/SharpAbp.Infrastructure.Api/Controllers/BaseController.cs b/Infrastructure/SharpAbp.Infrastructure.Api/Controllers/BaseController.cs new file mode 100644 index 0000000..985e6fb --- /dev/null +++ b/Infrastructure/SharpAbp.Infrastructure.Api/Controllers/BaseController.cs @@ -0,0 +1,57 @@ +using System.Linq; +using System.Security.Claims; +using Microsoft.AspNetCore.Mvc; + +namespace SharpAbp.Infrastructure.Api.Controllers +{ + [ApiController] + public abstract class BaseController : Controller + { + public LoginUser loginUser + { + get + { + return GetLoginUser(); + } + } + + protected virtual LoginUser GetLoginUser() + { + var claims = User?.Claims?.ToList(); + if (claims == null || claims.Count == 0) + { + return null; + } + + var userId = claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value; + var userName = claims.FirstOrDefault(c => c.Type == ClaimTypes.Name)?.Value; + var role = claims.FirstOrDefault(c => c.Type == ClaimTypes.Role)?.Value; + + return new LoginUser + { + userId = userId, + userName = userName, + role = role + }; + } + + protected virtual string GetClientIp() + { + var ip = HttpContext.Request.Headers["X-Forwarded-For"].FirstOrDefault(); + if (string.IsNullOrEmpty(ip)) + { + ip = HttpContext.Connection.RemoteIpAddress?.ToString(); + } + return ip ?? "unknown"; + } + } + + public class LoginUser + { + public string userId { get; set; } + + public string userName { get; set; } + + public string role { get; set; } + } +} diff --git a/Infrastructure/SharpAbp.Infrastructure.Api/Extensions/ControllerExtensions.cs b/Infrastructure/SharpAbp.Infrastructure.Api/Extensions/ControllerExtensions.cs new file mode 100644 index 0000000..127f2d5 --- /dev/null +++ b/Infrastructure/SharpAbp.Infrastructure.Api/Extensions/ControllerExtensions.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using Common; +using Microsoft.AspNetCore.Mvc; + +namespace SharpAbp.Infrastructure.Api.Extensions +{ + public static class ControllerExtensions + { + public static BaseResponse ToFailResult( + this Controller controller, + string info) => new BaseResponse() { Info = info, Code = CommonResponseCodeEnum.ResultFail }; + + public static ListResponse ToListFailResult( + this Controller controller, + string info) => new ListResponse() + { Info = info, Code = CommonResponseCodeEnum.ResultFail }; + + public static PageResponse ToPageFailResult( + this Controller controller, + string info) => new PageResponse() + { + Code = CommonResponseCodeEnum.ResultFail, + Info = info + }; + + public static BaseResponse ToResult( + this Controller controller, + T obj, string info = null) => new BaseResponse() + { + Data = obj, + Info = info, + Code = CommonResponseCodeEnum.Success + }; + + public static ListResponse ToListResult( + this Controller controller, + IEnumerable list, string info = null) => new ListResponse() + { + Data = list, + Code = CommonResponseCodeEnum.Success, + Info = info + }; + + public static PageResponse ToPageResult( + this Controller controller, + IEnumerable list, int count = 0, string info = null) => new PageResponse() + { + Code = CommonResponseCodeEnum.Success, + Info = info, + Count = count, + Data = list + }; + + public static BaseResponse ToNoLoginResult( + this Controller controller) => new BaseResponse() + { + Info = "未登录", + Code = CommonResponseCodeEnum.NoLogin + }; + + public static BaseResponse ToTokenInvalidResult( + this Controller controller) => new BaseResponse() + { + Info = "token失效", + Code = CommonResponseCodeEnum.TokenInvalid + }; + + public static BaseResponse ToParamErrorResult( + this Controller controller, + string info = "请求参数错误") => new BaseResponse() + { + Info = info, + Code = CommonResponseCodeEnum.ParamError + }; + } +} diff --git a/Infrastructure/SharpAbp.Infrastructure.Api/Middleware/GlobalExceptionMiddleware.cs b/Infrastructure/SharpAbp.Infrastructure.Api/Middleware/GlobalExceptionMiddleware.cs new file mode 100644 index 0000000..9e265d2 --- /dev/null +++ b/Infrastructure/SharpAbp.Infrastructure.Api/Middleware/GlobalExceptionMiddleware.cs @@ -0,0 +1,82 @@ +using System.Net; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; + +namespace SharpAbp.Infrastructure.Api.Middleware +{ + public class GlobalExceptionMiddleware + { + private readonly RequestDelegate _next; + private readonly ILogger _logger; + + public GlobalExceptionMiddleware(RequestDelegate next, ILogger logger) + { + _next = next; + _logger = logger; + } + + public async Task InvokeAsync(HttpContext context) + { + try + { + await _next(context); + } + catch (Exception ex) + { + await HandleExceptionAsync(context, ex); + } + } + + private Task HandleExceptionAsync(HttpContext context, Exception ex) + { + if (ex is Common.BusinessException bizEx) + { + + return WriteJsonResponse(context, Common.CommonResponseCodeEnum.Error, bizEx.Message); + } + + if (ex is UnauthorizedAccessException) + { + + return WriteJsonResponse(context, Common.CommonResponseCodeEnum.NoAuth, "未授权访问"); + } + + if (ex is ArgumentException argEx) + { + + return WriteJsonResponse(context, Common.CommonResponseCodeEnum.ParamError, argEx.Message); + } + + if (ex is TimeoutException || ex is OperationCanceledException) + { + + return WriteJsonResponse(context, Common.CommonResponseCodeEnum.Error, "操作超时,请稍后重试: " + ex.Message); + } + + _logger.LogError(ex, "系统异常: {Message}", ex.Message); + return WriteJsonResponse(context, Common.CommonResponseCodeEnum.Exception, ex.Message); + } + + private static Task WriteJsonResponse(HttpContext context, Common.CommonResponseCodeEnum code, string message) + { + context.Response.StatusCode = 200; + context.Response.ContentType = "application/json"; + return context.Response.WriteAsync(JsonConvert.SerializeObject(new + { + code = code, + info = message, + data = (object?)null + })); + } + } + + public static class GlobalExceptionMiddlewareExtensions + { + public static IApplicationBuilder UseGlobalExceptionHandler(this IApplicationBuilder app) + { + return app.UseMiddleware(); + } + } +} diff --git a/Infrastructure/SharpAbp.Infrastructure.Api/Resilience/CircuitBreaker.cs b/Infrastructure/SharpAbp.Infrastructure.Api/Resilience/CircuitBreaker.cs new file mode 100644 index 0000000..306a76c --- /dev/null +++ b/Infrastructure/SharpAbp.Infrastructure.Api/Resilience/CircuitBreaker.cs @@ -0,0 +1,191 @@ +using System; +using System.Collections.Concurrent; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; + +namespace SharpAbp.Infrastructure.Api.Resilience +{ + public enum CircuitState + { + Closed, + + Open, + + HalfOpen + } + + public class CircuitBreakerOptions + { + public int FailureThreshold { get; set; } = 5; + + public int BreakDurationSeconds { get; set; } = 30; + + public int HalfOpenAttempts { get; set; } = 3; + + public int SuccessThreshold { get; set; } = 2; + } + + public class CircuitBreaker + { + private readonly CircuitBreakerOptions _options; + private readonly ILogger _logger; + private int _failureCount; + private int _successCount; + private int _halfOpenAttempts; + private CircuitState _state = CircuitState.Closed; + private DateTime _lastFailureTime; + private readonly object _lock = new(); + + public CircuitBreaker(string name, CircuitBreakerOptions options, ILogger logger) + { + Name = name; + _options = options; + _logger = logger; + } + + public string Name { get; } + public CircuitState State => _state; + + public async Task ExecuteAsync(Func> action) + { + if (!CanExecute()) + { +throw new CircuitBreakerOpenException($"Circuit breaker '{Name}' is open"); + } + + try + { + var result = await action(); + OnSuccess(); + return result; + } + catch (Exception ex) + { + OnFailure(ex); + throw; + } + } + + public async Task ExecuteAsync(Func action) + { + if (!CanExecute()) + { +throw new CircuitBreakerOpenException($"Circuit breaker '{Name}' is open"); + } + + try + { + await action(); + OnSuccess(); + } + catch (Exception ex) + { + OnFailure(ex); + throw; + } + } + + private bool CanExecute() + { + lock (_lock) + { + switch (_state) + { + case CircuitState.Closed: + return true; + + case CircuitState.Open: + var elapsed = (DateTime.UtcNow - _lastFailureTime).TotalSeconds; + if (elapsed >= _options.BreakDurationSeconds) + { + _state = CircuitState.HalfOpen; + _halfOpenAttempts = 0; +return true; + } + return false; + + case CircuitState.HalfOpen: + return _halfOpenAttempts < _options.HalfOpenAttempts; + + default: + return true; + } + } + } + + private void OnSuccess() + { + lock (_lock) + { + switch (_state) + { + case CircuitState.Closed: + _failureCount = 0; + break; + + case CircuitState.HalfOpen: + _successCount++; + _halfOpenAttempts++; + if (_successCount >= _options.SuccessThreshold) + { + _state = CircuitState.Closed; + _failureCount = 0; + _successCount = 0; +} + break; + } + } + } + + private void OnFailure(Exception ex) + { + lock (_lock) + { + _failureCount++; + _lastFailureTime = DateTime.UtcNow; + + switch (_state) + { + case CircuitState.Closed: + if (_failureCount >= _options.FailureThreshold) + { + _state = CircuitState.Open; +} + break; + + case CircuitState.HalfOpen: + _state = CircuitState.Open; + _halfOpenAttempts = _options.HalfOpenAttempts; +break; + } + } + } + } + + public class CircuitBreakerOpenException : Exception + { + public CircuitBreakerOpenException(string message) : base(message) { } + } + + public class CircuitBreakerFactory + { + private readonly ConcurrentDictionary _breakers = new(); + private readonly ILoggerFactory _loggerFactory; + + public CircuitBreakerFactory(ILoggerFactory loggerFactory) + { + _loggerFactory = loggerFactory; + } + + public CircuitBreaker GetOrCreate(string name, CircuitBreakerOptions options = null) + { + return _breakers.GetOrAdd(name, n => + { + var opts = options ?? new CircuitBreakerOptions(); + var logger = _loggerFactory.CreateLogger(); + return new CircuitBreaker(n, opts, logger); + }); + } + } +} diff --git a/Infrastructure/SharpAbp.Infrastructure.Api/SharpAbp.Infrastructure.Api.csproj b/Infrastructure/SharpAbp.Infrastructure.Api/SharpAbp.Infrastructure.Api.csproj new file mode 100644 index 0000000..32da8d6 --- /dev/null +++ b/Infrastructure/SharpAbp.Infrastructure.Api/SharpAbp.Infrastructure.Api.csproj @@ -0,0 +1,22 @@ + + + + net8.0 + enable + enable + SharpAbp.Infrastructure.Api + SharpAbp.Infrastructure.Api + + + + + + + + + + + + + + diff --git a/RedisService/IRedisService.cs b/RedisService/IRedisService.cs new file mode 100644 index 0000000..3952af5 --- /dev/null +++ b/RedisService/IRedisService.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using ChessGameDomain; +using CommonDomain; +using RedisService.Param; +using UserDomain.Entity; + +namespace RedisService +{ + public interface IRedisService + { + + + + + + RedisUserCid GetRedisUserCId(string userId); + void SetRedisUserCId(RedisUserCid redisUser); + void RemoveRedisUserCId(string userId); + + string GetLoginUserId(string cid); + void SetLoginUserId(string cid, string userId); + void RemoveLoginUserId(string cid); + + + IEnumerable GetAllLoginUserIds(); + + string GetUserId(string cid); + void SetUserId(string cid, string userId); + + void RemoveUserId(string cid); + + + + void SetVerificationCode(string phone, string code); + string GetVerificationCode(string phone); + + void RemoveVerificationCode(string phone); + + + void SetGameConfig(GameConfig gameConfig); + GameConfig GetGameConfig(); + + void RemoveGameConfig(); + + void SetActivityConfig(ActivityConfig config); + ActivityConfig GetActivityConfig(); + void RemoveActivityConfig(); + + void SetFishingKillConfig(FishingKillConfig config); + FishingKillConfig GetFishingKillConfig(); + + void SetFishSpawnConfig(string json); + + string GetFishSpawnConfig(); + + + void SetGameRoom(RedisGameRoom gameRoom); + + RedisGameRoom GetGameRoom(string roomId); + IEnumerable GetGameRoomList(string partition); + + + IEnumerable GetGameRoomAllList(); + void RemoveGameRoom(string partition); + + void RemoveGameRoomAll(); + + + void SetChessRoom(ChessGameRoom room); + + ChessGameRoom GetChessRoom(string roomId); + + List GetAllChessRooms(); + + List GetAllPlayingChessRooms(); + + string GetPendingFishRoomId(string userId); + + string GetPendingChessRoomId(string userId); + + void RemoveChessRoom(string roomId); + void ClearAllChessRooms(); + void ClearAllGameRooms(); + void ClearAllUserMappings(); + void ClearAllLoginUserIds(); + + + + + void SetSystemGoldDay(long amount); + void AddSystemGoldDay(long gold); + long GetSystemGoldDay(); + + long IncrBy(string key, long value); + string GetString(string key); + void SetString(string key, string value); + + + long GetPlayerGold(string roomId, string userId); + void SetPlayerGold(string roomId, string userId, long gold); + + bool AddBulletId(string roomId, string userId, string bulletId); + bool ExistsBulletId(string roomId, string userId, string bulletId); + bool RemoveBulletId(string roomId, string userId, string bulletId); + long GetBulletCount(string roomId, string userId); + void ClearBulletIds(string roomId, string userId); + + void ClearPlayerRuntimeData(string roomId, string userId); + + void AddFishingTaskProgress(string roomId, string userId, int taskEvent, long count); + + Dictionary GetFishingTaskProgress(string roomId, string userId, IEnumerable taskEvents); + + void ClearFishingTaskProgress(string roomId, string userId, IEnumerable taskEvents); + + void AddFishingConsumeProgress(string roomId, string userId, long count); + long GetFishingConsumeProgress(string roomId, string userId); + void AddFishingExpProgress(string roomId, string userId, long count); + long GetFishingExpProgress(string roomId, string userId); + void ClearFishingRuntimeProgress(string roomId, string userId); + + PlayerFactor GetPlayerFactor(string roomId, string userId); + void SetPlayerFactor(string roomId, string userId, PlayerFactor factor); + void RemovePlayerFactor(string roomId, string userId); + + + List GetKillFishIds(string roomId); + void AddKillFishId(string roomId, string fishId); + bool ContainsKillFishId(string roomId, string fishId); + + } +} diff --git a/RedisService/Param/RedisGamePlayer.cs b/RedisService/Param/RedisGamePlayer.cs new file mode 100644 index 0000000..baf9a4e --- /dev/null +++ b/RedisService/Param/RedisGamePlayer.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UserDomain.Entity; + +namespace RedisService.Param +{ + public class RedisGamePlayer + { + public string UserId { get; set; } = string.Empty; + + public string UserName { get; set; } = string.Empty; + + public string UserNumber { get; set; } = string.Empty; + + public string Avatar { get; set; } = string.Empty; + + public bool IsRedName { get; set; } = false; + + public int Level { get; set; } = 0; + + public long Exp { get; set; } = 0; + + public long MaxExp { get; set; } = 0; + + public int VipLevel { get; set; } = 0; + + + public string CId { get; set; } = string.Empty; + + public long Gold { get; set; } = 0; + + public int Diamond { get; set; } = 0; + + public int Position { get; set; } = 0; + + public string CannonId { get; set; } = string.Empty; + + public string WingsId { get; set; } = string.Empty; + + public string WarGodId { get; set; } = string.Empty; + + public int CannonMultiple { get; set; } = 1; + + public long BeginCoin { get; set; } = 0; + + public long MaxGold { get; set; } = 0; + + public long BeginTime { get; set; } = 0; + public int State { get; set; } = 0; + + public PlayerFactor PlayerFactor { get; set; } = new PlayerFactor(); + + public long TotalRechargeGold { get; set; } = 0; + + public long SafeBoxGold { get; set; } = 0; + + public bool IsBot { get; set; } = false; + + public bool IsAfk { get; set; } = false; + } +} diff --git a/RedisService/Param/RedisGameRoom.cs b/RedisService/Param/RedisGameRoom.cs new file mode 100644 index 0000000..f1f2a5d --- /dev/null +++ b/RedisService/Param/RedisGameRoom.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CommonDomain.Enum; + +namespace RedisService.Param +{ + public class RedisGameRoom + { + + public string RoomId { get; set; } = string.Empty; + + public string RoomName { get; set; } = string.Empty; + public GameTypeEnum GameType { get; set; } = GameTypeEnum.风雷之渊; + + public int RoomLevel { get; set; } = 0; + + public int RoomPartition { get; set; } = 0; + + public int RoomNumber { get; set; } = 0; + + public int MaxPlayerCount { get; set; } = 4; + + public int CurrentOnlinePlayerCount { get; set; } = 0; + + + public int RobotCount { get; set; } = 0; + + public List Players { get; set; } = new List(); + + + + public string CreateUserId { get; set; } + + public double SystemFactor { get; set; } = 1.0; + + } +} diff --git a/RedisService/Param/RedisUserCid.cs b/RedisService/Param/RedisUserCid.cs new file mode 100644 index 0000000..f9cb617 --- /dev/null +++ b/RedisService/Param/RedisUserCid.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RedisService.Param +{ + public class RedisUserCid + { + public string CId { get; set; } + public string FishRoomCId { get; set; } = string.Empty; + + public string UserId { get; set; } + + public string UserName { get; set; } + + public string RoomId { get; set; } + + public string PartitionId { get; set; } + + public string LoginCId { get; set; } + + + } +} diff --git a/RedisService/Param/RoomBotFactory.cs b/RedisService/Param/RoomBotFactory.cs new file mode 100644 index 0000000..da74140 --- /dev/null +++ b/RedisService/Param/RoomBotFactory.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using CommonDomain; +using CommonDomain.BaseModel; +using CommonDomain.Enum; +using UserDomain.Entity; + +namespace RedisService.Param +{ + public static class RoomBotFactory + { + public static readonly int[] FixedBotSeats = Array.Empty(); + + public static bool FixedBotSeatsEnabled => FixedBotSeats.Length > 0; + + public static RedisGamePlayer CreateBot(int position, RoomConfig roomConfig, GameConfig gameConfig, IReadOnlyList botProfiles) + { + if (roomConfig?.CannonMultipleList == null || roomConfig.CannonMultipleList.Count == 0 + || botProfiles == null || botProfiles.Count == 0) + return null; + + var profile = botProfiles[System.Random.Shared.Next(botProfiles.Count)]; + var maxMultiple = roomConfig.CannonMultipleList.Max(); + var gold = maxMultiple * System.Random.Shared.Next(100, 501); + var props = gameConfig?.PropConfig ?? new List(); + var cannons = props.Where(p => p.Type == ProductTypeEnum.炮台 && p.IsEnable && !p.Number.StartsWith("401")).ToList(); + var wings = props.Where(p => p.Type == ProductTypeEnum.翅膀 && p.IsEnable && p.IsSale).ToList(); + var warGods = props.Where(p => p.Type == ProductTypeEnum.战神 && p.IsEnable && p.IsSale).ToList(); + + var botId = Guid.NewGuid().ToString("N"); + var botNumber = Common.Utils.RandomHelper.RandomNumbers(8); + return new RedisGamePlayer + { + UserId = botId, + UserNumber = botNumber, + UserName = profile.Name, + Avatar = profile.Avatar, + Level = System.Random.Shared.Next(1, 101), + IsBot = true, + Gold = gold, + Diamond = System.Random.Shared.Next(100, 5001), + Position = position, + CannonId = cannons.Count > 0 ? cannons[System.Random.Shared.Next(cannons.Count)].Number : string.Empty, + WingsId = wings.Count > 0 ? wings[System.Random.Shared.Next(wings.Count)].Number : string.Empty, + WarGodId = warGods.Count > 0 && System.Random.Shared.Next(5) == 0 + ? warGods[System.Random.Shared.Next(warGods.Count)].Number + : string.Empty, + CannonMultiple = roomConfig.CannonMultipleList[System.Random.Shared.Next(roomConfig.CannonMultipleList.Count)], + BeginCoin = gold, + BeginTime = new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds(), + CId = string.Empty, + State = 0, + PlayerFactor = new PlayerFactor() + }; + } + + public static List CreateFixedSeatBots(RedisGameRoom room, RoomConfig roomConfig, GameConfig gameConfig, IReadOnlyList botProfiles, IReadOnlyList fixedSeats = null) + { + var result = new List(); + if (room == null) + return result; + + fixedSeats ??= FixedBotSeats; + if (fixedSeats.Count == 0) + return result; + + room.Players ??= new List(); + foreach (var seat in fixedSeats.Distinct()) + { + if (seat < 0 || seat >= room.MaxPlayerCount) + continue; + if (room.Players.Any(p => p.Position == seat)) + continue; + + var bot = CreateBot(seat, roomConfig, gameConfig, botProfiles); + if (bot != null) + result.Add(bot); + } + return result; + } + } +} diff --git a/RedisService/RedisService.cs b/RedisService/RedisService.cs new file mode 100644 index 0000000..71d9bf1 --- /dev/null +++ b/RedisService/RedisService.cs @@ -0,0 +1,450 @@ +using System; +using System.Collections.Generic; +using System.Collections.Concurrent; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using ChessGameDomain; +using Common.Redis; +using CommonDomain; +using CommonDomain.BaseModel; +using RedisHelper; +using RedisService.Param; +using UserDomain.Entity; + +namespace RedisService +{ + public class RedisService : IRedisService + { + private readonly ICache _cache; + private static readonly ConcurrentDictionary GameRoomCache = new(); + private static readonly TimeSpan GameRoomReadCacheDuration = TimeSpan.FromSeconds(3); + + public RedisService(ICache cache) + { + _cache = cache; + } + + + + + + + public RedisUserCid GetRedisUserCId(string userId) + { + return _cache.Get(string.Format(RedisKey.UserCIDGID, userId)); + } + public void SetRedisUserCId(RedisUserCid redisUser) + { + _cache.Insert(string.Format(RedisKey.UserCIDGID, redisUser.UserId), redisUser); + } + public void RemoveRedisUserCId(string userId) + { + _cache.Remove(string.Format(RedisKey.UserCIDGID, userId)); + } + + private static readonly ConcurrentDictionary UserIdCache = new(); + + public string GetUserId(string cid) + { + UserIdCache.TryGetValue(cid, out var userId); + return userId; + } + + public void SetUserId(string cid, string userId) + { + UserIdCache[cid] = userId; + } + + public void RemoveUserId(string cid) + { + UserIdCache.TryRemove(cid, out _); + } + + + public string GetLoginUserId(string cid) + { + return _cache.Get(string.Format(RedisKey.LoginCIDUser, cid)); + } + public void SetLoginUserId(string cid, string userId) + { + _cache.Insert(string.Format(RedisKey.LoginCIDUser, cid), userId); + } + + + public IEnumerable GetAllLoginUserIds() + { + var list = _cache.GetPatternList(string.Format(RedisKey.LoginCIDUser, "*"), 100000); + return list; + } + + public void RemoveGameConfig() + { + _cache.Remove(RedisKey.GameConfig); + } + + public void SetActivityConfig(ActivityConfig config) + { + _cache.Insert(RedisKey.ActivityConfig, config); + } + public ActivityConfig GetActivityConfig() + { + return _cache.Get(RedisKey.ActivityConfig); + } + + public void RemoveActivityConfig() + { + _cache.Remove(RedisKey.ActivityConfig); + } + + private static string PlayerGoldKey(string roomId, string userId) => $"gold:{roomId}:{userId}"; + private static string PlayerBulletsKey(string roomId, string userId) => $"bullets:{roomId}:{userId}"; + private static string PlayerFactorKey(string roomId, string userId) => $"factor:{roomId}:{userId}"; + private static string RoomKillFishKey(string roomId) => $"killfish:{roomId}"; + private static string FishingTaskCountKey(string roomId, string userId, int taskEvent) => $"fishing:tasks:{roomId}:{userId}:{taskEvent}"; + private static string FishingConsumeKey(string roomId, string userId) => $"fishing:consume:runtime:{roomId}:{userId}"; + private static string FishingExpKey(string roomId, string userId) => $"fishing:exp:runtime:{roomId}:{userId}"; + + public long GetPlayerGold(string roomId, string userId) + { + return _cache.Get(PlayerGoldKey(roomId, userId)); + } + + public void SetPlayerGold(string roomId, string userId, long gold) + { + _cache.Insert(PlayerGoldKey(roomId, userId), gold); + } + + public bool AddBulletId(string roomId, string userId, string bulletId) + { + return _cache.SetAdd(PlayerBulletsKey(roomId, userId), bulletId); + } + + public bool ExistsBulletId(string roomId, string userId, string bulletId) + { + return _cache.SetContains(PlayerBulletsKey(roomId, userId), bulletId); + } + + public bool RemoveBulletId(string roomId, string userId, string bulletId) + { + return _cache.SetRemove(PlayerBulletsKey(roomId, userId), bulletId); + } + + public long GetBulletCount(string roomId, string userId) + { + return _cache.SetCount(PlayerBulletsKey(roomId, userId)); + } + + public void ClearBulletIds(string roomId, string userId) + { + _cache.Remove(PlayerBulletsKey(roomId, userId)); + } + + public void ClearPlayerRuntimeData(string roomId, string userId) + { + _cache.Remove(PlayerGoldKey(roomId, userId)); + _cache.Remove(PlayerBulletsKey(roomId, userId)); + _cache.Remove(PlayerFactorKey(roomId, userId)); + } + + public void AddFishingTaskProgress(string roomId, string userId, int taskEvent, long count) + { + if (count <= 0) return; + _cache.IncrBy(FishingTaskCountKey(roomId, userId, taskEvent), count); + } + + public Dictionary GetFishingTaskProgress(string roomId, string userId, IEnumerable taskEvents) + { + var result = new Dictionary(); + foreach (var taskEvent in taskEvents.Distinct()) + { + var count = _cache.Get(FishingTaskCountKey(roomId, userId, taskEvent)); + if (count > 0) result[taskEvent] = count; + } + return result; + } + + public void ClearFishingTaskProgress(string roomId, string userId, IEnumerable taskEvents) + { + foreach (var taskEvent in taskEvents.Distinct()) + _cache.Remove(FishingTaskCountKey(roomId, userId, taskEvent)); + } + + public void AddFishingConsumeProgress(string roomId, string userId, long count) + { + if (count > 0) _cache.IncrBy(FishingConsumeKey(roomId, userId), count); + } + + public long GetFishingConsumeProgress(string roomId, string userId) => _cache.Get(FishingConsumeKey(roomId, userId)); + + public void AddFishingExpProgress(string roomId, string userId, long count) + { + if (count > 0) _cache.IncrBy(FishingExpKey(roomId, userId), count); + } + + public long GetFishingExpProgress(string roomId, string userId) => _cache.Get(FishingExpKey(roomId, userId)); + + public void ClearFishingRuntimeProgress(string roomId, string userId) + { + _cache.Remove(FishingConsumeKey(roomId, userId)); + _cache.Remove(FishingExpKey(roomId, userId)); + } + + public PlayerFactor GetPlayerFactor(string roomId, string userId) + { + return _cache.Get(PlayerFactorKey(roomId, userId)); + } + + public void SetPlayerFactor(string roomId, string userId, PlayerFactor factor) + { + _cache.Insert(PlayerFactorKey(roomId, userId), factor); + } + + public void RemovePlayerFactor(string roomId, string userId) + { + _cache.Remove(PlayerFactorKey(roomId, userId)); + } + + public List GetKillFishIds(string roomId) + { + return _cache.SetMembers(RoomKillFishKey(roomId)); + } + + public void AddKillFishId(string roomId, string fishId) + { + _cache.SetAdd(RoomKillFishKey(roomId), fishId); + } + + public bool ContainsKillFishId(string roomId, string fishId) + { + return _cache.SetContains(RoomKillFishKey(roomId), fishId); + } + + public List GetAllPlayingChessRooms() + { + var allRooms = GetAllChessRooms(); + if (allRooms == null) + return new List(); + + return allRooms.Where(r => r.state == 2).ToList(); + } + + + public void SetFishingKillConfig(FishingKillConfig config) + { + _cache.Insert(RedisKey.FishingKillConfig, config); + } + public FishingKillConfig GetFishingKillConfig() + { + return _cache.Get(RedisKey.FishingKillConfig); + } + + public void SetFishSpawnConfig(string json) + { + _cache.Insert(RedisKey.FishSpawnConfig, json); + } + + public string GetFishSpawnConfig() + { + return _cache.Get(RedisKey.FishSpawnConfig); + } + + + public void SetGameRoom(RedisGameRoom gameRoom) + { + string Partition = $"{(int)gameRoom.GameType}{gameRoom.RoomLevel}{gameRoom.RoomPartition}"; + _cache.Insert(string.Format(RedisKey.GameRoomIdKey, Partition, gameRoom.RoomId), gameRoom); + GameRoomCache[gameRoom.RoomId] = new RoomCacheEntry(gameRoom, DateTime.UtcNow, true); + } + + public RedisGameRoom GetGameRoom(string roomId) + { + if (string.IsNullOrWhiteSpace(roomId)) + return null; + + var partition = roomId.Length >= 3 ? roomId.Substring(0, 3) : roomId.PadRight(3, '0'); + var room = _cache.Get(string.Format(RedisKey.GameRoomIdKey, partition, roomId)); + if (room != null) + GameRoomCache[roomId] = new RoomCacheEntry(room, DateTime.UtcNow, false); + else + GameRoomCache.TryRemove(roomId, out _); + return room; + } + public IEnumerable GetGameRoomList(string partition) + { + var list = _cache.GetPatternList(string.Format(RedisKey.GameRoomIdKey, partition, "*"), 100); + + return list; + } + + public IEnumerable GetGameRoomAllList() + { + var list = _cache.GetPatternList(string.Format(RedisKey.GameRoomIdKey, "*", "*"), 10000); + + return list; + } + + public string GetPendingFishRoomId(string userId) + { + if (string.IsNullOrWhiteSpace(userId)) + return string.Empty; + + var rooms = GetGameRoomAllList(); + if (rooms == null) + return string.Empty; + + var room = rooms.FirstOrDefault(r => + r != null && r.Players != null && r.Players.Any(p => p.UserId == userId && !p.IsBot)); + return room?.RoomId ?? string.Empty; + } + + public void RemoveGameRoom(string partition) + { + _cache.Clear(string.Format(RedisKey.GameRoomIdKey, partition, "*")); + foreach (var roomId in GameRoomCache.Keys.Where(id => id.StartsWith(partition, StringComparison.Ordinal))) + GameRoomCache.TryRemove(roomId, out _); + } + + public void RemoveGameRoomAll() + { + _cache.Clear(string.Format(RedisKey.GameRoomIdKey, "*", "*"), 50000); + GameRoomCache.Clear(); + } + + private sealed record RoomCacheEntry(RedisGameRoom Room, DateTime CachedAt, bool IsLocallyOwned); + + + public void SetGameConfig(GameConfig gameConfig) + { + _cache.Insert(RedisKey.GameConfig, gameConfig); + } + public GameConfig GetGameConfig() + { + return _cache.Get(RedisKey.GameConfig); + } + + + + + public void SetSystemGoldDay(long amount) + { + _cache.Insert(RedisKey.SystemGoldDayKey, amount); + } + public void AddSystemGoldDay(long gold) + { + _cache.IncrBy(RedisKey.SystemGoldDayKey, gold); + } + public long GetSystemGoldDay() + { + return _cache.Get(RedisKey.SystemGoldDayKey); + } + + + public void SetChessRoom(ChessGameRoom room) + { + string key = string.Format(RedisKey.ChessRoomKey, room.RoomId); + _cache.Insert(key, room); + } + + public ChessGameRoom GetChessRoom(string roomId) + { + string key = string.Format(RedisKey.ChessRoomKey, roomId); + return _cache.Get(key); + } + + public List GetAllChessRooms() + { + var pattern = RedisKeyGenerator.GameKey("chess:room:*"); + return _cache.GetPatternList(pattern, 10000) + ?.Select(r => r ?? new ChessGameRoom()) + .ToList() ?? new List(); + } + + public string GetPendingChessRoomId(string userId) + { + if (string.IsNullOrWhiteSpace(userId)) + return string.Empty; + + var rooms = GetAllChessRooms(); + if (rooms == null || rooms.Count == 0) + return string.Empty; + + var room = rooms.FirstOrDefault(r => + r != null && r.state == 2 && !r.IsGameEnded + && r.users != null && r.users.Any(u => u.userId == userId)); + return room?.RoomId ?? string.Empty; + } + + public void RemoveChessRoom(string roomId) + { + string key = string.Format(RedisKey.ChessRoomKey, roomId); + _cache.Remove(key); + } + + public void ClearAllChessRooms() + { + var pattern = RedisKeyGenerator.GameKey("chess:room:*"); + _cache.Clear(pattern, 50000); + } + + public void ClearAllGameRooms() + { + var pattern = RedisKeyGenerator.GameKey("room:model:*"); + _cache.Clear(pattern, 50000); + } + + public void ClearAllUserMappings() + { + var cidPattern = RedisKeyGenerator.UserKey("cid:*"); + var uidPattern = RedisKeyGenerator.UserKey("uid:*"); + _cache.Clear(cidPattern, 50000); + _cache.Clear(uidPattern, 50000); + } + + public void ClearAllLoginUserIds() + { + var cidPattern = RedisKeyGenerator.UserKey("cid:*"); + var uidPattern = RedisKeyGenerator.UserKey("uid:*"); + _cache.Clear(cidPattern, 100000); + _cache.Clear(uidPattern, 100000); + } + + + public void RemoveLoginUserId(string cid) + { + _cache.Remove(RedisKey.LoginCIDUser.Replace("{0}", cid)); + } + + public void SetVerificationCode(string phone, string code) + { + _cache.Insert(RedisKey.VerificationCode.Replace("{0}", phone), code, TimeSpan.FromMinutes(5)); + } + + public string GetVerificationCode(string phone) + { + return _cache.Get(RedisKey.VerificationCode.Replace("{0}", phone)); + } + + public void RemoveVerificationCode(string phone) + { + _cache.Remove(RedisKey.VerificationCode.Replace("{0}", phone)); + } + + public long IncrBy(string key, long value) + { + return _cache.IncrBy(key, value); + } + + public string GetString(string key) + { + return _cache.Get(key); + } + + public void SetString(string key, string value) + { + _cache.Insert(key, value); + } + + } +} diff --git a/RedisService/RedisService.csproj b/RedisService/RedisService.csproj new file mode 100644 index 0000000..c7c9a60 --- /dev/null +++ b/RedisService/RedisService.csproj @@ -0,0 +1,16 @@ + + + + net8.0 + enable + enable + + + + + + + + + + diff --git a/Template0524.sln b/Template0524.sln new file mode 100644 index 0000000..f345aef --- /dev/null +++ b/Template0524.sln @@ -0,0 +1,533 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36915.13 d17.14 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AdminSrc", "AdminSrc", "{3CA992F2-D491-4B3C-8119-7C668520F751}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "FishGameSrc", "FishGameSrc", "{64A61076-3A22-4599-9149-50D8F6C69E58}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Infrastructure", "Infrastructure", "{AC9055B0-3BC1-42F9-A31F-0D5B677A783B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdminApi", "AdminSrc\AdminApi\AdminApi.csproj", "{1BC20219-3D30-27AE-4A3A-8B4A05025DE9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdminHost", "AdminSrc\AdminHost\AdminHost.csproj", "{BCFACB2F-9919-4183-D77C-CF1B8A68FACA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdminService", "AdminSrc\AdminService\AdminService.csproj", "{441C530C-104F-414E-8DC0-306FDDDC7207}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common", "Infrastructure\Common\Common.csproj", "{3A2A1E05-C89F-BC17-FCD3-6F8AFF2F7BCA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JWTHelper", "Infrastructure\JWTHelper\JWTHelper.csproj", "{49F51185-A685-9166-D2C3-7A361903F799}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MongoRepository", "Infrastructure\MongoRepository\MongoRepository.csproj", "{7E894ED5-F334-F432-A512-8512866450E9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RabbitMQHelper", "Infrastructure\RabbitMQHelper\RabbitMQHelper.csproj", "{681F46EC-C9D8-C9CB-1912-BE90965F26F0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RedisHelper", "Infrastructure\RedisHelper\RedisHelper.csproj", "{E096C32B-F927-A1BC-E8D6-4E5D37710F8B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdminDomain", "AdminSrc\AdminDomain\AdminDomain.csproj", "{298D8870-F761-1233-5A8E-67376F45B3F1}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CommonDomain", "CommonDomain", "{F40585D9-BD3E-4C29-8CF7-01D78F3CF17D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommonDomain", "CommonDomain\CommonDomain.csproj", "{68806E84-C084-4ECB-87D8-63C91D81A2D0}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CommonService", "CommonService", "{48E9A122-27CD-4405-B962-AB52B3C01C0A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RedisService", "RedisService\RedisService.csproj", "{53E0F515-0D6C-4456-9299-A6431AD2211C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ChessGameSrc", "ChessGameSrc", "{09D343DB-EBC3-46E8-8F1C-EF20DB992ECD}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UserSrc", "UserSrc", "{B426D894-80BC-4454-B292-4D86A265B1A1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UserApi", "UserSrc\UserApi\UserApi.csproj", "{E0D430E8-17DE-2748-EE17-9FF29B7F2645}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UserHost", "UserSrc\UserHost\UserHost.csproj", "{FC025A5F-E170-6DF7-164A-BC21418EACEB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UserService", "UserSrc\UserService\UserService.csproj", "{05471F05-9357-9250-9DD8-380DC5E55CBC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChessGameDomain", "ChessGameSrc\ChessGameDomain\ChessGameDomain.csproj", "{20B1065A-BCCA-B800-453C-8D660F345D3E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChessGameService", "ChessGameSrc\ChessGameService\ChessGameService.csproj", "{EC52F799-73F2-3D21-E064-B73B3353B75D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FishGameService", "FishGameSrc\FishGameService\FishGameService.csproj", "{6C06FC79-8053-45D3-B3CE-BFC0C89C67A1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FishRoomService", "FishRoomService\FishRoomService.csproj", "{0CF8DD58-2593-4AEB-BB47-DC8F7B9CCA00}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommonService", "CommonService\CommonService.csproj", "{8A0B17C8-4C80-4D4F-8254-772C7E9F029F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FishRoomHost", "FishGameSrc\FishRoomHost\FishRoomHost.csproj", "{6D7B1DB6-E3BF-4103-9369-BB6E28D06278}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FishGameHost", "FishGameSrc\FishGameHost\FishGameHost.csproj", "{15C0A832-D721-45E3-8556-71F3D1CBBFE7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChessGameHost", "ChessGameHost\ChessGameHost.csproj", "{1A104125-6FBF-4C1C-B727-28125E4D9049}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UserDomain", "UserSrc\UserDomain\UserDomain.csproj", "{5BBEE994-F2CE-47F2-BA5D-8DC6DE5FC1CD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommonInfrastructure", "Infrastructure\CommonInfrastructure\CommonInfrastructure.csproj", "{1273BDF2-19A9-9986-7375-A2A9FEAC4FA9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CustomerSrc", "CustomerSrc", "{44DC4392-0776-43D9-B139-9BC0E5FE3EA5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CustomerApi", "CustomerSrc\CustomerApi\CustomerApi.csproj", "{664A9767-A668-52AA-7363-98C25FC30686}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CustomerService", "CustomerSrc\CustomerService\CustomerService.csproj", "{2E86CEFB-DBB8-1CE3-D98B-87E1772216F7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CustomerService.Domain", "CustomerSrc\CustomerService.Domain\CustomerService.Domain.csproj", "{3AC087D2-4F47-88D9-175E-61AF5FA56570}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpAbp.Infrastructure.Api", "Infrastructure\SharpAbp.Infrastructure.Api\SharpAbp.Infrastructure.Api.csproj", "{F4D5866E-19E8-496F-B43C-96F2E460E5CD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gateway", "Gateway\Gateway.csproj", "{430C217C-897A-42EE-996D-75A02FF22A50}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CustomerHost", "CustomerSrc\CustomerHost\CustomerHost.csproj", "{1AF38194-CE8A-4099-A848-36EE50B86608}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScheduledService", "Infrastructure\ScheduledService\ScheduledService.csproj", "{7902E0FC-18DD-401F-A2AE-9C4B396457AE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Bat", "Bat", "{9F19E0CB-778C-48E0-822B-1E9834B9FB90}" + ProjectSection(SolutionItems) = preProject + Bat\0524-admin.bat = Bat\0524-admin.bat + Bat\0524-all.bat = Bat\0524-all.bat + Bat\0524-chess.bat = Bat\0524-chess.bat + Bat\0524-customer.bat = Bat\0524-customer.bat + Bat\0524-fishgame.bat = Bat\0524-fishgame.bat + Bat\0524-fishroom.bat = Bat\0524-fishroom.bat + Bat\0524-gateway.bat = Bat\0524-gateway.bat + Bat\0524-user.bat = Bat\0524-user.bat + Bat\0524.bat = Bat\0524.bat + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdminApplication", "AdminSrc\AdminApplication\AdminApplication.csproj", "{B086F665-F5AD-1C7E-8DE2-EAE4B07B3B74}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1BC20219-3D30-27AE-4A3A-8B4A05025DE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1BC20219-3D30-27AE-4A3A-8B4A05025DE9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1BC20219-3D30-27AE-4A3A-8B4A05025DE9}.Debug|x64.ActiveCfg = Debug|Any CPU + {1BC20219-3D30-27AE-4A3A-8B4A05025DE9}.Debug|x64.Build.0 = Debug|Any CPU + {1BC20219-3D30-27AE-4A3A-8B4A05025DE9}.Debug|x86.ActiveCfg = Debug|Any CPU + {1BC20219-3D30-27AE-4A3A-8B4A05025DE9}.Debug|x86.Build.0 = Debug|Any CPU + {1BC20219-3D30-27AE-4A3A-8B4A05025DE9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1BC20219-3D30-27AE-4A3A-8B4A05025DE9}.Release|Any CPU.Build.0 = Release|Any CPU + {1BC20219-3D30-27AE-4A3A-8B4A05025DE9}.Release|x64.ActiveCfg = Release|Any CPU + {1BC20219-3D30-27AE-4A3A-8B4A05025DE9}.Release|x64.Build.0 = Release|Any CPU + {1BC20219-3D30-27AE-4A3A-8B4A05025DE9}.Release|x86.ActiveCfg = Release|Any CPU + {1BC20219-3D30-27AE-4A3A-8B4A05025DE9}.Release|x86.Build.0 = Release|Any CPU + {BCFACB2F-9919-4183-D77C-CF1B8A68FACA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BCFACB2F-9919-4183-D77C-CF1B8A68FACA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BCFACB2F-9919-4183-D77C-CF1B8A68FACA}.Debug|x64.ActiveCfg = Debug|Any CPU + {BCFACB2F-9919-4183-D77C-CF1B8A68FACA}.Debug|x64.Build.0 = Debug|Any CPU + {BCFACB2F-9919-4183-D77C-CF1B8A68FACA}.Debug|x86.ActiveCfg = Debug|Any CPU + {BCFACB2F-9919-4183-D77C-CF1B8A68FACA}.Debug|x86.Build.0 = Debug|Any CPU + {BCFACB2F-9919-4183-D77C-CF1B8A68FACA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BCFACB2F-9919-4183-D77C-CF1B8A68FACA}.Release|Any CPU.Build.0 = Release|Any CPU + {BCFACB2F-9919-4183-D77C-CF1B8A68FACA}.Release|x64.ActiveCfg = Release|Any CPU + {BCFACB2F-9919-4183-D77C-CF1B8A68FACA}.Release|x64.Build.0 = Release|Any CPU + {BCFACB2F-9919-4183-D77C-CF1B8A68FACA}.Release|x86.ActiveCfg = Release|Any CPU + {BCFACB2F-9919-4183-D77C-CF1B8A68FACA}.Release|x86.Build.0 = Release|Any CPU + {441C530C-104F-414E-8DC0-306FDDDC7207}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {441C530C-104F-414E-8DC0-306FDDDC7207}.Debug|Any CPU.Build.0 = Debug|Any CPU + {441C530C-104F-414E-8DC0-306FDDDC7207}.Debug|x64.ActiveCfg = Debug|Any CPU + {441C530C-104F-414E-8DC0-306FDDDC7207}.Debug|x64.Build.0 = Debug|Any CPU + {441C530C-104F-414E-8DC0-306FDDDC7207}.Debug|x86.ActiveCfg = Debug|Any CPU + {441C530C-104F-414E-8DC0-306FDDDC7207}.Debug|x86.Build.0 = Debug|Any CPU + {441C530C-104F-414E-8DC0-306FDDDC7207}.Release|Any CPU.ActiveCfg = Release|Any CPU + {441C530C-104F-414E-8DC0-306FDDDC7207}.Release|Any CPU.Build.0 = Release|Any CPU + {441C530C-104F-414E-8DC0-306FDDDC7207}.Release|x64.ActiveCfg = Release|Any CPU + {441C530C-104F-414E-8DC0-306FDDDC7207}.Release|x64.Build.0 = Release|Any CPU + {441C530C-104F-414E-8DC0-306FDDDC7207}.Release|x86.ActiveCfg = Release|Any CPU + {441C530C-104F-414E-8DC0-306FDDDC7207}.Release|x86.Build.0 = Release|Any CPU + {3A2A1E05-C89F-BC17-FCD3-6F8AFF2F7BCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3A2A1E05-C89F-BC17-FCD3-6F8AFF2F7BCA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3A2A1E05-C89F-BC17-FCD3-6F8AFF2F7BCA}.Debug|x64.ActiveCfg = Debug|Any CPU + {3A2A1E05-C89F-BC17-FCD3-6F8AFF2F7BCA}.Debug|x64.Build.0 = Debug|Any CPU + {3A2A1E05-C89F-BC17-FCD3-6F8AFF2F7BCA}.Debug|x86.ActiveCfg = Debug|Any CPU + {3A2A1E05-C89F-BC17-FCD3-6F8AFF2F7BCA}.Debug|x86.Build.0 = Debug|Any CPU + {3A2A1E05-C89F-BC17-FCD3-6F8AFF2F7BCA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3A2A1E05-C89F-BC17-FCD3-6F8AFF2F7BCA}.Release|Any CPU.Build.0 = Release|Any CPU + {3A2A1E05-C89F-BC17-FCD3-6F8AFF2F7BCA}.Release|x64.ActiveCfg = Release|Any CPU + {3A2A1E05-C89F-BC17-FCD3-6F8AFF2F7BCA}.Release|x64.Build.0 = Release|Any CPU + {3A2A1E05-C89F-BC17-FCD3-6F8AFF2F7BCA}.Release|x86.ActiveCfg = Release|Any CPU + {3A2A1E05-C89F-BC17-FCD3-6F8AFF2F7BCA}.Release|x86.Build.0 = Release|Any CPU + {49F51185-A685-9166-D2C3-7A361903F799}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {49F51185-A685-9166-D2C3-7A361903F799}.Debug|Any CPU.Build.0 = Debug|Any CPU + {49F51185-A685-9166-D2C3-7A361903F799}.Debug|x64.ActiveCfg = Debug|Any CPU + {49F51185-A685-9166-D2C3-7A361903F799}.Debug|x64.Build.0 = Debug|Any CPU + {49F51185-A685-9166-D2C3-7A361903F799}.Debug|x86.ActiveCfg = Debug|Any CPU + {49F51185-A685-9166-D2C3-7A361903F799}.Debug|x86.Build.0 = Debug|Any CPU + {49F51185-A685-9166-D2C3-7A361903F799}.Release|Any CPU.ActiveCfg = Release|Any CPU + {49F51185-A685-9166-D2C3-7A361903F799}.Release|Any CPU.Build.0 = Release|Any CPU + {49F51185-A685-9166-D2C3-7A361903F799}.Release|x64.ActiveCfg = Release|Any CPU + {49F51185-A685-9166-D2C3-7A361903F799}.Release|x64.Build.0 = Release|Any CPU + {49F51185-A685-9166-D2C3-7A361903F799}.Release|x86.ActiveCfg = Release|Any CPU + {49F51185-A685-9166-D2C3-7A361903F799}.Release|x86.Build.0 = Release|Any CPU + {7E894ED5-F334-F432-A512-8512866450E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7E894ED5-F334-F432-A512-8512866450E9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7E894ED5-F334-F432-A512-8512866450E9}.Debug|x64.ActiveCfg = Debug|Any CPU + {7E894ED5-F334-F432-A512-8512866450E9}.Debug|x64.Build.0 = Debug|Any CPU + {7E894ED5-F334-F432-A512-8512866450E9}.Debug|x86.ActiveCfg = Debug|Any CPU + {7E894ED5-F334-F432-A512-8512866450E9}.Debug|x86.Build.0 = Debug|Any CPU + {7E894ED5-F334-F432-A512-8512866450E9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7E894ED5-F334-F432-A512-8512866450E9}.Release|Any CPU.Build.0 = Release|Any CPU + {7E894ED5-F334-F432-A512-8512866450E9}.Release|x64.ActiveCfg = Release|Any CPU + {7E894ED5-F334-F432-A512-8512866450E9}.Release|x64.Build.0 = Release|Any CPU + {7E894ED5-F334-F432-A512-8512866450E9}.Release|x86.ActiveCfg = Release|Any CPU + {7E894ED5-F334-F432-A512-8512866450E9}.Release|x86.Build.0 = Release|Any CPU + {681F46EC-C9D8-C9CB-1912-BE90965F26F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {681F46EC-C9D8-C9CB-1912-BE90965F26F0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {681F46EC-C9D8-C9CB-1912-BE90965F26F0}.Debug|x64.ActiveCfg = Debug|Any CPU + {681F46EC-C9D8-C9CB-1912-BE90965F26F0}.Debug|x64.Build.0 = Debug|Any CPU + {681F46EC-C9D8-C9CB-1912-BE90965F26F0}.Debug|x86.ActiveCfg = Debug|Any CPU + {681F46EC-C9D8-C9CB-1912-BE90965F26F0}.Debug|x86.Build.0 = Debug|Any CPU + {681F46EC-C9D8-C9CB-1912-BE90965F26F0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {681F46EC-C9D8-C9CB-1912-BE90965F26F0}.Release|Any CPU.Build.0 = Release|Any CPU + {681F46EC-C9D8-C9CB-1912-BE90965F26F0}.Release|x64.ActiveCfg = Release|Any CPU + {681F46EC-C9D8-C9CB-1912-BE90965F26F0}.Release|x64.Build.0 = Release|Any CPU + {681F46EC-C9D8-C9CB-1912-BE90965F26F0}.Release|x86.ActiveCfg = Release|Any CPU + {681F46EC-C9D8-C9CB-1912-BE90965F26F0}.Release|x86.Build.0 = Release|Any CPU + {E096C32B-F927-A1BC-E8D6-4E5D37710F8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E096C32B-F927-A1BC-E8D6-4E5D37710F8B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E096C32B-F927-A1BC-E8D6-4E5D37710F8B}.Debug|x64.ActiveCfg = Debug|Any CPU + {E096C32B-F927-A1BC-E8D6-4E5D37710F8B}.Debug|x64.Build.0 = Debug|Any CPU + {E096C32B-F927-A1BC-E8D6-4E5D37710F8B}.Debug|x86.ActiveCfg = Debug|Any CPU + {E096C32B-F927-A1BC-E8D6-4E5D37710F8B}.Debug|x86.Build.0 = Debug|Any CPU + {E096C32B-F927-A1BC-E8D6-4E5D37710F8B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E096C32B-F927-A1BC-E8D6-4E5D37710F8B}.Release|Any CPU.Build.0 = Release|Any CPU + {E096C32B-F927-A1BC-E8D6-4E5D37710F8B}.Release|x64.ActiveCfg = Release|Any CPU + {E096C32B-F927-A1BC-E8D6-4E5D37710F8B}.Release|x64.Build.0 = Release|Any CPU + {E096C32B-F927-A1BC-E8D6-4E5D37710F8B}.Release|x86.ActiveCfg = Release|Any CPU + {E096C32B-F927-A1BC-E8D6-4E5D37710F8B}.Release|x86.Build.0 = Release|Any CPU + {298D8870-F761-1233-5A8E-67376F45B3F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {298D8870-F761-1233-5A8E-67376F45B3F1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {298D8870-F761-1233-5A8E-67376F45B3F1}.Debug|x64.ActiveCfg = Debug|Any CPU + {298D8870-F761-1233-5A8E-67376F45B3F1}.Debug|x64.Build.0 = Debug|Any CPU + {298D8870-F761-1233-5A8E-67376F45B3F1}.Debug|x86.ActiveCfg = Debug|Any CPU + {298D8870-F761-1233-5A8E-67376F45B3F1}.Debug|x86.Build.0 = Debug|Any CPU + {298D8870-F761-1233-5A8E-67376F45B3F1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {298D8870-F761-1233-5A8E-67376F45B3F1}.Release|Any CPU.Build.0 = Release|Any CPU + {298D8870-F761-1233-5A8E-67376F45B3F1}.Release|x64.ActiveCfg = Release|Any CPU + {298D8870-F761-1233-5A8E-67376F45B3F1}.Release|x64.Build.0 = Release|Any CPU + {298D8870-F761-1233-5A8E-67376F45B3F1}.Release|x86.ActiveCfg = Release|Any CPU + {298D8870-F761-1233-5A8E-67376F45B3F1}.Release|x86.Build.0 = Release|Any CPU + {68806E84-C084-4ECB-87D8-63C91D81A2D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {68806E84-C084-4ECB-87D8-63C91D81A2D0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {68806E84-C084-4ECB-87D8-63C91D81A2D0}.Debug|x64.ActiveCfg = Debug|Any CPU + {68806E84-C084-4ECB-87D8-63C91D81A2D0}.Debug|x64.Build.0 = Debug|Any CPU + {68806E84-C084-4ECB-87D8-63C91D81A2D0}.Debug|x86.ActiveCfg = Debug|Any CPU + {68806E84-C084-4ECB-87D8-63C91D81A2D0}.Debug|x86.Build.0 = Debug|Any CPU + {68806E84-C084-4ECB-87D8-63C91D81A2D0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {68806E84-C084-4ECB-87D8-63C91D81A2D0}.Release|Any CPU.Build.0 = Release|Any CPU + {68806E84-C084-4ECB-87D8-63C91D81A2D0}.Release|x64.ActiveCfg = Release|Any CPU + {68806E84-C084-4ECB-87D8-63C91D81A2D0}.Release|x64.Build.0 = Release|Any CPU + {68806E84-C084-4ECB-87D8-63C91D81A2D0}.Release|x86.ActiveCfg = Release|Any CPU + {68806E84-C084-4ECB-87D8-63C91D81A2D0}.Release|x86.Build.0 = Release|Any CPU + {53E0F515-0D6C-4456-9299-A6431AD2211C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {53E0F515-0D6C-4456-9299-A6431AD2211C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {53E0F515-0D6C-4456-9299-A6431AD2211C}.Debug|x64.ActiveCfg = Debug|Any CPU + {53E0F515-0D6C-4456-9299-A6431AD2211C}.Debug|x64.Build.0 = Debug|Any CPU + {53E0F515-0D6C-4456-9299-A6431AD2211C}.Debug|x86.ActiveCfg = Debug|Any CPU + {53E0F515-0D6C-4456-9299-A6431AD2211C}.Debug|x86.Build.0 = Debug|Any CPU + {53E0F515-0D6C-4456-9299-A6431AD2211C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {53E0F515-0D6C-4456-9299-A6431AD2211C}.Release|Any CPU.Build.0 = Release|Any CPU + {53E0F515-0D6C-4456-9299-A6431AD2211C}.Release|x64.ActiveCfg = Release|Any CPU + {53E0F515-0D6C-4456-9299-A6431AD2211C}.Release|x64.Build.0 = Release|Any CPU + {53E0F515-0D6C-4456-9299-A6431AD2211C}.Release|x86.ActiveCfg = Release|Any CPU + {53E0F515-0D6C-4456-9299-A6431AD2211C}.Release|x86.Build.0 = Release|Any CPU + {E0D430E8-17DE-2748-EE17-9FF29B7F2645}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E0D430E8-17DE-2748-EE17-9FF29B7F2645}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E0D430E8-17DE-2748-EE17-9FF29B7F2645}.Debug|x64.ActiveCfg = Debug|Any CPU + {E0D430E8-17DE-2748-EE17-9FF29B7F2645}.Debug|x64.Build.0 = Debug|Any CPU + {E0D430E8-17DE-2748-EE17-9FF29B7F2645}.Debug|x86.ActiveCfg = Debug|Any CPU + {E0D430E8-17DE-2748-EE17-9FF29B7F2645}.Debug|x86.Build.0 = Debug|Any CPU + {E0D430E8-17DE-2748-EE17-9FF29B7F2645}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E0D430E8-17DE-2748-EE17-9FF29B7F2645}.Release|Any CPU.Build.0 = Release|Any CPU + {E0D430E8-17DE-2748-EE17-9FF29B7F2645}.Release|x64.ActiveCfg = Release|Any CPU + {E0D430E8-17DE-2748-EE17-9FF29B7F2645}.Release|x64.Build.0 = Release|Any CPU + {E0D430E8-17DE-2748-EE17-9FF29B7F2645}.Release|x86.ActiveCfg = Release|Any CPU + {E0D430E8-17DE-2748-EE17-9FF29B7F2645}.Release|x86.Build.0 = Release|Any CPU + {FC025A5F-E170-6DF7-164A-BC21418EACEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FC025A5F-E170-6DF7-164A-BC21418EACEB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FC025A5F-E170-6DF7-164A-BC21418EACEB}.Debug|x64.ActiveCfg = Debug|Any CPU + {FC025A5F-E170-6DF7-164A-BC21418EACEB}.Debug|x64.Build.0 = Debug|Any CPU + {FC025A5F-E170-6DF7-164A-BC21418EACEB}.Debug|x86.ActiveCfg = Debug|Any CPU + {FC025A5F-E170-6DF7-164A-BC21418EACEB}.Debug|x86.Build.0 = Debug|Any CPU + {FC025A5F-E170-6DF7-164A-BC21418EACEB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FC025A5F-E170-6DF7-164A-BC21418EACEB}.Release|Any CPU.Build.0 = Release|Any CPU + {FC025A5F-E170-6DF7-164A-BC21418EACEB}.Release|x64.ActiveCfg = Release|Any CPU + {FC025A5F-E170-6DF7-164A-BC21418EACEB}.Release|x64.Build.0 = Release|Any CPU + {FC025A5F-E170-6DF7-164A-BC21418EACEB}.Release|x86.ActiveCfg = Release|Any CPU + {FC025A5F-E170-6DF7-164A-BC21418EACEB}.Release|x86.Build.0 = Release|Any CPU + {05471F05-9357-9250-9DD8-380DC5E55CBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {05471F05-9357-9250-9DD8-380DC5E55CBC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {05471F05-9357-9250-9DD8-380DC5E55CBC}.Debug|x64.ActiveCfg = Debug|Any CPU + {05471F05-9357-9250-9DD8-380DC5E55CBC}.Debug|x64.Build.0 = Debug|Any CPU + {05471F05-9357-9250-9DD8-380DC5E55CBC}.Debug|x86.ActiveCfg = Debug|Any CPU + {05471F05-9357-9250-9DD8-380DC5E55CBC}.Debug|x86.Build.0 = Debug|Any CPU + {05471F05-9357-9250-9DD8-380DC5E55CBC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {05471F05-9357-9250-9DD8-380DC5E55CBC}.Release|Any CPU.Build.0 = Release|Any CPU + {05471F05-9357-9250-9DD8-380DC5E55CBC}.Release|x64.ActiveCfg = Release|Any CPU + {05471F05-9357-9250-9DD8-380DC5E55CBC}.Release|x64.Build.0 = Release|Any CPU + {05471F05-9357-9250-9DD8-380DC5E55CBC}.Release|x86.ActiveCfg = Release|Any CPU + {05471F05-9357-9250-9DD8-380DC5E55CBC}.Release|x86.Build.0 = Release|Any CPU + {20B1065A-BCCA-B800-453C-8D660F345D3E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {20B1065A-BCCA-B800-453C-8D660F345D3E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {20B1065A-BCCA-B800-453C-8D660F345D3E}.Debug|x64.ActiveCfg = Debug|Any CPU + {20B1065A-BCCA-B800-453C-8D660F345D3E}.Debug|x64.Build.0 = Debug|Any CPU + {20B1065A-BCCA-B800-453C-8D660F345D3E}.Debug|x86.ActiveCfg = Debug|Any CPU + {20B1065A-BCCA-B800-453C-8D660F345D3E}.Debug|x86.Build.0 = Debug|Any CPU + {20B1065A-BCCA-B800-453C-8D660F345D3E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {20B1065A-BCCA-B800-453C-8D660F345D3E}.Release|Any CPU.Build.0 = Release|Any CPU + {20B1065A-BCCA-B800-453C-8D660F345D3E}.Release|x64.ActiveCfg = Release|Any CPU + {20B1065A-BCCA-B800-453C-8D660F345D3E}.Release|x64.Build.0 = Release|Any CPU + {20B1065A-BCCA-B800-453C-8D660F345D3E}.Release|x86.ActiveCfg = Release|Any CPU + {20B1065A-BCCA-B800-453C-8D660F345D3E}.Release|x86.Build.0 = Release|Any CPU + {EC52F799-73F2-3D21-E064-B73B3353B75D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EC52F799-73F2-3D21-E064-B73B3353B75D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EC52F799-73F2-3D21-E064-B73B3353B75D}.Debug|x64.ActiveCfg = Debug|Any CPU + {EC52F799-73F2-3D21-E064-B73B3353B75D}.Debug|x64.Build.0 = Debug|Any CPU + {EC52F799-73F2-3D21-E064-B73B3353B75D}.Debug|x86.ActiveCfg = Debug|Any CPU + {EC52F799-73F2-3D21-E064-B73B3353B75D}.Debug|x86.Build.0 = Debug|Any CPU + {EC52F799-73F2-3D21-E064-B73B3353B75D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EC52F799-73F2-3D21-E064-B73B3353B75D}.Release|Any CPU.Build.0 = Release|Any CPU + {EC52F799-73F2-3D21-E064-B73B3353B75D}.Release|x64.ActiveCfg = Release|Any CPU + {EC52F799-73F2-3D21-E064-B73B3353B75D}.Release|x64.Build.0 = Release|Any CPU + {EC52F799-73F2-3D21-E064-B73B3353B75D}.Release|x86.ActiveCfg = Release|Any CPU + {EC52F799-73F2-3D21-E064-B73B3353B75D}.Release|x86.Build.0 = Release|Any CPU + {6C06FC79-8053-45D3-B3CE-BFC0C89C67A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6C06FC79-8053-45D3-B3CE-BFC0C89C67A1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6C06FC79-8053-45D3-B3CE-BFC0C89C67A1}.Debug|x64.ActiveCfg = Debug|Any CPU + {6C06FC79-8053-45D3-B3CE-BFC0C89C67A1}.Debug|x64.Build.0 = Debug|Any CPU + {6C06FC79-8053-45D3-B3CE-BFC0C89C67A1}.Debug|x86.ActiveCfg = Debug|Any CPU + {6C06FC79-8053-45D3-B3CE-BFC0C89C67A1}.Debug|x86.Build.0 = Debug|Any CPU + {6C06FC79-8053-45D3-B3CE-BFC0C89C67A1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6C06FC79-8053-45D3-B3CE-BFC0C89C67A1}.Release|Any CPU.Build.0 = Release|Any CPU + {6C06FC79-8053-45D3-B3CE-BFC0C89C67A1}.Release|x64.ActiveCfg = Release|Any CPU + {6C06FC79-8053-45D3-B3CE-BFC0C89C67A1}.Release|x64.Build.0 = Release|Any CPU + {6C06FC79-8053-45D3-B3CE-BFC0C89C67A1}.Release|x86.ActiveCfg = Release|Any CPU + {6C06FC79-8053-45D3-B3CE-BFC0C89C67A1}.Release|x86.Build.0 = Release|Any CPU + {0CF8DD58-2593-4AEB-BB47-DC8F7B9CCA00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0CF8DD58-2593-4AEB-BB47-DC8F7B9CCA00}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0CF8DD58-2593-4AEB-BB47-DC8F7B9CCA00}.Debug|x64.ActiveCfg = Debug|Any CPU + {0CF8DD58-2593-4AEB-BB47-DC8F7B9CCA00}.Debug|x64.Build.0 = Debug|Any CPU + {0CF8DD58-2593-4AEB-BB47-DC8F7B9CCA00}.Debug|x86.ActiveCfg = Debug|Any CPU + {0CF8DD58-2593-4AEB-BB47-DC8F7B9CCA00}.Debug|x86.Build.0 = Debug|Any CPU + {0CF8DD58-2593-4AEB-BB47-DC8F7B9CCA00}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0CF8DD58-2593-4AEB-BB47-DC8F7B9CCA00}.Release|Any CPU.Build.0 = Release|Any CPU + {0CF8DD58-2593-4AEB-BB47-DC8F7B9CCA00}.Release|x64.ActiveCfg = Release|Any CPU + {0CF8DD58-2593-4AEB-BB47-DC8F7B9CCA00}.Release|x64.Build.0 = Release|Any CPU + {0CF8DD58-2593-4AEB-BB47-DC8F7B9CCA00}.Release|x86.ActiveCfg = Release|Any CPU + {0CF8DD58-2593-4AEB-BB47-DC8F7B9CCA00}.Release|x86.Build.0 = Release|Any CPU + {8A0B17C8-4C80-4D4F-8254-772C7E9F029F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8A0B17C8-4C80-4D4F-8254-772C7E9F029F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A0B17C8-4C80-4D4F-8254-772C7E9F029F}.Debug|x64.ActiveCfg = Debug|Any CPU + {8A0B17C8-4C80-4D4F-8254-772C7E9F029F}.Debug|x64.Build.0 = Debug|Any CPU + {8A0B17C8-4C80-4D4F-8254-772C7E9F029F}.Debug|x86.ActiveCfg = Debug|Any CPU + {8A0B17C8-4C80-4D4F-8254-772C7E9F029F}.Debug|x86.Build.0 = Debug|Any CPU + {8A0B17C8-4C80-4D4F-8254-772C7E9F029F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8A0B17C8-4C80-4D4F-8254-772C7E9F029F}.Release|Any CPU.Build.0 = Release|Any CPU + {8A0B17C8-4C80-4D4F-8254-772C7E9F029F}.Release|x64.ActiveCfg = Release|Any CPU + {8A0B17C8-4C80-4D4F-8254-772C7E9F029F}.Release|x64.Build.0 = Release|Any CPU + {8A0B17C8-4C80-4D4F-8254-772C7E9F029F}.Release|x86.ActiveCfg = Release|Any CPU + {8A0B17C8-4C80-4D4F-8254-772C7E9F029F}.Release|x86.Build.0 = Release|Any CPU + {6D7B1DB6-E3BF-4103-9369-BB6E28D06278}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6D7B1DB6-E3BF-4103-9369-BB6E28D06278}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6D7B1DB6-E3BF-4103-9369-BB6E28D06278}.Debug|x64.ActiveCfg = Debug|Any CPU + {6D7B1DB6-E3BF-4103-9369-BB6E28D06278}.Debug|x64.Build.0 = Debug|Any CPU + {6D7B1DB6-E3BF-4103-9369-BB6E28D06278}.Debug|x86.ActiveCfg = Debug|Any CPU + {6D7B1DB6-E3BF-4103-9369-BB6E28D06278}.Debug|x86.Build.0 = Debug|Any CPU + {6D7B1DB6-E3BF-4103-9369-BB6E28D06278}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6D7B1DB6-E3BF-4103-9369-BB6E28D06278}.Release|Any CPU.Build.0 = Release|Any CPU + {6D7B1DB6-E3BF-4103-9369-BB6E28D06278}.Release|x64.ActiveCfg = Release|Any CPU + {6D7B1DB6-E3BF-4103-9369-BB6E28D06278}.Release|x64.Build.0 = Release|Any CPU + {6D7B1DB6-E3BF-4103-9369-BB6E28D06278}.Release|x86.ActiveCfg = Release|Any CPU + {6D7B1DB6-E3BF-4103-9369-BB6E28D06278}.Release|x86.Build.0 = Release|Any CPU + {15C0A832-D721-45E3-8556-71F3D1CBBFE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {15C0A832-D721-45E3-8556-71F3D1CBBFE7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {15C0A832-D721-45E3-8556-71F3D1CBBFE7}.Debug|x64.ActiveCfg = Debug|Any CPU + {15C0A832-D721-45E3-8556-71F3D1CBBFE7}.Debug|x64.Build.0 = Debug|Any CPU + {15C0A832-D721-45E3-8556-71F3D1CBBFE7}.Debug|x86.ActiveCfg = Debug|Any CPU + {15C0A832-D721-45E3-8556-71F3D1CBBFE7}.Debug|x86.Build.0 = Debug|Any CPU + {15C0A832-D721-45E3-8556-71F3D1CBBFE7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {15C0A832-D721-45E3-8556-71F3D1CBBFE7}.Release|Any CPU.Build.0 = Release|Any CPU + {15C0A832-D721-45E3-8556-71F3D1CBBFE7}.Release|x64.ActiveCfg = Release|Any CPU + {15C0A832-D721-45E3-8556-71F3D1CBBFE7}.Release|x64.Build.0 = Release|Any CPU + {15C0A832-D721-45E3-8556-71F3D1CBBFE7}.Release|x86.ActiveCfg = Release|Any CPU + {15C0A832-D721-45E3-8556-71F3D1CBBFE7}.Release|x86.Build.0 = Release|Any CPU + {1A104125-6FBF-4C1C-B727-28125E4D9049}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1A104125-6FBF-4C1C-B727-28125E4D9049}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1A104125-6FBF-4C1C-B727-28125E4D9049}.Debug|x64.ActiveCfg = Debug|Any CPU + {1A104125-6FBF-4C1C-B727-28125E4D9049}.Debug|x64.Build.0 = Debug|Any CPU + {1A104125-6FBF-4C1C-B727-28125E4D9049}.Debug|x86.ActiveCfg = Debug|Any CPU + {1A104125-6FBF-4C1C-B727-28125E4D9049}.Debug|x86.Build.0 = Debug|Any CPU + {1A104125-6FBF-4C1C-B727-28125E4D9049}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1A104125-6FBF-4C1C-B727-28125E4D9049}.Release|Any CPU.Build.0 = Release|Any CPU + {1A104125-6FBF-4C1C-B727-28125E4D9049}.Release|x64.ActiveCfg = Release|Any CPU + {1A104125-6FBF-4C1C-B727-28125E4D9049}.Release|x64.Build.0 = Release|Any CPU + {1A104125-6FBF-4C1C-B727-28125E4D9049}.Release|x86.ActiveCfg = Release|Any CPU + {1A104125-6FBF-4C1C-B727-28125E4D9049}.Release|x86.Build.0 = Release|Any CPU + {5BBEE994-F2CE-47F2-BA5D-8DC6DE5FC1CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5BBEE994-F2CE-47F2-BA5D-8DC6DE5FC1CD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5BBEE994-F2CE-47F2-BA5D-8DC6DE5FC1CD}.Debug|x64.ActiveCfg = Debug|Any CPU + {5BBEE994-F2CE-47F2-BA5D-8DC6DE5FC1CD}.Debug|x64.Build.0 = Debug|Any CPU + {5BBEE994-F2CE-47F2-BA5D-8DC6DE5FC1CD}.Debug|x86.ActiveCfg = Debug|Any CPU + {5BBEE994-F2CE-47F2-BA5D-8DC6DE5FC1CD}.Debug|x86.Build.0 = Debug|Any CPU + {5BBEE994-F2CE-47F2-BA5D-8DC6DE5FC1CD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5BBEE994-F2CE-47F2-BA5D-8DC6DE5FC1CD}.Release|Any CPU.Build.0 = Release|Any CPU + {5BBEE994-F2CE-47F2-BA5D-8DC6DE5FC1CD}.Release|x64.ActiveCfg = Release|Any CPU + {5BBEE994-F2CE-47F2-BA5D-8DC6DE5FC1CD}.Release|x64.Build.0 = Release|Any CPU + {5BBEE994-F2CE-47F2-BA5D-8DC6DE5FC1CD}.Release|x86.ActiveCfg = Release|Any CPU + {5BBEE994-F2CE-47F2-BA5D-8DC6DE5FC1CD}.Release|x86.Build.0 = Release|Any CPU + {1273BDF2-19A9-9986-7375-A2A9FEAC4FA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1273BDF2-19A9-9986-7375-A2A9FEAC4FA9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1273BDF2-19A9-9986-7375-A2A9FEAC4FA9}.Debug|x64.ActiveCfg = Debug|Any CPU + {1273BDF2-19A9-9986-7375-A2A9FEAC4FA9}.Debug|x64.Build.0 = Debug|Any CPU + {1273BDF2-19A9-9986-7375-A2A9FEAC4FA9}.Debug|x86.ActiveCfg = Debug|Any CPU + {1273BDF2-19A9-9986-7375-A2A9FEAC4FA9}.Debug|x86.Build.0 = Debug|Any CPU + {1273BDF2-19A9-9986-7375-A2A9FEAC4FA9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1273BDF2-19A9-9986-7375-A2A9FEAC4FA9}.Release|Any CPU.Build.0 = Release|Any CPU + {1273BDF2-19A9-9986-7375-A2A9FEAC4FA9}.Release|x64.ActiveCfg = Release|Any CPU + {1273BDF2-19A9-9986-7375-A2A9FEAC4FA9}.Release|x64.Build.0 = Release|Any CPU + {1273BDF2-19A9-9986-7375-A2A9FEAC4FA9}.Release|x86.ActiveCfg = Release|Any CPU + {1273BDF2-19A9-9986-7375-A2A9FEAC4FA9}.Release|x86.Build.0 = Release|Any CPU + {664A9767-A668-52AA-7363-98C25FC30686}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {664A9767-A668-52AA-7363-98C25FC30686}.Debug|Any CPU.Build.0 = Debug|Any CPU + {664A9767-A668-52AA-7363-98C25FC30686}.Debug|x64.ActiveCfg = Debug|Any CPU + {664A9767-A668-52AA-7363-98C25FC30686}.Debug|x64.Build.0 = Debug|Any CPU + {664A9767-A668-52AA-7363-98C25FC30686}.Debug|x86.ActiveCfg = Debug|Any CPU + {664A9767-A668-52AA-7363-98C25FC30686}.Debug|x86.Build.0 = Debug|Any CPU + {664A9767-A668-52AA-7363-98C25FC30686}.Release|Any CPU.ActiveCfg = Release|Any CPU + {664A9767-A668-52AA-7363-98C25FC30686}.Release|Any CPU.Build.0 = Release|Any CPU + {664A9767-A668-52AA-7363-98C25FC30686}.Release|x64.ActiveCfg = Release|Any CPU + {664A9767-A668-52AA-7363-98C25FC30686}.Release|x64.Build.0 = Release|Any CPU + {664A9767-A668-52AA-7363-98C25FC30686}.Release|x86.ActiveCfg = Release|Any CPU + {664A9767-A668-52AA-7363-98C25FC30686}.Release|x86.Build.0 = Release|Any CPU + {2E86CEFB-DBB8-1CE3-D98B-87E1772216F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2E86CEFB-DBB8-1CE3-D98B-87E1772216F7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2E86CEFB-DBB8-1CE3-D98B-87E1772216F7}.Debug|x64.ActiveCfg = Debug|Any CPU + {2E86CEFB-DBB8-1CE3-D98B-87E1772216F7}.Debug|x64.Build.0 = Debug|Any CPU + {2E86CEFB-DBB8-1CE3-D98B-87E1772216F7}.Debug|x86.ActiveCfg = Debug|Any CPU + {2E86CEFB-DBB8-1CE3-D98B-87E1772216F7}.Debug|x86.Build.0 = Debug|Any CPU + {2E86CEFB-DBB8-1CE3-D98B-87E1772216F7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2E86CEFB-DBB8-1CE3-D98B-87E1772216F7}.Release|Any CPU.Build.0 = Release|Any CPU + {2E86CEFB-DBB8-1CE3-D98B-87E1772216F7}.Release|x64.ActiveCfg = Release|Any CPU + {2E86CEFB-DBB8-1CE3-D98B-87E1772216F7}.Release|x64.Build.0 = Release|Any CPU + {2E86CEFB-DBB8-1CE3-D98B-87E1772216F7}.Release|x86.ActiveCfg = Release|Any CPU + {2E86CEFB-DBB8-1CE3-D98B-87E1772216F7}.Release|x86.Build.0 = Release|Any CPU + {3AC087D2-4F47-88D9-175E-61AF5FA56570}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3AC087D2-4F47-88D9-175E-61AF5FA56570}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3AC087D2-4F47-88D9-175E-61AF5FA56570}.Debug|x64.ActiveCfg = Debug|Any CPU + {3AC087D2-4F47-88D9-175E-61AF5FA56570}.Debug|x64.Build.0 = Debug|Any CPU + {3AC087D2-4F47-88D9-175E-61AF5FA56570}.Debug|x86.ActiveCfg = Debug|Any CPU + {3AC087D2-4F47-88D9-175E-61AF5FA56570}.Debug|x86.Build.0 = Debug|Any CPU + {3AC087D2-4F47-88D9-175E-61AF5FA56570}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3AC087D2-4F47-88D9-175E-61AF5FA56570}.Release|Any CPU.Build.0 = Release|Any CPU + {3AC087D2-4F47-88D9-175E-61AF5FA56570}.Release|x64.ActiveCfg = Release|Any CPU + {3AC087D2-4F47-88D9-175E-61AF5FA56570}.Release|x64.Build.0 = Release|Any CPU + {3AC087D2-4F47-88D9-175E-61AF5FA56570}.Release|x86.ActiveCfg = Release|Any CPU + {3AC087D2-4F47-88D9-175E-61AF5FA56570}.Release|x86.Build.0 = Release|Any CPU + {F4D5866E-19E8-496F-B43C-96F2E460E5CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F4D5866E-19E8-496F-B43C-96F2E460E5CD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F4D5866E-19E8-496F-B43C-96F2E460E5CD}.Debug|x64.ActiveCfg = Debug|Any CPU + {F4D5866E-19E8-496F-B43C-96F2E460E5CD}.Debug|x64.Build.0 = Debug|Any CPU + {F4D5866E-19E8-496F-B43C-96F2E460E5CD}.Debug|x86.ActiveCfg = Debug|Any CPU + {F4D5866E-19E8-496F-B43C-96F2E460E5CD}.Debug|x86.Build.0 = Debug|Any CPU + {F4D5866E-19E8-496F-B43C-96F2E460E5CD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F4D5866E-19E8-496F-B43C-96F2E460E5CD}.Release|Any CPU.Build.0 = Release|Any CPU + {F4D5866E-19E8-496F-B43C-96F2E460E5CD}.Release|x64.ActiveCfg = Release|Any CPU + {F4D5866E-19E8-496F-B43C-96F2E460E5CD}.Release|x64.Build.0 = Release|Any CPU + {F4D5866E-19E8-496F-B43C-96F2E460E5CD}.Release|x86.ActiveCfg = Release|Any CPU + {F4D5866E-19E8-496F-B43C-96F2E460E5CD}.Release|x86.Build.0 = Release|Any CPU + {430C217C-897A-42EE-996D-75A02FF22A50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {430C217C-897A-42EE-996D-75A02FF22A50}.Debug|Any CPU.Build.0 = Debug|Any CPU + {430C217C-897A-42EE-996D-75A02FF22A50}.Debug|x64.ActiveCfg = Debug|Any CPU + {430C217C-897A-42EE-996D-75A02FF22A50}.Debug|x64.Build.0 = Debug|Any CPU + {430C217C-897A-42EE-996D-75A02FF22A50}.Debug|x86.ActiveCfg = Debug|Any CPU + {430C217C-897A-42EE-996D-75A02FF22A50}.Debug|x86.Build.0 = Debug|Any CPU + {430C217C-897A-42EE-996D-75A02FF22A50}.Release|Any CPU.ActiveCfg = Release|Any CPU + {430C217C-897A-42EE-996D-75A02FF22A50}.Release|Any CPU.Build.0 = Release|Any CPU + {430C217C-897A-42EE-996D-75A02FF22A50}.Release|x64.ActiveCfg = Release|Any CPU + {430C217C-897A-42EE-996D-75A02FF22A50}.Release|x64.Build.0 = Release|Any CPU + {430C217C-897A-42EE-996D-75A02FF22A50}.Release|x86.ActiveCfg = Release|Any CPU + {430C217C-897A-42EE-996D-75A02FF22A50}.Release|x86.Build.0 = Release|Any CPU + {1AF38194-CE8A-4099-A848-36EE50B86608}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1AF38194-CE8A-4099-A848-36EE50B86608}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1AF38194-CE8A-4099-A848-36EE50B86608}.Debug|x64.ActiveCfg = Debug|Any CPU + {1AF38194-CE8A-4099-A848-36EE50B86608}.Debug|x64.Build.0 = Debug|Any CPU + {1AF38194-CE8A-4099-A848-36EE50B86608}.Debug|x86.ActiveCfg = Debug|Any CPU + {1AF38194-CE8A-4099-A848-36EE50B86608}.Debug|x86.Build.0 = Debug|Any CPU + {1AF38194-CE8A-4099-A848-36EE50B86608}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1AF38194-CE8A-4099-A848-36EE50B86608}.Release|Any CPU.Build.0 = Release|Any CPU + {1AF38194-CE8A-4099-A848-36EE50B86608}.Release|x64.ActiveCfg = Release|Any CPU + {1AF38194-CE8A-4099-A848-36EE50B86608}.Release|x64.Build.0 = Release|Any CPU + {1AF38194-CE8A-4099-A848-36EE50B86608}.Release|x86.ActiveCfg = Release|Any CPU + {1AF38194-CE8A-4099-A848-36EE50B86608}.Release|x86.Build.0 = Release|Any CPU + {7902E0FC-18DD-401F-A2AE-9C4B396457AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7902E0FC-18DD-401F-A2AE-9C4B396457AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7902E0FC-18DD-401F-A2AE-9C4B396457AE}.Debug|x64.ActiveCfg = Debug|Any CPU + {7902E0FC-18DD-401F-A2AE-9C4B396457AE}.Debug|x64.Build.0 = Debug|Any CPU + {7902E0FC-18DD-401F-A2AE-9C4B396457AE}.Debug|x86.ActiveCfg = Debug|Any CPU + {7902E0FC-18DD-401F-A2AE-9C4B396457AE}.Debug|x86.Build.0 = Debug|Any CPU + {7902E0FC-18DD-401F-A2AE-9C4B396457AE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7902E0FC-18DD-401F-A2AE-9C4B396457AE}.Release|Any CPU.Build.0 = Release|Any CPU + {7902E0FC-18DD-401F-A2AE-9C4B396457AE}.Release|x64.ActiveCfg = Release|Any CPU + {7902E0FC-18DD-401F-A2AE-9C4B396457AE}.Release|x64.Build.0 = Release|Any CPU + {7902E0FC-18DD-401F-A2AE-9C4B396457AE}.Release|x86.ActiveCfg = Release|Any CPU + {7902E0FC-18DD-401F-A2AE-9C4B396457AE}.Release|x86.Build.0 = Release|Any CPU + {B086F665-F5AD-1C7E-8DE2-EAE4B07B3B74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B086F665-F5AD-1C7E-8DE2-EAE4B07B3B74}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B086F665-F5AD-1C7E-8DE2-EAE4B07B3B74}.Debug|x64.ActiveCfg = Debug|Any CPU + {B086F665-F5AD-1C7E-8DE2-EAE4B07B3B74}.Debug|x64.Build.0 = Debug|Any CPU + {B086F665-F5AD-1C7E-8DE2-EAE4B07B3B74}.Debug|x86.ActiveCfg = Debug|Any CPU + {B086F665-F5AD-1C7E-8DE2-EAE4B07B3B74}.Debug|x86.Build.0 = Debug|Any CPU + {B086F665-F5AD-1C7E-8DE2-EAE4B07B3B74}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B086F665-F5AD-1C7E-8DE2-EAE4B07B3B74}.Release|Any CPU.Build.0 = Release|Any CPU + {B086F665-F5AD-1C7E-8DE2-EAE4B07B3B74}.Release|x64.ActiveCfg = Release|Any CPU + {B086F665-F5AD-1C7E-8DE2-EAE4B07B3B74}.Release|x64.Build.0 = Release|Any CPU + {B086F665-F5AD-1C7E-8DE2-EAE4B07B3B74}.Release|x86.ActiveCfg = Release|Any CPU + {B086F665-F5AD-1C7E-8DE2-EAE4B07B3B74}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {1BC20219-3D30-27AE-4A3A-8B4A05025DE9} = {3CA992F2-D491-4B3C-8119-7C668520F751} + {BCFACB2F-9919-4183-D77C-CF1B8A68FACA} = {3CA992F2-D491-4B3C-8119-7C668520F751} + {441C530C-104F-414E-8DC0-306FDDDC7207} = {3CA992F2-D491-4B3C-8119-7C668520F751} + {3A2A1E05-C89F-BC17-FCD3-6F8AFF2F7BCA} = {AC9055B0-3BC1-42F9-A31F-0D5B677A783B} + {49F51185-A685-9166-D2C3-7A361903F799} = {AC9055B0-3BC1-42F9-A31F-0D5B677A783B} + {7E894ED5-F334-F432-A512-8512866450E9} = {AC9055B0-3BC1-42F9-A31F-0D5B677A783B} + {681F46EC-C9D8-C9CB-1912-BE90965F26F0} = {AC9055B0-3BC1-42F9-A31F-0D5B677A783B} + {E096C32B-F927-A1BC-E8D6-4E5D37710F8B} = {AC9055B0-3BC1-42F9-A31F-0D5B677A783B} + {298D8870-F761-1233-5A8E-67376F45B3F1} = {3CA992F2-D491-4B3C-8119-7C668520F751} + {68806E84-C084-4ECB-87D8-63C91D81A2D0} = {F40585D9-BD3E-4C29-8CF7-01D78F3CF17D} + {53E0F515-0D6C-4456-9299-A6431AD2211C} = {48E9A122-27CD-4405-B962-AB52B3C01C0A} + {E0D430E8-17DE-2748-EE17-9FF29B7F2645} = {B426D894-80BC-4454-B292-4D86A265B1A1} + {FC025A5F-E170-6DF7-164A-BC21418EACEB} = {B426D894-80BC-4454-B292-4D86A265B1A1} + {05471F05-9357-9250-9DD8-380DC5E55CBC} = {B426D894-80BC-4454-B292-4D86A265B1A1} + {20B1065A-BCCA-B800-453C-8D660F345D3E} = {09D343DB-EBC3-46E8-8F1C-EF20DB992ECD} + {EC52F799-73F2-3D21-E064-B73B3353B75D} = {09D343DB-EBC3-46E8-8F1C-EF20DB992ECD} + {6C06FC79-8053-45D3-B3CE-BFC0C89C67A1} = {64A61076-3A22-4599-9149-50D8F6C69E58} + {0CF8DD58-2593-4AEB-BB47-DC8F7B9CCA00} = {64A61076-3A22-4599-9149-50D8F6C69E58} + {8A0B17C8-4C80-4D4F-8254-772C7E9F029F} = {48E9A122-27CD-4405-B962-AB52B3C01C0A} + {6D7B1DB6-E3BF-4103-9369-BB6E28D06278} = {64A61076-3A22-4599-9149-50D8F6C69E58} + {15C0A832-D721-45E3-8556-71F3D1CBBFE7} = {64A61076-3A22-4599-9149-50D8F6C69E58} + {1A104125-6FBF-4C1C-B727-28125E4D9049} = {09D343DB-EBC3-46E8-8F1C-EF20DB992ECD} + {5BBEE994-F2CE-47F2-BA5D-8DC6DE5FC1CD} = {B426D894-80BC-4454-B292-4D86A265B1A1} + {1273BDF2-19A9-9986-7375-A2A9FEAC4FA9} = {AC9055B0-3BC1-42F9-A31F-0D5B677A783B} + {664A9767-A668-52AA-7363-98C25FC30686} = {44DC4392-0776-43D9-B139-9BC0E5FE3EA5} + {2E86CEFB-DBB8-1CE3-D98B-87E1772216F7} = {44DC4392-0776-43D9-B139-9BC0E5FE3EA5} + {3AC087D2-4F47-88D9-175E-61AF5FA56570} = {44DC4392-0776-43D9-B139-9BC0E5FE3EA5} + {F4D5866E-19E8-496F-B43C-96F2E460E5CD} = {AC9055B0-3BC1-42F9-A31F-0D5B677A783B} + {1AF38194-CE8A-4099-A848-36EE50B86608} = {44DC4392-0776-43D9-B139-9BC0E5FE3EA5} + {7902E0FC-18DD-401F-A2AE-9C4B396457AE} = {AC9055B0-3BC1-42F9-A31F-0D5B677A783B} + {B086F665-F5AD-1C7E-8DE2-EAE4B07B3B74} = {3CA992F2-D491-4B3C-8119-7C668520F751} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E6A3E9EC-7C45-44D6-89CD-C87584053633} + EndGlobalSection +EndGlobal diff --git a/Tools/RenameUploads/Program.cs b/Tools/RenameUploads/Program.cs new file mode 100644 index 0000000..3adfc94 --- /dev/null +++ b/Tools/RenameUploads/Program.cs @@ -0,0 +1,158 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +class Program +{ + static void Main(string[] args) + { + string uploadsPath = @"F:\Temp\Template0524\AdminSrc\AdminHost\wwwroot\uploads"; + + var propMapping = new Dictionary(StringComparer.OrdinalIgnoreCase) + { + // 40001-40006 + { "改名卡", "40001" }, + { "大喇叭", "40002" }, + { "冰冻", "40003" }, + { "狂暴", "40004" }, + { "刮刮卡", "40005" }, + { "召唤卡", "40006" }, + + { "Vip1专属炮台", "40100" }, + { "Vip2专属炮台", "40101" }, + { "Vip3专属炮台", "40102" }, + { "Vip4专属炮台", "40103" }, + { "Vip5专属炮台", "40104" }, + { "Vip6专属炮台", "40105" }, + { "Vip7专属炮台", "40106" }, + { "Vip8专属炮台", "40107" }, + { "Vip9专属炮台", "40108" }, + { "Vip10专属炮台", "40109" }, + + { "雷电之翼", "40201" }, + { "烈焰之翼", "40202" }, + { "暴风之翼", "40203" }, + { "幻翎之翼", "40204" }, + { "裂变之翼", "40205" }, + { "火龙之翼", "40206" }, + { "神圣之翼", "40207" }, + { "幻隐之翼", "40208" }, + { "凤羽之翼", "40209" }, + + { "鸿运招财喵", "40301" }, + { "极限大黄蜂", "40302" }, + { "福禄柴犬", "40303" }, + { "哪吒转世", "40304" }, + { "五福熊猫", "40305" }, + { "九天雷龙", "40306" }, + { "万圣通灵", "40307" }, + { "三昧真火", "40308" }, + { "不朽战神", "40309" }, + + { "乘风破浪", "40210" }, + { "五谷丰登", "40211" }, + { "傲游太虚", "40212" }, + { "光棱杀手", "40213" }, + { "八卦神炉", "40214" }, + { "冰火回响", "40215" }, + { "冰霜巨龙", "40216" }, + { "刀光剑影", "40217" }, + { "刑天魔斧", "40218" }, + { "创世之心", "40219" }, + { "创世幻翼", "40220" }, + { "剑气如虹", "40221" }, + { "圣光之剑", "40222" }, + { "圣洁之心", "40223" }, + { "堕天使之翼", "40224" }, + { "天下无极", "40225" }, + { "天机神鹰", "40226" }, + { "如虎添翼", "40227" }, + { "审判之光", "40228" }, + { "巨蟹之翼", "40229" }, + { "幻蝶彩翼", "40230" }, + { "幽冥飞刃", "40231" }, + { "心心相印", "40232" }, + { "战旗之翼", "40233" }, + { "战神之怒", "40234" }, + { "战魂之刃", "40235" }, + { "战魂之翼", "40236" }, + + { "鸿运招财喵碎片", "50001" }, + { "极限大黄蜂碎片", "50002" }, + { "福禄柴犬碎片", "50003" }, + { "哪吒转世碎片", "50004" }, + { "五福熊猫碎片", "50005" }, + { "九天雷龙碎片", "50006" }, + + { "2千", "70000" }, + { "8佰", "70001" }, + { "4佰", "70002" }, + { "2佰", "70003" }, + { "1千", "70004" }, + { "2千_2", "70005" }, + { "8佰_2", "70006" }, + { "4佰_2", "70007" }, + { "2佰_2", "70008" }, + { "1千_2", "70009" }, + { "2千_3", "70010" }, + { "8佰_3", "70011" }, + { "4佰_3", "70012" }, + { "2佰_3", "70013" }, + { "1千_3", "70014" }, + { "4佰_4", "70015" }, + + { "100万金币", "70001" }, + { "500万金币", "70002" }, + { "1000万金币", "70003" }, + { "2000万金币", "70004" }, + { "5000万金币", "70005" }, + { "1亿金币", "70006" }, + + { "100钻石", "80001" }, + { "500钻石", "80002" }, + { "1000钻石", "80003" }, + { "2000钻石", "80004" }, + { "5000钻石", "80005" }, + { "10000钻石", "80006" }, + }; + + if (!Directory.Exists(uploadsPath)) + { + Console.WriteLine($"目录不存在: {uploadsPath}"); + return; + } + + var files = Directory.GetFiles(uploadsPath); + var renamed = 0; + var skipped = 0; + + foreach (var file in files) + { + var fileName = Path.GetFileNameWithoutExtension(file); + var ext = Path.GetExtension(file); + + if (propMapping.TryGetValue(fileName, out string? newName)) + { + var newPath = Path.Combine(uploadsPath, newName + ext); + + if (File.Exists(newPath) && newPath != file) + { + Console.WriteLine($"跳过(目标已存在): {fileName} -> {newName}"); + skipped++; + continue; + } + + File.Move(file, newPath); + Console.WriteLine($"重命名: {fileName} -> {newName}"); + renamed++; + } + else + { + Console.WriteLine($"未找到映射: {fileName}"); + } + } + + Console.WriteLine($"\n完成!成功重命名: {renamed}, 跳过: {skipped}"); + } +} diff --git a/Tools/RenameUploads/RenameUploads.csproj b/Tools/RenameUploads/RenameUploads.csproj new file mode 100644 index 0000000..866ab70 --- /dev/null +++ b/Tools/RenameUploads/RenameUploads.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + disable + disable + + + diff --git a/UserDomain/Response/BattleOrderResponse.cs b/UserDomain/Response/BattleOrderResponse.cs new file mode 100644 index 0000000..0bfc6dd --- /dev/null +++ b/UserDomain/Response/BattleOrderResponse.cs @@ -0,0 +1,111 @@ +using CommonDomain.BaseModel; + +namespace UserDomain.Response +{ + public class BattleOrderResponse + { + public bool IsOpen { get; set; } + + public string Message { get; set; } + + public UserBattleOrderInfo UserBattleOrder { get; set; } + + public BattleOrderConfigInfo Config { get; set; } + } + + public class UserBattleOrderInfo + { + public string UserId { get; set; } + + public int Level { get; set; } + + public long Exp { get; set; } + + public bool IsLuxury { get; set; } + + public bool IsSupreme { get; set; } + + public List ReceivedLevels { get; set; } = new List(); + + public List PurchasedAdvances { get; set; } = new List(); + } + + public class BattleOrderConfigInfo + { + public long EndTime { get; set; } + + public string RuleDesc { get; set; } + + public string BuyDesc { get; set; } + + public string AdvanceGiftDesc { get; set; } + + public List LevelConfig { get; set; } + + public List AdvanceGift { get; set; } + } + + public class BattleOrderLevelInfo + { + public int Level { get; set; } + + public long Exp { get; set; } + + public List NormalGiftList { get; set; } = new(); + + public List LuxuryGiftList { get; set; } = new(); + + public List SupremeGiftList { get; set; } = new(); + } + + public class BattleOrderAdvanceInfo + { + public int Type { get; set; } + + public string Name { get; set; } + + public int Count { get; set; } + + public int PayType { get; set; } + + public int PayCount { get; set; } + } + + public class ReceiveBattleOrderRewardResponse + { + public bool Success { get; set; } + + public string Message { get; set; } + + public List Rewards { get; set; } + } + + public class BattleOrderRewardItem + { + public int Type { get; set; } + + public string RewardId { get; set; } + + public int Count { get; set; } + } + + public class BuyBattleOrderLevelResponse + { + public bool Success { get; set; } + + public string Message { get; set; } + + public int NewLevel { get; set; } + + public int Cost { get; set; } + } + + public class BuyBattleOrderAdvanceResponse + { + public bool Success { get; set; } + + public string Message { get; set; } + + public List PurchasedAdvances { get; set; } + } +} \ No newline at end of file diff --git a/UserSrc/UserApi/AssemblyMarker.cs b/UserSrc/UserApi/AssemblyMarker.cs new file mode 100644 index 0000000..77fd1c2 --- /dev/null +++ b/UserSrc/UserApi/AssemblyMarker.cs @@ -0,0 +1,6 @@ +namespace UserApi +{ + public static class AssemblyMarker + { + } +} \ No newline at end of file diff --git a/UserSrc/UserApi/BeautifulNumber/BeautifulNumberController.cs b/UserSrc/UserApi/BeautifulNumber/BeautifulNumberController.cs new file mode 100644 index 0000000..6a2b35a --- /dev/null +++ b/UserSrc/UserApi/BeautifulNumber/BeautifulNumberController.cs @@ -0,0 +1,84 @@ +using System.Linq; +using AdminDomain.BeautifulNumber; +using AdminDomain.Entity; +using Common; +using Common.CommonModel; +using CommonInfrastructure; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using UserDomain.Entity; +using UserService.BeautifulNumber; + +namespace UserApi.BeautifulNumber +{ + [ApiController, Route("api/[controller]")] + [Authorize] + + public class BeautifulNumberController : BaseController + { + private readonly IBeautifulNumberService _beautifulNumberService; + + public BeautifulNumberController(IBeautifulNumberService beautifulNumberService) + { + _beautifulNumberService = beautifulNumberService; + } + + + [HttpGet("available")] + public async Task> GetAvailableList([FromQuery] BeautifulNumberListParam param) + { + param.page = param.page > 0 ? param.page : 1; + param.size = param.size > 0 ? param.size : 20; + param.status = (int)BeautifulNumberStatus.Available; + var result = await _beautifulNumberService.GetList(param); + var dtos = result.Data.Select(MapToDto).ToList(); + return this.ToPageResult(dtos, result.Count); + } + + [HttpGet("check/{number}")] + public async Task> CheckNumber(string number) + { + var result = await _beautifulNumberService.CheckNumber(number); + return this.ToResult(MapToDto(result)); + } + + private static BeautifulNumberDto MapToDto(BeautifulNumberConfig entity) + { + if (entity == null) return new BeautifulNumberDto(); + return new BeautifulNumberDto + { + Id = entity.Id ?? "", + Number = entity.Number ?? "", + RuleName = entity.RuleName ?? "", + Level = entity.Level ?? "", + Price = entity.Price, + Status = (int)entity.Status, + SaleTime = entity.SaleTime, + BuyerUserId = entity.BuyerUserId ?? "", + UserId = entity.UserId ?? "", + Remark = entity.Remark ?? "", + CreateTime = entity.CreateTime + }; + } + } + + public class BeautifulNumberDto + { + public string Id { get; set; } + public string Number { get; set; } + public string RuleName { get; set; } + public string Level { get; set; } + public long Price { get; set; } + public int Status { get; set; } + public long SaleTime { get; set; } + public string BuyerUserId { get; set; } + public string UserId { get; set; } + public string Remark { get; set; } + public long CreateTime { get; set; } + } + + public class PurchaseBeautifulNumberParam + { + public string Number { get; set; } + } +} diff --git a/UserSrc/UserApi/Dict/DictController.cs b/UserSrc/UserApi/Dict/DictController.cs new file mode 100644 index 0000000..60095fd --- /dev/null +++ b/UserSrc/UserApi/Dict/DictController.cs @@ -0,0 +1,37 @@ +using Common; +using CommonInfrastructure; +using Domain.Admin.Admin; +using Microsoft.AspNetCore.Mvc; +using MongoRepository; + +namespace UserApi.Dict +{ + [ApiController, Route("api/[controller]")] + public class DictController : BaseController + { + private readonly IMongoBaseRepository _dicRepo; + + public DictController(IMongoBaseRepository dicRepo) + { + _dicRepo = dicRepo; + } + + [HttpGet("GetByCode")] + public async Task> GetByCode(string code) + { + var dic = await _dicRepo.FindOneAsync(c => c.IsDelete == false && c.Code == code); + return this.ToResult(dic); + } + + [HttpGet("GetListByCode")] + public async Task>> GetListByCode(string code) + { + var all = await _dicRepo.FilterByAsync(c => c.IsDelete == false); + var parent = all.FirstOrDefault(c => c.Code == code); + if (parent == null) + return this.ToResult(new List()); + var children = all.Where(c => c.ParentId == parent.Id).OrderBy(c => c.Order).ToList(); + return this.ToResult(children); + } + } +} diff --git a/UserSrc/UserApi/Faq/FaqController.cs b/UserSrc/UserApi/Faq/FaqController.cs new file mode 100644 index 0000000..9f628bd --- /dev/null +++ b/UserSrc/UserApi/Faq/FaqController.cs @@ -0,0 +1,135 @@ +using Common; +using CommonInfrastructure; +using Microsoft.AspNetCore.Mvc; +using UserService.Notices; +using System.Linq; +using CommonDomain; +namespace UserApi.Faq +{ + [ApiController, Route("adminapi/[controller]")] + public class FaqController : BaseController + { + private readonly IFaqService _faqService; + + public FaqController(IFaqService faqService) + { + _faqService = faqService; + } + + [HttpGet("CategoryTree")] + public async Task GetCategoryTree() + { + var tree = await _faqService.GetCategoryTree(); + var dtos = tree.Select(MapToTreeNodeDto).ToList(); + return new ListResponse + { + Code = CommonResponseCodeEnum.Success, + Info = "获取成功", + Data = dtos + }; + } + + + + + [HttpGet("Questions")] + public async Task GetQuestions(string categoryId) + { + var list = await _faqService.GetQuestionsByCategory(categoryId); + if (list == null) + return new ListResponse { Code = CommonResponseCodeEnum.Success, Data = new List() }; + var dtos = list.Select(MapToQuestionDto).ToList(); + return new ListResponse + { + Code = CommonResponseCodeEnum.Success, + Info = "获取成功", + Data = dtos + }; + } + + [HttpPost("QuestionList")] + public async Task GetQuestionList([FromBody] FaqQueryParam param) + { + var result = await _faqService.QueryQuestions(param.CategoryId, param.PageIndex, param.PageSize); + var dtos = result.list.Select(MapToQuestionDto).ToList(); + return new PageDataResponse + { + Code = CommonResponseCodeEnum.Success, + Info = "获取成功", + Data = dtos, + Count = (int)result.count + }; + } + + [HttpGet("QuestionDetail")] + public async Task> GetQuestionDetail(string id) + { + var question = await _faqService.GetQuestionById(id); + if (question == null) + return this.ToFailResult("问题不存在"); + + return this.ToResult(MapToQuestionDto(question)); + } + + + private static FaqCategoryTreeNodeDto MapToTreeNodeDto(FaqCategoryTreeNode entity) + { + if (entity == null) return new FaqCategoryTreeNodeDto(); + return new FaqCategoryTreeNodeDto + { + Id = entity.Id ?? "", + Name = entity.Name ?? "", + Icon = entity.Icon ?? "", + Sort = entity.Sort, + IsEnable = entity.IsEnable, + Children = entity.Children?.Select(MapToTreeNodeDto).ToList() ?? new List(), + QuestionCount = entity.QuestionCount + }; + } + + private static FaqQuestionDto MapToQuestionDto(FaqQuestion entity) + { + if (entity == null) return new FaqQuestionDto(); + return new FaqQuestionDto + { + Id = entity.Id ?? "", + CategoryId = entity.CategoryId ?? "", + Title = entity.Title ?? "", + Content = entity.Content ?? "", + Sort = entity.Sort, + IsEnable = entity.IsEnable, + CreateTime = entity.CreateTime + }; + } + + } + + public class FaqCategoryTreeNodeDto + { + public string Id { get; set; } + public string Name { get; set; } + public string Icon { get; set; } + public int Sort { get; set; } + public bool IsEnable { get; set; } + public List Children { get; set; } = new(); + public int QuestionCount { get; set; } + } + + public class FaqQuestionDto + { + public string Id { get; set; } + public string CategoryId { get; set; } + public string Title { get; set; } + public string Content { get; set; } + public int Sort { get; set; } + public bool IsEnable { get; set; } + public DateTime CreateTime { get; set; } + } + + public class FaqQueryParam + { + public string? CategoryId { get; set; } + public int PageIndex { get; set; } = 1; + public int PageSize { get; set; } = 10; + } +} \ No newline at end of file diff --git a/UserSrc/UserApi/GameConfigs/ActivityConfigController.cs b/UserSrc/UserApi/GameConfigs/ActivityConfigController.cs new file mode 100644 index 0000000..e17e8bb --- /dev/null +++ b/UserSrc/UserApi/GameConfigs/ActivityConfigController.cs @@ -0,0 +1,120 @@ + +using Common; +using CommonDomain; +using CommonDomain.BaseModel; +using CommonInfrastructure; +using Microsoft.AspNetCore.Mvc; +using UserService.GameConfigs; +namespace UserApi.GameConfigs +{ + [ApiController, Route("api/[controller]")] + public class ActivityConfigController : BaseController + { + private readonly IActivityConfigService _activityConfigService; + private readonly IGameConfigService _gameConfigService; + + public ActivityConfigController(IActivityConfigService activityConfigService, IGameConfigService gameConfigService) + { + _activityConfigService = activityConfigService; + _gameConfigService = gameConfigService; + } + + [HttpGet] + public async Task> Get() + { + var config = await _activityConfigService.Get(); + if (config?.BattleOrderConfig != null) + BattleOrderGiftProductHelper.Enrich(config.BattleOrderConfig, await _gameConfigService.Get()); + if (config?.LotteryActivityConfig != null) + LotteryPrizeProductHelper.Enrich(config.LotteryActivityConfig, await _gameConfigService.Get()); + return this.ToResult(config ?? new ActivityConfig()); + } + + [HttpGet("diamondShopList")] + public async Task> GetDiamondShopList() + { + var config = await _activityConfigService.Get(); + return this.ToListResult(config?.DiamondShopConfigs ?? new List()); + } + + [HttpGet("goldShopList")] + public async Task> GetGoldShopList() + { + var config = await _activityConfigService.Get(); + return this.ToListResult(config?.GoldShopConfigs ?? new List()); + } + + [HttpGet("signConfigs")] + public async Task> GetSignConfigs() + { + var config = await _activityConfigService.Get(); + return this.ToListResult(config?.SignConfigs ?? new List()); + } + + [HttpGet("reliefConfig")] + public async Task> GetReliefConfig() + { + var config = await _activityConfigService.Get(); + if (config?.ReliefConfig != null) + return this.ToResult(config.ReliefConfig); + else + return this.ToFailResult("配置不存在"); + } + + [HttpGet("registerConfig")] + public async Task> GetRegisterConfig() + { + var config = await _activityConfigService.Get(); + if (config?.RegisterConfig != null) + return this.ToResult(config.RegisterConfig); + else + return this.ToFailResult("配置不存在"); + } + + [HttpGet("fishingReturnConfig")] + public async Task> GetFishingReturnConfig() + { + var config = await _activityConfigService.Get(); + if (config?.FishingReturnConfig != null) + return this.ToResult(config.FishingReturnConfig); + else + return this.ToFailResult("配置不存在"); + } + + [HttpGet("battleOrderConfig")] + public async Task> GetBattleOrderConfig() + { + var config = await _activityConfigService.Get(); + if (config?.BattleOrderConfig != null) + { + BattleOrderGiftProductHelper.Enrich(config.BattleOrderConfig, await _gameConfigService.Get()); + return this.ToResult(config.BattleOrderConfig); + } + else + return this.ToFailResult("配置不存在"); + } + + [HttpGet("lotteryConfig")] + public async Task> GetLotteryConfig() + { + var config = await _activityConfigService.Get(); + if (config?.LotteryActivityConfig != null) + { + LotteryPrizeProductHelper.Enrich(config.LotteryActivityConfig, await _gameConfigService.Get()); + return this.ToResult(config.LotteryActivityConfig); + } + else + return this.ToFailResult("配置不存在"); + } + + [HttpGet("rankingRewardConfig")] + public async Task> GetRankingRewardConfig() + { + var config = await _activityConfigService.Get(); + if (config?.RankingRewardConfig != null) + return this.ToResult(config.RankingRewardConfig); + else + return this.ToFailResult("配置不存在"); + } + } +} diff --git a/UserSrc/UserApi/GameConfigs/GameConfigController.cs b/UserSrc/UserApi/GameConfigs/GameConfigController.cs new file mode 100644 index 0000000..88e6e46 --- /dev/null +++ b/UserSrc/UserApi/GameConfigs/GameConfigController.cs @@ -0,0 +1,36 @@ +using AutoMapper; +using ChessGameDomain; +using Common; +using CommonDomain; +using CommonDomain.BaseModel; +using CommonDomain.Enum; +using CommonInfrastructure; +using Microsoft.AspNetCore.Mvc; +using RedisService; +using UserService.GameConfigs; + +namespace UserApi.GameConfigs +{ + [ApiController, Route("api/[controller]")] + + public class GameConfigController : BaseController + { + private readonly IGameConfigService _gameConfigService; + + + public GameConfigController(IGameConfigService gameConfigService) + { + _gameConfigService = gameConfigService; + } + + + + [HttpGet] + + public async Task> Get() + { + var res = await _gameConfigService.Get(); + return this.ToResult(res); + } + } +} diff --git a/UserSrc/UserApi/Hall/HallController.cs b/UserSrc/UserApi/Hall/HallController.cs new file mode 100644 index 0000000..b28ea46 --- /dev/null +++ b/UserSrc/UserApi/Hall/HallController.cs @@ -0,0 +1,478 @@ +using System.Linq; +using Common; +using CommonDomain.BaseModel; +using CommonInfrastructure; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using UserApi; +using UserDomain; +using UserDomain.Entity; +using UserService; +using UserService.Response; +using UserService.Param; +using UserService.Tasks; +using UserService.Tasks.Param; +using UserService.User; +using UserService.BattleOrder; +using UserService.GameConfigs; + +namespace UserApi.Hall +{ + [ApiController, Route("api/[controller]")] + [Authorize] + + public class HallController : BaseController + { + private readonly IUserService _userService; + private readonly ITaskService _taskService; + private readonly IBattleOrderService _battleOrderService; + private readonly IActivityConfigService _activityConfigService; + + public HallController(IUserService userService, ITaskService taskService, IBattleOrderService battleOrderService, IActivityConfigService activityConfigService) + { + _userService = userService; + _taskService = taskService; + _battleOrderService = battleOrderService; + _activityConfigService = activityConfigService; + } + + + [HttpGet("SaveSafeBox")] + public async Task> SaveSafeBox(int gold) + { + var res = await _userService.SaveSafeBox(gold, loginUser); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpGet("GetSafeBox")] + public async Task> GetSafeBox(long gold, string password) + { + var res = await _userService.GetSafeBox(gold, password, loginUser); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpGet("SetSafeBoxPassword")] + public async Task> SetSafeBoxPassword(string password) + { + var res = await _userService.SetSafeBoxPassword(password, loginUser); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + + [HttpGet("ResetSafeBoxPassword")] + public async Task> ResetSafeBoxPassword(string password, string code) + { + var res = await _userService.ResetSafeBoxPassword(password, code, loginUser); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpGet("GetRelief")] + public async Task> GetRelief() + { + var res = await _userService.GetReliefGold(loginUser); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + + [HttpGet("SynthesisFragment")] + public async Task> SynthesisFragment(string propNumber) + { + var res = await _userService.SyntheticFragments(propNumber, loginUser); + if (res.isok) + return this.ToResult(res.model); + else + return this.ToFailResult(res.msg); + } + + + + + [HttpGet("BuyProp")] + public async Task> BuyProp(string propNumber, int count = 1) + { + var res = await _userService.BuyProps(propNumber, count, loginUser); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpGet("UseVipExp")] + public async Task> UseVipExp(int count = 1) + { + var res = await _userService.UseVipExp(count, loginUser); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpGet("BuyGold")] + public async Task> BuyGold(string number, int count = 1) + { + var res = await _userService.BuyGold(number, count, loginUser); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + + + [HttpGet("BuyDiamond")] + public async Task> BuyDiamond(string number, int count = 1) + { + var res = await _userService.BuyDiamond(number, count, loginUser); + if (res.isok) + return this.ToResult(res.url); + else + return this.ToFailResult(res.msg); + } + + [HttpGet("SignIn")] + public async Task> SignIn() + { + var res = await _userService.Sign(loginUser); + if (res.isok) + return this.ToResult(res.gold); + else + return this.ToFailResult(res.msg); + } + + + [HttpGet("ChangeCannon")] + public async Task> ChangeCannon(string number) + { + var res = await _userService.ChangeCannon(number, loginUser); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + + + + [HttpGet("ChangeWing")] + public async Task> ChangeWing(string number) + { + var res = await _userService.ChangeWing(number, loginUser); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpGet("ChangeGodWar")] + public async Task> ChangeGodWar(string number) + { + var res = await _userService.ChangeGodWar(number, loginUser); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpGet("UnloadCannon")] + public async Task> UnloadCannon(string number) + { + var res = await _userService.UnloadCannon(number, loginUser); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpGet("UnloadWing")] + public async Task> UnloadWing(string number) + { + var res = await _userService.UnloadWing(number, loginUser); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + [HttpGet("UnloadGodWar")] + public async Task> UnloadGodWar(string number) + { + var res = await _userService.UnloadGodWar(number, loginUser); + if (res.isok) + return this.ToResult(res.msg); + else + return this.ToFailResult(res.msg); + } + + + + [HttpGet("GetVipDayGift")] + public async Task> GetVipDayGift() + { + var res = await _userService.GetVipDayGift(loginUser); + if (res.isok) + return this.ToResult(res.model); + else + return this.ToFailResult(res.msg); + } + + + [HttpGet("GetVipGift")] + public async Task> GetVipGift(int vipLevel) + { + var res = await _userService.GetVipGift(vipLevel, loginUser); + if (res.isok) + return this.ToResult(res.model); + else + return this.ToFailResult(res.msg); + } + + + + + [HttpGet("GetUserTaskList")] + [Authorize] + public async Task> GetUserTaskList(int taskType) + { + var result = await _taskService.GetUserTaskList(new GetUserTaskListParam() { TaskType = taskType }, loginUser.UserId); + var dtos = result.Select(MapToUserTaskDto).ToList(); + return this.ToListResult(dtos); + } + + private static UserTaskDto MapToUserTaskDto(UserTask entity) + { + if (entity == null) return new UserTaskDto(); + return new UserTaskDto + { + Id = entity.Id ?? "", + UserId = entity.UserId ?? "", + Number = entity.Number ?? "", + Remark = entity.Remark ?? "", + TaskType = (int)entity.TaskType, + TaskEvent = (int)entity.TaskEvent, + TaskCount = entity.TaskCount, + Count = entity.Count, + IsFinish = entity.IsFinish, + OtherId = entity.OtherId ?? "", + IsGet = entity.IsGet, + TaskAddTime = entity.TaskAddTime, + TaskEndTime = entity.TaskEndTime, + TaskFinishTime = entity.TaskFinishTime, + Exp = entity.Exp + }; + } + [HttpGet("DistributeRewards")] + public async Task> DistributeRewards(string id) + { + var result = await _taskService.DistributeRewards(id, loginUser.UserId); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpPost("GetUserRewardList")] + public async Task> GetUserRewardList(GetUserRewardListParam param) + { + param.UserId = loginUser.UserId; + var res = await _userService.GetUserRewardList(param); + if(res.list==null || res.list.Count()==0) + return this.ToPageResult(null, res.count); + var dtos = res.list.Select(MapToUserRewardDto).ToList(); + return this.ToPageResult(dtos, res.count); + } + + private static UserRewardDto MapToUserRewardDto(UserReward entity) + { + if (entity == null) return new UserRewardDto(); + return new UserRewardDto + { + Id = entity.Id ?? "", + UserId = entity.UserId ?? "", + Type = entity.Type, + Source = (int)entity.Source, + CurrencyType = entity.CurrencyType, + BeforeCount = entity.BeforeCount, + ChangeCount = entity.ChangeCount, + AfterCount = entity.AfterCount, + OtherId = entity.OtherId ?? "", + OtherUserId = entity.OtherUserId ?? "", + Remark = entity.Remark ?? "", + RoomName = entity.RoomName ?? "", + RoomInfo = entity.RoomInfo ?? "", + Tax = entity.Tax, + CreateTime = entity.CreateTime + }; + } + + + + public class UserTaskDto + { + public string Id { get; set; } + public string UserId { get; set; } + public string Number { get; set; } + public string Remark { get; set; } + public int TaskType { get; set; } + public int TaskEvent { get; set; } + public int TaskCount { get; set; } + public double Count { get; set; } + public bool IsFinish { get; set; } + public string OtherId { get; set; } + public bool IsGet { get; set; } + public long TaskAddTime { get; set; } + public long TaskEndTime { get; set; } + public long TaskFinishTime { get; set; } + public long Exp { get; set; } + } + + public class UserRewardDto + { + public string Id { get; set; } + public string UserId { get; set; } + public int Type { get; set; } + public int Source { get; set; } + public int CurrencyType { get; set; } + public long BeforeCount { get; set; } + public long ChangeCount { get; set; } + public long AfterCount { get; set; } + public string OtherId { get; set; } + public string OtherUserId { get; set; } + public string Remark { get; set; } + public string RoomName { get; set; } + public string RoomInfo { get; set; } + public int Tax { get; set; } + public long CreateTime { get; set; } + } + + + + [HttpGet("GetBattleOrder")] + public async Task> GetBattleOrder() + { + var result = await _battleOrderService.GetUserBattleOrderWithConfigAsync(loginUser.UserId); + return this.ToResult(result); + } + + [HttpGet("GetBattleOrderLevelStatus")] + public async Task> GetBattleOrderLevelStatus() + { + var result = await _battleOrderService.GetLevelRewardStatusAsync(loginUser.UserId); + return this.ToResult(result); + } + + [HttpGet("ReceiveAllBattleOrderRewards")] + public async Task> ReceiveAllBattleOrderRewards() + { + var result = await _battleOrderService.ReceiveAllRewardsAsync(loginUser.UserId); + if (result.success) + return this.ToListResult(result.rewards); + else + return this.ToListFailResult(result.message); + } + + [HttpGet("ReceiveBattleOrderLevelReward")] + public async Task> ReceiveBattleOrderLevelReward( int level) + { + var result = await _battleOrderService.ReceiveLevelRewardAsync(loginUser.UserId, level); + if (result.success) + return this.ToListResult(result.rewards); + else + return this.ToListFailResult(result.message); + } + + [HttpGet("BuyBattleOrderLevel")] + public async Task> BuyBattleOrderLevel(int levelCount) + { + var result = await _battleOrderService.BuyLevelsAsync(loginUser.UserId, levelCount); + if (result.success) + return this.ToResult(new BuyBattleOrderLevelResponse + { + NewLevel = result.newLevel, + Cost = result.cost + }); + else + return this.ToFailResult(result.message); + } + + [HttpGet("BuyBattleOrderAdvance")] + public async Task> BuyBattleOrderAdvance(int type) + { + var result = await _battleOrderService.BuyAdvanceAsync(loginUser.UserId, type); + if (result.success) + return this.ToResult(new BuyBattleOrderAdvanceResponse + { + Success = true, + Message = result.message, + PurchasedAdvances = result.purchasedAdvances + }); + else + return this.ToFailResult(result.message); + } + + [HttpGet("ReceiveAllTaskRewards")] + public async Task> ReceiveAllTaskRewards() + { + var result = await _taskService.ReceiveAllTaskRewardsAsync(loginUser.UserId); + if (result.success) + return this.ToResult(new { message = result.message, totalExp = result.totalExp }); + else + return this.ToFailResult(result.message); + } + + [HttpGet("GetRanking")] + public async Task> GetRanking(int type = 1) + { + var config = await _activityConfigService.Get(); + var rankingConfig = config?.RankingRewardConfig; + if (rankingConfig != null && rankingConfig.IsMaintaining) + { + return this.ToFailResult( + string.IsNullOrEmpty(rankingConfig.MaintainingMessage) + ? "当前排行榜正在维护中,请稍后再试" + : rankingConfig.MaintainingMessage); + } + var result = await _userService.GetRanking(loginUser, type); + return this.ToResult(result); + } + + [HttpGet("SendBroadcast")] + public async Task> SendBroadcast(string message) + { + var res = await _userService.SendBroadcast(message, loginUser); + if (res.isok) + return this.ToResult(res.msg); + return this.ToFailResult(res.msg); + } + + + [AllowAnonymous] + [HttpGet("GetChessRoomPartitionCount")] + public async Task> GetChessRoomPartitionCount([FromServices] UserService.GameConfigs.IGameConfigService gameConfigService) + { + var config = await gameConfigService.Get(); + if (config == null) + return this.ToFailResult("配置不存在"); + + var total = config.RoomConfigs + .Where(r => r.GameType == CommonDomain.Enum.GameTypeEnum.中国象棋) + .Sum(r => r.RoomPartitionNum); + + return this.ToResult(total); + } + } +} diff --git a/UserSrc/UserApi/Login/DateTimeResponse.cs b/UserSrc/UserApi/Login/DateTimeResponse.cs new file mode 100644 index 0000000..ec70702 --- /dev/null +++ b/UserSrc/UserApi/Login/DateTimeResponse.cs @@ -0,0 +1,30 @@ +using System; + +namespace UserApi.Login +{ + public class DateTimeResponse + { + public int Year { get; set; } + public int Month { get; set; } + public int Day { get; set; } + public int Hour { get; set; } + public int Minute { get; set; } + public int Seconds { get; set; } + public int MilliSeconds { get; set; } + public string DateTime { get; set; } + public string Date { get; set; } + public string Time { get; set; } + public string TimeZone { get; set; } + public string DayOfWeek { get; set; } + public bool DstActive { get; set; } + public long Timestamp { get; set; } + public string Service { get; set; } = "UserApi"; + public string DateTimeNow { get; set; } = string.Empty; + public string DateTimeNowKind { get; set; } = string.Empty; + public long DateTimeNowTimestamp { get; set; } + public string DateTimeOffsetUtcNow { get; set; } = string.Empty; + public long DateTimeOffsetUtcNowTimestamp { get; set; } + public long DifferenceMs { get; set; } + public string Container { get; set; } = string.Empty; + } +} diff --git a/UserSrc/UserApi/Login/LoginController.cs b/UserSrc/UserApi/Login/LoginController.cs new file mode 100644 index 0000000..ebb524c --- /dev/null +++ b/UserSrc/UserApi/Login/LoginController.cs @@ -0,0 +1,182 @@ +using Common; +using Common.Utils; +using Common.WX; +using Common.WX.Response; +using CommonInfrastructure; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using UserService; +using UserService.Param; +using UserService.Response; +using UserService.User; + +namespace UserApi.Login +{ + [ApiController, Route("api/[controller]")] + + public class LoginController : BaseController + { + private readonly IUserService _userService; + private readonly WXBaseHelper _weiXinPayHelper; + + public LoginController(IUserService userService, WXBaseHelper weiXinPayHelper) + { + _userService = userService; + _weiXinPayHelper = weiXinPayHelper; + } + [HttpGet("GetAccessToken")] + public async Task> GetAccessToken() + { + var result = await _weiXinPayHelper.GetAccessToken(); + + if (!result.isok) + return this.ToFailResult("登陆失败" + result.msg); + else + { + return this.ToResult(result.accessToken); + } + } + [HttpGet("GetSessionToken")] + public async Task> GetSessionToken(string js_code) + { + var result = await _weiXinPayHelper.GetAccessTokenByCode(js_code); + if (!result.isok) + return this.ToFailResult("登陆失败" + result.msg); + else + { + return this.ToResult(result.response); + } + } + private string GetClientIp() + { + var forwarded = HttpContext.Request.Headers["X-Forwarded-For"].FirstOrDefault(); + if (!string.IsNullOrWhiteSpace(forwarded)) + return forwarded.Split(',')[0].Trim(); + return HttpContext.Connection.RemoteIpAddress?.ToString() ?? ""; + } + + [HttpPost("registerWX")] + + public async Task> RegisterWX(RegisterUserWeiXinParam param) + { + var ip = GetClientIp(); + var result = await _userService.RegisterWeiXin(param, ip); + return this.ToResult(result); + } + [HttpPost("register")] + + public async Task> Register(RegisterUserParam param) + { + var ip = GetClientIp(); + var result = await _userService.Register(param, ip); + if (result.isok) + return this.ToResult(result.user); + else + return this.ToFailResult(result.msg); + } + [HttpGet("SendMobileCode")] + + public async Task> SendMobileCode(string mobile) + { + var result = await _userService.SendMobileCode(mobile); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + [HttpGet("LoginWx")] + public async Task> LoginWx(string openId) + { + var ip = GetClientIp(); + var result = await _userService.LoginWx(openId, ip); + return this.ToResult(result); + } + [HttpGet("Login")] + public async Task> Login(string mobile, string code) + { + if (string.IsNullOrEmpty(mobile)) + return this.ToFailResult("请输入手机号"); + if (string.IsNullOrEmpty(code)) + return this.ToFailResult("请输入验证码或密码"); + if (!System.Text.RegularExpressions.Regex.IsMatch(mobile, @"^1[3-9]\d{9}$")) + return this.ToFailResult("手机号格式错误"); + + var ip = GetClientIp(); + var result = await _userService.Login(mobile, code, ip); + if (result.isok) + return this.ToResult(result.user); + else + return this.ToFailResult(result.msg); + } + [HttpGet("LoginByPassword")] + public async Task> LoginByPassword(string mobile, string password) + { + if (string.IsNullOrEmpty(mobile)) + return this.ToFailResult("请输入手机号"); + if (string.IsNullOrEmpty(password)) + return this.ToFailResult("请输入密码"); + if (!System.Text.RegularExpressions.Regex.IsMatch(mobile, @"^1[3-9]\d{9}$")) + return this.ToFailResult("手机号格式错误"); + + var ip = GetClientIp(); + var result = await _userService.LoginByPassword(mobile, password, ip); + if (result.isok) + return this.ToResult(result.user); + return this.ToFailResult(result.msg); + } + + [HttpGet("GetDateTime")] + public async Task> GetDateTime() + { + var now = DateTime.Now; + var nowOffset = new DateTimeOffset(now); + var utcNow = DateTimeOffset.UtcNow; + var nowTimestamp = nowOffset.ToUnixTimeMilliseconds(); + var utcNowTimestamp = utcNow.ToUnixTimeMilliseconds(); + var localNow = now; + return this.ToResult(new DateTimeResponse + { + Year = localNow.Year, + Month = localNow.Month, + Day = localNow.Day, + Hour = localNow.Hour, + Minute = localNow.Minute, + Seconds = localNow.Second, + MilliSeconds = localNow.Millisecond, + DateTime = localNow.ToString("yyyy-MM-dd HH:mm:ss"), + Date = localNow.ToString("yyyy-MM-dd"), + Time = localNow.ToString("HH:mm:ss"), + TimeZone = TimeZoneInfo.Local.DisplayName, + DayOfWeek = localNow.DayOfWeek.ToString(), + DstActive = TimeZoneInfo.Local.IsDaylightSavingTime(localNow), + Timestamp = utcNowTimestamp, + Service = "UserApi", + DateTimeNow = now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + DateTimeNowKind = now.Kind.ToString(), + DateTimeNowTimestamp = nowTimestamp, + DateTimeOffsetUtcNow = utcNow.ToString("yyyy-MM-dd HH:mm:ss.fff zzz"), + DateTimeOffsetUtcNowTimestamp = utcNowTimestamp, + DifferenceMs = utcNowTimestamp - nowTimestamp, + Container = Environment.MachineName + }); + } + [HttpGet("ResetPassword")] + public async Task> ResetPassword(string mobile, string password, string code) + { + if (string.IsNullOrEmpty(mobile)) + return this.ToFailResult("请输入手机号"); + if (string.IsNullOrEmpty(code)) + return this.ToFailResult("请输入验证码"); + if (string.IsNullOrEmpty(password)) + return this.ToFailResult("请输入新密码"); + if (!System.Text.RegularExpressions.Regex.IsMatch(mobile, @"^1[3-9]\d{9}$")) + return this.ToFailResult("手机号格式错误"); + + var result = await _userService.UpdatePassword(mobile, password, code); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + } +} diff --git a/UserSrc/UserApi/Lottery/LotteryController.cs b/UserSrc/UserApi/Lottery/LotteryController.cs new file mode 100644 index 0000000..47883a3 --- /dev/null +++ b/UserSrc/UserApi/Lottery/LotteryController.cs @@ -0,0 +1,94 @@ +using Common; +using CommonDomain; +using CommonInfrastructure; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using UserDomain.Entity; +using UserService; +using UserService.GameConfigs; + +namespace UserApi.Lottery +{ + [ApiController, Route("api/[controller]")] + [Authorize] + public class LotteryController : BaseController + { + private readonly ILotteryService _lotteryService; + private readonly IActivityConfigService _activityConfigService; + private readonly IGameConfigService _gameConfigService; + + public LotteryController(ILotteryService lotteryService, IActivityConfigService activityConfigService, + IGameConfigService gameConfigService) + { + _lotteryService = lotteryService; + _activityConfigService = activityConfigService; + _gameConfigService = gameConfigService; + } + + [HttpGet("Config")] + public async Task> GetConfig() + { + var config = await _activityConfigService.Get(); + if (config?.LotteryActivityConfig == null) + return this.ToFailResult("配置不存在"); + + LotteryPrizeProductHelper.Enrich(config.LotteryActivityConfig, await _gameConfigService.Get()); + + var drawnPrizes = await _lotteryService.GetUserDrawnPrizes(loginUser.UserId); + return this.ToResult(new LotteryConfigResponse + { + Config = config.LotteryActivityConfig, + DrawnPrizeIds = drawnPrizes ?? new List() + }); + } + + [HttpGet("Draw")] + public async Task> Draw([FromQuery] int poolType = 0) + { + var res = await _lotteryService.Draw(loginUser.UserId, poolType); + if (!res.success) + return this.ToFailResult(res.message); + return this.ToResult(new LotteryDrawResponse + { + PrizeId = res.prize.PrizeId, + Name = res.prize.Name, + Type = res.prize.Type, + Count = res.prize.Count, + OtherId = res.prize.OtherId, + Cost = res.cost, + PoolType = poolType + }); + } + + [HttpGet("UserStatus")] + public async Task> UserStatus() + { + var status = await _lotteryService.GetUserStatus(loginUser.UserId); + return this.ToResult(status); + } + + [HttpGet("DrawnPrizes")] + public async Task>> DrawnPrizes() + { + var list = await _lotteryService.GetUserDrawnPrizes(loginUser.UserId); + return this.ToResult(list); + } + } + + public class LotteryDrawResponse + { + public string PrizeId { get; set; } + public string Name { get; set; } + public int Type { get; set; } + public long Count { get; set; } + public string OtherId { get; set; } + public long Cost { get; set; } + public int PoolType { get; set; } + } + + public class LotteryConfigResponse + { + public LotteryActivityConfig Config { get; set; } + public List DrawnPrizeIds { get; set; } = new(); + } +} diff --git a/UserSrc/UserApi/Notices/NoticeController.cs b/UserSrc/UserApi/Notices/NoticeController.cs new file mode 100644 index 0000000..faf9ef1 --- /dev/null +++ b/UserSrc/UserApi/Notices/NoticeController.cs @@ -0,0 +1,107 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Common; +using CommonInfrastructure; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using UserDomain.Entity; +using UserService.Notices; +using UserService.Notices.Param; + +namespace UserApi.Notices +{ + [ApiController, Route("api/[controller]")] + [Authorize] + public class NoticeController : BaseController + { + private readonly INoticeService _noticeService; + + public NoticeController(INoticeService noticeService) + { + _noticeService = noticeService; + } + + [HttpPost("list")] + public async Task> GetNoticeList(GetNoticeListParam param) + { + var result = await _noticeService.GetList(param); + var list = result.list ?? new List(); + var dtos = list.Select(n => new NoticeDto + { + Id = n.Id, + Title = n.Title, + Content = n.Content, + Recommend = n.Recommend, + TopImage = n.TopImage, + ContentImages = n.ContentImages, + CreateTime = n.CreateTime + }); + return this.ToPageResult(dtos, (int)result.count); + } + + [HttpGet("get")] + [AllowAnonymous] + public async Task> GetNotice(string id) + { + var result = await _noticeService.Get(id); + if (result == null) + { + return this.ToFailResult("公告不存在"); + } + + var dto = new NoticeDto + { + Id = result.Id, + Title = result.Title, + Content = result.Content, + Recommend = result.Recommend, + TopImage = result.TopImage, + ContentImages = result.ContentImages, + CreateTime = result.CreateTime + }; + return this.ToResult(dto); + } + + [HttpGet("get/newone")] + [AllowAnonymous] + public async Task> GetNewOne() + { + var result = await _noticeService.GetNewOne(); + if (result == null) + { + return this.ToFailResult("暂无公告"); + } + + var dto = new NoticeDto + { + Id = result.Id, + Title = result.Title, + Content = result.Content, + Recommend = result.Recommend, + TopImage = result.TopImage, + ContentImages = result.ContentImages, + CreateTime = result.CreateTime + }; + return this.ToResult(dto); + } + } + + public class NoticeDto + { + public string Id { get; set; } + + public string Title { get; set; } + + public string Content { get; set; } + + public string Recommend { get; set; } + + public string TopImage { get; set; } + + public List ContentImages { get; set; } + + public long CreateTime { get; set; } + } +} diff --git a/UserSrc/UserApi/Program.cs b/UserSrc/UserApi/Program.cs new file mode 100644 index 0000000..3751555 --- /dev/null +++ b/UserSrc/UserApi/Program.cs @@ -0,0 +1,2 @@ +// See https://aka.ms/new-console-template for more information +Console.WriteLine("Hello, World!"); diff --git a/UserSrc/UserApi/ScratchCard/ScratchCardController.cs b/UserSrc/UserApi/ScratchCard/ScratchCardController.cs new file mode 100644 index 0000000..52f370a --- /dev/null +++ b/UserSrc/UserApi/ScratchCard/ScratchCardController.cs @@ -0,0 +1,29 @@ +using Common; +using CommonInfrastructure; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using UserService.ScratchCard; + +namespace UserApi.ScratchCard +{ + [ApiController, Route("api/[controller]")] + [Authorize] + public class ScratchCardController : BaseController + { + private readonly IScratchCardService _scratchCardService; + + public ScratchCardController(IScratchCardService scratchCardService) + { + _scratchCardService = scratchCardService; + } + + [HttpGet("draw")] + public async Task> Draw() + { + var res = await _scratchCardService.Draw(loginUser.UserId); + if (res.success) + return this.ToResult(res.result); + return this.ToFailResult(res.message); + } + } +} diff --git a/UserSrc/UserApi/SummonCard/SummonCardController.cs b/UserSrc/UserApi/SummonCard/SummonCardController.cs new file mode 100644 index 0000000..7053c3d --- /dev/null +++ b/UserSrc/UserApi/SummonCard/SummonCardController.cs @@ -0,0 +1,29 @@ +using Common; +using CommonInfrastructure; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using UserService.SummonCard; + +namespace UserApi.SummonCard +{ + [ApiController, Route("api/[controller]")] + [Authorize] + public class SummonCardController : BaseController + { + private readonly ISummonCardService _summonCardService; + + public SummonCardController(ISummonCardService summonCardService) + { + _summonCardService = summonCardService; + } + + [HttpGet("use")] + public async Task> Use() + { + var res = await _summonCardService.Use(loginUser.UserId); + if (res.success) + return this.ToResult(res.message); + return this.ToFailResult(res.message); + } + } +} diff --git a/UserSrc/UserApi/User/FeedbackController.cs b/UserSrc/UserApi/User/FeedbackController.cs new file mode 100644 index 0000000..fe4cb32 --- /dev/null +++ b/UserSrc/UserApi/User/FeedbackController.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Common; +using Common.CommonModel; +using CommonInfrastructure; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using UserDomain; +using UserDomain.Entity; +using UserDomain.Param; + +namespace UserApi.User +{ + [ApiController, Route("api/[controller]")] + [Authorize] + public class FeedbackController : BaseController + { + private readonly IUserFeedbackService _feedbackService; + + public FeedbackController(IUserFeedbackService feedbackService) + { + _feedbackService = feedbackService; + } + + [HttpPost("Submit")] + public async Task> Submit([FromBody] AddFeedbackParam param) + { + var result = await _feedbackService.Submit(param, loginUser.UserId, loginUser.Number, loginUser.UserName); + if (result) + return this.ToResult("提交成功"); + else + return this.ToFailResult("提交失败"); + } + + [HttpGet("MyList")] + public async Task> GetMyList(int pageIndex = 1, int pageSize = 10) + { + var result = await _feedbackService.GetUserFeedbacks(loginUser.UserId, pageIndex, pageSize); + var dtos = result.list.Select(f => new FeedbackDto + { + Id = f.Id, + Type = f.Type, + Title = f.Title, + Content = f.Content, + Images = string.IsNullOrEmpty(f.Images) ? new List() : f.Images.Split(',').ToList(), + QQ = f.QQ ?? "", + Contact = f.Contact ?? "", + Status = f.Status, + Reply = f.Reply ?? "", + ReplyTime = f.ReplyTime.HasValue ? new DateTimeOffset(f.ReplyTime.Value).ToUnixTimeMilliseconds() : 0, + SubmitTime = new DateTimeOffset(f.SubmitTime).ToUnixTimeMilliseconds() + }); + return this.ToPageResult(dtos, (int)result.count); + } + + [HttpGet("Detail")] + public async Task> GetDetail(string id) + { + var feedback = await _feedbackService.GetById(id, loginUser.UserId); + if (feedback == null) + return this.ToFailResult("反馈不存在"); + + var dto = new FeedbackDetailDto + { + Id = feedback.Id, + Type = feedback.Type, + Title = feedback.Title, + Content = feedback.Content, + Images = string.IsNullOrEmpty(feedback.Images) ? new List() : feedback.Images.Split(',').ToList(), + QQ = feedback.QQ ?? "", + Contact = feedback.Contact ?? "", + Status = feedback.Status, + Reply = feedback.Reply ?? "", + ReplyTime = feedback.ReplyTime.HasValue ? new DateTimeOffset(feedback.ReplyTime.Value).ToUnixTimeMilliseconds() : 0, + SubmitTime = new DateTimeOffset(feedback.SubmitTime).ToUnixTimeMilliseconds() + }; + return this.ToResult(dto); + } + } + + public class FeedbackDto + { + public string Id { get; set; } + + public int Type { get; set; } + + public string Title { get; set; } + + public string Content { get; set; } + + public List Images { get; set; } + + public string QQ { get; set; } + + public string Contact { get; set; } + + public int Status { get; set; } + + public string Reply { get; set; } + + public long ReplyTime { get; set; } + + public long SubmitTime { get; set; } + } + + public class FeedbackDetailDto + { + public string Id { get; set; } + + public int Type { get; set; } + + public string Title { get; set; } + + public string Content { get; set; } + + public List Images { get; set; } + + public string QQ { get; set; } + + public string Contact { get; set; } + + public int Status { get; set; } + + public string Reply { get; set; } + + public long ReplyTime { get; set; } + + public long SubmitTime { get; set; } + } +} diff --git a/UserSrc/UserApi/User/ImageUploadController.cs b/UserSrc/UserApi/User/ImageUploadController.cs new file mode 100644 index 0000000..fec6801 --- /dev/null +++ b/UserSrc/UserApi/User/ImageUploadController.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using UserService.ImageUpload; + +namespace UserApi.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class ImageUploadController : ControllerBase + { + private readonly IImageUploadService _imageUploadService; + + public ImageUploadController(IImageUploadService imageUploadService) + { + _imageUploadService = imageUploadService; + } + + [HttpPost("upload")] + public async Task UploadFile(IFormFile file) + { + var result = await _imageUploadService.UploadImageAsync(file); + + if (!result.isOk) + { + return BadRequest(result.errorMessage); + } + + return Ok(new { path = result.path }); + } + } +} diff --git a/UserSrc/UserApi/User/UserController.cs b/UserSrc/UserApi/User/UserController.cs new file mode 100644 index 0000000..def9b18 --- /dev/null +++ b/UserSrc/UserApi/User/UserController.cs @@ -0,0 +1,341 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Common; +using Common.CommonModel; +using CommonInfrastructure; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using UserDomain.Entity; +using UserService.Param; +using UserService.User; +using UserService.User.Response; + +namespace UserApi.User +{ + [ApiController, Route("api/[controller]")] + [Authorize] + public class UserController : BaseController + { + private readonly IUserService _userService; + + public UserController(IUserService userService) + { + _userService = userService; + } + + [HttpGet("RealNameAuth")] + [Authorize] + public async Task> RealNameAuth(string realName, string idCard) + { + var result = await _userService.RealNameAuth(idCard, realName, loginUser); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("UpdateUserName")] + [Authorize] + public async Task> UpdateUserName(string userName) + { + var result = await _userService.UpdateUserName(userName, loginUser); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("BindWX")] + [Authorize] + public async Task> BindWX(string openId) + { + var result = await _userService.BindWX(openId, loginUser); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("BindMobile")] + [Authorize] + public async Task> BindMobile(string mobile, string code) + { + var result = await _userService.BindMobile(mobile, code, loginUser); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("UpdateAvatar")] + [Authorize] + public async Task> UpdateAvatar(string avatarUrl) + { + var result = await _userService.UpdateAvatar(avatarUrl, loginUser); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("UpdateAvatarFrame")] + [Authorize] + public async Task> UpdateAvatarFrame(string avatarFrame) + { + var result = await _userService.UpdateAvatarFrame(avatarFrame, loginUser); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("GetUser")] + [Authorize] + public async Task> GetUser(string userid) + { + var result = await _userService.GetUser(userid); + if (result == null) + return this.ToFailResult("用户不存在"); + return this.ToResult(result); + } + + [HttpGet("GetUserAssets")] + public async Task> GetUserAssets() + { + var user = await _userService.GetUser(loginUser.UserId); + return this.ToResult(new UserAssetsResponse + { + Gold = user.Assets.Gold, + Diamond = user.Assets.Diamond, + Props = user.Props + }); + } + + [HttpPost("GetUserList")] + [Authorize] + public async Task> GetUserList(BaseListPageParam param) + { + var result = await _userService.GetUserList(param); + var dtos = result.list.Select(u => new UserListItemDto + { + Id = u.Id, + Number = u.BaseInfo?.Number ?? "", + UserName = u.BaseInfo?.UserName ?? "", + AvatarUrl = u.BaseInfo?.AvatarUrl ?? "", + Mobile = u.BaseInfo?.Mobile ?? "", + CreateTime = u.CreateTime + }); + return this.ToPageResult(dtos, (int)result.count); + } + + [HttpPost("SendEmail")] + [Authorize] + public async Task> SendEmail(SendEmailParam param) + { + var result = await _userService.SendEmail(param, loginUser); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("GetEmail")] + [Authorize] + public async Task> GetEmail(string id) + { + var result = await _userService.GetEmail(id, loginUser); + if (result == null) + return this.ToFailResult("邮件不存在"); + + var dto = new EmailDto + { + Id = result.Id, + Title = result.Title, + Content = result.Content, + SendTime = result.SendTime, + ReadTime = result.ReadTime, + IsRead = result.IsRead, + IsReward = result.IsReward, + RewardDiamond = result.RewardDiamond, + RewardGold = result.RewardGold, + RewardItems = result.RewardItems, + ExpireTime = result.ExpireTime + }; + return this.ToResult(dto); + } + + [HttpGet("RewardEmail")] + [Authorize] + public async Task> RewardEmail(int type, string? id = "") + { + var result = await _userService.RewardEmail(type, id, loginUser); + if (result.isok) + return this.ToResult(result.model); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("DeleteEmail")] + [Authorize] + public async Task> DeleteEmail(int type, string? id = "") + { + var result = await _userService.DeleteEmail(type, id, loginUser); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("ReadEmailMore")] + [Authorize] + public async Task> ReadEmailMore() + { + var result = await _userService.ReadEmailMore(loginUser); + if (result.isok) + return this.ToResult(result.msg); + else + return this.ToFailResult(result.msg); + } + + [HttpGet("GetNoReadCount")] + [Authorize] + public async Task> GetNoReadCount() + { + var result = await _userService.GetNoReadCount(loginUser); + return this.ToResult(result); + } + + [HttpPost("GetEmailByPage")] + [Authorize] + public async Task> GetEmailByPage(GetEmailPageParam param) + { + var result = await _userService.GetEmailByPage(param, loginUser); + + return this.ToPageResult(result.list, (int)result.count); + } + + + [HttpGet("GetFishingReturnInfo")] + [Authorize] + public async Task> GetFishingReturnInfo() + { + var result = await _userService.GetFishingReturnInfo(loginUser); + var dto = new FishingReturnDto + { + TodayConsume = result.TodayConsume, + YesterdayConsume = result.YesterdayConsume, + IsClaimed = result.IsClaimed, + CanClaimGold = result.CanClaimGold + }; + return this.ToResult(dto); + } + + [HttpGet("ClaimFishingReturn")] + [Authorize] + public async Task> ClaimFishingReturn() + { + var result = await _userService.ClaimFishingReturn(loginUser); + if (result.isok) + { + return this.ToResult(new ClaimFishingReturnDto + { + Gold = result.gold, + Message = result.msg + }); + } + else + { + return this.ToFailResult(result.msg); + } + } + + } + + public class UserDto + { + public string Id { get; set; } + + public string Number { get; set; } + + public string UserName { get; set; } + + public string AvatarUrl { get; set; } + + public string Mobile { get; set; } + + public int Diamond { get; set; } + + public long Gold { get; set; } + + public int VipLevel { get; set; } + + public long CreateTime { get; set; } + } + + public class UserListItemDto + { + public string Id { get; set; } + + public string Number { get; set; } + + public string UserName { get; set; } + + public string AvatarUrl { get; set; } + + public string Mobile { get; set; } + + public long CreateTime { get; set; } + } + + public class EmailDto + { + public string Id { get; set; } + + public string Title { get; set; } + + public string Content { get; set; } + + public long SendTime { get; set; } + + public long ReadTime { get; set; } + + public bool IsRead { get; set; } + + public bool IsReward { get; set; } + + public int RewardDiamond { get; set; } + + public long RewardGold { get; set; } + + public List RewardItems { get; set; } + + public long ExpireTime { get; set; } + } + + public class FishingReturnDto + { + public long TodayConsume { get; set; } + + public long YesterdayConsume { get; set; } + + public bool IsClaimed { get; set; } + + public long CanClaimGold { get; set; } + } + + public class ClaimFishingReturnDto + { + public long Gold { get; set; } + + public string Message { get; set; } + } + + public class UserAssetsResponse + { + public long Gold { get; set; } + public int Diamond { get; set; } + public List Props { get; set; } + } +} diff --git a/UserSrc/UserApi/UserApi.csproj b/UserSrc/UserApi/UserApi.csproj new file mode 100644 index 0000000..52424e5 --- /dev/null +++ b/UserSrc/UserApi/UserApi.csproj @@ -0,0 +1,26 @@ + + + + Exe + net8.0 + enable + enable + + + + + + + + + + + + + + + + + + + diff --git a/UserSrc/UserDomain/Entity/KillFishLog.cs b/UserSrc/UserDomain/Entity/KillFishLog.cs new file mode 100644 index 0000000..a9ea192 --- /dev/null +++ b/UserSrc/UserDomain/Entity/KillFishLog.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Common.Utils; +using CommonDomain.Enum; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; + +namespace UserDomain.Entity +{ + [BsonCollection("kill_fish_log{yyyyMMdd}", ServiceDatabases.Fish)] + [BsonIgnoreExtraElements] + public class KillFishLog : MongoBaseEntity + { + public string UserId { get; set; } + + public GameTypeEnum GameType { get; set; } = GameTypeEnum.风雷之渊; + + public int RoomLevel { get; set; } = 0; + + public int RoomPartition { get; set; } = 0; + + public int RoomNumber { get; set; } = 0; + + + public string FishNumber { get; set; } + + + public int Cost { get; set; } + + + public double Income { get; set; } + public double Factor { get; set; } + public long CreateTime { get; set; } = DateTime.Now.ToTimeStamp(); + + + + } +} diff --git a/UserSrc/UserDomain/Entity/LotteryEntities.cs b/UserSrc/UserDomain/Entity/LotteryEntities.cs new file mode 100644 index 0000000..849d317 --- /dev/null +++ b/UserSrc/UserDomain/Entity/LotteryEntities.cs @@ -0,0 +1,47 @@ +using System.Collections.Generic; +using CommonDomain.BaseModel; +using MongoDB.Bson.Serialization.Attributes; +using MongoDB.Bson.Serialization.Options; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; + +namespace UserDomain.Entity +{ + [BsonCollection("lottery_record", ServiceDatabases.User)] + public class LotteryRecord : MongoBaseEntity + { + public string ActivityCycleKey { get; set; } = string.Empty; + + public string UserId { get; set; } = string.Empty; + + public string PrizeId { get; set; } = string.Empty; + + public string Level { get; set; } = string.Empty; + + public long Cost { get; set; } = 0; + + public long DrawTime { get; set; } = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + } + + [BsonCollection("lottery_user_status", ServiceDatabases.User)] + public class LotteryUserStatus : MongoBaseEntity + { + public string ActivityCycleKey { get; set; } = string.Empty; + + public long ActivityStartTime { get; set; } + + public long ActivityEndTime { get; set; } + + public string UserId { get; set; } = string.Empty; + + public List DrawnPrizeIds { get; set; } = new List(); + + public int TotalDrawCount { get; set; } = 0; + + [BsonDictionaryOptions(DictionaryRepresentation.ArrayOfDocuments)] + public Dictionary DrawCountByPool { get; set; } = new Dictionary(); + + public bool IsFinished { get; set; } = false; + } +} diff --git a/UserSrc/UserDomain/Entity/Notice.cs b/UserSrc/UserDomain/Entity/Notice.cs new file mode 100644 index 0000000..05471f7 --- /dev/null +++ b/UserSrc/UserDomain/Entity/Notice.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; + +namespace UserDomain.Entity +{ + [BsonCollection("notice", ServiceDatabases.User)] + [BsonIgnoreExtraElements] + public class Notice : MongoBaseEntity + { + public string Title { get; set; } + public string Content { get; set; } + + public string Recommend { get; set; } + public string TopImage { get; set; } + public List ContentImages { get; set; } + public long CreateTime { get; set; } + + + } +} diff --git a/UserSrc/UserDomain/Entity/Order.cs b/UserSrc/UserDomain/Entity/Order.cs new file mode 100644 index 0000000..83f93f1 --- /dev/null +++ b/UserSrc/UserDomain/Entity/Order.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; + +namespace UserDomain.Entity +{ + [BsonCollection("order", ServiceDatabases.User)] + [BsonIgnoreExtraElements] + public class Order : MongoBaseEntity + { + public string UserId { get; set; } = ""; + + public int Type { get; set; } + + public string ProductId { get; set; } = ""; + + public string ProductName { get; set; } = ""; + + + + public double Price { get; set; } + + + public int State { get; set; } = 1; + + public long PayTime { get; set; } = 0; + + + + + } +} diff --git a/UserSrc/UserDomain/Entity/ScratchCardRecord.cs b/UserSrc/UserDomain/Entity/ScratchCardRecord.cs new file mode 100644 index 0000000..1d517a6 --- /dev/null +++ b/UserSrc/UserDomain/Entity/ScratchCardRecord.cs @@ -0,0 +1,25 @@ +using CommonDomain.BaseModel; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; + +namespace UserDomain.Entity +{ + [BsonCollection("scratch_card_record", ServiceDatabases.User)] + [BsonIgnoreExtraElements] + public class ScratchCardRecord : MongoBaseEntity + { + public string UserId { get; set; } = string.Empty; + + public int PrizeType { get; set; } + + public string PrizeName { get; set; } = string.Empty; + + public int Count { get; set; } + + public BaseProduct? BaseProduct { get; set; } + + public long DrawTime { get; set; } = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + } +} diff --git a/UserSrc/UserDomain/Entity/UserBattleOrder.cs b/UserSrc/UserDomain/Entity/UserBattleOrder.cs new file mode 100644 index 0000000..df22788 --- /dev/null +++ b/UserSrc/UserDomain/Entity/UserBattleOrder.cs @@ -0,0 +1,30 @@ +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; + +namespace UserDomain.Entity +{ + [BsonCollection("user_battle_order", ServiceDatabases.User)] + [BsonIgnoreExtraElements] + public class UserBattleOrder : MongoBaseEntity + { + public string UserId { get; set; } + + public int Level { get; set; } = 1; + + public long Exp { get; set; } = 0; + + public List PurchasedAdvances { get; set; } = new List(); + + public List NormalReceivedLevels { get; set; } = new List(); + + public List LuxuryReceivedLevels { get; set; } = new List(); + + public List SupremeReceivedLevels { get; set; } = new List(); + + public long StartTime { get; set; } + + public long EndTime { get; set; } + } +} \ No newline at end of file diff --git a/UserSrc/UserDomain/Entity/UserEmail.cs b/UserSrc/UserDomain/Entity/UserEmail.cs new file mode 100644 index 0000000..be52342 --- /dev/null +++ b/UserSrc/UserDomain/Entity/UserEmail.cs @@ -0,0 +1,31 @@ +using System.ComponentModel.DataAnnotations.Schema; +using Common.Utils; +using CommonDomain.BaseModel; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; + +namespace UserDomain.Entity +{ + [BsonCollection("user_email", ServiceDatabases.User)] + [BsonIgnoreExtraElements] + public class UserEmail : MongoBaseEntity + { + public string UserId { get; set; } + + public string Title { get; set; } + public string Content { get; set; } + public long SendTime { get; set; }=DateTime.Now.ToTimeStamp(); + public long ReadTime { get; set; }=0; + public bool IsRead { get; set; }=false; + + public bool IsReward { get; set; }=false; + public int RewardDiamond { get; set; }=0; + public long RewardGold { get; set; }=0; + [Column(TypeName = "jsonb")] + public List RewardItems { get; set; } = new List(); + public long ExpireTime { get; set; } = 0; + } + +} diff --git a/UserSrc/UserDomain/Entity/UserEntity.cs b/UserSrc/UserDomain/Entity/UserEntity.cs new file mode 100644 index 0000000..79b84ec --- /dev/null +++ b/UserSrc/UserDomain/Entity/UserEntity.cs @@ -0,0 +1,362 @@ +using System.ComponentModel.DataAnnotations.Schema; +using Common.Utils; +using CommonDomain; +using CommonDomain.BaseModel; +using CommonDomain.Enum; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; +using XAct; + +namespace UserDomain.Entity +{ + [BsonCollection("user", ServiceDatabases.User)] + [BsonIgnoreExtraElements] + public class UserEntity : MongoBaseEntity + { + + [Column(TypeName = "jsonb")] + public UserBaseInfo BaseInfo= new UserBaseInfo(); + + [Column(TypeName = "jsonb")] + public RealNameInfo RealName { get; set; } + + [Column(TypeName = "jsonb")] + public SafeBoxInfo SafeBox { get; set; } = new SafeBoxInfo(); + + public SignInfo Sign { get; set; } + + public List CannonList { get; set; }=new List(); + + public BaseUserProp CannonUsing { get; set; } + + public BaseUserProp WingUsing { get; set; } + + public List WingList { get; set; } = new List(); + + + public BaseUserProp GodWarUsing { get; set; } + + public List GodWarList { get; set; } = new List(); + + [Column(TypeName = "jsonb")] + public List Props { get; set; } = new List(); + + [Column(TypeName = "jsonb")] + public Assets Assets { get; set; } = new Assets(); + public long CreateTime { get; set; } = 0; + + public string RegisterIp { get; set; } = ""; + + [Column(TypeName = "jsonb")] + public BanInfo BanInfo { get; set; } + [Column(TypeName = "jsonb")] + public StaticInfo Static { get; set; } = new StaticInfo(); + [Column(TypeName = "jsonb")] + public PlayerFactor PlayerFactor { get; set; } = new PlayerFactor(); + + public int UserType { get; set; } = 1; + + public FishingReturnInfo FishingReturn { get; set; } = new FishingReturnInfo(); + + + + + + + + + + public void Init(GameConfig gameConfig, ActivityConfig activityConfig) + { + CreateTime = DateTime.Now.ToTimeStamp(); + CreateInfo = new OptionUserInfo(BaseInfo.Number, BaseInfo.UserName); + Static.ReliefGoldCount = activityConfig?.ReliefConfig.Count ?? 3; + Sign = new SignInfo(); + + Assets.Gold = activityConfig?.RegisterConfig.InitGold ?? 0; + Assets.Diamond = activityConfig?.RegisterConfig.InitDiamond ?? 0; + BaseInfo.AvatarUrl = "UI_touxiang_01_11 "; + BaseInfo.AvatarFrame = "五一专属头像框"; + PlayerFactor = new PlayerFactor() + { + IsBlack = false, + CompensateQuota=0, + PenaltyQuota=0, + AdditionalFactor=1, + StartingBonus = activityConfig?.RegisterConfig.InitGold ?? 0, + ViolateValue = 1, + CompensateRate = gameConfig.KillConfig.CompensateRate, + PenaltyRate = gameConfig.KillConfig.PenaltyRate, + + }; + + if (activityConfig?.RegisterConfig.InitProductList!=null && activityConfig.RegisterConfig.InitProductList.Count > 0) + { + foreach (var product in activityConfig.RegisterConfig.InitProductList.Where(c=> ProductType.MoreProductTypeList.Contains(c.Type))) + { + Props.Add(product); + } + foreach (var item in activityConfig.RegisterConfig.InitProductList.Where(c => !ProductType.MoreProductTypeList.Contains(c.Type))) + { + var propConfig = gameConfig.PropConfig.FirstOrDefault(c => c.Number == item.Number); + BaseUserProp baseUserProp = null; + if (propConfig != null) + { + baseUserProp = new BaseUserProp + { + Number = item.Number, + Type = item.Type, + Name = item.Name, + ImageUrl = item.ImageUrl, + Desc = item.Desc, + Level = item.Level + + }; + if (propConfig.Day > 0) + { + baseUserProp.IsTrial = true; + baseUserProp.TrialEndTime = DateTime.Now.AddDays(propConfig.Day).ToTimeStamp(); + } + } + if (item.Type== ProductTypeEnum.战神 && baseUserProp != null) + { + GodWarList.Add(baseUserProp); + } + else if (item.Type == ProductTypeEnum.翅膀 && baseUserProp != null) + { + WingList.Add(baseUserProp); + } + else if (item.Type == ProductTypeEnum.炮台 && baseUserProp != null) + { + CannonList.Add(baseUserProp); + if (CannonUsing == null) + CannonUsing = baseUserProp; + } + } + + } + + } + + public List VipLevelVerify(GameConfig config) + { + if (config?.VipLevelConfigs == null) + return null; + var vipExp = Math.Max(0D, Static.TotalRecharge * 10) + Math.Max(0L, Assets.VipExpExtra); + Assets.VipExp = (long)vipExp; + var level = config.VipLevelConfigs.FirstOrDefault(c => vipExp >= c.ExpMin && vipExp < c.ExpMax); + if (level == null) + return null; + var oldLevel = Assets.VipLevel; + if (level.Level != oldLevel) + { + if (level.Level > oldLevel) + { + Assets.VipLevel = level.Level; + Assets.VipSignInAdd = level.SignInAdd; + var newLevels = config.VipLevelConfigs + .Where(c => c.Level > oldLevel && c.Level <= level.Level) + .Select(c => c.Level) + .ToList(); + foreach (var lvl in newLevels) + { + if (!Assets.VipGift.Contains(lvl)) + Assets.VipGift.Add(lvl); + } + return newLevels; + } + else + { + Assets.VipLevel = level.Level; + Assets.VipSignInAdd = level.SignInAdd; + } + } + return null; + } + + + + public (bool isLevel, long gold, int diamond, List list) LevelVerify(long addExp, List levelConfig) + { + Assets.Exp += addExp; + var config = levelConfig.FirstOrDefault(c => Assets.Exp >= c.ExpMin && Assets.Exp < c.ExpMax); + if (config == null) + return (false, 0, 0, null); + + if (config.Level != Assets.Level) + { + Assets.Level = config.Level; + return (true, config.Gold, config.Diamond, config.ProductList); + } + return (false, 0, 0, null); + } + + + + } + [BsonIgnoreExtraElements] + public class SignInfo + { + public bool IsSign { get; set; } = false; + public long SignTime { get; set; } = 0; + } + [BsonIgnoreExtraElements] + public class PlayerFactor + { + + public bool IsIgnore { get; set; } = false; + + public bool IsBlack { get; set; } = false; + + public double ViolateValue { get; set; } = 1; + + + public CompensateRateParam CompensateRate { get; set; } = new CompensateRateParam(); + + + public CompensateRateParam PenaltyRate { get; set; } = new CompensateRateParam(); + + public int CompensateQuota { get; set; } = 0; + + public long CompensateStartGold { get; set; } = 0; + + public long CompensateTargetGold { get; set; } = 0; + + public int PenaltyQuota { get; set; } = 0; + + public long StartingBonus { get; set; } = 0; + + public double MissRate { get; set; } = 0; + + public double AdditionalFactor { get; set; } = 1; + + } + + [BsonIgnoreExtraElements] + public class StaticInfo + { + + public long LastLoginTime { get; set; } = 0; + public string LastLoginIp { get; set; } = ""; + + public long OnlineTime { get; set; } = 0; + + public long GameTime { get; set; } = 0; + + public string RoomNumber { get; set; } = ""; + + public int CurrentGameType { get; set; } = 0; + + public double TotalRecharge { get; set; } = 0; + + public long TotalRechargeGold { get; set; } = 0; + + public long TotalConsumeGold { get; set; } = 0; + + public int TotalConsumeDiamond { get; set; } = 0; + + public int ReliefGoldCount {get; set; } = 0; + + + + } + [BsonIgnoreExtraElements] + public class BanInfo + { + public bool IsBan { get; set; } = false; + public long BanTime { get; set; } = 0; + public string BanReason { get; set; } = ""; + public int BanDays { get; set; } = 0; + public long BanEndTime { get; set; } = 0; + } + [BsonIgnoreExtraElements] + public class UserBaseInfo + { + public string UserName { get; set; } = string.Empty; + public string Password { get; set; } = string.Empty; + + public string Number { get; set; } = string.Empty; + + public string AvatarUrl { get; set; } = string.Empty; + + public string AvatarFrame { get; set; } = string.Empty; + + public string Mobile { get; set; } = string.Empty; + + public string WXOpenId { get; set; } = string.Empty; + + public string Channel { get; set; } = string.Empty; + + public bool IsRedName { get; set; } = false; + } + + + [BsonIgnoreExtraElements] + public class Assets + { + + public bool IsDealer { get; set; } = false; + + + public double ViolateRate { get; set; } = 1; + + public int Diamond { get; set; } = 0; + public long Gold { get; set; } = 0; + public int Level { get; set; } = 0; + public long Exp { get; set; } = 0; + + public long VipExp { get; set; } = 0; + + public long VipExpExtra { get; set; } = 0; + + public double VipSignInAdd { get; set; } = 0; + public int VipLevel { get; set; } = 0; + + + public List VipGift { get; set; } = new List(); + + + public bool IsVipDayGift { get; set; } = false; + + + } + [BsonIgnoreExtraElements] + public class RealNameInfo + { + public string RealName { get; set; } = string.Empty; + public string IDCard { get; set; } = string.Empty; + } + [BsonIgnoreExtraElements] + public class SafeBoxInfo + { + public long Amount { get; set; } = 0; + + public string Password { get; set; } = ""; + + public long SaveTime { get; set; } = 0; + } + + [BsonIgnoreExtraElements] + public class BaseUserProp : BaseProduct + { + public bool IsTrial { get; set; } = false; + public long TrialEndTime { get; set; } = 0; + } + + [BsonIgnoreExtraElements] + public class FishingReturnInfo + { + public long TodayConsume { get; set; } = 0; + + public long YesterdayConsume { get; set; } = 0; + + public bool IsClaimed { get; set; } = false; + + public string LastFishingDate { get; set; } = ""; + + [BsonIgnore] + public long CanClaimGold { get; set; } = 0; + } +} diff --git a/UserSrc/UserDomain/Entity/UserFeedback.cs b/UserSrc/UserDomain/Entity/UserFeedback.cs new file mode 100644 index 0000000..a8dc3fc --- /dev/null +++ b/UserSrc/UserDomain/Entity/UserFeedback.cs @@ -0,0 +1,60 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; + +namespace UserDomain.Entity +{ + [BsonCollection("user_feedback", ServiceDatabases.User)] + [BsonIgnoreExtraElements] + public class UserFeedback : MongoBaseEntity + { + [BsonElement("userid")] + public string? UserId { get; set; } + + [BsonElement("usernumber")] + public string? UserNumber { get; set; } + + [BsonElement("username")] + public string? UserName { get; set; } + + [BsonElement("type")] + public int Type { get; set; } = 1; + + [BsonElement("title")] + public string? Title { get; set; } + + [BsonElement("content")] + public string? Content { get; set; } + + [BsonElement("images")] + public string? Images { get; set; } + + [BsonElement("qq")] + public string? QQ { get; set; } + + [BsonElement("contact")] + public string? Contact { get; set; } + + [BsonElement("status")] + public int Status { get; set; } = 0; + + [BsonElement("reply")] + public string? Reply { get; set; } + + [BsonElement("replytime")] + [BsonDateTimeOptions(Kind = DateTimeKind.Local, DateOnly = false)] + public DateTime? ReplyTime { get; set; } + + [BsonElement("replyadminid")] + public string? ReplyAdminId { get; set; } + + [BsonElement("replyadminname")] + public string? ReplyAdminName { get; set; } + + [BsonElement("submittime")] + [BsonDateTimeOptions(Kind = DateTimeKind.Local, DateOnly = false)] + public DateTime SubmitTime { get; set; } = DateTime.Now; + } +} diff --git a/UserSrc/UserDomain/Entity/UserLoginLog.cs b/UserSrc/UserDomain/Entity/UserLoginLog.cs new file mode 100644 index 0000000..5ef396b --- /dev/null +++ b/UserSrc/UserDomain/Entity/UserLoginLog.cs @@ -0,0 +1,53 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; + +namespace UserDomain.Entity +{ + [BsonCollection("user_login_log", ServiceDatabases.User)] + [BsonIgnoreExtraElements] + public class UserLoginLog : MongoBaseEntity + { + [BsonElement("userid")] + public string? UserId { get; set; } + + [BsonElement("usernumber")] + public string? UserNumber { get; set; } + + [BsonElement("username")] + public string? UserName { get; set; } + + [BsonElement("logintype")] + public int LoginType { get; set; } = 1; + + [BsonElement("status")] + public int Status { get; set; } = 1; + + [BsonElement("ip")] + public string? Ip { get; set; } + + [BsonElement("iplocation")] + public string? IpLocation { get; set; } + + [BsonElement("devicetype")] + public string? DeviceType { get; set; } + + [BsonElement("deviceid")] + public string? DeviceId { get; set; } + + [BsonElement("platform")] + public int Platform { get; set; } = 1; + + [BsonElement("clientversion")] + public string? ClientVersion { get; set; } + + [BsonElement("failreason")] + public string? FailReason { get; set; } + + [BsonElement("logintime")] + [BsonDateTimeOptions(Kind = DateTimeKind.Local, DateOnly = false)] + public DateTime LoginTime { get; set; } = DateTime.Now; + } +} diff --git a/UserSrc/UserDomain/Entity/UserReward.cs b/UserSrc/UserDomain/Entity/UserReward.cs new file mode 100644 index 0000000..12ae4cf --- /dev/null +++ b/UserSrc/UserDomain/Entity/UserReward.cs @@ -0,0 +1,43 @@ +using Common.Utils; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; +using UserDomain.Enum; + +namespace UserDomain.Entity +{ + [BsonCollection("user_reward", ServiceDatabases.User)] + [BsonIgnoreExtraElements] + public class UserReward : MongoBaseEntity + { + public string UserId { get; set; } + + public int Type { get; set; } + + public RewardSource Source { get; set; } + + public int CurrencyType { get; set; } + public long BeforeCount { get; set; } + + public long ChangeCount { get; set; } + + public long AfterCount { get; set; } + + + public string OtherId { get; set; }=string.Empty; + + public string OtherUserId { get; set; } = string.Empty; + + public string Remark { get; set; } = string.Empty; + + + public string RoomName { get; set; } = string.Empty; + + public string RoomInfo { get; set; } = string.Empty; + + public int Tax { get; set; }=0; + + public long CreateTime { get; set; }=DateTime.Now.ToTimeStamp(); + } +} diff --git a/UserSrc/UserDomain/Entity/UserTask.cs b/UserSrc/UserDomain/Entity/UserTask.cs new file mode 100644 index 0000000..54426bb --- /dev/null +++ b/UserSrc/UserDomain/Entity/UserTask.cs @@ -0,0 +1,39 @@ +using System.ComponentModel.DataAnnotations.Schema; +using CommonDomain.BaseModel; +using CommonDomain.Enum; +using MongoDB.Bson.Serialization.Attributes; +using MongoRepository; +using MongoRepository.Attributes; +using MongoRepository.Config; +using UserDomain.Enum; + +namespace UserDomain.Entity +{ + [BsonCollection("user_task", ServiceDatabases.User)] + [BsonIgnoreExtraElements] + public class UserTask : MongoBaseEntity + { + public string UserId { get; set; } + public string Number { get; set; } + public string Remark { get; set; } + public TaskType TaskType { get; set; } + public TaskEvent TaskEvent { get; set; } + public int TaskCount { get; set; } + public double Count { get; set; } + + public bool IsFinish { get; set; }=false; + + public string OtherId { get; set; } + + public bool IsGet { get; set; }=false; + + public long TaskAddTime { get; set; } + public long TaskEndTime { get; set; }=0; + + + public long TaskFinishTime { get; set; } = 0; + + + public long Exp { get; set; } + } +} diff --git a/UserSrc/UserDomain/Enum/BattleOrderType.cs b/UserSrc/UserDomain/Enum/BattleOrderType.cs new file mode 100644 index 0000000..5e1eb39 --- /dev/null +++ b/UserSrc/UserDomain/Enum/BattleOrderType.cs @@ -0,0 +1,9 @@ +namespace UserDomain.Enum +{ + public enum BattleOrderType + { + 普通 = 1, + 豪华 = 2, + 至尊 = 3 + } +} \ No newline at end of file diff --git a/UserSrc/UserDomain/Enum/RewardSource.cs b/UserSrc/UserDomain/Enum/RewardSource.cs new file mode 100644 index 0000000..d2dabdd --- /dev/null +++ b/UserSrc/UserDomain/Enum/RewardSource.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UserDomain.Enum +{ + public enum RewardSource + { + 无=0, + 邮件=1, + 救济金=2, + 保险箱=3, + 道具 = 4, + 金币商城=5, + 签到=6, + 开炮=7, + Vip每日礼包=8, + Vip权益礼包=9, + 月卡每日礼包=10, + 月卡权益礼包=11, + 充值=12, + 游戏金币结算=13, + 击杀鱼 = 14, + 用户升级=15, + 任务奖励=16, + 象棋=17, + 战令购买=18, + 活动奖励=19, + + 刮刮卡=20, + + 击杀Boss=21, + + 召唤卡=22, + + 鱼雷=23, + + 后台操作 = 99 + } +} diff --git a/UserSrc/UserDomain/Enum/UserAssetChangeTypeEnum.cs b/UserSrc/UserDomain/Enum/UserAssetChangeTypeEnum.cs new file mode 100644 index 0000000..7b53636 --- /dev/null +++ b/UserSrc/UserDomain/Enum/UserAssetChangeTypeEnum.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UserDomain.Enum +{ + public enum UserAssetChangeTypeEnum + { + 增加=1, + 减少=2 + } +} diff --git a/UserSrc/UserDomain/Param/FeedbackParam.cs b/UserSrc/UserDomain/Param/FeedbackParam.cs new file mode 100644 index 0000000..37cd814 --- /dev/null +++ b/UserSrc/UserDomain/Param/FeedbackParam.cs @@ -0,0 +1,47 @@ +namespace UserDomain.Param +{ + public class AddFeedbackParam + { + public int Type { get; set; } = 1; + + public string? Title { get; set; } + + public string? Content { get; set; } + + public string? Images { get; set; } + + public string? QQ { get; set; } + + public string? Contact { get; set; } + } + + public class FeedbackQueryParam + { + public string? UserId { get; set; } + + public string? UserNumber { get; set; } + + public string? UserName { get; set; } + + public int? Type { get; set; } + + public int? Status { get; set; } + + public DateTime? StartTime { get; set; } + + public DateTime? EndTime { get; set; } + + public int PageIndex { get; set; } = 1; + + public int PageSize { get; set; } = 10; + } + + public class ReplyFeedbackParam + { + public string? Id { get; set; } + + public string? Reply { get; set; } + + public int Status { get; set; } + } +} diff --git a/UserSrc/UserDomain/Param/UserLoginLogQueryParam.cs b/UserSrc/UserDomain/Param/UserLoginLogQueryParam.cs new file mode 100644 index 0000000..7f80bf8 --- /dev/null +++ b/UserSrc/UserDomain/Param/UserLoginLogQueryParam.cs @@ -0,0 +1,25 @@ +namespace UserDomain.Param +{ + public class UserLoginLogQueryParam + { + public string? UserId { get; set; } + + public string? UserNumber { get; set; } + + public string? UserName { get; set; } + + public int? LoginType { get; set; } + + public int? Status { get; set; } + + public DateTime? StartTime { get; set; } + + public DateTime? EndTime { get; set; } + + public int? Platform { get; set; } + + public int PageIndex { get; set; } = 1; + + public int PageSize { get; set; } = 10; + } +} diff --git a/UserSrc/UserDomain/UserDomain.csproj b/UserSrc/UserDomain/UserDomain.csproj new file mode 100644 index 0000000..3a45e40 --- /dev/null +++ b/UserSrc/UserDomain/UserDomain.csproj @@ -0,0 +1,24 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + + + + + diff --git a/UserSrc/UserHost/.dockerignore b/UserSrc/UserHost/.dockerignore new file mode 100644 index 0000000..fe1152b --- /dev/null +++ b/UserSrc/UserHost/.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/UserSrc/UserHost/Config/system.json b/UserSrc/UserHost/Config/system.json new file mode 100644 index 0000000..91df76e --- /dev/null +++ b/UserSrc/UserHost/Config/system.json @@ -0,0 +1,49 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "urls": "http://*:8001", + + "AllowedHosts": "*", + "JwtConfig": { + "TokenKey": "token", + "Issuer": "admin", + "Audience": "", + "SecretKey": "henanhuashengchongwuyouxiangongsikejizhongxin", + "ValidateIssuer": false, + "ValidateAudience": false, + "ValidateIssuerSigningKey": false, + "ValidateLifetime": false + }, + "ConnectionStrings": { + "PgSqlConnection": "host=localhost;database=data_0524;user id=data_0524;password=123456;" + }, + "CapConfig": { + "Host": "localhost", + "UserName": "admin", + "Password": "123456", + "VirtualHost": "/", + "PGLogHost": "host=localhost;database=data_0524;user id=data_0524;password=123456;" + }, + "RedisConfig": { + "Host": "localhost", + "Port": 6379, + "UserName": "", + "Password": "123456", + "Database": 1, + "ConnectionString": "localhost:6379,password=123456,defaultDatabase=2,abortConnect=false" + }, + "MongoDbSettings": { + "username": "root", + "password": "root23456", + "ServerUrl": "mongodb://localhost:27017" + }, + "WXConfig": { + "AppId": "wxceab9ce5b4474219", + "Secret": "5a291d7b295c76da579611da3f83e059", + "Url": "https://api.weixin.qq.com" + } +} diff --git a/UserSrc/UserHost/Extension/CapExtension.cs b/UserSrc/UserHost/Extension/CapExtension.cs new file mode 100644 index 0000000..cf3de97 --- /dev/null +++ b/UserSrc/UserHost/Extension/CapExtension.cs @@ -0,0 +1,61 @@ +using DotNetCore.CAP.Messages; +using UserService.User; + +namespace UserHost.Extension +{ + public static class CapExtension + { + public static IServiceCollection AddCap(this IServiceCollection services, IConfiguration configuration) + { + services.AddCap(x => + { + x.UseDashboard(); + x.UseRabbitMQ(rb => + { + rb.HostName = configuration["CapConfig:Host"]; + rb.UserName = configuration["CapConfig:UserName"]; + rb.Password = configuration["CapConfig:Password"]; + rb.VirtualHost = configuration["CapConfig:VirtualHost"]; + rb.ExchangeName = "cap.exchange"; + }); + x.UsePostgreSql(op => + { + op.ConnectionString = configuration["CapConfig:PGLogHost"]; + op.Schema = "public"; + }); + + + + x.SucceedMessageExpiredAfter = 7 * 24 * 3600; + x.FailedRetryCount = 5; + x.FailedRetryInterval = 10; + x.FailedThresholdCallback = ObjFailedThresholdCallback; + + + }); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + return services; + } + + private static async void ObjFailedThresholdCallback(FailedInfo failed) + { + var exception = failed.Message.Headers["cap-exception"] ?? string.Empty; + var name = failed.Message.GetName(); + if (failed.MessageType == MessageType.Publish) + { + + } + else + { + + } + } + } +} diff --git a/UserSrc/UserHost/Middleware/ApiLoggingMiddleware.cs b/UserSrc/UserHost/Middleware/ApiLoggingMiddleware.cs new file mode 100644 index 0000000..496e32d --- /dev/null +++ b/UserSrc/UserHost/Middleware/ApiLoggingMiddleware.cs @@ -0,0 +1,167 @@ + +using System.Text; +using Common; +using CommonDomain; +using CommonService; +using Newtonsoft.Json; + +namespace UserHost.Middleware +{ + public class ApiLoggingMiddleware + { + private readonly RequestDelegate _next; + private readonly ILogger _logger; + private readonly IApiLogService _apiLogService; + + public ApiLoggingMiddleware(RequestDelegate next, ILogger logger, IApiLogService apiLogService) + { + _next = next; + _logger = logger; + _apiLogService = apiLogService; + } + public async Task Invoke(HttpContext httpContext) + { + var request = httpContext.Request; + if (request.Path.StartsWithSegments(new PathString("/api")) && request.Method.ToLower() != "options") + { + var requestTime = DateTime.Now; + var requestBodyContent = string.Empty; + var originalRequest = httpContext.Response.Body; + if (request.Method == "POST") + { + request.EnableBuffering(); + requestBodyContent = await new StreamReader(request.Body).ReadToEndAsync(); + request.Body.Position = 0; + } + + try + { + using (var responseBody = new MemoryStream()) + { + var response = httpContext.Response; + response.Body = responseBody; + await _next(httpContext); + string responseBodyContent = null; + responseBodyContent = await FormatResponse(response); + await responseBody.CopyToAsync(originalRequest); + + string token = string.Empty, version = string.Empty, userAgent = string.Empty, source = string.Empty, deviceId = string.Empty, device = string.Empty, ip = string.Empty,sign=string.Empty; + if (httpContext.Request != null && httpContext.Request.Headers != null) + { + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Token"])) + { + token = httpContext.Request.Headers["Token"] + ""; } + + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Version"])) + { + version = httpContext.Request.Headers["Version"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["User-Agent"])) + { + userAgent = httpContext.Request.Headers["User-Agent"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Source"])) + { + source = httpContext.Request.Headers["Source"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["DeviceId"])) + { + deviceId = httpContext.Request.Headers["DeviceId"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Device"])) + { + device = httpContext.Request.Headers["Device"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Ip"])) + { + ip = httpContext.Request.Headers["Ip"] + ""; + } + if (!string.IsNullOrEmpty(httpContext.Request.Headers["Sign"])) + { + sign = httpContext.Request.Headers["Sign"] + ""; + } + } + string allResponseContent = responseBodyContent; + try + { + if (!string.IsNullOrEmpty(responseBodyContent)) + { + BaseResponse baseResponse = JsonConvert.DeserializeObject>(responseBodyContent); + if (baseResponse != null && baseResponse.Data != null) + { + baseResponse.Data = null; + } + responseBodyContent = JsonConvert.SerializeObject(baseResponse); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "API响应日志脱敏序列化失败 path={Path}", request.Path); +} + var now = DateTime.Now; + var apilog = new ApiLog() + { + requestTime = now, + accessToken = token, + clientIP = httpContext.Connection.RemoteIpAddress.ToString(), + consumeTime = (DateTime.Now - requestTime).Milliseconds, + requestHead= JsonConvert.SerializeObject(httpContext.Request.Headers), + requestUrl = request.Path, + requestMethod = request.Method.ToLower(), + requestQuery = request.QueryString.ToString(), + requestBody = requestBodyContent, + httpStatus = httpContext.Response.StatusCode, + responseBody = responseBodyContent, + userAgent = userAgent, + device= device, + deviceId= deviceId, + ip=ip, + source=source, + version=version, + sign=sign + }; + await _apiLogService.InsertOneAsync(apilog); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "API日志记录失败 path={Path}", request.Path); + } + finally + { + httpContext.Response.Body = originalRequest; + } + } + else + { + await _next(httpContext); + } + } + private async Task FormatRequest(Microsoft.AspNetCore.Http.HttpRequest request) + { + var body = request.Body; + request.EnableBuffering(); + var buffer = new byte[Convert.ToInt32(request.ContentLength)]; + await request.Body.ReadAsync(buffer, 0, buffer.Length); + var bodyAsText = Encoding.UTF8.GetString(buffer); + request.Body = body; + return bodyAsText; + } + + private async Task FormatResponse(HttpResponse response) + { + response.Body.Seek(0, SeekOrigin.Begin); + string text = await new StreamReader(response.Body).ReadToEndAsync(); + response.Body.Seek(0, SeekOrigin.Begin); + return text; + } + } + + public static class ApiLoggingMiddlewareExtensions + { + public static IApplicationBuilder UseApiLogging(this IApplicationBuilder app) + { + return app.UseMiddleware(); + } + } +} diff --git a/UserSrc/UserHost/Middleware/AutofacModule.cs b/UserSrc/UserHost/Middleware/AutofacModule.cs new file mode 100644 index 0000000..dc79d12 --- /dev/null +++ b/UserSrc/UserHost/Middleware/AutofacModule.cs @@ -0,0 +1,23 @@ +using System.Reflection; +using SharpAbp.Infrastructure.Api.Autofac; +using UserService.User; +using IUserService = UserService.User.IUserService; +using CommonService; + +namespace UserHost.Middleware +{ + public class AutofacModule : ApplicationModule + { + protected override Assembly CurrentAssembly => typeof(Program).Assembly; + + protected override Assembly[] GetServiceAssemblies() + { + return new[] + { + typeof(IUserService).Assembly, + typeof(UserService.User.UserService).Assembly, + typeof(ApiLogService).Assembly + }; + } + } +} diff --git a/UserSrc/UserHost/Program.cs b/UserSrc/UserHost/Program.cs new file mode 100644 index 0000000..eb5441f --- /dev/null +++ b/UserSrc/UserHost/Program.cs @@ -0,0 +1,166 @@ +using Autofac; +using Autofac.Extensions.DependencyInjection; +using Common.Request; +using Common.WX; + +using JWTHelper; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Microsoft.Extensions.Options; +using MongoRepository.Config; +using NLog.Extensions.Logging; +using NLog.Web; +using RedisHelper; +using RedisService; +using ScheduledService; +using SharpAbp.Infrastructure.Api.Middleware; +using StackExchange.Redis; +using System.Text.Json; +using UserApi; // <-- assembly marker +using UserHost.Extension; +using UserHost.Middleware; +using UserService; +using UserService.Hubs; +using UserService.Jobs; + +Environment.SetEnvironmentVariable("SERVICE_NAME", + Environment.GetEnvironmentVariable("SERVICE_NAME") + ?? System.Reflection.Assembly.GetEntryAssembly()?.GetName().Name + ?? "UserHost"); +Environment.SetEnvironmentVariable("INSTANCE_ID", + Environment.GetEnvironmentVariable("INSTANCE_ID") ?? "default"); + +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. + +builder.Services.AddControllers() + .AddApplicationPart(typeof(AssemblyMarker).Assembly) + .AddControllersAsServices(); + +builder.Logging.AddNLog(); +builder.Host.UseNLog(); + +builder.Services.AddControllers().AddNewtonsoftJson( + option => option.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss" +); + +builder.Configuration.AddJsonFile(Path.Combine("Config", "system.json"), optional: true); +builder.Services.Configure(builder.Configuration.GetSection(nameof(MongoDbSettings))); +builder.Services.AddSingleton(sp => sp.GetRequiredService>().Value); + +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); +builder.Services.AddAutoMapper(typeof(AutoMapperConfig)); +builder.Services.AddScoped(); + +builder.Services.AddHealthChecks() + .AddCheck("self", () => HealthCheckResult.Healthy(), tags: new[] { "self" }); + + + + +builder.Services.AddSignalR(hubOptions => +{ + + hubOptions.MaximumReceiveMessageSize = 64 * 1024; // 64KB + hubOptions.StreamBufferCapacity = 512; // + hubOptions.ClientTimeoutInterval = TimeSpan.FromSeconds(70); + hubOptions.KeepAliveInterval = TimeSpan.FromSeconds(15); +}).AddJsonProtocol() +.AddStackExchangeRedis(builder.Configuration["RedisConfig:ConnectionString"], options => +{ + options.Configuration.ChannelPrefix = RedisChannel.Literal("GameHub"); +}); +#region +builder.Services.AddCors(options => +{ + options.AddPolicy("Cors", policy => + { + policy + .SetIsOriginAllowed(_ => true) + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials(); + }); +}); +#endregion + +#region jwt +builder.Services.AddCustomJwt(builder.Configuration); +#endregion + +#region redis +builder.Services.AddRedisCache(builder.Configuration); +#endregion + +#region Cap + +builder.Services.AddCap(builder.Configuration); +#endregion + + +builder.Services.AddCronJob(c => +{ + c.TimeZoneInfo = TimeZoneInfo.Local; + c.CronExpression = @"0 0 0 * * *"; +}); +builder.Services.AddCronJob(c => +{ + c.TimeZoneInfo = TimeZoneInfo.Local; + c.CronExpression = @"0 0 0 * * *"; +}); + +// Autofac +builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); +builder.Host.ConfigureContainer(builder => +{ + builder.RegisterModule(); +}); + +var app = builder.Build(); + + + +// +if (app.Environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} +app.UseCors("Cors"); +app.UseRouting(); +app.MapHub("/loginhub", options => +{ + options.Transports = Microsoft.AspNetCore.Http.Connections.HttpTransportType.WebSockets; +}); +app.UseAuthentication(); +app.UseAuthorization(); +app.UseApiLogging(); + +app.MapControllers(); + +app.UseGlobalExceptionHandler(); +app.MapHealthChecks("/health", new HealthCheckOptions +{ + Predicate = _ => true, + ResponseWriter = async (context, report) => + { + context.Response.ContentType = "application/json"; + var result = new + { + status = report.Status.ToString(), + checks = report.Entries.Select(e => new + { + name = e.Key, + status = e.Value.Status.ToString(), + description = e.Value.Description, + duration = e.Value.Duration.TotalMilliseconds + }), + totalDuration = report.TotalDuration.TotalMilliseconds + }; + await context.Response.WriteAsync(JsonSerializer.Serialize(result)); + } +}); + +app.Run(); diff --git a/UserSrc/UserHost/Properties/launchSettings.json b/UserSrc/UserHost/Properties/launchSettings.json new file mode 100644 index 0000000..7a323d1 --- /dev/null +++ b/UserSrc/UserHost/Properties/launchSettings.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:59094", + "sslPort": 44344 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:8001", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:7000;http://localhost:5017", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/UserSrc/UserHost/UserHost.csproj b/UserSrc/UserHost/UserHost.csproj new file mode 100644 index 0000000..f162074 --- /dev/null +++ b/UserSrc/UserHost/UserHost.csproj @@ -0,0 +1,43 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + + + + + + + + + + + + + + Always + + + Always + + + + + + + diff --git a/UserSrc/UserHost/appsettings.Development.json b/UserSrc/UserHost/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/UserSrc/UserHost/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/UserSrc/UserHost/appsettings.json b/UserSrc/UserHost/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/UserSrc/UserHost/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/UserSrc/UserHost/docker-compose.yaml b/UserSrc/UserHost/docker-compose.yaml new file mode 100644 index 0000000..52e8f63 --- /dev/null +++ b/UserSrc/UserHost/docker-compose.yaml @@ -0,0 +1,8 @@ +name: webapi +services: + 0524user: + image: 0524user + container_name: '0524user' + restart: always + ports: + - '5245:80' \ No newline at end of file diff --git a/UserSrc/UserHost/wwwroot/index.html b/UserSrc/UserHost/wwwroot/index.html new file mode 100644 index 0000000..125a5a8 --- /dev/null +++ b/UserSrc/UserHost/wwwroot/index.html @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/UserSrc/UserHost/wwwroot/uploads/40001.png b/UserSrc/UserHost/wwwroot/uploads/40001.png new file mode 100644 index 0000000..59bbe7d Binary files /dev/null and b/UserSrc/UserHost/wwwroot/uploads/40001.png differ diff --git a/UserSrc/UserHost/wwwroot/uploads/40002.png b/UserSrc/UserHost/wwwroot/uploads/40002.png new file mode 100644 index 0000000..f953438 Binary files /dev/null and b/UserSrc/UserHost/wwwroot/uploads/40002.png differ diff --git a/UserSrc/UserHost/wwwroot/uploads/40003.png b/UserSrc/UserHost/wwwroot/uploads/40003.png new file mode 100644 index 0000000..fd641fb Binary files /dev/null and b/UserSrc/UserHost/wwwroot/uploads/40003.png differ diff --git a/UserSrc/UserHost/wwwroot/uploads/40004.png b/UserSrc/UserHost/wwwroot/uploads/40004.png new file mode 100644 index 0000000..3c965bd Binary files /dev/null and b/UserSrc/UserHost/wwwroot/uploads/40004.png differ diff --git a/UserSrc/UserHost/wwwroot/uploads/40005.png b/UserSrc/UserHost/wwwroot/uploads/40005.png new file mode 100644 index 0000000..31530ec Binary files /dev/null and b/UserSrc/UserHost/wwwroot/uploads/40005.png differ diff --git a/UserSrc/UserHost/wwwroot/uploads/40006.png b/UserSrc/UserHost/wwwroot/uploads/40006.png new file mode 100644 index 0000000..8308b9e Binary files /dev/null and b/UserSrc/UserHost/wwwroot/uploads/40006.png differ diff --git a/UserSrc/UserHost/wwwroot/uploads/40100.png b/UserSrc/UserHost/wwwroot/uploads/40100.png new file mode 100644 index 0000000..061a4f8 Binary files /dev/null and b/UserSrc/UserHost/wwwroot/uploads/40100.png differ diff --git a/UserSrc/UserHost/wwwroot/uploads/40201.png b/UserSrc/UserHost/wwwroot/uploads/40201.png new file mode 100644 index 0000000..d9c2f37 Binary files /dev/null and b/UserSrc/UserHost/wwwroot/uploads/40201.png differ diff --git a/UserSrc/UserHost/wwwroot/uploads/40301.png b/UserSrc/UserHost/wwwroot/uploads/40301.png new file mode 100644 index 0000000..3d29bd3 Binary files /dev/null and b/UserSrc/UserHost/wwwroot/uploads/40301.png differ diff --git a/UserSrc/UserService/AutoMapperConfig.cs b/UserSrc/UserService/AutoMapperConfig.cs new file mode 100644 index 0000000..d23831e --- /dev/null +++ b/UserSrc/UserService/AutoMapperConfig.cs @@ -0,0 +1,25 @@ +using AutoMapper; +using CommonDomain.BaseModel; +using UserDomain.Entity; +using UserService.Param; +using UserService.Response; + +namespace UserService +{ + public class AutoMapperConfig : Profile + { + public AutoMapperConfig() + { + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + + CreateMap(); + + CreateMap(); + + + } + } +} diff --git a/UserSrc/UserService/BattleOrder/BattleOrderService.cs b/UserSrc/UserService/BattleOrder/BattleOrderService.cs new file mode 100644 index 0000000..d31a87f --- /dev/null +++ b/UserSrc/UserService/BattleOrder/BattleOrderService.cs @@ -0,0 +1,515 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using AutoMapper; +using Common; +using Common.Utils; +using CommonDomain; +using CommonDomain.BaseModel; +using CommonDomain.Enum; +using DotNetCore.CAP; +using MongoRepository; +using RedisService; +using UserDomain; +using UserDomain.Entity; +using UserDomain.Enum; +using UserService.Response; +using UserService.GameConfigs; +using UserService.Param; + +namespace UserService.BattleOrder +{ + public class BattleOrderService : IBattleOrderService + { + private readonly IMongoBaseRepository _userBattleOrderMongo; + private readonly IMongoBaseRepository _userEntityMongo; + private readonly IActivityConfigService _activityConfigService; + private readonly ICapPublisher _capPublisher; + private readonly IRedisService _redisService; + private readonly IMapper _mapper; + + public BattleOrderService( + IMongoBaseRepository userBattleOrderMongo, + IMongoBaseRepository userEntityMongo, + IActivityConfigService activityConfigService, + ICapPublisher capPublisher, + IRedisService redisService, + IMapper mapper) + { + _userBattleOrderMongo = userBattleOrderMongo; + _userEntityMongo = userEntityMongo; + _activityConfigService = activityConfigService; + _capPublisher = capPublisher; + _redisService = redisService; + _mapper = mapper; + } + + public async Task GetUserBattleOrderAsync(string userId) + { + var config = await _activityConfigService.Get(); + var configuredEndTime = config?.BattleOrderConfig?.EndTime ?? 0; + var userBattleOrder = await _userBattleOrderMongo.FindOneAsync(c => c.UserId == userId); + if (userBattleOrder == null) + { + userBattleOrder = await CreateOrResetBattleOrderAsync(userId); + } + else if (userBattleOrder.EndTime != configuredEndTime && + (configuredEndTime == 0 || configuredEndTime > DateTimeOffset.UtcNow.ToUnixTimeSeconds())) + { + userBattleOrder = await CreateOrResetBattleOrderAsync(userId); + } + return userBattleOrder; + } + + public async Task GetUserBattleOrderWithConfigAsync(string userId) + { + var config = await _activityConfigService.Get(); + var battleOrderConfig = config.BattleOrderConfig; + BattleOrderGiftProductHelper.Enrich(battleOrderConfig, _redisService.GetGameConfig()); + + if (!IsActivityActive(battleOrderConfig)) + { + return new BattleOrderResponse + { + IsOpen = false, + Message = "战令未开启或已结束" + }; + } + + var userBattleOrder = await GetUserBattleOrderAsync(userId); + int maxLevel = battleOrderConfig.LevelConfig?.Count ?? 0; + + var canReceiveLevels = new List(); + for (int i = 1; i <= userBattleOrder.Level && i <= maxLevel; i++) + { + bool canReceive = false; + if (!userBattleOrder.NormalReceivedLevels.Contains(i)) + canReceive = true; + if ((userBattleOrder.PurchasedAdvances.Contains(1) || userBattleOrder.PurchasedAdvances.Contains(3)) + && !userBattleOrder.LuxuryReceivedLevels.Contains(i)) + canReceive = true; + if ((userBattleOrder.PurchasedAdvances.Contains(2) || userBattleOrder.PurchasedAdvances.Contains(3)) + && !userBattleOrder.SupremeReceivedLevels.Contains(i)) + canReceive = true; + + if (canReceive) + canReceiveLevels.Add(i); + } + + var levelConfigs = battleOrderConfig.LevelConfig?.Select(l => new BattleOrderLevelInfo + { + Level = l.Level, + Exp = l.Exp, + NormalGiftList = l.NormalGiftList ?? new List(), + LuxuryGiftList = l.LuxuryGiftList ?? new List(), + SupremeGiftList = l.SupremeGiftList ?? new List() + }).ToList(); + + var advanceGifts = battleOrderConfig.AdvanceGift?.Select(a => new BattleOrderAdvanceInfo + { + Type = a.Type, + Name = a.Name, + Count = a.Count, + PayType = a.PayType, + PayCount = a.PayCount + }).ToList(); + + return new BattleOrderResponse + { + IsOpen = true, + UserBattleOrder = new UserBattleOrderInfo + { + UserId = userBattleOrder.UserId, + Level = userBattleOrder.Level, + Exp = userBattleOrder.Exp, + IsLuxury = userBattleOrder.PurchasedAdvances.Contains(1) || userBattleOrder.PurchasedAdvances.Contains(3), + IsSupreme = userBattleOrder.PurchasedAdvances.Contains(2) || userBattleOrder.PurchasedAdvances.Contains(3), + ReceivedLevels = userBattleOrder.NormalReceivedLevels, + PurchasedAdvances = userBattleOrder.PurchasedAdvances + }, + Config = new BattleOrderConfigInfo + { + EndTime = battleOrderConfig.EndTime, + RuleDesc = battleOrderConfig.RuleDesc, + BuyDesc = battleOrderConfig.BuyDesc, + AdvanceGiftDesc = battleOrderConfig.AdvanceGiftDesc, + LevelConfig = levelConfigs, + AdvanceGift = advanceGifts + } + }; + } + + public async Task<(bool success, int newLevel, long remainExp)> AddExpAsync(string userId, long exp) + { + exp = exp * 100; + if (exp <= 0) + return (false, 1, 0); + + var userBattleOrder = await GetUserBattleOrderAsync(userId); + var config = await _activityConfigService.Get(); + var battleOrderConfig = config.BattleOrderConfig; + + if (!IsActivityActive(battleOrderConfig)) + return (false, userBattleOrder.Level, userBattleOrder.Exp); + + int maxLevel = battleOrderConfig.LevelConfig?.Count ?? 1; + if (maxLevel <= 0) maxLevel = 1; + + if (userBattleOrder.Level >= maxLevel) + return (true, maxLevel, userBattleOrder.Exp); + + long totalExp = userBattleOrder.Exp + exp; + int currentLevel = userBattleOrder.Level; + + while (currentLevel < maxLevel) + { + var levelConfig = battleOrderConfig.LevelConfig?.FirstOrDefault(c => c.Level == currentLevel + 1); + if (levelConfig == null) + break; + + long nextLevelExp = levelConfig.Exp; + if (totalExp >= nextLevelExp) + { + totalExp -= nextLevelExp; + currentLevel++; + } + else + { + break; + } + } + + if (currentLevel >= maxLevel) + { + currentLevel = maxLevel; + totalExp = 0; + } + + userBattleOrder.Level = currentLevel; + userBattleOrder.Exp = totalExp; + await _userBattleOrderMongo.ReplaceOneAsync(userBattleOrder); + + return (true, currentLevel, totalExp); + } + + public async Task<(bool success, string message, List rewards)> ReceiveAllRewardsAsync(string userId) + { + var userBattleOrder = await GetUserBattleOrderAsync(userId); + var config = await _activityConfigService.Get(); + var battleOrderConfig = config.BattleOrderConfig; + + if (!IsActivityActive(battleOrderConfig)) + return (false, "战令未开启或已结束", new List()); + + List allRewards = new List(); + int maxLevel = battleOrderConfig.LevelConfig?.Count ?? 0; + + for (int level = 1; level <= userBattleOrder.Level && level <= maxLevel; level++) + { + var levelConfig = battleOrderConfig.LevelConfig?.FirstOrDefault(c => c.Level == level); + if (levelConfig == null) continue; + + if (!userBattleOrder.NormalReceivedLevels.Contains(level) && levelConfig.NormalGiftList != null && levelConfig.NormalGiftList.Count > 0) + { + userBattleOrder.NormalReceivedLevels.Add(level); + allRewards.AddRange(levelConfig.NormalGiftList); + } + + if ((userBattleOrder.PurchasedAdvances.Contains(1) || userBattleOrder.PurchasedAdvances.Contains(3)) + && !userBattleOrder.LuxuryReceivedLevels.Contains(level) + && levelConfig.LuxuryGiftList != null && levelConfig.LuxuryGiftList.Count > 0) + { + userBattleOrder.LuxuryReceivedLevels.Add(level); + allRewards.AddRange(levelConfig.LuxuryGiftList); + } + + if ((userBattleOrder.PurchasedAdvances.Contains(2) || userBattleOrder.PurchasedAdvances.Contains(3)) + && !userBattleOrder.SupremeReceivedLevels.Contains(level) + && levelConfig.SupremeGiftList != null && levelConfig.SupremeGiftList.Count > 0) + { + userBattleOrder.SupremeReceivedLevels.Add(level); + allRewards.AddRange(levelConfig.SupremeGiftList); + } + } + + await _userBattleOrderMongo.ReplaceOneAsync(userBattleOrder); + + return (true, $"领取成功,共{allRewards.Count}个奖励", allRewards); + } + + public async Task<(bool success, string message, List rewards)> ReceiveLevelRewardAsync(string userId, int level) + { + var userBattleOrder = await GetUserBattleOrderAsync(userId); + var config = await _activityConfigService.Get(); + var battleOrderConfig = config.BattleOrderConfig; + + if (!IsActivityActive(battleOrderConfig)) + return (false, "战令未开启或已结束", new List()); + + if (level <= 0 || level > userBattleOrder.Level) + return (false, "等级不满足", new List()); + + var levelConfig = battleOrderConfig.LevelConfig?.FirstOrDefault(c => c.Level == level); + if (levelConfig == null) + return (false, "等级配置不存在", new List()); + + List rewards = new List(); + + if (!userBattleOrder.NormalReceivedLevels.Contains(level) && levelConfig.NormalGiftList != null && levelConfig.NormalGiftList.Count > 0) + { + userBattleOrder.NormalReceivedLevels.Add(level); + rewards.AddRange(levelConfig.NormalGiftList); + } + + if ((userBattleOrder.PurchasedAdvances.Contains(1) || userBattleOrder.PurchasedAdvances.Contains(3)) + && !userBattleOrder.LuxuryReceivedLevels.Contains(level) + && levelConfig.LuxuryGiftList != null && levelConfig.LuxuryGiftList.Count > 0) + { + userBattleOrder.LuxuryReceivedLevels.Add(level); + rewards.AddRange(levelConfig.LuxuryGiftList); + } + + if ((userBattleOrder.PurchasedAdvances.Contains(2) || userBattleOrder.PurchasedAdvances.Contains(3)) + && !userBattleOrder.SupremeReceivedLevels.Contains(level) + && levelConfig.SupremeGiftList != null && levelConfig.SupremeGiftList.Count > 0) + { + userBattleOrder.SupremeReceivedLevels.Add(level); + rewards.AddRange(levelConfig.SupremeGiftList); + } + + if (rewards.Count == 0) + return (false, "没有可领取的奖励", new List()); + + await _userBattleOrderMongo.ReplaceOneAsync(userBattleOrder); + + return (true, "领取成功", rewards); + } + + public async Task<(bool success, string message, int newLevel, int cost)> BuyLevelsAsync(string userId, int levelCount) + { + if (levelCount <= 0) + return (false, "购买数量不正确", 0, 0); + + var userBattleOrder = await GetUserBattleOrderAsync(userId); + var config = await _activityConfigService.Get(); + var battleOrderConfig = config.BattleOrderConfig; + + if (!IsActivityActive(battleOrderConfig)) + return (false, "战令未开启或已结束", userBattleOrder.Level, 0); + + int maxLevel = battleOrderConfig.LevelConfig?.Count ?? 1; + int availableLevels = maxLevel - userBattleOrder.Level; + if (availableLevels <= 0) + return (false, "已达到最高等级", userBattleOrder.Level, 0); + + int actualBuyCount = Math.Min(levelCount, availableLevels); + + int totalCost = 0; + for (int i = 0; i < actualBuyCount; i++) + { + int targetLevel = userBattleOrder.Level + i + 1; + var levelConfig = battleOrderConfig.LevelConfig?.FirstOrDefault(c => c.Level == targetLevel); + if (levelConfig != null) + { + totalCost += levelConfig.PayCount; + } + } + + if (totalCost <= 0) + return (false, "价格计算错误", userBattleOrder.Level, 0); + + var user = await _userEntityMongo.FindByIdAsync(userId); + if (user == null) + return (false, "用户不存在", userBattleOrder.Level, 0); + + var levelConfig1 = battleOrderConfig.LevelConfig?.FirstOrDefault(c => c.Level == userBattleOrder.Level + 1); + int payType = levelConfig1?.PayType ?? 1; + + if (payType == 1 && user.Assets.Gold < totalCost) + return (false, "金币不足", userBattleOrder.Level, 0); + if (payType == 2 && user.Assets.Diamond < totalCost) + return (false, "钻石不足", userBattleOrder.Level, 0); + + var assetChangeType = payType == 1 ? UserAssetChangeTypeEnum.减少 : UserAssetChangeTypeEnum.减少; + _capPublisher.Publish(TopicKeys.用户资产变更, new UserAssetParam() + { + ChangeType = assetChangeType, + UserId = userId, + Gold = payType == 1 ? -totalCost : 0, + Diamond = payType == 2 ? -totalCost : 0, + Remark = $"购买战令等级×{actualBuyCount}", + Source = RewardSource.战令购买 + }); + + userBattleOrder.Level += actualBuyCount; + userBattleOrder.Exp = 0; + await _userBattleOrderMongo.ReplaceOneAsync(userBattleOrder); + + return (true, $"购买成功,等级提升{actualBuyCount}级", userBattleOrder.Level, totalCost); + } + + public async Task<(bool success, string message, List purchasedAdvances)> BuyAdvanceAsync(string userId, int type) + { + if (type <= 0 || type > 3) + return (false, "进阶类型不正确", new List()); + + var userBattleOrder = await GetUserBattleOrderAsync(userId); + var config = await _activityConfigService.Get(); + var battleOrderConfig = config.BattleOrderConfig; + + if (!IsActivityActive(battleOrderConfig)) + return (false, "战令未开启或已结束", userBattleOrder.PurchasedAdvances); + + if (!CanPurchaseAdvance(userBattleOrder.PurchasedAdvances, type)) + { + return (false, "该进阶已购买或无法购买", userBattleOrder.PurchasedAdvances); + } + + var advanceConfig = battleOrderConfig.AdvanceGift?.FirstOrDefault(c => c.Type == type); + if (advanceConfig == null) + return (false, "进阶配置不存在", userBattleOrder.PurchasedAdvances); + + var user = await _userEntityMongo.FindByIdAsync(userId); + if (user == null) + return (false, "用户不存在", userBattleOrder.PurchasedAdvances); + + int payType = advanceConfig.PayType; + int payCount = advanceConfig.PayCount; + + if (payType == 1 && user.Assets.Gold < payCount) + return (false, "金币不足", userBattleOrder.PurchasedAdvances); + if (payType == 2 && user.Assets.Diamond < payCount) + return (false, "钻石不足", userBattleOrder.PurchasedAdvances); + if (payType == 3) + return (false, "暂不支持现金支付", userBattleOrder.PurchasedAdvances); + + var assetChangeType = UserAssetChangeTypeEnum.减少; + _capPublisher.Publish(TopicKeys.用户资产变更, new UserAssetParam() + { + ChangeType = assetChangeType, + UserId = userId, + Gold = payType == 1 ? -payCount : 0, + Diamond = payType == 2 ? -payCount : 0, + Remark = $"购买战令进阶:{advanceConfig.Name}", + Source = RewardSource.战令购买 + }); + + userBattleOrder.PurchasedAdvances.Add(type); + await _userBattleOrderMongo.ReplaceOneAsync(userBattleOrder); + + return (true, $"购买成功", userBattleOrder.PurchasedAdvances); + } + + public async Task CreateOrResetBattleOrderAsync(string userId) + { + var config = await _activityConfigService.Get(); + var battleOrderConfig = config.BattleOrderConfig; + + var existing = await _userBattleOrderMongo.FindOneAsync(c => c.UserId == userId); + if (existing != null) + { + existing.Level = 1; + existing.Exp = 0; + existing.PurchasedAdvances = new List(); + existing.NormalReceivedLevels = new List(); + existing.LuxuryReceivedLevels = new List(); + existing.SupremeReceivedLevels = new List(); + existing.StartTime = DateTime.Now.ToTimeStamp(); + existing.EndTime = battleOrderConfig?.EndTime ?? DateTime.Now.AddDays(30).ToTimeStamp(); + await _userBattleOrderMongo.ReplaceOneAsync(existing); + return existing; + } + + var userBattleOrder = new UserBattleOrder + { + UserId = userId, + Level = 1, + Exp = 0, + PurchasedAdvances = new List(), + NormalReceivedLevels = new List(), + LuxuryReceivedLevels = new List(), + SupremeReceivedLevels = new List(), + StartTime = DateTime.Now.ToTimeStamp(), + EndTime = battleOrderConfig?.EndTime ?? DateTime.Now.AddDays(30).ToTimeStamp() + }; + + await _userBattleOrderMongo.InsertOneAsync(userBattleOrder); + return userBattleOrder; + } + + public async Task GetLevelRewardStatusAsync(string userId) + { + var config = await _activityConfigService.Get(); + var battleOrderConfig = config.BattleOrderConfig; + var userBattleOrder = await GetUserBattleOrderAsync(userId); + int maxLevel = battleOrderConfig.LevelConfig?.Count ?? 0; + bool isLuxury = userBattleOrder.PurchasedAdvances.Contains(1) || userBattleOrder.PurchasedAdvances.Contains(3); + bool isSupreme = userBattleOrder.PurchasedAdvances.Contains(2) || userBattleOrder.PurchasedAdvances.Contains(3); + + var list = new List(); + for (int i = 1; i <= maxLevel; i++) + { + var lc = battleOrderConfig.LevelConfig[i - 1]; + var status = new BattleOrderLevelStatus + { + Level = i, + Exp = lc.Exp, + NormalGiftList = lc.NormalGiftList ?? new List(), + LuxuryGiftList = isLuxury ? (lc.LuxuryGiftList ?? new List()) : new List(), + SupremeGiftList = isSupreme ? (lc.SupremeGiftList ?? new List()) : new List() + }; + + status.NormalStatus = GetSingleStatus(i, userBattleOrder.Level, userBattleOrder.NormalReceivedLevels); + status.LuxuryStatus = isLuxury + ? GetSingleStatus(i, userBattleOrder.Level, userBattleOrder.LuxuryReceivedLevels) + : 0; + status.SupremeStatus = isSupreme + ? GetSingleStatus(i, userBattleOrder.Level, userBattleOrder.SupremeReceivedLevels) + : 0; + + list.Add(status); + } + + return new BattleOrderLevelStatusResponse + { + CurrentLevel = userBattleOrder.Level, + CurrentExp = userBattleOrder.Exp, + IsLuxury = isLuxury, + IsSupreme = isSupreme, + LevelStatusList = list + }; + } + + private static int GetSingleStatus(int level, int userLevel, List receivedLevels) + { + if (receivedLevels.Contains(level)) + return 3; + if (userLevel >= level) + return 2; + return 1; + } + + private static bool IsActivityActive(BattleOrderConfig config) + { + if (!config.IsOpen) return false; + return config.EndTime <= 0 || config.EndTime > DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + } + + private bool CanPurchaseAdvance(List purchasedAdvances, int newType) + { + if (purchasedAdvances.Contains(3)) + return false; + + if (purchasedAdvances.Contains(newType)) + return false; + + if (newType == 3 && purchasedAdvances.Contains(1)) + return false; + + if (newType == 3 && purchasedAdvances.Contains(2)) + return false; + + return true; + } + } +} diff --git a/UserSrc/UserService/BattleOrder/IBattleOrderService.cs b/UserSrc/UserService/BattleOrder/IBattleOrderService.cs new file mode 100644 index 0000000..01ee7bc --- /dev/null +++ b/UserSrc/UserService/BattleOrder/IBattleOrderService.cs @@ -0,0 +1,27 @@ +using UserDomain.Entity; +using UserService.Response; +using CommonDomain.BaseModel; + +namespace UserService.BattleOrder +{ + public interface IBattleOrderService + { + Task GetUserBattleOrderAsync(string userId); + + Task GetUserBattleOrderWithConfigAsync(string userId); + + Task<(bool success, int newLevel, long remainExp)> AddExpAsync(string userId, long exp); + + Task<(bool success, string message, List rewards)> ReceiveAllRewardsAsync(string userId); + + Task<(bool success, string message, List rewards)> ReceiveLevelRewardAsync(string userId, int level); + + Task<(bool success, string message, int newLevel, int cost)> BuyLevelsAsync(string userId, int levelCount); + + Task<(bool success, string message, List purchasedAdvances)> BuyAdvanceAsync(string userId, int type); + + Task CreateOrResetBattleOrderAsync(string userId); + + Task GetLevelRewardStatusAsync(string userId); + } +} \ No newline at end of file diff --git a/UserSrc/UserService/BeautifulNumber/BeautifulNumberService.cs b/UserSrc/UserService/BeautifulNumber/BeautifulNumberService.cs new file mode 100644 index 0000000..7b13794 --- /dev/null +++ b/UserSrc/UserService/BeautifulNumber/BeautifulNumberService.cs @@ -0,0 +1,145 @@ +using System.Linq.Expressions; +using System.Text.RegularExpressions; +using AdminDomain.BeautifulNumber; +using AdminDomain.Entity; +using Common; +using Common.CommonModel; +using Common.Utils; +using CommonInfrastructure.Response; +using Microsoft.Extensions.Logging; +using MongoDB.Driver; +using MongoRepository; +using RedisService; +using UserDomain.Entity; +using UserService.BeautifulNumber; +using XAct; + +namespace UserService.BeautifulNumber +{ + public class BeautifulNumberService : IBeautifulNumberService + { + private readonly IMongoBaseRepository _beautifulNumberMongo; + private readonly IMongoBaseRepository _userMongo; + private readonly IRedisService _cache; + + public BeautifulNumberService( + IMongoBaseRepository beautifulNumberMongo, + IMongoBaseRepository userMongo, + IRedisService cache) + { + _beautifulNumberMongo = beautifulNumberMongo; + _userMongo = userMongo; + _cache = cache; + } + + public async Task> GetList(BeautifulNumberListParam param) + { + Expression> filter = c => true; + + if (!string.IsNullOrEmpty(param.level)) + { + filter = filter.And(c => c.Level == param.level); + } + + if (param.status.HasValue) + { + filter = filter.And(c => c.Status == (BeautifulNumberStatus)param.status.Value); + } + + if (!string.IsNullOrEmpty(param.numberSearch)) + { + filter = filter.And(c => c.Number.Contains(param.numberSearch)); + } + + + + var (total, list) = await _beautifulNumberMongo.QueryPageAsync(filter, c => c.CreateTime, false, param.size, param.page); + + return new PageResponse + { + Data = list, + Count = (int)total + }; + } + + public async Task> GetAvailableList(BeautifulNumberListParam param) + { + param.status = (int)BeautifulNumberStatus.Available; + return await GetList(param); + } + + public async Task<(bool isok, string msg)> Purchase(string number, LoginUser loginUser) + { + var config = await _beautifulNumberMongo.FindOneAsync(c => c.Number == number); + if (config == null) + { + return (false, "靓号不存在"); + } + + if (config.Status != BeautifulNumberStatus.Available) + { + return (false, "靓号不可购买"); + } + + var user = await _userMongo.FindByIdAsync(loginUser.UserId); + if (user == null) + { + return (false, "用户不存在"); + } + + if (user.Assets.Gold < config.Price) + { + return (false, "金币不足"); + } + + user.Assets.Gold -= config.Price; + config.Status = BeautifulNumberStatus.Sold; + config.SaleTime = DateTime.Now.ToTimeStamp(); + config.BuyerUserId = loginUser.UserId; + config.UserId = loginUser.UserId; + + await _userMongo.ReplaceOneAsync(user); + await _beautifulNumberMongo.ReplaceOneAsync(config); + + return (true, "购买成功"); + } + + public async Task CheckNumber(string number) + { + var config = await _beautifulNumberMongo.FindOneAsync(c => c.Number == number); + if (config != null) + { + return config; + } + + var isUsed = _userMongo.Count(c => c.BaseInfo.Number == number) > 0; + + + return new BeautifulNumberConfig + { + Number = number, + RuleName = config.RuleName, + Level = config.Level, + Price = config.Price, + Status = isUsed ? BeautifulNumberStatus.Sold : BeautifulNumberStatus.Normal + }; + } + + + + public async Task<(bool isok, string msg)> BindToUser(string number, string userId) + { + var config = await _beautifulNumberMongo.FindOneAsync(c => c.Number == number); + if (config == null) + { + return (false, "靓号不存在"); + } + + config.UserId = userId; + await _beautifulNumberMongo.ReplaceOneAsync(config); + return (true, "绑定成功"); + } + + + } +} diff --git a/UserSrc/UserService/BeautifulNumber/IBeautifulNumberService.cs b/UserSrc/UserService/BeautifulNumber/IBeautifulNumberService.cs new file mode 100644 index 0000000..11568a1 --- /dev/null +++ b/UserSrc/UserService/BeautifulNumber/IBeautifulNumberService.cs @@ -0,0 +1,40 @@ +using AdminDomain.Entity; +using Common; +using Common.CommonModel; +using CommonInfrastructure.Response; +using UserDomain.Entity; +using UserDomain.Enum; + +namespace UserService.BeautifulNumber +{ + public interface IBeautifulNumberService + { + + Task> GetList(BeautifulNumberListParam param); + Task> GetAvailableList(BeautifulNumberListParam param); + + Task<(bool isok, string msg)> Purchase(string number, LoginUser loginUser); + + Task CheckNumber(string number); + + + + + Task<(bool isok, string msg)> BindToUser(string number, string userId); + + } + + public class BeautifulNumberListParam + { + public int page { get; set; } = 1; + + public int size { get; set; } = 20; + + public string? level { get; set; } + + public int? status { get; set; } + + public string? numberSearch { get; set; } + + } +} diff --git a/UserSrc/UserService/GameConfigs/ActivityConfigService.cs b/UserSrc/UserService/GameConfigs/ActivityConfigService.cs new file mode 100644 index 0000000..d552167 --- /dev/null +++ b/UserSrc/UserService/GameConfigs/ActivityConfigService.cs @@ -0,0 +1,64 @@ +using CommonDomain; +using Microsoft.Extensions.Logging; +using MongoRepository; +using RedisService; + +namespace UserService.GameConfigs +{ + public class ActivityConfigService : IActivityConfigService + { + private readonly IMongoBaseRepository _mongo; + private readonly IRedisService _redis; + + public ActivityConfigService(IMongoBaseRepository mongo, IRedisService redis) + { + _mongo = mongo; + _redis = redis; + } + + public async Task Get() + { + var config = _redis.GetActivityConfig(); + if (config == null) + { + config = await _mongo.FindOneAsync(c => true); + if (config != null) + _redis.SetActivityConfig(config); + } + + if (config != null && config.AutoStopExpired(DateTimeOffset.UtcNow.ToUnixTimeSeconds())) + { + _redis.SetActivityConfig(config); + var result = await _mongo.ReplaceOneAsync(config); + } + return config; + } + + public async Task<(bool isok, string msg)> Update(ActivityConfig config) + { + var existing = await Get(); + if (existing == null) + { + config.Id = Guid.NewGuid().ToString("N"); + } + else + { + config.Id = existing.Id; + } + + _redis.SetActivityConfig(config); + + var killConfig = _redis.GetFishingKillConfig(); + if (killConfig != null) + { + killConfig.BattleOrderIsOpen = config.BattleOrderConfig?.IsOpen ?? false; + _redis.SetFishingKillConfig(killConfig); + } + + if (existing == null) + return await _mongo.InsertOneAsync(config); + else + return await _mongo.ReplaceOneAsync(config); + } + } +} diff --git a/UserSrc/UserService/GameConfigs/GameConfigService.cs b/UserSrc/UserService/GameConfigs/GameConfigService.cs new file mode 100644 index 0000000..27faa8c --- /dev/null +++ b/UserSrc/UserService/GameConfigs/GameConfigService.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AutoMapper; +using CommonDomain; +using CommonDomain.Enum; +using MongoRepository; +using RedisService; +using RedisService.Param; + +namespace UserService.GameConfigs +{ + public class GameConfigService : IGameConfigService + { + private readonly IMongoBaseRepository _mongo; + private readonly IMapper _mapper; + private IRedisService _redis; + + public GameConfigService(IMongoBaseRepository mongo, IMapper mapper, IRedisService redis) + { + _mongo = mongo; + _mapper = mapper; + _redis = redis; + } + + public async Task Get() + { + var gameConfig = _redis.GetGameConfig(); + if (gameConfig == null) + { + gameConfig = await _mongo.FindOneAsync(c => true); + if (gameConfig != null) + _redis.SetGameConfig(gameConfig); + } + return gameConfig; + } + public async Task<(bool isok, string msg)> Update(GameConfig gameConfig) + { + bool isadd = false; + var model = await Get(); + if (model == null) + { + isadd = true; + gameConfig.Id = Guid.NewGuid().ToString("N"); + + } + model = gameConfig; + + _redis.SetGameConfig(gameConfig); + + var killConfig = new FishingKillConfig + { + FishTypeConfigs = gameConfig.FishTypeConfigs?.Select(f => new FishTypeBriefConfig + { + FishNumber = f.FishNumber, + FishName = f.FishName, + FishType = f.FishType, + FishScore = f.FishScore, + KillWeight = f.KillWeight + }).ToList(), + KillConfig = gameConfig.KillConfig, + BossConfigs = gameConfig.BossConfigs, + BossDropConfig = gameConfig.BossDropConfig, + BattleOrderIsOpen = _redis.GetActivityConfig()?.BattleOrderConfig?.IsOpen ?? false + }; + _redis.SetFishingKillConfig(killConfig); + + if (isadd) + return await _mongo.InsertOneAsync(model); + else + return await _mongo.ReplaceOneAsync(model); + } + + + } +} diff --git a/UserSrc/UserService/GameConfigs/IActivityConfigService.cs b/UserSrc/UserService/GameConfigs/IActivityConfigService.cs new file mode 100644 index 0000000..c9d613b --- /dev/null +++ b/UserSrc/UserService/GameConfigs/IActivityConfigService.cs @@ -0,0 +1,11 @@ +using CommonDomain; + +namespace UserService.GameConfigs +{ + public interface IActivityConfigService + { + Task Get(); + + Task<(bool isok, string msg)> Update(ActivityConfig config); + } +} diff --git a/UserSrc/UserService/GameConfigs/IGameConfigService.cs b/UserSrc/UserService/GameConfigs/IGameConfigService.cs new file mode 100644 index 0000000..abd5d0a --- /dev/null +++ b/UserSrc/UserService/GameConfigs/IGameConfigService.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CommonDomain; +using CommonDomain.Enum; +using RedisService.Param; + +namespace UserService.GameConfigs +{ + public interface IGameConfigService + { + + Task Get(); + Task<(bool isok, string msg)> Update(GameConfig gameConfig); + } +} diff --git a/UserSrc/UserService/Hubs/AdminNotifySubscriber.cs b/UserSrc/UserService/Hubs/AdminNotifySubscriber.cs new file mode 100644 index 0000000..4b50348 --- /dev/null +++ b/UserSrc/UserService/Hubs/AdminNotifySubscriber.cs @@ -0,0 +1,78 @@ +using CommonDomain; +using DotNetCore.CAP; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.Logging; + +namespace UserService.Hubs +{ + public class AdminNotifySubscriber : ICapSubscribe + { + private readonly IHubContext _hubContext; + private readonly ILogger _logger; + + public AdminNotifySubscriber(IHubContext hubContext, ILogger logger) + { + _hubContext = hubContext; + _logger = logger; + } + + [CapSubscribe("BackgroundOperation.NotifyUser")] + public async Task HandleNotify(BackgroundOperationNotifyMessage message) + { + try + { + if (string.IsNullOrWhiteSpace(message.UserId)) + throw new InvalidOperationException("CAP消息缺少UserId"); + + + + switch (message.Action) + { + case "new_email": + await _hubContext.Clients.Group(message.UserId).SendAsync("NewEmail", new { message.Title, message.EmailId }); + return; + case "backpack_add": + case "backpack_update": + case "backpack_delete": + await _hubContext.Clients.Group(message.UserId).SendAsync("BackpackUpdated", new + { + message.Action, + message.PropNumber, + message.Count + }); + return; + case "level_change": + await _hubContext.Clients.Group(message.UserId).SendAsync("LevelChanged", new + { + NewLevel = message.NewLevel, + NewExp = message.NewExp, + NewGold = message.NewGold, + NewDiamond = message.NewDiamond, + Source = message.Source, + Remark = message.Remark + }); + return; + } + + await _hubContext.Clients.Group(message.UserId).SendAsync("AssetUpdated", new + { + message.CurrencyType, + message.ChangeType, + message.Amount, + message.NewGold, + message.NewDiamond, + message.NewLevel, + message.NewExp, + message.Source, + message.Remark + }); + + } + catch (Exception ex) + { + _logger.LogError(ex, "处理后台通知CAP消息失败 userId={UserId} action={Action}", message?.UserId, message?.Action); + throw; + } + } + } +} diff --git a/UserSrc/UserService/Hubs/AssetSyncFrontendSubscriber.cs b/UserSrc/UserService/Hubs/AssetSyncFrontendSubscriber.cs new file mode 100644 index 0000000..909c0af --- /dev/null +++ b/UserSrc/UserService/Hubs/AssetSyncFrontendSubscriber.cs @@ -0,0 +1,46 @@ +using CommonDomain; +using CommonDomain.BaseModel; +using DotNetCore.CAP; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.Logging; + +namespace UserService.Hubs +{ + public class AssetSyncFrontendSubscriber : ICapSubscribe + { + private readonly IHubContext _hubContext; + private readonly ILogger _logger; + + public AssetSyncFrontendSubscriber(IHubContext hubContext, ILogger logger) + { + _hubContext = hubContext; + _logger = logger; + } + + [CapSubscribe(TopicKeys.用户资产同步前端)] + public async Task HandleUserAssetSync(UserAssetSyncParam param) + { + if (param == null || string.IsNullOrWhiteSpace(param.UserId)) + return; + + try + { + await _hubContext.Clients.Group(param.UserId).SendAsync("AssetUpdated", new + { + param.CurrencyType, + param.ChangeType, + param.Amount, + param.NewGold, + param.NewDiamond, + param.Source, + param.Remark + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "AssetUpdated推送失败 userId={UserId} currencyType={CurrencyType}", + param.UserId, param.CurrencyType); + } + } + } +} diff --git a/UserSrc/UserService/Hubs/ConfigChangedSubscriber.cs b/UserSrc/UserService/Hubs/ConfigChangedSubscriber.cs new file mode 100644 index 0000000..c9d4e6f --- /dev/null +++ b/UserSrc/UserService/Hubs/ConfigChangedSubscriber.cs @@ -0,0 +1,63 @@ +using CommonDomain; +using DotNetCore.CAP; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.Logging; + +namespace UserService.Hubs +{ + public class ConfigChangedSubscriber : ICapSubscribe + { + private readonly IHubContext _hubContext; + private readonly ILogger _logger; + + public ConfigChangedSubscriber( + IHubContext hubContext, + ILogger logger) + { + _hubContext = hubContext; + _logger = logger; + } + + [CapSubscribe(TopicKeys.配置变更)] + public async Task HandleConfigChanged(ConfigChangedMessage message) + { + var receivedAt = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + var deliveryDelayMs = message.PublishedAtUnixMs > 0 + ? receivedAt - message.PublishedAtUnixMs + : -1; + + var changeType = message.ConfigType switch + { + "ActivityConfig" => 1, + "GameConfig" => 2, + _ => 0 + }; + + if (changeType == 0) + { + + return; + } + + + + try + { + await _hubContext.Clients.All.SendAsync("ChangeConfig", changeType); + + var effectiveAt = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + + } + catch (Exception ex) + { + _logger.LogError( + ex, + "[ChangeConfig] LoginHub全员通知失败 operationId={OperationId} ConfigType={ConfigType} changeType={ChangeType} event=ChangeConfig result=Failed", + message.OperationId, + message.ConfigType, + changeType); + throw; + } + } + } +} diff --git a/UserSrc/UserService/Hubs/KillAnnounceSubscriber.cs b/UserSrc/UserService/Hubs/KillAnnounceSubscriber.cs new file mode 100644 index 0000000..62e03fc --- /dev/null +++ b/UserSrc/UserService/Hubs/KillAnnounceSubscriber.cs @@ -0,0 +1,26 @@ +using System.Threading.Tasks; +using CommonDomain; +using DotNetCore.CAP; +using Microsoft.Extensions.Logging; +using UserService.User; + +namespace UserService.Hubs +{ + public class KillAnnounceSubscriber : ICapSubscribe + { + private readonly IUserService _userService; + + public KillAnnounceSubscriber(IUserService userService) + { + _userService = userService; + } + + [CapSubscribe(TopicKeys.全局击杀公告)] + public async Task HandleKillAnnounce(KillAnnounceParam param) + { + + await _userService.SendKillAnnouncement(param); + + } + } +} diff --git a/UserSrc/UserService/Hubs/LoginHub.cs b/UserSrc/UserService/Hubs/LoginHub.cs new file mode 100644 index 0000000..c057412 --- /dev/null +++ b/UserSrc/UserService/Hubs/LoginHub.cs @@ -0,0 +1,233 @@ +using CommonDomain; +using DotNetCore.CAP; +using Microsoft.AspNetCore.Connections.Features; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.Logging; +using RedisService; +using RedisService.Param; +using System.Collections.Concurrent; + +namespace UserService.Hubs +{ + public class LoginHub : Hub + { + private readonly IRedisService _redisService; + private readonly ILogger _logger; + private readonly ICapPublisher _capPublisher; + + private static readonly ConcurrentDictionary _connectionLifetimes = new(); + + private static readonly ConcurrentDictionary> _userGroups = new(); + + public static int GetGroupMemberCount(string userId) + { + if (string.IsNullOrWhiteSpace(userId)) + return 0; + return _userGroups.TryGetValue(userId, out var set) ? set.Count : 0; + } + + public LoginHub(IRedisService redisService, ILogger logger, ICapPublisher capPublisher) + { + _redisService = redisService; + _logger = logger; + _capPublisher = capPublisher; + } + + public override async Task OnConnectedAsync() + { + var lifetime = Context.GetHttpContext()?.Features.Get(); + if (lifetime != null) + _connectionLifetimes[Context.ConnectionId] = lifetime; + + await base.OnConnectedAsync(); + } + + public override async Task OnDisconnectedAsync(Exception? exception) + { + _connectionLifetimes.TryRemove(Context.ConnectionId, out _); + var cid = Context.ConnectionId; + var userId = _redisService.GetLoginUserId(cid); + if (!string.IsNullOrWhiteSpace(userId) && _userGroups.TryGetValue(userId, out var groupSet)) + { + groupSet.Remove(cid); + if (groupSet.Count == 0) + _userGroups.TryRemove(userId, out _); + } + _redisService.RemoveLoginUserId(cid); + + if (!string.IsNullOrWhiteSpace(userId)) + { + var currentRedis = _redisService.GetRedisUserCId(userId); + _logger.LogWarning(exception, "LoginHub连接断开 cid={Cid} userId={UserId} redisLoginCId={RedisLoginCId} redisCId={RedisCId}", + cid, userId, + currentRedis?.LoginCId ?? "(null)", + currentRedis?.CId ?? "(null)"); + } + else + { + _logger.LogWarning(exception, "LoginHub连接断开 cid={Cid} userId=unknown", cid); + } + + + await base.OnDisconnectedAsync(exception); + } + + public async Task Bind(string userId) + { + var cid = Context.ConnectionId; + try + { + if (string.IsNullOrWhiteSpace(userId)) + throw new HubException("userId不能为空"); + + var userRedis = _redisService.GetRedisUserCId(userId); + var pendingRoomId = userRedis?.RoomId ?? string.Empty; + + if (userRedis != null) + { + var oldLoginCId = userRedis.LoginCId; + var oldCId = userRedis.CId; + + + userRedis.LoginCId = cid; + _redisService.SetRedisUserCId(userRedis); + + + if (!string.IsNullOrWhiteSpace(oldLoginCId) && oldLoginCId != cid) + { + + try + { + await Clients.Client(oldLoginCId).SendAsync("AccountKicked", new { userId }); + + } + catch (Exception ex) { _logger.LogError(ex, "LoginHub踢旧连接失败 userId={UserId} oldLoginCId={OldLoginCId}", userId, oldLoginCId); } + try + { + await Clients.Client(oldLoginCId).SendAsync("KickToMainPage", new { userId }); + + } + catch (Exception ex) { _logger.LogError(ex, "LoginHub发送KickToMainPage失败 userId={UserId} oldLoginCId={OldLoginCId}", userId, oldLoginCId); } + if (_connectionLifetimes.TryRemove(oldLoginCId, out var oldLifetime)) + { + try { oldLifetime.Abort(); } catch { } + + } + } + else + { + + } + + if (!string.IsNullOrWhiteSpace(oldCId) && !string.IsNullOrWhiteSpace(userRedis.RoomId)) + { + + try + { + await Clients.Client(oldCId).SendAsync("AccountKicked", new { userId }); + + } + catch { } + var room = _redisService.GetGameRoom(userRedis.RoomId); + if (room != null) + { + var oldPlayer = room.Players.FirstOrDefault(p => p.UserId == userId && !p.IsBot); + if (oldPlayer != null) + { + oldPlayer.CId = ""; + oldPlayer.State = 1; + _redisService.SetGameRoom(room); + + } + } + userRedis.CId = ""; + _redisService.SetRedisUserCId(userRedis); + _redisService.RemoveUserId(oldCId); + } + } + else + { + userRedis = new RedisUserCid { UserId = userId, LoginCId = cid }; + _redisService.SetRedisUserCId(userRedis); + } + + _redisService.SetLoginUserId(cid, userId); + await Groups.AddToGroupAsync(cid, userId); + _userGroups.AddOrUpdate(userId, new HashSet { cid }, (k, set) => { set.Add(cid); return set; }); + + + + + if (string.IsNullOrWhiteSpace(pendingRoomId)) + { + var fishRoomId = _redisService.GetPendingFishRoomId(userId); + if (!string.IsNullOrWhiteSpace(fishRoomId)) + { + pendingRoomId = fishRoomId; + + } + } + + if (string.IsNullOrWhiteSpace(pendingRoomId)) + { + var chessRoomId = _redisService.GetPendingChessRoomId(userId); + if (!string.IsNullOrWhiteSpace(chessRoomId)) + { + pendingRoomId = chessRoomId; + + } + } + + if (!string.IsNullOrWhiteSpace(pendingRoomId)) + { + var operationId = Guid.NewGuid().ToString("N"); + var settlementTask = LoginSettlementWaiter.Register(operationId); + try + { + await _capPublisher.PublishAsync(TopicKeys.登录绑定, new LoginBindMessage + { + UserId = userId, + OperationId = operationId + }); + + var result = await settlementTask.WaitAsync(TimeSpan.FromSeconds(15)); + if (!result.Success) + throw new HubException($"旧房间结算失败: {result.Error}"); + + var settledRedis = _redisService.GetRedisUserCId(userId) ?? new RedisUserCid { UserId = userId }; + settledRedis.LoginCId = cid; + _redisService.SetRedisUserCId(settledRedis); + + } + catch (TimeoutException) + { + throw new HubException("旧房间结算超时,请重新登录"); + } + finally + { + LoginSettlementWaiter.Remove(operationId); + } + } + } + catch (Exception ex) + { + _logger.LogError(ex, "LoginHub用户绑定失败 cid={Cid} userId={UserId}", cid, userId); + throw; + } + } + + public async Task DismissPendingRoom(string userId) + { + try + { + + await _capPublisher.PublishAsync(TopicKeys.拒绝回房, new LoginBindMessage { UserId = userId }); + } + catch (Exception ex) + { + _logger.LogError(ex, "DismissPendingRoom失败 userId={UserId}", userId); + throw; + } + } + } +} diff --git a/UserSrc/UserService/Hubs/LoginResultSubscriber.cs b/UserSrc/UserService/Hubs/LoginResultSubscriber.cs new file mode 100644 index 0000000..3baa873 --- /dev/null +++ b/UserSrc/UserService/Hubs/LoginResultSubscriber.cs @@ -0,0 +1,45 @@ +using CommonDomain; +using DotNetCore.CAP; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.Logging; +using RedisService; + +namespace UserService.Hubs +{ + public class LoginResultSubscriber + { + private readonly IHubContext _hubContext; + private readonly IRedisService _redisService; + private readonly ILogger _logger; + + public LoginResultSubscriber( + IHubContext hubContext, + IRedisService redisService, + ILogger logger) + { + _hubContext = hubContext; + _redisService = redisService; + _logger = logger; + } + + [CapSubscribe(TopicKeys.登录结果通知)] + public async Task HandleLoginBindResult(LoginBindResultMessage msg) + { + try + { + var completed = LoginSettlementWaiter.Complete(msg); + + + await _hubContext.Clients.Group(msg.UserId).SendAsync("LoginSettlementCompleted", new + { + roomId = msg.RoomId, + success = msg.Success + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "登录结果通知处理失败 userId={UserId} roomId={RoomId}", msg.UserId, msg.RoomId); + } + } + } +} diff --git a/UserSrc/UserService/Hubs/LoginSettlementWaiter.cs b/UserSrc/UserService/Hubs/LoginSettlementWaiter.cs new file mode 100644 index 0000000..491911a --- /dev/null +++ b/UserSrc/UserService/Hubs/LoginSettlementWaiter.cs @@ -0,0 +1,30 @@ +using System.Collections.Concurrent; +using CommonDomain; + +namespace UserService.Hubs +{ + internal static class LoginSettlementWaiter + { + private static readonly ConcurrentDictionary> Waiters = new(); + + public static Task Register(string operationId) + { + var source = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + if (!Waiters.TryAdd(operationId, source)) + throw new InvalidOperationException($"重复的登录结算操作号: {operationId}"); + return source.Task; + } + + public static bool Complete(LoginBindResultMessage message) + { + return !string.IsNullOrWhiteSpace(message.OperationId) + && Waiters.TryRemove(message.OperationId, out var source) + && source.TrySetResult(message); + } + + public static void Remove(string operationId) + { + Waiters.TryRemove(operationId, out _); + } + } +} diff --git a/UserSrc/UserService/ImageUpload/IImageUploadService.cs b/UserSrc/UserService/ImageUpload/IImageUploadService.cs new file mode 100644 index 0000000..0b7615d --- /dev/null +++ b/UserSrc/UserService/ImageUpload/IImageUploadService.cs @@ -0,0 +1,11 @@ +using Microsoft.AspNetCore.Http; + +namespace UserService.ImageUpload +{ + public interface IImageUploadService + { + bool ValidateImage(IFormFile file, out string errorMessage); + + Task<(bool isOk, string path, string fileName, string errorMessage)> UploadImageAsync(IFormFile file); + } +} diff --git a/UserSrc/UserService/ImageUpload/ImageUploadService.cs b/UserSrc/UserService/ImageUpload/ImageUploadService.cs new file mode 100644 index 0000000..ee5b052 --- /dev/null +++ b/UserSrc/UserService/ImageUpload/ImageUploadService.cs @@ -0,0 +1,78 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Logging; + +namespace UserService.ImageUpload +{ + public class ImageUploadService : IImageUploadService + { + private readonly ILogger _logger; + private static readonly string[] AllowedExtensions = { ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp" }; + private const long MaxFileSize = 5 * 1024 * 1024; // 5MB + private const string UploadFolder = "wwwroot/uploads"; + + public ImageUploadService(ILogger logger) + { + _logger = logger; + } + + public bool ValidateImage(IFormFile file, out string errorMessage) + { + errorMessage = string.Empty; + + if (file == null || file.Length == 0) + { + errorMessage = "请选择要上传的文件"; + return false; + } + + var ext = Path.GetExtension(file.FileName).ToLowerInvariant(); + if (!AllowedExtensions.Contains(ext)) + { + errorMessage = "只支持上传图片格式:jpg、jpeg、png、gif、bmp、webp"; + return false; + } + + if (file.Length > MaxFileSize) + { + errorMessage = "文件大小不能超过5MB"; + return false; + } + + return true; + } + + public async Task<(bool isOk, string path, string fileName, string errorMessage)> UploadImageAsync(IFormFile file) + { + if (!ValidateImage(file, out var errorMessage)) + { + return (false, string.Empty, string.Empty, errorMessage); + } + + try + { + var ext = Path.GetExtension(file.FileName).ToLowerInvariant(); + var fileName = Guid.NewGuid().ToString("N") + ext; + + var uploadPath = Path.Combine(Directory.GetCurrentDirectory(), UploadFolder); + if (!Directory.Exists(uploadPath)) + { + Directory.CreateDirectory(uploadPath); + } + + var filePath = Path.Combine(uploadPath, fileName); + using (var stream = new FileStream(filePath, FileMode.Create)) + { + await file.CopyToAsync(stream); + } + + var relativePath = $"/uploads/{fileName}"; +return (true, relativePath, fileName, string.Empty); + } + catch (Exception ex) + { + _logger.LogError(ex, "图片上传失败: {Message}", ex.Message); + return (false, string.Empty, string.Empty, $"上传失败:{ex.Message}"); + } + } + } +} diff --git a/UserSrc/UserService/Jobs/EveryDayTask.cs b/UserSrc/UserService/Jobs/EveryDayTask.cs new file mode 100644 index 0000000..2c3a1db --- /dev/null +++ b/UserSrc/UserService/Jobs/EveryDayTask.cs @@ -0,0 +1,42 @@ +using Microsoft.Extensions.Logging; +using RedisHelper; +using ScheduledService; +using UserService.User; + +namespace UserService.Jobs; + +public class EveryDayTask : CronJobService +{ + private readonly IUserService _userService; + private readonly IDistributedLock _distributedLock; + private const string LockKey = "lock:everyday"; + + public EveryDayTask(IScheduleConfig config, IUserService userService, IDistributedLock distributedLock) + : base(config.CronExpression, config.TimeZoneInfo) + { + _userService = userService; + _distributedLock = distributedLock; + } + + public override Task StartAsync(CancellationToken cancellationToken) + { + + return base.StartAsync(cancellationToken); + } + + public override async Task DoWork(CancellationToken cancellationToken) + { + await _distributedLock.TryExecuteAsync(LockKey, async () => + { + + await _userService.EveryDayTask(); + + }, expiry: 600); + } + + public override Task StopAsync(CancellationToken cancellationToken) + { + + return base.StopAsync(cancellationToken); + } +} diff --git a/UserSrc/UserService/Jobs/EveryHourTask.cs b/UserSrc/UserService/Jobs/EveryHourTask.cs new file mode 100644 index 0000000..d2c91e1 --- /dev/null +++ b/UserSrc/UserService/Jobs/EveryHourTask.cs @@ -0,0 +1,33 @@ +using Microsoft.Extensions.Logging; +using RedisHelper; +using ScheduledService; +using UserService.User; + +namespace UserService.Jobs; + +public class EveryHourTask : CronJobService +{ + private readonly IUserService _userService; + private readonly IDistributedLock _distributedLock; + private const string LockKey = "lock:everyhour"; + + public EveryHourTask( + IScheduleConfig config, + IUserService userService, + IDistributedLock distributedLock) + : base(config.CronExpression, config.TimeZoneInfo) + { + _userService = userService; + _distributedLock = distributedLock; + } + + public override async Task DoWork(CancellationToken cancellationToken) + { + await _distributedLock.TryExecuteAsync(LockKey, async () => + { + + await _userService.EveryHourTask(); + + }, expiry: 300); + } +} diff --git a/UserSrc/UserService/Jobs/RankingRewardJob.cs b/UserSrc/UserService/Jobs/RankingRewardJob.cs new file mode 100644 index 0000000..3341a19 --- /dev/null +++ b/UserSrc/UserService/Jobs/RankingRewardJob.cs @@ -0,0 +1,33 @@ +using Microsoft.Extensions.Logging; +using RedisHelper; +using ScheduledService; +using UserService.User; + +namespace UserService.Jobs; + +public class RankingRewardJob : CronJobService +{ + private readonly IUserService _userService; + private readonly IDistributedLock _distributedLock; + private const string LockKey = "lock:rankingreward"; + + public RankingRewardJob( + IScheduleConfig config, + IUserService userService, + IDistributedLock distributedLock) + : base(config.CronExpression, config.TimeZoneInfo) + { + _userService = userService; + _distributedLock = distributedLock; + } + + public override async Task DoWork(CancellationToken cancellationToken) + { + await _distributedLock.TryExecuteAsync(LockKey, async () => + { + + await _userService.DailyRankingReward(); + + }, expiry: 600); + } +} diff --git a/UserSrc/UserService/Notices/FaqService.cs b/UserSrc/UserService/Notices/FaqService.cs new file mode 100644 index 0000000..1139cbe --- /dev/null +++ b/UserSrc/UserService/Notices/FaqService.cs @@ -0,0 +1,101 @@ +using CommonDomain; +using MongoRepository; + +namespace UserService.Notices +{ + public class FaqService : IFaqService + { + private readonly IMongoBaseRepository _categoryRepo; + private readonly IMongoBaseRepository _questionRepo; + + public FaqService( + IMongoBaseRepository categoryRepo, + IMongoBaseRepository questionRepo) + { + _categoryRepo = categoryRepo; + _questionRepo = questionRepo; + } + + + public async Task> GetAllCategories() + { + var list = await _categoryRepo.FilterByAsync(x => x.IsEnable); + return list.OrderBy(x => x.Sort).ToList(); + } + + public async Task> GetCategoryTree() + { + var allCategories = await _categoryRepo.FilterByAsync(x => true); + var sortedList = allCategories.OrderBy(x => x.Sort).ToList(); + + var nodeDict = sortedList.ToDictionary( + x => x.Id, + x => new FaqCategoryTreeNode + { + Id = x.Id, + Name = x.Name, + Icon = x.Icon, + Sort = x.Sort, + IsEnable = x.IsEnable, + Children = new List() + } + ); + + var rootNodes = new List(); + + foreach (var category in sortedList) + { + var node = nodeDict[category.Id!]; + + if (string.IsNullOrEmpty(category.ParentId)) + { + rootNodes.Add(node); + } + else if (nodeDict.ContainsKey(category.ParentId)) + { + nodeDict[category.ParentId!].Children.Add(node); + } + else + { + rootNodes.Add(node); + } + } + + return rootNodes; + } + + public async Task GetCategoryById(string id) + { + return await _categoryRepo.FindOneAsync(x => x.Id == id); + } + + + + + public async Task> GetQuestionsByCategory(string categoryId) + { + var list = await _questionRepo.FilterByAsync(x => x.CategoryId == categoryId && x.IsEnable); + return list.OrderBy(x => x.Sort).ToList(); + } + + public async Task<(List list, long count)> QueryQuestions(string? categoryId, int pageIndex, int pageSize) + { + var result = await _questionRepo.QueryPageAsync( + filterExpression: x => + (string.IsNullOrEmpty(categoryId) || x.CategoryId == categoryId), + orderExpression: x => x.Sort, + desc: false, + pageSize: pageSize, + pageIndex: pageIndex + ); + return (result.list?.OrderBy(x => x.Sort).ToList() ?? new List(), result.count); + } + + public async Task GetQuestionById(string id) + { + return await _questionRepo.FindOneAsync(x => x.Id == id); + } + + + } +} diff --git a/UserSrc/UserService/Notices/IFaqService.cs b/UserSrc/UserService/Notices/IFaqService.cs new file mode 100644 index 0000000..9beb89d --- /dev/null +++ b/UserSrc/UserService/Notices/IFaqService.cs @@ -0,0 +1,18 @@ +using CommonDomain; +using MongoRepository; + +namespace UserService.Notices +{ + public interface IFaqService + { + Task> GetAllCategories(); + Task> GetCategoryTree(); + Task GetCategoryById(string id); + + + Task> GetQuestionsByCategory(string categoryId); + Task<(List list, long count)> QueryQuestions(string? categoryId, int pageIndex, int pageSize); + Task GetQuestionById(string id); + + } +} diff --git a/UserSrc/UserService/Notices/INoticeService.cs b/UserSrc/UserService/Notices/INoticeService.cs new file mode 100644 index 0000000..6f21464 --- /dev/null +++ b/UserSrc/UserService/Notices/INoticeService.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UserDomain.Entity; +using UserService.Notices.Param; + +namespace UserService.Notices +{ + public interface INoticeService + { + + + + Task Get(string id); + + + Task<(List list, long count)> GetList(GetNoticeListParam param); + Task GetNewOne(); + } +} diff --git a/UserSrc/UserService/Notices/NoticeService.cs b/UserSrc/UserService/Notices/NoticeService.cs new file mode 100644 index 0000000..38aae87 --- /dev/null +++ b/UserSrc/UserService/Notices/NoticeService.cs @@ -0,0 +1,58 @@ +using AutoMapper; +using Common; +using Common.Utils; +using Microsoft.Extensions.Logging; +using MongoDB.Bson; +using MongoRepository; +using UserDomain.Entity; +using UserService.Notices.Param; + +namespace UserService.Notices +{ + public class NoticeService : INoticeService + { + private readonly IMongoBaseRepository _noticeMongo; + private readonly IMapper _mapper; + + + public NoticeService(IMongoBaseRepository noticeMongo, IMapper mapper) + { + _noticeMongo = noticeMongo; + _mapper = mapper; + } + + + public async Task Get(string id) + { + var model = await _noticeMongo.FindByIdAsync(id); + if (model == null) + return null; + if (model.IsDelete) + return null; + return model; + + } + + + public async Task<(List list, long count)> GetList(GetNoticeListParam param) + { + var where = LinqExtensions.True().And(e => e.IsDelete == false); + if (!string.IsNullOrWhiteSpace(param.KeyWord)) + where = where.And(e => e.Title.Contains(param.KeyWord)); + + + var result = await _noticeMongo.QueryPageAsync(where, c => c.CreateTime, true, param.PageSize ?? 0, param.PageIndex ?? 0); + + return (result.list, result.count); + } + public async Task GetNewOne() + { + var model = await _noticeMongo.FindOneAsync(e => e.IsDelete == false, c => c.CreateTime); + + return model; + + + } + + } +} diff --git a/UserSrc/UserService/Notices/Param/AddNoticeParam.cs b/UserSrc/UserService/Notices/Param/AddNoticeParam.cs new file mode 100644 index 0000000..d3f1e45 --- /dev/null +++ b/UserSrc/UserService/Notices/Param/AddNoticeParam.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UserService.Notices.Param +{ + public class AddNoticeParam + { + public string Title { get; set; } + public string Content { get; set; } + + public string Recommend { get; set; } + } +} diff --git a/UserSrc/UserService/Notices/Param/GetNoticeListParam.cs b/UserSrc/UserService/Notices/Param/GetNoticeListParam.cs new file mode 100644 index 0000000..7f4eac5 --- /dev/null +++ b/UserSrc/UserService/Notices/Param/GetNoticeListParam.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Common.CommonModel; + +namespace UserService.Notices.Param +{ + public class GetNoticeListParam : BaseListPageParam + { + + } +} diff --git a/UserSrc/UserService/Notices/Param/UpdateNoticeParam.cs b/UserSrc/UserService/Notices/Param/UpdateNoticeParam.cs new file mode 100644 index 0000000..aa9b58c --- /dev/null +++ b/UserSrc/UserService/Notices/Param/UpdateNoticeParam.cs @@ -0,0 +1,7 @@ +namespace UserService.Notices.Param +{ + public class UpdateNoticeParam : AddNoticeParam + { + public string Id { get; set; } + } +} diff --git a/UserSrc/UserService/Response/BattleOrderResponse.cs b/UserSrc/UserService/Response/BattleOrderResponse.cs new file mode 100644 index 0000000..d25dfc5 --- /dev/null +++ b/UserSrc/UserService/Response/BattleOrderResponse.cs @@ -0,0 +1,135 @@ +using CommonDomain.BaseModel; +using System.Collections.Generic; + +namespace UserService.Response +{ + public class BattleOrderResponse + { + public bool IsOpen { get; set; } + + public string Message { get; set; } + + public UserBattleOrderInfo UserBattleOrder { get; set; } + + public BattleOrderConfigInfo Config { get; set; } + } + + public class UserBattleOrderInfo + { + public string UserId { get; set; } + + public int Level { get; set; } + + public long Exp { get; set; } + + public bool IsLuxury { get; set; } + + public bool IsSupreme { get; set; } + + public List ReceivedLevels { get; set; } = new List(); + + public List PurchasedAdvances { get; set; } = new List(); + } + + public class BattleOrderConfigInfo + { + public long EndTime { get; set; } + + public string RuleDesc { get; set; } + + public string BuyDesc { get; set; } + + public string AdvanceGiftDesc { get; set; } + + public List LevelConfig { get; set; } + + public List AdvanceGift { get; set; } + } + + public class BattleOrderLevelInfo + { + public int Level { get; set; } + + public long Exp { get; set; } + + public List NormalGiftList { get; set; } = new(); + + public List LuxuryGiftList { get; set; } = new(); + + public List SupremeGiftList { get; set; } = new(); + } + + public class BattleOrderAdvanceInfo + { + public int Type { get; set; } + + public string Name { get; set; } + + public int Count { get; set; } + + public int PayType { get; set; } + + public int PayCount { get; set; } + } + + public class ReceiveBattleOrderRewardResponse + { + public int Type { get; set; } + + public string RewardId { get; set; } + + public int Count { get; set; } + } + + + + public class BuyBattleOrderLevelResponse + { + + + public int NewLevel { get; set; } + + public int Cost { get; set; } + } + + public class BuyBattleOrderAdvanceResponse + { + public bool Success { get; set; } + + public string Message { get; set; } + + public List PurchasedAdvances { get; set; } + } + + public class BattleOrderLevelStatus + { + public int Level { get; set; } + + public long Exp { get; set; } + + public int NormalStatus { get; set; } + + public List NormalGiftList { get; set; } = new(); + + public int LuxuryStatus { get; set; } + + public List LuxuryGiftList { get; set; } = new(); + + public int SupremeStatus { get; set; } + + public List SupremeGiftList { get; set; } = new(); + } + + public class BattleOrderLevelStatusResponse + { + public int CurrentLevel { get; set; } + + public long CurrentExp { get; set; } + + public bool IsLuxury { get; set; } + + public bool IsSupreme { get; set; } + + public List LevelStatusList { get; set; } = new(); + } +} \ No newline at end of file diff --git a/UserSrc/UserService/ScratchCard/IScratchCardService.cs b/UserSrc/UserService/ScratchCard/IScratchCardService.cs new file mode 100644 index 0000000..b3601f9 --- /dev/null +++ b/UserSrc/UserService/ScratchCard/IScratchCardService.cs @@ -0,0 +1,21 @@ +using System.Threading.Tasks; +using CommonDomain.BaseModel; + +namespace UserService.ScratchCard +{ + public class ScratchCardResult + { + public int PrizeType { get; set; } + + public string PrizeName { get; set; } = string.Empty; + + public int Count { get; set; } + + public BaseProduct? BaseProduct { get; set; } + } + + public interface IScratchCardService + { + Task<(bool success, string message, ScratchCardResult? result)> Draw(string userId); + } +} diff --git a/UserSrc/UserService/ScratchCard/ScratchCardService.cs b/UserSrc/UserService/ScratchCard/ScratchCardService.cs new file mode 100644 index 0000000..d06c83f --- /dev/null +++ b/UserSrc/UserService/ScratchCard/ScratchCardService.cs @@ -0,0 +1,164 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using CommonDomain; +using CommonDomain.BaseModel; +using Microsoft.Extensions.Logging; +using MongoRepository; +using UserDomain.Entity; +using UserDomain.Enum; +using UserService.GameConfigs; +using UserService.Param; +using UserService.User; + +namespace UserService.ScratchCard +{ + public class ScratchCardService : IScratchCardService + { + private const string ScratchCardNumber = "40005"; + + private readonly IGameConfigService _gameConfig; + private readonly IUserService _userService; + private readonly IMongoBaseRepository _recordRepo; + private readonly ILogger _logger; + + public ScratchCardService( + IGameConfigService gameConfig, + IUserService userService, + IMongoBaseRepository recordRepo, + ILogger logger) + { + _gameConfig = gameConfig; + _userService = userService; + _recordRepo = recordRepo; + _logger = logger; + } + + public async Task<(bool success, string message, ScratchCardResult? result)> Draw(string userId) + { + var gameConfig = await _gameConfig.Get(); + if (gameConfig == null) + return (false, "游戏配置不存在", null); + + var configs = gameConfig.ScratchCardConfig; + if (configs == null || configs.Count == 0) + return (false, "刮刮卡活动暂未开放", null); + + var user = await _userService.GetUser(userId); + if (user == null) + return (false, "用户不存在", null); + + var prop = user.Props.FirstOrDefault(p => p.Number == ScratchCardNumber); + if (prop == null || prop.Count <= 0) + return (false, "刮刮卡数量不足", null); + + var deductResult = await _userService.UpdateAssets(new UserAssetParam + { + UserId = userId, + ChangeType = UserAssetChangeTypeEnum.减少, + RewardItems = new List + { + new BaseProductCount { Number = ScratchCardNumber, Count = 1 } + }, + Source = RewardSource.刮刮卡, + Remark = "使用刮刮卡", + IsAddRecord = false + }); + + if (!deductResult.isok) + return (false, deductResult.msg, null); + + var prize = DrawPrize(configs); + if (prize == null) + return (false, "奖项配置异常", null); + + var rewardItems = new List(); + if (prize.Type == 3 && prize.BaseProduct != null) + { + rewardItems.Add(new BaseProductCount + { + Number = prize.BaseProduct.Number, + Name = prize.BaseProduct.Name, + Type = prize.BaseProduct.Type, + Count = prize.Count + }); + } + + (bool isok, string msg) awardResult; + try + { + awardResult = await _userService.UpdateAssets(new UserAssetParam + { + UserId = userId, + ChangeType = UserAssetChangeTypeEnum.增加, + Gold = prize.Type == 1 ? prize.Count : 0, + Diamond = prize.Type == 2 ? prize.Count : 0, + RewardItems = rewardItems, + Source = RewardSource.刮刮卡, + Remark = "刮刮卡奖励" + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "刮刮卡发奖失败 userId={UserId} prizeType={PrizeType} count={Count}", + userId, prize.Type, prize.Count); + return (false, "刮奖失败,请稍后重试", null); + } + + if (!awardResult.isok) + return (false, awardResult.msg, null); + + var record = new ScratchCardRecord + { + UserId = userId, + PrizeType = prize.Type, + PrizeName = prize.Type == 1 ? $"{prize.Count}金币" : + prize.Type == 2 ? $"{prize.Count}钻石" : + prize.BaseProduct?.Name ?? "", + Count = prize.Count, + BaseProduct = prize.BaseProduct + }; + try + { + await _recordRepo.InsertOneAsync(record); + } + catch (Exception ex) + { + _logger.LogError(ex, "刮刮卡中奖记录写入失败 userId={UserId} prizeType={PrizeType} count={Count}", + userId, prize.Type, prize.Count); + } + + var result = new ScratchCardResult + { + PrizeType = prize.Type, + PrizeName = prize.Type == 1 ? $"{prize.Count}金币" : + prize.Type == 2 ? $"{prize.Count}钻石" : + prize.BaseProduct?.Name ?? "", + Count = prize.Count, + BaseProduct = prize.BaseProduct + }; + + return (true, "恭喜获得奖励!", result); + } + + private static ScratchCardConfig? DrawPrize(List configs) + { + var totalWeight = configs.Sum(c => (long)c.Weight); + if (totalWeight <= 0) return null; + + var random = new Random(); + var randomValue = random.NextInt64(0, totalWeight); + long currentSum = 0; + + foreach (var config in configs) + { + currentSum += config.Weight; + if (randomValue < currentSum) + return config; + } + + return configs.LastOrDefault(); + } + } +} diff --git a/UserSrc/UserService/SummonCard/ISummonCardService.cs b/UserSrc/UserService/SummonCard/ISummonCardService.cs new file mode 100644 index 0000000..d3a4d2a --- /dev/null +++ b/UserSrc/UserService/SummonCard/ISummonCardService.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace UserService.SummonCard +{ + public interface ISummonCardService + { + Task<(bool success, string message)> Use(string userId); + } +} diff --git a/UserSrc/UserService/SummonCard/SummonCardService.cs b/UserSrc/UserService/SummonCard/SummonCardService.cs new file mode 100644 index 0000000..6b4997b --- /dev/null +++ b/UserSrc/UserService/SummonCard/SummonCardService.cs @@ -0,0 +1,116 @@ +using System.Threading.Tasks; +using System.Text.Json; +using CommonDomain; +using CommonDomain.BaseModel; +using CommonDomain.Enum; +using DotNetCore.CAP; +using Microsoft.Extensions.Logging; +using RedisService; +using UserDomain.Enum; +using UserService.Param; +using UserService.User; + +namespace UserService.SummonCard +{ + public class SummonCardService : ISummonCardService + { + private const string SummonCardNumber = "40006"; + + private readonly IUserService _userService; + private readonly IRedisService _redisService; + private readonly ICapPublisher _capPublisher; + + public SummonCardService(IUserService userService, IRedisService redisService, ICapPublisher capPublisher) + { + _userService = userService; + _redisService = redisService; + _capPublisher = capPublisher; + } + + public async Task<(bool success, string message)> Use(string userId) + { + + var user = await _userService.GetUser(userId); + if (user == null) + { + + return (false, "用户不存在"); + } + + var prop = user.Props.FirstOrDefault(p => p.Number == SummonCardNumber); + if (prop == null || prop.Count <= 0) + { + + return (false, "召唤卡数量不足"); + } + + var session = _redisService.GetRedisUserCId(userId); + if (string.IsNullOrWhiteSpace(session?.RoomId)) + { + + return (false, "请进入捕鱼房间后使用召唤卡"); + } + + var room = _redisService.GetGameRoom(session.RoomId); + if (room == null || room.GameType == GameTypeEnum.中国象棋 || + !room.Players.Any(p => !p.IsBot && p.UserId == userId && p.State == 0)) + { + + return (false, "当前不在有效的捕鱼房间中"); + } + + var targetFishType = room.GameType == GameTypeEnum.星际迷航 + ? FishTypeEnum.Boss鱼 + : FishTypeEnum.黄金鱼; + + + var spawnConfigJson = _redisService.GetFishSpawnConfig(); + var spawnConfig = string.IsNullOrWhiteSpace(spawnConfigJson) + ? null + : JsonSerializer.Deserialize(spawnConfigJson, + new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); + var levelKey = $"{(int)room.GameType}:{room.RoomLevel}"; + if (spawnConfig?.Levels == null || + !spawnConfig.Levels.TryGetValue(levelKey, out var levelConfig) || + levelConfig?.Fishes == null || + !levelConfig.Fishes.Any(f => f.FishType == (int)targetFishType && f.FishWeight > 0)) + { + + return (false, $"当前场次未配置可召唤的{(targetFishType == FishTypeEnum.Boss鱼 ? "Boss" : "黄金鱼")}"); + } + + var deductResult = await _userService.UpdateAssets(new UserAssetParam + { + UserId = userId, + ChangeType = UserAssetChangeTypeEnum.减少, + RewardItems = new System.Collections.Generic.List + { + new CommonDomain.BaseModel.BaseProductCount { Number = SummonCardNumber, Count = 1 } + }, + Source = RewardSource.召唤卡, + Remark = "使用召唤卡", + IsAddRecord = false + }); + + if (!deductResult.isok) + { + + return (false, deductResult.msg); + } + + var operationId = Guid.NewGuid().ToString("N"); + var publishedAt = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + await _capPublisher.PublishAsync(TopicKeys.召唤卡出鱼, new SummonCardFishMessage + { + UserId = userId, + RoomId = room.RoomId, + FishType = (int)targetFishType, + OperationId = operationId, + PublishedAtUnixMs = publishedAt + }); + + + return (true, "使用成功"); + } + } +} diff --git a/UserSrc/UserService/Tasks/ITaskService.cs b/UserSrc/UserService/Tasks/ITaskService.cs new file mode 100644 index 0000000..511d736 --- /dev/null +++ b/UserSrc/UserService/Tasks/ITaskService.cs @@ -0,0 +1,23 @@ +using UserDomain.Entity; +using UserService.Tasks.Param; + +namespace UserService.Tasks +{ + public interface ITaskService + { + + Task DayTaskReward(); + + Task HourTaskReward(); + + + + Task RegisterTaskReward(string userId); + + Task> GetUserTaskList(GetUserTaskListParam param, string userId); + void CompletedTask(CompletedTaskParam param); + Task<(bool isok, string msg)> DistributeRewards(string id, string userId); + + Task<(bool success, string message, long totalExp)> ReceiveAllTaskRewardsAsync(string userId); + } +} diff --git a/UserSrc/UserService/Tasks/Param/CompletedTaskParam.cs b/UserSrc/UserService/Tasks/Param/CompletedTaskParam.cs new file mode 100644 index 0000000..e52d51d --- /dev/null +++ b/UserSrc/UserService/Tasks/Param/CompletedTaskParam.cs @@ -0,0 +1,17 @@ +using CommonDomain.Enum; +using UserDomain.Enum; + +namespace UserService.Tasks.Param +{ + public class CompletedTaskParam + { + + public TaskEvent taskEvent { get; set; } + public string userId { get; set; }=string.Empty; + + + public double count { get; set; } = 1; + + public string otherId { get; set; } = ""; + } +} diff --git a/UserSrc/UserService/Tasks/Param/GetTaskListParam.cs b/UserSrc/UserService/Tasks/Param/GetTaskListParam.cs new file mode 100644 index 0000000..8fa1f3b --- /dev/null +++ b/UserSrc/UserService/Tasks/Param/GetTaskListParam.cs @@ -0,0 +1,11 @@ +using Common.CommonModel; + +namespace UserService.Tasks.Param +{ + public class GetTaskListParam:BaseListPageParam + { + public int State { get; set; } = -1; + public int TaskType { get; set; } = -1; + public int TaskEvent { get; set; } = -1; + } +} diff --git a/UserSrc/UserService/Tasks/Param/GetUserTaskListParam.cs b/UserSrc/UserService/Tasks/Param/GetUserTaskListParam.cs new file mode 100644 index 0000000..52fd4e8 --- /dev/null +++ b/UserSrc/UserService/Tasks/Param/GetUserTaskListParam.cs @@ -0,0 +1,7 @@ +namespace UserService.Tasks.Param +{ + public class GetUserTaskListParam + { + public int TaskType { get; set; } = -1; + } +} diff --git a/UserSrc/UserService/Tasks/Param/GiftResponse.cs b/UserSrc/UserService/Tasks/Param/GiftResponse.cs new file mode 100644 index 0000000..a570324 --- /dev/null +++ b/UserSrc/UserService/Tasks/Param/GiftResponse.cs @@ -0,0 +1,12 @@ +using CommonDomain.BaseModel; + +namespace UserService.Tasks.Param +{ + public class GiftResponse + { + public long Gold { get; set; } = 0; + public int Diamond { get; set; } + public long Exp { get; set; } = 0; + public List Product { get; set; } = new List(); + } +} diff --git a/UserSrc/UserService/Tasks/TaskService.cs b/UserSrc/UserService/Tasks/TaskService.cs new file mode 100644 index 0000000..045ec27 --- /dev/null +++ b/UserSrc/UserService/Tasks/TaskService.cs @@ -0,0 +1,247 @@ +using AutoMapper; +using Common; +using Common.Utils; +using CommonDomain; +using CommonDomain.BaseModel; +using CommonDomain.Enum; +using DotNetCore.CAP; +using MongoRepository; +using RedisService; +using UserDomain; +using UserDomain.Entity; +using UserDomain.Enum; +using UserService.BattleOrder; +using UserService.Param; +using UserService.Tasks.Param; + +namespace UserService.Tasks +{ + public class TaskService : ITaskService + { + + private readonly IMongoBaseRepository _gameTaskMongo; + private readonly IMongoBaseRepository _userTaskMongo; + private readonly IMongoBaseRepository _userEntityMongo; + private readonly IMapper _mapper; + private readonly IRedisService _redisService; + private readonly ICapPublisher _capPublisher; + private readonly IBattleOrderService _battleOrderService; + + public TaskService(IMongoBaseRepository gameTaskMongo, IMongoBaseRepository userTaskMongo, IMongoBaseRepository userEntityMongo, IMapper mapper, IRedisService redisService, ICapPublisher capPublisher, IBattleOrderService battleOrderService) + { + + _gameTaskMongo = gameTaskMongo; + _userTaskMongo = userTaskMongo; + _userEntityMongo = userEntityMongo; + _mapper = mapper; + _redisService = redisService; + _capPublisher = capPublisher; + _battleOrderService = battleOrderService; + } + + + public async Task DayTaskReward() + { + var tasks = _gameTaskMongo.FilterBy(c => (c.TaskType == TaskType.每日任务 || c.TaskType == TaskType.在线时长任务) && c.State == 1)?.ToList(); + if (tasks == null || tasks.Count == 0) + return "没有已启用的每日任务配置"; + + await _userTaskMongo.DeleteManyAsync(c => c.TaskType == TaskType.每日任务 || c.TaskType == TaskType.在线时长任务); + + int totalUsers = 0, totalCreated = 0; + int i = 0; + while (true) + { + i++; + List res = new List(); + var list = await _userEntityMongo.QueryPageAsync(LinqExtensions.True(), c => c.Id, false, 100, i); + if (list.count == 0 || list.list == null || list.list.Count == 0) + break; + totalUsers += list.list.Count(); + foreach (var user in list.list) + { + foreach (var task in tasks) + { + var model = _mapper.Map(task); + model.Id = Guid.NewGuid().ToString("N"); + model.UserId = user.Id; + model.IsGet = false; + model.Count = 0; + model.IsFinish = false; + model.TaskAddTime = DateTime.Now.Date.ToTimeStamp(); + model.TaskEndTime = DateTime.Now.Date.AddDays(1).ToTimeStamp(); + res.Add(model); + } + } + if (res.Count > 0) + { + await _userTaskMongo.InsertManyAsync(res); + totalCreated += res.Count; + } + } + + return $"发放完成:找到 {tasks.Count} 个任务,处理 {totalUsers} 个玩家,共创建 {totalCreated} 条任务记录"; + } + + public async Task HourTaskReward() + { + var userIds = _redisService.GetAllLoginUserIds(); + if (userIds == null || userIds.Count() == 0) + return; + userIds = userIds.Distinct().ToArray(); + var task = await _gameTaskMongo.FindOneAsync(c => (c.TaskEvent == TaskEvent.整点在线奖励) && c.State == 1); + if (task == null) + return; + List res = new List(); + + var now = DateTime.Now.Hour; + + + foreach (var id in userIds) + { + + var model = _mapper.Map(task); + model.Id = Guid.NewGuid().ToString("N"); + model.UserId = id; + model.Remark = $"{now}点在线奖励"; + model.IsGet = false; + model.Count = 0; + model.IsFinish = true; + model.TaskAddTime = DateTime.Now.Date.ToTimeStamp(); + model.TaskEndTime = DateTime.Now.Date.AddDays(1).ToTimeStamp(); + res.Add(model); + + } + if (res.Count > 0) + await _userTaskMongo.InsertManyAsync(res); + + } + + + public async Task RegisterTaskReward(string userId) + { + var tasks = _gameTaskMongo.FilterBy(c => c.State == 1); + List res = new List(); + foreach (var task in tasks) + { + var model = _mapper.Map(task); + model.Id = Guid.NewGuid().ToString("N"); + model.UserId = userId; + model.IsGet = false; + model.Count = 0; + model.IsFinish = false; + model.TaskAddTime = DateTime.Now.Date.ToTimeStamp(); + if (model.TaskType == TaskType.每日任务 || model.TaskType == TaskType.在线时长任务) + model.TaskEndTime = DateTime.Now.Date.AddDays(1).ToTimeStamp(); + else + model.TaskEndTime = DateTime.Now.Date.AddYears(100).ToTimeStamp(); + res.Add(model); + } + if (res.Count > 0) + await _userTaskMongo.InsertManyAsync(res); + } + + + public async Task> GetUserTaskList(GetUserTaskListParam param, string userId) + { + var where = LinqExtensions.True().And(e => e.IsDelete == false); + + + if (param.TaskType > -1) + { + where = where.And(e => (int)e.TaskType == param.TaskType); + } + if (!string.IsNullOrEmpty(userId)) + where = where.And(e => e.UserId == userId); + + var result = _userTaskMongo.FilterBy(where).ToList(); + if (result != null && result.Count() > 0) + result = result.OrderByDescending(c => c.IsFinish ? 1 : 0).ThenByDescending(c => c.IsGet ? 1 : 0).ToList(); + return result; + } + public async void CompletedTask(CompletedTaskParam param) + { + + var list = _userTaskMongo.FilterBy(c => c.TaskEvent == param.taskEvent && c.UserId == param.userId && c.IsFinish == false); + if (list == null || list.Count() == 0) + return; + + foreach (var item in list) + { + item.Count += param.count; + if (item.Count >= item.TaskCount) + { + item.IsFinish = true; + item.TaskFinishTime = DateTime.Now.ToTimeStamp(); + + if (item.Exp > 0 && _battleOrderService != null) + { + await _battleOrderService.AddExpAsync(param.userId, item.Exp); + } + } + else + continue; + item.OtherId = param.otherId; + await _userTaskMongo.ReplaceOneAsync(item); + + if (item.TaskType == TaskType.在线时长任务) + { + await DistributeRewards(item.Id, param.userId); + } + } + } + + + public async Task<(bool isok, string msg)> DistributeRewards(string id, string userId) + { + var model = await _userTaskMongo.FindByIdAsync(id); + if (model == null) + return (false, "任务不存在"); + if (model.IsFinish == false) + return (false, "任务未完成"); + if (model.IsGet) + return (false, "奖励已领取"); GiftResponse result = new GiftResponse(); + + model.IsGet = true; + { + if (model.Exp > 0 && _battleOrderService != null) + { + var expResult = await _battleOrderService.AddExpAsync(userId, model.Exp); + result.Exp = model.Exp; + } + } + + var re = await _userTaskMongo.ReplaceOneAsync(model); + + return (re.ok, re.message); + + } + + public async Task<(bool success, string message, long totalExp)> ReceiveAllTaskRewardsAsync(string userId) + { + var tasks = _userTaskMongo.FilterBy(c => c.UserId == userId + && c.IsFinish == true && c.IsGet == false && c.Exp > 0); + + if (tasks == null || !tasks.Any()) + return (false, "没有可领取的任务", 0); + + long totalExp = 0; + var taskList = tasks.ToList(); + foreach (var task in taskList) + { + task.IsGet = true; + totalExp += task.Exp; + await _userTaskMongo.ReplaceOneAsync(task); + } + + if (totalExp > 0 && _battleOrderService != null) + { + await _battleOrderService.AddExpAsync(userId, totalExp); + } + + return (true, $"领取成功,共获得{totalExp}战令经验", totalExp); + } + + + } +} diff --git a/UserSrc/UserService/User/ILotteryService.cs b/UserSrc/UserService/User/ILotteryService.cs new file mode 100644 index 0000000..b9b831d --- /dev/null +++ b/UserSrc/UserService/User/ILotteryService.cs @@ -0,0 +1,17 @@ +using System.Threading.Tasks; +using CommonDomain; +using UserDomain.Entity; + +namespace UserService +{ + public interface ILotteryService + { + + + Task GetUserStatus(string userId); + + Task<(bool success, string message, LotteryPrize? prize, long cost)> Draw(string userId, int poolType = 0); + + Task> GetUserDrawnPrizes(string userId); + } +} diff --git a/UserSrc/UserService/User/IUserFeedbackService.cs b/UserSrc/UserService/User/IUserFeedbackService.cs new file mode 100644 index 0000000..79464a6 --- /dev/null +++ b/UserSrc/UserService/User/IUserFeedbackService.cs @@ -0,0 +1,16 @@ +using UserDomain.Entity; +using UserDomain.Param; + +namespace UserDomain +{ + public interface IUserFeedbackService + { + Task Submit(AddFeedbackParam param, string userId, string userNumber, string userName); + + Task<(List list, long count)> GetUserFeedbacks(string userId, int pageIndex, int pageSize); + + Task GetById(string id, string userId); + + Task<(List list, long count)> QueryPage(FeedbackQueryParam param); + } +} diff --git a/UserSrc/UserService/User/IUserLoginLogService.cs b/UserSrc/UserService/User/IUserLoginLogService.cs new file mode 100644 index 0000000..ddd3539 --- /dev/null +++ b/UserSrc/UserService/User/IUserLoginLogService.cs @@ -0,0 +1,12 @@ +using UserDomain.Entity; +using UserDomain.Param; + +namespace UserDomain +{ + public interface IUserLoginLogService + { + Task AddLog(UserLoginLog log); + + Task<(List list, long count)> QueryPage(UserLoginLogQueryParam param); + } +} diff --git a/UserSrc/UserService/User/IUserMQService.cs b/UserSrc/UserService/User/IUserMQService.cs new file mode 100644 index 0000000..31d1f1f --- /dev/null +++ b/UserSrc/UserService/User/IUserMQService.cs @@ -0,0 +1,16 @@ +using UserService.Param; +using UserService.Tasks.Param; + +namespace UserService.User +{ + public interface IUserMQService + { + Task Test(string txt); + Task CompletedTask(CompletedTaskParam param); + + Task UserAssetChange(UserAssetParam param); + Task GameCoinsSettlement(GameCoinsSettlementParam param); + + Task KillFishLog(AddKillFishLogCapParam param); + } +} diff --git a/UserSrc/UserService/User/IUserService.cs b/UserSrc/UserService/User/IUserService.cs new file mode 100644 index 0000000..2b1115c --- /dev/null +++ b/UserSrc/UserService/User/IUserService.cs @@ -0,0 +1,166 @@ +using Common.CommonModel; +using CommonDomain; +using CommonDomain.BaseModel; +using CommonInfrastructure.Response; +using UserDomain.Entity; +using UserService.Param; +using UserService.Response; +using UserService.Tasks.Param; +using UserService.User.Response; + +namespace UserService.User +{ + public interface IUserService + { + + + + + Task RegisterWeiXin(RegisterUserWeiXinParam param, string ip); + + + Task<(bool isok, string msg, UserToken user)> Register(RegisterUserParam param, string ip); + + Task<(bool isok, string msg)> SendMobileCode(string mobile); + Task LoginWx(string openId, string ip); + + Task<(bool isok, string msg, UserToken user)> Login(string mobile, string code, string ip); + Task<(bool isok, string msg, UserToken user)> LoginByPassword(string mobile, string password, string ip); + Task<(bool isok, string msg)> UpdatePassword(string mobile, string password, string code); + + + + Task<(bool isok, string msg)> RealNameAuth(string idCardNumber, string realName, LoginUser loginUser); + + + + Task<(bool isok, string msg)> UpdateUserName(string userName, LoginUser loginUser); + + + Task<(bool isok, string msg)> BindWX(string openId, LoginUser loginUser); + + Task<(bool isok, string msg)> BindMobile(string mobile, string code, LoginUser loginUser); + + + Task<(List list, int count)> GetUserList(BaseListPageParam param); + + + + Task<(bool isok, string msg)> UpdateUser(UserEntity user); + + Task<(bool isok, string msg)> UpdateAvatar(string avatarUrl, LoginUser loginUser); + + Task<(bool isok, string msg)> UpdateAvatarFrame(string avatarFrame, LoginUser loginUser); + + Task GetUser(string id); + + Task SearchUser(string key); + Task GetUserByMobile(string mobile); + Task GetUserByNuimber(string number); + Task GetUserByOpenId(string openId); + + + Task EveryDayTask(); + Task EveryHourTask(); + + + + Task<(bool isok, string msg)> SaveSafeBox(long gold, LoginUser loginUser); + Task<(bool isok, string msg)> GetSafeBox(long gold, string password, LoginUser loginUser); + + Task<(bool isok, string msg)> SetSafeBoxPassword(string password, LoginUser loginUser); + Task<(bool isok, string msg)> ResetSafeBoxPassword(string password, string code, LoginUser loginUser); + + Task<(bool isok, string msg)> InitUserPassword(string userId); + + Task<(bool isok, string msg)> InitSafeBoxPassword(string userId); + Task<(bool isok, string msg)> GetReliefGold(LoginUser loginUser); + + Task<(bool isok, string msg, BaseProductCount model)> SyntheticFragments(string propNumber, LoginUser loginUser); + + + + Task<(bool isok, string msg)> BuyProps(string propNumber, int count, LoginUser loginUser); + + Task<(bool isok, string msg)> UseVipExp(int count, LoginUser loginUser); + + Task<(bool isok, string msg)> BuyGold(string number, int count, LoginUser loginUser); + + + Task<(bool isok, string msg, string url)> BuyDiamond(string number, int count, LoginUser loginUser); + + + Task<(bool isok, string msg)> BuyDiamondPayCallBack(string orderId); + + Task<(bool isok, string msg, long gold)> Sign(LoginUser loginUser); + + + Task<(bool isok, string msg)> ChangeCannon(string number, LoginUser loginUser); + + + + Task<(bool isok, string msg)> ChangeWing(string number, LoginUser loginUser); + + Task<(bool isok, string msg)> ChangeGodWar(string number, LoginUser loginUser); + + Task<(bool isok, string msg)> UnloadCannon(string number, LoginUser loginUser); + + Task<(bool isok, string msg)> UnloadWing(string number, LoginUser loginUser); + + Task<(bool isok, string msg)> UnloadGodWar(string number, LoginUser loginUser); + + + + Task<(bool isok, string msg, GiftResponse model)> GetVipDayGift(LoginUser loginUser); + + Task<(bool isok, string msg, GiftResponse model)> GetVipGift(int vipLevel, LoginUser loginUser); + + + + + Task<(List list, int count)> GetUserRewardList(GetUserRewardListParam param); + + + + + Task GameCoinsSettlement(GameCoinsSettlementParam param); + + Task<(bool isok, string msg)> SendEmail(SendEmailParam param, LoginUser loginUser); + Task GetEmail(string id, LoginUser loginUser); + Task GetEmail(string id); + Task GetNoReadCount(LoginUser loginUser); + + Task<(bool isok, string msg, RewardEmailResponse model)> RewardEmail(int type, string id, LoginUser loginUser); + Task<(bool isok, string msg)> DeleteEmail(int type, string id, LoginUser loginUser); + + Task<(bool isok, string msg)> ReadEmailMore(LoginUser loginUser); + + Task<(List list, long count)> GetEmailByPage(GetEmailPageParam param, LoginUser loginUser); + + + + Task<(bool isok, string msg)> UpdateAssets(UserAssetParam param); + + + + Task RecordFishingConsume(long consumeGold, LoginUser loginUser); + + Task GetFishingReturnInfo(LoginUser loginUser); + + Task<(bool isok, string msg, long gold)> ClaimFishingReturn(LoginUser loginUser); + + + + Task GetRanking(LoginUser loginUser, int type = 1); + Task DailyRankingReward(); + + + Task<(bool isok, string msg)> SendBroadcast(string message, LoginUser loginUser); + + + + Task SendKillAnnouncement(KillAnnounceParam param); + + + } +} diff --git a/UserSrc/UserService/User/LotteryService.cs b/UserSrc/UserService/User/LotteryService.cs new file mode 100644 index 0000000..e31ada8 --- /dev/null +++ b/UserSrc/UserService/User/LotteryService.cs @@ -0,0 +1,202 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using MongoRepository; +using MongoDB.Driver; +using CommonDomain; +using UserDomain.Entity; + +namespace CommonService +{ + public class LotteryService : ILotteryService + { + + + private readonly IMongoBaseRepository _recordRepo; + + private readonly IMongoBaseRepository _userStatusRepo; + + private readonly IUserService _userService; + + private readonly ICapPublisher _capPublisher; + + public LotteryService( + IMongoBaseRepository activityRepo, + IMongoBaseRepository recordRepo, + IMongoBaseRepository userStatusRepo, + IUserService userService, + ICapPublisher capPublisher) + { + _activityRepo = activityRepo; + _recordRepo = recordRepo; + _userStatusRepo = userStatusRepo; + _userService = userService; + _capPublisher = capPublisher; + } + + + + public async Task GetUserStatus(string userId) + { + var status = await _userStatusRepo.FindOneAsync(s => s.UserId == userId && s.ActivityId == activityId); + if (status == null) + { + status = new LotteryUserStatus + { + UserId = userId + }; + await _userStatusRepo.InsertOneAsync(status); + } + return status; + } + + public async Task<(bool success, string message, LotteryPrize? prize, long cost)> Draw(string userId) + { + var activity = await GetActivity(activityId); + if (activity == null) + return (false, "活动不存在或未开启", null, 0); + + var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + if (now < activity.StartTime) + return (false, "活动未开始", null, 0); + if (now > activity.EndTime) + return (false, "活动已结束", null, 0); + + var userStatus = await GetUserStatus(userId, activityId); + if (userStatus.IsFinished) + return (false, "您已抽完所有奖项,活动结束", null, 0); + + if (activity.UserMaxDraw > 0 && userStatus.TotalDrawCount >= activity.UserMaxDraw) + return (false, "已达最大抽奖次数", null, 0); + + var costIndex = Math.Min(userStatus.TotalDrawCount, activity.Costs.Count - 1); + var cost = activity.Costs[costIndex]; + + var user = await _userService.GetUser(userId); + if (user == null) + return (false, "用户不存在", null, 0); + if (user.Assets.Gold < cost) + return (false, "金币不足", null, 0); + + var level = DrawLevel(activity.Pools); + if (level == null) + return (false, "奖池已空", null, 0); + + var prize = DrawPrize(level, userStatus.DrawnPrizeIds); + if (prize == null) + { + prize = DrawPrizeFromAll(activity.Pools, userStatus.DrawnPrizeIds); + if (prize == null) + return (false, "所有奖项已抽完", null, 0); + level = activity.Pools.FirstOrDefault(p => p.PrizeList.Any(x => x.PrizeId == prize.PrizeId)); + } + + if (prize.TotalCount > 0 && prize.DrawnCount >= prize.TotalCount) + return (false, "该奖项已抽完", null, 0); + + user.Assets.Gold -= cost; + await _userService.UpdateUser(user); + + var record = new LotteryRecord + { + UserId = userId, + ActivityId = activityId, + PrizeId = prize.PrizeId, + Level = level.Level, + Cost = cost, + DrawTime = now + }; + await _recordRepo.InsertOneAsync(record); + + userStatus.DrawnPrizeIds.Add(prize.PrizeId); + userStatus.TotalDrawCount++; + + var allPrizeIds = activity.Pools.SelectMany(p => p.PrizeList).Select(x => x.PrizeId).ToList(); + if (allPrizeIds.All(id => userStatus.DrawnPrizeIds.Contains(id))) + { + userStatus.IsFinished = true; + } + await _userStatusRepo.ReplaceOneAsync(userStatus); + + prize.DrawnCount++; + + await _capPublisher.Publish("Lottery.DrawPrize", new LotteryDrawMessage + { + UserId = userId, + PrizeId = prize.PrizeId, + PrizeName = prize.Name, + Type = prize.Type, + Count = prize.Count, + OtherId = prize.OtherId + }); + + return (true, "抽奖成功", prize, cost); + } + + private LotteryPoolLevel? DrawLevel(List pools) + { + var availablePools = pools.Where(p => + p.PrizeList.Any(x => !x.TotalCount.Equals(0) && x.DrawnCount < x.TotalCount)).ToList(); + if (!availablePools.Any()) + return null; + + long totalWeight = availablePools.Sum(p => (long)p.Weight); + if (totalWeight <= 0) + return null; + + long randomValue = NextInt64(0, totalWeight); + long currentWeightSum = 0; + + foreach (var pool in availablePools) + { + currentWeightSum += pool.Weight; + if (randomValue < currentWeightSum) + return pool; + } + return availablePools.LastOrDefault(); + } + + private LotteryPrize? DrawPrize(LotteryPoolLevel level, List drawnPrizeIds) + { + var availablePrizes = level.PrizeList + .Where(p => !drawnPrizeIds.Contains(p.PrizeId) && + (p.TotalCount == 0 || p.DrawnCount < p.TotalCount)) + .ToList(); + if (!availablePrizes.Any()) + return null; + + int totalWeight = availablePrizes.Sum(p => p.Weight); + if (totalWeight <= 0) + return null; + + int randomValue = Next(0, totalWeight); + int currentWeightSum = 0; + + foreach (var prize in availablePrizes) + { + currentWeightSum += prize.Weight; + if (randomValue < currentWeightSum) + return prize; + } + return availablePrizes.LastOrDefault(); + } + + private LotteryPrize? DrawPrizeFromAll(List pools, List drawnPrizeIds) + { + foreach (var pool in pools.OrderByDescending(p => p.Weight)) + { + var prize = DrawPrize(pool, drawnPrizeIds); + if (prize != null) + return prize; + } + return null; + } + + public async Task> GetUserDrawnPrizes(string userId, string activityId) + { + var status = await GetUserStatus(userId, activityId); + return status?.DrawnPrizeIds ?? new List(); + } + } +} diff --git a/UserSrc/UserService/User/Param/AddKillFishLogCapParam.cs b/UserSrc/UserService/User/Param/AddKillFishLogCapParam.cs new file mode 100644 index 0000000..69ca1d2 --- /dev/null +++ b/UserSrc/UserService/User/Param/AddKillFishLogCapParam.cs @@ -0,0 +1,27 @@ +using CommonDomain.Enum; + +namespace UserService.Param +{ + public class AddKillFishLogCapParam + { + public string UserId { get; set; } + + public GameTypeEnum GameType { get; set; } = GameTypeEnum.风雷之渊; + + public int RoomLevel { get; set; } = 0; + + public int RoomPartition { get; set; } = 0; + + public int RoomNumber { get; set; } = 0; + + + public string FishNumber { get; set; } + + + public long Cost { get; set; } + + + public double Income { get; set; } + public double Factor { get; set; } + } +} diff --git a/UserSrc/UserService/User/Param/AddUserPropParam.cs b/UserSrc/UserService/User/Param/AddUserPropParam.cs new file mode 100644 index 0000000..4449b9e --- /dev/null +++ b/UserSrc/UserService/User/Param/AddUserPropParam.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UserService.Param +{ + public class AddUserPropParam + { + public string PropId { get; set; } + public int Count { get; set; } + + public int Type { get; set; } + } +} diff --git a/UserSrc/UserService/User/Param/GameCoinsSettlementParam.cs b/UserSrc/UserService/User/Param/GameCoinsSettlementParam.cs new file mode 100644 index 0000000..1a9361f --- /dev/null +++ b/UserSrc/UserService/User/Param/GameCoinsSettlementParam.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UserService.Param +{ + public class GameCoinsSettlementParam + { + + public string UserId { get; set; } + public long BeforeGold { get; set; } = 0; + + public long AfterGold { get; set; } = 0; + + + public string Remark { get; set; } = string.Empty; + + + public string RoomName { get; set; } = string.Empty; + + public string RoomInfo { get; set; } = string.Empty; + + public long RoomSessionId { get; set; } + } +} diff --git a/UserSrc/UserService/User/Param/GetEmailPageParam.cs b/UserSrc/UserService/User/Param/GetEmailPageParam.cs new file mode 100644 index 0000000..1464c10 --- /dev/null +++ b/UserSrc/UserService/User/Param/GetEmailPageParam.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Common.CommonModel; + +namespace UserService.Param +{ + public class GetEmailPageParam : BaseListPageParam + { + + public int ReadStatus { get; set; } = 0; + + } +} diff --git a/UserSrc/UserService/User/Param/GetUserRewardListParam.cs b/UserSrc/UserService/User/Param/GetUserRewardListParam.cs new file mode 100644 index 0000000..2f1284a --- /dev/null +++ b/UserSrc/UserService/User/Param/GetUserRewardListParam.cs @@ -0,0 +1,16 @@ +using Common.CommonModel; +using UserDomain.Enum; + +namespace UserService.Param +{ + public class GetUserRewardListParam :BaseListPageParam + { + public string UserId { get; set; }= string.Empty; + + public int Type { get; set; } = 0; + + public int Source { get; set; } = 0; + + public int CurrencyType { get; set; } = 0; + } +} diff --git a/UserSrc/UserService/User/Param/RegisterUserParam.cs b/UserSrc/UserService/User/Param/RegisterUserParam.cs new file mode 100644 index 0000000..6299176 --- /dev/null +++ b/UserSrc/UserService/User/Param/RegisterUserParam.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UserService.Param +{ + public class RegisterUserParam + { + + public string Account { get; set; } = string.Empty; + public string NickName { get; set; } = string.Empty; + public string PassWord { get; set; } = string.Empty; + public string? Mobile { get; set; } + + } +} diff --git a/UserSrc/UserService/User/Param/RegisterUserWeiXinParam.cs b/UserSrc/UserService/User/Param/RegisterUserWeiXinParam.cs new file mode 100644 index 0000000..fd6c57d --- /dev/null +++ b/UserSrc/UserService/User/Param/RegisterUserWeiXinParam.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UserService.Param +{ + public class RegisterUserWeiXinParam + { + public string? OpenId { get; set; } + + public string? NickName { get; set; } + + public string? AvatarUrl { get; set; } + + + } +} diff --git a/UserSrc/UserService/User/Param/SendEmailParam.cs b/UserSrc/UserService/User/Param/SendEmailParam.cs new file mode 100644 index 0000000..cf500a1 --- /dev/null +++ b/UserSrc/UserService/User/Param/SendEmailParam.cs @@ -0,0 +1,17 @@ +using CommonDomain.BaseModel; + +namespace UserService.Param +{ + public class SendEmailParam + { + + + public string? UserId { get; set; } + public string? Title { get; set; } + public string? Content { get; set; } + public int RewardDiamond { get; set; } = 0; + public long RewardGold { get; set; } = 0; + public List? RewardItems { get; set; } = null; + + } +} diff --git a/UserSrc/UserService/User/Param/UpdateUserDataParam.cs b/UserSrc/UserService/User/Param/UpdateUserDataParam.cs new file mode 100644 index 0000000..0d95653 --- /dev/null +++ b/UserSrc/UserService/User/Param/UpdateUserDataParam.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UserService.Param +{ + public class UpdateUserDataParam + { + + public string Id { get; set; } + public int Diamond { get; set; } = 0; + public long Gold { get; set; } = 0; + public int Level { get; set; } = 1; + public long Exp { get; set; } = 0; + } +} diff --git a/UserSrc/UserService/User/Param/UserAssetParam.cs b/UserSrc/UserService/User/Param/UserAssetParam.cs new file mode 100644 index 0000000..0d7109d --- /dev/null +++ b/UserSrc/UserService/User/Param/UserAssetParam.cs @@ -0,0 +1,47 @@ +using CommonDomain.BaseModel; +using UserDomain.Enum; + +namespace UserService.Param +{ + public class UserAssetParam + { + + + public string UserId { get; set; } + + public RewardSource Source { get; set; } + + public UserAssetChangeTypeEnum ChangeType { get; set; } + public int Diamond { get; set; } = 0; + + public long Gold { get; set; } = 0; + + + + public string OtherId { get; set; }= string.Empty; + + public List RewardItems { get; set; } + + + public string OtherUserId { get; set; } = string.Empty; + + public string Remark { get; set; } = string.Empty; + + + public string RoomName { get; set; } = string.Empty; + + public string RoomInfo { get; set; } = string.Empty; + + public int Tax { get; set; } = 0; + + public long Exp { get; set; } = 0; + + public bool IsAddRecord { get; set; } = true; + + public bool AffectFishFactor { get; set; } = true; + + public long TotalRechargeGoldDelta { get; set; } = 0; + + public bool SyncToFrontend { get; set; } = true; + } +} diff --git a/UserSrc/UserService/User/Response/RankingResponse.cs b/UserSrc/UserService/User/Response/RankingResponse.cs new file mode 100644 index 0000000..e5e7822 --- /dev/null +++ b/UserSrc/UserService/User/Response/RankingResponse.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UserService.Response +{ + public class RankingResponse + { + public int RankingType { get; set; } + + public string RankingTypeName { get; set; } = string.Empty; + + public List UserList { get; set; } = new List(); + + public RankingUserResponse? User { get; set; } + } + + public class RankingUserResponse + { + public string UserId { get; set; } = string.Empty; + + public int Rank { get; set; } + + public string UserName { get; set; } = string.Empty; + + public string NickName { get; set; } = string.Empty; + + public string Number { get; set; } = string.Empty; + + public string AvatarUrl { get; set; } = string.Empty; + + public string Mobile { get; set; } = string.Empty; + + public int Level { get; set; } + + public long RankingValue { get; set; } + } +} diff --git a/UserSrc/UserService/User/Response/RewardEmailResponse.cs b/UserSrc/UserService/User/Response/RewardEmailResponse.cs new file mode 100644 index 0000000..4e2cfeb --- /dev/null +++ b/UserSrc/UserService/User/Response/RewardEmailResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CommonDomain.BaseModel; + +namespace UserService.User.Response +{ + public class RewardEmailResponse + { + public bool IsReward { get; set; } = false; + public int RewardDiamond { get; set; } = 0; + public long RewardGold { get; set; } = 0; + public List RewardItems { get; set; } = new List(); + } +} diff --git a/UserSrc/UserService/User/Response/UserToken.cs b/UserSrc/UserService/User/Response/UserToken.cs new file mode 100644 index 0000000..c5eccc1 --- /dev/null +++ b/UserSrc/UserService/User/Response/UserToken.cs @@ -0,0 +1,9 @@ + +using UserDomain.Entity; +namespace UserService.Response +{ + public class UserToken: UserEntity + { + public string Token { get; set; } + } +} diff --git a/UserSrc/UserService/User/UserFeedbackService.cs b/UserSrc/UserService/User/UserFeedbackService.cs new file mode 100644 index 0000000..cefdeb7 --- /dev/null +++ b/UserSrc/UserService/User/UserFeedbackService.cs @@ -0,0 +1,76 @@ +using MongoRepository; +using UserDomain; +using UserDomain.Entity; +using UserDomain.Param; + +namespace UserService +{ + public class UserFeedbackService : IUserFeedbackService + { + private readonly IMongoBaseRepository _feedbackRepo; + + public UserFeedbackService(IMongoBaseRepository feedbackRepo) + { + _feedbackRepo = feedbackRepo; + } + + public async Task Submit(AddFeedbackParam param, string userId, string userNumber, string userName) + { + var feedback = new UserFeedback + { + UserId = userId, + UserNumber = userNumber, + UserName = userName, + Type = param.Type, + Title = param.Title, + Content = param.Content, + Images = param.Images, + QQ = param.QQ, + Contact = param.Contact, + Status = 0, + SubmitTime = DateTime.Now + }; + + var result = await _feedbackRepo.InsertOneAsync(feedback); + return result.ok; + } + + public async Task<(List list, long count)> GetUserFeedbacks(string userId, int pageIndex, int pageSize) + { + var result = await _feedbackRepo.QueryPageAsync( + filterExpression: x => x.UserId == userId, + orderExpression: x => x.SubmitTime, + desc: true, + pageSize: pageSize, + pageIndex: pageIndex + ); + + return (result.list.ToList(), result.count); + } + + public async Task GetById(string id, string userId) + { + return await _feedbackRepo.FindOneAsync(x => x.Id == id && x.UserId == userId); + } + + public async Task<(List list, long count)> QueryPage(FeedbackQueryParam param) + { + var result = await _feedbackRepo.QueryPageAsync( + filterExpression: x => + (string.IsNullOrEmpty(param.UserId) || x.UserId == param.UserId) && + (string.IsNullOrEmpty(param.UserNumber) || x.UserNumber == param.UserNumber) && + (string.IsNullOrEmpty(param.UserName) || (x.UserName != null && x.UserName.Contains(param.UserName))) && + (!param.Type.HasValue || x.Type == param.Type) && + (!param.Status.HasValue || x.Status == param.Status) && + (!param.StartTime.HasValue || x.SubmitTime >= param.StartTime) && + (!param.EndTime.HasValue || x.SubmitTime <= param.EndTime), + orderExpression: x => x.SubmitTime, + desc: true, + pageSize: param.PageSize, + pageIndex: param.PageIndex + ); + + return (result.list.ToList(), result.count); + } + } +} diff --git a/UserSrc/UserService/User/UserLoginLogService.cs b/UserSrc/UserService/User/UserLoginLogService.cs new file mode 100644 index 0000000..c0b3754 --- /dev/null +++ b/UserSrc/UserService/User/UserLoginLogService.cs @@ -0,0 +1,44 @@ +using MongoRepository; +using UserDomain; +using UserDomain.Entity; +using UserDomain.Param; + +namespace UserService +{ + public class UserLoginLogService : IUserLoginLogService + { + private readonly IMongoBaseRepository _logRepo; + + public UserLoginLogService(IMongoBaseRepository logRepo) + { + _logRepo = logRepo; + } + + public async Task AddLog(UserLoginLog log) + { + var result = await _logRepo.InsertOneAsync(log); + return result.ok; + } + + public async Task<(List list, long count)> QueryPage(UserLoginLogQueryParam param) + { + var result = await _logRepo.QueryPageAsync( + filterExpression: x => + (string.IsNullOrEmpty(param.UserId) || x.UserId == param.UserId) && + (string.IsNullOrEmpty(param.UserNumber) || x.UserNumber == param.UserNumber) && + (string.IsNullOrEmpty(param.UserName) || (x.UserName != null && x.UserName.Contains(param.UserName))) && + (!param.LoginType.HasValue || x.LoginType == param.LoginType) && + (!param.Status.HasValue || x.Status == param.Status) && + (!param.Platform.HasValue || x.Platform == param.Platform) && + (!param.StartTime.HasValue || x.LoginTime >= param.StartTime) && + (!param.EndTime.HasValue || x.LoginTime <= param.EndTime), + orderExpression: x => x.LoginTime, + desc: true, + pageSize: param.PageSize, + pageIndex: param.PageIndex + ); + + return (result.list.ToList(), result.count); + } + } +} diff --git a/UserSrc/UserService/User/UserMQService.cs b/UserSrc/UserService/User/UserMQService.cs new file mode 100644 index 0000000..985bac6 --- /dev/null +++ b/UserSrc/UserService/User/UserMQService.cs @@ -0,0 +1,65 @@ +using AutoMapper; +using Common.Utils; +using CommonDomain; +using DotNetCore.CAP; +using Microsoft.Extensions.Logging; +using MongoRepository; +using UserDomain.Entity; +using UserService.Param; +using UserService.Tasks; +using UserService.Tasks.Param; + +namespace UserService.User +{ + public class UserMQService : IUserMQService, ICapSubscribe + { + private readonly IUserService _userService; + private readonly ITaskService _taskService; + private readonly IMongoBaseRepository _killLog; + private readonly IMapper _mapper; + + public UserMQService(IUserService userService, ITaskService taskService, IMongoBaseRepository killLog, IMapper mapper) + { + _userService = userService; + _taskService = taskService; + _killLog = killLog; + _mapper = mapper; + } + [CapSubscribe("test")] + public async Task Test(string txt) + { + + + + + } + [CapSubscribe(TopicKeys.任务完成)] + public async Task CompletedTask(CompletedTaskParam param) + { + _taskService.CompletedTask(param); + } + + [CapSubscribe(TopicKeys.用户资产变更)] + public async Task UserAssetChange(UserAssetParam param) + { + await _userService.UpdateAssets(param); + } + [CapSubscribe(TopicKeys.游戏金币结算)] + public async Task GameCoinsSettlement(GameCoinsSettlementParam param) + { + + + await _userService.GameCoinsSettlement(param); + } + + [CapSubscribe(TopicKeys.击杀鱼日志)] + public async Task KillFishLog(AddKillFishLogCapParam param) + { + var model = _mapper.Map(param); + model.Id = Guid.NewGuid().ToString(); + model.CreateTime = DateTime.Now.ToTimeStamp(); + await _killLog.InsertOneAsync(model); + + } + } +} diff --git a/UserSrc/UserService/User/UserService.cs b/UserSrc/UserService/User/UserService.cs new file mode 100644 index 0000000..fc7943c --- /dev/null +++ b/UserSrc/UserService/User/UserService.cs @@ -0,0 +1,2657 @@ +using System.Security.Claims; +using System.Text.RegularExpressions; +using AdminDomain.Entity; +using AutoMapper; +using Microsoft.AspNetCore.SignalR; +using UserService.Hubs; +using Common; +using Common.BlockWord; +using Common.CommonModel; +using Common.Redis; +using Common.Utils; +using CommonDomain; +using CommonDomain.BaseModel; +using CommonDomain.Enum; +using CommonInfrastructure.Response; +using DotNetCore.CAP; +using JWTHelper; +using Microsoft.Extensions.Logging; +using MongoDB.Driver; +using MongoRepository; +using RedisHelper; +using RedisService; +using UserDomain.Entity; +using UserDomain.Enum; +using UserService.GameConfigs; +using UserService.Param; +using UserService.Response; +using UserService.Tasks.Param; +using UserService.User.Response; + +namespace UserService.User +{ + public class UserService : IUserService + { + private readonly IMongoBaseRepository _userMongo; + private readonly IMongoBaseRepository _emailMongo; + private readonly IMongoBaseRepository _rewardMongo; + private readonly IMongoBaseRepository _orderMongo; + private readonly IMongoBaseRepository _beadfulNumberMongo; + private readonly IMongoBaseRepository _userBattleOrderMongo; + private readonly IGameConfigService _gameConfigService; + private readonly IActivityConfigService _activityConfigService; + private readonly IMongoBaseRepository _loginLogMongo; + private readonly ILogger _logger; + private readonly IMapper _mapper; + private readonly IRedisService _cache; + private readonly JwtTools _jwtTools; + private readonly ICapPublisher _capPublisher; + private readonly IDistributedLock _distributedLock; + private readonly IHubContext _hubContext; + + public UserService(IMongoBaseRepository userMongo, IMongoBaseRepository emailMongo, IMongoBaseRepository rewardMongo, IMongoBaseRepository orderMongo, IMongoBaseRepository beadfulNumberMongo, IMongoBaseRepository userBattleOrderMongo, IGameConfigService gameConfigService, IActivityConfigService activityConfigService, IMongoBaseRepository loginLogMongo, ILogger logger, IMapper mapper, IRedisService cache, JwtTools jwtTools, ICapPublisher capPublisher, IDistributedLock distributedLock, IHubContext hubContext) + { + _userMongo = userMongo; + _emailMongo = emailMongo; + _rewardMongo = rewardMongo; + _orderMongo = orderMongo; + _beadfulNumberMongo = beadfulNumberMongo; + _userBattleOrderMongo = userBattleOrderMongo; + _gameConfigService = gameConfigService; + _activityConfigService = activityConfigService; + _loginLogMongo = loginLogMongo; + _logger = logger; + _mapper = mapper; + _cache = cache; + _jwtTools = jwtTools; + _capPublisher = capPublisher; + _distributedLock = distributedLock; + _hubContext = hubContext; + } + + + + public async Task RegisterWeiXin(RegisterUserWeiXinParam param, string ip) + { + var user = await _userMongo.FindOneAsync(c => c.BaseInfo.WXOpenId == param.OpenId); + if (user != null) + { + var result = await LoginWx(param.OpenId, ip); + if (result != null) + return result; + return null; + } + user = new UserEntity(); + + user.BaseInfo.WXOpenId = param.OpenId; + + user.BaseInfo.AvatarUrl = param.AvatarUrl; + user.Assets = new Assets() { }; + user.BaseInfo.Number = await GetUserNumner(); + user.BaseInfo.UserName = string.IsNullOrWhiteSpace(param.NickName) + ? $"ID_{user.BaseInfo.Number}" + : param.NickName.Trim(); + var gameConfig = _cache.GetGameConfig(); + var activityConfig = await _activityConfigService.Get(); + user.Init(gameConfig, activityConfig); + + user.RegisterIp = ip; + user.Static.LastLoginTime = DateTime.Now.ToTimeStamp(); + user.Static.LastLoginIp = ip; + + + var res = await _userMongo.InsertOneAsync(user); + if (!res.ok) + return null; + var model = await LoginToken(user); + + return model; + } + + + public async Task<(bool isok, string msg, UserToken user)> Register(RegisterUserParam param, string ip) + { + if (param == null) + throw new BusinessException("注册参数不能为空"); + + param.Mobile = param.Mobile?.Trim(); + param.Account = param.Account?.Trim() ?? ""; + param.NickName = param.NickName?.Trim() ?? ""; + var mobileMasked = !string.IsNullOrWhiteSpace(param.Mobile) && param.Mobile.Length >= 7 + ? $"{param.Mobile[..3]}****{param.Mobile[^4..]}" + : param.Mobile ?? string.Empty; + + + + if (string.IsNullOrWhiteSpace(param.Mobile) || param.Mobile.Length != 11) + throw new BusinessException("手机号格式错误"); + + if (string.IsNullOrWhiteSpace(param.Account)) + throw new BusinessException("账号不能为空"); + + if (string.IsNullOrWhiteSpace(param.NickName)) + throw new BusinessException("昵称不能为空"); + + { + Regex _detailedPhoneRegex = new Regex(@"^1[3-9]\d{9}$", RegexOptions.Compiled); + if (_detailedPhoneRegex.IsMatch(param.Mobile) == false) + throw new BusinessException("手机号格式错误"); + } + + if (string.IsNullOrWhiteSpace(param.PassWord)) + throw new BusinessException("密码不能为空"); + param.PassWord = Md5Helper.GetMD5(param.PassWord); + + var gameConfig = _cache.GetGameConfig(); + if (gameConfig == null) + throw new BusinessException("游戏配置错误"); + var activityConfig = await _activityConfigService.Get(); + if (activityConfig == null) + throw new BusinessException("活动配置错误"); + + var lockKey = $"{RedisKey.DistributedLockPrefix}user:register:mobile:{param.Mobile}"; + var result = await _distributedLock.TryExecuteAsync(lockKey, async () => + { + UserEntity user; + try + { + user = await _userMongo.FindOneAsync(c => c.BaseInfo.Mobile == param.Mobile); + if (user != null) + { + + throw new BusinessException("手机号已被注册"); + } + + user = await _userMongo.FindOneAsync(c => c.BaseInfo.WXOpenId == param.Account); + if (user != null) + { + + throw new BusinessException("账号已被注册"); + } + } + catch (BusinessException) + { + throw; + } + catch (Exception ex) + { + _logger.LogError(ex, "注册查重异常 mobile={Mobile} Account={Account}", mobileMasked, param.Account); + throw; + } + + user = new UserEntity(); + + user.BaseInfo.Mobile = param.Mobile; + user.BaseInfo.WXOpenId = param.Account; + user.CreateTime = DateTime.Now.ToTimeStamp(); + user.BaseInfo.Password = param.PassWord; + user.BaseInfo.Number = await GetUserNumner(); + user.BaseInfo.UserName = param.NickName; + + user.Init(gameConfig, activityConfig); + + user.RegisterIp = ip; + user.Static.LastLoginTime = DateTime.Now.ToTimeStamp(); + user.Static.LastLoginIp = ip; + var res = await _userMongo.InsertOneAsync(user); + if (!res.ok) + { + + throw new BusinessException("注册失败"); + } + + var model = await LoginToken(user); + + + + return (true, "注册成功", model); + }, expiry: 30); + + if (result == default) + throw new BusinessException("系统繁忙,请稍后再试"); + + return result; + } + + public async Task<(bool isok, string msg)> SendMobileCode(string mobile) + { + if (!ValidationHelper.IsValidMobile(mobile)) + throw new BusinessException("手机号格式错误"); + + string code = "000000"; + { + } + _cache.SetVerificationCode(mobile, code); + return (true, "发送成功"); + } + public async Task LoginWx(string openId, string ip) + { + var user = await GetUserByOpenId(openId); + if (user == null) + { + await AddLoginLog(null, null, null, 2, 0, ip, "用户不存在"); + return null; + } + + try + { + user.Static.LastLoginTime = DateTime.Now.ToTimeStamp(); + user.Static.LastLoginIp = ip; + await _userMongo.ReplaceOneAsync(user); + await AddLoginLog(user.Id, user.BaseInfo.Number, user.BaseInfo.UserName, 2, 1, ip, null); + } + catch + { + // ignore + } + + await HandleLoginRoomSettlementAsync(user.Id); + user = await _userMongo.FindByIdAsync(user.Id); + var model = await LoginToken(user); + return model; + } + + public async Task<(bool isok, string msg, UserToken user)> Login(string mobile, string code, string ip) + { + if (string.IsNullOrEmpty(mobile)) + throw new BusinessException("请输入手机号"); + if (string.IsNullOrEmpty(code)) + throw new BusinessException("请输入验证码"); + + var user = await GetUserByMobile(mobile); + if (user == null) + { + await AddLoginLog(null, null, mobile, 1, 0, ip, "用户不存在"); + throw new BusinessException("用户不存在"); + } + + var redisCode = _cache.GetVerificationCode(mobile); + var isCodeLogin = !string.IsNullOrEmpty(redisCode) && redisCode == code; + var isPasswordLogin = Md5Helper.GetMD5(code) == user.BaseInfo.Password; + + if (!isCodeLogin && !isPasswordLogin) + { + await AddLoginLog(user.Id, user.BaseInfo.Number, user.BaseInfo.UserName, 1, 0, ip, "验证码或密码错误"); + throw new BusinessException("验证码错误"); + } + + if (isCodeLogin) + _cache.RemoveVerificationCode(mobile); + user.Static.LastLoginTime = DateTime.Now.ToTimeStamp(); + user.Static.LastLoginIp = ip; + await _userMongo.ReplaceOneAsync(user); + await AddLoginLog(user.Id, user.BaseInfo.Number, user.BaseInfo.UserName, 1, 1, ip, null); + await HandleLoginRoomSettlementAsync(user.Id); + user = await _userMongo.FindByIdAsync(user.Id); + var model = await LoginToken(user); + return (true, "登录成功", model); + } + + public async Task<(bool isok, string msg, UserToken user)> LoginByPassword(string mobile, string password, string ip) + { + if (string.IsNullOrEmpty(mobile)) + return (false, "请输入手机号", null); + if (string.IsNullOrEmpty(password)) + return (false, "请输入密码", null); + + var user = await GetUserByMobile(mobile); + if (user == null) + { + await AddLoginLog(null, null, mobile, 1, 0, ip, "用户不存在"); + return (false, "用户不存在", null); + } + + if (string.IsNullOrEmpty(user.BaseInfo.Password)) + { + await AddLoginLog(user.Id, user.BaseInfo.Number, user.BaseInfo.UserName, 1, 0, ip, "未设置密码"); + return (false, "该账号未设置密码,请使用验证码登录", null); + } + + if (Md5Helper.GetMD5(password) != user.BaseInfo.Password) + { + await AddLoginLog(user.Id, user.BaseInfo.Number, user.BaseInfo.UserName, 1, 0, ip, "密码错误"); + return (false, "密码错误", null); + } + + user.Static.LastLoginTime = DateTime.Now.ToTimeStamp(); + user.Static.LastLoginIp = ip; + await _userMongo.ReplaceOneAsync(user); + await AddLoginLog(user.Id, user.BaseInfo.Number, user.BaseInfo.UserName, 1, 1, ip, null); + await HandleLoginRoomSettlementAsync(user.Id); + user = await _userMongo.FindByIdAsync(user.Id); + var model = await LoginToken(user); + return (true, "登录成功", model); + } + + private async Task AddLoginLog(string? userId, string? userNumber, string? userName, int loginType, int status, string ip, string? failReason) + { + try + { + var log = new UserLoginLog + { + UserId = userId, + UserNumber = userNumber, + UserName = userName, + LoginType = loginType, + Status = status, + Ip = ip, + FailReason = failReason, + LoginTime = DateTime.Now + }; + await _loginLogMongo.InsertOneAsync(log); + } + catch (Exception ex) + { + _logger.LogError(ex, "记录登录日志失败"); + } + } + + public async Task<(bool isok, string msg)> UpdatePassword(string mobile, string password, string code) + { + if (!ValidationHelper.IsValidMobile(mobile)) + throw new BusinessException("手机号格式错误"); + if (string.IsNullOrWhiteSpace(password) || password.Length < 6 || password.Length > 20) + throw new BusinessException("密码长度应为6-20位"); + + var redisCode = _cache.GetVerificationCode(mobile); + if (redisCode == null) + throw new BusinessException("请先发送验证码"); + if (redisCode != code) + throw new BusinessException("验证码错误"); + + var user = await GetUserByMobile(mobile); + if (user == null) + throw new BusinessException("用户不存在"); + + password = Md5Helper.GetMD5(password); + _cache.RemoveVerificationCode(mobile); + user.BaseInfo.Password = password; + var res = await _userMongo.ReplaceOneAsync(user); + if (!res.ok) + throw new BusinessException("修改失败"); + else + return (true, "修改成功"); + } + + public async Task<(bool isok, string msg)> InitUserPassword(string userId) + { + var user = await _userMongo.FindOneAsync(c => c.Id == userId); + if (user == null) + return (false, "用户不存在"); + + user.BaseInfo.Password = Md5Helper.GetMD5("123456"); + var res = await _userMongo.ReplaceOneAsync(user); + if (!res.ok) + return (false, "初始化失败"); + return (true, "用户密码已初始化为123456"); + } + + public async Task<(bool isok, string msg)> InitSafeBoxPassword(string userId) + { + var user = await _userMongo.FindOneAsync(c => c.Id == userId); + if (user == null) + return (false, "用户不存在"); + + user.SafeBox.Password = Md5Helper.GetMD5("123456"); + var res = await _userMongo.ReplaceOneAsync(user); + if (!res.ok) + return (false, "初始化失败"); + return (true, "保险箱密码已初始化为123456"); + } + + + public async Task<(bool isok, string msg)> UpdateUserName(string userName, LoginUser loginUser) + { + if (string.IsNullOrWhiteSpace(userName) || !ValidationHelper.IsValidUserName(userName)) + return (false, "用户名格式错误,支持2-20位中英文、数字、下划线"); + + var user = await GetUser(loginUser.UserId); + if (user == null) throw new BusinessException("用户不存在"); + + + if( BlockWordHelper.IsHaveBlockWord(userName)) + return (false, "包含敏感词"); + if (user.Props == null || user.Props.Count() == 0) + return (false, "请先购买改名卡"); + var prop = user.Props.FirstOrDefault(c => c.Type == ProductTypeEnum.改名卡); + if (prop == null) + return (false, "请先购买改名卡"); + if (prop.Count == 0) + return (false, "改名卡不足"); + + if (prop.Count == 1) + { + user.Props.Remove(prop); + } + else + prop.Count--; + user.BaseInfo.UserName = userName; + await _userMongo.ReplaceOneAsync(user); + return (true, "更新成功"); + } + + + public async Task<(bool isok, string msg)> BindWX(string openId, LoginUser loginUser) + { + if (string.IsNullOrWhiteSpace(openId)) + throw new BusinessException("OpenId不能为空"); + + var user = await GetUser(loginUser.UserId); + if (user == null) throw new BusinessException("用户不存在"); + if (!string.IsNullOrWhiteSpace(user.BaseInfo.WXOpenId)) throw new BusinessException("微信已绑定"); + + if (_userMongo.Count(c => c.BaseInfo.WXOpenId == openId) > 0) + { + throw new BusinessException("此微信号已被绑定,请先解绑"); + } + user.BaseInfo.WXOpenId = openId; + await _userMongo.ReplaceOneAsync(user); + return (true, "更新成功"); + } + + public async Task<(bool isok, string msg)> BindMobile(string mobile, string code, LoginUser loginUser) + { + var redisCode = _cache.GetVerificationCode(mobile); + if (redisCode == null) + throw new BusinessException("请先发送验证码"); + if (redisCode != code) + throw new BusinessException("验证码错误"); + + var user = await GetUser(loginUser.UserId); + if (user == null) throw new BusinessException("用户不存在"); + if (!string.IsNullOrWhiteSpace(user.BaseInfo.Mobile)) throw new BusinessException("已绑定手机号"); + if (_userMongo.Count(c => c.BaseInfo.Mobile == mobile) > 0) + { + throw new BusinessException("此手机号已被绑定"); + } + user.BaseInfo.Mobile = mobile; + await _userMongo.ReplaceOneAsync(user); + return (true, "更新成功"); + } + + + public async Task<(bool isok, string msg)> UpdateAvatar(string avatarUrl, LoginUser loginUser) + { + var user = await GetUser(loginUser.UserId); + if (user == null) throw new BusinessException("用户不存在"); + user.BaseInfo.AvatarUrl = avatarUrl; + await _userMongo.ReplaceOneAsync(user); + return (true, "更新成功"); + } + + public async Task<(bool isok, string msg)> UpdateAvatarFrame(string avatarFrame, LoginUser loginUser) + { + var user = await GetUser(loginUser.UserId); + if (user == null) throw new BusinessException("用户不存在"); + user.BaseInfo.AvatarFrame = avatarFrame; + await _userMongo.ReplaceOneAsync(user); + return (true, "更新成功"); + } + + public async Task<(bool isok, string msg)> RealNameAuth(string idCardNumber, string realName, LoginUser loginUser) + { + if (string.IsNullOrWhiteSpace(idCardNumber)) + throw new BusinessException("身份证号不能为空"); + if (!ValidationHelper.IsValidIdCard(idCardNumber)) + throw new BusinessException("身份证号格式错误"); + if (string.IsNullOrWhiteSpace(realName) || realName.Length < 2 || realName.Length > 20) + throw new BusinessException("真实姓名格式错误"); + + var user = await GetUser(loginUser.UserId); + if (user == null) throw new BusinessException("用户不存在"); + + if (user.RealName != null) + throw new BusinessException("已完成实名认证"); + user.RealName = new RealNameInfo() + { + RealName = realName, + IDCard = idCardNumber + }; + await _userMongo.ReplaceOneAsync(user); + return (true, "实名认证成功"); + } + public async Task SearchUser(string key) + { + var model = await _userMongo.FindOneAsync(c => c.Id == key || c.BaseInfo.Number == key || c.BaseInfo.UserName.Contains(key) || c.BaseInfo.Mobile.Contains(key)); + if (model == null) + return null; + if (model.BanInfo != null && model.BanInfo.IsBan) + { + if (model.BanInfo.BanDays > 0 && DateTime.Now.ToTimeStamp() > model.BanInfo.BanEndTime) + { + model.BanInfo.IsBan = false; + model.BanInfo.BanDays = 0; + model.BanInfo.BanEndTime = 0; + model.BanInfo.BanReason = ""; + model.BanInfo.BanTime = 0; + await _userMongo.ReplaceOneAsync(model); + return model; + } + + throw new BusinessException("用户已被封禁 原因:" + model.BanInfo.BanReason + " 到期时间" + model.BanInfo.BanEndTime.ToDateTime().ToString("yyyy-MM-dd hh:mm")); + } + if (model.IsDelete) + throw new BusinessException("用户已被删除"); + return model; + } + + public async Task GetUser(string id) + { + var model = await _userMongo.FindOneAsync(c => c.Id == id || c.BaseInfo.Number==id); + if (model == null) + return null; + if (model.BanInfo != null && model.BanInfo.IsBan) + { + if (model.BanInfo.BanDays > 0 && DateTime.Now.ToTimeStamp() > model.BanInfo.BanEndTime) + { + model.BanInfo.IsBan = false; + model.BanInfo.BanDays = 0; + model.BanInfo.BanEndTime = 0; + model.BanInfo.BanReason = ""; + model.BanInfo.BanTime = 0; + await _userMongo.ReplaceOneAsync(model); + return model; + } + + throw new BusinessException("用户已被封禁 原因:" + model.BanInfo.BanReason + " 到期时间" + model.BanInfo.BanEndTime.ToDateTime().ToString("yyyy-MM-dd hh:mm")); + } + if (model.IsDelete) + throw new BusinessException("用户已被删除"); + return model; + } + public async Task GetUserByMobile(string mobile) + { + var model = await _userMongo.FindOneAsync(c => c.BaseInfo.Mobile == mobile); + if (model == null) + { + throw new BusinessException("用户不存在"); + } + if (model.BanInfo != null && model.BanInfo.IsBan) + { + if (model.BanInfo.BanDays > 0 && DateTime.Now.ToTimeStamp() > model.BanInfo.BanEndTime) + { + model.BanInfo.IsBan = false; + model.BanInfo.BanDays = 0; + model.BanInfo.BanEndTime = 0; + model.BanInfo.BanReason = ""; + model.BanInfo.BanTime = 0; + await _userMongo.ReplaceOneAsync(model); + return model; + } + + throw new BusinessException("用户已被封禁 原因:" + model.BanInfo.BanReason + " 到期时间" + model.BanInfo.BanEndTime.ToDateTime().ToString("yyyy-MM-dd hh:mm")); + } + if (model.IsDelete) + throw new BusinessException("用户已被删除"); + return model; + } + public async Task GetUserByNuimber(string number) + { + + var model = await _userMongo.FindOneAsync(c => c.BaseInfo.Number == number); + if (model == null) + { + throw new BusinessException("用户不存在"); + } + if (model.BanInfo != null && model.BanInfo.IsBan) + { + if (model.BanInfo.BanDays > 0 && DateTime.Now.ToTimeStamp() > model.BanInfo.BanEndTime) + { + model.BanInfo.IsBan = false; + model.BanInfo.BanDays = 0; + model.BanInfo.BanEndTime = 0; + model.BanInfo.BanReason = ""; + model.BanInfo.BanTime = 0; + await _userMongo.ReplaceOneAsync(model); + return model; + } + + throw new BusinessException("用户已被封禁 原因:" + model.BanInfo.BanReason + " 到期时间" + model.BanInfo.BanEndTime.ToDateTime().ToString("yyyy-MM-dd hh:mm")); + } + if (model.IsDelete) + throw new BusinessException("用户已被删除"); + return model; + } + public async Task GetUserByOpenId(string openId) + { + var model = await _userMongo.FindOneAsync(c => c.BaseInfo.WXOpenId == openId); + if (model == null) + { + throw new BusinessException("用户不存在"); + } + if (model.BanInfo != null && model.BanInfo.IsBan) + { + if (model.BanInfo.BanDays > 0 && DateTime.Now.ToTimeStamp() > model.BanInfo.BanEndTime) + { + model.BanInfo.IsBan = false; + model.BanInfo.BanDays = 0; + model.BanInfo.BanEndTime = 0; + model.BanInfo.BanReason = ""; + model.BanInfo.BanTime = 0; + await _userMongo.ReplaceOneAsync(model); + return model; + } + + throw new BusinessException("用户已被封禁 原因:" + model.BanInfo.BanReason + " 到期时间" + model.BanInfo.BanEndTime.ToDateTime().ToString("yyyy-MM-dd hh:mm")); + } + if (model.IsDelete) + throw new BusinessException("用户已被删除"); + return model; + } + + public async Task<(bool isok, string msg)> UpdateUser(UserEntity user) + { + return await _userMongo.ReplaceOneAsync(user); + } + + public async Task GetRanking(LoginUser loginUser, int type = 1) + { + RankingResponse result = new RankingResponse(); + result.RankingType = type; + result.RankingTypeName = type switch + { + 1 => "金币排名", + 2 => "等级排名", + 3 => "今日消耗排名", + _ => "金币排名" + }; + + System.Linq.Expressions.Expression> sortField; + System.Linq.Expressions.Expression> countWhere; + Func rankingValue; + + switch (type) + { + case 2: + sortField = c => c.Assets.Level; + countWhere = c => !c.IsDelete && c.Assets.Level > 0; + rankingValue = c => c.Assets.Level; + break; + case 3: + sortField = c => c.Static.TotalConsumeGold; + countWhere = c => !c.IsDelete && c.Static.TotalConsumeGold > 0; + rankingValue = c => c.Static.TotalConsumeGold; + break; + default: + sortField = c => c.Assets.Gold; + countWhere = c => !c.IsDelete && c.Assets.Gold > 0; + rankingValue = c => c.Assets.Gold; + break; + } + + var list = await _userMongo.QueryPageAsync(countWhere, sortField, true, 500, 1); + int i = 0; + + foreach (var item in list.list.Take(50)) + { + i++; + result.UserList.Add(new RankingUserResponse() + { + AvatarUrl = item.BaseInfo.AvatarUrl, + NickName = item.BaseInfo.UserName, + Level = item.Assets.Level, + RankingValue = rankingValue(item), + Mobile = item.BaseInfo.Mobile, + Number = item.BaseInfo.Number, + UserId = item.Id, + UserName = item.BaseInfo.UserName, + Rank = i + }); + } + + var self = result.UserList.FirstOrDefault(c => c.UserId == loginUser.UserId); + if (self != null) + { + result.User = self; + } + else + { + var user = await GetUser(loginUser.UserId); + if (user != null) + { + var rank = type switch + { + 2 => await _userMongo.CountAsync(c => !c.IsDelete && c.Assets.Level > user.Assets.Level), + 3 => await _userMongo.CountAsync(c => !c.IsDelete && c.Static.TotalConsumeGold > user.Static.TotalConsumeGold), + _ => await _userMongo.CountAsync(c => !c.IsDelete && c.Assets.Gold > user.Assets.Gold) + }; + result.User = new RankingUserResponse() + { + AvatarUrl = user.BaseInfo.AvatarUrl, + NickName = user.BaseInfo.UserName, + Level = user.Assets.Level, + RankingValue = rankingValue(user), + Mobile = user.BaseInfo.Mobile, + Number = user.BaseInfo.Number, + UserId = user.Id, + UserName = user.BaseInfo.UserName, + Rank = (int)rank + 1 + }; + } + } + return result; + } + + + + public async Task<(List list, int count)> GetUserList(BaseListPageParam param) + { + var where = LinqExtensions.True().And(e => e.IsDelete == false); + if (!string.IsNullOrWhiteSpace(param.KeyWord)) + where = where.And(e => e.BaseInfo.UserName.Contains(param.KeyWord) || e.BaseInfo.Mobile.Contains(param.KeyWord) || e.BaseInfo.Number.Contains(param.KeyWord)); + + var result = await _userMongo.QueryPageAsync(where, c => c.CreateTime, true, param.PageSize ?? 0, param.PageIndex ?? 0); + + return (result.list, (int)result.count); + + } + + + + public async Task EveryDayTask() + { + var activityConfig = await _activityConfigService.Get(); + var reliefGoldCount = activityConfig?.ReliefConfig?.Count ?? 3; + + var updateBase = Builders.Update + .Set(p => p.Static.OnlineTime, 0) + .Set(p => p.Assets.IsVipDayGift, false) + .Set(p => p.Static.ReliefGoldCount, reliefGoldCount); + + await _userMongo.UpdateManyAsync(c => c.Sign != null, updateBase.Set(p => p.Sign.IsSign, false)); + await _userMongo.UpdateManyAsync(c => c.Sign == null, updateBase.Set(p => p.Sign, new SignInfo())); + + var gameConfig = _cache.GetGameConfig(); + _cache.SetSystemGoldDay(gameConfig.KillConfig.DaySystemGold); + + await CleanupExpiredEmails(); + + await CheckBattleOrderExpired(); + } + + private async Task CheckBattleOrderExpired() + { + var activityConfig = await _activityConfigService.Get(); + var battleOrderConfig = activityConfig?.BattleOrderConfig; + + if (battleOrderConfig == null || !battleOrderConfig.IsOpen) + return; + + var now = DateTime.Now.ToTimeStamp(); + + if (battleOrderConfig.EndTime > 0 && battleOrderConfig.EndTime < now) + { + await _userBattleOrderMongo.DeleteManyAsync(c => true); + + battleOrderConfig.IsOpen = false; + + await _activityConfigService.Update(activityConfig); + } + } + + public async Task EveryHourTask() + { + await Task.CompletedTask; + } + + + private const int MaxNumberRetryCount = 50; + + private async Task GetUserNumner() + { + for (int i = 0; i < MaxNumberRetryCount; i++) + { + var numner = RandomHelper.RandomNumbers(8); + var model = await _beadfulNumberMongo.FindOneAsync(c => c.Number == numner && c.Status != AdminDomain.BeautifulNumber.BeautifulNumberStatus.Normal); + if (model != null) + continue; + var user = _userMongo.FindOne(c => c.BaseInfo.Number == numner); + if (user != null) + continue; + return numner; + } + throw new BusinessException("无法生成唯一用户编号,请稍后重试"); + } + + + + public async Task<(bool isok, string msg)> SaveSafeBox(long gold, LoginUser loginUser) + { + if (gold <= 0) + return (false, "存入金额必须大于0"); + + var lockKey = $"user:safebox:{loginUser.UserId}"; + var lockResult = await _distributedLock.TryExecuteAsync(lockKey, async () => + { + var user = await GetUser(loginUser.UserId); + if (user.Assets.Gold < gold) + return (false, "金币不足"); + if (user.SafeBox == null) + user.SafeBox = new SafeBoxInfo(); + if (string.IsNullOrWhiteSpace(user.BaseInfo.Mobile)) + return (false, "请先绑定手机号"); + if (string.IsNullOrWhiteSpace(user.SafeBox.Password)) + return (false, "请先设置保险箱密码"); + user.Assets.Gold -= gold; + var userReward = new UserReward() { UserId = user.Id, ChangeCount = gold, BeforeCount = user.SafeBox.Amount, CurrencyType = 2, Remark = "存入保险箱", Source = RewardSource.保险箱, Type = 1 }; + user.SafeBox.Amount += gold; + userReward.AfterCount = user.SafeBox.Amount; + user.SafeBox.SaveTime = DateTime.Now.ToTimeStamp(); + await _rewardMongo.InsertOneAsync(userReward); + + return await _userMongo.ReplaceOneAsync(user); + }, expiry: 10, retry: false); + + return lockResult; + } + public async Task<(bool isok, string msg)> GetSafeBox(long gold, string password, LoginUser loginUser) + { + if (gold <= 0) + return (false, "取出金额必须大于0"); + + var lockKey = $"user:safebox:{loginUser.UserId}"; + var lockResult = await _distributedLock.TryExecuteAsync(lockKey, async () => + { + var user = await GetUser(loginUser.UserId); + if (user.SafeBox == null) + return (false, "用户保险箱不存在"); + if (string.IsNullOrWhiteSpace(password)) + return (false, "请输入密码"); + if (user.SafeBox.Amount < gold) + return (false, "金币不足"); + if (user.SafeBox.Password != Md5Helper.GetMD5(password)) + return (false, "密码错误"); + user.Assets.Gold += gold; + var userReward = new UserReward() { UserId = user.Id, ChangeCount = gold, BeforeCount = user.SafeBox.Amount, CurrencyType = 2, Remark = "取出保险箱", Source = RewardSource.保险箱, Type = 2 }; + user.SafeBox.Amount -= gold; + userReward.AfterCount = user.SafeBox.Amount; + await _rewardMongo.InsertOneAsync(userReward); + + return await _userMongo.ReplaceOneAsync(user); + }, expiry: 10, retry: false); + + return lockResult; + } + + public async Task<(bool isok, string msg)> SetSafeBoxPassword(string password, LoginUser loginUser) + { + if (string.IsNullOrWhiteSpace(password) || password.Length < 4 || password.Length > 6) + return (false, "密码长度应为4-6位"); + + var user = await GetUser(loginUser.UserId); + + if (user.SafeBox == null) + user.SafeBox = new SafeBoxInfo(); + if (string.IsNullOrWhiteSpace(user.BaseInfo.Mobile)) + return (false, "请先绑定手机号"); + if (!string.IsNullOrWhiteSpace(user.SafeBox.Password)) + return (false, "密码已设置,请先重置密码"); + user.SafeBox.Password = Md5Helper.GetMD5(password); + return await _userMongo.ReplaceOneAsync(user); + } + public async Task<(bool isok, string msg)> ResetSafeBoxPassword(string password, string code, LoginUser loginUser) + { + if (string.IsNullOrWhiteSpace(password) || password.Length < 4 || password.Length > 6) + return (false, "密码长度应为4-6位"); + + var user = await GetUser(loginUser.UserId); + if (user.SafeBox == null) + return (false, "用户保险箱不存在"); + if (string.IsNullOrWhiteSpace(password)) + return (false, "请输入密码"); + if (string.IsNullOrWhiteSpace(user.BaseInfo.Mobile)) + return (false, "请先绑定手机号"); + if (string.IsNullOrWhiteSpace(code)) + return (false, "请输入验证码"); + if (code != _cache.GetVerificationCode(user.BaseInfo.Mobile)) + return (false, "验证码错误"); + user.SafeBox.Password = Md5Helper.GetMD5(password); + return await _userMongo.ReplaceOneAsync(user); + } + public async Task<(bool isok, string msg)> GetReliefGold(LoginUser loginUser) + { + var user = await GetUser(loginUser.UserId); + var activityConfig = await _activityConfigService.Get(); + if (activityConfig.ReliefConfig.IsOpen == false) + return (false, "当前不能领取救济金"); + if (user.Assets.Gold > activityConfig.ReliefConfig.Limit) + return (false, "当前金币不满足领取救济金的条件"); + if (user.Static.ReliefGoldCount <= 0) + return (false, "今日已无领取次数"); + + user.Static.ReliefGoldCount--; + user.Assets.Gold += activityConfig.ReliefConfig.Gold; + + UserReward userReward = new UserReward() + { + UserId = user.Id, + ChangeCount = activityConfig.ReliefConfig.Gold, + CurrencyType = 1, + Remark = "领取救济金", + Source = RewardSource.救济金, + Type = 1, + BeforeCount = user.Assets.Gold - activityConfig.ReliefConfig.Gold, + AfterCount = user.Assets.Gold + }; + await _rewardMongo.InsertOneAsync(userReward); + + var update = Builders.Update + .Set(p => p.Assets, user.Assets) + .Set(p => p.Static, user.Static); + return await _userMongo.UpdateByIdAsync(user.Id, update); + } + + public async Task<(bool isok, string msg)> SendBroadcast(string message, LoginUser loginUser) + { + if (string.IsNullOrWhiteSpace(message)) + return (false, "消息不能为空"); + + if (message.Length > 20) + return (false, "消息不能超过20个字"); + + if (BlockWordHelper.IsHaveBlockWord(message)) + return (false, "消息包含敏感词"); + + var user = await GetUser(loginUser.UserId); + var prop = user.Props?.FirstOrDefault(p => p.Number == "40002"); + if (prop == null || prop.Count <= 0) + return (false, "大喇叭数量不足"); + + prop.Count--; + if (prop.Count <= 0) + user.Props.Remove(prop); + + var update = Builders.Update.Set(p => p.Props, user.Props); + await _userMongo.UpdateByIdAsync(user.Id, update); + + var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + await _hubContext.Clients.All.SendAsync("Broadcast", new + { + UserName = user.BaseInfo.UserName, + AvatarUrl = user.BaseInfo.AvatarUrl, + Level = user.Assets.Level, + VipLevel = user.Assets.VipLevel, + Message = message, + Time = now + }); + + return (true, "发送成功"); + } + + public async Task SendKillAnnouncement(KillAnnounceParam param) + { + + var text = $"恭喜玩家{param.UserName}在{param.GameTypeName}{param.RoomName}捕获 {param.FishName}*{param.Multiple}炮倍 {param.Gold}大奖"; + + await _hubContext.Clients.All.SendAsync("KillAnnouncement", new + { + Text = text, + UserName = param.UserName, + GameTypeName = param.GameTypeName, + RoomName = param.RoomName, + FishName = param.FishName, + Multiple = param.Multiple, + Gold = param.Gold, + Time = param.Timestamp + }); + } + + public async Task<(bool isok, string msg, BaseProductCount model)> SyntheticFragments(string propNumber, LoginUser loginUser) + { + var user = await GetUser(loginUser.UserId); + if (user.Props == null) + throw new BusinessException("用户背包不存在"); + var propFragment = user.Props.Find(c => c.Number == propNumber); + if (propFragment == null) + throw new BusinessException("道具不存在"); + + var gameConfig = _cache.GetGameConfig(); + var propFragmentConfig = gameConfig.PropFragments.Find(c => c.Number == propNumber); + if (propFragmentConfig == null) + throw new BusinessException("道具配置不存在"); + + if (propFragment.Count < propFragmentConfig.FragmentCount) + throw new BusinessException("碎片数量不足合成"); + int count = propFragment.Count / propFragmentConfig.FragmentCount; + if (propFragment.Count == count * propFragmentConfig.FragmentCount) + user.Props.Remove(propFragment); + else + propFragment.Count -= count * 10; + var propConfig = gameConfig.PropConfig.FirstOrDefault(c => c.Number == propFragmentConfig.ProductNumber); + if (propConfig == null) + throw new BusinessException("合成后道具配置不存在"); + var prop = user.Props.Find(c => c.Number == propFragmentConfig.ProductNumber); + BaseProduct result = propConfig; + if (prop == null) + { + result = propConfig; + prop = _mapper.Map(result); + prop.Count = count; + if (prop.Count > 0) + user.Props.Add(prop); + } + else + { + if (!ProductType.MoreProductTypeList.Any(c => c == prop.Type)) + throw new BusinessException("已有此道具"); + prop.Count += count; + } + await _userMongo.ReplaceOneAsync(user); + + prop.Count = count; + return (true, "合成成功", prop); + + } + + + + public async Task<(bool isok, string msg)> BuyProps(string propNumber, int count, LoginUser loginUser) + { + if (string.IsNullOrWhiteSpace(propNumber)) + throw new BusinessException("道具编号不能为空"); + if (count <= 0 || count > 999) + throw new BusinessException("购买数量无效"); + + var user = await GetUser(loginUser.UserId); + if (user.Props == null) + user.Props = new List(); + var gameConfig = _cache.GetGameConfig(); + var propConfig = gameConfig.PropConfig.Find(c => c.Number == propNumber); + if (propConfig == null) + throw new BusinessException("道具配置不存在"); + if (!propConfig.IsSale) + throw new BusinessException("该道具暂未开放购买"); + if (propConfig.Price <= 0) + throw new BusinessException("道具价格异常"); + var price = propConfig.Price; + if (user.UserType == 2 || user.Assets.IsDealer) + price = propConfig.DealerPrice > 0 ? propConfig.DealerPrice : propConfig.Price; + else if (user.Assets.VipLevel > 0) + price = propConfig.VIPPrice > 0 ? propConfig.VIPPrice : propConfig.Price; + + var totalPrice = price * count; + if (user.Assets.Gold < totalPrice) + throw new BusinessException("金币不足"); + UserReward userReward = new UserReward() { UserId = user.Id, ChangeCount = totalPrice, CurrencyType = 1, Remark = $"购买道具 x{count}", Source = RewardSource.道具, Type = 2, BeforeCount = user.Assets.Gold }; + + user.Static.TotalConsumeGold += totalPrice; + user.Assets.Gold -= totalPrice; + + if (!ProductType.MoreProductTypeList.Any(c => c == propConfig.Type)) + { + if (propConfig.Type == ProductTypeEnum.炮台) + { + var prop = user.CannonList.Find(c => c.Number == propNumber); + if (prop != null) + throw new BusinessException("已有此炮台"); + var cannon = _mapper.Map(propConfig); + if (propConfig.Day > 0) + { + cannon.IsTrial = true; + cannon.TrialEndTime = DateTime.Now.AddDays(propConfig.Day).ToTimeStamp(); + } + user.CannonList.Add(cannon); + } + + if (propConfig.Type == ProductTypeEnum.翅膀) + { + var prop = user.WingList.Find(c => c.Number == propNumber); + if (prop != null) + throw new BusinessException("已有此翅膀"); + var cannon = _mapper.Map(propConfig); + if (propConfig.Day > 0) + { + cannon.IsTrial = true; + cannon.TrialEndTime = DateTime.Now.AddDays(propConfig.Day).ToTimeStamp(); + } + user.WingList.Add(cannon); + } + + if (propConfig.Type == ProductTypeEnum.战神) + { + var prop = user.GodWarList.Find(c => c.Number == propNumber); + if (prop != null) + throw new BusinessException("已有此战神"); + var cannon = _mapper.Map(propConfig); + if (propConfig.Day > 0) + { + cannon.IsTrial = true; + cannon.TrialEndTime = DateTime.Now.AddDays(propConfig.Day).ToTimeStamp(); + } + user.GodWarList.Add(cannon); + } + + } + else + { + var prop = user.Props.Find(c => c.Number == propNumber); + if (prop != null) + { + prop.Count += propConfig.SaleCount * count; + } + else + { + var result = propConfig; + prop = _mapper.Map(result); + prop.Count = propConfig.SaleCount * count; + if (prop.Count > 0) + user.Props.Add(prop); + } + } + + await _rewardMongo.InsertOneAsync(userReward); + return await _userMongo.ReplaceOneAsync(user); + } + + public async Task<(bool isok, string msg)> UseVipExp(int count, LoginUser loginUser) + { + if (count <= 0 || count > 999) + return (false, "数量无效"); + + var user = await GetUser(loginUser.UserId); + if (user.Props == null || user.Props.Count == 0) + return (false, "背包中没有VIP经验包"); + + var prop = user.Props.Find(c => c.Type == ProductTypeEnum.VipExp); + if (prop == null || prop.Count < count) + return (false, "VIP经验包数量不足"); + + prop.Count -= count; + if (prop.Count <= 0) + user.Props.Remove(prop); + + user.Assets.VipExpExtra += 100L * count; + var gameConfig = _cache.GetGameConfig(); + if (gameConfig != null) + { + var newVipLevels = user.VipLevelVerify(gameConfig); + if (newVipLevels != null && newVipLevels.Count > 0) + await AutoDistributeVipGift(user, newVipLevels, gameConfig); + } + + await _userMongo.ReplaceOneAsync(user); + return (true, "使用成功"); + } + + public async Task<(bool isok, string msg)> BuyGold(string number, int count, LoginUser loginUser) + { + if (string.IsNullOrWhiteSpace(number)) + throw new BusinessException("金币商品编号不能为空"); + if (count <= 0 || count > 999) + throw new BusinessException("购买数量无效"); + + var activityConfig = await _activityConfigService.Get(); + var config = activityConfig.GoldShopConfigs.FirstOrDefault(c => c.Number == number); + if (config == null) + throw new BusinessException("金币配置不存在"); + + var lockKey = $"user:asset:update:{loginUser.UserId}"; + return await _distributedLock.TryExecuteAsync(lockKey, async () => + { + var user = await GetUser(loginUser.UserId); + var diamondPrice = config.Diamond; + if (user.UserType == 2 || user.Assets.IsDealer) + diamondPrice = config.DealerDiamond > 0 ? config.DealerDiamond : config.Diamond; + if (diamondPrice <= 0) + throw new BusinessException("金币商品钻石价格配置无效"); + + var totalDiamond = checked(diamondPrice * count); + var totalGold = checked(config.Gold * count); + if (totalGold <= 0) + throw new BusinessException("金币商品数量配置无效"); + if (user.Assets.Diamond < totalDiamond) + throw new BusinessException("钻石不足"); + + var beforeDiamond = user.Assets.Diamond; + var beforeGold = user.Assets.Gold; + user.Assets.Diamond -= totalDiamond; + user.Assets.Gold += totalGold; + user.Static.TotalConsumeDiamond += totalDiamond; + user.Static.TotalRechargeGold += totalGold; + + var updateDefinition = Builders.Update + .Set(p => p.Assets, user.Assets) + .Set(p => p.Static, user.Static); + var updateResult = await _userMongo.UpdateByIdAsync(user.Id, updateDefinition); + if (!updateResult.ok) + return (false, updateResult.message); + + try + { + await _rewardMongo.InsertOneAsync(new UserReward + { + UserId = user.Id, + ChangeCount = totalDiamond, + CurrencyType = 3, + Remark = $"购买金币 x{count}", + Source = RewardSource.金币商城, + Type = 2, + BeforeCount = beforeDiamond, + AfterCount = user.Assets.Diamond + }); + await _rewardMongo.InsertOneAsync(new UserReward + { + UserId = user.Id, + ChangeCount = totalGold, + CurrencyType = 1, + Remark = $"购买金币 x{count}", + Source = RewardSource.金币商城, + Type = 1, + BeforeCount = beforeGold, + AfterCount = user.Assets.Gold + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "[金币商城] 资产已更新但流水写入失败 userId={UserId} number={Number} count={Count}", + user.Id, number, count); + } + + try + { + await Task.WhenAll( + _capPublisher.PublishAsync(TopicKeys.用户资产同步前端, new UserAssetSyncParam + { + UserId = user.Id, + CurrencyType = 3, + ChangeType = (int)UserAssetChangeTypeEnum.减少, + Amount = totalDiamond, + NewGold = user.Assets.Gold, + NewDiamond = user.Assets.Diamond, + Source = RewardSource.金币商城.ToString(), + Remark = $"购买金币 x{count}" + }), + _capPublisher.PublishAsync(TopicKeys.用户资产同步前端, new UserAssetSyncParam + { + UserId = user.Id, + CurrencyType = 1, + ChangeType = (int)UserAssetChangeTypeEnum.增加, + Amount = totalGold, + NewGold = user.Assets.Gold, + NewDiamond = user.Assets.Diamond, + Source = RewardSource.金币商城.ToString(), + Remark = $"购买金币 x{count}" + })); + } + catch (Exception ex) + { + _logger.LogError(ex, "[金币商城] 资产实时同步失败 userId={UserId} number={Number} count={Count} newGold={Gold} newDiamond={Diamond}", + user.Id, number, count, user.Assets.Gold, user.Assets.Diamond); + } + + + return (true, updateResult.message); + }, expiry: 10, retry: true, retryDelay: 100); + } + + + public async Task<(bool isok, string msg, string url)> BuyDiamond(string number, int count, LoginUser loginUser) + { + if (string.IsNullOrWhiteSpace(number)) + throw new BusinessException("钻石商品编号不能为空"); + if (count <= 0 || count > 999) + throw new BusinessException("购买数量无效"); + + var user = await GetUser(loginUser.UserId); + + var activityConfig = await _activityConfigService.Get(); + var config = activityConfig.DiamondShopConfigs.FirstOrDefault(c => c.Number == number); + if (config == null) + throw new BusinessException("钻石配置不存在"); + + var price = config.Money; + if (user.UserType == 2 || user.Assets.IsDealer) + price = config.DealerMoney > 0 ? config.DealerMoney : config.Money; + var totalPrice = price * count; + var order = new Order(); + order.Type = 2; + order.ProductId = config.Number; + order.ProductName = config.Name + $" x{count}"; + order.UserId = loginUser.UserId; + order.State = 1; + order.Price = totalPrice; + await _orderMongo.InsertOneAsync(order); + + BuyDiamondPayCallBack(order.Id); + + return (true, "购买成功", ""); + + } + + public async Task<(bool isok, string msg)> BuyDiamondPayCallBack(string orderId) + { + var order = await _orderMongo.FindOneAsync(c => c.Id == orderId); + if (order == null) + throw new BusinessException("订单不存在"); + if (order.State != 1) + throw new BusinessException("订单状态不对"); + + var gameconfig = _cache.GetGameConfig(); + var activityConfig = await _activityConfigService.Get(); + + var config = activityConfig.DiamondShopConfigs.FirstOrDefault(c => c.Number == order.ProductId); + if (config == null) + throw new BusinessException("钻石配置不存在"); + + await UpdateAssets(new UserAssetParam() + { + UserId = order.UserId, + ChangeType = UserAssetChangeTypeEnum.增加, + Diamond = config.Diamond, + Remark = $"购买钻石-{order.ProductName}", + Source = RewardSource.充值 + }); + + order.State = 2; + order.PayTime = DateTime.Now.ToTimeStamp(); + await _orderMongo.ReplaceOneAsync(order); + var user = await GetUser(order.UserId); + user.Static.TotalRecharge += order.Price; + var newVipLevels = user.VipLevelVerify(gameconfig); + if (newVipLevels != null && newVipLevels.Count > 0) + { + await AutoDistributeVipGift(user, newVipLevels, gameconfig); + } + + await _userMongo.ReplaceOneAsync(user); + if (activityConfig.BattleOrderConfig.IsOpen) + { + + _capPublisher.PublishAsync(TopicKeys.任务完成, new CompletedTaskParam() { taskEvent = TaskEvent.充值任务, userId = user.Id, count = order.Price }); + } + + return (true, "购买成功"); + } + + + public async Task<(bool isok, string msg, long gold)> Sign(LoginUser loginUser) + { + var user = await GetUser(loginUser.UserId); + + // if (user.Assets.VipLevel == 0) + + // if (user.Sign.IsSign) + var activityConfig = await _activityConfigService.Get(); + + var signList = activityConfig.SignConfigs; + if (signList.Count == 0) + throw new BusinessException("签到配置不存在"); + + var sign = GetRandomSignConfig(activityConfig); + + var gold = Convert.ToInt64(sign.Gold * (1 + user.Assets.VipSignInAdd)); + + user.Sign.IsSign = true; + user.Sign.SignTime = DateTime.Now.ToTimeStamp(); + + + UserReward userReward = new UserReward() { UserId = user.Id, ChangeCount = gold, CurrencyType = 1, Remark = "签到获取金币", Source = RewardSource.签到, Type = 1, BeforeCount = user.Assets.Gold }; + user.Assets.Gold += gold; + userReward.AfterCount = user.Assets.Gold; + await _rewardMongo.InsertOneAsync(userReward); + + await _userMongo.ReplaceOneAsync(user); + + return (true, "签到成功", gold); + + } + + + public async Task<(bool isok, string msg)> ChangeCannon(string number, LoginUser loginUser) + { + + var user = await GetUser(loginUser.UserId); + var connon = user.CannonList.Find(c => c.Number == number); + if (connon == null) + throw new BusinessException("未找到该炮台"); + user.CannonUsing = connon; + return await _userMongo.ReplaceOneAsync(user); + + } + + + + public async Task<(bool isok, string msg)> ChangeWing(string number, LoginUser loginUser) + { + var user = await GetUser(loginUser.UserId); + var connon = user.WingList.Find(c => c.Number == number); + if (connon == null) + throw new BusinessException("未找到该翅膀"); + user.WingUsing = connon; + return await _userMongo.ReplaceOneAsync(user); + } + + public async Task<(bool isok, string msg)> ChangeGodWar(string number, LoginUser loginUser) + { + var user = await GetUser(loginUser.UserId); + var connon = user.GodWarList.Find(c => c.Number == number); + if (connon == null) + throw new BusinessException("未找到该战神"); + user.GodWarUsing = connon; + return await _userMongo.ReplaceOneAsync(user); + } + + public async Task<(bool isok, string msg)> UnloadCannon(string number, LoginUser loginUser) + { + var user = await GetUser(loginUser.UserId); + if (user.CannonUsing?.Number != number) + throw new BusinessException("当前未使用该炮台"); + user.CannonList ??= new List(); + const string defaultCannonNumber = "11001"; + var defaultCannon = user.CannonList.FirstOrDefault(c => c.Number == defaultCannonNumber); + if (defaultCannon == null) + { + var defaultCannonConfig = _cache.GetGameConfig()?.PropConfig? + .FirstOrDefault(c => c.Number == defaultCannonNumber && c.Type == ProductTypeEnum.炮台); + + defaultCannon = defaultCannonConfig == null + ? new BaseUserProp + { + Number = defaultCannonNumber, + Name = "深海之眼", + Desc = "深海之眼", + ImageUrl = "/uploads/11001.png", + Type = ProductTypeEnum.炮台 + } + : _mapper.Map(defaultCannonConfig); + + user.CannonList.Add(defaultCannon); + } + user.CannonUsing = defaultCannon; + return await _userMongo.ReplaceOneAsync(user); + } + + public async Task<(bool isok, string msg)> UnloadWing(string number, LoginUser loginUser) + { + var user = await GetUser(loginUser.UserId); + if (user.WingUsing?.Number != number) + throw new BusinessException("当前未使用该翅膀"); + user.WingUsing = null; + return await _userMongo.ReplaceOneAsync(user); + } + + public async Task<(bool isok, string msg)> UnloadGodWar(string number, LoginUser loginUser) + { + var user = await GetUser(loginUser.UserId); + if (user.GodWarUsing?.Number != number) + throw new BusinessException("当前未使用该战神"); + user.GodWarUsing = null; + return await _userMongo.ReplaceOneAsync(user); + } + + + + public async Task<(bool isok, string msg, GiftResponse model)> GetVipDayGift(LoginUser loginUser) + { + var user = await GetUser(loginUser.UserId); + if (user.Assets.VipLevel == 0) + throw new BusinessException("非VIP无法领取"); + if (user.Assets.IsVipDayGift == true) + throw new BusinessException("今天已经领取过了"); + + var gameConfig = _cache.GetGameConfig(); + var vipConfig = gameConfig.VipLevelConfigs.Find(c => c.Level == user.Assets.VipLevel); + if (vipConfig == null) + throw new BusinessException("Vip配置不存在"); + if (vipConfig.DailyGift == null || vipConfig.DailyGift.Count == 0) + throw new BusinessException("Vip每日礼包配置不存在"); + + var result = GetGift(vipConfig.DailyGift); + user.Assets.IsVipDayGift = true; + await _userMongo.ReplaceOneAsync(user); + + var res = await UpdateAssets(new UserAssetParam() { ChangeType = UserAssetChangeTypeEnum.增加, Gold = result.Gold, Diamond = result.Diamond, UserId = user.Id, Remark = "Vip每日礼包", Source = RewardSource.Vip每日礼包, RewardItems = result.Product }); + if (res.isok) + return (true, "领取成功", result); + else + return (false, res.msg, null); + } + + public async Task<(bool isok, string msg, GiftResponse model)> GetVipGift(int vipLevel, LoginUser loginUser) + { + var user = await GetUser(loginUser.UserId); + if (user.Assets.VipLevel == 0) + throw new BusinessException("非VIP无法领取"); + if (user.Assets.VipGift == null || user.Assets.VipGift.Count == 0) + throw new BusinessException("没有需要领取的礼包"); + if (!user.Assets.VipGift.Any(c => c == vipLevel)) + throw new BusinessException("没有需要领取的礼包"); + var level = user.Assets.VipGift.FirstOrDefault(c => c == vipLevel); + var gameConfig = _cache.GetGameConfig(); + var vipConfig = gameConfig.VipLevelConfigs.Find(c => c.Level == vipLevel); + if (vipConfig == null) + throw new BusinessException("Vip配置不存在"); + if (vipConfig.GiftList == null || vipConfig.GiftList.Count == 0) + throw new BusinessException("Vip权益礼包配置不存在"); + + var result = GetGift(vipConfig.GiftList); + user.Assets.VipGift.Remove(level); + await _userMongo.ReplaceOneAsync(user); + + + var res = await UpdateAssets(new UserAssetParam() { ChangeType = UserAssetChangeTypeEnum.增加, Gold = result.Gold, Diamond = result.Diamond, UserId = user.Id, Remark = "Vip权益礼包", Source = RewardSource.Vip权益礼包, RewardItems = result.Product }); + if (res.isok) + return (true, "领取成功", result); + else + return (false, res.msg, null); + } + + + + + + + public async Task<(List list, int count)> GetUserRewardList(GetUserRewardListParam param) + { + var where = LinqExtensions.True().And(e => e.IsDelete == false); + if (!string.IsNullOrWhiteSpace(param.UserId)) + where = where.And(e => e.UserId == param.UserId); + if (param.Type != 0) + where = where.And(e => e.Type == param.Type); + + if (param.Source >0) + where = where.And(e => (int)e.Source == param.Source); + if (param.CurrencyType != 0) + where = where.And(e => e.CurrencyType == param.CurrencyType); + + var result = await _rewardMongo.QueryPageAsync(where, c => c.CreateTime, true, param.PageSize ?? 0, param.PageIndex ?? 0); + + return (result.list, (int)result.count); + } + + + + public async Task GameCoinsSettlement(GameCoinsSettlementParam param) + { + var session = _cache.GetRedisUserCId(param.UserId); + var currentRoom = !string.IsNullOrWhiteSpace(session?.RoomId) + ? _cache.GetGameRoom(session.RoomId) + : null; + var currentPlayer = currentRoom?.Players?.FirstOrDefault(p => p.UserId == param.UserId && !p.IsBot); + if (session?.RoomId != param.RoomInfo + || currentPlayer == null + || (param.RoomSessionId > 0 && currentPlayer.BeginTime != param.RoomSessionId)) + { + + return currentPlayer?.Gold ?? param.AfterGold; + } + + var lockKey = $"user:asset:update:{param.UserId}"; + var settled = await _distributedLock.TryExecuteAsync(lockKey, async () => + { + var user = await GetUser(param.UserId); + if (user == null) + { + return param.AfterGold; + } + long netChange = param.AfterGold - param.BeforeGold; + long beforeGold = user.Assets.Gold; + long newGold = Math.Max(0, user.Assets.Gold + netChange); + user.Assets.Gold = newGold; + var type = netChange >= 0 ? 1 : 2; + var changeCount = Math.Abs(netChange); + + + + var model = new UserReward() { UserId = param.UserId, BeforeCount = beforeGold, Source = RewardSource.游戏金币结算, Remark = "游戏金币结算", ChangeCount = changeCount, Type = type, CurrencyType = 1, RoomName = param.RoomName, RoomInfo = param.RoomInfo, AfterCount = newGold }; + await _rewardMongo.InsertOneAsync(model); + + var updateDefinition = Builders.Update.Set(p => p.Assets, user.Assets); + await _userMongo.UpdateByIdAsync(user.Id, updateDefinition); + + try + { + await _capPublisher.PublishAsync(TopicKeys.用户资产同步前端, new UserAssetSyncParam + { + UserId = param.UserId, + CurrencyType = 1, + ChangeType = type, + Amount = changeCount, + NewGold = newGold, + NewDiamond = user.Assets.Diamond, + Source = "游戏金币结算", + Remark = param.RoomName + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "游戏金币结算后发布资产更新失败 userId={UserId}", param.UserId); + } + return newGold; + }, expiry: 10, retry: true, retryDelay: 100); + + return settled; + } + + + private async Task HandleLoginRoomSettlementAsync(string userId) + { + try + { + var userRedis = _cache.GetRedisUserCId(userId); + var roomId = userRedis?.RoomId; + + if (string.IsNullOrWhiteSpace(roomId)) + roomId = _cache.GetPendingFishRoomId(userId); + + if (string.IsNullOrWhiteSpace(roomId)) + return; + + + + var room = _cache.GetGameRoom(roomId); + if (room == null) + { + + if (userRedis != null) + { + userRedis.RoomId = ""; + userRedis.CId = ""; + _cache.SetRedisUserCId(userRedis); + } + return; + } + + var player = room.Players?.FirstOrDefault(p => p.UserId == userId && !p.IsBot); + if (player == null) + { + + if (userRedis != null) + { + userRedis.RoomId = ""; + userRedis.CId = ""; + _cache.SetRedisUserCId(userRedis); + } + return; + } + + + + await GameCoinsSettlement(new GameCoinsSettlementParam + { + UserId = userId, + BeforeGold = player.BeginCoin, + AfterGold = player.Gold, + RoomSessionId = player.BeginTime, + RoomInfo = roomId, + RoomName = $"{room.GameType}-{room.RoomName}" + }); + + room.Players.Remove(player); + _cache.SetGameRoom(room); + if (userRedis != null) + { + userRedis.RoomId = ""; + userRedis.CId = ""; + _cache.SetRedisUserCId(userRedis); + } + + + } + catch (Exception ex) + { + _logger.LogError(ex, "[登录结算] 处理失败 userId={UserId}", userId); + } + } + + public async Task<(bool isok, string msg)> SendEmail(SendEmailParam param, LoginUser loginUser) + { + const int MAX_EMAIL_COUNT = 200; + const int EMAIL_EXPIRE_DAYS = 30; + var now = DateTime.Now.ToTimeStamp(); + + List ids = new List(); + if (string.IsNullOrWhiteSpace(param.UserId)) + { + + ids = (await _userMongo.FilterByAsync(c => (c.BanInfo == null || c.BanInfo.IsBan == false) && c.IsDelete == false)).Select(c => c.Id).ToList(); + } + else + { + ids = (await _userMongo.FilterByAsync(c => (c.BanInfo == null || c.BanInfo.IsBan == false) && c.IsDelete == false && param.UserId.Contains(c.BaseInfo.Number))).Select(c => c.Id).ToList(); + + } + List emails = new List(); + foreach (var id in ids) + { + var userEmails = await _emailMongo.FilterByAsync(c => c.UserId == id); + if (userEmails != null && userEmails.Count >= MAX_EMAIL_COUNT) + { + var sorted = userEmails.OrderBy(c => c.SendTime).ToList(); + var deleteCount = userEmails.Count - MAX_EMAIL_COUNT + 1; + for (int i = 0; i < deleteCount; i++) + { + await _emailMongo.DeleteByIdAsync(sorted[i].Id); + } + } + + var expiredEmails = userEmails?.Where(c => c.ExpireTime > 0 && c.ExpireTime < now).ToList(); + if (expiredEmails != null) + { + foreach (var exp in expiredEmails) + { + await _emailMongo.DeleteByIdAsync(exp.Id); + } + } + + var email = new UserEmail(); + + email.UserId = id; + + email.Title = param.Title; + email.Content = param.Content; + email.SendTime = DateTime.Now.ToTimeStamp(); + email.RewardDiamond = param.RewardDiamond; + email.RewardGold = param.RewardGold; + email.RewardItems = param.RewardItems; + email.IsReward = true; + if (email.RewardGold > 0 || email.RewardDiamond > 0 || (email.RewardItems != null && email.RewardItems.Count > 0)) + { + email.IsReward = false; + } + email.CreateInfo = new OptionUserInfo(loginUser.UserId,loginUser.UserName); + email.ExpireTime = DateTime.Now.AddDays(EMAIL_EXPIRE_DAYS).ToTimeStamp(); + emails.Add(email); + + + } + + var res = await _emailMongo.InsertManyAsync(emails); + + return (true, "发送成功"); + } + + public async Task CleanupExpiredEmails() + { + const int MAX_EMAIL_COUNT = 200; + const int EMAIL_EXPIRE_DAYS = 30; + var now = DateTime.Now.ToTimeStamp(); + var expireTime = DateTime.Now.AddDays(-EMAIL_EXPIRE_DAYS).ToTimeStamp(); + + var users = await _userMongo.FilterByAsync(c => c.IsDelete == false); + + foreach (var user in users) + { + var emails = await _emailMongo.FilterByAsync(c => c.UserId == user.Id); + if (emails == null || emails.Count == 0) continue; + + var sortedEmails = emails.OrderByDescending(c => c.SendTime).ToList(); + + if (sortedEmails.Count > MAX_EMAIL_COUNT) + { + var deleteIds = sortedEmails.Skip(MAX_EMAIL_COUNT).Select(c => c.Id).ToList(); + foreach (var deleteId in deleteIds) + { + await _emailMongo.DeleteByIdAsync(deleteId); + } + } + + var expiredEmails = emails.Where(c => c.SendTime < expireTime || (c.ExpireTime > 0 && c.ExpireTime < now)).ToList(); + foreach (var expiredEmail in expiredEmails) + { + await _emailMongo.DeleteByIdAsync(expiredEmail.Id); + } + } + } + public async Task GetEmail(string id, LoginUser loginUser) + { + var email = await _emailMongo.FindByIdAsync(id); + if (email == null) return null; + if (email.UserId != loginUser.UserId) + return null; + if (!email.IsRead) + { + email.ReadTime = DateTime.Now.ToTimeStamp(); + email.IsRead = true; + + await _emailMongo.ReplaceOneAsync(email); + + + } + EnrichEmailItems(email); + return email; + } + + public async Task<(bool isok, string msg, RewardEmailResponse model)> RewardEmail(int type, string id, LoginUser loginUser) + { + if (type == 1) + { + var email = await _emailMongo.FindByIdAsync(id); + if (email == null) throw new BusinessException("邮件不存在"); + if (email.UserId != loginUser.UserId) + throw new BusinessException("邮件不存在"); + if (email.IsReward) + throw new BusinessException("邮件已领取" ); + + if (email.RewardGold > 0 || email.RewardDiamond > 0 || (email.RewardItems != null && email.RewardItems.Count > 0)) + { + var updateResult = await UpdateAssets(new UserAssetParam() { Diamond = email.RewardDiamond, Gold = email.RewardGold, UserId = email.UserId, ChangeType = UserAssetChangeTypeEnum.增加, RewardItems = email.RewardItems, Source = RewardSource.邮件, Remark = "领取邮件奖励" }); + if (!updateResult.isok) + throw new BusinessException(updateResult.msg); + + email.IsReward = true; + email.IsRead = true; + email.ReadTime = DateTime.Now.ToTimeStamp(); + await _emailMongo.ReplaceOneAsync(email); + return (true, "领取成功", new RewardEmailResponse { RewardGold = email.RewardGold, RewardDiamond = email.RewardDiamond, RewardItems = email.RewardItems }); + } + else + { + email.IsReward = true; + await _emailMongo.ReplaceOneAsync(email); + return (true, "无需领取",null); + } + } + else + { + var emails = await _emailMongo.FilterByAsync(c => c.UserId == loginUser.UserId && !c.IsReward); + if (emails == null || emails.Count() == 0) + return (true, "无需领取", null); + long RewardGold = 0; + int RewardDiamond = 0; + Dictionary RewardItems = new Dictionary(); + foreach (var email in emails) + { + RewardGold += email.RewardGold; + RewardDiamond += email.RewardDiamond; + if (email.RewardItems != null) + { + foreach (var item in email.RewardItems) + { + if (RewardItems.TryGetValue(item.Number, out var existing)) + existing.Count += item.Count; + else + RewardItems[item.Number] = item; + } + } + if (email.RewardGold > 0 || email.RewardDiamond > 0 || (email.RewardItems != null && email.RewardItems.Count > 0)) + { + var updateResult = await UpdateAssets(new UserAssetParam() { Diamond = email.RewardDiamond, Gold = email.RewardGold, UserId = email.UserId, ChangeType = UserAssetChangeTypeEnum.增加, RewardItems = email.RewardItems, Source = RewardSource.邮件, Remark = "领取邮件奖励" }); + if (!updateResult.isok) + throw new BusinessException(updateResult.msg); + } + email.ReadTime = DateTime.Now.ToTimeStamp(); + email.IsRead = true; + email.IsReward = true; + await _emailMongo.ReplaceOneAsync(email); + } + return (true, "领取成功",new RewardEmailResponse { RewardGold = RewardGold, RewardDiamond = RewardDiamond, RewardItems = RewardItems.Values.ToList() }); + } + } + public async Task<(bool isok, string msg)> DeleteEmail(int type, string id, LoginUser loginUser) + { + if (type == 1) + return await _emailMongo.DeleteByIdAsync(id); + + return await _emailMongo.DeleteManyAsync(c => c.UserId == loginUser.UserId && c.IsRead && c.IsReward); + } + + public async Task<(bool isok, string msg)> ReadEmailMore(LoginUser loginUser) + { + var emails = await _emailMongo.FilterByAsync(c => c.UserId == loginUser.UserId && !c.IsRead); + if (emails == null || emails.Count() == 0) + return (true, "无未读取的邮件"); + foreach (var email in emails) + { + email.ReadTime = DateTime.Now.ToTimeStamp(); + email.IsRead = true; + await _emailMongo.ReplaceOneAsync(email); + } + return (true, "读取成功"); + } + + + public async Task GetEmail(string id) + { + var email = await _emailMongo.FindByIdAsync(id); + if (email != null) EnrichEmailItems(email); + return email; + } + public async Task GetNoReadCount(LoginUser loginUser) + { + return await _emailMongo.CountAsync(c => c.UserId == loginUser.UserId && !c.IsRead); + } + + public async Task<(List list, long count)> GetEmailByPage(GetEmailPageParam param, LoginUser loginUser) + { + var where = LinqExtensions.True().And(e => e.IsDelete == false); + + if (loginUser != null && !string.IsNullOrEmpty(loginUser.UserId)) + where = where.And(e => e.UserId == loginUser.UserId); + + if (param.ReadStatus > 0) + { + where = where.And(e => e.IsRead == (param.ReadStatus == 1)); + } + + var result = await _emailMongo.QueryPageAsync(where, c => c.SendTime, true, param.PageSize ?? 0, param.PageIndex ?? 0); + + foreach (var email in result.list) + EnrichEmailItems(email); + + return (result.list, result.count); + } + + + private void EnrichEmailItems(UserEmail email) + { + if (email?.RewardItems == null || email.RewardItems.Count == 0) return; + try + { + var gameConfig = _cache.GetGameConfig(); + if (gameConfig?.PropConfig == null) return; + + foreach (var item in email.RewardItems) + { + if (!string.IsNullOrEmpty(item.ImageUrl)) continue; + var prop = gameConfig.PropConfig.FirstOrDefault(p => p.Number == item.Number); + if (prop == null) continue; + item.Name = prop.Name; + item.ImageUrl = prop.ImageUrl; + item.Desc = prop.Desc; + item.Type = prop.Type; + item.Level = prop.Level; + } + } + catch (Exception ex) + { + _logger.LogError(ex, "补全邮件奖励道具信息失败 emailId={EmailId}", email?.Id); + } + } + + + public async Task<(bool isok, string msg)> UpdateAssets(UserAssetParam param) + { + + + var lockKey = $"user:asset:update:{param.UserId}"; + var result = await _distributedLock.TryExecuteAsync(lockKey, async () => + { + var user = await GetUser(param.UserId); + if (user == null) throw new BusinessException("用户不存在"); + + var gameconfig = _cache.GetGameConfig(); + + if (param.ChangeType == UserAssetChangeTypeEnum.增加) + { + if (param.Diamond > 0) + { + + var model = new UserReward() { UserId = param.UserId, BeforeCount = user.Assets.Diamond, Source = param.Source, Remark = param.Remark, ChangeCount = param.Diamond, Type = 1, CurrencyType = 3, RoomName = param.RoomName, RoomInfo = param.RoomInfo, Tax = param.Tax, OtherId = param.OtherId, OtherUserId = param.OtherUserId }; + + user.Assets.Diamond += param.Diamond; + model.AfterCount = user.Assets.Diamond; + if(param.IsAddRecord) + await _rewardMongo.InsertOneAsync(model); + } + if (param.Gold > 0) + { + user.Assets.Gold += param.Gold; + if (user.Assets.Gold < 0) + user.Assets.Gold = 0; + + var model = new UserReward() { UserId = param.UserId, BeforeCount = user.Assets.Gold - param.Gold, Source = param.Source, Remark = param.Remark, ChangeCount = param.Gold, Type = 1, CurrencyType = 1, RoomName = param.RoomName, RoomInfo = param.RoomInfo, Tax = param.Tax, OtherId = param.OtherId, OtherUserId = param.OtherUserId }; + + model.AfterCount = user.Assets.Gold; + if (param.IsAddRecord) + await _rewardMongo.InsertOneAsync(model); + + + } + + if (param.Exp > 0) + { + var res = user.LevelVerify(param.Exp, gameconfig.UserLevelConfigs); + if (res.isLevel) + { + var rewardItems = res.list? + .Where(item => item != null && item.Count > 0) + .ToList(); + var hasReward = res.gold > 0 + || res.diamond > 0 + || (rewardItems != null && rewardItems.Count > 0); + if (hasReward) + { + var email = new UserEmail + { + UserId = param.UserId, + Title = "升级奖励", + Content = $"恭喜您升到{user.Assets.Level}级!升级奖励已发送,请点击领取。", + SendTime = DateTime.Now.ToTimeStamp(), + RewardGold = res.gold, + RewardDiamond = res.diamond, + RewardItems = rewardItems, + IsReward = false, + ExpireTime = DateTime.Now.AddDays(30).ToTimeStamp(), + CreateInfo = new OptionUserInfo("system", "系统") + }; + await _emailMongo.InsertOneAsync(email); + + } + } + } + if (param.RewardItems != null && param.RewardItems.Count > 0) + { + foreach (var item in param.RewardItems) + { + var propConfig = gameconfig.PropConfig.FirstOrDefault(c => c.Number == item.Number); + if (propConfig == null) + return (false, $"道具配置不存在:{item.Number}"); + + if (!ProductType.MoreProductTypeList.Any(c => c == propConfig.Type)) + { + if (propConfig.Type == ProductTypeEnum.炮台) + { + var prop = user.CannonList.Find(c => c.Number == item.Number); + if (prop != null) + continue; + var cannon = _mapper.Map(propConfig); + if (propConfig.Day > 0) + { + cannon.IsTrial = true; + cannon.TrialEndTime = DateTime.Now.AddDays(propConfig.Day).ToTimeStamp(); + } + user.CannonList.Add(cannon); + } + + if (propConfig.Type == ProductTypeEnum.翅膀) + { + var prop = user.WingList.Find(c => c.Number == item.Number); + if (prop != null) + continue; + var cannon = _mapper.Map(propConfig); + if (propConfig.Day > 0) + { + cannon.IsTrial = true; + cannon.TrialEndTime = DateTime.Now.AddDays(propConfig.Day).ToTimeStamp(); + } + user.WingList.Add(cannon); + } + + if (propConfig.Type == ProductTypeEnum.战神) + { + var prop = user.GodWarList.Find(c => c.Number == item.Number); + if (prop != null) + continue; + var cannon = _mapper.Map(propConfig); + if (propConfig.Day > 0) + { + cannon.IsTrial = true; + cannon.TrialEndTime = DateTime.Now.AddDays(propConfig.Day).ToTimeStamp(); + } + user.GodWarList.Add(cannon); + } + + } + else + { + var prop = user.Props.Find(c => c.Number == item.Number); + if (prop != null) + { + prop.Count += item.Count; + if (prop.Count <= 0) + user.Props.Remove(prop); + } + else + { + if (item.Count > 0) + { + var newProp = _mapper.Map(propConfig); + newProp.Count = item.Count; + user.Props.Add(newProp); + } + } + } + } + } + } + else + { + if (param.Diamond > 0 && user.Assets.Diamond < param.Diamond) + { + return (false, "钻石数量不足"); + } + else if(param.Diamond > 0) + { + var beforeDiamond = user.Assets.Diamond; + user.Assets.Diamond -= param.Diamond; + user.Static.TotalConsumeDiamond += param.Diamond; + var model = new UserReward() { UserId = param.UserId, BeforeCount = beforeDiamond, AfterCount = user.Assets.Diamond, Source = param.Source, Remark = param.Remark, ChangeCount = param.Diamond, Type = 2, CurrencyType = 3, RoomName = param.RoomName, RoomInfo = param.RoomInfo, Tax = param.Tax, OtherId = param.OtherId, OtherUserId = param.OtherUserId }; + if (param.IsAddRecord) + await _rewardMongo.InsertOneAsync(model); + } + + + if (param.Gold > 0 && user.Assets.Gold < param.Gold) + { + return (false, "金币不足"); + } + else if (param.Gold > 0) + { + user.Assets.Gold -= param.Gold; + if (user.Assets.Gold < 0) + user.Assets.Gold = 0; + user.Static.TotalConsumeGold += param.Gold; + //{ + var model = new UserReward() { UserId = param.UserId, BeforeCount = user.Assets.Gold + param.Gold, Source = param.Source, Remark = param.Remark, ChangeCount = param.Gold, Type = 2, CurrencyType = 1, RoomName = param.RoomName, RoomInfo = param.RoomInfo, Tax = param.Tax, OtherId = param.OtherId, OtherUserId = param.OtherUserId }; + model.AfterCount = user.Assets.Gold; + if (param.IsAddRecord) + await _rewardMongo.InsertOneAsync(model); + //} + } + if (param.RewardItems != null && param.RewardItems.Count > 0) + { + foreach (var item in param.RewardItems) + { + var userProp = user.Props.FirstOrDefault(c => c.Number == item.Number); + if (userProp == null) + throw new BusinessException("没有该物品"); + if (userProp.Count < item.Count) + return (false, "物品数量不足"); + + if (userProp.Count == item.Count) + user.Props.Remove(userProp); + else + userProp.Count -= item.Count; + } + } + } + if (param.TotalRechargeGoldDelta != 0) + { + user.Static.TotalRechargeGold += param.TotalRechargeGoldDelta; + if (user.Static.TotalRechargeGold < 0) + user.Static.TotalRechargeGold = 0; + } + var updateDefinition = Builders.Update + .Set(p => p.Assets, user.Assets).Set(p => p.Props, user.Props).Set(p => p.Static, user.Static) + .Set(p => p.CannonList, user.CannonList).Set(p => p.WingList, user.WingList).Set(p => p.GodWarList, user.GodWarList); + await _userMongo.UpdateByIdAsync(user.Id, updateDefinition); + + if (param.SyncToFrontend && param.Exp > 0) + { + try + { + await _capPublisher.PublishAsync("BackgroundOperation.NotifyUser", new BackgroundOperationNotifyMessage + { + UserId = param.UserId, + Action = "level_change", + NewLevel = user.Assets.Level, + NewExp = user.Assets.Exp, + NewGold = user.Assets.Gold, + NewDiamond = user.Assets.Diamond, + Source = param.Source.ToString(), + Remark = param.Remark + }); + } + catch (Exception ex) + { + _logger.LogError(ex, + "经验已入库但实时通知失败 userId={UserId} exp={Exp} newLevel={Level} newExp={NewExp}", + param.UserId, param.Exp, user.Assets.Level, user.Assets.Exp); + } + } + + if (param.SyncToFrontend) + { + try + { + if (param.Gold != 0) + { + await _capPublisher.PublishAsync(TopicKeys.用户资产同步前端, new UserAssetSyncParam + { + UserId = param.UserId, + CurrencyType = 1, + ChangeType = (int)param.ChangeType, + Amount = param.Gold, + NewGold = user.Assets.Gold, + NewDiamond = user.Assets.Diamond, + Source = param.Source.ToString(), + Remark = param.Remark + }); + } + if (param.Diamond != 0) + { + await _capPublisher.PublishAsync(TopicKeys.用户资产同步前端, new UserAssetSyncParam + { + UserId = param.UserId, + CurrencyType = 3, + ChangeType = (int)param.ChangeType, + Amount = param.Diamond, + NewGold = user.Assets.Gold, + NewDiamond = user.Assets.Diamond, + Source = param.Source.ToString(), + Remark = param.Remark + }); + } + + if (param.RewardItems != null && param.RewardItems.Count > 0) + { + foreach (var item in param.RewardItems.Where(i => i != null && !string.IsNullOrWhiteSpace(i.Number))) + { + await _hubContext.Clients.Group(param.UserId).SendAsync("BackpackUpdated", new + { + Action = param.ChangeType == UserAssetChangeTypeEnum.增加 ? "backpack_add" : "backpack_update", + PropNumber = item.Number, + Count = param.ChangeType == UserAssetChangeTypeEnum.增加 ? item.Count : -item.Count + }); + } + } + } + catch (Exception ex) + { + _logger.LogError(ex, "资产更新成功但前端通知失败 userId={UserId} gold={Gold} diamond={Diamond}", + param.UserId, param.Gold, param.Diamond); + } + } + + return (true, "更新成功"); + }, expiry: 10, retry: false); + + + return result; + } + + public async Task DailyRankingReward() + { + try + { + var activityConfig = await _activityConfigService.Get(); + var cfg = activityConfig?.RankingRewardConfig; + if (cfg == null || !cfg.IsEnabled || cfg.Groups == null || cfg.Groups.Count == 0) + { + + return; + } + + foreach (var group in cfg.Groups) + { + if (group.Rewards == null || group.Rewards.Count == 0) continue; + + var ranking = await GetRanking(new LoginUser(), group.RankingType); + if (ranking?.UserList == null || ranking.UserList.Count == 0) continue; + + foreach (var reward in group.Rewards) + { + var rankUsers = ranking.UserList.Where(u => u.Rank >= reward.RankMin && u.Rank <= reward.RankMax).ToList(); + foreach (var user in rankUsers) + { + var rewardItems = new List(); + if (reward.Items != null) + { + foreach (var item in reward.Items) + { + if (!string.IsNullOrEmpty(item.OtherId)) + { + rewardItems.Add(new BaseProductCount + { + Number = item.OtherId, + Count = item.Count > 0 ? item.Count : 1 + }); + } + } + } + + var dateStr = DateTime.Now.ToString("yyyy年M月d日"); + var email = new UserEmail + { + UserId = user.UserId, + Title = "排行奖励", + Content = $"恭喜您在{dateStr} {group.Name}中排名荣获第{user.Rank}名,奖励已发放!请注意查收~", + SendTime = DateTime.Now.ToTimeStamp(), + RewardGold = reward.Gold, + RewardDiamond = reward.Diamond, + RewardItems = rewardItems.Count > 0 ? rewardItems : null, + IsReward = reward.Gold <= 0 && reward.Diamond <= 0 && (rewardItems == null || rewardItems.Count == 0), + ExpireTime = DateTime.Now.AddDays(30).ToTimeStamp(), + CreateInfo = new OptionUserInfo("system", "系统") + }; + await _emailMongo.InsertOneAsync(email); + } + } + + + } + } + catch (Exception ex) + { + _logger.LogError(ex, "DailyRankingReward 执行异常"); + } + } + + + + + private bool Random(double probability, int Max) + { + int randomValue = System.Random.Shared.Next(0, Max); + return randomValue < probability * Max; + } + + + public SignConfig GetRandomSignConfig(ActivityConfig activityConfig) + { + + if (activityConfig?.SignConfigs == null || !activityConfig.SignConfigs.Any()) + { + return null; + } + + var configs = activityConfig.SignConfigs; + var totalProbability = configs.Sum(c => Math.Max(0, c.Probability)); + + if (totalProbability <= 0) + { + return null; + } + + var randomValue = System.Random.Shared.NextDouble() * totalProbability; + + double cumulativeProbability = 0; + foreach (var config in configs) + { + var currentProbability = Math.Max(0, config.Probability); + cumulativeProbability += currentProbability; + + if (randomValue <= cumulativeProbability) + { + return config; + } + } + + return configs.LastOrDefault(); + } + + + public GiftResponse GetGift(List giftConfigs) + { + GiftResponse response = new GiftResponse(); + int totalGold = 0; + int totalDiamond = 0; + var productDict = new Dictionary(); + + if (giftConfigs != null) + { + foreach (var config in giftConfigs) + { + if (config == null) continue; + + int actualCount = 0; + if (config.IsRandom) + { + int min = Math.Max(0, config.MinCount); + int max = Math.Max(min, config.MaxCount); + actualCount = System.Random.Shared.Next(min, max + 1); + } + else + { + actualCount = config.Count; + } + + switch (config.Type) + { + case 1: + totalGold += actualCount; + break; + case 2: + totalDiamond += actualCount; + break; + case 3: + if (!string.IsNullOrEmpty(config.OtherId) && actualCount > 0) + { + if (productDict.ContainsKey(config.OtherId)) + productDict[config.OtherId] += actualCount; + else + productDict[config.OtherId] = actualCount; + } + break; + default: + + break; + } + } + } + + + var productList = new List(); + foreach (var kvp in productDict) + { + productList.Add(new BaseProductCount { Number = kvp.Key, Count = kvp.Value }); + } + response = new GiftResponse() { Diamond = totalDiamond, Gold = totalGold, Product = productList }; + return response; + } + + private async Task AutoDistributeVipGift(UserEntity user, List newVipLevels, GameConfig gameConfig) + { + foreach (var lvl in newVipLevels) + { + var vipConfig = gameConfig.VipLevelConfigs.Find(c => c.Level == lvl); + if (vipConfig?.GiftList == null || vipConfig.GiftList.Count == 0) + continue; + var result = GetGift(vipConfig.GiftList); + var rewardItems = result.Product? + .Where(item => item != null && item.Count > 0) + .ToList(); + var hasReward = result.Gold > 0 + || result.Diamond > 0 + || (rewardItems != null && rewardItems.Count > 0); + if (hasReward) + { + var email = new UserEmail + { + UserId = user.Id, + Title = $"VIP{lvl}升级礼包", + Content = $"恭喜您升级到VIP{lvl}!升级礼包已发送,请点击领取。", + SendTime = DateTime.Now.ToTimeStamp(), + RewardGold = result.Gold, + RewardDiamond = result.Diamond, + RewardItems = rewardItems, + IsReward = false, + ExpireTime = DateTime.Now.AddDays(30).ToTimeStamp(), + CreateInfo = new OptionUserInfo("system", "系统") + }; + await _emailMongo.InsertOneAsync(email); + + } + user.Assets.VipGift.Remove(lvl); + } + } + + private async Task LoginToken(UserEntity user) + { + var gameConfig = _cache.GetGameConfig(); + var oldVipExp = user.Assets.VipExp; + var oldVipLevel = user.Assets.VipLevel; + var oldVipSignInAdd = user.Assets.VipSignInAdd; + var newVipLevels = user.VipLevelVerify(gameConfig); + if (newVipLevels != null && newVipLevels.Count > 0) + { + await AutoDistributeVipGift(user, newVipLevels, gameConfig); + } + + if (oldVipExp != user.Assets.VipExp || + oldVipLevel != user.Assets.VipLevel || + oldVipSignInAdd != user.Assets.VipSignInAdd || + (newVipLevels != null && newVipLevels.Count > 0)) + { + await _userMongo.ReplaceOneAsync(user); + } + + var model = _mapper.Map(user); + var claims = new Claim[] + { + new Claim("uid", user.Id), + new Claim("uname", user.BaseInfo.UserName??""), + new Claim("utype", "2"), + new Claim("avatar", user.BaseInfo.AvatarUrl??""), + new Claim("number",user.BaseInfo.Number) + }; + model.Token = _jwtTools.CreateToken(claims); + //var userList = _userMongo.FilterBy(c => c.Static.LastLoginIp == user.Static.LastLoginIp); + //if (userList.Count() >= gameConfig.KillConfig.IPCount) + //{ + // var updateDefinition = Builders.Update.Set(p => p.Assets.ViolateRate,gameConfig.KillConfig.ViolateValue); + + // _userMongo.UpdateMany(c => c.Static.LastLoginIp == user.Static.LastLoginIp, updateDefinition); + //} + + if ((await _activityConfigService.Get())?.BattleOrderConfig.IsOpen == true) + { + _capPublisher.PublishAsync(TopicKeys.任务完成, new CompletedTaskParam() { taskEvent = TaskEvent.登录任务, userId = user.Id }); + } + return model; + } + + + + public async Task RecordFishingConsume(long consumeGold, LoginUser loginUser) + { + var activityConfig = await _activityConfigService.Get(); + if (activityConfig?.FishingReturnConfig == null || !activityConfig.FishingReturnConfig.IsEnabled) + { + return; + } + + var today = DateTime.Now.ToString("yyyyMMdd"); + var key = $"fishing:consume:{loginUser.UserId}:{today}"; + _cache.IncrBy(key, consumeGold); + } + + private async Task FlushFishingConsumeToDb(string userId) + { + try + { + var today = DateTime.Now.ToString("yyyyMMdd"); + var yesterday = DateTime.Now.AddDays(-1).ToString("yyyyMMdd"); + var redisTodayKey = $"fishing:consume:{userId}:{today}"; + var redisYesterdayKey = $"fishing:consume:{userId}:{yesterday}"; + + var redisTodayVal = _cache.GetString(redisTodayKey); + var redisYesterdayVal = _cache.GetString(redisYesterdayKey); + long.TryParse(redisTodayVal, out var redisToday); + long.TryParse(redisYesterdayVal, out var redisYesterday); + if (redisToday <= 0 && redisYesterday <= 0) return; + + var user = await _userMongo.FindByIdAsync(userId); + if (user == null) return; + + if (user.FishingReturn.LastFishingDate != today) + { + user.FishingReturn.YesterdayConsume = user.FishingReturn.TodayConsume + redisYesterday; + user.FishingReturn.TodayConsume = 0; + user.FishingReturn.IsClaimed = false; + user.FishingReturn.LastFishingDate = today; + } + + user.FishingReturn.TodayConsume += redisToday; + var update = Builders.Update + .Set(p => p.FishingReturn, user.FishingReturn); + await _userMongo.UpdateByIdAsync(user.Id, update); + + if (redisToday > 0) _cache.IncrBy(redisTodayKey, -redisToday); + if (redisYesterday > 0) _cache.IncrBy(redisYesterdayKey, -redisYesterday); + } + catch (Exception ex) + { + _logger.LogError(ex, "刷新捕鱼返利消费数据失败 userId={UserId}", userId); + } + } + + public async Task GetFishingReturnInfo(LoginUser loginUser) + { + var activityConfig = await _activityConfigService.Get(); + var result = new FishingReturnInfo(); + + if (activityConfig?.FishingReturnConfig == null || !activityConfig.FishingReturnConfig.IsEnabled) + { + return result; + } + var user = await _userMongo.FindByIdAsync(loginUser.UserId); + if (user == null) return result; + + var today = DateTime.Now.ToString("yyyyMMdd"); + var yesterday = DateTime.Now.AddDays(-1).ToString("yyyyMMdd"); + var redisTodayKey = $"fishing:consume:{loginUser.UserId}:{today}"; + var redisYesterdayKey = $"fishing:consume:{loginUser.UserId}:{yesterday}"; + long.TryParse(_cache.GetString(redisTodayKey), out var redisToday); + long.TryParse(_cache.GetString(redisYesterdayKey), out var redisYesterday); + + if (user.FishingReturn.LastFishingDate != today) + { + var totalYesterday = user.FishingReturn.TodayConsume + redisYesterday; + user.FishingReturn.YesterdayConsume = totalYesterday; + user.FishingReturn.TodayConsume = 0; + user.FishingReturn.IsClaimed = false; + user.FishingReturn.LastFishingDate = today; + var update = Builders.Update + .Set(p => p.FishingReturn, user.FishingReturn); + await _userMongo.UpdateByIdAsync(user.Id, update); + } + + return new FishingReturnInfo + { + TodayConsume = user.FishingReturn.TodayConsume + redisToday, + YesterdayConsume = user.FishingReturn.YesterdayConsume, + IsClaimed = user.FishingReturn.IsClaimed, + LastFishingDate = user.FishingReturn.LastFishingDate, + CanClaimGold = (long)(user.FishingReturn.YesterdayConsume * activityConfig.FishingReturnConfig.ReturnRate) + }; + } + + public async Task<(bool isok, string msg, long gold)> ClaimFishingReturn(LoginUser loginUser) + { + var activityConfig = await _activityConfigService.Get(); + if (activityConfig?.FishingReturnConfig == null || !activityConfig.FishingReturnConfig.IsEnabled) + { + return (false, "活动未开启", 0); + } + + await FlushFishingConsumeToDb(loginUser.UserId); + + var user = await _userMongo.FindByIdAsync(loginUser.UserId); + if (user == null) + { + return (false, "用户不存在", 0); + } + + var today = DateTime.Now.ToString("yyyyMMdd"); + if (user.FishingReturn.LastFishingDate != today) + { + user.FishingReturn.YesterdayConsume = user.FishingReturn.TodayConsume; + user.FishingReturn.TodayConsume = 0; + user.FishingReturn.IsClaimed = false; + user.FishingReturn.LastFishingDate = today; + } + + if (user.FishingReturn.IsClaimed) + { + return (false, "今日已领取过返利", 0); + } + + if (user.FishingReturn.YesterdayConsume <= 0) + { + return (false, "昨日无捕鱼消耗,无法领取返利", 0); + } + + long returnGold = (long)(user.FishingReturn.YesterdayConsume * activityConfig.FishingReturnConfig.ReturnRate); + if (activityConfig.FishingReturnConfig.DailyMaxReturn > 0 && returnGold > activityConfig.FishingReturnConfig.DailyMaxReturn) + { + returnGold = activityConfig.FishingReturnConfig.DailyMaxReturn; + } + + if (returnGold <= 0) + { + return (false, "返利金额为0", 0); + } + + user.Assets.Gold += returnGold; + user.FishingReturn.IsClaimed = true; + + await _userMongo.ReplaceOneAsync(user); + + return (true, $"领取成功,获得 {returnGold} 金币", returnGold); + } + + + } +} diff --git a/UserSrc/UserService/UserService.csproj b/UserSrc/UserService/UserService.csproj new file mode 100644 index 0000000..e540831 --- /dev/null +++ b/UserSrc/UserService/UserService.csproj @@ -0,0 +1,35 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/01-管理后台模块-AdminSrc.md b/docs/01-管理后台模块-AdminSrc.md new file mode 100644 index 0000000..502b811 --- /dev/null +++ b/docs/01-管理后台模块-AdminSrc.md @@ -0,0 +1,600 @@ +# 管理后台模块(AdminSrc)—— 功能与代码目录文档 + +> 本文档为「管理后台模块(AdminSrc)」的完整上下文说明,以仓库实际代码为准,供其他对话/开发者在不打开仓库的情况下理解该模块的定位、职责、接口、目录结构与跨模块交互。 + +--- + +## 一、平台背景与模块位置 + +本模块隶属于「捕鱼 + 棋牌游戏运营平台」后端,解决方案文件为 `Template0524.sln`。 + +**平台技术栈** + +- 运行时/框架:.NET 8(`net8.0`) +- 数据库:MongoDB(主业务数据,通过自研 `MongoRepository` 访问) +- 缓存:Redis(`RedisHelper` / `RedisService`) +- 消息队列:RabbitMQ,经 `DotNetCore.CAP`(`DotNetCore.CAP.RabbitMQ`)封装;CAP 的投递日志存于 PostgreSQL +- 实时推送:SignalR +- 网关:Ocelot +- 日志:NLog +- IoC:Autofac +- 网关 Ocelot 监听 `http://localhost:8001`,路由约定: + +| 网关路由前缀 | 目标服务(Host) | 端口 | +| --- | --- | --- | +| `/adminapi` | AdminHost(本模块) | 5241 | +| `/api`、`/loginhub` | UserHost | 5245 | +| `/customerapi`、`/customerHub` | CustomerHost | 5247 | +| `/chess`、`/chessgamehub` | ChessGameHost | 5242 | +| `/fishingroomhub` | FishRoomHost | 5244 | +| `/gamehub` | FishGameHost | 5248 | + +**本模块在平台中的位置** + +- 本模块进程入口为 `AdminSrc/AdminHost`,是管理后台(运营后台)的唯一 Web 服务。 +- 对外统一由网关以 `/adminapi` 前缀转发(各 Controller 自身的路由前缀也统一写成 `adminapi/[controller]`)。 +- 本模块是一个「后台管理系统」,本身不承载玩家端实时游戏逻辑(游戏房间的实时状态由 Redis 中的房间数据体现,本模块通过 Redis 读写与 CAP 发消息来观测/干预)。 + +--- + +## 二、模块简介 + +### 2.1 定位 + +AdminSrc 是捕鱼/棋牌平台的**运营管理后台**:面向管理员(后台账号)提供用户管理、客服管理、游戏配置、房间管理、靓号、公告、任务、活动/抽奖、日志审计等运营能力。 + +### 2.2 职责 + +- **后台账号与权限体系**:后台系统用户、角色、菜单(导航)、字典的增删改查,登录签发 JWT(`SystemService`)。 +- **玩家用户运营**:玩家查询/详情、封禁与解封、资产调整、发邮件、黑白名单、玩家难度因子(PlayerFactor)配置、道具增减、等级同步等(`AdminUserService`)。 +- **客服与工单**:客服账号、会话、聊天记录管理(`CustomerService` + 反馈 `FeedbackManageController`)。 +- **游戏配置管理**:捕鱼/棋牌的核心 `GameConfig` 与 `ActivityConfig`(活动/战令/签到/商店/抽奖奖池等),支持从 JSON 模板初始化、分区保存、导出(`GameConfigService`、`ActivityConfigService`)。 +- **房间运营**:查看 Redis 中捕鱼房间/象棋房间实时数据、机器人增减、清空/踢人/结算、房间统计与初始化(`RoomController`)。 +- **靓号体系**:靓号规则与号码的生成、增删改查、冻结/解冻、发放(`BeautifulNumberService` + `BeautifulNumberGenerator`)。 +- **公告/FAQ/任务/日志**:公告发布、FAQ 板块与问答、每日任务配置与结算、操作日志与登录日志、后台操作日志审计。 +- **基础设施**:统一响应封装、JWT 鉴权、Redis、CAP 消息发布、图片上传、全局异常、NLog、健康检查。 + +### 2.3 核心业务流程 / 数据流 + +1. **请求链路**:客户端 → Ocelot 网关(`:8001`,`/adminapi` 前缀)→ AdminHost(`:5241`)。AdminHost 中间件管线依次经过 CORS → 路由 → 静态文件 → 认证 → 授权 → `ApiLoggingMiddleware` → `OperationLogMiddleware` → `MapControllers`。 +2. **鉴权**:后台登录 `adminapi/System/user/login` 校验账号密码(MD5)后,用 `JWTHelper.JwtTools` 签发含 `uid/uname/dname` 声明的 Token;后续接口由 `[Authorize]` 校验。 +3. **配置读改写**:游戏/活动配置 `Get` 优先从 Redis 读取(缓存),未命中回源 MongoDB 并回填 Redis;`Update` 落库后回填 Redis,并向 CAP 发布 `配置变更`(`Topic_0524_ConfigChanged`),通知游戏进程热更新。 +4. **运营操作 → 消息下发**:房间清空、踢人、临时出鱼、后台资产/等级变更、玩家因子变更等,通过 `ICapPublisher` 发到 RabbitMQ,由游戏/用户相关服务消费(本模块**只发布不订阅**,见第七节)。 +5. **审计**:`OperationLogMiddleware` 对 `/adminapi` 与 `/api/Admin` 的非 GET/非登录类请求记录后台操作日志到 MongoDB(异步后台任务);`ApiLoggingMiddleware` 对 `/api` 前缀请求记录 API 日志。 + +--- + +## 三、业务功能清单 + +> 说明:所有 Controller 路由前缀均为 `adminapi/[controller]`(`RoomController`、`TempSpawnFishController` 为 `adminapi/Admin/[controller]`)。下表接口路径省略该前缀。空 `[Authorize]` 表示类上未标注授权特性(是否放行由框架/Swagger 环境决定,此处只如实反映代码)。 + +### 3.1 后台系统账号 / 权限 / 字典(SystemController → `ISystemService` / `SystemService`) + +| 接口 | 方法 | 用途 | +| --- | --- | --- | +| `System/user/login` | GET | 管理员登录(`[AllowAnonymous]`),返回 `AdminUserToken`(JWT);内置超级管理员 `administrator/qwert` | +| `System/user/add` | POST | 新增后台用户 | +| `System/user/update` | POST | 修改后台用户 | +| `System/user/update/icon` | GET | 修改头像 | +| `System/user/update/state` | GET | 启用/禁用(state) | +| `System/user/delete` | GET | 删除用户(逻辑删除 IsDelete) | +| `System/user/list` | POST | 后台用户分页列表 | +| `System/user/getuser` | GET | 获取当前登录管理员信息 | +| `System/user/nav` | GET | 获取当前管理员可见菜单树 | +| `System/role/add`、`update`、`updatenav`、`delete`、`list`、`get` | — | 角色增删改、角色授权菜单、角色列表/详情 | +| `System/nav/add`、`update`、`delete`、`list` | — | 后台菜单(导航)增删改查、菜单树 | +| `System/dic/add`、`update`、`delete`、`list`、`list/code`、`get/code` | — | 数据字典增删改查(按 Id 或 code 查询) | + +### 3.2 玩家用户管理(AdminUserController → `IAdminUserService` / `AdminUserService`) + +| 接口 | 方法 | 用途 | +| --- | --- | --- | +| `AdminUser/GetUserList` | POST | 玩家分页列表(含在线状态:结合 Redis 在线用户集合与用户会话房间) | +| `AdminUser/GetUserDetail` | GET | 玩家详情(`UserEntity`) | +| `AdminUser/UpdateUserAssets` | POST | 调整玩家资产(金币/钻石等) | +| `AdminUser/GetUserStatistics` | GET | 用户统计(总数/今日注册/本月注册/在线/封禁/VIP/资产总量) | +| `AdminUser/GetEmailStatistics` | GET | 邮件统计 | +| `AdminUser/BatchBanUser`、`BanUser`、`UnbanUser` | POST/GET | 批量封号 / 封号 / 解封 | +| `AdminUser/BatchSendEmail`、`SendEmail` | POST | 批量/单个发邮件 | +| `AdminUser/CancelUser` | GET | 注销当前登录用户 | +| `AdminUser/DeleteUser`、`BatchDeleteUser` | GET/POST | 删除玩家 / 批量删除 | +| `AdminUser/UpdateUser` | POST | 修改玩家基础数据 | +| `AdminUser/GetEmailList`、`DeleteEmail`、`BatchDeleteEmail` | — | 邮件列表 / 删除 / 批量删除 | +| `AdminUser/SetUserType`、`BatchSetUserType` | POST | 设置用户类型 / 批量 | +| `AdminUser/SetBlackUser`、`BatchSetBlackUser` | POST | 黑名单设置 / 批量 | +| `AdminUser/UpdateUserFactor` | POST | 更新玩家难度因子 `PlayerFactor` | +| `AdminUser/GetBlackFactorConfig` | GET | 获取黑名单默认因子配置 | +| `AdminUser/ResetUserFactor` | POST | 重置玩家因子 | +| `AdminUser/InitUserPassword`、`InitSafeBoxPassword` | GET | 重置用户登录密码 / 保险箱密码 | +| `AdminUser/GetUserFactorList` | POST | 因子/风控列表(含同注册 IP 数量、盈亏等) | +| `AdminUser/GetUserProps`、`AddUserProp`、`UpdateUserPropCount`、`DeleteUserProp` | — | 玩家道具查询/新增/改数量/删除 | +| `AdminUser/SyncAllUserLevel` | GET | 全量同步用户等级 | + +### 3.3 客服与工单(CustomerController → `ICustomerService` / `CustomerService`;FeedbackManageController) + +| 接口 | 方法 | 用途 | +| --- | --- | --- | +| `Customer/list` | GET | 客服列表 | +| `Customer/{id}` | GET | 客服详情 | +| `Customer` | POST | 新增客服 | +| `Customer` | PUT | 更新客服 | +| `Customer/{id}` | DELETE | 删除客服 | +| `Customer/conversations`、`conversation/{id}`、`conversation/{id}`(DELETE) | — | 会话列表 / 详情 / 删除 | +| `Customer/chatlog/{conversationId}` | GET | 会话聊天记录 | +| `Customer/message/{id}`、`messages/{conversationId}`、`messages/delete-batch` | — | 删除单条消息 / 删除会话全部消息 / 批量删除消息 | +| `FeedbackManage/List` | POST | 用户反馈分页 | +| `FeedbackManage/Detail` | GET | 反馈详情 | +| `FeedbackManage/Reply` | POST | 回复反馈(写入回复内容、状态、回复人) | +| `FeedbackManage/Delete` | POST | 删除反馈 | + +### 3.4 游戏配置管理(GameConfigController → `IGameConfigService`) + +| 接口 | 方法 | 用途 | +| --- | --- | --- | +| `GameConfig` | GET | 获取完整游戏配置(道具信息补齐) | +| `GameConfig/FishTypeList` | GET | 鱼种列表 | +| `GameConfig/PropList` | GET | 道具列表 | +| `GameConfig/Update` | POST | 更新游戏配置(落库 + Redis + 发 `配置变更`) | +| `GameConfig/UpdateFishType` | POST | 更新鱼种配置 | +| `GameConfig/UpdateRoom` | POST | 更新房间配置 | +| `GameConfig/UpdateRoomFish` | POST | 更新房间鱼类配置 | +| `GameConfig/UpdateFishArray` | POST | 更新鱼阵配置 | +| `GameConfig/UpdateUserLevel` | POST | 更新用户等级配置 | +| `GameConfig/UpdateProp` | POST | 更新道具配置 | +| `GameConfig/UpdatePropFragment` | POST | 更新道具碎片配置 | +| `GameConfig/UpdateVipLevel` | POST | 更新 VIP 等级配置 | +| `GameConfig/UpdateScratchCard` | POST | 更新刮刮卡配置 | +| `GameConfig/UpdateBossDrop` | POST | 更新 Boss 掉落配置 | +| `GameConfig/init-all`、`init-game`、`init-activity` | GET | 从 JSON 模板全量初始化游戏/活动配置 | +| `GameConfig/InitSection/{sectionName}`、`InitActivitySection/{sectionName}` | GET | 按板块初始化单项 | +| `GameConfig/SaveSection/{sectionName}`、`ExportSection/{sectionName}` | GET | 将某板块保存到 / 导出为 `gameconfig.json` | + +### 3.5 活动 / 抽奖配置(ActivityConfigController → `IActivityConfigService`;LotteryController) + +| 接口 | 方法 | 用途 | +| --- | --- | --- | +| `ActivityConfig` / `ActivityConfig/Get` | GET | 获取活动配置 | +| `ActivityConfig/Update` | POST | 更新活动配置(发 `配置变更`) | +| `ActivityConfig/Delete` | POST | 删除活动配置 | +| `ActivityConfig/UpdateBattleOrder` | POST | 战令配置 | +| `ActivityConfig/UpdateRelief` | POST | 救济金配置 | +| `ActivityConfig/UpdateSign` | POST | 签到配置 | +| `ActivityConfig/UpdateGoldShop`、`UpdateDiamondShop` | POST | 金币/钻石商店配置 | +| `ActivityConfig/UpdateRegister` | POST | 注册初始配置 | +| `ActivityConfig/UpdateFishingReturn`、`GetFishingReturn` | POST/GET | 捕鱼返水配置 | +| `ActivityConfig/SaveSection/{sectionName}`、`ExportSection/{sectionName}` | GET | 活动配置板块保存到 / 导出为 `activityconfig.json` | +| `Lottery/list`、`detail` | GET | 抽奖活动列表 / 详情 | +| `Lottery/save` | POST | 保存抽奖活动(校验三个奖池消耗并在换周期时清零已抽数) | +| `Lottery/toggle`、`delete` | POST/DELETE | 开关活动 / 清空抽奖配置 | +| `Lottery/initialize` | POST | 从 `Config/lottery-init.json` 模板初始化奖池(保持关闭) | + +### 3.6 房间运营(RoomController → Redis + `IGameConfigService`;TempSpawnFishController;BotConfigController) + +`RoomController`(文件 `AdminRoomController.cs`,路由 `adminapi/Admin/Room`,`[Authorize]`): + +| 接口 | 用途 | +| --- | --- | +| `GetAllRooms`、`GetRoomDetail`、`GetUserRoomRealtime`、`GetRoomStatistics` | 捕鱼房间列表/详情/玩家实时数据/统计 | +| `AddRobot`、`SetRobotCount`、`RegenerateAllBotIds` | 机器人增减、设置数量、刷新机器人编号 | +| `ClearRoom` | 清空捕鱼房间(对真人玩家发 `游戏金币结算` 结算,清理 Redis 会话与子弹) | +| `InitRooms` | 重置并初始化所有房间(含象棋房间) | +| `GetAllChessRooms`、`GetChessRoomDetail`、`GetChessRoomStatistics` | 象棋房间列表/详情/统计 | +| `ClearChessRoom`、`KickChessPlayer`、`DeleteChessRoom`、`RepairChessRooms`、`ReInitChessRooms` | 清空/踢人(发 `后台踢出象棋玩家`)/删除/修复/重建象棋房间 | +| `AddChessRobot`、`SetChessRobot` | 象棋房间机器人增减/设置(有真人时禁止) | + +`TempSpawnFishController`(路由 `adminapi/Admin/TempSpawnFish`,`[AllowAnonymous]`): + +- `SpawnFish`:临时强制出鱼,校验房间在线后向 `临时强制出鱼`(`Topic_0524_TempSpawnFish`)发布 `TempSpawnFishMessage`(count 钳制 1~2000,默认持续 30 秒)。 + +`BotConfigController`(路由 `adminapi/BotConfig`): + +- `GetAll`/`Add`/`Update`/`Delete`:机器人档案(`BotProfileEntity`)配置维护。 + +### 3.7 靓号管理(BeautifulNumberController → `IBeautifulNumberService` / `BeautifulNumberService`) + +- `list`、`available`:靓号列表 / 可售列表(分页) +- `check/{number}`:检查号码状态(是否已占用) +- `delete`、`set-normal`、`freeze`、`unfreeze`:删除 / 置为普通号 / 冻结 / 解冻 +- `update-price`、`update-number`:改价 / 修改号码(等级+价格) +- `rules`、`update-rules`、`init-rules`、`add-rule`、`update-rule`、`delete-rule`:靓号规则查询/批量更新/初始化/增删改 +- `give-to-user`:靓号发放给指定用户 +- `init-numbers`:批量生成靓号 +- `add-number`、`batch-add-numbers`:新增单个 / 批量新增号码 + +### 3.8 公告(NoticeController → `INoticeService` / `NoticeService`) + +- `add`、`update`、`delete`、`list`:公告增改删、分页列表 +- `get`(`[AllowAnonymous]`):公告详情;新增/更新时会把正文/顶图/内容图从 `/uploads/temp/` 迁移到 `/uploads/notice/`。 + +### 3.9 FAQ 帮助中心(FaqController → `IFaqService` / `FaqService`) + +- `Categories`、`CategoryTree`、`CategoryDetail`:板块列表 / 树 / 详情 +- `AddCategory`、`UpdateCategory`、`DeleteCategory`:板块增删改(删除前校验子板块与问题) +- `Questions`、`QuestionList`、`QuestionDetail`:问题列表 / 分页 / 详情 +- `AddQuestion`、`UpdateQuestion`、`DeleteQuestion`:问题增删改 + +### 3.10 任务(TaskController → `ITaskService` / `TaskService`) + +- `Init`:初始化默认任务 +- `DayTaskReward`:执行每日任务结算(也由定时任务 `DailyTaskJob` 调用) +- `AddTask`、`DeleteTask`、`UpdateTask`、`UpdateTaskState`、`GetTaskList`:任务配置增删改查与启停 + +### 3.11 空房率配置(EmptyRoomRateConfigController → `IEmptyRoomRateConfigService`) + +- `list`:按游戏类型/房间等级分页查询 +- `add`、`update`、`delete`:空房率(0~100)配置维护;中国象棋按 gameType 唯一,其余按 gameType+roomLevel 唯一 + +### 3.12 日志与审计(OperationLogController、UserLoginLogController、UserAssetChangeController) + +- `OperationLogController`:后台操作日志分页查询(排除 GET)、管理员下拉、模块枚举、单条/批量删除。 +- `UserLoginLogController`:玩家登录日志分页查询(按用户/类型/状态/平台/时间过滤)、详情、删除、批量删除。 +- `UserAssetChangeController`:玩家资产变动记录(`UserReward`,排除「开炮/击杀鱼」来源)分页查询、来源枚举选项。 + +### 3.13 后台进出账与通用能力(BackgroundOperationController、ImageUploadController) + +- `BackgroundOperationController`:`charge`(充值)、`deduct`(扣除)、`logs`(操作日志)、`search-user`(按关键字查用户)。 +- `ImageUploadController`:`upload`、`upload/temp`、`upload/config`(配置图必须 PNG,编号校验后写入 `/uploads/{number}.png`)。 + +--- + +## 四、项目结构与技术要点 + +### 4.1 五个项目及依赖关系 + +| 项目 | 路径 | SDK / 目标框架 | 关键 NuGet / 依赖 | 说明 | +| --- | --- | --- | --- | --- | +| AdminHost | `AdminSrc/AdminHost/AdminHost.csproj` | `Microsoft.NET.Sdk.Web` / net8.0 | NLog.Web.AspNetCore 6.1.2、Autofac 8.3.0、Autofac.Extensions.DependencyInjection 10.0.0、AutoMapper 14.0.0、DotNetCore.CAP 8.3.4(+ Dashboard / PostgreSql / RabbitMQ)、Microsoft.AspNetCore.Mvc.NewtonsoftJson 8.0.24 | **进程入口**(Web Host) | +| AdminApi | `AdminSrc/AdminApi/AdminApi.csproj` | `Microsoft.NET.Sdk` / net8.0(`OutputType=Exe`) | AutoMapper 14.0.0、Microsoft.AspNetCore.Mvc.Core 2.3.9 | 全部 Controller 所在程序集(实际由 AdminHost 通过 `AddApplicationPart` 挂载) | +| AdminApplication | `AdminSrc/AdminApplication/AdminApplication.csproj` | `Microsoft.NET.Sdk` / net8.0 | 无 | 仅含 DTO(`DTOs/CustomerDtos.cs`) | +| AdminDomain | `AdminSrc/AdminDomain/AdminDomain.csproj` | `Microsoft.NET.Sdk` / net8.0 | Microsoft.Extensions.Logging.Abstractions 10.0.3、MongoDB.Bson 3.6.0 | 领域实体、枚举、领域服务接口 | +| AdminService | `AdminSrc/AdminService/AdminService.csproj` | `Microsoft.NET.Sdk` / net8.0 | AutoMapper 14.0.0、DotNetCore.CAP 8.3.4 | 业务服务实现 | + +**项目引用关系** + +- `AdminHost` → 引用 `AdminApi`、`AdminApplication`,以及基础设施与外部业务程序集: + - 基础设施:`Infrastructure/JWTHelper`、`Infrastructure/MongoRepository`、`Infrastructure/RabbitMQHelper`、`Infrastructure/RedisHelper`、`Infrastructure/ScheduledService`、`Infrastructure/SharpAbp.Infrastructure.Api` + - 外部业务:`UserSrc/UserService`、`FishGameSrc/FishGameService` +- `AdminApi` → `AdminService`、`AdminApplication`,以及 `ChessGameSrc/ChessGameDomain`、`ChessGameSrc/ChessGameService`、`FishRoomService`、`CustomerSrc/CustomerService.Domain`(供房间/象棋实时数据与麻将类实体使用) +- `AdminService` → `AdminDomain`,以及 `CommonDomain`、`Infrastructure/CommonInfrastructure`、`Infrastructure/Common`、`Infrastructure/JWTHelper`、`Infrastructure/MongoRepository`、`Infrastructure/RabbitMQHelper`、`Infrastructure/RedisHelper`、`RedisService`、`UserSrc/UserDomain`、`CustomerSrc/CustomerService.Domain` +- `AdminDomain` → `Infrastructure/MongoRepository`、`CustomerSrc/CustomerService.Domain` +- `AdminApplication` → 无引用 + +> 注意:`AdminApi` 声明了 `OutputType=Exe` 并在其中含一个默认模板 `Program.cs`(内容仅 `Console.WriteLine("Hello, World!")`),但**真正运行的是 `AdminHost`**;AdminHost 通过 `AddApplicationPart(typeof(AdminApi.AssemblyMarker).Assembly)` 把 AdminApi 中的 Controller 纳入路由。 + +### 4.2 进程入口要点(`AdminSrc/AdminHost/Program.cs`) + +- 设置环境变量 `SERVICE_NAME`(默认程序集名 `AdminHost`)、`INSTANCE_ID`(默认 `default`)。 +- MVC:`AddControllers().AddApplicationPart(AdminApi).AddControllersAsServices()`,禁用模型校验自动过滤器(`SuppressModelStateInvalidFilter = true`)。 +- 序列化:`AddNewtonsoftJson`,日期 `yyyy-MM-dd HH:mm:ss`、本地时区、忽略 null、CamelCase。 +- 配置装载:额外加载 `Config/system.json`(可选);绑定 `MongoDbSettings`;注册 `IMongoDbSettings` 单例。 +- 基础设施:`IHttpContextAccessor`、`IRequestApi`(`Common.Request.RequestApi`)、`AddAutoMapper(typeof(AutoMapperConfig))`、`AddHealthChecks`(`self`)。 +- CORS:策略名 `Cors`,允许任意 Origin(`SetIsOriginAllowed(_ => true)`)、任意头/方法、允许凭据。 +- `AddSignalR()`:启用 SignalR(后台本身未注册 Hub,供共享基础库/前端使用)。 +- JWT:`AddCustomJwt(configuration)`;Redis:`AddRedisCache(configuration)`;CAP:`AddCap(configuration)`(见 `Extension/CapExtension`)。 +- 定时任务:`AddCronJob`,Cron `0 0 0 * * *`(每天 0 点),时区为本地时区,调用 `ITaskService.DayTaskReward()`。 +- Autofac:`UseServiceProviderFactory(new AutofacServiceProviderFactory())` + `ConfigureContainer` 注册 `AutofacModule`。 + +**中间件管线顺序**(`Program.cs`):`UseDeveloperExceptionPage`(仅开发)→ `UseCors("Cors")` → `UseRouting` → `UseStaticFiles` → `UseAuthentication` → `UseAuthorization` → `UseApiLogging` → `UseOperationLog` → `MapControllers` → `UseGlobalExceptionHandler`(来自 `SharpAbp`)→ `MapHealthChecks("/health")`。 + +### 4.3 端口与环境 + +- `Properties/launchSettings.json`:`http` 档案的 `applicationUrl` 为 `http://localhost:8002/`(环境 `Development`);IIS Express 档案为 `http://localhost:57330`。 +- `docker-compose.yaml`:服务 `0524admin`,容器名 `0524admin`,端口映射 `5241:80`(**平台约定的对外端口为 5241**,网关 `/adminapi` 指向该端口;容器内部监听 80)。 +- `appsettings.json`:仅含 `Logging`、`AllowedHosts` 与 `CapConfig`(RabbitMQ + PostgreSQL 连接)。 +- 其余关键配置来自 `Config/system.json`(JWT、PostgreSQL、CAP、Redis、MongoDB、微信公众号 `WXConfig`、子弹 `BulletConfig` 等),运行时合并。**注意:`Config/system.json` 内含明文密钥/口令(JWT SecretKey、Redis/Mongo/RabbitMQ/PG 口令、微信 AppSecret 等),属敏感信息,切勿外泄。** + +### 4.4 DI / Autofac 注册位置 + +- 位置:`AdminSrc/AdminHost/Middleware/AutofacModule.cs`。 +- 注册内容: + - `MongoBaseRepository<>` → `IMongoBaseRepository<>`(`InstancePerLifetimeScope`) + - `RedisService.RedisService` → `IRedisService` + - 按「类型名以 `Service` 结尾」扫描并 `AsImplementedInterfaces` 注册以下程序集:`ApiLogService` 所在程序集(`CommonService`)、`AdminOperationLogService`/`SystemService`(AdminService)、`UserFeedbackService`(UserService)等 + - `CommonService.BackgroundOperationService` → `IBackgroundOperationService` +- AutoMapper:`AdminSrc/AdminService/AutoMapperConfig.cs`(`Profile`),注册了 `AddUserParam→SystemUser`、`AddRoleParam→SystemUserRole`、`AddNavParam→SystemNavigation`、`AddDicParam→SystemDic`、`SystemUser→AdminUserToken`、`SystemNavigation→SystemNavigationResponse`、`SystemDic→SystemDicResponse`、`AddNoticeParam→Notice`、`UpdateNoticeParam→Notice`、`GameTask→UserTask` 等映射。 + +### 4.5 中间件细节 + +- **ApiLoggingMiddleware**(`/api` 前缀,非 OPTIONS):缓冲响应体,脱敏(把 `BaseResponse.Data` 置空)后写入 `ApiLog`(MongoDB),记录 Token/Version/User-Agent/Source/DeviceId/Device/Ip/Sign 等头部。 +- **OperationLogMiddleware**(`/adminapi` 开头或 `/api/Admin` 开头):跳过 `login`/`GetAccessToken` 及 `administrator`;读取 POST/PUT 请求体(截断 4000 字符);放行后用后台 `Task.Run` 异步写入 `AdminOperationLog`,模块(`EnumOperationModule`)与动作类型(封号/解封/批量/发邮件/初始化/冻结/解冻/赠送/清空/机器人管理/设置状态/修改头像/查询/新增/修改/删除)按路径关键字推断。 +- **CapExtension.AddCap**:`UseDashboard()` + `UseRabbitMQ`(ExchangeName `cap.exchange`,读 `CapConfig`)+ `UsePostgreSql`(schema `public`);成功消息保留 7 天、失败重试 5 次、间隔 10 秒、失败阈值回调 `ObjFailedThresholdCallback`(当前回调体为空实现)。 + +--- + +## 五、代码目录说明(完整目录树) + +> 说明:`wwwroot` 为后台前端静态资源(layui 模板),图片/字体等二进制资源众多,此处按目录维度概述,仅列出其中出现的 `.json` 文件。其余为全部 `.cs` / 配置文件的完整清单。 + +```text +AdminSrc/ +├── AdminApi/ # 全部 Controller 程序集(由 AdminHost 挂载) +│ ├── AdminApi.csproj +│ ├── Program.cs # 默认模板(Hello World),非实际入口 +│ ├── AssemblyMarker.cs # 空标记类,供 AddApplicationPart 定位程序集 +│ ├── Controllers/ +│ │ ├── OperationLogController.cs # 后台操作日志查询/删除 +│ │ └── ImageUploadController.cs # 图片上传(通用/临时/配置图) +│ ├── AdminUser/ +│ │ └── AdminUserController.cs # 玩家用户管理(封号/资产/邮件/因子/道具等) +│ ├── BackgroundOperation/ +│ │ └── BackgroundOperationController.cs # 后台充值/扣除/日志/查用户 +│ ├── BeautifulNumber/ +│ │ └── BeautifulNumberController.cs # 靓号及规则管理 +│ ├── Customer/ +│ │ └── CustomerController.cs # 客服/会话/聊天记录 +│ ├── EmptyRoomRate/ +│ │ └── EmptyRoomRateConfigController.cs # 空房率配置 +│ ├── Faq/ +│ │ └── FaqController.cs # FAQ 板块与问题 +│ ├── Feedbacks/ +│ │ └── FeedbackManageController.cs # 用户反馈管理 +│ ├── GameConfigs/ +│ │ ├── GameConfigController.cs # 游戏配置(最大文件,含初始化/分区保存/导出) +│ │ ├── ActivityConfigController.cs # 活动配置 +│ │ ├── AdminRoomController.cs # 房间运营(类名 RoomController) +│ │ ├── BotConfigController.cs # 机器人档案 +│ │ ├── TempSpawnFishController.cs # 临时强制出鱼(AllowAnonymous) +│ │ └── .workbuddy/memory/ # 空目录(工具残留,无文件) +│ ├── LoginLogs/ +│ │ └── UserLoginLogController.cs # 玩家登录日志 +│ ├── Lottery/ +│ │ └── LotteryController.cs # 抽奖活动配置 +│ ├── Notices/ +│ │ └── NoticeController.cs # 公告管理 +│ ├── System/ +│ │ └── SystemController.cs # 后台账号/角色/菜单/字典 +│ ├── Task/ +│ │ └── TaskController.cs # 任务配置与结算 +│ └── UserAssetChanges/ +│ └── UserAssetChangeController.cs # 玩家资产变动记录 +│ +├── AdminApplication/ # DTO 层(几乎为空) +│ ├── AdminApplication.csproj +│ └── DTOs/ +│ └── CustomerDtos.cs # 客服/会话/消息 DTO +│ +├── AdminDomain/ # 领域实体/枚举/领域接口 +│ ├── AdminDomain.csproj +│ ├── Admin/ +│ │ ├── AdminOperationLog.cs # 后台操作日志实体(Mongo: admin_operation_log) +│ │ ├── IAdminOperationLogService.cs # 操作日志服务接口 +│ │ ├── SystemUser.cs # 后台系统用户(Mongo: system_user) +│ │ ├── SystemUserRole.cs # 后台角色(Mongo: system_user_role) +│ │ ├── SystemNavigation.cs # 后台菜单(Mongo: system_user_nav) +│ │ ├── SystemDic.cs # 数据字典(Mongo: system_user_dic) +│ │ ├── ENum/ +│ │ │ ├── EnumNavigationCategory.cs # 菜单分类(后台/前台) +│ │ │ ├── EnumOperationModule.cs # 操作日志模块枚举 +│ │ │ └── EnumResource.cs # 资源类型(菜单/资源/代码块) +│ │ └── Param/ +│ │ └── OperationLogParam.cs # 操作日志查询/新增参数 +│ ├── BeautifulNumber/ +│ │ ├── BeautifulNumberConfig.cs # 靓号配置与规则实体(Mongo: beautiful_number_config/rule) +│ │ └── BeautifulNumberRuleEnum.cs # 靓号规则/等级/状态枚举 +│ ├── Customer/ +│ │ ├── ICustomerService.cs # 客服领域服务接口 +│ │ └── Param/ +│ │ └── CustomerParam.cs # 客服/会话查询参数 +│ └── Notices/ +│ └── NoticeDtos.cs # 公告 DTO +│ +├── AdminHost/ # 进程入口(Web Host) +│ ├── AdminHost.csproj +│ ├── Program.cs # 入口:MVC/JWT/Redis/CAP/定时任务/Autofac/中间件管线 +│ ├── appsettings.json # Logging + CapConfig(RabbitMQ/PG) +│ ├── appsettings.Development.json # 开发日志级别 +│ ├── docker-compose.yaml # 容器编排:0524admin,5241:80 +│ ├── .dockerignore +│ ├── Config/ +│ │ ├── system.json # 运行时主配置(JWT/PG/CAP/Redis/Mongo/微信/子弹等) +│ │ ├── gameconfig.json # 游戏配置初始化模板(很大) +│ │ ├── activityconfig.json # 活动配置初始化模板(战令/签到/商店/排行榜等) +│ │ └── lottery-init.json # 抽奖奖池初始化模板 +│ ├── Extension/ +│ │ └── CapExtension.cs # CAP(RabbitMQ + PostgreSQL)注册 +│ ├── Jobs/ +│ │ └── DailyTaskJob.cs # 每日 0 点任务结算定时任务 +│ ├── Middleware/ +│ │ ├── AutofacModule.cs # Autofac DI 注册 +│ │ ├── ApiLoggingMiddleware.cs # /api 请求日志(脱敏) +│ │ └── OperationLogMiddleware.cs # 后台操作日志记录 +│ ├── Properties/ +│ │ └── launchSettings.json # 启动档案(http:8002) +│ └── wwwroot/ # 后台前端静态资源(layui 后台模板) +│ ├── admin/ +│ │ ├── index.html # 后台入口页 +│ │ ├── json/tree.json # 示例菜单树数据 +│ │ ├── dist/ # 编译后的前端资源 +│ │ │ ├── controller/ lib/(extend) style/(res/template) +│ │ │ └── views/ # 各业务视图页 +│ │ │ ├── activity/(lottery) background beautifulnumber +│ │ │ ├── config customer email gameconfig mail +│ │ │ └── notice room set/(system,user) system +│ │ │ └── user/(administrators, assetchange, user) +│ │ ├── json/ # 假数据目录(console/content/forum/mall/message/table/upload/user/useradmin/workorder 等) +│ │ ├── layui/ # layui 组件库(css/font/images/lay/rc;css/modules/layim/html/getmsg.json) +│ │ ├── layuiv2/ # layui 第二版(css/font) +│ │ └── lib/ # 富文本等(wangEditor) +│ ├── image/ # 界面截图等图片 +│ └── uploads/ # 上传文件(图标/道具/头像等大量 png/jpg) +│ +└── AdminService/ # 业务服务实现 + ├── AdminService.csproj + ├── AutoMapperConfig.cs # AutoMapper 映射配置 + ├── Admin/ + │ ├── AdminOperationLogService.cs # 操作日志写入/分页查询(排除 GET) + │ └── OperationLogHelper.cs # 操作日志构造/管理员信息/IP 提取辅助 + ├── BeautifulNumber/ + │ ├── BeautifulNumberService.cs # 靓号业务(列表/购买/冻结/规则/生成) + │ ├── BeautifulNumberGenerator.cs # 靓号号码生成器(按规则笛卡尔积生成 8 位号) + │ └── IBeautifulNumberService.cs + ├── Customer/ + │ └── CustomerService.cs # 客服/会话/消息数据访问 + ├── EmptyRoomRate/ + │ ├── EmptyRoomRateConfigService.cs # 空房率配置业务 + │ └── IEmptyRoomRateConfigService.cs + ├── Faq/ + │ ├── FaqService.cs # FAQ 板块树/问题 + │ └── IFaqService.cs + ├── GameConfigs/ + │ ├── GameConfigService.cs # 游戏配置(Redis 缓存 + 落库 + 发配置变更) + │ ├── ActivityConfigService.cs # 活动配置(同上) + │ ├── IGameConfigService.cs + │ └── IActivityConfigService.cs + ├── ImageUpload/ + │ ├── ImageUploadService.cs # 图片校验/保存(支持自定义命名) + │ └── IImageUploadService.cs + ├── Notices/ + │ ├── NoticeService.cs # 公告增删改查 + 临时图片迁移 + │ ├── INoticeService.cs + │ └── Param/ + │ ├── AddNoticeParam.cs + │ ├── UpdateNoticeParam.cs + │ └── GetNoticeListParam.cs + ├── System/ + │ ├── SystemService.cs # 后台账号/角色/菜单/字典/登录 JWT + │ ├── ISystemService.cs + │ ├── Param/ # AddUserParam/UpdateUserParam/AddRoleParam/UpdateRoleParam/ + │ │ # UpdateRoleNavParam/AddNavParam/UpdateNavParam/AddDicParam/ + │ │ # UpdateDicParam/GetUserListParam(共 10 个参数类) + │ └── Response/ + │ ├── AdminUserToken.cs # 登录返回 Token 模型 + │ ├── SystemNavigationResponse.cs # 菜单树响应 + │ └── SystemDicResponse.cs # 字典响应 + ├── Tasks/ + │ ├── TaskService.cs # 任务配置/每日结算/注册任务 + │ ├── ITaskService.cs + │ └── Param/ + │ ├── GiftResponse.cs + │ ├── GetTaskListParam.cs + │ ├── GetUserTaskListParam.cs + │ └── CompletedTaskParam.cs + └── User/ + ├── AdminUserService.cs # 玩家用户核心业务(最大服务) + ├── IAdminUserService.cs + ├── Param/ # AdminUserListParam/BatchBanUserParam/BatchSendEmailParam/ + │ # SendEmailParam/EmailListQueryParam/UpdateUserAssetsParam/ + │ # UpdateUserDataParam/UserManagementParam/ + │ # UserAssetChangeQueryParam(共 9 个参数类,另有 BatchDelete/BatchSet 等内联于控制器) + └── Response/ + ├── UserStatistics.cs # 用户统计模型 + └── EmailStatistics.cs # 邮件统计模型 +``` + +--- + +## 六、关键文件索引 + +| 文件相对路径 | 职责 | +| --- | --- | +| `AdminSrc/AdminHost/Program.cs` | 进程入口:MVC/JWT/Redis/CAP/SignalR/定时任务/Autofac 装配与中间件管线 | +| `AdminSrc/AdminHost/Extension/CapExtension.cs` | CAP(RabbitMQ + PostgreSQL)注册与失败回调 | +| `AdminSrc/AdminHost/Middleware/AutofacModule.cs` | Autofac IoC 注册(仓储/Redis/各 Service) | +| `AdminSrc/AdminHost/Middleware/ApiLoggingMiddleware.cs` | `/api` 请求日志(响应脱敏后写 MongoDB) | +| `AdminSrc/AdminHost/Middleware/OperationLogMiddleware.cs` | 后台操作日志记录(模块/动作推断,异步写入) | +| `AdminSrc/AdminHost/Jobs/DailyTaskJob.cs` | 每日 0 点调用 `ITaskService.DayTaskReward()` | +| `AdminSrc/AdminHost/Config/system.json` | 运行时主配置(JWT/PG/CAP/Redis/Mongo/微信/子弹,含敏感信息) | +| `AdminSrc/AdminHost/Config/gameconfig.json` | 游戏配置初始化模板(服务启动读取,用于 init) | +| `AdminSrc/AdminHost/Config/activityconfig.json` | 活动配置初始化模板 | +| `AdminSrc/AdminHost/Config/lottery-init.json` | 抽奖奖池初始化模板 | +| `AdminSrc/AdminHost/appsettings.json` | 日志 + CapConfig(生产/容器环境) | +| `AdminSrc/AdminApi/AssemblyMarker.cs` | 程序集标记(`AddApplicationPart` 定位) | +| `AdminSrc/AdminApi/System/SystemController.cs` | 后台账号/角色/菜单/字典接口 | +| `AdminSrc/AdminApi/AdminUser/AdminUserController.cs` | 玩家用户管理接口(封号/资产/邮件/因子/道具) | +| `AdminSrc/AdminApi/GameConfigs/GameConfigController.cs` | 游戏配置接口(最大文件,含初始化/分区保存/导出) | +| `AdminSrc/AdminApi/GameConfigs/ActivityConfigController.cs` | 活动配置接口 | +| `AdminSrc/AdminApi/GameConfigs/AdminRoomController.cs` | 房间运营接口(类名 `RoomController`,含 CAP 结算/踢人) | +| `AdminSrc/AdminApi/GameConfigs/TempSpawnFishController.cs` | 临时强制出鱼接口(发 CAP) | +| `AdminSrc/AdminApi/GameConfigs/BotConfigController.cs` | 机器人档案接口 | +| `AdminSrc/AdminApi/Lottery/LotteryController.cs` | 抽奖活动配置接口 | +| `AdminSrc/AdminApi/BeautifulNumber/BeautifulNumberController.cs` | 靓号接口 | +| `AdminSrc/AdminApi/Notices/NoticeController.cs` | 公告接口 | +| `AdminSrc/AdminApi/Customer/CustomerController.cs` | 客服/会话/消息接口 | +| `AdminSrc/AdminApi/Feedbacks/FeedbackManageController.cs` | 用户反馈管理接口 | +| `AdminSrc/AdminApi/Faq/FaqController.cs` | FAQ 接口 | +| `AdminSrc/AdminApi/EmptyRoomRate/EmptyRoomRateConfigController.cs` | 空房率配置接口 | +| `AdminSrc/AdminApi/Task/TaskController.cs` | 任务配置接口 | +| `AdminSrc/AdminApi/LoginLogs/UserLoginLogController.cs` | 玩家登录日志接口 | +| `AdminSrc/AdminApi/UserAssetChanges/UserAssetChangeController.cs` | 玩家资产变动记录接口 | +| `AdminSrc/AdminApi/BackgroundOperation/BackgroundOperationController.cs` | 后台充值/扣除/日志/查用户接口 | +| `AdminSrc/AdminApi/Controllers/OperationLogController.cs` | 后台操作日志查询/删除接口 | +| `AdminSrc/AdminApi/Controllers/ImageUploadController.cs` | 图片上传接口 | +| `AdminSrc/AdminService/System/SystemService.cs` | 后台账号/角色/菜单/字典/登录 JWT 业务 | +| `AdminSrc/AdminService/User/AdminUserService.cs` | 玩家用户核心业务(最大服务,含资产/邮件/因子/道具/等级) | +| `AdminSrc/AdminService/GameConfigs/GameConfigService.cs` | 游戏配置读写(Redis 缓存 + CAP 配置变更) | +| `AdminSrc/AdminService/GameConfigs/ActivityConfigService.cs` | 活动配置读写(Redis 缓存 + CAP 配置变更) | +| `AdminSrc/AdminService/BeautifulNumber/BeautifulNumberService.cs` | 靓号业务逻辑 | +| `AdminSrc/AdminService/BeautifulNumber/BeautifulNumberGenerator.cs` | 靓号号码生成算法 | +| `AdminSrc/AdminService/Customer/CustomerService.cs` | 客服/会话/消息数据访问 | +| `AdminSrc/AdminService/Faq/FaqService.cs` | FAQ 业务 | +| `AdminSrc/AdminService/Notices/NoticeService.cs` | 公告业务(含临时图片迁移) | +| `AdminSrc/AdminService/EmptyRoomRate/EmptyRoomRateConfigService.cs` | 空房率配置业务 | +| `AdminSrc/AdminService/Tasks/TaskService.cs` | 任务配置与每日结算 | +| `AdminSrc/AdminService/ImageUpload/ImageUploadService.cs` | 图片校验与保存 | +| `AdminSrc/AdminService/Admin/AdminOperationLogService.cs` | 操作日志写入/查询 | +| `AdminSrc/AdminService/Admin/OperationLogHelper.cs` | 操作日志辅助方法 | +| `AdminSrc/AdminService/AutoMapperConfig.cs` | AutoMapper 映射配置 | +| `AdminSrc/AdminDomain/Admin/SystemUser.cs` | 后台用户实体(`system_user`) | +| `AdminSrc/AdminDomain/Admin/SystemUserRole.cs` | 后台角色实体 | +| `AdminSrc/AdminDomain/Admin/SystemNavigation.cs` | 后台菜单实体 | +| `AdminSrc/AdminDomain/Admin/SystemDic.cs` | 数据字典实体 | +| `AdminSrc/AdminDomain/Admin/AdminOperationLog.cs` | 操作日志实体(`admin_operation_log`) | +| `AdminSrc/AdminDomain/Admin/ENum/EnumOperationModule.cs` | 操作日志模块枚举 | +| `AdminSrc/AdminDomain/BeautifulNumber/BeautifulNumberConfig.cs` | 靓号配置/规则实体 | +| `AdminSrc/AdminDomain/BeautifulNumber/BeautifulNumberRuleEnum.cs` | 靓号规则/等级/状态枚举 | +| `AdminSrc/AdminDomain/Customer/ICustomerService.cs` | 客服领域服务接口 | +| `AdminSrc/AdminDomain/Customer/Param/CustomerParam.cs` | 客服/会话查询参数 | +| `AdminSrc/AdminDomain/Notices/NoticeDtos.cs` | 公告 DTO | +| `AdminSrc/AdminApplication/DTOs/CustomerDtos.cs` | 客服/会话/消息 DTO | + +--- + +## 七、与其他模块的交互 + +### 7.1 CAP / RabbitMQ 消息(本模块只发布,不订阅) + +> 在 `AdminSrc` 全目录搜索 `CapSubscribe` / `Subscribe` **无任何命中**,因此本模块为纯消息生产者。主题常量定义于 `CommonDomain/TopicKeys.cs`。CAP ExchangeName 为 `cap.exchange`,CAP 投递日志存 PostgreSQL(`CapConfig`)。 + +| 主题(常量 / 实际字符串) | 触发位置 | 消息类型 | 用途 | +| --- | --- | --- | --- | +| `TopicKeys.配置变更` / `Topic_0524_ConfigChanged` | `GameConfigService.Update`、`ActivityConfigService.Update` | `ConfigChangedMessage`(ConfigType、OperationId、PublishedAtUnixMs) | 通知游戏进程热更新游戏/活动配置 | +| `TopicKeys.游戏金币结算` / `Topic_0524_GameCoinsSettlement` | `RoomController.ClearRoom` | 匿名对象(UserId、BeforeGold、AfterGold、Remark、RoomName、RoomInfo) | 管理员清空房间时对玩家做金币结算 | +| `TopicKeys.后台踢出象棋玩家` / `Topic_0524_AdminKickChessPlayer` | `RoomController.KickChessPlayer` | `AdminKickChessPlayerMessage`(RoomId、UserId、Reason) | 异步踢出象棋房间玩家 | +| `TopicKeys.临时强制出鱼` / `Topic_0524_TempSpawnFish` | `TempSpawnFishController.SpawnFish` | `TempSpawnFishMessage`(RoomId、FishNumber、Count、RouteId、Seconds、OperationId、PublishedAtUnixMs) | 临时强制房间出鱼 | +| `TopicKeys.因子变更` / `Topic_0524_PlayerFactorChanged` | `AdminUserService`(更新/重置玩家因子) | `PlayerFactorChangedMessage` | 通知游戏进程玩家难度因子变更 | +| `"BackgroundOperation.NotifyUser"`(字符串字面量) | `AdminUserService`(后台资产/等级变更、后台进出账等) | `BackgroundOperationNotifyMessage` | 通知用户端资产/等级等发生变化 | + +> 其余在 `TopicKeys` 中定义的主题(任务完成、用户资产变更、用户升级、击杀鱼日志、房间变化、全局击杀公告、玩家踢出、用户资产同步前端、登录绑定、拒绝回房、登录结果通知、召唤卡出鱼等)由平台其它模块发布/订阅,本模块代码中未直接使用。 + +### 7.2 Redis + +通过 `IRedisService`(`RedisService`)读写,主要集中在: + +- **房间实时数据**:捕鱼房间 `GetGameRoom / GetGameRoomAllList / SetGameRoom / RemoveGameRoom(All)`;象棋房间 `GetChessRoom / GetAllChessRooms / SetChessRoom / RemoveChessRoom / ClearAllChessRooms`(房间运营的核心数据源)。 +- **玩家会话**:`GetRedisUserCId / SetRedisUserCId`(用于在线状态、所在房间判断)。 +- **子弹清理**:`ClearBulletIds`(清空房间/移除机器人时清理)。 +- **配置缓存**:`GetGameConfig / SetGameConfig`、`GetActivityConfig / SetActivityConfig / RemoveActivityConfig`、`GetFishingKillConfig / SetFishingKillConfig`、`SetFishSpawnConfig`。 +- **在线用户集合**:`GetAllLoginUserIds()`(`AdminUserController.GetUserList` 判定在线)。 +- **分布式锁**:`IDistributedLock`(由 `AdminUserService` 注入使用)。 + +### 7.3 HTTP 调用 + +`AdminSrc` 内未见对其他服务的直接 HttpClient/HTTP 调用。跨服务协作均通过 CAP 消息与 Redis 共享状态完成(网关侧的 `/adminapi` 路由是本模块被调用的入口,而非本模块发起调用)。 + +### 7.4 共享实体 / 项目引用(跨模块耦合点) + +- `UserDomain`(`UserSrc/UserDomain`):`UserEntity`、`UserEmail`、`UserReward`、`UserFeedback`、`UserLoginLog`、`GameTask`、`UserTask`、`Notice`、`PlayerFactor`、`RewardSource` 等玩家侧实体被本模块大量直接读写。 +- `CommonDomain` / `CommonInfrastructure` / `Common`:统一响应(`BaseResponse` / `PageResponse` / `BaseController`)、`TopicKeys`、`GameConfig` / `ActivityConfig` 及各配置模型、`EmptyRoomRateConfig`、`FaqCategory` / `FaqQuestion`、`BotProfileEntity`、枚举 `GameTypeEnum`、`LoginUser` 等。 +- `ChessGameDomain`(`ChessGameRoom` / `RedisChessGameUser`)、`ChessGameService`、`FishRoomService`:房间/象棋相关数据模型与服务。 +- `CustomerSrc/CustomerService.Domain`:`CustomerEntity` / `ConversationEntity` / `MessageEntity`(客服模块实体)。 +- `Infrastructure/*`:`JWTHelper`(`JwtTools` 签发 Token)、`MongoRepository`(`IMongoBaseRepository<>`、`ServiceDatabases.Admin`)、`RabbitMQHelper`、`RedisHelper`、`ScheduledService`(`CronJobService` / `AddCronJob`)、`SharpAbp.Infrastructure.Api`(`UseGlobalExceptionHandler` 等)。 + +### 7.5 MongoDB 集合(服务库 `ServiceDatabases.Admin`) + +本模块直接落库的主要集合(由实体 `[BsonCollection]` 声明): + +- `system_user`、`system_user_role`、`system_user_nav`、`system_user_dic`:后台账号/角色/菜单/字典 +- `admin_operation_log`:后台操作日志 +- `beautiful_number_config`、`beautiful_number_rule`:靓号与规则 + +(`GameConfig`、`ActivityConfig`、`EmptyRoomRateConfig`、`FaqCategory`、`FaqQuestion`、`BotProfileEntity`、`Notice`、`UserEntity` 等实体的集合归属由各自定义所在程序集决定,本模块通过通用仓储读写。) \ No newline at end of file diff --git a/docs/02-用户模块-UserSrc.md b/docs/02-用户模块-UserSrc.md new file mode 100644 index 0000000..6724a3f --- /dev/null +++ b/docs/02-用户模块-UserSrc.md @@ -0,0 +1,544 @@ +# 用户模块(UserSrc)—— 功能与代码目录文档 + +> 本文档为用户模块(源码目录 `UserSrc/`)的完整上下文说明,供其他对话/开发者直接使用。内容全部基于仓库中实际读取到的源代码整理;未读到或无法确认的内容已明确标注,不做臆测。 + +--- + +## 一、平台背景与模块位置 + +本仓库是一个**捕鱼 + 棋牌游戏运营平台后端**,解决方案文件为 `Template0524.sln`。 + +**总体技术栈** + +- 运行时/框架:.NET 8(各项目 `TargetFramework` 均为 `net8.0`) +- 数据库:MongoDB(业务数据,通过自研 `MongoRepository` 访问)、PostgreSQL(CAP 消息存储 / 部分后台数据) +- 缓存/会话:Redis(RedisHelper、RedisService) +- 消息:RabbitMQ(通过 `DotNetCore.CAP` 实现事件总线,CAP 采用 PostgreSQL 作为存储) +- 实时通信:SignalR(使用 StackExchange.Redis 作为背板) +- 网关:Ocelot +- 日志:NLog(`nlog.config`,由 `UserHost.csproj` 链接拷贝) +- IoC:Autofac(`AutofacServiceProviderFactory` + 自研 `ApplicationModule` 约定注入) +- 定时任务:自研 `ScheduledService`(`CronJobService`) + +**网关路由(平台总览,来自项目背景说明)** + +- 网关监听:`http://localhost:8001` +- `/adminapi` → AdminHost(5241) +- `/api`、`/loginhub` → **UserHost(本模块,5245)** +- `/customerapi`、`/customerHub` → CustomerHost(5247) +- `/chess`、`/chessgamehub` → ChessGameHost(5242) +- `/fishingroomhub` → FishRoomHost(5244) +- `/gamehub` → FishGameHost(5248) + +**本模块位置** + +- 模块源码根目录:`UserSrc/` +- 进程入口项目:`UserSrc/UserHost`(`Program.cs`) +- 网关前缀:`/api`(HTTP 接口)、`/loginhub`(SignalR Hub) +- SignalR 使用 Redis 作为背板(`ChannelPrefix = "GameHub"`) + +> 说明:`RedisService` 项目引用了 `UserSrc/UserDomain`;`CommonService`、`AdminService` 也引用了它(即 `UserSrc/UserDomain/UserDomain.csproj`)。这是本模块实体被其它模块共享的关键点。 + +--- + +## 二、模块简介 + +**定位**:用户模块(UserSrc)是平台的**账号与大厅(大厅资产/活动)服务**,负责玩家的注册登录、个人资料、资产(金币/钻石/经验/VIP)、商城、邮件、签到、排行榜、任务、战令、抽奖/刮刮卡/召唤卡、公告/FAQ、靓号、游戏与活动配置下发,以及登录态维护(SignalR LoginHub)。 + +**主要职责** + +1. 账号:手机号注册、微信注册、手机号+验证码/密码登录、微信登录、改密、绑定微信/手机号、实名认证、登出/在线态维护。 +2. 资产:金币、钻石、经验、等级、VIP 等级、道具(背包/炮台/翅膀/战神)的统一增减(`UpdateAssets`),并写入 `user_reward` 流水。 +3. 大厅:保险箱存取、救济金、签到、金币商城、钻石商城、返利(捕鱼返利)、排行榜、VIP 礼包、战令、任务。 +4. 周边:邮件、公告、FAQ、反馈、图片上传、游戏配置/活动配置读取、靓号。 + +**核心业务流程/数据流** + +- **注册/登录**:`LoginController` → `UserService.Register/RegisterWeiXin/Login/LoginByPassword/LoginWx` → 校验/查重(分布式锁)→ 新建或读取 `UserEntity` → `LoginToken` 签发 JWT → 返回 `UserToken`(继承 `UserEntity`,附带 `Token`)。登录成功后若玩家此前在棋牌/捕鱼房间中,会触发旧房间结算(`HandleLoginRoomSettlementAsync`)。 +- **大厅资产**:各类接口最终汇聚到 `UserService.UpdateAssets(UserAssetParam)`,在分布式锁 `user:asset:update:{userId}` 内变更 `Assets/Props/Static`、写 `user_reward` 流水,并通过 CAP 发布 `Topic_0524_UserAssetSyncFrontend` 与 SignalR 推送前端。 +- **登录态/实时**:前台连接 SignalR `/loginhub`,调用 `Bind(userId)` 绑定连接(写 Redis 登录态、处理旧连接踢下线、必要时 CAP 发布「登录绑定」等待旧房间结算结果),订阅者把后台通知/配置变更/击杀公告/资产变动实时推给前端。 + +--- + +## 三、业务功能清单 + +### 3.1 登录注册 —— `LoginController`(路由前缀 `api/Login`) + +对应 Service:`IUserService`(`UserService/User/UserService.cs`);微信辅助:`WXBaseHelper`(`Common.WX`)。 + +| 接口 | 方法 | 用途 | +|---|---|---| +| `GetAccessToken` | GET | 获取微信 access_token(`WXBaseHelper.GetAccessToken`) | +| `GetSessionToken` | GET `js_code` | 用微信 code 换取 session/access(`GetAccessTokenByCode`) | +| `registerWX` | POST | 微信注册(`RegisterWeiXin`),已存在则直接登录 | +| `register` | POST | 手机号+账号+昵称+密码注册(`Register`),分布式锁查重 | +| `SendMobileCode` | GET `mobile` | 发送手机验证码(当前实现为固定 `000000`,写 Redis) | +| `LoginWx` | GET `openId` | 微信登录(`LoginWx`) | +| `Login` | GET `mobile,code` | 验证码**或**密码登录(`Login` 内部同时兼容两种) | +| `LoginByPassword` | GET `mobile,password` | 密码登录(`LoginByPassword`) | +| `GetDateTime` | GET | 返回服务器时间信息(`DateTimeResponse`,含时区/时间戳) | +| `ResetPassword` | GET `mobile,password,code` | 验证码重置密码(`UpdatePassword`) | + +客户端 IP 由 `GetClientIp()` 读取 `X-Forwarded-For` 或连接地址。 + +### 3.2 大厅 —— `HallController`(路由前缀 `api/Hall`,`[Authorize]`) + +对应 Service:`IUserService`、`ITaskService`、`IBattleOrderService`、`IActivityConfigService`、`IGameConfigService`。 + +| 接口 | 方法 | 用途 / Service | +|---|---|---| +| `SaveSafeBox` | GET `gold` | 存入保险箱 `UserService.SaveSafeBox` | +| `GetSafeBox` | GET `gold,password` | 取出保险箱 `UserService.GetSafeBox` | +| `SetSafeBoxPassword` | GET `password` | 设置保险箱密码 | +| `ResetSafeBoxPassword` | GET `password,code` | 验证码重置保险箱密码 | +| `GetRelief` | GET | 领取救济金 `GetReliefGold` | +| `SynthesisFragment` | GET `propNumber` | 碎片合成 `SyntheticFragments` | +| `BuyProp` | GET `propNumber,count` | 购买道具 `BuyProps` | +| `UseVipExp` | GET `count` | 使用 VIP 经验包 `UseVipExp` | +| `BuyGold` | GET `number,count` | 钻石换金币(金币商城)`BuyGold` | +| `BuyDiamond` | GET `number,count` | 购买钻石(生成订单)`BuyDiamond` | +| `SignIn` | GET | 每日签到 `Sign` | +| `ChangeCannon` / `UnloadCannon` | GET `number` | 切换/卸下炮台 | +| `ChangeWing` / `UnloadWing` | GET `number` | 切换/卸下翅膀 | +| `ChangeGodWar` / `UnloadGodWar` | GET `number` | 切换/卸下战神 | +| `GetVipDayGift` | GET | 领取 VIP 每日礼包 | +| `GetVipGift` | GET `vipLevel` | 领取 VIP 权益礼包 | +| `GetUserTaskList` | GET `taskType` | 用户任务列表 `TaskService.GetUserTaskList` | +| `DistributeRewards` | GET `id` | 领取单个任务奖励 | +| `GetUserRewardList` | POST | 资产变动流水分页 `GetUserRewardList` | +| `GetBattleOrder` | GET | 战令详情 `BattleOrderService.GetUserBattleOrderWithConfigAsync` | +| `GetBattleOrderLevelStatus` | GET | 战令等级奖励状态 | +| `ReceiveAllBattleOrderRewards` | GET | 一键领取战令奖励 | +| `ReceiveBattleOrderLevelReward` | GET `level` | 领取指定等级战令奖励 | +| `BuyBattleOrderLevel` | GET `levelCount` | 购买战令等级 | +| `BuyBattleOrderAdvance` | GET `type` | 购买战令进阶(普通/豪华/至尊) | +| `ReceiveAllTaskRewards` | GET | 一键领取任务奖励(转战令经验)`TaskService.ReceiveAllTaskRewardsAsync` | +| `GetRanking` | GET `type` | 排行榜 `UserService.GetRanking`(受活动配置维护开关控制) | +| `SendBroadcast` | GET `message` | 大喇叭全服广播 `SendBroadcast` | +| `GetChessRoomPartitionCount` | GET | (`[AllowAnonymous]`)统计中国象棋房间分区总数,读 `IGameConfigService` | + +### 3.3 用户资料/邮件/返利 —— `UserController`(路由前缀 `api/User`,`[Authorize]`) + +对应 Service:`IUserService`。 + +- 资料:`RealNameAuth`(实名认证)、`UpdateUserName`(改名,消耗改名卡)、`BindWX`、`BindMobile`、`UpdateAvatar`、`UpdateAvatarFrame`、`GetUser`、`GetUserAssets`、`GetUserList`。 +- 邮件:`SendEmail`、`GetEmail`、`RewardEmail`(`type=1` 单封、否则一键领取)、`DeleteEmail`、`ReadEmailMore`、`GetNoReadCount`、`GetEmailByPage`。 +- 捕鱼返利:`GetFishingReturnInfo`、`ClaimFishingReturn`(对应 `UserService.RecordFishingConsume/GetFishingReturnInfo/ClaimFishingReturn`)。 + +### 3.4 反馈 —— `FeedbackController`(`UserApi/User/FeedbackController.cs`,路由 `api/Feedback`,`[Authorize]`) + +对应 Service:`IUserFeedbackService`(`UserService/User/UserFeedbackService.cs`)。 + +- `Submit` 提交反馈、`MyList` 我的反馈分页、`Detail` 反馈详情。 + +### 3.5 抽奖(彩蛋)—— `LotteryController`(路由前缀 `api/Lottery`,`[Authorize]`) + +对应 Service:`ILotteryService` + `IActivityConfigService` + `IGameConfigService`。 + +- `Config` 抽奖配置(含已抽奖项)、`Draw` 抽奖(`poolType`)、`UserStatus` 用户抽奖状态、`DrawnPrizes` 已抽奖项列表。 + +> 注意:抽奖业务**实现**位于 `CommonService` 项目(`CommonService/LotteryService.cs`,其 `namespace` 为 `UserService`),本模块内 `UserSrc/UserService/User/LotteryService.cs` 已被 `UserService.csproj` 通过 `` **排除编译**(遗留文件,见第五节)。 + +### 3.6 刮刮卡 —— `ScratchCardController`(路由前缀 `api/ScratchCard`,`[Authorize]`) + +对应 Service:`IScratchCardService`(`UserService/ScratchCard/ScratchCardService.cs`)。 + +- `draw` 使用刮刮卡(道具编号 `40005`)抽奖,扣道具并发奖,写 `scratch_card_record`。 + +### 3.7 召唤卡 —— `SummonCardController`(路由前缀 `api/SummonCard`,`[Authorize]`) + +对应 Service:`ISummonCardService`(`UserService/SummonCard/SummonCardService.cs`)。 + +- `use` 在有效捕鱼房间内使用召唤卡(道具编号 `40006`),扣除道具后 CAP 发布 `Topic_0524_SummonCardFish`。 + +### 3.8 公告 —— `NoticeController`(路由前缀 `api/Notice`) + +对应 Service:`INoticeService`。 + +- `list`(POST)公告分页、`get`(匿名)公告详情、`get/newone`(匿名)最新公告。 + +### 3.9 FAQ —— `FaqController`(路由前缀 **`adminapi/Faq`**) + +对应 Service:`IFaqService`。注意该 Controller 虽位于 `UserApi` 程序集,但路由前缀为 `adminapi/[controller]`。 + +- `CategoryTree` 分类树、`Questions` 按分类取问题、`QuestionList`(POST)问题分页、`QuestionDetail` 问题详情。 + +### 3.10 游戏配置/活动配置 —— `GameConfigController`、`ActivityConfigController`(`api/GameConfig`、`api/ActivityConfig`) + +对应 Service:`IGameConfigService`、`IActivityConfigService`(均带 Redis 缓存)。 + +- `GameConfigController`:`Get` 返回 `GameConfig`。 +- `ActivityConfigController`:`Get` 返回 `ActivityConfig`;子项 `diamondShopList`、`goldShopList`、`signConfigs`、`reliefConfig`、`registerConfig`、`fishingReturnConfig`、`battleOrderConfig`、`lotteryConfig`、`rankingRewardConfig`。 + +### 3.11 靓号 —— `BeautifulNumberController`(路由前缀 `api/BeautifulNumber`,`[Authorize]`) + +对应 Service:`IBeautifulNumberService`。 + +- `available` 可购靓号分页、`check/{number}` 靓号校验。 + +### 3.12 字典 —— `DictController`(路由前缀 `api/Dict`) + +- `GetByCode`、`GetListByCode`:读 MongoDB 集合 `SystemDic`(`Domain.Admin.Admin`)。 + +### 3.13 图片上传 —— `ImageUploadController`(路由前缀 `api/ImageUpload`) + +- `upload`(POST,`IFormFile`):保存到 `wwwroot/uploads`,限制扩展名(jpg/jpeg/png/gif/bmp/webp)与 5MB,返回 `{ path }`。 + +### 3.14 SignalR 登录 Hub —— `LoginHub`(路由 `/loginhub`) + +对应文件:`UserService/Hubs/LoginHub.cs`。仅 WebSockets 传输。 + +- 服务端方法:`Bind(userId)`(绑定登录态、踢旧连接、按需触发旧房间结算)、`DismissPendingRoom(userId)`(CAP 发布 `Topic_0524_DismissPendingRoom`)。 +- 向前端推送的事件:`AccountKicked`、`KickToMainPage`、`LoginSettlementCompleted`、`NewEmail`、`BackpackUpdated`、`LevelChanged`、`AssetUpdated`、`ChangeConfig`、`Broadcast`、`KillAnnouncement`。 + +--- + +## 四、项目结构与技术要点 + +### 4.1 四个 csproj + +| 项目 | 路径 | 类型 | 关键 NuGet | 关键项目引用 | +|---|---|---|---|---| +| UserHost | `UserSrc/UserHost/UserHost.csproj` | Web(进程入口,Exe) | NewtonsoftJson 8.0.24、SignalR.StackExchangeRedis 8.0.0、NLog.Web.AspNetCore 6.1.2、Autofac 8.3.0、Autofac.Extensions.DependencyInjection 10.0.0、AutoMapper 14.0.0、DotNetCore.CAP 8.3.4(含 Dashboard/PostgreSql/RabbitMQ) | ScheduledService、RedisService、UserApi、UserService、SharpAbp.Infrastructure.Api | +| UserApi | `UserSrc/UserApi/UserApi.csproj` | 类库(`OutputType=Exe`,`Program.cs` 为占位) | AutoMapper 14.0.0、Microsoft.AspNetCore.Mvc.Core 2.3.0 | CommonService、CommonInfrastructure、Common、SharpAbp.Infrastructure.Api、RedisService、UserDomain、UserService、AdminSrc/AdminDomain | +| UserService | `UserSrc/UserService/UserService.csproj` | 类库 | AutoMapper 14.0.0、Cronos 0.8.4、DotNetCore.CAP 8.3.4、MongoDB.Driver 3.6.0 | AdminDomain、CommonDomain、CommonInfrastructure、JWTHelper、MongoRepository、RedisHelper、ScheduledService、UserDomain | +| UserDomain | `UserSrc/UserDomain/UserDomain.csproj` | 类库 | DotNetCore.CAP 8.3.4、MongoDB.Bson/Driver 3.6.0 | CommonDomain、MongoRepository | + +依赖关系:`UserHost` → (`UserApi` → (`CommonService`,`UserService`,`UserDomain`,`AdminDomain`,`RedisService`,`Common`,`CommonInfrastructure`),`UserService` → `UserDomain`/`CommonDomain`/…) ;`UserDomain` 仅依赖 `CommonDomain` + `MongoRepository`。 + +`UserService.csproj` 特殊点:通过 `` 排除该文件编译(同时 `` 保留为内容)。 + +### 4.2 进程入口要点(`UserHost/Program.cs`) + +- 设置环境变量 `SERVICE_NAME`、`INSTANCE_ID`(供日志/实例标识)。 +- MVC:`AddControllers().AddApplicationPart(typeof(AssemblyMarker).Assembly)` —— **显式把 UserApi 程序集的 Controller 暴露给本进程**,并 `AddControllersAsServices()`;JSON 日期格式 `yyyy-MM-dd HH:mm:ss`(Newtonsoft)。 +- 配置:加载 `Config/system.json`;绑定 `MongoDbSettings`;注册 `IHttpContextAccessor`、`IRequestApi`、`AutoMapper(typeof(AutoMapperConfig))`、`WXBaseHelper`。 +- 健康检查:`/health`(自定义 JSON 输出)。 +- SignalR:`AddSignalR` + `.AddJsonProtocol().AddStackExchangeRedis(builder.Configuration["RedisConfig:ConnectionString"])`,`ChannelPrefix = "GameHub"`;`MaximumReceiveMessageSize=64KB`、`KeepAliveInterval=15s`、`ClientTimeoutInterval=70s`。 +- CORS 策略 `"Cors"`(允许任意来源、任意头/方法、允许凭据)。 +- JWT:`AddCustomJwt`(JWTHelper);Redis:`AddRedisCache`(RedisHelper);CAP:本模块扩展 `AddCap`(`UserHost/Extension/CapExtension.cs`)。 +- 定时任务:`AddCronJob`(`0 0 0 * * *`)、`AddCronJob`(`0 0 0 * * *`),时区本地。 +- Autofac:`UseServiceProviderFactory(new AutofacServiceProviderFactory())` + `RegisterModule()`。 +- 管道:`UseDeveloperExceptionPage`(Development)→ `UseCors("Cors")` → `UseRouting` → `MapHub("/loginhub", WebSockets)` → `UseAuthentication` → `UseAuthorization` → `UseApiLogging` → `MapControllers` → `UseGlobalExceptionHandler` → `MapHealthChecks("/health")`。 + +### 4.3 SignalR / Redis / CAP 配置 + +- **SignalR 背板**:Redis(`RedisConfig:ConnectionString`,`defaultDatabase=2`),频道前缀 `GameHub`。 +- **Redis**:`RedisConfig`(Host/Port/Password/Database=1/ConnectionString)。`IRedisService` 提供验证码、登录态(`RedisUserCid`)、房间(`GameRoom`)、待回房(pending fish/chess room)、`IncrBy` 等能力(实现位于 `RedisService` 项目)。 +- **CAP**(`UserHost/Extension/CapExtension.cs`): + - `x.UseDashboard()`;消息代理 `UseRabbitMQ`(Host/UserName/Password/VirtualHost 来自 `CapConfig`,`ExchangeName = "cap.exchange"`);存储 `UsePostgreSql`(`CapConfig:PGLogHost`,schema `public`)。 + - 成功消息保留 7 天、失败重试 5 次/间隔 10s,`FailedThresholdCallback` 记录失败信息。 + - 注册订阅者:`UserMQService`、`AdminNotifySubscriber`、`LoginResultSubscriber`、`ConfigChangedSubscriber`、`KillAnnounceSubscriber`、`AssetSyncFrontendSubscriber`、`CommonService.Lottery.LotteryPrizeHandler`、`CommonService.Lottery.LotteryPrizeSubscriber`。 + +### 4.4 DI 注册位置 + +- **约定式注册**:`UserHost/Middleware/AutofacModule.cs`(继承 `SharpAbp.Infrastructure.Api.Autofac.ApplicationModule`)。`GetServiceAssemblies()` 扫描三个程序集:`UserService`(接口程序集,`typeof(IUserService).Assembly`)、`UserService.User.UserService` 所在程序集、`CommonService`(`typeof(ApiLogService).Assembly`)。即 `IUserService`/`ITaskService`/各 Service 由其接口自动匹配实现注入。 +- **显式注册**:`Program.cs`(见 4.2)与 `CapExtension.cs`(见 4.3)。 + +### 4.5 中间件 + +- `AutofacModule`(DI)。 +- `ApiLoggingMiddleware`(`UseApiLogging`):只记录以 `/api` 开头且非 OPTIONS 的请求,写 MongoDB `ApiLog`(请求/响应体脱敏 `Data`、耗时、Token、设备/来源/IP/Sign 等头信息)。 + +### 4.6 配置与端口(观察到的实际值,注意不一致) + +- `UserHost/appsettings.json`、`appsettings.Development.json`:仅日志级别与 `AllowedHosts`。 +- `UserHost/Config/system.json`: + - `"urls": "http://*:8001"`; + - `JwtConfig`(SecretKey、关闭 Issuer/Audience/Lifetime 校验等); + - `ConnectionStrings.PgSqlConnection`、`CapConfig`(RabbitMQ + `PGLogHost`); + - `RedisConfig`(Database=1,ConnectionString `defaultDatabase=2`); + - `MongoDbSettings`(`mongodb://localhost:27017`); + - `WXConfig`(微信 AppId/Secret/Url)。 +- `UserHost/Properties/launchSettings.json`:`http` profile 为 `http://localhost:8001`;另有 `https` profile(`https://localhost:7000;http://localhost:5017`)。 +- `UserHost/docker-compose.yaml`:容器 `0524user`,端口映射 `5245:80`。 + +> ⚠️ 存在端口信息不一致:平台总览称网关 8001、UserHost 5245;而 `Config/system.json` 与 launchSettings 的 http profile 均写成 8001。文档据实记录,不作判断。 + +--- + +## 五、代码目录说明(完整目录树) + +``` +UserSrc/ +├── UserApi/ # HTTP 接口层(Controller 程序集,被 UserHost 通过 ApplicationPart 加载) +│ ├── UserApi.csproj # net8.0;引用 CommonService/UserService/UserDomain/AdminDomain/RedisService 等 +│ ├── Program.cs # 占位控制台入口(仅 "Hello, World!"),真实入口在 UserHost +│ ├── AssemblyMarker.cs # 空类,供 UserHost 定位 UserApi 程序集(AddApplicationPart) +│ ├── Login/ +│ │ ├── LoginController.cs # 注册/登录/验证码/改密/时间接口(api/Login) +│ │ └── DateTimeResponse.cs # 服务器时间响应模型 +│ ├── Hall/ +│ │ └── HallController.cs # 大厅:保险箱/道具/商城/签到/炮台/战令/任务/排行榜(api/Hall) +│ ├── User/ +│ │ ├── UserController.cs # 用户资料/资产/邮件/返利(api/User) +│ │ ├── FeedbackController.cs # 用户反馈(api/Feedback) +│ │ └── ImageUploadController.cs # 图片上传(api/ImageUpload) +│ ├── Lottery/ +│ │ └── LotteryController.cs # 抽奖/彩蛋(api/Lottery) +│ ├── ScratchCard/ +│ │ └── ScratchCardController.cs # 刮刮卡(api/ScratchCard) +│ ├── SummonCard/ +│ │ └── SummonCardController.cs # 召唤卡(api/SummonCard) +│ ├── Notices/ +│ │ └── NoticeController.cs # 公告(api/Notice) +│ ├── Faq/ +│ │ └── FaqController.cs # FAQ(注意前缀为 adminapi/Faq) +│ ├── GameConfigs/ +│ │ ├── GameConfigController.cs # 游戏配置(api/GameConfig) +│ │ └── ActivityConfigController.cs # 活动配置(api/ActivityConfig) +│ ├── BeautifulNumber/ +│ │ └── BeautifulNumberController.cs # 靓号(api/BeautifulNumber) +│ └── Dict/ +│ └── DictController.cs # 系统字典(api/Dict,读 SystemDic) +│ +├── UserService/ # 业务服务层 +│ ├── UserService.csproj # net8.0;排除 User\LotteryService.cs 编译 +│ ├── AutoMapperConfig.cs # AutoMapper 映射:UserEntity→UserToken、BaseProduct(Count)、AddKillFishLogCapParam→KillFishLog 等 +│ ├── User/ +│ │ ├── IUserService.cs # 用户服务接口(注册登录/资产/邮件/保险箱/商城/返利等) +│ │ ├── UserService.cs # 用户服务实现(本模块核心,2000+ 行) +│ │ ├── IUserMQService.cs / UserMQService.cs # CAP 订阅:任务完成/资产变更/金币结算/击杀鱼日志 +│ │ ├── IUserLoginLogService.cs / UserLoginLogService.cs # 登录日志查询 +│ │ ├── IUserFeedbackService.cs / UserFeedbackService.cs # 反馈服务 +│ │ ├── ILotteryService.cs # 抽奖接口定义(namespace UserService) +│ │ ├── LotteryService.cs # 【已排除编译】遗留文件(namespace CommonService) +│ │ ├── Param/ # 服务入参 +│ │ │ ├── UserAssetParam.cs # 资产变更参数(核心) +│ │ │ ├── UpdateUserDataParam.cs +│ │ │ ├── SendEmailParam.cs +│ │ │ ├── RegisterUserWeiXinParam.cs +│ │ │ ├── RegisterUserParam.cs +│ │ │ ├── GetUserRewardListParam.cs +│ │ │ ├── GetEmailPageParam.cs +│ │ │ ├── GameCoinsSettlementParam.cs +│ │ │ ├── AddUserPropParam.cs +│ │ │ └── AddKillFishLogCapParam.cs +│ │ └── Response/ +│ │ ├── UserToken.cs # 登录令牌响应(继承 UserEntity + Token) +│ │ ├── RewardEmailResponse.cs +│ │ └── RankingResponse.cs # 排行榜响应 +│ ├── Tasks/ +│ │ ├── ITaskService.cs / TaskService.cs # 任务:日/时任务生成、完成、领奖、战令经验 +│ │ └── Param/ +│ │ ├── GiftResponse.cs # 礼包响应(Gold/Diamond/Exp/Product) +│ │ ├── GetUserTaskListParam.cs +│ │ ├── GetTaskListParam.cs +│ │ └── CompletedTaskParam.cs # CAP 任务完成消息体 +│ ├── BattleOrder/ +│ │ ├── IBattleOrderService.cs / BattleOrderService.cs # 战令:等级/经验/领奖/购买等级/购买进阶 +│ ├── ScratchCard/ +│ │ ├── IScratchCardService.cs / ScratchCardService.cs # 刮刮卡抽奖(道具 40005) +│ ├── SummonCard/ +│ │ ├── ISummonCardService.cs / SummonCardService.cs # 召唤卡(道具 40006) +│ ├── Notices/ +│ │ ├── INoticeService.cs / NoticeService.cs # 公告 +│ │ ├── IFaqService.cs / FaqService.cs # FAQ 分类/问题 +│ │ └── Param/ +│ │ ├── GetNoticeListParam.cs +│ │ ├── AddNoticeParam.cs +│ │ └── UpdateNoticeParam.cs +│ ├── GameConfigs/ +│ │ ├── IGameConfigService.cs / GameConfigService.cs # 游戏配置(Redis 缓存 + Mongo) +│ │ └── IActivityConfigService.cs / ActivityConfigService.cs # 活动配置(Redis 缓存 + Mongo,含过期自动停) +│ ├── BeautifulNumber/ +│ │ ├── IBeautifulNumberService.cs / BeautifulNumberService.cs # 靓号查询/购买/校验 +│ ├── ImageUpload/ +│ │ ├── IImageUploadService.cs / ImageUploadService.cs # 图片上传(限制类型/大小) +│ ├── Hubs/ +│ │ ├── LoginHub.cs # SignalR Hub(路由 /loginhub) +│ │ ├── LoginResultSubscriber.cs # 订阅「登录结果通知」→ 完成等待 + 推送前端 +│ │ ├── LoginSettlementWaiter.cs # 登录结算等待器(内存 TaskCompletionSource) +│ │ ├── AdminNotifySubscriber.cs # 订阅 BackgroundOperation.NotifyUser → 前端推送 +│ │ ├── ConfigChangedSubscriber.cs # 订阅「配置变更」→ 全员 ChangeConfig +│ │ ├── KillAnnounceSubscriber.cs # 订阅「全局击杀公告」→ 调 UserService 广播 +│ │ └── AssetSyncFrontendSubscriber.cs # 订阅「用户资产同步前端」→ 前端 AssetUpdated +│ ├── Jobs/ +│ │ ├── EveryDayTask.cs # 每日 0 点任务(Redis 分布式锁 lock:everyday) +│ │ ├── EveryHourTask.cs # 每小时任务(锁 lock:everyhour;注:Program.cs 未注册该 Job) +│ │ └── RankingRewardJob.cs # 排行榜奖励 Job(锁 lock:rankingreward) +│ └── Response/ +│ └── BattleOrderResponse.cs # 战令相关响应模型(Hall 使用) +│ +├── UserDomain/ # 领域模型(被 RedisService/CommonService/AdminService 等引用) +│ ├── UserDomain.csproj # 声明了空的 Response\ 文件夹(无 .cs) +│ ├── Entity/ +│ │ ├── UserEntity.cs # 用户主实体(集合 user):BaseInfo/Assets/Props/保险箱/VIP/返利等 + Init/LevelVerify/VipLevelVerify +│ │ ├── Order.cs # 订单(集合 order) +│ │ ├── Notice.cs # 公告(集合 notice) +│ │ ├── LotteryEntities.cs # 抽奖记录/用户抽奖状态(lottery_record、lottery_user_status) +│ │ ├── KillFishLog.cs # 击杀鱼日志(按月分表 kill_fish_log{yyyyMMdd},Fish 库) +│ │ ├── UserBattleOrder.cs # 用户战令(集合 user_battle_order) +│ │ ├── ScratchCardRecord.cs # 刮刮卡中奖记录 +│ │ ├── UserFeedback.cs # 用户反馈 +│ │ ├── UserTask.cs # 用户任务 +│ │ ├── UserReward.cs # 资产变动流水(集合 user_reward) +│ │ ├── UserLoginLog.cs # 登录日志 +│ │ └── UserEmail.cs # 用户邮件 +│ ├── Enum/ +│ │ ├── UserAssetChangeTypeEnum.cs # 增加=1 / 减少=2 +│ │ ├── RewardSource.cs # 资产来源枚举(邮件/救济金/保险箱/商城/签到/充值/战令/活动…99 后台操作) +│ │ └── BattleOrderType.cs # 战令类型:普通=1/豪华=2/至尊=3 +│ └── Param/ +│ ├── UserLoginLogQueryParam.cs +│ └── FeedbackParam.cs # AddFeedbackParam/FeedbackQueryParam/ReplyFeedbackParam +│ +└── UserHost/ # 进程入口(Web) + ├── UserHost.csproj # net8.0 Web;链接 nlog.config + ├── UserHost.csproj.user # 本地用户配置(IDE) + ├── Program.cs # 启动装配(见 4.2) + ├── appsettings.json / appsettings.Development.json # 基础配置(日志/AllowedHosts) + ├── docker-compose.yaml # 容器 0524user,映射 5245:80 + ├── .dockerignore + ├── Properties/launchSettings.json # http: localhost:8001;https: 7000/5017 + ├── Config/system.json # urls/JWT/PG/CAP/Redis/Mongo/WX 配置 + ├── Extension/CapExtension.cs # CAP 配置与订阅者注册 + ├── Middleware/ + │ ├── AutofacModule.cs # Autofac 约定式 DI + │ └── ApiLoggingMiddleware.cs # /api 请求日志中间件 + └── wwwroot/ + ├── index.html + └── uploads/ # 静态图片(40001~40301.png 等) +``` + +### 关于根目录 `UserDomain/` 遗留文件夹(重要,勿混淆) + +仓库根目录还存在一个**同名但不同**的文件夹 `UserDomain/`(注意不是 `UserSrc/UserDomain/`): + +- 路径:`UserDomain/Response/BattleOrderResponse.cs` +- 内容:仅一个 `namespace UserDomain.Response` 的文件,内含 `BattleOrderResponse`/`UserBattleOrderInfo`/`BattleOrderConfigInfo`/`BattleOrderLevelInfo`/`BattleOrderAdvanceInfo`/`ReceiveBattleOrderRewardResponse`/`BattleOrderRewardItem`/`BuyBattleOrderLevelResponse`/`BuyBattleOrderAdvanceResponse` 等类。 +- 特征:**该文件夹没有 `.csproj`**,不属于任何项目,也不被解决方案/其它项目引用(历史遗留)。 +- 与正式项目的区别: + - 本模块正式领域项目是 `UserSrc/UserDomain/UserDomain.csproj`(集合实体/枚举/Param,其 csproj 里声明的 `Response\` 文件夹为空)。 + - 战令响应模型**实际使用**的定义在 `UserSrc/UserService/Response/BattleOrderResponse.cs`(`namespace UserService.Response`,被 `HallController` 引用)。 + - 根目录 `UserDomain/Response/BattleOrderResponse.cs` 是被搬迁遗留下的副本,含若干正式项目中已不存在的额外类(如 `BattleOrderRewardItem`、`ReceiveBattleOrderRewardResponse` 的不同字段)。 + +**结论**:讨论「UserDomain」时请以 `UserSrc/UserDomain/`(有 csproj 的正式项目)为准;根目录 `UserDomain/` 为无害的历史遗留,可直接忽略。 + +--- + +## 六、关键文件索引 + +| 文件相对路径 | 职责 | +|---|---| +| `UserSrc/UserHost/Program.cs` | 进程入口与装配(MVC/SignalR/Redis/JWT/CAP/Autofac/健康检查/管道) | +| `UserSrc/UserHost/Extension/CapExtension.cs` | CAP(RabbitMQ + PostgreSQL)配置与订阅者注册 | +| `UserSrc/UserHost/Middleware/AutofacModule.cs` | Autofac 约定式 DI(扫描 UserService/CommonService 程序集) | +| `UserSrc/UserHost/Middleware/ApiLoggingMiddleware.cs` | `/api` 请求响应日志(写入 ApiLog) | +| `UserSrc/UserHost/Config/system.json` | 端口/JWT/PG/CAP/Redis/Mongo/微信 配置 | +| `UserSrc/UserApi/AssemblyMarker.cs` | 供 UserHost 定位并加载 UserApi 程序集 | +| `UserSrc/UserApi/Login/LoginController.cs` | 注册登录、验证码、改密、服务器时间 | +| `UserSrc/UserApi/Hall/HallController.cs` | 大厅核心接口(保险箱/资产/商城/签到/战令/任务/排行榜) | +| `UserSrc/UserApi/User/UserController.cs` | 资料/资产/邮件/返利 | +| `UserSrc/UserApi/User/FeedbackController.cs` | 用户反馈 | +| `UserSrc/UserApi/User/ImageUploadController.cs` | 图片上传 | +| `UserSrc/UserApi/Lottery/LotteryController.cs` | 抽奖(彩蛋) | +| `UserSrc/UserApi/ScratchCard/ScratchCardController.cs` | 刮刮卡 | +| `UserSrc/UserApi/SummonCard/SummonCardController.cs` | 召唤卡 | +| `UserSrc/UserApi/Notices/NoticeController.cs` | 公告 | +| `UserSrc/UserApi/Faq/FaqController.cs` | FAQ(前缀 adminapi/Faq) | +| `UserSrc/UserApi/GameConfigs/GameConfigController.cs` | 游戏配置读取 | +| `UserSrc/UserApi/GameConfigs/ActivityConfigController.cs` | 活动配置读取 | +| `UserSrc/UserApi/BeautifulNumber/BeautifulNumberController.cs` | 靓号 | +| `UserSrc/UserApi/Dict/DictController.cs` | 系统字典 | +| `UserSrc/UserService/User/UserService.cs` | 本模块核心业务实现(注册登录/资产/商城/邮件/保险箱/返利/排行榜) | +| `UserSrc/UserService/User/IUserService.cs` | 用户服务接口 | +| `UserSrc/UserService/User/UserMQService.cs` | CAP 订阅(任务/资产/结算/击杀鱼日志) | +| `UserSrc/UserService/User/UserFeedbackService.cs` | 反馈服务实现 | +| `UserSrc/UserService/User/UserLoginLogService.cs` | 登录日志服务 | +| `UserSrc/UserService/Tasks/TaskService.cs` | 任务与战令经验 | +| `UserSrc/UserService/BattleOrder/BattleOrderService.cs` | 战令业务 | +| `UserSrc/UserService/ScratchCard/ScratchCardService.cs` | 刮刮卡业务 | +| `UserSrc/UserService/SummonCard/SummonCardService.cs` | 召唤卡业务 | +| `UserSrc/UserService/Notices/NoticeService.cs` | 公告服务 | +| `UserSrc/UserService/Notices/FaqService.cs` | FAQ 服务 | +| `UserSrc/UserService/GameConfigs/GameConfigService.cs` | 游戏配置(缓存策略) | +| `UserSrc/UserService/GameConfigs/ActivityConfigService.cs` | 活动配置(缓存策略) | +| `UserSrc/UserService/BeautifulNumber/BeautifulNumberService.cs` | 靓号服务 | +| `UserSrc/UserService/ImageUpload/ImageUploadService.cs` | 图片上传服务 | +| `UserSrc/UserService/Hubs/LoginHub.cs` | SignalR 登录 Hub(/loginhub) | +| `UserSrc/UserService/Hubs/LoginResultSubscriber.cs` | 登录结算结果订阅并推送前端 | +| `UserSrc/UserService/Hubs/LoginSettlementWaiter.cs` | 登录结算等待器 | +| `UserSrc/UserService/Hubs/AdminNotifySubscriber.cs` | 后台通知 CAP 订阅 → 前端推送 | +| `UserSrc/UserService/Hubs/ConfigChangedSubscriber.cs` | 配置变更 CAP 订阅 → 全员刷新 | +| `UserSrc/UserService/Hubs/KillAnnounceSubscriber.cs` | 击杀公告 CAP 订阅 | +| `UserSrc/UserService/Hubs/AssetSyncFrontendSubscriber.cs` | 资产同步前端 CAP 订阅 | +| `UserSrc/UserService/Jobs/EveryDayTask.cs` | 每日 0 点定时任务 | +| `UserSrc/UserService/Jobs/RankingRewardJob.cs` | 排行榜奖励定时任务 | +| `UserSrc/UserService/AutoMapperConfig.cs` | AutoMapper 映射配置 | +| `UserSrc/UserDomain/Entity/UserEntity.cs` | 用户主实体及内嵌模型(Assets/Props/PlayerFactor/StaticInfo 等) | +| `UserSrc/UserDomain/Entity/UserReward.cs` | 资产变动流水实体 | +| `UserSrc/UserDomain/Enum/RewardSource.cs` | 资产来源枚举(流水用) | +| `UserSrc/UserDomain/Param/FeedbackParam.cs` | 反馈相关入参 | +| `UserDomain/Response/BattleOrderResponse.cs` | 根目录遗留副本(无 csproj,未使用) | + +--- + +## 七、与其他模块的交互 + +### 7.1 CAP / RabbitMQ 消息主题 + +主题常量定义于 `CommonDomain/TopicKeys.cs`(前缀统一为 `Topic_0524_`)。本模块涉及: + +**本模块发布(Publish)** + +| 主题(常量 → 实际值) | 发布位置 | 说明 | +|---|---|---| +| `TopicKeys.登录绑定` → `Topic_0524_LoginBind` | `LoginHub.Bind` | 玩家重新登录后请求旧房间结算,携带 `LoginBindMessage{UserId,OperationId}` | +| `TopicKeys.拒绝回房` → `Topic_0524_DismissPendingRoom` | `LoginHub.DismissPendingRoom` | 放弃回旧房间 | +| `TopicKeys.任务完成` → `Topic_0524_CompletedTask` | `UserService.LoginToken`(登录任务)、`UserService.BuyDiamondPayCallBack`(充值任务) | 上报任务进度 | +| `TopicKeys.用户资产变更` → `Topic_0524_UserAssetsChanged` | `BattleOrderService`(购买战令等级/进阶) | 触发资产扣减 | +| `TopicKeys.用户资产同步前端` → `Topic_0524_UserAssetSyncFrontend` | `UserService.BuyGold`、`UserService.GameCoinsSettlement`、`UserService.UpdateAssets` | 资产变更通知前端 | +| `TopicKeys.召唤卡出鱼` → `Topic_0524_SummonCardFish` | `SummonCardService.Use` | 通知鱼房生成 Boss/黄金鱼 | +| `"BackgroundOperation.NotifyUser"`(字符串) | `UserService.UpdateAssets`(升级 `level_change`) | 后台→前端通知 | +| `"Lottery.DrawPrize"`(字符串,在 `CommonService/LotteryService.cs`) | 抽奖发奖 | 抽奖中奖事件 | + +**本模块订阅(Subscribe)** + +| 主题 | 订阅者 | 处理 | +|---|---|---| +| `Topic_0524_登录结果通知`(`TopicKeys.登录结果通知`) | `LoginResultSubscriber` | 结束等待、向前端推 `LoginSettlementCompleted` | +| `Topic_0524_配置变更`(`TopicKeys.配置变更`) | `ConfigChangedSubscriber` | 全员推 `ChangeConfig`(ActivityConfig=1/GameConfig=2) | +| `Topic_0524_全局击杀公告` | `KillAnnounceSubscriber` | 调 `UserService.SendKillAnnouncement` 全服推 `KillAnnouncement` | +| `Topic_0524_用户资产同步前端` | `AssetSyncFrontendSubscriber` | 向前端推 `AssetUpdated` | +| `BackgroundOperation.NotifyUser` | `AdminNotifySubscriber` | `new_email`/`backpack_*`/`level_change`/资产 多类前端推送 | +| `Topic_0524_任务完成` | `UserMQService.CompletedTask` | 任务计数/完成 | +| `Topic_0524_用户资产变更` | `UserMQService.UserAssetChange` | 调 `UserService.UpdateAssets` | +| `Topic_0524_游戏金币结算` | `UserMQService.GameCoinsSettlement` | 调 `UserService.GameCoinsSettlement` | +| `Topic_0524_击杀鱼日志` | `UserMQService.KillFishLog` | 映射写入 `KillFishLog` | +| `"test"` | `UserMQService.Test` | 占位 | + +> 另外,`CapExtension` 还注册了 `CommonService.Lottery.LotteryPrizeSubscriber` / `LotteryPrizeHandler`(抽奖发奖处理,位于 CommonService 项目)。 + +### 7.2 Redis Key / 登录态 / 验证码 + +通过 `IRedisService`(`RedisService` 项目)访问,本模块使用到: + +- **验证码**:`RedisKey.VerificationCode`(`{ServicePrefix}:verification_code:{0}`,按手机号),写入 TTL 5 分钟(`RedisService.SetVerificationCode`)。登录/改密/绑手机/重置保险箱密码均校验它。当前 `SendMobileCode` 固定下发 `000000`。 +- **登录态(RedisUserCid)**:`GetRedisUserCId/SetRedisUserCId`(含 `LoginCId`、`CId`、`RoomId`)、`SetLoginUserId/GetLoginUserId(cid→userId)/RemoveLoginUserId`、`RemoveUserId`。用于 LoginHub 绑定/踢线、判断在线。 +- **待回房**:`GetPendingFishRoomId`、`GetPendingChessRoomId`(登录时判断玩家是否需回到捕鱼/象棋房间)。 +- **房间**:`GetGameRoom/SetGameRoom`(读取/更新房间玩家,用于旧房间结算与召唤卡校验)。 +- **分布式锁**:`IDistributedLock.TryExecuteAsync`。注册用 `RedisKey.DistributedLockPrefix + "user:register:mobile:{mobile}"`(`RedisKey.DistributedLockPrefix` = `{ServicePrefix}:lock:`);资产/保险箱用 `user:asset:update:{userId}`、`user:safebox:{userId}`;Job 用 `lock:everyday`/`lock:everyhour`/`lock:rankingreward`。 +- **捕鱼返利消费**:`fishing:consume:{userId}:{yyyyMMdd}`(`IncrBy` 累加,领取时刷入 `UserEntity.FishingReturn`)。 +- **配置缓存**:`GetGameConfig/SetGameConfig`、`GetActivityConfig/SetActivityConfig`、`GetFishingKillConfig/SetFishingKillConfig`、`SetSystemGoldDay`。 + +### 7.3 HTTP 调用(外部) + +- **微信**:`LoginController` 通过 `WXBaseHelper` 调用微信接口(`WXConfig.Url = https://api.weixin.qq.com`)——`GetAccessToken`、按 `js_code` 换取会话(`GetAccessTokenByCode`)。 +- 模块内未见对其余外部 HTTP 服务的直接调用。 + +### 7.4 共享实体 / 项目引用(跨模块耦合点) + +- `UserSrc/UserDomain`(`UserDomain.csproj`)被以下项目引用:`RedisService`、`CommonService`、`AdminService`、`UserService`、`UserApi`。其 `Entity/Enum/Param` 是跨模块共享的领域模型(如 `UserReward`、`LotteryRecord`、`KillFishLog`、`UserLoginLog`、`UserFeedback` 等)。 +- `UserApi` 引用 `AdminSrc/AdminDomain`(靓号 `BeautifulNumberConfig`、字典 `SystemDic` 等)与 `CommonService`(抽奖实现、`ApiLogService`)。 +- `UserService` 引用 `CommonDomain`(`GameConfig`/`ActivityConfig`/`FaqCategory`/`FaqQuestion`/`GameTask`/`GameTypeEnum`/`TopicKeys`/`BaseProduct` 等)与 `AdminDomain`。 + +### 7.5 与棋牌/捕鱼服务的登录绑定流程(涉及) + +1. 玩家连接 `/loginhub` 并调用 `Bind(userId)`;`LoginHub` 写入/更新 Redis 登录态(`LoginCId`/`CId`),并踢掉旧连接(`AccountKicked`、`KickToMainPage`,必要时 `Abort` 旧连接)。 +2. 若 Redis 中存在该用户的房间(`RoomId`)或 pending 捕鱼/象棋房间,则生成 `OperationId`,向 `Topic_0524_LoginBind` 发布 `LoginBindMessage`,并在 `LoginSettlementWaiter` 上等待(超时 15s)。 +3. 对应游戏服务处理旧房间并回发 `Topic_0524_LoginBindResult`;`LoginResultSubscriber` 收到后 `LoginSettlementWaiter.Complete`,并通过 Hub 向该用户组推 `LoginSettlementCompleted{roomId,success}`。 +4. 玩家也可调用 `DismissPendingRoom`,发 `Topic_0524_DismissPendingRoom` 放弃回旧房间。 +5. 另一条路径:HTTP 登录(`UserService.Login/LoginWx/LoginByPassword`)成功后调用 `HandleLoginRoomSettlementAsync`,若玩家仍在房间内,则用 `GameCoinsSettlement` 对房间内金币变化做落库结算并移出房间、清空 Redis 房间态。 + +> 补充:`UserService.GameCoinsSettlement` 也作为 CAP 订阅(`Topic_0524_GameCoinsSettlement`)被 `UserMQService` 调用,用于游戏服务的金币结算入账,并回推 `Topic_0524_UserAssetSyncFrontend` 与 SignalR `AssetUpdated`。 \ No newline at end of file diff --git a/docs/03-客服模块-CustomerSrc.md b/docs/03-客服模块-CustomerSrc.md new file mode 100644 index 0000000..bf5d792 --- /dev/null +++ b/docs/03-客服模块-CustomerSrc.md @@ -0,0 +1,358 @@ +# 客服模块(CustomerSrc)—— 功能与代码目录文档 + +> 本文档为「客服模块(CustomerSrc)」的完整上下文说明,供其他对话 / 开发者理解本模块时使用。所有内容均基于 `d:\BUYUHouDuanNet\BuYu\CustomerSrc\` 下的实际源代码整理,路径统一以解决方案根目录 `d:\BUYUHouDuanNet\BuYu` 为基准使用相对路径。 + +--- + +## 一、平台背景与模块位置 + +本模块是「捕鱼 + 棋牌游戏运营平台后端」的一部分。平台整体技术栈与运行形态如下: + +* **解决方案**:`Template0524.sln` +* **技术栈**:.NET 8 + MongoDB + Redis + RabbitMQ(通过 DotNetCore.CAP 集成)+ SignalR + Ocelot 网关 + NLog + Autofac + AutoMapper +* **网关(Ocelot)**:监听 `http://localhost:8001`,按前缀将请求反向代理到各业务进程: + * `/adminapi` → AdminHost(5241) + * `/api`、`/loginhub` → UserHost(5245) + * `/customerapi`、`/customerHub` → **CustomerHost(5247,本模块)** + * `/chess`、`/chessgamehub` → ChessGameHost(5242) + * `/fishingroomhub` → FishRoomHost(5244) + * `/gamehub` → FishGameHost(5248) + +**本模块(客服 / 客服 IM)在解决方案中的位置:** + +* 源码根目录:`CustomerSrc/`,解决方案中作为独立解决方案文件夹 `CustomerSrc` 存在(`Template0524.sln` 第 68~80 行)。 +* 进程入口:`CustomerSrc/CustomerHost`,对外监听端口在 `Gateway/ocelot.json` 中被指向 **5247**(`DownstreamPathTemplate` 为 `/customerapi/{everything}` 与 `/customerHub/{everything}`,下游 Host 均为 `localhost:5247`)。 +* 对外路由前缀:**`/customerapi`**(HTTP 接口)与 **`/customerHub`**(SignalR 长连接 Hub)。 + +> 补充说明(与代码核对):`CustomerSrc/CustomerHost/docker-compose.yaml` 将容器端口 `5247:80` 映射,即容器内在 80 端口提供服务、宿主机映射为 5247;`CustomerSrc/CustomerHost/Config/system.json` 中 `urls` 为 `http://*:8006`;`CustomerSrc/CustomerHost/Properties/launchSettings.json` 中开发调试地址为 `https://localhost:38200;http://localhost:38201`。三者为不同运行方式下的监听配置,网关实际指向的是 5247。 + +--- + +## 二、模块简介 + +### 2.1 定位与职责 + +CustomerSrc 是一个**客服 IM(即时会话)模块**,为游戏平台的用户与人工客服之间提供一对一的在线聊天能力。核心职责: + +1. **客服在线状态管理**:客服上线 / 下线,并把在线客服写入 Redis 列表,供用户发起会话时选择。 +2. **会话(Conversation)生命周期管理**:用户发起会话、按在线客服负载分配客服、结束会话。 +3. **消息(Message)收发与存储**:以 MongoDB 持久化每条消息,并通过 SignalR 实时推送给会话组。 +4. **客服工作台支持**:客服查看自己的会话列表、历史消息、未读数、标记已读。 +5. **图片上传**:为聊天消息提供图片上传能力。 + +### 2.2 业务角色与关键约定 + +* **用户(玩家)**:会话发起方,`SenderType = 1`。 +* **客服**:会话接待方,`SenderType = 2`(由后台 Admin 模块创建客服账号并维护,见第七节)。 +* **会话状态 `Status`**:`1` = 进行中,`2` = 已结束(`EndConversation` 会置为 2 并写入 `EndTime`)。 +* **消息内容类型 `ContentType`**:整型标识(1 文本 / 2 图片等由前端约定,代码中仅透传存储,不做枚举约束)。 +* **在线标记**:在线客服 ID 列表存放于 Redis 列表键 `customer-service:online`(由 `RedisKey.CUSTOMER_ONLINE_KEY` → `RedisKeyGenerator.CustomerKey("online")` 生成,前缀映射 `customer` → `customer-service`)。 + +### 2.3 核心业务流程(以代码为准) + +**(一)客服上线** +1. 后台把某用户的 `CustomerEntity` 加入客服集合(Admin 模块负责,见第七节)。 +2. 客服端调用 `POST /customerapi/customer/status`,`status = 1`;服务端 `UpdateCustomerStatus` 更新 / 新建 `customer` 记录,并将该用户 ID 加入 Redis 在线列表 `customer-service:online`;`status != 1` 时从列表移除。 +3. 前端建立 SignalR 连接 `/customerHub`,`OnConnectedAsync` 会依据 JWT 中的 `uid` 声明把连接加入分组 `customer_{uid}`,客服由此接收分配给自己的新会话事件。 + +**(二)用户发起会话** +1. 用户(或前端)调用 `POST /customerapi/customer/start`,或通过 Hub 方法 `StartConversation` / `SendMessage`(当 `conversationId` 为空且 `SenderType == 1` 时自动发起)。 +2. 服务端 `StartConversation` 读取 Redis 在线客服列表 → 对每位在线客服统计其「进行中会话数」(`Status == 1`)→ 选取会话数最少的客服(负载均衡)→ 生成 `ConversationEntity` 并落库;若无客服在线则返回「暂无客服在线」。 +3. Hub 侧在会话创建成功后,向该客服所在分组 `customer_{CustomerId}` 广播事件 `OnNewConversation`,并把发起者连接加入会话分组。 + +**(三)收发消息** +1. 客户端调用 `POST /customerapi/customer/message`,或通过 Hub 方法 `SendMessage(...)`。 +2. 服务端 `SendMessage` 生成 `MessageEntity`(含会话 ID、发送者类型 / ID / 名称 / 头像、内容类型、内容、时间)写入 MongoDB。 +3. Hub 侧写入成功后,向会话分组 `conversationId` 广播 `OnMessageReceived` 事件(携带 `GuId`、`ConversationId`、`SenderType`、`SenderId`、`SenderName`、`SenderAvatar`、`ContentType`、`Content`、`CreateTime`)。 + +**(四)客服接待与收尾** +1. 客服调用 `GET /customerapi/customer/conversations?customerId=xxx` 获取自己的会话列表(含最后一条消息、未读数、消息明细)。 +2. 进入会话后调用 `GET /customerapi/customer/messages/{conversationId}` 拉取历史消息。 +3. 客服调用 `POST /customerapi/customer/mark-read` 标记已读(更新该用户会话的 `LastReadTime`)。 +4. 会话结束后调用 `POST /customerapi/customer/end`,`Status` 置 2、写入 `EndTime`。 + +**(五)用户侧查询** +* `GET /customerapi/customer/my-conversations`:从 JWT 取当前登录用户 `uid`,返回该用户最近 1 条会话(含消息与未读数)。 + +--- + +## 三、业务功能清单 + +### 3.1 HTTP 接口 —— CustomerController + +路由前缀:`customerapi/[controller]`,即实际路径 **`/customerapi/customer/...`**。 +控制器继承 `BaseController`(`CommonInfrastructure`),返回统一响应体(`BaseResponse` / `ListResponse`)。 + +| 方法 | 路由(相对 `/customerapi/customer`) | 请求参数 | 用途 | +| --- | --- | --- | --- | +| POST | `/start` | `StartConversationParam { UserId, UserName }` | 用户发起会话,返回 `ConversationEntity`;无在线客服时返回失败 | +| POST | `/message` | `SendMessageParam { ConversationId, SenderType, SenderId, SenderName, SenderAvatar, ContentType, Content }` | 发送一条消息并落库 | +| GET | `/messages/{conversationId}` | 路径参数 `conversationId` | 获取某会话的全部历史消息(按时间升序) | +| GET | `/conversations` | 查询参数 `customerId`(可空) | 客服获取会话列表;为空时返回全部会话 | +| GET | `/my-conversations` | 无(取 JWT `uid`) | 当前用户最近一条会话(含 `Messages`、`LastMessage`、`UnreadCount`) | +| POST | `/end` | `EndConversationParam { ConversationId }` | 结束会话(Status=2,写 EndTime) | +| GET | `/online` | 无 | 获取当前在线客服列表(`CustomerEntity`) | +| POST | `/status` | `UpdateStatusParam { UserId, Status }` | 客服上线 / 下线,维护 Redis 在线列表 | +| POST | `/mark-read` | `MarkReadParam { CustomerId, UserId }` | 客服标记会话已读(更新 `LastReadTime`) | +| GET | `/chatlog/{conversationId}` | 路径参数 `conversationId` | 获取会话聊天记录(内部复用 `GetMessages`) | + +### 3.2 HTTP 接口 —— ImageUploadController + +路由前缀:`customerapi/[controller]`,实际路径 **`/customerapi/imageupload/upload`**。 + +| 方法 | 路由 | 用途 | +| --- | --- | --- | +| POST | `/customerapi/imageupload/upload` | 接收 `IFormFile file`,以 GUID 重命名后保存到 `wwwroot/uploads/`,返回 `{ Path = "uploads/{guid}{ext}" }` | + +### 3.3 SignalR Hub —— CustomerHub + +连接地址:**`/customerHub`**(仅允许 WebSockets 传输,见 `Program.cs` 的 `MapHub` 配置)。 + +**客户端 → 服务端可调用方法:** + +| 方法 | 参数 | 作用 | +| --- | --- | --- | +| `JoinConversation` | `conversationId` | 把当前连接加入会话分组 `conversationId` | +| `LeaveConversation` | `conversationId` | 退出会话分组 | +| `JoinCustomerQueue` | `customerId` | 加入分组 `customer_{customerId}`(客服队列) | +| `LeaveCustomerQueue` | `customerId` | 退出分组 `customer_{customerId}` | +| `SendMessage` | `conversationId, senderType, senderId, senderName, senderAvatar, contentType, content, guId=""` | 发送消息;当 `conversationId` 为空且 `senderType==1` 时先自动发起会话(并广播 `OnNewConversation`),随后广播 `OnMessageReceived` | +| `StartConversation` | `userId, userName` | 发起会话,向调用方回发 `OnConversationStarted`,并向对应客服分组广播 `OnNewConversation` | + +**服务端 → 客户端推送事件:** + +| 事件名 | 触发时机 | 附带数据 | +| --- | --- | --- | +| `OnMessageReceived` | 消息写入成功后,向会话分组广播 | `GuId, ConversationId, SenderType, SenderId, SenderName, SenderAvatar, ContentType, Content, CreateTime` | +| `OnConversationStarted` | `StartConversation` 成功,回发给发起连接 | `ConversationEntity` | +| `OnNewConversation` | 新会话创建成功,向客服分组 `customer_{CustomerId}` 广播 | `conversationId, customerId, customerName, userId, userName, status, createTime` | +| `ErrorMessage` | 参数错误 / 会话创建失败 / 异常 | 错误字符串 | + +**连接生命周期:** + +* `OnConnectedAsync`:读取 `Context.User` 的 `uid` 声明,非空则加入分组 `customer_{uid}`。 +* `OnDisconnectedAsync`:仅调用基类实现(不做额外清理)。 + +--- + +## 四、项目结构与技术要点 + +CustomerSrc 由 4 个项目组成,依赖关系如下(`→` 表示引用): + +``` +CustomerHost (可执行进程, Web SDK, net8.0) + → CustomerApi + → RedisService + → SharpAbp.Infrastructure.Api + → (间接)CustomerService → CustomerService.Domain + +CustomerApi (Web SDK, net8.0, 实为类库,含 AssemblyMarker) + → CustomerService + → CommonDomain / CommonInfrastructure / Common / JWTHelper + → MongoRepository / RabbitMQHelper / RedisHelper / SharpAbp.Infrastructure.Api + → RedisService / CommonService + +CustomerService (类库, net8.0) + → CustomerService.Domain + → CommonDomain / CommonInfrastructure / Common / JWTHelper + → MongoRepository / RabbitMQHelper / RedisHelper / RedisService + +CustomerService.Domain (类库, net8.0) + → CommonDomain + → MongoRepository +``` + +### 4.1 各 csproj 框架与关键依赖 + +| 项目 | SDK / 目标框架 | 关键 NuGet 包 | 关键项目引用 | +| --- | --- | --- | --- | +| `CustomerSrc/CustomerApi/CustomerApi.csproj` | `Microsoft.NET.Sdk.Web`,`net8.0` | 无自有 PackageReference(依赖由引用项目传递) | CommonDomain、CommonInfrastructure、Common、JWTHelper、MongoRepository、RabbitMQHelper、RedisHelper、SharpAbp.Infrastructure.Api、RedisService、CommonService、**CustomerService** | +| `CustomerSrc/CustomerHost/CustomerHost.csproj` | `Microsoft.NET.Sdk.Web`,`net8.0` | Microsoft.AspNetCore.Mvc.NewtonsoftJson 8.0.24、Microsoft.AspNetCore.SignalR.StackExchangeRedis 8.0.0、NLog.Web.AspNetCore 6.1.2、Autofac 8.3.0、Autofac.Extensions.DependencyInjection 10.0.0、AutoMapper 14.0.0、DotNetCore.CAP 8.3.4、DotNetCore.CAP.Dashboard 8.3.4、DotNetCore.CAP.PostgreSql 8.3.4、DotNetCore.CAP.RabbitMQ 8.3.4 | RedisService、**CustomerApi**、SharpAbp.Infrastructure.Api | +| `CustomerSrc/CustomerService/CustomerService.csproj` | `Microsoft.NET.Sdk`,`net8.0` | AutoMapper 14.0.0 | CommonDomain、CommonInfrastructure、Common、JWTHelper、MongoRepository、RabbitMQHelper、RedisHelper、RedisService、**CustomerService.Domain** | +| `CustomerSrc/CustomerService.Domain/CustomerService.Domain.csproj` | `Microsoft.NET.Sdk`,`net8.0` | MongoDB.Bson 3.6.0 | CommonDomain、MongoRepository | + +> CustomerHost.csproj 另外通过 `` 引入解决方案根的 `nlog.config`(`CopyToOutputDirectory=PreserveNewest`),并声明把 `Config/system.json`、`docker-compose.yaml`、`Dockerfile` 复制到输出目录;项目内含 `wwwroot\uploads\` 文件夹占位。 + +### 4.2 进程入口要点(CustomerHost/Program.cs) + +* **环境变量**:启动时设置 `SERVICE_NAME`(默认取入口程序集名,即 CustomerHost)与 `INSTANCE_ID`(默认 `default`)。 +* **控制器装配**:`AddControllers().AddApplicationPart(typeof(AssemblyMarker).Assembly)` 显式加载 `CustomerApi` 程序集中的控制器;`AddControllersAsServices()` 使控制器走 DI 容器。 +* **JSON 序列化**:追加 Newtonsoft.Json 配置,日期格式 `yyyy-MM-dd HH:mm:ss`,`DateTimeZoneHandling = Local`。 +* **配置加载**:`AddJsonFile(Path.Combine("Config","system.json"))`,绑定 `MongoDbSettings` 与 `IMongoDbSettings`。 +* **AutoMapper**:`AddAutoMapper(typeof(CustomerService.AutoMapperConfig))`。 +* **健康检查**:`AddHealthChecks().AddCheck("self", ...)`,映射 `/health` 返回 JSON 明细。 +* **SignalR 配置**:`AddSignalR` 设置 `MaximumReceiveMessageSize=64KB`、`StreamBufferCapacity=512`、`ClientTimeoutInterval=70s`、`KeepAliveInterval=15s`;启用 `AddJsonProtocol()` 与 `AddStackExchangeRedis(RedisConfig:ConnectionString)`,Redis 频道前缀 `RedisChannel.Literal("CustomerHub")`(多实例横向扩展时的背板)。 +* **CORS**:名为 `Cors` 的策略,允许任意 Origin / Header / Method,且 `AllowCredentials()`。 +* **鉴权 / 缓存 / 消息**:`AddCustomJwt`(JWTHelper 扩展)、`AddRedisCache`(RedisHelper 扩展)、`AddCap`(自定义 CAP 扩展,见 4.4)。 +* **DI 容器**:`UseServiceProviderFactory(new AutofacServiceProviderFactory())` + `RegisterModule()`。 +* **中间件管线(顺序)**:开发环境异常页 → `UseCors("Cors")` → 静态文件(`RequestPath = "/uploads"`,物理目录 `wwwroot`,启动时自动创建 `wwwroot/uploads`)→ `UseRouting` → `UseAuthentication` → `UseAuthorization` → `UseApiLogging()` → `MapHub("/customerHub", WebSockets)` → `MapControllers()` → `UseGlobalExceptionHandler()` → `MapHealthChecks("/health")` → `Run`。 + +### 4.3 DI 注册位置(CustomerHost/Middleware/AutofacModule.cs) + +`AutofacModule` 继承 `SharpAbp.Infrastructure.Api.Autofac.ApplicationModule`: + +* `CurrentAssembly` = CustomerHost 程序集。 +* `GetServiceAssemblies()` 返回 `ICustomerService` 所在程序集(CustomerService)、`CustomerService.Customer.CustomerService` 所在程序集、`ApiLogService` 所在程序集(CommonService)。 +* 基类 `ApplicationModule.Load` 统一注册: + * `MongoBaseRepository<>` → `IMongoBaseRepository<>`(InstancePerLifetimeScope) + * `MongoBaseService<>` → `IMongoBaseService<>`(InstancePerLifetimeScope) + * `RedisService` → `IRedisService` + * 各程序集中类名以 `Service` 结尾的非抽象类型按接口注册;类名以 `Repository` 结尾的同样按接口注册。 + +因此 `ICustomerService` / `CustomerService` 以及三个 `IMongoBaseRepository` 均通过 Autofac 自动注入。 + +### 4.4 CAP / RabbitMQ 配置(CustomerHost/Extension/CapExtension.cs) + +`AddCap` 扩展注册 DotNetCore.CAP: + +* 启用 Dashboard(`UseDashboard()`)。 +* 传输层用 RabbitMQ:Host/UserName/Password/VirtualHost 取自 `CapConfig:*`,交换机名 `cap.exchange`。 +* 存储层用 PostgreSQL:连接串 `CapConfig:PGLogHost`,Schema `public`。 +* 成功消息保留 7 天;失败重试 5 次、间隔 10(秒);提供 `FailedThresholdCallback` 回调(当前回调体为空实现)。 + +> 说明:本模块代码中**未发现**发布 / 订阅任何 CAP 消息或 `[CapSubscribe]` 处理器;CAP 仅完成框架级接入与 Dashboard 可用。 + +### 4.5 SignalR 分组模型 + +| 分组名 | 含义 | 加入方式 | +| --- | --- | --- | +| `{conversationId}` | 单个会话的参与者 | `JoinConversation`,或发送 / 发起消息时自动加入 | +| `customer_{customerId}` | 某客服的所有连接(客服队列) | `JoinCustomerQueue`,客服连接建立时按 `uid` 自动加入 | + +### 4.6 API 日志中间件(CustomerHost/Middleware/ApiLoggingMiddleware.cs) + +* 仅当请求路径 **以 `/api` 段开头**(`StartsWithSegments("/api")`)且非 `OPTIONS` 时记录日志;记录前读取请求体(POST)、包裹响应流以捕获响应体,并对响应体中的 `BaseResponse.Data` 做脱敏(置空后再序列化)。 +* 采集 Header:`Token、Version、User-Agent、Source、DeviceId、Device、Ip、Sign`,组装 `ApiLog` 后经 `IApiLogService.InsertOneAsync` 落库。 + +> 注意(实测代码行为):本模块对外路由前缀为 `/customerapi`,其首段为 `customerapi`,**不等于** `/api` 段,因此 `ApiLoggingMiddleware` 的判断条件不会命中的 `/customerapi/*` 请求,即本模块 HTTP 接口目前不会被该中间件记录(仅经典的 `/api` 前缀才记录)。 + +--- + +## 五、代码目录说明 + +> 以下目录树基于 `CustomerSrc/` 实际文件(已排除 `bin/`、`obj/` 编译产物)完整列出。 + +``` +CustomerSrc/ +├── CustomerApi/ # HTTP 接口 + SignalR Hub 定义(类库工程,含 AssemblyMarker) +│ ├── Controllers/ +│ │ ├── CustomerController.cs # 客服会话/消息相关接口(start/message/messages/conversations/end/online/status/mark-read/chatlog) +│ │ └── ImageUploadController.cs # 聊天图片上传接口(/customerapi/imageupload/upload) +│ ├── Hubs/ +│ │ └── CustomerHub.cs # SignalR Hub:加入分组、发送消息、发起会话及事件广播 +│ ├── Properties/ +│ │ └── launchSettings.json # CustomerApi 调试配置(applicationUrl https://localhost:8007/) +│ ├── wwwroot/ +│ │ └── uploads/ # 图片上传落盘目录 +│ │ └── e6f31921718c4a10aed90f483f005130.png # 已上传的示例图片文件 +│ ├── .dockerignore # Docker 构建忽略规则 +│ ├── CustomerApi.csproj # Web SDK / net8.0,引用 CustomerService 等 +│ └── Program.cs # 占位入口:提示使用 CustomerHost 运行;定义 AssemblyMarker +│ +├── CustomerHost/ # 进程入口(可执行 Web 工程) +│ ├── Config/ +│ │ └── system.json # 运行配置:urls、JWT、PG、CAP、Redis、Mongo、CustomerService 段 +│ ├── Extension/ +│ │ └── CapExtension.cs # AddCap 扩展:CAP + RabbitMQ + PostgreSQL 存储 + Dashboard +│ ├── Middleware/ +│ │ ├── ApiLoggingMiddleware.cs # /api 请求日志采集中间件(含响应脱敏) +│ │ └── AutofacModule.cs # Autofac 模块:注册 Service/Repository 程序集 +│ ├── Properties/ +│ │ └── launchSettings.json # 调试端口配置(https://localhost:38200;http://localhost:38201) +│ ├── CustomerHost.csproj # Web SDK / net8.0,含 SignalR/CAP/NLog/Autofac 等包 +│ ├── docker-compose.yaml # 容器编排:0524customer 镜像,端口 5247:80 +│ └── Program.cs # 进程入口:DI、SignalR、CORS、JWT、Redis、CAP、中间件与 Hub 映射 +│ +├── CustomerService/ # 业务服务层 +│ ├── Customer/ +│ │ ├── ICustomerService.cs # 客服服务接口(会话/消息/在线状态/已读) +│ │ └── CustomerService.cs # 客服服务实现(Mongo + Redis) +│ ├── AutoMapperConfig.cs # AutoMapper Profile(当前为空配置) +│ └── CustomerService.csproj # 类库 / net8.0,AutoMapper 14.0.0 +│ +└── CustomerService.Domain/ # 领域模型层 + ├── Entity/ + │ ├── ConversationEntity.cs # 会话实体(集合 conversation) + │ ├── CustomerEntity.cs # 客服实体(集合 customer) + │ └── MessageEntity.cs # 消息实体(集合 message) + ├── Response/ + │ └── ConversationResponse.cs # 会话响应模型(继承会话实体 + 最后消息/未读数/消息列表) + └── CustomerService.Domain.csproj # 类库 / net8.0,MongoDB.Bson 3.6.0 +``` + +--- + +## 六、关键文件索引 + +| 文件相对路径 | 职责 | +| --- | --- | +| `CustomerSrc/CustomerHost/Program.cs` | 进程入口:服务注册(控制器 / SignalR / CORS / JWT / Redis / CAP / AutoMapper / 健康检查)、Autofac 容器、中间件管线、`/customerHub` 与 `/health` 映射 | +| `CustomerSrc/CustomerHost/Config/system.json` | 运行配置:`urls=http://*:8006`、`JwtConfig`、`ConnectionStrings:PgSqlConnection`、`CapConfig`、`RedisConfig`、`MongoDbSettings`、`CustomerService` 段 | +| `CustomerSrc/CustomerHost/Middleware/AutofacModule.cs` | Autofac 模块,声明需要扫描注册 Service/Repository 的程序集 | +| `CustomerSrc/CustomerHost/Middleware/ApiLoggingMiddleware.cs` | `/api` 请求日志中间件(请求/响应采集、响应脱敏、落库 ApiLog) | +| `CustomerSrc/CustomerHost/Extension/CapExtension.cs` | `AddCap` 扩展:CAP + RabbitMQ + PostgreSQL + Dashboard | +| `CustomerSrc/CustomerHost/docker-compose.yaml` | 容器编排,端口映射 `5247:80` | +| `CustomerSrc/CustomerHost/Properties/launchSettings.json` | 本地调试端口配置 | +| `CustomerSrc/CustomerApi/Program.cs` | 占位入口(提示由 CustomerHost 运行),并定义 `AssemblyMarker` 供 Host 加载程序集 | +| `CustomerSrc/CustomerApi/Controllers/CustomerController.cs` | 客服 HTTP 接口:发起/结束会话、收发消息、会话与消息查询、在线客服、状态更新、标记已读;含各请求参数类 | +| `CustomerSrc/CustomerApi/Controllers/ImageUploadController.cs` | 图片上传接口,保存至 `wwwroot/uploads` 并返回相对路径 | +| `CustomerSrc/CustomerApi/Hubs/CustomerHub.cs` | SignalR Hub:分组加入/退出、发送消息、发起会话、连接生命周期、事件广播(OnMessageReceived / OnConversationStarted / OnNewConversation / ErrorMessage) | +| `CustomerSrc/CustomerService/Customer/ICustomerService.cs` | 客服服务接口定义 | +| `CustomerSrc/CustomerService/Customer/CustomerService.cs` | 客服服务实现:会话负载分配、消息落库、会话/消息查询、在线状态(Redis)、标记已读、客服查询 | +| `CustomerSrc/CustomerService/AutoMapperConfig.cs` | AutoMapper Profile(当前无映射配置) | +| `CustomerSrc/CustomerService.Domain/Entity/ConversationEntity.cs` | 会话实体,`BsonCollection("conversation", data_0524_customer)` | +| `CustomerSrc/CustomerService.Domain/Entity/MessageEntity.cs` | 消息实体,`BsonCollection("message", data_0524_customer)` | +| `CustomerSrc/CustomerService.Domain/Entity/CustomerEntity.cs` | 客服实体,`BsonCollection("customer", data_0524_customer)` | +| `CustomerSrc/CustomerService.Domain/Response/ConversationResponse.cs` | 会话响应模型(继承 ConversationEntity,增加 LastMessage / UnreadCount / Messages) | +| `CustomerSrc/CustomerHost/CustomerHost.csproj` | Host 工程文件(包与项目引用、静态文件复制) | +| `CustomerSrc/CustomerApi/CustomerApi.csproj` | API 工程文件(项目引用) | +| `CustomerSrc/CustomerService/CustomerService.csproj` | 服务层工程文件 | +| `CustomerSrc/CustomerService.Domain/CustomerService.Domain.csproj` | 领域层工程文件 | + +--- + +## 七、与其他模块的交互 + +### 7.1 MongoDB 集合 + +所有实体继承 `MongoRepository.MongoBaseEntity`(含 `_id`(GUID 字符串,默认 `Guid.NewGuid().ToString("N")`)、`isdelete`、`CreateInfo`),并通过 `[BsonCollection(集合名, ServiceDatabases.Customer)]` 指定数据库。`ServiceDatabases.Customer = "data_0524_customer"`。 + +| 实体 | 集合名 | 数据库 | 主要字段(Bson 名) | +| --- | --- | --- | --- | +| `ConversationEntity` | `conversation` | `data_0524_customer` | userid、username、useravatar、customerid、customername、customeravatar、status、createtime、endtime、lastreadtime | +| `MessageEntity` | `message` | `data_0524_customer` | conversationid、sendertype、senderid、sendername、senderavatar、contenttype、content、createtime | +| `CustomerEntity` | `customer` | `data_0524_customer` | userid、username、status、avatar、createtime | + +访问方式:`IMongoBaseRepository`(`FindOneAsync` / `FilterByAsync` / `InsertOneAsync` / `ReplaceOneAsync` / `UpdateManyAsync` 等)。 + +### 7.2 Redis + +* **在线客服列表**:键 `customer-service:online`(`RedisKey.CUSTOMER_ONLINE_KEY` → `RedisKeyGenerator.CustomerKey("online")`,前缀映射 `customer` → `customer-service`)。通过 `ICache`(`Common.Redis`,来自 RedisHelper)的 `AddToList` / `RemoveFromList` / `GetList` 维护,元素为客服的用户 ID 字符串。 + * 上线(`UpdateCustomerStatus(status==1)`):先从列表移除再追加,写入该客服 ID。 + * 下线:从列表移除。 + * 分配客服(`StartConversation` / `GetOnlineCustomerList`):读取列表 → 逐个查 `customer` 集合校验 `Status==1` → 返回有效在线客服。 + * 附:`RedisKeyConstants.CustomerOnlineKey`(`"game0524:customer:online"`)为另一套常量定义,但本模块实际使用的是 `RedisKey.CUSTOMER_ONLINE_KEY`。 +* **SignalR 背板**:`AddStackExchangeRedis(RedisConfig:ConnectionString)`,频道前缀 `CustomerHub`,用于多实例间广播。`system.json` 中 `RedisConfig.ConnectionString = "localhost:6379,password=123456,defaultDatabase=2,abortConnect=false"`,另 `Database=1`。 + +### 7.3 CAP / RabbitMQ + +* 通过 `AddCap` 接入,交换机 `cap.exchange`,存储为 PostgreSQL(`public` Schema,连接串 `CapConfig:PGLogHost`)。**本模块代码未定义任何 CAP 发布/订阅消息**,仅框架级接入与 Dashboard。 + +### 7.4 HTTP / 项目引用依赖 + +* 通过 `CommonInfrastructure`(`BaseController`、`ControllerExtension.ToResult/ToListResult/...`、`BaseResponse`/`ListResponse`)、`Common`(`BaseResponse`、`CommonResponseCodeEnum`、`RedisKey`、`ICache`)、`JWTHelper`(`AddCustomJwt`)、`RedisHelper`(`AddRedisCache`)、`MongoRepository`(`IMongoBaseRepository`)、`SharpAbp.Infrastructure.Api`(`ApplicationModule`、`UseGlobalExceptionHandler`)、`CommonService`(`ApiLogService` / `IApiLogService`)等基础设施项目协作。 +* 未发现本模块主动发起对其他业务进程的 HTTP 调用。 + +### 7.5 与 Admin 模块(客服管理)的关系 + +* 后台客服账号与「客服管理」属于 **Admin 模块**:`AdminSrc/AdminService/Customer/CustomerService.cs` 提供 `AddCustomer` 等能力(新增客服、校验「该用户已是客服」),并在 `AdminSrc/AdminDomain/Admin/ENum/EnumOperationModule.cs` 中以 `Customer = 8`「客服管理」登记操作模块。 +* 两侧共用同一套 `CustomerEntity` 集合(`data_0524_customer.customer`)与前端页面 `AdminSrc/AdminHost/wwwroot/admin/dist/views/customer/service.html`;CustomerSrc 负责在线会话与消息,Admin 负责客服的创建与运营管理。 + +### 7.6 网关映射 + +`Gateway/ocelot.json` 中: + +* `/customerapi/{everything}` → `localhost:5247` +* `/customerHub/{everything}` → `localhost:5247` + +即外部统一经网关 `http://localhost:8001` 访问本模块的 HTTP 接口与 SignalR Hub。 \ No newline at end of file diff --git a/docs/04-棋牌游戏模块-ChessGame.md b/docs/04-棋牌游戏模块-ChessGame.md new file mode 100644 index 0000000..66a0a10 --- /dev/null +++ b/docs/04-棋牌游戏模块-ChessGame.md @@ -0,0 +1,390 @@ +# 棋牌游戏模块(ChessGame)—— 功能与代码目录文档 + +> 本文档为 **棋牌游戏模块(ChessGame)** 的完整上下文说明,供其他对话 / 开发者在不阅读全部源码的情况下理解该模块。文中所有结论均以仓库 `d:\BUYUHouDuanNet\BuYu` 下的实际源码为准,路径均为相对该仓库根目录的相对路径。 + +--- + +## 一、平台背景与模块位置 + +本平台是一个**捕鱼 + 棋牌游戏运营平台后端**,解决方案文件为 `Template0524.sln`。整体技术栈: + +- 运行时 / 框架:**.NET 8** +- 数据库:**MongoDB**(文档存储)、**PostgreSQL**(CAP 消息表 / 日志表) +- 缓存:**Redis** +- 消息队列:**RabbitMQ**(通过 **DotNetCore.CAP** 封装为事件总线) +- 实时通信:**SignalR**(Hub,部分为 WebSocket-only) +- 网关:**Ocelot** +- 日志:**NLog** +- 依赖注入:**Autofac** + +**网关(Ocelot)** 监听 `http://localhost:8001`,按路由将请求转发到各 Host 进程: + +| 网关前缀 | 目标 Host | 端口 | +| --- | --- | --- | +| `/adminapi` | AdminHost | 5241 | +| `/api`、`/loginhub` | UserHost | 5245 | +| `/customerapi`、`/customerHub` | CustomerHost | 5247 | +| `/chess`、`/chessgamehub` | **ChessGameHost** | **5242** | +| `/fishingroomhub` | FishRoomHost | 5244 | +| `/gamehub` | FishGameHost | 5248 | + +**本模块(棋牌游戏模块 ChessGame)的位置:** + +- 入口进程:`ChessGameHost`(`ChessGameHost/ChessGameHost.csproj`)。 +- 网关前缀:`/chess`、`/chessgamehub`。 +- 实时对局通信:SignalR Hub,映射在 **`/chessgamehub`** 路由,并且**仅启用 WebSockets 传输**(见 `ChessGameHost/Program.cs`)。 +- 在 `Template0524.sln` 中已注册的项目:`ChessGameSrc\ChessGameDomain`、`ChessGameSrc\ChessGameService`、`ChessGameHost`(解决方案中存在 `ChessGameSrc` 解决方案文件夹)。 +- 端口说明(以实际配置为准):`ChessGameHost/docker-compose.yaml` 将容器内 `80` 映射到宿主 **5242**(与网关一致);`ChessGameHost/Properties/launchSettings.json` 本地 http 调试端口为 `5290`;`ChessGameHost/Config/system.json` 中另声明了 `"urls": "http://*:8005"`。三者用途不同(发布容器 / 本地调试 / 配置声明),实际生效端口取决于部署方式与启动参数。 + +--- + +## 二、模块简介 + +### 2.1 定位与职责 + +棋牌游戏模块负责**中国象棋(真人 / 机器人)实时对局**服务,核心职责: + +1. 房间的创建、加入、退出、后台踢人、房间重置与清理。 +2. 对局全生命周期:设金币 → 准备 → 开始 → 走子/操作转发 → 结束(认输 / 双方确认结束 / 断线超时 / 挂机超时)。 +3. 对局结算:按房间下注金币在胜者与败者之间进行**用户资产(金币)加减**,并发布资产变更通知。 +4. 通过 SignalR 向大厅(Lobby)与房间组实时推送房间状态、对局事件。 +5. 后台任务:**断线/挂机超时自动判负**、**机器人填充空房**、**空房率维护**、**启动时重置异常房间**。 + +房间的**运行态数据存放在 Redis**(通过 `IRedisService` 读写,见 `RedisService/IRedisService.cs`),并非存放于 MongoDB。 + +### 2.2 房间状态机(`ChessGameRoom.state`,依据代码推断) + +| state | 含义(依据代码使用位置推断) | +| --- | --- | +| `0` | 空闲 / 待开放房间(机器人服务 `ChessBotService` 会将 `state==0` 且无人的房间填充为机器人房;清理逻辑会将其重置回 0) | +| `1` | 已创建 / 已有人进入,等待开始(`StartGame` 要求 `state==1`;`CreateRoom` / `JoinGame` 成功后置 1) | +| `2` | 对局进行中(`EndGame` / 超时 / 断线均要求或针对 `state==2`) | +| `3` | 对局结束 / 房间释放(`EndGame` 与 `ExitRoom` 均将 state 置 3) | + +### 2.3 核心业务流程(以代码为准) + +**① 进房 / 创建房间** + +- `CreateRoom`(Hub)→ `ChessGameService.CreateRoomAsync`: + - 校验用户存在、游戏配置(`IRedisService.GetGameConfig()` 的 `ChessConfig`)存在。 + - 使用**分布式锁** `lock:chess:room:{roomId}`(`RedisKey.DistributedLockPrefix` + `chess:room:{roomId}`,expiry=10s)串行化操作。 + - 若该用户已存在于其他房间,则从旧房间移除或清空旧房间。 + - 房间处于 `state==0` 或 `state==3 且无人` 时视为“开房/配置密码”场景,需满足 `ChessConfig.CreateRoomLimit` 权限(`3`=所有人、`1`=VIP、`2`=代理),否则返回“只有 VIP/代理才能配置密码”。 + - 否则按二/一号位(`type`,红黑方)加入,最多 2 人。 +- `JoinGame`(Hub)→ `JoinGameAsync`:**必须携带正确密码**(`room.password` 为空或错误均拒绝),随后入房、置 `state==1`。 + - 注意:`CreateRoom` 场景与 `JoinGame` 场景对密码的要求不同——`JoinGameAsync` 强制校验密码。 + +**② 对局准备与开始** + +- `StartGame`:仅**房主**(`createUserId`)可发起,人数需 ≥ 2,推送 `GoldConfigRequired`(要求红方配置金币)。 +- `GoldConfig`:仅**红方**(`type==2`)可配置,金币需 ≥ `ChessConfig.MinBetGold`,且不得超过红方玩家自身金币。 +- `GameReady`:玩家准备;两人全部准备后房间置 `state==2`(真正开始),推送 `AllBeginTime`。 + +**③ 对局中的操作转发** + +- `GameOperation(gameId, type, data)`:校验调用者身份并刷新活跃时间;当 `type==2` 时视为“当前玩家获胜”,直接结束对局(另一方判负);否则把 `{type,data}` 广播给房间组。 +- `SyncGameData(gameId, data)`:把数据**仅转发给房间内另一个连接**(对手),用于走子同步。 +- `Heartbeat`:刷新房间 `LastActiveTime`。 + +**④ 结束对局(多种触发)** + +- `EndGame(gameId, winUserId)`(Hub)→ `ChessGameService.EndGame`: + - 在分布式锁内执行(`lock:chess:room:{gameId}`,expiry=30s,**不重试**),房间置 `state==3`、`IsGameEnded=true`。 + - 计算实际下注 `actualBet = min(room.gold, 败者真实金币)`;先扣败者(`Source = RewardSource.象棋`),再给胜者加币;任一失败则回滚(扣款失败回退房间状态为 2,胜者加币失败则给败者回退)。 + - 结算后发布 `BackgroundOperation.NotifyUser` 通知(胜方 `ChangeType=1`、败方 `ChangeType=2`)。 + - 最后清空房间(`gold=0`、`gameType=0`、`robotCount=0`、清空确认集合、清空 `users`),并对所有相关 userId 执行 `UpdateUserGameType(userId, 0)`。 +- `RequestEndGame`:**双方确认制**,玩家各自登记结束请求(`EndGameRequests`),当房间内所有玩家都确认(且人数 ≥ 2)时自动调用 `EndGame`;否则向对手推送 `OpponentRequestEnd`。 +- 断线超时:`CheckTimeout`(Hub 主动查询)与后台 `ChessTimeoutService` 周期扫描,玩家断线超过 `room.TimeoutSeconds`(默认 60s)判负。 +- 挂机超时:`CheckRoomAfkTimeout`,单方挂机超过 `room.AfkTimeoutSeconds`(默认 120s)判负;**双方同时挂机时,先挂机的一方判负**。 + +**⑤ 退出与踢人** + +- `ExitRoom`(Hub)按房主退出 / 对局中退出 / 普通退出分别处理,必要时重置房间。 +- `KickPlayer`(Hub):仅房主、非对局中、不能踢自己;被踢者收 `KickedFromRoom` 并回到大厅组。 +- 后台管理员踢人:由 `AdminKickChessPlayerSubscriber` 处理(见第七节)。 + +**⑥ 机器人与空房维护** + +- `ChessBotService` 定期把空闲房间填充为机器人房、并维护“空房率”(见第三节·后台服务)。 + +--- + +## 三、业务功能清单 + +### 3.1 SignalR Hub 方法(客户端 → 服务端可调用) + +Hub 类:`ChessGameService/ChessGameHub.cs`(`namespace ChessGameService`),继承 `Hub`。大厅组常量:`ChessGameHub.LobbyGroup = "chess_lobby"`。 + +| 方法 | 说明 | +| --- | --- | +| `OnConnectedAsync()` / `OnDisconnectedAsync(Exception?)` | 连接 / 断开的生命周期处理;支持按 query 参数 `userId` 重连回房 | +| `CreateRoom(CreateRoomParam param)` | 创建 / 开房 | +| `JoinGame(gameId, pwd, userId)` | 凭密码加入房间 | +| `StartGame(gameId, userId)` | 房主开始游戏(进入金币配置环节) | +| `GoldConfig(gameId, gold, userId)` | 红方配置本局下注金币 | +| `GameReady(gameId, userId)` | 玩家准备 | +| `EndGame(gameId, winUserId)` | 结束对局并结算(指定胜者) | +| `RestartGame(gameId, userId)` | 对局结束后重开 | +| `RequestEndGame(gameId, userId, winUserId)` | 请求结束对局(双确认) | +| `Heartbeat(gameId)` | 心跳,刷新活跃时间 | +| `SetPlayerAfk(gameId, userId)` / `CancelPlayerAfk(gameId, userId)` | 设置 / 取消挂机 | +| `CheckTimeout(gameId)` | 主动检查断线超时 | +| `ExitRoom(gameId, userId)` | 退出房间 | +| `KickPlayer(gameId, targetUserId)` | 房主踢人 | +| `GetRoomList(partition=0)` | 获取房间列表(最多 100,按房号分区过滤) | +| `GetRoomState(gameId)` | 获取房间当前状态 | +| `SyncGameData(gameId, data)` | 走子/对局数据转发给对手 | +| `GameOperation(gameId, type, data)` | 对局操作透传;`type==2` 时结束对局 | + +### 3.2 Hub 推送事件(服务端 → 客户端) + +以下为代码中实际出现的事件名(`Clients.*.SendAsync(...)`): + +| 事件名 | 说明 | +| --- | --- | +| `BeginGame` | 推送房间完整数据(进房 / 重连 / 状态刷新) | +| `RoomStateNotice` | 房间状态通知 | +| `JoinRoom` | 加入房间成功(发给调用者) | +| `JoinRoomNotice` | 有人加入房间(发给大厅) | +| `CreateRoomNotice` | 房间被创建(发给大厅) | +| `ExitRoomNotice` | 房间退出 / 重置(发给大厅或相关连接) | +| `ExitRoomSuccess` | 退出房间成功 | +| `GameError` | 错误消息(发给调用者) | +| `ReadyNotice` / `AllBeginTime` | 准备通知 / 全部准备开始 | +| `GoldConfigRequired` / `GoldConfigSuccess` / `GoldConfigRoomNotice` | 金币配置相关 | +| `GameEnd` | 对局结束(含胜者与房间数据) | +| `RestartGameSuccess` / `RestartRoomNotice` | 重开相关 | +| `OpponentRequestEnd` / `EndGameRequestSent` | 请求结束对局相关 | +| `PlayerAfkNotice` / `PlayerCancelAfkNotice` | 挂机相关 | +| `KickedFromRoom` | 被踢出房间(含 `gameId`、`userId`、`reason`、`source`) | +| `Disconnect` / `Reconnect` | 断线 / 重连通知 | +| `SyncGameData` / `GameOperation` | 对局数据转发 | +| `GetRoomList` | 房间列表响应 | + +### 3.3 后台服务(`ChessGameHost/Services/`) + +| 服务 | 周期 | 说明 | +| --- | --- | --- | +| `ChessTimeoutService` | 每 **10 秒** | 遍历所有 `state==2` 房间:断线超过 `TimeoutSeconds` 判负;随后对有挂机的房间执行 `CheckRoomAfkTimeout`(挂机超时判负)。判负后推送 `GameEnd` / `ExitRoomNotice`,并把相关连接移回大厅组 | +| `ChessBotService` | 启动延迟 10s,之后每 **2 分钟** | ① 启动时 `CleanStaleRooms` 清理空房间(`state==3` 或 `state==1 且房主为空`);② `EnsureChessEmptyRoomRate` 依据 MongoDB 中的 `EmptyRoomRateConfig`(按 `GameType==中国象棋`)维护空房率,必要时释放“纯机器人房”为空房;③ 从 `state==0` 且无人无机器人的房间中挑选候选,置为机器人房(`robotCount=1`、`state=1`、随机密码),并向大厅推送 `JoinRoomNotice`(单批最多 5 个) | + +### 3.4 CAP 消息订阅者(`ChessGameService/Subscribers/`) + +| 订阅者 | 订阅主题 | 说明 | +| --- | --- | --- | +| `ChessLoginSubscriber` | `TopicKeys.登录绑定`(`Topic_0524_LoginBind`) | 处理“登录绑定”:查该用户是否正处于 `state==2` 未结束的对局中,若是则调用 `EndGame` 以对手为胜者结束并结算,随后发布 `TopicKeys.登录结果通知` | +| `AdminKickChessPlayerSubscriber` | `TopicKeys.后台踢出象棋玩家`(`Topic_0524_AdminKickChessPlayer`) | 处理后台管理员踢人:踢出后更新用户游戏状态、推送 `KickedFromRoom`,把连接移回大厅组并广播房间状态 | + +--- + +## 四、项目结构与技术要点 + +### 4.1 各 csproj:目标框架与依赖关系 + +**`ChessGameSrc/ChessGameDomain/ChessGameDomain.csproj`** + +- 目标框架:`net8.0`(`ImplicitUsings` / `Nullable` 均开启) +- 项目引用:`Infrastructure\MongoRepository\MongoRepository.csproj` +- 说明:对局/房间实体层,无 NuGet 包直接引用(Mongo 相关特性来自 MongoRepository 项目)。 + +**`ChessGameSrc/ChessGameService/ChessGameService.csproj`** + +- 目标框架:`net8.0`(`ImplicitUsings` / `Nullable` 均开启) +- NuGet 包:`Microsoft.AspNetCore.SignalR.Core` (1.2.9)、`Microsoft.Extensions.Logging.Abstractions` (10.0.3) +- 项目引用:`RedisService\RedisService.csproj`、`UserSrc\UserService\UserService.csproj`、`ChessGameDomain\ChessGameDomain.csproj` +- 说明:业务服务层,包含 Hub、服务接口/实现、订阅者、参数模型。 + +**`ChessGameHost/ChessGameHost.csproj`** + +- 目标框架:`net8.0`,SDK = `Microsoft.NET.Sdk.Web`(Web 进程入口) +- NuGet 包:`NLog.Web.AspNetCore` (6.1.2)、`Autofac` (8.3.0)、`Autofac.Extensions.DependencyInjection` (10.0.0)、`AutoMapper` (14.0.0)、`DotNetCore.CAP` (8.3.4)、`DotNetCore.CAP.Dashboard` (8.3.4)、`DotNetCore.CAP.PostgreSql` (8.3.4)、`DotNetCore.CAP.RabbitMQ` (8.3.4)、`Microsoft.AspNetCore.SignalR.Protocols.MessagePack` (8.0.17) +- 项目引用:`ChessGameSrc\ChessGameService`、`CommonService`、`Infrastructure\CommonInfrastructure`、`Infrastructure\SharpAbp.Infrastructure.Api` +- 内容文件:链接引用仓库根 `nlog.config`;`docker-compose.yaml`、`Dockerfile` 设为始终复制(注意:`Dockerfile` 被 csproj 引用,但当前 `ChessGameHost` 目录下未发现该文件)。 + +**依赖方向:** `ChessGameHost` → `ChessGameService` → { `ChessGameDomain`、`RedisService`、`UserService` } → `ChessGameDomain` → `MongoRepository`。 + +### 4.2 进程入口要点(`ChessGameHost/Program.cs`) + +- 设置环境变量 `SERVICE_NAME`、`INSTANCE_ID`,并注册单例 `AppInstanceId`。 +- 日志:`builder.Logging.AddNLog()` + `builder.Host.UseNLog()`(NLog 6.x)。 +- 配置:加载 `Config/system.json`;绑定 `MongoDbSettings` 并注册为单例 `IMongoDbSettings`。 +- **SignalR 配置**(`AddSignalR(...).AddJsonProtocol()`): + - `MaximumReceiveMessageSize = 64 * 1024`(64KB) + - `StreamBufferCapacity = 512` + - `ClientTimeoutInterval = 70s`、`KeepAliveInterval = 15s` + - 全局 Hub 过滤器:`MovementFilter`、`HubExceptionFilter` +- 其他:`FormOptions.MultipartBodyLengthLimit = 16MB`、`AddMemoryCache()`、JSON 转换器 `DatetimeJsonConverter`。 +- DI:`IHubSend` → `HubSend`、`IRequestApi` → `RequestApi`、`AddAutoMapper(typeof(AutoMapperConfig))`。 +- 后台服务:`AddHostedService()`、`AddHostedService()`。 +- 健康检查:`AddHealthChecks().AddCheck("self", ...)`。 +- CORS 策略 `"Cors"`:`SetIsOriginAllowed(_ => true)`、允许任意 Header / Method、`AllowCredentials()`。 +- `AddCustomJwt(builder.Configuration)`、`AddRedisCacheSingleton(builder.Configuration)`。 +- Autofac:`builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory())` 并注册 `AutofacModule`。 +- CAP:`builder.Services.AddCap(builder.Configuration)`(见 `Extension/CapExtension.cs`)。 +- **启动自愈逻辑**(`app.Run()` 前):`redis.ClearAllLoginUserIds()`;遍历所有象棋房间,收集受影响 userId;对 `state != 2` 的房间执行 `ExitRoom` 释放,对 `state == 2` 的房间把用户标记为 `IsLeave=true`、`DisconnectTime=now`、`Cid=""` 并写回;最后对所有受影响用户 `UpdateUserGameType(userId, 0)`。整段包在 try/catch 中(失败不影响启动)。 +- 中间件管线顺序:`UseApiLogging()` → `UseRouting()` → `UseGlobalExceptionHandler()` → `UseStaticFiles()` → `UseCors("Cors")` → `UseAuthentication()` → `UseAuthorization()`。 +- 终结点:`MapHub("/chessgamehub", options => options.Transports = WebSockets)`、`MapControllers()`、`MapHealthChecks("/health", ...)`(返回 JSON 健康报告)。 + +### 4.3 SignalR / CAP / Redis 配置 + +- SignalR:单个 Hub `ChessGameHub`,映射路由 `/chessgamehub`,**仅 WebSockets**;启用 JSON 协议;消息封包协议包 `MessagePack`(8.0.17)已被引用。 +- CAP(`ChessGameHost/Extension/CapExtension.cs`): + - `UseDashboard()`(CAP 面板)。 + - `UseRabbitMQ`:`Host/UserName/Password/VirtualHost` 取自配置节 `CapConfig`,交换机名 `cap.exchange`。 + - `UsePostgreSql`:连接串取自 `CapConfig:PGLogHost`,Schema=`public`。 + - `SucceedMessageExpiredAfter = 7*24*3600`、`FailedRetryCount = 5`、`FailedRetryInterval = 10`、`FailedThresholdCallback`。 + - 显式注册订阅者:`ChessLoginSubscriber`、`AdminKickChessPlayerSubscriber`(`AddTransient`)。 +- Redis:`AddRedisCacheSingleton(builder.Configuration)`;读取配置节 `RedisConfig`。房间键定义在 `Infrastructure/Common/Redis/RedisKey.cs`:`ChessRoomList`(`...chess:room:list`)、`ChessRoomKey`(`...chess:room:{0}`),分布式锁前缀 `DistributedLockPrefix`(`...lock:`)。 + +### 4.4 DI 注册位置 + +- **Autofac 模块** `ChessGameHost/Middleware/AutofacModule.cs`: + - 注册泛型仓储/服务:`MongoBaseRepository<>` → `IMongoBaseRepository<>`、`MongoBaseService<>` → `IMongoBaseService<>`(`InstancePerLifetimeScope`)。 + - 注册 `RedisService.RedisService` → `IRedisService`。 + - 按程序集扫描注册:`CommonService`(`ApiLogService` 所在程序集)、`ChessGameService`、`UserService` 中所有以 `Service` 结尾的类型为“实现其接口”。 +- `ChessGameHub` 由 SignalR 框架实例化(不在 Autofac 模块中显式注册),其构造函数依赖 `ILogger`、`IChessGameService`、`IRedisService`。 + +### 4.5 docker-compose 端口 + +`ChessGameHost/docker-compose.yaml`: + +```yaml +name: webapi +services: + 0524chess: + image: 0524chess + container_name: '0524chess' + restart: always + ports: + - '5242:80' +``` + +即宿主 **5242** → 容器 **80**。 + +### 4.6 配置文件(`ChessGameHost/`) + +- `appsettings.json`:仅 `Logging`(`Default=Error`、`Microsoft.AspNetCore=Error`)与 `AllowedHosts=*`。 +- `appsettings.Development.json`:仅 `Logging`。 +- `Config/system.json`(由 `Program.cs` 额外加载):包含 `urls`(`http://*:8005`)、`JwtConfig`、`ConnectionStrings:PgSqlConnection`、`CapConfig`(RabbitMQ + PG 日志库)、`RedisConfig`(Host localhost、Port **6378**、Database **1**)、`MongoDbSettings`(`mongodb://localhost:27018`)、`WXConfig`。 + +--- + +## 五、代码目录说明(完整目录树) + +```text +ChessGameSrc/ # 棋牌游戏业务源码解决方案文件夹 +├── ChessGameDomain/ # 领域层:对局/房间实体(net8.0) +│ ├── ChessGameDomain.csproj # 项目文件,引用 MongoRepository +│ ├── ChessGameRoom.cs # 房间实体(BsonCollection "game_room",库 data_0524_chess) +│ └── RedisChessGameUser.cs # 房间内玩家实体(存放在房间的 users 列表) +└── ChessGameService/ # 业务服务层(net8.0) + ├── ChessGameService.csproj # 项目文件,引用 RedisService / UserService / ChessGameDomain + ├── IChessGameService.cs # 对局业务接口(房间/对局/结算/超时/踢人) + ├── ChessGameService.cs # 对局业务核心实现(房间状态机 + 结算逻辑) + ├── ChessGameHub.cs # SignalR Hub,映射路由 /chessgamehub + ├── Param/ + │ └── CreateRoomParam.cs # 创建房间入参(roomId/userId/gameType/password/gold) + └── Subscribers/ + ├── ChessLoginSubscriber.cs # 订阅“登录绑定”,结束旧对局并回发登录结果 + └── AdminKickChessPlayerSubscriber.cs # 订阅“后台踢出象棋玩家”,执行管理员踢人 + +ChessGameHost/ # 棋牌游戏进程入口(Web 主机,net8.0) +├── ChessGameHost.csproj # 项目文件,含 NLog/Autofac/CAP/SignalR MessagePack 等包 +├── Program.cs # 进程入口:DI/中间件/Hub 映射/启动自愈逻辑 +├── appsettings.json # 基础日志配置 +├── appsettings.Development.json # 开发环境日志配置 +├── docker-compose.yaml # 容器编排,端口 5242:80 +├── .dockerignore # 容器构建忽略清单 +├── Config/ +│ └── system.json # 业务配置:JWT/PG/CAP(RabbitMQ)/Redis/Mongo/微信 +├── Extension/ +│ └── CapExtension.cs # CAP 配置扩展(RabbitMQ+PG+Dashboard+订阅者注册) +├── Middleware/ +│ ├── AutofacModule.cs # Autofac 依赖注入模块(仓储/Redis/服务扫描) +│ ├── ApiLoggingMiddleware.cs # /api 请求响应日志中间件(含脱敏) +│ ├── HubExceptionFilter.cs # SignalR Hub 全局异常/接口日志过滤器 +│ └── MovementFilter.cs # SignalR Hub 过滤器(内含预留的 RateLimiter 令牌桶) +├── Properties/ +│ └── launchSettings.json # 本地调试配置(http 端口 5290 / IIS Express 21784) +└── Services/ + ├── ChessTimeoutService.cs # 后台服务:断线/挂机超时判负(每 10s) + └── ChessBotService.cs # 后台服务:机器人填充/空房率维护/启动清理(每 2min) +``` + +--- + +## 六、关键文件索引 + +| 文件相对路径 | 职责 | +| --- | --- | +| `ChessGameSrc/ChessGameDomain/ChessGameRoom.cs` | 房间实体,定义 `users`、`RoomId`、`gameType`、`password`、`createUserId`、`state`、`gold`、`robotCount`、`EndGameRequests`、`TimeoutSeconds`、`AfkTimeoutSeconds`、`IsGameEnded` 等字段及默认值 | +| `ChessGameSrc/ChessGameDomain/RedisChessGameUser.cs` | 房间内玩家实体(`Cid`、`userId`、`userName`、`userAvatar`、`type`、`IsLeave`、`IsReady`、`Gold`、`DisconnectTime`、`IsAfk`、`AfkTime`) | +| `ChessGameSrc/ChessGameService/IChessGameService.cs` | 对局业务接口,声明创建/加入/就绪/结束/重启/超时/踢人/结算等全部方法 | +| `ChessGameSrc/ChessGameService/ChessGameService.cs` | 对局业务核心实现:房间状态机、金币结算(`EndGame`)、超时判定、权限校验等 | +| `ChessGameSrc/ChessGameService/ChessGameHub.cs` | SignalR Hub:映射 `/chessgamehub`,处理连接/断开、进房、开始、准备、走子转发、结束、踢人等,并定义大厅组 `chess_lobby` | +| `ChessGameSrc/ChessGameService/Param/CreateRoomParam.cs` | 创建房间参数模型 | +| `ChessGameSrc/ChessGameService/Subscribers/ChessLoginSubscriber.cs` | 订阅 `Topic_0524_LoginBind`,登录绑定触发旧对局结算,回发 `Topic_0524_LoginBindResult` | +| `ChessGameSrc/ChessGameService/Subscribers/AdminKickChessPlayerSubscriber.cs` | 订阅 `Topic_0524_AdminKickChessPlayer`,后台踢人并广播 | +| `ChessGameHost/Program.cs` | 进程入口:服务注册、SignalR/CAP/Redis 装配、中间件与终结点、启动房间自愈 | +| `ChessGameHost/Extension/CapExtension.cs` | CAP 事件总线配置与订阅者注册 | +| `ChessGameHost/Middleware/AutofacModule.cs` | DI 容器装配(仓储、Redis、各 Service 程序集扫描) | +| `ChessGameHost/Middleware/ApiLoggingMiddleware.cs` | `/api` 请求日志中间件 | +| `ChessGameHost/Middleware/HubExceptionFilter.cs` | Hub 调用日志与异常捕获(`SyncGameData` 除外) | +| `ChessGameHost/Middleware/MovementFilter.cs` | Hub 过滤器(预留限流 `RateLimiter`) | +| `ChessGameHost/Services/ChessTimeoutService.cs` | 断线/挂机超时后台判负服务 | +| `ChessGameHost/Services/ChessBotService.cs` | 机器人填充与空房率维护后台服务 | +| `ChessGameHost/Config/system.json` | 业务配置(JWT/PG/CAP/Redis/MongoDB/微信) | +| `ChessGameHost/docker-compose.yaml` | 容器端口映射 `5242:80` | +| `ChessGameHost/Properties/launchSettings.json` | 本地调试端口 | + +--- + +## 七、与其他模块的交互 + +### 7.1 CAP / RabbitMQ 消息主题 + +主题常量定义在 `CommonDomain/TopicKeys.cs`,消息体定义在 `CommonDomain/CapMessageModels.cs`、`CommonDomain/AdminKickChessPlayerMessage.cs`。本模块相关的发布/订阅如下: + +| 方向 | 主题(常量 → 实际值) | 消息体 | 交互方 | +| --- | --- | --- | --- | +| **订阅** | `TopicKeys.登录绑定` → `Topic_0524_LoginBind` | `LoginBindMessage { UserId, OperationId }` | 发布方:UserHost(`UserSrc/UserService/Hubs/LoginHub.cs`);本模块 `ChessLoginSubscriber` 消费 | +| **发布** | `TopicKeys.登录结果通知` → `Topic_0524_LoginBindResult` | `LoginBindResultMessage { UserId, RoomId, OperationId, Success, Error }` | 消费方:UserHost(`LoginResultSubscriber` → `LoginSettlementWaiter`);本模块在结算后发布 | +| **订阅** | `TopicKeys.后台踢出象棋玩家` → `Topic_0524_AdminKickChessPlayer` | `AdminKickChessPlayerMessage { RoomId, UserId, Reason }` | 发布方:AdminHost(`AdminSrc/AdminApi/GameConfigs/AdminRoomController.cs`);本模块 `AdminKickChessPlayerSubscriber` 消费 | +| **发布** | `"BackgroundOperation.NotifyUser"`(字符串字面量,非常量) | `BackgroundOperationNotifyMessage` | 消费方:UserHost(`AdminNotifySubscriber`)与 FishGame(`BackgroundAssetSubscriber`);本模块在 `EndGame` 结算后发布(胜方 `ChangeType=1`、败方 `ChangeType=2`,`CurrencyType=1`,`Source="象棋对局胜利"/"象棋对局失败"`) | + +> 注意:`登录绑定` 主题除本模块的 `ChessLoginSubscriber` 外,`FishGameSrc/FishGameService/Subscribers/LoginBindSubscriber.cs` 也以相同主题订阅(处理捕鱼房旧房间)。二者是各自独立的订阅者。 + +### 7.2 登录绑定(与 User 模块)完整流程 + +1. 用户在 UserHost 登录(`LoginHub`),若检测到存在待处理的捕鱼房/象棋房(`IRedisService.GetPendingChessRoomId(userId)`),生成 `OperationId`,注册 `LoginSettlementWaiter`,并通过 `_capPublisher.PublishAsync(TopicKeys.登录绑定, new LoginBindMessage{ UserId, OperationId })` 发布“登录绑定”事件,然后等待结果(超时 15s)。 +2. 本模块 `ChessLoginSubscriber.HandleLoginBind` 消费该事件:遍历所有象棋房间,若发现该用户处于 `state==2` 且未结束的对局中,则以**对手为胜者**调用 `ChessGameService.EndGame` 结算,随后发布 `TopicKeys.登录结果通知`(成功 `Success=true`,异常 `Success=false` 并带 `Error`)。 +3. UserHost `LoginResultSubscriber` 消费“登录结果通知”,通过 `LoginSettlementWaiter` 唤醒等待中的登录流程;随后写入新的登录 Cid(`SetRedisUserCId`)。 +4. 另有 `LoginHub.DismissPendingRoom` 会发布 `TopicKeys.拒绝回房`(`Topic_0524_DismissPendingRoom`,消息体同为 `LoginBindMessage`)。 + +### 7.3 Redis + +- 本模块对局房间的**运行时数据全部存放于 Redis**,通过 `IRedisService` 读写(`SetChessRoom` / `GetChessRoom` / `GetAllChessRooms` / `RemoveChessRoom` 等)。相关键:`ChessRoomList`(`...chess:room:list`)、`ChessRoomKey`(`...chess:room:{0}`)。 +- 使用**分布式锁**:键前缀 `RedisKey.DistributedLockPrefix`(`...lock:`)+ `chess:room:{roomId}`,串行化房间的创建、准备、结束等操作。 +- 配置节 `RedisConfig`(localhost:6378,Database 1)。 +- 启动时调用 `ClearAllLoginUserIds()` 清理登录用户映射。 + +### 7.4 MongoDB + +- 房间实体 `ChessGameRoom` 标注了 `[BsonCollection("game_room", ServiceDatabases.Chess)]`,其中 `ServiceDatabases.Chess = "data_0524_chess"`(见 `Infrastructure/MongoRepository/Config/MongoDbSettings.cs`)。**但本模块代码实际通过 Redis 存取房间运行态,未在本模块中发现向该 Mongo 集合写房间的逻辑。** +- `ChessBotService` 通过 `IMongoBaseRepository` 读取空房率配置;`EmptyRoomRateConfig` 标注在集合 `empty_room_rate_config`、库 `data_0524`(见 `CommonDomain/EmptyRoomRateConfig.cs`),按 `GameType == 中国象棋`(`GameTypeEnum.中国象棋 = 3`)过滤。 +- 对局日志:`HubExceptionFilter` / `ApiLoggingMiddleware` 通过 `IApiLogService` 写入接口日志(Mongo 仓储)。 + +### 7.5 HTTP 调用 + +`Program.cs` 注册了 `IRequestApi` → `RequestApi`(`Common.Request`)单例,作为通用 HTTP 请求封装;在本模块已阅读的对局代码中未见直接调用。 + +### 7.6 共享实体 / 项目引用 + +- `ChessGameService` 引用 `RedisService`、`UserService`、`ChessGameDomain`;`ChessGameHost` 引用 `ChessGameService`、`CommonService`、`CommonInfrastructure`、`SharpAbp.Infrastructure.Api`;`ChessGameDomain` 引用 `MongoRepository`。 +- **与 User 模块的耦合点**:`ChessGameService` 通过 `IUserService`(`UserSrc/UserService`)执行 `GetUser` / `UpdateUser` / `UpdateAssets`;`UpdateUserGameType` 写入用户 `Static.CurrentGameType` 与 `Static.RoomNumber`(游戏状态标记);`UpdateAssets` 使用 `Source = RewardSource.象棋`、`UserAssetChangeTypeEnum.增加/减少` 完成金币加减。 +- 共享领域类型:`CommonDomain`(`TopicKeys`、`LoginBindMessage`、`LoginBindResultMessage`、`AdminKickChessPlayerMessage`、`BackgroundOperationNotifyMessage`、`EmptyRoomRateConfig`、`GameTypeEnum` 等)、`Common.Redis`(`RedisKey`)、`CommonDomain.BaseModel.GameBaseConfig`(`ChessConfig`:`CreateRoomLimit` / `MinBetGold` / `BetGoldLimits` / `CreateRoomVipLevels`)。 + +### 7.7 与 Admin 模块的交互 + +- AdminHost 的 `AdminRoomController`(`AdminSrc/AdminApi/GameConfigs/AdminRoomController.cs`)在管理员执行“踢出象棋玩家”时发布 `TopicKeys.后台踢出象棋玩家`,由本模块 `AdminKickChessPlayerSubscriber` 消费并执行踢人 + 通知。 +- 象棋游戏配置(`ChessConfig`:开房权限、最小下注等)由 Admin 侧维护,本模块通过 `IRedisService.GetGameConfig()` 读取并据此校验开房权限与金币下限。 \ No newline at end of file diff --git a/docs/05-捕鱼游戏模块-FishGame.md b/docs/05-捕鱼游戏模块-FishGame.md new file mode 100644 index 0000000..3669013 --- /dev/null +++ b/docs/05-捕鱼游戏模块-FishGame.md @@ -0,0 +1,564 @@ +# 捕鱼游戏模块(FishGame)—— 功能与代码目录文档 + +> 本文档为「捕鱼游戏模块(FishGame)」的完整上下文说明,供其他对话/开发者在不阅读源码的情况下理解该模块的定位、职责、核心业务流程、项目结构、代码目录与模块间交互。文档内容全部基于对真实源代码的通读整理,未读到的内容不作臆测。 + +--- + +## 一、平台背景与模块位置 + +### 1.1 平台总览 + +本平台是一套「捕鱼 + 棋牌」游戏运营平台后端,解决方案文件为 `Template0524.sln`(位于仓库根目录 `d:\BUYUHouDuanNet\BuYu`)。 + +技术栈(依据各项目 `.csproj` 与配置核对): + +- 运行时/框架:**.NET 8**(`net8.0`,`Microsoft.NET.Sdk.Web` / `Microsoft.NET.Sdk`) +- 数据存储:**MongoDB**(`MongoRepository` / `MongoDB.Driver`,`[BsonCollection(..., "data_0524")]`) +- 缓存:**Redis**(`StackExchange.Redis`、`RedisService`、`RedisHelper`) +- 消息队列:**RabbitMQ**,通过 **DotNetCore.CAP**(`DotNetCore.CAP` + `.RabbitMQ` + `.PostgreSql` + `.Dashboard`)封装发布/订阅 +- 实时通信:**SignalR**(`Microsoft.AspNetCore.SignalR`,JSON 协议 + `MessagePack` 协议包引用) +- 网关:**Ocelot**(`Gateway\ocelot.json`,BaseUrl `http://localhost:8001`) +- 日志:**NLog**(`NLog.Web.AspNetCore` + 根目录 `nlog.config`) +- DI:**Autofac**(`Autofac` + `Autofac.Extensions.DependencyInjection`) +- 对象映射:**AutoMapper** + +### 1.2 网关路由(来自 `Gateway\ocelot.json`) + +网关全局 BaseUrl:`http://localhost:8001`。各上游路径映射到的下游服务与端口如下: + +| 上游路径(网关) | 下游路径模板 | 下游端口 | 对应服务 | +| --- | --- | --- | --- | +| `/adminapi/{everything}` | `/adminapi/{everything}` | 5241 | AdminHost | +| `/api/{everything}` | `/api/{everything}` | 5245 | UserHost | +| `/loginhub/{everything}` | `/loginhub/{everything}` | 5245 | UserHost | +| `/customerapi/{everything}` | `/customerapi/{everything}` | 5247 | CustomerHost | +| `/customerHub/{everything}` | `/customerHub/{everything}` | 5247 | CustomerHost | +| `/chess/{everything}` | `/chess/{everything}` | 5242 | ChessGameHost | +| `/chessgamehub/{everything}` | `/chessgamehub/{everything}` | 5242 | ChessGameHost | +| `/fishingroomhub/{everything}` | `/fishingroomhub/{everything}` | **5244** | **FishRoomHost(本模块·房间层)** | +| `/gamehub/{everything}` | **`/fishinghub/{everything}`** | **5248** | **FishGameHost(本模块·对局层)** | + +> 注意:ocelot 中捕鱼「对局层」的上游是 `/gamehub`,下游实际转发到 FishGameHost 的 `/fishinghub`(端口 5248)。这是本模块一个容易混淆的点。 + +### 1.3 本模块两个进程入口 + +本模块由两个独立进程(微服务)构成: + +- **房间层:`FishGameSrc\FishRoomHost`** —— 监听端口 **5244**,SignalR Hub 路径 **`/fishingroomhub`**(网关上游同名),负责大厅房间列表、房间初始化、房间分组广播等。 +- **对局层:`FishGameSrc\FishGameHost`** —— 网关侧端口 **5248**,SignalR Hub 路径 **`/fishinghub`**(网关上游为 `/gamehub`),负责进房、对局(开炮/击杀)、出鱼、结算、掉线重连等核心玩法逻辑。 + +两个进程各自引用一个类库: + +- `FishGameSrc\FishGameService`(被 FishGameHost 引用,承载对局层业务逻辑) +- `FishRoomService`(位于仓库根目录,被 FishRoomHost 引用,承载房间层业务逻辑) + +--- + +## 二、模块简介 + +### 2.1 定位与职责 + +捕鱼游戏模块是整个运营平台的「捕鱼玩法」业务域,划分为 **房间层** 与 **对局层** 两层职责: + +- **房间层(FishRoomHost + FishRoomService)** + - 维护「大区/分区 → 房间列表」,按后台下发的 `GameConfig`(房间配置)批量生成房间,并结合「空房率配置(EmptyRoomRateConfig)」与「机器人配置(BotConfig)」决定每个房间预置的机器人数量。 + - 玩家在大厅请求房间列表时,将其连接加入一个「分区 SignalR 分组」,并单独推送房间列表。 + - 订阅「房间变化」消息,向对应分区分组广播房间状态变化;订阅「用户资产同步前端」消息,向玩家推送资产变更。 + +- **对局层(FishGameHost + FishGameService)** + - 玩家从大厅进入某个房间 → 连接到对局层 Hub(`/fishinghub`)→ 绑定用户 → 加入房间(占座、生成玩家对象、推送房间信息与活跃鱼)→ 对局(开炮、击杀、道具、鱼雷、炮倍切换、挂机)→ 离房/掉线结算。 + - 由后台服务 `FishSpawnService` 负责每个房间的「出鱼」(按概率配置按类型/航线定时刷鱼)、活跃鱼快照、出鱼权租约、命中校验与击杀标记;`RobotKillAnnounceService` 负责按配置定时伪造「机器人爆金击杀」全局公告。 + +### 2.2 核心业务流程(以代码为准) + +1. **服务启动初始化房间(房间层)** + - `FishRoomHost\Program.cs` 启动时,若 `IRedisService.GetGameRoomAllList()` 为空,则调用 `IFishingRoomService.InitRoom()` 初始化房间。房间初始化失败会记录日志并抛出(`throw`)。 + +2. **大厅 → 房间列表(房间层)** + - 客户端连接 `/fishingroomhub`,调用 Hub 方法 `GetRoomList(userId, gameType, roomLevel, roomPartition)`。 + - `FishingRoomService.GetRoomList` 计算分区字符串 `partition = $"{(int)gameType}{roomLevel}{roomPartition}"`;写入/更新 `RedisUserCid`(含 `PartitionId`、`FishRoomCId`、`CId`);把当前连接加入该分区的 SignalR 分组;读取该分区房间列表,若为空则即时 `InitRoom(...)` 生成;最后通过 `FishingRoomSendService.GetRoomListResult` 单独回推 `GetRoomListResult`(按 `RoomNumber` 排序)。 + - 另有 `GetRoomInfo(roomId)` 直接从 Redis 读取单个房间回推 `GetRoomInfoResult`。 + +3. **房间初始化(房间层,`InitRoom`)** + - 依据 `GameConfig.RoomConfigs`(可用 `gameType`/`roomLevel` 过滤)逐条房间配置,遍历 `RoomPartitionNum × RoomCount` 生成 `RedisGameRoom`。 + - 读取该 GameType/RoomLevel 的 `EmptyRoomRateConfig`(空房率);结合 `GameConfig.BotConfig.Enabled`:机器人关闭时空房率为 100%(无机器人房间);否则按 `100 - EmptyRoomRate` 的比例随机挑选要预置机器人的房间,`RobotCount = Random(1, MaxPlayerCount)`。 + - 每生成一个房间前先 `RemoveGameRoom(partition)`(清除旧数据)再重建;`RoomId = $"{(int)GameType}{RoomLevel}{RoomPartition}{c:00}"`。 + - 房间上限:`星际迷航`/`中国象棋` 为 2 人,其余为 4 人(`MaxPlayerCount`)。 + - `RoomBotFactory.FixedBotSeats` 当前为空数组,故 `FixedBotSeatsEnabled == false`,固定座位机器人逻辑(`CreateFixedSeatBots`)当前不会生效。 + - 最后逐个 `SetGameRoom` 写回 Redis。 + +4. **进房(对局层,`FishingGameService.JoinRoom`)** + - 若玩家此前在其它房间,先 `SettleGoldAsync` 结算旧房间金币。 + - 从 Redis 取房间;若房间不存在则以默认「新手渔场(风雷之渊/1)」房间创建兜底。 + - 已有玩家(重连/重复加入):刷新座位 CId、重置 State、必要时接管房主,推送 `RoomInfo`、`OnPlayerInfo`、`SendRoomChange` 后返回。 + - 新玩家:校验座位(固定座位、手动选座权限 `SeatSelectLimit`:3=全部可手选,1=VIP,2=代理),校验 `RoomGoldLimit` 金币门槛;构建 `RedisGamePlayer`(金币、钻石、炮台/翅膀/战神、初始炮倍、`BeginCoin`、`PlayerFactor` 等)加入房间;`CurrentOnlinePlayerCount++`、加入房间分组、设置房主。 + - 依据 `BotConfig` 决定是否创建机器人(`CreateRoomBots`)或移除机器人;随后推送 `RoomInfo`(含活跃鱼)、`RoomJoinNotice`、`OnSeatChange(join)`、`OnPlayerInfo`,并 `SendRoomChange`(CAP 发布「房间变化」)。 + +5. **对局中(对局层)** + - **开炮 `FireCannon`**:校验签名与时间窗、玩家身份、金币、扣费、生成子弹 Id 存入 `BulletTracker`、广播 `RoomFireNotice`、累加消耗进度与「开炮任务」进度。 + - **击杀 `KillFish`**:校验签名/子弹/鱼命中(`FishSpawnService.ValidateFishHit`);按玩家因子(`PlayerFactor`)、系统因子、鱼 `KillWeight` 加权随机判定是否击杀;击杀后计算爆金(`CalcSkillGold`,支持 Boss 轮盘/扑克/飞盘/全屏/范围/概率/星际巡航/烈焰风暴/炸弹/机械蝎/神龙等玩法)、掉落、经验、任务进度,并处理补偿/罚款配额;广播 `RoomKillNotice`;超阈值爆金触发全局击杀公告(CAP 发布「全局击杀公告」+ Redis 频道广播)。 + - **道具/鱼雷**:`UseProp`(消耗钻石或背包道具,`40003` 触发冻结鱼 `FishFrozen`,`40004` 触发狂暴任务)、`UseTorpedo`(按权重抽奖加金币)。 + - **炮倍/挂机/信息**:`ChangeGunMultiple`、`SetPlayerAfk`/`CancelPlayerAfk`、`GetPlayerInfo`。 + - **出鱼**:`FishSpawnService` 以 1 秒 Tick 驱动机器人房间出鱼逻辑,并通过 Redis 租约(`fish:spawn:owner:{roomId}`)保证同一房间只有一台实例出鱼,快照写 `fish:spawn:snapshot:{roomId}` 供无租约实例读取。 + +6. **离房 / 掉线 / 结算(对局层)** + - **主动离房 `LeaveRoom`**:在分布式锁 `lock:fish:gold:{roomId}:{userId}` 下,先「标记离房(State=2)」,再在满足条件时执行 `LeaveRoomInternal`(累加在线时长、结算钓鱼进度与 `GameCoinsSettlement`、清理运行时数据、移除玩家、房主转移、`NormalizeRoomPlayerCounts`、无人时清空并 `UnregisterRoom`、广播 `OnSeatChange(leave)`/`RoomLeaveNotice`、`SendRoomChange`)。 + - **掉线 `HandleDisconnect`**:玩家 State 置 1,房主转移;启动 60 秒延迟任务;超时后 `OnDisconnectTimeoutInternal` 结算并清理房间。 + - **重连 `Reconnect` / `JoinRoom`**:恢复连接、取消待掉线定时器、恢复座位与房主、补发活跃鱼同步。 + +7. **结算(结算链)** + - `TryFlushFishingSettlement` → `GameCoinsSettlement`(记录本局金币变化),`TryFlushFishingProgress` 结算经验(`UpdateAssets`)与消耗记录(`RecordFishingConsume`),`FlushFishingTaskProgress` 发布各「任务完成」事件。 + +--- + +## 三、业务功能清单 + +### 3.1 房间层(FishRoomHost / FishRoomService) + +**SignalR Hub:`FishRoomService\Hubs\FishRoomHub.cs`(挂载于 `/fishingroomhub`)** + +| 类型 | 名称 | 说明 | +| --- | --- | --- | +| Hub 方法 | `OnConnectedAsync` / `OnDisconnectedAsync` | 仅透传基类实现 | +| Hub 方法 | `GetRoomList(userId, gameType, roomLevel, roomPartition)` | 大厅请求房间列表(含分组加入与即时初始化) | +| Hub 方法 | `GetRoomInfo(roomId)` | 读取单房间并回推 `GetRoomInfoResult` | +| 服务端推送 | `GetRoomListResult` | 房间列表结果(`GameRoomReponse` 列表) | +| 服务端推送 | `GetRoomInfoResult` | 单房间信息 | +| 服务端推送 | `RoomChange` | 房间变化广播(向分区分组) | +| 服务端推送 | `AssetUpdated` | 用户资产变更推送 | + +**业务服务** + +| 接口/类 | 职责 | +| --- | --- | +| `IFishingRoomService` / `FishingRoomService` | `GetRoomList`(大厅房间列表)、`InitRoom`(按配置初始化房间) | +| `IFishingRoomSendService` / `FishingRoomSendService` | `GetRoomListResult`(回推列表)、`RoomChange`(向分区分组广播) | +| `IRoomMQService` / `RoomMQService`(实现 `ICapSubscribe`) | 订阅「房间变化」与「用户资产同步前端」 | + +**消息订阅者(CAP)** + +| 订阅方法 | 主题(`TopicKeys`) | 行为 | +| --- | --- | --- | +| `RoomMQService.RoomChange` | `房间变化` = `Topic_0524_RoomChage` | 调用 `FishingRoomSendService.RoomChange`,向房间分区分组广播 `RoomChange` | +| `RoomMQService.UserAssetSync` | `用户资产同步前端` = `Topic_0524_UserAssetSyncFrontend` | 按 `RedisUserCid`(`FishRoomCId`/`CId`)定位连接,推送 `AssetUpdated` | + +**HTTP 控制器**:无(房间层仅 Hub + MQ)。 + +### 3.2 对局层(FishGameHost / FishGameService) + +**SignalR Hub:`FishGameService\Hubs\FishGameHub.cs`(挂载于 `/fishinghub`)** + +| 类型 | 名称 | 说明 | +| --- | --- | --- | +| Hub 方法 | `OnConnectedAsync` | 建立连接(异常记录日志) | +| Hub 方法 | `OnDisconnectedAsync` | 断线处理(调用 `HandleDisconnect`) | +| Hub 方法 | `Reconnect(userId)` | 重连恢复(座位、房主、活跃鱼同步) | +| Hub 方法 | `JoinRoom(roomId, userId, posituin)` | 加入房间 | +| Hub 方法 | `GetRoomInfo(roomId)` | 读取房间并回推 `GetRoomInfoResult`(需连接在房) | +| Hub 方法 | `SyncGameData(roomId, data)` | 房间内同步自定义数据 | +| Hub 方法 | `UseProp(roomId, userId, propNumber, diamond)` | 使用道具,返回剩余数量 | +| Hub 方法 | `UseTorpedo(roomId, userId, propNumber)` | 使用鱼雷,返回金币 | +| Hub 方法 | `FireCannon(roomId, userId, gold, count, timestamp, sign, extra)` | 开炮,返回投递的子弹 Id 列表与金币 | +| Hub 方法 | `KillFish(roomId, userId, fishNumber, fihsId, gold, timespan, bulletId, timestamp, sign)` | 击杀鱼,返回当前金币 | +| Hub 方法 | `LeaveRoom(roomId, userId)` | 主动离房 | +| Hub 方法 | `ChangeGunMultiple(roomId, userId, multiple)` | 切换炮倍 | +| Hub 方法 | `GetPlayerInfo(roomId, userId)` | 请求玩家信息 | +| Hub 方法 | `SetPlayerAfk` / `CancelPlayerAfk` | 挂机 / 取消挂机 | +| Hub 方法 | `BotFireCannon` / `BotKillFish` | 机器人开炮 / 击杀(返回子弹 Id / 无返回) | +| 服务端推送 | `RoomInfo` | 房间信息(含活跃鱼 `activeFishes`) | +| 服务端推送 | `OnFishSpawn` | 出鱼/首屏鱼同步(`type = init/spawn/sync`) | +| 服务端推送 | `RoomKillNotice` | 房间内击杀公告(含倍数、掉落、玩法结果 param) | +| 服务端推送 | `RoomFireNotice` | 开炮广播 | +| 服务端推送 | `RoomJoinNotice` / `RoomLeaveNotice` / `BotLeaveRoomNotice` | 加入/离开/机器人离开 | +| 服务端推送 | `RoomDisconnectNotice` / `HostDisconnect` | 断线通知 / 房主断线 | +| 服务端推送 | `ChangeControllerUser` | 房主变更 | +| 服务端推送 | `OnSeatChange` | 座位变化(join/leave) | +| 服务端推送 | `OnPlayerInfo` | 本玩家信息(金币、钻石、炮倍、炮台、翅膀、座位等) | +| 服务端推送 | `SyncPlayerGold` / `SendPlayerInfoResult` | 金币同步 / 玩家信息结果 | +| 服务端推送 | `ChangeGunMultipleNotice` / `UsePropNotice` / `TorpedoResultNotice` | 炮倍/道具/鱼雷结果 | +| 服务端推送 | `PlayerAfkNotice` / `PlayerCancelAfkNotice` | 挂机状态 | +| 服务端推送 | `Exception` / `BindSuccess` / `KickToMainPage` | 错误 / 绑定成功 / 踢回主页 | +| 服务端推送 | `AssetUpdated` | 资产变更(道具消耗等) | +| 服务端推送 | `FishFrozen` / `SummonCardFishNotice` | 冻结鱼 / 召唤卡出鱼 | +| 全局推送 | `KillNotice` | 经 Redis 频道 `fishgame:global` 广播的全服击杀公告 | + +**HTTP 控制器(`FishGameHost\Controllers`)** + +| 控制器 | 路由 | 方法 | 说明 | +| --- | --- | --- | --- | +| `TimeController` | `fishapi/Time/GetDateTime` | GET | 返回服务端时间/时间戳/时区/容器名(供客户端校时) | +| `RoomController` | `api/Room/QuickJoin` | GET | 按 `gameType`/`level` 从未满房间随机快速匹配,返回 `RoomId` 与 WebSocket 地址 | +| `RoomController` | `api/Room/Assign` | GET | 按 `roomId` 返回求 WebSocket 地址(读取配置 `GameServerInstances`) | +| `PlayerController` | `api/Player/login` | POST | 演示用登录:生成 JWT(`uid` 倒序 + `uname`),返回固定玩家数据 | + +**后台服务** + +| 服务 | 基类 | 职责 | +| --- | --- | --- | +| `FishSpawnService` | `BackgroundService`(同时注册为 `IHostedService`) | 房间出鱼主循环:租约、刷鱼、活跃鱼快照、命中/击杀校验、系统因子同步、冻结延时、临时/召唤卡出鱼 | +| `RobotKillAnnounceService` | `BackgroundService` | 按 `RobotKillConfig` 定时(最小 30 秒)伪造机器人爆金击杀并发布「全局击杀公告」;仅 `INSTANCE_ID` 为 `1` 或 `default` 的实例运行 | +| `GlobalBroadcastSubscriber`(`FishGameHost\Services`) | `BackgroundService` | 订阅 Redis 频道 `fishgame:global`,按 `Target=All` 或 `Room` 通过 Hub 广播事件 | + +**消息订阅者(CAP)** + +| 订阅方法 | 主题(`TopicKeys`) | 行为 | +| --- | --- | --- | +| `PlayerFactorSubscriber.HandlePlayerFactorChanged` | `因子变更` = `Topic_0524_PlayerFactorChanged` | 清理本地玩家因子缓存,并把最新因子同步到 Redis 房间与玩家 | +| `PlayerFactorSubscriber.HandleConfigChanged` | `配置变更` = `Topic_0524_ConfigChanged` | 清空配置缓存、失效出鱼配置、重载所有房间配置 | +| `LoginBindSubscriber.HandleLoginBind` | `登录绑定` = `Topic_0524_LoginBind` | 结算并清理玩家在房状态,回发「登录结果通知」 | +| `LoginBindSubscriber.HandleDismissPendingRoom` | `拒绝回房` = `Topic_0524_DismissPendingRoom` | 强制执行 `CleanupRoomAsync(userId, force: true)` | +| `BackgroundAssetSubscriber.HandleNotify` | `BackgroundOperation.NotifyUser` | 后台加减金币(仅 `CurrencyType==1`),分布式锁下更新房间内玩家金币并 `SyncPlayerGold` | +| `TempSpawnFishSubscriber.HandleTempSpawnFish` | `临时强制出鱼` = `Topic_0524_TempSpawnFish` | 调用 `FishSpawnService.SpawnTemporaryFish` | +| `TempSpawnFishSubscriber.HandleSummonCardFish` | `召唤卡出鱼` = `Topic_0524_SummonCardFish` | 调用 `SpawnSummonCardFish` 并推送 `SummonCardFishNotice` | + +**对局层对外发布的消息** + +| 发布者 | 主题(`TopicKeys`) | 触发点 | +| --- | --- | --- | +| `FishingGameService.SendRoomChange` | `房间变化` = `Topic_0524_RoomChage` | 进房/离房/清理房间等(`PublishAsync`) | +| `FishingGameService.UseProp` / `UseTorpedo` | `用户资产变更` = `Topic_0524_UserAssetsChanged` | 消耗钻石/背包道具/鱼雷(`Publish`) | +| `FishingGameService.FishKillControl` | `全局击杀公告` = `Topic_0524_GlobalKillAnnounce` | 房间内爆金达到阈值 | +| `FishingGameService.FlushFishingTaskProgress` | `任务完成` = `Topic_0524_CompletedTask` | 离房/结算时汇总任务进度 | +| `RobotKillAnnounceService` | `全局击杀公告` = `Topic_0524_GlobalKillAnnounce` | 定时伪造机器人爆金 | +| `LoginBindSubscriber.HandleLoginBind` | `登录结果通知` = `Topic_0524_LoginBindResult` | 登录结算成功/失败回执 | + +> 说明:对局层 Hub 的 `KillNotice` 还有一条「非 CAP」的广播通道——`FishingSendService.KillNotice` 通过 `IConnectionMultiplexer` 向 Redis 频道 `fishgame:global` 发布 JSON 消息,由 `GlobalBroadcastSubscriber` 消费后经 Hub 下发。 + +--- + +## 四、项目结构与技术要点 + +### 4.1 各项目 csproj(框架版本与依赖) + +| 项目 | 相对路径 | SDK/TFM | 项目引用 | 关键 NuGet | +| --- | --- | --- | --- | --- | +| FishRoomHost | `FishGameSrc\FishRoomHost\FishRoomHost.csproj` | `Microsoft.NET.Sdk.Web` / `net8.0` | `FishRoomService`、`Infrastructure\CommonInfrastructure`、`Infrastructure\SharpAbp.Infrastructure.Api` | SignalR.StackExchangeRedis 8.0.0、StackExchange.Redis 2.7.4、NLog.Web.AspNetCore 6.1.2、Autofac 8.3.0、AutoMapper 14.0.0、DotNetCore.CAP(.Dashboard/.PostgreSql/.RabbitMQ) 8.3.4、SignalR.Protocols.MessagePack 8.0.17 | +| FishGameHost | `FishGameSrc\FishGameHost\FishGameHost.csproj` | `Microsoft.NET.Sdk.Web` / `net8.0` | `FishGameService`、`Infrastructure\CommonInfrastructure`、`Infrastructure\SharpAbp.Infrastructure.Api` | StackExchange.Redis 2.7.4、SignalR.Protocols.MessagePack 8.0.0、NLog.Web.AspNetCore 6.1.2、Autofac 8.3.0、AutoMapper 14.0.0、DotNetCore.CAP(.Dashboard/.PostgreSql/.RabbitMQ) 8.3.4 | +| FishGameService | `FishGameSrc\FishGameService\FishGameService.csproj` | `Microsoft.NET.Sdk` / `net8.0`(类库) | `CommonDomain`、`CommonService`、`RedisService`、`UserSrc\UserService` | AutoMapper 14.0.0、DotNetCore.CAP 8.3.4 | +| FishRoomService | `FishRoomService\FishRoomService.csproj` | `Microsoft.NET.Sdk` / `net8.0`(类库) | `CommonService`、`RedisService`、`UserSrc\UserService` | AutoMapper 14.0.0、DotNetCore.CAP 8.3.4、Microsoft.AspNetCore.SignalR.Core 1.2.9 | + +三个 Host/Service 项目均以 `None` 方式引入根目录 `nlog.config`,并拷贝 `docker-compose.yaml`、`Dockerfile` 到输出目录。 + +### 4.2 两个进程入口要点 + +**FishRoomHost\Program.cs** + +- 设置环境变量 `SERVICE_NAME`、`INSTANCE_ID`(默认 `default`),并注册单例 `AppInstanceId`。 +- 配置加载顺序:默认 `appsettings*.json` 之后追加 `Config\system.json`(`builder.Configuration.AddJsonFile(Path.Combine("Config", "system.json"), optional: true)`)。 +- 绑定 `MongoDbSettings`(`IOptions` + `IMongoDbSettings`)。 +- Redis 连接串优先取 `ConnectionStrings:Redis`,否则由 `RedisConfig`(Host/Port/Password/Database)拼装,注册单例 `IConnectionMultiplexer`。 +- SignalR:`MaximumReceiveMessageSize = 64KB`、`StreamBufferCapacity = 512`、`ClientTimeoutInterval = 60s`、`KeepAliveInterval = 5s`,注册 Hub 过滤器 `MovementFilter` 与 `HubExceptionFilter`,使用 `.AddJsonProtocol()`。 +- 其他注册:`FormOptions` 上传上限 16MB、内存缓存、`DatetimeJsonConverter`、`IHttpContextAccessor`、`IHubSend`、`IRequestApi`、`AddAutoMapper(typeof(AutoMapperConfig))`、健康检查 `self`、CORS(`Cors` 策略,允许任意源+凭证)、`AddCustomJwt`、`AddRedisCacheSingleton`。 +- Autofac:`UseServiceProviderFactory` + `RegisterModule()`。 +- CAP:`builder.Services.AddCap(builder.Configuration)`(见 4.4)。 +- 管道:`UseApiLogging` → `UseRouting` → `UseGlobalExceptionHandler` → `UseStaticFiles` → `UseCors("Cors")` → `UseAuthentication` → `UseAuthorization` → `MapHub("/fishingroomhub", WebSockets)` → `MapControllers` → `MapHealthChecks("/health")`。 +- 启动后若房间列表为空则 `InitRoom()`。 + +**FishGameHost\Program.cs** + +- 与 FishRoomHost 结构基本一致(环境变量、`AppInstanceId`、配置、Redis、SignalR、CORS、JWT、RedisCache)。 +- 额外注册 `BulletConfig`(`GetSection("BulletConfig")`)。 +- CAP 相关:显式注册 4 个 `ICapSubscribe` 订阅者(`PlayerFactorSubscriber`、`LoginBindSubscriber`、`BackgroundAssetSubscriber`、`TempSpawnFishSubscriber`),再 `AddCap`。 +- 后台服务:`AddHostedService()`、`AddHostedService()`(`FishSpawnService` 在 AutofacModule 中注册为单例 `IHostedService`)。 +- 管道:`MapHub("/fishinghub", WebSockets)`。 + +### 4.3 DI 注册位置(AutofacModule) + +**FishRoomHost\Middleware\AutofacModule.cs** + +- 泛型注册 `MongoBaseRepository<>` → `IMongoBaseRepository<>`、`MongoBaseService<>` → `IMongoBaseService<>`(`InstancePerLifetimeScope`)。 +- 注册 `RedisService` → `IRedisService`。 +- 按程序集批量注册以 `Service` 结尾的类型(`ApiLogService` 所在程序集、`FishingRoomService` 所在程序集、`UserService.User.UserService` 所在程序集),`AsImplementedInterfaces`。 + +**FishGameHost\Middleware\AutofacModule.cs** + +- 上述 Mongo/Redis/批量服务注册之外,额外: + - `ReconnectTracker` → `IReconnectTracker`(单例) + - `BulletTracker` → `IBulletTracker`(单例) + - `FishKillTracker` → `IFishKillTracker`(单例) + - `FishSpawnConfigStore`(`AsSelf`,单例) + - `FishSpawnService` → `AsSelf` 且 `As`(单例) + - 批量注册 `Service` 结尾类型(排除 `FishSpawnService`、`RobotKillAnnounceService`)与 `Subscriber` 结尾类型(`AsSelf`)。 + +### 4.4 SignalR / CAP / Redis 配置 + +**SignalR**:两进程均在 `Program.cs` 配置过滤器和消息包参数;Hub 均只启用 **WebSockets** 传输。房间层 `MovementFilter` 内附一个令牌桶式 `RateLimiter`(速率常量 30、间隔 33ms),但调用点目前被注释;对局层 `MovementFilter` 记录非跳过方法(`SyncGameData`、`FireCannon`、`KillFish`、`BotFireCannon`、`BotKillFish` 被跳过)的调用日志。 + +**CAP(两个 CapExtension.cs)**: +- 均启用 `UseDashboard()`;RabbitMQ 读取 `CapConfig:Host/UserName/Password/VirtualHost`,`ExchangeName = "cap.exchange"`;存储用 PostgreSQL(`CapConfig:PGLogHost`,Schema `public`);`SucceedMessageExpiredAfter = 7*24*3600`、`FailedRetryCount = 5`、`FailedRetryInterval = 10`,并设置失败阈值回调。 +- **差异**:`FishGameHost\Extension\CapExtension.cs` 额外设置 `x.DefaultGroupName = $"FishGameHost-{instanceId}"`(`INSTANCE_ID` 环境变量),用于多实例分组订阅;`FishRoomHost` 的 CapExtension 额外注册 `IRoomMQService → RoomMQService`。 + +**Redis**: +- 房间层 `Config\system.json`:`RedisConfig` Host `localhost`、Port `6378`、Database `2`、密码 `123456`。 +- 对局层 `Config\system.json`:`RedisConfig` Host `localhost`、Port `6379`、Database `1`、密码 `123456`。 +- 数据存储:房间层 Mongo `mongodb://localhost:27018/?authSource=admin`;对局层 `mongodb://localhost:27017`(Database `data_buyu`)。 +- CAP 存储库:两进程 PostgreSQL 均指向 `data_0524` 库。 + +**对局层独有配置**(`FishGameHost\Config\system.json`): +``` +"BulletConfig": { "SignKey": "63215f0afa3f5b25", "MaxBulletPerUser": 100, "TimeWindowSeconds": 5 }, +"GameServerInstances": [ "http://localhost/fishinghub?instance=1" ] +``` +- `BulletConfig` 用于开炮/击杀签名校验(`SignHelper`:`MD5(raw + "|" + key)` 取前 8 位小写十六进制)与时间窗防重放(`TimeWindowSeconds` 默认 5 秒)。 +- `GameServerInstances` 供 `RoomController` 返回 WebSocket 地址。 + +> 端口补充说明(以代码与配置文件实际值为准,存在多处不一致,需注意): +> - 房间层 `Program.cs` 将 Hub 挂载在 `/fishingroomhub`;`Config\system.json` 中 `"urls": "http://*:8004"`;`launchSettings.json` 开发 URL 为 `http://localhost:8004`;`docker-compose.yaml`(服务名 `0524fishroom`)映射 `5244:80`;ocelot 下游指向 5244。 +> - 对局层 `Program.cs` 将 Hub 挂载在 `/fishinghub`;`Config\system.json` 中 `"urls": "http://*:8003"`;`launchSettings.json` 开发 URL 为 `http://localhost:5263`;`docker-compose.yaml`(服务名 `0524fishgame`)映射 `5243:80`;ocelot 下游指向 5248。 +> +> 即:容器内监听 80,`docker-compose` 将房间层映射到宿主机 5244;对局层的 compose 映射到 5243,而 ocelot 指向 5248——两部分配置本身不一致,文档如实记录,未作统一。 + +### 4.5 docker-compose 端口 + +- `FishGameSrc\FishRoomHost\docker-compose.yaml`:`name: webapi`,服务 `0524fishroom`,镜像 `0524fishroom`,`ports: 5244:80`,`restart: always`。 +- `FishGameSrc\FishGameHost\docker-compose.yaml`:`name: webapi`,服务 `0524fishgame`,镜像 `0524fishgame`,`ports: 5243:80`,`restart: always`。 + +--- + +## 五、代码目录说明 + +> 以下目录树覆盖 `FishGameSrc\**` 与 `FishRoomService\**` 下的全部文件夹与 `.cs/.json` 文件,并标注关键文件职责。 + +### 5.1 `FishGameSrc\FishRoomHost`(房间层进程,5244 / `/fishingroomhub`) + +``` +FishGameSrc\FishRoomHost\ +├── Config\ +│ └── system.json # 运行配置:urls=8004、JwtConfig、PgSql、Cap(RabbitMQ+PG)、RedisConfig、MongoDbSettings、WXConfig +├── Extension\ +│ └── CapExtension.cs # AddCap 扩展:RabbitMQ(cap.exchange)+PostgreSQL 存储+Dashboard,并注册 IRoomMQService +├── Middleware\ +│ ├── ApiLoggingMiddleware.cs # /api 请求响应日志中间件(脱敏 Data 后写 ApiLog 到 Mongo),含 UseApiLogging 扩展 +│ ├── AutofacModule.cs # Autofac 注册:Mongo 泛型仓储/服务、RedisService、按程序集批量注册 Service +│ ├── HubExceptionFilter.cs # SignalR Hub 异常过滤器(记录并吞掉异常,返回 null) +│ └── MovementFilter.cs # SignalR Hub 过滤器(含未启用的 RateLimiter 令牌桶) +├── Properties\ +│ └── launchSettings.json # 开发启动配置(applicationUrl 8004) +├── .dockerignore # Docker 忽略规则 +├── appsettings.json # 基础日志配置 +├── appsettings.Development.json # 开发日志配置 +├── docker-compose.yaml # 容器编排:0524fishroom,5244:80 +├── FishRoomHost.csproj # 房间层进程项目文件 +└── Program.cs # 进程入口:DI、SignalR、CAP、JWT、Redis、MapHub(/fishingroomhub)、启动即 InitRoom +``` + +### 5.2 `FishGameSrc\FishGameHost`(对局层进程,5248 / `/fishinghub`) + +``` +FishGameSrc\FishGameHost\ +├── Config\ +│ └── system.json # urls=8003、JwtConfig、PgSql、Cap、RedisConfig、MongoDbSettings、WXConfig、BulletConfig、GameServerInstances +├── Controllers\ +│ ├── PlayerController.cs # api/Player/login:演示登录签发 JWT 并返回固定玩家数据 +│ ├── RoomController.cs # api/Room/QuickJoin、api/Room/Assign:快速匹配与游戏服地址分配 +│ └── TimeController.cs # fishapi/Time/GetDateTime:服务端校时 +├── Extension\ +│ └── CapExtension.cs # AddCap 扩展:含 DefaultGroupName=FishGameHost-{instanceId} 的多实例分组订阅 +├── Middleware\ +│ ├── ApiLoggingMiddleware.cs # 同房间层,/api 日志中间件 +│ ├── AutofacModule.cs # Autofac:额外注册 Tracker/ConfigStore/FishSpawnService(IHostedService)/Subscriber +│ ├── HubExceptionFilter.cs # Hub 异常过滤器 +│ └── MovementFilter.cs # Hub 过滤器(日志,跳过高频方法的参数打印) +├── Properties\ +│ └── launchSettings.json # 开发启动配置(applicationUrl 5263) +├── Services\ +│ └── GlobalBroadcastSubscriber.cs# 订阅 Redis 频道 fishgame:global,按 All/Room 经 Hub 广播(含 GlobalBroadcastMessage 定义) +├── .dockerignore # Docker 忽略规则 +├── appsettings.json # 基础日志配置 +├── appsettings.Development.json # 开发日志配置 +├── docker-compose.yaml # 容器编排:0524fishgame,5243:80 +├── FishGameHost.csproj # 对局层进程项目文件 +└── Program.cs # 进程入口:DI、SignalR、CAP 订阅者注册、托管服务、MapHub(/fishinghub) +``` + +### 5.3 `FishGameSrc\FishGameService`(对局层类库) + +``` +FishGameSrc\FishGameService\ +├── Config\ +│ └── BulletConfig.cs # 开炮/击杀签名配置:SignKey、MaxBulletPerUser、TimeWindowSeconds +├── GameSend\ +│ ├── IFishingSendService.cs # 对局层推送服务接口(房间信息/击杀/开炮/座位/道具等全部服务端事件) +│ └── FishingSendService.cs # 实现:Hub 发送封装 + 经 Redis 频道 fishgame:global 发布 KillNotice 全局公告 +├── GameService\ +│ ├── FishSpawnConfigStore.cs # 出鱼配置存储:从 Redis(GetFishSpawnConfig) 读取并按 {gameType}:{roomLevel} 缓存,缺失时从 GameConfig 提取 +│ ├── FishingGameService.cs # 对局核心服务(进房/开炮/击杀/道具/鱼雷/离房/掉线/结算/因子/机器人),实现 IPendingSettlementService +│ ├── IBulletTracker.cs # 子弹追踪(BulletTracker) 与 击杀标记(FishKillTracker) 接口与实现(内存,带上限 LRU) +│ ├── IFishingGameService.cs # 对局核心服务接口 +│ └── ReconnectTracker.cs # 重连追踪(内存 ConcurrentDictionary) +├── Hubs\ +│ └── FishGameHub.cs # 对局 Hub:全部客户端方法入口与基础校验 +├── Services\ +│ ├── FishSpawnService.cs # 出鱼后台服务(IHostedService):租约/刷鱼/快照/命中击杀校验/临时出鱼/冻结,含 RoomFishState、ActiveFish、SpawnFishItem +│ ├── KillAnnouncePolicy.cs # 击杀公告阈值策略:gold >= minGold(默认 10,000,000) +│ └── RobotKillAnnounceService.cs # 机器人爆金公告后台服务(RobotKillConfig 驱动) +├── Subscribers\ +│ ├── BackgroundAssetSubscriber.cs# 订阅 BackgroundOperation.NotifyUser:后台加减金币并同步房间 +│ ├── LoginBindSubscriber.cs # 订阅「登录绑定」「拒绝回房」 +│ ├── PlayerFactorSubscriber.cs # 订阅「因子变更」「配置变更」 +│ └── TempSpawnFishSubscriber.cs # 订阅「临时强制出鱼」「召唤卡出鱼」 +├── Utils\ +│ └── SignHelper.cs # 签名工具:MD5(raw|key) 取前 8 位 + 校验 +└── FishGameService.csproj # 对局层类库项目文件 +``` + +### 5.4 `FishRoomService`(仓库根目录,房间层类库) + +``` +FishRoomService\ +├── Hubs\ +│ └── FishRoomHub.cs # 房间 Hub:GetRoomList、GetRoomInfo +├── MQ\ +│ ├── IRoomMQService.cs # 房间 MQ 服务接口(RoomChange) +│ └── RoomMQService.cs # ICapSubscribe:订阅「房间变化」「用户资产同步前端」 +├── RoomSend\ +│ ├── FishingRoomSendService.cs # 房间推送实现:GetRoomListResult、RoomChange +│ ├── IFishingRoomSendService.cs # 房间推送接口 +│ └── Response\ +│ └── GameRoomReponse.cs # 房间列表响应 DTO(RoomId/MaxPlayerCount/CurrentOnlinePlayerCount/RobotCount/RoomNumber) +├── RoomService\ +│ ├── FishingRoomService.cs # 房间业务:GetRoomList(分组+列表)、InitRoom(按配置+空房率+机器人初始化) +│ └── IFishingRoomService.cs # 房间业务接口 +├── AutoMapperConfig.cs # AutoMapper 配置:RedisGameRoom → GameRoomReponse +└── FishRoomService.csproj # 房间层类库项目文件 +``` + +--- + +## 六、关键文件索引 + +| 文件相对路径 | 职责 | +| --- | --- | +| `FishGameSrc\FishRoomHost\Program.cs` | 房间层进程入口:DI、Redis、SignalR(`/fishingroomhub`)、CAP、JWT、启动 `InitRoom` | +| `FishGameSrc\FishRoomHost\Extension\CapExtension.cs` | 房间层 CAP 配置(RabbitMQ+PostgreSQL+Dashboard)与 `IRoomMQService` 注册 | +| `FishGameSrc\FishRoomHost\Middleware\AutofacModule.cs` | 房间层 Autofac 容器注册 | +| `FishGameSrc\FishRoomHost\Middleware\ApiLoggingMiddleware.cs` | 房间层 `/api` 日志中间件 | +| `FishGameSrc\FishRoomHost\Config\system.json` | 房间层运行配置(端口/Redis/Mongo/CAP/JWT) | +| `FishGameSrc\FishRoomHost\docker-compose.yaml` | 房间层容器编排(5244:80) | +| `FishGameSrc\FishGameHost\Program.cs` | 对局层进程入口:DI、SignalR(`/fishinghub`)、CAP 订阅者、托管服务 | +| `FishGameSrc\FishGameHost\Extension\CapExtension.cs` | 对局层 CAP 配置(含多实例 DefaultGroupName) | +| `FishGameSrc\FishGameHost\Middleware\AutofacModule.cs` | 对局层 Autofac 容器注册(Tracker/ConfigStore/FishSpawnService) | +| `FishGameSrc\FishGameHost\Services\GlobalBroadcastSubscriber.cs` | 订阅 Redis 频道 `fishgame:global` 并广播 | +| `FishGameSrc\FishGameHost\Controllers\RoomController.cs` | `api/Room/QuickJoin`、`api/Room/Assign` | +| `FishGameSrc\FishGameHost\Controllers\TimeController.cs` | `fishapi/Time/GetDateTime` 校时接口 | +| `FishGameSrc\FishGameHost\Controllers\PlayerController.cs` | `api/Player/login` 演示登录 | +| `FishGameSrc\FishGameHost\Config\system.json` | 对局层运行配置(BulletConfig、GameServerInstances 等) | +| `FishGameSrc\FishGameHost\docker-compose.yaml` | 对局层容器编排(5243:80) | +| `FishGameSrc\FishGameService\Hubs\FishGameHub.cs` | 对局 Hub:全部客户端方法入口 | +| `FishGameSrc\FishGameService\GameService\FishingGameService.cs` | 对局核心业务(进房/开炮/击杀/结算/掉线/机器人/因子) | +| `FishGameSrc\FishGameService\GameService\IFishingGameService.cs` | 对局核心服务接口 | +| `FishGameSrc\FishGameService\GameService\IBulletTracker.cs` | 子弹追踪与击杀标记(内存实现) | +| `FishGameSrc\FishGameService\GameService\ReconnectTracker.cs` | 重连追踪 | +| `FishGameSrc\FishGameService\GameService\FishSpawnConfigStore.cs` | 出鱼配置缓存与从 GameConfig 提取 | +| `FishGameSrc\FishGameService\Services\FishSpawnService.cs` | 出鱼后台服务(租约/刷鱼/快照/命中校验/冻结) | +| `FishGameSrc\FishGameService\Services\RobotKillAnnounceService.cs` | 机器人爆金公告后台服务 | +| `FishGameSrc\FishGameService\Services\KillAnnouncePolicy.cs` | 击杀公告阈值策略 | +| `FishGameSrc\FishGameService\GameSend\FishingSendService.cs` | 对局层推送实现 + Redis 全局击杀公告 | +| `FishGameSrc\FishGameService\GameSend\IFishingSendService.cs` | 对局层推送接口 | +| `FishGameSrc\FishGameService\Subscribers\LoginBindSubscriber.cs` | 订阅登录绑定/拒绝回房 | +| `FishGameSrc\FishGameService\Subscribers\PlayerFactorSubscriber.cs` | 订阅因子变更/配置变更 | +| `FishGameSrc\FishGameService\Subscribers\TempSpawnFishSubscriber.cs` | 订阅临时出鱼/召唤卡出鱼 | +| `FishGameSrc\FishGameService\Subscribers\BackgroundAssetSubscriber.cs` | 订阅后台资产变更 | +| `FishGameSrc\FishGameService\Config\BulletConfig.cs` | 签名与子弹配置模型 | +| `FishGameSrc\FishGameService\Utils\SignHelper.cs` | 签名计算与校验 | +| `FishRoomService\Hubs\FishRoomHub.cs` | 房间 Hub:GetRoomList、GetRoomInfo | +| `FishRoomService\RoomService\FishingRoomService.cs` | 房间业务:大厅列表与房间初始化 | +| `FishRoomService\RoomService\IFishingRoomService.cs` | 房间业务接口 | +| `FishRoomService\RoomSend\FishingRoomSendService.cs` | 房间推送实现 | +| `FishRoomService\MQ\RoomMQService.cs` | 房间级 CAP 订阅(房间变化、资产同步前端) | +| `FishRoomService\RoomSend\Response\GameRoomReponse.cs` | 房间列表响应 DTO | +| `FishRoomService\AutoMapperConfig.cs` | 房间层 AutoMapper 配置 | +| `Gateway\ocelot.json` | 网关路由(含 `/fishingroomhub`→5244、`/gamehub`→`/fishinghub` 5248) | +| `CommonDomain\TopicKeys.cs` | 全局 CAP 主题常量定义 | +| `CommonDomain\GameConfig.cs` | 游戏配置(房间/鱼/机器人/击杀/出鱼因子等) | +| `CommonDomain\EmptyRoomRateConfig.cs` | 空房率配置 | +| `CommonDomain\BotProfileEntity.cs` | 机器人昵称/头像配置 | +| `CommonDomain\CapMessageModels.cs` | CAP 消息模型(登录绑定/临时出鱼/召唤卡/因子变更/配置变更/后台操作) | +| `Infrastructure\Common\Redis\RedisKey.cs` | Redis Key 生成器(含捕鱼相关 Key) | +| `RedisService\IRedisService.cs` | Redis 服务接口(房间/玩家/配置/因子/进度等读写) | +| `RedisService\Param\RedisGameRoom.cs` | 房间模型 | +| `RedisService\Param\RedisGamePlayer.cs` | 房间内玩家模型 | +| `RedisService\Param\RedisUserCid.cs` | 用户-连接-房间映射模型 | +| `RedisService\Param\RoomBotFactory.cs` | 机器人工厂(`FixedBotSeats` 当前为空) | + +--- + +## 七、与其他模块的交互 + +### 7.1 CAP / RabbitMQ 消息(主题常量见 `CommonDomain\TopicKeys.cs`) + +**本模块「订阅」的消息** + +| 主题常量 | 实际主题名 | 订阅者 | +| --- | --- | --- | +| `房间变化` | `Topic_0524_RoomChage` | `FishRoomService\MQ\RoomMQService`(房间层向分区分组广播 `RoomChange`) | +| `用户资产同步前端` | `Topic_0524_UserAssetSyncFrontend` | `RoomMQService`(房间层推送 `AssetUpdated`) | +| `因子变更` | `Topic_0524_PlayerFactorChanged` | `PlayerFactorSubscriber`(对局层) | +| `配置变更` | `Topic_0524_ConfigChanged` | `PlayerFactorSubscriber`(对局层) | +| `登录绑定` | `Topic_0524_LoginBind` | `LoginBindSubscriber`(对局层,登录前结算离房) | +| `拒绝回房` | `Topic_0524_DismissPendingRoom` | `LoginBindSubscriber`(对局层强制清房) | +| `临时强制出鱼` | `Topic_0524_TempSpawnFish` | `TempSpawnFishSubscriber`(对局层) | +| `召唤卡出鱼` | `Topic_0524_SummonCardFish` | `TempSpawnFishSubscriber`(对局层) | +| `BackgroundOperation.NotifyUser`(字符串常量) | `BackgroundOperation.NotifyUser` | `BackgroundAssetSubscriber`(对局层后台加减币) | + +**本模块「发布」的消息** + +| 主题常量 | 实际主题名 | 发布者 | 消费方(平台其它模块,来自全局定义) | +| --- | --- | --- | --- | +| `房间变化` | `Topic_0524_RoomChage` | `FishingGameService.SendRoomChange`(对局层) | 房间层 `RoomMQService`(本模块内闭环) | +| `用户资产变更` | `Topic_0524_UserAssetsChanged` | `FishingGameService.UseProp/UseTorpedo` | 用户资产模块(UserService) | +| `全局击杀公告` | `Topic_0524_GlobalKillAnnounce` | `FishingGameService.FishKillControl`、`RobotKillAnnounceService` | 全服公告消费方(`UserService\Hubs\KillAnnounceSubscriber.cs` 等) | +| `任务完成` | `Topic_0524_CompletedTask` | `FishingGameService.FlushFishingTaskProgress` | 任务系统(`CompletedTaskParam`,UserService 侧) | +| `登录结果通知` | `Topic_0524_LoginBindResult` | `LoginBindSubscriber.HandleLoginBind` | 登录模块(UserService `LoginResultSubscriber`) | + +> 说明:`全局击杀公告` 由 `UserService\Hubs\KillAnnounceSubscriber.cs` 承接(全服广播);`登录绑定`/`登录结果通知`/`用户资产变更` 等由 UserService 侧订阅者处理,跨进程完成「登录前结算离房」「资产落库与前端同步」等协作。以上消费方文件位于本模块之外,此处仅据主题名与命名对应关系指出大致去向,具体实现不在本模块范围内。 + +### 7.2 Redis Key + +来源 `Infrastructure\Common\Redis\RedisKey.cs` + `RedisKeyGenerator.cs`。`RedisKeyGenerator` 按服务名加前缀(`game`→`game-service`、`user`→`user-service`、`common`→`app-shared`),故实际 Key 形如 `game-service:...`: + +| 属性/常量 | 生成方式 | 实际 Key | 用途 | +| --- | --- | --- | --- | +| `GameConfig` | `GameKey("config")` | `game-service:config` | 游戏配置(`GameConfig`) | +| `ActivityConfig` | `GameKey("activity:config")` | `game-service:activity:config` | 活动配置 | +| `FishingKillConfig` | `GameKey("fishing:killconfig")` | `game-service:fishing:killconfig` | 击杀/玩法配置(`FishingKillConfig`) | +| `FishSpawnConfig` | `GameKey("fish:spawn:config:v1")` | `game-service:fish:spawn:config:v1` | 出鱼配置 JSON | +| `SystemGoldDayKey` | `GameKey("fish:gamestatic")` | `game-service:fish:gamestatic` | 系统当日金币(系统因子计算) | +| `GameRoomIdKey` | `GameKey("room:model:{0}_{1}")` | `game-service:room:model:{0}_{1}` | 房间模型 Key | +| `DistributedLockPrefix` | `CommonKey("lock:")` | `app-shared:lock:` | 分布式锁前缀 | +| `UserCIDGID` | `UserKey("uid:{0}")` | `user-service:uid:{0}` | 用户 → 连接/房间映射 | +| `CIDUser` / `LoginCIDUser` | `UserKey("cid:{0}")` | `user-service:cid:{0}` | 连接 → 用户映射 | + +`FishSpawnService` 内自定义 Redis Key: + +| 常量前缀 | 完整 Key | 用途 | +| --- | --- | --- | +| `fish:spawn:global:id` | 同左 | 全局自增鱼 Id | +| `SpawnOwnerKeyPrefix` | `fish:spawn:owner:{roomId}` | 房间出鱼权租约(10 秒) | +| `ActiveFishSnapshotKeyPrefix` | `fish:spawn:snapshot:{roomId}` | 活跃鱼快照(60 秒) | +| `FishKilledKeyPrefix` | `fish:spawn:killed:{roomId}:{fishId}` | 鱼已击杀标记 | +| `SpawnStopKeyPrefix` | `fish:spawn:stop:{roomId}` | 房间停止出鱼标记 | + +`FishingGameService` 使用分布式锁 Key:`{lock:}fish:gold:{roomId}:{userId}`(金币/结算互斥)。 + +Redis 发布/订阅频道(非 CAP):`fishgame:global` —— `FishingSendService.KillNotice` 发布,`GlobalBroadcastSubscriber` 订阅。 + +### 7.3 HTTP 调用 + +- 本模块内 `FishGameHost\Controllers\RoomController.cs` 读取配置 `GameServerInstances` 返回游戏服 WebSocket 地址(当前取列表第 0 项),并读取 Redis 房间列表做快速匹配。 +- 通过 `IRequestApi`(注册于 `Program.cs`)提供对外 HTTP 请求能力;`FishingGameService`、房间层服务通过 `IUserService`(UserService 项目)读写用户资产、属性、结算等(`GameCoinsSettlement`、`UpdateAssets`、`UpdateUser`、`RecordFishingConsume`、`GetUser`)。 +- 校时接口 `fishapi/Time/GetDateTime` 供客户端对齐服务器时间。 + +### 7.4 共享实体 / 项目引用 + +- **项目引用链**: + - `FishRoomHost` → `FishRoomService`、`CommonInfrastructure`、`SharpAbp.Infrastructure.Api` + - `FishGameHost` → `FishGameService`、`CommonInfrastructure`、`SharpAbp.Infrastructure.Api` + - `FishGameService` → `CommonDomain`、`CommonService`、`RedisService`、`UserService` + - `FishRoomService` → `CommonService`、`RedisService`、`UserService` +- **共享实体/模型**:`RedisService.Param`(`RedisGameRoom`、`RedisGamePlayer`、`RedisUserCid`、`RoomBotFactory`)、`CommonDomain`(`GameConfig`、`EmptyRoomRateConfig`、`BotProfileEntity`、`FishingKillConfig`、`ActiveFish` 相关、`TopicKeys`、`CapMessageModels`、`KillAnnounceParam`)、`UserDomain.Entity`(`UserEntity`)、`CommonDomain.Enum`(`GameTypeEnum`、`FishTypeEnum`、`ProductTypeEnum`、`TaskEvent`、`ErrorCodes` 等)。 +- **公共基础设施**:`MongoRepository`(`IMongoBaseRepository<>` / `IMongoBaseService<>`)、`RedisService` / `RedisHelper`(`ICache`、`IDistributedLock`)、`SharpAbp.Infrastructure.Api`(`UseGlobalExceptionHandler` 等中间件)、`JWTHelper`(`AddCustomJwt`、`JwtTools`)、`CommonService`(`IHubSend<>`、`HubSend<>`、`ApiLogService`、`AppInstanceId`)。 + +--- + +> 本文档为一次性通读源码后整理的静态说明;如后续修改了 Hub 方法、CAP 主题、Redis Key 或端口配置,请同步更新本文件。 \ No newline at end of file diff --git a/docs/06-网关模块-Gateway.md b/docs/06-网关模块-Gateway.md new file mode 100644 index 0000000..81105f1 --- /dev/null +++ b/docs/06-网关模块-Gateway.md @@ -0,0 +1,215 @@ +# 网关模块(Gateway)—— 功能与代码目录文档 + +> 本文档是「网关模块(Gateway)」的完整上下文说明文档,用于把该模块的背景、职责、路由规则、项目结构、目录树与关键文件一次性提供给其他对话或开发者,使其无需阅读源码即可准确理解该模块。文中所有内容均以 `d:\BUYUHouDuanNet\BuYu\Gateway\` 下的实际代码与配置为准。 + +## 一、平台背景与模块位置 + +本模块所属项目为「捕鱼 + 棋牌游戏运营平台」后端,位于解决方案 `Template0524.sln`(根目录 `d:\BUYUHouDuanNet\BuYu\`)中的 `Gateway\Gateway.csproj`。 + +平台整体技术栈: + +- 运行时 / 框架:`.NET 8`(各工程目标框架均为 `net8.0`) +- 数据库:MongoDB +- 缓存:Redis +- 消息队列:RabbitMQ(通过 CAP / DotNetCore.CAP 使用,对应基础设施工程 `RabbitMQHelper`) +- 实时通信:SignalR +- API 网关:**Ocelot** +- 日志:NLog +- IoC 容器:Autofac + +平台由多个后端宿主(Host)服务 + 一个网关组成。各后端服务及其监听端口(与 `Gateway\ocelot.json` 的下游端口逐一对应): + +| 后端服务 | 说明 | 端口 | +| --- | --- | --- | +| AdminHost | 后台管理端宿主 | 5241 | +| UserHost | 用户端宿主 | 5245 | +| CustomerHost | 客服端宿主 | 5247 | +| ChessGameHost | 棋牌游戏宿主 | 5242 | +| FishRoomHost | 捕鱼房间宿主 | 5244 | +| FishGameHost | 捕鱼游戏宿主 | 5248 | + +网关自身的对外入口(BaseUrl / 监听端口)为 **`http://localhost:8001`**(由 `ocelot.json` 的 `GlobalConfiguration.BaseUrl` 与 `appsettings.json` 的 `urls` 共同确定)。 + +> 模块位置:在解决方案中,Gateway 作为独立顶层工程存在,工程 GUID 为 `{430C217C-897A-42EE-996D-75A02FF22A50}`,物理路径为 `Gateway\`。它是所有前端请求进入后端的唯一统一入口。 + +## 二、模块简介 + +网关模块基于 **Ocelot 20.0.0** 实现,是整个平台的统一流量入口。其定位与职责如下: + +1. **统一入口**:前端(用户端、客服端、后台管理端、游戏端)只需访问网关地址 `http://localhost:8001`,无需关心后端各服务的真实地址与端口。 +2. **路由转发**:依据 `ocelot.json` 中声明式的 `Routes` 配置,把上游(Upstream)请求按路径模板转发到对应下游(Downstream)服务。 +3. **反向代理与转发头处理**:通过 `ForwardedHeaders` 中间件处理 `X-Forwarded-For` / `X-Forwarded-Proto`,保证后端服务能拿到真实客户端 IP 与协议(配置了可信代理白名单)。 +4. **健康检查**:暴露 `/health` 健康检查端点。 +5. **WebSocket / SignalR 透传**:Ocelot 原生支持 WebSocket,网关同时承载各服务的 SignalR Hub 路径(见第三节)。 +6. **可扩展的横切能力(已注册但当前未按路由启用)**: + - 已引入并注册 **缓存**(`Ocelot.Cache.CacheManager`,使用内存字典句柄); + - 已引入并注册 **Polly**(`Ocelot.Provider.Polly`),具备按路由配置超时 / 重试 / 熔断的能力; + - `csproj` 中引用了 `AspNetCoreRateLimit 5.0.0`,但 `Program.cs` 中未对其做任何注册或中间件装配。 + +**当前网关不承担鉴权职责**:`ocelot.json` 的所有路由均未配置 `AuthenticationOptions` / `AuthenticationProviderKey`,网关层不做 JWT / 身份校验,鉴权由各下游服务自行完成。 + +**当前网关未配置 CORS**:无论 `Program.cs` 还是 `ocelot.json`,都没有 CORS / `SecurityOptions` 相关配置,跨域由下游服务或前端处理。 + +## 三、路由清单 + +以下路由表完整对应 `Gateway\ocelot.json` 中 `Routes` 数组的 9 条路由(顺序与文件中一致)。所有路由的 `DownstreamScheme` 均为 `http`,`UpstreamHttpMethod` 均为 `["Get","POST","PUT","DELETE","OPTIONS"]`。 + +| 上游路径模板(Upstream) | 下游服务 | 下游地址 | 下游路径模板(Downstream) | 用途说明 | +| --- | --- | --- | --- | --- | +| `/loginhub/{everything}` | UserHost | `http://localhost:5245` | `/loginhub/{everything}` | 用户端登录相关 SignalR Hub | +| `/customerHub/{everything}` | CustomerHost | `http://localhost:5247` | `/customerHub/{everything}` | 客服端 SignalR Hub | +| `/chessgamehub/{everything}` | ChessGameHost | `http://localhost:5242` | `/chessgamehub/{everything}` | 棋牌游戏 SignalR Hub | +| `/fishingroomhub/{everything}` | FishRoomHost | `http://localhost:5244` | `/fishingroomhub/{everything}` | 捕鱼房间 SignalR Hub | +| `/gamehub/{everything}` | FishGameHost | `http://localhost:5248` | **`/fishinghub/{everything}`** | 捕鱼游戏 SignalR Hub(**上游 `/gamehub` 映射到下游 `/fishinghub`,路径被重写**) | +| `/chess/{everything}` | ChessGameHost | `http://localhost:5242` | `/chess/{everything}` | 棋牌游戏 HTTP 接口 | +| `/adminapi/{everything}` | AdminHost | `http://localhost:5241` | `/adminapi/{everything}` | 后台管理 HTTP 接口 | +| `/api/{everything}` | UserHost | `http://localhost:5245` | `/api/{everything}` | 用户端 HTTP 接口 | +| `/customerapi/{everything}` | CustomerHost | `http://localhost:5247` | `/customerapi/{everything}` | 客服端 HTTP 接口 | + +### 关于 SignalR / WebSocket 路由 + +以下 5 条属于 SignalR Hub(实时通信)路由,客户端通过 WebSocket 长连接访问,网关借助 Ocelot 的 WebSocket 透传能力转发: + +- `/loginhub/*`(→ UserHost:5245) +- `/customerHub/*`(→ CustomerHost:5247) +- `/chessgamehub/*`(→ ChessGameHost:5242) +- `/fishingroomhub/*`(→ FishRoomHost:5244) +- `/gamehub/*`(→ FishGameHost:5248,下游实际路径为 `/fishinghub/*`) + +其余 4 条为常规 HTTP 接口路由:`/chess/*`、`/adminapi/*`、`/api/*`、`/customerapi/*`。 + +> **关键注意点(易错)**:除 `/gamehub` 外,其余路由的上游路径与下游路径同名;仅 `/gamehub/{everything}` 这一条被显式重写为下游 `/fishinghub/{everything}`。排查「游戏 Hub 连不上」类问题时需特别注意这一映射差异。 + +## 四、项目结构与技术要点 + +### 4.1 工程文件(Gateway.csproj) + +- 工程类型:`Microsoft.NET.Sdk.Web` +- 目标框架:`net8.0` +- 语言特性:`Nullable=enable`、`ImplicitUsings=enable` +- 关键 NuGet 包: + + | 包名 | 版本 | 作用 | + | --- | --- | --- | + | `Ocelot` | 20.0.0 | API 网关核心 | + | `Ocelot.Cache.CacheManager` | 20.0.0 | Ocelot 输出缓存扩展 | + | `Ocelot.Provider.Polly` | 20.0.0 | Ocelot 的 Polly 集成(QoS:超时/重试/熔断) | + | `AspNetCoreRateLimit` | 5.0.0 | 限流库(**已在 csproj 引用,但代码中未启用**) | + +- 内容拷贝设置: + - `appsettings.json` → `CopyToOutputDirectory=Always` + - `ocelot.json` → `CopyToOutputDirectory=Always`(同时在 `` 中声明为 `PreserveNewest`) + - `docker-compose.yaml` → `CopyToOutputDirectory=Always` + - `Dockerfile` → `CopyToOutputDirectory=Always`(**注意:csproj 中引用了 `Dockerfile`,但当前工程目录下实际不存在该文件**) + +### 4.2 启动流程(Program.cs)要点 + +入口为顶层语句(Top-level statements),核心逻辑: + +1. **配置加载**: + - `builder.Configuration.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true)` —— `ocelot.json` 为必需文件,且支持热重载(修改路由配置无需重启)。 + - `builder.Configuration.AddJsonFile(Path.Combine("Config", "system.json"), optional: true)` —— `Config\system.json` 为可选补充配置。 +2. **注册 Ocelot**:`builder.Services.AddOcelot(builder.Configuration).AddCacheManager(x => x.WithDictionaryHandle()).AddPolly()` + - 使用内存字典(`WithDictionaryHandle`)作为缓存存储; + - 启用 Polly 提供者(具备 QoS 能力,但路由中未配置 `QoSOptions`)。 +3. **健康检查**:`builder.Services.AddHealthChecks()`。 +4. **转发头配置**:`Configure` 设置 `XForwardedFor | XForwardedProto`,清空默认已知代理/网络后,加入可信代理 `127.0.0.1`、`::1`(IPv6)、`172.19.0.1`(其中 `172.17.0.1`、`172.18.0.1` 被注释掉)。 +5. **中间件管道**: + - `app.UseForwardedHeaders()` —— 启用转发头处理; + - `app.MapHealthChecks("/health")` —— 暴露 `/health`; + - `await app.UseOcelot()` —— 启用 Ocelot 网关(**置于管道末尾,所有未匹配的路由交给 Ocelot 处理**); + - `app.Run()`。 + +### 4.3 配置文件加载方式 + +| 文件 | 是否必需 | 热重载 | 说明 | +| --- | --- | --- | --- | +| `ocelot.json` | 必需(`optional:false`) | 是 | 网关路由与全局配置的唯一来源 | +| `Config\system.json` | 可选(`optional:true`) | 否 | 补充配置(日志、Redis 连接等),合并进 `IConfiguration` | + +`appsettings.json` 与 `Config\system.json` 中都声明了 `"Ocelot": { "Config": "ocelot.json" }` 与 `AllowedHosts`;`appsettings.json` 额外声明了 Web 监听地址。 + +### 4.4 监听端口 + +- `appsettings.json` 中 `"urls": "http://*:8001"` —— 网关对外监听 **8001** 端口(监听所有网卡的 8001)。 +- `ocelot.json` 中 `GlobalConfiguration.BaseUrl = "http://localhost:8001"`,与之一致。 +- `Properties\launchSettings.json`(仅用于本机 Visual Studio 调试)中 `applicationUrl` 为 `https://localhost:28831;http://localhost:28832`,`ASPNETCORE_ENVIRONMENT=Development`。**该调试端口与实际运行端口 8001 不同**,是容易混淆之处。 + +### 4.5 部署方式 + +- **Docker Compose**:`docker-compose.yaml` 定义了单个服务: + - `name: webapi`(compose 项目名) + - 服务名 `0524gateway`,容器名 `0524gateway`,镜像 `0524gateway` + - `restart: always` + - 端口映射 `8001:80`(宿主 8001 → 容器 80,容器内监听 80 端口) +- **本机直接运行**:`dotnet run`(读取 `appsettings.json` 的 `urls` = `http://*:8001`)。 + +## 五、代码目录说明 + +以下目录树覆盖 `Gateway\` 下的**全部**文件夹与文件(已排除编译产物 `bin/obj`,该目录下当前未包含 `bin`/`obj`)。 + +```text +Gateway/ # 网关模块根目录(Ocelot API 网关工程) +├── Config/ # 补充配置目录 +│ └── system.json # 系统补充配置:日志级别、Ocelot 配置文件名、AllowedHosts、RedisConfig(连接串等) +├── Properties/ # 工程属性目录(VS 调试用) +│ └── launchSettings.json # 本机启动配置:Development 环境、调试用 applicationUrl(28831/28832) +├── appsettings.json # 应用主配置:监听地址 urls=http://*:8001、日志级别、AllowedHosts、Ocelot.Config +├── docker-compose.yaml # Docker 部署编排:服务 0524gateway,端口映射 8001:80,restart=always +├── Gateway.csproj # 工程文件:net8.0 + Ocelot 20.0.0 等 NuGet 包引用、内容文件拷贝规则 +├── ocelot.json # Ocelot 核心配置:9 条路由 Routes + GlobalConfiguration(BaseUrl=http://localhost:8001) +└── Program.cs # 程序入口:加载配置、注册 Ocelot/健康检查、转发头、UseOcelot 管道 +``` + +> 说明:`Gateway.csproj` 中引用了 `Dockerfile`(``),但该文件当前并未存在于 `Gateway\` 目录中;`docker-compose.yaml` 引用的镜像 `0524gateway` 需由外部构建提供。 + +## 六、关键文件索引 + +| 文件相对路径 | 职责 | +| --- | --- | +| `Gateway/Gateway.csproj` | 工程定义:目标框架 `net8.0`,依赖 Ocelot 20.0.0 系列包与 AspNetCoreRateLimit 5.0.0,声明配置文件拷贝规则 | +| `Gateway/Program.cs` | 程序入口:加载 `ocelot.json`/`Config/system.json`,注册 Ocelot + CacheManager + Polly、健康检查、转发头,挂载 `UseOcelot` | +| `Gateway/ocelot.json` | 网关路由与全局配置(9 条路由、下游服务/端口、`/gamehub`→`/fishinghub` 重写、BaseUrl=8001) | +| `Gateway/appsettings.json` | 主配置:监听地址 `http://*:8001`、日志级别、AllowedHosts、`Ocelot:Config=ocelot.json` | +| `Gateway/Config/system.json` | 补充配置:日志级别、Ocelot 配置项、AllowedHosts、RedisConfig(Host/Port/Password/Database/ConnectionString) | +| `Gateway/Properties/launchSettings.json` | 本机 VS 调试配置:环境变量 `ASPNETCORE_ENVIRONMENT=Development`,调试 `applicationUrl`(28831/28832) | +| `Gateway/docker-compose.yaml` | 容器化部署:单服务 `0524gateway`,镜像 `0524gateway`,端口 `8001:80`,`restart: always` | + +## 七、与其他模块的交互 + +网关是本平台前后端交互的唯一通道,其与各后端服务的交互完全由 `ocelot.json` 的路由映射决定。汇总如下(同时包含上游路径与下游目标): + +### 7.1 网关到各服务的路由映射总表 + +| 上游路径模板 | 下游服务(端口) | 下游地址 | 下游路径 | 类型 | +| --- | --- | --- | --- | --- | +| `/loginhub/{everything}` | UserHost (5245) | `http://localhost:5245` | `/loginhub/{everything}` | SignalR Hub | +| `/customerHub/{everything}` | CustomerHost (5247) | `http://localhost:5247` | `/customerHub/{everything}` | SignalR Hub | +| `/chessgamehub/{everything}` | ChessGameHost (5242) | `http://localhost:5242` | `/chessgamehub/{everything}` | SignalR Hub | +| `/fishingroomhub/{everything}` | FishRoomHost (5244) | `http://localhost:5244` | `/fishingroomhub/{everything}` | SignalR Hub | +| `/gamehub/{everything}` | FishGameHost (5248) | `http://localhost:5248` | `/fishinghub/{everything}`(**重写**) | SignalR Hub | +| `/chess/{everything}` | ChessGameHost (5242) | `http://localhost:5242` | `/chess/{everything}` | HTTP API | +| `/adminapi/{everything}` | AdminHost (5241) | `http://localhost:5241` | `/adminapi/{everything}` | HTTP API | +| `/api/{everything}` | UserHost (5245) | `http://localhost:5245` | `/api/{everything}` | HTTP API | +| `/customerapi/{everything}` | CustomerHost (5247) | `http://localhost:5247` | `/customerapi/{everything}` | HTTP API | + +按下游服务聚合: + +- **AdminHost(5241)**:`/adminapi/*` +- **UserHost(5245)**:`/api/*`(HTTP)、`/loginhub/*`(Hub) +- **CustomerHost(5247)**:`/customerapi/*`(HTTP)、`/customerHub/*`(Hub) +- **ChessGameHost(5242)**:`/chess/*`(HTTP)、`/chessgamehub/*`(Hub) +- **FishRoomHost(5244)**:`/fishingroomhub/*`(Hub) +- **FishGameHost(5248)**:`/gamehub/*`(Hub,下游为 `/fishinghub/*`) + +### 7.2 附加说明(以实际配置为准) + +- **超时 / 重试 / 熔断**:虽然注册了 `AddPolly()`(`Ocelot.Provider.Polly`),但 `ocelot.json` 的所有路由均**未配置 `QoSOptions`**,因此当前没有按路由设置的自定义超时、重试或熔断策略(`csproj` 已具备该能力,可按需在路由中启用)。 +- **缓存**:已注册 `AddCacheManager(...WithDictionaryHandle())`(内存字典缓存),但路由中**未配置 `FileCacheOptions`**,因此当前没有开启任何按路由的输出缓存。 +- **限流**:`csproj` 引用了 `AspNetCoreRateLimit 5.0.0`,但 `Program.cs` **未注册相关服务或中间件**,故当前**未启用限流**。 +- **鉴权**:路由中**无 `AuthenticationOptions`**,网关不校验身份;鉴权由下游各 Host 完成。 +- **CORS**:`Program.cs` 与 `ocelot.json` 均**未配置 CORS**。 +- **日志**:网关使用 ASP.NET Core 内置日志,级别由 `appsettings.json` / `Config/system.json` 的 `Logging.LogLevel` 控制(`Default=Information`、`Microsoft.AspNetCore=Warning`);**网关工程未接入 NLog**(NLog 为平台其他服务的日志方案)。 +- **健康检查**:网关暴露 `/health`(`app.MapHealthChecks("/health")`),可用于存活探测;`docker-compose.yaml` 未配置 healthcheck 指令。 +- **转发头**:网关对 `127.0.0.1`、`::1`、`172.19.0.1` 作为可信代理,处理 `X-Forwarded-For` / `X-Forwarded-Proto`,使下游能获得真实客户端 IP 与协议。 +- **配置热重载**:`ocelot.json` 以 `reloadOnChange:true` 加载,修改路由后可热更新,无需重启进程。 \ No newline at end of file diff --git a/docs/07-公共基础设施-Infrastructure.md b/docs/07-公共基础设施-Infrastructure.md new file mode 100644 index 0000000..f8592b3 --- /dev/null +++ b/docs/07-公共基础设施-Infrastructure.md @@ -0,0 +1,499 @@ +# 公共基础设施(Infrastructure 等)—— 功能与代码目录文档 + +> 本文档为「公共基础设施层(Infrastructure / RedisService / ApiLogService / Tools / nlog.config)」的完整上下文说明,供其他对话或开发者作为该模块的上下文直接使用。文中所有路径均相对解决方案根目录 `d:\BUYUHouDuanNet\BuYu`,所有描述均以实际代码为准;未在代码中确认的内容不写入。 + +--- + +## 一、平台背景与模块位置 + +- 本平台是「捕鱼 + 棋牌」游戏运营平台的后端,解决方案文件为 `Template0524.sln`。 +- 技术栈:.NET 8 + MongoDB + Redis + RabbitMQ(业务上层使用 DotNetCore.CAP,本层的通用消息封装使用 EasyNetQ)+ SignalR + Ocelot 网关 + NLog + Autofac。 +- 网关监听 `http://localhost:8001`(`Gateway/appsettings.json` 中 `"urls": "http://*:8001"`)。 +- 各服务端口由 Ocelot 网关 `Gateway/ocelot.json` 配置(与代码一致): + - AdminHost = 5241(管理后台) + - UserHost = 5245(用户) + - CustomerHost = 5247(客服) + - ChessGameHost = 5242(棋牌游戏) + - FishRoomHost = 5244(捕鱼房间) + - FishGameHost = 5248(捕鱼游戏) +- 本模块中的项目(除 `Tools/RenameUploads` 为独立可执行工具外)**全部是没有独立进程的类库**,被打包进上述各业务 Host / Service / Domain / Api 项目运行。 + +--- + +## 二、模块简介 + +公共基础设施层是整个后端的技术底座,为 Admin(管理后台)、User(用户)、Customer(客服)、ChessGame(棋牌)、FishGame(捕鱼)等全部业务模块提供横切能力: + +- **通用基础设施**(`Infrastructure/Common`):统一响应模型、业务异常、系统枚举、通用工具扩展、拼音/脱敏/时间戳转换、敏感词过滤、微信 API 帮助类、跨域、HTTP 请求封装、Redis Key 命名约定。 +- **Web 基础设施**(`Infrastructure/CommonInfrastructure`、`Infrastructure/SharpAbp.Infrastructure.Api`):Autofac 自动注册模块、统一 `BaseController`(解析登录用户 / 客户端 IP)、Controller 结果扩展、全局异常中间件、配置与连接串帮助类、熔断器。 +- **数据与中间件封装**:MongoDB 通用仓储(`MongoRepository`)、Redis 缓存与分布式锁封装(`RedisHelper`)、RabbitMQ 消息发布/订阅封装(`RabbitMQHelper`)。 +- **认证**:JWT 生成/校验与 ASP.NET Core 认证接线(`JWTHelper`)。 +- **定时任务**:基于 Cronos 的后台定时任务基类(`ScheduledService`)。 +- **领域级 Redis 服务**:面向前述业务域的 Redis 读写封装(`RedisService`)。 +- **API 日志**:把每次 API 请求落库到 MongoDB 的日志服务(`ApiLogService`,实际使用实现位于 `CommonService`,详见第七节说明)。 +- **运维工具与日志**:上传文件批量改名工具(`Tools/RenameUploads`)与全服务共用的 NLog 配置(`nlog.config`)。 + +--- + +## 三、功能清单(按子项目分组) + +### 3.1 Infrastructure/Common(通用基础库,命名空间 `Common`) + +| 能力 | 关键类 / 文件 | 说明 | +| --- | --- | --- | +| 统一响应模型 | `BaseResponse.cs` | `BaseCommonResponse`(`Code` + `Info`)、`BaseResponse`、`ListResponse`、`PageResponse`(含 `Count`)、`PageDataResponse`。所有接口统一以该结构返回 | +| 业务异常 | `BusinessException.cs` | 继承 `Exception`,带 `ErrorCode`,供全局异常中间件识别并转成业务错误响应 | +| 响应码枚举 | `SystemEnum.cs` | `CommonResponseCodeEnum`:`Success=0`、`Error=-1`、`Exception=500`、`NoAuth=401`、`NoRole=403`、`TokenExpire=1000`、`NoLogin=401`、`TokenInvalid=12`、`ParamError=13`、`SignError=14`、`ResultNull=15`、`LowVersion=16`、`ResultFail=-1` | +| 实例标识 | `AppInstanceId.cs` | 仅含 `string Id`,用于区分同一服务的多个实例 | +| Redis Key 生成 | `Redis/RedisKeyGenerator.cs` | 按服务前缀生成 Key;`ServicePrefixes`:`user→user-service`、`admin→admin-service`、`game/fish/chess→game-service`、`customer→customer-service`、`common→app-shared`(未匹配时兜底 `app-shared`)。提供 `UserKey/AdminKey/GameKey/CustomerKey/CommonKey/GetKey` | +| Redis Key 常量 | `Redis/RedisKey.cs` | 基于 `RedisKeyGenerator` 的业务 Key 常量,如 `MatchingRoom`、`UserCIDGID`(user-service:uid:{0})、`LoginCIDUser`/`CIDUser`(user-service:cid:{0})、`VerificationCode`(user-service:verification_code:{0})、`ProductRedis`、`WeiXin_AccessToken`(app-shared:wx_access_token)、`WeiXinUser_AccessToken`、`GameConfig`、`ActivityConfig`、`GameRoomIdKey`(game-service:room:model:{0}_{1})、`DistributedLockPrefix`(app-shared:lock:)、`ChessRoomList`、`ChessRoomKey`、`SystemGoldDayKey`、`CUSTOMER_ONLINE_KEY`(customer-service:online)、`FishingKillConfig`、`FishSpawnConfig`、访问/流量统计 Key(`app-shared:stats:*`)。同文件还保留一套**旧版常量** `RedisKeyConstants`(前缀 `redis0524:`,其中客户在线为 `game0524:customer:online`) | +| 通用数据模型 | `CommonModel/BaseIdName.cs`、`CommonModel/BaseListPageParam.cs` | `BaseIdName`(Id/Name);`BaseListPageParam`(KeyWord/PageIndex/PageSize,带默认值与去空格逻辑) | +| 跨域 | `Cors/CorsExtension.cs` | `AddCustomCors()` 注册名为 `Cors` 的策略(允许任意来源、任意 Header/Method、允许凭据);`UseCustomCors()` 启用 | +| 敏感词过滤 | `BlockWord/BlockWord.cs`、`BlockWord/BlockWordHelper.cs` | `BlockWord.BlockWordValue` 为超大型敏感词表(逗号分隔,含政治/色情/毒品等);`BlockWordHelper` 基于 `ToolGood.Words.StringSearch` 提供 `IsHaveBlockWord`、`ReplaceBlockWord`、`GetBlockWord` | +| HTTP 请求封装 | `Request/IRequestApi.cs`、`Request/RequestApi.cs` | 基于 RestSharp,`IRequestApi`:`GetAsync`、`PostAsync`、`PostFormDataAsync`、`DownloadFile`。构造时从 `IHttpContextAccessor` 取请求头 `token` 作为默认头;响应统一提取 `code` 做日志判断 | +| 微信帮助类 | `WX/WXBaseHelper.cs` | 读取配置 `WXConfig:AppId/Secret/Url`;`GetAccessToken()` 走 `/cgi-bin/token`(`client_credential`)并缓存 3600s;`GetAccessTokenByCode(js_code)` 走 `/sns/jscode2session`(`authorization_code`)并缓存 6000s | +| 微信响应模型 | `WX/Response/WXBaseResponse.cs`、`AccessTokenResponse.cs`、`GZHUserInfoResponse.cs`、`TicketResponse.cs` | 分别对应微信基础响应(errCode/errmsg)、access_token、公众号用户信息、jsapi_ticket | +| 通用工具 | `Utils/*` | 见下 | +| 表达式扩展 | `LinqExtensions.cs` | 提供 `And`/`Or`/`True`/`False` 等动态组合 `Expression>` 的能力(含 `ParameterRebinder`) | + +`Utils` 目录关键工具: + +- `ConvertExtension.cs`:大量类型转换与业务扩展——`ObjToInt/Long/Money/String/Decimal/Date/Bool`、时间戳互转(`ToTimeStamp`/`ConvertToDateTime`/`ToDateTime`)、`ToJson/ToObject`、`Clone`、Base64、`ToHidMobile`、`IsHandset`、`ConvertToPinyin`(NPinyin)、`ToSHA1Encrypt`、金额向上/向下取两位(`ToCeilingFixed2`/`ToFloorFixed2`/`ToCeilingInt`)、集合 `ContainsAll`/`RemoveRange` 等。 +- `Tool.cs`:`LockKey(object)`(序列化后 MD5,前缀 `HSCW:RedisLock:`)、`GetSerialNumber`、`GetTimeStringRandom`、`ReplaceWithSpecialChar`(脱敏)、`SubStringText`、`PickupImgUrl`、`NoHTML`、`RegexSubstring`(供 MongoRepository 解析集合名占位符用)、`CheckIsUrl`、`IsIdCard`。 +- `DateTimeTools.cs`:`GetDateTimeNow()`(把本地时间标记为 UTC)、`GetTimeDiffDays`、内部 `DatetimeJsonConverter`(`yyyy-MM-dd HH:mm:ss` 序列化)。 +- `DateTimeConverterUtf.cs`:`JsonConverter`,写入时把 UTC 转成 `Asia/Shanghai` 时区格式化输出。 +- `Md5Helper.cs`:`GetMD5(string)`(小写十六进制)。 +- `RandomHelper.cs`:`RandomNumbers`、`RandomChars`、`RandomNoRepeatNumber/Chars`、`GetRandomCode`(长度被限制在 4~8)。 +- `ValidationHelper.cs`:`IsValidMobile`、`IsValidIdCard`(含校验位)、`IsValidUserName`、`IsValidPassword`、`IsPositiveAmount`、`IsInRange`、`IsValidLength`。 +- `ConstValues.cs`:`LockSecond=5`、`LockNotice="业务正在处理中,请稍后"`、`DevModel="dev"`。 + +### 3.2 Infrastructure/CommonInfrastructure(Web 基础设施,命名空间 `CommonInfrastructure`) + +- `Middleware/AutofacModule.cs`:`Module` 子类,注册泛型 `MongoBaseRepository<> → IMongoBaseRepository<>`、`RedisService.RedisService → IRedisService`(均 `InstancePerLifetimeScope`);静态方法 `RegisterServices(builder, serviceAssemblyType)` 扫描程序集中以 `Service` 结尾的类型按接口注册。 +- `Controllers/BaseController.cs`:继承 MVC `Controller`,在 `OnActionExecuting` 中解析 JWT Claims:`uid→UserId`、`uname→UserName`、`dname→DisplayName`、`avatar→Icon`、`number→Number`,并从请求头 `X-Forwarded-For`(取第一个)或 `Connection.RemoteIpAddress` 得到 `Ip`。 +- `Response/LoginUser.cs`:`UserId`、`UserName`、`Number`、`DisplayName`、`Icon`、`Source`、`Ip`、`Token`。 +- `Extension/ControllerExtension.cs`:Controller 结果扩展——`ToResult/ToListResult/ToPageResult`(成功)与 `ToFailResult/ToListFailResult/ToPageFailResult/ToNoLoginResult/ToTokenInvalidResult/ToParamErrorResult`(失败)。 + +### 3.3 Infrastructure/SharpAbp.Infrastructure.Api(Web/API 基础设施,命名空间 `SharpAbp.Infrastructure.Api`) + +- `Autofac/ApplicationModule.cs`:抽象 Autofac `Module`。注册 `MongoBaseRepository<>` → `IMongoBaseRepository<>`;当 `RegisterMongoBaseService=true`(默认)时注册 `MongoBaseService<> → IMongoBaseService<>`;注册 `RedisService.RedisService → IRedisService`;扫描 `GetServiceAssemblies()` 中以 `Service` 结尾、以 `Repository` 结尾的类型按接口注册。子类通过重写 `CurrentAssembly`/`GetServiceAssemblies()` 指定程序集。 +- `Controllers/BaseController.cs`:`[ApiController]` 抽象控制器;`loginUser` 从 `User.Claims` 解析(`ClaimTypes.NameIdentifier→userId`、`ClaimTypes.Name→userName`、`ClaimTypes.Role→role`);`GetClientIp()` 取 `X-Forwarded-For` 或远端 IP。同文件含轻量 `LoginUser`(userId/userName/role)。 +- `Extensions/ControllerExtensions.cs`:与 CommonInfrastructure 同款的 Controller 结果扩展(`ToResult` 系列 / `ToFailResult` 系列),额外 `ToParamErrorResult` 带默认文案。 +- `Middleware/GlobalExceptionMiddleware.cs`:全局异常中间件,`UseGlobalExceptionHandler()` 扩展。按异常类型返回统一 JSON(HTTP 200,结构 `{code, info, data}`):`BusinessException→Error`、`UnauthorizedAccessException→NoAuth`、`ArgumentException→ParamError`、`TimeoutException/OperationCanceledException→Error`,其它→`Exception` 并记录 `LogError`。 +- `Resilience/CircuitBreaker.cs`:手写熔断器(`Closed/Open/HalfOpen` 三态),`CircuitBreakerOptions`(失败阈值 5、断开时长 30s、半开尝试 3、成功阈值 2),`CircuitBreakerFactory` 用 `ConcurrentDictionary` 按名缓存;熔断打开时抛 `CircuitBreakerOpenException`。 +- `Configuration/ConfigurationHelper.cs`:从环境变量读取并拼装连接串。`GetConnectionString("mongodb"/"redis"/"rabbitmq"/"mysql")`,对应读取 `MONGODB_*`、`REDIS_*`、`RABBITMQ_*`、`MYSQL_*` 环境变量;另提供 `GetString/GetInt/GetBool`。 +- `Configuration/AppSettings.cs`:强类型配置聚合——`JwtConfig`、`CapConfig`、`RedisConfig`、`WXConfig`、`MongoDbSettings`、`PgSqlConnection`。注意其 `RedisConfig`/`MongoDbSettings`/`JwtConfig` 为**独立于其它子项目**的简化定义(默认值 localhost/6379 等)。 + +### 3.4 Infrastructure/JWTHelper(JWT,命名空间 `JWTHelper`) + +- `JWTConfig.cs`:`TokenKey`、`Issuer`、`Audience`、`SecretKey`、`ValidateIssuer/Audience/IssuerSigningKey/Lifetime`。 +- `JwtTools.cs`:`ValidateToken(token)`(HmacSha256,要求 Claims 同时含 `uid`、`uname`)、`CreateToken(Claim[])`(有效期 60 分钟)、静态 `GetTokenContent`、`GetTokenReverseContent`(把 `uid` 反转读取,用于校验)、`GetTokenClaim`。 +- `JWTExtension.cs`:`AddCustomJwt(services, configuration)` 与 `AddJwt(...)`。绑定 `JwtConfig` 节点;认证事件:SignalR 的 `/hubs/`、`/fishinghub`、`/fishingroomhub` 允许从 query `access_token` 取 token,其余从 Header(`jwtSettings.TokenKey`)取;`OnMessageReceived` 中会校验 `uid` 非空(`AddCustomJwt` 版本);`OnChallenge` 统一返回 `{code=401,msg="fail",info="很抱歉,您无权访问该接口"}` 且 HTTP 200。 +- `Md5Helper.cs`:`sealed` 内部工具,`Encode`(取 MD5 摘要第 4 段 8 字节),用于 token 附加校验(在 `JWTExtension` 相关逻辑中引用,当前校验逻辑注释保留)。 + +### 3.5 Infrastructure/MongoRepository(MongoDB 仓储,命名空间 `MongoRepository` / `MongoRepository.Attributes` / `MongoRepository.Config`) + +- `MongoBaseEntity.cs`:基类实体,`Id`(`_id`,`Guid.NewGuid("N")`)、`IsDelete`(`isdelete`)、`CreateInfo`(`OptionUserInfo?`)。`OptionUserInfo`:`UserId`、`UserName`、`OptionTime`(Unix 时间戳,`[BsonIgnoreExtraElements]`)。 +- `BsonCollectionAttribute.cs`:标注在实体类上,含 `CollectionName`、`DataBaseName`;集合名支持 `{yyyyMM}` 之类日期占位符。 +- `Config/MongoDbSettings.cs`:`IMongoDbSettings`/`MongoDbSettings`(`ServerUrl`、`Username`、`Password`、`Database` 默认 `data_0524`);`ServiceDatabases` 常量:`data_0524_user`、`data_0524_admin`、`data_0524_fish`、`data_0524_chess`、`data_0524_customer`。 +- `IMongoBaseRepository.cs`:通用仓储接口(查询、分页、增删改、聚合等)。 +- `MongoBaseRepository.cs`:泛型实现 `MongoBaseRepository where TDocument : MongoBaseEntity`。构造时按 `IMongoDbSettings` 拼 `MongoUrl`(用户名/密码/库名来自实体的 `BsonCollectionAttribute.DataBaseName`),并 `EnsureDatabaseAndUser`(库不存在则插入并删除一条 temp 文档触发建库)、`EnsureIndexes`(针对 `user` 集合创建 `BaseInfo.Mobile` 与 `RealName.IDCard` 唯一稀疏索引,用静态集合去重、异常只记警告)。主要公开方法: + - 查询:`AsQueryable`、`GetCollection`、`FilterBy`(表达式/FilterDefinition/投影)、`FindOne`/`FindOneAsync`(表达式或 FilterDefinition,可带排序)、`FindById`/`FindByIdAsync`、`Count`/`CountAsync`。 + - 分页:`QueryPage`、`QueryPageAsync`(多种重载,含带 `skipCount` 版本)、`QueryPageTwoOrderAsync`(双排序)。 + - 写入:`InsertOne/InsertMany`、`UpdateById`、`UpdateMany`、`ReplaceOne`(均含同步/异步,返回 `(bool ok, string message)`)。 + - 删除:`DeleteOne/DeleteById/DeleteMany`(含异步)。 + - 聚合/随机:`Aggregate(FilterDefinition, ProjectionDefinition<...,BsonDocument>)`、`RandomData(expression, count)`(`AsQueryable().Sample()`)。 + +### 3.6 Infrastructure/RedisHelper(Redis 缓存与分布式锁,命名空间 `RedisHelper`) + +- `ICache.cs` / `RedisCache.cs`:基于 `NewLife.Redis`(`FullRedis`)的缓存封装。`RedisCache` 用 `FullRedis.Create(config.url)`,`MaxMessageSize=16MB`;简单类型(string/long/int/bool/double)直存,复杂对象走 `System.Text.Json` 序列化。核心能力: + - 基础:`Get`、`GetAll(keys)`、`Insert`(可带 `int`/`TimeSpan` 过期)、`Remove`、`Exists`、`Clear()`、`Clear(pattern)`、`GetPatternKey/GetPatternList`、`IncrBy`、`StartPipeline`、`GetFullRedis`。 + - Set:`SetAdd/SetContains/SetRemove/SetCount/SetMembers`。 + - List:`GetList`、`AddToList`、`InitDataToList`、`UpdateDataToList`、`RemoveFromList`。 + - Dictionary:`InitDataToDictionary`、`UpdateDataToDictionary`、`RemoveFromDictionary`、`GetFromDictionary`、`GetListFromDictionary(ByFilter)`、`GetListCountFromDictionaryByFilter`、分页查询(`GetPageDescendingListFromDictionary`、`GetPageListFromDictionary`、`GetListFromDictionary`、`GetDescendingListFromDictionary`)。 + - 临时内容:`AddTempContent`/`GetTempContent`(Key 模板 `HS:Temp:{0}`)。 +- `IDistributedLock.cs` / `DistributedLock.cs`:Redis 分布式锁。`TryExecute(Action/Func)` 与异步版本,参数 `expiry=30s`、`retry`、`retryDelay=100ms`;用 `FullRedis.Add(key, value, expiry)` 抢锁,值为 Guid,`finally` 中「校验值相等再删除」释放;`GetLockKey` 目前原样返回 key。 +- `RedisConfig.cs`:`Host/Port/Password/UserName/Database`,`ToString()` 输出 `Server=..;Password=..;UserName=..;Db=..`。 +- `RedisUrl.cs`:仅 `string url`(承载连接串)。 +- `RedisServiceExtension.cs`:DI 扩展 `AddRedisCache(IConfiguration)`(Scoped 注册 `ICache/IDistributedLock`)、`AddRedisCacheSingleton(IConfiguration)`(Singleton)、`AddRedisCache(string url)`(Singleton)。均先绑定 `RedisConfig` 节点生成 `RedisUrl`。 + +### 3.7 Infrastructure/RabbitMQHelper(消息封装,命名空间 `RabbitMQHelper` 等) + +- `RabbitConfig.cs`:`IRabbitConfig`/`RabbitConfig`——`Host`(默认 `49.233.122.91`)、`VirtualHost`(`/`)、`UserName/Password`(guest)、`ListSubscribe`(订阅者类型列表)、`MongoDatabaseName`、`MongoConnectionString`、`DefaultExchange`(`hscw.default.topic`)、`DefaultRegisterWay`(`singleton`)。 +- `InitRabbitMQSetup.cs`:`AddInitMQ(services, Action, logger)`——注册 `IHttpContextAccessor`;用 `RabbitHutch.CreateBus` 创建 EasyNetQ `IBus` 并注册为单例(连接/断开事件打日志);注册 `IRabbitConfig`、`ISendMQMessage`(Scoped)、`MQHostedService`(HostedService);按 `DefaultRegisterWay`(singleton/scoped/transient)用 `TryAdd*` 注册 `ListSubscribe` 中的订阅者类型。 +- `ISendMQMessage.cs` / `SendMQMessage.cs`:`Send(topic, value)`。未连接返回 false;从当前 HTTP 请求头取 `token` 放入消息头;构造 `RabbitMessage`,以 `ExchangeType.Topic` 向 `DefaultExchange` 发布,并把 `PublishRecord` 写入 Mongo 集合 `mq_publish_record`。 +- `MQHostedService.cs`:`BackgroundService`。遍历 `ListSubscribe` 类型的 `[RabbitMQAttribute]` 方法生成 `ConsumerExecutorDescriptor`;声明 topic exchange,为每个方法声明队列(名 `{类名小写}.{方法名小写}`)并 `BindAsync` 到 topic;`Advanced.Consume` 中写 `ReceiveRecord` 到 `mq_receive_record`,再用 `MethodInfo.Invoke(obj, new object[]{ msg.Body.Data, msg.Body.Headers })` 反射调用订阅方法。 +- `IRabbitSubscribe.cs`:空标记接口(`RabbitMQHelper.Attributes`)。 +- `Attributes/RabbitMQAttribute.cs`:`[RabbitMQAttribute(topic)]`,用于标注订阅方法。 +- `RabbitMessage.cs`:`RecordId`(Guid)、`Data`、`Headers`。 +- `ConsumerExecutorDescriptor.cs`:订阅执行描述(`MethodInfo`、`ImplTypeInfo`、`Attribute`、`ClassName`)。 +- `Models/PublishRecord.cs`:`PublishRecord`(发布记录)与 `ReceiveRecord`(接收记录)。 +- `Properties/launchSettings.json`:IDE 调试用的启动配置(类库本身不独立运行)。 + +> 说明:`RabbitMQHelper.csproj` 引入了 `DotNetCore.CAP 8.3.4` 包,但该类的**通用消息发布/订阅实现走 EasyNetQ**;CAP 主要用于业务 Host 层(配合 `nlog.config` 中的 `capFile` 输出),此处不展开。 + +### 3.8 Infrastructure/ScheduledService(定时任务,命名空间 `ScheduledService`) + +- `ScheduleConfig.cs`:`IScheduleConfig`/`ScheduleConfig`——`CronExpression`(默认 `* * * * *`)、`TimeZoneInfo`(默认本地)。 +- `CronJobService.cs`:实现 `IHostedService, IDisposable`。用 `Cronos` 的 `CronExpression.Parse(cron, CronFormat.IncludeSeconds)`;`ScheduleJob` 计算下次触发时间并用 `System.Timers.Timer` 延迟触发 `DoWork`,完成后递归排下一次;`DoWork` 为可重写空方法,异常只记日志。 +- `ScheduledServiceExtensions.cs`:`AddCronJob(options)`(`T : CronJobService`)——校验配置、注册 `IScheduleConfig` 单例并 `AddHostedService()`。 + +### 3.9 RedisService(领域级 Redis 服务,命名空间 `RedisService` / `RedisService.Param`) + +- `IRedisService.cs` / `RedisService.cs`:构造注入 `ICache`。功能分组: + - 用户/CID 映射:`GetRedisUserCId/SetRedisUserCId/RemoveRedisUserCId`(Key `user-service:uid:{0}`);`GetLoginUserId/SetLoginUserId/RemoveLoginUserId`、`GetAllLoginUserIds`(Key `user-service:cid:{0}`);另有**纯内存** `ConcurrentDictionary` 实现的 `GetUserId/SetUserId/RemoveUserId`。 + - 验证码:`SetVerificationCode`(5 分钟过期)/`GetVerificationCode`/`RemoveVerificationCode`。 + - 配置:`GameConfig`、`ActivityConfig`、`FishingKillConfig`、`FishSpawnConfig`(字符串,读写下 Redis)。 + - 房间:`SetGameRoom/GetGameRoom/GetGameRoomList/GetGameRoomAllList/RemoveGameRoom/RemoveGameRoomAll`(Key `game-service:room:model:{分区}_{房号}`,另用进程内 `ConcurrentDictionary` 做 3 秒读缓存 `RoomCacheEntry`);`GetPendingFishRoomId`(找用户所在未结束房间)。 + - 棋牌房间:`SetChessRoom/GetChessRoom/GetAllChessRooms/GetAllPlayingChessRooms(state==2)/GetPendingChessRoomId/RemoveChessRoom`,及清理方法 `ClearAllChessRooms/ClearAllGameRooms/ClearAllUserMappings/ClearAllLoginUserIds`。 + - 捕鱼运行时(Key 直接拼接,无服务前缀):玩家金币 `gold:{roomId}:{userId}`、子弹集合 `bullets:{roomId}:{userId}`、玩家因子 `factor:{roomId}:{userId}`、房间击杀鱼 `killfish:{roomId}`(Set)、任务进度 `fishing:tasks:{roomId}:{userId}:{taskEvent}`、消耗进度 `fishing:consume:runtime:...`、经验进度 `fishing:exp:runtime:...`;相关方法 `GetPlayerGold/SetPlayerGold`、`AddBulletId/ExistsBulletId/RemoveBulletId/GetBulletCount/ClearBulletIds`、`GetPlayerFactor/SetPlayerFactor/RemovePlayerFactor`、`GetKillFishIds/AddKillFishId/ContainsKillFishId`、`AddFishingTaskProgress/GetFishingTaskProgress/ClearFishingTaskProgress`、`AddFishingConsumeProgress/GetFishingConsumeProgress`、`AddFishingExpProgress/GetFishingExpProgress`、`ClearFishingRuntimeProgress`、`ClearPlayerRuntimeData`。 + - 系统金币日累计:`SetSystemGoldDay/AddSystemGoldDay/GetSystemGoldDay`(Key `game-service:fish:gamestatic`)。 + - 通用:`IncrBy`、`GetString`、`SetString`。 +- `Param/RedisUserCid.cs`:`CId`、`FishRoomCId`、`UserId`、`UserName`、`RoomId`、`PartitionId`、`LoginCId`。 +- `Param/RedisGameRoom.cs`:房间模型(`RoomId`、`RoomName`、`GameType`(默认 `GameTypeEnum.风雷之渊`)、`RoomLevel`、`RoomPartition`、`RoomNumber`、`MaxPlayerCount`(4)、`CurrentOnlinePlayerCount`、`RobotCount`、`Players`、`CreateUserId`、`SystemFactor`)。 +- `Param/RedisGamePlayer.cs`:玩家模型(`UserId`、`UserName`、`UserNumber`、`Avatar`、`IsRedName`、`Level`、`Exp`、`MaxExp`、`VipLevel`、`CId`、`Gold`、`Diamond`、`Position`、`CannonId`、`WingsId`、`WarGodId`、`CannonMultiple`、`BeginCoin`、`MaxGold`、`BeginTime`、`State`、`PlayerFactor`、`TotalRechargeGold`、`SafeBoxGold`、`IsBot`、`IsAfk`)。 +- `Param/RoomBotFactory.cs`:机器人工厂。`CreateBot(position, roomConfig, gameConfig, botProfiles)` 从 `BotProfileEntity` 随机取档案生成机器人(金币按最大炮倍 ×100~500 随机、等级/钻石/炮台/翅膀/战神随机);`FixedBotSeats` 当前为空数组(`FixedBotSeatsEnabled=false`),`CreateFixedSeatBots` 仅在配置固定座位时生效。 + +### 3.10 ApiLogService(API 日志类库) + +- `ApiLogService.cs`:`namespace ApiLogService`,`ApiLogService : MongoBaseService, IApiLogService`,构造注入 `IMongoBaseRepository`。 +- `ApiLogService.csproj`:仅含 `net8.0`(无任何 Package/Project 引用)。 + +> **重要事实(务必注意)**:该目录下的 `ApiLogService.cs` 依赖的 `MongoBaseService<>`、`ApiLog`、`IApiLogService` 均不在本项目中定义,而 `ApiLogService.csproj` 也没有任何引用,且该工程**未加入 `Template0524.sln`**,因此它无法单独编译,属于历史遗留/重复副本。 +> 实际在运行的 API 日志服务实现位于 `CommonService/ApiLogService.cs`(命名空间 `CommonService`),接口 `CommonService/IApiLogService.cs`,实体 `CommonDomain/ApiLog.cs`。各 Host 的 `Middleware/ApiLoggingMiddleware.cs` 通过 `CommonService.IApiLogService` 记录日志(详见第七节)。 + +### 3.11 Tools/RenameUploads(上传文件批量改名工具) + +- `Program.cs`:独立控制台程序(`OutputType=Exe`)。目标目录写死为 `F:\Temp\Template0524\AdminSrc\AdminHost\wwwroot\uploads`;用「中文道具名 → 数字编号」映射表(`propMapping`,如 `改名卡→40001`、`Vip1专属炮台→40100`、`雷电之翼→40201`、`鸿运招财喵→40301`、碎片 `50001`、充值档位 `70000+`、钻石档位 `80001+` 等)批量把上传图片重命名为编号文件名,遇到目标已存在则跳过,最后打印成功/跳过数量。 +- `RenameUploads.csproj`:`net8.0`、`OutputType=Exe`、关闭隐式 using 与可空引用。 + +### 3.12 nlog.config(全服务共用日志配置) + +- 变量:`service`(环境变量 `SERVICE_NAME`)、`instance`(环境变量 `INSTANCE_ID`,区分同服务多容器)、`logDirectory=logs/${shortdate}`;日志 `layout` 形如 `${longdate}|service=..|instance=..|级别|logger|message|异常`。 +- 开关(改文件后 NLog 自动重载):`enableDebug/Info/Warn/Error/Cap/Socket/FishSpawn/Console` 均默认 `true`。 +- targets(`async=true`):按级别分文件 `debugFile/infoFile/warnFile/errorFile`、CAP 专用 `capFile`、Socket/SignalR 专用 `socketFile`、出鱼数据专用 `fishSpawnFile`、`console`,以及 `blackhole`(Null)。 +- rules 要点: + - 屏蔽 `Microsoft.AspNetCore.*` 的 Info 及以下流水日志(`maxlevel=Info → blackhole, final`)。 + - `DotNetCore.CAP.*`(`minlevel=Debug`)单独输出到 `capFile`。 + - 消息含 `[Socket]` 或 logger 为 `*.Hubs.*`、`*MovementFilter` 输出到 `socketFile`。 + - 消息含 `[FishSpawnData]` 输出到 `fishSpawnFile`。 + - Debug/Info/Warn/Error 分别落对应文件,`minlevel=Error` 同时接收 Critical/Fatal;全量 `minlevel=Info` 进 `console`。 +- 文件名格式:`{service}-{instance}-{级别}.log`;内部日志 `logs/nlog-internal.log`(`internalLogLevel=Warn`)。 + +--- + +## 四、项目结构与技术要点(各 csproj 依赖与关键 NuGet) + +所有项目目标框架均为 `net8.0`(`ImplicitUsings=enable`、`Nullable=enable`,`RenameUploads` 除外)。 + +| 项目(相对路径) | 关键 NuGet / Framework 引用 | 项目引用(ProjectReference) | +| --- | --- | --- | +| `Infrastructure/Common/Common.csproj` | Microsoft.AspNetCore.Cors 2.3.0、Microsoft.Extensions.Hosting.Abstractions 9.0.7、Newtonsoft.Json 13.0.3、NPinyin 0.2.6321.26573、RestSharp 112.1.0、ToolGood.Words 3.1.0.3、XAct.Core.PCL 0.0.5014 | `Infrastructure/RedisHelper` | +| `Infrastructure/CommonInfrastructure/CommonInfrastructure.csproj` | FrameworkReference `Microsoft.AspNetCore.App`、Autofac 8.3.0 | `RedisService`、`Infrastructure/Common` | +| `Infrastructure/JWTHelper/JWTHelper.csproj` | Microsoft.AspNetCore.Authentication.JwtBearer 8.0.15、Microsoft.Extensions.Hosting.Abstractions 9.0.7、Newtonsoft.Json 13.0.3 | 无 | +| `Infrastructure/MongoRepository/MongoRepository.csproj` | MongoDB.Bson 3.6.0、MongoDB.Driver 3.6.0、MongoDB.Driver.Core 2.30.0 | `Infrastructure/Common` | +| `Infrastructure/RabbitMQHelper/RabbitMQHelper.csproj` | DotNetCore.CAP 8.3.4、EasyNetQ 7.8.0、Microsoft.AspNetCore.Http 2.3.0、Microsoft.Extensions.Hosting.Abstractions 9.0.7、Microsoft.Extensions.Logging 9.0.4、MongoDB.Driver 3.6.0 | 无 | +| `Infrastructure/RedisHelper/RedisHelper.csproj` | Microsoft.Extensions.Configuration.Binder 8.0.2、Microsoft.Extensions.Hosting.Abstractions 9.0.7、Microsoft.Extensions.Logging.Abstractions 9.0.7、NewLife.Redis 6.2.2025.503 | 无 | +| `Infrastructure/SharpAbp.Infrastructure.Api/SharpAbp.Infrastructure.Api.csproj` | FrameworkReference `Microsoft.AspNetCore.App`、Autofac 8.3.0 | `CommonService`、`RedisService`、`Infrastructure/Common` | +| `Infrastructure/ScheduledService/ScheduledService.csproj` | Cronos 0.8.4、Microsoft.Extensions.Hosting.Abstractions 9.0.7 | 无 | +| `RedisService/RedisService.csproj` | 无第三方包 | `ChessGameSrc/ChessGameDomain`、`CommonDomain`、`Infrastructure/RedisHelper`、`UserSrc/UserDomain` | +| `ApiLogService/ApiLogService.csproj` | 无(仅 net8.0) | 无(未加入 sln) | +| `Tools/RenameUploads/RenameUploads.csproj` | 无 | 无(独立 Exe) | + +依赖要点: + +1. **依赖树根**:`RedisHelper`(最底层,无项目引用)→ 被 `Common`、`MongoRepository`(间接)、`RedisService` 等使用;`Common` → 被 `MongoRepository`、`CommonInfrastructure`、`SharpAbp.Infrastructure.Api` 等使用。 +2. **`CommonInfrastructure` 与 `SharpAbp.Infrastructure.Api` 是两套并行的 Web 基础设施**,都提供 `BaseController` + Controller 结果扩展 + Autofac 注册;不同 Host 按需引用(见第七节)。 +3. `SharpAbp.Infrastructure.Api` 依赖 `CommonService`(含 `MongoBaseService<>` 与真正在用的 `ApiLogService`),其 `ApplicationModule` 会自动注册业务 Service/Repository。 +4. `RedisService` 属于领域级库,直接反向依赖 `ChessGameDomain`、`UserDomain`、`CommonDomain`,因此被各业务 Service/Host 引用。 + +--- + +## 五、代码目录说明(完整目录树) + +> 说明:以下为本次模块范围内实际存在的全部文件;每个目录/关键文件均带中文注释。 + +### 5.1 Infrastructure/Common + +``` +Infrastructure/Common/ +├── Common.csproj # 通用基础库工程文件(引用 RedisHelper) +├── AppInstanceId.cs # 实例标识模型(string Id) +├── BaseResponse.cs # 统一响应:BaseCommonResponse/BaseResponse/ListResponse/PageResponse/PageDataResponse +├── BusinessException.cs # 业务异常(含 int ErrorCode) +├── LinqExtensions.cs # 表达式树组合扩展(And/Or/True/False 等) +├── SystemEnum.cs # CommonResponseCodeEnum 响应码枚举 +├── BlockWord/ +│ ├── BlockWord.cs # 超大型敏感词表常量 BlockWordValue +│ └── BlockWordHelper.cs # 敏感词检测/替换/提取(ToolGood.Words) +├── CommonModel/ +│ ├── BaseIdName.cs # 通用 Id/Name 模型 +│ └── BaseListPageParam.cs # 通用分页参数(KeyWord/PageIndex/PageSize) +├── Cors/ +│ └── CorsExtension.cs # 跨域策略 AddCustomCors / UseCustomCors +├── Redis/ +│ ├── RedisKey.cs # 业务 Redis Key 常量(含旧版 RedisKeyConstants) +│ └── RedisKeyGenerator.cs # 按服务前缀生成 Redis Key +├── Request/ +│ ├── IRequestApi.cs # HTTP 请求接口(RestSharp) +│ └── RequestApi.cs # HTTP 请求实现(带 token 默认头) +├── Utils/ +│ ├── ConstValues.cs # 常量(锁时长/提示语/环境标识) +│ ├── ConvertExtension.cs # 类型转换/时间戳/序列化/脱敏/拼音等扩展 +│ ├── DateTimeConverterUtf.cs # UTC→Asia/Shanghai 的 JSON 时间转换器 +│ ├── DateTimeTools.cs # 时间工具 + DatetimeJsonConverter +│ ├── Md5Helper.cs # MD5 工具 +│ ├── RandomHelper.cs # 随机数/随机串工具 +│ ├── Tool.cs # 通用工具(锁 Key/脱敏/正则/身份证等) +│ └── ValidationHelper.cs # 校验工具(手机号/身份证/用户名/密码等) +└── WX/ + ├── WXBaseHelper.cs # 微信 access_token / code2session 获取与缓存 + └── Response/ + ├── AccessTokenResponse.cs # access_token 响应 + ├── GZHUserInfoResponse.cs # 公众号用户信息响应 + ├── TicketResponse.cs # jsapi_ticket 响应 + └── WXBaseResponse.cs # 微信基础响应(errcode/errmsg) +``` + +### 5.2 Infrastructure/CommonInfrastructure + +``` +Infrastructure/CommonInfrastructure/ +├── CommonInfrastructure.csproj # Web 基础设施工程(AspNetCore.App + Autofac) +├── Controllers/ +│ └── BaseController.cs # MVC 控制器基类:解析登录用户与客户端 IP +├── Extension/ +│ └── ControllerExtension.cs # Controller 结果扩展(成功/失败/未登录等) +├── Middleware/ +│ └── AutofacModule.cs # Autofac 注册:Mongo 仓储、RedisService、按名注册 Service +└── Response/ + └── LoginUser.cs # 登录用户模型(UserId/UserName/.../Ip/Token) +``` + +### 5.3 Infrastructure/JWTHelper + +``` +Infrastructure/JWTHelper/ +├── JWTHelper.csproj # JWT 工程(JwtBearer + Newtonsoft.Json) +├── JWTConfig.cs # JWT 配置模型 +├── JWTExtension.cs # AddCustomJwt / AddJwt 认证接线 +├── JwtTools.cs # Token 生成/校验/解析 +└── Md5Helper.cs # 内部 MD5 工具(token 校验用) +``` + +### 5.4 Infrastructure/MongoRepository + +``` +Infrastructure/MongoRepository/ +├── MongoRepository.csproj # MongoDB 仓储工程(MongoDB.Driver 等) +├── BsonCollectionAttribute.cs # 标注集合名与库名(支持 {yyyyMM} 占位) +├── IMongoBaseRepository.cs # 通用仓储接口 +├── MongoBaseEntity.cs # 实体基类 + OptionUserInfo +├── MongoBaseRepository.cs # 通用仓储实现(查询/分页/增改删/聚合) +└── Config/ + └── MongoDbSettings.cs # Mongo 连接配置 + ServiceDatabases 库名常量 +``` + +### 5.5 Infrastructure/RabbitMQHelper + +``` +Infrastructure/RabbitMQHelper/ +├── RabbitMQHelper.csproj # 消息封装工程(EasyNetQ + DotNetCore.CAP + MongoDB.Driver) +├── RabbitConfig.cs # 消息配置 IRabbitConfig/RabbitConfig +├── InitRabbitMQSetup.cs # AddInitMQ:注册 Bus、订阅者、后台服务 +├── ISendMQMessage.cs # 消息发送接口 +├── SendMQMessage.cs # 消息发送实现(含发布记录落库) +├── MQHostedService.cs # 后台订阅服务(反射调用 [RabbitMQ] 方法) +├── IRabbitSubscribe.cs # 订阅者标记接口 +├── RabbitMessage.cs # 消息体(RecordId/Data/Headers) +├── ConsumerExecutorDescriptor.cs # 订阅执行描述 +├── Attributes/ +│ └── RabbitMQAttribute.cs # [RabbitMQ(topic)] 订阅特性 +├── Models/ +│ └── PublishRecord.cs # PublishRecord / ReceiveRecord 记录模型 +└── Properties/ + └── launchSettings.json # IDE 调试启动配置 +``` + +### 5.6 Infrastructure/RedisHelper + +``` +Infrastructure/RedisHelper/ +├── RedisHelper.csproj # Redis 封装工程(NewLife.Redis) +├── ICache.cs # 缓存接口 +├── RedisCache.cs # 缓存实现(FullRedis) +├── IDistributedLock.cs # 分布式锁接口 +├── DistributedLock.cs # 分布式锁实现 +├── RedisConfig.cs # Redis 配置(Host/Port/Password/...) +├── RedisUrl.cs # Redis 连接串载体 +└── RedisServiceExtension.cs # DI 扩展 AddRedisCache / AddRedisCacheSingleton +``` + +### 5.7 Infrastructure/SharpAbp.Infrastructure.Api + +``` +Infrastructure/SharpAbp.Infrastructure.Api/ +├── SharpAbp.Infrastructure.Api.csproj # API 基础设施工程(AspNetCore.App + Autofac) +├── Autofac/ +│ └── ApplicationModule.cs # 抽象 Autofac 模块:仓储/服务/RedisService 自动注册 +├── Configuration/ +│ ├── AppSettings.cs # 强类型配置聚合(JwtConfig/CapConfig/RedisConfig/WXConfig/MongoDbSettings) +│ └── ConfigurationHelper.cs # 环境变量读取与连接串拼装 +├── Controllers/ +│ └── BaseController.cs # [ApiController] 基类:loginUser / GetClientIp +├── Extensions/ +│ └── ControllerExtensions.cs # Controller 结果扩展 +├── Middleware/ +│ └── GlobalExceptionMiddleware.cs # 全局异常中间件 + UseGlobalExceptionHandler +└── Resilience/ + └── CircuitBreaker.cs # 熔断器(Closed/Open/HalfOpen)+ 工厂 +``` + +### 5.8 Infrastructure/ScheduledService + +``` +Infrastructure/ScheduledService/ +├── ScheduledService.csproj # 定时任务工程(Cronos) +├── CronJobService.cs # 定时任务基类(IHostedService) +├── ScheduleConfig.cs # 调度配置(CronExpression/TimeZoneInfo) +└── ScheduledServiceExtensions.cs # AddCronJob 扩展 +``` + +### 5.9 RedisService + +``` +RedisService/ +├── RedisService.csproj # 领域级 Redis 服务工程 +├── IRedisService.cs # 服务接口(缓存/登录态/验证码/房间/捕鱼运行时等) +├── RedisService.cs # 服务实现(基于 ICache) +└── Param/ + ├── RedisGamePlayer.cs # 捕鱼房间玩家模型 + ├── RedisGameRoom.cs # 捕鱼房间模型 + ├── RedisUserCid.cs # 用户/CID 映射模型 + └── RoomBotFactory.cs # 机器人生成工厂 +``` + +### 5.10 ApiLogService + +``` +ApiLogService/ +├── ApiLogService.csproj # 仅 net8.0,无引用;未加入 sln(历史遗留) +└── ApiLogService.cs # namespace ApiLogService(未实际使用,实际实现在 CommonService) +``` + +### 5.11 Tools/RenameUploads + +``` +Tools/RenameUploads/ +├── RenameUploads.csproj # 独立控制台工具工程(net8.0 Exe) +└── Program.cs # 按道具名→编号映射批量重命名上传图片 +``` + +### 5.12 根目录日志配置 + +``` +nlog.config # 全服务共用 NLog 配置(按级别/CAP/Socket/出鱼分文件) +``` + +--- + +## 六、关键文件索引 + +| 文件相对路径 | 职责 | +| --- | --- | +| `Infrastructure/Common/BaseResponse.cs` | 定义统一响应结构与响应码封装基类 | +| `Infrastructure/Common/BusinessException.cs` | 业务异常类型,供全局异常中间件识别 | +| `Infrastructure/Common/SystemEnum.cs` | `CommonResponseCodeEnum` 全局响应码 | +| `Infrastructure/Common/Redis/RedisKeyGenerator.cs` | 按服务前缀生成 Redis Key(含前缀映射表) | +| `Infrastructure/Common/Redis/RedisKey.cs` | 业务 Redis Key 常量集合 | +| `Infrastructure/Common/Utils/ConvertExtension.cs` | 类型转换/时间戳/序列化/脱敏/拼音等通用扩展 | +| `Infrastructure/Common/Utils/Tool.cs` | 通用工具(锁 Key、脱敏、正则、身份证校验) | +| `Infrastructure/Common/BlockWord/BlockWordHelper.cs` | 敏感词检测与替换 | +| `Infrastructure/Common/WX/WXBaseHelper.cs` | 微信 access_token / code2session 获取与缓存 | +| `Infrastructure/Common/Request/RequestApi.cs` | 基于 RestSharp 的 HTTP 请求封装 | +| `Infrastructure/Common/Cors/CorsExtension.cs` | 跨域策略注册与启用 | +| `Infrastructure/CommonInfrastructure/Controllers/BaseController.cs` | MVC 基类,解析登录用户与 IP | +| `Infrastructure/CommonInfrastructure/Extension/ControllerExtension.cs` | Controller 统一结果扩展 | +| `Infrastructure/CommonInfrastructure/Middleware/AutofacModule.cs` | Autofac 服务注册模块 | +| `Infrastructure/CommonInfrastructure/Response/LoginUser.cs` | 登录用户模型 | +| `Infrastructure/SharpAbp.Infrastructure.Api/Autofac/ApplicationModule.cs` | 抽象 Autofac 模块(仓储/服务自动注册) | +| `Infrastructure/SharpAbp.Infrastructure.Api/Middleware/GlobalExceptionMiddleware.cs` | 全局异常中间件 | +| `Infrastructure/SharpAbp.Infrastructure.Api/Controllers/BaseController.cs` | API 基类(loginUser / GetClientIp) | +| `Infrastructure/SharpAbp.Infrastructure.Api/Extensions/ControllerExtensions.cs` | Controller 结果扩展 | +| `Infrastructure/SharpAbp.Infrastructure.Api/Resilience/CircuitBreaker.cs` | 熔断器实现与工厂 | +| `Infrastructure/SharpAbp.Infrastructure.Api/Configuration/ConfigurationHelper.cs` | 环境变量读取与连接串拼装 | +| `Infrastructure/SharpAbp.Infrastructure.Api/Configuration/AppSettings.cs` | 强类型配置聚合模型 | +| `Infrastructure/JWTHelper/JWTExtension.cs` | ASP.NET Core JWT 认证接线 | +| `Infrastructure/JWTHelper/JwtTools.cs` | Token 生成/校验/解析 | +| `Infrastructure/JWTHelper/JWTConfig.cs` | JWT 配置模型 | +| `Infrastructure/MongoRepository/MongoBaseRepository.cs` | 通用 MongoDB 仓储实现 | +| `Infrastructure/MongoRepository/MongoBaseEntity.cs` | Mongo 实体基类 | +| `Infrastructure/MongoRepository/BsonCollectionAttribute.cs` | 集合/库名标注特性 | +| `Infrastructure/MongoRepository/Config/MongoDbSettings.cs` | Mongo 配置与各服务库名常量 | +| `Infrastructure/RedisHelper/RedisCache.cs` | Redis 缓存实现 | +| `Infrastructure/RedisHelper/DistributedLock.cs` | Redis 分布式锁实现 | +| `Infrastructure/RedisHelper/RedisServiceExtension.cs` | Redis DI 扩展 | +| `Infrastructure/RabbitMQHelper/InitRabbitMQSetup.cs` | MQ 初始化(Bus/订阅者注册) | +| `Infrastructure/RabbitMQHelper/MQHostedService.cs` | MQ 后台订阅服务 | +| `Infrastructure/RabbitMQHelper/SendMQMessage.cs` | MQ 发送实现 | +| `Infrastructure/RabbitMQHelper/Attributes/RabbitMQAttribute.cs` | 订阅方法特性 | +| `Infrastructure/ScheduledService/CronJobService.cs` | 定时任务基类 | +| `Infrastructure/ScheduledService/ScheduledServiceExtensions.cs` | `AddCronJob` 扩展 | +| `RedisService/IRedisService.cs` | 领域级 Redis 服务接口 | +| `RedisService/RedisService.cs` | 领域级 Redis 服务实现 | +| `RedisService/Param/RoomBotFactory.cs` | 捕鱼机器人生成工厂 | +| `ApiLogService/ApiLogService.cs` | API 日志服务(历史副本,实际使用版本在 CommonService) | +| `Tools/RenameUploads/Program.cs` | 上传图片按道具编号批量重命名工具 | +| `nlog.config` | 全服务共用日志配置 | + +--- + +## 七、与其他模块的交互 + +### 7.1 各基础设施项目被哪些业务项目引用 + +(以下基于各 `*.csproj` 的 `ProjectReference` 实际统计) + +- **`Infrastructure/Common`**(直接引用):`CustomerSrc/CustomerService`、`AdminSrc/AdminService`、`UserSrc/UserApi`、`CustomerSrc/CustomerApi`;同时被 `MongoRepository`、`CommonInfrastructure`、`SharpAbp.Infrastructure.Api` 项目引用(传递到各 Host)。 +- **`Infrastructure/CommonInfrastructure`**:`ChessGameHost`、`UserSrc/UserService`、`CustomerSrc/CustomerService`、`AdminSrc/AdminService`、`UserSrc/UserApi`、`FishGameSrc/FishGameHost`、`FishGameSrc/FishRoomHost`、`CustomerSrc/CustomerApi`。 +- **`Infrastructure/SharpAbp.Infrastructure.Api`**:`AdminSrc/AdminHost`、`UserSrc/UserHost`、`UserSrc/UserApi`、`CustomerSrc/CustomerHost`、`CustomerSrc/CustomerApi`、`ChessGameHost`、`FishGameSrc/FishGameHost`、`FishGameSrc/FishRoomHost`。 +- **`Infrastructure/JWTHelper`**:`AdminSrc/AdminHost`、`AdminSrc/AdminService`、`UserSrc/UserService`、`CustomerSrc/CustomerService`、`CustomerSrc/CustomerApi`(认证入口由各 Host 用 `AddCustomJwt/AddJwt` 接线)。 +- **`Infrastructure/MongoRepository`**:`CommonDomain`、`ChessGameSrc/ChessGameDomain`、`AdminSrc/AdminDomain`、`UserSrc/UserDomain`、`CustomerSrc/CustomerService.Domain`、`CommonService`、`AdminSrc/AdminService`、`AdminSrc/AdminHost`、`UserSrc/UserService`、`CustomerSrc/CustomerService`、`UserSrc/UserApi`、`CustomerSrc/CustomerApi`(几乎全部数据访问层)。 +- **`Infrastructure/RedisHelper`**:`Infrastructure/Common`、`RedisService`,以及各业务工程通过 `Common`/`RedisService` 间接使用(`AdminHost`、`UserHost` 等直接引用)。 +- **`Infrastructure/RabbitMQHelper`**:`AdminSrc/AdminHost`、`AdminSrc/AdminService`、`CustomerSrc/CustomerService`、`CustomerSrc/CustomerApi`。 +- **`Infrastructure/ScheduledService`**:`AdminSrc/AdminHost`、`UserSrc/UserHost`、`UserSrc/UserService`。 +- **`RedisService`**:`Infrastructure/SharpAbp.Infrastructure.Api`、`Infrastructure/CommonInfrastructure`、`CommonService`、`AdminSrc/AdminService`、`UserSrc/UserHost`、`UserSrc/UserApi`、`CustomerSrc/CustomerHost`、`CustomerSrc/CustomerService`、`CustomerSrc/CustomerApi`、`FishGameSrc/FishGameService`、`FishRoomService`、`ChessGameSrc/ChessGameService`。 +- **`ApiLogService`(顶层目录)**:未被任何 `csproj` 引用,且未加入解决方案(见 7.3)。 +- **`Tools/RenameUploads`**:未被任何项目引用,是独立可执行工具。 + +### 7.2 RabbitMQ / CAP 封装的使用方式 + +- **本层封装(EasyNetQ)**: + 1. 宿主在启动时调用 `services.AddInitMQ(config => { config.Host=...; config.ListSubscribe = new List{ typeof(XxxSubscriber) }; ... })` 完成 Bus 创建与订阅服务注册。 + 2. 发送方注入 `ISendMQMessage`,调用 `Send(topic, value)` 发布到 `DefaultExchange`(`hscw.default.topic`,Topic 类型);发布记录写入 Mongo `mq_publish_record`。 + 3. 订阅方在类的方法上标注 `[RabbitMQ("topic")]` 并实现 `IRabbitSubscribe`,把该类注册进 `ListSubscribe`;`MQHostedService` 反射调用,方法签名为 `(object data, Dictionary headers)`;接收记录写入 Mongo `mq_receive_record`。 +- **CAP**:`RabbitMQHelper.csproj` 引入了 `DotNetCore.CAP 8.3.4` 包;平台整体以 CAP 作为业务级消息(`nlog.config` 中单独输出 `capFile`)。本类库自身实现并不依赖 CAP API。 + +### 7.3 Redis Key 约定 + +- 新约定(`RedisKeyGenerator`,实际被 `RedisService` 大量使用):`{服务前缀}:{业务键}`,前缀映射为 + `user → user-service`、`admin → admin-service`、`game/fish/chess → game-service`、`customer → customer-service`、`common → app-shared`。 + 例如登录态 `user-service:cid:{cid}`、用户映射 `user-service:uid:{userId}`、验证码 `user-service:verification_code:{phone}`、微信 access_token `app-shared:wx_access_token`、房间 `game-service:room:model:{分区}_{房号}`、棋牌房间 `game-service:chess:room:{roomId}`、分布式锁前缀 `app-shared:lock:`。 +- 旧约定(`RedisKeyConstants`):统一前缀 `redis0524:`,客户在线为 `game0524:customer:online`;属历史定义,保留兼容。 +- 捕鱼运行时 Key 由 `RedisService` 直接拼接(无服务前缀),用于高频读写的房间内数据。 + +### 7.4 日志配置 + +- 全服务共用根目录 `nlog.config`,以环境变量 `SERVICE_NAME`、`INSTANCE_ID` 区分服务与实例,输出到 `logs/{日期}/{服务}-{实例}-{级别}.log`。 +- 分级文件:`-debug/-info/-warn/-error.log`;另有 CAP 专用 `-cap.log`、Socket/SignalR 专用 `-socket.log`、出鱼数据专用 `-fishspawn.log`;各类开关在配置中以 `enableXxx` 变量控制,`autoReload=true` 支持改文件热生效。 +- ASP.NET Core 框架自身的 Info 及以下请求流水日志被屏蔽(仅保留 Warn 及以上)。 + +### 7.5 API 日志交互(重要) + +- API 日志的**实际使用链路**:各 Host(`AdminHost`、`UserHost`、`CustomerHost`、`ChessGameHost`、`FishGameHost`、`FishRoomHost`)的 `Middleware/ApiLoggingMiddleware.cs` 注入 `CommonService.IApiLogService`,对 `/api` 下的非 OPTIONS 请求做请求/响应体缓存与脱敏,构造 `CommonDomain.ApiLog` 并 `InsertOneAsync` 落库。 +- `ApiLog`(`CommonDomain/ApiLog.cs`)集合名 `api_log_{yyyyMM}`(按月份分集合)、库 `data_0524`,含 IP、token、耗时、URL、方法、Query、Body、Header、状态码、响应体、UA、来源、设备等字段。 +- 顶层 `ApiLogService/` 目录为历史副本(`ApiLogService.csproj` 空引用、未入 sln、无法独立编译),**不应作为该能力的引用来源**;类库实现位于 `CommonService/ApiLogService.cs`,接口 `CommonService/IApiLogService.cs`。 + +--- + +(完) \ No newline at end of file diff --git a/docs/08-公共业务服务与领域模型.md b/docs/08-公共业务服务与领域模型.md new file mode 100644 index 0000000..3158659 --- /dev/null +++ b/docs/08-公共业务服务与领域模型.md @@ -0,0 +1,373 @@ +# 公共业务服务与领域模型(CommonDomain + CommonService)—— 功能与代码目录文档 + +> 本文档为 **公共领域模型层(CommonDomain)** 与 **公共业务服务层(CommonService)** 的完整上下文说明,面向其他 AI 对话与开发者,内容以 `d:\BUYUHouDuanNet\BuYu` 下的实际源代码为准,自包含、可直接作为该模块的开发/理解上下文使用。所有路径均为相对解决方案根目录 `d:\BUYUHouDuanNet\BuYu` 的相对路径。 + +--- + +## 一、平台背景与模块位置 + +本平台是**捕鱼 + 棋牌游戏运营平台后端**,解决方案文件为 `Template0524.sln`。整体技术栈: + +- **运行时/框架**:.NET 8(各工程统一 `TargetFramework=net8.0`)、ASP.NET Core。 +- **数据存储**:MongoDB(通过自研 `Infrastructure/MongoRepository` 仓储封装)、PostgreSQL(CAP 消息日志存储)。 +- **缓存**:Redis(通过 `RedisService` 工程与 `StackExchange.Redis`)。 +- **消息队列**:RabbitMQ,统一通过 **DotNetCore.CAP** 进行发布/订阅与可靠投递。 +- **实时通信**:SignalR(`Microsoft.AspNetCore.SignalR.Core`)。 +- **网关**:Ocelot 网关,监听 `http://localhost:8001`。 +- **日志**:NLog。 +- **依赖注入**:Autofac(各 Host 通过 `AutofacModule` 按 `*Service` 命名约定扫描注册)。 + +各主机(Host)进程端口: + +| 主机 | 端口 | +| --- | --- | +| AdminHost(后台管理) | 5241 | +| UserHost(用户端) | 5245 | +| CustomerHost(客服端) | 5247 | +| ChessGameHost(象棋游戏) | 5242 | +| FishRoomHost(捕鱼房间) | 5244 | +| FishGameHost(捕鱼游戏) | 5248 | + +**本模块在解决方案中的位置**: + +- `CommonDomain/`:**跨模块共享的领域模型层**,只依赖底层仓储封装 `Infrastructure/MongoRepository`,被多个业务域工程引用(见第四节)。 +- `CommonService/`:**跨模块共享的公共业务服务层**,依赖 `CommonDomain`、`UserService`、`UserDomain`、`RedisService`、`MongoRepository`,并提供 CAP 消息订阅者与 SignalR 推送封装。 + +抽奖消息(如 `Lottery.DrawPrize`)即由 `CommonService` 的订阅者 `LotteryPrizeSubscriber` 消费,并派发到 `LotteryPrizeHandler` 完成奖励发放。 + +--- + +## 二、模块简介(定位与职责) + +### CommonDomain —— 通用领域模型 + +存放**不依赖上层业务、可被所有游戏/运营模块复用的模型、枚举、常量与工具**,职责包括: + +- **Mongo 实体模型**:游戏配置(`GameConfig`)、活动配置(`ActivityConfig`)、抽奖配置(`LotteryActivityConfig`)、任务(`GameTask`)、FAQ、机器人身份、空房率配置、接口日志(`ApiLog`)、后台操作日志(`BackgroundOperationLog`)等。 +- **基础模型(`BaseModel/`)**:`BaseProduct`、`BaseProductCount`、`BaseIdName`、`BaseIdCount`、`BaseTitleValue`、`UserAssetSyncParam` 以及游戏配置的核心子结构(`GameBaseConfig.cs` 内的鱼/房间/道具/Boss/棋牌/鱼雷等大量配置类)。 +- **枚举(`Enum/`)**:游戏类型、鱼类型、商品类型、售卖类型、任务类型等。 +- **CAP 消息模型(`CapMessageModels.cs`)**:跨服务流转的消息体定义。 +- **主题常量(`TopicKeys.cs`)**:CAP 消息主题键集中定义。 +- **错误码(`ErrorCodes.cs`)** 与**业务参数类**(`KillAnnounceParam`、`AdminKickChessPlayerMessage` 等)。 +- **领域工具/抽取器**:`FishSpawnExtractor`(把 `GameConfig` 抽成出鱼配置 JSON)、`LotteryPrizeProductHelper`、`BattleOrderGiftProductHelper`(把商品详情回填到活动配置)。 + +### CommonService —— 公共业务服务 + +对外提供跨模块可复用的**业务能力实现**与**消息订阅**,职责包括: + +- **后台运营操作(`BackgroundOperationService`)**:管理员充值/扣除用户金币或钻石、后台操作日志记录与分页查询、用户搜索;并通过 CAP 发布资产变更、VIP 升级、面向用户的通知消息。 +- **抽奖业务(`LotteryService` + `Lottery/LotteryPrizeHandler` + `Subscribers/LotteryPrizeSubscriber`)**:抽奖配置校验、按权重抽奖、扣费、记录、状态维护、奖品异步发放。 +- **Mongo 通用仓储服务基类(`MongoBaseService`)**:对 `IMongoBaseRepository` 的通用 CRUD/分页/聚合封装。 +- **SignalR 推送封装(`HubSend`)**:基于 Redis 中的连接标识(CId)向指定用户/分组/全体推送消息。 +- **接口日志服务(`ApiLogService`)**:`ApiLog` 的仓储服务。 + +--- + +## 三、功能清单 + +### 3.1 CommonDomain 模型清单 + +| 文件 | 类型 | 职责 | +| --- | --- | --- | +| `CommonDomain/GameConfig.cs` | 实体 `GameConfig` + 大量子配置类 | 全局游戏配置聚合根;含鱼类型、房间、房间鱼、鱼阵、用户等级、道具/碎片、刮刮卡、VIP 等级、击杀(`KillConfig`)、Boss(`BossConfig`)、象棋(`ChessConfig`)、捕鱼房间(`FishRoomConfig`)、Boss 掉落、鱼雷、机器人击杀与 Bot 行为配置 | +| `CommonDomain/ActivityConfig.cs` | 实体 `ActivityConfig` + 子配置类 | 运营活动聚合根:约战(BattleOrder)、救济金(Relief)、签到、金币/钻石商店、注册奖励、捕鱼返水、抽奖(`LotteryActivityConfig`)、排行榜奖励;含 `AutoStopExpired` 过期自动关闭抽奖 | +| `CommonDomain/LotteryActivityConfig.cs` | 抽奖配置模型 | `LotteryActivityConfig` / `LotteryPoolLevel` / `LotteryPrize`:活动开关与时间、奖池(PoolType/权重/奖品列表)、各奖池分档消耗、用户最大抽奖次数;奖品含类型、数量、权重、总量与已抽数量 | +| `CommonDomain/GameTask.cs` | 实体 `GameTask` | 任务定义:状态、编号、任务类型/事件、目标次数、经验奖励;集合 `game_task` | +| `CommonDomain/Faq.cs` | 实体 + 树节点 | FAQ 分类 `FaqCategory`、问题 `FaqQuestion`、分类树 `FaqCategoryTreeNode` | +| `CommonDomain/BotProfileEntity.cs` | 实体 | 机器人头像/昵称配置;集合 `bot_avatar_config` | +| `CommonDomain/EmptyRoomRateConfig.cs` | 实体 | 按游戏类型+房间等级配置的空房率;集合 `empty_room_rate_config` | +| `CommonDomain/ApiLog.cs` | 实体 | 接口访问日志(IP、token、耗时、请求/响应、UA、时间、来源、设备等);集合按月分表 `api_log_{yyyyMM}` | +| `CommonDomain/BackgroundOperationLog.cs` | 实体 | 后台操作日志(管理员、目标用户、操作类型、货币类型、金额、备注、时间);集合 `background_operation_log`(库 `data_0524_user`) | +| `CommonDomain/CapMessageModels.cs` | 消息模型 | CAP 消息体:后台操作通知、玩家因子变更、配置变更、登录绑定/结果、抽奖结果 `LotteryDrawMessage`、临时出鱼、召唤卡出鱼 | +| `CommonDomain/TopicKeys.cs` | 常量 | CAP 主题键集中定义(见第七节) | +| `CommonDomain/ErrorCodes.cs` | 常量 | 统一业务错误码(房间、金币、签名、道具等) | +| `CommonDomain/KillAnnounceParam.cs` | 参数 | 全局击杀公告参数 | +| `CommonDomain/AdminKickChessPlayerMessage.cs` | 消息模型 | 后台踢出象棋玩家消息(RoomId/UserId/Reason) | +| `CommonDomain/FishingKillConfig.cs` | 配置模型 | 捕鱼击杀相关精简配置(鱼类型简报、击杀、Boss、掉落、鱼雷、约战开关) | +| `CommonDomain/FishSpawnExtractor.cs` | 静态工具 | 从 `GameConfig` 抽取并序列化为出鱼配置 JSON(`FishSpawnConfigStoreModel`) | +| `CommonDomain/LotteryPrizeProductHelper.cs` | 静态工具 | 依据 `GameConfig` 回填抽奖奖品的名称/图标/商品详情,并推断其类型(道具=3 / 碎片=4) | +| `CommonDomain/BattleOrderGiftProductHelper.cs` | 静态工具 | 依据 `GameConfig` 回填约战礼包(`GiftConfig`)商品详情 | +| `CommonDomain/IPendingSettlementService.cs` | 接口 | 待结算服务契约(结算金币、清理房间) | + +### 3.2 CommonDomain 基础模型(`CommonDomain/BaseModel/`) + +| 文件 | 职责 | +| --- | --- | +| `BaseModel/BaseProduct.cs` | 商品基础模型(编号、名称、描述、图片、类型、等级) | +| `BaseModel/BaseProductCount.cs` | 继承 `BaseProduct` 并附加数量 `Count`(奖励/道具通用) | +| `BaseModel/BaseIdName.cs` | Id + Name 通用结构 | +| `BaseModel/BaseIdCount.cs` | Id + Count 通用结构 | +| `BaseModel/BaseTitleValue.cs` | Title + Value 通用结构 | +| `BaseModel/UserAssetSyncParam.cs` | 用户资产同步参数(用户、货币、变更方向、金额、变更后余额、来源、备注) | +| `BaseModel/GameBaseConfig.cs` | 游戏配置核心子结构集合:`GlobalRandom` 随机工具、`FishTypeConfig`、`RoomConfig`、`RoomFishConfig`、`FishArrayConfig`、`UserLevelConfig`、`PropInfConfig`/`PropFragmentConfig`/`BasePropInfo`、`VipLevelConfig`、`GiftConfig`、`KillConfig`、`BossConfig`(含轮盘/扑克/飞盘/全屏/范围/弹药箱/星际巡航/火焰风暴/炸弹/蝎子/概率/幸运龙等大量子配置与概率工具方法)、`ChessConfig`、`FishRoomConfig`、`TorpedoItemConfig` 等 | +| `BaseModel/FishSpawnConfig.cs` | 出鱼配置存储模型:`FishSpawnConfigStoreModel` / `FishSpawnLevelConfig` / `FishSpawnProbability` / `FishSpawnFish` / `FishSpawnArray` | + +### 3.3 CommonDomain 枚举(`CommonDomain/Enum/`) + +| 文件 | 枚举 | +| --- | --- | +| `Enum/GameTypeEnum.cs` | 游戏类型:None=0、风雷之渊=1、永夜尸城=2、中国象棋=3、星际迷航=4、黑神话悟空=5 | +| `Enum/FishTypeEnum.cs` | 鱼类型:普通鱼=1、Boss鱼=2、黄金鱼=3、特殊鱼=4、特殊Boss=5 | +| `Enum/ProductTypeEnum.cs` | 商品类型:炮台、翅膀、炮塔碎片、翅膀碎片、战神、战神碎片、刮刮卡、改名卡、大喇叭、技能、召唤卡、VipExp、鱼雷;并含 `ProductType.MoreProductTypeList` | +| `Enum/SaleTypeEnum.cs` | 售卖类型:金币=1、钻石=2 | +| `Enum/TaskType.cs` | `TaskType`(每日任务=1、在线时长任务=2)与 `TaskEvent`(整点在线、在线时长、捕获各类鱼、赢取金币、狂暴、开炮、登录、充值) | + +### 3.4 CommonService 服务能力 + +| 文件 | 类型 | 能力 | +| --- | --- | --- | +| `CommonService/BackgroundOperationService.cs` | 实现 `IBackgroundOperationService` | `Charge`(充值金币/钻石,钻石按 100:1 换算累计充值并触发 VIP 校验升级)、`Deduct`(扣除并校验余额)、`QueryLogs`(后台操作日志分页)、`SearchUser`(按关键词搜索用户) | +| `CommonService/IBackgroundOperationService.cs` | 接口 | 上述后台操作服务契约 | +| `CommonService/BackgroundOperation/BackgroundOperationRequest.cs` | DTO | 后台操作请求体(目标用户、货币类型、金额、备注) | +| `CommonService/LotteryService.cs` | 实现 `ILotteryService`(命名空间为 `UserService`,见备注) | `GetUserStatus`(按活动周期维护用户抽奖状态)、`Draw`(校验活动/奖池/次数/配置/余额后按权重抽取奖池与奖品、扣费、写记录、更新状态,并发布 `Lottery.DrawPrize`)、`GetUserDrawnPrizes` | +| `CommonService/ILotteryService.cs` | 接口(命名空间 `CommonService`) | 抽奖服务契约(`GetUserStatus` / `Draw(string userId)` / `GetUserDrawnPrizes`) | +| `CommonService/Lottery/LotteryPrizeHandler.cs` | 处理器 | 消费抽奖结果消息:按奖品类型(1=金币、2=钻石、3/4=道具)调用 `IUserService.UpdateAssets` 增加资产,来源 `活动奖励` | +| `CommonService/Subscribers/LotteryPrizeSubscriber.cs` | CAP 订阅者 | `[CapSubscribe("Lottery.DrawPrize")]` 订阅抽奖主题并转交 `LotteryPrizeHandler` | +| `CommonService/MongoBaseService.cs` | 实现 `IMongoBaseService` | 通用仓储服务基类:查询/过滤/分页/增删改/聚合等对 `IMongoBaseRepository` 的封装 | +| `CommonService/IMongoBaseService.cs` | 接口 | 通用仓储服务契约 | +| `CommonService/HubSend.cs` | 实现 `IHubSend` | SignalR 推送:按用户(经 Redis `GetRedisUserCId` 查 CId)/分组/全体发送,异常异步告警 | +| `CommonService/IHubSend.cs` | 接口 | 推送契约 | +| `CommonService/ApiLogService.cs` | 实现 `IApiLogService` | `ApiLog` 的仓储服务(继承 `MongoBaseService`) | +| `CommonService/IApiLogService.cs` | 接口 | 接口日志服务契约 | + +### 3.5 抽奖订阅/发放流程(重点) + +发布方(`CommonService/LotteryService.cs` → `Draw` 成功抽中奖品后): + +```csharp +_capPublisher.Publish("Lottery.DrawPrize", new LotteryDrawMessage { + UserId, PrizeId, PrizeName, Type, Count, OtherId +}); +``` + +消费方(`CommonService/Subscribers/LotteryPrizeSubscriber.cs`): + +```csharp +[CapSubscribe("Lottery.DrawPrize")] +public async Task HandleLotteryDrawPrize(LotteryDrawMessage message) + => await _handler.Handle(message); +``` + +处理逻辑(`CommonService/Lottery/LotteryPrizeHandler.cs` → `Handle`): + +1. 依据 `UserId` 查询用户,用户不存在则直接返回; +2. `switch (message.Type)`: + - `case 1`(金币)/`case 2`(钻石):调用 `_userService.UpdateAssets`,`ChangeType=增加`,金币取 `Count` 或钻石取 `Count`,来源 `RewardSource.活动奖励`,备注“抽奖获得金币/钻石 x{Count}”; + - `case 3`(道具)/`case 4`(碎片):当 `OtherId` 非空时,构造 `BaseProductCount{ Number=OtherId, Count }` 作为 `RewardItems`,同样以“增加/活动奖励”入账,备注“抽奖获得道具 x{Count}”。 + +即:**抽奖扣费与中奖判定在 `LotteryService` 内同步完成并落库,实际资产入账通过 CAP 异步消息 `Lottery.DrawPrize` 由 `LotteryPrizeHandler` 完成**,实现抽奖与发奖解耦。 + +> 备注(代码现状,供准确理解):`CommonService/LotteryService.cs` 的命名空间声明为 `UserService`,实现的接口是 `UserService.ILotteryService`;而 `UserSrc/UserService/User/` 下另有一份 `LotteryService.cs` / `ILotteryService.cs`(其命名空间声明为 `CommonService`)。`UserApi/Lottery/LotteryController.cs` 通过 `ILotteryService`(命名空间 `UserService`)调用抽奖。本文档只描述 `CommonService/` 目录下的文件,但上述跨命名空间重名现象会影响对抽奖链路归属的判断,特此说明。 + +--- + +## 四、项目结构与技术要点 + +### 4.1 `CommonDomain/CommonDomain.csproj` + +- 目标框架:`net8.0`;启用 `ImplicitUsings`、`Nullable`。 +- NuGet 包:**无显式 `PackageReference`**(依赖来自被引用的仓储工程与传递依赖)。 +- 项目引用(唯一):`..\Infrastructure\MongoRepository\MongoRepository.csproj`。 +- 定位:纯模型/枚举/常量/工具层,**不引用任何业务服务工程**。 + +### 4.2 `CommonService/CommonService.csproj` + +- 目标框架:`net8.0`;启用 `ImplicitUsings`、`Nullable`。 +- NuGet 包: + - `Microsoft.AspNetCore.SignalR.Core` 1.2.9(SignalR 推送) + - `StackExchange.Redis` 2.7.4(Redis 访问) + - `DotNetCore.CAP` 8.3.4(消息发布/订阅) +- 项目引用: + - `..\Infrastructure\MongoRepository\MongoRepository.csproj` + - `..\RedisService\RedisService.csproj` + - `..\UserSrc\UserService\UserService.csproj` + - `..\CommonDomain\CommonDomain.csproj` + - `..\UserSrc\UserDomain\UserDomain.csproj` + +### 4.3 依赖关系(谁引用本模块) + +- **引用 `CommonService` 的项目**: + - `UserSrc/UserApi/UserApi.csproj`(用户端 API) + - `CustomerSrc/CustomerApi/CustomerApi.csproj`(客服端 API) + - `FishRoomService/FishRoomService.csproj`(捕鱼房间服务) + - `FishGameSrc/FishGameService/FishGameService.csproj`(捕鱼游戏服务) + - `ChessGameHost/ChessGameHost.csproj` + - `Infrastructure/SharpAbp.Infrastructure.Api/SharpAbp.Infrastructure.Api.csproj`(公共基础设施) +- **引用 `CommonDomain` 的项目(部分)**: + - `CommonService`、`UserSrc/UserDomain`、`UserSrc/UserService`、`RedisService`、`FishGameSrc/FishGameService`、`AdminSrc/AdminService`、`CustomerSrc/CustomerService`、`CustomerSrc/CustomerApi`、`CustomerSrc/CustomerService.Domain`。 + +### 4.4 DI 注册要点(Autofac 约定) + +- `Infrastructure/SharpAbp.Infrastructure.Api/Autofac/ApplicationModule.cs`:**通用扫描注册**,对传入程序集按后缀 `Service` / `Repository` 注册,并注册泛型 `MongoBaseRepository<>`(`IMongoBaseRepository<>`)与 `MongoBaseService<>`(`IMongoBaseService<>`)、`RedisService`。`UserHost` 通过 `AutofacModule : ApplicationModule` 传入 `typeof(ApiLogService).Assembly`(即 **CommonService 程序集**),从而注册 CommonService 下所有 `*Service`。 +- `AdminHost/Middleware/AutofacModule.cs`:`RegisterAssemblyTypes(typeof(ApiLogService).Assembly).Where(t => t.Name.EndsWith("Service"))` 扫描 CommonService 程序集;并显式注册 `CommonService.BackgroundOperationService → IBackgroundOperationService`。 +- `FishGameHost/Middleware/AutofacModule.cs`、`ChessGameHost/Middleware/AutofacModule.cs`:同样按 `*Service` 扫描 CommonService 程序集。 +- `UserHost/Extension/CapExtension.cs`:显式注册 `CommonService.Lottery.LotteryPrizeHandler` 与 `CommonService.Lottery.LotteryPrizeSubscriber`(CAP 订阅者)。 + +--- + +## 五、代码目录说明(完整目录树) + +```text +CommonDomain/ 通用领域模型层(net8.0,仅引用 MongoRepository) +├── CommonDomain.csproj 工程文件:net8.0 + ImplicitUsings + Nullable,引用 MongoRepository +├── TopicKeys.cs CAP 消息主题键常量集中定义 +├── CapMessageModels.cs 跨服务 CAP 消息体(后台操作、因子/配置变更、登录绑定、抽奖结果、出鱼等) +├── ErrorCodes.cs 统一业务错误码常量 +├── ActivityConfig.cs 活动配置聚合根 ActivityConfig 及约战/救济/签到/商店/注册/返水/排行榜子配置 +├── LotteryActivityConfig.cs 抽奖配置:LotteryActivityConfig / LotteryPoolLevel / LotteryPrize +├── LotteryPrizeProductHelper.cs 抽奖奖品商品详情回填工具(依赖 GameConfig) +├── BattleOrderGiftProductHelper.cs 约战礼包商品详情回填工具(依赖 GameConfig) +├── GameConfig.cs 全局游戏配置聚合根 GameConfig 及 Bot/机器人击杀等子配置 +├── GameTask.cs 任务实体 GameTask(集合 game_task) +├── FishingKillConfig.cs 捕鱼击杀精简配置与鱼类型简报 +├── FishSpawnExtractor.cs 出鱼配置抽取/序列化工具 +├── Faq.cs FAQ 分类/问题实体与分类树节点 +├── BotProfileEntity.cs 机器人头像昵称实体(集合 bot_avatar_config) +├── EmptyRoomRateConfig.cs 空房率配置实体(集合 empty_room_rate_config) +├── ApiLog.cs 接口访问日志实体(按月分表 api_log_{yyyyMM}) +├── BackgroundOperationLog.cs 后台操作日志实体(集合 background_operation_log) +├── KillAnnounceParam.cs 全局击杀公告参数 +├── AdminKickChessPlayerMessage.cs 后台踢出象棋玩家消息 +├── IPendingSettlementService.cs 待结算服务接口(结算金币/清理房间) +├── BaseModel/ 通用基础模型与游戏配置子结构 +│ ├── BaseProduct.cs 商品基础模型(编号/名称/描述/图片/类型/等级) +│ ├── BaseProductCount.cs 商品 + 数量(奖励通用) +│ ├── BaseIdName.cs Id + Name 通用结构 +│ ├── BaseIdCount.cs Id + Count 通用结构 +│ ├── BaseTitleValue.cs Title + Value 通用结构 +│ ├── UserAssetSyncParam.cs 用户资产同步参数 +│ ├── GameBaseConfig.cs 游戏配置核心子结构(鱼/房间/道具/Boss/棋牌/鱼雷 + GlobalRandom 等) +│ └── FishSpawnConfig.cs 出鱼配置存储模型(Level/Probability/Fish/Array) +└── Enum/ 领域枚举 + ├── GameTypeEnum.cs 游戏类型枚举 + ├── FishTypeEnum.cs 鱼类型枚举 + ├── ProductTypeEnum.cs 商品类型枚举 + MoreProductTypeList + ├── SaleTypeEnum.cs 售卖类型枚举(金币/钻石) + └── TaskType.cs 任务类型 TaskType 与任务事件 TaskEvent + +CommonService/ 公共业务服务层(net8.0,CAP/SignalR/Redis) +├── CommonService.csproj 工程文件:引用 MongoRepository/RedisService/UserService/CommonDomain/UserDomain +├── BackgroundOperationService.cs 后台运营操作服务(充值/扣除/日志查询/用户搜索 + CAP 发布) +├── IBackgroundOperationService.cs 后台运营操作服务接口 +├── LotteryService.cs 抽奖服务实现(校验/抽奖/扣费/记录/状态 + 发布 Lottery.DrawPrize) +├── ILotteryService.cs 抽奖服务接口(命名空间 CommonService) +├── MongoBaseService.cs 通用 Mongo 仓储服务基类 MongoBaseService +├── IMongoBaseService.cs 通用 Mongo 仓储服务接口 +├── HubSend.cs SignalR 推送封装 HubSend(按用户/分组/全体,经 Redis 取 CId) +├── IHubSend.cs SignalR 推送接口 +├── ApiLogService.cs 接口日志服务(继承 MongoBaseService) +├── IApiLogService.cs 接口日志服务接口 +├── BackgroundOperation/ 后台操作相关模型 +│ └── BackgroundOperationRequest.cs 后台操作请求体 DTO +├── Lottery/ 抽奖相关处理 +│ └── LotteryPrizeHandler.cs 抽奖奖品发放处理器(按类型增加金币/钻石/道具) +└── Subscribers/ CAP 消息订阅者 + └── LotteryPrizeSubscriber.cs 订阅 Lottery.DrawPrize 主题并转交处理器 +``` + +--- + +## 六、关键文件索引 + +| 文件相对路径 | 职责 | +| --- | --- | +| `CommonDomain/CommonDomain.csproj` | 领域模型工程(net8.0),仅引用 `MongoRepository` | +| `CommonDomain/TopicKeys.cs` | CAP 主题键常量,跨模块消息主题命名规范 | +| `CommonDomain/CapMessageModels.cs` | CAP 消息体模型集合(含 `LotteryDrawMessage`、`BackgroundOperationNotifyMessage`) | +| `CommonDomain/ActivityConfig.cs` | 运营活动聚合根,内嵌抽奖配置 `LotteryActivityConfig` | +| `CommonDomain/LotteryActivityConfig.cs` | 抽奖奖池/奖品配置模型 | +| `CommonDomain/GameConfig.cs` | 全局游戏配置聚合根(鱼/房间/道具/Boss/机器人等) | +| `CommonDomain/BaseModel/GameBaseConfig.cs` | 游戏配置核心子结构与参数类、随机与概率工具 | +| `CommonDomain/BaseModel/FishSpawnConfig.cs` | 出鱼配置存储模型 | +| `CommonDomain/BaseModel/BaseProduct.cs` | 通用商品基础模型 | +| `CommonDomain/BaseModel/UserAssetSyncParam.cs` | 用户资产同步参数 | +| `CommonDomain/FishSpawnExtractor.cs` | 出鱼配置抽取/序列化工具 | +| `CommonDomain/LotteryPrizeProductHelper.cs` | 抽奖奖品详情回填工具 | +| `CommonDomain/BattleOrderGiftProductHelper.cs` | 约战礼包详情回填工具 | +| `CommonDomain/ErrorCodes.cs` | 统一业务错误码 | +| `CommonDomain/Enum/*.cs` | 领域枚举(游戏/鱼/商品/售卖/任务类型) | +| `CommonService/CommonService.csproj` | 公共服务工程(CAP/SignalR/Redis 依赖与项目引用) | +| `CommonService/BackgroundOperationService.cs` | 后台充值/扣除/日志/用户搜索,CAP 发布资产变更与通知 | +| `CommonService/LotteryService.cs` | 抽奖实现,发布 `Lottery.DrawPrize` | +| `CommonService/Lottery/LotteryPrizeHandler.cs` | 抽奖结果派发,按类型增加用户资产 | +| `CommonService/Subscribers/LotteryPrizeSubscriber.cs` | 订阅 `Lottery.DrawPrize` 的 CAP 订阅者 | +| `CommonService/MongoBaseService.cs` | 通用 Mongo 仓储服务基类 | +| `CommonService/HubSend.cs` | SignalR 推送封装(Redis 取 CId) | +| `CommonService/ApiLogService.cs` | 接口日志仓储服务 | + +--- + +## 七、与其他模块的交互 + +### 7.1 CAP / RabbitMQ 消息主题 + +**主题键常量(`CommonDomain/TopicKeys.cs`)**: + +| 常量 | 值 | +| --- | --- | +| 任务完成 | `Topic_0524_CompletedTask` | +| 用户资产变更 | `Topic_0524_UserAssetsChanged` | +| 游戏金币结算 | `Topic_0524_GameCoinsSettlement` | +| 用户升级 | `Topic_0524_UserLevel` | +| 击杀鱼日志 | `Topic_0524_KillFishLog` | +| 房间变化 | `Topic_0524_RoomChage` | +| 全局击杀公告 | `Topic_0524_GlobalKillAnnounce` | +| 玩家踢出 | `Topic_0524_PlayerKicked` | +| 用户资产同步前端 | `Topic_0524_UserAssetSyncFrontend` | +| 因子变更 | `Topic_0524_PlayerFactorChanged` | +| 配置变更 | `Topic_0524_ConfigChanged` | +| 登录绑定 | `Topic_0524_LoginBind` | +| 拒绝回房 | `Topic_0524_DismissPendingRoom` | +| 登录结果通知 | `Topic_0524_LoginBindResult` | +| 临时强制出鱼 | `Topic_0524_TempSpawnFish` | +| 召唤卡出鱼 | `Topic_0524_SummonCardFish` | +| 后台踢出象棋玩家 | `Topic_0524_AdminKickChessPlayer` | + +**CommonService 直接参与的主题(基于本目录代码)**: + +- **订阅**: + - `Lottery.DrawPrize` —— `CommonService/Subscribers/LotteryPrizeSubscriber.cs`(`[CapSubscribe("Lottery.DrawPrize")]`),由 `LotteryPrizeHandler` 发放奖品。 +- **发布**: + - `Lottery.DrawPrize` —— `CommonService/LotteryService.cs`(抽奖成功后发布)。 + - `VipLevelUp` —— `CommonService/BackgroundOperationService.cs`(后台充值钻石触发 VIP 升级)。 + - `UserAssetChange` —— `CommonService/BackgroundOperationService.cs`(后台充值/扣除后的资产变更)。 + - `BackgroundOperation.NotifyUser` —— `CommonService/BackgroundOperationService.cs`(面向用户的资产变更通知;使用 `BackgroundOperationNotifyMessage`)。 + +**同主题的其他消费方(用于理解消息闭环,不在本模块目录内)**: + +- `BackgroundOperation.NotifyUser`:`UserSrc/UserService/Hubs/AdminNotifySubscriber.cs`、`FishGameSrc/FishGameService/Subscribers/BackgroundAssetSubscriber.cs`。 +- `TopicKeys` 相关主题:`UserSrc/UserService/User/UserMQService.cs`(任务完成、用户资产变更、游戏金币结算、击杀鱼日志)、`FishRoomService/MQ/RoomMQService.cs`(房间变化、用户资产同步前端)、`FishGameSrc/FishGameService/Subscribers/*`(因子变更、配置变更、登录绑定、拒绝回房、临时出鱼、召唤卡出鱼)、`ChessGameSrc/ChessGameService/Subscribers/*`(登录绑定、后台踢出象棋玩家)。 + +### 7.2 被 Admin / User / Customer 等模块引用情况 + +- **Admin(后台)**:`AdminSrc/AdminService` 引用 `CommonDomain`;`AdminApi/BackgroundOperation/BackgroundOperationController.cs` 注入 `CommonService.IBackgroundOperationService`,暴露 `POST adminapi/BackgroundOperation/charge`、`deduct`、`GET logs`、`GET search-user`。`AdminHost` 通过 Autofac 显式注册 `BackgroundOperationService`。 +- **User(用户端)**:`UserSrc/UserApi` 引用 `CommonService`;`UserApi/Lottery/LotteryController.cs` 注入 `ILotteryService`(命名空间 `UserService`)与 `IActivityConfigService`、`IGameConfigService`,使用 `CommonDomain` 的 `LotteryPrizeProductHelper.Enrich` 回填奖品详情,暴露 `api/Lottery/Config`、`Draw`、`UserStatus`、`DrawnPrizes`。`UserHost` 通过 `ApplicationModule` 扫描 CommonService 程序集并注册 `LotteryPrizeSubscriber`/`LotteryPrizeHandler`。 +- **Customer(客服端)**:`CustomerSrc/CustomerApi`、`CustomerSrc/CustomerService`、`CustomerSrc/CustomerService.Domain` 引用 `CommonDomain`。 +- **捕鱼(FishRoom / FishGame)**:`FishRoomService`、`FishGameService` 引用 `CommonService`;对应 Host 通过 Autofac 扫描 CommonService 程序集。 +- **Chess(象棋)**:`ChessGameHost` 引用 `CommonService`(使用 `CommonService` 类型注册扫描),并消费 `TopicKeys.后台踢出象棋玩家`、`TopicKeys.登录绑定` 等主题。 +- **公共基础设施**:`Infrastructure/SharpAbp.Infrastructure.Api` 引用 `CommonService`,其 `ApplicationModule` 负责通用注册(含 `MongoBaseService<>`、`MongoBaseRepository<>`、`RedisService`)。 + +### 7.3 MongoDB 集合(本模块模型涉及) + +| 模型 | 集合名 | 库 | +| --- | --- | --- | +| `GameConfig` | `game_config` | `data_0524` | +| `GameTask` | `game_task` | `data_0524` | +| `ActivityConfig` | `activity_config` | `data_0524` | +| `FaqCategory` | `faq_category` | `data_0524` | +| `FaqQuestion` | `faq_question` | `data_0524` | +| `BotProfileEntity` | `bot_avatar_config` | `data_0524` | +| `EmptyRoomRateConfig` | `empty_room_rate_config` | `data_0524` | +| `ApiLog` | `api_log_{yyyyMM}`(按月分表) | `data_0524` | +| `BackgroundOperationLog` | `background_operation_log` | `data_0524_user`(`ServiceDatabases.User`) | + +> 说明:抽奖相关配置以 `ActivityConfig.LotteryActivityConfig` 内嵌文档形式存储于 `activity_config`,不单独成表;抽奖记录 `LotteryRecord`、用户抽奖状态 `LotteryUserStatus` 定义在 `UserDomain`(不在本模块目录内),由 `LotteryService` 通过 `IMongoBaseRepository<>` 读写。`MongoBaseEntity`(`Infrastructure/MongoRepository/MongoBaseEntity.cs`)为所有实体基类,含 `_id`、`isdelete`、`CreateInfo`;集合与库名通过 `[BsonCollection(集合名, 库名)]` 特性声明。 + +### 7.4 Redis 与 SignalR + +- **Redis**:`CommonService/HubSend.cs` 通过 `IRedisService.GetRedisUserCId(userId)` 从 Redis 读取用户与 SignalR 连接标识(CId)的映射,再经 `IHubContext` 定向推送;`BackgroundOperationService` 通过 `IRedisService.GetGameConfig()` 获取游戏配置用于 VIP 等级校验。 +- **SignalR**:`HubSend` 提供按单个用户(CId)、多用户、分组、分组排除、全体(`SendAll`)等推送方法,并对发送异常做异步日志告警。 + +--- + +(全文完。本文档内容均基于 `CommonDomain/` 与 `CommonService/` 目录下的实际源代码整理;未在该目录内确认的信息未纳入。) \ No newline at end of file diff --git a/nlog.config b/nlog.config new file mode 100644 index 0000000..d537968 --- /dev/null +++ b/nlog.config @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +