这个项目有一个功能完整的管理后台,位于 /admin 路径。管理后台需要用户角色为 admin 才能访问。
管理员可以:
- 📊 查看网站统计数据(用户数、项目数、Premium 项目数等)
- 👥 管理用户(封禁/解封、删除、模拟登录)
- 📅 查看免费发布日期的可用性
- 🏷️ 管理项目分类
- 🎯 查看每日新增数据
https://your-domain.com/admin
- ✅ 必须已登录
- ✅ 用户的
role字段必须为"admin"
管理员登录后,在用户菜单中会显示 "Admin Dashboard" 链接。
通过网站正常注册流程创建一个账号。
登录后,可以在浏览器开发者工具的 Network 或 Application 标签中找到你的用户信息,或者直接查询数据库:
SELECT id, email, name, role FROM "user" WHERE email = 'your-email@example.com';使用数据库客户端或命令行工具执行以下 SQL:
UPDATE "user"
SET role = 'admin'
WHERE email = 'your-email@example.com';或者使用用户 ID:
UPDATE "user"
SET role = 'admin'
WHERE id = 'user_id_here';查询确认 role 已更新:
SELECT id, email, name, role FROM "user" WHERE email = 'your-email@example.com';应该看到 role 字段显示为 admin。
如果使用 Zeabur:
# 从 Zeabur 数据库服务获取连接字符串
psql "your-database-connection-string"如果使用本地数据库:
psql postgresql://user:password@localhost:5432/database_nameUPDATE "user" SET role = 'admin' WHERE email = 'your-email@example.com';\q创建一个临时脚本来设置管理员(仅首次使用):
创建 scripts/set-admin.ts:
import { db } from "@/drizzle/db"
import { user } from "@/drizzle/db/schema"
import { eq } from "drizzle-orm"
async function setAdmin() {
const adminEmail = process.env.ADMIN_EMAIL || "your-email@example.com"
try {
const result = await db
.update(user)
.set({ role: "admin" })
.where(eq(user.email, adminEmail))
.returning()
if (result.length > 0) {
console.log("✅ Admin role set successfully!")
console.log("Admin user:", result[0].email)
} else {
console.log("❌ User not found with email:", adminEmail)
console.log("Please make sure the user is registered first.")
}
} catch (error) {
console.error("❌ Error setting admin role:", error)
}
process.exit(0)
}
setAdmin(){
"scripts": {
"set-admin": "tsx scripts/set-admin.ts"
}
}ADMIN_EMAIL=your-email@example.com bun run set-admin-
限制管理员数量
- 只设置必要的管理员账号
- 定期审查管理员列表
-
使用强密码
- 管理员账号应使用强密码或 OAuth 登录
- 启用两步验证(如果支持)
-
监控管理员操作
- 定期检查管理员操作日志
- 注意异常的封禁或删除操作
-
环境变量保护
- 不要在代码中硬编码管理员邮箱
- 使用环境变量存储敏感信息
- 查看用户列表: 所有注册用户及其信息
- 搜索和过滤: 按姓名、邮箱、角色、状态筛选
- 封禁用户: 临时封禁用户 30 天
- 解封用户: 解除封禁
- 模拟登录: 以其他用户身份登录(调试用)
- 删除用户: 永久删除用户及其数据
- 总用户数: 包含今日新增
- 总项目数: 包含今日新增
- Premium 项目: 包含今日新增
- Premium Plus 项目: 包含今日新增
- 查看所有分类: 当前可用的项目分类
- 添加新分类: 创建新的项目分类
- 免费发布槽位: 查看最近可用的免费发布日期
A: 请确保:
- 完全退出登录后重新登录
- 清除浏览器缓存和 Cookies
- 检查数据库中 role 字段确实为 "admin"(区分大小写)
A:
- 本地开发: 检查
.env.local中的DATABASE_URL - Zeabur: 在服务的 Variables 标签页查看
DATABASE_URL
A: 可以!对任意数量的用户执行相同的 UPDATE 操作即可。
A: 执行以下 SQL:
UPDATE "user" SET role = NULL WHERE email = 'user-email@example.com';A: 查询所有管理员:
SELECT id, email, name, role FROM "user" WHERE role = 'admin';- 1. 注册一个账号
- 2. 获取注册账号的邮箱或 ID
- 3. 连接到数据库
- 4. 执行 UPDATE 语句设置 role = 'admin'
- 5. 退出登录并重新登录
- 6. 访问
/admin查看管理后台 - 7. 验证所有管理功能正常工作
- 管理后台页面:
app/admin/page.tsx - 权限检查:
app/admin/layout.tsx - 管理操作:
app/actions/admin.ts - 用户导航:
components/layout/user-nav.tsx - 数据库 Schema:
drizzle/db/schema.ts
管理员角色的设置是基于数据库的 role 字段,没有复杂的权限系统。这个设计简单但有效,适合中小型项目。
如果需要更复杂的权限系统(如多级权限、权限组等),建议:
- 扩展 user 表添加 permissions 字段
- 创建单独的 roles 和 permissions 表
- 实现基于角色的访问控制(RBAC)
祝您管理愉快! 🎉