Day 5 广告管理
这里会总结构建项目过程中遇到的问题,主要流程,以及一些个人思考!!
学习方法:
1 github源码 + 文档 + 官网
2 内容复现 ,实际操作
项目源码同步更新到github 欢迎大家star~ 后期会更新并上传前端项目
创建广告服务模块
# 端口号
server:
port: 9004
# 日志格式
logging:
pattern:
console: '%d{HH:mm:ss.SSS} %clr(%-5level) --- [%-15thread] %cyan(%-50logger{50}):%msg%n'
# 配置Mybatis-plus
mybatis-plus:
global-config:
db-config:
# 表名前缀
table-prefix: boots_
# 主键生成策略为自增
id-type: auto
configuration:
# 关闭列名自动驼峰命名映射规则
map-underscore-to-camel-case: false
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启sql日志
spring:
application:
name: shopping_category_service #服务名
cloud:
nacos:
discovery:
server-addr: 192.168.66.100:8848 # 注册中心地址
# 数据源
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:///shopping?serverTimezone=UTC
username: root
password: root
dubbo:
application:
name: shopping_category_service #服务名
serialize-check-status: DISABLE
check-serializable: false
protocol:
name: dubbo # 通讯协议
port: -1 # 端口号,-1表示自动扫描可用端口。
registry:
address: nacos://192.168.66.100:8848 # 注册中心
后台管理广告成功
创建前台广告api模块
- 权限验证使用Higress
# 端口号
server:
port: 8002
# 日志格式
logging:
pattern:
console: '%d{HH:mm:ss.SSS} %clr(%-5level) --- [%-15thread] %cyan(%-50logger{50}):%msg%n'
# Nacos
spring:
application:
name: shopping_category_customer_api
cloud:
nacos:
discovery:
server-addr: 192.168.66.100:8848
dubbo:
application:
#项目名字
name: shopping_category_customer_api
protocol:
name: dubbo
port: -1
registry:
# 注册地址
address: nacos://192.168.66.100:8848
测试成功
配置服务网关
-
使用SwitchHosts给Higress所在的虚拟机配置域名
-
在Higress中配置域名
-
在Higress中配置路由
-
访问http://www.bootsshopping.com/user/category/all,测试查询所有广告
-
打开前端客户端项目,修改配置文件
vue.config.js
devServer: { port: 8081, // 代理服务器 proxy: { '/': { target: 'http://www.bootsshopping.com/', changeOrigin: true, // pathRewrite: { // '^/api': '' // } } } }
-
使用yarn下载前端项目依赖
yarn install
-
使用yarn运行前端项目
yarn serve
-
访问前端项目 http://localhost:8081/
使用缓存优化用户查询广告
在用户访问网站首页时,需要查询网站的所有启用广告。而电商网站用户访问量大,大量用户每次访问首页都从数据库查询广告非常浪费资源,我们可以使用Redis缓存技术优化用户对于广告的查询。思路如下:
- 用户查询广告数据时,先从Redis中查询,如果Redis中没有,再从数据库查询并同步数据到Redis中,这样之后的用户就可以从Redis中快速查找广告数据了。
- 管理员在数据库增删改广告数据时,向Redis更新所有启用的广告数据。
踩坑! 使用switchHost的时候关闭代理
// todo 这里有一个小问题, 前端访问的时候即使开了代理,依然可以正确拿到数据
优化广告实现类- redis
这里如果原来有spring 就把下面这个删掉
spring:
# redis
data:
redis:
host: 192.168.66.100
port: 6379
timeout: 30000
jedis:
pool:
max-idle: 8
max-wait: -1
max-active: 8
min-idle: 0
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
@Transactional
@Slf4j
@DubboService
public class CategoryServiceImpl implements CategoryService {
@Autowired
private CategoryMapper categoryMapper;
// 对象名必须叫redisTemplate,否则由于容器中有多个RedisTemplate对象造成无法注入
@Autowired
private RedisTemplate redisTemplate;
@Override
public void add(Category category) {
categoryMapper.insert(category);
refreshRedisCategory();
}
@Override
public void update(Category category) {
categoryMapper.updateById(category);
refreshRedisCategory();
}
@Override
public void updateStatus(Long id, Integer status) {
Category category = categoryMapper.selectById(id);
category.setStatus(status);
categoryMapper.updateById(category);
refreshRedisCategory();
}
@Override
public void delete(Long[] ids) {
categoryMapper.deleteBatchIds(Arrays.asList(ids));
}
@Override
public Category findById(Long id) {
return categoryMapper.selectById(id);
}
@Override
public Page<Category> search(int page, int size) {
return categoryMapper.selectPage(new Page(page,size),null);
}
@Override
public List<Category> findAll() {
// 1.从redis中查询启用的广告
// 1.1 获取操作redis中list数据的对象
ListOperations<String,Category> listOperations = redisTemplate.opsForList();
// 1.2 从redis中获取所有启用的广告
List<Category> categoryList = listOperations.range("categories", 0, -1);
if (categoryList != null && categoryList.size() > 0){
// 2.如果查到结果,直接返回
log.info("从redis中查询广告");
return categoryList;
}else{
// 3.如果redis中没有数据,则从数据库查询广告,并同步到redis中
log.info("从mysql中查询广告");
// 从数据库查询广告
QueryWrapper<Category> queryWrapper = new QueryWrapper();
queryWrapper.eq("status",1);
List<Category> categories = categoryMapper.selectList(queryWrapper);
// 同步到redis中
listOperations.leftPushAll("categories",categories);
return categories;
}
}
/**
* 更新redis中的广告数据
*/
public void refreshRedisCategory(){
// 从数据库查询广告
QueryWrapper<Category> queryWrapper = new QueryWrapper();
queryWrapper.eq("status",1);
List<Category> categories = categoryMapper.selectList(queryWrapper);
// 删除redis中的原有广告数据
redisTemplate.delete("categories");
// 将新的广告数据同步到redis中
ListOperations<String,Category> listOperations = redisTemplate.opsForList();
listOperations.leftPushAll("categories",categories);
}
}
可以看到刷新浏览器进行查询的时候从redis中拿到了数据
这里可以看到从客户端也是可以查到数据;
//todo 修改数据可见
完成更新添加和查询广告功能