Commit c3f04157 authored by 胡占生's avatar 胡占生 🇨🇳

feat:视频管理,页面调整。

parent 344cdd20
<template> <template>
<el-card class="tab-title"> <el-card class="tab-title">
{{ text }} {{ text }}
</el-card> </el-card>
</template> </template>
<script> <script>
...@@ -16,28 +16,33 @@ export default defineComponent({ ...@@ -16,28 +16,33 @@ export default defineComponent({
</script> </script>
<style scope lang="scss"> <style scope lang="scss">
.tab-title{ .tab-title {
display: flex; display: flex;
align-items:center;/*for vertical align*/ align-items: center;
font-size: 20px; /*for vertical align*/
height: 50px; font-size: 20px;
color: #1890FF; height: 50px;
background-color: #fff; color: #1890FF;
margin-bottom: 10px; background-color: #fff;
border-radius: 5px; margin-bottom: 10px;
padding: 0; border-radius: 5px;
.el-card__body{ padding: 0;
padding: 0 !important;
} .el-card__body {
} padding: 0 !important;
.tab-title::before{ }
content:""; }
display: inline-block;
width: 8px; /* 矩形的宽度 */
height: 28px; /* 矩形的高度 */
background-color: #1890FF; /* 矩形的背景颜色 */
margin-right: 8px;
border-radius: 8px;
}
</style> .tab-title::before {
content: "";
display: inline-block;
width: 8px;
/* 矩形的宽度 */
height: 28px;
/* 矩形的高度 */
background-color: #1890FF;
/* 矩形的背景颜色 */
margin-right: 8px;
border-radius: 8px;
margin-left: 8px;
}</style>
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
default-active="2" default-active="2"
class="el-menu-vertical-demo" class="el-menu-vertical-demo"
> >
<el-menu-item v-for="item in algorithmList" :index="item.name"> <el-menu-item v-for="item in algorithmList" :key="item.name" :index="item.name">
<span>{{ item.name }}</span> <span>{{ item.name }}</span>
</el-menu-item> </el-menu-item>
</el-menu> </el-menu>
......
<template> <template>
<div class="app-container"> <div class="app-container">
<TabTitle :text="nowText" /> <TabTitle :text="nowText" />
<el-card class="left-list"> <el-card class="left-list">
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick"> <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-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-tabs>
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
<el-form-item label="日志时间" prop="name"> <el-form-item label="日志时间" prop="name">
<el-date-picker <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
v-model="dateRange" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
value-format="YYYY-MM-DD" </el-form-item>
type="daterange" <el-form-item label="摄像头" prop="deptName">
range-separator="-" <el-select v-model="queryParams.deptName" placeholder="请选择摄像头" clearable style="width: 200px">
start-placeholder="开始日期" <el-option v-for="dict in sys_job_status" :key="dict.value" :label="dict.label" :value="dict.value" />
end-placeholder="结束日期" </el-select>
></el-date-picker> </el-form-item>
</el-form-item> <el-form-item>
<el-form-item label="摄像头" prop="deptName"> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-select v-model="queryParams.deptName" placeholder="请选择摄像头" clearable style="width: 200px"> <el-button icon="Refresh" @click="resetQuery">重置</el-button>
<el-option </el-form-item>
v-for="dict in sys_job_status" </el-form>
:key="dict.value"
:label="dict.label" <el-table v-loading="loading" :data="jobList" @selection-change="handleSelectionChange">
:value="dict.value" <el-table-column type="selection" width="55" align="center" />
/> <el-table-column label="姓名" width="100" align="center" prop="jobId" />
</el-select> <el-table-column label="手机号" align="center" prop="jobName" :show-overflow-tooltip="true" />
</el-form-item> <el-table-column label="身份证号" align="center" prop="jobGroup">
<el-form-item> <template #default="scope">
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <dict-tag :options="sys_job_group" :value="scope.row.jobGroup" />
<el-button icon="Refresh" @click="resetQuery">重置</el-button> </template>
</el-form-item> </el-table-column>
</el-form> <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 v-loading="loading" :data="jobList" @selection-change="handleSelectionChange"> <el-table-column label="操作人" align="center">
<el-table-column type="selection" width="55" align="center" /> <template #default="scope">
<el-table-column label="姓名" width="100" align="center" prop="jobId" /> <el-switch v-model="scope.row.status" active-value="0" inactive-value="1"
<el-table-column label="手机号" align="center" prop="jobName" :show-overflow-tooltip="true" /> @change="handleStatusChange(scope.row)"></el-switch>
<el-table-column label="身份证号" align="center" prop="jobGroup"> </template>
<template #default="scope"> </el-table-column>
<dict-tag :options="sys_job_group" :value="scope.row.jobGroup" /> <el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width">
</template> <template #default="scope">
</el-table-column> <el-tooltip content="修改" placement="top">
<el-table-column label="所属部门" align="center" prop="invokeTarget" :show-overflow-tooltip="true" /> <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
<el-table-column label="创建时间" align="center" prop="cronExpression" :show-overflow-tooltip="true" /> v-hasPermi="['monitor:job:edit']"></el-button>
<el-table-column label="操作人" align="center"> </el-tooltip>
<template #default="scope"> <el-tooltip content="删除" placement="top">
<el-switch <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-model="scope.row.status" v-hasPermi="['monitor:job:remove']"></el-button>
active-value="0" </el-tooltip>
inactive-value="1" </template>
@change="handleStatusChange(scope.row)" </el-table-column>
></el-switch> </el-table>
</template>
</el-table-column> <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
<el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width"> v-model:limit="queryParams.pageSize" @pagination="getList" />
<template #default="scope"> </el-card>
<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-dialog :title="title" v-model="open" width="820px" append-to-body>
<el-tooltip content="删除" placement="top"> <el-form ref="jobRef" :model="form" :rules="rules" label-width="120px">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['monitor:job:remove']"></el-button> <el-row>
</el-tooltip> <el-col :span="12">
</template> <el-form-item label="任务名称" prop="jobName">
</el-table-column> <el-input v-model="form.jobName" placeholder="请输入任务名称" />
</el-table> </el-form-item>
</el-col>
<pagination <el-col :span="12">
v-show="total > 0" <el-form-item label="任务分组" prop="jobGroup">
:total="total" <el-select v-model="form.jobGroup" placeholder="请选择">
v-model:page="queryParams.pageNum" <el-option v-for="dict in sys_job_group" :key="dict.value" :label="dict.label"
v-model:limit="queryParams.pageSize" :value="dict.value"></el-option>
@pagination="getList" </el-select>
/> </el-form-item>
</el-card> </el-col>
<el-col :span="24">
<!-- 添加或修改定时任务对话框 --> <el-form-item prop="invokeTarget">
<el-dialog :title="title" v-model="open" width="820px" append-to-body> <template #label>
<el-form ref="jobRef" :model="form" :rules="rules" label-width="120px"> <span>
<el-row> 调用方法
<el-col :span="12"> <el-tooltip placement="top">
<el-form-item label="任务名称" prop="jobName"> <template #content>
<el-input v-model="form.jobName" placeholder="请输入任务名称" /> <div>
</el-form-item> Bean调用示例:ryTask.ryParams('ry')
</el-col> <br />Class类调用示例:com.ruoyi.quartz.task.RyTask.ryParams('ry')
<el-col :span="12"> <br />参数说明:支持字符串,布尔类型,长整型,浮点型,整型
<el-form-item label="任务分组" prop="jobGroup"> </div>
<el-select v-model="form.jobGroup" placeholder="请选择"> </template>
<el-option <el-icon><question-filled /></el-icon>
v-for="dict in sys_job_group" </el-tooltip>
:key="dict.value" </span>
:label="dict.label" </template>
:value="dict.value" <el-input v-model="form.invokeTarget" placeholder="请输入调用目标字符串" />
></el-option> </el-form-item>
</el-select> </el-col>
</el-form-item> <el-col :span="24">
</el-col> <el-form-item label="cron表达式" prop="cronExpression">
<el-col :span="24"> <el-input v-model="form.cronExpression" placeholder="请输入cron执行表达式">
<el-form-item prop="invokeTarget"> <template #append>
<template #label> <el-button type="primary" @click="handleShowCron">
<span> 生成表达式
调用方法 <i class="el-icon-time el-icon--right"></i>
<el-tooltip placement="top"> </el-button>
<template #content> </template>
<div> </el-input>
Bean调用示例:ryTask.ryParams('ry') </el-form-item>
<br />Class类调用示例:com.ruoyi.quartz.task.RyTask.ryParams('ry') </el-col>
<br />参数说明:支持字符串,布尔类型,长整型,浮点型,整型 <el-col :span="24" v-if="form.jobId !== undefined">
</div> <el-form-item label="状态">
</template> <el-radio-group v-model="form.status">
<el-icon><question-filled /></el-icon> <el-radio v-for="dict in sys_job_status" :key="dict.value" :value="dict.value">{{ dict.label
</el-tooltip> }}</el-radio>
</span> </el-radio-group>
</template> </el-form-item>
<el-input v-model="form.invokeTarget" placeholder="请输入调用目标字符串" /> </el-col>
</el-form-item> <el-col :span="12">
</el-col> <el-form-item label="执行策略" prop="misfirePolicy">
<el-col :span="24"> <el-radio-group v-model="form.misfirePolicy">
<el-form-item label="cron表达式" prop="cronExpression"> <el-radio-button value="1">立即执行</el-radio-button>
<el-input v-model="form.cronExpression" placeholder="请输入cron执行表达式"> <el-radio-button value="2">执行一次</el-radio-button>
<template #append> <el-radio-button value="3">放弃执行</el-radio-button>
<el-button type="primary" @click="handleShowCron"> </el-radio-group>
生成表达式 </el-form-item>
<i class="el-icon-time el-icon--right"></i> </el-col>
</el-button> <el-col :span="12">
</template> <el-form-item label="是否并发" prop="concurrent">
</el-input> <el-radio-group v-model="form.concurrent">
</el-form-item> <el-radio-button value="0">允许</el-radio-button>
</el-col> <el-radio-button value="1">禁止</el-radio-button>
<el-col :span="24" v-if="form.jobId !== undefined"> </el-radio-group>
<el-form-item label="状态"> </el-form-item>
<el-radio-group v-model="form.status"> </el-col>
<el-radio </el-row>
v-for="dict in sys_job_status" </el-form>
:key="dict.value" <template #footer>
:value="dict.value" <div class="dialog-footer">
>{{ dict.label }}</el-radio> <el-button type="primary" @click="submitForm">确 定</el-button>
</el-radio-group> <el-button @click="cancel">取 消</el-button>
</el-form-item> </div>
</el-col> </template>
<el-col :span="12"> </el-dialog>
<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>
</template>
</el-dialog>
<el-dialog title="Cron表达式生成器" v-model="openCron" append-to-body destroy-on-close> <el-dialog title="Cron表达式生成器" v-model="openCron" append-to-body destroy-on-close>
<crontab ref="crontabRef" @hide="openCron=false" @fill="crontabFill" :expression="expression"></crontab> <crontab ref="crontabRef" @hide="openCron = false" @fill="crontabFill" :expression="expression"></crontab>
</el-dialog>
<!-- 任务日志详细 -->
<el-dialog title="任务详细" v-model="openView" width="700px" append-to-body>
<el-form :model="form" label-width="120px">
<el-row>
<el-col :span="12">
<el-form-item label="任务编号:">{{ form.jobId }}</el-form-item>
<el-form-item label="任务名称:">{{ form.jobName }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="任务分组:">{{
jobGroupFormat(form)
}}</el-form-item>
<el-form-item label="创建时间:">{{
form.createTime
}}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="cron表达式:">{{
form.cronExpression
}}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="下次执行时间:">{{
parseTime(form.nextValidTime)
}}</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="调用目标方法:">{{
form.invokeTarget
}}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="任务状态:">
<div v-if="form.status == 0">正常</div>
<div v-else-if="form.status == 1">暂停</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否并发:">
<div v-if="form.concurrent == 0">允许</div>
<div v-else-if="form.concurrent == 1">禁止</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="执行策略:">
<div v-if="form.misfirePolicy == 0">默认策略</div>
<div v-else-if="form.misfirePolicy == 1">立即执行</div>
<div v-else-if="form.misfirePolicy == 2">执行一次</div>
<div v-else-if="form.misfirePolicy == 3">放弃执行</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="openView = false">关 闭</el-button>
</div>
</template>
</el-dialog> </el-dialog>
</div>
<!-- 任务日志详细 --> </template>
<el-dialog title="任务详细" v-model="openView" width="700px" append-to-body>
<el-form :model="form" label-width="120px"> <script setup name="Job">
<el-row> import {
<el-col :span="12"> listJob,
<el-form-item label="任务编号:">{{ form.jobId }}</el-form-item> getJob,
<el-form-item label="任务名称:">{{ form.jobName }}</el-form-item> delJob,
</el-col> addJob,
<el-col :span="12"> updateJob,
<el-form-item label="任务分组:">{{ jobGroupFormat(form) }}</el-form-item> runJob,
<el-form-item label="创建时间:">{{ form.createTime }}</el-form-item> changeJobStatus,
</el-col> } from "@/api/monitor/job";
<el-col :span="12"> import Crontab from "@/components/Crontab";
<el-form-item label="cron表达式:">{{ form.cronExpression }}</el-form-item> const router = useRouter();
</el-col> const { proxy } = getCurrentInstance();
<el-col :span="12"> const { sys_job_group, sys_job_status } = proxy.useDict(
<el-form-item label="下次执行时间:">{{ parseTime(form.nextValidTime) }}</el-form-item> "sys_job_group",
</el-col> "sys_job_status"
<el-col :span="24"> );
<el-form-item label="调用目标方法:">{{ form.invokeTarget }}</el-form-item>
</el-col> const nowText = ref("日志管理");
<el-col :span="12"> const activeName = ref("摄像头日志");
<el-form-item label="任务状态:"> const jobList = ref([]);
<div v-if="form.status == 0">正常</div> const open = ref(false);
<div v-else-if="form.status == 1">暂停</div> const loading = ref(true);
</el-form-item> const showSearch = ref(true);
</el-col> const ids = ref([]);
<el-col :span="12"> const dateRange = ref([]);
<el-form-item label="是否并发:"> const single = ref(true);
<div v-if="form.concurrent == 0">允许</div> const multiple = ref(true);
<div v-else-if="form.concurrent == 1">禁止</div> const total = ref(0);
</el-form-item> const title = ref("");
</el-col> const openView = ref(false);
<el-col :span="12"> const openCron = ref(false);
<el-form-item label="执行策略:"> const expression = ref("");
<div v-if="form.misfirePolicy == 0">默认策略</div>
<div v-else-if="form.misfirePolicy == 1">立即执行</div> const data = reactive({
<div v-else-if="form.misfirePolicy == 2">执行一次</div>
<div v-else-if="form.misfirePolicy == 3">放弃执行</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="openView = false">关 闭</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="Job">
import { listJob, getJob, delJob, addJob, updateJob, runJob, changeJobStatus } from "@/api/monitor/job";
import Crontab from '@/components/Crontab'
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 activeName = ref("摄像头日志");
const jobList = 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 openView = ref(false);
const openCron = ref(false);
const expression = ref("");
const data = reactive({
form: {}, form: {},
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
jobName: undefined, jobName: undefined,
jobGroup: undefined, jobGroup: undefined,
status: undefined status: undefined,
}, },
rules: { rules: {
jobName: [{ required: true, message: "任务名称不能为空", trigger: "blur" }], jobName: [{ required: true, message: "任务名称不能为空", trigger: "blur" }],
invokeTarget: [{ required: true, message: "调用目标字符串不能为空", trigger: "blur" }], invokeTarget: [
cronExpression: [{ required: true, message: "cron执行表达式不能为空", trigger: "change" }] { required: true, message: "调用目标字符串不能为空", trigger: "blur" },
} ],
}); cronExpression: [
{ required: true, message: "cron执行表达式不能为空", trigger: "change" },
const { queryParams, form, rules } = toRefs(data); ],
},
function handleClick(){ });
} const { queryParams, form, rules } = toRefs(data);
function handleClick() { }
/** 查询定时任务列表 */ /** 查询定时任务列表 */
function getList() { function getList() {
loading.value = true; loading.value = true;
listJob(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => { listJob(proxy.addDateRange(queryParams.value, dateRange.value)).then(
jobList.value = response.rows; (response) => {
total.value = response.total; jobList.value = response.rows;
loading.value = false; total.value = response.total;
}); loading.value = false;
} }
);
/** 任务组名字典翻译 */ }
function jobGroupFormat(row, column) {
/** 任务组名字典翻译 */
function jobGroupFormat(row, column) {
return proxy.selectDictLabel(sys_job_group.value, row.jobGroup); return proxy.selectDictLabel(sys_job_group.value, row.jobGroup);
} }
/** 取消按钮 */ /** 取消按钮 */
function cancel() { function cancel() {
open.value = false; open.value = false;
reset(); reset();
} }
/** 表单重置 */ /** 表单重置 */
function reset() { function reset() {
form.value = { form.value = {
jobId: undefined, jobId: undefined,
jobName: undefined, jobName: undefined,
jobGroup: undefined, jobGroup: undefined,
invokeTarget: undefined, invokeTarget: undefined,
cronExpression: undefined, cronExpression: undefined,
misfirePolicy: 1, misfirePolicy: 1,
concurrent: 1, concurrent: 1,
status: "0" status: "0",
}; };
proxy.resetForm("jobRef"); proxy.resetForm("jobRef");
} }
/** 搜索按钮操作 */ /** 搜索按钮操作 */
function handleQuery() { function handleQuery() {
queryParams.value.pageNum = 1; queryParams.value.pageNum = 1;
getList(); getList();
} }
/** 重置按钮操作 */ /** 重置按钮操作 */
function resetQuery() { function resetQuery() {
proxy.resetForm("queryRef"); proxy.resetForm("queryRef");
handleQuery(); handleQuery();
} }
// 多选框选中数据 // 多选框选中数据
function handleSelectionChange(selection) { function handleSelectionChange(selection) {
ids.value = selection.map(item => item.jobId); ids.value = selection.map((item) => item.jobId);
single.value = selection.length != 1; single.value = selection.length != 1;
multiple.value = !selection.length; multiple.value = !selection.length;
} }
// 更多操作触发 // 更多操作触发
function handleCommand(command, row) { function handleCommand(command, row) {
switch (command) { switch (command) {
case "handleRun": case "handleRun":
handleRun(row); handleRun(row);
break; break;
case "handleView": case "handleView":
handleView(row); handleView(row);
break; break;
case "handleJobLog": case "handleJobLog":
handleJobLog(row); handleJobLog(row);
break; break;
default: default:
break; break;
} }
} }
// 任务状态修改 // 任务状态修改
function handleStatusChange(row) { function handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"; let text = row.status === "0" ? "启用" : "停用";
proxy.$modal.confirm('确认要"' + text + '""' + row.jobName + '"任务吗?').then(function () { proxy.$modal
return changeJobStatus(row.jobId, row.status); .confirm('确认要"' + text + '""' + row.jobName + '"任务吗?')
}).then(() => { .then(function () {
proxy.$modal.msgSuccess(text + "成功"); return changeJobStatus(row.jobId, row.status);
}).catch(function () { })
row.status = row.status === "0" ? "1" : "0"; .then(() => {
}); proxy.$modal.msgSuccess(text + "成功");
} })
.catch(function () {
/* 立即执行一次 */ row.status = row.status === "0" ? "1" : "0";
function handleRun(row) { });
proxy.$modal.confirm('确认要立即执行一次"' + row.jobName + '"任务吗?').then(function () { }
return runJob(row.jobId, row.jobGroup);
}).then(() => { /* 立即执行一次 */
proxy.$modal.msgSuccess("执行成功");}) function handleRun(row) {
.catch(() => {}); proxy.$modal
} .confirm('确认要立即执行一次"' + row.jobName + '"任务吗?')
.then(function () {
/** 任务详细信息 */ return runJob(row.jobId, row.jobGroup);
function handleView(row) { })
getJob(row.jobId).then(response => { .then(() => {
form.value = response.data; proxy.$modal.msgSuccess("执行成功");
openView.value = true; })
.catch(() => { });
}
/** 任务详细信息 */
function handleView(row) {
getJob(row.jobId).then((response) => {
form.value = response.data;
openView.value = true;
}); });
} }
/** cron表达式按钮操作 */ /** cron表达式按钮操作 */
function handleShowCron() { function handleShowCron() {
expression.value = form.value.cronExpression; expression.value = form.value.cronExpression;
openCron.value = true; openCron.value = true;
} }
/** 确定后回传值 */ /** 确定后回传值 */
function crontabFill(value) { function crontabFill(value) {
form.value.cronExpression = value; form.value.cronExpression = value;
} }
/** 任务日志列表查询 */ /** 任务日志列表查询 */
function handleJobLog(row) { function handleJobLog(row) {
const jobId = row.jobId || 0; const jobId = row.jobId || 0;
router.push('/monitor/job-log/index/' + jobId) router.push("/monitor/job-log/index/" + jobId);
} }
/** 新增按钮操作 */ /** 新增按钮操作 */
function handleAdd() { function handleAdd() {
reset(); reset();
open.value = true; open.value = true;
title.value = "添加任务"; title.value = "添加任务";
} }
/** 修改按钮操作 */ /** 修改按钮操作 */
function handleUpdate(row) { function handleUpdate(row) {
reset(); reset();
const jobId = row.jobId || ids.value; const jobId = row.jobId || ids.value;
getJob(jobId).then(response => { getJob(jobId).then((response) => {
form.value = response.data; form.value = response.data;
open.value = true; open.value = true;
title.value = "修改任务"; title.value = "修改任务";
}); });
} }
/** 提交按钮 */ /** 提交按钮 */
function submitForm() { function submitForm() {
proxy.$refs["jobRef"].validate(valid => { proxy.$refs["jobRef"].validate((valid) => {
if (valid) { if (valid) {
if (form.value.jobId != undefined) { if (form.value.jobId != undefined) {
updateJob(form.value).then(response => { updateJob(form.value).then((response) => {
proxy.$modal.msgSuccess("修改成功"); proxy.$modal.msgSuccess("修改成功");
open.value = false; open.value = false;
getList(); getList();
}); });
} else { } else {
addJob(form.value).then(response => { addJob(form.value).then((response) => {
proxy.$modal.msgSuccess("新增成功"); proxy.$modal.msgSuccess("新增成功");
open.value = false; open.value = false;
getList(); getList();
}); });
} }
} }
}); });
} }
/** 删除按钮操作 */ /** 删除按钮操作 */
function handleDelete(row) { function handleDelete(row) {
const jobIds = row.jobId || ids.value; const jobIds = row.jobId || ids.value;
proxy.$modal.confirm('是否确认删除定时任务编号为"' + jobIds + '"的数据项?').then(function () { proxy.$modal
return delJob(jobIds); .confirm('是否确认删除定时任务编号为"' + jobIds + '"的数据项?')
}).then(() => { .then(function () {
getList(); return delJob(jobIds);
proxy.$modal.msgSuccess("删除成功"); })
}).catch(() => {}); .then(() => {
} getList();
proxy.$modal.msgSuccess("删除成功");
/** 导出按钮操作 */ })
function handleExport() { .catch(() => { });
proxy.download("monitor/job/export", { }
...queryParams.value,
}, `job_${new Date().getTime()}.xlsx`);
}
getList();
</script>
<style scoped lang="scss">
.left-list{
min-height: 700px;
}
</style>
/** 导出按钮操作 */
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> <template>
<div class="app-container home"> <div class="app-container home">
<TabTitle :text="nowText" /> <TabTitle :text="nowText" />
<el-row :gutter="10"> <el-row :gutter="10">
<el-col :xs="0" :sm="2" :md="3" :lg="4"> <el-col :xs="0" :sm="2" :md="3" :lg="4">
<el-card class="left-list"> <el-card class="left-list">
<div class="head-container"> <div class="head-container">
<el-input <el-input
v-model="deptName" v-model="deptName"
placeholder="请输入部门名称" placeholder="请输入部门名称"
clearable clearable
prefix-icon="Search" prefix-icon="Search"
style="margin-bottom: 20px" style="margin-bottom: 20px"
/> />
</div> </div>
<div class="head-container"> <div class="head-container">
<el-tree <el-tree
:data="deptOptions" :data="deptOptions"
:props="{ label: 'label', children: 'children' }" :props="{ label: 'label', children: 'children' }"
:expand-on-click-node="false" :expand-on-click-node="false"
:filter-node-method="filterNode" :filter-node-method="filterNode"
ref="deptTreeRef" ref="deptTreeRef"
node-key="id" node-key="id"
highlight-current highlight-current
default-expand-all default-expand-all
@node-click="handleNodeClick" @node-click="handleNodeClick"
/> />
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
<el-col :xs="24" :sm="16" :md="16" :lg="16"> <el-col :xs="24" :sm="16" :md="16" :lg="14">
<el-scrollbar height="700px"> <el-scrollbar height="700px">
<el-card class="right-list"> <el-card class="right-list">
<template v-slot:header> <template v-slot:header>
<div class="cleartitle" style="justify-content: flex-start"> <div class="cleartitle" style="justify-content: flex-start">
<img src="@/assets/images/logo_video.png" width="25px" alt=""> <span>视频预览</span> <img src="@/assets/images/logo_video.png" width="25px" alt />
<span>视频预览</span>
</div> </div>
</template> </template>
<el-row :gutter="10" class="mb8"> <!-- <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button type="primary" plain @click="handleUpdate">一分屏</el-button>
type="primary" </el-col>
plain <el-col :span="1.5">
@click="handleUpdate" <el-button type="primary" plain @click="handleUpdate">四分屏</el-button>
>一分屏</el-button> </el-col>
</el-col> <el-col :span="1.5">
<el-col :span="1.5"> <el-button type="primary" plain @click="handleDelete">六分屏</el-button>
<el-button </el-col>
type="primary" </el-row> -->
plain
@click="handleUpdate"
>四分屏</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="primary"
plain
@click="handleDelete"
>六分屏</el-button>
</el-col>
</el-row>
<div class="alg-list"> <div class="alg-list">
<el-card v-for="item in algorithmList" :key="item.name" class="alg-item" shadow="hover"> <el-card
<template v-slot:header> class="alg-item"
<div class="cleartitle"> shadow="hover"
<span>{{item.name}}</span> >
<el-tag <template v-slot:default>
:type="'success'" <img src="@/assets/images/picStream.png" style="width: 100%" />
effect="dark"
>
{{ 'success'}}
</el-tag>
</div>
</template>
<template v-slot:default >
<img
src="@/assets/images/picStream.png"
style="width: 100%"
/>
<p style="color: #999999;font-size: 12px;">
通过摄像头识别吸烟行为的智能算法
</p>
<div style="display: flex;justify-content: flex-end;position: absolute;right: 15px;bottom: 10px;" >
<el-button link type="primary" icon="Edit" @click="handleUpdate(item)" >修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(item)">删除</el-button>
<el-dropdown trigger="click" @command="handleSetSize">
<el-button link type="primary">
<el-icon class="el-icon--right">
<arrow-down />
</el-icon>更多</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item :command="'卸载'">
{{ '卸载' }}
</el-dropdown-item>
<el-dropdown-item :command="'导入'">
{{ '导入' }}
</el-dropdown-item>
<el-dropdown-item :command="'下载'">
{{ '下载' }}
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</template> </template>
</el-card> </el-card>
</div> </div>
</el-card> </el-card>
</el-scrollbar> </el-scrollbar>
</el-col> </el-col>
<el-col :xs="0" :sm="2" :md="3" :lg="4"> <el-col :xs="0" :sm="2" :md="3" :lg="6">
<el-card class="left-list"> <el-scrollbar height="700px">
<template v-slot:header> <el-card class="danger-list">
<div class="cleartitle" style="justify-content: flex-start"> <template v-slot:header>
<img src="@/assets/images/logo_video.png" width="25px" alt=""> <span>实时预警</span> <div class="cleartitle" style="justify-content: flex-start">
</div> <img src="@/assets/images/logo_video.png" width="25px" alt />
</template> <span>实时预警</span>
</el-card> </div>
</el-col> </template>
</el-row> <div class="alg-list">
</div> <el-card
v-for="item in algorithmList"
:key="item.name"
class="alg-item"
shadow="hover"
>
<template v-slot:default>
<img src="@/assets/images/picStream.png" style="width: 100%" />
<el-form :model="form" label-width="100px">
<el-form-item label="预警设备:">{{ form.title }} </el-form-item>
<el-form-item label="登录信息:">{{ form.title }}</el-form-item>
<el-form-item label="预警区域:">{{ form.title }}</el-form-item>
<el-form-item label="预警类型:">{{ form.title }}</el-form-item>
<el-form-item label="预警时间:">{{ form.title }}</el-form-item>
<el-form-item label="预警等级:"><el-tag :type="'danger'" effect="dark">{{ '一级预警'}} </el-tag></el-form-item>
</el-form>
</template>
</el-card>
</div>
</el-card>
</el-scrollbar>
</el-col>
</el-row>
</div>
</template> </template>
<script setup name="Index"> <script setup name="Index">
import { ArrowDown } from '@element-plus/icons-vue' import { ArrowDown } from "@element-plus/icons-vue";
import { Search } from '@element-plus/icons-vue' import { Search } from "@element-plus/icons-vue";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const algFormRef = ref(null) const algFormRef = ref(null);
const nowText=ref('视频预览') const nowText = ref("视频预览");
const deptName = ref(""); const deptName = ref("");
const algorithmList=reactive([ const deptOptions = ref(undefined);
{ const algorithmList = reactive([
name:"我的算法", {
value:1 name: "我的算法",
}, value: 1,
{ },
name:"最新算法", {
value:2 name: "最新算法",
}, value: 2,
{ },
name:"基础算法", {
value:3 name: "基础算法",
}, value: 3,
{ },
name:"智慧煤矿", {
value:4 name: "智慧煤矿",
}, value: 4,
{ },
name:"智慧能源", {
value:5 name: "智慧能源",
}, value: 5,
{ },
name:"智慧校园", {
value:6 name: "智慧校园",
}, value: 6,
{ },
name:"智慧港口", {
value:7 name: "智慧港口",
}, value: 7,
{ },
name:"智慧煤矿", {
value:8 name: "智慧煤矿",
}, value: 8,
{ },
name:"智慧能源", {
value:9 name: "智慧能源",
}, value: 9,
{ },
name:"智慧校园", {
value:10 name: "智慧校园",
}, value: 10,
]) },
const data = reactive({ ]);
form: {}, const data = reactive({
queryParams: { form: {
postCode: undefined, title:'测试测试测试'
searchValue: '', },
status: undefined queryParams: {
}, postCode: undefined,
rules: { searchValue: "",
postName: [{ required: true, message: "岗位名称不能为空", trigger: "blur" }], status: undefined,
postCode: [{ required: true, message: "岗位编码不能为空", trigger: "blur" }], },
postSort: [{ required: true, message: "岗位顺序不能为空", trigger: "blur" }], rules: {
} postName: [
}); { required: true, message: "岗位名称不能为空", trigger: "blur" },
const { queryParams, form, rules } = toRefs(data); ],
// function closeNow(){ postCode: [
// const routerArr=useTagsViewStore().visitedViews { required: true, message: "岗位编码不能为空", trigger: "blur" },
// const nowPath=location.pathname ],
// return routerArr.filter(item=>{return item.path==nowPath })[0] postSort: [
// } { required: true, message: "岗位顺序不能为空", trigger: "blur" },
// setTimeout(() => { ],
// nowText=closeNow() },
// }, 500); });
// function goTarget(url) { const { queryParams, form, rules } = toRefs(data);
// window.open(url, '__blank') /** 通过条件过滤节点 */
// } const filterNode = (value, data) => {
function handAdd(row){ if (!value) return true;
algFormRef.value.handleAdd() return data.label.indexOf(value) !== -1;
} };
function handleSetSize(row) {
console.log('%c [ row ]-170', 'font-size:13px; background:pink; color:#bf2c9f;', row) // function closeNow(){
// reset(); // const routerArr=useTagsViewStore().visitedViews
// const postId = row.postId || ids.value; // const nowPath=location.pathname
// getPost(postId).then(response => { // return routerArr.filter(item=>{return item.path==nowPath })[0]
// form.value = response.data; // }
// open.value = true; // setTimeout(() => {
// title.value = "修改岗位"; // nowText=closeNow()awdasa
// }); // }, 500);
} // function goTarget(url) {
function handleUpdate(row) { // window.open(url, '__blank')
// reset(); // }
// const postId = row.postId || ids.value;
// getPost(postId).then(response => { function handleNodeClick(row) {
// form.value = response.data;
// open.value = true;
// title.value = "修改岗位";
// });
}
/** 删除按钮操作 */ }
function handleDelete(row) {
// const postIds = row.postId || ids.value; function handAdd(row) {
// proxy.$modal.confirm('是否确认删除岗位编号为"' + postIds + '"的数据项?').then(function() { algFormRef.value.handleAdd();
// return delPost(postIds); }
// }).then(() => {
// getList(); function handleSetSize(row) {
// proxy.$modal.msgSuccess("删除成功"); console.log(
// }).catch(() => {}); "%c [ row ]-170",
} "font-size:13px; background:pink; color:#bf2c9f;",
row
);
// reset();
// const postId = row.postId || ids.value;
// getPost(postId).then(response => {
// form.value = response.data;
// open.value = true;
// title.value = "修改岗位";
// });
}
function handleUpdate(row) {
// reset();
// const postId = row.postId || ids.value;
// getPost(postId).then(response => {
// form.value = response.data;
// open.value = true;
// title.value = "修改岗位";
// });
}
</script> /** 删除按钮操作 */
function handleDelete(row) {
// const postIds = row.postId || ids.value;
// proxy.$modal.confirm('是否确认删除岗位编号为"' + postIds + '"的数据项?').then(function() {
// return delPost(postIds);
// }).then(() => {
// getList();
// proxy.$modal.msgSuccess("删除成功");
// }).catch(() => {});
}
</script>
<style scoped lang="scss"> <style scoped lang="scss">
.left-list{ .left-list {
min-height: 700px; min-height: 700px;
} }
.right-list{ .right-list {
min-height: 700px; min-height: 700px;
.alg-list{ .alg-list {
display: grid; display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); // grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 16px; gap: 16px;
.alg-item{ .el-card {
width: 100%; border: 1px soild #ff6700;
min-height: 350px; }
cursor: pointer; .alg-item {
position: relative; width: 100%;
} // min-height: 350px;
cursor: pointer;
position: relative;
}
}
}
.danger-list{
min-height: 700px;
.alg-list {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
gap: 16px;
.el-card {
border: 1px soild #ff6700;
}
.alg-item {
width: 100%;
// min-height: 350px;
cursor: pointer;
position: relative;
}
.el-form-item--default,.el-form-item {
font-size: 12px;
margin-bottom: 0px;
} }
}
.cleartitle{
font-size: 16px;
font-weight: 600;
display: flex;
justify-content: space-between;
align-items: center
} }
</style> }
.cleartitle {
font-size: 16px;
font-weight: 600;
display: flex;
justify-content: space-between;
align-items: center;
}
</style>
\ No newline at end of file
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