2735 lines
102 KiB
PHP
2735 lines
102 KiB
PHP
<?php
|
||
if (!defined('__TYPECHO_ROOT_DIR__')) exit;
|
||
include 'header.php';
|
||
include 'menu.php';
|
||
include 'common-js.php';
|
||
include 'table-js.php';
|
||
|
||
// 获取插件选项
|
||
$options = Typecho_Widget::widget('Widget_Options');
|
||
$pluginOptions = $options->plugin('MyTrack');
|
||
$webApiKey = isset($pluginOptions->webApiKey) ? $pluginOptions->webApiKey : '';
|
||
|
||
// 检查是否有搜索参数
|
||
$searchKeyword = isset($_GET['search']) ? trim($_GET['search']) : '';
|
||
$searchResults = array();
|
||
$searchPerformed = false;
|
||
$currentPage = isset($_GET['page']) ? intval($_GET['page']) : 1;
|
||
|
||
// 如果有关键词,执行搜索
|
||
if ($searchKeyword) {
|
||
$searchPerformed = true;
|
||
try {
|
||
$db = MyTrack_Plugin::getDbConnection();
|
||
|
||
// 构建SQL查询条件 - 只搜索地名
|
||
$whereConditions = array();
|
||
$params = array();
|
||
|
||
// 仅搜索名称(地名)
|
||
if (!empty($searchKeyword)) {
|
||
$whereConditions[] = "name LIKE ?";
|
||
$searchParam = '%' . $searchKeyword . '%';
|
||
$params = array($searchParam);
|
||
}
|
||
|
||
// 构建完整的WHERE子句
|
||
$whereSql = '';
|
||
if (!empty($whereConditions)) {
|
||
$whereSql = 'WHERE ' . implode(' AND ', $whereConditions);
|
||
}
|
||
|
||
// 获取分页信息
|
||
$pageSize = 10;
|
||
$offset = ($currentPage - 1) * $pageSize;
|
||
|
||
// 获取总记录数
|
||
$countSql = "SELECT COUNT(*) FROM plugin_track_footprint " . $whereSql;
|
||
$countStmt = $db->prepare($countSql);
|
||
$countStmt->execute($params);
|
||
$total = $countStmt->fetchColumn();
|
||
$totalPages = ceil($total / $pageSize);
|
||
|
||
// 获取搜索结果
|
||
$sql = "SELECT * FROM plugin_track_footprint
|
||
$whereSql
|
||
ORDER BY date DESC, created_at DESC
|
||
LIMIT ? OFFSET ?";
|
||
$stmt = $db->prepare($sql);
|
||
$limitParams = array_merge($params, array($pageSize, $offset));
|
||
$stmt->execute($limitParams);
|
||
$searchResults = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||
|
||
} catch (Exception $e) {
|
||
// 搜索出错,不显示结果
|
||
$searchPerformed = false;
|
||
}
|
||
}
|
||
?>
|
||
|
||
<!-- 引入MyTrack插件的CSS和JS -->
|
||
<link rel="stylesheet" href="<?php $options->pluginUrl('MyTrack/assets/admin.css'); ?>">
|
||
|
||
<!-- 添加搜索功能的CSS -->
|
||
<style>
|
||
|
||
.btn-s{border-radius:8px!important;}
|
||
/* 只保留CSS头部,确保不改变原有CSS结构 */
|
||
.dark input[type=text], input[type=url], input[type=password], input[type=email], input[type=number], textarea, .typecho-option select, input[type=text]:disabled, input[type=text]:read-only, input[type=password]:disabled, input[type=password]:read-only, input[type=email]:disabled, input[type=email]:read-only, textarea:disabled, textarea:read-only, select {
|
||
background: #fff!important;
|
||
border: 1px solid #000000;
|
||
outline: none;
|
||
}
|
||
.typecho-list-operate{margin:1em 10px!important;}
|
||
/* 搜索容器样式 */
|
||
.mytrack-search-container {
|
||
margin-bottom: 25px;
|
||
padding: 15px 15px 5px;
|
||
background-color: #f8f9fa;
|
||
border-radius: 8px;
|
||
border: 1px solid #e5e7eb;
|
||
}
|
||
|
||
.mytrack-search-header {
|
||
margin-bottom: 12px;
|
||
}
|
||
|
||
.mytrack-search-header .description {
|
||
color: #6b7280;
|
||
font-size: 13px;
|
||
margin-top: 4px;
|
||
line-height: 1.4;
|
||
}
|
||
|
||
.mytrack-search-box {
|
||
position: relative;
|
||
margin-bottom: 10px;
|
||
}
|
||
|
||
#location-search {
|
||
width: 100%;
|
||
padding: 10px 12px;
|
||
font-size: 14px;
|
||
line-height: 1.5;
|
||
color: #374151;
|
||
background-color: #fff;
|
||
border: 1px solid #d1d5db;
|
||
border-radius: 6px;
|
||
transition: border-color 0.15s ease-in-out;
|
||
}
|
||
|
||
#location-search:focus {
|
||
outline: 0;
|
||
border-color: #3b82f6;
|
||
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
|
||
}
|
||
|
||
.mytrack-search-results {
|
||
position: absolute;
|
||
top: 100%;
|
||
left: 0;
|
||
right: 0;
|
||
z-index: 1000;
|
||
max-height: 320px;
|
||
overflow-y: auto;
|
||
background-color: #fff;
|
||
border: 1px solid #d1d5db;
|
||
border-top: none;
|
||
border-radius: 0 0 6px 6px;
|
||
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
|
||
margin-top: -1px;
|
||
}
|
||
|
||
.mytrack-result-item {
|
||
padding: 10px 12px;
|
||
cursor: pointer;
|
||
border-bottom: 1px solid #f3f4f6;
|
||
transition: background-color 0.15s;
|
||
}
|
||
|
||
.mytrack-result-item:last-child {
|
||
border-bottom: none;
|
||
}
|
||
|
||
.mytrack-result-item:hover,
|
||
.mytrack-result-item.hover {
|
||
background-color: #f3f4f6;
|
||
}
|
||
|
||
.mytrack-result-name {
|
||
font-weight: 600;
|
||
color: #111827;
|
||
margin-bottom: 3px;
|
||
font-size: 14px;
|
||
line-height: 1.3;
|
||
}
|
||
|
||
.mytrack-result-address {
|
||
color: #6b7280;
|
||
font-size: 12px;
|
||
line-height: 1.3;
|
||
margin-bottom: 2px;
|
||
word-break: break-word;
|
||
}
|
||
|
||
.mytrack-result-type {
|
||
color: #3b82f6;
|
||
font-size: 11px;
|
||
font-weight: 500;
|
||
background-color: #eff6ff;
|
||
padding: 2px 6px;
|
||
border-radius: 10px;
|
||
display: inline-block;
|
||
margin-top: 3px;
|
||
}
|
||
|
||
.mytrack-loading,
|
||
.mytrack-no-results {
|
||
padding: 20px 12px;
|
||
text-align: center;
|
||
color: #6b7280;
|
||
font-size: 14px;
|
||
}
|
||
|
||
.mytrack-search-actions {
|
||
text-align: right;
|
||
padding-top: 8px;
|
||
border-top: 1px solid #e5e7eb;
|
||
}
|
||
|
||
.mytrack-search-link {
|
||
color: #3b82f6;
|
||
text-decoration: none;
|
||
font-size: 13px;
|
||
transition: color 0.15s;
|
||
}
|
||
|
||
.mytrack-search-link:hover {
|
||
color: #2563eb;
|
||
text-decoration: underline;
|
||
}
|
||
|
||
/* 适配模态框内样式 */
|
||
.typecho-modal-body .mytrack-search-container {
|
||
margin-left: -24px;
|
||
margin-right: -24px;
|
||
margin-top: -24px;
|
||
border-radius: 0;
|
||
border-left: none;
|
||
border-right: none;
|
||
border-top: none;
|
||
}
|
||
|
||
/* 确保搜索结果框在最上层 */
|
||
.typecho-modal-content {
|
||
z-index: 1001;
|
||
}
|
||
|
||
.mytrack-search-results {
|
||
z-index: 1002;
|
||
}
|
||
|
||
/* 新增字段样式 */
|
||
.mytrack-field-row {
|
||
display: flex;
|
||
gap: 15px;
|
||
margin-bottom: 15px;
|
||
}
|
||
|
||
.mytrack-field-group {
|
||
flex: 1;
|
||
}
|
||
|
||
.mytrack-field-label {
|
||
display: block;
|
||
margin-bottom: 5px;
|
||
font-weight: 500;
|
||
color: #374151;
|
||
font-size: 13px;
|
||
}
|
||
|
||
.mytrack-field-select,
|
||
.mytrack-field-input {
|
||
width: 100%;
|
||
padding: 8px 12px;
|
||
border: 1px solid #d1d5db;
|
||
border-radius: 6px;
|
||
font-size: 14px;
|
||
color: #374151;
|
||
background-color: #fff;
|
||
transition: border-color 0.15s;
|
||
box-sizing: border-box;
|
||
}
|
||
|
||
.mytrack-field-select:focus,
|
||
.mytrack-field-input:focus {
|
||
outline: 0;
|
||
border-color: #3b82f6;
|
||
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
|
||
}
|
||
|
||
.mytrack-review-textarea {
|
||
width: 100%;
|
||
min-height: 80px;
|
||
padding: 8px 12px;
|
||
border: 1px solid #d1d5db;
|
||
border-radius: 6px;
|
||
font-size: 14px;
|
||
color: #374151;
|
||
background-color: #fff;
|
||
transition: border-color 0.15s;
|
||
resize: vertical;
|
||
font-family: inherit;
|
||
box-sizing: border-box;
|
||
}
|
||
|
||
.mytrack-review-textarea:focus {
|
||
outline: 0;
|
||
border-color: #3b82f6;
|
||
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
|
||
}
|
||
|
||
/* 亮点字段样式 */
|
||
.mytrack-highlights-input {
|
||
width: 100%;
|
||
padding: 8px 12px;
|
||
border: 1px solid #d1d5db;
|
||
border-radius: 6px;
|
||
font-size: 14px;
|
||
color: #374151;
|
||
background-color: #fff;
|
||
transition: border-color 0.15s;
|
||
box-sizing: border-box;
|
||
}
|
||
|
||
.mytrack-highlights-input:focus {
|
||
outline: 0;
|
||
border-color: #3b82f6;
|
||
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
|
||
}
|
||
|
||
.mytrack-highlights-note {
|
||
color: #6b7280;
|
||
font-size: 12px;
|
||
margin-top: 4px;
|
||
line-height: 1.4;
|
||
}
|
||
|
||
/* 星级评分样式 */
|
||
.mytrack-rating-stars {
|
||
display: flex;
|
||
gap: 5px;
|
||
margin-top: 5px;
|
||
}
|
||
|
||
.mytrack-star {
|
||
font-size: 20px;
|
||
color: #d1d5db;
|
||
cursor: pointer;
|
||
transition: color 0.2s;
|
||
}
|
||
|
||
.mytrack-star:hover,
|
||
.mytrack-star.selected {
|
||
color: #f59e0b;
|
||
}
|
||
|
||
/* 分类选择器样式 */
|
||
.mytrack-categories-options {
|
||
display: flex;
|
||
gap: 10px;
|
||
margin-top: 5px;
|
||
}
|
||
|
||
.mytrack-categories-option {
|
||
flex: 1;
|
||
text-align: center;
|
||
padding: 8px;
|
||
border: 2px solid #d1d5db;
|
||
border-radius: 6px;
|
||
cursor: pointer;
|
||
background: white;
|
||
font-size: 13px;
|
||
transition: all 0.2s;
|
||
color: #6b7280;
|
||
}
|
||
|
||
.mytrack-categories-option:hover {
|
||
border-color: #9ca3af;
|
||
color: #374151;
|
||
}
|
||
|
||
.mytrack-categories-option.selected {
|
||
border-color: #3b82f6;
|
||
background: #eff6ff;
|
||
color: #1e40af;
|
||
font-weight: 500;
|
||
}
|
||
|
||
.mytrack-categories-option.visited {
|
||
border-color: #10b981;
|
||
}
|
||
|
||
.mytrack-categories-option.visited.selected {
|
||
background: #d1fae5;
|
||
color: #065f46;
|
||
}
|
||
|
||
.mytrack-categories-option.want {
|
||
border-color: #8b5cf6;
|
||
}
|
||
|
||
.mytrack-categories-option.want.selected {
|
||
background: #ede9fe;
|
||
color: #5b21b6;
|
||
}
|
||
|
||
.mytrack-categories-option.plan {
|
||
border-color: #f59e0b;
|
||
}
|
||
|
||
.mytrack-categories-option.plan.selected {
|
||
background: #fef3c7;
|
||
color: #92400e;
|
||
}
|
||
|
||
/* 表格中星级显示样式 */
|
||
.mytrack-rating-display {
|
||
display: flex;
|
||
gap: 2px;
|
||
}
|
||
|
||
.mytrack-rating-star {
|
||
color: #f59e0b;
|
||
font-size: 14px;
|
||
}
|
||
|
||
.mytrack-rating-empty-star {
|
||
color: #d1d5db;
|
||
font-size: 14px;
|
||
}
|
||
|
||
/* 表格中亮点显示样式 */
|
||
.mytrack-highlights-display {
|
||
max-width: 200px;
|
||
overflow: hidden;
|
||
text-overflow: ellipsis;
|
||
white-space: nowrap;
|
||
}
|
||
|
||
.mytrack-highlight-tag {
|
||
display: inline-block;
|
||
background-color: #e8f5e9;
|
||
color: #2e7d32;
|
||
padding: 2px 8px;
|
||
border-radius: 12px;
|
||
font-size: 12px;
|
||
margin-right: 5px;
|
||
margin-bottom: 3px;
|
||
}
|
||
|
||
/* 表格中分类显示样式 */
|
||
.mytrack-categories-badge {
|
||
display: inline-block;
|
||
padding: 2px 8px;
|
||
border-radius: 12px;
|
||
font-size: 12px;
|
||
font-weight: 500;
|
||
line-height: 1.5;
|
||
}
|
||
|
||
.mytrack-categories-visited-badge {
|
||
background-color: #d1fae5;
|
||
color: #065f46;
|
||
border: 1px solid #10b981;
|
||
}
|
||
|
||
.mytrack-categories-want-badge {
|
||
background-color: #ede9fe;
|
||
color: #5b21b6;
|
||
border: 1px solid #8b5cf6;
|
||
}
|
||
|
||
.mytrack-categories-plan-badge {
|
||
background-color: #fef3c7;
|
||
color: #92400e;
|
||
border: 1px solid #f59e0b;
|
||
}
|
||
|
||
/* 操作列样式 */
|
||
.mytrack-actions {
|
||
white-space: nowrap;
|
||
}
|
||
|
||
.mytrack-edit-btn,
|
||
.mytrack-delete-btn {
|
||
color: #3b82f6;
|
||
text-decoration: none;
|
||
margin: 0 5px;
|
||
font-size: 13px;
|
||
cursor: pointer;
|
||
}
|
||
|
||
.mytrack-edit-btn:hover,
|
||
.mytrack-delete-btn:hover {
|
||
text-decoration: underline;
|
||
}
|
||
|
||
.mytrack-delete-btn {
|
||
color: #ef4444;
|
||
}
|
||
|
||
.mytrack-delete-btn:hover {
|
||
color: #dc2626;
|
||
}
|
||
|
||
/* 标记颜色选择器样式 */
|
||
.mytrack-marker-color-options {
|
||
display: flex;
|
||
gap: 10px;
|
||
margin-top: 5px;
|
||
flex-wrap: wrap;
|
||
}
|
||
|
||
.mytrack-marker-color-option {
|
||
width: 30px;
|
||
height: 30px;
|
||
border-radius: 50%;
|
||
cursor: pointer;
|
||
border: 2px solid transparent;
|
||
transition: border-color 0.3s ease, transform 0.3s ease;
|
||
}
|
||
|
||
.mytrack-marker-color-option:hover {
|
||
transform: scale(1.1);
|
||
}
|
||
|
||
.mytrack-marker-color-option.selected {
|
||
border-color: #333;
|
||
transform: scale(1.1);
|
||
}
|
||
|
||
.mytrack-marker-color-sunset { background: linear-gradient(135deg, rgb(255, 179, 71), rgb(255, 111, 97)); }
|
||
.mytrack-marker-color-ocean { background: linear-gradient(135deg, rgb(6, 190, 182), rgb(72, 177, 191)); }
|
||
.mytrack-marker-color-forest { background: linear-gradient(135deg, rgb(94, 231, 223), rgb(57, 163, 124)); }
|
||
.mytrack-marker-color-amber { background: linear-gradient(135deg, rgb(246, 211, 101), rgb(253, 160, 133)); }
|
||
.mytrack-marker-color-violet { background: linear-gradient(135deg, rgb(161, 140, 209), rgb(251, 194, 235)); }
|
||
.mytrack-marker-color-citrus { background: linear-gradient(135deg, rgb(253, 251, 143), rgb(161, 255, 206)); }
|
||
|
||
/* 表格中标记颜色显示样式 - 只显示颜色圆点,不显示文字 */
|
||
.mytrack-marker-color-display {
|
||
width: 20px;
|
||
height: 20px;
|
||
border-radius: 50%;
|
||
display: inline-block;
|
||
vertical-align: middle;
|
||
border: 2px solid #fff;
|
||
box-shadow: 0 2px 5px rgba(0,0,0,0.3);
|
||
}
|
||
|
||
.mytrack-marker-color-display-sunset { background: linear-gradient(135deg, rgb(255, 179, 71), rgb(255, 111, 97)); }
|
||
.mytrack-marker-color-display-ocean { background: linear-gradient(135deg, rgb(6, 190, 182), rgb(72, 177, 191)); }
|
||
.mytrack-marker-color-display-forest { background: linear-gradient(135deg, rgb(94, 231, 223), rgb(57, 163, 124)); }
|
||
.mytrack-marker-color-display-amber { background: linear-gradient(135deg, rgb(246, 211, 101), rgb(253, 160, 133)); }
|
||
.mytrack-marker-color-display-violet { background: linear-gradient(135deg, rgb(161, 140, 209), rgb(251, 194, 235)); }
|
||
.mytrack-marker-color-display-citrus { background: linear-gradient(135deg, rgb(253, 251, 143), rgb(161, 255, 206)); }
|
||
|
||
/* 标记颜色单元格样式 - 居中显示 */
|
||
td .mytrack-marker-color-display {
|
||
margin: 0 auto;
|
||
display: block;
|
||
}
|
||
|
||
/* 关联文章样式 */
|
||
.mytrack-related-articles-container {
|
||
margin-top: 15px;
|
||
padding: 15px;
|
||
background-color: #f8f9fa;
|
||
border-radius: 6px;
|
||
border: 1px solid #e5e7eb;
|
||
}
|
||
|
||
.mytrack-related-articles-list {
|
||
max-height: 200px;
|
||
overflow-y: auto;
|
||
margin-top: 10px;
|
||
padding: 10px;
|
||
background-color: white;
|
||
border-radius: 4px;
|
||
border: 1px solid #e5e7eb;
|
||
}
|
||
|
||
.mytrack-related-article-item {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
padding: 8px 10px;
|
||
border-bottom: 1px solid #f3f4f6;
|
||
}
|
||
|
||
.mytrack-related-article-item:last-child {
|
||
border-bottom: none;
|
||
}
|
||
|
||
.mytrack-related-article-info {
|
||
flex: 1;
|
||
}
|
||
|
||
.mytrack-related-article-title {
|
||
font-weight: 500;
|
||
color: #374151;
|
||
margin-bottom: 2px;
|
||
font-size: 14px;
|
||
}
|
||
|
||
.mytrack-related-article-cid {
|
||
color: #6b7280;
|
||
font-size: 12px;
|
||
}
|
||
|
||
.mytrack-related-article-actions {
|
||
display: flex;
|
||
gap: 5px;
|
||
}
|
||
|
||
.mytrack-remove-related-article {
|
||
color: #ef4444;
|
||
background: none;
|
||
border: none;
|
||
cursor: pointer;
|
||
font-size: 12px;
|
||
padding: 2px 6px;
|
||
border-radius: 4px;
|
||
transition: background-color 0.2s;
|
||
text-decoration: none;
|
||
}
|
||
|
||
.mytrack-remove-related-article:hover {
|
||
background-color: #fee2e2;
|
||
text-decoration: none;
|
||
}
|
||
|
||
.mytrack-add-related-article {
|
||
display: flex;
|
||
gap: 10px;
|
||
margin-top: 10px;
|
||
}
|
||
|
||
/* 表格中关联文章显示样式 */
|
||
.mytrack-related-articles-display {
|
||
max-width: 150px;
|
||
overflow: hidden;
|
||
text-overflow: ellipsis;
|
||
white-space: nowrap;
|
||
}
|
||
|
||
.mytrack-related-article-link {
|
||
color: #3b82f6;
|
||
text-decoration: none;
|
||
margin-right: 5px;
|
||
font-size: 12px;
|
||
cursor: pointer;
|
||
position: relative;
|
||
}
|
||
|
||
.mytrack-related-article-link:hover {
|
||
text-decoration: underline;
|
||
}
|
||
|
||
.mytrack-related-article-tooltip {
|
||
position: absolute;
|
||
bottom: 100%;
|
||
left: 50%;
|
||
transform: translateX(-50%);
|
||
background-color: #333;
|
||
color: white;
|
||
padding: 8px 12px;
|
||
border-radius: 4px;
|
||
font-size: 12px;
|
||
white-space: nowrap;
|
||
z-index: 1000;
|
||
display: none;
|
||
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
|
||
}
|
||
|
||
.mytrack-related-article-link:hover .mytrack-related-article-tooltip {
|
||
display: block;
|
||
}
|
||
|
||
.mytrack-related-article-tooltip::after {
|
||
content: '';
|
||
position: absolute;
|
||
top: 100%;
|
||
left: 50%;
|
||
transform: translateX(-50%);
|
||
border-width: 5px;
|
||
border-style: solid;
|
||
border-color: #333 transparent transparent transparent;
|
||
}
|
||
|
||
/* 管理页面搜索框样式 - 已完善 */
|
||
.mytrack-management-search {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
margin-left: 150px;
|
||
vertical-align: middle;
|
||
position: relative;
|
||
border-radius: 6px;
|
||
height: 32px;
|
||
}
|
||
|
||
.mytrack-management-search form {
|
||
display: flex;
|
||
align-items: center;
|
||
margin: 0;
|
||
width: 100%;
|
||
}
|
||
|
||
.mytrack-management-search input {
|
||
padding: 6px 12px;
|
||
border: none;
|
||
border-radius: 6px 0 0 6px;
|
||
font-size: 13px;
|
||
width: 180px;
|
||
transition: all 0.2s;
|
||
background: #cecece;
|
||
height: 30px;
|
||
line-height: 30px;
|
||
outline: none;
|
||
color: #666;
|
||
}
|
||
|
||
.dark .mytrack-management-search input {
|
||
background: #cecece!important; color: #666;
|
||
}
|
||
|
||
.mytrack-management-search input:focus {
|
||
outline: none;
|
||
box-shadow: none;
|
||
}
|
||
|
||
.mytrack-management-search-btn {
|
||
padding: 0 12px;
|
||
background-color: #2d578a;
|
||
color: #cecece;
|
||
border: none;
|
||
border-radius: 0 6px 6px 0;
|
||
font-size: 13px;
|
||
cursor: pointer;
|
||
transition: background-color 0.2s;
|
||
height: 30px;
|
||
line-height: 30px;
|
||
margin: 0;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
border-left: 1px solid rgba(255, 255, 255, 0.1);
|
||
}
|
||
|
||
.mytrack-management-search-btn:hover {
|
||
background-color: #02308c;
|
||
}
|
||
|
||
.mytrack-management-search-clear {
|
||
padding: 0 12px;
|
||
background-color: #6b7280;
|
||
color: white;
|
||
border: none;
|
||
border-radius: 0 6px 6px 0;
|
||
font-size: 13px;
|
||
cursor: pointer;
|
||
transition: background-color 0.2s;
|
||
height: 30px;
|
||
line-height: 30px;
|
||
margin: 0;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
text-decoration: none;
|
||
margin-left: 1px;
|
||
}
|
||
|
||
.mytrack-management-search-clear:hover {
|
||
background-color: #4b5563;
|
||
text-decoration: none;
|
||
color: white;
|
||
}
|
||
|
||
.mytrack-management-search.with-clear .mytrack-management-search-btn {
|
||
border-radius: 0;
|
||
}
|
||
|
||
.mytrack-management-search.with-clear .mytrack-management-search-clear {
|
||
border-radius: 0 6px 6px 0;
|
||
}
|
||
|
||
/* 搜索结果提示样式 */
|
||
.mytrack-search-result-info {
|
||
background-color: #f0f9ff;
|
||
border: 1px solid #bae6fd;
|
||
border-radius: 6px;
|
||
padding: 12px 16px;
|
||
margin-bottom: 15px;
|
||
display: flex;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
}
|
||
|
||
.mytrack-search-result-info p {
|
||
margin: 0;
|
||
color: #0369a1;
|
||
font-size: 14px;
|
||
}
|
||
|
||
.mytrack-search-result-info a {
|
||
color: #3b82f6;
|
||
text-decoration: none;
|
||
font-size: 13px;
|
||
}
|
||
|
||
.mytrack-search-result-info a:hover {
|
||
text-decoration: underline;
|
||
}
|
||
|
||
/* 搜索结果建议框 */
|
||
#mytrack-suggestions {
|
||
position: absolute;
|
||
top: 100%;
|
||
left: 0;
|
||
right: 0;
|
||
z-index: 1000;
|
||
max-height: 300px;
|
||
overflow-y: auto;
|
||
background-color: #fff;
|
||
border: 1px solid #d1d5db;
|
||
border-top: none;
|
||
border-radius: 0 0 6px 6px;
|
||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
|
||
margin-top: -1px;
|
||
}
|
||
|
||
.mytrack-suggestion-item {
|
||
padding: 10px 12px;
|
||
cursor: pointer;
|
||
border-bottom: 1px solid #f3f4f6;
|
||
transition: background-color 0.15s;
|
||
}
|
||
|
||
.mytrack-suggestion-item:last-child {
|
||
border-bottom: none;
|
||
}
|
||
|
||
.mytrack-suggestion-item:hover,
|
||
.mytrack-suggestion-item.hover {
|
||
background-color: #f3f4f6;
|
||
}
|
||
|
||
.mytrack-suggestion-name {
|
||
font-weight: 500;
|
||
color: #374151;
|
||
margin-bottom: 2px;
|
||
font-size: 13px;
|
||
}
|
||
|
||
/* 高亮文本 */
|
||
mark {
|
||
background-color: #fef3c7;
|
||
color: #92400e;
|
||
padding: 0 2px;
|
||
border-radius: 2px;
|
||
}
|
||
.typecho-table-wrap{padding:30px 0px!important;}
|
||
.typecho-pager{float:none!important;}
|
||
</style>
|
||
|
||
<script>
|
||
// 设置插件配置
|
||
var MyTrackConfig = {
|
||
actionUrl: '<?php $options->index("/action/track"); ?>',
|
||
webApiKey: '<?php echo $webApiKey; ?>'
|
||
};
|
||
</script>
|
||
|
||
<div class="main">
|
||
<div class="body container">
|
||
<!--<?php include 'page-title.php'; ?>-->
|
||
<div class="row typecho-page-main" role="main">
|
||
<div class="col-mb-12 typecho-list">
|
||
<div class="typecho-list-operate clearfix">
|
||
<form method="get">
|
||
<div class="operate">
|
||
<label><i class="sr-only"><?php _e('全选'); ?></i><input type="checkbox" class="typecho-table-select-all"/></label>
|
||
<div class="btn-group btn-drop">
|
||
<button class="btn dropdown-toggle btn-s" type="button"><i
|
||
class="sr-only"><?php _e('操作'); ?></i><?php _e('选中项'); ?> <i
|
||
class="i-caret-down"></i></button>
|
||
<ul class="dropdown-menu">
|
||
<li>
|
||
<a href="#" id="batch-delete-btn"><?php _e('删除'); ?></a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</form>
|
||
|
||
<!-- 管理页面搜索框 - 居中在批量删除和精简导出之间 -->
|
||
<div class="mytrack-management-search <?php echo $searchKeyword ? 'with-clear' : ''; ?>">
|
||
<form method="get" action="" style="display: flex; align-items: center; width: 100%;">
|
||
<input type="text" name="search" id="management-search"
|
||
placeholder="<?php _e('搜索地名...'); ?>"
|
||
value="<?php echo htmlspecialchars($searchKeyword); ?>"
|
||
autocomplete="off">
|
||
<input type="hidden" name="panel" value="MyTrack/Manage.php">
|
||
<button type="submit" class="mytrack-management-search-btn"><?php _e('搜索'); ?></button>
|
||
<?php if ($searchKeyword): ?>
|
||
<a href="<?php echo \Typecho\Common::url('extending.php?panel=MyTrack/Manage.php', $options->adminUrl); ?>"
|
||
class="mytrack-management-search-clear"><?php _e('清除'); ?></a>
|
||
<?php endif; ?>
|
||
</form>
|
||
</div>
|
||
|
||
<a class="btn primary btn-s btn-operate" style="float: right;line-height: 28px;" href="#" id="add-footprint-btn"><?php _e('新增地点'); ?></a>
|
||
<a class="btn primary btn-s btn-operate" style="float: right;line-height: 28px;margin-right: 10px;" href="#" id="import-footprint-btn"><?php _e('导入数据'); ?></a>
|
||
<a class="btn btn-s btn-operate" style="float: right;line-height: 28px;margin-right: 10px;" href="#" id="export-json-btn"><?php _e('导出数据'); ?></a>
|
||
<a class="btn btn-s btn-operate" style="float: right;line-height: 28px;margin-right: 10px;" href="#" id="export-simple-btn"><?php _e('精简导出'); ?></a>
|
||
</div><!-- end .typecho-list-operate -->
|
||
|
||
<?php if ($searchPerformed && $searchKeyword): ?>
|
||
<div class="mytrack-search-result-info">
|
||
<p><?php _e('搜索关键词:'); ?><strong>"<?php echo htmlspecialchars($searchKeyword); ?>"</strong> |
|
||
<?php _e('找到'); ?> <strong><?php echo isset($total) ? $total : 0; ?></strong> <?php _e('条记录'); ?></p>
|
||
<a href="<?php echo \Typecho\Common::url('extending.php?panel=MyTrack/Manage.php', $options->adminUrl); ?>">
|
||
<?php _e('返回全部列表'); ?>
|
||
</a>
|
||
</div>
|
||
<?php endif; ?>
|
||
|
||
<form method="post" name="manage_footprints" class="operate-form">
|
||
<div class="typecho-table-wrap">
|
||
<table class="typecho-list-table">
|
||
<colgroup>
|
||
<col width="3%" class="kit-hidden-mb"/>
|
||
<col width="5%"/>
|
||
<col width="15%"/>
|
||
<col width="20%"/>
|
||
<col width="8%"/>
|
||
<col width="8%"/>
|
||
<col width="8%"/>
|
||
<col width="8%"/>
|
||
<col width="12%"/>
|
||
<col width="15%"/>
|
||
<col width="10%"/>
|
||
</colgroup>
|
||
<thead>
|
||
<tr>
|
||
<th class="kit-hidden-mb"></th>
|
||
<th><?php _e('ID'); ?></th>
|
||
<th><?php _e('地名'); ?></th>
|
||
<th><?php _e('详细地址'); ?></th>
|
||
<th><?php _e('类型'); ?></th>
|
||
<th><?php _e('分类'); ?></th>
|
||
<th><?php _e('推荐星级'); ?></th>
|
||
<th><?php _e('标记'); ?></th>
|
||
<th><?php _e('亮点'); ?></th>
|
||
<th><?php _e('关联文章'); ?></th>
|
||
<th><?php _e('操作'); ?></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody id="footprint-list">
|
||
<?php
|
||
try {
|
||
$db = MyTrack_Plugin::getDbConnection();
|
||
|
||
// 使用搜索结果或全部数据
|
||
if ($searchPerformed && !empty($searchResults)) {
|
||
$footprints = $searchResults;
|
||
} else {
|
||
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
|
||
$pageSize = 10;
|
||
$offset = ($page - 1) * $pageSize;
|
||
|
||
$countStmt = $db->query("SELECT COUNT(*) FROM plugin_track_footprint");
|
||
$total = $countStmt->fetchColumn();
|
||
$totalPages = ceil($total / $pageSize);
|
||
|
||
$stmt = $db->prepare("SELECT * FROM plugin_track_footprint
|
||
ORDER BY date DESC, created_at DESC
|
||
LIMIT ? OFFSET ?");
|
||
$stmt->execute(array($pageSize, $offset));
|
||
$footprints = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||
}
|
||
|
||
if (empty($footprints)) {
|
||
if ($searchPerformed && $searchKeyword) {
|
||
echo '<tr><td colspan="11" style="text-align: center;"><h6 class="typecho-list-table-title">' . sprintf(_t('没有找到与"%s"相关的足迹'), htmlspecialchars($searchKeyword)) . '</h6></td></tr>';
|
||
} else {
|
||
echo '<tr><td colspan="11" style="text-align: center;"><h6 class="typecho-list-table-title">' . _t('没有任何足迹') . '</h6></td></tr>';
|
||
}
|
||
} else {
|
||
foreach ($footprints as $footprint) {
|
||
echo '<tr id="footprint-' . $footprint['id'] . '">';
|
||
echo '<td class="kit-hidden-mb"><input type="checkbox" value="' . $footprint['id'] . '" name="footprint[]"/></td>';
|
||
echo '<td>' . $footprint['id'] . '</td>';
|
||
echo '<td>' . ($footprint['name'] ?: '-') . '</td>';
|
||
echo '<td>' . ($footprint['address'] ?: '-') . '</td>';
|
||
echo '<td>' . ($footprint['location_type'] ?: '-') . '</td>';
|
||
|
||
echo '<td>';
|
||
if ($footprint['categories']) {
|
||
$categories = explode(',', $footprint['categories']);
|
||
foreach ($categories as $category) {
|
||
$category = trim($category);
|
||
$badgeClass = '';
|
||
$categoryText = '';
|
||
|
||
switch($category) {
|
||
case 'visited':
|
||
$badgeClass = 'mytrack-categories-visited-badge';
|
||
$categoryText = '去过';
|
||
break;
|
||
case 'want':
|
||
$badgeClass = 'mytrack-categories-want-badge';
|
||
$categoryText = '想去';
|
||
break;
|
||
case 'plan':
|
||
$badgeClass = 'mytrack-categories-plan-badge';
|
||
$categoryText = '计划';
|
||
break;
|
||
default:
|
||
$badgeClass = 'mytrack-categories-badge';
|
||
$categoryText = $category;
|
||
}
|
||
echo '<span class="mytrack-categories-badge ' . $badgeClass . '" style="margin: 2px;">' . $categoryText . '</span>';
|
||
}
|
||
} else {
|
||
echo '-';
|
||
}
|
||
echo '</td>';
|
||
|
||
echo '<td>';
|
||
if ($footprint['rating_level'] && $footprint['rating_level'] > 0) {
|
||
echo '<div class="mytrack-rating-display">';
|
||
for ($i = 1; $i <= 5; $i++) {
|
||
if ($i <= $footprint['rating_level']) {
|
||
echo '<span class="mytrack-rating-star">★</span>';
|
||
} else {
|
||
echo '<span class="mytrack-rating-empty-star">☆</span>';
|
||
}
|
||
}
|
||
echo '</div>';
|
||
} else {
|
||
echo '-';
|
||
}
|
||
echo '</td>';
|
||
|
||
echo '<td style="text-align: center;">';
|
||
if ($footprint['markerColor']) {
|
||
$colorDisplayClass = 'mytrack-marker-color-display-' . $footprint['markerColor'];
|
||
echo '<span class="mytrack-marker-color-display ' . $colorDisplayClass . '" title="' . $footprint['markerColor'] . '"></span>';
|
||
} else {
|
||
echo '-';
|
||
}
|
||
echo '</td>';
|
||
|
||
echo '<td class="mytrack-highlights-display">';
|
||
if (!empty($footprint['highlights'])) {
|
||
$highlights = explode(',', $footprint['highlights']);
|
||
$displayCount = 0;
|
||
foreach ($highlights as $highlight) {
|
||
$highlight = trim($highlight);
|
||
if ($highlight) {
|
||
echo '<span class="mytrack-highlight-tag">' . htmlspecialchars($highlight) . '</span>';
|
||
$displayCount++;
|
||
if ($displayCount >= 3) {
|
||
echo '...';
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
} else {
|
||
echo '-';
|
||
}
|
||
echo '</td>';
|
||
|
||
// 关联文章列表显示
|
||
echo '<td class="mytrack-related-articles-display">';
|
||
if (!empty($footprint['related_articles'])) {
|
||
$relatedArticles = explode(',', $footprint['related_articles']);
|
||
$relatedArticlesInfo = MyTrack_Plugin::getRelatedArticlesInfo($footprint['related_articles']);
|
||
|
||
foreach ($relatedArticles as $index => $articleCid) {
|
||
$articleCid = trim($articleCid);
|
||
if (!empty($articleCid)) {
|
||
$articleTitle = '';
|
||
$articleLink = '';
|
||
|
||
if (isset($relatedArticlesInfo[$articleCid])) {
|
||
$articleTitle = $relatedArticlesInfo[$articleCid]['title'];
|
||
$articleLink = $relatedArticlesInfo[$articleCid]['link'];
|
||
}
|
||
|
||
if ($articleLink) {
|
||
echo '<a href="' . $articleLink . '" target="_blank" class="mytrack-related-article-link" title="' . $articleTitle . '">' . $articleCid . '</a>';
|
||
if ($index < count($relatedArticles) - 1) {
|
||
echo ', ';
|
||
}
|
||
} else {
|
||
echo '<span title="文章不存在">' . $articleCid . '</span>';
|
||
if ($index < count($relatedArticles) - 1) {
|
||
echo ', ';
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} else {
|
||
echo '-';
|
||
}
|
||
echo '</td>';
|
||
|
||
echo '<td class="mytrack-actions">';
|
||
echo '<a href="#" class="mytrack-edit-btn edit-footprint" data-id="' . $footprint['id'] . '">' . _t('编辑') . '</a>';
|
||
echo '<span></span>';
|
||
echo '<a href="#" class="mytrack-delete-btn delete-footprint" data-id="' . $footprint['id'] . '">' . _t('删除') . '</a>';
|
||
echo '</td>';
|
||
|
||
echo '</tr>';
|
||
}
|
||
}
|
||
} catch (PDOException $e) {
|
||
echo '<tr><td colspan="11" style="text-align: center;"><h6 class="typecho-list-table-title">' . _t('加载数据失败: ') . $e->getMessage() . '</h6></td></tr>';
|
||
}
|
||
?>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</form><!-- end .operate-form -->
|
||
|
||
<div class="typecho-list-operate clearfix">
|
||
<ul class="typecho-pager">
|
||
<?php
|
||
if (isset($totalPages) && $totalPages > 1) {
|
||
$currentPage = $currentPage;
|
||
$adminUrl = $options->adminUrl;
|
||
|
||
echo '<li>';
|
||
if ($currentPage > 1) {
|
||
$prevUrl = \Typecho\Common::url('extending.php?panel=MyTrack/Manage.php&page=' . ($currentPage - 1), $adminUrl);
|
||
if ($searchKeyword) {
|
||
$prevUrl .= '&search=' . urlencode($searchKeyword);
|
||
}
|
||
echo '<a href="' . $prevUrl . '">' . _t('上一页') . '</a>';
|
||
} else {
|
||
echo '<span class="current">' . _t('上一页') . '</span>';
|
||
}
|
||
echo '</li>';
|
||
|
||
for ($i = 1; $i <= $totalPages; $i++) {
|
||
echo '<li>';
|
||
if ($i === $currentPage) {
|
||
echo '<span class="current">' . $i . '</span>';
|
||
} else {
|
||
$pageUrl = \Typecho\Common::url('extending.php?panel=MyTrack/Manage.php&page=' . $i, $adminUrl);
|
||
if ($searchKeyword) {
|
||
$pageUrl .= '&search=' . urlencode($searchKeyword);
|
||
}
|
||
echo '<a href="' . $pageUrl . '">' . $i . '</a>';
|
||
}
|
||
echo '</li>';
|
||
}
|
||
|
||
echo '<li>';
|
||
if ($currentPage < $totalPages) {
|
||
$nextUrl = \Typecho\Common::url('extending.php?panel=MyTrack/Manage.php&page=' . ($currentPage + 1), $adminUrl);
|
||
if ($searchKeyword) {
|
||
$nextUrl .= '&search=' . urlencode($searchKeyword);
|
||
}
|
||
echo '<a href="' . $nextUrl . '">' . _t('下一页') . '</a>';
|
||
} else {
|
||
echo '<span class="current">' . _t('下一页') . '</span>';
|
||
}
|
||
echo '</li>';
|
||
}
|
||
?>
|
||
</ul>
|
||
</div>
|
||
</div><!-- end .typecho-list -->
|
||
</div><!-- end .typecho-page-main -->
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 添加/编辑足迹模态框 -->
|
||
<div id="footprint-modal" class="typecho-modal" style="display: none;">
|
||
<div class="typecho-modal-content">
|
||
<div class="typecho-modal-title">
|
||
<span id="modal-title"><?php _e('新增地点'); ?></span>
|
||
<button type="button" class="typecho-modal-close">×</button>
|
||
</div>
|
||
<div class="typecho-modal-body">
|
||
<div class="mytrack-search-container">
|
||
<div class="mytrack-search-header">
|
||
<p class="description"><?php _e('已接入高德地图API,输入关键词实时联想搜索,下拉菜单选择地点后自动填充信息,当然你也可以通过右侧链接跳转高德地图复制粘贴经纬度填写,'); ?><a href="https://lbs.amap.com/tools/picker" target="_blank" class="mytrack-search-link">
|
||
<?php _e('高德地图经纬度选择工具'); ?>
|
||
</a></p>
|
||
</div>
|
||
<div class="mytrack-search-box">
|
||
<input type="text" id="location-search"
|
||
placeholder="<?php _e('输入地点关键词,如:北京市天安门广场'); ?>"
|
||
class="text" autocomplete="off">
|
||
<div id="search-results" class="mytrack-search-results" style="display: none;"></div>
|
||
</div>
|
||
</div>
|
||
|
||
<form id="footprint-form" method="post" style="margin-top: 20px;">
|
||
<ul>
|
||
<li>
|
||
<label class="typecho-label" for="longitude"><?php _e('地点经度'); ?> <em style="color: red;">*</em></label>
|
||
<input placeholder="例如:116.4074" type="text" id="longitude" name="longitude" class="text" required />
|
||
</li>
|
||
<li>
|
||
<label class="typecho-label" for="latitude"><?php _e('地点纬度'); ?> <em style="color: red;">*</em></label>
|
||
<input placeholder="例如:39.9042" type="text" id="latitude" name="latitude" class="text" required />
|
||
</li>
|
||
<li>
|
||
<label class="typecho-label" for="name"><?php _e('地点名称'); ?> <em style="color: red;">*</em></label>
|
||
<input placeholder="例如:天安门广场" type="text" id="name" name="name" class="text" required />
|
||
</li>
|
||
<li>
|
||
<label class="typecho-label" for="address"><?php _e('详细地址'); ?></label>
|
||
<input placeholder="例如:北京市东城区天安门广场" type="text" id="address" name="address" class="text" />
|
||
</li>
|
||
|
||
<!--<li>
|
||
<label class="typecho-label" for="date"><?php _e('日期'); ?></label>
|
||
<input placeholder="例如:2025-10-27" type="date" id="date" name="date" class="text" />
|
||
</li>-->
|
||
|
||
<div class="mytrack-field-row">
|
||
<div class="mytrack-field-group">
|
||
<label class="mytrack-field-label" for="location_type"><?php _e('地点类型'); ?></label>
|
||
<input type="text" id="location_type" name="location_type" class="mytrack-field-input" placeholder="<?php _e('例如:景点、餐厅、酒店'); ?>" />
|
||
</div>
|
||
<div class="mytrack-field-group">
|
||
<label class="mytrack-field-label"><?php _e('推荐星级'); ?></label>
|
||
<div class="mytrack-rating-stars" id="rating-stars">
|
||
<span class="mytrack-star" data-value="1">☆</span>
|
||
<span class="mytrack-star" data-value="2">☆</span>
|
||
<span class="mytrack-star" data-value="3">☆</span>
|
||
<span class="mytrack-star" data-value="4">☆</span>
|
||
<span class="mytrack-star" data-value="5">☆</span>
|
||
</div>
|
||
<input type="hidden" id="rating_level" name="rating_level" value="0" />
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mytrack-field-row">
|
||
<div class="mytrack-field-group">
|
||
<label class="mytrack-field-label"><?php _e('状态分类'); ?></label>
|
||
<div class="mytrack-categories-options">
|
||
<button type="button" class="mytrack-categories-option visited" data-value="visited">
|
||
✓ <?php _e('去过'); ?>
|
||
</button>
|
||
<button type="button" class="mytrack-categories-option want" data-value="want">
|
||
❤ <?php _e('想去'); ?>
|
||
</button>
|
||
<button type="button" class="mytrack-categories-option plan" data-value="plan">
|
||
📅 <?php _e('计划'); ?>
|
||
</button>
|
||
</div>
|
||
<input type="hidden" id="categories" name="categories" value="" />
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mytrack-field-row">
|
||
<div class="mytrack-field-group">
|
||
<label class="mytrack-field-label"><?php _e('标记颜色'); ?></label>
|
||
<div class="mytrack-marker-color-options" id="marker-color-options">
|
||
<div class="mytrack-marker-color-option mytrack-marker-color-sunset" data-value="sunset" title="Sunset"></div>
|
||
<div class="mytrack-marker-color-option mytrack-marker-color-ocean" data-value="ocean" title="Ocean"></div>
|
||
<div class="mytrack-marker-color-option mytrack-marker-color-forest" data-value="forest" title="Forest"></div>
|
||
<div class="mytrack-marker-color-option mytrack-marker-color-amber" data-value="amber" title="Amber"></div>
|
||
<div class="mytrack-marker-color-option mytrack-marker-color-violet" data-value="violet" title="Violet"></div>
|
||
<div class="mytrack-marker-color-option mytrack-marker-color-citrus" data-value="citrus" title="Citrus"></div>
|
||
</div>
|
||
<input type="hidden" id="markerColor" name="markerColor" value="" />
|
||
</div>
|
||
</div>
|
||
|
||
<li>
|
||
<label class="typecho-label" for="highlights"><?php _e('亮点'); ?></label>
|
||
<input placeholder="<?php _e('例如:夜景好看,适合拍照,交通便利'); ?>"
|
||
type="text"
|
||
id="highlights"
|
||
name="highlights"
|
||
class="mytrack-highlights-input" />
|
||
<p class="mytrack-highlights-note"><?php _e('多个亮点用逗号分隔,例如:夜景好看,适合拍照,交通便利'); ?></p>
|
||
</li>
|
||
|
||
<li>
|
||
<label class="typecho-label" for="review"><?php _e('我的评价'); ?></label>
|
||
<textarea id="review" name="review" rows="3" class="mytrack-review-textarea" placeholder="<?php _e('写下您的评价...'); ?>"></textarea>
|
||
</li>
|
||
|
||
<!-- <li>
|
||
<label class="typecho-label" for="description"><?php _e('地点描述'); ?></label>
|
||
<textarea id="description" name="description" rows="3" class="mytrack-review-textarea" placeholder="<?php _e('地点描述信息...'); ?>"></textarea>
|
||
</li>-->
|
||
|
||
<!--<li>
|
||
<label class="typecho-label" for="tags"><?php _e('标签'); ?></label>
|
||
<input placeholder="<?php _e('例如:景点,文化,历史'); ?>"
|
||
type="text"
|
||
id="tags"
|
||
name="tags"
|
||
class="text" />
|
||
</li>-->
|
||
|
||
<!--<li>
|
||
<label class="typecho-label" for="article_cid"><?php _e('关联文章ID'); ?></label>
|
||
<input placeholder="<?php _e('关联文章的CID'); ?>"
|
||
type="text"
|
||
id="article_cid"
|
||
name="article_cid"
|
||
class="text" />
|
||
</li>-->
|
||
|
||
<!--<li>
|
||
<label class="typecho-label" for="photos"><?php _e('图片链接'); ?></label>
|
||
<input placeholder="<?php _e('多个图片链接用逗号分隔'); ?>"
|
||
type="text"
|
||
id="photos"
|
||
name="photos"
|
||
class="text" />
|
||
</li>-->
|
||
|
||
<!--<li>
|
||
<label class="typecho-label" for="urlLabel"><?php _e('链接标签'); ?></label>
|
||
<input placeholder="<?php _e('例如:查看详情'); ?>"
|
||
type="text"
|
||
id="urlLabel"
|
||
name="urlLabel"
|
||
class="text" />
|
||
</li>-->
|
||
|
||
<!--<li>
|
||
<label class="typecho-label" for="url"><?php _e('链接地址'); ?></label>
|
||
<input placeholder="<?php _e('例如:https://example.com'); ?>"
|
||
type="text"
|
||
id="url"
|
||
name="url"
|
||
class="text" />
|
||
</li>-->
|
||
|
||
<!-- 关联文章管理 -->
|
||
<div class="mytrack-related-articles-container">
|
||
<label class="typecho-label"><?php _e('关联文章'); ?></label>
|
||
<p class="description"><?php _e('多个文章ID用逗号分隔,如:1,2,3'); ?></p>
|
||
|
||
<div class="mytrack-add-related-article">
|
||
<input type="text" id="related-articles-input"
|
||
placeholder="<?php _e('输入文章CID,多个用逗号分隔'); ?>"
|
||
class="text" style="flex: 1;" />
|
||
<button type="button" id="save-related-articles-btn" class="btn btn-s primary"><?php _e('保存'); ?></button>
|
||
</div>
|
||
|
||
<div class="mytrack-related-articles-list" id="related-articles-list">
|
||
<!-- 关联文章列表将动态生成在这里 -->
|
||
</div>
|
||
|
||
<input type="hidden" id="related_articles" name="related_articles" value="" />
|
||
</div>
|
||
</ul>
|
||
<input type="hidden" id="footprint-id" name="id" value="" />
|
||
</form>
|
||
</div>
|
||
<div class="typecho-modal-foot">
|
||
<!--<button type="button" id="fetch-images-btn" class="btn"><?php _e('获取文章内容'); ?></button>-->
|
||
<button type="button" id="save-footprint-btn" class="btn primary"><?php _e('保存'); ?></button>
|
||
<button type="button" class="btn typecho-modal-btn"><?php _e('取消'); ?></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 导入足迹模态框 -->
|
||
<div id="import-modal" class="typecho-modal" style="display: none;">
|
||
<div class="typecho-modal-content">
|
||
<div class="typecho-modal-title">
|
||
<span><?php _e('导入足迹'); ?></span>
|
||
<button type="button" class="typecho-modal-close">×</button>
|
||
</div>
|
||
<div class="typecho-modal-body">
|
||
<form id="import-form" method="post" enctype="multipart/form-data">
|
||
<ul>
|
||
<li>
|
||
<label class="typecho-label" for="import-file"><?php _e('选择文件'); ?> <em style="color: red;">*</em></label>
|
||
<input type="file" id="import-file" name="file" class="text" accept=".json" required />
|
||
<p class="description"><?php _e('支持JSON格式文件'); ?></p>
|
||
</li>
|
||
<li>
|
||
<h4><?php _e('JSON格式示例:'); ?></h4>
|
||
<pre>[
|
||
{
|
||
"latitude": 39.9042,
|
||
"longitude": 116.4074,
|
||
"name": "天安门广场",
|
||
"address": "北京市东城区天安门广场",
|
||
"location_type": "景点",
|
||
"rating_level": 5,
|
||
"categories": "visited",
|
||
"review": "非常值得一去的景点",
|
||
"description": "北京天安门",
|
||
"article_cid": 1,
|
||
"urlLabel": "天安门游记",
|
||
"url": "https://example.com",
|
||
"photos": "https://example.com/image1.jpg,https://example.com/image2.jpg",
|
||
"date": "2025-10-27",
|
||
"markerColor": "ocean",
|
||
"related_articles": "1,2,3",
|
||
"highlights": "夜景好看,适合拍照,交通便利",
|
||
"created_at": "2025-11-17 14:37:39",
|
||
"updated_at": "2025-11-21 05:14:53",
|
||
"tags": "景点,文化,历史"
|
||
}
|
||
]</pre>
|
||
</li>
|
||
</ul>
|
||
</form>
|
||
</div>
|
||
<div class="typecho-modal-foot">
|
||
<button type="button" id="start-import-btn" class="btn primary"><?php _e('导入'); ?></button>
|
||
<button type="button" class="btn typecho-modal-btn"><?php _e('取消'); ?></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 加载提示 -->
|
||
<div id="loading" class="loading" style="display: none;">
|
||
<div class="spinner"></div>
|
||
<p><?php _e('加载中...'); ?></p>
|
||
</div>
|
||
|
||
<!-- 消息提示 -->
|
||
<div id="message" class="message" style="display: none;"></div>
|
||
|
||
<script>
|
||
// 使用立即执行函数确保代码安全执行
|
||
(function($) {
|
||
'use strict';
|
||
|
||
// 搜索相关变量
|
||
var searchTimer = null;
|
||
var lastSearchKeyword = '';
|
||
var currentResults = [];
|
||
|
||
// 关联文章相关变量
|
||
var relatedArticles = [];
|
||
var isProcessingArticles = false; // 防止重复处理
|
||
|
||
// 初始化函数 - 确保在DOM完全加载后执行
|
||
function initMyTrack() {
|
||
console.log('MyTrack插件管理页面初始化');
|
||
|
||
// 为管理页面搜索框添加自动完成功能
|
||
initManagementSearch();
|
||
|
||
$('#add-footprint-btn').on('click', function(e) {
|
||
e.preventDefault();
|
||
console.log('点击新增地点按钮');
|
||
showFootprintModal();
|
||
});
|
||
|
||
$('#import-footprint-btn').on('click', function(e) {
|
||
e.preventDefault();
|
||
console.log('点击导入数据按钮');
|
||
showImportModal();
|
||
});
|
||
|
||
$('#export-json-btn').on('click', function(e) {
|
||
e.preventDefault();
|
||
console.log('点击导出数据按钮');
|
||
exportFootprints('json');
|
||
});
|
||
|
||
$('#export-simple-btn').on('click', function(e) {
|
||
e.preventDefault();
|
||
console.log('点击精简导出按钮');
|
||
exportSimpleFootprints();
|
||
});
|
||
|
||
$('#fetch-images-btn').on('click', function(e) {
|
||
e.preventDefault();
|
||
console.log('点击获取文章内容按钮');
|
||
fetchArticleImages();
|
||
});
|
||
|
||
$('#save-footprint-btn').on('click', function(e) {
|
||
e.preventDefault();
|
||
console.log('点击保存按钮');
|
||
saveFootprint();
|
||
});
|
||
|
||
$('#start-import-btn').on('click', function(e) {
|
||
e.preventDefault();
|
||
console.log('点击导入按钮');
|
||
importFootprints();
|
||
});
|
||
|
||
$('.typecho-modal-close, .typecho-modal-btn').on('click', function() {
|
||
$(this).closest('.typecho-modal').hide();
|
||
});
|
||
|
||
$('#batch-delete-btn').on('click', function(e) {
|
||
e.preventDefault();
|
||
console.log('点击批量删除按钮');
|
||
|
||
var selectedIds = [];
|
||
$('input[name="footprint[]"]:checked').each(function() {
|
||
selectedIds.push($(this).val());
|
||
});
|
||
|
||
if (selectedIds.length === 0) {
|
||
alert('<?php _e('请选择要删除的足迹'); ?>');
|
||
return;
|
||
}
|
||
|
||
if (confirm('<?php _e('你确认要删除这些足迹吗?'); ?>')) {
|
||
$('#loading').show();
|
||
|
||
var formData = new FormData();
|
||
formData.append('do', 'batchDelete');
|
||
|
||
for (var i = 0; i < selectedIds.length; i++) {
|
||
formData.append('footprint[]', selectedIds[i]);
|
||
}
|
||
|
||
$.ajax({
|
||
url: MyTrackConfig.actionUrl,
|
||
type: 'POST',
|
||
data: formData,
|
||
processData: false,
|
||
contentType: false,
|
||
dataType: 'json',
|
||
success: function(response) {
|
||
$('#loading').hide();
|
||
if (response.success) {
|
||
alert(response.message);
|
||
window.location.reload();
|
||
} else {
|
||
alert(response.message);
|
||
}
|
||
},
|
||
error: function(xhr, status, error) {
|
||
$('#loading').hide();
|
||
console.error('批量删除请求失败:', status, error);
|
||
alert('<?php _e('批量删除失败:'); ?>' + (error || '<?php _e('网络错误'); ?>'));
|
||
}
|
||
});
|
||
}
|
||
});
|
||
|
||
// 保存关联文章按钮点击事件
|
||
$('#save-related-articles-btn').on('click', function(e) {
|
||
e.preventDefault();
|
||
saveRelatedArticles();
|
||
});
|
||
|
||
// 关联文章输入框回车事件
|
||
$('#related-articles-input').on('keypress', function(e) {
|
||
if (e.which === 13) {
|
||
e.preventDefault();
|
||
saveRelatedArticles();
|
||
}
|
||
});
|
||
|
||
// 使用直接绑定方式绑定编辑和删除按钮
|
||
bindEditDeleteEvents();
|
||
|
||
// 监听表格变化,为新增的按钮绑定事件
|
||
var observer = new MutationObserver(function(mutations) {
|
||
mutations.forEach(function(mutation) {
|
||
if (mutation.addedNodes.length) {
|
||
bindEditDeleteEvents();
|
||
}
|
||
});
|
||
});
|
||
|
||
var tbody = document.getElementById('footprint-list');
|
||
if (tbody) {
|
||
observer.observe(tbody, { childList: true, subtree: true });
|
||
}
|
||
|
||
initSearch();
|
||
initRatingStars();
|
||
initCategoriesOptions();
|
||
initMarkerColorOptions();
|
||
}
|
||
|
||
// 初始化管理页面搜索框的自动完成功能
|
||
function initManagementSearch() {
|
||
var searchInput = $('#management-search');
|
||
if (!searchInput.length) return;
|
||
|
||
var suggestionTimer = null;
|
||
var currentSuggestions = [];
|
||
|
||
// 创建建议框容器
|
||
var suggestionsDiv = $('<div id="mytrack-suggestions" class="mytrack-search-results" style="display: none;"></div>');
|
||
searchInput.parent().append(suggestionsDiv);
|
||
|
||
searchInput.on('input', function() {
|
||
var keyword = $(this).val().trim();
|
||
|
||
if (!keyword) {
|
||
hideSuggestions();
|
||
return;
|
||
}
|
||
|
||
clearTimeout(suggestionTimer);
|
||
|
||
if (keyword.length >= 1) {
|
||
suggestionTimer = setTimeout(function() {
|
||
searchFootprintsForSuggestions(keyword);
|
||
}, 300);
|
||
} else {
|
||
hideSuggestions();
|
||
}
|
||
});
|
||
|
||
searchInput.on('focus', function() {
|
||
var keyword = $(this).val().trim();
|
||
if (keyword && currentSuggestions.length > 0) {
|
||
showSuggestions();
|
||
}
|
||
});
|
||
|
||
searchInput.on('keydown', function(e) {
|
||
var suggestionsDiv = $('#mytrack-suggestions');
|
||
var suggestionItems = suggestionsDiv.find('.mytrack-suggestion-item');
|
||
|
||
if (e.key === 'Escape') {
|
||
hideSuggestions();
|
||
} else if (e.key === 'ArrowDown') {
|
||
e.preventDefault();
|
||
if (suggestionItems.length > 0) {
|
||
var firstItem = suggestionItems.first();
|
||
if (!suggestionsDiv.find('.mytrack-suggestion-item.hover').length) {
|
||
firstItem.addClass('hover');
|
||
} else {
|
||
var currentHover = suggestionsDiv.find('.mytrack-suggestion-item.hover');
|
||
var nextItem = currentHover.next('.mytrack-suggestion-item');
|
||
if (nextItem.length) {
|
||
currentHover.removeClass('hover');
|
||
nextItem.addClass('hover');
|
||
}
|
||
}
|
||
}
|
||
} else if (e.key === 'ArrowUp') {
|
||
e.preventDefault();
|
||
if (suggestionItems.length > 0) {
|
||
var lastItem = suggestionItems.last();
|
||
if (!suggestionsDiv.find('.mytrack-suggestion-item.hover').length) {
|
||
lastItem.addClass('hover');
|
||
} else {
|
||
var currentHover = suggestionsDiv.find('.mytrack-suggestion-item.hover');
|
||
var prevItem = currentHover.prev('.mytrack-suggestion-item');
|
||
if (prevItem.length) {
|
||
currentHover.removeClass('hover');
|
||
prevItem.addClass('hover');
|
||
}
|
||
}
|
||
}
|
||
} else if (e.key === 'Enter') {
|
||
var hoverItem = suggestionsDiv.find('.mytrack-suggestion-item.hover');
|
||
if (hoverItem.length) {
|
||
e.preventDefault();
|
||
searchInput.val(hoverItem.find('.mytrack-suggestion-name').text());
|
||
hideSuggestions();
|
||
// 自动提交表单
|
||
setTimeout(function() {
|
||
searchInput.closest('form').submit();
|
||
}, 100);
|
||
}
|
||
}
|
||
});
|
||
|
||
$(document).on('click', function(e) {
|
||
if (!$(e.target).closest('.mytrack-management-search').length) {
|
||
hideSuggestions();
|
||
}
|
||
});
|
||
}
|
||
|
||
function searchFootprintsForSuggestions(keyword) {
|
||
$.ajax({
|
||
url: MyTrackConfig.actionUrl,
|
||
type: 'GET',
|
||
data: {do: 'getAll'},
|
||
dataType: 'json',
|
||
success: function(response) {
|
||
if (response.success && response.data && response.data.length > 0) {
|
||
var footprints = response.data;
|
||
var suggestions = [];
|
||
|
||
// 过滤匹配的足迹 - 只匹配地名
|
||
footprints.forEach(function(footprint) {
|
||
if (footprint.name && footprint.name.toString().toLowerCase().indexOf(keyword.toLowerCase()) !== -1) {
|
||
suggestions.push(footprint);
|
||
}
|
||
});
|
||
|
||
currentSuggestions = suggestions.slice(0, 8); // 最多8条建议
|
||
displaySuggestions(currentSuggestions, keyword);
|
||
} else {
|
||
hideSuggestions();
|
||
}
|
||
},
|
||
error: function() {
|
||
hideSuggestions();
|
||
}
|
||
});
|
||
}
|
||
|
||
function displaySuggestions(suggestions, keyword) {
|
||
var suggestionsDiv = $('#mytrack-suggestions');
|
||
|
||
if (suggestions.length === 0) {
|
||
suggestionsDiv.html('<div class="mytrack-no-results"><?php _e('没有找到匹配的地名'); ?></div>');
|
||
suggestionsDiv.show();
|
||
return;
|
||
}
|
||
|
||
var html = '';
|
||
|
||
suggestions.forEach(function(footprint) {
|
||
// 高亮显示匹配的关键词
|
||
var name = footprint.name || '';
|
||
|
||
// 创建高亮文本
|
||
var highlightedName = highlightText(name, keyword);
|
||
|
||
html += '<div class="mytrack-result-item mytrack-suggestion-item" data-name="' + name + '">';
|
||
html += '<div class="mytrack-result-name mytrack-suggestion-name">' + highlightedName + '</div>';
|
||
|
||
// 显示地址(如果有)
|
||
if (footprint.address) {
|
||
html += '<div class="mytrack-result-address">' + (footprint.address || '') + '</div>';
|
||
}
|
||
|
||
html += '</div>';
|
||
});
|
||
|
||
suggestionsDiv.html(html);
|
||
suggestionsDiv.show();
|
||
|
||
// 绑定点击事件
|
||
suggestionsDiv.find('.mytrack-suggestion-item').on('click', function() {
|
||
var name = $(this).data('name');
|
||
$('#management-search').val(name);
|
||
hideSuggestions();
|
||
// 自动提交表单
|
||
setTimeout(function() {
|
||
$('#management-search').closest('form').submit();
|
||
}, 100);
|
||
});
|
||
|
||
suggestionsDiv.find('.mytrack-suggestion-item').hover(
|
||
function() {
|
||
$(this).addClass('hover').siblings().removeClass('hover');
|
||
},
|
||
function() {
|
||
$(this).removeClass('hover');
|
||
}
|
||
);
|
||
}
|
||
|
||
function highlightText(text, keyword) {
|
||
if (!text || !keyword) return text;
|
||
|
||
var regex = new RegExp('(' + keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + ')', 'gi');
|
||
return text.replace(regex, '<mark>$1</mark>');
|
||
}
|
||
|
||
function showSuggestions() {
|
||
$('#mytrack-suggestions').show();
|
||
}
|
||
|
||
function hideSuggestions() {
|
||
$('#mytrack-suggestions').hide();
|
||
$('#mytrack-suggestions .mytrack-suggestion-item').removeClass('hover');
|
||
}
|
||
|
||
function bindEditDeleteEvents() {
|
||
console.log('绑定编辑和删除按钮事件');
|
||
|
||
$('.mytrack-edit-btn').off('click.edit').on('click.edit', function(e) {
|
||
e.preventDefault();
|
||
e.stopPropagation();
|
||
var footprintId = $(this).data('id');
|
||
console.log('点击编辑按钮,ID:', footprintId);
|
||
editFootprint(footprintId);
|
||
});
|
||
|
||
$('.mytrack-delete-btn').off('click.delete').on('click.delete', function(e) {
|
||
e.preventDefault();
|
||
e.stopPropagation();
|
||
var footprintId = $(this).data('id');
|
||
console.log('点击删除按钮,ID:', footprintId);
|
||
deleteFootprint(footprintId);
|
||
});
|
||
}
|
||
|
||
// 保存关联文章
|
||
function saveRelatedArticles() {
|
||
if (isProcessingArticles) {
|
||
alert('<?php _e('正在处理中,请稍候...'); ?>');
|
||
return;
|
||
}
|
||
|
||
var articlesInput = $('#related-articles-input');
|
||
var inputValue = articlesInput.val().trim();
|
||
|
||
if (!inputValue) {
|
||
relatedArticles = [];
|
||
$('#related_articles').val('');
|
||
renderRelatedArticlesList();
|
||
return;
|
||
}
|
||
|
||
// 解析逗号分隔的CID列表
|
||
var cidArray = inputValue.split(',').map(function(cid) {
|
||
return cid.trim();
|
||
}).filter(function(cid) {
|
||
return cid !== '' && !isNaN(cid);
|
||
});
|
||
|
||
// 去重
|
||
var uniqueCids = [];
|
||
cidArray.forEach(function(cid) {
|
||
if (uniqueCids.indexOf(cid) === -1) {
|
||
uniqueCids.push(cid);
|
||
}
|
||
});
|
||
|
||
relatedArticles = uniqueCids;
|
||
$('#related_articles').val(relatedArticles.join(','));
|
||
|
||
// 更新输入框,确保格式统一
|
||
articlesInput.val(relatedArticles.join(', '));
|
||
|
||
renderRelatedArticlesList();
|
||
}
|
||
|
||
// 移除单个关联文章
|
||
function removeRelatedArticle(cid) {
|
||
console.log('正在移除关联文章,CID:', cid);
|
||
var index = relatedArticles.indexOf(cid);
|
||
if (index !== -1) {
|
||
relatedArticles.splice(index, 1);
|
||
$('#related_articles').val(relatedArticles.join(','));
|
||
|
||
// 更新输入框
|
||
$('#related-articles-input').val(relatedArticles.join(', '));
|
||
|
||
renderRelatedArticlesList();
|
||
} else {
|
||
console.warn('未找到要移除的文章CID:', cid);
|
||
}
|
||
}
|
||
|
||
// 渲染关联文章列表 - 简化版本
|
||
function renderRelatedArticlesList() {
|
||
var listContainer = $('#related-articles-list');
|
||
|
||
if (relatedArticles.length === 0) {
|
||
listContainer.html('<div class="mytrack-no-results"><?php _e('暂无关联文章'); ?></div>');
|
||
return;
|
||
}
|
||
|
||
var simpleHtml = '';
|
||
relatedArticles.forEach(function(cid) {
|
||
simpleHtml += '<div class="mytrack-related-article-item">';
|
||
simpleHtml += '<div class="mytrack-related-article-info">';
|
||
simpleHtml += '<div class="mytrack-related-article-title" data-cid="' + cid + '">CID: ' + cid + '</div>';
|
||
simpleHtml += '<div class="mytrack-related-article-cid"><?php _e('正在获取文章信息...'); ?></div>';
|
||
simpleHtml += '</div>';
|
||
simpleHtml += '<div class="mytrack-related-article-actions">';
|
||
simpleHtml += '<a href="#" class="mytrack-remove-related-article" data-cid="' + cid + '"><?php _e('移除'); ?></a>';
|
||
simpleHtml += '</div>';
|
||
simpleHtml += '</div>';
|
||
});
|
||
|
||
listContainer.html(simpleHtml);
|
||
|
||
// 绑定移除按钮事件 - 使用更简单直接的方式
|
||
bindRemoveRelatedArticleEvents();
|
||
|
||
// 异步获取文章信息
|
||
relatedArticles.forEach(function(cid) {
|
||
$.ajax({
|
||
url: MyTrackConfig.actionUrl,
|
||
type: 'GET',
|
||
data: {do: 'getArticleImages', article_cid: cid},
|
||
dataType: 'json',
|
||
success: function(response) {
|
||
if (response && response.success) {
|
||
// 更新对应的文章标题
|
||
var titleElement = listContainer.find('.mytrack-remove-related-article[data-cid="' + cid + '"]')
|
||
.closest('.mytrack-related-article-item')
|
||
.find('.mytrack-related-article-title');
|
||
var cidElement = listContainer.find('.mytrack-remove-related-article[data-cid="' + cid + '"]')
|
||
.closest('.mytrack-related-article-item')
|
||
.find('.mytrack-related-article-cid');
|
||
|
||
if (response.title) {
|
||
titleElement.text(response.title);
|
||
}
|
||
cidElement.text('CID: ' + cid);
|
||
}
|
||
},
|
||
error: function() {
|
||
// 获取失败时显示默认文本
|
||
var cidElement = listContainer.find('.mytrack-remove-related-article[data-cid="' + cid + '"]')
|
||
.closest('.mytrack-related-article-item')
|
||
.find('.mytrack-related-article-cid');
|
||
cidElement.text('CID: ' + cid + ' (<?php _e('获取信息失败'); ?>)');
|
||
}
|
||
});
|
||
});
|
||
}
|
||
|
||
// 绑定移除关联文章按钮事件 - 使用更简单直接的方式
|
||
function bindRemoveRelatedArticleEvents() {
|
||
console.log('绑定移除关联文章按钮事件');
|
||
|
||
// 移除旧的绑定
|
||
$('#related-articles-list .mytrack-remove-related-article').off('click');
|
||
|
||
// 添加新的绑定
|
||
$('#related-articles-list').on('click', '.mytrack-remove-related-article', function(e) {
|
||
e.preventDefault();
|
||
e.stopPropagation();
|
||
var cid = $(this).data('cid');
|
||
console.log('点击移除关联文章按钮,CID:', cid);
|
||
removeRelatedArticle(cid);
|
||
});
|
||
}
|
||
|
||
function fetchArticleImages() {
|
||
var articleCid = $('#article_cid').val().trim();
|
||
|
||
console.log('获取文章信息,CID:', articleCid);
|
||
|
||
if (!articleCid) {
|
||
alert('<?php _e('请先输入文章CID'); ?>');
|
||
return;
|
||
}
|
||
|
||
if (isNaN(articleCid)) {
|
||
alert('<?php _e('文章CID必须是数字'); ?>');
|
||
return;
|
||
}
|
||
|
||
$('#loading').show();
|
||
|
||
$.ajax({
|
||
url: MyTrackConfig.actionUrl,
|
||
type: 'GET',
|
||
data: {do: 'getArticleImages', article_cid: articleCid},
|
||
dataType: 'json',
|
||
success: function(response) {
|
||
console.log('获取文章信息响应:', response);
|
||
$('#loading').hide();
|
||
|
||
if (response.success) {
|
||
if (response.text && $('#description').val().trim() === '') {
|
||
var markdownMatch = response.text.match(/<!--markdown-->([\s\S]*?)<!--more-->/);
|
||
if (markdownMatch && markdownMatch[1]) {
|
||
var textContent = markdownMatch[1];
|
||
textContent = textContent.replace(/<[^>]+>/g, '');
|
||
textContent = textContent.replace(/\s+/g, ' ').trim();
|
||
if (textContent.length > 100) {
|
||
textContent = textContent.substring(0, 100) + '...';
|
||
}
|
||
$('#description').val(textContent);
|
||
} else {
|
||
var textContent = response.text.replace(/<[^>]+>/g, '');
|
||
textContent = textContent.replace(/\s+/g, ' ').trim();
|
||
if (textContent.length > 100) {
|
||
textContent = textContent.substring(0, 100) + '...';
|
||
}
|
||
$('#description').val(textContent);
|
||
}
|
||
}
|
||
|
||
if (response.images && response.images.length > 0 && $('#photos').val().trim() === '') {
|
||
var limitedImages = response.images.slice(0, 4);
|
||
$('#photos').val(limitedImages.join(','));
|
||
}
|
||
|
||
if (response.title && $('#urlLabel').val().trim() === '') {
|
||
$('#urlLabel').val(response.title);
|
||
}
|
||
if (response.link && $('#url').val().trim() === '') {
|
||
$('#url').val(response.link);
|
||
}
|
||
|
||
if (response.tags && response.tags.length > 0 && $('#tags').val().trim() === '') {
|
||
$('#tags').val(response.tags.join(','));
|
||
}
|
||
|
||
if (response.created && !$('#date').val()) {
|
||
var date = new Date(response.created * 1000);
|
||
var year = date.getFullYear();
|
||
var month = String(date.getMonth() + 1).padStart(2, '0');
|
||
var day = String(date.getDate()).padStart(2, '0');
|
||
var formattedDate = year + '-' + month + '-' + day;
|
||
$('#date').val(formattedDate);
|
||
}
|
||
|
||
alert('<?php _e('获取文章信息成功'); ?>');
|
||
} else {
|
||
alert(response.message || '<?php _e('获取文章信息失败'); ?>');
|
||
}
|
||
},
|
||
error: function(xhr, status, error) {
|
||
console.error('获取文章信息错误:', error);
|
||
$('#loading').hide();
|
||
alert('<?php _e('获取文章信息失败'); ?>');
|
||
}
|
||
});
|
||
}
|
||
|
||
// 显示足迹模态框
|
||
function showFootprintModal(footprint) {
|
||
var modal = $('#footprint-modal');
|
||
var form = $('#footprint-form');
|
||
var title = $('#modal-title');
|
||
|
||
form[0].reset();
|
||
|
||
$('#location-search').val('');
|
||
hideSearchResults();
|
||
currentResults = [];
|
||
lastSearchKeyword = '';
|
||
|
||
$('#location_type').val('');
|
||
$('#rating_level').val('0');
|
||
$('#categories').val('');
|
||
$('#review').val('');
|
||
$('#address').val('');
|
||
$('#markerColor').val('');
|
||
$('#highlights').val('');
|
||
$('#description').val('');
|
||
$('#tags').val('');
|
||
$('#article_cid').val('');
|
||
$('#photos').val('');
|
||
$('#urlLabel').val('');
|
||
$('#url').val('');
|
||
$('#date').val('');
|
||
$('#related_articles').val('');
|
||
$('#related-articles-input').val('');
|
||
|
||
relatedArticles = [];
|
||
$('#related-articles-list').html('<div class="mytrack-no-results"><?php _e('暂无关联文章'); ?></div>');
|
||
|
||
$('#rating-stars .mytrack-star').removeClass('selected');
|
||
$('.mytrack-categories-option').removeClass('selected');
|
||
$('.mytrack-marker-color-option').removeClass('selected');
|
||
|
||
if (footprint) {
|
||
title.text('<?php _e('编辑足迹'); ?>');
|
||
$('#footprint-id').val(footprint.id);
|
||
$('#latitude').val(footprint.latitude);
|
||
$('#longitude').val(footprint.longitude);
|
||
$('#name').val(footprint.name || '');
|
||
$('#address').val(footprint.address || '');
|
||
$('#location_type').val(footprint.location_type || '');
|
||
$('#review').val(footprint.review || '');
|
||
$('#date').val(footprint.date ? footprint.date.split(' ')[0] : '');
|
||
$('#description').val(footprint.description || '');
|
||
$('#tags').val(footprint.tags || '');
|
||
$('#article_cid').val(footprint.article_cid || '');
|
||
$('#photos').val(footprint.photos || '');
|
||
$('#urlLabel').val(footprint.urlLabel || '');
|
||
$('#url').val(footprint.url || '');
|
||
$('#highlights').val(footprint.highlights || '');
|
||
|
||
if (footprint.rating_level && footprint.rating_level > 0) {
|
||
$('#rating_level').val(footprint.rating_level);
|
||
updateStarRating(footprint.rating_level);
|
||
}
|
||
|
||
if (footprint.categories) {
|
||
$('#categories').val(footprint.categories);
|
||
var categories = footprint.categories.split(',');
|
||
categories.forEach(function(category) {
|
||
category = category.trim();
|
||
$('.mytrack-categories-option[data-value="' + category + '"]').addClass('selected');
|
||
});
|
||
}
|
||
|
||
if (footprint.markerColor) {
|
||
$('#markerColor').val(footprint.markerColor);
|
||
$('.mytrack-marker-color-option[data-value="' + footprint.markerColor + '"]').addClass('selected');
|
||
}
|
||
|
||
if (footprint.related_articles) {
|
||
$('#related_articles').val(footprint.related_articles);
|
||
relatedArticles = footprint.related_articles.split(',').map(function(cid) {
|
||
return cid.trim();
|
||
}).filter(function(cid) {
|
||
return cid !== '' && !isNaN(cid);
|
||
});
|
||
|
||
$('#related-articles-input').val(relatedArticles.join(', '));
|
||
renderRelatedArticlesList();
|
||
}
|
||
} else {
|
||
title.text('<?php _e('新增地点'); ?>');
|
||
$('#footprint-id').val('');
|
||
}
|
||
|
||
modal.show();
|
||
|
||
setTimeout(function() {
|
||
$('#location-search').focus();
|
||
}, 300);
|
||
}
|
||
|
||
function updateStarRating(rating) {
|
||
$('#rating-stars .mytrack-star').removeClass('selected');
|
||
for (var i = 1; i <= rating; i++) {
|
||
$('#rating-stars .mytrack-star[data-value="' + i + '"]').addClass('selected');
|
||
}
|
||
}
|
||
|
||
function editFootprint(id) {
|
||
console.log('编辑足迹,请求ID:', id);
|
||
$('#loading').show();
|
||
|
||
$.ajax({
|
||
url: MyTrackConfig.actionUrl,
|
||
type: 'GET',
|
||
data: {do: 'get', id: id},
|
||
dataType: 'json',
|
||
success: function(response) {
|
||
$('#loading').hide();
|
||
console.log('编辑足迹响应:', response);
|
||
if (response.success) {
|
||
showFootprintModal(response.data);
|
||
} else {
|
||
alert(response.message || '<?php _e('获取足迹信息失败'); ?>');
|
||
}
|
||
},
|
||
error: function(xhr, status, error) {
|
||
$('#loading').hide();
|
||
console.error('编辑足迹错误:', error);
|
||
alert('<?php _e('获取足迹信息失败'); ?>');
|
||
}
|
||
});
|
||
}
|
||
|
||
function saveFootprint() {
|
||
var form = $('#footprint-form');
|
||
var id = $('#footprint-id').val();
|
||
var isEdit = id !== '';
|
||
|
||
if (!$('#latitude').val() || !$('#longitude').val() || !$('#name').val()) {
|
||
alert('<?php _e('请填写经纬度和地点名称'); ?>');
|
||
return;
|
||
}
|
||
|
||
var formData = {
|
||
do: isEdit ? 'update' : 'add',
|
||
id: id,
|
||
latitude: $('#latitude').val(),
|
||
longitude: $('#longitude').val(),
|
||
name: $('#name').val(),
|
||
address: $('#address').val(),
|
||
location_type: $('#location_type').val(),
|
||
rating_level: $('#rating_level').val() || 0,
|
||
categories: $('#categories').val(),
|
||
review: $('#review').val(),
|
||
date: $('#date').val(),
|
||
description: $('#description').val(),
|
||
tags: $('#tags').val(),
|
||
article_cid: $('#article_cid').val(),
|
||
urlLabel: $('#urlLabel').val(),
|
||
url: $('#url').val(),
|
||
photos: $('#photos').val(),
|
||
markerColor: $('#markerColor').val(),
|
||
highlights: $('#highlights').val(),
|
||
related_articles: $('#related_articles').val()
|
||
};
|
||
|
||
Object.keys(formData).forEach(function(key) {
|
||
if (formData[key] === '' || formData[key] === null) {
|
||
formData[key] = undefined;
|
||
}
|
||
});
|
||
|
||
console.log('保存足迹数据:', formData);
|
||
$('#loading').show();
|
||
|
||
$.ajax({
|
||
url: MyTrackConfig.actionUrl,
|
||
type: 'POST',
|
||
data: formData,
|
||
dataType: 'json',
|
||
success: function(response) {
|
||
$('#loading').hide();
|
||
console.log('保存足迹响应:', response);
|
||
if (response.success) {
|
||
alert(response.message);
|
||
$('#footprint-modal').hide();
|
||
window.location.reload();
|
||
} else {
|
||
// 新增时检查是否是重复数据错误
|
||
if (!isEdit && response.message && response.message.indexOf('已存在') !== -1) {
|
||
alert('该地点已有,请勿重复添加!');
|
||
} else {
|
||
alert(response.message || '<?php _e('保存失败'); ?>');
|
||
}
|
||
}
|
||
},
|
||
error: function(xhr, status, error) {
|
||
$('#loading').hide();
|
||
console.error('保存足迹错误:', error);
|
||
alert(isEdit ? '<?php _e('更新足迹失败'); ?>' : '<?php _e('新增地点失败'); ?>');
|
||
}
|
||
});
|
||
}
|
||
|
||
function deleteFootprint(id) {
|
||
console.log('删除足迹,ID:', id);
|
||
if (confirm('<?php _e('你确认要删除这个足迹吗?'); ?>')) {
|
||
$('#loading').show();
|
||
$.ajax({
|
||
url: MyTrackConfig.actionUrl,
|
||
type: 'POST',
|
||
data: {do: 'delete', id: id},
|
||
dataType: 'json',
|
||
success: function(response) {
|
||
$('#loading').hide();
|
||
console.log('删除足迹响应:', response);
|
||
if (response.success) {
|
||
alert(response.message);
|
||
window.location.reload();
|
||
} else {
|
||
alert(response.message || '<?php _e('删除失败'); ?>');
|
||
}
|
||
},
|
||
error: function(xhr, status, error) {
|
||
$('#loading').hide();
|
||
console.error('删除足迹错误:', error);
|
||
alert('<?php _e('删除失败'); ?>');
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
function showImportModal() {
|
||
$('#import-modal').show();
|
||
}
|
||
|
||
function importFootprints() {
|
||
var fileInput = $('#import-file')[0];
|
||
|
||
if (!fileInput.files.length) {
|
||
alert('<?php _e('请选择要导入的文件'); ?>');
|
||
return;
|
||
}
|
||
|
||
var formData = new FormData();
|
||
formData.append('do', 'import');
|
||
formData.append('file', fileInput.files[0]);
|
||
|
||
$('#loading').show();
|
||
|
||
$.ajax({
|
||
url: MyTrackConfig.actionUrl,
|
||
type: 'POST',
|
||
data: formData,
|
||
processData: false,
|
||
contentType: false,
|
||
dataType: 'json',
|
||
success: function(response) {
|
||
$('#loading').hide();
|
||
if (response.success) {
|
||
alert(response.message);
|
||
$('#import-modal').hide();
|
||
window.location.reload();
|
||
} else {
|
||
alert(response.message);
|
||
}
|
||
},
|
||
error: function(xhr, status, error) {
|
||
$('#loading').hide();
|
||
console.error('导入错误:', error);
|
||
alert('<?php _e('导入失败'); ?>');
|
||
}
|
||
});
|
||
}
|
||
|
||
function exportFootprints(format) {
|
||
if (format !== 'json') {
|
||
alert('<?php _e('只支持JSON格式导出'); ?>');
|
||
return;
|
||
}
|
||
|
||
var exportForm = $('<form>', {
|
||
'method': 'POST',
|
||
'action': MyTrackConfig.actionUrl,
|
||
'target': '_blank'
|
||
});
|
||
|
||
exportForm.append($('<input>', {
|
||
'type': 'hidden',
|
||
'name': 'do',
|
||
'value': 'export'
|
||
}));
|
||
|
||
exportForm.append($('<input>', {
|
||
'type': 'hidden',
|
||
'name': 'format',
|
||
'value': 'json'
|
||
}));
|
||
|
||
$('body').append(exportForm);
|
||
exportForm.submit();
|
||
exportForm.remove();
|
||
}
|
||
|
||
function exportSimpleFootprints() {
|
||
var exportForm = $('<form>', {
|
||
'method': 'POST',
|
||
'action': MyTrackConfig.actionUrl,
|
||
'target': '_blank'
|
||
});
|
||
|
||
exportForm.append($('<input>', {
|
||
'type': 'hidden',
|
||
'name': 'do',
|
||
'value': 'exportSimple'
|
||
}));
|
||
|
||
exportForm.append($('<input>', {
|
||
'type': 'hidden',
|
||
'name': 'format',
|
||
'value': 'json'
|
||
}));
|
||
|
||
$('body').append(exportForm);
|
||
exportForm.submit();
|
||
exportForm.remove();
|
||
}
|
||
|
||
function initSearch() {
|
||
var searchInput = $('#location-search');
|
||
if (!searchInput.length) return;
|
||
|
||
searchInput.on('input', function() {
|
||
var keyword = $(this).val().trim();
|
||
|
||
if (!keyword) {
|
||
hideSearchResults();
|
||
return;
|
||
}
|
||
|
||
clearTimeout(searchTimer);
|
||
|
||
if (keyword !== lastSearchKeyword) {
|
||
searchTimer = setTimeout(function() {
|
||
searchLocations(keyword);
|
||
lastSearchKeyword = keyword;
|
||
}, 500);
|
||
}
|
||
});
|
||
|
||
searchInput.on('focus', function() {
|
||
var keyword = $(this).val().trim();
|
||
if (keyword && currentResults.length > 0) {
|
||
showSearchResults();
|
||
}
|
||
});
|
||
|
||
searchInput.on('keydown', function(e) {
|
||
if (e.key === 'Enter') {
|
||
e.preventDefault();
|
||
|
||
var keyword = $(this).val().trim();
|
||
if (keyword) {
|
||
var resultsDiv = $('#search-results');
|
||
var firstItem = resultsDiv.find('.mytrack-result-item').first();
|
||
|
||
if (firstItem.length) {
|
||
selectLocation(firstItem.data('location'));
|
||
} else {
|
||
searchLocations(keyword);
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
$(document).on('click', function(e) {
|
||
if (!$(e.target).closest('.mytrack-search-box').length) {
|
||
hideSearchResults();
|
||
}
|
||
});
|
||
|
||
searchInput.on('keydown', function(e) {
|
||
var resultsDiv = $('#search-results');
|
||
var resultsItems = resultsDiv.find('.mytrack-result-item');
|
||
|
||
if (e.key === 'Escape') {
|
||
hideSearchResults();
|
||
searchInput.blur();
|
||
} else if (e.key === 'ArrowDown') {
|
||
e.preventDefault();
|
||
if (resultsItems.length > 0) {
|
||
var firstItem = resultsItems.first();
|
||
if (!resultsDiv.find('.mytrack-result-item.hover').length) {
|
||
firstItem.addClass('hover');
|
||
} else {
|
||
var currentHover = resultsDiv.find('.mytrack-result-item.hover');
|
||
var nextItem = currentHover.next('.mytrack-result-item');
|
||
if (nextItem.length) {
|
||
currentHover.removeClass('hover');
|
||
nextItem.addClass('hover');
|
||
}
|
||
}
|
||
}
|
||
} else if (e.key === 'ArrowUp') {
|
||
e.preventDefault();
|
||
if (resultsItems.length > 0) {
|
||
var lastItem = resultsItems.last();
|
||
if (!resultsDiv.find('.mytrack-result-item.hover').length) {
|
||
lastItem.addClass('hover');
|
||
} else {
|
||
var currentHover = resultsDiv.find('.mytrack-result-item.hover');
|
||
var prevItem = currentHover.prev('.mytrack-result-item');
|
||
if (prevItem.length) {
|
||
currentHover.removeClass('hover');
|
||
prevItem.addClass('hover');
|
||
}
|
||
}
|
||
}
|
||
} else if (e.key === 'Enter' && e.ctrlKey) {
|
||
e.preventDefault();
|
||
$('#save-footprint-btn').click();
|
||
}
|
||
});
|
||
|
||
$('#article_cid').on('focus', function(e) {
|
||
e.stopPropagation();
|
||
hideSearchResults();
|
||
});
|
||
|
||
$('#related-articles-input').on('focus', function(e) {
|
||
e.stopPropagation();
|
||
hideSearchResults();
|
||
});
|
||
}
|
||
|
||
function searchLocations(keyword) {
|
||
if (!keyword || keyword.length < 1) {
|
||
hideSearchResults();
|
||
return;
|
||
}
|
||
|
||
if (!MyTrackConfig.webApiKey) {
|
||
alert('<?php _e('高德地图Web服务API密钥未配置,请先配置插件设置'); ?>');
|
||
return;
|
||
}
|
||
|
||
showSearchLoading();
|
||
|
||
var url = 'https://restapi.amap.com/v3/place/text?key=' + MyTrackConfig.webApiKey +
|
||
'&keywords=' + encodeURIComponent(keyword) +
|
||
'&city=&offset=10&page=1&extensions=base&output=JSON';
|
||
|
||
$.ajax({
|
||
url: url,
|
||
type: 'GET',
|
||
dataType: 'json',
|
||
success: function(response) {
|
||
if (response.status === '1' && response.pois && response.pois.length > 0) {
|
||
currentResults = response.pois;
|
||
displaySearchResults(response.pois);
|
||
} else {
|
||
displayNoResults(response.info || '<?php _e('未找到相关地点'); ?>');
|
||
}
|
||
},
|
||
error: function(xhr, status, error) {
|
||
console.error('搜索失败:', error);
|
||
displayNoResults('<?php _e('搜索失败,请检查网络连接'); ?>');
|
||
}
|
||
});
|
||
}
|
||
|
||
function showSearchLoading() {
|
||
var resultsDiv = $('#search-results');
|
||
resultsDiv.html('<div class="mytrack-loading"><?php _e('搜索中...'); ?></div>');
|
||
resultsDiv.show();
|
||
}
|
||
|
||
function displaySearchResults(pois) {
|
||
var resultsDiv = $('#search-results');
|
||
var html = '';
|
||
|
||
var maxItems = Math.min(pois.length, 8);
|
||
|
||
for (var i = 0; i < maxItems; i++) {
|
||
var poi = pois[i];
|
||
var location = poi.location || '';
|
||
var longitude = '0';
|
||
var latitude = '0';
|
||
|
||
if (location) {
|
||
var coords = location.split(',');
|
||
if (coords.length >= 2) {
|
||
longitude = coords[0].trim();
|
||
latitude = coords[1].trim();
|
||
}
|
||
}
|
||
|
||
html += '<div class="mytrack-result-item" data-location=\'' + JSON.stringify({
|
||
id: poi.id || '',
|
||
name: poi.name || '<?php _e('未知地点'); ?>',
|
||
address: poi.address || '',
|
||
pname: poi.pname || '',
|
||
cityname: poi.cityname || '',
|
||
adname: poi.adname || '',
|
||
type: poi.type || '',
|
||
tel: poi.tel || '',
|
||
longitude: longitude,
|
||
latitude: latitude
|
||
}) + '\'>';
|
||
html += '<div class="mytrack-result-name">' + (poi.name || '<?php _e('未知地点'); ?>') + '</div>';
|
||
|
||
var addressParts = [];
|
||
if (poi.pname) addressParts.push(poi.pname);
|
||
if (poi.cityname && poi.cityname !== poi.pname) addressParts.push(poi.cityname);
|
||
if (poi.adname && poi.adname !== poi.cityname) addressParts.push(poi.adname);
|
||
if (poi.address) addressParts.push(poi.address);
|
||
|
||
if (addressParts.length > 0) {
|
||
html += '<div class="mytrack-result-address">' + addressParts.join(' · ') + '</div>';
|
||
}
|
||
|
||
var typeName = getTypeName(poi.type);
|
||
html += '<div class="mytrack-result-type">' + typeName + '</div>';
|
||
|
||
html += '</div>';
|
||
}
|
||
|
||
resultsDiv.html(html);
|
||
resultsDiv.show();
|
||
|
||
resultsDiv.find('.mytrack-result-item').on('click', function() {
|
||
var locationData = $(this).data('location');
|
||
if (locationData) {
|
||
selectLocation(locationData);
|
||
}
|
||
});
|
||
|
||
resultsDiv.find('.mytrack-result-item').hover(
|
||
function() {
|
||
$(this).addClass('hover').siblings().removeClass('hover');
|
||
},
|
||
function() {
|
||
$(this).removeClass('hover');
|
||
}
|
||
);
|
||
}
|
||
|
||
function getTypeName(typeCode) {
|
||
var typeMap = {
|
||
"050000": "<?php _e('餐饮'); ?>",
|
||
"060000": "<?php _e('购物'); ?>",
|
||
"070000": "<?php _e('生活'); ?>",
|
||
"080000": "<?php _e('体育'); ?>",
|
||
"090000": "<?php _e('医疗'); ?>",
|
||
"100000": "<?php _e('住宿'); ?>",
|
||
"110000": "<?php _e('风景'); ?>",
|
||
"120000": "<?php _e('商务'); ?>",
|
||
"130000": "<?php _e('政府'); ?>",
|
||
"140000": "<?php _e('交通'); ?>",
|
||
"150000": "<?php _e('教育'); ?>",
|
||
"160000": "<?php _e('金融'); ?>",
|
||
"170000": "<?php _e('公司'); ?>"
|
||
};
|
||
|
||
if (!typeCode) return "<?php _e('其他'); ?>";
|
||
|
||
var mainType = typeCode.substring(0, 2) + "0000";
|
||
return typeMap[mainType] || "<?php _e('其他'); ?>";
|
||
}
|
||
|
||
function displayNoResults(message) {
|
||
var resultsDiv = $('#search-results');
|
||
resultsDiv.html('<div class="mytrack-no-results">' + message + '</div>');
|
||
resultsDiv.show();
|
||
currentResults = [];
|
||
}
|
||
|
||
function showSearchResults() {
|
||
$('#search-results').show();
|
||
}
|
||
|
||
function hideSearchResults() {
|
||
$('#search-results').hide();
|
||
$('.mytrack-result-item').removeClass('hover');
|
||
}
|
||
|
||
function selectLocation(locationData) {
|
||
if (!locationData) return;
|
||
|
||
console.log('选择地点:', locationData);
|
||
|
||
var currentDescription = $('#description').val();
|
||
var currentTags = $('#tags').val();
|
||
var currentDate = $('#date').val();
|
||
var currentArticleCid = $('#article_cid').val();
|
||
var currentUrlLabel = $('#urlLabel').val();
|
||
var currentUrl = $('#url').val();
|
||
var currentPhotos = $('#photos').val();
|
||
var currentLocationType = $('#location_type').val();
|
||
var currentRatingLevel = $('#rating_level').val();
|
||
var currentCategories = $('#categories').val();
|
||
var currentReview = $('#review').val();
|
||
var currentMarkerColor = $('#markerColor').val();
|
||
var currentHighlights = $('#highlights').val();
|
||
var currentRelatedArticles = $('#related_articles').val();
|
||
var currentRelatedArticlesInput = $('#related-articles-input').val();
|
||
|
||
$('#longitude').val(locationData.longitude);
|
||
$('#latitude').val(locationData.latitude);
|
||
$('#name').val(locationData.name || '');
|
||
|
||
var addressParts = [];
|
||
if (locationData.pname) addressParts.push(locationData.pname);
|
||
if (locationData.cityname && locationData.cityname !== locationData.pname) {
|
||
addressParts.push(locationData.cityname);
|
||
}
|
||
if (locationData.adname && locationData.adname !== locationData.cityname) {
|
||
addressParts.push(locationData.adname);
|
||
}
|
||
if (locationData.address) {
|
||
addressParts.push(locationData.address);
|
||
}
|
||
|
||
$('#address').val(addressParts.join(''));
|
||
|
||
if (!currentLocationType && locationData.type) {
|
||
var typeName = getTypeName(locationData.type);
|
||
if (typeName !== "<?php _e('其他'); ?>") {
|
||
$('#location_type').val(typeName);
|
||
}
|
||
}
|
||
|
||
$('#description').val(currentDescription);
|
||
$('#tags').val(currentTags);
|
||
$('#date').val(currentDate);
|
||
$('#article_cid').val(currentArticleCid);
|
||
$('#urlLabel').val(currentUrlLabel);
|
||
$('#url').val(currentUrl);
|
||
$('#photos').val(currentPhotos);
|
||
$('#rating_level').val(currentRatingLevel);
|
||
updateStarRating(currentRatingLevel);
|
||
$('#categories').val(currentCategories);
|
||
$('#review').val(currentReview);
|
||
$('#markerColor').val(currentMarkerColor);
|
||
$('#highlights').val(currentHighlights);
|
||
$('#related_articles').val(currentRelatedArticles);
|
||
$('#related-articles-input').val(currentRelatedArticlesInput);
|
||
|
||
$('.mytrack-categories-option').removeClass('selected');
|
||
if (currentCategories) {
|
||
var categories = currentCategories.split(',');
|
||
categories.forEach(function(category) {
|
||
category = category.trim();
|
||
if (category) {
|
||
$('.mytrack-categories-option[data-value="' + category + '"]').addClass('selected');
|
||
}
|
||
});
|
||
}
|
||
|
||
$('.mytrack-marker-color-option').removeClass('selected');
|
||
if (currentMarkerColor) {
|
||
$('.mytrack-marker-color-option[data-value="' + currentMarkerColor + '"]').addClass('selected');
|
||
}
|
||
|
||
if (currentRelatedArticles) {
|
||
relatedArticles = currentRelatedArticles.split(',').map(function(cid) {
|
||
return cid.trim();
|
||
}).filter(function(cid) {
|
||
return cid !== '' && !isNaN(cid);
|
||
});
|
||
renderRelatedArticlesList();
|
||
}
|
||
|
||
hideSearchResults();
|
||
|
||
setTimeout(function() {
|
||
$('#address').focus();
|
||
}, 100);
|
||
}
|
||
|
||
function initRatingStars() {
|
||
$('#rating-stars .mytrack-star').on('click', function() {
|
||
var rating = $(this).data('value');
|
||
$('#rating_level').val(rating);
|
||
updateStarRating(rating);
|
||
});
|
||
|
||
$('#rating-stars .mytrack-star').on('mouseenter', function() {
|
||
var rating = $(this).data('value');
|
||
updateStarRating(rating);
|
||
}).on('mouseleave', function() {
|
||
var currentRating = $('#rating_level').val() || 0;
|
||
updateStarRating(currentRating);
|
||
});
|
||
}
|
||
|
||
function initCategoriesOptions() {
|
||
$('.mytrack-categories-option').on('click', function() {
|
||
var category = $(this).data('value');
|
||
var currentCategories = $('#categories').val();
|
||
var categories = currentCategories ? currentCategories.split(',') : [];
|
||
|
||
if ($(this).hasClass('selected')) {
|
||
$(this).removeClass('selected');
|
||
var index = categories.indexOf(category);
|
||
if (index > -1) {
|
||
categories.splice(index, 1);
|
||
}
|
||
} else {
|
||
$(this).addClass('selected');
|
||
if (categories.indexOf(category) === -1) {
|
||
categories.push(category);
|
||
}
|
||
}
|
||
|
||
$('#categories').val(categories.join(','));
|
||
});
|
||
}
|
||
|
||
function initMarkerColorOptions() {
|
||
$('#marker-color-options .mytrack-marker-color-option').on('click', function() {
|
||
var color = $(this).data('value');
|
||
$('#marker-color-options .mytrack-marker-color-option').removeClass('selected');
|
||
$(this).addClass('selected');
|
||
$('#markerColor').val(color);
|
||
});
|
||
}
|
||
|
||
$(document).ready(function() {
|
||
initMyTrack();
|
||
});
|
||
|
||
})(jQuery);
|
||
</script>
|
||
|
||
<?php
|
||
include 'footer.php';
|
||
?>
|