面向港科大(广州)校园社区的二手交易 / 服务 / 需求撮合市场。一个 App,三条产品线,一套信任闭环。
🌐 在线体验(直接点击访问)👉 https://ust.hhuang999.top
围绕校园场景的三条产品线,加上完整的信任与运营闭环:
三条产品线
- 🛒 物品(items):多图发布、列表搜索/排序/筛选/分页、详情页、卖家选定买家、买卖双方确认完成、订单中心、软删除/重新上架。
- 🧰 服务(services):按时长档位发布、撮合、预约、状态机流转(发布 → 预约 → 进行 → 完成)。
- 📌 需求(needs):发布需求、撤回、意向人评分、撮合。
信任与运营闭环
- 🪪 实名学生证审核:用户上传学生证,管理员后台审核(通过 / 驳回 + 站内通知)。
- ⭐ 信誉体系:交易评价、信誉标签(列表卡片 + 意向人评分 / 点击时间)。
- 🚩 举报与违规:用户举报、管理员违规处理后台。
- 🔔 通知中心:带未读角标的消息中心。
- ⏰ Cron 超时自动完成:7 天未操作的订单自动收尾。
- 👤 公开个人主页:展示发布历史与信誉。
工程与体验
- 🎨 「纸感」视觉设计系统(Tailwind 4 + shadcn 风格组件)。
- 🌱 数据存于远端 Neon Postgres + Cloudflare R2,沙箱重建不丢数据。
- 🔁 Prisma 查询瞬时错误自动重试,消除冷启动首屏 500。
- 🧪 Vitest 单测覆盖核心逻辑。
直接打开 https://ust.hhuang999.top 即可使用,无需安装。以下为各角色操作指引。
- 进入 登录页,点击注册。
- 填写 邮箱或手机号 + 密码完成注册。
- 登录后可在「设置」页上传学生证实名(通过审核后才能发布 / 撮合)。
- 卖家:进入「发布物品」,填写标题、价格、分类、成色、多张图片,提交上架。
- 买家:在「物品」列表搜索/筛选,进入详情页,联系卖家、加入收藏。
- 卖家:在「我发布的」里选定买家(chooseBuyer)。
- 双方:线下完成交易后,各自在订单中心确认完成。
- 评价:交易完成后互相评价,沉淀信誉。
- 服务方:发布服务(选择时长档位、分类、形式)。
- 需求方:浏览服务、发起预约。
- 状态流转至完成后,双方评价。
- 需求方:发布需求(描述 + 期望时间 / 形式)。
- 服务方:表达意向、对需求方评分。
- 撮合成功后进入对接。
- 由首位管理员(
ADMIN_EMAIL)通过 seed 脚本创建。 - 在「管理后台」审核学生证、处理举报与违规。
| 层 | 技术 |
|---|---|
| 框架 | Next.js 16(App Router)+ React 19 + TypeScript |
| 数据库 | Prisma 7 + PostgreSQL(生产 Neon,PrismaPg 适配器) |
| 认证 | Auth.js v5(Credentials + JWT)+ bcryptjs |
| 对象存储 | Cloudflare R2(头像 / 学生证 / 物品图,浏览器预签名 PUT 直传) |
| 样式 | Tailwind CSS 4 / shadcn 风格组件 + 纸感设计令牌 |
| 测试 | Vitest |
| 部署 | Vercel(Cron 见 vercel.json)/ 自托管 |
最简单的上线方式——把本仓库导入 Vercel:
- Fork 本仓库到你的 GitHub。
- 打开 vercel.com/new,导入该仓库(Vercel 自动识别 Next.js)。
- 在 Environment Variables 里填入下方的全部变量。
- 点击 Deploy。构建会自动
prisma generate(见package.json的postinstall)。 - 部署完成后,绑定自定义域名即可访问。
⚠️ Vercel Hobby(免费)档的 Cron Jobs 每天最多触发一次,因此vercel.json里超时扫描已设为每日一次。如需更频繁,请升级 Pro。
# 1) 克隆
git clone https://github.com/hhuang999/ust-inform-trade-cff.git
cd ust-inform-trade-cff
# 2) 安装依赖(pnpm,会自动跑 prisma generate)
pnpm install
# 3) 配置环境变量
cp .env.example .env.local
# 编辑 .env.local,至少填 DATABASE_URL / AUTH_SECRET / R2_* / ADMIN_EMAIL
# 4) 数据库迁移 + 种子首位管理员
pnpm db:migrate # 或对生产库用 prisma migrate deploy
pnpm seed:admin
# 5) 启动开发服务器
pnpm dev # http://localhost:3000常用脚本:pnpm build · pnpm start · pnpm typecheck · pnpm test · pnpm lint · pnpm db:studio。
src/
├── app/ # Next.js App Router
│ ├── (app)/ # 业务页面:items / services / needs / me / admin ...
│ ├── (auth)/ # 登录 / 注册
│ ├── api/ # 上传预签名 / 通知 / cron / 学生证读取
│ └── layout.tsx
├── components/ # UI 组件(shadcn 风格 + 业务组件)
├── lib/ # db(prisma)/ auth / validation / reputation ...
├── auth.config.ts # Auth.js 配置(trustHost、路由保护)
└── middleware.ts # 鉴权 + 管理端守卫
prisma/
├── schema.prisma # 数据模型(物品/服务/需求/撮合/预约/评价/举报/违规)
└── migrations/ # 迁移文件
vercel.json # Cron 配置
复制 .env.example 为 .env.local,按需填写:
| 变量 | 说明 |
|---|---|
DATABASE_URL |
PostgreSQL 连接串(Neon 建议带 &connect_timeout=30&pool_timeout=30) |
AUTH_SECRET |
Auth.js JWT 签名密钥(openssl rand -base64 32) |
AUTH_TRUST_HOST |
反向代理 / 自托管部署设 true |
R2_ACCOUNT_ID / R2_ACCESS_KEY_ID / R2_SECRET_ACCESS_KEY |
Cloudflare R2 凭证 |
R2_BUCKET_PUBLIC / R2_BUCKET_PRIVATE |
公开桶(图片)/ 私有桶(学生证) |
NEXT_PUBLIC_R2_PUBLIC_BASE_URL |
公开桶的访问域名 |
ADMIN_EMAIL |
首位管理员邮箱(配合 seed:admin) |
CRON_SECRET |
保护 /api/cron/timeout 的共享密钥 |
BASE_PATH |
子路径部署前缀(仅 boxset 沙箱用,根路径部署留空) |
main:公开部署分支(Vercel + GitHub Release),根路径部署。本 README 即针对此分支。boxset:校园 Coze 沙箱(gpunion.hkust-gz.edu.cn/apps/<app>)专用,在main基础上加了动态basePath适配、沙箱委托脚本与离线字体。两者功能与数据库完全同步。
本项目以 MIT 协议开源(见根目录 LICENSE),欢迎学习、二次开发与贡献。