当前位置: 首页 > news >正文

[golang gin框架] 25.Gin 商城项目-配置清除缓存以及前台列表页面数据渲染公共数据

  1. 配置清除缓存

当进入前台首页时,会缓存对应的商品相关数据,这时,如果后台修改了商品的相关数据,缓存中的对应数据并没有随之发生改变,这时就需要需改对应的缓存数据,这里有两种方法:

方法一

在管理后台操作直接清除缓存中的所有数据,当再次访问前台首页时,就会先从数据库中获取数据,然后缓存到redis中,代码如下:

(1).界面

点击 清除缓存 按钮,直接清除缓存驱动中的所有数据

(2).增加 清除缓存 按钮

在templates/admin/main/index.html页面,增加 清除缓存 按钮
<ul class="nav navbar-nav navbar-right"><li><a>欢迎您,{{.username}}</a></li><li><a href="/admin/flushAll">清除缓存</a><li><a href="/admin/loginOut">安全退出</a></li>
</ul>

(3).增加路由

在routers/admin/adminRouter.go中增加 清除缓存 路由
adminRouters.GET("/flushAll", admin.MainController{}.FlushAll)

(4).增加清除缓存方法

在controllers/admin/MainController.go中增加清除缓存的方法
//清除缓存
func (con MainController) FlushAll(c *gin.Context)  {models.RedisCache.FlushAll()con.Success(c, "清除缓存成功", "/admin")
}
在models /redisCache.go中增加清除缓存方法
//清除缓存
func (r RedisCache) FlushAll() {if redisEnable {RedisDb.FlushAll(ctxRedis)}
}

方法二

在管理后台修改商品相关数据时,就去修改对应的缓存数据,代码:略

2.分类页面数据展示

当从首页点击 商品分类,进入商品分类的 商品展示页面时,会存在和首页共同的 公共数据顶部导航、中间导航、左侧分类),那么就可以把公共的代码分离出来,放到 基础控制器(BaseController.go)中,实现 代码的复用;
在商品分类的商品展示页面 展示分类的对应商品,以及 筛选对应分类的商品,和对商品进行 分页操作

1).界面

首页界面
商品分类对应的商品页面: 该页面和首页都有共同的 公共数据顶部导航、中间导航、左侧分类
商品列表

2).代码展示

(1).html

拆分publibc/page_header.html,把中部导航代码单独成一个文件middle_nav.html
index.html中增加 中部导航 代码
创建product/list.html商品页面文件

page_header.html

拆分publibc/page_header.html,把中部导航代码单独成一个文件middle_nav.html
<!-- 相当于给模板定义一个名字, define end 必须成对出现 -->
{{ define "frontend/public/page_header.html" }}<!DOCTYPE html><html><head><meta charset="UTF-8"><meta name="author" content="order by dede58.com"/><title>小米商城</title><link rel="stylesheet" type="text/css" href="/static/frontend/css/style.css"><link rel="stylesheet" href="/static/frontend/css/swiper.min.css"><script src="/static/frontend/js/jquery-1.10.1.js"></script><script src="/static/frontend/js/swiper.min.js"></script><script src="/static/frontend/js/base.js"> </script></head><body><!-- start header 顶部导航 --><header><div class="top center"><div class="left fl"><ul><!--获取长度,并计算,看看是否显示最后的 | 画线-->{{ $temp := .topNavList | len }}{{ $navLen := Sub  $temp 1 }}{{range $key, $value := .topNavList}}<li><a href="{{$value.Link}}"{{if eq $value.IsOpennew 1 }} target="_blank" {{end}} >{{$value.Title}}</a></li>{{if lt $key $navLen}}<li>|</li>{{end}}{{end}}<div class="clear"></div></ul></div><div class="right fr"><div class="gouwuche fr"><a href="">购物车</a></div><div class="fr"><ul><li><a href="./login.html" target="_blank">登录</a></li><li>|</li><li><a href="./register.html" target="_blank" >注册</a></li><li>|</li><li><a href="">消息通知</a></li></ul></div><div class="clear"></div></div><div class="clear"></div></div></header><!--end header -->
{{end}}

list.html

创建product/list.html商品页面文件
{{ define "frontend/public/middle_nav.html" }}<!-- 中间导航start banner_x --><div class="banner_x center"><a href="/" target="_blank"><div class="logo fl"></div></a><div class="nav fl"><ul class="clearfix" id="nav_list"><li class="link-category"><a href="#">全部商品分类</a><div class="banner_y center"><div class="nav"><ul>{{range $key,$value := .goodsCateList}}<li><!--判断点击分类是否跳转到一个新的链接,如果不是,则跳转到对应的分类商品页面-->{{if eq $value.Link ""}}<a href="category{{$value.Id}}" target="_blank">{{$value.Title}}</a>{{else}}<a href="{{$value.Link}}" target="_blank">{{$value.Title}}</a>{{end}}<div class="pop"><ol class="cate_list clear">{{range $k,$v := $value.GoodsCateItems}}<li><div class="xuangou_left">{{if eq $v.Link ""}}<a href="category{{$v.Id}}" target="_blank"class="clearfix"><div class="img fl"><imgsrc="{{$v.CateImg | FormatImg}}"alt="{{$v.Title}}"></div><span class="fl">{{$v.Title}}</span></a>{{else}}<a href="{{$v.Link}}" target="_blank" class="clearfix"><div class="img fl"><imgsrc="{{$v.CateImg | FormatImg}}"alt="{{$v.Title}}"></div><span class="fl">{{$v.Title}}</span></a>{{end}}</div></li>{{end}}</ol></div></li>{{end}}</ul></div></div></li>{{range $key,$value := .middleNavList}}<li><a href="#" target="_blank">{{$value.Title}}</a><ol class="children-list clearfix">{{range $k,$v := $value.GoodsItems}}<li><a href="#"><img src="{{$v.GoodsImg | FormatImg}}" alt="{{$v.Title}}"/><p>{{$v.Price}}元</p></a></li>{{end}}</ol></li>{{end}}</ul></div><div class="search fr"><form action="" method="post"><div class="text fl"><input type="text" class="shuru" placeholder="6&nbsp;MIX现货"></div><div class="submit fl"><input type="submit" class="sousuo" value="搜索"/></div><div class="clear"></div></form><div class="clear"></div></div></div><!-- end banner_x -->
{{end}}

index.html

商品首页增加 中部导航 代码, 因为page_header.html中的中部导航代码没有了,已经封装成middle_nav.html代码了,而首页的商品分类和商品页面的商品分类还有点区别,故不会导入public/middle_nav.html中的代码,所以会直接增加 中部导航 代码
{{ define "frontend/index/index.html" }}{{template "frontend/public/page_header.html" .}}<!-- start banner_x 中部导航 --><div class="banner_x center"><a href="./index.html" target="_blank"><div class="logo fl"></div></a><a href=""><div class="ad_top fl"></div></a><div class="nav fl"><ul class="clearfix" id="nav_list">{{range $key, $value := .middleNavList }}<li><a href="{{$value.Link}}" target="_blank">{{$value.Title}}</a><ol class="children-list clearfix">{{range $k, $v := $value.GoodsItems }}<li><a href="#"><img src="{{$v.GoodsImg | FormatImg }}" /><p>{{$v.Price}}</p></a></li>{{end}}</ol></li>{{end}}</ul></div><div class="search fr"><form action="" method="post"><div class="text fl"><input type="text" class="shuru"  placeholder="小米6&nbsp;小米MIX现货"></div><div class="submit fl"><input type="submit" class="sousuo" value="搜索"/></div><div class="clear"></div></form><div class="clear"></div></div></div><!-- end banner_x --><!-- 商品分类 start banner_y --><div class="banner_y center"><div class="nav"><ul>{{range $key, $value := .goodsCateList }}<li>{{if eq $value.Link ""}}<a href="category{{$value.Id}}" target="_blank">{{$value.Title}}</a>{{else}}<a href="{{$value.Link}}" target="_blank">{{$value.Title}}</a>{{end}}<div class="pop"><ol class="cate_list clear">{{range $k, $v := $value.GoodsCateItems}}<li><div class="xuangou_left">{{if eq $v.Link ""}}<a href="category{{$v.Id}}" target="_blank"class="clearfix"><div class="img fl"><imgsrc="{{$v.CateImg | FormatImg}}"alt="{{$v.Title}}"></div><span class="fl">{{$v.Title}}</span></a>{{else}}<a href="{{$v.Link}}" target="_blank" class="clearfix"><div class="img fl"><imgsrc="{{$v.CateImg | FormatImg}}"alt="{{$v.Title}}"></div><span class="fl">{{$v.Title}}</span></a>{{end}}</div></li>{{end}}</ol></div></li>{{end}}</ul></div><!--轮播图--><div class="swiper-container"><div class="swiper-wrapper">{{range $key, $value := .focusList}}<div class="swiper-slide"><a href="{{$value.Link}}" target="_blank"><img src="{{$value.FocusImg | FormatImg}}" alt="{{$value.Title}}" /></a></div>{{end}}</div><!-- Add Arrows --><div class="swiper-button-next"></div><div class="swiper-button-prev"></div></div></div>    <!-- 商品分类end --><div class="sub_banner center"><div class="sidebar fl"><div class="fl"><a href=""><img src="/static/frontend/image/hjh_01.gif"></a></div><div class="fl"><a href=""><img src="/static/frontend/image/hjh_02.gif"></a></div><div class="fl"><a href=""><img src="/static/frontend/image/hjh_03.gif"></a></div><div class="fl"><a href=""><img src="/static/frontend/image/hjh_04.gif"></a></div><div class="fl"><a href=""><img src="/static/frontend/image/hjh_05.gif"></a></div><div class="fl"><a href=""><img src="/static/frontend/image/hjh_06.gif"></a></div><div class="clear"></div></div><div class="datu fl"><a href=""><img src="/static/frontend/image/hongmi4x.png" alt=""></a></div><div class="datu fl"><a href=""><img src="/static/frontend/image/xiaomi5.jpg" alt=""></a></div><div class="datu fr"><a href=""><img src="/static/frontend/image/pinghengche.jpg" alt=""></a></div><div class="clear"></div></div><!-- end banner --><!-- 手机 --><div class="category_item w"><div class="title center">手机</div><div class="main center"><div class="category_item_left"><img src="static/itying/image/shouji.jpg" alt="手机"></div><div class="category_item_right">{{range $key,$value := .phoneList}}<div class="hot fl"><div class="xinpin"><span style="background:#fff"></span></div><div class="tu"><a href="#"><img src="{{$value.GoodsImg | FormatImg}}"></a></div><div class="miaoshu"><a href="#">{{$value.Title}}</a></div><div class="jiage">{{$value.Price}}元</div><div class="pingjia">372人评价</div><div class="piao"><a href=""><span>{{SubStr $value.SubTitle 0 4}}</span></a></div></div>{{end}}</div></div></div>{{template "frontend/public/page_footer.html" .}}</body>
</html>
{{end}}

(2).增加商品分类页面路由

defaultRouters.GET("/category:id", frontend.ProductController{}.Category)

(3).基础控制器

在基础控制器BaseController.go中创建公共方法: 加载公共模板方法Render()
package frontend//基础控制器import ("github.com/gin-gonic/gin""gorm.io/gorm""goshop/models""net/http""strings"
)type BaseController struct{}/*
加载公共模板方法
tpl string 模板
data map 请求的数据*/
func (con BaseController) Render(c *gin.Context, tpl string, data map[string]interface{}) {//实例化redisCache结构体redisCache := models.RedisCache{}//获取顶部导航列表topNavList := []models.Nav{}//判断redis中是否存在数据if hasTopNavList := redisCache.Get("topNavList", &topNavList); !hasTopNavList {  //不存在数据,则从数据中获取数据,并把数据保存到redismodels.DB.Where("status = 1 AND position = 1").Find(&topNavList)redisCache.Set("topNavList", topNavList, 3600)}//获取分类数据goodsCateList := []models.GoodsCate{}if hasGoodsCateList := redisCache.Get("goodsCateList", &goodsCateList); !hasGoodsCateList {//获取分类列表以及下级分类,并进行排序models.DB.Where("pid = ? AND status = ?", 0, 1).Order("sort DESC").Preload("GoodsCateItems", func(db *gorm.DB) *gorm.DB {return db.Where("goods_cate.status = 1").Order("goods_cate.sort DESC")} ).Find(&goodsCateList)redisCache.Set("goodsCateList", goodsCateList, 3600)}//获取中间导航middleNavList := []models.Nav{}if hasMiddleNavList := redisCache.Get("middleNavList", &middleNavList); !hasMiddleNavList {models.DB.Where("status = ? AND position = ? ", 1, 2).Find(&middleNavList)//循环,获取中间导航对应的商品数据for i:= 0; i < len(middleNavList);i++{//获取管理商品//替换字符串中的中文逗号strings.ReplaceAll()relation := strings.ReplaceAll(middleNavList[i].Relation, ",", ",")//把字符串转换成切片relationIds := strings.Split(relation, ",")//获取对应的商品信息goodsList := []models.Goods{}models.DB.Where("status = ?", 1).Where("id in ?", relationIds).Select("id, title, goods_img, price").Find(&goodsList)middleNavList[i].GoodsItems = goodsList}redisCache.Set("middleNavList", middleNavList, 3600)}renderData := gin.H{"topNavList":    topNavList,"goodsCateList": goodsCateList,"middleNavList": middleNavList,}for key, v := range data {renderData[key] = v}c.HTML(http.StatusOK, tpl, renderData)
}

(4).商品控制器

创建ProductController.go控制器,该控制器与商品相关
package frontend//商品相关import ("github.com/gin-gonic/gin""goshop/models""math"
)type ProductController struct {//extend 基础控制器BaseController
}// 根据商品分类获取分类下面的所有商品数据
func (con ProductController) Category(c *gin.Context) {//获取分类idcateId, _  := models.Int(c.Param("id"))//当前页page, _ := models.Int(c.Query("page"))if page == 0 {page = 1}//每一页显示的数量pageSize := 2//获取当前分类curCate := models.GoodsCate{}models.DB.Where("id = ? ", cateId).Find(&curCate)//判断当前分类是否顶级分类,如果是,则获取对应的二级分类,如果不是,则获取对应的兄弟分类subCate := []models.GoodsCate{}var tempSlice []intif curCate.Pid == 0 {  // 当前分类是顶级分类,获取对应的二级分类models.DB.Where("pid = ?", cateId).Find(&subCate)//把二级分类id放到切片中for i := 0; i < len(subCate); i++ {tempSlice = append(tempSlice, subCate[i].Id)}} else { // 当前分类是二级分类,获取对应的兄弟分类models.DB.Where("pid = ?", curCate.Pid).Find(&subCate)}//把请求的分类id放入切片tempSlice = append(tempSlice, cateId)//通过上面的分类id,获取商品相关数据goodsList := []models.Goods{}where := "cate_id in ?"models.DB.Where(where, tempSlice).Where("status = ?", 1).Offset((page - 1) * pageSize).Limit(pageSize).Find(&goodsList)//获取总数量var count int64models.DB.Where(where, tempSlice).Table("goods").Count(&count)//定义请求的模板tpl := "frontend/product/list.html"con.Render(c, tpl, gin.H{"goodsList": goodsList,  // 商品列表"subCate": subCate, // 选择分类下面的子分类"currentCate": curCate,  // 当前分类"page": page, //当前页码数"totalPages":  math.Ceil(float64(count) / float64(pageSize)), // 总页面数})
}

[上一节][golang gin框架] 24.Gin 商城项目-redis讲解以及操作

相关文章:

[golang gin框架] 25.Gin 商城项目-配置清除缓存以及前台列表页面数据渲染公共数据

配置清除缓存 当进入前台首页时,会缓存对应的商品相关数据,这时,如果后台修改了商品的相关数据,缓存中的对应数据并没有随之发生改变,这时就需要需改对应的缓存数据,这里有两种方法: 方法一 在管理后台操作直接清除缓存中的所有数据,当再次访问前台首页时,就会先从数据库中获取…...

文件夹改名,如何在改名之后批量复制文件夹名称

在日常时候中会遇到给文件夹改名的时候&#xff0c;那么我们又如何在改名之后批量复制文件夹名称&#xff1f;今天就由小编来给大家分享一下操作办法。 首先第一步&#xff0c;我们要进入文件批量改名高手&#xff0c;并在板块栏里选择“文件夹批量改名”板块。 第二步&#xf…...

汇编与内联 x86-64

机器字长 x86是32位系统 64是64位系统 这里的32和64&#xff0c;指的都是机器字长 机器字长是 能直接进行整数/位运算的大小指针的大小(索引内存的范围) 容易与机器字长混淆的概念&#xff1a;字 字 字存储字长 字是MDR寄存器的位数&#xff0c;代表每个主存存储体中的存储…...

OSCP-UT99(IRC、Unreal Tournament 99)

目录 扫描 WEB IRC 提权 扫描 sudo nmap 192.168.142.44 -p- -sS -sV PORT STATE SERVICE VERSION 21/tcp open ftp FileZilla ftpd 80/tcp open http Apache httpd 2.4.16 (OpenSSL/1.0.1p PHP/5.6.12) 44…...

Kubernetes CPU内存资源限定

在 Kubernetes 中创建工作负载时&#xff0c;您可以为 Pod 中的每一个容器指定其所需要的内存&#xff08;RAM&#xff09;大小和 CPU 数量。如果这些信息被指定了&#xff0c;Kubernetes 调度器可以更好的决定将 Pod 调度到哪一个节点。对于容器来说&#xff0c;其所需要的资源…...

fitlog使用教程(持续更新ing...)

诸神缄默不语-个人CSDN博文目录 fitlog包是用于自动版本管理和自动日志记录的Python包&#xff0c;是fastNLP团队开发的。 fitlog 中文文档 — fitlog 文档 我下载的是fitlog 0.9.15版本。 他们团队的文档写的真的不行&#xff0c;崩溃&#xff0c;FastNLP也很难用&#xff0…...

Linux下搭建Go开发环境

Linux下搭建Go开发环境可以按照以下步骤进行&#xff1a; 1、下载最新的Go语言二进制包&#xff0c;可以从官网 https://golang.org/dl/ 下载。 2、将下载好的包解压缩到你想要安装的目录下&#xff0c;如 /usr/local/go。 3、添加环境变量&#xff0c;在终端中输入以下命令…...

一文搞懂SQL注入攻击

SQL注入攻击 1. 前言2. SQL注入简介3. SQL注入步骤4. 防范SQL注入 1. 前言 随着互联网的发展和普及&#xff0c;网络安全问题越来越突出&#xff0c;网络在为用户提供越来越多服务的同时&#xff0c;也要面对各类越来越复杂的恶意攻击。SQL注入&#xff08;SQL Injection&…...

CCTV-TIME特别关注:首届医药港国际健康美食文化嘉年华

“食在广州 味在方舟”首届医药港国际健康美食文化嘉年华4月28日在健康方舟盛大开幕! 【央媒时代TOP中国时代周刊中国品牌万里行CCTV-TIME特别关注】健康美食、滋补靓汤、异国风情、非遗文化、治愈萌宠、灯光夜市、亲子玩乐、浪漫许愿树……五一长假,广州的这场精彩嘉年华活动…...

FE_TA不知道的CSS 换行系列【1】white-space

在W3C官方描述中&#xff0c;white-space主要有以下两个作用&#xff1a; 是否进行空格合并&#xff0c;以及控制空格合并的方式&#xff1b;是否在soft wrap opportunities&#xff08;文本中可进行换行的断点位置&#xff09;处进行文本换行。 从字面意思来看white-space即…...

matlab中计算标准差std函数

标准差 标准差&#xff08;Standard Deviation&#xff09;是离均差平方的算术平均数&#xff08;即&#xff1a;方差&#xff09;的算术平方根。 标准差是方差的算术平方根。标准差能反映一个数据集的离散程度。平均数相同的两组数据&#xff0c;标准差未必相同。 计算公式&…...

【操作系统】原语操作详解

基本概念 "原语"一词源于英文 “primitive” 或 “instruction”&#xff0c;意为 “原始的” 或 “基本的指令”。在计算机科学中&#xff0c;原语是一种基本的操作&#xff0c;它是不可分割的&#xff0c;要么全部执行成功&#xff0c;要么全部执行失败&#xff0…...

mongDB的相关查询插入操作

db.getCollection(“ProductBuriedPointPo”).find();–查询 db.getCollection(“ProductBuriedPointPo”).remove({“_id”: ObjectId(“61e8f4c3bdc4381042acd296”)})–删除 db.getCollection(“ProductBuriedPointPo”).insert( { _id: ObjectId(“61e8f4c3bdc4381042acd2…...

【C++初阶】C++入门(二):引用内联函数auto关键字范围for循环(C++11)指针空值nullptr

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C初阶 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【C初阶】…...

地下污水厂智能照明控制应用

摘要:结合某地下污水厂项目&#xff0c;从结构、系统组成、系统功能、控制要求、场景模式等方面介绍了地下污水厂智能照明控制系统&#xff0c;探索了一套适用于地下污水厂的智能照明控制策略&#xff0c;以确保地下污水厂正常运行的照明需求。 关键词:智能照明控制系统;地下污…...

IS220UCSAH1A利用电子和空穴两种载流子导电的,所以叫做双极型电路

IS220UCSAH1A利用电子和空穴两种载流子导电的&#xff0c;所以叫做双极型电路 美国的通用电气公司&#xff08;General Electric Company&#xff0c;以下简称 GE&#xff09;想要称霸整个工业互联网&#xff0c;但却失败了。为什么呢&#xff1f; 多年来&#xff0c;GE 一直在…...

干货|英国专利申请

英国是世界上公认的一个实施现代专利制度的国家。英国1624年颁布的《垄断法案》被认为是世界上一部具有现代意义的专利法&#xff0c;并成为现代专利保护制度系的起点。英国现行的专利法于1977年颁布&#xff0c;并于1978年生效。英国的专利制度在保护发明创造&#xff0c;促进…...

springboot文件上传

1.新建文件上传页面 在static目录中新建upload-test.html&#xff0c;上传页面代码如下所示&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>springboot文件上传测试</title> <…...

天龙八部手游服务端架设搭建教程

天龙八部手游服务端架设搭建教程 大家好&#xff0c;我是艾西。最近更新游戏搭建教程比较少也被不少小伙伴催更&#xff0c;今天我和大家聊聊天龙八部手游服务端架设搭建。 游戏讲述元佑元年&#xff0c;大宋遭受辽国入侵的故事&#xff0c;玩家可扮演峨眉、丐帮、天山、逍遥、…...

Windows 服务监控工具

在任何企业中&#xff0c;Windows 服务都是面向业务的应用程序的核心组件。这些 Windows 服务的有效运行对于防止网络和应用程序停机至关重要。这使得 Windows 服务监视成为任何网络管理策略的关键部分。 Windows 服务监视使管理员能够确保关键 Windows 服务的可用性&#xff…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库&#xff0c;基于 mysql 库改进而来&#xff0c;具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点&#xff1a; 支持 Promise / async-await&#xf…...