From 587d25c4a1d1a5d240e7750aa0c043a702a737d5 Mon Sep 17 00:00:00 2001
From: QYF-GitLab1 <1940665526@qq.com>
Date: 星期四, 18 七月 2024 10:47:30 +0800
Subject: [PATCH] 1

---
 src/pages/academicSchools/index.vue |  674 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 667 insertions(+), 7 deletions(-)

diff --git a/src/pages/academicSchools/index.vue b/src/pages/academicSchools/index.vue
index 6f61006..7b41958 100644
--- a/src/pages/academicSchools/index.vue
+++ b/src/pages/academicSchools/index.vue
@@ -1,19 +1,679 @@
 <template>
   <view>
-    <headNav :idIndex="6" text="瀛︽湳娴佹淳" />
+    <headNav :idIndex="'6'" text="瀛︽湳娴佹淳" />
+    <!-- 楂樼骇鎼滅储 -->
+    <view style="margin-top: 0.1rem">
+      <advancedSearch
+        @onSearch="onSearch"
+        @onSubmit="onSubmit"
+        :from="From"
+        placehold="璇疯緭鍏ュ叧閿瓧"
+        :keyword="searchKey"
+        :advancedSearchBack="advancedSearchBack"
+      />
+    </view>
+    <!-- 鐑棬鎼滅储 -->
+    <view class="flex flex-center hotSearch">
+      鐑棬鎼滅储锛�
+      <ul class="flex" style="margin-right: 10rpx">
+        <li
+          @click="onSearch({ text: item }, index)"
+          :class="{ cursor: true, active: hotAciveIndex === index }"
+          v-for="(item, index) in hotKeyList"
+          :key="item"
+        >
+          {{ item }}
+        </li>
+      </ul>
+    </view>
+    <view style="margin-left: 0.2rem">涔︿腑鏈�甯告彁鍒扮殑100浣嶄汉鐗�</view>
+    <!-- 鍏崇郴琛ㄥ湴鍥� -->
+    <div
+      id="relation"
+      style="margin-top: 0.1rem; flex: 1; width: 100%; position: relative"
+    >
+      <div
+        v-if="!loading && relationships.length == 0"
+        style="
+          position: absolute;
+          top: 30%;
+          left: 0;
+          right: 0;
+          text-align: center;
+          font-size: 0.2rem;
+          color: #666;
+        "
+      >
+        鏆傛棤鐩稿叧鏁版嵁
+      </div>
+    </div>
   </view>
 </template>
 
 <script>
-// import * as echarts from "echarts";
-// import axios from "axios";
+import {
+  getPersonData,
+  getHotSearch,
+  getPDataStatistics,
+} from "@/api/index.js";
+import * as echarts from "echarts";
 export default {
   data() {
-    return {};
+    return {
+      loading: true,
+      hotAciveIndex: "",
+      currentId: 21682,
+      // echarts鏁版嵁
+      nodes: [],
+      // echarts涓よ�呯殑鍏崇郴
+      relationships: [],
+      // 楂樼骇鎼滅储
+      From: {
+        from: [
+          {
+            type: "input",
+            label: "濮撳悕",
+            name: "name",
+            value: "",
+          },
+          {
+            type: "input",
+            label: "鍒悕",
+            name: "alias",
+            value: "",
+          },
+          {
+            type: "input",
+            label: "绫嶈疮",
+            name: "location",
+            value: "",
+          },
+          {
+            type: "select",
+            label: "鑱屼笟",
+            name: "sdId",
+            value: "",
+            options: [
+              {
+                label: "鏈寚鏄�",
+                value: "UNKNOWN",
+              },
+            ],
+          },
+          {
+            type: "input",
+            label: "瀹樿亴",
+            name: "office",
+            value: "",
+          },
+          {
+            type: "select",
+            label: "鎬у埆",
+            value: "",
+            name: "genderTypeEO",
+            options: [
+              {
+                label: "鏈寚鏄�",
+                value: "UNKNOWN",
+              },
+              {
+                label: "鐢�",
+                value: "MALE",
+              },
+              {
+                label: "濂�",
+                value: "WOMAN",
+              },
+            ],
+          },
+          {
+            type: "input",
+            label: "鏃舵湡",
+            name: "period",
+            value: "",
+          },
+          {
+            type: "input",
+            label: "鏈烘瀯",
+            name: "inst",
+            value: "",
+          },
+          {
+            type: "number",
+            label: "椤电爜",
+            name: "page",
+            value: "",
+          },
+          {
+            type: "number",
+            label: "椤靛ぇ灏�",
+            name: "pageSize",
+            value: "",
+          },
+        ],
+      },
+      // 涓嬮潰鐨勬湞浠�1
+      dynastyColor: 1,
+      // 鏈濅唬
+      dynasty: [
+        {
+          name: "澶忔湞",
+          coord: "2070BC",
+          id: 1,
+        },
+        {
+          name: "鍟嗘湞",
+          id: 2,
+          coord: "1600BC",
+        },
+        {
+          name: "瑗垮懆",
+          id: 3,
+          coord: "1600BC",
+        },
+        {
+          name: "鏄ョ鎴樺浗",
+          id: 4,
+          coord: "770BC",
+        },
+        {
+          name: "绉︽湞",
+          id: 5,
+          coord: "221BC",
+        },
+        {
+          name: "姹夋湞",
+          id: 6,
+          coord: "202BC",
+        },
+        {
+          name: "涓夊浗涓ゆ檵鍗楀寳鏈�",
+          id: 7,
+          coord: "184",
+        },
+        {
+          name: "闅嬫湞",
+          id: 8,
+          coord: "581",
+        },
+        {
+          name: "鍞愭湞",
+          id: 9,
+          coord: "618",
+        },
+        {
+          name: "浜斾唬鍗佸浗",
+          id: 10,
+          coord: "907",
+        },
+        {
+          name: "杈藉閲�",
+          id: 11,
+          coord: "907",
+        },
+        {
+          name: "瀹嬫湞",
+          id: 12,
+          coord: "960",
+        },
+        {
+          name: "鍏冩湞",
+          id: 13,
+          coord: "1271",
+        },
+
+        {
+          name: "鏄庢湞",
+          id: 14,
+          coord: "1368",
+        },
+        {
+          name: "娓呮湞",
+          id: 15,
+          coord: "1636",
+        },
+      ],
+      // 鐑棬鎼滅储
+      hotKeyList: [],
+      searchKey: "",
+
+      // 鍒嗙被
+      categories: [],
+      // 浜虹墿淇℃伅
+      infoOfPersons: [],
+      // 褰撳墠浜虹墿淇℃伅
+      ownInfo: null,
+    };
   },
-  onLoad(options) {},
-  methods: {}
+  mounted() {
+    this.getData();
+    // this.echartsArr();
+    this.hotSearch();
+    // 鐩戝惉绐楀彛澶у皬鍙樺寲
+    window.addEventListener("resize", this.relation);
+    this.innt();
+  },
+  onLoad(options) {
+    this.searchKey = options.keyword;
+  },
+  methods: {
+    getPersonInfo(arr, str, newArr, order, type) {
+      for (let i = 0; i < arr.length; i++) {
+        const ele = arr[i];
+        const personInfo = this.infoOfPersons.find(
+          (item) => item.id == ele.personId
+        );
+        const obj = {
+          personId: ele.personId,
+          id1: this.ownInfo.id,
+          id2: personInfo.id,
+          relationTypeId: ele.relationTypeId,
+          relationTypeName: ele.relationTypeName,
+          name1: this.ownInfo?.NAME[0]?.content1,
+          name2: personInfo?.NAME[0]?.content1,
+          category: type,
+        };
+        newArr.push(obj);
+        if (ele[str] && ele[str]?.length) {
+          this.getPersonInfo(ele[str], "kinList", newArr, 2, type);
+        }
+      }
+    },
+
+    //鏁扮粍鍘婚噸
+    deduplicateArray(arr, idKey) {
+      // 浣跨敤涓�涓緟鍔╁璞℃潵璺熻釜宸茬粡瑙佽繃鐨処D
+      const seen = {};
+      // 浣跨敤filter鏂规硶杩囨护鏁扮粍
+      const deduplicatedArray = arr.filter((item) => {
+        // 鑾峰彇褰撳墠瀵硅薄鐨処D
+        const id = item[idKey];
+        // 濡傛灉ID鍦ㄨ緟鍔╁璞′腑涓嶅瓨鍦紝鍒欏皢鍏舵坊鍔犲埌瀵硅薄骞惰繑鍥瀟rue
+        if (!seen[id]) {
+          seen[id] = true;
+          return true;
+        }
+        // 濡傛灉ID宸茬粡瀛樺湪锛岃繑鍥瀎alse
+        return false;
+      });
+
+      return deduplicatedArray;
+    },
+    getData() {
+      this.loading = true;
+      getPersonData(this.currentId).then((res) => {
+        this.nodes = [];
+        this.relationships = [];
+        let kin = [];
+        let teacher = [];
+        if (res && res.success && res.object) {
+          console.log(res.object);
+          this.infoOfPersons = res.object?.infoOfPersons;
+          if (res.object?.personChain) {
+            this.ownInfo = this.infoOfPersons.find(
+              (item) => item.id == res.object?.personChain.personId
+            );
+            const obj = res.object?.personChain;
+            console.log(obj.kinList, "kinList");
+            if (obj.kinList?.length) {
+              let newArr = [];
+              this.categories.push({ name: "浜插睘鍏崇郴" });
+              this.getPersonInfo(obj.kinList, "kinList", newArr, 1, 0);
+              console.log(newArr, "list");
+              newArr.forEach((item) => {
+                let exists1 = this.nodes.some(
+                  (node) => node.id === item.id1 && node.name === item.name1
+                );
+                let exists2 = this.nodes.some(
+                  (node) => node.id === item.id1 && node.name === item.name2
+                );
+                // 璇佹槑涓嶅瓨鍦�
+                if (item.name1 && exists1 !== true) {
+                  this.nodes.push({
+                    name: item.name1,
+                    id: item.id1,
+                    ...item,
+                  });
+                }
+                if (item.name2 && exists2 !== true) {
+                  this.nodes.push({
+                    name: item.name2,
+                    id: item.id2,
+                    ...item,
+                  });
+                }
+                let obj = {
+                  source: item.name1,
+                  target: item.name2,
+                  relation: item.relationTypeName || "", // 濡傛灉瀛樺湪 relationName 瀛楁鍒欎娇鐢紝鍚﹀垯涓虹┖瀛楃涓�
+                };
+                this.relationships.push(obj);
+              });
+            }
+            if (obj.teacherStudentList?.length) {
+              this.categories.push({ name: "甯堟壙鍏崇郴" });
+            }
+            if (obj.literatureList?.length) {
+              this.categories.push({ name: "鏂囩尞浣滃搧" });
+            }
+            if (obj.socialList?.length) {
+              this.categories.push({ name: "绀句細鍏崇郴" });
+            }
+            if (obj.placeList?.length) {
+              this.categories.push({ name: "娲诲姩鍦�" });
+            }
+            if (obj.schoolList?.length) {
+              this.categories.push({ name: "瀛︽湳娴佹淳" });
+            }
+          }
+        }
+        this.loading = false;
+        this.relation();
+      });
+    },
+    // 鍏崇郴鍥捐氨
+    relation() {
+      var chartDom = document.getElementById("relation");
+      var myChart = echarts.init(chartDom);
+      // 鍋囪鎮ㄦ湁鑺傜偣鍚嶇О鍜屽畠浠箣闂寸殑鍏崇郴鏁版嵁
+      var nodes = this.deduplicateArray(this.nodes, "id");
+      var relationships = this.relationships;
+
+      let FontSize = 12; // 瀛椾綋澶у皬
+      let BorderWidth = 2; // 杈规澶у皬
+      let SymbolSize = 80; // 灏哄璺濈
+      let Distance = 10;
+      // 涓嶅悓灏哄涓嬩慨鏀筫charts鐨勫瓧浣�
+      if (window.innerWidth > 2560 && window.innerWidth <= 3840) {
+        FontSize = 20;
+        BorderWidth = 5;
+        SymbolSize = 90;
+        Distance = 33;
+      } else if (window.innerWidth > 1920 && window.innerWidth <= 2560) {
+        FontSize = 18;
+        BorderWidth = 4;
+        SymbolSize = 80;
+        Distance = 22;
+      } else if (window.innerWidth >= 1366 && window.innerWidth <= 1920) {
+        FontSize = 14;
+        BorderWidth = 4;
+        SymbolSize = 70;
+        Distance = 22;
+      }
+      // 鏍规嵁鍏崇郴鏁版嵁鐢熸垚杩炴帴绾�
+      var links = [];
+      relationships.forEach((relationship, i) => {
+        var sourceIndex = nodes.findIndex(
+          (node) => node.name === relationship.source
+        );
+        var targetIndex = nodes.findIndex(
+          (node) => node.name === relationship.target
+        );
+        if (relationship.relation) {
+          if (sourceIndex !== -1 && targetIndex !== -1) {
+            links.push({
+              source: sourceIndex,
+              target: targetIndex,
+              label: {
+                show: true,
+                formatter: function (params) {
+                  // 浣跨敤鍑芥暟鍔ㄦ�佺敓鎴愭爣绛惧唴瀹�
+                  // return relationships.find(rel => rel.source === nodes[params.data
+                  // 		.source] && rel.target === nodes[params.data.target])
+                  // 	.relation;
+                  return relationship.relation;
+                }, // 璁剧疆鍏崇郴鏍囩鍐呭涓�"Child-Parent"
+                color: "#2C2C2C",
+                fontSize: FontSize - 2,
+                backgroundColor: "rgba(255, 255, 255, 1)",
+                padding: [3, 8],
+                borderRadius: 30,
+                position: "middle", // 璁剧疆鏍囩鏂囨湰鍦ㄧ嚎鐨勪腑闂翠綅缃笂灞呬腑鏄剧ず
+                // z: -1, // 璁剧疆鏍囩鐨剒杞撮珮搴︼紝浣垮叾姣旇繛鎺ョ嚎鏇撮珮
+                distance: -10, // 灏嗘爣绛炬斁缃湪杩炴帴绾夸笂
+              },
+            });
+          }
+        }
+      });
+      // 鏍规嵁nodes鍔ㄦ�佺敓鎴愯妭鐐规暟鎹�
+      var nodeData = nodes.map(function (node, index) {
+        return {
+          name: node.name,
+          id: node.id,
+          itemStyle: {
+            color: "#eae0eb", // 鍙互鏍规嵁绱㈠紩璁剧疆涓嶅悓鐨勯鑹�
+            borderWidth: BorderWidth,
+            borderColor: "#996f9f",
+          },
+        };
+      });
+
+      var option;
+      option = {
+        title: {
+          // text: '涔︿腑鏈�甯告彁鍒扮殑100浣嶄汉鐗�',
+          // subtext: '',
+          left: "center",
+          top: FontSize + 10,
+          // textStyle: {
+          // 	fontSize: FontSize // 璁剧疆鏍囬鏂囧瓧澶у皬涓� 18px
+          // },
+          subtextStyle: {
+            fontSize: FontSize, // 璁剧疆鍓爣棰樻枃瀛楀ぇ灏忎负 14px
+            color: "#2C2C2C",
+          },
+        },
+        backgroundColor: {
+          type: "image",
+          image: "/static/image/characterRelationBg.png",
+          // repeat: 'repeat-x', // 鏄惁骞抽摵锛屽彲浠ユ槸 'repeat-x', 'repeat-y', 'no-repeat'
+          size: "100% 100%", // 鑳屾櫙鍥剧墖鐨勫昂瀵革紝鍙互鏄櫨鍒嗘瘮鎴栬�呭儚绱�
+          position: "center center", // 鑳屾櫙鍥剧墖鐨勪綅缃紝鍙互鏄� top, bottom, middle 鎴栬�呯櫨鍒嗘瘮
+        },
+        tooltip: {},
+        legend: [
+          {
+            // selectedMode: 'single',
+            data: this.categories.map(function (a) {
+              return a.name;
+            }),
+          },
+        ],
+        animationDurationUpdate: 1500,
+        animationEasingUpdate: "quinticInOut",
+        series: [
+          {
+            type: "graph",
+            layout: "force",
+            roam: true,
+            symbolSize: SymbolSize, // 璋冩暣鑺傜偣澶у皬
+            label: {
+              show: true,
+              color: "black", // 璁剧疆鑺傜偣鏂囧瓧棰滆壊涓洪粦鑹�
+              fontSize: FontSize, // 璁剧疆鏂囧瓧澶у皬
+            },
+            edgeSymbol: ["circle", "arrow"],
+            edgeSymbolSize: [4, 10],
+            data: nodeData,
+            links: links,
+            categories: this.categories,
+            lineStyle: {
+              opacity: 0.9,
+              width: 2,
+              curveness: 0.3,
+            },
+            emphasis: {
+              focus: "adjacency",
+              lineStyle: {
+                width: 10,
+              },
+            },
+            force: {
+              // layoutAnimation: false,
+              // friction: 1,
+              repulsion: 800,
+              edgeLength: 400,
+            },
+          },
+          // {
+          //   name: "Les Miserables",
+          //   type: "graph",
+          //   legendHoverLink: false,
+          //   layout: "none",
+          //   data: nodeData,
+          //   links: links,
+          //   categories: this.categories,
+          //   roam: true,
+          //   label: {
+          //     position: "right",
+          //     formatter: "{b}",
+          //   },
+          //   lineStyle: {
+          //     color: "source",
+          //     curveness: 0.3,
+          //   },
+          //   emphasis: {
+          //     focus: "adjacency",
+          //     lineStyle: {
+          //       width: 10,
+          //     },
+          //   },
+          // },
+        ],
+      };
+      // 灏嗙敓鎴愮殑杩炴帴绾挎坊鍔犲埌echarts鍥捐〃鐨刼ption涓�
+      option.series[0].links = links;
+      // 璁剧疆鐐瑰嚮浜嬩欢鐩戝惉
+      myChart.off("click");
+      myChart.on("click", (params) => {
+        if (params.dataType === "node") {
+          this.spaceTimeArr(params.data.id);
+        }
+      });
+      option && myChart.setOption(option);
+    },
+    // 鍩虹鎼滅储
+    onSearch(val, index) {
+      if (index !== undefined) {
+        this.searchKey = "";
+        this.hotAciveIndex = index;
+      } else {
+        this.hotAciveIndex = "";
+      }
+      // this.searchKey = val.text;
+      this.getData(val.text);
+    },
+    // 楂樼骇鎼滅储
+    onSubmit(val) {
+      getAdvanceSearch({
+        ...val,
+        page: 1,
+        pageSize: 100,
+      }).then((res) => {
+        console.log(res, "res");
+      });
+    },
+    advancedSearchBack() {
+      uni.navigateTo({
+        url: "/pages/knowledgeBase/knowledgeBase",
+      });
+    },
+    // 鐐瑰嚮涓嬮潰鐨勬湞浠f寜閽�
+    dynastyBottomClick(item) {
+      this.dynastyColor = item.id;
+      this.onSearch({
+        text: item.name,
+      });
+    },
+    // 鍏崇郴鍥� 鐐瑰嚮閲岄潰鐨勫厓绱�
+    spaceTimeArr(id) {
+      // 鍏崇郴鍥剧殑鏁版嵁
+      uni.navigateTo({
+        url: "/pages/character/detail?id=" + id,
+      });
+    },
+    // 鑾峰彇鏈濅唬echarts鐨勬暟鎹�
+    echartsArr() {
+      getDataStatistics().then((res) => {
+        res.object.dynastyStatistic.details.map((item, index) => {
+          // this.dynasty.id = item.dynastyId
+          // this.dynasty.name = item.dynastyName
+          // this.dynasty.coord = item.count
+          this.dynasty[index].id = item.dynastyId;
+          this.dynasty[index].name = item.dynastyName;
+          this.dynasty[index].coord = item.count;
+        });
+      });
+    },
+    // 鐑棬鎼滅储
+    hotSearch() {
+      getHotSearch().then((res) => {
+        const indexList = Object.keys(res.object);
+        indexList.sort((a, b) => parseInt(b) - parseInt(a));
+        this.hotKeyList = indexList.map((item) => {
+          return res.object[item];
+        });
+      });
+    },
+
+    // 楂樼骇鎼滅储閲岄潰鑱屼笟鐨勪笅鎷夎彍鍗�
+    innt() {
+      getPDataStatistics().then((res) => {
+        const professionIndex = this.From.from.findIndex(
+          (field) => field.label === "鑱屼笟"
+        );
+        // 濡傛灉鎵惧埌浜嗚亴涓氬瓧娈�
+        if (professionIndex !== -1) {
+          // 灏� profession.list 杞崲涓� options 鏍煎紡
+          const options = res.object.occupationStatistic.details.map(
+            (item) => ({
+              label: item.tagName,
+              value: item.tagId.toString(), // 灏� id 杞崲涓哄瓧绗︿覆锛岀‘淇濅笌 value 绫诲瀷涓�鑷�
+            })
+          );
+          // 鏇存柊鑱屼笟瀛楁鐨� options 灞炴��
+          this.$set(this.From.from[professionIndex], "options", options);
+        }
+      });
+    },
+  },
 };
 </script>
 
-<style></style>
+<style>
+@media screen and (min-width: 2560px) and (max-width: 3840px) {
+}
+
+@media screen and (min-width: 1366px) and (max-width: 1920px) {
+}
+
+::v-deep .uni-input-placeholder {
+  line-height: 1;
+  font-size: 0.12rem;
+}
+
+::v-deep .ffff {
+  border-radius: 0.5rem;
+}
+
+::v-deep .widget_button {
+  border-radius: 0.5rem;
+  margin: 0.02rem;
+}
+
+.hotSearch {
+  font-size: 0.12rem;
+  color: #2c2c2c;
+
+  li {
+    color: #244a7b;
+    margin: 0 0.1rem;
+    color: #244a7b;
+    &.active {
+      color: #027edc;
+      font-weight: bold;
+    }
+  }
+}
+</style>

--
Gitblit v1.9.1