AI.Demo/.codebuddy/plans/后端密码访问功能开发_c75783e6.md

261 lines
8.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: 后端密码访问功能开发
overview: 为 Vue 3 前端项目添加后端密码访问控制功能,使用 Express + SQLite + JWT 实现用户密码验证和管理员密码管理功能
design:
architecture:
framework: vue
component: tdesign
styleKeywords:
- Glassmorphism
- Dark Mode
- Minimalist
- Gradient Accent
fontSystem:
fontFamily: PingFang SC
heading:
size: 28px
weight: 600
subheading:
size: 18px
weight: 500
body:
size: 16px
weight: 400
colorSystem:
primary:
- "#6366F1"
- "#8B5CF6"
- "#A855F7"
background:
- "#0F172A"
- "#1E293B"
- "#334155"
text:
- "#F8FAFC"
- "#94A3B8"
- "#64748B"
functional:
- "#10B981"
- "#EF4444"
- "#F59E0B"
todos:
- id: setup-backend
content: 创建后端项目结构,安装依赖,初始化 Express 服务和 SQLite 数据库
status: completed
- id: implement-auth-api
content: 实现用户密码验证 API 和管理员登录 API包含 JWT 生成和 bcrypt 加密
status: completed
dependencies:
- setup-backend
- id: implement-admin-api
content: 实现管理员密码管理 API增删查添加 JWT 认证中间件
status: completed
dependencies:
- setup-backend
- id: create-frontend-auth
content: 创建前端认证工具模块,实现 token 管理和 API 请求封装
status: completed
- id: create-login-pages
content: 创建用户密码输入页和管理员登录页组件,实现登录验证逻辑
status: completed
dependencies:
- create-frontend-auth
- id: create-admin-panel
content: 创建管理员密码管理面板,实现密码列表展示、添加和删除功能
status: completed
dependencies:
- create-frontend-auth
- id: add-route-guard
content: 修改路由配置,添加全局路由守卫和管理员路由,配置 Vite 代理
status: completed
dependencies:
- create-login-pages
---
## 产品概述
为现有的 AI 英语学习平台添加后端密码访问控制功能,实现全站密码保护和管理员密码管理能力。
## 核心功能
- **全站访问控制**:所有页面必须验证密码才能访问,验证后保持登录状态
- **用户密码验证**:用户输入访问密码,验证成功后通过 JWT Token 保持登录状态
- **管理员登录**:独立的管理员登录入口,使用用户名+密码验证
- **密码管理面板**:管理员可添加新的访问密码(名称+密码)、删除现有密码
- **数据安全**SQLite 数据库存储,密码使用 bcrypt 加密SQL 参数化查询防止注入
## 用户确认的配置
- 管理员凭据存储在 SQLite 数据库中(可修改)
- 所有密码都可访问全部页面(仅用于区分不同访问者)
- 使用 JWT Token 保持登录状态(无状态)
- 首次访问显示密码输入页,验证后保持登录状态
## 技术栈
### 后端(新建)
- **运行环境**Node.js
- **Web 框架**Express.js
- **数据库**SQLite3better-sqlite3 同步 API
- **认证**JWTjsonwebtoken
- **密码加密**bcryptjs
- **安全**cors、helmet、express-rate-limit
### 前端(已有)
- **框架**Vue 3 + Vite
- **路由**Vue Router 5
- **HTTP 客户端**axios已安装
## 技术架构
### 系统架构
```mermaid
graph TB
subgraph 前端 Vue3
A[路由守卫] --> B{Token 有效?}
B -->|是| C[页面组件]
B -->|否| D[密码输入页]
E[管理员入口] --> F[管理员登录页]
F --> G[密码管理面板]
end
subgraph 后端 Express
H[API 路由]
H --> I[认证中间件]
I --> J[用户密码验证]
I --> K[管理员认证]
H --> L[密码 CRUD]
end
subgraph 数据层
M[(SQLite)]
M --> N[access_passwords 表]
M --> O[admin_users 表]
end
D -->|POST /api/auth/verify| J
F -->|POST /api/admin/login| K
G -->|GET/POST/DELETE /api/admin/passwords| L
J -->|返回 JWT| D
K -->|返回 JWT| F
L --> M
```
### 数据库设计
```sql
-- 访问密码表
CREATE TABLE access_passwords (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE, -- 密码名称标识
password_hash TEXT NOT NULL, -- bcrypt 加密后的密码
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 管理员用户表
CREATE TABLE admin_users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
password_hash TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
```
### API 设计
| 端点 | 方法 | 描述 | 认证 |
| --- | --- | --- | --- |
| `/api/auth/verify` | POST | 用户密码验证 | 无 |
| `/api/auth/verify-token` | GET | 验证 Token 有效性 | User JWT |
| `/api/admin/login` | POST | 管理员登录 | 无 |
| `/api/admin/passwords` | GET | 获取密码列表 | Admin JWT |
| `/api/admin/passwords` | POST | 添加新密码 | Admin JWT |
| `/api/admin/passwords/:id` | DELETE | 删除密码 | Admin JWT |
## 实现要点
### 安全措施
1. **密码存储**:使用 bcryptjs 加密cost factor = 10
2. **JWT 配置**HS256 签名access token 有效期 7 天
3. **SQL 注入防护**:使用参数化查询
4. **速率限制**:登录接口限制 5 次/分钟/IP
5. **CORS 配置**:仅允许同源请求
### 前端路由守卫逻辑
```
用户访问任意页面 → 检查 localStorage 中的 token
→ 无 token 或无效 → 重定向到密码输入页
→ token 有效 → 正常访问
```
## 目录结构
```
c:/code/work/AI_Demo/
├── server/ # [NEW] 后端服务目录
│ ├── index.js # [NEW] Express 入口,配置中间件和路由
│ ├── database.js # [NEW] SQLite 数据库初始化和操作
│ ├── routes/
│ │ ├── auth.js # [NEW] 用户认证路由(密码验证)
│ │ └── admin.js # [NEW] 管理员路由(登录、密码管理)
│ ├── middleware/
│ │ ├── auth.js # [NEW] JWT 验证中间件
│ │ └── rateLimit.js # [NEW] 速率限制中间件
│ └── utils/
│ └── jwt.js # [NEW] JWT 生成和验证工具
├── src/
│ ├── router/
│ │ └── index.js # [MODIFY] 添加路由守卫和管理员路由
│ ├── views/
│ │ ├── LoginPage.vue # [NEW] 用户密码输入页面
│ │ ├── AdminLogin.vue # [NEW] 管理员登录页面
│ │ └── AdminPanel.vue # [NEW] 密码管理面板
│ ├── utils/
│ │ └── auth.js # [NEW] 前端认证工具token 管理、API 调用)
│ └── config/
│ └── index.js # [MODIFY] 添加后端 API 地址配置
├── package.json # [MODIFY] 添加后端依赖和启动脚本
└── vite.config.js # [MODIFY] 添加后端 API 代理配置
```
## 设计风格
采用与现有首页一致的暗色玻璃拟态风格,确保新增页面与整体设计语言统一。
## 页面设计
### 1. 密码输入页
- **整体布局**:居中卡片式布局,深色背景
- **卡片内容**:标题"访问验证"、密码输入框、提交按钮
- **交互效果**:输入框聚焦发光、按钮悬停动画、错误提示淡入淡出
- **视觉风格**:玻璃拟态卡片、渐变边框、模糊背景
### 2. 管理员登录页
- **布局**:与密码输入页类似的居中卡片
- **内容**:用户名输入框、密码输入框、登录按钮
- **区分设计**:使用不同的主题色(琥珀色系)区分管理员入口
### 3. 管理员面板
- **顶部导航**:面包屑导航、退出登录按钮
- **主区域**
- 统计卡片:显示当前密码总数
- 密码列表:表格展示所有密码(名称、创建时间、操作按钮)
- 添加表单:名称输入、密码输入、添加按钮(可折叠)
- **交互**:添加成功后自动刷新列表、删除操作需二次确认
## Agent Extensions
### SubAgent
- **code-explorer**
- Purpose: 在实现过程中需要深入探索现有代码模式时使用
- Expected outcome: 确保新代码与现有代码风格一致,遵循项目约定