2022-08-29 21:43:24 +08:00
|
|
|
<template>
|
2022-10-26 20:49:29 +08:00
|
|
|
<div id="terminalRecDialog">
|
2023-09-07 16:33:53 +08:00
|
|
|
<el-dialog
|
|
|
|
|
:title="title"
|
|
|
|
|
v-if="dialogVisible"
|
|
|
|
|
v-model="dialogVisible"
|
|
|
|
|
:before-close="handleClose"
|
|
|
|
|
:close-on-click-modal="false"
|
|
|
|
|
:destroy-on-close="true"
|
|
|
|
|
width="70%"
|
|
|
|
|
>
|
2022-10-26 20:49:29 +08:00
|
|
|
<div class="toolbar">
|
|
|
|
|
<el-select @change="getUsers" v-model="operateDate" placeholder="操作日期" filterable>
|
|
|
|
|
<el-option v-for="item in operateDates" :key="item" :label="item" :value="item"> </el-option>
|
|
|
|
|
</el-select>
|
|
|
|
|
<el-select class="ml10" @change="getRecs" filterable v-model="user" placeholder="请选择操作人">
|
|
|
|
|
<el-option v-for="item in users" :key="item" :label="item" :value="item"> </el-option>
|
|
|
|
|
</el-select>
|
|
|
|
|
<el-select class="ml10" @change="playRec" filterable v-model="rec" placeholder="请选择操作记录">
|
|
|
|
|
<el-option v-for="item in recs" :key="item" :label="item" :value="item"> </el-option>
|
|
|
|
|
</el-select>
|
|
|
|
|
<el-divider direction="vertical" border-style="dashed" />
|
|
|
|
|
快捷键-> space[空格键]: 暂停/播放
|
|
|
|
|
</div>
|
|
|
|
|
<div ref="playerRef" id="rc-player"></div>
|
|
|
|
|
</el-dialog>
|
2022-08-29 21:43:24 +08:00
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
2022-10-29 20:08:15 +08:00
|
|
|
<script lang="ts" setup>
|
|
|
|
|
import { toRefs, watch, ref, reactive } from 'vue';
|
2022-08-29 21:43:24 +08:00
|
|
|
import { machineApi } from './api';
|
|
|
|
|
import * as AsciinemaPlayer from 'asciinema-player';
|
|
|
|
|
import 'asciinema-player/dist/bundle/asciinema-player.css';
|
2022-10-26 20:49:29 +08:00
|
|
|
|
2022-10-29 20:08:15 +08:00
|
|
|
const props = defineProps({
|
|
|
|
|
visible: { type: Boolean },
|
|
|
|
|
machineId: { type: Number },
|
|
|
|
|
title: { type: String },
|
2023-07-06 20:59:22 +08:00
|
|
|
});
|
2022-08-29 21:43:24 +08:00
|
|
|
|
2023-07-06 20:59:22 +08:00
|
|
|
const emit = defineEmits(['update:visible', 'cancel', 'update:machineId']);
|
2022-08-29 21:43:24 +08:00
|
|
|
|
2022-10-29 20:08:15 +08:00
|
|
|
const playerRef = ref(null);
|
|
|
|
|
const state = reactive({
|
|
|
|
|
dialogVisible: false,
|
|
|
|
|
title: '',
|
|
|
|
|
machineId: 0,
|
|
|
|
|
operateDates: [],
|
|
|
|
|
users: [],
|
|
|
|
|
recs: [],
|
|
|
|
|
operateDate: '',
|
|
|
|
|
user: '',
|
|
|
|
|
rec: '',
|
|
|
|
|
});
|
2022-08-29 21:43:24 +08:00
|
|
|
|
2023-07-06 20:59:22 +08:00
|
|
|
const { dialogVisible, title, operateDates, operateDate, users, recs, user, rec } = toRefs(state);
|
2022-08-29 21:43:24 +08:00
|
|
|
|
2022-10-29 20:08:15 +08:00
|
|
|
watch(props, async (newValue: any) => {
|
|
|
|
|
const visible = newValue.visible;
|
|
|
|
|
if (visible) {
|
|
|
|
|
state.machineId = newValue.machineId;
|
|
|
|
|
state.title = newValue.title;
|
|
|
|
|
await getOperateDate();
|
|
|
|
|
}
|
|
|
|
|
state.dialogVisible = visible;
|
|
|
|
|
});
|
2022-08-29 21:43:24 +08:00
|
|
|
|
2022-10-29 20:08:15 +08:00
|
|
|
const getOperateDate = async () => {
|
|
|
|
|
const res = await machineApi.recDirNames.request({ path: state.machineId });
|
|
|
|
|
state.operateDates = res as any;
|
|
|
|
|
};
|
2022-08-29 21:43:24 +08:00
|
|
|
|
2022-10-29 20:08:15 +08:00
|
|
|
const getUsers = async (operateDate: string) => {
|
|
|
|
|
state.users = [];
|
|
|
|
|
state.user = '';
|
|
|
|
|
state.recs = [];
|
|
|
|
|
state.rec = '';
|
|
|
|
|
const res = await machineApi.recDirNames.request({ path: `${state.machineId}/${operateDate}` });
|
|
|
|
|
state.users = res as any;
|
|
|
|
|
};
|
2022-08-29 21:43:24 +08:00
|
|
|
|
2022-10-29 20:08:15 +08:00
|
|
|
const getRecs = async (user: string) => {
|
|
|
|
|
state.recs = [];
|
|
|
|
|
state.rec = '';
|
|
|
|
|
const res = await machineApi.recDirNames.request({ path: `${state.machineId}/${state.operateDate}/${user}` });
|
|
|
|
|
state.recs = res as any;
|
|
|
|
|
};
|
2022-08-29 21:43:24 +08:00
|
|
|
|
2022-10-29 20:08:15 +08:00
|
|
|
let player: any = null;
|
|
|
|
|
|
|
|
|
|
const playRec = async (rec: string) => {
|
|
|
|
|
if (player) {
|
|
|
|
|
player.dispose();
|
|
|
|
|
}
|
|
|
|
|
const content = await machineApi.recDirNames.request({
|
|
|
|
|
isFile: '1',
|
|
|
|
|
path: `${state.machineId}/${state.operateDate}/${state.user}/${rec}`,
|
|
|
|
|
});
|
|
|
|
|
player = AsciinemaPlayer.create(`data:text/plain;base64,${content}`, playerRef.value, {
|
|
|
|
|
autoPlay: true,
|
|
|
|
|
speed: 1.0,
|
|
|
|
|
idleTimeLimit: 2,
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 关闭取消按钮触发的事件
|
|
|
|
|
*/
|
|
|
|
|
const handleClose = () => {
|
|
|
|
|
emit('update:visible', false);
|
|
|
|
|
emit('update:machineId', null);
|
|
|
|
|
emit('cancel');
|
|
|
|
|
state.operateDates = [];
|
|
|
|
|
state.users = [];
|
|
|
|
|
state.recs = [];
|
|
|
|
|
state.operateDate = '';
|
|
|
|
|
state.user = '';
|
|
|
|
|
state.rec = '';
|
|
|
|
|
};
|
2022-08-29 21:43:24 +08:00
|
|
|
</script>
|
2022-10-26 20:49:29 +08:00
|
|
|
<style lang="scss">
|
|
|
|
|
#terminalRecDialog {
|
|
|
|
|
.el-overlay .el-overlay-dialog .el-dialog .el-dialog__body {
|
|
|
|
|
padding: 0px !important;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</style>
|