From 9342f37b45d16b5cae757d39c0d7790fe659e22d Mon Sep 17 00:00:00 2001 From: spdis Date: Sat, 15 Nov 2025 18:32:47 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=8F=AF=E8=A7=86=E5=8C=96=E5=AD=97=E6=AE=B5=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E9=94=99=E8=AF=AF=E5=AF=BC=E8=87=B4=E9=A5=BC=E5=9B=BE?= =?UTF-8?q?=E7=94=9F=E6=88=90=E9=94=99=E8=AF=AF=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- elastic/es_connect.py | 48 ++++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/elastic/es_connect.py b/elastic/es_connect.py index a8fce2c..92dc2c0 100644 --- a/elastic/es_connect.py +++ b/elastic/es_connect.py @@ -5,6 +5,8 @@ Django版本的ES连接和操作模块 from elasticsearch import Elasticsearch from elasticsearch_dsl import connections import os +import json +import re from .documents import AchievementDocument, UserDocument, GlobalDocument from .indexes import ACHIEVEMENT_INDEX_NAME, USER_INDEX_NAME, GLOBAL_INDEX_NAME import hashlib @@ -321,23 +323,45 @@ def _compute_hist(range_gte: str, interval: str, fmt: str): buckets = getattr(resp.aggs, 'b').buckets return [{"label": b.key_as_string, "count": b.doc_count} for b in buckets] -def _compute_type_counts(range_gte: str, types: list): - counts = [] - for t in types: - s = AchievementDocument.search() - s = s.filter('range', time={'gte': range_gte, 'lte': 'now'}) - s = s.query('match_phrase', data=str(t)) - total = s.count() - counts.append({"type": str(t), "count": int(total)}) - return counts +def _parse_type_from_data(data_str: str): + try: + obj = json.loads(data_str) + if isinstance(obj, dict): + for k in ("数据类型", "类型", "type"): + if k in obj and obj.get(k): + return str(obj.get(k)).strip().strip(';') + except Exception: + pass + try: + m = re.search(r'"数据类型"\s*:\s*"(.*?)"', data_str) + if m: + return str(m.group(1)).strip().strip(';') + except Exception: + pass + return None + +def _compute_type_counts_dynamic(range_gte: str): + s = AchievementDocument.search() + s = s.filter('range', time={'gte': range_gte, 'lte': 'now'}) + s = s.query('match_all') + counts_map = {} + for hit in s.scan(): + t = _parse_type_from_data(getattr(hit, 'data', '') or '') + if not t: + continue + counts_map[t] = counts_map.get(t, 0) + 1 + try: + ensure_type_in_list(t) + except Exception: + pass + return [{"type": k, "count": int(v)} for k, v in counts_map.items()] def compute_analytics(): - types = get_type_list() days = _compute_hist('now-10d/d', 'day', 'yyyy-MM-dd') weeks = _compute_hist('now-10w/w', 'week', 'yyyy-ww') months = _compute_hist('now-10M/M', 'month', 'yyyy-MM') - pie_1m = _compute_type_counts('now-1M/M', types) - pie_12m = _compute_type_counts('now-12M/M', types) + pie_1m = _compute_type_counts_dynamic('now-1M/M') + pie_12m = _compute_type_counts_dynamic('now-12M/M') return { "last_10_days": days[-10:], "last_10_weeks": weeks[-10:], From 0e23fe8266c296e7fb4c6c8d968c628ee2f60e71 Mon Sep 17 00:00:00 2001 From: spdis Date: Sat, 15 Nov 2025 18:43:32 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=AE=8C=E8=8E=AB?= =?UTF-8?q?=E5=90=8D=E5=85=B6=E5=A6=99=E5=B0=91=E4=BA=86=E4=B8=AA=E4=B8=9C?= =?UTF-8?q?=E8=A5=BF=E5=BC=80=E5=A7=8B=E6=8A=A5=E9=94=99=EF=BC=8C=E8=A1=A5?= =?UTF-8?q?=E4=B8=80=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- elastic/views.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/elastic/views.py b/elastic/views.py index 92678f5..eb54e74 100644 --- a/elastic/views.py +++ b/elastic/views.py @@ -466,3 +466,9 @@ def manage_page(request): user_id_qs = request.GET.get("user_id") context = {"items": results, "user_id": user_id_qs or session_user_id} return render(request, "elastic/manage.html", context) + + +@require_http_methods(["GET"]) +def user_manage(request): + from django.shortcuts import redirect + return redirect("/elastic/users/")