(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[405],{5557:function(e,n,t){(window.__NEXT_P=window.__NEXT_P||[]).push(["/",function(){return t(9828)}])},6248:function(e,n,t){"use strict";t.d(n,{Z:function(){return o}});var a=t(5893),s=t(7294),c=t(1163),i=t(9415);let r=[{href:"/",label:"首页",icon:"home"},{href:"/stats",label:"统计",icon:"chart"},{href:"/recurring",label:"周期",icon:"repeat"},{href:"/categories",label:"分类",icon:"tags"}];function o(e){let{title:n,subtitle:t,actions:o,headerContent:l,children:u,contentClassName:d="",hideNav:m=!1,compactHeader:h=!1}=e,p=(0,c.useRouter)(),x=(0,s.useMemo)(()=>{let e=r.find(e=>e.href===p.pathname);return(null==e?void 0:e.href)||null},[p.pathname]),y=l||(n?(0,a.jsxs)("div",{className:"app-header__text",children:[(0,a.jsx)("h1",{children:n}),t?(0,a.jsx)("p",{children:t}):null]}):null),j=["app-header",h?"app-header--compact":"",y?"app-header--with-content":"app-header--actions-only",o?"app-header--with-actions":""].filter(Boolean).join(" ");return(0,a.jsxs)("div",{className:"app-shell".concat(m?" app-shell--standalone":""),children:[(0,a.jsx)("header",{className:j,children:(0,a.jsxs)("div",{className:"app-shell__container app-header__inner",children:[y?(0,a.jsx)("div",{className:"app-header__main",children:y}):(0,a.jsx)("div",{className:"app-header__spacer","aria-hidden":"true"}),o?(0,a.jsx)("div",{className:"app-header__actions",children:o}):null]})}),(0,a.jsx)("main",{className:"app-content ".concat(d).trim(),children:(0,a.jsx)("div",{className:"app-shell__container app-content__inner",children:u})}),m?null:(0,a.jsx)("nav",{className:"bottom-nav","aria-label":"主导航",children:(0,a.jsx)("div",{className:"app-shell__container bottom-nav__inner",children:r.map(e=>{let n=x===e.href;return(0,a.jsxs)("button",{type:"button",className:"bottom-nav__item".concat(n?" is-active":""),onClick:()=>p.push(e.href),"aria-current":n?"page":void 0,children:[(0,a.jsx)(i.J,{name:e.icon,size:20}),(0,a.jsx)("span",{children:e.label})]},e.href)})})})]})}},610:function(e,n,t){"use strict";async function a(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=await fetch("".concat("").concat(e),{...n,headers:{"Content-Type":"application/json",...function(){let e=localStorage.getItem("token");return e?{Authorization:"Bearer ".concat(e)}:{}}(),...n.headers}}),a=await t.json();if(!t.ok)throw Error(a.error||"请求失败");return a}async function s(e,n){let t=await a("/api/auth/login",{method:"POST",body:JSON.stringify({username:e,password:n})});return localStorage.setItem("token",t.token),t}async function c(e,n){let t=await a("/api/auth/register",{method:"POST",body:JSON.stringify({username:e,password:n})});return localStorage.setItem("token",t.token),t}function i(){localStorage.removeItem("token")}function r(){return!!localStorage.getItem("token")}async function o(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"all",t="/api/records?month=".concat(e);return"all"!==n&&(t+="&type=".concat(n)),a(t)}async function l(e){return a("/api/stats?month=".concat(e))}async function u(e){return a("/api/records",{method:"POST",body:JSON.stringify(e)})}async function d(e,n){return a("/api/records/".concat(e),{method:"PUT",body:JSON.stringify(n)})}async function m(e){return a("/api/records/".concat(e),{method:"DELETE"})}async function h(e){return a("/api/records/search?q=".concat(encodeURIComponent(e)))}async function p(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"month",n=arguments.length>1?arguments[1]:void 0,t="/api/stats/trend?period=".concat(e);return n&&(t+="&month=".concat(n)),a(t)}async function x(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"all",t="/api/stats/category?type=".concat(n);return e&&(t+="&month=".concat(e)),a(t)}async function y(){return a("/api/recurring")}async function j(e){return a("/api/recurring",{method:"POST",body:JSON.stringify(e)})}async function f(e,n){return a("/api/recurring/".concat(e),{method:"PUT",body:JSON.stringify(n)})}async function b(e){return a("/api/recurring/".concat(e),{method:"DELETE"})}async function g(e){return a("/api/recurring/".concat(e,"/apply"),{method:"POST"})}async function N(){return a("/api/categories")}async function D(e){return a("/api/categories",{method:"POST",body:JSON.stringify(e)})}async function v(e){return a("/api/categories/".concat(e),{method:"DELETE"})}async function C(){return a("/api/export")}async function S(e){return a("/api/import",{method:"POST",body:JSON.stringify(e)})}t.d(n,{Ap:function(){return x},CP:function(){return N},JS:function(){return m},Kp:function(){return h},Q6:function(){return o},TZ:function(){return b},Vn:function(){return y},Vs:function(){return d},Xu:function(){return g},ae:function(){return u},dk:function(){return S},fy:function(){return l},gR:function(){return p},jl:function(){return r},k4:function(){return D},kS:function(){return i},u1:function(){return C},uO:function(){return f},uu:function(){return v},x4:function(){return s},z0:function(){return j},z2:function(){return c}})},7063:function(e,n,t){"use strict";t.d(n,{S:function(){return a}});let a={expense:[{name:"餐饮",icon:"\uD83C\uDF5C"},{name:"买菜",icon:"\uD83E\uDD6C"},{name:"交通",icon:"\uD83D\uDE97"},{name:"购物",icon:"\uD83D\uDED2"},{name:"娱乐",icon:"\uD83C\uDFAE"},{name:"房租",icon:"\uD83C\uDFE0"},{name:"房贷",icon:"\uD83C\uDFE6"},{name:"亲情卡",icon:"\uD83D\uDCB3"},{name:"水电",icon:"\uD83D\uDCA7"},{name:"衣服",icon:"\uD83D\uDC54"},{name:"通讯",icon:"\uD83D\uDCF1"},{name:"日用品",icon:"\uD83E\uDDF4"},{name:"美妆",icon:"\uD83D\uDC84"},{name:"医疗",icon:"\uD83C\uDFE5"},{name:"养娃",icon:"\uD83D\uDC76"},{name:"家电",icon:"\uD83D\uDCFA"},{name:"家具",icon:"\uD83D\uDECB️"},{name:"装修",icon:"\uD83D\uDD28"},{name:"宠物",icon:"\uD83D\uDC15"},{name:"其他",icon:"\uD83D\uDCDD"}],income:[{name:"工资",icon:"\uD83D\uDCB0"},{name:"奖金",icon:"\uD83C\uDF81"},{name:"理财",icon:"\uD83D\uDCC8"},{name:"红包",icon:"\uD83E\uDDE7"},{name:"其他",icon:"\uD83D\uDCDD"}]}},9828:function(e,n,t){"use strict";t.r(n),t.d(n,{default:function(){return m}});var a=t(5893),s=t(7294),c=t(1163),i=t(610),r=t(7063),o=t(6248),l=t(9415),u=t(5546),d=t(8846);function m(){let e=(0,c.useRouter)(),{showToast:n}=(0,u.p)(),{confirm:t}=(0,d.N)(),[m,h]=(0,s.useState)(new Date),[p,x]=(0,s.useState)("all"),[y,j]=(0,s.useState)([]),[f,b]=(0,s.useState)({income:0,expense:0,balance:0}),[g,N]=(0,s.useState)(!1),[D,v]=(0,s.useState)(null),[C,S]=(0,s.useState)(!0),[_,k]=(0,s.useState)(!1),[w,E]=(0,s.useState)(!1),[J,O]=(0,s.useState)(""),[T,z]=(0,s.useState)({type:"expense",amount:"",category:"",date:new Date().toISOString().split("T")[0],time:new Date().toTimeString().slice(0,5),note:""});(0,s.useEffect)(()=>{if(!(0,i.jl)()){e.push("/login");return}M()},[e,m,p]);let F=e=>"".concat(e.getFullYear(),"-").concat(String(e.getMonth()+1).padStart(2,"0")),P=e=>(e||0).toFixed(2),I=()=>({type:"expense",amount:"",category:"",date:new Date().toISOString().split("T")[0],time:new Date().toTimeString().slice(0,5),note:""}),M=async()=>{S(!0);try{let[e,n]=await Promise.all([(0,i.Q6)(F(m),p),(0,i.fy)(F(m))]);j(e),b(n)}catch(e){console.error(e),n(e.message,{tone:"error"})}finally{S(!1)}},L=e=>{x(e===p?"all":e)},A=()=>{v(null),z(I()),O(""),N(!0)},B=e=>{let[n,t]=e.date.split(" ");v(e),z({type:e.type,amount:e.amount.toString(),category:e.category,date:n,time:t||"00:00",note:e.note||""}),O(""),N(!0)},R=()=>{_||w||(N(!1),v(null),O(""))},q=async e=>{if(e.preventDefault(),!T.amount||!T.category||!T.date){O("请填写完整信息");return}k(!0),O("");try{let e={type:T.type,amount:parseFloat(T.amount),category:T.category,date:"".concat(T.date," ").concat(T.time||"00:00"),note:T.note};D?(await (0,i.Vs)(D.id,e),n("记录已更新",{tone:"success"})):(await (0,i.ae)(e),n("记录已添加",{tone:"success"})),R(),await M()}catch(e){O(e.message),n(e.message,{tone:"error"})}finally{k(!1)}},U=async()=>{if(D&&await t({title:"删除这条记录?",description:"删除后将无法恢复,请确认是否继续。",confirmText:"删除"})){E(!0);try{await (0,i.JS)(D.id),R(),n("记录已删除",{tone:"success"}),await M()}catch(e){O(e.message),n(e.message,{tone:"error"})}finally{E(!1)}}},V=y.reduce((e,n)=>{let t=n.date.split(" ")[0];return e[t]||(e[t]=[]),e[t].push(n),e},{}),X=Object.keys(V).sort((e,n)=>n.localeCompare(e)),Z=e=>V[e].filter(e=>"expense"===e.type).reduce((e,n)=>e+n.amount,0),Q=(0,a.jsxs)("div",{className:"header-center-container",children:[(0,a.jsx)("div",{className:"header-left-actions",children:(0,a.jsx)("button",{type:"button",className:"icon-button","aria-label":"搜索记录",onClick:()=>e.push("/search"),children:(0,a.jsx)(l.J,{name:"search",size:18})})}),(0,a.jsxs)("div",{className:"month-switcher-container",children:[(0,a.jsx)("button",{type:"button",className:"icon-button","aria-label":"上个月",onClick:()=>{let e=new Date(m);e.setMonth(e.getMonth()-1),h(e)},children:(0,a.jsx)(l.J,{name:"chevronLeft",size:18})}),(0,a.jsx)("span",{className:"month-switcher__label",children:"".concat(m.getFullYear(),"年").concat(m.getMonth()+1,"月")}),(0,a.jsx)("button",{type:"button",className:"icon-button","aria-label":"下个月",onClick:()=>{let e=new Date(m);e.setMonth(e.getMonth()+1),h(e)},children:(0,a.jsx)(l.J,{name:"chevronRight",size:18})})]}),(0,a.jsx)("div",{className:"header-right-actions",children:(0,a.jsx)("button",{type:"button",className:"icon-button","aria-label":"设置",onClick:()=>e.push("/settings"),children:(0,a.jsx)(l.J,{name:"settings",size:18})})})]}),Y=(0,a.jsxs)("div",{className:"header-center-container",children:[(0,a.jsx)("div",{className:"header-left-actions",children:(0,a.jsx)("button",{type:"button",className:"icon-button","aria-label":"关闭",onClick:R,children:(0,a.jsx)(l.J,{name:"chevronLeft",size:18})})}),(0,a.jsx)("div",{className:"modal-title-container",children:(0,a.jsx)("span",{className:"modal-title",children:D?"编辑记录":"新增记录"})}),(0,a.jsx)("div",{className:"header-right-actions"})]});return(0,a.jsxs)(o.Z,{headerContent:g?Y:Q,compactHeader:!0,hideNav:g,children:[(0,a.jsx)("section",{className:"dashboard-hero card",children:(0,a.jsxs)("div",{className:"stats-grid stats-grid--hero",children:[(0,a.jsxs)("button",{type:"button",className:"stat-card ".concat("income"===p?"active":""),onClick:()=>L("income"),children:[(0,a.jsx)("span",{className:"label",children:"收入"}),(0,a.jsxs)("span",{className:"value income",children:["+",P(f.income)]})]}),(0,a.jsxs)("button",{type:"button",className:"stat-card ".concat("expense"===p?"active":""),onClick:()=>L("expense"),children:[(0,a.jsx)("span",{className:"label",children:"支出"}),(0,a.jsxs)("span",{className:"value expense",children:["-",P(f.expense)]})]}),(0,a.jsxs)("button",{type:"button",className:"stat-card stat-card--balance",onClick:()=>L("all"),children:[(0,a.jsx)("span",{className:"label",children:"结余"}),(0,a.jsx)("span",{className:"value",children:P(f.balance)})]})]})}),(0,a.jsxs)("section",{className:"card section-card",children:[(0,a.jsxs)("div",{className:"section-heading section-heading--compact",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"eyebrow",children:"记录列表"}),(0,a.jsx)("h2",{children:"all"===p?"全部记录":"income"===p?"仅看收入":"仅看支出"})]}),(0,a.jsx)("button",{type:"button",className:"btn btn-secondary btn-inline",onClick:A,children:(0,a.jsxs)("span",{className:"button-content",children:[(0,a.jsx)(l.J,{name:"plus",size:16}),"新增记录"]})})]}),C?(0,a.jsx)("div",{className:"loading-state",children:"加载中..."}):0===y.length?(0,a.jsxs)("div",{className:"empty-state empty-state--card",children:[(0,a.jsx)("div",{className:"empty-state__icon",children:(0,a.jsx)(l.J,{name:"info",size:24})}),(0,a.jsx)("p",{children:"暂无记录,点击上方按钮添加。"})]}):(0,a.jsx)("div",{className:"records-list records-list--flush",children:X.map(e=>(0,a.jsxs)("div",{className:"date-group",children:[(0,a.jsxs)("div",{className:"date-label",children:[(0,a.jsx)("span",{children:new Date(e).toLocaleDateString("zh-CN",{month:"short",day:"numeric",weekday:"short"})}),(0,a.jsxs)("span",{className:"day-expense",children:["支出 ",P(Z(e))]})]}),V[e].map(e=>{let n=r.S[e.type].find(n=>n.name===e.category)||{icon:"\uD83D\uDCDD"};return(0,a.jsxs)("button",{type:"button",className:"record-item",onClick:()=>B(e),children:[(0,a.jsxs)("div",{className:"record-left",children:[(0,a.jsx)("div",{className:"record-icon",children:n.icon}),(0,a.jsxs)("div",{className:"record-info",children:[(0,a.jsx)("div",{className:"record-category",children:e.category}),e.note&&(0,a.jsx)("div",{className:"record-note",children:e.note})]})]}),(0,a.jsxs)("div",{className:"record-amount ".concat(e.type),children:["income"===e.type?"+":"-",P(e.amount)]})]},e.id)})]},e))})]}),(0,a.jsx)("button",{type:"button",className:"fab","aria-label":"新增记录",onClick:A,children:(0,a.jsx)(l.J,{name:"plus",size:24})}),g&&(0,a.jsx)("div",{className:"modal-overlay modal-overlay--fullscreen",onClick:R,children:(0,a.jsxs)("div",{className:"modal modal--fullscreen",onClick:e=>e.stopPropagation(),children:[(0,a.jsxs)("div",{className:"modal-header",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"eyebrow",children:D?"编辑记录":"新增记录"}),D?(0,a.jsx)("h2",{children:"更新账目"}):null]}),(0,a.jsx)("button",{type:"button",className:"icon-button icon-button--ghost","aria-label":"关闭弹窗",onClick:R,children:(0,a.jsx)(l.J,{name:"close",size:18})})]}),J&&(0,a.jsx)("div",{className:"error-msg",children:J}),(0,a.jsxs)("form",{onSubmit:q,children:[(0,a.jsxs)("div",{className:"type-switch",children:[(0,a.jsx)("button",{type:"button",className:"type-btn expense ".concat("expense"===T.type?"active":""),onClick:()=>z({...T,type:"expense",category:""}),disabled:_||w,children:"支出"}),(0,a.jsx)("button",{type:"button",className:"type-btn income ".concat("income"===T.type?"active":""),onClick:()=>z({...T,type:"income",category:""}),disabled:_||w,children:"收入"})]}),(0,a.jsxs)("div",{className:"form-group",children:[(0,a.jsx)("label",{htmlFor:"record-amount",children:"金额"}),(0,a.jsx)("input",{id:"record-amount",type:"number",className:"amount-input",value:T.amount,onChange:e=>z({...T,amount:e.target.value}),placeholder:"0.00",step:"0.01",required:!0,disabled:_||w})]}),(0,a.jsxs)("div",{className:"form-group",children:[(0,a.jsx)("label",{children:"分类"}),(0,a.jsx)("div",{className:"category-grid",children:r.S[T.type].map(e=>(0,a.jsxs)("button",{type:"button",className:"category-btn ".concat(T.category===e.name?"active":""),onClick:()=>z({...T,category:e.name}),disabled:_||w,children:[(0,a.jsx)("span",{className:"icon",children:e.icon}),(0,a.jsx)("span",{children:e.name})]},e.name))})]}),(0,a.jsxs)("div",{className:"form-group",children:[(0,a.jsx)("label",{children:"日期"}),(0,a.jsxs)("div",{className:"datetime-picker",children:[(0,a.jsx)("input",{type:"date",value:T.date,onChange:e=>z({...T,date:e.target.value}),required:!0,disabled:_||w}),(0,a.jsx)("input",{type:"time",value:T.time||"00:00",onChange:e=>z({...T,time:e.target.value}),disabled:_||w})]})]}),(0,a.jsxs)("div",{className:"form-group",children:[(0,a.jsx)("label",{htmlFor:"record-note",children:"备注(可选)"}),(0,a.jsx)("input",{id:"record-note",type:"text",value:T.note,onChange:e=>z({...T,note:e.target.value}),placeholder:"添加备注...",disabled:_||w})]}),(0,a.jsxs)("div",{className:"modal-actions",children:[(0,a.jsx)("button",{type:"submit",className:"btn btn-primary",disabled:_||w,children:_?(0,a.jsxs)("span",{className:"button-content",children:[(0,a.jsx)(l.J,{name:"spinner",size:16,className:"is-spinning"}),"保存中..."]}):"保存"}),D&&(0,a.jsx)("button",{type:"button",className:"btn btn-danger",onClick:U,disabled:_||w,children:w?"删除中...":"删除"})]})]})]})})]})}},1163:function(e,n,t){e.exports=t(3079)}},function(e){e.O(0,[888,774,179],function(){return e(e.s=5557)}),_N_E=e.O()}]);