vue3实现商城系统详情页(前端实现)
目录
写在前面
预览
实现
图片部分
详情部分
代码
源码地址
总结
写在前面
笔者不是上一个月毕业了么?找工作没找到,准备在家躺平两个月。正好整理一下当时的毕业设计,是一个商城系统。还是写篇文章记录下吧
预览
商品图片切换显示
sku规格切换
文章主要描述左侧图片组件,右侧sku的切换实现
在阅读本篇文章之前,你需要了解的是SPU和SKU是什么。
实现
图片部分
图片部分组件代码
<template><div><div style="display: flex;justify-content: center"><!-- 大图--><el-image :src="$img+showBigImg" style="width: 400px; height: 400px"><template #error><div class="image-slot"><el-icon><icon-picture/></el-icon></div></template></el-image></div><!-- 小图--><div style="display: flex;justify-content: space-between;margin-top: 20px"><el-icon style="width: 50px;height: 50px" @click="last"><ArrowLeftBold/></el-icon><div style="display: flex;justify-content: center;"><div v-for="item in showList" :key="item" :class="item===showBigImg ? 'is_show' : 'not_show' "@mouseover="show(item)" @click="show(item)" style="margin-left: 20px"><el-image :src="$img+item" fit="fill" style="width: 50px;height: 50px"/></div></div><el-icon @click="next" style="width: 50px;height: 50px"><ArrowRightBold/></el-icon></div></div>
</template>
<script setup>
import {ref, defineProps, watch,} from 'vue'let props = defineProps({imgList: {type: Array,default: () => []}
})
let showBigImg = ref(props.imgList[0])//页面初始化的时候显示第一个图片
let pageNum = ref(0)//当前展示图片处于多少页
let showList = ref(props.imgList.slice(0, 4))//初始化只展示前四个function show(big) {showBigImg.value = big
}
//下一页
function last() {
// 通过判断showBigImg的值来判断当前处于元素if (Array.isArray(showList.value)) {//查找索引,判断是否是最后一个元素(注意此处是原数组)if (pageNum.value === 0) {return}pageNum.value--} else {console.log("不是数组类型")}
}
//上一页
function next() {if (Array.isArray(props.imgList)) {//计算最大的页码,向上取整let mixPage = Math.ceil(props.imgList.length / 4);if ((pageNum.value + 1) === mixPage) {//如果是最后一页,则不能翻页return}//如果不是最后一页,则翻页pageNum.value++} else {console.log("不是数组类型")}
}
watch(() => props.imgList, () => {//监听父组件传递数据的变化,修改展示的数据showBigImg.value=props.imgList[0]showList.value = props.imgList.slice(0, 4)
})
watch(pageNum, () => {
// 监听pageNum的值变换,修改showList的显示数据showList.value = props.imgList.slice(pageNum.value * 4, (pageNum.value + 1) * 4)showBigImg.value = showList.value[0]
})
</script><style scoped>
.not_show {width: 50px;height: 50px;border: 1px;
}.is_show {width: 50px;height: 50px;border: solid 3px #098CC0;
}
</style>
注:
- 父组件需要控制这个图片组件的渲染时机,最好保证图片数据获取到了之后再加载组件。虽然,子组件已经监听了prop的数据,但是为了避免问题,还是尽量数据获取之后再加载组件
- 需要监听父组件传递的图片路径数据变化,当sku变化的时候,父组件会传递的图片路径也会变化。
详情部分
详情部分思路比较多,我之前周实训也是写的商城,那个时候的思路是页面显示SKU的属性名称。每点击一个SKU销售属性值,就将当前选中的SKU销售属性值发送给后端,然后后端去数据库中查找哪个SKU具有这两个属性值(后端计算)。然后再返回这个sku的信息。当时是以SPU为主。即首页展示的商品信息都是SPU。点击SPU后获取这个SPU下的所有SKU的属性组合,并随机获取一个SKU的信息用于初始展示。(如果读者想了解我之前的写法的话,请回复评论,我可以去找找,毕竟有将近两年了)
这次参考谷粒商城的方式后,采用的是以SKU为主,即首页展示的商品列表都是SKU。点击一个SKU后查询SPU的所有SKU属性值。当用户点击属性时,然后前端需要计算当前选中的是哪一个sku,然后再请求后端获取数据
代码
老样子先粘代码,再解读
<template><div><el-skeleton :loading="loading" animated><template #default><div class="detail_sku_box"><el-row :gutter="20">
<!-- 左侧商品图部分--><el-col :span="8" :offset="1"><img-list :imgList="imgUrlList" v-if="showImg"></img-list></el-col>
<!-- 右侧SKU信息以及销售属性部分--><el-col :span="14"><div><h2>{{ skuItemInfo?.skuInfo?.skuTitle }}</h2><h5>{{ skuItemInfo?.skuInfo?.skuSubtitle }}</h5><div><span class="price_class">¥{{ skuItemInfo?.skuInfo?.price }}</span></div><div style="margin-top: 20px"><div v-for="item in skuItemInfo?.skuItemSaleAttrVos" :key="item.id"><el-row :gutter="20"><el-col :span="3">{{ item.attrName }}</el-col><el-col :span="4" v-for="(valueItem,i) in item.attValues" :key="i"><button:class="valueItem?.skuIds.indexOf(skuItemInfo.skuInfo?.id)!=-1 ? 'skuValue_act_class' : 'skuValue_inc_class'"@click="selectItem(item,valueItem.skuIds)">{{ valueItem.attrValue }}</button></el-col></el-row><hr></div></div><div style="margin-top: 50px">库存:{{ skuItemInfo.skuStock }}</div><div style="margin-top: 50px"><el-input-number v-model="num"/></div><div style="margin-top: 50px"><button class="button button2" @click="addCart"><span>加入购物车</span></button><button class="button button2" @click="toConfirmOrder"><span>立即购买</span></button><button class="button button2" @click="goToCustomerService"><span>联系客服</span></button></div></div></el-col></el-row></div>
<!-- 下侧SPU、规格、售后、评价部分--><div class="msg_box"><div><el-row><el-col :span="4" :class=" showComponentData==0 ? 'active_class': 'no_active'"><span@click="showComponents(0)">商品介绍</span></el-col><el-col :span="4" :class=" showComponentData==1 ? 'active_class': 'no_active'"><span@click="showComponents(1)">规格与包装</span></el-col><el-col :span="4" :class=" showComponentData==2 ? 'active_class': 'no_active'"><span@click="showComponents(2)">售后保障</span></el-col><el-col :span="4" :class=" showComponentData==3 ? 'active_class': 'no_active'"><span@click="showComponents(3)">商品评价</span></el-col></el-row><hr></div></div><div style="padding-left: 100px;"><!-- 商品介绍--><spu-describesv-if="showComponentData==0":descImgUrl="spuDescImgUrl" :descInfo="skuItemInfo"></spu-describes><!-- 规格与包装--><spu-specification:group-data="skuItemInfo.groupAttrs"v-else-if="showComponentData==1"></spu-specification>
<!-- 商品评价--><div v-else-if="showComponentData===2"><div><el-image :src="require('@/assets/shouhou.jpg')"></el-image></div></div><appraise-list :skuId="skuItemInfo.skuInfo.id" v-else-if="showComponentData===3"/></div></template><!-- 骨架屏内容--><template #template><div style="height: 100%"><el-row :gutter="20"><el-col :span="7" :offset="1"><el-skeleton-item variant="image" style="height: 500px"/></el-col><el-col :span="13" :offset="1"><div><el-skeleton-item variant="text" style="width: 100%;height: 40px"/><el-skeleton-item variant="text" style="width: 100%;height: 40px;margin-top: 20px"/><div style="margin-top: 30px"><span class="price_class"><el-skeleton-item variant="text" style="height: 30px;width: 80%"/></span></div><div style="margin-top: 150px"><div v-for="item in 2" :key="item"><el-row :gutter="20"><el-col :span="3"><el-skeleton-item variant="text" style="height: 30px"/></el-col><el-col :span="3" v-for="(i) in 3" :key="i"><el-skeleton-item variant="text" style="height: 30px"/></el-col></el-row></div></div></div></el-col></el-row></div></template></el-skeleton></div>
</template><script setup>
import SpuDescribes from '@/components/commodity/SpuDescribes'
import SpuSpecification from '@/components/commodity/SpuSpecification'
import AppraiseList from '@/components/commodity/AppraiseList'
import {ref, onMounted,} from "vue";
import {useRoute, useRouter} from "vue-router";
import {getSkuItemApi,} from "@/api/goods";
import ImgList from "@/components/commodity/ImgList";
import {addCartApi} from '@/api/cart'
import {ElMessage, ElMessageBox} from 'element-plus'let loading = ref(true)
const route = useRoute()
const router = useRouter()
let imgUrlList = ref([])
let skuItemInfo = ref({})
let spuDescImgUrl = ref()
let showComponentData = ref(-1)//由于子组件需要父组件传递数据,需要确保父组件数据准备好了再加载子组件
let num = ref(1)
let showImg = ref(false)onMounted(() => {if (route.query.skuId) {getSkuItem(route.query.skuId)}setTimeout(() => {loading.value = false}, 1000)
})function getSkuItem(skuId) {getSkuItemApi(skuId).then(res => {skuItemInfo.value = res.dataskuItemInfo.value?.skuItemSaleAttrVos.forEach(attr => {attr.attValues.forEach(item => {if (item.skuIds.indexOf(skuItemInfo.value.skuInfo.id) != -1) {attr.selectSkuList = [...item.skuIds]//赋值,但是不引用地址值}})})/*获取图片路径*/let imgIds = res.data.skuImags.map(item => {return item.imgId})imgUrlList.value = [...imgIds]showImg.value = true}).then(() => {showComponentData.value = 0//父组件数据已经准备妥当,加载子组件})
}/*** 添加到购物车*/
function addCart() {addCartApi(skuItemInfo.value.skuInfo?.id, num.value)/*TODO 是否需要跳转购物车列表*/
}function toConfirmOrder() {if (skuItemInfo.value.skuStock - num.value < 0) {return ElMessage({message: "库存不足", type: 'error'})}//前往确认订单页面,传递参数:选择的skuid,购买的件数let data = {skuId: skuItemInfo.value.skuInfo.id,//选择的skubuyNumber: num.value//购买的件数}router.push({path: '/order-confirm',query: {data: JSON.stringify([data])}})
}function selectItem(selectGroup, skuIds) {/*先保存当前选中元素的skuIds数组,然后计算*/selectGroup.selectSkuList = skuIds/*遍历所有的分组,获取选中的skuid,然后计算出交集*/let arr = skuItemInfo.value?.skuItemSaleAttrVos.map(item => {return item.selectSkuList})//得出当前的skuIdlet findSkuId = findIntersection(arr)getSkuItem(findSkuId)//修改路由上的query值router.push({query:{skuId:findSkuId}})
}/*** 获取传入的数组中的交集的值* @param arrays* @returns {null}*/
function findIntersection(arrays) {// 创建一个 Set 对象来存储所有数组中的唯一元素let set = new Set();// 遍历每个数组,将其中的元素添加到 Set 对象中for (let array of arrays) {for (let element of array) {set.add(element);}}// 找到交集元素,即唯一存在于所有数组中的元素let intersection = null;for (let element of set) {if (arrays.every(array => array.includes(element))) {intersection = element;break;}}return intersection;
}function goToCustomerService() {ElMessageBox.alert('功能还未实现', '警告', {confirmButtonText: '确定',})
}function showComponents(v) {showComponentData.value = v
}
</script><style scoped>
.price_class {font-size: 30px;color: red;
}.active_class {color: #288FC7;
}.msg_box {margin-top: 200px;padding-left: 100px;
}.detail_sku_box {height: 400px;/*background-color: #99a9bf;*/
}
.skuValue_act_class {background-color: #098CC0;/*color: red;*/
}
.no_active:hover{color: red;
}
.cart_btn_msg {color: white;
}.button {width: 150px;height: 50px;background-color: #288FC7;border: none;color: white;padding: 15px 32px;text-align: center;text-decoration: none;display: inline-block;font-size: 16px;margin: 4px 2px;cursor: pointer;-webkit-transition-duration: 0.4s;transition-duration: 0.4s;
}.button2:hover {box-shadow: 0 12px 16px 0 rgba(0, 0, 0, 0.24), 0 17px 50px 0 rgba(0, 0, 0, 0.19);background-color: #1DAEEE;color: red;
}
</style>
下面是后端响应的VO模型
将SKU的销售属性值组合封装起来
这个方式后端要轻松一点。后端只需要获取获取前端传递的skuId返回这个VO即可。
前端就比较麻烦了,需要在点击不同的销售属性值时,计算出这个组合的SKU是哪一个。
我们来看一下
当页面点击一个属性值的时候,怎么才能计算出他的SKU?这个还是有一定难度的,因为这个
是一个不固定长度的数组,有可能是一个,有可能是两个,有可能是三个、四个都有可能。虽然大多数情况只有两个,比如说手机就有两个:颜色,版本。假设再添加几个属性(分期、保修服务)就更多了。你可能问这有什么关系呢?计算sku需要用到吗?
别急,我们先看看这个销售属性值下面的skuIds是什么:他表示的是当前的属性值哪几个SKU具有!也就是说我们在计算sku的时候用的就是他来计算的!
当页面点击属性值的同时就能获取到这个skuIds值了,然后将其存起来。以供计算
比如当前只有两个属性,那么就会有两个skuIds数组。很简单,我们只需要计算这两个skuIds数组元素的交集即可。如果有三个属性,那么就会有三个skuIds数组,计算他们的交集。听起来很简单?我当时想了一会,没弄出来,最后丢给文心一言实现了(文心一言都错了三四次哈哈)。代码如下
说实话我现在也没懂,对算法这一块还处于文盲状态。不过能实现就行!
源码地址
毕业设计:轻松购: 使用vue3+springboot构建的商城系统,集前台用户和后台管理于一体,本项目已经部署在云服务器上, 访问地址: 前台系统:123.207.205.51 后台系统:123.207.205.51:8080 (gitee.com)[这里是图片009]https://gitee.com/zfb12345/my-graduation-project
总结
sku计算那里,是这个详情页面唯一的难点,其他的部分我就不多说了。如果读者觉得有哪些部分不全,或者想要了解其他部分,随时评论。
相关文章:
vue3实现商城系统详情页(前端实现)
目录 写在前面 预览 实现 图片部分 详情部分 代码 源码地址 总结 写在前面 笔者不是上一个月毕业了么?找工作没找到,准备在家躺平两个月。正好整理一下当时的毕业设计,是一个商城系统。还是写篇文章记录下吧 预览 商品图片切换显示…...
[Pro Git#4] 标签 | 理解 | 创建 | push
目录 一、理解标签 二、创建标签 三、操作标签 一、理解标签 标签定义:在Git中,标签(tag)是对某次提交(commit)的一个标识,相当于起了一个别名。应用场景示例: 在项目发布某个版…...
在M系列芯片的Mac上使用Uniapp开发的依赖安装指南
在M系列芯片的Mac上使用Uniapp开发的依赖安装指南 在基于M系列芯片(例如M3、M4)的Mac上进行Uniapp开发时,使用esbuild和rollup等依赖包时需要注意处理不同架构的支持。具体问题出现在darwin-arm64(ARM架构)和darwin-x…...
delve调试环境搭建—golang
原文地址:delve调试环境搭建—golang – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 由于平时不用 IDE 开发环境,习惯在 linux终端vim 环境下开发,所以找了golang的调试工具,delve类似gdb的调试界…...
暂停一下,给Next.js项目配置一下ESLint(Next+tailwind项目)
前提 之前开自己的GitHub项目,想着不是团队项目,偷懒没有配置eslint,后面发现还是不行。eslint的存在可以帮助我们规范代码格式,同时 ctrl s保存立即调整代码格式是真的很爽。 除此之外,团队使用eslint也是好处颇多…...
vscode 使用说明
文章目录 1、文档2、技巧显示与搜索宏定义和包含头文件 3、插件4、智能编写5、VSCode 与 C(1)安装(2)调试(a)使用 CMake 进行跨平台编译与调试(b)launch.json(cÿ…...
单片机:实现蜂鸣器数码管的显示(附带源码)
单片机实现蜂鸣器数码管显示 蜂鸣器和数码管在嵌入式系统中广泛应用。蜂鸣器可以发出声音警告或提示,而数码管则用于显示数字或字母。在本项目中,我们将通过8051单片机实现一个控制蜂鸣器和数码管显示的系统,结合使用蜂鸣器和数码管…...
Next.js v15-基于NextAuth进行身份验证
NextAuth.js 抽象化了管理会话、登录和注销以及身份验证的其他方面所涉及的大部分复杂性操作。虽然您可以手动实现这些功能,但该过程可能非常耗时且容易出错。NextAuth.js简化了流程,为 Next.js 应用程序中的身份验证提供了统一的解决方案。 步骤 通过…...
解锁Vue组件的奇妙世界
文章目录 一、Vue 组件概述(一)什么是 Vue 组件(二)Vue 组件的优点 二、Vue 组件的创建方式(一)全局注册(二)局部注册(三)单文件组件(SFC…...
二分查找【Lecode_HOT100】
文章目录 1.搜索插入位置No.352.搜索二维矩阵No.743.在排序数组中查找元素的第一个和最后一个位置No.344.搜索旋转排序数组No.335.寻找旋转排序数组中的最小值No.153 1.搜索插入位置No.35 class Solution {public int searchInsert(int[] nums, int target) {int l 0;int r n…...
解决git clone时报错“authentication failed for huggingface repository”
问题1: 已经获取了模型的授权,但是git clone时,弹出弹窗 输入huggingface的用户名和密码后,报错如下 解决方式1: 阅读红框标注的说明,“password authentication in git is no longer supported.”&#…...
力扣-图论-16【算法学习day.66】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…...
【异常】GL-SFT1200路由器中继模式,TL-CPE1300D无法搜寻5G网问题分析
【异常】GL-SFT1200路由器中继模式,TL-CPE1300D无法搜寻5G网问题 情况实验结论情况 在用GL-SFT1200路由器切换中继模式时,由于web密码忘却,需要重置,但根据官网使用手册,或者对应的中文版手册,重置失败。通过跟商家联系,进行uboot刷机,提供了指导文档,尝试后刷机成功…...
LeetCode 热题 100_K 个一组翻转链表(31_25_困难_C++)(四指针法)
LeetCode 热题 100_K 个一组翻转链表(31_25) 题目描述:输入输出样例:题解:解题思路:思路一(四指针法): 代码实现代码实现(思路一(四指针法&#x…...
【LeetCode】35.搜索插入位置
目录 LeetCode35.搜索插入位置题解解题思路code1 暴力解法2 二分查找什么是二分查找?二分查找的原理二分查找图解二分查找的优缺点……更新中 LeetCode35.搜索插入位置题解 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如…...
拿到小米 Offer,却迷茫了。。
大家好,我是程序员鱼皮,12 月了,很多小伙伴也拿到了秋招的 Offer(没拿到也不要灰心),但即使拿到 Offer,可能还会有一些其他的顾虑。今天分享我们编程导航一位鱼友的提问,给大家作为学…...
redis集群 服务器更换ip,怎么办,怎么更换redis集群的ip
redis集群 服务器更换ip,怎么办,怎么更换redis集群的ip 1、安装redis三主三从集群2、正常状态的redis集群3、更改redis集群服务器的ip 重启服务器 集群会down4、更改redis集群服务器的ip 重启服务器 集群down的原因5、更改redis集群服务器的ip后…...
运行 Mongodb Server
如何使用 mongod 命令通过配置文件启动 MongoDB Server 适用于通过 Homebrew 安装的 MongoDB Server 如果您的 MongoDB Server 是通过 Homebrew 安装的,则安装过程中会自动创建必要的文件夹和配置文件(如 mongod.conf)。您可以直接使用以下…...
“年轻科技旗舰”爱玛A7 Plus正式发布,全国售价4999元
12月18日,备受行业瞩目的“A7上场 一路超神”爱玛旗舰新品发布会在爱玛台州智造工厂盛大举行。 作为年末“压轴产品”的“两轮豪华轿跑”爱玛A7Plus重磅上场,以“快、稳、帅、炫、智、爽”六大超神技惊艳四座,不仅践行了爱玛科技的精品战略&…...
深入探索 C++ 编程技巧:从案例中学习高效实践
深入探索 C 编程技巧:从案例中学习高效实践 C 是一门功能强大且灵活的编程语言,被广泛应用于系统开发、高性能计算、游戏引擎等领域。然而,初学者和有经验的开发者常常会在代码优化、设计模式和语言特性中面临挑战。这篇文章将通过实际案例&…...
鸿蒙操作系统简介
华为鸿蒙系统(HUAWEI HarmonyOS),是华为公司于2019年8月9日在东莞举行的华为开发者大会(HDC.2019)上正式发布的面向全场景的分布式操作系统,可以创造一个超级虚拟终端互联的世界,将人、设备、场…...
LabVIEW起落架震台检测
在现代飞机制造与维护过程中,起落架的性能测试是保障飞机安全的重要环节。通过LabVIEW开发的起落架小落震台检测系统,通过模拟飞机着陆过程,准确捕捉起落架在着陆时承受的各种动力学特性和应力响应,有效提升起落架设计的精度与可靠…...
git remote -v(--verbose)显示你的 Git 仓库配置的远程仓库的详细信息
git remote -v 是一个 Git 命令,用于显示你的 Git 仓库配置的远程仓库的详细信息。 当你执行 git remote -v 命令时,你会看到类似以下的输出: origin https://github.com/your-username/your-repo.git (fetch) origin https://github.com…...
Java基础知识(四) -- 面向对象(中)
1.包 1.3.1 包的作用 (1)可以避免类重名:有了包之后,类的全名称就变为:包.类名【便于使用】(2)分类组织管理众多的类【便于管理类】(3)可以控制某些类型或成员的可见范…...
RAG开发中,如何用Milvus 2.5 BM25算法实现混合搜索
01. 背景 混合搜索(Hybrid Search)作为RAG应用中Retrieve重要的一环,通常指的是将向量搜索与基于关键词的搜索(全文检索)相结合,并使用RRF算法合并、并重排两种不同检索的结果,最终来提高数据的召回率。全文检索与语义…...
RadiAnt DICOM - 基本主题 :从 PACS 服务器打开研究
正版序列号获取:https://r-g.io/42ZopE RadiAnt DICOM Viewer PACS 客户端功能允许您从 PACS 主机(图片存档和通信系统)搜索和下载研究。 在开始之前,您需要确保您的 PACS 服务器和 RadiAnt 已正确配置。有关配置说明,…...
使用 CFD 加强水资源管理:全面概述
探索 CFD(计算流体动力学)在增强保护人类健康的土木和水利工程实践方面的重大贡献。 挑战 水资源管理是指规划、开发、分配和管理水资源最佳利用的做法。它包括广泛的活动,旨在确保水得到有效和可持续的利用,以满足各种需求&…...
AMS1117芯片驱动电路·降压芯片的驱动电路详解
编写不易,仅供学习,请勿搬运,感谢理解 AMS1117常见封装 很常用的一种LDO降压芯片,LDO(Low Dropout Regulator)降压芯片是线性稳压器,这种IC因为内部集成的不是开关电路,只能将输入与输出的电压差值通过内部…...
贪心算法 part01
class Solution { public:int maxSubArray(vector<int>& nums) {int result INT32_MIN;int count 0;for (int i 0; i < nums.size(); i) {count nums[i];if (count > result) { // 取区间累计的最大值(相当于不断确定最大子序终止位置ÿ…...
新能源汽车充电需求攀升,智慧移动充电服务有哪些实际应用场景?
在新能源汽车行业迅猛发展的今天,智慧充电桩作为支持这一变革的关键基础设施,正在多个实际应用场景中发挥着重要作用。从公共停车场到高速公路服务区,从企业园区到住宅小区,智慧充电桩不仅提供了便捷的充电服务,还通过…...
随机森林算法原理
随机森林算法原理 算法流程随机森林的生成随机森林的预测 算法总结随机森林的优点随机森林的缺点 算法流程 随机森林的生成 输入训练数据 D,样本个数为 m ,待学习的决策树数量为 T。 对于 t 1,2,…,T,从 D 中有放回地采样 m 次,…...
java中sha256和md5某个字符串实例代码
在Java中,可以使用 java.security.MessageDigest 类来计算字符串的 SHA-256 和 MD5 哈希值。以下是如何为给定的字符串生成这两种哈希值的实例代码。 生成SHA-256和MD5哈希值的示例代码 Java 深色版本 import java.security.MessageDigest; import java.security.N…...
thinkphp8自带分页bootstrap
tp8引用的是bootstrap3.4.1这个版本; 前端结构: <ul class"pagination"><li><a href"/index.php?page4"></a></li><li><a href"/index.php?page1">1</a></li>…...
C++算法第九天
本篇文章我们继续学习c算法 目录 第一题 题目链接 题目展示 代码原理 暴力解法 二分解法 代码编写 第二题 题目链接 题目展示 代码原理 代码编写 重点回顾 朴素二分 非朴素二分 重点一 重点二 重点三 第一题 题目链接 153. 寻找旋转排序数组中的最小值 - 力…...
ASRPRO学习笔记一之语音模型位置和语音替换
一、语音替换的步骤 1、扬声器录音 打开GoldWave,点击工具栏中的蓝色控制属性按钮,点击设备,选择扬声器,点击ok。打开电脑上的网易云音乐,点击红色的录制按钮,开始录制音乐,在网易云音乐上点击播放音乐,录…...
QT编译opencv
一.QT5.12编译 1.QT环境 QT5.12 Qt Creator 12.0.2 2.OpenCV文件 因为QT5.12版本qt最后支持到2021.12月,所以这里选择的opencv版本为2021.4月发布的opencv-3.4.16版本 官网下载地址:https://opencv.org/releases/ 最新版本:opencv-3.4.16.…...
[笔记]关于Qt的nativeEvent事件无法接收window消息的Bug
1.nativeEvent事件无法接收window消息 此处不是nativeEvent不能接收,是possmessage一定要写对发送的软件名称,这个名称在Qt中是主界面类的名称,就是主界面UI的名称,而不是rc文件中定义的名称。 所以在FindWindow函数获取目标窗口…...
基于深度学习的猫狗识别系统【深度学习课设】
🏆 作者简介:席万里 ⚡ 个人网站:https://dahua.bloggo.chat/ ✍️ 一名后端开发小趴菜,同时略懂Vue与React前端技术,也了解一点微信小程序开发。 🍻 对计算机充满兴趣,愿意并且希望学习更多的技…...
Java性能调优 - JVM性能监测及调优
JVM 内存模型概述 堆 堆是JVM内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由From Survivor和To Su…...
[代码随想录21二叉树]二叉树的修改和改造,修剪二叉树,将有序数组转为二叉搜索树
前言 二叉树章节最后的题目了,就是对搜索二叉树的改造, 题目链接 669. 修剪二叉搜索树 - 力扣(LeetCode) 108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode) 一、修剪二叉搜索树 思路:等会…...
C# OpenCV机器视觉:图像平滑
在一个寒冷的冬日,阿强窝在家里的沙发上,裹着厚厚的毛毯,手里捧着一杯热巧克力。他的朋友们约他一起去滑雪,但阿强却更喜欢待在温暖的家中,享受这份宁静。突然,他的手机响了,是朋友们发来的滑雪…...
Dubbo 3.x源码(26)—Dubbo服务引用源码(9)应用级服务发现订阅refreshServiceDiscoveryInvoker
基于Dubbo 3.1,详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了MigrationRuleHandler这个处理器,它用于通过动态更改规则来控制迁移行为。MigrationRuleListener的onrefer方法是Dubbo2.x 接口级服务发现与Dubbo3.x应用级服务发现之间迁移的关键…...
java client http请求 返回数据 实时循环监听 url 中资源是否生成
1、php 中 执行 exec 调用操作系统 命令行 执行 以下 java 代码 生成 的jar 2、php 执行命令是 以上1 需要命令行 输入 参数 taskid 3、实现实时监听 MP3 url 是否生成 4、 package com.example.filedemo.controller;import java.io.BufferedReader; import java.io.InputStre…...
ONES 功能上新|ONES Copilot、ONES Wiki 新功能一览
ONES Copilot 可基于工作项的标题、描述、属性信息,对工作项产生的动态和评论生成总结。 针对不同类型的工作项,总结输出的内容有对应的侧重点。 应用场景: 在一些流程步骤复杂、上下游参与成员角色丰富的场景中,工作项动态往往会…...
【自适应】postcss-pxtorem适配Web端页面
在进行页面开发时,自适应设计是一个关键的考虑因素。为了实现这一点,postcss-pxtorem是一个非常有用的工具,它可以将CSS中的px单位转换为rem单位,从而实现基于根元素字体大小的自适应布局。下面介绍一下在项目中如何引入并配置pos…...
BOE(京东方)“向新2025”年终媒体智享会首站落地上海 六大维度创新开启产业发展新篇章
12月17日,BOE(京东方)以“向新2025”为主题的年终媒体智享会在上海启动。正值BOE(京东方)新三十年的开局之年,活动全面回顾了2024年BOE(京东方)在各领域所取得的领先成果,深度解读了六大维度的“向新”发展格局,同时详细剖析了BOE(京东方)在智能制造领域的领先实践。BOE(京东方…...
Moretl安全日志采集工具
永久免费: 至Gitee下载 使用教程: Moretl使用说明 使用咨询: 用途 定时全量或增量采集工控机,电脑文件或日志. 优势 开箱即用: 解压直接运行.不需额外下载.管理设备: 后台统一管理客户端.无人值守: 客户端自启动,自更新.稳定安全: 架构简单,兼容性好,通过授权控制访问. 架…...
LabVIEW农机自主导航监控系统
随着现代农业技术的快速发展,自主导航农机的需求日益增加,提高作业效率和减少劳动成本成为农业现代化的关键目标。本文介绍了一个基于LabVIEW的农机自主导航监控系统的开发案例,该系统通过先进的传感器与控制技术,实现农机在田间作…...
ChatGPT重大更新:新增实时搜索和高级语音
12月17日消息,据报道,OpenAI开启了第八天技术分享直播,对ChatGPT搜索功能进行了大量更新。 此次ChatGPT新增的功能亮点纷呈。其中,实时搜索功能尤为引人注目。OpenAI对搜索算法进行了深度优化,使得用户提出问题后&…...
爬虫基础学习
爬虫概念与工作原理 爬虫是什么:爬虫(Web Scraping)是自动化地访问网站并提取数据的技术。它模拟用户浏览器的行为,通过HTTP请求访问网页,解析HTML文档并提取有用信息。 爬虫的基本工作流程: 发送HTTP请求…...