2026-02-14 17:58:29 +08:00
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
"""
|
|
|
|
|
|
联系记录 API(需要登录):
|
|
|
|
|
|
- GET /api/contacts -> 查询联系记录(支持分页、搜索)
|
2026-02-25 00:10:04 +08:00
|
|
|
|
- GET /api/contacts/query -> 按电话号码或微信号查询(数据展示)
|
2026-02-14 17:58:29 +08:00
|
|
|
|
- POST /api/contacts -> 创建联系记录
|
|
|
|
|
|
- GET /api/contacts/{id} -> 查询单条记录
|
|
|
|
|
|
- PUT /api/contacts/{id} -> 更新记录
|
|
|
|
|
|
- DELETE /api/contacts/{id} -> 删除记录
|
|
|
|
|
|
"""
|
|
|
|
|
|
from django.db.models import Q
|
|
|
|
|
|
|
|
|
|
|
|
from rest_framework import status
|
|
|
|
|
|
from rest_framework.decorators import api_view
|
|
|
|
|
|
from rest_framework.response import Response
|
|
|
|
|
|
|
|
|
|
|
|
from server.models import ContactRecord
|
|
|
|
|
|
from server.serializers import ContactRecordSerializer
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@api_view(["GET", "POST"])
|
|
|
|
|
|
def contact_list(request):
|
|
|
|
|
|
if request.method == "GET":
|
|
|
|
|
|
search = request.query_params.get("search", "")
|
|
|
|
|
|
page = int(request.query_params.get("page", 1))
|
|
|
|
|
|
page_size = int(request.query_params.get("page_size", 10))
|
|
|
|
|
|
reply_status = request.query_params.get("reply_status")
|
|
|
|
|
|
wechat = request.query_params.get("wechat_exchanged")
|
|
|
|
|
|
|
|
|
|
|
|
qs = ContactRecord.objects.all()
|
|
|
|
|
|
if search:
|
|
|
|
|
|
qs = qs.filter(
|
|
|
|
|
|
Q(name__icontains=search) |
|
|
|
|
|
|
Q(position__icontains=search) |
|
|
|
|
|
|
Q(contact__icontains=search)
|
|
|
|
|
|
)
|
|
|
|
|
|
if reply_status:
|
|
|
|
|
|
qs = qs.filter(reply_status=reply_status)
|
|
|
|
|
|
if wechat is not None:
|
|
|
|
|
|
qs = qs.filter(wechat_exchanged=wechat.lower() in ("true", "1"))
|
|
|
|
|
|
|
|
|
|
|
|
total = qs.count()
|
|
|
|
|
|
start = (page - 1) * page_size
|
|
|
|
|
|
end = start + page_size
|
|
|
|
|
|
records = qs[start:end]
|
|
|
|
|
|
|
|
|
|
|
|
return Response({
|
|
|
|
|
|
"total": total,
|
|
|
|
|
|
"page": page,
|
|
|
|
|
|
"page_size": page_size,
|
|
|
|
|
|
"results": ContactRecordSerializer(records, many=True).data,
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
ser = ContactRecordSerializer(data=request.data)
|
|
|
|
|
|
ser.is_valid(raise_exception=True)
|
|
|
|
|
|
ser.save()
|
|
|
|
|
|
return Response(ser.data, status=status.HTTP_201_CREATED)
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-02-25 00:10:04 +08:00
|
|
|
|
@api_view(["GET"])
|
|
|
|
|
|
def contact_query(request):
|
|
|
|
|
|
"""
|
|
|
|
|
|
按电话号码或微信号查询联系记录(数据展示接口)。
|
|
|
|
|
|
传入 contact 参数(电话号码或微信号),返回匹配到的所有记录。
|
|
|
|
|
|
"""
|
|
|
|
|
|
contact = (request.query_params.get("contact") or "").strip()
|
|
|
|
|
|
if not contact:
|
|
|
|
|
|
return Response(
|
|
|
|
|
|
{"detail": "请提供 contact 参数(电话号码或微信号)"},
|
|
|
|
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
|
|
|
|
)
|
|
|
|
|
|
page = int(request.query_params.get("page", 1))
|
|
|
|
|
|
page_size = int(request.query_params.get("page_size", 20))
|
|
|
|
|
|
|
|
|
|
|
|
qs = ContactRecord.objects.filter(contact__icontains=contact).order_by("-created_at")
|
|
|
|
|
|
total = qs.count()
|
|
|
|
|
|
start = (page - 1) * page_size
|
|
|
|
|
|
end = start + page_size
|
|
|
|
|
|
records = qs[start:end]
|
|
|
|
|
|
|
|
|
|
|
|
return Response({
|
|
|
|
|
|
"total": total,
|
|
|
|
|
|
"page": page,
|
|
|
|
|
|
"page_size": page_size,
|
|
|
|
|
|
"contact_keyword": contact,
|
|
|
|
|
|
"results": ContactRecordSerializer(records, many=True).data,
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-02-14 17:58:29 +08:00
|
|
|
|
@api_view(["GET", "PUT", "DELETE"])
|
|
|
|
|
|
def contact_detail(request, pk):
|
|
|
|
|
|
try:
|
|
|
|
|
|
obj = ContactRecord.objects.get(pk=pk)
|
|
|
|
|
|
except ContactRecord.DoesNotExist:
|
|
|
|
|
|
return Response({"detail": "联系记录不存在"}, status=status.HTTP_404_NOT_FOUND)
|
|
|
|
|
|
|
|
|
|
|
|
if request.method == "GET":
|
|
|
|
|
|
return Response(ContactRecordSerializer(obj).data)
|
|
|
|
|
|
|
|
|
|
|
|
if request.method == "PUT":
|
|
|
|
|
|
ser = ContactRecordSerializer(obj, data=request.data, partial=True)
|
|
|
|
|
|
ser.is_valid(raise_exception=True)
|
|
|
|
|
|
ser.save()
|
|
|
|
|
|
return Response(ser.data)
|
|
|
|
|
|
|
|
|
|
|
|
obj.delete()
|
|
|
|
|
|
return Response({"message": "联系记录已删除"})
|