feat: 分类系统 + 标签系统 — Phase 4 完成

分类:Model/Repo/Service/Controller + 管理后台树形页面 + 首页导航栏
标签:Model/Repo/Service/Controller + /tags/{slug} 落地页 + 写文章页输入
Post 加 CategoryID,Create/Update 支持分类和标签
SQL 迁移含 categories/tags/post_tags 表及预设未分类
This commit is contained in:
2026-06-22 00:30:29 +08:00
parent 977c52513a
commit 0b8f6f890d
30 changed files with 988 additions and 13 deletions

View File

@ -423,6 +423,32 @@
}
.announcement-error .announcement-title { color: #dc2626; }
/* --- Category Nav --- */
.category-nav {
max-width: 900px;
margin: 0 auto 1.5rem;
padding: 0 16px;
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.category-tag {
padding: 4px 14px;
border-radius: 20px;
font-size: 13px;
color: #4b5563;
background: #f3f4f6;
text-decoration: none;
transition: all .15s;
}
.category-tag:hover,
.category-tag.active {
background: var(--color-accent);
color: #fff;
}
/* ---------- Responsive ---------- */
@media (max-width: 960px) {
.home-grid {

View File

@ -190,6 +190,8 @@ async function handleSubmit(e) {
const reprintSource = document.getElementById('reprintSource')?.value.trim() || ''
const declaration = document.getElementById('declaration')?.value || ''
const reprintProhibited = document.getElementById('reprintProhibited')?.checked || false
const categoryId = document.getElementById('categoryId')?.value || ''
const tags = document.getElementById('tagInput')?.value.trim() || ''
const isEdit = !!postId
const url = isEdit ? '/api/studio/posts/' + postId : '/api/studio/posts'
@ -207,6 +209,8 @@ async function handleSubmit(e) {
reprint_source: reprintSource,
declaration,
reprint_prohibited: reprintProhibited,
category_id: categoryId,
tags,
}),
})
const data = await resp.json()