利用 Antv X6 绘制审批流程(单向流转)

Antv X6官网:https://x6.antv.vision/zh/docs/tutorial/about

首先展示一下效果:

 

 这是只是做了一个简单的demo,具体项目的需求就看个人怎么使用,下面附上demo的全部代码:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <script src="x6.js"></script>
        <title>X6流程图</title>
        <style type="text/css">
            #container {
                width: 100%;
                height: calc(100vh);
            }
            @keyframes ant-line {
                        to {
                            stroke-dashoffset: -1000;
                        }
                    }
        </style>
    </head>
    <body>
        <div id="container" style="position: fixed;"></div>
    </body>

    <script type=" text/javascript">
        const male = 'images/1.png'

        X6.Graph.registerNode(
            'org-node', {
                width: 180,
                height: 60,
                markup: [{
                        tagName: 'rect',
                        selector: 'body',
                    },
                    {
                        tagName: 'image',
                        selector: 'avatar',
                    },
                    {
                        tagName: 'text',
                        selector: 'rank',
                    },
                    {
                        tagName: 'text',
                        selector: 'name',
                    },
                ],
                attrs: {
                    body: {
                        refWidth: '100%',
                        refHeight: '100%',
                        fill: '#FFFFFF',
                        stroke: '#000000',
                        strokeWidth: 2,
                        rx: 10,
                        ry: 10,
                        pointerEvents: 'visiblePainted',
                    },
                    avatar: {
                        width: 48,
                        height: 48,
                        refX: 8,
                        refY: 6,
                    },
                    rank: {
                        refX: 0.9,
                        refY: 0.2,
                        fontFamily: 'Courier New',
                        fontSize: 14,
                        textAnchor: 'end',
                        //textDecoration: 'underline',
                    },
                    name: {
                        refX: 0.9,
                        refY: 0.6,
                        fontFamily: 'Courier New',
                        fontSize: 14,
                        fontWeight: '800',
                        textAnchor: 'end',
                    },
                },
            },
            true,
        )
        const graph = new X6.Graph({
            container: document.getElementById('container'),
            grid: {
                size: 20, //网格大小
                visible: true, //是否开启网格画布
                type: 'dot', // 'dot' | 'fixedDot' | 'mesh'|     //网格样式
                args: {
                    color: '#75664D', // 网格线/点颜色  
                    thickness: 1, // 网格线宽度/网格点大小
                },
            },
            //对齐线是移动节点排版的辅助工具
            snapline: true,
            connecting: {
                snap: true,
                highlight: true,
            },
        })

        function member(x, y, rank, name, image, background, textColor) {
            return graph.addNode({
                width: 180, // Number,可选,节点大小的 width 值
                height: 60, // Number,可选,节点大小的 height 值
                x:x,
                y:y,
                shape: 'org-node',
                attrs: {
                    body: {
                        fill: background,
                        stroke: 'none',
                    },
                    avatar: {
                        opacity: 0.7,
                        'xlink:href': image,
                    },
                    rank: {
                        text: rank,
                        fill: '#000',
                        wordSpacing: '-5px',
                        letterSpacing: 0,
                    },
                    name: {
                        text: name,
                        fill: '#000',
                        fontSize: 13,
                        fontFamily: 'Arial',
                        letterSpacing: 0,
                    },
                },
            })
        }
        const node1 = member(200, 160, '张三', '已审批(同意)', male, 'green');
        const node2 = member(460, 160, '王五', '已审批(驳回)', male, 'yellow');
        const node3 = member(720, 160, '李四', '正在审批中', male, 'red');
        const node4 = member(980, 160, '王麻子', '未审批', male, '#f2f2f2');
        const edge1 = new X6.Shape.Edge({
            id: 'edge1',
            source: node1,
            target: node2,
            router: {
                name: 'er',
                args: {
                      offset: 'center',
                    },
            },
            attrs: {
                line: {
                    stroke: '#000',
                    strokeDasharray: 5,
                                targetMarker: 'classic',
                                style: {
                                    animation: 'ant-line 30s infinite linear',
                                },   
                },
            },
        })
        const edge2 = new X6.Shape.Edge({
            id: 'edge2',
            source: node2,
            target: node3,
            router: {
                name: 'er',
                args: {
                      offset: 'center',
                      
                    },
            },
            attrs: {
                line: {
                    stroke: '#000',
                    strokeDasharray: 5,
                                targetMarker: 'classic',
                                style: {
                                    animation: 'ant-line 30s infinite linear',
                                },   
                },
            },
        })
        const edge3 = new X6.Shape.Edge({
            id: 'edge3',
            source: node3,
            target: node4,
            router: {
                name: 'er',
                args: {
                      offset: 'center',
                    },
            },
            attrs: {
                line: {
                    stroke: '#000',
                    strokeDasharray: 5,
                                targetMarker: 'classic',
                                style: {
                                    animation: 'ant-line 30s infinite linear',
                                },   
                },
            },
        })
        graph.addEdge(edge1)
        graph.addEdge(edge2)
        graph.addEdge(edge3)
    </script>
</html>

节点之间的动画属性=》

<style>

@keyframes ant-line {
to {
stroke-dashoffset: -1000;
}
}

</style>

 

 js下载链接: https://pan.baidu.com/s/1YSezUqOTqdPkBCDTfA7Rpg 提取码: 976p 

 

posted @ 2021-06-10 09:16  幸运(● ̄(エ) ̄●)  阅读(2505)  评论(1编辑  收藏  举报
Document