143 lines
3.4 KiB
TypeScript
143 lines
3.4 KiB
TypeScript
import {
|
||
Entity,
|
||
Column,
|
||
PrimaryGeneratedColumn,
|
||
CreateDateColumn,
|
||
UpdateDateColumn,
|
||
Index,
|
||
} from 'typeorm';
|
||
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
|
||
|
||
@Entity('users')
|
||
export class User {
|
||
@ApiProperty({ description: '用户ID', example: 1 })
|
||
@PrimaryGeneratedColumn({ name: 'user_id' })
|
||
userId: number;
|
||
|
||
@ApiPropertyOptional({
|
||
description: '微信 openId',
|
||
example: 'openid123456',
|
||
maxLength: 100,
|
||
})
|
||
@Column({ name: 'open_id', type: 'varchar', length: 100, nullable: true })
|
||
@Index()
|
||
openId?: string;
|
||
|
||
@ApiPropertyOptional({
|
||
description: '微信 unionId',
|
||
example: 'unionid123456',
|
||
maxLength: 100,
|
||
})
|
||
@Column({ name: 'union_id', type: 'varchar', length: 100, nullable: true })
|
||
@Index()
|
||
unionId?: string;
|
||
|
||
@ApiProperty({
|
||
description: '用户名',
|
||
example: 'john_doe',
|
||
maxLength: 100,
|
||
})
|
||
@Column({ name: 'username', type: 'varchar', length: 100 })
|
||
@Index()
|
||
username: string;
|
||
|
||
@ApiProperty({
|
||
description: '密码哈希值(bcrypt加密)',
|
||
example: '$2b$10$...',
|
||
maxLength: 255,
|
||
})
|
||
@Column({ name: 'password_hash', type: 'varchar', length: 255 })
|
||
passwordHash: string;
|
||
|
||
@ApiProperty({
|
||
description: '邮箱',
|
||
example: 'user@example.com',
|
||
maxLength: 100,
|
||
})
|
||
@Column({ name: 'email', type: 'varchar', length: 100 })
|
||
@Index()
|
||
email: string;
|
||
|
||
@ApiPropertyOptional({
|
||
description: '电话号码',
|
||
example: '13800138000',
|
||
maxLength: 20,
|
||
})
|
||
@Column({ name: 'phone', type: 'varchar', length: 20, nullable: true })
|
||
@Index()
|
||
phone?: string;
|
||
|
||
@ApiPropertyOptional({
|
||
description: '用户昵称',
|
||
example: 'John Doe',
|
||
maxLength: 100,
|
||
})
|
||
@Column({ name: 'nickname', type: 'varchar', length: 100, nullable: true })
|
||
nickname?: string;
|
||
|
||
@ApiPropertyOptional({
|
||
description: '头像URL',
|
||
example: 'https://example.com/avatar.jpg',
|
||
maxLength: 255,
|
||
})
|
||
@Column({
|
||
name: 'avatar_url',
|
||
type: 'varchar',
|
||
length: 255,
|
||
nullable: true,
|
||
})
|
||
avatarUrl?: string;
|
||
|
||
@ApiProperty({
|
||
description: '创建时间',
|
||
example: '2024-01-01T00:00:00.000Z',
|
||
})
|
||
@CreateDateColumn({ name: 'created_at' })
|
||
createdAt: Date;
|
||
|
||
@ApiProperty({
|
||
description: '更新时间',
|
||
example: '2024-01-01T00:00:00.000Z',
|
||
})
|
||
@UpdateDateColumn({ name: 'updated_at' })
|
||
updatedAt: Date;
|
||
|
||
@ApiPropertyOptional({
|
||
description: '最后登录时间',
|
||
example: '2024-01-01T00:00:00.000Z',
|
||
})
|
||
@Column({ name: 'last_login_at', type: 'timestamp', nullable: true })
|
||
lastLoginAt?: Date;
|
||
|
||
@ApiProperty({
|
||
description: '用户状态',
|
||
example: 'active',
|
||
enum: ['active', 'inactive', 'deleted'],
|
||
default: 'active',
|
||
})
|
||
@Column({
|
||
name: 'status',
|
||
type: 'varchar',
|
||
length: 20,
|
||
default: 'active',
|
||
nullable: false,
|
||
})
|
||
status: string;
|
||
|
||
@ApiProperty({
|
||
description: '用户角色',
|
||
example: 'user',
|
||
enum: ['user', 'admin', 'super_admin'],
|
||
default: 'user',
|
||
})
|
||
@Column({
|
||
name: 'role',
|
||
type: 'varchar',
|
||
length: 20,
|
||
default: 'user',
|
||
nullable: false,
|
||
})
|
||
@Index()
|
||
role: string;
|
||
}
|