合并sh_branch分支:解决文件删除冲突

pull/8/head
yyd 4 months ago
commit 88533dbcbd

@ -1,9 +1,12 @@
<!doctype html>
<head>
<meta charset="utf-8">
<!-- 强制以Chrome内核渲染页面针对IE等浏览器的兼容设置 -->
<meta http-equiv="X-UA-Compatible" content="chrome=1">
<!-- 配置视口初始缩放1.0、禁止用户缩放、宽度适配设备宽度 -->
<meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
<style>
/* 重置html、body和容器的样式宽度高度100%、外边距0 */
html,
body,
#container {
@ -11,7 +14,7 @@
height: 100%;
margin: 0px;
}
/* 加载提示框样式绝对定位、层级9999、背景红色、白色文字等 */
#loadingTip {
position: absolute;
z-index: 9999;
@ -23,11 +26,14 @@
font-size: 14px;
}
</style>
<!-- 页面标题:运动轨迹 -->
<title>运动轨迹</title>
</head>
<body>
<!-- 地图容器 -->
<div id="container"></div>
<!-- 引入高德地图JS API -->
<script type="text/javascript" src='//webapi.amap.com/maps?v=1.4.4&key=9c89950bdfbcecd46f814309384655cd'></script>
<!-- UI组件库 1.0 -->
<script src="//webapi.amap.com/ui/1.0/main.js?v=1.0.11"></script>
@ -37,6 +43,7 @@
zoom: 4
});
// 加载路径简化器PathSimplifier和jQuery类库
AMapUI.load(['ui/misc/PathSimplifier', 'lib/$'], function (PathSimplifier, $) {
if (!PathSimplifier.supportCanvas) {
@ -50,7 +57,7 @@
"#b82e2e", "#316395", "#994499", "#22aa99", "#aaaa11", "#6633cc", "#e67300", "#8b0707",
"#651067", "#329262", "#5574a6", "#3b3eac"
];
// 初始化路径简化器实例
var pathSimplifierIns = new PathSimplifier({
zIndex: 100,
//autoSetFitView:false,
@ -66,13 +73,14 @@
//point
return pathData.name + ',点:' + pointIndex + '/' + pathData.path.length;
}
// hover 到轨迹线时,显示“名称, 点数量:总点数”
return pathData.name + ',点数量' + pathData.path.length;
},
renderOptions: {
pathLineStyle: {
dirArrowStyle: true
},
// 自定义路径样式(根据缩放级别和索引动态设置颜色、线宽)
getPathStyle: function (pathItem, zoom) {
var color = colors[pathItem.pathIndex % colors.length],
@ -93,11 +101,11 @@
}
}
});
// 将路径简化器实例暴露到window方便调试
window.pathSimplifierIns = pathSimplifierIns;
$('<div id="loadingTip">加载数据,请稍候...</div>').appendTo(document.body);
// 从后端接口获取轨迹数据(带日期参数)
$.getJSON('/owntracks/get_datas?date={{ date }}', function (d) {
if (!d || !d.length) {
@ -116,7 +124,7 @@
function onerror(e) {
alert('图片加载失败!');
}
// 遍历每条轨迹,创建导航器并启动自动播放
d.forEach(function (item, index) {
var navg1 = pathSimplifierIns.createPathNavigator(index, {
loop: true,

Binary file not shown.

@ -0,0 +1,3 @@
{{ object.title }}
{{ object.author.username }}
{{ object.body }}

@ -0,0 +1,22 @@
{% extends 'share_layout/base.html' %} {# 继承基础布局模板 #}
{% block header %} {# 定义页面头部区块 #}
<title> {{ title }}</title> {# 设置页面标题使用模板变量title #}
{% endblock %} {# 头部区块结束 #}
{% block content %} {# 定义页面内容区块 #}
<div id="primary" class="site-content"> {# 主内容容器,对应站点样式 #}
<div id="content" role="main"> {# 核心内容容器,语义化角色为主要内容 #}
<header class="archive-header"> {# 归档页头部容器 #}
<h2 class="archive-title"> {{ content }}</h2> {# 归档标题使用模板变量content #}
</header><!-- .archive-header --> {# 归档头部结束注释 #}
<br/>
<header class="archive-header" style="text-align: center"> {# 另一个归档头部,包含内联样式(此处省略具体样式) #}
<a href="{% url "account:login" %}">登录</a> {# 登录链接调用Django的url反向解析对应account应用的login视图 #}
|
<a href="/">回到首页</a> {# 首页链接,指向站点根路径 #}
</header><!-- .archive-header -->
</div>
</div>
{% endblock %} {# 内容区块结束 #}

@ -0,0 +1,13 @@
{% load i18n %} {# 加载国际化模板标签,用于多语言支持 #}
<div class="widget-login"> {# 登录小部件的容器,定义样式类 #}
{% if apps %} {# 判断apps变量是否存在即是否有第三方登录方式 #}
<small> {# 小型文本容器,用于显示“快速登录”标签 #}
{% trans 'quick login' %}: {# 国际化翻译“快速登录”文本 #}
</small>
{% for icon,url in apps %} {# 遍历apps列表每个元素包含图标标识和登录链接 #}
<a href="{{ url }}" rel="nofollow"> {# 第三方登录链接添加nofollow属性防止SEO权重传递 #}
<span class="icon-sn-{{ icon }}"></span> {# 第三方登录图标通过icon变量拼接样式类 #}
</a>
{% endfor %} {# 结束apps列表的遍历 #}
{% endif %} {# 结束apps存在性的判断 #}
</div> {# 关闭登录小部件的容器 #}

@ -0,0 +1,57 @@
{# 继承项目中通用的账户页面布局模板,确保页面风格、公共组件(如导航、页脚)的一致性 #}
{% extends 'share_layout/base_account.html' %}
{# 加载Django静态文件标签库用于引入CSS、JavaScript、图片等静态资源 #}
{% load static %}
{# 定义当前模板的“内容区块”,填充到基础模板中对应的{% block content %}占位区域 #}
{% block content %}
<div class="container"> {# 页面布局容器用于排版和响应式设计通常配合Bootstrap等前端框架 #}
{# 页面主标题,样式使其居中并应用表单登录相关样式 #}
<h2 class="form-signin-heading text-center">绑定您的邮箱账号</h2>
<div class="card card-signin"> {# 卡片式容器,包裹头像与表单,提升视觉层次感 #}
{% if picture %} {# 条件判断若存在用户自定义头像picture变量则显示该头像 #}
<img class="img-circle profile-img" src="{{ picture }}" alt="">
{# 若不存在自定义头像,则显示项目静态资源中的默认头像 #}
{% else %}
<img class="img-circle profile-img" src="{% static 'blog/img/avatar.png' %}" alt="">
{% endif %}
{# 表单区域通过POST方法提交数据action为空表示提交到当前页面URL #}
<form class="form-signin" action="" method="post">
{# CSRF令牌防止跨站请求伪造攻击POST表单必须包含 #}
{% csrf_token %}
{% comment %}<label for="inputEmail" class="sr-only">Email address</label>
{# 邮箱输入框type="email"做基础格式校验required为必填autofocus页面加载后自动聚焦 #}
<input type="email" id="inputEmail" class="form-control" placeholder="Email" required autofocus>
<label for="inputPassword" class="sr-only">Password</label>
{# 密码输入框type="password"隐藏输入内容required为必填 #}
<input type="password" id="inputPassword" class="form-control" placeholder="Password" required>{% endcomment %}
{# 显示表单非字段级别的错误信息(如表单整体的验证错误) #}
{{ form.non_field_errors }}
{# 循环渲染表单的每个字段及其错误信息 #}
{% for field in form %}
{{ field }} {# 渲染字段的HTML输入元素 #}
{{ field.errors }} {# 渲染该字段的错误信息 #}
{% endfor %}
{# 提交按钮应用Bootstrap样式点击后提交表单 #}
<button class="btn btn-lg btn-primary btn-block" type="submit">提交</button>
{# 注释块:暂不启用的“帮助链接”和“记住登录状态”复选框区域 #}
{% comment %}
<div class="checkbox">
<a class="pull-right">Need help?</a>
<label>
<input type="checkbox" value="remember-me"> Stay signed in
</label>
</div>
{% endcomment %}
</form>
</div>
{# 跳转到登录页面的链接通过Django URL反向解析生成登录页地址 #}
<p class="text-center">
<a href="{% url "account:login" %}">登录</a>
</p>
</div> <!-- /container -->
{% endblock %}

@ -0,0 +1,83 @@
{# 继承基础布局模板,确保页面整体结构(如导航、页脚)与项目其他页面一致 #}
{% extends 'share_layout/base.html' %}
{# 加载博客自定义模板标签库,用于后续调用自定义标签(如 load_article_detail #}
{% load blog_tags %}
{# 定义页面头部区块(对应 base.html 中的 header 块),设置 SEO 与社交分享元信息 #}
{% block header %}
{# 页面标题:站点名称 + 站点描述 #}
<title>{{ SITE_NAME }} | {{ SITE_DESCRIPTION }}</title>
{# SEO 元标签:描述、关键词 #}
<meta name="description" content="{{ SITE_SEO_DESCRIPTION }}"/>
<meta name="keywords" content="{{ SITE_KEYWORDS }}"/>
{# Open Graph 协议元标签(社交平台分享时的预览信息) #}
<meta property="og:type" content="blog"/>
<meta property="og:title" content="{{ SITE_NAME }}"/>
<meta property="og:description" content="{{ SITE_DESCRIPTION }}"/>
<meta property="og:url" content="{{ SITE_BASE_URL }}"/>
<meta property="og:site_name" content="{{ SITE_NAME }}"/>
{% endblock %}
{# 定义页面主体内容区块(对应 base.html 中的 content 块) #}
{% block content %}
{# 页面主容器,用于排版与样式控制 #}
<div id="primary" class="site-content">
<div id="content" role="main">
{# 若存在搜索关键词query 不为空),则渲染搜索结果头部 #}
{% if query %}
<header class="archive-header">
{# 若存在推荐搜索词suggestion 不为空),显示推荐结果与原始搜索链接 #}
{% if suggestion %}
<h2 class="archive-title">
已显示<span style="color: red"> “{{ suggestion }}” </span>的搜索结果。&nbsp;&nbsp;
仍然搜索:<a style="text-transform: none;" href="/search/?q={{ query }}&is_suggest=no">{{ query }}</a> <br>
</h2>
{% else %}
<h2 class="archive-title">
搜索:<span style="color: red">{{ query }} </span> &nbsp;&nbsp;
</h2>
{% endif %}
</header><!-- .archive-header -->
{% endif %}
{# 若存在搜索关键词且结果列表不为空,渲染文章列表与分页 #}
{% if query and page.object_list %}
{# 循环遍历搜索结果分页中的每篇文章 #}
{% for article in page.object_list %}
{% load_article_detail article.object True user %}
{% endfor %}
{# 若存在上一页或下一页,渲染分页导航 #}
{% if page.has_previous or page.has_next %}
<nav id="nav-below" class="navigation" role="navigation">
<h3 class="assistive-text">文章导航</h3>
{% if page.has_previous %}
<div class="nav-previous"><a
href="?q={{ query }}&amp;page={{ page.previous_page_number }}"><span
class="meta-nav">&larr;</span> 早期文章</a></div>
{% endif %}
{% if page.has_next %}
<div class="nav-next"><a href="?q={{ query }}&amp;page={{ page.next_page_number }}">较新文章
<span
class="meta-nav">→</span></a>
</div>
{% endif %}
</nav><!-- .navigation -->
{% endif %}
{# 若无搜索结果(关键词存在但结果列表为空),渲染无结果提示 #}
{% else %}
<header class="archive-header">
<h1 class="archive-title">哎呀,关键字:<span>{{ query }}</span>没有找到结果,要不换个词再试试?</h1>
</header><!-- .archive-header -->
{% endif %}
</div><!-- #content -->
</div><!-- #primary -->
{% endblock %}
{% block sidebar %}
{% load_sidebar request.user 'i' %}
{% endblock %}

@ -0,0 +1,25 @@
<!DOCTYPE html>
<html lang="en">
<head>
<!-- 设置文档字符编码为UTF-8确保多语言字符正常显示 -->
<meta charset="UTF-8">
<title>记录日期</title>
</head>
<body>
<!-- 创建无序列表,用于展示日期列表 -->
<ul>
<!-- Django模板的for循环遍历results变量中的每个date元素 -->
{% for date in results %}
<li>
<!-- 生成带日期参数的链接:
1. 通过{% url 'owntracks:show_maps' %}反向解析名为'owntracks:show_maps'的URL
2. 在URL后拼接查询参数?date={{ date }},传递当前循环的日期
3. target="_blank"表示点击链接后在新标签页打开
4. 链接文字显示为当前日期{{ date }}
-->
<a href="{% url 'owntracks:show_maps' %}?date={{ date }}" target="_blank">{{ date }}</a>
</li>
{% endfor %}
</ul>
</body>
</html>

@ -0,0 +1,143 @@
<!doctype html>
<head>
<meta charset="utf-8">
<!-- 强制以Chrome内核渲染页面针对IE等浏览器的兼容设置 -->
<meta http-equiv="X-UA-Compatible" content="chrome=1">
<!-- 配置视口初始缩放1.0、禁止用户缩放、宽度适配设备宽度 -->
<meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
<style>
/* 重置html、body和容器的样式宽度高度100%、外边距0 */
html,
body,
#container {
width: 100%;
height: 100%;
margin: 0px;
}
/* 加载提示框样式绝对定位、层级9999、背景红色、白色文字等 */
#loadingTip {
position: absolute;
z-index: 9999;
top: 0;
left: 0;
padding: 3px 10px;
background: red;
color: #fff;
font-size: 14px;
}
</style>
<!-- 页面标题:运动轨迹 -->
<title>运动轨迹</title>
</head>
<body>
<!-- 地图容器 -->
<div id="container"></div>
<!-- 引入高德地图JS API -->
<script type="text/javascript" src='//webapi.amap.com/maps?v=1.4.4&key=9c89950bdfbcecd46f814309384655cd'></script>
<!-- UI组件库 1.0 -->
<script src="//webapi.amap.com/ui/1.0/main.js?v=1.0.11"></script>
<script type="text/javascript">
//创建地图
var map = new AMap.Map('container', {
zoom: 4
});
// 加载路径简化器PathSimplifier和jQuery类库
AMapUI.load(['ui/misc/PathSimplifier', 'lib/$'], function (PathSimplifier, $) {
if (!PathSimplifier.supportCanvas) {
alert('当前环境不支持 Canvas');
return;
}
//just some colors
var colors = [
"#3366cc", "#dc3912", "#ff9900", "#109618", "#990099", "#0099c6", "#dd4477", "#66aa00",
"#b82e2e", "#316395", "#994499", "#22aa99", "#aaaa11", "#6633cc", "#e67300", "#8b0707",
"#651067", "#329262", "#5574a6", "#3b3eac"
];
// 初始化路径简化器实例
var pathSimplifierIns = new PathSimplifier({
zIndex: 100,
//autoSetFitView:false,
map: map, //所属的地图实例
getPath: function (pathData, pathIndex) {
return pathData.path;
},
getHoverTitle: function (pathData, pathIndex, pointIndex) {
if (pointIndex >= 0) {
//point
return pathData.name + ',点:' + pointIndex + '/' + pathData.path.length;
}
// hover 到轨迹线时,显示“名称, 点数量:总点数”
return pathData.name + ',点数量' + pathData.path.length;
},
renderOptions: {
pathLineStyle: {
dirArrowStyle: true
},
// 自定义路径样式(根据缩放级别和索引动态设置颜色、线宽)
getPathStyle: function (pathItem, zoom) {
var color = colors[pathItem.pathIndex % colors.length],
lineWidth = Math.round(4 * Math.pow(1.1, zoom - 3));
return {
pathLineStyle: {
strokeStyle: color,
lineWidth: lineWidth
},
pathLineSelectedStyle: {
lineWidth: lineWidth + 2
},
pathNavigatorStyle: {
fillStyle: color
}
};
}
}
});
// 将路径简化器实例暴露到window方便调试
window.pathSimplifierIns = pathSimplifierIns;
$('<div id="loadingTip">加载数据,请稍候...</div>').appendTo(document.body);
// 从后端接口获取轨迹数据(带日期参数)
$.getJSON('/owntracks/get_datas?date={{ date }}', function (d) {
if (!d || !d.length) {
$("#loadingTip").text("没有数据...")
return;
}
$('#loadingTip').remove();
pathSimplifierIns.setData(d);
//initRoutesContainer(d);
function onload() {
pathSimplifierIns.renderLater();
}
function onerror(e) {
alert('图片加载失败!');
}
// 遍历每条轨迹,创建导航器并启动自动播放
d.forEach(function (item, index) {
var navg1 = pathSimplifierIns.createPathNavigator(index, {
loop: true,
speed: 1000,
});
navg1.start();
})
});
});
</script>
</body>
</html>
Loading…
Cancel
Save