YM
2024-07-26 fe85e4208e502c78e3494a460617ae8753f51341
src/pages/inherit/index.vue
@@ -1,19 +1,58 @@
<template>
  <view class="">
  <view>
    <headNav
      idIndex="2"
      :searchBg="false"
      text="中医世医传承数据库"
      text="家学传承"
      bg="/static/image/topBg1.png"
      bg1="/static/image/line1.png"
    />
    <div class="filterBox font-family">
      <div class="searchBox">
        <input type="text" v-model="keyword" placeholder="请输入关键字" />
        <input
          type="text"
          v-model="keyword"
          @confirm="search"
          placeholder="请输入关键字"
          style="padding-right: 54px; box-sizing: border-box"
        />
        <span
          class="cleanupBtn"
          v-if="keyword"
          @click="keyword = ''"
          style="
            position: absolute;
            top: 50%;
            margin-top: -10px;
            right: 84px;
            color: #fff;
            z-index: 2;
            display: inline-block;
            width: 20px;
            height: 20px;
            text-align: center;
            line-height: 20px;
            background-color: #a5a5a5;
            font-weight: bold;
            border-radius: 50%;
            font-size: 12px;
            cursor: pointer;
          "
          >✖</span
        >
        <button @click="search">搜索</button>
        <span
          class="openSearch"
          @click="
            () => {
              openSearch = !openSearch;
            }
          "
          >高级搜索{{ openSearch ? "∧" : "∨" }}</span
        >
      </div>
      <div class="dynasty">
      <div class="dynasty" v-if="openSearch">
        <div style="font-weight: 700; line-height: 0.25rem">筛选朝代</div>
        <div class="filterList">
          <div
@@ -32,7 +71,7 @@
          </div>
        </div>
      </div>
      <div class="condition">
      <div class="condition"  v-if="openSearch">
        <div style="font-weight: 700; line-height: 0.25rem">条件选择</div>
        <div class="filterList">
          <div class="conditionItem" @click="changeCondition(3)">
@@ -65,15 +104,26 @@
          </div>
        </div>
      </div>
      <div style="padding-left: 0.5rem; margin-top: 20px">
        共 {{ this.nodeData.length }}个世医
      <div style="padding-left: 0.5rem; margin-top: 0.1rem">
        共 {{ totalCount }}个世医
      </div>
    </div>
    <div class="contentBox">
      <!-- echarts图 -->
      <div v-if="nodeData.length > 0" class="barChart" ref="barChart"></div>
      <div v-else>
        <el-empty description="暂无数据"></el-empty>
      <div id="barChart" ref="barChart"></div>
      <div
        v-if="!loading && nodeData.length == 0"
        style="
          position: absolute;
          top: 30%;
          left: 0;
          right: 0;
          text-align: center;
          font-size: 0.2rem;
          color: #666;
        "
      >
        暂无搜索数据
      </div>
      <div
        class="toolBox"
@@ -81,7 +131,13 @@
        :style="{ top: toolTop, left: toolLeft }"
      >
        <div class="toolItem" @click="gotoDetail(1)">个人信息</div>
        <div class="toolItem" @click="gotoDetail(2)">世医文化</div>
        <div
          class="toolItem"
          style="position: relative; top: -40px"
          @click="gotoDetail(2)"
        >
          世医文化
        </div>
        <div class="toolItem" @click="gotoDetail(3)">世医传承</div>
      </div>
    </div>
@@ -90,92 +146,98 @@
<script>
import * as echarts from "echarts";
import {
  getNodeCount,
  inheritMedicalSataStatistics,
  inheritMedicalList,
  inheritMedicalList
} from "@/api/index.js";
export default {
  data() {
    return {
      loading: true,
      // 标题顶部栏需要的东西
      keyword: "",
      idIndex: 0,
      activeId: 28,
      conditionId: "",
      searchType: "KEYWORD",
      searchType: "DYNASTY",
      dynasty: [],
      nodeData: [],
      showTool: false,
      toolTop: 0,
      toolLeft: 0,
      toolInfo: {},
      totalCount: 0,
      openSearch: false
    };
  },
  onLoad(options) {
    this.idIndex = options.id;
    console.log("optionsoptionsoptions", options.id);
    // getDynasty();
  },
  mounted() {
    this.getStatistics();
    // this.getDynasty();
  },
  methods: {
    getStatistics() {
      inheritMedicalSataStatistics().then((res) => {
        this.dynasty = res.object;
        const defaultDynasty = this.dynasty.find((f) => f.dynasty == "宋");
        this.activeId = defaultDynasty.dynastyId;
        this.searchType = "DYNASTY";
        this.activeId = this.dynasty[0].dynastyId;
        this.getData();
      });
    },
    getData() {
      this.loading = true;
      this.nodeData = [];
      // const defaultDynasty = this.dynasty.find(f.dynasty == "宋");
      this.showTool = false;
      inheritMedicalList({
        keywords: this.keyword,
        dynastyId: this.activeId,
        searchType: this.searchType,
        path: this.conditionId,
        path: this.conditionId
      }).then((res) => {
        console.log(res);
        for (let i = 0; i < res.object.nodeList.length; i++) {
          const node = res.object.nodeList[i];
          if (
            this.nodeData.findIndex((citem) => citem.name == node.name) == -1
          ) {
            this.nodeData.push({
              ...node,
              itemStyle: {
                color: "#F8E2D7",
                borderColor: "#F3AA78",
                borderWidth: "3",
              },
            });
          }
          this.nodeData.push({
            ...node,
            id: node.identifier,
            itemStyle: {
              color: "#F8E2D7",
              borderColor: "#F3AA78",
              borderWidth: "3"
            }
          });
        }
        console.log(this.nodeData, "nodeData");
        getNodeCount({
          keywords: this.keyword,
          dynastyId: this.activeId,
          searchType: this.searchType,
          path: this.conditionId
        }).then((res) => {
          this.totalCount = res.object.totalCount;
        });
        console.log(this.nodeData, "this.nodeData");
        this.loading = false;
        // 初始化 echarts
        this.initBarChart();
      });
    },
    initBarChart() {
      // WMBg
      //通过 $ref 进行挂载
      let myChart = echarts.init(this.$refs.barChart);
      var chartDom = document.getElementById("barChart");
      let myChart = echarts.init(chartDom);
      let FontSize = 12; // 字体大小
      let FontSize = 18; // 字体大小
      let BorderWidth = 2; // 边框大小
      let SymbolSize = 80; // 尺寸距离
      let Distance = 10;
      // 不同尺寸下修改echarts的字体
      if (window.innerWidth > 2560 && window.innerWidth <= 3840) {
        FontSize = 28;
        FontSize = 20;
        BorderWidth = 5;
        SymbolSize = 100;
        Distance = 33;
      } else if (window.innerWidth > 1920 && window.innerWidth <= 2560) {
        FontSize = 28;
        FontSize = 20;
        BorderWidth = 4;
        SymbolSize = 90;
        Distance = 22;
@@ -188,14 +250,14 @@
      let option = {
        title: {
          text: [""],
          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: {},
        animationDurationUpdate: 1500,
@@ -204,13 +266,13 @@
          {
            type: "graph",
            layout: "force",
            symbolSize: 120,
            symbolSize: 100,
            //是否允许用户拖动图片
            roam: true,
            label: {
              show: true,
              color: "black", // 设置节点文字颜色为黑色
              fontSize: FontSize, // 设置文字大小
              fontSize: FontSize // 设置文字大小
            },
            edgeSymbol: ["circle", "arrow"],
            edgeSymbolSize: [4, 10],
@@ -225,7 +287,7 @@
                // params.data 是边的数据对象,你可以在这里定义关系名
                // 例如,你可以根据 source 和 target 的名称来定义关系名
                return params.data.relationName; // 如果定义了 relationName 则显示它,否则显示“父子”
              },
              }
            },
            //各个节点
            data: this.nodeData,
@@ -233,38 +295,75 @@
              color: "#000000",
              opacity: 0.9,
              width: 2,
              curveness: 0,
              curveness: 0
            },
            force: {
              layoutAnimation: false,
              // initLayout: 'circular',
              // gravity: 0
              // gravity: 0,
              friction: 0.1,
              repulsion: 500,
              edgeLength: 6,
              edgeLength: 6
            },
          },
        ],
            selectedMode: "single",
            select: {
              itemStyle: {
                color: "#e8f3ff",
                borderColor: "#284e74",
                borderWidth: "3"
              }
            }
          }
        ]
      };
      let selectData = [];
      //进行渲染
      myChart.setOption(option);
      // myChart.getZr().on("click", (params) => {
      //   console.log(params);
      //   console.log(selectData);
      //   if (!params.target) {
      //     this.showTool = false;
      //   }
      // });
      myChart.on("click", (params) => {
        console.log(params.event.offsetX, params.event.offsetY);
        if (params.componentType === "series") {
          this.showTool = true;
          this.toolTop = params.event.offsetY + "px";
          this.toolLeft = params.event.offsetX + "px";
          this.toolInfo = {
            id: params.data.identifier,
            name: encodeURIComponent(params.data.name),
          };
        if (selectData.length > 0) {
          let x = params.event.target.transform[4];
          let y = params.event.target.transform[5];
          if (params.componentType === "series") {
            this.showTool = true;
            this.toolTop = y - 70 + "px";
            this.toolLeft = x - 163 + "px";
            this.toolInfo = {
              id: params.data.identifier,
              name: encodeURIComponent(params.data.name)
            };
          } else {
            this.showTool = false;
          }
        }
      });
      myChart.on("selectchanged", (params) => {
        if (params.fromAction == "select") {
          selectData = params.selected[0].dataIndex;
        } else {
          selectData = [];
          this.showTool = false;
        }
      });
      myChart.on("graphroam", (params) => {
        this.showTool = false;
        myChart.dispatchAction({
          type: "unselect",
          dataIndex: selectData
        });
      });
    },
    gotoDetail(type) {
      switch (type) {
        case 1:
          uni.navigateTo({
            url: "/pages/character/detail?id=" + this.toolInfo.id,
            url: "/pages/character/detail?id=" + this.toolInfo.id
          });
          break;
        case 2:
@@ -275,7 +374,7 @@
              "&id=" +
              this.toolInfo.id +
              "&name=" +
              this.toolInfo.name,
              this.toolInfo.name
          });
          break;
        case 3:
@@ -286,7 +385,7 @@
              "&id=" +
              this.toolInfo.id +
              "&name=" +
              this.toolInfo.name,
              this.toolInfo.name
          });
          break;
      }
@@ -326,8 +425,8 @@
        this.keyword = "";
      }
      this.getData();
    },
  },
    }
  }
};
</script>
<style scoped>
@@ -352,7 +451,7 @@
  height: 80vh;
  position: relative;
}
.barChart {
#barChart {
  width: 100%;
  height: 100%;
}
@@ -368,6 +467,7 @@
  font-size: 0.12rem;
  cursor: pointer;
  background-color: #fff;
  display: inline-block;
}
.toolItem:hover {
  background-color: #efefef;
@@ -388,17 +488,18 @@
  align-items: center;
  margin: 0 auto;
  margin-top: 0.2rem;
  position: relative;
}
.searchBox > input {
  border: none;
  outline: none;
  margin: auto;
  width: 100%;
  flex: 1;
  overflow: hidden;
  padding-left: 20px;
}
.searchBox > button {
  width: 10%;
  color: white;
  height: 40px;
  line-height: 40px;
@@ -406,16 +507,24 @@
  border-radius: 50px;
  margin-right: 10rpx;
}
.searchBox .openSearch {
  position: absolute;
  right: -100px;
  font-size: 14px;
  cursor: pointer;
}
.dynasty {
  display: flex;
  margin-top: 0.2rem;
  width: 100%;
  padding: 0.1rem 0.5rem;
  padding: 0 0.5rem;
}
.condition {
  display: flex;
  width: 100%;
  padding: 0.1rem 0.5rem;
  padding: 0 0.5rem;
}
.filterList {
  flex: 1;
@@ -428,22 +537,22 @@
  box-shadow: 1px 1px 5px #888888;
  align-items: center;
  justify-content: center;
  width: 1rem;
  height: 0.25rem;
  height: 0.3rem;
  margin-left: 0.2rem;
  border-radius: 0.13rem;
  float: left;
  margin-top: 0.02rem;
  margin-bottom: 0.1rem;
  cursor: pointer;
  padding: 0 0.1rem;
}
.conditionItem {
  display: flex;
  box-shadow: 1px 1px 5px #888888;
  align-items: center;
  justify-content: center;
  width: 1.3rem;
  height: 0.25rem;
  padding: 0 0.1rem;
  height: 0.3rem;
  float: left;
  margin-left: 0.2rem;
  border-radius: 0.13rem;
@@ -463,7 +572,7 @@
}
.filterText {
  margin-left: 10px;
  font-size: 16px;
  font-size: 0.14rem;
}
.fontColor {
  color: #827e44 !important;