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
14 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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