爬虫实现,修改class转样式,前端渲染

This commit is contained in:
2025-11-21 16:49:37 +08:00
parent 7eab82c6af
commit a492b68fa2
11 changed files with 406 additions and 45 deletions

View File

@@ -64,7 +64,7 @@ export interface CrontabLog extends BaseDTO {
methodName?: string;
/** 方法参数 */
methodParams?: string;
/** 执行状态0:失败 1:成功) */
/** 执行状态0:失败 1:成功 2运行中 */
executeStatus?: number;
/** 执行结果信息 */
executeMessage?: string;
@@ -162,11 +162,38 @@ export interface CrontabParam {
name: string;
/** 参数描述 */
description: string;
/** 参数类型 */
type: string;
/**
* 前端渲染的组件类型
* - Input: 文本输入框
* - InputNumber: 数字输入框
* - DatePicker: 日期选择器
* - DateRangePicker: 日期范围选择器
* - Switch: 布尔开关
* - Select: 下拉选择器
*/
type: 'Input' | 'InputNumber' | 'DatePicker' | 'DateRangePicker' | 'Switch' | 'Select';
/**
* 参数值的数据类型(后端处理使用)
* - String: 字符串
* - Integer: 整数
* - Boolean: 布尔值
*/
valueType: 'String' | 'Integer' | 'Boolean';
/** 默认值 */
value: any;
/** 是否必填 */
required: boolean;
/** Select类型的选项列表 */
options?: Array<{
/** 选项显示文本 */
label: string;
/** 选项值 */
value: string;
}>;
/** DateRangePicker的开始日期参数名startDate, start */
startKey?: string;
/** DateRangePicker的结束日期参数名endDate, end */
endKey?: string;
}
/**

View File

@@ -41,6 +41,7 @@
>
<el-option label="成功" :value="1" />
<el-option label="失败" :value="0" />
<el-option label="运行中" :value="2" />
</el-select>
</div>
<div class="search-actions">
@@ -69,8 +70,11 @@
<el-table-column prop="methodName" label="方法名称" width="120" />
<el-table-column label="执行状态" width="100">
<template #default="{ row }">
<el-tag :type="row.executeStatus === 1 ? 'success' : 'danger'" size="small">
{{ row.executeStatus === 1 ? '成功' : '失败' }}
<el-tag
:type="row.executeStatus === 1 ? 'success' : row.executeStatus === 2 ? 'warning' : 'danger'"
size="small"
>
{{ row.executeStatus === 1 ? '成功' : row.executeStatus === 2 ? '运行中' : '失败' }}
</el-tag>
</template>
</el-table-column>
@@ -152,8 +156,11 @@
</div>
<div class="detail-item">
<span class="detail-label">执行状态</span>
<el-tag :type="currentLog.executeStatus === 1 ? 'success' : 'danger'" size="small">
{{ currentLog.executeStatus === 1 ? '成功' : '失败' }}
<el-tag
:type="currentLog.executeStatus === 1 ? 'success' : currentLog.executeStatus === 2 ? 'warning' : 'danger'"
size="small"
>
{{ currentLog.executeStatus === 1 ? '成功' : currentLog.executeStatus === 2 ? '运行中' : '失败' }}
</el-tag>
</div>
<div class="detail-item">

View File

@@ -232,25 +232,67 @@
{{ param.description }}
<span class="param-type">({{ param.type }})</span>
</span>
<!-- 文本输入框 -->
<el-input
v-if="param.type === 'String'"
v-if="param.type === 'Input'"
v-model="dynamicParams[param.name]"
:placeholder="`请输入${param.description}`"
clearable
/>
<!-- 数字输入框 -->
<el-input-number
v-else-if="param.type === 'Integer'"
v-else-if="param.type === 'InputNumber'"
v-model="dynamicParams[param.name]"
:placeholder="`请输入${param.description}`"
controls-position="right"
style="width: 100%"
/>
<!-- 日期选择器 -->
<el-date-picker
v-else-if="param.type === 'DatePicker'"
v-model="dynamicParams[param.name]"
type="date"
:placeholder="`请选择${param.description}`"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
clearable
style="width: 100%"
/>
<!-- 日期范围选择器 -->
<el-date-picker
v-else-if="param.type === 'DateRangePicker'"
v-model="dynamicParams[param.name]"
type="daterange"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
clearable
style="width: 100%"
/>
<!-- 布尔开关 -->
<el-switch
v-else-if="param.type === 'Boolean'"
v-else-if="param.type === 'Switch'"
v-model="dynamicParams[param.name]"
active-text=""
inactive-text=""
/>
<!-- 下拉选择器 -->
<el-select
v-else-if="param.type === 'Select'"
v-model="dynamicParams[param.name]"
:placeholder="`请选择${param.description}`"
clearable
style="width: 100%"
>
<el-option
v-for="option in param.options"
:key="option.value"
:label="option.label"
:value="option.value"
/>
</el-select>
</div>
</div>
</div>
@@ -819,6 +861,24 @@ async function handleEdit(row: CrontabTask) {
const params = JSON.parse(row.methodParams);
// 排除系统参数
const { scriptPath, taskId, logId, ...restParams } = params;
// 处理DateRangePicker参数将startKey和endKey合并为dateRange数组
if (method.params) {
for (const param of method.params) {
if (param.type === 'DateRangePicker' && param.startKey && param.endKey) {
const startValue = restParams[param.startKey];
const endValue = restParams[param.endKey];
if (startValue && endValue) {
// 合并为数组
restParams[param.name] = [startValue, endValue];
// 删除原始的start和end字段
delete restParams[param.startKey];
delete restParams[param.endKey];
}
}
}
}
// 延迟设置确保watch先执行完
setTimeout(() => {
dynamicParams.value = restParams;
@@ -971,11 +1031,12 @@ async function handleSubmit() {
for (const param of selectedMethod.value.params) {
const value = dynamicParams.value[param.name];
if (param.required && param.type === 'String' && (!value || value.trim() === '')) {
// 使用valueType判断值类型
if (param.required && param.valueType === 'String' && (!value || value.trim() === '')) {
ElMessage.warning(`请输入${param.description}`);
return;
}
if (param.required && param.type === 'Integer' && (value === undefined || value === null || value === '')) {
if (param.required && param.valueType === 'Integer' && (value === undefined || value === null || value === '')) {
ElMessage.warning(`请输入${param.description}`);
return;
}
@@ -984,15 +1045,32 @@ async function handleSubmit() {
submitting.value = true;
try {
// 处理DateRangePicker参数将数组拆分为开始和结束日期
const processedParams = { ...dynamicParams.value };
if (selectedMethod.value.params) {
for (const param of selectedMethod.value.params) {
if (param.type === 'DateRangePicker' && processedParams[param.name]) {
const dateRange = processedParams[param.name];
if (Array.isArray(dateRange) && dateRange.length === 2) {
// 拆分为startKey和endKey
const startKey = (param as any).startKey || 'startDate';
const endKey = (param as any).endKey || 'endDate';
processedParams[startKey] = dateRange[0];
processedParams[endKey] = dateRange[1];
// 删除原始的range参数
delete processedParams[param.name];
}
}
}
}
// 构建CreateTaskRequest
const requestData: CreateTaskRequest = {
metaId: selectedMetaId.value,
task: {
...formData,
defaultRecipient: useDefaultRecipients.value,
methodParams: JSON.stringify({
...dynamicParams.value
})
methodParams: JSON.stringify(processedParams)
} as CrontabTask,
additionalRecipients: additionalRecipients.value
};

View File

@@ -6,11 +6,11 @@
<div class="article-management">
<div class="action-bar">
<el-button type="primary" @click="showCreateDialog">+ 新增文章</el-button>
<el-button @click="handleDataCollection">数据采集</el-button>
<el-input
v-model="searchKeyword"
placeholder="搜索文章..."
style="width: 300px"
onkeydown=""
clearable
/>
</div>