Commit 58a93d86 by yzh

feat:修改了按钮点击时会有黑框的问题,修改了所有表格的布局

parent a1c51994
...@@ -101,4 +101,8 @@ onBeforeUnmount(() => { ...@@ -101,4 +101,8 @@ onBeforeUnmount(() => {
color: #666666; color: #666666;
font-size: 12px; font-size: 12px;
} }
.el-button:focus {
outline: none;
}
</style> </style>
...@@ -3,19 +3,19 @@ ...@@ -3,19 +3,19 @@
<el-form inline> <el-form inline>
<el-form-item label="目标选择:"> <el-form-item label="目标选择:">
<el-select v-model="taskValue" placeholder=" " style="width: 140px"> <el-select v-model="taskValue" placeholder=" " style="width: 140px">
<el-option v-for="item in taskOptions" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in sortOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="分类选择:"> <el-form-item label="分类选择:">
<el-select v-model="errorValue" placeholder=" " style="width: 140px"> <el-select v-model="errorValue" placeholder=" " style="width: 140px">
<el-option v-for="item in taskOptions" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in sortOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="关键词搜索:"> <el-form-item label="关键词搜索:">
<el-input v-model="searchInput" style="width: 240px" placeholder="Search" :prefix-icon="Search" /> <el-input v-model="searchInput" style="width: 220px" placeholder="Search" :prefix-icon="Search" />
</el-form-item> </el-form-item>
<el-form-item label="时间:"> <el-form-item label="时间:">
<el-date-picker v-model="timeValue" type="datetimerange" range-separator="-" start-placeholder="开始时间" <el-date-picker style="width: 240px" v-model="timeValue" type="datetimerange" range-separator="-" start-placeholder="开始时间"
end-placeholder="结束时间" /> end-placeholder="结束时间" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
...@@ -28,15 +28,15 @@ ...@@ -28,15 +28,15 @@
</el-form> </el-form>
</div> </div>
<el-table :data="tableData" style="width: 100%" border> <el-table :data="tableData" style="width: 100%" border>
<el-table-column type="selection" width="55" /> <el-table-column type="selection" width="40" />
<el-table-column property="name" label="序号" width="60" /> <el-table-column property="name" label="序号" width="55" />
<el-table-column property="name" label="目标名称" width="160" show-overflow-tooltip /> <el-table-column property="name" label="目标名称" show-overflow-tooltip />
<el-table-column property="name" label="标题" width="160" show-overflow-tooltip /> <el-table-column property="name" label="标题" show-overflow-tooltip />
<el-table-column property="name" label="关键字" width="160" show-overflow-tooltip /> <el-table-column property="name" label="关键字" show-overflow-tooltip />
<el-table-column property="name" label="数据分类" width="160" show-overflow-tooltip /> <el-table-column property="name" label="数据分类" show-overflow-tooltip />
<el-table-column property="name" label="数据时间" width="220" show-overflow-tooltip /> <el-table-column property="name" label="数据时间" width="200" show-overflow-tooltip />
<el-table-column property="name" label="记录时间" width="220" show-overflow-tooltip /> <el-table-column property="name" label="记录时间" width="200" show-overflow-tooltip />
<el-table-column label="操作"> <el-table-column label="操作" width="240">
<template #default="scope"> <template #default="scope">
<el-button type="primary" plain @click="handleDetails(scope.row)"> <el-button type="primary" plain @click="handleDetails(scope.row)">
编辑 编辑
...@@ -71,18 +71,18 @@ const errorValue = ref('') ...@@ -71,18 +71,18 @@ const errorValue = ref('')
const taskValue = ref('') const taskValue = ref('')
const timeValue = ref('') const timeValue = ref('')
const searchInput = ref('') const searchInput = ref('')
const taskOptions = [ const sortOptions = [
{ {
value: 'task1', value: 'task1',
label: 'sk网', label: '基础信息',
}, },
{ {
value: 'task2', value: 'task2',
label: 'nasa网', label: '信号信息',
}, },
{ {
value: 'task3', value: 'task3',
label: '', label: '其他信息',
}, },
] ]
const tableData = ref([ const tableData = ref([
......
...@@ -3,16 +3,16 @@ ...@@ -3,16 +3,16 @@
<el-form inline> <el-form inline>
<el-form-item label="目标选择:"> <el-form-item label="目标选择:">
<el-select v-model="taskValue" placeholder=" " style="width: 200px"> <el-select v-model="taskValue" placeholder=" " style="width: 200px">
<el-option v-for="item in taskOptions" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in targetOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="预处理结果选择:"> <el-form-item label="预处理结果选择:">
<el-select v-model="errorValue" placeholder=" " style="width: 200px"> <el-select v-model="errorValue" placeholder=" " style="width: 200px">
<el-option v-for="item in taskOptions" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in resOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="时间:"> <el-form-item label="时间:">
<el-date-picker v-model="timeValue" type="datetimerange" range-separator="-" start-placeholder="开始时间" <el-date-picker style="width: 240px" v-model="timeValue" type="datetimerange" range-separator="-" start-placeholder="开始时间"
end-placeholder="结束时间" /> end-placeholder="结束时间" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
...@@ -24,23 +24,23 @@ ...@@ -24,23 +24,23 @@
</el-form> </el-form>
</div> </div>
<el-table :data="tableData" style="width: 100%" border> <el-table :data="tableData" style="width: 100%" border>
<el-table-column type="selection" width="55" /> <el-table-column type="selection" width="40" />
<el-table-column property="name" label="序号" width="60" /> <el-table-column property="name" label="序号" width="55" />
<el-table-column property="name" label="目标名称" width="160" show-overflow-tooltip /> <el-table-column property="name" label="目标名称" show-overflow-tooltip />
<el-table-column property="name" label="标题" width="160" show-overflow-tooltip /> <el-table-column property="name" label="标题" show-overflow-tooltip />
<el-table-column property="name" label="关键字" width="160" show-overflow-tooltip /> <el-table-column property="name" label="关键字" show-overflow-tooltip />
<el-table-column property="name" label="数据分类" width="160" show-overflow-tooltip /> <el-table-column property="name" label="数据分类" show-overflow-tooltip />
<el-table-column property="name" label="数据时间" width="220" show-overflow-tooltip /> <el-table-column property="name" label="数据时间" width="200" show-overflow-tooltip />
<el-table-column property="name" label="记录时间" width="220" show-overflow-tooltip /> <el-table-column property="name" label="记录时间" width="200" show-overflow-tooltip />
<el-table-column label="操作"> <el-table-column label="操作" width="240">
<template #default="scope"> <template #default="scope">
<el-button type="primary" @click="handleDetails(scope.row)"> <el-button type="primary" plain @click="handleDetails(scope.row)">
编辑 编辑
</el-button> </el-button>
<el-button type="success" @click="handleDetails(scope.row)"> <el-button type="success" plain @click="handleDetails(scope.row)">
详情 详情
</el-button> </el-button>
<el-button type="danger" @click="handleConfirm(scope.row)"> <el-button type="danger" plain @click="handleConfirm(scope.row)">
删除 删除
</el-button> </el-button>
</template> </template>
...@@ -67,7 +67,7 @@ const errorValue = ref('') ...@@ -67,7 +67,7 @@ const errorValue = ref('')
const taskValue = ref('') const taskValue = ref('')
const timeValue = ref('') const timeValue = ref('')
const searchInput = ref('') const searchInput = ref('')
const taskOptions = [ const targetOptions = [
{ {
value: 'task1', value: 'task1',
label: 'sk网', label: 'sk网',
...@@ -81,6 +81,20 @@ const taskOptions = [ ...@@ -81,6 +81,20 @@ const taskOptions = [
label: '网', label: '网',
}, },
] ]
const resOptions = [
{
value: 'task1',
label: '网络中断',
},
{
value: 'task2',
label: '地址不存在',
},
{
value: 'task3',
label: '反爬虫',
},
]
const tableData = ref([ const tableData = ref([
{ {
name: '1', name: '1',
......
...@@ -88,7 +88,7 @@ defineProps({ ...@@ -88,7 +88,7 @@ defineProps({
width: 400px; width: 400px;
height: 14vh; height: 14vh;
border-radius: 5px; border-radius: 5px;
// min-width: 200px;
.titleStyle { .titleStyle {
font-size: 22px; font-size: 22px;
} }
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
<span>综合监控</span> <span>综合监控</span>
</div> </div>
<dataCard> <dataCard>
</dataCard> </dataCard>
</div> </div>
</template> </template>
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<el-form inline> <el-form inline>
<el-form-item label="角色选择:"> <el-form-item label="角色选择:">
<el-select v-model="taskValue" placeholder=" " style="width: 200px"> <el-select v-model="taskValue" placeholder=" " style="width: 200px">
<el-option v-for="item in taskOptions" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in rolesOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
...@@ -15,21 +15,21 @@ ...@@ -15,21 +15,21 @@
</el-form> </el-form>
</div> </div>
<el-table :data="tableData" style="width: 100%" border> <el-table :data="tableData" style="width: 100%" border>
<el-table-column type="selection" width="55" /> <el-table-column type="selection" width="40" />
<el-table-column property="name" label="序号" width="100" /> <el-table-column property="name" label="序号" width="55" />
<el-table-column property="name" label="用户名" width="280" show-overflow-tooltip /> <el-table-column property="name" label="用户名" show-overflow-tooltip />
<el-table-column property="name" label="用户名称" width="280" show-overflow-tooltip /> <el-table-column property="name" label="用户名称" show-overflow-tooltip />
<el-table-column property="name" label="角色" width="280" show-overflow-tooltip /> <el-table-column property="name" label="角色" show-overflow-tooltip />
<el-table-column property="name" label="创建时间" width="280" show-overflow-tooltip /> <el-table-column property="name" label="创建时间" show-overflow-tooltip />
<el-table-column label="操作"> <el-table-column label="操作" width="240">
<template #default="scope"> <template #default="scope">
<el-button type="primary" @click="handleDetails(scope.row)"> <el-button type="primary" plain @click="handleDetails(scope.row)">
编辑 编辑
</el-button> </el-button>
<el-button type="success" @click="handleDetails(scope.row)"> <el-button type="success" plain @click="handleDetails(scope.row)">
详情 详情
</el-button> </el-button>
<el-button type="danger" @click="handleConfirm(scope.row)"> <el-button type="danger" plain @click="handleConfirm(scope.row)">
删除 删除
</el-button> </el-button>
</template> </template>
...@@ -56,18 +56,14 @@ const errorValue = ref('') ...@@ -56,18 +56,14 @@ const errorValue = ref('')
const taskValue = ref('') const taskValue = ref('')
const timeValue = ref('') const timeValue = ref('')
const searchInput = ref('') const searchInput = ref('')
const taskOptions = [ const rolesOptions = [
{ {
value: 'task1', value: 'task1',
label: 'sk网', label: '管理员',
}, },
{ {
value: 'task2', value: 'task2',
label: 'nasa网', label: '用户',
},
{
value: 'task3',
label: '网',
}, },
] ]
const tableData = ref([ const tableData = ref([
......
...@@ -104,4 +104,7 @@ const options = [ ...@@ -104,4 +104,7 @@ const options = [
font-size: 16px; font-size: 16px;
} }
} }
.el-button:focus {
outline: none;
}
</style> </style>
...@@ -2,17 +2,17 @@ ...@@ -2,17 +2,17 @@
<div class="text-left p-10"> <div class="text-left p-10">
<el-form inline> <el-form inline>
<el-form-item label="任务选择:"> <el-form-item label="任务选择:">
<el-select v-model="taskValue" placeholder=" " style="width: 240px"> <el-select v-model="taskValue" placeholder=" " style="width: 220px">
<el-option v-for="item in taskOptions" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in taskOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="异常选择:"> <el-form-item label="异常选择:">
<el-select v-model="errorValue" placeholder=" " style="width: 240px"> <el-select v-model="errorValue" placeholder=" " style="width: 220px">
<el-option v-for="item in taskOptions" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in taskOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="时间:"> <el-form-item label="时间:">
<el-date-picker v-model="timeValue" type="datetimerange" range-separator="-" start-placeholder="开始时间" <el-date-picker style="width: 240px" v-model="timeValue" type="datetimerange" range-separator="-" start-placeholder="开始时间"
end-placeholder="结束时间" /> end-placeholder="结束时间" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
...@@ -24,22 +24,22 @@ ...@@ -24,22 +24,22 @@
</el-form> </el-form>
</div> </div>
<el-table :data="tableData" style="width: 100%" border> <el-table :data="tableData" style="width: 100%" border>
<el-table-column type="selection" width="55" /> <el-table-column type="selection" width="40" />
<el-table-column property="name" label="序号" width="60" /> <el-table-column property="name" label="序号" width="55" />
<el-table-column property="address" label="任务名称" width="150" show-overflow-tooltip /> <el-table-column property="address" label="任务名称" show-overflow-tooltip />
<el-table-column property="address" label="执行结果" width="150" show-overflow-tooltip /> <el-table-column property="address" label="执行结果" show-overflow-tooltip />
<el-table-column property="address" label="收集数" width="130" show-overflow-tooltip /> <el-table-column property="address" label="收集数" show-overflow-tooltip />
<el-table-column property="address" label="丢弃数" width="130" show-overflow-tooltip /> <el-table-column property="address" label="丢弃数" show-overflow-tooltip />
<el-table-column property="address" label="异常信息" width="170" show-overflow-tooltip /> <el-table-column property="address" label="异常信息" show-overflow-tooltip />
<el-table-column property="address" label="持续时间" width="170" show-overflow-tooltip /> <el-table-column property="address" label="持续时间" show-overflow-tooltip />
<el-table-column property="address" label="开始时间" width="170" show-overflow-tooltip /> <el-table-column property="address" label="开始时间" width="200" show-overflow-tooltip />
<el-table-column property="address" label="结束时间" width="170" show-overflow-tooltip /> <el-table-column property="address" label="结束时间" width="200" show-overflow-tooltip />
<el-table-column label="操作"> <el-table-column label="操作" width="220">
<template #default="scope"> <template #default="scope">
<el-button size="small" type="success" @click="handleDetails(scope.row)"> <el-button size="small" plain type="success" @click="handleDetails(scope.row)">
详情 详情
</el-button> </el-button>
<el-button size="small" type="danger" @click="handleConfirm(scope.row)"> <el-button size="small" plain type="danger" @click="handleConfirm(scope.row)">
异常确认 异常确认
</el-button> </el-button>
</template> </template>
......
<template> <template>
<div class="app-container"> <div class="app-container">
<!-- 添加服务器选择器 --> <!-- 添加服务器选择器 -->
<SelectScrapydServer <SelectScrapydServer v-model:value="scrapydServerId" @change="handleServerChange" @on-init="handleServerInit" />
v-model:value="scrapydServerId"
@change="handleServerChange"
@on-init="handleServerInit"
/>
<el-card class="box-card"> <el-card class="box-card">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span>爬虫项目管理</span> <span>爬虫项目管理</span>
<div class="right-panel"> <div class="right-panel">
<el-button type="primary" @click="handleAddProject"> <el-button type="primary" @click="handleAddProject">
<el-icon><Plus /></el-icon>添加项目 <el-icon>
<Plus />
</el-icon>添加项目
</el-button> </el-button>
<el-button type="primary" @click="refreshProjectList"> <el-button type="primary" @click="refreshProjectList">
<el-icon><Refresh /></el-icon>刷新 <el-icon>
<Refresh />
</el-icon>刷新
</el-button> </el-button>
</div> </div>
</div> </div>
</template> </template>
<el-table v-loading="loading" :data="projectList" stripe border style="width: 100%"> <el-table v-loading="loading" :data="projectList" stripe border style="width: 100%">
<el-table-column label="序号" width="80" align="center"> <el-table-column label="序号" width="80" align="center">
<template #default="scope"> <template #default="scope">
{{ scope.$index + 1 }} {{ scope.$index + 1 }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="name" label="项目名称" align="center" width="800"/> <el-table-column prop="name" label="项目名称" align="center" width="800" />
<el-table-column label="操作" align="center"> <el-table-column label="操作" align="center">
<template #default="scope"> <template #default="scope">
<el-button text type="primary" size="small" @click="viewSpiders(scope.row)"> <el-button text type="primary" size="small" @click="viewSpiders(scope.row)">
<el-icon><Document /></el-icon>Spider <el-icon>
<Document />
</el-icon>Spider
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="查看版本" align="center"> <el-table-column label="查看版本" align="center">
<template #default="scope"> <template #default="scope">
<el-button text type="success" size="small" @click="viewVersions(scope.row)"> <el-button text type="success" size="small" @click="viewVersions(scope.row)">
<el-icon><Files /></el-icon>版本 <el-icon>
<Files />
</el-icon>版本
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="查看任务" align="center"> <el-table-column label="查看任务" align="center">
<template #default="scope"> <template #default="scope">
<el-button text type="info" size="small" @click="viewJobs(scope.row)"> <el-button text type="info" size="small" @click="viewJobs(scope.row)">
<el-icon><List /></el-icon>任务 <el-icon>
<List />
</el-icon>任务
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="查看日志" align="center"> <el-table-column label="查看日志" align="center">
<template #default="scope"> <template #default="scope">
<el-button text type="warning" size="small" @click="viewLogs(scope.row)"> <el-button text type="warning" size="small" @click="viewLogs(scope.row)">
<el-icon><Notebook /></el-icon>日志 <el-icon>
<Notebook />
</el-icon>日志
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="更新版本" align="center"> <el-table-column label="更新版本" align="center">
<template #default="scope"> <template #default="scope">
<el-button text type="primary" size="small" @click="handleUpdateVersion(scope.row)"> <el-button text type="primary" size="small" @click="handleUpdateVersion(scope.row)">
<el-icon><EditPen /></el-icon>编辑 <el-icon>
<EditPen />
</el-icon>编辑
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="删除项目" align="center"> <el-table-column label="删除项目" align="center">
<template #default="scope"> <template #default="scope">
<el-button text type="danger" size="small" @click="handleDeleteProject(scope.row)"> <el-button text type="danger" size="small" @click="handleDeleteProject(scope.row)">
<el-icon><Delete /></el-icon>删除 <el-icon>
<Delete />
</el-icon>删除
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
...@@ -78,15 +90,10 @@ ...@@ -78,15 +90,10 @@
<el-dialog v-model="addDialogVisible" :title="dialogTitle" width="500px"> <el-dialog v-model="addDialogVisible" :title="dialogTitle" width="500px">
<el-form :model="addForm" label-width="100px" :rules="rules" ref="addFormRef"> <el-form :model="addForm" label-width="100px" :rules="rules" ref="addFormRef">
<el-form-item label="项目文件" prop="file"> <el-form-item label="项目文件" prop="file">
<el-upload <el-upload class="upload-demo" drag action="" :auto-upload="false" :limit="1" :on-change="handleFileChange">
class="upload-demo" <el-icon class="el-icon--upload">
drag <Upload />
action="" </el-icon>
:auto-upload="false"
:limit="1"
:on-change="handleFileChange"
>
<el-icon class="el-icon--upload"><Upload /></el-icon>
<div class="el-upload__text">拖拽文件到此处或 <em>点击上传</em></div> <div class="el-upload__text">拖拽文件到此处或 <em>点击上传</em></div>
<template #tip> <template #tip>
<div class="el-upload__tip">请上传爬虫项目文件(.zip 或 .egg)</div> <div class="el-upload__tip">请上传爬虫项目文件(.zip 或 .egg)</div>
...@@ -102,8 +109,9 @@ ...@@ -102,8 +109,9 @@
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="addDialogVisible = false">取消</el-button> <el-button @click="addDialogVisible = false" class="outline-none">取消</el-button>
<el-button type="primary" @click="submitAddProject" :loading="submitLoading">确认</el-button> <el-button type="primary" @click="submitAddProject" :loading="submitLoading"
class="outline-none">确认</el-button>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
...@@ -175,7 +183,7 @@ const refreshProjectList = () => { ...@@ -175,7 +183,7 @@ const refreshProjectList = () => {
const viewSpiders = (row: any) => { const viewSpiders = (row: any) => {
router.push({ router.push({
path: '/spider', path: '/spider',
query: { query: {
project: row.name, project: row.name,
scrapydServerId: scrapydServerId.value scrapydServerId: scrapydServerId.value
} }
...@@ -186,7 +194,7 @@ const viewSpiders = (row: any) => { ...@@ -186,7 +194,7 @@ const viewSpiders = (row: any) => {
const viewVersions = (row: any) => { const viewVersions = (row: any) => {
router.push({ router.push({
path: '/project/version-list', path: '/project/version-list',
query: { query: {
project: row.name, project: row.name,
scrapydServerId: scrapydServerId.value scrapydServerId: scrapydServerId.value
} }
...@@ -197,7 +205,7 @@ const viewVersions = (row: any) => { ...@@ -197,7 +205,7 @@ const viewVersions = (row: any) => {
const viewJobs = (row: any) => { const viewJobs = (row: any) => {
router.push({ router.push({
path: '/job/list', path: '/job/list',
query: { query: {
project: row.name, project: row.name,
scrapydServerId: scrapydServerId.value scrapydServerId: scrapydServerId.value
} }
...@@ -208,7 +216,7 @@ const viewJobs = (row: any) => { ...@@ -208,7 +216,7 @@ const viewJobs = (row: any) => {
const viewLogs = (row: any) => { const viewLogs = (row: any) => {
router.push({ router.push({
path: '/logs/project', path: '/logs/project',
query: { query: {
project: row.name, project: row.name,
scrapydServerId: scrapydServerId.value scrapydServerId: scrapydServerId.value
} }
...@@ -248,21 +256,21 @@ const handleFileChange = (file: UploadFile) => { ...@@ -248,21 +256,21 @@ const handleFileChange = (file: UploadFile) => {
ElMessage.warning('只能上传 .egg 或 .zip 格式的文件!'); ElMessage.warning('只能上传 .egg 或 .zip 格式的文件!');
return false; return false;
} }
// 设置文件和自动填写项目名称 // 设置文件和自动填写项目名称
addForm.value.file = file.raw addForm.value.file = file.raw
// 自动提取项目名称(仅在添加模式下) // 自动提取项目名称(仅在添加模式下)
if (!isEditMode.value && !addForm.value.project) { if (!isEditMode.value && !addForm.value.project) {
addForm.value.project = fileName.replace(/\.(egg|zip)$/, ''); addForm.value.project = fileName.replace(/\.(egg|zip)$/, '');
// 自动生成版本号 // 自动生成版本号
if (!addForm.value.version) { if (!addForm.value.version) {
const now = new Date(); const now = new Date();
addForm.value.version = `${now.getFullYear()}${String(now.getMonth() + 1).padStart(2, '0')}${String(now.getDate()).padStart(2, '0')}`; addForm.value.version = `${now.getFullYear()}${String(now.getMonth() + 1).padStart(2, '0')}${String(now.getDate()).padStart(2, '0')}`;
} }
} }
return true; return true;
} }
return false; return false;
...@@ -271,17 +279,17 @@ const handleFileChange = (file: UploadFile) => { ...@@ -271,17 +279,17 @@ const handleFileChange = (file: UploadFile) => {
// 提交添加项目 // 提交添加项目
const submitAddProject = async () => { const submitAddProject = async () => {
if (!addFormRef.value) return if (!addFormRef.value) return
await addFormRef.value.validate(async (valid: any) => { await addFormRef.value.validate(async (valid: any) => {
if (valid && addForm.value.file) { if (valid && addForm.value.file) {
submitLoading.value = true submitLoading.value = true
const formData = new FormData() const formData = new FormData()
formData.append('project', addForm.value.project) formData.append('project', addForm.value.project)
formData.append('version', addForm.value.version) formData.append('version', addForm.value.version)
formData.append('file', addForm.value.file) formData.append('file', addForm.value.file)
formData.append('scrapydServerId', scrapydServerId.value) formData.append('scrapydServerId', scrapydServerId.value)
try { try {
await addProjectVersion(formData) await addProjectVersion(formData)
ElMessage.success(isEditMode.value ? '更新版本成功' : '添加项目成功') ElMessage.success(isEditMode.value ? '更新版本成功' : '添加项目成功')
...@@ -305,13 +313,14 @@ const handleDeleteProject = (row: any) => { ...@@ -305,13 +313,14 @@ const handleDeleteProject = (row: any) => {
{ {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning',
customClass: 'custom-message-box',
} }
).then(async () => { ).then(async () => {
try { try {
await deleteProject({ await deleteProject({
project: row.name, project: row.name,
scrapydServerId: scrapydServerId.value scrapydServerId: scrapydServerId.value
}) })
ElMessage.success('删除项目成功') ElMessage.success('删除项目成功')
fetchProjectList() fetchProjectList()
...@@ -375,4 +384,26 @@ onMounted(() => { ...@@ -375,4 +384,26 @@ onMounted(() => {
.box-card { .box-card {
margin-top: 20px; margin-top: 20px;
} }
.el-button:focus {
outline: none;
}
</style> </style>
<style>
.el-dialog__headerbtn:focus {
outline: none;
}
.custom-message-box .el-button--primary {
outline: none;
}
.custom-message-box .el-button--default {
outline: none;
}
.custom-message-box .el-message-box__headerbtn {
outline: none;
}
</style>
\ No newline at end of file
...@@ -19,21 +19,16 @@ ...@@ -19,21 +19,16 @@
<el-button type="primary" @click="getList">查询</el-button> <el-button type="primary" @click="getList">查询</el-button>
<el-button type="danger" @click="handleClearLogs">清空日志</el-button> <el-button type="danger" @click="handleClearLogs">清空日志</el-button>
<el-button type="default" @click="setupAutoRefresh"> <el-button type="default" @click="setupAutoRefresh">
<el-icon v-if="isAutoRefreshing"><Loading /></el-icon> <el-icon v-if="isAutoRefreshing">
<Loading />
</el-icon>
{{ isAutoRefreshing ? '停止自动刷新' : '自动刷新' }} {{ isAutoRefreshing ? '停止自动刷新' : '自动刷新' }}
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
<el-table <el-table v-loading="listLoading" :data="list" element-loading-text="Loading" border fit highlight-current-row>
v-loading="listLoading"
:data="list"
element-loading-text="Loading"
border
fit
highlight-current-row
>
<el-table-column align="center" label="ID" width="80"> <el-table-column align="center" label="ID" width="80">
<template #default="scope"> <template #default="scope">
{{ scope.$index + 1 }} {{ scope.$index + 1 }}
...@@ -83,15 +78,9 @@ ...@@ -83,15 +78,9 @@
<div class="pagination-container"> <div class="pagination-container">
<el-config-provider :locale="zhCn"> <el-config-provider :locale="zhCn">
<el-pagination <el-pagination :current-page="listQuery.page" :page-sizes="[10, 20, 30, 50]" :page-size="listQuery.limit"
:current-page="listQuery.page" layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handleSizeChange"
:page-sizes="[10, 20, 30, 50]" @current-change="handleCurrentChange" />
:page-size="listQuery.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</el-config-provider> </el-config-provider>
</div> </div>
</div> </div>
...@@ -154,7 +143,7 @@ const getList = async () => { ...@@ -154,7 +143,7 @@ const getList = async () => {
}) })
list.value = res.data.list || [] list.value = res.data.list || []
total.value = res.data.total || 0 total.value = res.data.total || 0
// 更新状态计数 // 更新状态计数
if (res.data) { if (res.data) {
statusInfo.total = res.data.total || 0 statusInfo.total = res.data.total || 0
...@@ -203,7 +192,7 @@ const setupAutoRefresh = () => { ...@@ -203,7 +192,7 @@ const setupAutoRefresh = () => {
isAutoRefreshing.value = true isAutoRefreshing.value = true
ElMessage({ ElMessage({
type: 'success', type: 'success',
message: `已设置每${refreshFrequency/1000}秒自动刷新` message: `已设置每${refreshFrequency / 1000}秒自动刷新`
}) })
} }
} }
...@@ -212,13 +201,13 @@ const setupAutoRefresh = () => { ...@@ -212,13 +201,13 @@ const setupAutoRefresh = () => {
const handleClearLogs = () => { const handleClearLogs = () => {
// 构建确认提示信息 // 构建确认提示信息
let confirmMsg = '确认清空' let confirmMsg = '确认清空'
if (status.value !== 'total') { if (status.value !== 'total') {
confirmMsg += `${status.value === 'success' ? '成功' : '失败'}` confirmMsg += `${status.value === 'success' ? '成功' : '失败'}`
} }
confirmMsg += '调度日志' confirmMsg += '调度日志'
if (listQuery.project) { if (listQuery.project) {
confirmMsg += `(项目:${listQuery.project}` confirmMsg += `(项目:${listQuery.project}`
if (listQuery.spider) { if (listQuery.spider) {
...@@ -228,13 +217,14 @@ const handleClearLogs = () => { ...@@ -228,13 +217,14 @@ const handleClearLogs = () => {
} else if (listQuery.spider) { } else if (listQuery.spider) {
confirmMsg += `(爬虫:${listQuery.spider})` confirmMsg += `(爬虫:${listQuery.spider})`
} }
confirmMsg += '?' confirmMsg += '?'
ElMessageBox.confirm(confirmMsg, '提示', { ElMessageBox.confirm(confirmMsg, '提示', {
confirmButtonText: '确认', confirmButtonText: '确认',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning',
customClass: 'custom-message-box',
}).then(async () => { }).then(async () => {
try { try {
// 构造清空参数,可以按项目、爬虫过滤 // 构造清空参数,可以按项目、爬虫过滤
...@@ -245,7 +235,7 @@ const handleClearLogs = () => { ...@@ -245,7 +235,7 @@ const handleClearLogs = () => {
scrapydServerId: listQuery.scrapydServerId, scrapydServerId: listQuery.scrapydServerId,
job_id: listQuery.job_id job_id: listQuery.job_id
} }
await scheduleApi.removeScheduleLogs(clearParams) await scheduleApi.removeScheduleLogs(clearParams)
ElMessage({ ElMessage({
type: 'success', type: 'success',
...@@ -271,12 +261,12 @@ onMounted(() => { ...@@ -271,12 +261,12 @@ onMounted(() => {
const querySpider = route.query.spider as string const querySpider = route.query.spider as string
const queryServerId = route.query.scrapydServerId as string const queryServerId = route.query.scrapydServerId as string
const queryJob = route.query.job as string const queryJob = route.query.job as string
if (queryProject) listQuery.project = queryProject if (queryProject) listQuery.project = queryProject
if (querySpider) listQuery.spider = querySpider if (querySpider) listQuery.spider = querySpider
if (queryServerId) listQuery.scrapydServerId = queryServerId if (queryServerId) listQuery.scrapydServerId = queryServerId
if (queryJob) listQuery.job_id = queryJob if (queryJob) listQuery.job_id = queryJob
getList() getList()
}) })
...@@ -297,4 +287,24 @@ onBeforeUnmount(() => { ...@@ -297,4 +287,24 @@ onBeforeUnmount(() => {
.pagination-container { .pagination-container {
padding: 10px 0; padding: 10px 0;
} }
.el-button:focus {
outline: none;
}
</style> </style>
<style>
.custom-message-box .el-button--primary {
outline: none;
}
.custom-message-box .el-button--default {
outline: none;
}
.custom-message-box .el-message-box__headerbtn {
outline: none;
}
</style>
\ No newline at end of file
...@@ -198,3 +198,12 @@ const submit = () => { ...@@ -198,3 +198,12 @@ const submit = () => {
}; };
</script> </script>
<style>
.el-button:focus {
outline: none;
}
.el-dialog__headerbtn:focus {
outline: none;
}
</style>
...@@ -31,7 +31,8 @@ const handleDelete = () => { ...@@ -31,7 +31,8 @@ const handleDelete = () => {
ElMessageBox.confirm(`确定要删除服务"${props.row.server_name}"吗?`, '提示', { ElMessageBox.confirm(`确定要删除服务"${props.row.server_name}"吗?`, '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning',
customClass: 'custom-message-box',
}).then(async () => { }).then(async () => {
try { try {
const res = await deleteScrapydServer({ const res = await deleteScrapydServer({
...@@ -55,3 +56,9 @@ const handleDelete = () => { ...@@ -55,3 +56,9 @@ const handleDelete = () => {
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>
<style>
.custom-message-box .el-message-box__headerbtn {
outline: none;
}
</style>
...@@ -42,7 +42,8 @@ const confirmRemove = () => { ...@@ -42,7 +42,8 @@ const confirmRemove = () => {
ElMessageBox.confirm('确认删除所选的统计数据?', '提示', { ElMessageBox.confirm('确认删除所选的统计数据?', '提示', {
confirmButtonText: '确认', confirmButtonText: '确认',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning',
customClass: 'custom-message-box',
}) })
.then(async () => { .then(async () => {
try { try {
...@@ -88,6 +89,23 @@ const confirmRemove = () => { ...@@ -88,6 +89,23 @@ const confirmRemove = () => {
<style lang="scss" scoped> <style lang="scss" scoped>
.stats-remove { .stats-remove {
margin-left: 10px; margin-left: 10px;
margin-top: -2px;
display: inline-block; display: inline-block;
} }
.el-button:focus {
outline: none;
}
.custom-message-box .el-button--primary {
outline: none;
}
.custom-message-box .el-button--default {
outline: none;
}
.custom-message-box .el-message-box__headerbtn {
outline: none;
}
</style> </style>
...@@ -2,58 +2,28 @@ ...@@ -2,58 +2,28 @@
<div class="stats-tool"> <div class="stats-tool">
<el-form :inline="true" class="demo-form-inline"> <el-form :inline="true" class="demo-form-inline">
<el-form-item label="服务器" size="default"> <el-form-item label="服务器" size="default">
<select-scrapyd-server <select-scrapyd-server v-model:value="serverValue" @change="handleServerChange" />
v-model:value="serverValue"
@change="handleServerChange"
/>
</el-form-item> </el-form-item>
<el-form-item size="default" label="项目"> <el-form-item size="default" label="项目">
<el-select <el-select v-model="projectValue" placeholder="请选择项目" clearable @change="handleProjectChange"
v-model="projectValue" style="width: 180px" size="default">
placeholder="请选择项目" <el-option v-for="item in projectOptions" :key="item.value" :label="item.label" :value="item.value" />
clearable
@change="handleProjectChange"
style="width: 180px"
size="default"
>
<el-option
v-for="item in projectOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="爬虫" size="default"> <el-form-item label="爬虫" size="default">
<el-select <el-select v-model="spiderValue" placeholder="请选择爬虫" clearable size="default" @change="handleSpiderChange"
v-model="spiderValue" style="width: 180px">
placeholder="请选择爬虫" <el-option v-for="item in spiderOptions" :key="item.value" :label="item.label" :value="item.value" />
clearable
size="default"
@change="handleSpiderChange"
style="width: 180px"
>
<el-option
v-for="item in spiderOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="handleSearch">查询</el-button> <el-button type="primary" @click="handleSearch">查询</el-button>
<el-button type="danger" @click="confirmClear">清空数据</el-button> <el-button type="danger" @click="confirmClear">清空数据</el-button>
<stats-remove <stats-remove :scrapyd-server-id="serverValue" :project="projectValue" :spider="spiderValue" button-text="批量删除"
:scrapyd-server-id="serverValue" @success="handleRemoveSuccess" />
:project="projectValue"
:spider="spiderValue"
button-text="批量删除"
@success="handleRemoveSuccess"
/>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
...@@ -106,12 +76,12 @@ const spiderOptions = ref<OptionItem[]>([]) ...@@ -106,12 +76,12 @@ const spiderOptions = ref<OptionItem[]>([])
// 获取项目列表 // 获取项目列表
const getProjects = async () => { const getProjects = async () => {
if (!serverValue.value) return if (!serverValue.value) return
try { try {
const res = await projectApi.listProjects({ const res = await projectApi.listProjects({
scrapydServerId: serverValue.value scrapydServerId: serverValue.value
}) })
if (res.code === 0) { if (res.code === 0) {
projectOptions.value = (res.data || []).map((item: string) => ({ projectOptions.value = (res.data || []).map((item: string) => ({
label: item, label: item,
...@@ -126,13 +96,13 @@ const getProjects = async () => { ...@@ -126,13 +96,13 @@ const getProjects = async () => {
// 获取爬虫列表 // 获取爬虫列表
const getSpiders = async () => { const getSpiders = async () => {
if (!serverValue.value || !projectValue.value) return if (!serverValue.value || !projectValue.value) return
try { try {
const res = await projectApi.listSpiders({ const res = await projectApi.listSpiders({
scrapydServerId: serverValue.value, scrapydServerId: serverValue.value,
project: projectValue.value project: projectValue.value
}) })
if (res.code === 0) { if (res.code === 0) {
spiderOptions.value = (res.data || []).map((item: string) => ({ spiderOptions.value = (res.data || []).map((item: string) => ({
label: item, label: item,
...@@ -148,13 +118,13 @@ const getSpiders = async () => { ...@@ -148,13 +118,13 @@ const getSpiders = async () => {
const handleServerChange = async (val: string) => { const handleServerChange = async (val: string) => {
serverValue.value = val serverValue.value = val
emit('update:scrapyd-server-id', val) emit('update:scrapyd-server-id', val)
// 清空项目和爬虫选择 // 清空项目和爬虫选择
projectValue.value = '' projectValue.value = ''
emit('update:project', '') emit('update:project', '')
spiderValue.value = '' spiderValue.value = ''
emit('update:spider', '') emit('update:spider', '')
// 重新加载项目列表 // 重新加载项目列表
await getProjects() await getProjects()
} }
...@@ -163,14 +133,14 @@ const handleServerChange = async (val: string) => { ...@@ -163,14 +133,14 @@ const handleServerChange = async (val: string) => {
const handleProjectChange = async (val: string) => { const handleProjectChange = async (val: string) => {
projectValue.value = val projectValue.value = val
emit('update:project', val) emit('update:project', val)
// 清空爬虫选择 // 清空爬虫选择
spiderValue.value = '' spiderValue.value = ''
emit('update:spider', '') emit('update:spider', '')
// 重新加载爬虫列表 // 重新加载爬虫列表
await getSpiders() await getSpiders()
// 触发项目变化事件 // 触发项目变化事件
emit('project-change') emit('project-change')
} }
...@@ -179,7 +149,7 @@ const handleProjectChange = async (val: string) => { ...@@ -179,7 +149,7 @@ const handleProjectChange = async (val: string) => {
const handleSpiderChange = async (val: string) => { const handleSpiderChange = async (val: string) => {
spiderValue.value = val spiderValue.value = val
emit('update:spider', val) emit('update:spider', val)
// 触发爬虫变化事件 // 触发爬虫变化事件
emit('spider-change') emit('spider-change')
} }
...@@ -199,7 +169,9 @@ const confirmClear = () => { ...@@ -199,7 +169,9 @@ const confirmClear = () => {
ElMessageBox.confirm('确认清空所有统计数据?', '提示', { ElMessageBox.confirm('确认清空所有统计数据?', '提示', {
confirmButtonText: '确认', confirmButtonText: '确认',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning',
customClass: 'custom-message-box',
}) })
.then(async () => { .then(async () => {
try { try {
...@@ -208,7 +180,7 @@ const confirmClear = () => { ...@@ -208,7 +180,7 @@ const confirmClear = () => {
project: projectValue.value, project: projectValue.value,
spider: spiderValue.value spider: spiderValue.value
}) })
if (res.code === 0) { if (res.code === 0) {
ElMessage({ ElMessage({
type: 'success', type: 'success',
...@@ -241,7 +213,7 @@ watch(() => props.spider, (val) => { ...@@ -241,7 +213,7 @@ watch(() => props.spider, (val) => {
onMounted(async () => { onMounted(async () => {
if (serverValue.value) { if (serverValue.value) {
await getProjects() await getProjects()
if (projectValue.value) { if (projectValue.value) {
await getSpiders() await getSpiders()
} }
...@@ -250,8 +222,37 @@ onMounted(async () => { ...@@ -250,8 +222,37 @@ onMounted(async () => {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
// .custom-message-box .el-button--primary {
// outline: none;
// // background-color: aqua;
// }
.stats-tool { .stats-tool {
margin-bottom: 20px; margin-bottom: 20px;
text-align: left; text-align: left;
} }
:deep(.Border) {
border-color: white;
}
::v-deep .el-button:focus {
outline: none;
}
</style>
<style>
.custom-message-box .el-button--primary {
outline: none;
}
.custom-message-box .el-button--default {
outline: none;
}
.custom-message-box .el-message-box__headerbtn {
outline: none;
}
</style> </style>
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