diff --git a/backend/src/entities/index.ts b/backend/src/entities/index.ts index 7ab2655..7f1fdc6 100644 --- a/backend/src/entities/index.ts +++ b/backend/src/entities/index.ts @@ -11,3 +11,5 @@ export { Deposit } from './deposit.entity'; export { Classroom } from './classroom.entity'; export { Tenant } from './tenant.entity'; export { ClassroomRental } from './classroom-rental.entity'; +export { Permission } from './permission.entity'; +export { Role } from './role.entity'; diff --git a/backend/src/entities/permission.entity.ts b/backend/src/entities/permission.entity.ts new file mode 100644 index 0000000..ce0773e --- /dev/null +++ b/backend/src/entities/permission.entity.ts @@ -0,0 +1,19 @@ +import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'; + +@Entity('permissions') +export class Permission { + @PrimaryGeneratedColumn() + id: number; + + @Column({ type: 'varchar', length: 50, unique: true }) + code: string; + + @Column({ type: 'varchar', length: 50 }) + name: string; + + @Column({ type: 'varchar', length: 30 }) + group: string; + + @Column({ type: 'varchar', length: 200, nullable: true }) + description: string; +} diff --git a/backend/src/entities/role.entity.ts b/backend/src/entities/role.entity.ts new file mode 100644 index 0000000..5593f89 --- /dev/null +++ b/backend/src/entities/role.entity.ts @@ -0,0 +1,38 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToMany, JoinTable } from 'typeorm'; +import { Permission } from './permission.entity'; +import { User } from './user.entity'; + +@Entity('roles') +export class Role { + @PrimaryGeneratedColumn() + id: number; + + @Column({ type: 'varchar', length: 30, unique: true }) + name: string; + + @Column({ type: 'varchar', length: 200, nullable: true }) + description: string; + + @Column({ name: 'is_system', type: 'boolean', default: false }) + isSystem: boolean; + + @Column({ type: 'tinyint', default: 1 }) + status: number; + + @CreateDateColumn({ name: 'created_at' }) + createdAt: Date; + + @UpdateDateColumn({ name: 'updated_at' }) + updatedAt: Date; + + @ManyToMany(() => Permission) + @JoinTable({ + name: 'role_permissions', + joinColumn: { name: 'role_id', referencedColumnName: 'id' }, + inverseJoinColumn: { name: 'permission_id', referencedColumnName: 'id' }, + }) + permissions: Permission[]; + + @ManyToMany(() => User, (user) => user.roles) + users: User[]; +} diff --git a/backend/src/entities/user.entity.ts b/backend/src/entities/user.entity.ts index 23329b3..86c9348 100644 --- a/backend/src/entities/user.entity.ts +++ b/backend/src/entities/user.entity.ts @@ -1,4 +1,5 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm'; +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToMany, JoinTable } from 'typeorm'; +import { Role } from './role.entity'; @Entity('users') export class User { @@ -11,14 +12,14 @@ export class User { @Column({ name: 'password_hash', length: 255 }) passwordHash: string; - @Column({ type: 'varchar', length: 20, default: 'operator' }) - role: string; + // 移除: @Column({ type: 'varchar', length: 20, default: 'operator' }) + // role: string; @Column({ length: 50, nullable: true }) name: string; - @Column({ name: 'allowed_menus', type: 'text', nullable: true }) - allowedMenus: string; + // 移除: @Column({ name: 'allowed_menus', type: 'text', nullable: true }) + // allowedMenus: string; @Column({ name: 'is_active', default: true }) isActive: boolean; @@ -31,4 +32,12 @@ export class User { @UpdateDateColumn({ name: 'updated_at' }) updatedAt: Date; + + @ManyToMany(() => Role, (role) => role.users) + @JoinTable({ + name: 'user_roles', + joinColumn: { name: 'user_id', referencedColumnName: 'id' }, + inverseJoinColumn: { name: 'role_id', referencedColumnName: 'id' }, + }) + roles: Role[]; }