【1个月速成Java】基于Android平台开发个人记账app学习日记——第10天,登录状态保持与退出登录

news2025/1/9 19:20:37

系列专栏链接如下,方便跟进:

https://blog.csdn.net/weixin_62588253/category_12821860.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12821860&sharerefer=PC&sharesource=weixin_62588253&sharefrom=from_linkicon-default.png?t=O83Ahttps://blog.csdn.net/weixin_62588253/category_12821860.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12821860&sharerefer=PC&sharesource=weixin_62588253&sharefrom=from_link

同时篇幅有限,不能把所有文件列举出来,想要跟进代码,进入我个人仓库查看即可。觉得还可以的给个Star是对我最大的支持。
https://github.com/Messimeimei/PersonalExpenseTrackericon-default.png?t=O83Ahttps://github.com/Messimeimei/PersonalExpenseTracker

24.11.10

为了开发的方便(每次真机调试都需要重新登录),这篇文章讲解如何保持app的登录状态和实现退出登录。即只要登录了,除非主动退出登录,否则就算清空后台进程下次打开app后依旧是明细页面。

1.设置页面布局

首先我们创建一个设置页面,在里面加入退出登录的按钮。首先看下效果图:

 代码如下:

<LinearLayout xmlns: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:orientation="vertical"
              android:background="@color/background_grey">

    <!-- 返回箭头和标题栏 -->
    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="center_vertical"
            android:background="@color/Argentina_blue"
            android:padding="16dp">

        <ImageView
                android:id="@+id/backButton"
                android:layout_width="22dp"
                android:layout_height="22dp"
                android:src="@drawable/ic_arrow_back"
                android:clickable="true"
                android:focusable="true"
                android:layout_marginEnd="16dp"/>

        <TextView
                android:layout_width="260dp"
                android:layout_height="wrap_content"
                android:text="账户设置"
                android:textSize="18sp"
                android:textColor="@color/black"
                android:gravity="center"/>
    </LinearLayout>

    <!-- 顶部间距 -->
    <View
            android:layout_width="match_parent"
            android:layout_height="8dp"
            android:background="@color/white_smoke"/>

    <!-- 设置内容布局 -->
    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="16dp"
            android:background="@color/white_smoke">

        <!-- 头像行 -->
        <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:gravity="center_vertical"
                android:padding="8dp">

            <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="头像"
                    android:textSize="16sp"
                    android:textColor="@color/black"/>

            <com.google.android.material.imageview.ShapeableImageView
                    android:layout_width="40dp"
                    android:layout_height="40dp"
                    android:src="@drawable/app_logo"
                    app:shapeAppearanceOverlay="@style/RoundedCornersImage"
                    android:layout_marginEnd="8dp"/>

            <ImageView
                    android:layout_width="22dp"
                    android:layout_height="22dp"
                    android:src="@drawable/ic_arrow_right"/>
        </LinearLayout>

        <!-- ID行 -->
        <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:gravity="center_vertical"
                android:padding="8dp">

            <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="ID"
                    android:textSize="16sp"
                    android:textColor="@color/black"/>

            <TextView
                    android:id="@+id/userIdTextView"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="61793910"
                    android:textSize="16sp"
                    android:textColor="@color/black"/>
        </LinearLayout>

        <!-- 昵称行 -->
        <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:gravity="center_vertical"
                android:padding="8dp">

            <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="昵称"
                    android:textSize="16sp"
                    android:textColor="@color/black"/>

            <TextView
                    android:id="@+id/nicknameTextView"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Disfruta el momento"
                    android:textSize="16sp"
                    android:textColor="@color/black"/>

            <ImageView
                    android:layout_width="22dp"
                    android:layout_height="22dp"
                    android:src="@drawable/ic_arrow_right"/>
        </LinearLayout>

        <!-- 手机号行 -->
        <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:gravity="center_vertical"
                android:padding="8dp">

            <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="手机号"
                    android:textSize="16sp"
                    android:textColor="@color/black"/>

            <TextView
                    android:id="@+id/phoneTextView"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="未绑定"
                    android:textSize="16sp"
                    android:textColor="@color/Argentina_yellow"/>

            <ImageView
                    android:layout_width="22dp"
                    android:layout_height="22dp"
                    android:src="@drawable/ic_arrow_right"/>
        </LinearLayout>

        <!-- 微信行 -->
        <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:gravity="center_vertical"
                android:padding="8dp">

            <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="微信"
                    android:textSize="16sp"
                    android:textColor="@color/black"/>

            <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Disfruta el momento"
                    android:textSize="16sp"
                    android:textColor="@color/black"/>

            <ImageView
                    android:layout_width="22dp"
                    android:layout_height="22dp"
                    android:src="@drawable/ic_arrow_right"/>
        </LinearLayout>

        <!-- 应急联系方式行 -->
        <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:gravity="center_vertical"
                android:padding="8dp">

            <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="应急联系方式"
                    android:textSize="16sp"
                    android:textColor="@color/black"/>

            <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="未设置"
                    android:textSize="16sp"
                    android:textColor="@color/Argentina_yellow"/>

            <ImageView
                    android:layout_width="22dp"
                    android:layout_height="22dp"
                    android:src="@drawable/ic_arrow_right"/>
        </LinearLayout>

        <!-- 注销账号 -->
        <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="申请注销账号"
                android:textSize="16sp"
                android:textColor="@color/grey"
                android:padding="16dp"
                android:gravity="center"/>

        <!-- 退出登录按钮 -->
        <!-- 注册按钮 -->
        <com.google.android.material.button.MaterialButton
                android:id="@+id/logoutButton"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="退出登录"
                android:layout_marginTop="24dp"
                app:backgroundTint="@color/Argentina_blue"
                android:textColor="@color/black"
                android:textSize="16sp"/>
    </LinearLayout>

</LinearLayout>

除了可以退出登录外,还实现了展示用户的ID和昵称以及手机号。这里的逻辑代码需要在设置的活动类里面介绍。

2.设置活动类

在活动类中我们为退出登录按钮设置了监听,完成退出就是利用SharedPreferences,然后clear掉即可。同时我们从手机登录页面中获取用户的信息。

package com.example.personalexpensetracker.ui.activity;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.example.personalexpensetracker.R;

public class SettingsActivity extends AppCompatActivity {

    private TextView userIdTextView, nicknameTextView, phoneTextView;
    private ImageView backButton;
    private Button logoutButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);

        // 绑定UI组件
        backButton = findViewById(R.id.backButton);
        userIdTextView = findViewById(R.id.userIdTextView);
        nicknameTextView = findViewById(R.id.nicknameTextView);
        phoneTextView = findViewById(R.id.phoneTextView);
        logoutButton = findViewById(R.id.logoutButton); // 新增的“退出登录”按钮

        // 设置任务栏颜色为蓝色
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            Window window = getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(getResources().getColor(R.color.Argentina_blue)); // 蓝色背景色
        }

        // 设置返回按钮点击事件
        backButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        // 获取 SharedPreferences 中保存的用户信息
        SharedPreferences sharedPreferences = getSharedPreferences("AppPreferences", MODE_PRIVATE);
        String userId = sharedPreferences.getString("userId", "N/A");
        String nickname = sharedPreferences.getString("nickname", "N/A");
        String phone = sharedPreferences.getString("phone", "N/A");

        // 将信息显示在 TextView 中
        userIdTextView.setText(userId);
        nicknameTextView.setText(nickname);
        phoneTextView.setText(phone);

        // 设置“退出登录”按钮点击事件
        logoutButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 清除登录状态和用户信息
                SharedPreferences.Editor editor = sharedPreferences.edit();
                editor.clear();
                editor.apply();

                // 跳转到启动页面(例如 LoginActivity)
                Intent intent = new Intent(SettingsActivity.this, PhoneLoginActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); // 清除返回栈
                startActivity(intent);
            }
        });
    }
}

3.手机号登录页面做出相应修改

在原来的登录页面我们需要做出相应修改,把登录的状态写入到SharedPreferences中。

package com.example.personalexpensetracker.ui.activity;

import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.ColorStateList;
import android.os.Bundle;
import android.text.method.PasswordTransformationMethod;
import android.view.Gravity;
import android.view.View;
import android.widget.*;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import com.example.personalexpensetracker.R;
import com.example.personalexpensetracker.data.dao.UserDao;
import com.example.personalexpensetracker.data.database.AppDatabase;
import com.example.personalexpensetracker.data.model.User;
import com.example.personalexpensetracker.utils.AppExecutors;
import com.google.android.material.shape.MaterialShapeDrawable;
import com.example.personalexpensetracker.utils.DialogUtils;
import android.util.Patterns;

public class PhoneLoginActivity extends AppCompatActivity {
    private EditText phoneEditText, passwordEditText;
    private CheckBox agreementCheckBox;
    private Button loginButton, registerButton;
    private ImageView backButton, passwordEyeIcon;
    private UserDao userDao;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_phone_login);

        // 设置输入框的圆角
        MaterialShapeDrawable shapeDrawable = new MaterialShapeDrawable();
        shapeDrawable.setFillColor(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.white_smoke)));
        shapeDrawable.setShapeAppearanceModel(
                shapeDrawable.getShapeAppearanceModel()
                        .toBuilder()
                        .setAllCornerSizes(24) // 设置圆角大小
                        .build());

        passwordEyeIcon = findViewById(R.id.passwordEyeIcon);
        phoneEditText = findViewById(R.id.phoneEditText);
        phoneEditText.setBackground(shapeDrawable);
        passwordEditText = findViewById(R.id.passwordEditText);
        passwordEditText.setBackground(shapeDrawable);
        backButton = findViewById(R.id.backButton);
        backButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        AppDatabase db = AppDatabase.getInstance(this);
        userDao = db.userDao();

        agreementCheckBox = findViewById(R.id.agreementCheckBox);
        loginButton = findViewById(R.id.loginButton);
        registerButton = findViewById(R.id.registerButton);


        loginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 执行登录逻辑
                String phone = phoneEditText.getText().toString();
                String password = passwordEditText.getText().toString();

                if (phone.isEmpty() || !isValidPhone(phone)) {
                    showToast("手机号格式不正确!");
                } else if (password.isEmpty()) {
                    showToast("请输入密码!");
                } else if (!agreementCheckBox.isChecked()) {
                    DialogUtils.showAgreementDialog(PhoneLoginActivity.this, new Runnable() {
                        @Override
                        public void run() {
                            // 用户点击同意协议,勾选复选框并弹出手机号确认框
                            agreementCheckBox.setChecked(true);
                            checkLogin(phone, password);
                        }
                    }, new Runnable() {
                        @Override
                        public void run() {
                            // 用户点击取消,不做任何操作,保持状态
                        }
                    });
                } else {
                    // 检查登录信息
                    checkLogin(phone, password);
                }
            }
        });
        registerButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 跳转到注册页面
                Intent intent = new Intent(PhoneLoginActivity.this, RegisterActivity.class);
                startActivity(intent);
            }
        });

        // 初始状态:眼睛是闭上的,密码不可见
        passwordEyeIcon.setImageResource(R.drawable.ic_eye_close);
        passwordEditText.setInputType(0x00000081);  // 密码不可见
        // 密码可见性切换
        passwordEyeIcon.setOnClickListener(v -> togglePasswordVisibility(passwordEditText, passwordEyeIcon, R.drawable.ic_eye_open, R.drawable.ic_eye_close));

    }

    // 检查登录信息
    private void checkLogin(String phone, String password) {
        // 同样在子线程中执行
        AppExecutors.getDiskIO().execute(() -> {
            User user = userDao.getUserByPhone(phone);  // 根据手机号获取该用户
            if (user == null) {
                runOnUiThread(() -> {
                    Toast.makeText(PhoneLoginActivity.this, "该手机号未注册", Toast.LENGTH_SHORT).show();
                });
            }  else if (!user.getPassword().equals(password)) {
                // 密码错误
                runOnUiThread(() -> {
                    Toast.makeText(PhoneLoginActivity.this, "密码错误", Toast.LENGTH_SHORT).show();
                });
            } else {
                // 登录成功
                runOnUiThread(() -> {
                    Toast.makeText(PhoneLoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
                });
                // 保存登录状态
                SharedPreferences sharedPreferences = getSharedPreferences("AppPreferences", MODE_PRIVATE);
                SharedPreferences.Editor editor = sharedPreferences.edit();
                editor.putString("userId", String.valueOf(user.getFormattedId())); // 假设 user 对象有 getId() 方法
                editor.putString("nickname", user.getNickname()); // 假设 user 对象有 getNickname() 方法
                editor.putString("phone", user.getPhone()); // 假设 user 对象有 getPhone() 方法
                editor.putBoolean("isLoggedIn", true);
                editor.apply();

                // 跳转到下一个页面
                startActivity(new Intent(PhoneLoginActivity.this, ExpenseRecordDisplayActivity.class));
                finish();
            }
        });
    }

    // 密码可见性切换
    private void togglePasswordVisibility(EditText editText, ImageView eyeIcon, int visibleIcon, int hiddenIcon) {
        // 根据点击的是哪个眼睛图标来切换相应输入框的可见性
        boolean isVisible = editText.getTransformationMethod() instanceof PasswordTransformationMethod;

        if (isVisible) {
            // 设置为可见密码
            editText.setTransformationMethod(null);  // 不使用隐藏密码的转换方法
            eyeIcon.setImageResource(visibleIcon);  // 设置睁眼图标
        } else {
            // 设置为隐藏密码
            editText.setTransformationMethod(new PasswordTransformationMethod());  // 使用隐藏密码的转换方法
            eyeIcon.setImageResource(hiddenIcon);  // 设置闭眼图标

        }

        // 将光标移到文本末尾,避免光标丢失
        editText.setSelection(editText.getText().length());
    }

    // 检查手机号格式是否正确
    private boolean isValidPhone(String phone) {
        // 这里可以使用正则表达式来验证手机号格式
        return phone.matches("[1][3-9][0-9]{9}");
    }

    // 显示Toast提示
    private void showToast(String message) {
        Toast toast = Toast.makeText(PhoneLoginActivity.this, message, Toast.LENGTH_SHORT);

        // 设置Toast显示的位置,位置为屏幕顶部(Gravity.TOP)
        toast.setGravity(Gravity.TOP, 0, 20); // 200是Y轴偏移量,控制距离顶部的距离

        // 显示Toast
        toast.show();
    }
}

下篇文章开始,介绍app核心功能,记账。

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

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

相关文章

MySQL系列之如何在Linux只安装客户端

导览 前言Q&#xff1a;如何安装一个Linux环境下的MySQL客户端一、准备文件1. 确认Server版本2. 选择Client安装文件 二、下载并安装1. 下载1.1 寻找文件1.2 文件说明 2. 安装2.1 上传至Linux服务器2.2 执行安装 三、连接验证1. 确认远程授权2. 建立远程连接 结语精彩回放 前言…

arcgis pro 学习笔记

二维三维集合在一起&#xff0c;与arcgis不同 一、首次使用&#xff0c;几个基本设置 1.选项——常规里面设置自动保存时间 2.新建工程文件&#xff0c;会自动加载地图&#xff0c;可以在选项里面设置为无&#xff0c;以提高启动效率。 3.设置缓存位置&#xff0c;可勾选每次…

【论文复现】MSA+抑郁症模型总结(三)

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀MSA抑郁症模型 热门研究领域&#xff1a;情感计算的横向发展1. 概述2. 论文地址3. 研究背景4. 主要贡献5. 模型结构和代码6. 数据集介绍7. 性…

‌STAR法则

一&#xff1a;STAR法则 STAR法则是一种简单而实用的表现技巧&#xff0c;常被用于求职过程中的个人经历描述&#xff0c;富有条理性&#xff0c;可以帮助你在职场中脱颖而出。“STAR”分别对应的是situation-task-action-result&#xff0c;通过情境、目标、行动和结果四个方面…

java:使用Multi-Release Jar改造Java 1.7项目增加module-info.class以全面合规Java 9模块化规范

common-java是一个我维护了好多年的一个基础项目,编译目标为Java 1.7 现在整个团队的项目要做Java 9以上的技术迁移准备,就需要对这个在内部各项目中被广泛引用的基础项目进行改造,以适合Java 9的模块化规范。 Automatic-Module-Name Java 9的模块化规范(即Java Platform Mod…

力扣题库——75.颜色分类

这道题采用三路快速排序&#xff0c;快速排序思路看这里快速排序。将数列分为三组&#xff1a;小于基准、等于基准、大于基准。和快排一样&#xff0c;对左右递归进行快速排序。 先将题目简化&#xff0c;如果只有数字0和1&#xff0c;扫描一遍数组&#xff0c;遇到数字1不用管…

python - leetcode【数据结构-算法】-入门/通关手册

python的算法入门/通关/手册 前言&#xff1a;算法通关手册&#xff08;LeetCode&#xff09;-githubHello 算法&#xff1a;python数据结构和算法 - 中文版The Algorithms - Python最后刷题思维: python-leetcode刷题常用语法&#xff1a;变量定义&#xff1a;逻辑与或非和按位…

使用 Flask 和 ONLYOFFICE 实现文档在线编辑功能

提示&#xff1a;CSDN 博主测评ONLYOFFICE 文章目录 引言技术栈环境准备安装 ONLYOFFICE 文档服务器获取 API 密钥安装 Flask 和 Requests 创建 Flask 应用项目结构编写 app.py创建模板 templates/index.html 运行应用功能详解文档上传生成编辑器 URL显示编辑器回调处理 安全性…

EasyUI弹出框行编辑,通过下拉框实现内容联动

EasyUI弹出框行编辑&#xff0c;通过下拉框实现内容联动 需求 实现用户支付方式配置&#xff0c;当弹出框加载出来的时候&#xff0c;显示用户现有的支付方式&#xff0c;datagrid的第一列为conbobox,下来选择之后实现后面的数据直接填充&#xff1b; 点击新增&#xff1a;新…

C# 选择导入文件的路径、导出文件的路径

通过C#代码&#xff0c;调出windows风格的文件选择对话框和存储文件对话框。提供界面来选择文件的位置&#xff0c;并将完整路径以字符串形式返回。 1、选择导入文件&#xff0c;获取其路径 C#通过这段代码将弹出一个文件选择对话框&#xff0c;允许用户选择一个文件&#xff…

数据结构-并查集专题(1)

一、前言 因为要开始准备年底的校赛和明年年初的ACM、蓝桥杯、天梯赛&#xff0c;于是开始按专题梳理一下对应的知识点&#xff0c;先从简单入门又值得记录的内容开始&#xff0c;并查集首当其冲。 二、我的模板 虽然说是借用了jiangly鸽鸽的板子&#xff0c;但是自己也小做…

二手交易平台测试用例设计和执行

&#x1f384;欢迎来到边境矢梦的csdn博文&#x1f384; &#x1f384;追求开源思想和学无止境思想一直在提升技术的路上 &#x1f384; &#x1f308;涉及的领域有&#xff1a;Java、Python、微服务架构和分布式架构思想、基本算法编程&#x1f308; &#x1f386;喜欢的朋友可…

计算机图形学论文 | 多边形中的点可见性快速算法

&#x1f98c;&#x1f98c;&#x1f98c;读论文 &#x1f428;&#x1f428;摘要 针对点的可见性计算这一计算几何中的基础问题&#xff0c;提出一种支持任意查询点的可见多边形快速计算的基于多边形Voronoi图的点可见性算法。以与Voronoi骨架路径对应的Voronoi通道概念&…

Redis 高并发分布式锁实战

目录 环境准备 一 . Redis 安装 二&#xff1a;Spring boot 项目准备 三&#xff1a;nginx 安装 四&#xff1a;Jmeter 下载和配置 案例实战 优化一&#xff1a;加 synchronized 锁 优化二&#xff1a;使用 redis 的 setnx 实现分布式锁 优化三&#xff1a;使用 Lua 脚本…

LLM大模型学习精华系列:VLLM性能优化部署实践——全面加速从推理到部署的流程

训练后的模型会用于推理或者部署。推理即使用模型用输入获得输出的过程&#xff0c;部署是将模型发布到恒定运行的环境中推理的过程。一般来说&#xff0c;LLM的推理可以直接使用PyTorch代码、使用[VLLM]等框架&#xff0c;也可以使用[llama.cpp]等c推理框架。 常见推理方法 G…

【大数据学习 | kafka高级部分】kafka的快速读写

1. 追加写 根据以上的部分我们发现存储的方式比较有规划是对于后续查询非常便捷的&#xff0c;但是这样存储是不是会更加消耗存储性能呢&#xff1f; 其实kafka的数据存储是追加形式的&#xff0c;也就是数据在存储到文件中的时候是以追加方式拼接到文件末尾的&#xff0c;这…

SpringCloud篇(微服务)

目录 一、认识微服务 1. 单体架构 2. 分布式架构 3. 微服务 3.1. 特点 3.2. 优点 3.3 缺点 二、微服务设计、拆分原则 1. AKF 拆分原则 2. Y轴&#xff08;功能&#xff09;关注应用中功能划分&#xff0c;基于不同的业务拆分 3. X轴&#xff08;水平扩展&#xff09…

Hive简介 | 体系结构

Hive简介 Hive 是一个框架&#xff0c;可以通过编写sql的方式&#xff0c;自动的编译为MR任务的一个工具。 在这个世界上&#xff0c;会写SQL的人远远大于会写java代码的人&#xff0c;所以假如可以将MR通过sql实现&#xff0c;这个将是一个巨大的市场&#xff0c;FaceBook就这…

高校宿舍信息管理系统小程序

作者主页&#xff1a;编程千纸鹤 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参…

森林防火责任大于天,可视化监控大屏让隐患无处遁形。

在大自然的生态系统中&#xff0c;森林是地球之肺&#xff0c;为我们提供着清新的空气、丰富的资源和优美的环境。然而&#xff0c;森林火灾却如同一场可怕的灾难&#xff0c;随时可能摧毁这片宝贵的绿色财富。森林防火责任大于天&#xff0c;而可视化监控大屏的出现&#xff0…