目前Typecho的后台面板即便官方1.3.0依旧没有进行美化(轻量博客系统,也是合理之中)。于是,参考mx-space系统的后台面板界面进行制作适合现代化的后台面板插件:Vue3Admin













usr/plugins/Vue3Admin/。启用后插件会自动:
admin/ 到站点根目录:/Vue3Admin/。config.inc.php 内的 __TYPECHO_ADMIN_DIR__ 为 /Vue3Admin/,从而“弃用”旧的 /admin/。完成后请通过 https://你的域名/Vue3Admin/ 访问新后台。
修改config.inc.php文件中的:
如果后台出现域名被截断,补齐域名即可,目前没有解决这个问题。
为了避免把后台面板请求计入统计,并兼容一些缓存/静态化场景,推荐在主题的 footer.php(或页面底部公共文件,建议放在 </body> 前)添加以下代码:
其他说明:
path)、文章 ID(cid,仅文章页)、访问设备(由 UA 解析)、访问时间(服务端时间)。/Vue3Admin/track.php(插件启用后会自动部署)。CF-Connecting-IP / X-Forwarded-For / X-Real-IP 等请求头。在插件设置中可配置:
https://unpkg.com/。ECharts CDN:默认使用 https://cdn.jsdelivr.net/。

如站点环境无法访问外网 CDN,请替换为自建静态资源地址。
1.2.3版本之前(不包括1.2.3版本):插件会自动创建/升级数据表(表前缀统一使用 v3a_,实际表名会拼接 Typecho 表前缀,例如 typecho_v3a_visit_log)。
注:后续会将数据库转本地文件存储,避免数据库操作复杂或者其他安全问题。
1.2.3版本开始替换本地数据,之前的版本如何迁移数据?
可以通过维护/升级底部的旧数据迁移进行删除旧数据库、然后生成目前本地数据(如图)

请下载>=1.1.0版本!
在后台面板的左侧栏中,底部维护下拉菜单有升级页面,点击进入,右上角的蓝色下载图标按钮就是升级按钮。
必要的时候可以设置升级决策:
/Vue3Admin/(无需停用/启用插件)。
在插件管理中停用 Vue3Admin 后:
__TYPECHO_ADMIN_DIR__ 改回 /admin/(恢复默认后台路径)。可选操作(手动):
/Vue3Admin/。
如果无法正常卸载,请数据库操作:
typecho_options表中的plugins替换为:
参考文章:Typecho不用进入后台如何关闭已启用的插件 | 大鱼博客
config.inc.php,并在首次改写时自动备份到 config.inc.php.vue3admin.bak。config.inc.php 具备写权限,否则启用会失败。比如出现Cannot write config.inc.php: /var/www/html/config.inc.php报错。config.inc.php 中的 __TYPECHO_ADMIN_DIR__ 恢复为 /admin/,或用备份文件回滚。基于 GitHub Commit 记录与当前代码调用点整理(持续补充):
mx-space / mx-admin
Typecho
Vue.js(Vue 3)
Apache Software Foundation – Apache ECharts
ECharts WordCloud
Vditor
CodeMirror(CodeMirror 6)
PHPMailer
jQuery Foundation – jQuery
jQuery UI
DOMPurify
HyperDown
PageDown
Normalize.css
Lucide – Lucide Icons
ShouTuTa(守兔塔)插件联动
AbuseIPDB
Gravatar
感谢所有开源项目与服务的支持 ❤️

// admin directory (relative path)
define('__TYPECHO_ADMIN_DIR__', '/Vue3Admin/');
<!-- Vue3Admin 访客统计:仅前台(不含后台面板) -->
<script>
(function () {
try {
var endpoint = "<?php echo \Typecho\Common::url('Vue3Admin/track.php', $this->options->siteUrl); ?>";
var payload = {
path: location.pathname + location.search,
cid: <?php echo $this->is('post') && isset($this->cid) ? (int) $this->cid : 0; ?>,
referrer: document.referrer || ""
};
var body = JSON.stringify(payload);
if (navigator.sendBeacon) {
navigator.sendBeacon(endpoint, new Blob([body], { type: "application/json" }));
return;
}
fetch(endpoint, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: body,
keepalive: true,
credentials: "omit"
}).catch(function () {});
} catch (e) {}
})();
</script>
a:0:{}