Files
sbnews/server/public/admin/assets/index-B9ksDmEd.js
T

2 lines
11 KiB
JavaScript

import{i as ot,a6 as nt,a7 as it,J as dt,K as rt,L as ut,M as pt,I as mt,_ as ct,$ as gt,C as bt,N as _t,E as h}from"./element-plus-BAaIsRfX.js";import{_ as ft}from"./index.vue_vue_type_script_setup_true_lang-Dt1VPZFQ.js";import{E as wt,g as O,b as vt,f as q,F as yt,G as K,H as A}from"./index-Bw5CyuLZ.js";import{u as xt}from"./usePaging-Dtz4iZyr.js";import{d as J,r as m,a0 as G,aj as ht,aq as kt,c as Ct,o as c,U as e,L as a,M as k,a as t,K as g,u as n,R as s,P as F,i as R,S as u}from"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const Vt={class:"flex"},zt={class:"flex justify-end mt-4"},Pt={class:"mt-4"},Dt={class:"flex items-center justify-between pr-8"},Et={class:"flex items-center gap-2"},Lt={class:"flex items-center justify-between pr-8"},Rt={class:"flex items-center gap-2"},Tt=J({name:"scheduledTask"}),ce=J({...Tt,setup($t){const{pager:y,getLists:_}=xt({fetchFun:wt,params:{}}),Q=async i=>{await q.confirm("确定要删除?"),await yt({id:i}),_()},f=m(0),C=m(!1),V=G({name:"",output:"",elapsed:0}),W=async i=>{await q.confirm(`确定手动执行「${i.name}」?`),f.value=i.id;try{const l=await K({id:i.id});l.async?(h.success("任务已提交,后台执行中,可点击「日志」查看进度"),_()):(Object.assign(V,{name:i.name,output:l.output||"执行完成",elapsed:l.elapsed||0}),C.value=!0,_()),x.value&&b.value===i.id&&await D()}catch(l){h.error(l.msg||"执行失败")}finally{f.value=0}},x=m(!1),z=m(!1),P=m(""),N=m([]),b=m(0),X=async i=>{P.value=i.name,b.value=i.id,x.value=!0,await D()},Y=async()=>{await q.confirm(`确定手动执行「${P.value}」?`),f.value=b.value;try{(await K({id:b.value})).async?h.success("任务已提交,后台执行中"):h.success("执行完成"),_(),await D()}catch(i){h.error(i.msg||"执行失败")}finally{f.value=0}},D=async()=>{z.value=!0;try{const i=await A({crontab_id:b.value,page_size:50});N.value=i.lists||[]}finally{z.value=!1}},E=m(!1),T=m(!1),r=G({id:0,name:"",output:"",elapsed:0,status:0,status_text:"",trigger_type_text:"",create_time:""}),Z=i=>{Object.assign(r,i),E.value=!0},tt=async()=>{T.value=!0;try{const L=((await A({crontab_id:b.value,page_size:50})).lists||[]).find(p=>p.id===r.id);L&&Object.assign(r,L)}finally{T.value=!1}};return _(),(i,l)=>{const L=vt,p=ot,S=ht("router-link"),et=it,lt=nt,d=rt,w=ut,B=dt,at=ft,st=mt,v=gt,H=ct,U=bt,$=_t,j=kt("perms"),M=pt;return c(),Ct("div",null,[e(st,{shadow:"never",class:"!border-none"},{default:a(()=>[k((c(),g(S,{to:n(O)("crontab.crontab/add:edit")},{default:a(()=>[e(p,{type:"primary",class:"mb-[16px]"},{icon:a(()=>[e(L,{name:"el-icon-Plus"})]),default:a(()=>[l[4]||(l[4]=s(" 新增 "))]),_:1})]),_:1},8,["to"])),[[j,["crontab.crontab/add","crontab.crontab/add:edit"]]]),e(lt,{class:"mb-4"},{default:a(()=>[e(et,{title:"爬虫定时任务常见问题排查指南",name:"faq"},{default:a(()=>l[5]||(l[5]=[t("div",{class:"text-sm text-gray-600 leading-relaxed space-y-3 px-2"},[t("div",null,[t("div",{class:"font-bold text-red-500 mb-1"},"1. 手动执行后日志为空 / status 一直显示「执行中」"),t("div",{class:"pl-4"},[t("div",null,[t("b",null,"原因:"),s("PHP-FPM 以 "),t("code",null,"www"),s(" 用户运行,该用户对爬虫 "),t("code",null,"logs/"),s(" 目录无写权限,导致 Python 启动即报 "),t("code",null,"PermissionError"),s(" 崩溃。 ")]),t("div",null,[t("b",null,"修复:"),t("code",{class:"bg-gray-100 px-1 rounded"},"chown -R www:www /www/wwwroot/sportera.gs-z.cn/public/dongqiudi-crawler/logs")])])]),t("div",null,[t("div",{class:"font-bold text-orange-500 mb-1"},"2. 自动定时任务不触发(手动可以)"),t("div",{class:"pl-4"},[t("div",null,[t("b",null,"检查:"),s("确认 PHP 定时命令在运行 "),t("code",{class:"bg-gray-100 px-1 rounded"},'ps aux | grep "php think crontab"')]),t("div",null,[t("b",null,"检查:"),s("任务状态必须为「运行中」(status=1),「已停止」不会被调度。")]),t("div",null,[t("b",null,"重启:"),t("code",{class:"bg-gray-100 px-1 rounded"},"nohup php /www/wwwroot/sportera.gs-z.cn/think crontab > /dev/null 2>&1 &")])])]),t("div",null,[t("div",{class:"font-bold text-orange-500 mb-1"},"3. Python 命令找不到 / 模块缺失"),t("div",{class:"pl-4"},[t("div",null,[t("b",null,"检查:"),t("code",{class:"bg-gray-100 px-1 rounded"},"sudo -u www python3 --version"),s(" 和 "),t("code",{class:"bg-gray-100 px-1 rounded"},"sudo -u www pip3 list")]),t("div",null,[t("b",null,"原因:"),s("www 用户的 PATH 环境变量可能缺少 python3 路径。")])])]),t("div",null,[t("div",{class:"font-bold text-orange-500 mb-1"},"4. SFTP 同步后任务仍报错"),t("div",{class:"pl-4"},[t("div",null,[t("b",null,"检查文件是否到位:"),t("code",{class:"bg-gray-100 px-1 rounded"},'grep -c "关键词" /www/wwwroot/sportera.gs-z.cn/public/dongqiudi-crawler/main.py')]),t("div",null,[t("b",null,"注意:"),s("服务器 "),t("code",null,".env"),s(" 文件被 SFTP ignore,不会被覆盖,数据库配置以服务器本地为准。")])])]),t("div",null,[t("div",{class:"font-bold text-blue-500 mb-1"},"5. 快速诊断命令"),t("div",{class:"pl-4"},[t("div",null,[t("code",{class:"bg-gray-100 px-1 rounded"},'sudo -u www bash -c "cd /www/wwwroot/sportera.gs-z.cn/public/dongqiudi-crawler && python3 main.py test 2>&1"')]),t("div",{class:"text-gray-400 text-xs mt-1"},"以 www 用户模拟 PHP 执行环境,可快速定位权限/环境问题。")])])],-1)])),_:1})]),_:1}),k((c(),g(B,{ref:"paneTable",class:"m-t-24",data:n(y).lists,style:{width:"100%"}},{default:a(()=>[e(d,{prop:"name",label:"名称","min-width":"120"}),e(d,{prop:"type_desc",label:"类型","min-width":"100"}),e(d,{prop:"command",label:"命令","min-width":"100"}),e(d,{prop:"params",label:"参数","min-width":"80"}),e(d,{prop:"expression",label:"规则","min-width":"100"}),e(d,{prop:"status",label:"状态","min-width":"100"},{default:a(({row:o})=>[o.status==1?(c(),g(w,{key:0,type:"success"},{default:a(()=>l[6]||(l[6]=[s("运行中")])),_:1})):F("",!0),o.status==2?(c(),g(w,{key:1,type:"info"},{default:a(()=>l[7]||(l[7]=[s("已停止")])),_:1})):F("",!0),o.status==3?(c(),g(w,{key:2,type:"danger"},{default:a(()=>l[8]||(l[8]=[s("错误")])),_:1})):F("",!0)]),_:1}),e(d,{prop:"error",label:"错误原因","min-width":"120","show-overflow-tooltip":""}),e(d,{prop:"last_time",label:"最后执行时间",width:"180"}),e(d,{prop:"time",label:"时长","min-width":"80"}),e(d,{prop:"max_time",label:"最大时长","min-width":"80"}),e(d,{label:"操作",width:"200",fixed:"right"},{default:a(({row:o})=>[t("div",Vt,[e(p,{type:"warning",link:"",loading:n(f)===o.id,onClick:I=>W(o)},{default:a(()=>l[9]||(l[9]=[s(" 执行 ")])),_:2},1032,["loading","onClick"]),e(p,{type:"info",link:"",onClick:I=>X(o)},{default:a(()=>l[10]||(l[10]=[s(" 日志 ")])),_:2},1032,["onClick"]),e(p,{type:"primary",link:""},{default:a(()=>[k((c(),g(S,{to:{path:n(O)("crontab.crontab/add:edit"),query:{id:o.id}}},{default:a(()=>l[11]||(l[11]=[s(" 编辑 ")])),_:2},1032,["to"])),[[j,["crontab.crontab/edit","crontab.crontab/add:edit"]]])]),_:2},1024),k((c(),g(p,{type:"danger",link:"",onClick:I=>Q(o.id)},{default:a(()=>l[12]||(l[12]=[s(" 删除 ")])),_:2},1032,["onClick"])),[[j,["crontab.crontab/delete"]]])])]),_:1})]),_:1},8,["data"])),[[M,n(y).loading]]),t("div",zt,[e(at,{modelValue:n(y),"onUpdate:modelValue":l[0]||(l[0]=o=>R(y)?y.value=o:null),onChange:n(_)},null,8,["modelValue","onChange"])])]),_:1}),e($,{modelValue:n(C),"onUpdate:modelValue":l[1]||(l[1]=o=>R(C)?C.value=o:null),title:"执行结果",width:"600px"},{default:a(()=>[e(H,{column:2,border:""},{default:a(()=>[e(v,{label:"任务"},{default:a(()=>[s(u(n(V).name),1)]),_:1}),e(v,{label:"耗时"},{default:a(()=>[s(u(n(V).elapsed)+"s",1)]),_:1})]),_:1}),t("div",Pt,[l[13]||(l[13]=t("div",{class:"text-sm text-gray-500 mb-2"},"输出日志:",-1)),e(U,{type:"textarea","model-value":n(V).output,autosize:{minRows:5,maxRows:20},readonly:""},null,8,["model-value"])])]),_:1},8,["modelValue"]),e($,{modelValue:n(x),"onUpdate:modelValue":l[2]||(l[2]=o=>R(x)?x.value=o:null),title:"执行日志 - "+n(P),width:"900px"},{header:a(()=>[t("div",Dt,[t("span",null,"执行日志 - "+u(n(P)),1),t("div",Et,[e(p,{type:"warning",size:"small",loading:n(f)===n(b),onClick:Y},{default:a(()=>l[14]||(l[14]=[s("执行")])),_:1},8,["loading"]),e(p,{type:"primary",size:"small",loading:n(z),onClick:D},{default:a(()=>l[15]||(l[15]=[s("刷新")])),_:1},8,["loading"])])])]),default:a(()=>[k((c(),g(B,{data:n(N),size:"small"},{default:a(()=>[e(d,{prop:"id",label:"ID",width:"60"}),e(d,{prop:"trigger_type_text",label:"触发",width:"60"},{default:a(({row:o})=>[e(w,{type:o.trigger_type===2?"warning":"info",size:"small"},{default:a(()=>[s(u(o.trigger_type_text),1)]),_:2},1032,["type"])]),_:1}),e(d,{prop:"status_text",label:"状态",width:"70"},{default:a(({row:o})=>[e(w,{type:o.status===1?"success":o.status===2?"danger":"warning",size:"small"},{default:a(()=>[s(u(o.status_text),1)]),_:2},1032,["type"])]),_:1}),e(d,{prop:"elapsed",label:"耗时(s)",width:"80"}),e(d,{label:"输出","min-width":"250"},{default:a(({row:o})=>[e(p,{type:"primary",link:"",size:"small",onClick:I=>Z(o)},{default:a(()=>[s(u(o.output?o.output.length>50?o.output.substring(0,50)+"...":o.output:"-"),1)]),_:2},1032,["onClick"])]),_:1}),e(d,{prop:"create_time",label:"执行时间",width:"160"})]),_:1},8,["data"])),[[M,n(z)]])]),_:1},8,["modelValue","title"]),e($,{modelValue:n(E),"onUpdate:modelValue":l[3]||(l[3]=o=>R(E)?E.value=o:null),title:"日志详情",width:"700px"},{header:a(()=>[t("div",Lt,[t("span",null,"日志详情 #"+u(n(r).id),1),t("div",Rt,[e(w,{type:n(r).status===1?"success":n(r).status===2?"danger":"warning",size:"small"},{default:a(()=>[s(u(n(r).status_text),1)]),_:1},8,["type"]),e(p,{type:"primary",size:"small",loading:n(T),onClick:tt},{default:a(()=>l[16]||(l[16]=[s("刷新")])),_:1},8,["loading"])])])]),default:a(()=>[e(H,{column:2,border:"",size:"small",class:"mb-4"},{default:a(()=>[e(v,{label:"任务"},{default:a(()=>[s(u(n(r).name),1)]),_:1}),e(v,{label:"耗时"},{default:a(()=>[s(u(n(r).elapsed)+"s",1)]),_:1}),e(v,{label:"触发方式"},{default:a(()=>[s(u(n(r).trigger_type_text),1)]),_:1}),e(v,{label:"执行时间"},{default:a(()=>[s(u(n(r).create_time),1)]),_:1})]),_:1}),l[17]||(l[17]=t("div",{class:"text-sm text-gray-500 mb-2"},"输出日志:",-1)),e(U,{type:"textarea","model-value":n(r).output,autosize:{minRows:8,maxRows:25},readonly:"",class:"log-output"},null,8,["model-value"])]),_:1},8,["modelValue"])])}}});export{ce as default};