一、引言
作为一名计算机专业的大三学生,我深刻感受到在线教育在学习中的重要性——无论是课后补学专业课、备考证书,还是兴趣学习编程教程,线上平台早已成为我们学习的重要载体。但在使用过程中,我发现很多主流在线教育平台存在“功能冗余”“操作复杂”的问题:比如想找一门编程课,却要在一堆广告和无关功能中翻找;提交作业后,老师批改反馈不及时,成绩查询也很麻烦。
恰逢课程设计作业要求完成一个“小型实用系统”,我便萌生了开发一款轻量化、贴合学生与老师真实需求的在线教育平台的想法。但作为编程基础不算顶尖的学生,我常因“不知道如何将想法转化为具体功能”“表结构设计混乱”“重复编写基础代码”而效率低下。直到老师推荐了飞算JavaAI——这款不仅能生成代码,还能引导学生梳理需求、细化设计的工具,让我重新找到了开发信心。接下来,我将以学生视角,记录用飞算JavaAI实现在线教育平台的完整过程。
二、环境准备
参考学长分享的电商系统开发流程,结合学生常用的Windows环境,我用3步就完成了环境搭建,全程没遇到复杂问题:
1. 下载并安装IntelliJ IDEA
作为学生,我选择IDEA社区版(免费且满足开发需求):打开JetBrains中文官网(www.jetbrains.com.cn),选择“IntelliJ IDEA Community”,下载Windows版本。安装时勾选“添加到环境变量”“创建桌面快捷方式”,下一步默认安装即可——全程约5分钟,比安装大型软件简单多了。



2. 安装飞算JavaAI插件
打开IDEA后,点击顶部菜单栏“File → Settings → Plugins”,在搜索框输入“飞算JavaAI”,找到带“feisuanyz”标识的插件(评分4.5+),点击“Install”。等待1-2分钟后重启IDEA,插件就加载完成了。这里我遇到一个小问题:插件加载慢,刷新插件市场2次后就正常了,估计是校园网波动导致的。


3. 登录飞算JavaAI
重启IDEA后,右侧会出现“飞算JavaAI”面板,点击“立即登录”

三、模块设计与编码
在完成需求分析和环境搭建后,我借助飞算JavaAI的“自然语言转代码”能力,快速生成了平台核心模块代码,仅需对业务细节做微调,极大缩短了开发周期。以下是模块开发的完整过程:
1. 飞算JavaAI生成基础模块
飞算JavaAI最让我惊喜的是“无需专业术语,口语化需求也能精准转代码”。我在插件面板的“需求编辑器”中,直接用学生视角描述核心需求:
“生成在线教育平台基础模块,包含3类核心实体:用户(区分学生/老师角色,含学号/工号、姓名、角色、邮箱)、课程(课程ID、名称、分类、关联老师ID、视频地址、简介)、作业(作业ID、关联课程ID、标题、截止时间、要求);实现核心功能:用户登录/注册(区分角色权限)、老师创建课程/上传视频/发布作业、学生浏览课程/报名/提交作业、作业批改与成绩展示;技术栈:Spring Boot 3.x + MyBatis-Plus + MySQL 8.0,前端用Thymeleaf+Bootstrap(适配学生端浏览器)。”
点击“提交需求”后,飞算JavaAI自动拆解需求

生成“实体设计→接口定义→表结构→源码”的开发链路,全程无需手动干预。



点击“开始生成”

最终生成的项目结构清晰,核心包与类已完整创建,省去了我手动建包、写基础类的麻烦:
com.student.education
├─ entity // 实体类(映射数据库表)
│ ├─ User.java // 用户实体(学生/老师)
│ ├─ Course.java // 课程实体
│ ├─ Video.java // 视频实体
│ ├─ Homework.java // 作业实体
│ └─ HomeworkSubmit.java // 作业提交实体
├─ dto // 数据传输对象(接收前端请求参数)
│ ├─ UserRegisterDTO.java // 注册请求DTO
│ ├─ CourseAddDTO.java // 课程创建DTO
│ ├─ HomeworkSubmitDTO.java // 作业提交DTO
│ └─ CourseQueryDTO.java // 课程查询DTO
├─ vo // 视图对象(向前端返回数据)
│ ├─ CourseDetailVO.java // 课程详情VO
│ ├─ HomeworkFeedbackVO.java // 作业批改反馈VO
│ └─ StudentCourseVO.java // 学生已报名课程VO
├─ mapper // 数据访问接口(MyBatis-Plus)
│ ├─ UserMapper.java
│ ├─ CourseMapper.java
│ └─ HomeworkMapper.java
├─ service // 业务逻辑层
│ ├─ UserService.java
│ ├─ CourseService.java
│ └─ HomeworkService.java
├─ controller // 接口控制层
│ ├─ UserController.java
│ ├─ CourseController.java
│ └─ HomeworkController.java
└─ config // 配置类(数据库、静态资源映射)
└─ WebConfig.java

打开项目

2. 核心代码展示
飞算JavaAI生成的代码不仅结构规范,还自带参数校验、事务控制和详细注释,我仅需根据实际场景补充少量业务逻辑,以下是关键模块的代码示例:
(1)entity包:核心实体类
User.java(用户实体,区分学生/老师角色)
package com.student.education.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
* <p>
* 用户实体类:映射user表,区分学生(role=0)和老师(role=1)角色
* </p>
* @author feisuan-javaai(学生开发者二次优化)
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("user") // 关联数据库表名
public class User {
/**
* 用户ID:主键,自增
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 账号:学生填学号,老师填工号,唯一非空
*/
private String account;
/**
* 密码:存储加密后的字符串(飞算提示:需用BCrypt加密)
*/
private String password;
/**
* 姓名:用户真实姓名
*/
private String name;
/**
* 角色:0=学生,1=老师(用于权限控制)
*/
private Integer role;
/**
* 邮箱:用于找回密码、接收作业提醒
*/
private String email;
/**
* 创建时间:用户注册时间,自动填充
*/
private LocalDateTime createTime;
}
Course.java(课程实体,关联老师与分类)
package com.student.education.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
* <p>
* 课程实体类:映射course表,关联创建老师
* </p>
* @author feisuan-javaai(学生开发者二次优化)
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("course")
public class Course {
/**
* 课程ID:主键,自增
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 课程名称:非空,如“Java编程基础”
*/
private String courseName;
/**
* 课程分类:如“编程类”“数学类”“英语类”
*/
private String category;
/**
* 关联老师ID:外键,关联user表(role=1)
*/
private Long teacherId;
/**
* 课程简介:描述课程内容、学习目标
*/
private String description;
/**
* 课程封面图地址:展示在课程列表页
*/
private String coverUrl;
/**
* 创建时间:课程发布时间
*/
private LocalDateTime createTime;
/**
* 状态:0=未发布,1=已发布(老师可草稿保存)
*/
private Integer status;
}
(2)dto包:数据传输对象(带参数校验)
CourseAddDTO.java(老师创建课程的请求DTO)
package com.student.education.dto;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
* <p>
* 课程创建请求DTO:接收老师前端传入的课程数据,含参数校验
* </p>
* @author feisuan-javaai
*/
@Data
public class CourseAddDTO {
/**
* 课程名称:必填,长度不超过50字
*/
@NotBlank(message = "课程名称不能为空")
private String courseName;
/**
* 课程分类:必填,只能是预设的分类(编程类/数学类/英语类)
*/
@NotBlank(message = "课程分类不能为空")
private String category;
/**
* 老师ID:必填,从登录态中获取(避免手动输入)
*/
@NotNull(message = "创建老师ID不能为空")
private Long teacherId;
/**
* 课程简介:非必填,但为空时默认填充“暂无简介”
*/
private String description;
/**
* 课程状态:必填,0=草稿,1=发布
*/
@NotNull(message = "课程状态不能为空")
private Integer status;
}
HomeworkSubmitDTO.java(学生提交作业的请求DTO)
package com.student.education.dto;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.springframework.web.multipart.MultipartFile;
/**
* <p>
* 作业提交请求DTO:接收学生上传的作业文件与关联信息
* </p>
* @author feisuan-javaai(学生开发者补充文件上传字段)
*/
@Data
public class HomeworkSubmitDTO {
/**
* 学生ID:必填,从登录态获取
*/
@NotNull(message = "学生ID不能为空")
private Long studentId;
/**
* 作业ID:必填,关联homework表
*/
@NotNull(message = "作业ID不能为空")
private Long homeworkId;
/**
* 作业文件:必填,支持PDF/Word,最大5MB
*/
@NotNull(message = "作业文件不能为空")
private MultipartFile homeworkFile;
/**
* 作业备注:非必填,学生补充说明
*/
private String remark;
}
(3)vo包:视图对象(向前端隐藏敏感字段)
CourseDetailVO.java(课程详情VO,给学生展示)
package com.student.education.vo;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
/**
* <p>
* 课程详情VO:封装学生查看课程时需要的所有信息,隐藏老师ID等敏感字段
* </p>
* @author feisuan-javaai
*/
@Data
public class CourseDetailVO {
/**
* 课程ID
*/
private Long courseId;
/**
* 课程名称
*/
private String courseName;
/**
* 课程分类
*/
private String category;
/**
* 老师姓名:展示老师姓名,而非老师ID
*/
private String teacherName;
/**
* 课程简介
*/
private String description;
/**
* 课程封面图地址
*/
private String coverUrl;
/**
* 课程视频列表:包含视频标题、播放地址、时长
*/
private List<VideoVO> videoList;
/**
* 课程关联作业:包含作业标题、截止时间
*/
private List<HomeworkSimpleVO> homeworkList;
/**
* 学生是否已报名:true=已报名(可看视频),false=未报名(需报名)
*/
private Boolean isEnrolled;
}
(4)service包:业务逻辑实现(含核心校验)
CourseServiceImpl.java(课程服务实现类,含报名校验)
package com.student.education.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.student.education.dto.CourseAddDTO;
import com.student.education.entity.Course;
import com.student.education.entity.CourseEnroll;
import com.student.education.entity.User;
import com.student.education.mapper.CourseEnrollMapper;
import com.student.education.mapper.CourseMapper;
import com.student.education.mapper.UserMapper;
import com.student.education.service.CourseService;
import com.student.education.vo.CourseDetailVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* <p>
* 课程服务实现类:处理课程创建、报名、详情查询等业务
* </p>
* @author feisuan-javaai(学生开发者补充报名逻辑)
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> implements CourseService {
private final CourseMapper courseMapper;
private final UserMapper userMapper;
private final CourseEnrollMapper courseEnrollMapper;
/**
* 老师创建课程
*/
@Override
@Transactional // 事务控制:确保课程创建失败时回滚
public Course addCourse(CourseAddDTO courseAddDTO) {
log.info("老师创建课程:老师ID={},课程名称={}", courseAddDTO.getTeacherId(), courseAddDTO.getCourseName());
// 1. 校验老师身份(必须是role=1的用户)
User teacher = userMapper.selectById(courseAddDTO.getTeacherId());
if (teacher == null || teacher.getRole() != 1) {
throw new RuntimeException("无效的老师账号,无法创建课程");
}
// 2. DTO转实体,补充默认值
Course course = new Course();
BeanUtils.copyProperties(courseAddDTO, course);
// 课程封面图默认值:用平台默认封面
if (course.getCoverUrl() == null || course.getCoverUrl().isEmpty()) {
course.setCoverUrl("/static/images/default-course-cover.png");
}
// 创建时间自动填充(数据库用DEFAULT CURRENT_TIMESTAMP)
course.setCreateTime(LocalDateTime.now());
// 3. 保存课程
save(course);
log.info("课程创建成功:课程ID={}", course.getId());
return course;
}
/**
* 学生报名课程(核心逻辑:避免重复报名、校验课程状态)
*/
@Override
@Transactional
public void enrollCourse(Long studentId, Long courseId) {
log.info("学生报名课程:学生ID={},课程ID={}", studentId, courseId);
// 1. 校验学生身份
User student = userMapper.selectById(studentId);
if (student == null || student.getRole() != 0) {
throw new RuntimeException("无效的学生账号,无法报名课程");
}
// 2. 校验课程状态(必须是已发布状态:status=1)
Course course = getById(courseId);
if (course == null) {
throw new RuntimeException("课程不存在");
}
if (course.getStatus() != 1) {
throw new RuntimeException("课程未发布,暂无法报名");
}
// 3. 校验是否已报名(避免重复报名)
CourseEnroll existingEnroll = courseEnrollMapper.selectByStudentAndCourse(studentId, courseId);
if (existingEnroll != null) {
throw new RuntimeException("已报名该课程,无需重复操作");
}
// 4. 保存报名记录
CourseEnroll courseEnroll = new CourseEnroll();
courseEnroll.setStudentId(studentId);
courseEnroll.setCourseId(courseId);
courseEnroll.setEnrollTime(LocalDateTime.now());
courseEnrollMapper.insert(courseEnroll);
log.info("学生报名成功:报名记录ID={}", courseEnroll.getId());
}
/**
* 查询课程详情(给学生展示,包含是否已报名)
*/
@Override
public CourseDetailVO getCourseDetail(Long studentId, Long courseId) {
// 1. 查询课程基础信息
Course course = getById(courseId);
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/yunjianyue1314/article/details/151718156



