31cc1e02ce
- 新增 AffiliateProgram / AffiliateLink / AffiliateClick 规范化 Prisma 模型 取代原手写裸表 affiliate_stats / affiliate_clicks - 新增迁移 prisma/migrations/20260711000000_add_affiliate_models - 重构 affiliate.service.ts 改用 Prisma ORM,消除 $queryRawUnsafe SQL 注入 - 重构 affiliate.controller.ts 接口:programs / links(?skillId,?toolId) / stats / click - 前端 affiliate 页接入真实接口,移除硬编码 demo 数据 - 技能详情页新增「学此技能推荐使用的工具」联盟链接区块 - 新增 affiliate.service.spec.ts(4 用例通过)与幂等种子 seed-affiliate.ts - 更新 docs/progress/current.md,明确无 ICP 经营许可证下以联盟返佣为合规变现主路径 - 含此前工作区未提交改动(工具 slug 路由、支付/订单、SEO 等) Co-Authored-By: opencode <opencode@anthropic.com>
28 lines
1012 B
TypeScript
Executable File
28 lines
1012 B
TypeScript
Executable File
import { Controller, Get, Post, Body, Param, Query, UseGuards } from '@nestjs/common';
|
|
import { ApiTags, ApiBearerAuth } from '@nestjs/swagger';
|
|
import { AuthGuard } from '@nestjs/passport';
|
|
import { ToolsService } from './tools.service';
|
|
|
|
@ApiTags('AI工具')
|
|
@Controller('tools')
|
|
export class ToolsController {
|
|
constructor(private toolsService: ToolsService) {}
|
|
|
|
@Get()
|
|
async findAll(@Query() query: { page?: number; pageSize?: number; categoryId?: number; isFeatured?: boolean; tag?: string }) {
|
|
return this.toolsService.findAll(query);
|
|
}
|
|
|
|
@Get(':slug')
|
|
async findBySlug(@Param('slug') slug: string) {
|
|
return this.toolsService.findBySlug(slug);
|
|
}
|
|
|
|
@Post()
|
|
@UseGuards(AuthGuard('jwt'))
|
|
@ApiBearerAuth()
|
|
async create(@Body() body: { name: string; slug: string; description?: string; url: string; icon?: string; affiliateLink?: string; categoryId?: number; tags?: string; metaTitle?: string; metaDesc?: string; content?: string }) {
|
|
return this.toolsService.create(body);
|
|
}
|
|
}
|