# Code2Money
**Repository Path**: Nan_Jin/code2money
## Basic Information
- **Project Name**: Code2Money
- **Description**: 一个分布式在线学习平台的功能模块,其中包括课程管理模块、媒资管理模块、framework通用模块、各种工具类等
- **Primary Language**: Java
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-04-04
- **Last Updated**: 2023-04-11
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Code2Money-码上有元
#### 项目简介
Code2Money-码上有元是一个在线 IT 技术教育平台,运营方管理机构上传的教学视频,用户可以注册平台账号,体验公开课或者购买付费课程学习。
项目采用前后端分离的技术架构,整体使用 Spring Cloud 构建微服务技术栈,数据库采用 MySQL,还使用了 Mybatis-Plus,Redis,Xxl-Job等技术。所有微服务模块都使用 Spring Boot 创建,功能模块统一拆分为接口层、数据模型层、业务层。使用 Maven 对工程整体进行依赖版本等的管理
#### 前情提要
如你所见,这确实是一个学习项目,因为目前还是在校生,所以并没有接触过真实的企业级的项目开发,但我会尽我所能说明我所掌握的一切,所以这不仅是一个项目的介绍文件,其中也会参杂着一些其他的东西。同时,也希望通过这个小项目获得一个实习的机会
#### 内置模块
**code2money**
- 整体的父pom模块,统一管理整个项目的 maven 包以及依赖的版本信息等,方便管理
**code2money-framework**
提供一些系统级的服务功能,被其他模块引入,比如一些实例的配置,便于开发的工具类,自定义的线程池等等。其中具体的内容有
- 统一返回的分页数据模型,异常信息模型
- 自定义线程池
- Mybatis-Plus 字段自动填充
- 全局异常处理,接口层参数校验
**code2money-content**
课程基本信息,课程营销信息,教学计划,公开课程信息的完整的增删改查业务
- 增删改查业务包括不同业务之间的表信息的修改及查询
- 结合 Redis 做数据缓存,同时也解决缓存带来的一些问题
- 采用删除缓存重建而不是更新缓存,减少很多无用的操作
- 设置随机过期时间,避免缓存雪崩
- 不存在的数据缓存空字段,避免缓存穿透
- 分布式锁结合逻辑过期,避免缓存击穿
- 分布式锁异步更新缓存
- 封装一个缓存数据类,并设有逻辑过期时间
- 并发访问时,如果逻辑过期为真,开始争夺分布式锁
- 如果争取到,那么另开一个线程去重建缓存,然后当前线程返回旧的数据
- 如果没争取到,那么返回旧的数据
- 审核课程,发布课程
**code2money-media**
媒体资源的统一管理模块,主要进行文件的上传和下载,媒体资源信息入表,大文件的分块上传
- 前端上传的分块文件调用 api 进行上传,传到 Minio 中
- 分块文件合成,再把整体文件传回 Minio
- 文件下载与校验
- 通过自定义的线程池异步下载,最后统一合成为一个整体文件
- 合成后,需要和源文件进行校验,项目中校验的是文件的大小和 Md5 值
- 上传和下载都会进行检查,避免任务重复执行
- 不同文件格式的处理
- Xxl-Job 任务调度,把不是 .mp4 格式的媒体资源处理为 .mp4 文件
- 处理后设置资源 url ,前端可以预览
**code2money-message-sdk**
消息处理 sdk,通过 Xxl-Job 处理任务消息表中的任务,项目中主要体现为转换视频文件格式
- 提供一套完整的任务消息表增删改查业务,分为两张表,待处理和已处理
- 任务处理抽象类,使用时需要继承该类,重写其中的 `execute(MqMessage mqMessage)`方法
- 任务处理时为异步进行,调用者只需要写明任务如何处理即可
**code2money-search**
创建 es 的索引模块,提供了 es 索引的创建与删除接口,主要是为课程添加索引,方便查询
#### 构建说明
1. Nacos 注册中心
上面提到的所有模块都注册到注册中心,Nacos 可以做服务发现,可以启动多台实例,提高模块的可用性
同时在 Nacos 中统一管理配置文件,按命名空间,组别分类
2. 网关
可以再部署一个网关模块,前台都访问网关接口,再通过网关分发到各个微服务,进行负载均衡。常见的负载均衡算法比如轮询,请求会平均的发到服务实例中
网关还可以鉴权,对用户的权限鉴定,黑名单,白名单都可以在网关编写,保证微服务模块内部的安全
3. 远程调用
使用 OpenFeign 在不同的微服务之间远程调用,本端也要配置熔断处理,不能阻塞导致服务瘫痪
4. 部署
使用 docker 部署,编写 Dockerfile,包括 Redis,MySQL 服务也在 docker 中部署,要注意数据库中的数据文件要挂载到服务器本地,否则服务停止数据都会丢失
#### 使用说明
1. xxxx
2. xxxx
3. xxxx
#### 参与贡献
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request