devperf/backend/drizzle/0000_grey_anita_blake.sql
zyc 44464dd334 feat: DevPerf Dashboard 研发人效看板 v1.0
- 后端:Bun + Hono + Drizzle ORM + SQLite
- 前端:Vue 3 + Naive UI + ECharts
- 项目管理:创建项目 + 绑定 Git 仓库
- OKR 系统:目标/关键结果 CRUD + 进度追踪
- Git 同步:Gitea API 自动同步 commit/PR + 作者关联
- 数据看板:项目 OKR 进度 + KR 状态分布 + 代码活动
- 权限体系:admin/manager/developer/viewer 四级
- Docker 部署:docker-compose + nginx

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 17:57:14 +08:00

180 lines
6.6 KiB
SQL

CREATE TABLE `author_mappings` (
`id` text PRIMARY KEY NOT NULL,
`git_email` text,
`git_username` text,
`user_id` text,
`created_at` integer NOT NULL,
`updated_at` integer NOT NULL,
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action
);
--> statement-breakpoint
CREATE UNIQUE INDEX `uniq_mapping_email` ON `author_mappings` (`git_email`);--> statement-breakpoint
CREATE UNIQUE INDEX `uniq_mapping_username` ON `author_mappings` (`git_username`);--> statement-breakpoint
CREATE TABLE `git_commits` (
`id` text PRIMARY KEY NOT NULL,
`repo_name` text NOT NULL,
`sha` text NOT NULL,
`author_email` text,
`author_name` text,
`user_id` text,
`message` text,
`additions` integer DEFAULT 0,
`deletions` integer DEFAULT 0,
`committed_at` integer NOT NULL,
`created_at` integer NOT NULL,
`updated_at` integer NOT NULL,
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action
);
--> statement-breakpoint
CREATE UNIQUE INDEX `git_commits_sha_unique` ON `git_commits` (`sha`);--> statement-breakpoint
CREATE UNIQUE INDEX `uniq_commits_sha` ON `git_commits` (`sha`);--> statement-breakpoint
CREATE INDEX `idx_commits_user` ON `git_commits` (`user_id`);--> statement-breakpoint
CREATE INDEX `idx_commits_repo` ON `git_commits` (`repo_name`);--> statement-breakpoint
CREATE INDEX `idx_commits_committed_at` ON `git_commits` (`committed_at`);--> statement-breakpoint
CREATE TABLE `git_prs` (
`id` text PRIMARY KEY NOT NULL,
`repo_name` text NOT NULL,
`external_id` integer NOT NULL,
`title` text,
`user_id` text,
`author_username` text,
`state` text,
`additions` integer DEFAULT 0,
`deletions` integer DEFAULT 0,
`review_comments` integer DEFAULT 0,
`created_at` integer,
`merged_at` integer,
`merge_time_hours` real,
`updated_at` integer NOT NULL,
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action
);
--> statement-breakpoint
CREATE INDEX `idx_prs_user` ON `git_prs` (`user_id`);--> statement-breakpoint
CREATE INDEX `idx_prs_repo` ON `git_prs` (`repo_name`);--> statement-breakpoint
CREATE INDEX `idx_prs_state` ON `git_prs` (`state`);--> statement-breakpoint
CREATE TABLE `key_results` (
`id` text PRIMARY KEY NOT NULL,
`objective_id` text NOT NULL,
`title` text NOT NULL,
`target_value` real NOT NULL,
`current_value` real DEFAULT 0,
`unit` text,
`weight` real DEFAULT 1,
`linked_plane_cycle_id` text,
`linked_plane_module_id` text,
`created_at` integer NOT NULL,
`updated_at` integer NOT NULL,
FOREIGN KEY (`objective_id`) REFERENCES `objectives`(`id`) ON UPDATE no action ON DELETE no action
);
--> statement-breakpoint
CREATE INDEX `idx_kr_objective` ON `key_results` (`objective_id`);--> statement-breakpoint
CREATE TABLE `milestones` (
`id` text PRIMARY KEY NOT NULL,
`plane_module_id` text NOT NULL,
`project_id` text,
`name` text NOT NULL,
`status` text,
`target_date` text,
`total_issues` integer DEFAULT 0,
`completed_issues` integer DEFAULT 0,
`created_at` integer NOT NULL,
`updated_at` integer NOT NULL,
FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON UPDATE no action ON DELETE no action
);
--> statement-breakpoint
CREATE INDEX `idx_milestone_project` ON `milestones` (`project_id`);--> statement-breakpoint
CREATE TABLE `objectives` (
`id` text PRIMARY KEY NOT NULL,
`title` text NOT NULL,
`owner_id` text,
`project_id` text,
`period` text NOT NULL,
`progress` real DEFAULT 0,
`created_at` integer NOT NULL,
`updated_at` integer NOT NULL,
FOREIGN KEY (`owner_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action,
FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON UPDATE no action ON DELETE no action
);
--> statement-breakpoint
CREATE INDEX `idx_obj_period` ON `objectives` (`period`);--> statement-breakpoint
CREATE INDEX `idx_obj_owner` ON `objectives` (`owner_id`);--> statement-breakpoint
CREATE TABLE `projects` (
`id` text PRIMARY KEY NOT NULL,
`plane_project_id` text NOT NULL,
`name` text NOT NULL,
`identifier` text,
`last_synced_at` integer,
`created_at` integer NOT NULL,
`updated_at` integer NOT NULL
);
--> statement-breakpoint
CREATE UNIQUE INDEX `uniq_projects_plane_id` ON `projects` (`plane_project_id`);--> statement-breakpoint
CREATE TABLE `sprint_snapshots` (
`id` text PRIMARY KEY NOT NULL,
`project_id` text,
`plane_cycle_id` text NOT NULL,
`name` text NOT NULL,
`start_date` text,
`end_date` text,
`total_points` integer DEFAULT 0,
`completed_points` integer DEFAULT 0,
`total_issues` integer DEFAULT 0,
`completed_issues` integer DEFAULT 0,
`burndown_data` text,
`status` text,
`created_at` integer NOT NULL,
`updated_at` integer NOT NULL,
FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON UPDATE no action ON DELETE no action
);
--> statement-breakpoint
CREATE INDEX `idx_sprint_project` ON `sprint_snapshots` (`project_id`);--> statement-breakpoint
CREATE INDEX `idx_sprint_status` ON `sprint_snapshots` (`status`);--> statement-breakpoint
CREATE TABLE `sync_logs` (
`id` text PRIMARY KEY NOT NULL,
`source` text NOT NULL,
`status` text NOT NULL,
`message` text,
`records_processed` integer DEFAULT 0,
`synced_at` integer NOT NULL
);
--> statement-breakpoint
CREATE TABLE `task_snapshots` (
`id` text PRIMARY KEY NOT NULL,
`plane_issue_id` text NOT NULL,
`project_id` text,
`sprint_id` text,
`title` text NOT NULL,
`status` text,
`priority` text,
`assignee_id` text,
`story_points` integer,
`created_at` integer,
`completed_at` integer,
`due_date` text,
`labels` text,
`updated_at` integer NOT NULL,
FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON UPDATE no action ON DELETE no action,
FOREIGN KEY (`sprint_id`) REFERENCES `sprint_snapshots`(`id`) ON UPDATE no action ON DELETE no action,
FOREIGN KEY (`assignee_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action
);
--> statement-breakpoint
CREATE INDEX `idx_task_project` ON `task_snapshots` (`project_id`);--> statement-breakpoint
CREATE INDEX `idx_task_sprint` ON `task_snapshots` (`sprint_id`);--> statement-breakpoint
CREATE INDEX `idx_task_assignee` ON `task_snapshots` (`assignee_id`);--> statement-breakpoint
CREATE INDEX `idx_task_status` ON `task_snapshots` (`status`);--> statement-breakpoint
CREATE TABLE `users` (
`id` text PRIMARY KEY NOT NULL,
`plane_user_id` text,
`display_name` text NOT NULL,
`email` text NOT NULL,
`git_username` text,
`role` text NOT NULL,
`password_hash` text NOT NULL,
`login_attempts` integer DEFAULT 0,
`locked_until` integer,
`created_at` integer NOT NULL,
`updated_at` integer NOT NULL
);
--> statement-breakpoint
CREATE UNIQUE INDEX `users_email_unique` ON `users` (`email`);--> statement-breakpoint
CREATE UNIQUE INDEX `uniq_users_email` ON `users` (`email`);