1
0
mirror of https://github.com/ZeroCatDev/Classworks.git synced 2025-10-22 02:03:10 +00:00
Classworks/src/components/settings/cards/CloudNamespaceInfoCard.vue
copilot-swe-agent[bot] 92a2019566 Use kvToken instead of siteKey in examschedule button cloud URL
Co-authored-by: Sunwuyuan <88357633+Sunwuyuan@users.noreply.github.com>
2025-10-14 10:21:58 +00:00

244 lines
6.5 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<v-card
class="my-4"
:loading="loading"
:disabled="!hasNamespaceInfo"
>
<template #loader>
<v-progress-linear
v-if="loading"
indeterminate
color="primary"
/>
</template>
<v-card-title>
<v-icon class="me-2">
mdi-cloud-check
</v-icon>
设备信息
</v-card-title>
<v-card-text v-if="hasNamespaceInfo">
<!-- 用户信息与头像 -->
<div
v-if="namespaceInfo.account"
class="d-flex align-center mb-4"
>
<v-card
border
hover
class="w-100"
variant="tonal"
:prepend-avatar="namespaceInfo.account.avatarUrl"
:title="namespaceInfo.account.name || '未命名用户'"
:subtitle="
'此设备由贵校管理 管理员账号 ID: ' + namespaceInfo.account.id
"
>
<v-card-text>
此设备由贵校或贵单位管理该管理员系此空间所有者如有疑问请咨询他对于恶意绑定滥用行为请反馈
</v-card-text>
</v-card>
</div>
<!-- 设备信息卡片 -->
<v-card
v-if="namespaceInfo.device"
variant="tonal"
class="mb-4"
border
hover
>
<v-card-title class="pb-1">
设备信息
</v-card-title>
<v-card-text>
<div class="d-flex flex-column gap-1">
<div class="d-flex align-center">
<v-icon
size="small"
class="me-2"
>
mdi-tag
</v-icon>
<span class="font-weight-medium me-2">设备名称:</span>
<span>{{ namespaceInfo.device.name || "未命名设备" }}</span>
</div>
<div class="d-flex align-center">
<v-icon
size="small"
class="me-2"
>
mdi-identifier
</v-icon>
<span class="font-weight-medium me-2">设备 ID:</span>
<span>{{ namespaceInfo.device.id }}</span>
</div>
<div class="d-flex align-center">
<v-icon
size="small"
class="me-2"
>
mdi-uuid
</v-icon>
<span class="font-weight-medium me-2">UUID:</span>
<span class="text-truncate">{{
namespaceInfo.device.uuid || "未知"
}}</span>
</div>
<div class="d-flex align-center">
<v-icon
size="small"
class="me-2"
>
mdi-calendar
</v-icon>
<span class="font-weight-medium me-2">创建时间:</span>
<span>{{ formatDate(namespaceInfo.device.createdAt) }}</span>
</div>
<div
v-if="namespaceInfo.device.updatedAt"
class="d-flex align-center"
>
<v-icon
size="small"
class="me-2"
>
mdi-calendar-clock
</v-icon>
<span class="font-weight-medium me-2">更新时间:</span>
<span>{{ formatDate(namespaceInfo.device.updatedAt) }}</span>
</div>
</div>
</v-card-text>
</v-card><v-card
title="Classworks KV"
subtitle="云原生键值数据库"
border
hover
>
<v-card-text>
Classworks KV
是厚浪云推出的云原生键值数据库其是一个开放的云应用平台为各种应用提供存储服务此设备正在使用其服务如果您希望管理设备信息请前往
Classworks KV
的网站如果您在服务推出前就在使用 Classworks您的数据已被自动迁移
<br><br>Classworks KV 的全域管理员是 <a
href="https://wuyuan.dev"
target="_blank"
>孙悟元</a>
</v-card-text><v-card-actions>
<v-btn
href="https://kv.wuyuan.dev"
class="text-none"
append-icon="mdi-open-in-new"
target="_blank"
>
前往 Classworks KV
</v-btn>
</v-card-actions>
</v-card>
</v-card-text>
<v-card-text v-else>
<v-alert
type="info"
variant="tonal"
>
<v-alert-title>未获取到设备信息</v-alert-title>
<p>您尚未完成云端存储授权或连接失败请点击下方按钮进行初始化</p>
</v-alert>
</v-card-text>
<v-card-actions>
<v-spacer />
<v-btn
color="primary"
variant="outlined"
:loading="loading"
@click="reloadInfo"
>
刷新设备信息
</v-btn>
<v-btn
color="primary"
@click="reinitializeCloudStorage"
>
重新初始化云端存储
</v-btn>
</v-card-actions>
</v-card>
</template>
<script>
import { kvServerProvider } from "@/utils/providers/kvServerProvider";
export default {
name: "CloudNamespaceInfoCard",
props: {
visible: {
type: Boolean,
default: true,
},
},
data() {
return {
namespaceInfo: {},
loading: false,
hasNamespaceInfo: false,
};
},
watch: {
visible(newVal) {
if (newVal === true) {
this.fetchNamespaceInfo();
}
},
},
mounted() {
if (this.visible) {
this.fetchNamespaceInfo();
}
},
methods: {
formatDate(dateString) {
if (!dateString) return "未知";
try {
const date = new Date(dateString);
return date.toLocaleString("zh-CN");
} catch {
return dateString;
}
},
async fetchNamespaceInfo() {
this.loading = true;
try {
const response = await kvServerProvider.loadNamespaceInfo();
this.namespaceInfo = response;
this.hasNamespaceInfo = true;
this.loading = false;
} catch (e) {
console.error("获取命名空间信息失败:", e);
this.hasNamespaceInfo = false;
this.namespaceInfo = {};
} finally {
this.loading = false;
}
},
async reloadInfo() {
await this.fetchNamespaceInfo();
},
reinitializeCloudStorage() {
// 触发 KvInitialize 组件的重新初始化
try {
window.dispatchEvent(new CustomEvent("kvinit:open"));
} catch (e) {
console.error("重新初始化云端存储失败:", e);
}
},
},
};
</script>