万物街 be07b9ffec refactor: 全面清理项目结构,优化代码组织
主要改进:
1. 清理Core层空壳目录
   - 删除traits, transformers, query等空目录
   - 删除security, http, queue等空模块
   - 删除logger, context, exception等空壳

2. 清理Common层冗余模块
   - 删除utils, cache, queue等空壳模块
   - 删除dictionary, dict等重复字典模块
   - 删除重复的MemberModule.ts文件

3. 优化模块结构
   - 移动config到config/common目录
   - 统一模块命名规范为{模块名}.module.ts
   - 保留业务逻辑模块:auth, member, rbac, admin, settings, upload, notification

4. 代码质量提升
   - 更符合NestJS最佳实践
   - 项目结构更清晰
   - 删除所有空壳和重复代码
   - 打包测试通过

技术改进:
- 使用TypeScript枚举替代PHP风格的Dict类
- 优化导入路径和模块引用
- 清理无用的空壳目录和文件
2025-08-24 02:55:13 +08:00

WWJ Cloud 企业级框架 - NestJS + VbenAdmin 实现

一款支持插件化+云安装+云编译 快速开发SAAS多用户系统后台管理框架

使用 WWJ Cloud 企业级框架,我们开发一个软件系统,一切插件化= WWJ Cloud 框架 + 应用1 + 应用2 + 应用N + 插件1 + 插件2 + 插件N + ...

如果对您有帮助,您可以点右上角 "Star" 收藏一下,获取第一时间更新,谢谢!


📖 框架介绍

WWJ Cloud 企业级框架是一款快速开发 SaaS 通用管理系统后台框架,基于 NestJS + TypeORM + Redis + MySQL 后端技术架构和 VbenAdmin + Vue3 + TypeScript + Element Plus 前端技术栈精心设计,易读易懂,没有任何其它重度依赖,架构设计小巧灵活,没有采用过度设计模式。是一款快速可以开发企业级应用的软件系统。

【您不需要重复造轮子 框架内置已经实现基础组件功能,您只需要开发业务模块即可】!


🔗 快速链接


🌟 WWJ Cloud 开发者生态圈

WWJ Cloud 框架,目前已经实现有 NestJS + VbenAdmin 版本功能实现。整个 WWJ Cloud 开发者生态圈目前已经有众多用户。其中开发者上千人。WWJ Cloud 生态圈众多代理商、经销商、中介商都会采购插件及应用,自己运营或者分销给第三方商家用户。您只需要用心开发插件或应用,并发布到 WWJ Cloud 云应用市场,即会有人购买。依靠 WWJ Cloud 强大的生态圈,实现市场、资源、产品的研发销售闭环。从今天开始,加入 WWJ Cloud 生态圈,实现程序员创业梦想!付出就有回报。心动不如行动!


🎯 设计理念

强大的多应用+插件组合设计理念,低耦合,高内聚

基于企业级框架底层设计,采用分层架构 + 领域驱动设计,实现:

  • 清晰的依赖层次App业务开发层Common框架通用服务层Core核心基础设施层Vendor第三方适配层
  • 框架化设计Common 层提供完整的企业级通用服务App 层专注用户业务开发
  • 高内聚低耦合:每层职责明确,接口清晰,支持插拔式扩展
  • 可扩展性:支持 Addons 插件化扩展和微服务拆分
  • 企业级特性:完整的配置系统、监控、日志、安全机制
  • 微服务就绪:为未来微服务架构演进奠定基础

全新生态设计,多应用聚合+多插件组合运营模式全新升级

支持共同会员体系下多种应用+插件组合DIY装修出最强的软件系统。

插件化,完全为开发者二次开发而生

WWJ Cloud 框架采用插件化模式设计,可以做到多种插件共存,组合使用。一切皆为插件(应用)! 比如您有一个项目是电商的项目这个项目的要求是既有商城的功能又有CRM客户管理还需要进行会员的管理甚至于还要客服系统。传统的实现方式是找多个源码东拼西凑二次开发或者部署多套独立的系统配合起来。而今天使用 WWJ Cloud 框架,可以通过组装的方式,在一套体系中实现,随着发展,会有越来越多的各行各业的插件和应用上架。您对于项目的定制,可能只需要简单组装,装修页面,就可以最终实现功能交付。

首创强大的一键云安装,云编译,云发布,升级引擎

  • WWJ Cloud 框架内置简单方便的一键云安装,云编译工具
  • WWJ Cloud 内置在线升级功能,系统会全自动化帮您升级文件。产品的更新只需一键完成
  • VSCodeWebStorm微信小程序开发工具打包上传发布WWJ Cloud 框架强大的小程序一键傻瓜式发布系统,任何开发环境都不再需要搭建!鼠标一点完成小程序升级发布

🏗️ SaaS + 独立版双架构设计

WWJ Cloud 框架采用创新的 SaaS + 独立版双架构设计,一套代码同时支持两种部署模式:

🔄 SaaS 多租户模式

  • 适用场景:云服务商、多客户管理系统
  • 架构特点:通过 site_id 字段实现多租户数据隔离
  • 数据隔离:每个租户拥有独立的 site_id,数据完全隔离
  • 资源共享:共享系统基础设施,降低运营成本
  • 扩展性:支持无限租户扩展,满足 SaaS 服务商需求

🏢 独立版部署模式

  • 适用场景:企业内部系统、单客户项目、私有化部署
  • 架构特点:所有数据 site_id 统一为 0
  • 数据独立:完全独立的数据环境,无租户概念
  • 部署灵活:支持私有化部署,数据完全自主可控
  • 定制化:可根据客户需求进行深度定制

🔧 技术实现

-- 数据库表结构示例
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    site_id INT NOT NULL DEFAULT 0,  -- 租户ID0表示独立版
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_site_id (site_id)  -- 租户索引,提升查询性能
);

-- SaaS模式每个租户有独立的site_id
INSERT INTO users (site_id, username, email) VALUES (1, 'user1', 'user1@tenant1.com');
INSERT INTO users (site_id, username, email) VALUES (2, 'user2', 'user2@tenant2.com');

-- 独立版模式所有数据site_id为0
INSERT INTO users (site_id, username, email) VALUES (0, 'admin', 'admin@company.com');
INSERT INTO users (site_id, username, email) VALUES (0, 'user', 'user@company.com');

🎯 架构优势

  • 一套代码,两种模式:无需维护两套代码,降低开发成本
  • 平滑切换:可在 SaaS 和独立版之间平滑切换
  • 数据安全:多租户数据完全隔离,独立版数据完全自主
  • 部署灵活:支持云部署和私有化部署
  • 成本优化SaaS 模式资源共享,独立版模式完全控制

📊 依赖关系图

``` ┌─────────────────┐ │ App │ ← 业务开发层(用户自定义业务模块) │ (用户业务) │ 电商、CRM、ERP等具体业务逻辑 └─────────────────┘ ↓ ┌─────────────────┐ │ Common │ ← 框架通用服务层(企业级通用功能) │ (框架通用服务) │ 用户管理、权限管理、菜单管理 └─────────────────┘ 文件上传、通知服务、系统设置 ↓ 数据字典、缓存服务、队列服务 ┌─────────────────┐ │ Core │ ← 核心基础设施层(底层基础设施) │ (基础设施) │ 认证核心、数据库核心、验证核心 └─────────────────┘ HTTP核心、缓存核心、队列核心 ↓ ┌─────────────────┐ │ Vendor │ ← 第三方服务适配层 │ (外部集成) │ 存储、支付、通信、云服务适配 └─────────────────┘

┌─────────────────┐ │ Addons │ ← 插件扩展层(可插拔功能模块) │ (插件扩展) │ 扩展框架功能,不影响核心稳定性 └─────────────────┘ ```


🚀 技术亮点

🏗️ 后端技术栈NestJS 生态)

  • NestJS + TypeORM + MySQL8:采用 SaaS + 独立版双架构设计,支持多租户 SaaS 模式和独立部署模式,通过 site_id 字段区分租户,当 site_id = 0 时为独立版模式,能够提供企业级软件服务运营,同时满足用户多站点,多商户,多门店等系统开发需求
  • 严格的 RESTful API 设计:后端开发采用严格的 RESTful 的 API 设计开发,支持多语言设计开发
  • Redis 分布式缓存:高性能缓存系统,支持集群部署
  • Bull 队列系统:可靠的消息队列处理,支持任务调度和异步处理
  • JWT + RBAC 权限系统:完整的认证授权体系
  • Winston 日志系统:结构化日志记录和监控
  • Swagger API 文档:自动生成 API 文档,支持在线调试

🎨 前端技术栈VbenAdmin 生态)

  • VbenAdmin + Vue3 + TypeScript + Vite采用最新的前端技术栈VbenAdmin 是基于 Vue3、Vite、TypeScript 的现代化管理系统
  • Element Plus UI 组件库:丰富的企业级 UI 组件,开发者不需要详细了解前端,只需要用标准的 Element 组件就可以
  • Pinia 状态管理:现代化的 Vue 状态管理方案
  • Vue Router 路由管理:支持动态路由和权限控制
  • Tailwind CSS:原子化 CSS 框架,快速构建现代化界面
  • i18n 国际化:支持多语言切换,真正意义上实现多语言的开发需求
  • 响应式设计:支持桌面端、平板端、移动端自适应

🏢 企业级特性

  • SaaS + 独立版双架构支持:支持多租户 SaaS 架构和独立部署模式,通过 site_id 字段区分,当 site_id = 0 时为独立版模式
  • 多租户 SaaS 架构:支持多租户隔离,满足 SaaS 服务商需求,每个租户拥有独立的 site_id
  • 独立版部署:支持独立部署模式,适用于企业内部系统或单客户项目,所有数据 site_id 统一为 0
  • 微服务就绪:分层架构设计,支持未来微服务拆分
  • 插件化扩展Addons 插件系统,支持功能模块热插拔
  • 云原生部署:支持 Docker 容器化部署和 Kubernetes 编排
  • 监控告警:完整的系统监控和告警机制
  • 数据备份:自动化数据备份和恢复机制
  • 安全防护SQL 注入防护、XSS 防护、CSRF 防护等

🌐 多语言支持

WWJ Cloud 前端以及后端采用严格的多语言开发规范包括前端展示API 接口返回,数据验证,错误返回等全部使用多语言设计规范,使开发者能够真正意义上实现多语言的开发需求。

🛠️ 开发者友好

WWJ Cloud 结合当前市面上很多框架结构不规范,导致基础结构不稳定等情况,严格定义了分层设计的开发规范,同时 API 接口严格采用 RESTful 的开发规范,能够满足大型业务系统或者微服务的开发需求。

📦 内置功能模块

WWJ Cloud 已经搭建好常规系统的开发底层,具体功能包括:

  • 管理员管理:完整的管理员账户体系
  • 权限管理:基于 RBAC 的权限控制系统
  • 菜单管理:动态菜单配置和权限绑定
  • 用户管理:前台用户管理和会员体系
  • 应用管理:多应用管理和配置
  • 文件管理:文件上传、存储和管理
  • 系统设置:灵活的系统配置管理
  • 数据字典:系统数据字典管理
  • 通知消息:站内消息和推送通知
  • 操作日志:完整的操作审计日志
  • 定时任务:计划任务管理和调度
  • API 接口:对外开放接口管理
  • 健康检查:系统健康状态监控

📁 项目目录结构

``` src/ ├── app/ # 🏢 业务开发层(用户自定义业务模块) │ ├── demo/ # Demo 模块(标准模板示例) │ │ ├── demo.module.ts │ │ ├── controllers/ │ │ │ └── demo.controller.ts │ │ ├── services/ │ │ │ └── demo.service.ts │ │ ├── entities/ │ │ │ └── demo.entity.ts │ │ ├── dto/ │ │ │ └── demo.dto.ts │ │ └── README.md # 模块开发指南 │ └── index.ts # App 层统一导出 │ ├── common/ # 🔧 框架通用服务层(企业级通用功能) │ ├── users/ # 用户管理服务 │ ├── rbac/ # 权限管理服务 │ ├── menu/ # 菜单管理服务 │ ├── apps/ # 应用管理服务 │ ├── upload/ # 文件上传服务 │ ├── notification/ # 通知服务 │ ├── settings/ # 系统设置服务 │ ├── dictionary/ # 数据字典服务 │ ├── cache/ # 缓存服务 │ ├── queue/ # 队列服务 │ ├── health/ # 健康检查服务 │ └── openapi/ # 对外开放接口服务 │ ├── config/ # ⚙️ 配置层(运行时配置) │ ├── env/ # 环境配置 │ ├── database/ # 数据库配置 │ ├── cache/ # 缓存配置 │ ├── queue/ # 队列配置 │ ├── http/ # HTTP 配置 │ ├── security/ # 安全配置 │ ├── logger/ # 日志配置 │ └── third-party/ # 第三方服务配置 │ ├── core/ # 🏗️ 核心基础设施层(跨域通用) │ ├── auth/ # 认证核心 │ ├── database/ # 数据库核心 │ ├── validation/ # 验证核心 │ ├── http/ # HTTP 核心 │ ├── cache/ # 缓存核心 │ ├── queue/ # 队列核心 │ ├── logger/ # 日志核心 │ ├── monitoring/ # 监控核心 │ └── exceptions/ # 异常处理核心 │ ├── vendor/ # 🔌 第三方服务适配层 │ ├── storage/ # 存储服务适配 │ ├── payment/ # 支付服务适配 │ ├── communication/ # 通信服务适配 │ ├── sms/ # 短信服务适配 │ ├── email/ # 邮件服务适配

│ ├── addons/ # 🧩 插件扩展层(可插拔功能模块) │ └── README.md # 插件开发指南 │ ├── app.module.ts # 根模块 └── main.ts # 应用入口 ```


🚀 快速开始

环境要求

  • Node.js >= 18.0.0
  • npm >= 8.0.0 或 pnpm >= 7.0.0
  • MySQL >= 8.0 或 PostgreSQL >= 13
  • Redis >= 6.0

安装依赖

```bash

使用 npm

$ npm install

或使用 pnpm推荐

$ pnpm install ```

环境配置

  1. 复制环境配置文件: bash $ cp .env.example .env

  2. 配置数据库连接、Redis 连接等必要参数: ```bash

数据库配置

DB_HOST=localhost DB_PORT=3306 DB_USERNAME=root DB_PASSWORD=your_password DB_DATABASE=wwjauth

Redis 配置

REDIS_HOST=localhost REDIS_PORT=6379 REDIS_PASSWORD=

JWT 配置

JWT_SECRET=your_jwt_secret_key JWT_EXPIRES_IN=7d ```

数据库迁移

```bash

运行数据库迁移

$ npm run migration:run

填充种子数据

$ npm run seed:run ```

启动应用

```bash

开发模式

$ npm run start:dev

生产模式

$ npm run start:prod

调试模式

$ npm run start:debug ```

访问应用


🏗️ 开发指南

业务模块开发

  1. 创建新模块:参考 src/app/demo 模块结构
  2. 遵循分层架构Controller → Service → Repository → Entity
  3. 使用框架服务:充分利用 Common 层提供的通用服务
  4. 统一错误处理:使用框架提供的异常处理机制
  5. API 文档:使用 Swagger 注解生成 API 文档
  6. 单元测试:编写完整的单元测试和集成测试

🏗️ 多租户架构开发规范

📋 数据库设计规范

  • 必须包含 site_id 字段:所有业务表都必须包含 site_id 字段
  • 默认值设置site_id 字段默认值为 0表示独立版模式
  • 索引优化:为 site_id 字段创建索引,提升查询性能
  • 外键约束:跨表关联时需要考虑租户隔离
-- 标准表结构示例
CREATE TABLE products (
    id INT PRIMARY KEY AUTO_INCREMENT,
    site_id INT NOT NULL DEFAULT 0,  -- 租户ID0表示独立版
    name VARCHAR(100) NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    status TINYINT DEFAULT 1,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_site_id (site_id),  -- 租户索引
    INDEX idx_site_status (site_id, status)  -- 复合索引
);

🔧 实体类开发规范

// src/app/demo/entities/demo.entity.ts
import { Entity, Column, PrimaryGeneratedColumn, CreateDateColumn, UpdateDateColumn } from 'typeorm';

@Entity('demo')
export class DemoEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ name: 'site_id', type: 'int', default: 0, comment: '租户ID0表示独立版' })
  siteId: number;

  @Column({ name: 'name', type: 'varchar', length: 100, comment: '名称' })
  name: string;

  @Column({ name: 'status', type: 'tinyint', default: 1, comment: '状态1启用0禁用' })
  status: number;

  @CreateDateColumn({ name: 'created_at', comment: '创建时间' })
  createdAt: Date;

  @UpdateDateColumn({ name: 'updated_at', comment: '更新时间' })
  updatedAt: Date;
}

🛠️ 服务层开发规范

// src/app/demo/services/demo.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { DemoEntity } from '../entities/demo.entity';
import { CreateDemoDto } from '../dto/create-demo.dto';
import { UpdateDemoDto } from '../dto/update-demo.dto';

@Injectable()
export class DemoService {
  constructor(
    @InjectRepository(DemoEntity)
    private readonly demoRepository: Repository<DemoEntity>,
  ) {}

  // 创建时自动设置租户ID
  async create(createDemoDto: CreateDemoDto, siteId: number = 0): Promise<DemoEntity> {
    const demo = this.demoRepository.create({
      ...createDemoDto,
      siteId, // 自动设置租户ID
    });
    return this.demoRepository.save(demo);
  }

  // 查询时自动过滤租户数据
  async findAll(siteId: number = 0): Promise<DemoEntity[]> {
    return this.demoRepository.find({
      where: { siteId },
      order: { createdAt: 'DESC' },
    });
  }

  // 根据ID查询时验证租户权限
  async findOne(id: number, siteId: number = 0): Promise<DemoEntity> {
    const demo = await this.demoRepository.findOne({
      where: { id, siteId },
    });
    
    if (!demo) {
      throw new NotFoundException('数据不存在或无权限访问');
    }
    
    return demo;
  }

  // 更新时验证租户权限
  async update(id: number, updateDemoDto: UpdateDemoDto, siteId: number = 0): Promise<DemoEntity> {
    const demo = await this.findOne(id, siteId);
    
    Object.assign(demo, updateDemoDto);
    return this.demoRepository.save(demo);
  }

  // 删除时验证租户权限
  async remove(id: number, siteId: number = 0): Promise<void> {
    const demo = await this.findOne(id, siteId);
    await this.demoRepository.remove(demo);
  }
}

🎯 控制器层开发规范

// src/app/demo/controllers/demo.controller.ts
import { Controller, Get, Post, Body, Param, Delete, UseGuards, Req } from '@nestjs/common';
import { ApiTags, ApiOperation, ApiBearerAuth } from '@nestjs/swagger';
import { DemoService } from '../services/demo.service';
import { CreateDemoDto } from '../dto/create-demo.dto';
import { UpdateDemoDto } from '../dto/update-demo.dto';
import { JwtAuthGuard } from '../../common/auth/guards/jwt-auth.guard';

@Controller('demo')
@ApiTags('Demo管理')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
export class DemoController {
  constructor(private readonly demoService: DemoService) {}

  @Post()
  @ApiOperation({ summary: '创建Demo' })
  async create(@Body() createDemoDto: CreateDemoDto, @Req() req: any) {
    // 从JWT token中获取租户ID独立版默认为0
    const siteId = req.user?.siteId || 0;
    return this.demoService.create(createDemoDto, siteId);
  }

  @Get()
  @ApiOperation({ summary: '获取Demo列表' })
  async findAll(@Req() req: any) {
    const siteId = req.user?.siteId || 0;
    return this.demoService.findAll(siteId);
  }

  @Get(':id')
  @ApiOperation({ summary: '根据ID获取Demo' })
  async findOne(@Param('id') id: string, @Req() req: any) {
    const siteId = req.user?.siteId || 0;
    return this.demoService.findOne(+id, siteId);
  }

  @Put(':id')
  @ApiOperation({ summary: '更新Demo' })
  async update(@Param('id') id: string, @Body() updateDemoDto: UpdateDemoDto, @Req() req: any) {
    const siteId = req.user?.siteId || 0;
    return this.demoService.update(+id, updateDemoDto, siteId);
  }

  @Delete(':id')
  @ApiOperation({ summary: '删除Demo' })
  async remove(@Param('id') id: string, @Req() req: any) {
    const siteId = req.user?.siteId || 0;
    return this.demoService.remove(+id, siteId);
  }
}

🔐 认证授权规范

// src/common/auth/strategies/jwt.strategy.ts
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey: process.env.JWT_SECRET,
    });
  }

  async validate(payload: any) {
    return {
      userId: payload.sub,
      username: payload.username,
      siteId: payload.siteId || 0, // 租户ID默认为0独立版
      roles: payload.roles,
    };
  }
}

📊 数据迁移规范

// src/migrations/1234567890-AddSiteIdToDemo.ts
import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm';

export class AddSiteIdToDemo1234567890 implements MigrationInterface {
  public async up(queryRunner: QueryRunner): Promise<void> {
    // 添加site_id字段
    await queryRunner.addColumn(
      'demo',
      new TableColumn({
        name: 'site_id',
        type: 'int',
        default: 0,
        comment: '租户ID0表示独立版',
      }),
    );

    // 创建索引
    await queryRunner.createIndex('demo', 'idx_site_id', ['site_id']);
  }

  public async down(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.dropColumn('demo', 'site_id');
  }
}

模块结构规范

your-module/ ├── your-module.module.ts # 模块定义 ├── controllers/ # 控制器层 │ └── your-module.controller.ts ├── services/ # 服务层 │ └── your-module.service.ts ├── entities/ # 实体层 │ └── your-module.entity.ts ├── dto/ # 数据传输对象 │ ├── create-your-module.dto.ts │ ├── update-your-module.dto.ts │ └── query-your-module.dto.ts ├── repositories/ # 仓储层(可选) │ └── your-module.repository.ts ├── interfaces/ # 接口定义(可选) │ └── your-module.interface.ts └── README.md # 模块文档

代码规范

  • TypeScript 严格模式:启用所有严格类型检查
  • ESLint + Prettier:遵循代码格式化和质量检查
  • 命名规范:使用驼峰命名法和语义化命名
  • 注释规范:使用 JSDoc 格式编写注释
  • Git 提交规范:使用 Conventional Commits 规范

API 开发规范

```typescript // 控制器示例 @Controller('users') @ApiTags('用户管理') export class UsersController { @Get() @ApiOperation({ summary: '获取用户列表' }) @ApiResponse({ status: 200, description: '成功获取用户列表' }) async findAll(@Query() query: QueryUserDto) { return this.usersService.findAll(query); }

@Post() @ApiOperation({ summary: '创建用户' }) @ApiResponse({ status: 201, description: '用户创建成功' }) async create(@Body() createUserDto: CreateUserDto) { return this.usersService.create(createUserDto); } } ```


🧪 测试

```bash

单元测试

$ npm run test

端到端测试

$ npm run test:e2e

测试覆盖率

$ npm run test:cov

监听模式测试

$ npm run test:watch

调试模式测试

$ npm run test:debug ```

测试规范

  • 单元测试:每个服务和控制器都应有对应的单元测试
  • 集成测试:测试模块间的集成功能
  • 端到端测试:测试完整的用户场景
  • 测试覆盖率:保持 80% 以上的代码覆盖率

📦 构建和部署

本地构建

```bash

构建生产版本

$ npm run build

构建并启动

$ npm run start:prod ```

Docker 部署

```bash

构建 Docker 镜像

$ docker build -t wwjauth/wwjcloud-nestjs .

运行容器

$ docker run -p 3000:3000 wwjauth/wwjcloud-nestjs

使用 Docker Compose

$ docker-compose up -d ```

生产环境部署

  1. 环境准备:配置生产环境变量
  2. 数据库迁移:运行数据库迁移脚本
  3. 应用启动:使用 PM2 进程管理器启动应用
  4. 反向代理:配置 Nginx 反向代理
  5. SSL 证书:配置 HTTPS 证书
  6. 监控告警:配置系统监控和告警

```bash

PM2 部署

$ pm2 start ecosystem.config.js --env production

Nginx 配置示例

server { listen 80; server_name your-domain.com;

location / {
    proxy_pass http://localhost:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

} ```


🔧 配置说明

环境变量

变量名 描述 默认值 必填
NODE_ENV 运行环境 development
PORT 服务端口 3000
DB_HOST 数据库主机 localhost
DB_PORT 数据库端口 3306
DB_USERNAME 数据库用户名 -
DB_PASSWORD 数据库密码 -
DB_DATABASE 数据库名称 -
REDIS_HOST Redis 主机 localhost
REDIS_PORT Redis 端口 6379
REDIS_PASSWORD Redis 密码 -
JWT_SECRET JWT 密钥 -
JWT_EXPIRES_IN JWT 过期时间 7d
UPLOAD_PATH 文件上传路径 ./uploads
LOG_LEVEL 日志级别 info

功能特性配置

  • 认证系统JWT + RBAC 权限控制,支持多租户隔离
  • 文件上传:支持本地存储、阿里云 OSS、腾讯云 COS、AWS S3
  • 缓存系统Redis 分布式缓存,支持集群模式
  • 队列系统Bull 队列处理,支持任务调度和重试机制
  • 日志系统Winston 结构化日志,支持多种输出格式
  • 监控系统:健康检查、性能监控、错误追踪
  • API 文档Swagger 自动生成,支持在线调试
  • 国际化:支持多语言切换,前后端统一

📚 API 文档

启动应用后,访问以下地址查看 API 文档:

API 规范

  • RESTful 设计:遵循 REST 架构风格
  • 统一响应格式:标准化的 API 响应结构
  • 错误处理:统一的错误码和错误信息
  • 分页查询:标准化的分页参数和响应
  • 版本控制:支持 API 版本管理

typescript // 统一响应格式 { "code": 200, "message": "success", "data": {}, "timestamp": "2024-01-01T00:00:00.000Z", "path": "/api/users" }


🔌 插件开发

插件结构

addons/your-plugin/ ├── package.json # 插件配置 ├── plugin.config.ts # 插件配置文件 ├── src/ │ ├── controllers/ # 控制器 │ ├── services/ # 服务 │ ├── entities/ # 实体 │ └── dto/ # DTO ├── migrations/ # 数据库迁移 ├── seeds/ # 种子数据 └── README.md # 插件文档

插件开发指南

  1. 创建插件:使用脚手架创建插件模板
  2. 定义配置:配置插件元信息和依赖
  3. 开发功能:实现插件核心功能
  4. 数据迁移:编写数据库迁移脚本
  5. 测试验证:编写插件测试用例
  6. 打包发布:打包插件并发布到应用市场

```bash

创建插件

$ npm run plugin:create your-plugin

安装插件

$ npm run plugin:install your-plugin

启用插件

$ npm run plugin:enable your-plugin

禁用插件

$ npm run plugin:disable your-plugin ```


🤝 贡献指南

我们欢迎所有形式的贡献,包括但不限于:

  • 🐛 Bug 报告:发现问题请提交 Issue
  • 💡 功能建议:提出新功能想法
  • 📝 文档改进:完善文档内容
  • 🔧 代码贡献:提交代码修复或新功能
  • 🧩 插件开发:开发和分享插件

贡献流程

  1. Fork 仓库Fork 本仓库到您的 GitHub 账户
  2. 创建分支git checkout -b feature/AmazingFeature
  3. 提交更改git commit -m 'feat: Add some AmazingFeature'
  4. 推送分支git push origin feature/AmazingFeature
  5. 创建 PR:打开 Pull Request 并描述您的更改

代码贡献规范

  • 提交信息:使用 Conventional Commits 规范
  • 代码风格:遵循项目的 ESLint 和 Prettier 配置
  • 测试覆盖:新功能需要包含相应的测试用例
  • 文档更新:重要更改需要更新相关文档

📄 许可证

本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。


🆘 支持与帮助

如果您在使用过程中遇到问题,请通过以下方式获取帮助:

📞 联系方式

🌐 社区

📚 学习资源


🏆 致谢

感谢所有为本项目做出贡献的开发者和社区成员!

🙏 特别感谢

  • NestJS - 优秀的 Node.js 企业级框架
  • VbenAdmin - 现代化的 Vue3 管理系统框架
  • TypeORM - 强大的 TypeScript ORM 框架
  • Vue3 - 渐进式 JavaScript 框架
  • Element Plus - 基于 Vue3 的企业级 UI 组件库
  • Redis - 高性能内存数据库
  • Bull - 可靠的 Node.js 队列系统
  • Winston - 通用日志库
  • Swagger - API 文档生成工具

🌟 贡献者

感谢以下贡献者对项目的支持:


📈 项目统计

GitHub stars GitHub forks GitHub issues GitHub license GitHub release


WWJ Cloud 企业级框架 - 让企业级应用开发更简单、更高效! 🚀

基于 NestJS + VbenAdmin 的现代化企业级解决方案

给个 Star | 📖 查看文档 | 🚀 在线演示 | 💬 加入社区

Description
No description provided
Readme 94 MiB
Languages
Vue 43.5%
JavaScript 26.8%
TypeScript 26%
CSS 2%
HTML 0.9%
Other 0.7%