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 lines
15 KiB
1 lines
15 KiB
import{g as pe,k as ve,B as me,c as o,a as s,p as d,q as H,F as p,r as v,l as c,d as C,H as be,t as r,v as x,s as N,m as Q,x as b,y as fe,z,o as i,L as X,n as O,_ as xe}from"./Ccu6Xgpt.js";import{u as ye}from"./Um-KoueI.js";import{u as ke}from"./DvwKXRUn.js";import"./CH2ZVAK2.js";const ge={class:"flex items-center justify-between mb-5 flex-wrap gap-3"},he={class:"flex items-center gap-3"},_e=["value"],we={key:0,class:"pay-warn"},Ce={class:"flex items-start gap-2"},Ve={class:"flex-1"},Ue={class:"text-xs mt-1"},Ae={key:1,class:"scope-tip"},Se={class:"flex items-center gap-2 mb-3"},Pe={class:"text-xs text-slate-400"},Ne={class:"ch-grid"},Oe=["onClick"],je={class:"flex items-start justify-between gap-2"},Le={class:"min-w-0"},Me={class:"font-semibold text-sm text-slate-800"},Be={class:"text-[11px] text-slate-400 mt-0.5"},Ee={class:"ver-row"},Ie={class:"ver-box"},Te={class:"ver-val"},$e={class:"ver-box"},He={key:0,class:"ver-box"},ze={class:"ver-val review"},Fe={class:"flex flex-wrap items-center gap-1.5 mt-2"},Ge={key:0,class:"flag flag-warn"},Re={key:1,class:"flag"},qe={key:2,class:"flag"},De={key:3,class:"flag flag-off"},We={key:0,class:"flex flex-wrap items-center gap-1.5 mt-2"},Ye=["title"],Je={key:1,class:"text-[11px] text-slate-400 mt-2 truncate"},Ke=["onClick"],Qe={class:"text-sm text-slate-400"},Xe={class:"ch-box"},Ze={class:"flex items-center justify-between mb-4"},es={class:"flex items-center gap-3"},ss={class:"text-base font-semibold text-slate-800"},ts={class:"scope-chip"},ls={class:"ed-section"},ns={class:"grid grid-cols-2 gap-3"},as=["disabled"],os=["label"],is=["value"],rs=["value"],ds={class:"mt-3"},us={class:"ed-section"},cs={class:"grid grid-cols-3 gap-3"},ps={class:"flex items-center gap-2 text-sm cursor-pointer mt-3"},vs={key:0,class:"ed-warn"},ms={class:"mt-3"},bs={class:"mt-3"},fs={class:"ed-section"},xs={class:"flex flex-col gap-2"},ys={class:"flex items-center gap-2 text-sm cursor-pointer"},ks={class:"flex items-center gap-2 text-sm cursor-pointer"},gs={class:"ed-section"},hs={class:"pay-grid"},_s=["checked","onChange"],ws={key:0,class:"pay-miss"},Cs={class:"ed-tip"},Vs={key:1},Us={class:"ed-footer"},As={class:"flex items-center gap-2 text-sm cursor-pointer"},Ss={class:"flex gap-2"},Ps=["disabled"],Ns=pe({__name:"channels",setup(Os){const Z={1:"华为",2:"小米",3:"OPPO",4:"VIVO",5:"荣耀",100:"官方包",101:"App Store",102:"Google Play"};function y(l){return Z[l]??"渠道"+l}const F=[{label:"中国厂商",icon:"📱",color:"#0369a1",bg:"#dbeafe",channels:[1,2,3,4,5]},{label:"全球商店",icon:"🌍",color:"#c2410c",bg:"#fff7ed",channels:[101,102]},{label:"官方渠道",icon:"🏠",color:"#059669",bg:"#dcfce7",channels:[100]}],j=[{v:0,label:"草稿(不下发)",color:"#64748b",bg:"#f1f5f9"},{v:1,label:"已上架",color:"#059669",bg:"#dcfce7"},{v:2,label:"审核中",color:"#b45309",bg:"#fef9c3"},{v:3,label:"已下架",color:"#be123c",bg:"#ffe4e6"}];function ee(l){return j.find(e=>e.v===l)?.label??"未知"}function se(l){const e=j.find(t=>t.v===l);return e?{background:e.bg,color:e.color}:{}}const L=[{key:"wxpay",label:"微信支付",module:"wechatpay"},{key:"alipay",label:"支付宝",module:"alipay"},{key:"paypal",label:"PayPal",module:"paypal"},{key:"apple",label:"Apple 内购",module:"appleiap"},{key:"google",label:"Google 内购",module:"googleiap"}];function G(l){return L.find(e=>e.key===l)?.label??l}const{webApi:V,consoleApi:te}=ye(),{success:R,error:f}=ke(),le=ve(),u=b(""),M=b([]),k=b([]),B=b([]),U=b(!1),A=b(!1),g=b(!1),E=b(!1);function I(){return{row_id:0,app_name:"",channel:0,version:"",min_version:"",force_update:!1,changelog:"",address:"",review_version:"",status:1,description:"",tourists:!1,allowskipdevicebinding:!1,paychannels:"",enable:!0}}const n=fe(I()),ne=z(()=>F.map(l=>({...l,items:k.value.filter(e=>l.channels.includes(e.channel)).sort((e,t)=>e.channel-t.channel),missing:l.channels.filter(e=>!k.value.some(t=>t.channel===e))})));function h(l){return(l.paychannels||"").split(",").map(e=>e.trim()).filter(Boolean)}function _(l){if(!U.value)return!1;const e=L.find(t=>t.key===l)?.module;return!!e&&!B.value.includes(e)}const q=z(()=>{if(!U.value)return[];const l={};for(const e of k.value)if(e.enable)for(const t of h(e))_(t)&&(l[t]=l[t]||[]).push(y(e.channel));return Object.keys(l).map(e=>({key:e,label:G(e),channels:l[e]}))}),S=z(()=>n.force_update&&!n.min_version.trim()?"开启强制更新时必须填「最低支持版本」,否则挡不住任何人":n.min_version.trim()&&n.version.trim()&&ae(n.min_version,n.version)>0?"「最低支持版本」高于「当前线上版本」,会把所有线上用户判定为需强更却无更高版本可更":"");function ae(l,e){const t=l.trim().split("."),a=e.trim().split("."),m=Math.max(t.length,a.length);for(let P=0;P<m;P++){const J=parseInt(t[P]??"0")||0,K=parseInt(a[P]??"0")||0;if(J!==K)return J<K?-1:1}return 0}async function oe(){try{const l=await te("products/list",{});M.value=(l??[]).map(e=>e.name).filter(Boolean)}catch{M.value=[]}}async function T(){try{const l=await V("getchannelapps",{app_name:u.value});k.value=l?.items??[]}catch(l){f(l?.message??"加载失败"),k.value=[]}}async function ie(){try{const l=await V("getchannelpaystatus",{app_name:u.value});B.value=l?.configured??[],U.value=!!l?.checked}catch{B.value=[],U.value=!1}}async function D(){await Promise.all([T(),ie()])}function W(l){Object.assign(n,I()),typeof l=="number"&&(n.channel=l),g.value=!1,A.value=!0}function re(l){Object.assign(n,I(),l),g.value=!0,A.value=!0}function w(){A.value=!1}function $(l){return h(n).includes(l)}function de(l){const e=h(n),t=e.indexOf(l);t>=0?e.splice(t,1):e.push(l),n.paychannels=e.join(",")}async function ue(){if(!n.channel){f("请选择分发渠道");return}if(S.value){f(S.value);return}E.value=!0;try{await V("savechannelapp",{...n,app_name:u.value}),R("保存成功"),w(),await T()}catch(l){f(l?.message??"保存失败")}finally{E.value=!1}}function ce(){window.confirm(`确定删除「${y(n.channel)}」这个渠道的配置吗?`)&&V("delchannelapp",{app_name:u.value,channel:n.channel}).then(()=>{R("已删除"),w(),T()}).catch(l=>f(l?.message??"删除失败"))}function Y(){if(!u.value){f("请先在上方选择一个应用");return}le.push(`/apps/${encodeURIComponent(u.value)}?tab=modules`)}return me(async()=>{await oe(),await D()}),(l,e)=>(i(),o("div",null,[s("div",ge,[e[15]||(e[15]=s("div",null,[s("h2",{class:"text-lg font-semibold text-slate-800"},"渠道分发"),s("p",{class:"text-xs text-slate-400 mt-1"}," 管理各应用在各分发渠道上的版本、强制更新与能力开关。支付渠道在这里控制「开放哪几种支付入口」,商户凭据在应用的业务功能配置里填。 ")],-1)),s("div",he,[e[14]||(e[14]=s("span",{class:"text-sm text-slate-500"},"应用",-1)),d(s("select",{"onUpdate:modelValue":e[0]||(e[0]=t=>u.value=t),class:"select select-bordered select-sm",onChange:D},[e[13]||(e[13]=s("option",{value:""},"全局默认(所有应用兜底)",-1)),(i(!0),o(p,null,v(M.value,t=>(i(),o("option",{key:t,value:t},r(t),9,_e))),128))],544),[[H,u.value]]),s("button",{class:"btn btn-primary btn-sm text-white",onClick:W},"+ 添加渠道")])]),q.value.length?(i(),o("div",we,[s("div",Ce,[e[17]||(e[17]=s("span",null,"⚠",-1)),s("div",Ve,[e[16]||(e[16]=s("div",{class:"text-sm font-semibold"},"以下支付方式已在渠道里开放,但商户凭据还没配:",-1)),s("div",Ue,[(i(!0),o(p,null,v(q.value,t=>(i(),o("span",{key:t.key,class:"warn-pill"},r(t.label)+"("+r(t.channels.join("、"))+")",1))),128))])]),s("button",{class:"btn btn-xs btn-ghost",onClick:Y},"去配置 →")])])):c("",!0),u.value?c("",!0):(i(),o("div",Ae,[...e[18]||(e[18]=[C(" 当前是",-1),s("b",null,"全局默认",-1),C("作用域:这里配的渠道对所有应用生效,应用自己配了同渠道则以应用的为准。 ",-1)])])),(i(!0),o(p,null,v(ne.value,t=>(i(),o("div",{key:t.label,class:"mb-6"},[s("div",Se,[s("span",{class:"group-tag",style:X({background:t.bg,color:t.color})},r(t.icon)+" "+r(t.label),5),s("span",Pe,r(t.items.length)+" / "+r(t.channels.length)+" 已配置",1)]),s("div",Ne,[(i(!0),o(p,null,v(t.items,a=>(i(),o("div",{key:a.channel,class:O(["ch-card",{off:!a.enable}]),onClick:m=>re(a)},[s("div",je,[s("div",Le,[s("div",Me,r(y(a.channel)),1),s("div",Be,"渠道号 "+r(a.channel),1)]),s("span",{class:"status-badge",style:X(se(a.status))},r(ee(a.status)),5)]),s("div",Ee,[s("div",Ie,[e[19]||(e[19]=s("span",{class:"ver-label"},"线上版本",-1)),s("span",Te,r(a.version||"—"),1)]),s("div",$e,[e[20]||(e[20]=s("span",{class:"ver-label"},"最低支持",-1)),s("span",{class:O(["ver-val",{warn:a.force_update}])},r(a.min_version||"—"),3)]),a.review_version?(i(),o("div",He,[e[21]||(e[21]=s("span",{class:"ver-label"},"审核中",-1)),s("span",ze,r(a.review_version),1)])):c("",!0)]),s("div",Fe,[a.force_update?(i(),o("span",Ge,"强制更新")):c("",!0),a.tourists?(i(),o("span",Re,"游客登录")):c("",!0),a.allowskipdevicebinding?(i(),o("span",qe,"可跳过绑定")):c("",!0),a.enable?c("",!0):(i(),o("span",De,"已停用"))]),h(a).length?(i(),o("div",We,[(i(!0),o(p,null,v(h(a),m=>(i(),o("span",{key:m,class:O(["pay-pill",{missing:_(m)}]),title:_(m)?"该支付方式的商户凭据尚未配置":""},r(G(m))+r(_(m)?" ⚠":""),11,Ye))),128))])):c("",!0),a.address?(i(),o("div",Je,r(a.address),1)):c("",!0)],10,Oe))),128)),(i(!0),o(p,null,v(t.missing,a=>(i(),o("div",{key:"m"+a,class:"ch-card ch-empty",onClick:m=>W(a)},[s("div",Qe,r(y(a)),1),e[22]||(e[22]=s("div",{class:"text-[11px] text-slate-300 mt-1"},"未配置 · 点击添加",-1))],8,Ke))),128))])]))),128)),d(s("div",{class:"ch-overlay",onClick:Q(w,["self"])},[s("div",Xe,[s("div",Ze,[s("div",es,[s("h3",ss,r(g.value?"编辑渠道":"添加渠道"),1),s("span",ts,r(u.value||"全局默认"),1)]),s("button",{class:"btn btn-ghost btn-xs",onClick:w},"✕ 关闭")]),s("section",ls,[e[27]||(e[27]=s("div",{class:"ed-section-title"},"渠道",-1)),s("div",ns,[s("div",null,[e[24]||(e[24]=s("span",{class:"ed-label"},[C("分发渠道 "),s("i",{class:"req"},"*")],-1)),d(s("select",{"onUpdate:modelValue":e[1]||(e[1]=t=>n.channel=t),disabled:g.value,class:"select select-bordered select-sm w-full"},[e[23]||(e[23]=s("option",{value:0,disabled:""},"请选择渠道",-1)),(i(),o(p,null,v(F,t=>s("optgroup",{key:t.label,label:t.label},[(i(!0),o(p,null,v(t.channels,a=>(i(),o("option",{key:a,value:a},r(y(a))+"("+r(a)+")",9,is))),128))],8,os)),64))],8,as),[[H,n.channel,void 0,{number:!0}]])]),s("div",null,[e[25]||(e[25]=s("span",{class:"ed-label"},"上架状态",-1)),d(s("select",{"onUpdate:modelValue":e[2]||(e[2]=t=>n.status=t),class:"select select-bordered select-sm w-full"},[(i(),o(p,null,v(j,t=>s("option",{key:t.v,value:t.v},r(t.label),9,rs)),64))],512),[[H,n.status,void 0,{number:!0}]])])]),s("div",ds,[e[26]||(e[26]=s("span",{class:"ed-label"},"描述",-1)),d(s("input",{"onUpdate:modelValue":e[3]||(e[3]=t=>n.description=t),class:"input input-bordered input-sm w-full",placeholder:"这个渠道包的说明"},null,512),[[x,n.description]])])]),s("section",us,[e[35]||(e[35]=s("div",{class:"ed-section-title"},"版本",-1)),s("div",cs,[s("div",null,[e[28]||(e[28]=s("span",{class:"ed-label"},"当前线上版本",-1)),d(s("input",{"onUpdate:modelValue":e[4]||(e[4]=t=>n.version=t),class:"input input-bordered input-sm w-full",placeholder:"如 1.4.2"},null,512),[[x,n.version]])]),s("div",null,[e[29]||(e[29]=s("span",{class:"ed-label"},"最低支持版本",-1)),d(s("input",{"onUpdate:modelValue":e[5]||(e[5]=t=>n.min_version=t),class:"input input-bordered input-sm w-full",placeholder:"低于它的客户端需更新"},null,512),[[x,n.min_version]])]),s("div",null,[e[30]||(e[30]=s("span",{class:"ed-label"},"审核中版本",-1)),d(s("input",{"onUpdate:modelValue":e[6]||(e[6]=t=>n.review_version=t),class:"input input-bordered input-sm w-full",placeholder:"过审后清空"},null,512),[[x,n.review_version]])])]),s("label",ps,[d(s("input",{"onUpdate:modelValue":e[7]||(e[7]=t=>n.force_update=t),type:"checkbox",class:"checkbox checkbox-sm checkbox-primary"},null,512),[[N,n.force_update]]),e[31]||(e[31]=s("span",null,"强制更新",-1)),e[32]||(e[32]=s("span",{class:"text-xs text-slate-400"},"低于「最低支持版本」的客户端必须更新才能继续使用",-1))]),S.value?(i(),o("p",vs,"⚠ "+r(S.value),1)):c("",!0),s("div",ms,[e[33]||(e[33]=s("span",{class:"ed-label"},"下载地址",-1)),d(s("input",{"onUpdate:modelValue":e[8]||(e[8]=t=>n.address=t),class:"input input-bordered input-sm w-full",placeholder:"应用商店链接或 apk 直链"},null,512),[[x,n.address]])]),s("div",bs,[e[34]||(e[34]=s("span",{class:"ed-label"},"更新日志",-1)),d(s("textarea",{"onUpdate:modelValue":e[9]||(e[9]=t=>n.changelog=t),class:"textarea textarea-bordered w-full text-xs",rows:"3",placeholder:"本次更新内容,会下发给客户端展示"},null,512),[[x,n.changelog]])])]),s("section",fs,[e[38]||(e[38]=s("div",{class:"ed-section-title"},"能力开关",-1)),s("div",xs,[s("label",ys,[d(s("input",{"onUpdate:modelValue":e[10]||(e[10]=t=>n.tourists=t),type:"checkbox",class:"checkbox checkbox-sm checkbox-primary"},null,512),[[N,n.tourists]]),e[36]||(e[36]=s("span",null,"允许游客登录",-1))]),s("label",ks,[d(s("input",{"onUpdate:modelValue":e[11]||(e[11]=t=>n.allowskipdevicebinding=t),type:"checkbox",class:"checkbox checkbox-sm checkbox-primary"},null,512),[[N,n.allowskipdevicebinding]]),e[37]||(e[37]=s("span",null,"允许跳过设备绑定",-1))])])]),s("section",gs,[e[41]||(e[41]=s("div",{class:"ed-section-title"},"支付渠道",-1)),s("div",hs,[(i(),o(p,null,v(L,t=>s("label",{key:t.key,class:O(["pay-item",{checked:$(t.key)}])},[s("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary",checked:$(t.key),onChange:a=>de(t.key)},null,40,_s),s("span",null,r(t.label),1),$(t.key)&&_(t.key)?(i(),o("span",ws,"未配凭据")):c("",!0)],2)),64))]),s("p",Cs,[e[39]||(e[39]=C(" 这里只决定「这个渠道开放哪几种支付入口」;商户号、密钥等凭据在 ",-1)),u.value?(i(),o("a",{key:0,class:"link",onClick:Q(Y,["prevent"])},"应用「"+r(u.value)+"」→ 业务功能配置 → 支付",1)):(i(),o("span",Vs,"各应用的「业务功能配置 → 支付」")),e[40]||(e[40]=C(" 里填。 ",-1))])]),s("div",Us,[s("label",As,[d(s("input",{"onUpdate:modelValue":e[12]||(e[12]=t=>n.enable=t),type:"checkbox",class:"checkbox checkbox-sm checkbox-primary"},null,512),[[N,n.enable]]),e[42]||(e[42]=s("span",null,"启用",-1)),e[43]||(e[43]=s("span",{class:"text-xs text-slate-400"},"停用后该渠道配置不下发客户端",-1))]),s("div",Ss,[g.value?(i(),o("button",{key:0,class:"btn btn-ghost btn-sm text-error mr-auto",onClick:ce},"删除")):c("",!0),s("button",{class:"btn btn-ghost btn-sm",onClick:w},"取消"),s("button",{class:"btn btn-primary btn-sm text-white",disabled:E.value,onClick:ue},"保存",8,Ps)])])])],512),[[be,A.value]])]))}}),Es=xe(Ns,[["__scopeId","data-v-6057a5c9"]]);export{Es as default};
|
|
|