feat: 完成 NestJS 后端核心底座开发 (M1-M6) 和 Ant Design Vue 前端迁移

主要更新:
1. 后端核心底座完成 (M1-M6):
   - 健康检查、指标监控、分布式锁
   - 事件总线、队列系统、事务管理
   - 安全守卫、多租户隔离、存储适配器
   - 审计日志、配置管理、多语言支持

2. 前端迁移到 Ant Design Vue:
   - 从 Element Plus 迁移到 Ant Design Vue
   - 完善 system 模块 (role/menu/dept)
   - 修复依赖和配置问题

3. 文档完善:
   - AI 开发工作流文档
   - 架构约束和开发规范
   - 项目进度跟踪

4. 其他改进:
   - 修复编译错误和类型问题
   - 完善测试用例
   - 优化项目结构
This commit is contained in:
万物街
2025-08-27 11:24:22 +08:00
parent be07b9ffec
commit 1cd5d3bdef
696 changed files with 36708 additions and 16868 deletions

View File

@@ -35,7 +35,7 @@ export const shared = defineConfig({
srcDir: 'src',
themeConfig: {
i18nRouting: true,
logo: 'https://unpkg.com/@vbenjs/static-source@0.1.7/source/logo-v1.webp',
logo: 'https://t.wanwujie.cn/img/1/2025/08/24/68aacf5d544a4.webp',
search: {
options: {
locales: {
@@ -44,12 +44,12 @@ export const shared = defineConfig({
},
provider: 'local',
},
siteTitle: 'Vben Admin',
siteTitle: 'WWJCloud',
socialLinks: [
{ icon: 'github', link: 'https://github.com/vbenjs/vue-vben-admin' },
],
},
title: 'Vben Admin',
title: 'WWJCloud Admin',
vite: {
build: {
chunkSizeWarningLimit: Infinity,

View File

@@ -5,7 +5,7 @@ import { defineConfig } from 'vitepress';
import { version } from '../../../package.json';
export const zh = defineConfig({
description: 'Vben Admin & 企业级管理系统框架',
description: 'WWJCloud & 企业级管理系统框架',
lang: 'zh-Hans',
themeConfig: {
darkModeSwitchLabel: '主题',
@@ -20,7 +20,7 @@ export const zh = defineConfig({
text: '在 GitHub 上编辑此页面',
},
footer: {
copyright: `Copyright © 2020-${new Date().getFullYear()} Vben`,
copyright: `Copyright © 2024-${new Date().getFullYear()} WWJCloud`,
message: '基于 MIT 许可发布.',
},
langMenuLabel: '多语言',
@@ -42,7 +42,8 @@ export const zh = defineConfig({
sidebar: {
'/commercial/': { base: '/commercial/', items: sidebarCommercial() },
'/components/': { base: '/components/', items: sidebarComponents() },
'/guide/': { base: '/guide/', items: sidebarGuide() },
'/vben/guide/': { base: '/vben/guide/', items: sidebarGuide() },
'/wwjcloud/': { base: '/wwjcloud/', items: sidebarWwjcloud() },
},
sidebarMenuLabel: '菜单',
},
@@ -201,16 +202,23 @@ function sidebarComponents(): DefaultTheme.SidebarItem[] {
];
}
function nav(): DefaultTheme.NavItem[] {
return [
{
activeMatch: '^/(guide|components)/',
activeMatch: '^/(vben/guide|components|wwjcloud)/',
text: '文档',
items: [
{
activeMatch: '^/guide/',
link: '/guide/introduction/vben',
text: '指南',
activeMatch: '^/wwjcloud/',
link: '/wwjcloud/',
text: 'WWJCloud',
},
{
activeMatch: '^/vben/guide/',
link: '/vben/guide/introduction/vben',
text: 'Vben Admin',
},
{
activeMatch: '^/components/',
@@ -313,6 +321,66 @@ function nav(): DefaultTheme.NavItem[] {
];
}
function sidebarWwjcloud(): DefaultTheme.SidebarItem[] {
return [
{
text: '快速开始',
items: [
{ link: '/', text: '框架概览' },
{ link: 'guide/introduction', text: '框架介绍' },
{ link: 'guide/quick-start', text: '快速开始' },
{ link: 'guide/concepts', text: '基础概念' },
],
},
{
text: '核心架构',
items: [
{ link: 'structure/overview', text: '整体架构' },
{ link: 'architecture/constraints', text: '架构约束' },
{ link: 'gateway/index', text: '网关系统' },
],
},
{
text: 'API 规范',
items: [
{ link: 'openapi/standards/restful', text: 'RESTful API 设计' },
{ link: 'openapi/standards/response', text: '响应格式规范' },
{ link: 'openapi/standards/error-codes', text: '错误码规范' },
],
},
{
text: 'API 文档',
items: [
{ link: 'openapi/api/index', text: 'API 总览' },
{
text: '前台 API',
items: [
{ link: 'openapi/api/frontend/index', text: '前台 API 概览' },
],
},
{
text: '后台 API',
items: [
{ link: 'openapi/api/adminapi/index', text: '后台 API 概览' },
],
},
],
},
{
text: '发展规划',
items: [
{ link: 'project/roadmap', text: 'Roadmap' },
],
},
{
text: '对比与选型',
items: [
{ link: 'project/comparison', text: '方案对比' },
],
},
];
}
export const search: DefaultTheme.AlgoliaSearchOptions['locales'] = {
root: {
placeholder: '搜索文档',

View File

@@ -1,726 +0,0 @@
# Niucloud 前端迁移到 Vben Admin 规划文档
## 1. 项目概述
### 1.1 迁移目标
将 Niucloud PHP 项目的管理后台前端功能迁移到基于 Vben Admin 框架的现代化管理面板中。
### 1.2 架构层级映射
#### Niucloud 架构层级
- **app**: 核心业务功能模块(用户、权限、菜单、系统设置等)
- **addons**: 插件扩展模块(可选功能模块)
- **app (业务)**: 具体业务应用模块
#### WWJCloud 架构层级
- **common**: 框架通用服务层(对应 Niucloud 的 app
- **addon**: 插件扩展层(对应 Niucloud 的 addons
- **app**: 业务开发层(对应 Niucloud 的业务 app
#### 层级映射关系
```
Niucloud → WWJCloud
├── app/ ├── common/ (核心功能:用户、权限、设置等)
├── addons/ ├── addon/ (插件扩展:可选功能模块)
└── app(业务)/ └── app/ (具体业务电商、CRM、ERP等)
```
### 1.3 技术栈对比
| 项目 | Niucloud Admin | Vben Admin (目标) |
|------|----------------|-------------------|
| 框架 | Vue 3 + TypeScript | Vue 3 + TypeScript |
| UI库 | Element Plus | Element Plus |
| 构建工具 | Vite | Vite |
| 状态管理 | Pinia | Pinia |
| 路由 | Vue Router | Vue Router |
| 样式 | SCSS + Tailwind | SCSS + Tailwind |
## 2. 目录结构对比分析
### 2.1 Niucloud Admin 结构
```
src/
├── app/ # 应用层
│ ├── api/ # API 接口定义
│ ├── assets/ # 静态资源
│ ├── components/ # 业务组件
│ ├── lang/ # 国际化
│ └── views/ # 页面视图
│ ├── app/ # 应用管理
│ ├── auth/ # 权限管理
│ ├── channel/ # 渠道管理
│ ├── dict/ # 字典管理
│ ├── diy/ # 自定义页面
│ ├── finance/ # 财务管理
│ ├── home/ # 首页
│ ├── marketing/ # 营销管理
│ ├── member/ # 会员管理
│ ├── setting/ # 系统设置
│ └── tools/ # 工具管理
├── components/ # 通用组件
├── layout/ # 布局组件
├── router/ # 路由配置
├── stores/ # 状态管理
├── styles/ # 样式文件
├── types/ # 类型定义
└── utils/ # 工具函数
```
### 2.2 Vben Admin 结构
```
src/
├── adapter/ # 适配器层
├── api/ # API 接口
├── layouts/ # 布局组件
├── locales/ # 国际化
├── router/ # 路由配置
│ └── routes/ # 路由模块
│ └── modules/ # 路由模块文件
├── store/ # 状态管理
└── views/ # 页面视图
├── _core/ # 核心页面
├── dashboard/ # 仪表板
└── demos/ # 示例页面
```
## 3. 功能模块映射方案
### 3.1 功能模块映射(全部迁移到 Common 层)
根据项目实际情况,所有 Niucloud 功能模块都将迁移到 WWJCloud 的 Common 层,作为框架底层通用功能。
#### 3.1.1 核心管理功能(高优先级)
| Niucloud 模块 | WWJCloud Common 位置 | 迁移优先级 | 功能说明 |
|---------------|---------------------|------------|----------|
| 用户管理 (user) | `common/user` | 高 | 用户账户管理 |
| 角色权限 (auth) | `common/rbac` | 高 | RBAC 权限控制 |
| 菜单管理 (menu) | `common/rbac/menu` | 高 | 动态菜单管理 |
| 系统设置 (setting) | `common/settings` | 高 | 系统配置管理 |
| 字典管理 (dict) | `common/dict` | 高 | 数据字典管理 |
| 文件管理 (file) | `common/file` | 高 | 文件上传管理 |
| 站点管理 (site) | `common/settings/site` | 高 | 站点基础配置 |
#### 3.1.2 业务管理功能(中优先级)
| Niucloud 模块 | WWJCloud Common 位置 | 迁移优先级 | 功能说明 |
|---------------|---------------------|------------|----------|
| 会员管理 (member) | `common/member` | 中 | 会员系统管理 |
| 营销工具 (marketing) | `common/marketing` | 中 | 营销活动管理 |
| 财务管理 (finance) | `common/finance` | 中 | 财务数据管理 |
| 渠道管理 (channel) | `common/channel` | 中 | 销售渠道管理 |
| 应用管理 (app) | `common/app` | 中 | 应用配置管理 |
| 首页管理 (home) | `common/dashboard` | 中 | 仪表板管理 |
#### 3.1.3 扩展功能模块(低优先级)
| Niucloud 模块 | WWJCloud Common 位置 | 迁移优先级 | 功能说明 |
|---------------|---------------------|------------|----------|
| 海报管理 (poster) | `common/poster` | 低 | 海报设计工具 |
| 打印管理 (printer) | `common/printer` | 低 | 打印模板管理 |
| 微信平台 (wxoplatform) | `common/wechat` | 低 | 微信生态集成 |
| 工具集 (tools) | `common/tools` | 低 | 辅助工具集合 |
| DIY 页面 (diy) | `common/diy` | 低 | 自定义页面构建 |
| DIY 表单 (diy_form) | `common/diy-form` | 低 | 自定义表单构建 |
### 3.2 详细页面映射(全部映射到 Common 层)
#### 3.2.1 权限管理模块 (auth/)
```
Niucloud: app/views/auth/
├── user.vue → views/common/auth/user/index.vue
├── role.vue → views/common/auth/role/index.vue
├── menu.vue → views/common/auth/menu/index.vue
├── site_menu.vue → views/common/auth/site-menu/index.vue
└── log.vue → views/common/auth/log/index.vue
```
#### 3.2.2 系统设置模块 (setting/)
```
Niucloud: app/views/setting/
├── system.vue → views/common/setting/basic/index.vue
├── adminlogin.vue → views/common/setting/login/index.vue
├── sms.vue → views/common/setting/sms/index.vue
├── pay.vue → views/common/setting/payment/index.vue
├── storage.vue → views/common/setting/storage/index.vue
├── notice.vue → views/common/setting/notification/index.vue
├── map.vue → views/common/setting/map/index.vue
└── member.vue → views/common/setting/member/index.vue
```
#### 3.2.3 会员管理模块 (member/)
```
Niucloud: app/views/member/
├── member.vue → views/common/member/list/index.vue
├── member_detail.vue → views/common/member/detail/index.vue
├── level.vue → views/common/member/level/index.vue
├── label.vue → views/common/member/label/index.vue
├── balance.vue → views/common/member/balance/index.vue
├── point.vue → views/common/member/point/index.vue
└── commission.vue → views/common/member/commission/index.vue
```
#### 3.2.4 应用管理模块 (app/)
```
Niucloud: app/views/app/
├── app.vue → views/common/app/list/index.vue
├── app_detail.vue → views/common/app/detail/index.vue
└── config.vue → views/common/app/config/index.vue
```
#### 3.2.5 营销管理模块 (marketing/)
```
Niucloud: app/views/marketing/
├── activity.vue → views/common/marketing/activity/index.vue
├── coupon.vue → views/common/marketing/coupon/index.vue
└── promotion.vue → views/common/marketing/promotion/index.vue
```
#### 3.2.6 财务管理模块 (finance/)
```
Niucloud: app/views/finance/
├── account.vue → views/common/finance/account/index.vue
├── transaction.vue → views/common/finance/transaction/index.vue
└── report.vue → views/common/finance/report/index.vue
```
#### 3.2.7 渠道管理模块 (channel/)
```
Niucloud: app/views/channel/
├── channel.vue → views/common/channel/list/index.vue
├── config.vue → views/common/channel/config/index.vue
└── statistics.vue → views/common/channel/statistics/index.vue
```
#### 3.2.8 字典管理模块 (dict/)
```
Niucloud: app/views/dict/
├── dict.vue → views/common/dict/list/index.vue
├── dict_data.vue → views/common/dict/data/index.vue
└── dict_type.vue → views/common/dict/type/index.vue
```
#### 3.2.9 文件管理模块 (file/)
```
Niucloud: app/views/file/
├── file.vue → views/common/file/list/index.vue
├── upload.vue → views/common/file/upload/index.vue
└── config.vue → views/common/file/config/index.vue
```
#### 3.2.10 扩展功能模块
```
Niucloud: app/views/poster/
├── poster.vue → views/common/poster/list/index.vue
└── template.vue → views/common/poster/template/index.vue
Niucloud: app/views/printer/
├── printer.vue → views/common/printer/list/index.vue
└── template.vue → views/common/printer/template/index.vue
Niucloud: app/views/wxoplatform/
├── config.vue → views/common/wechat/config/index.vue
└── menu.vue → views/common/wechat/menu/index.vue
Niucloud: app/views/tools/
├── generator.vue → views/common/tools/generator/index.vue
└── backup.vue → views/common/tools/backup/index.vue
Niucloud: app/views/diy/
├── page.vue → views/common/diy/page/index.vue
└── component.vue → views/common/diy/component/index.vue
Niucloud: app/views/diy_form/
├── form.vue → views/common/diy-form/list/index.vue
└── builder.vue → views/common/diy-form/builder/index.vue
```
## 4. 组件迁移策略
### 4.1 通用组件映射
| Niucloud 组件 | 功能 | Vben 替代方案 |
|---------------|------|---------------|
| upload-image | 图片上传 | VbenUpload + 自定义适配 |
| upload-file | 文件上传 | VbenUpload + 自定义适配 |
| upload-video | 视频上传 | VbenUpload + 自定义适配 |
| editor | 富文本编辑器 | VbenEditor 或 第三方编辑器 |
| select-icon | 图标选择器 | VbenIconPicker |
| select-area | 地区选择器 | VbenAreaPicker 或 自定义 |
| heat-map | 热力图 | 自定义组件 + ECharts |
| video-player | 视频播放器 | 第三方播放器组件 |
### 4.2 布局组件迁移
Niucloud 有多套布局主题:
- admin (默认)
- admin_simplicity (简洁)
- bussiness (商务)
- darkside (暗色)
- profession (专业)
**迁移策略**: 统一使用 Vben Admin 的主题系统,通过配置实现多主题切换。
## 5. 路由配置迁移
### 5.1 路由结构对比
**Niucloud 路由特点**:
- 基于文件系统的路由
- 支持动态路由加载
- 权限路由集成
**Vben Admin 路由特点**:
- 模块化路由配置
- 支持路由懒加载
- 内置权限控制
### 5.2 路由迁移示例
```typescript
// src/router/routes/modules/common.ts
import type { RouteRecordRaw } from 'vue-router';
const routes: RouteRecordRaw[] = [
{
path: '/common',
name: 'Common',
component: () => import('@/layouts/basic.vue'),
meta: {
title: '框架管理',
icon: 'common',
orderNo: 1000,
},
children: [
{
path: 'system',
name: 'CommonSystem',
meta: { title: '系统管理' },
children: [
{
path: 'auth',
name: 'CommonSystemAuth',
meta: { title: '权限管理' },
children: [
{
path: 'user',
name: 'CommonSystemAuthUser',
component: () => import('@/views/common/auth/user/index.vue'),
meta: { title: '用户管理' },
},
{
path: 'role',
name: 'CommonSystemAuthRole',
component: () => import('@/views/common/auth/role/index.vue'),
meta: { title: '角色管理' },
},
{
path: 'menu',
name: 'CommonSystemAuthMenu',
component: () => import('@/views/common/auth/menu/index.vue'),
meta: { title: '菜单管理' },
},
],
},
{
path: 'setting',
name: 'CommonSystemSetting',
meta: { title: '系统设置' },
children: [
{
path: 'basic',
name: 'CommonSystemSettingBasic',
component: () => import('@/views/common/setting/basic/index.vue'),
meta: { title: '基础设置' },
},
{
path: 'sms',
name: 'CommonSystemSettingSms',
component: () => import('@/views/common/setting/sms/index.vue'),
meta: { title: '短信设置' },
},
{
path: 'payment',
name: 'CommonSystemSettingPayment',
component: () => import('@/views/common/setting/payment/index.vue'),
meta: { title: '支付设置' },
},
{
path: 'storage',
name: 'CommonSystemSettingStorage',
component: () => import('@/views/common/setting/storage/index.vue'),
meta: { title: '存储设置' },
},
],
},
{
path: 'member',
name: 'CommonSystemMember',
meta: { title: '会员管理' },
children: [
{
path: 'list',
name: 'CommonSystemMemberList',
component: () => import('@/views/common/member/list/index.vue'),
meta: { title: '会员列表' },
},
{
path: 'level',
name: 'CommonSystemMemberLevel',
component: () => import('@/views/common/member/level/index.vue'),
meta: { title: '会员等级' },
},
],
},
],
},
{
path: 'file',
name: 'CommonFile',
meta: { title: '文件管理' },
children: [
{
path: 'list',
name: 'CommonFileList',
component: () => import('@/views/common/file/list/index.vue'),
meta: { title: '文件列表' },
},
{
path: 'upload',
name: 'CommonFileUpload',
component: () => import('@/views/common/file/upload/index.vue'),
meta: { title: '文件上传' },
},
],
},
],
},
];
export default routes;
```
## 6. API 接口迁移
### 6.1 API 结构对比
**Niucloud API 特点**:
- RESTful 风格
- 统一响应格式
- 内置权限验证
**目标 API 结构**:
- 对接后端 NestJS API
- 保持 RESTful 风格
- JWT 认证
### 6.2 API 迁移示例
```typescript
// src/api/auth.ts
import { request } from '@/api/request';
export interface UserListParams {
page?: number;
limit?: number;
keyword?: string;
}
export interface UserInfo {
id: number;
username: string;
nickname: string;
email: string;
status: number;
created_at: string;
}
// 获取用户列表
export function getUserList(params: UserListParams) {
return request<{
list: UserInfo[];
total: number;
}>('/api/users', {
method: 'GET',
params,
});
}
// 创建用户
export function createUser(data: Partial<UserInfo>) {
return request('/api/users', {
method: 'POST',
data,
});
}
// 更新用户
export function updateUser(id: number, data: Partial<UserInfo>) {
return request(`/api/users/${id}`, {
method: 'PUT',
data,
});
}
// 删除用户
export function deleteUser(id: number) {
return request(`/api/users/${id}`, {
method: 'DELETE',
});
}
```
## 7. 状态管理迁移
### 7.1 Store 结构对比
**Niucloud Stores**:
- app.ts (应用状态)
- user.ts (用户状态)
- system.ts (系统状态)
- style.ts (样式状态)
- tabbar.ts (标签栏状态)
**Vben Admin Stores**:
- auth.ts (认证状态)
- 其他业务状态按需添加
### 7.2 状态迁移示例
```typescript
// src/store/modules/system.ts
import { defineStore } from 'pinia';
export interface SystemState {
settings: {
siteName: string;
logo: string;
copyright: string;
};
dictData: Record<string, any[]>;
}
export const useSystemStore = defineStore('system', {
state: (): SystemState => ({
settings: {
siteName: '',
logo: '',
copyright: '',
},
dictData: {},
}),
getters: {
getSiteName: (state) => state.settings.siteName,
getDictByType: (state) => (type: string) => state.dictData[type] || [],
},
actions: {
async fetchSettings() {
// 获取系统设置
},
async fetchDictData() {
// 获取字典数据
},
},
});
```
## 8. 样式迁移策略
### 8.1 样式文件迁移
**保留的样式**:
- 业务相关的自定义样式
- 品牌色彩定义
- 特殊组件样式
**替换的样式**:
- 基础布局样式 (使用 Vben 内置)
- 通用组件样式 (使用 Element Plus)
- 响应式断点 (使用 Vben 配置)
### 8.2 主题配置
```typescript
// src/preferences.ts
export const preferences = {
theme: {
colorPrimary: '#1890ff', // 主色调
mode: 'light', // 主题模式
},
layout: {
sidebar: {
collapsed: false,
width: 240,
},
header: {
height: 64,
},
},
};
```
## 9. 迁移实施计划
### 9.1 阶段一目录结构搭建1周
#### 所有功能模块统一在 Common 层目录创建
```
src/views/
├── common/ # 框架通用功能层(所有 Niucloud 功能迁移到此层)
│ └── # 系统管理模块
│ ├── auth/ # 权限管理
│ │ ├── user/ # 用户管理
│ │ ├── role/ # 角色管理
│ │ ├── menu/ # 菜单管理
│ │ ├── site-menu/ # 站点菜单管理
│ │ └── log/ # 操作日志
│ ├── setting/ # 系统设置
│ │ ├── basic/ # 基础设置
│ │ ├── login/ # 登录设置
│ │ ├── sms/ # 短信设置
│ │ ├── payment/ # 支付设置
│ │ ├── storage/ # 存储设置
│ │ ├── notification/ # 通知设置
│ │ ├── map/ # 地图设置
│ │ └── member/ # 会员设置
│ ├── member/ # 会员管理
│ │ ├── list/ # 会员列表
│ │ ├── detail/ # 会员详情
│ │ ├── level/ # 会员等级
│ │ ├── label/ # 会员标签
│ │ ├── balance/ # 余额管理
│ │ ├── point/ # 积分管理
│ │ └── commission/ # 佣金管理
│ ├── marketing/ # 营销管理
│ │ ├── activity/ # 营销活动
│ │ ├── coupon/ # 优惠券
│ │ └── promotion/ # 促销活动
│ ├── finance/ # 财务管理
│ │ ├── account/ # 账户管理
│ │ ├── transaction/ # 交易记录
│ │ └── report/ # 财务报表
│ ├── channel/ # 渠道管理
│ │ ├── list/ # 渠道列表
│ │ ├── config/ # 渠道配置
│ │ └── statistics/ # 渠道统计
│ ├── app/ # 应用管理
│ │ ├── list/ # 应用列表
│ │ ├── detail/ # 应用详情
│ │ └── config/ # 应用配置
│ ├── dict/ # 字典管理
│ │ ├── list/ # 字典列表
│ │ ├── data/ # 字典数据
│ │ └── type/ # 字典类型
│ ├── file/ # 文件管理
│ │ ├── list/ # 文件列表
│ │ ├── upload/ # 文件上传
│ │ └── config/ # 文件配置
│ ├── poster/ # 海报管理
│ │ ├── list/ # 海报列表
│ │ └── template/ # 海报模板
│ ├── printer/ # 打印管理
│ │ ├── list/ # 打印机列表
│ │ └── template/ # 打印模板
│ ├── wechat/ # 微信平台
│ │ ├── config/ # 微信配置
│ │ └── menu/ # 微信菜单
│ ├── tools/ # 工具集
│ │ ├── generator/ # 代码生成
│ │ └── backup/ # 数据备份
│ ├── diy/ # DIY 页面
│ │ ├── page/ # 页面管理
│ │ └── component/ # 组件管理
│ └── diy-form/ # DIY 表单
│ ├── list/ # 表单列表
│ └── builder/ # 表单构建器
```
### 9.2 阶段二Common 层核心功能迁移2-3周
- [ ] 用户管理系统 (`user`)
- [ ] 角色权限管理 (`rbac`)
- [ ] 菜单管理系统 (`rbac/menu`)
- [ ] 系统设置模块 (`settings`)
- [ ] 数据字典管理 (`dict`)
- [ ] 文件管理系统 (`file`)
### 9.3 阶段三App 层业务功能迁移3-4周
- [ ] 会员管理系统 (`crm/member`)
- [ ] 营销工具模块 (`marketing`)
- [ ] 财务管理模块 (`erp/finance`)
- [ ] 渠道管理系统 (`channel`)
### 9.4 阶段四Addon 层扩展功能迁移2-3周
- [ ] 海报管理工具 (`addons/poster`)
- [ ] 打印模板管理 (`addons/printer`)
- [ ] 微信平台集成 (`addons/wechat`)
- [ ] 辅助工具集合 (`addons/tools`)
### 9.5 阶段五优化和测试2周
- [ ] 性能优化和代码重构
- [ ] 跨浏览器兼容性测试
- [ ] 用户体验优化
- [ ] 技术文档完善
### 9.2 开发规范
1. **组件开发**:
- 优先使用 Vben 封装组件
- 其次使用 Element Plus 原生组件
- 必要时开发自定义组件
2. **代码规范**:
- 遵循 Vben Admin 代码规范
- 使用 TypeScript 严格模式
- 统一的 ESLint 和 Prettier 配置
3. **测试策略**:
- 单元测试覆盖核心业务逻辑
- E2E 测试覆盖关键用户流程
- 兼容性测试确保多浏览器支持
## 10. 风险评估与应对
### 10.1 技术风险
| 风险项 | 影响程度 | 应对策略 |
|--------|----------|----------|
| 组件兼容性 | 中 | 提前验证,准备降级方案 |
| 性能问题 | 中 | 代码分割,懒加载优化 |
| 数据迁移 | 高 | 制定详细的数据映射方案 |
| 用户体验差异 | 中 | 保持核心交互逻辑一致 |
### 10.2 进度风险
- **人力资源**: 确保有经验的前端开发人员参与
- **时间安排**: 预留充足的测试和调试时间
- **需求变更**: 建立变更控制流程
## 11. 验收标准
### 11.1 功能验收
- [ ] 所有原有功能正常运行
- [ ] 用户权限控制正确
- [ ] 数据操作无误
- [ ] 响应式布局适配
### 11.2 性能验收
- [ ] 首屏加载时间 < 3s
- [ ] 页面切换流畅
- [ ] 大数据量列表渲染正常
### 11.3 兼容性验收
- [ ] Chrome/Firefox/Safari 最新版本
- [ ] 移动端适配
- [ ] 不同分辨率屏幕适配
---
**文档版本**: v1.0
**创建时间**: 2025-01-22
**更新时间**: 2025-01-22
**负责人**: 开发团队
**审核人**: 项目经理

View File

@@ -1,11 +1,13 @@
{
"name": "@vben/docs",
"version": "5.5.9",
"version": "5.5.8",
"private": true,
"scripts": {
"build": "vitepress build",
"dev": "vitepress dev",
"docs:preview": "vitepress preview"
"docs:preview": "vitepress preview",
"generate-api": "node scripts/generate-api-docs.js",
"generate-api:dev": "BACKEND_URL=http://localhost:3000 node scripts/generate-api-docs.js"
},
"imports": {
"#/*": {
@@ -20,6 +22,7 @@
"@vben/plugins": "workspace:*",
"@vben/styles": "workspace:*",
"ant-design-vue": "catalog:",
"axios": "^1.11.0",
"lucide-vue-next": "catalog:",
"medium-zoom": "catalog:",
"radix-vue": "catalog:",

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z" fill="#4479A1"/>
</svg>

After

Width:  |  Height:  |  Size: 250 B

View File

@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16.287 3.83a.5.5 0 0 1 .5.5v2.5a.5.5 0 0 1-.5.5h-2.5a.5.5 0 0 1-.5-.5v-2.5a.5.5 0 0 1 .5-.5h2.5zm-5 0a.5.5 0 0 1 .5.5v2.5a.5.5 0 0 1-.5.5h-2.5a.5.5 0 0 1-.5-.5v-2.5a.5.5 0 0 1 .5-.5h2.5zm5 5a.5.5 0 0 1 .5.5v2.5a.5.5 0 0 1-.5.5h-2.5a.5.5 0 0 1-.5-.5v-2.5a.5.5 0 0 1 .5-.5h2.5zm-5 0a.5.5 0 0 1 .5.5v2.5a.5.5 0 0 1-.5.5h-2.5a.5.5 0 0 1-.5-.5v-2.5a.5.5 0 0 1 .5-.5h2.5zm5 5a.5.5 0 0 1 .5.5v2.5a.5.5 0 0 1-.5.5h-2.5a.5.5 0 0 1-.5-.5v-2.5a.5.5 0 0 1 .5-.5h2.5zm-5 0a.5.5 0 0 1 .5.5v2.5a.5.5 0 0 1-.5.5h-2.5a.5.5 0 0 1-.5-.5v-2.5a.5.5 0 0 1 .5-.5h2.5z" fill="#E0234E"/>
</svg>

After

Width:  |  Height:  |  Size: 678 B

View File

@@ -0,0 +1,4 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 2L2 7v10l10 5 10-5V7L12 2zm0 2.236L19.5 8v8L12 20.764 4.5 16V8L12 4.236z" fill="#DC382D"/>
<path d="M12 6L6 9v6l6 3 6-3V9l-6-3z" fill="#DC382D"/>
</svg>

After

Width:  |  Height:  |  Size: 266 B

View File

@@ -0,0 +1,4 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 2L2 7v10l10 5 10-5V7L12 2zm0 2.236L19.5 8v8L12 20.764 4.5 16V8L12 4.236z" fill="#FCA326"/>
<path d="M12 6L6 9v6l6 3 6-3V9l-6-3z" fill="#FCA326"/>
</svg>

After

Width:  |  Height:  |  Size: 266 B

View File

@@ -0,0 +1,43 @@
<svg width="120" height="120" viewBox="0 0 120 120" fill="none" xmlns="http://www.w3.org/2000/svg">
<!-- 定义渐变和阴影 -->
<defs>
<linearGradient id="bgGradient" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#3B82F6;stop-opacity:1" />
<stop offset="50%" style="stop-color:#2563EB;stop-opacity:1" />
<stop offset="100%" style="stop-color:#1E40AF;stop-opacity:1" />
</linearGradient>
<filter id="shadow" x="-20%" y="-20%" width="140%" height="140%">
<feDropShadow dx="2" dy="4" stdDeviation="3" flood-color="#000000" flood-opacity="0.15"/>
</filter>
<filter id="glow" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur stdDeviation="2" result="coloredBlur"/>
<feMerge>
<feMergeNode in="coloredBlur"/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
</defs>
<!-- 背景圆形 -->
<circle cx="60" cy="60" r="55" fill="url(#bgGradient)" filter="url(#shadow)"/>
<!-- 云朵形状 - 主形状 -->
<path d="M20 50 Q10 40 20 30 Q30 20 40 30 Q50 20 60 30 Q70 20 80 30 Q90 40 80 50 Q90 60 80 70 Q70 80 60 70 Q50 80 40 70 Q30 80 20 70 Q10 60 20 50"
fill="white" opacity="0.95" filter="url(#glow)"/>
<!-- 字母 W - 主要标识 -->
<path d="M25 45 L35 65 L45 50 L55 65 L65 45"
stroke="white" stroke-width="5" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<!-- 装饰点 -->
<circle cx="15" cy="15" r="2.5" fill="white" opacity="0.9"/>
<circle cx="105" cy="15" r="2.5" fill="white" opacity="0.9"/>
<circle cx="15" cy="105" r="2.5" fill="white" opacity="0.9"/>
<circle cx="105" cy="105" r="2.5" fill="white" opacity="0.9"/>
<!-- 中心装饰 -->
<circle cx="60" cy="60" r="4" fill="white" opacity="0.7"/>
<!-- 外圈装饰 -->
<circle cx="60" cy="60" r="50" stroke="white" stroke-width="1" fill="none" opacity="0.3"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,168 @@
# 文档脚本说明
## API 文档自动生成脚本
### 功能说明
`generate-api-docs.js` 脚本用于从后端的 Swagger API 自动生成前端文档。
### 使用方法
#### 1. 安装依赖
```bash
cd admin/docs
npm install
```
#### 2. 运行自动生成脚本
```bash
# 使用默认配置http://localhost:3000
npm run generate-api
# 指定后端服务地址
BACKEND_URL=http://your-backend-url npm run generate-api
# 开发环境快捷命令
npm run generate-api:dev
```
#### 3. 查看生成结果
生成完成后,会在以下目录生成文档:
```
admin/docs/src/wwjcloud/openapi/api/
├── api/ # 前台 API (对应后端 /api/)
│ ├── index.md # 前台 API 概览
│ ├── member.md # 会员管理 API (自动生成)
│ ├── auth.md # 认证 API (自动生成)
│ └── ... # 其他模块 API
└── adminapi/ # 后台 API (对应后端 /adminapi/)
├── index.md # 后台 API 概览
├── member.md # 会员管理 API (自动生成)
├── admin.md # 管理员 API (自动生成)
└── ... # 其他模块 API
```
### 配置说明
#### 环境变量
- `BACKEND_URL`: 后端服务地址,默认为 `http://localhost:3000`
#### API 分组配置
脚本会自动处理以下 API 分组:
- **前台 API**: `/api-json` (对应后端 `/api/` 路径)
- **后台 API**: `/adminapi-json` (对应后端 `/adminapi/` 路径)
### 自动生成内容
生成的文档包含:
- **API 接口列表**: 按模块自动分组
- **请求参数说明**: 自动解析 Swagger 参数定义
- **响应示例**: 统一的响应格式
- **接口描述**: 从 Swagger 自动提取
- **在线测试链接**: 指向后端 Swagger UI
### 目录结构对齐
前端文档目录结构与后端保持一致:
```
后端路径 前端文档路径
/api/ → /api/
/adminapi/ → /adminapi/
```
### 注意事项
1. **后端服务必须运行**: 确保后端服务已启动并可访问
2. **Swagger 配置**: 确保后端已正确配置 Swagger 文档
3. **网络连接**: 确保能够访问后端服务地址
4. **权限问题**: 某些 API 可能需要认证才能访问
### 故障排除
#### 1. 连接失败
```bash
# 检查后端服务是否运行
curl http://localhost:3000/api-json
# 检查网络连接
ping localhost
```
#### 2. 权限问题
如果 API 需要认证,可以在脚本中添加认证头:
```javascript
// 在 generate-api-docs.js 中修改
const response = await axios.get(url, {
headers: {
'Authorization': 'Bearer your-token'
}
});
```
#### 3. 文档生成失败
检查输出目录权限:
```bash
# 确保目录存在且有写权限
ls -la admin/docs/src/wwjcloud/openapi/api/
```
### 自定义配置
如需自定义配置,可以修改 `generate-api-docs.js` 中的 `config` 对象:
```javascript
const config = {
// 修改后端服务地址
backendUrl: process.env.BACKEND_URL || 'http://localhost:3000',
// 修改输出目录
docsDir: path.join(__dirname, '../src/wwjcloud/openapi/api'),
// 添加新的 API 分组
apiGroups: {
// ... 现有配置
custom: {
name: '自定义 API',
swaggerPath: '/custom-json',
outputDir: 'custom',
prefix: '/custom'
}
}
};
```
### 集成到 CI/CD
可以将自动生成脚本集成到 CI/CD 流程中:
```yaml
# GitHub Actions 示例
- name: Generate API Docs
run: |
cd admin/docs
npm install
npm run generate-api
env:
BACKEND_URL: ${{ secrets.BACKEND_URL }}
```
### 相关文件
- `generate-api-docs.js`: 主自动生成脚本
- `package.json`: 脚本命令配置
- `src/wwjcloud/openapi/api/`: 生成的文档目录
- `.vitepress/config/zh.mts`: 侧边栏配置

View File

@@ -0,0 +1,186 @@
#!/usr/bin/env node
/**
* API 文档自动生成脚本
* 从后端 Swagger 自动生成前端文档
*/
const fs = require('fs');
const path = require('path');
const axios = require('axios');
// 配置
const config = {
backendUrl: process.env.BACKEND_URL || 'http://localhost:3000',
docsDir: path.join(__dirname, '../src/wwjcloud/openapi/api'),
apiGroups: {
unified: {
name: '统一 API',
swaggerPath: '/docs-json',
outputDir: 'unified',
prefix: ''
}
}
};
/**
* 获取 Swagger JSON
*/
async function getSwaggerJson(group) {
try {
const url = `${config.backendUrl}${group.swaggerPath}`;
console.log(`获取 ${group.name} API: ${url}`);
const response = await axios.get(url);
return response.data;
} catch (error) {
console.error(`获取失败: ${error.message}`);
return null;
}
}
/**
* 生成模块文档
*/
function generateModuleDoc(group, tag, paths) {
const moduleName = tag.name;
let markdown = `---
title: ${moduleName} API
description: ${tag.description || `${moduleName} 相关接口`}
---
# ${moduleName} API
::: info ${moduleName}
${tag.description || `${moduleName} 相关接口`}
:::
## API 列表
`;
// 查找该标签下的接口
Object.keys(paths).forEach(path => {
Object.keys(paths[path]).forEach(method => {
const operation = paths[path][method];
if (operation.tags && operation.tags.includes(tag.name)) {
markdown += generateApiDoc(path, method, operation);
}
});
});
return markdown;
}
/**
* 生成单个 API 文档
*/
function generateApiDoc(path, method, operation) {
const summary = operation.summary || operation.operationId || '未命名接口';
let doc = `### ${summary}\n\n`;
doc += `**接口**: \`${method.toUpperCase()} ${path}\`\n\n`;
if (operation.description) {
doc += `**描述**: ${operation.description}\n\n`;
}
// 请求参数
if (operation.parameters && operation.parameters.length > 0) {
doc += `**参数**:\n\n`;
doc += `| 参数 | 类型 | 必填 | 说明 |\n`;
doc += `|------|------|------|------|\n`;
operation.parameters.forEach(param => {
const required = param.required ? '是' : '否';
const type = param.type || param.schema?.type || 'string';
doc += `| ${param.name} | ${type} | ${required} | ${param.description || ''} |\n`;
});
doc += `\n`;
}
// 请求体
if (operation.requestBody) {
doc += `**请求体**:\n\n`;
doc += `\`\`\`json\n`;
doc += `{\n`;
doc += ` // 请求数据\n`;
doc += `}\n`;
doc += `\`\`\`\n\n`;
}
// 响应
doc += `**响应**:\n\n`;
doc += `\`\`\`json\n`;
doc += `{\n`;
doc += ` "code": 200,\n`;
doc += ` "message": "success",\n`;
doc += ` "data": {\n`;
doc += ` // 响应数据\n`;
doc += ` }\n`;
doc += `}\n`;
doc += `\`\`\`\n\n`;
doc += `---\n\n`;
return doc;
}
/**
* 保存文档
*/
function saveDocument(outputPath, content) {
try {
const dir = path.dirname(outputPath);
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
}
fs.writeFileSync(outputPath, content, 'utf8');
console.log(`已保存: ${outputPath}`);
} catch (error) {
console.error(`保存失败: ${error.message}`);
}
}
/**
* 主函数
*/
async function main() {
console.log('开始自动生成 API 文档...\n');
for (const [key, group] of Object.entries(config.apiGroups)) {
console.log(`处理 ${group.name}...`);
const swaggerData = await getSwaggerJson(group);
if (!swaggerData) {
console.log(`跳过 ${group.name}\n`);
continue;
}
const tags = swaggerData.tags || [];
const paths = swaggerData.paths || {};
// 为每个标签生成文档
for (const tag of tags) {
const moduleName = tag.name.toLowerCase().replace(/\s+/g, '-');
const content = generateModuleDoc(group, tag, paths);
const outputPath = path.join(config.docsDir, group.outputDir, `${moduleName}.md`);
saveDocument(outputPath, content);
}
console.log(`${group.name} 完成\n`);
}
console.log('API 文档生成完成!');
console.log('访问: http://localhost:6173/wwjcloud/openapi/api/');
}
// 运行
if (require.main === module) {
main().catch(error => {
console.error('执行失败:', error);
process.exit(1);
});
}
module.exports = { config, getSwaggerJson, generateModuleDoc };

View File

@@ -0,0 +1,419 @@
#!/usr/bin/env node
/**
* API 文档自动生成脚本
* 使用 OpenAPI 从后端 Swagger 自动生成前端文档
*/
const fs = require('fs');
const path = require('path');
const axios = require('axios');
// 配置
const config = {
// 后端服务地址
backendUrl: process.env.BACKEND_URL || 'http://localhost:3000',
// 文档输出目录
docsDir: path.join(__dirname, '../src/wwjcloud/openapi/api'),
// API 分组配置
apiGroups: {
api: {
name: '前台 API',
swaggerPath: '/api/api-json',
outputDir: 'frontend',
description: '前台用户访问的 API 接口',
prefix: '/api'
},
adminapi: {
name: '后台 API',
swaggerPath: '/api/adminapi-json',
outputDir: 'adminapi',
description: '后台管理员访问的 API 接口',
prefix: '/adminapi'
}
}
};
/**
* 获取 Swagger JSON
*/
async function getSwaggerJson(group) {
try {
const url = `${config.backendUrl}${group.swaggerPath}`;
console.log(`正在获取 ${group.name} API 文档: ${url}`);
const response = await axios.get(url);
return response.data;
} catch (error) {
console.error(`获取 ${group.name} API 文档失败:`, error.message);
return null;
}
}
/**
* 生成 API 概览文档
*/
function generateOverview(group) {
return `---
title: ${group.name}
description: ${group.description}
---
# ${group.name}
::: info ${group.name} 说明
${group.description}
:::
## API 基础信息
- **基础路径**: \`${group.prefix}/\`
- **认证方式**: JWT Bearer Token
- **内容类型**: \`application/json\`
- **字符编码**: \`UTF-8\`
## 模块列表
::: tip 自动生成
此文档由后端 Swagger 自动生成,包含最新的 API 接口信息。
:::
## 认证流程
### 获取 Token
\`\`\`http
POST ${group.prefix}/auth/login
Content-Type: application/json
{
"username": "user@example.com",
"password": "password123"
}
\`\`\`
## 响应格式
所有 API 都遵循统一的响应格式:
\`\`\`json
{
"code": 200,
"message": "success",
"data": {
// 具体数据
}
}
\`\`\`
## 错误处理
API 错误响应格式:
\`\`\`json
{
"code": 400,
"message": "参数错误",
"data": null
}
\`\`\`
## 状态码说明
| 状态码 | 说明 |
|--------|------|
| 200 | 请求成功 |
| 201 | 创建成功 |
| 400 | 请求参数错误 |
| 401 | 未授权 |
| 403 | 禁止访问 |
| 404 | 资源不存在 |
| 500 | 服务器内部错误 |
## 开发工具
### Swagger UI
访问 \`${config.backendUrl}${group.prefix}\` 查看完整的 API 文档和在线测试功能。
### 在线测试
每个 API 分组都提供 Swagger UI 界面,支持:
- API 文档查看
- 在线测试
- 参数验证
- 响应示例
`;
}
/**
* 生成模块 API 文档
*/
function generateModuleDoc(group, tag, paths) {
const moduleName = tag.name.toLowerCase().replace(/\s+/g, '-');
const moduleDesc = tag.description || `${moduleName} 相关接口`;
let markdown = `---
title: ${moduleName} API
description: ${moduleDesc}
---
# ${moduleName} API
::: info ${moduleName} API
${moduleDesc}
:::
## 基础信息
- **模块路径**: \`${group.prefix}/${moduleName.toLowerCase()}/\`
- **认证方式**: JWT Bearer Token部分接口需要
- **内容类型**: \`application/json\`
## API 列表
`;
// 查找该标签下的所有接口
Object.keys(paths).forEach(path => {
Object.keys(paths[path]).forEach(method => {
const operation = paths[path][method];
if (operation.tags && operation.tags.includes(tag.name)) {
markdown += generateApiDoc(path, method, operation, group.prefix);
}
});
});
return markdown;
}
/**
* 生成单个 API 文档
*/
function generateApiDoc(path, method, operation, prefix) {
const summary = operation.summary || operation.operationId || '未命名接口';
const description = operation.description || '';
let doc = `### ${summary}\n\n`;
// 接口地址
doc += `**接口地址**: \`${method.toUpperCase()} ${path}\`\n\n`;
// 接口描述
if (description) {
doc += `**接口描述**: ${description}\n\n`;
}
// 请求参数
if (operation.parameters && operation.parameters.length > 0) {
doc += `**请求参数**:\n\n`;
if (method === 'get') {
doc += `| 参数 | 类型 | 必填 | 说明 |\n`;
doc += `|------|------|------|------|\n`;
operation.parameters.forEach(param => {
const required = param.required ? '是' : '否';
const type = param.type || param.schema?.type || 'string';
doc += `| ${param.name} | ${type} | ${required} | ${param.description || ''} |\n`;
});
doc += `\n`;
} else {
doc += `\`\`\`json\n`;
doc += `{\n`;
operation.parameters.forEach((param, index) => {
const comma = index < operation.parameters.length - 1 ? ',' : '';
const type = param.type || param.schema?.type || 'string';
doc += ` "${param.name}": "${type}"${comma}\n`;
});
doc += `}\n`;
doc += `\`\`\`\n\n`;
}
}
// 请求体
if (operation.requestBody) {
doc += `**请求体**:\n\n`;
doc += `\`\`\`json\n`;
if (operation.requestBody.content && operation.requestBody.content['application/json']) {
const schema = operation.requestBody.content['application/json'].schema;
if (schema && schema.properties) {
doc += `{\n`;
Object.keys(schema.properties).forEach((prop, index) => {
const comma = index < Object.keys(schema.properties).length - 1 ? ',' : '';
const type = schema.properties[prop].type || 'string';
doc += ` "${prop}": "${type}"${comma}\n`;
});
doc += `}\n`;
} else {
doc += `{\n`;
doc += ` // 请求体内容\n`;
doc += `}\n`;
}
} else {
doc += `{\n`;
doc += ` // 请求体内容\n`;
doc += `}\n`;
}
doc += `\`\`\`\n\n`;
}
// 响应示例
if (operation.responses) {
doc += `**响应示例**:\n\n`;
const successResponse = operation.responses['200'] || operation.responses['201'];
if (successResponse) {
doc += `\`\`\`json\n`;
doc += `{\n`;
doc += ` "code": 200,\n`;
doc += ` "message": "success",\n`;
doc += ` "data": {\n`;
if (successResponse.content && successResponse.content['application/json']) {
const schema = successResponse.content['application/json'].schema;
if (schema && schema.properties) {
Object.keys(schema.properties).forEach((prop, index) => {
const comma = index < Object.keys(schema.properties).length - 1 ? ',' : '';
const type = schema.properties[prop].type || 'string';
doc += ` "${prop}": "${type}"${comma}\n`;
});
} else {
doc += ` // 响应数据\n`;
}
} else {
doc += ` // 响应数据\n`;
}
doc += ` }\n`;
doc += `}\n`;
doc += `\`\`\`\n\n`;
}
}
doc += `---\n\n`;
return doc;
}
/**
* 保存文档到文件
*/
function saveDocument(outputPath, content) {
try {
// 确保目录存在
const dir = path.dirname(outputPath);
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
}
fs.writeFileSync(outputPath, content, 'utf8');
console.log(`文档已保存: ${outputPath}`);
} catch (error) {
console.error(`保存文档失败: ${outputPath}`, error.message);
}
}
/**
* 更新侧边栏配置
*/
function updateSidebar(group, tags) {
const sidebarPath = path.join(__dirname, '../.vitepress/config/zh.mts');
let sidebarContent = fs.readFileSync(sidebarPath, 'utf8');
// 生成模块链接
const moduleLinks = tags.map(tag => {
const moduleName = tag.name.toLowerCase().replace(/\s+/g, '-');
return ` { link: 'openapi/api/${group.outputDir}/${moduleName}', text: '${tag.name} API' }`;
}).join(',\n');
// 更新侧边栏配置
const sidebarPattern = new RegExp(`(text: '${group.name}',\\s*items: \\[\\s*\\{[^}]+\\},?\\s*)(\\])`, 's');
const replacement = `$1,\n${moduleLinks}\n $2`;
if (sidebarContent.match(sidebarPattern)) {
sidebarContent = sidebarContent.replace(sidebarPattern, replacement);
fs.writeFileSync(sidebarPath, sidebarContent, 'utf8');
console.log(`侧边栏配置已更新: ${group.name}`);
}
}
/**
* 主函数
*/
async function main() {
console.log('开始自动生成 API 文档...\n');
for (const [key, group] of Object.entries(config.apiGroups)) {
console.log(`处理 ${group.name}...`);
// 获取 Swagger JSON统一
const swaggerData = await getSwaggerJson(group);
if (!swaggerData) {
console.log(`跳过 ${group.name},无法获取数据\n`);
continue;
}
// 基于分组前缀过滤 paths
const filterByPrefix = (doc, prefix) => {
const cloned = JSON.parse(JSON.stringify(doc));
const filteredPaths = {};
Object.keys(cloned.paths || {}).forEach((p) => {
if (p.startsWith(prefix)) filteredPaths[p] = cloned.paths[p];
});
cloned.paths = filteredPaths;
return cloned;
};
const filtered = filterByPrefix(swaggerData, group.prefix + '/');
// 生成概览文档
const overviewContent = generateOverview(group);
const overviewPath = path.join(config.docsDir, group.outputDir, 'index.md');
saveDocument(overviewPath, overviewContent);
// 按标签生成模块文档
const tags = filtered.tags || [];
const paths = filtered.paths || {};
for (const tag of tags) {
const moduleName = tag.name.toLowerCase().replace(/\s+/g, '-');
const moduleContent = generateModuleDoc(group, tag, paths);
const modulePath = path.join(config.docsDir, group.outputDir, `${moduleName}.md`);
saveDocument(modulePath, moduleContent);
}
// 更新侧边栏配置
updateSidebar(group, tags);
console.log(`${group.name} 处理完成\n`);
}
console.log('API 文档自动生成完成!');
console.log('\n下一步');
console.log('1. 启动文档服务: npm run dev');
console.log('2. 访问: http://localhost:6173/wwjcloud/openapi/api/');
}
// 运行脚本
if (require.main === module) {
main().catch(error => {
console.error('脚本执行失败:', error);
process.exit(1);
});
}
module.exports = {
config,
getSwaggerJson,
generateOverview,
generateModuleDoc,
saveDocument,
updateSidebar
};

View File

@@ -90,52 +90,30 @@ import { h } from 'vue';
import { globalShareState, IconPicker } from '@vben/common-ui';
import { $t } from '@vben/locales';
const AutoComplete = defineAsyncComponent(
() => import('ant-design-vue/es/auto-complete'),
);
const Button = defineAsyncComponent(() => import('ant-design-vue/es/button'));
const Checkbox = defineAsyncComponent(
() => import('ant-design-vue/es/checkbox'),
);
const CheckboxGroup = defineAsyncComponent(() =>
import('ant-design-vue/es/checkbox').then((res) => res.CheckboxGroup),
);
const DatePicker = defineAsyncComponent(
() => import('ant-design-vue/es/date-picker'),
);
const Divider = defineAsyncComponent(() => import('ant-design-vue/es/divider'));
const Input = defineAsyncComponent(() => import('ant-design-vue/es/input'));
const InputNumber = defineAsyncComponent(
() => import('ant-design-vue/es/input-number'),
);
const InputPassword = defineAsyncComponent(() =>
import('ant-design-vue/es/input').then((res) => res.InputPassword),
);
const Mentions = defineAsyncComponent(
() => import('ant-design-vue/es/mentions'),
);
const Radio = defineAsyncComponent(() => import('ant-design-vue/es/radio'));
const RadioGroup = defineAsyncComponent(() =>
import('ant-design-vue/es/radio').then((res) => res.RadioGroup),
);
const RangePicker = defineAsyncComponent(() =>
import('ant-design-vue/es/date-picker').then((res) => res.RangePicker),
);
const Rate = defineAsyncComponent(() => import('ant-design-vue/es/rate'));
const Select = defineAsyncComponent(() => import('ant-design-vue/es/select'));
const Space = defineAsyncComponent(() => import('ant-design-vue/es/space'));
const Switch = defineAsyncComponent(() => import('ant-design-vue/es/switch'));
const Textarea = defineAsyncComponent(() =>
import('ant-design-vue/es/input').then((res) => res.Textarea),
);
const TimePicker = defineAsyncComponent(
() => import('ant-design-vue/es/time-picker'),
);
const TreeSelect = defineAsyncComponent(
() => import('ant-design-vue/es/tree-select'),
);
const Upload = defineAsyncComponent(() => import('ant-design-vue/es/upload'));
import {
AutoComplete,
Button,
Checkbox,
CheckboxGroup,
DatePicker,
Divider,
Input,
InputNumber,
InputPassword,
Mentions,
notification,
Radio,
RadioGroup,
RangePicker,
Rate,
Select,
Space,
Switch,
Textarea,
TimePicker,
TreeSelect,
Upload,
} from 'ant-design-vue';
const withDefaultPlaceholder = <T extends Component>(
component: T,
@@ -326,12 +304,10 @@ useVbenForm 返回的第二个参数,是一个对象,包含了一些表单
| 属性名 | 描述 | 类型 | 默认值 |
| --- | --- | --- | --- |
| layout | 表单项布局 | `'horizontal' \| 'vertical'\| 'inline'` | `horizontal` |
| layout | 表单项布局 | `'horizontal' \| 'vertical'` | `horizontal` |
| showCollapseButton | 是否显示折叠按钮 | `boolean` | `false` |
| wrapperClass | 表单的布局基于tailwindcss | `any` | - |
| actionWrapperClass | 表单操作区域class | `any` | - |
| actionLayout | 表单操作按钮位置 | `'newLine' \| 'rowEnd' \| 'inline'` | `rowEnd` |
| actionPosition | 表单操作按钮对齐方式 | `'left' \| 'center' \| 'right'` | `right` |
| handleReset | 表单重置回调 | `(values: Record<string, any>,) => Promise<void> \| void` | - |
| handleSubmit | 表单提交回调 | `(values: Record<string, any>,) => Promise<void> \| void` | - |
| handleValuesChange | 表单值变化回调 | `(values: Record<string, any>, fieldsChanged: string[]) => void` | - |

View File

@@ -0,0 +1,76 @@
---
# https://vitepress.dev/reference/default-theme-home-page
layout: home
sidebar: false
hero:
name: Vben Admin
text: Enterprise-Level Management System Framework
tagline: Fully Upgraded, Ready to Use, Simple and Efficient
image:
src: https://unpkg.com/@vbenjs/static-source@0.1.7/source/logo-v1.webp
alt: Vben Admin
actions:
- theme: brand
text: Get Started ->
link: /en/guide/introduction/vben
- theme: alt
text: Live Preview
link: https://www.vben.pro
- theme: alt
text: View on GitHub
link: https://github.com/vbenjs/vue-vben-admin
features:
- icon: 🚀
title: Latest Technology Stack
details: Based on the latest technology stack, including Vue3, Pinia, Vue Router, TypeScript, etc.
link: /en/guide/introduction/quick-start
linkText: Get Started
- icon: 🦄
title: Rich Configurations
details: An enterprise-level frontend solution for middle and back-end systems, offering a wealth of components, templates, and various preference settings.
link: /en/guide/essentials/settings
linkText: Configuration Documentation
- icon: 🎨
title: Theme Customization
details: Easily switch between various themes through simple configurations, catering to personalized needs.
link: /en/guide/in-depth/theme
linkText: Theme Documentation
- icon: 🌐
title: Internationalization
details: Built-in internationalization support with multiple languages to meet global needs.
link: /en/guide/in-depth/locale
linkText: Internationalization Documentation
- icon: 🔐
title: Access Control
details: Built-in access control solutions supporting various permission management methods to meet different access requirements.
link: /en/guide/in-depth/access
linkText: Access Documentation
- title: Vite
icon:
src: /logos/vite.svg
details: Modern frontend build tool with fast cold start and instant hot updates.
link: https://vitejs.dev/
linkText: Official Site
- title: Shadcn UI
icon:
src: /logos/shadcn-ui.svg
details: Core built on Shadcn UI + Tailwindcss, with business support for any UI framework.
link: https://www.shadcn-vue.com/
linkText: Official Site
- title: Turbo Repo
icon:
src: /logos/turborepo.svg
details: Standardized monorepo architecture using pnpm + monorepo + turbo for enterprise-level development standards.
link: https://turbo.build/
linkText: Official Site
- title: Nitro Mock Server
icon:
src: /logos/nitro.svg
details: Built-in Nitro Mock service makes your mock service more powerful.
link: https://nitro.unjs.io/
linkText: Official Site
---
<VbenContributors />

View File

@@ -4,108 +4,84 @@ layout: home
sidebar: false
hero:
name: Vben Admin
name: WWJCloud-Admin
text: 企业级管理系统框架
tagline: 全新升级,开箱即用,简单高效
image:
src: https://unpkg.com/@vbenjs/static-source@0.1.7/source/logo-v1.webp
alt: Vben Admin
src: https://t.wanwujie.cn/img/1/2025/08/24/68aad11c8deb7.webp
alt: wwjcloud
actions:
- theme: brand
text: 快速开始 ->
link: /guide/introduction/vben
link: /wwjcloud/guide/quick-start
- theme: alt
text: 在线预览
link: https://www.vben.pro
text: API 文档
link: /wwjcloud/openapi/standards/restful
- theme: alt
text: 在 GitHub 查看
link: https://github.com/vbenjs/vue-vben-admin
- theme: alt
text: DeepWiki 文档
link: https://deepwiki.com/vbenjs/vue-vben-admin
text: Vben Admin
link: /guide/introduction/vben
features:
- icon: 🚀
title: 最新技术栈
details: 基于 Vue3、Pinia、Vue Router、TypeScript、等最新技术栈
link: /guide/introduction/quick-start
title: 现代化技术栈
details: 基于 NestJS、TypeScript、TypeORM 等最新技术栈,提供企业级后端解决方案
link: /wwjcloud/guide/quick-start
linkText: 快速开始
- icon: 🦄
title: 丰富的配置
details: 企业级中后台前端解决方案,提供丰富的组件和模板以及 N 种偏好设置组合方案
link: /guide/essentials/settings
linkText: 配置文档
- icon: 🎨
title: 主题定制
details: 通过简单的配置,即可实现各种主题切换,满足个性化需求
link: /guide/in-depth/theme
linkText: 主题文档
- icon: 🔄
title: Saas+独立版双架构
details: 支持Saas多租户和独立部署两种架构模式满足不同业务场景需求提供灵活的部署选择
link: /wwjcloud/guide/architecture
linkText: 架构说明
- icon: 🏗️
title: 开箱即用,内置模块化功能
details: 采用分层架构设计,已搭建模块化架构系统开发底层,为业务开发提供完整的底层支撑
link: /wwjcloud/guide/development
linkText: 开发指南
- icon: 🌐
title: 国际化
details: 内置国际化方案,支持多语言切换,满足国际化需求。
link: /guide/in-depth/locale
linkText: 国际化文档
title: 多语言支持
details: 内置多语言系统,支持动态语言包加载,满足国际化需求。
link: /wwjcloud/guide/concepts
linkText: 基础概念
- icon: 🔐
title: 权限管理
details: 内置权限管理方案,支持多种权限控制方式,满足各种权限需求。
link: /guide/in-depth/access
linkText: 权限文档
- title: Vite
details: 内置 RBAC 权限管理方案,支持多种权限控制方式,满足各种权限需求。
link: /wwjcloud/guide/concepts
linkText: 基础概念
- icon: 📱
title: 支持多端管理
details: 基于UniAppX多平台支持原生App、小程序、PC等多端统一管理和开发一套代码多端运行。
link: /wwjcloud/guide/multi-platform
linkText: 多端开发
- title: TypeORM
icon:
src: /logos/vite.svg
details: 现代化的前端构建工具,快速冷启动,瞬间热更新
link: https://vitejs.dev/
src: https://unpkg.com/wwjcloud@latest/source/icons/typeorm.svg
details: 强大的 TypeScript ORM支持多种数据库提供完整的数据库操作功能
link: https://typeorm.io/
linkText: 官方站点
- title: Shadcn UI
- title: 多应用+插件组合安装
icon:
src: /logos/shadcn-ui.svg
details: 核心基于 Shadcn UI + Tailwindcss业务可支持任意的 UI 框架
link: https://www.shadcn-vue.com/
linkText: 官方站点
- title: Turbo Repo
src: https://unpkg.com/wwjcloud@latest/source/icons/mysql.svg
details: 支持业务自定义和应用插件热插拔,提供灵活的应用扩展和插件管理功能
link: /wwjcloud/guide/plugins
linkText: 插件开发
- title: 自建编译服务
icon:
src: /logos/turborepo.svg
details: 规范且标准的大仓架构,使用 pnpm + monorepo + turbo 工程管理模式,提供企业级开发规范
link: https://turbo.build/
linkText: 官方站点
- title: Nitro Mock Server
icon:
src: /logos/nitro.svg
details: 内置 Nitro Mock 服务,让你的 mock 服务更加强大。
link: https://nitro.unjs.io/
linkText: 官方站点
src: https://unpkg.com/wwjcloud@latest/source/icons/redis.svg
details: 提供完整的编译服务搭建方案,支持自定义编译环境和构建流程,满足不同项目的编译需求
link: /wwjcloud/guide/build-service
linkText: 编译服务
---
<!-- <script setup>
import {
VPTeamPage,
VPTeamPageTitle,
VPTeamMembers,
VPTeamPageSection
} from 'vitepress/theme';
<style>
:root {
--vp-home-hero-image-background-image: linear-gradient(
-45deg,
#78d8d1 50%,
#5f6eed 50%
);
}
const members = [
{
avatar: 'https://avatars.githubusercontent.com/u/28132598?v=4',
name: 'Vben',
title: '创建者',
desc: 'Vben Admin以及相关生态的作者负责项目的整体开发。',
links: [
{ icon: 'github', link: 'https://github.com/anncwb' },
]
},
]
</script>
<VPTeamPage>
<VPTeamPageTitle>
<template #title>
核心成员介绍
</template>
</VPTeamPageTitle>
<VPTeamMembers
:members="members"
/>
</VPTeamPage> -->
<VbenContributors />
</style>

View File

@@ -0,0 +1,113 @@
---
# https://vitepress.dev/reference/default-theme-home-page
layout: home
sidebar: false
hero:
name: Vben Admin
text: 企业级管理系统框架
tagline: 全新升级,开箱即用,简单高效
image:
src: https://unpkg.com/@vbenjs/static-source@0.1.7/source/logo-v1.webp
alt: Vben Admin
actions:
- theme: brand
text: 快速开始 ->
link: /guide/introduction/vben
- theme: alt
text: 在线预览
link: https://www.vben.pro
- theme: alt
text: 在 GitHub 查看
link: https://github.com/vbenjs/vue-vben-admin
- theme: alt
text: DeepWiki 文档
link: https://deepwiki.com/vbenjs/vue-vben-admin
features:
- icon: 🚀
title: 最新技术栈
details: 基于 Vue3、Pinia、Vue Router、TypeScript、等最新技术栈。
link: /guide/introduction/quick-start
linkText: 快速开始
- icon: 🦄
title: 丰富的配置
details: 企业级中后台前端解决方案,提供丰富的组件和模板以及 N 种偏好设置组合方案。
link: /guide/essentials/settings
linkText: 配置文档
- icon: 🎨
title: 主题定制
details: 通过简单的配置,即可实现各种主题切换,满足个性化需求。
link: /guide/in-depth/theme
linkText: 主题文档
- icon: 🌐
title: 国际化
details: 内置国际化方案,支持多语言切换,满足国际化需求。
link: /guide/in-depth/locale
linkText: 国际化文档
- icon: 🔐
title: 权限管理
details: 内置权限管理方案,支持多种权限控制方式,满足各种权限需求。
link: /guide/in-depth/access
linkText: 权限文档
- title: Vite
icon:
src: /logos/vite.svg
details: 现代化的前端构建工具,快速冷启动,瞬间热更新。
link: https://vitejs.dev/
linkText: 官方站点
- title: Shadcn UI
icon:
src: /logos/shadcn-ui.svg
details: 核心基于 Shadcn UI + Tailwindcss业务可支持任意的 UI 框架。
link: https://www.shadcn-vue.com/
linkText: 官方站点
- title: Turbo Repo
icon:
src: /logos/turborepo.svg
details: 规范且标准的大仓架构,使用 pnpm + monorepo + turbo 工程管理模式,提供企业级开发规范。
link: https://turbo.build/
linkText: 官方站点
- title: Nitro Mock Server
icon:
src: /logos/nitro.svg
details: 内置 Nitro Mock 服务,让你的 mock 服务更加强大。
link: https://nitro.unjs.io/
linkText: 官方站点
---
<!-- <script setup>
import {
VPTeamPage,
VPTeamPageTitle,
VPTeamMembers,
VPTeamPageSection
} from 'vitepress/theme';
const members = [
{
avatar: 'https://avatars.githubusercontent.com/u/28132598?v=4',
name: 'Vben',
title: '创建者',
desc: 'Vben Admin以及相关生态的作者负责项目的整体开发。',
links: [
{ icon: 'github', link: 'https://github.com/anncwb' },
]
},
]
</script>
<VPTeamPage>
<VPTeamPageTitle>
<template #title>
核心成员介绍
</template>
</VPTeamPageTitle>
<VPTeamMembers
:members="members"
/>
</VPTeamPage> -->
<VbenContributors />

View File

@@ -0,0 +1,21 @@
## 执行检查清单(给智能体)
### 开发前
- [ ] 对齐 PHP 模块/接口/字段
- [ ] 核对 DB 结构(表/字段/类型/索引)
- [ ] 明确路由分端(/adminapi, /api与守卫
### 开发中
- [ ] 目录分层到位Controller/Application/Core/Infrastructure/Entities/DTO
- [ ] 实体字段与 DB 一致;配置表仅用 `value(JSON)`
- [ ] Controller 只路由+DTO 校验;不写业务/不碰 ORM
- [ ] Application 负责编排与事务Core 写规则Infra 实现仓储与适配
- [ ] 管理端控制器接 `JwtAuthGuard + RolesGuard`
- [ ] 启用必要 PipesJSON/Timestamp
- [ ] 用例完成发布事件;耗时逻辑入队
### 开发后
- [ ] `npm run build` 通过(无类型警告)
- [ ] 单测/集成/e2e 通过;关键路径有覆盖
- [ ] Swagger 注解完整
- [ ] 变更清单与迁移说明

View File

@@ -0,0 +1,21 @@
## WWJCloud AI 文档总览
### 目标
- **统一规范**: 用 NestJS 的方式实现,与 PHP 业务/数据100%对齐。
- **智能体协作**: 多个智能体基于同一规则、流程与工具偏好执行任务。
### 文档导航
- 工作流程: ./workflow.md
- 工具偏好: ./tooling.md
- 规则规范: ./rules.md
- 执行清单: ./checklists.md
- 基础能力集成: ./integration.md
### 适用范围
- 仓库: `wwjcloud/` 主后端及 `admin/apps/*` 示例
- 模块: `common/*`, `core/*`, `config/*`, `vendor/*`
### 约定
- 管理端路由: `/adminapi/{module}/...`
- 前台端路由: `/api/{module}/...`
- 配置表: `sys_config.value(JSON)`,禁止使用不存在字段(如 `config_value`, `app_type`

View File

@@ -0,0 +1,154 @@
## 基础能力集成Kafka / Redis / 队列 / 事务)
### 总览
- 目标: 将事件、任务、缓存、事务能力以统一规范接入 App/Core/Infrastructure 三层,替代“散落式调用”。
- 约束: 由 Application 发起流程Core 编排业务规则且不直接依赖外设Infrastructure 提供具体实现。
### 1) 事务TypeORM
- 发起层: Application用例级事务边界
- 使用方式:
```ts
// application/xxx.app.service.ts
constructor(private readonly dataSource: DataSource, private readonly core: XxxCoreService) {}
async runUseCase(dto: Dto) {
return await this.dataSource.transaction(async (manager) => {
// 将 manager 注入到仓储实现(通过请求域注入或方法透传)
await this.core.handle(dto); // Core 内仅调用仓储接口
});
}
```
- 规范:
- 事务只在 Application 层开启Core 不直接操作事务对象
- 多仓储参与时基于同一 `EntityManager`
### 2) 队列Bull/BullMQ 或 DB 队列)
- 发起层: Application用例结束后入队
- 接入点: `UnifiedQueueService` 或具体 Provider`BullQueueProvider`/`DatabaseQueueProvider`
```ts
// application/xxx.app.service.ts
constructor(private readonly queue: UnifiedQueueService) {}
await this.queue.addJob('media', 'generateThumbnail', { attId }, { attempts: 3, delay: 0 });
```
- 处理器建议放置:
- `infrastructure/queues/xxx.processor.ts` 或独立消费模块
- 规范:
- 入队数据为最小必要字段ID/键大对象存储DB再查
### 3) 事件Kafka / DB Outbox
- 发起层: Application领域事件在用例完成后发布
- 接入点: `DomainEventService`(绑定 `IEventBus`,默认 DB Outbox可切 Kafka
```ts
// application/xxx.app.service.ts
constructor(private readonly events: DomainEventService) {}
await this.events.publishEvent(
'system.settings.storage.updated',
String(siteId),
String(siteId),
{ storageType },
);
```
- 配置切换:
- 通过 `EventBusModule` 的 provider 切换 `DatabaseEventBusProvider``KafkaEventBusProvider`
- 规范:
- 事件名格式: `domain.aggregate.action`
- 载荷仅含必要业务字段,带上 `tenantId/siteId`
### 4) Redis缓存/限流/幂等)
- 发起层: Application流程性控制或 Infrastructure技术性实现
- 接入点: `RedisProvider``vendor/redis`
- 常见场景:
- 读多写少配置缓存:`sys_config` 读取后短缓存
- 上传限流/防刷:基于 IP/UID 的计数器
- 幂等:`SETNX` + 过期控制
### 5) 存储(本地/云)
- 发起层: Application 调用 Core 规则后,委托 Infrastructure Provider 落地
- 接入点: `infrastructure/providers/*``vendor/storage/*`(如 `LocalStorageAdapter`
- 规范:
- Provider 通过接口注入,便于切换 OSS/COS/Qiniu
### 6) 在三层中的放置原则
- Application: 事务、入队、发事件、协调多 Core 服务
- Core: 纯业务规则/策略与仓储接口;不直接依赖 Kafka/Redis/队列
- Infrastructure: 队列消费者、存储/HTTP/Redis 具体实现、TypeORM 仓储实现
### 7) 示例Upload 模块接入
- 用例: 上传完成 → 入库附件 → 入队生成缩略图
```ts
// application/upload.app.service.ts
await this.dataSource.transaction(async (manager) => {
const att = await this.core.validateAndPlan(fileMeta);
await this.attachmentRepo.withManager(manager).save(att);
});
await this.queue.addJob('media', 'generateThumbnail', { attId: att.id });
```
### 8) 示例Settings.Storage 接入
- 用例: 切换默认存储 → 写 `sys_config` → 发布事件 → 入队校验可用性
```ts
// application/storage-settings.app.service.ts
await this.dataSource.transaction(async (manager) => {
await this.core.ensureExclusiveDefault(type);
await this.sysConfigRepo.withManager(manager).setValue(key, value);
});
await this.events.publishEvent('system.settings.storage.updated', String(siteId), String(siteId), { type });
await this.queue.addJob('ops', 'validateStorage', { type, siteId });
```
### 9) 配置与健康
- 配置在 `VendorModule`/`EventBusModule` 注入;通过 `ConfigService` 读取连接信息
- 健康检查:将 Redis/队列/事件写入健康聚合输出
### 10) 方案Bvendor/storage 标准结构(平台外设)
```
vendor/storage/
├── index.ts # 统一导出(接口、Token、模块、适配器)
├── storage.module.ts # 可配置模块(选择具体实现)
├── tokens.ts # 注入Token常量(如 STORAGE_ADAPTER)
├── interfaces/
│ ├── storage-adapter.ts # 适配器接口(平台标准)
│ └── types.ts # 通用类型(上传结果、签名参数等)
├── adapters/
│ ├── local.adapter.ts # 本地实现
│ ├── aliyun-oss.adapter.ts # 阿里云实现
│ ├── qcloud-cos.adapter.ts # 腾讯云实现
│ └── qiniu.adapter.ts # 七牛云实现
├── providers/
│ ├── storage.provider.ts # 工厂: 按配置/站点解析适配器
│ └── registry.ts # 多实例注册表 Map<siteId, adapter> + TTL
├── health/storage.health.ts # 健康检查(各实现可选实现)
├── config/schema.ts # 配置Schema(必需项校验)
└── __tests__/
├── storage.contract.spec.ts # 契约测试(接口一致性)
└── adapters/*.spec.ts # 各实现最小测试
```
- Token
```ts
export const STORAGE_ADAPTER = 'STORAGE_ADAPTER';
```
- 接口
```ts
export interface StorageAdapter {
upload(params: { key: string; content: Buffer | NodeJS.ReadableStream; mime?: string }): Promise<{ url: string; key: string }>;
delete(key: string): Promise<void>;
signUpload?(params: { key: string; expiresSec?: number; mime?: string }): Promise<{ url: string; headers?: Record<string,string>; fields?: Record<string,string> }>;
healthCheck?(): Promise<boolean>;
}
```
- 按 site_id 解析(站点启用 > 跟随系统 > local 兜底)
```ts
function resolveAdapter(siteId: number): StorageAdapter {
const enabled = readSiteEnabled(siteId); // storage_xxx with is_use
const type = enabled?.type ?? readPlatformDefault();
const options = enabled?.options ?? readPlatformOptions(type) ?? {};
return registry.getOrCreate(siteId, type, options);
}
```
- 本地隔离路径:`upload/site_{siteId}/...`
- 健康检查:对活跃站点适配器定期 `healthCheck()` 并聚合到 Health
> 说明方案B 将“三方存储”视为外设,接口与实现均在 vendor业务通过 Token 注入与按站点解析工厂使用core 无需暴露存储端口。

View File

@@ -0,0 +1,98 @@
## 模块关系映射PHP ↔ NestJS
### 1) 职责映射总览
| 职责 | PHPThinkPHP风格 | NestJS规范分层 | 备注 |
|---|---|---|---|
| 控制器 | `app/admin/controller/*``app/api/controller/*` | `controllers/adminapi/*``controllers/api/*` | 仅路由与DTO校验Nest特有Guards/Pipes/Interceptors |
| 用例编排/流程 | `app/*/service/*`(可分 admin/api | `application/*`(可分 `AdminXxxAppService`/`ApiXxxAppService` | 事务、聚合领域规则、发事件/入队 |
| 通用业务规则 | `core/*` 或被两端复用的 service | `core/services/*` | 不依赖外设DDD |
| 仓储接口 | 与模型耦合在一起 | `domain/repositories/*` | 定义端口(接口) |
| 仓储实现 | 模型(Model)直连DB | `infrastructure/repositories/*.typeorm.repository.ts` | TypeORM 实现,注入接口 |
| 实体/模型 | `app/*/model/*` | `entities/*`TypeORM 实体) | 字段与DB 100%一致 |
| 外部适配 | SDK/Driver 封装 | `infrastructure/providers/*``vendor/*` | 存储/HTTP/SMS等 |
| 配置中心 | `sys_config` + 配置文件 | `settings/*` 统一读写 `sys_config.value(JSON)` | 禁止 `config_value``app_type` |
### 2) 目录映射(标准化)
```
your-module/
├── your-module.module.ts # 模块定义Nest特有
├── controllers/
│ ├── adminapi/ # 后台控制器(/adminapi
│ └── api/ # 前台控制器(/api
├── application/ # 用例编排admin/api可分
├── core/
│ ├── services/ # 通用规则/策略(≈ PHP core
│ ├── repositories/ # 仓储接口(端口)
│ └── models|policies/ # 值对象/策略(可选)
├── infrastructure/
│ ├── repositories/ # TypeORM 实现
│ └── providers/ # 外部系统适配
├── entities/ # TypeORM实体DB一致
└── dto/ # DTOclass-validator
```
### 3) 命名映射规则
- 应用层:`XxxAppService`(如 `AdminUploadAppService` / `ApiUploadAppService`
- Core层`XxxCoreService`
- 仓储接口:`XxxRepository`
- 仓储实现:`XxxTypeormRepository`
- 控制器:`XxxController`(位于 `controllers/adminapi|api`
- 配置键:常量化,如 `UPLOAD_CONFIG_KEY = 'upload'``STORAGE_LOCAL_KEY = 'storage_local'`
### 4) 映射示例Upload 模块
- PHP 心智:
- admin/api 控制器 → 上传服务 → 模型写库(附件表)
- NestJS 对应:
- 控制器:`controllers/adminapi/upload.controller.ts``controllers/api/upload.controller.ts`
- 应用:`application/upload.app.service.ts`(编排上传 → 领域校验 → Provider 落地 → 入库)
- Core`core/services/upload.core.service.ts`(类型/大小/命名/路径策略)
- 仓储接口:`core/repositories/attachment.repository.ts`
- 仓储实现:`infrastructure/repositories/attachment.typeorm.repository.ts`
- 实体:`entities/sys-attachment.entity.ts`(严格对齐 `sys_attachment`
- 适配:`infrastructure/providers/local.storage.provider.ts`(或 `vendor/storage/*`
流程Controller → AppService事务/编排) → CoreService校验策略 → StorageProvider落地 → AttachmentRepository入库
### 5) 映射示例Settings.Storage 模块
- PHP 心智:
- admin 控制器(配置) → 服务 → `sys_config` 读写(键:`storage_*`
- NestJS 对应:
- 控制器:`settings/storage/controllers/storage-settings.controller.ts`
- 应用:`settings/storage/application/storage-settings.app.service.ts`
- Core`settings/storage/core/services/storage-config.core.service.ts`(唯一启用策略、键名规范)
- 仓储接口:`settings/storage/core/repositories/sys-config.repository.ts`
- 仓储实现:`settings/storage/infrastructure/sys-config.typeorm.repository.ts`
- 实体:`settings/entities/sys-config.entity.ts`(对齐 `sys_config`,字段名:`value`
流程Controller → AppService → CoreService校验/策略) → SysConfigRepository读写 `value(JSON)` → 发布事件/入队
### 6) 约束速查(强制对齐)
- DB 字段:实体字段名/类型/时间戳/软删与 SQL 100%一致
- `sys_config`:统一使用 `value(JSON)`;禁止 `config_value``app_type`
- 路由前缀:管理端 `/adminapi`,前台 `/api`
- 守卫:管理端控制器统一 `JwtAuthGuard + RolesGuard`
- DTO`class-validator`,必要时 `JsonTransformPipe``TimestampPipe`
- 事件/队列:用例完成后发布 `system.settings.*` 等领域事件,耗时逻辑入队
### 7) 反模式(避免踩坑)
- 在 Controller 中写业务或直接操作 ORM
- 跳过 Application 层,直接由 Controller 调 Domain/Repository
- Domain 依赖具体 ORM/外设实现
-`upload` 模块中放置“配置管理”代码(应全部在 `settings` 模块)
- `sys_config` 使用不存在字段(如 `config_value`)、添加 `app_type` 过滤
### 8) 决策树(智能体选路)
- 这是接口/路由吗?→ 放 `controllers`,只做 DTO 校验与调用 AppService
- 这是业务流程/事务/聚合?→ 放 `application`,完成后发事件/入队
- 这是纯业务规则/策略?→ 放 `domain/services`
- 需要访问数据库?→ 定义 `domain/repositories` 接口,在 `infrastructure/repositories` 实现
- 需要调用外部系统?→ 放 `infrastructure/providers`(或 `vendor/*`),通过接口注入
- 是系统配置?→ 放 `settings/*`,读写 `sys_config.value(JSON)`,键按约定常量化
### 命名优先级(重要)
- 在不违反 NestJS 规范与 TypeScript 命名习惯的前提下,**优先沿用 PHP 的业务命名**含服务方法名、DTO 字段名、配置键名)
- NestJS 特有文件/类名按规范命名(如 `*.module.ts`, `*.controller.ts`, `*.app.service.ts`, `*.core.service.ts`
---
以上映射可直接用于指导模块落地与代码评审,智能体在执行任务前请先对照本表完成“位置与职责”的选择。

View File

@@ -0,0 +1,80 @@
## AI 规划师:底座完善路线图(面向微服务的一次性落地)
### 目标
- 一次性补齐“微服务刚需底座”,保证当前单体可用、未来可无感切分。
- 全程遵循项目约束:与 PHP 业务/数据一致;与 NestJS 规范一致;最小可行改动。
### 阶段划分与里程碑
- M1 基础通信与契约D1-D2
- 统一错误码与异常过滤器(全局 Filter
- 统一响应包装Interceptor
- API 版本化v1/v2与 Swagger 分组(/api、/adminapi
- 配置中心 Schema 校验Joi/Zod启动即校验
- 验收:/docs OK错误码/响应统一;配置校验失败阻断启动
- M2 事务与数据访问D2-D3
- 事务助手Application 开启,共享 EntityManager
- 仓储基类withManager、分页/排序/过滤白名单)
- 分布式锁Redis Lock + 看门狗)
- 验收:示例用例通过;并发压测无脏写;锁可重入/续租
- M3 安全与多租D3
- SiteIdScopeGuard多租隔离
- 幂等Idempotency-Key + Redis SETNX + TTL
- 限流IP/UID/接口级 令牌桶)
- 审计日志最小版(配置/权限/删除变更)
- 验收:关键接口具备限流/幂等;审计写入成功
- M4 事件与队列D4
- 事件总线DB Outbox 默认Kafka 可切换;事件契约(事件名/版本/载荷 Schema
- 任务队列Bull/BullMQ 或 DB Jobs重试/死信/命名规范
- Saga/补偿基类(占位)
- 验收:发布/消费示例跑通;切 Kafka 仅改配置;死信与重试可观测
- M5 可观测与稳定性D4-D5
- 健康聚合DB/Redis/队列/事件/对象存储)
- 指标PrometheusHTTP/DB/队列/事件/存储基础指标
- 追踪OpenTelemetryHTTP↔队列↔事件 traceparent 贯通
- 结构化日志JSON + traceId + site_id + 采样)
- 验收:/health 聚合齐全;/metrics 输出基础指标trace 在链路可见
- M6 vendor 外设标准(并行推进)
- storage方案B接口+adapters(local/aliyun/qcloud/qiniu)+按 site_id 解析工厂+契约测试
- providers/registry多实例缓存 Map<siteId, adapter> + TTL
- 健康与 Schema厂商配置校验与健康钩子
- 验收:站点启用 > 跟随系统 > 本地兜底 生效;契约测试通过
### 目录落位(仅技术底座)
- core/
- config/{schema.ts, feature-flags.service.ts}
- http/{filters/http-exception.filter.ts, interceptors/response.interceptor.ts, client/http.client.ts}
- database/{transaction.manager.ts, base-repository.ts, redis-lock.service.ts}
- security/{site-scope.guard.ts, idempotency.service.ts, rate-limit.service.ts}
- event-bus/{outbox.provider.ts, kafka.provider.ts, contracts/*.schema.ts}
- queue/{bull.provider.ts, db-queue.provider.ts, naming.ts, dead-letter.ts}
- observability/{health/aggregator.ts, metrics/http.metrics.ts, tracing/otel.ts, logging/logger.ts}
- vendor/
- storage/(接口+adapters+providers+health+schema+tests
### 执行顺序(对齐多智能体 S1-S9
- S1/S2 分析与架构:冻结上述目录与规范
- S3 基建接入体:落地 core 与 vendor 骨架;接入 Kafka/Redis/队列/事务
- S4 开发执行体实现各模块最小能力与示例接入settings/storage、upload
- S5 安全基线体:多租/限流/幂等/权限核查
- S6 质量门禁体lint/ts/test/e2e/覆盖率阈值
- S7 规范审计体:对照 checklists 差异清单
- S8 发布:变更/迁移/回滚说明
- S9 性能优化体:缓存/异步化/批量化建议
### 验收清单(通过即视为底座完成)
- /health、/metrics、/docs 与追踪链路可用;错误码+响应统一
- 事务助手/仓储基类/锁/限流/幂等 有实例与测试
- 事件总线 Outbox→Kafka 可切;队列有重试/死信与可视化
- vendor/storage 支持站点启用/平台默认/本地兜底;契约测试通过
### 依赖与风险
- 依赖Redis、数据库可用Kafka 按需
- 风险:配置校验与权限基线放开可能影响旧路由;需灰度启用与回滚脚本
### 文档联动
- 参见:`./workflow.md`S1-S9`./integration.md`(能力接入)、`../project/vendor.md`vendor 规范)

View File

@@ -0,0 +1,28 @@
## 规则与规范AI 执行细则)
### 总则
- 框架层: 按 NestJS 规范;业务/数据层: 与 PHP 项目 100% 一致
- 禁止自创 DB 字段/索引;实体必须与 `sql/wwjcloud.sql` 一致
### 分层与依赖
- 目录: Controller / Application / Core / Infrastructure / Entities / DTO
- 依赖方向: App → Common → Core → Vendor严格单向
- Repository: 接口在 Core实现放 InfrastructureController 不直接用 ORM
### 路由与权限
- 管理端: `/adminapi/{module}/...`,前台: `/api/{module}/...`
- 管理端控制器统一: `JwtAuthGuard + RolesGuard`
### 数据与配置
- 配置表: `sys_config.value(JSON)`;禁止 `config_value``app_type`
- 时间戳: int软删: `is_del`, `delete_time`; JSON: `@Column('json')` 或 text + JSON 序列化
### 验证与错误
- DTO: `class-validator` 必须;必要时启用 `JsonTransformPipe``TimestampPipe`
- 异常: 全局过滤器统一错误响应;拦截器记录 request-id/trace
### 事件与队列
- 用例完成后发布领域事件(如 `system.settings.*`);耗时逻辑入队处理
### 文档与测试
- Swagger 注解完善;单测/集成/e2e 覆盖关键用例;`npm run build` 必须通过

View File

@@ -0,0 +1,20 @@
## 工具偏好与使用约定
### 首选工具
- 代码检索: 语义检索优先,其次精确 `grep`(限定范围/文件类型)
- 文件读取: 分段读取,避免大文件全量;聚焦导入/实体/控制器/服务、测试
- 编辑变更: 小步、原地最小改动;优先迁移后删除,避免职责重复
- 运行与测试: `npm run build``npm run test`(单测/集成e2e 按 `playground` 配置
### 偏好策略
- 并行检索: 控制器/服务/实体/DTO/模块定义并行查看
- 批量对齐: 字段/命名统一替换前先定位所有引用
- 规范优先: 不因快捷而破坏分层与依赖约束
### 常用检查点
- DB 对齐: 实体字段名、类型、软删、时间戳
- 配置统一: `sys_config.value(JSON)`,无 `config_value`、无 `app_type`
- 路由前缀: `/adminapi``/api`
- 守卫: 管理端 `JwtAuthGuard + RolesGuard`
- DTO: `class-validator`,必要时 `Pipes`JSON/Timestamp
- 事件/队列: 用例完成后发布事件、必要时入队

View File

@@ -0,0 +1,96 @@
## 智能体工作流程(多智能体协作)
### 角色定义(按执行顺序标注)
- S1 需求分析体(Analyzer): 解析需求、对应 PHP/Nest 规范、输出任务切分与验收标准
- S2 架构治理体(Architect): 校验分层/依赖/目录规范,给出重构建议与边界清单
- S3 基建接入体(InfraOperator): 接入/校验 Kafka、Redis、队列、事务与配置提供接入差异与示例
- S4 开发执行体(Developer): 按规范编码、编写测试、修复构建
- S5 安全基线体(SecurityGuard): 检查守卫、跨租户(site_id)隔离、敏感信息暴露(开发中与提测前各执行一次)
- S6 质量门禁体(QualityGate): 聚合 ESLint/TS/覆盖率/e2e 结果,低于阈值阻断合并
- S7 规范审计体(Auditor): 按清单逐项核查,出具差异报告与修复项
- S8 上线管控体(Release): 构建、变更说明、灰度计划与回滚预案
- S9 性能优化体(PerfTuner): 建议缓存/异步化/批处理,识别大对象传输与 N+1开发后期与上线后持续执行
### 串联流程(带顺序)
1) S1 Analyzer
- 输入: 业务需求/接口变更/对齐 PHP 的说明
- 输出: 模块划分、路由表、DTO、实体字段清单、与 DB/ThinkPHP 对照
2) S2 Architect
- 校验: 模块目录、分层(Application/Core/Infrastructure)、依赖方向(App→Common→Core→Vendor)
- 输出: 设计说明、端口(Repository/Provider)定义、删除/迁移建议
3) S3 InfraOperator
- 接入: Kafka/Redis/队列/事务的工程化接入与配置
- 产物: 接入差异与示例代码(见 integration.md健康检查/配置项校验清单
4) S4 Developer
- 实现: Controller 仅路由+DTO校验AppService 编排Core 规则Infra 实现Entity 对齐 DB
- 接入: 守卫(RBAC)、Pipes(JSON/Timestamp)、拦截器(请求日志)、事件与队列
- 测试: 单测/集成/e2e构建通过
5) S5 SecurityGuard第一次开发阶段
- 检查: 控制器守卫、site_id 隔离、敏感字段输出、配置权限
6) S6 QualityGateCI 阶段)
- 指标: ESLint/TS 无报错覆盖率≥阈值e2e 关键路径通过
- 动作: 不达标阻断合并
7) S7 Auditor提测前
- 检查: 规范清单(见 checklists.md),字段/命名/路由/守卫/事务/队列/事件 与 PHP/DB 对齐
- 产物: 差异报告与修复任务
8) S5 SecurityGuard第二次提测前
- 复检: 重要接口的鉴权/越权/敏感输出
9) S9 PerfTuner并行/持续)
- 建议: 缓存、异步化、批量化、索引与查询优化;识别 N+1、大对象传输
10) S8 Release
- 产出: 变更日志、部署步骤、数据迁移脚本、回滚预案
### 关键约束
- 与 PHP 业务/数据100%一致;与 NestJS 规范100%匹配
- 禁止创建 DB 不存在字段;`sys_config.value(JSON)` 统一
- 管理端路由 `/adminapi`,前台 `/api`;统一守卫与响应格式
### 基础能力检查点Kafka / Redis / 队列 / 事务)
- 事务: 仅在 Application 开启;多仓储共享同一 EntityManagerCore 不直接操作事务对象
- 队列: 用例完成后入队;载荷仅传关键 ID处理器在 Infrastructure按队列名分域
- 事件: 统一用 DomainEventService事件名 `domain.aggregate.action`;默认 DB Outbox可切 Kafka
- Redis: 短缓存配置读取、上传限流/防刷(计数器)、幂等(SETNX+TTL)
### 命名与对齐
- PHP 业务命名优先(不违反 Nest/TS 规范前提下包括服务方法、DTO 字段、配置键
- Nest 特有类型按规范命名:`*.module.ts``*.controller.ts``*.app.service.ts``*.core.service.ts`
### 核心链接
- 模块映射: `./mapping.md`
- 能力集成: `./integration.md`
- 规则与清单: `./rules.md``./checklists.md`
### 执行与验收CI/PR 建议)
- PR 必须通过: build、单测/集成/e2e
- 审计体根据 `checklists.md` 自动评论差异(字段/命名/路由/守卫/事务/队列/事件)
- 安全基线: 管理端控制器统一 `JwtAuthGuard + RolesGuard`/adminapi 与 /api 路由前缀
### 目录职能速查(防误用)
- common/(框架通用服务层)
- 放可被业务复用的通用功能:用户/权限/菜单/上传/通知/设置等模块
- 内部模块按 Controller / Application / Core / Infrastructure / Entities / DTO 分层
- 禁止依赖 App 层;允许依赖 core/, config/, vendor/
- config/(配置与适配)
- 环境变量、数据库/HTTP/安全/队列/第三方等配置模块与注入工厂
- 仅存放配置与适配代码,不放业务逻辑
- core/(核心基础设施与通用规则)
- 通用规则/策略与仓储接口Core 层),以及全局基础设施(如队列、事件、健康、拦截器)
- 不直接依赖业务模块;面向 common/app 提供能力
- vendor/(第三方适配层)
- 外部服务适配:存储/支付/短信/HTTP/Kafka/Redis 等 Provider
- 通过接口注入到 Infrastructure 或 Application避免在 Controller 直接使用
- lang/(多语言)
- 多语言资源与语言包,供接口/异常/文案统一输出
- 智能体在涉及文案/错误消息时,优先调用多语言键值而非写死文本
- test/(测试)
- 单元/集成/e2e 测试,包含关键业务与基础能力(事务/队列/事件/权限)覆盖
- PR 必须通过测试基线,质量门禁体(QualityGate)据此决策

View File

@@ -0,0 +1,133 @@
# 架构约束规则
## 🏗️ 分层架构
```
┌─────────────────┐
│ App │ ← 业务开发层(用户自定义业务模块)
│ (用户业务) │ 电商、CRM、ERP等具体业务逻辑
└─────────────────┘
┌─────────────────┐
│ Common │ ← 框架通用服务层(企业级通用功能)
│ (框架通用服务) │ 用户管理、权限管理、菜单管理
└─────────────────┘ 文件上传、通知服务、系统设置
↓ 数据字典、缓存服务、队列服务
┌─────────────────┐
│ Core │ ← 核心基础设施层(底层基础设施)
│ (基础设施) │ 认证核心、数据库核心、验证核心
└─────────────────┘ HTTP核心、缓存核心、队列核心
┌─────────────────┐
│ Vendor │ ← 第三方服务适配层
│ (外部集成) │ 存储、支付、通信、云服务适配
└─────────────────┘
┌─────────────────┐
│ Addons │ ← 插件扩展层(可插拔功能模块)
│ (插件扩展) │ 扩展框架功能,不影响核心稳定性
└─────────────────┘
┌─────────────────┐
│ Test │ ← 测试代码层(独立测试模块)
│ (测试代码) │ 单元测试、集成测试、E2E测试
└─────────────────┘
```
## 📋 依赖约束规则
### 1. **Core 层(最底层)**
-**允许依赖**:无(最底层基础设施)
-**禁止依赖**Common、App、Vendor 层
- 📁 **位置**`src/core/`
- 🎯 **职责**:提供最基础的抽象和接口
### 2. **Vendor 层(第三方适配)**
-**允许依赖**Core 层
-**禁止依赖**Common、App 层
- 📁 **位置**`src/vendor/`
- 🎯 **职责**:第三方服务适配,实现 Core 层抽象
### 3. **Common 层(通用服务)**
-**允许依赖**Core 层
-**禁止依赖**App、Vendor 层
- 📁 **位置**`src/common/`
- 🎯 **职责**:企业级通用功能,基于 Core 层构建
### 4. **App 层(业务应用)**
-**允许依赖**Common、Core 层
-**禁止依赖**Vendor 层(通过 Common 层抽象)
- 📁 **位置**`src/app/`
- 🎯 **职责**:具体业务逻辑实现
### 5. **Test 层(测试代码)**
-**允许依赖**:所有层(测试需要)
- 📁 **位置**`test/`(项目根目录)
-**禁止位置**`src/` 目录下
- 🎯 **职责**:测试所有层的功能
## 🚫 禁止的依赖关系
```typescript
// ❌ 错误Common 层依赖 App 层
// src/common/auth/auth.service.ts
import { AppService } from '../../app/app.service'; // 禁止!
// ❌ 错误Core 层依赖 Common 层
// src/core/database/database.service.ts
import { UserService } from '../../common/user/user.service'; // 禁止!
// ❌ 错误App 层直接依赖 Vendor 层
// src/app/payment/payment.service.ts
import { AlipayProvider } from '../../vendor/payment/alipay.provider'; // 禁止!
// ❌ 错误:在 src 目录下创建测试代码
// src/test/test.service.ts - 禁止!
```
## ✅ 正确的依赖关系
```typescript
// ✅ 正确Common 层依赖 Core 层
// src/common/auth/auth.service.ts
import { JwtService } from '../../core/auth/jwt.service';
// ✅ 正确App 层依赖 Common 层
// src/app/user/user.controller.ts
import { AuthService } from '../../common/auth/auth.service';
// ✅ 正确Vendor 层依赖 Core 层
// src/vendor/payment/alipay.provider.ts
import { PaymentProvider } from '../../core/payment/payment.provider';
// ✅ 正确:测试代码依赖所有层
// test/auth.test.ts
import { AuthService } from '../src/common/auth/auth.service';
```
## 🔧 ESLint 规则
项目已配置严格的 ESLint 规则来强制执行这些约束:
1. **分层依赖检查**:自动检测违反依赖方向的导入
2. **测试代码位置检查**:禁止在 src 目录下创建测试代码
3. **路径别名检查**:强制使用相对路径,避免路径别名
4. **内部实现检查**:禁止依赖其他模块的内部实现
## 📝 开发建议
1. **设计时先确定层级**:新功能应该放在哪一层?
2. **依赖时检查方向**:确保依赖关系符合架构约束
3. **测试代码统一管理**:所有测试代码放在 `test/` 目录
4. **定期运行 ESLint**`npm run lint` 检查架构约束
5. **代码审查时关注架构**:确保新代码符合分层原则
## 🚨 常见错误
1. **在 Core 层导入业务逻辑**
2. **Common 层直接调用第三方服务**
3. **App 层绕过 Common 层直接使用 Vendor**
4. **测试代码放在 src 目录下**
5. **使用绝对路径或路径别名导入**
遵循这些约束规则,可以确保 WWJCloud 的架构清晰、依赖关系正确,为未来的微服务拆分奠定坚实基础。

View File

@@ -0,0 +1,769 @@
# 网关技术架构详解
> 深入理解 WWJCloud 网关系统的技术架构和实现原理
## 🏗️ **架构设计原则**
### **核心原则**
1. **分层架构**: 清晰的层次结构,职责分离
2. **模块化设计**: 高内聚、低耦合的模块组织
3. **可扩展性**: 支持水平扩展和垂直扩展
4. **高可用性**: 故障隔离和自动恢复机制
5. **可观测性**: 完整的监控、追踪和日志
6. **安全性**: 多层次的安全防护策略
---
## 🌐 **整体架构设计**
### **架构层次图**
```
┌─────────────────────────────────────────────────────────────┐
│ 接入层 (Access Layer) │
├─────────────────────────────────────────────────────────────┤
│ CDN │ DNS │ 负载均衡器 │ 反向代理 │ 防火墙 │
└─────────────────────┬───────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ API网关层 (API Gateway Layer) │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 路由管理 │ │ 限流控制 │ │ 安全策略 │ │
│ │ │ │ │ │ │ │
│ │ • 动态路由 │ │ • 用户限流 │ │ • 访问控制 │ │
│ │ • 路由版本 │ │ • IP限流 │ │ • 流量控制 │ │
│ │ • 路由策略 │ │ • API限流 │ │ • 安全防护 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────┬───────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 微服务网关层 (Microservice Gateway) │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 服务发现 │ │ 负载均衡 │ │ 熔断器 │ │
│ │ │ │ │ │ │ │
│ │ • 服务注册 │ │ • 轮询算法 │ │ • 状态管理 │ │
│ │ • 服务发现 │ │ • 权重算法 │ │ • 策略配置 │ │
│ │ • 健康检查 │ │ • 一致性哈希│ │ • 自动恢复 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────┬───────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 服务网格层 (Service Mesh) │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 流量管理 │ │ 安全策略 │ │ 可观测性 │ │
│ │ │ │ │ │ │ │
│ │ • 流量路由 │ │ • 身份认证 │ │ • 指标收集 │ │
│ │ • 流量分割 │ │ • 授权策略 │ │ • 日志聚合 │ │
│ │ • 流量镜像 │ │ • 加密通信 │ │ • 链路追踪 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────┬───────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 业务服务层 (Business Service Layer) │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 用户服务 │ │ 权限服务 │ │ 文件服务 │ │
│ │ │ │ │ │ │ │
│ │ • 会员管理 │ │ • 角色管理 │ │ • 文件上传 │ │
│ │ • 管理员 │ │ • 菜单管理 │ │ • 文件管理 │ │
│ │ • 认证授权 │ │ • 权限控制 │ │ • 存储适配 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────┬───────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 数据存储层 (Data Storage Layer) │
├─────────────────────────────────────────────────────────────┤
│ MySQL集群 │ Redis集群 │ 对象存储 │ 时序数据库 │
└─────────────────────────────────────────────────────────────┘
```
---
## 🔧 **核心组件架构**
### **1. API网关组件**
#### **1.1 路由管理组件**
```typescript
// 路由管理核心接口
interface RouteManager {
// 路由注册
registerRoute(route: Route): Promise<void>;
// 路由查找
findRoute(path: string, method: string): Route | null;
// 路由更新
updateRoute(routeId: string, updates: Partial<Route>): Promise<void>;
// 路由删除
deleteRoute(routeId: string): Promise<void>;
// 路由列表
listRoutes(filters?: RouteFilters): Route[];
}
// 路由定义
interface Route {
id: string;
name: string;
path: string;
method: string;
target: string;
middleware: string[];
rateLimit: RateLimitConfig;
security: SecurityConfig;
version: string;
enabled: boolean;
createdAt: Date;
updatedAt: Date;
}
```
#### **1.2 限流控制组件**
```typescript
// 限流器接口
interface RateLimiter {
// 检查是否允许请求
isAllowed(key: string, limit: RateLimit): Promise<boolean>;
// 获取当前使用量
getCurrentUsage(key: string): Promise<number>;
// 重置限流器
reset(key: string): Promise<void>;
}
// 限流配置
interface RateLimit {
// 时间窗口(秒)
window: number;
// 最大请求数
max: number;
// 限流策略
strategy: 'fixed' | 'sliding' | 'token-bucket' | 'leaky-bucket';
// 限流键类型
keyType: 'ip' | 'user' | 'api' | 'custom';
}
```
### **2. 微服务网关组件**
#### **2.1 服务发现组件**
```typescript
// 服务发现接口
interface ServiceDiscovery {
// 服务注册
registerService(service: ServiceInfo): Promise<void>;
// 服务发现
discoverService(serviceName: string): Promise<ServiceInstance[]>;
// 服务注销
unregisterService(serviceId: string): Promise<void>;
// 健康检查
checkHealth(serviceId: string): Promise<HealthStatus>;
// 服务列表
listServices(): ServiceInfo[];
}
// 服务信息
interface ServiceInfo {
id: string;
name: string;
version: string;
host: string;
port: number;
protocol: string;
metadata: Record<string, any>;
tags: string[];
status: ServiceStatus;
lastHeartbeat: Date;
}
```
#### **2.2 负载均衡组件**
```typescript
// 负载均衡器接口
interface LoadBalancer {
// 选择服务实例
selectInstance(instances: ServiceInstance[]): ServiceInstance;
// 更新实例状态
updateInstanceStatus(instanceId: string, status: InstanceStatus): void;
// 获取负载均衡策略
getStrategy(): LoadBalanceStrategy;
// 设置负载均衡策略
setStrategy(strategy: LoadBalanceStrategy): void;
}
// 负载均衡策略
enum LoadBalanceStrategy {
ROUND_ROBIN = 'round-robin',
WEIGHTED_ROUND_ROBIN = 'weighted-round-robin',
LEAST_CONNECTIONS = 'least-connections',
WEIGHTED_LEAST_CONNECTIONS = 'weighted-least-connections',
CONSISTENT_HASH = 'consistent-hash',
IP_HASH = 'ip-hash',
RANDOM = 'random'
}
```
#### **2.3 熔断器组件**
```typescript
// 熔断器接口
interface CircuitBreaker {
// 执行请求
execute<T>(fn: () => Promise<T>): Promise<T>;
// 获取状态
getStatus(): CircuitBreakerStatus;
// 手动重置
reset(): void;
// 获取统计信息
getStats(): CircuitBreakerStats;
}
// 熔断器状态
enum CircuitBreakerStatus {
CLOSED = 'closed', // 关闭状态,正常处理请求
OPEN = 'open', // 开启状态,拒绝所有请求
HALF_OPEN = 'half-open' // 半开状态,允许部分请求
}
```
### **3. 服务网格组件**
#### **3.1 Istio集成组件**
```typescript
// Istio 客户端接口
interface IstioClient {
// 创建虚拟服务
createVirtualService(vs: VirtualService): Promise<void>;
// 创建目标规则
createDestinationRule(dr: DestinationRule): Promise<void>;
// 创建网关
createGateway(gateway: Gateway): Promise<void>;
// 创建服务入口
createServiceEntry(se: ServiceEntry): Promise<void>;
// 获取服务配置
getServiceConfig(serviceName: string): Promise<ServiceConfig>;
}
// 虚拟服务配置
interface VirtualService {
apiVersion: string;
kind: string;
metadata: {
name: string;
namespace: string;
};
spec: {
hosts: string[];
gateways?: string[];
http: HttpRoute[];
tcp?: TcpRoute[];
tls?: TlsRoute[];
};
}
```
### **4. 监控追踪组件**
#### **4.1 分布式追踪组件**
```typescript
// 追踪器接口
interface Tracer {
// 开始追踪
startSpan(name: string, options?: SpanOptions): Span;
// 注入追踪上下文
inject(span: Span, format: string, carrier: any): void;
// 提取追踪上下文
extract(format: string, carrier: any): SpanContext | null;
// 获取当前活跃的Span
getCurrentSpan(): Span | null;
}
// Span接口
interface Span {
// 获取上下文
context(): SpanContext;
// 设置标签
setTag(key: string, value: any): this;
// 记录事件
log(event: LogEvent): this;
// 设置状态
setStatus(status: SpanStatus): this;
// 完成Span
finish(finishTime?: number): void;
}
```
#### **4.2 性能监控组件**
```typescript
// 性能监控接口
interface PerformanceMonitor {
// 记录请求开始
recordRequestStart(requestId: string, metadata: RequestMetadata): void;
// 记录请求结束
recordRequestEnd(requestId: string, responseTime: number, status: number): void;
// 记录错误
recordError(requestId: string, error: Error): void;
// 获取性能指标
getMetrics(timeRange: TimeRange): PerformanceMetrics;
// 设置告警规则
setAlertRule(rule: AlertRule): void;
}
// 性能指标
interface PerformanceMetrics {
// 请求总数
totalRequests: number;
// 成功请求数
successfulRequests: number;
// 失败请求数
failedRequests: number;
// 平均响应时间
averageResponseTime: number;
// 95%分位响应时间
p95ResponseTime: number;
// 99%分位响应时间
p99ResponseTime: number;
// 吞吐量 (QPS)
throughput: number;
// 错误率
errorRate: number;
}
```
---
## 📊 **性能优化策略**
### **1. 缓存策略**
```typescript
// 多级缓存接口
interface MultiLevelCache {
// 获取缓存
get<T>(key: string): Promise<T | null>;
// 设置缓存
set<T>(key: string, value: T, ttl?: number): Promise<void>;
// 删除缓存
delete(key: string): Promise<void>;
// 清空缓存
clear(): Promise<void>;
// 获取缓存统计
getStats(): CacheStats;
}
// 多级缓存实现
class MultiLevelCacheImpl implements MultiLevelCache {
constructor(
private l1Cache: Cache, // L1: 内存缓存
private l2Cache: Cache, // L2: Redis缓存
private l3Cache: Cache // L3: 数据库缓存
) {}
async get<T>(key: string): Promise<T | null> {
// L1 缓存查找
let value = await this.l1Cache.get<T>(key);
if (value !== null) {
return value;
}
// L2 缓存查找
value = await this.l2Cache.get<T>(key);
if (value !== null) {
// 回填 L1 缓存
await this.l1Cache.set(key, value);
return value;
}
// L3 缓存查找
value = await this.l3Cache.get<T>(key);
if (value !== null) {
// 回填 L1 和 L2 缓存
await Promise.all([
this.l1Cache.set(key, value),
this.l2Cache.set(key, value)
]);
return value;
}
return null;
}
}
```
### **2. 连接池管理**
```typescript
// 连接池接口
interface ConnectionPool<T> {
// 获取连接
acquire(): Promise<T>;
// 释放连接
release(connection: T): void;
// 关闭连接池
close(): Promise<void>;
// 获取池状态
getStatus(): PoolStatus;
}
// 数据库连接池实现
class DatabaseConnectionPool implements ConnectionPool<DatabaseConnection> {
private pool: Pool<DatabaseConnection>;
private config: PoolConfig;
constructor(config: PoolConfig) {
this.config = config;
this.pool = new Pool({
host: config.host,
port: config.port,
user: config.user,
password: config.password,
database: config.database,
connectionLimit: config.maxConnections,
acquireTimeout: config.acquireTimeout,
timeout: config.timeout,
queueLimit: config.queueLimit
});
}
async acquire(): Promise<DatabaseConnection> {
return this.pool.getConnection();
}
release(connection: DatabaseConnection): void {
connection.release();
}
async close(): Promise<void> {
await this.pool.end();
}
getStatus(): PoolStatus {
return {
totalConnections: this.pool.config.connectionLimit,
activeConnections: this.pool._allConnections.length,
idleConnections: this.pool._freeConnections.length,
waitingRequests: this.pool._connectionQueue.length
};
}
}
```
---
## 🚀 **部署架构**
### **容器化部署**
```yaml
# docker-compose.yml
version: '3.8'
services:
gateway:
build: .
ports:
- "3001:3001"
environment:
- NODE_ENV=production
- DB_HOST=mysql
- REDIS_HOST=redis
depends_on:
- mysql
- redis
networks:
- gateway-network
deploy:
replicas: 3
resources:
limits:
cpus: '1.0'
memory: 1G
reservations:
cpus: '0.5'
memory: 512M
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_DATABASE: ${DB_NAME}
volumes:
- mysql_data:/var/lib/mysql
networks:
- gateway-network
redis:
image: redis:6.2-alpine
command: redis-server --requirepass ${REDIS_PASSWORD}
volumes:
- redis_data:/data
networks:
- gateway-network
networks:
gateway-network:
driver: bridge
volumes:
mysql_data:
redis_data:
```
### **Kubernetes部署**
```yaml
# gateway-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: gateway
namespace: wwjcloud
spec:
replicas: 3
selector:
matchLabels:
app: gateway
template:
metadata:
labels:
app: gateway
spec:
containers:
- name: gateway
image: wwjcloud/gateway:latest
ports:
- containerPort: 3001
env:
- name: NODE_ENV
value: "production"
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: gateway-config
key: db_host
resources:
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "1000m"
livenessProbe:
httpGet:
path: /health
port: 3001
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 3001
initialDelaySeconds: 5
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: gateway-service
namespace: wwjcloud
spec:
selector:
app: gateway
ports:
- protocol: TCP
port: 80
targetPort: 3001
type: LoadBalancer
```
---
## 🔍 **监控和告警**
### **监控指标**
```typescript
// 监控指标收集器
@Injectable()
export class MetricsCollector {
private metrics = new Map<string, Metric>();
// 记录计数器
incrementCounter(name: string, labels: Record<string, string> = {}): void {
const key = this.buildKey(name, labels);
const metric = this.metrics.get(key) || { name, type: 'counter', value: 0, labels };
metric.value++;
this.metrics.set(key, metric);
}
// 记录直方图
recordHistogram(name: string, value: number, labels: Record<string, string> = {}): void {
const key = this.buildKey(name, labels);
const metric = this.metrics.get(key) || {
name,
type: 'histogram',
buckets: new Map(),
labels
};
if (metric.type === 'histogram') {
const bucket = this.getBucket(value);
metric.buckets.set(bucket, (metric.buckets.get(bucket) || 0) + 1);
}
this.metrics.set(key, metric);
}
// 记录仪表盘
setGauge(name: string, value: number, labels: Record<string, string> = {}): void {
const key = this.buildKey(name, labels);
this.metrics.set(key, { name, type: 'gauge', value, labels });
}
// 获取所有指标
getMetrics(): Metric[] {
return Array.from(this.metrics.values());
}
private buildKey(name: string, labels: Record<string, string>): string {
const labelStr = Object.entries(labels)
.map(([k, v]) => `${k}="${v}"`)
.join(',');
return labelStr ? `${name}{${labelStr}}` : name;
}
private getBucket(value: number): string {
const buckets = [0.1, 0.5, 1, 2, 5, 10, 30, 60, 120, 300, 600];
for (const bucket of buckets) {
if (value <= bucket) {
return `le="${bucket}"`;
}
}
return 'le="+Inf"';
}
}
```
### **告警规则**
```typescript
// 告警规则引擎
@Injectable()
export class AlertingEngine {
private rules: AlertRule[] = [];
private alertManager: AlertManager;
constructor(alertManager: AlertManager) {
this.alertManager = alertManager;
}
// 添加告警规则
addRule(rule: AlertRule): void {
this.rules.push(rule);
}
// 评估告警规则
evaluateRules(metrics: Metric[]): void {
for (const rule of this.rules) {
if (this.evaluateRule(rule, metrics)) {
this.triggerAlert(rule);
}
}
}
private evaluateRule(rule: AlertRule, metrics: Metric[]): boolean {
const metric = metrics.find(m => m.name === rule.metricName);
if (!metric) return false;
switch (rule.operator) {
case 'gt':
return metric.value > rule.threshold;
case 'gte':
return metric.value >= rule.threshold;
case 'lt':
return metric.value < rule.threshold;
case 'lte':
return metric.value <= rule.threshold;
case 'eq':
return metric.value === rule.threshold;
case 'ne':
return metric.value !== rule.threshold;
default:
return false;
}
}
private triggerAlert(rule: AlertRule): void {
const alert: Alert = {
id: uuidv4(),
ruleId: rule.id,
severity: rule.severity,
message: rule.message,
timestamp: new Date(),
status: 'firing'
};
this.alertManager.sendAlert(alert);
}
}
```
---
## 📚 **下一步**
- [查看开发计划](./development-plan.md) - 了解详细的开发路线图
- [开始快速上手](./quick-start.md) - 立即开始使用网关系统
- [查看API参考](./api-reference.md) - 完整的API接口文档
---
> **提示**: 本文档提供了网关系统的技术架构详解如需了解具体实现细节请查看相应的代码示例和API文档。

View File

@@ -0,0 +1,496 @@
# WWJCloud 网关系统待开发功能分析
> 本文档详细分析了 WWJCloud 网关系统的当前状态、缺失功能和开发计划
## 📋 **当前网关系统状态概览**
### **已实现功能** ✅
- **基础路由网关**: 完整的路由定义和管理
- **中间件系统**: 全局中间件、路由中间件
- **认证授权**: JWT、OAuth2.0、RBAC权限
- **网络安全**: HTTPS、CORS、CSRF防护
- **基础监控**: 健康检查、基础日志
- **文件上传**: 多文件上传、文件管理
### **缺失功能** ❌
- **微服务网关**: 服务发现、服务注册、负载均衡
- **服务网格**: Istio、Envoy集成
- **分布式追踪**: 链路追踪、性能分析
- **高级负载均衡**: 一致性哈希、熔断器
- **API网关管理**: 路由配置、限流配置
- **监控告警**: 性能监控、错误告警
---
## 🚨 **严重缺失功能(必须实现)**
### **1. 微服务网关** 🔴 **优先级:最高**
#### **1.1 服务发现系统**
```typescript
// 待实现:服务发现模块
@Module({
imports: [DiscoveryModule],
providers: [ServiceDiscoveryService],
exports: [ServiceDiscoveryService],
})
export class ServiceDiscoveryModule {}
// 核心功能需求:
// - 服务注册 (Service Registration)
// - 服务发现 (Service Discovery)
// - 健康检查 (Health Check)
// - 服务元数据管理 (Service Metadata)
```
#### **1.2 服务注册系统**
```typescript
// 待实现:服务注册模块
@Module({
imports: [RegistryModule],
providers: [ServiceRegistryService],
exports: [ServiceRegistryService],
})
export class ServiceRegistryModule {}
// 核心功能需求:
// - 自动服务注册 (Auto Registration)
// - 服务心跳检测 (Heartbeat Detection)
// - 服务状态管理 (Service Status Management)
// - 服务版本管理 (Service Version Management)
```
#### **1.3 负载均衡系统**
```typescript
// 待实现:负载均衡模块
@Module({
imports: [LoadBalancerModule],
providers: [LoadBalancerService],
exports: [LoadBalancerService],
})
export class LoadBalancerModule {}
// 核心功能需求:
// - 轮询负载均衡 (Round Robin)
// - 权重负载均衡 (Weighted)
// - 最少连接负载均衡 (Least Connections)
// - 一致性哈希负载均衡 (Consistent Hashing)
// - 健康检查负载均衡 (Health Check)
```
### **2. 服务网格支持** 🔴 **优先级:最高**
#### **2.1 Istio集成**
```typescript
// 待实现Istio集成模块
@Module({
imports: [IstioModule],
providers: [IstioService],
exports: [IstioService],
})
export class IstioModule {}
// 核心功能需求:
// - 流量管理 (Traffic Management)
// - 安全策略 (Security Policies)
// - 可观测性 (Observability)
// - 策略执行 (Policy Enforcement)
```
#### **2.2 Envoy代理集成**
```typescript
// 待实现Envoy代理模块
@Module({
imports: [EnvoyModule],
providers: [EnvoyService],
exports: [EnvoyService],
})
export class EnvoyModule {}
// 核心功能需求:
// - 代理配置管理 (Proxy Configuration)
// - 动态配置更新 (Dynamic Configuration)
// - 流量路由 (Traffic Routing)
// - 负载均衡 (Load Balancing)
```
### **3. 分布式追踪系统** 🔴 **优先级:最高**
#### **3.1 链路追踪**
```typescript
// 待实现:链路追踪模块
@Module({
imports: [TracingModule],
providers: [TracingService],
exports: [TracingService],
})
export class TracingModule {}
// 核心功能需求:
// - 请求链路追踪 (Request Tracing)
// - 跨服务追踪 (Cross-Service Tracing)
// - 性能分析 (Performance Analysis)
// - 错误追踪 (Error Tracing)
```
#### **3.2 性能监控**
```typescript
// 待实现:性能监控模块
@Module({
imports: [PerformanceModule],
providers: [PerformanceService],
exports: [PerformanceService],
})
export class PerformanceModule {}
// 核心功能需求:
// - 响应时间监控 (Response Time Monitoring)
// - 吞吐量监控 (Throughput Monitoring)
// - 资源使用监控 (Resource Usage Monitoring)
// - 性能指标聚合 (Performance Metrics Aggregation)
```
---
## ⚠️ **部分缺失功能(建议补充)**
### **4. API网关管理** 🟡 **优先级:高**
#### **4.1 路由配置管理**
```typescript
// 待实现:路由配置管理模块
@Module({
imports: [RouteConfigModule],
providers: [RouteConfigService],
exports: [RouteConfigService],
})
export class RouteConfigModule {}
// 核心功能需求:
// - 动态路由配置 (Dynamic Route Configuration)
// - 路由规则管理 (Route Rule Management)
// - 路由策略配置 (Route Policy Configuration)
// - 路由版本管理 (Route Version Management)
```
#### **4.2 限流配置管理**
```typescript
// 待实现:限流配置管理模块
@Module({
imports: [RateLimitModule],
providers: [RateLimitService],
exports: [RateLimitService],
})
export class RateLimitModule {}
// 核心功能需求:
// - 基于用户的限流 (User-Based Rate Limiting)
// - 基于IP的限流 (IP-Based Rate Limiting)
// - 基于API的限流 (API-Based Rate Limiting)
// - 动态限流配置 (Dynamic Rate Limit Configuration)
```
### **5. 监控告警系统** 🟡 **优先级:高**
#### **5.1 性能监控**
```typescript
// 待实现:性能监控模块
@Module({
imports: [MonitoringModule],
providers: [MonitoringService],
exports: [MonitoringService],
})
export class MonitoringModule {}
// 核心功能需求:
// - 实时性能监控 (Real-Time Performance Monitoring)
// - 历史性能分析 (Historical Performance Analysis)
// - 性能趋势分析 (Performance Trend Analysis)
// - 性能报告生成 (Performance Report Generation)
```
#### **5.2 告警系统**
```typescript
// 待实现:告警系统模块
@Module({
imports: [AlertingModule],
providers: [AlertingService],
exports: [AlertingService],
})
export class AlertingModule {}
// 核心功能需求:
// - 告警规则配置 (Alert Rule Configuration)
// - 告警触发机制 (Alert Trigger Mechanism)
// - 告警通知渠道 (Alert Notification Channels)
// - 告警升级策略 (Alert Escalation Strategy)
```
---
## ✨ **高级特性功能(可选实现)**
### **6. 高级负载均衡** 🟢 **优先级:中**
#### **6.1 熔断器模式**
```typescript
// 待实现:熔断器模块
@Module({
imports: [CircuitBreakerModule],
providers: [CircuitBreakerService],
exports: [CircuitBreakerService],
})
export class CircuitBreakerModule {}
// 核心功能需求:
// - 熔断器状态管理 (Circuit Breaker State Management)
// - 熔断器策略配置 (Circuit Breaker Policy Configuration)
// - 熔断器监控 (Circuit Breaker Monitoring)
// - 自动恢复机制 (Auto Recovery Mechanism)
```
#### **6.2 重试机制**
```typescript
// 待实现:重试机制模块
@Module({
imports: [RetryModule],
providers: [RetryService],
exports: [RetryService],
})
export class RetryModule {}
// 核心功能需求:
// - 重试策略配置 (Retry Policy Configuration)
// - 指数退避算法 (Exponential Backoff)
// - 重试次数限制 (Retry Count Limitation)
// - 重试条件配置 (Retry Condition Configuration)
```
### **7. 缓存网关** 🟢 **优先级:中**
#### **7.1 响应缓存**
```typescript
// 待实现:响应缓存模块
@Module({
imports: [ResponseCacheModule],
providers: [ResponseCacheService],
exports: [ResponseCacheService],
})
export class ResponseCacheModule {}
// 核心功能需求:
// - 响应缓存策略 (Response Caching Strategy)
// - 缓存失效管理 (Cache Invalidation Management)
// - 缓存预热机制 (Cache Warming Mechanism)
// - 缓存统计监控 (Cache Statistics Monitoring)
```
---
## 📅 **开发计划时间表**
### **第一阶段核心微服务网关3-6个月**
#### **第1个月服务发现系统**
- [ ] 设计服务发现架构
- [ ] 实现服务注册功能
- [ ] 实现服务发现功能
- [ ] 添加健康检查机制
- [ ] 编写单元测试
#### **第2个月负载均衡系统**
- [ ] 设计负载均衡架构
- [ ] 实现基础负载均衡算法
- [ ] 实现一致性哈希算法
- [ ] 添加健康检查负载均衡
- [ ] 编写单元测试
#### **第3个月服务注册系统**
- [ ] 设计服务注册架构
- [ ] 实现自动服务注册
- [ ] 实现服务心跳检测
- [ ] 实现服务状态管理
- [ ] 编写单元测试
### **第二阶段服务网格集成6-9个月**
#### **第4个月Istio集成**
- [ ] 研究Istio架构
- [ ] 实现Istio客户端
- [ ] 集成流量管理功能
- [ ] 集成安全策略功能
- [ ] 编写集成测试
#### **第5个月Envoy代理集成**
- [ ] 研究Envoy架构
- [ ] 实现Envoy客户端
- [ ] 集成代理配置管理
- [ ] 集成动态配置更新
- [ ] 编写集成测试
#### **第6个月服务网格功能**
- [ ] 实现流量路由功能
- [ ] 实现负载均衡功能
- [ ] 实现安全策略功能
- [ ] 实现可观测性功能
- [ ] 编写集成测试
### **第三阶段分布式追踪9-12个月**
#### **第7个月链路追踪基础**
- [ ] 设计链路追踪架构
- [ ] 实现请求链路追踪
- [ ] 实现跨服务追踪
- [ ] 实现追踪数据收集
- [ ] 编写单元测试
#### **第8个月性能监控**
- [ ] 设计性能监控架构
- [ ] 实现响应时间监控
- [ ] 实现吞吐量监控
- [ ] 实现资源使用监控
- [ ] 编写单元测试
#### **第9个月错误追踪**
- [ ] 设计错误追踪架构
- [ ] 实现错误收集功能
- [ ] 实现错误分析功能
- [ ] 实现错误报告功能
- [ ] 编写单元测试
### **第四阶段高级特性12-15个月**
#### **第10个月API网关管理**
- [ ] 设计API网关管理架构
- [ ] 实现动态路由配置
- [ ] 实现路由规则管理
- [ ] 实现路由策略配置
- [ ] 编写单元测试
#### **第11个月监控告警系统**
- [ ] 设计监控告警架构
- [ ] 实现性能监控功能
- [ ] 实现告警规则配置
- [ ] 实现告警通知功能
- [ ] 编写单元测试
#### **第12个月高级负载均衡**
- [ ] 设计高级负载均衡架构
- [ ] 实现熔断器模式
- [ ] 实现重试机制
- [ ] 实现高级算法
- [ ] 编写单元测试
---
## 🛠️ **技术实现建议**
### **推荐技术栈**
#### **微服务框架**
- **服务发现**: Consul、Eureka、Zookeeper
- **负载均衡**: Ribbon、LoadBalancer
- **熔断器**: Hystrix、Resilience4j
- **重试机制**: Retry4j、Spring Retry
#### **服务网格**
- **Istio**: 服务网格控制平面
- **Envoy**: 高性能代理
- **Linkerd**: 轻量级服务网格
- **Consul Connect**: 基于Consul的服务网格
#### **监控追踪**
- **Jaeger**: 分布式追踪系统
- **Zipkin**: 分布式追踪系统
- **Prometheus**: 监控系统
- **Grafana**: 可视化平台
#### **API网关**
- **Kong**: 高性能API网关
- **Traefik**: 现代HTTP反向代理
- **Ambassador**: Kubernetes原生API网关
- **Gloo**: 功能丰富的API网关
### **架构设计原则**
1. **模块化设计**: 每个功能模块独立,便于维护和扩展
2. **接口标准化**: 定义清晰的接口规范,便于集成
3. **配置外部化**: 支持外部配置,便于部署和运维
4. **监控可观测**: 全面的监控和追踪能力
5. **高可用设计**: 支持故障转移和自动恢复
6. **性能优化**: 支持高并发和低延迟
---
## 📊 **成功指标**
### **功能完整性指标**
- [ ] 微服务网关功能完整度 ≥ 90%
- [ ] 服务网格集成完整度 ≥ 80%
- [ ] 分布式追踪完整度 ≥ 85%
- [ ] 监控告警完整度 ≥ 80%
### **性能指标**
- [ ] 网关延迟 ≤ 10ms
- [ ] 支持并发请求 ≥ 10,000 QPS
- [ ] 服务发现响应时间 ≤ 100ms
- [ ] 负载均衡响应时间 ≤ 5ms
### **可靠性指标**
- [ ] 系统可用性 ≥ 99.9%
- [ ] 故障恢复时间 ≤ 30秒
- [ ] 数据一致性 ≥ 99.99%
- [ ] 错误率 ≤ 0.1%
---
## 🔍 **风险评估**
### **技术风险**
- **微服务复杂性**: 微服务架构增加了系统复杂性
- **服务网格学习成本**: Istio等工具学习成本较高
- **分布式系统挑战**: 分布式追踪和监控实现复杂
### **资源风险**
- **开发时间**: 预计需要15个月完成所有功能
- **技术人才**: 需要具备微服务和云原生经验的开发人员
- **测试资源**: 需要大量的测试环境和测试数据
### **运维风险**
- **部署复杂性**: 微服务部署比单体应用复杂
- **监控复杂性**: 分布式系统监控比单体系统复杂
- **故障排查**: 分布式系统故障排查难度增加
---
## 📚 **参考资料**
### **官方文档**
- [NestJS 官方文档](https://nestjs.com/)
- [Istio 官方文档](https://istio.io/)
- [Envoy 官方文档](https://www.envoyproxy.io/)
- [Consul 官方文档](https://www.consul.io/)
### **技术博客**
- [微服务架构设计模式](https://microservices.io/)
- [服务网格最佳实践](https://servicemesh.io/)
- [分布式追踪实现指南](https://opentracing.io/)
### **开源项目**
- [NestJS 微服务示例](https://github.com/nestjs/nest/tree/master/sample)
- [Istio 示例项目](https://github.com/istio/istio/tree/master/samples)
- [Envoy 示例配置](https://github.com/envoyproxy/envoy/tree/master/examples)
---
## 📝 **更新日志**
| 版本 | 日期 | 更新内容 | 更新人 |
|------|------|----------|--------|
| v1.0.0 | 2025-08-25 | 初始版本,基础功能分析 | 系统分析员 |
| v1.1.0 | - | 待更新 | - |
| v1.2.0 | - | 待更新 | - |
---
> **注意**: 本文档将根据开发进度和需求变化持续更新,请定期查看最新版本。

View File

@@ -0,0 +1,100 @@
# WWJCloud 网关系统文档
> 本文档集合涵盖了 WWJCloud 网关系统的完整技术文档
## 📚 **文档导航**
### **🚀 快速开始**
- [网关系统概览](./overview.md) - 了解网关系统的基本概念和架构
- [快速开始指南](./quick-start.md) - 快速上手网关系统开发
### **🏗️ 架构设计**
- [技术架构详解](./architecture.md) - 深入理解网关系统的技术架构
- [组件设计说明](./components.md) - 了解各个组件的设计原理
### **📋 开发指南**
- [开发计划](./development-plan.md) - 详细的开发时间表和任务分解
- [API 参考](./api-reference.md) - 网关系统的 API 接口文档
- [配置指南](./configuration.md) - 系统配置和参数说明
### **🔧 运维指南**
- [部署指南](./deployment.md) - 系统部署和安装说明
- [监控告警](./monitoring.md) - 系统监控和告警配置
- [故障排查](./troubleshooting.md) - 常见问题解决方案
### **📊 性能优化**
- [性能调优](./performance.md) - 系统性能优化指南
- [负载均衡](./load-balancing.md) - 负载均衡策略和配置
- [缓存策略](./caching.md) - 缓存机制和优化方案
---
## 🌟 **核心特性**
### **微服务网关**
- **服务发现**: 自动服务注册和发现
- **负载均衡**: 多种负载均衡算法支持
- **熔断器**: 服务保护机制
- **重试机制**: 智能重试策略
### **服务网格**
- **Istio 集成**: 完整的服务网格解决方案
- **Envoy 代理**: 高性能代理支持
- **流量管理**: 灵活的流量路由策略
- **安全策略**: 多层次安全防护
### **监控追踪**
- **分布式追踪**: 完整的请求链路追踪
- **性能监控**: 实时性能指标监控
- **告警系统**: 智能告警和通知
- **日志聚合**: 集中化日志管理
---
## 🎯 **适用场景**
- **企业级应用**: 大型分布式系统
- **微服务架构**: 服务间通信管理
- **云原生部署**: 容器化和 Kubernetes 支持
- **高并发系统**: 高性能网关需求
- **多租户系统**: SaaS 应用支持
---
## 🚀 **快速体验**
### **环境要求**
- Node.js >= 18.0.0
- NestJS >= 11.0.0
- Docker >= 20.0.0
- Kubernetes >= 1.20.0
### **快速启动**
```bash
# 克隆项目
git clone <repository-url>
cd wwjcloud-nestjs
# 安装依赖
npm install
# 启动开发环境
npm run start:dev
```
### **访问地址**
- **API 文档**: http://localhost:3001/docs
- **健康检查**: http://localhost:3001/health
- **监控面板**: http://localhost:3001/monitoring
---
## 📞 **技术支持**
- **文档问题**: 在 GitHub 上提交 Issue
- **技术交流**: 加入技术交流群
- **商业支持**: 联系技术支持团队
---
> **注意**: 本文档将根据开发进度持续更新,请定期查看最新版本。

View File

@@ -0,0 +1,37 @@
# Kong decK 使用说明
## 前置
- 已安装并启动 KongDB 模式,推荐 Postgres
- 安装 decK参考官方文档
## 目录
- 配置文件:`deck.yaml`
## 常用命令
```bash
# 校验配置
deck validate --state deck.yaml
# 直接导入(会覆盖已有同名资源)
deck sync --state deck.yaml
# 以 diff 方式查看变更
deck diff --state deck.yaml
```
## 本地开发说明
- services.host 使用 `host.docker.internal:3001` 将请求转发到宿主机运行的 NestJS
- 若 Kong 与后端同在宿主机,可将 host 改为 `localhost`
## 插件
- correlation-id统一请求 ID上游未传则生成下游透传
- rate-limiting示例每分钟 300 次,可据环境覆盖
- prometheus开启 Kong 指标,抓取地址 `:8001/metrics`
## 环境差异化
- 建议按环境拆分 `deck.dev.yaml``deck.prod.yaml` 或使用 CI 注入变量
- 关键变量:上游 host/port、限流阈值、超时、JWT 公钥/密钥
## 与后端配合
- 后端会记录并透传 `X-Request-ID` / `traceparent`
- Kong 可作为北向入口,/api 与 /adminapi 分流

View File

@@ -0,0 +1,73 @@
_format_version: "3.0"
_transform: true
info:
select_tags:
- wwjcloud
services:
- name: wwjcloud-backend
host: host.docker.internal
port: 3001
protocol: http
routes:
- name: wwjcloud-api
paths:
- /api
strip_path: false
methods:
- GET
- POST
- PUT
- PATCH
- DELETE
- OPTIONS
tags: [wwjcloud]
- name: wwjcloud-adminapi
paths:
- /adminapi
strip_path: false
methods:
- GET
- POST
- PUT
- PATCH
- DELETE
- OPTIONS
tags: [wwjcloud]
tags: [wwjcloud]
plugins:
# 统一关联请求 ID如果上游没传则生成
- name: correlation-id
config:
header_name: X-Request-ID
generator: uuid
echo_downstream: true
tags: [wwjcloud]
# 速率限制(示例:每分钟 300 次)
- name: rate-limiting
config:
minute: 300
policy: local
fault_tolerant: true
hide_client_headers: false
tags: [wwjcloud]
# Prometheus 指标
- name: prometheus
tags: [wwjcloud]
# 上游超时(毫秒)
- name: upstream-timeout
enabled: false
config:
connect_timeout: 6000
send_timeout: 30000
read_timeout: 30000
tags: [wwjcloud]
consumers: []
jwt_secrets: []

View File

@@ -0,0 +1,230 @@
# 网关系统概览
> 了解 WWJCloud 网关系统的基本概念、架构和特性
## 🌟 **什么是网关系统**
网关系统是 WWJCloud 框架的核心组件,负责处理所有进入系统的请求,提供路由、负载均衡、认证授权、监控追踪等核心功能。它是连接前端应用和后端服务的桥梁,确保系统的高可用性、安全性和可观测性。
### **核心作用**
- **统一入口**: 为所有服务提供统一的访问入口
- **流量管理**: 智能路由和负载均衡
- **安全防护**: 认证授权和安全策略
- **性能优化**: 缓存、限流、熔断等机制
- **监控追踪**: 完整的可观测性支持
---
## 🏗️ **系统架构**
### **整体架构图**
```
┌─────────────────────────────────────────────────────────────┐
│ 用户请求层 │
├─────────────────────────────────────────────────────────────┤
│ Web浏览器 │ 移动应用 │ API客户端 │ 第三方系统 │
└─────────────────────┬───────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ CDN + 负载均衡层 │
├─────────────────────────────────────────────────────────────┤
│ 全球CDN │ 智能DNS │ 负载均衡器 │ 健康检查 │
└─────────────────────┬───────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ API网关层 (Kong/Envoy) │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 路由管理 │ │ 限流控制 │ │ 安全策略 │ │
│ │ │ │ │ │ │ │
│ │ • 动态路由 │ │ • 用户限流 │ │ • 访问控制 │ │
│ │ • 路由版本 │ │ • IP限流 │ │ • 流量控制 │ │
│ │ • 路由策略 │ │ • API限流 │ │ • 安全防护 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────┬───────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ NestJS 微服务网关层 │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 服务发现 │ │ 负载均衡 │ │ 熔断器 │ │
│ │ │ │ │ │ │ │
│ │ • 服务注册 │ │ • 轮询算法 │ │ • 状态管理 │ │
│ │ • 服务发现 │ │ • 权重算法 │ │ • 策略配置 │ │
│ │ • 健康检查 │ │ • 一致性哈希│ │ • 自动恢复 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────┬───────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 服务网格层 (Istio) │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 流量管理 │ │ 安全策略 │ │ 可观测性 │ │
│ │ │ │ │ │ │ │
│ │ • 流量路由 │ │ • 身份认证 │ │ • 指标收集 │ │
│ │ • 流量分割 │ │ • 授权策略 │ │ • 日志聚合 │ │
│ │ • 流量镜像 │ │ • 加密通信 │ │ • 链路追踪 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────┬───────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 微服务层 │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 用户服务 │ │ 权限服务 │ │ 文件服务 │ │
│ │ │ │ │ │ │ │
│ │ • 会员管理 │ │ • 角色管理 │ │ • 文件上传 │ │
│ │ • 管理员 │ │ • 菜单管理 │ │ • 文件管理 │ │
│ │ • 认证授权 │ │ • 权限控制 │ │ • 存储适配 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────┬───────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 数据存储层 │
├─────────────────────────────────────────────────────────────┤
│ MySQL集群 │ Redis集群 │ 对象存储 │ 时序数据库 │
└─────────────────────────────────────────────────────────────┘
```
---
## 🔧 **核心组件**
### **1. API网关层**
- **Kong**: 高性能API网关提供丰富的插件生态
- **Envoy**: 现代HTTP代理支持动态配置
- **功能**: 路由管理、限流控制、安全策略
### **2. 微服务网关层**
- **服务发现**: 自动服务注册和发现机制
- **负载均衡**: 多种负载均衡算法支持
- **熔断器**: 服务保护和服务降级
- **重试机制**: 智能重试和指数退避
### **3. 服务网格层**
- **Istio**: 完整的服务网格解决方案
- **流量管理**: 灵活的流量路由策略
- **安全策略**: 多层次安全防护
- **可观测性**: 完整的监控和追踪
### **4. 监控追踪层**
- **Prometheus**: 指标收集和告警
- **Jaeger**: 分布式链路追踪
- **Grafana**: 数据可视化和仪表板
- **ELK Stack**: 日志聚合和分析
---
## 🚀 **核心特性**
### **微服务支持**
- **服务发现**: 支持多种服务发现机制
- **负载均衡**: 轮询、权重、一致性哈希等算法
- **熔断器**: 自动故障检测和恢复
- **重试机制**: 智能重试策略
### **安全防护**
- **认证授权**: JWT、OAuth2.0、RBAC
- **访问控制**: 基于角色的权限控制
- **流量控制**: 限流、熔断、降级
- **加密通信**: TLS/SSL 加密支持
### **性能优化**
- **缓存机制**: 多级缓存策略
- **连接池**: 数据库和外部服务连接池
- **异步处理**: 非阻塞异步处理
- **资源管理**: 智能资源分配
### **可观测性**
- **指标监控**: 实时性能指标
- **链路追踪**: 完整的请求链路
- **日志聚合**: 集中化日志管理
- **告警通知**: 智能告警机制
---
## 📊 **性能指标**
### **响应时间**
- **网关延迟**: ≤ 10ms
- **服务发现**: ≤ 100ms
- **负载均衡**: ≤ 5ms
- **链路追踪**: ≤ 50ms
### **吞吐量**
- **并发处理**: ≥ 10,000 QPS
- **连接数**: ≥ 100,000 并发连接
- **缓存命中率**: ≥ 95%
- **系统可用性**: ≥ 99.9%
---
## 🎯 **应用场景**
### **企业级应用**
- **大型分布式系统**: 支持数百个微服务
- **高并发场景**: 支持数万并发用户
- **多租户系统**: SaaS 应用支持
- **混合云部署**: 跨云平台部署
### **微服务架构**
- **服务治理**: 完整的服务生命周期管理
- **流量管理**: 灵活的流量路由策略
- **故障隔离**: 服务间故障隔离
- **弹性伸缩**: 自动扩缩容支持
### **云原生应用**
- **容器化部署**: Docker 和 Kubernetes 支持
- **服务网格**: Istio 和 Envoy 集成
- **DevOps**: 自动化部署和运维
- **监控告警**: 完整的可观测性
---
## 🚀 **快速开始**
### **环境要求**
- Node.js >= 18.0.0
- NestJS >= 11.0.0
- Docker >= 20.0.0
- Kubernetes >= 1.20.0
### **安装步骤**
```bash
# 1. 克隆项目
git clone <repository-url>
cd wwjcloud-nestjs
# 2. 安装依赖
npm install
# 3. 配置环境
cp .env.example .env
# 编辑 .env 文件
# 4. 启动服务
npm run start:dev
```
### **验证安装**
- **健康检查**: http://localhost:3001/health
- **API 文档**: http://localhost:3001/docs
- **监控面板**: http://localhost:3001/monitoring
---
## 📚 **下一步**
- [查看技术架构](./architecture.md) - 深入了解技术实现
- [阅读开发计划](./development-plan.md) - 了解开发路线图
- [开始快速上手](./quick-start.md) - 立即开始使用
---
> **提示**: 本文档提供了网关系统的基本概览,如需深入了解特定功能,请查看相应的详细文档。

Some files were not shown because too many files have changed in this diff Show More