Day 5 广告管理

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

image-20240423163753781测试成功

配置服务网关

  1. 使用SwitchHosts给Higress所在的虚拟机配置域名

    image-20240423192337140

  2. 在Higress中配置域名

    image-20240423192534619

  3. 在Higress中配置路由

    image-20240423192657886

  4. 访问http://www.bootsshopping.com/user/category/all,测试查询所有广告

  5. 打开前端客户端项目,修改配置文件vue.config.js

     devServer: {
      port: 8081,
      // 代理服务器
        proxy: {
            '/': {
                target: 'http://www.bootsshopping.com/',
                changeOrigin: true, 
                    // pathRewrite: {
                    //  '^/api': '' 
                    // }
            }
    }
    }
    
  6. 使用yarn下载前端项目依赖

    yarn install
    
  7. 使用yarn运行前端项目

    yarn serve
    
  8. 访问前端项目 http://localhost:8081/

使用缓存优化用户查询广告

在用户访问网站首页时,需要查询网站的所有启用广告。而电商网站用户访问量大,大量用户每次访问首页都从数据库查询广告非常浪费资源,我们可以使用Redis缓存技术优化用户对于广告的查询。思路如下:

  1. 用户查询广告数据时,先从Redis中查询,如果Redis中没有,再从数据库查询并同步数据到Redis中,这样之后的用户就可以从Redis中快速查找广告数据了。
  2. 管理员在数据库增删改广告数据时,向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);
    }
}

image-20240423224651121

可以看到刷新浏览器进行查询的时候从redis中拿到了数据

image-20240423224805457

这里可以看到从客户端也是可以查到数据;

//todo 修改数据可见

完成更新添加和查询广告功能

  • 21
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值