import { mysqlTable, mysqlSchema, AnyMySqlColumn, index, primaryKey, unique, bigint, varchar, text, int, json, datetime, tinyint, date } from "drizzle-orm/mysql-core" import { sql } from "drizzle-orm" export const sysDictItems = mysqlTable("sys_dict_items", { id: bigint({ mode: "number" }).notNull(), typeId: bigint("type_id", { mode: "number" }).notNull(), itemKey: varchar("item_key", { length: 50 }).notNull(), itemValue: varchar("item_value", { length: 200 }).notNull(), label: varchar({ length: 100 }).notNull(), labelEn: varchar("label_en", { length: 200 }), 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(), cssClass: varchar("css_class", { length: 50 }), color: 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'}), }, (table) => [ index("idx_deleted_at").on(table.deletedAt), index("idx_key").on(table.itemKey), index("idx_pid").on(table.pid), index("idx_sort").on(table.typeId, table.sortOrder), index("idx_status").on(table.status), index("idx_type_id").on(table.typeId), primaryKey({ columns: [table.id], name: "sys_dict_items_id"}), unique("uk_type_key").on(table.typeId, table.itemKey, table.deletedAt), ]); export const sysDictTypes = mysqlTable("sys_dict_types", { 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(), status: varchar({ length: 20 }).default('active').notNull(), isSystem: tinyint("is_system").default(0).notNull(), sortOrder: int("sort_order").default(0).notNull(), 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_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_dict_types_id"}), unique("uk_code").on(table.code, table.deletedAt), ]); 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), ]);