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 例如: 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') # 获取当前认证用户 user = request.user # 如果请求中包含 user_id 且与当前用户不匹配,返回错误 if 'user_id' in data and int(data['user_id']) != user.id: return JsonResponse({ 'code': 403, 'message': '您只能修改自己的信息', 'data': None }, json_dumps_params={'ensure_ascii': False}) # 如果是首次登录,需要填写公司和姓名 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})