From 5c4837cdef21239ab1f192aade5e08b2cb75fcc0 Mon Sep 17 00:00:00 2001 From: zhongshujie <2862698242@qq.com> Date: 星期三, 14 五月 2025 17:56:40 +0800 Subject: [PATCH] Merge branch 'master' of http://182.92.203.7:2001/r/wyyDatabase --- src/views/achievements/index.vue | 497 ++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 350 insertions(+), 147 deletions(-) diff --git a/src/views/achievements/index.vue b/src/views/achievements/index.vue index 42bb078..93253d3 100644 --- a/src/views/achievements/index.vue +++ b/src/views/achievements/index.vue @@ -37,27 +37,27 @@ <!-- 绫诲瀷 --> <ul> <li class="left-title"> - <span>{{ category.title }}</span> - <p @click="category.isDisplay = !category.isDisplay"> + <span>{{ categoryOBJ.title }}</span> + <p @click="categoryOBJ.isDisplay = !categoryOBJ.isDisplay"> <img - :src="[category.isDisplay ? topIcon : bottomIcon]" + :src="[categoryOBJ.isDisplay ? topIcon : bottomIcon]" alt="" /> </p> </li> - <li class="left-main" v-if="category.isDisplay"> + <li class="left-main" v-if="categoryOBJ.isDisplay"> <div class="category-main" - v-for="(item, index) in category.list" + v-for="(item, index) in categoryOBJ.list" :key="index" > <el-checkbox class="el-checkbox" v-model="item.checked" :title="item.name" - @change="categoryChange(item)" + @change="categoryChange(categoryOBJ.title, item)" style="display: inline-block; vertical-align: middle" - >{{ item.name }}</el-checkbox + >{{ item.valueName }}</el-checkbox > <span class="" @@ -72,19 +72,19 @@ <li class="left-title"> <div> <span>{{ annual.title }}</span> - <span> + <span @click="timeSortChange()"> 鏃堕棿 <img class="sort-Icon" - :src="[isDisplay ? sortTop : sortBottom]" + :src="[resourceTypeSortInfo ? sortTop : sortBottom]" alt="" /> </span> - <span + <span @click="countSortChange()" >鏂囩尞閲� <img class="sort-Icon" - :src="[isDisplay ? sortBottom : sortTop]" + :src="[particularYearSortInfo ? sortTop : sortBottom]" alt="" /> </span> @@ -109,8 +109,9 @@ class="el-checkbox" v-model="item.checked" :title="item.years" - >{{ item.years }}</el-checkbox - > + @change="categoryChange(annual.title, item)" + >{{ item.name }} + </el-checkbox> <span class="">{{ item.num }}</span> </div> <p @@ -127,11 +128,11 @@ <li class="left-title"> <div> <span>{{ sources.title }}</span> - <span> + <span @click="sourcesSortChange()"> 鏂囩尞閲� <img class="sort-Icon" - :src="[isDisplay ? sortBottom : sortTop]" + :src="[sourceFromSortInfo ? sortBottom : sortTop]" alt="" /> </span> @@ -156,6 +157,7 @@ class="el-checkbox" :title="item.name" v-model="item.checked" + @change="categoryChange(sources.title, item)" >{{ item.name }}</el-checkbox > <span class="">{{ item.num }}</span> @@ -174,25 +176,13 @@ <li class="left-title"> <span>{{ subject.title }}</span> <p @click="subject.isDisplay = !subject.isDisplay"> - <img - :src="[subject.isDisplay ? topIcon : bottomIcon]" - alt="" - /> + <img :src="[subject.isDisplay ? topIcon : bottomIcon]" alt="" /> </p> </li> <li class="left-main" v-if="subject.isDisplay"> - <div - class="category-main" - v-for="(item, index) in subject.list" - :key="index" - > - <el-checkbox - class="el-checkbox" - v-model="item.checked" - :title="item.name" - @change="subjectChange(item)" - >{{ item.name }}</el-checkbox - > + <div class="category-main" v-for="(item, index) in subject.list" :key="index"> + <el-checkbox class="el-checkbox" v-model="item.checked" :title="item.name" + @change="subjectChange(item)">{{ item.name }}</el-checkbox> <span class="">{{ item.num }}</span> </div> </li> @@ -208,9 +198,9 @@ <!-- title閮ㄥ垎 --> <ul class="right-header"> <li v-for="(item, index) in associationList" :key="index"> - <p>{{ item.type }} : {{ item.content }}</p> + <p>{{ item.type }} : {{ item.name }}</p> <img - @click="removeAssociationList(item.content)" + @click="removeAssociationList(item)" :src="errorIcon" alt="" /> @@ -234,16 +224,21 @@ class="right-main" v-for="(item, index) in resultList" :key="index" + @click ="goPage(item.id)" > <li class="main-name"> <p>{{ item.name }}</p> <p> - <el-button @click="goPage(item.id)">璇︽儏</el-button> - <el-button>AI鏅鸿兘闃呰</el-button> + <!-- <el-button >璇︽儏</el-button> --> + <el-button @click.stop="openAiReading(item.AIReading, item.name)" + >AI鏅鸿兘闃呰</el-button + > </p> </li> <li class="main-sources"> - <span>{{ item.resourceTypeName }}</span> + <span :class="getResourceTypeClass(item.cmsItemType)">{{ + item.resourceTypeName + }}</span> <span>{{ item.source }}</span> <span>{{ item.year }}</span> <span v-if="item.DOI">doi锛歿{ item.DOI }}</span> @@ -271,7 +266,7 @@ class="keyWord" v-for="(citem, cindex) in item.keyWords" :key="cindex" - @click=" + @click.stop=" () => handleSearch({ text: citem, @@ -292,10 +287,34 @@ :background="isBackground" layout="prev, pager, next" :total="total" - :page-size="6" + :page-size="10" > </el-pagination> </div> + <el-dialog + v-model="dialogVisible" + :title="aIName" + width="60vw" + top="3vh" + bottom="2vh" + :visible.sync="dialogVisible" + class="custom-dialog" + > + <div + class="AIReadingBox" + element-loading-spinner="el-icon-loading" + element-loading-background="rgba(0, 0, 0, 0)" + > + <div + class="richTextInitBox" + v-if="AIReading" + v-html="AIReading" + ></div> + <div class="richTextInitError" v-else> + 缃戠粶绻佸繖锛岃绋嶅悗鍐嶈瘯銆� + </div> + </div> + </el-dialog> <el-empty v-if="!loading && !resultList.length"></el-empty> </div> </div> @@ -318,6 +337,9 @@ }, data() { return { + dialogVisible: false, + aIName: "", + AIReading: "", relatedList: [], // 杈撳叆妗嗙殑鍐呭 inputValue: "", @@ -391,7 +413,7 @@ { type: "input", label: "鍏抽敭璇�", - name: "keyword", + name: "keyWords", value: "", }, { @@ -414,72 +436,31 @@ isDisplay: true, id: "", index: "", - list: [ - { - name: "鏈熷垔", - num: 190, - check: false, - }, - { - name: "鍥句功", - num: 190, - check: false, - }, - { - name: "瑙嗛", - num: 190, - check: false, - }, - { - name: "闊抽", - num: 190, - check: false, - }, - ], + list: [], + }, + + // 绫诲瀷 + categoryOBJ: { + title: "绫诲瀷", + isDisplay: true, + id: "", + index: "", + list: [], }, categoryChecList: [], subjectCheckList: [], postedSortInfo: true, + resourceTypeSortInfo: true, + particularYearSortInfo: true, + sourceFromSortInfo: true, // 骞村害 annual: { title: "骞村害", isDisplay: true, id: "", index: "", - list: [ - { - years: "2025", - num: 10, - check: false, - }, - { - years: "2024", - num: 18, - check: false, - }, - { - years: "2023", - num: 21, - check: false, - }, - { - years: "2022", - num: 19, - check: false, - }, - { - years: "2021", - num: 22, - check: false, - }, - { - years: "2020", - num: 24, - check: false, - }, - - ], + list: [], }, // 鏂囩尞鏉ユ簮 sources: { @@ -487,34 +468,7 @@ isDisplay: true, id: "", index: "", - list: [ - { - name: "鍖椾含涓尰鑽ぇ瀛﹀ぇ瀛﹀鎶�", - num: 190, - check: false, - }, - { - name: "鍖椾含甯堣寖澶у", - num: 19, - check: false, - }, - { - name: "涓浗涓尰绉戝闄�", - num: 22, - check: false, - }, - { - name: "鍖椾含涓尰鑽ぇ瀛﹀ぇ瀛﹀鎶�", - num: 31, - check: false, - }, - { - name: "骞垮窞涓尰鑽ぇ瀛�", - num: 25, - check: false, - }, - - ], + list: [], }, // 瀛︾ subject: { @@ -562,11 +516,11 @@ resultList: [], total: 0, paginationPage: 1, - loading: false, + loading: true, labelList: { abstract: "鎽樿", author: "浣滆��", - keyword: "鍏抽敭璇�", + keyWords: "鍏抽敭璇�", source: "鏉ユ簮", Name: "鏍囬", year: "骞翠唤", @@ -574,16 +528,23 @@ }; }, mounted() { + this.inputType = this.$route.query.type; + this.inputValue = this.$route.query.value; this.getSelectData(); + this.getSidebarData(); }, methods: { - categoryChange(val) { + categoryChange(typeName, val) { + console.log(val, "val"); + console.log(typeName, "typeName"); if (val.checked) { this.categoryChecList.push(val.value); this.associationList.push({ - type: "绫诲瀷", + type: typeName, content: val.name, + value: val.value, + name: val.valueName || val.name, }); } else { const index = this.categoryChecList.findIndex( @@ -624,8 +585,8 @@ content: val[key], value: key, }); - }else { - hasKey.content = val[key] + } else { + hasKey.content = val[key]; } } } @@ -697,10 +658,36 @@ // 鍒犻櫎 removeAssociationList(value) { + console.log(value, "value"); this.associationList = this.associationList.filter( - (item) => item.content !== value + (item) => item.content !== value.content ); this.inputValue = ""; + + switch (value.value) { + case "resourceType": + this.categoryOBJ.list.forEach((item) => { + if (item.name == value.content) { + item.checked = false; + } + }); + break; + + case "particularYear": + this.annual.list.forEach((item) => { + if (item.name == value.content) { + item.checked = false; + } + }); + break; + case "sourceFrom": + this.sources.list.forEach((item) => { + if (item.name == value.content) { + item.checked = false; + } + }); + break; + } // 閫氱煡鐖剁粍浠舵暟鎹凡鏀瑰彉 this.getItemList(); }, @@ -710,7 +697,6 @@ console.log(isText, "isText"); this.associationList = []; console.log(isText, "isText"); - if (isText.text != "") { this.inputValue = isText.text; this.inputType = isText.type; @@ -722,10 +708,67 @@ this.getItemList(); } }, + //鑾峰彇渚ц竟鏍忔暟鎹� + getSidebarData() { + MG.resource + .getItem({ + path: "*", + queryType: "*", + fields: { + GroupBy: [["particularYear"], ["sourceFrom"], ["resourceType"]], + "subjectAffiliation*": this.subjectCheckList, + }, + }) + .then((res) => { + // 澶勭悊group鐨勬暟鎹� + console.log(res, "res009"); + + res.groups.forEach((item) => { + if ( + item.key == "particularYear" && + item.datas && + item.datas.length + ) { + item.datas.forEach((citem) => { + this.annual.list.push({ + name: citem.groupKey, + num: citem.count, + value: item.key, + check: false, + }); + }); + } + + if (item.key == "sourceFrom" && item.datas && item.datas.length) { + item.datas.forEach((citem) => { + this.sources.list.push({ + name: citem.groupKey, + num: citem.count, + value: item.key, + check: false, + }); + }); + } + + if (item.key == "resourceType" && item.datas && item.datas.length) { + item.datas.forEach((citem) => { + this.categoryOBJ.list.push({ + name: citem.groupKey, + valueName: this.getGroupKey(citem.groupKey), + value: item.key, + num: citem.count, + check: false, + }); + }); + } + }); + }); + }, // 璇锋眰鏁版嵁 getItemList() { this.loading = true; + let searchData = {}; // 鍒濆鍖栦竴涓┖瀵硅薄鏉ュ瓨鍌ㄦ悳绱㈡暟鎹� if (this.inputValue) { // 濡傛灉杈撳叆鍊煎瓨鍦� @@ -738,6 +781,8 @@ // 閬嶅巻杈撳叆閫夐」 for (let index = 0; index < this.inputOptions.length; index++) { const item = this.inputOptions[index]; // 鑾峰彇褰撳墠閫夐」 + + debugger; if (item.value !== "all") { // 濡傛灉褰撳墠閫夐」鐨勫�间笉鏄�"all" if (!Object.keys(searchData).length) { @@ -754,28 +799,55 @@ } } } - console.log(searchData, "searchData1"); + console.log(this.associationList, "this.associationList"); if (this.associationList && this.associationList.length) { + let resourceTypeValueList = []; + let particularYearValueList = []; + let sourceFromValueList = []; + this.associationList.forEach((item) => { - if (item.value == "year") { - const endDate = item.content.split("/")[0] + "/12/31 23:59:59"; - const startDate = item.content.split("/")[0] + "/01/01 00:00:00"; - searchData[item.value + ">="] = startDate; - searchData[item.value + "<="] = endDate; - } else if (item.value) { - searchData[item.value + "*"] = item.content; + debugger; + if (item.value !== "all") { + if (item.value == "year") { + const endDate = item.content.split("/")[0] + "/12/31 23:59:59"; + const startDate = item.content.split("/")[0] + "/01/01 00:00:00"; + searchData[item.value + ">="] = startDate; + searchData[item.value + "<="] = endDate; + } else if (item.value != "year") { + if (item.value == "resourceType") { + resourceTypeValueList.push(item.content); + searchData[item.value + "*"] = resourceTypeValueList; + } else if (item.value == "particularYear") { + particularYearValueList.push(item.content); + searchData[item.value + "*"] = particularYearValueList; + } else if (item.value == "sourceFrom") { + sourceFromValueList.push(item.content); + searchData[item.value + "*"] = sourceFromValueList; + } + } else { + searchData["||" + item.value + "*"] = item.content; + } } }); } + // for (let key in searchData) { + // if (searchData[key].length === 1) { + // searchData[key] = searchData[key][0]; + // } + // } console.log(searchData, "searchData"); + console.log(this.resourceTypeValueList, "resourceTypeValueList"); + const isResourceTypeValueList = this.categoryChecList.filter( + (item) => this.resourceTypeValueList.indexOf(item) !== -1 + ); MG.resource .getItem({ path: "*", queryType: "*", paging: { - start: (this.paginationPage - 1) * 6, - size: 6, + start: (this.paginationPage - 1) * 10, + size: 10, }, sort: { year: this.postedSortInfo ? "Desc" : "Asc", @@ -783,11 +855,14 @@ fields: { cmsType: ["cmsItem"], "resourceType*": - this.categoryChecList.length > 0 - ? this.categoryChecList + isResourceTypeValueList.length > 0 + ? isResourceTypeValueList : this.resourceTypeValueList, source: [], + isbn: [], year: [], + particularYear: [], + contributor: [], abstract: [], keyWords: [], author: [], @@ -795,13 +870,14 @@ AIReading: [], file: [], IssueNumber: [], + // "particularYear*": ["2009"], + GroupBy: [["particularYear"], ["sourceFrom"], ["resourceType"]], "subjectAffiliation*": this.subjectCheckList, ...searchData, }, }) .then((res) => { - console.log(res, "鍏ㄩ儴鍐呭"); - + console.log(res, "res"); res.datas.forEach((item) => { item.year = moment(item.year).format("YYYY-MM-DD"); if (typeof item.keyWords === "string") { @@ -857,6 +933,74 @@ sortChange() { this.postedSortInfo = !this.postedSortInfo; this.getItemList(); + }, + timeSortChange() { + this.resourceTypeSortInfo = !this.resourceTypeSortInfo; + this.annual.list.sort((a, b) => { + a.name - b.name; + }); + if (this.resourceTypeSortInfo) { + this.annual.list.sort((a, b) => a.name - b.name); + } else { + this.annual.list.sort((a, b) => b.name - a.name); + } + }, + countSortChange() { + this.particularYearSortInfo = !this.particularYearSortInfo; + + if (!this.particularYearSortInfo) { + this.annual.list.sort((a, b) => a.num - b.num); + } else { + this.annual.list.sort((a, b) => b.num - a.num); + } + console.log(this.annual.list, "this.annual.list"); + }, + sourcesSortChange() { + this.sourceFromSortInfo = !this.sourceFromSortInfo; + if (this.sourceFromSortInfo) { + this.sources.list.sort((a, b) => a.num - b.num); + } else { + this.sources.list.sort((a, b) => b.num - a.num); + } + }, + getResourceTypeClass(typeName) { + switch (typeName) { + case "journal": + return "journal-color"; + case "books": + return "books-color"; + case "video": + return "video-color"; + case "audio": + return "audio-color"; + case "newspaper": + return "newspaper-color"; + default: + return "other-color"; + } + }, + + getGroupKey(typeName) { + switch (typeName) { + case "journal": + return "鏈熷垔"; + case "books": + return "鍥句功"; + case "video": + return "瑙嗛"; + case "audio": + return "闊抽"; + case "newspaper": + return "newspaper-color"; + default: + return "other-color"; + } + }, + + openAiReading(text, name) { + this.AIReading = text; + this.aIName = name; + this.dialogVisible = true; }, }, }; @@ -1252,6 +1396,11 @@ padding: 19px 30px 15px 30px; border: 1px solid #decaac; + &:hover { + cursor: pointer; + border: 1px solid #937950; + } + .main-name { display: flex; align-items: center; @@ -1280,10 +1429,34 @@ } } + .journal-color { + background-color: #87a8b9; + } + + .books-color { + background-color: #c48787; + } + + .video-color { + background-color: #6f8f5a; + } + + .audio-color { + background-color: #937950; + } + + .newspaper-color { + background-color: #8d77b3; + } + + .other-color { + background-color: #009f9f; + } + .main-sources { span:nth-child(1) { padding: 3px 5px; - background-color: #87a8b9; + color: #fff; margin-right: 10px; } @@ -1376,6 +1549,23 @@ } } +.AIReadingBox { + height: 85vh; + min-height: 600px; + padding: 20px 10px; +} + +.richTextInitBox { + height: 100%; + overflow: auto; +} +.richTextInitError { + height: 100%; + display: flex; + align-items: center; + justify-content: center; +} + .pagination { display: flex; justify-content: center; @@ -1419,8 +1609,21 @@ border-radius: 5px; border: 1px solid #cccccc; } -:deep.el-pagination.is-background .el-pager li:not(.disabled):hover{ - color: #937950 + +:deep.el-pagination.is-background .el-pager li:not(.disabled):hover { + color: #937950; +} + +:deep.el-button--primary { + background-color: #937950; + color: #937950; + border: 1px solid #937950; + cursor: pointer; + + &:hover { + background-color: #937950; + color: #fffdf8; + } } </style> -- Gitblit v1.9.1