refactor: 全面清理项目结构,优化代码组织

主要改进:
1. 清理Core层空壳目录
   - 删除traits, transformers, query等空目录
   - 删除security, http, queue等空模块
   - 删除logger, context, exception等空壳

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

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

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

技术改进:
- 使用TypeScript枚举替代PHP风格的Dict类
- 优化导入路径和模块引用
- 清理无用的空壳目录和文件
This commit is contained in:
万物街
2025-08-24 02:55:13 +08:00
parent 5727b6155f
commit be07b9ffec
14 changed files with 1640 additions and 2098 deletions

View File

@@ -0,0 +1,118 @@
# WWJ Cloud 前端API使用说明
## 📁 目录结构
```
src/api/
├── core/ # 核心API通用功能
├── frontend/ # 前台API前台用户访问
│ ├── member.ts # 前台会员API
│ ├── site.ts # 前台站点API
│ └── index.ts # 前台API统一导出
├── admin/ # 后台管理API后台管理员访问
│ ├── member.ts # 后台会员管理API
│ └── index.ts # 后台管理API统一导出
└── index.ts # 主API统一导出
```
## 🎯 使用方式
### 前台API前台用户访问
```typescript
import { getMemberProfile, memberSignIn, getSiteInfo } from '@/api/frontend';
// 获取个人资料
const profile = await getMemberProfile();
// 会员签到
const signResult = await memberSignIn();
// 获取站点信息
const siteInfo = await getSiteInfo();
```
### 后台管理API后台管理员访问
```typescript
import { getMemberList, createMember, updateMember } from '@/api/admin';
// 获取会员列表
const memberList = await getMemberList({ page: 1, limit: 10 });
// 创建会员
const newMember = await createMember({
username: 'test',
nickname: '测试用户',
mobile: '13800138000',
email: 'test@example.com',
password: '123456',
levelId: 1,
status: 1
});
// 更新会员
const updatedMember = await updateMember(1, {
nickname: '新昵称',
status: 0
});
```
## 🔄 OpenAPI自动同步
### 生成前台API类型
```bash
npm run openapi:gen:frontend
```
### 生成后台管理API类型
```bash
npm run openapi:gen:admin
```
### 生成统一API类型
```bash
npm run openapi:gen
```
## 📋 API分类说明
### 前台API/api/*
- **会员相关**:个人资料、签到、等级、积分等
- **站点相关**:站点信息、配置、公告等
- **菜单相关**:前台菜单、权限等
- **角色相关**:前台角色、权限等
### 后台管理API/admin/*
- **会员管理**:会员列表、创建、编辑、删除等
- **站点管理**:站点配置、管理、设置等
- **菜单管理**:后台菜单、权限配置等
- **角色管理**:后台角色、权限分配等
## 🛡️ 认证和权限
### 前台API认证
- 使用JWT Token认证
- 用户只能访问自己的数据
- 支持公开接口(无需认证)
### 后台管理API认证
- 使用JWT Token + 管理员权限认证
- 管理员可以访问所有数据
- 严格的权限控制
## 📝 注意事项
1. **类型安全**所有API都使用TypeScript类型定义
2. **错误处理**:统一的错误处理机制
3. **数据验证**:前后端数据验证一致
4. **多租户**支持SaaS多租户和独立版部署
5. **自动同步**OpenAPI自动生成前端类型定义
## 🚀 开发建议
1. **优先使用前台API**前台用户功能优先使用前台API
2. **合理使用后台API**管理功能使用后台管理API
3. **保持类型同步**定期运行OpenAPI生成命令
4. **遵循命名规范**API路径和函数名保持一致
5. **测试覆盖**为所有API编写测试用例

View File

@@ -0,0 +1,5 @@
/**
* 后台管理API统一导出
*/
export * from './member';

View File

@@ -0,0 +1,102 @@
/**
* 后台会员管理API服务
* 后台管理员访问的会员管理接口
*/
import { request } from '../request';
import type {
AdminMember,
AdminMemberLevel,
AdminMemberQuery,
AdminMemberCreate,
AdminMemberUpdate,
PaginatedResult
} from '../../../types/admin-api';
// 后台会员管理API基础路径
const ADMIN_MEMBER_API = '/admin/member';
/**
* 获取会员列表
*/
export function getMemberList(params: AdminMemberQuery) {
return request<PaginatedResult<AdminMember>>({
url: ADMIN_MEMBER_API,
method: 'GET',
params,
});
}
/**
* 获取会员详情
*/
export function getMemberDetail(id: number) {
return request<AdminMember>({
url: `${ADMIN_MEMBER_API}/${id}`,
method: 'GET',
});
}
/**
* 创建会员
*/
export function createMember(data: AdminMemberCreate) {
return request<AdminMember>({
url: ADMIN_MEMBER_API,
method: 'POST',
data,
});
}
/**
* 更新会员
*/
export function updateMember(id: number, data: AdminMemberUpdate) {
return request<AdminMember>({
url: `${ADMIN_MEMBER_API}/${id}`,
method: 'PUT',
data,
});
}
/**
* 删除会员
*/
export function deleteMember(id: number) {
return request<void>({
url: `${ADMIN_MEMBER_API}/${id}`,
method: 'DELETE',
});
}
/**
* 批量删除会员
*/
export function batchDeleteMembers(ids: number[]) {
return request<void>({
url: `${ADMIN_MEMBER_API}/batch`,
method: 'DELETE',
data: { ids },
});
}
/**
* 获取会员等级列表
*/
export function getMemberLevelList() {
return request<AdminMemberLevel[]>({
url: `${ADMIN_MEMBER_API}/levels`,
method: 'GET',
});
}
/**
* 更新会员状态
*/
export function updateMemberStatus(id: number, status: number) {
return request<void>({
url: `${ADMIN_MEMBER_API}/${id}/status`,
method: 'PATCH',
data: { status },
});
}

View File

@@ -0,0 +1,6 @@
/**
* 前台API统一导出
*/
export * from './member';
export * from './site';

View File

@@ -0,0 +1,62 @@
/**
* 前台会员API服务
* 前台用户访问的会员相关接口
*/
import { request } from '../request';
import type { FrontendMemberProfile, FrontendMemberSignResult } from '../../../types/frontend-api';
// 前台会员API基础路径
const FRONTEND_MEMBER_API = '/api/member';
/**
* 获取个人资料
*/
export function getMemberProfile() {
return request<FrontendMemberProfile>({
url: `${FRONTEND_MEMBER_API}/profile`,
method: 'GET',
});
}
/**
* 更新个人资料
*/
export function updateMemberProfile(data: Partial<FrontendMemberProfile>) {
return request<FrontendMemberProfile>({
url: `${FRONTEND_MEMBER_API}/profile`,
method: 'PUT',
data,
});
}
/**
* 会员签到
*/
export function memberSignIn() {
return request<FrontendMemberSignResult>({
url: `${FRONTEND_MEMBER_API}/sign`,
method: 'POST',
});
}
/**
* 获取会员等级信息
*/
export function getMemberLevel() {
return request<any>({
url: `${FRONTEND_MEMBER_API}/level`,
method: 'GET',
});
}
/**
* 获取会员积分记录
*/
export function getMemberPointsHistory(params: { page: number; limit: number }) {
return request<any>({
url: `${FRONTEND_MEMBER_API}/points/history`,
method: 'GET',
params,
});
}

View File

@@ -0,0 +1,41 @@
/**
* 前台站点API服务
* 前台用户访问的站点相关接口
*/
import { request } from '../request';
import type { FrontendSiteInfo } from '../../../types/frontend-api';
// 前台站点API基础路径
const FRONTEND_SITE_API = '/api/site';
/**
* 获取站点信息
*/
export function getSiteInfo() {
return request<FrontendSiteInfo>({
url: `${FRONTEND_SITE_API}/info`,
method: 'GET',
});
}
/**
* 获取站点配置
*/
export function getSiteConfig() {
return request<any>({
url: `${FRONTEND_SITE_API}/config`,
method: 'GET',
});
}
/**
* 获取站点公告
*/
export function getSiteAnnouncements(params: { page: number; limit: number }) {
return request<any>({
url: `${FRONTEND_SITE_API}/announcements`,
method: 'GET',
params,
});
}

View File

@@ -1 +1,3 @@
export * from './core';
export * from './frontend';
export * from './admin';

207
admin/src/types/admin-api.d.ts vendored Normal file
View File

@@ -0,0 +1,207 @@
/**
* 后台管理API类型定义
* 由OpenAPI自动生成请勿手动修改
* 生成命令: npm run openapi:gen:admin
*/
export interface AdminApiResponse<T = any> {
code: number;
message: string;
data: T;
timestamp: string;
path: string;
}
// 后台会员管理相关接口类型
export interface AdminMember {
memberId: number;
memberNo: string;
siteId: number;
username: string;
nickname: string;
avatar: string;
mobile: string;
email: string;
status: number;
levelId: number;
points: number;
balance: number;
createTime: string;
updateTime: string;
}
export interface AdminMemberLevel {
levelId: number;
siteId: number;
levelName: string;
levelIcon: string;
levelColor: string;
levelSort: number;
levelStatus: number;
levelDescription: string;
levelCondition: number;
levelDiscount: number;
levelPoints: number;
createTime: string;
updateTime: string;
}
export interface AdminMemberQuery {
page: number;
limit: number;
keyword?: string;
status?: number;
levelId?: number;
startTime?: string;
endTime?: string;
}
export interface AdminMemberCreate {
username: string;
nickname: string;
mobile: string;
email: string;
password: string;
levelId: number;
status: number;
}
export interface AdminMemberUpdate {
nickname?: string;
avatar?: string;
mobile?: string;
email?: string;
levelId?: number;
status?: number;
}
// 后台站点管理相关接口类型
export interface AdminSite {
siteId: number;
siteName: string;
siteLogo: string;
siteFavicon: string;
siteDescription: string;
siteKeywords: string;
siteCopyright: string;
siteIcp: string;
siteStatus: number;
siteType: number;
siteDomain: string;
siteEmail: string;
sitePhone: string;
siteAddress: string;
createTime: string;
updateTime: string;
}
export interface AdminSiteCreate {
siteName: string;
siteLogo: string;
siteFavicon: string;
siteDescription: string;
siteKeywords: string;
siteCopyright: string;
siteIcp: string;
siteType: number;
siteDomain: string;
siteEmail: string;
sitePhone: string;
siteAddress: string;
}
export interface AdminSiteUpdate {
siteName?: string;
siteLogo?: string;
siteFavicon?: string;
siteDescription?: string;
siteKeywords?: string;
siteCopyright?: string;
siteIcp?: string;
siteType?: number;
siteDomain?: string;
siteEmail?: string;
sitePhone?: string;
siteAddress?: string;
siteStatus?: number;
}
// 后台菜单管理相关接口类型
export interface AdminMenu {
menuId: number;
siteId: number;
menuName: string;
menuUrl: string;
menuIcon: string;
parentId: number;
sort: number;
status: number;
menuType: number;
menuTarget: string;
menuPermission: string;
createTime: string;
updateTime: string;
children?: AdminMenu[];
}
export interface AdminMenuCreate {
menuName: string;
menuUrl: string;
menuIcon: string;
parentId: number;
sort: number;
status: number;
menuType: number;
menuTarget: string;
menuPermission: string;
}
export interface AdminMenuUpdate {
menuName?: string;
menuUrl?: string;
menuIcon?: string;
parentId?: number;
sort?: number;
status?: number;
menuType?: number;
menuTarget?: string;
menuPermission?: string;
}
// 后台角色管理相关接口类型
export interface AdminRole {
roleId: number;
siteId: number;
roleName: string;
roleDescription: string;
roleStatus: number;
roleSort: number;
rolePermissions: string[];
createTime: string;
updateTime: string;
}
export interface AdminRoleCreate {
roleName: string;
roleDescription: string;
roleStatus: number;
roleSort: number;
rolePermissions: string[];
}
export interface AdminRoleUpdate {
roleName?: string;
roleDescription?: string;
roleStatus?: number;
roleSort?: number;
rolePermissions?: string[];
}
// 分页响应类型
export interface PaginatedResult<T> {
items: T[];
total: number;
page: number;
limit: number;
totalPages: number;
}

70
admin/src/types/frontend-api.d.ts vendored Normal file
View File

@@ -0,0 +1,70 @@
/**
* 前台API类型定义
* 由OpenAPI自动生成请勿手动修改
* 生成命令: npm run openapi:gen:frontend
*/
export interface FrontendApiResponse<T = any> {
code: number;
message: string;
data: T;
timestamp: string;
path: string;
}
// 前台会员相关接口类型
export interface FrontendMemberProfile {
memberId: number;
memberNo: string;
username: string;
nickname: string;
avatar: string;
mobile: string;
email: string;
status: number;
levelId: number;
points: number;
balance: number;
createTime: string;
}
export interface FrontendMemberSignResult {
success: boolean;
message: string;
points: number;
signDate: string;
}
// 前台站点相关接口类型
export interface FrontendSiteInfo {
siteId: number;
siteName: string;
siteLogo: string;
siteFavicon: string;
siteDescription: string;
siteKeywords: string;
siteCopyright: string;
siteIcp: string;
siteStatus: number;
}
// 前台菜单相关接口类型
export interface FrontendMenu {
menuId: number;
menuName: string;
menuUrl: string;
menuIcon: string;
parentId: number;
sort: number;
status: number;
children?: FrontendMenu[];
}
// 前台角色相关接口类型
export interface FrontendRole {
roleId: number;
roleName: string;
roleDescription: string;
status: number;
permissions: string[];
}