using AutoMapper; using ChouBox.Code.TencentCloudExtend.Model; using ChouBox.Model.Entities; using HuanMeng.DotNetCore.Base; using HuanMeng.DotNetCore.Extensions; using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using StackExchange.Redis; using System.Threading.Tasks; namespace ChouBox.Code.AppExtend; /// /// bll 基础类 /// public class ChouBoxCodeBase { /// /// _serviceProvider,提供基本依赖注入支持 /// protected readonly IServiceProvider _serviceProvider; /// /// 构造函数 /// /// public ChouBoxCodeBase(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } private EfCoreDaoBase? _dao; /// /// 数据库, /// 更新删除,尽量只操作本bll实例dao获取到的对象,取和存要同一个dao /// public EfCoreDaoBase Dao { get { if (_dao == null) { _dao = new EfCoreDaoBase(_serviceProvider.GetRequiredService()); } return _dao; } } #region 映射 private IMapper _mapper; /// /// DTO 映射 /// public virtual IMapper Mapper { get { if (_mapper == null) { _mapper = _serviceProvider.GetRequiredService(); } return _mapper; } set { _mapper = value; } } #endregion #region 请求信息 private IHttpContextAccessor _httpContextAccessor; /// /// HttpContextAccessor /// public IHttpContextAccessor HttpContextAccessor { get { if (_httpContextAccessor == null) { _httpContextAccessor = _serviceProvider.GetRequiredService(); } return _httpContextAccessor; } } /// /// 获取客户端真实IP地址,考虑Nginx等代理情况 /// /// 客户端真实IP地址 protected string GetRealIpAddress() { var context = HttpContextAccessor.HttpContext; if (context == null) return "unknown"; // 尝试从X-Forwarded-For获取真实IP string ip = context.Request.Headers["X-Forwarded-For"].FirstOrDefault(); // 如果X-Forwarded-For为空,尝试X-Real-IP if (string.IsNullOrEmpty(ip)) { ip = context.Request.Headers["X-Real-IP"].FirstOrDefault(); } // 尝试其他可能包含真实IP的头 if (string.IsNullOrEmpty(ip)) { ip = context.Request.Headers["Proxy-Client-IP"].FirstOrDefault(); } if (string.IsNullOrEmpty(ip)) { ip = context.Request.Headers["WL-Proxy-Client-IP"].FirstOrDefault(); } if (string.IsNullOrEmpty(ip)) { ip = context.Request.Headers["HTTP_CLIENT_IP"].FirstOrDefault(); } if (string.IsNullOrEmpty(ip)) { ip = context.Request.Headers["HTTP_X_FORWARDED_FOR"].FirstOrDefault(); } // 如果还是获取不到,则使用RemoteIpAddress if (string.IsNullOrEmpty(ip)) { ip = context.Connection.RemoteIpAddress?.ToString(); } // 如果X-Forwarded-For包含多个IP,取第一个非内网IP if (!string.IsNullOrEmpty(ip) && ip.Contains(",")) { ip = ip.Split(',')[0].Trim(); } return ip ?? "unknown"; } #endregion #region 日志 private ILogger _logger; /// /// 日志 /// public ILogger Logger { get { if (_logger == null) { _logger = _serviceProvider.GetRequiredService>(); } return _logger; } } #endregion public IConfiguration Configuration() { return _serviceProvider.GetRequiredService(); } #region Redis private IDatabase _redis; /// /// Redis 缓存 /// public IDatabase RedisCache { get { if (_redis == null) { var connectionMultiplexer = _serviceProvider.GetRequiredService(); _redis = connectionMultiplexer.GetDatabase(); } return _redis; } } #endregion /// /// 获取腾讯云短信配置 /// /// public async Task GetTencentSMSConfigAsync() { var config = await this.GetConfigAsync("tencent_sms_config"); if (config == null) { config = new TencentSMSConfig() { SecretId = "AKIDLbhdP0Vs57yd7QZWu8A2jFbno8JKBUp6", SecretKey = "", ReqMethod = "POST", Timeout = 30, SmsSdkAppId = "1400923253", SignName = "上海寰梦科技发展", TemplateId = "2209122" }; } return config; } /// /// 获取系统配置 /// /// 配置关键词 /// 配置信息 public Dictionary GetConfig(string type) { // 生成缓存键 string cacheKey = $"config:{type}"; // 尝试从缓存获取数据 var cachedData = RedisCache.StringGet>(cacheKey); if (cachedData != null) { return cachedData; } // 从数据库查询 var content = Dao.Context.Config.Where(it => it.Key == type).FirstOrDefault(); Dictionary config = null; if (content != null) { var d = JsonConvert.DeserializeObject>(content.Value); RedisCache.StringSet(cacheKey, content.Value, TimeSpan.FromMinutes(10)); return d; } return null; } /// /// 获取系统配置 /// /// 实体类 /// 配置key /// public async Task GetConfigAsync(string type) where T : class { // 生成缓存键 string cacheKey = $"config:{type}"; // 尝试从缓存获取数据 var cachedData = RedisCache.StringGet(cacheKey); if (cachedData != null) { return cachedData; } // 从数据库查询 var content = await Dao.Context.Config.Where(it => it.Key == type).FirstOrDefaultAsync(); if (content != null && !string.IsNullOrEmpty(content.Value)) { var d = JsonConvert.DeserializeObject(content.Value); RedisCache.StringSet(cacheKey, content.Value, TimeSpan.FromMinutes(10)); return d; } return null; } }