在线教育-谷粒学院学习笔记(九)

news2024/11/17 15:59:07

文章目录

    • 1 内容介绍
    • 2 搭建项目前台环境NUXT
    • 3 整合项目首页
    • 4 nuxt路由
    • 5 首页数据banner显示—初始配置
    • 6 首页数据banner显示—接口
    • 7 首页数据banner显示—前端实现
    • 8 首页数据显示—热门课程和名师
    • 9 Redis复习
    • 10 首页数据添加Redis缓存

1 内容介绍

  • 搭建项目前台系统环境
    • NUXT
  • 整合前台系统页面
  • 首页banner数据
  • 首页热门课程+名师
  • 首页数据使用redis缓存

B2C模式:管理员+普通用户

后台管理系统+前台系统

2 搭建项目前台环境NUXT

NUXT:服务端渲染技术

在这里插入图片描述

1 nuxt框架压缩文件

starter-template-master -> vue-front-1010

解压后,工作区打开:vue-front-1010

下载依赖:npm install

启动项目:npm run dev

操作

  • 打开老师的vue-front-1010

  • 修改地方

    • 将guli-admin项目下的.eslintrc.js配置文件复制到当前项目下

    • 修改package.json name、description、author(必须修改这里,否则项目无法安装)

      "name": "vue-front-1010",
      "version": "1.0.0",
      "description": "谷粒学苑前台网站",
      "author": "mys",
      
    • 修改nuxt.config.js 修改title: ‘{{ name }}’、content: ‘{{escape description }}’

      head: {
        title: '谷粒学苑',
        meta: [
          { charset: 'utf-8' },
          { name: 'viewport', content: 'width=device-width, initial-scale=1' },
          { hid: 'keywords', name: 'keywords', content: '谷粒学苑' },
          {
            hid: 'description',
            name: 'description',
            content: '谷粒学苑'
          }
        ],
        link: [
          { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
        ]
      },
      
  • 控制台依次执行:

    • npm update
    • npm install
    • npm run dev
  • 如果报错,用管理员打开控制台,npm install如果下载失败,可以多下载几次

2 nuxt环境目录结构

  • assets:放项目的静态资源,css js img

  • components:放项目相关组件

  • layouts:定义网页布局的方式

  • pages:项目页面 index.js默认页面

  • nuxt.config.js nuxt核心的配置文件

3 整合项目首页

1 安装组件

npm install vue-awesome-swiper

2 配置插件

  • 新建plugins/nuxt-swiper-plugin.js

    import Vue from 'vue'
    import VueAwesomeSwiper from 'vue-awesome-swiper/dist/ssr'
    Vue.use(VueAwesomeSwiper)
    
  • nuxt.config.js中的module.exports下添加:

    plugins: [
      { src: '~/plugins/nuxt-swiper-plugin.js', ssr: false }
    ],
    css: [
      'swiper/dist/css/swiper.css'
    ],
    

3 复制项目中使用的静态资源

资料中:前端资料/页面原型/assets下所有的文件复制到对应位置

4 复制课件中layouts/default.vue

5 复制课件中pages/index.vue

4 nuxt路由

  • 固定路由

    • 路径是固定地址,不发生变化

      <router-link to="/course" tag="li" active-class="current">
        <a>课程</a>
      </router-link>
      
    • to属性设置路由跳转地址 /course

      • 在pages里面创建文件夹course
      • 再在course文件夹创建index.vue
  • 动态路由

    • 每次生成路由地址不一样,比如课程详情页面,每个课程id不一样
    • nuxt的动态路由:以下划线开头的vue文件,参数名为下划线后边的文件名

5 首页数据banner显示—初始配置

1 service下创建子模块service_cms

2 创建配置文件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=1234
#返回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/mys/educms/mapper/xml/*.xml
#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

3 创建数据库表,用代码生成器生成代码

crm_banner.sql

6 首页数据banner显示—接口

1 后台对banner管理的接口 crud

controller:BannerAdminController

@RestController
@RequestMapping("/educms/banneradmin")
@CrossOrigin
public class BannerAdminController {
    @Autowired
    private CrmBannerService bannerService;

    // 1 分页查询banner
    @GetMapping("pageBanner/{page}/{limit}")
    public R pageBanner(@PathVariable long page, @PathVariable long limit) {
        Page<CrmBanner> pageBanner = new Page<CrmBanner>(page, limit);
        bannerService.page(pageBanner, null);
        return R.ok().data("items", pageBanner.getRecords()).data("total", pageBanner.getTotal());
    }

    // 2 添加banner
    @PostMapping("addBanner")
    public R addBanner(@RequestBody CrmBanner banner) {
        bannerService.save(banner);
        return R.ok();
    }

    // 根据id查询
    @GetMapping("get/{id}")
    public R get(@PathVariable String id) {
        CrmBanner banner = bannerService.getById(id);
        return R.ok().data("item", banner);
    }

    // 3 修改Banner
    @PostMapping("updateBanner")
    public R updateBanner(@RequestBody CrmBanner banner) {
        bannerService.updateById(banner);
        return R.ok();
    }

    // 4 删除Banner
    @DeleteMapping("deleteBanner/{id}")
    public R deleteBanner(@PathVariable String id) {
        bannerService.removeById(id);
        return R.ok();
    }
}

2 前台对banner显示的接口

controller:BannerFrontController

@RestController
@RequestMapping("/educms/bannerfront")
@CrossOrigin
public class BannerFrontController {
    @Autowired
    private CrmBannerService bannerService;

    // 查询所有banner
    @GetMapping("getAllBanner")
    public R getAllBanner() {
        List<CrmBanner> list = bannerService.selectAllBanner();
        return R.ok().data("list", list);
    }
}

service:

@Service
public class CrmBannerServiceImpl extends ServiceImpl<CrmBannerMapper, CrmBanner> implements CrmBannerService {
    // 查询所有banner
    @Override
    public List<CrmBanner> selectAllBanner() {
        // 根据id进行排序,显示排列之后的前两条记录
        QueryWrapper<CrmBanner> wrapper = new QueryWrapper<>();
        wrapper.orderByDesc("id");
        wrapper.last("limit 2");
        List<CrmBanner> list = baseMapper.selectList(wrapper);
        return list;
    }
}

controller:com.mys.eduservice.controller.front.IndexFrontController

根据id进行降序排列,显示排列之后前8条记录

select * from crm_banner order by id desc limit 8 

查询列表讲师,根据id排序,显示前4条记录

select * from edu_teacher order by id limit 4
@RestController
@RequestMapping("/eduservice/indexfront")
@CrossOrigin
public class IndexFrontController {
    @Autowired
    private EduCourseService courseService;
    @Autowired
    private EduTeacherService teacherService;
    // 查询前8个热门课程,查询前4个名师
    @GetMapping("index")
    public R index() {
        // 查询前8个热门课程
        QueryWrapper<EduCourse> wrapperCourse = new QueryWrapper<>();
        wrapperCourse.orderByDesc("id");
        wrapperCourse.last("limit 8");
        List<EduCourse> listCourse = courseService.list(wrapperCourse);
        // 查询前4个名师
        QueryWrapper<EduTeacher> wrapperTeacher = new QueryWrapper<>();
        wrapperTeacher.orderByDesc("id");
        wrapperTeacher.last("limit 4");
        List<EduTeacher> listTeacher = teacherService.list(wrapperTeacher);
        
        return R.ok().data("listCourse", listCourse).data("listTeacher", listTeacher);
    }
}

7 首页数据banner显示—前端实现

1 前端页面准备工作

  • 使用命令下载axios

    npm install axios@0.19.2

  • 封装axios

    utils/request1.js

    import axios from 'axios'
    // 创建axios实例
    const service = axios.create({
      baseURL: 'http://localhost:9001',
      timeout: 20000
    })
    export default service
    

2 创建api文件夹,在api文件夹创建js文件,定义调用接口路径

api/banner.js

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

3 页面中调用

在index.vue中调用

created() {
  // 调用查询banner
  this.getBannerList()
},
methods: {
  // 查询banner数据
  getBannerList() {
    banner.getBannerList()
      .then(response => {
        this.bannerList = response.data.data.list
      })
  }
}

4 nginx进行访问规则配置

location ~ /educms/ {
	proxy_pass http://localhost:8004;
}

5 启动测试

注意nginx nacos的启动

8 首页数据显示—热门课程和名师

1 api/index.js

import request from '@/utils/request1'
export default {
  // 查询热门课程和名师
  getIndexData() {
    return request({
      url: `/eduservice/indexfront/index`,
      methods: 'get'
    })
  }
}

2 index.vue调用

// 2.查询热门课程和名师
getHotCourseTeacher() {
  index.getIndexData()
    .then(response => {
      this.eduList = response.data.data.listCourse
      this.teacherList = response.data.data.listTeacher
    })
}

9 Redis复习

网站里面哪部分的访问量最大?首页,所以需要对首页数据做缓存

1 特点

  • 基于key-value方式进行

  • 读写速度快

  • 支持多种数据结构:string字符串、list列表、hash哈希、set集合、zset有序集合

  • 支持持久化,通过内存存储,也可以存储到硬盘中

  • 支持过期时间、事务

一般存储什么样的数据?一般来讲,把经常查询、不经常修改的数据放到redis作为缓存

Redis和Memcache的区别

10 首页数据添加Redis缓存

Spring Boot整合Redis,基于spring boot的缓存注解实现

1 创建Redis配置类

  • 引入Spring Boot整合redis相关依赖

    common/pom.xml

    <!-- redis -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
    <!-- spring2.X集成redis所需common-pool2-->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
        <version>2.6.0</version>
    </dependency>
    
  • 创建redis缓存配置类,配置插件

​ com/service_base/RedisConfig.java

Spring Boot缓存注解

  • Cacheable

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

  • CachePut

    一般用在新增方法上

  • CacheEvict

    一般用在修改、删除方法上

    allEntries

2 在查询所有banner的方法上添加缓存注解 @Cacheable

@Cacheable(key = "'selectIndexList'", value = "banner")
@GetMapping("getAllBanner")
public R getAllBanner() {

3 启动Redis服务

虚拟机linux系统上安装redis服务

配置文件:/etc/redis.conf

启动位置:/usr/local/bin

启动:/redis-server /etc/redis.conf

启动成功:edis-cli
127.0.0.1:6379>

查看redis进程:ps -ef | grep redis

关闭:kill -9 xxx(端口号) 或者 redis-cli shutdown

连接redis可能遇到的问题

1、关闭linux防火墙(坑)

需要打开防火墙,开放对应的端口 6379

systemctl start firewalld # 开启防火墙
systemctl status firewalld # 查看防火墙的状态
firewall-cmd --zone=public --add-port=6379/tcp --permanent  # 开放端口 6379
firewall-cmd --reload # 重新加载对应的防火墙策略

2、修改redis配置文件,表示支持远程访问

注释:# bind 127.0.0.1

修改protected-mode no

4 在service-cms配置文件中配置redis地址

# 配置redis
spring.redis.host=xxx
spring.redis.port=6379
#spring.redis.password=123456
spring.redis.database=0
spring.redis.timeout=1800000

spring.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

localhost:3000 vue-front-1010

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PHP 随记】—— Composer 安装及镜像配置

&#x1f449;总目录&#x1f448;\large\colorbox{skyblue}{&#x1f449;总目录&#x1f448;}&#x1f449;总目录&#x1f448;​ 文章目录1、Composer 安装2、配置镜像Composer 是 PHP 用来管理依赖&#xff08;dependency&#xff09;关系的工具&#xff1b;简单来说&…

等级保护介绍

等保流程 等级保护 等保发展历程 。1994 首次国家提出等级保护概念 。1999 针对信息系统保护有法律依据 。2007 等保1.0措施。 。2017 立法了《网络安全法》 。2019年 等保2.0 颁布 等保2.0和1.0有什么特点和区别 1.名称变了信息安全技术信息等级保护要求 改为 信息安全基础网络…

1、测试用例通用模板

一、针对大版本需求的测试用例模板 1、测试用例模板说明 1.1、表头说明 项目版本号V1.0--测试用例&#xff08;示例标题&#xff09;(xxxxx有限公司测试组/ONLY FOR INTERNAL USE ONLY)Confidentiality level 密级(xxxxxx测试组/仅供内部使用) Internal 内部公开 修订记录版…

软件设计(二)

软件设计&#xff08;一&#xff09;https://blog.csdn.net/ke1ying/article/details/128779601 11、windows系统当双击.jpg文件的时候&#xff0c;系统会通过建立的 文件关联 来决定使用什么程序来打开该图像文件。 &#xff08;双击.jpg文件&#xff0c;系统会建立‘window…

【哈希表】leetcode349. 两个数组的交集(C/C++/Java/Python/Js)

leetcode349. 两个数组的交集1 题目2 思路--set2.1 拓展/后记3 代码3.1 C版本3.2 C版本3.3 Java版本3.4 Python 版本3.5 JavaScript版本4 总结1 题目 题源链接 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考…

分享150个ASP源码,总有一款适合您

ASP源码 分享150个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 150个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1DpxbFxdGCl9eWEe3AaD1eA?pwdecqi 提取码&#x…

echarts数据可视化项目搭建(二)

目录主题设置默认主题重点示例自定义主题调色盘主题全局局部颜色渐变可视化图表自适应重点示例实现简单的加载动画重点示例增量动画实现重点示例简单动画配置项关于全局echarts对象和echartsInstance对象echarts.connect()其他echarts实例对象方法本博客内容参考黑马课程&#…

系统编程中的进程的概念No.2

引言&#xff1a; 今天是个好日子&#xff0c;日更动态养成习惯&#xff0c;日更博客你我他&#xff0c;北京时间 2023/1/29/10:09&#xff0c;今天阳光明媚&#xff0c;但是还是很冷&#xff0c;起床时间8:55&#xff0c;可以看出又早了那么一点点&#xff0c;今天为什么能起…

VSCode调试Python文件并指定虚拟环境

记录在使用VSCode调试py文件时遇到的一些问题&#xff1a;1.启用Debug模式进行调试2.调试带参数的python文件3. 调试时指定服务器虚拟环境4. 相对路径出错首先给出VScode 官方调试说明&#xff1a;https://code.visualstudio.com/docs/python/debugging#_set-configuration-opt…

法律常识(六)《最高人民法院婚姻法司法解释精释精解》例子

目录 一、婚约财产&#xff08;彩礼&#xff09;纠纷 二、夫妻共同债务中违法债务的审查认定 三、夫妻之间也可以成立借贷关系 四、一方未经另一方同意出售夫妻共同共有的房屋 五、夫妻一方婚前财产投资所得的归属 六、夫妻间房产赠与协议的效力认定 七、婚内财产分割的…

拉新、留存、转化、提频、裂变

任何一家创业公司从启动到成功&#xff0c;都会把一件事情当作核心&#xff0c;那就是增长。什么是增长&#xff1f;有人说是收入&#xff0c;有人说是利润&#xff0c;还有人说是市场份额&#xff0c;实际上都对&#xff0c;但这些都建立在一个基础要素之上&#xff0c;那就是…

JavaEE day9 初识HTTP2

web开发 web应用 1&#xff1a;n web场景 1&#xff1a;n web资源&#xff08;动态资源或静态资源&#xff09; web资源之间形成一张关联网络 web开发&#xff1a;提供web资源连接web资源 响应状态 web服务器为某次请求给出的结果情况 只有请求HOST&#xff08;主机&am…

七、图像分类模型的部署(Datawhale组队学习)

文章目录前言ONNX简介应用场景部署ImageNet预训练图像分类模型导出ONNX模型推理引擎ONNX Runtime部署-预测单张图像前期准备ONNX Runtime预测推理引擎ONNX Runtime部署-ImageNet预训练图像分类模型预测摄像头实时画面前期准备预测摄像头的一帧画面预测摄像头实时画面部署自己训…

JavaScript的基础知识

目录 一、初识JavaScript 二、JavaScript的基础 1、初步了解 2、代码位置 3、注释 4、变量 ①字符串 ②数组 ③对象 ④条件语句 ⑤函数 三、DOM模块 一、初识JavaScript JavaScript&#xff0c;是一门编程语言。浏览器就是JavaScript语言的解释器。DOM和BOM 相当于编…

Unity功能——宏定义的使用

声明&#xff1a;本文为个人笔记&#xff0c;用于学习研究使用非商用&#xff0c;内容为个人研究及综合整理所得&#xff0c;若有违规&#xff0c;请联系&#xff0c;违规必改。 Unity功能——宏定义的使用 文章目录Unity功能——宏定义的使用一.开发环境二.问题描述三.宏的使用…

拿下大厂Offer的关键——飞滴出行网约车项目全新完结

哈喽各位小伙伴&#xff0c;好久不见吖&#xff01;正月初八&#xff0c;你开工了吗&#xff1f;告别新春的氛围&#xff0c;又开始新一年的奋斗。尤其是年前的离职的小伙伴&#xff0c;马上又是金三银四&#xff0c;你的面试还要准备多久&#xff1f;今天给大家分享一份阿里大…

Leetcode力扣秋招刷题路-0098

从0开始的秋招刷题路&#xff0c;记录下所刷每道题的题解&#xff0c;帮助自己回顾总结 98. 验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。 节点…

[cpp进阶]C++类型转换

文章目录C语言的类型转换为什么C需要四种类型转换C强制类型转换static_castreinterpret_castconst_castdynamic_castexplicitRTTIC语言的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类型与接收…

使用lnmp与wordpress做1个外贸询盘网站

目录 lnmp安装 包安装 mysql元数据库 网路策略确认 iptables确认 mysql允许远程访问 wordpress下载安装 包安装 nginx配置 wordpress配置 初始化 astra&#xff0c;elementor和woocommerce插件 插件安装 模板选择 自定义网页 国内不兴建站&#xff0c;通常只有码…

openstack: nova : reset-state

https://github.com/openstack/python-novaclient 牵扯的两个project是&#xff1a;nova和python-novaclient&#xff1b; 这个命令从代码分析和实际使用上来看只是将nova数据库里的实例的状态更改&#xff1b;没有对实例做实质的操作。 https://docs.openstack.org/nova/pik…