Loading src/api/logControl/index.js 0 → 100644 +92 −0 Original line number Diff line number Diff line /** * 查询算法日志信息列表 * @param {string} algorrithmName * @param {string} cameraNo * @param {string} costTime * @param {string} createBy * @param {string} createTime * @param {string} jsonResult * @param {string} operId * @param {string} operParam * @param {string} operTime * @param {string} params * @param {string} remark * @param {string} searchValue * @param {string} status * @param {string} updateBy * @param {string} updateTime * @returns */ import request from '@/utils/request' // 查询摄像头日志列表 export function listCameraLog(query) { return request({ url: '/test/cameraLog/list', method: 'get', params: query }) } // 查询算法日志列表 export function listAlgLog(query) { return request({ url: '/test/algorithmLog/list', method: 'get', params: query }) } // 查询算法日志列表x详情 export function detailAlgLog(id) { return request({ url: `/test/algorithmLog/${id}`, method: 'get', }) } // 修改算法日志状态 export function updateStatusAlgLog(query) { return request({ url: `/test/algorithmLog/updateStatus`, method: 'get', params: query }) } // 新增算法日志列表 export function addAlgLog(data) { return request({ url: '/test/algorithmLog', method: 'post', data: data }) } // 修改算法日志列表 export function updateAlgLog(data) { return request({ url: '/test/algorithmLog', method: 'put', data: data }) } // 删除算法日志列表 export function deleteAlgLog(ids) { return request({ url: `/test/algorithmLog/${ids}`, method: 'delete' }) } // 导出算法日志列表 export function exportAlgLog(data) { return request({ url: `/test/algorithmLog/export`, method: 'post', data: data }) } src/views/alarmControl/components/form.vue +1 −1 Original line number Diff line number Diff line Loading @@ -18,7 +18,7 @@ 预警等级 </div> </template> {{form.alarmLevelId}} {{form.alarmLevelName}} </el-descriptions-item> <el-descriptions-item> <template #label> Loading src/views/alarmControl/index.vue +1 −1 Original line number Diff line number Diff line Loading @@ -74,7 +74,7 @@ <div style="width: 100%;overflow: hidden;"> <ImagePreview style="width: 100%;" :src="item.alarmImg"/> </div> <h2>{{ item.alarmType }}</h2> <h2 :style="{color:item.alarmLevelColor}">{{ item.alarmType }}</h2> <p style="color: #999999;font-size: 12px;"> {{ parseTime(item.alarmTime) }} </p> Loading src/views/algorithmList/components/details.vue +9 −9 Original line number Diff line number Diff line Loading @@ -78,10 +78,6 @@ :isShowTip="false" @update:modelObj="getImgObj" /> <div v-else style="position: absolute;bottom: 5px;left: 26%;" class="text-style"> 请开启算法 </div> <!-- <ImageUpload :limit='1' :fileSize="5" :isShowTip="false" @update:modelObj="getImgObj"/> --> </div> </el-card> <el-card > Loading Loading @@ -116,7 +112,7 @@ <div style="display: flex;justify-content: space-between;margin: 10px 0;"> <!-- <el-button type="primary" plain>重置区域</el-button> --> <div></div> <el-button type="primary" plain @click="downVideo">下载识别视频</el-button> <!-- <el-button type="primary" plain @click="downVideo">下载识别视频</el-button> --> <!-- <el-button v-if="getFileType(outFilePath)=='1'" type="primary" plain @click="downVideo">下载识别视频</el-button> --> </div> </el-card> Loading @@ -136,7 +132,7 @@ </div> <el-divider /> <div class="img-box gird-layout"> <div class="img-item" v-for="item in effectiveList" :key="item.id"> <div class="img-item" v-for="item in invalidImgList" :key="item.id"> <ImagePreview style="height: 100%;" :src="item.caseFile"/> </div> </div> Loading @@ -155,7 +151,7 @@ </div> <el-divider /> <div class="img-box gird-layout" > <div class="img-item" v-for="item in invalidList" :key="item.id"> <div class="img-item" v-for="item in invalidImgList" :key="item.id" > <ImagePreview style="height: 100%;" :src="item.caseFile"/> </div> </div> Loading Loading @@ -191,6 +187,8 @@ const backVideo = ref({}) const applicationList = ref([]) const effectiveList = ref([]) const invalidList = ref([]) const invalidImgList = ref([]) const effectiveImgList = ref([]) const imgVideoData = ref([]) const nowText=ref('算法详情') const baseUrl = 'http://192.168.3.82' Loading Loading @@ -228,6 +226,8 @@ function getDetials(){ listBoundary({ algorithmId: roleId}).then(res=>{ effectiveList.value = res.rows.filter(item => item.caseType === '0') invalidList.value = res.rows.filter(item => item.caseType === '1') invalidImgList.value = res.rows.filter(item => item.caseType === '1'&&item.caseFile) effectiveImgList.value = res.rows.filter(item => item.caseType === '0'&&item.caseFile) }) } /** 查询案例文件列表 */ Loading src/views/logControl/index.vue +178 −192 Original line number Diff line number Diff line Loading @@ -4,11 +4,37 @@ <el-card class="left-list"> <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick"> <el-tab-pane label="摄像头日志" name="摄像头日志"></el-tab-pane> <el-tab-pane label="算法日志" name="算法日志"></el-tab-pane> <el-tab-pane label="操作日志" name="操作日志"></el-tab-pane> </el-tabs> <el-tab-pane label="摄像头日志" name="摄像头日志"> <div> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch"> <el-form-item label="日志时间" prop="name"> <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 label="摄像头" prop="deptName"> <el-select v-model="queryParams.deptName" placeholder="请选择摄像头" clearable style="width: 200px"> <el-option v-for="dict in sys_job_status" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> </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-table v-loading="loading" :data="CameraLogList" @selection-change="handleSelectionChange"> <el-table-column label="摄像头名称" width="200" align="center" prop="areaBelong" /> <el-table-column label="算法编号" align="center" prop="cameraNo" :show-overflow-tooltip="true" /> <el-table-column label="日志详情" align="center" prop="logDesc" :show-overflow-tooltip="true" > </el-table-column> <!-- <el-table-column label="检测结果" align="center" prop="operParam" :show-overflow-tooltip="true" > </el-table-column> <el-table-column label="检测时间" align="center" prop="operTime" :show-overflow-tooltip="true" /> --> </el-table> </div> </el-tab-pane> <el-tab-pane label="算法日志" name="算法日志"> <div> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch"> <el-form-item label="日志时间" prop="name"> <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-" Loading @@ -25,24 +51,21 @@ </el-form-item> </el-form> <el-table v-loading="loading" :data="jobList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> <el-table-column label="姓名" width="100" align="center" prop="jobId" /> <el-table-column label="手机号" align="center" prop="jobName" :show-overflow-tooltip="true" /> <el-table-column label="身份证号" align="center" prop="jobGroup"> <template #default="scope"> <dict-tag :options="sys_job_group" :value="scope.row.jobGroup" /> </template> <el-table v-loading="loading" :data="AlgLogList" @selection-change="handleSelectionChange"> <el-table-column label="算法名称" width="200" align="center" prop="algorrithmName" /> <el-table-column label="算法编号" align="center" prop="cameraNo" :show-overflow-tooltip="true" /> <el-table-column label="返回结果" align="center" prop="jsonResult" :show-overflow-tooltip="true" > </el-table-column> <el-table-column label="检测结果" align="center" prop="operParam" :show-overflow-tooltip="true" > </el-table-column> <el-table-column label="所属部门" align="center" prop="invokeTarget" :show-overflow-tooltip="true" /> <el-table-column label="创建时间" align="center" prop="cronExpression" :show-overflow-tooltip="true" /> <el-table-column label="操作人" align="center"> <el-table-column label="检测时间" align="center" prop="operTime" :show-overflow-tooltip="true" /> <!-- <el-table-column label="操作人" align="center"> <template #default="scope"> <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch> </template> </el-table-column> <el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width"> </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)" Loading @@ -53,100 +76,58 @@ v-hasPermi="['monitor:job:remove']"></el-button> </el-tooltip> </template> </el-table-column> </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="820px" append-to-body> <el-form ref="jobRef" :model="form" :rules="rules" label-width="120px"> <el-row> <el-col :span="12"> <el-form-item label="任务名称" prop="jobName"> <el-input v-model="form.jobName" placeholder="请输入任务名称" /> </div> </el-tab-pane> <el-tab-pane label="操作日志" name="操作日志"> <div> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch"> <el-form-item label="日志时间" prop="name"> <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-col> <el-col :span="12"> <el-form-item label="任务分组" prop="jobGroup"> <el-select v-model="form.jobGroup" placeholder="请选择"> <el-option v-for="dict in sys_job_group" :key="dict.value" :label="dict.label" :value="dict.value"></el-option> </el-select> <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-col> <el-col :span="24"> <el-form-item prop="invokeTarget"> <template #label> <span> 调用方法 <el-tooltip placement="top"> <template #content> <div> Bean调用示例:ryTask.ryParams('ry') <br />Class类调用示例:com.ruoyi.quartz.task.RyTask.ryParams('ry') <br />参数说明:支持字符串,布尔类型,长整型,浮点型,整型 </div> </el-form> <el-table v-loading="loading" :data="OperateLogList" @selection-change="handleSelectionChange"> <el-table-column label="日志编号" align="center" prop="operId" /> <el-table-column label="系统模块" align="center" prop="title" :show-overflow-tooltip="true" /> <el-table-column label="操作类型" align="center" prop="businessType"> <template #default="scope"> <dict-tag :options="sys_oper_type" :value="scope.row.businessType" /> </template> <el-icon><question-filled /></el-icon> </el-tooltip> </span> </el-table-column> <el-table-column label="操作人员" align="center" width="110" prop="operName" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']" /> <el-table-column label="操作地址" align="center" prop="operIp" width="130" :show-overflow-tooltip="true" /> <el-table-column label="操作状态" align="center" prop="status"> <template #default="scope"> <dict-tag :options="sys_common_status" :value="scope.row.status" /> </template> <el-input v-model="form.invokeTarget" placeholder="请输入调用目标字符串" /> </el-form-item> </el-col> <el-col :span="24"> <el-form-item label="cron表达式" prop="cronExpression"> <el-input v-model="form.cronExpression" placeholder="请输入cron执行表达式"> <template #append> <el-button type="primary" @click="handleShowCron"> 生成表达式 <i class="el-icon-time el-icon--right"></i> </el-button> </el-table-column> <el-table-column label="操作日期" align="center" prop="operTime" width="180" sortable="custom" :sort-orders="['descending', 'ascending']"> <template #default="scope"> <span>{{ parseTime(scope.row.operTime) }}</span> </template> </el-input> </el-form-item> </el-col> <el-col :span="24" v-if="form.jobId !== undefined"> <el-form-item label="状态"> <el-radio-group v-model="form.status"> <el-radio v-for="dict in sys_job_status" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio> </el-radio-group> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="执行策略" prop="misfirePolicy"> <el-radio-group v-model="form.misfirePolicy"> <el-radio-button value="1">立即执行</el-radio-button> <el-radio-button value="2">执行一次</el-radio-button> <el-radio-button value="3">放弃执行</el-radio-button> </el-radio-group> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="是否并发" prop="concurrent"> <el-radio-group v-model="form.concurrent"> <el-radio-button value="0">允许</el-radio-button> <el-radio-button value="1">禁止</el-radio-button> </el-radio-group> </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> </el-table-column> <el-table-column label="消耗时间" align="center" prop="costTime" width="110" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']"> <template #default="scope"> <span>{{ scope.row.costTime }}毫秒</span> </template> </el-dialog> </el-table-column> </el-table> </div> </el-tab-pane> </el-tabs> <el-dialog title="Cron表达式生成器" v-model="openCron" append-to-body destroy-on-close> <crontab ref="crontabRef" @hide="openCron = false" @fill="crontabFill" :expression="expression"></crontab> </el-dialog> <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getAllList" /> </el-card> <!-- 任务日志详细 --> <el-dialog title="任务详细" v-model="openView" width="700px" append-to-body> Loading Loading @@ -211,26 +192,22 @@ </template> <script setup name="Job"> import { listJob, getJob, delJob, addJob, updateJob, runJob, changeJobStatus, } from "@/api/monitor/job"; import Crontab from "@/components/Crontab"; import {listAlgLog,listCameraLog} from "@/api/logControl/index"; import { list, } from "@/api/monitor/operlog"; import { get } from "@vueuse/core"; const router = useRouter(); const { proxy } = getCurrentInstance(); const { sys_job_group, sys_job_status } = proxy.useDict( const { sys_job_group, sys_job_status,sys_oper_type, sys_common_status } = proxy.useDict( "sys_job_group", "sys_job_status" "sys_job_status", "sys_oper_type","sys_common_status" ); const nowText = ref("日志管理"); const activeName = ref("摄像头日志"); const jobList = ref([]); const AlgLogList = ref([]); const CameraLogList = ref([]); const OperateLogList = ref([]); const open = ref(false); const loading = ref(true); const showSearch = ref(true); Loading Loading @@ -266,14 +243,47 @@ const data = reactive({ const { queryParams, form, rules } = toRefs(data); function handleClick() { } function handleClick(val) { activeName.value=val.props.name console.log("🚀 ~ handleClick ~ activeName.value:", activeName.value) getAllList() } function getAllList(){ if(activeName.value=='摄像头日志') getCameraLogList() if(activeName.value=='算法日志') getAlgLogList() if(activeName.value=='操作日志') getOperateLogList() } /** 查询算法日志列表 */ function getAlgLogList() { loading.value = true; listAlgLog(proxy.addDateRange(queryParams.value, dateRange.value)).then( (response) => { AlgLogList.value = response.rows; total.value = response.total; loading.value = false; } ); } /** 查询摄像头日志列表 */ function getCameraLogList() { loading.value = true; listCameraLog(proxy.addDateRange(queryParams.value, dateRange.value)).then( (response) => { CameraLogList.value = response.rows; total.value = response.total; loading.value = false; } ); } /** 查询定时任务列表 */ function getList() { /** 查询操作日志列表 */ function getOperateLogList() { loading.value = true; listJob(proxy.addDateRange(queryParams.value, dateRange.value)).then( list(proxy.addDateRange(queryParams.value, dateRange.value)).then( (response) => { jobList.value = response.rows; OperateLogList.value = response.rows; total.value = response.total; loading.value = false; } Loading Loading @@ -309,7 +319,7 @@ function reset() { /** 搜索按钮操作 */ function handleQuery() { queryParams.value.pageNum = 1; getList(); getAllList(); } /** 重置按钮操作 */ Loading Loading @@ -344,18 +354,18 @@ function handleCommand(command, row) { // 任务状态修改 function handleStatusChange(row) { let text = row.status === "0" ? "启用" : "停用"; proxy.$modal .confirm('确认要"' + text + '""' + row.jobName + '"任务吗?') .then(function () { return changeJobStatus(row.jobId, row.status); }) .then(() => { proxy.$modal.msgSuccess(text + "成功"); }) .catch(function () { row.status = row.status === "0" ? "1" : "0"; }); // let text = row.status === "0" ? "启用" : "停用"; // proxy.$modal // .confirm('确认要"' + text + '""' + row.jobName + '"任务吗?') // .then(function () { // return changeJobStatus(row.jobId, row.status); // }) // .then(() => { // proxy.$modal.msgSuccess(text + "成功"); // }) // .catch(function () { // row.status = row.status === "0" ? "1" : "0"; // }); } /* 立即执行一次 */ Loading Loading @@ -385,10 +395,6 @@ function handleShowCron() { openCron.value = true; } /** 确定后回传值 */ function crontabFill(value) { form.value.cronExpression = value; } /** 任务日志列表查询 */ function handleJobLog(row) { Loading @@ -414,26 +420,6 @@ function handleUpdate(row) { }); } /** 提交按钮 */ function submitForm() { proxy.$refs["jobRef"].validate((valid) => { if (valid) { if (form.value.jobId != undefined) { updateJob(form.value).then((response) => { proxy.$modal.msgSuccess("修改成功"); open.value = false; getList(); }); } else { addJob(form.value).then((response) => { proxy.$modal.msgSuccess("新增成功"); open.value = false; getList(); }); } } }); } /** 删除按钮操作 */ function handleDelete(row) { Loading @@ -444,7 +430,7 @@ function handleDelete(row) { return delJob(jobIds); }) .then(() => { getList(); getAlgLogList(); proxy.$modal.msgSuccess("删除成功"); }) .catch(() => { }); Loading @@ -461,7 +447,7 @@ function handleExport() { ); } getList(); getAllList(); </script> <style scoped lang="scss"> .left-list { Loading Loading
src/api/logControl/index.js 0 → 100644 +92 −0 Original line number Diff line number Diff line /** * 查询算法日志信息列表 * @param {string} algorrithmName * @param {string} cameraNo * @param {string} costTime * @param {string} createBy * @param {string} createTime * @param {string} jsonResult * @param {string} operId * @param {string} operParam * @param {string} operTime * @param {string} params * @param {string} remark * @param {string} searchValue * @param {string} status * @param {string} updateBy * @param {string} updateTime * @returns */ import request from '@/utils/request' // 查询摄像头日志列表 export function listCameraLog(query) { return request({ url: '/test/cameraLog/list', method: 'get', params: query }) } // 查询算法日志列表 export function listAlgLog(query) { return request({ url: '/test/algorithmLog/list', method: 'get', params: query }) } // 查询算法日志列表x详情 export function detailAlgLog(id) { return request({ url: `/test/algorithmLog/${id}`, method: 'get', }) } // 修改算法日志状态 export function updateStatusAlgLog(query) { return request({ url: `/test/algorithmLog/updateStatus`, method: 'get', params: query }) } // 新增算法日志列表 export function addAlgLog(data) { return request({ url: '/test/algorithmLog', method: 'post', data: data }) } // 修改算法日志列表 export function updateAlgLog(data) { return request({ url: '/test/algorithmLog', method: 'put', data: data }) } // 删除算法日志列表 export function deleteAlgLog(ids) { return request({ url: `/test/algorithmLog/${ids}`, method: 'delete' }) } // 导出算法日志列表 export function exportAlgLog(data) { return request({ url: `/test/algorithmLog/export`, method: 'post', data: data }) }
src/views/alarmControl/components/form.vue +1 −1 Original line number Diff line number Diff line Loading @@ -18,7 +18,7 @@ 预警等级 </div> </template> {{form.alarmLevelId}} {{form.alarmLevelName}} </el-descriptions-item> <el-descriptions-item> <template #label> Loading
src/views/alarmControl/index.vue +1 −1 Original line number Diff line number Diff line Loading @@ -74,7 +74,7 @@ <div style="width: 100%;overflow: hidden;"> <ImagePreview style="width: 100%;" :src="item.alarmImg"/> </div> <h2>{{ item.alarmType }}</h2> <h2 :style="{color:item.alarmLevelColor}">{{ item.alarmType }}</h2> <p style="color: #999999;font-size: 12px;"> {{ parseTime(item.alarmTime) }} </p> Loading
src/views/algorithmList/components/details.vue +9 −9 Original line number Diff line number Diff line Loading @@ -78,10 +78,6 @@ :isShowTip="false" @update:modelObj="getImgObj" /> <div v-else style="position: absolute;bottom: 5px;left: 26%;" class="text-style"> 请开启算法 </div> <!-- <ImageUpload :limit='1' :fileSize="5" :isShowTip="false" @update:modelObj="getImgObj"/> --> </div> </el-card> <el-card > Loading Loading @@ -116,7 +112,7 @@ <div style="display: flex;justify-content: space-between;margin: 10px 0;"> <!-- <el-button type="primary" plain>重置区域</el-button> --> <div></div> <el-button type="primary" plain @click="downVideo">下载识别视频</el-button> <!-- <el-button type="primary" plain @click="downVideo">下载识别视频</el-button> --> <!-- <el-button v-if="getFileType(outFilePath)=='1'" type="primary" plain @click="downVideo">下载识别视频</el-button> --> </div> </el-card> Loading @@ -136,7 +132,7 @@ </div> <el-divider /> <div class="img-box gird-layout"> <div class="img-item" v-for="item in effectiveList" :key="item.id"> <div class="img-item" v-for="item in invalidImgList" :key="item.id"> <ImagePreview style="height: 100%;" :src="item.caseFile"/> </div> </div> Loading @@ -155,7 +151,7 @@ </div> <el-divider /> <div class="img-box gird-layout" > <div class="img-item" v-for="item in invalidList" :key="item.id"> <div class="img-item" v-for="item in invalidImgList" :key="item.id" > <ImagePreview style="height: 100%;" :src="item.caseFile"/> </div> </div> Loading Loading @@ -191,6 +187,8 @@ const backVideo = ref({}) const applicationList = ref([]) const effectiveList = ref([]) const invalidList = ref([]) const invalidImgList = ref([]) const effectiveImgList = ref([]) const imgVideoData = ref([]) const nowText=ref('算法详情') const baseUrl = 'http://192.168.3.82' Loading Loading @@ -228,6 +226,8 @@ function getDetials(){ listBoundary({ algorithmId: roleId}).then(res=>{ effectiveList.value = res.rows.filter(item => item.caseType === '0') invalidList.value = res.rows.filter(item => item.caseType === '1') invalidImgList.value = res.rows.filter(item => item.caseType === '1'&&item.caseFile) effectiveImgList.value = res.rows.filter(item => item.caseType === '0'&&item.caseFile) }) } /** 查询案例文件列表 */ Loading
src/views/logControl/index.vue +178 −192 Original line number Diff line number Diff line Loading @@ -4,11 +4,37 @@ <el-card class="left-list"> <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick"> <el-tab-pane label="摄像头日志" name="摄像头日志"></el-tab-pane> <el-tab-pane label="算法日志" name="算法日志"></el-tab-pane> <el-tab-pane label="操作日志" name="操作日志"></el-tab-pane> </el-tabs> <el-tab-pane label="摄像头日志" name="摄像头日志"> <div> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch"> <el-form-item label="日志时间" prop="name"> <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 label="摄像头" prop="deptName"> <el-select v-model="queryParams.deptName" placeholder="请选择摄像头" clearable style="width: 200px"> <el-option v-for="dict in sys_job_status" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> </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-table v-loading="loading" :data="CameraLogList" @selection-change="handleSelectionChange"> <el-table-column label="摄像头名称" width="200" align="center" prop="areaBelong" /> <el-table-column label="算法编号" align="center" prop="cameraNo" :show-overflow-tooltip="true" /> <el-table-column label="日志详情" align="center" prop="logDesc" :show-overflow-tooltip="true" > </el-table-column> <!-- <el-table-column label="检测结果" align="center" prop="operParam" :show-overflow-tooltip="true" > </el-table-column> <el-table-column label="检测时间" align="center" prop="operTime" :show-overflow-tooltip="true" /> --> </el-table> </div> </el-tab-pane> <el-tab-pane label="算法日志" name="算法日志"> <div> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch"> <el-form-item label="日志时间" prop="name"> <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-" Loading @@ -25,24 +51,21 @@ </el-form-item> </el-form> <el-table v-loading="loading" :data="jobList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> <el-table-column label="姓名" width="100" align="center" prop="jobId" /> <el-table-column label="手机号" align="center" prop="jobName" :show-overflow-tooltip="true" /> <el-table-column label="身份证号" align="center" prop="jobGroup"> <template #default="scope"> <dict-tag :options="sys_job_group" :value="scope.row.jobGroup" /> </template> <el-table v-loading="loading" :data="AlgLogList" @selection-change="handleSelectionChange"> <el-table-column label="算法名称" width="200" align="center" prop="algorrithmName" /> <el-table-column label="算法编号" align="center" prop="cameraNo" :show-overflow-tooltip="true" /> <el-table-column label="返回结果" align="center" prop="jsonResult" :show-overflow-tooltip="true" > </el-table-column> <el-table-column label="检测结果" align="center" prop="operParam" :show-overflow-tooltip="true" > </el-table-column> <el-table-column label="所属部门" align="center" prop="invokeTarget" :show-overflow-tooltip="true" /> <el-table-column label="创建时间" align="center" prop="cronExpression" :show-overflow-tooltip="true" /> <el-table-column label="操作人" align="center"> <el-table-column label="检测时间" align="center" prop="operTime" :show-overflow-tooltip="true" /> <!-- <el-table-column label="操作人" align="center"> <template #default="scope"> <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch> </template> </el-table-column> <el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width"> </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)" Loading @@ -53,100 +76,58 @@ v-hasPermi="['monitor:job:remove']"></el-button> </el-tooltip> </template> </el-table-column> </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="820px" append-to-body> <el-form ref="jobRef" :model="form" :rules="rules" label-width="120px"> <el-row> <el-col :span="12"> <el-form-item label="任务名称" prop="jobName"> <el-input v-model="form.jobName" placeholder="请输入任务名称" /> </div> </el-tab-pane> <el-tab-pane label="操作日志" name="操作日志"> <div> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch"> <el-form-item label="日志时间" prop="name"> <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-col> <el-col :span="12"> <el-form-item label="任务分组" prop="jobGroup"> <el-select v-model="form.jobGroup" placeholder="请选择"> <el-option v-for="dict in sys_job_group" :key="dict.value" :label="dict.label" :value="dict.value"></el-option> </el-select> <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-col> <el-col :span="24"> <el-form-item prop="invokeTarget"> <template #label> <span> 调用方法 <el-tooltip placement="top"> <template #content> <div> Bean调用示例:ryTask.ryParams('ry') <br />Class类调用示例:com.ruoyi.quartz.task.RyTask.ryParams('ry') <br />参数说明:支持字符串,布尔类型,长整型,浮点型,整型 </div> </el-form> <el-table v-loading="loading" :data="OperateLogList" @selection-change="handleSelectionChange"> <el-table-column label="日志编号" align="center" prop="operId" /> <el-table-column label="系统模块" align="center" prop="title" :show-overflow-tooltip="true" /> <el-table-column label="操作类型" align="center" prop="businessType"> <template #default="scope"> <dict-tag :options="sys_oper_type" :value="scope.row.businessType" /> </template> <el-icon><question-filled /></el-icon> </el-tooltip> </span> </el-table-column> <el-table-column label="操作人员" align="center" width="110" prop="operName" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']" /> <el-table-column label="操作地址" align="center" prop="operIp" width="130" :show-overflow-tooltip="true" /> <el-table-column label="操作状态" align="center" prop="status"> <template #default="scope"> <dict-tag :options="sys_common_status" :value="scope.row.status" /> </template> <el-input v-model="form.invokeTarget" placeholder="请输入调用目标字符串" /> </el-form-item> </el-col> <el-col :span="24"> <el-form-item label="cron表达式" prop="cronExpression"> <el-input v-model="form.cronExpression" placeholder="请输入cron执行表达式"> <template #append> <el-button type="primary" @click="handleShowCron"> 生成表达式 <i class="el-icon-time el-icon--right"></i> </el-button> </el-table-column> <el-table-column label="操作日期" align="center" prop="operTime" width="180" sortable="custom" :sort-orders="['descending', 'ascending']"> <template #default="scope"> <span>{{ parseTime(scope.row.operTime) }}</span> </template> </el-input> </el-form-item> </el-col> <el-col :span="24" v-if="form.jobId !== undefined"> <el-form-item label="状态"> <el-radio-group v-model="form.status"> <el-radio v-for="dict in sys_job_status" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio> </el-radio-group> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="执行策略" prop="misfirePolicy"> <el-radio-group v-model="form.misfirePolicy"> <el-radio-button value="1">立即执行</el-radio-button> <el-radio-button value="2">执行一次</el-radio-button> <el-radio-button value="3">放弃执行</el-radio-button> </el-radio-group> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="是否并发" prop="concurrent"> <el-radio-group v-model="form.concurrent"> <el-radio-button value="0">允许</el-radio-button> <el-radio-button value="1">禁止</el-radio-button> </el-radio-group> </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> </el-table-column> <el-table-column label="消耗时间" align="center" prop="costTime" width="110" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']"> <template #default="scope"> <span>{{ scope.row.costTime }}毫秒</span> </template> </el-dialog> </el-table-column> </el-table> </div> </el-tab-pane> </el-tabs> <el-dialog title="Cron表达式生成器" v-model="openCron" append-to-body destroy-on-close> <crontab ref="crontabRef" @hide="openCron = false" @fill="crontabFill" :expression="expression"></crontab> </el-dialog> <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getAllList" /> </el-card> <!-- 任务日志详细 --> <el-dialog title="任务详细" v-model="openView" width="700px" append-to-body> Loading Loading @@ -211,26 +192,22 @@ </template> <script setup name="Job"> import { listJob, getJob, delJob, addJob, updateJob, runJob, changeJobStatus, } from "@/api/monitor/job"; import Crontab from "@/components/Crontab"; import {listAlgLog,listCameraLog} from "@/api/logControl/index"; import { list, } from "@/api/monitor/operlog"; import { get } from "@vueuse/core"; const router = useRouter(); const { proxy } = getCurrentInstance(); const { sys_job_group, sys_job_status } = proxy.useDict( const { sys_job_group, sys_job_status,sys_oper_type, sys_common_status } = proxy.useDict( "sys_job_group", "sys_job_status" "sys_job_status", "sys_oper_type","sys_common_status" ); const nowText = ref("日志管理"); const activeName = ref("摄像头日志"); const jobList = ref([]); const AlgLogList = ref([]); const CameraLogList = ref([]); const OperateLogList = ref([]); const open = ref(false); const loading = ref(true); const showSearch = ref(true); Loading Loading @@ -266,14 +243,47 @@ const data = reactive({ const { queryParams, form, rules } = toRefs(data); function handleClick() { } function handleClick(val) { activeName.value=val.props.name console.log("🚀 ~ handleClick ~ activeName.value:", activeName.value) getAllList() } function getAllList(){ if(activeName.value=='摄像头日志') getCameraLogList() if(activeName.value=='算法日志') getAlgLogList() if(activeName.value=='操作日志') getOperateLogList() } /** 查询算法日志列表 */ function getAlgLogList() { loading.value = true; listAlgLog(proxy.addDateRange(queryParams.value, dateRange.value)).then( (response) => { AlgLogList.value = response.rows; total.value = response.total; loading.value = false; } ); } /** 查询摄像头日志列表 */ function getCameraLogList() { loading.value = true; listCameraLog(proxy.addDateRange(queryParams.value, dateRange.value)).then( (response) => { CameraLogList.value = response.rows; total.value = response.total; loading.value = false; } ); } /** 查询定时任务列表 */ function getList() { /** 查询操作日志列表 */ function getOperateLogList() { loading.value = true; listJob(proxy.addDateRange(queryParams.value, dateRange.value)).then( list(proxy.addDateRange(queryParams.value, dateRange.value)).then( (response) => { jobList.value = response.rows; OperateLogList.value = response.rows; total.value = response.total; loading.value = false; } Loading Loading @@ -309,7 +319,7 @@ function reset() { /** 搜索按钮操作 */ function handleQuery() { queryParams.value.pageNum = 1; getList(); getAllList(); } /** 重置按钮操作 */ Loading Loading @@ -344,18 +354,18 @@ function handleCommand(command, row) { // 任务状态修改 function handleStatusChange(row) { let text = row.status === "0" ? "启用" : "停用"; proxy.$modal .confirm('确认要"' + text + '""' + row.jobName + '"任务吗?') .then(function () { return changeJobStatus(row.jobId, row.status); }) .then(() => { proxy.$modal.msgSuccess(text + "成功"); }) .catch(function () { row.status = row.status === "0" ? "1" : "0"; }); // let text = row.status === "0" ? "启用" : "停用"; // proxy.$modal // .confirm('确认要"' + text + '""' + row.jobName + '"任务吗?') // .then(function () { // return changeJobStatus(row.jobId, row.status); // }) // .then(() => { // proxy.$modal.msgSuccess(text + "成功"); // }) // .catch(function () { // row.status = row.status === "0" ? "1" : "0"; // }); } /* 立即执行一次 */ Loading Loading @@ -385,10 +395,6 @@ function handleShowCron() { openCron.value = true; } /** 确定后回传值 */ function crontabFill(value) { form.value.cronExpression = value; } /** 任务日志列表查询 */ function handleJobLog(row) { Loading @@ -414,26 +420,6 @@ function handleUpdate(row) { }); } /** 提交按钮 */ function submitForm() { proxy.$refs["jobRef"].validate((valid) => { if (valid) { if (form.value.jobId != undefined) { updateJob(form.value).then((response) => { proxy.$modal.msgSuccess("修改成功"); open.value = false; getList(); }); } else { addJob(form.value).then((response) => { proxy.$modal.msgSuccess("新增成功"); open.value = false; getList(); }); } } }); } /** 删除按钮操作 */ function handleDelete(row) { Loading @@ -444,7 +430,7 @@ function handleDelete(row) { return delJob(jobIds); }) .then(() => { getList(); getAlgLogList(); proxy.$modal.msgSuccess("删除成功"); }) .catch(() => { }); Loading @@ -461,7 +447,7 @@ function handleExport() { ); } getList(); getAllList(); </script> <style scoped lang="scss"> .left-list { Loading