|
|
import{C as e,D as t,E as n,G as r,S as i,T as a,X as ee,Y as o,at as s,b as c,f as te,ht as l,m as u,ot as d,q as f,rt as p,tn as m,x as h,y as g}from"./vue.runtime.esm-bundler-DUiYyeqQ.js";import{l as _,o as v,s as y}from"./index-DvFTDJVy.js";import{n as ne,t as re}from"./usePageLoad-BIChu00p.js";import{a as b,d as x,f as S,h as C,m as w,p as T}from"./assets-BuFfvBPA.js";import{a as E}from"./dict-2EfXFzuF.js";var ie={class:`list-page`},ae={class:`page-header`},oe={key:0,class:`crawl-resolve-hint`},se={key:1,class:`crawl-resolve-hint`},ce={key:0},le={key:1},ue={key:2},de={key:1,class:`result-actions`},fe={class:`brief-card-head`},pe={class:`brief-pager`},me={key:0,class:`brief-dialog-meta`},he={key:1,class:`brief-markdown`},ge={key:2,class:`brief-loading`},_e=[`href`],D=y(t({__name:`index`,setup(t){let y=v(),D=l(!1),O=l(!1),k=l(null),A=l(null),j=l(null),M=null,N=l(!1),P=l(`paper`),F=l([]),I=l([]),L=l([]),R=l(!1),z=l([]),B=l(!1),V=l(!1),H=l([]),U=l({current_page:1,per_page:10,total:0}),W=l(1),G=l(!1),K=l(null),q=l({target_type:`paper`,request_url:`https://arxiv.org/`,params:{}}),J={paper:[{key:`keyword`,type:`textarea`,label:`搜索关键词(选填)`,required:!1,placeholder:`多个关键词用逗号或换行分隔,如:graph neural, AI`},{key:`max_results`,type:`number`,label:`条数上限`,default:20,min:1,max:50}],industry_news:[{key:`keyword`,type:`textarea`,label:`搜索关键词(选填)`,required:!1,placeholder:`多个关键词用空格、逗号或换行分隔,如:融资 科创板 AI`},{key:`max_pages`,type:`number`,label:`抓取页数`,default:5,min:1,max:50},{key:`max_results`,type:`number`,label:`条数上限`,default:30,min:1,max:50}]},Y=l([]),ve=g(()=>q.value.target_type===`teacher`?L.value:P.value===`teacher_lead`?I.value:F.value),ye=g(()=>q.value.target_type===`teacher`?Y.value.filter(e=>e.key!==`keyword`&&e.key!==`max_results`&&e.key!==`max_pages`):[]);function be(e){return e===`paper`||e===`industry_news`?J[e]:[]}function X(e,t=!0){let n=be(e);if(n.length===0)return;Y.value=n;let r=t?{...q.value.params}:{};if(De(n),t)for(let e of n)r[e.key]!==void 0&&(q.value.params[e.key]=r[e.key])}function xe(){q.value.target_type===`teacher`&&(q.value.params.keyword===void 0&&(q.value.params.keyword=``),q.value.params.max_results===void 0&&(q.value.params.max_results=200),q.value.params.max_pages===void 0&&(q.value.params.max_pages=5))}function Se(){q.value.target_type===`industry_news`&&(q.value.params.keyword===void 0&&(q.value.params.keyword=``),q.value.params.max_pages===void 0&&(q.value.params.max_pages=5),q.value.params.max_results===void 0&&(q.value.params.max_results=30))}function Ce(e){(e===`paper`||e===`industry_news`)&&(X(e,!0),e===`industry_news`&&Se())}function we(e){if(!e)return`—`;let t=e.match(/^(\d{4}-\d{2}-\d{2})/);return t?t[1]:e}function Te(e){return!!(e.lead_author_university?.trim()||e.school_name?.trim())}function Ee(e){return[...e].sort((e,t)=>{let n=Te(e);return n===Te(t)?(e.lead_author_name||``).localeCompare(t.lead_author_name||``,`zh-CN`):n?-1:1})}function De(e){let t={};for(let n of e)n.type===`checkbox`?t[n.key]=Array.isArray(n.default)?[...n.default]:[]:n.type===`number`?t[n.key]=n.default??20:t[n.key]=n.default??``;q.value.params=t}function Oe(e){return e===`paper`?`https://arxiv.org/`:e===`teacher`?`https://`:`https://www.pedaily.cn/all/`}function ke(e){let t=e.trim();return t&&!/^https?:\/\//i.test(t)?`https://${t}`:t}function Ae(){k.value=null,N.value=!1,F.value=[],I.value=[],L.value=[]}function je(){Ae(),P.value=`paper`,D.value=!1,q.value={target_type:`paper`,request_url:Oe(`paper`),params:{}},A.value=null,j.value=null,Y.value=[],Ce(`paper`),Z()}async function Z(){if(M)return M;M=(async()=>{if(!q.value.request_url){A.value=null,j.value=null;return}let e=ke(q.value.request_url);e!==q.value.request_url&&(q.value.request_url=e);let t=q.value.target_type;(t===`paper`||t===`industry_news`)&&X(t,!0),O.value=!0;try{A.value=await w({request_url:q.value.request_url,target_type:t}),j.value=q.value.request_url,t===`teacher`?(Y.value=A.value.param_schema?.fields??[],De(Y.value),xe()):X(t,!0)}catch{A.value=null,j.value=null,t===`teacher`?Y.value=[]:X(t,!0)}finally{O.value=!1}})();try{await M}finally{M=null}}async function Me(){if(!q.value.request_url.trim())return _.warning(`请填写目标地址`),!1;let e=ke(q.value.request_url);return e!==q.value.request_url&&(q.value.request_url=e),(!A.value||j.value!==q.value.request_url)&&await Z(),!!A.value}async function Ne(){await Z()}p(()=>q.value.target_type,e=>{Ae(),A.value=null,j.value=null,Y.value=[],q.value.request_url=Oe(e),e===`teacher`?xe():(e===`paper`||e===`industry_news`)&&X(e,!1),Z()});async function Pe(){if(!await Me()){_.warning(`无法识别该地址,请检查入库类型与 URL 是否可访问(需为 http/https 列表或详情页)`);return}D.value=!0;try{k.value=await C({target_type:q.value.target_type,request_url:q.value.request_url,params:q.value.params}),_.success(k.value.result_summary||`抓取完成,已入库 ${k.value.items_imported??0} 条`)}finally{D.value=!1}}async function Fe(){if(!(z.value.length>0))try{z.value=(await E(`news_category`)).items.map(e=>({id:e.id,label:e.label}))}catch{_.warning(`资讯分类加载失败`)}}async function Ie(){if(k.value?.id){R.value=!0,N.value=!0,P.value=q.value.target_type===`teacher`?`teacher`:`paper`;try{q.value.target_type===`industry_news`&&await Fe();let e=k.value.id;if(q.value.target_type===`paper`){let[t,n]=await Promise.all([b(e,{item_kind:`paper`}),b(e,{item_kind:`teacher_lead`})]);F.value=t,I.value=Ee(n)}else q.value.target_type===`teacher`?L.value=await b(e,{item_kind:`teacher`}):F.value=await b(e)}finally{R.value=!1}}}function Le(){k.value?.id&&(q.value.target_type===`paper`?y.push({path:`/papers`,query:{crawl_job_id:String(k.value.id)}}):q.value.target_type===`teacher`?y.push({path:`/teachers`}):y.push({path:`/news`,query:{crawl_job_id:String(k.value.id)}}))}let Re=()=>k.value?.status===`completed`&&(k.value.items_fetched??0)>0;function ze(e,t){return!e||!t?`—`:`${e} 至 ${t}`}function Be(e){if(!e)return`—`;let t=new Date(e);if(Number.isNaN(t.getTime()))return`—`;let n=e=>String(e).padStart(2,`0`);return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}`}async function Q(){B.value=!0;try{let e=await S({page:W.value,page_size:U.value.per_page});H.value=e.items,U.value=e.meta}catch{H.value=[]}finally{B.value=!1}}async function Ve(){V.value=!0;try{let e=await T();_.success(`周报已生成`),W.value=1,await Q(),await $(e.id)}catch(e){let t=e instanceof Error?e.message:`周报生成失败`;_.error(t)}finally{V.value=!1}}async function $(e){G.value=!0,K.value=null;try{K.value=await x(e)}catch{_.error(`加载周报失败`),G.value=!1}}async function He(){if(K.value?.markdown)try{await navigator.clipboard.writeText(K.value.markdown),_.success(`已复制 Markdown`)}catch{_.error(`复制失败`)}}function Ue(){if(!K.value?.markdown)return;let e=new Blob([K.value.markdown],{type:`text/markdown;charset=utf-8`}),t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`AI科技成果简报_${K.value.week_start}_${K.value.week_end}.md`,n.click(),URL.revokeObjectURL(t)}return re(async()=>{await je(),await Q()}),(t,l)=>{let p=o(`el-radio`),g=o(`el-radio-group`),_=o(`el-form-item`),v=o(`el-input`),y=o(`el-input-number`),re=o(`el-checkbox`),b=o(`el-checkbox-group`),x=o(`el-button`),S=o(`el-form`),C=o(`el-alert`),w=o(`el-card`),T=o(`el-table-column`),E=o(`el-table`),j=o(`el-pagination`),M=o(`el-dialog`),L=o(`el-tab-pane`),z=o(`el-tabs`),J=o(`el-tag`),Y=ee(`loading`);return r(),e(`div`,ie,[c(`div`,ae,[n(ne)]),n(w,{shadow:`never`,class:`admin-list-card`},{default:s(()=>[n(S,{"label-position":`top`,class:`crawler-form`,onSubmit:te(Pe,[`prevent`])},{default:s(()=>[n(_,{label:`入库类型`,required:``},{default:s(()=>[n(g,{modelValue:q.value.target_type,"onUpdate:modelValue":l[0]||=e=>q.value.target_type=e},{default:s(()=>[n(p,{label:`paper`},{default:s(()=>[...l[15]||=[a(`论文 → 论文库`,-1)]]),_:1}),n(p,{label:`industry_news`},{default:s(()=>[...l[16]||=[a(`行业资讯 → 资讯管理`,-1)]]),_:1}),n(p,{label:`teacher`},{default:s(()=>[...l[17]||=[a(`老师库 → 老师库`,-1)]]),_:1})]),_:1},8,[`modelValue`])]),_:1}),n(_,{label:`目标地址`,required:``},{default:s(()=>[n(v,{modelValue:q.value.request_url,"onUpdate:modelValue":l[1]||=e=>q.value.request_url=e,type:`url`,placeholder:`https:// 资讯/论文列表页或单篇详情页`,onBlur:Ne},null,8,[`modelValue`]),O.value?(r(),e(`p`,oe,`正在识别采集源…`)):A.value?.source_name?(r(),e(`p`,se,` 已识别采集源:`+m(A.value.source_name),1)):i(``,!0)]),_:1}),q.value.target_type===`paper`||q.value.target_type===`industry_news`?(r(),e(u,{key:0},[n(_,{label:`搜索关键词(选填)`},{default:s(()=>[n(v,{modelValue:q.value.params.keyword,"onUpdate:modelValue":l[2]||=e=>q.value.params.keyword=e,type:`textarea`,rows:2,placeholder:q.value.target_type===`paper`?`多个关键词用逗号或换行分隔,如:graph neural, AI`:`多个关键词用空格、逗号或换行分隔,如:融资 科创板 AI`},null,8,[`modelValue`,`placeholder`])]),_:1}),q.value.target_type===`industry_news`?(r(),h(_,{key:0,label:`抓取页数`},{default:s(()=>[n(y,{modelValue:q.value.params.max_pages,"onUpdate:modelValue":l[3]||=e=>q.value.params.max_pages=e,min:1,max:50},null,8,[`modelValue`])]),_:1})):i(``,!0),n(_,{label:`条数上限`},{default:s(()=>[n(y,{modelValue:q.value.params.max_results,"onUpdate:modelValue":l[4]||=e=>q.value.params.max_results=e,min:1,max:50},null,8,[`modelValue`])]),_:1})],64)):i(``,!0),q.value.target_type===`teacher`?(r(),e(u,{key:1},[n(_,{label:`搜索关键词(选填)`},{default:s(()=>[n(v,{modelValue:q.value.params.keyword,"onUpdate:modelValue":l[5]||=e=>q.value.params.keyword=e,type:`textarea`,rows:2,placeholder:`多个关键词用空格、逗号或换行分隔`},null,8,[`modelValue`])]),_:1}),n(_,{label:`抓取页数`},{default:s(()=>[n(y,{modelValue:q.value.params.max_pages,"onUpdate:modelValue":l[6]||=e=>q.value.params.max_pages=e,min:1,max:50},null,8,[`modelValue`])]),_:1}),n(_,{label:`条数上限`},{default:s(()=>[n(y,{modelValue:q.value.params.max_results,"onUpdate:modelValue":l[7]||=e=>q.value.params.max_results=e,min:1,max:500},null,8,[`modelValue`])]),_:1})],64)):i(``,!0),(r(!0),e(u,null,f(ye.value,t=>(r(),h(_,{key:t.key,label:t.label,required:t.required},{default:s(()=>[t.type===`checkbox`?(r(),h(b,{key:0,modelValue:q.value.params[t.key],"onUpdate:modelValue":e=>q.value.params[t.key]=e},{default:s(()=>[(r(!0),e(u,null,f(t.options,e=>(r(),h(re,{key:e,value:e},{default:s(()=>[a(m(e),1)]),_:2},1032,[`value`]))),128))]),_:2},1032,[`modelValue`,`onUpdate:modelValue`])):t.type===`number`?(r(),h(y,{key:1,modelValue:q.value.params[t.key],"onUpdate:modelValue":e=>q.value.params[t.key]=e,min:t.min??1,max:t.max??50},null,8,[`modelValue`,`onUpdate:modelValue`,`min`,`max`])):t.type===`textarea`?(r(),h(v,{key:2,modelValue:q.value.params[t.key],"onUpdate:modelValue":e=>q.value.params[t.key]=e,type:`textarea`,rows:3,placeholder:t.placeholder},null,8,[`modelValue`,`onUpdate:modelValue`,`placeholder`])):(r(),h(v,{key:3,modelValue:q.value.params[t.key],"onUpdate:modelValue":e=>q.value.params[t.key]=e,placeholder:t.placeholder},null,8,[`modelValue`,`onUpdate:modelValue`,`placeholder`]))]),_:2},1032,[`label`,`required`]))),128)),n(x,{type:`primary`,"native-type":`submit`,loading:D.value},{default:s(()=>[...l[18]||=[a(` 手动抓取 `,-1)]]),_:1},8,[`loading`])]),_:1}),k.value?(r(),h(C,{key:0,class:`result-alert`,type:`success`,closable:!1,"show-icon":``},{default:s(()=>[c(`p`,null,`地址:`+m(k.value.request_url||k.value.platform_url),1),k.value.source_name?(r(),e(`p`,ce,`采集源:`+m(k.value.source_name),1)):i(``,!0),c(`p`,null,`状态:`+m(k.value.status===`completed`?`已完成`:k.value.status),1),k.value.result_summary?(r(),e(`p`,le,m(k.value.result_summary),1)):i(``,!0),k.value.items_imported==null?i(``,!0):(r(),e(`p`,ue,`已入库 `+m(k.value.items_imported)+` 条`,1))]),_:1})):i(``,!0),k.value?(r(),e(`div`,de,[Re()?(r(),h(x,{key:0,type:`primary`,onClick:Ie},{default:s(()=>[a(` 查看抓取内容(`+m(k.value.items_fetched)+` 条) `,1)]),_:1})):i(``,!0),n(x,{onClick:Le},{default:s(()=>[...l[19]||=[a(`在库中查看已入库`,-1)]]),_:1})])):i(``,!0)]),_:1}),n(w,{shadow:`never`,class:`admin-list-card brief-card`},{default:s(()=>[c(`div`,fe,[l[21]||=c(`div`,null,[c(`h3`,{class:`brief-card-title`},`AI 科技成果周报`),c(`p`,{class:`brief-card-desc`},` 基于爬虫入库的论文与资讯,按周自动生成 Markdown 简报(默认统计上一自然周周一至周日)。 `)],-1),n(x,{type:`primary`,loading:V.value,onClick:Ve},{default:s(()=>[...l[20]||=[a(` 生成上周简报 `,-1)]]),_:1},8,[`loading`])]),d((r(),h(E,{data:H.value,"row-key":`id`,size:`small`},{default:s(()=>[n(T,{prop:`title`,label:`简报标题`,"min-width":`260`,"show-overflow-tooltip":``}),n(T,{label:`统计周期`,width:`200`},{default:s(({row:e})=>[a(m(ze(e.week_start,e.week_end)),1)]),_:1}),n(T,{label:`论文`,width:`70`,align:`center`},{default:s(({row:e})=>[a(m(e.stats?.papers_count??0),1)]),_:1}),n(T,{label:`资讯`,width:`70`,align:`center`},{default:s(({row:e})=>[a(m(e.stats?.news_count??0),1)]),_:1}),n(T,{label:`生成时间`,width:`160`},{default:s(({row:e})=>[a(m(Be(e.generated_at)),1)]),_:1}),n(T,{label:`操作`,width:`120`,fixed:`right`},{default:s(({row:e})=>[n(x,{type:`primary`,link:``,onClick:t=>$(e.id)},{default:s(()=>[...l[22]||=[a(`查看`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1},8,[`data`])),[[Y,B.value]]),c(`div`,pe,[n(j,{"current-page":W.value,"onUpdate:currentPage":l[8]||=e=>W.value=e,layout:`total, prev, pager, next`,total:U.value.total,"page-size":U.value.per_page,onCurrentChange:Q},null,8,[`current-page`,`total`,`page-size`])])]),_:1}),n(M,{modelValue:G.value,"onUpdate:modelValue":l[10]||=e=>G.value=e,title:K.value?.title||`AI 科技成果周报`,width:`920px`,top:`4vh`,"destroy-on-close":``,class:`brief-dialog`},{footer:s(()=>[n(x,{onClick:l[9]||=e=>G.value=!1},{default:s(()=>[...l[23]||=[a(`关闭`,-1)]]),_:1}),n(x,{disabled:!K.value,onClick:He},{default:s(()=>[...l[24]||=[a(`复制 Markdown`,-1)]]),_:1},8,[`disabled`]),n(x,{type:`primary`,disabled:!K.value,onClick:Ue},{default:s(()=>[...l[25]||=[a(`下载 .md`,-1)]]),_:1},8,[`disabled`])]),default:s(()=>[K.value?(r(),e(`div`,me,[c(`span`,null,`统计周期:`+m(ze(K.value.week_start,K.value.week_end)),1),c(`span`,null,`论文 `+m(K.value.stats?.papers_count??0)+` 篇`,1),c(`span`,null,`资讯 `+m(K.value.stats?.news_count??0)+` 条`,1)])):i(``,!0),K.value?(r(),e(`pre`,he,m(K.value.markdown),1)):d((r(),e(`div`,ge,null,512)),[[Y,!0]])]),_:1},8,[`modelValue`,`title`]),n(M,{modelValue:N.value,"onUpdate:modelValue":l[14]||=e=>N.value=e,title:`本次抓取结果`,width:`960px`,"destroy-on-close":``},{footer:s(()=>[n(x,{type:`primary`,onClick:l[13]||=e=>N.value=!1},{default:s(()=>[...l[29]||=[a(`关闭`,-1)]]),_:1})]),default:s(()=>[q.value.target_type===`paper`?(r(),h(z,{key:0,modelValue:P.value,"onUpdate:modelValue":l[11]||=e=>P.value=e,class:`preview-tabs`},{default:s(()=>[n(L,{label:`论文(${F.value.length})`,name:`paper`},null,8,[`label`]),n(L,{label:`入库老师(${I.value.length})`,name:`teacher_lead`},null,8,[`label`])]),_:1},8,[`modelValue`])):i(``,!0),d((r(),h(E,{data:ve.value,"row-key":`id`,size:`small`},{default:s(()=>[q.value.target_type===`paper`&&P.value===`paper`?(r(),e(u,{key:0},[n(T,{prop:`title`,label:`论文标题`,"min-width":`200`,"show-overflow-tooltip":``}),n(T,{prop:`authors`,label:`作者`,width:`120`,"show-overflow-tooltip":``}),n(T,{label:`发表日期`,width:`110`},{default:s(({row:e})=>[a(m(we(e.published_at)),1)]),_:1}),n(T,{prop:`school_name`,label:`学校`,width:`120`,"show-overflow-tooltip":``})],64)):q.value.target_type===`paper`&&P.value===`teacher_lead`?(r(),e(u,{key:1},[n(T,{prop:`lead_author_name`,label:`姓名`,width:`100`}),n(T,{prop:`lead_author_email`,label:`邮箱`,width:`160`,"show-overflow-tooltip":``}),n(T,{prop:`lead_author_university`,label:`学校`,width:`160`,"show-overflow-tooltip":``},{default:s(({row:e})=>[a(m(e.lead_author_university||e.school_name||`—`),1)]),_:1}),n(T,{prop:`paper_title`,label:`来源论文`,"min-width":`200`,"show-overflow-tooltip":``})],64)):q.value.target_type===`teacher`?(r(),e(u,{key:2},[n(T,{prop:`title`,label:`姓名`,width:`96`}),n(T,{label:`职称`,width:`88`,"show-overflow-tooltip":``},{default:s(({row:e})=>[a(m(e.lead_author_academic_title||`—`),1)]),_:1}),n(T,{prop:`lead_author_university`,label:`高校`,width:`140`,"show-overflow-tooltip":``},{default:s(({row:e})=>[a(m(e.lead_author_university||e.school_name||`—`),1)]),_:1}),n(T,{prop:`lead_author_email`,label:`邮箱`,width:`150`,"show-overflow-tooltip":``}),n(T,{prop:`summary`,label:`简介`,"min-width":`160`,"show-overflow-tooltip":``})],64)):(r(),e(u,{key:3},[n(T,{prop:`title`,label:`标题`,"min-width":`200`,"show-overflow-tooltip":``}),n(T,{prop:`source_name`,label:`采集源`,width:`120`,"show-overflow-tooltip":``}),n(T,{prop:`category_label`,label:`匹配分类`,width:`120`,"show-overflow-tooltip":``},{default:s(({row:e})=>[a(m(e.category_label||`—`),1)]),_:1}),n(T,{label:`发布时间`,width:`110`},{default:s(({row:e})=>[a(m(we(e.published_at)),1)]),_:1})],64)),n(T,{label:`状态`,width:`88`},{default:s(({row:e})=>[e.is_duplicate?(r(),h(J,{key:0,type:`info`,size:`small`},{default:s(()=>[...l[26]||=[a(`已存在`,-1)]]),_:1})):e.status===`imported`?(r(),h(J,{key:1,type:`success`,size:`small`},{default:s(()=>[...l[27]||=[a(`已入库`,-1)]]),_:1})):(r(),h(J,{key:2,type:`warning`,size:`small`},{default:s(()=>[...l[28]||=[a(`待入库`,-1)]]),_:1}))]),_:1}),n(T,{label:`链接`,width:`64`},{default:s(({row:t})=>[t.url?(r(),e(`a`,{key:0,href:t.url,target:`_blank`,rel:`noopener`,onClick:l[12]||=te(()=>{},[`stop`])},`查看`,8,_e)):i(``,!0)]),_:1})]),_:1},8,[`data`])),[[Y,R.value]])]),_:1},8,[`modelValue`])])}}}),[[`__scopeId`,`data-v-666bbe0f`]]);export{D as default}; |