You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Thymeleaf将Spring后端数据注入JS表格生成甘特图?

解决方案:用Thymeleaf向Google Charts甘特图注入后端数据

没问题,我来帮你搞定这个事儿——用Thymeleaf把Spring控制器传递的slots列表注入到JS的DataTable里,其实核心就是用Thymeleaf的JavaScript内联功能,下面是具体步骤和代码示例:

1. 先确认你的Slots实体字段匹配

首先得保证你的Slots类包含甘特图需要的所有字段,比如:

public class Slots {
    private String taskId;
    private String taskName;
    private String resource;
    private Date startDate;
    private Date endDate;
    private Integer percentComplete; // 可选,无值时默认100%
    private String dependencies; // 可选,无值时默认null

    // 别忘了加Getter和Setter方法
}

如果你的字段名和上面不一样,后续JS代码里要对应修改哦。

2. 在Thymeleaf模板里编写带内联的JS代码

在你的gantt.html模板中,给<script>标签加上th:inline="javascript"属性(告诉Thymeleaf要解析脚本里的表达式),然后通过/*[[${slots}]]*/获取后端传递的列表,再遍历生成甘特图需要的数据行:

<script th:inline="javascript">
    var data = new google.visualization.DataTable();
    // 先定义表格列,和你原来的代码一致
    data.addColumn('string', 'Task ID');
    data.addColumn('string', 'Task Name');
    data.addColumn('string', 'Resource');
    data.addColumn('date', 'Start Date');
    data.addColumn('date', 'End Date');
    data.addColumn('number', 'Duration');
    data.addColumn('number', 'Percent Complete');
    data.addColumn('string', 'Dependencies');

    // 从Thymeleaf获取后端的slots列表,[]是列表为空时的默认值
    var slots = /*[[${slots}]]*/ [];

    // 遍历slots生成甘特图数据行
    var ganttRows = [];
    slots.forEach(function(slot) {
        // 可选:计算时长(单位是天),不需要的话直接传null
        var duration = slot.endDate ? (new Date(slot.endDate) - new Date(slot.startDate)) / (1000 * 60 * 60 * 24) : null;
        
        ganttRows.push([
            slot.taskId,
            slot.taskName,
            slot.resource,
            new Date(slot.startDate), // Thymeleaf会把Java Date转成ISO字符串,JS能直接解析
            new Date(slot.endDate),
            duration,
            slot.percentComplete || 100, // 无值时默认100%完成
            slot.dependencies || null
        ]);
    });

    // 把生成的行添加到DataTable
    data.addRows(ganttRows);

    // 下面是你原来的甘特图渲染代码,继续保留即可
    var options = {
        height: 400,
        gantt: {
            trackHeight: 30
        }
    };

    var chart = new google.visualization.Gantt(document.getElementById('gantt_chart'));
    chart.draw(data, options);
</script>

3. 几个关键注意点

  • 日期处理:如果后端用的是java.util.Date,Thymeleaf会自动把它转成ISO 8601格式的字符串(比如"2018-03-06T00:00:00"),JS的new Date()能直接解析。要是你用的是Java 8的LocalDate/LocalDateTime,建议在控制器里转成Date,或者在JS里手动拼接日期(比如new Date(slot.startDate.year, slot.startDate.monthValue - 1, slot.startDate.dayOfMonth)——注意JS的月份是从0开始的)。
  • 必须加th:inline="javascript":没有这个属性的话,Thymeleaf会完全忽略脚本里的/*[[${slots}]]*/表达式,数据根本传不进来。
  • 空值处理:如果某些字段可能为空(比如dependencies),一定要在JS里设置默认值,避免出现undefined导致甘特图渲染失败。

这样修改后,当你访问/{auftragID}路径时,Thymeleaf会自动把后端的slots列表转换成JS数组,动态填充到DataTable里,就能生成对应的甘特图啦。


内容的提问来源于stack exchange,提问作者user9828889

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:04:35