导入 AKSRT 主题开发源码

This commit is contained in:
Claude Code committed 2026-07-03 22:50:34 +08:00
1 parent 9681dd3d48
commit 1268a55dd0
595 files changed
+127705

No files matched your search

+354
View File
@@ -0,0 +1,354 @@
<template>
<div class="aksrt-page-container">
<PageHeader title="文档中心" desc="主题使用文档、开发指南、迁移说明和更新日志。" />
<!-- Docs Mode Status -->
<n-card class="aksrt-docs__section" size="small">
<div class="aksrt-docs__mode-status">
<div class="aksrt-docs__mode-info">
<FaIcon :icon="docsModeEnabled ? 'fas fa-book-open' : 'fas fa-book'" :size="18" :color="docsModeEnabled ? '#52c41a' : '#8a909c'" />
<div>
<strong>{{ docsModeEnabled ? '文档模式已启用' : '文档模式未启用' }}</strong>
<p>{{ docsModeEnabled ? '文档导航页面和文档站式侧边栏已激活' : '启用后将激活文档导航页面模板和文档站式侧边栏' }}</p>
</div>
</div>
<n-space>
<router-link to="/extensions/docs-mode" class="aksrt-docs__mode-link">
<FaIcon icon="fas fa-cog" :size="12" />
{{ docsModeEnabled ? '管理文档模式' : '启用文档模式' }}
</router-link>
</n-space>
</div>
</n-card>
<!-- Doc Pages Overview -->
<n-card title="文档页面" size="small" class="aksrt-docs__section">
<n-alert v-if="docPageCount === 0" type="info" size="small">
尚未创建文档页面。在 WordPress 后台新建页面时,选择"文档导航页"或"专题聚合页"模板。
</n-alert>
<n-grid v-else :cols="3" :x-gap="12" :y-gap="12">
<n-grid-item v-for="stat in docPageStats" :key="stat.key">
<div class="aksrt-docs__stat">
<FaIcon :icon="stat.icon" :size="16" :color="stat.color" />
<div>
<strong>{{ stat.value }}</strong>
<p>{{ stat.label }}</p>
</div>
</div>
</n-grid-item>
</n-grid>
</n-card>
<!-- Quick Actions -->
<n-card title="常用操作" size="small" class="aksrt-docs__section">
<n-grid :cols="2" :x-gap="12" :y-gap="12">
<n-grid-item>
<div class="aksrt-docs__action">
<FaIcon icon="fas fa-palette" :size="16" />
<div>
<strong>全局设置</strong>
<p>Logo、背景、菜单装饰、自定义代码</p>
<router-link to="/global/common">前往配置 →</router-link>
</div>
</div>
</n-grid-item>
<n-grid-item>
<div class="aksrt-docs__action">
<FaIcon icon="fas fa-home" :size="16" />
<div>
<strong>首页配置</strong>
<p>首页模块、布局、排序和预设模板</p>
<router-link to="/page-display/homepage">前往配置 →</router-link>
</div>
</div>
</n-grid-item>
<n-grid-item>
<div class="aksrt-docs__action">
<FaIcon icon="fas fa-users" :size="16" />
<div>
<strong>用户管理</strong>
<p>登录注册、OAuth、签到、积分</p>
<router-link to="/users/auth">前往配置 →</router-link>
</div>
</div>
</n-grid-item>
<n-grid-item>
<div class="aksrt-docs__action">
<FaIcon icon="fas fa-tools" :size="16" />
<div>
<strong>系统工具</strong>
<p>导入导出、健康检查、迁移状态</p>
<router-link to="/tools/import-export">前往配置 →</router-link>
</div>
</div>
</n-grid-item>
</n-grid>
</n-card>
<!-- Reference Docs -->
<div class="aksrt-docs__grid">
<n-card
v-for="doc in docs"
:key="doc.key"
class="aksrt-docs__card"
size="small"
hoverable
@click="openDoc(doc)"
>
<div class="aksrt-docs__card-inner">
<div class="aksrt-docs__card-icon" :style="{ background: doc.color }">
<FaIcon :icon="doc.icon" :size="20" color="#fff" />
</div>
<div class="aksrt-docs__card-body">
<h4 class="aksrt-docs__card-title">{{ doc.title }}</h4>
<p class="aksrt-docs__card-desc">{{ doc.description }}</p>
</div>
<FaIcon icon="fas fa-external-link-alt" :size="12" class="aksrt-docs__card-arrow" />
</div>
</n-card>
</div>
<!-- Version Info -->
<n-card title="当前版本" size="small" class="aksrt-docs__section">
<n-descriptions :column="2" bordered label-placement="left" size="small">
<n-descriptions-item label="主题版本">
<n-tag type="success" size="small">{{ themeVersion }}</n-tag>
</n-descriptions-item>
<n-descriptions-item label="Schema 版本">
<n-tag type="info" size="small">{{ dbSchemaVersion }}</n-tag>
</n-descriptions-item>
</n-descriptions>
</n-card>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import PageHeader from '@/components/PageHeader.vue'
import FaIcon from '@/components/form/FaIcon.vue'
import api from '@/api/index.js'
const themeVersion = ref(window.aksrtAdminData?.themeVersion || '3.4.0-dev')
const dbSchemaVersion = ref('—')
const docsModeEnabled = ref(false)
const docPageCount = ref(0)
const docPageStats = ref([
{ key: 'total', icon: 'fas fa-file-alt', color: '#1890ff', value: 0, label: '文档页面' },
{ key: 'nav', icon: 'fas fa-sitemap', color: '#722ed1', value: 0, label: '导航页' },
{ key: 'special', icon: 'fas fa-layer-group', color: '#fa8c16', value: 0, label: '专题页' },
])
const docs = ref([
{ key: 'admin-ia-map', title: '后台 IA 蓝图', description: '完整的后台信息架构映射,12 个顶级分区及子页面清单。', icon: 'fas fa-sitemap', color: '#1890ff', file: 'admin-ia-map.md' },
{ key: 'zibll-gap-matrix', title: '对标差异矩阵', description: 'AKSRT 当前 → Zibll 参考 → AKSRT 目标三层对照表。', icon: 'fas fa-columns', color: '#722ed1', file: 'zibll-gap-matrix.md' },
{ key: 'frontend-page-matrix', title: '前端页面矩阵', description: '前端模板、CSS、JS 资产映射与覆盖范围。', icon: 'fas fa-desktop', color: '#13c2c2', file: 'frontend-page-matrix.md' },
{ key: 'manual-acceptance-baseline', title: '验收基线', description: '每个 Phase 的人工验收标准和检查清单。', icon: 'fas fa-clipboard-check', color: '#52c41a', file: 'manual-acceptance-baseline.md' },
{ key: 'feature-domain-map', title: '功能域地图', description: '业务域划分、依赖关系和模块边界说明。', icon: 'fas fa-map', color: '#fa8c16', file: 'feature-domain-map.md' },
{ key: 'migration-map', title: '迁移地图', description: '设置 key 迁移、旧选项兼容和 Schema 版本对照。', icon: 'fas fa-exchange-alt', color: '#eb2f96', file: 'migration-map.md' },
])
onMounted(async () => {
try {
const res = await api.getSchemaPage('extensions', 'docs-mode')
if (res?.data) {
docsModeEnabled.value = !!res.data.docs_mode_enabled
}
} catch {
// Schema endpoint may not exist yet
}
// Fetch doc page stats via REST if available
try {
const statsRes = await api.request('/docs/stats')
if (statsRes?.data) {
docPageCount.value = statsRes.data.total || 0
docPageStats.value[0].value = statsRes.data.total || 0
docPageStats.value[1].value = statsRes.data.nav_count || 0
docPageStats.value[2].value = statsRes.data.special_count || 0
}
} catch {
// Endpoint may not exist yet
}
// Fetch schema version from health
try {
const healthRes = await api.getHealthCheck()
if (healthRes?.data) {
dbSchemaVersion.value = healthRes.data.db_schema_version || '—'
}
} catch {
// Endpoint may not exist yet
}
})
function openDoc(doc) {
// Link to local docs directory (admin can open in new tab)
const base = window.aksrtAdminData?.siteUrl || window.location.origin
window.open(`${base}/wp-content/themes/AKSRT-theme/docs/${doc.file}`, '_blank')
}
</script>
<style scoped>
.aksrt-docs__mode-status {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
}
.aksrt-docs__mode-info {
display: flex;
align-items: center;
gap: 12px;
}
.aksrt-docs__mode-info strong {
display: block;
font-size: 14px;
color: #1a1a2e;
}
.aksrt-docs__mode-info p {
margin: 2px 0 0;
font-size: 12px;
color: #8a909c;
}
.aksrt-docs__mode-link {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 6px 14px;
border-radius: 6px;
background: #f5f7fa;
color: #1890ff;
text-decoration: none;
font-size: 13px;
transition: background 0.2s;
}
.aksrt-docs__mode-link:hover {
background: #e6f4ff;
}
.aksrt-docs__stat {
display: flex;
align-items: center;
gap: 10px;
padding: 12px;
border-radius: 6px;
background: #fafafa;
}
.aksrt-docs__stat strong {
display: block;
font-size: 20px;
color: #1a1a2e;
}
.aksrt-docs__stat p {
margin: 0;
font-size: 12px;
color: #8a909c;
}
.aksrt-docs__grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
gap: 12px;
margin-bottom: 16px;
}
.aksrt-docs__card {
cursor: pointer;
transition: box-shadow 0.2s;
}
.aksrt-docs__card:hover {
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
}
.aksrt-docs__card-inner {
display: flex;
align-items: center;
gap: 12px;
}
.aksrt-docs__card-icon {
flex-shrink: 0;
width: 40px;
height: 40px;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
}
.aksrt-docs__card-body {
flex: 1;
min-width: 0;
}
.aksrt-docs__card-title {
margin: 0 0 2px;
font-size: 14px;
font-weight: 600;
color: #1a1a2e;
}
.aksrt-docs__card-desc {
margin: 0;
font-size: 12px;
color: #8a909c;
line-height: 1.5;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.aksrt-docs__card-arrow {
flex-shrink: 0;
color: #c0c4cc;
}
.aksrt-docs__section {
margin-bottom: 16px;
}
.aksrt-docs__action {
display: flex;
gap: 12px;
align-items: flex-start;
padding: 12px;
border-radius: 6px;
background: #fafafa;
}
.aksrt-docs__action i {
color: #1890ff;
margin-top: 2px;
}
.aksrt-docs__action strong {
display: block;
font-size: 14px;
color: #1a1a2e;
margin-bottom: 2px;
}
.aksrt-docs__action p {
margin: 0 0 4px;
font-size: 12px;
color: #8a909c;
}
.aksrt-docs__action a {
font-size: 12px;
color: #1890ff;
text-decoration: none;
}
.aksrt-docs__action a:hover {
text-decoration: underline;
}
</style>