新增“数据编辑”
This commit is contained in:
BIN
db.sqlite3
BIN
db.sqlite3
Binary file not shown.
@@ -1,6 +1,24 @@
|
|||||||
from django.apps import AppConfig
|
from django.apps import AppConfig
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
class ElasticConfig(AppConfig):
|
class ElasticConfig(AppConfig):
|
||||||
default_auto_field = "django.db.models.BigAutoField"
|
default_auto_field = "django.db.models.BigAutoField"
|
||||||
name = "elastic"
|
name = "elastic"
|
||||||
|
|
||||||
|
def ready(self):
|
||||||
|
# 避免在 migrate、collectstatic 等管理命令中执行
|
||||||
|
if os.environ.get('RUN_MAIN') != 'true':
|
||||||
|
# Django 开发服务器会启动两个进程,只在主进程执行
|
||||||
|
return
|
||||||
|
|
||||||
|
# 避免在 manage.py 命令(除 runserver 外)中执行
|
||||||
|
if 'runserver' not in sys.argv:
|
||||||
|
return
|
||||||
|
|
||||||
|
# 延迟导入,避免循环导入或过早加载
|
||||||
|
from .es_connect import create_index_with_mapping
|
||||||
|
try:
|
||||||
|
create_index_with_mapping()
|
||||||
|
except Exception as e:
|
||||||
|
print(f"❌ ES 初始化失败: {e}")
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
from django_elasticsearch_dsl import Document, fields, Index
|
from django_elasticsearch_dsl import Document, fields, Index
|
||||||
from .models import AchievementData, User, ElasticNews
|
from .models import AchievementData, User, ElasticNews
|
||||||
from .indexes import INDEX_NAME
|
from .indexes import *
|
||||||
|
|
||||||
ACHIEVEMENT_INDEX = Index(INDEX_NAME)
|
ACHIEVEMENT_INDEX = Index(ACHIEVEMENT_INDEX_NAME)
|
||||||
ACHIEVEMENT_INDEX.settings(number_of_shards=1, number_of_replicas=0)
|
ACHIEVEMENT_INDEX.settings(number_of_shards=1, number_of_replicas=0)
|
||||||
|
USER_INDEX = Index(USER_INDEX_NAME)
|
||||||
USER_INDEX = ACHIEVEMENT_INDEX
|
USER_INDEX.settings(number_of_shards=1, number_of_replicas=0)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -19,27 +19,43 @@ DATA_INDEX_NAME = ACHIEVEMENT_INDEX_NAME
|
|||||||
USERS_INDEX_NAME = USER_INDEX_NAME
|
USERS_INDEX_NAME = USER_INDEX_NAME
|
||||||
|
|
||||||
def create_index_with_mapping():
|
def create_index_with_mapping():
|
||||||
"""创建索引和映射配置"""
|
"""创建索引和映射配置(仅当索引不存在时)"""
|
||||||
|
# 获取 Elasticsearch 客户端(与 Document 使用的客户端一致)
|
||||||
try:
|
try:
|
||||||
# 创建获奖数据索引
|
# --- 1. 处理获奖数据索引 ---
|
||||||
AchievementDocument.init()
|
if not es.indices.exists(index=DATA_INDEX_NAME):
|
||||||
print(f"创建索引 {DATA_INDEX_NAME} 并设置映射")
|
AchievementDocument.init()
|
||||||
|
print(f"✅ 创建索引 {DATA_INDEX_NAME} 并设置映射")
|
||||||
# 创建用户索引
|
else:
|
||||||
UserDocument.init()
|
print(f"ℹ️ 索引 {DATA_INDEX_NAME} 已存在,跳过创建")
|
||||||
print(f"创建索引 {USERS_INDEX_NAME} 并设置映射")
|
|
||||||
|
# --- 2. 处理用户索引 ---
|
||||||
# 创建默认管理员用户
|
if not es.indices.exists(index=USERS_INDEX_NAME):
|
||||||
|
UserDocument.init()
|
||||||
|
print(f"✅ 创建索引 {USERS_INDEX_NAME} 并设置映射")
|
||||||
|
else:
|
||||||
|
print(f"ℹ️ 索引 {USERS_INDEX_NAME} 已存在,跳过创建")
|
||||||
|
|
||||||
|
# --- 3. 创建默认管理员用户(可选:也可检查用户是否已存在)---
|
||||||
|
# 这里简单处理:每次初始化都写入(可能重复),建议加唯一性判断
|
||||||
admin_user = {
|
admin_user = {
|
||||||
"user_id": 0000000000,
|
"user_id": 0,
|
||||||
"username": "admin",
|
"username": "admin",
|
||||||
"password": "admin",
|
"password": "admin", # ⚠️ 生产环境务必加密!
|
||||||
"permission": 0
|
"permission": 0
|
||||||
}
|
}
|
||||||
write_user_data(admin_user)
|
# 可选:检查 admin 是否已存在(根据 user_id 或 username)
|
||||||
|
from elasticsearch_dsl import Search
|
||||||
|
s = Search(using=es, index=USERS_INDEX_NAME).query("match", username="admin")
|
||||||
|
if s.count() == 0:
|
||||||
|
write_user_data(admin_user)
|
||||||
|
print("✅ 默认管理员用户已创建")
|
||||||
|
else:
|
||||||
|
print("ℹ️ 默认管理员用户已存在,跳过创建")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"创建索引失败: {str(e)}")
|
print(f"❌ 创建索引失败: {str(e)}")
|
||||||
|
# raise # 可选:在 AppConfig 中捕获,这里可以 re-raise 便于调试
|
||||||
|
|
||||||
def get_doc_id(data):
|
def get_doc_id(data):
|
||||||
"""
|
"""
|
||||||
@@ -240,7 +256,7 @@ def search_by_any_field(keyword):
|
|||||||
|
|
||||||
def write_user_data(user_data):
|
def write_user_data(user_data):
|
||||||
"""
|
"""
|
||||||
写入用户数据到ES
|
写入用户数据到 ES
|
||||||
|
|
||||||
参数:
|
参数:
|
||||||
user_data (dict): 用户数据
|
user_data (dict): 用户数据
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ app_name = 'elastic'
|
|||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
# ES索引管理
|
# ES索引管理
|
||||||
path('init-index/', views.init_index, name='init_index'),
|
# path('init-index/', views.init_index, name='init_index'),
|
||||||
|
|
||||||
# 数据操作
|
# 数据操作
|
||||||
path('data/', views.add_data, name='add_data'),
|
path('data/', views.add_data, name='add_data'),
|
||||||
|
|||||||
@@ -11,21 +11,8 @@ from django.http import JsonResponse
|
|||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.views.decorators.http import require_http_methods
|
from django.views.decorators.http import require_http_methods
|
||||||
from django.views.decorators.csrf import ensure_csrf_cookie
|
from django.views.decorators.csrf import ensure_csrf_cookie
|
||||||
from django.views.decorators.csrf import csrf_exempt
|
from django.views.decorators.csrf import csrf_exempt, ensure_csrf_cookie
|
||||||
from .es_connect import (
|
from .es_connect import *
|
||||||
create_index_with_mapping,
|
|
||||||
insert_data,
|
|
||||||
search_data,
|
|
||||||
search_by_any_field,
|
|
||||||
search_all,
|
|
||||||
delete_by_id,
|
|
||||||
update_by_id,
|
|
||||||
get_by_id,
|
|
||||||
write_user_data,
|
|
||||||
get_all_users,
|
|
||||||
delete_user_by_username,
|
|
||||||
update_user_permission
|
|
||||||
)
|
|
||||||
from openai import OpenAI
|
from openai import OpenAI
|
||||||
|
|
||||||
|
|
||||||
@@ -33,6 +20,7 @@ from openai import OpenAI
|
|||||||
@csrf_exempt
|
@csrf_exempt
|
||||||
def init_index(request):
|
def init_index(request):
|
||||||
"""初始化ES索引"""
|
"""初始化ES索引"""
|
||||||
|
print("⚠️ init_index 被调用了!")
|
||||||
try:
|
try:
|
||||||
create_index_with_mapping()
|
create_index_with_mapping()
|
||||||
return JsonResponse({"status": "success", "message": "索引初始化成功"})
|
return JsonResponse({"status": "success", "message": "索引初始化成功"})
|
||||||
@@ -81,8 +69,7 @@ def fuzzy_search(request):
|
|||||||
return JsonResponse({"status": "success", "data": results})
|
return JsonResponse({"status": "success", "data": results})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return JsonResponse({"status": "error", "message": str(e)}, status=500)
|
return JsonResponse({"status": "error", "message": str(e)}, status=500)
|
||||||
|
|
||||||
|
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
def get_all_data(request):
|
def get_all_data(request):
|
||||||
"""获取所有数据"""
|
"""获取所有数据"""
|
||||||
@@ -301,6 +288,7 @@ def ocr_and_extract_info(image_path: str):
|
|||||||
|
|
||||||
|
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
|
@ensure_csrf_cookie
|
||||||
def upload_page(request):
|
def upload_page(request):
|
||||||
session_user_id = request.session.get("user_id")
|
session_user_id = request.session.get("user_id")
|
||||||
if session_user_id is None:
|
if session_user_id is None:
|
||||||
@@ -315,7 +303,12 @@ def upload_page(request):
|
|||||||
@require_http_methods(["POST"])
|
@require_http_methods(["POST"])
|
||||||
def upload(request):
|
def upload(request):
|
||||||
if not request.session.get("user_id"):
|
if not request.session.get("user_id"):
|
||||||
return JsonResponse({"status": "error", "message": "未登录"}, status=401)
|
fallback_uid = request.POST.get("user_id") or request.GET.get("user_id")
|
||||||
|
if fallback_uid:
|
||||||
|
request.session["user_id"] = fallback_uid
|
||||||
|
request.session.setdefault("permission", 1)
|
||||||
|
else:
|
||||||
|
return JsonResponse({"status": "error", "message": "未登录"}, status=401)
|
||||||
|
|
||||||
file = request.FILES.get("file")
|
file = request.FILES.get("file")
|
||||||
if not file:
|
if not file:
|
||||||
@@ -352,7 +345,17 @@ def upload(request):
|
|||||||
@require_http_methods(["POST"])
|
@require_http_methods(["POST"])
|
||||||
def confirm(request):
|
def confirm(request):
|
||||||
if not request.session.get("user_id"):
|
if not request.session.get("user_id"):
|
||||||
return JsonResponse({"status": "error", "message": "未登录"}, status=401)
|
# 允许从payload中带入user_id作为后备(便于前端已知用户时继续操作)
|
||||||
|
try:
|
||||||
|
payload_for_uid = json.loads(request.body.decode("utf-8"))
|
||||||
|
except Exception:
|
||||||
|
payload_for_uid = {}
|
||||||
|
fb_uid = (payload_for_uid or {}).get("user_id")
|
||||||
|
if fb_uid:
|
||||||
|
request.session["user_id"] = fb_uid
|
||||||
|
request.session.setdefault("permission", 1)
|
||||||
|
else:
|
||||||
|
return JsonResponse({"status": "error", "message": "未登录"}, status=401)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
payload = json.loads(request.body.decode("utf-8"))
|
payload = json.loads(request.body.decode("utf-8"))
|
||||||
|
|||||||
Reference in New Issue
Block a user