release: v2.0 - 完整功能管理系统

主要功能:
- 完整的Flask-Admin后台管理系统
- 网站/标签/新闻管理功能
- 用户登录认证系统
- 科技感/未来风UI设计
- 标签分类系统(取代传统分类)
- 详情页面展示
- 数据库迁移脚本
- 书签导入解析工具

技术栈:
- Flask + SQLAlchemy
- Flask-Admin管理界面
- Bootstrap 4响应式设计
- 用户认证与权限管理

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Jowe
2025-12-28 19:21:17 +08:00
parent 2fbca6ebc7
commit 9e47ebe749
49 changed files with 6274 additions and 1353 deletions

View File

@@ -106,6 +106,82 @@
</div>
</section>
{% endif %}
<!-- Related News -->
{% if news_list %}
<section>
<h3 class="text-xl font-bold text-white mb-4 flex items-center gap-2">
<span class="material-symbols-outlined text-secondary\">newspaper</span>
相关新闻
</h3>
<div class="grid gap-4">
{% for news in news_list %}
<a class="group block p-5 rounded-xl border border-border-dark bg-surface-dark/40 hover:bg-border-dark/60 hover:border-primary/30 transition-all" href="{{ news.url if news.url else '#' }}" {{ 'target=\"_blank\"' if news.url else '' }}>
<div class="flex justify-between items-start mb-2">
{% if news.news_type == 'Product Update' %}
<span class="inline-flex items-center px-2 py-0.5 rounded text-[10px] font-bold uppercase tracking-wider bg-primary/10 text-primary">{{ news.news_type }}</span>
{% elif news.news_type == 'Industry News' %}
<span class="inline-flex items-center px-2 py-0.5 rounded text-[10px] font-bold uppercase tracking-wider bg-purple-500/10 text-purple-400">{{ news.news_type }}</span>
{% else %}
<span class="inline-flex items-center px-2 py-0.5 rounded text-[10px] font-bold uppercase tracking-wider bg-gray-500/10 text-gray-400">{{ news.news_type }}</span>
{% endif %}
<span class="text-xs text-gray-400">
{% set days_ago = (now() - news.published_at).days %}
{% if days_ago == 0 %}
今天
{% elif days_ago == 1 %}
1天前
{% elif days_ago < 7 %}
{{ days_ago }}天前
{% else %}
{{ news.published_at.strftime('%Y年%m月%d日') }}
{% endif %}
</span>
</div>
<h4 class="text-white font-bold text-base group-hover:text-primary transition-colors mb-2">{{ news.title }}</h4>
<p class="text-sm text-gray-400 line-clamp-2">{{ news.content }}</p>
</a>
{% endfor %}
</div>
</section>
{% endif %}
<!-- Similar Recommendations -->
{% if recommended_sites %}
<section>
<h3 class="text-xl font-bold text-white mb-4 flex items-center gap-2">
<span class="material-symbols-outlined text-primary">auto_awesome</span>
同类工具推荐
</h3>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
{% for rec_site in recommended_sites %}
<a class="flex flex-col p-4 rounded-xl border border-border-dark bg-surface-dark hover:border-primary/50 hover:shadow-[0_0_20px_-10px_rgba(37,192,244,0.3)] transition-all group h-full" href="{{ url_for('site_detail', slug=rec_site.slug) }}">
<div class="flex items-start justify-between mb-3">
{% if rec_site.logo %}
<div class="size-10 rounded-lg bg-cover bg-center shadow-lg" style="background-image: url('{{ rec_site.logo }}');"></div>
{% else %}
<div class="size-10 rounded-lg bg-gradient-to-br from-primary to-secondary flex items-center justify-center shadow-lg">
<span class="text-white font-bold text-lg">{{ rec_site.name[0] }}</span>
</div>
{% endif %}
<div class="size-8 rounded-full bg-border-dark/50 flex items-center justify-center text-gray-400 group-hover:text-white group-hover:bg-primary group-hover:scale-110 transition-all">
<span class="material-symbols-outlined text-[18px]">arrow_forward</span>
</div>
</div>
<div>
<h4 class="text-white font-bold mb-1">{{ rec_site.name }}</h4>
<p class="text-xs text-gray-400 line-clamp-2 mb-3">{{ rec_site.short_desc or '暂无描述' }}</p>
<div class="flex gap-2 flex-wrap">
{% for tag in rec_site.tags[:2] %}
<span class="px-2 py-1 rounded bg-border-dark text-[10px] text-gray-400 font-medium">{{ tag.name }}</span>
{% endfor %}
</div>
</div>
</a>
{% endfor %}
</div>
</section>
{% endif %}
</div>
</div>