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