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:
118
admin/apps/web-ele/src/api/README.md
Normal file
118
admin/apps/web-ele/src/api/README.md
Normal 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编写测试用例
|
||||
5
admin/apps/web-ele/src/api/admin/index.ts
Normal file
5
admin/apps/web-ele/src/api/admin/index.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
/**
|
||||
* 后台管理API统一导出
|
||||
*/
|
||||
|
||||
export * from './member';
|
||||
102
admin/apps/web-ele/src/api/admin/member.ts
Normal file
102
admin/apps/web-ele/src/api/admin/member.ts
Normal 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 },
|
||||
});
|
||||
}
|
||||
6
admin/apps/web-ele/src/api/frontend/index.ts
Normal file
6
admin/apps/web-ele/src/api/frontend/index.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
/**
|
||||
* 前台API统一导出
|
||||
*/
|
||||
|
||||
export * from './member';
|
||||
export * from './site';
|
||||
62
admin/apps/web-ele/src/api/frontend/member.ts
Normal file
62
admin/apps/web-ele/src/api/frontend/member.ts
Normal 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,
|
||||
});
|
||||
}
|
||||
41
admin/apps/web-ele/src/api/frontend/site.ts
Normal file
41
admin/apps/web-ele/src/api/frontend/site.ts
Normal 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,
|
||||
});
|
||||
}
|
||||
@@ -1 +1,3 @@
|
||||
export * from './core';
|
||||
export * from './frontend';
|
||||
export * from './admin';
|
||||
|
||||
207
admin/src/types/admin-api.d.ts
vendored
Normal file
207
admin/src/types/admin-api.d.ts
vendored
Normal 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
70
admin/src/types/frontend-api.d.ts
vendored
Normal 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[];
|
||||
}
|
||||
Reference in New Issue
Block a user