YM
2024-07-19 856b67db405f17d1c0ab99dcf0bb5da6323e4903
src/pages/academicSchools/index.vue
@@ -1,5 +1,7 @@
<template>
  <view style="width: 100%; height: 100%; display: flex; flex-direction: column;">
  <view
    style="width: 100%; height: 100%; display: flex; flex-direction: column"
  >
    <headNav :idIndex="'6'" text="学术流派" />
    <!-- 高级搜索 -->
    <view style="margin-top: 0.1rem">
@@ -46,6 +48,20 @@
        暂无相关数据
      </div>
    </div>
    <div id="customDialog" class="customDialog">
      <div class="title">
        <span>{{ detailData.name }}</span>
        <span @click="closeDom">关闭</span>
      </div>
      <div class="content">
        <p>姓名:{{ detailData.name }}</p>
        <p>别名:{{ detailData.alias }}</p>
        <p>籍贯:{{ detailData.nativePlace }}</p>
        <p>医学分科: {{ detailData.medicalBranch }}</p>
        <p>小传:{{ detailData.biography }}</p>
      </div>
      <div class="btn">查看更多>>></div>
    </div>
  </view>
</template>
@@ -53,7 +69,7 @@
import {
  getPersonData,
  getHotSearch,
  getPDataStatistics
  getPDataStatistics,
} from "@/api/index.js";
import * as echarts from "echarts";
export default {
@@ -73,19 +89,19 @@
            type: "input",
            label: "姓名",
            name: "name",
            value: ""
            value: "",
          },
          {
            type: "input",
            label: "别名",
            name: "alias",
            value: ""
            value: "",
          },
          {
            type: "input",
            label: "籍贯",
            name: "location",
            value: ""
            value: "",
          },
          {
            type: "select",
@@ -95,15 +111,15 @@
            options: [
              {
                label: "未指明",
                value: "UNKNOWN"
              }
            ]
                value: "UNKNOWN",
              },
            ],
          },
          {
            type: "input",
            label: "官职",
            name: "office",
            value: ""
            value: "",
          },
          {
            type: "select",
@@ -113,43 +129,43 @@
            options: [
              {
                label: "未指明",
                value: "UNKNOWN"
                value: "UNKNOWN",
              },
              {
                label: "男",
                value: "MALE"
                value: "MALE",
              },
              {
                label: "女",
                value: "WOMAN"
              }
            ]
                value: "WOMAN",
              },
            ],
          },
          {
            type: "input",
            label: "时期",
            name: "period",
            value: ""
            value: "",
          },
          {
            type: "input",
            label: "机构",
            name: "inst",
            value: ""
            value: "",
          },
          {
            type: "number",
            label: "页码",
            name: "page",
            value: ""
            value: "",
          },
          {
            type: "number",
            label: "页大小",
            name: "pageSize",
            value: ""
          }
        ]
            value: "",
          },
        ],
      },
      // 下面的朝代1
      dynastyColor: 1,
@@ -158,79 +174,79 @@
        {
          name: "夏朝",
          coord: "2070BC",
          id: 1
          id: 1,
        },
        {
          name: "商朝",
          id: 2,
          coord: "1600BC"
          coord: "1600BC",
        },
        {
          name: "西周",
          id: 3,
          coord: "1600BC"
          coord: "1600BC",
        },
        {
          name: "春秋战国",
          id: 4,
          coord: "770BC"
          coord: "770BC",
        },
        {
          name: "秦朝",
          id: 5,
          coord: "221BC"
          coord: "221BC",
        },
        {
          name: "汉朝",
          id: 6,
          coord: "202BC"
          coord: "202BC",
        },
        {
          name: "三国两晋南北朝",
          id: 7,
          coord: "184"
          coord: "184",
        },
        {
          name: "隋朝",
          id: 8,
          coord: "581"
          coord: "581",
        },
        {
          name: "唐朝",
          id: 9,
          coord: "618"
          coord: "618",
        },
        {
          name: "五代十国",
          id: 10,
          coord: "907"
          coord: "907",
        },
        {
          name: "辽夏金",
          id: 11,
          coord: "907"
          coord: "907",
        },
        {
          name: "宋朝",
          id: 12,
          coord: "960"
          coord: "960",
        },
        {
          name: "元朝",
          id: 13,
          coord: "1271"
          coord: "1271",
        },
        {
          name: "明朝",
          id: 14,
          coord: "1368"
          coord: "1368",
        },
        {
          name: "清朝",
          id: 15,
          coord: "1636"
        }
          coord: "1636",
        },
      ],
      // 热门搜索
      hotKeyList: [],
@@ -240,8 +256,13 @@
      categories: [],
      // 人物信息
      infoOfPersons: [],
      // 学术流派
      infoOfSchools: [],
      // 当前人物信息
      ownInfo: null
      ownInfo: null,
      detailData: {
        name: "",
      },
    };
  },
  mounted() {
@@ -256,7 +277,8 @@
    this.searchKey = options.keyword;
  },
  methods: {
    getPersonInfo(arr, str, newArr, order, type) {
    // 获取人物关系
    getPersonInfo(arr, str, newArr, order, type, parent) {
      for (let i = 0; i < arr.length; i++) {
        const ele = arr[i];
        const personInfo = this.infoOfPersons.find(
@@ -264,19 +286,58 @@
        );
        const obj = {
          personId: ele.personId,
          id1: this.ownInfo.id,
          parentId: parent.id,
          id2: personInfo.id,
          relationTypeId: ele.relationTypeId,
          relationTypeName: ele.relationTypeName,
          name1: this.ownInfo?.NAME[0]?.content1,
          parentName: parent?.NAME[0]?.content1 ?? parent.parentName,
          name2: personInfo?.NAME[0]?.content1,
          category: type
          category: type,
        };
        if (str == "literatureList") {
          obj.relationTypeName = ele.literatureName;
        }
        if (str == "schoolList") {
          const nameData = this.infoOfSchools?.find(
            (i) => i.schoolId == ele.schoolId
          );
          obj.relationTypeName = nameData?.name[0];
        }
        if (str == "placeList") {
          obj.relationTypeName = ele.ancientName ?? ele.currentName;
        }
        newArr.push(obj);
        if (ele[str] && ele[str]?.length) {
          this.getPersonInfo(ele[str], "kinList", newArr, 2, type);
          order++;
          this.getPersonInfo(ele[str], str, newArr, order, type, personInfo);
        }
      }
    },
    // 处理数据
    changeLiterature(arr, str) {
      for (let i = 0; i < arr.length; i++) {
        const ele = arr[i];
        if (!ele.personId && ele.personList?.length) {
          ele.literatureList = [];
          ele.personId = this.ownInfo.id;
          if (ele[str] && ele[str]?.length) {
            for (let j = 0; j < ele.personList.length; j++) {
              const item = ele.personList[j];
              const data = item[str]?.map((e) => {
                return {
                  ...e,
                  personId: item.personId,
                };
              });
              if (data?.length) {
                ele[str].push(...data);
              }
            }
          }
        }
      }
      return arr;
    },
    //数组去重
@@ -298,73 +359,148 @@
      return deduplicatedArray;
    },
    // 查询详情
    getData() {
      this.loading = true;
      getPersonData(this.currentId).then((res) => {
        this.nodes = [];
        this.relationships = [];
        let kin = [];
        let kinData = [];
        let teacher = [];
        let literature = [];
        let social = [];
        let place = [];
        let school = [];
        if (res && res.success && res.object) {
          console.log(res.object);
          this.infoOfPersons = res.object?.infoOfPersons;
          this.infoOfSchools = res.object?.infoOfSchools;
          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) => {
              this.getPersonInfo(
                obj.kinList,
                "kinList",
                newArr,
                1,
                0,
                this.ownInfo
              );
              kinData = [...newArr];
            }
            if (obj.teacherStudentList?.length) {
              this.categories.push({ name: "师承关系" });
              let newArr = [];
              this.getPersonInfo(
                obj.teacherStudentList,
                "teacherStudentList",
                newArr,
                1,
                1,
                this.ownInfo
              );
              teacher = [...newArr];
            }
            if (obj.literatureList?.length) {
              this.categories.push({ name: "文献作品" });
              let newArr = [];
              const data = this.changeLiterature(
                obj.literatureList,
                "literatureList"
              );
              this.getPersonInfo(
                data,
                "literatureList",
                newArr,
                1,
                2,
                this.ownInfo
              );
              literature = [...newArr];
            }
            if (obj.socialList?.length) {
              let newArr = [];
              this.categories.push({ name: "社会关系" });
              const data = this.changeLiterature(obj.socialList, "socialList");
              this.getPersonInfo(
                data,
                "socialList",
                newArr,
                1,
                3,
                this.ownInfo
              );
              social = [...newArr];
            }
            if (obj.placeList?.length) {
              this.categories.push({ name: "活动地" });
              let newArr = [];
              const data = this.changeLiterature(obj.placeList, "placeList");
              this.getPersonInfo(data, "placeList", newArr, 1, 4, this.ownInfo);
              place = [...newArr];
              // console.log(place, "placeList");
            }
            if (obj.schoolList?.length) {
              this.categories.push({ name: "学术流派" });
              let newArr = [];
              const data = this.changeLiterature(obj.schoolList, "schoolList");
              this.getPersonInfo(
                data,
                "schoolList",
                newArr,
                1,
                3,
                this.ownInfo
              );
              school = [...newArr];
              // console.log(school, "schoolList");
            }
          }
          const personData = [
            ...kinData,
            ...teacher,
            ...literature,
            ...social,
            ...place,
            ...school,
          ];
          // console.log(personData)
          personData.forEach((item) => {
                let exists1 = this.nodes.some(
                  (node) => node.id === item.id1 && node.name === item.name1
              (node) =>
                node.id === item.parentId && node.name === item.parentName
                );
                let exists2 = this.nodes.some(
                  (node) => node.id === item.id1 && node.name === item.name2
              (node) => node.id === item.parentId && node.name === item.name2
                );
                // 证明不存在
                if (item.name1 && exists1 !== true) {
                  this.nodes.push({
                    name: item.name1,
                    id: item.id1,
                    ...item
                name: item.parentName,
                id: item.parentId,
                ...item,
                  });
                }
                if (item.name2 && exists2 !== true) {
                  this.nodes.push({
                    name: item.name2,
                    id: item.id2,
                    ...item
                ...item,
                  });
                }
                let obj = {
                  source: item.name1,
              source: item.parentName,
                  target: item.name2,
                  relation: item.relationTypeName || "" // 如果存在 relationName 字段则使用,否则为空字符串
              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();
@@ -429,46 +565,35 @@
                borderRadius: 30,
                position: "middle", // 设置标签文本在线的中间位置上居中显示
                // z: -1, // 设置标签的z轴高度,使其比连接线更高
                distance: -10 // 将标签放置在连接线上
              }
                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 nodeData = nodes;
      var option;
      option = {
        title: {
          // text: '书中最常提到的100位人物',
          text: "",
          // subtext: '',
          left: "center",
          top: FontSize + 10,
          // textStyle: {
          //    fontSize: FontSize // 设置标题文字大小为 18px
          // },
          textStyle: {
            fontSize: FontSize, // 设置标题文字大小为 18px
          },
          subtextStyle: {
            fontSize: FontSize, // 设置副标题文字大小为 14px
            color: "#2C2C2C"
          }
            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 或者百分比
          position: "center center", // 背景图片的位置,可以是 top, bottom, middle 或者百分比
        },
        tooltip: {},
        legend: [
@@ -476,70 +601,36 @@
            // 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,
          //   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: 'force',
            layout: "force",
            data: nodeData,
            links: links,
            categories: this.categories,
            roam: true,
            label: {
              position: "right",
              formatter: "{b}"
              formatter: "{b}",
            },
            lineStyle: {
              color: "source",
              curveness: 0.3
              curveness: 0.3,
            },
            emphasis: {
              focus: "adjacency",
              lineStyle: {
                width: 10
              }
            }
          }
        ]
                width: 10,
              },
            },
          },
        ],
      };
      // 将生成的连接线添加到echarts图表的option中
      // option.series[0].links = links;
@@ -547,11 +638,48 @@
      myChart.off("click");
      myChart.on("click", (params) => {
        if (params.dataType === "node") {
          this.spaceTimeArr(params.data.id);
          this.creatDom(params);
        }
      });
      console.log(option, "option");
      myChart.setOption(option);
    },
    creatDom(params) {
      const e = params.event;
      const div = document.getElementById("customDialog");
      div.style.display = "block";
      div.style.left = e.offsetX + 50 + "px";
      div.style.top = e.offsetY - 50 + "px";
      const data = this.infoOfPersons?.find(
        (i) => i.id == params.data.personId
      );
      const obj = {
        name:
          data?.NAME?.map((e, i) => {
            i += 1;
            return e["content" + i];
          }).join("、") ?? "",
        alias:
          data?.ALIAS?.map((e, i) => {
            i += 1;
            return e["content" + i];
          }).join("、") ?? "",
        nativePlace:
          data?.NATIVE_PLACE?.map((e, i) => {
            i += 1;
            return e["content" + i];
          }).join("、") ?? "",
        medicalBranch:
          data?.MEDICAL_BRANCH?.map((e, i) => {
            i += 1;
            return e["content" + i];
          }).join("、") ?? "",
        biography: data?.BIOGRAPHY ?? "",
      };
      this.detailData = obj;
    },
    closeDom() {
      const div = document.getElementById("customDialog");
      div.style.display = "none";
    },
    // 基础搜索
    onSearch(val, index) {
@@ -561,7 +689,6 @@
      } else {
        this.hotAciveIndex = "";
      }
      // this.searchKey = val.text;
      this.getData(val.text);
    },
    // 高级搜索
@@ -569,28 +696,28 @@
      getAdvanceSearch({
        ...val,
        page: 1,
        pageSize: 100
        pageSize: 100,
      }).then((res) => {
        console.log(res, "res");
      });
    },
    advancedSearchBack() {
      uni.navigateTo({
        url: "/pages/knowledgeBase/knowledgeBase"
        url: "/pages/knowledgeBase/knowledgeBase",
      });
    },
    // 点击下面的朝代按钮
    dynastyBottomClick(item) {
      this.dynastyColor = item.id;
      this.onSearch({
        text: item.name
        text: item.name,
      });
    },
    // 关系图 点击里面的元素
    spaceTimeArr(id) {
      // 关系图的数据
      uni.navigateTo({
        url: "/pages/character/detail?id=" + id
        url: "/pages/character/detail?id=" + id,
      });
    },
    // 获取朝代echarts的数据
@@ -629,15 +756,15 @@
          const options = res.object.occupationStatistic.details.map(
            (item) => ({
              label: item.tagName,
              value: item.tagId.toString() // 将 id 转换为字符串,确保与 value 类型一致
              value: item.tagId.toString(), // 将 id 转换为字符串,确保与 value 类型一致
            })
          );
          // 更新职业字段的 options 属性
          this.$set(this.From.from[professionIndex], "options", options);
        }
      });
    }
  }
    },
  },
};
</script>
@@ -645,7 +772,64 @@
#relatio {
  width: 100%;
  height: 100%;
  position: relative;
}
.customDialog {
  width: 300px;
  min-height: 240px;
  display: none;
  position: fixed;
  z-index: 99999999;
  border-radius: 2px;
  background: #fff;
}
.customDialog .title {
  width: 100%;
  height: 35px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 10px;
  box-sizing: border-box;
  background-color: rgb(221, 232, 246);
  font-size: 14px;
}
.customDialog .title span:nth-child(1) {
  font-size: 16px;
  font-weight: 600;
}
.customDialog .title span:nth-child(2) {
  color: rgb(95, 127, 168);
  cursor: pointer;
}
.customDialog .content {
  padding: 15px;
  box-sizing: border-box;
}
.customDialog .content p {
  margin-bottom: 5px;
  display: -webkit-box; /* 显示多行文本容器 */
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2; /*显示行数*/
  overflow: hidden; /*隐藏多出部分文字*/
  text-overflow: ellipsis; /*用省略号代替多出部分文字*/
}
.customDialog .btn{
  display: flex;
  justify-content: center;
  align-items: center;
  color: rgb(95, 127, 168);
  cursor: pointer;
  font-size: 14px;
  height: 35px;
}
@media screen and (min-width: 2560px) and (max-width: 3840px) {
}
@@ -669,15 +853,5 @@
.hotSearch {
  font-size: 0.12rem;
  color: #2c2c2c;
  li {
    color: #244a7b;
    margin: 0 0.1rem;
    color: #244a7b;
    &.active {
      color: #027edc;
      font-weight: bold;
    }
  }
}
</style>