You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1 line
13 KiB
1 line
13 KiB
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"./index-DhmwAFpV.js";import{t as b}from"./RichEditorField-DvXgOxi7.js";import{t as x}from"./listTable-CVMJfkhr.js";import{t as S}from"./mediaUrl-CxI9paVG.js";var ee=[`src`,`onClick`],te={key:1,style:{color:`#86909c`}},C={style:{"max-width":`90vw`,"max-height":`80vh`}},ne=[`src`],re=[`src`],ie={style:{"margin-top":`8px`,width:`100%`,"overflow-x":`auto`,"white-space":`nowrap`}},ae={key:0,style:{color:`#86909c`}},oe={key:0,style:{display:`flex`,"flex-direction":`column`,"align-items":`flex-start`,gap:`8px`}},se=[`src`],ce={style:{width:`160px`,height:`100px`,overflow:`hidden`,"border-radius":`4px`,background:`#f7f8fa`}},le=[`src`,`onClick`],ue=[`src`,`onClick`],w={style:{width:`100%`,display:`flex`,"flex-direction":`column`,"align-items":`stretch`}},T={style:{width:`100%`,"margin-bottom":`8px`}},E={style:{width:`100%`,border:`1px solid #e5e6eb`,"border-radius":`6px`,padding:`8px`}},D=_({__name:`StudyTourList`,setup(_){let D=l(!1),O=l(!1),k=l(!1),A=l(!0),j=l(null),M=l([]),N=l([]),de={maxHeight:`70vh`,overflow:`auto`},P=l(0),F=l(!1),I=l(`image`),L=l(``),R=f({name:``,tags:[],venue_ids:[],cover_image:``,gallery_media:[],intro_html:``,sort:0,is_active:!0}),z=l(``),B=d(()=>{let e=new Map(N.value.map(e=>[e.id,e]));return R.venue_ids.map(t=>e.get(t)).filter(Boolean)});function V(e,t){let n=String(e||``).trim();if(n)return S(n);let r=String(t||``).trim();return r?S(r):``}async function H(e){let t=new FormData;t.append(`file`,e);let{data:n}=await y.post(`/upload`,t);return V(n?.url,n?.path)}async function U(e){return H(e)}function W(){P.value+=1}function G(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 K(){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 U(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 q(){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 U(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 fe={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:K,video:q}}},placeholder:`请输入线路简介`};function pe(e){return(e||[]).length?(e||[]).join(`、`):`-`}function J(e,t){t&&(I.value=e,L.value=S(t),F.value=!0)}async function Y(t){try{let n=G(t);if(!n)return e.warning(`未识别到上传文件`),!1;R.cover_image=await H(n),e.success(`封面上传成功`)}catch(t){e.error(t?.response?.data?.message??`封面上传失败`)}return!1}async function X(t){try{let n=G(t);if(!n)return e.warning(`未识别到上传文件`),!1;let r=await H(n);if(!r)return e.error(`上传成功但未返回可用地址`),!1;let i=n.type.startsWith(`video/`);R.gallery_media.push({type:i?`video`:`image`,url:r}),e.success(`轮播资源上传成功`)}catch(t){e.error(t?.response?.data?.message??`轮播资源上传失败`)}return!1}function me(...e){Y(e)}function he(...e){X(e)}function ge(){R.cover_image=``}function _e(e){R.gallery_media.splice(e,1)}function Z(t){let n=t?.target,r=(n?.getAttribute?.(`src`)||n?.src||``).trim();!r||r===`about:blank`||e.error(`图片地址无法访问,请检查后端 storage 访问配置`)}async function Q(){D.value=!0;try{let[e,t]=await Promise.all([y.get(`/study-tours`),y.get(`/venues`)]);M.value=e.data,N.value=t.data}catch(t){e.error(t?.response?.data?.message??`加载研学线路失败`)}finally{D.value=!1}}function ve(){A.value=!0,j.value=null,R.name=``,R.tags=[],R.venue_ids=[],R.cover_image=``,R.gallery_media=[],R.intro_html=``,R.sort=0,R.is_active=!0,W(),k.value=!0}function $(e){A.value=!1,j.value=e.id,R.name=e.name,R.tags=Array.isArray(e.tags)?[...e.tags]:[],R.venue_ids=Array.isArray(e.venue_ids)?[...e.venue_ids]:[],R.cover_image=e.cover_image??``,R.gallery_media=Array.isArray(e.gallery_media)?[...e.gallery_media]:[],R.intro_html=e.intro_html||``,R.sort=e.sort??0,R.is_active=!!e.is_active,W(),k.value=!0}function ye(e){let t=new Set(e),n=R.venue_ids.filter(e=>t.has(e)),r=new Set(n);for(let t of e)r.has(t)||n.push(t);R.venue_ids=n}function be(e){if(e<=0)return;let t=[...R.venue_ids],n=t[e-1];t[e-1]=t[e],t[e]=n,R.venue_ids=t}function xe(e){if(e>=R.venue_ids.length-1)return;let t=[...R.venue_ids],n=t[e+1];t[e+1]=t[e],t[e]=n,R.venue_ids=t}function Se(e){R.venue_ids=R.venue_ids.filter(t=>t!==e)}function Ce(){let t=z.value.trim();if(!t){e.warning(`请输入标签内容`);return}if(R.tags.includes(t)){e.warning(`标签已存在`);return}R.tags=[...R.tags,t],z.value=``}function we(e){let t=[...R.tags];t.splice(e,1),R.tags=t}async function Te(){if(!R.name.trim())return e.warning(`请填写线路名称`),!1;if(!R.venue_ids.length)return e.warning(`请至少选择一个场馆`),!1;O.value=!0;try{let t={name:R.name.trim(),tags:R.tags.map(e=>e.trim()).filter(Boolean),venue_ids:[...R.venue_ids],cover_image:R.cover_image||``,gallery_media:[...R.gallery_media],intro_html:R.intro_html||``,sort:R.sort??0,is_active:R.is_active};return A.value?(await y.post(`/study-tours`,t),e.success(`新增线路成功`)):j.value&&(await y.put(`/study-tours/${j.value}`,t),e.success(`更新线路成功`)),k.value=!1,await Q(),!0}catch(t){return e.error(t?.response?.data?.message??`保存失败`),!1}finally{O.value=!1}}async function Ee(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-button`),d=r(`a-space`),f=r(`a-table-column`),_=r(`a-tag`),y=r(`a-popconfirm`),j=r(`a-table`),V=r(`a-card`),H=r(`a-modal`),U=r(`a-input`),W=r(`a-form-item`),G=r(`a-upload`),K=r(`a-option`),q=r(`a-select`),De=r(`a-empty`),Oe=r(`a-input-number`),ke=r(`a-switch`),Ae=r(`a-form`);return t(),p(c,null,[g(V,{title:`研学线路管理 / 线路列表`},{extra:i(()=>[g(d,null,{default:i(()=>[g(l,{onClick:Q},{default:i(()=>[...n[8]||=[a(`刷新`,-1)]]),_:1}),g(l,{type:`primary`,onClick:ve},{default:i(()=>[...n[9]||=[a(`新增线路`,-1)]]),_:1})]),_:1})]),default:i(()=>[g(j,{class:`list-data-table`,scroll:{x:h(x)},data:M.value,loading:D.value,"row-key":`id`,pagination:{pageSize:10}},{columns:i(()=>[g(f,{title:`ID`,"data-index":`id`,width:80,ellipsis:!0,tooltip:!0}),g(f,{title:`封面`,width:100,align:`center`},{cell:i(({record:e})=>[h(S)(e.cover_image)?(t(),p(`img`,{key:0,src:h(S)(e.cover_image),alt:``,style:{width:`56px`,height:`56px`,"object-fit":`cover`,"border-radius":`4px`,cursor:`pointer`},onClick:t=>J(`image`,e.cover_image),onError:Z},null,40,ee)):(t(),p(`span`,te,`-`))]),_:1}),g(f,{title:`线路名称`,"data-index":`name`,width:200,"min-width":160,ellipsis:!0,tooltip:!0}),g(f,{title:`标签`,width:200,"min-width":140,ellipsis:!0,tooltip:!0},{cell:i(({record:e})=>[a(u(pe(e.tags)),1)]),_:1}),g(f,{title:`场馆数量`,width:100},{cell:i(({record:e})=>[a(u((e.venue_ids||[]).length),1)]),_:1}),g(f,{title:`排序`,"data-index":`sort`,width:100,ellipsis:!0,tooltip:!0}),g(f,{title:`状态`,width:100},{cell:i(({record:e})=>[g(_,{color:e.is_active?`green`:`gray`},{default:i(()=>[a(u(e.is_active?`启用`:`禁用`),1)]),_:2},1032,[`color`])]),_:1}),g(f,{title:`操作`,width:160,fixed:`right`,align:`center`},{cell:i(({record:e})=>[g(d,null,{default:i(()=>[g(l,{type:`text`,onClick:t=>$(e)},{default:i(()=>[...n[10]||=[a(`编辑`,-1)]]),_:1},8,[`onClick`]),g(y,{content:`确定删除该线路?`,onOk:t=>Ee(e)},{default:i(()=>[g(l,{type:`text`,status:`danger`},{default:i(()=>[...n[11]||=[a(`删除`,-1)]]),_:1})]),_:1},8,[`onOk`])]),_:2},1024)]),_:1})]),_:1},8,[`scroll`,`data`,`loading`])]),_:1}),g(H,{visible:F.value,"onUpdate:visible":n[0]||=e=>F.value=e,footer:!1,width:`auto`,onCancel:n[1]||=e=>F.value=!1},{default:i(()=>[m(`div`,C,[I.value===`image`?(t(),p(`img`,{key:0,src:L.value,alt:`预览`,style:{"max-width":`100%`,"max-height":`75vh`,display:`block`,margin:`0 auto`}},null,8,ne)):(t(),p(`video`,{key:1,src:L.value,controls:``,style:{"max-width":`100%`,"max-height":`75vh`,display:`block`,margin:`0 auto`}},null,8,re))])]),_:1},8,[`visible`]),g(H,{visible:k.value,"onUpdate:visible":n[7]||=e=>k.value=e,title:A.value?`新增线路`:`编辑线路`,width:`70%`,"body-style":de,"confirm-loading":O.value,"on-before-ok":Te},{default:i(()=>[g(Ae,{model:R,layout:`vertical`},{default:i(()=>[g(W,{label:`线路名称`,required:``},{default:i(()=>[g(U,{modelValue:R.name,"onUpdate:modelValue":n[2]||=e=>R.name=e},null,8,[`modelValue`])]),_:1}),g(W,{label:`标签数组`},{default:i(()=>[g(d,{style:{width:`100%`}},{default:i(()=>[g(U,{modelValue:z.value,"onUpdate:modelValue":n[3]||=e=>z.value=e,placeholder:`请输入标签内容`},null,8,[`modelValue`]),g(l,{type:`primary`,onClick:Ce},{default:i(()=>[...n[12]||=[a(`新增标签`,-1)]]),_:1})]),_:1}),m(`div`,ie,[(t(!0),p(c,null,v(R.tags,(e,n)=>(t(),o(_,{key:`${e}-${n}`,closable:``,style:{"margin-right":`8px`,"margin-bottom":`0`},onClose:e=>we(n)},{default:i(()=>[a(u(e),1)]),_:2},1032,[`onClose`]))),128)),R.tags.length?s(``,!0):(t(),p(`span`,ae,`暂无标签`))])]),_:1}),g(W,{label:`封面图(单张)`},{default:i(()=>[g(d,{direction:`vertical`,fill:``},{default:i(()=>[g(G,{"auto-upload":!1,"show-file-list":!1,accept:`image/*`,"before-upload":Y,onChange:me},{"upload-button":i(()=>[g(l,null,{default:i(()=>[...n[13]||=[a(`上传封面`,-1)]]),_:1})]),_:1}),R.cover_image?(t(),p(`div`,oe,[m(`img`,{src:h(S)(R.cover_image),alt:`封面预览`,style:{"max-width":`240px`,"max-height":`160px`,"object-fit":`contain`,"border-radius":`4px`,border:`1px solid #e5e6eb`},onError:Z},null,40,se),g(l,{size:`mini`,status:`danger`,onClick:ge},{default:i(()=>[...n[14]||=[a(`删除封面`,-1)]]),_:1})])):s(``,!0)]),_:1})]),_:1}),g(W,{label:`轮播图/视频`},{default:i(()=>[g(d,{direction:`vertical`,fill:``,style:{width:`100%`}},{default:i(()=>[g(G,{"auto-upload":!1,"show-file-list":!1,multiple:``,accept:`image/*,video/*`,"before-upload":X,onChange:he},{"upload-button":i(()=>[g(l,{type:`primary`},{default:i(()=>[...n[15]||=[a(`新增轮播资源`,-1)]]),_:1})]),_:1}),g(d,{wrap:``},{default:i(()=>[(t(!0),p(c,null,v(R.gallery_media,(e,r)=>(t(),o(V,{key:e.url+r,size:`small`,style:{width:`180px`}},{extra:i(()=>[g(l,{size:`mini`,status:`danger`,onClick:e=>_e(r)},{default:i(()=>[...n[16]||=[a(`删除`,-1)]]),_:1},8,[`onClick`])]),default:i(()=>[m(`div`,ce,[e.type===`image`?(t(),p(`img`,{key:0,src:h(S)(e.url),style:{width:`100%`,height:`100%`,"object-fit":`cover`,cursor:`pointer`},alt:``,onClick:t=>J(`image`,e.url),onError:Z},null,40,le)):(t(),p(`video`,{key:1,src:h(S)(e.url),style:{width:`100%`,height:`100%`,"object-fit":`cover`,cursor:`pointer`},muted:``,onClick:t=>J(`video`,e.url)},null,8,ue))])]),_:2},1024))),128))]),_:1})]),_:1})]),_:1}),g(W,{label:`场馆数组(可排序)`,required:``},{default:i(()=>[m(`div`,w,[m(`div`,T,[g(q,{"model-value":R.venue_ids,multiple:``,"allow-search":``,"allow-clear":``,placeholder:`请选择场馆`,onChange:ye},{default:i(()=>[(t(!0),p(c,null,v(N.value,e=>(t(),o(K,{key:e.id,value:e.id},{default:i(()=>[a(u(e.name),1)]),_:2},1032,[`value`]))),128))]),_:1},8,[`model-value`])]),m(`div`,E,[g(d,{direction:`vertical`,fill:``},{default:i(()=>[(t(!0),p(c,null,v(B.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(d,null,{default:i(()=>[g(l,{size:`mini`,disabled:r===0,onClick:e=>be(r)},{default:i(()=>[...n[17]||=[a(`上移`,-1)]]),_:1},8,[`disabled`,`onClick`]),g(l,{size:`mini`,disabled:r===B.value.length-1,onClick:e=>xe(r)},{default:i(()=>[...n[18]||=[a(`下移`,-1)]]),_:1},8,[`disabled`,`onClick`]),g(l,{size:`mini`,status:`danger`,onClick:t=>Se(e.id)},{default:i(()=>[...n[19]||=[a(`移除`,-1)]]),_:1},8,[`onClick`])]),_:2},1024)]))),128)),B.value.length?s(``,!0):(t(),o(De,{key:0,description:`未选择场馆`}))]),_:1})])])]),_:1}),g(W,{label:`线路简介`},{default:i(()=>[g(b,{modelValue:R.intro_html,"onUpdate:modelValue":n[4]||=e=>R.intro_html=e,"field-key":`study-intro-${P.value}`,"editor-options":fe,"min-height":260},null,8,[`modelValue`,`field-key`])]),_:1}),g(W,{label:`排序`},{default:i(()=>[g(Oe,{modelValue:R.sort,"onUpdate:modelValue":n[5]||=e=>R.sort=e,min:0},null,8,[`modelValue`])]),_:1}),g(W,{label:`状态`},{default:i(()=>[g(ke,{modelValue:R.is_active,"onUpdate:modelValue":n[6]||=e=>R.is_active=e},null,8,[`modelValue`])]),_:1})]),_:1},8,[`model`])]),_:1},8,[`visible`,`title`,`confirm-loading`])],64)}}});export{D as default}; |