This commit is contained in:
doudou201703
2026-08-02 14:07:04 +08:00
commit 046fac6dc1
339 changed files with 19435 additions and 0 deletions
@@ -0,0 +1,63 @@
import pydash
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.viewsets import ViewSet
from sixGuoDjango import BaseResponse, ResData
from wechat_数据库.用户数据库.小程序登陆用户 import weiuser
from wechat_项目工具包.腾讯地图.腾讯地图工具 import wei地图工具
class 小程序用户的位置接口ViewSets(ViewSet):
@action(detail=False, methods=["post"], url_path="locating")
def 解析用户的定位(self, request: Request):
"""前端用户:发起定位请求的时候, """
self_mini_openid = request.data.get("self_mini_openid", None)
self_mini_unionid = request.data.get("self_mini_unionid", None)
result = request.data.get("result", None)
print("\n🍎 🍏 🍊 获取用户定位的请求进来了🍊 🍎 🍏 \n", self_mini_openid, self_mini_unionid)
six六果对象, sixBool = weiuser.objects.get_or_create(unionid=self_mini_unionid) # 拿到当前的用户请求的对象
# 判断 当前用户,是否已经拿有位置的信息数据了
if six六果对象.user_区县:
# 当这里为true的时候就可以直接返回了
return Response()
else:
纬度 = pydash.get(obj=result, path="latitude")
经度 = pydash.get(obj=result, path="longitude")
print("\n🍎 🍏 🍊 🍎 🍏 🍊 🍎 🍏 🍊 🍎 用户的定位的数据", result)
地图解析结果 = wei地图工具.经纬度转换为地址(location=f"{纬度},{经度}")
省 = pydash.get(obj=地图解析结果, path="result.address_component.province")
市 = pydash.get(obj=地图解析结果, path="result.address_component.city")
区 = pydash.get(obj=地图解析结果, path="result.address_component.district")
街道 = pydash.get(obj=地图解析结果, path="result.address_component.street_number")
街道号码 = pydash.get(obj=地图解析结果, path="result.address_component.street")
# 开始更新数据库
six六果对象.user_区县 = 区
six六果对象.user_省份 = 省
six六果对象.user_城市 = 市
six六果对象.user_街道信息 = 街道
httpResData = BaseResponse(resData=ResData(listData=[""], dictData={"demo": "xiaozizi"}), ).model_dump()
return Response(data=httpResData, status=status.HTTP_200_OK)
@action(detail=False, methods=["post", ], url_path="ip")
def 解析用户IP地址接口(self, request: Request):
""" """
self_mini_openid = request.data.get("self_mini_openid", None)
self_mini_unionid = request.data.get("self_mini_unionid", None)
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR', False)
ip = pydash.head(x_forwarded_for.split(','))
mini_unionid_user = weiuser.objects.get(unionid=self_mini_unionid, )
if mini_unionid_user.user_省份 is None or mini_unionid_user.user_区县 is None or mini_unionid_user.user_城市 is None:
weiData = wei地图工具.ip地址转为地址(x_forwarded_for=ip, )
province_省份 = pydash.get(obj=weiData, path="result.ad_info.province")
city_城市 = pydash.get(obj=weiData, path="result.ad_info.city")
district_区县 = pydash.get(obj=weiData, path="result.ad_info.district") or None
mini_unionid_user.user_省份 = province_省份
mini_unionid_user.user_城市 = city_城市
mini_unionid_user.user_区县 = district_区县
mini_unionid_user.user_IP地址 = ip
mini_unionid_user.save()
httpResData = BaseResponse(resData=ResData(listData=[""], dictData={}), ).model_dump()
return Response(data=httpResData, status=status.HTTP_200_OK)
@@ -0,0 +1,246 @@
import jmespath
import orjson
import pydash
from asgiref.sync import async_to_sync
from channels.layers import BaseChannelLayer, get_channel_layer
from django.forms import model_to_dict
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.viewsets import ViewSet
from sixGuoDjango import BaseResponse, RedisClientManager, ResData
from wechat_数据库.地图定位.用户定位数据库 import weiuser地图定位
from wechat_数据库.用户数据库.小程序用户地址 import weiuser微信用户地址
from wechat_数据库.用户数据库.小程序登陆用户 import weiuser
from wechat_项目工具包.腾讯地图.腾讯地图工具 import OriginPointOptional, wei地图工具
redis_socked = RedisClientManager().get_client(db_name="redis_5")
example通道层实例: BaseChannelLayer = get_channel_layer(alias="default")
class 用户配送地址ViewSets(ViewSet):
def update更新用户头像事件(self, self_mini_unionid):
channel_id = redis_socked.get(self_mini_unionid)
user_obj = weiuser.objects.get(unionid=self_mini_unionid)
user_data = model_to_dict(instance=user_obj, fields=None, exclude=None)
async_to_sync(awaitable=example通道层实例.send)(channel=channel_id,
message={"type": "update_更新用户头像",
"text": orjson.dumps(user_data,
option=orjson.OPT_SORT_KEYS).decode(
encoding="utf-8")
})
def update更新用户手机号码方法(self, address, self_mini_openid, self_user_unionid):
pass
用户手机号码 = pydash.get(obj=address, path="telNumber")
用户昵称 = pydash.get(obj=address, path="userName")
用户所在省 = pydash.get(obj=address, path="provinceName")
用户所在市 = pydash.get(obj=address, path="cityName")
用户所在区县 = pydash.get(obj=address, path="countyName")
用户所在街道 = pydash.get(obj=address, path="detailInfo")
weiuser.objects.filter(unionid=self_user_unionid).update(
uesr_手机号码=用户手机号码, user_昵称=用户昵称,
user_省份=用户所在省, user_城市=用户所在市, user_区县=用户所在区县,
user_街道信息=用户所在街道
)
@action(detail=False, methods=["post"], url_path="first_add")
def 首次添加用户收件地址(self, request: Request):
""""""
addressData = request.data.get("addressData", None)
self_mini_openid = request.data.get("self_mini_openid", None)
self_mini_unionid = request.data.get("self_mini_unionid", None)
self.update更新用户手机号码方法(address=addressData, self_mini_openid=self_mini_openid,
self_user_unionid=self_mini_unionid)
self.update更新用户头像事件(self_mini_unionid=self_mini_unionid)
a, b = weiuser微信用户地址.objects.update_or_create(
address=addressData, mini_unionid=self_mini_unionid, mini_openid=self_mini_openid,
isDefaultAddress=weiuser微信用户地址.choicesAddress.是默认地址.value,
)
查询当前用户的全部地址 = weiuser微信用户地址.objects.filter(mini_unionid=self_mini_unionid,
mini_openid=self_mini_openid, ).values(
"id_主键_配送地址", "id_str", "address", "isDefaultAddress")
httpResData = BaseResponse(
resData=ResData(listData=查询当前用户的全部地址, dictData={"demo": "xiaozizi"}), ).model_dump()
return Response(data=httpResData, status=status.HTTP_200_OK)
@action(detail=False, methods=["post"], url_path="query_all")
def 查询当前用户的全部地址(self, request: Request):
"""查询当前用户所有的配置过的配送地址"""
self_mini_openid = request.data.get("self_mini_openid", None)
self_mini_unionid = request.data.get("self_mini_unionid", None)
查询当前用户的全部地址 = weiuser微信用户地址.objects.filter(mini_openid=self_mini_openid,
mini_unionid=self_mini_unionid).values(
"id_主键_配送地址", "id_str", "address", "isDefaultAddress", "mini_unionid", "mini_openid")
httpResData = BaseResponse(
resData=ResData(listData=查询当前用户的全部地址, dictData={"demo": "在这里返回的吗"}), ).model_dump()
return Response(data=httpResData, status=status.HTTP_200_OK)
@action(detail=False, methods=["post", ], url_path="add")
def 添加用户地址(self, request: Request):
""""""
self_mini_openid = request.data.get("self_mini_openid", None)
self_mini_unionid = request.data.get("self_mini_unionid", None)
addressData = request.data.get("addressData", None)
self.update更新用户手机号码方法(address=addressData, self_mini_openid=self_mini_openid,
self_user_unionid=self_mini_unionid)
self.update更新用户头像事件(self_mini_unionid=self_mini_unionid)
是否新存在 = weiuser微信用户地址.objects.filter(address=addressData, mini_unionid=self_mini_unionid,
mini_openid=self_mini_openid).exists()
if 是否新存在:
# 这里说明的是用户首次添加新地址成功了,应该更新数据为 默认地址,
weiuser微信用户地址.objects.filter(mini_openid=self_mini_openid, mini_unionid=self_mini_unionid).update(
isDefaultAddress=weiuser微信用户地址.choicesAddress.不是默认地址.value)
print("判断,同时更新的当前所有的地址都为不是默认的值,")
weiuser微信用户地址.objects.filter(address=addressData, mini_openid=self_mini_openid,
mini_unionid=self_mini_unionid).update(
isDefaultAddress=weiuser微信用户地址.choicesAddress.是默认地址.value,
)
print("将当前的地址更新为默认值")
查询当前用户的全部地址 = weiuser微信用户地址.objects.filter(mini_openid=self_mini_openid,
mini_unionid=self_mini_unionid).values(
"id_主键_配送地址", "id_str", "address", "isDefaultAddress",
)
httpResData = BaseResponse(
resData=ResData(listData=查询当前用户的全部地址, dictData={"demo": "地址相同"}), ).model_dump()
return Response(data=httpResData, status=status.HTTP_200_OK)
else:
# 同时还需要将以前的地址全部更新为非默认地址,
创建新对象, 是否首次创建 = weiuser微信用户地址.objects.update_or_create(
address=addressData, mini_openid=self_mini_openid,
mini_unionid=self_mini_unionid) # 在这里更新了所有的地址都不是 默认的地址
(weiuser微信用户地址.objects.filter(mini_openid=self_mini_openid, mini_unionid=self_mini_unionid)
.update(isDefaultAddress=weiuser微信用户地址.choicesAddress.不是默认地址.value))
# 创建新对象.isDefaultAddress = weiuser微信用户地址.choicesAddress.是默认地址.value
# 创建新对象.save()
weiuser微信用户地址.objects.filter(address=addressData, mini_openid=self_mini_openid,
mini_unionid=self_mini_unionid).update(
isDefaultAddress=weiuser微信用户地址.choicesAddress.是默认地址.value,
)
查询当前用户的全部地址 = weiuser微信用户地址.objects.filter(mini_openid=self_mini_openid,
mini_unionid=self_mini_unionid).values(
"id_主键_配送地址", "id_str", "address", "isDefaultAddress",
)
httpResData = BaseResponse(
resData=ResData(listData=查询当前用户的全部地址, dictData={"demo": "添加成功"}), ).model_dump()
return Response(data=httpResData, status=status.HTTP_200_OK)
@action(detail=False, methods=["post"], url_path="delete")
def 单独删除地址(self, request: Request):
"""删除单个地址"""
idKey = request.data.get("idKey", None)
self_mini_openid = request.data.get("self_mini_openid", None)
self_mini_unionid = request.data.get("self_mini_unionid", None)
a, b = weiuser微信用户地址.objects.filter(id_主键_配送地址=idKey).delete()
查询当前用户的全部地址 = weiuser微信用户地址.objects.filter(mini_openid=self_mini_openid,
mini_unionid=self_mini_unionid).values(
"id_主键_配送地址", "id_str", "address", "isDefaultAddress")
httpResData = BaseResponse(
resData=ResData(listData=查询当前用户的全部地址, dictData={"demo": "xiaozizi"}), ).model_dump()
return Response(data=httpResData, status=status.HTTP_200_OK)
@action(detail=False, methods=["post"], url_path="all_delete")
def 删除当前用户所有的配送地址(self, request: Request):
"""删除全部的地址"""
self_mini_openid = request.data.get("self_mini_openid", None)
self_mini_unionid = request.data.get("self_mini_unionid", None)
weiuser微信用户地址.objects.filter(mini_unionid=self_mini_unionid, mini_openid=self_mini_openid).delete()
查询当前用户的全部地址 = weiuser微信用户地址.objects.filter(mini_unionid=self_mini_unionid,
mini_openid=self_mini_openid).values(
"id_主键_配送地址", "id_str", "address", "isDefaultAddress")
httpResData = BaseResponse(
resData=ResData(listData=查询当前用户的全部地址, dictData={"demo": "xiaozizi"}), ).model_dump()
return Response(data=httpResData, status=status.HTTP_200_OK)
@action(detail=False, methods=["post"], url_path="change_default")
def 设为默认地址(self, request: Request):
""""""
idKey = request.data.get("idKey", None)
self_mini_openid = request.data.get("self_mini_openid", None)
self_mini_unionid = request.data.get("self_mini_unionid", None)
addressData = weiuser微信用户地址.objects.get(id_主键_配送地址=idKey).address
self.update更新用户手机号码方法(address=addressData,
self_mini_openid=self_mini_openid,
self_user_unionid=self_mini_unionid)
self.update更新用户头像事件(self_mini_unionid=self_mini_unionid)
# 将所有的先更新为非默认地址
weiuser微信用户地址.objects.filter(mini_unionid=self_mini_unionid, mini_openid=self_mini_openid).update(
isDefaultAddress=weiuser微信用户地址.choicesAddress.不是默认地址.value)
weiuser微信用户地址.objects.filter(id_主键_配送地址=idKey, mini_unionid=self_mini_unionid,
mini_openid=self_mini_openid).update(
isDefaultAddress=weiuser微信用户地址.choicesAddress.是默认地址.value)
查询当前用户的全部地址 = weiuser微信用户地址.objects.filter(mini_unionid=self_mini_unionid,
mini_openid=self_mini_openid).values(
"id_主键_配送地址", "id_str", "address", "isDefaultAddress")
httpResData = BaseResponse(
resData=ResData(listData=查询当前用户的全部地址, dictData={"demo": "xiaozizi"}), ).model_dump()
return Response(data=httpResData, status=status.HTTP_200_OK)
@action(detail=False, methods=["post"], url_path="update")
def 更新当前配送地址(self, request: Request):
""""""
addressData = request.data.get("addressData", None)
idkey = request.data.get("idkey", None)
self_mini_openid = request.data.get("self_mini_openid", None)
self_mini_unionid = request.data.get("self_mini_unionid", None)
self.update更新用户手机号码方法(address=addressData, self_mini_openid=self_mini_openid,
self_user_unionid=self_mini_unionid)
对象是否存在 = weiuser微信用户地址.objects.filter(address=addressData,
mini_unionid=self_mini_unionid,
mini_openid=self_mini_openid).exists()
self.update更新用户头像事件(self_mini_unionid=self_mini_unionid)
if 对象是否存在:
# 说明用户当前是存在的啦(说明,addressData)是有相同的值存在的
查询当前用户的全部地址 = weiuser微信用户地址.objects.filter(mini_unionid=self_mini_unionid,
mini_openid=self_mini_openid).values(
"id_主键_配送地址", "id_str", "address", "isDefaultAddress")
httpResData = BaseResponse(
resData=ResData(listData=查询当前用户的全部地址, dictData={"demo": "没有更新"}), ).model_dump()
return Response(data=httpResData, status=status.HTTP_200_OK)
else:
weiuser微信用户地址.objects.filter(id_主键_配送地址=idkey).update(address=addressData)
查询当前用户的全部地址 = weiuser微信用户地址.objects.filter(mini_unionid=self_mini_unionid,
mini_openid=self_mini_openid).values(
"id_主键_配送地址", "id_str", "address", "isDefaultAddress")
httpResData = BaseResponse(
resData=ResData(listData=查询当前用户的全部地址, dictData={"demo": "xiaozizi"}), ).model_dump()
return Response(data=httpResData, status=status.HTTP_200_OK)
@action(detail=False, methods=["post"], url_path="locating")
def 解析用户的定位(self, request: Request):
""""""
self_user_unionid = request.data.get("self_user_unionid", None)
self_mini_openid = request.data.get("self_mini_openid", None)
result = request.data.get("result", None)
errMsg = jmespath.search(data=result, expression="errMsg")
latitude = jmespath.search(data=result, expression="latitude")
longitude = jmespath.search(data=result, expression="longitude")
speed = jmespath.search(data=result, expression="speed")
accuracy = jmespath.search(data=result, expression="accuracy")
altitude = jmespath.search(data=result, expression="altitude")
verticalAccuracy = jmespath.search(data=result, expression="verticalAccuracy")
horizontalAccuracy = jmespath.search(data=result, expression="horizontalAccuracy")
res = wei地图工具.经纬度转换为地址(location=f"{latitude},{longitude}")
standard_address = jmespath.search(data=res, expression="result.formatted_addresses.standard_address")
省 = jmespath.search(data=res, expression="result.address_component.province")
市 = jmespath.search(data=res, expression="result.address_component.city")
区 = jmespath.search(data=res, expression="result.address_component.district")
# 再计算一下距离
起点数据: OriginPointOptional = {"经度": f"{longitude}", "纬度": f"{latitude}", }
终点数据: OriginPointOptional = {"经度": str(longitude), "纬度": str(latitude)}
两地相多少公里 = wei地图工具.腾讯地图计算二点之间的距离(toData终点=终点数据, fromData起点=起点数据)
# print(f"两地相距了{两地相多少公里 / 1000}公里", type(两地相多少公里))
weiuser地图定位.objects.update_or_create(
map用户openid=self_mini_openid, map用户uniond=self_user_unionid, map两点距离=两地相多少公里,
map原点经纬度=起点数据, map终点经纬度=终点数据, map纬度latitude=latitude, map经度longitude=longitude,
map省=省, map市=市, map区=区)
httpResData = BaseResponse(resData=ResData(listData=[""], dictData={"demo": "xiaozizi"}), ).model_dump()
return Response(data=httpResData, status=status.HTTP_200_OK)