YM
2024-07-22 8288a11ac7af4d4fb40d3d3b038b772ee154f616
src/pages/academicSchools/index.vue
@@ -4,30 +4,148 @@
  >
    <headNav :idIndex="'6'" text="学术流派" />
    <!-- 高级搜索 -->
    <view style="margin-top: 0.1rem">
    <view
      style="
        padding-left: 0.6rem;
        margin-top: 0.1rem;
        display: flex;
        position: relative;
      "
    >
      <advancedSearch
        @onSearch="onSearch"
        @onSubmit="onSubmit"
        :from="From"
        placehold="请输入关键字"
        :isAvancedTrue="false"
        :keyword="searchKey"
        :advancedSearchBack="advancedSearchBack"
      />
      <view
        @click="isAvancedClick"
        style="
          color: #244a7b;
          cursor: pointer;
          font-size: 0.12rem;
          margin-left: 0.35rem;
          line-height: 0.58rem;
        "
        >高级搜索 {{ isAdvancedSearch ? "∧" : "∨" }}</view
      >
      <!-- 热门搜索 -->
      <view class="flex flex-center hotSearch" style="margin-left: 2rem">
        热门搜索:
        <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.name }}
          </li>
        </ul>
      </view>
      <view v-if="isAdvancedSearch" class="searchDialog">
        <h3 style="margin-bottom: 0.2rem">高级搜索</h3>
        <el-form  label-width="100px" :model="formData" size="mini">
          <el-row>
            <el-col :span="8">
              <el-form-item label="姓名/别名:">
                <el-input v-model="formData.name"></el-input>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="活动地:">
                <el-select
                  style="width: 100%"
                  v-model="formData.actively"
                  placeholder="请选择活动地"
                >
                  <!-- <el-option label="区域一" value="shanghai"></el-option> -->
                  <!-- <el-option label="区域二" value="beijing"></el-option> -->
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="作品:">
                <el-input v-model="formData.works"></el-input>
              </el-form-item>
            </el-col>
          </el-row>
          <el-row>
            <el-col :span="8">
              <el-form-item label="人物标签:">
                <el-select
                  style="width: 100%"
                  v-model="formData.personTags"
                  placeholder="请选择人物标签"
                >
                  <!-- <el-option label="区域一" value="shanghai"></el-option> -->
                  <!-- <el-option label="区域二" value="beijing"></el-option> -->
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="社会身份:">
                <el-select
                  style="width: 100%"
                  v-model="formData.socialIdentity"
                  placeholder="请选择社会身份"
                >
                  <!-- <el-option label="区域一" value="shanghai"></el-option> -->
                  <!-- <el-option label="区域二" value="beijing"></el-option> -->
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="时期:">
                <el-select
                  style="width: 100%"
                  v-model="formData.period"
                  placeholder="请选择时期"
                >
                  <!-- <el-option label="区域一" value="shanghai"></el-option> -->
                  <!-- <el-option label="区域二" value="beijing"></el-option> -->
                </el-select>
              </el-form-item>
            </el-col>
          </el-row>
        </el-form>
        <div style="text-align: right">
          <el-button type="primary" size="mini">搜索</el-button>
          <el-button size="mini">重置</el-button>
        </div>
      </view>
      <div v-if="showPerson" class="personDialog">
        <i
          class="el-icon-circle-close closeBtn"
          @click="
            () => {
              showPerson = false;
            }
          "
        ></i>
        <el-table :data="personList" style="width: 100%">
          <el-table-column prop="name" label="姓名">
            <template slot-scope="scope">
              <span
                style="color: #409eff; cursor: pointer"
                @click="
                  () => {
                    currentId = scope.row.id;
                    getData();
                  }
                "
                >{{ scope.row.name }}</span
              >
            </template>
          </el-table-column>
          <el-table-column prop="age" label="时代"> </el-table-column>
          <el-table-column prop="nativePlace" label="籍贯"> </el-table-column>
          <el-table-column prop="alias" label="别名"> </el-table-column>
          <el-table-column prop="division" label="医学分科"> </el-table-column>
        </el-table>
      </div>
    </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>
    <!-- 关系表地图 -->
    <div
      id="relation"
@@ -59,8 +177,7 @@
          font-size: 0.2rem;
          color: #666;
        "
      >
      </div>
      ></div>
    </div>
    <div id="customDialog" class="customDialog">
      <div class="title">
@@ -84,8 +201,10 @@
  getPersonData,
  getHotSearch,
  getPDataStatistics,
  academicSearch,
} from "@/api/index.js";
import * as echarts from "echarts";
import MyForm from "@/components/form/form.vue";
export default {
  data() {
    return {
@@ -96,172 +215,6 @@
      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: "",
@@ -277,6 +230,22 @@
      detailData: {
        name: "",
      },
      isAdvancedSearch: false,
      formData: {
        name: "",
        actively: "",
        works: "",
        personTags: "",
        socialIdentity: "",
        period: ""
      },
      showPerson: false,
      personList: [],
      personPageInfo: {
        totalCount: 0,
        page: 1,
        limit: 10,
      },
    };
  },
  mounted() {
@@ -285,7 +254,6 @@
    this.hotSearch();
    // 监听窗口大小变化
    window.addEventListener("resize", this.relation);
    this.innt();
  },
  onLoad(options) {
    this.searchKey = options.keyword;
@@ -302,12 +270,11 @@
          const obj = {
            personId: ele.personId,
            parentId: parent.id,
            id2: personInfo.id,
            relationTypeName: ele.relationTypeName,
            parentName: parent?.NAME[0]?.content1 ?? parent.parentName,
            name2: personInfo?.NAME[0]?.content1,
            name: personInfo?.NAME[0]?.content1,
            category: type,
            symbolSize: order,
            symbolSize: 15,
          };
          if (order > 80) {
            order = 80;
@@ -403,16 +370,16 @@
        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];
          if (ele["personList"] && ele["personList"]?.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) {
              if (ele[str] && data?.length) {
                ele[str].push(...data);
              }
            }
@@ -421,6 +388,8 @@
      }
      return arr;
    },
    // 文献
    //数组去重
    deduplicateArray(arr, idKey) {
@@ -455,9 +424,9 @@
        let place = [];
        let school = [];
        if (res && res.success && res.object) {
          // console.log(res.object);
          this.infoOfPersons = res.object?.infoOfPersons;
          this.infoOfSchools = res.object?.infoOfSchools;
          console.log(res.object);
          if (res.object?.personChain) {
            this.ownInfo = this.infoOfPersons.find(
              (item) => item.id == res.object?.personChain.personId
@@ -525,6 +494,7 @@
              this.categories.push({ name: "活动地" });
              let newArr = [];
              const data = this.changeLiterature(obj.placeList, "placeList");
              console.log(data, "place");
              this.getPersonInfo(data, "placeList", newArr, 1, 4, this.ownInfo);
              place = [...newArr];
            }
@@ -551,40 +521,16 @@
            ...place,
            ...school,
          ];
          // const k = personData.filter((item) => item.category == 0);
          // const t = personData.filter((item) => item.category == 1);
          // const l = personData.filter((item) => item.category == 2);
          // const o = personData.filter((item) => item.category == 3);
          // const p = personData.filter((item) => item.category == 4);
          // const s = personData.filter((item) => item.category == 5);
          // const nodesList = [...k, ...t, ...l, ...o, ...p, ...s];
          // console.log(nodesList);
          personData.forEach((item) => {
            let exists1 = this.nodes.some(
              (node) =>
                node.id === item.parentId && node.name === item.parentName
            );
            let exists2 = this.nodes.some(
              (node) => node.id === item.parentId && node.name === item.name2
            );
            // 证明不存在
            if (item.name1 && exists1 !== true) {
              this.nodes.push({
                name: item.parentName,
                id: item.parentId,
                ...item,
              });
            }
            if (item.name2 && exists2 !== true) {
              this.nodes.push({
                name: item.name2,
                id: item.id2,
                ...item,
              });
            }
            this.nodes.push({
              name: item.name,
              id: item.personId,
              ...item,
            });
            let obj = {
              source: item.parentName,
              target: item.name2,
              target: item.name,
              relation: item.relationTypeName || "", // 如果存在 relationName 字段则使用,否则为空字符串
            };
            this.relationships.push(obj);
@@ -601,6 +547,23 @@
      // 假设您有节点名称和它们之间的关系数据
      var nodes = this.deduplicateArray(this.nodes, "id");
      var relationships = this.relationships;
      nodes = nodes.map((item) => {
        let size = item.symbolSize;
        for (let i = 0; i < relationships.length; i++) {
          const linkItem = relationships[i];
          if (linkItem.source == item.parentName) {
            size += 5;
          }
          if (linkItem.target == item.parentName) {
            size += 5;
          }
        }
        return {
          ...item,
          symbolSize: size > 80 ? 80 : size,
        };
      });
      let FontSize = 12; // 字体大小
      let BorderWidth = 2; // 边框大小
@@ -627,7 +590,7 @@
      var links = [];
      relationships.forEach((relationship, i) => {
        var sourceIndex = nodes.findIndex(
          (node) => node.name === relationship.source
          (node) => node.parentName === relationship.source
        );
        var targetIndex = nodes.findIndex(
          (node) => node.name === relationship.target
@@ -766,34 +729,50 @@
    },
    // 基础搜索
    onSearch(val, index) {
      console.log(val);
      if (index !== undefined) {
        // 热门搜索关键字,直接查询数据
        this.searchKey = "";
        this.hotAciveIndex = index;
        this.currentId = val.text.id;
        this.getData();
      } else {
        this.hotAciveIndex = "";
        // 搜索先显示人物列表
        this.personPageInfo.page = 1;
        this.searchPerson(val.text);
      }
      this.getData(val.text);
    },
    // 高级搜索
    onSubmit(val) {
      getAdvanceSearch({
        ...val,
        page: 1,
        pageSize: 100,
    // 根据关键字检索人物
    searchPerson(key) {
      academicSearch({
        keyword: key,
        page: this.personPageInfo.page,
        pageSize: this.personPageInfo.limit,
      }).then((res) => {
        console.log(res, "res");
      });
    },
    advancedSearchBack() {
      uni.navigateTo({
        url: "/pages/knowledgeBase/knowledgeBase",
      });
    },
    // 点击下面的朝代按钮
    dynastyBottomClick(item) {
      this.dynastyColor = item.id;
      this.onSearch({
        text: item.name,
        this.personList = res.list.map((item) => {
          return {
            id: item.personId,
            name: item.name,
            age:
              item.periodList && item.periodList.length
                ? item.periodList[0].content2
                : "-",
            nativePlace:
              item.nativePlaceList && item.nativePlaceList.length
                ? item.nativePlaceList[0].content1
                : "-",
            alias:
              item.aliasList && item.aliasList.length
                ? item.aliasList[0].content2
                : "-",
            division:
              item.medicalBranchList && item.medicalBranchList.length
                ? item.medicalBranchList[0].content1
                : "-",
          };
        });
        this.showPerson = true;
      });
    },
    // 关系图 点击里面的元素
@@ -822,30 +801,23 @@
        const indexList = Object.keys(res.object);
        indexList.sort((a, b) => parseInt(b) - parseInt(a));
        this.hotKeyList = indexList.map((item) => {
          return res.object[item];
          return {
            id: item,
            name: 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);
        }
      });
    isAvancedClick() {
      this.isAdvancedSearch = !this.isAdvancedSearch;
      // this.$nextTick(() => {
      //   var box1Height = document.querySelector(".fbox").offsetHeight;
      //   // let box2Height= document.querySelector('.fbox1').style.height = box1Height + 'px';
      //   let box2Height = document.querySelector(".fbox1").offsetHeight;
      //   if (box1Height <= box2Height) {
      //     document.querySelector(".fbox1").style.height = box1Height + "px";
      //   }
      // });
    },
  },
};
@@ -856,7 +828,7 @@
  width: 100%;
  height: 100%;
  position: relative;
  background-image: url('../../static/image/characterRelationBg.png');
  background-image: url("../../static/image/characterRelationBg.png");
  background-size: 100% 100%;
  background-repeat: no-repeat;
  background-position: center;
@@ -951,4 +923,37 @@
    }
  }
}
.searchDialog {
  position: absolute;
  top: 0.68rem;
  left: 0;
  right: 0;
  z-index: 999;
  padding: 0.1rem 0.4rem;
  background: #fff;
  min-height: 2rem;
}
.personDialog {
  position: absolute;
  top: 0.68rem;
  z-index: 999;
  padding: 0.1rem;
  background: #fff;
  border-radius: 6px;
  box-shadow: 0 0 10px -3px #000;
  .closeBtn {
    position: absolute;
    right: -10px;
    top: -10px;
    width: 24px;
    height: 24px;
    font-size: 24px;
    background-color: #fff;
    border-radius: 50%;
    color: #f56c6c;
    cursor: pointer;
  }
}
</style>