276 lines
8.2 KiB
Python
276 lines
8.2 KiB
Python
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
|
||
from rest_framework.decorators import api_view, permission_classes, authentication_classes
|
||
from rest_framework.permissions import IsAuthenticated, AllowAny
|
||
from .authentication import CustomTokenAuthentication
|
||
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'])
|
||
@authentication_classes([CustomTokenAuthentication])
|
||
@permission_classes([IsAuthenticated])
|
||
def update_user_info(request):
|
||
"""更新用户信息,需要认证"""
|
||
try:
|
||
data = json.loads(request.body)
|
||
|
||
# 获取参数
|
||
company = data.get('company')
|
||
name = data.get('name')
|
||
|
||
# 获取当前认证用户(通过token验证)
|
||
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})
|