甘特图控件DHTMLX Gantt入门使用教程【引入】:dhtmlxGantt与ASP.NET Core(上)

news2024/12/28 23:46:05

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求,具备完善的甘特图图表库,功能强大,价格便宜,提供丰富而灵活的JavaScript API接口,与各种服务器端技术(PHP,http://ASP.NET,Java等)简单集成,满足多种定制开发需求。

DHTMLX JavaScript UI 库所开发的 JavaScript 组件易于使用且功能丰富,非常适合任何领域和任何复杂性的解决方案,能够节省创建和维护业务应用程序的时间,提高生产力。

DHTMLX Gantt官方最新版免费下载试用icon-default.png?t=N2N8https://link.zhihu.com/?target=https%3A//www.evget.com/product/4213/download

本教程将逐步指导你如何用http://ASP.NET Core在服务器端创建甘特图。

第一步 创建一个项目

启动Visual Studio 2022并创建一个新的项目。选择: 创建一个新的项目。

接下来选择 "ASP.NET Core Web App "并命名为DHX.Gantt。

自此,你已经创建了一个项目,可以继续为甘特图添加标记和脚本。

第二步 添加甘特图标记和JS

进入wwwroot并创建一个index.html文件。

在新创建的文件中,为甘特图制作一个简单的页面。

请注意,甘特图文件是在此演示中从 CDN 添加的。如果您有该组件的专业版本, 您需要手动将甘特图文件添加到项目中。

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
<link href=" https://cdn.dhtmlx.com/gantt/edge/dhtmlxgantt.css"
rel="stylesheet" type="text/css" />
<script src=" https://cdn.dhtmlx.com/gantt/edge/dhtmlxgantt.js"></script>
<script>
document.addEventListener("DOMContentLoaded", function(event) {
// specifying the date format
gantt.config.date_format = "%Y-%m-%d %H:%i";
// initializing gantt
gantt.init("gantt_here");

// initiating data loading
gantt.load("/api/data");
// initializing dataProcessor
var dp = new gantt.dataProcessor("/api/");
// and attaching it to gantt
dp.init(gantt);
// setting the REST mode for dataProcessor
dp.setTransactionMode("REST");
});
</script>
</head>
<body>
<div id="gantt_here" style="width: 100%; height: 100vh;"></div>
</body>
</html>

当页面被加载时,除了初始化甘特图的数据加载外,还立即调用dataProcessor,所以用户对甘特图的所有修改都将被保存到后台。后台还没有实现,所以以后会更有意义。


接下来进入Program.cs,告诉应用程序使用index.html页面。为了做到这一点,你需要将应用程序配置为从wwwroot文件夹中提供静态文件。为此,你需要添加app.UseDefaultFiles()方法。你可以在这里找到更多细节。

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days.
// You may want to change this for production scenarios,
// see  https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}

app.UseHttpsRedirection();

app.UseDefaultFiles();

app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

该方法允许提供默认文件。它将搜索wwwroot文件夹中的以下文件:app.UseDefaultFiles()

  • index.html
  • index.htm
  • default.html
  • default.htm

因此,你可以选择其中的任何一个,而在本教程中使用的是 "index.html"。只是一个URL-rewriter,并不实际提供文件。为此,你还需要添加文件。UseDefaultFiles()UseStaticFiles()

一旦你完成了它,当你运行应用程序时,一个空的甘特图就会出现在页面上。注意,右上角的 "无效数据 "标签显示,因为因为仍然没有合适的后台来提供数据,所以被调用。当控制器实现后,gantt将能够显示任务和链接。gantt.load()

现在基本部分已经完成,是时候实现后端了。让我们从实现模型类开始,之后再进行WebAPI控制器。

第三步 创建模型和数据库

让我们从数据模型开始。甘特的数据模型包括链接和任务,从.NET世界的角度来看,dhtmlxGantt对模型属性使用非常规的名称。有时客户端的模型也包含一些客户端或后端逻辑的属性,但这些属性不应该存储在数据库中。

为了处理这个问题,将使用数据传输对象(DTO)模式。两种模型将被定义:

  • 领域模型类,它将被用于EF Core和应用程序内部
  • DTO类,将用于与Web API进行通信。

然后,需要实现这两种模型之间的映射。

模型
在项目文件夹中创建一个名为Models的新文件夹。这是实现模型类和 EF 上下文的位置。

任务模型
首先,为任务创建一个类。在Models文件夹中创建一个文件,命名为Task.cs。这可以通过调用Models文件夹的上下文菜单并选择Add->Class来完成。

这个模型必须是这样的:

namespace DHX.Gantt.Models
{
public class Task
{
public int Id { get; set; }
public string? Text { get; set; }
public DateTime StartDate { get; set; }
public int Duration { get; set; }
public decimal Progress { get; set; }
public int? ParentId { get; set; }
public string? Type { get; set; }
}
}

你可以查询任务对象的所有属性列表。

链接模型
再添加一个文件,为链接创建一个类:

namespace DHX.Gantt.Models
{
public class Link
{
public int Id { get; set; }
public string? Type { get; set; }
public int SourceTaskId { get; set; }
public int TargetTaskId { get; set; }
}
}

模型已经准备好了,你可以开始配置数据库连接。
为了配置数据库连接,你需要采取下面列出的步骤:

安装Entity Framework Core
Entity Framework Core将被用来管理应用程序与数据库的通信。让我们来安装该框架:

  • 在项目树中找到DHTMLX.Gantt的依赖项
  • 调用上下文菜单并选择管理NuGet包
  • 打开浏览标签并安装Microsoft.EntityFrameworkCore.SqlServer, Microsoft.EntityFrameworkCore和Microsoft.EntityFrameworkCore.Design

或者使用软件包管理器命令行:

PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer
PM> Install-Package Microsoft.EntityFrameworkCore
PM> Install-Package Microsoft.EntityFrameworkCore.Design

实体框架核心将用来管理应用程序与数据库的通信。

创建实体上下文
接下来你需要定义一个与数据库的会话,并启用加载和保存数据。为此,创建Context:

  • 在Models文件夹中添加GanttContext.cs文件
  • 在创建的文件中定义GanttContext类
using Microsoft.EntityFrameworkCore;

namespace DHX.Gantt.Models
{
public class GanttContext : DbContext
{
public GanttContext(DbContextOptions<GanttContext> options)
: base(options)
{
}
public DbSet<Task> Tasks { get; set; } = null;
public DbSet<Link> Links { get; set; } = null;

}
}

向数据库添加第一批记录
现在你可以向数据库添加记录了。让我们创建数据库初始化器,将任务填充到数据库中。在Models文件夹中定义一个类,并将其称为GanttSeeder。该类将有Seed()方法,将添加任务和链接到数据库。

using Microsoft.EntityFrameworkCore;

namespace DHX.Gantt.Models
{
public static class GanttSeeder
{
public static void Seed(GanttContext context)
{
if (context.Tasks.Any())
{
return; // DB has been seeded
}

using (var transaction = context.Database.BeginTransaction())
{
List<Task> tasks = new List<Task>()
{
new Task()
{
Id = 1,
Text = "Project #2",
StartDate = DateTime.Today.AddDays(-3),
Duration = 18,
Progress = 0.4m,
ParentId = null
},
new Task()
{
Id = 2,
Text = "Task #1",
StartDate = DateTime.Today.AddDays(-2),
Duration = 8,
Progress = 0.6m,
ParentId = 1
},
new Task()
{
Id = 3,
Text = "Task #2",
StartDate = DateTime.Today.AddDays(-1),
Duration = 8,
Progress = 0.6m,
ParentId = 1
}
};

tasks.ForEach(s => context.Tasks.Add(s));
context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT Tasks ON;");
context.SaveChanges();

context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT Tasks OFF;");
List<Link> links = new List<Link>()
{
new Link() {Id = 1, SourceTaskId = 1, TargetTaskId = 2, Type = "1"},
new Link() {Id = 2, SourceTaskId = 2, TargetTaskId = 3, Type = "0"}
};

links.ForEach(s => context.Links.Add(s));
context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT Links ON;");
context.SaveChanges();
context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT Links OFF;");
transaction.Commit();
}
}
}
}

注册数据库
现在你应该在Program.cs中注册数据库。但首先你需要一个连接字符串。它将被存储在应用程序设置的JSON文件中。创建appsettings.json文件(如果你已经有了,则打开它),并为数据库添加一个连接字符串:

{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;
Database=GanttDatabase;Trusted_Connection=True;"
}
}

数据库上下文将通过依赖关系注入进行注册。
将以下命名空间添加到 Program.cs:

using Microsoft.EntityFrameworkCore;
using DHX.Gantt.Models;

该声明将看起来像这样:

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<GanttContext>(
options => options.UseSqlServer(connectionString));

要启用控制器,需要调用services.AddControllers()方法:

builder.Services.AddControllers();

然后我们调用app.MapControllers()来注册我们的控制器路线:

app.MapControllers();

下面是Program.cs的完整代码:

using Microsoft.EntityFrameworkCore;
using DHX.Gantt.Models;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<GanttContext>(
options => options.UseSqlServer(connectionString));

builder.Services.AddControllers();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days.
// You may want to change this for production scenarios,
// see  https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}

app.UseHttpsRedirection();

app.UseDefaultFiles();

app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.MapControllers();

app.Run();

最后,你需要在应用启动时初始化和播种数据库。通常情况下,你会希望使用迁移来完成这个任务,但为了简单起见,这里没有使用迁移。

让我们首先创建一个初始化的类。在Models文件夹中创建GanttInitializerExtension.cs文件:

namespace DHX.Gantt.Models
{
public static class GanttInitializerExtension
{
public static IHost InitializeDatabase(this IHost webHost)
{
var serviceScopeFactory =
(IServiceScopeFactory?)webHost.Services.GetService(typeof(IServiceScopeFactory));

using (var scope = serviceScopeFactory!.CreateScope())
{
var services = scope.ServiceProvider;
var dbContext = services.GetRequiredService<GanttContext>();
dbContext.Database.EnsureDeleted();
dbContext.Database.EnsureCreated();
GanttSeeder.Seed(dbContext);
}

return webHost;
}
}
}

接下来调用InitializeDatabase():

app.InitializeDatabase();

正如上面提到的,本教程中没有使用迁移。而是使用简单的EnsureCreated和种子。

当前部分已经完成,让我们回到甘特图。

定义DTOs和映射
现在是定义将用于Web API的DTO类的时候了。让我们从任务的DTO类开始。在Models文件夹中创建一个文件并定义WebApiTask.cs类:

namespace DHX.Gantt.Models
{
public class WebApiTask
{
public int id { get; set; }
public string? text { get; set; }
public string? start_date { get; set; }
public int duration { get; set; }
public decimal progress { get; set; }
public int? parent { get; set; }
public string? type { get; set; }
public bool open
{
get { return true; }
set { }
}

public static explicit operator WebApiTask(Task task)
{
return new WebApiTask
{
id = task.Id,
text = task.Text,
start_date = task.StartDate.ToString("yyyy-MM-dd HH:mm"),
duration = task.Duration,
parent = task.ParentId,
type = task.Type,
progress = task.Progress
};
}

public static explicit operator Task(WebApiTask task)
{
return new Task
{
Id = task.id,
Text = task.text,
StartDate = task.start_date != null ? DateTime.Parse(task.start_date,
System.Globalization.CultureInfo.InvariantCulture) : new DateTime(),
Duration = task.duration,
ParentId = task.parent,
Type = task.type,
Progress = task.progress
};
}
}
}

而这是定义在Models文件夹中名为WebApiLink.cs的文件中的Link的DTO类:

namespace DHX.Gantt.Models
{
public class WebApiLink
{
public int id { get; set; }
public string? type { get; set; }
public int source { get; set; }
public int target { get; set; }

public static explicit operator WebApiLink(Link link)
{
return new WebApiLink
{
id = link.Id,
type = link.Type,
source = link.SourceTaskId,
target = link.TargetTaskId
};
}

public static explicit operator Link(WebApiLink link)
{
return new Link
{
Id = link.id,
Type = link.type,
SourceTaskId = link.source,
TargetTaskId = link.target
};
}
}
}

当你完成这一步骤时,你应该得到以下的文件夹结构:

现在你可以运行该应用程序,以检查一切是否到位。如果你没有看到一个运行时错误,那么一切都很好。

第四步 实现网络API

现在是实际实现REST API的时候了。

添加控制器
创建控制器文件夹并创建三个空的API控制器:一个用于任务,另一个用于链接,还有一个用于整个数据集:

任务控制器
让我们为任务创建一个控制器。它将定义甘特任务的基本CRUD操作。

它是如何工作的:

在GET请求中,任务从数据库加载,输出是任务的数据传输对象;
在PUT/POST请求中,任务作为WebAPITask类来自客户端。它们在dhtmlxGantt中以这种方式表示。因此,你应该把它们转换为我们的EntityFramework数据模型的格式(任务类)。之后,就可以在DatabaseContext中保存更改。

using Microsoft.AspNetCore.Mvc;
using DHX.Gantt.Models;

namespace DHX.Gantt.Controllers
{
[Produces("application/json")]
[Route("api/task")]
public class TaskController : Controller
{
private readonly GanttContext _context;
public TaskController(GanttContext context)
{
_context = context;
}

// GET api/task
[HttpGet]
public IEnumerable<WebApiTask> Get()
{
return _context.Tasks
.ToList()
.Select(t => (WebApiTask)t);
}

// GET api/task/5
[HttpGet("{id}")]
public Models.Task? Get(int id)
{
return _context
.Tasks
.Find(id);
}

// POST api/task
[HttpPost]
public ObjectResult Post(WebApiTask apiTask)
{
var newTask = (Models.Task)apiTask;

_context.Tasks.Add(newTask);
_context.SaveChanges();

return Ok(new
{
tid = newTask.Id,
action = "inserted"
});
}

// PUT api/task/5
[HttpPut("{id}")]
public ObjectResult? Put(int id, WebApiTask apiTask)
{
var updatedTask = (Models.Task)apiTask;
var dbTask = _context.Tasks.Find(id);
if (dbTask == null)
{
return null;
}
dbTask.Text = updatedTask.Text;
dbTask.StartDate = updatedTask.StartDate;
dbTask.Duration = updatedTask.Duration;
dbTask.ParentId = updatedTask.ParentId;
dbTask.Progress = updatedTask.Progress;
dbTask.Type = updatedTask.Type;

_context.SaveChanges();

return Ok(new
{
action = "updated"
});
}

// DELETE api/task/5
[HttpDelete("{id}")]
public ObjectResult DeleteTask(int id)
{
var task = _context.Tasks.Find(id);
if (task != null)
{
_context.Tasks.Remove(task);
_context.SaveChanges();
}

return Ok(new
{
action = "deleted"
});
}
}
}

链接控制器
接下来你应该为链接创建一个控制器:

using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Mvc;
using DHX.Gantt.Models;

namespace DHX.Gantt.Controllers
{
[Produces("application/json")]
[Route("api/link")]
public class LinkController : Controller
{
private readonly GanttContext _context;
public LinkController(GanttContext context)
{
_context = context;
}

// GET api/Link
[HttpGet]
public IEnumerable<WebApiLink> Get()
{
return _context.Links
.ToList()
.Select(t => (WebApiLink)t);
}

// GET api/Link/5
[HttpGet("{id}")]
public Link? Get(int id)
{
return _context
.Links
.Find(id);
}

// POST api/Link
[HttpPost]
public ObjectResult Post(WebApiLink apiLink)
{
var newLink = (Link)apiLink;

_context.Links.Add(newLink);
_context.SaveChanges();

return Ok(new
{
tid = newLink.Id,
action = "inserted"
});
}

// PUT api/Link/5
[HttpPut("{id}")]
public ObjectResult Put(int id, WebApiLink apiLink)
{
var updatedLink = (Link)apiLink;
updatedLink.Id = id;
_context.Entry(updatedLink).State = EntityState.Modified;


_context.SaveChanges();

return Ok(new
{
action = "updated"
});
}

// DELETE api/Link/5
[HttpDelete("{id}")]
public ObjectResult DeleteLink(int id)
{
var Link = _context.Links.Find(id);
if (Link != null)
{
_context.Links.Remove(Link);
_context.SaveChanges();
}

return Ok(new
{
action = "deleted"
});
}
}
}

数据控制器
最后,你需要为一个数据动作创建一个控制器:

using Microsoft.AspNetCore.Mvc;
using DHX.Gantt.Models;

namespace DHX.Gantt.Controllers
{
[Produces("application/json")]
[Route("api/data")]
public class DataController : Controller
{
private readonly GanttContext _context;
public DataController(GanttContext context)
{
_context = context;
}

// GET api/data
[HttpGet]
public object Get()
{
return new
{
data = _context.Tasks.ToList().Select(t => (WebApiTask)t),
links = _context.Links.ToList().Select(l => (WebApiLink)l)

};
}

}
}

一切都准备好了。你可以运行该应用程序,看到成熟的甘特图。

你也可以在GitHub上查看完整的源代码。

DHTMLX Gantt享有超十年声誉,支持跨浏览器和跨平台,性价比高,可满足项目管理控件应用的所有需求,是最完善的甘特图图表库。

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

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

相关文章

minio 部署、迁移、使用

一、minio 部署 1、单节点部署 部署IP&#xff1a;192.168.206.10 1.1、下载minio的二进制文件 wget https://dl.min.io/server/minio/release/linux-amd64/minio 1.2、规划磁盘 minio 数据目录一定不能和 跟/ 在一个磁盘上&#xff0c;要单独挂载&#xff0c;比如规划将m…

一文看懂SpringBoot操纵数据库

1.前言 很多同学进入公司就开始参与项目开发&#xff0c;大多数情况是对某个项目进行维护或者需求迭代&#xff0c;能够从0到1参与到项目中的机会很少&#xff0c;因此并没有多少机会了解某些技术的运行机制。换句话说&#xff0c;有的面试官在面试的时候就会探讨深层的技术问题…

【产品设计】那些被迫妥协的产品设计背后的技术原因

刚入门的产品经理经常会听到前辈们说应该懂点技术&#xff0c;却不明白为什么。本文作者分享了几个被迫妥协的产品设计的例子&#xff0c;希望能让不是技术出身的产品经理了解到“产品经理应该懂点技术”在产品设计中有什么指导意义&#xff0c;一起来看一下吧。 刚入门的产品经…

学习C++:C++进阶(六)如何在C++代码中调用python类,实例化python中类的对象,如何将conda中的深度学习环境导入C++项目中

目录 1.应用场景 2.场景&#xff1a;利用maskrcnn深度学习网络实现语义分割 3.CMake配置python解释器 4.C中实现实例化python中的类的对象并调用类内方法 4.1 初始化python环境 4.2 实例化python类的对象 1.应用场景 我们在视觉SLAM以及目标检测和识别中&#xff0c;经常…

AMD GPU安装运行stable diffusion

本文操作环境为Windows10/11AMD AI绘画是一种利用人工智能技术进行绘画的方法。它可以通过机器学习算法来学习艺术家的风格&#xff0c;并生成类似于艺术家的作品。最近&#xff0c;AI绘画技术得到了很大的发展&#xff0c;许多公司和研究机构都在进行相关的研究和开发。例如&…

华为电脑录屏功能在哪?这样做,您可以快速找到

案例&#xff1a;如何在华为电脑上找到电脑录屏功能&#xff1f; “听说电脑有录屏功能&#xff0c;但我在我的华为电脑上找了很久&#xff0c;都没有找到。难道华为电脑没有录屏功能吗&#xff1f;有没有小伙伴可以告诉我华为电脑录屏功能在哪&#xff1f;孩子已经快绝望了&a…

第六章 法律体系

目录 第一节 法律体系与法律部门的概念 一、法律体系的概念 &#xff08;一&#xff09;法律体系的含义和特征 &#xff08;二&#xff09;法律体系与相关概念的区别&#xff08;法律体系与国家&#xff0c;现行有关&#xff09; &#xff08;三&#xff09;法律体系的形成和…

本地存储、自定义事件、全局事件总线、消息订阅与发布【Vue】

Vue 1.1 浏览器的本地存储 存储内容大小一般支持5MB左右&#xff08;不同浏览器可能还不一样&#xff09;浏览器通过 Window.sessionStorage 和 Window.localStorage 属性来实现本地存储机制相关API: &#xff08;1&#xff09;xxxxStorage.setItem(key, value); 该方法接受一…

CT前瞻(三):Adobe系列XD软件绘制简单的原型图与交互设计

文章目录&#x1f4cb;前言&#x1f3af;关于原型图绘制&#x1f3af;XD绘制原型图与交互设计&#x1f3af;关于XD软件其他功能&#x1f4dd;最后&#x1f4cb;前言 Adobe XD是一个协作式易用平台&#xff0c;可帮助团队为网站、移动应用程序、语音界面、游戏等创建设计。还可…

每个 Android 开发者都应该知道的有用资源

每个 Android 开发者都应该知道的有用资源 在本文中&#xff0c;我将提到 7 个资源&#xff0c;这些资源对于 Android 开发人员来说非常有益。我亲自使用过其中的每一个几次。他们无数次派上用场。确保您不要忘记为这些资源添加书签/收藏&#xff0c;以便您可以在需要使用它们时…

医院体检PEIS系统源码

一、医院体检系统概述 1. 医院体检系统概述 目前&#xff0c;大多数的体检还停留在手工操作上&#xff0c;如单位体检时手工书写体检人员信息、医生手工书写体检结果、检验报告打印后进行手工粘贴等&#xff0c;这样造成极大的工作量&#xff0c;效率低下&#xff0c;而且极易…

【三十天精通Vue 3】第九天 Vue 3 路由详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录引言一、Vue 3 路由概述1.1 路由的简介1.2 路由的分类1.3 路由的语…

暗讽友商 昆仑万维大模型预告刺激股价

搭上AI风口&#xff0c;上市公司昆仑万维年内股价大涨217.56%&#xff0c;一时名声大噪。火了以后&#xff0c;昆仑万维的野心越来越大&#xff0c;喊出“All in AGI&#xff08;通用人工智能&#xff09;与AIGC”的豪言壮语。 在近期预告旗下大模型“天工”邀测的公告中&…

STL :双端队列容器 Deque

Deque #include<deque> using namesace std; 双端队列容器 &#xff1a;双向开口的连续线性空间&#xff1b; 擅长尾部和头部添加或删除元素&#xff1a;常数阶&#xff1b; 存储元素并不能保证所有元素都存储到连续的内存空间中&#xff1b; deque 是动态的以分段…

TiDB实战篇-TiDB配置

简介 熟系TiDB的配置相关。 TiDB的大体参数 系统配置对应的是TiDB-Server,PD和TiKV和TiDB-Server基本在集群配置里面配置。 系统配置 系统变量 | PingCAP 文档中心 集群配置 PD 配置文件描述 | PingCAP 文档中心 配置的存储位置 系统配置存储在TiKV中的&#xff0c;集…

如何免费恢复电脑上误删除的视频

虽然我们现在可以在单个硬盘驱动器上存储无数大型视频文件是件好事&#xff0c;但这也意味着单个用户错误或硬件/软件故障可能会立即抹去数小时的记忆&#xff0c;而没有任何明显的方法可以恢复它们。在本文中&#xff0c;我们提供了一个快速的分步视频恢复指南&#xff0c;以帮…

【音视频】利用ffmpeg实现:音视频的提取,rtmp推流等

目录 可列出电脑的设备 音频桌面视频&#xff0c;存mp4 录声音 推流到服务器 音频桌面视频&#xff0c;推流到服务器 音频笔记本摄像头&#xff0c;推流到服务器 参考资料 可列出电脑的设备 输入下面的语句即可列出电脑的设备 ffmpeg -list_devices true -f dshow -i dum…

(链表)相交链表(双指针法)

文章目录前言&#xff1a;问题描述&#xff1a;问题解析&#xff1a;代码实现&#xff1a;总结&#xff1a;前言&#xff1a; 此篇是关于链表的经典练习题。 问题描述&#xff1a; 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节…

【测试开发篇9】Junit框架

目录 一、认识Junit框架 Junit和Selenium的关系是什么 导入Junit框架common-io包 二、Junit框架的使用 2.1Junit有哪些常用注解 2.1.1Test注解 2.1.2BeforeEach 2.1.3BeforeAll 2.1.4AfterAll 2.1.5AfterEach 2.2Junit的断言 Assertions.assertEquals(期待值&#…

小白推荐|使用git建立自己的代码仓库

1 git 1.1 什么是git 版本控制工具&#xff0c;用于团队协作与项目管理 1.2 git 安装教程 step1&#xff1a;进入git下载官网Git for Windows step2&#xff1a;点击Download step3&#xff1a;打开下载好的文件&#xff0c;按照下面图片一步一步安装 剩下的一直点Next就完…