This commit is contained in:
ygx
2026-03-29 13:08:11 +08:00
parent 8d1239ee6d
commit 9cee6f290d
3 changed files with 71 additions and 26 deletions

View File

@@ -16,6 +16,8 @@ export interface LoginData {
export interface UserItem {
id?: number
account?: string
password?: string
confirmPassword?: string
name?: string
username?: string
nickname?: string

View File

@@ -204,6 +204,11 @@ import {
} from '@/api/ops/server'
import axios from 'axios'
// 创建独立的 axios 实例用于请求外部 agent绕过全局拦截器
const agentAxios = axios.create({
timeout: 5000,
})
const router = useRouter()
// 状态管理
@@ -290,7 +295,7 @@ const fetchServers = async () => {
const res: any = await fetchServerList(params)
if (res.code === 200 || res.code === 0) {
if (res.code === 0) {
const responseData = res.data || res.details || {}
tableData.value = responseData.data || []
pagination.total = responseData.total || 0
@@ -414,7 +419,7 @@ const handleDelete = async (record: any) => {
onOk: async () => {
try {
const res: any = await deleteServer(record.id)
if (res.code === 200 || res.code === 0) {
if (res.code === 0) {
Message.success('删除成功')
fetchServers()
} else {
@@ -445,33 +450,30 @@ const getAllMetrics = async () => {
} catch (urlError) {
console.warn(`服务器 ${record.name} 的 agent_config 不是合法的 URL:`, metricsUrl)
// 设置默认值 0
record.cpu_state = { value: 0, total: '', used: '' }
record.memory_state = { value: 0, total: '', used: '' }
record.disk_state = { value: 0, total: '', used: '' }
record.cpu_info = { value: 0, total: '', used: '' }
record.memory_info = { value: 0, total: '', used: '' }
record.disk_info = { value: 0, total: '', used: '' }
return
}
// 发送请求获取指标数据
const response = await axios.get(metricsUrl, {
timeout: 5000, // 5 秒超时
})
// 使用独立的 axios 实例请求外部 agent绕过全局拦截器
const response = await agentAxios.get(metricsUrl)
console.log('获取指标数据:', response.data)
if (response.data) {
// 更新记录的监控数据
record.cpu_state = {
value: response.data.cpu_usage || 0,
total: response.data.cpu?.[0]?.cores ? `${response.data.cpu[0].cores}` : '',
record.cpu_info = {
value: Number((response.data.cpu_usage || 0).toFixed(2)),
total: response.data.cpu?.length ? `${response.data.cpu.length}` : '',
used: '',
}
record.memory_state = {
value: response.data.mem_usage?.used_percent || 0,
record.memory_info = {
value: Number((response.data.mem_usage?.used_percent || 0).toFixed(2)),
total: response.data.mem_usage?.total ? `${(response.data.mem_usage.total / 1024 / 1024 / 1024).toFixed(1)}GB` : '',
used: response.data.mem_usage?.used ? `${(response.data.mem_usage.used / 1024 / 1024 / 1024).toFixed(1)}GB` : '',
}
record.disk_state = {
value: response.data.disk_usage?.used_percent || 0,
record.disk_info = {
value: Number((response.data.disk_usage?.used_percent || 0).toFixed(2)),
total: response.data.disk_usage?.total ? `${(response.data.disk_usage.total / 1024 / 1024 / 1024).toFixed(0)}GB` : '',
used: response.data.disk_usage?.used ? `${(response.data.disk_usage.used / 1024 / 1024 / 1024).toFixed(0)}GB` : '',
}
@@ -479,15 +481,15 @@ const getAllMetrics = async () => {
} catch (error) {
console.warn(`获取服务器 ${record.name} 的监控指标失败:`, error)
// 初始化默认值
record.cpu_state = { value: 0, total: '', used: '' }
record.memory_state = { value: 0, total: '', used: '' }
record.disk_state = { value: 0, total: '', used: '' }
record.cpu_info = { value: 0, total: '', used: '' }
record.memory_info = { value: 0, total: '', used: '' }
record.disk_info = { value: 0, total: '', used: '' }
}
} else {
// 没有配置 agent设置默认值
record.cpu_state = { value: 0, total: '', used: '' }
record.memory_state = { value: 0, total: '', used: '' }
record.disk_state = { value: 0, total: '', used: '' }
record.cpu_info = { value: 0, total: '', used: '' }
record.memory_info = { value: 0, total: '', used: '' }
record.disk_info = { value: 0, total: '', used: '' }
}
})

View File

@@ -72,6 +72,20 @@
:disabled="isEdit"
/>
</a-form-item>
<a-form-item v-if="!isEdit" field="password" label="密码" validate-trigger="blur">
<a-input-password
v-model="formData.password"
placeholder="请输入密码"
allow-clear
/>
</a-form-item>
<a-form-item v-if="!isEdit" field="confirmPassword" label="确认密码" validate-trigger="blur">
<a-input-password
v-model="formData.confirmPassword"
placeholder="请再次输入密码"
allow-clear
/>
</a-form-item>
<a-form-item field="name" label="姓名" validate-trigger="blur">
<a-input v-model="formData.name" placeholder="请输入姓名" />
</a-form-item>
@@ -120,6 +134,7 @@
import { ref, reactive, computed, onMounted } from 'vue'
import { Message } from '@arco-design/web-vue'
import type { TableColumnData } from '@arco-design/web-vue/es/table/interface'
import dayjs from 'dayjs'
import SearchTable from '@/components/search-table/index.vue'
import type { FormItem } from '@/components/search-form/types'
import type { UserItem } from '@/api/types'
@@ -180,6 +195,9 @@ const columns: TableColumnData[] = [
title: '创建时间',
dataIndex: 'created_at',
width: 180,
render: ({ record }: any) => {
return record.created_at ? dayjs(record.created_at).format('YYYY-MM-DD HH:mm') : '-'
},
},
{
title: '操作',
@@ -212,18 +230,39 @@ const formRef = ref()
const formData = reactive<UserItem>({
id: undefined,
account: '',
password: '',
confirmPassword: '',
name: '',
email: '',
phone: '',
status: 1,
})
// 确认密码验证
const validateConfirmPassword = (value: string | undefined, callback: (error?: string) => void) => {
if (!value) {
callback('请再次输入密码')
} else if (value !== formData.password) {
callback('两次输入的密码不一致')
} else {
callback()
}
}
// 表单验证规则
const formRules = {
account: [
{ required: true, message: '请输入账号' },
{ minLength: 3, message: '账号至少3个字符' },
],
password: [
{ required: true, message: '请输入密码' },
{ minLength: 6, message: '密码至少6个字符' },
],
confirmPassword: [
{ required: true, message: '请再次输入密码' },
{ validator: validateConfirmPassword },
],
name: [
{ required: true, message: '请输入姓名' },
],
@@ -401,6 +440,8 @@ const resetFormData = () => {
Object.assign(formData, {
id: undefined,
account: '',
password: '',
confirmPassword: '',
name: '',
email: '',
phone: '',