317 lines
14 KiB
TypeScript
317 lines
14 KiB
TypeScript
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),
|
|
]);
|