Commit f98e1f1c authored by wp song's avatar wp song

Merge branch 'developer' of http://git.censoft.com.cn/ai-yunshou/ai-yunshou-vue into developer

parents 30fa284e 5f7377ac
# 页面标题
VITE_APP_TITLE = 若依管理系统
VITE_APP_TITLE = AI视频分析管理平台
# 开发环境配置
VITE_APP_ENV = 'development'
# 若依管理系统/开发环境
# AI视频分析管理平台/开发环境
VITE_APP_BASE_API = '/dev-api'
# 页面标题
VITE_APP_TITLE = 若依管理系统
VITE_APP_TITLE = AI视频分析管理平台
# 生产环境配置
VITE_APP_ENV = 'production'
w
# 若依管理系统/生产环境
# AI视频分析管理平台/生产环境
VITE_APP_BASE_API = '/ai'
# 是否在打包时开启压缩,支持 gzip 和 brotli
......
# 页面标题
VITE_APP_TITLE = 若依管理系统
VITE_APP_TITLE = AI视频分析管理平台
# 生产环境配置
VITE_APP_ENV = 'staging'
# 若依管理系统/生产环境
# AI视频分析管理平台/生产环境
VITE_APP_BASE_API = '/stage-api'
# 是否在打包时开启压缩,支持 gzip 和 brotli
......
......@@ -7,7 +7,7 @@
<meta name="renderer" content="webkit">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="icon" href="/favicon.ico">
<title>若依管理系统</title>
<title>AI视频分析管理平台</title>
<!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
<style>
html,
......
{
"name": "ruoyi",
"version": "3.8.8",
"description": "若依管理系统",
"description": "AI视频分析管理平台",
"author": "若依",
"license": "MIT",
"type": "module",
......
......@@ -12,7 +12,7 @@ import request from '@/utils/request'
// 查询算法列表
export function listAlgLevel(query) {
return request({
url: '/system/alarmLevel/list',
url: '/yunshou/alarmLevel/list',
method: 'get',
params: query
})
......@@ -21,7 +21,7 @@ export function listAlgLevel(query) {
// 查询算法列表x详情
export function detailAlgLevel(id) {
return request({
url: `/system/alarmLevel/${id}`,
url: `/yunshou/alarmLevel/${id}`,
method: 'get',
})
}
......@@ -30,7 +30,7 @@ export function detailAlgLevel(id) {
// 新增算法列表
export function addAlgLevel(data) {
return request({
url: '/system/alarmLevel',
url: '/yunshou/alarmLevel',
method: 'post',
data: data
})
......@@ -39,7 +39,7 @@ export function addAlgLevel(data) {
// 修改算法列表
export function updateAlgLevel(data) {
return request({
url: '/system/alarmLevel',
url: '/yunshou/alarmLevel',
method: 'put',
data: data
})
......@@ -49,7 +49,7 @@ export function updateAlgLevel(data) {
// 删除算法列表
export function deleteAlgLevel(ids) {
return request({
url: `/system/alarmLevel/${ids}`,
url: `/yunshou/alarmLevel/${ids}`,
method: 'delete'
})
}
......@@ -24,7 +24,7 @@ import request from '@/utils/request'
// 查询算法列表
export function listAlg(query) {
return request({
url: '/system/aiAlgorithmConfig/list',
url: '/yunshou/aiAlgorithmConfig/list',
method: 'get',
params: query
})
......@@ -33,7 +33,7 @@ export function listAlg(query) {
// 查询算法列表x详情
export function detailAlg(id) {
return request({
url: `/system/aiAlgorithmConfig/${id}`,
url: `/yunshou/aiAlgorithmConfig/${id}`,
method: 'get',
})
}
......@@ -42,7 +42,7 @@ export function detailAlg(id) {
// 新增算法列表
export function addAlg(data) {
return request({
url: '/system/aiAlgorithmConfig',
url: '/yunshou/aiAlgorithmConfig',
method: 'post',
data: data
})
......@@ -51,7 +51,7 @@ export function addAlg(data) {
// 修改算法列表
export function updateAlg(data) {
return request({
url: '/system/aiAlgorithmConfig',
url: '/yunshou/aiAlgorithmConfig',
method: 'put',
data: data
})
......@@ -61,7 +61,7 @@ export function updateAlg(data) {
// 删除算法列表
export function deleteAlg(ids) {
return request({
url: `/system/aiAlgorithmConfig/${ids}`,
url: `/yunshou/aiAlgorithmConfig/${ids}`,
method: 'delete'
})
}
/**
/**
* 新增算法场景
* @param {object} params 算法场景
* @param {number} params.algorithmId 算法id
* @param {string} params.createBy
* @param {object} params.createTime
* @param {number} params.id 主键
* @param {object} params.params
* @param {string} params.remark
* @param {string} params.sceneDetail 场景详情
* @param {string} params.sceneName 场景名称
* @param {string} params.searchValue
* @param {string} params.updateBy
* @param {object} params.updateTime
* @returns
*/
import request from '@/utils/request'
// 查询算法列表
export function listScene(query) {
return request({
url: '/yunshou/aiAlgorithmScene/list',
method: 'get',
params: query
})
}
// 查询算法列表x详情
export function detailScene(id) {
return request({
url: `/yunshou/aiAlgorithmScene/${id}`,
method: 'get',
})
}
// 新增算法列表
export function addScene(data) {
return request({
url: '/yunshou/aiAlgorithmScene',
method: 'post',
data: data
})
}
// 修改算法列表
export function updateScene(data) {
return request({
url: '/yunshou/aiAlgorithmScene',
method: 'put',
data: data
})
}
// 删除算法列表
export function deleteScene(ids) {
return request({
url: `/yunshou/aiAlgorithmScene/${ids}`,
method: 'delete'
})
}
/**
* 新增设备
* @param {object} params 设备表
* @param {string} params.createBy
* @param {object} params.createTime
* @param {object} params.params
* @param {string} params.remark
* @param {string} params.searchValue
* @param {string} params.updateBy
* @param {object} params.updateTime
* @param {string} params.id 主键ID
* @param {string} params.deviceNo 设备编号
* @param {string} params.deviceName 设备名称
* @param {string} params.deviceType 设备类型
* @param {string} params.videoUrlType 视频流类型
* @param {string} params.videoUrl 视频流地址
* @param {string} params.isDel 是否删除(0 正常 / 1 删除)
* @param {string} params.isEffective 是否有效(0 有效 / 1 无效)
* @param {string} params.isOpen 开启状态(0 开启 / 1 关闭)
* @returns
*/
import request from '@/utils/request'
// 查询设备列表
export function listDevice(query) {
return request({
url: '/yunshou/aiDevice/list',
method: 'get',
params: query
})
}
// 查询设备列表x详情
export function detailDevice(id) {
return request({
url: `/yunshou/aiDevice/${id}`,
method: 'get',
})
}
// 修改设备状态
export function updateStatusDevice(query) {
return request({
url: `/yunshou/aiDevice/updateStatus`,
method: 'get',
params: query
})
}
// 新增设备列表
export function addDevice(data) {
return request({
url: '/yunshou/aiDevice',
method: 'post',
data: data
})
}
// 修改设备列表
export function updateDevice(data) {
return request({
url: '/yunshou/aiDevice',
method: 'put',
data: data
})
}
// 删除设备列表
export function deleteDevice(ids) {
return request({
url: `/yunshou/aiDevice/${ids}`,
method: 'delete'
})
}
// 导出设备列表
export function exportDevice(data) {
return request({
url: `/yunshou/aiDevice/export`,
method: 'post',
data: data
})
}
......@@ -15,7 +15,9 @@
-webkit-transition: width .28s;
transition: width 0.28s;
width: $base-sidebar-width !important;
background-color: $base-menu-background;
// background-color: $base-menu-background;
background-image: url("../images/side.png") !important;
background-size: cover;
height: 100%;
position: fixed;
font-size: 0px;
......
......@@ -78,7 +78,7 @@ const number = ref(0);
const uploadList = ref([]);
const dialogImageUrl = ref("");
const dialogVisible = ref(false);
const baseUrl = import.meta.env.VITE_APP_BASE_API;
const baseUrl = 'http://192.168.4.206'
const uploadImgUrl = ref(import.meta.env.VITE_APP_BASE_API + "/common/upload"); // 上传的图片服务器地址
const headers = ref({ Authorization: "Bearer " + getToken() });
const fileList = ref([]);
......@@ -95,6 +95,7 @@ watch(() => props.modelValue, val => {
if (typeof item === "string") {
if (item.indexOf(baseUrl) === -1) {
item = { name: baseUrl + item, url: baseUrl + item };
console.log("🚀 ~ watch ~ item:", item)
} else {
item = { name: item, url: item };
}
......
......@@ -105,9 +105,10 @@ function setLayout() {
height: 50px;
overflow: hidden;
position: relative;
background: #fff;
// background: #fff;
box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
background-image: url("../../assets/images/top.png");
background-size: cover;
.hamburger-container {
line-height: 46px;
height: 100%;
......
......@@ -5,7 +5,7 @@
<el-menu
:default-active="activeMenu"
:collapse="isCollapse"
:background-color="sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground"
:background-color="'none'"
:text-color="sideTheme === 'theme-dark' ? variables.menuColor : variables.menuLightColor"
:unique-opened="true"
:active-text-color="theme"
......
......@@ -2,7 +2,7 @@
<el-dialog
v-model="open"
:title="title"
width="800px"
width="1000px"
append-to-body
>
<template v-slot:header>
......@@ -10,6 +10,7 @@
<img src="@/assets/images/logo_video.png" width="25px" alt=""> <span>{{title}}</span>
</div>
</template>
<div v-if="isAdd">
<el-row :gutter="10" class="mb8">
<div class="form-title" style="display: flex;justify-content: flex-start;align-items: center;">
<span>基础信息</span>
......@@ -98,6 +99,223 @@
</el-table-column>
</el-table>
</el-card>
</div>
<el-form ref="algRef" :model="form" :rules="rules" label-width="80px" v-else>
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="基础信息" name="基础信息">
<el-row :gutter="10" class="mb8">
<div class="form-title" style="display: flex;justify-content: flex-start;align-items: center;">
<span>基础信息</span>
</div>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="算法名称" prop="algorithmName">
<el-input v-model="form.algorithmName" placeholder="请输入岗位名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="算法英文" prop="algorithmEnglish">
<el-input v-model="form.algorithmEnglish" placeholder="请输入编码名称" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="硬件平台" prop="algorithmPlat">
<el-select v-model="form.algorithmPlat" placeholder="请选择硬件平台" clearable >
<el-option :label="'英伟达'" :value="'英伟达'"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="算法场景" prop="applicationScenarios">
<el-input v-model="form.applicationScenarios" placeholder="请输入算法场景" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="卡片文案" prop="cardCopywriting">
<el-input v-model="form.cardCopywriting" type="textarea" :rows="8" placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="卡片图片" prop="cardImg">
<ImageUpload :modelValue="form.cardImg" :limit='1' :fileSize="5" @update:modelValue="getImageUrl"/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10" class="mb8" style="justify-content: space-between;">
<el-col :span="1.5">
<div class="form-title" style="display: flex;justify-content: flex-start;align-items: center;">
<span>算法维护</span>
</div>
</el-col>
<el-col :span="6.8" style="display: flex;">
<el-button
type="primary"
plain
icon="Search"
@click="handleAdd"
>搜索</el-button>
<el-button
type="success"
plain
icon="Refresh"
@click="handleUpdate"
>版本更新</el-button>
<el-button
type="success"
plain
icon="UploadFilled"
@click="handleUpdate"
>算法上传</el-button>
</el-col>
</el-row>
<el-card class="left-list">
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
<el-table-column label="文件名称" align="center" prop="postId" />
<el-table-column label="状态" align="center" prop="postCode" />
<el-table-column label="MD5核对结果" align="center" prop="postName" />
<el-table-column label="文件大小" align="center" prop="postSort" />
<el-table-column label="进度" align="center" prop="postSort" />
<el-table-column label="操作" width="180" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:post:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:post:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
</el-tab-pane>
<el-tab-pane label="算法详情" name="算法详情">
<el-row :gutter="10" class="mb8">
<div class="form-title" style="display: flex;justify-content: flex-start;align-items: center;">
<span>算法详情页Banner</span>
</div>
</el-row>
<el-row :gutter="10" class="mb8">
<el-col :span="12">
<el-form-item label-width="130px" label="算法Banner" prop="algorithmBanner">
<ImageUpload :modelValue="form.algorithmBanner" :limit='1' :fileSize="5" @update:modelValue="getImageUrl"/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10" class="mb8">
<div class="form-title" style="display: flex;justify-content: flex-start;align-items: center;">
<span>算法详情页banner卡片信息</span>
</div>
</el-row>
<el-row :gutter="10" class="mb8">
<el-col :span="12">
<el-form-item label-width="130px" label="基础准确率" prop="basicAccuracy">
<el-input v-model="form.basicAccuracy" placeholder="请输入基础准确率" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10" class="mb8">
<el-col :span="12">
<el-form-item label-width="130px" label="场景优化准确率" prop="sceneOptimizationAccuracy">
<el-input v-model="form.sceneOptimizationAccuracy" placeholder="请输入场景优化准确率" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10" class="mb8">
<el-col :span="12">
<el-form-item label-width="130px" label="算法介绍" prop="algorithmIntroduce">
<el-input v-model="form.algorithmIntroduce" placeholder="请输入算法介绍" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10" class="mb8">
<div class="form-title" style="display: flex;justify-content: flex-start;align-items: center;">
<span>算法详情页视频</span>
</div>
</el-row>
<el-row :gutter="10" class="mb8">
<el-col :span="12">
<el-form-item label-width="130px" label="banner上算法视频" prop="algorithmBannerVideo">
<ImageUpload :modelValue="form.algorithmBannerVideo" :limit='1' :fileSize="30" @update:modelValue="getImageUrl"/>
</el-form-item>
</el-col>
</el-row>
<!-- <el-row :gutter="10" class="mb8">
<div class="form-title" style="display: flex;justify-content: flex-start;align-items: center;">
<span>在线体验案例图片/视频(内置)</span>
</div>
</el-row>
<el-row :gutter="10" class="mb8">
<el-col :span="12">
<el-form-item label-width="130px" label="banner上算法视频" prop="algorithmBannerVideo">
<ImageUpload :modelValue="form.algorithmBannerVideo" :limit='1' :fileSize="30" @update:modelValue="getImageUrl"/>
</el-form-item>
</el-col>
</el-row> -->
</el-tab-pane>
<el-tab-pane label="算法边界" name="算法边界">
<el-row :gutter="10" class="mb8">
<div class="form-title" style="display: flex;justify-content: flex-start;align-items: center;">
<span>算法边界</span>
</div>
</el-row>
<el-row :gutter="10" class="mb8" style="justify-content: space-between;">
<el-col :span="6.8" style="display: flex;">
<el-button
type="primary"
plain
icon="Plus"
@click="handleUpdate"
>新建边界</el-button>
</el-col>
</el-row>
<el-card class="left-list">
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
<el-table-column label="边界类型" align="center" prop="postId" />
<el-table-column label="场景名称(介绍)" align="center" prop="postCode" />
<el-table-column label="场景案例图" align="center" prop="postName" />
<el-table-column label="操作" width="180" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:post:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:post:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
</el-tab-pane>
<el-tab-pane label="算法场景" name="算法场景">
<el-row :gutter="10" class="mb8">
<div class="form-title" style="display: flex;justify-content: flex-start;align-items: center;">
<span>应用场景信息</span>
</div>
</el-row>
<el-row :gutter="10" class="mb8" style="justify-content: space-between;">
<el-col :span="6.8" style="display: flex;">
<el-button
type="primary"
plain
icon="Plus"
@click="handleSceneAdd"
>新建场景</el-button>
</el-col>
</el-row>
<el-card class="left-list">
<el-table :data="sceneList">
<el-table-column label="场景名称" align="center" prop="sceneName" />
<el-table-column label="场景详情" align="center" prop="sceneDetail" />
<el-table-column label="操作" width="180" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleSceneUpdate(scope.row)" >修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleSceneDelete(scope.row)" >删除</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
</el-tab-pane>
</el-tabs>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
......@@ -105,17 +323,58 @@
</div>
</template>
</el-dialog>
<el-dialog
v-model="openScene"
:title="titleScene"
width="800px"
append-to-body
>
<template v-slot:header>
<div class="cleartitle" style="display: flex;justify-content: flex-start;align-items: center;">
<img src="@/assets/images/logo_video.png" width="25px" alt=""> <span>{{titleScene}}</span>
</div>
</template>
<el-form ref="sceneRef" :model="formScene" :rules="rules" label-width="80px">
<el-row>
<el-col :span="12">
<el-form-item label="场景名称" prop="sceneName">
<el-input v-model="formScene.sceneName" placeholder="请输入场景名称" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="场景详情" prop="sceneDetail">
<el-input v-model="formScene.sceneDetail" placeholder="请输入场景详情" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitSceneRefForm">确 定</el-button>
<el-button @click="cancelScene">取 消</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { addAlg, updateAlg , detailAlg} from "@/api/algorithmList/index.js";
import { listScene, detailScene , addScene, updateScene, deleteScene} from "@/api/algorithmList/scene.js";
const { proxy } = getCurrentInstance();
const emit = defineEmits();
const open = ref(false);
const openScene = ref(false);
const isAdd = ref(true);
const title = ref("");
const titleScene = ref("");
const activeName = ref("基础信息");
const sceneList = ref([]);
const ids = ref([]);
const data = reactive({
form: {},
formScene: {},
queryParams: {
pageNum: 1,
pageSize: 10,
......@@ -131,7 +390,7 @@ const data = reactive({
}
});
const { queryParams, form, rules } = toRefs(data);
const { queryParams, form, formScene, rules } = toRefs(data);
function getImageUrl(url){
form.value.cardImg=url
......@@ -156,16 +415,19 @@ function reset() {
function handleAdd() {
reset();
open.value = true;
isAdd.value = true;
title.value = "添加算法";
}
/** 修改按钮操作 */
function handleUpdate(row) {
getSceneList();
reset();
const id = row.id || ids.value;
detailAlg(id).then(response => {
form.value = response.data;
open.value = true;
isAdd.value = false;
title.value = "修改算法";
});
}
......@@ -190,11 +452,86 @@ function submitForm() {
}
});
}
/** 取消按钮 */
function cancel() {
open.value = false;
reset();
}
/** 查询场景列表 */
function getSceneList() {
listScene().then(response => {
sceneList.value = response.rows;
});
}
/** 表单重置 */
function resetScene() {
formScene.value = {
algorithmId: form.value.id,
sceneName: undefined,
sceneDetail: undefined,
remark: undefined
};
proxy.resetForm("sceneRef");
}
/** 场景新增按钮操作 */
function handleSceneAdd() {
resetScene();
openScene.value = true;
titleScene.value = "添加场景";
}
/** 删除按钮操作 */
function handleSceneDelete(row) {
const id = row.id || ids.value;
proxy.$modal.confirm('是否确认删除定时任务编号为"' + id + '"的数据项?').then(function () {
return deleteScene(id);
}).then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
}).catch(() => {});
}
/** 修改按钮操作 */
function handleSceneUpdate(row) {
resetScene();
const id = row.id || ids.value;
detailScene(id).then(response => {
formScene.value = response.data;
openScene.value = true;
titleScene.value = "修改场景";
});
}
/** 提交按钮 */
function submitSceneRefForm() {
proxy.$refs["sceneRef"].validate(valid => {
if (valid) {
if (formScene.value.id != undefined) {
updateScene(formScene.value).then(response => {
proxy.$modal.msgSuccess("修改成功");
openScene.value = false;
getSceneList()
});
} else {
addScene(formScene.value).then(response => {
proxy.$modal.msgSuccess("新增成功");
openScene.value = false;
getSceneList()
});
}
}
});
}
/** 取消按钮 */
function cancelScene() {
openScene.value = false;
resetScene();
}
defineExpose({ handleAdd , handleUpdate })
</script>
<style scoped lang="scss">
......
......@@ -97,9 +97,10 @@
{{item.cardCopywriting}}
</p>
<div style="display: flex;justify-content: flex-end;position: absolute;right: 15px;bottom: 10px;" >
<el-button link type="primary" icon="Edit" @click.stop="handleUpdate(item)" >启用</el-button>
<el-button link type="primary" icon="Edit" @click.stop="handleUpdate(item)" >修改</el-button>
<el-button link type="primary" icon="Delete" @click.stop="handleDelete(item)">删除</el-button>
<el-dropdown trigger="click" @command.stop="handleSetSize">
<!-- <el-dropdown trigger="click" @command.stop="handleSetSize">
<el-button link type="primary">
<el-icon class="el-icon--right">
<arrow-down />
......@@ -117,7 +118,7 @@
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</el-dropdown> -->
</div>
</template>
</el-card>
......
<template>
<div class="app-container">
<TabTitle :text="nowText" />
<el-card class="left-list">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
<el-form-item label="设备名称" prop="deviceName">
<el-input
v-model="queryParams.deviceName"
placeholder="请输入设备名称"
clearable
style="width: 200px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="设备是否有效" prop="isEffective">
<el-select v-model="queryParams.isEffective" placeholder="请选择是否有效" clearable style="width: 200px">
<el-option :label="'有效'" :value="'0'" />
<el-option :label="'无效'" :value="'1'" />
</el-select>
</el-form-item>
<el-form-item label="状态" prop="isOpen">
<el-select v-model="queryParams.isOpen" placeholder="请选择所属部门" clearable style="width: 200px">
<el-option :label="'运行中'" :value="'0'" />
<el-option :label="'已禁用'" :value="'1'" />
</el-select>
</el-form-item>
<el-form-item label="创建时间" >
<el-date-picker
v-model="dateRange"
value-format="YYYY-MM-DD"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
>新增</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['monitor:job:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['monitor:job:remove']"
>删除</el-button>
</el-col> -->
<!-- <el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['monitor:job:export']"
>导入</el-button>
</el-col> -->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="deviceList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="设备名称" width="100" align="center" prop="deviceName" />
<el-table-column label="设备编码" align="center" prop="deviceNo" :show-overflow-tooltip="true" />
<el-table-column label="设备视频流地址" align="center" prop="videoUrl" />
<el-table-column label="创建人" align="center" prop="createBy" :show-overflow-tooltip="true" />
<el-table-column label="创建时间" align="center" prop="createTime" :show-overflow-tooltip="true" />
<el-table-column label="设备是否有效" align="center" prop="isEffective" :show-overflow-tooltip="true" >
<template #default="scope">
<el-tag
:type="scope.row.isEffective === '0'?'success' : 'danger'"
effect="dark"
>
{{scope.row.isEffective === '0'? '有效' : '无效'}}
</el-tag>
</template>
</el-table-column>
<el-table-column label="状态" align="center" prop="isOpen" :show-overflow-tooltip="true" >
<template #default="scope">
<el-tag
:type="scope.row.isOpen === '0'?'success' : 'danger'"
effect="dark"
>
{{scope.row.isOpen === '0'? '运行中' : '已禁用'}}
</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="禁用" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['monitor:job:edit']"></el-button>
</el-tooltip>
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['monitor:job:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['monitor:job:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</el-card>
<!-- 添加或修改定时任务对话框 -->
<el-dialog :title="title" v-model="open" width="800px" append-to-body>
<template v-slot:header>
<div class="cleartitle" style="display: flex;justify-content: flex-start;align-items: center;">
<img src="@/assets/images/logo_video.png" width="25px" alt=""> <span>{{title}}</span>
</div>
</template>
<el-form ref="deviceRef" :model="form" :rules="rules" label-width="120px">
<el-row>
<el-col :span="24">
<el-form-item label="设备名称" prop="deviceName">
<el-input v-model="form.deviceName" placeholder="请输入设备名称" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="设备编码" prop="deviceNo">
<el-input v-model="form.deviceNo" placeholder="请输入设备编码" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="视频流类型" prop="videoUrlType">
<el-select v-model="form.videoUrlType" placeholder="请选择视频流类型" clearable >
<el-option :label="'RTSP类型'" :value="'rtsp'" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="视频流地址" prop="videoUrl">
<el-input v-model="form.videoUrl" placeholder="请输入视频流类型" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="Job">
import { listDevice, deleteDevice, addDevice, updateDevice, detailDevice } from "@/api/yunshou/device";
const router = useRouter();
const { proxy } = getCurrentInstance();
const { sys_job_group, sys_job_status } = proxy.useDict("sys_job_group", "sys_job_status");
const nowText = ref("设备管理");
const deviceList = ref([]);
const open = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref([]);
const dateRange = ref([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const title = ref("");
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
jobName: undefined,
jobGroup: undefined,
status: undefined
},
rules: {
deviceName: [{ required: true, message: "设备名称不能为空", trigger: "blur" }],
deviceNo: [{ required: true, message: "设备编码不能为空", trigger: "blur" }],
videoUrl: [{ required: true, message: "视频流地址不能为空", trigger: "blur" }]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询定时任务列表 */
function getList() {
loading.value = true;
listDevice(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => {
deviceList.value = response.rows;
total.value = response.total;
loading.value = false;
});
}
/** 任务组名字典翻译 */
function jobGroupFormat(row, column) {
return proxy.selectDictLabel(sys_job_group.value, row.jobGroup);
}
/** 取消按钮 */
function cancel() {
open.value = false;
reset();
}
/** 表单重置 */
function reset() {
form.value = {
videoUrlType: 'rtsp',
videoUrl: undefined,
deviceNo: undefined,
deviceName: undefined,
isOpen: '0',
isEffective: "0"
};
proxy.resetForm("deviceRef");
}
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
function resetQuery() {
proxy.resetForm("queryRef");
handleQuery();
}
// 多选框选中数据
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
// 任务状态修改
function handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用";
proxy.$modal.confirm('确认要"' + text + '""' + row.jobName + '"任务吗?').then(function () {
return changeJobStatus(row.id, row.status);
}).then(() => {
proxy.$modal.msgSuccess(text + "成功");
}).catch(function () {
row.status = row.status === "0" ? "1" : "0";
});
}
/** 新增按钮操作 */
function handleAdd() {
reset();
open.value = true;
title.value = "添加设备";
}
/** 修改按钮操作 */
function handleUpdate(row) {
reset();
const id = row.id || ids.value;
detailDevice(id).then(response => {
form.value = response.data;
open.value = true;
title.value = "修改设备";
});
}
/** 提交按钮 */
function submitForm() {
proxy.$refs["deviceRef"].validate(valid => {
if (valid) {
if (form.value.id != undefined) {
updateDevice(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功");
open.value = false;
getList();
});
} else {
addDevice(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功");
open.value = false;
getList();
});
}
}
});
}
/** 删除按钮操作 */
function handleDelete(row) {
const ids = row.id || ids.value;
proxy.$modal.confirm('是否确认删除定时任务编号为"' + ids + '"的数据项?').then(function () {
return deleteDevice(ids);
}).then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
}).catch(() => {});
}
/** 导出按钮操作 */
function handleExport() {
proxy.download("monitor/job/export", {
...queryParams.value,
}, `job_${new Date().getTime()}.xlsx`);
}
getList();
</script>
<style scoped lang="scss">
.left-list{
min-height: 700px;
}
</style>
<template>
<div class="login">
<el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
<h3 class="title">若依后台管理系统</h3>
<h3 class="title">AI视频分析管理平台</h3>
<el-form-item prop="username">
<el-input
v-model="loginForm.username"
......@@ -59,7 +59,7 @@
</el-form>
<!-- 底部 -->
<div class="el-login-footer">
<span>Copyright © 2018-2024 ruoyi.vip All Rights Reserved.</span>
<span>Copyright © 2002-2024 CENSOFT All Rights Reserved.</span>
</div>
</div>
</template>
......@@ -168,7 +168,7 @@ getCookie();
justify-content: center;
align-items: center;
height: 100%;
background-image: url("../assets/images/login-background.jpg");
background-image: url("../assets/images/bg.png");
background-size: cover;
}
.title {
......
<template>
<div class="register">
<el-form ref="registerRef" :model="registerForm" :rules="registerRules" class="register-form">
<h3 class="title">若依后台管理系统</h3>
<h3 class="title">AI视频分析管理平台</h3>
<el-form-item prop="username">
<el-input
v-model="registerForm.username"
......@@ -160,7 +160,7 @@ getCode();
justify-content: center;
align-items: center;
height: 100%;
background-image: url("../assets/images/login-background.jpg");
background-image: url("../assets/images/bg.png");
background-size: cover;
}
.title {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment