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

【UniApp开发小程序】商品详情展示+评论、评论展示、评论点赞+商品收藏【后端基于若依管理系统开发】

文章目录

  • 界面效果
  • 界面实现
    • 工具js
    • 页面
      • 日期格式化
  • 后端
    • 收藏
      • Controller
      • Service
      • mapper
    • 评论
      • Controller
      • Service
      • Mapper
    • 商品
      • Controller
    • 阅读
      • Service

界面效果

【说明】

  • 界面中商品的图片来源于闲鱼,若侵权请联系删除

【商品详情】
在这里插入图片描述

【评论】
在这里插入图片描述

界面实现

工具js

该工具类的作用是,给定一个图片的url地址,计算出图片的高宽比,计算高宽比的作用是让图片可以按照正常比例显示

/*** 获取uuid*/
export default {/*** 获取高宽比 乘以 100%*/getAspectRatio(url) {uni.getImageInfo({src: url,success: function(res) {let aspectRatio = res.height * 100.0 / res.width;// console.log("aspectRatio:" + aspectRatio);return aspectRatio + "%";}});},
}
export default {/*** 日期格式化*/formatDateToString(date) {return new Date(date).toLocaleString();},
}

页面

<template><view class="container"><u-toast ref="uToast"></u-toast><view class="userItem"><view class="userProfile"><u--image :src="productVo.avatar" width="35" height="35" shape="circle"></u--image><view style="width: 10px;"></view><view><view class="nickname">{{productVo.nickname}}</view><view class="other">10分钟前来过 广东工业大学大学城校区</view></view></view><view class="follow" @click="follow" v-if="hadFollow==false"><view><u-icon name="plus" color="#ffffff" style="font-weight: bold;" size="15"></u-icon></view><view style="margin-left: 10rpx;font-size: 15px;">关 注</view></view><view class="followed" @click="cancelFollow" v-else><view style="font-size: 15px;color: #C2C2C2;">已 关 注</view></view></view><view class="productItem"><view class="top"><view class="price">¥<text class="number">{{productVo.price}}</text>/{{productVo.unit}}</view><view class="browseInformation">{{product.starNum}}人想要 | {{product.readNum}}个浏览</view></view><view class="productDetail">{{productVo.description}}</view><u--image :showLoading="true" v-for="(pic,index) in productVo.picList" :src="pic" width="100%":height="getAspectRatio(pic)" radius="10" mode="widthFix"></u--image></view><view class="commentView"><view style="color: #3D3D3D;">{{commentNum}}条评论</view><view v-for="(commentItem,index) in commentVoList"><view class="commentItem"><view style="display: flex;"><u--image :src="commentItem.userAvatar" width="30" height="30" shape="circle"></u--image><view style="width: 10px;"></view><view @click="clickShowBottomPopup(1, commentItem.id,commentItem.userNickName)"><view class="nickname">{{commentItem.userNickName}}</view><view class="content">{{commentItem.content}}</view><view class="dateAndPosition">{{formatDateToString(commentItem.createTime)}}</view></view></view><view style="display: inline-block;text-align: center;"><u-icon name="thumb-up" size="28" @click="likeComment(commentItem.id,commentItem)"v-if="commentItem.isLike==0"></u-icon><u-icon name="thumb-up-fill" color="#2B92FF" size="28"@click="cancelLikeComment(commentItem.id,commentItem)" v-else></u-icon><view style="font-size: 12px;color: #B9B9B9;">{{commentItem.likeNum}}</view></view></view><view class="sonCommentItem" v-for="(commentItem1,index1) in commentItem.children"><view style="display: flex;"><u--image :src="commentItem1.userAvatar" width="30" height="30" shape="circle"></u--image><view style="width: 10px;"></view><view @click="clickShowBottomPopup(1, commentItem1.id,commentItem1.userNickName)"><view class="nickname">{{commentItem1.userNickName}}</view><view class="content"><text style="font-size: 14px;">回复了<text style="color:#B9B9B9 ;">{{commentItem1.toUserNickName}}</text></text><text>{{ commentItem1.content }}</text></view><view class="dateAndPosition">{{formatDateToString(commentItem1.createTime)}}</view></view></view><view style="display: inline-block;text-align: center;"><u-icon name="thumb-up" size="28" @click="likeComment(commentItem1.id,commentItem1)"v-if="commentItem1.isLike==0"></u-icon><u-icon name="thumb-up-fill" color="#2B92FF" size="28"@click="cancelLikeComment(commentItem1.id, commentItem1)" v-else></u-icon><view style="font-size: 12px;color: #B9B9B9;">{{commentItem1.likeNum}}</view></view></view></view></view><view class="footer"><view><view class="item" @click="clickShowBottomPopup(0, productVo.id,)"><u-icon name="chat" size="28"></u-icon><view class="comment">评论</view></view><view class="item" @click="starProduct()" v-if="hadStar==false"><u-icon name="star" size="28"></u-icon><view class="comment">我想要</view></view><view class="item" @click="cancelStar()" v-if="hadStar==true"><u-icon name="star-fill" color="#2B92FF" size="28"></u-icon><view class="comment" style="color: #2B92FF">已收藏</view></view></view><view class="chat"><u-icon name="chat" color="#ffffff" size="18"></u-icon><view style="width: 5px;"></view>私 聊</view></view><!-- 底部弹出框:用于输入评论 --><!-- @close="this.showBottomPopup=false" 点击遮罩层关闭弹框  --><u-popup :show="showBottomPopup" mode="bottom" :round="10" @close="this.showBottomPopup=false"><view class="commentPopup"><u--textarea v-model="comment.content" :placeholder="commentPlaceHolder" autoHeight height="200"border="surround"></u--textarea><view class="commentButton" @click="commitComment()"><u-icon name="chat" color="#ffffff" size="18"></u-icon><view style="width: 5px;"></view>评 论</view></view></u-popup></view>
</template><script>import pictureApi from "@/utils/picture.js";import {addFollow,hadFollowSomeone,cancelFollowSomeone} from "@/api/market/follow.js";import {starProduct,cancelStar,hadStar} from "@/api/market/star.js";import {addComment,listCommentVoOfProduct} from "@/api/market/comment.js";import dateUtil from "@/utils/date.js";import {likeComment,cancelLikeComment} from "@/api/market/commentLike.js"import {getProduct} from "@/api/market/prodct.js"export default {data() {return {productVo: {},product: {},// 是否已经关注商品主人hadFollow: false,// 是否已经收藏商品hadStar: false,// 是否显示底部弹出框showBottomPopup: false,// 评论comment: {itemId: undefined,type: undefined,content: '',isTop: 0},// 存储商品对应的评论集合commentVoList: [],// 评论数量commentNum: undefined,commentPlaceHolder: "",}},methods: {/*** 获取高宽比 乘以 100%*/getAspectRatio(url) {// uni.getImageInfo({// 	src: url,// 	success: function(res) {// 		let aspectRatio = res.height * 100.0 / res.width;// 		// console.log("aspectRatio:" + aspectRatio);// 		return aspectRatio + "%";// 	}// });return pictureApi.getAspectRatio(url);},/*** 关注用户*/follow() {let data = {followedId: this.productVo.userId}addFollow(data).then(res => {this.hadFollow = true;this.$refs.uToast.show({type: 'success',message: "关注成功",duration: 300})}).catch(err => {this.$refs.uToast.show({type: 'error',message: err.msg,duration: 300})})},/*** 取消关注*/cancelFollow() {cancelFollowSomeone(this.productVo.userId).then(res => {this.hadFollow = false;this.$refs.uToast.show({type: 'success',message: "取消关注成功",duration: 300})})},/*** 查询是否已经关注了用户*/searchWhetherFollow() {hadFollowSomeone(this.productVo.userId).then(res => {// console.log("res:" + JSON.stringify(res));this.hadFollow = res.hadFollow;// console.log("this.hadFollow :" + this.hadFollow);})},/*** 收藏商品*/starProduct() {starProduct(this.productVo.id).then(res => {this.hadStar = true;this.getProduct();this.$refs.uToast.show({type: 'success',message: "收藏成功",duration: 300})})},/*** 取消收藏*/cancelStar() {cancelStar(this.productVo.id).then(res => {this.hadStar = false;this.getProduct();this.$refs.uToast.show({type: 'success',message: "取消收藏成功",duration: 300})})},/*** 点赞评论*/likeComment(commentId, comment) {// console.log("comment:" + JSON.stringify(comment))likeComment(commentId).then(res => {comment.isLike = 1;comment.likeNum += 1;this.$refs.uToast.show({type: 'success',message: "点赞成功",duration: 300})})},/*** 取消点赞评论*/cancelLikeComment(commentId, comment) {cancelLikeComment(commentId).then(res => {comment.isLike = 0;comment.likeNum -= 1;this.$refs.uToast.show({type: 'success',message: "取消点赞成功",duration: 300})})},/*** 查询是否已经关注了用户*/searchWhetherStar() {hadStar(this.productVo.id).then(res => {// console.log("res:" + JSON.stringify(res));this.hadStar = res.hadStar;// console.log("this.hadFollow :" + this.hadFollow);})},/*** 显示底部弹出框*/clickShowBottomPopup(type, itemId, username = undefined) {this.showBottomPopup = true;this.comment.type = type;this.comment.itemId = itemId;if (type == 0) {this.commentPlaceHolder = "想要了解更多信息,可以评论让商品主人看见哟";} else {this.commentPlaceHolder = "正在回复" + username + "";}},/*** 发表评论*/commitComment() {// console.log("发送评论,comment:" + JSON.stringify(this.comment))addComment(this.comment).then(res => {this.showBottomPopup = false;this.comment.content = '';this.listCommentVoOfProduct();this.$refs.uToast.show({type: 'success',message: "评论发送成功",duration: 300})})},/*** 获取商品对应的所有评论*/listCommentVoOfProduct() {listCommentVoOfProduct(this.productVo.id).then(res => {// console.log("listCommentVoOfProduct:" + JSON.stringify(res));this.commentVoList = res.tree;this.commentNum = res.commentNum;})},/*** 格式化日期* @param {Object} date*/formatDateToString(dateStr) {let date = new Date(dateStr);// 月份需要加一return date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate();},/*** 获取商品详细信息,同时增加阅读量*/getProduct() {getProduct(this.productVo.id).then(res => {console.log("product:" + JSON.stringify(res.data));this.product = res.data;})}},onLoad(e) {this.productVo = JSON.parse(decodeURIComponent(e.productVo));this.searchWhetherFollow();this.searchWhetherStar();this.listCommentVoOfProduct();this.getProduct();// console.log("productVo:" + JSON.stringify(productVo));}}
</script><style lang="scss">.container {// padding: 20rpx;background: #F7F7F7;.userItem {display: flex;align-items: center;justify-content: space-between;background: #ffffff;padding: 20rpx;.userProfile {display: flex;.nickname {color: #202020;font-weight: bold;font-size: 14px;}.other {color: #A6A4A5;font-size: 11px;}}.follow {display: flex;align-items: center;font-weight: bold;color: #ffffff;background: #2B92FF;border-radius: 20px;padding: 4px 8px;}.followed {background: #F6F6F6;border-radius: 20px;padding: 4px 8px;}}.productItem {background: #ffffff;padding: 20rpx;.top {display: flex;align-items: center;justify-content: space-between;.price {color: #F84442;font-weight: bold;.number {font-size: 30px;}}.browseInformation {color: #A6A4A5;font-size: 14px;}}.productDetail {margin-top: 20rpx;margin-bottom: 10rpx;color: #4C4C4C;font-size: 15px;line-height: 30px;font-weight: bold;}}.commentView {margin-top: 10px;// 用来预留展示 footer 的高度,不然footer会挡住评论margin-bottom: calc(60px + 10rpx);background: #ffffff;padding: 30rpx 30rpx;.nickname {font-size: 14px;color: #B9B9B9;}.content {margin: 5px;// 解决英文字符串、数字不换行的问题word-break: break-all;word-wrap: break-word;}.dateAndPosition {font-size: 11px;color: #B9B9B9;}.commentItem {display: flex;margin: 10px;justify-content: space-between;}.sonCommentItem {display: flex;margin: 10px 10px 10px 50px;justify-content: space-between;}}.footer {padding: 20rpx;position: fixed;// right: 20rpx;bottom: 0rpx;background: #ffffff;height: 60px;width: 710rpx;padding-top: 2px;display: flex;align-items: center;justify-content: space-between;.item {display: inline-block;text-align: center;margin-right: 10px;.comment {font-size: 10px;}}.chat {display: flex;align-items: center;background-color: #2B92FF;border-radius: 20px;padding: 7px;color: #ffffff;// margin-right: 20px;font-size: 12px;}}.commentPopup {display: flex;padding: 10px;min-height: 200rpx;.commentButton {background-color: #2B92FF;border-radius: 5px;padding: 7px;color: #ffffff;font-size: 12px;height: 20px;display: flex;align-items: center;}}}
</style>

日期格式化

有时候后端传递过来的日期格式直接在前端页面中展示不太美观或简洁,那就可以自己写一个日期格式化方法,将日期转化为我们需要的格式来显示

/*** 格式化日期* @param {Object} date*/
formatDateToString(dateStr) {let date = new Date(dateStr);// 月份需要加一return date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate();
},

后端

收藏

Controller

为了便于商品数据的查询,我在数据库设计的时候给商品表增加了收藏数的冗余字段,因此每次收藏商品或者取消商品的收藏的同时,需要更新商品表的收藏数

在这里插入图片描述

/*** 收藏商品*/
@PreAuthorize("@ss.hasPermi('market:star:star')")
@GetMapping("/starProduct/{productId}")
public AjaxResult starProduct(@PathVariable("productId") Long productId) {Star star = new Star();star.setUserId(getLoginUser().getUserId());star.setProductId(productId);boolean isStar = starService.addStar(star);if (isStar){// 需要将商品的收藏量+1productService.starNumPlusOne(productId);}return AjaxResult.success();
}

Service

package com.shm.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.entity.Star;
import com.shm.mapper.StarMapper;
import com.shm.service.IStarService;
import org.springframework.stereotype.Service;/**
* @author dam
* @description 针对表【collection(收藏表)】的数据库操作Service实现
* @createDate 2023-08-09 19:41:23
*/
@Service
public class IStarServiceImpl extends ServiceImpl<StarMapper, Star>implements IStarService {@Overridepublic boolean addStar(Star star) {return baseMapper.addStar(star);}
}

mapper

public interface StarMapper extends BaseMapper<Star> {boolean addStar(@Param("star") Star star);
}

将商品添加收藏的时候,需要先判断同样的收藏数据不存在于数据库中才执行插入操作,否则如果用户网络卡顿并多次发送收藏请求,数据库会出现冗余的脏数据

<insert id="addStar">INSERT INTO `star` (`user_id`, `product_id`)SELECT #{star.userId},#{star.productId} FROM DUALWHERE NOT EXISTS (SELECT 1 FROM `star`WHERE `user_id` = #{star.productId} AND `product_id` = #{star.productId} limit 1);
</insert>

评论

Controller

/*** 获取商品对应的所有评论** @param productId* @return*/
@PreAuthorize("@ss.hasPermi('market:comment:list')")
@GetMapping("/listCommentVoOfProduct/{productId}")
public AjaxResult listCommentVoOfProduct(@PathVariable("productId") Long productId) {// 查询出商品对应的所有评论数据List<CommentVo> commentVoList = commentService.listCommentVoOfProduct(productId, getLoginUser().getUserId());int commentNum = commentVoList.size();// 将评论数据封装成树形结构List<CommentVo> tree = commentService.buildTree(commentVoList);return AjaxResult.success().put("tree", tree).put("commentNum", commentNum);
}

Service

需要注意的是,这里的树形结构只有两层数据(针对商品的评论为一层,针对评论的所有评论为一层),因为小程序不方便显示太多层数据,否则宽度会非常大,用户需要反复滑动来查看完整的评论
在这里插入图片描述

在这里插入图片描述

@Override
public List<CommentVo> listCommentVoOfProduct(Long productId, Long userId) {return commentMapper.listCommentVoOfProduct(productId, userId);
}/*** 将评论数据封装成树形结构** @param commentVoList* @return*/
@Override
public List<CommentVo> buildTree(List<CommentVo> commentVoList) {// 将所有父级评论过滤出来List<CommentVo> fatherList = commentVoList.stream().filter((item) -> {return item.getType() == 0;}).collect(Collectors.toList());commentVoList.removeAll(fatherList);// 为所有父级评论寻找孩子for (CommentVo father : fatherList) {father.setChildren(new ArrayList<>());this.searchSon(father.getId(), father.getUserNickName(), father.getChildren(), commentVoList);}return fatherList;
}/*** 寻找孩子** @param fatherId* @param children* @param commentVoList*/
private void searchSon(Long fatherId, String fatherNickName, List<CommentVo> children, List<CommentVo> commentVoList) {for (CommentVo commentVo : commentVoList) {if (commentVo.getItemId().equals(fatherId)) {commentVo.setToUserNickName(fatherNickName);children.add(commentVo);this.searchSon(commentVo.getId(), commentVo.getUserNickName(), children, commentVoList);}}
}

Mapper

这段sql非常复杂,一次性将评论的主人昵称、头像、评论的点赞数量查出来了,同时还使用递归查询来不断查询出评论的子评论。我目前不能保证这段sql的效率,只是实现了功能,后面如果性能不足,我再想办法优化

<select id="listCommentVoOfProduct" resultType="com.ruoyi.common.core.domain.vo.CommentVo">SELECTct.id,ct.user_id,ct.item_id,ct.type,ct.content,ct.create_time,u.nick_name AS userNickName,u.avatar AS userAvatar,CASEWHEN cl.user_id IS NULL THEN0 ELSE 1END AS isLike,ct.LEVEL,COALESCE ( likeNum, 0 ) AS likeNumFROM(WITH RECURSIVE comment_tree AS (SELECTid,user_id,item_id,type,content,create_time,0 AS LEVELFROMCOMMENTWHEREitem_id = #{productId} and type=0UNION ALLSELECTc.id,c.user_id,c.item_id,c.type,c.content,c.create_time,ct.LEVEL + 1 AS LEVELFROMCOMMENT cINNER JOIN comment_tree ct ON c.item_id = ct.idWHEREc.type = 1) SELECT*FROMcomment_tree) ctLEFT JOIN ( SELECT comment_id, COUNT(*) AS likeNum FROM comment_like WHERE is_deleted = 0 GROUP BY comment_id ) pc ON ct.id = pc.comment_idLEFT JOIN sys_user AS u ON ct.user_id = u.user_idLEFT JOIN comment_like cl ON ct.id = cl.comment_idAND cl.user_id = #{userId} and cl.is_deleted =0</select>

商品

Controller

/*** 获取商品详细信息*/
@PreAuthorize("@ss.hasPermi('market:product:query')")
@GetMapping(value = "/{id}")
@Transactional // 同时处理多个表,添加事务
public AjaxResult getInfo(@PathVariable("id") Long id) {// 首先判断用户有没有阅读该商品boolean isAdd = productReadService.addRead(new ProductRead(getLoginUser().getUserId(), id));if (isAdd) {// 需要将商品的阅读量+1productService.readNumPlusOne(id);}return success(productService.getById(id));
}

阅读

Service

<insert id="addRead">INSERT INTO `product_read` (`user_id`, `product_id`)SELECT #{productRead.userId},#{productRead.productId} FROM DUALWHERE NOT EXISTS (SELECT 1 FROM `product_read`WHERE `user_id` = #{productRead.userId} AND `product_id` = #{productRead.productId} limit 1);</insert>

相关文章:

【UniApp开发小程序】商品详情展示+评论、评论展示、评论点赞+商品收藏【后端基于若依管理系统开发】

文章目录 界面效果界面实现工具js页面日期格式化 后端收藏ControllerServicemapper 评论ControllerServiceMapper 商品Controller 阅读Service 界面效果 【说明】 界面中商品的图片来源于闲鱼&#xff0c;若侵权请联系删除 【商品详情】 【评论】 界面实现 工具js 该工…...

rabbitMq安装后无法启动可视化页面http://localhost:15672处理

本次安装环境信息&#xff1a; 系统&#xff1a;win10 64位专业版 erlang&#xff1a;otp_win64_23.0 rabbitMQ&#xff1a;rabbitmq-server-3.8.5 安装rabbitMQ需要依赖erlang语言环境&#xff0c;所以需要我们下载erlang的环境安装程序。 一、下载安装程序 rabbitMQ安装…...

材料行业可以转IC设计后端吗?

近来有许多材料行业的小伙伴通过后台来问我对于职业规划的看法&#xff0c;甚至有些小伙伴直接点明了某个行业适不适合自己&#xff0c;那么我这边仅以近年来比较热门的数字芯片设计来展开讲讲&#xff0c;材料适不适合转行做IC呢。 对于理工科的同学而言&#xff0c;选择哪个…...

vue3 基础知识

vue3创建一个项目 PS D:\code> npm init vuelatestVue.js - The Progressive JavaScript Framework√ Add TypeScript? ... No / Yes √ Add JSX Support? ... No / Yes √ Add Vue Router for Single Page Application development? ... No / Yes √ Add Pinia for sta…...

【线性代数-3Blue1Brown】- 2 线性组合、张成的空间与基

飞书原文链接&#xff1a;Docs...

Kafka—工作流程、如何保证消息可靠性

什么是kafka&#xff1f; 分布式事件流平台。希望不仅仅是存储数据&#xff0c;还能够数据存储、数据分析、数据集成等功能。消息队列&#xff08;把数据从一方发给另一方&#xff09;&#xff0c;消息生产好了但是消费方不一定准备好了&#xff08;读写不一致&#xff09;&am…...

用户参与策略:商城小程序的搭建与营销

在现今数字化时代&#xff0c;商城小程序已成为企业私域营销的利器。然而&#xff0c;要使商城小程序在竞争激烈的市场中脱颖而出&#xff0c;不仅需要出色的产品&#xff0c;还需要一个引人入胜的用户参与策略。本文将深入探讨如何在商城小程序中构建和落实有效的用户参与策略…...

可自定义实时监控系统HertzBeat

什么是 HertzBeat &#xff1f; HertzBeat是一个拥有强大自定义监控能力&#xff0c;无需 Agent 的开源实时监控告警系统。集 监控告警通知 为一体&#xff0c;支持对应用服务&#xff0c;数据库&#xff0c;操作系统&#xff0c;中间件&#xff0c;云原生&#xff0c;网络等监…...

无涯教程-Perl - sysread函数

描述 该函数等效于C /操作系统函数read(),因为它绕过了诸如print,read和seek之类的函数所采用的缓冲系统,它仅应与相应的syswrite和sysseek函数一起使用。 它从FILEHANDLE中读取LENGTH个字节,并将输出放入SCALAR中。如果指定了OFFSET,则将数据从OFFSET字节写入SCALAR,从而有效…...

Redis数据结构之String

String 类型是 Redis 的最基本的数据类型&#xff0c;一个 key 对应一个 value&#xff0c;可以理解成与Memcached一模一样的类型。 String 类型是二进制安全的&#xff0c;意思是 Redis 的 String 可以包含任何数据&#xff0c;比如图片或者序列化的对象&#xff0c;一个 Redi…...

React源码解析18(8)------ 实现单节点的Diff算法

摘要 经过之前的几篇文章&#xff0c;我们已经实现了一个可以进行更新渲染的假React。但是如果我们把我们的jsx修改成这样&#xff1a; function App() {const [age, setAge] useState(20)const click function() {setAge(age 1)}return age % 2 0 ? jsx("div"…...

并查集路径压缩(Java 实例代码)

目录 并查集路径压缩 Java 实例代码 UnionFind3.java 文件代码&#xff1a; 并查集路径压缩 并查集里的 find 函数里可以进行路径压缩&#xff0c;是为了更快速的查找一个点的根节点。对于一个集合树来说&#xff0c;它的根节点下面可以依附着许多的节点&#xff0c;因此&am…...

Educational Codeforces Round 153 (Rated for Div. 2)

A.我直接构造&#xff08;&#xff08;&#xff08;&#xff09;&#xff09;&#xff09;&#xff09;和&#xff08;&#xff09;&#xff08;&#xff09;&#xff08;&#xff09;这种了&#xff0c;因为这两种都很简便&#xff0c;只有&#xff08;&#xff09;和&#xf…...

分布式 | 如何搭建 DBLE 的 JVM 指标监控系统

本篇文章采用 Docker 方式搭建 Grafana Prometheus 实现对 DBLE 的 JVM 相关指标的监控系统。 作者&#xff1a;文韵涵 爱可生 DBLE 团队开发成员&#xff0c;主要负责 DBLE 需求开发&#xff0c;故障排查和社区问题解答。 本文来源&#xff1a;原创投稿 爱可生开源社区出品&a…...

下线40万辆,欧拉汽车推出2023款好猫尊荣型和GT木兰版

欧拉汽车是中国新能源汽车制造商&#xff0c;成立于2018年。截至目前&#xff0c;已经下线了40万辆整车&#xff0c;可见其在市场的影响力和生产实力。为了庆祝这一里程碑&#xff0c;欧拉汽车推出了品牌书《欧拉将爱进行到底》&#xff0c;在其中讲述了欧拉汽车的发展历程和未…...

【Python】使用python解析someip报文,以someip格式打印报文

文章目录 1.安装scapy库2.解析someip格式报文3.示例 1.安装scapy库 使用 pip 安装 scapy 第三方库&#xff0c;打开 cmd&#xff0c;输入以下命令&#xff1a; pip install scapy出现如图所示&#xff0c;表示安装成功&#xff1a; 2.解析someip格式报文 要解析someip格式报…...

C#与西门子PLC1500的ModbusTcp服务器通信2--ModbusTcp协议

Modbus TCP是近年来越来越流行的工业控制系统通信协议之一&#xff0c;与其他通信协议相比&#xff0c;Modbus TCP通信速度快、可靠性高、兼容性强、适用于模拟或数字量信号的传输&#xff0c;阅读本文前你必须比较熟悉Modbus协议&#xff0c;了解tcp网络。 一、什么是Modbus …...

SpringBoot + MyBatis-Plus构建树形结构的几种方式

1. 树形结构 树形结构&#xff0c;是指&#xff1a;数据元素之间的关系像一颗树的数据结构。由树根延伸出多个树杈 它具有以下特点&#xff1a; 每个节点都只有有限个子节点或无子节点&#xff1b;没有父节点的节点称为根节点&#xff1b;每一个非根节点有且只有一个父节点&a…...

linux vscode 下开发

linux vscode 下开发 javajdk插件查看调用层次 java jdk 各种JAVA JDK的镜像分发 编程宝库 - 技术改变世界 jdk 镜像 ubuntu22.04 安装 # Linux x64 64位 jdk-8u351-linux-x64.tar.gztar -zxf jdk-8u351-linux-x64.tar.gz mv jdk1.8.0_351 jdk8/ vim ~/.pr…...

【工具】python代码编辑器--PyCharm下载安装和介绍

PyCharm是一种Python IDE(集成开发环境),由JetBrains打造。它带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制等。此外,PyCharm还提供了一些高级功能,以用于支持Django框…...

SpringBoot第44讲:SpringBoot集成Redis - Redis分布式锁的实现之Jedis(setNXPX+Lua)

SpringBoot第44讲&#xff1a;SpringBoot集成Redis - Redis分布式锁的实现之Jedis(setNXPXLua) Redis实际使用场景最为常用的还有通过Redis实现分布式锁。本文是SpringBoot第44讲&#xff0c;主要介绍Redis实现分布式锁 文章目录 SpringBoot第44讲&#xff1a;SpringBoot集成Re…...

STM32F4X USART串口使用

STM32F4X USART串口使用 串口概念起始位波特率数据位停止位校验位串口间接线 STM32F4串口使用步骤GPIO引脚复用函数串口初始化函数串口例程 串口概念 串口是MCU与外部通信的重要通信接口&#xff0c;也是MCU在开发过程中的调试利器。串口通信有几个重要的参数&#xff0c;分别…...

python实现两个字符串比对差异点

一:代码实现 import difflib, re# 比较两个文本差异点 def compare_text_index(text1, text2):# 创建SequenceMatcher对象matcher = difflib.SequenceMatcher(a=text1, b=text2)# 获取差异报告diff_report = matcher.get_opcodes()# 检查差异报告中是否存在关键词错误for tag…...

SQLite数据库实现数据增删改查

当前文章介绍的设计的主要功能是利用 SQLite 数据库实现宠物投喂器上传数据的存储&#xff0c;并且支持数据的增删改查操作。其中&#xff0c;宠物投喂器上传的数据包括投喂间隔时间、水温、剩余重量等参数。 实现功能&#xff1a; 创建 SQLite 数据库表&#xff0c;用于存储宠…...

【Golang系统开发】搜索引擎(2) 压缩词典

写在前面 这篇文章我们就给出一系列的数据结构&#xff0c;使得词典能达到越来越高的压缩比。当然&#xff0c;和倒排索引记录表的大小相比&#xff0c;词典只占据了非常小的空间。那么为什么要对词典进行压缩呢&#xff1f; 这是因为决定信息检索系统的查询响应时间的一个重…...

clickhouse修改默认密码

1.明文密码 vim /etc/clickhouse-server/users.xml找到下面的语句,增加明文密码 <password>123456789</password> 2. sha256密码 # echo -n 123456789 | openssl dgst -sha256 (stdin) 15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225 修改…...

基于java在线捐赠系统设计与实现

摘要 近年来&#xff0c;随着网络的快速发展&#xff0c;由于网络的开放性和便利性&#xff0c;具有广阔的发展前景。 本文设计并实现了医药捐赠系统。通过分析确定由两个不同的用户组成&#xff0c;每个用户具有不同的功能。它还可以帮助用户在线求助、申请项目、发表留言等&a…...

【前端】vscode javascript 代码片段失效问题解决

1. 文件--首选项--用户代码片段-vue.json : 添加 // { // // Place your global snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and // // description. Add comma separated ids of the languages where the snippet is app…...

AE-卡通人物解说动画视频的制作

目录 1.导入卡通人物图片和音频文件 2.新建合成 3.在卡通人物图片上添加效果和表达式 4.在音频文件上添加效果和表达式 5.将卡通人物中的 CC Split2 中分割1 表达式链接到滑块中 6.卡通人物根据音频文件自动匹配口型。 AE制作卡通人物解说视频&#xff0c;卡通人物口型根据…...

Linux 查看日志

在 Linux 中&#xff0c;内核日志使用 printk 函数进行输出。你可以通过以下方法查看 printk 的日志&#xff1a; 使用 dmesg 命令&#xff1a; dmesg 这个命令会显示内核环缓冲区中的日志消息&#xff0c;包括使用 printk 输出的消息。你可以通过滚动浏览输出来查看完整的日志…...

政府门户网站建设管理/下载百度软件

1、吞吐率 简单的说吞吐率就是指在一指定时间内由一处传输到另一处或被处理的数据量。以太网吞吐率的单位为"兆比特每秒"或"Mb/s"。...

监控做斗鱼直播网站/有道搜索引擎入口

&#xfeff;&#xfeff;作者 | Moses Olafenwa翻译 | 林椿眄出品 | 人工智能头条&#xff08;公众号ID&#xff1a;AI_Thinker&#xff09;作为人工智能的一个重要领域&#xff0c;计算机视觉是一门可以识别并理解图像和场景的计算机及软件系统科学。该领域主要包括图像识别&…...

局域网下怎么访问自己做的网站/产品推广计划

弹性模量越大说明什么(弹性模量和泊松比)轴向拉伸&#xff1a;杆件沿轴线方向的变形称为轴向变形或纵向变形&#xff0c;垂直于轴线方向的变形称为横向变形。杆的纵向绝对变形△l和横向绝对变形△d的计算公式&#xff1a;杆件变形程度的衡量方法&#xff1a;为了准确地反映变形…...

wordpress后台操作教程/昭通网站seo

今天看视频教程无意间看到了一个数3减1的问题&#xff0c;百度之发现叫约瑟夫环问题&#xff0c;于是写了程序&#xff0c;问题大致描述如下&#xff1a; 一群带有编号的孩子手拉手围成一个圈报数&#xff0c;开始的孩子数1&#xff0c;他右边数2&#xff0c;再右边数3&#xf…...

潜江资讯网招聘/如何优化关键词排名快速首页

软件功能测试对于保证软件质量至关重要。一个系统由几个组件组成&#xff0c;这些组件必须全部单独工作&#xff0c;也必须相互工作&#xff0c;才能实现稳健的功能。这些方面必须通过深入的功能测试来验证。软件功能测试的重点仍然主要是可访问性、可用性和主要功能测试。那么…...

临沂网站制作计划/免费seo关键词优化排名

Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用&#xff0c;和丰富的 HTTP 工具。 使用 Express 可以快速地搭建一个完整功能的网站。Express 框架核心特性&#xff1a;可以设置中间件来响应 HTTP 请求。定义了路由表用于执行不…...