daren/apps/user/views.py

276 lines
8.2 KiB
Python
Raw Permalink Normal View History

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})