| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- <template>
- <div class="page-content server">
- <div class="list">
- <div class="middle">
- <div class="item" v-for="item in serverList" :key="item.name">
- <div class="header">
- <span class="name">{{ item.name }}</span>
- <span class="ip">{{ item.ip }}</span>
- </div>
- <div class="box">
- <div class="left">
- <img src="@imgs/safeguard/server.png" alt="服务器" />
- <ElButtonGroup class="ml-4">
- <ElButton type="primary" size="default">开机</ElButton>
- <ElButton type="danger" size="default">关机</ElButton>
- <ElButton type="warning" size="default">重启</ElButton>
- </ElButtonGroup>
- </div>
- <div class="right">
- <div>
- <p>CPU</p>
- <ElProgress :percentage="item.cup" :text-inside="true" :stroke-width="17" />
- </div>
- <div>
- <p>RAM</p>
- <ElProgress
- :percentage="item.memory"
- status="success"
- :text-inside="true"
- :stroke-width="17"
- />
- </div>
- <div>
- <p>SWAP</p>
- <ElProgress
- :percentage="item.swap"
- status="warning"
- :text-inside="true"
- :stroke-width="17"
- />
- </div>
- <div>
- <p>DISK</p>
- <ElProgress
- :percentage="item.disk"
- status="success"
- :text-inside="true"
- :stroke-width="17"
- />
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </template>
- <script setup lang="ts">
- import { reactive, onMounted, onUnmounted } from 'vue'
- defineOptions({ name: 'SafeguardServer' })
- interface ServerInfo {
- name: string
- ip: string
- cup: number
- memory: number
- swap: number
- disk: number
- }
- const serverList = reactive<ServerInfo[]>([
- {
- name: '开发服务器',
- ip: '192.168.1.100',
- cup: 85,
- memory: 65,
- swap: 45,
- disk: 92
- },
- {
- name: '测试服务器',
- ip: '192.168.1.101',
- cup: 32,
- memory: 78,
- swap: 90,
- disk: 45
- },
- {
- name: '预发布服务器',
- ip: '192.168.1.102',
- cup: 95,
- memory: 42,
- swap: 67,
- disk: 88
- },
- {
- name: '线上服务器',
- ip: '192.168.1.103',
- cup: 58,
- memory: 93,
- swap: 25,
- disk: 73
- }
- ])
- // 生成随机数据的函数
- function generateRandomValue(min = 0, max = 100): number {
- return Math.floor(Math.random() * (max - min + 1)) + min
- }
- // 更新服务器数据
- function updateServerData() {
- serverList.forEach((server) => {
- server.cup = generateRandomValue()
- server.memory = generateRandomValue()
- server.swap = generateRandomValue()
- server.disk = generateRandomValue()
- })
- }
- // 修改 timer 类型为 number | null
- let timer: number | null = null
- onMounted(() => {
- timer = window.setInterval(updateServerData, 3000)
- })
- onUnmounted(() => {
- if (timer !== null) {
- window.clearInterval(timer)
- timer = null
- }
- })
- </script>
- <style lang="scss" scoped>
- .server {
- .list {
- width: 100%;
- .middle {
- display: flex;
- flex-wrap: wrap;
- width: calc(100% + 20px);
- .item {
- box-sizing: border-box;
- width: calc(50% - 20px);
- margin: 0 20px 20px 0;
- border: 1px solid var(--el-border-color-light);
- border-radius: 4px;
- .header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 20px;
- border-bottom: 1px solid var(--el-border-color-light);
- .name {
- font-size: 15px;
- font-weight: 500;
- }
- .ip {
- font-size: 14px;
- color: var(--el-text-color-secondary);
- }
- }
- .box {
- display: flex;
- align-items: center;
- padding: 40px;
- .left {
- margin: 0 40px;
- img {
- display: block;
- width: 190px;
- }
- .el-button-group {
- display: flex;
- justify-content: center;
- margin-top: -10px;
- }
- }
- .right {
- flex: 1;
- margin-top: 5px;
- > div {
- margin: 15px 0;
- p {
- margin-bottom: 4px;
- font-size: 14px;
- }
- }
- }
- }
- }
- }
- }
- }
- @media (max-width: $device-notebook) {
- .server {
- .list {
- .middle {
- .item {
- .header {
- padding: 10px 20px;
- }
- .box {
- padding: 20px;
- .left {
- margin: 0 20px 0 0;
- }
- .right {
- margin-top: 0;
- }
- }
- }
- }
- }
- }
- }
- @media (max-width: $device-ipad-pro) {
- .server {
- .list {
- .middle {
- .item {
- width: 100%;
- }
- }
- }
- }
- }
- @media (max-width: $device-phone) {
- .server {
- .list {
- .middle {
- .item {
- width: 100%;
- .header {
- padding: 10px 20px;
- }
- .box {
- display: block;
- padding: 20px;
- .left {
- margin: 0;
- img {
- width: 150px;
- margin: 0 auto;
- }
- .el-button-group {
- margin-top: 10px;
- }
- }
- .right {
- margin-top: 30px;
- }
- }
- }
- }
- }
- }
- }
- </style>
|