杨磊
2024-06-12 d27da0d7b2f5cc3cc97622158b7f14a7faabb05b
src/pages/inherit/list.vue
@@ -1,7 +1,7 @@
<template>
  <view class="">
  <view>
    <headNav
      :idIndex="idIndex"
      idIndex="2"
      :searchBg="false"
      text="中医世医传承数据库"
      bg="/static/image/topBg1.png"
@@ -17,7 +17,7 @@
          >返回</el-button
        >
        <h3 style="margin-left: 0.22rem; font-size: 0.28erm; font-weight: 500">
          邵登瀛
          {{ mainName }}
        </h3>
      </view>
      <ul class="flex tabBox">
@@ -34,7 +34,7 @@
          世医文化
        </li>
      </ul>
      <view class="" style="width: 1rem"></view>
      <view style="width: 1rem"></view>
    </view>
    <view v-if="showType == 1" class="legendBox">
      <view class="socialMappingBox" @click="showSocialMapping">
@@ -56,570 +56,323 @@
    <!-- echarts图 -->
    <div v-if="showType == 1" class="barChart" id="barChart"></div>
    <view v-if="showType == 2" class="cultureBox">
      <view class="cultureItem">
      <view class="cultureItem" v-if="culture1">
        <view class="imgBox">
          <img src="@/static/image/inherit/icon1.png" alt="" />
          <img src="@/static/image/inherit/icon1.svg" alt="" />
        </view>
        <p>
          蕙展丁丑同里日岩额序先考月池翁著《四彭酸明》八卷,皆精指奥室,茂犀未能疯造,珍因撮粹想菜,僵撰此唐,以便智睛,服指南。世之雷病雨家,咸以服焉首务,不知派乃四能之末,谓之巧者雨。上士欲舍其全,非四不可。
        </p>
        <h4>——《奇八服考》P 3</h4>
        <p>{{ culture1.content }}</p>
        <h4 v-if="culture1.source">
          ——《{{ culture1.source }}》P {{ culture1.pageNo }}
        </h4>
      </view>
      <view class="cultureItem">
      <view class="cultureItem" v-if="culture2">
        <view class="imgBox">
          <img src="@/static/image/inherit/icon2.png" alt="" />
          <img src="@/static/image/inherit/icon2.svg" alt="" />
        </view>
        <p>瀕湖世儒,兼以醫鳴,一門父子兄弟富有著述,此特見一斑耳。</p>
        <h4>——《奇八服考》P 3</h4>
        <p>{{ culture2.content }}</p>
        <h4 v-if="culture2.source">
          ——《{{ culture2.source }}》P {{ culture2.pageNo }}
        </h4>
      </view>
      <view class="cultureItem">
      <view class="cultureItem" v-if="culture3">
        <view class="imgBox">
          <img src="@/static/image/inherit/icon3.png" alt="" />
          <img src="@/static/image/inherit/icon3.svg" alt="" />
        </view>
        <p>
          病坊刻瀕湖《本草》之因仍訛誤,爰重爲鍥板。經始於癸未八月,迄乙酉五月,閱二歲,糜工數萬,乃克葳事。其校理訛誤,監督剞劂,命兒子席珍、士瑜、士珩分任之;商榷方劑,區別品彙,醫士王君鏡堂之力爲多;參以鍾君受白;而經紀其事,始終不懈者,則范君靜存也。此外如田君撰異、曹君晴峯、熊君仲山、翁君鐵梅、黨君幼雲、張君貫之、程君達三、陳君振遠、許君功甫、朱君藻臣、或參校讐,或司綜核,或職圖繪,謹備書之
        </p>
        <h4>——《奇八服考》P 3</h4>
        <p>{{ culture3.content }}</p>
        <h4 v-if="culture3.source">
          ——《{{ culture3.source }}》P {{ culture3.pageNo }}
        </h4>
      </view>
      <div
        v-if="!culture1 && !culture2 && !culture3"
        style="color: #666; text-align: center; font-size: 16px"
      >
        世医文化无数据
      </div>
    </view>
  </view>
</template>
<script>
import * as echarts from "echarts";
import G6 from "@antv/g6";
import {
  inheritMedicalCultureList,
  inheritMedicalRelationList,
} from "@/api/index.js";
export default {
  data() {
    return {
      // 标题顶部栏需要的东西
      idIndex: 0,
      mainName: "",
      activeIndex: 1,
      dataList: [
        {
          name: "薛雪",
          x: 300,
          y: 300,
          itemStyle: {
            color: "#F8E2D7",
            borderColor: "#F3AA78",
            borderWidth: "3"
          }
        },
        {
          name: "邵登瀛",
          x: 400,
          y: 300,
          itemStyle: {
            color: "#F8E2D7",
            borderColor: "#F3AA78",
            borderWidth: "3"
          }
        },
        {
          name: "邵鲁瞻",
          x: 500,
          y: 300,
          itemStyle: {
            color: "#F8E2D7",
            borderColor: "#F3AA78",
            borderWidth: "3"
          }
        },
        {
          name: "邵春泉",
          x: 600,
          y: 300,
          itemStyle: {
            color: "#F8E2D7",
            borderColor: "#F3AA78",
            borderWidth: "3"
          }
        },
        {
          name: "徐锦",
          x: 650,
          y: 400,
          itemStyle: {
            color: "#DCE7EB",
            borderColor: "#5F81A4",
            borderWidth: "3"
          }
        },
        {
          name: "邵丙扬",
          x: 700,
          y: 300,
          itemStyle: {
            color: "#F8E2D7",
            borderColor: "#F3AA78",
            borderWidth: "3"
          }
        },
        {
          name: "冯桂芬",
          x: 720,
          y: 400,
          itemStyle: {
            color: "#DCE7EB",
            borderColor: "#5F81A4",
            borderWidth: "3"
          }
        },
        {
          name: "李鸿章",
          x: 740,
          y: 500,
          itemStyle: {
            color: "#E1E1E1",
            borderColor: "#888888",
            borderWidth: "3"
          }
        },
        {
          name: "邵景尧",
          x: 800,
          y: 200,
          itemStyle: {
            color: "#F8E2D7",
            borderColor: "#F3AA78",
            borderWidth: "3"
          }
        },
        {
          name: "邵景康",
          x: 800,
          y: 400,
          itemStyle: {
            color: "#F8E2D7",
            borderColor: "#F3AA78",
            borderWidth: "3"
          }
        },
        {
          name: "鲍昇",
          x: 750,
          y: 100,
          itemStyle: {
            color: "#DCE7EB",
            borderColor: "#5F81A4",
            borderWidth: "3"
          }
        },
        {
          name: "文龙",
          x: 850,
          y: 100,
          itemStyle: {
            color: "#DCE7EB",
            borderColor: "#5F81A4",
            borderWidth: "3"
          }
        },
        {
          name: "傅庆贻",
          x: 950,
          y: 50,
          itemStyle: {
            color: "#DCE7EB",
            borderColor: "#5F81A4",
            borderWidth: "3"
          }
        },
        {
          name: "成允",
          x: 950,
          y: 100,
          itemStyle: {
            color: "#DCE7EB",
            borderColor: "#5F81A4",
            borderWidth: "3"
          }
        },
        {
          name: "胡玉坦",
          x: 950,
          y: 150,
          itemStyle: {
            color: "#DCE7EB",
            borderColor: "#5F81A4",
            borderWidth: "3"
          }
        },
        {
          name: "裕禄",
          x: 950,
          y: 200,
          itemStyle: {
            color: "#DCE7EB",
            borderColor: "#5F81A4",
            borderWidth: "3"
          }
        },
        {
          name: "陆乃昔",
          x: 950,
          y: 250,
          itemStyle: {
            color: "#DCE7EB",
            borderColor: "#5F81A4",
            borderWidth: "3"
          }
        },
        {
          name: "刘传祺",
          x: 950,
          y: 300,
          itemStyle: {
            color: "#DCE7EB",
            borderColor: "#5F81A4",
            borderWidth: "3"
          }
        },
        {
          name: "邵诚",
          x: 950,
          y: 350,
          itemStyle: {
            color: "#DCE7EB",
            borderColor: "#5F81A4",
            borderWidth: "3"
          }
        },
        {
          name: "曾国藩",
          x: 1050,
          y: 200,
          itemStyle: {
            color: "#E1E1E1",
            borderColor: "#888888",
            borderWidth: "3"
          }
        },
        {
          name: "曾国藩01",
          x: 1050,
          y: 50,
          itemStyle: {
            color: "#E1E1E1",
            borderColor: "#888888",
            borderWidth: "3"
          }
        },
        {
          name: "曾国藩02",
          x: 1050,
          y: 350,
          itemStyle: {
            color: "#E1E1E1",
            borderColor: "#888888",
            borderWidth: "3"
          }
        }
      ],
      links: [
        {
          source: "薛雪",
          target: "邵登瀛",
          relationName: "师徒",
          hasArrow: "true"
        },
        {
          source: "邵登瀛",
          target: "邵鲁瞻",
          relationName: "父子"
        },
        {
          source: "邵鲁瞻",
          target: "邵春泉",
          relationName: "父子"
        },
        {
          source: "邵春泉",
          target: "邵丙扬",
          relationName: "叔侄"
        },
        //曲线
        {
          source: "邵春泉",
          target: "徐锦",
          relationName: "朋友",
          //这里设置为不带箭头
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1",
            curveness: -0.2
          }
        },
        {
          source: "邵丙扬",
          target: "邵景尧",
          relationName: "父子"
        },
        {
          source: "邵丙扬",
          target: "邵景康",
          relationName: "父子"
        },
        //曲线
        {
          source: "邵丙扬",
          target: "冯桂芬",
          relationName: "朋友",
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1",
            curveness: -0.2
          }
        },
        //曲线
        {
          source: "邵丙扬",
          target: "鲍昇",
          relationName: "师徒",
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1",
            curveness: 0.2
          }
        },
        //曲线
        {
          source: "冯桂芬",
          target: "李鸿章",
          relationName: "同僚",
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1",
            curveness: -0.2
          }
        },
        {
          source: "邵景尧",
          target: "邵景康",
          relationName: "兄弟"
        },
        {
          source: "邵景康",
          target: "邵景尧",
          relationName: "兄弟"
        },
        {
          source: "邵景尧",
          target: "鲍昇",
          relationName: "姻亲",
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1",
            curveness: -0.2
          }
        },
        {
          source: "邵景尧",
          target: "文龙",
          relationName: "朋友",
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1",
            curveness: 0.2
          }
        },
        {
          source: "邵景尧",
          target: "傅庆贻",
          relationName: "同僚",
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1",
            curveness: -0.1
          }
        },
        {
          source: "邵景尧",
          target: "成允",
          relationName: "同僚",
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1",
            curveness: -0.2
          }
        },
        {
          source: "邵景尧",
          target: "胡玉坦",
          relationName: "同僚",
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1",
            curveness: -0.2
          }
        },
        {
          source: "邵景尧",
          target: "裕禄",
          relationName: "同僚",
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1",
            curveness: -0.2
          }
        },
        {
          source: "邵景尧",
          target: "陆乃昔",
          relationName: "同僚",
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1",
            curveness: -0.2
          }
        },
        {
          source: "邵景尧",
          target: "刘传祺",
          relationName: "同僚",
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1",
            curveness: -0.2
          }
        },
        {
          source: "邵景尧",
          target: "邵诚",
          relationName: "同僚",
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1",
            curveness: -0.2
          }
        },
        {
          source: "成允",
          target: "曾国藩",
          relationName: "同僚",
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1"
          }
        },
        {
          source: "胡玉坦",
          target: "曾国藩",
          relationName: "同僚",
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1"
          }
        },
        {
          source: "裕禄",
          target: "曾国藩",
          relationName: "同僚",
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1"
          }
        },
        {
          source: "陆乃昔",
          target: "曾国藩",
          relationName: "同僚",
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1"
          }
        },
        {
          source: "刘传祺",
          target: "曾国藩",
          relationName: "同僚",
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1"
          }
        },
        {
          source: "成允",
          target: "曾国藩",
          relationName: "同僚",
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1"
          }
        },
        {
          source: "成允",
          target: "曾国藩",
          relationName: "同僚",
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1"
          }
        },
        {
          source: "成允",
          target: "曾国藩",
          relationName: "同僚",
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1"
          }
        },
        {
          source: "傅庆贻",
          target: "曾国藩01",
          relationName: "同僚",
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1"
          }
        },
        {
          source: "邵诚",
          target: "曾国藩02",
          relationName: "同僚",
          symbol: ["none", "none"],
          lineStyle: {
            color: "#6584B1"
          }
        }
      ],
      dataList: [],
      links: [],
      socialMapping: true,
      showType: "1"
      showType: "1",
      culture1: null,
      culture2: null,
      culture3: null,
    };
  },
  onLoad(options) {
    this.idIndex = options.id;
    console.log("optionsoptionsoptions", options.id);
    this.mainName = decodeURIComponent(options.name);
    this.type = options.type;
  },
  mounted() {
    // 初始化 echarts
    this.initBarChart(this.dataList, this.links);
    if (this.type) {
      this.changeType(this.type);
    }
    this.getData();
  },
  methods: {
    getData() {
      inheritMedicalRelationList({
        identifier: this.idIndex,
        socialFlag: true,
      }).then((res) => {
        this.dataList = res.object;
        // 处理节点颜色
        // this.links = [];
        // for (let i = 0; i < data.edgeList.length; i++) {
        //   const linkItem = data.edgeList[i];
        //   const index = data.nodeList.findIndex(
        //     (item) =>
        //       item.identifier ==
        //       (linkItem.endId == this.idIndex
        //         ? linkItem.startId
        //         : linkItem.endId)
        //   );
        //   if (linkItem.relationType == "亲属关系") {
        //     data.nodeList[index].linkType = 1;
        //     data.nodeList[index].color = "#F8E2D7";
        //     data.nodeList[index].borderColor = "#F3AA78";
        //   }
        //   if (linkItem.relationType == "社会关系") {
        //     data.nodeList[index].linkType = 2;
        //     data.nodeList[index].color = "#ecf4fe";
        //     data.nodeList[index].borderColor = "#597aa5";
        //   }
        //   this.links.push({
        //     source: data.nodeList.find(
        //       (item) => item.identifier == linkItem.startId
        //     ).name,
        //     target: data.nodeList.find(
        //       (item) => item.identifier == linkItem.endId
        //     ).name,
        //     relationType: linkItem.relationType,
        //     label: {
        //       show: true,
        //       formatter: function (params) {
        //         // 使用函数动态生成标签内容
        //         // return relationships.find(rel => rel.source === nodes[params.data
        //         //       .source] && rel.target === nodes[params.data.target])
        //         //    .relation;
        //         return linkItem.relation;
        //       }, // 设置关系标签内容为"Child-Parent"
        //       color: "#2C2C2C",
        //       fontSize: 16,
        //       backgroundColor: "rgba(255, 255, 255, 1)",
        //       padding: [3, 8],
        //       borderRadius: 30,
        //       position: "middle", // 设置标签文本在线的中间位置上居中显示
        //       // z: -1, // 设置标签的z轴高度,使其比连接线更高
        //       distance: -10 // 将标签放置在连接线上
        //     }
        //   });
        // }
        // this.dataList = data.nodeList.map((item) => {
        //   return {
        //     ...item,
        //     itemStyle: {
        //       color: item.identifier == this.idIndex ? "#F8E2D7" : item.color,
        //       borderColor:
        //         item.identifier == this.idIndex ? "#F3AA78" : item.borderColor,
        //       borderWidth: "3"
        //     }
        //   };
        // });
        setTimeout(() => {
          // this.initBarChart();
          document.getElementById("barChart").innerHTML = "";
          this.initG6Chart();
        }, 150);
      });
      // 世医文化
      inheritMedicalCultureList({
        identifier: this.idIndex,
      }).then((res) => {
        this.culture1 = res.list.find((item) => item.typeName == "家风");
        this.culture2 = res.list.find((item) => item.typeName == "医德");
        this.culture3 = res.list.find((item) => item.typeName == "家训");
      });
    },
    showSocialMapping() {
      this.socialMapping = !this.socialMapping;
      let newDataList = [];
      let newLinks = [];
      if (this.socialMapping) {
        newDataList = [...this.dataList];
        newLinks = [...this.links];
      if (!this.socialMapping) {
        this.socialRelationsData(this.dataList.children);
        console.log(this.dataList, "dataList");
        document.getElementById("barChart").innerHTML = "";
        this.initG6Chart();
      } else {
        newDataList = this.dataList.filter(
          (item) => item.itemStyle.borderColor == "#F3AA78"
        );
        newLinks = [...this.links];
        this.getData();
      }
      this.initBarChart(newDataList, newLinks);
      // this.initBarChart(newDataList, newLinks);
    },
    socialRelationsData(data) {
      if (data && data.length) {
        for (let i = 0; i < data.length; i++) {
          const item = data[i];
          if (item?.relationInfo?.relationType == "社会关系") {
            data.splice(i, 1);
          }
          if (item.children.length > 0) {
            this.socialRelationsData(item.children);
          }
        }
      }
    },
    changeType(type) {
      this.showType = type;
      if (type == 1) {
        setTimeout(() => {
          this.socialMapping = true;
          this.initBarChart(this.dataList, this.links);
          // this.initBarChart(this.dataList, this.links);
          document.getElementById("barChart").innerHTML = "";
          this.initG6Chart();
        }, 50);
      }
    },
    initBarChart(dataList, links) {
    getChartData(dataList) {
      if (dataList && dataList.length) {
        const G6Data = dataList.map((f) => {
          return {
            id: f.name,
            personId: f.personId,
            relationInfo: f?.relationInfo?.relation
              ? f.relationInfo.relation
              : "",
            relationType:
              f?.relationInfo?.relationType == "社会关系" ? true : false,
            children:
              f.children.length > 0 ? this.getChartData(f.children) : [],
          };
        });
        return G6Data;
      }
    },
    initG6Chart() {
      console.log(this.dataList, "dataList");
      console.log(this.links, "links");
      console.log(this.getChartData(this.dataList.children), "123123");
      var barChart = document.getElementById("barChart");
      const data = {
        isRoot: true,
        id: this.dataList.name,
        style: {
          fill: "red",
        },
        children:
          this.dataList?.children.length > 0
            ? this.getChartData(this.dataList.children)
            : [],
      };
      const width = barChart.scrollWidth;
      const height = barChart.scrollHeight || 500;
      this.graph = new G6.TreeGraph({
        container: "barChart",
        width,
        height,
        linkCenter: true,
        modes: {
          default: [
            // {
            //   type: "collapse-expand",
            //   onChange: function onChange(item, collapsed) {
            //     const data = item.get("model");
            //     data.collapsed = collapsed;
            //     return true;
            //   },
            // },
            "drag-canvas",
            "zoom-canvas",
          ],
        },
        defaultNode: {
          size: 30,
        },
        layout: {
          type: "compactBox",
          direction: "LR",
          getId: function getId(d) {
            return d.id;
          },
          getHeight: function getHeight() {
            return 16;
          },
          getWidth: function getWidth() {
            return 16;
          },
          getVGap: function getVGap() {
            return 30;
          },
          getHGap: function getHGap() {
            return 100;
          },
        },
      });
      this.graph.node(function (node) {
        return {
          size: 38,
          anchorPoints: [
            [0, 0.5],
            [1, 0.5],
          ],
          style: {
            fill: node.relationType ? "#EDF4FF" : "#FCEFE3",
            stroke: node.relationType ? "#5E7AA7" : "#D3791E",
          },
          label: node.id,
          labelCfg: {
            position: "center",
            offset: 5,
            style: {
              fill: "#000",
              fontSize: 12,
            },
          },
        };
      });
      this.graph.edge(function (node) {
        return {
          type: "cubic-horizontal",
          color: "#A3B1BF",
          label: node.target._cfg?.model.relationInfo,
        };
      });
      this.graph.on("node:click", (e) => {
        const nodeItem = e.item._cfg.model; // 获取被点击的节点元素对象
        console.log("单击", nodeItem);
        if (nodeItem?.personId) {
          uni.navigateTo({
            url: "/pages/character/detail?id=" + nodeItem?.personId,
          });
        } else {
          uni.navigateTo({
            url: "/pages/character/detail?id=" + this.idIndex,
          });
        }
      });
      this.graph.data(data);
      this.graph.render();
      this.graph.fitView();
    },
    initBarChart() {
      // WMBg
      //通过 $ref 进行挂载
      var barChart = document.getElementById("barChart");
@@ -648,57 +401,43 @@
      }
      let option = {
        title: {
          text: [""]
        },
        backgroundColor: {
          type: "image",
          image: "./static/image/WMBg.png",
          repeat: "repeat-x", // 是否平铺,可以是 'repeat-x', 'repeat-y', 'no-repeat'
          size: "100% 100%", // 背景图片的尺寸,可以是百分比或者像素
          position: "center center" // 背景图片的位置,可以是 top, bottom, middle 或者百分比
          position: "center center", // 背景图片的位置,可以是 top, bottom, middle 或者百分比
        },
        tooltip: {},
        animationEasingUpdate: "quinticInOut",
        series: [
          {
            type: "graph",
            layout: "none",
            type: "tree",
            symbolSize: SymbolSize + 20,
            //是否允许用户拖动图片
            roam: false,
            roam: true,
            label: {
              show: true,
              color: "black", // 设置节点文字颜色为黑色
              fontSize: FontSize // 设置文字大小
              fontSize: FontSize, // 设置文字大小
            },
            edgeSymbol: ["circle", "arrow"],
            edgeSymbolSize: [4, 10],
            edgeLabel: {
              show: true,
              fontSize: FontSize, //更改两者关系的字体
              position: "middle",
              //这里设置关系文字是否和线段重叠
              //   padding: [0, 0], // 调整内边距以确保标签与线段紧密贴合
              // verticalAlign: 'middle', // 设置文本的垂直对齐方式为居中
              formatter: function (params) {
                // params.data 是边的数据对象,你可以在这里定义关系名
                // 例如,你可以根据 source 和 target 的名称来定义关系名
                return params.data.relationName || "父子"; // 如果定义了 relationName 则显示它,否则显示“父子”
              }
            },
            //各个节点
            data: dataList, //关系连接
            links: links,
            data: [this.dataList],
            lineStyle: {
              color: "#000000",
              opacity: 0.9,
              width: 2,
              curveness: 0
            }
          }
        ]
              curveness: 0.3,
            },
            force: {
              initLayout: null,
              // gravity: 0
              repulsion: 600,
              edgeLength: 400,
            },
            expandAndCollapse: false,
          },
        ],
      };
      //进行渲染
      myChart.setOption(option);
@@ -706,8 +445,8 @@
    // 返回按钮
    goBack() {
      this.$router.go(-1);
    }
  }
    },
  },
};
</script>
<style scoped>
@@ -733,6 +472,9 @@
  height: 0.24rem;
  font-size: 0.12rem;
  padding: 0;
  border: 1px solid #9e9e9e;
  border-radius: 0;
  color: #000;
}
.barChart {
  width: 100vw;