import hashlib import json import random import time import uuid from datetime import datetime from django.db.models import Q from django.http import JsonResponse, HttpResponseRedirect, HttpResponse from django.contrib.auth.hashers import check_password from MyApi.models import Administrator, Copywriting, User, FriendRequest, ApiCallLog, MembershipType, RedemptionCard, \ TransactionLog from django.contrib.auth import login as django_login, logout as django_logout, login from django.shortcuts import render, redirect from .decorators import admin_login_required from django.contrib.auth import logout from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage from django.db import transaction import Levenshtein from urllib.parse import unquote, quote def admin_login(request): # 检查是否已登录 if 'admin_id' in request.session: return redirect('admin_dashboard') # 使用视图的名称执行重定向 if request.method == 'POST': data = json.loads(request.body) username = data.get('username') password = data.get('password') try: user = Administrator.objects.get(username=username) except Administrator.DoesNotExist: return JsonResponse({'status': 'error', 'message': '用户不存在'}) # 检查密码是否正确 if user and check_password(password, user.password): if user.is_active: # 登录成功,设置会话 request.session['role'] = user.role request.session['admin_id'] = user.id return JsonResponse({'status': 'success', 'message': '登录成功'}) else: return JsonResponse({'status': 'error', 'message': '用户已被禁用'}) else: return JsonResponse({'status': 'error', 'message': '密码错误'}) else: # 非POST请求,返回登录页面 return render(request, 'login.html') @admin_login_required def admin_dashboard(request): # 从session获取管理员ID admin_id = request.session.get('admin_id') # 使用管理员ID查询管理员信息 try: admin = Administrator.objects.get(id=admin_id) except Administrator.DoesNotExist: # 如果没有找到管理员,可以重定向到登录页面或显示错误信息 return HttpResponse('管理员不存在', status=404) # 将管理员信息添加到上下文中 # context = { # 'admin_username': admin.username, # 'admin_role': admin.role, # # 添加更多管理员信息到上下文中,根据需要 # } return render(request, 'index.html', {'username':admin.username}) def admin_logout(request): # 登出用户 logout(request) # 重定向到登录页面,或者你希望用户登出后看到的页面 return redirect('admin_login') @admin_login_required # 小程序用户管理页面 def miniapp_users(request): if request.method == "POST": data = json.loads(request.body) action = data.get('action') if action == 'fetch': # 分页获取小程序用户数据 users_list = User.objects.all().order_by('-created_at') page = data.get('page', 1) paginator = Paginator(users_list, 10) # 每页显示10条记录 try: users = paginator.page(page) except PageNotAnInteger: users = paginator.page(1) except EmptyPage: users = paginator.page(paginator.num_pages) users_data = list(users.object_list.values( 'openid', 'wxid','wechat_number', 'nickname', 'gender', 'region', 'email', 'phone', 'scene', 'is_member', 'member_start_time', 'member_end_time', 'is_active', 'usage_count', 'created_at' )) return JsonResponse({ 'data': users_data, 'code': 0, 'count': paginator.count, 'msg': '' }) elif action == 'add': print('添加') elif action == 'edit': # 编辑用户信息 user_id = data.get('id') try: user = User.objects.get(id=user_id) user.wxid = data.get('wxid', user.wxid) user.nickname = data.get('nickname', user.nickname) user.gender = data.get('gender', user.gender) user.region = data.get('region', user.region) user.email = data.get('email', user.email) user.phone = data.get('phone', user.phone) user.scene = data.get('scene', user.scene) user.is_member = data.get('is_member', user.is_member) user.member_start_time = data.get('member_start_time', user.member_start_time) user.member_end_time = data.get('member_end_time', user.member_end_time) user.is_active = data.get('is_active', user.is_active) user.usage_count = data.get('usage_count', user.usage_count) user.save() return JsonResponse({'status': 'success', 'msg': '用户信息更新成功'}) except User.DoesNotExist: return JsonResponse({'status': 'error', 'msg': '用户不存在'}) elif action == 'delete': # 删除用户 user_id = data.get('id') User.objects.filter(id=user_id).delete() return JsonResponse({'status': 'success', 'msg': '用户删除成功'}) return render(request, 'miniapp_users.html') @admin_login_required # 微信用户管理页面 def wechat_users(request): if request.method == 'POST': data = json.loads(request.body) action = data.get('action') if action == 'fetch': # 处理获取好友请求记录的逻辑 page_number = data.get('page', 1) limit = data.get('limit', 10) search_keyword = data.get('search', '') friend_requests_query = FriendRequest.objects.filter( Q(fromnickname__icontains=search_keyword) | Q(alias__icontains=search_keyword) | Q(fromusername__icontains=search_keyword) ).order_by('-time') paginator = Paginator(friend_requests_query, limit) try: friend_requests_page = paginator.page(page_number) except PageNotAnInteger: friend_requests_page = paginator.page(1) except EmptyPage: friend_requests_page = paginator.page(paginator.num_pages) friend_requests_list = list(friend_requests_page.object_list.values( 'id', 'fromusername', 'alias', 'fromnickname', 'country', 'province', 'city', 'sex', 'scene', 'time', 'towxid' )) return JsonResponse({ 'code': 0, 'msg': '', 'count': paginator.count, 'data': friend_requests_list }) elif action == 'add': # 处理添加好友请求记录的逻辑 pass # 实现添加逻辑 elif action == 'edit': # 处理编辑好友请求记录的逻辑 pass # 实现编辑逻辑 elif action == 'delete': # 处理删除好友请求记录的逻辑 fr_id = data.get('id') FriendRequest.objects.filter(id=fr_id).delete() return JsonResponse({'status': 'success', 'msg': '记录删除成功'}) return render(request, 'wechat_users.html') @admin_login_required # 其他来源用户管理页面 def other_sources(request): # 实现具体逻辑 return render(request, 'other_sources.html') @admin_login_required # 网站管理员管理页面 def site_admins(request): # 实现具体逻辑 return render(request, 'site_admins.html') @admin_login_required # 视频提取记录管理页面 def video_extraction_records(request): # 实现具体逻辑 return render(request, 'video_extraction_records.html') @admin_login_required # 文案提取记录管理页面 def copy_extraction_records(request): # 实现具体逻辑 return render(request, 'copy_extraction_records.html') @admin_login_required # AI接口使用情况页面 def ai_api_usage(request): # 实现具体逻辑 return render(request, 'ai_api_usage.html') @admin_login_required # 网站设置页面 def website_settings(request): # 实现具体逻辑 return render(request, 'website_settings.html') @admin_login_required # 小程序设置页面 def miniapp_settings(request): # 实现具体逻辑 return render(request, 'miniapp_settings.html') @admin_login_required # 后台主页 def main(request): # 实现具体逻辑 return render(request, 'main.html') # 文案库页面 @admin_login_required def copywriting_library(request): if request.method == "POST": print(request.body) data = json.loads(request.body) action = data.get('action', '') print(data) if action == 'fetch': # 分页参数 page = data.get('page', 1) limit = data.get('limit', 10) search = data.get('search', '') search = quote(search) # 过滤和排序Q(text_content__icontains=search_query) queryset = Copywriting.objects.filter(Q(text_content__icontains=search)).order_by('-added_time') paginator = Paginator(queryset, limit) try: copywritings = paginator.page(page) except PageNotAnInteger: copywritings = paginator.page(1) except EmptyPage: copywritings = paginator.page(paginator.num_pages) copywriting_list = list( copywritings.object_list.values('id', 'text_content', 'source', 'popularity','tag','is_approved', 'added_time')) return JsonResponse({ "code": 0, "msg": "", "count": paginator.count, "data": copywriting_list }) elif action == 'add': # 添加文案 text_content = data.get('text_content', '') source = data.get('source', '') tag = data.get('tag', '') popularity = data.get('popularity', 0) copywriting = Copywriting( text_content=text_content, source=source, tag=tag, popularity=popularity ) copywriting.save() return JsonResponse({"status": "success", "msg": "文案添加成功"}) elif action == 'batch-delete': # 批量删除文案 ids = data.get('ids', []) Copywriting.objects.filter(id__in=ids).delete() return JsonResponse({"status": "success", "msg": "文案批量删除成功"}) elif action == 'delete': # 批量删除文案 id = data.get('id') Copywriting.objects.filter(id=id).delete() return JsonResponse({"status": "success", "msg": "文案批量删除成功"}) elif action == 'edit': # 获取请求中的数据 copywriting_id = data.get('id') text_content = data.get('text_content') source = data.get('source') tag = data.get('tag') try: # 根据ID查找要编辑的文案实例 copywriting = Copywriting.objects.get(id=copywriting_id) # 更新文案实例的字段 copywriting.text_content = text_content copywriting.source = source copywriting.tag = tag copywriting.save() # 保存更改到数据库 return JsonResponse({'status': 'success', 'message': '文案更新成功'}) except Copywriting.DoesNotExist: return JsonResponse({'status': 'error', 'message': '文案未找到'}) elif action == 'approve': try: copywriting_id = data.get('id') copywriting = Copywriting.objects.get(id=copywriting_id) copywriting.is_approved = 1 copywriting.save() # 保存更改到数据库 return JsonResponse({'status': 'success', 'message': '文案审核成功'}) except Copywriting.DoesNotExist: return JsonResponse({'status': 'error', 'message': '文案未找到'}) # 对于非POST请求或者没有指定操作的POST请求,返回页面 return render(request, 'copywriting_library.html') @admin_login_required # 文章记录页面 def article_records(request): # 这里实现具体的视图逻辑 return render(request, 'article_records.html') @admin_login_required # 素材库页面 def material_library(request): # 这里实现具体的视图逻辑 return render(request, 'material_library.html') #删除重复文案 def get_similar_texts(threshold=0.8): # 假设threshold为相似度阈值 all_texts = Copywriting.objects.filter(is_approved=0) # 仅考虑已审核的文案 print(len(all_texts)) to_delete = [] # 将查询到的文案内容解码 decoded_texts = [(text, unquote(text.text_content)) for text in all_texts] for i, (text1, decoded_content1) in enumerate(decoded_texts): for text2, decoded_content2 in decoded_texts[i + 1:]: # 计算解码后的文本之间的相似度 if Levenshtein.ratio(decoded_content1, decoded_content2) > threshold: # 如果相似度大于阈值,选择热度较低的文案删除 if text1.popularity <= text2.popularity: to_delete.append(text1) else: to_delete.append(text2) return set(to_delete) # 使用集合避免重复 @transaction.atomic def delete_similar_texts(): to_delete = get_similar_texts() deleted_count = len(to_delete) # 计算删除对象的数量 for text in to_delete: text.delete() # 删除操作 return deleted_count # 返回删除的行数 def delete_similar_texts_view(request): deleted_count = delete_similar_texts() print(f"Deleted {deleted_count} similar texts.") # 返回结果 return JsonResponse({'message': f'Deleted {deleted_count} similar texts.'}) def generate_redemption_code(prefix): # 生成唯一的 UUID unique_id = uuid.uuid4() # 获取当前时间戳 current_timestamp = int(time.time()) # 使用 MD5 算法生成散列值 hash_object = hashlib.md5(unique_id.bytes + str(current_timestamp).encode()) hash_hex = hash_object.hexdigest() # 将前缀和散列值的前8位拼接起来作为卡密 redemption_code = f"{prefix}{hash_hex[:8]}" return redemption_code #卡密管理 @admin_login_required def redemption_card_list(request): if request.method == "POST": data = json.loads(request.body) action = data.get('action', '') if action == 'fetch': # 获取分页参数 page = int(data.get('page', 1)) limit = int(data.get('limit', 10)) search = data.get('search', '') search = quote(search) # 过滤和排序 queryset = RedemptionCard.objects.filter().order_by('-card_creation_time') paginator = Paginator(queryset, limit) try: redemptionCard = paginator.page(page) except PageNotAnInteger: redemptionCard = paginator.page(1) except EmptyPage: redemptionCard = paginator.page(paginator.num_pages) copywriting_list = list( redemptionCard.object_list.values('id', 'code', 'card_type', 'created_date', 'expiry_date', 'is_used', 'used_by_openid','used_by_nickname','card_creation_time','validity_period')) return JsonResponse({ "code": 0, "message": "ok", "count": paginator.count, "data": copywriting_list }) elif action == 'edit': try: redemptionCard_id = data.get('id') redemptionCard = RedemptionCard.objects.get(id=redemptionCard_id) # 更新文案 # 这里添加更新文案的逻辑 return JsonResponse({'status': 'success', 'message': '更新成功'}) except RedemptionCard.DoesNotExist: return JsonResponse({'status': 'error', 'message': '卡密未找到'}) elif action == 'add': try: # 解析请求数据 code_prefix = data.get('code_prefix', '') card_type = data.get('card_type', '') quantity = int(data.get('quantity', 0)) expiry_date = data.get('expiry_date', '') validity_period = int(data.get('validity_period',0)) # 添加卡密逻辑 for _ in range(quantity): card = RedemptionCard.objects.create( code=generate_redemption_code(code_prefix), card_type=card_type, expiry_date=expiry_date, validity_period=validity_period ) return JsonResponse({'status': 'success', 'message': '卡密添加成功'}) except Exception as e: return JsonResponse({'status': 'error', 'message': str(e)}) elif action == 'delete': try: redemptionCard_id = data.get('id') redemptionCard = RedemptionCard.objects.get(id=redemptionCard_id) redemptionCard.delete() # 删除单个卡密记录 return JsonResponse({'status': 'success', 'message': '卡密删除成功'}) except RedemptionCard.DoesNotExist: return JsonResponse({'status': 'error', 'message': '卡密未找到'}) elif action == 'batch_delete': try: ids = data.get('ids', []) RedemptionCard.objects.filter(id__in=ids).delete() # 批量删除卡密记录 return JsonResponse({'status': 'success', 'message': '批量删除卡密成功'}) except Exception as e: return JsonResponse({'status': 'error', 'message': str(e)}) else: return JsonResponse({ "code": 400, "msg": "Invalid action parameter.", }) return render(request, 'redemption_card.html') # 会员配置 @admin_login_required def membership_type_list(request): if request.method == 'POST': data = json.loads(request.body) action = data['action'] if action == 'fetch': # 读取会员卡类型列表 is_quota = data.get('is_quota', None) if is_quota is not None: membership_types = MembershipType.objects.filter(is_quota=is_quota) else: membership_types = MembershipType.objects.all() # 将会员卡类型列表序列化为JSON格式 membership_types_data = [ { 'id': m.id, 'type': m.type, 'title': m.title, 'description': m.description, 'price': m.price, 'duration_days': m.duration_days, 'coins': m.coins, 'is_quota': m.is_quota } for m in membership_types ] return JsonResponse({"code": 0, 'data': membership_types_data}) elif action == 'add': # 添加会员卡类型 # 获取前端传递过来的数据 membership_type = MembershipType( type=data.get('type'), title=data.get('title'), description=data.get('description'), price=data.get('price'), duration_days=data.get('duration_days'), coins=data.get('coins'), is_quota=data.get('is_quota') ) membership_type.save() return JsonResponse({'status': 'success', 'message': '会员卡类型添加成功'}) elif action == 'edit': # 编辑会员卡类型 id = int(data['id']) # 根据id获取要修改的MembershipType对象 membership_type = MembershipType.objects.get(id=id) # 获取前端传递过来的数据 membership_type.title = data.get('title') membership_type.description = data.get('description') membership_type.price = data.get('price') membership_type.duration_days = data.get('duration_days') membership_type.coins = data.get('coins') membership_type.is_quota = data.get('is_quota') membership_type.save() return JsonResponse({'status': 'success', 'message': '会员卡类型修改成功'}) elif action == 'delete': # 删除会员卡类型 id = int(data['id']) # 根据id删除对应的MembershipType对象 MembershipType.objects.filter(id=id).delete() return JsonResponse({'status': 'success', 'message': '会员卡类型删除成功'}) return render(request, 'membership-types.html') # 订单记录 @admin_login_required def transaction_log_list(request): if request.method == "POST": data = json.loads(request.body) action = data.get('action', '') if action == 'fetch': page = data.get('page', 1) limit = data.get('limit', 10) queryset = TransactionLog.objects.all().order_by('-created_at') paginator = Paginator(queryset, limit) try: transaction_logs = paginator.page(page) except PageNotAnInteger: transaction_logs = paginator.page(1) except EmptyPage: transaction_logs = paginator.page(paginator.num_pages) transaction_log_list = list( transaction_logs.object_list.values( 'id', 'transaction_no', 'transaction_status', 'user_openid', 'transaction_type', 'transaction_amount', 'remark', 'created_at', 'updated_at' ) ) return JsonResponse({ "code": 0, "msg": "", "count": paginator.count, "data": transaction_log_list }) elif action == 'delete': try: id = data.get('id') transaction_log = TransactionLog.objects.get(id=id) transaction_log.delete() return JsonResponse({'status': 'success', 'message': '订单记录删除成功'}) except TransactionLog.DoesNotExist: return JsonResponse({'status': 'error', 'message': '订单记录未找到'}) elif action == 'batch_delete': try: ids = data.get('ids', []) TransactionLog.objects.filter(id__in=ids).delete() return JsonResponse({'status': 'success', 'message': '批量删除订单记录成功'}) except Exception as e: return JsonResponse({'status': 'error', 'message': str(e)}) return render(request, 'transaction-logs.html')