# nova-stack
**Repository Path**: shuai_dd/nova-stack
## Basic Information
- **Project Name**: nova-stack
- **Description**: NovaStack 致力于为开发者提供一套现代化、类型安全、可扩展的全栈开发解决方案,内置用户系统、权限管理、API 路由保护、国际化、代码规范等,适合企业级或个人项目快速起步。
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-06-25
- **Last Updated**: 2026-02-22
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# NovaStack
基于 Nuxt3 + Vue 3 + TypeScript + Prisma 的现代化全栈应用框架,提供完整的 RBAC 权限管理、任务调度、文件上传等功能,适合中大型 Web 应用开发。
---
## 项目简介
NovaStack 是一个企业级的全栈开发解决方案,采用现代化的技术栈,提供开箱即用的用户认证、权限管理、任务调度、文件管理等核心功能。项目遵循代码规范,注重类型安全,支持国际化、主题切换,通过 Docker 容器化部署,适合快速构建企业级应用。
## 主要功能
### 核心功能
- 🔐 用户认证系统(注册/登录/JWT令牌管理)
- 🛡️ RBAC权限管理(角色/菜单/权限多维度控制)
- 👥 多设备登录与会话管理
- 📁 文件上传与管理(支持多种文件类型)
- ⏰ 任务调度系统(Cron定时任务)
- 📧 邮件发送与验证(基于Nodemailer)
- ⚙️ 系统配置管理(动态配置项)
- 🌍 国际化支持(中英文)
- 🌓 暗色/亮色主题切换
### 技术特性
- 💎 TypeScript 全栈类型安全
- 🎨 Element Plus UI组件库
- 🎯 Prisma ORM 数据库管理
- 🚀 Redis 缓存支持(可选内置/外部)
- 📦 MySQL 数据库持久化
- 📝 ESLint + Prettier 代码规范
- 🐳 Docker 容器化部署
- 🔄 自动化数据库迁移
## 目录结构
```
├── pages/ # 前端页面
│ ├── index.vue # 首页
│ ├── login.vue # 登录页
│ ├── register.vue # 注册页
│ └── admin/ # 管理后台(17个子页面)
│ ├── index.vue # 仪表盘
│ ├── users/ # 用户管理
│ ├── roles/ # 角色管理
│ ├── menus/ # 菜单管理
│ ├── tasks/ # 任务调度
│ └── ...
├── components/ # 组件
│ ├── layout/ # 布局组件
│ └── icons/ # 图标组件
├── composables/ # 可复用逻辑(5个TS文件)
│ ├── useAuth.ts # 认证逻辑
│ └── ...
├── server/ # 服务端(78个TS文件)
│ ├── api/ # API路由
│ │ ├── admin/ # 管理后台API(21个)
│ │ ├── auth/ # 认证API
│ │ ├── config/ # 配置API
│ │ ├── files/ # 文件API
│ │ ├── tasks/ # 任务API(10个)
│ │ └── ...
│ ├── services/ # 业务服务层
│ │ ├── DbService.ts # 数据库服务
│ │ ├── AuthService.ts # 认证服务
│ │ ├── FileService.ts # 文件服务
│ │ ├── ConfigService.ts # 配置服务
│ │ └── emailSender.ts # 邮件服务
│ ├── utils/ # 工具函数
│ └── plugins/ # 服务端插件
├── prisma/ # Prisma数据库
│ ├── schema.prisma # 数据模型定义
│ ├── migrations/ # 迁移文件(8个SQL)
│ ├── seed.ts # 种子数据
│ └── db/ # 生成的Prisma Client
├── locales/ # 国际化资源(23个文件)
├── assets/ # 静态资源
│ └── css/ # CSS文件
├── types/ # TypeScript类型定义
├── layouts/ # 页面布局
├── public/ # 公共静态资源(78个文件)
├── docs/ # 文档(17个MD文件)
├── scripts/ # 部署与构建脚本
├── task/ # 任务脚本
├── logs/ # 日志目录
├── backups/ # 备份目录
├── uploads/ # 上传文件目录
├── redis-data/ # Redis数据目录
├── nuxt.config.ts # Nuxt配置
├── package.json # 依赖配置
├── docker-compose.yml # Docker编排
└── Dockerfile # Docker镜像构建
```
## 数据库模型
项目使用 Prisma ORM 管理 MySQL 数据库,包含以下核心模型:
### 用户与权限
- **users** - 用户表(用户信息、邮箱验证、登录状态)
- **roles** - 角色表(角色定义、系统角色标识)
- **permissions** - 权限表(角色与菜单的权限关联)
- **menus** - 菜单表(前端/后端/中控菜单、层级结构)
- **user_roles** - 用户角色关联表
- **user_token** - 用户令牌表(多设备登录管理)
### 系统功能
- **task** - 任务表(定时任务配置、执行状态)
- **files** - 文件表(上传文件记录、关联用户)
- **system_configs** - 系统配置表(分组配置项管理)
## API 路由
### 认证相关
- `POST /api/auth/register` - 用户注册
- `POST /api/auth/login` - 用户登录
- `POST /api/auth/logout` - 用户登出
- `GET /api/auth/user` - 获取当前用户信息
### 管理后台API
#### 用户管理
- `GET /api/admin/users` - 获取用户列表
- `POST /api/admin/users` - 创建用户
- `PUT /api/admin/users/:id` - 更新用户
- `DELETE /api/admin/users/:id` - 删除用户
#### 角色管理
- `GET /api/admin/roles` - 获取角色列表
- `POST /api/admin/roles` - 创建角色
- `PUT /api/admin/roles/:id` - 更新角色
- `DELETE /api/admin/roles/:id` - 删除角色
- `GET /api/admin/roles/:id/permissions` - 获取角色权限
#### 菜单管理
- `GET /api/admin/menus` - 获取菜单列表
- `POST /api/admin/menus` - 创建菜单
- `PUT /api/admin/menus/:id` - 更新菜单
- `DELETE /api/admin/menus/:id` - 删除菜单
#### 任务管理
- `GET /api/admin/tasks` - 获取任务列表
- `POST /api/admin/tasks` - 创建任务
- `PUT /api/admin/tasks/:id` - 更新任务
- `DELETE /api/admin/tasks/:id` - 删除任务
- `POST /api/admin/tasks/:id/run` - 手动执行任务
- `POST /api/admin/tasks/:id/start` - 启动任务
- `POST /api/admin/tasks/:id/stop` - 停止任务
### 文件管理
- `POST /api/upload` - 上传文件
- `GET /api/files` - 获取文件列表
- `GET /api/files/:id` - 获取文件详情
- `DELETE /api/files/:id` - 删除文件
### 配置管理
- `GET /api/config/:group` - 获取配置组
- `PUT /api/config/:group` - 更新配置组
- `GET /api/config/:group/:key` - 获取单个配置
## 认证与安全
- ✅ 密码加密存储(bcryptjs)
- ✅ JWT令牌生成与校验
- ✅ 多设备登录与会话管理
- ✅ 路由中间件保护(鉴权+权限验证)
- ✅ 登录失败次数限制
- ✅ 邮箱验证机制
- ✅ RBAC权限控制
## 管理后台
### 页面
- `/admin` - 仪表盘(系统概览)
- `/admin/users` - 用户管理(CRUD+角色分配)
- `/admin/roles` - 角色管理(权限配置)
- `/admin/menus` - 菜单管理(树形结构)
- `/admin/tasks` - 任务调度(Cron配置)
- `/admin/settings` - 系统设置
- `/admin/logs` - 系统日志
### 权限控制
- 基于角色的访问控制(RBAC)
- 菜单级权限过滤
- API操作权限验证
- 系统角色保护
## 技术栈
### 前端
- **框架**:Nuxt 3 + Vue 3
- **语言**:TypeScript
- **UI库**:Element Plus
- **样式**:TailwindCSS + 自定义CSS变量
- **图标**:@nuxt/icon (Lucide, Feather, UI8等)
- **动画**:motion-v
- **主题**:@nuxtjs/color-mode (暗色/亮色切换)
- **国际化**:@nuxtjs/i18n
- **图片**:@nuxt/image
### 后端
- **框架**:Nuxt 3 Server API
- **ORM**:Prisma 6
- **数据库**:MySQL 8
- **缓存**:Redis (ioredis)
- **认证**:JWT (jsonwebtoken)
- **加密**:bcryptjs, crypto-js
- **邮件**:Nodemailer
- **日志**:Winston (带日志轮转)
- **任务调度**:node-schedule
### 开发工具
- **包管理**:pnpm
- **代码规范**:ESLint + Prettier
- **提交规范**:Husky + commitlint + lint-staged
- **文档**:VitePress
- **类型检查**:TypeScript 5.6
### 部署
- **容器化**:Docker + Docker Compose
- **基础镜像**:node:22-slim (Debian)
## 开发命令
```bash
# 开发
npm run dev # 启动开发服务器(端口8080)
npm run build # 构建生产版本
npm run preview # 预览生产构建
# 数据库
npm run migrate:dev # 开发环境迁移
npm run migrate:reset # 重置数据库
npm run migrate:deploy # 生产环境迁移
npm run seed # 生成种子数据
# Prisma
npm run prisma:generate # 生成Prisma Client
# 代码质量
npm run lint # ESLint检查
npm run lint:fix # ESLint自动修复
npm run format # Prettier格式化
npm run typecheck # TypeScript类型检查
# 文档
npm run docs:dev # 启动文档服务器
npm run docs:build # 构建文档
```
## 许可证
MIT
---
> 本项目持续迭代中,欢迎关注与参与!
## 代码规范
1. **代码风格**
- 遵循ESLint和Prettier配置
- 使用2个空格缩进
- 单引号字符串
2. **类型安全**
- 所有TS文件必须通过类型检查
- 避免使用`any`类型
- 为复杂类型定义接口
3. **文档注释**
- 公共API必须包含JSDoc注释
- 遵循[JSDoc指南](./docs/JSDOC_GUIDE.md)
- 为复杂逻辑添加注释说明
4. **提交规范**
- 提交信息使用中英文描述
- 说明修改内容和原因
- 通过commitlint验证
## 快速开始
### 方式一:Docker 部署(推荐)
#### 前置要求
- Docker 20.10+
- Docker Compose 2.0+
#### 快速部署
```bash
# 1. 克隆项目
git clone
cd nova-stack
# 2. 配置环境变量
cp .env.example .env
# 编辑 .env 文件,配置数据库、Redis、JWT 等信息
# 3. 使用脚本启动服务
bash scripts/docker-build.sh start
```
#### Docker 脚本命令
项目提供了便捷的 Docker 部署脚本 `scripts/docker-build.sh`,支持以下命令:
| 命令 | 说明 |
|------|------|
| `build` | 构建 Docker 镜像 |
| `start` | 启动所有服务(包括应用和Redis) |
| `stop` | 停止所有服务 |
| `restart` | 重启服务 |
| `logs` | 查看所有服务日志 |
| `logs [服务]` | 查看指定服务日志(如 `logs app`) |
| `init` | 初始化数据库(迁移+种子数据) |
| `status` | 查看服务运行状态 |
| `clean` | 清理所有容器和数据卷(⚠️ 会删除数据) |
| `help` | 显示帮助信息 |
**示例:**
```bash
# 构建并启动服务
bash scripts/docker-build.sh build
bash scripts/docker-build.sh start
# 查看服务状态
bash scripts/docker-build.sh status
# 查看应用日志
bash scripts/docker-build.sh logs app
# 初始化数据库
bash scripts/docker-build.sh init
# 重启服务
bash scripts/docker-build.sh restart
```
#### Dockerfile 优化说明
Dockerfile 采用**多阶段构建**(Multi-stage Build),基于 `node:22-slim` 镜像:
**构建阶段(builder)**:
- 安装所有依赖(包括开发依赖)
- 生成 Prisma Client
- 构建生产版本
**生产阶段**:
- 只安装生产依赖(减少镜像体积)
- 只复制构建产物和必要文件
- 最终镜像体积大幅减小
**优化效果**:
- 📦 镜像体积减少约 50%
- ⚡ 构建时间更快(层缓存优化)
- 🔒 生产环境更安全(无开发工具)
- 🐧 基于 Debian Slim,兼容性好
#### Docker Compose 配置
`docker-compose.yml` 配置了以下服务:
- **app**: NovaStack 应用容器(Node.js 22 Slim + Nuxt 3 + 内置 Redis)
- 端口映射: `${APP_PORT:-8080}:8080`
- 外部 MySQL 数据库(通过环境变量配置)
- **灵活的 Redis 配置**:
- **内置 Redis**:设置 `REDIS_HOST=127.0.0.1` 使用容器内 Redis
- **外部 Redis**:设置 `REDIS_HOST` 为外部 Redis 地址
- 数据持久化:
- Redis 数据:`./redis-data` 挂载到容器
- 应用日志:`./logs` 挂载到容器
- 备份文件:`./backups` 挂载到容器
- 上传文件:`./uploads` 挂载到容器
- 日志轮转: 最多保留 3 个 10MB 的日志文件
#### Redis 配置说明
**使用内置 Redis(默认)**:
```env
# .env 或 docker-compose.yml 中
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=your_password
REDIS_DB=0
```
**使用外部 Redis**:
```env
# .env 或 docker-compose.yml 中
REDIS_HOST=192.168.1.54
REDIS_PORT=26379
REDIS_PASSWORD=your_password
REDIS_DB=0
```
#### 服务访问
启动成功后,访问 http://localhost:8080 即可使用应用。
### 方式二:本地开发环境
### 1. 安装依赖
```bash
npm install
```
### 2. 环境配置
1. 复制环境变量示例文件:
```bash
cp .env.example .env
```
2. 修改 `.env` 文件中的配置:
```env
# 应用配置
APP_TITLE=NovaStack
APP_NAMESPACE=nova_stack
NODE_ENV=development
PORT=8080
HOST=0.0.0.0
# 数据库配置(Prisma格式)
DB_URL=mysql://username:password@host:port/database
# Redis配置(可选:内置Redis或外部Redis)
REDIS_HOST=127.0.0.1 # 使用内置Redis
REDIS_PORT=6379
REDIS_PASSWORD=your_redis_password
REDIS_DB=0
# 或使用外部Redis:
# REDIS_HOST=192.168.1.54
# REDIS_PORT=26379
# JWT配置
JWT_SECRET=your-strong-random-key-at-least-32-characters
```
### 3. 数据库迁移
运行数据库迁移命令创建必要的表:
```bash
# 开发环境
npm run migrate:dev
# 重置数据库(删除所有数据)
npm run migrate:reset
# 生成种子数据(可选)
npm run seed
```
### 4. 启动开发服务器
```bash
npm run dev
```
### 5. 代码质量检查
```bash
npm run lint # 检查代码规范
npm run format # 格式化代码
npm run typecheck # 类型检查
```
## 开发指南
### 添加新API路由
在 `server/api/` 目录下创建新的API端点,文件名自动映射为路由:
```typescript
// server/api/example.get.ts
export default defineEventHandler(async event => {
return {
code: 200,
message: "成功",
data: { example: "data" },
}
})
```
**路由命名规则**:
- `example.get.ts` → GET /api/example
- `users/[id].get.ts` → GET /api/users/:id
- `admin/users.post.ts` → POST /api/admin/users
### 数据库操作
使用 Prisma Client 进行数据库操作:
```typescript
// 在API或Service中使用
import { PrismaClient } from '~/prisma/db'
const prisma = new PrismaClient()
// 查询
const users = await prisma.users.findMany()
// 创建
const user = await prisma.users.create({
data: { username: 'test', email: 'test@example.com', password: 'hash' }
})
// 更新
await prisma.users.update({
where: { id: 1 },
data: { status: 2 }
})
// 删除
await prisma.users.delete({ where: { id: 1 } })
```
### 使用服务层
推荐使用服务层封装业务逻辑:
```typescript
// server/services/UserService.ts
import { PrismaClient } from '~/prisma/db'
const prisma = new PrismaClient()
export class UserService {
async getUserById(id: number) {
return await prisma.users.findUnique({
where: { id },
select: { password: false, ... } // 排除敏感字段
})
}
}
```
### 添加新API
在 `server/api/` 目录下创建新的API端点:
```typescript
// server/api/example.get.ts
export default defineEventHandler(async event => {
return {
code: 200,
message: "成功",
data: {
example: "data",
},
}
})
```
### 前端Composables
使用组合式函数复用逻辑:
```typescript
// composables/useAuth.ts
export const useAuth = () => {
const user = useState('user', () => null)
const token = useCookie('token')
const login = async (email: string, password: string) => {
const { data } = await $fetch('/api/auth/login', {
method: 'POST',
body: { email, password }
})
user.value = data.user
token.value = data.token
}
const logout = async () => {
await $fetch('/api/auth/logout', { method: 'POST' })
user.value = null
token.value = null
}
return { user, login, logout }
}
```
### 使用组件库
项目集成了 Element Plus 组件库:
```vue
主要按钮
```
### 国际化使用
```vue
{{ $t('welcome') }}
```
### 代码文档规范
所有公共API和组件必须包含JSDoc注释:
```typescript
/**
* 用户服务类
* @class
* @description 提供用户相关的业务逻辑操作
*/
class UserService {
/**
* 根据ID获取用户信息
* @param {number} id - 用户ID
* @returns {Promise} 用户对象(不包含密码)
* @throws {Error} 当用户不存在时抛出错误
* @example
* const user = await userService.getUserById(1)
*/
async getUserById(id: number): Promise {
// ...
}
}
```
详细规范请参考: [JSDoc指南](./docs/JSDOC_GUIDE.md)
## 项目特色
### 1. 内置Redis支持
Docker容器内置Redis服务,支持本地开发无依赖启动,也可配置为外部Redis。
### 2. 完善的RBAC系统
基于角色-菜单-权限的三级权限控制,支持细粒度的API操作权限验证。
### 3. 任务调度系统
内置Cron任务调度器,支持任务的创建、启动、停止、手动执行和状态监控。
### 4. 文件管理
完整的文件上传、存储、管理功能,支持文件关联用户。
### 5. 系统配置
分组化的配置管理系统,支持动态加载和更新系统配置。
### 6. 邮件验证
支持邮箱验证功能,基于Nodemailer实现。
### 7. 日志管理
基于Winston的日志系统,支持日志轮转和分类存储。
## 贡献指南
1. Fork 本项目
2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'feat: Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 提交 Pull Request
## 常见问题
### Q: 如何切换内置Redis和外部Redis?
A: 在 `.env` 文件中设置 `REDIS_HOST`:
- 使用内置Redis:`REDIS_HOST=127.0.0.1`
- 使用外部Redis:`REDIS_HOST=your-redis-host`
### Q: 数据库迁移失败怎么办?
A: 检查数据库连接配置,确保数据库存在且用户有权限。可以尝试重置迁移:`npm run migrate:reset`
### Q: 如何重置管理员密码?
A: 运行种子数据会创建默认管理员账号,或直接在数据库中修改用户记录。
### Q: Docker容器无法连接MySQL?
A: 确保 `.env` 中的 `DB_URL` 使用 `host.docker.internal` 或正确的Docker网络地址。
## 联系方式
- 作者:2264505396@qq.com
- 项目主页:[GitHub](https://gitee.com/shuai_dd/nova-stack/tree/v1.0/)