优化页面

This commit is contained in:
lj124 2026-04-17 19:48:34 +08:00
parent a9d50669a8
commit 146b071737
6 changed files with 1202 additions and 1176 deletions

145
PAGE_OPTIMIZATION_GUIDE.md Normal file
View File

@ -0,0 +1,145 @@
# 页面布局优化指南
## 已优化的页面
- CIDList.vue ✓
- UserList.vue ✓
- DeviceList.vue ✓
## 优化模式
所有页面都应该遵循以下布局模式:
### 1. 导入图标组件
```javascript
import { Refresh, Plus, Edit, Delete } from "@element-plus/icons-vue";
export default {
components: {
Refresh,
Plus,
Edit,
Delete
}
}
```
### 2. 模板结构
```vue
<template>
<div class="page-container">
<el-card class="page-card" shadow="never">
<template #header>
<div class="card-header">
<div class="header-left">
<span class="page-title">页面标题</span>
</div>
<div class="header-actions">
<el-button type="primary" @click="addDialogVisible = true" :icon="Plus">
添加
</el-button>
<el-button @click="getData()" :icon="Refresh">
刷新
</el-button>
</div>
</div>
</template>
<div class="table-wrapper">
<el-table :data="tableData" style="width: 100%" stripe>
<el-table-column prop="ID" label="ID" width="80"></el-table-column>
<el-table-column prop="Name" label="名称" min-width="150"></el-table-column>
<!-- 更多列... -->
<el-table-column label="操作" width="280" fixed="right">
<template #default="scope">
<el-button type="primary" size="small" @click="edit(scope.$index)" :icon="Edit">
编辑
</el-button>
<el-button type="danger" size="small" @click="delete(scope.$index)" :icon="Delete">
删除
</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-card>
<!-- 对话框... -->
</div>
</template>
```
### 3. 样式
```vue
<style scoped>
.page-container {
width: 100%;
height: 100%;
}
.page-card {
height: 100%;
display: flex;
flex-direction: column;
border: none;
border-radius: 8px;
}
.page-card :deep(.el-card__body) {
flex: 1;
overflow: hidden;
padding: 20px;
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.page-title {
font-size: 18px;
font-weight: 600;
color: #303133;
}
.header-actions {
display: flex;
align-items: center;
gap: 12px;
}
.table-wrapper {
height: 100%;
overflow: auto;
}
.table-wrapper :deep(.el-table) {
border-radius: 4px;
}
.dialog-footer {
display: flex;
justify-content: flex-end;
gap: 12px;
}
</style>
```
## 待优化的页面列表
- VideoList.vue
- FileList.vue
- ShellList.vue
- CIDLog.vue
- Group.vue
- Chat.vue
- Im.vue
- 其他 views/ 目录下的页面
## 优化要点
1. ✅ 使用 el-card 包裹整个页面
2. ✅ 标题和操作按钮放在卡片头部
3. ✅ 表格使用 min-width 自适应宽度
4. ✅ 操作按钮添加图标
5. ✅ 对话框样式优化
6. ✅ 移除旧的 Menu 组件引用
7. ✅ 充分利用页面空间,消除右侧空白

71
src/assets/page.css Normal file
View File

@ -0,0 +1,71 @@
.page-container {
width: 100%;
height: 100%;
}
.page-card {
height: 100%;
display: flex;
flex-direction: column;
border: none;
border-radius: 8px;
}
.page-card :deep(.el-card__body) {
flex: 1;
overflow: hidden;
padding: 20px;
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.header-left {
display: flex;
align-items: center;
}
.page-title {
font-size: 18px;
font-weight: 600;
color: #303133;
}
.header-actions {
display: flex;
align-items: center;
gap: 12px;
}
.table-wrapper {
height: 100%;
overflow: auto;
}
.table-wrapper :deep(.el-table) {
border-radius: 4px;
}
.form-dialog {
padding: 10px 0;
}
.dialog-footer {
display: flex;
justify-content: flex-end;
gap: 12px;
}
.search-bar {
margin-bottom: 16px;
padding: 16px;
background: #f5f7fa;
border-radius: 4px;
}
.search-bar :deep(.el-form-item) {
margin-bottom: 0;
}

View File

@ -7,17 +7,25 @@ import { addCIDService } from "@/api/cid.js";
import { deleteCIDService } from "@/api/cid.js";
import { updateCIDService,getCIDRuningListService } from "@/api/cid.js";
import router from "@/router/index.js";
import { VideoPlay, Plus, Refresh, Edit, Delete, Document, View } from "@element-plus/icons-vue";
import {ElMessage, ElLoading} from "element-plus";
export default {
components: {
VideoPlay,
Plus,
Refresh,
Edit,
Delete,
Document,
View
},
data() {
return {
tableLoading: false,
ip: "",
tableData: [],
timer: null, //
timer: null,
tokenData: {
server: localStorage.getItem("cid_server") || "gep.ljsea.xyz",
token: localStorage.getItem("token"),
@ -61,15 +69,12 @@ export default {
},
watch: {
// runningDialogVisible
runningDialogVisible(newVal) {
if (newVal) {
//
this.timer = setInterval(() => {
this.GetCIDRuningList();
}, 1000);
} else {
//
if (this.timer) {
clearInterval(this.timer);
this.timer = null;
@ -78,8 +83,6 @@ export default {
}
},
// methods
//
methods: {
async getCIDList() {
this.tableLoading = true;
@ -104,7 +107,6 @@ export default {
alert("页码发生变化" + val);
},
//
async runCID(index) {
const loading = ElLoading.service({
lock: true,
@ -138,7 +140,6 @@ export default {
router.push("/cidlog");
},
async deleteCID(index) {
//
if (!confirm("是否删除")) {
return;
}
@ -158,7 +159,6 @@ export default {
var d_re = await deleteCIDService(delete_data);
if (d_re.code == 0) {
ElMessage.success("删除成功");
//
this.getCIDList();
} else {
ElMessage.error("操作失败");
@ -176,9 +176,9 @@ export default {
this.updateForm.url = this.tableData[index].Url;
this.updateForm.script = this.tableData[index].Script;
this.updateForm.time = this.tableData[index].Time;
this.updateForm.cidtoken = this.tableData[index].Token;
this.updateForm.cidtoken = this.tableData[index].Token;
this.updateForm.id = id;
this.updateDialogVisible= true;
this.updateDialogVisible = true;
},
async addCID() {
this.addDialogVisible = false;
@ -193,7 +193,14 @@ export default {
result = await addCIDService(this.addForm);
if (result.code == 0) {
ElMessage.success("添加成功");
this.getCIDList()
this.getCIDList();
this.addForm = {
name: "",
time: 0,
url: "",
script: "",
token: localStorage.getItem("token"),
};
} else {
ElMessage.error("添加失败");
}
@ -217,7 +224,7 @@ export default {
result = await updateCIDService(this.updateForm);
if (result.code == 0) {
ElMessage.success("修改成功");
this.getCIDList()
this.getCIDList();
} else {
ElMessage.error("修改失败");
}
@ -242,7 +249,7 @@ export default {
ElMessage.error("获取失败");
}
}catch(e){
console.log(e)
console.log(e);
}
},
async getIpClient() {
@ -250,14 +257,13 @@ export default {
const response = await axios.get("https://ipinfo.io/json");
this.ip = response.data.ip;
localStorage.setItem("ip", this.ip);
//console.log(response);
} catch (error) {
console.error(error);
}
},
handleServerChange(){
localStorage.setItem("cid_server", this.tokenData.server);
this.getCIDList()
this.getCIDList();
},
handleMenuSelect(val) {
router.push(val);
@ -265,7 +271,6 @@ export default {
toVideoList() {
router.push("/videoList");
},
//
tableRowClassName({ row, rowIndex }) {
if (row.human === 1) {
return {
@ -277,19 +282,15 @@ export default {
},
},
//
//
async mounted() {
let now = new Date();
if (localStorage.getItem("token") === null) {
router.push("/login");
}
// console.log("mounted");
this.getIpClient();
this.getCIDList();
},
//
beforeUnmount() {
if (this.timer) {
clearInterval(this.timer);
@ -300,254 +301,296 @@ export default {
</script>
<template>
<div>
<el-container style="min-height: calc(100vh - 40px); background: #fff; border-radius: 4px;">
<el-header style="font-size: 40px; background-color: rgb(238, 241, 246)"
>集成部署项目</el-header
<div class="page-container">
<el-card class="page-card" shadow="never">
<template #header>
<div class="card-header">
<div class="header-left">
<span class="page-title">集成部署项目</span>
</div>
<div class="header-actions">
<el-select
allow-create
filterable
v-model="tokenData.server"
@change="handleServerChange"
class="server-select"
placeholder="选择服务器"
>
<el-option
v-for="item in server_list"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
<el-button type="primary" @click="GetCIDRuningList()">
<el-icon><VideoPlay /></el-icon>
正在运行
</el-button>
<el-button type="primary" @click="addDialogVisible = true">
<el-icon><Plus /></el-icon>
添加项目
</el-button>
<el-button @click="getCIDList()">
<el-icon><Refresh /></el-icon>
刷新
</el-button>
</div>
</div>
</template>
<div class="table-wrapper">
<el-table
:data="tableData"
v-loading="tableLoading"
stripe
style="width: 100%"
:row-class-name="tableRowClassName"
>
<el-table-column prop="ID" label="ID" width="80"></el-table-column>
<el-table-column prop="Name" label="名称" min-width="150"></el-table-column>
<el-table-column prop="Url" label="仓库地址" min-width="200" show-overflow-tooltip></el-table-column>
<el-table-column prop="Script" label="脚本消息" min-width="200" show-overflow-tooltip></el-table-column>
<el-table-column prop="Token" label="回调Token" width="120" show-overflow-tooltip></el-table-column>
<el-table-column prop="last_success" label="上次成功" width="180" show-overflow-tooltip></el-table-column>
<el-table-column label="操作" width="280" fixed="right">
<template #default="scope">
<el-button
type="primary"
size="small"
@click.prevent="runCID(scope.$index)"
:icon="VideoPlay"
>运行</el-button>
<el-button
type="primary"
size="small"
@click.prevent="updateButtonCID(scope.$index)"
:icon="Edit"
>修改</el-button>
<el-button
type="danger"
size="small"
@click.prevent="deleteCID(scope.$index)"
:icon="Delete"
>删除</el-button>
<el-button
type="info"
size="small"
@click.prevent="toRunCIDLog(scope.$index)"
:icon="Document"
>日志</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-card>
<el-dialog
v-model="addDialogVisible"
title="添加集成项目"
width="60%"
:close-on-click-modal="false"
>
<el-form
ref="addFormRef"
:model="addForm"
label-width="100px"
class="form-dialog"
>
<el-container>
<el-main>
<!-- 表单 -->
<el-form :inline="true" :model="tokenData" class="demo-form-inline">
<el-form-item>
<el-button
class="el-button--danger"
type="primary"
@click="getCIDList()"
>查询</el-button
>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="addDialogVisible = true"
>添加集成项目</el-button
>
</el-form-item>
<el-form-item>
<el-select allow-create filterable v-model="tokenData.server" @change="handleServerChange">
<el-option
v-for="item in server_list"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
<el-form-item label="项目名称">
<el-input
v-model="addForm.name"
placeholder="请输入项目名称"
></el-input>
</el-form-item>
<el-form-item label="仓库地址">
<el-input
v-model="addForm.url"
placeholder="请输入仓库地址"
></el-input>
</el-form-item>
<el-form-item label="定时执行时间">
<el-select v-model="addForm.time" placeholder="选择时间" style="width: 200px; margin-right: 12px;">
<el-option label="30秒" :value="30"></el-option>
<el-option label="1分钟" :value="60"></el-option>
<el-option label="1小时" :value="3600"></el-option>
<el-option label="1天" :value="86400"></el-option>
</el-select>
<span>或自定义时间</span>
<el-input-number
v-model="addForm.time"
:min="1"
placeholder="秒"
></el-input-number>
</el-form-item>
<el-form-item label="脚本内容">
<el-input
type="textarea"
v-model="addForm.script"
placeholder="请输入脚本内容"
:rows="6"
/>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="addDialogVisible = false">取消</el-button>
<el-button type="primary" @click="addCID()">确定</el-button>
</div>
</template>
</el-dialog>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="GetCIDRuningList()"
>正在运行</el-button
>
</el-form-item>
<el-dialog
v-model="updateDialogVisible"
title="修改集成项目"
width="60%"
:close-on-click-modal="false"
>
<el-form
ref="updateFormRef"
:model="updateForm"
label-width="120px"
class="form-dialog"
>
<el-form-item label="项目名称">
<el-input
v-model="updateForm.name"
placeholder="请输入项目名称"
></el-input>
</el-form-item>
<el-form-item label="仓库地址">
<el-input
v-model="updateForm.url"
placeholder="请输入仓库地址"
></el-input>
</el-form-item>
<el-form-item label="脚本内容">
<el-input
type="textarea"
v-model="updateForm.script"
placeholder="请输入脚本内容"
:rows="6"
/>
</el-form-item>
<el-form-item label="外部回调Token">
<el-input v-model="updateForm.cidtoken" placeholder="请输入回调Token" />
<div class="callback-url">
<span>回调地址</span>
<el-tag type="info">https://{{tokenData.server}}/cid/callback?token={{updateForm.cidtoken}}&id={{updateForm.id}}</el-tag>
</div>
</el-form-item>
<el-form-item label="定时执行时间">
<el-select v-model="updateForm.time" placeholder="选择时间" style="width: 200px; margin-right: 12px;">
<el-option label="30秒" :value="30"></el-option>
<el-option label="1分钟" :value="60"></el-option>
<el-option label="1小时" :value="3600"></el-option>
<el-option label="1天" :value="86400"></el-option>
</el-select>
<span>或自定义时间</span>
<el-input-number
v-model="updateForm.time"
:min="1"
placeholder="秒"
></el-input-number>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="updateDialogVisible = false">取消</el-button>
<el-button type="primary" @click="updateCID()">确定</el-button>
</div>
</template>
</el-dialog>
<el-form-item>
<el-dialog
v-model="addDialogVisible"
title="添加集成项目"
width="50%"
:before-close="handleClose"
>
<!-- 内容主体区域 -->
<el-form
ref="addFormRef"
:model="addForm"
:rules="addFormRules"
label-width="70px"
>
<el-form-item label="项目名称" prop="device_name">
<el-input
v-model="addForm.name"
autocomplete="on"
style="width: 600px"
></el-input>
</el-form-item>
<el-form-item label="仓库地址" prop="device_ip">
<el-input v-model="addForm.url" style="width: 600px" autocomplete="on"></el-input>
</el-form-item>
<el-form-item label="定时执行时间" prop="time">
<el-select v-model="addForm.time">
<el-option label="30s" value="30"></el-option>
<el-option label="1分钟" value="60"></el-option>
<el-option label="1小时" value="3600"></el-option>
<el-option label="1天" value="86400"></el-option>
</el-select>
自定义时间
<el-input type="textarea" v-model="addForm.time" autocomplete="on" style="width: 600px" />
</el-form-item>
<el-form-item label="脚本内容" prop="device_status">
<el-input type="textarea" v-model="addForm.script" style="width: 600px" :autosize="{ minRows: 4, maxRows: 8 }" />
</el-form-item>
</el-form>
<!-- 底部区域 -->
<template #footer>
<span class="dialog-footer">
<el-button @click="addDialogVisible = false"
>取消</el-button
>
<el-button type="primary" @click="addCID()"
>确定</el-button
>
</span>
</template>
</el-dialog>
</el-form-item>
<el-form-item>
<el-dialog
v-model="updateDialogVisible"
title="修改集成项目"
width="50%"
:before-close="handleClose"
>
<!-- 内容主体区域 -->
<el-form
ref="addFormRef"
:model="updateForm"
:rules="updateFormRules"
label-width="70px"
>
<el-form-item label="项目名称" prop="device_name">
<el-input
v-model="updateForm.name"
autocomplete="on"
style="width: 600px"
></el-input>
</el-form-item>
<el-form-item label="仓库地址" prop="device_ip">
<el-input v-model="updateForm.url" style="width: 600px" autocomplete="on"></el-input>
</el-form-item>
<el-form-item label="脚本内容" prop="device_status">
<el-input type="textarea" v-model="updateForm.script" style="width: 600px" :autosize="{ minRows: 4, maxRows: 8 }" />
</el-form-item>
<el-form-item label="外部回调Token" prop="device_status">
<el-input v-model="updateForm.cidtoken" style="width: 600px" />
回调地址https://{{tokenData.server}}/cid/callback?token={{updateForm.cidtoken}}&id={{updateForm.id}}
</el-form-item>
<el-form-item label="定时执行时间" prop="time">
<el-select v-model="updateForm.time">
<el-option label="30s" value="30"></el-option>
<el-option label="1分钟" value="60"></el-option>
<el-option label="1小时" value="3600"></el-option>
<el-option label="1天" value="86400"></el-option>
</el-select>
自定义时间
<el-input type="textarea" v-model="updateForm.time" autocomplete="on" style="width: 600px" />
</el-form-item>
</el-form>
<!-- 底部区域 -->
<template #footer>
<span class="dialog-footer">
<el-button @click="updateDialogVisible = false"
>取消</el-button
>
<el-button type="primary" @click="updateCID()"
>确定</el-button
>
</span>
</template>
</el-dialog>
<el-dialog
v-model="runningDialogVisible"
title="正在运行项目"
width="50%"
:before-close="handleClose"
>
<el-table
:data="runningData"
stripe
width="90%"
fit
>
<el-table-column prop="id" label="CID" width="150"></el-table-column>
<el-table-column prop="cid" label="名称" width="150"></el-table-column>
<el-table-column prop="start_time" label="开始时间" width="300">
</el-table-column>
</el-table>
</el-dialog>
</el-form-item>
</el-form>
<!-- 表格 :row-style="this.tableRowClassName"-->
<el-table :data="tableData" width="100%" v-loading="tableLoading">
:row-style="this.tableRowClassName"
<el-table-column prop="ID" label="id" width="80"></el-table-column>
<el-table-column
prop="Name"
label="名称"
width="100"
></el-table-column>
<el-table-column
prop="Url"
label="仓库地址"
width="180"
></el-table-column>
<el-table-column
prop="Script"
label="脚本消息"
show-overflow-tooltip
width="250"
></el-table-column>
<el-table-column
prop="Token"
label="回调Token"
show-overflow-tooltip
width="100"
></el-table-column>
<el-table-column
prop="last_success"
label="上次成功"
show-overflow-tooltip
width="100"
></el-table-column>
<el-table-column label="操作" width="350">
<template #default="scope">
<el-button
type="primary"
size="mini"
@click.prevent="runCID(scope.$index)"
>运行</el-button
>
<el-button
type="primary"
size="mini"
@click.prevent="updateButtonCID(scope.$index)"
>修改</el-button
>
<el-button
type="primary"
size="mini"
@click.prevent="deleteCID(scope.$index)"
>删除</el-button
>
<el-button
type="primary"
size="mini"
@click.prevent="toRunCIDLog(scope.$index)"
>运行日志</el-button
>
<!-- <el-button type="danger" size="mini">删除</el-button> -->
</template>
</el-table-column>
</el-table>
<br />
<!-- 分页条 -->
<!-- Pagination 分页 -->
<!-- <el-pagination
background
layout="total,sizes, prev, pager, next, jumper"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="1000"
></el-pagination> -->
</el-main>
</el-container>
</el-container>
<el-dialog
v-model="runningDialogVisible"
title="正在运行项目"
width="60%"
>
<el-table
:data="runningData"
stripe
style="width: 100%"
>
<el-table-column prop="id" label="CID" width="100"></el-table-column>
<el-table-column prop="cid" label="名称" min-width="150"></el-table-column>
<el-table-column prop="start_time" label="开始时间" min-width="200"></el-table-column>
</el-table>
</el-dialog>
</div>
</template>
<style>
.blueRowbg {
background: "#488aff";
<style scoped>
.page-container {
width: 100%;
height: 100%;
}
</style>
.page-card {
height: 100%;
display: flex;
flex-direction: column;
border: none;
border-radius: 8px;
}
.page-card :deep(.el-card__body) {
flex: 1;
overflow: hidden;
padding: 20px;
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.header-left {
display: flex;
align-items: center;
}
.page-title {
font-size: 18px;
font-weight: 600;
color: #303133;
}
.header-actions {
display: flex;
align-items: center;
gap: 12px;
}
.server-select {
width: 200px;
}
.table-wrapper {
height: 100%;
overflow: auto;
}
.table-wrapper :deep(.el-table) {
border-radius: 4px;
}
.form-dialog {
padding: 10px 0;
}
.callback-url {
margin-top: 8px;
display: flex;
align-items: center;
gap: 8px;
}
.dialog-footer {
display: flex;
justify-content: flex-end;
gap: 12px;
}
</style>

View File

@ -8,12 +8,19 @@ import { deleteDeviceService } from "@/api/device.js";
import { updateDeviceService } from "@/api/device.js";
import router from "@/router/index.js";
import { ElMessage } from 'element-plus';
import { Refresh, Plus, Edit, Delete, VideoPlay, SwitchButton } from "@element-plus/icons-vue";
import VideoStream from "@/views/DeviceRealVPV2.vue";
export default {
components: {
VideoStream,
Refresh,
Plus,
Edit,
Delete,
VideoPlay,
SwitchButton
},
data() {
return {
@ -57,8 +64,6 @@ export default {
};
},
// methods
//
methods: {
async getDeviceList() {
let result = {};
@ -68,14 +73,6 @@ export default {
console.log(e);
}
let data = result.data;
// for(let d in data){
// let res = JSON.parse(d);
// console.log("res=",res);
// this.tableData.push(res);
// }
// console.log(this.tableData);
this.tableData = data;
},
onSubmit() {
@ -88,7 +85,6 @@ export default {
alert("页码发生变化" + val);
},
//
async restartDevice(index) {
var id = this.tableData[index].ID;
var restart_data = {
@ -101,11 +97,9 @@ export default {
try {
var d_re = await restartDeviceService(restart_data);
if (d_re.code == 0) {
//alert("");
ElMessage.success('重启成功');
} else {
alert("操作失败");
ElMessage.fail('操作失败');
ElMessage.error('操作失败');
}
} catch (e) {
console.log(e);
@ -114,17 +108,13 @@ export default {
playRealVp(index) {
var id = this.tableData[index].ID;
localStorage.setItem("realvp_device_id", id);
// router.push("/deviceRealVP");
this.playing_device = id + " " + this.tableData[index].DeviceName;
this.deviceStreamDialogVisible = true;
},
async deleteDevice(index) {
//
if (!confirm("确定删除吗?")) {
return;
}
var id = this.tableData[index].ID;
var delete_data = {
id: id,
@ -134,13 +124,10 @@ export default {
try {
var d_re = await deleteDeviceService(delete_data);
if (d_re.code == 0) {
//alert("");
ElMessage.success('删除成功');
//
this.getDeviceList();
} else {
//alert("");
ElMessage.fail("操作失败");
ElMessage.error("操作失败");
}
} catch (e) {
console.log(e);
@ -165,10 +152,19 @@ export default {
result = await addDeviceService(this.addForm);
if (result.code == 0) {
ElMessage.success("添加成功");
this.getDeviceList()
this.getDeviceList();
this.addForm = {
device_name: "",
device_ip: "",
device_status: "",
device_info: "",
device_location: "",
device_type: "",
auth_id: -1,
token: localStorage.getItem("token"),
};
} else {
//alert("");
ElMessage.error("添加失败")
ElMessage.error("添加失败");
}
} catch (e) {
console.log(e);
@ -180,11 +176,10 @@ export default {
try {
result = await updateDeviceService(this.updateForm);
if (result.code == 0) {
//alert("");
ElMessage.success("修改成功");
this.getDeviceList()
this.getDeviceList();
} else {
alert("修改失败");
ElMessage.error("修改失败");
}
} catch (e) {
console.log(e);
@ -201,10 +196,9 @@ export default {
try {
var d_re = await restartDeviceService(restart_data);
if (d_re.code == 0) {
//alert("");
ElMessage.success("重启成功");
} else {
alert("操作失败");
ElMessage.error("操作失败");
}
} catch (e) {
console.log(e);
@ -215,7 +209,6 @@ export default {
const response = await axios.get("https://ipinfo.io/json");
this.ip = response.data.ip;
localStorage.setItem("ip", this.ip);
//console.log(response);
} catch (error) {
console.error(error);
}
@ -226,7 +219,6 @@ export default {
toVideoList() {
router.push("/videoList");
},
//
tableRowClassName({ row, rowIndex }) {
if (row.human === 1) {
return {
@ -238,259 +230,217 @@ export default {
},
},
//
//
async mounted() {
let now = new Date();
if (localStorage.getItem("token") === null) {
router.push("/login");
}
// console.log("mounted");
//this.getIpClient();
this.getDeviceList();
},
};
</script>
<template>
<div>
<el-container style="min-height: calc(100vh - 40px); background: #fff; border-radius: 4px;">
<el-header style="font-size: 40px; background-color: rgb(238, 241, 246)"
>监控设备列表</el-header
>
<el-container>
<el-main>
<!-- 表单 -->
<el-form :inline="true" :model="tokenData" class="demo-form-inline">
<el-form-item>
<el-button
class="el-button--danger"
type="primary"
@click="getDeviceList()"
>查询</el-button
>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="restartAllDevice('all')"
>重启全部设备</el-button
>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="addDialogVisible = true"
>添加设备</el-button
>
</el-form-item>
<el-form-item>
<el-dialog
v-model="addDialogVisible"
title="添加设备"
width="50%"
:before-close="handleClose"
>
<!-- 内容主体区域 -->
<el-form
ref="addFormRef"
:model="addForm"
:rules="addFormRules"
label-width="70px"
>
<el-form-item label="设备名称" prop="device_name">
<el-input
v-model="addForm.device_name"
autocomplete="on"
></el-input>
</el-form-item>
<el-form-item label="设备IP" prop="device_ip">
<el-input v-model="addForm.device_ip"></el-input>
</el-form-item>
<el-form-item label="设备状态" prop="device_status">
<el-select v-model="addForm.device_status">
<el-option label="在线" value="在线"></el-option>
<el-option label="离线" value="离线"></el-option>
</el-select>
</el-form-item>
<el-form-item label="设备类型" prop="device_type">
<el-input v-model="addForm.device_type"></el-input>
</el-form-item>
<el-form-item label="设备位置" prop="device_location">
<el-input v-model="addForm.device_location"></el-input>
</el-form-item>
<el-form-item label="设备信息" prop="device_info">
<el-input v-model="addForm.device_info"></el-input>
</el-form-item>
</el-form>
<!-- 底部区域 -->
<template #footer>
<span class="dialog-footer">
<el-button @click="addDialogVisible = false"
>取消</el-button
>
<el-button type="primary" @click="addDevice()"
>确定</el-button
>
</span>
</template>
</el-dialog>
</el-form-item>
<el-form-item>
<el-dialog
title="实时播放"
v-model="deviceStreamDialogVisible"
width="60%"
height="60%"
center
>
<div>
视频播放({{playing_device }})
<VideoStream v-if="deviceStreamDialogVisible"></VideoStream>
</div>
</el-dialog>
</el-form-item>
<div class="page-container">
<el-card class="page-card" shadow="never">
<template #header>
<div class="card-header">
<div class="header-left">
<span class="page-title">监控设备列表</span>
</div>
<div class="header-actions">
<el-button type="primary" @click="restartAllDevice('all')" :icon="SwitchButton">
重启全部设备
</el-button>
<el-button type="primary" @click="addDialogVisible = true" :icon="Plus">
添加设备
</el-button>
<el-button @click="getDeviceList()" :icon="Refresh">
刷新
</el-button>
</div>
</div>
</template>
<el-form-item>
<el-dialog
v-model="updateDialogVisible"
title="修改设备"
width="50%"
:before-close="handleClose"
>
<!-- 内容主体区域 -->
<el-form
ref="updateFormRef"
:model="updateForm"
:rules="updateFormRules"
label-width="70px"
>
<el-form-item label="设备名称" prop="device_name">
<el-input
v-model="updateForm.device_name"
autocomplete="on"
></el-input>
</el-form-item>
<el-form-item label="设备IP" prop="device_ip">
<el-input v-model="updateForm.device_ip"></el-input>
</el-form-item>
<el-form-item label="设备状态" prop="device_status">
<el-select v-model="updateForm.device_status">
<el-option label="在线" value="在线"></el-option>
<el-option label="离线" value="离线"></el-option>
</el-select>
</el-form-item>
<el-form-item label="设备类型" prop="device_type">
<el-input v-model="updateForm.device_type"></el-input>
</el-form-item>
<el-form-item label="设备位置" prop="device_location">
<el-input v-model="updateForm.device_location"></el-input>
</el-form-item>
<el-form-item label="设备信息" prop="device_info">
<el-input v-model="updateForm.device_info"></el-input>
</el-form-item>
</el-form>
<!-- 底部区域 -->
<template #footer>
<span class="dialog-footer">
<el-button @click="updateDialogVisible = false"
>取消</el-button
>
<el-button type="primary" @click="updateDevice()"
>确定</el-button
>
</span>
</template>
</el-dialog>
</el-form-item>
</el-form>
<!-- 表格 :row-style="this.tableRowClassName"-->
<el-table :data="tableData" width="100%" border>
:row-style="this.tableRowClassName"
<el-table-column prop="ID" label="id" width="80"></el-table-column>
<el-table-column
prop="DeviceName"
label="设备名称"
width="100"
></el-table-column>
<el-table-column
prop="DeviceLocation"
label="设备位置"
width="180"
></el-table-column>
<el-table-column
prop="DeviceIP"
label="设备ip"
width="120"
></el-table-column>
<el-table-column
prop="DeviceStatus"
label="设备状态"
width="80"
>
<div class="table-wrapper">
<el-table :data="tableData" style="width: 100%" stripe :row-class-name="tableRowClassName">
<el-table-column prop="ID" label="ID" width="80"></el-table-column>
<el-table-column prop="DeviceName" label="设备名称" min-width="120"></el-table-column>
<el-table-column prop="DeviceLocation" label="设备位置" min-width="150"></el-table-column>
<el-table-column prop="DeviceIP" label="设备IP" width="140"></el-table-column>
<el-table-column prop="DeviceStatus" label="设备状态" width="100">
<template #default="scope">
<el-tag
:type="scope.row.DeviceStatus === '在线' ? 'success' : 'danger'"
>{{ scope.row.DeviceStatus === "在线" ? '在线' : '离线' }}</el-tag
>
</template>
<el-tag :type="scope.row.DeviceStatus === '在线' ? 'success' : 'danger'">
{{ scope.row.DeviceStatus === "在线" ? '在线' : '离线' }}
</el-tag>
</template>
</el-table-column>
<el-table-column
prop="DeviceType"
label="设备类型"
width="120"
></el-table-column>
<el-table-column
prop="DeviceInfo"
label="设备信息"
width="150"
></el-table-column>
<el-table-column label="操作" width="350">
<template #default="scope">
<el-button
type="primary"
size="mini"
@click.prevent="restartDevice(scope.$index)"
>重启</el-button
>
<el-button
type="primary"
size="mini"
@click.prevent="updateButtonDevice(scope.$index)"
>修改</el-button
>
<el-button
type="primary"
size="mini"
@click.prevent="deleteDevice(scope.$index)"
>删除</el-button
>
<el-button
type="primary"
size="mini"
@click.prevent="playRealVp(scope.$index)"
>播放实时</el-button
>
<!-- <el-button type="danger" size="mini">删除</el-button> -->
</template>
</el-table-column>
</el-table>
<br />
<el-table-column prop="DeviceType" label="设备类型" width="120"></el-table-column>
<el-table-column prop="DeviceInfo" label="设备信息" min-width="150" show-overflow-tooltip></el-table-column>
<el-table-column label="操作" width="320" fixed="right">
<template #default="scope">
<el-button type="primary" size="small" @click.prevent="restartDevice(scope.$index)" :icon="SwitchButton">
重启
</el-button>
<el-button type="primary" size="small" @click.prevent="updateButtonDevice(scope.$index)" :icon="Edit">
修改
</el-button>
<el-button type="danger" size="small" @click.prevent="deleteDevice(scope.$index)" :icon="Delete">
删除
</el-button>
<el-button type="primary" size="small" @click.prevent="playRealVp(scope.$index)" :icon="VideoPlay">
播放实时
</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-card>
<!-- 分页条 -->
<!-- Pagination 分页 -->
<!-- <el-pagination
background
layout="total,sizes, prev, pager, next, jumper"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="1000"
></el-pagination> -->
</el-main>
</el-container>
</el-container>
<el-dialog v-model="addDialogVisible" title="添加设备" width="50%" :close-on-click-modal="false">
<el-form ref="addFormRef" :model="addForm" label-width="100px" class="form-dialog">
<el-form-item label="设备名称">
<el-input v-model="addForm.device_name" placeholder="请输入设备名称"></el-input>
</el-form-item>
<el-form-item label="设备IP">
<el-input v-model="addForm.device_ip" placeholder="请输入设备IP"></el-input>
</el-form-item>
<el-form-item label="设备状态">
<el-select v-model="addForm.device_status" placeholder="请选择设备状态">
<el-option label="在线" value="在线"></el-option>
<el-option label="离线" value="离线"></el-option>
</el-select>
</el-form-item>
<el-form-item label="设备类型">
<el-input v-model="addForm.device_type" placeholder="请输入设备类型"></el-input>
</el-form-item>
<el-form-item label="设备位置">
<el-input v-model="addForm.device_location" placeholder="请输入设备位置"></el-input>
</el-form-item>
<el-form-item label="设备信息">
<el-input v-model="addForm.device_info" placeholder="请输入设备信息"></el-input>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="addDialogVisible = false">取消</el-button>
<el-button type="primary" @click="addDevice()">确定</el-button>
</div>
</template>
</el-dialog>
<el-dialog title="实时播放" v-model="deviceStreamDialogVisible" width="70%" top="5vh">
<div class="video-dialog-content">
<div class="video-title">视频播放({{ playing_device }})</div>
<VideoStream v-if="deviceStreamDialogVisible"></VideoStream>
</div>
</el-dialog>
<el-dialog v-model="updateDialogVisible" title="修改设备" width="50%" :close-on-click-modal="false">
<el-form ref="updateFormRef" :model="updateForm" label-width="100px" class="form-dialog">
<el-form-item label="设备名称">
<el-input v-model="updateForm.device_name" placeholder="请输入设备名称"></el-input>
</el-form-item>
<el-form-item label="设备IP">
<el-input v-model="updateForm.device_ip" placeholder="请输入设备IP"></el-input>
</el-form-item>
<el-form-item label="设备状态">
<el-select v-model="updateForm.device_status" placeholder="请选择设备状态">
<el-option label="在线" value="在线"></el-option>
<el-option label="离线" value="离线"></el-option>
</el-select>
</el-form-item>
<el-form-item label="设备类型">
<el-input v-model="updateForm.device_type" placeholder="请输入设备类型"></el-input>
</el-form-item>
<el-form-item label="设备位置">
<el-input v-model="updateForm.device_location" placeholder="请输入设备位置"></el-input>
</el-form-item>
<el-form-item label="设备信息">
<el-input v-model="updateForm.device_info" placeholder="请输入设备信息"></el-input>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="updateDialogVisible = false">取消</el-button>
<el-button type="primary" @click="updateDevice()">确定</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<style>
.blueRowbg {
background: "#488aff";
<style scoped>
.page-container {
width: 100%;
height: 100%;
}
</style>
.page-card {
height: 100%;
display: flex;
flex-direction: column;
border: none;
border-radius: 8px;
}
.page-card :deep(.el-card__body) {
flex: 1;
overflow: hidden;
padding: 20px;
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.header-left {
display: flex;
align-items: center;
}
.page-title {
font-size: 18px;
font-weight: 600;
color: #303133;
}
.header-actions {
display: flex;
align-items: center;
gap: 12px;
}
.table-wrapper {
height: 100%;
overflow: auto;
}
.table-wrapper :deep(.el-table) {
border-radius: 4px;
}
.form-dialog {
padding: 10px 0;
}
.dialog-footer {
display: flex;
justify-content: flex-end;
gap: 12px;
}
.video-dialog-content {
display: flex;
flex-direction: column;
}
.video-title {
font-size: 16px;
font-weight: 600;
margin-bottom: 16px;
color: #303133;
}
</style>

View File

@ -17,9 +17,18 @@ import { getFriendListService } from "@/api/chat.js";
import {sendMessageService} from "@/api/chat.js";
import { ElMessage } from 'element-plus';
import CryptoJS from 'crypto-js';
import { Search, Refresh, User, ChatDotRound, Message, Setting, Connection } from "@element-plus/icons-vue";
export default {
components: {
Search,
Refresh,
User,
ChatDotRound,
Message,
Setting,
Connection
},
data() {
return {
ip: "",
@ -50,29 +59,22 @@ export default {
};
},
// methods
//
methods: {
async getUserList() {
let result = {};
try {
//search_id
if(isNaN(this.search_id)){
//
this.keyword = this.search_id;
this.tokenData.id = -1;
this.tokenData.keyword = this.keyword;
}else if(isFinite(this.search_id)){
//ID
this.tokenData.id = this.search_id;
this.tokenData.keyword = "";
}else{
//
ElMessage.error("输入错误,请输入数字或者关键字");
return;
}
Cookies.set("search_id", this.search_id);
Cookies.set("keyword", this.keyword);
result = await SearchUserService(this.tokenData);
@ -108,7 +110,6 @@ export default {
console.log(e);
}
},
//
async displayFriends(){
let result ={}
try{
@ -124,9 +125,7 @@ export default {
console.log(e);
}
},
//
async DelFriendsOrGroup(index){
//
if (!confirm("确定删除吗?")) {
return;
}
@ -163,23 +162,16 @@ export default {
type: 5,
}
try{
result = await addGroupRequestService(req);
console.log(result.code);
if(result.code === 0){
ElMessage.success("请求发送成功");
}else{
ElMessage.error("操作失败已有请求或者已经是群组成员");
}
}catch(e){
ElMessage.error("操作失败已有请求或者已经是群组成员");
}
},
//
async AcceptFriendsOrGroup(index){
var id = this.FriendsGRequestList[index].id;
var im_id = this.FriendsGRequestList[index].im_id;
@ -207,13 +199,11 @@ export default {
},
handleAvatarFileUpload(e) {
this.avatar_file = e.target.files[0];
//
if (!this.avatar_file.type.startsWith("image/")) {
ElMessage.error("请选择图片文件");
this.avatar_file = null;
return;
}
//this.UserUpdateForm.avatar = URL.createObjectURL(this.avatar_file);
this.uploadAvatarFile();
},
readFileAndCalculateMD5() {
@ -223,7 +213,6 @@ export default {
const wordArray = CryptoJS.lib.WordArray.create(event.target.result);
const md5Hash = CryptoJS.MD5(wordArray);
const md5Str = md5Hash.toString(CryptoJS.enc.Hex);
//console.log("onload: " + md5Str);
this.file_md5 = md5Str;
resolve(md5Str);
};
@ -242,20 +231,15 @@ export default {
try {
let result={};
this.file_md5 = await this.readFileAndCalculateMD5(this.avatar_file);
//console.log("md5:",this.file_md5);
let md5_result = await GetFileInfoByMd5Service({"md5":this.file_md5,token:this.tokenData.token,"type":1});
if(md5_result.code === 0){
result = md5_result;
}else{
let formData = new FormData();
formData.append('file', this.avatar_file);
//console.log("add file: " + this.file);
formData.append('upload_type', "1");
formData.append('md5', this.file_md5);
formData.append('auth_type', "public");
//console.log("formData:",formData);
result = await UploadFileService(formData,this.tokenData.token);
if (result.code!== 0) {
ElMessage.error('上传文件失败,请稍后再试');
@ -263,12 +247,8 @@ export default {
}
}
let resp_data = result.data;
//console.log("resp:",resp_data);
let url = "https://tx.ljsea.top/tool/file/"+resp_data.FileStoreName;
this.UserUpdateForm.avatar = url;
//
await this.updateUserInfo();
} catch (error) {
ElMessage.error('上传文件时出现网络错误,请稍后再试');
@ -290,7 +270,6 @@ export default {
} else {
ElMessage.error("更新失败");
}
}catch(e){
console.log(e);
}
@ -320,8 +299,6 @@ export default {
console.log(e);
}
},
//
async displayFriendReq(){
let result ={}
try{
@ -335,7 +312,6 @@ export default {
}catch(e){
console.log(e);
}
},
onSubmit() {
getUserList({ token: token });
@ -347,16 +323,13 @@ export default {
alert("页码发生变化" + val);
},
startChat(index){
localStorage.setItem("to_user_id", this.tableData[index].ID);
localStorage.setItem("to_user_name", this.tableData[index].Name);
router.push("/im");
},
async getMyUserInfo(id){
let result = {};
try{
//
this.tokenData.id = id;
if(this.tokenData.id === undefined){
this.tokenData.id = localStorage.getItem("userId");
@ -378,21 +351,18 @@ export default {
this.UserUpdateForm.video_func = result.data.VideoFunc;
this.UserUpdateForm.device_func = result.data.DeviceFunc;
this.UserUpdateForm.cid_func = result.data.CIDFunc;
//console.log("token data:",this.tokenData)
if(result.data.ID === parseInt(this.tokenData.userId)){
this.role = result.data.Role;
localStorage.setItem("video_func", result["data"].VideoFunc > 0 ? "true" : "false");
localStorage.setItem("device_func", result["data"].DeviceFunc > 0 ? "true" : "false");
localStorage.setItem("cid_func", result["data"].CIDFunc > 0 ? "true" : "false");
localStorage.setItem("avatar",result.data.Avatar);
//console.log("my role:",this.role);
}
}
}catch(e){
console.log(e);
}
},
async displayMyInfo() {
await this.getMyUserInfo(this.tokenData.user_id)
this.updateDialogVisible= true;
@ -419,14 +389,12 @@ export default {
await this.getMyUserInfo(id)
this.updateDialogVisible= true;
},
handleMenuSelect(val) {
router.push(val);
},
toVideoList() {
router.push("/videoList");
},
//
tableRowClassName({ row, rowIndex }) {
if (row.human === 1) {
return {
@ -438,14 +406,11 @@ export default {
},
},
//
//
async mounted() {
if (localStorage.getItem("token") === null) {
router.push("/login");
}
await this.getMyUserInfo(localStorage.getItem("userId"));
this.search_id = Cookies.get("search_id")?Cookies.get("search_id"):2002;
this.keyword = Cookies.get("keyword")?Cookies.get("keyword"):"";
},
@ -453,393 +418,265 @@ export default {
</script>
<template>
<div>
<el-container style="min-height: calc(100vh - 40px); background: #fff; border-radius: 4px;">
<el-header style="font-size: 40px; background-color: rgb(238, 241, 246)"
>用户搜索列表</el-header
>
<el-container>
<el-main>
<el-form :inline="true" :model="tokenData" class="demo-form-inline">
<el-col :span="8">
<!-- 搜索与添加区域 -->
<div class="page-container">
<el-card class="page-card" shadow="never">
<template #header>
<div class="card-header">
<div class="header-left">
<span class="page-title">用户搜索列表</span>
</div>
<div class="header-actions">
<el-input
placeholder="请输入ID或关键字"
v-model="search_id"
clearable
@clear="getUserList"
style="width: 250px"
>
<template #append>
<el-button @click="getUserList" :icon="Search"></el-button>
</template>
</el-input>
<template #append>
<el-button @click="getUserList"
><el-icon><search /></el-icon
></el-button>
<el-button type="primary" @click="displayFriends()" :icon="User">
好友列表
</el-button>
<el-button type="primary" @click="displayFriendReq()" :icon="Message">
好友请求
</el-button>
<el-button type="primary" @click="displayMyInfo()" :icon="Setting">
我的信息
</el-button>
<el-button v-if="role === 'admin'" type="primary" @click="displayRedisInfo()" :icon="Connection">
Redis
</el-button>
<el-button @click="getUserList()" :icon="Refresh">
刷新
</el-button>
</div>
</div>
</template>
<div class="table-wrapper">
<el-table :data="tableData" style="width: 100%" stripe :row-class-name="tableRowClassName">
<el-table-column prop="ID" label="ID" width="80"></el-table-column>
<el-table-column prop="Name" label="名称" min-width="120"></el-table-column>
<el-table-column prop="Email" label="用户邮箱" min-width="180"></el-table-column>
<el-table-column prop="Age" label="Age" width="100"></el-table-column>
<el-table-column prop="Gender" label="性别" width="100"></el-table-column>
<el-table-column label="操作" width="320" fixed="right">
<template #default="scope">
<el-button type="primary" size="small" @click.prevent="startChat(scope.$index)" :icon="ChatDotRound">
聊天
</el-button>
<el-button type="primary" size="small" @click.prevent="requestFriend(scope.$index)" :icon="User">
请求加好友
</el-button>
<el-button v-if="role === 'admin'" type="primary" size="small" @click.prevent="setUserPermission(scope.$index)" :icon="Setting">
设置权限
</el-button>
</template>
</el-col>
<el-form-item>
<el-button type="primary" @click="displayFriends()"
>好友列表</el-button
>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="displayFriendReq()"
>好友请求</el-button
>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="displayMyInfo()"
>我的信息</el-button
>
</el-form-item>
<el-form-item v-if = "role === 'admin'">
<el-button type="primary" @click="displayRedisInfo()"
>Redis</el-button
>
</el-form-item>
<el-form-item>
<el-dialog
v-model="updateDialogVisible"
title="我的信息"
width="60%"
:before-close="handleClose"
>
<!-- 内容主体区域 -->
<el-form
ref="updateFormRef"
:model="UserUpdateForm"
:rules="UserUpdateFormRules"
label-width="70px"
>
<el-form-item label="ID" prop="id">
<el-input
disabled
v-model="UserUpdateForm.id"
autocomplete="on"
></el-input>
</el-form-item>
<el-row>
<el-form-item label="头像" prop="name">
<el-avatar :size="80" :src="UserUpdateForm.avatar"></el-avatar>
<!-- 选择图片 -->
<input type="file" @change="handleAvatarFileUpload"/>
</el-form-item>
</el-row>
<el-form-item label="用户名" prop="name">
<el-input
v-model="UserUpdateForm.name"
autocomplete="on"
></el-input>
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input v-model="UserUpdateForm.email" disabled></el-input>
</el-form-item>
<el-form-item label="Age" prop="age">
<el-input v-model="UserUpdateForm.age"></el-input>
</el-form-item>
<el-form-item label="性别" prop="gender">
<el-input v-model="UserUpdateForm.gender"></el-input>
</el-form-item>
<el-form-item label="运行权限" prop="run">
<el-switch v-model="UserUpdateForm.run" :active-value="1" :inactive-value="-1" v-if="role === 'admin'"></el-switch>
</el-form-item>
<el-form-item label="redis权限" prop="redis">
<el-switch v-model="UserUpdateForm.redis" :active-value="1" :inactive-value="-1" v-if="role === 'admin'"></el-switch>
</el-form-item>
<el-form-item label="上传权限" prop="upload">
<el-switch v-model="UserUpdateForm.upload" :active-value="1" :inactive-value="-1" v-if="role === 'admin'"></el-switch>
</el-form-item>
<el-form-item label="用户权限" prop="role">
<!-- <el-input v-model="UserUpdateForm.role" v-if="role === 'admin'"></el-input> -->
<el-input v-model="UserUpdateForm.role" disabled v-if="role !== 'admin'"></el-input>
</el-table-column>
</el-table>
<el-select v-model="UserUpdateForm.role" v-if="role === 'admin'">
<el-option label="admin" value="admin">管理员</el-option>
<el-option label="user" value="user">普通用户</el-option>
</el-select>
<!-- <el-selector v-model="UserUpdateForm.role" disabled v-if="role !== 'admin'">
<el-option label="admin" value="admin"></el-option>
<el-option label="user" value="user"></el-option>
</el-selector> -->
</el-form-item>
<el-form-item label="视频管理" prop="video_func">
<el-switch v-model="UserUpdateForm.video_func" :active-value="1" :inactive-value="-1" v-if="role === 'admin'"></el-switch>
</el-form-item>
<el-form-item label="设备管理" prop="device_func">
<el-switch v-model="UserUpdateForm.device_func" :active-value="1" :inactive-value="-1" v-if="role === 'admin'"></el-switch>
</el-form-item>
<el-form-item label="集成部署" prop="cid_func">
<el-switch v-model="UserUpdateForm.cid_func" :active-value="1" :inactive-value="-1" v-if="role === 'admin'"></el-switch>
</el-form-item>
<el-form-item label="注册时间" prop="create_time">
<el-input v-model="UserUpdateForm.create_time" disabled></el-input>
</el-form-item>
<el-form-item label="上次修改" prop="update_time">
<el-input v-model="UserUpdateForm.update_time" disabled></el-input>
</el-form-item>
</el-form>
<!-- 底部区域 -->
<template #footer>
<span class="dialog-footer">
<el-button @click="updateDialogVisible = false"
>取消</el-button
>
<el-button type="primary" @click="updateUserInfo()"
>确定</el-button
>
</span>
</template>
</el-dialog>
</el-form-item>
<!-- 表单 -->
<el-form :inline="true" :model="tokenData" class="demo-form-inline">
<el-form-item>
<el-button
class="el-button--danger"
type="primary"
@click="getUserList()"
>查询</el-button
>
</el-form-item>
</el-form>
</el-form>
<el-dialog
title="好友请求"
width="50%"
v-model="FriendsRequestIsDisplay"
center>
<el-table :data="FriendsGRequestList" width="100%">
<el-table-column prop="id" label="id" width="80"></el-table-column>
<el-table-column
prop="name"
label="名称"
width="100"
></el-table-column>
<el-table-column
prop="email"
label="用户邮箱"
width="180"
></el-table-column>
<el-table-column
prop="age"
label="用户Age"
width="120"
></el-table-column>
<el-table-column>
<template #default="scope">
<el-button
type="primary"
size="mini"
@click.prevent="AcceptFriendsOrGroup(scope.$index)"
>同意请求</el-button
>
<el-button
type="primary"
size="mini"
@click.prevent="RefuseFriendsOrGroup(scope.$index)"
>拒绝请求</el-button>
</template>
</el-table-column>
</el-table>
</el-dialog>
<el-dialog
title="用户好友"
width="40%"
v-model="FriendsTableIsDisplay"
center>
<el-table :data="FriendsGList" width="100%">
<el-table-column prop="id" label="id" width="80"></el-table-column>
<el-table-column
prop="name"
label="名称"
width="100"
></el-table-column>
<el-table-column
prop="email"
label="用户邮箱"
width="180"
></el-table-column>
<el-table-column>
<template #default="scope">
<el-button
type="primary"
size="mini"
@click.prevent="DelFriendsOrGroup(scope.$index)"
>删除好友或群组</el-button
>
</template>
</el-table-column>
</el-table>
</el-dialog>
<el-dialog
title="Redis数据"
width="60%"
v-model="RedisIsDisplay"
center>
<el-table :data="RedisList" width="100%">
<el-table-column
prop="Key"
label="Key"
width="120"
></el-table-column>
<el-table-column
prop="Value"
label="Value"
width="480"
></el-table-column>
<el-table-column
prop="Type"
label="Type"
width="100"
></el-table-column>
<el-table-column
prop="Expire"
label="Expire(s)"
width="100"
></el-table-column>
<el-table-column>
<template #default="scope">
<el-button
type="primary"
size="mini"
@click.prevent="DelFriendsOrGroup(scope.$index)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
</el-dialog>
<!-- 表格 :row-style="this.tableRowClassName"-->
<el-table :data="tableData" width="100%" border>
:row-style="this.tableRowClassName"
<el-table-column prop="ID" label="id" width="80"></el-table-column>
<el-table-column
prop="Name"
label="名称"
width="100"
></el-table-column>
<el-table-column
prop="Email"
label="用户邮箱"
width="180"
></el-table-column>
<el-table-column
prop="Age"
label="用户Age"
width="120"
></el-table-column>
<el-table-column
prop="Gender"
label="用户性别"
width="100"
></el-table-column>
<el-table-column label="操作" width="400">
<div class="group-section">
<h3 class="group-title">群组列表</h3>
<el-table :data="groups" style="width: 100%" stripe>
<el-table-column prop="ID" label="ID" width="80"></el-table-column>
<el-table-column prop="GroupName" label="名称" min-width="120"></el-table-column>
<el-table-column prop="GroupInfo" label="描述" min-width="180"></el-table-column>
<el-table-column prop="GroupType" label="类型" width="120"></el-table-column>
<el-table-column prop="CreatedAt" label="创建时间" width="180"></el-table-column>
<el-table-column prop="UpdatedAt" label="更新时间" width="180"></el-table-column>
<el-table-column label="操作" width="140" fixed="right">
<template #default="scope">
<el-button
type="primary"
size="mini"
@click.prevent="startChat(scope.$index)"
>聊天</el-button
>
<el-button
type="primary"
size="mini"
@click.prevent="requestFriend(scope.$index)"
>请求加好友</el-button
>
<!-- 如果有权限可设置用户权限 -->
<v-if v-if="role === 'admin'">
<el-button
type="primary"
size="mini"
@click.prevent="setUserPermission(scope.$index)"
>设置权限</el-button
>
</v-if>
<!-- <el-button type="danger" size="mini">删除</el-button> -->
<el-button type="primary" size="small" @click.prevent="addGroupRequest(scope.$index)">
请求加入
</el-button>
</template>
</el-table-column>
</el-table>
<br />
<h>
群组列表
</h>
</div>
</div>
</el-card>
<!-- 表格 :row-style="this.tableRowClassName"-->
<el-table :data="groups" width="100%" border>
:row-style="this.tableRowClassName"
<el-table-column prop="ID" label="id" width="80"></el-table-column>
<el-table-column
prop="GroupName"
label="名称"
width="100"
></el-table-column>
<el-table-column
prop="GroupInfo"
label="描述"
width="180"
></el-table-column>
<el-table-column
prop="GroupType"
label="类型"
width="120"
></el-table-column>
<el-table-column
prop="CreatedAt"
label="创建时间"
width="120"
></el-table-column>
<el-table-column
prop="UpdatedAt"
label="更新时间"
width="120"
></el-table-column>
<el-table-column label="操作" width="350">
<template #default="scope">
<el-button
type="primary"
size="mini"
@click.prevent="addGroupRequest(scope.$index)"
>请求加入</el-button
>
<!-- <el-button type="danger" size="mini">删除</el-button> -->
</template>
</el-table-column>
</el-table>
<br />
<el-dialog v-model="updateDialogVisible" title="我的信息" width="60%" :close-on-click-modal="false">
<el-form ref="updateFormRef" :model="UserUpdateForm" label-width="120px" class="form-dialog">
<el-form-item label="ID">
<el-input disabled v-model="UserUpdateForm.id"></el-input>
</el-form-item>
<el-form-item label="头像">
<el-avatar :size="80" :src="UserUpdateForm.avatar"></el-avatar>
<input type="file" @change="handleAvatarFileUpload" style="margin-left: 12px;"/>
</el-form-item>
<el-form-item label="用户名">
<el-input v-model="UserUpdateForm.name"></el-input>
</el-form-item>
<el-form-item label="邮箱">
<el-input v-model="UserUpdateForm.email" disabled></el-input>
</el-form-item>
<el-form-item label="Age">
<el-input v-model="UserUpdateForm.age"></el-input>
</el-form-item>
<el-form-item label="性别">
<el-input v-model="UserUpdateForm.gender"></el-input>
</el-form-item>
<el-form-item label="运行权限" v-if="role === 'admin'">
<el-switch v-model="UserUpdateForm.run" :active-value="1" :inactive-value="-1"></el-switch>
</el-form-item>
<el-form-item label="Redis权限" v-if="role === 'admin'">
<el-switch v-model="UserUpdateForm.redis" :active-value="1" :inactive-value="-1"></el-switch>
</el-form-item>
<el-form-item label="上传权限" v-if="role === 'admin'">
<el-switch v-model="UserUpdateForm.upload" :active-value="1" :inactive-value="-1"></el-switch>
</el-form-item>
<el-form-item label="用户权限">
<el-input v-model="UserUpdateForm.role" disabled v-if="role !== 'admin'"></el-input>
<el-select v-model="UserUpdateForm.role" v-if="role === 'admin'">
<el-option label="admin" value="admin">管理员</el-option>
<el-option label="user" value="user">普通用户</el-option>
</el-select>
</el-form-item>
<el-form-item label="视频管理" v-if="role === 'admin'">
<el-switch v-model="UserUpdateForm.video_func" :active-value="1" :inactive-value="-1"></el-switch>
</el-form-item>
<el-form-item label="设备管理" v-if="role === 'admin'">
<el-switch v-model="UserUpdateForm.device_func" :active-value="1" :inactive-value="-1"></el-switch>
</el-form-item>
<el-form-item label="集成部署" v-if="role === 'admin'">
<el-switch v-model="UserUpdateForm.cid_func" :active-value="1" :inactive-value="-1"></el-switch>
</el-form-item>
<el-form-item label="注册时间">
<el-input v-model="UserUpdateForm.create_time" disabled></el-input>
</el-form-item>
<el-form-item label="上次修改">
<el-input v-model="UserUpdateForm.update_time" disabled></el-input>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="updateDialogVisible = false">取消</el-button>
<el-button type="primary" @click="updateUserInfo()">确定</el-button>
</div>
</template>
</el-dialog>
<!-- 分页条 -->
<!-- Pagination 分页 -->
<!-- <el-pagination
background
layout="total,sizes, prev, pager, next, jumper"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="1000"
></el-pagination> -->
</el-main>
</el-container>
</el-container>
<el-dialog title="好友请求" width="60%" v-model="FriendsRequestIsDisplay">
<el-table :data="FriendsGRequestList" style="width: 100%" stripe>
<el-table-column prop="id" label="ID" width="80"></el-table-column>
<el-table-column prop="name" label="名称" min-width="120"></el-table-column>
<el-table-column prop="email" label="用户邮箱" min-width="180"></el-table-column>
<el-table-column prop="age" label="Age" width="100"></el-table-column>
<el-table-column label="操作" width="200" fixed="right">
<template #default="scope">
<el-button type="success" size="small" @click.prevent="AcceptFriendsOrGroup(scope.$index)">
同意请求
</el-button>
<el-button type="danger" size="small" @click.prevent="RefuseFriendsOrGroup(scope.$index)">
拒绝请求
</el-button>
</template>
</el-table-column>
</el-table>
</el-dialog>
<el-dialog title="用户好友" width="50%" v-model="FriendsTableIsDisplay">
<el-table :data="FriendsGList" style="width: 100%" stripe>
<el-table-column prop="id" label="ID" width="80"></el-table-column>
<el-table-column prop="name" label="名称" min-width="120"></el-table-column>
<el-table-column prop="email" label="用户邮箱" min-width="180"></el-table-column>
<el-table-column label="操作" width="140" fixed="right">
<template #default="scope">
<el-button type="danger" size="small" @click.prevent="DelFriendsOrGroup(scope.$index)">
删除好友
</el-button>
</template>
</el-table-column>
</el-table>
</el-dialog>
<el-dialog title="Redis数据" width="70%" v-model="RedisIsDisplay">
<el-table :data="RedisList" style="width: 100%" stripe>
<el-table-column prop="Key" label="Key" min-width="150"></el-table-column>
<el-table-column prop="Value" label="Value" min-width="300" show-overflow-tooltip></el-table-column>
<el-table-column prop="Type" label="Type" width="100"></el-table-column>
<el-table-column prop="Expire" label="Expire(s)" width="120"></el-table-column>
</el-table>
</el-dialog>
</div>
</template>
<style>
.blueRowbg {
background: "#488aff";
<style scoped>
.page-container {
width: 100%;
height: 100%;
}
</style>
.page-card {
height: 100%;
display: flex;
flex-direction: column;
border: none;
border-radius: 8px;
}
.page-card :deep(.el-card__body) {
flex: 1;
overflow: hidden;
padding: 20px;
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.header-left {
display: flex;
align-items: center;
}
.page-title {
font-size: 18px;
font-weight: 600;
color: #303133;
}
.header-actions {
display: flex;
align-items: center;
gap: 12px;
}
.table-wrapper {
height: 100%;
overflow: auto;
display: flex;
flex-direction: column;
}
.table-wrapper :deep(.el-table) {
border-radius: 4px;
}
.group-section {
margin-top: 24px;
}
.group-title {
font-size: 16px;
font-weight: 600;
color: #303133;
margin-bottom: 12px;
}
.form-dialog {
padding: 10px 0;
}
.dialog-footer {
display: flex;
justify-content: flex-end;
gap: 12px;
}
</style>

View File

@ -9,12 +9,19 @@ import { delayVideoService } from "@/api/video.js";
import router from "@/router/index.js";
import Cookies from "js-cookie";
import { ElMessage } from "element-plus";
import { Refresh, VideoPlay, Download, Delete, Clock, Close } from "@element-plus/icons-vue";
import VideoPlayer from "@/views/Video.vue";
export default {
components: {
VideoPlayer,
Refresh,
VideoPlay,
Download,
Delete,
Clock,
Close
},
data() {
return {
@ -39,18 +46,10 @@ export default {
};
},
// methods
//
methods: {
async getVideoList() {
let result = {};
try {
// console.log("this entrydate:", this.tokenData.entrydate[0]);
// console.log("type time:",typeof this.tokenData.entrydate[0])
// if(this.tokenData.entrydate.length > 0) {
// // get the date from the date picker
// Cookies.set("entrydate", [this.tokenData.entrydate[0], this.tokenData.entrydate[1]]);
// }
result = await getVideoListService(this.tokenData);
} catch (e) {
console.log(e);
@ -59,16 +58,12 @@ export default {
let len = data ? data.length : 0;
for (let i = 0; i < len; i++) {
//this.file_sum_size += parseFloat(data[i].file_size);
data[i].FileSize = parseFloat(data[i].FileSize / 1024 / 1024).toFixed(
2
);
data[i].FileSize = parseFloat(data[i].FileSize / 1024 / 1024).toFixed(2);
}
console.log("file_size", this.file_sum_size, "len=", len);
this.tableData = data;
},
logout() {
//退
localStorage.clear();
router.push("/login");
},
@ -76,10 +71,8 @@ export default {
router.push(val);
},
async quashOption() {
//
let result = await quashVideoService(this.tokenData);
if (result.code == 0) {
//alert(result.message);
ElMessage.success("操作成功!");
this.getVideoList();
} else {
@ -97,18 +90,13 @@ export default {
},
playVideo(index) {
this.dialogVisible = true;
// localStorage.setItem("is_to_play", "1");
var id = this.tableData[index].ID;
var name = this.tableData[index].VideoName;
localStorage.setItem("video_id", id);
localStorage.setItem("video_name", name);
this.playing_video = "id: " + id + " ; name: " + name;
components.updated();
// //alert("id=" + id + " name=" + name);
//router.push("/video");
},
async deleteVideo(index) {
//
if (!confirm("是否删除?")) {
return;
}
@ -121,7 +109,6 @@ export default {
};
let result = await deleteVideoService(req);
if (result.code == 0) {
//alert(result.message);
ElMessage.success("操作成功!");
this.getVideoList();
} else {
@ -141,34 +128,25 @@ export default {
"&ip=" +
this.ip +
"&token=" +
localStorage.getItem("token"); //
//
localStorage.getItem("token");
try {
//
const response = await axios({
url: vurl,
method: "GET",
responseType: "blob", // axiosblob
responseType: "blob",
headers: {
//
"Content-Type": "video/mp4",
},
});
// Blob
const videoBlob = new Blob([response.data], { type: "video/mp4" });
// BlobURL
const videoUrl = URL.createObjectURL(videoBlob);
// 使a
const link = document.createElement("a");
link.href = videoUrl;
link.download = name; //
link.download = name;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
// URL
URL.revokeObjectURL(videoUrl);
} catch (error) {
console.error("下载视频时发生错误:", error);
@ -189,11 +167,9 @@ export default {
try {
var d_re = await delayVideoService(delay_data);
if (d_re.code == 0) {
//alert(d_re.message);
ElMessage.success(d_re.message);
} else {
ElMessage.error("操作失败");
//alert("");
}
} catch (e) {
console.log(e);
@ -225,7 +201,6 @@ export default {
const response = await axios.get("https://ipinfo.io/json");
this.ip = response.data.ip;
localStorage.setItem("ip", this.ip);
//console.log(response);
} catch (error) {
console.error(error);
}
@ -233,7 +208,6 @@ export default {
toDeviceM() {
router.push("/device");
},
//
tableRowClassName({ row, rowIndex }) {
if (row.human === 1) {
return {
@ -245,208 +219,214 @@ export default {
},
},
//
//
async mounted() {
let now = new Date();
if (localStorage.getItem("token") === null) {
router.push("/login");
}
// console.log("mounted");
this.getIpClient();
// if( Cookies.get("entrydate")){
// console.log("entrydate:",Cookies.get("entrydate"));
// this.tokenData.entrydate = [Object(Cookies.get("entrydate")[0]),Object(Cookies.get("entrydate")[1])];
// }
this.getVideoList();
},
};
</script>
<template>
<div>
<el-container style="min-height: calc(100vh - 40px); background: #fff; border-radius: 4px;">
<el-header style="font-size: 40px; background-color: rgb(238, 241, 246)"
>监控视频列表</el-header
>
<el-container>
<el-main>
<!-- 表单 -->
<el-form :inline="true" :model="tokenData" class="demo-form-inline">
<el-form-item label="视频日期">
<el-date-picker
v-model="tokenData.entrydate"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
>
</el-date-picker>
</el-form-item>
<el-select v-model="tokenData.hour">
<el-option label="不选" value="33"></el-option>
<el-option label="0点" value="00"></el-option>
<el-option label="1点" value="01"></el-option>
<el-option label="2点" value="02"></el-option>
<el-option label="3点" value="03"></el-option>
<el-option label="4点" value="04"></el-option>
<el-option label="5点" value="05"></el-option>
<el-option label="6点" value="06"></el-option>
<el-option label="7点" value="07"></el-option>
<el-option label="8点" value="08"></el-option>
<el-option label="9点" value="09"></el-option>
<el-option label="10点" value="10"></el-option>
<el-option label="11点" value="11"></el-option>
<el-option label="12点" value="12"></el-option>
<el-option label="13点" value="13"></el-option>
<el-option label="14点" value="14"></el-option>
<el-option label="15点" value="15"></el-option>
<el-option label="16点" value="16"></el-option>
<el-option label="17点" value="17"></el-option>
<el-option label="18点" value="18"></el-option>
<el-option label="19点" value="19"></el-option>
<el-option label="20点" value="20"></el-option>
<el-option label="21点" value="21"></el-option>
<el-option label="22点" value="22"></el-option>
<el-option label="23点" value="23"></el-option>
</el-select>
<el-form-item>
指定视频ID:
<el-col :span="8">
<el-input
placeholder="指定视频ID"
v-model="tokenData.id"
></el-input>
</el-col>
<el-button type="primary" @click="getVideoList()">查询</el-button>
</el-form-item>
<el-form-item>
<el-button
class="el-button--danger"
type="primary"
@click="delayAllVideo('all')"
>全部延迟删除</el-button
>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="quashOption()"
>撤销操作</el-button
>
</el-form-item>
<!-- <el-form-item>
所有文件大小 {{ parseFloat(this.file_sum_size/1024/1024).toFixed(2) }} GB
</el-form-item> -->
</el-form>
<el-dialog
title="视频播放"
v-model="dialogVisible"
width="60%"
height="60%"
center
>
<div>
视频播放({{playing_video }})
<VideoPlayer v-if="dialogVisible"></VideoPlayer>
<div class="page-container">
<el-card class="page-card" shadow="never">
<template #header>
<div class="card-header">
<div class="header-left">
<span class="page-title">监控视频列表</span>
</div>
</el-dialog>
<div class="header-actions">
<el-button type="primary" @click="delayAllVideo('all')" :icon="Clock">
全部延迟删除
</el-button>
<el-button type="primary" @click="quashOption()" :icon="Close">
撤销操作
</el-button>
<el-button @click="getVideoList()" :icon="Refresh">
刷新
</el-button>
</div>
</div>
</template>
<!-- 表格 :row-style="this.tableRowClassName"-->
<el-table :data="tableData" width="100%" border>
:row-style="this.tableRowClassName"
<el-table-column prop="ID" label="id" width="80"></el-table-column>
<el-table-column
prop="VideoName"
label="视频名称"
width="250"
></el-table-column>
<el-table-column label="是否有人" width="30" prop="human">
<template #default="scope">
<div class="search-bar">
<el-form :inline="true" :model="tokenData" class="demo-form-inline">
<el-form-item label="视频日期">
<el-date-picker
v-model="tokenData.entrydate"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
>
</el-date-picker>
</el-form-item>
<el-form-item label="小时">
<el-select v-model="tokenData.hour" style="width: 120px;">
<el-option label="不选" :value="33"></el-option>
<el-option label="0点" :value="0"></el-option>
<el-option label="1点" :value="1"></el-option>
<el-option label="2点" :value="2"></el-option>
<el-option label="3点" :value="3"></el-option>
<el-option label="4点" :value="4"></el-option>
<el-option label="5点" :value="5"></el-option>
<el-option label="6点" :value="6"></el-option>
<el-option label="7点" :value="7"></el-option>
<el-option label="8点" :value="8"></el-option>
<el-option label="9点" :value="9"></el-option>
<el-option label="10点" :value="10"></el-option>
<el-option label="11点" :value="11"></el-option>
<el-option label="12点" :value="12"></el-option>
<el-option label="13点" :value="13"></el-option>
<el-option label="14点" :value="14"></el-option>
<el-option label="15点" :value="15"></el-option>
<el-option label="16点" :value="16"></el-option>
<el-option label="17点" :value="17"></el-option>
<el-option label="18点" :value="18"></el-option>
<el-option label="19点" :value="19"></el-option>
<el-option label="20点" :value="20"></el-option>
<el-option label="21点" :value="21"></el-option>
<el-option label="22点" :value="22"></el-option>
<el-option label="23点" :value="23"></el-option>
</el-select>
</el-form-item>
<el-form-item label="视频ID">
<el-input
placeholder="指定视频ID"
v-model="tokenData.id"
style="width: 150px;"
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="getVideoList()">查询</el-button>
</el-form-item>
</el-form>
</div>
<div class="table-wrapper">
<el-table :data="tableData" style="width: 100%" stripe :row-class-name="tableRowClassName">
<el-table-column prop="ID" label="ID" width="80"></el-table-column>
<el-table-column prop="VideoName" label="视频名称" min-width="200" show-overflow-tooltip></el-table-column>
<el-table-column label="是否有人" width="100" prop="human">
<template #default="scope">
<el-tag :type="scope.row.human == 1 ? 'danger' : 'success'">
{{ scope.row.human == 1 ? "有" : "无" }}
</template>
</el-table-column>
<el-table-column
prop="CreateTime"
label="开始时间"
width="160"
></el-table-column>
<el-table-column
prop="EndTime"
label="结束时间"
width="160"
></el-table-column>
<el-table-column
prop="DeleteTime"
label="预期删除时间"
width="160"
></el-table-column>
<el-table-column
prop="FileSize"
label="文件大小(MB)"
width="80"
></el-table-column>
<el-table-column
prop="CameraID"
label="摄像头"
width="50"
></el-table-column>
<el-table-column label="操作" width="330">
<template #default="scope">
<el-button
type="primary"
size="mini"
@click.prevent="playVideo(scope.$index)"
>播放</el-button
>
<el-button
type="primary"
size="mini"
@click.prevent="delayVideo(scope.$index)"
>延迟删除</el-button
>
<el-button
type="primary"
size="mini"
@click.prevent="downloadVideo(scope.$index)"
>下载</el-button
>
<el-button
type="primary"
size="mini"
@click.prevent="deleteVideo(scope.$index)"
>删除</el-button
>
</el-tag>
</template>
</el-table-column>
<el-table-column prop="CreateTime" label="开始时间" min-width="160"></el-table-column>
<el-table-column prop="EndTime" label="结束时间" min-width="160"></el-table-column>
<el-table-column prop="DeleteTime" label="预期删除时间" min-width="160"></el-table-column>
<el-table-column prop="FileSize" label="文件大小(MB)" width="120"></el-table-column>
<el-table-column prop="CameraID" label="摄像头" width="100"></el-table-column>
<el-table-column label="操作" width="320" fixed="right">
<template #default="scope">
<el-button type="primary" size="small" @click.prevent="playVideo(scope.$index)" :icon="VideoPlay">
播放
</el-button>
<el-button type="primary" size="small" @click.prevent="delayVideo(scope.$index)" :icon="Clock">
延迟删除
</el-button>
<el-button type="primary" size="small" @click.prevent="downloadVideo(scope.$index)" :icon="Download">
下载
</el-button>
<el-button type="danger" size="small" @click.prevent="deleteVideo(scope.$index)" :icon="Delete">
删除
</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-card>
<!-- <el-button type="danger" size="mini">删除</el-button> -->
</template>
</el-table-column>
</el-table>
<br />
<!-- 分页条 -->
<!-- Pagination 分页 -->
<!-- <el-pagination
background
layout="total,sizes, prev, pager, next, jumper"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="1000"
></el-pagination> -->
</el-main>
</el-container>
</el-container>
<el-dialog title="视频播放" v-model="dialogVisible" width="70%" top="5vh">
<div class="video-dialog-content">
<div class="video-title">视频播放({{ playing_video }})</div>
<VideoPlayer v-if="dialogVisible"></VideoPlayer>
</div>
</el-dialog>
</div>
</template>
<style>
.blueRowbg {
background: "#488aff";
<style scoped>
.page-container {
width: 100%;
height: 100%;
}
.el-menu-vertical-demo {
width: 200px; /* 设置菜单宽度 */
background-color: #1e2733; /* 设置背景颜色 */
/* ... 其他样式属性 ... */
.page-card {
height: 100%;
display: flex;
flex-direction: column;
border: none;
border-radius: 8px;
}
.page-card :deep(.el-card__body) {
flex: 1;
overflow: hidden;
padding: 20px;
display: flex;
flex-direction: column;
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.header-left {
display: flex;
align-items: center;
}
.page-title {
font-size: 18px;
font-weight: 600;
color: #303133;
}
.header-actions {
display: flex;
align-items: center;
gap: 12px;
}
.search-bar {
margin-bottom: 16px;
padding: 16px;
background: #f5f7fa;
border-radius: 4px;
}
.search-bar :deep(.el-form-item) {
margin-bottom: 0;
}
.table-wrapper {
flex: 1;
overflow: auto;
}
.table-wrapper :deep(.el-table) {
border-radius: 4px;
}
.video-dialog-content {
display: flex;
flex-direction: column;
}
.video-title {
font-size: 16px;
font-weight: 600;
margin-bottom: 16px;
color: #303133;
}
</style>