谷粒学院在线教育系统项目总结

本项目是基于B2C的商业模式,微服务的架构。采用前后端分离开发的设计思想。前端主要使用了Vue、element-ui、Nust、echarts等技术,后端主要使用了SpringBoot(快速构建Spring项目的脚手架)、SpringCloud(Nacos注册中心、 feign注册与发现、Hystrix断路器、Gateway网关)、mybatisPlus、EasyExcel、阿里云OSS的视频点播与短信服务、Redis、HttpClient、Docker+Jenkins等技术,开发历经一个月的时间。

由于我在本项目中主要开发后端部分,所以下面只对后端部分进行总结:

1、后端主要分为:登录注册模块、讲师管理模块、课程分类模块、课程管理模块、统计分析模块以及权限管理模块

1)登录注册模块

1.普通登录

  • 注册:利用阿里云的短信服务将后端生成的验证码通过阿里云发送给该手机号,并将前端传来的注册信息封装成一个vo类,根据用户的手机号对用户表进行查询,如果发现该手机号已注册,则抛出一个异常,前端显示“手机号已注册”,否则将该用户信息存入用户表。
  • 登录:将前端传来的登录信息号数据库中的信息进行比对,如果该数据库中有该信息则返回根据用户的信息生成的一个token值,前端可以根据该token获取用户名进行显示。

2.微信登录

1.配置文件(设置微信登陆的信息):

wx.open.app_id=xxxxxxx
wx.open.app_secret=xxxxxx
wx.open.redirect_url=http://localhost:8160/api/ucenter/wx/callback

2.编写callback接口

当访问设置的wx.open.redirect_url地址时,会访问本地的callback接口并且携带一个code值

然后使用code通过HttpClient访问固定的wx地址,返回一个openid (微信用户的唯一标识)和 access_token

最后使用access_token和openid去访问另一个微信提供的固定地址,获取扫描人的信息。

2)讲师管理模块

通过各种增删改查操作对讲师表进行操作(查询所有讲师,逻辑删除讲师,分页查询讲师,条件查询带分页的讲师列表,添加讲师等等)

1.逻辑删除

在数据库中设置一个deleted字段,‘0‘表示未删除,‘1’表示已删除, 并在实体类的deleted字段上@TableLogic,以及在配置文件中添加:

#mybatis-plus.global-config.db-config.logic-delete=isDeleted
#mybatis-plus.global-config.db-config.logic-delete-value= 1
#mybatis-plus.global-config.db-config.logic-not-delete-value=0

即可实现逻辑删除功能。

2.分页查询

创建page实例:Page pageTeacher = new Page<>(current,limit);

并调用:teacherService.page(pageTeacher,null);

3.带条件的分页查询

创建page实例:Page pageTeacher = new Page<>(current,limit);

构建条件:QueryWrapper wrapper = new QueryWrapper<>();

if(!StringUtils.isEmpty(name)) {
    //构建条件
    wrapper.like("name",name);
}
if(!StringUtils.isEmpty(level)) {
    wrapper.eq("level",level);
}
if(!StringUtils.isEmpty(begin)) {
    wrapper.ge("gmt_create",begin);
}
if(!StringUtils.isEmpty(end)) {
    wrapper.le("gmt_create",end);
}

进行查询:teacherService.page(pageTeacher,wrapper);

4.头像上传

使用阿里云进行图片的存储,并将最后的路径存放在讲师表中的avtar字段中。

1.设置四个值对阿里云的存储位置进行设置

String endpoint = ConstantPropertiesUtils.END_POINT;
String accessKeyId = ConstantPropertiesUtils.ACCESS_KEY_ID;
String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET;
String buckedName = ConstantPropertiesUtils.BUCKET_NAME;

2.设置按文件的存储路径url,然后进行返回。

5.Feign服务的发现(远程过程调用)

1.配置文件
  • spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 //Nacos注册
  • feign.hystrix.enabled=true //开启断路器
2.主启动类
  • @EnableDiscoveryClient //nacos注册
  • @EnableFeignClients //服务调用
3.编写接口
@Component    
@FeignClient(name = "service-order", fallback = OrdersDegradeFeign.class)
public interface OrdersClient {
   @GetMapping("/eduorder/order/isBuyCourse/{courseId}/{userid}")
   public boolean isBuyCourse(@PathVariable("courseId") String courseId, @PathVariable("userid") String userid);
}
3)课程分类模块

1.通过EasyExcel技术将excel表中的课程分类信息一行一行的读取出来插入到课程分类数据库中

1.Excel监听器:

public class ExcelListener extends AnalysisEventListener<DemoData> {
    //一行一行读取excel内容
    @Override
    public void invoke(DemoData data, AnalysisContext analysisContext) {
        System.out.println("****"+data);
    }

    //读取表头中的内容
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        System.out.println("表头:"+headMap);
    }

    //读取完成后
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}

2.文件输入流: InputStream in = file.getInputStream();

3.读取Excel:EasyExcel.read(in, SubjectData.class,new SubjectExcelListener(subjectService)).sheet().doRead();

4)课程管理模块

1.课程的视频存储

本模块用到了阿里云的视频点播

设置阿里云访问的id和密钥

UploadStreamRequest request = new UploadStreamRequest(ConstantVodUtils.ACCESS_KEY_ID, ACCESS_KEY_SECRET, title, fileName, inputStream);
5)统计分析模块

本模块通过远程过程调用service_ucenter模块中的查询每天注册人数的接口获取每天的注册人数,将获取到的数据存入数据库中并封装后传给数据库。然后前端经过echarts绘制出每天的注册人数的统计图。

6)权限管理模块

本模块主要采用了SpringSecurity框架进行开发,SpringSecurity就是一串过滤器链,主要的过滤器有登录认证过滤器和授权过滤器。

当一个用户进行登录操作,会被登录认证过滤器拦截,对用户权限数据表进行查询,如果有该用户,则会获取该用户的一系列权限值,(单点登录:会将以用户名为key, 用户权限列表为value存入redis缓存中)并根据用户的信息生成一个token值(token头 + 主体(用户信息)+哈希校验码)存入cookie中,用户每次访问一个接口都会有携带token的header,用户从header中获取token值,并根据token值获取用户名(单点登录:根据用户名从redis中获取用户的权限列表,如果该用户有该权限则允许访问该页面);
在这里插入图片描述

单点登录的实现方式:

  • session的广播机制
  • 使用cookie+redis实现

1.登录之后把数据放到两个地方
redis中,生成一个唯一的随机值(ip,用户id,uid等)作为key, 用户数据作为value
把redis里面生成的key值放到cookie
2.访问其他模块,发送请求会带着cookie进行发送,获取cookie值(redis中的key)
然后到redis中进行查询,如果有数据证明已登录

  • 使用token实现

1.登录之后,按规则生成字符串,把登录之后的用户信息包含到生成字符串里面,把字符串返回
(1)把字符串通过cookie返回
(2)把字符串通过地址栏返回
2.再去访问项目其他模块,每次访问在地质栏带着生成字符串,在访问的模块中可以获取地址栏中的信息(和ip地址),得到用户信息,如果可以获取到就已经登录了
一般采用通用的token的生成规则 JWT, JWT由三部分组成 可以生成一个字符串,包含用户信息(jwt头信息 + 有效载荷(用户信息) + 签名哈希(防伪标志))

项目中遇到的问题和解决方案

1.前端-路由切换问题

(1)多次路由跳转到同一个vue页面, 页面中的create方法只执行一次

(2)解决方案:使用vue监听

2.前端问题-ES6模块运行问题

(1)Nodejs不能直接运行ES6模块化

(2))解决方案:需要使用Babel把ES6模块化代码转换ES5代码执行。

3.mp生成19位id值

(1)mp生成id值是19位,JavaSrpipt处理数字类型值时候,只会处理到16位

(2))解决方案:@TableId(value = “id”, type = IdType.ID_WORKER_STR), 使用该注解将id转换为字符串类型。

4.跨域问题

(1) 访问协议,ip地址, 端口号,这三个有任何不一样产生跨域

(2)解决方案:

  • 在Controller添加@CrossOrigin(本项目刚开始使用nginx管理各个模块的访问,出现跨域问题,使用的是@CrossOrigin)
  • 通过网关解决(项目后期改成GateWay解决)
5.413问题(请求体过大)

(1)当使用阿里云视频点播时,由于使用的nginx反向代理服务器,出现了413问题。

(2)解决方案:修改了nginx的最大访问存储空间大小

6.Maven加载问题

(1)maven 加载项目时,默认不会加载src-java文件夹里xml类型文件

(2)解决方案:

  • 1.直接复制xml文件到target目录中

  • 2.pom.xml中添加build插件
    后期改成GateWay解决)

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐