- 后端: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>
180 lines
6.6 KiB
SQL
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`); |