cursor-init/drizzle/schema.ts

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