feat: 迭代

This commit is contained in:
2026-05-10 10:45:13 +08:00
parent da0f304a87
commit e75ec01614
70 changed files with 9783 additions and 3303 deletions
+1 -1
View File
@@ -2,6 +2,6 @@ import { registerAs } from '@nestjs/config';
export default registerAs('jwt', () => ({
secret: process.env.JWT_SECRET || 'dev_secret_key',
expiresIn: process.env.JWT_EXPIRES_IN || '2h',
expiresIn: process.env.JWT_EXPIRES_IN || '7d',
refreshExpiresIn: process.env.JWT_REFRESH_EXPIRES_IN || '7d',
}));
@@ -1,8 +1,9 @@
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, Index, ManyToOne, JoinColumn } from 'typeorm';
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, Index, ManyToOne, JoinColumn, Unique } from 'typeorm';
import { User } from './user.entity';
import { MktActivity } from './mkt-activity.entity';
@Entity('mkt_user_invite_stats')
@Unique(['activityId', 'userId'])
export class MktUserInviteStats {
@PrimaryGeneratedColumn({ type: 'bigint', unsigned: true })
id: number;
@@ -12,7 +13,7 @@ export class MktUserInviteStats {
activityId: number;
@Index()
@Column({ name: 'user_id', type: 'bigint', unsigned: true, unique: true, comment: '用户ID' })
@Column({ name: 'user_id', type: 'bigint', unsigned: true, comment: '用户ID' })
userId: number;
@Column({ name: 'invite_code', length: 32, unique: true, comment: '专属邀请码' })
@@ -0,0 +1,67 @@
import { Controller, Get } from '@nestjs/common';
import { ApiTags, ApiOperation } from '@nestjs/swagger';
import { ActivityService } from './activity.service';
@ApiTags('公开接口-活动')
@Controller('activity')
export class ActivityPublicController {
constructor(private readonly activityService: ActivityService) {}
@Get('list')
@ApiOperation({ summary: '获取活动列表(公开接口)' })
async getActivityList() {
const activities: any[] = [];
// 获取邀请活动
const inviteActivity = await this.activityService.getEnabledInviteCashbackActivity();
if (inviteActivity && inviteActivity.enabled) {
const config = inviteActivity.config || {};
activities.push({
id: inviteActivity.id,
type: 'invite',
title: '邀请好友得奖励',
description: '邀请好友下单,双方都有返现',
icon: '🎁',
enabled: true,
config: {
inviterReward: config.maxCashback || 0,
inviteeReward: 0,
firstOrderRate: config.firstOrderRate || 0,
secondOrderRate: config.secondOrderRate || 0,
minCashback: config.minCashback || 0,
maxCashback: config.maxCashback || 0,
},
});
}
return { list: activities };
}
@Get('invite/config')
@ApiOperation({ summary: '获取邀请活动配置(公开接口)' })
async getInviteConfig() {
const activity = await this.activityService.getEnabledInviteCashbackActivity();
if (!activity || !activity.enabled) {
return {
enabled: false,
inviterReward: 0,
inviteeReward: 0,
minOrderAmount: 0,
};
}
const config = activity.config || {};
return {
enabled: true,
inviterReward: config.maxCashback || 0,
inviteeReward: 0,
minOrderAmount: 0,
firstOrderRate: config.firstOrderRate || 0,
secondOrderRate: config.secondOrderRate || 0,
minCashback: config.minCashback || 0,
maxCashback: config.maxCashback || 0,
};
}
}
@@ -3,6 +3,7 @@ import { TypeOrmModule } from '@nestjs/typeorm';
import { ActivityService } from './activity.service';
import { ActivityUserController } from './activity-user.controller';
import { ActivityAdminController } from './activity-admin.controller';
import { ActivityPublicController } from './activity-public.controller';
import { MktActivity } from '@/entities/mkt-activity.entity';
import { MktInvitation } from '@/entities/mkt-invitation.entity';
import { MktCashback } from '@/entities/mkt-cashback.entity';
@@ -23,7 +24,7 @@ import { User } from '@/entities/user.entity';
User,
]),
],
controllers: [ActivityUserController, ActivityAdminController],
controllers: [ActivityPublicController, ActivityUserController, ActivityAdminController],
providers: [ActivityService],
exports: [ActivityService],
})
@@ -6,9 +6,9 @@ import {
Request,
} from '@nestjs/common';
import { ReviewService } from './review.service';
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
import { RolesGuard } from '../auth/roles.guard';
import { Roles } from '../auth/roles.decorator';
import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';
import { RolesGuard } from '../../common/guards/roles.guard';
import { Roles } from '../../common/decorators/roles.decorator';
@Controller('seller/reviews')
@UseGuards(JwtAuthGuard, RolesGuard)