From f39c7773db23ae32e8398ca0b23e8fd4fa30b98a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A1=BE=E4=BD=B3=E4=B9=90?= <1687873499@qq.com> Date: Sun, 2 Nov 2025 20:11:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84owntracks=E5=8C=85=E4=B8=8B?= =?UTF-8?q?=E7=9A=84=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/djangoBlogStudy.iml | 26 +++++- .idea/modules.xml | 4 - src/owntracks/__init__.py | 1 + src/owntracks/admin.py | 5 +- src/owntracks/apps.py | 9 +- src/owntracks/migrations/0001_initial.py | 19 ++-- ...0002_alter_owntracklog_options_and_more.py | 19 ++-- src/owntracks/migrations/__init__.py | 1 + src/owntracks/models.py | 33 +++---- src/owntracks/tests.py | 29 +++--- src/owntracks/urls.py | 27 +++--- src/owntracks/views.py | 89 ++++++++++--------- 12 files changed, 145 insertions(+), 117 deletions(-) diff --git a/.idea/djangoBlogStudy.iml b/.idea/djangoBlogStudy.iml index 8b8c395..524cec2 100644 --- a/.idea/djangoBlogStudy.iml +++ b/.idea/djangoBlogStudy.iml @@ -1,12 +1,34 @@ + + + + + + - - + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index dc7543e..eb9a5a1 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,11 +2,7 @@ -<<<<<<< HEAD -======= - ->>>>>>> master \ No newline at end of file diff --git a/src/owntracks/__init__.py b/src/owntracks/__init__.py index e69de29..de9bcf4 100644 --- a/src/owntracks/__init__.py +++ b/src/owntracks/__init__.py @@ -0,0 +1 @@ +#gjl \ No newline at end of file diff --git a/src/owntracks/admin.py b/src/owntracks/admin.py index 8266170..028a390 100644 --- a/src/owntracks/admin.py +++ b/src/owntracks/admin.py @@ -1,3 +1,4 @@ +#gjl from django.contrib import admin # Register your models here. @@ -5,6 +6,6 @@ from django.contrib import admin # 定义一个 Django Admin 管理类,用于自定义管理界面中 OwnTrackLogs 模型的显示和行为 # 当前未添加任何自定义配置,使用默认的管理界面设置 class OwnTrackLogsAdmin(admin.ModelAdmin): - # 该类目前为空,表示使用 Django admin 的默认行为来管理 OwnTrackLogs 模型 - # 可在此处添加如 list_display, list_filter, search_fields 等属性来自定义管理界面 + # gjl该类目前为空,表示使用 Django admin 的默认行为来管理 OwnTrackLogs 模型 + # gjl可在此处添加如 list_display, list_filter, search_fields 等属性来自定义管理界面 pass \ No newline at end of file diff --git a/src/owntracks/apps.py b/src/owntracks/apps.py index 5c34e16..c3c97de 100644 --- a/src/owntracks/apps.py +++ b/src/owntracks/apps.py @@ -1,3 +1,4 @@ +#gjl from django.apps import AppConfig @@ -5,8 +6,8 @@ from django.apps import AppConfig # 它继承自 Django 的 AppConfig,用于定义该应用的配置信息。 # 当 Django 启动时,会自动发现并加载此配置,以正确初始化该应用。 class OwntracksConfig(AppConfig): - # name 属性指定了该 Django 应用的完整 Python 导入路径。 - # 这个路径告诉 Django 如何导入这个应用。在这个例子中, - # 表示该应用位于 PYTHONPATH 下可以直接导入的 'owntracks' 模块(或包)中。 - # 这个值通常与应用所在目录的名称一致。 + # gjl name 属性指定了该 Django 应用的完整 Python 导入路径。 + # gjl 这个路径告诉 Django 如何导入这个应用。在这个例子中, + # gjl 表示该应用位于 PYTHONPATH 下可以直接导入的 'owntracks' 模块(或包)中。 + # gjl 这个值通常与应用所在目录的名称一致。 name = 'owntracks' \ No newline at end of file diff --git a/src/owntracks/migrations/0001_initial.py b/src/owntracks/migrations/0001_initial.py index 346900e..ebb45da 100644 --- a/src/owntracks/migrations/0001_initial.py +++ b/src/owntracks/migrations/0001_initial.py @@ -1,3 +1,4 @@ +#gjl # Generated by Django 4.1.7 on 2023-03-02 07:14 # 导入 Django 迁移系统所需的核心模块 @@ -11,8 +12,8 @@ import django.utils.timezone # 定义一个 Django 数据库迁移类 # 该类继承自 migrations.Migration,由 Django 自动生成,用于描述对数据库模式的变更 class Migration(migrations.Migration): - # 标记此迁移为应用的初始迁移(initial migration) - # 当应用首次被迁移时,Django 会识别并执行此迁移 + # gjl标记此迁移为应用的初始迁移(initial migration) + # gjl当应用首次被迁移时,Django 会识别并执行此迁移 initial = True # 定义此迁移所依赖的其他迁移 @@ -21,8 +22,8 @@ class Migration(migrations.Migration): dependencies = [ ] - # 定义此迁移要执行的具体数据库操作列表 - # 每个操作是一个 Migration 操作类的实例,如 CreateModel、AddField 等 + # gjl定义此迁移要执行的具体数据库操作列表 + # gjl每个操作是一个 Migration 操作类的实例,如 CreateModel、AddField 等 operations = [ # 创建一个名为 'OwnTrackLog' 的新数据库模型(对应一张数据表) migrations.CreateModel( @@ -31,7 +32,7 @@ class Migration(migrations.Migration): # 定义该模型包含的数据库字段 # 每个字段由字段名和字段类型及参数组成 fields=[ - # 主键字段 'id':自增的 BigAutoField(64位整数) + # gjl主键字段 'id':自增的 BigAutoField(64位整数) # auto_created=True: 表示是 Django 自动创建的主键 # primary_key=True: 指定为主键 # serialize=False: 在序列化(如 dumpdata)时是否包含此字段 @@ -51,12 +52,12 @@ class Migration(migrations.Migration): # verbose_name='经度': 在界面中显示为“经度” ('lon', models.FloatField(verbose_name='经度')), - # 'created_time' 字段:记录创建时间,使用 DateTimeField - # default=django.utils.timezone.now: 默认值为当前时间(注意:传入函数引用,非调用结果) - # verbose_name='创建时间': 在界面中显示为“创建时间” + # gjl 'created_time' 字段:记录创建时间,使用 DateTimeField + # gjl default=django.utils.timezone.now: 默认值为当前时间(注意:传入函数引用,非调用结果) + # gjk verbose_name='创建时间': 在界面中显示为“创建时间” ('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), ], - # 定义该模型的元数据选项(对应模型内部的 Meta 类) + # gjl定义该模型的元数据选项(对应模型内部的 Meta 类) options={ # verbose_name: 模型在管理后台的单数可读名称 'verbose_name': 'OwnTrackLogs', diff --git a/src/owntracks/migrations/0002_alter_owntracklog_options_and_more.py b/src/owntracks/migrations/0002_alter_owntracklog_options_and_more.py index baa43ea..32f149a 100644 --- a/src/owntracks/migrations/0002_alter_owntracklog_options_and_more.py +++ b/src/owntracks/migrations/0002_alter_owntracklog_options_and_more.py @@ -1,3 +1,4 @@ +#gjl # Generated by Django 4.2.5 on 2023-09-06 13:19 # 导入 Django 数据库迁移模块,用于执行数据库模式变更 @@ -8,21 +9,21 @@ from django.db import migrations # 该类继承自 migrations.Migration,由 Django 自动生成,用于描述对数据库模式的变更 # 此迁移是继初始迁移之后的第二次迁移,用于修改现有模型 class Migration(migrations.Migration): - # 定义此迁移所依赖的其他迁移 - # 必须在 'owntracks' 应用的 '0001_initial' 迁移成功执行后,此迁移才能执行 - # 确保数据库状态的顺序性和一致性 + # gjl定义此迁移所依赖的其他迁移 + # gjl必须在 'owntracks' 应用的 '0001_initial' 迁移成功执行后,此迁移才能执行 + # gjl确保数据库状态的顺序性和一致性 dependencies = [ ('owntracks', '0001_initial'), ] - # 定义此迁移要执行的具体数据库操作列表 - # 包含两个操作:修改模型选项和重命名字段 + # gjl定义此迁移要执行的具体数据库操作列表 + # gjl包含两个操作:修改模型选项和重命名字段 operations = [ - # 操作一:修改模型 'owntracklog' 的元数据选项(Meta options) - # 将模型的 verbose_name, verbose_name_plural, ordering, get_latest_by 等选项更新为新的值 - # 注意:此操作只修改 Django ORM 层的元数据,不直接修改数据库表结构 + # gjl操作一:修改模型 'owntracklog' 的元数据选项(Meta options) + # gjl将模型的 verbose_name, verbose_name_plural, ordering, get_latest_by 等选项更新为新的值 + # gjl注意:此操作只修改 Django ORM 层的元数据,不直接修改数据库表结构 migrations.AlterModelOptions( - # 指定要修改选项的模型名称(小写) + # gjl指定要修改选项的模型名称(小写) name='owntracklog', # 新的元数据选项字典 options={ diff --git a/src/owntracks/migrations/__init__.py b/src/owntracks/migrations/__init__.py index e69de29..de9bcf4 100644 --- a/src/owntracks/migrations/__init__.py +++ b/src/owntracks/migrations/__init__.py @@ -0,0 +1 @@ +#gjl \ No newline at end of file diff --git a/src/owntracks/models.py b/src/owntracks/models.py index 13ea7fb..9227a60 100644 --- a/src/owntracks/models.py +++ b/src/owntracks/models.py @@ -1,3 +1,4 @@ +#gjl from django.db import models from django.utils.timezone import now @@ -7,30 +8,30 @@ from django.utils.timezone import now # 定义一个名为 OwnTrackLog 的数据库模型,用于存储由 OwnTracks 应用程序上传的位置日志数据。 # 该模型继承自 Django 的 models.Model 类,每个类属性对应数据库中的一列。 class OwnTrackLog(models.Model): - # tid (Tracker ID): 标识发送位置信息的设备或用户。 - # 使用 CharField 存储字符串,最大长度为100个字符,不允许为空(null=False)。 - # verbose_name 设置为 '用户',在 Django 管理后台等界面中显示为“用户”。 + # gjl (Tracker ID): 标识发送位置信息的设备或用户。 + # gjl 使用 CharField 存储字符串,最大长度为100个字符,不允许为空(null=False)。 + # gjl verbose_name 设置为 '用户',在 Django 管理后台等界面中显示为“用户”。 tid = models.CharField(max_length=100, null=False, verbose_name='用户') - # lat: 存储地理位置的纬度坐标。 - # 使用 FloatField 存储浮点数,表示纬度值(例如:39.9042)。 - # verbose_name 设置为 '纬度',用于在管理后台中显示友好的字段名。 + # gjl lat: 存储地理位置的纬度坐标。 + # gjl 使用 FloatField 存储浮点数,表示纬度值(例如:39.9042)。 + # gjl verbose_name 设置为 '纬度',用于在管理后台中显示友好的字段名。 lat = models.FloatField(verbose_name='纬度') - # lon: 存储地理位置的经度坐标。 - # 使用 FloatField 存储浮点数,表示经度值(例如:116.4074)。 - # verbose_name 设置为 '经度',用于在管理后台中显示友好的字段名。 + # gjl lon: 存储地理位置的经度坐标。 + # gjl 使用 FloatField 存储浮点数,表示经度值(例如:116.4074)。 + # gjlverbose_name 设置为 '经度',用于在管理后台中显示友好的字段名。 lon = models.FloatField(verbose_name='经度') - # creation_time: 记录该位置信息被创建的时间。 - # 使用 DateTimeField 存储日期和时间。 - # 第一个参数 '创建时间' 是该字段的 verbose_name(可读名称)。 - # default=now 表示默认值为当前时间(注意:这里传入的是函数引用 now,不是 now(),以避免迁移时时间固定)。 + # gjl creation_time: 记录该位置信息被创建的时间。 + # gjl使用 DateTimeField 存储日期和时间。 + # gjl第一个参数 '创建时间' 是该字段的 verbose_name(可读名称)。 + # gjldefault=now 表示默认值为当前时间(注意:这里传入的是函数引用 now,不是 now(),以避免迁移时时间固定)。 creation_time = models.DateTimeField('创建时间', default=now) - # __str__(self) 方法定义了该模型实例对象在转换为字符串时的行为。 - # 在 Django 管理后台、shell 或其他需要显示对象的地方,会显示此方法的返回值。 - # 此处返回 self.tid,即该记录对应的用户/设备ID,便于识别。 + # gjl __str__(self) 方法定义了该模型实例对象在转换为字符串时的行为。 + # gjl 在 Django 管理后台、shell 或其他需要显示对象的地方,会显示此方法的返回值。 + # gjl此处返回 self.tid,即该记录对应的用户/设备ID,便于识别。 def __str__(self): return self.tid diff --git a/src/owntracks/tests.py b/src/owntracks/tests.py index f77fab8..191e161 100644 --- a/src/owntracks/tests.py +++ b/src/owntracks/tests.py @@ -1,3 +1,4 @@ +#gjl import json # 导入 Django 测试框架所需的核心类和模块 @@ -13,29 +14,29 @@ from .models import OwnTrackLog # 定义一个测试类,用于测试 OwnTrackLog 相关的功能,如数据接收、地图展示、数据查询等 # 继承自 Django 的 TestCase,提供数据库隔离、断言方法和测试工具 class OwnTrackLogTest(TestCase): - # setUp 方法在每个测试方法执行前自动运行,用于准备测试所需的环境和对象 - # 本方法中初始化了测试客户端和请求工厂,便于模拟 HTTP 请求 + # gjl setUp 方法在每个测试方法执行前自动运行,用于准备测试所需的环境和对象 + # gjl 本方法中初始化了测试客户端和请求工厂,便于模拟 HTTP 请求 def setUp(self): # 创建一个 Django 测试客户端实例,用于模拟浏览器发送 GET、POST 等请求 self.client = Client() - # 创建一个请求工厂实例,用于创建伪造的 HTTP 请求对象(如 HttpRequest) - # 适用于需要直接调用视图函数的测试场景(本测试中未直接使用,但已准备) + # gjl 创建一个请求工厂实例,用于创建伪造的 HTTP 请求对象(如 HttpRequest) + # gjl 适用于需要直接调用视图函数的测试场景(本测试中未直接使用,但已准备) self.factory = RequestFactory() - # test_own_track_log 是一个具体的测试用例,用于验证 OwnTrackLog 功能的正确性 - # 测试内容包括:接收位置数据、数据完整性、权限控制、页面响应等 + # gjl test_own_track_log 是一个具体的测试用例,用于验证 OwnTrackLog 功能的正确性 + # gjl 测试内容包括:接收位置数据、数据完整性、权限控制、页面响应等 def test_own_track_log(self): - # 构造一个模拟的位置数据字典,包含 tid(用户标识)、lat(纬度)、lon(经度) + # gjl 构造一个模拟的位置数据字典,包含 tid(用户标识)、lat(纬度)、lon(经度) o = { 'tid': 12, 'lat': 123.123, 'lon': 134.341 } - # 使用测试客户端发送一个 POST 请求到 '/owntracks/logtracks' 接口 - # 将位置数据 o 序列化为 JSON 字符串,并设置内容类型为 application/json - # 模拟 OwnTracks 客户端上传位置信息 + # gjl 使用测试客户端发送一个 POST 请求到 '/owntracks/logtracks' 接口 + # gjl 将位置数据 o 序列化为 JSON 字符串,并设置内容类型为 application/json + # gjl 模拟 OwnTracks 客户端上传位置信息 self.client.post( '/owntracks/logtracks', json.dumps(o), @@ -71,15 +72,15 @@ class OwnTrackLogTest(TestCase): # 断言:检查响应状态码为 302(重定向),说明未登录用户访问地图页时被重定向(如跳转到登录页) self.assertEqual(rsp.status_code, 302) - # 创建一个超级用户,用于测试需要登录权限的功能 - # 使用 BlogUser 模型的 create_superuser 方法创建具有管理员权限的测试用户 + # gjl 创建一个超级用户,用于测试需要登录权限的功能 + # gjl 使用 BlogUser 模型的 create_superuser 方法创建具有管理员权限的测试用户 user = BlogUser.objects.create_superuser( email="liangliangyy1@gmail.com", username="liangliangyy1", password="liangliangyy1") - # 使用测试客户端以刚创建的超级用户身份登录 - # 模拟用户登录过程,使后续请求具有认证状态 + # gjl 使用测试客户端以刚创建的超级用户身份登录 + # gjl 模拟用户登录过程,使后续请求具有认证状态 self.client.login(username='liangliangyy1', password='liangliangyy1') # 手动创建一条 OwnTrackLog 记录并保存到数据库 diff --git a/src/owntracks/urls.py b/src/owntracks/urls.py index d517340..2b87930 100644 --- a/src/owntracks/urls.py +++ b/src/owntracks/urls.py @@ -1,3 +1,4 @@ +#gjl from django.urls import path # 导入当前应用(owntracks)的视图模块,用于将 URL 路由映射到具体的视图函数 @@ -11,24 +12,24 @@ app_name = "owntracks" # urlpatterns 是 Django 用于定义 URL 路由的核心变量 # 它是一个列表,包含了一系列 path() 实例,每个实例定义了一个 URL 模式与视图函数的映射关系 urlpatterns = [ - # 将 URL 路径 'owntracks/logtracks' 映射到 views 模块中的 manage_owntrack_log 视图函数 - # 该接口用于接收 OwnTracks 客户端上传的位置日志数据(通常为 POST 请求) - # 在模板或代码中可通过 {% url 'owntracks:logtracks' %} 反向解析此 URL + # gjl 将 URL 路径 'owntracks/logtracks' 映射到 views 模块中的 manage_owntrack_log 视图函数 + # gjl 该接口用于接收 OwnTracks 客户端上传的位置日志数据(通常为 POST 请求) + # gjl 在模板或代码中可通过 {% url 'owntracks:logtracks' %} 反向解析此 URL path('owntracks/logtracks', views.manage_owntrack_log, name='logtracks'), - # 将 URL 路径 'owntracks/show_maps' 映射到 views 模块中的 show_maps 视图函数 - # 该接口用于渲染并展示用户位置轨迹的地图页面(通常为 GET 请求) - # 需要用户登录后访问,显示历史轨迹 + # gjl将 URL 路径 'owntracks/show_maps' 映射到 views 模块中的 show_maps 视图函数 + # gjl该接口用于渲染并展示用户位置轨迹的地图页面(通常为 GET 请求) + # gjl需要用户登录后访问,显示历史轨迹 path('owntracks/show_maps', views.show_maps, name='show_maps'), - # 将 URL 路径 'owntracks/get_datas' 映射到 views 模块中的 get_datas 视图函数 - # 该接口是一个数据接口(API),用于返回指定日期的位置轨迹数据(通常为 JSON 格式) - # 前端地图页面通过 AJAX 调用此接口获取数据进行渲染 - # 支持通过查询参数(如 ?date=...)指定日期 + # gjl 将 URL 路径 'owntracks/get_datas' 映射到 views 模块中的 get_datas 视图函数 + # gjl 该接口是一个数据接口(API),用于返回指定日期的位置轨迹数据(通常为 JSON 格式) + # gjl 前端地图页面通过 AJAX 调用此接口获取数据进行渲染 + # gjl 支持通过查询参数(如 ?date=...)指定日期 path('owntracks/get_datas', views.get_datas, name='get_datas'), - # 将 URL 路径 'owntracks/show_dates' 映射到 views 模块中的 show_log_dates 视图函数 - # 该接口用于展示用户有轨迹记录的所有日期列表页面 - # 通常作为地图页面的前置页面,让用户选择要查看的日期 + # gjl 将 URL 路径 'owntracks/show_dates' 映射到 views 模块中的 show_log_dates 视图函数 + # gjl 该接口用于展示用户有轨迹记录的所有日期列表页面 + # gjl 通常作为地图页面的前置页面,让用户选择要查看的日期 path('owntracks/show_dates', views.show_log_dates, name='show_dates') ] \ No newline at end of file diff --git a/src/owntracks/views.py b/src/owntracks/views.py index edfa1de..8268f94 100644 --- a/src/owntracks/views.py +++ b/src/owntracks/views.py @@ -1,3 +1,4 @@ +#gjl # Create your views here. import datetime import itertools @@ -27,93 +28,93 @@ logger = logging.getLogger(__name__) @csrf_exempt def manage_owntrack_log(request): try: - # 读取请求体的原始数据,并解码为 UTF-8 字符串,然后解析为 Python 字典 + # gjl 读取请求体的原始数据,并解码为 UTF-8 字符串,然后解析为 Python 字典 s = json.loads(request.read().decode('utf-8')) - # 从解析后的数据中提取 tid(用户/设备标识)、lat(纬度)、lon(经度) + # gjl 从解析后的数据中提取 tid(用户/设备标识)、lat(纬度)、lon(经度) tid = s['tid'] lat = s['lat'] lon = s['lon'] - # 记录一条 INFO 级别的日志,包含接收到的位置信息 + # gjl 记录一条 INFO 级别的日志,包含接收到的位置信息 logger.info( 'tid:{tid}.lat:{lat}.lon:{lon}'.format( tid=tid, lat=lat, lon=lon)) # 验证提取的数据是否都存在(非空) if tid and lat and lon: - # 创建一个新的 OwnTrackLog 模型实例 + # gjl 创建一个新的 OwnTrackLog 模型实例 m = OwnTrackLog() - # 将接收到的数据赋值给模型字段 + # gjl 将接收到的数据赋值给模型字段 m.tid = tid m.lat = lat m.lon = lon - # 保存到数据库(creation_time 会自动使用默认值 now) + # gjl 保存到数据库(creation_time 会自动使用默认值 now) m.save() - # 返回 HTTP 响应 'ok',表示数据接收和保存成功 + # gjl 返回 HTTP 响应 'ok',表示数据接收和保存成功 return HttpResponse('ok') else: - # 如果数据不完整,返回 'data error' + # gjl 如果数据不完整,返回 'data error' return HttpResponse('data error') except Exception as e: - # 捕获任何异常,记录错误日志,并返回 'error' 响应 + # gjl 捕获任何异常,记录错误日志,并返回 'error' 响应 logger.error(e) return HttpResponse('error') -# 视图函数:渲染显示地图的 HTML 页面 -# 使用 @login_required 装饰器,确保只有登录用户才能访问 +# gjl 视图函数:渲染显示地图的 HTML 页面 +# gjl 使用 @login_required 装饰器,确保只有登录用户才能访问 @login_required def show_maps(request): - # 进一步检查用户是否为超级用户(管理员) + # gjl 进一步检查用户是否为超级用户(管理员) if request.user.is_superuser: - # 获取当前 UTC 日期,作为默认日期 + # gjl 获取当前 UTC 日期,作为默认日期 defaultdate = str(datetime.datetime.now(timezone.utc).date()) - # 从 GET 请求参数中获取 'date',如果不存在则使用默认日期 + # gjl 从 GET 请求参数中获取 'date',如果不存在则使用默认日期 date = request.GET.get('date', defaultdate) - # 构造模板上下文,将日期传递给前端 + # gjl 构造模板上下文,将日期传递给前端 context = { 'date': date } - # 使用指定的 HTML 模板渲染响应 + # gjl 使用指定的 HTML 模板渲染响应 return render(request, 'owntracks/show_maps.html', context) else: - # 如果不是超级用户,返回 403 禁止访问 + # gjl 如果不是超级用户,返回 403 禁止访问 from django.http import HttpResponseForbidden return HttpResponseForbidden() -# 视图函数:渲染显示有轨迹记录的日期列表页面 -# 使用 @login_required 装饰器,确保只有登录用户才能访问 +# gjl 视图函数:渲染显示有轨迹记录的日期列表页面 +# gjl 使用 @login_required 装饰器,确保只有登录用户才能访问 @login_required def show_log_dates(request): - # 查询所有 OwnTrackLog 记录的 creation_time 字段值 + # gjl 查询所有 OwnTrackLog 记录的 creation_time 字段值 dates = OwnTrackLog.objects.values_list('creation_time', flat=True) - # 将 datetime 对象转换为 'YYYY-MM-DD' 格式的字符串,并去重、排序 + # gjl 将 datetime 对象转换为 'YYYY-MM-DD' 格式的字符串,并去重、排序 results = list(sorted(set(map(lambda x: x.strftime('%Y-%m-%d'), dates)))) - # 构造模板上下文,将日期列表传递给前端 + # gjl 构造模板上下文,将日期列表传递给前端 context = { 'results': results } - # 使用指定的 HTML 模板渲染响应 + # gjl 使用指定的 HTML 模板渲染响应 return render(request, 'owntracks/show_log_dates.html', context) -# 辅助函数:将 GPS 坐标(WGS-84)批量转换为高德地图坐标系(GCJ-02) -# 由于高德 API 有数量限制,此处每次处理最多 30 个点 -# 注意:此函数在 get_datas 中被注释掉,当前未使用 +# gjl 辅助函数:将 GPS 坐标(WGS-84)批量转换为高德地图坐标系(GCJ-02) +# gjl 由于高德 API 有数量限制,此处每次处理最多 30 个点 +# gjl 注意:此函数在 get_datas 中被注释掉,当前未使用 def convert_to_amap(locations): convert_result = [] # 存储转换后的坐标结果 it = iter(locations) # 创建一个迭代器 - # 每次从迭代器中取出最多 30 个位置点 + # gjl 每次从迭代器中取出最多 30 个位置点 item = list(itertools.islice(it, 30)) while item: - # 将每个点的经度和纬度拼接成 "lon,lat" 字符串,用分号连接成一个列表 + # gjl 将每个点的经度和纬度拼接成 "lon,lat" 字符串,用分号连接成一个列表 datas = ';'.join( set(map(lambda x: str(x.lon) + ',' + str(x.lat), item))) - # 高德坐标转换 API 的固定参数 + # gjl 高德坐标转换 API 的固定参数 key = '8440a376dfc9743d8924bf0ad141f28e' api = 'http://restapi.amap.com/v3/assistant/coordinate/convert' # 构造请求参数 @@ -136,9 +137,9 @@ def convert_to_amap(locations): return ";".join(convert_result) -# 视图函数:返回指定日期的位置轨迹数据,供前端地图使用 -# 返回 JSON 格式的数据,通常由 AJAX 调用 -# 使用 @login_required 装饰器,确保只有登录用户才能访问 +# gjl 视图函数:返回指定日期的位置轨迹数据,供前端地图使用 +# gjl 返回 JSON 格式的数据,通常由 AJAX 调用 +# gjl 使用 @login_required 装饰器,确保只有登录用户才能访问 @login_required def get_datas(request): # 获取当前 UTC 时间 @@ -154,17 +155,17 @@ def get_datas(request): querydate = django.utils.timezone.datetime( date[0], date[1], date[2], 0, 0, 0) - # 计算查询结束时间(起始时间 + 1 天) + # gjl 计算查询结束时间(起始时间 + 1 天) nextdate = querydate + datetime.timedelta(days=1) - # 查询指定日期范围内(当天)的所有位置记录 + # gjl查询指定日期范围内(当天)的所有位置记录 models = OwnTrackLog.objects.filter( creation_time__range=(querydate, nextdate)) - # 初始化结果列表 + # gjl 初始化结果列表 result = list() - # 如果查询到记录,则按 tid(用户/设备)分组处理 + # glj 如果查询到记录,则按 tid(用户/设备)分组处理 if models and len(models): for tid, item in groupby( # 先按 tid 排序,以便 groupby 正确分组 @@ -172,19 +173,19 @@ def get_datas(request): # 指定分组依据为 tid key=lambda k: k.tid): - # 为每个 tid 创建一个数据字典 + # gjl 为每个 tid 创建一个数据字典 d = dict() d["name"] = tid # 记录设备/用户名称 paths = list() # 存储该设备的轨迹点序列 - # 方案一(当前启用):直接使用原始 GPS 坐标 - # 遍历该设备当天的所有位置点,按时间排序 + # gjl 方案一(当前启用):直接使用原始 GPS 坐标 + # gjl 遍历该设备当天的所有位置点,按时间排序 for location in sorted(item, key=lambda x: x.creation_time): - # 将每个点的经度和纬度作为字符串列表添加到 paths + # gjl 将每个点的经度和纬度作为字符串列表添加到 paths paths.append([str(location.lon), str(location.lat)]) - # # 方案二(注释中):使用高德转换后的坐标 - # # 先转换坐标,然后解析 + # # gjl 方案二(注释中):使用高德转换后的坐标 + # # gjl 先转换坐标,然后解析 # locations = convert_to_amap( # sorted(item, key=lambda x: x.creation_time)) # for i in locations.split(';'): @@ -195,6 +196,6 @@ def get_datas(request): # 将该设备的轨迹数据添加到总结果列表 result.append(d) - # 将结果列表序列化为 JSON 并返回 - # safe=False 允许返回非字典类型的对象(如列表) + # gjl 将结果列表序列化为 JSON 并返回 + # gjl safe=False 允许返回非字典类型的对象(如列表) return JsonResponse(result, safe=False) \ No newline at end of file