网络资源模板--Android Studio 仿WeChat聊天App

news2024/9/22 11:55:27

目录

一、项目演示

二、项目测试环境

三、项目详情

四、完整的项目源码 


一、项目演示

网络资源模板--仿微信聊天App

二、项目测试环境

三、项目详情

登陆注册

### 登录功能(`LoginActivity`)
1. **界面初始化**:设置界面元素,包括昵称和密码输入框,以及登录和注册按钮。
2. **登录点击事件**:用户点击登录按钮时,验证输入的昵称和密码:
   - 检查昵称和密码是否为空。
   - 验证用户是否存在。
   - 调用 `UserManager` 进行登录验证。
3. **状态反馈**:根据登录结果,给用户显示相应的提示信息(如用户不存在或密码错误)。
4. **消息更新**:如果登录成功,尝试更新聊天信息和好友列表。
5. **页面跳转**:登录成功后跳转到主界面 (`HomeActivity`),或注册界面 (`RegisterActivity`)。

### 注册功能(`RegisterActivity`)
1. **界面初始化**:设置界面元素,包括昵称和密码输入框,以及注册和登录按钮。
2. **注册点击事件**:用户点击注册按钮时,验证输入的昵称和密码:
   - 检查昵称和密码是否为空。
   - 验证用户是否已经存在。
   - 调用 `UserManager` 进行用户注册。
3. **状态反馈**:根据注册结果,给用户显示相应的提示信息(如用户已存在或注册成功)。
4. **页面跳转**:注册成功后跳转到登录界面 (`LoginActivity`)。

### 总结
- 两个活动都使用了基本的输入验证,确保用户输入有效的信息。
- 使用 `UserManager` 进行用户相关操作(检查用户存在性、登录、注册)。
- 使用 `Toast` 显示反馈信息,提升用户体验。

  private void initView() {
        etNickname = findViewById(R.id.etNickname);
        etPassword = findViewById(R.id.etPassword);
        findViewById(R.id.btLogin).setOnClickListener(this::onLoginClick);
        findViewById(R.id.tvGotoRegister).setOnClickListener(v -> gotoRegisterActivity());
    }
  private void showToast(String message) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    }

    private boolean isExistsUser(String nickname) {
        return UserManager.isExistsUser(nickname);
    }

    private boolean registerUser(String nickname, String password) {
        return UserManager.registerUser(nickname, password);
    }

消息页面

### 消息功能(`MessageFragment`)

#### 1. 界面初始化
在 `onCreateView` 方法中,加载布局文件 `fragment_message` 并调用 `initView()` 方法进行视图初始化,主要包括:
- **空视图** (`tvEmpty`):用于显示没有消息的提示。
- **RecyclerView**:用于显示消息列表。

#### 2. 数据初始化
在 `onStart` 方法中,调用 `initData()` 方法来加载和更新消息数据:
- 从 `ChatManager` 获取所有好友的消息。
- 根据消息列表是否为空,显示或隐藏空视图,并更新消息列表。

#### 3. 适配器设置
在 `initView()` 方法中,设置 RecyclerView 的布局管理器为 `LinearLayoutManager`,并为 RecyclerView 添加点击支持:
- 使用 `ItemClickSupport` 设置点击事件监听器,点击某个消息项时跳转到聊天界面。

#### 4. 跳转到聊天界面
当用户点击某条消息时,调用 `gotoChatActivity(String nickname)` 方法,创建跳转到 `ChatActivity` 的 Intent,并传递好友的昵称。

---

### 总结
- `MessageFragment` 负责展示用户的好友消息,提供良好的用户体验。
- 使用 RecyclerView 显示消息列表,并通过适配器动态更新数据。
- 实现了消息项的点击事件,允许用户快速进入聊天界面。

 private void initData() {
        List<Message> myAllFriendMessages = ChatManager.findMyAllFriendMessage(); // 获取所有好友消息
        if (myAllFriendMessages == null || myAllFriendMessages.isEmpty()) { // 如果消息为空
            tvEmpty.setVisibility(View.VISIBLE); // 显示空视图
            messages.clear(); // 清空消息列表
        } else {
            tvEmpty.setVisibility(View.GONE); // 隐藏空视图
            messages.clear(); // 清空消息列表
            messages.addAll(myAllFriendMessages); // 添加所有好友消息到消息列表
        }
        messageAdapter.notifyDataSetChanged(); // 通知适配器数据已更新
    }

聊天页面

### 聊天功能(`ChatActivity`)

#### 1. 界面初始化
在 `onCreate` 方法中,设置布局文件 `activity_chat` 并调用 `initView()` 方法来初始化界面元素,主要包括:
- **好友昵称**:从 Intent 中获取并显示在标题栏。
- **返回按钮**:点击返回按钮时关闭当前活动。
- **消息输入框**:用于输入聊天消息。
- **发送按钮**:点击发送按钮触发消息发送操作。
- **RecyclerView**:用于展示聊天消息列表,设置布局管理器为 `LinearLayoutManager`。

#### 2. 数据初始化
在 `onResume` 方法中,调用 `initData()` 方法加载与好友的聊天记录:
- 从 `ChatManager` 获取好友的所有消息。
- 更新消息列表并通知适配器数据已变更。

#### 3. 发送消息
通过 `doSendMessage(String msg)` 方法处理消息发送:
- 验证输入内容是否为空或超出字符限制(200字)。
- 调用 `ChatManager.sendMessage(nickname, msg)` 发送消息,如果成功,清空输入框并更新消息列表。

#### 4. 删除消息
通过 `showDeleteDialog(final Message message)` 方法实现消息的删除功能:
- 显示确认删除对话框,用户选择“确定”后调用 `ChatManager.deleteMessage(message)` 删除消息。
- 删除成功后更新消息列表,删除失败则显示提示。

#### 5. 提示信息
使用 `showToast(String message)` 方法向用户显示即时提示信息,例如消息发送失败或成功等。

---

### 总结
- `ChatActivity` 实现了与特定好友的聊天功能,包括发送和删除消息。
- 使用 `ChatAdapter` 显示消息列表,提供良好的用户交互体验。
- 通过合理的输入验证和提示,提升应用的用户体验和可靠性。

   private void doSendMessage(String msg) {
        if (msg.trim().isEmpty()) {
            showToast("发送消息不可为空");
        } else if (msg.trim().length() > 200) {
            showToast("发送消息不可大于200字");
        } else {
            Message message = ChatManager.sendMessage(nickname, msg);
            if (message != null) {
                etMessage.setText(""); // 清空输入框
                messages.add(message);
                chatAdapter.notifyDataSetChanged(); // 更新适配器
            } else {
                showToast("发送消息失败");
            }
        }
    }

联系人页面

### 通讯录功能(`AddressBookFragment`)

#### 1. 界面初始化
在 `onCreateView` 方法中,加载布局文件 `fragment_address_book` 并调用 `initView()` 方法进行界面元素的初始化,主要包括:
- **搜索框** (`etSearch`):用于输入好友名称进行搜索。
- **搜索按钮** (`btSearch`):点击后执行搜索操作。
- **空视图** (`tvEmpty`):在没有好友时显示的提示。
- **添加好友按钮**:点击后跳转到添加好友界面。

#### 2. 数据初始化
在 `onResume` 方法中,调用 `initData()` 方法来加载和更新好友列表:
- 从 `FriendManager` 获取所有好友数据。
- 根据好友列表是否为空,显示或隐藏空视图,并更新好友列表。

#### 3. 搜索好友
通过搜索按钮的点击事件,获取输入的搜索内容并更新查询条件,随后调用 `initData()` 方法刷新好友列表。

#### 4. 跳转到好友详情
通过 `gotoFriendActivity(Friend friend)` 方法实现点击好友项时跳转到好友详情界面,传递好友的昵称。

#### 5. 跳转到添加好友界面
通过 `gotoAddFriendActivity()` 方法实现点击添加好友按钮时跳转到 `AddFriendActivity`。

---

### 总结
- `AddressBookFragment` 提供了查看和搜索好友的功能,通过 RecyclerView 显示好友列表。
- 实现了搜索功能,允许用户快速找到好友,并通过点击好友项查看详细信息。
- 界面友好,支持用户添加新好友,提升了应用的社交互动性。

private void initData() {
        List<Friend> allFriend = FriendManager.findAllFriend(query);
        if (allFriend == null || allFriend.isEmpty()) {
            tvEmpty.setVisibility(View.VISIBLE);
            friends.clear();
            friendAdapter.notifyDataSetChanged();
        } else {
            tvEmpty.setVisibility(View.GONE);
            friends.clear();
            friends.addAll(allFriend);
            friendAdapter.notifyDataSetChanged();
        }
    }

好友详情页面

### 好友详情功能(`FriendActivity`)

#### 1. 界面初始化
在 `onCreate` 方法中,设置布局文件 `activity_friend` 并调用 `initView()` 方法来初始化界面元素,主要包括:
- **返回按钮**:点击时关闭当前活动。
- **好友昵称**:从 Intent 中获取好友的昵称并显示在 TextView 中。
- **聊天按钮**:点击后跳转到聊天界面。
- **删除按钮**:点击后弹出确认对话框以确认删除好友。

#### 2. 弹出确认对话框
在删除按钮的点击事件中,使用 `AlertDialog` 弹出确认对话框:
- 对话框显示好友昵称并询问用户是否确认删除。
- 提供“确认”和“取消”两个选项,用户选择“确认”后调用 `confirmDelete()` 方法。

#### 3. 删除好友
在 `confirmDelete(DialogInterface dialogInterface, int i)` 方法中处理好友删除的逻辑:
- 调用 `doDeleteFriends(nickname)` 方法尝试删除好友。
- 删除成功时显示成功提示,设置结果并关闭当前活动;删除失败时显示失败提示。

#### 4. 进入聊天界面
通过 `gotoChatActivity(String nickname)` 方法,点击聊天按钮时启动 `ChatActivity`,并传递好友昵称。

#### 5. 执行删除好友的操作
在 `doDeleteFriends(String nickname)` 方法中,调用 `FriendManager.deleteFriend(nickname)` 方法进行好友删除操作。

---

### 总结
- `FriendActivity` 提供了查看好友详细信息、聊天和删除好友的功能。
- 界面友好,使用确认对话框来防止误操作,提升用户体验。
- 成功删除好友后,设置结果以通知相关的 Fragment 更新其好友列表。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <TextView
        android:id="@id/tvTitle"
        android:layout_width="fill_parent"
        android:layout_height="55.0dip"
        android:background="#ff6750a4"
        android:gravity="center"
        android:text="好友"
        android:textColor="@color/white"
        android:textSize="22.0dip"
        android:textStyle="bold" />

    <ImageView
        android:id="@id/ivBack"
        android:layout_width="55.0dip"
        android:layout_height="55.0dip"
        android:layout_alignParentStart="true"
        android:padding="10.0dip"
        android:src="@mipmap/icon_back" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/tvTitle"
        android:layout_marginTop="40.0dip"
        android:orientation="vertical"
        android:paddingStart="20.0dip"
        android:paddingEnd="20.0dip">

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="好友昵称:"
                android:textSize="14.0dip" />

            <TextView
                android:id="@id/tvNickname"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:textSize="14.0dip" />
        </LinearLayout>
    </LinearLayout>

    <Button
        android:id="@+id/btChat"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/btDelete"
        android:layout_marginStart="20.0dip"
        android:layout_marginEnd="20.0dip"
        android:text="聊天" />

    <Button
        android:id="@+id/btDelete"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginStart="20.0dip"
        android:layout_marginTop="10.0dip"
        android:layout_marginEnd="20.0dip"
        android:layout_marginBottom="40.0dip"
        android:text="删除好友" />
</RelativeLayout>

添加好友页面

### 添加好友功能(`AddFriendActivity`)

#### 1. 界面初始化
在 `onCreate` 方法中,设置布局文件 `activity_add_friend` 并调用 `initView()` 方法初始化界面元素,包括:
- **返回按钮**:点击时关闭当前活动。
- **添加好友按钮**:点击后调用 `onAddFriendClick()` 方法处理添加好友逻辑。

#### 2. 添加好友逻辑
在 `onAddFriendClick(EditText etNickname)` 方法中,执行以下检查:
- 检查昵称是否为空,若为空则显示提示。
- 检查是否试图添加自己为好友,若是则显示提示。
- 检查用户是否存在,若不存在则显示提示。
- 检查好友是否已存在,若已存在则显示提示。
- 若所有检查通过,弹出确认对话框确认添加好友。

#### 3. 确认添加好友
在确认对话框中,若用户选择“确认”,调用 `addFriend(nickname)` 方法:
- 调用 `doAddFriends(nickname)` 执行添加好友操作。
- 根据操作结果显示成功或失败的提示,并关闭当前活动。

#### 4. 辅助方法
- `showToast(String message)`:用于显示提示信息。
- `isMySelf(String nickname)`:检查是否为自己。
- `isExistsUser(String nickname)`:检查用户是否存在。
- `isExistsFriend(String nickname)`:检查好友是否已存在。

---

### 总结
- `AddFriendActivity` 提供了添加好友的功能,界面友好并通过多重检查避免用户错误操作。
- 通过确认对话框提升了用户体验,并在操作成功或失败时提供即时反馈。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <TextView
        android:id="@id/tvTitle"
        android:layout_width="fill_parent"
        android:layout_height="55.0dip"
        android:background="#ff6750a4"
        android:gravity="center"
        android:text="添加好友"
        android:textColor="@color/white"
        android:textSize="22.0dip"
        android:textStyle="bold" />

    <ImageView
        android:id="@+id/ivBack"
        android:layout_width="55.0dip"
        android:layout_height="55.0dip"
        android:layout_alignParentStart="true"
        android:padding="10.0dip"
        android:src="@mipmap/icon_back" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/tvTitle"
        android:layout_marginTop="40.0dip"
        android:orientation="vertical"
        android:paddingStart="20.0dip"
        android:paddingEnd="20.0dip">

        <EditText
            android:id="@id/etNickname"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="请输入好友昵称"
            android:singleLine="true" />
    </LinearLayout>

    <Button
        android:id="@+id/btAdd"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginStart="20.0dip"
        android:layout_marginEnd="20.0dip"
        android:layout_marginBottom="40.0dip"
        android:text="添加" />
</RelativeLayout>

朋友圈页面

### 朋友圈界面(`FriendsCircleFragment`)

#### 1. 界面初始化与数据加载
- **布局与视图初始化**:在 `onCreateView` 方法中通过 `LayoutInflater` 加载 `fragment_friends_circle` 布局,并初始化视图。
- **数据初始化**:在 `initData()` 方法中,通过 `FriendsCircleManager` 获取所有朋友圈消息:
  - 如果消息列表为空,显示空数据提示 (`tvEmpty`),清空朋友圈消息列表,并通知适配器更新。
  - 如果有数据,则隐藏空数据提示,清空现有朋友圈消息列表,添加新数据,并通知适配器更新。

#### 2. 视图与适配器设置
- **初始化视图**:在 `initView()` 方法中,设置空数据提示 (`tvEmpty`) 和发送消息按钮 (`ivSendMessage`) 的点击事件监听器。
- **RecyclerView 设置**:设置 `RecyclerView` (`recycleView`) 的布局管理器为 `LinearLayoutManager`,并使用自定义的 `FriendsCircleAdapter` 设置适配器,传入朋友圈消息列表。

#### 3. 点击事件处理
- **发送消息按钮点击事件**:点击发送消息按钮 (`ivSendMessage`) 时,调用 `gotoSendMessageActivity()` 方法跳转到 `SendMessageActivity`。

#### 4. 数据适配器与数据更新
- **数据适配器**:使用 `FriendsCircleAdapter` 对 `RecyclerView` 进行数据绑定。
- **数据更新**:根据从 `FriendsCircleManager` 获取的数据更新朋友圈消息列表,并通过适配器通知 `RecyclerView` 更新显示。

#### 5. 生命周期管理
- **`onResume()` 方法**:在 `onResume()` 方法中,调用 `initData()` 方法重新加载数据,确保每次回到该界面都能更新显示最新的朋友圈消息。

---

### 总结
- `FriendsCircleFragment` 实现了显示朋友圈消息列表的功能,通过 `RecyclerView` 和自定义的适配器 `FriendsCircleAdapter` 实现数据展示。
- 界面友好地处理了空数据情况,并提供发送消息的入口。
- 通过 `FriendsCircleManager` 管理朋友圈消息的获取,确保界面数据的及时更新和显示。

  private void initData() {
        List<FriendCircleMessage> allFriendCircleMessage = FriendsCircleManager.findAllFriendCircleMessage();
        if (allFriendCircleMessage == null || allFriendCircleMessage.isEmpty()) {
            this.tvEmpty.setVisibility(0);
            this.friendCircleMessages.clear();
            this.friendsCircleAdapter.notifyDataSetChanged();
            return;
        }
        this.tvEmpty.setVisibility(8);
        this.friendCircleMessages.clear();
        this.friendCircleMessages.addAll(allFriendCircleMessage);
        this.friendsCircleAdapter.notifyDataSetChanged();
    }

发布页面

我的页面

### 个人信息界面(`MyFragment`)

#### 1. 界面初始化
- **布局加载**:在 `onCreateView` 方法中,通过 `LayoutInflater` 加载 `fragment_my` 布局,并调用 `initView()` 方法进行视图初始化。

#### 2. 视图设置
- **注销功能**:
  - 设置注销按钮 (`btLogout`) 的点击监听器。在点击时,调用 `UserManager.logout()` 方法执行注销操作。
  - 如果注销成功,显示提示消息“退出成功”,并调用 `gotoLoginActivity()` 方法跳转到登录界面。
  
- **昵称显示**:
  - 从 `UserManager` 获取当前登录用户的昵称,并设置到 `TextView` (`tvNickname`) 中显示。

#### 3. 跳转到登录活动
- **跳转方法**:`gotoLoginActivity()` 方法创建一个 `Intent`,用于启动 `LoginActivity`,同时结束当前活动,确保用户无法返回到注销后的界面。

---

### 总结
- `MyFragment` 提供了用户个人信息的展示和注销功能,界面友好且简单易用。
- 通过 `UserManager` 进行用户管理,确保用户状态的正确性。
- 成功注销后,用户将被引导回登录界面,增强了用户体验。

package com.example.wechat.fragment;

import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import androidx.fragment.app.Fragment;

import com.example.wechat.R;
import com.example.wechat.activity.LoginActivity;
import com.example.wechat.db.UserManager;

public class MyFragment extends Fragment {
    private View root; // 根视图

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        root = inflater.inflate(R.layout.fragment_my, container, false); // 加载布局文件
        initView(); // 初始化视图
        return root;
    }

    private void initView() {
        // 设置注销按钮的点击监听器
        root.findViewById(R.id.btLogout).setOnClickListener(view -> {
            if (UserManager.logout()) { // 注销操作
                Toast.makeText(getContext(), "退出成功", Toast.LENGTH_SHORT).show(); // 显示成功提示
                gotoLoginActivity(); // 跳转到登录界面
            }
        });
        // 设置昵称文本框的内容
        ((TextView) root.findViewById(R.id.tvNickname)).setText(UserManager.getLoginUser().getName());
    }

    // 跳转到登录活动
    private void gotoLoginActivity() {
        startActivity(new Intent(getContext(), LoginActivity.class)); // 创建并启动登录活动的Intent
        requireActivity().finish(); // 结束当前活动
    }
}

四、完整的项目源码 

👇👇👇👇👇快捷获取方式👇👇👇👇👇

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

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

相关文章

二叉树---java---黑马

二叉树 遍历 遍历分两种 广度优先遍历 尽可能先访问距离根节点最近的节点&#xff0c;也称之为层序遍历。 深度优先遍历 对于二叉树&#xff0c;进一步分为三种 pre-order前序遍历&#xff0c;对于每一颗子树&#xff0c;先访问该节点&#xff0c;然后是左子树&#xf…

银河麒麟桌面操作系统如何添加WPS字体

银河麒麟桌面操作系统如何添加WPS字体 1、使用场景2、操作方法步骤一&#xff1a;下载字体文件步骤二&#xff1a;打开终端步骤三&#xff1a;进入字体文件所在目录步骤四&#xff1a;拷贝字体文件到WPS字体目录步骤五&#xff1a;更新字体缓存步骤六&#xff1a;重启WPS Offic…

C++ 把字符串转换成整数 (atoi) - 力扣(LeetCode)

点击链接即可查看&#xff1a;LCR 192. 把字符串转换成整数 (atoi) - 力扣&#xff08;LeetCode&#xff09; 一、题目 请你来实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。 函数 my…

基于协同过滤算法的商品推荐系统

系统展示 用户前台界面 管理员后台界面 商家后台界面 系统背景 随着互联网技术的飞速发展&#xff0c;用户每天面临的信息量呈爆炸式增长&#xff0c;如何有效地筛选出用户感兴趣的内容成为一大挑战。在此背景下&#xff0c;基于协同过滤算法的商品推荐系统应运而生。该系统通过…

Th:1.1 建立连接

基础讲解 1.TCP通信流程 基于TCP通信的Socket基本流程: 1.1 Socket 函数返回值&#xff1a;一个文件描述符&#xff1a; 特别的两个队列。 #include <sys/types.h> #include <sys/socket.h> //create an endpoint for communication int socket(int …

【Mysql】Centos 安装 Mysql8.0

官网下载安装包 官网地址&#xff1a;MySQL :: Download MySQL Community Server 查看服务器的名称和版本号 lsb_release -a 查看服务的架构 uname -m 下载对应的版本&#xff0c;这里操作系统选择 Red Hat 就可以了。&#xff08;CentOS 就是将 RHEL 发行的源代码从新编译…

基于redis的HyperLogLog数据结构实现的布隆过滤器在信息流中历史数据的应用

一、基于redis的HyperLogLog数据结构实现的布隆过滤器在信息流中历史数据的应用 做信息流服务端的左发一定会遇到用户历史数据的集合&#xff0c;对于一些有限信息流&#xff08;因DT数据中心的推荐数据变化较慢&#xff0c;推荐量不大&#xff09;&#xff0c;历史数据可以使用…

Abaqus 2024百度云下载:附中文安装包+教程

正如大家所熟知的&#xff0c;Abaqus是一款有限元分析软件&#xff0c;能够高效的配合工程师完成创作。它可以高精度地实现包括金属、橡胶、高分子材料、复合材料、钢筋混凝土、可压缩超弹性泡沫材料以及土壤和岩石等地质材料的工程仿真计算。 “Abaqus”不仅具有出色的仿真计…

TomCat乱码问题

TomCat控制台乱码问题 乱码问题解决&#xff1a; 响应乱码问题 向客户端响应数据&#xff1a; package Servlet;import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servl…

【pyVista】在三维模型中的网格属性

一&#xff0c;什么是属性&#xff1f; 属性是存在于 一个网格。在 PyVista 中&#xff0c;我们同时使用点数据和单元数据&#xff0c;并且 允许轻松访问数据字典以保存属性数组 它们位于网格的所有点或所有单元上。 点数据 点数据是指值数组&#xff08;标量、向量等&#x…

https的连接过程

根证书: 内置在操作系统和浏览器中,可手动添加,下级是中间证书或服务器证书,只有当中间证书或服务器证书关联到已存在的根证书时,中间证书或服务器证书才视为有效 中间证书: 位于根证书和服务器证书之间,他们之间也可以没有中间证书,作用是对根证书增加一个下级,方便管理,由根…

一款批量下载 B 站动态页图片的脚本

在逛 B 站的时候&#xff0c;总能看到不少 UP 会发很多图片&#xff0c;此时一个一个保存非常麻烦&#xff0c;而且文件名都是随机的字符串&#xff0c;还得手工重命名。 为此&#xff0c;特地搜索了下有没相关的浏览器插件或油猴脚本&#xff0c;还真给我找到一个。 脚本地址…

Kafka 下载安装及使用总结

1. 下载安装 官网下载地址&#xff1a;Apache Kafka 下载对应的文件 上传到服务器上&#xff0c;解压 tar -xzf kafka_2.13-3.7.0.tgz目录结果如下 ├── bin │ └── windows ├── config │ └── kraft ├── libs ├── licenses └── site-docs官方文档…

专注并不意味只做一件事

原创内容第658篇&#xff0c;专注量化投资、个人成长与财富自由。 财务自由本身就是一个很有争议的领域。 有谁能靠别人实现财富自由呢&#xff1f; 这个逻辑起点本身就有问题。 如果预期正确&#xff0c;那这些自媒体还是有用处的。 好比我现在对于阅读和书籍的预期&…

深入解析 Apache Doris架构、应用场景与最佳实践

一、Doris 简介 Apache Doris 是一款现代化的 MPP&#xff08;Massively Parallel Processing&#xff09;数据库&#xff0c;专注于解决大规模数据分析和实时查询的需求。它最初源自百度的 Palo 项目&#xff0c;随后贡献给了 Apache 基金会&#xff0c;并在开源社区的共同努…

『功能项目』QFrameWork框架重构OnGUI【63】

我们打开上一篇62QFrameWork背包框架的项目&#xff0c; 上文将功能实现在一个脚本中 本章要做的事情让脚本实现背包框架思想 首先按照图示创建脚本&#xff1a; 创建脚本&#xff1a;Item.cs namespace QFramework {public class Item{//道具public string Key;public string …

【CSS in Depth 2 精译_033】5.4 Grid 网格布局的显式网格与隐式网格(中)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

C++速通LeetCode中等第18题-删除链表的倒数第N个结点(最简单含注释)

绝妙&#xff01;快慢指针法,快指针先走n步&#xff08;复杂度O(n),O(1))&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(n…

GS-SLAM论文阅读笔记--TAMBRIDGE

前言 本文提出了一个自己的分类方法&#xff0c;传统的视觉SLAM通常使用以帧为中心的跟踪方法&#xff0c;但是3DGS作为一种高效的地图表达方法好像更侧重于地图的创建。这两种方法都有各自的优缺点&#xff0c;但是如果能取长补短&#xff0c;互相结合&#xff0c;那么就会是…

STM32精确控制步进电机

目的&#xff1a;学习使用STM32电机驱动器步进电机&#xff0c;进行电机运动精确控制。 测试环境&#xff1a; MCU主控芯片STM32F103RCT6 &#xff1b;A4988步进电机驱动器模块&#xff1b;微型2相4线步进电机10mm丝杆滑台&#xff0c;金属丝杆安装有滑块。 10mm二相四线微型…