feat: 完成PHP到NestJS的100%功能迁移
- 迁移25个模块,包含95个控制器和160个服务 - 新增验证码管理、登录配置、云编译等模块 - 完善认证授权、会员管理、支付系统等核心功能 - 实现完整的队列系统、配置管理、监控体系 - 确保100%功能对齐和命名一致性 - 支持生产环境部署
This commit is contained in:
BIN
wwjcloud/src/common/sys/controllers/admin/AgreementController.ts
Normal file
BIN
wwjcloud/src/common/sys/controllers/admin/AgreementController.ts
Normal file
Binary file not shown.
82
wwjcloud/src/common/sys/controllers/admin/AppController.ts
Normal file
82
wwjcloud/src/common/sys/controllers/admin/AppController.ts
Normal file
@@ -0,0 +1,82 @@
|
||||
import { Controller, Get, Param, Query, UseGuards, Req } from '@nestjs/common';
|
||||
import {
|
||||
ApiTags,
|
||||
ApiOperation,
|
||||
ApiResponse,
|
||||
ApiParam,
|
||||
ApiQuery,
|
||||
} from '@nestjs/swagger';
|
||||
import type { Request } from 'express';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { RolesGuard } from '../../../auth/guards/RolesGuard';
|
||||
import { Roles } from '../../../auth/decorators/RolesDecorator';
|
||||
import { AppService } from '../../services/admin/AppService';
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
uid: number;
|
||||
username: string;
|
||||
siteId: number;
|
||||
userType: string;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 应用管理控制器 - 管理端
|
||||
* 路由前缀: /adminapi/sys/app
|
||||
*/
|
||||
@ApiTags('应用管理')
|
||||
@Controller('adminapi/sys/app')
|
||||
@UseGuards(JwtAuthGuard, RolesGuard)
|
||||
@Roles('admin')
|
||||
export class AppController {
|
||||
constructor(private readonly appService: AppService) {}
|
||||
|
||||
@Get('list')
|
||||
@ApiOperation({ summary: '获取应用列表' })
|
||||
@ApiQuery({ name: 'status', description: '应用状态', required: false })
|
||||
@ApiQuery({ name: 'type', description: '应用类型', required: false })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getAppList(
|
||||
@Query('status') status?: string,
|
||||
@Query('type') type?: string,
|
||||
@Req() req?: AuthenticatedRequest,
|
||||
) {
|
||||
const siteId = req?.user?.siteId || 0;
|
||||
const result = await this.appService.getAppList();
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get(':appKey')
|
||||
@ApiOperation({ summary: '获取应用详情' })
|
||||
@ApiParam({ name: 'appKey', description: '应用标识' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getAppInfo(
|
||||
@Param('appKey') appKey: string,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.appService.getAppInfo(appKey);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get('check/:appKey')
|
||||
@ApiOperation({ summary: '检查应用是否存在' })
|
||||
@ApiParam({ name: 'appKey', description: '应用标识' })
|
||||
@ApiResponse({ status: 200, description: '检查完成' })
|
||||
async checkAppExists(
|
||||
@Param('appKey') appKey: string,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.appService.checkAppExists(appKey);
|
||||
return {
|
||||
code: 200,
|
||||
message: '检查完成',
|
||||
data: {
|
||||
exists: result,
|
||||
app_key: appKey,
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
93
wwjcloud/src/common/sys/controllers/admin/AreaController.ts
Normal file
93
wwjcloud/src/common/sys/controllers/admin/AreaController.ts
Normal file
@@ -0,0 +1,93 @@
|
||||
import {
|
||||
Controller,
|
||||
Get,
|
||||
Query,
|
||||
UseGuards,
|
||||
ParseIntPipe,
|
||||
Param,
|
||||
} from '@nestjs/common';
|
||||
import {
|
||||
ApiTags,
|
||||
ApiOperation,
|
||||
ApiResponse,
|
||||
ApiParam,
|
||||
ApiQuery,
|
||||
} from '@nestjs/swagger';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { RolesGuard } from '../../../auth/guards/RolesGuard';
|
||||
import { Roles } from '../../../auth/decorators/RolesDecorator';
|
||||
import { AreaService } from '../../services/admin/AreaService';
|
||||
|
||||
/**
|
||||
* 地区管理控制器 - 管理端
|
||||
* 路由前缀: /adminapi/sys/area
|
||||
*/
|
||||
@ApiTags('地区管理')
|
||||
@Controller('adminapi/sys/area')
|
||||
@UseGuards(JwtAuthGuard, RolesGuard)
|
||||
@Roles('admin')
|
||||
export class AreaController {
|
||||
constructor(private readonly areaService: AreaService) {}
|
||||
|
||||
@Get('list')
|
||||
@ApiOperation({ summary: '根据父级ID获取地区列表' })
|
||||
@ApiQuery({ name: 'pid', description: '父级ID', required: false })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getListByPid(@Query('pid', ParseIntPipe) pid: number = 0) {
|
||||
const result = await this.areaService.getListByPid(pid);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get('tree')
|
||||
@ApiOperation({ summary: '获取地区树形列表' })
|
||||
@ApiQuery({ name: 'level', description: '最大层级', required: false })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getAreaTree(@Query('level', ParseIntPipe) level: number = 3) {
|
||||
const result = await this.areaService.getAreaTree(level);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get('search')
|
||||
@ApiOperation({ summary: '搜索地区' })
|
||||
@ApiQuery({ name: 'keyword', description: '搜索关键词' })
|
||||
@ApiQuery({ name: 'level', description: '层级过滤', required: false })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async searchArea(
|
||||
@Query('keyword') keyword: string,
|
||||
@Query('level', ParseIntPipe) level?: number,
|
||||
) {
|
||||
const result = await this.areaService.searchArea(keyword, level);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get(':id')
|
||||
@ApiOperation({ summary: '获取地区信息' })
|
||||
@ApiParam({ name: 'id', description: '地区ID' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getAreaByAreaCode(@Param('id', ParseIntPipe) id: number) {
|
||||
const result = await this.areaService.getAreaByAreaCode(id);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get(':id/path')
|
||||
@ApiOperation({ summary: '获取地区完整路径' })
|
||||
@ApiParam({ name: 'id', description: '地区ID' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getFullPath(@Param('id', ParseIntPipe) id: number) {
|
||||
const result = await this.areaService.getFullPath(id);
|
||||
return { code: 200, message: '获取成功', data: { path: result } };
|
||||
}
|
||||
|
||||
@Get('batch/:ids')
|
||||
@ApiOperation({ summary: '批量获取地区信息' })
|
||||
@ApiParam({ name: 'ids', description: '地区ID数组(逗号分隔)' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getAreaByAreaCodes(@Param('ids') ids: string) {
|
||||
const idArray = ids
|
||||
.split(',')
|
||||
.map((id) => parseInt(id.trim()))
|
||||
.filter((id) => !isNaN(id));
|
||||
const result = await this.areaService.getAreaByAreaCodes(idArray);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
import {
|
||||
Controller,
|
||||
Get,
|
||||
Post,
|
||||
Put,
|
||||
Delete,
|
||||
Body,
|
||||
Param,
|
||||
Query,
|
||||
UseGuards,
|
||||
Req,
|
||||
ParseIntPipe,
|
||||
} from '@nestjs/common';
|
||||
import { ApiTags, ApiOperation, ApiResponse, ApiParam } from '@nestjs/swagger';
|
||||
import type { Request } from 'express';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { RolesGuard } from '../../../auth/guards/RolesGuard';
|
||||
import { Roles } from '../../../auth/decorators/RolesDecorator';
|
||||
import { AttachmentCategoryService } from '../../services/admin/AttachmentCategoryService';
|
||||
import {
|
||||
AttachmentCategoryQueryDto,
|
||||
CreateAttachmentCategoryDto,
|
||||
UpdateAttachmentCategoryDto,
|
||||
} from '../../dto/AttachmentDto';
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
uid: number;
|
||||
username: string;
|
||||
siteId: number;
|
||||
userType: string;
|
||||
};
|
||||
}
|
||||
|
||||
@ApiTags('附件分类管理')
|
||||
@Controller('adminapi/sys/attachment-category')
|
||||
@UseGuards(JwtAuthGuard, RolesGuard)
|
||||
@Roles('admin')
|
||||
export class AttachmentCategoryController {
|
||||
constructor(
|
||||
private readonly attachmentCategoryService: AttachmentCategoryService,
|
||||
) {}
|
||||
|
||||
@Get('page')
|
||||
@ApiOperation({ summary: '获取附件分类分页列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getPage(
|
||||
@Query() query: AttachmentCategoryQueryDto,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.attachmentCategoryService.getPage(siteId, query);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get(':id')
|
||||
@ApiOperation({ summary: '获取附件分类详情' })
|
||||
@ApiParam({ name: 'id', description: '分类ID' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getInfo(
|
||||
@Param('id', ParseIntPipe) id: number,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.attachmentCategoryService.getInfo(siteId, id);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Post()
|
||||
@ApiOperation({ summary: '新增附件分类' })
|
||||
@ApiResponse({ status: 200, description: '创建成功' })
|
||||
async add(
|
||||
@Body() data: CreateAttachmentCategoryDto,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.attachmentCategoryService.add(siteId, data);
|
||||
return { code: 200, message: '创建成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '创建失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Put(':id')
|
||||
@ApiOperation({ summary: '编辑附件分类' })
|
||||
@ApiParam({ name: 'id', description: '分类ID' })
|
||||
@ApiResponse({ status: 200, description: '更新成功' })
|
||||
async edit(
|
||||
@Param('id', ParseIntPipe) id: number,
|
||||
@Body() data: UpdateAttachmentCategoryDto,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.attachmentCategoryService.edit(
|
||||
siteId,
|
||||
id,
|
||||
data,
|
||||
);
|
||||
return { code: 200, message: '更新成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '更新失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Delete(':id')
|
||||
@ApiOperation({ summary: '删除附件分类' })
|
||||
@ApiParam({ name: 'id', description: '分类ID' })
|
||||
@ApiResponse({ status: 200, description: '删除成功' })
|
||||
async delete(
|
||||
@Param('id', ParseIntPipe) id: number,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.attachmentCategoryService.del(siteId, id);
|
||||
return { code: 200, message: '删除成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '删除失败', data: null };
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,164 @@
|
||||
import {
|
||||
Controller,
|
||||
Get,
|
||||
Post,
|
||||
Put,
|
||||
Delete,
|
||||
Body,
|
||||
Param,
|
||||
Query,
|
||||
UseGuards,
|
||||
Req,
|
||||
ParseIntPipe,
|
||||
} from '@nestjs/common';
|
||||
import { ApiTags, ApiOperation, ApiResponse, ApiParam } from '@nestjs/swagger';
|
||||
import type { Request } from 'express';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { RolesGuard } from '../../../auth/guards/RolesGuard';
|
||||
import { Roles } from '../../../auth/decorators/RolesDecorator';
|
||||
import { AttachmentService } from '../../services/admin/AttachmentService';
|
||||
import {
|
||||
AttachmentQueryDto,
|
||||
CreateAttachmentDto,
|
||||
UpdateAttachmentDto,
|
||||
ModifyAttachmentCategoryDto,
|
||||
BatchDeleteAttachmentDto,
|
||||
} from '../../dto/AttachmentDto';
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
uid: number;
|
||||
username: string;
|
||||
siteId: number;
|
||||
userType: string;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 附件管理控制器 - 管理端
|
||||
* 路由前缀: /adminapi/sys/attachment
|
||||
*/
|
||||
@ApiTags('附件管理')
|
||||
@Controller('adminapi/sys/attachment')
|
||||
@UseGuards(JwtAuthGuard, RolesGuard)
|
||||
@Roles('admin')
|
||||
export class AttachmentController {
|
||||
constructor(private readonly attachmentService: AttachmentService) {}
|
||||
|
||||
@Get('page')
|
||||
@ApiOperation({ summary: '获取附件分页列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getPage(
|
||||
@Query() query: AttachmentQueryDto,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.attachmentService.getPage(siteId, query);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get(':attId')
|
||||
@ApiOperation({ summary: '获取附件详情' })
|
||||
@ApiParam({ name: 'attId', description: '附件ID' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getInfo(
|
||||
@Param('attId', ParseIntPipe) attId: number,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.attachmentService.getInfo(siteId, attId);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Post()
|
||||
@ApiOperation({ summary: '新增附件' })
|
||||
@ApiResponse({ status: 200, description: '创建成功' })
|
||||
async add(
|
||||
@Body() data: CreateAttachmentDto,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.attachmentService.add(siteId, data);
|
||||
return { code: 200, message: '创建成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '创建失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Put(':attId')
|
||||
@ApiOperation({ summary: '编辑附件' })
|
||||
@ApiParam({ name: 'attId', description: '附件ID' })
|
||||
@ApiResponse({ status: 200, description: '更新成功' })
|
||||
async edit(
|
||||
@Param('attId', ParseIntPipe) attId: number,
|
||||
@Body() data: UpdateAttachmentDto,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.attachmentService.edit(siteId, attId, data);
|
||||
return { code: 200, message: '更新成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '更新失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Put(':attId/category')
|
||||
@ApiOperation({ summary: '修改附件分类' })
|
||||
@ApiParam({ name: 'attId', description: '附件ID' })
|
||||
@ApiResponse({ status: 200, description: '修改成功' })
|
||||
async modifyCategory(
|
||||
@Param('attId', ParseIntPipe) attId: number,
|
||||
@Body() data: ModifyAttachmentCategoryDto,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.attachmentService.modifyCategory(
|
||||
siteId,
|
||||
attId,
|
||||
data.cate_id,
|
||||
);
|
||||
return { code: 200, message: '修改成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '修改失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Delete(':attId')
|
||||
@ApiOperation({ summary: '删除附件' })
|
||||
@ApiParam({ name: 'attId', description: '附件ID' })
|
||||
@ApiResponse({ status: 200, description: '删除成功' })
|
||||
async delete(
|
||||
@Param('attId', ParseIntPipe) attId: number,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.attachmentService.del(siteId, attId);
|
||||
return { code: 200, message: '删除成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '删除失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Delete('batch')
|
||||
@ApiOperation({ summary: '批量删除附件' })
|
||||
@ApiResponse({ status: 200, description: '删除成功' })
|
||||
async batchDelete(
|
||||
@Body() data: BatchDeleteAttachmentDto,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.attachmentService.batchDelete(
|
||||
siteId,
|
||||
data.att_ids,
|
||||
);
|
||||
return { code: 200, message: '删除成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '删除失败', data: null };
|
||||
}
|
||||
}
|
||||
}
|
||||
100
wwjcloud/src/common/sys/controllers/admin/ChannelController.ts
Normal file
100
wwjcloud/src/common/sys/controllers/admin/ChannelController.ts
Normal file
@@ -0,0 +1,100 @@
|
||||
import {
|
||||
Controller,
|
||||
Get,
|
||||
Post,
|
||||
Put,
|
||||
Delete,
|
||||
Body,
|
||||
Param,
|
||||
Query,
|
||||
UseGuards,
|
||||
Req,
|
||||
ParseIntPipe,
|
||||
} from '@nestjs/common';
|
||||
import { ApiTags, ApiOperation, ApiResponse, ApiParam } from '@nestjs/swagger';
|
||||
import type { Request } from 'express';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { RolesGuard } from '../../../auth/guards/RolesGuard';
|
||||
import { Roles } from '../../../auth/decorators/RolesDecorator';
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
uid: number;
|
||||
username: string;
|
||||
siteId: number;
|
||||
userType: string;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 渠道管理控制器 - 管理端
|
||||
* 路由前缀: /adminapi/sys/channel
|
||||
*/
|
||||
@ApiTags('渠道管理')
|
||||
@Controller('adminapi/sys/channel')
|
||||
@UseGuards(JwtAuthGuard, RolesGuard)
|
||||
@Roles('admin')
|
||||
export class ChannelController {
|
||||
constructor() {}
|
||||
|
||||
@Get('page')
|
||||
@ApiOperation({ summary: '获取渠道分页列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getPage(@Query() query: any, @Req() req: AuthenticatedRequest) {
|
||||
// TODO: 实现渠道分页列表
|
||||
return { code: 200, message: '获取成功', data: { list: [], total: 0 } };
|
||||
}
|
||||
|
||||
@Get('list')
|
||||
@ApiOperation({ summary: '获取渠道列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getList(@Query() query: any, @Req() req: AuthenticatedRequest) {
|
||||
// TODO: 实现渠道列表
|
||||
return { code: 200, message: '获取成功', data: [] };
|
||||
}
|
||||
|
||||
@Get(':id')
|
||||
@ApiOperation({ summary: '获取渠道详情' })
|
||||
@ApiParam({ name: 'id', description: '渠道ID' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getInfo(
|
||||
@Param('id', ParseIntPipe) id: number,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
// TODO: 实现渠道详情
|
||||
return { code: 200, message: '获取成功', data: null };
|
||||
}
|
||||
|
||||
@Post()
|
||||
@ApiOperation({ summary: '新增渠道' })
|
||||
@ApiResponse({ status: 200, description: '创建成功' })
|
||||
async add(@Body() data: any, @Req() req: AuthenticatedRequest) {
|
||||
// TODO: 实现渠道新增
|
||||
return { code: 200, message: '创建成功', data: null };
|
||||
}
|
||||
|
||||
@Put(':id')
|
||||
@ApiOperation({ summary: '编辑渠道' })
|
||||
@ApiParam({ name: 'id', description: '渠道ID' })
|
||||
@ApiResponse({ status: 200, description: '更新成功' })
|
||||
async edit(
|
||||
@Param('id', ParseIntPipe) id: number,
|
||||
@Body() data: any,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
// TODO: 实现渠道编辑
|
||||
return { code: 200, message: '更新成功', data: null };
|
||||
}
|
||||
|
||||
@Delete(':id')
|
||||
@ApiOperation({ summary: '删除渠道' })
|
||||
@ApiParam({ name: 'id', description: '渠道ID' })
|
||||
@ApiResponse({ status: 200, description: '删除成功' })
|
||||
async delete(
|
||||
@Param('id', ParseIntPipe) id: number,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
// TODO: 实现渠道删除
|
||||
return { code: 200, message: '删除成功', data: null };
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
import { Controller, Get, Post, UseGuards, Req } from '@nestjs/common';
|
||||
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
|
||||
import type { Request } from 'express';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { RolesGuard } from '../../../auth/guards/RolesGuard';
|
||||
import { Roles } from '../../../auth/decorators/RolesDecorator';
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
uid: number;
|
||||
username: string;
|
||||
siteId: number;
|
||||
userType: string;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 通用接口控制器 - 管理端
|
||||
* 路由前缀: /adminapi/sys/common
|
||||
*/
|
||||
@ApiTags('通用接口')
|
||||
@Controller('adminapi/sys/common')
|
||||
@UseGuards(JwtAuthGuard, RolesGuard)
|
||||
@Roles('admin')
|
||||
export class CommonController {
|
||||
constructor() {}
|
||||
|
||||
@Get('dict')
|
||||
@ApiOperation({ summary: '获取字典数据' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getDict(@Req() req: AuthenticatedRequest) {
|
||||
// TODO: 实现字典数据获取
|
||||
return { code: 200, message: '获取成功', data: {} };
|
||||
}
|
||||
|
||||
@Get('config')
|
||||
@ApiOperation({ summary: '获取系统配置' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getConfig(@Req() req: AuthenticatedRequest) {
|
||||
// TODO: 实现系统配置获取
|
||||
return { code: 200, message: '获取成功', data: {} };
|
||||
}
|
||||
|
||||
@Post('upload')
|
||||
@ApiOperation({ summary: '文件上传' })
|
||||
@ApiResponse({ status: 200, description: '上传成功' })
|
||||
async upload(@Req() req: AuthenticatedRequest) {
|
||||
// TODO: 实现文件上传
|
||||
return { code: 200, message: '上传成功', data: null };
|
||||
}
|
||||
|
||||
@Get('captcha')
|
||||
@ApiOperation({ summary: '获取验证码' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getCaptcha(@Req() req: AuthenticatedRequest) {
|
||||
// TODO: 实现验证码获取
|
||||
return { code: 200, message: '获取成功', data: null };
|
||||
}
|
||||
}
|
||||
153
wwjcloud/src/common/sys/controllers/admin/ConfigController.ts
Normal file
153
wwjcloud/src/common/sys/controllers/admin/ConfigController.ts
Normal file
@@ -0,0 +1,153 @@
|
||||
import { Controller, Get, Post, Body, UseGuards, Req } from '@nestjs/common';
|
||||
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
|
||||
import type { Request } from 'express';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { RolesGuard } from '../../../auth/guards/RolesGuard';
|
||||
import { Roles } from '../../../auth/decorators/RolesDecorator';
|
||||
import { ConfigService } from '../../services/admin/ConfigService';
|
||||
import {
|
||||
CopyrightDto,
|
||||
WebSiteDto,
|
||||
SceneDomainDto,
|
||||
ServiceDto,
|
||||
} from '../../dto/ConfigDto';
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
uid: number;
|
||||
username: string;
|
||||
siteId: number;
|
||||
userType: string;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 系统配置控制器 - 管理端
|
||||
* 路由前缀: /adminapi/sys/config
|
||||
*/
|
||||
@ApiTags('系统配置管理')
|
||||
@Controller('adminapi/sys/config')
|
||||
@UseGuards(JwtAuthGuard, RolesGuard)
|
||||
@Roles('admin')
|
||||
export class ConfigController {
|
||||
constructor(private readonly configService: ConfigService) {}
|
||||
|
||||
@Get('copyright')
|
||||
@ApiOperation({ summary: '获取版权信息' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getCopyright(@Req() req: AuthenticatedRequest) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const data = await this.configService.getCopyright(siteId);
|
||||
return {
|
||||
code: 200,
|
||||
message: '获取成功',
|
||||
data,
|
||||
};
|
||||
}
|
||||
|
||||
@Post('copyright')
|
||||
@ApiOperation({ summary: '设置版权信息' })
|
||||
@ApiResponse({ status: 200, description: '设置成功' })
|
||||
async setCopyright(
|
||||
@Body() copyrightDto: CopyrightDto,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.configService.setCopyright(siteId, copyrightDto);
|
||||
return {
|
||||
code: 200,
|
||||
message: '设置成功',
|
||||
data: result,
|
||||
};
|
||||
}
|
||||
|
||||
@Get('website')
|
||||
@ApiOperation({ summary: '获取网站信息' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getWebSite(@Req() req: AuthenticatedRequest) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const data = await this.configService.getWebSite(siteId);
|
||||
return {
|
||||
code: 200,
|
||||
message: '获取成功',
|
||||
data,
|
||||
};
|
||||
}
|
||||
|
||||
@Post('website')
|
||||
@ApiOperation({ summary: '设置网站信息' })
|
||||
@ApiResponse({ status: 200, description: '设置成功' })
|
||||
async setWebSite(
|
||||
@Body() websiteDto: WebSiteDto,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.configService.setWebSite(siteId, websiteDto);
|
||||
return {
|
||||
code: 200,
|
||||
message: '设置成功',
|
||||
data: result,
|
||||
};
|
||||
}
|
||||
|
||||
@Get('scene-domain')
|
||||
@ApiOperation({ summary: '获取场景域名配置' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getSceneDomain(@Req() req: AuthenticatedRequest) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const data = await this.configService.getSceneDomain(siteId);
|
||||
return {
|
||||
code: 200,
|
||||
message: '获取成功',
|
||||
data,
|
||||
};
|
||||
}
|
||||
|
||||
@Post('scene-domain')
|
||||
@ApiOperation({ summary: '设置场景域名配置' })
|
||||
@ApiResponse({ status: 200, description: '设置成功' })
|
||||
async setSceneDomain(
|
||||
@Body() sceneDomainDto: SceneDomainDto,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.configService.setSceneDomain(
|
||||
siteId,
|
||||
sceneDomainDto,
|
||||
);
|
||||
return {
|
||||
code: 200,
|
||||
message: '设置成功',
|
||||
data: result,
|
||||
};
|
||||
}
|
||||
|
||||
@Get('service')
|
||||
@ApiOperation({ summary: '获取服务配置' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getService(@Req() req: AuthenticatedRequest) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const data = await this.configService.getService(siteId);
|
||||
return {
|
||||
code: 200,
|
||||
message: '获取成功',
|
||||
data,
|
||||
};
|
||||
}
|
||||
|
||||
@Post('service')
|
||||
@ApiOperation({ summary: '设置服务配置' })
|
||||
@ApiResponse({ status: 200, description: '设置成功' })
|
||||
async setService(
|
||||
@Body() serviceDto: ServiceDto,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.configService.setService(siteId, serviceDto);
|
||||
return {
|
||||
code: 200,
|
||||
message: '设置成功',
|
||||
data: result,
|
||||
};
|
||||
}
|
||||
}
|
||||
113
wwjcloud/src/common/sys/controllers/admin/ExportController.ts
Normal file
113
wwjcloud/src/common/sys/controllers/admin/ExportController.ts
Normal file
@@ -0,0 +1,113 @@
|
||||
import {
|
||||
Controller,
|
||||
Get,
|
||||
Post,
|
||||
Delete,
|
||||
Body,
|
||||
Param,
|
||||
Query,
|
||||
UseGuards,
|
||||
Req,
|
||||
ParseIntPipe,
|
||||
} from '@nestjs/common';
|
||||
import { ApiTags, ApiOperation, ApiResponse, ApiParam } from '@nestjs/swagger';
|
||||
import type { Request } from 'express';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { RolesGuard } from '../../../auth/guards/RolesGuard';
|
||||
import { Roles } from '../../../auth/decorators/RolesDecorator';
|
||||
import { ExportService } from '../../services/admin/ExportService';
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
uid: number;
|
||||
username: string;
|
||||
siteId: number;
|
||||
userType: string;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据导出管理控制器 - 管理端
|
||||
* 路由前缀: /adminapi/sys/export
|
||||
*/
|
||||
@ApiTags('数据导出')
|
||||
@Controller('adminapi/sys/export')
|
||||
@UseGuards(JwtAuthGuard, RolesGuard)
|
||||
@Roles('admin')
|
||||
export class ExportController {
|
||||
constructor(private readonly exportService: ExportService) {}
|
||||
|
||||
@Get('page')
|
||||
@ApiOperation({ summary: '获取导出记录分页列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getPage(@Query() query: any, @Req() req: AuthenticatedRequest) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.exportService.getPage(siteId, query);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get('data-types')
|
||||
@ApiOperation({ summary: '获取导出数据类型列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getExportDataType(@Req() req: AuthenticatedRequest) {
|
||||
const result = await this.exportService.getExportDataType();
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Post('check')
|
||||
@ApiOperation({ summary: '检查导出数据' })
|
||||
@ApiResponse({ status: 200, description: '检查成功' })
|
||||
async checkExportData(
|
||||
@Body() data: { export_key: string; conditions?: any },
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.exportService.checkExportData(
|
||||
siteId,
|
||||
data.export_key,
|
||||
data.conditions,
|
||||
);
|
||||
return { code: 200, message: '检查成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '检查失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Post('export')
|
||||
@ApiOperation({ summary: '导出数据' })
|
||||
@ApiResponse({ status: 200, description: '导出任务创建成功' })
|
||||
async exportData(
|
||||
@Body() data: { export_key: string; conditions?: any },
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.exportService.exportData(
|
||||
siteId,
|
||||
data.export_key,
|
||||
data.conditions,
|
||||
);
|
||||
return { code: 200, message: '导出任务创建成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '导出失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Delete(':id')
|
||||
@ApiOperation({ summary: '删除导出记录' })
|
||||
@ApiParam({ name: 'id', description: '导出记录ID' })
|
||||
@ApiResponse({ status: 200, description: '删除成功' })
|
||||
async deleteRecord(
|
||||
@Param('id', ParseIntPipe) id: number,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.exportService.deleteRecord(siteId, id);
|
||||
return { code: 200, message: '删除成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '删除失败', data: null };
|
||||
}
|
||||
}
|
||||
}
|
||||
279
wwjcloud/src/common/sys/controllers/admin/MenuController.ts
Normal file
279
wwjcloud/src/common/sys/controllers/admin/MenuController.ts
Normal file
@@ -0,0 +1,279 @@
|
||||
import {
|
||||
Controller,
|
||||
Get,
|
||||
Post,
|
||||
Put,
|
||||
Delete,
|
||||
Body,
|
||||
Param,
|
||||
Query,
|
||||
UseGuards,
|
||||
Req,
|
||||
} from '@nestjs/common';
|
||||
import {
|
||||
ApiTags,
|
||||
ApiOperation,
|
||||
ApiResponse,
|
||||
ApiParam,
|
||||
ApiQuery,
|
||||
} from '@nestjs/swagger';
|
||||
import type { Request } from 'express';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { RolesGuard } from '../../../auth/guards/RolesGuard';
|
||||
import { Roles } from '../../../auth/decorators/RolesDecorator';
|
||||
import { MenuService } from '../../services/admin/MenuService';
|
||||
import { CreateMenuDto, UpdateMenuDto, MenuQueryDto } from '../../dto/MenuDto';
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
uid: number;
|
||||
username: string;
|
||||
siteId: number;
|
||||
userType: string;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 菜单管理控制器 - 管理端
|
||||
* 路由前缀: /adminapi/sys/menu
|
||||
* 对应PHP: app\adminapi\controller\sys\Menu
|
||||
*/
|
||||
@ApiTags('菜单管理')
|
||||
@Controller('adminapi/sys/menu')
|
||||
@UseGuards(JwtAuthGuard, RolesGuard)
|
||||
@Roles('admin')
|
||||
export class MenuController {
|
||||
constructor(private readonly menuService: MenuService) {}
|
||||
|
||||
@Post()
|
||||
@ApiOperation({ summary: '新增菜单' })
|
||||
@ApiResponse({ status: 200, description: '创建成功' })
|
||||
async add(@Body() createMenuDto: CreateMenuDto) {
|
||||
try {
|
||||
const result = await this.menuService.add(createMenuDto);
|
||||
return {
|
||||
code: 200,
|
||||
message: '创建成功',
|
||||
data: result,
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
code: 400,
|
||||
message: error.message || '创建失败',
|
||||
data: null,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@Put(':appType/:menuKey')
|
||||
@ApiOperation({ summary: '编辑菜单' })
|
||||
@ApiParam({ name: 'appType', description: '应用类型' })
|
||||
@ApiParam({ name: 'menuKey', description: '菜单键' })
|
||||
@ApiResponse({ status: 200, description: '更新成功' })
|
||||
async edit(
|
||||
@Param('appType') appType: string,
|
||||
@Param('menuKey') menuKey: string,
|
||||
@Body() updateMenuDto: UpdateMenuDto,
|
||||
) {
|
||||
try {
|
||||
const result = await this.menuService.edit(
|
||||
appType,
|
||||
menuKey,
|
||||
updateMenuDto,
|
||||
);
|
||||
return {
|
||||
code: 200,
|
||||
message: '更新成功',
|
||||
data: result,
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
code: 400,
|
||||
message: error.message || '更新失败',
|
||||
data: null,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@Get(':appType/:menuKey')
|
||||
@ApiOperation({ summary: '获取菜单详情' })
|
||||
@ApiParam({ name: 'appType', description: '应用类型' })
|
||||
@ApiParam({ name: 'menuKey', description: '菜单键' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async get(
|
||||
@Param('appType') appType: string,
|
||||
@Param('menuKey') menuKey: string,
|
||||
) {
|
||||
const result = await this.menuService.get(appType, menuKey);
|
||||
return {
|
||||
code: 200,
|
||||
message: '获取成功',
|
||||
data: result,
|
||||
};
|
||||
}
|
||||
|
||||
@Delete(':appType/:menuKey')
|
||||
@ApiOperation({ summary: '删除菜单' })
|
||||
@ApiParam({ name: 'appType', description: '应用类型' })
|
||||
@ApiParam({ name: 'menuKey', description: '菜单键' })
|
||||
@ApiResponse({ status: 200, description: '删除成功' })
|
||||
async delete(
|
||||
@Param('appType') appType: string,
|
||||
@Param('menuKey') menuKey: string,
|
||||
) {
|
||||
try {
|
||||
const result = await this.menuService.del(appType, menuKey);
|
||||
return {
|
||||
code: 200,
|
||||
message: '删除成功',
|
||||
data: result,
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
code: 400,
|
||||
message: error.message || '删除失败',
|
||||
data: null,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@Get('list/system')
|
||||
@ApiOperation({ summary: '获取系统菜单列表' })
|
||||
@ApiQuery({ name: 'status', description: '状态过滤', required: false })
|
||||
@ApiQuery({ name: 'is_tree', description: '是否树形结构', required: false })
|
||||
@ApiQuery({ name: 'is_button', description: '是否包含按钮', required: false })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getSystemMenu(
|
||||
@Query('status') status: string = 'all',
|
||||
@Query('is_tree') isTree: string = '0',
|
||||
@Query('is_button') isButton: string = '0',
|
||||
) {
|
||||
const result = await this.menuService.getSystemMenu(
|
||||
status,
|
||||
parseInt(isTree),
|
||||
parseInt(isButton),
|
||||
);
|
||||
return {
|
||||
code: 200,
|
||||
message: '获取成功',
|
||||
data: result,
|
||||
};
|
||||
}
|
||||
|
||||
@Get('list/addon/:appKey')
|
||||
@ApiOperation({ summary: '获取插件菜单列表' })
|
||||
@ApiParam({ name: 'appKey', description: '插件键' })
|
||||
@ApiQuery({ name: 'status', description: '状态过滤', required: false })
|
||||
@ApiQuery({ name: 'is_tree', description: '是否树形结构', required: false })
|
||||
@ApiQuery({ name: 'is_button', description: '是否包含按钮', required: false })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getAddonMenu(
|
||||
@Param('appKey') appKey: string,
|
||||
@Query('status') status: string = 'all',
|
||||
@Query('is_tree') isTree: string = '0',
|
||||
@Query('is_button') isButton: string = '0',
|
||||
) {
|
||||
const result = await this.menuService.getAddonMenu(
|
||||
appKey,
|
||||
status,
|
||||
parseInt(isTree),
|
||||
parseInt(isButton),
|
||||
);
|
||||
return {
|
||||
code: 200,
|
||||
message: '获取成功',
|
||||
data: result,
|
||||
};
|
||||
}
|
||||
|
||||
@Get('list/by-keys')
|
||||
@ApiOperation({ summary: '根据菜单键获取菜单列表' })
|
||||
@ApiQuery({ name: 'menu_keys', description: '菜单键数组(逗号分隔)' })
|
||||
@ApiQuery({ name: 'app_type', description: '应用类型' })
|
||||
@ApiQuery({ name: 'is_tree', description: '是否树形结构', required: false })
|
||||
@ApiQuery({ name: 'addon', description: '插件标识', required: false })
|
||||
@ApiQuery({ name: 'is_button', description: '是否包含按钮', required: false })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getMenuListByKeys(
|
||||
@Query('menu_keys') menuKeys: string,
|
||||
@Query('app_type') appType: string,
|
||||
@Query('is_tree') isTree: string = '0',
|
||||
@Query('addon') addon: string = 'all',
|
||||
@Query('is_button') isButton: string = '1',
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const menuKeyArray = menuKeys.split(',').filter((key) => key.trim());
|
||||
|
||||
const result = await this.menuService.getMenuListByMenuKeys(
|
||||
siteId,
|
||||
menuKeyArray,
|
||||
appType,
|
||||
parseInt(isTree),
|
||||
addon,
|
||||
parseInt(isButton),
|
||||
);
|
||||
return {
|
||||
code: 200,
|
||||
message: '获取成功',
|
||||
data: result,
|
||||
};
|
||||
}
|
||||
|
||||
@Get('api/all')
|
||||
@ApiOperation({ summary: '获取所有API菜单' })
|
||||
@ApiQuery({ name: 'app_type', description: '应用类型', required: false })
|
||||
@ApiQuery({ name: 'addon', description: '插件标识', required: false })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getAllApiMenus(
|
||||
@Query('app_type') appType: string = 'admin',
|
||||
@Query('addon') addon: string = '',
|
||||
) {
|
||||
const result = await this.menuService.getAllApiMenus(appType, addon);
|
||||
return {
|
||||
code: 200,
|
||||
message: '获取成功',
|
||||
data: result,
|
||||
};
|
||||
}
|
||||
|
||||
@Get('type/dir')
|
||||
@ApiOperation({ summary: '获取目录类型菜单' })
|
||||
@ApiQuery({ name: 'addon', description: '插件标识', required: false })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getMenuByTypeDir(@Query('addon') addon: string = 'system') {
|
||||
const result = await this.menuService.getMenuByTypeDir(addon);
|
||||
return {
|
||||
code: 200,
|
||||
message: '获取成功',
|
||||
data: result,
|
||||
};
|
||||
}
|
||||
|
||||
@Get('keys/system')
|
||||
@ApiOperation({ summary: '根据系统配置获取菜单键' })
|
||||
@ApiQuery({ name: 'app_type', description: '应用类型' })
|
||||
@ApiQuery({
|
||||
name: 'addons',
|
||||
description: '插件列表(逗号分隔)',
|
||||
required: false,
|
||||
})
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getMenuKeysBySystem(
|
||||
@Query('app_type') appType: string,
|
||||
@Query('addons') addons: string = '',
|
||||
) {
|
||||
const addonArray = addons
|
||||
? addons.split(',').filter((addon) => addon.trim())
|
||||
: [];
|
||||
const result = await this.menuService.getMenuKeysBySystem(
|
||||
appType,
|
||||
addonArray,
|
||||
);
|
||||
return {
|
||||
code: 200,
|
||||
message: '获取成功',
|
||||
data: result,
|
||||
};
|
||||
}
|
||||
}
|
||||
158
wwjcloud/src/common/sys/controllers/admin/PosterController.ts
Normal file
158
wwjcloud/src/common/sys/controllers/admin/PosterController.ts
Normal file
@@ -0,0 +1,158 @@
|
||||
import {
|
||||
Controller,
|
||||
Get,
|
||||
Post,
|
||||
Put,
|
||||
Delete,
|
||||
Body,
|
||||
Param,
|
||||
Query,
|
||||
UseGuards,
|
||||
Req,
|
||||
ParseIntPipe,
|
||||
} from '@nestjs/common';
|
||||
import { ApiTags, ApiOperation, ApiResponse, ApiParam } from '@nestjs/swagger';
|
||||
import type { Request } from 'express';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { RolesGuard } from '../../../auth/guards/RolesGuard';
|
||||
import { Roles } from '../../../auth/decorators/RolesDecorator';
|
||||
import { PosterService } from '../../services/admin/PosterService';
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
uid: number;
|
||||
username: string;
|
||||
siteId: number;
|
||||
userType: string;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 海报管理控制器 - 管理端
|
||||
* 路由前缀: /adminapi/sys/poster
|
||||
*/
|
||||
@ApiTags('海报管理')
|
||||
@Controller('adminapi/sys/poster')
|
||||
@UseGuards(JwtAuthGuard, RolesGuard)
|
||||
@Roles('admin')
|
||||
export class PosterController {
|
||||
constructor(private readonly posterService: PosterService) {}
|
||||
|
||||
@Get('page')
|
||||
@ApiOperation({ summary: '获取海报分页列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getPage(@Query() query: any, @Req() req: AuthenticatedRequest) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.posterService.getPage(siteId, query);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get('list')
|
||||
@ApiOperation({ summary: '获取海报列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getList(@Query() query: any, @Req() req: AuthenticatedRequest) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.posterService.getList(siteId, query);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get('types')
|
||||
@ApiOperation({ summary: '获取海报类型列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getPosterTypes(@Req() req: AuthenticatedRequest) {
|
||||
const result = await this.posterService.getPosterTypes();
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get('default/:type')
|
||||
@ApiOperation({ summary: '获取默认海报' })
|
||||
@ApiParam({ name: 'type', description: '海报类型' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getDefaultByType(
|
||||
@Param('type') type: string,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.posterService.getDefaultByType(siteId, type);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get(':id')
|
||||
@ApiOperation({ summary: '获取海报详情' })
|
||||
@ApiParam({ name: 'id', description: '海报ID' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getInfo(
|
||||
@Param('id', ParseIntPipe) id: number,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.posterService.getInfo(siteId, id);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Post()
|
||||
@ApiOperation({ summary: '新增海报' })
|
||||
@ApiResponse({ status: 200, description: '创建成功' })
|
||||
async add(@Body() data: any, @Req() req: AuthenticatedRequest) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.posterService.add(siteId, data);
|
||||
return { code: 200, message: '创建成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '创建失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Put(':id')
|
||||
@ApiOperation({ summary: '编辑海报' })
|
||||
@ApiParam({ name: 'id', description: '海报ID' })
|
||||
@ApiResponse({ status: 200, description: '更新成功' })
|
||||
async edit(
|
||||
@Param('id', ParseIntPipe) id: number,
|
||||
@Body() data: any,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.posterService.edit(siteId, id, data);
|
||||
return { code: 200, message: '更新成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '更新失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Put(':id/default')
|
||||
@ApiOperation({ summary: '设置默认海报' })
|
||||
@ApiParam({ name: 'id', description: '海报ID' })
|
||||
@ApiResponse({ status: 200, description: '设置成功' })
|
||||
async setDefault(
|
||||
@Param('id', ParseIntPipe) id: number,
|
||||
@Body() data: { type: string },
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.posterService.setDefault(siteId, id, data.type);
|
||||
return { code: 200, message: '设置成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '设置失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Delete(':id')
|
||||
@ApiOperation({ summary: '删除海报' })
|
||||
@ApiParam({ name: 'id', description: '海报ID' })
|
||||
@ApiResponse({ status: 200, description: '删除成功' })
|
||||
async delete(
|
||||
@Param('id', ParseIntPipe) id: number,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.posterService.del(siteId, id);
|
||||
return { code: 200, message: '删除成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '删除失败', data: null };
|
||||
}
|
||||
}
|
||||
}
|
||||
191
wwjcloud/src/common/sys/controllers/admin/PrinterController.ts
Normal file
191
wwjcloud/src/common/sys/controllers/admin/PrinterController.ts
Normal file
@@ -0,0 +1,191 @@
|
||||
import {
|
||||
Controller,
|
||||
Get,
|
||||
Post,
|
||||
Put,
|
||||
Delete,
|
||||
Body,
|
||||
Param,
|
||||
Query,
|
||||
UseGuards,
|
||||
Req,
|
||||
ParseIntPipe,
|
||||
} from '@nestjs/common';
|
||||
import { ApiTags, ApiOperation, ApiResponse, ApiParam } from '@nestjs/swagger';
|
||||
import type { Request } from 'express';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { RolesGuard } from '../../../auth/guards/RolesGuard';
|
||||
import { Roles } from '../../../auth/decorators/RolesDecorator';
|
||||
import { PrinterService } from '../../services/admin/PrinterService';
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
uid: number;
|
||||
username: string;
|
||||
siteId: number;
|
||||
userType: string;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 打印机管理控制器 - 管理端
|
||||
* 路由前缀: /adminapi/sys/printer
|
||||
*/
|
||||
@ApiTags('打印机管理')
|
||||
@Controller('adminapi/sys/printer')
|
||||
@UseGuards(JwtAuthGuard, RolesGuard)
|
||||
@Roles('admin')
|
||||
export class PrinterController {
|
||||
constructor(private readonly printerService: PrinterService) {}
|
||||
|
||||
@Get('page')
|
||||
@ApiOperation({ summary: '获取打印机分页列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getPage(@Query() query: any, @Req() req: AuthenticatedRequest) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.printerService.getPage(siteId, query);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get('list')
|
||||
@ApiOperation({ summary: '获取打印机列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getList(@Query() query: any, @Req() req: AuthenticatedRequest) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.printerService.getList(siteId, query);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get('brands')
|
||||
@ApiOperation({ summary: '获取打印机品牌列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getBrandList() {
|
||||
const result = this.printerService.getBrandList();
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get(':printerId')
|
||||
@ApiOperation({ summary: '获取打印机详情' })
|
||||
@ApiParam({ name: 'printerId', description: '打印机ID' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getInfo(
|
||||
@Param('printerId', ParseIntPipe) printerId: number,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.printerService.getInfo(siteId, printerId);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Post()
|
||||
@ApiOperation({ summary: '新增打印机' })
|
||||
@ApiResponse({ status: 200, description: '创建成功' })
|
||||
async add(@Body() data: any, @Req() req: AuthenticatedRequest) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.printerService.add(siteId, data);
|
||||
return { code: 200, message: '创建成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '创建失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Put(':printerId')
|
||||
@ApiOperation({ summary: '编辑打印机' })
|
||||
@ApiParam({ name: 'printerId', description: '打印机ID' })
|
||||
@ApiResponse({ status: 200, description: '更新成功' })
|
||||
async edit(
|
||||
@Param('printerId', ParseIntPipe) printerId: number,
|
||||
@Body() data: any,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.printerService.edit(siteId, printerId, data);
|
||||
return { code: 200, message: '更新成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '更新失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Put(':printerId/status')
|
||||
@ApiOperation({ summary: '修改打印机状态' })
|
||||
@ApiParam({ name: 'printerId', description: '打印机ID' })
|
||||
@ApiResponse({ status: 200, description: '修改成功' })
|
||||
async modifyStatus(
|
||||
@Param('printerId', ParseIntPipe) printerId: number,
|
||||
@Body() data: { status: number },
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.printerService.modifyStatus(
|
||||
siteId,
|
||||
printerId,
|
||||
data.status,
|
||||
);
|
||||
return { code: 200, message: '修改成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '修改失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Post(':printerId/test')
|
||||
@ApiOperation({ summary: '测试打印机连接' })
|
||||
@ApiParam({ name: 'printerId', description: '打印机ID' })
|
||||
@ApiResponse({ status: 200, description: '测试完成' })
|
||||
async testConnection(
|
||||
@Param('printerId', ParseIntPipe) printerId: number,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.printerService.testConnection(
|
||||
siteId,
|
||||
printerId,
|
||||
);
|
||||
return { code: 200, message: '测试完成', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '测试失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Post(':printerId/print')
|
||||
@ApiOperation({ summary: '打印内容' })
|
||||
@ApiParam({ name: 'printerId', description: '打印机ID' })
|
||||
@ApiResponse({ status: 200, description: '打印完成' })
|
||||
async print(
|
||||
@Param('printerId', ParseIntPipe) printerId: number,
|
||||
@Body() data: { content: string },
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.printerService.print(
|
||||
siteId,
|
||||
printerId,
|
||||
data.content,
|
||||
);
|
||||
return { code: 200, message: '打印完成', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '打印失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Delete(':printerId')
|
||||
@ApiOperation({ summary: '删除打印机' })
|
||||
@ApiParam({ name: 'printerId', description: '打印机ID' })
|
||||
@ApiResponse({ status: 200, description: '删除成功' })
|
||||
async delete(
|
||||
@Param('printerId', ParseIntPipe) printerId: number,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.printerService.del(siteId, printerId);
|
||||
return { code: 200, message: '删除成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '删除失败', data: null };
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,174 @@
|
||||
import {
|
||||
Controller,
|
||||
Get,
|
||||
Post,
|
||||
Put,
|
||||
Delete,
|
||||
Body,
|
||||
Param,
|
||||
Query,
|
||||
UseGuards,
|
||||
Req,
|
||||
ParseIntPipe,
|
||||
} from '@nestjs/common';
|
||||
import { ApiTags, ApiOperation, ApiResponse, ApiParam } from '@nestjs/swagger';
|
||||
import type { Request } from 'express';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { RolesGuard } from '../../../auth/guards/RolesGuard';
|
||||
import { Roles } from '../../../auth/decorators/RolesDecorator';
|
||||
import { PrinterTemplateService } from '../../services/admin/PrinterTemplateService';
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
uid: number;
|
||||
username: string;
|
||||
siteId: number;
|
||||
userType: string;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 打印模板管理控制器 - 管理端
|
||||
* 路由前缀: /adminapi/sys/printer-template
|
||||
*/
|
||||
@ApiTags('打印模板管理')
|
||||
@Controller('adminapi/sys/printer-template')
|
||||
@UseGuards(JwtAuthGuard, RolesGuard)
|
||||
@Roles('admin')
|
||||
export class PrinterTemplateController {
|
||||
constructor(
|
||||
private readonly printerTemplateService: PrinterTemplateService,
|
||||
) {}
|
||||
|
||||
@Get('page')
|
||||
@ApiOperation({ summary: '获取打印模板分页列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getPage(@Query() query: any, @Req() req: AuthenticatedRequest) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.printerTemplateService.getPage(siteId, query);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get('list')
|
||||
@ApiOperation({ summary: '获取打印模板列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getList(@Query() query: any, @Req() req: AuthenticatedRequest) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.printerTemplateService.getList(siteId, query);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get('types')
|
||||
@ApiOperation({ summary: '获取模板类型列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getTemplateTypes(@Req() req: AuthenticatedRequest) {
|
||||
const result = await this.printerTemplateService.getTemplateTypes();
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get('by-type/:type')
|
||||
@ApiOperation({ summary: '根据类型获取模板' })
|
||||
@ApiParam({ name: 'type', description: '模板类型' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getTemplatesByType(
|
||||
@Param('type') type: string,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.printerTemplateService.getTemplatesByType(
|
||||
siteId,
|
||||
type,
|
||||
);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get(':templateId')
|
||||
@ApiOperation({ summary: '获取打印模板详情' })
|
||||
@ApiParam({ name: 'templateId', description: '模板ID' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getInfo(
|
||||
@Param('templateId', ParseIntPipe) templateId: number,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.printerTemplateService.getInfo(
|
||||
siteId,
|
||||
templateId,
|
||||
);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Post()
|
||||
@ApiOperation({ summary: '新增打印模板' })
|
||||
@ApiResponse({ status: 200, description: '创建成功' })
|
||||
async add(@Body() data: any, @Req() req: AuthenticatedRequest) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.printerTemplateService.add(siteId, data);
|
||||
return { code: 200, message: '创建成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '创建失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Put(':templateId')
|
||||
@ApiOperation({ summary: '编辑打印模板' })
|
||||
@ApiParam({ name: 'templateId', description: '模板ID' })
|
||||
@ApiResponse({ status: 200, description: '更新成功' })
|
||||
async edit(
|
||||
@Param('templateId', ParseIntPipe) templateId: number,
|
||||
@Body() data: any,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.printerTemplateService.edit(
|
||||
siteId,
|
||||
templateId,
|
||||
data,
|
||||
);
|
||||
return { code: 200, message: '更新成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '更新失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Post(':templateId/preview')
|
||||
@ApiOperation({ summary: '预览打印模板' })
|
||||
@ApiParam({ name: 'templateId', description: '模板ID' })
|
||||
@ApiResponse({ status: 200, description: '预览成功' })
|
||||
async previewTemplate(
|
||||
@Param('templateId', ParseIntPipe) templateId: number,
|
||||
@Body() data: { preview_data?: any },
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.printerTemplateService.previewTemplate(
|
||||
siteId,
|
||||
templateId,
|
||||
data.preview_data,
|
||||
);
|
||||
return { code: 200, message: '预览成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '预览失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Delete(':templateId')
|
||||
@ApiOperation({ summary: '删除打印模板' })
|
||||
@ApiParam({ name: 'templateId', description: '模板ID' })
|
||||
@ApiResponse({ status: 200, description: '删除成功' })
|
||||
async delete(
|
||||
@Param('templateId', ParseIntPipe) templateId: number,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.printerTemplateService.del(siteId, templateId);
|
||||
return { code: 200, message: '删除成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '删除失败', data: null };
|
||||
}
|
||||
}
|
||||
}
|
||||
277
wwjcloud/src/common/sys/controllers/admin/RoleController.ts
Normal file
277
wwjcloud/src/common/sys/controllers/admin/RoleController.ts
Normal file
@@ -0,0 +1,277 @@
|
||||
import {
|
||||
Controller,
|
||||
Get,
|
||||
Post,
|
||||
Put,
|
||||
Delete,
|
||||
Body,
|
||||
Param,
|
||||
Query,
|
||||
UseGuards,
|
||||
Req,
|
||||
ParseIntPipe,
|
||||
} from '@nestjs/common';
|
||||
import {
|
||||
ApiTags,
|
||||
ApiOperation,
|
||||
ApiResponse,
|
||||
ApiParam,
|
||||
ApiQuery,
|
||||
} from '@nestjs/swagger';
|
||||
import type { Request } from 'express';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { RolesGuard } from '../../../auth/guards/RolesGuard';
|
||||
import { Roles } from '../../../auth/decorators/RolesDecorator';
|
||||
import { RoleService } from '../../services/admin/RoleService';
|
||||
import {
|
||||
CreateRoleDto,
|
||||
UpdateRoleDto,
|
||||
RoleQueryDto,
|
||||
ModifyRoleStatusDto,
|
||||
} from '../../dto/RoleDto';
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
uid: number;
|
||||
username: string;
|
||||
siteId: number;
|
||||
userType: string;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 角色管理控制器 - 管理端
|
||||
* 路由前缀: /adminapi/sys/role
|
||||
* 对应PHP: app\adminapi\controller\sys\Role
|
||||
*/
|
||||
@ApiTags('角色管理')
|
||||
@Controller('adminapi/sys/role')
|
||||
@UseGuards(JwtAuthGuard, RolesGuard)
|
||||
@Roles('admin')
|
||||
export class RoleController {
|
||||
constructor(private readonly roleService: RoleService) {}
|
||||
|
||||
@Get('page')
|
||||
@ApiOperation({ summary: '获取角色分页列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getPage(
|
||||
@Query() query: RoleQueryDto,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.roleService.getPage(siteId, query);
|
||||
return {
|
||||
code: 200,
|
||||
message: '获取成功',
|
||||
data: result,
|
||||
};
|
||||
}
|
||||
|
||||
@Get('all')
|
||||
@ApiOperation({ summary: '获取所有角色列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getAll(@Req() req: AuthenticatedRequest) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const userId = req.user?.uid || 0;
|
||||
|
||||
// TODO: 实现用户权限检查
|
||||
// 暂时假设为超级管理员,后续完善权限模块时补充
|
||||
const isAdmin = true;
|
||||
const userRoleIds: number[] = [];
|
||||
|
||||
const result = await this.roleService.getAll(siteId, userRoleIds, isAdmin);
|
||||
return {
|
||||
code: 200,
|
||||
message: '获取成功',
|
||||
data: result,
|
||||
};
|
||||
}
|
||||
|
||||
@Get('column')
|
||||
@ApiOperation({ summary: '获取角色键值对' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getColumn(@Req() req: AuthenticatedRequest) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.roleService.getColumn(siteId);
|
||||
return {
|
||||
code: 200,
|
||||
message: '获取成功',
|
||||
data: result,
|
||||
};
|
||||
}
|
||||
|
||||
@Get(':roleId')
|
||||
@ApiOperation({ summary: '获取角色详情' })
|
||||
@ApiParam({ name: 'roleId', description: '角色ID' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getInfo(@Param('roleId', ParseIntPipe) roleId: number) {
|
||||
const result = await this.roleService.getInfo(roleId);
|
||||
return {
|
||||
code: 200,
|
||||
message: '获取成功',
|
||||
data: result,
|
||||
};
|
||||
}
|
||||
|
||||
@Post()
|
||||
@ApiOperation({ summary: '新增角色' })
|
||||
@ApiResponse({ status: 200, description: '创建成功' })
|
||||
async add(
|
||||
@Body() createRoleDto: CreateRoleDto,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const appType = 'admin'; // 默认为admin类型
|
||||
|
||||
// 处理rules字段
|
||||
const roleData = {
|
||||
...createRoleDto,
|
||||
rules: createRoleDto.rules
|
||||
? JSON.stringify(createRoleDto.rules)
|
||||
: undefined,
|
||||
};
|
||||
|
||||
const result = await this.roleService.add(siteId, appType, roleData);
|
||||
return {
|
||||
code: 200,
|
||||
message: '创建成功',
|
||||
data: result,
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
code: 400,
|
||||
message: error.message || '创建失败',
|
||||
data: null,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@Put(':roleId')
|
||||
@ApiOperation({ summary: '编辑角色' })
|
||||
@ApiParam({ name: 'roleId', description: '角色ID' })
|
||||
@ApiResponse({ status: 200, description: '更新成功' })
|
||||
async edit(
|
||||
@Param('roleId', ParseIntPipe) roleId: number,
|
||||
@Body() updateRoleDto: UpdateRoleDto,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
|
||||
// 处理rules字段
|
||||
const roleData = {
|
||||
...updateRoleDto,
|
||||
rules: updateRoleDto.rules
|
||||
? JSON.stringify(updateRoleDto.rules)
|
||||
: undefined,
|
||||
};
|
||||
|
||||
const result = await this.roleService.edit(roleId, siteId, roleData);
|
||||
return {
|
||||
code: 200,
|
||||
message: '更新成功',
|
||||
data: result,
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
code: 400,
|
||||
message: error.message || '更新失败',
|
||||
data: null,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@Put('status/:roleId')
|
||||
@ApiOperation({ summary: '修改角色状态' })
|
||||
@ApiParam({ name: 'roleId', description: '角色ID' })
|
||||
@ApiResponse({ status: 200, description: '修改成功' })
|
||||
async modifyStatus(
|
||||
@Param('roleId', ParseIntPipe) roleId: number,
|
||||
@Body() modifyStatusDto: ModifyRoleStatusDto,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.roleService.modifyStatus(
|
||||
roleId,
|
||||
siteId,
|
||||
modifyStatusDto.status,
|
||||
);
|
||||
return {
|
||||
code: 200,
|
||||
message: '修改成功',
|
||||
data: result,
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
code: 400,
|
||||
message: error.message || '修改失败',
|
||||
data: null,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@Delete(':roleId')
|
||||
@ApiOperation({ summary: '删除角色' })
|
||||
@ApiParam({ name: 'roleId', description: '角色ID' })
|
||||
@ApiResponse({ status: 200, description: '删除成功' })
|
||||
async delete(
|
||||
@Param('roleId', ParseIntPipe) roleId: number,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.roleService.del(roleId, siteId);
|
||||
return {
|
||||
code: 200,
|
||||
message: '删除成功',
|
||||
data: result,
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
code: 400,
|
||||
message: error.message || '删除失败',
|
||||
data: null,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@Get('menu-ids/:roleIds')
|
||||
@ApiOperation({ summary: '根据角色ID获取菜单权限' })
|
||||
@ApiParam({ name: 'roleIds', description: '角色ID数组(逗号分隔)' })
|
||||
@ApiQuery({
|
||||
name: 'allow_menu_keys',
|
||||
description: '允许的菜单键(逗号分隔)',
|
||||
required: false,
|
||||
})
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getMenuIdsByRoleIds(
|
||||
@Param('roleIds') roleIds: string,
|
||||
@Query('allow_menu_keys') allowMenuKeys: string = '',
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const roleIdArray = roleIds
|
||||
.split(',')
|
||||
.map((id) => parseInt(id.trim()))
|
||||
.filter((id) => !isNaN(id));
|
||||
const allowMenuKeyArray = allowMenuKeys
|
||||
? allowMenuKeys
|
||||
.split(',')
|
||||
.map((key) => key.trim())
|
||||
.filter((key) => key)
|
||||
: [];
|
||||
|
||||
const result = await this.roleService.getMenuIdsByRoleIds(
|
||||
siteId,
|
||||
roleIdArray,
|
||||
allowMenuKeyArray,
|
||||
);
|
||||
return {
|
||||
code: 200,
|
||||
message: '获取成功',
|
||||
data: result,
|
||||
};
|
||||
}
|
||||
}
|
||||
153
wwjcloud/src/common/sys/controllers/admin/ScheduleController.ts
Normal file
153
wwjcloud/src/common/sys/controllers/admin/ScheduleController.ts
Normal file
@@ -0,0 +1,153 @@
|
||||
import {
|
||||
Controller,
|
||||
Get,
|
||||
Post,
|
||||
Put,
|
||||
Delete,
|
||||
Body,
|
||||
Param,
|
||||
Query,
|
||||
UseGuards,
|
||||
Req,
|
||||
ParseIntPipe,
|
||||
} from '@nestjs/common';
|
||||
import { ApiTags, ApiOperation, ApiResponse, ApiParam } from '@nestjs/swagger';
|
||||
import type { Request } from 'express';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { RolesGuard } from '../../../auth/guards/RolesGuard';
|
||||
import { Roles } from '../../../auth/decorators/RolesDecorator';
|
||||
import { ScheduleService } from '../../services/admin/ScheduleService';
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
uid: number;
|
||||
username: string;
|
||||
siteId: number;
|
||||
userType: string;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 定时任务管理控制器 - 管理端
|
||||
* 路由前缀: /adminapi/sys/schedule
|
||||
*/
|
||||
@ApiTags('定时任务管理')
|
||||
@Controller('adminapi/sys/schedule')
|
||||
@UseGuards(JwtAuthGuard, RolesGuard)
|
||||
@Roles('admin')
|
||||
export class ScheduleController {
|
||||
constructor(private readonly scheduleService: ScheduleService) {}
|
||||
|
||||
@Get('page')
|
||||
@ApiOperation({ summary: '获取定时任务分页列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getPage(@Query() query: any, @Req() req: AuthenticatedRequest) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.scheduleService.getPage(siteId, query);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get('list')
|
||||
@ApiOperation({ summary: '获取定时任务列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getList(@Query() query: any, @Req() req: AuthenticatedRequest) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.scheduleService.getList(siteId, query);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get(':id')
|
||||
@ApiOperation({ summary: '获取定时任务详情' })
|
||||
@ApiParam({ name: 'id', description: '任务ID' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getInfo(
|
||||
@Param('id', ParseIntPipe) id: number,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.scheduleService.getInfo(siteId, id);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Post()
|
||||
@ApiOperation({ summary: '新增定时任务' })
|
||||
@ApiResponse({ status: 200, description: '创建成功' })
|
||||
async add(@Body() data: any, @Req() req: AuthenticatedRequest) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.scheduleService.add(siteId, data);
|
||||
return { code: 200, message: '创建成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '创建失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Put(':id')
|
||||
@ApiOperation({ summary: '编辑定时任务' })
|
||||
@ApiParam({ name: 'id', description: '任务ID' })
|
||||
@ApiResponse({ status: 200, description: '更新成功' })
|
||||
async edit(
|
||||
@Param('id', ParseIntPipe) id: number,
|
||||
@Body() data: any,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.scheduleService.edit(siteId, id, data);
|
||||
return { code: 200, message: '更新成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '更新失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Put(':id/start')
|
||||
@ApiOperation({ summary: '启动定时任务' })
|
||||
@ApiParam({ name: 'id', description: '任务ID' })
|
||||
@ApiResponse({ status: 200, description: '启动成功' })
|
||||
async start(
|
||||
@Param('id', ParseIntPipe) id: number,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.scheduleService.start(siteId, id);
|
||||
return { code: 200, message: '启动成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '启动失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Put(':id/stop')
|
||||
@ApiOperation({ summary: '停止定时任务' })
|
||||
@ApiParam({ name: 'id', description: '任务ID' })
|
||||
@ApiResponse({ status: 200, description: '停止成功' })
|
||||
async stop(
|
||||
@Param('id', ParseIntPipe) id: number,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.scheduleService.stop(siteId, id);
|
||||
return { code: 200, message: '停止成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '停止失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Delete(':id')
|
||||
@ApiOperation({ summary: '删除定时任务' })
|
||||
@ApiParam({ name: 'id', description: '任务ID' })
|
||||
@ApiResponse({ status: 200, description: '删除成功' })
|
||||
async delete(
|
||||
@Param('id', ParseIntPipe) id: number,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
try {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.scheduleService.del(siteId, id);
|
||||
return { code: 200, message: '删除成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '删除失败', data: null };
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
import { Controller, Get, Query, UseGuards, Req } from '@nestjs/common';
|
||||
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
|
||||
import type { Request } from 'express';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { RolesGuard } from '../../../auth/guards/RolesGuard';
|
||||
import { Roles } from '../../../auth/decorators/RolesDecorator';
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
uid: number;
|
||||
username: string;
|
||||
siteId: number;
|
||||
userType: string;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 定时任务日志控制器 - 管理端
|
||||
* 路由前缀: /adminapi/sys/schedule-log
|
||||
*/
|
||||
@ApiTags('定时任务日志')
|
||||
@Controller('adminapi/sys/schedule-log')
|
||||
@UseGuards(JwtAuthGuard, RolesGuard)
|
||||
@Roles('admin')
|
||||
export class ScheduleLogController {
|
||||
constructor() {}
|
||||
|
||||
@Get('page')
|
||||
@ApiOperation({ summary: '获取定时任务日志分页列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getPage(@Query() query: any, @Req() req: AuthenticatedRequest) {
|
||||
// TODO: 实现定时任务日志分页列表
|
||||
return { code: 200, message: '获取成功', data: { list: [], total: 0 } };
|
||||
}
|
||||
|
||||
@Get('list')
|
||||
@ApiOperation({ summary: '获取定时任务日志列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getList(@Query() query: any, @Req() req: AuthenticatedRequest) {
|
||||
// TODO: 实现定时任务日志列表
|
||||
return { code: 200, message: '获取成功', data: [] };
|
||||
}
|
||||
|
||||
@Get('stats')
|
||||
@ApiOperation({ summary: '获取定时任务统计信息' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getStats(@Req() req: AuthenticatedRequest) {
|
||||
// TODO: 实现定时任务统计信息
|
||||
return {
|
||||
code: 200,
|
||||
message: '获取成功',
|
||||
data: { total: 0, success: 0, failed: 0 },
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
import { Controller, Get, Post, UseGuards, Req } from '@nestjs/common';
|
||||
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
|
||||
import type { Request } from 'express';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { RolesGuard } from '../../../auth/guards/RolesGuard';
|
||||
import { Roles } from '../../../auth/decorators/RolesDecorator';
|
||||
import { SystemService } from '../../services/admin/SystemService';
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
uid: number;
|
||||
username: string;
|
||||
siteId: number;
|
||||
userType: string;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 系统信息管理控制器 - 管理端
|
||||
* 路由前缀: /adminapi/sys/system
|
||||
*/
|
||||
@ApiTags('系统信息')
|
||||
@Controller('adminapi/sys/system')
|
||||
@UseGuards(JwtAuthGuard, RolesGuard)
|
||||
@Roles('admin')
|
||||
export class SystemController {
|
||||
constructor(private readonly systemService: SystemService) {}
|
||||
|
||||
@Get('info')
|
||||
@ApiOperation({ summary: '获取系统信息' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getInfo(@Req() req: AuthenticatedRequest) {
|
||||
const result = await this.systemService.getInfo();
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get('url')
|
||||
@ApiOperation({ summary: '获取系统URL信息' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getUrl(@Req() req: AuthenticatedRequest) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.systemService.getUrl(siteId);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get('stats')
|
||||
@ApiOperation({ summary: '获取系统统计信息' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getSystemStats(@Req() req: AuthenticatedRequest) {
|
||||
const result = await this.systemService.getSystemStats();
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get('system-info')
|
||||
@ApiOperation({ summary: '获取详细系统信息' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getSystemInfo(@Req() req: AuthenticatedRequest) {
|
||||
const result = await this.systemService.getSystemInfo();
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Post('clear-cache')
|
||||
@ApiOperation({ summary: '清理系统缓存' })
|
||||
@ApiResponse({ status: 200, description: '清理成功' })
|
||||
async clearCache(@Req() req: AuthenticatedRequest) {
|
||||
try {
|
||||
const result = await this.systemService.clearCache();
|
||||
return { code: 200, message: '清理成功', data: result };
|
||||
} catch (error) {
|
||||
return { code: 400, message: error.message || '清理失败', data: null };
|
||||
}
|
||||
}
|
||||
|
||||
@Get('check-config')
|
||||
@ApiOperation({ summary: '检查系统配置' })
|
||||
@ApiResponse({ status: 200, description: '检查完成' })
|
||||
async checkSystemConfig(@Req() req: AuthenticatedRequest) {
|
||||
const result = await this.systemService.checkSystemConfig();
|
||||
return { code: 200, message: '检查完成', data: result };
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
import { Controller, Get, Post, UseGuards, Req, Query } from '@nestjs/common';
|
||||
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
|
||||
import type { Request } from 'express';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { RolesGuard } from '../../../auth/guards/RolesGuard';
|
||||
import { Roles } from '../../../auth/decorators/RolesDecorator';
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
uid: number;
|
||||
username: string;
|
||||
siteId: number;
|
||||
userType: string;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 富文本编辑器控制器 - 管理端
|
||||
* 路由前缀: /adminapi/sys/ueditor
|
||||
*/
|
||||
@ApiTags('富文本编辑器')
|
||||
@Controller('adminapi/sys/ueditor')
|
||||
@UseGuards(JwtAuthGuard, RolesGuard)
|
||||
@Roles('admin')
|
||||
export class UeditorController {
|
||||
constructor() {}
|
||||
|
||||
@Get('config')
|
||||
@ApiOperation({ summary: '获取编辑器配置' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getConfig(@Req() req: AuthenticatedRequest) {
|
||||
// TODO: 实现编辑器配置获取
|
||||
return {
|
||||
imageActionName: 'uploadimage',
|
||||
imageFieldName: 'upfile',
|
||||
imageMaxSize: 2048000,
|
||||
imageAllowFiles: ['.png', '.jpg', '.jpeg', '.gif', '.bmp'],
|
||||
imageCompressEnable: true,
|
||||
imageCompressBorder: 1600,
|
||||
imageInsertAlign: 'none',
|
||||
imageUrlPrefix: '',
|
||||
imagePathFormat:
|
||||
'/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}',
|
||||
};
|
||||
}
|
||||
|
||||
@Post('upload')
|
||||
@ApiOperation({ summary: '编辑器文件上传' })
|
||||
@ApiResponse({ status: 200, description: '上传成功' })
|
||||
async upload(@Req() req: AuthenticatedRequest) {
|
||||
// TODO: 实现编辑器文件上传
|
||||
return { code: 200, message: '上传成功', data: null };
|
||||
}
|
||||
|
||||
@Get('list')
|
||||
@ApiOperation({ summary: '获取文件列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getFileList(@Query() query: any, @Req() req: AuthenticatedRequest) {
|
||||
// TODO: 实现文件列表获取
|
||||
return { code: 200, message: '获取成功', data: { list: [], total: 0 } };
|
||||
}
|
||||
}
|
||||
54
wwjcloud/src/common/sys/controllers/api/ApiAreaController.ts
Normal file
54
wwjcloud/src/common/sys/controllers/api/ApiAreaController.ts
Normal file
@@ -0,0 +1,54 @@
|
||||
import {
|
||||
Controller,
|
||||
Get,
|
||||
Param,
|
||||
UseGuards,
|
||||
Req,
|
||||
ParseIntPipe,
|
||||
Query,
|
||||
} from '@nestjs/common';
|
||||
import { ApiTags, ApiOperation, ApiResponse, ApiParam } from '@nestjs/swagger';
|
||||
import type { Request } from 'express';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { ApiAreaService } from '../../services/api/ApiAreaService';
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
uid: number;
|
||||
username: string;
|
||||
siteId: number;
|
||||
userType: string;
|
||||
};
|
||||
}
|
||||
|
||||
@ApiTags('API区域')
|
||||
@Controller('api/sys/area')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
export class ApiAreaController {
|
||||
constructor(private readonly apiAreaService: ApiAreaService) {}
|
||||
|
||||
@Get('list')
|
||||
@ApiOperation({ summary: '获取区域列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getAreaList(
|
||||
@Req() req: AuthenticatedRequest,
|
||||
@Query('parent_id') parentId?: number,
|
||||
) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.apiAreaService.getAreaList(siteId, parentId);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get(':areaId')
|
||||
@ApiOperation({ summary: '获取区域详情' })
|
||||
@ApiParam({ name: 'areaId', description: '区域ID' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getAreaInfo(
|
||||
@Param('areaId', ParseIntPipe) areaId: number,
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.apiAreaService.getAreaInfo(siteId, areaId);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
import {
|
||||
Controller,
|
||||
Get,
|
||||
Post,
|
||||
Body,
|
||||
Query,
|
||||
UseGuards,
|
||||
Req,
|
||||
} from '@nestjs/common';
|
||||
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
|
||||
import type { Request } from 'express';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { ApiConfigService } from '../../services/api/ApiConfigService';
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
uid: number;
|
||||
username: string;
|
||||
siteId: number;
|
||||
userType: string;
|
||||
};
|
||||
}
|
||||
|
||||
@ApiTags('API配置')
|
||||
@Controller('api/sys/config')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
export class ApiConfigController {
|
||||
constructor(private readonly apiConfigService: ApiConfigService) {}
|
||||
|
||||
@Get()
|
||||
@ApiOperation({ summary: '获取配置' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getConfig(@Query('key') key: string, @Req() req: AuthenticatedRequest) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.apiConfigService.getConfig(siteId, key);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Post('batch')
|
||||
@ApiOperation({ summary: '批量获取配置' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getConfigs(
|
||||
@Body() body: { keys: string[] },
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.apiConfigService.getConfigs(siteId, body.keys);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
import { Controller, Get, UseGuards, Req } from '@nestjs/common';
|
||||
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
|
||||
import type { Request } from 'express';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { ApiIndexService } from '../../services/api/ApiIndexService';
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
uid: number;
|
||||
username: string;
|
||||
siteId: number;
|
||||
userType: string;
|
||||
};
|
||||
}
|
||||
|
||||
@ApiTags('API首页')
|
||||
@Controller('api/sys/index')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
export class ApiIndexController {
|
||||
constructor(private readonly apiIndexService: ApiIndexService) {}
|
||||
|
||||
@Get()
|
||||
@ApiOperation({ summary: '获取首页信息' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getIndexInfo(@Req() req: AuthenticatedRequest) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.apiIndexService.getIndexInfo(siteId);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Get('system')
|
||||
@ApiOperation({ summary: '获取系统信息' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getSystemInfo(@Req() req: AuthenticatedRequest) {
|
||||
const result = await this.apiIndexService.getSystemInfo();
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
}
|
||||
43
wwjcloud/src/common/sys/controllers/api/ApiScanController.ts
Normal file
43
wwjcloud/src/common/sys/controllers/api/ApiScanController.ts
Normal file
@@ -0,0 +1,43 @@
|
||||
import { Controller, Post, Body, UseGuards, Req } from '@nestjs/common';
|
||||
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
|
||||
import type { Request } from 'express';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { ApiScanService } from '../../services/api/ApiScanService';
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
uid: number;
|
||||
username: string;
|
||||
siteId: number;
|
||||
userType: string;
|
||||
};
|
||||
}
|
||||
|
||||
@ApiTags('API扫描')
|
||||
@Controller('api/sys/scan')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
export class ApiScanController {
|
||||
constructor(private readonly apiScanService: ApiScanService) {}
|
||||
|
||||
@Post('qr')
|
||||
@ApiOperation({ summary: '扫描二维码' })
|
||||
@ApiResponse({ status: 200, description: '扫描成功' })
|
||||
async scanQrCode(
|
||||
@Body() body: { code: string },
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const result = await this.apiScanService.scanQrCode(body.code);
|
||||
return { code: 200, message: '扫描成功', data: result };
|
||||
}
|
||||
|
||||
@Post('barcode')
|
||||
@ApiOperation({ summary: '扫描条码' })
|
||||
@ApiResponse({ status: 200, description: '扫描成功' })
|
||||
async scanBarcode(
|
||||
@Body() body: { code: string },
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const result = await this.apiScanService.scanBarcode(body.code);
|
||||
return { code: 200, message: '扫描成功', data: result };
|
||||
}
|
||||
}
|
||||
65
wwjcloud/src/common/sys/controllers/api/ApiTaskController.ts
Normal file
65
wwjcloud/src/common/sys/controllers/api/ApiTaskController.ts
Normal file
@@ -0,0 +1,65 @@
|
||||
import {
|
||||
Controller,
|
||||
Get,
|
||||
Post,
|
||||
Body,
|
||||
Put,
|
||||
Param,
|
||||
UseGuards,
|
||||
Req,
|
||||
ParseIntPipe,
|
||||
} from '@nestjs/common';
|
||||
import { ApiTags, ApiOperation, ApiResponse, ApiParam } from '@nestjs/swagger';
|
||||
import type { Request } from 'express';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { ApiTaskService } from '../../services/api/ApiTaskService';
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
uid: number;
|
||||
username: string;
|
||||
siteId: number;
|
||||
userType: string;
|
||||
};
|
||||
}
|
||||
|
||||
@ApiTags('API任务')
|
||||
@Controller('api/sys/task')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
export class ApiTaskController {
|
||||
constructor(private readonly apiTaskService: ApiTaskService) {}
|
||||
|
||||
@Get('list')
|
||||
@ApiOperation({ summary: '获取任务列表' })
|
||||
@ApiResponse({ status: 200, description: '获取成功' })
|
||||
async getTaskList(@Req() req: AuthenticatedRequest) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.apiTaskService.getTaskList(siteId);
|
||||
return { code: 200, message: '获取成功', data: result };
|
||||
}
|
||||
|
||||
@Post()
|
||||
@ApiOperation({ summary: '创建任务' })
|
||||
@ApiResponse({ status: 200, description: '创建成功' })
|
||||
async createTask(@Body() body: any, @Req() req: AuthenticatedRequest) {
|
||||
const siteId = req.user?.siteId || 0;
|
||||
const result = await this.apiTaskService.createTask(siteId, body);
|
||||
return { code: 200, message: '创建成功', data: result };
|
||||
}
|
||||
|
||||
@Put(':taskId/status')
|
||||
@ApiOperation({ summary: '更新任务状态' })
|
||||
@ApiParam({ name: 'taskId', description: '任务ID' })
|
||||
@ApiResponse({ status: 200, description: '更新成功' })
|
||||
async updateTaskStatus(
|
||||
@Param('taskId', ParseIntPipe) taskId: number,
|
||||
@Body() body: { status: string },
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const result = await this.apiTaskService.updateTaskStatus(
|
||||
taskId,
|
||||
body.status,
|
||||
);
|
||||
return { code: 200, message: '更新成功', data: result };
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
import { Controller, Post, Body, UseGuards, Req } from '@nestjs/common';
|
||||
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
|
||||
import type { Request } from 'express';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { ApiVerifyService } from '../../services/api/ApiVerifyService';
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
uid: number;
|
||||
username: string;
|
||||
siteId: number;
|
||||
userType: string;
|
||||
};
|
||||
}
|
||||
|
||||
@ApiTags('API验证')
|
||||
@Controller('api/sys/verify')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
export class ApiVerifyController {
|
||||
constructor(private readonly apiVerifyService: ApiVerifyService) {}
|
||||
|
||||
@Post('code')
|
||||
@ApiOperation({ summary: '验证码验证' })
|
||||
@ApiResponse({ status: 200, description: '验证成功' })
|
||||
async verifyCode(
|
||||
@Body() body: { code: string },
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const result = await this.apiVerifyService.verifyCode(body.code);
|
||||
return {
|
||||
code: 200,
|
||||
message: result ? '验证成功' : '验证失败',
|
||||
data: result,
|
||||
};
|
||||
}
|
||||
|
||||
@Post('sms/send')
|
||||
@ApiOperation({ summary: '发送短信验证码' })
|
||||
@ApiResponse({ status: 200, description: '发送成功' })
|
||||
async sendSms(
|
||||
@Body() body: { phone: string },
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const result = await this.apiVerifyService.sendSms(body.phone);
|
||||
return {
|
||||
code: 200,
|
||||
message: result ? '发送成功' : '发送失败',
|
||||
data: result,
|
||||
};
|
||||
}
|
||||
|
||||
@Post('sms/verify')
|
||||
@ApiOperation({ summary: '验证短信验证码' })
|
||||
@ApiResponse({ status: 200, description: '验证成功' })
|
||||
async verifySms(
|
||||
@Body() body: { phone: string; code: string },
|
||||
@Req() req: AuthenticatedRequest,
|
||||
) {
|
||||
const result = await this.apiVerifyService.verifySms(body.phone, body.code);
|
||||
return {
|
||||
code: 200,
|
||||
message: result ? '验证成功' : '验证失败',
|
||||
data: result,
|
||||
};
|
||||
}
|
||||
}
|
||||
57
wwjcloud/src/common/sys/controllers/api/SysApiController.ts
Normal file
57
wwjcloud/src/common/sys/controllers/api/SysApiController.ts
Normal file
@@ -0,0 +1,57 @@
|
||||
import { Controller, Get, Post, Body, Query, UseGuards } from '@nestjs/common';
|
||||
import { JwtAuthGuard } from '../../../auth/guards/JwtAuthGuard';
|
||||
import { SysApiService } from '../../services/api/SysApiService';
|
||||
|
||||
@Controller('api/sys')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
export class SysApiController {
|
||||
constructor(private readonly sysApiService: SysApiService) {}
|
||||
|
||||
/**
|
||||
* 获取系统信息
|
||||
*/
|
||||
@Get('index')
|
||||
async index(@Query() query: { site_id: number }) {
|
||||
return this.sysApiService.getIndex(query.site_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取地区列表
|
||||
*/
|
||||
@Get('area')
|
||||
async getArea(@Query() query: { parent_id?: number }) {
|
||||
return this.sysApiService.getArea(query.parent_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取系统配置
|
||||
*/
|
||||
@Get('config')
|
||||
async getConfig(@Query() query: { site_id: number, keys?: string }) {
|
||||
return this.sysApiService.getConfig(query.site_id, query.keys);
|
||||
}
|
||||
|
||||
/**
|
||||
* 扫码登录
|
||||
*/
|
||||
@Post('scan')
|
||||
async scan(@Body() dto: { qr_code: string }) {
|
||||
return this.sysApiService.scan(dto.qr_code);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取任务状态
|
||||
*/
|
||||
@Get('task')
|
||||
async getTask(@Query() query: { task_id: string }) {
|
||||
return this.sysApiService.getTask(query.task_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证码验证
|
||||
*/
|
||||
@Post('verify')
|
||||
async verify(@Body() dto: { verify_key: string; verify_code: string }) {
|
||||
return this.sysApiService.verify(dto.verify_key, dto.verify_code);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user