JP4-1-MyLesson项目简介
Java道经 - 项目 - MyLesson - 项目简介
文章目录
- S01. 项目简介
- E01. 基本介绍
- 1. 管理员权限
- 2. 普通用户权限
- 3. 后端技术选型
- 4. 前端技术选型
- E02. 通用环境
- 1. MySQL数据库
- 2. MinIO文件数据库
- 3. Redis缓存数据库
- 4. ELK日志收集系统
- 5. Nginx代理服务器
- 6. Nacos注册中心
- 7. Sentinel流量卫兵
- 8. Zipkin链路追踪
- 9. RocketMQ消息队列
- 10. Seata事务保护
- 11. xxl-job定时任务
- S02. 数据信息
- E01. UMS用户微服务
- 1. 用户表user
- 2. 角色表role
- 3. 菜单表menu
- 4. 用户角色关系表user_role
- 5. 角色菜单关系表role_menu
- E02. CMS课程微服务
- 1. 类别表category
- 2. 课程表course
- 3. 季次表season
- 4. 集次表episode
- 5. 评论表comment
- 6. 举报表report
- E03. SMS营销微服务
- 1. 通知表notice
- 2. 横幅表banner
- 3. 新闻表article
- 4. 秒杀表seckill
- 5. 秒杀明细表seckill_detail
- 6. 优惠卷表coupons
- E04. OMS订单微服务
- 1. 购物车表cart
- 2. 订单表order
- 3. 订单明细表order_detail
- S03. 同步商品信息
- E01. 准备ES数据库
- 1. 创建ES索引
- 2. 测试分词效果
- E02. 同步MySQL数据
- 1. 同步课程表数据
心法:本章使用 Maven 父子结构项目进行练习
练习项目结构如下:
|_ my-lesson|_ ml-common|_ ml-generator|_ 24101 ml-gateway|_ 24102 ml-user|_ 24103 ml-course|_ 24104 ml-sale|_ 24105 ml-order|_ 24106 ml-search|_ 24107 ml-socket|_ 24108 ml-web|_ ml-miniapp
武技:搭建练习项目结构
- 创建父项目 my-lesson,删除 src 目录:
- 调整项目编码为 UTF-8。
- 调整项目的 Maven 路径,包括家目录,配置文件地址和仓库地址。
- 在父项目中管理依赖:包括 SpringBoot, SpringCloud, SpringCloudAlibaba, MicrometerTracing 等:
<properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring-boot.version>3.2.5</spring-boot.version><spring-cloud.version>2023.0.1</spring-cloud.version><spring-cloud-alibaba.version>2023.0.1.0</spring-cloud-alibaba.version><micrometer-tracing.version>1.0.4</micrometer-tracing.version><junit.version>4.13.2</junit.version><lombok.version>1.18.24</lombok.version><hutool.version>5.8.25</hutool.version><easyexcel.version>3.3.4</easyexcel.version><minio.version>3.0.10</minio.version><okio.version>3.5.0</okio.version><hibernate-validator.version>8.0.1.Final</hibernate-validator.version><jjwt.version>0.9.1</jjwt.version><jaxb-api.version>2.3.1</jaxb-api.version><mybatis-flex.version>1.10.2</mybatis-flex.version><mybatis-flex-codegen.version>1.10.1</mybatis-flex-codegen.version><knife4j.version>4.4.0</knife4j.version><mysql.version>8.2.0</mysql.version><feign-micrometer.version>12.3</feign-micrometer.version><xxl-job.version>2.4.2</xxl-job.version><qrcode.version>3.3.3</qrcode.version><alipay-easysdk.version>2.2.0</alipay-easysdk.version>
</properties>
<dependencyManagement><dependencies><!--spring-boot-starter-parent--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!--spring-cloud-dependencies--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!--spring-cloud-alibaba-dependencies--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency><!--micrometer-tracing-bom--><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing-bom</artifactId><version>${micrometer-tracing.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
- 在父项目中添加依赖:包括 Junit, Lombok, Hutool, SpringBootTest 等:
<dependencies><!--junit--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version><scope>test</scope></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version><scope>provided</scope></dependency><!--hutool-all--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>${hutool.version}</version></dependency><!--spring-boot-starter-test--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency>
</dependencies>
S01. 项目简介
心法:MyLesson 项目简介
MyLesson 项目,全称《我的在线课堂》,是一个精心设计和开发的线上学习平台,其灵感来源于网易云课堂、腾讯云课堂等知名在线教育平台。该项目的核心理念是为用户提供一个更加优雅、专注且简洁的学习环境,同时提供强有力的技术支持。
通过这个平台,用户不仅能够享受到高质量的在线课程和互动体验,还能在任何时间、任何地点轻松获取所需的知识资源。 我们致力于打造一个高效、便捷且舒适的在线学习空间,使每一个渴望学习的人都能在这里找到适合自己的课程。无论是专业技能提升还是个人兴趣培养,我们的平台都能满足不同用户的需求。此外,我们还特别注重用户体验,确保界面友好、操作简便,并不断优化平台性能,以确保流畅的学习过程。
MyLesson 项目全面采用了微服务架构,以面向对象和面向接口的方式进行开发。这种设计不仅提高了代码的可维护性和扩展性,还增强了系统的灵活性和性能。在项目的前端和后端开发中,无论是用户界面还是管理员界面,我们都选择了 SpringBoot + MyBatisFlex 框架,确保了数据处理和业务逻辑的高效实现。对于后台(管理员)的前端部分,我们选用了 Vue3 与 ElementPlus 组合,为管理员提供了直观且易于操作的界面。至于前台(用户)端,则通过微信小程序来构建,这样可以充分利用微信平台的优势,提供更加便捷和流畅的用户体验。整个项目的设计和实施都充分考虑到了用户体验和技术实现的最佳结合。
总之,我们的目标是让学习变得更加简单和愉快,让用户在享受优质教育资源的同时,也能感受到学习的乐趣。无论你是学生、职场人士还是终身学习者,MyLesson 都将是你理想的在线学习伙伴。
电商项目 VS 在线教育项目:
- 电商项目:电商项目是以电子商务为主要经营模式,涵盖从电子商务模式策划到系统建设和运营的全过程,涉及多方参与者,包括买家、卖家、银行或金融机构、政府机构、认证机构、配送中心等,依赖网上银行、在线电子支付、数据加密、电子签名等关键技术,实现商品、服务及资金等价值的在线交换和流通。
- 在线教育项目:在线教育项目是利用互联网技术将传统教育模式转移到线上,为用户提供在线学习和教学服务。如网易云课堂、腾讯云课堂,其核心业务是聚合教育机构和个人教师,提供课程资源,让学生通过互联网随时随地访问课程内容,与教师进行互动交流,完成作业和考试。平台的主要盈利方式是通过售卖课程、收取商家入驻费用或提供增值服务等,与电商项目通过商品交易盈利的模式有本质区别。
综上所述,网易云课堂、腾讯云课堂等在线教育平台,虽然在运营过程中涉及到课程的售卖和资金的流转,但这只是其业务的一部分,且课程并非传统意义上的商品,其核心业务和功能更符合在线教育项目的定义。
MyLesson 项目整体架构解析:
子项目 | 中文 | 描述 | 端口占用 |
---|---|---|---|
ml-common | 公共子项目 | 提供公共的工具和模块 | |
ml-generator | 生成器项目 | 提供MyBatisFlex代码生成功能 | |
ml-gateway | 网关项目 | 统一路由 | 24101 |
ml-user | 用户微服务 | 登录,注册,用户管理,角色管理,菜单管理等 | 24102 |
ml-course | 课程微服务 | 课程管理,季次管理,集次管理,评价管理,举报管理 | 24103 |
ml-sale | 营销微服务 | 广告管理,通知管理,秒杀活动管理 | 24104 |
ml-order | 订单微服务 | 购物车管理,订单管理 | 24105 |
ml-search | 搜索微服务 | 提供ElasticSearch搜索服务支持,如课程搜索 | 24106 |
ml-socket | 通信微服务 | 提供WebSocket通信服务支持,如视频弹幕功能 | 24107 |
ml-web | 后台管理页面 | 与后台系统直接交互的前端设计 | 24108 |
ml-miniapp | 前台微信小程序 | 与前台用户直接交互的前端设计 |
E01. 基本介绍
1. 管理员权限
心法:Lesson 项目中的管理员角色又细分为课程管理员,营销管理员,订单管理员,用户管理员,系统管理员五大类。
角色 | 权限 |
---|---|
课程管理员 | 管理课程类别,课程,课程季次,课程集次,课程评论,课程举报等数据 |
营销管理员 | 管理通知,横幅,新闻通告,秒杀活动,优惠卷等数据 |
订单管理员 | 管理购物车,订单等数据 |
用户管理员 | 管理权限菜单,角色,用户等数据 |
系统管理员 | 继承以上全部角色的权限,额外支持日志管理等 |
2. 普通用户权限
心法:Lesson 项目中的普通用户又细分为访客,已登录和已经支付三种状态。
访客状态:当处于访客状态时,普通用户可以执行一系列基本操作,例如注册账号、登录系统、浏览横幅广告、阅读新闻动态以及查看系统通知。此外,他们还可以搜索感兴趣的课程,并详细查看课程信息。
登录状态:一旦普通用户成功登录,他们将获得更多的功能权限。除了能够继续使用上述所有功能之外,登录后的用户还可以查看并修改自己的个人信息,选择注销或登出账户,使用购物车功能来挑选和管理心仪的课程,包括查看购物车,删除购物车,清空购物车,从购物车进行课程购买等。
支付状态:当普通用户支付成功后,支持查看个人订单记录,在线观看已购课程,发表对课程的评论,举报不合适的课程内容,发送实时弹幕,以及收藏喜欢的课程以便日后参考和学习。
通过这些功能,用户能够更便捷地管理和享受他们在平台上的学习体验。
3. 后端技术选型
技术选型 | 描述 | 版本 |
---|---|---|
单元测试 | junit | 4.13.2 |
代码简化 | lombok | 1.18.24 |
通用工具 | hutool | 5.8.25 |
数据库驱动 | mysql-connector-j | 8.2.0 |
持久层框架 | mybatis-flex-spring-boot3-starter | 1.10.2 |
控制层框架 | spring-boot-starter-parent | 3.2.5 |
搜索引擎 | spring-boot-starter-data-elasticsearch | 3.2.5 |
缓存容器 | spring-boot-starter-data-redis | 3.2.5 |
缓存工具 | spring-boot-starter-cache | 3.2.5 |
登录校验 | jjwt | 0.9.1 |
参数校验 | hibernate-validator | 8.0.1.Final |
报表打印 | easyexcel | 3.3.4 |
对象存储 | minio | 3.0.10 |
文档工具 | knife4j-openapi3-jakarta-spring-boot-starter | 4.4.0 |
注册中心 | spring-cloud-starter-alibaba-nacos-discovery | 2022.0.0.0 |
配置中心 | spring-cloud-starter-alibaba-nacos-config | 2022.0.0.0 |
服务容错 | spring-cloud-starter-alibaba-sentinel | 2022.0.0.0 |
分布式事务 | spring-cloud-starter-alibaba-seata | 2022.0.0.0 |
分布式调度 | xxl-job | 2.4.2 |
远程调用 | spring-cloud-starter-openfeign | 4.0.4 |
链路追踪 | micrometer-tracing | 1.11.5 |
消息队列 | rocketmq-spring-boot-starter | 2.2.2 |
4. 前端技术选型
技术选型 | 描述 | 版本 |
---|---|---|
页面布局 | HTML | 5 |
页面美化 | CSS | 3 |
脚本功能 | ECMAScript | 6 |
前端服务器 | node | 20.12.0 |
Vue脚手架 | vite | 5.5.1 |
Vue路由 | vue-router | 4.0.3 |
Vue样式预处理器 | sass-embedded | 1.77.8 |
Vue状态管理 | vuex | 4.0.0 |
AJAX产品 | axios | 1.6.7 |
WEB框架 | element-plus | 2.5.3 |
WEB框架图标库 | icons-vue | 2.3.1 |
WEB框架暗黑库 | @vueuse/core | 10.7.2 |
视频播放器 | xgplayer | 3.0.11 |
图表库 | ApacheEcharts | 5.4.3 |
用户前端 | 微信小程序 |
E02. 通用环境
心法:全部子项目均使用此环境配置进行搭建和开发
环境&工具 | 技术选型 | 版本 | 端口占用 |
---|---|---|---|
开发工具箱 | JDK | 17.0.9 | |
集成开发环境 | IntelliJ IDEA | 2023.3.3.win | |
项目管理工具 | Maven | 3.9.9 | |
版本控制工具 | Git | 2.28.0.windows.1 | |
压力测试工具 | JMeter | 5.4.1 | |
虚拟机管理工具 | VmWare | 17.5.1 build-23298084 | |
虚拟操作系统 | OpenEuler | 24.03-LTS | |
容器化管理引擎 | Docker | 18.09.0 | |
数据库服务 | MySQL | 8.0.27 | 3306 |
对象存储服务 | MinIO | RELEASE.2023-08-31T15-31-16Z | 9000 |
分布式缓存服务 | Redis | 7.0.5 | 6380 |
消息队列服务 | RocketMQ | 4.8.0 | 9876 |
反向代理服务 | Nginx | 1.25.2 | 80~89 |
搜索引擎服务 | ElasticSearch | 8.4.0 | 9200 |
搜索引擎管控台服务 | Kibana | 8.4.0 | 5601 |
日志收集引擎 | Logstash | 8.4.0 | 4570~4580 |
注册中心服务 | Nacos | 2.0.3 | 8848 |
流量卫兵服务 | Sentinel | 1.8.0 | 8808 |
分布式事务服务 | Seata | 1.7.0 | 8091 |
链路追踪服务 | Zipkin | 2.21.7 | 9411 |
分布式调度 | XXL-JOB | 2.4.2 | 9527 |
1. MySQL数据库
武技:参考 JB2-3-MySQL(一)- S01E02 搭建 MySQL 单机容器,端口使用 3306 即可。
2. MinIO文件数据库
武技:参考 JB3-4-SpringBoot(三)- S04E01 搭建 MinIO 单机容器,端口使用 9000 即可。
访问 MinIO 管控台 http://192.168.40.77:9000,使用 minioadmin/minioadmin 登录,然后:
- 创建数据桶 mylesson 并修改为 Public 访问权限。
- 创建 avatar 目录并上传十二生肖头像图(英文):
- 创建 banner 目录并上传 default-banner.jpg 图片(图片随意)。
- 创建 course-cover 目录并上传 default-course-cover.jpg 图片(图片随意)。
- 创建 course-summary 目录并上传 default-course-summary.jpg 图片(图片随意)。
- 创建 episode-video 目录并上传 default-episode-video.mp4 视频(视频随意)。
- 创建 episode-video-cover 目录并上传 default-episode-video-cover.jpg 图片(图片随意)。
3. Redis缓存数据库
武技:参考 JB3-5-Redis(一) - S01E01 搭建 Redis 单机容器,端口使用 6379 即可。
4. ELK日志收集系统
武技:搭建ELK系统收集项目日志。
- 参考 JB3-6-ElasticSearch(一)- S01E01 搭建 ElasticSearch 单机容器,端口使用 9200 即可。
- 参考 JB3-6-ElasticSearch(一)- S02E01 搭建 Kibana 单机容器,端口使用 5601 即可。
- 参考 JB3-6-ElasticSearch(二)- S03E01 搭建 Logstash 单机容器,端口使用 4560,以及搭建一个 ELK 收集日志系统。
5. Nginx代理服务器
武技:参考 JB3-9-Nginx - S01E01.4 搭建 Nginx 单机容器,端口使用 80~89 即可。
6. Nacos注册中心
武技:参考 JB4-1-注册中心 - S02E02.1 搭建 Nacos 单机容器,端口使用 8848 即可。
- 在 NacosConfig 中创建微服务通用配置文件 common-config.yaml:
server:tomcat:threads:max: 200 # Tomcat线程池最大值(默认200)spring:mvc:servlet:path: /api/v1 # 请求统一前缀datasource:driver-class-name: com.mysql.cj.jdbc.Driver # 数据库驱动串username: root # 数据库用户名password: root # 数据库密码type: com.zaxxer.hikari.HikariDataSource # 数据源类型hikari:minimum-idle: 5 # 最小空闲连接数idle-timeout: 1800000 # 空闲连接超时时间,默认600000(10分钟)maximum-pool-size: 20 # 连接池最大连接数,默认是10servlet:multipart:max-file-size: -1 # 文件上传最大限制,-1表示无限制max-request-size: 1GB # 每个文件大小限制cloud:nacos:discovery:server-addr: 192.168.40.77:8848 # nacos地址data:redis:host: 192.168.40.77 # redis地址port: 6379 # redis端口timeout: 3000ms # redis连接超时时间jedis: pool:max-active: 8 # 连接池最大连接数(使用负值表示没有限制)max-wait: -1ms # 连接池最大阻塞等待时间,-1表示无限制max-idle: 8 # 连接池中的最大空闲连接min-idle: 0 # 连接池中的最小空闲连接management:tracing:sampling:probability: 1.0 # 采样率100%,意味着APP所有请求都被跟踪zipkin:tracing:endpoint: http://192.168.40.77:9411/api/v2/spans # zipkin服务地址mybatis-flex:configuration:map-underscore-to-camel-case: true # 下划线转驼峰log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 控制台SQLtype-aliases-package: com.joezhou.entity # 别名包扫描springdoc:api-docs:enabled: true # 启用SpringDocgroup-configs:- group: dev # 测试分组paths-to-match: /** # 分组规则packages-to-scan: com.joezhou.controller # 分组扫描包knife4j:enable: true # 启用knife4jsetting:language: zh_cn # 中文logging:level:com.joezhou.feign: debug # feign 远程调用配置指定包的日志等级pattern:level: ${spring.application.name:},%X{traceId:-},%X{spanId:-} # 链路追踪日志格式
7. Sentinel流量卫兵
武技:参考 JB4-3-流量卫兵 - S02E01.2 搭建 Sentinel 单机容器,端口使用 8808 即可。
8. Zipkin链路追踪
武技:参考 JB4-5-链路追踪 - S02E01.2 搭建 Zipkin 单机容器,端口使用 9411 即可。
9. RocketMQ消息队列
武技:参考 JB4-6-消息队列 - S02E01 搭建 RocketMQ 单机容器,端口使用 9876 即可。
10. Seata事务保护
武技:参考 JB4-8-事务机制 - S01E02 搭建 Seata 单机容器,端口使用 7091 即可。
11. xxl-job定时任务
武技:参考 JB4-9-任务调度- S01E02 搭建 Seata 单机容器,端口使用 9527 即可。
- 访问调度中心 http://192.168.40.77:9527/xxl-job-admin:使用 admin/123456 登录。
- 在调度中心添加以下四个执行器:
序号 | AppName | 名称 |
---|---|---|
1 | ml-user-executor | ML 用户执行器 |
2 | ml-course-executor | ML 课程执行器 |
3 | ml-sale-executor | ML 营销执行器 |
4 | ml-order-executor | ML 订单执行器 |
S02. 数据信息
心法:项目中所有子项目共用相同的数据库以及数据库表。
- 要求所有的表都必须添加:
bigint id
:主键,需要设置自增。tinyint deleted
:逻辑删除字段,0 表示未删除,1 表示已删除,默认 0。bigint version
:乐观锁字段,默认 0。datetime created
:创建时间,默认当前本地时间。datetime updated
:修改时间,默认当前本地时间。
- 要求名称标题类字段统一
varchar(128)
类型。 - 要求路径描述类字段统一
varchar(256)
类型。 - 要求信息描述类字段统一
varchar(512)
类型。
武技:开发数据库
-- db
create database ml_ums default charset utf8mb4;
create database ml_cms default charset utf8mb4;
create database ml_sms default charset utf8mb4;
create database ml_oms default charset utf8mb4;
E01. UMS用户微服务
心法:用户微服务 User Micro Services,基于 ml_ums 数据库。
库 | 表 | 描述 |
---|---|---|
ml_ums | user | 用户表 |
ml_ums | role | 角色表 |
ml_ums | menu | 菜单表 |
ml_ums | user_role | 用户角色关系表 |
ml_ums | role_menu | 角色菜单关系表 |
1. 用户表user
心法:用户表 user 中存放的是系统中每个用户的信息。
提示:MD5(“admin”) = “21232f297a57a5a743894a0e4a801fc3”
字段名 | 类型 | 注释 | 约束 | 默认值 | |
---|---|---|---|---|---|
1 | username | varchar(128) | 账号 | 非空 | ‘’ |
2 | password | varchar(128) | 密码 | 非空 | ‘’ |
3 | nickname | varchar(128) | 昵称 | 非空 | ‘’ |
4 | varchar(128) | 邮箱 | 非空 | ‘’ | |
5 | province | varchar(128) | 省份 | 非空 | ‘’ |
6 | realname | varchar(128) | 姓名 | 非空 | ‘’ |
7 | avatar | varchar(256) | 头像 | 非空 | ‘’ |
8 | zodiac | char(4) | 星座 | 非空 | ‘’ |
9 | phone | char(11) | 手机 | 非空 | ‘’ |
10 | idcard | char(18) | 身份证号 | 非空 | ‘’ |
11 | gender | tinyint | 性别,0女1男2保密 | 非空 | 0 |
12 | age | tinyint | 年龄 | 非空 | 0 |
13 | info | varchar(512) | 描述 | 非空 | ‘’ |
武技:开发用户微服务的用户信息表
-- user
create table ml_ums.user
(`id` bigint auto_increment comment '主键' primary key,`username` varchar(128) not null default '' comment '账号',`password` varchar(128) not null default '' comment '密码',`nickname` varchar(128) not null default '' comment '昵称',`email` varchar(128) not null default '' comment '邮箱',`province` varchar(128) not null default '' comment '省份',`realname` varchar(128) not null default '' comment '姓名',`avatar` varchar(256) not null default '' comment '头像',`zodiac` char(3) not null default '' comment '星座',`phone` char(11) not null default '' comment '手机',`idcard` char(18) not null default '' comment '身份证号',`gender` tinyint not null default 0 comment '性别,0女,1男,2保密',`age` tinyint not null default 0 comment '年龄',`info` varchar(512) not null default '' comment '描述',`version` bigint not null default 0 comment '数据版本',`deleted` tinyint not null default 0 comment '0未删除,1已删除',`created` datetime not null default current_timestamp comment '创建时间',`updated` datetime not null default current_timestamp comment '修改时间'
) comment '用户表';-- user
insert into user (`id`, `username`, `password`, `nickname`, `avatar`, `phone`, `email`, `gender`, `age`, `zodiac`, `province`, `realname`, `idcard`, `info`)
values (1, 'admin', '25f9e794323b453885f5181f1b624d0b', '一个超级可爱的管理员', 'mouse.png', '18210210122', 'yy06200210@163.com', 1, 18, '白羊座', '黑龙江省', '周周', '230107199306200210', '系统管理员'),(2, 'zhaosi', '25f9e794323b453885f5181f1b624d0b', '赵四赵四', 'cow.png', '18210210111', 'yy06200211@163.com', 1, 50, '处女座', '北京', '赵国强', '230107199306200211', '亚洲舞王'),(3, 'liuneng', '25f9e794323b453885f5181f1b624d0b', '刘能刘能', 'tiger.png', '18210210112', 'yy06200212@163.com', 1, 55, '金牛座', '辽宁省', '刘大能', '230107199306200212', '象牙山小诸葛'),(4, 'wangyun', '25f9e794323b453885f5181f1b624d0b', '王云王云', 'rabbit.png', '18210210113', 'yy06200213@163.com', 0, 25, '射手座', '吉林省', '王小云', '230107199306200213', '山庄刘夫人');
2. 角色表role
心法:角色表 role 中存放的是系统中每个用户的角色信息,角色和用户是多对多关系。
字段名 | 类型 | 注释 | 约束 | 默认值 | |
---|---|---|---|---|---|
1 | title | varchar(128) | 标题 | 非空 | ‘’ |
2 | idx | bigint | 序号 | 非空 | 0 |
3 | info | varchar(512) | 描述 | 非空 | ‘’ |
武技:开发用户微服务的角色信息表
-- role
create table ml_ums.role
(`id` bigint auto_increment comment '主键' primary key,`title` varchar(128) not null default '' comment '标题',`idx` bigint not null default 0 comment '序号',`info` varchar(512) not null default '' comment '描述',`version` bigint not null default 0 comment '数据版本',`deleted` tinyint not null default 0 comment '0未删除,1已删除',`created` datetime not null default current_timestamp comment '创建时间',`updated` datetime not null default current_timestamp comment '修改时间'
) comment '角色表';-- role
insert into ml_ums.role (`id`, `title`, `idx`, `info`)
values (1, '普通用户', 1, ''),(2, '系统管理员', 2, ''),(3, '用户管理员', 3, ''),(4, '课程管理员', 4, ''),(5, '营销管理员', 5, ''),(6, '订单管理员', 6, '');
3. 菜单表menu
心法:菜单表 menu 中存放的是系统中每种角色的权限菜单信息,菜单和角色是多对多关系。
字段名 | 类型 | 注释 | 约束 | 默认值 | |
---|---|---|---|---|---|
1 | title | varchar(128) | 标题 | 非空 | ‘’ |
2 | url | varchar(256) | 跳转地址 | 非空 | ‘’ |
3 | icon | varchar(256) | 图标名称 | 非空 | ‘’ |
4 | pid | bigint | 父菜单主键,0视为根节点 | 非空 | 0 |
5 | idx | bigint | 序号 | 非空 | 0 |
6 | info | varchar(512) | 菜单描述 | 非空 | ‘’ |
武技:开发用户微服务的菜单信息表
-- menu
create table ml_ums.menu
(`id` bigint auto_increment comment '主键' primary key,`title` varchar(128) not null default '' comment '标题',`url` varchar(256) not null default '' comment '跳转地址',`icon` varchar(256) not null default '' comment '图标名称',`pid` bigint not null default 0 comment '父菜单主键,0视为根节点',`idx` bigint not null default 0 comment '序号',`info` varchar(512) not null default '' comment '描述',`version` bigint not null default 0 comment '数据版本',`deleted` tinyint not null default 0 comment '0未删除,1已删除',`created` datetime not null default current_timestamp comment '创建时间',`updated` datetime not null default current_timestamp comment '修改时间'
) comment '菜单表';-- menu
insert into ml_ums.menu (`id`, `title`, `idx`, `url`, `icon`, `pid`)
values (01, '用户管理', 1, '', 'User', 0),(02, '课程管理', 2, '', 'Notebook', 0),(03, '营销管理', 3, '', 'Goods', 0),(04, '订单管理', 4, '', 'Files', 0),(05, '日志管理', 5, '', 'List', 0),(06, '用户列表', 1, '/User', 'User', 1),(07, '角色列表', 2, '/Role', 'Avatar', 1),(08, '菜单列表', 3, '/Menu', 'Flag', 1),(09, '类别列表', 1, '/Category', 'Management', 2),(10, '课程列表', 2, '/Course', 'Notebook', 2),(13, '评论列表', 3, '/Comment', 'Comment', 2),(14, '举报列表', 4, '/Report', 'Warning', 2),(15, '通知列表', 1, '/Notice', 'Opportunity', 3),(16, '横幅列表', 2, '/Banner', 'Picture', 3),(17, '新闻列表', 3, '/Article', 'WindPower', 3),(18, '秒杀列表', 4, '/Seckill', 'Stopwatch', 3),(19, '优惠卷列表', 5, '/Coupons', 'Present', 3),(20, '购物车列表', 1, '/Cart', 'ShoppingCart', 4),(21, '订单列表', 2, '/Order', 'Goods', 4),(22, '后台日志', 1, '/AdminLog', 'Memo', 5),(23, '前台日志', 2, '/ServerLog', 'Memo', 5);
4. 用户角色关系表user_role
心法:用户角色关系表 user_role 用于维护用户和角色的多对多关系。
字段名 | 类型 | 注释 | 约束 | 默认值 | |
---|---|---|---|---|---|
1 | fk_user_id | bigint | 用户ID,用户表外键 | ||
2 | fk_role_id | bigint | 角色ID,角色表外键 |
武技:开发用户微服务的用户角色关系表
-- user_role
create table ml_ums.user_role
(`id` bigint auto_increment comment '主键' primary key,`fk_user_id` bigint comment '用户ID,用户表外键',`fk_role_id` bigint comment '角色ID,角色表外键',`version` bigint not null default 0 comment '数据版本',`deleted` tinyint not null default 0 comment '0未删除,1已删除',`created` datetime not null default current_timestamp comment '创建时间',`updated` datetime not null default current_timestamp comment '修改时间'
) comment '用户角色关系表';-- user_role
insert into ml_ums.user_role (`id`, `fk_user_id`, `fk_role_id`)
values (1, 1, 2), (2, 2, 3), (3, 2, 4),(4, 3, 5), (5, 3, 6), (7, 4, 1);
5. 角色菜单关系表role_menu
心法:角色菜单关系表 role_menu 用于维护角色和菜单的多对多关系。
字段名 | 类型 | 注释 | 约束 | 默认值 | |
---|---|---|---|---|---|
1 | fk_role_id | bigint | 角色ID,角色表外键 | ||
2 | fk_menu_id | bigint | 菜单ID,菜单表外键 |
武技:开发用户微服务的角色菜单关系表
-- role_menu
create table ml_ums.role_menu
(`id` bigint auto_increment comment '主键' primary key,`fk_role_id` bigint comment '角色ID,角色表外键',`fk_menu_id` bigint comment '菜单ID,菜单表外键',`version` bigint not null default 0 comment '数据版本',`deleted` tinyint not null default 0 comment '0未删除,1已删除',`created` datetime not null default current_timestamp comment '创建时间',`updated` datetime not null default current_timestamp comment '修改时间'
) comment '角色菜单关系表';-- role_menu
insert into role_menu (`id`, `fk_role_id`, `fk_menu_id`)
values (01, 2, 01), (02, 2, 02), (03, 2, 03), (04, 2, 04), (05, 2, 05), (06, 2, 06),(07, 2, 07), (08, 2, 08), (09, 2, 09), (10, 2, 10), (11, 2, 11), (12, 2, 12),(13, 2, 13), (14, 2, 14), (15, 2, 15), (16, 2, 16), (17, 2, 17), (18, 2, 18),(19, 2, 14), (20, 2, 15), (21, 2, 16), (22, 2, 17), (23, 2, 18), (24, 2, 19),(25, 2, 20), (26, 2, 21), (27, 2, 22), (28, 3, 01), (29, 3, 06), (30, 3, 07),(31, 3, 08), (32, 4, 02), (33, 4, 09), (34, 4, 10), (35, 4, 11), (36, 4, 12),(37, 4, 13), (38, 4, 14), (39, 5, 03), (40, 5, 15), (41, 5, 16), (42, 5, 17),(43, 5, 18), (44, 6, 04), (45, 6, 19), (46, 6, 20);
E02. CMS课程微服务
心法:课程微服务 Course Micro Services,基于 ml_cms 数据库。
数据库 | 数据表 | 描述 |
---|---|---|
ml_cms | catagory | 类别表(针对课程分类) |
ml_cms | course | 课程表 |
ml_cms | season | 季次表(一个课程包含很多季次) |
ml_cms | episode | 集次表(一个季次包含很多集次) |
ml_cms | comment | 评论表(针对集次视频) |
ml_cms | report | 举报表(针对集次视频) |
1. 类别表category
心法:类别表 category 中存放的是系统中课程的分类,每个课程最多只能有一种分类。
字段名 | 类型 | 注释 | 约束 | 默认值 | |
---|---|---|---|---|---|
1 | title | varchar(128) | 标题 | 非空 | ‘’ |
2 | idx | bigint | 序号 | 非空 | 0 |
3 | info | varchar(512) | 描述 | 非空 | ‘’ |
武技:开发课程微服务的类别表 category
-- category
create table ml_cms.category
(`id` bigint auto_increment comment '主键' primary key,`title` varchar(128) not null default '' comment '标题',`idx` bigint not null default 0 comment '序号',`info` varchar(512) not null default '' comment '描述',`version` bigint not null default 0 comment '数据版本',`deleted` tinyint not null default 0 comment '0未删除,1已删除',`created` datetime not null default current_timestamp comment '创建时间',`updated` datetime not null default current_timestamp comment '修改时间'
) comment '课程类别表';-- category
insert into ml_cms.category (`id`, `title`, `info`, `idx`)
values (01, 'Java基础', '', 1),(02, 'JavaWEB', '', 2),(03, 'Java框架', '', 3),(04, 'Java微服务', '', 4);
2. 课程表course
心法:课程表 course 中存放的是系统中每个课程的信息。
字段名 | 类型 | 注释 | 约束 | 默认值 | |
---|---|---|---|---|---|
1 | title | varchar(128) | 标题 | 非空 | ‘’ |
2 | author | varchar(128) | 作者 | 非空 | ‘’ |
3 | fk_category_id | bigint | 课程类别ID,课程类别表外键 | ||
4 | summary | varchar(256) | 摘要图地址 | 非空 | ‘’ |
5 | cover | varchar(256) | 封面图地址 | 非空 | ‘’ |
6 | price | decimal(8, 2) | 单价(元) | 非空 | 0.00 |
7 | idx | bigint | 序号 | 非空 | 0 |
8 | info | varchar(512) | 描述 | ‘’ |
武技:开发课程微服务的课程表 course
-- course
create table ml_cms.course
(`id` bigint auto_increment comment '主键' primary key,`title` varchar(128) not null default '' comment '标题',`author` varchar(128) not null default '' comment '作者',`fk_category_id` bigint comment '类别ID,类别表外键',`summary` varchar(256) not null default '' comment '摘要图地址',`cover` varchar(256) not null default '' comment '封面图地址',`price` decimal(8, 2) not null default 0.00 comment '单价,单位元',`idx` bigint not null default 0 comment '序号',`info` varchar(512) not null default '' comment '描述',`version` bigint not null default 0 comment '数据版本',`deleted` tinyint not null default 0 comment '0未删除,1已删除',`created` datetime not null default current_timestamp comment '创建时间',`updated` datetime not null default current_timestamp comment '修改时间'
) comment '课程表';-- course
insert into course(`id`, `title`, `author`, `fk_category_id`, `info`, `summary`, `cover`, `price`, `idx`)
values (01, 'JB1-1-新手村', 'JoeZhou', 1, '', 'default-summary.jpg', 'default-cover.jpg', 11100.00, 1),(02, 'JB1-2-基础启航', 'JoeZhou', 1, '', 'default-summary.jpg', 'default-cover.jpg', 11200.00, 2),(03, 'JB1-3-面向对象', 'JoeZhou', 1, '', 'default-summary.jpg', 'default-cover.jpg', 11300.00, 3),(04, 'JB1-4-高级进阶', 'JoeZhou', 1, '', 'default-summary.jpg', 'default-cover.jpg', 11400.00, 4),(05, 'JB1-5-数据结构', 'JoeZhou', 1, '', 'default-summary.jpg', 'default-cover.jpg', 11500.00, 5),(06, 'JB1-6-虚拟内存', 'JoeZhou', 1, '', 'default-summary.jpg', 'default-cover.jpg', 11600.00, 6),(07, 'JB1-7-并发编程', 'JoeZhou', 1, '', 'default-summary.jpg', 'default-cover.jpg', 11700.00, 7),(08, 'JB1-8-设计模式', 'JoeZhou', 1, '', 'default-summary.jpg', 'default-cover.jpg', 11800.00, 8),(09, 'JB1-9-网络编程', 'JoeZhou', 1, '', 'default-summary.jpg', 'default-cover.jpg', 11900.00, 9),(10, 'JB2-1-Linux', 'JoeZhou', 2, '', 'default-summary.jpg', 'default-cover.jpg', 12100.00, 1),(11, 'JB2-2-Docker', 'JoeZhou', 2, '', 'default-summary.jpg', 'default-cover.jpg', 12200.00, 2),(12, 'JB2-3-MySQL', 'JoeZhou', 2, '', 'default-summary.jpg', 'default-cover.jpg', 12300.00, 3),(13, 'JB2-4-JDBC', 'JoeZhou', 2, '', 'default-summary.jpg', 'default-cover.jpg', 12400.00, 4),(14, 'JB2-5-Tomcat', 'JoeZhou', 2, '', 'default-summary.jpg', 'default-cover.jpg', 12500.00, 5),(15, 'JB2-6-Servlet', 'JoeZhou', 2, '', 'default-summary.jpg', 'default-cover.jpg', 12600.00, 6),(16, 'JB2-7-HTML', 'JoeZhou', 2, '', 'default-summary.jpg', 'default-cover.jpg', 12700.00, 7),(17, 'JB2-8-CSS', 'JoeZhou', 2, '', 'default-summary.jpg', 'default-cover.jpg', 12800.00, 8),(18, 'JB2-9-JavaScript', 'JoeZhou', 2, '', 'default-summary.jpg', 'default-cover.jpg', 12900.00, 9),(19, 'JB3-1-MyBatis', 'JoeZhou', 3, '', 'default-summary.jpg', 'default-cover.jpg', 13100.00, 1),(20, 'JB3-2-Spring', 'JoeZhou', 3, '', 'default-summary.jpg', 'default-cover.jpg', 13200.00, 2),(21, 'JB3-3-SpringMVC', 'JoeZhou', 3, '', 'default-summary.jpg', 'default-cover.jpg', 13300.00, 3),(22, 'JB3-4-SpringBoot', 'JoeZhou', 3, '', 'default-summary.jpg', 'default-cover.jpg', 13400.00, 4),(23, 'JB3-5-Redis', 'JoeZhou', 3, '', 'default-summary.jpg', 'default-cover.jpg', 13500.00, 5),(24, 'JB3-6-Elasticsearch', 'JoeZhou', 3, '', 'default-summary.jpg', 'default-cover.jpg', 13600.00, 6),(25, 'JB3-7-MongoDB', 'JoeZhou', 3, '', 'default-summary.jpg', 'default-cover.jpg', 13700.00, 7),(26, 'JB3-8-Nginx', 'JoeZhou', 3, '', 'default-summary.jpg', 'default-cover.jpg', 13800.00, 8),(27, 'JB3-9-Vue', 'JoeZhou', 3, '', 'default-summary.jpg', 'default-cover.jpg', 13900.00, 9),(28, 'JB4-1-注册中心', 'JoeZhou', 4, '', 'default-summary.jpg', 'default-cover.jpg', 14100.00, 1),(29, 'JB4-2-远程调用', 'JoeZhou', 4, '', 'default-summary.jpg', 'default-cover.jpg', 14200.00, 2),(30, 'JB4-3-服务卫兵', 'JoeZhou', 4, '', 'default-summary.jpg', 'default-cover.jpg', 14300.00, 3),(31, 'JB4-4-服务网关', 'JoeZhou', 4, '', 'default-summary.jpg', 'default-cover.jpg', 14400.00, 4),(32, 'JB4-5-链路追踪', 'JoeZhou', 4, '', 'default-summary.jpg', 'default-cover.jpg', 14500.00, 5),(33, 'JB4-6-消息队列', 'JoeZhou', 4, '', 'default-summary.jpg', 'default-cover.jpg', 14600.00, 6),(34, 'JB4-7-配置中心', 'JoeZhou', 4, '', 'default-summary.jpg', 'default-cover.jpg', 14700.00, 7),(35, 'JB4-8-事务机制', 'JoeZhou', 4, '', 'default-summary.jpg', 'default-cover.jpg', 14800.00, 8),(36, 'JB4-9-安全框架', 'JoeZhou', 4, '', 'default-summary.jpg', 'default-cover.jpg', 14900.00, 9);
3. 季次表season
心法:季次表 season 中存放的是系统中每个课程的季次信息,每个课程拥有多个季次。
字段名 | 类型 | 注释 | 约束 | 默认值 | |
---|---|---|---|---|---|
1 | title | varchar(128) | 标题 | 非空 | ‘’ |
2 | fk_course_id | bigint | 课程表ID,课程表外键 | ||
3 | idx | bigint | 序号 | 非空 | 0 |
4 | info | varchar(512) | 描述 | 非空 | ‘’ |
武技:开发课程微服务的季次表 season
-- season
create table ml_cms.season
(`id` bigint auto_increment comment '主键' primary key,`title` varchar(128) not null default '' comment '标题',`info` varchar(512) not null default '' comment '描述',`fk_course_id` bigint comment '课程表ID,课程表外键',`idx` bigint not null default 0 comment '序号',`version` bigint not null default 0 comment '数据版本',`deleted` tinyint not null default 0 comment '0未删除,1已删除',`created` datetime not null default current_timestamp comment '创建时间',`updated` datetime not null default current_timestamp comment '修改时间'
) comment '季次表';-- season
insert into season (`id`, `title`, `info`, `idx`, `fk_course_id`)
values (01, '学前准备工作', '', 1, 1), (02, '基础环境搭建', '', 2, 1),(03, '集成开发工具', '', 3, 1), (04, '项目管理工具', '', 4, 1),(05, '项目测试工具', '', 5, 1), (06, '项目协同工具', '', 6, 1),(07, '文档化编程思想', '', 1, 2), (08, '输出与特殊字符', '', 2, 2),(09, '常量与特殊进制', '', 3, 2), (10, '变量与代码沼泽', '', 4, 2),(11, '基本数据的类型', '', 5, 2), (12, '引用数据的类型', '', 6, 2),(13, '常用运算符专题', '', 7, 2), (14, '流控之选择结构', '', 8, 2),(15, '流控之循环结构', '', 9, 2), (16, '数据结构之数组', '', 10, 2),(17, 'OOP抽象思想', '', 1, 3), (18, 'OOP封装机制', '', 2, 3),(19, 'OOP继承机制', '', 3, 3), (20, 'OOP多态机制', '', 4, 3),(21, 'OOP特殊类型', '', 5, 3), (22, 'OOP代码优化', '', 6, 3),(23, '异常例外', '', 1, 4), (24, '泛型机制', '', 2, 4),(25, '常用容器', '', 3, 4), (26, '反射机制', '', 4, 4),(27, '流类操作', '', 5, 4), (28, '常用工具', '', 6, 4),(29, '数组数据结构', '', 1, 5), (30, '链表数据结构', '', 2, 5),(31, '树型数据结构', '', 3, 5), (32, '哈希数据结构', '', 4, 5),(33, '虚拟内存模型', '', 1, 6), (34, '类的加载原理', '', 2, 6),(35, '类的加载过程', '', 3, 6), (36, '类的使用过程', '', 4, 6),(37, '虚拟机栈内存', '', 5, 6), (38, '虚拟机堆内存', '', 6, 6),(39, '虚拟机方法区', '', 7, 6), (40, '垃圾回收机制', '', 8, 6),(41, '多线程基础入门', '', 1, 7), (42, '多线程内存模型', '', 2, 7),(43, '多线程同步代码', '', 3, 7), (44, '比较与交换算法', '', 4, 7),(45, '抽象排队同步器', '', 5, 7), (46, '多线程通信方式', '', 6, 7),(47, '多线程同步容器', '', 7, 7), (48, '线程池使用方案', '', 8, 7),(49, '单例设计模式', '', 1, 8), (50, '建造者设计模式', '', 2, 8),(51, '工厂设计模式', '', 3, 8), (52, '原型设计模式', '', 4, 8),(53, '结构型设计模式', '', 5, 8), (54, '行为型设计模式', '', 6, 8),(55, '同步非阻塞流', '', 1, 9), (56, 'Socket网络编程', '', 2, 9);
4. 集次表episode
心法:集次表 episode 中存放的是系统中每个季次的集次信息,每个季次拥有多个集次。
字段名 | 类型 | 注释 | 约束 | 默认值 | |
---|---|---|---|---|---|
1 | title | varchar(128) | 标题 | 非空 | ‘’ |
2 | video | varchar(256) | 视频地址 | 非空 | ‘’ |
3 | cover | varchar(256) | 封面图地址 | 非空 | ‘’ |
4 | fk_season_id | bigint | 季次表ID,季次表外键 | ||
5 | idx | bigint | 序号 | 非空 | 0 |
6 | info | varchar(512) | 描述 | 非空 | ‘’ |
武技:开发课程微服务的集次表 episode
-- episode
create table ml_cms.episode
(`id` bigint auto_increment comment '主键' primary key,`title` varchar(128) not null default '' comment '标题',`info` varchar(512) not null default '' comment '描述',`video` varchar(256) not null default '' comment '视频媒体地址',`cover` varchar(256) not null default '' comment '视频封面地址',`fk_season_id` bigint comment '季次表ID,季次表外键',`idx` bigint not null default 0 comment '序号',`version` bigint not null default 0 comment '数据版本',`deleted` tinyint not null default 0 comment '0未删除,1已删除',`created` datetime not null default current_timestamp comment '创建时间',`updated` datetime not null default current_timestamp comment '修改时间'
) comment '集次表';-- episode
insert into episode (`id`, `title`, `info`, `video`, `cover`, `idx`, `fk_season_id`)
values (01, 'Java语言年龄分代', '二进制,打孔机,汇编语言,面向过程,面向对象,面向结果等。','default-video.mp4', 'default-video-cover.jpg', 1, 1),(02, 'Java核心技术特点', '简单高效,强大类库,社区活跃,面向对象,健壮,安全,跨平台等。','default-video.mp4', 'default-video-cover.jpg', 2, 1),(03, 'Java学习路线分享', 'Java语言技术全栈学习线路分析图。','default-video.mp4', 'default-video-cover.jpg', 3, 1),(04, 'Java项目开发流程', '甲方提出需求,PM开发需求文档,审核需求文档,PM开发详细文档,PM设计产品原型,三方审核原型,QA开发测试用例,UI开发设计图,SE搭建项目环境,SE确定开发周期,SE前后端开发,SE前后端联调,SE项目交付,QA测试项目,甲方验收项目,OPS进行项目维护。','default-video.mp4', 'default-video-cover.jpg', 4, 1),(05, 'Java学习技巧分享', '向钱看,多喝水,跟人学,多搜索,讲出来,多画图,记笔记等。','default-video.mp4', 'default-video-cover.jpg', 5, 1),(06, 'Java学习笔记工具', 'Markdown 文字,标题,引用,代码,列表,表格,图片等。','default-video.mp4', 'default-video-cover.jpg', 6, 1),(07, 'Java学前环境准备', '清理计算机,关闭防火墙,卸载360等杀毒软件,拉低用户权限,常用计算机快捷键扫盲,展示文件拓展名,展示隐藏文件等。','default-video.mp4', 'default-video-cover.jpg', 7, 1),(08, 'Java开发环境搭建', 'JDK, JRE, JVM 概念入门与下载安装。','default-video.mp4', 'default-video-cover.jpg', 1, 2),(09, 'Java环境变量配置', '为何配置 path 变量,如何配置 path 变量等。','default-video.mp4', 'default-video-cover.jpg', 2, 2),(10, 'Java环境变量升级', '为何配置 JAVA_HOME 变量,如何配置 JAVA_HOME 变量等。','default-video.mp4', 'default-video-cover.jpg', 3, 2),(11, 'Java入门程序开发', 'HelloWorld 程序,javac.exe 命令,java.exe 命令等。','default-video.mp4', 'default-video-cover.jpg', 4, 2),(12, 'Java入门程序详解', '类,main() 方法,输出语句,代码通用要求与格式等。','default-video.mp4', 'default-video-cover.jpg', 5, 2),(13, 'IDEA开发工具安装', 'IDE概念,IDE产品,IDEA卸载,IDEA安装,IDEA破解等。','default-video.mp4', 'default-video-cover.jpg', 1, 3),(14, 'IDEA创建基础项目', '使用IDEA创建项目,开发 HelloWorld 代码,Java项目命名规范,Java包命名规范,Java类命名规范等','default-video.mp4', 'default-video-cover.jpg', 2, 3),(15, 'IDEA基础环境配置', '禁用IDEA自动更新,调整IDEA字体大小,设置IDEA字符编码,设置IDEA代码模板,隐藏IDEA配置文件,启用IDEA自动导包,展示方法分隔线,修改IDEA默认终端等','default-video.mp4', 'default-video-cover.jpg', 3, 3),(16, 'IDEA常用插件分享', 'Translation, Alibaba Java Coding Guidelines,Gitee, Maven Helpler, jclasslib Bytecode Viewer,Vue.js, Redis Helper, Archive Browser, Lombok 等','default-video.mp4', 'default-video-cover.jpg', 4, 3),(17, 'Maven项目管理工具', 'Maven概念,快速构建项目功能,统一依赖管理功能。','default-video.mp4', 'default-video-cover.jpg', 1, 4),(18, 'Maven管理工具安装', '检查Maven环境,下载Maven工具,配置Maven环境。','default-video.mp4', 'default-video-cover.jpg', 2, 4),(19, 'Maven本地仓库搭建', 'Maven仓库分类,Maven获取依赖的线路,配置Maven本地仓库。','default-video.mp4', 'default-video-cover.jpg', 3, 4),(20, 'Maven管理工具整合', '将Maven工具整合到IDEA中。','default-video.mp4', 'default-video-cover.jpg', 4, 4),(21, 'Maven父子项目创建', 'EP05. Maven父子项目创建。','default-video.mp4', 'default-video-cover.jpg', 5, 4),(22, 'Maven一键构建测试', 'mvn clean/compile/property/package/install 等命令。','default-video.mp4', 'default-video-cover.jpg', 6, 4),(23, 'Junit测试的使用规范', 'Junit测试类,测试方法,运行注解,前置注解,后置注解的规范。','default-video.mp4', 'default-video-cover.jpg', 1, 5),(24, 'Junit依赖的生效范围', 'property, compile, runtime, provided。','default-video.mp4', 'default-video-cover.jpg', 2, 5),(25, 'Junit依赖的版本管理', '在父项目中锁定Junit依赖的版本并管理Junit依赖。','default-video.mp4', 'default-video-cover.jpg', 3, 5),(26, 'Junit依赖的真实引入', '在子项目中引入Junit依赖。','default-video.mp4', 'default-video-cover.jpg', 4, 5),(27, '安装并整合Git服务端', 'Git概念,Git安装,Git存储分区,Git整合到IDEA。','default-video.mp4', 'default-video-cover.jpg', 1, 6),(28, '注册并整合Git远程库', '注册GitEE账号并整合GitEE到IDEA。','default-video.mp4', 'default-video-cover.jpg', 2, 6),(29, '分享项目到Git远程库', '创建项目,并分享项目到GitEE。','default-video.mp4', 'default-video-cover.jpg', 3, 6),(30, '邀请队友到Git项目组', '邀请其他成员到Git项目组。','default-video.mp4', 'default-video-cover.jpg', 4, 6),(31, '克隆项目到Git本地库', '使用IDEA克隆项目到本地,使用Git命令克隆项目到本地。','default-video.mp4', 'default-video-cover.jpg', 5, 6),(32, '推送代码到Git远程库', '使用IDEA推送修改后的内容,使用Git命令推送修改后的内容。','default-video.mp4', 'default-video-cover.jpg', 6, 6),(33, '代码的基本注释', '单行注释,多行注释,文档注释,TODO注释。','default-video.mp4', 'default-video-cover.jpg', 1, 7),(34, '产品的文档注释', '文档注释的意义,优点,文档注释中的常用注解,提取HTML文档的方式。','default-video.mp4', 'default-video-cover.jpg', 2, 7),(35, '换行与同行输出', '换行输出语句,不换行输出语句,空内容输出效果。','default-video.mp4', 'default-video-cover.jpg', 1, 8),(36, '格式化输出语句', '格式化输出语句使用方式,格式化输出语句常用占位符。','default-video.mp4', 'default-video-cover.jpg', 2, 8),(37, '输出基础表达式', '输出语句中允许直接使用表达式,+ 的字符串拼接效果。','default-video.mp4', 'default-video-cover.jpg', 3, 8),(38, '输出特殊的字符', '跳格,回行,换行,转义字符等。','default-video.mp4', 'default-video-cover.jpg', 4, 8),(39, '先天与后天常量', '先天常量,后天常量,final关键字,科学计数法。','default-video.mp4', 'default-video-cover.jpg', 1, 9),(40, '特殊进制的常量', '二进制数表现形式,八进制数表现形式,十六进制数表现形式。','default-video.mp4', 'default-video-cover.jpg', 2, 9),(41, '计算机计算原理', '原码,反码,补码,真正,Integer.toBinaryString()。','default-video.mp4', 'default-video-cover.jpg', 3, 9),(42, '变量的声明方式', '变量的声明方式,强类型,同行声明方式。','default-video.mp4', 'default-video-cover.jpg', 1, 10),(43, '变量的赋值方式', '变量的赋值方式,多次赋值会产生覆盖效果。','default-video.mp4', 'default-video-cover.jpg', 2, 10),(44, '变量的命名规范', '变量名的硬性要求,变量名的软性要求。','default-video.mp4', 'default-video-cover.jpg', 3, 10),(45, '代码的整洁之道', '代码沼泽困境,保证代码整洁的经验之谈。','default-video.mp4', 'default-video-cover.jpg', 4, 10),(46, '基本类型之整数', 'byte, short, int, long,存值范围,JavaC范围检查过程等。','default-video.mp4', 'default-video-cover.jpg', 1, 11),(47, '基本类型之浮点', 'float, double,浮点数默认类型,浮点数天生不精确等。','default-video.mp4', 'default-video-cover.jpg', 2, 11),(48, '基本类型之字符', 'char,存值范围,字符存储内容,JavaC范围检查过程等。','default-video.mp4', 'default-video-cover.jpg', 3, 11),(49, '基本类型之布尔', 'boolean,存值范围,二进制位中真实存储位置等。','default-video.mp4', 'default-video-cover.jpg', 4, 11),(50, '基本类型的转换', '强转格式,强转原则,char类型的转换过程,整数和浮点数的转换效果。','default-video.mp4', 'default-video-cover.jpg', 5, 11),(51, '跨类型计算原则', '测试不同类型之间计算,结果是否一定返回最大类型。','default-video.mp4', 'default-video-cover.jpg', 6, 11),(52, '计算结果的溢出', '为何最大值加1变最小值,最小值减1变最大值。','default-video.mp4', 'default-video-cover.jpg', 7, 11),(53, '引用类型字符串', '字符串完整声明格式,简易声明格式,底层数据结构等。','default-video.mp4', 'default-video-cover.jpg', 1, 12),(54, '字符串编程接口', 'API概念,API文档概念,API文档的使用方法,字符串常用API。','default-video.mp4', 'default-video-cover.jpg', 2, 12),(55, '正则表达式专题', 'RE的意义,RE字符,matches(), replaceAll(), split()。','default-video.mp4', 'default-video-cover.jpg', 3, 12),(56, '运行时数据区域', '栈,堆,内存地址,基本类型和引用类型在运行时数据区中的分布。','default-video.mp4', 'default-video-cover.jpg', 4, 12),(57, '引用的比较方式', '== 和 equals() 的比较。','default-video.mp4', 'default-video-cover.jpg', 5, 12),(58, '装箱和拆箱过程', '包装类,手动拆装箱,自动拆装箱,基本类型和引用类型的区别。','default-video.mp4', 'default-video-cover.jpg', 6, 12),(59, '数学相关运算符', '+, -, *, /, % 等数学运算符。','default-video.mp4', 'default-video-cover.jpg', 1, 13),(60, '赋值相关运算符', '=, +=, -=, *=, /*, %= 等赋值运算符。','default-video.mp4', 'default-video-cover.jpg', 2, 13),(61, '自我相关运算符', '++, -- 等自运算符。','default-video.mp4', 'default-video-cover.jpg', 3, 13),(62, '关系相关运算符', '>, <, >=, <=, != 等关系运算符。','default-video.mp4', 'default-video-cover.jpg', 4, 13),(63, '逻辑相关运算符', '&&, ! 等逻辑运算符。','default-video.mp4', 'default-video-cover.jpg', 5, 13),(64, '比特相关运算符', '&, ~, ^, <<, >>, >>> 等位运算符。','default-video.mp4', 'default-video-cover.jpg', 6, 13),(65, '三目逻辑运算符', 'X ? Y : Z 基础格式,结构特点,嵌套方式。','default-video.mp4', 'default-video-cover.jpg', 7, 13),(66, '选择之范围匹配', 'if(条件){ } elseif(条件){ } else{ } 基础格式。','default-video.mp4', 'default-video-cover.jpg', 1, 14),(67, '选择之定值匹配', 'switch(表达式){ case 匹配值: break; } 基础格式。','default-video.mp4', 'default-video-cover.jpg', 2, 14),(68, '仅知结束的条件', 'while(条件){ }, do{ }while(条件); 基础格式。','default-video.mp4', 'default-video-cover.jpg', 1, 15),(69, '仅知循环的次数', 'for( 初; 判; 变){ } 基础格式。','default-video.mp4', 'default-video-cover.jpg', 2, 15),(70, '单维度数组结构', '一维数组的声明与赋值。','default-video.mp4', 'default-video-cover.jpg', 1, 16),(71, '单维度数组遍历', 'forI, forE, Arrays.toString()。','default-video.mp4', 'default-video-cover.jpg', 2, 16),(72, '多维度数组结构', '二维数组的声明与赋值。','default-video.mp4', 'default-video-cover.jpg', 3, 16),(73, '多维度数组遍历', 'forI, forE, Arrays.deepToString()。','default-video.mp4', 'default-video-cover.jpg', 4, 16),(74, '万物皆为对象', '万事万物皆对象,对象具有唯一性,对象可以具有属性和方法。','default-video.mp4', 'default-video-cover.jpg', 1, 17),(75, '面向对象编程', '考虑问题时以具体的对象为单位,考虑其属性和方法,而非具体的实现流程。','default-video.mp4', 'default-video-cover.jpg', 2, 17),(76, '抽象编程思想', '抽选出一些我们比较关注的属性和方法的思想过程。','default-video.mp4', 'default-video-cover.jpg', 3, 17),(77, '封装最终产物', 'Java类是封装过程的产物,公共类,友元类,静态类。','default-video.mp4', 'default-video-cover.jpg', 1, 18),(78, '类的属性分类', '公共属性,受保护的属性,友元属性,私有属性,静态属性,常值属性。','default-video.mp4', 'default-video-cover.jpg', 2, 18),(79, '类的方法分类', '公共方法,受保护的方法,友元方法,私有方法,静态方法,不可重写方法。','default-video.mp4', 'default-video-cover.jpg', 3, 18),(80, '方法传参内容', '方法形参用于传递副本,方法实参用于传递引用。','default-video.mp4', 'default-video-cover.jpg', 4, 18),(81, '方法递归调用', '递归效果,递归效率,递归出口,递归和for循环的关系。','default-video.mp4', 'default-video-cover.jpg', 5, 18),(82, '类的初始化块', '类的静态块,类的动态块,类的构造器。','default-video.mp4', 'default-video-cover.jpg', 6, 18),(83, '继承基本原则', '继承的意义,继承的原则。','default-video.mp4', 'default-video-cover.jpg', 1, 19),(84, '父子类间调用', 'super.属性, super.方法(), super()。','default-video.mp4', 'default-video-cover.jpg', 2, 19),(85, '多态具体实现', '方法重载 overload,方法重写 override。','default-video.mp4', 'default-video-cover.jpg', 1, 20),(86, '动态绑定机制', 'instanceof,子类的实例可以使用父类类型接收。','default-video.mp4', 'default-video-cover.jpg', 2, 20),(87, '特殊之抽象类', '抽象类特点,抽象类适用场景。','default-video.mp4', 'default-video-cover.jpg', 1, 21),(88, '特殊之接口类', '接口类特点,default 方法,static 方法,接口类适用场景。','default-video.mp4', 'default-video-cover.jpg', 2, 21),(89, '特殊之枚举类', '枚举类特点,枚举属性重写,枚举类构造器,枚举类适用场景。','default-video.mp4', 'default-video-cover.jpg', 3, 21),(90, '特殊之内部类', '成员内部类,静态内部类,匿名内部类,内部类适用场景。','default-video.mp4', 'default-video-cover.jpg', 4, 21),(91, '特殊之注解类', '注解类特点,元注解,内置注解,自定义注解类,注解类适用场景。','default-video.mp4', 'default-video-cover.jpg', 5, 21),(92, '龙目岛工具类', 'lombok工具,@Data, @ToString, @AllArgsConstructor 等。','default-video.mp4', 'default-video-cover.jpg', 1, 22),(93, '拉姆达表达式', 'lambda表达式,函数式接口,4种用于接收lambda表达式的接口。','default-video.mp4', 'default-video-cover.jpg', 2, 22),(94, '异常基本结构', '异常概念,tryCatch结构。','default-video.mp4', 'default-video-cover.jpg', 1, 23),(95, '异常自动关闭', '自动关闭closeable实现类的异常格式。','default-video.mp4', 'default-video-cover.jpg', 2, 23),(96, '异常结果缓存', '异常中return关键字的效果。','default-video.mp4', 'default-video-cover.jpg', 3, 23),(97, '异常抛出方案', 'throws 与 throw。','default-video.mp4', 'default-video-cover.jpg', 4, 23),(98, '异常重写原则', 'Override中的异常重写原则。','default-video.mp4', 'default-video-cover.jpg', 5, 23),(99, '形参上的泛型', '泛型概念。','default-video.mp4', 'default-video-cover.jpg', 1, 24),(100, '泛型强制限定', '<?>, <? extends XX>, <? super XX>。','default-video.mp4', 'default-video-cover.jpg', 2, 24),(101, '常用序列容器', 'List, ArrayList, LinkedList, Vector。','default-video.mp4', 'default-video-cover.jpg', 1, 25),(102, '常用集合容器', 'Set, HashSet, TreeSet, EnumSet。','default-video.mp4', 'default-video-cover.jpg', 2, 25),(103, '常用映射容器', 'Map, HashMap, TreeMap, EnumMap。','default-video.mp4', 'default-video-cover.jpg', 3, 25),(104, '迭代器遍历法', 'Iterator','default-video.mp4', 'default-video-cover.jpg', 4, 25),(105, '获取类的对象', 'Class 的三种获取方式。','default-video.mp4', 'default-video-cover.jpg', 1, 26),(106, '反射构造方法', 'Constructor 的获取方式。','default-video.mp4', 'default-video-cover.jpg', 2, 26),(107, '反射成员属性', 'Field 的获取方式。','default-video.mp4', 'default-video-cover.jpg', 3, 26),(108, '反射成员方法', 'Method 的获取方式。','default-video.mp4', 'default-video-cover.jpg', 4, 26),(109, '反射方法泛型', 'Type, ParameterizedType 的获取方式。','default-video.mp4', 'default-video-cover.jpg', 5, 26),(110, '反射运行注解', 'Annotation 的获取方式。','default-video.mp4', 'default-video-cover.jpg', 6, 26),(111, '动态编译代码', 'JavaCompiler。','default-video.mp4', 'default-video-cover.jpg', 7, 26),(112, '动态运行代码', 'URLClassLoader','default-video.mp4', 'default-video-cover.jpg', 8, 26),(113, '流类之文件流', 'FileInputStream, FileWriter 等4种流。','default-video.mp4', 'default-video-cover.jpg', 1, 27),(114, '流类之缓冲流', 'BufferedInputStream, BufferedWriter 等4种流。','default-video.mp4', 'default-video-cover.jpg', 2, 27),(115, '流类之转换流', 'InputStreamReader, OutputStreamWriter 等2种流。','default-video.mp4', 'default-video-cover.jpg', 3, 27),(116, '流类之打印流', 'PrintStream, PrintWriter 等2种流。','default-video.mp4', 'default-video-cover.jpg', 4, 27),(117, '流类之数据流', 'DataOutputStream, DataInputStream 等2种流。','default-video.mp4', 'default-video-cover.jpg', 5, 27),(118, '流类之对象流', 'ObjectOutputStream, ObjectInputStream 等2种流。','default-video.mp4', 'default-video-cover.jpg', 6, 27),(119, '数学运算工具', 'Math, Random 等。','default-video.mp4', 'default-video-cover.jpg', 1, 28),(120, '字符拼接工具', '+, StringBuilder, StringBuffer 等。','default-video.mp4', 'default-video-cover.jpg', 2, 28),(121, '线性结构工具', 'Arrays, Stack, Queue, BitSet 等。','default-video.mp4', 'default-video-cover.jpg', 3, 28),(122, '日期时间工具', 'Date, DateFormat, LocalDate, Calendar 等。','default-video.mp4', 'default-video-cover.jpg', 4, 28),(123, '文件对象工具', 'File, RandomAccessFile, StandardCharsets, Paths, Files 等。','default-video.mp4', 'default-video-cover.jpg', 5, 28),(124, '空值处理工具', 'Optional 等。','default-video.mp4', 'default-video-cover.jpg', 6, 28),(125, '定时任务工具', 'Timer 等。','default-video.mp4', 'default-video-cover.jpg', 7, 28),(126, '流式编程工具', 'Stream 等。','default-video.mp4', 'default-video-cover.jpg', 8, 28);
5. 评论表comment
心法:评论表 comment 中存放的是系统中每个用户对某个视频集次的评论信息。
字段名 | 类型 | 约束 | 默认值 | 注释 | |
---|---|---|---|---|---|
1 | fk_episode_id | bigint | 集次ID,集次表外键 | ||
2 | fk_user_id | bigint | 评论人ID,用户表外键 | ||
3 | nickname | varchar(128) | 非空 | ‘’ | 评论人昵称(冗余) |
4 | avatar | varchar(256) | 非空 | ‘’ | 评论人头像(冗余) |
5 | province | varchar(128) | 非空 | ‘’ | 评论人省份(冗余) |
6 | pid | bigint | 非空 | 0 | 父评论主键,0视为根节点 |
7 | content | varchar(512) | 非空 | ‘’ | 评论内容 |
武技:开发课程微服务的评论表 commont
-- comment
create table ml_cms.comment
(`id` bigint auto_increment comment '主键' primary key,`fk_episode_id` bigint comment '集次ID,集次表外键',`fk_user_id` bigint comment '评论人ID,用户表外键',`nickname` varchar(128) not null default '' comment '评论人昵称,冗余',`avatar` varchar(128) not null default '' comment '评论人头像,冗余',`province` varchar(128) not null default '' comment '评论人省份,冗余',`pid` bigint not null default 0 comment '父评论主键,0视为根节点',`content` varchar(512) not null default '' comment '评论内容',`version` bigint not null default 0 comment '数据版本',`deleted` tinyint not null default 0 comment '0未删除,1已删除',`created` datetime not null default current_timestamp comment '创建时间',`updated` datetime not null default current_timestamp comment '修改时间'
) comment '评论表';-- comment
insert into comment (id, fk_user_id, nickname, avatar, province, fk_episode_id, content, pid)
values (01, 1, '一个超级可爱的管理员', 'mouse.png', '黑龙江省', 1, '视频不错', 0),(02, 1, '一个超级可爱的管理员', 'mouse.png', '黑龙江省', 2, '很好', 0),(03, 1, '一个超级可爱的管理员', 'mouse.png', '黑龙江省', 3, '你说的真不错', 0),(04, 1, '一个超级可爱的管理员', 'mouse.png', '黑龙江省', 4, '6', 0),(05, 1, '一个超级可爱的管理员', 'mouse.png', '黑龙江省', 5, '66', 0),(06, 1, '一个超级可爱的管理员', 'mouse.png', '黑龙江省', 6, '666', 0),(07, 1, '一个超级可爱的管理员', 'mouse.png', '黑龙江省', 7, '视频不错', 0),(08, 1, '一个超级可爱的管理员', 'mouse.png', '黑龙江省', 8, '你说的不错', 0),(09, 1, '一个超级可爱的管理员', 'mouse.png', '黑龙江省', 9, '你说的真不错', 0),(10, 2, '赵四赵四', 1, 'cow.png', '北京', '哪里不错了1?', 1),(11, 2, '赵四赵四', 2, 'cow.png', '北京', '哪里不错了2?', 2),(12, 2, '赵四赵四', 3, 'cow.png', '北京', '哪里不错了3?', 3),(13, 2, '赵四赵四', 4, 'cow.png', '北京', '哪里不错了4?', 4),(14, 2, '赵四赵四', 5, 'cow.png', '北京', '哪里不错了5?', 5),(15, 3, '刘能刘能', 1, 'tiger.png', '辽宁省', '你是杠精吧?每个视频都留言', 10);
6. 举报表report
心法:举报表 report 中存放的是系统中每个用户对某个视频集次的举报信息。
字段名 | 类型 | 注释 | 约束 | 默认值 | |
---|---|---|---|---|---|
1 | fk_episode_id | bigint | 集次ID,集次表外键 | ||
2 | fk_user_id | bigint | 举报人ID,举报表外键 | ||
3 | nickname | varchar(128) | 评论人昵称(冗余) | 非空 | ‘’ |
4 | content | varchar(512) | 举报内容 | 非空 | ‘’ |
武技:开发课程微服务的评论表 report
-- report
create table ml_cms.report
(`id` bigint auto_increment comment '主键' primary key,`fk_episode_id` bigint comment '集次ID,集次表外键',`fk_user_id` bigint comment '举报人ID,用户表外键',`nickname` varchar(128) not null default '' comment '举报人昵称,冗余',`content` varchar(512) not null default '' comment '举报内容',`version` bigint not null default 0 comment '数据版本',`deleted` tinyint not null default 0 comment '0未删除,1已删除',`created` datetime not null default current_timestamp comment '创建时间',`updated` datetime not null default current_timestamp comment '修改时间'
) comment '举报表';-- report
insert into report (`id`, fk_user_id, nickname, fk_episode_id, content)
values (1, 2, '赵四', 1, '内容低俗'),(2, 2, '赵四', 2, '内容很低俗'),(3, 2, '赵四', 3, '内容特别低俗'),(4, 2, '赵四', 4, '内容暴力'),(5, 2, '赵四', 5, '内容很暴力'),(6, 3, '刘能', 2, '发言低俗'),(7, 3, '刘能', 3, '发言很低俗'),(8, 3, '刘能', 4, '发言特别低俗'),(9, 3, '刘能', 5, '发言暴力');
E03. SMS营销微服务
心法:营销微服务 Sale Micro Services,基于 ml_sms 数据库。
数据库 | 数据表 | 描述 |
---|---|---|
ml_sms | notice | 通知表 |
ml_sms | banner | 横幅表 |
ml_sms | article | 新闻表 |
ml_sms | seckill | 秒杀表 |
ml_sms | seckill_detail | 秒杀明细表 |
ml_sms | coupons | 优惠卷表 |
1. 通知表notice
心法:通知表 notice 中存放的是系统通知信息。
字段名 | 类型 | 注释 | 约束 | 默认值 | |
---|---|---|---|---|---|
1 | content | varchar(512) | 内容 | 非空 | ‘’ |
2 | idx | bigint | 序号 | 非空 | 0 |
武技:开发营销微服务的通知表 notice
-- notice
create table ml_sms.notice
(`id` bigint auto_increment comment '主键' primary key,`content` varchar(512) not null default '' comment '内容',`idx` bigint not null default 0 comment '序号',`version` bigint not null default 0 comment '数据版本',`deleted` tinyint not null default 0 comment '0未删除,1已删除',`created` datetime not null default current_timestamp comment '创建时间',`updated` datetime not null default current_timestamp comment '修改时间'
) comment '通知表';-- notice
insert into ml_sms.notice (id, content, idx)
values (1, '重要通知:系统将于今晚22:00进行维护,预计时长2小时,届时将无法访问,请提前做好准备!', 1);
2. 横幅表banner
心法:横幅表 banner 中存放的是系统轮播图片的信息。
字段名 | 类型 | 注释 | 约束 | 默认值 | |
---|---|---|---|---|---|
1 | url | varchar(256) | 图片地址 | 非空 | ‘’ |
2 | idx | bigint | 序号 | 非空 | 0 |
3 | info | varchar(512) | 描述 | 非空 | ‘’ |
武技:开发营销微服务的横幅表 banner
-- banner
create table ml_sms.banner
(`id` bigint auto_increment comment '主键' primary key,`url` varchar(256) not null default '' comment '图片地址',`info` varchar(512) not null default '' comment '描述',`idx` bigint not null default 0 comment '序号',`version` bigint not null default 0 comment '数据版本',`deleted` tinyint not null default 0 comment '0未删除,1已删除',`created` datetime not null default current_timestamp comment '创建时间',`updated` datetime not null default current_timestamp comment '修改时间'
) comment '横幅表';-- banner
insert into banner (`id`, `url`, `info`, `idx`)
values(1, 'default-banner.jpg', '暂无描述', 1),(2, 'default-banner.jpg', '暂无描述', 2),(3, 'default-banner.jpg', '暂无描述', 3),(4, 'default-banner.jpg', '暂无描述', 4),(5, 'default-banner.jpg', '暂无描述', 5);
3. 新闻表article
心法:新闻表 article 中存放的是系统新闻的信息。
字段名 | 类型 | 约束 | 默认值 | 注释 | |
---|---|---|---|---|---|
1 | title | varchar(128) | 非空 | ‘’ | 标题 |
2 | content | varchar(512) | 非空 | ‘’ | 内容 |
3 | idx | bigint | 非空 | 0 | 序号 |
武技:开发营销微服务的新闻表 article
-- article
create table ml_sms.article
( `id` bigint auto_increment comment '主键' primary key, `title` varchar(128) not null default '' comment '标题', `content` varchar(512) not null default '' comment '内容', `idx` bigint not null default 0 comment '序号', `version` bigint not null default 0 comment '数据版本', `deleted` tinyint not null default 0 comment '0未删除,1已删除', `created` datetime not null default current_timestamp comment '创建时间', `updated` datetime not null default current_timestamp comment '修改时间'
) comment '新闻表';-- article
insert into article (`id`, `title`, `content`, `idx`)
values (1, '【公告】热烈庆祝三班Java课程正式开班!', '我们邀请资深讲师,采用前沿教材,注重实践操作,助力学员轻松掌握Java编程技能。无论你是初学者还是进阶者,这里都将是你成长的摇篮。赶快加入我们,一起开启Java编程之旅吧!名额有限,报名从速!', 1),(2, '【公告】好消息!Java教材现已正式出版!', '这本教材由资深Java专家精心撰写,内容深入浅出,既适合初学者入门,也适合进阶者提升。书中包含大量实战案例和练习题,助你轻松掌握Java编程的核心知识和技能。无论你是学生还是职场人士,这本教材都将是你学习Java的绝佳伴侣。赶快行动,抢购一本吧!', 2),(3, '【科普】Java究竟是一门怎样的语言?', 'Java是一种广泛应用的编程语言,以其简洁、面向对象和跨平台特性而著称。它支持多线程编程,拥有丰富的API和强大的社区支持。Java广泛应用于Web开发、移动应用、游戏开发等领域,是IT行业的重要基石之一。掌握Java,将为你打开编程世界的大门。', 3),(4, '【科普】计算机语言发展历史简述。', '计算机语言发展史可追溯到20世纪40年代,最初是机器语言,直接以二进制代码操作计算机。随后诞生了汇编语言,以英文标签简化编程。到了20世纪50年代,高级语言如Fortran和Algol出现,更接近自然语言。之后,C、C++、Java、Python等语言相继涌现,面向对象编程成为主流。计算机语言的发展推动了计算机技术的飞速进步。', 4),(5, '【急聘】诚邀有志之士加入我们的教育团队!', '现招聘Java讲师及助教若干名。Java讲师需具备丰富的教学经验和扎实的编程功底,能够引导学生深入学习Java技术;助教则需协助讲师完成教学任务,解答学生疑问。我们提供优厚的待遇和良好的发展空间,期待你的加入,共同培养更多Java人才!', 5);
4. 秒杀表seckill
心法:秒杀表 seckill 中存放的是秒杀活动的信息。
字段名 | 类型 | 注释 | 约束 | 默认值 | |
---|---|---|---|---|---|
1 | title | varchar(128) | 标题 | 非空 | ‘’ |
2 | start_time | datetime | 活动开始时间 | 非空 | 当前时间 |
3 | end_time | datetime | 活动结束时间 | 非空 | 当前时间 |
4 | status | tinyint | 活动状态,0未开始1已开始2已结束 | 非空 | 0 |
5 | info | varchar(512) | 描述 | 非空 | ‘’ |
武技:开发营销微服务的秒杀表 seckill
-- seckill
create table ml_sms.seckill
(`id` bigint auto_increment comment '主键' primary key,`title` varchar(128) not null default '' comment '标题',`info` varchar(512) not null default '' comment '描述',`start_time` datetime not null default current_timestamp comment '活动开始时间',`end_time` datetime not null default current_timestamp comment '活动结束时间',`status` tinyint not null default 0 comment '0未开始,1已开始,2已结束',`version` bigint not null default 0 comment '数据版本',`deleted` tinyint not null default 0 comment '0未删除,1已删除',`created` datetime not null default current_timestamp comment '创建时间',`updated` datetime not null default current_timestamp comment '修改时间'
) comment '秒杀表';
5. 秒杀明细表seckill_detail
心法:秒杀明细表 seckill_detail 中存放的是秒杀活动的明细信息,每场秒杀活动都包含多条明细信息。
字段名 | 类型 | 注释 | 约束 | 默认值 | |
---|---|---|---|---|---|
1 | fk_seckill_id | bigint | 秒杀ID,秒杀表外键 | ||
2 | fk_course_id | biging | 课程ID,秒杀表外键 | ||
3 | course_title | varchar(128) | 课程标题(冗余) | 非空 | ‘’ |
4 | course_cover | varchar(256) | 课程封面图(冗余) | 非空 | ‘’ |
5 | course_price | decimal(8, 2) | 课程单价,单位元(冗余) | 非空 | 0.00 |
6 | sk_price | decimal(8, 2) | 秒杀价格(元) | 非空 | 0.00 |
7 | sk_count | int | 秒杀数量 | 非空 | 0 |
8 | info | varchar(512) | 描述 | 非空 | ‘’ |
武技:开发营销微服务的秒杀明细表 seckill_detail
-- seckill_detail
create table ml_sms.seckill_detail
(`id` bigint auto_increment comment '主键' primary key,`fk_seckill_id` bigint comment '秒杀ID,秒杀表外键',`fk_course_id` bigint comment '课程ID,课程表外键',`course_title` varchar(128) not null default '' comment '课程标题(冗余)',`course_cover` varchar(256) not null default '' comment '课程封面图(冗余)',`course_price` decimal(8, 2) not null default 0.00 comment '课程单价,单位元(冗余)',`sk_price` decimal(8, 2) not null default 0.00 comment '秒杀价格,单位元',`sk_count` int not null default 0 comment '秒杀数量',`info` varchar(512) not null default '' comment '描述',`version` bigint not null default 0 comment '数据版本',`deleted` tinyint not null default 0 comment '0未删除,1已删除',`created` datetime not null default current_timestamp comment '创建时间',`updated` datetime not null default current_timestamp comment '修改时间'
) comment '秒杀明细表';
6. 优惠卷表coupons
心法:优惠卷表 coupons 中存放的是优惠卷信息。
字段名 | 类型 | 注释 | 约束 | 默认值 | |
---|---|---|---|---|---|
1 | code | varchar(128) | 兑换码 | 非空 | ‘’ |
2 | title | varchar(128) | 标题 | 非空 | ‘’ |
3 | cp_price | decimal(8, 2) | 优惠金额(分) | 非空 | 0.00 |
4 | start_time | datetime | 优惠卷生效时间 | 非空 | 当前时间 |
5 | end_time | datetime | 优惠卷失效时间 | 非空 | 当前时间 |
6 | info | varchar(512) | 描述 | 非空 | ‘’ |
武技:开发营销微服务的优惠卷表 coupons
-- coupons
create table ml_sms.coupons
(`id` bigint auto_increment comment '主键' primary key,`code` varchar(128) not null default '' comment '兑换码',`title` varchar(128) not null default '' comment '标题',`cp_price` decimal(8, 2) not null default 0.00 comment '优惠金额,单位分',`info` varchar(512) not null default '' comment '描述',`start_time` datetime not null default current_timestamp comment '优惠卷生效时间',`end_time` datetime not null default current_timestamp comment '优惠卷失效时间',`version` bigint not null default 0 comment '数据版本',`deleted` tinyint not null default 0 comment '0未删除,1已删除',`created` datetime not null default current_timestamp comment '创建时间',`updated` datetime not null default current_timestamp comment '修改时间'
) comment '优惠卷表';-- coupons
insert into coupons (`id`, `code`, `title`, `cp_price`, `info`, `start_time`, `end_time`)
values (1, 'ml010', '双11通用A卷', 500, '双11活动专用优惠券', now(), now()),(2, 'ml050', '双11通用B卷', 400, '双11活动专用优惠券', now(), now()),(3, '333333', '双11通用C卷', 200, '双11活动专用优惠券', now(), now());
E04. OMS订单微服务
心法:订单微服务 Order Micro Services,基于 ml_oms 数据库。
数据库 | 数据表 | 描述 |
---|---|---|
ml_oms | cart | 购物车表 |
ml_oms | order | 订单表 |
ml_oms | order_detail | 订单明细表 |
1. 购物车表cart
心法:购物车表 cart 中存放的是购物车信息。
字段名 | 类型 | 注释 | 约束 | 默认值 | |
---|---|---|---|---|---|
1 | fk_user_id | bigint | 用户ID,用户表外键 | ||
2 | username | varchar(128) | 用户账号(冗余) | 非空 | ‘’ |
3 | fk_course_id | bigint | 课程ID,课程表外键 | ||
4 | course_title | varchar(128) | 课程标题(冗余) | 非空 | ‘’ |
5 | course_cover | varchar(256) | 课程封面图(冗余) | 非空 | ‘’ |
6 | course_price | decimal(8, 2) | 课程单价(元)(冗余) | 非空 | 0.00 |
武技:开发订单微服务的购物车表 cart
-- cart
create table ml_oms.cart
(`id` bigint auto_increment comment '主键' primary key,`fk_user_id` bigint comment '用户ID,用户表外键',`username` varchar(128) not null default '' comment '用户账号(冗余)',`fk_course_id` int unsigned comment '课程ID,课程表外键',`course_title` varchar(128) not null default '' comment '课程标题(冗余)',`course_cover` varchar(256) not null default '' comment '课程封面图(冗余)',`course_price` decimal(8, 2) not null default 0.00 comment '课程单价,单位元(冗余)',`version` bigint not null default 0 comment '数据版本',`deleted` tinyint not null default 0 comment '0未删除,1已删除',`created` datetime not null default current_timestamp comment '创建时间',`updated` datetime not null default current_timestamp comment '修改时间'
) comment '购物车表';-- cart
INSERT INTO cart (id, fk_user_id, username, fk_course_id, course_title, course_cover, course_price)
VALUES (1, 3, 'liuneng', 1, 'JB1-1-新手村', 'default-cover.jpg', 11100.00),(2, 3, 'liuneng', 2, 'JB1-2-基础启航', 'default-cover.jpg', 11200.00),(3, 3, 'liuneng', 3, 'JB1-3-面向对象', 'default-cover.jpg', 11300.00),(4, 4, 'wangyun', 1, 'JB1-1-新手村', 'default-cover.jpg', 11100.00);
2. 订单表order
心法:订单表 order 中存放的是订单信息。
字段名 | 类型 | 注释 | 约束 | 默认值 | |
---|---|---|---|---|---|
1 | sn | varchar(128) | 编号 | 非空 | ‘’ |
2 | total_amount | decimal(8, 2) | 总金额 | 非空 | 0.00 |
3 | pay_amount | decimal(8, 2) | 实际支付总金额 | 非空 | 0.00 |
4 | pay_type | tinyint | 支付方式,0未支付,1微信,2支付宝,3其他 | 非空 | 0 |
5 | status | tinyint | 订单状态,0未付款,1已付款,2已取消,3其他 | 非空 | 0 |
6 | fk_user_id | bigint | 用户ID,用户表外键 | ||
7 | username | varchar(128) | 收货人账号(冗余) | 非空 | ‘’ |
8 | fk_coupons_id | bigint | 优惠卷ID,优惠卷表外键 | ||
9 | info | varchar(512) | 描述 | 非空 | ‘’ |
武技:开发订单微服务的订单表 order
-- order
create table ml_oms.order
(`id` bigint auto_increment comment '主键' primary key,`sn` varchar(128) not null default '' comment '编号',`total_amount` decimal(8, 2) not null default 0.00 comment '总金额',`pay_amount` decimal(8, 2) not null default 0.00 comment '实际支付总金额',`pay_type` tinyint not null default 0 comment '支付方式,0未支付,1微信,2支付宝,3其他',`status` tinyint not null default 0 comment '订单状态,0未付款,1已付款,2已取消,3其他',`fk_user_id` bigint comment '用户ID,用户表外键',`username` varchar(128) not null default '' comment '用户账号(冗余)',`fk_coupons_id` bigint comment '优惠卷ID,优惠卷表外键',`info` varchar(512) not null default '' comment '描述',`version` bigint not null default 0 comment '数据版本',`deleted` tinyint not null default 0 comment '0未删除,1已删除',`created` datetime not null default current_timestamp comment '创建时间',`updated` datetime not null default current_timestamp comment '修改时间'
) comment '订单表';-- order
insert into `order` (`id`, `sn`, `total_amount`, `pay_amount`, `pay_type`, `info`, `status`, `fk_user_id`, `username`, `fk_coupons_id`)
values (1, '1008611', 10000.00, 9000.00, 1, '请发顺丰快递', 1, 1, 'admin', 1),(2, '1008612', 11000.00, 9100.00, 1, '请发韵达快递', 1, 1, 'admin', 1),(3, '1008613', 12000.00, 9200.00, 2, '请发申通快递', 1, 1, 'admin', 1),(4, '1008614', 13000.00, 9300.00, 2, '请发圆通快递', 1, 1, 'admin', 2),(5, '1008615', 14000.00, 9400.00, 3, '请发邮政快递', 1, 1, 'admin', 2),(6, '1008616', 15000.00, 9500.00, 3, '别发顺丰快递', 1, 2, 'zhaosi', 1),(7, '1008617', 16000.85, 9600.85, 3, '别发韵达快递', 1, 3, 'liuneng', 1),(8, '1008618', 17000.00, 9700.00, 0, '别发申通快递', 0, 3, 'liuneng', 1),(9, '1008619', 18000.00, 9080.00, 0, '别发邮政快递', 0, 1, 'admin', 1);
3. 订单明细表order_detail
心法:订单明细表 order_detail 中存放的是订单的明细信息,每条订单都包含多条明细信息。
字段名 | 类型 | 注释 | 约束 | 默认值 | |
---|---|---|---|---|---|
1 | fk_order_id | bigint | 订单ID,订单表外键 | ||
2 | fk_course_id | bigint | 课程ID,课程表外键 | ||
3 | course_title | varchar(128) | 课程标题(冗余) | 非空 | ‘’ |
4 | course_cover | varchar(256) | 课程封面图(冗余) | 非空 | ‘’ |
5 | course_price | decimal(8, 2) | 课程单价,单位元(冗余) | 非空 | 0.00 |
武技:开发订单微服务的订单明细表 order_detail
-- order_detail
create table ml_oms.order_detail
(`id` bigint auto_increment comment '主键' primary key,`fk_order_id` bigint comment '订单ID,订单表外键',`fk_course_id` bigint comment '课程ID,课程表外键',`course_title` varchar(128) not null default '' comment '课程标题(冗余)',`course_cover` varchar(256) not null default '' comment '课程封面图(冗余)',`course_price` decimal(8, 2) not null default 0.00 comment '课程单价,单位元(冗余)',`version` bigint not null default 0 comment '数据版本',`deleted` tinyint not null default 0 comment '0未删除,1已删除',`created` datetime not null default current_timestamp comment '创建时间',`updated` datetime not null default current_timestamp comment '修改时间'
) comment '订单明细表';
S03. 同步商品信息
武技:使用 Logstash 增量同步 MySQL 中的课程表数据。
E01. 准备ES数据库
1. 创建ES索引
字段 | 类型 | 额外配置 | |
---|---|---|---|
1 | id | long | |
2 | idx | long | |
3 | price | double | |
4 | category_title | keyword | |
5 | cover | keyword | |
6 | author | text | "analyzer" : "ik_max_word", "search_analyzer" : "ik_smart" |
7 | title | text | "analyzer" : "ik_max_word", "search_analyzer" : "ik_smart" |
8 | updated | date | "format": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" |
在 kibana 开发工具执行以下命令:
# 重建 ml-course 索引
PUT ml-course
{"mappings": {"properties": {"id" : { "type" : "long" },"idx": { "type": "long" },"price": { "type": "double" },"category_title": { "type": "keyword" },"cover": { "type": "keyword" },"author": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_smart" },"title": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_smart" },"updated": { "type": "date", "format": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"}}}
}
2. 测试分词效果
# 测试 ml-course 索引的分词效果
GET ml-course/_analyze
{ "text": "JB1-2-Java基础学习", "analyzer": "ik_smart"
}
E02. 同步MySQL数据
心法:提前保证 logstash 可以正常从 course 表中和 category 表中读到数据。
1. 同步课程表数据
- 创建相关目录:
# 创建Logstash相关目录
mkdir -p /opt/elk-ml-course/conf;
- 将 mysql-connector-java-8.0.16.jar 拷贝到 /opt/elk-ml-course/ 下。
- 创建 logstash.yml 配置文件:
touch /opt/elk-ml-course/conf/logstash.yml
填写内容如下:
# 允许任意主机访问
http.host: "0.0.0.0"
# ES服务地址
xpack.monitoring.elasticsearch.hosts: [ "http://192.168.40.77:9200" ]
- 创建 logstash.conf 配置文件:
touch /opt/elk-ml-course/conf/logstash.conf
填写内容如下:
# logstash 输入模块,从日志或数据库中采集数据
input {jdbc {# MySQL驱动包jdbc_driver_library => "/data/mysql-connector-java-8.0.16.jar"# MySQL数据源jdbc_driver_class => "com.mysql.cj.jdbc.Driver"jdbc_connection_string => "jdbc:mysql://192.168.40.77:3306/ml_cms?characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai"jdbc_user => "joezhou"jdbc_password => "joezhou"# 数据库重连尝试次数connection_retry_attempts => "3"# 是否校验数据库连接:默认false不校验jdbc_validate_connection => "true"# 校验数据库连接的超时时间:默认3600msjdbc_validation_timeout => "3600"# 查询语句:通过哪条SQL语句采集数据库记录statement => "select co.id, co.title, co.author, ca.title category_title, co.cover, co.price, co.idx, co.updated from ml_cms.course co join ml_cms.category ca on co.fk_category_id = ca.id where co.updated > :sql_last_value order by co.idx"# 开启分页查询:默认false不开启jdbc_paging_enabled => "true"# 单次分页查询条数:默认100000jdbc_page_size => "500"# 同步频率:默认 "* * * * *",表示每分钟同步一次 # CORN表达式:"分 时 天 月 年"schedule => "* * * * *"# SQL日志等级: 可选 fatal, error, warn, info, debug,默认info;sql_log_level => warn# 是否将字段名转换为小写:默认truelowercase_column_names => false############## 增量同步相关配置 ############## # 开启自定义标识列:false时,标识列默认为当前timestamp的值use_column_value => true# 标识列:用于增量同步,需是数据库字段tracking_column => "updated"# 标识列类型:可选 numeric 和 timestamp,默认numerictracking_column_type => timestamp# true:将上次执行结果中的标识列记录在TXT文件中# false:不记录record_last_run => true# TXT文件last_run_metadata_path => "/data/last_id.txt"# 是否清除TXT文件记录:增量同步时此配置字段必须设置为falseclean_run => false}
}# 过滤移除 @timestamp 和 @version 属性
filter {mutate {remove_field => ["@timestamp"]}mutate {remove_field => ["@version"]}
}# logstash 输出模块,将采集好的数据同步至 ES
output {elasticsearch {# ES主机地址hosts => ["http://192.168.40.77:9200"]# ES索引名称:名称随意index => "ml-course"# 文档索引:建议使用数据库表主键,该值会注入文档的 _id 字段,缺省时随机生成,会造成数据重复document_id => "%{id}"}stdout {codec => json_lines}
}
- 提升两个配置文件的权限:
# 提升两个配置文件权限
chmod -R 777 /opt/elk-ml-course;
- 创建运行容器
# 创建并运行Logstash容器
docker run -d --name elk-ml-course --network my-net -p 4570:4560 \-v /opt/elk-ml-course/conf/logstash.yml:/usr/share/logstash/config/logstash.yml \-v /opt/elk-ml-course/conf/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \-v /opt/elk-ml-course:/data \registry.cn-hangzhou.aliyuncs.com/joezhou/logstash:8.4.0;# 查看运行的容器
docker ps --format "{{.ID}}\t{{.Names}}\t{{.Ports}}"
docker logs elk-ml-course --tail 30# 永久开放4570端口
firewall-cmd --add-port=4570/tcp --permanent
firewall-cmd --reload
- 在 Kibana 中添加索引模式 ml-course,然后查看数据是否已经同步到 ES 中。
Java道经 - 项目 - MyLesson - 项目简介