{"id":22320816,"url":"https://github.com/baiwumm/dream-site","last_synced_at":"2026-03-11T08:14:18.792Z","repository":{"id":230326502,"uuid":"778609121","full_name":"baiwumm/dream-site","owner":"baiwumm","description":"一个以极简设计呈现的现代化个人导航站，帮助你高效访问常用网站与优质资源。","archived":false,"fork":false,"pushed_at":"2026-02-25T09:13:58.000Z","size":4189,"stargazers_count":69,"open_issues_count":0,"forks_count":34,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-25T14:38:28.113Z","etag":null,"topics":["nextjs16","react19","supabase","tailwindcss4"],"latest_commit_sha":null,"homepage":"https://dream.baiwumm.com/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/baiwumm.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-03-28T03:28:43.000Z","updated_at":"2026-02-25T09:14:02.000Z","dependencies_parsed_at":"2024-04-26T03:28:03.593Z","dependency_job_id":"3ee6ce88-5443-474a-8897-c8a4656113f0","html_url":"https://github.com/baiwumm/dream-site","commit_stats":null,"previous_names":["baiwumm/nuxt-navigation"],"tags_count":50,"template":false,"template_full_name":null,"purl":"pkg:github/baiwumm/dream-site","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baiwumm%2Fdream-site","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baiwumm%2Fdream-site/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baiwumm%2Fdream-site/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baiwumm%2Fdream-site/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/baiwumm","download_url":"https://codeload.github.com/baiwumm/dream-site/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baiwumm%2Fdream-site/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30375865,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-11T06:09:32.197Z","status":"ssl_error","status_checked_at":"2026-03-11T06:09:17.086Z","response_time":84,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["nextjs16","react19","supabase","tailwindcss4"],"created_at":"2024-12-04T00:14:53.669Z","updated_at":"2026-03-11T08:14:18.760Z","avatar_url":"https://github.com/baiwumm.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\u003cimg alt=\"logo\" src=\"./public/logo.svg\" width=\"80\"/\u003e\n\u003ch2\u003eDream Site\u003c/h2\u003e\n\u003cp\u003e一个以极简设计呈现的现代化个人导航站，帮助你高效访问常用网站与优质资源。\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://vercel.com\" target=\"_blank\"\u003e\n    \u003cimg alt=\"Vercel\" src=\"https://img.shields.io/badge/deployed%20on-Vercel-black?style=flat\u0026logo=vercel\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://nextjs.org/\" target=\"_blank\"\u003e\n    \u003cimg alt=\"Next\" src=\"https://img.shields.io/badge/Next-16.0-black?style=flat\u0026logo=Next.js\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://supabase.com/\" target=\"_blank\"\u003e\n    \u003cimg alt=\"Supabase\" src=\"https://img.shields.io/badge/Supabase-black?style=flat\u0026logo=Supabase\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://tailwindcss.com/\" target=\"_blank\"\u003e\n    \u003cimg alt=\"TaildwindCSS\" src=\"https://img.shields.io/badge/TailwindCSS-black?style=flat\u0026logo=tailwindcss\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"./LICENSE\" target=\"_blank\"\u003e\n    \u003cimg alt=\"LICENSE\" src=\"https://img.shields.io/badge/license-MIT-blue\"\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n## ☘️ 项目简介\n\n`Dream Site` 是一个现代化的个人站点导航系统，旨在为用户提供美观、高效的个人网站收藏与管理体验。无论你是开发者、设计师还是内容创作者，都可以用它来组织和展示你喜爱的网站资源。\n\n## 🌿 在线体验\n\n➡️ [点击打开](https://dream.baiwumm.com/)\n\n## 🪴 技术栈\n\n- **前端框架**: [Next 16.0](https://nextjs.org/) (基于 React19.x)\n- **UI组件**: [Hero UI](https://www.heroui.com/)\n- **样式方案**: [Tailwind CSS](https://www.tailwindcss.cn/)\n- **后端服务**: [Supabase](https://supabase.com/) (开源Firebase替代品)\n- **部署平台**: 支持 `Vercel` 等多种部署方式\n\n## ✨ 特性\n- 🚀 **高性能**: 基于最新前端技术栈，极速响应\n- 🌓 **主题切换**: 完善的亮色/暗黑模式支持\n- 🔍 **SEO友好**: 支持SSR渲染，优化搜索引擎收录\n- 📱 **响应式设计**: 适配各种设备屏幕\n- 🔒 **安全认证**: 基于Supabase的完整用户系统\n- 🧩 **模块化架构**: 清晰的目录结构，便于二次开发\n\n## 🪴 项目截图\n\n| 亮色模式 | 暗色模式 |\n|----------|----------|\n| ![亮色模式](./public/light.png) | ![暗色模式](./public/dark.png) |\n\n| 网站分类 | 网站列表 |\n|----------|----------|\n| ![分类列表](./public/categorys.png) | ![站点列表](./public/websites.png) |\n\n## 🚀 快速开始\n\n### 🌳 环境要求\n- Node.js ≥ 18.17 (推荐最新LTS版本)\n- pnpm (推荐) 或 npm/yarn\n\n### ⚙️ 环境变量\n\n在项目根目录创建 `.env`，示例：\n\n```bash\nNEXT_PUBLIC_SUPABASE_URL=\"xxx\"\nNEXT_PUBLIC_SUPABASE_ANON_KEY=\"xxx\"\n# 存储桶名称\nNEXT_PUBLIC_SUPABASE_STORAGE_BUCKET=\"logos\"\n\n# 项目名称\nNEXT_PUBLIC_APP_NAME = 'Dream Site'\n# 项目描述\nNEXT_PUBLIC_APP_DESC = '一个以极简设计呈现的现代化个人导航站，帮助你高效访问常用网站与优质资源。'\n# 项目关键词\nNEXT_PUBLIC_APP_KEYWORDS = 'Dream Site,极简导航,网站导航,个人站点,书签管理,资源导航,Next.js'\n# 项目域名\nNEXT_PUBLIC_APP_URL = 'https://dream.baiwumm.com'\n# 版权\nNEXT_PUBLIC_COPYRIGHT = '白雾茫茫丶'\n# 网站ICP\nNEXT_PUBLIC_ICP = '粤ICP备2023007649号'\n# 网站公网备案\nNEXT_PUBLIC_GUAN_ICP = '粤公网安备44030402006402号'\n# Umami ID\nNEXT_PUBLIC_UMAMI_ID = '87f94791-c0a5-424f-a3f4-e0171d82352b'\n# Google ID\nNEXT_PUBLIC_GOOGLE_ID = 'G-76RP7KMHMQ'\n# Clarity ID\nNEXT_PUBLIC_CLARITY_ID = 'mwtlsffbuj'\n```\n\n### 🧑‍💻 本地开发\n```bash\n# 克隆项目\ngit clone https://github.com/baiwumm/dream-site.git\n\n# 进入项目目录\ncd dream-site\n\n# 安装依赖\npnpm install\n\n# 启动开发服务器\npnpm dev\n```\n\n### 📝 Supabase 配置\n1. 进入 [supabase 控制台](https://supabase.com/dashboard)，创建项目，并获取`NEXT_PUBLIC_SUPABASE_URL`和`NEXT_PUBLIC_SUPABASE_ANON_KEY`\n![Anon Key](./public/1.png)\n2. 执行以下 `Sql`，生成项目需要的数据库表\n```sql\n-- 网站分类\ncreate table public.ds_categorys (\n  id uuid not null default gen_random_uuid (),\n  name text not null,\n  created_at timestamp with time zone not null default now(),\n  updated_at timestamp with time zone not null default now(),\n  user_id uuid null default auth.uid (),\n  email text null,\n  sort smallint null,\n  constraint site_category_pkey primary key (id),\n  constraint site_category_name_key unique (name)\n) TABLESPACE pg_default;\n\ncreate trigger trg_ds_categorys_insert BEFORE INSERT on ds_categorys for EACH row\nexecute FUNCTION handle_ds_categorys_insert ();\n\ncreate trigger trg_ds_categorys_update BEFORE\nupdate on ds_categorys for EACH row\nexecute FUNCTION handle_ds_categorys_update ();\n\n-- 网站列表\ncreate table public.ds_websites (\n  id uuid not null default gen_random_uuid (),\n  created_at timestamp with time zone not null default now(),\n  user_id uuid null default auth.uid (),\n  email text null default 'NULL'::text,\n  name text null,\n  \"desc\" text null,\n  logo text null,\n  tags text[] null,\n  sort smallint null,\n  updated_at timestamp with time zone null default now(),\n  url text null,\n  pinned boolean null default false,\n  vpn boolean null default false,\n  category_id uuid null default gen_random_uuid (),\n  recommend boolean null default false,\n  \"visitCount\" integer null default 0,\n  \"commonlyUsed\" boolean null default false,\n  \"logoAccent\" text null,\n  constraint websites_pkey primary key (id),\n  constraint ds_websites_name_key unique (name),\n  constraint ds_websites_category_id_fkey foreign KEY (category_id) references ds_categorys (id)\n) TABLESPACE pg_default;\n\ncreate index IF not exists idx_ds_websites_id on public.ds_websites using btree (id) TABLESPACE pg_default;\n\ncreate trigger trg_ds_websites_insert BEFORE INSERT on ds_websites for EACH row\nexecute FUNCTION handle_ds_websites_insert ();\n\ncreate trigger trg_ds_websites_update BEFORE\nupdate on ds_websites for EACH row\nexecute FUNCTION handle_ds_websites_update ();\n```\n3. 执行以下 `Sql`，生成 `visitCount` 访问统计函数：\n```sql\nSELECT pg_get_functiondef(oid) as function_definition\nFROM pg_proc \nWHERE proname = 'increment_visit_count';\n\ndrop function if exists increment_visit_count(uuid);\n\ncreate or replace function increment_visit_count(row_id uuid)\nreturns bigint\nlanguage plpgsql\nsecurity definer\nas $$\ndeclare\n  new_count bigint;\nbegin\n  update public.ds_websites\n  set \"visitCount\" = coalesce(\"visitCount\", 0) + floor(random() * 10 + 1)\n  where id = row_id\n  returning \"visitCount\" into new_count;\n\n  if new_count is null then\n    raise exception 'update blocked or row not found, id=%', row_id;\n  end if;\n\n  return new_count;\nend;\n$$;\n\ngrant execute on function increment_visit_count(uuid)\nto anon, authenticated;\n```\n4. 执行以下 `Sql`，用于 `Insert` 和 `Update` 触发器，自动更新列：\n```sql\n-- ds_categorys\n-- =====================================================\n-- 1. INSERT：自动写入 user_id / email / created_at / updated_at\n-- =====================================================\ncreate or replace function public.handle_ds_categorys_insert()\nreturns trigger\nlanguage plpgsql\nsecurity definer\nas $$\nbegin\n  -- 当前登录用户 ID\n  new.user_id := auth.uid();\n\n  -- 从 JWT 中读取 email\n  new.email := auth.jwt() -\u003e\u003e 'email';\n\n  -- 时间兜底\n  new.created_at := now();\n  new.updated_at := now();\n\n  return new;\nend;\n$$;\n\n\ndrop trigger if exists trg_ds_categorys_insert on public.ds_categorys;\n\ncreate trigger trg_ds_categorys_insert\nbefore insert on public.ds_categorys\nfor each row\nexecute function public.handle_ds_categorys_insert();\n\n\n-- =====================================================\n-- 2. UPDATE：自动更新 updated_at / user_id / email\n-- =====================================================\ncreate or replace function public.handle_ds_categorys_update()\nreturns trigger\nlanguage plpgsql\nsecurity definer\nas $$\nbegin\n  -- 更新时间\n  new.updated_at := now();\n\n  return new;\nend;\n$$;\n\n\ndrop trigger if exists trg_ds_categorys_update on public.ds_categorys;\n\ncreate trigger trg_ds_categorys_update\nbefore update on public.ds_categorys\nfor each row\nexecute function public.handle_ds_categorys_update();\n\n\n-- ds_websites\n-- =====================================================\n-- 1. INSERT：自动写入 user_id / email / created_at / updated_at\n-- =====================================================\ncreate or replace function public.handle_ds_websites_insert()\nreturns trigger\nlanguage plpgsql\nsecurity definer\nas $$\nbegin\n  -- 当前登录用户 ID\n  new.user_id := auth.uid();\n\n  -- 从 JWT 中读取 email\n  new.email := auth.jwt() -\u003e\u003e 'email';\n\n  -- 时间兜底\n  new.created_at := now();\n  new.updated_at := now();\n\n  return new;\nend;\n$$;\n\n\n\ndrop trigger if exists trg_ds_websites_insert on public.ds_websites;\n\ncreate trigger trg_ds_websites_insert\nbefore insert on public.ds_websites\nfor each row\nexecute function public.handle_ds_websites_insert();\n\n\n\n-- =====================================================\n-- 2. UPDATE：自动更新 updated_at / user_id / email\n-- =====================================================\ncreate or replace function public.handle_ds_websites_update()\nreturns trigger\nlanguage plpgsql\nsecurity definer\nas $$\nbegin\n  -- 更新时间\n  new.updated_at := now();\n\n  return new;\nend;\n$$;\n\n\n\ndrop trigger if exists trg_ds_websites_update on public.ds_websites;\n\ncreate trigger trg_ds_websites_update\nbefore update on public.ds_websites\nfor each row\nexecute function public.handle_ds_websites_update();\n\n```\n5. 进入 [Authentication](https://supabase.com/dashboard/project/athbiwlqrieaoetfapxd/auth/users) ，自行配置  [Policies](https://supabase.com/dashboard/project/athbiwlqrieaoetfapxd/auth/policies)  和 [Sign In / Providers](https://supabase.com/dashboard/project/athbiwlqrieaoetfapxd/auth/providers)\n![Authentication](./public/2.png)\n6. 进入 [Storage](https://supabase.com/dashboard/project/athbiwlqrieaoetfapxd/storage/files)，创建保存网站图标的存储桶\n![Storage](./public/3.png)\n\n## ⚙️ Vercel 一键部署\n1. `Fork` 本项目，在 `Vercel` 官网点击 `New Project`\n2. 点击 `Import Git Repository` 并选择你 fork 的此项目并点击 `import`\n3. `PROJECT NAME`自己填，`FRAMEWORK PRESET` 选 `Other` 然后直接点 `Deploy` 接着等部署完成即可\n\n\u003ca href=\"https://vercel.com/dashboard\" target=\"_blank\"\u003e\n\u003cimg alt=\"vercel 部署\" src=\"./public/vercel.svg\" /\u003e\n\u003c/a\u003e\n\n## 📜 许可证\n本项目采用 [MIT](LICENSE) 许可证。\n\n## ⭐ Star History\n\n[![Star History Chart](https://api.star-history.com/svg?repos=baiwumm/dream-site\u0026type=Date)](https://star-history.com/#baiwumm/dream-site\u0026Date)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbaiwumm%2Fdream-site","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbaiwumm%2Fdream-site","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbaiwumm%2Fdream-site/lists"}