新增功能: - 文件和文件夹收藏功能 - 收藏页面在侧边栏(文档和设置之间) - 桌面端右键菜单收藏选项 - 移动端触摸菜单收藏选项 技术实现: - 数据库添加 is_favorite 字段和索引 - 后端 API:获取收藏列表、切换收藏状态 - 前端组件:FileCard 收藏按钮、MobileMenu 移动端菜单 - 响应式设计:桌面端和移动端不同交互方式 用户体验: - 收藏文件显示黄色星标 - 实时状态更新,无需刷新页面 - 收藏成功/失败通知提示 - 支持所有存储类型(本地、OneDrive、阿里云OSS等) 文档: - 添加功能实现文档 - 数据库迁移脚本 - 完整的测试覆盖 兼容性: - 支持本地存储和所有云存储提供商 - 跨平台响应式设计 - 向后兼容现有数据
88 lines
2.7 KiB
PL/PgSQL
88 lines
2.7 KiB
PL/PgSQL
-- FoomClous 数据库表结构
|
|
|
|
-- 启用 UUID 扩展
|
|
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
|
|
|
|
-- 文件表
|
|
CREATE TABLE IF NOT EXISTS files (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name VARCHAR(255) NOT NULL,
|
|
stored_name VARCHAR(255) NOT NULL,
|
|
type VARCHAR(20) NOT NULL CHECK (type IN ('image', 'video', 'audio', 'document', 'other')),
|
|
mime_type VARCHAR(100),
|
|
size BIGINT NOT NULL,
|
|
path VARCHAR(500) NOT NULL,
|
|
thumbnail_path VARCHAR(500),
|
|
width INT,
|
|
height INT,
|
|
source VARCHAR(50) DEFAULT 'web',
|
|
folder VARCHAR(255),
|
|
storage_account_id UUID REFERENCES storage_accounts(id),
|
|
is_favorite BOOLEAN DEFAULT false,
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
-- 索引
|
|
CREATE INDEX IF NOT EXISTS idx_files_type ON files(type);
|
|
CREATE INDEX IF NOT EXISTS idx_files_created_at ON files(created_at DESC);
|
|
CREATE INDEX IF NOT EXISTS idx_files_folder ON files(folder);
|
|
CREATE INDEX IF NOT EXISTS idx_files_is_favorite ON files(is_favorite);
|
|
|
|
-- API Keys 表
|
|
CREATE TABLE IF NOT EXISTS api_keys (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name VARCHAR(100) NOT NULL,
|
|
key VARCHAR(64) NOT NULL UNIQUE,
|
|
permissions JSONB DEFAULT '["upload"]',
|
|
enabled BOOLEAN DEFAULT true,
|
|
last_used_at TIMESTAMPTZ,
|
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
-- 系统设置表
|
|
CREATE TABLE IF NOT EXISTS system_settings (
|
|
key VARCHAR(255) PRIMARY KEY,
|
|
value TEXT NOT NULL,
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
-- 更新时间触发器
|
|
CREATE OR REPLACE FUNCTION update_updated_at()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = NOW();
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- files 表更新时间触发器
|
|
CREATE OR REPLACE TRIGGER files_updated_at
|
|
BEFORE UPDATE ON files
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION update_updated_at();
|
|
|
|
-- system_settings 表更新时间触发器
|
|
CREATE OR REPLACE TRIGGER system_settings_updated_at
|
|
BEFORE UPDATE ON system_settings
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION update_updated_at();
|
|
|
|
-- 存储账户表
|
|
CREATE TABLE IF NOT EXISTS storage_accounts (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
type VARCHAR(50) NOT NULL, -- 'onedrive'
|
|
name VARCHAR(255) NOT NULL, -- 用户显示名称或邮箱
|
|
config JSONB NOT NULL, -- {clientId, clientSecret, refreshToken, tenantId}
|
|
is_active BOOLEAN DEFAULT false,
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
-- storage_accounts 表更新时间触发器
|
|
CREATE OR REPLACE TRIGGER storage_accounts_updated_at
|
|
BEFORE UPDATE ON storage_accounts
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION update_updated_at();
|