346 lines
8.9 KiB
JavaScript
346 lines
8.9 KiB
JavaScript
import { defineAsyncComponent, h } from 'vue';
|
||
import LucideServer from '~icons/lucide/server';
|
||
import { getTeam } from '../data/team';
|
||
import router from '../router';
|
||
import { icon } from '../utils/components';
|
||
import { duration, planTitle, userCurrency } from '../utils/format';
|
||
import { trialDays } from '../utils/site';
|
||
import { getJobsTab } from './common/jobs';
|
||
import { tagTab } from './common/tags';
|
||
|
||
export default {
|
||
pagetype: 'Jsite Server',
|
||
whitelistedMethods: {
|
||
reboot: 'reboot',
|
||
rename: 'rename',
|
||
dropServer: 'drop_server',
|
||
addTag: 'add_resource_tag',
|
||
removeTag: 'remove_resource_tag'
|
||
},
|
||
list: {
|
||
route: '/jsite-servers',
|
||
title: 'Jsite服务器',
|
||
fields: [
|
||
'name',
|
||
'title',
|
||
'status',
|
||
'region',
|
||
'cpu',
|
||
'memory',
|
||
'disk_size',
|
||
'public_ip',
|
||
'end_date',
|
||
'bandwidth',
|
||
'team',
|
||
'instance_id',
|
||
'order_id',
|
||
'planid',
|
||
'image_id',
|
||
'system'
|
||
],
|
||
filterControls() {
|
||
return [
|
||
{
|
||
type: 'select',
|
||
label: '状态',
|
||
fieldname: 'status',
|
||
options: [
|
||
{ label: '', value: '' },
|
||
{ label: '待处理', value: 'Pending' },
|
||
{ label: '启动中', value: 'Starting' },
|
||
{ label: '运行中', value: 'Running' },
|
||
{ label: '停止中', value: 'Stopping' },
|
||
{ label: '已停止', value: 'Stopped' },
|
||
{ label: '重置中', value: 'Resetting' },
|
||
{ label: '升级中', value: 'Upgrading' },
|
||
{ label: '已禁用', value: 'Disabled' }
|
||
]
|
||
},
|
||
{
|
||
type: 'select',
|
||
label: '区域',
|
||
fieldname: 'region',
|
||
options: [
|
||
{ label: '', value: '' },
|
||
{ label: '华北1(青岛)', value: 'cn-qingdao' },
|
||
{ label: '华北2(北京)', value: 'cn-beijing' },
|
||
{ label: '华北3(张家口)', value: 'cn-zhangjiakou' },
|
||
{ label: '华北5(呼和浩特)', value: 'cn-huhehaote' },
|
||
{ label: '华东1(杭州)', value: 'cn-hangzhou' },
|
||
{ label: '华东2(上海)', value: 'cn-shanghai' },
|
||
{ label: '华南1(深圳)', value: 'cn-shenzhen' },
|
||
{ label: '华南2(河源)', value: 'cn-heyuan' },
|
||
{ label: '西南1(成都)', value: 'cn-chengdu' },
|
||
{ label: '华南3(广州)', value: 'cn-guangzhou' },
|
||
{ label: '华北6(乌兰察布)', value: 'cn-wulanchabu' },
|
||
{ label: '华东5(南京)', value: 'cn-nanjing' },
|
||
{ label: '华东6(福州)', value: 'cn-fuzhou' },
|
||
{ label: '华中1(武汉)', value: 'cn-wuhan-lr' },
|
||
{ label: '中国香港', value: 'cn-hongkong' },
|
||
{ label: '新加坡', value: 'ap-southeast-1' },
|
||
{ label: '马来西亚(吉隆坡)', value: 'ap-southeast-3' },
|
||
{ label: '印度尼西亚(雅加达)', value: 'ap-southeast-5' },
|
||
{ label: '日本(东京)', value: 'ap-northeast-1' },
|
||
{ label: '美国(硅谷)', value: 'us-west-1' },
|
||
{ label: '美国(弗吉尼亚)', value: 'us-east-1' },
|
||
{ label: '德国(法兰克福)', value: 'eu-central-1' },
|
||
{ label: '英国(伦敦)', value: 'eu-west-1' },
|
||
{ label: '菲律宾(马尼拉)', value: 'ap-southeast-6' },
|
||
{ label: '泰国(曼谷)', value: 'ap-southeast-7' },
|
||
{ label: '韩国(首尔)', value: 'ap-northeast-2' }
|
||
]
|
||
}
|
||
];
|
||
},
|
||
orderBy: 'creation desc',
|
||
searchField: 'title',
|
||
columns: [
|
||
{
|
||
label: '服务器',
|
||
fieldname: 'name',
|
||
width: 1.5,
|
||
class: 'font-medium',
|
||
format(value, row) {
|
||
return row.title || value;
|
||
}
|
||
},
|
||
{
|
||
label: '状态',
|
||
fieldname: 'status',
|
||
type: 'Badge',
|
||
width: 0.8,
|
||
format(value) {
|
||
const statusMap = {
|
||
'Pending': '待处理',
|
||
'Starting': '启动中',
|
||
'Running': '运行中',
|
||
'Stopping': '停止中',
|
||
'Stopped': '已停止',
|
||
'Resetting': '重置中',
|
||
'Upgrading': '升级中',
|
||
'Disabled': '已禁用'
|
||
};
|
||
return statusMap[value] || value;
|
||
}
|
||
},
|
||
{
|
||
label: '配置',
|
||
fieldname: 'cpu',
|
||
format(value, row) {
|
||
const cpu = row.cpu || '未知';
|
||
const memory = row.memory || '未知';
|
||
const disk = row.disk_size || '未知';
|
||
return `${cpu}核/${memory}GB/${disk}GB`;
|
||
}
|
||
},
|
||
{
|
||
label: '公网IP',
|
||
fieldname: 'public_ip',
|
||
format(value) {
|
||
return value || '-';
|
||
}
|
||
},
|
||
{
|
||
label: '区域',
|
||
fieldname: 'region',
|
||
format(value) {
|
||
if (!value) return '-';
|
||
|
||
// 区域ID到中文名称的映射表
|
||
const regionMap = {
|
||
'cn-qingdao': '华北1(青岛)',
|
||
'cn-beijing': '华北2(北京)',
|
||
'cn-zhangjiakou': '华北3(张家口)',
|
||
'cn-huhehaote': '华北5(呼和浩特)',
|
||
'cn-hangzhou': '华东1(杭州)',
|
||
'cn-shanghai': '华东2(上海)',
|
||
'cn-shenzhen': '华南1(深圳)',
|
||
'cn-heyuan': '华南2(河源)',
|
||
'cn-chengdu': '西南1(成都)',
|
||
'cn-guangzhou': '华南3(广州)',
|
||
'cn-wulanchabu': '华北6(乌兰察布)',
|
||
'cn-nanjing': '华东5(南京)',
|
||
'cn-fuzhou': '华东6(福州)',
|
||
'cn-wuhan-lr': '华中1(武汉)',
|
||
'cn-hongkong': '中国香港',
|
||
'ap-southeast-1': '新加坡',
|
||
'ap-southeast-3': '马来西亚(吉隆坡)',
|
||
'ap-southeast-5': '印度尼西亚(雅加达)',
|
||
'ap-northeast-1': '日本(东京)',
|
||
'us-west-1': '美国(硅谷)',
|
||
'us-east-1': '美国(弗吉尼亚)',
|
||
'eu-central-1': '德国(法兰克福)',
|
||
'eu-west-1': '英国(伦敦)',
|
||
'ap-southeast-6': '菲律宾(马尼拉)',
|
||
'ap-southeast-7': '泰国(曼谷)',
|
||
'ap-northeast-2': '韩国(首尔)'
|
||
};
|
||
|
||
// 如果是RegionId,返回对应的中文名称;如果已经是中文名称,直接返回
|
||
return regionMap[value] || value;
|
||
}
|
||
},
|
||
{
|
||
label: '到期时间',
|
||
fieldname: 'end_date',
|
||
format(value) {
|
||
if (!value) return '-';
|
||
return value;
|
||
}
|
||
}
|
||
],
|
||
primaryAction({ listResource: jsiteServers }) {
|
||
return {
|
||
label: '新建Jsite服务器',
|
||
icon: 'plus',
|
||
onClick() {
|
||
router.push('/jsite-servers/new');
|
||
}
|
||
};
|
||
},
|
||
statusBadge({ documentResource: jsiteServer }) {
|
||
const status = jsiteServer.pg?.status;
|
||
const statusMap = {
|
||
'Pending': '待处理',
|
||
'Starting': '启动中',
|
||
'Running': '运行中',
|
||
'Stopping': '停止中',
|
||
'Stopped': '已停止',
|
||
'Resetting': '重置中',
|
||
'Upgrading': '升级中',
|
||
'Disabled': '已禁用'
|
||
};
|
||
return {
|
||
label: statusMap[status] || status
|
||
};
|
||
},
|
||
breadcrumbs({ documentResource: jsiteServer }) {
|
||
return [
|
||
{
|
||
label: 'Jsite服务器',
|
||
route: '/jsite-servers'
|
||
},
|
||
{
|
||
label: jsiteServer.pg?.title || jsiteServer.pg?.name,
|
||
route: `/jsite-servers/${jsiteServer.pg?.name}`
|
||
}
|
||
];
|
||
},
|
||
actions({ documentResource: jsiteServer }) {
|
||
if (!jsiteServer) return [];
|
||
|
||
const actions = [
|
||
{
|
||
label: '重启',
|
||
icon: 'refresh-cw',
|
||
onClick() {
|
||
jsiteServer.reboot.submit();
|
||
},
|
||
condition: () => jsiteServer.pg?.status === 'Running'
|
||
},
|
||
{
|
||
label: '重命名',
|
||
icon: 'edit-3',
|
||
onClick() {
|
||
jsiteServer.rename.submit();
|
||
}
|
||
},
|
||
{
|
||
label: '删除',
|
||
icon: 'trash-2',
|
||
onClick() {
|
||
jsiteServer.dropServer.submit();
|
||
},
|
||
condition: () => jsiteServer.pg?.status !== 'Running'
|
||
}
|
||
];
|
||
return actions.filter(action => !action.condition || action.condition());
|
||
}
|
||
},
|
||
detail: {
|
||
route: '/jsite-servers/:name',
|
||
title: 'Jsite服务器详情',
|
||
tabs: [
|
||
{
|
||
label: '概览',
|
||
route: '',
|
||
type: 'Component',
|
||
component: defineAsyncComponent(() => import('../components/JsiteServerOverview.vue')),
|
||
props: jsiteServer => {
|
||
return { server: jsiteServer.pg?.name };
|
||
}
|
||
}
|
||
],
|
||
fields: [
|
||
{
|
||
label: '基本信息',
|
||
fields: [
|
||
'title',
|
||
'status',
|
||
'region',
|
||
'instance_id',
|
||
'order_id'
|
||
]
|
||
},
|
||
{
|
||
label: '服务器配置',
|
||
fields: [
|
||
'cpu',
|
||
'memory',
|
||
'disk_size',
|
||
'bandwidth',
|
||
'public_ip',
|
||
'image_id',
|
||
'planid',
|
||
'system'
|
||
]
|
||
},
|
||
{
|
||
label: 'SSH连接',
|
||
fields: [
|
||
'ssh_user',
|
||
'ssh_port',
|
||
'password',
|
||
'key_pair_name',
|
||
'private_key'
|
||
]
|
||
},
|
||
{
|
||
label: '其他信息',
|
||
fields: [
|
||
'end_date',
|
||
'period'
|
||
]
|
||
}
|
||
],
|
||
actions({ documentResource: jsiteServer }) {
|
||
if (!jsiteServer) return [];
|
||
|
||
return [
|
||
{
|
||
label: '重启',
|
||
icon: 'refresh-cw',
|
||
onClick() {
|
||
jsiteServer.reboot.submit();
|
||
},
|
||
condition: () => jsiteServer.pg?.status === 'Running'
|
||
},
|
||
{
|
||
label: '重命名',
|
||
icon: 'edit-3',
|
||
onClick() {
|
||
jsiteServer.rename.submit();
|
||
}
|
||
},
|
||
{
|
||
label: '删除',
|
||
icon: 'trash-2',
|
||
onClick() {
|
||
jsiteServer.dropServer.submit();
|
||
},
|
||
condition: () => jsiteServer.pg?.status !== 'Running'
|
||
}
|
||
].filter(action => !action.condition || action.condition());
|
||
}
|
||
}
|
||
};
|