2025-05-20 12:24:53 +08:00
|
|
|
|
from django.http import JsonResponse
|
|
|
|
|
# from .models import TiktokUserVideos
|
|
|
|
|
import logging
|
|
|
|
|
import os
|
|
|
|
|
from django.views.decorators.http import require_http_methods
|
|
|
|
|
from django.views.decorators.csrf import csrf_exempt
|
|
|
|
|
from django.shortcuts import render
|
|
|
|
|
import json
|
|
|
|
|
import requests
|
|
|
|
|
import concurrent.futures
|
|
|
|
|
import shutil
|
|
|
|
|
import dotenv
|
|
|
|
|
import random
|
2025-05-20 15:58:53 +08:00
|
|
|
|
from rest_framework.decorators import api_view, permission_classes, authentication_classes
|
2025-05-20 12:24:53 +08:00
|
|
|
|
from rest_framework.permissions import IsAuthenticated, AllowAny
|
2025-05-20 15:58:53 +08:00
|
|
|
|
from .authentication import CustomTokenAuthentication
|
2025-05-20 12:24:53 +08:00
|
|
|
|
import hashlib
|
|
|
|
|
import time
|
|
|
|
|
from django.contrib.auth.hashers import check_password
|
|
|
|
|
from django.utils import timezone
|
|
|
|
|
|
|
|
|
|
dotenv.load_dotenv()
|
|
|
|
|
|
|
|
|
|
# 添加logger定义
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
directory_monitoring = {}
|
|
|
|
|
|
|
|
|
|
# 全局变量来控制检测线程
|
|
|
|
|
monitor_thread = None
|
|
|
|
|
is_monitoring = False
|
|
|
|
|
|
|
|
|
|
def generate_token(user_id):
|
|
|
|
|
"""生成简单的token"""
|
|
|
|
|
# 使用用户ID和当前时间戳生成token
|
|
|
|
|
token_string = f"{user_id}:{time.time()}"
|
|
|
|
|
return hashlib.sha1(token_string.encode()).hexdigest()
|
|
|
|
|
|
|
|
|
|
def create_user_token(user):
|
|
|
|
|
"""创建并保存用户token"""
|
|
|
|
|
from .models import UserToken
|
|
|
|
|
# 删除该用户的所有旧token
|
|
|
|
|
UserToken.objects.filter(user=user).delete()
|
|
|
|
|
# 生成新token
|
|
|
|
|
token = generate_token(user.id)
|
|
|
|
|
# 保存到数据库
|
|
|
|
|
user_token = UserToken.objects.create(
|
|
|
|
|
user=user,
|
|
|
|
|
token=token
|
|
|
|
|
)
|
|
|
|
|
return token
|
|
|
|
|
|
|
|
|
|
@csrf_exempt
|
|
|
|
|
@api_view(['POST'])
|
|
|
|
|
@permission_classes([AllowAny])
|
|
|
|
|
def user_login(request):
|
|
|
|
|
"""
|
|
|
|
|
用户登录接口
|
|
|
|
|
|
|
|
|
|
返回的 token 使用格式:
|
|
|
|
|
在请求头中添加:
|
|
|
|
|
Authorization: Token <your_token>
|
|
|
|
|
|
|
|
|
|
例如:
|
|
|
|
|
Authorization: Token fa6931ec4cf5bd46d8dc3a671fe9862c467426b3
|
|
|
|
|
"""
|
|
|
|
|
try:
|
|
|
|
|
from .models import User
|
|
|
|
|
import json
|
|
|
|
|
from django.contrib.auth.hashers import check_password
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
|
|
|
|
data = json.loads(request.body)
|
|
|
|
|
|
|
|
|
|
# 获取登录参数
|
|
|
|
|
email = data.get('email')
|
|
|
|
|
password = data.get('password')
|
|
|
|
|
|
|
|
|
|
if not email or not password:
|
|
|
|
|
return JsonResponse({
|
|
|
|
|
'code': 400,
|
|
|
|
|
'message': '缺少必要参数: email 或 password',
|
|
|
|
|
'data': None
|
|
|
|
|
}, json_dumps_params={'ensure_ascii': False})
|
|
|
|
|
|
|
|
|
|
# 查询用户
|
|
|
|
|
try:
|
|
|
|
|
user = User.objects.get(email=email)
|
|
|
|
|
|
|
|
|
|
# 验证密码
|
|
|
|
|
if not user.check_password(password):
|
|
|
|
|
return JsonResponse({
|
|
|
|
|
'code': 401,
|
|
|
|
|
'message': '用户名或密码错误',
|
|
|
|
|
'data': None
|
|
|
|
|
}, json_dumps_params={'ensure_ascii': False})
|
|
|
|
|
|
|
|
|
|
# 生成并保存token
|
|
|
|
|
token = create_user_token(user)
|
|
|
|
|
|
|
|
|
|
# 检查是否首次登录
|
|
|
|
|
is_first_login = user.is_first_login
|
|
|
|
|
|
|
|
|
|
# 更新最后登录时间
|
|
|
|
|
user.last_login = timezone.now()
|
|
|
|
|
user.save()
|
|
|
|
|
|
|
|
|
|
# 构造返回数据
|
|
|
|
|
user_data = {
|
|
|
|
|
'user_id': user.id,
|
|
|
|
|
'email': user.email,
|
|
|
|
|
'is_first_login': is_first_login,
|
|
|
|
|
'name': user.name,
|
|
|
|
|
'company': user.company,
|
|
|
|
|
'token': token
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return JsonResponse({
|
|
|
|
|
'code': 200,
|
|
|
|
|
'message': '登录成功',
|
|
|
|
|
'data': user_data
|
|
|
|
|
}, json_dumps_params={'ensure_ascii': False})
|
|
|
|
|
|
|
|
|
|
except User.DoesNotExist:
|
|
|
|
|
return JsonResponse({
|
|
|
|
|
'code': 404,
|
|
|
|
|
'message': '用户不存在',
|
|
|
|
|
'data': None
|
|
|
|
|
}, json_dumps_params={'ensure_ascii': False})
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
logger.error(f"用户登录失败: {e}")
|
|
|
|
|
import traceback
|
|
|
|
|
logger.error(f"详细错误: {traceback.format_exc()}")
|
|
|
|
|
return JsonResponse({
|
|
|
|
|
'code': 500,
|
|
|
|
|
'message': f'登录失败: {str(e)}',
|
|
|
|
|
'data': None
|
|
|
|
|
}, json_dumps_params={'ensure_ascii': False})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@csrf_exempt
|
|
|
|
|
@api_view(['POST'])
|
2025-05-20 15:58:53 +08:00
|
|
|
|
@authentication_classes([CustomTokenAuthentication])
|
2025-05-20 12:24:53 +08:00
|
|
|
|
@permission_classes([IsAuthenticated])
|
|
|
|
|
def update_user_info(request):
|
|
|
|
|
"""更新用户信息,需要认证"""
|
|
|
|
|
try:
|
|
|
|
|
data = json.loads(request.body)
|
|
|
|
|
|
|
|
|
|
# 获取参数
|
|
|
|
|
company = data.get('company')
|
|
|
|
|
name = data.get('name')
|
|
|
|
|
|
2025-05-23 16:51:34 +08:00
|
|
|
|
# 获取当前认证用户(通过token验证)
|
2025-05-20 12:24:53 +08:00
|
|
|
|
user = request.user
|
|
|
|
|
|
|
|
|
|
# 如果是首次登录,需要填写公司和姓名
|
|
|
|
|
if not company or not name:
|
|
|
|
|
return JsonResponse({
|
|
|
|
|
'code': 400,
|
|
|
|
|
'message': '首次登录需要填写公司和姓名',
|
|
|
|
|
'data': None
|
|
|
|
|
}, json_dumps_params={'ensure_ascii': False})
|
|
|
|
|
|
|
|
|
|
# 更新信息
|
|
|
|
|
user.company = company
|
|
|
|
|
user.name = name
|
|
|
|
|
user.is_first_login = False # 更新后不再是首次登录
|
|
|
|
|
user.save()
|
|
|
|
|
|
|
|
|
|
return JsonResponse({
|
|
|
|
|
'code': 200,
|
|
|
|
|
'message': '信息更新成功',
|
|
|
|
|
'data': {
|
|
|
|
|
'user_id': user.id,
|
|
|
|
|
'email': user.email,
|
|
|
|
|
'is_first_login': False,
|
|
|
|
|
'name': user.name,
|
|
|
|
|
'company': user.company
|
|
|
|
|
}
|
|
|
|
|
}, json_dumps_params={'ensure_ascii': False})
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
logger.error(f"更新用户信息失败: {e}")
|
|
|
|
|
import traceback
|
|
|
|
|
logger.error(f"详细错误: {traceback.format_exc()}")
|
|
|
|
|
return JsonResponse({
|
|
|
|
|
'code': 500,
|
|
|
|
|
'message': f'更新用户信息失败: {str(e)}',
|
|
|
|
|
'data': None
|
|
|
|
|
}, json_dumps_params={'ensure_ascii': False})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@csrf_exempt
|
|
|
|
|
@api_view(['POST'])
|
|
|
|
|
@permission_classes([AllowAny])
|
|
|
|
|
def user_register(request):
|
|
|
|
|
"""用户注册接口"""
|
|
|
|
|
try:
|
|
|
|
|
from .models import User
|
|
|
|
|
import json
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
|
|
|
|
data = json.loads(request.body)
|
|
|
|
|
|
|
|
|
|
# 获取注册参数
|
|
|
|
|
email = data.get('email')
|
|
|
|
|
password = data.get('password')
|
|
|
|
|
company = data.get('company') # 可选参数
|
|
|
|
|
name = data.get('name') # 可选参数
|
|
|
|
|
|
|
|
|
|
# 检查必要参数
|
|
|
|
|
if not email or not password:
|
|
|
|
|
return JsonResponse({
|
|
|
|
|
'code': 400,
|
|
|
|
|
'message': '缺少必要参数: email 或 password',
|
|
|
|
|
'data': None
|
|
|
|
|
}, json_dumps_params={'ensure_ascii': False})
|
|
|
|
|
|
|
|
|
|
# 检查邮箱是否已注册
|
|
|
|
|
if User.objects.filter(email=email).exists():
|
|
|
|
|
return JsonResponse({
|
|
|
|
|
'code': 409,
|
|
|
|
|
'message': '该邮箱已注册',
|
|
|
|
|
'data': None
|
|
|
|
|
}, json_dumps_params={'ensure_ascii': False})
|
|
|
|
|
|
|
|
|
|
# 创建用户
|
|
|
|
|
try:
|
|
|
|
|
# 根据是否提供公司和姓名决定是否为首次登录
|
|
|
|
|
is_first_login = not (company and name)
|
|
|
|
|
|
|
|
|
|
# 创建用户
|
|
|
|
|
user = User.objects.create_user(
|
|
|
|
|
email=email,
|
|
|
|
|
password=password,
|
|
|
|
|
company=company,
|
|
|
|
|
name=name,
|
|
|
|
|
is_first_login=is_first_login,
|
|
|
|
|
last_login=timezone.now()
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# 构造返回数据
|
|
|
|
|
user_data = {
|
|
|
|
|
'user_id': user.id,
|
|
|
|
|
'email': user.email,
|
|
|
|
|
'is_first_login': is_first_login,
|
|
|
|
|
'company': user.company,
|
|
|
|
|
'name': user.name
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return JsonResponse({
|
|
|
|
|
'code': 200,
|
|
|
|
|
'message': '注册成功',
|
|
|
|
|
'data': user_data
|
|
|
|
|
}, json_dumps_params={'ensure_ascii': False})
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
logger.error(f"创建用户失败: {e}")
|
|
|
|
|
return JsonResponse({
|
|
|
|
|
'code': 500,
|
|
|
|
|
'message': f'注册失败: {str(e)}',
|
|
|
|
|
'data': None
|
|
|
|
|
}, json_dumps_params={'ensure_ascii': False})
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
logger.error(f"用户注册失败: {e}")
|
|
|
|
|
import traceback
|
|
|
|
|
logger.error(f"详细错误: {traceback.format_exc()}")
|
|
|
|
|
return JsonResponse({
|
|
|
|
|
'code': 500,
|
|
|
|
|
'message': f'注册失败: {str(e)}',
|
|
|
|
|
'data': None
|
|
|
|
|
}, json_dumps_params={'ensure_ascii': False})
|