修改端口2333
This commit is contained in:
@@ -28,7 +28,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- Port configuration:
|
- Port configuration:
|
||||||
- Local development: Port 3000
|
- Local development: Port 2333
|
||||||
- Docker deployment: Port 4000
|
- Docker deployment: Port 4000
|
||||||
|
|
||||||
### Technical Stack
|
### Technical Stack
|
||||||
@@ -57,3 +57,4 @@ For Docker:
|
|||||||
git pull origin main
|
git pull origin main
|
||||||
./docker-start.sh
|
./docker-start.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -64,9 +64,9 @@ RUN mkdir -p /app/data && \
|
|||||||
|
|
||||||
USER nextjs
|
USER nextjs
|
||||||
|
|
||||||
EXPOSE 3000
|
EXPOSE 2333
|
||||||
|
|
||||||
ENV PORT=3000
|
ENV PORT=2333
|
||||||
ENV HOSTNAME="0.0.0.0"
|
ENV HOSTNAME="0.0.0.0"
|
||||||
|
|
||||||
# 使用 node 直接启动,不需要 npm(更轻量)
|
# 使用 node 直接启动,不需要 npm(更轻量)
|
||||||
|
|||||||
69
README.md
69
README.md
@@ -1,6 +1,6 @@
|
|||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
# ✨ STARK Todo List
|
# <EFBFBD><EFBFBD>?STARK Todo List
|
||||||
|
|
||||||
<img src="https://img.shields.io/badge/Next.js-15.1.2-black?style=flat-square&logo=next.js" alt="Next.js">
|
<img src="https://img.shields.io/badge/Next.js-15.1.2-black?style=flat-square&logo=next.js" alt="Next.js">
|
||||||
<img src="https://img.shields.io/badge/React-19.0-61DAFB?style=flat-square&logo=react" alt="React">
|
<img src="https://img.shields.io/badge/React-19.0-61DAFB?style=flat-square&logo=react" alt="React">
|
||||||
@@ -97,7 +97,7 @@
|
|||||||
|
|
||||||
4. **Open your browser**
|
4. **Open your browser**
|
||||||
```
|
```
|
||||||
http://localhost:3000
|
http://localhost:2333
|
||||||
```
|
```
|
||||||
|
|
||||||
### Option 2: Using Management Script
|
### Option 2: Using Management Script
|
||||||
@@ -204,28 +204,28 @@ A convenient shell script is provided for easy management:
|
|||||||
```
|
```
|
||||||
stark-todo-list/
|
stark-todo-list/
|
||||||
├── src/
|
├── src/
|
||||||
│ ├── app/ # Next.js App Router
|
<EFBFBD><EFBFBD>? ├── app/ # Next.js App Router
|
||||||
│ │ ├── api/ # API Routes
|
<EFBFBD><EFBFBD>? <20><>? ├── api/ # API Routes
|
||||||
│ │ │ └── todos/ # Todo CRUD endpoints
|
<EFBFBD><EFBFBD>? <20><>? <20><>? └── todos/ # Todo CRUD endpoints
|
||||||
│ │ ├── analytics/ # Insights & Charts page
|
<EFBFBD><EFBFBD>? <20><>? ├── analytics/ # Insights & Charts page
|
||||||
│ │ ├── settings/ # Settings page
|
<EFBFBD><EFBFBD>? <20><>? ├── settings/ # Settings page
|
||||||
│ │ ├── page.tsx # Main page
|
<EFBFBD><EFBFBD>? <20><>? ├── page.tsx # Main page
|
||||||
│ │ ├── layout.tsx # Root layout
|
<EFBFBD><EFBFBD>? <20><>? ├── layout.tsx # Root layout
|
||||||
│ │ └── globals.css # Global styles
|
<EFBFBD><EFBFBD>? <20><>? └── globals.css # Global styles
|
||||||
│ ├── components/ # React components
|
<EFBFBD><EFBFBD>? ├── components/ # React components
|
||||||
│ │ ├── StarkLogo.tsx # Animated logo
|
<EFBFBD><EFBFBD>? <20><>? ├── StarkLogo.tsx # Animated logo
|
||||||
│ │ └── AnalyticsDashboard.tsx # Data visualization
|
<EFBFBD><EFBFBD>? <20><>? └── AnalyticsDashboard.tsx # Data visualization
|
||||||
│ ├── contexts/ # React contexts
|
<EFBFBD><EFBFBD>? ├── contexts/ # React contexts
|
||||||
│ │ └── SettingsContext.tsx
|
<EFBFBD><EFBFBD>? <20><>? └── SettingsContext.tsx
|
||||||
│ ├── lib/ # Utility functions
|
<EFBFBD><EFBFBD>? ├── lib/ # Utility functions
|
||||||
│ │ ├── storage.ts # JSON file operations
|
<EFBFBD><EFBFBD>? <20><>? ├── storage.ts # JSON file operations
|
||||||
│ │ ├── translations.ts # i18n translations
|
<EFBFBD><EFBFBD>? <20><>? ├── translations.ts # i18n translations
|
||||||
│ │ └── timezones.ts # Timezone data
|
<EFBFBD><EFBFBD>? <20><>? └── timezones.ts # Timezone data
|
||||||
│ └── ...
|
<EFBFBD><EFBFBD>? └── ...
|
||||||
├── public/ # Static assets
|
├── public/ # Static assets
|
||||||
├── scripts/
|
├── scripts/
|
||||||
│ ├── generate-icons.js # Favicon generator
|
<EFBFBD><EFBFBD>? ├── generate-icons.js # Favicon generator
|
||||||
│ └── generate-mock-data.js # Demo data generator
|
<EFBFBD><EFBFBD>? └── generate-mock-data.js # Demo data generator
|
||||||
├── docker-compose.yml # Docker Compose config
|
├── docker-compose.yml # Docker Compose config
|
||||||
├── Dockerfile # Docker image config
|
├── Dockerfile # Docker image config
|
||||||
├── run.sh # Management script
|
├── run.sh # Management script
|
||||||
@@ -234,7 +234,7 @@ stark-todo-list/
|
|||||||
└── package.json # Project dependencies
|
└── package.json # Project dependencies
|
||||||
```
|
```
|
||||||
|
|
||||||
## 🛠️ Technology Stack
|
## 🛠<EFBFBD><EFBFBD>?Technology Stack
|
||||||
|
|
||||||
- **Framework**: Next.js 15 (App Router)
|
- **Framework**: Next.js 15 (App Router)
|
||||||
- **Language**: TypeScript 5
|
- **Language**: TypeScript 5
|
||||||
@@ -288,10 +288,10 @@ Protected endpoints require authentication via API key in request headers:
|
|||||||
|
|
||||||
| Method | Auth | Description |
|
| Method | Auth | Description |
|
||||||
|--------|------|-------------|
|
|--------|------|-------------|
|
||||||
| GET | ❌ | Get all active todos |
|
| GET | <EFBFBD><EFBFBD>?| Get all active todos |
|
||||||
| POST | ✅ | Create a new todo |
|
| POST | <EFBFBD><EFBFBD>?| Create a new todo |
|
||||||
| PUT | ✅ | Update an existing todo |
|
| PUT | <EFBFBD><EFBFBD>?| Update an existing todo |
|
||||||
| DELETE | ✅ | Soft delete a todo |
|
| DELETE | <EFBFBD><EFBFBD>?| Soft delete a todo |
|
||||||
|
|
||||||
**GET /api/todos**
|
**GET /api/todos**
|
||||||
```bash
|
```bash
|
||||||
@@ -324,9 +324,9 @@ curl -X DELETE "https://your-domain/api/todos?id=uuid" \
|
|||||||
|
|
||||||
| Method | Auth | Description |
|
| Method | Auth | Description |
|
||||||
|--------|------|-------------|
|
|--------|------|-------------|
|
||||||
| GET | ❌ | Get all groups |
|
| GET | <EFBFBD><EFBFBD>?| Get all groups |
|
||||||
| POST | ✅ | Create a new group |
|
| POST | <EFBFBD><EFBFBD>?| Create a new group |
|
||||||
| DELETE | ✅ | Delete a group |
|
| DELETE | <EFBFBD><EFBFBD>?| Delete a group |
|
||||||
|
|
||||||
**GET /api/groups**
|
**GET /api/groups**
|
||||||
```bash
|
```bash
|
||||||
@@ -351,8 +351,8 @@ curl -X DELETE "https://your-domain/api/groups?id=uuid" \
|
|||||||
|
|
||||||
| Method | Auth | Description |
|
| Method | Auth | Description |
|
||||||
|--------|------|-------------|
|
|--------|------|-------------|
|
||||||
| GET | ❌ | Get PV/UV statistics |
|
| GET | <EFBFBD><EFBFBD>?| Get PV/UV statistics |
|
||||||
| POST | ❌ | Update visit statistics |
|
| POST | <EFBFBD><EFBFBD>?| Update visit statistics |
|
||||||
|
|
||||||
**GET /api/stats**
|
**GET /api/stats**
|
||||||
```bash
|
```bash
|
||||||
@@ -363,7 +363,7 @@ curl https://your-domain/api/stats
|
|||||||
|
|
||||||
| Method | Auth | Description |
|
| Method | Auth | Description |
|
||||||
|--------|------|-------------|
|
|--------|------|-------------|
|
||||||
| POST | ❌ | Verify password |
|
| POST | <EFBFBD><EFBFBD>?| Verify password |
|
||||||
|
|
||||||
**POST /api/auth**
|
**POST /api/auth**
|
||||||
```bash
|
```bash
|
||||||
@@ -398,8 +398,9 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
|
|||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
**[⬆ Back to Top](#-stark-todo-list)**
|
**[<EFBFBD><EFBFBD>?Back to Top](#-stark-todo-list)**
|
||||||
|
|
||||||
Made with ❤️ by STARK | Powered by Next.js
|
Made with ❤️ by STARK | Powered by Next.js
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
204
README.zh-CN.md
204
README.zh-CN.md
@@ -1,6 +1,6 @@
|
|||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
# ✨ STARK Todo List
|
# <EFBFBD><EFBFBD>?STARK Todo List
|
||||||
|
|
||||||
<img src="https://img.shields.io/badge/Next.js-15.1.2-black?style=flat-square&logo=next.js" alt="Next.js">
|
<img src="https://img.shields.io/badge/Next.js-15.1.2-black?style=flat-square&logo=next.js" alt="Next.js">
|
||||||
<img src="https://img.shields.io/badge/React-19.0-61DAFB?style=flat-square&logo=react" alt="React">
|
<img src="https://img.shields.io/badge/React-19.0-61DAFB?style=flat-square&logo=react" alt="React">
|
||||||
@@ -18,29 +18,20 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🎯 功能特性
|
## 🎯 功能特<EFBFBD><EFBFBD>?
|
||||||
|
- **🎨 现代<E78EB0><E4BBA3>?UI/UX 设计**
|
||||||
- **🎨 现代化 UI/UX 设计**
|
- 精美的动<EFBFBD><EFBFBD>?Logo,流畅过渡效<E6B8A1><E69588>? - 毛玻璃卡片与背景模糊特效
|
||||||
- 精美的动画 Logo,流畅过渡效果
|
- Framer Motion 驱动的丝滑动<E6BB91><E58AA8>? - 色彩编码的任务统计(蓝色、橙色、绿色)
|
||||||
- 毛玻璃卡片与背景模糊特效
|
|
||||||
- Framer Motion 驱动的丝滑动画
|
|
||||||
- 色彩编码的任务统计(蓝色、橙色、绿色)
|
|
||||||
|
|
||||||
- **🌓 主题支持**
|
- **🌓 主题支持**
|
||||||
- 浅色模式,鲜艳渐变
|
- 浅色模式,鲜艳渐<EFBFBD><EFBFBD>? - 深色模式,专业美<E4B89A><E7BE8E>? - 系统主题自动检<E58AA8><E6A380>? - 无缝主题切换
|
||||||
- 深色模式,专业美学
|
|
||||||
- 系统主题自动检测
|
|
||||||
- 无缝主题切换
|
|
||||||
|
|
||||||
- **📱 响应式设计**
|
- **📱 响应式设<EFBFBD><EFBFBD>?*
|
||||||
- 桌面端优化的顶部导航标签
|
- 桌面端优化的顶部导航标签
|
||||||
- 移动端友好的底部导航栏
|
- 移动端友好的底部导航<EFBFBD><EFBFBD>? - 触摸优化的交互元<E4BA92><E58583>? - 所有屏幕尺寸的自适应布局
|
||||||
- 触摸优化的交互元素
|
|
||||||
- 所有屏幕尺寸的自适应布局
|
|
||||||
|
|
||||||
- **⚙️ 个性化定制**
|
- **⚙️ 个性化定制**
|
||||||
- 多语言支持(中文和英文)
|
- 多语言支持(中文和英文<EFBFBD><EFBFBD>? - 可自定义 Logo 文字
|
||||||
- 可自定义 Logo 文字
|
|
||||||
- 时区选择
|
- 时区选择
|
||||||
- 主题模式偏好设置
|
- 主题模式偏好设置
|
||||||
|
|
||||||
@@ -48,33 +39,28 @@
|
|||||||
- 创建、完成和删除任务
|
- 创建、完成和删除任务
|
||||||
- 任务创建和完成时间戳
|
- 任务创建和完成时间戳
|
||||||
- 软删除(逻辑删除,保留数据)
|
- 软删除(逻辑删除,保留数据)
|
||||||
- 按状态筛选任务(全部、进行中、已完成)
|
- 按状态筛选任务(全部、进行中、已完成<EFBFBD><EFBFBD>?
|
||||||
|
|
||||||
- **📊 交互式数据分析仪表盘**
|
- **📊 交互式数据分析仪表盘**
|
||||||
- 每日动态趋势图(创建 vs 完成)
|
- 每日动态趋势图(创<EFBFBD><EFBFBD>?vs 完成<EFBFBD><EFBFBD>? - 任务完成时间轴(甘特图视觉效果)
|
||||||
- 任务完成时间轴(甘特图视觉效果)
|
- 实时 KPI 指标统计(总数、完成数、成功率<E58A9F><E78E87>? - 灵活的时间范围选择<E98089><E68BA9>?天、一个月、所有时间)
|
||||||
- 实时 KPI 指标统计(总数、完成数、成功率)
|
|
||||||
- 灵活的时间范围选择(7天、一个月、所有时间)
|
|
||||||
|
|
||||||
- **🔐 访问控制**
|
- **🔐 访问控制**
|
||||||
- 密码保护的任务操作(添加、编辑、删除)
|
- 密码保护的任务操作(添加、编辑、删除)
|
||||||
- 客户端认证状态持久化
|
- 客户端认证状态持久化
|
||||||
- 可通过环境变量配置密码
|
- 可通过环境变量配置密码
|
||||||
|
|
||||||
- **💾 数据持久化**
|
- **💾 数据持久<EFBFBD><EFBFBD>?*
|
||||||
- 本地 JSON 存储(无需数据库)
|
- 本地 JSON 存储(无需数据库)
|
||||||
- 数据在应用重启后保留
|
- 数据在应用重启后保留
|
||||||
- 完全可追溯的任务历史
|
- 完全可追溯的任务历史
|
||||||
|
|
||||||
## 🚀 快速开始
|
## 🚀 快速开<EFBFBD><EFBFBD>?
|
||||||
|
|
||||||
### 环境要求
|
### 环境要求
|
||||||
|
|
||||||
- Node.js 18+ (本地开发)
|
- Node.js 18+ (本地开<EFBFBD><EFBFBD>?
|
||||||
- Docker (可选,用于容器化部署)
|
- Docker (可选,用于容器化部<EFBFBD><EFBFBD>?
|
||||||
|
|
||||||
### 方案一:本地开发(推荐)
|
|
||||||
|
|
||||||
|
### 方案一:本地开发(推荐<E68EA8><E88D90>?
|
||||||
1. **克隆仓库**
|
1. **克隆仓库**
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/yourusername/stark-todo-list.git
|
git clone https://github.com/yourusername/stark-todo-list.git
|
||||||
@@ -84,26 +70,23 @@
|
|||||||
2. **安装依赖**
|
2. **安装依赖**
|
||||||
```bash
|
```bash
|
||||||
npm install
|
npm install
|
||||||
# 或
|
# <EFBFBD><EFBFBD>? pnpm install
|
||||||
pnpm install
|
|
||||||
```
|
```
|
||||||
|
|
||||||
3. **启动开发服务器**
|
3. **启动开发服务器**
|
||||||
```bash
|
```bash
|
||||||
npm run dev
|
npm run dev
|
||||||
# 或
|
# <EFBFBD><EFBFBD>? pnpm dev
|
||||||
pnpm dev
|
|
||||||
```
|
```
|
||||||
|
|
||||||
4. **打开浏览器**
|
4. **打开浏览<EFBFBD><EFBFBD>?*
|
||||||
```
|
```
|
||||||
http://localhost:3000
|
http://localhost:2333
|
||||||
```
|
```
|
||||||
|
|
||||||
### 方案二:使用管理脚本
|
### 方案二:使用管理脚本
|
||||||
|
|
||||||
提供了便捷的 Shell 脚本用于轻松管理:
|
提供了便捷的 Shell 脚本用于轻松管理<EFBFBD><EFBFBD>?
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 启动应用
|
# 启动应用
|
||||||
./run.sh start
|
./run.sh start
|
||||||
@@ -111,14 +94,12 @@
|
|||||||
# 停止应用
|
# 停止应用
|
||||||
./run.sh stop
|
./run.sh stop
|
||||||
|
|
||||||
# 重启并清理缓存
|
# 重启并清理缓<EFBFBD><EFBFBD>?./run.sh restart
|
||||||
./run.sh restart
|
|
||||||
|
|
||||||
# 查看日志
|
# 查看日志
|
||||||
./run.sh logs
|
./run.sh logs
|
||||||
|
|
||||||
# 检查状态
|
# 检查状<EFBFBD><EFBFBD>?./run.sh status
|
||||||
./run.sh status
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 方案三:Docker 部署
|
### 方案三:Docker 部署
|
||||||
@@ -128,7 +109,7 @@
|
|||||||
./docker-start.sh
|
./docker-start.sh
|
||||||
```
|
```
|
||||||
脚本会自动:
|
脚本会自动:
|
||||||
- 构建并启动 Docker 容器
|
- 构建并启<EFBFBD><EFBFBD>?Docker 容器
|
||||||
- 自动显示后端日志
|
- 自动显示后端日志
|
||||||
- 使用 Docker 卷进行数据持久化
|
- 使用 Docker 卷进行数据持久化
|
||||||
|
|
||||||
@@ -136,24 +117,18 @@
|
|||||||
```bash
|
```bash
|
||||||
./docker-update.sh
|
./docker-update.sh
|
||||||
```
|
```
|
||||||
此脚本会:
|
此脚本会<EFBFBD><EFBFBD>? - 停止当前容器
|
||||||
- 停止当前容器
|
- 拉取最新代码(如果<EFBFBD><EFBFBD>?Git 仓库<E4BB93><E5BA93>? - 重新构建 Docker 镜像(无缓存<E7BC93><E5AD98>? - 启动新容<E696B0><E5AEB9>? - 自动显示日志
|
||||||
- 拉取最新代码(如果是 Git 仓库)
|
|
||||||
- 重新构建 Docker 镜像(无缓存)
|
|
||||||
- 启动新容器
|
|
||||||
- 自动显示日志
|
|
||||||
|
|
||||||
3. **配置访问密码(可选)**
|
3. **配置访问密码(可选)**
|
||||||
```bash
|
```bash
|
||||||
# 通过环境变量设置自定义密码
|
# 通过环境变量设置自定义密<EFBFBD><EFBFBD>? export AUTH_PASSWORD=your_custom_password
|
||||||
export AUTH_PASSWORD=your_custom_password
|
|
||||||
|
|
||||||
# 或创建 .env 文件
|
# 或创<EFBFBD><EFBFBD>?.env 文件
|
||||||
echo "AUTH_PASSWORD=your_custom_password" > .env
|
echo "AUTH_PASSWORD=your_custom_password" > .env
|
||||||
```
|
```
|
||||||
> 如未配置,默认密码为 `stark123`。
|
> 如未配置,默认密码为 `stark123`<EFBFBD><EFBFBD>?
|
||||||
|
4. **或手动使<E58AA8><E4BDBF>?Docker Compose**
|
||||||
4. **或手动使用 Docker Compose**
|
|
||||||
```bash
|
```bash
|
||||||
# 使用 Docker Compose 启动
|
# 使用 Docker Compose 启动
|
||||||
docker compose up -d --build
|
docker compose up -d --build
|
||||||
@@ -183,18 +158,14 @@
|
|||||||
```
|
```
|
||||||
|
|
||||||
5. **数据持久化与安全更新**
|
5. **数据持久化与安全更新**
|
||||||
- 数据存储在名为 `todos-data` 的 Docker 卷中,持久化存储 `todos.json` 和 `stats.json`。
|
- 数据存储在名<EFBFBD><EFBFBD>?`todos-data` <EFBFBD><EFBFBD>?Docker 卷中,持久化存储 `todos.json` <EFBFBD><EFBFBD>?`stats.json`<EFBFBD><EFBFBD>? - **重要提示**:在更新容器时,请务必使<E5BF85><E4BDBF>?`./docker-update.sh`。不要手动运<E58AA8><E8BF90>?`docker compose down -v`,因<EFBC8C><E59BA0>?`-v` 参数会永久删除您的所有数据卷<E68DAE><E58DB7>? - 备份数据<E695B0><E68DAE>? ```bash
|
||||||
- **重要提示**:在更新容器时,请务必使用 `./docker-update.sh`。不要手动运行 `docker compose down -v`,因为 `-v` 参数会永久删除您的所有数据卷。
|
|
||||||
- 备份数据:
|
|
||||||
```bash
|
|
||||||
docker run --rm -v stark-todo-list_todos-data:/data -v $(pwd):/backup alpine tar czf /backup/todos-backup.tar.gz -C /data .
|
docker run --rm -v stark-todo-list_todos-data:/data -v $(pwd):/backup alpine tar czf /backup/todos-backup.tar.gz -C /data .
|
||||||
```
|
```
|
||||||
- 恢复数据:
|
- 恢复数据<EFBFBD><EFBFBD>? ```bash
|
||||||
```bash
|
|
||||||
docker run --rm -v stark-todo-list_todos-data:/data -v $(pwd):/backup alpine tar xzf /backup/todos-backup.tar.gz -C /data
|
docker run --rm -v stark-todo-list_todos-data:/data -v $(pwd):/backup alpine tar xzf /backup/todos-backup.tar.gz -C /data
|
||||||
```
|
```
|
||||||
|
|
||||||
6. **清理(会删除数据)**
|
6. **清理(会删除数据<EFBFBD><EFBFBD>?*
|
||||||
```bash
|
```bash
|
||||||
docker compose down -v
|
docker compose down -v
|
||||||
```
|
```
|
||||||
@@ -204,28 +175,22 @@
|
|||||||
```
|
```
|
||||||
stark-todo-list/
|
stark-todo-list/
|
||||||
├── src/
|
├── src/
|
||||||
│ ├── app/ # Next.js App Router
|
<EFBFBD><EFBFBD>? ├── app/ # Next.js App Router
|
||||||
│ │ ├── api/ # API 路由
|
<EFBFBD><EFBFBD>? <20><>? ├── api/ # API 路由
|
||||||
│ │ │ └── todos/ # Todo CRUD 端点
|
<EFBFBD><EFBFBD>? <20><>? <20><>? └── todos/ # Todo CRUD 端点
|
||||||
│ │ ├── analytics/ # 数据分析与图表页面
|
<EFBFBD><EFBFBD>? <20><>? ├── analytics/ # 数据分析与图表页<EFBFBD><EFBFBD>?<3F><>? <20><>? ├── settings/ # 设置页面
|
||||||
│ │ ├── settings/ # 设置页面
|
<EFBFBD><EFBFBD>? <20><>? ├── page.tsx # 主页<E4B8BB><E9A1B5>?<3F><>? <20><>? ├── layout.tsx # 根布局
|
||||||
│ │ ├── page.tsx # 主页面
|
<EFBFBD><EFBFBD>? <20><>? └── globals.css # 全局样式
|
||||||
│ │ ├── layout.tsx # 根布局
|
<EFBFBD><EFBFBD>? ├── components/ # React 组件
|
||||||
│ │ └── globals.css # 全局样式
|
<EFBFBD><EFBFBD>? <20><>? ├── StarkLogo.tsx # 动画 Logo
|
||||||
│ ├── components/ # React 组件
|
<EFBFBD><EFBFBD>? <20><>? └── AnalyticsDashboard.tsx # 数据可视化组<E58C96><E7BB84>?<3F><>? ├── contexts/ # React 上下<EFBFBD><EFBFBD>?<3F><>? <20><>? └── SettingsContext.tsx
|
||||||
│ │ ├── StarkLogo.tsx # 动画 Logo
|
<EFBFBD><EFBFBD>? ├── lib/ # 工具函数
|
||||||
│ │ └── AnalyticsDashboard.tsx # 数据可视化组件
|
<EFBFBD><EFBFBD>? <20><>? ├── storage.ts # JSON 文件操作
|
||||||
│ ├── contexts/ # React 上下文
|
<EFBFBD><EFBFBD>? <20><>? ├── translations.ts # 国际化翻<E58C96><E7BFBB>?<3F><>? <20><>? └── timezones.ts # 时区数据
|
||||||
│ │ └── SettingsContext.tsx
|
<EFBFBD><EFBFBD>? └── ...
|
||||||
│ ├── lib/ # 工具函数
|
├── public/ # 静态资<EFBFBD><EFBFBD>?├── scripts/
|
||||||
│ │ ├── storage.ts # JSON 文件操作
|
<EFBFBD><EFBFBD>? ├── generate-icons.js # 图标生成脚本
|
||||||
│ │ ├── translations.ts # 国际化翻译
|
<EFBFBD><EFBFBD>? └── generate-mock-data.js # 演示数据生成脚本
|
||||||
│ │ └── timezones.ts # 时区数据
|
|
||||||
│ └── ...
|
|
||||||
├── public/ # 静态资源
|
|
||||||
├── scripts/
|
|
||||||
│ ├── generate-icons.js # 图标生成脚本
|
|
||||||
│ └── generate-mock-data.js # 演示数据生成脚本
|
|
||||||
├── docker-compose.yml # Docker Compose 配置
|
├── docker-compose.yml # Docker Compose 配置
|
||||||
├── Dockerfile # Docker 镜像配置
|
├── Dockerfile # Docker 镜像配置
|
||||||
├── run.sh # 管理脚本
|
├── run.sh # 管理脚本
|
||||||
@@ -234,7 +199,7 @@ stark-todo-list/
|
|||||||
└── package.json # 项目依赖
|
└── package.json # 项目依赖
|
||||||
```
|
```
|
||||||
|
|
||||||
## 🛠️ 技术栈
|
## 🛠<EFBFBD><EFBFBD>?技术栈
|
||||||
|
|
||||||
- **框架**: Next.js 15 (App Router)
|
- **框架**: Next.js 15 (App Router)
|
||||||
- **语言**: TypeScript 5
|
- **语言**: TypeScript 5
|
||||||
@@ -242,12 +207,11 @@ stark-todo-list/
|
|||||||
- **动画**: Framer Motion
|
- **动画**: Framer Motion
|
||||||
- **图表**: Recharts
|
- **图表**: Recharts
|
||||||
- **图标**: Lucide React
|
- **图标**: Lucide React
|
||||||
- **容器化**: Docker & Docker Compose
|
- **容器<EFBFBD><EFBFBD>?*: Docker & Docker Compose
|
||||||
|
|
||||||
## 📝 数据格式
|
## 📝 数据格式
|
||||||
|
|
||||||
任务存储在 `todos.json` 中,格式如下:
|
任务存储<EFBFBD><EFBFBD>?`todos.json` 中,格式如下<EFBFBD><EFBFBD>?
|
||||||
|
|
||||||
```json
|
```json
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
@@ -266,32 +230,27 @@ stark-todo-list/
|
|||||||
|
|
||||||
## 🔌 API 接口文档
|
## 🔌 API 接口文档
|
||||||
|
|
||||||
应用提供 RESTful API 用于程序化访问。在浏览器中访问 `/api-docs` 可查看交互式 API 文档。
|
应用提供 RESTful API 用于程序化访问。在浏览器中访问 `/api-docs` 可查看交互式 API 文档<EFBFBD><EFBFBD>?
|
||||||
|
|
||||||
### 认证方式
|
### 认证方式
|
||||||
|
|
||||||
受保护的端点需要在请求头中提供 API 密钥:
|
受保护的端点需要在请求头中提供 API 密钥<EFBFBD><EFBFBD>?
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 方式一:X-API-Key 请求头
|
# 方式一:X-API-Key 请求<EFBFBD><EFBFBD>?-H "X-API-Key: your_password"
|
||||||
-H "X-API-Key: your_password"
|
|
||||||
|
|
||||||
# 方式二:Authorization Bearer 请求头
|
# 方式二:Authorization Bearer 请求<EFBFBD><EFBFBD>?-H "Authorization: Bearer your_password"
|
||||||
-H "Authorization: Bearer your_password"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
> 默认密码为 `stark123`。可通过 `AUTH_PASSWORD` 环境变量配置。
|
> 默认密码<EFBFBD><EFBFBD>?`stark123`。可通过 `AUTH_PASSWORD` 环境变量配置<EFBFBD><EFBFBD>?
|
||||||
|
|
||||||
### 接口列表
|
### 接口列表
|
||||||
|
|
||||||
#### 任务接口 (`/api/todos`)
|
#### 任务接口 (`/api/todos`)
|
||||||
|
|
||||||
| 方法 | 认证 | 描述 |
|
| 方法 | 认证 | 描述 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
| GET | ❌ | 获取所有活跃任务 |
|
| GET | <EFBFBD><EFBFBD>?| 获取所有活跃任<EFBFBD><EFBFBD>?|
|
||||||
| POST | ✅ | 创建新任务 |
|
| POST | <EFBFBD><EFBFBD>?| 创建新任<EFBFBD><EFBFBD>?|
|
||||||
| PUT | ✅ | 更新现有任务 |
|
| PUT | <EFBFBD><EFBFBD>?| 更新现有任务 |
|
||||||
| DELETE | ✅ | 软删除任务 |
|
| DELETE | <EFBFBD><EFBFBD>?| 软删除任<EFBFBD><EFBFBD>?|
|
||||||
|
|
||||||
**GET /api/todos**
|
**GET /api/todos**
|
||||||
```bash
|
```bash
|
||||||
@@ -303,7 +262,7 @@ curl https://your-domain/api/todos
|
|||||||
curl -X POST https://your-domain/api/todos \
|
curl -X POST https://your-domain/api/todos \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
-H "X-API-Key: stark123" \
|
-H "X-API-Key: stark123" \
|
||||||
-d '{"text": "新任务", "groupId": "default", "priority": "P1"}'
|
-d '{"text": "新任<EFBFBD><EFBFBD>?, "groupId": "default", "priority": "P1"}'
|
||||||
```
|
```
|
||||||
|
|
||||||
**PUT /api/todos**
|
**PUT /api/todos**
|
||||||
@@ -324,9 +283,9 @@ curl -X DELETE "https://your-domain/api/todos?id=uuid" \
|
|||||||
|
|
||||||
| 方法 | 认证 | 描述 |
|
| 方法 | 认证 | 描述 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
| GET | ❌ | 获取所有分组 |
|
| GET | <EFBFBD><EFBFBD>?| 获取所有分<EFBFBD><EFBFBD>?|
|
||||||
| POST | ✅ | 创建新分组 |
|
| POST | <EFBFBD><EFBFBD>?| 创建新分<EFBFBD><EFBFBD>?|
|
||||||
| DELETE | ✅ | 删除分组 |
|
| DELETE | <EFBFBD><EFBFBD>?| 删除分组 |
|
||||||
|
|
||||||
**GET /api/groups**
|
**GET /api/groups**
|
||||||
```bash
|
```bash
|
||||||
@@ -351,8 +310,8 @@ curl -X DELETE "https://your-domain/api/groups?id=uuid" \
|
|||||||
|
|
||||||
| 方法 | 认证 | 描述 |
|
| 方法 | 认证 | 描述 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
| GET | ❌ | 获取 PV/UV 统计 |
|
| GET | <EFBFBD><EFBFBD>?| 获取 PV/UV 统计 |
|
||||||
| POST | ❌ | 更新访问统计 |
|
| POST | <EFBFBD><EFBFBD>?| 更新访问统计 |
|
||||||
|
|
||||||
**GET /api/stats**
|
**GET /api/stats**
|
||||||
```bash
|
```bash
|
||||||
@@ -363,7 +322,7 @@ curl https://your-domain/api/stats
|
|||||||
|
|
||||||
| 方法 | 认证 | 描述 |
|
| 方法 | 认证 | 描述 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
| POST | ❌ | 验证密码 |
|
| POST | <EFBFBD><EFBFBD>?| 验证密码 |
|
||||||
|
|
||||||
**POST /api/auth**
|
**POST /api/auth**
|
||||||
```bash
|
```bash
|
||||||
@@ -374,32 +333,27 @@ curl -X POST https://your-domain/api/auth \
|
|||||||
|
|
||||||
## 🤝 贡献
|
## 🤝 贡献
|
||||||
|
|
||||||
欢迎贡献!请随时提交 Pull Request。
|
欢迎贡献!请随时提交 Pull Request<EFBFBD><EFBFBD>?
|
||||||
|
1. Fork 本仓<E69CAC><E4BB93>?2. 创建您的特性分<E680A7><E58886>?(`git checkout -b feature/AmazingFeature`)
|
||||||
1. Fork 本仓库
|
|
||||||
2. 创建您的特性分支 (`git checkout -b feature/AmazingFeature`)
|
|
||||||
3. 提交您的更改 (`git commit -m 'Add some AmazingFeature'`)
|
3. 提交您的更改 (`git commit -m 'Add some AmazingFeature'`)
|
||||||
4. 推送到分支 (`git push origin feature/AmazingFeature`)
|
4. 推送到分支 (`git push origin feature/AmazingFeature`)
|
||||||
5. 打开一个 Pull Request
|
5. 打开一<EFBFBD><EFBFBD>?Pull Request
|
||||||
|
|
||||||
更多详情请查看 [贡献指南](CONTRIBUTING.md)。
|
|
||||||
|
|
||||||
## 📄 许可证
|
|
||||||
|
|
||||||
本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件。
|
|
||||||
|
|
||||||
|
更多详情请查<EFBFBD><EFBFBD>?[贡献指南](CONTRIBUTING.md)<29><>?
|
||||||
|
## 📄 许可<E8AEB8><E58FAF>?
|
||||||
|
本项目采<EFBFBD><EFBFBD>?MIT 许可<E8AEB8><E58FAF>?- 详见 [LICENSE](LICENSE) 文件<E69687><E4BBB6>?
|
||||||
## 🙏 致谢
|
## 🙏 致谢
|
||||||
|
|
||||||
- 基于 [Next.js](https://nextjs.org/) 构建
|
- 基于 [Next.js](https://nextjs.org/) 构建
|
||||||
- UI 设计灵感来自现代极简主义
|
- UI 设计灵感来自现代极简主义
|
||||||
- 由 STARK 用 ❤️ 打造
|
- <EFBFBD><EFBFBD>?STARK <EFBFBD><EFBFBD>?❤️ 打<EFBFBD><EFBFBD>?
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
**[⬆ 返回顶部](#-stark-todo-list)**
|
**[<EFBFBD><EFBFBD>?返回顶部](#-stark-todo-list)**
|
||||||
|
|
||||||
由 STARK 用 ❤️ 制作 | 基于 Next.js
|
<EFBFBD><EFBFBD>?STARK <EFBFBD><EFBFBD>?❤️ 制作 | 基于 Next.js
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
3
dev.bat
3
dev.bat
@@ -33,13 +33,14 @@ if errorlevel 1 (
|
|||||||
)
|
)
|
||||||
|
|
||||||
echo [INFO] Starting development server...
|
echo [INFO] Starting development server...
|
||||||
echo [INFO] Server will be available at: http://localhost:3000
|
echo [INFO] Server will be available at: http://localhost:2333
|
||||||
echo [INFO] Press Ctrl+C to stop the server
|
echo [INFO] Press Ctrl+C to stop the server
|
||||||
echo.
|
echo.
|
||||||
echo ========================================
|
echo ========================================
|
||||||
echo.
|
echo.
|
||||||
|
|
||||||
REM Start the development server
|
REM Start the development server
|
||||||
|
set PORT=2333
|
||||||
call pnpm dev
|
call pnpm dev
|
||||||
|
|
||||||
REM If server exits, pause to show any errors
|
REM If server exits, pause to show any errors
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ services:
|
|||||||
context: .
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
ports:
|
ports:
|
||||||
- "4000:3000"
|
- "2333:2333"
|
||||||
volumes:
|
volumes:
|
||||||
- todos-data:/app/data
|
- todos-data:/app/data
|
||||||
environment:
|
environment:
|
||||||
|
|||||||
@@ -25,9 +25,9 @@
|
|||||||
"homepage": "https://github.com/yourusername/stark-todo-list#readme",
|
"homepage": "https://github.com/yourusername/stark-todo-list#readme",
|
||||||
"private": false,
|
"private": false,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "next dev",
|
"dev": "next dev -p 2333",
|
||||||
"build": "next build",
|
"build": "next build",
|
||||||
"start": "next start",
|
"start": "next start -p 2333",
|
||||||
"lint": "next lint"
|
"lint": "next lint"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
4
run.bat
4
run.bat
@@ -44,13 +44,14 @@ if errorlevel 1 (
|
|||||||
|
|
||||||
echo.
|
echo.
|
||||||
echo [INFO] Starting production preview server...
|
echo [INFO] Starting production preview server...
|
||||||
echo [INFO] Server will be available at: http://localhost:3000
|
echo [INFO] Server will be available at: http://localhost:2333
|
||||||
echo [INFO] Press Ctrl+C to stop the server
|
echo [INFO] Press Ctrl+C to stop the server
|
||||||
echo.
|
echo.
|
||||||
echo ========================================
|
echo ========================================
|
||||||
echo.
|
echo.
|
||||||
|
|
||||||
REM Start the production server
|
REM Start the production server
|
||||||
|
set PORT=2333
|
||||||
call pnpm start
|
call pnpm start
|
||||||
|
|
||||||
REM If server exits, pause to show any errors
|
REM If server exits, pause to show any errors
|
||||||
@@ -59,4 +60,3 @@ if errorlevel 1 (
|
|||||||
echo [ERROR] Production server exited with errors.
|
echo [ERROR] Production server exited with errors.
|
||||||
pause
|
pause
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
33
run.sh
33
run.sh
@@ -23,14 +23,14 @@ function do_stop() {
|
|||||||
rm "$PID_FILE"
|
rm "$PID_FILE"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 2. 强力兜底:查找并杀死占用 3000 端口的所有 Node 进程
|
# 2. 强力兜底:查找并杀死占<EFBFBD><EFBFBD>?2333 端口的所<EFBFBD><EFBFBD>?Node 进程
|
||||||
PORT_PIDS=$(lsof -t -i:3000)
|
PORT_PIDS=$(lsof -t -i:2333)
|
||||||
if [ -n "$PORT_PIDS" ]; then
|
if [ -n "$PORT_PIDS" ]; then
|
||||||
for P in $PORT_PIDS; do
|
for P in $PORT_PIDS; do
|
||||||
kill -9 $P >/dev/null 2>&1
|
kill -9 $P >/dev/null 2>&1
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
printf "${YELLOW}已停止所有相关进程并释放端口。${NC}\n"
|
printf "${YELLOW}已停止所有相关进程并释放端口<EFBFBD><EFBFBD>?{NC}\n"
|
||||||
}
|
}
|
||||||
|
|
||||||
function do_start() {
|
function do_start() {
|
||||||
@@ -39,36 +39,34 @@ function do_start() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
PORT_PID=$(lsof -t -i:3000)
|
PORT_PID=$(lsof -t -i:2333)
|
||||||
if [ -n "$PORT_PID" ]; then
|
if [ -n "$PORT_PID" ]; then
|
||||||
printf "${RED}错误: 端口 3000 已被占用,尝试执行 stop 后再启动${NC}\n"
|
printf "${RED}错误: 端口 2333 已被占用,尝试执<EFBFBD><EFBFBD>?stop 后再启动${NC}\n"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
printf "${GREEN}使用 $PM 启动 STARK Todo List...${NC}\n"
|
printf "${GREEN}使用 $PM 启动 STARK Todo List...${NC}\n"
|
||||||
# 抑制安装输出,保持界面整洁
|
# 抑制安装输出,保持界面整<EFBFBD><EFBFBD>? $PM install > /dev/null 2>&1
|
||||||
$PM install > /dev/null 2>&1
|
|
||||||
|
|
||||||
nohup $PM run dev > "$LOG_FILE" 2>&1 &
|
nohup $PM run dev > "$LOG_FILE" 2>&1 &
|
||||||
echo $! > "$PID_FILE"
|
echo $! > "$PID_FILE"
|
||||||
|
|
||||||
sleep 2
|
sleep 2
|
||||||
if kill -0 $(cat "$PID_FILE") 2>/dev/null; then
|
if kill -0 $(cat "$PID_FILE") 2>/dev/null; then
|
||||||
printf "${GREEN}启动成功!访问: http://localhost:3000${NC}\n"
|
printf "${GREEN}启动成功!访<EFBFBD><EFBFBD>? http://localhost:2333${NC}\n"
|
||||||
else
|
else
|
||||||
printf "${RED}启动失败,请查看 $LOG_FILE${NC}\n"
|
printf "${RED}启动失败,请查看 $LOG_FILE${NC}\n"
|
||||||
rm -f "$PID_FILE"
|
rm -f "$PID_FILE"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# --- 初始化 ---
|
# --- 初始<EFBFBD><EFBFBD>?---
|
||||||
if [ ! -f "todos.json" ]; then
|
if [ ! -f "todos.json" ]; then
|
||||||
echo "[]" > todos.json
|
echo "[]" > todos.json
|
||||||
printf "${YELLOW}已创建初始数据文件 todos.json${NC}\n"
|
printf "${YELLOW}已创建初始数据文<EFBFBD><EFBFBD>?todos.json${NC}\n"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 检查包管理器
|
# 检查包管理<EFBFBD><EFBFBD>?if command -v pnpm >/dev/null 2>&1; then
|
||||||
if command -v pnpm >/dev/null 2>&1; then
|
|
||||||
PM="pnpm"
|
PM="pnpm"
|
||||||
else
|
else
|
||||||
PM="npm"
|
PM="npm"
|
||||||
@@ -89,18 +87,18 @@ case "$1" in
|
|||||||
do_start
|
do_start
|
||||||
;;
|
;;
|
||||||
logs)
|
logs)
|
||||||
[ -f "$LOG_FILE" ] && tail -f "$LOG_FILE" || printf "${RED}日志文件不存在${NC}\n"
|
[ -f "$LOG_FILE" ] && tail -f "$LOG_FILE" || printf "${RED}日志文件不存<EFBFBD><EFBFBD>?{NC}\n"
|
||||||
;;
|
;;
|
||||||
status)
|
status)
|
||||||
if lsof -i:3000 >/dev/null 2>&1; then
|
if lsof -i:2333 >/dev/null 2>&1; then
|
||||||
printf "${GREEN}应用正在运行${NC}\n"
|
printf "${GREEN}应用正在运行${NC}\n"
|
||||||
lsof -i:3000
|
lsof -i:2333
|
||||||
else
|
else
|
||||||
printf "${RED}应用未运行${NC}\n"
|
printf "${RED}应用未运<EFBFBD><EFBFBD>?{NC}\n"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
clean)
|
clean)
|
||||||
printf "${BLUE}清理缓存和日志...${NC}\n"
|
printf "${BLUE}清理缓存和日<EFBFBD><EFBFBD>?..${NC}\n"
|
||||||
rm -rf .next "$LOG_FILE" "$PID_FILE"
|
rm -rf .next "$LOG_FILE" "$PID_FILE"
|
||||||
printf "${GREEN}清理完成${NC}\n"
|
printf "${GREEN}清理完成${NC}\n"
|
||||||
;;
|
;;
|
||||||
@@ -110,3 +108,4 @@ case "$1" in
|
|||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user