ostool-server 0.2.1

Server for managing development boards, serial sessions, and TFTP artifacts
<script setup lang="ts">
import { computed, watch } from "vue";
import { RouterLink, RouterView, useRoute } from "vue-router";

import NoticeBanner from "@/components/NoticeBanner.vue";
import { useUiStore } from "@/stores/ui";

const route = useRoute();
const ui = useUiStore();

watch(
  () => route.meta.title,
  (title) => {
    ui.setTitle((title as string | undefined) ?? "管理台");
    document.title = `${ui.title} - ostool-server`;
  },
  { immediate: true },
);

const navItems = computed(() => [
  { to: "/overview", label: "总览" },
  { to: "/boards", label: "开发板" },
  { to: "/dtbs", label: "DTB 管理" },
  { to: "/sessions", label: "会话租约" },
  { to: "/tftp", label: "TFTP 配置" },
  { to: "/server", label: "Server 配置" },
]);
</script>

<template>
  <div class="app-shell">
    <aside class="sidebar">
      <div class="brand">
        <span class="brand-mark">OS</span>
        <div>
          <h1>ostool-server</h1>
          <p>开发板管理台</p>
        </div>
      </div>
      <nav class="nav-list" aria-label="主导航">
        <RouterLink
          v-for="item in navItems"
          :key="item.to"
          :to="item.to"
          class="nav-link"
          active-class="is-active"
        >
          {{ item.label }}
        </RouterLink>
      </nav>
    </aside>
    <div class="app-content">
      <header class="topbar">
        <div>
          <h2>{{ ui.title }}</h2>
        </div>
      </header>

      <main class="page-body">
        <NoticeBanner
          v-if="ui.successMessage"
          tone="success"
          :message="ui.successMessage"
        />
        <NoticeBanner
          v-if="ui.errorMessage"
          tone="error"
          :message="ui.errorMessage"
        />
        <RouterView />
      </main>
    </div>
  </div>
</template>