西南财经大学(SWUFE)课程评价社区平台,学生可以搜索课程、查看/撰写评价、关注课程、查看课程统计信息。
凯学邦(Course-Prism)是一个现代化的课程评价社区平台,提供以下功能:
- 📚 课程搜索与浏览
- ✍️ 课程评价撰写与查看
- ⭐ 课程收藏与关注
- 📊 课程统计与数据分析
- 👨🏫 教师评价系统
- 🔔 通知提醒功能
- 📈 访客统计
前端:
- Next.js 16.1.6 (Pages Router)
- React 19.2.4
- Ant Design 6.1.0
- TypeScript 5.7.0
- SWR 2.3.0 (数据获取)
- Axios 1.7.0 (HTTP 客户端)
- Recharts 2.15.0 (图表)
后端:
- Django 6.0.2
- Django REST Framework 3.16.1
- PostgreSQL 16 (Docker)
- Redis 5.2.0 (缓存)
- Huey 2.5.2 (任务队列)
- Gunicorn 23.0.0 / Uvicorn 0.32.0
使用 Docker 容器化部署是最简单快速的方式,提供:
- ✅ 环境一致性 - 开发、测试、生产环境完全相同
- ✅ 一键部署 - 5分钟内完成部署
- ✅ 易于迁移 - 支持任何云服务器
- ✅ 简化运维 - 自动化备份、恢复、更新
- Docker 20.10+
- Docker Compose 2.0+ 或
docker compose插件 - 至少 2GB 可用内存
- 至少 5GB 可用磁盘空间
-
克隆项目
git clone https://github.com/kaixuebang/Course-Prism.git cd Course-Prism -
配置环境变量
cp .env.example .env nano .env # 编辑配置必须修改的配置项:
SECRET_KEY=your-super-secret-key-here # 生成随机密钥 POSTGRES_PASSWORD=your-secure-password # 数据库密码 ALLOWED_HOSTS=your-domain.com,www.your-domain.com # 你的域名 CSRF_TRUSTED_ORIGINS=https://your-domain.com # 你的域名(带协议)
-
一键部署
chmod +x deploy.sh ./deploy.sh
-
访问应用
- 前端: http://localhost
- 后端 API: http://localhost/api/
- Django Admin: http://localhost/admin/
# 启动所有服务
docker-compose up -d
# 查看日志
docker-compose logs -f
# 查看特定服务日志
docker-compose logs -f backend
docker-compose logs -f frontend
# 停止服务
docker-compose down
# 重启服务
docker-compose restart
# 重新构建并启动
docker-compose up -d --build
# 进入容器
docker-compose exec backend bash
docker-compose exec frontend sh# 备份数据库
./backup.sh
# 恢复数据库
./restore.sh backups/db_backup_20260215_120000.sql
# 运行迁移
docker-compose exec backend python manage.py migrate
# 创建超级用户
docker-compose exec backend python manage.py createsuperuser
# 收集静态文件
docker-compose exec backend python manage.py collectstatic --noinput使用开发环境配置(支持热重载):
# 启动开发环境
docker-compose -f docker-compose.dev.yml up -d
# 查看日志
docker-compose -f docker-compose.dev.yml logs -f
# 停止开发环境
docker-compose -f docker-compose.dev.yml down开发环境特点:
- 代码热重载(修改即生效)
- 数据库和 Redis 端口暴露到主机
- 使用 Django runserver 而非 Gunicorn
访问地址:
- 前端: http://localhost:3000
- 后端: http://localhost:8000
- PostgreSQL: localhost:5432
- Redis: localhost:6379
完整的 Docker 部署文档请参考 DOCKER.md,包含:
- 架构说明
- 服务配置详解
- 网络和卷管理
- SSL 证书配置
- 故障排除
- 性能优化
- Node.js 18+ 和 Yarn(推荐 Node.js 20+)
- Python 3.9+(推荐 Python 3.11+)
- Docker 和 Docker Compose(用于 PostgreSQL)
- Redis (可选,用于缓存)
git clone https://github.com/kaixuebang/Course-Prism.git
cd Course-Prism推荐使用 Docker Compose:
# 在项目根目录,启动数据库和 Redis
docker-compose up -d
# 验证容器运行
docker-compose ps
# 查看日志
docker-compose logs -f或手动启动 PostgreSQL 容器:
docker run -d \
--name jcourse-postgres \
-e POSTGRES_DB=jcourse \
-e POSTGRES_USER=jcourse \
-e POSTGRES_PASSWORD=jcourse \
-p 5432:5432 \
postgres:16
# 验证容器运行
docker ps | grep jcourse-postgrescd backend/jcourse_api-master
# 创建虚拟环境
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 安装依赖
pip install -r requirements.txt
# 配置环境变量
cp ../../configs/backend.env.template .env
# 编辑 .env 文件,设置数据库密码等
# 运行迁移
python manage.py migrate
# 创建超级用户
python manage.py createsuperuser
# 启动开发服务器
python manage.py runservercd frontend/jcourse-master
# 安装依赖
yarn install
# 配置环境变量
cp ../../configs/frontend.env.template .env.local
# 编辑 .env.local,确保包含以下两行:
# NEXT_PUBLIC_REMOTE_URL=http://localhost:8000
# REMOTE_URL=http://localhost:8000
# 启动开发服务器
yarn dev访问 http://localhost:3000 查看应用。
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装基础依赖
sudo apt install -y git curl wget build-essential
# 安装 Node.js 18
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs
# 安装 Yarn
npm install -g yarn
# 安装 Python 3 和 pip
sudo apt install -y python3 python3-pip python3-venv
# 安装 Docker 和 Docker Compose
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# 安装 Redis (可选)
sudo apt install -y redis-server
# 安装 Nginx
sudo apt install -y nginxcd /var/www # 或其他合适的目录
sudo git clone https://github.com/kaixuebang/Course-Prism.git
sudo chown -R $USER:$USER Course-Prism
cd Course-Prism# 启动 PostgreSQL 容器
docker run -d \
--name jcourse-postgres \
--restart unless-stopped \
-e POSTGRES_DB=jcourse \
-e POSTGRES_USER=jcourse \
-e POSTGRES_PASSWORD=your_secure_password \
-p 5432:5432 \
-v jcourse-db-data:/var/lib/postgresql/data \
postgres:16
# 验证容器运行
docker ps | grep jcourse-postgres
# 查看日志
docker logs jcourse-postgres或者使用传统方式安装 PostgreSQL:
# 安装 PostgreSQL
sudo apt install -y postgresql postgresql-contrib
# 切换到 postgres 用户
sudo -u postgres psql
# 在 PostgreSQL shell 中执行:
CREATE DATABASE jcourse;
CREATE USER jcourse WITH PASSWORD 'your_secure_password';
ALTER USER jcourse WITH SUPERUSER;
GRANT ALL PRIVILEGES ON DATABASE jcourse TO jcourse;
\qcd backend/jcourse_api-master
# 创建虚拟环境
python3 -m venv venv
source venv/bin/activate
# 安装依赖
pip install -r requirements.txt
pip install gunicorn # 生产环境 WSGI 服务器
# 配置环境变量
nano .env.env 配置示例:
DEBUG=False
SECRET_KEY=your-very-long-random-secret-key-here
DATABASE_URL=postgres://jcourse:your_secure_password@localhost:5432/jcourse
POSTGRES_PASSWORD=your_secure_password
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
ALLOWED_HOSTS=your-domain.com,www.your-domain.com,server-ip
CSRF_TRUSTED_ORIGINS=https://your-domain.com,https://www.your-domain.com
REDIS_HOST=localhost # 如果使用 Redis# 运行迁移
python manage.py migrate
# 收集静态文件
python manage.py collectstatic --noinput
# 创建管理员账户
python manage.py createsuperusercd ../../frontend/jcourse-master
# 安装依赖
yarn install
# 配置环境变量
nano .env.local.env.local 配置示例:
NEXT_PUBLIC_REMOTE_URL=https://api.your-domain.com
REMOTE_URL=https://api.your-domain.com
NODE_ENV=production# 构建生产版本
yarn buildsudo nano /etc/systemd/system/jcourse-backend.servicejcourse-backend.service 内容:
[Unit]
Description=JCourse Backend (Django/Gunicorn)
After=network.target postgresql.service
[Service]
Type=notify
User=your-user
Group=www-data
WorkingDirectory=/var/www/Course-Prism/backend/jcourse_api-master
Environment="PATH=/var/www/Course-Prism/backend/jcourse_api-master/venv/bin"
ExecStart=/var/www/Course-Prism/backend/jcourse_api-master/venv/bin/gunicorn \
--workers 3 \
--bind 127.0.0.1:8000 \
--timeout 120 \
--access-logfile /var/log/jcourse-backend-access.log \
--error-logfile /var/log/jcourse-backend-error.log \
jcourse.wsgi:application
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.targetsudo nano /etc/systemd/system/jcourse-frontend.servicejcourse-frontend.service 内容:
[Unit]
Description=JCourse Frontend (Next.js)
After=network.target
[Service]
Type=simple
User=your-user
Group=www-data
WorkingDirectory=/var/www/Course-Prism/frontend/jcourse-master
Environment="PATH=/usr/bin:/usr/local/bin"
Environment="NODE_ENV=production"
ExecStart=/usr/bin/yarn start
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target# 重新加载 systemd
sudo systemctl daemon-reload
# 启动并启用服务
sudo systemctl start jcourse-backend
sudo systemctl enable jcourse-backend
sudo systemctl start jcourse-frontend
sudo systemctl enable jcourse-frontend
# 查看状态
sudo systemctl status jcourse-backend
sudo systemctl status jcourse-frontendsudo nano /etc/nginx/sites-available/jcourseNginx 配置示例:
# API 后端
server {
listen 80;
server_name api.your-domain.com;
client_max_body_size 20M;
location /static/ {
alias /var/www/Course-Prism/backend/jcourse_api-master/static/;
}
location /media/ {
alias /var/www/Course-Prism/backend/jcourse_api-master/media/;
}
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# 前端
server {
listen 80;
server_name your-domain.com www.your-domain.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}# 启用站点
sudo ln -s /etc/nginx/sites-available/jcourse /etc/nginx/sites-enabled/
# 测试配置
sudo nginx -t
# 重启 Nginx
sudo systemctl restart nginx# 安装 Certbot
sudo apt install -y certbot python3-certbot-nginx
# 获取证书
sudo certbot --nginx -d your-domain.com -d www.your-domain.com -d api.your-domain.com
# 证书会自动续期
sudo certbot renew --dry-run如果您有完整的数据库备份文件,这是最简单的方式:
# 导出完整数据库(包含结构和数据)
pg_dump -U jcourse -h localhost jcourse > full_database_backup.sql
# 或者分别导出
pg_dump -U jcourse -h localhost --schema-only jcourse > schema.sql
pg_dump -U jcourse -h localhost --data-only jcourse > data.sql# 在原服务器上
scp full_database_backup.sql user@new-server:/var/www/Course-Prism/
# 如果文件很大,可以压缩
tar -czf database_backup.tar.gz full_database_backup.sql
scp database_backup.tar.gz user@new-server:/var/www/Course-Prism/# 解压(如果压缩了)
cd /var/www/Course-Prism
tar -xzf database_backup.tar.gz
# 确保数据库已创建
sudo -u postgres createdb jcourse
sudo -u postgres createuser jcourse
sudo -u postgres psql -c "ALTER USER jcourse WITH PASSWORD 'your_password';"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE jcourse TO jcourse;"
# 导入数据
psql -U jcourse -d jcourse -h localhost < full_database_backup.sql
# 验证数据
psql -U jcourse -d jcourse -h localhost -c "SELECT COUNT(*) FROM auth_user;"
psql -U jcourse -d jcourse -h localhost -c "SELECT COUNT(*) FROM jcourse_api_review;"
psql -U jcourse -d jcourse -h localhost -c "SELECT COUNT(*) FROM jcourse_api_course;"用户上传的文件(图片、附件等)需要单独迁移:
# 在原服务器上打包 media 文件夹
cd /path/to/old/backend/jcourse_api-master
tar -czf media_files.tar.gz media/
# 传输到新服务器
scp media_files.tar.gz user@new-server:/var/www/Course-Prism/backend/jcourse_api-master/
# 在新服务器上解压
cd /var/www/Course-Prism/backend/jcourse_api-master
tar -xzf media_files.tar.gz
# 设置正确的权限
sudo chown -R your-user:www-data media/
sudo chmod -R 755 media/迁移完成后,检查数据完整性:
cd /var/www/Course-Prism/backend/jcourse_api-master
source venv/bin/activate
# 运行 Django 检查
python manage.py check
# 验证数据
python manage.py shell在 Django shell 中:
from django.contrib.auth.models import User
from jcourse_api.models import Course, Review
print(f"用户数: {User.objects.count()}")
print(f"课程数: {Course.objects.count()}")
print(f"评价数: {Review.objects.count()}")Course-Prism/
├── README.md # 本文件
├── CLAUDE.md # Claude Code 指导文件
├── DEPLOYMENT.md # 详细部署指南
├── configs/ # 配置文件模板
│ ├── backend.env.template
│ ├── frontend.env.template
│ ├── nginx.conf
│ └── jcourse-backend.service
├── backend/ # Django 后端
│ └── jcourse_api-master/
│ ├── jcourse_api/ # 主应用
│ ├── oauth/ # 认证模块
│ ├── ad/ # 广告模块
│ ├── manage.py
│ └── requirements.txt
├── frontend/ # Next.js 前端
│ └── jcourse-master/
│ ├── src/
│ │ ├── pages/ # 页面
│ │ ├── components/ # 组件
│ │ ├── services/ # API 服务
│ │ └── lib/ # 工具函数
│ ├── public/ # 静态资源
│ └── package.json
├── data/ # 数据文件
│ ├── data-*.csv # 评价数据
│ └── import_to_database.py
└── original-data/ # 原始数据备份
├── 课表数据/
└── backups/
# 进入虚拟环境
cd backend/jcourse_api-master
source venv/bin/activate
# 运行开发服务器
python manage.py runserver
# 数据库迁移
python manage.py makemigrations
python manage.py migrate
# 创建超级用户
python manage.py createsuperuser
# 收集静态文件
python manage.py collectstatic
# 运行测试
python manage.py test
# Django 管理命令
python manage.py check_duplicate # 检查重复评价
python manage.py remove_duplicate_reviews # 清理重复评价
python manage.py import # 导入课程数据
python manage.py update_semester # 更新学期数据cd frontend/jcourse-master
# 安装依赖
yarn install
# 开发模式
yarn dev
# 生产构建
yarn build
# 启动生产服务器
yarn start
# 代码格式化
yarn format
# 运行测试
yarn test# 重启服务
sudo systemctl restart jcourse-backend
sudo systemctl restart jcourse-frontend
# 查看日志
sudo journalctl -u jcourse-backend -f
sudo journalctl -u jcourse-frontend -f
# 查看服务状态
sudo systemctl status jcourse-backend
sudo systemctl status jcourse-frontend- 检查
.env.local是否包含REMOTE_URL变量 - 确认后端服务正在运行
- 检查 CORS 配置
- 确认 PostgreSQL 正在运行:
sudo systemctl status postgresql - 检查
.env中的数据库配置 - 验证数据库用户权限
- 运行
python manage.py collectstatic - 检查 Nginx 配置中的 static 路径
- 验证文件权限
# 查看详细错误日志
sudo journalctl -u jcourse-backend -n 50 --no-pager
sudo journalctl -u jcourse-frontend -n 50 --no-pagerSECRET_KEY: Django 密钥(必须)DEBUG: 调试模式(生产环境设为 False)POSTGRES_PASSWORD: 数据库密码POSTGRES_HOST: 数据库主机(默认 localhost)ALLOWED_HOSTS: 允许的主机列表CSRF_TRUSTED_ORIGINS: CSRF 信任的来源REDIS_HOST: Redis 主机(可选)
NEXT_PUBLIC_REMOTE_URL: API 地址(公开)REMOTE_URL: API 地址(服务端)NODE_ENV: 运行环境
欢迎提交 Issue 和 Pull Request!
本项目采用 MIT 许可证。
- GitHub: https://github.com/kaixuebang/Course-Prism
- 组织: 凯学邦