docs(guide): 更新常见问题解答

- 新增 ping 域名的故障排查步骤
- 添加查看容器日志的方法
- 补充 IPv6网络配置的说明
This commit is contained in:
xiaojunnuo
2025-05-15 21:54:20 +08:00
parent d9a9f1c25c
commit 06f8514bc1
9 changed files with 85 additions and 80 deletions
@@ -18,11 +18,11 @@ interface Props {
}
defineOptions({
name: "LayoutHeader"
name: "LayoutHeader",
});
withDefaults(defineProps<Props>(), {
theme: "light"
theme: "light",
});
const emit = defineEmits<{ clearPreferencesAndLogout: [] }>();
@@ -39,42 +39,42 @@ const rightSlots = computed(() => {
if (preferences.widget.globalSearch) {
list.push({
index: REFERENCE_VALUE,
name: "global-search"
name: "global-search",
});
}
if (preferencesButtonPosition.value.header) {
list.push({
index: REFERENCE_VALUE + 10,
name: "preferences"
name: "preferences",
});
}
if (preferences.widget.themeToggle) {
list.push({
index: REFERENCE_VALUE + 20,
name: "theme-toggle"
name: "theme-toggle",
});
}
if (preferences.widget.languageToggle) {
list.push({
index: REFERENCE_VALUE + 30,
name: "language-toggle"
name: "language-toggle",
});
}
if (preferences.widget.fullscreen) {
list.push({
index: REFERENCE_VALUE + 40,
name: "fullscreen"
name: "fullscreen",
});
}
if (preferences.widget.notification) {
list.push({
index: REFERENCE_VALUE + 50,
name: "notification"
name: "notification",
});
}
Object.keys(slots).forEach((key) => {
Object.keys(slots).forEach(key => {
const name = key.split("-");
if (key.startsWith("header-right")) {
list.push({ index: Number(name[2]), name: key });
@@ -89,11 +89,11 @@ const leftSlots = computed(() => {
if (preferences.widget.refresh) {
list.push({
index: 0,
name: "refresh"
name: "refresh",
});
}
Object.keys(slots).forEach((key) => {
Object.keys(slots).forEach(key => {
const name = key.split("-");
if (key.startsWith("header-left")) {
list.push({ index: Number(name[2]), name: key });
@@ -108,7 +108,7 @@ function clearPreferencesAndLogout() {
</script>
<template>
<template v-for="slot in leftSlots.filter((item) => item.index < REFERENCE_VALUE)" :key="slot.name">
<template v-for="slot in leftSlots.filter(item => item.index < REFERENCE_VALUE)" :key="slot.name">
<slot :name="slot.name">
<template v-if="slot.name === 'refresh'">
<VbenIconButton class="my-0 mr-1 rounded-md" @click="refresh">
@@ -120,7 +120,7 @@ function clearPreferencesAndLogout() {
<div class="flex-center hidden lg:block">
<slot name="breadcrumb"></slot>
</div>
<template v-for="slot in leftSlots.filter((item) => item.index > REFERENCE_VALUE)" :key="slot.name">
<template v-for="slot in leftSlots.filter(item => item.index > REFERENCE_VALUE)" :key="slot.name">
<slot :name="slot.name"></slot>
</template>
<div :class="`menu-align-${preferences.header.menuAlign}`" class="flex h-full min-w-0 flex-1 items-center">
@@ -9,15 +9,15 @@ import { preferences, updatePreferences } from "/@/vben/preferences";
import { VbenDropdownRadioMenu, VbenIconButton } from "/@/vben//shadcn-ui";
defineOptions({
name: "LanguageToggle"
name: "LanguageToggle",
});
async function handleUpdate(value: string) {
const locale = value as SupportedLanguagesType;
updatePreferences({
app: {
locale
}
locale,
},
});
await loadLocaleMessages(locale);
}
@@ -11,11 +11,11 @@ interface Props {
}
defineOptions({
name: "ThemeToggleButton"
name: "ThemeToggleButton",
});
const props = withDefaults(defineProps<Props>(), {
type: "normal"
type: "normal",
});
const isDark = defineModel<boolean>();
@@ -29,13 +29,13 @@ const bindProps = computed(() => {
return type === "normal"
? {
variant: "heavy" as const
variant: "heavy" as const,
}
: {
class: "rounded-full",
size: "icon" as const,
style: { padding: "7px" },
variant: "icon" as const
variant: "icon" as const,
};
});
@@ -59,12 +59,12 @@ function toggleTheme(event: MouseEvent) {
const clipPath = [`circle(0px at ${x}px ${y}px)`, `circle(${endRadius}px at ${x}px ${y}px)`];
document.documentElement.animate(
{
clipPath: isDark.value ? [...clipPath].reverse() : clipPath
clipPath: isDark.value ? [...clipPath].reverse() : clipPath,
},
{
duration: 450,
easing: "ease-in",
pseudoElement: isDark.value ? "::view-transition-old(root)" : "::view-transition-new(root)"
pseudoElement: isDark.value ? "::view-transition-old(root)" : "::view-transition-new(root)",
}
);
});
@@ -10,16 +10,16 @@ import { ToggleGroup, ToggleGroupItem, VbenTooltip } from "/@/vben//shadcn-ui";
import ThemeButton from "./theme-button.vue";
defineOptions({
name: "ThemeToggle"
name: "ThemeToggle",
});
withDefaults(defineProps<{ shouldOnHover?: boolean }>(), {
shouldOnHover: false
shouldOnHover: false,
});
function handleChange(isDark: boolean) {
updatePreferences({
theme: { mode: isDark ? "dark" : "light" }
theme: { mode: isDark ? "dark" : "light" },
});
}
@@ -29,18 +29,18 @@ const PRESETS = [
{
icon: Sun,
name: "light",
title: $t("preferences.theme.light")
title: $t("preferences.theme.light"),
},
{
icon: MoonStar,
name: "dark",
title: $t("preferences.theme.dark")
title: $t("preferences.theme.dark"),
},
{
icon: SunMoon,
name: "auto",
title: $t("preferences.followSystem")
}
title: $t("preferences.followSystem"),
},
];
</script>
<template>
@@ -49,7 +49,7 @@ const PRESETS = [
<template #trigger>
<ThemeButton :model-value="isDark" type="icon" @update:model-value="handleChange" />
</template>
<ToggleGroup :model-value="preferences.theme.mode" class="gap-2" type="single" variant="outline" @update:model-value="(val) => updatePreferences({ theme: { mode: val as ThemeModeType } })">
<ToggleGroup :model-value="preferences.theme.mode" class="gap-2" type="single" variant="outline" @update:model-value="val => updatePreferences({ theme: { mode: val as ThemeModeType } })">
<ToggleGroupItem v-for="item in PRESETS" :key="item.name" :value="item.name">
<component :is="item.icon" class="size-5" />
</ToggleGroupItem>