第3章 配置与服务

news/2024/11/9 9:29:36/

1 CoreCms.Net.Configuration.AppSettingsHelper

using Microsoft.Extensions.Configuration;

using Microsoft.Extensions.Configuration.Json;

namespace CoreCms.Net.Configuration

{

    /// <summary>

    /// 【应用设置助手--类】

    /// <remarks>

    /// 摘要:

    ///     该类中的方法成员,通过1个指定的根节点中1指定的子节点,获取该子节点所对应的值。

    /// </remarks>

    /// </summary>

    public class AppSettingsHelper

    {

        #region 拷贝构造方法与变量

        /// <summary>

        /// 【配置】

        /// <remarks>

        /// 摘要:

        ///    .NetCore框架内置配置接口实例(存储着当前程序中所有*.json文件中的数据)。

        /// </remarks>

        /// </summary>

        static IConfiguration Configuration { get; set; }

        /// <summary>

        /// 【拷贝构造方法】

        /// <remarks>

        /// 摘要:

        ///     通过拷贝构造方法,对.NetCore框架内置配置接口实例(存储着当前程序中所有*.json文件中的数据)。

        /// </remarks>

        /// </summary>

        public AppSettingsHelper(string contentPath)

        {

            string Path = "appsettings.json";

            Configuration = new ConfigurationBuilder().SetBasePath(contentPath).Add(new JsonConfigurationSource { Path = Path, Optional = false, ReloadOnChange = true }).Build();

        }

        #endregion

        /// <param name="sections">数组实例,该实例存储着1个指定的根节点及其1指定的子节点。</param>

        /// <summary>

        /// 【获取内容】

        ///  <remarks>

        /// 摘要:

        ///     通过1个指定的根节点中1指定的子节点,获取该子节点所对应的值。

        /// </remarks>

        /// <returns>

        /// 返回:

        ///     1指定的子节点所对应的值。

        /// </returns>

        /// </summary>

        public static string GetContent(params string[] sections)

        {

            try

            {

                if (sections.Any())

                {

                    return Configuration[string.Join(":", sections)];

                }

            }

            catch (Exception) { }

            return "";

        }

    }

}

2 CoreCms.Net.Configuration.AppSettingsConstVars

using SqlSugar.Extensions;

namespace CoreCms.Net.Configuration

{

    /// <summary>

    /// 【应用设置格式化--类】

    /// <remarks>

    /// 摘要:

    ///     获取1个指定的根节点中1指定的子节点,获取该子节点所对应的值,最后把该值赋值给该类中的属性成员。

    /// </remarks>

    /// </summary>

    public class AppSettingsConstVars

    {

        #region 全局地址================================================================================

        /// <summary>

        /// 【后端管理地址】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取后端管理地址子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string AppConfigAppUrl = AppSettingsHelper.GetContent("AppConfig", "AppUrl");

        /// <summary>

        /// 【系统接口地址】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取系统接口地址子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string AppConfigAppInterFaceUrl = AppSettingsHelper.GetContent("AppConfig", "AppInterFaceUrl");

        #endregion

        #region 数据库================================================================================

        /// <summary>

        /// 【数据库连接字符串】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取数据库连接字符串子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string DbSqlConnection = AppSettingsHelper.GetContent("ConnectionStrings", "SqlConnection");

        /// <summary>

        /// 【数据库类型】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取数据库类型子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string DbDbType = AppSettingsHelper.GetContent("ConnectionStrings", "DbType");

        #endregion

        #region redis================================================================================

        /// <summary>

        /// redis分布式数据库连接字符串】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取redis分布式数据库连接字符串子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string RedisConfigConnectionString = AppSettingsHelper.GetContent("RedisConfig", "ConnectionString");

        /// <summary>

        /// 【启用redis分布式数据库缓存?】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取启用redis分布式数据库缓存子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly bool RedisUseCache = AppSettingsHelper.GetContent("RedisConfig", "UseCache").ObjToBool();

        /// <summary>

        /// 【启用redis分布式数据库执行定时任务?】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取启用redis分布式数据库执行定时任务子节点所对应的值。

        /// 说明:

        ///     redis分布式数据库一般也能用于自动触发执行当前程序中自定义的计划任务。

        /// </remarks>

        public static readonly bool RedisUseTimedTask = AppSettingsHelper.GetContent("RedisConfig", "UseTimedTask").ObjToBool();

        #endregion

        #region AOP================================================================================

        /// <summary>

        /// 【启用事务横切?】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取启用事务横切子节点所对应的值。

        /// </remarks>

        public static readonly bool TranAopEnabled = AppSettingsHelper.GetContent("TranAOP", "Enabled").ObjToBool();

        #endregion

        #region Jwt授权配置================================================================================

        /// <summary>

        /// JwtBearer身份认证秘钥】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取JwtBearer身份认证秘钥子节点所对应的值。

        /// 说明:

        ///     为所有令牌(Token)字符串进行加密操作时,提供数据支撑的秘钥字符串。

        /// </remarks>

        /// </summary>

        public static readonly string JwtConfigSecretKey = AppSettingsHelper.GetContent("JwtConfig", "SecretKey");

        /// <summary>

        /// JwtBearer身份认证签发机关】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取JwtBearer身份认证签发机关子节点所对应的值。

        /// 说明:

        ///     用于生成所有令牌(Token)字符串实例,提供数据支撑的签发机关

        /// </remarks>

        /// </summary>

        public static readonly string JwtConfigIssuer = AppSettingsHelper.GetContent("JwtConfig", "Issuer");

        /// <summary>

        /// JwtBearer身份认证订阅者】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取JwtBearer身份认订阅者关子节点所对应的值。

        /// 说明:

        ///     用于生成所有令牌(Token)字符串实例,提供数据支撑的订阅者

        /// </remarks>

        /// </summary>

        public static readonly string JwtConfigAudience = AppSettingsHelper.GetContent("JwtConfig", "Audience");

        #endregion

        #region Cors跨域设置================================================================================

        /// <summary>

        /// Cors跨域策略名称】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取Cors跨域策略名称子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string CorsPolicyName = AppSettingsHelper.GetContent("Cors", "PolicyName");

        /// <summary>

        /// 【启用Cors跨域?

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取启用Cors跨域子节点所对应的值。

        /// 说明:

        ///     是否应用所有的IP,如设置为true,则取消跨域限制。

        /// </remarks>

        /// </summary>

        public static readonly bool CorsEnableAllIPs = AppSettingsHelper.GetContent("Cors", "EnableAllIPs").ObjToBool();

        /// <summary>

        /// Cors跨域IP集】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取Cors跨域IP集子节点所对应的值。

        /// 说明:

        ///     在启用跨域限制时,所允许前端App的域名,注意:IP集中和IIS部署时,最好不要使用8080端口,因为前端App启动时的默认端口一般为:8080,从因前后程序使用同1个端口而造成异常。

        /// </remarks>

        /// </summary>

        public static readonly string CorsIPs = AppSettingsHelper.GetContent("Cors", "IPs");

        #endregion

        #region Middleware中间件================================================================================

        /// <summary>

        /// 【启用Ip限流自定义中间件?】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取启用Ip限流自定义中间件子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly bool MiddlewareIpLogEnabled = AppSettingsHelper.GetContent("Middleware", "IPLog", "Enabled").ObjToBool();

        /// <summary>

        /// 【启用记录请求与返回数据自定义中间件?】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取启用记录请求与返回数据自定义中间件子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly bool MiddlewareRequestResponseLogEnabled = AppSettingsHelper.GetContent("Middleware", "RequestResponseLog", "Enabled").ObjToBool();

        /// <summary>

        /// 【启用用户访问记录日志自定义中间件?】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取启用用户访问记录日志自定义中间件子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly bool MiddlewareRecordAccessLogsEnabled = AppSettingsHelper.GetContent("Middleware", "RecordAccessLogs", "Enabled").ObjToBool();

        /// <summary>

        /// 【用户访问记录-过滤ip自定义中间件】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取用户访问记录-过滤ip自定义中间件子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string MiddlewareRecordAccessLogsIgnoreApis = AppSettingsHelper.GetContent("Middleware", "RecordAccessLogs", "IgnoreApis");

        #endregion

        #region 支付================================================================================

        /// <summary>

        /// 【微信支付回调】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取微信支付回调子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string PayCallBackWeChatPayUrl = AppSettingsHelper.GetContent("PayCallBack", "WeChatPayUrl");

        /// <summary>

        /// 【微信退款回调】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取微信退款回调子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string PayCallBackWeChatRefundUrl = AppSettingsHelper.GetContent("PayCallBack", "WeChatRefundUrl");

        /// <summary>

        /// 【支付宝支付回调】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取支付宝支付回调子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string PayCallBackAlipayUrl = AppSettingsHelper.GetContent("PayCallBack", "AlipayUrl");

        /// <summary>

        /// 【支付宝退款回调】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取支付宝退款回调子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string PayCallBackAlipayRefundUrl = AppSettingsHelper.GetContent("PayCallBack", "AlipayRefundUrl");

        #endregion

        #region 易联云打印机================================================================================

        /// <summary>

        /// 【启用易联云打印机?】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取启用易联云打印机子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly bool YiLianYunConfigEnabled = AppSettingsHelper.GetContent("YiLianYunConfig", "Enabled").ObjToBool();

        /// <summary>

        /// 【易联云打印机ID

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取易联云打印机ID子节点所对应的值。

        /// 说明:

        ///     一般由开发者所申请的易联云打印机服务的编号值。

        /// </remarks>

        /// </summary>

        public static readonly string YiLianYunConfigClientId = AppSettingsHelper.GetContent("YiLianYunConfig", "ClientId");

        /// <summary>

        /// 【易联云打印机密钥】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取易联云打印机ID子节点所对应的值。

        /// 说明:

        ///     一般由开发者所申请的易联云打印机服务的密钥。

        /// </remarks>

        /// </summary>

        public static readonly string YiLianYunConfigClientSecret = AppSettingsHelper.GetContent("YiLianYunConfig", "ClientSecret");

        /// <summary>

        /// 【易联云打印机设备号】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取易联云打印机设备号子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string YiLianYunConfigMachineCode = AppSettingsHelper.GetContent("YiLianYunConfig", "MachineCode");

        /// <summary>

        /// 【易联云打印机终端密钥】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取易联云打印机终端密钥子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string YiLianYunConfigMsign = AppSettingsHelper.GetContent("YiLianYunConfig", "Msign");

        /// <summary>

        /// 【易联云打印机名称】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取易联云打印机名称子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string YiLianYunConfigPrinterName = AppSettingsHelper.GetContent("YiLianYunConfig", "PrinterName");

        /// <summary>

        /// 【易联打印机设置联系方式】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取易联云打印机设置联系方式子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string YiLianYunConfigPhone = AppSettingsHelper.GetContent("YiLianYunConfig", "Phone");

        #endregion

        #region HangFire定时任务================================================================================

        /// <summary>

        /// HangFire登录账号】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取HangFire登录账号子节点所对应的值。

        /// 说明:

        ///     HangFire一般用于自动触发执行当前程序中自定义的计划任务。

        /// </remarks>

        /// </summary>

        public static readonly string HangFireLogin = AppSettingsHelper.GetContent("HangFire", "Login");

        /// <summary>

        /// HangFire登录密码】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取HangFire登录密码子节点所对应的值。

        /// 说明:

        ///     HangFire一般用于自动触发执行当前程序中自定义的计划任务。

        /// </remarks>

        /// </summary>

        public static readonly string HangFirePassWord = AppSettingsHelper.GetContent("HangFire", "PassWord");

        #endregion

    }

}

3 重构CoreCms.Net.Core.Config.SqlSugarSetup

using CoreCms.Net.Configuration;

using Microsoft.Extensions.DependencyInjection;

using SqlSugar;

using SqlSugar.IOC;                  

using System.Reflection;

namespace CoreCms.Net.Core.Config

{

    /// <summary>

    /// SqlSugarCore中间件启动--类】

    /// <remarks>

    /// 摘要:

    ///     通过该类中的方法成员,把SqlSugarCore中间件依赖注入到.Net(Core)框架内置依赖注入容器中。

    /// </remarks>

    /// </summary>

    public static class SqlSugarSetup

    {

        /// <param name="services">.Net(Core)框架内置依赖注入容器实例。</param>

        /// <summary>

        /// 【配置服务】

        /// <remarks>

        /// 摘要:

        ///     通过该方法成员,把SqlSugarCore中间件依赖注入到.Net(Core)框架内置依赖注入容器中。。

        /// </remarks>

        /// </summary>

        public static void AddSqlSugarSetup(this IServiceCollection services)

        {

            if (services == null) throw new ArgumentNullException(nameof(services));

            //注入 ORM

            SugarIocServices.AddSqlSugar(new IocConfig()

            {

                //数据库连接

                ConnectionString = AppSettingsConstVars.DbSqlConnection,

                //判断数据库类型

                DbType = AppSettingsConstVars.DbDbType == IocDbType.MySql.ToString() ? IocDbType.MySql : IocDbType.SqlServer,

                //是否开启自动关闭数据库连接-//不设成true要手动close

                IsAutoCloseConnection = true,

            });

            //设置参数

            services.ConfigurationSugar(db =>

            {

                db.CurrentConnectionConfig.InitKeyType = InitKeyType.Attribute;

                //说明:CoreShop的程序是数据库优先,即必须先生成指定的数据库,本人更为喜欢代码优先所以进行了以下定义来实现代码优先。

                //如果指定的数据库软件中不存在指定的数据库,则自动生成该数据库。

                db.DbMaintenance.CreateDatabase();

                //通过反射操作,获取领域文件夹中的所有实体的类型实例。

                //直接获取指定项目中所有类的类型实例。

                Assembly assembly = Assembly.Load("CoreCms.Net.Model");

                //通过过滤操作,获取领域文件夹中的所有实体的类型实例。

                //注意:“Where”过滤操作中“ c.Namespace”最好使用“Contains”,而不要使用“==”

                Type[] _typeArray = assembly.GetTypes()

                    .Where(c => c.Namespace.Contains("CoreCms.Net.Model.Entities") && c.IsClass)//过滤操作。

                    .ToArray();

                //如果数据库软件对自动生成的数据库支持自动备份操作,则通过下行语句在自动生成该数据库中,根据当前项目中的实体类自动生成相应的表。

                //注意:SetStringDefaultLength(stringDefaultLength)必须定义在下行语句中,否则在自动生成表时,该约束定义将不会被映射到表的字段上。

                db.CodeFirst.SetStringDefaultLength(50).BackupTable().InitTables(_typeArray);

            });

        }

    }

}

4 CoreCms.Net.Web.Admin\appsettings.json

{

  "ConnectionStrings": {

    "DbType": "SqlServer", //数据库将支持两种模式【SqlServer,MySql

    "SqlConnection": "Server=.;uid=zz;pwd=zz;Database=CoreShop230628;MultipleActiveResultSets=true;pooling=true;min pool size=5;max pool size=32767;connect timeout=20;Encrypt=True;TrustServerCertificate=True;"

    //SqlServer数据库连接字符串,需要开启数据库连接复用【MultipleActiveResultSets=true

    // 如果采用容器化部署Service 要写成mysql的服务名,否则写地址

    //"SqlConnection": "Server=127.0.0.1;Port=3306;Database=CoreShop;Uid=CoreShop;Pwd=CoreShop;CharSet=utf8;pooling=true;SslMode=None;Allow User Variables=true;Convert Zero Datetime=True;Allow Zero Datetime=True;"

    // Mysql数据库链接字符串,请保持后面的属性别少。经过测试,mysql版本需要5.7或以上

  }

}

5 CoreCms.Net.Web.Admin\Program.cs

//把持久化的配置文件“appsettings.json”中的所有数据实例化到“AppSettingsHelper”实例中。

builder.Services.AddSingleton(new AppSettingsHelper(builder.Environment.ContentRootPath));

6 CoreCms.Net.IServices.IBaseServices<T>

7 CoreCms.Net.Services.BaseServices<T>

8 CoreCms.Net.IServices.ISysRoleServices

9 CoreCms.Net.Services.SysRoleServices

10 重构CoreCms.Net.Core.AutoFac.AutofacModuleRegister

using Autofac;

using System.Reflection;

namespace CoreCms.Net.Core.AutoFac

{

    /// <summary>

    /// 【Autofac模型注入--类】

    /// <remarks>

    /// 摘要:

    ///     通过该类中的方法成员把指定的程序集(*.dll)依赖注入到Autofac容器中。

    /// </remarks>

    /// </summary>

    public class AutofacModuleRegister : Autofac.Module

    {

        /// <param name="builder">Autofac依赖注入容器实例。</param>

        /// <summary>

        /// 【载入】

        /// <remarks>

        /// 摘要:

        ///     通过该方法把指定程序集中的所有实例依赖注入到Autofac容器中。

        /// </remarks>

        /// </summary>

        protected override void Load(ContainerBuilder builder)

        {

            //获取当前程序启动项程序集(*.dll)文件所在目录(文件夹)的绝对路径字符串(这里特指“..\bin\Debug\net7.0”)。

            var basePath = AppContext.BaseDirectory;

            #region 带有接口层的服务注入

            var servicesDllFile = Path.Combine(basePath, "CoreCms.Net.Services.dll");

            var repositoryDllFile = Path.Combine(basePath, "CoreCms.Net.Repository.dll");

            if (!(File.Exists(servicesDllFile) && File.Exists(repositoryDllFile)))

            {

                var msg = "Repository.dll和Services.dll 丢失,因为项目解耦了,所以需要先F6编译,再F5运行,请检查 bin 文件夹,并拷贝。";

                throw new Exception(msg);

            }

            // 获取 Service.dll 程序集服务,并注册

            var assemblysServices = Assembly.LoadFrom(servicesDllFile);

            //支持属性注入依赖重复

            builder.RegisterAssemblyTypes(assemblysServices).AsImplementedInterfaces().InstancePerDependency()

                .PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);

            // 获取 Repository.dll 程序集服务,并注册

            var assemblysRepository = Assembly.LoadFrom(repositoryDllFile);

            //支持属性注入依赖重复

            builder.RegisterAssemblyTypes(assemblysRepository).AsImplementedInterfaces().InstancePerDependency()

                .PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);

            #endregion

        }

    }

}

11 CoreCms.Net.Web.Admin.Controllers.SysRoleController

using Microsoft.AspNetCore.Mvc;

using System.ComponentModel;

using CoreCms.Net.IServices;

namespace CoreCms.Net.Web.Admin.Controllers

{

    [ApiController]

    [Route("[controller]/[action]")]

    public class SysRoleController : ControllerBase

    {

        #region 拷贝构造方法与变量

        private readonly ISysRoleServices _sysRoleServices;

        /// <summary>

        ///     构造函数

        /// </summary>

        public SysRoleController(ISysRoleServices sysRoleServices)

        {

            _sysRoleServices = sysRoleServices;

        }

        #endregion

        #region 获取列表============================================================

        [HttpPost]

        [Description("获取列表")]

        public async Task</*AdminUiCallBack*/ bool> GetPageList()

        {

            //获取数据

            var list = await _sysRoleServices.QueryPageAsync(null, "");

            return true;

        }

        #endregion

    }

}  

 

对以上功能更为具体实现和注释见:230728_003CoreShop230628(配置与服务)。


http://www.ppmy.cn/news/988231.html

相关文章

【学习笔记】关于图像YUV格式分类和排布方式的全学习

这里是尼德兰的喵学习笔记相关文章&#xff0c;欢迎您的访问&#xff01; 如果文章对您有所帮助&#xff0c;期待您的点赞收藏 让我们一起为芯片前端全栈工程师而努力 目录 前言 YUV格式导图 YUV444 packed planar I444 YV24 semi-planar NV24 NV42 YUV422 packed …

【沐风老师】3dMax子样条线编辑插件SubSpline使用方法详解

3dMax子样条线编辑插件SubSpline&#xff0c;是3dMax中样条曲线形状的高级子对象选择器和材质ID编辑器。 只需一个简单的切换按钮&#xff0c;即可在屏幕上轻松显示所有选定形状的顶点编号和材质ID。 利用箭头工具选择样条曲线子对象&#xff0c;以补充和扩展3dsMax的标准工具…

linux驱动学习:从上电到启动 一

1 从上电到bootloader rom boot: 初始化硬件&#xff1a;cpu上电后&#xff0c;首先从片内rom中执行指令&#xff0c;即片内boot程序 加载引导程序&#xff1a;ROM Bootloader 从可访问的存储介质&#xff08;如闪存、SD卡等&#xff09;中读取引导程序&#xff0c;并将其加载到…

《零基础入门学习Python》第071讲:GUI的终极选择:Tkinter8

虽然我们能用 tkinter 设计不少东西了&#xff0c;但是不少同学还是感觉对这个界面编程掌控得还不够多&#xff0c;说白了&#xff0c;就是我们现在还没办法随心所欲的去绘制我们想要的界面&#xff0c;但是不瞒你说&#xff0c;今天的这一节课将会给你的人生乃至人生观带来翻天…

Redis Sentinel 及 Redis Cluster

Redis Sentinel Redis-Sentinel(哨兵模式)是Redis官方推荐的高可用性(HA)解决方案&#xff0c;当用Redis做Master-slave的高可用方案时&#xff0c;假如master宕机了&#xff0c;Redis本身(包括它的很多客户端)都没有实现自动进行主备切换&#xff0c;而Redis-sentinel本身也是…

微信小程序开发每日一写--5

按钮的使用和底层逻辑的实现&#xff08;暂未成功&#xff09; WXML&#xff1a; <button class"bth1"type"primary" >按钮</button>JS&#xff1a; // index.js // 获取应用实例 //const app getApp() Page({/*bthTapHandler(e){//按钮的…

飞行动力学 - 第15节-part 1-操纵力与铰链力矩 之 基础点摘要

飞行动力学 - 第15节-part 1-操纵力与铰链力矩 之 基础点摘要 1. HOTAS全拼2. 操纵杆力&铰链力矩3. 铰链力矩4. 气动补偿&#xff08;Aerodynamic Balancing&#xff09;5. 参考资料 1. HOTAS全拼 Hands On Throttle And Stick 2. 操纵杆力&铰链力矩 操纵杆力&#…

代码随想录算法训练营第二十五天 | 读PDF复习环节3

读PDF复习环节3 本博客的内容只是做一个大概的记录&#xff0c;整个PDF看下来&#xff0c;内容上是不如代码随想录网站上的文章全面的&#xff0c;并且PDF中有些地方的描述&#xff0c;是很让我疑惑的&#xff0c;在困扰我很久后&#xff0c;无意间发现&#xff0c;其网站上的讲…