Files
console-dev/app/components/home/HomeExpiringPanel.vue
T

273 lines
9.5 KiB
Vue

<script>
/** 首页到期提醒:查询未来 7 天内实例,按 due_time 升序展示最多 5 台,并再次过滤请求期间已到期的记录。 */
import "~/assets/styles/HomeExpiringPanel.Ckflw2Hv.css";
import { toDisplayString } from "vue";
import { renderList } from "vue";
import { onMounted } from "vue";
import { createBlock } from "vue";
import { ref } from "vue";
import { withCtx } from "vue";
import { createElementBlock } from "vue";
import { Fragment } from "vue";
import { createElementVNode } from "vue";
import { createTextVNode } from "vue";
import { unref } from "vue";
import { defineComponent } from "vue";
import { createVNode } from "vue";
import { openBlock } from "vue";
import { NuxtLink } from "#components";
import { useApi } from "~/lib/auth.js";
import { t as _plugin_vue_export_helper_t } from "~/lib/_plugin-vue_export-helper.js";
import { r as dict_r } from "~/lib/dict.js";
import ListEmpty from "~/components/ListEmpty.vue";
import skeleton from "primevue/skeleton";
var b = {
class: `home-card`,
},
x = {
key: 0,
class: `home-list`,
},
S = {
key: 3,
class: `home-list`,
},
C = {
class: `home-row-main`,
},
w = {
class: `home-row-title col-mono`,
},
T = {
class: `home-row-sub`,
},
E = {
class: `due-badge`,
},
D = 7,
O = 5,
k = Object.assign(
_plugin_vue_export_helper_t(
defineComponent({
__name: `HomeExpiringPanel`,
setup(d) {
let g = useApi(),
k = ref([]),
A = ref(!0),
j = ref(``);
// 分页收集到足够实例或达到返回总量后停止;最后按到期时间排序并裁剪,不把全部资源一次塞入首页。
onMounted(async () => {
try {
let e = Math.floor(Date.now() / 1e3),
t = e + D * 86400,
n = [],
r = 1,
i = 0;
for (; n.length < O;) {
let a = await g.get(`/host`, {
page: r,
limit: 100,
orderby: `due_time`,
sort: `asc`,
start_time: e,
end_time: t,
}),
o = a.list ?? [];
if (
(n.push(
...o.filter(
(e) =>
Number(e.due_time) > Date.now() / 1e3 &&
Number(e.due_time) <= t,
),
),
(i += o.length),
!o.length ||
(a.count === void 0
? o.length < 100
: i >= Number(a.count)))
)
break;
r++;
}
k.value = n
.filter((e) => Number(e.due_time) > Date.now() / 1e3)
.sort((e, t) => Number(e.due_time) - Number(t.due_time))
.slice(0, O);
} catch (e) {
j.value = e instanceof Error ? e.message : `到期实例加载失败`;
} finally {
A.value = !1;
}
});
// 秒级到期时间转毫秒后向上取整为提示天数,不修改真实计费截止时间。
function M(e) {
return e ? Math.ceil((e * 1e3 - Date.now()) / 864e5) : 0;
}
// 骨架、错误、空态与有效实例互斥展示;列表每行进入实例详情。
return (n, i) => {
let d = skeleton,
h = ListEmpty,
g = NuxtLink;
return (
openBlock(),
createElementBlock(`div`, b, [
createElementVNode(
`div`,
{
class: `home-card-head`,
},
[
(i[0] ||= createElementVNode(
`div`,
{
class: `home-card-title`,
},
[
createElementVNode(`i`, {
class: `pi pi-clock`,
}),
createTextVNode(`到期提醒`),
],
-1,
)),
createElementVNode(
`span`,
{
class: `home-card-more`,
},
toDisplayString(D) + ` 天内`,
),
],
),
unref(A)
? (openBlock(),
createElementBlock(`div`, x, [
(openBlock(),
createElementBlock(
Fragment,
null,
renderList(2, (e) =>
createElementVNode(
`div`,
{
key: e,
class: `home-row-skeleton`,
},
[
createVNode(d, {
height: `14px`,
width: `50%`,
}),
createVNode(d, {
height: `12px`,
width: `30%`,
style: {
"margin-top": `8px`,
},
}),
],
),
),
64,
)),
]))
: unref(j)
? (openBlock(),
createBlock(
h,
{
key: 1,
icon: `pi pi-exclamation-circle`,
title: `加载失败`,
description: unref(j),
},
null,
8,
[`description`],
))
: unref(k).length
? (openBlock(),
createElementBlock(`div`, S, [
(openBlock(!0),
createElementBlock(
Fragment,
null,
renderList(
unref(k),
(t) => (
openBlock(),
createBlock(
g,
{
key: t.id,
to: `/servers/server?id=${t.id}`,
class: `home-row`,
},
{
default: withCtx(() => [
createElementVNode(`div`, C, [
createElementVNode(
`div`,
w,
toDisplayString(t.name),
1,
),
createElementVNode(
`div`,
T,
`到期 ` +
toDisplayString(
(`formatTime` in n
? n.formatTime
: unref(dict_r))(t.due_time),
),
1,
),
]),
createElementVNode(
`span`,
E,
toDisplayString(M(t.due_time)) +
` 天后 `,
1,
),
]),
_: 2,
},
1032,
[`to`],
)
),
),
128,
)),
]))
: (openBlock(),
createBlock(
h,
{
key: 2,
icon: `pi pi-check-circle`,
title: `暂无即将到期的实例`,
description: `${D} 天内有实例到期时会在这里提醒你`,
},
null,
8,
[`description`],
)),
])
);
};
},
}),
[[`__scopeId`, `data-v-9017f053`]],
),
{
__name: `HomeExpiringPanel`,
},
);
export {};
export default k;
</script>