Initial commit: accountbook project
- Node.js backend server - Frontend application - Backup script - Project specification Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
+27
@@ -0,0 +1,27 @@
|
|||||||
|
# Dependencies
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
# Database
|
||||||
|
*.db
|
||||||
|
*.sqlite
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# Environment
|
||||||
|
.env
|
||||||
|
.env.local
|
||||||
|
|
||||||
|
# Build output
|
||||||
|
dist/
|
||||||
|
build/
|
||||||
|
|
||||||
|
# IDE
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
|
||||||
|
# OS
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
@@ -0,0 +1,183 @@
|
|||||||
|
# 记账网站 - 技术规范
|
||||||
|
|
||||||
|
## 1. 项目概述
|
||||||
|
|
||||||
|
- **项目名称**: 简易记账本
|
||||||
|
- **项目类型**: Web 应用
|
||||||
|
- **核心功能**: 用户注册登录、记录收支、查看账目明细和统计
|
||||||
|
- **目标用户**: 个人用户,需要简单易用的记账工具
|
||||||
|
|
||||||
|
## 2. 技术栈
|
||||||
|
|
||||||
|
- **后端**: Node.js + Express
|
||||||
|
- **数据库**: SQLite (轻量级,无需额外安装)
|
||||||
|
- **前端**: 原生 HTML/CSS/JavaScript (保持简单)
|
||||||
|
- **认证**: JWT Token
|
||||||
|
- **端口**: 3500
|
||||||
|
|
||||||
|
## 3. UI/UX 规范
|
||||||
|
|
||||||
|
### 3.1 布局结构
|
||||||
|
|
||||||
|
- **移动端优先设计**
|
||||||
|
- 顶部导航栏 (固定)
|
||||||
|
- 主要内容区域 (可滚动)
|
||||||
|
- 底部操作栏 (新增按钮)
|
||||||
|
|
||||||
|
### 3.2 视觉设计
|
||||||
|
|
||||||
|
**色彩方案**
|
||||||
|
- 主色: `#2563eb` (蓝色)
|
||||||
|
- 背景: `#f8fafc` (浅灰白)
|
||||||
|
- 卡片背景: `#ffffff`
|
||||||
|
- 文字主色: `#1e293b`
|
||||||
|
- 文字次色: `#64748b`
|
||||||
|
- 收入: `#10b981` (绿色)
|
||||||
|
- 支出: `#ef4444` (红色)
|
||||||
|
- 边框: `#e2e8f0`
|
||||||
|
|
||||||
|
**字体**
|
||||||
|
- 主字体: `"PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif`
|
||||||
|
- 数字字体: `"SF Mono", Monaco, monospace`
|
||||||
|
|
||||||
|
**间距系统**
|
||||||
|
- 基础单位: 4px
|
||||||
|
- 小间距: 8px
|
||||||
|
- 中间距: 16px
|
||||||
|
- 大间距: 24px
|
||||||
|
|
||||||
|
**圆角**
|
||||||
|
- 卡片: 12px
|
||||||
|
- 按钮: 8px
|
||||||
|
- 输入框: 8px
|
||||||
|
|
||||||
|
### 3.3 页面结构
|
||||||
|
|
||||||
|
**登录/注册页面**
|
||||||
|
- Logo + 标题
|
||||||
|
- 用户名输入框
|
||||||
|
- 密码输入框
|
||||||
|
- 登录/注册按钮
|
||||||
|
- 切换登录/注册链接
|
||||||
|
|
||||||
|
**主页面**
|
||||||
|
- 顶部: 月份选择 + 退出登录
|
||||||
|
- 概要卡片: 本月收入/支出/结余
|
||||||
|
- 账目列表: 按日期分组显示
|
||||||
|
- 底部: 新增按钮 (固定)
|
||||||
|
|
||||||
|
**新增账目弹窗**
|
||||||
|
- 类型切换 (收入/支出)
|
||||||
|
- 金额输入
|
||||||
|
- 分类选择
|
||||||
|
- 日期选择
|
||||||
|
- 备注输入
|
||||||
|
- 保存按钮
|
||||||
|
|
||||||
|
### 3.4 组件
|
||||||
|
|
||||||
|
**账目卡片**
|
||||||
|
- 左侧: 分类图标 + 描述
|
||||||
|
- 右侧: 金额 (收入绿色/支出红色)
|
||||||
|
- 点击可编辑/删除
|
||||||
|
|
||||||
|
**分类图标**
|
||||||
|
- 餐饮: 🍜
|
||||||
|
- 交通: 🚗
|
||||||
|
- 购物: 🛒
|
||||||
|
- 工资: 💰
|
||||||
|
- 其他: 📝
|
||||||
|
|
||||||
|
**动画效果**
|
||||||
|
- 页面切换: 淡入淡出 200ms
|
||||||
|
- 弹窗: 缩放进入 200ms
|
||||||
|
- 列表项: 滑入 150ms
|
||||||
|
|
||||||
|
## 4. 功能规范
|
||||||
|
|
||||||
|
### 4.1 用户系统
|
||||||
|
|
||||||
|
**注册**
|
||||||
|
- 用户名 (3-20字符,字母数字)
|
||||||
|
- 密码 (6-20字符)
|
||||||
|
- 用户名唯一性检查
|
||||||
|
|
||||||
|
**登录**
|
||||||
|
- 用户名 + 密码
|
||||||
|
- 返回 JWT Token
|
||||||
|
- Token 有效期 7 天
|
||||||
|
|
||||||
|
### 4.2 账目管理
|
||||||
|
|
||||||
|
**新增账目**
|
||||||
|
- 类型: 收入/支出
|
||||||
|
- 金额: 正数
|
||||||
|
- 分类: 预设分类
|
||||||
|
- 日期: 默认为今天
|
||||||
|
- 备注: 可选
|
||||||
|
|
||||||
|
**编辑账目**
|
||||||
|
- 可修改所有字段
|
||||||
|
- 删除账目
|
||||||
|
|
||||||
|
**查看账目**
|
||||||
|
- 按月份筛选
|
||||||
|
- 按类型筛选 (收入/支出/全部)
|
||||||
|
- 按日期倒序排列
|
||||||
|
|
||||||
|
### 4.3 数据统计
|
||||||
|
|
||||||
|
**月度统计**
|
||||||
|
- 本月总收入
|
||||||
|
- 本月总支出
|
||||||
|
- 本月结余
|
||||||
|
|
||||||
|
## 5. API 规范
|
||||||
|
|
||||||
|
### 认证接口
|
||||||
|
- `POST /api/auth/register` - 注册
|
||||||
|
- `POST /api/auth/login` - 登录
|
||||||
|
|
||||||
|
### 账目接口
|
||||||
|
- `GET /api/records` - 获取账目列表 (支持 month 参数)
|
||||||
|
- `POST /api/records` - 新增账目
|
||||||
|
- `PUT /api/records/:id` - 更新账目
|
||||||
|
- `DELETE /api/records/:id` - 删除账目
|
||||||
|
- `GET /api/stats` - 获取月度统计
|
||||||
|
|
||||||
|
## 6. 数据库设计
|
||||||
|
|
||||||
|
### users 表
|
||||||
|
```sql
|
||||||
|
CREATE TABLE users (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
username TEXT UNIQUE NOT NULL,
|
||||||
|
password TEXT NOT NULL,
|
||||||
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
### records 表
|
||||||
|
```sql
|
||||||
|
CREATE TABLE records (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
user_id INTEGER NOT NULL,
|
||||||
|
type TEXT NOT NULL CHECK(type IN ('income', 'expense')),
|
||||||
|
amount REAL NOT NULL,
|
||||||
|
category TEXT NOT NULL,
|
||||||
|
date DATE NOT NULL,
|
||||||
|
note TEXT,
|
||||||
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7. 验收标准
|
||||||
|
|
||||||
|
1. ✅ 用户可以注册新账号
|
||||||
|
2. ✅ 用户可以登录系统
|
||||||
|
3. ✅ 登录后可查看月度账目统计
|
||||||
|
4. ✅ 可以新增收入/支出记录
|
||||||
|
5. ✅ 可以编辑和删除记录
|
||||||
|
6. ✅ 移动端界面正常显示和操作
|
||||||
|
7. ✅ 通过 ip:3500 访问
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# 记账本定时备份脚本
|
||||||
|
# 备份目录: /opt/backup/data/YYYYMMDD/accountbook
|
||||||
|
|
||||||
|
# 配置
|
||||||
|
SOURCE_DIR="/opt/accountbook"
|
||||||
|
BACKUP_ROOT="/opt/backup/data"
|
||||||
|
DATE=$(date +%Y%m%d)
|
||||||
|
BACKUP_DIR="${BACKUP_ROOT}/${DATE}/accountbook"
|
||||||
|
|
||||||
|
# 创建备份目录
|
||||||
|
mkdir -p "${BACKUP_DIR}"
|
||||||
|
|
||||||
|
# 备份数据库文件
|
||||||
|
if [ -f "${SOURCE_DIR}/accountbook.db" ]; then
|
||||||
|
cp "${SOURCE_DIR}/accountbook.db" "${BACKUP_DIR}/accountbook.db"
|
||||||
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 数据库已备份: ${BACKUP_DIR}/accountbook.db"
|
||||||
|
else
|
||||||
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 警告: 数据库文件不存在"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 备份源代码 (可选 - 根据需求可注释掉)
|
||||||
|
if [ -d "${SOURCE_DIR}/public" ]; then
|
||||||
|
cp -r "${SOURCE_DIR}/public" "${BACKUP_DIR}/"
|
||||||
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] public 目录已备份"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 备份前端代码
|
||||||
|
if [ -d "${SOURCE_DIR}/frontend" ]; then
|
||||||
|
cp -r "${SOURCE_DIR}/frontend" "${BACKUP_DIR}/"
|
||||||
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] frontend 目录已备份"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 备份配置文件
|
||||||
|
if [ -f "${SOURCE_DIR}/package.json" ]; then
|
||||||
|
cp "${SOURCE_DIR}/package.json" "${BACKUP_DIR}/"
|
||||||
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] package.json 已备份"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 备份完成: ${BACKUP_DIR}"
|
||||||
|
|
||||||
|
# 清理30天前的旧备份
|
||||||
|
find "${BACKUP_ROOT}" -type d -name "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]" -mtime +30 -exec rm -rf {} \; 2>/dev/null
|
||||||
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 30天前的旧备份已清理"
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
qLhTs8_S85rjOOeVUp07g
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
{
|
||||||
|
"polyfillFiles": [
|
||||||
|
"static/chunks/polyfills-42372ed130431b0a.js"
|
||||||
|
],
|
||||||
|
"devFiles": [],
|
||||||
|
"ampDevFiles": [],
|
||||||
|
"lowPriorityFiles": [
|
||||||
|
"static/qLhTs8_S85rjOOeVUp07g/_buildManifest.js",
|
||||||
|
"static/qLhTs8_S85rjOOeVUp07g/_ssgManifest.js"
|
||||||
|
],
|
||||||
|
"rootMainFiles": [],
|
||||||
|
"pages": {
|
||||||
|
"/": [
|
||||||
|
"static/chunks/webpack-8fa1640cc84ba8fe.js",
|
||||||
|
"static/chunks/framework-64ad27b21261a9ce.js",
|
||||||
|
"static/chunks/main-aefbcb23b1606112.js",
|
||||||
|
"static/chunks/pages/index-9134a1c15f8e7e73.js"
|
||||||
|
],
|
||||||
|
"/_app": [
|
||||||
|
"static/chunks/webpack-8fa1640cc84ba8fe.js",
|
||||||
|
"static/chunks/framework-64ad27b21261a9ce.js",
|
||||||
|
"static/chunks/main-aefbcb23b1606112.js",
|
||||||
|
"static/css/a115fcea0d441c48.css",
|
||||||
|
"static/chunks/pages/_app-be10d8e0e3953b07.js"
|
||||||
|
],
|
||||||
|
"/_error": [
|
||||||
|
"static/chunks/webpack-8fa1640cc84ba8fe.js",
|
||||||
|
"static/chunks/framework-64ad27b21261a9ce.js",
|
||||||
|
"static/chunks/main-aefbcb23b1606112.js",
|
||||||
|
"static/chunks/pages/_error-7a92967bea80186d.js"
|
||||||
|
],
|
||||||
|
"/categories": [
|
||||||
|
"static/chunks/webpack-8fa1640cc84ba8fe.js",
|
||||||
|
"static/chunks/framework-64ad27b21261a9ce.js",
|
||||||
|
"static/chunks/main-aefbcb23b1606112.js",
|
||||||
|
"static/chunks/pages/categories-53ccc6325e13ffd1.js"
|
||||||
|
],
|
||||||
|
"/login": [
|
||||||
|
"static/chunks/webpack-8fa1640cc84ba8fe.js",
|
||||||
|
"static/chunks/framework-64ad27b21261a9ce.js",
|
||||||
|
"static/chunks/main-aefbcb23b1606112.js",
|
||||||
|
"static/chunks/pages/login-f50164aa2a6805b4.js"
|
||||||
|
],
|
||||||
|
"/recurring": [
|
||||||
|
"static/chunks/webpack-8fa1640cc84ba8fe.js",
|
||||||
|
"static/chunks/framework-64ad27b21261a9ce.js",
|
||||||
|
"static/chunks/main-aefbcb23b1606112.js",
|
||||||
|
"static/chunks/pages/recurring-560011bee3956d16.js"
|
||||||
|
],
|
||||||
|
"/search": [
|
||||||
|
"static/chunks/webpack-8fa1640cc84ba8fe.js",
|
||||||
|
"static/chunks/framework-64ad27b21261a9ce.js",
|
||||||
|
"static/chunks/main-aefbcb23b1606112.js",
|
||||||
|
"static/chunks/pages/search-3f7f0eb3485675fc.js"
|
||||||
|
],
|
||||||
|
"/settings": [
|
||||||
|
"static/chunks/webpack-8fa1640cc84ba8fe.js",
|
||||||
|
"static/chunks/framework-64ad27b21261a9ce.js",
|
||||||
|
"static/chunks/main-aefbcb23b1606112.js",
|
||||||
|
"static/chunks/pages/settings-bb02e29d5162e9fa.js"
|
||||||
|
],
|
||||||
|
"/stats": [
|
||||||
|
"static/chunks/webpack-8fa1640cc84ba8fe.js",
|
||||||
|
"static/chunks/framework-64ad27b21261a9ce.js",
|
||||||
|
"static/chunks/main-aefbcb23b1606112.js",
|
||||||
|
"static/chunks/ee8b1517-5dfbbb6838544537.js",
|
||||||
|
"static/chunks/925-ca8bea7fb2a62185.js",
|
||||||
|
"static/chunks/pages/stats-656db72deae83243.js"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"ampFirstPages": []
|
||||||
|
}
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
|||||||
|
{"version":1,"hasExportPathMap":false,"exportTrailingSlash":false,"isNextImageImported":false}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"version":1,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[16,32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":60,"formats":["image/webp"],"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"inline","remotePatterns":[],"unoptimized":false,"sizes":[640,750,828,1080,1200,1920,2048,3840,16,32,48,64,96,128,256,384]}}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"version":1,"files":["../node_modules/styled-jsx/index.js","../node_modules/styled-jsx/package.json","../node_modules/styled-jsx/dist/index/index.js","../node_modules/react/package.json","../node_modules/react/index.js","../node_modules/client-only/package.json","../node_modules/react/cjs/react.production.min.js","../node_modules/client-only/index.js","../node_modules/styled-jsx/style.js","../node_modules/next/dist/compiled/next-server/server.runtime.prod.js","../node_modules/next/package.json","../node_modules/next/dist/server/body-streams.js","../node_modules/next/dist/lib/constants.js","../node_modules/next/dist/lib/picocolors.js","../node_modules/next/dist/shared/lib/constants.js","../node_modules/next/dist/server/web/utils.js","../node_modules/next/dist/client/components/app-router-headers.js","../node_modules/next/dist/server/lib/trace/tracer.js","../node_modules/next/dist/server/lib/trace/constants.js","../node_modules/next/dist/shared/lib/modern-browserslist-target.js","../node_modules/next/dist/compiled/ws/package.json","../node_modules/next/dist/compiled/node-html-parser/package.json","../node_modules/next/dist/compiled/lru-cache/package.json","../node_modules/next/dist/shared/lib/runtime-config.external.js","../node_modules/@swc/helpers/_/_interop_require_default/package.json","../node_modules/next/dist/compiled/ws/index.js","../node_modules/next/dist/compiled/node-html-parser/index.js","../node_modules/next/dist/compiled/lru-cache/index.js","../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../node_modules/@swc/helpers/package.json","../node_modules/next/dist/compiled/jsonwebtoken/package.json","../node_modules/@swc/helpers/cjs/_interop_require_default.cjs","../node_modules/next/dist/compiled/@opentelemetry/api/index.js","../node_modules/next/dist/compiled/jsonwebtoken/index.js","../node_modules/next/dist/client/components/async-local-storage.js","../node_modules/next/dist/shared/lib/error-source.js","../node_modules/next/dist/compiled/debug/package.json","../node_modules/next/dist/lib/semver-noop.js","../node_modules/next/dist/client/components/static-generation-async-storage.external.js","../node_modules/next/dist/compiled/debug/index.js","../node_modules/next/dist/client/components/static-generation-async-storage-instance.js","../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/amp-context.js","../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/app-router-context.js","../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/entrypoints.js","../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/head-manager-context.js","../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/hooks-client-context.js","../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/html-context.js","../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/image-config-context.js","../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/loadable-context.js","../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/loadable.js","../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/router-context.js","../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/server-inserted-html.js","../node_modules/next/dist/server/future/route-modules/app-page/module.compiled.js","../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/amp-context.js","../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/app-router-context.js","../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/entrypoints.js","../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/head-manager-context.js","../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/hooks-client-context.js","../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/html-context.js","../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/image-config-context.js","../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/loadable-context.js","../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/loadable.js","../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/router-context.js","../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/server-inserted-html.js","../node_modules/next/dist/server/future/route-modules/pages/module.compiled.js"]}
|
||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
|||||||
|
{"type": "commonjs"}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"version":4,"routes":{},"dynamicRoutes":{},"preview":{"previewModeId":"48b81c455a5b7cce3d806d7026b56964","previewModeSigningKey":"66b57b635f1afb73fff9bf508ff8dbef304766f3a4e41b31e0ffec2f72860915","previewModeEncryptionKey":"38fba3ca573e476136b9b934594a1c12dd88e6e11b789ed305cffe9a0b2c6111"},"notFoundRoutes":[]}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"version":1,"config":{"env":{},"webpack":null,"eslint":{"ignoreDuringBuilds":false},"typescript":{"ignoreBuildErrors":false,"tsconfigPath":"tsconfig.json"},"distDir":".next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.js","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"analyticsId":"","images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[16,32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":60,"formats":["image/webp"],"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"inline","remotePatterns":[],"unoptimized":false},"devIndicators":{"buildActivity":true,"buildActivityPosition":"bottom-right"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"amp":{"canonicalBase":""},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"optimizeFonts":true,"excludeDefaultMomentLocales":true,"serverRuntimeConfig":{},"publicRuntimeConfig":{},"reactProductionProfiling":false,"reactStrictMode":null,"httpAgentOptions":{"keepAlive":true},"outputFileTracing":true,"staticPageGenerationTimeout":60,"swcMinify":true,"modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"experimental":{"multiZoneDraftMode":false,"prerenderEarlyExit":false,"serverMinification":true,"serverSourceMaps":false,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","middlewarePrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":3,"memoryBasedWorkersCount":false,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"outputFileTracingRoot":"/opt/accountbook/frontend","swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"adjustFontFallbacks":false,"adjustFontFallbacksWithSizeAdjust":false,"typedRoutes":false,"instrumentationHook":false,"bundlePagesExternals":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"missingSuspenseWithCSRBailout":true,"optimizeServerReact":true,"useEarlyImport":false,"staleTimes":{"dynamic":30,"static":300},"optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"configFileName":"next.config.js","_originalRewrites":{"beforeFiles":[],"afterFiles":[{"source":"/api/:path*","destination":"http://localhost:3501/api/:path*"}],"fallback":[]}},"appDir":"/opt/accountbook/frontend","relativeAppDir":"","files":[".next/routes-manifest.json",".next/server/pages-manifest.json",".next/build-manifest.json",".next/prerender-manifest.json",".next/server/middleware-manifest.json",".next/server/middleware-build-manifest.js",".next/server/middleware-react-loadable-manifest.js",".next/react-loadable-manifest.json",".next/server/font-manifest.json",".next/BUILD_ID",".next/server/next-font-manifest.js",".next/server/next-font-manifest.json"],"ignore":["node_modules/next/dist/compiled/@ampproject/toolbox-optimizer/**/*"]}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"version":3,"pages404":true,"caseSensitive":false,"basePath":"","redirects":[{"source":"/:path+/","destination":"/:path+","internal":true,"statusCode":308,"regex":"^(?:/((?:[^/]+?)(?:/(?:[^/]+?))*))/$"}],"headers":[],"dynamicRoutes":[],"staticRoutes":[{"page":"/","regex":"^/(?:/)?$","routeKeys":{},"namedRegex":"^/(?:/)?$"},{"page":"/categories","regex":"^/categories(?:/)?$","routeKeys":{},"namedRegex":"^/categories(?:/)?$"},{"page":"/login","regex":"^/login(?:/)?$","routeKeys":{},"namedRegex":"^/login(?:/)?$"},{"page":"/recurring","regex":"^/recurring(?:/)?$","routeKeys":{},"namedRegex":"^/recurring(?:/)?$"},{"page":"/search","regex":"^/search(?:/)?$","routeKeys":{},"namedRegex":"^/search(?:/)?$"},{"page":"/settings","regex":"^/settings(?:/)?$","routeKeys":{},"namedRegex":"^/settings(?:/)?$"},{"page":"/stats","regex":"^/stats(?:/)?$","routeKeys":{},"namedRegex":"^/stats(?:/)?$"}],"dataRoutes":[],"rsc":{"header":"RSC","varyHeader":"RSC, Next-Router-State-Tree, Next-Router-Prefetch","prefetchHeader":"Next-Router-Prefetch","didPostponeHeader":"x-nextjs-postponed","contentTypeHeader":"text/x-component","suffix":".rsc","prefetchSuffix":".prefetch.rsc"},"rewrites":[{"source":"/api/:path*","destination":"http://localhost:3501/api/:path*","regex":"^/api(?:/((?:[^/]+?)(?:/(?:[^/]+?))*))?(?:/)?$"}]}
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"version":1,"functions":{}}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
self.__INTERCEPTION_ROUTE_REWRITE_MANIFEST="[]";
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
self.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-42372ed130431b0a.js"],devFiles:[],ampDevFiles:[],lowPriorityFiles:[],rootMainFiles:[],pages:{"/":["static/chunks/webpack-8fa1640cc84ba8fe.js","static/chunks/framework-64ad27b21261a9ce.js","static/chunks/main-aefbcb23b1606112.js","static/chunks/pages/index-9134a1c15f8e7e73.js"],"/_app":["static/chunks/webpack-8fa1640cc84ba8fe.js","static/chunks/framework-64ad27b21261a9ce.js","static/chunks/main-aefbcb23b1606112.js","static/css/a115fcea0d441c48.css","static/chunks/pages/_app-be10d8e0e3953b07.js"],"/_error":["static/chunks/webpack-8fa1640cc84ba8fe.js","static/chunks/framework-64ad27b21261a9ce.js","static/chunks/main-aefbcb23b1606112.js","static/chunks/pages/_error-7a92967bea80186d.js"],"/categories":["static/chunks/webpack-8fa1640cc84ba8fe.js","static/chunks/framework-64ad27b21261a9ce.js","static/chunks/main-aefbcb23b1606112.js","static/chunks/pages/categories-53ccc6325e13ffd1.js"],"/login":["static/chunks/webpack-8fa1640cc84ba8fe.js","static/chunks/framework-64ad27b21261a9ce.js","static/chunks/main-aefbcb23b1606112.js","static/chunks/pages/login-f50164aa2a6805b4.js"],"/recurring":["static/chunks/webpack-8fa1640cc84ba8fe.js","static/chunks/framework-64ad27b21261a9ce.js","static/chunks/main-aefbcb23b1606112.js","static/chunks/pages/recurring-560011bee3956d16.js"],"/search":["static/chunks/webpack-8fa1640cc84ba8fe.js","static/chunks/framework-64ad27b21261a9ce.js","static/chunks/main-aefbcb23b1606112.js","static/chunks/pages/search-3f7f0eb3485675fc.js"],"/settings":["static/chunks/webpack-8fa1640cc84ba8fe.js","static/chunks/framework-64ad27b21261a9ce.js","static/chunks/main-aefbcb23b1606112.js","static/chunks/pages/settings-bb02e29d5162e9fa.js"],"/stats":["static/chunks/webpack-8fa1640cc84ba8fe.js","static/chunks/framework-64ad27b21261a9ce.js","static/chunks/main-aefbcb23b1606112.js","static/chunks/ee8b1517-5dfbbb6838544537.js","static/chunks/925-ca8bea7fb2a62185.js","static/chunks/pages/stats-656db72deae83243.js"]},ampFirstPages:[]},self.__BUILD_MANIFEST.lowPriorityFiles=["/static/"+process.env.__NEXT_BUILD_ID+"/_buildManifest.js",,"/static/"+process.env.__NEXT_BUILD_ID+"/_ssgManifest.js"];
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"version": 3,
|
||||||
|
"middleware": {},
|
||||||
|
"functions": {},
|
||||||
|
"sortedMiddleware": []
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
self.__REACT_LOADABLE_MANIFEST="{}";
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
self.__NEXT_FONT_MANIFEST='{"pages":{},"app":{},"appUsingSizeAdjust":false,"pagesUsingSizeAdjust":false}';
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"pages":{},"app":{},"appUsingSizeAdjust":false,"pagesUsingSizeAdjust":false}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"/_app":"pages/_app.js","/_error":"pages/_error.js","/categories":"pages/categories.html","/":"pages/index.html","/login":"pages/login.html","/recurring":"pages/recurring.html","/search":"pages/search.html","/settings":"pages/settings.html","/stats":"pages/stats.html","/_document":"pages/_document.js","/404":"pages/404.html"}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><title>404: This page could not be found</title><meta name="next-head-count" content="3"/><link rel="preload" href="/_next/static/css/a115fcea0d441c48.css" as="style"/><link rel="stylesheet" href="/_next/static/css/a115fcea0d441c48.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8fa1640cc84ba8fe.js" defer=""></script><script src="/_next/static/chunks/framework-64ad27b21261a9ce.js" defer=""></script><script src="/_next/static/chunks/main-aefbcb23b1606112.js" defer=""></script><script src="/_next/static/chunks/pages/_app-be10d8e0e3953b07.js" defer=""></script><script src="/_next/static/chunks/pages/_error-7a92967bea80186d.js" defer=""></script><script src="/_next/static/qLhTs8_S85rjOOeVUp07g/_buildManifest.js" defer=""></script><script src="/_next/static/qLhTs8_S85rjOOeVUp07g/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">This page could not be found<!-- -->.</h2></div></div></div><div class="toast-stack" aria-live="polite" aria-atomic="true"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"qLhTs8_S85rjOOeVUp07g","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><title>500: Internal Server Error</title><meta name="next-head-count" content="3"/><link rel="preload" href="/_next/static/css/a115fcea0d441c48.css" as="style"/><link rel="stylesheet" href="/_next/static/css/a115fcea0d441c48.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8fa1640cc84ba8fe.js" defer=""></script><script src="/_next/static/chunks/framework-64ad27b21261a9ce.js" defer=""></script><script src="/_next/static/chunks/main-aefbcb23b1606112.js" defer=""></script><script src="/_next/static/chunks/pages/_app-be10d8e0e3953b07.js" defer=""></script><script src="/_next/static/chunks/pages/_error-7a92967bea80186d.js" defer=""></script><script src="/_next/static/qLhTs8_S85rjOOeVUp07g/_buildManifest.js" defer=""></script><script src="/_next/static/qLhTs8_S85rjOOeVUp07g/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div><div class="toast-stack" aria-live="polite" aria-atomic="true"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"qLhTs8_S85rjOOeVUp07g","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
|
||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
|||||||
|
{"version":1,"files":["../../../node_modules/react/cjs/react-jsx-runtime.development.js","../../../node_modules/react/cjs/react-jsx-runtime.production.min.js","../../../node_modules/react/cjs/react.development.js","../../../node_modules/react/cjs/react.production.min.js","../../../node_modules/react/index.js","../../../node_modules/react/jsx-runtime.js","../../../node_modules/react/package.json","../../../package.json","../../../pages/_app.js","../../package.json","../webpack-runtime.js"]}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
"use strict";(()=>{var e={};e.id=660,e.ids=[660],e.modules={2785:e=>{e.exports=require("next/dist/compiled/next-server/pages.runtime.prod.js")},6689:e=>{e.exports=require("react")},997:e=>{e.exports=require("react/jsx-runtime")},5315:e=>{e.exports=require("path")}};var r=require("../webpack-runtime.js");r.C(e);var s=e=>r(r.s=e),t=r.X(0,[899],()=>s(2899));module.exports=t})();
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"version":1,"files":["../../../node_modules/client-only/index.js","../../../node_modules/client-only/package.json","../../../node_modules/next/dist/compiled/@opentelemetry/api/index.js","../../../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../node_modules/next/dist/compiled/jsonwebtoken/index.js","../../../node_modules/next/dist/compiled/jsonwebtoken/package.json","../../../node_modules/next/dist/compiled/next-server/pages.runtime.prod.js","../../../node_modules/next/dist/compiled/node-html-parser/index.js","../../../node_modules/next/dist/compiled/node-html-parser/package.json","../../../node_modules/next/dist/lib/semver-noop.js","../../../node_modules/next/dist/pages/_document.js","../../../node_modules/next/dist/server/lib/trace/constants.js","../../../node_modules/next/dist/server/lib/trace/tracer.js","../../../node_modules/next/package.json","../../../node_modules/react-dom/cjs/react-dom-server-legacy.browser.development.js","../../../node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.min.js","../../../node_modules/react-dom/cjs/react-dom-server.browser.development.js","../../../node_modules/react-dom/cjs/react-dom-server.browser.production.min.js","../../../node_modules/react-dom/package.json","../../../node_modules/react-dom/server.browser.js","../../../node_modules/react/cjs/react-jsx-runtime.development.js","../../../node_modules/react/cjs/react-jsx-runtime.production.min.js","../../../node_modules/react/cjs/react.development.js","../../../node_modules/react/cjs/react.production.min.js","../../../node_modules/react/index.js","../../../node_modules/react/jsx-runtime.js","../../../node_modules/react/package.json","../../../node_modules/styled-jsx/dist/index/index.js","../../../node_modules/styled-jsx/index.js","../../../node_modules/styled-jsx/package.json","../../../package.json","../../package.json","../chunks/899.js","../webpack-runtime.js"]}
|
||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
|||||||
|
{"version":1,"files":["../../../node_modules/client-only/index.js","../../../node_modules/client-only/package.json","../../../node_modules/next/dist/compiled/@opentelemetry/api/index.js","../../../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../node_modules/next/dist/compiled/jsonwebtoken/index.js","../../../node_modules/next/dist/compiled/jsonwebtoken/package.json","../../../node_modules/next/dist/compiled/next-server/pages.runtime.prod.js","../../../node_modules/next/dist/compiled/node-html-parser/index.js","../../../node_modules/next/dist/compiled/node-html-parser/package.json","../../../node_modules/next/dist/lib/semver-noop.js","../../../node_modules/next/dist/server/lib/trace/constants.js","../../../node_modules/next/dist/server/lib/trace/tracer.js","../../../node_modules/next/package.json","../../../node_modules/react-dom/cjs/react-dom-server-legacy.browser.development.js","../../../node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.min.js","../../../node_modules/react-dom/cjs/react-dom-server.browser.development.js","../../../node_modules/react-dom/cjs/react-dom-server.browser.production.min.js","../../../node_modules/react-dom/package.json","../../../node_modules/react-dom/server.browser.js","../../../node_modules/react/cjs/react-jsx-runtime.development.js","../../../node_modules/react/cjs/react-jsx-runtime.production.min.js","../../../node_modules/react/cjs/react.development.js","../../../node_modules/react/cjs/react.production.min.js","../../../node_modules/react/index.js","../../../node_modules/react/jsx-runtime.js","../../../node_modules/react/package.json","../../../node_modules/styled-jsx/dist/index/index.js","../../../node_modules/styled-jsx/index.js","../../../node_modules/styled-jsx/package.json","../../package.json","../chunks/899.js","../webpack-runtime.js"]}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/_next/static/css/a115fcea0d441c48.css" as="style"/><link rel="stylesheet" href="/_next/static/css/a115fcea0d441c48.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8fa1640cc84ba8fe.js" defer=""></script><script src="/_next/static/chunks/framework-64ad27b21261a9ce.js" defer=""></script><script src="/_next/static/chunks/main-aefbcb23b1606112.js" defer=""></script><script src="/_next/static/chunks/pages/_app-be10d8e0e3953b07.js" defer=""></script><script src="/_next/static/chunks/pages/categories-53ccc6325e13ffd1.js" defer=""></script><script src="/_next/static/qLhTs8_S85rjOOeVUp07g/_buildManifest.js" defer=""></script><script src="/_next/static/qLhTs8_S85rjOOeVUp07g/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div class="app-shell"><header class="app-header app-header--compact app-header--with-content app-header--with-actions"><div class="app-shell__container app-header__inner"><div class="app-header__main"><div class="app-header__text"><h1>分类</h1><p>整理常用分类与图标</p></div></div><div class="app-header__actions"><button type="button" class="icon-button" aria-label="设置"><svg viewBox="0 0 24 24" width="18" height="18" class="" aria-hidden="true" role="presentation" fill="none"><path d="M12 8.5A3.5 3.5 0 1 0 12 15.5A3.5 3.5 0 1 0 12 8.5Z" fill="none" stroke="currentColor" stroke-width="1.8"></path><path d="M19.4 15a1 1 0 0 0 .2 1.1l.1.1a2 2 0 0 1-2.8 2.8l-.1-.1a1 1 0 0 0-1.1-.2 1 1 0 0 0-.6.9V20a2 2 0 0 1-4 0v-.2a1 1 0 0 0-.6-.9 1 1 0 0 0-1.1.2l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1 1 0 0 0 .2-1.1 1 1 0 0 0-.9-.6H4a2 2 0 0 1 0-4h.2a1 1 0 0 0 .9-.6 1 1 0 0 0-.2-1.1l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1 1 0 0 0 1.1.2 1 1 0 0 0 .6-.9V4a2 2 0 0 1 4 0v.2a1 1 0 0 0 .6.9 1 1 0 0 0 1.1-.2l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1 1 0 0 0-.2 1.1 1 1 0 0 0 .9.6H20a2 2 0 0 1 0 4h-.2a1 1 0 0 0-.4 1Z" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></button></div></div></header><main class="app-content"><div class="app-shell__container app-content__inner"><div class="card loading-state">加载中...</div></div></main><nav class="bottom-nav" aria-label="主导航"><div class="app-shell__container bottom-nav__inner"><button type="button" class="bottom-nav__item"><svg viewBox="0 0 24 24" width="20" height="20" class="" aria-hidden="true" role="presentation" fill="none"><path d="M3 10.5 12 3l9 7.5V20a1 1 0 0 1-1 1h-5.5v-6h-5v6H4a1 1 0 0 1-1-1v-9.5Z" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"></path></svg><span>首页</span></button><button type="button" class="bottom-nav__item"><svg viewBox="0 0 24 24" width="20" height="20" class="" aria-hidden="true" role="presentation" fill="none"><path d="M4 20h16" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"></path><path d="M7 16v-4" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"></path><path d="M12 16V8" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"></path><path d="M17 16v-7" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"></path></svg><span>统计</span></button><button type="button" class="bottom-nav__item"><svg viewBox="0 0 24 24" width="20" height="20" class="" aria-hidden="true" role="presentation" fill="none"><path d="M17 3l4 4-4 4" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"></path><path d="M3 7h18" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"></path><path d="M7 21l-4-4 4-4" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"></path><path d="M21 17H3" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"></path></svg><span>周期</span></button><button type="button" class="bottom-nav__item is-active" aria-current="page"><svg viewBox="0 0 24 24" width="20" height="20" class="" aria-hidden="true" role="presentation" fill="none"><path d="M11 4H5a2 2 0 0 0-2 2v6l8.5 8.5a2.1 2.1 0 0 0 3 0l6-6a2.1 2.1 0 0 0 0-3L12 4Z" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round"></path><circle cx="7.5" cy="8.5" r="1.2" fill="currentColor"></circle></svg><span>分类</span></button></div></nav></div><div class="toast-stack" aria-live="polite" aria-atomic="true"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/categories","query":{},"buildId":"qLhTs8_S85rjOOeVUp07g","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"version":1,"files":["../webpack-runtime.js","../chunks/899.js","../chunks/342.js","../chunks/261.js","../../../package.json"]}
|
||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
|||||||
|
{"version":1,"files":["../../../node_modules/client-only/index.js","../../../node_modules/client-only/package.json","../../../node_modules/next/dist/compiled/@opentelemetry/api/index.js","../../../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../node_modules/next/dist/compiled/jsonwebtoken/index.js","../../../node_modules/next/dist/compiled/jsonwebtoken/package.json","../../../node_modules/next/dist/compiled/next-server/pages.runtime.prod.js","../../../node_modules/next/dist/compiled/node-html-parser/index.js","../../../node_modules/next/dist/compiled/node-html-parser/package.json","../../../node_modules/next/dist/lib/semver-noop.js","../../../node_modules/next/dist/server/lib/trace/constants.js","../../../node_modules/next/dist/server/lib/trace/tracer.js","../../../node_modules/next/package.json","../../../node_modules/react-dom/cjs/react-dom-server-legacy.browser.development.js","../../../node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.min.js","../../../node_modules/react-dom/cjs/react-dom-server.browser.development.js","../../../node_modules/react-dom/cjs/react-dom-server.browser.production.min.js","../../../node_modules/react-dom/cjs/react-dom.development.js","../../../node_modules/react-dom/cjs/react-dom.production.min.js","../../../node_modules/react-dom/index.js","../../../node_modules/react-dom/package.json","../../../node_modules/react-dom/server.browser.js","../../../node_modules/react/cjs/react-jsx-runtime.development.js","../../../node_modules/react/cjs/react-jsx-runtime.production.min.js","../../../node_modules/react/cjs/react.development.js","../../../node_modules/react/cjs/react.production.min.js","../../../node_modules/react/index.js","../../../node_modules/react/jsx-runtime.js","../../../node_modules/react/package.json","../../../node_modules/scheduler/cjs/scheduler.development.js","../../../node_modules/scheduler/cjs/scheduler.production.min.js","../../../node_modules/scheduler/index.js","../../../node_modules/scheduler/package.json","../../../node_modules/styled-jsx/dist/index/index.js","../../../node_modules/styled-jsx/index.js","../../../node_modules/styled-jsx/package.json","../../../package.json","../../package.json","../chunks/261.js","../chunks/342.js","../chunks/899.js","../webpack-runtime.js"]}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/_next/static/css/a115fcea0d441c48.css" as="style"/><link rel="stylesheet" href="/_next/static/css/a115fcea0d441c48.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8fa1640cc84ba8fe.js" defer=""></script><script src="/_next/static/chunks/framework-64ad27b21261a9ce.js" defer=""></script><script src="/_next/static/chunks/main-aefbcb23b1606112.js" defer=""></script><script src="/_next/static/chunks/pages/_app-be10d8e0e3953b07.js" defer=""></script><script src="/_next/static/chunks/pages/login-f50164aa2a6805b4.js" defer=""></script><script src="/_next/static/qLhTs8_S85rjOOeVUp07g/_buildManifest.js" defer=""></script><script src="/_next/static/qLhTs8_S85rjOOeVUp07g/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div class="app-shell app-shell--standalone"><header class="app-header app-header--compact app-header--with-content"><div class="app-shell__container app-header__inner"><div class="app-header__main"><div class="app-header__text"><h1>记账本</h1><p>随时记录每一笔收支</p></div></div></div></header><main class="app-content auth-layout"><div class="app-shell__container app-content__inner"><div class="auth-page"><div class="auth-card auth-card--refresh"><div class="auth-logo auth-logo--refresh"><div class="auth-logo__mark" aria-hidden="true"><svg viewBox="0 0 24 24" width="24" height="24" class="" aria-hidden="true" role="presentation" fill="none"><path d="M4 20h16" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"></path><path d="M7 16v-4" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"></path><path d="M12 16V8" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"></path><path d="M17 16v-7" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"></path></svg></div><h1>欢迎回来</h1><p>登录后继续记录每一笔收支</p></div><div class="auth-switch" role="tablist" aria-label="登录或注册"><button type="button" class="is-active">登录</button><button type="button" class="">注册</button></div><form class="auth-form"><div class="form-group"><label for="username">用户名</label><input id="username" type="text" placeholder="3-20个字符" required="" value=""/></div><div class="form-group"><label for="password">密码</label><input id="password" type="password" placeholder="6-20个字符" required="" value=""/></div><button type="submit" class="btn btn-primary">登录</button></form></div></div></div></main></div><div class="toast-stack" aria-live="polite" aria-atomic="true"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/login","query":{},"buildId":"qLhTs8_S85rjOOeVUp07g","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"version":1,"files":["../webpack-runtime.js","../chunks/899.js","../chunks/342.js","../chunks/261.js","../../../package.json"]}
|
||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
|||||||
|
{"version":1,"files":["../webpack-runtime.js","../chunks/899.js","../chunks/342.js","../chunks/261.js","../../../package.json"]}
|
||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
|||||||
|
{"version":1,"files":["../webpack-runtime.js","../chunks/899.js","../chunks/342.js","../chunks/261.js","../../../package.json"]}
|
||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
|||||||
|
{"version":1,"files":["../webpack-runtime.js","../chunks/899.js","../chunks/342.js","../chunks/261.js","../../../package.json"]}
|
||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
|||||||
|
{"version":1,"files":["../webpack-runtime.js","../chunks/899.js","../chunks/342.js","../chunks/261.js","../../../package.json"]}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
(()=>{"use strict";var e={},r={};function o(t){var a=r[t];if(void 0!==a)return a.exports;var n=r[t]={exports:{}},u=!0;try{e[t](n,n.exports,o),u=!1}finally{u&&delete r[t]}return n.exports}o.m=e,(()=>{var e="function"==typeof Symbol?Symbol("webpack queues"):"__webpack_queues__",r="function"==typeof Symbol?Symbol("webpack exports"):"__webpack_exports__",t="function"==typeof Symbol?Symbol("webpack error"):"__webpack_error__",a=e=>{e&&e.d<1&&(e.d=1,e.forEach(e=>e.r--),e.forEach(e=>e.r--?e.r++:e()))},n=o=>o.map(o=>{if(null!==o&&"object"==typeof o){if(o[e])return o;if(o.then){var n=[];n.d=0,o.then(e=>{u[r]=e,a(n)},e=>{u[t]=e,a(n)});var u={};return u[e]=e=>e(n),u}}var p={};return p[e]=e=>{},p[r]=o,p});o.a=(o,u,p)=>{p&&((f=[]).d=-1);var f,i,l,d,s=new Set,c=o.exports,b=new Promise((e,r)=>{d=r,l=e});b[r]=c,b[e]=e=>(f&&e(f),s.forEach(e),b.catch(e=>{})),o.exports=b,u(o=>{i=n(o);var a,u=()=>i.map(e=>{if(e[t])throw e[t];return e[r]}),p=new Promise(r=>{(a=()=>r(u)).r=0;var o=e=>e!==f&&!s.has(e)&&(s.add(e),e&&!e.d&&(a.r++,e.push(a)));i.map(r=>r[e](o))});return a.r?p:u()},e=>(e?d(b[t]=e):l(c),a(f))),f&&f.d<0&&(f.d=0)}})(),o.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return o.d(r,{a:r}),r},o.d=(e,r)=>{for(var t in r)o.o(r,t)&&!o.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},o.f={},o.e=e=>Promise.all(Object.keys(o.f).reduce((r,t)=>(o.f[t](e,r),r),[])),o.u=e=>""+e+".js",o.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.X=(e,r,t)=>{var a=r;t||(r=e,t=()=>o(o.s=a)),r.map(o.e,o);var n=t();return void 0===n?e:n},(()=>{var e={658:1},r=r=>{var t=r.modules,a=r.ids,n=r.runtime;for(var u in t)o.o(t,u)&&(o.m[u]=t[u]);n&&n(o);for(var p=0;p<a.length;p++)e[a[p]]=1};o.f.require=(t,a)=>{e[t]||(658!=t?r(require("./chunks/"+o.u(t))):e[t]=1)},module.exports=o,o.C=r})()})();
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
|||||||
|
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[820],{1981:function(n,_,u){(window.__NEXT_P=window.__NEXT_P||[]).push(["/_error",function(){return u(2111)}])}},function(n){n.O(0,[888,774,179],function(){return n(n.s=1981)}),_N_E=n.O()}]);
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user