第2章 持久化初始数据到指定表

news2025/1/9 2:12:07

 004 AuthorityScopeEnum、Role、Topic、TaskInfoDto、TasksQz

       AuthorityScopeEnum:该枚举定义了6种当前程序的访问权限,前程序通过该枚举实例选定其中(NONE(-1:无任何权限)/Custom(1:自定义权限)/MyDepart(2:本部门权限)/MyDepartAndDown(3:本部门及下署部门权限)/OnlySelf(4:仅自己能够访问权限)/ALL(9:所有,即不作限制))的1/n种,为当前程序中对指定页面的访问提供必须的权限数据支撑。

       Role: 通过该实体类及其属性成员,用于实现当前程序【Blog】.【模型】.【模型集】.【角色】实体与“[Blog].[Role]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)。

       Topic:通过该实体类及其属性成员,用于实现当前程序【Blog】.【模型】.【模型集】.【主题】实体与“[Blog].[Topic]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)。

       TaskInfoDto:该实体类及其属性成员,为调度任务(/计划)的触发和执行提供数据支撑。

       TasksQz:通过该实体类及其属性成员,用于实现当前程序【Blog】.【模型】.【模型集】.【计划任务】实体与“[Blog].[TasksQz]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)。

005 DepartmentRoot <Tkey>、Department、

ModulesRoot <Tkey>、Modules、

PermissionRoot <Tkey>、Permission、

RoleModulePermissionRoot <Tkey>、RoleModulePermission、

sysUserInfoRoot <Tkey>、SysUserInfo、

UserRoleRoot <Tkey>、UserRole、

TopicDetailRoot <Tkey>、TopicDetail

       DepartmentRoot<Tkey>:该根部门类定义上1级部门实体整型编号值和整型编号值集。

Department:继承了DepartmentRoot<Tkey>,通过该实体类及其属性成员,用于实现当前程序【Blog】.【模型】.【模型集】.【部门】实体与“[Blog].[Department]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)。

       ModulesRoot<Tkey>:该根Api控制器行为方法类定义上1级Api控制器行为方法实体整型编号值。

Modules:继承了ModulesRoot<Tkey>,通过该实体类及其属性成员,用于实现当前程序【Blog】.【模型】.【模型集】.【Api控制器行为方法】实体与“[Blog].[Modules]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)。

       PermissionRoot<Tkey>:该根权限类定义上1级权限实体整型编号值和整型编号值集。

Permission:继承了PermissionRoot<Tkey>,通过该实体类及其属性成员,用于实现当前程序【Blog】.【模型】.【模型集】.【权限】实体与“[Blog].[Permission ]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)。

RoleModulePermissionRoot<Tkey>:该根角色/Api控制器行为方法/权限类定义了角色(Role)/Api控制器行为方法(Modules)/权限(Permission)3者实例之间的导航映射关系。

    RoleModulePermission:继承了RoleModulePermissionRoot<Tkey>,通过该实体类及其属性成员,用于实现当前程序【Blog】.【模型】.【模型集】.【角色/Api控制器行为方法/权限】实体与“[Blog].[RoleModulePermission]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)。

       SysUserInfoRoot<Tkey>:该根用户信息类定义了列表实例,该列表实例存储着1个指用户信息实例所对应所有角色的整型编号集。

SysUserInfo:继承了SysUserInfoRoot<Tkey>,通过该实体类及其属性成员,用于实现当前程序【Blog】.【模型】.【模型集】.【用户信息】实体与“[Blog].[SysUserInfo]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)。

    UserRoleRoot<Tkey>:该根用户/角色映射类用于构建用户信息(SysUserInfoRoot)实体与角色(Role)实体实例之间n:n的导航映射关系。

UserRole:继承了UserRoleRoot<Tkey>,通过该实体类及其属性成员,用于实现当前程序【Blog】.【模型】.【模型集】.【用户/角色映射】实体与“[Blog]用户/角色映射.[UserRole]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)。

    TopicDetailRoot<Tkey>:该根主题详情类用于定义的指定主题详情实例的上1级主题详情实例整型编号值。

TopicDetail:继承了TopicDetailRoot<Tkey>,通过该实体类及其属性成员,用于实现当前程序【Blog】.【模型】.【模型集】.【主题详情】实体与“[Blog].[TopicDetail]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)。

注意:关于根类

我不知道“老张的哲学”通过该方式来定义实体除了炫技和程序的可读性变差之外,是否还有其它的好处,反正本人不建议使用该种定义方式来定义实体。

1 重构DBSeed类

using Common.DB;

using Common.Helper;

using Common.Helper.Console;

using Model.Models;

using System.Reflection;

using System.Text;

//Nuget--Microsoft.Extensions.Configuration.Json

using Newtonsoft.Json;

//Nuget--Magicodes.IE.Excel

using Magicodes.ExporterAndImporter.Excel;

namespace Common.Seed

{

    /// <summary>

    /// 【数据库发送类--类】

    /// <remarks>

    /// 摘要:

    ///    该类用于在Code-Frist模式下,在指定的数据库软件中自动生成指定的数据库及其表,同时把指定文件中的初始化数据持久化到相应的表中。

    /// </remarks>

    /// </summary>

    public class DBSeed

    {

        #region 变量--私有/保护

        /// <summary>

        /// 【发送数据文件】

        /// <remarks>

        /// 摘要:

        ///     该变量用于从“wwwroot/BlogCore.Data.json”文件夹中的1个指定文件中获取1个指定实体的所有初始化实例,并把这些实例持久化到指定的表中。

        /// </remarks>

        /// </summary>

        private static string SeedDataFolder = "BlogCore.Data.json/{0}.tsv";

        #endregion

        #region 方法--静态

        /// <param name="myContext">指示是否关闭数据库连接, 默认值:true,即自动释放数据库,如果存在事务,在事务结束后释放,而无需使用using块或者Close内置方法定义释放操作。</param>

        /// <param name="WebRootPath">“wwwroot”目录的绝对路径。</param>

        /// <summary>

        /// 【异步发送】

        /// </summary>

        /// <remarks>

        /// 摘要:

        ///      “Code-First”模式下,通过该方法把在自动指定的数据库及其表后,把文件中数据持久化到对应的表中。

        /// </remarks>

        public static async Task SeedAsync(MyContext myContext, string WebRootPath)

        {

            try

            {

                //注意:在.Net项目的api模板中,默认是不包含“wwwroot”文件夹的,这需要开发者自己在api项目新建“wwwroot”文件夹。

                if (string.IsNullOrEmpty(WebRootPath))

                {

                    throw new Exception("获取wwwroot路径时,异常!");

                }

                //拼接出“wwwroot/BlogCore.Data.json”文件夹的绝对路径。

                SeedDataFolder = Path.Combine(WebRootPath, SeedDataFolder);

                Console.WriteLine("************ Blog.Core DataBase Set *****************");

                Console.WriteLine($"Is multi-DataBase: {AppSettings.app(new string[] { "MutiDBEnabled" })}");

                Console.WriteLine($"Is CQRS: {AppSettings.app(new string[] { "CQRSEnabled" })}");

                Console.WriteLine();

                Console.WriteLine($"Master DB ConId: {MyContext.ConnId}");

                Console.WriteLine($"Master DB Type: {MyContext.DbType}");

                Console.WriteLine($"Master DB ConnectString: {MyContext.ConnectionString}");

                Console.WriteLine();

                if (AppSettings.app(new string[] { "MutiDBEnabled" }).ObjToBool())

                {

                    var slaveIndex = 0;

                    BaseDBConfig.MutiConnectionString.allDbs.Where(x => x.ConnId != MainDb.CurrentDbConnId).ToList().ForEach(m =>

                    {

                        slaveIndex++;

                        Console.WriteLine($"Slave{slaveIndex} DB ID: {m.ConnId}");

                        Console.WriteLine($"Slave{slaveIndex} DB Type: {m.DbType}");

                        Console.WriteLine($"Slave{slaveIndex} DB ConnectString: {m.Connection}");

                        Console.WriteLine($"--------------------------------------");

                    });

                }

                else if (AppSettings.app(new string[] { "CQRSEnabled" }).ObjToBool())

                {

                    var slaveIndex = 0;

                    BaseDBConfig.MutiConnectionString.slaveDbs.Where(x => x.ConnId != MainDb.CurrentDbConnId).ToList().ForEach(m =>

                    {

                        slaveIndex++;

                        Console.WriteLine($"Slave{slaveIndex} DB ID: {m.ConnId}");

                        Console.WriteLine($"Slave{slaveIndex} DB Type: {m.DbType}");

                        Console.WriteLine($"Slave{slaveIndex} DB ConnectString: {m.Connection}");

                        Console.WriteLine($"--------------------------------------");

                    });

                }

                else

                {

                }

                Console.WriteLine();

                // 创建数据库

                Console.WriteLine($"Code-Frist模式下,自动生成指定的数据库(数据库:{MyContext.ConnId})...");

               //在指定的数据库软件中自动生成指定数据库。

                if (MyContext.DbType != SqlSugar.DbType.Oracle)

                {

                    myContext.Db.DbMaintenance.CreateDatabase();

                    ConsoleHelper.WriteSuccessLine($"Code-Frist模式下,已经在指定的数据库软件中自动生成指定的数据库!");

                }

                else

                {

                    //Oracle 数据库不支持该操作

                    ConsoleHelper.WriteSuccessLine($"Oracle 数据库不支持该操作,可手动创建Oracle数据库!");

                }

                // 创建数据库表,遍历指定命名空间下的class

                Console.WriteLine("Code-Frist模式下,开始在指定数据库中自动生成所有实体所对应的表...");

                //在指定的数据库软件中自动生成指定数据库。

                var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;

                //通过反射方式,获取当前程序中所有实体的类型实例,为自动生成相应的表提供数据支撑。

                var referencedAssemblies = Directory.GetFiles(path, "Model.dll").Select(Assembly.LoadFrom).ToArray();

                var modelTypes = referencedAssemblies

                    .SelectMany(a => a.DefinedTypes)

                    .Select(type => type.AsType())

                    .Where(x => x.IsClass && x.Namespace != null && x.Namespace.Equals("Model.Models")).ToList();

                modelTypes.ForEach(t =>

                {

                    // 这里只支持添加表,不支持删除

                    // 如果想要删除,数据库直接右键删除,或者联系SqlSugar作者;

                    if (!myContext.Db.DbMaintenance.IsAnyTable(t.Name))

                    {

                        Console.WriteLine(t.Name);

                        myContext.Db.CodeFirst.InitTables(t);

                    }

                });

                ConsoleHelper.WriteSuccessLine($"Code-Frist模式下,在指定数据库中已经自动生成了所有实体所对应的表!");

                Console.WriteLine();

                if (AppSettings.app(new string[] { "AppSettings", "SeedDBDataEnabled" }).ObjToBool())

                {

                    JsonSerializerSettings setting = new JsonSerializerSettings();

                    JsonConvert.DefaultSettings = new Func<JsonSerializerSettings>(() =>

                    {

                        //日期类型默认格式化处理

                        setting.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat;

                        setting.DateFormatString = "yyyy-MM-dd HH:mm:ss";

                        //空值处理

                        setting.NullValueHandling = NullValueHandling.Ignore;

                        //高级用法九中的Bool类型转换 设置

                        //setting.Converters.Add(new BoolConvert(","));

                        return setting;

                    });

                    Console.WriteLine($"Code-Frist模式下,把指定文件中的实例数据持久化到指定的表中 (数据库:{MyContext.ConnId})...");

                    //获取“Magicodes.IE.Excel”中间件实例。

                    var importer = new ExcelImporter();

                    #region 初始化数据持久化到指定表中

                    //把指定文件(wwwroot\BlogCore.Data.json\BlogArticle.tsv)中博客文章实体的所有实例,持久化到博客文章表中。

                    if (!await myContext.Db.Queryable<BlogArticle>().AnyAsync())

                    {

                        myContext.GetEntityDB<BlogArticle>().InsertRange(JsonHelper.ParseFormByJson<List<BlogArticle>>(FileHelper.ReadFile(string.Format(SeedDataFolder, "BlogArticle"), Encoding.UTF8)));

                        ConsoleHelper.WriteSuccessLine($"Code-Frist模式下,已经成功把博客文章(BlogArticle)实体的所有实例持久的化到了博客文章[BlogArticle]表中。");

                    }

                    else

                    {

                        ConsoleHelper.WriteWarningLine("Code-Frist模式下,指定数据库中已经存在博客文章[BlogArticle]表,已经无法把博客文章(BlogArticle)实体的所有实例持久化到博客文章[BlogArticle]表中!");

                    }

                    //把指定文件(wwwroot\BlogCore.Data.excel\Role.xlsx)中角色实体的所有实例,持久化到角色表中。

                    if (!await myContext.Db.Queryable<Role>().AnyAsync())

                    {

                        using var stream = new FileStream(Path.Combine(WebRootPath, "BlogCore.Data.excel", "Role.xlsx"), FileMode.Open);

                        var result = await importer.Import<Role>(stream);

                        var data = result.Data.ToList();

                        myContext.GetEntityDB<Role>().InsertRange(data);

                        ConsoleHelper.WriteSuccessLine($"Code-Frist模式下,已经成功把角色(Role)的所有实例持久的化到了角色[Role]表中。");

                    }

                    else

                    {

                        ConsoleHelper.WriteWarningLine("Code-Frist模式下,指定数据库中已经存在角色[Role]表,已经无法把角色(Role)实体的所有实例持久化到角色[Role]表中!");

                    }

                    //把指定文件(wwwroot\BlogCore.Data.json\TasksQz.tsv)中计划(/调度)任务实体的所有实例,持久化到计划(/调度)任务表中。

                    if (!await myContext.Db.Queryable<TasksQz>().AnyAsync())

                    {

                        var data = JsonConvert.DeserializeObject<List<TasksQz>>(FileHelper.ReadFile(string.Format(SeedDataFolder, "TasksQz"), Encoding.UTF8), setting);

                        myContext.GetEntityDB<TasksQz>().InsertRange(data);

                        ConsoleHelper.WriteSuccessLine($"Code-Frist模式下,已经成功把计划(/调度)任务(TasksQz)实体的所有实例持久的化到了计划(/调度)任务[TasksQz]表中。");

                    }

                    else

                    {

                        ConsoleHelper.WriteWarningLine("Code-Frist模式下,指定数据库中已经存在计划(/调度)任务[TasksQz]表,已经无法把计划(/调度)任务(TasksQz)实体的所有实例持久化到计划(/调度)任务[TasksQz]表中!");

                    }

                    //把指定文件(wwwroot\BlogCore.Data.json\Topic.tsv)中主题实体的所有实例,持久化到主题表中。

                    if (!await myContext.Db.Queryable<Topic>().AnyAsync())

                    {

                        var data = JsonConvert.DeserializeObject<List<Topic>>(FileHelper.ReadFile(string.Format(SeedDataFolder, "Topic"), Encoding.UTF8), setting);

                        myContext.GetEntityDB<Topic>().InsertRange(data);

                        ConsoleHelper.WriteSuccessLine($"Code-Frist模式下,已经成功把主题(Topic)实体的所有实例持久的化到了主题[Topic]表中。");

                    }

                    else

                    {

                        ConsoleHelper.WriteWarningLine("Code-Frist模式下,指定数据库中已经存在主题[Topic]表,已经无法把主题(Topic)实体的所有实例持久化到主题[Topic]表中!");

                    }

                    //把指定文件(wwwroot\BlogCore.Data.json\TopicDetail.tsv)中主题详情实体的所有实例,持久化到主题详情表中。

                    if (!await myContext.Db.Queryable<TopicDetail>().AnyAsync())

                    {

                        var data = JsonConvert.DeserializeObject<List<TopicDetail>>(FileHelper.ReadFile(string.Format(SeedDataFolder, "TopicDetail"), Encoding.UTF8), setting);

                        myContext.GetEntityDB<TopicDetail>().InsertRange(data);

                        ConsoleHelper.WriteSuccessLine($"Code-Frist模式下,已经成功把主题详情(TopicDetail)实体的所有实例持久的化到了主题详情[TopicDetail]表中。");

                    }

                    else

                    {

                        ConsoleHelper.WriteWarningLine("Code-Frist模式下,指定数据库中已经存在主题详情[TopicDetail]表,已经无法把主题详情(TopicDetail)实体的所有实例持久化到主题详情[TopicDetail]表中!");

                    }

                    //把指定文件(wwwroot\BlogCore.Data.json\Department.tsv)中部门实体的所有实例,持久化到部门表中。

                    if (!await myContext.Db.Queryable<Department>().AnyAsync())

                    {

                        var data = JsonConvert.DeserializeObject<List<Department>>(FileHelper.ReadFile(string.Format(SeedDataFolder, "Department"), Encoding.UTF8), setting);

                        myContext.GetEntityDB<Department>().InsertRange(data);

                        ConsoleHelper.WriteSuccessLine($"Code-Frist模式下,已经成功把部门(Department)实体的所有实例持久的化到了部门[Department]表中。");

                    }

                    else

                    {

                        ConsoleHelper.WriteWarningLine("Code-Frist模式下,指定数据库中已经存在部门[Department]表,已经无法把部门(Department)实体的所有实例持久化到部门[Department]表中!");

                    }

                    //把指定文件(wwwroot\BlogCore.Data.json\Modules.tsv)Api控制器行为方法实体的所有实例,持久化到Api控制器行为方法表中。

                    if (!await myContext.Db.Queryable<Modules>().AnyAsync())

                    {

                        var data = JsonConvert.DeserializeObject<List<Modules>>(FileHelper.ReadFile(string.Format(SeedDataFolder, "Modules"), Encoding.UTF8), setting);

                        myContext.GetEntityDB<Modules>().InsertRange(data);

                        ConsoleHelper.WriteSuccessLine($"Code-Frist模式下,已经成功把Api控制器行为方法(Modules)实体的所有实例持久的化到了Api控制器行为方法[Modules]表中。");

                    }

                    else

                    {

                        ConsoleHelper.WriteWarningLine("Code-Frist模式下,指定数据库中已经存在Api控制器行为方法[Modules]表,已经无法把Api控制器行为方法(Modules)实体的所有实例持久化到Api控制器行为方法[Modules]表中!");

                    }

                    //把指定文件(wwwroot\BlogCore.Data.json\Permission.tsv)中权限实体的所有实例,持久化到权限表中。

                    if (!await myContext.Db.Queryable<Permission>().AnyAsync())

                    {

                        var data = JsonConvert.DeserializeObject<List<Permission>>(FileHelper.ReadFile(string.Format(SeedDataFolder, "Permission"), Encoding.UTF8), setting);

                        myContext.GetEntityDB<Permission>().InsertRange(data);

                        ConsoleHelper.WriteSuccessLine($"Code-Frist模式下,已经成功把权限(ermission)实体的所有实例持久的化到了权限[Modules]表中。");

                    }

                    else

                    {

                        ConsoleHelper.WriteWarningLine("Code-Frist模式下,指定数据库中已经存在权限[Permission]表,已经无法把权限(Permission)实体的所有实例持久化权限[Permission]表中!");

                    }

                    //把指定文件(wwwroot\BlogCore.Data.json\RoleModulePermission.tsv)中角色/Api控制器行为方法/权限实体的所有实例,持久化到角色/Api控制器行为方法/权限表中。

                    if (!await myContext.Db.Queryable<RoleModulePermission>().AnyAsync())

                    {

                        var data = JsonConvert.DeserializeObject<List<RoleModulePermission>>(FileHelper.ReadFile(string.Format(SeedDataFolder, "RoleModulePermission"), Encoding.UTF8), setting);

                        myContext.GetEntityDB<RoleModulePermission>().InsertRange(data);

                        ConsoleHelper.WriteSuccessLine($"Code-Frist模式下,已经成功把角色/Api控制器行为方法/权限(RoleModulePermission)实体的所有实例持久的化到了角色/Api控制器行为方法/权限[RoleModulePermission]表中。");

                    }

                    else

                    {

                        ConsoleHelper.WriteWarningLine("Code-Frist模式下,指定数据库中已经存在角色/Api控制器行为方法/权限[RoleModulePermission]表,已经无法把角色/Api控制器行为方法/权限(RoleModulePermission)实体的所有实例持久化到角色/Api控制器行为方法/权限RoleModulePermission]表中!");

                    }

                    //把指定文件(wwwroot\BlogCore.Data.json\SysUserInfo.xlsx)中用户信息实体的所有实例,持久化到用户信息表中。

                    if (!await myContext.Db.Queryable<SysUserInfo>().AnyAsync())

                    {

                        using var stream = new FileStream(Path.Combine(WebRootPath, "BlogCore.Data.excel", "SysUserInfo.xlsx"), FileMode.Open);

                        var result = await importer.Import<SysUserInfo>(stream);

                        var data = result.Data.ToList();

                        myContext.GetEntityDB<SysUserInfo>().InsertRange(data);

                        ConsoleHelper.WriteSuccessLine($"Code-Frist模式下,已经成功把用户信息(SysUserInfo)实体的所有实例持久的化到了用户信息[SysUserInfo]表中。");

                    }

                    else

                    {

                        ConsoleHelper.WriteWarningLine("Code-Frist模式下,指定数据库中已经存在用户信息[SysUserInfo]表中,已经无法把用户信息(SysUserInfo)实体的所有实例持久化到用户信息[SysUserInfo]表中!");

                    }

                    //把指定文件(wwwroot\BlogCore.Data.json\UserRole.xlsx)中用户/角色映射实体的所有实例,持久化到用户/角色映射表中。

                    if (!await myContext.Db.Queryable<UserRole>().AnyAsync())

                    {

                        using var stream = new FileStream(Path.Combine(WebRootPath, "BlogCore.Data.excel", "UserRole.xlsx"), FileMode.Open);

                        var result = await importer.Import<UserRole>(stream);

                        var data = result.Data.ToList();

                        myContext.GetEntityDB<UserRole>().InsertRange(data);

                        ConsoleHelper.WriteSuccessLine($"Code-Frist模式下,已经成功把用户/角色映射UserRole)实体的所有实例持久的化到了用户/角色映射[UserRole]表中。");

                    }

                    else

                    {

                        ConsoleHelper.WriteWarningLine("Code-Frist模式下,指定数据库中已经存在用户/角色映射[UserRole]表中,已经无法把用户/角色映射(UserRole)实体的所有实例持久化到用户/角色映射[SysUserInfo]表中!");

                    }

                    #endregion

                    ConsoleHelper.WriteSuccessLine($"Code-Frist模式下,已经成功把所有文件中的数据持久化到指定的表中。");

                }

                Console.WriteLine();

            }

            catch (Exception ex)

            {

                throw new Exception(

                    $"1、若是Mysql,查看常见问题:https://github.com/anjoy8/Blog.Core/issues/148#issue-776281770 \n" +

                    $"2、若是Oracle,查看常见问题:https://github.com/anjoy8/Blog.Core/issues/148#issuecomment-752340231 \n" +

                    "3、其他错误:" + ex.Message);

            }

        }

        #endregion

    }

}

2 关于.Net7日志控制台的显示:

    在Visual Studio更新到.Net7后,使用“IISExpress”方式调试程序,则会导致日志控制台不被显示,只有使用“https”方式调试程序,才会显示日志控制台。如下图所示:

 对以上功能更为具体实现和注释见:221120_02Blog(持久化初始数据到指定表)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/21754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Typescript:(一)基本使用

TypeScript 定义&#xff1a;Typescript是拥有类型的JavaScript超集 它可以编译成普通&#xff0c;干净&#xff0c;完整的JavaScript代码 我们可以将TypeScript理解成加强版的JavaScript。 JavaScript所拥有的特性&#xff0c;TypeScript全部都是支持的&#xff0c;并且它紧…

Linux系统挂载命令mount(U盘、移动硬盘、光盘)

Linux系统不像windows系统可以自动识别加载新设备&#xff0c;Linux系统需要手动识别&#xff0c;手动加载。Linux中一切皆文件。文件通过一个很大的文件树来组织&#xff0c;文件树的根目录是&#xff1a;/&#xff0c;从根目开始录逐级展开。这些文件通过若干设备铺展开。 命…

BCG 对话框表格控件CBCGPGridCtrl显示子

1、1、MFC窗口中拖放Picture Control 2、 void CSimpleGridSampleDlg::_FillGrid() { CWaitCursor wait; // Create grid tree: CRect rectClient; GetClientRect(rectClient); m_wndGrid.Create(WS_CHILD | WS_VISIBLE, rectClient, this, ID_GRID); m_wndGri…

SAR回波的多普勒特性

专栏目录链接: SAR成像专栏目录 今天我们来看看SAR回波的多普勒特性。 首先推导下正侧视下SAR回波的多普勒频率公式,前提条件: 正侧视不考虑平台运动的不稳定性忽略地球曲率忽略地球自转的影响 根据多普勒效应原理可得SAR回波的多普勒频率(可以回顾下:《雷达导论PART IV.…

C++之二叉搜索树详解

文章目录前言一、二叉搜索树的概念二、二叉搜索树的操作1.节点类2.二叉搜索树类内部定义3.遍历操作4.构造函数5.拷贝构造函数6.赋值运算符重载7.析构函数8.插入函数非递归实现递归实现9.删除函数非递归实现递归实现10.查找函数非递归实现递归实现三、二叉搜索树的应用K模型KV模…

索引和事务

文章目录 1.索引的含义以及应用 2.索引的查看、创建 3.带主键的索引底层结构 4.事务的含义 5.事务的特性 6.JDBC 一.索引的含义及应用 1.索引我们可以认为是文章的目录&#xff0c;有了它&#xff0c;我们可以更加快速的 查看到我们想要查找的内容。 2.并不是说我们加了索引&…

一周侃 | 周末随笔及推荐

前言 每周一次的闲聊胡侃又来啦&#xff01;这一周世界发生了许多大事&#xff0c;从举世瞩目的中美元首会晤到新的防疫政策二十条出来之后各地防疫政策的转变&#xff0c;再到俄乌冲突持续进行&#xff0c;联大通过俄罗斯赔偿计划……百年未有之大变局正加速演进&#xff0c;…

【k8s】8、service详解

文章目录一、Service详解1、Service介绍1.1 userspace模式1.2 iptables 模式1.3 ipvs模式2、Service类型3、Service使用3.1 实现环境准备3.2 Cluster类型的Service3.2.1 cluster类型的生成ip3.2.2 cluster类型不生成ip3.3 NodePort类型的service3.4 LoadBalancer类型的Service3…

【MySQL】MySQL体系结构与内部组件工作原理解析(原理篇)(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

GEE两行代码下载任意范围影像python API

GEE三行代码下载任意范围影像 前不久&#xff0c;吴秋生博士更新了geemap&#xff0c;现在能更方便地下载影像了最新的下载再也不受有限的Google Drive、图像过大会自动分割、缓慢的下载速度影响了。 有兴趣的同学可以see this: https://geemap.org/notebooks/118_download_i…

蓝牙传输 LE Audio技术

蓝牙 蓝牙(Bluetooth)技术&#xff0c;实际上是一种短距离无线电技术&#xff0c;利用"蓝牙"技术&#xff0c;能够有效地简化掌上电脑、笔记本电脑和移动电话手机等移动通信终端设备之间的通信&#xff0c;也能够成功地简化以上这些设备与因特网Internet之间的通信&…

react(受控组件、生命周期、使用脚手架)

目录 使用脚手架 其他&#xff1a; 学习js: mdn 文档 MDN Web Docs 在react官方文档的 CDN 链接里下载最新的react版本react官网&#xff1a;React 官方中文文档 – 用于构建用户界面的 JavaScript 库 BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务 1. 受控组件…

ES6 入门教程 15 Proxy 15.3 Proxy.revocable() 15.4 this 问题 15.5 实例:Web 服务的客户端

ES6 入门教程 ECMAScript 6 入门 作者&#xff1a;阮一峰 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录ES6 入门教程15 Proxy15.3 Proxy.revocable()15.4 this 问题15.5 实例&#xff1a;Web 服务的客户端15 Proxy 15.3 Proxy.revocable() …

BLDC的列子2

1.三相采样电流的采集以u相为举例。 采集下桥臂I-V的电压。在除以采样电阻。就可以得到采样电流。但由于I-V的电压比较小。 需要一个放大电路把电压放大ADC才采集的到。 放大后的电压是AMP_IU.用ADC去采集这个电压。从而算出I_V的电压。 在电机停止的时候也会有微小的电压。…

Azure 深入浅出[2] --- App Service的部署并查看应用Log

假设读者已经申请了Azure的免费订阅的账户。如果想部署一个前端NodeJS的服务到Azure的App Service应该如何部署并查看应用程序本身的日志呢&#xff1f;笔者在这边文章就带大家快速看一下。 1.环境准备 安装Visual Studio Code以及在Visual Studio Code里面安装Azure App Ser…

文件上传漏洞 | iwebsec

文章目录靶场搭建文件上传漏洞前端JS过滤绕过文件名过滤绕过Content-Type过滤绕过文件头过滤绕过.htaccess文件上传文件截断上传条件竞争文件上传靶场搭建 参考文章https://juejin.cn/post/7068931744547733517出现个小问题&#xff0c;我的端口冲突了&#xff0c;所以换了一个…

Linux-unbuntu修改apt源

本文介绍如何将ubuntu的apt源修改为清华大学的镜像源 主要是修改/etc/apt/source.list的文件&#xff0c;并且使用sudo apt-get update来刷新源 修改apt源 unbuntu安装好之后&#xff0c;apt的源是us的&#xff0c;这样下载速度比较慢 apt源的地址放在/etc/apt/source.list中…

SpringBoot SpringBoot 开发实用篇 4 数据层解决方案 4.14 ES 索引操作

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇4 数据层解决方案4.14 ES 索引操作4.14.1 索引操作4.14.2 小结4 数据…

m基于OFDM数字电视地面广播系统中频域同步技术研究

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 OFDM技术的基本构架如下所示&#xff1a; 注意系统中的虚线部分就是你要做的OFDM的频域同步模块。我们的MATLAB代码就是参考这个系统结构进行设计的。其中虚线就是本课题要做的代码部分…

[附源码]java毕业设计停车场管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…