为了构建一个高效、安全的Java精品课程网站,以下是分步实现的详细方案:
一、项目架构设计
- 技术栈确认
- 后端: Spring Boot 2.7.x + MyBatis-Plus 3.5.x + Spring Security
- 数据库: MySQL 8.0(主从分离) + Redis 6.x(缓存/限流)
- 搜索: Elasticsearch 7.x(集成IK分词器)
- 前端: Vue3 + Element Plus + Axios
- 部署: Nginx + Docker + Jenkins(CI/CD)
- 系统分层
- Controller层: 处理HTTP请求,参数校验。
- Service层: 业务逻辑,事务管理。
- DAO层: 数据访问,通过MyBatis-Plus操作数据库。
- 安全层: Spring Security管理RBAC权限。
二、数据库详细设计
- 核心表结构
-- 用户表
CREATE TABLE `user` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`username` VARCHAR(50) UNIQUE NOT NULL,
`password` VARCHAR(100) NOT NULL, -- BCrypt加密存储
`role` ENUM('ADMIN','TEACHER','STUDENT') NOT NULL,
`email` VARCHAR(100),
`created_at` DATETIME DEFAULT NOW()
);
-- 课程表
CREATE TABLE `course` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`title` VARCHAR(100) NOT NULL,
`description` TEXT,
`cover_url` VARCHAR(255),
`category` VARCHAR(50), -- 分类: 编程/设计等
`teacher_id` BIGINT NOT NULL,
`status` TINYINT DEFAULT 0, -- 0未发布 1已发布
FOREIGN KEY (`teacher_id`) REFERENCES `user`(`id`)
);
-- 章节表(支持视频/文档)
CREATE TABLE `chapter` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`course_id` BIGINT NOT NULL,
`title` VARCHAR(100),
`content_type` ENUM('video','text'),
`video_url` VARCHAR(255), -- 存储OSS地址
`text_content` TEXT,
FOREIGN KEY (`course_id`) REFERENCES `course`(`id`)
);
- 索引优化
- 为
course
表的category
和status
添加联合索引。 - 在
user
表的username
和email
字段加唯一索引。
三、核心功能实现
- 用户认证
- JWT集成: 用户登录后返回JWT令牌,前端存储在localStorage。
- 多角色登录:
@PostMapping("/login")
public Result login(@RequestBody LoginDTO dto) {
User user = userService.findByUsername(dto.getUsername());
if (matchesBCrypt(dto.getPassword(), user.getPassword())) {
String token = JWTUtil.generateToken(user.getId(), user.getRole());
return Result.success(token);
}
throw new AuthException("密码错误");
}
- 课程发布流程
- OSS文件上传:
@PostMapping("/upload")
public Result uploadVideo(@RequestParam("file") MultipartFile file) {
String url = ossClient.upload(file);
return Result.success(url);
}
- 富文本编辑: 使用WangEditor集成到Vue组件。
- Elasticsearch搜索
- 数据同步: 通过Logstash定时同步MySQL课程数据到ES。
- 高亮搜索:
SearchRequest request = new SearchRequest("courses");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
.query(QueryBuilders.matchQuery("title", keyword))
.highlighter(new HighlightBuilder().field("title"));
四、安全与性能优化
- 接口防护
- 限流: 使用Redis实现滑动窗口计数:
String key = "API_LIMIT:" + userId;
Long count = redisTemplate.opsForValue().increment(key, 1);
if (count == 1) redisTemplate.expire(key, 1, TimeUnit.MINUTES);
if (count > 60) throw new RateLimitException();
- 缓存策略
- 课程详情缓存:
@Cacheable(value = "course", key = "#id")
public CourseVO getCourseDetail(Long id) {
return courseMapper.selectDetailById(id);
}
五、部署方案
- Docker编排
# MySQL容器
docker run -d --name mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-v /data/mysql:/var/lib/mysql \
mysql:8.0
# Spring Boot应用
docker build -t course-app .
docker run -d -p 8080:8080 course-app
- Nginx配置
server {
listen 80;
location /api {
proxy_pass http://backend-server;
}
location / {
root /var/www/frontend;
try_files $uri $uri/ /index.html;
}
}
六、扩展与监控
- 微服务改造
- 使用Spring Cloud Alibaba拆分模块:
- 课程服务
- 用户服务
- 搜索服务
- 监控体系
- Prometheus配置
scrape_configs:
- job_name: 'spring'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['app:8080']
- Grafana仪表盘: 展示QPS、错误率、JVM指标。
七、测试策略
- 自动化测试
- 单元测试: Mockito模拟Service层。
- API测试: Postman Collection + Newman持续集成。
- 压力测试: JMeter模拟1000并发课程搜索。
通过以上步骤的系统化实施,可在10周内完成一个高可用的精品课程平台,具备良好的扩展性和维护性。建议使用Swagger维护API文档,并采用Git Flow规范代码管理。