当前位置: 首页 > 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条。 如果一天…...

ChatGPT能胜任高级程序员吗?

与开发人员信任的其他软件开发工具不同&#xff0c;AI工具在训练、构建、托管和使用方式等方面都存在一些独特的风险。 自2022年底ChatGPT发布以来&#xff0c;互联网上便充斥着对其几乎相同比例的支持和怀疑的论调。不管你是否喜欢它&#xff0c;AI正在逐步进入你的开发组织。…...

effective c++ item 25-29

item25&#xff1a;自定义swap函数 namespace std{template<typename T>void swap(T& a, T& b){T temp(a); // T要满足拷贝构造和拷贝赋值a b;b temp; } }1、Pimpl 2、自定义swap item26:尽可能延后变量的定义 case 1: temp j; for(int i 0; i < n; …...

MasterCAM实体旋转命令相关几个问题:曲线相交于边缘等

MasterCAM版本&#xff1a;2022 目的&#xff1a;通过旋转画杯子边缘主体 内外环直径分别是&#xff1a;56、60mm 命令&#xff1a;实体 - 旋转 问题&#xff1a; 一、处理实体期间错误parasolid(r) kernel 界面错误PK 错误代码&#xff1a;942-曲线相交于边缘 对应参数&a…...

p标签需要设置宽高吗?不用

Dusk: # 引用补丁&#xff0c;开头必须以 -javaagent: 开头&#xff0c;后面跟着补丁的绝对路径&#xff08;可根据你实际的位置进行修改&#xff09;,注意路径一定要填写正确&#xff0c;且不能包含中文&#xff0c;否则会导致 IDEA 无法启动-javaagent:D:/ja-netfilter/ja-ne…...

Andorid 事件分发机制案例实操与解析

文章目录为什么要理解Android事件分发机制&#xff1f;滑动冲突类问题我们以什么开始&#xff1f;代码如下&#xff1a;activity xml 代码&#xff1a;Activity代码&#xff1a;item_user.xml代码修改后代码如下&#xff1a;Activity xmlactivity代码item_gift.xml问题出现了An…...

Git 版本控制/项目迭代

一、Git的作用/为什么要进行版本控制&#xff1f; 什么是项目迭代&#xff1f; 搞开发的时候我们不是一次性就做好平台的所有功能&#xff0c;而是先上线一个功能差不多的版本让用户用着&#xff0c;然后不断迭代、修改&#xff0c;上线新的版本&#xff0c;所以一个项目就会…...

智慧农业大数据项目建设方案

智慧农业大数据项目建设方案 目录 项目概述.................................... 6...

【数据结构专栏】动态扩容顺序栈详解

&#x1f48c; 博客内容&#xff1a;顺序栈的原理详解 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前段&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家&#xff1a;这…...

Linux命令·ifconfig

许多windows非常熟悉ipconfig命令行工具&#xff0c;它被用来获取网络接口配置信息并对此进行修改。Linux系统拥有一个类似的工具&#xff0c;也就是ifconfig(interfaces config)。通常需要以root身份登录或使用sudo以便在Linux机器上使用ifconfig工具。依赖于ifconfig命令中使…...

大器晚成我服刘邦,48岁才开始创业

读史使人明智&#xff0c;周末放下手机&#xff0c;静下心来读点人文历史。大器晚成我最佩服刘邦&#xff0c;48岁才开始创业 。在此之前&#xff0c;他是一个出身平凡的农民&#xff0c;早年曾多次失败和受挫。刘邦最后能够战胜项羽&#xff0c;常常让人觉得匪夷所思&#xff…...