liyongli vor 3 Jahren
Ursprung
Commit
260d0ce32d

+ 3 - 0
package.json

@@ -11,10 +11,13 @@
     "lint": "vue-cli-service lint"
   },
   "dependencies": {
+    "@antv/data-set": "^0.11.8",
+    "@antv/f2": "^3.8.10-beta.1",
     "@liripeng/vue-audio-player": "^1.2.8",
     "axios": "^0.19.0",
     "core-js": "^3.4.4",
     "good-storage": "^1.1.0",
+    "lodash": "^4.17.21",
     "node-sass": "4.14.1",
     "normalize.css": "^8.0.1",
     "vant": "^2.12.27",

+ 13 - 0
src/api/ai/index.js

@@ -0,0 +1,13 @@
+import request from "@/utils/request.js";
+
+/**
+ * 授权权限树
+ * @param params
+ * @returns {AxiosPromise}
+ */
+export function getAiData() {
+  return request({
+    url: "https://dangjian-web.oss-cn-chengdu.aliyuncs.com/data/aiwenan/a.json",
+    method: "get"
+  });
+}

+ 5 - 0
src/config/page.js

@@ -1,5 +1,10 @@
 //这里做页面参数约定和说明,如果url没有携带requiredParams的参数则无法初始化页面
 module.exports = {
+  aiChannel: {
+    title: "AI智能分析",
+    requiredParams: {},
+    optionalParams: {}
+  },
   apply: {
     title: "数据申请",
     requiredParams: {},

+ 290 - 0
src/pages/aiChannel/Index.vue

@@ -0,0 +1,290 @@
+<template>
+  <div class="aiChannel">
+    <div v-if="load" style="padding-top: 2em;">
+      <van-skeleton title :row="3" />
+    </div>
+    <div v-if="!load">
+      <van-cell size="large" :title="channelName + '收视详情'"> </van-cell>
+      <div class="item">
+        <van-row>
+          <van-col span="8">频道名</van-col>
+          <van-col span="16">收视率</van-col>
+        </van-row>
+        <div class="rank" v-if="cm.table && cm.table.length">
+          <van-row v-for="(item, i) in cm.table" :key="i">
+            <van-col
+              span="8"
+              :style="item.select ? 'color:#f2826a' : ''"
+              v-text="item.channelname"
+            ></van-col>
+            <van-col span="16" style="padding-top: 1em">
+              <van-progress
+                :color="item.select ? '#f2826a' : '#1989fa'"
+                :pivot-text="item.watchrate.toFixed(4) + '%'"
+                :percentage="calcper(item.watchrate, cm.table[0].watchrate)"
+              />
+            </van-col>
+          </van-row>
+        </div>
+        <van-divider></van-divider>
+        <van-notice-bar
+          v-if="cm.auto_reason || cm.human_reason"
+          color="#1989fa"
+          background="#ecf9ff"
+          wrapable
+          :scrollable="false"
+          :text="cm.auto_reason + cm.human_reason"
+        />
+      </div>
+      <div class="item">
+        <div class="title">
+          <div class="icon"></div>
+          收视率趋势
+        </div>
+        <Area id="area1" :list="cm.history" :channelName="channelName" />
+      </div>
+      <van-cell size="large" :title="channelName + '新媒体'"> </van-cell>
+      <div class="item">
+        <van-row>
+          <van-col span="6">平台</van-col>
+          <van-col span="6">发稿量</van-col>
+          <van-col span="6">传播量</van-col>
+          <van-col span="6">粉丝增长</van-col>
+        </van-row>
+
+        <div class="rank" v-if="platform.data.length">
+          <van-row v-for="(item, i) in platform.data" :key="i">
+            <van-col
+              span="6"
+              :style="item.select ? 'color:#f2826a' : ''"
+              v-text="platformText[item.platform]"
+            ></van-col>
+            <van-col span="6">
+              {{ item.total | numFormat }}
+            </van-col>
+            <van-col span="6">
+              {{ item.play_count | numFormat }}
+            </van-col>
+            <van-col span="6">
+              {{ item.new_fans | numFormat }}
+            </van-col>
+          </van-row>
+        </div>
+
+        <van-notice-bar
+          v-if="platform.auto_reason || platform.human_reason"
+          color="#1989fa"
+          background="#ecf9ff"
+          wrapable
+          :scrollable="false"
+          :text="platform.auto_reason + platform.human_reason"
+        />
+      </div>
+      <van-cell size="large" title="详细数据"> </van-cell>
+      <div class="item">
+        <div class="title">
+          <div class="icon"></div>
+          新增粉丝趋势
+        </div>
+        <Area
+          id="area2"
+          :list="propagationMore(platform.history, 'new_fans')"
+        />
+        <div class="title">
+          <div class="icon"></div>
+          传播趋势
+        </div>
+        <Area
+          id="area3"
+          :list="propagationMore(platform.history, 'play_count')"
+        />
+        <div class="title">
+          <div class="icon"></div>
+          发稿趋势
+        </div>
+        <Area id="area4" :list="propagationMore(platform.history, 'total')" />
+        <div class="title">
+          <div class="icon"></div>
+          传播量
+        </div>
+        <Ring id="ring1" :list="propagation(platform.data, 'play_count')" />
+        <div class="title">
+          <div class="icon"></div>
+          平台分布
+        </div>
+        <Interval id="interval2" :list="propagation(platform.data, 'total')" />
+        <div class="title">
+          <div class="icon"></div>
+          新增粉丝数
+        </div>
+        <Bar id="ring2" :list="propagation(platform.data, 'play_count')" />
+        <!-- <div class="title">
+          <div class="icon"></div>
+          词云
+        </div>
+        <WordCloud /> -->
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import {
+  Cell as vanCell,
+  Col as vanCol,
+  Row as vanRow,
+  Divider as vanDivider,
+  Skeleton as vanSkeleton,
+  Progress as vanProgress,
+  NoticeBar as vanNoticeBar
+} from "vant";
+import "vant/lib/cell/style";
+import "vant/lib/divider/style";
+import "vant/lib/notice-bar/style";
+import "vant/lib/progress/style";
+import "vant/lib/cell-group/style";
+import "vant/lib/skeleton/style";
+import "vant/lib/col/style";
+import "vant/lib/row/style";
+
+import { getAiData } from "@/api/ai/index.js";
+
+import Ring from "./components/ring.vue";
+import Area from "./components/area.vue";
+import Interval from "./components/interval.vue";
+import Bar from "./components/bar.vue";
+// import Radar from "./components/radar.vue";
+// import WordCloud from "./components/wordCloud.vue";
+
+export default {
+  name: "app",
+  data: function() {
+    return {
+      channelName: "",
+      load: true,
+      cm: {},
+      platform: [],
+      platformText: {
+        weixin: "微信",
+        weibo: "微博",
+        douyin: "抖音"
+      }
+    };
+  },
+  filters: {
+    numFormat: function(num) {
+      if (num > 100000000) {
+        num = (num / 100000000).toFixed(2) + "亿";
+      }
+      if (num > 10000) {
+        num = (num / 10000).toFixed(2) + "万";
+      }
+      return num;
+    }
+  },
+  methods: {
+    calcper(num, all) {
+      return ((num / all) * 100).toFixed(2);
+    },
+    propagation(list, key) {
+      const li = list.map(v => {
+        return {
+          const: key,
+          amount: v[key],
+          memo: this.platformText[v.platform]
+        };
+      });
+      return li.sort((a, b) => {
+        return a.amount - b.amount;
+      });
+    },
+    propagationMore(list, key) {
+      const li = [];
+      list.map(v => {
+        li.push({
+          stadate: v.dt,
+          type: v.platform,
+          watchrate: v[key]
+        });
+      });
+      return li;
+    }
+  },
+  computed: {},
+  mounted() {
+    getAiData().then(r => {
+      this.load = false;
+      const res = r || {};
+      res.cm && res.cm.auto_reason && (res.cm.auto_reason += ";");
+      res.xmt && res.xmt.auto_reason && (res.xmt.auto_reason += ";");
+      this.cm = res.cm || {
+        auto_reason: "",
+        human_reason: "",
+        history: [],
+        table: []
+      };
+      this.platform = res.xmt || {
+        auto_reason: "",
+        human_reason: "",
+        data: []
+      };
+      this.platform.data.sort((a, b) => {
+        return b.play_count - a.play_count;
+      });
+      this.channelName = this.cm.table.find(v => v.select).channelname;
+    });
+  },
+  beforeDestroy: function() {},
+  components: {
+    vanCell,
+    vanCol,
+    vanRow,
+    vanDivider,
+    vanProgress,
+    vanSkeleton,
+    vanNoticeBar,
+    Ring,
+    Area,
+    Interval,
+    Bar
+    // Radar
+    // WordCloud
+  }
+};
+</script>
+<style lang="scss">
+.aiChannel {
+  height: 100%;
+  .item {
+    font-size: 0.15rem;
+    padding: 1em;
+    .van-row {
+      line-height: 2em;
+    }
+    .title {
+      position: relative;
+      font-size: 0.13rem;
+      height: 1.4em;
+      line-height: 1.4em;
+      padding-left: 0.5em;
+      margin: 0.5em 0;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+      .icon {
+        position: absolute;
+        height: 1em;
+        background: #666;
+        width: 3px;
+        left: 0px;
+        top: 0.19em;
+        border-radius: 3px;
+      }
+    }
+    .rank {
+      max-height: 56vw;
+      overflow-y: scroll;
+    }
+  }
+}
+</style>

+ 137 - 0
src/pages/aiChannel/components/area.vue

@@ -0,0 +1,137 @@
+<template>
+  <div :class="this.id" ref="areaChart">
+    <canvas :id="this.id"></canvas>
+  </div>
+</template>
+
+<script>
+import F2 from "@antv/f2/lib/index-all";
+export default {
+  name: "areaChart",
+  props: {
+    list: {
+      type: Array,
+      default: () => []
+    },
+    channelName: {
+      type: String,
+      default: ""
+    },
+    id: {
+      type: String,
+      default: ""
+    }
+  },
+  data: function() {
+    return {
+      platformText: {
+        weixin: "微信",
+        weibo: "微博",
+        douyin: "抖音"
+      }
+    };
+  },
+  methods: {
+    numFormat: function(num) {
+      if (num > 100000000) {
+        num = (num / 100000000).toFixed(2) + "亿";
+      }
+      if (num > 10000) {
+        num = (num / 10000).toFixed(2) + "万";
+      }
+      return num;
+    }
+  },
+  computed: {},
+  mounted() {
+    const data = this.list.map(v => {
+      return {
+        date: v.stadate,
+        type: v.type || this.channelName,
+        value: v.watchrate
+      };
+    });
+    const _this = this;
+    const chart = new F2.Chart({
+      id: this.id,
+      width: this.$refs.areaChart.offsetWidth,
+      height: this.$refs.areaChart.offsetWidth * 0.5625,
+      pixelRatio: window.devicePixelRatio,
+      padding: [40, 10, 20, 60]
+    });
+    chart.source(data);
+    chart.scale("date", {
+      tickCount: 5,
+      range: [0, 1]
+    });
+    chart.axis("date", {
+      label: function label(text, index, total) {
+        const textCfg = {
+          text: text[4] + text[5] + "-" + text[6] + text[7]
+        };
+        if (index === 0) {
+          textCfg.textAlign = "left";
+        } else if (index === total - 1) {
+          textCfg.textAlign = "right";
+        }
+        return textCfg;
+      }
+    });
+    chart.axis("value", {
+      label: function label(text) {
+        const textCfg = {
+          text: _this.numFormat(text)
+        };
+        return textCfg;
+      }
+    });
+    chart.legend(true, {
+      itemFormatter(val) {
+        if (_this.platformText[val]) return _this.platformText[val];
+        return val; // val 为每个图例项的文本值
+      }
+    });
+    chart.tooltip({
+      showCrosshairs: true,
+      onShow: function onShow(ev) {
+        let out = [];
+        ev.items.map(v => {
+          if (/^#/.test(v.color)) out.push(v);
+        });
+        for (let i = 0; i < ev.items.length; i++) {
+          const v = ev.items[i];
+          v.value = _this.numFormat(v.value);
+          if (_this.platformText[v.name]) {
+            v.name = _this.platformText[v.name];
+          }
+          if (/^#/.test(v.color)) {
+            ev.items.splice(i, 1);
+            i--;
+          }
+        }
+      }
+    });
+    chart
+      .area()
+      .position("date*value")
+      .color("type", [
+        "l(90) 0:#1677ff 1:#FFFFFF",
+        "l(90) 0:#facc14 1:#FFFFFF",
+        "l(90) 0:#2fc25b 1:#FFFFFF"
+      ])
+      .shape("smooth");
+    chart
+      .line()
+      .style({
+        lineWidth: 1
+      })
+      .position("date*value")
+      .color("type", ["#1677ff", "#facc14", "#2fc25b"])
+      .shape("smooth");
+    chart.render();
+  },
+  beforeDestroy: function() {},
+  components: {}
+};
+</script>
+<style lang="scss" scoped></style>

+ 92 - 0
src/pages/aiChannel/components/bar.vue

@@ -0,0 +1,92 @@
+<template>
+  <div :class="this.id" ref="barChart">
+    <canvas :id="this.id"></canvas>
+  </div>
+</template>
+
+<script>
+import F2 from "@antv/f2/lib/index-all";
+export default {
+  name: "bar",
+  props: {
+    list: {
+      type: Array,
+      default: () => []
+    },
+    id: {
+      type: String,
+      default: ""
+    }
+  },
+  data: function() {
+    return {};
+  },
+  methods: {
+    numFormat: function(num) {
+      if (num > 100000000) {
+        num = (num / 100000000).toFixed(2) + "亿";
+      }
+      if (num > 10000) {
+        num = (num / 10000).toFixed(2) + "万";
+      }
+      return num;
+    }
+  },
+  computed: {},
+  mounted() {
+    const data = this.list;
+    let total = 0;
+    const _this = this;
+    data.forEach(v => {
+      total += v.amount;
+    });
+    const chart = new F2.Chart({
+      id: this.id,
+      width: this.$refs.barChart.offsetWidth,
+      height: this.$refs.barChart.offsetWidth * 0.5625,
+      pixelRatio: window.devicePixelRatio,
+      padding: [40, 0, 5, 0]
+    });
+
+    chart.source(data);
+    chart.coord("polar", {
+      transposed: true,
+      radius: 0.85
+    });
+    chart.axis(false);
+    chart.legend(false);
+    chart.tooltip(false);
+    // 配置文本饼图
+    chart.pieLabel({
+      sidePadding: 5,
+      label1: function label1(data) {
+        return {
+          text: data.memo,
+          fill: "#808080"
+        };
+      },
+      label2: function label2(data) {
+        return {
+          fill: "#808080",
+          text:
+            _this.numFormat(data.amount) +
+            "/" +
+            ((data.amount / total) * 100).toFixed(2) +
+            "%",
+          fontWeight: 500,
+          fontSize: 10
+        };
+      }
+    });
+    chart
+      .interval()
+      .position("const*amount")
+      .color("memo")
+      .adjust("stack");
+    chart.render();
+  },
+  beforeDestroy: function() {},
+  components: {}
+};
+</script>
+<style lang="scss" scoped></style>

+ 96 - 0
src/pages/aiChannel/components/interval.vue

@@ -0,0 +1,96 @@
+<template>
+  <div :class="this.id" ref="intervalChart">
+    <canvas :id="this.id"></canvas>
+  </div>
+</template>
+
+<script>
+import F2 from "@antv/f2/lib/index-all";
+export default {
+  name: "interval",
+  props: {
+    list: {
+      type: Array,
+      default: () => []
+    },
+    id: {
+      type: String,
+      default: ""
+    }
+  },
+  data: function() {
+    return {};
+  },
+  methods: {
+    numFormat: function(num) {
+      var result = [],
+        counter = 0;
+      num = (num || 0).toString().split("");
+      for (var i = num.length - 1; i >= 0; i--) {
+        counter++;
+        result.unshift(num[i]);
+        if (!(counter % 3) && i != 0) {
+          result.unshift(",");
+        }
+      }
+      return result.join("");
+    }
+  },
+  computed: {},
+  mounted() {
+    const data = this.list.map(v => {
+      return {
+        name: "0",
+        cName: v.memo,
+        cValue: v.amount
+      };
+    });
+
+    const chart = new F2.Chart({
+      id: this.id,
+      width: this.$refs.intervalChart.offsetWidth,
+      height: this.$refs.intervalChart.offsetWidth * 0.5625,
+      pixelRatio: window.devicePixelRatio,
+      padding: [5, 10, 5, 30]
+    });
+
+    chart.source(data, {
+      cValue: {
+        tickCount: 5
+      }
+    });
+    chart.coord({
+      transposed: true
+    });
+    chart.legend(false);
+    chart.tooltip(false);
+    chart
+      .interval()
+      .position("cName*cValue")
+      .color("name")
+      .adjust("stack");
+    chart.render();
+
+    // 绘制柱状图文本
+    const canvas = chart.get("canvas");
+    const group = canvas.addGroup();
+    const _this = this;
+    data.forEach(function(obj) {
+      const point = chart.getPosition(obj);
+      group.addShape("text", {
+        attrs: {
+          x: point.x + 15,
+          y: point.y + 5,
+          text: _this.numFormat(obj.cValue),
+          textAlign: "center",
+          textBaseline: "bottom",
+          fill: "#808080"
+        }
+      });
+    });
+  },
+  beforeDestroy: function() {},
+  components: {}
+};
+</script>
+<style lang="scss" scoped></style>

+ 153 - 0
src/pages/aiChannel/components/radar.vue

@@ -0,0 +1,153 @@
+<template>
+  <div :class="this.id" ref="radarChart">
+    <canvas :id="this.id"></canvas>
+  </div>
+</template>
+
+<script>
+import F2 from "@antv/f2/lib/index-all";
+import _ from "lodash";
+
+export default {
+  name: "radarChart",
+  props: {
+    list: {
+      type: Array,
+      default: () => []
+    },
+    channelName: {
+      type: String,
+      default: ""
+    },
+    id: {
+      type: String,
+      default: ""
+    }
+  },
+  data: function() {
+    return {
+      platformText: {
+        weixin: "微信",
+        weibo: "微博",
+        douyin: "抖音"
+      }
+    };
+  },
+  methods: {
+    numFormat: function(num) {
+      if (num > 100000000) {
+        num = (num / 100000000).toFixed(2) + "亿";
+      }
+      if (num > 10000) {
+        num = (num / 10000).toFixed(2) + "万";
+      }
+      return num;
+    }
+  },
+  computed: {},
+  mounted() {
+    const data = this.list.map(v => {
+      return {
+        item: v.stadate,
+        user: v.type || this.channelName,
+        score: v.watchrate
+      };
+    });
+    // const _this = this;
+    const chart = new F2.Chart({
+      id: this.id,
+      pixelRatio: window.devicePixelRatio
+    });
+
+    chart.coord("polar");
+    chart.source(data, {
+      score: {
+        min: 0,
+        max: 120,
+        nice: false,
+        tickCount: 4
+      }
+    });
+    chart.tooltip({
+      custom: true, // 自定义 tooltip 内容框
+      onChange: function onChange(obj) {
+        const legend = chart.get("legendController").legends.top[0];
+        const tooltipItems = obj.items;
+        const legendItems = legend.items;
+        const map = {};
+        legendItems.forEach(function(item) {
+          map[item.name] = _.clone(item);
+        });
+        tooltipItems.forEach(function(item) {
+          const name = item.name;
+          const value = item.value;
+          if (map[name]) {
+            map[name].value = value;
+          }
+        });
+        legend.setItems(_.values(map));
+      },
+      onHide: function onHide() {
+        const legend = chart.get("legendController").legends.top[0];
+        legend.setItems(chart.getLegendItems().country);
+      }
+    });
+    chart.axis("score", {
+      label: function label(text, index, total) {
+        if (index === total - 1) {
+          return null;
+        }
+        return {
+          top: true
+        };
+      },
+      grid: function grid(text) {
+        if (text === "120") {
+          return {
+            lineDash: null
+          };
+        }
+      },
+      line: {
+        top: false
+      }
+    });
+    chart
+      .area()
+      .position("item*score")
+      .color("user")
+      .animate({
+        appear: {
+          animation: "groupWaveIn"
+        }
+      });
+    chart
+      .line()
+      .position("item*score")
+      .color("user")
+      .animate({
+        appear: {
+          animation: "groupWaveIn"
+        }
+      });
+    chart
+      .point()
+      .position("item*score")
+      .color("user")
+      .style({
+        stroke: "#fff",
+        lineWidth: 1
+      })
+      .animate({
+        appear: {
+          delay: 300
+        }
+      });
+
+    chart.render();
+  },
+  beforeDestroy: function() {},
+  components: {}
+};
+</script>
+<style lang="scss" scoped></style>

+ 87 - 0
src/pages/aiChannel/components/ring.vue

@@ -0,0 +1,87 @@
+<template>
+  <div :class="this.id" ref="ringChart">
+    <canvas :id="this.id"></canvas>
+  </div>
+</template>
+
+<script>
+import F2 from "@antv/f2/lib/index-all";
+export default {
+  name: "ring",
+  props: {
+    list: {
+      type: Array,
+      default: () => []
+    },
+    id: {
+      type: String,
+      default: ""
+    }
+  },
+  data: function() {
+    return {};
+  },
+  methods: {},
+  computed: {},
+  mounted() {
+    const data = this.list;
+    let total = 0;
+    data.forEach(v => {
+      total += v.amount;
+    });
+    const chart = new F2.Chart({
+      id: this.id,
+      width: this.$refs.ringChart.offsetWidth,
+      height: this.$refs.ringChart.offsetWidth * 0.5625,
+      pixelRatio: window.devicePixelRatio,
+      padding: [20, 0, 5, 0]
+    });
+
+    chart.source(data);
+    chart.coord("polar", {
+      transposed: true,
+      innerRadius: 0.6,
+      radius: 0.75
+    });
+    chart.axis(false);
+    chart.legend(false);
+    chart.tooltip(false);
+    // 配置文本饼图
+    chart.pieLabel({
+      sidePadding: 5,
+      label1: function label1(data) {
+        return {
+          text: data.memo,
+          fill: "#808080"
+        };
+      },
+      label2: function label2(data) {
+        return {
+          fill: "#808080",
+          text: ((data.amount / total) * 100).toFixed(2) + "%",
+          fontWeight: 500,
+          fontSize: 10
+        };
+      }
+    });
+    chart
+      .interval()
+      .position("const*amount")
+      .color("memo", [
+        "#1890FF",
+        "#13C2C2",
+        "#2FC25B",
+        "#FACC14",
+        "#F04864",
+        "#8543E0",
+        "#3436C7",
+        "#223273"
+      ])
+      .adjust("stack");
+    chart.render();
+  },
+  beforeDestroy: function() {},
+  components: {}
+};
+</script>
+<style lang="scss" scoped></style>

+ 621 - 0
src/pages/aiChannel/components/wordCloud.vue

@@ -0,0 +1,621 @@
+<template>
+  <div :class="this.id" ref="wordCloudChart">
+    <canvas :id="this.id"></canvas>
+  </div>
+</template>
+
+<script>
+import F2 from "@antv/f2/lib/index-all";
+import DataSet from "@antv/data-set";
+const Util = F2.Util;
+// 获取 text 文本的图形属性
+function getTextAttrs(cfg) {
+  return Util.mix(
+    {},
+    {
+      fillOpacity: cfg.opacity,
+      fontSize: cfg.origin._origin.size,
+      rotate: (cfg.origin._origin.rotate * Math.PI) / 180,
+      text: cfg.origin._origin.text,
+      textAlign: "center",
+      fontFamily: cfg.origin._origin.font,
+      fill: cfg.color,
+      textBaseline: "Alphabetic"
+    },
+    cfg.style
+  );
+}
+
+// 给point注册一个词云的shape
+F2.Shape.registerShape("point", "cloud", {
+  draw: function draw(cfg, container) {
+    const attrs = getTextAttrs(cfg);
+    const x = cfg.x;
+    const y = this._coord.y.start - cfg.y;
+    return container.addShape("text", {
+      attrs: Util.mix(attrs, {
+        x,
+        y
+      })
+    });
+  }
+});
+export default {
+  name: "ring",
+  props: {
+    id: {
+      type: String,
+      default: ""
+    }
+  },
+  data: function() {
+    return {};
+  },
+  methods: {},
+  computed: {},
+  mounted() {
+    const data = [
+      {
+        x: "China",
+        value: 1383220000,
+        category: "asia"
+      },
+      {
+        x: "India",
+        value: 1316000000,
+        category: "asia"
+      },
+      {
+        x: "United States",
+        value: 324982000,
+        category: "america"
+      },
+      {
+        x: "Indonesia",
+        value: 263510000,
+        category: "asia"
+      },
+      {
+        x: "Brazil",
+        value: 207505000,
+        category: "america"
+      },
+      {
+        x: "Pakistan",
+        value: 196459000,
+        category: "asia"
+      },
+      {
+        x: "Nigeria",
+        value: 191836000,
+        category: "africa"
+      },
+      {
+        x: "Bangladesh",
+        value: 162459000,
+        category: "asia"
+      },
+      {
+        x: "Russia",
+        value: 146804372,
+        category: "europe"
+      },
+      {
+        x: "Japan",
+        value: 126790000,
+        category: "asia"
+      },
+      {
+        x: "Mexico",
+        value: 123518000,
+        category: "america"
+      },
+      {
+        x: "Ethiopia",
+        value: 104345000,
+        category: "africa"
+      },
+      {
+        x: "Philippines",
+        value: 104037000,
+        category: "asia"
+      },
+      {
+        x: "Egypt",
+        value: 93013300,
+        category: "africa"
+      },
+      {
+        x: "Vietnam",
+        value: 92700000,
+        category: "asia"
+      },
+      {
+        x: "Germany",
+        value: 82800000,
+        category: "europe"
+      },
+      {
+        x: "Democratic Republic of the Congo",
+        value: 82243000,
+        category: "africa"
+      },
+      {
+        x: "Iran",
+        value: 80135400,
+        category: "asia"
+      },
+      {
+        x: "Turkey",
+        value: 79814871,
+        category: "asia"
+      },
+      {
+        x: "Thailand",
+        value: 68298000,
+        category: "asia"
+      },
+      {
+        x: "France",
+        value: 67013000,
+        category: "europe"
+      },
+      {
+        x: "United Kingdom",
+        value: 65110000,
+        category: "europe"
+      },
+      {
+        x: "Italy",
+        value: 60599936,
+        category: "europe"
+      },
+      {
+        x: "Tanzania",
+        value: 56878000,
+        category: "africa"
+      },
+      {
+        x: "South Africa",
+        value: 55908000,
+        category: "africa"
+      },
+      {
+        x: "Myanmar",
+        value: 54836000,
+        category: "asia"
+      },
+      {
+        x: "South Korea",
+        value: 51446201,
+        category: "asia"
+      },
+      {
+        x: "Colombia",
+        value: 49224700,
+        category: "america"
+      },
+      {
+        x: "Kenya",
+        value: 48467000,
+        category: "africa"
+      },
+      {
+        x: "Spain",
+        value: 46812000,
+        category: "europe"
+      },
+      {
+        x: "Argentina",
+        value: 43850000,
+        category: "america"
+      },
+      {
+        x: "Ukraine",
+        value: 42541633,
+        category: "europe"
+      },
+      {
+        x: "Sudan",
+        value: 42176000,
+        category: "africa"
+      },
+      {
+        x: "Uganda",
+        value: 41653000,
+        category: "africa"
+      },
+      {
+        x: "Algeria",
+        value: 41064000,
+        category: "africa"
+      },
+      {
+        x: "Poland",
+        value: 38424000,
+        category: "europe"
+      },
+      {
+        x: "Iraq",
+        value: 37883543,
+        category: "asia"
+      },
+      {
+        x: "Canada",
+        value: 36541000,
+        category: "america"
+      },
+      {
+        x: "Morocco",
+        value: 34317500,
+        category: "africa"
+      },
+      {
+        x: "Saudi Arabia",
+        value: 33710021,
+        category: "asia"
+      },
+      {
+        x: "Uzbekistan",
+        value: 32121000,
+        category: "asia"
+      },
+      {
+        x: "Malaysia",
+        value: 32063200,
+        category: "asia"
+      },
+      {
+        x: "Peru",
+        value: 31826018,
+        category: "america"
+      },
+      {
+        x: "Venezuela",
+        value: 31431164,
+        category: "america"
+      },
+      {
+        x: "Nepal",
+        value: 28825709,
+        category: "asia"
+      },
+      {
+        x: "Angola",
+        value: 28359634,
+        category: "africa"
+      },
+      {
+        x: "Ghana",
+        value: 28308301,
+        category: "africa"
+      },
+      {
+        x: "Yemen",
+        value: 28120000,
+        category: "asia"
+      },
+      {
+        x: "Afghanistan",
+        value: 27657145,
+        category: "asia"
+      },
+      {
+        x: "Mozambique",
+        value: 27128530,
+        category: "africa"
+      },
+      {
+        x: "Australia",
+        value: 24460900,
+        category: "australia"
+      },
+      {
+        x: "North Korea",
+        value: 24213510,
+        category: "asia"
+      },
+      {
+        x: "Taiwan",
+        value: 23545680,
+        category: "asia"
+      },
+      {
+        x: "Cameroon",
+        value: 23248044,
+        category: "africa"
+      },
+      {
+        x: "Ivory Coast",
+        value: 22671331,
+        category: "africa"
+      },
+      {
+        x: "Madagascar",
+        value: 22434363,
+        category: "africa"
+      },
+      {
+        x: "Niger",
+        value: 21564000,
+        category: "africa"
+      },
+      {
+        x: "Sri Lanka",
+        value: 21203000,
+        category: "asia"
+      },
+      {
+        x: "Romania",
+        value: 19760000,
+        category: "europe"
+      },
+      {
+        x: "Burkina Faso",
+        value: 19632147,
+        category: "africa"
+      },
+      {
+        x: "Syria",
+        value: 18907000,
+        category: "asia"
+      },
+      {
+        x: "Mali",
+        value: 18875000,
+        category: "africa"
+      },
+      {
+        x: "Malawi",
+        value: 18299000,
+        category: "africa"
+      },
+      {
+        x: "Chile",
+        value: 18191900,
+        category: "america"
+      },
+      {
+        x: "Kazakhstan",
+        value: 17975800,
+        category: "asia"
+      },
+      {
+        x: "Netherlands",
+        value: 17121900,
+        category: "europe"
+      },
+      {
+        x: "Ecuador",
+        value: 16737700,
+        category: "america"
+      },
+      {
+        x: "Guatemala",
+        value: 16176133,
+        category: "america"
+      },
+      {
+        x: "Zambia",
+        value: 15933883,
+        category: "africa"
+      },
+      {
+        x: "Cambodia",
+        value: 15626444,
+        category: "asia"
+      },
+      {
+        x: "Senegal",
+        value: 15256346,
+        category: "africa"
+      },
+      {
+        x: "Chad",
+        value: 14965000,
+        category: "africa"
+      },
+      {
+        x: "Zimbabwe",
+        value: 14542235,
+        category: "africa"
+      },
+      {
+        x: "Guinea",
+        value: 13291000,
+        category: "africa"
+      },
+      {
+        x: "South Sudan",
+        value: 12131000,
+        category: "africa"
+      },
+      {
+        x: "Rwanda",
+        value: 11553188,
+        category: "africa"
+      },
+      {
+        x: "Belgium",
+        value: 11356191,
+        category: "europe"
+      },
+      {
+        x: "Tunisia",
+        value: 11299400,
+        category: "africa"
+      },
+      {
+        x: "Cuba",
+        value: 11239004,
+        category: "america"
+      },
+      {
+        x: "Bolivia",
+        value: 11145770,
+        category: "america"
+      },
+      {
+        x: "Somalia",
+        value: 11079000,
+        category: "africa"
+      },
+      {
+        x: "Haiti",
+        value: 11078033,
+        category: "america"
+      },
+      {
+        x: "Greece",
+        value: 10783748,
+        category: "europe"
+      },
+      {
+        x: "Benin",
+        value: 10653654,
+        category: "africa"
+      },
+      {
+        x: "Czech Republic",
+        value: 10578820,
+        category: "europe"
+      },
+      {
+        x: "Portugal",
+        value: 10341330,
+        category: "europe"
+      },
+      {
+        x: "Burundi",
+        value: 10114505,
+        category: "africa"
+      },
+      {
+        x: "Dominican Republic",
+        value: 10075045,
+        category: "america"
+      },
+      {
+        x: "Sweden",
+        value: 10054100,
+        category: "europe"
+      },
+      {
+        x: "United Arab Emirates",
+        value: 10003223,
+        category: "asia"
+      },
+      {
+        x: "Jordan",
+        value: 9889270,
+        category: "asia"
+      },
+      {
+        x: "Azerbaijan",
+        value: 9823667,
+        category: "asia"
+      },
+      {
+        x: "Hungary",
+        value: 9799000,
+        category: "europe"
+      },
+      {
+        x: "Belarus",
+        value: 9498600,
+        category: "europe"
+      },
+      {
+        x: "Honduras",
+        value: 8866351,
+        category: "america"
+      },
+      {
+        x: "Austria",
+        value: 8773686,
+        category: "europe"
+      },
+      {
+        x: "Tajikistan",
+        value: 8742000,
+        category: "asia"
+      },
+      {
+        x: "Israel",
+        value: 8690220,
+        category: "asia"
+      },
+      {
+        x: "Switzerland",
+        value: 8417700,
+        category: "europe"
+      },
+      {
+        x: "Papua New Guinea",
+        value: 8151300,
+        category: "australia"
+      }
+    ];
+    const dv = new DataSet.View().source(data);
+    const range = dv.range("value");
+    const min = range[0];
+    const max = range[1];
+    const MAX_FONTSIZE = 36; // 最大的字体
+    const MIN_FONTSIZE = 12; // 最小的字体
+    // 生成词云的布局
+    dv.transform({
+      type: "tag-cloud",
+      fields: ["x", "value"],
+      size: [375, 260], // 同 canvas 画布保持一致
+      font: "Verdana",
+      padding: 0,
+      timeInterval: 5000, // max execute time
+      rotate: function rotate() {
+        let random = ~~(Math.random() * 4) % 4;
+        if (random === 2) {
+          random = 0;
+        }
+        return random * 90; // 0, 90, 270
+      },
+      fontSize: function fontSize(d) {
+        if (d.value) {
+          return (
+            ((d.value - min) / (max - min)) * (MAX_FONTSIZE - MIN_FONTSIZE) +
+            MIN_FONTSIZE
+          );
+        }
+        return 0;
+      }
+    });
+
+    const chart = new F2.Chart({
+      id: this.id,
+      padding: 0,
+      width: this.$refs.wordCloudChart.offsetWidth,
+      height: this.$refs.wordCloudChart.offsetWidth * 0.5625,
+      pixelRatio: window.devicePixelRatio
+    });
+    chart.source(dv.rows, {
+      x: {
+        nice: false
+      },
+      y: {
+        nice: false
+      }
+    });
+    chart.legend(false);
+    chart.axis(false);
+    chart.tooltip(false);
+
+    chart
+      .point()
+      .position("x*y")
+      .color("category")
+      .shape("cloud");
+    chart.render();
+  },
+  beforeDestroy: function() {},
+  components: {}
+};
+</script>
+<style lang="scss" scoped></style>

+ 16 - 0
src/pages/aiChannel/index.js

@@ -0,0 +1,16 @@
+import Vue from "vue";
+import App from "./Index.vue";
+import "@/pages/common.js";
+import { validateInitPage } from "@/utils/validateInitPage.js";
+
+validateInitPage() //这里还可以链式then做一些权限拦截
+  .then((pageName, pageParams) => {
+    Vue.prototype.$pageName = pageName;
+    Vue.prototype.$pageParams = pageParams;
+    new Vue({
+      render: h => h(App)
+    }).$mount("#app");
+  })
+  .catch(e => {
+    console.log(e);
+  });

+ 294 - 8
yarn.lock

@@ -2,6 +2,84 @@
 # yarn lockfile v1
 
 
+"@antv/adjust@~0.1.1":
+  version "0.1.1"
+  resolved "https://registry.npm.taobao.org/@antv/adjust/download/@antv/adjust-0.1.1.tgz#e263ab0e1a1941a648842fc086cf65a7e3b75e98"
+  integrity sha1-4mOrDhoZQaZIhC/Ahs9lp+O3Xpg=
+  dependencies:
+    "@antv/util" "~1.3.1"
+
+"@antv/data-set@^0.11.8":
+  version "0.11.8"
+  resolved "https://registry.npm.taobao.org/@antv/data-set/download/@antv/data-set-0.11.8.tgz?cache=0&sync_timestamp=1612145615723&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40antv%2Fdata-set%2Fdownload%2F%40antv%2Fdata-set-0.11.8.tgz#7413e900624863d5a5f3b46841fd009fc4f2a4ff"
+  integrity sha1-dBPpAGJIY9Wl87RoQf0An8TypP8=
+  dependencies:
+    "@antv/hierarchy" "^0.6.0"
+    "@antv/util" "^2.0.0"
+    d3-composite-projections "^1.2.0"
+    d3-dsv "^1.0.5"
+    d3-geo "~1.6.4"
+    d3-geo-projection "~2.1.2"
+    d3-hexjson "^1.0.1"
+    d3-hierarchy "^1.1.5"
+    d3-sankey "^0.9.1"
+    d3-voronoi "^1.1.2"
+    dagre "^0.8.2"
+    point-at-length "^1.0.2"
+    regression "^2.0.0"
+    simple-statistics "^6.1.0"
+    topojson-client "^3.0.0"
+    wolfy87-eventemitter "^5.1.0"
+
+"@antv/f2@^3.8.10-beta.1":
+  version "3.8.10-beta.1"
+  resolved "https://registry.npmmirror.com/@antv/f2/download/@antv/f2-3.8.10-beta.1.tgz#e2e88f2618653b1086c7a17d58c76ae9d8b5bc0b"
+  integrity sha1-4uiPJhhlOxCGx6F9WMdq6di1vAs=
+  dependencies:
+    "@antv/adjust" "~0.1.1"
+    "@antv/scale" "~0.3.3"
+    "@antv/util" "~2.0.6"
+    "@babel/runtime" "^7.7.7"
+    "@types/hammerjs" "^2.0.36"
+    hammerjs "^2.0.8"
+    type-fest "^0.15.1"
+
+"@antv/gl-matrix@^2.7.1":
+  version "2.7.1"
+  resolved "https://registry.npm.taobao.org/@antv/gl-matrix/download/@antv/gl-matrix-2.7.1.tgz#acb8e37f7ab3df01345aba4372d7942be42eba14"
+  integrity sha1-rLjjf3qz3wE0WrpDcteUK+QuuhQ=
+
+"@antv/hierarchy@^0.6.0":
+  version "0.6.8"
+  resolved "https://registry.nlark.com/@antv/hierarchy/download/@antv/hierarchy-0.6.8.tgz#b77c490a9c2dd6da186cbacee0e7887b8c1b3fa4"
+  integrity sha1-t3xJCpwt1toYbLrO4OeIe4wbP6Q=
+  dependencies:
+    "@antv/util" "^2.0.7"
+
+"@antv/scale@~0.3.3":
+  version "0.3.13"
+  resolved "https://registry.npmmirror.com/@antv/scale/download/@antv/scale-0.3.13.tgz?cache=0&sync_timestamp=1633663318355&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40antv%2Fscale%2Fdownload%2F%40antv%2Fscale-0.3.13.tgz#f12bbccd8b46dcef410624fa7883181d8424ef73"
+  integrity sha1-8Su8zYtG3O9BBiT6eIMYHYQk73M=
+  dependencies:
+    "@antv/util" "~2.0.3"
+    fecha "~4.2.0"
+    tslib "^2.0.0"
+
+"@antv/util@^2.0.0", "@antv/util@^2.0.7", "@antv/util@~2.0.3", "@antv/util@~2.0.6":
+  version "2.0.17"
+  resolved "https://registry.nlark.com/@antv/util/download/@antv/util-2.0.17.tgz?cache=0&sync_timestamp=1631589207753&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40antv%2Futil%2Fdownload%2F%40antv%2Futil-2.0.17.tgz#e8ef42aca7892815b229269f3dd10c6b3c7597a9"
+  integrity sha1-6O9CrKeJKBWyKSafPdEMazx1l6k=
+  dependencies:
+    csstype "^3.0.8"
+    tslib "^2.0.3"
+
+"@antv/util@~1.3.1":
+  version "1.3.1"
+  resolved "https://registry.nlark.com/@antv/util/download/@antv/util-1.3.1.tgz?cache=0&sync_timestamp=1631589207753&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40antv%2Futil%2Fdownload%2F%40antv%2Futil-1.3.1.tgz#30a34b201ff9126ec0d58c72c8166a9c3e644ccd"
+  integrity sha1-MKNLIB/5Em7A1YxyyBZqnD5kTM0=
+  dependencies:
+    "@antv/gl-matrix" "^2.7.1"
+
 "@any-touch/compute@^1.0.9":
   version "1.0.9"
   resolved "https://registry.npm.taobao.org/@any-touch/compute/download/@any-touch/compute-1.0.9.tgz#5a4f09176c04c13a7ee4f37afa034876f89ba42c"
@@ -759,7 +837,7 @@
     js-levenshtein "^1.1.3"
     semver "^5.5.0"
 
-"@babel/runtime@7.x":
+"@babel/runtime@7.x", "@babel/runtime@^7.7.7":
   version "7.15.4"
   resolved "https://registry.nlark.com/@babel/runtime/download/@babel/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a"
   integrity sha1-/RfRa/34eObdAtGXU6OfqKjZyEo=
@@ -910,6 +988,11 @@
     "@types/minimatch" "*"
     "@types/node" "*"
 
+"@types/hammerjs@^2.0.36":
+  version "2.0.40"
+  resolved "https://registry.nlark.com/@types/hammerjs/download/@types/hammerjs-2.0.40.tgz#ded0240b6ea1ad7afc1e60374c49087aaea5dbd8"
+  integrity sha1-3tAkC26hrXr8HmA3TEkIeq6l29g=
+
 "@types/json-schema@^7.0.6":
   version "7.0.7"
   resolved "https://registry.npm.taobao.org/@types/json-schema/download/@types/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad"
@@ -1372,6 +1455,11 @@ abbrev@1:
   resolved "https://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
   integrity sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=
 
+abs-svg-path@~0.1.1:
+  version "0.1.1"
+  resolved "https://registry.npm.taobao.org/abs-svg-path/download/abs-svg-path-0.1.1.tgz#df601c8e8d2ba10d4a76d625e236a9a39c2723bf"
+  integrity sha1-32Acjo0roQ1KdtYl4japo5wnI78=
+
 accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7:
   version "1.3.7"
   resolved "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
@@ -2458,16 +2546,16 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
   dependencies:
     delayed-stream "~1.0.0"
 
+commander@2, commander@^2.18.0, commander@^2.20.0, commander@~2.20.3:
+  version "2.20.3"
+  resolved "https://registry.npm.taobao.org/commander/download/commander-2.20.3.tgz?cache=0&sync_timestamp=1573464098030&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+  integrity sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=
+
 commander@2.17.x:
   version "2.17.1"
   resolved "https://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz?cache=0&sync_timestamp=1573464098030&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
   integrity sha1-vXerfebelCBc6sxy8XFtKfIKd78=
 
-commander@^2.18.0, commander@^2.20.0, commander@~2.20.3:
-  version "2.20.3"
-  resolved "https://registry.npm.taobao.org/commander/download/commander-2.20.3.tgz?cache=0&sync_timestamp=1573464098030&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
-  integrity sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=
-
 commander@~2.19.0:
   version "2.19.0"
   resolved "https://registry.npm.taobao.org/commander/download/commander-2.19.0.tgz?cache=0&sync_timestamp=1573464098030&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
@@ -2906,6 +2994,11 @@ csso@^4.0.2:
   dependencies:
     css-tree "1.0.0-alpha.37"
 
+csstype@^3.0.8:
+  version "3.0.9"
+  resolved "https://registry.nlark.com/csstype/download/csstype-3.0.9.tgz?cache=0&sync_timestamp=1631540658518&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcsstype%2Fdownload%2Fcsstype-3.0.9.tgz#6410af31b26bd0520933d02cbc64fce9ce3fbf0b"
+  integrity sha1-ZBCvMbJr0FIJM9AsvGT86c4/vws=
+
 current-script-polyfill@^1.0.0:
   version "1.0.0"
   resolved "https://registry.npm.taobao.org/current-script-polyfill/download/current-script-polyfill-1.0.0.tgz#f31cf7e4f3e218b0726e738ca92a02d3488ef615"
@@ -2923,6 +3016,121 @@ cyclist@^1.0.1:
   resolved "https://registry.npm.taobao.org/cyclist/download/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
   integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
 
+d3-array@1:
+  version "1.2.4"
+  resolved "https://registry.npmmirror.com/d3-array/download/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f"
+  integrity sha1-Y1zk1e6nWfb2BYY9vPww7cc39x8=
+
+d3-array@^2.5.0:
+  version "2.12.1"
+  resolved "https://registry.npmmirror.com/d3-array/download/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81"
+  integrity sha1-4gtBqvzf/fXVCSgATs7PgVpGXoE=
+  dependencies:
+    internmap "^1.0.0"
+
+d3-collection@1:
+  version "1.0.7"
+  resolved "https://registry.npm.taobao.org/d3-collection/download/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e"
+  integrity sha1-NJvSqpl32wcQkcExRNXk8WtbMQ4=
+
+d3-composite-projections@^1.2.0:
+  version "1.4.0"
+  resolved "https://registry.nlark.com/d3-composite-projections/download/d3-composite-projections-1.4.0.tgz#27b182fa635a5869349fe911ce0180b974d17f12"
+  integrity sha1-J7GC+mNaWGk0n+kRzgGAuXTRfxI=
+  dependencies:
+    d3-geo "^2.0.1"
+    d3-path "^2.0.0"
+
+d3-dsv@^1.0.5:
+  version "1.2.0"
+  resolved "https://registry.nlark.com/d3-dsv/download/d3-dsv-1.2.0.tgz#9d5f75c3a5f8abd611f74d3f5847b0d4338b885c"
+  integrity sha1-nV91w6X4q9YR900/WEew1DOLiFw=
+  dependencies:
+    commander "2"
+    iconv-lite "0.4"
+    rw "1"
+
+d3-geo-projection@~2.1.2:
+  version "2.1.2"
+  resolved "https://registry.nlark.com/d3-geo-projection/download/d3-geo-projection-2.1.2.tgz#7df8e1e9d046d631c6509f7e531357d4adc24aa3"
+  integrity sha1-ffjh6dBG1jHGUJ9+UxNX1K3CSqM=
+  dependencies:
+    commander "2"
+    d3-array "1"
+    d3-geo "^1.1.0"
+
+d3-geo@^1.1.0:
+  version "1.12.1"
+  resolved "https://registry.nlark.com/d3-geo/download/d3-geo-1.12.1.tgz#7fc2ab7414b72e59fbcbd603e80d9adc029b035f"
+  integrity sha1-f8KrdBS3Lln7y9YD6A2a3AKbA18=
+  dependencies:
+    d3-array "1"
+
+d3-geo@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.nlark.com/d3-geo/download/d3-geo-2.0.2.tgz#c065c1b71fe8c5f1be657e5f43d9bdd010383c40"
+  integrity sha1-wGXBtx/oxfG+ZX5fQ9m90BA4PEA=
+  dependencies:
+    d3-array "^2.5.0"
+
+d3-geo@~1.6.4:
+  version "1.6.4"
+  resolved "https://registry.nlark.com/d3-geo/download/d3-geo-1.6.4.tgz#f20e1e461cb1845f5a8be55ab6f876542a7e3199"
+  integrity sha1-8g4eRhyxhF9ai+Vatvh2VCp+MZk=
+  dependencies:
+    d3-array "1"
+
+d3-hexjson@^1.0.1:
+  version "1.1.1"
+  resolved "https://registry.npm.taobao.org/d3-hexjson/download/d3-hexjson-1.1.1.tgz#a1e264ff903bb09b8f8f4bc59c72447a91f460fe"
+  integrity sha1-oeJk/5A7sJuPj0vFnHJEepH0YP4=
+  dependencies:
+    d3-array "1"
+
+d3-hierarchy@^1.1.5:
+  version "1.1.9"
+  resolved "https://registry.nlark.com/d3-hierarchy/download/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83"
+  integrity sha1-L2vuJMqupD+Nw3VF+gFihVlkeoM=
+
+d3-path@1:
+  version "1.0.9"
+  resolved "https://registry.nlark.com/d3-path/download/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf"
+  integrity sha1-SMBQux/owmJJOoyvVSTj6VkXAc8=
+
+d3-path@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.nlark.com/d3-path/download/d3-path-2.0.0.tgz#55d86ac131a0548adae241eebfb56b4582dd09d8"
+  integrity sha1-VdhqwTGgVIra4kHuv7VrRYLdCdg=
+
+d3-sankey@^0.9.1:
+  version "0.9.1"
+  resolved "https://registry.npm.taobao.org/d3-sankey/download/d3-sankey-0.9.1.tgz#b850145a3284111636ddec90dfda8c64919bee4e"
+  integrity sha1-uFAUWjKEERY23eyQ39qMZJGb7k4=
+  dependencies:
+    d3-array "1"
+    d3-collection "1"
+    d3-shape "^1.2.0"
+
+d3-shape@^1.2.0:
+  version "1.3.7"
+  resolved "https://registry.nlark.com/d3-shape/download/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7"
+  integrity sha1-32OAG+B7yYa8VPY3ibT+UCmStdc=
+  dependencies:
+    d3-path "1"
+
+d3-voronoi@^1.1.2:
+  version "1.1.4"
+  resolved "https://registry.npm.taobao.org/d3-voronoi/download/d3-voronoi-1.1.4.tgz#dd3c78d7653d2bb359284ae478645d95944c8297"
+  integrity sha1-3Tx412U9K7NZKErkeGRdlZRMgpc=
+
+dagre@^0.8.2:
+  version "0.8.5"
+  resolved "https://registry.npm.taobao.org/dagre/download/dagre-0.8.5.tgz#ba30b0055dac12b6c1fcc247817442777d06afee"
+  integrity sha1-ujCwBV2sErbB/MJHgXRCd30Gr+4=
+  dependencies:
+    graphlib "^2.1.8"
+    lodash "^4.17.15"
+
 dashdash@^1.12.0:
   version "1.14.1"
   resolved "https://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
@@ -3750,6 +3958,11 @@ faye-websocket@~0.11.1:
   dependencies:
     websocket-driver ">=0.5.1"
 
+fecha@~4.2.0:
+  version "4.2.1"
+  resolved "https://registry.npm.taobao.org/fecha/download/fecha-4.2.1.tgz?cache=0&sync_timestamp=1617639874002&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffecha%2Fdownload%2Ffecha-4.2.1.tgz#0a83ad8f86ef62a091e22bb5a039cd03d23eecce"
+  integrity sha1-CoOtj4bvYqCR4iu1oDnNA9I+7M4=
+
 figgy-pudding@^3.5.1:
   version "3.5.1"
   resolved "https://registry.npm.taobao.org/figgy-pudding/download/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790"
@@ -4195,6 +4408,13 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6
   resolved "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
   integrity sha1-ShL/G2A3bvCYYsIJPt2Qgyi+hCM=
 
+graphlib@^2.1.8:
+  version "2.1.8"
+  resolved "https://registry.npm.taobao.org/graphlib/download/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da"
+  integrity sha1-V2HUFHN4cAhMkux7XbywWSydNdo=
+  dependencies:
+    lodash "^4.17.15"
+
 gzip-size@^5.0.0:
   version "5.1.1"
   resolved "https://registry.npm.taobao.org/gzip-size/download/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274"
@@ -4203,6 +4423,11 @@ gzip-size@^5.0.0:
     duplexer "^0.1.1"
     pify "^4.0.1"
 
+hammerjs@^2.0.8:
+  version "2.0.8"
+  resolved "https://registry.npm.taobao.org/hammerjs/download/hammerjs-2.0.8.tgz#04ef77862cff2bb79d30f7692095930222bf60f1"
+  integrity sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=
+
 handle-thing@^2.0.0:
   version "2.0.0"
   resolved "https://registry.npm.taobao.org/handle-thing/download/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754"
@@ -4527,7 +4752,7 @@ human-signals@^1.1.1:
   resolved "https://registry.npm.taobao.org/human-signals/download/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
   integrity sha1-xbHNFPUK6uCatsWf5jujOV/k36M=
 
-iconv-lite@0.4.24, iconv-lite@^0.4.24:
+iconv-lite@0.4, iconv-lite@0.4.24, iconv-lite@^0.4.24:
   version "0.4.24"
   resolved "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
   integrity sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=
@@ -4686,6 +4911,11 @@ internal-ip@^4.3.0:
     default-gateway "^4.2.0"
     ipaddr.js "^1.9.0"
 
+internmap@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.nlark.com/internmap/download/internmap-1.0.1.tgz?cache=0&sync_timestamp=1632108565136&other_urls=https%3A%2F%2Fregistry.nlark.com%2Finternmap%2Fdownload%2Finternmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95"
+  integrity sha1-ABfMijuZYF8DAvKxmNJy4BXl35U=
+
 invariant@^2.2.2:
   version "2.2.4"
   resolved "https://registry.npm.taobao.org/invariant/download/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
@@ -5007,6 +5237,11 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
   resolved "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
   integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
 
+isarray@~0.0.1:
+  version "0.0.1"
+  resolved "https://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+  integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+
 isexe@^2.0.0:
   version "2.0.0"
   resolved "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
@@ -5352,7 +5587,7 @@ lodash.uniq@^4.5.0:
   resolved "https://registry.npm.taobao.org/lodash.uniq/download/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
   integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
 
-lodash@^4.0.0, lodash@~4.17.10:
+lodash@^4.0.0, lodash@^4.17.21, lodash@~4.17.10:
   version "4.17.21"
   resolved "https://registry.npm.taobao.org/lodash/download/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
   integrity sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw=
@@ -6401,6 +6636,11 @@ parse-json@^5.0.0:
     json-parse-better-errors "^1.0.1"
     lines-and-columns "^1.1.6"
 
+parse-svg-path@~0.1.1:
+  version "0.1.2"
+  resolved "https://registry.npm.taobao.org/parse-svg-path/download/parse-svg-path-0.1.2.tgz#7a7ec0d1eb06fa5325c7d3e009b859a09b5d49eb"
+  integrity sha1-en7A0esG+lMlx9PgCbhZoJtdSes=
+
 parse5-htmlparser2-tree-adapter@^5.1.1:
   version "5.1.1"
   resolved "https://registry.npm.taobao.org/parse5-htmlparser2-tree-adapter/download/parse5-htmlparser2-tree-adapter-5.1.1.tgz#e8c743d4e92194d5293ecde2b08be31e67461cbc"
@@ -6577,6 +6817,15 @@ pkg-dir@^4.1.0:
   dependencies:
     find-up "^4.0.0"
 
+point-at-length@^1.0.2:
+  version "1.1.0"
+  resolved "https://registry.npm.taobao.org/point-at-length/download/point-at-length-1.1.0.tgz#0ad72ebd0980d7f5a1ab12296c055f9eb6b30e57"
+  integrity sha1-CtcuvQmA1/WhqxIpbAVfnrazDlc=
+  dependencies:
+    abs-svg-path "~0.1.1"
+    isarray "~0.0.1"
+    parse-svg-path "~0.1.1"
+
 portfinder@^1.0.25:
   version "1.0.25"
   resolved "https://registry.npm.taobao.org/portfinder/download/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca"
@@ -7334,6 +7583,11 @@ regjsparser@^0.6.0:
   dependencies:
     jsesc "~0.5.0"
 
+regression@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npm.taobao.org/regression/download/regression-2.0.1.tgz#8d29c3e8224a10850c35e337e85a8b2fac3b0c87"
+  integrity sha1-jSnD6CJKEIUMNeM36FqLL6w7DIc=
+
 relateurl@0.2.x:
   version "0.2.7"
   resolved "https://registry.npm.taobao.org/relateurl/download/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
@@ -7560,6 +7814,11 @@ rust-result@^1.0.0:
   dependencies:
     individual "^2.0.0"
 
+rw@1:
+  version "1.3.3"
+  resolved "https://registry.npm.taobao.org/rw/download/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
+  integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=
+
 rxjs@^6.4.0:
   version "6.5.4"
   resolved "https://registry.npm.taobao.org/rxjs/download/rxjs-6.5.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frxjs%2Fdownload%2Frxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c"
@@ -7822,6 +8081,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2:
   resolved "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
   integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
 
+simple-statistics@^6.1.0:
+  version "6.1.1"
+  resolved "https://registry.nlark.com/simple-statistics/download/simple-statistics-6.1.1.tgz#e3a0799ffc49914d6f421c5a4ac585f6a13e2bad"
+  integrity sha1-46B5n/xJkU1vQhxaSsWF9qE+K60=
+
 simple-swizzle@^0.2.2:
   version "0.2.2"
   resolved "https://registry.npm.taobao.org/simple-swizzle/download/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
@@ -8486,6 +8750,13 @@ toidentifier@1.0.0:
   resolved "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
   integrity sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=
 
+topojson-client@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.nlark.com/topojson-client/download/topojson-client-3.1.0.tgz#22e8b1ed08a2b922feeb4af6f53b6ef09a467b99"
+  integrity sha1-Iuix7QiiuSL+60r29Ttu8JpGe5k=
+  dependencies:
+    commander "2"
+
 toposort@^1.0.0:
   version "1.0.7"
   resolved "https://registry.npm.taobao.org/toposort/download/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029"
@@ -8534,6 +8805,11 @@ tslib@^1.9.3:
   resolved "https://registry.npm.taobao.org/tslib/download/tslib-1.14.1.tgz?cache=0&sync_timestamp=1609887581211&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftslib%2Fdownload%2Ftslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
   integrity sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=
 
+tslib@^2.0.0, tslib@^2.0.3:
+  version "2.3.1"
+  resolved "https://registry.nlark.com/tslib/download/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
+  integrity sha1-6KM1rdXOrlGqJh0ypJAVjvBC7wE=
+
 tsml@1.0.1:
   version "1.0.1"
   resolved "https://registry.npm.taobao.org/tsml/download/tsml-1.0.1.tgz#89f8218b9d9e257f47d7f6b56d01c5a4d2c68fc3"
@@ -8563,6 +8839,11 @@ type-check@~0.3.2:
   dependencies:
     prelude-ls "~1.1.2"
 
+type-fest@^0.15.1:
+  version "0.15.1"
+  resolved "https://registry.npmmirror.com/type-fest/download/type-fest-0.15.1.tgz?cache=0&sync_timestamp=1634020566006&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftype-fest%2Fdownload%2Ftype-fest-0.15.1.tgz#d2c4e73d3e4a53cf1a906396dd460a1c5178ca00"
+  integrity sha1-0sTnPT5KU88akGOW3UYKHFF4ygA=
+
 type-fest@^0.6.0:
   version "0.6.0"
   resolved "https://registry.npm.taobao.org/type-fest/download/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
@@ -9215,6 +9496,11 @@ wide-align@^1.1.0:
   dependencies:
     string-width "^1.0.2 || 2"
 
+wolfy87-eventemitter@^5.1.0:
+  version "5.2.9"
+  resolved "https://registry.nlark.com/wolfy87-eventemitter/download/wolfy87-eventemitter-5.2.9.tgz#e879f770b30fbb6512a8afbb330c388591099c2a"
+  integrity sha1-6Hn3cLMPu2USqK+7Mww4hZEJnCo=
+
 word-wrap@~1.2.3:
   version "1.2.3"
   resolved "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"