u
This commit is contained in:
@@ -1,92 +0,0 @@
|
|||||||
import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn, CreateDateColumn } from 'typeorm';
|
|
||||||
import { UserEntity } from './user.entity';
|
|
||||||
import { z } from 'zod';
|
|
||||||
|
|
||||||
@Entity({ name: 'login_history' })
|
|
||||||
export class LoginHistoryEntity {
|
|
||||||
@PrimaryGeneratedColumn({ unsigned: true })
|
|
||||||
id!: number;
|
|
||||||
|
|
||||||
@ManyToOne(() => UserEntity)
|
|
||||||
@JoinColumn({ name: 'user_id' })
|
|
||||||
user!: UserEntity;
|
|
||||||
|
|
||||||
@Column({
|
|
||||||
name: 'ip_address',
|
|
||||||
type: 'varchar',
|
|
||||||
length: 45,
|
|
||||||
comment: '登录IP地址'
|
|
||||||
})
|
|
||||||
ipAddress!: string;
|
|
||||||
|
|
||||||
@Column({
|
|
||||||
name: 'user_agent',
|
|
||||||
type: 'text',
|
|
||||||
nullable: true,
|
|
||||||
comment: '用户代理信息'
|
|
||||||
})
|
|
||||||
userAgent!: string | null;
|
|
||||||
|
|
||||||
@Column({
|
|
||||||
name: 'longitude',
|
|
||||||
type: 'decimal',
|
|
||||||
precision: 10,
|
|
||||||
scale: 6,
|
|
||||||
nullable: true,
|
|
||||||
comment: '登录位置经度'
|
|
||||||
})
|
|
||||||
longitude!: number | null;
|
|
||||||
|
|
||||||
@Column({
|
|
||||||
name: 'latitude',
|
|
||||||
type: 'decimal',
|
|
||||||
precision: 10,
|
|
||||||
scale: 6,
|
|
||||||
nullable: true,
|
|
||||||
comment: '登录位置纬度'
|
|
||||||
})
|
|
||||||
latitude!: number | null;
|
|
||||||
|
|
||||||
@Column({
|
|
||||||
name: 'location_name',
|
|
||||||
type: 'varchar',
|
|
||||||
length: 255,
|
|
||||||
nullable: true,
|
|
||||||
comment: '登录位置名称'
|
|
||||||
})
|
|
||||||
locationName!: string | null;
|
|
||||||
|
|
||||||
@CreateDateColumn({
|
|
||||||
name: 'login_time',
|
|
||||||
type: 'timestamp',
|
|
||||||
comment: '登录时间'
|
|
||||||
})
|
|
||||||
loginTime!: Date;
|
|
||||||
|
|
||||||
constructor(partial?: Partial<LoginHistoryEntity>) {
|
|
||||||
Object.assign(this, partial);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const LoginHistorySchema = z.object({
|
|
||||||
ipAddress: z.string().ip().openapi({
|
|
||||||
example: '192.168.1.1',
|
|
||||||
description: '登录IP地址'
|
|
||||||
}),
|
|
||||||
userAgent: z.string().optional().openapi({
|
|
||||||
example: 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X)',
|
|
||||||
description: '用户代理信息'
|
|
||||||
}),
|
|
||||||
longitude: z.number().optional().openapi({
|
|
||||||
example: 116.404,
|
|
||||||
description: '登录位置经度'
|
|
||||||
}),
|
|
||||||
latitude: z.number().optional().openapi({
|
|
||||||
example: 39.915,
|
|
||||||
description: '登录位置纬度'
|
|
||||||
}),
|
|
||||||
locationName: z.string().optional().openapi({
|
|
||||||
example: '北京市朝阳区',
|
|
||||||
description: '登录位置名称'
|
|
||||||
})
|
|
||||||
});
|
|
||||||
@@ -1,98 +0,0 @@
|
|||||||
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, OneToMany, ManyToOne } from 'typeorm';
|
|
||||||
import { UserMessage } from '../messages/user-message.entity';
|
|
||||||
import { UserEntity } from './user.entity';
|
|
||||||
import { z } from 'zod';
|
|
||||||
|
|
||||||
@Entity({ name: 'messages' })
|
|
||||||
export class MessageEntity {
|
|
||||||
@PrimaryGeneratedColumn({ unsigned: true, comment: '消息ID' })
|
|
||||||
id!: number;
|
|
||||||
|
|
||||||
@Column({
|
|
||||||
type: 'varchar',
|
|
||||||
length: 255,
|
|
||||||
nullable: false,
|
|
||||||
comment: '消息标题'
|
|
||||||
})
|
|
||||||
title!: string;
|
|
||||||
|
|
||||||
@Column({
|
|
||||||
type: 'text',
|
|
||||||
nullable: false,
|
|
||||||
comment: '消息内容'
|
|
||||||
})
|
|
||||||
content!: string;
|
|
||||||
|
|
||||||
@Column({
|
|
||||||
type: 'enum',
|
|
||||||
enum: ['system', 'private', 'announce'],
|
|
||||||
nullable: false,
|
|
||||||
comment: '消息类型'
|
|
||||||
})
|
|
||||||
type!: 'system' | 'private' | 'announce';
|
|
||||||
|
|
||||||
@Column({
|
|
||||||
name: 'sender_id',
|
|
||||||
type: 'int',
|
|
||||||
unsigned: true,
|
|
||||||
nullable: true,
|
|
||||||
comment: '发送者ID'
|
|
||||||
})
|
|
||||||
senderId?: number;
|
|
||||||
|
|
||||||
@Column({
|
|
||||||
name: 'sender_name',
|
|
||||||
type: 'varchar',
|
|
||||||
length: 255,
|
|
||||||
nullable: true,
|
|
||||||
comment: '发送者名称'
|
|
||||||
})
|
|
||||||
senderName?: string;
|
|
||||||
|
|
||||||
@CreateDateColumn({
|
|
||||||
name: 'created_at',
|
|
||||||
type: 'timestamp',
|
|
||||||
comment: '创建时间'
|
|
||||||
})
|
|
||||||
createdAt!: Date;
|
|
||||||
|
|
||||||
@UpdateDateColumn({
|
|
||||||
name: 'updated_at',
|
|
||||||
type: 'timestamp',
|
|
||||||
comment: '更新时间'
|
|
||||||
})
|
|
||||||
updatedAt!: Date;
|
|
||||||
|
|
||||||
@OneToMany(() => UserMessage, (userMessage) => userMessage.messageId)
|
|
||||||
userMessages!: UserMessage[];
|
|
||||||
|
|
||||||
@ManyToOne(() => UserEntity, (user) => user.senderMessages)
|
|
||||||
sender?: UserEntity;
|
|
||||||
|
|
||||||
constructor(partial?: Partial<MessageEntity>) {
|
|
||||||
Object.assign(this, partial);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const MessageSchema = z.object({
|
|
||||||
title: z.string().min(1).max(255).openapi({
|
|
||||||
example: '系统通知',
|
|
||||||
description: '消息标题'
|
|
||||||
}),
|
|
||||||
content: z.string().min(1).openapi({
|
|
||||||
example: '您的账户已成功创建',
|
|
||||||
description: '消息内容'
|
|
||||||
}),
|
|
||||||
type: z.enum(['system', 'private', 'announce']).openapi({
|
|
||||||
example: 'system',
|
|
||||||
description: '消息类型'
|
|
||||||
}),
|
|
||||||
senderId: z.number().int().positive().optional().openapi({
|
|
||||||
example: 1,
|
|
||||||
description: '发送者ID'
|
|
||||||
}),
|
|
||||||
senderName: z.string().max(255).optional().openapi({
|
|
||||||
example: '管理员',
|
|
||||||
description: '发送者名称'
|
|
||||||
})
|
|
||||||
});
|
|
||||||
Reference in New Issue
Block a user