Android 整个屏幕可滑动,tab,viewpage是列表,tab不锁在顶

页面整体可滑动,包括顶部黑色控件、Tab 和列表。

步骤 1:主布局文件(activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollViewxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:fillViewport="true"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><!-- 顶部黑色控件 --><Viewandroid:id="@+id/topView"android:layout_width="match_parent"android:layout_height="200dp"android:background="@android:color/black"/><!-- TabLayout --><com.google.android.material.tabs.TabLayoutandroid:id="@+id/tabLayout"android:layout_width="match_parent"android:layout_height="wrap_content"app:tabIndicatorColor="@color/black"app:tabSelectedTextColor="@color/black"app:tabTextColor="@color/gray"/><!-- ViewPager2 --><androidx.viewpager2.widget.ViewPager2android:id="@+id/viewPager"android:layout_width="match_parent"android:layout_height="match_parent"/></LinearLayout>
</androidx.core.widget.NestedScrollView>

步骤 2:MainActivity实现

public class MainActivity extends AppCompatActivity {private ViewPager2 viewPager;private TabLayout tabLayout;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 初始化视图viewPager = findViewById(R.id.viewPager);tabLayout = findViewById(R.id.tabLayout);// 设置ViewPager2适配器setupViewPager();// 联动Tab和ViewPager2new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> {tab.setText("Tab " + (position + 1));}).attach();}private void setupViewPager() {// 创建Fragment列表List<Fragment> fragments = Arrays.asList(new ListFragment(),new ListFragment());// 设置适配器viewPager.setAdapter(new FragmentStateAdapter(this) {@NonNull@Overridepublic Fragment createFragment(int position) {return fragments.get(position);}@Overridepublic int getItemCount() {return fragments.size();}});}
}

步骤 3:列表Fragment实现(ListFragment.java)

public class ListFragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_list, container, false);RecyclerView recyclerView = view.findViewById(R.id.recyclerView);recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));recyclerView.setAdapter(new ListAdapter());return view;}static class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder> {@NonNull@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);return new ViewHolder(view);}@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {holder.textView.setText("Item " + (position + 1));}@Overridepublic int getItemCount() {return 50; // 模拟50个列表项}static class ViewHolder extends RecyclerView.ViewHolder {TextView textView;ViewHolder(@NonNull View itemView) {super(itemView);textView = itemView.findViewById(R.id.textItem);}}}
}

步骤 4:布局文件补充
fragment_list.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"/>
</FrameLayout>

item_list.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/textItem"android:layout_width="match_parent"android:layout_height="56dp"android:gravity="center"android:textSize="18sp"/>

遇到的问题:ListFragment()的列表高度只有300,ClassifyListFragment有1000,NestedScrollView在ClassifyListFragment滑动到1000的时候,再切换回ListFragment()后,ListFragment()的高度变高了很多,多出的是空白高度

处理方式:
重新计算布局
确保在 ListFragment 中处理布局高度,尤其是在其 onResume() 方法中:

    @Overridepublic void onResume() {super.onResume();if (listSize != 0) {if (getContext() != null) {// 重新计算布局高度View view = getView();if (view != null) {// 如果 ListFragment 在显示时,手动更新其布局高度view.post(() -> {int height = getContext().getResources().getDimensionPixelSize(R.dimen.test_tab1_height) * listSize;view.getLayoutParams().height = height;view.requestLayout();});}}}}

以下是我的布局
fragment_test_roll

<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollViewxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:fillViewport="true"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><FrameLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><ImageViewandroid:layout_width="match_parent"android:layout_height="206dp"android:src="@mipmap/bg_test_top" /><FrameLayoutandroid:layout_width="match_parent"android:layout_height="54dp"android:layout_gravity="bottom"android:layout_marginStart="14dp"android:layout_marginTop="14dp"android:layout_marginEnd="14dp"android:clipChildren="false"><ImageViewandroid:layout_width="match_parent"android:layout_height="54dp"android:scaleType="fitXY"android:src="@mipmap/bg_text_sroll" /><com.jiuhong.mbtirgtest.ui.customView.TwoLineMarqueeViewandroid:id="@+id/marqueeView"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="7dp" /></FrameLayout></FrameLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="226dp"android:layout_marginTop="17dp"android:orientation="horizontal"><LinearLayoutandroid:id="@+id/ll_hot_test_one"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="bottom"android:paddingStart="14dp"android:orientation="vertical"><ImageViewandroid:id="@+id/iv_hot_test_one"android:layout_width="161dp"android:layout_height="103dp"android:layout_marginBottom="10dp"android:scaleType="fitXY" /><ImageViewandroid:id="@+id/iv_hot_test_two"android:layout_width="161dp"android:layout_height="103dp"android:scaleType="fitXY" /></LinearLayout><ImageViewandroid:id="@+id/iv_hot_test_three"android:layout_width="168dp"android:layout_height="226dp"android:scaleType="fitXY"android:layout_marginStart="10dp"android:layout_gravity="bottom"android:layout_marginEnd="5dp"/></LinearLayout><com.google.android.material.tabs.TabLayoutandroid:id="@+id/tabLayout"android:layout_width="200dp"android:layout_height="wrap_content"app:layout_behavior="@string/appbar_scrolling_view_behavior"app:tabIndicatorColor="#FF5449C8"app:tabGravity="fill"app:tabTextColor="#FF333333"app:tabSelectedTextColor="#FF333333"app:tabTextAppearance="@style/CustomTabTextAppearance"app:tabMode="fixed"android:layout_marginStart="14dp"android:layout_marginTop="15dp"android:layout_marginBottom="10dp"/><!-- ViewPager2 --><androidx.viewpager2.widget.ViewPager2android:id="@+id/viewPager"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingStart="13dp"android:paddingEnd="13dp"/></LinearLayout>
</androidx.core.widget.NestedScrollView>

TestRollFragment

package com.jiuhong.mbtirgtest.ui.fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
import com.jiuhong.mbtirgtest.R;
import com.jiuhong.mbtirgtest.common.EventKey;
import com.jiuhong.mbtirgtest.common.Global;
import com.jiuhong.mbtirgtest.handle.MyUriHandler;
import com.jiuhong.mbtirgtest.ui.customView.TwoLineMarqueeView;
import com.jiuhong.mbtirgtest.util.GlideUtils;
import com.songcha.library_business.helper.UMengHelper;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;public class TestRollFragment extends Fragment {private ViewPager2 viewPager;private TabLayout tabLayout;TwoLineMarqueeView marqueeView;ImageView  iv_hot_test_one, iv_hot_test_two, iv_hot_test_three;String hotTopUrlOne = "";String hotTopUrlTwo = "";String hotTopUrlThree = "";@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// 返回 Fragment 的布局View rootView = inflater.inflate(R.layout.fragment_test_roll, container, false);// 初始化视图viewPager = rootView.findViewById(R.id.viewPager);tabLayout = rootView.findViewById(R.id.tabLayout);// 设置ViewPager2适配器setupViewPager();// 联动Tab和ViewPager2new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> {tab.setText("Tab " + (position + 1));}).attach();marqueeView = rootView.findViewById(R.id.marqueeView);iv_hot_test_one = rootView.findViewById(R.id.iv_hot_test_one);iv_hot_test_two = rootView.findViewById(R.id.iv_hot_test_two);iv_hot_test_three = rootView.findViewById(R.id.iv_hot_test_three);//设置滚动文字setMarqueeText();iv_hot_test_one.setOnClickListener(v -> {MyUriHandler.handle(hotTopUrlOne);postKey("top");});iv_hot_test_two.setOnClickListener(v -> {MyUriHandler.handle(hotTopUrlTwo);postKey("bottom");});iv_hot_test_three.setOnClickListener(v -> {MyUriHandler.handle(hotTopUrlThree);postKey("right");});//顶部热门测评setHotTest();return rootView;}private void postKey(String position) {if (getContext() != null) {HashMap<String, Object> map = new HashMap<>();map.put("position", position);UMengHelper.onUMEvent(getContext(), EventKey.CLICK_HOME_FLOAT, map);}}private void setMarqueeText() {// 设置新的文本列表List<String> texts = new ArrayList<>();if (!Global.textRollModelList.isEmpty()) {for (int i = 0; i < Global.textRollModelList.size(); i++) {texts.add(Global.textRollModelList.get(i).getText());}marqueeView.setTexts(texts);// 设置滚动速度marqueeView.setSpeed(1.5f);}}private void setupViewPager() {// 创建Fragment列表List<Fragment> fragments = Arrays.asList(new ListFragment(),ClassifyListFragment.newInstance(3));// 设置适配器viewPager.setAdapter(new FragmentStateAdapter(this) {@NonNull@Overridepublic Fragment createFragment(int position) {return fragments.get(position);}@Overridepublic int getItemCount() {return fragments.size();}});}private void setHotTest() {for (int i = 0; i < Global.hotTestLists.size(); i++) {if (getActivity() != null) {if (!Global.hotTestLists.isEmpty()) {GlideUtils.loadImageNoCache(getActivity(), Global.hotTestLists.get(0).getImage(), iv_hot_test_one);
//                    tv_hot_test_one.setText(Global.hotTestLists.get(0).getTitle());hotTopUrlOne = Global.hotTestLists.get(0).getUri();}if (Global.hotTestLists.size() > 1) {GlideUtils.loadImageNoCache(getActivity(), Global.hotTestLists.get(1).getImage(), iv_hot_test_two);
//                    tv_hot_test_two.setText(Global.hotTestLists.get(1).getTitle());hotTopUrlTwo = Global.hotTestLists.get(1).getUri();}if (Global.hotTestLists.size() > 2) {GlideUtils.loadImageNoCache(getActivity(), Global.hotTestLists.get(2).getImage(), iv_hot_test_three);
//                    tv_hot_test_three.setText(Global.hotTestLists.get(2).getTitle());hotTopUrlThree = Global.hotTestLists.get(2).getUri();}}}}@Overridepublic void onDestroy() {super.onDestroy();}
}

fragment_list

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"/>
</FrameLayout>

ListFragment

package com.jiuhong.mbtirgtest.ui.fragment;import static android.content.ContentValues.TAG;import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import com.google.gson.Gson;
import com.jiuhong.mbtirgtest.R;
import com.jiuhong.mbtirgtest.common.EventKey;
import com.jiuhong.mbtirgtest.common.Global;
import com.jiuhong.mbtirgtest.handle.MyUriHandler;
import com.jiuhong.mbtirgtest.httpUtil.HttpUtil;
import com.jiuhong.mbtirgtest.httpUtil.api;
import com.jiuhong.mbtirgtest.model.GetTestModel;
import com.jiuhong.mbtirgtest.ui.adapter.MainTabAdapter;
import com.songcha.library_business.helper.UMengHelper;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class ListFragment extends Fragment {RecyclerView recyclerView;int listSize = 0;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_list, container, false);recyclerView = view.findViewById(R.id.recyclerView);recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));getHttpData();recyclerView.setNestedScrollingEnabled(false);return view;}private void getHttpData() {//获取签到的数量Map<String, String> extraParams = new HashMap<>();HttpUtil.sendGetRequest(getContext(), api.getMbttMoney, new HttpUtil.HttpCallback() {@Overridepublic void onSuccess(String responseBody) {if (getActivity() != null) {getActivity().runOnUiThread(() -> {Log.d("测试列表", responseBody);Gson gson = new Gson();List<GetTestModel.DataBean> finalData = new ArrayList<>();GetTestModel getSignNumModel = gson.fromJson(responseBody, GetTestModel.class);for (int i = 0; i < Global.testH5Url.size(); i++) {for (int a = 0; a < getSignNumModel.getData().size(); a++) {if (Global.testH5Url.get(i).getVersion().equals(getSignNumModel.getData().get(a).getVersion())) {if (Global.testH5Url.get(i).getBanner() != null && !Global.testH5Url.get(i).getBanner().isEmpty()) {//使用配置的banner图getSignNumModel.getData().get(a).setImg(Global.testH5Url.get(i).getBanner());}if (Global.testH5Url.get(i).getTitle() != null && !Global.testH5Url.get(i).getTitle().isEmpty()) {//使用配置的标题getSignNumModel.getData().get(a).setDescription(Global.testH5Url.get(i).getTitle());}if (Global.testH5Url.get(i).getDesc() != null && !Global.testH5Url.get(i).getDesc().isEmpty()) {//描述getSignNumModel.getData().get(a).setDescriptionExplain(Global.testH5Url.get(i).getDesc());}//version相同if (Global.testH5Url.get(i).getSort() != 0) {//sort不为0if ((getSignNumModel.getData().get(a).getSign().equals("10085")) && getSignNumModel.getData().get(a).getStage() == 3) {finalData.add(getSignNumModel.getData().get(a));}}}}}listSize = finalData.size();Log.d("", "" + finalData);MainTabAdapter adapter = new MainTabAdapter(finalData, new MainTabAdapter.OnItemClickListener() {@Overridepublic void onItemClick(int position) {GetTestModel.DataBean item = finalData.get(position);for (int i = 0; i < Global.testH5Url.size(); i++) {if (item.getVersion().equals(Global.testH5Url.get(i).getVersion())) {MyUriHandler.handle(Global.testH5Url.get(i).getUri());}}if (getContext() != null) {HashMap<String, Object> map = new HashMap<>();map.put("version", item.getVersion());UMengHelper.onUMEvent(getContext(), EventKey.CLICK_DAILY_TEST_ITEM, map);}}});recyclerView.setAdapter(adapter);});}}@Overridepublic void onFailure(Exception e) {// 请求失败,处理错误Log.e(TAG, "Error123: " + e.getMessage(), e);}}, extraParams);}@Overridepublic void onResume() {super.onResume();if (listSize != 0) {//拿到数据才计算,第一次进来是没有数据的,不重新计算// 重新计算布局高度View view = getView();if (view != null) {// 如果 ListFragment 在显示时,手动更新其布局高度view.post(() -> {int height = getContext().getResources().getDimensionPixelSize(R.dimen.test_tab1_height) * listSize;view.getLayoutParams().height = height;view.requestLayout();});}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/70437.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day 31 卡玛笔记

这是基于代码随想录的每日打卡 491. 非递减子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0…

快速优雅解决webview_flutter不能Safari调试的问题

这个问题&#xff0c;网上一搜&#xff0c;又是让你去检索WKWebView&#xff0c;找到FWFWebViewHostApi.m文件&#xff0c;然后再改 iOS 的代码&#xff0c; 加一行 self.inspectable YES; 我们开发Flutter项目&#xff0c;尽量还是不要去改插件里的代码&#xff0c;好了不费…

docker /var/lib/docker/overlay2目录把磁盘空间占满问题

1、查看服务器磁盘空间 df -h果然100%了,docker系统文件把磁盘空间占满了。 2、进入overlay2目录&#xff0c;查找那个容器工作目录占用最高 cd /var/lib/docker/overlay2du -h --max-depth1详见下图 好家伙占用110G&#xff01;复制目录名称2c3c48ccac533c5d4a366d45a19bb9…

Lua中文语言编程源码-第十一节,其它小改动汉化过程

__tostring 汉化过程 liolib.c metameth[] {"__转换为字符串", f_tostring}, lauxlib.c luaL_callmeta(L, idx, "__转换为字符串") lua.c luaL_callmeta(L, 1, "__转换为字符串") __len 汉化过程 ltm.c luaT_eventname[] ltablib.c c…

『python爬虫』获取免费IP代理 搭建自己的ip代理池(保姆级图文)

目录 1. 环境搭建2. 获取爬虫ip3. 启动本地flask api接口服务4. 封装方法例子代码5. 自定义抓取免费ip的代理站规则6. 自定义规则示例总结欢迎关注 『python爬虫』 专栏,持续更新中 欢迎关注 『python爬虫』 专栏,持续更新中 1. 环境搭建 这边建议python3.7-3.11版本,redis …

回退 android studio emulator 的版本

前情提要 最近用 frida 需要一个完全跑 arm64 的手机 os&#xff0c;因为雷电实时转义 arm 到 x64 的方案本质上还是 x64&#xff0c;会导致 frida 有 bug。查了一下有帖子说 android studio 自带的模拟器支持直接跑 arm64 的镜像 (Other Images) 直接跑跑不通&#xff0c;调…

使用令牌桶算法通过redis实现限流

令牌桶算法是一种常用的限流算法&#xff0c;它可以平滑地控制请求的处理速率。在 Java 中结合 Redis 实现令牌桶算法&#xff0c;可以利用 Redis 的原子操作来保证多节点环境下的限流效果。 一 实现思路 初始化令牌桶&#xff1a;在 Redis 中存储令牌桶的相关信息&#xff0…

c语言:取绝对值

假设我们有一个 long 类型的变量 l&#xff0c;我们希望恢复其绝对值。以下是两种方法的对比&#xff1a; 方法1&#xff1a;使用条件语句 这个很好理解&#xff0c;负数时取负运算 &#xff0c;用于数值的符号反转。 long abs_value(long l) {if (l < 0) {return -l;} e…

02vue3实战-----项目目录详解

02vue3实战-----项目目录详解 1.目录完整结构2.extensions.json文件3.node_modules文件夹4.public文件夹5.src文件夹6.文件.gitignore7.文件env.d.ts8.文件index.html9.文件package-lock.json和文件package.json10.文件README.md11.文件vite.config.ts12.文件tsconfig.json和文…

【蓝桥杯嵌入式】4_key:单击+长按+双击

全部代码网盘自取 链接&#xff1a;https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码&#xff1a;3ii2 1、电路图 将4个按键的引脚设置为input&#xff0c;并将初始状态设置为Pull-up&#xff08;上拉输入&#xff09; 为解决按键抖动的问题&#xff0c;我们…

qt部分核心机制

作业 1> 手动将登录项目实现&#xff0c;不要使用拖拽编程 并且&#xff0c;当点击登录按钮时&#xff0c;后台会判断账号和密码是否相等&#xff0c;如果相等给出登录成功的提示&#xff0c;并且关闭当前界面&#xff0c;发射一个跳转信号&#xff0c;如果登录失败&#…

Spring Boot启动内嵌tocmat原理

要研究Spring Boot启动内嵌tomcat的原理&#xff0c;就需要先了解一下Spring Boot自动配置的过程&#xff0c;首先简要的梳理一下springboot自动配置的步骤。 一、SpringBoot自动配置 当SpringBoot应用启动时&#xff0c;EnableAutoConfiguration注解被激活&#xff0c;该注解…

【论文阅读】Comment on the Security of “VOSA“

Comment on the Security of Verifiable and Oblivious Secure Aggregation for Privacy-Preserving Federated Learning -- 关于隐私保护联邦中可验证与遗忘的安全聚合的安全性 论文来源摘要Introduction回顾 VOSA 方案对VOSA不可伪造性的攻击对于类型 I 的攻击对于类型 II 的…

idea隐藏无关文件

idea隐藏无关文件 如果你想隐藏某些特定类型的文件&#xff08;例如 .log 文件或 .tmp 文件&#xff09;&#xff0c;可以通过以下步骤设置&#xff1a; 打开设置 在菜单栏中选择 File > Settings&#xff08;Windows/Linux&#xff09;或 IntelliJ IDEA > Preference…

正则表达式详细介绍

目录 正则表达式详细介绍什么是正则表达式&#xff1f;元字符转义字符字符类限定字符字符分枝字符分组懒惰匹配和贪婪匹配零宽断言 正则表达式详细介绍 什么是正则表达式&#xff1f; 正则表达式是一组由字母和符号组成的特殊文本&#xff0c;它可以用来从文本中找出满足你想…

x64、aarch64、arm与RISC-V64:详解四种处理器架构

x64、aarch64、arm与RISC-V64:详解四种处理器架构 x64架构aarch64架构ARM架构RISC-V64架构总结与展望在计算机科学领域,处理器架构是构建计算机系统的基石,它决定了计算机如何执行指令、管理内存和处理数据。x64、aarch64、arm与RISC-V64是当前主流的四种处理器架构,它们在…

区块链技术:Facebook 重塑社交媒体信任的新篇章

在这个信息爆炸的时代&#xff0c;社交媒体已经成为我们生活中不可或缺的一部分。然而&#xff0c;随着社交平台的快速发展&#xff0c;隐私泄露、数据滥用和虚假信息等问题也日益凸显。这些问题的核心在于传统社交媒体依赖于中心化服务器存储和管理用户数据&#xff0c;这种模…

Redis数据库篇 -- Pipeline

一. 什么是Pipeline 在传统的请求-响应模式中&#xff0c;客户端与服务器之间的通信流程如下&#xff1a; 客户端发送一个命令到服务器。服务器接收命令并执行。服务器将执行结果返回给客户端。客户端接收结果后&#xff0c;发送下一个命令 在这种传统的模式下&#xff0c;…

[权限提升] Linux 提权 维持 — 系统错误配置提权 - 计划任务提权

关注这个专栏的其他相关笔记&#xff1a;[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01&#xff1a;Linux 计划任务提权原理 Linux 计划任务提权是由于管理员配置不当&#xff0c;导致以 Root 权限运行的计划任务文件可以被低权限用户修改&#xff0c;从而被攻击者利用&#…

Bootstrap5 表单

Bootstrap5 表单 概述 Bootstrap 是一个流行的前端框架&#xff0c;它提供了丰富的组件和工具来简化网页开发。Bootstrap5 是 Bootstrap 的最新版本&#xff0c;它引入了许多新特性和改进。在本篇文章中&#xff0c;我们将深入探讨 Bootstrap5 中的表单组件&#xff0c;包括其…