Files
YelayMaths/yelaymaths_admin/.next/server/chunks/681.js
T
2026-09-29 15:25:40 +08:00

1 line
12 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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))}};