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

鸿蒙OSUniApp开发的商品详情展示页面(鸿蒙系统适配版)#三方框架 #Uniapp

使用UniApp开发的商品详情展示页面(鸿蒙系统适配版)

前言

随着移动电商的普及,一个体验良好的商品详情页对于提高用户转化率至关重要。本文将分享我在使用UniApp开发商品详情页时的实践经验,并特别关注如何适配鸿蒙系统,确保在华为设备上也能获得出色的用户体验。

作为一个跨端开发者,我深知要在各类设备上提供一致且优质的体验并不容易。尤其是国产鸿蒙系统的兴起,给我们的开发工作带来了新的挑战和机遇。通过本文的分享,希望能帮助更多开发者构建既美观又高效的商品详情页。

需求分析

一个完善的商品详情页通常包含以下核心功能:

  1. 商品图片轮播与预览
  2. 商品基本信息展示(标题、价格、销量等)
  3. 规格选择与库存展示
  4. 商品详情(图文详情、参数、评价等)
  5. 底部固定购买栏(加入购物车、立即购买等)
  6. 相关推荐商品

在鸿蒙系统上,还需要特别关注以下方面:

  • 手势操作的流畅性
  • 动效设计符合鸿蒙的设计风格
  • 适配鸿蒙系统特有的API

技术选型

我们的技术栈主要包括:

  • UniApp作为跨端开发框架
  • Vue3 + TypeScript开发核心逻辑
  • SCSS处理样式
  • uView UI提供基础组件支持
  • Vuex管理全局状态
  • 针对鸿蒙系统的特殊处理

项目实现

页面布局基础结构

首先,我们来看一下商品详情页的基础结构:

<template><view class="product-detail" :class="{'harmony-container': isHarmonyOS}"><!-- 状态栏占位 --><view class="status-bar" :style="{ height: statusBarHeight + 'px' }"></view><!-- 自定义导航栏 --><view class="custom-navbar"><view class="left" @click="handleBack"><text class="iconfont icon-back"></text></view><view class="navbar-tabs"><view v-for="(tab, index) in tabs" :key="index"class="tab-item":class="{'active': currentTab === index}"@click="switchTab(index)"><text>{{ tab }}</text></view></view><view class="right"><text class="iconfont icon-more" @click="showMore"></text></view></view><!-- 内容区域 --><scroll-view class="content-scroll"scroll-y:scroll-top="scrollTop"@scroll="handleScroll":show-scrollbar="false":bounce="false":enhanced="isHarmonyOS" :fast-deceleration="isHarmonyOS"><!-- 轮播图 --><swiper-section :images="product.images" @preview="previewImage"></swiper-section><!-- 商品信息 --><product-info :product="product" :is-harmony="isHarmonyOS"></product-info><!-- 规格选择 --><spec-section :specs="product.specs" :selected="selectedSpec"@select="selectSpec"></spec-section><!-- 详情内容 --><detail-section :detail="product.detail":params="product.params":comments="product.comments":current-tab="currentDetailTab"@change-tab="changeDetailTab"></detail-section><!-- 推荐商品 --><recommend-section :products="relatedProducts"></recommend-section></scroll-view><!-- 底部操作栏 --><view class="bottom-actions" :class="{'harmony-bottom': isHarmonyOS}"><view class="action-btn service"><text class="iconfont icon-service"></text><text>客服</text></view><view class="action-btn favorite" @click="toggleFavorite"><text class="iconfont" :class="isFavorite ? 'icon-favorited' : 'icon-favorite'"></text><text>{{ isFavorite ? '已收藏' : '收藏' }}</text></view><view class="action-btn cart" @click="goToCart"><text class="iconfont icon-cart"></text><text>购物车</text><view class="cart-badge" v-if="cartCount > 0">{{ cartCount }}</view></view><view class="action-btn add-to-cart" @click="addToCart">加入购物车</view><view class="action-btn buy-now" @click="buyNow">立即购买</view></view><!-- 规格选择弹窗 --><spec-popup :visible="specPopupVisible" :product="product":selected="selectedSpec"@close="closeSpecPopup"@confirm="confirmSpec"@select="selectSpec"></spec-popup></view>
</template><script lang="ts">
import { defineComponent, ref, reactive, computed, onMounted, onUnmounted } from 'vue';
import { isHarmonyOS, getStatusBarHeight } from '@/utils/system';
import SwiperSection from './components/SwiperSection.vue';
import ProductInfo from './components/ProductInfo.vue';
import SpecSection from './components/SpecSection.vue';
import DetailSection from './components/DetailSection.vue';
import RecommendSection from './components/RecommendSection.vue';
import SpecPopup from './components/SpecPopup.vue';export default defineComponent({components: {SwiperSection,ProductInfo,SpecSection,DetailSection,RecommendSection,SpecPopup},props: {productId: {type: [String, Number],required: true}},setup(props) {// 状态变量const product = ref({} as any);const relatedProducts = ref([] as any[]);const isLoading = ref(true);const scrollTop = ref(0);const currentTab = ref(0);const currentDetailTab = ref(0);const statusBarHeight = ref(0);const specPopupVisible = ref(false);const selectedSpec = ref({} as any);const isFavorite = ref(false);const cartCount = ref(0);const isHarmonyOS = ref(false);// Tab选项const tabs = ['商品', '详情', '评价'];// 检测是否为鸿蒙系统onMounted(() => {isHarmonyOS.value = isHarmonyOS();statusBarHeight.value = getStatusBarHeight();fetchProductData();});// 获取商品数据const fetchProductData = async () => {try {isLoading.value = true;// 模拟请求数据setTimeout(() => {// 这里通常是调用API获取数据product.value = {id: props.productId,title: '2023新款智能手表 多功能运动监测',price: 299.00,originalPrice: 399.00,sales: 1280,stock: 860,images: ['https://example.com/watch1.jpg','https://example.com/watch2.jpg','https://example.com/watch3.jpg',],specs: [{title: '颜色',options: ['黑色', '白色', '蓝色']},{title: '尺寸',options: ['42mm', '46mm']}],detail: '<div>这里是商品详情的HTML内容</div>',params: [{ key: '品牌', value: 'WatchBrand' },{ key: '防水等级', value: 'IP68' },{ key: '电池容量', value: '300mAh' }],comments: [{user: '用户A',avatar: 'https://example.com/avatar1.jpg',content: '商品很好,手表质量不错',rating: 5,date: '2023-05-21'}]};// 相关推荐relatedProducts.value = [{id: 101,title: '运动手环',price: 129.00,image: 'https://example.com/band1.jpg'},{id: 102,title: '智能耳机',price: 199.00,image: 'https://example.com/earphone1.jpg'}];isLoading.value = false;}, 1000);} catch (error) {console.error('获取商品数据失败', error);isLoading.value = false;}};// 切换Tabconst switchTab = (index: number) => {currentTab.value = index;// 根据Tab计算滚动位置if (index === 0) {scrollTop.value = 0;} else if (index === 1) {scrollTop.value = 800; // 根据实际情况调整} else {scrollTop.value = 1200; // 根据实际情况调整}};// 处理滚动事件const handleScroll = (e: any) => {const scrollPosition = e.detail.scrollTop;// 根据滚动位置自动切换Tabif (scrollPosition < 700) {currentTab.value = 0;} else if (scrollPosition < 1100) {currentTab.value = 1;} else {currentTab.value = 2;}};// 显示规格选择弹窗const openSpecPopup = () => {specPopupVisible.value = true;};// 关闭规格选择弹窗const closeSpecPopup = () => {specPopupVisible.value = false;};// 选择规格const selectSpec = (spec: any) => {selectedSpec.value = { ...selectedSpec.value, ...spec };};// 确认规格const confirmSpec = () => {// 这里可以检查是否已选择完所有规格closeSpecPopup();};// 预览图片const previewImage = (index: number) => {uni.previewImage({current: index,urls: product.value.images,// 鸿蒙特殊处理longPressActions: isHarmonyOS.value ? {itemList: ['保存图片', '分享'],success: function(data) {console.log('选中了第' + (data.tapIndex + 1) + '个按钮');},fail: function(err) {console.log(err.errMsg);}} : undefined});};// 切换收藏状态const toggleFavorite = () => {isFavorite.value = !isFavorite.value;// 鸿蒙系统特有的震动反馈if (isHarmonyOS.value) {// #ifdef APP-PLUSif (plus.os.name === 'Android' && plus.device.vendor === 'HUAWEI') {try {plus.device.vibrate(10);} catch (e) {console.error('震动API调用失败', e);}}// #endif}uni.showToast({title: isFavorite.value ? '已加入收藏' : '已取消收藏',icon: 'none'});};// 前往购物车const goToCart = () => {uni.switchTab({url: '/pages/cart/cart'});};// 加入购物车const addToCart = () => {// 检查是否已选择规格if (!selectedSpec.value.颜色 || !selectedSpec.value.尺寸) {openSpecPopup();return;}// 模拟加入购物车操作cartCount.value += 1;uni.showToast({title: '已加入购物车',icon: 'success'});};// 立即购买const buyNow = () => {// 检查是否已选择规格if (!selectedSpec.value.颜色 || !selectedSpec.value.尺寸) {openSpecPopup();return;}uni.navigateTo({url: `/pages/order/confirm?productId=${props.productId}&specId=${JSON.stringify(selectedSpec.value)}`});};// 处理返回const handleBack = () => {uni.navigateBack();};// 显示更多操作const showMore = () => {uni.showActionSheet({itemList: ['分享', '举报'],success: function(res) {if (res.tapIndex === 0) {// 分享uni.share({provider: 'weixin',scene: 'WXSceneSession',type: 0,title: product.value.title,summary: `限时特惠:¥${product.value.price}`,imageUrl: product.value.images[0],href: `https://example.com/product/${product.value.id}`});} else if (res.tapIndex === 1) {// 举报uni.navigateTo({url: '/pages/report/report'});}}});};return {product,relatedProducts,isLoading,scrollTop,currentTab,currentDetailTab,tabs,statusBarHeight,specPopupVisible,selectedSpec,isFavorite,cartCount,isHarmonyOS,switchTab,handleScroll,openSpecPopup,closeSpecPopup,selectSpec,confirmSpec,previewImage,toggleFavorite,goToCart,addToCart,buyNow,handleBack,showMore};}
});
</script><style lang="scss">
.product-detail {position: relative;width: 100%;min-height: 100vh;background-color: #f5f5f5;.status-bar {background-color: #ffffff;}.custom-navbar {display: flex;align-items: center;height: 44px;background-color: #ffffff;padding: 0 15px;.left, .right {width: 40px;display: flex;justify-content: center;.iconfont {font-size: 24px;color: #333;}}.navbar-tabs {flex: 1;display: flex;justify-content: center;.tab-item {padding: 0 15px;height: 44px;line-height: 44px;font-size: 15px;color: #666;position: relative;&.active {color: #333;font-weight: bold;&:after {content: '';position: absolute;bottom: 0;left: 15px;right: 15px;height: 2px;background-color: #333;}}}}}.content-scroll {height: calc(100vh - 44px - var(--status-bar-height) - 50px);}.bottom-actions {position: fixed;left: 0;right: 0;bottom: 0;height: 50px;background-color: #fff;display: flex;align-items: center;border-top: 1px solid #eee;padding-bottom: env(safe-area-inset-bottom);.action-btn {height: 50px;display: flex;flex-direction: column;justify-content: center;align-items: center;font-size: 12px;color: #666;position: relative;.iconfont {font-size: 18px;margin-bottom: 2px;}&.service, &.favorite, &.cart {flex: 1;}&.add-to-cart, &.buy-now {flex: 2;font-size: 14px;color: #fff;}&.add-to-cart {background-color: #ff9500;}&.buy-now {background-color: #ff3b30;}.cart-badge {position: absolute;top: 2px;right: 50%;transform: translateX(6px);background-color: #ff3b30;color: #fff;font-size: 10px;min-width: 16px;height: 16px;line-height: 16px;text-align: center;border-radius: 8px;padding: 0 4px;}}}
}/* 鸿蒙系统特殊样式 */
.harmony-container {.custom-navbar {.navbar-tabs {.tab-item {&.active {&:after {background-color: #0078ff;height: 3px;border-radius: 1.5px;}}}}}.bottom-actions {&.harmony-bottom {border-top: none;box-shadow: 0 -3px 10px rgba(0, 0, 0, 0.05);.action-btn {&.add-to-cart {background: linear-gradient(135deg, #ff9500, #ff7000);border-radius: 22px;margin: 4px 6px;height: 42px;}&.buy-now {background: linear-gradient(135deg, #ff3b30, #ff2020);border-radius: 22px;margin: 4px 6px;height: 42px;}}}}
}
</style>

轮播组件的实现

轮播图是商品详情页的核心组件,下面是轮播组件的实现:

<!-- components/SwiperSection.vue -->
<template><view class="swiper-section" :class="{'harmony-swiper': isHarmonyOS}"><swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="5000" indicator-active-color="#fff"indicator-color="rgba(255, 255, 255, 0.3)"><swiper-item v-for="(image, index) in images" :key="index" @click="handlePreview(index)"><image class="swiper-image" :src="image" mode="aspectFill"></image></swiper-item></swiper></view>
</template><script lang="ts">
import { defineComponent, onMounted, ref } from 'vue';
import { isHarmonyOS } from '@/utils/system';export default defineComponent({props: {images: {type: Array,default: () => []}},emits: ['preview'],setup(props, { emit }) {const isHarmonyOS = ref(false);onMounted(() => {isHarmonyOS.value = isHarmonyOS();});const handlePreview = (index: number) => {emit('preview', index);};return {isHarmonyOS,handlePreview};}
});
</script><style lang="scss">
.swiper-section {width: 100%;.swiper {width: 100%;height: 750rpx;.swiper-image {width: 100%;height: 100%;}}
}/* 鸿蒙系统特殊样式 */
.harmony-swiper {.swiper {border-radius: 0 0 20rpx 20rpx;overflow: hidden;}
}
</style>

商品信息组件

接下来是商品信息展示组件:

<!-- components/ProductInfo.vue -->
<template><view class="product-info" :class="{'harmony-card': isHarmony}"><view class="price-section"><text class="price">¥{{ product.price.toFixed(2) }}</text><text class="original-price">¥{{ product.originalPrice.toFixed(2) }}</text><view class="discount" v-if="discountRate > 0">{{ discountRate }}折</view></view><view class="title-section"><text class="title">{{ product.title }}</text></view><view class="sales-section"><text class="sales">销量 {{ product.sales }}</text><text class="divider">|</text><text class="stock">库存 {{ product.stock }}</text></view></view>
</template><script lang="ts">
import { defineComponent, computed } from 'vue';export default defineComponent({props: {product: {type: Object,required: true},isHarmony: {type: Boolean,default: false}},setup(props) {// 计算折扣率const discountRate = computed(() => {if (!props.product.originalPrice || props.product.originalPrice <= 0) {return 0;}return Math.floor((props.product.price / props.product.originalPrice) * 10);});return {discountRate};}
});
</script><style lang="scss">
.product-info {background-color: #fff;padding: 20rpx;margin-top: 10rpx;.price-section {display: flex;align-items: center;.price {font-size: 36rpx;color: #ff3b30;font-weight: bold;}.original-price {font-size: 24rpx;color: #999;text-decoration: line-through;margin-left: 10rpx;}.discount {font-size: 20rpx;color: #fff;background-color: #ff3b30;padding: 2rpx 10rpx;border-radius: 10rpx;margin-left: 10rpx;}}.title-section {margin-top: 10rpx;.title {font-size: 28rpx;color: #333;line-height: 1.4;}}.sales-section {margin-top: 10rpx;display: flex;align-items: center;.sales, .stock {font-size: 24rpx;color: #999;}.divider {margin: 0 10rpx;color: #eee;}}
}/* 鸿蒙系统特殊样式 */
.harmony-card {border-radius: 20rpx;margin: 20rpx;box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.05);.price-section {.price {background: linear-gradient(to right, #ff3b30, #ff6b30);-webkit-background-clip: text;color: transparent;font-family: 'HarmonyOS Sans', sans-serif;}.discount {background: linear-gradient(to right, #ff3b30, #ff6b30);border-radius: 12rpx;}}
}
</style>

鸿蒙系统适配关键点

在为鸿蒙系统适配我们的商品详情页时,以下几点值得特别关注:

1. 检测鸿蒙系统

首先,我们需要一个工具函数来检测当前设备是否运行鸿蒙系统:

// utils/system.ts/*** 检测当前设备是否为鸿蒙系统*/
export function isHarmonyOS(): boolean {// #ifdef APP-PLUSconst systemInfo = uni.getSystemInfoSync();const systemName = systemInfo.osName || '';const systemVersion = systemInfo.osVersion || '';// 鸿蒙系统识别return systemName.toLowerCase().includes('harmony') || (systemName === 'android' && systemVersion.includes('harmony'));// #endifreturn false;
}/*** 获取状态栏高度*/
export function getStatusBarHeight(): number {const systemInfo = uni.getSystemInfoSync();return systemInfo.statusBarHeight || 20;
}/*** 鸿蒙系统UI适配*/
export function adaptHarmonyUI(): void {// #ifdef APP-PLUSif (!isHarmonyOS()) return;try {// 全局设置圆角尺寸变量document.documentElement.style.setProperty('--harmony-border-radius', '16rpx');// 设置字体家族document.documentElement.style.setProperty('--harmony-font-family', 'HarmonyOS Sans, sans-serif');// 设置颜色变量document.documentElement.style.setProperty('--harmony-primary-color', '#0078ff');document.documentElement.style.setProperty('--harmony-gradient-start', '#ff3b30');document.documentElement.style.setProperty('--harmony-gradient-end', '#ff6b30');} catch (e) {console.error('适配鸿蒙UI失败', e);}// #endif
}

2. UI设计适配

鸿蒙系统有其独特的设计语言,我们需要对UI进行相应调整:

  1. 圆角设计:鸿蒙系统的设计语言偏向于使用较大的圆角,我们可以增加卡片、按钮等元素的圆角值
  2. 渐变色:鸿蒙UI使用较多渐变色,尤其是按钮和强调元素
  3. 阴影效果:轻微的阴影可以增强层次感
  4. 字体适配:使用鸿蒙系统的HarmonyOS Sans字体

3. 性能优化

鸿蒙系统对于动画和滚动性能有较高的要求:

  1. 滚动优化
<scroll-view :enhanced="isHarmonyOS" :fast-deceleration="isHarmonyOS":bounces="false"
>
  1. 图片懒加载
<image lazy-load :fade-show="isHarmonyOS" :webp="isHarmonyOS"mode="aspectFill"src="..."
></image>
  1. 动画优化:使用transform代替position变化,并开启硬件加速
.animated-element {transform: translateZ(0);will-change: transform;
}

4. 手势交互

鸿蒙系统对手势交互有独特的处理,我们可以利用这一点增强用户体验:

// 双指缩放预览
const handleImageZoom = (e) => {if (!isHarmonyOS.value) return;// #ifdef APP-PLUSif (e.touches.length === 2) {const touch1 = e.touches[0];const touch2 = e.touches[1];// 计算两指距离const distance = Math.sqrt(Math.pow(touch2.pageX - touch1.pageX, 2) + Math.pow(touch2.pageY - touch1.pageY, 2));// 根据距离变化处理缩放if (!lastDistance.value) {lastDistance.value = distance;return;}const scale = distance / lastDistance.value;if (scale > 1.05 || scale < 0.95) {// 触发缩放操作handleZoom(scale > 1 ? 'in' : 'out');lastDistance.value = distance;}}// #endif
};

实际应用案例

我最近负责了一个电商App的商品详情页改版,特别是为了适配华为新发布的鸿蒙系统设备。下面分享几个在实际项目中的经验:

案例一:图片浏览优化

华为旗舰机通常有出色的屏幕,用户喜欢放大查看商品细节。我们通过以下方式优化了图片浏览体验:

  1. 使用高清图片资源,但配合懒加载减少流量消耗
  2. 添加双指缩放功能,并优化缩放流畅度
  3. 长按图片提供保存、分享选项

效果是华为设备上的用户停留时间增加了15%,放大查看图片的次数提升了23%。

案例二:规格选择交互优化

由于鸿蒙系统对动画效果的支持较好,我们对规格选择的交互做了改进:

  1. 弹出规格选择面板增加了平滑的过渡动画
  2. 选择规格时添加微小的震动反馈
  3. 调整按钮样式为鸿蒙系统推荐的样式

这些小改进带来了明显的体验提升,在鸿蒙设备上的转化率提高了约8%。

总结

通过本文,我们详细探讨了如何使用UniApp开发一个适配鸿蒙系统的商品详情页。从基础布局到组件实现,从UI设计到性能优化,我们全方位考虑了如何在鸿蒙系统上提供最佳的用户体验。

随着鸿蒙系统的普及,更好的适配这一系统将成为应用成功的关键因素之一。通过关注系统特性、遵循设计规范以及针对性的优化,我们可以为用户提供流畅、美观且易用的商品详情页体验。

希望本文对你在UniApp开发商品详情页以及鸿蒙系统适配方面有所帮助。如有任何问题或经验分享,欢迎在评论区留言交流!

参考资源

  1. UniApp官方文档
  2. HarmonyOS设计指南
  3. Vue3官方文档
  4. ScrollView性能优化
  5. 华为原子化服务集成指南

相关文章:

鸿蒙OSUniApp开发的商品详情展示页面(鸿蒙系统适配版)#三方框架 #Uniapp

使用UniApp开发的商品详情展示页面&#xff08;鸿蒙系统适配版&#xff09; 前言 随着移动电商的普及&#xff0c;一个体验良好的商品详情页对于提高用户转化率至关重要。本文将分享我在使用UniApp开发商品详情页时的实践经验&#xff0c;并特别关注如何适配鸿蒙系统&#xf…...

VMware中快速安装与优化Ubuntu全攻略

准备工作 在开始安装之前&#xff0c;确保已经下载了VMware Workstation或VMware Player&#xff0c;并准备好Ubuntu的ISO镜像文件。VMware Workstation是一款功能强大的虚拟机软件&#xff0c;支持在Windows或Linux主机上运行多个操作系统。 创建虚拟机 打开VMware Worksta…...

本地 PC 使用Offset Explorer连接实体Ubuntu Kafka 【单机】超时问题解决

现状&#xff1a;本地 PC 使用Offset Explorer连接实体Ubuntu Kafka 超时 一、确认kafka是否在9092端口上运行 netstat -tulnp | grep 9092输出 tcp6 0 0 :::9092 :::* LISTEN 66113/java 使用jps查看进程66113的详细信息…...

CSS AI 通义灵码 VSCode插件安装与功能详解

简介 在前端开发领域&#xff0c;页面调试一直是个繁琐的过程&#xff0c;而传统开发中美工与前端的对接也常常出现问题。如今&#xff0c;阿里云技术团队推出的通义灵码智能编码助手&#xff0c;为前端开发者带来了新的解决方案&#xff0c;让开发者可以像指挥者一样&#xf…...

MUSE Pi Pro 使用TiTanTools烧录镜像

视频讲解&#xff1a; MUSE Pi Pro 使用TiTanTools烧录镜像 下载windows下的烧录工具 https://cloud.spacemit.com/prod-api/release/download/tools?tokentitantools_for_windows_X86_X64 下载镜像文件&#xff0c;zip后缀的即可 打开软件默认界面 按住FDL键&#xff0c;同时…...

嵌软面试每日一阅----通信协议篇(二)之TCP

一. TCP和UDP的区别 可靠性 TCP&#xff1a;✅ 可靠传输&#xff08;三次握手 重传机制&#xff09; UDP&#xff1a;❌ 不可靠&#xff08;可能丢包&#xff09; 连接方式 TCP&#xff1a;面向连接&#xff08;需建立/断开连接&#xff09; UDP&#xff1a;无连接&#xff0…...

开机自启动python程序_ubuntu22.04

一、没有设置开机自启动时 1、 conda activate yolo cd /home/orangepi/work_11.15/zipformer 2、 python app.py 二、设置开机自启动流程 1、新建一个文件.service文件 touch zipformer.service 2、最重要的找到你自己的环境路径 这个是我的 yolo的虚拟环境在&#xff…...

8、SpringBoot集成MinIO

8、SpringBoot集成MinIO https://xiaoxueblog.com/ai/SpringBoot%E9%9B%86%E6%88%90MinIO.html 1、pom <dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.12</version> </dependency>2…...

LeRobot 框架的核心架构概念和组件(下)

本文档概述构成 LeRobot 框架的核心架构概念和组件。它介绍主要的子系统&#xff0c;并解释它们如何相互作用以实现机器人学习。 。。。。。。继续。。。。。。 机器人控制系统 机器人控制系统提供统一的接口来控制实体机器人。它支持不同的控制模式和机器人类型&#xff0c…...

ubuntu18 设置静态ip

百度 编辑/etc/netplan/01-netcfg.yaml 系统没有就自己编写 network: version: 2 renderer: networkd ethernets: eth0: dhcp4: no addresses: [192.168.20.8/24] # 设置你的IP地址和子网掩码 gateway4: 192.168.20.1 # 网关地址 namese…...

QML元素 - ThresholdMask

QML 的 ThresholdMask 用于根据阈值将源元素与遮罩元素的像素值进行比较&#xff0c;通过设定阈值范围来控制源元素的可见区域。它适用于基于亮度、透明度或颜色通道的动态遮罩效果&#xff0c;例如游戏中的血条、进度指示器或图像处理中的抠图。以下是详细使用技巧和场景示例&…...

[项目深挖]仿muduo库的并发服务器的解析与优化方案

标题&#xff1a;[项目深挖]仿muduo库的并发服务器的优化方案 水墨不写bug 文章目录 一、buffer 模块&#xff08;1&#xff09;线性缓冲区直接扩容---->环形缓冲区定时扩容&#xff08;只会扩容一次&#xff09;&#xff08;2&#xff09;使用双缓冲&#xff08;Double Buf…...

(独家)SAP CO模块中 销售发票对应的Cost Document中的PSG对象是什么东东??

背景&#xff1a; 在销售发票生成的凭证中&#xff0c;控制凭证有两个字段&#xff1a;对象类型、对应编码&#xff1b;那这个PSG到底是什么东东&#xff1f;网上一直没人解释&#xff0c;可能没人研究过这个问题。 官方解释&#xff1a; 按我的理解&#xff0c;PSG profile …...

流程编辑器Bpmn与LogicFlow学习

工作流技术如何与用户交互结合&#xff08;如动态表单、任务分配&#xff09;处理过 XML 与 JSON 的转换自定义过 bpmn.js 的样式&#xff08;如修改节点颜色、形状、图标&#xff09;扩展过上下文菜单&#xff08;Palette&#xff09;或属性面板&#xff08;Properties Panel&…...

群晖NAS部署PlaylistDL音乐下载器结合cpolar搭建私有云音乐库

文章目录 前言1.关于PlaylistDL音乐下载器2.Docker部署3.PlaylistDL简单使用4.群晖安装Cpolar工具5.创建PlaylistDL音乐下载器的公网地址6.配置固定公网地址总结 前言 各位小伙伴们&#xff0c;你们是不是经常为了听几首歌而开通各种平台的VIP&#xff1f;或者为了下载无损音质…...

Unity光照笔记

问题 在做项目中遇到了播放中切换场景后地面阴影是纯黑的问题&#xff0c;不得不研究一下光照。先放出官方文档。 Lighting 窗口 - Unity 手册 播放中切换场景后地面阴影是纯黑 只有投到地面的阴影是纯黑的。且跳转到使用相同Terrain的场景没有问题。 相关文章&#xff1a…...

【ROS2】编译Qt实现的库,然后链接该库时,报错:/usr/bin/ld: XXX undefined reference to `vtable for

1、问题描述 在ROS2工程中,编译使用Qt实现的库,在其它ROS2包链接该库时,报错: /usr/bin/ld: XXX undefined reference to `vtable for2、原因分析 查看链接失败的几个函数接口都是,信号函数(signals 标记的函数)。因为信号函数都只有定义,没有实现,在执行ROS2 colc…...

deepseek讲解如何快速解决内存泄露,内存溢出问题

Java内存泄漏与内存溢出解决方案及预防措施 作为Java架构师&#xff0c;处理内存泄漏和内存溢出问题需要系统性的方法。以下是一份完整的解决方案和预防建议&#xff1a; 一、问题诊断阶段 1. 确认内存泄漏现象 监控GC日志&#xff0c;观察老年代使用率是否持续增长使用jst…...

双系统重装ubuntu

双系统ubuntu20.04重装&#xff08;详细版&#xff09;_ubuntu20.04安装教程-CSDN博客...

图形语言中间层:重构 AI 编程的未来之路

在软件开发的历史长河中&#xff0c;每一次技术革新都伴随着对效率与可控性的重新定义。当 ChatGPT、GitHub Copilot 等 AI 工具以自然语言生成代码的惊艳表现叩响编程世界的大门时&#xff0c;人们曾满怀憧憬地期待一个 “无代码” 的黄金时代 —— 只需用日常语言描述需求&am…...

Ubuntu操作合集

UFWUncomplicated Firewall 查看状态和规则&#xff1a; 1查看状态sudo ufw status&#xff0c; 2查看详细信息sudo ufw status verbose&#xff0c; 默认策略配置&#xff1a; 1拒绝所有入站sudo ufw default deny incoming 2允许所有出战sudo ufw default allow outgoing …...

张量与Python标量:核心区别与计算图断开解析

张量与Python标量的核心区别 张量(Tensor) 是PyTorch中的核心数据结构,类似于多维数组: 支持GPU加速计算跟踪计算历史(用于自动求导)可以包含多个元素Python标量(int/float) 是普通的Python数值类型: 不支持GPU加速没有计算历史记录单个独立数值计算图断开的原因 Py…...

U9C与钉钉审批流对接完整过程

U9C 功能强大&#xff0c;然而在移动办公和审批流方面存在一定不足。为了弥补这一缺陷&#xff0c;不少企业在使用 U9C 的同时&#xff0c;会选择开通钉钉这类 OA 管理系统。不过&#xff0c;两套系统并行使用时&#xff0c;数据同步问题便随之而来。目前&#xff0c;常见的做法…...

双重差分模型学习笔记4(理论)

【DID最全总结】90分钟带你速通双重差分&#xff01;_哔哩哔哩_bilibili 目录 总结&#xff1a;双重差分法&#xff08;DID&#xff09;在社会科学中的应用&#xff1a;理论、发展与前沿分析 一、DID的基本原理与核心思想 二、经典DID&#xff1a;标准模型与应用案例 三、…...

【Pandas】pandas DataFrame diff

Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判断…...

什么是Agentic AI(代理型人工智能)?

什么是Agentic AI&#xff08;代理型人工智能&#xff09;&#xff1f; 一、概述 Agentic AI&#xff08;代理型人工智能&#xff09;是一类具备自主决策、目标导向性与持续行动能力的人工智能系统。与传统AI系统依赖外部输入和显式命令不同&#xff0c;Agentic AI在设定目标…...

记录算法笔记(2025.5.15)二叉树的层序遍历

给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] 示例 2&#xff1a; 输入…...

2025 Java 微信小程序根据code获取openid,二次code获取手机号【工具类】拿来就用

一、controller调用 /*** 登录** author jiaketao* since 2024-04-10*/ RestController RequestMapping("/login") public class LoginController {/*** 【小程序】登录获取session_key和openid** param code 前端传code* return*/GetMapping("/getWXSessionKe…...

2021-10-25 C++三的倍数含五

缘由含数字五且是三的倍数-编程语言-CSDN问答 void 三的倍数含五() {//缘由https://ask.csdn.net/questions/7544132?spm1005.2025.3001.5141int a 3, aa a;while (a < 10000){if (aa)if (aa % 10 5)std::cout << a << std::ends, aa a 3; else aa / 10;…...

编程日志5.8

二叉树练习题 1.965. 单值二叉树 - 力扣(LeetCode) /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) :…...

Vue.js---避免无限递归循环 调度执行

4.4 避免无限递归循环 什么情况下会无限递归&#xff1f; 01 const data { foo: 1 } 02 const obj new Proxy(data, { /*...*/ }) 03 04 effect(() > obj.foo)例如这种情况&#xff0c;它会反复设置添加一直到栈溢出 首先读取obj.foo 的值&#xff0c;这会触发 track 操…...

AI大模型学习二十四、实践QEMU-KVM 虚拟化:ubuntu server 25.04 下云镜像创建Ubuntu 虚拟机

一、说明 虽然说大部分的场合&#xff0c;docker都能解决问题&#xff0c;但是有些大型的软件安装时如果修改配置会很麻烦&#xff0c;比方说前面遇到的code-server和dify 默认都是80和443端口要使用&#xff0c;安装在一起就会端口冲突&#xff0c;通过该端口来解决问题&#…...

Lovart:首个AI设计智能体

今天介绍一款AI设计智能体——Lovart&#xff0c;能调用各种绘画API和视频API&#xff0c;也能调用LibLib上的Flux和LoRA&#xff0c;并且智能体的编排效果确实很好&#xff0c;产出效果比豆包和ChatGPT都好&#xff0c;可以说没有竞品。视频为效果演示&#xff0c;官网有更多案…...

Trae 插件 Builder 模式:从 0 到 1 开发天气查询小程序,解锁 AI 编程新体验

在软件开发领域&#xff0c;效率与创新始终是开发者追求的核心目标。Trae 插件&#xff08;原 MarsCode 编程助手&#xff09;Builder 模式的全面上线&#xff0c;无疑为开发者带来了全新的解决方案。它不仅同时支持 VS Code、JetBrains IDEs 等主流开发环境&#xff0c;还能让…...

解决ubuntu20中tracker占用过多cpu,引起的风扇狂转

track是linux中的文件索引工具&#xff0c;ubuntu18之前是默认不安装的&#xff0c;所以在升级到20后会默认安装&#xff0c;它是和桌面程序gnome绑定的&#xff0c;甚至还有很多依赖项&#xff0c;导致无法删除&#xff0c;一旦删除很多依赖项都不能运行&#xff0c;禁用也很难…...

解码生命语言:深度学习模型TranslationAI揭示RNA翻译新规则

RNA翻译是基因表达的核心环节&#xff0c;其精确调控依赖于翻译起始位点&#xff08;TIS&#xff09;和终止位点&#xff08;TTS&#xff09;的准确识别。传统方法依赖于简单的经验规则&#xff08;如Kozak序列或最长开放阅读框ORF&#xff09;&#xff0c;但忽略了RNA结构、顺…...

20250515测试飞凌的OK3588-C的核心板在Linux R4下适配以太网RTL8211F-CG时跑iperf3的极速

20250515测试飞凌的OK3588-C的核心板在Linux R4下适配以太网RTL8211F-CG时跑iperf3的极速 2025/5/15 14:47 缘起&#xff1a;让飞凌的OK3588-C的核心板在Linux R4下&#xff0c;想看看以太网RTL8211F-CG的极速。 于是在飞凌的OK3588-C的核心板上&#xff0c;iperf3的收发一起跑…...

在Linux内安装虚拟机安装vmnet.tar 报错

编译报错如下: /usr/lib/vmware/modules/source/vmnet-only/userif.c: 在函数‘VNetCsumCopyDatagram’中: /usr/lib/vmware/modules/source/vmnet-only/userif.c:88:39: 错误&#xff1a;‘skb_frag_t {或称 const struct bio_vec}’ has no member named ‘page_offset’; di…...

CodeBuddy编程新范式

不会写&#xff1f;不想写&#xff1f; 腾讯推出的CodeBuddy彻底解放双手。 示例 以下是我对CodeBuddy的一个小体验。 我只用一行文字对CodeBuddy说明了一下我的需求&#xff0c;剩下的全部就交给了CodeBuddy&#xff0c;我需要做的就是验收结果即可。 1.首先CodeBuddy会对任…...

ESP32简介及相关使用

乐鑫官网&#xff1a; 无线通信 SoC、软件、云和 AIoT 方案&#xff5c;乐鑫科技 (espressif.com) 简介 ESP32 是由 乐鑫科技&#xff08;Espressif Systems&#xff09; 推出的一款高性能、低功耗的 Wi-Fi & 蓝牙双模物联网&#xff08;IoT&#xff09;芯片&#xff0c;广…...

全志F10c200开发笔记——移植uboot

相关资料&#xff1a; &#xff08;二&#xff09;uboot移植--从零开始自制linux掌上电脑&#xff08;F1C200S)&#xff1c;嵌入式项目&#xff1e;-CSDN博客 F1C200S挖坑日记&#xff08;3&#xff09;——Uboot编译篇_f1c200s uboot-CSDN博客 一、安装编译器 Linaro Rele…...

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- Manus解密

解密企业级大模型智能体Agentic AI 关键技术&#xff1a;MCP、A2A、Reasoning LLMs- Manus解密 那你当前这个步骤执行完成之后&#xff0c;这边说了一个非常重要的点&#xff1f;每次迭代只选择一个工具&#xff0c;这个可能对大家感觉有点反直觉&#xff0c;可能大家立即选择分…...

理解c++中关键字友元friend的作用

理解c中关键字友元friend的作用 friend 关键字在 C 中用于声明一个函数或类为另一个类的友元。 友元函数或友元类可以访问该类的私有&#xff08;private&#xff09;和保护&#xff08;protected&#xff09;成员。 友元函数 作用&#xff1a; 允许非成员函数访问私有成员&…...

【学习心得】2025年Docker Desktop安装记录

1、docker的官方网站&#xff0c;已进入就可以看到下载按钮&#xff0c;无脑点击下载&#xff01;英特尔的CPU所以选择AMD64 2、双击安装&#xff0c;默认的勾选不用改 Docker Desktop 4.40.0安装过程中的配置选项窗口 Use WSL 2 instead of Hyper-V (recommended)&#xff08…...

数据结构——例题2

1.在线性表中&#xff0c;除了开始元素外&#xff0c;每个元素&#xff08;A&#xff09; A.只有唯一的前驱元素 B.只有唯一的后继元素 C.有多个前驱元素 D.有多个后继元素 2.在一个长度为n的顺序表中删除第i个元素&#xff08;1<i<n&#xff09;时&#xff0c;需向前…...

python开发api平台雏形

api平台雏形 一、Django基本配置 1.1使用pycherm创建项目 1.2 运行项目 1.3 创建app python.exe .\manage.py startapp cmdb1.4 settings.py添加app 1.5 settings.py设置数据库 DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: devopsapi,USER: root,PASSWO…...

Android Development Roadmap

&#x1f527; Android Development Roadmap (Practical First → Theory Later) Here’s a lean, real-world roadmap tailored to the mindset — build-first, theory-when-needed: &#x1f7e2; Stage 1: Core Setup & Workflow (Done ✅) ✅ Install Android Studio…...

将.pt文件执行图像比对

目录 1. 加载模型 2. 图像预处理 3. 提取图像特征 4. 计算相似度 调用API或封装函数即可实现端到端比对 使用.pt文件进行图像比对通常涉及以下步骤&#xff1a; 1. 加载模型 python import torch# 假设模型是PyTorch保存的权重文件 model YourModelClass() # 需与保存时…...

西门子S7-1200 MC卡使用方法及故障现象分析

一、S7 1200 MC卡 S7 1200系列PLC使用的存储卡为SD卡&#xff0c;也被称为MC卡 &#xff0c;支持4M、12M、24M、256M、2G以及32G等不同容量规格。它可作为程序卡、传送卡&#xff0c;还能用于更新硬件及解除密码&#xff0c;在S7 1200的系统运行和维护中扮演着重要角色。 二…...

5.重建大师数据管理模块介绍

摘要&#xff1a;本文主要介绍重建大师数据管理模块&#xff0c;包含&#xff1a;照片、点云数据可视化管理工具。 数据管理界面主要包含工具栏、可视化界面和照片组列表三部分。 图 数据管理界面 1.工具栏 工具栏包含以下功能按钮&#xff0c;包含添加照片、视频、点云、控制…...