1 line
12 KiB
JavaScript
1 line
12 KiB
JavaScript
exports.id=681,exports.ids=[681],exports.modules={702:(a,b,c)=>{"use strict";c.d(b,{F:()=>h});var d=c(1278);let e="http://127.0.0.1:3000".replace(/\/+$/,"");async function f(a,b={}){let c,g=(0,d.gf)(),h={"content-type":"application/json",...b.headers??{}};g&&(h.Authorization=`Bearer ${g}`);try{c=await fetch(`${e}${a}`,{...b,headers:h})}catch{throw{code:-1,message:"无法连接服务端,请检查网络或接口地址"}}let i=null;try{i=await c.json()}catch{throw{code:-1,message:`服务端返回异常(HTTP ${c.status})`}}if(401===c.status)throw(0,d.L)(),{code:i?.code??2e3,message:i?.message??"登录已失效,请重新登录"};if(!i||0!==i.code)throw{code:i?.code??-1,message:i?.message??"请求失败"};return i.data}let g=a=>{let b=Object.entries(a).filter(([,a])=>void 0!==a&&""!==a).map(([a,b])=>`${encodeURIComponent(a)}=${encodeURIComponent(String(b))}`);return b.length?`?${b.join("&")}`:""},h={base:e,request:f,login:(a,b)=>f("/admin/v1/auth/login",{method:"POST",body:JSON.stringify({username:a,password:b})}),bootstrap:(a,b)=>f("/admin/v1/auth/bootstrap",{method:"POST",body:JSON.stringify({username:a,password:b})}),stats:()=>f("/admin/v1/stats"),listUsers:(a,b,c)=>f(`/admin/v1/users${g({page:a,pageSize:b,keyword:c})}`),updateUser:(a,b)=>f(`/admin/v1/users/${a}`,{method:"PATCH",body:JSON.stringify(b)}),listResource:(a,b)=>f(`/admin/v1/data/${a}${g(b)}`),createResource:(a,b)=>f(`/admin/v1/data/${a}`,{method:"POST",body:JSON.stringify(b)}),updateResource:(a,b,c)=>f(`/admin/v1/data/${a}/${b}`,{method:"PATCH",body:JSON.stringify(c)}),deleteResource:(a,b)=>f(`/admin/v1/data/${a}/${b}`,{method:"DELETE"}),listSettings:()=>f("/admin/v1/settings"),upsertSetting:(a,b,c)=>f("/admin/v1/settings",{method:"PUT",body:JSON.stringify({key:a,value:b,remark:c})}),listOrders:(a,b,c)=>f(`/admin/v1/orders${g({page:a,pageSize:b,status:c})}`),refundOrder:(a,b)=>f(`/admin/v1/orders/${a}/refund`,{method:"POST",body:JSON.stringify({reason:b})}),listEntitlements:a=>f(`/admin/v1/entitlements${g({userId:a})}`),grantEntitlement:(a,b,c)=>f("/admin/v1/entitlements",{method:"POST",body:JSON.stringify({userId:a,courseId:b,note:c})}),revokeEntitlement:(a,b)=>f(`/admin/v1/entitlements${g({userId:a,courseId:b})}`,{method:"DELETE"})}},1242:(a,b,c)=>{Promise.resolve().then(c.bind(c,8571))},1278:(a,b,c)=>{"use strict";c.d(b,{L:()=>g,M3:()=>h,WG:()=>f,gf:()=>e});let d="yelay_admin_token";function e(){return""}function f(a){window.localStorage.setItem(d,a)}function g(){window.localStorage.removeItem(d)}function h(){return!1}},1669:()=>{},2837:()=>{},3178:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,1094,23)),Promise.resolve().then(c.t.bind(c,1065,23)),Promise.resolve().then(c.t.bind(c,3313,23)),Promise.resolve().then(c.t.bind(c,3016,23)),Promise.resolve().then(c.t.bind(c,3944,23)),Promise.resolve().then(c.t.bind(c,5708,23)),Promise.resolve().then(c.t.bind(c,9516,23)),Promise.resolve().then(c.t.bind(c,1597,23)),Promise.resolve().then(c.bind(c,3852))},3384:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>f,metadata:()=>e});var d=c(8936);c(2837);let e={title:"叶雷讲数学 \xb7 管理后台",description:"课程、订单与用户管理"};function f({children:a}){return(0,d.jsx)("html",{lang:"zh-CN",children:(0,d.jsx)("body",{className:"min-h-screen",children:a})})}},3665:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>d});let d=(0,c(6076).registerClientReference)(function(){throw Error("Attempted to call the default export of \"/Users/tianmokeji/Desktop/YelayMaths/yelaymaths_admin/src/app/(admin)/layout.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/Users/tianmokeji/Desktop/YelayMaths/yelaymaths_admin/src/app/(admin)/layout.tsx","default")},4251:(a,b,c)=>{"use strict";c.d(b,{MW:()=>g,le:()=>f,u_:()=>h});let d={name:"status",label:"状态",type:"select",options:[{value:1,label:"启用"},{value:0,label:"停用"}]},e={name:"sort_order",label:"排序",type:"number",hideInTable:!0},f=[{key:"courses",title:"课程",description:"付费课程。注意 code 是视频目录名与封面名,创建后不可修改。",fields:[{name:"code",label:"课程标识",type:"text",immutable:!0,hint:"64 位哈希,对应视频目录"},{name:"title",label:"课程名称",type:"text"},{name:"intro",label:"课程介绍",type:"text"},{name:"price_fen",label:"价格(分)",type:"number"},{name:"cover_image",label:"封面文件",type:"text",hideInTable:!0},d,e]},{key:"lessons",title:"课时",description:"课程下的视频。chapter_id 与 play_id 参与视频路径拼接,改动会使旧地址失效。",filterByCourse:!0,fields:[{name:"course_id",label:"课程 ID",type:"number"},{name:"chapter_id",label:"章节 ID",type:"text"},{name:"play_id",label:"播放 ID",type:"text"},{name:"chapter_title",label:"章节名称",type:"text"},{name:"lesson_title",label:"视频名称",type:"text"},{name:"duration",label:"时长",type:"text"},{name:"published_at",label:"发布日期",type:"date"},e]},{key:"home-courses",title:"首页新课",description:"首页「新课上线」的长图页面。course_name 决定图片路径,不要改动。",fields:[{name:"course_name",label:"条目名称",type:"text",hint:"对应 Images/NewCourse/{名称}.png"},{name:"intro",label:"简介",type:"text"},{name:"course_id",label:"关联课程 ID",type:"number",hint:"留空则长图页不显示购买按钮"},{name:"content",label:"长图内容",type:"textarea",hideInTable:!0},{name:"published_at",label:"发布日期",type:"date",hideInTable:!0},d,e]},{key:"home-free-courses",title:"首页试听",description:"首页「自我学习」入口。course_name 决定图片路径。",fields:[{name:"series_no",label:"序号",type:"number",hint:"对应免费试听课的 series_no"},{name:"course_name",label:"条目名称",type:"text"},{name:"intro",label:"简介",type:"text"},d,e]},{key:"banners",title:"轮播图",description:"首页顶部轮播。filename 对应 Images/Banner/{文件名}。",fields:[{name:"filename",label:"图片文件名",type:"text"},d,e]},{key:"articles",title:"知识速通",description:"首页「知识速通」文章。legacy_page_id 对应缩略图 WebPages/{id}.png。",fields:[{name:"title",label:"标题",type:"text"},{name:"legacy_page_id",label:"图片编号",type:"text"},{name:"intro",label:"简介",type:"text"},{name:"publisher",label:"发布人",type:"text",hideInTable:!0},{name:"content",label:"正文",type:"textarea",hideInTable:!0},{name:"published_at",label:"发布日期",type:"date"},d,e]},{key:"products",title:"支付商品",description:"课程与微信虚拟支付道具的映射。微信道具 ID 与价格必须先在小程序后台创建。",fields:[{name:"course_id",label:"课程 ID",type:"number"},{name:"wx_product_id",label:"微信道具 ID",type:"text"},{name:"name",label:"商品名称",type:"text"},{name:"price_fen",label:"价格(分)",type:"text"},d]}],g=a=>f.find(b=>b.key===a),h={0:"待支付",1:"已支付",2:"已开通",3:"已退款",4:"已关闭"}},4939:(a,b,c)=>{"use strict";c.d(b,{$T:()=>k,$n:()=>e,Sv:()=>l,TM:()=>g,Zp:()=>i,aF:()=>j,l6:()=>h,pd:()=>f});var d=c(3910);function e({children:a,onClick:b,variant:c="primary",disabled:e,type:f="button"}){return(0,d.jsx)("button",{type:f,onClick:b,disabled:e,className:`rounded-md px-3 py-1.5 text-sm font-medium transition disabled:cursor-not-allowed disabled:opacity-50 ${{primary:"bg-blue-600 text-white hover:bg-blue-700",ghost:"bg-white text-gray-700 border border-gray-300 hover:bg-gray-50",danger:"bg-red-600 text-white hover:bg-red-700"}[c]}`,children:a})}function f({value:a,onChange:b,placeholder:c,type:e="text"}){return(0,d.jsx)("input",{type:e,value:a,placeholder:c,onChange:a=>b(a.target.value),className:"w-full rounded-md border border-gray-300 px-3 py-1.5 text-sm outline-none focus:border-blue-500"})}function g({value:a,onChange:b}){return(0,d.jsx)("textarea",{value:a,rows:6,onChange:a=>b(a.target.value),className:"w-full rounded-md border border-gray-300 px-3 py-1.5 font-mono text-xs outline-none focus:border-blue-500"})}function h({value:a,onChange:b,options:c}){return(0,d.jsx)("select",{value:a,onChange:a=>b(a.target.value),className:"w-full rounded-md border border-gray-300 px-3 py-1.5 text-sm outline-none focus:border-blue-500",children:c.map(a=>(0,d.jsx)("option",{value:String(a.value),children:a.label},a.value))})}function i({title:a,children:b,action:c}){return(0,d.jsxs)("section",{className:"rounded-lg border border-gray-200 bg-white p-5 shadow-sm",children:[(a||c)&&(0,d.jsxs)("header",{className:"mb-4 flex items-center justify-between",children:[a&&(0,d.jsx)("h2",{className:"text-base font-semibold text-gray-900",children:a}),c]}),b]})}function j({open:a,title:b,onClose:c,children:e,footer:f}){return a?(0,d.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4",children:(0,d.jsxs)("div",{className:"max-h-[85vh] w-full max-w-2xl overflow-auto rounded-lg bg-white shadow-xl",children:[(0,d.jsxs)("header",{className:"flex items-center justify-between border-b border-gray-200 px-5 py-3",children:[(0,d.jsx)("h3",{className:"text-base font-semibold",children:b}),(0,d.jsx)("button",{onClick:c,className:"text-gray-400 hover:text-gray-600","aria-label":"关闭",children:"✕"})]}),(0,d.jsx)("div",{className:"px-5 py-4",children:e}),f&&(0,d.jsx)("footer",{className:"flex justify-end gap-2 border-t border-gray-200 px-5 py-3",children:f})]})}):null}function k({message:a,kind:b="error"}){return a?(0,d.jsx)("div",{className:`mb-3 rounded-md border px-3 py-2 text-sm ${"error"===b?"bg-red-50 text-red-700 border-red-200":"bg-green-50 text-green-700 border-green-200"}`,children:a}):null}function l({text:a="暂无数据"}){return(0,d.jsx)("div",{className:"py-10 text-center text-sm text-gray-400",children:a})}},6738:(a,b,c)=>{Promise.resolve().then(c.bind(c,3665))},8101:()=>{},8571:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>l});var d=c(3910),e=c(8823),f=c(4813),g=c.n(f),h=c(64),i=c(1278),j=c(4251);let k=[{href:"/",label:"数据看板"},{href:"/users",label:"用户"},{href:"/orders",label:"订单"},{href:"/settings",label:"系统配置"}];function l({children:a}){let b=(0,h.useRouter)(),c=(0,h.usePathname)(),[f,g]=(0,e.useState)(!1);return f?(0,d.jsxs)("div",{className:"flex min-h-screen",children:[(0,d.jsxs)("aside",{className:"w-56 shrink-0 border-r border-gray-200 bg-white",children:[(0,d.jsxs)("div",{className:"border-b border-gray-200 px-4 py-4",children:[(0,d.jsx)("div",{className:"text-sm font-semibold text-gray-900",children:"叶雷讲数学"}),(0,d.jsx)("div",{className:"text-xs text-gray-400",children:"管理后台"})]}),(0,d.jsxs)("nav",{className:"p-2",children:[k.map(a=>(0,d.jsx)(m,{href:a.href,label:a.label,active:c===a.href},a.href)),(0,d.jsx)("div",{className:"px-3 pt-4 pb-1 text-xs text-gray-400",children:"内容管理"}),j.le.map(a=>(0,d.jsx)(m,{href:`/${a.key}`,label:a.title,active:c===`/${a.key}`},a.key))]}),(0,d.jsx)("div",{className:"border-t border-gray-200 p-2",children:(0,d.jsx)("button",{onClick:()=>{(0,i.L)(),b.replace("/login")},className:"w-full rounded-md px-3 py-2 text-left text-sm text-gray-600 hover:bg-gray-100",children:"退出登录"})})]}),(0,d.jsx)("main",{className:"flex-1 p-6",children:a})]}):(0,d.jsx)("div",{className:"flex min-h-screen items-center justify-center text-sm text-gray-400",children:"加载中…"})}function m({href:a,label:b,active:c}){return(0,d.jsx)(g(),{href:a,className:`block rounded-md px-3 py-2 text-sm transition ${c?"bg-blue-50 font-medium text-blue-700":"text-gray-600 hover:bg-gray-100"}`,children:b})}},9618:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,9268,23)),Promise.resolve().then(c.t.bind(c,2799,23)),Promise.resolve().then(c.t.bind(c,8243,23)),Promise.resolve().then(c.t.bind(c,1062,23)),Promise.resolve().then(c.t.bind(c,1026,23)),Promise.resolve().then(c.t.bind(c,6902,23)),Promise.resolve().then(c.t.bind(c,2678,23)),Promise.resolve().then(c.t.bind(c,2803,23)),Promise.resolve().then(c.t.bind(c,6022,23))}}; |