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 修改数据可见

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/570494.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

光速记单词-brother开头的单词

1. 思维导图 1.1 brother 1.2 mom 1.3 dad 1.4 man 2. 视频链接

13. Spring AOP(一)思想及使用

1. 什么是Spring AOP AOP的全称是Aspect Oriented Programming&#xff0c;也就是面向切面编程&#xff0c;是一种思想。它是针对OOP(面向对象编程)的一种补充&#xff0c;是对某一类事情的集中处理。比如一个博客网站的登陆验证功能&#xff0c;在用户进行新增、编辑、删除博…

js手写call、bind、apply

目录 call与applyapply bind call和apply和bind有两种实现方式&#xff0c;第一种是隐式绑定&#xff0c;第二种是通过new 无论是通过隐式绑定实现还是通过new实现&#xff0c;核心都是针对this的绑定规则 具体关于this的绑定规则可以看我这一篇博客 this绑定规则 call与apply…

【热议】硕士和读博士洗碗区别的两大理论

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

【软件测试基础】概述篇(持续更新中)

《 软件测试基础持续更新中》 这一章&#xff0c;是每一名软件测试工程师必须要掌握的常识&#xff01; 1、软件测试的目的&#xff1a;提高软件质量 和 确保软件满足用户需求。 2、软件测试的概念&#xff1a;使用人工或自动手段来运行或测试某个系统的过程&#xff0c;目的…

品牌差异化战略:Kompas.ai如何打造独特的内容声音

在当今竞争激烈的商业环境中&#xff0c;品牌差异化已成为企业获取市场优势的关键策略。一个鲜明的品牌形象和独特的内容声音不仅能够帮助企业吸引目标客户&#xff0c;还能够在消费者心中建立起独特的地位。本文将深入探讨品牌差异化的重要性&#xff0c;分析Kompas.ai如何帮助…

SL3037内置MOS管 耐压60V降压恒压芯片 降12V或降24V 电路简单

SL3037B是一款内置功率MOSFET的单片降压型开关模式转换器&#xff0c;具有以下特点&#xff1a; 1. 高效率&#xff1a;采用开关式降压技术&#xff0c;仅在需要调节输出电压时才会消耗能量&#xff0c;从而提高了整体的效率。 2. 稳定性好&#xff1a;通过精确的内部电路设计…

数睿通2.0版本升级:探索数据血缘的奥秘

引言 数睿通 2.0 迎来了 4 月份的更新&#xff0c;该版本更新了许多用户期望的数据血缘模块&#xff0c;把原来外链跳转 neo4j 页面改为自研页面&#xff0c;方便后期的二次开发完善&#xff0c;此外&#xff0c;新版本摒弃了 neo4j 的血缘数据存储方案&#xff0c;一来是因为…

接口压力测试 jmeter--进阶篇(三)

一、数据实时监控JMeterGrafanaInfluxdb &#xff08;mac&#xff09;性能监控平台搭建JMeterGrafanaInfluxdb 优点&#xff1a; 1.实时 2.美观 3.能够存储和对比 原理&#xff1a; 1.运行jmeter时会吧数据写入到influxdb 2.influxdb实时存储执行的结果 3.grafana链接.influxd…

基于 Flexbox 的纯 CSS 框架:兼容性好、文档丰富 | 开源日报 No.232

jgthms/bulma Stars: 48.3k License: MIT bulma 是基于 Flexbox 的现代 CSS 框架。 基于 Flexbox 技术。提供快速安装方式&#xff0c;支持 NPM、Yarn 和 Bower。仅包含 CSS 文件&#xff0c;没有 JavaScript 部分。兼容性良好&#xff0c;在主流浏览器上运行良好。提供丰富的…

工作中常用的5种加密算法

背景 最近&#xff0c;项目中做了一些安全性要求的整改。而加密是使用过程中常用的手段之一。这里简单的整理下&#xff0c;希望对小伙伴有帮助。 使用场景 加密是一种将原始信息&#xff08;明文&#xff09;转换成难以被直接理解的形式&#xff08;密文&#xff09;的过程…

信息收集

信息收集 域名的相关知识 域名的技术指的是一个域名由多少级组成&#xff0c;域名的各个级别被“.”分开&#xff0c;简而言之&#xff0c;有多少个点就是几级域名 顶级域名&#xff1a;.com(商)、.edu(教)、.gov(政)、.mil(军) 一级域名&#xff1a;qq.com 二级域名&#xf…

Python--容器、面向对象

一、容器类型(下) 重点学习容器的定义 常用操作的建议 跟着课堂把代码写一遍即可&#xff0c;混个脸熟&#xff0c;后面现用现查 增、删、改、查&#xff1a;重点掌握 查 字符串、元组&#xff1a;只能查&#xff0c;不能改 1.1 字符串str 1.1.1 字符串基本语法 1.1.2 字…

外呼系统出海注意事项

外呼系统在出海过程中需要注意多个方面&#xff0c;以确保系统的有效运行和合规性。以下是一些关键的注意事项&#xff1a; 一、市场调研与目标定位&#xff1a; 在出海前&#xff0c;深入调研目标市场的行业趋势、消费者偏好、文化背景和竞争态势。这有助于企业更好地了解市场…

基于麻雀搜索算法-BP神经网络SSA-BP回归预测

文章目录 效果一览文章概述订阅专栏只能获取一份代码部分源码参考资料效果一览 文章概述 基于麻雀搜索算法-BP神经网络SSA-BP回归预测 订阅专栏只能获取一份代码 部分源码 %------

几种Python处理Excel数据的方法!

第一种方法&#xff1a; 电子表格格式 我们在日常工作中常常见到各种后缀的电子表格&#xff0c;例如最常见的xlsx以及较为常见的csv、xls等格式的表格。同样是电子表格&#xff0c;它们之间有什么区别吗&#xff1f; • xls为Excel早期表格格式。 xls格式是Excel2003版本及…

TDengineGUI无法连接TDengine

可能是TDengineGUI本身的问题&#xff0c;直接下载可执行文件即可 下载地址&#xff1a;Release 1.0.3 ericyangpan/TDengineGUI (github.com) 还有可能是你的6041端口没开注意检查 可在TDengine文件夹下直接执行 systemctl start taosadapter 也可以点击 taosadapter.exe …

管理者如何在团队里讨论敏感话题

在团队中处理不便讨论的敏感话题可能会令人不适&#xff0c;但如果无视问题&#xff0c;它们会不知不觉地积聚起来&#xff0c;影响士气。 随着团队地理上越来越分散以及线上沟通增多&#xff0c;感知到团队间的不适或提出敏感话题变得更加困难。但是&#xff0c;忽略这些难以…

企业组网的作用有哪些?SD-WAN有什么优势?

在信息化的时代&#xff0c;企业组网建设逐渐成为提升企业竞争力、实现业务高效运行的关键&#xff0c;它能够为企业在信息传输、资源共享、远程办公等方面提供强大的支持。接下来&#xff0c;本文为大家详细介绍企业网络组网的意义&#xff0c;以及为大家推荐热门的网络解决方…

JVM (Micrometer)监控SpringBoot(AWS EKS版)

问题 怎样使用JVM (Micrometer)面板&#xff0c;监控Spring&#xff1f;这里不涉及Prometheus和Grafana&#xff0c;重点介绍与Micrometer与Springboot&#xff0c;k8s怎样集成。 pom.xml 引入依赖&#xff0c;如下&#xff1a; <properties><micrometer.version&…