<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.swarma.org/index.php?action=history&amp;feed=atom&amp;title=Graph.v20251021.html</id>
	<title>Graph.v20251021.html - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.swarma.org/index.php?action=history&amp;feed=atom&amp;title=Graph.v20251021.html"/>
	<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Graph.v20251021.html&amp;action=history"/>
	<updated>2026-11-02T16:19:05Z</updated>
	<subtitle>本wiki的该页面的版本历史</subtitle>
	<generator>MediaWiki 1.35.0</generator>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Graph.v20251021.html&amp;diff=47534&amp;oldid=prev</id>
		<title>Jake：清空全部内容</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Graph.v20251021.html&amp;diff=47534&amp;oldid=prev"/>
		<updated>2025-11-10T02:18:54Z</updated>

		<summary type="html">&lt;p&gt;清空全部内容&lt;/p&gt;
&lt;a href=&quot;https://wiki.swarma.org/index.php?title=Graph.v20251021.html&amp;amp;diff=47534&amp;amp;oldid=47143&quot;&gt;显示更改&lt;/a&gt;</summary>
		<author><name>Jake</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Graph.v20251021.html&amp;diff=47143&amp;oldid=prev</id>
		<title>Fynn7：建立内容为“&lt;!DOCTYPE html&gt; &lt;!-- saved from url=(0044)https://wiki.swarma.org/graph.v20250715.html --&gt; &lt;html&gt;&lt;head&gt;&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset…”的新页面</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Graph.v20251021.html&amp;diff=47143&amp;oldid=prev"/>
		<updated>2025-10-21T12:12:24Z</updated>

		<summary type="html">&lt;p&gt;建立内容为“&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;!-- saved from url=(0044)https://wiki.swarma.org/graph.v20250715.html --&amp;gt; &amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset…”的新页面&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;!-- saved from url=(0044)https://wiki.swarma.org/graph.v20250715.html --&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;集智百科概览&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;icon&amp;quot; href=&amp;quot;./集智百科概览_files/logo.jpg&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;style&amp;gt;&lt;br /&gt;
    html,&lt;br /&gt;
    body {&lt;br /&gt;
      margin: 0;&lt;br /&gt;
      padding: 0;&lt;br /&gt;
      width: 100%;&lt;br /&gt;
      height: 100%;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    body {&lt;br /&gt;
      display: flex;&lt;br /&gt;
      justify-content: center;&lt;br /&gt;
      align-items: center;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .m-graph {&lt;br /&gt;
      position: relative;&lt;br /&gt;
      width: 100%;&lt;br /&gt;
      height: 100%;&lt;br /&gt;
      box-sizing: border-box;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .m-loading {&lt;br /&gt;
      position: fixed;&lt;br /&gt;
      top: 0;&lt;br /&gt;
      left: 0;&lt;br /&gt;
      width: 100%;&lt;br /&gt;
      height: 100%;&lt;br /&gt;
      background: #fff;&lt;br /&gt;
      z-index: 999;&lt;br /&gt;
      transition: opacity 1s ease-in-out;&lt;br /&gt;
    }&lt;br /&gt;
    .m-loading .m-animation {&lt;br /&gt;
      position: absolute;&lt;br /&gt;
      top: 50%;&lt;br /&gt;
      left: 50%;&lt;br /&gt;
      transform: translate(-50%, -50%);&lt;br /&gt;
      text-align: center;&lt;br /&gt;
      opacity: 0;&lt;br /&gt;
      transition: opacity 1s ease-in-out;&lt;br /&gt;
    }&lt;br /&gt;
    .m-loading .m-logo {&lt;br /&gt;
      display: flex;&lt;br /&gt;
      align-items: center;&lt;br /&gt;
    }&lt;br /&gt;
    .m-loading .m-logo .u-image {&lt;br /&gt;
      margin-right: 16px;&lt;br /&gt;
      width: 80px;&lt;br /&gt;
      height: 80px;&lt;br /&gt;
    }&lt;br /&gt;
    .m-loading .m-logo .u-text {&lt;br /&gt;
      font-size: 28px;&lt;br /&gt;
    }&lt;br /&gt;
    .m-loading .u-slogan {&lt;br /&gt;
      margin-top: 24px;&lt;br /&gt;
      font-size: 20px;&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;loadingEl&amp;quot; class=&amp;quot;m-loading&amp;quot; style=&amp;quot;opacity: 0; display: none;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;animationEl&amp;quot; class=&amp;quot;m-animation&amp;quot; style=&amp;quot;opacity: 1;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;m-logo&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;img class=&amp;quot;u-image&amp;quot; src=&amp;quot;./集智百科概览_files/logo.jpg&amp;quot; alt=&amp;quot;logo&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;u-text&amp;quot;&amp;gt;欢迎来到 &amp;lt;b&amp;gt;集智百科&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;u-slogan&amp;quot;&amp;gt;&amp;lt;i&amp;gt;知识从我而来，问题到我为止&amp;lt;/i&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;container&amp;quot; class=&amp;quot;m-graph&amp;quot; style=&amp;quot;user-select: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: relative;&amp;quot; _echarts_instance_=&amp;quot;ec_1761038362008&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;position: relative; width: 2388px; height: 1188px; padding: 0px; margin: 0px; border-width: 0px; cursor: default;&amp;quot;&amp;gt;&amp;lt;canvas data-zr-dom-id=&amp;quot;zr_0&amp;quot; width=&amp;quot;3820&amp;quot; height=&amp;quot;1900&amp;quot; style=&amp;quot;position: absolute; left: 0px; top: 0px; width: 2388px; height: 1188px; user-select: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px; margin: 0px; border-width: 0px;&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;script defer=&amp;quot;&amp;quot; src=&amp;quot;./集智百科概览_files/vcd15cbe7772f49c399c6a5babf22c1241717689176015&amp;quot; integrity=&amp;quot;sha512-ZpsOmlRQV6y907TI0dKBHq9Md29nnaEIPlkf84rnaERnq6zvWvPUqr2ft8M1aS28oN72PdrCzSjY4U6VaAw1EQ==&amp;quot; data-cf-beacon=&amp;quot;{&amp;amp;quot;version&amp;amp;quot;:&amp;amp;quot;2024.11.0&amp;amp;quot;,&amp;amp;quot;token&amp;amp;quot;:&amp;amp;quot;39cdf464f765499c8a52a31cda5e385e&amp;amp;quot;,&amp;amp;quot;r&amp;amp;quot;:1,&amp;amp;quot;server_timing&amp;amp;quot;:{&amp;amp;quot;name&amp;amp;quot;:{&amp;amp;quot;cfCacheStatus&amp;amp;quot;:true,&amp;amp;quot;cfEdge&amp;amp;quot;:true,&amp;amp;quot;cfExtPri&amp;amp;quot;:true,&amp;amp;quot;cfL4&amp;amp;quot;:true,&amp;amp;quot;cfOrigin&amp;amp;quot;:true,&amp;amp;quot;cfSpeedBrain&amp;amp;quot;:true},&amp;amp;quot;location_startswith&amp;amp;quot;:null}}&amp;quot; crossorigin=&amp;quot;anonymous&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;./集智百科概览_files/echarts.min.js.下载&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;./集智百科概览_files/nodes.js.下载&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;./集智百科概览_files/edges.js.下载&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var nodes = window.nodes;&lt;br /&gt;
  var edges = window.edges;&lt;br /&gt;
&lt;br /&gt;
  console.log(nodes);&lt;br /&gt;
  console.log(edges);&lt;br /&gt;
&lt;br /&gt;
  const loadingEl = document.getElementById('loadingEl')&lt;br /&gt;
  const animationEl = document.getElementById('animationEl')&lt;br /&gt;
  animationEl.style.opacity = 1&lt;br /&gt;
  setTimeout(() =&amp;gt; {&lt;br /&gt;
    loadingEl.style.opacity = 0&lt;br /&gt;
    setTimeout(() =&amp;gt; {&lt;br /&gt;
      loadingEl.style.display = 'none'&lt;br /&gt;
    }, 1000)&lt;br /&gt;
  }, 3000)&lt;br /&gt;
  &lt;br /&gt;
  var dom = document.getElementById(&amp;quot;container&amp;quot;);&lt;br /&gt;
  var myChart = echarts.init(dom);&lt;br /&gt;
&lt;br /&gt;
  // 获取节点、连边数据&lt;br /&gt;
  // Promise.all([&lt;br /&gt;
  //   'https://api.swarma.org/api/science_nodes/list',&lt;br /&gt;
  //   'https://api.swarma.org/api/science_edges/list'&lt;br /&gt;
  // ].map(url =&amp;gt; fetch(url, {&lt;br /&gt;
  //   headers: {&lt;br /&gt;
  //     'X-Requested-With': 'XMLHttpRequest',&lt;br /&gt;
  //     'Content-Type': 'application/json'&lt;br /&gt;
  //   }&lt;br /&gt;
  // })&lt;br /&gt;
&lt;br /&gt;
Promise.resolve([nodes, edges]).then(res =&amp;gt; {&lt;br /&gt;
  const linkCount = new Map()&lt;br /&gt;
  const links = res[1].map(item =&amp;gt; {&lt;br /&gt;
    linkCount.set(item.source_id, (linkCount.get(item.source_id) || 0) + 1)&lt;br /&gt;
    linkCount.set(item.target_id, (linkCount.get(item.target_id) || 0) + 1)&lt;br /&gt;
&lt;br /&gt;
    return {&lt;br /&gt;
      source: 'node_' + item.source_id,&lt;br /&gt;
      target: 'node_' + item.target_id&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
&lt;br /&gt;
  const now = Date.now()&lt;br /&gt;
  const RECENT_DAYS = 7&lt;br /&gt;
  const recentUpdatedThreshold = RECENT_DAYS * 24 * 60 * 60 * 1000&lt;br /&gt;
&lt;br /&gt;
  const nodes = res[0].map(item =&amp;gt; {&lt;br /&gt;
    const count = linkCount.get(item.id) || 1&lt;br /&gt;
    const isRecentlyUpdated = item.updated_at &amp;amp;&amp;amp; (now - new Date(item.updated_at)) &amp;lt; recentUpdatedThreshold&lt;br /&gt;
&lt;br /&gt;
    const node = {&lt;br /&gt;
      id: 'node_' + item.id,&lt;br /&gt;
      name: item.name,&lt;br /&gt;
      value: item.id,&lt;br /&gt;
      symbolSize: count &amp;gt;= 15 ? count / 1.5 : 5,&lt;br /&gt;
      category: 'type-' + item.type,&lt;br /&gt;
      tooltip: { formatter: '{b}' },&lt;br /&gt;
      emphasis: { label: { show: true } },&lt;br /&gt;
      url: item.url,&lt;br /&gt;
      updated_at: item.updated_at,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (count &amp;lt; 10 &amp;amp;&amp;amp; !isRecentlyUpdated) {&lt;br /&gt;
      node.label = { show: false }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (isRecentlyUpdated) {&lt;br /&gt;
      node.itemStyle = {&lt;br /&gt;
        // color: '#ff6666',&lt;br /&gt;
        borderColor: '#FFCC00',&lt;br /&gt;
        borderWidth: 3&lt;br /&gt;
      }&lt;br /&gt;
      node.label = {&lt;br /&gt;
        show: true,&lt;br /&gt;
        fontWeight: 'bold',&lt;br /&gt;
        fontSize: 14&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return node&lt;br /&gt;
  })&lt;br /&gt;
&lt;br /&gt;
  const categories = Array.from(new Set(res[0].map(node =&amp;gt; node.type)))&lt;br /&gt;
    .map(type =&amp;gt; ({ name: 'type-' + type }))&lt;br /&gt;
&lt;br /&gt;
  const data = { nodes, links, categories }&lt;br /&gt;
&lt;br /&gt;
  const option = {&lt;br /&gt;
    title: {&lt;br /&gt;
      text: '集智百科概览',&lt;br /&gt;
      subtext: '点击节点前往wiki页面',&lt;br /&gt;
    },&lt;br /&gt;
    tooltip: { show: true },&lt;br /&gt;
    series: [&lt;br /&gt;
      {&lt;br /&gt;
        type: 'graph',&lt;br /&gt;
        layout: 'force',&lt;br /&gt;
        draggable: true,&lt;br /&gt;
        data: data.nodes,&lt;br /&gt;
        links: data.links,&lt;br /&gt;
        categories: data.categories,&lt;br /&gt;
        roam: true,&lt;br /&gt;
        label: {&lt;br /&gt;
          show: true,&lt;br /&gt;
          position: 'bottom'&lt;br /&gt;
        },&lt;br /&gt;
        force: {&lt;br /&gt;
          initLayout: 'circular',&lt;br /&gt;
          repulsion: 200,&lt;br /&gt;
          edgeLength: 100,&lt;br /&gt;
          gravity: 0.05&lt;br /&gt;
        },&lt;br /&gt;
        lineStyle: { opacity: 0.3 },&lt;br /&gt;
        emphasis: { focus: 'adjacency' }&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  myChart.setOption(option)&lt;br /&gt;
&lt;br /&gt;
  myChart.dispatchAction({&lt;br /&gt;
    type: 'graphRoam',&lt;br /&gt;
    zoom: 0.15  // 缩小为50%，可以根据需要调整，如0.3、0.7等&lt;br /&gt;
  })&lt;br /&gt;
&lt;br /&gt;
  // 添加点击跳转功能&lt;br /&gt;
  myChart.on('click', function (event) {&lt;br /&gt;
    if (event.dataType === 'node' &amp;amp;&amp;amp; event.data.url) {&lt;br /&gt;
      window.open(event.data.url, undefined, 'noopener')&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
&lt;br /&gt;
  // 添加 effectScatter 闪烁层（在图渲染后添加）&lt;br /&gt;
  myChart.on('finished', function () {&lt;br /&gt;
    const graphSeries = myChart.getOption().series.find(s =&amp;gt; s.type === 'graph')&lt;br /&gt;
    const recentEffectPoints = []&lt;br /&gt;
&lt;br /&gt;
    for (let i = 0; i &amp;lt; graphSeries.data.length; i++) {&lt;br /&gt;
      const node = graphSeries.data[i]&lt;br /&gt;
      if (node.itemStyle &amp;amp;&amp;amp; node.itemStyle.borderColor === '#ff0000' &amp;amp;&amp;amp; node.x != null &amp;amp;&amp;amp; node.y != null) {&lt;br /&gt;
        recentEffectPoints.push({&lt;br /&gt;
          name: node.name,&lt;br /&gt;
          value: [node.x, node.y],&lt;br /&gt;
          symbolSize: node.symbolSize + 10&lt;br /&gt;
        })&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (recentEffectPoints.length &amp;gt; 0) {&lt;br /&gt;
      myChart.setOption({&lt;br /&gt;
        series: [&lt;br /&gt;
          ...myChart.getOption().series,&lt;br /&gt;
          {&lt;br /&gt;
            type: 'effectScatter',&lt;br /&gt;
            coordinateSystem: null,&lt;br /&gt;
            data: recentEffectPoints,&lt;br /&gt;
            rippleEffect: {&lt;br /&gt;
              scale: 2.5,&lt;br /&gt;
              brushType: 'stroke'&lt;br /&gt;
            },&lt;br /&gt;
            itemStyle: {&lt;br /&gt;
              color: '#ff0000'&lt;br /&gt;
            },&lt;br /&gt;
            z: 100&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      })&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
&lt;br /&gt;
  window.addEventListener('resize', function () {&lt;br /&gt;
    myChart.resize()&lt;br /&gt;
  })&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  window.addEventListener('resize', function () {&lt;br /&gt;
    myChart.resize()&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fynn7</name></author>
	</entry>
</feed>