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), ], );