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

news2024/9/29 13:15:03

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

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

DHTMLX Gantt 最新下载(qun:764148812)icon-default.png?t=N3I4https://www.evget.com/product/4213/download

错误处理

为了处理错误,你需要声明一个特殊的中间件类,它将捕获运行时的异常并写入响应。接下来,它将被添加到应用程序的请求管道中。按照下面的步骤进行:

1. 从项目文件夹中的模板创建一个中间件类。

2. 为 ASP.NET 核心安装 JSON 框架,你可以通过NuGet包管理器进行安装:

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

PM> Install-Package NewtonSoft.JSON

3.找到invoke方法并注意调用。一些处理程序可以抛出异常让我们来捕捉它们,用一个块包住调用,如果捕捉到错误就运行我们的处理程序。

public async Task Invoke(HttpContext httpContext)
{
try
{
await _next(httpContext);
}catch(Exception e)
{
await HandleExceptionAsync(httpContext, e);
}
}
private static Task HandleExceptionAsync(HttpContext context, Exception exception)
{
var result = JsonConvert.SerializeObject(new {
action = "error"
});
context.Response.ContentType = "application/json";
context.Response.StatusCode = StatusCodes.Status500InternalServerError;
return context.Response.WriteAsync(result);
}

4.在GanttErrorMiddleware.cs中添加以下命名空间:

using Newtonsoft.Json;

5.中间件已经准备好了。现在转到Program.cs并连接中间件。添加以下命名空间:

using DHX.Gantt;

接下来调用app.UseGanttErrorMiddleware()方法:

app.UseGanttErrorMiddleware();

存储任务的顺序

用户可以通过在客户端甘特图中拖放来重新排列任务。如果使用此功能,则应将任务的顺序存储在数据库中。

请继续阅读,了解如何启用甘特图任务顺序的存储。

在客户端重新排序
首先在客户端启用任务的重新排序。将这些行添加到索引.html:

gantt.config.order_branch = true;
gantt.config.order_branch_free = true;

// specifying the date format
gantt.config.date_format = "%Y-%m-%d %H:%i";
// initializing gantt
gantt.init("gantt_here");

向模型添加任务顺序
接下来,您必须更改后端,使其反映任务的当前顺序。向任务模型再添加一个方法:

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; }
public int SortOrder { get; set; }
}
}

更新控制器
您还需要更新控制器。

1. 客户端应接收按 SortOrder 值排序的任务。将突出显示的行添加到数据控制器:

[HttpGet]
public object Get()
{
return new
{
data = _context.Tasks
.OrderBy(t => t.SortOrder)
.ToList()
.Select(t => (WebApiTask)t),
links = _context.Links
.ToList()
.Select(l => (WebApiLink)l)
};
}

2. 新任务也应接收默认值 SortOrder:

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

newTask.SortOrder = _context.Tasks.Max(t => t.SortOrder) + 1;
_context.Tasks.Add(newTask);
_context.SaveChanges();

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

3. 在客户端修改任务顺序时,应更新排序顺序。当用户重新排列任务时,gantt 将调用 PUT 操作,并在请求的“target”属性中提供有关新任务位置的信息,以及任务属性的其余部分。

添加到 WebApiTask.cs 类:target

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 string? target { get; set; }
public bool open
{
get { return true; }
set { }
}
}

现在让我们在 PUT (EditTask) 操作中实现重新排序,修改任务控制器的放置操作:

// PUT api/task/5
[HttpPut("{id}")]
public IActionResult? Put(int id, WebApiTask apiTask)
{
var updatedTask = (Models.Task)apiTask;
updatedTask.Id = id;

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;

if (!string.IsNullOrEmpty(apiTask.target))
{
// reordering occurred
this._UpdateOrders(dbTask, apiTask.target);
}

_context.SaveChanges();

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

并添加将更新任务顺序的方法:

private void _UpdateOrders(Models.Task updatedTask, string orderTarget)
{
int adjacentTaskId;
var nextSibling = false;

var targetId = orderTarget;

// adjacent task id is sent either as '{id}' or as 'next:{id}' depending
// on whether it's the next or the previous sibling
if (targetId.StartsWith("next:"))
{
targetId = targetId.Replace("next:", "");
nextSibling = true;
}

if (!int.TryParse(targetId, out adjacentTaskId))
{
return;
}

var adjacentTask = _context.Tasks.Find(adjacentTaskId);
var startOrder = adjacentTask!.SortOrder;

if (nextSibling)
startOrder++;

updatedTask.SortOrder = startOrder;

var updateOrders = _context.Tasks
.Where(t => t.Id != updatedTask.Id)
.Where(t => t.SortOrder >= startOrder)
.OrderBy(t => t.SortOrder);

var taskList = updateOrders.ToList();

taskList.ForEach(t => t.SortOrder++);
}

应用程序安全性

甘特图不提供任何方法来防止应用程序受到各种威胁,例如SQL注入,XSS和CSRF攻击。确保应用程序安全的责任在于开发人员 谁实现后端。阅读相应文章中的详细信息。

XSS 保护
一个简单的解决方案是在将数据项的文本属性发送到客户端时对其进行编码。

例如,在下面的代码中,内置的 HtmlEncoder 用于转义任务文本中的 HTML 值。这样,您的数据库将包含未修改的数据,但客户端将收到安全值

using System.Text.Encodings.Web;

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

另一种方法是使用专门的库,例如HtmlAgilityPack,并在保存/加载数据时完全剥离任何HTML任务。

故障排除

如果您已完成上述步骤以实现甘特图与 ASP.NET Core 的集成,但甘特图未在页面上呈现任务和链接,请查看排查后端集成问题一文。它描述了 找出问题根源的方法。

下一步是什么

现在你有一个功能齐全的甘特图。您可以在 GitHub 上查看完整代码,克隆或下载它并将其用于您的项目。

您还可以查看有关甘特图众多功能的指南或有关将甘特图与其他后端框架集成的教程。

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

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

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

相关文章

从Pandas快速切换到Polars :数据的ETL和查询

对于我们日常的数据清理、预处理和分析方面的大多数任务,Pandas已经绰绰有余。但是当数据量变得非常大时,它的性能开始下降。 我们以前的两篇文章来测试Pandas 1.5.3、polar和Pandas 2.0.0之间的性能了,Polars 正好可以解决大数据量是处理的…

电影《忠犬八公》观后感

上周看了电影《忠犬八公》,整部电影是以一条狗为故事线演绎的,之前看电影《忠犬帕尔玛》的时候,同事就推荐了《忠犬八公》,以为说的是同一部电影,去维基百科查过才知道,中国版的冯小刚为主演的《忠犬八公》…

全景丨0基础学习VR全景制作,平台篇第五章:开场封面功能

大家好欢迎观看蛙色平台使用教程 开场封面功能,现已支持开场图片和开场视频两种呈现方式, 分别针对PC端和移动设备访问分别设置呈现图片、视频内容,满足市场主流需求。 开场图片 传达主旨 1、全局-开场封面-图片 2、分别对PC端和移动设备访…

手动构建自己的docker容器镜像实战

前言 之前的实战中,我们实战中,我们使用的镜像都是镜像仓库已有的镜像。 已有的镜像都是别人已经开发好上传的。今天我们一起来看看如何构建自己的镜像并上传到镜像仓库中。 🏠个人主页:我是沐风晓月 🧑个人简介&…

[计算机图形学]光线追踪前瞻:阴影图(前瞻预习/复习回顾)

一、前言 我们前面学习过了光栅化,而光栅化会有一系列问题,比如:全局的光线传输,阴影。我们之前讲着色的时候说了,我们认为着色是一个局部的操作,我们只考虑着色点本身,并不考虑其它物体的遮挡对…

3Dconnexion SpaceMouse Enterprise 企业版有线3D鼠标

3Dconnexion SpaceMouse Enterprise 企业版有线3D鼠标 企业版有线3D鼠标SpaceMouse Enterprise凭借六自由度(6DoF)传感器,以及标准和自定义快速视图的一键访问功能,你可以比以往更加轻松自如地查看3D模型。轻轻操纵控制帽即可流畅…

表白墙 - 进阶(MySQL版本) - 持久化存储

想要解决上面那个版本存在的问题:服务器重启,数据不丢失。 最好的办法:将数据存储到硬盘上。 存储的方式: 1、直接使用 流对象 写入文本文件 2、借助数据库 我们采取的方式:是 MySQL 数据库的方式 来实现 持久化存储。…

Python卷积详解

文章目录 卷积函数对比测试卷积应用 卷积函数 python提供了多种卷积方案,相比之下,定义在ndimage中的卷积函数,在功能上比numpy和signal中的卷积要稍微复杂一些,这点仅从输入参数的多少就可略窥一二 numpy.convolve(a, v, modef…

拥抱汽车行业新时代,移远通信着力打造“七大产品技术生态”

汽车市场和消费者的需求正在发生日新月异的变化。以往中国新能源汽车的推广,大多倚重政策补贴,而如今新能源汽车已经走过了这个阶段,开始变成消费者自愿选择。除了汽车的电动化,“智能化”是不少车型拨动消费者心弦的另一主要因素…

光学仿真小作品集

光学仿真小作品集 传播方向与 z 轴平行的二维平面波自由空间中的传输传播方向与 z 轴有一定夹角的二维平面波自由空间中的传输 本文将展示一些作者本人平时自制的光学仿真小作品。 传播方向与 z 轴平行的二维平面波自由空间中的传输 传播方向与 z 轴有一定夹角的二维平面波自由…

(九)【软件设计师】计算机系统-浮点数习题

文章目录 一、2009年下半年第3、4题二、2011年上半年第5题三、2012年下半年第3题四、2015年上半年第1题五、2015年下半年第3题六、2016年下半年第3题七、2018年上半年第1题八、2020年下半年第3题 知识点回顾 (八)【软件设计师】计算机系统—浮点数 一、…

怎么使用AS推送项目到Github上,一文解决!

废话不多说,直接发车了!在android studio上推送项目到GitHub上有个基本可以解决所有推送失败问题的步骤,如下图: 路径:File —— Setting —— Version Control —— GitHub —— 加号,添加用户 上述步骤是…

河道船舶识别检测系统 python

河道船舶识别检测系统通过ppythonYOLOv5网络模型算法技术,河道船舶识别检测系统对画面中的船只进行7*24小时实时监测,若发现存在进行违规采砂或者捕鱼立即自动抓拍触发告警。与C / C等语言相比,Python速度较慢。也就是说,Python可…

mui.ajax

mui.ajax(http:xxxxxxxxxx/login,//请求的地址{data:{},//传给服务器的数据,一般在post请求中dataType:json,//服务器返回数据的格式;type:post,//HTTP请求类型;目前仅支持post/gettimeout:5000,//设置超时时间async:true,//是否异步&#xf…

应急照明和疏散指示系统在化工厂房中的设计与产品选型

【摘 要】《消防应急照明和疏散指示系统技术标准》(GB 51309-2018)的颁布,使应急照明和疏散指示的设计理念及设计方案发生了颠覆性的改变。化工企业在进行系统设计时也有其自身的特点及问题,现根据实际案例,解析化工企业应急照明和疏散指示系…

echrts 工程项目可视化

Echarts 常用各类图表模板配置 注意: 这里主要就是基于各类图表,更多的使用 Echarts 的各类配置项; 以下代码都可以复制到 Echarts 官网,直接预览; 图标模板目录 Echarts 常用各类图表模板配置一、工程项目可视化二、…

记录-new Date() 我忍你很久了!

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 大家平时在开发的时候有没被new Date()折磨过?就是它的诸多怪异的设定让你每每用的时候,都可能不小心踩坑。造成程序意外出错,却一下子找不到问题出处,那…

受安全威胁困扰的时代的可见性和人工智能

安全漏洞和事件以惊人的规律性发生,媒体报道的大人物,只是发生的实际数量的一小部分。 就在上周,横跨澳大利亚和新西兰的主要金融服务提供商 Latitude Financial 公布了影响其 1400 万客户的网络攻击和数据泄露的详细信息。 如果我们要确保…

一致性框架设计方案

补充组件依赖 前言 对于供应链业务,一般对数据一致性要求高。且由于业务复杂,可能会存在一个业务功能触发几个异步操作的场景,且要保证相关操作同时触发或不触发。 为了降低技术设计难度、代码编写难度,特意设计最终一致性框架&a…

Vue - 实现垂直菜单分类栏目,鼠标移入后右侧出现悬浮二级菜单容器效果(完整示例源码,详细代码注释,一键复制开箱即用)

前言 网上的教程都太乱了,各种杂乱无注释代码、图片资源丢失、一堆样式代码,根本无法改造后应用到自己的项目中。 本文实现了 在 Vue / Nuxt 项目中,垂直分类菜单项,当用户鼠标移入菜单后,右侧自动出现二级分类悬浮容器盒子效果, 您可以直接复制源码,然后按照您的需求再…