面向校园的技能互助与闲置交易平台。将发布、检索、需求响应、即时沟通、交易状态和双方评价串成一条完整的 C2C 履约链路。
校园交换站不是一个只负责“发帖子”的信息黄页,而是一套围绕校园轻交易设计的全栈 MVP:
- 技能场景:支持免费分享、技能交换与付费服务,记录线上/线下服务方式和可用时间。
- 闲置场景:支持交换、租赁与出售,记录物品成色、校区位置和价格条件。
- 需求场景:当现有供给无法满足时,用户可以明确发布需求、预算、紧急程度与截止时间。
- 履约闭环:从请求、接受/拒绝、消息沟通到完成交易与双向评价,关键状态均可追踪。
项目由个人完成产品规则、数据建模、接口设计与前后端实现。本次版本对一年前的 MVP 做了系统性重构:统一接口契约、修复权限与消息查询缺陷、补齐交易/需求响应/评价流程,并重新设计视觉与演示数据。
| 技能市场 | 需求广场 |
|---|---|
![]() |
![]() |
flowchart LR
A[注册 / 登录] --> B{从何开始?}
B --> C[发布技能]
B --> D[发布闲置]
B --> E[发布需求]
C --> F[检索与匹配]
D --> F
E --> G[他人响应]
G --> F
F --> H[消息沟通]
H --> I[接受 / 拒绝]
I --> J[履约进行中]
J --> K[交易完成]
K --> L[双方评价]
交易权限在服务端校验:
- 只有资源所有者可以编辑或下架自己的技能、物品与需求。
- 用户不能请求自己的技能、交换自己的物品或响应自己的需求。
- 只有交易承接方可以接受或拒绝请求,交易双方才能查看和推进状态。
- 只有已完成交易的参与者可以评价,同一参与者对同一交易只能评价一次。
| 层级 | 技术 | 作用 |
|---|---|---|
| 前端 | Vue 3、Vue Router、Pinia | 页面、路由、登录态 |
| UI | Element Plus、SCSS | 组件与响应式视觉系统 |
| API | Axios | JWT 注入、统一错误处理 |
| 后端 | Flask 3、Flask-JWT-Extended | REST API、鉴权与权限规则 |
| 数据 | SQLAlchemy 2、SQLite | 7 类核心实体与关系建模 |
| 迁移 | Flask-Migrate、Alembic | 数据库版本管理 |
| 验证 | unittest、Vite build |
API 业务回归与生产构建 |
.
├── app/
│ ├── api/ # 认证、技能、物品、需求、消息、交易、评价
│ ├── models.py # 7 类核心业务实体
│ └── config.py # 数据库、JWT、CORS 配置
├── frontend/
│ ├── src/api/ # 前端接口契约
│ ├── src/components/ # 发布、编辑、响应与评价组件
│ ├── src/views/ # 13 个核心页面
│ └── src/styles/ # 视觉变量与全局样式
├── migrations/ # Alembic 迁移
├── tests/ # 后端 API 回归测试
├── docs/screenshots/ # README 页面截图
├── init_db.py # 幂等演示数据初始化
└── run.py # Flask 入口
- Python 3.10+
- Node.js 18+
- npm 9+
python -m venv .venvWindows PowerShell:
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
Copy-Item .env.example .env
python init_db.py
python run.pymacOS / Linux:
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
python init_db.py
python run.py后端默认运行在 http://127.0.0.1:5000,健康检查地址为 http://127.0.0.1:5000/api/v1/health。
另开一个终端:
cd frontend
npm ci
npm run dev浏览器访问 http://127.0.0.1:3000。
| 账号 | 密码 |
|---|---|
linan@example.com |
demo123 |
suyue@example.com |
demo123 |
init_db.py 会为旧版 SQLite 数据库补齐新增字段,并且仅在数据库为空时写入演示数据,不会覆盖已有记录。
所有业务接口以 /api/v1 为前缀,目前覆盖 50+ 个 method-route 映射。常用入口如下:
| 模块 | 代表接口 |
|---|---|
| 系统 | GET /health、GET /stats |
| 认证 | POST /auth/register、POST /auth/login、GET /auth/me |
| 技能 | GET/POST /skills、POST /skills/{id}/request_service |
| 物品 | GET/POST /items、GET /items/mine |
| 需求 | GET/POST /demands、POST /demands/{id}/responses |
| 消息 | GET /messages/conversations、POST /messages |
| 交易 | GET /transactions、PUT /transactions/{id}/respond |
| 评价 | POST /transactions/{id}/reviews、GET /reviews/received |
分页接口同时兼容 per_page 和旧版 page_size 参数,以减少前后端升级期间的破坏性变更。
运行后端回归测试:
python -m unittest discover -s tests -v测试覆盖身份契约、资源归属、分页搜索、需求响应、消息会话、技能交易生命周期、评价权限与物品交换归属校验。
运行前端生产构建:
cd frontend
npm run build当前验证结果:
- 后端 API:8/8 通过
- 前端生产构建:通过
- 浏览器验收:首页、技能、需求、详情、个人资料、交易评价与消息会话 通过
.env、SQLite 数据库、构建产物和依赖目录均已加入.gitignore。- CORS 默认只允许本地前端地址;非本地部署前请配置
CORS_ORIGINS。 - 生产环境必须替换
SECRET_KEY与JWT_SECRET_KEY。 - 当前 JWT 注销黑名单保存在进程内存中;多实例部署应替换为 Redis 或数据库存储。
- 演示版将图片以 URL/Base64 列表保存;生产场景应接入对象存储并增加内容审核。
MIT © 2026 Yu Quanjie



