优化页面
This commit is contained in:
parent
a9d50669a8
commit
146b071737
|
|
@ -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. ✅ 充分利用页面空间,消除右侧空白
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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", // 告诉axios我们期望的响应是一个blob
|
||||
responseType: "blob",
|
||||
headers: {
|
||||
// 如果有必要,设置其他请求头
|
||||
"Content-Type": "video/mp4",
|
||||
},
|
||||
});
|
||||
|
||||
// 创建Blob对象
|
||||
const videoBlob = new Blob([response.data], { type: "video/mp4" });
|
||||
|
||||
// 创建一个指向Blob对象的URL
|
||||
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>
|
||||
|
|
|
|||
Loading…
Reference in New Issue