add feature apache/skywaking#96 (#165)

* export picture

* change css
diff --git a/src/assets/lang/en.ts b/src/assets/lang/en.ts
index fb224ef..682991b 100644
--- a/src/assets/lang/en.ts
+++ b/src/assets/lang/en.ts
@@ -96,6 +96,7 @@
   monthCutTip: 'Last 1 month',
   serverZone: 'Server Zone',
   percentResponse: 'Percent Response',
+  download: 'Dowanload',
 };
 
 export default m;
diff --git a/src/assets/lang/zh.ts b/src/assets/lang/zh.ts
index 11b15d8..71de156 100644
--- a/src/assets/lang/zh.ts
+++ b/src/assets/lang/zh.ts
@@ -96,6 +96,7 @@
   monthCutTip: '最近1月',
   serverZone: '服务器时区',
   percentResponse: '百分比响应',
+  download: '导出为图片',
 };
 
 export default m;
diff --git a/src/views/components/trace/d3-trace.js b/src/views/components/trace/d3-trace.js
index 8f3a2b7..a7535b3 100644
--- a/src/views/components/trace/d3-trace.js
+++ b/src/views/components/trace/d3-trace.js
@@ -37,6 +37,7 @@
     this.svg = d3
       .select(this.el)
       .append('svg')
+      .attr('class', 'trace-list-dowanload')
       .attr('width', this.width)
       .attr('height', this.height);
     this.treemap = d3.tree().size([this.height * 0.7, this.width]);
@@ -76,6 +77,7 @@
     this.svg
     .append('g')
     .attr('class','trace-xaxis')
+    
     .attr('transform', `translate(${this.width * 0.618 -20 },${30})`)
     .call(this.xAxis);
     this.sequentialScale = d3
@@ -133,7 +135,8 @@
       .attr('rx',2)
       .attr('y', -22)
       .attr('x', 20)
-      .attr('width', '100%');
+      .attr('width', '100%')
+      .attr('fill', 'rgba(0,0,0,0)');
     nodeEnter
       .append('text')
       .attr('x', 13)
@@ -204,7 +207,7 @@
       .attr('fill', d =>
         d._children
           ? `${this.sequentialScale(this.list.indexOf(d.data.serviceCode))}`
-          : ''
+          : 'rbga(0,0,0,0)'
       )
       .style(
         'stroke',
@@ -245,6 +248,9 @@
       .enter()
       .insert('path', 'g')
       .attr('class', 'trace-link')
+      .attr('fill', 'rgba(0,0,0,0)')
+      .attr('stroke', 'rgba(0, 0, 0, 0.1)')
+      .attr('stroke-width', 2)
       .attr('d', d => {
         const o = { x: source.x0 + 35, y: source.y0 };
         return this.diagonal({ source: o, target: o });
diff --git a/src/views/components/trace/trace-detail-chart-list.vue b/src/views/components/trace/trace-detail-chart-list.vue
index c0c5fa9..c005a25 100644
--- a/src/views/components/trace/trace-detail-chart-list.vue
+++ b/src/views/components/trace/trace-detail-chart-list.vue
@@ -22,7 +22,7 @@
         <use xlink:href="#spinner"></use>
       </svg>
     </div>
-    <transition-group name="fade" tag="div" class="mb-5">
+    <transition-group name="fade" tag="a" class="mb-5">
       <span class="time-charts-item mr-10" v-for="(i,index) in list" :key="i" :style="`color:${computedScale(index)}`">
          <svg class="icon vm mr-5 sm">
             <use xlink:href="#issue-open-m"></use>
@@ -30,6 +30,7 @@
         <span>{{i}}</span>
       </span>
     </transition-group>
+    <a class="rk-btn r vm  tc" @click="downloadTrace">{{$t('download')}}</a>
     <rk-sidebox :width="'50%'" :show.sync="showDetail" :title="$t('spanInfo')">
       <div class="rk-trace-detail">
         <h5 class="mb-15">{{$t('tags')}}.</h5>
@@ -285,6 +286,28 @@
         ],
       })
     },
+    downloadTrace() {
+      let serializer = new XMLSerializer();
+      let svgNode = d3.select('.trace-list-dowanload').node();
+      let width = d3.select('.trace-list-dowanload')._groups[0][0].clientWidth;
+      let height = d3.select('.trace-list-dowanload')._groups[0][0].clientHeight;
+      let source = serializer.serializeToString(svgNode); 
+      source = '<?xml version="1.0" standalone="no"?>\r\n' + source;
+      let url = "data:image/svg+xml;charset=utf-8," + encodeURIComponent(source);  
+      let canvas = document.createElement("canvas");
+      canvas.width = width;
+      canvas.height = height; 
+      let context = canvas.getContext("2d");
+      let image = new Image;
+      image.src = url;
+      image.onload = function() {
+          context.drawImage(image, 0, 0);
+          var a = document.createElement("a");
+          a.download = "trace-list.png";
+          a.href = canvas.toDataURL("image/png");
+          a.click();
+      }
+    }
   }
 };
 </script>
@@ -312,11 +335,6 @@
   pointer-events: none;
 }
 .domain{display: none;}
-.trace-link {
-  fill: none;
-  stroke: rgba(0,0,0,0.1);
-  stroke-width: 2px;
-}
 .time-charts-item{
   display: inline-block;
   padding: 2px 8px;