mirror of
https://gitee.com/fit2cloud-feizhiyun/MeterSphere.git
synced 2024-11-30 11:08:38 +08:00
Merge branch 'master' of https://github.com/metersphere/metersphere into v1.6
This commit is contained in:
commit
bcbcfebe61
@ -204,13 +204,10 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl
|
||||
}
|
||||
}
|
||||
ApiScenarioReport savedReport = apiScenarioReportService.get(testId);
|
||||
String scenarioID = null;
|
||||
String scenarioID = "";
|
||||
if(savedReport!=null){
|
||||
scenarioID = savedReport.getScenarioId();
|
||||
}
|
||||
if(scenarioID==null){
|
||||
scenarioID = apiScenarioReportService.getApiScenarioId(scenaName, scenarioReport.getProjectId());
|
||||
}
|
||||
|
||||
testResult.setTestId(scenarioID);
|
||||
} else {
|
||||
|
@ -88,7 +88,18 @@ public class ApiDefinitionExecResultService {
|
||||
if (startTime == null) {
|
||||
return new ArrayList<>(0);
|
||||
} else {
|
||||
return extApiDefinitionExecResultMapper.findFaliureCaseInfoByProjectIDAndExecuteTimeAndLimitNumber(projectId, startTime.getTime(), limitNumber);
|
||||
List<ExecutedCaseInfoResult>list = extApiDefinitionExecResultMapper.findFaliureCaseInfoByProjectIDAndExecuteTimeAndLimitNumber(projectId, startTime.getTime());
|
||||
|
||||
List<ExecutedCaseInfoResult> returnList = new ArrayList<>(limitNumber);
|
||||
for(int i = 0;i<list.size();i++){
|
||||
if(i<limitNumber){
|
||||
returnList.add(list.get(i));
|
||||
}else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return returnList;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -19,6 +19,6 @@ public interface ExtApiDefinitionExecResultMapper {
|
||||
|
||||
long countByTestCaseIDInProject(String projectId);
|
||||
|
||||
List<ExecutedCaseInfoResult> findFaliureCaseInfoByProjectIDAndExecuteTimeAndLimitNumber(@Param("projectId") String projectId, @Param("startTimestamp") long startTimestamp, @Param("limitNumber") int limitNumber);
|
||||
List<ExecutedCaseInfoResult> findFaliureCaseInfoByProjectIDAndExecuteTimeAndLimitNumber(@Param("projectId") String projectId, @Param("startTimestamp") long startTimestamp);
|
||||
|
||||
}
|
@ -52,9 +52,9 @@
|
||||
UNION
|
||||
SELECT scene.`name` AS caseName,apiScene.testPlanName AS testPlan,count(report.id) AS failureTimes,'scenario' AS caseType
|
||||
FROM api_scenario_report report
|
||||
INNER JOIN api_scenario_report_detail reportDetail ON report.id = reportDetail.report_id
|
||||
INNER JOIN api_scenario scene ON report.scenario_id = scene.id
|
||||
LEFT JOIN
|
||||
INNER JOIN api_scenario_report_detail reportDetail ON report.id = reportDetail.report_id
|
||||
INNER JOIN api_scenario scene ON report.scenario_id = scene.id
|
||||
LEFT JOIN
|
||||
(
|
||||
SELECT
|
||||
apiScene.api_scenario_id,
|
||||
@ -65,10 +65,9 @@
|
||||
GROUP BY apiScene.api_scenario_id
|
||||
)apiScene ON apiScene.api_scenario_id = scene.id
|
||||
WHERE report.project_id = #{projectId}
|
||||
AND report.status = 'Error' AND report.create_time >= #{startTimestamp}
|
||||
GROUP BY scene.id
|
||||
AND ( report.STATUS = 'Error' OR report.STATUS = 'Fail' ) AND report.create_time >= #{startTimestamp}
|
||||
GROUP BY scene.id
|
||||
) showTable
|
||||
ORDER BY showTable.failureTimes DESC
|
||||
limit #{limitNumber}
|
||||
</select>
|
||||
</mapper>
|
@ -115,11 +115,11 @@
|
||||
</update>
|
||||
|
||||
<select id="countByProjectID" resultType="java.lang.Long">
|
||||
SELECT COUNT(id) AS countNumber FROM api_scenario WHERE project_id = #{0}
|
||||
SELECT COUNT(id) AS countNumber FROM api_scenario WHERE project_id = #{0} AND status != 'Trash'
|
||||
</select>
|
||||
<select id="countByProjectIDAndCreatInThisWeek" resultType="java.lang.Long">
|
||||
SELECT count(id) AS countNumber FROM api_scenario
|
||||
WHERE project_id = #{projectId}
|
||||
WHERE project_id = #{projectId} AND status != 'Trash'
|
||||
AND create_time BETWEEN #{firstDayTimestamp} AND #{lastDayTimestamp}
|
||||
</select>
|
||||
|
||||
|
@ -34,7 +34,7 @@
|
||||
|
||||
<el-tab-pane name="add">
|
||||
<template v-slot:label>
|
||||
<el-button type="primary" plain icon="el-icon-plus" size="mini"/>
|
||||
<el-button type="primary" plain icon="el-icon-plus" size="mini" v-tester/>
|
||||
</template>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
|
@ -12,10 +12,10 @@
|
||||
<ms-scenario-results :scenarios="content.scenarios" v-on:requestResult="requestResult"/>
|
||||
</div>
|
||||
<!--<el-collapse-transition>-->
|
||||
<!--<div v-show="isActive" style="width: 99%">-->
|
||||
<!--<ms-request-result-tail v-if="isRequestResult" :request-type="requestType" :request="request"-->
|
||||
<!--:scenario-name="scenarioName"/>-->
|
||||
<!--</div>-->
|
||||
<!--<div v-show="isActive" style="width: 99%">-->
|
||||
<!--<ms-request-result-tail v-if="isRequestResult" :request-type="requestType" :request="request"-->
|
||||
<!--:scenario-name="scenarioName"/>-->
|
||||
<!--</div>-->
|
||||
<!--</el-collapse-transition>-->
|
||||
<ms-api-report-export v-if="reportExportVisible" id="apiTestReport" :title="report.testName"
|
||||
:content="content" :total-time="totalTime"/>
|
||||
@ -38,7 +38,7 @@
|
||||
import MsApiReportExport from "./ApiReportExport";
|
||||
import MsApiReportViewHeader from "./ApiReportViewHeader";
|
||||
import {RequestFactory} from "../../definition/model/ApiTestModel";
|
||||
import {windowPrint} from "@/common/js/utils";
|
||||
import {windowPrint, getCurrentProjectID} from "@/common/js/utils";
|
||||
|
||||
export default {
|
||||
name: "MsApiReport",
|
||||
@ -166,16 +166,9 @@
|
||||
this.$warning(this.$t('api_test.automation.report_name_info'));
|
||||
return;
|
||||
}
|
||||
if (!this.currentProjectId) {
|
||||
this.$warning(this.$t('api_test.select_project'));
|
||||
return;
|
||||
}
|
||||
this.loading = true;
|
||||
this.report.projectId = this.currentProjectId;
|
||||
let url = "/api/scenario/report/add";
|
||||
if (this.infoDb === true) {
|
||||
url = "/api/scenario/report/update";
|
||||
}
|
||||
this.report.projectId = getCurrentProjectID();
|
||||
let url = "/api/scenario/report/update";
|
||||
this.result = this.$post(url, this.report, response => {
|
||||
this.$success(this.$t('commons.save_success'));
|
||||
this.loading = false;
|
||||
|
@ -50,14 +50,14 @@
|
||||
<el-table-column :label="$t('commons.operating')" width="200px" v-if="!referenced">
|
||||
<template v-slot:default="{row}">
|
||||
<div v-if="trashEnable">
|
||||
<el-button type="text" @click="reductionApi(row)">恢复</el-button>
|
||||
<el-button type="text" @click="remove(row)">{{ $t('api_test.automation.remove') }}</el-button>
|
||||
<el-button type="text" @click="reductionApi(row)" v-tester>{{$t('commons.reduction')}}</el-button>
|
||||
<el-button type="text" @click="remove(row)" v-tester>{{ $t('api_test.automation.remove') }}</el-button>
|
||||
</div>
|
||||
<div v-else>
|
||||
<el-button type="text" @click="edit(row)">{{ $t('api_test.automation.edit') }}</el-button>
|
||||
<el-button type="text" @click="execute(row)">{{ $t('api_test.automation.execute') }}</el-button>
|
||||
<el-button type="text" @click="copy(row)">{{ $t('api_test.automation.copy') }}</el-button>
|
||||
<el-button type="text" @click="remove(row)">{{ $t('api_test.automation.remove') }}</el-button>
|
||||
<el-button type="text" @click="edit(row)" v-tester>{{ $t('api_test.automation.edit') }}</el-button>
|
||||
<el-button type="text" @click="execute(row)" v-tester>{{ $t('api_test.automation.execute') }}</el-button>
|
||||
<el-button type="text" @click="copy(row)" v-tester>{{ $t('api_test.automation.copy') }}</el-button>
|
||||
<el-button type="text" @click="remove(row)" v-tester>{{ $t('api_test.automation.remove') }}</el-button>
|
||||
<ms-scenario-extend-buttons :row="row"/>
|
||||
</div>
|
||||
</template>
|
||||
@ -161,7 +161,7 @@
|
||||
if (this.projectId != null) {
|
||||
this.condition.projectId = this.projectId;
|
||||
}
|
||||
|
||||
this.selection = [];
|
||||
let url = "/api/automation/list/" + this.currentPage + "/" + this.pageSize;
|
||||
this.$post(url, this.condition, response => {
|
||||
let data = response.data;
|
||||
|
@ -18,7 +18,7 @@
|
||||
<el-input class="module-input" :placeholder="$t('test_track.module.search')" v-model="condition.filterText"
|
||||
size="small">
|
||||
<template v-slot:append>
|
||||
<el-button icon="el-icon-folder-add" @click="addScenario"/>
|
||||
<el-button icon="el-icon-folder-add" @click="addScenario" v-tester/>
|
||||
</template>
|
||||
</el-input>
|
||||
<module-trash-button v-if="!isReadOnly" :condition="condition" :exe="enableTrash"/>
|
||||
|
@ -17,7 +17,7 @@
|
||||
<ms-main-container>
|
||||
<el-dropdown size="small" split-button type="primary" class="ms-api-buttion"
|
||||
@click="handleCommand('ADD')"
|
||||
@command="handleCommand">
|
||||
@command="handleCommand" v-tester>
|
||||
{{$t('commons.add')}}
|
||||
<el-dropdown-menu slot="dropdown">
|
||||
<el-dropdown-item command="debug">{{$t('api_test.definition.request.fast_debug')}}</el-dropdown-item>
|
||||
@ -249,22 +249,13 @@
|
||||
downloadFile("导出API.json", JSON.stringify(obj));
|
||||
} else {
|
||||
let condition = {};
|
||||
if (this.isApiListEnable) {
|
||||
let url = "/api/definition/list/1/100000";
|
||||
condition.filters = ["Prepare", "Underway", "Completed"];
|
||||
condition.projectId = getCurrentProjectID();
|
||||
this.$post(url, condition, response => {
|
||||
obj.data = response.data.listObject;
|
||||
downloadFile("导出API.json", JSON.stringify(obj));
|
||||
});
|
||||
} else {
|
||||
let url = "/api/testcase/list/";
|
||||
condition.projectId = getCurrentProjectID();
|
||||
this.$post(url, condition, response => {
|
||||
obj.data = response.data;
|
||||
downloadFile("导出API.json", JSON.stringify(obj));
|
||||
});
|
||||
}
|
||||
let url = "/api/definition/list/1/100000";
|
||||
condition.filters = ["Prepare", "Underway", "Completed"];
|
||||
condition.projectId = getCurrentProjectID();
|
||||
this.$post(url, condition, response => {
|
||||
obj.data = response.data.listObject;
|
||||
downloadFile("导出API.json", JSON.stringify(obj));
|
||||
});
|
||||
}
|
||||
},
|
||||
refresh(data) {
|
||||
|
@ -42,7 +42,7 @@
|
||||
</el-col>
|
||||
<el-col :span="2" v-if="!(isReadOnly || isCaseEdit)">
|
||||
<el-dropdown size="small" split-button type="primary" class="ms-api-header-select" @click="addCase"
|
||||
@command="handleCommand">
|
||||
@command="handleCommand" v-tester>
|
||||
+{{$t('api_test.definition.request.case')}}
|
||||
<el-dropdown-menu slot="dropdown">
|
||||
<el-dropdown-item command="run">{{$t('commons.test')}}</el-dropdown-item>
|
||||
|
@ -19,7 +19,7 @@
|
||||
@blur="saveTestCase(apiCase)" placeholder="请输入用例名称"/>
|
||||
<span v-else>
|
||||
{{apiCase.id ? apiCase.name:''}}
|
||||
<i class="el-icon-edit" style="cursor:pointer" @click="showInput(apiCase)"/>
|
||||
<i class="el-icon-edit" style="cursor:pointer" @click="showInput(apiCase)" v-tester/>
|
||||
</span>
|
||||
<div v-if="apiCase.id" style="color: #999999;font-size: 12px">
|
||||
<span>
|
||||
@ -35,12 +35,12 @@
|
||||
|
||||
<el-col :span="4">
|
||||
<ms-tip-button @click="singleRun(apiCase)" :tip="$t('api_test.run')" icon="el-icon-video-play"
|
||||
style="background-color: #409EFF;color: white" size="mini" :disabled="!apiCase.id" circle/>
|
||||
style="background-color: #409EFF;color: white" size="mini" :disabled="!apiCase.id" circle v-tester/>
|
||||
<ms-tip-button @click="copyCase(apiCase)" :tip="$t('commons.copy')" icon="el-icon-document-copy"
|
||||
size="mini" :disabled="!apiCase.id || isCaseEdit" circle/>
|
||||
size="mini" :disabled="!apiCase.id || isCaseEdit" circle v-tester/>
|
||||
<ms-tip-button @click="deleteCase(index,apiCase)" :tip="$t('commons.delete')" icon="el-icon-delete"
|
||||
size="mini" :disabled="!apiCase.id || isCaseEdit" circle/>
|
||||
<ms-api-extend-btns :is-case-edit="isCaseEdit" :row="apiCase"/>
|
||||
size="mini" :disabled="!apiCase.id || isCaseEdit" circle v-tester/>
|
||||
<ms-api-extend-btns :is-case-edit="isCaseEdit" :row="apiCase" v-tester/>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="3">
|
||||
@ -64,7 +64,7 @@
|
||||
<ms-sql-basis-parameters :request="apiCase.request" v-if="api.protocol==='SQL'"/>
|
||||
<ms-dubbo-basis-parameters :request="apiCase.request" v-if="api.protocol==='DUBBO'"/>
|
||||
<!-- 保存操作 -->
|
||||
<el-button type="primary" size="small" style="margin: 20px; float: right" @click="saveTestCase(apiCase)">
|
||||
<el-button type="primary" size="small" style="margin: 20px; float: right" @click="saveTestCase(apiCase)" v-tester>
|
||||
{{$t('commons.save')}}
|
||||
</el-button>
|
||||
</div>
|
||||
|
@ -69,7 +69,7 @@
|
||||
|
||||
<el-table-column v-if="!isReadOnly && !isRelevanceModel" :label="$t('commons.operating')" min-width="130" align="center">
|
||||
<template v-slot:default="scope">
|
||||
<!--<el-button type="text" @click="reductionApi(scope.row)" v-if="trashEnable">恢复</el-button>-->
|
||||
<!--<el-button type="text" @click="reductionApi(scope.row)" v-if="trashEnable">{{$t('commons.reduction')}}</el-button>-->
|
||||
<el-button type="text" @click="handleTestCase(scope.row)" v-if="!trashEnable">{{$t('commons.edit')}}</el-button>
|
||||
<el-button type="text" @click="handleDelete(scope.row)" style="color: #F56C6C">{{$t('commons.delete')}}</el-button>
|
||||
</template>
|
||||
|
@ -78,10 +78,10 @@
|
||||
|
||||
<el-table-column v-if="!isReadOnly && !isRelevance" :label="$t('commons.operating')" min-width="130" align="center">
|
||||
<template v-slot:default="scope">
|
||||
<el-button type="text" @click="reductionApi(scope.row)" v-if="trashEnable">恢复</el-button>
|
||||
<el-button type="text" @click="editApi(scope.row)" v-else>{{$t('commons.edit')}}</el-button>
|
||||
<el-button type="text" @click="reductionApi(scope.row)" v-if="trashEnable" v-tester>{{$t('commons.reduction')}}</el-button>
|
||||
<el-button type="text" @click="editApi(scope.row)" v-else v-tester>{{$t('commons.edit')}}</el-button>
|
||||
<el-button type="text" @click="handleTestCase(scope.row)">{{$t('api_test.definition.request.case')}}</el-button>
|
||||
<el-button type="text" @click="handleDelete(scope.row)" style="color: #F56C6C">{{$t('commons.delete')}}</el-button>
|
||||
<el-button type="text" @click="handleDelete(scope.row)" style="color: #F56C6C" v-tester>{{$t('commons.delete')}}</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit 010ad7a5f072a5e9d368c756a2473bbd20781433
|
||||
Subproject commit 8cda5c873cd9985c97adb34efacf507167fa4182
|
@ -65,6 +65,7 @@ export default {
|
||||
refresh: 'Refresh',
|
||||
remark: 'Remark',
|
||||
delete: 'Delete',
|
||||
reduction: 'Reduction',
|
||||
not_filled: 'Not filled',
|
||||
please_select: 'Please select',
|
||||
search_by_name: 'Search by name',
|
||||
|
@ -65,6 +65,7 @@ export default {
|
||||
refresh: '刷新',
|
||||
remark: '备注',
|
||||
delete: '删除',
|
||||
reduction: '恢复',
|
||||
not_filled: '未填写',
|
||||
please_select: '请选择',
|
||||
search_by_name: '根据名称搜索',
|
||||
|
@ -65,6 +65,7 @@ export default {
|
||||
refresh: '刷新',
|
||||
remark: '備註',
|
||||
delete: '刪除',
|
||||
reduction: '恢复',
|
||||
not_filled: '未填寫',
|
||||
please_select: '請選擇',
|
||||
search_by_name: '根據名稱搜索',
|
||||
@ -796,88 +797,88 @@ export default {
|
||||
suffixFormatErr: "文件格式不符合要求",
|
||||
swagger_url_import: "使用URL導入",
|
||||
},
|
||||
home_page:{
|
||||
unit_of_measurement:"個",
|
||||
api_count_card:{
|
||||
home_page: {
|
||||
unit_of_measurement: "個",
|
||||
api_count_card: {
|
||||
title: "接口數量統計",
|
||||
},
|
||||
test_case_count_card:{
|
||||
test_case_count_card: {
|
||||
title: "接口用例數量統計",
|
||||
},
|
||||
test_scene_count_card:{
|
||||
test_scene_count_card: {
|
||||
title: "場景用例數量統計",
|
||||
},
|
||||
schedule_task_count_card:{
|
||||
schedule_task_count_card: {
|
||||
title: "定時任務數量統計",
|
||||
},
|
||||
detail_card:{
|
||||
running:"進行中",
|
||||
not_started:"未開始",
|
||||
finished:"已完成",
|
||||
uncoverage:"未覆蓋",
|
||||
coverage:"已覆蓋",
|
||||
unexecute:"未執行",
|
||||
execution_failed:"未通過",
|
||||
execution_pass:"已通過",
|
||||
failed:"失敗",
|
||||
success:"成功",
|
||||
rate:{
|
||||
completion:"完成率",
|
||||
coverage:"覆蓋率",
|
||||
pass:"通過率",
|
||||
success:"成功率",
|
||||
detail_card: {
|
||||
running: "進行中",
|
||||
not_started: "未開始",
|
||||
finished: "已完成",
|
||||
uncoverage: "未覆蓋",
|
||||
coverage: "已覆蓋",
|
||||
unexecute: "未執行",
|
||||
execution_failed: "未通過",
|
||||
execution_pass: "已通過",
|
||||
failed: "失敗",
|
||||
success: "成功",
|
||||
rate: {
|
||||
completion: "完成率",
|
||||
coverage: "覆蓋率",
|
||||
pass: "通過率",
|
||||
success: "成功率",
|
||||
},
|
||||
},
|
||||
api_details_card:{
|
||||
api_details_card: {
|
||||
title: "接口",
|
||||
this_week_add:"本週新增: {0}个",
|
||||
this_week_add: "本週新增: {0}个",
|
||||
},
|
||||
test_case_details_card:{
|
||||
test_case_details_card: {
|
||||
title: "用例",
|
||||
this_week_add:"本週新增: {0}个",
|
||||
this_week_execute:"本週執行: {0}次",
|
||||
executed:"歷史總執行: {0}次",
|
||||
this_week_add_sm:"本週新增:<br/>{0}个",
|
||||
this_week_execute_sm:"本週執行:<br/>{0}次",
|
||||
executed_sm:"歷史總執行:<br/>{0}次",
|
||||
this_week_add: "本週新增: {0}个",
|
||||
this_week_execute: "本週執行: {0}次",
|
||||
executed: "歷史總執行: {0}次",
|
||||
this_week_add_sm: "本週新增:<br/>{0}个",
|
||||
this_week_execute_sm: "本週執行:<br/>{0}次",
|
||||
executed_sm: "歷史總執行:<br/>{0}次",
|
||||
},
|
||||
test_scene_details_card:{
|
||||
test_scene_details_card: {
|
||||
title: "場景",
|
||||
this_week_add:"本週新增: {0}个",
|
||||
this_week_execute:"本週執行: {0}次",
|
||||
executed:"歷史總執行: {0}次",
|
||||
this_week_add_sm:"本週新增:<br/>{0}个",
|
||||
this_week_execute_sm:"本週執行:<br/>{0}次",
|
||||
executed_sm:"歷史總執行:<br/>{0}次",
|
||||
this_week_add: "本週新增: {0}个",
|
||||
this_week_execute: "本週執行: {0}次",
|
||||
executed: "歷史總執行: {0}次",
|
||||
this_week_add_sm: "本週新增:<br/>{0}个",
|
||||
this_week_execute_sm: "本週執行:<br/>{0}次",
|
||||
executed_sm: "歷史總執行:<br/>{0}次",
|
||||
},
|
||||
schedule_task_details_card:{
|
||||
schedule_task_details_card: {
|
||||
title: "定時任務",
|
||||
this_week_add:"本週新增: {0}个",
|
||||
this_week_execute:"本週執行: {0}次",
|
||||
executed:"歷史總執行: {0}次",
|
||||
this_week_add_sm:"本週新增:<br/>{0}个",
|
||||
this_week_execute_sm:"本週執行:<br/>{0}次",
|
||||
executed_sm:"歷史總執行:<br/>{0}次",
|
||||
this_week_add: "本週新增: {0}个",
|
||||
this_week_execute: "本週執行: {0}次",
|
||||
executed: "歷史總執行: {0}次",
|
||||
this_week_add_sm: "本週新增:<br/>{0}个",
|
||||
this_week_execute_sm: "本週執行:<br/>{0}次",
|
||||
executed_sm: "歷史總執行:<br/>{0}次",
|
||||
},
|
||||
failed_case_list:{
|
||||
failed_case_list: {
|
||||
title: "過去7天測試計畫失敗用例TOP 10",
|
||||
table_coloum:{
|
||||
table_coloum: {
|
||||
index: "排名",
|
||||
case_name: "用例名稱",
|
||||
case_type: "用例類型",
|
||||
test_plan: "所屬測試計畫",
|
||||
failure_times: "失敗次數",
|
||||
},
|
||||
table_value:{
|
||||
case_type:{
|
||||
table_value: {
|
||||
case_type: {
|
||||
api: "接口用例",
|
||||
scene: "場景用例",
|
||||
}
|
||||
}
|
||||
},
|
||||
running_task_list:{
|
||||
running_task_list: {
|
||||
title: "運行中的定時任務",
|
||||
table_coloum:{
|
||||
table_coloum: {
|
||||
index: "序號",
|
||||
scenario: "場景名稱",
|
||||
run_rule: "運行規則",
|
||||
@ -886,7 +887,7 @@ export default {
|
||||
create_user: "創建人",
|
||||
update_time: "更新時間",
|
||||
},
|
||||
confirm:{
|
||||
confirm: {
|
||||
close_title: "要關閉這條定時任務嗎?",
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user