在线教育业务笔记03- 讲师banner(轮播图)管理模块

一、新建banner微服务

1、在service模块下创建子模块service-cms

2、使用代码生成器生成banner代码

2.1、sql文件阿里云地址

https://cor2022314.oss-cn-beijing.aliyuncs.com/guli_cms.sql

2.2、MyBatis-Plus代码生成器

package codedemo;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.Test;/*** @author Tzc*/
public class CodeGenerator {@Testpublic void run() {// 1、创建代码生成器AutoGenerator mpg = new AutoGenerator();// 2、全局配置GlobalConfig gc = new GlobalConfig();String projectPath = System.getProperty("user.dir");gc.setOutputDir("E:\\work\\guli_parent\\service\\service_cms" + "/src/main/java");gc.setAuthor("Tzc");gc.setOpen(false); //生成后是否打开资源管理器gc.setFileOverride(false); //重新生成时文件是否覆盖// UserServiegc.setServiceName("%sService");    //去掉Service接口的首字母Igc.setIdType(IdType.ID_WORKER_STR); //主键策略gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型gc.setSwagger2(true);//开启Swagger2模式mpg.setGlobalConfig(gc);// 3、数据源配置DataSourceConfig dsc = new DataSourceConfig();dsc.setUrl("jdbc:mysql://localhost:3306/guli?serverTimezone=GMT%2B8");dsc.setDriverName("com.mysql.cj.jdbc.Driver");dsc.setUsername("root");dsc.setPassword("root");dsc.setDbType(DbType.MYSQL);mpg.setDataSource(dsc);// 4、包配置PackageConfig pc = new PackageConfig();pc.setModuleName("educms"); // 模块名//包  com.atguigu.eduservicepc.setParent("com.atguigu");//包  com.atguigu.eduservice.controllerpc.setController("controller");pc.setEntity("entity");pc.setService("service");pc.setMapper("mapper");mpg.setPackageInfo(pc);// 5、策略配置StrategyConfig strategy = new StrategyConfig();strategy.setInclude("crm_banner");strategy.setNaming(NamingStrategy.underline_to_camel);// 数据库表映射到实体的命名策略strategy.setTablePrefix(pc.getModuleName() + "_"); // 生成实体时去掉表前缀strategy.setColumnNaming(NamingStrategy.underline_to_camel);// 数据库表字段映射到实体的命名策略strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作strategy.setRestControllerStyle(true); // restful api风格控制器strategy.setControllerMappingHyphenStyle(true); // url中驼峰转连字符mpg.setStrategy(strategy);// 6、执行mpg.execute();}
}

2.3、生成代码

3、配置application.properties

# 服务端口
server.port=8004
# 服务名
spring.application.name=service-cms# mysql数据库连接
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/guli?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root#返回json的全局时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8#配置mapper xml文件的路径
mybatis-plus.mapper-locations=classpath:com/atguigu/educms/mapper/xml/*.xmlspring.redis.host=192.168.108.3
spring.redis.port=6379
spring.redis.database= 0
spring.redis.timeout=1800000# nacos服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848spring.redis.lettuce.pool.max-active=20
spring.redis.lettuce.pool.max-wait=-1
#最大阻塞等待时间(负数表示没限制)
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

4、创建启动类

package com.atguigu.educms;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.bind.annotation.CrossOrigin;/*** @author Tzc*/@CrossOrigin
@SpringBootApplication
@ComponentScan({"com.atguigu"})
@MapperScan("com.atguigu.educms.mapper")
public class CmsApplication {public static void main(String[] args) {SpringApplication.run(CmsApplication.class, args);}
}

二、集成Redis

1、在common公共模块添加依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>guli_parent</artifactId><groupId>com.atguigu</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>common</artifactId><packaging>pom</packaging><modules><module>service_base</module><module>common_utils</module></modules><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><scope>provided</scope></dependency><!--mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><scope>provided</scope></dependency><!--lombok用来简化实体类:需要安装lombok插件--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency><!--swagger--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><scope>provided</scope></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><scope>provided</scope></dependency><!-- redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency></dependencies>
</project>

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>common</artifactId><groupId>com.atguigu</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>common_utils</artifactId><dependencies><!--spring2.X集成redis所需common-pool2--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.6.0</version></dependency><!-- JWT--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId></dependency></dependencies></project>

2、在service-base模块添加redis配置类

引入common_utils模块依赖


package com.atguigu.servicebase;import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;import java.time.Duration;/***  @EnableCaching // 开启缓存*  @Configuration // 配置类* @author Tzc*/
@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();RedisSerializer<String> redisSerializer = new StringRedisSerializer();Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);template.setConnectionFactory(factory);// key序列化方式template.setKeySerializer(redisSerializer);// value序列化template.setValueSerializer(jackson2JsonRedisSerializer);// value hashmap序列化template.setHashValueSerializer(jackson2JsonRedisSerializer);return template;}@Beanpublic CacheManager cacheManager(RedisConnectionFactory factory) {RedisSerializer<String> redisSerializer = new StringRedisSerializer();Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);// 解决查询缓存转换异常的问题ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);// 配置序列化(解决乱码的问题),过期时间600秒RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(600)).serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)).disableCachingNullValues();RedisCacheManager cacheManager = RedisCacheManager.builder(factory).cacheDefaults(config).build();return cacheManager;}
}

3、 Spring Boot缓存注解介绍

1、 @Cacheable

根据方法对其返回结果进行缓存(redis),下次请求时,如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。一般用在查询方法上。

属性值:
value :缓存名,必填,它指定了你的缓存存放在哪块命名空间
cacheNames: 与 value 差不多,二选一即可
key:可选属性,可以使用 SpEL 标签自定义缓存的key

2、 @CacheEvict

会清空指定的缓存 一般用在更新或者删除方法上

属性值:
value :缓存名,必填,它指定了你的缓存存放在哪块命名空间
cacheNames: 与 value 差不多,二选一即可
key:可选属性,可以使用 SpEL 标签自定义缓存的key
allEntries: 是否清空所有缓存,默认为 false。如果指定为 true,则方法调用后将立即清空所有的缓存
beforeInvocation : 是否在方法执行前就清空,默认为 false。如果指定为 true,则在方法执行前就会清空缓存

3、 @CachePut

使用该注解标志的方法,每次都会执行,并将结果存入指定的缓存中。其他方法可以直接从响应的缓存中读取缓存数据,而不需要再去查询数据库。一般用在新增方法上。

属性值:
value :缓存名,必填,它指定了你的缓存存放在哪块命名空间
cacheNames: 与 value 差不多,二选一即可
key:可选属性,可以使用 SpEL 标签自定义缓存的key

4、启动redis服务

三、banner Api接口

1、后台管理Controller

package com.atguigu.educms.controller;import com.atguigu.commonutils.R;
import com.atguigu.educms.entity.CrmBanner;
import com.atguigu.educms.service.CrmBannerService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*;/*** 后台banner管理接口* @author Tzc*/
@RestController
@RequestMapping("/educms/banneradmin")
@CrossOrigin
public class BannerAdminController {@Autowiredprivate CrmBannerService bannerService;/*** 分页查询banner* @param page 当前页码* @param limit 每页记录数* @return items*/@ApiOperation(value = "获取Banner分页列表")@GetMapping("pageBanner/{page}/{limit}")public R pageBanner(@ApiParam(name = "page", value = "当前页码", required = true)@PathVariable Long page,@ApiParam(name = "limit", value = "每页记录数", required = true)@PathVariable Long limit) {Page<CrmBanner> pageBanner = new Page<>(page, limit);bannerService.page(pageBanner, null);return R.ok().data("items", pageBanner.getRecords()).data("total", pageBanner.getTotal());}/*** 添加banner* @param crmBanner* @return*/@ApiOperation(value = "修改Banner")@PostMapping("addBanner")public R addBanner(@RequestBody CrmBanner crmBanner) {bannerService.save(crmBanner);return R.ok();}/*** 根据id获取Banner* @param id* @return*/@ApiOperation(value = "根据id获取Banner")@GetMapping("get/{id}")public R get(@PathVariable String id) {CrmBanner banner = bannerService.getById(id);return R.ok().data("item", banner);}/*** 修改Banner* @param banner* @return*/@ApiOperation(value = "修改Banner")@PutMapping("update")public  R updateById(@RequestBody CrmBanner banner) {bannerService.updateById(banner);return R.ok();}/*** 删除Banner* @param id* @return*/@ApiOperation(value = "删除Banner")@DeleteMapping("remove/{id}")public R remove(@PathVariable String id) {bannerService.removeById(id);return R.ok();}
}

2、前台页面显示接口

2.1、Controller

package com.atguigu.educms.controller;import com.atguigu.commonutils.R;
import com.atguigu.educms.entity.CrmBanner;
import com.atguigu.educms.service.CrmBannerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** 前台bannber显示* @author Tzc*/
@RestController
@RequestMapping("/educms/bannerfront")
@CrossOrigin
public class BannerFrontController {@Autowiredprivate CrmBannerService bannerService;/*** 查询所有banner* @return*/@GetMapping("getAllBanner")public R getAllBanner() {List<CrmBanner> list = bannerService.selectAllBanner();return R.ok().data("list", list);}}

2.2、Service

2.2.1、接口
package com.atguigu.educms.service;import com.atguigu.educms.entity.CrmBanner;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;import java.util.List;/*** 首页banner表 服务类** @author Tzc*/
public interface CrmBannerService extends IService<CrmBanner> {/*** 查询所有banner* @return*/List<CrmBanner> selectAllBanner();/*** 根据ID查询 banner* @param id* @return*/public CrmBanner getBannerById(String id);/*** 添加banner* @param banner*/public void saveBanner(CrmBanner banner);/*** 修改banner* @param banner*/public void updateBannerById(CrmBanner banner);/*** 根据 ID 删除banner* @param id*/public void removeBannerById(String id);}
2.2.1、实现类
package com.atguigu.educms.service.impl;import com.atguigu.educms.entity.CrmBanner;
import com.atguigu.educms.mapper.CrmBannerMapper;
import com.atguigu.educms.service.CrmBannerService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;import java.util.List;/*** 首页banner表 服务实现类* @author Tzc*/
@Service
public class CrmBannerServiceImpl extends ServiceImpl<CrmBannerMapper, CrmBanner> implements CrmBannerService {/***  @Cacheable(value = "banner",key = "'selectIndexList'")*  value 缓存名 必填,它指定了你的缓存存放在哪块命名空间*  key 可选属性 可以使用 SpEL 标签自定义缓存的key*  cacheNames  与 value 差不多,二选一即可* 查询所有banner* @return list*/@Cacheable(value = "banner",key = "'selectIndexList'")@Overridepublic List<CrmBanner> selectAllBanner() {// 根据id进行降序排列,显示排列之后前两条记录QueryWrapper<CrmBanner> wrapper = new QueryWrapper<>();// 根据id降序排列wrapper.orderByDesc("id");// last方法,拼接sql语句wrapper.last("limit 2");List<CrmBanner> list = baseMapper.selectList(null);return list;}@Overridepublic CrmBanner getBannerById(String id) {return baseMapper.selectById(id);}@CachePut(value = "banner")@Overridepublic void saveBanner(CrmBanner banner) {baseMapper.insert(banner);}@CacheEvict(value = "banner", allEntries=true)@Overridepublic void updateBannerById(CrmBanner banner) {baseMapper.updateById(banner);}@CacheEvict(value = "banner", allEntries=true)@Overridepublic void removeBannerById(String id) {baseMapper.deleteById(id);}
}

四、前端页面显示

1、创建banner.js文件调用后端方法

import request from '@/utils/request'export default {// 查询前两条banner数据getListBanner() {return request({url: '/educms/bannerfront/getAllBanner',method: 'get'})}
}

2、在首页面引入banner.js文件,得到数据

<script>
import banner from '@/api/banner'
export default {data () {return {swiperOption: {// 配置分页pagination: {el: '.swiper-pagination'//分页的dom节点},// 配置导航navigation: {nextEl: '.swiper-button-next',//下一页dom节点prevEl: '.swiper-button-prev'//前一页dom节点}},// banner数组 用于存储数据bannerList:[]}},created() {// 调用查询banner的方法this.getBannerList()},methods:{// 查询banner数据getBannerList() {banner.getListBanner().then(response => {this.bannerList = response.data.data.list})}}
}
</script

3、页面遍历 bannerList:[] 显示banner

  <div v-swiper:mySwiper="swiperOption"><div class="swiper-wrapper"><div v-for="banner in bannerList" :key="banner.id" class="swiper-slide" style="background: #040B1B;"><a target="_blank" :href="banner.linkUrl"><img :src="banner.imageUrl" :alt="banner.title"></a></div></div><div class="swiper-pagination swiper-pagination-white"></div><div class="swiper-button-prev swiper-button-white" slot="button-prev"></div><div class="swiper-button-next swiper-button-white" slot="button-next"></div></div>

在线教育业务笔记03相关推荐

  1. 面向在线教育业务的流媒体分发演进

    点击上方"LiveVideoStack"关注我们 几年前,很多人对在线网课还非常陌生.随着移动设备的普及和音视频技术的发展,如今在线教育产品百花齐放.而在线教育产品能服务千万学子离 ...

  2. 尚硅谷的谷粒学院在线教育项目笔记

    不特意写格式了 免得多花时间 项目简介:全后端分离项目 在线教育业务 官网+后台 功能模块: 技术栈: MyBatis-Plus的主键生成策略: 参考链接:https://www.cnblogs.co ...

  3. 以在线教育销售CRM为例,谈谈业务大盘拆解优化的六步法

    前言 对于一名企业内的B端产品经理,核心工作之一,是利用技术赋能业务,帮助业务改进,实现企业的商业价值. 如何识别业务问题?如何发现改进机会点?如何分析业务大盘?如何从产品视角给出解决思路?如何基于数 ...

  4. 百度传课网易云课堂在线教育平台竞品分析【转】

    最近正在用网易云课堂学习数据库,闲来搜到这篇网易云课堂和百度传课的竞品分析,写的不错. 个人还是网易云课堂用的比较多,网易云课堂总体给人感觉讲师更专业靠谱,并且注重知识体系的培养,比如课程体系和微专业 ...

  5. 开盘即破发,网易有道赴美上市,继续发力在线教育

    开盘即破发,网易有道赴美上市,继续发力在线教育 网易公司董事局主席兼首席执行官丁磊与有道创始人兼CEO周枫一同出席有道IPO仪式 距离递交招股书仅过去25天,网易有道在纽约证券交易所正式挂牌上市,成为 ...

  6. 在线教育大数据营销平台实战(一):大数据平台构建实战

    作者介绍 Tigerhu 在线教育公司大数据营销产品线负责人. 本人目前在一家在线教育公司担任大数据营销产品负责人,由于一些机缘巧合,我同时负责了数据产品线和营销CRM产品线,因此给了我更多的机会去思 ...

  7. 在线教育大数据营销平台实战(四):CRM线索生命周期及用户画像构建

    作者介绍 @TigerHu 在线教育公司, 大数据营销产品线负责人, "一个数据人的自留地"创作者联盟成员. 数据化运营理念的落地不能只停留在对系统的盲目构建上,让企业内部用户会用 ...

  8. 在线教育7年探索史 | 详解

    2012年,美国西海岸的硅谷,"频频"传来在线教育公司数千万美金融资.国内一级市场和创业者们,加速将注意力转向"在线教育". 2013.2014年,投资机构领投 ...

  9. 基于神策用户画像,在线教育企业线索标签体系搭建及培育全流程解析

    作者介绍:TigerHu,环球网校大数据营销产品 leader,主导数据产品线和营销 CRM 产品线. 本文内容均从作者真实实践过程出发,结合作者公司与神策数据合作真实场景,从神策用户画像产品出发,全 ...

最新文章

  1. vi php,linux编辑文件命令vi有什么作用
  2. MySQL内核月报 2014.11-MySQL· 5.7特性·在线Truncate undo log 表空间
  3. C++17新特性学习笔记
  4. mysql info commit_mysql show processlist 发现大量的commit
  5. 独家 | 一文读懂Adaboost
  6. spark rdd map java_Spark map 遍历rdd中的每个元素
  7. 铺地毯(luogu 1003)
  8. BZOJ1861:[ZJOI2006]书架——题解
  9. 解决eclipse反编译乱码
  10. cpu顶盖怎么看步进_CPU步进是什么意思?i3-9100F B0步进和U0步进区别知识科普
  11. J - MaratonIME goes to the japanese restaurant (again)
  12. Maven异常:0.0.1-SNAPSHOT: Could not find artifact
  13. GEE基础学习——绘制经纬线pixelLonLat
  14. 计组中原码一位乘和原码二位乘方法和注意事项
  15. 软件测试项目实战案例分解,跟着我一步一步操作【人力资源管理系统】
  16. 一文读懂智能对话系统
  17. win10如何修改远程桌面的默认端口_win10远程桌面端口的更改办法
  18. TIM基本定时器——定时
  19. 漫步者的蓝牙耳机和南卡耳机哪个好?半入耳式耳机对比!
  20. 关于windows11安装vc6.0闪退解决问题

热门文章

  1. 深度探索C++对象模型第2章 构造函数语义学
  2. 白月黑羽python_白月黑羽来帮你分析现在是选择 Python3.6 还是 Python 3.7
  3. C++贪心——纪念品分组
  4. Extmail修改模板及其它配置
  5. 关于keil中,while循环条件不成立却无法跳出的问题
  6. 穷人最缺少的不是金钱,而是野心
  7. 【Algorithm】种子填充算法
  8. 嵌入式Linux_USB_U盘自动检测识别
  9. IOS ANE的坑爹之路一
  10. redis集群报错:(error) MOVED 解决方法