优化搜索结果

This commit is contained in:
NewName
2025-05-20 17:30:25 +08:00
parent 64acfaa212
commit a79adc66ba
2 changed files with 83 additions and 9 deletions

View File

@@ -123,22 +123,32 @@
.result-meta {
display: flex;
justify-content: space-between;
align-items: center;
align-items: flex-start;
font-size: 0.9rem;
color: var(--fontcolor);
opacity: 0.8;
margin-top: 15px;
flex-wrap: wrap;
gap: 10px;
}
.meta-stats {
display: flex;
align-items: center;
gap: 15px;
flex-wrap: wrap;
}
.meta-pulls {
font-size: 0.85rem;
color: #666;
text-align: right;
}
.meta-pulls .pulls-count {
font-size: 1rem;
color: #333;
margin-top: 4px;
}
.badge {
@@ -378,6 +388,18 @@
.back-to-search:hover {
text-decoration: underline;
}
@media (max-width: 768px) {
.result-meta {
flex-direction: column;
align-items: flex-start;
}
.meta-pulls {
text-align: left;
width: 100%;
}
}
</style>
</head>
<body>
@@ -536,7 +558,25 @@
if (!dateString) return '未知时间';
const date = new Date(dateString);
if (isNaN(date.getTime())) return '未知时间';
if (isNaN(date.getTime())) {
// 尝试解析其他日期格式
const formats = [
'YYYY-MM-DD',
'YYYY/MM/DD',
'MM/DD/YYYY',
'DD/MM/YYYY'
];
for (const format of formats) {
const d = tryParseDate(dateString, format);
if (d && !isNaN(d.getTime())) {
date = d;
break;
}
}
if (isNaN(date.getTime())) return '未知时间';
}
const now = new Date();
const diffTime = Math.abs(now - date);
@@ -546,6 +586,7 @@
const diffMonths = Math.floor(diffDays / 30);
const diffYears = Math.floor(diffDays / 365);
if (diffMinutes < 5) return '几秒前';
if (diffMinutes < 60) return `${diffMinutes}分钟前`;
if (diffHours < 24) return `${diffHours}小时前`;
if (diffDays < 7) return `${diffDays}天前`;
@@ -554,6 +595,21 @@
return `${diffYears}年前`;
}
function tryParseDate(dateString, format) {
const parts = dateString.split(/[-/]/);
const formatParts = format.split(/[-/]/);
const dateObj = {};
for (let i = 0; i < formatParts.length; i++) {
const part = formatParts[i].toUpperCase();
if (part === 'YYYY') dateObj.year = parseInt(parts[i]);
else if (part === 'MM') dateObj.month = parseInt(parts[i]) - 1;
else if (part === 'DD') dateObj.day = parseInt(parts[i]);
}
return new Date(dateObj.year, dateObj.month, dateObj.day);
}
function displayResults(results) {
const resultsContainer = document.getElementById('searchResults');
resultsContainer.innerHTML = '';
@@ -563,6 +619,14 @@
return;
}
// 对结果进行排序:官方镜像优先,然后按照拉取次数排序
results.sort((a, b) => {
if (a.is_official !== b.is_official) {
return b.is_official - a.is_official;
}
return b.pull_count - a.pull_count;
});
results.forEach(result => {
const card = document.createElement('div');
card.className = 'result-card';
@@ -597,14 +661,14 @@
</div>
${pullsLastWeek > 0 ? `
<div class="meta-pulls">
<span class="meta-item">本周拉取: ${formatNumber(pullsLastWeek)}</span>
<div>本周拉取次数</div>
<div class="pulls-count">${formatNumber(pullsLastWeek)}</div>
</div>
` : ''}
</div>
`;
card.addEventListener('click', () => {
console.log('点击仓库:', name);
currentRepo = result;
loadTags(result.is_official ? 'library' : (result.repo_owner || ''), name);
});

View File

@@ -258,7 +258,7 @@ func RegisterSearchRoute(r *gin.Engine) {
// 如果是搜索官方镜像
if !strings.Contains(query, "/") {
query = "library/" + query
query = strings.ToLower(query)
}
fmt.Printf("搜索请求: query=%s, page=%d, pageSize=%d\n", query, page, pageSize)
@@ -270,12 +270,22 @@ func RegisterSearchRoute(r *gin.Engine) {
return
}
// 处理官方镜像的情况
for i := range result.Results {
if result.Results[i].IsOfficial {
result.Results[i].Name = strings.TrimPrefix(result.Results[i].Name, "library/")
// 过滤搜索结果,只保留相关的镜像
filteredResults := make([]Repository, 0)
searchTerm := strings.ToLower(strings.TrimPrefix(query, "library/"))
for _, repo := range result.Results {
repoName := strings.ToLower(repo.Name)
// 如果是精确匹配或者以搜索词开头,或者包含 "searchTerm/searchTerm"
if repoName == searchTerm ||
strings.HasPrefix(repoName, searchTerm+"/") ||
strings.Contains(repoName, "/"+searchTerm) {
filteredResults = append(filteredResults, repo)
}
}
result.Results = filteredResults
result.Count = len(filteredResults)
c.JSON(http.StatusOK, result)
})