feat: 更新目标管理模块,优化数据库表结构和API逻辑

- 修改目标表和目标完成记录表的字段类型,增强数据一致性和查询性能。
- 移除不必要的搜索字段,简化目标查询DTO,提升查询效率。
- 引入目标状态枚举,增强代码可读性和维护性。
- 添加复合索引以优化查询性能,提升系统响应速度。
- 更新目标管理控制器和服务逻辑,确保与新数据库结构的兼容性。
This commit is contained in:
richarjiang
2025-08-22 11:22:27 +08:00
parent ffc0cd1d13
commit acf8d0c48c
8 changed files with 132 additions and 134 deletions

View File

@@ -1,83 +1,60 @@
-- 创建目标表
CREATE TABLE IF NOT EXISTS t_goals (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id VARCHAR(255) NOT NULL,
title VARCHAR(255) NOT NULL,
description TEXT,
repeat_type VARCHAR(20) NOT NULL DEFAULT 'daily' CHECK (repeat_type IN ('daily', 'weekly', 'monthly', 'custom')),
frequency INTEGER NOT NULL DEFAULT 1 CHECK (frequency > 0 AND frequency <= 100),
custom_repeat_rule JSONB,
start_date DATE NOT NULL,
end_date DATE,
status VARCHAR(20) NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'paused', 'completed', 'cancelled')),
completed_count INTEGER NOT NULL DEFAULT 0,
target_count INTEGER CHECK (target_count > 0),
category VARCHAR(100),
priority INTEGER NOT NULL DEFAULT 0 CHECK (priority >= 0 AND priority <= 10),
has_reminder BOOLEAN NOT NULL DEFAULT false,
reminder_time TIME,
reminder_settings JSONB,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
deleted BOOLEAN NOT NULL DEFAULT false
);
CREATE TABLE IF NOT EXISTS `t_goals` (
`id` char(36) NOT NULL COMMENT '主键ID',
`user_id` varchar(255) NOT NULL COMMENT '用户ID',
`title` varchar(255) NOT NULL COMMENT '目标标题',
`description` text COMMENT '目标描述',
`repeat_type` enum('daily','weekly','monthly','custom') NOT NULL DEFAULT 'daily' COMMENT '重复周期类型daily-每日weekly-每周monthly-每月custom-自定义',
`frequency` int NOT NULL DEFAULT 1 COMMENT '频率(每天/每周/每月多少次)',
`custom_repeat_rule` json DEFAULT NULL COMMENT '自定义重复规则(如每周几)',
`start_date` date NOT NULL COMMENT '目标开始日期',
`end_date` date DEFAULT NULL COMMENT '目标结束日期',
`status` enum('active','paused','completed','cancelled') NOT NULL DEFAULT 'active' COMMENT '目标状态:active-激活paused-暂停completed-已完成cancelled-已取消',
`completed_count` int NOT NULL DEFAULT 0 COMMENT '已完成次数',
`target_count` int DEFAULT NULL COMMENT '目标总次数null表示无限制',
`category` varchar(100) DEFAULT NULL COMMENT '目标分类标签',
`priority` int NOT NULL DEFAULT 0 COMMENT '优先级(数字越大优先级越高)',
`has_reminder` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否提醒',
`reminder_time` time DEFAULT NULL COMMENT '提醒时间',
`reminder_settings` json DEFAULT NULL COMMENT '提醒设置(如每周几提醒)',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否已删除',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_status` (`status`),
KEY `idx_repeat_type` (`repeat_type`),
KEY `idx_category` (`category`),
KEY `idx_start_date` (`start_date`),
KEY `idx_deleted` (`deleted`),
KEY `idx_user_status` (`user_id`, `status`, `deleted`),
CONSTRAINT `chk_frequency` CHECK (`frequency` > 0 AND `frequency` <= 100),
CONSTRAINT `chk_priority` CHECK (`priority` >= 0 AND `priority` <= 10),
CONSTRAINT `chk_target_count` CHECK (`target_count` IS NULL OR `target_count` > 0)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户目标表';
-- 创建目标完成记录表
CREATE TABLE IF NOT EXISTS t_goal_completions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
goal_id UUID NOT NULL REFERENCES t_goals(id) ON DELETE CASCADE,
user_id VARCHAR(255) NOT NULL,
completed_at TIMESTAMP WITH TIME ZONE NOT NULL,
completion_count INTEGER NOT NULL DEFAULT 1 CHECK (completion_count > 0),
notes TEXT,
metadata JSONB,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
deleted BOOLEAN NOT NULL DEFAULT false
);
CREATE TABLE IF NOT EXISTS `t_goal_completions` (
`id` char(36) NOT NULL COMMENT '主键ID',
`goal_id` char(36) NOT NULL COMMENT '目标ID',
`user_id` varchar(255) NOT NULL COMMENT '用户ID',
`completed_at` datetime NOT NULL COMMENT '完成日期',
`completion_count` int NOT NULL DEFAULT 1 COMMENT '完成次数',
`notes` text COMMENT '完成备注',
`metadata` json DEFAULT NULL COMMENT '完成时的额外数据',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否已删除',
PRIMARY KEY (`id`),
KEY `idx_goal_id` (`goal_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_completed_at` (`completed_at`),
KEY `idx_deleted` (`deleted`),
KEY `idx_goal_completed` (`goal_id`, `completed_at`, `deleted`),
CONSTRAINT `fk_goal_completions_goal` FOREIGN KEY (`goal_id`) REFERENCES `t_goals` (`id`) ON DELETE CASCADE,
CONSTRAINT `chk_completion_count` CHECK (`completion_count` > 0)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='目标完成记录表';
-- 创建索引
CREATE INDEX IF NOT EXISTS idx_goals_user_id ON t_goals(user_id);
CREATE INDEX IF NOT EXISTS idx_goals_status ON t_goals(status);
CREATE INDEX IF NOT EXISTS idx_goals_repeat_type ON t_goals(repeat_type);
CREATE INDEX IF NOT EXISTS idx_goals_category ON t_goals(category);
CREATE INDEX IF NOT EXISTS idx_goals_start_date ON t_goals(start_date);
CREATE INDEX IF NOT EXISTS idx_goals_deleted ON t_goals(deleted);
CREATE INDEX IF NOT EXISTS idx_goal_completions_goal_id ON t_goal_completions(goal_id);
CREATE INDEX IF NOT EXISTS idx_goal_completions_user_id ON t_goal_completions(user_id);
CREATE INDEX IF NOT EXISTS idx_goal_completions_completed_at ON t_goal_completions(completed_at);
CREATE INDEX IF NOT EXISTS idx_goal_completions_deleted ON t_goal_completions(deleted);
-- 创建复合索引
CREATE INDEX IF NOT EXISTS idx_goals_user_status ON t_goals(user_id, status);
CREATE INDEX IF NOT EXISTS idx_goal_completions_goal_completed ON t_goal_completions(goal_id, completed_at);
-- 添加注释
COMMENT ON TABLE t_goals IS '用户目标表';
COMMENT ON COLUMN t_goals.id IS '目标ID';
COMMENT ON COLUMN t_goals.user_id IS '用户ID';
COMMENT ON COLUMN t_goals.title IS '目标标题';
COMMENT ON COLUMN t_goals.description IS '目标描述';
COMMENT ON COLUMN t_goals.repeat_type IS '重复周期类型daily-每日weekly-每周monthly-每月custom-自定义';
COMMENT ON COLUMN t_goals.frequency IS '频率(每天/每周/每月多少次)';
COMMENT ON COLUMN t_goals.custom_repeat_rule IS '自定义重复规则(如每周几)';
COMMENT ON COLUMN t_goals.start_date IS '目标开始日期';
COMMENT ON COLUMN t_goals.end_date IS '目标结束日期';
COMMENT ON COLUMN t_goals.status IS '目标状态active-激活paused-暂停completed-已完成cancelled-已取消';
COMMENT ON COLUMN t_goals.completed_count IS '已完成次数';
COMMENT ON COLUMN t_goals.target_count IS '目标总次数null表示无限制';
COMMENT ON COLUMN t_goals.category IS '目标分类标签';
COMMENT ON COLUMN t_goals.priority IS '优先级(数字越大优先级越高)';
COMMENT ON COLUMN t_goals.has_reminder IS '是否提醒';
COMMENT ON COLUMN t_goals.reminder_time IS '提醒时间';
COMMENT ON COLUMN t_goals.reminder_settings IS '提醒设置(如每周几提醒)';
COMMENT ON TABLE t_goal_completions IS '目标完成记录表';
COMMENT ON COLUMN t_goal_completions.id IS '完成记录ID';
COMMENT ON COLUMN t_goal_completions.goal_id IS '目标ID';
COMMENT ON COLUMN t_goal_completions.user_id IS '用户ID';
COMMENT ON COLUMN t_goal_completions.completed_at IS '完成日期';
COMMENT ON COLUMN t_goal_completions.completion_count IS '完成次数';
COMMENT ON COLUMN t_goal_completions.notes IS '完成备注';
COMMENT ON COLUMN t_goal_completions.metadata IS '完成时的额外数据';
-- 创建额外的复合索引以优化查询性能
CREATE INDEX IF NOT EXISTS `idx_goals_user_date` ON `t_goals` (`user_id`, `start_date`, `deleted`);
CREATE INDEX IF NOT EXISTS `idx_goal_completions_user_date` ON `t_goal_completions` (`user_id`, `completed_at`, `deleted`);