Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -1,139 +1,140 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container home">
|
<div class="app-container">
|
||||||
<el-row :gutter="20">
|
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
<el-col :sm="24" :lg="12" style="padding-left: 20px">
|
<el-form-item label="设备类型" prop="type">
|
||||||
<h2>RTSP视频分析平台</h2>
|
<el-radio-group type="button" v-model="queryParams.type" @change="handleQuery">
|
||||||
<p>
|
<el-radio-button :label="undefined">全部</el-radio-button>
|
||||||
RTSP视频分析平台。项目集成了虹软SDK,实现了人脸识别、活体检测、3D角度分析、年龄及性别识别等功能;同时,利用JavaCV进行高效的视频处理。后端采用SpringBoot框架,前端则运用了Vue3框架,确保系统的稳定与用户体验的流畅。<br>
|
<el-radio-button v-for="dict in device_type" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio-button>
|
||||||
</p>
|
</el-radio-group>
|
||||||
</el-col>
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
|
||||||
<el-col :sm="24" :lg="12" style="padding-left: 50px">
|
<div style="display: flex;">
|
||||||
<el-row>
|
<div class="card" @click="handleVideoCameraFilled(item)" v-for="item in deviceList" :key="item.deviceId">
|
||||||
<el-col :span="12">
|
<div class="card-image"></div>
|
||||||
<h2>技术选型</h2>
|
<div class="category"><dict-tag :options="device_type" :value="item.type"/></div>
|
||||||
</el-col>
|
<div class="heading">
|
||||||
</el-row>
|
{{ item.ip }}
|
||||||
<el-row>
|
<!-- <div class="author"> By <span class="name">Abi</span> 4 days ago</div> -->
|
||||||
<el-col :span="6">
|
</div>
|
||||||
<h4>后端技术</h4>
|
</div>
|
||||||
<ul>
|
</div>
|
||||||
<li>SpringBoot</li>
|
|
||||||
<li>Spring Security</li>
|
|
||||||
<li>JWT</li>
|
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
|
||||||
<li>MyBatis</li>
|
v-model:limit="queryParams.pageSize" @pagination="getList" />
|
||||||
<li>Druid</li>
|
|
||||||
<li>JavaCv</li>
|
|
||||||
<li>...</li>
|
|
||||||
</ul>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="6">
|
|
||||||
<h4>前端技术</h4>
|
|
||||||
<ul>
|
|
||||||
<li>Vue</li>
|
|
||||||
<li>Vite</li>
|
|
||||||
<li>Element-Plus</li>
|
|
||||||
<li>Axios</li>
|
|
||||||
<li>Sass</li>
|
|
||||||
<li>Xgplayer</li>
|
|
||||||
<li>...</li>
|
|
||||||
</ul>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
<el-divider />
|
|
||||||
<el-row :gutter="20">
|
|
||||||
<el-col :xs="24" :sm="24" :md="12" :lg="8">
|
|
||||||
<el-card class="update-log">
|
|
||||||
<template v-slot:header>
|
|
||||||
<div class="clearfix">
|
|
||||||
<span>更新日志</span>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<el-collapse accordion>
|
|
||||||
<el-collapse-item title="v1.0.0 - 2025-01-16">
|
|
||||||
<ol>
|
|
||||||
<li>RTSP视频分析平台正式发布</li>
|
|
||||||
<li>rtsp转http-flv和ws-flv</li>
|
|
||||||
<li>javaCV抽帧转换</li>
|
|
||||||
</ol>
|
|
||||||
</el-collapse-item>
|
|
||||||
</el-collapse>
|
|
||||||
</el-card>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup name="Index">
|
|
||||||
const version = ref('3.8.9')
|
|
||||||
|
|
||||||
function goTarget(url) {
|
<script setup name="Device">
|
||||||
window.open(url, '__blank')
|
import router from '@/router'
|
||||||
|
import { listDevice } from "@/api/video/device";
|
||||||
|
|
||||||
|
const { proxy } = getCurrentInstance();
|
||||||
|
const { device_on_status, device_type } = proxy.useDict('device_on_status', 'device_type');
|
||||||
|
|
||||||
|
const deviceList = ref([]);
|
||||||
|
const loading = ref(true);
|
||||||
|
const showSearch = ref(true);
|
||||||
|
const ids = ref([]);
|
||||||
|
const single = ref(true);
|
||||||
|
const multiple = ref(true);
|
||||||
|
const total = ref(0);
|
||||||
|
|
||||||
|
const data = reactive({
|
||||||
|
queryParams: {
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 20,
|
||||||
|
type: undefined,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const { queryParams } = toRefs(data);
|
||||||
|
|
||||||
|
const handleVideoCameraFilled = (row) => {
|
||||||
|
router.push({ path: "/video/flv", query: { deviceId: row.deviceId } });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 查询设备列表 */
|
||||||
|
function getList() {
|
||||||
|
loading.value = true;
|
||||||
|
listDevice(queryParams.value).then(response => {
|
||||||
|
deviceList.value = response.rows;
|
||||||
|
total.value = response.total;
|
||||||
|
loading.value = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
function handleQuery() {
|
||||||
|
queryParams.value.pageNum = 1;
|
||||||
|
getList();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 多选框选中数据
|
||||||
|
function handleSelectionChange(selection) {
|
||||||
|
ids.value = selection.map(item => item.deviceId);
|
||||||
|
single.value = selection.length != 1;
|
||||||
|
multiple.value = !selection.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
getList();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped>
|
||||||
.home {
|
/* From Uiverse.io by alexmaracinaru */
|
||||||
blockquote {
|
.card {
|
||||||
padding: 10px 20px;
|
width: 190px;
|
||||||
margin: 0 0 20px;
|
background: white;
|
||||||
font-size: 17.5px;
|
padding: .4em;
|
||||||
border-left: 5px solid #eee;
|
border-radius: 6px;
|
||||||
}
|
}
|
||||||
hr {
|
|
||||||
margin-top: 20px;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
border: 0;
|
|
||||||
border-top: 1px solid #eee;
|
|
||||||
}
|
|
||||||
.col-item {
|
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul {
|
.card-image {
|
||||||
padding: 0;
|
background-color: rgb(236, 236, 236);
|
||||||
margin: 0;
|
width: 100%;
|
||||||
}
|
height: 130px;
|
||||||
|
border-radius: 6px 6px 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
|
.card-image:hover {
|
||||||
font-size: 13px;
|
transform: scale(0.98);
|
||||||
color: #676a6c;
|
}
|
||||||
overflow-x: hidden;
|
|
||||||
|
|
||||||
ul {
|
.category {
|
||||||
list-style-type: none;
|
text-transform: uppercase;
|
||||||
}
|
font-size: 0.7em;
|
||||||
|
font-weight: 600;
|
||||||
|
color: rgb(63, 121, 230);
|
||||||
|
padding: 10px 7px 0;
|
||||||
|
}
|
||||||
|
|
||||||
h4 {
|
.category:hover {
|
||||||
margin-top: 0px;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
h2 {
|
.heading {
|
||||||
margin-top: 10px;
|
font-weight: 600;
|
||||||
font-size: 26px;
|
color: rgb(88, 87, 87);
|
||||||
font-weight: 100;
|
padding: 7px;
|
||||||
}
|
}
|
||||||
|
|
||||||
p {
|
.heading:hover {
|
||||||
margin-top: 10px;
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
b {
|
.author {
|
||||||
font-weight: 700;
|
color: gray;
|
||||||
}
|
font-weight: 400;
|
||||||
}
|
font-size: 11px;
|
||||||
|
padding-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
.update-log {
|
.name {
|
||||||
ol {
|
font-weight: 600;
|
||||||
display: block;
|
}
|
||||||
list-style-type: decimal;
|
|
||||||
margin-block-start: 1em;
|
.name:hover {
|
||||||
margin-block-end: 1em;
|
cursor: pointer;
|
||||||
margin-inline-start: 0;
|
|
||||||
margin-inline-end: 0;
|
|
||||||
padding-inline-start: 40px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|||||||
@@ -103,6 +103,7 @@
|
|||||||
<el-button link type="warning" icon="VideoPause" @click="handleStop(scope.row)" v-hasPermi="['video:inspection:stop']" v-if="scope.row.status === '0'">停止</el-button>
|
<el-button link type="warning" icon="VideoPause" @click="handleStop(scope.row)" v-hasPermi="['video:inspection:stop']" v-if="scope.row.status === '0'">停止</el-button>
|
||||||
<el-button link type="success" icon="CaretRight" @click="handleExecute(scope.row)" v-hasPermi="['video:inspection:execute']">执行</el-button>
|
<el-button link type="success" icon="CaretRight" @click="handleExecute(scope.row)" v-hasPermi="['video:inspection:execute']">执行</el-button>
|
||||||
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['video:inspection:remove']">删除</el-button>
|
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['video:inspection:remove']">删除</el-button>
|
||||||
|
<el-button link type="primary" icon="Document" @click="handleDetail(scope.row)" v-hasPermi="['video:inspection:video']">详情</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
@@ -171,6 +172,8 @@
|
|||||||
import { listInspection, getInspection, delInspection, addInspection, updateInspection, startTask, stopTask, executeTask } from "@/api/video/inspection";
|
import { listInspection, getInspection, delInspection, addInspection, updateInspection, startTask, stopTask, executeTask } from "@/api/video/inspection";
|
||||||
import { listDevice } from "@/api/video/device";
|
import { listDevice } from "@/api/video/device";
|
||||||
|
|
||||||
|
import router from '@/router'
|
||||||
|
|
||||||
const { proxy } = getCurrentInstance();
|
const { proxy } = getCurrentInstance();
|
||||||
const { sys_normal_disable } = proxy.useDict('sys_normal_disable');
|
const { sys_normal_disable } = proxy.useDict('sys_normal_disable');
|
||||||
|
|
||||||
@@ -290,6 +293,10 @@ function handleUpdate(row) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function handleDetail(row) {
|
||||||
|
router.push({ path: "/insrecord", query: { taskId: row.taskId } });
|
||||||
|
}
|
||||||
|
|
||||||
/** 提交按钮 */
|
/** 提交按钮 */
|
||||||
function submitForm() {
|
function submitForm() {
|
||||||
proxy.$refs["inspectionRef"].validate(valid => {
|
proxy.$refs["inspectionRef"].validate(valid => {
|
||||||
|
|||||||
@@ -161,6 +161,9 @@ import { listInspection } from "@/api/video/inspection";
|
|||||||
const { proxy } = getCurrentInstance();
|
const { proxy } = getCurrentInstance();
|
||||||
const { ins_record_status } = proxy.useDict('ins_record_status');
|
const { ins_record_status } = proxy.useDict('ins_record_status');
|
||||||
|
|
||||||
|
const route = useRoute();
|
||||||
|
const taskId = route.query.taskId;
|
||||||
|
|
||||||
const inspectionList = ref([]);
|
const inspectionList = ref([]);
|
||||||
const inspectionRecordList = ref([]);
|
const inspectionRecordList = ref([]);
|
||||||
const open = ref(false);
|
const open = ref(false);
|
||||||
@@ -177,7 +180,7 @@ const data = reactive({
|
|||||||
queryParams: {
|
queryParams: {
|
||||||
pageNum: 1,
|
pageNum: 1,
|
||||||
pageSize: 20,
|
pageSize: 20,
|
||||||
taskId: null,
|
taskId: taskId ? parseInt(taskId) : null,
|
||||||
executeTime: null,
|
executeTime: null,
|
||||||
duration: null,
|
duration: null,
|
||||||
accessory: null,
|
accessory: null,
|
||||||
@@ -188,6 +191,13 @@ const data = reactive({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
watch(() => taskId, (newVal) => {
|
||||||
|
if (newVal) {
|
||||||
|
queryParams.value.taskId = parseInt(newVal);
|
||||||
|
getList();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const { queryParams, form, rules } = toRefs(data);
|
const { queryParams, form, rules } = toRefs(data);
|
||||||
|
|
||||||
/** 查询巡检任务记录列表 */
|
/** 查询巡检任务记录列表 */
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ export default defineConfig(({ mode, command }) => {
|
|||||||
proxy: {
|
proxy: {
|
||||||
// https://cn.vitejs.dev/config/#server-proxy
|
// https://cn.vitejs.dev/config/#server-proxy
|
||||||
'/dev-api': {
|
'/dev-api': {
|
||||||
target: 'http://localhost:10081',
|
target: 'http://49.232.154.205:10082',
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
rewrite: (p) => p.replace(/^\/dev-api/, '')
|
rewrite: (p) => p.replace(/^\/dev-api/, '')
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user