|
|
import{n as e}from"./axios-CiYFffbI.js";import{I as t,N as n,V as r,Y as i,_ as a,d as o,f as s,i as c,it as l,kt as u,l as d,nt as f,p,u as m,ut as h,v as g,y as _,z as v}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{n as y}from"./http-LCi9aT1G.js";import{c as b}from"./index-DtDFIu4i.js";import{t as x}from"./RichEditorField-DVnrTI6h.js";import{t as S}from"./listTableRowIndex-ConJ8Gia.js";import{t as C}from"./mediaUrl-CPV6u7br.js";var ee=[`src`,`onClick`],te={key:1,style:{color:`#86909c`}},ne={style:{"max-width":`90vw`,"max-height":`80vh`}},re=[`src`],ie=[`src`],ae={class:`admin-modal-form__full`},oe={class:`study-tour-tags-field`},w={class:`study-tour-tags-input-row`},se={class:`study-tour-tags-list`},ce={key:0,style:{color:`#86909c`}},T={style:{width:`100%`,display:`flex`,"flex-direction":`column`,"align-items":`stretch`}},le={style:{width:`100%`,"margin-bottom":`8px`}},ue={style:{width:`100%`,border:`1px solid #e5e6eb`,"border-radius":`6px`,padding:`8px`,"max-height":`220px`,overflow:`auto`}},de={key:0,style:{display:`flex`,"flex-direction":`column`,"align-items":`flex-start`,gap:`8px`}},fe=[`src`],pe=900,E=b(_({__name:`StudyTourList`,setup(_){let b=l(!1),E=l(!1),D=l(!1),O=l(!0),k=l(null),A=l([]),j=l([]),M=l(``),N=l(void 0),P=l(void 0),F=f({current:1,pageSize:10}),me={maxHeight:`70vh`,overflow:`auto`},I=l(0),L=l(!1),R=l(`image`),z=l(``),B=f({name:``,tags:[],venue_ids:[],cover_image:``,intro_html:``,sort:0,is_on_shelf:!0}),V=l(``),H=d(()=>{let e=new Map(j.value.map(e=>[e.id,e]));return B.venue_ids.map(t=>e.get(t)).filter(Boolean)});function U(e,t){let n=String(e||``).trim();if(n)return C(n);let r=String(t||``).trim();return r?C(r):``}async function W(e){let t=new FormData;t.append(`file`,e);let{data:n}=await y.post(`/upload`,t);return U(n?.url,n?.path)}async function G(e){return W(e)}function K(){I.value+=1}function q(e){let t=new Set,n=[e];for(;n.length;){let e=n.shift();if(!(!e||t.has(e))){if(t.add(e),e instanceof File)return e;if(e?.target?.files?.[0]instanceof File)return e.target.files[0];if(Array.isArray(e)){for(let t of e)n.push(t);continue}if(typeof e==`object`){for(let t of[`file`,`raw`,`originFile`,`originFileObj`,`fileItem`,`item`,`data`])e[t]&&n.push(e[t]);for(let t of Object.values(e))t&&(typeof t==`object`||Array.isArray(t))&&n.push(t)}}}return null}function J(){let t=this.quill,n=document.createElement(`input`);n.type=`file`,n.accept=`image/*`,n.onchange=async()=>{let r=n.files?.[0];if(r)try{let n=await G(r),i=t.getSelection(!0)?.index??Math.max(0,t.getLength()-1);t.insertEmbed(i,`image`,n,`user`),t.setSelection(i+1,0),e.success(`图片已上传并插入`)}catch(t){e.error(t?.response?.data?.message??t?.message??`图片上传失败`)}},n.click()}function Y(){let t=this.quill,n=document.createElement(`input`);n.type=`file`,n.accept=`video/*`,n.onchange=async()=>{let r=n.files?.[0];if(r)try{let n=await G(r),i=t.getSelection(!0)?.index??Math.max(0,t.getLength()-1);t.insertEmbed(i,`video`,n,`user`),t.setSelection(i+1,0),e.success(`视频已上传并插入`)}catch(t){e.error(t?.response?.data?.message??t?.message??`视频上传失败`)}},n.click()}let he={modules:{toolbar:{container:[[{header:[1,2,3,!1]}],[`bold`,`italic`,`underline`,`strike`],[{color:[]},{background:[]}],[{list:`ordered`},{list:`bullet`}],[{align:[]}],[`link`,`image`,`video`],[`clean`]],handlers:{image:J,video:Y}}},placeholder:`请输入线路简介`};function ge(e){return(e||[]).length?(e||[]).join(`、`):`-`}function _e(e,t){t&&(R.value=e,z.value=C(t),L.value=!0)}async function X(t){try{let n=q(t);if(!n)return e.warning(`未识别到上传文件`),!1;B.cover_image=await W(n),e.success(`封面上传成功`)}catch(t){e.error(t?.response?.data?.message??`封面上传失败`)}return!1}function ve(...e){X(e)}function ye(){B.cover_image=``}function Z(t){let n=t?.target,r=(n?.getAttribute?.(`src`)||n?.src||``).trim();!r||r===`about:blank`||e.error(`图片地址无法访问,请检查后端 storage 访问配置`)}function be(){M.value=``,N.value=void 0,P.value=void 0,F.current=1,Q()}async function Q(t=!1){b.value=!0;try{let e={},n=M.value.trim();n&&(e.keyword=n),N.value!=null&&N.value>0&&(e.venue_id=N.value),(P.value===`0`||P.value===`1`)&&(e.is_on_shelf=P.value);let[r,i]=await Promise.all([y.get(`/study-tours`,{params:e}),y.get(`/venues`)]);A.value=r.data,j.value=i.data,t||(F.current=1)}catch(t){e.error(t?.response?.data?.message??`加载研学线路失败`)}finally{b.value=!1}}function xe(e){F.current=e}async function Se(t){try{await y.put(`/study-tours/${t.id}`,{is_on_shelf:!t.is_on_shelf}),e.success(`状态已切换`),await Q(!0)}catch(t){e.error(t?.response?.data?.message??`操作失败`)}}function Ce(){O.value=!0,k.value=null,B.name=``,B.tags=[],B.venue_ids=[],B.cover_image=``,B.intro_html=``,B.sort=0,B.is_on_shelf=!0,K(),D.value=!0}function we(e){O.value=!1,k.value=e.id,B.name=e.name,B.tags=Array.isArray(e.tags)?[...e.tags]:[],B.venue_ids=Array.isArray(e.venue_ids)?[...e.venue_ids]:[],B.cover_image=e.cover_image??``,B.intro_html=e.intro_html||``,B.sort=e.sort??0,B.is_on_shelf=e.is_on_shelf!==!1,K(),D.value=!0}function Te(e){let t=new Set(e),n=B.venue_ids.filter(e=>t.has(e)),r=new Set(n);for(let t of e)r.has(t)||n.push(t);B.venue_ids=n}function Ee(e){if(e<=0)return;let t=[...B.venue_ids],n=t[e-1];t[e-1]=t[e],t[e]=n,B.venue_ids=t}function De(e){if(e>=B.venue_ids.length-1)return;let t=[...B.venue_ids],n=t[e+1];t[e+1]=t[e],t[e]=n,B.venue_ids=t}function Oe(e){B.venue_ids=B.venue_ids.filter(t=>t!==e)}function ke(){let t=V.value.trim();if(!t){e.warning(`请输入标签内容`);return}if(B.tags.includes(t)){e.warning(`标签已存在`);return}B.tags=[...B.tags,t],V.value=``}function Ae(e){let t=[...B.tags];t.splice(e,1),B.tags=t}async function je(){if(!B.name.trim())return e.warning(`请填写线路名称`),!1;if(!B.venue_ids.length)return e.warning(`请至少选择一个场馆`),!1;E.value=!0;try{let t={name:B.name.trim(),tags:B.tags.map(e=>e.trim()).filter(Boolean),venue_ids:[...B.venue_ids],cover_image:B.cover_image||``,intro_html:B.intro_html||``,sort:B.sort??0,is_on_shelf:B.is_on_shelf};return O.value?(await y.post(`/study-tours`,t),e.success(`新增线路成功`)):k.value&&(await y.put(`/study-tours/${k.value}`,t),e.success(`更新线路成功`)),D.value=!1,await Q(),!0}catch(t){return e.error(t?.response?.data?.message??`保存失败`),!1}finally{E.value=!1}}async function Me(t){try{await y.delete(`/study-tours/${t.id}`),e.success(`删除成功`),await Q()}catch(t){e.error(t?.response?.data?.message??`删除失败`)}}return n(Q),(e,n)=>{let l=r(`a-input-search`),d=r(`a-option`),f=r(`a-select`),_=r(`a-button`),y=r(`a-space`),k=r(`a-table-column`),U=r(`a-tag`),W=r(`a-popconfirm`),G=r(`a-table`),K=r(`a-card`),q=r(`a-modal`),J=r(`a-input`),Y=r(`a-form-item`),Ne=r(`a-input-number`),Pe=r(`a-switch`),$=r(`a-col`),Fe=r(`a-empty`),Ie=r(`a-row`),Le=r(`a-upload`),Re=r(`a-typography-text`),ze=r(`a-form`);return t(),p(c,null,[g(K,{title:`研学线路管理 / 线路列表`},{default:i(()=>[g(y,{wrap:``,style:{"margin-bottom":`12px`}},{default:i(()=>[g(l,{modelValue:M.value,"onUpdate:modelValue":n[0]||=e=>M.value=e,placeholder:`关键词(线路名称)`,style:{width:`220px`},"allow-clear":``,onSearch:Q,onClear:Q},null,8,[`modelValue`]),g(f,{modelValue:N.value,"onUpdate:modelValue":n[1]||=e=>N.value=e,placeholder:`场馆`,"allow-clear":``,"allow-search":``,style:{width:`200px`},onChange:Q},{default:i(()=>[(t(!0),p(c,null,v(j.value,e=>(t(),o(d,{key:e.id,value:e.id},{default:i(()=>[a(u(e.name),1)]),_:2},1032,[`value`]))),128))]),_:1},8,[`modelValue`]),g(f,{modelValue:P.value,"onUpdate:modelValue":n[2]||=e=>P.value=e,placeholder:`上架状态`,"allow-clear":``,style:{width:`140px`},onChange:Q},{default:i(()=>[g(d,{value:`1`},{default:i(()=>[...n[12]||=[a(`上架`,-1)]]),_:1}),g(d,{value:`0`},{default:i(()=>[...n[13]||=[a(`下架`,-1)]]),_:1})]),_:1},8,[`modelValue`]),g(_,{type:`primary`,onClick:n[3]||=()=>Q()},{default:i(()=>[...n[14]||=[a(`查询`,-1)]]),_:1}),g(_,{onClick:be},{default:i(()=>[...n[15]||=[a(`重置`,-1)]]),_:1}),g(_,{type:`primary`,onClick:Ce},{default:i(()=>[...n[16]||=[a(`新建线路`,-1)]]),_:1})]),_:1}),g(G,{class:`list-data-table study-tour-table`,scroll:{x:pe},data:A.value,loading:b.value,"row-key":`id`,pagination:{current:F.current,pageSize:F.pageSize,total:A.value.length,showTotal:!0},onPageChange:xe},{columns:i(()=>[g(k,{title:``,width:50,ellipsis:!0,tooltip:!0},{cell:i(({rowIndex:e})=>[a(u(h(S)(e,F.current,F.pageSize)),1)]),_:1}),g(k,{title:`线路名称`,"data-index":`name`,width:160,ellipsis:!0,tooltip:!0}),g(k,{title:`封面`,width:72,align:`center`},{cell:i(({record:e})=>[h(C)(e.cover_image)?(t(),p(`img`,{key:0,src:h(C)(e.cover_image),alt:``,style:{width:`44px`,height:`44px`,"object-fit":`cover`,"border-radius":`4px`,cursor:`pointer`},onClick:t=>_e(`image`,e.cover_image),onError:Z},null,40,ee)):(t(),p(`span`,te,`-`))]),_:1}),g(k,{title:`标签`,width:130,ellipsis:!0,tooltip:!0},{cell:i(({record:e})=>[a(u(ge(e.tags)),1)]),_:1}),g(k,{title:`场馆数`,width:72},{cell:i(({record:e})=>[a(u((e.venue_ids||[]).length),1)]),_:1}),g(k,{title:`排序`,"data-index":`sort`,width:64,ellipsis:!0,tooltip:!0}),g(k,{title:`上架状态`,width:100},{cell:i(({record:e})=>[g(U,{color:e.is_on_shelf?`green`:`gray`},{default:i(()=>[a(u(e.is_on_shelf?`上架`:`下架`),1)]),_:2},1032,[`color`])]),_:1}),g(k,{title:`操作`,width:200,"min-width":180,fixed:`right`,align:`center`},{cell:i(({record:e})=>[g(y,{wrap:``,size:4},{default:i(()=>[g(_,{type:`text`,onClick:t=>we(e)},{default:i(()=>[...n[17]||=[a(`编辑`,-1)]]),_:1},8,[`onClick`]),g(_,{type:`text`,status:`warning`,onClick:t=>Se(e)},{default:i(()=>[a(u(e.is_on_shelf?`下架`:`上架`),1)]),_:2},1032,[`onClick`]),g(W,{content:`确定删除该线路?`,onOk:t=>Me(e)},{default:i(()=>[g(_,{type:`text`,status:`danger`},{default:i(()=>[...n[18]||=[a(`删除`,-1)]]),_:1})]),_:1},8,[`onOk`])]),_:2},1024)]),_:1})]),_:1},8,[`scroll`,`data`,`loading`,`pagination`])]),_:1}),g(q,{visible:L.value,"onUpdate:visible":n[4]||=e=>L.value=e,footer:!1,width:`auto`,onCancel:n[5]||=e=>L.value=!1},{default:i(()=>[m(`div`,ne,[R.value===`image`?(t(),p(`img`,{key:0,src:z.value,alt:`预览`,style:{"max-width":`100%`,"max-height":`75vh`,display:`block`,margin:`0 auto`}},null,8,re)):(t(),p(`video`,{key:1,src:z.value,controls:``,style:{"max-width":`100%`,"max-height":`75vh`,display:`block`,margin:`0 auto`}},null,8,ie))])]),_:1},8,[`visible`]),g(q,{visible:D.value,"onUpdate:visible":n[11]||=e=>D.value=e,title:O.value?`新增线路`:`编辑线路`,width:`70%`,"body-style":me,"confirm-loading":E.value,"on-before-ok":je},{default:i(()=>[g(ze,{model:B,layout:`vertical`,class:`admin-modal-form`},{default:i(()=>[g(Y,{label:`线路名称`,required:``},{default:i(()=>[g(J,{modelValue:B.name,"onUpdate:modelValue":n[6]||=e=>B.name=e},null,8,[`modelValue`])]),_:1}),g(Y,{label:`排序`},{default:i(()=>[g(Ne,{modelValue:B.sort,"onUpdate:modelValue":n[7]||=e=>B.sort=e,min:0},null,8,[`modelValue`])]),_:1}),g(Y,{label:`上架状态`},{default:i(()=>[g(Pe,{modelValue:B.is_on_shelf,"onUpdate:modelValue":n[8]||=e=>B.is_on_shelf=e},null,8,[`modelValue`])]),_:1}),m(`div`,ae,[g(Ie,{gutter:16},{default:i(()=>[g($,{span:12},{default:i(()=>[g(Y,{label:`标签`},{default:i(()=>[m(`div`,oe,[m(`div`,w,[g(J,{modelValue:V.value,"onUpdate:modelValue":n[9]||=e=>V.value=e,placeholder:`请输入标签内容`,class:`study-tour-tags-input`},null,8,[`modelValue`]),g(_,{type:`primary`,onClick:ke},{default:i(()=>[...n[19]||=[a(`保存标签`,-1)]]),_:1})]),m(`div`,se,[(t(!0),p(c,null,v(B.tags,(e,n)=>(t(),o(U,{key:`${e}-${n}`,closable:``,style:{"margin-bottom":`0`},onClose:e=>Ae(n)},{default:i(()=>[a(u(e),1)]),_:2},1032,[`onClose`]))),128)),B.tags.length?s(``,!0):(t(),p(`span`,ce,`暂无标签`))])])]),_:1})]),_:1}),g($,{span:12},{default:i(()=>[g(Y,{label:`场馆数组(可排序)`,required:``},{default:i(()=>[m(`div`,T,[m(`div`,le,[g(f,{"model-value":B.venue_ids,multiple:``,"allow-search":``,"allow-clear":``,"max-tag-count":1,placeholder:`请选择场馆`,onChange:Te},{default:i(()=>[(t(!0),p(c,null,v(j.value,e=>(t(),o(d,{key:e.id,value:e.id},{default:i(()=>[a(u(e.name),1)]),_:2},1032,[`value`]))),128))]),_:1},8,[`model-value`])]),m(`div`,ue,[g(y,{direction:`vertical`,fill:``},{default:i(()=>[(t(!0),p(c,null,v(H.value,(e,r)=>(t(),p(`div`,{key:e.id,style:{display:`flex`,"align-items":`center`,"justify-content":`space-between`,border:`1px solid #f2f3f5`,"border-radius":`4px`,padding:`6px 8px`}},[m(`span`,null,u(r+1)+`. `+u(e.name),1),g(y,null,{default:i(()=>[g(_,{size:`mini`,disabled:r===0,onClick:e=>Ee(r)},{default:i(()=>[...n[20]||=[a(`上移`,-1)]]),_:1},8,[`disabled`,`onClick`]),g(_,{size:`mini`,disabled:r===H.value.length-1,onClick:e=>De(r)},{default:i(()=>[...n[21]||=[a(`下移`,-1)]]),_:1},8,[`disabled`,`onClick`]),g(_,{size:`mini`,status:`danger`,onClick:t=>Oe(e.id)},{default:i(()=>[...n[22]||=[a(`移除`,-1)]]),_:1},8,[`onClick`])]),_:2},1024)]))),128)),H.value.length?s(``,!0):(t(),o(Fe,{key:0,description:`未选择场馆`}))]),_:1})])])]),_:1})]),_:1})]),_:1})]),g(Y,{label:`封面图`,class:`admin-modal-form__full`},{default:i(()=>[g(y,{direction:`vertical`,fill:``,style:{width:`100%`}},{default:i(()=>[g(Le,{"auto-upload":!1,"show-file-list":!1,accept:`image/*`,"before-upload":X,onChange:ve},{"upload-button":i(()=>[g(_,null,{default:i(()=>[...n[23]||=[a(`上传封面`,-1)]]),_:1})]),_:1}),g(Re,{type:`secondary`},{default:i(()=>[...n[24]||=[a(`图片尺寸推荐 1200×600`,-1)]]),_:1}),B.cover_image?(t(),p(`div`,de,[m(`img`,{src:h(C)(B.cover_image),alt:`封面预览`,class:`study-tour-cover-thumb`,onError:Z},null,40,fe),g(_,{size:`mini`,status:`danger`,onClick:ye},{default:i(()=>[...n[25]||=[a(`删除封面`,-1)]]),_:1})])):s(``,!0)]),_:1})]),_:1}),g(Y,{label:`线路简介`,class:`admin-modal-form__full`},{default:i(()=>[g(x,{modelValue:B.intro_html,"onUpdate:modelValue":n[10]||=e=>B.intro_html=e,"field-key":`study-intro-${I.value}`,"editor-options":he,"min-height":260},null,8,[`modelValue`,`field-key`])]),_:1})]),_:1},8,[`model`])]),_:1},8,[`visible`,`title`,`confirm-loading`])],64)}}}),[[`__scopeId`,`data-v-e826a8f0`]]);export{E as default}; |