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

动力节点王鹤SpringBoot3笔记——第八章 文章管理模块

目录

第八章  文章管理模块

8.1  配置文件 

8.2 视图文件

8.3 Java代码


第八章  文章管理模块

创建新的Spring Boot项目,综合运用视频中的知识点,做一个文章管理的后台应用。 新的Spring Boot项目Lession20-BlogAdmin。Maven构建工具,包名称com.bjpowernode.blog JDK19,依赖:

  • Spring Web
  • Lombok
  • Thymeleaf
  • MyBatis Framework
  • MySQL Driver

依赖还需要Bean Validation 需求:文章管理工作,发布新文章,编辑文章,查看文章内容等 

8.1  配置文件 

组织配置文件 

 app-base.yml

article:#最低文章阅读数量low-read: 10#首页显示最多的文章数量top-read: 20

db.yml

spring:datasource:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/blog?serverTimezone=Asia/Shanghaiusername: rootpassword: 123456hikari:auto-commit: truemaximum-pool-size: 10minimum-idle: 10#获取连接时,检测语句connection-test-query: select 1connection-timeout: 20000#其他属性data-source-properties:cachePrepStmts: truedataSource.cachePrepStmtst: truedataSource.prepStmtCacheSize: 250dataSource.prepStmtCacheSqlLimit: 2048dataSource.useServerPrepStmts: true

8.2 视图文件

logo文件
favicon.ico放在static/ 根目录下

创建模板页面 

 articleList.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>文章列表</title><link rel="icon" href="../favicon.ico" type="image/x-icon"/><script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<body><div style="margin-left: 200px"><h3>阅读最多的前10篇文章</h3><table  border="1px"  cellspacing="0px" cellpadding="2px"><thead><th>选择</th><th>序号</th><th>标题</th><th>副标题</th><th>已读数量</th><th>发布时间</th><th>最后修改时间</th><th>编辑</th></thead><tbody><tr th:each="article,loopStats : ${articleList}"><td><input type="checkbox" th:value="${article.id}"></td><td th:text="${loopStats.index+1}"></td><td th:text="${article.title}"></td><td th:text="${article.summary}"></td><td th:text="${article.readCount}"></td><td th:text="${article.createTime}"></td><td th:text="${article.updateTime}"></td><td><a th:href="@{/article/get(id=${article.id})}">编辑</a></td></tr><tr><td colspan="8"><table width="100%"><tr><td><button id="add" onclick="addArticle()">发布新文章</button></td><td><button id="delete" onclick="deleteArticle()">删除文章</button></td><td><button id="read" onclick="readOverview()">文章概览</button></td></tr></table></td></tr></tbody></table><form id="frm" th:action="@{/view/addArticle}" method="get"></form><form id="delfrm" th:action="@{/article/removeArticle}" method="post"><input type="hidden" id="idsDom" name="ids" value="" ></form></div><script type="text/javascript">function addArticle(){$("#frm").submit();}function deleteArticle(){var ids = [];$("input[type='checkbox']:checked").each( (index,item)=>{ids.push( item.value );})$("#idsDom").val(ids);$("#delfrm").submit();}function readOverview(){var ids = [];$("input[type='checkbox']:checked").each( (index,item)=>{ids.push( item.value );})if( ids.length != 1){alert("选择一个文章查看");return;}$.get("../article/detail/overview", { id:ids[0] }, (data,status)=>{alert(data)} )}</script>
</body>
</html>

bind.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div style="margin-left: 200px"><div th:each="field:${errors}"><div th:text="${field.field}"></div><div th:text="${field.defaultMessage}"></div></div></div>
</body>
</html>

error.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div style="margin-left: 200px"><div th:text="${error}"></div></div>
</body>
</html>

8.3 Java代码

 java代码 

model包: 

 ArticleVO.java

@Data
public class ArticleVO {private Integer id;private Integer userId;private String title;private String summary;private String content;private Integer readCount;private LocalDateTime createTime;private LocalDateTime updateTime;
}

ArticleParam.java

package com.bjpowernode.blog.model.param;import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.awt.PageAttributes.MediaType;
import lombok.Data;
import lombok.NonNull;
import org.hibernate.validator.constraints.Range;@Datapublic class ArticleParam {public static interface AddArticle {};public static interface EditArticle {};@NotNull(message = "修改时必须有id",groups = EditArticle.class)@Min(value = 1,message = "id必须从{value}开始",groups = EditArticle.class)private Integer id;@NotBlank(message = "请输入文章标题",groups ={ AddArticle.class, EditArticle.class })@Size(min = 2,max = 20,message = "文章标题{min}-{max}",groups ={ AddArticle.class, EditArticle.class })private String title;@NotBlank(message = "请输入文章副标题",groups ={ AddArticle.class, EditArticle.class })@Size(min = 10,max = 30,message = "文章副标题{min}-{max}",groups ={ AddArticle.class, EditArticle.class })private String summary;@NotBlank(message = "请输入文章副标题",groups ={ AddArticle.class, EditArticle.class })@Size(min = 50,max = 8000,message = "文章至少五十个字,文章至多八千字",groups ={ AddArticle.class, EditArticle.class })private String content;
}

ArticleDTO.java

@Data
public class ArticleDTO {private Integer id;private Integer userId;private String title;private String summary;private Integer readCount;private String content;private LocalDateTime createTime;private LocalDateTime updateTime;
}

po包

 ArticlePO.java

@Data
public class ArticlePO {private Integer id;private Integer userId;private String title;private String summary;private Integer readCount;private LocalDateTime createTime;private LocalDateTime updateTime;
}

ArticleDetailPO.java

@Data
public class ArticleDetailPO {private Integer id;private Integer articleId;private String content;
}

mapper包

 ArticleMapper.java

package com.bjpowernode.blog.mapper;public interface ArticleMapper {@Select("""select id,user_id,title,summary,read_count,create_time,update_timefrom articlewhere read_count >=#{lowRead}order by read_count desclimit #{topRead}""")@Results(id = "ArticleBaseMap", value = {@Result(id = true, column = "id", property = "id"),@Result(column = "user_id", property = "userId"),@Result(column = "title", property = "title"),@Result(column = "summary", property = "summary"),@Result(column = "read_count", property = "readCount"),@Result(column = "create_time", property = "createTime"),@Result(column = "update_time", property = "updateTime"),})List<ArticlePO> topSortByReadCount(Integer lowRead, Integer topRead);@Insert("""insert into article(user_id,title,summary,read_count,create_time,update_time) \values(#{userId},#{title},#{summary},#{readCount},#{createTime},#{updateTime})""")@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")int insertArticle(ArticlePO articlePO);@Insert("""insert into article_detail(article_id, content) values (#{articleId},#{content}) """)int insertArticleDetail(ArticleDetailPO articleDetailPO);@Select("""select m.id as articleId,title,summary,content from article m left join article_detail ad on m.id = ad.article_idwhere m.id=#{id}""")@Results({@Result(id = true, column = "articleId", property = "id"),@Result(column = "title", property = "title"),@Result(column = "summary", property = "summary"),@Result(column = "content", property = "content", jdbcType = JdbcType.LONGVARCHAR, javaType = String.class)})ArticleDTO selectArticleAndDetail(Integer id);//更新文章title,summary@Update("""update article set title=#{title},summary=#{summary} where id=#{id}""")int updateArticle(ArticlePO articlePO);@Update("""update article_detail set content=#{content} where article_id=#{articleId}""")int updateArticleDetail(ArticleDetailPO articleDetailPO);//<script>动态sql</script>@Delete("""<script>delete from article where id in<foreach item="id" collection="list" open="(" separator="," close=")">#{id}</foreach></script>""")int deleteArticle(List<Integer> ids);@Delete("""<script>delete from article_detail where id in<foreach item="id" collection="list" open="(" separator="," close=")">#{id}</foreach></script>""")int deleteArticleDetail(List<Integer> ids);@Select("""select id,article_id,content from article_detailwhere article_id= #{id}""")ArticleDetailPO selectDetailByArticleId(Integer id);
}

 ArticleService.java

public interface ArticleService {List<ArticlePO> queryTopAritcle();boolean addArticle(ArticleDTO article);boolean modifyArticle(ArticleParam param);int removeArticle(List<Integer> ids);ArticleDTO queryByArticleId(Integer id);String queryTop20Detail(Integer id);
}

ArticleServiceImpl.java

@RequiredArgsConstructor
@Service
public class ArticleServiceImpl implements ArticleService {private final ArticleMapper articleMapper;private final ArticleSettings articleSettings;@Overridepublic List<ArticlePO> queryTopAritcle() {Integer lowRead = articleSettings.getLowRead();Integer topRead = articleSettings.getTopRead();return articleMapper.topSortByReadCount(lowRead, topRead);}@Transactional(rollbackFor = Exception.class)@Overridepublic boolean addArticle(ArticleDTO article) {ArticlePO articlePO = new ArticlePO();articlePO.setTitle(article.getTitle());articlePO.setSummary(article.getSummary());//从登陆信息中获取,现在给个默认articlePO.setUserId(new Random().nextInt(1000));articlePO.setReadCount(new Random().nextInt(50));articlePO.setCreateTime(LocalDateTime.now());articlePO.setUpdateTime(LocalDateTime.now());articleMapper.insertArticle(articlePO);ArticleDetailPO articleDetailPO = new ArticleDetailPO();articleDetailPO.setArticleId(articlePO.getId());articleDetailPO.setContent(article.getContent());articleMapper.insertArticleDetail(articleDetailPO);return true;}@Transactional(rollbackFor = Exception.class)public boolean modifyArticle(ArticleParam param){ArticlePO  articlePO = new ArticlePO();articlePO.setId(param.getId());articlePO.setTitle(param.getTitle());articlePO.setSummary(param.getSummary());int editArticle = articleMapper.updateArticle(articlePO);ArticleDetailPO detailPO = new ArticleDetailPO();detailPO.setArticleId(param.getId());detailPO.setContent(param.getContent());int editDetail = articleMapper.updateArticleDetail(detailPO);if( editArticle > 0 && editDetail > 0 ){return true;}return false;}@Transactional(rollbackFor = Exception.class)@Overridepublic int removeArticle(List<Integer> ids) {int master = articleMapper.deleteArticle(ids);int detail = articleMapper.deleteArticleDetail(ids);return master;}@Overridepublic ArticleDTO queryByArticleId(Integer id) {return articleMapper.selectArticleAndDetail(id);}@Overridepublic String queryTop20Detail(Integer id) {ArticleDetailPO articleDetailPO = articleMapper.selectDetailByArticleId(id);String content = articleDetailPO.getContent();if(StringUtils.hasText(content)){content = content.substring(0, content.length() >=20 ? 20 : content.length());}return content;}
}

 ArticleController.java

@RequiredArgsConstructor
@Controller
public class ArticleController {private final ArticleService articleService;@GetMapping( value = {"/", "/article/hot"})public String showHotArticle(Model model){List<ArticlePO> articlePOList = articleService.queryTopAritcle();//转为VOList<ArticleVO> articleVOList = BeanUtil.copyToList(articlePOList, ArticleVO.class);//存储数据model.addAttribute("articleList", articleVOList);//视图return "/blog/articleList";}//添加文章@PostMapping("/article/add")public String addArticle(@Validated(ArticleParam.AddArticle.class) ArticleParam param){ArticleDTO article = new ArticleDTO();article.setTitle(param.getTitle());article.setSummary(param.getSummary());article.setContent(param.getContent());boolean add = articleService.addArticle(article);return "redirect:/article/hot";}//查询文章@GetMapping("/article/get")public String queryById(Integer id, Model model){ArticleDTO articleDTO = articleService.queryByArticleId(id);ArticleVO articleVO = BeanUtil.copyProperties(articleDTO, ArticleVO.class);model.addAttribute("article",articleVO);return "/blog/editArticle";}//修改文章@PostMapping("/article/edit")public String modifyArticle(@Validated(ArticleParam.EditArticle.class) ArticleParam param){boolean edit = articleService.modifyArticle(param);return "redirect:/article/hot";}//删除文章@PostMapping("/article/removeArticle")public String removeArticle(@RequestParam("ids") IdType idType){System.out.println("ids="+idType);if(idType.getIdList() == null){throw new IdNullException("Id为null");}articleService.removeArticle(idType.getIdList());return "redirect:/article/hot";}//查询文章开始的20个字@GetMapping("/article/detail/overview")@ResponseBodypublic String queryDetail(Integer id){String top20Content = articleService.queryTop20Detail(id);return  top20Content;}
}

 IdNullException.java

public class IdNullException extends BlogRootException{public IdNullException() {super();}public IdNullException(String message) {super(message);}
}

BlogRootException.java

public class BlogRootException extends RuntimeException{public BlogRootException() {super();}public BlogRootException(String message) {super(message);}
}

GlobalHandleException.java

@ControllerAdvice
public class GlobalHandleException {@ExceptionHandler( BindException.class)public String handlerBindException(BindException bindException, Model model){BindingResult result = bindException.getBindingResult();if( result.hasErrors()){model.addAttribute("errors",result.getFieldErrors());System.out.println("result.getFieldErrors()="+result.getFieldErrors().size());}return "/blog/error/bind";}@ExceptionHandler( Exception.class)public String handlerDefaultException(Exception exception, Model model){model.addAttribute("msg","请稍后重试!!!");return "/blog/error/error";}
}

 IdType.java

@Data
public class IdType {private List<Integer> idList;
}

IdTypeFormatter.java

public class IdTypeFormatter implements Formatter<IdType> {@Overridepublic IdType parse(String text, Locale locale) throws ParseException {IdType idType = new IdType();if(StringUtils.hasText(text)){List<Integer>  ids = new ArrayList<>();for (String id : text.split(",")) {ids.add(Integer.parseInt(id));}idType.setIdList(ids);}return idType;}@Overridepublic String print(IdType object, Locale locale) {return null;}
}

 ArticleSettings.java

@Data
@ConfigurationProperties(prefix = "article")
public class ArticleSettings {private Integer lowRead;private Integer topRead;
}

WebMvcSettings.java

@Configuration
public class WebMvcSettings implements WebMvcConfigurer {@Overridepublic void addFormatters(FormatterRegistry registry) {registry.addFormatter(new IdTypeFormatter());}@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/view/addArticle").setViewName("/blog/addArticle");}
}

启动类:
Lession19AdminApplication.java

@MapperScan(basePackages = { "com.bjpowernode.blog.mapper" })
@EnableConfigurationProperties( {ArticleSettings.class} )
@SpringBootApplicationpublic class Lession19AdminApplication {public static void main(String[] args) {SpringApplication.run(Lession19AdminApplication.class, args);}}

相关文章:

动力节点王鹤SpringBoot3笔记——第八章 文章管理模块

目录 第八章 文章管理模块 8.1 配置文件 8.2 视图文件 8.3 Java代码 第八章 文章管理模块 创建新的Spring Boot项目&#xff0c;综合运用视频中的知识点&#xff0c;做一个文章管理的后台应用。 新的Spring Boot项目Lession20-BlogAdmin。Maven构建工具&#xff0c;包…...

ROS功能包|mav_control_rw(基于MPC的无人机轨迹跟踪控制)---gazebo仿真测试

ROS功能包|mav_control_rw&#xff08;基于MPC的无人机轨迹跟踪控制&#xff09;---gazebo仿真测试gazebo仿真测试gazebo仿真测试 启动gazebo并加载无人机模型 $ roslaunch rotors_gazebo mav.launch mav_name:firefly启动 linear mpc 控制器 $ roslaunch mav_linear_mpc ma…...

iOS 内存管理机制与原理

内存分区 内存一般分为五大区&#xff1a;栈区、堆区、常量区、全局区、代码区。如图 1.栈区 是由编译器自动分配并释放的&#xff0c;主要用来存储局部变量、函数的参数等&#xff0c;是一块连续的内存区域&#xff0c;遵循先进后出&#xff08;FILO&#xff09;原则。一般在…...

Linux之父:连你自己都懒得解释,那这就是一堆垃圾!

不出意外&#xff0c;Linus又开喷了&#xff0c;这次的激情开麦&#xff0c;源自一部分没有做注释的合并请求&#xff1a;Linux6.3内核收到了一部分合并请求&#xff0c;但这部分合并完全没有注释。 如果你懒得解释为什么存在一个合并&#xff0c;那这个合并从本质上来说就是错…...

二战华为成功上岸,准备了小半年,要个27k应该也算不上很高吧~

先说下我基本情况&#xff0c;本科不是计算机专业&#xff0c;现在是学通信&#xff0c;然后做图像处理&#xff0c;可能面试官看我不是科班出身没有问太多计算机相关的问题&#xff0c;因为第一次找工作&#xff0c;华为的游戏专场又是最早开始的&#xff0c;就投递了&#xf…...

全国青少年电子信息智能创新大赛(复赛)python·模拟三卷,含答案解析

目录 一、编程题 答案解析: 文档下载打印: 老子搞不懂了,答案解析,还版权问题,有毛病是不。谁在瞎投诉啊。 全国青少年电子信息智能创新大赛(复赛)python模拟三卷 一、编程题 第一题:描述 输入某学生成绩,若成绩在 85分及以上,输出“A”,若成绩在 60分到 85分之间…...

服务网关选型指南

1、为服务网关选型需要考虑哪些因素&#xff1f; 功能需求&#xff1a;您需要考虑您的服务网关需要提供哪些功能&#xff0c;例如 API 管理、请求转发、负载均衡、安全认证等。您应该选择能够满足您的需求的服务网关。 可扩展性&#xff1a;您的服务网关需要能够扩展以支持未来…...

华为OD机试-查找充电设备组合-2022Q4 A卷-Py/Java/JS

某个充电站&#xff0c;可提供n个充电设备&#xff0c;每个充电设备均有对应的输出功率。任意个充电设备组合的输出功率总和&#xff0c;均构成功率集合P的1个元素。功率集合P的最优元素&#xff0c;表示最接近充电站最大输出功率P_max的元素 输入描述 输入为3行: 第1行为充电设…...

免费好用的oa系统有哪些?盘点这几款!

免费好用的oa系统有哪些&#xff1f;盘点这几款&#xff01; 办公自动化&#xff08;OA&#xff09;&#xff0c;英文Office Automation的缩写。它可以通过特定流程或特定环节与日常事务联系在一起&#xff0c;使公文在流转、审批、发布等方面提高效率&#xff0c;实现办公管理…...

光伏发电系统模拟及其发电预测开源python工具pvlib

1. 太阳辐照量模拟 pysolar是一个用于计算太阳位置和辐照量的Python库。它是基于python语言编写的&#xff0c;可以方便地在各种python项目中使用。pysolar主要用于计算太阳的位置、太阳高度角、太阳方位角、日出和日落时间等信息。这些信息可以用于太阳能电池板和太阳能集热器…...

精彩回顾 | 2023工赋Meetup—上海站

2023工赋Meetup—上海站 2023年4月2日下午&#xff0c;在上海数字长宁体验馆举办的“价值驱动的数字化转型技术专场”Meetup圆满落幕&#xff0c;本次活动由工赋开发者社区主办&#xff0c;上海市工业互联网协会指导&#xff0c;长宁区东虹桥发展办公室和积梦智能联合主办。 …...

[oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式

utf-8 回忆上次内容 上次再次输出了大红心♥ 找到了红心对应的编码黑红梅方都对应有编码 原来的编码叫做 ascii️ \u这种新的编码方式叫unicode包括了 中日韩字符集等 各书写系统的字符集 但是有个问题 拜这个字在字节中应该是b"\x62\xdc"两个字节 该如何理解b&qu…...

DNS 的解析过程以及相关问题

文章目录DNS解析过程DNS 为什么用 UDP简单说下怎么实现 DNS 劫持谈谈你对域名缓存的了解DNS解析过程 浏览器首先看看自己浏览器缓存有没有对应的IP记录&#xff0c;同时还要查询一下主机本地文件里面有没有对应的记录&#xff0c;如果有记录就没必要进行后面的步骤了。 浏览器…...

个人情况-单词练习

目录 前言原文兴趣爱好特长专业习惯理想志向情境常用单词性别家庭成员正面性格前言 加油 原文 1.come from… 来自…… I come from Shanghai. 我来自上海/我是上海人。 2.born[bɔrn]adj.出生的 be born into + 家庭 出身……的家庭 George was born into a poor fami…...

python天狗吃月 青少年编程电子学会python编程等级考试一级真题解析2022年9月

目录 python天狗吃月 一、题目要求 编程实现 二、解题思路 1、图形分析...

JAVA做语言国际化

项目场景&#xff1a; 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 例如&#xff1a;数据传输过程中数据不时出现丢失的情况&#xff0c;偶尔会丢失一部分数据 APP 中接收数据代码&#xff1a; Overridepublic void run() {bytes mmInStream.read(buff…...

面试题 16.19. 水域大小

题目链接 面试题 16.19. 水域大小 mid 题目描述 你有一个用于表示一片土地的整数矩阵 land&#xff0c;该矩阵中每个点的值代表对应地点的海拔高度。若值为 0 则表示水域。由垂直、水平或对角连接的水域为池塘。 池塘的大小是指相连接的水域的个数。 编写一个方法来计算矩阵…...

在vscode中切换分支,显示已经删除的远程分支

运行命令&#xff1a;修剪远程分支 git remote prune origin 然后远程的已经删除的分支就不见了。...

森林督查违法图斑内业报告高效制作实践技术

Python已成为最热门的编程语言之一&#xff0c;与arcpy、geopandas等行业软件包相结合&#xff0c;能极大程度地减轻森林督查违法图斑内业报告制作的工作量&#xff0c;显著提升工作效率。为了提升广大从业人员在森林违法图斑内业报告制作等方面的技能&#xff0c;内容主要包括…...

华为OD机试-日志限流-2022Q4 A卷-Py/Java/JS

某软件系统会在运行过程中持续产生日志&#xff0c;系统每天运行N单位时间&#xff0c;运行期间每单位时间产生的日志条数保行在数组 records中。records[i]表示第i单位时间内产生日志条数。 由于系统磁盘空间限制&#xff0c;每天可记录保存的日志总数上限为total条。 如果一天…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...