新增“用户管理”
This commit is contained in:
@@ -5,8 +5,6 @@ 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
|
||||
@@ -323,45 +321,23 @@ 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 _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_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 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_dynamic('now-1M/M')
|
||||
pie_12m = _compute_type_counts_dynamic('now-12M/M')
|
||||
pie_1m = _compute_type_counts('now-1M/M', types)
|
||||
pie_12m = _compute_type_counts('now-12M/M', types)
|
||||
return {
|
||||
"last_10_days": days[-10:],
|
||||
"last_10_weeks": weeks[-10:],
|
||||
@@ -406,11 +382,16 @@ def write_user_data(user_data):
|
||||
bool: 写入成功返回True,失败返回False
|
||||
"""
|
||||
try:
|
||||
# enforce integer permission
|
||||
try:
|
||||
perm_val = int(user_data.get('permission', 1))
|
||||
except Exception:
|
||||
perm_val = 1
|
||||
user = UserDocument(
|
||||
user_id=user_data.get('user_id'),
|
||||
username=user_data.get('username'),
|
||||
password=user_data.get('password'),
|
||||
permission=user_data.get('permission', 1)
|
||||
permission=perm_val
|
||||
)
|
||||
user.save()
|
||||
print(f"用户数据写入成功: {user_data.get('username')}")
|
||||
@@ -460,7 +441,7 @@ def get_user_by_username(username):
|
||||
"user_id": hit.user_id,
|
||||
"username": hit.username,
|
||||
"password": hit.password,
|
||||
"permission": hit.permission
|
||||
"permission": int(hit.permission)
|
||||
}
|
||||
return None
|
||||
except Exception as e:
|
||||
@@ -479,7 +460,7 @@ def get_all_users():
|
||||
users.append({
|
||||
"user_id": hit.user_id,
|
||||
"username": hit.username,
|
||||
"permission": hit.permission
|
||||
"permission": int(hit.permission)
|
||||
})
|
||||
|
||||
return users
|
||||
@@ -497,73 +478,22 @@ def get_user_by_id(user_id):
|
||||
return {
|
||||
"user_id": hit.user_id,
|
||||
"username": hit.username,
|
||||
"permission": hit.permission,
|
||||
"permission": int(hit.permission),
|
||||
}
|
||||
return None
|
||||
except Exception as e:
|
||||
print(f"获取用户数据失败: {str(e)}")
|
||||
return None
|
||||
|
||||
def delete_user_by_username(username):
|
||||
"""
|
||||
根据用户名删除用户
|
||||
|
||||
参数:
|
||||
username (str): 用户名
|
||||
|
||||
返回:
|
||||
bool: 删除成功返回True,失败返回False
|
||||
"""
|
||||
try:
|
||||
search = UserDocument.search()
|
||||
search = search.query("term", username=username)
|
||||
response = search.execute()
|
||||
|
||||
if response.hits:
|
||||
user = response.hits[0]
|
||||
user.delete()
|
||||
print(f"用户 {username} 删除成功")
|
||||
return True
|
||||
return False
|
||||
except Exception as e:
|
||||
print(f"删除用户失败: {str(e)}")
|
||||
return False
|
||||
|
||||
def update_user_permission(username, new_permission):
|
||||
"""
|
||||
更新用户权限
|
||||
|
||||
参数:
|
||||
username (str): 用户名
|
||||
new_permission (int): 新权限级别
|
||||
|
||||
返回:
|
||||
bool: 更新成功返回True,失败返回False
|
||||
"""
|
||||
try:
|
||||
search = UserDocument.search()
|
||||
search = search.query("term", username=username)
|
||||
response = search.execute()
|
||||
|
||||
if response.hits:
|
||||
user = response.hits[0]
|
||||
user.permission = new_permission
|
||||
user.save()
|
||||
print(f"用户 {username} 权限更新为 {new_permission}")
|
||||
return True
|
||||
return False
|
||||
except Exception as e:
|
||||
print(f"更新用户权限失败: {str(e)}")
|
||||
return False
|
||||
|
||||
def delete_user_by_id(user_id):
|
||||
try:
|
||||
search = UserDocument.search()
|
||||
search = search.query("term", user_id=int(user_id))
|
||||
response = search.execute()
|
||||
if response.hits:
|
||||
user = response.hits[0]
|
||||
user.delete()
|
||||
hit = response.hits[0]
|
||||
doc = UserDocument.get(id=hit.meta.id)
|
||||
doc.delete()
|
||||
return True
|
||||
return False
|
||||
except Exception as e:
|
||||
@@ -576,14 +506,15 @@ def update_user_by_id(user_id, username=None, permission=None, password=None):
|
||||
search = search.query("term", user_id=int(user_id))
|
||||
response = search.execute()
|
||||
if response.hits:
|
||||
user = response.hits[0]
|
||||
hit = response.hits[0]
|
||||
doc = UserDocument.get(id=hit.meta.id)
|
||||
if username is not None:
|
||||
user.username = username
|
||||
doc.username = username
|
||||
if permission is not None:
|
||||
user.permission = int(permission)
|
||||
doc.permission = int(permission)
|
||||
if password is not None:
|
||||
user.password = password
|
||||
user.save()
|
||||
doc.password = password
|
||||
doc.save()
|
||||
return True
|
||||
return False
|
||||
except Exception as e:
|
||||
|
||||
Reference in New Issue
Block a user