1
YM
2024-06-05 c4b8209d92daa8c6e8ec20bdd56fecf4a95d0990
src/pages/inherit/index.vue
@@ -1,5 +1,5 @@
<template>
  <view class="">
  <view>
    <headNav
      idIndex="2"
      :searchBg="false"
@@ -10,16 +10,24 @@
    <div class="filterBox font-family">
      <div class="searchBox">
        <input type="text" placeholder="输入姓名/别名/朝代" />
        <button>搜索</button>
        <input type="text" v-model="keyword" placeholder="请输入关键字" />
        <button @click="search">搜索</button>
      </div>
      <div class="dynasty">
        <div style="font-weight: 700; line-height: 0.25rem">筛选朝代</div>
        <div class="filterList">
          <div class="filterItem" v-for="(item, index) in dynasty" :key="index">
            <div class="circleBox" :class="{ bgcColor: item.isColor }"></div>
            <div class="filterText" :class="{ fontColor: item.isColor }">
              {{ item.name + " " + item.number }}
          <div
            class="filterItem"
            v-for="(item, index) in dynasty"
            :key="index"
            @click="changeDynasty(item)"
          >
            <div
              class="circleBox"
              :class="{ active: item.dynastyId === activeId }"
            ></div>
            <div class="filterText">
              {{ item.dynasty + " " + item.count }}
            </div>
          </div>
        </div>
@@ -27,132 +35,163 @@
      <div class="condition">
        <div style="font-weight: 700; line-height: 0.25rem">条件选择</div>
        <div class="filterList">
          <div class="conditionItem">
            <div class="circleBox"></div>
          <div class="conditionItem" @click="changeCondition(3)">
            <div
              class="circleBox"
              :style="{ background: conditionId === 3 ? '#bacd66' : '#9e9e9e' }"
            ></div>
            <div class="filterText">3代传承世医</div>
          </div>
          <div class="conditionItem">
            <div class="circleBox"></div>
          <div class="conditionItem" @click="changeCondition(4)">
            <div
              class="circleBox"
              :style="{ background: conditionId === 4 ? '#6d9346' : '#9e9e9e' }"
            ></div>
            <div class="filterText">4代传承世医</div>
          </div>
          <div class="conditionItem">
            <div class="circleBox"></div>
          <div class="conditionItem" @click="changeCondition(5)">
            <div
              class="circleBox"
              :style="{ background: conditionId === 5 ? '#da7a2b' : '#9e9e9e' }"
            ></div>
            <div class="filterText">5代传承世医</div>
          </div>
          <div class="conditionItem">
            <div class="circleBox"></div>
          <div class="conditionItem" @click="changeCondition(6)">
            <div
              class="circleBox"
              :style="{ background: conditionId === 6 ? '#bc321d' : '#9e9e9e' }"
            ></div>
            <div class="filterText">5代以上传承世医</div>
          </div>
        </div>
      </div>
      <div style="padding-left: 0.5rem; margin-top: 20px">共 1983个世医</div>
      <div style="padding-left: 0.5rem; margin-top: 20px">
        共 {{ totalCount }}个世医
      </div>
    </div>
    <!-- echarts图 -->
    <div class="barChart" ref="barChart"></div>
    <div class="contentBox">
      <!-- echarts图 -->
      <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"
        v-if="showTool"
        :style="{ top: toolTop, left: toolLeft }"
      >
        <div class="toolItem" @click="gotoDetail(1)">个人信息</div>
        <div class="toolItem" @click="gotoDetail(2)">世医文化</div>
        <div class="toolItem" @click="gotoDetail(3)">世医传承</div>
      </div>
    </div>
  </view>
</template>
<script>
import * as echarts from "echarts";
import { inheritMedicalList } from "@/api/index.js";
import {
  getNodeCount,
  inheritMedicalSataStatistics,
  inheritMedicalList
} from "@/api/index.js";
export default {
  data() {
    return {
      loading: true,
      // 标题顶部栏需要的东西
      keyword: "",
      idIndex: 0,
      activeIndex: 1,
      dynasty: [
        {
          name: "唐",
          number: "4910",
          isColor: false
        },
        {
          name: "五代",
          number: "494",
          isColor: true
        },
        {
          name: "宋",
          number: "51273",
          isColor: false
        },
        {
          name: "北宋",
          number: "15",
          isColor: true
        },
        {
          name: "南宋",
          number: "4910",
          isColor: false
        },
        {
          name: "元",
          number: "299",
          isColor: true
        },
        {
          name: "明",
          number: "1830",
          isColor: false
        },
        {
          name: "清",
          number: "1000",
          isColor: true
        }
      ],
      nodeData: []
      activeId: 28,
      conditionId: "",
      searchType: "DYNASTY",
      dynasty: [],
      nodeData: [],
      showTool: false,
      toolTop: 0,
      toolLeft: 0,
      toolInfo: {},
      totalCount: 0
    };
  },
  onLoad(options) {
    this.idIndex = options.id;
    console.log("optionsoptionsoptions", options.id);
  },
  mounted() {
    this.getData();
    this.getStatistics();
  },
  methods: {
    getStatistics() {
      inheritMedicalSataStatistics().then((res) => {
        this.dynasty = res.object;
        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: "",
        dynastyId: "",
        searchType: "KEYWORD",
        path: ""
        keywords: this.keyword,
        dynastyId: this.activeId,
        searchType: this.searchType,
        path: this.conditionId
      }).then((res) => {
        console.log(res);
        this.nodeData = res.object.nodeList.map((item) => {
          return {
            ...item,
        for (let i = 0; i < res.object.nodeList.length; i++) {
          const node = res.object.nodeList[i];
          this.nodeData.push({
            ...node,
            id: node.identifier,
            itemStyle: {
              color: "#F8E2D7",
              borderColor: "#F3AA78",
              borderWidth: "3"
            }
          };
          });
        }
        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;
@@ -181,7 +220,7 @@
          {
            type: "graph",
            layout: "force",
            symbolSize: 120,
            symbolSize: 100,
            //是否允许用户拖动图片
            roam: true,
            label: {
@@ -224,19 +263,91 @@
      };
      //进行渲染
      myChart.setOption(option);
      myChart.on("click", (params) => {
        uni.navigateTo({
          url:
            "/pages/inherit/list?id=" +
            params.data.identifier +
            "&name=" +
            encodeURIComponent(params.data.name)
        });
      myChart.getZr().on("click", (params) => {
        if (!params.target) {
          this.showTool = false;
        }
      });
      myChart.on("click", (params) => {
        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)
          };
        } else {
          this.showTool = false;
        }
      });
    },
    gotoDetail(type) {
      switch (type) {
        case 1:
          uni.navigateTo({
            url: "/pages/character/detail?id=" + this.toolInfo.id
          });
          break;
        case 2:
          uni.navigateTo({
            url:
              "/pages/inherit/list?type=" +
              2 +
              "&id=" +
              this.toolInfo.id +
              "&name=" +
              this.toolInfo.name
          });
          break;
        case 3:
          uni.navigateTo({
            url:
              "/pages/inherit/list?type=" +
              1 +
              "&id=" +
              this.toolInfo.id +
              "&name=" +
              this.toolInfo.name
          });
          break;
      }
    },
    // 返回按钮
    goBack() {
      this.$router.go(-1);
    },
    search() {
      this.searchType = "KEYWORD";
      this.activeId = "";
      this.conditionId = "";
      this.getData();
    },
    changeDynasty(item) {
      if (item.dynastyId === this.activeId) {
        this.activeId = "";
        if (this.conditionId === "") {
          this.searchType = "KEYWORD";
        }
      } else {
        this.searchType = "DYNASTY";
        this.activeId = item.dynastyId;
        this.keyword = "";
      }
      this.getData();
    },
    changeCondition(index) {
      if (index === this.conditionId) {
        this.conditionId = "";
        if (this.activeId === "") {
          this.searchType = "KEYWORD";
        }
      } else {
        this.searchType = "DYNASTY";
        this.conditionId = index;
        this.keyword = "";
      }
      this.getData();
    }
  }
};
@@ -258,12 +369,32 @@
  font-size: 0.12rem;
  padding: 0;
}
.barChart {
.contentBox {
  width: 100vw;
  height: 80vh;
  position: relative;
}
#barChart {
  width: 100%;
  height: 100%;
}
.toolBox {
  padding: 0.1rem;
  position: absolute;
}
.toolItem {
  padding: 0.04rem 0.2rem;
  border: 1px solid #333;
  border-radius: 1rem;
  margin: 0.06rem;
  font-size: 0.12rem;
  cursor: pointer;
  background-color: #fff;
}
.toolItem:hover {
  background-color: #efefef;
}
.filterBox {
  height: 2.2rem;
  width: 90%;
  border-bottom: 1px solid #ccc;
  padding: 20px;
@@ -285,11 +416,11 @@
  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;
@@ -309,42 +440,52 @@
  padding: 0.1rem 0.5rem;
}
.filterList {
  flex: 1;
  overflow: hidden;
  margin-left: 0.4rem;
  display: flex;
  overflow: hidden;
}
.filterItem {
  display: flex;
  box-shadow: 1px 1px 5px #888888;
  align-items: center;
  justify-content: center;
  width: 1rem;
  height: 0.25rem;
  flex: 1;
  width: 1.4rem;
  height: 0.3rem;
  margin-left: 0.2rem;
  border-radius: 0.13rem;
  float: left;
  margin-top: 0.02rem;
  margin-bottom: 0.1rem;
  cursor: pointer;
}
.conditionItem {
  display: flex;
  box-shadow: 1px 1px 5px #888888;
  align-items: center;
  justify-content: center;
  width: 1.3rem;
  height: 0.25rem;
  flex: 1;
  width: 1.6rem;
  height: 0.3rem;
  float: left;
  margin-left: 0.2rem;
  border-radius: 0.13rem;
  margin-top: 0.02rem;
  margin-bottom: 0.1rem;
  cursor: pointer;
}
.circleBox {
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background-color: #326350;
  background-color: #9e9e9e;
}
.circleBox.active {
  background-color: #da7a2b;
}
.filterText {
  margin-left: 10px;
  font-size: 16px;
  color: #326350;
  font-size: 0.16rem;
}
.fontColor {
  color: #827e44 !important;