From aa07aa05f1ae3cef118c00c3ac7c11e6f0b263c6 Mon Sep 17 00:00:00 2001 From: zhaoxiangpeng <1943364377@qq.com> Date: Wed, 7 Jan 2026 17:54:06 +0800 Subject: [PATCH] =?UTF-8?q?cnki:=E4=BF=AE=E6=94=B9=E6=9E=9A=E4=B8=BE?= =?UTF-8?q?=E7=B1=BB=E7=9A=84=E4=BD=BF=E7=94=A8=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=8D=95=E4=B8=80=E7=BB=93=E6=9E=9C=E6=90=9C=E7=B4=A2=E7=9A=84?= =?UTF-8?q?model?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../science_article_cnki/models/cnki_model.py | 92 ++++++++++++++++--- 1 file changed, 79 insertions(+), 13 deletions(-) diff --git a/science_article_cnki/science_article_cnki/models/cnki_model.py b/science_article_cnki/science_article_cnki/models/cnki_model.py index ee4cfd7..8b86797 100644 --- a/science_article_cnki/science_article_cnki/models/cnki_model.py +++ b/science_article_cnki/science_article_cnki/models/cnki_model.py @@ -7,7 +7,11 @@ import json from typing import Union, List, Dict from datetime import datetime, timedelta -from science_article_cnki.models.enum_cls import ResourceType, SearchTypeId, SearchFieldEnum, OperatorEnum, LogicEnum, SearchFromId +from science_article_cnki.models.enum_cls import ( + ResourceType, SourceDatabaseEnum, + SearchTypeId, SearchFieldEnum, OperatorEnum, LogicEnum, + SingleResultEnum +) DB_CODE = { 'CFLS': '总库', @@ -53,7 +57,7 @@ def navigator_body(query: str = None, db_code: str = 'CFLS', **kwargs): return _param -def signal_body(query: str = None, resource_type: str = 'JOURNAL', group_id: str = 'YE', **kwargs): +def signal_body(query: str = None, resource_type: str = '学术期刊', group_id: str = 'YE', **kwargs): """ 获取左侧导航栏单类目的聚合 :group_id: 主要主题1; 学科2; 发表年度3; 研究层次4; 文献类型5; 文献来源6; 作者7; 机构8; 基金9 @@ -65,8 +69,8 @@ def signal_body(query: str = None, resource_type: str = 'JOURNAL', group_id: str _param = { 'queryJson': json.dumps({ "Platform": "", - "Resource": ResourceType[resource_type].name, - "Classid": ResourceType[resource_type].value, + "Resource": ResourceType[resource_type].value, + "Classid": SourceDatabaseEnum[resource_type].value, "Products": "", "QNode": { "QGroup": [{ @@ -101,14 +105,14 @@ def signal_body(query: str = None, resource_type: str = 'JOURNAL', group_id: str return _param -def refine_search(query: str, resource_type: str = 'JOURNAL', year=None, subject=None, code=None, **kwargs): +def refine_search(query: str, resource_type: str = '学术期刊', year=None, subject=None, code=None, **kwargs): """ 使用专业检索式,检索后再次检索年份 """ _query = { "Platform": "", - "Resource": ResourceType[resource_type].name, - "Classid": ResourceType[resource_type].value, + "Resource": ResourceType[resource_type].value, + "Classid": SourceDatabaseEnum[resource_type].value, "Products": "", "QNode": { "QGroup": [{ @@ -400,6 +404,52 @@ def add_search_word(search_content: str, base_query: dict = None): return words_query +def add_muti_group( + project: Union[SingleResultEnum, str], + value: str, + text_or_title: str, + base_query: dict = None, + **kwargs) -> dict: + """ + 添加筛选项 + Key : 筛选项标记 + Items[].Title <>: 筛选项的名称 input/@title + Items[].Name <>: 筛选项的名称 input/@title + Items[].Key <>: 筛选项的代码 input/@value + Items[].Value <>: 筛选项的代码(与Items.Key一致) input/@value + Items[].Value2 <>: 空字符串 + Items[].Field <>: 筛选项标记,同组的Key一致 + """ + if isinstance(project, SingleResultEnum): + project = project.value + elif isinstance(project, str): + project = SingleResultEnum[project].value + child_item = { + "Key": project, + "Title": "", + "Logic": 0, + "Items": [ + { + "Key": value, + "Title": text_or_title, + "Logic": 1, + "Field": project, + "Operator": "DEFAULT", + "Value": value, + "Value2": "", + "Name": project, + "ExtendType": 0 + }], + "ChildItems": [ + ] + } + + if base_query: + add_limit_2query_body(child_item, "MutiGroup", base_query) + + return child_item + + def limit_year_range(year: int, base_query: dict = None): """ 添加年份筛选 @@ -449,7 +499,7 @@ def parse_updatedtime_symbol(symbol: str, today: str = None) -> tuple: elif symbol == "最近半年": ago_day = today - timedelta(days=181) elif symbol == "最近一年": - ago_day = today.replace(year=today.year-1) + ago_day = today.replace(year=today.year - 1) elif symbol == "今年迄今": ago_day = today.replace(month=1, day=1) else: @@ -494,7 +544,7 @@ def temp_refine_search( query: str, year: int = None, updated_date: str = None, - resource_type: str = 'JOURNAL', + resource_type: str = '学术期刊', **kwargs ): """ @@ -508,8 +558,8 @@ def temp_refine_search( """ _query = { "Platform": "", - "Resource": ResourceType[resource_type].name, - "Classid": ResourceType[resource_type].value, + "Resource": ResourceType[resource_type].value, + "Classid": SourceDatabaseEnum[resource_type].value, "Products": "", "QNode": { "QGroup": [ @@ -567,7 +617,8 @@ def temp_query_search(query_body, query: str = None, page: int = 1, page_size: i "dstyle": "listmode", "boolSortSearch": "false", "aside": aside, - "searchFrom": "资源范围:学术期刊; 仅看有全文,中英文扩展; 时间范围:更新时间:%(updated_date)s; 来源类别:全部期刊; " % {"updated_date": updated_date}, + "searchFrom": "资源范围:学术期刊; 仅看有全文,中英文扩展; 时间范围:更新时间:%(updated_date)s; 来源类别:全部期刊; " % { + "updated_date": updated_date}, "subject": "", "language": "", "uniplatform": "", @@ -584,7 +635,8 @@ def temp_query_search(query_body, query: str = None, page: int = 1, page_size: i 'dstyle': 'listmode', 'boolSortSearch': "false", 'aside': '', - 'searchFrom': '资源范围:学术期刊; 时间范围:更新时间:%(updated_date)s; 来源类别:全部期刊; ' % {"updated_date": updated_date}, + 'searchFrom': '资源范围:学术期刊; 时间范围:更新时间:%(updated_date)s; 来源类别:全部期刊; ' % { + "updated_date": updated_date}, "subject": "", "language": "", "uniplatform": "" @@ -595,6 +647,20 @@ def temp_query_search(query_body, query: str = None, page: int = 1, page_size: i adv_query_search = temp_query_search +def single_result_nav( + queryJson: Union[dict, str], + groupId: Union[str, SingleResultEnum] +) -> Dict[str, str]: + if isinstance(queryJson, dict): + queryJson = json.dumps(queryJson, ensure_ascii=False) + if isinstance(groupId, SingleResultEnum): + groupId = groupId.value + return dict( + queryJson=queryJson, + groupId=groupId, + ) + + class SearchPaperArgModel: pass