360 lines
14 KiB
TypeScript
360 lines
14 KiB
TypeScript
import {
|
|
mysqlTable,
|
|
mysqlSchema,
|
|
AnyMySqlColumn,
|
|
index,
|
|
primaryKey,
|
|
unique,
|
|
bigint,
|
|
varchar,
|
|
int,
|
|
json,
|
|
timestamp,
|
|
text,
|
|
datetime,
|
|
tinyint,
|
|
date,
|
|
} from 'drizzle-orm/mysql-core';
|
|
import { sql } from 'drizzle-orm';
|
|
|
|
export const sysDict = mysqlTable(
|
|
'sys_dict',
|
|
{
|
|
id: bigint({ mode: 'number' }).autoincrement().notNull(),
|
|
code: varchar({ length: 50 }).notNull(),
|
|
name: varchar({ length: 100 }).notNull(),
|
|
value: varchar({ length: 200 }),
|
|
description: varchar({ length: 500 }),
|
|
icon: varchar({ length: 100 }),
|
|
pid: bigint({ mode: 'number' }),
|
|
level: int().default(1).notNull(),
|
|
sortOrder: int('sort_order').default(0).notNull(),
|
|
status: varchar({ length: 20 }).default('active').notNull(),
|
|
isSystem: tinyint('is_system').default(0).notNull(),
|
|
color: varchar({ length: 20 }),
|
|
extra: json(),
|
|
createdAt: timestamp('created_at', { mode: 'string' }).defaultNow().notNull(),
|
|
updatedAt: timestamp('updated_at', { mode: 'string' }).defaultNow().onUpdateNow().notNull(),
|
|
},
|
|
(table) => [
|
|
index('idx_level').on(table.level),
|
|
index('idx_pid').on(table.pid),
|
|
index('idx_sort').on(table.sortOrder),
|
|
index('idx_status').on(table.status),
|
|
primaryKey({ columns: [table.id], name: 'sys_dict_id' }),
|
|
unique('uk_code').on(table.code),
|
|
],
|
|
);
|
|
|
|
export const sysOperationLogs = mysqlTable(
|
|
'sys_operation_logs',
|
|
{
|
|
id: bigint({ mode: 'number' }).notNull(),
|
|
userId: bigint('user_id', { mode: 'number' }),
|
|
username: varchar({ length: 100 }),
|
|
module: varchar({ length: 50 }).notNull(),
|
|
action: varchar({ length: 50 }).notNull(),
|
|
target: varchar({ length: 200 }),
|
|
targetId: bigint('target_id', { mode: 'number' }),
|
|
requestData: text('request_data'),
|
|
responseData: text('response_data'),
|
|
status: varchar({ length: 20 }).notNull(),
|
|
ip: varchar({ length: 45 }),
|
|
userAgent: varchar('user_agent', { length: 200 }),
|
|
duration: bigint({ mode: 'number' }),
|
|
errorMsg: text('error_msg'),
|
|
createdAt: datetime('created_at', { mode: 'string' })
|
|
.default(sql`(CURRENT_TIMESTAMP)`)
|
|
.notNull(),
|
|
},
|
|
(table) => [
|
|
index('idx_created_at').on(table.createdAt),
|
|
index('idx_ip').on(table.ip),
|
|
index('idx_module_action').on(table.module, table.action),
|
|
index('idx_status').on(table.status),
|
|
index('idx_target').on(table.targetId),
|
|
index('idx_user_id').on(table.userId),
|
|
primaryKey({ columns: [table.id], name: 'sys_operation_logs_id' }),
|
|
],
|
|
);
|
|
|
|
export const sysOrganizations = mysqlTable(
|
|
'sys_organizations',
|
|
{
|
|
id: bigint({ mode: 'number' }).notNull(),
|
|
code: varchar({ length: 100 }).notNull(),
|
|
name: varchar({ length: 200 }).notNull(),
|
|
fullName: varchar('full_name', { length: 200 }),
|
|
description: text(),
|
|
pid: bigint({ mode: 'number' }),
|
|
path: varchar({ length: 500 }),
|
|
level: int().default(1).notNull(),
|
|
type: varchar({ length: 20 }),
|
|
status: varchar({ length: 20 }).default('active').notNull(),
|
|
sortOrder: int('sort_order').default(0).notNull(),
|
|
leaderId: bigint('leader_id', { mode: 'number' }),
|
|
address: varchar({ length: 200 }),
|
|
phone: varchar({ length: 50 }),
|
|
extra: json(),
|
|
createdBy: bigint('created_by', { mode: 'number' }),
|
|
createdAt: datetime('created_at', { mode: 'string' })
|
|
.default(sql`(CURRENT_TIMESTAMP)`)
|
|
.notNull(),
|
|
updatedBy: bigint('updated_by', { mode: 'number' }),
|
|
updatedAt: datetime('updated_at', { mode: 'string' })
|
|
.default(sql`(CURRENT_TIMESTAMP)`)
|
|
.notNull(),
|
|
deletedAt: datetime('deleted_at', { mode: 'string' }),
|
|
version: int().default(1).notNull(),
|
|
},
|
|
(table) => [
|
|
index('idx_deleted_at').on(table.deletedAt),
|
|
index('idx_leader_id').on(table.leaderId),
|
|
index('idx_name').on(table.name),
|
|
index('idx_path').on(table.path),
|
|
index('idx_pid').on(table.pid),
|
|
index('idx_sort').on(table.pid, table.sortOrder),
|
|
index('idx_status').on(table.status),
|
|
index('idx_type').on(table.type),
|
|
primaryKey({ columns: [table.id], name: 'sys_organizations_id' }),
|
|
unique('uk_code').on(table.code, table.deletedAt),
|
|
],
|
|
);
|
|
|
|
export const sysPermissions = mysqlTable(
|
|
'sys_permissions',
|
|
{
|
|
id: bigint({ mode: 'number' }).notNull(),
|
|
code: varchar({ length: 100 }).notNull(),
|
|
name: varchar({ length: 100 }).notNull(),
|
|
type: varchar({ length: 20 }).notNull(),
|
|
resource: varchar({ length: 50 }),
|
|
action: varchar({ length: 50 }),
|
|
description: text(),
|
|
pid: bigint({ mode: 'number' }),
|
|
path: varchar({ length: 500 }),
|
|
level: int().default(1).notNull(),
|
|
sortOrder: int('sort_order').default(0).notNull(),
|
|
status: varchar({ length: 20 }).default('active').notNull(),
|
|
meta: json(),
|
|
createdBy: bigint('created_by', { mode: 'number' }),
|
|
createdAt: datetime('created_at', { mode: 'string' })
|
|
.default(sql`(CURRENT_TIMESTAMP)`)
|
|
.notNull(),
|
|
updatedBy: bigint('updated_by', { mode: 'number' }),
|
|
updatedAt: datetime('updated_at', { mode: 'string' })
|
|
.default(sql`(CURRENT_TIMESTAMP)`)
|
|
.notNull(),
|
|
deletedAt: datetime('deleted_at', { mode: 'string' }),
|
|
},
|
|
(table) => [
|
|
index('idx_deleted_at').on(table.deletedAt),
|
|
index('idx_pid').on(table.pid),
|
|
index('idx_resource_action').on(table.resource, table.action),
|
|
index('idx_sort').on(table.pid, table.sortOrder),
|
|
index('idx_status').on(table.status),
|
|
index('idx_type').on(table.type),
|
|
primaryKey({ columns: [table.id], name: 'sys_permissions_id' }),
|
|
unique('uk_code').on(table.code, table.deletedAt),
|
|
],
|
|
);
|
|
|
|
export const sysRolePermissions = mysqlTable(
|
|
'sys_role_permissions',
|
|
{
|
|
id: bigint({ mode: 'number' }).notNull(),
|
|
roleId: bigint('role_id', { mode: 'number' }).notNull(),
|
|
permissionId: bigint('permission_id', { mode: 'number' }).notNull(),
|
|
isHalf: tinyint('is_half').default(0).notNull(),
|
|
createdBy: bigint('created_by', { mode: 'number' }),
|
|
createdAt: datetime('created_at', { mode: 'string' })
|
|
.default(sql`(CURRENT_TIMESTAMP)`)
|
|
.notNull(),
|
|
},
|
|
(table) => [
|
|
index('idx_is_half').on(table.isHalf),
|
|
index('idx_permission_id').on(table.permissionId),
|
|
index('idx_role_id').on(table.roleId),
|
|
primaryKey({ columns: [table.id], name: 'sys_role_permissions_id' }),
|
|
unique('uk_role_permission').on(table.roleId, table.permissionId),
|
|
],
|
|
);
|
|
|
|
export const sysRoles = mysqlTable(
|
|
'sys_roles',
|
|
{
|
|
id: bigint({ mode: 'number' }).notNull(),
|
|
code: varchar({ length: 50 }).notNull(),
|
|
name: varchar({ length: 100 }).notNull(),
|
|
description: text(),
|
|
pid: bigint({ mode: 'number' }),
|
|
path: varchar({ length: 500 }),
|
|
level: int().default(1).notNull(),
|
|
sortOrder: int('sort_order').default(0).notNull(),
|
|
status: varchar({ length: 20 }).default('active').notNull(),
|
|
isSystem: tinyint('is_system').default(0).notNull(),
|
|
permissionsSnapshot: json('permissions_snapshot'),
|
|
extra: json(),
|
|
createdBy: bigint('created_by', { mode: 'number' }),
|
|
createdAt: datetime('created_at', { mode: 'string' })
|
|
.default(sql`(CURRENT_TIMESTAMP)`)
|
|
.notNull(),
|
|
updatedBy: bigint('updated_by', { mode: 'number' }),
|
|
updatedAt: datetime('updated_at', { mode: 'string' })
|
|
.default(sql`(CURRENT_TIMESTAMP)`)
|
|
.notNull(),
|
|
deletedAt: datetime('deleted_at', { mode: 'string' }),
|
|
version: int().default(1).notNull(),
|
|
},
|
|
(table) => [
|
|
index('idx_deleted_at').on(table.deletedAt),
|
|
index('idx_is_system').on(table.isSystem),
|
|
index('idx_name').on(table.name),
|
|
index('idx_path').on(table.path),
|
|
index('idx_pid').on(table.pid),
|
|
index('idx_sort').on(table.pid, table.sortOrder),
|
|
index('idx_status').on(table.status),
|
|
primaryKey({ columns: [table.id], name: 'sys_roles_id' }),
|
|
unique('uk_code').on(table.code, table.deletedAt),
|
|
],
|
|
);
|
|
|
|
export const sysTags = mysqlTable(
|
|
'sys_tags',
|
|
{
|
|
id: bigint({ mode: 'number' }).notNull(),
|
|
name: varchar({ length: 50 }).notNull(),
|
|
type: varchar({ length: 50 }).default('user'),
|
|
color: varchar({ length: 50 }),
|
|
description: text(),
|
|
usageCount: int('usage_count').default(0).notNull(),
|
|
createdBy: bigint('created_by', { mode: 'number' }),
|
|
createdAt: datetime('created_at', { mode: 'string' })
|
|
.default(sql`(CURRENT_TIMESTAMP)`)
|
|
.notNull(),
|
|
deletedAt: datetime('deleted_at', { mode: 'string' }),
|
|
},
|
|
(table) => [
|
|
index('idx_deleted_at').on(table.deletedAt),
|
|
index('idx_name').on(table.name),
|
|
index('idx_type').on(table.type),
|
|
index('idx_usage_count').on(table.usageCount),
|
|
primaryKey({ columns: [table.id], name: 'sys_tags_id' }),
|
|
unique('uk_name_type').on(table.name, table.type, table.deletedAt),
|
|
],
|
|
);
|
|
|
|
export const sysUserOrganizations = mysqlTable(
|
|
'sys_user_organizations',
|
|
{
|
|
id: bigint({ mode: 'number' }).notNull(),
|
|
userId: bigint('user_id', { mode: 'number' }).notNull(),
|
|
organizationId: bigint('organization_id', { mode: 'number' }).notNull(),
|
|
isPrimary: tinyint('is_primary').default(0).notNull(),
|
|
position: varchar({ length: 100 }),
|
|
joinedAt: datetime('joined_at', { mode: 'string' })
|
|
.default(sql`(CURRENT_TIMESTAMP)`)
|
|
.notNull(),
|
|
createdBy: bigint('created_by', { mode: 'number' }),
|
|
createdAt: datetime('created_at', { mode: 'string' })
|
|
.default(sql`(CURRENT_TIMESTAMP)`)
|
|
.notNull(),
|
|
},
|
|
(table) => [
|
|
index('idx_is_primary').on(table.isPrimary),
|
|
index('idx_joined_at').on(table.joinedAt),
|
|
index('idx_organization_id').on(table.organizationId),
|
|
index('idx_user_id').on(table.userId),
|
|
primaryKey({ columns: [table.id], name: 'sys_user_organizations_id' }),
|
|
unique('uk_user_org').on(table.userId, table.organizationId),
|
|
],
|
|
);
|
|
|
|
export const sysUserRoles = mysqlTable(
|
|
'sys_user_roles',
|
|
{
|
|
id: bigint({ mode: 'number' }).notNull(),
|
|
userId: bigint('user_id', { mode: 'number' }).notNull(),
|
|
roleId: bigint('role_id', { mode: 'number' }).notNull(),
|
|
expiredAt: datetime('expired_at', { mode: 'string' }),
|
|
createdBy: bigint('created_by', { mode: 'number' }),
|
|
createdAt: datetime('created_at', { mode: 'string' })
|
|
.default(sql`(CURRENT_TIMESTAMP)`)
|
|
.notNull(),
|
|
},
|
|
(table) => [
|
|
index('idx_created_at').on(table.createdAt),
|
|
index('idx_expired_at').on(table.expiredAt),
|
|
index('idx_role_id').on(table.roleId),
|
|
index('idx_user_id').on(table.userId),
|
|
primaryKey({ columns: [table.id], name: 'sys_user_roles_id' }),
|
|
unique('uk_user_role').on(table.userId, table.roleId),
|
|
],
|
|
);
|
|
|
|
export const sysUserTags = mysqlTable(
|
|
'sys_user_tags',
|
|
{
|
|
id: bigint({ mode: 'number' }).notNull(),
|
|
userId: bigint('user_id', { mode: 'number' }).notNull(),
|
|
tagId: bigint('tag_id', { mode: 'number' }).notNull(),
|
|
createdBy: bigint('created_by', { mode: 'number' }),
|
|
createdAt: datetime('created_at', { mode: 'string' })
|
|
.default(sql`(CURRENT_TIMESTAMP)`)
|
|
.notNull(),
|
|
},
|
|
(table) => [
|
|
index('idx_created_at').on(table.createdAt),
|
|
index('idx_tag_id').on(table.tagId),
|
|
index('idx_user_id').on(table.userId),
|
|
primaryKey({ columns: [table.id], name: 'sys_user_tags_id' }),
|
|
unique('uk_user_tag').on(table.userId, table.tagId),
|
|
],
|
|
);
|
|
|
|
export const sysUsers = mysqlTable(
|
|
'sys_users',
|
|
{
|
|
id: bigint({ mode: 'number' }).notNull(),
|
|
username: varchar({ length: 50 }).notNull(),
|
|
email: varchar({ length: 100 }).notNull(),
|
|
mobile: varchar({ length: 20 }),
|
|
passwordHash: varchar('password_hash', { length: 255 }).notNull(),
|
|
avatar: varchar({ length: 255 }),
|
|
nickname: varchar({ length: 100 }),
|
|
status: varchar({ length: 20 }).default('active').notNull(),
|
|
gender: tinyint().default(0),
|
|
// you can use { mode: 'date' }, if you want to have Date as type for this column
|
|
birthday: date({ mode: 'string' }),
|
|
bio: varchar({ length: 500 }),
|
|
loginCount: int('login_count').default(0).notNull(),
|
|
lastLoginAt: datetime('last_login_at', { mode: 'string' }),
|
|
lastLoginIp: varchar('last_login_ip', { length: 45 }),
|
|
failedAttempts: int('failed_attempts').default(0).notNull(),
|
|
lockedUntil: datetime('locked_until', { mode: 'string' }),
|
|
isRoot: tinyint('is_root').default(0).notNull(),
|
|
extra: json(),
|
|
createdBy: bigint('created_by', { mode: 'number' }),
|
|
createdAt: datetime('created_at', { mode: 'string' })
|
|
.default(sql`(CURRENT_TIMESTAMP)`)
|
|
.notNull(),
|
|
updatedBy: bigint('updated_by', { mode: 'number' }),
|
|
updatedAt: datetime('updated_at', { mode: 'string' })
|
|
.default(sql`(CURRENT_TIMESTAMP)`)
|
|
.notNull(),
|
|
deletedAt: datetime('deleted_at', { mode: 'string' }),
|
|
version: int().default(1).notNull(),
|
|
},
|
|
(table) => [
|
|
index('idx_created_at').on(table.createdAt),
|
|
index('idx_deleted_at').on(table.deletedAt),
|
|
index('idx_is_root').on(table.isRoot),
|
|
index('idx_last_login').on(table.lastLoginAt),
|
|
index('idx_mobile').on(table.mobile),
|
|
index('idx_status').on(table.status),
|
|
primaryKey({ columns: [table.id], name: 'sys_users_id' }),
|
|
unique('uk_email').on(table.email, table.deletedAt),
|
|
unique('uk_username').on(table.username, table.deletedAt),
|
|
],
|
|
);
|