Android用户登录与数据存储:从权限请求到内外部存储的完整实践【完整实践步骤、外部存储、内部存储】

步骤 1: 登录页面布局

MainActivity 中实现用户登录功能,首先创建一个布局文件 activity_main.xml 包含用户名和密码的输入字段以及登录按钮。

<!-- activity_main.xml -->
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="16dp"><EditTextandroid:id="@+id/editTextUsername"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="用户名" /><EditTextandroid:id="@+id/editTextPassword"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="密码"android:inputType="textPassword" /><Buttonandroid:id="@+id/buttonLogin"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="登录" /></LinearLayout>

实现效果
在这里插入图片描述

步骤 2:商品列表页面布局

在Android Studio中,右键点击项目的app目录,选择“New” > “Activity” > “Empty Activity”。
在这里插入图片描述

布局文件 activity_product_list.xml 用于显示商品列表。

<!-- activity_product_list.xml -->
<ListViewxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/listViewProducts"android:layout_width="match_parent"android:layout_height="match_parent" />

实现效果
在这里插入图片描述

然后,在 ProductListActivity.java 中加载商品数据并显示在 ListView 中。

import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import androidx.appcompat.app.AppCompatActivity;public class ProductListActivity extends AppCompatActivity {private ListView listViewProducts;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_product_list);listViewProducts = findViewById(R.id.listViewProducts);// 在这里获取商品数据,可以从网络或本地获取// 假设你有一个商品列表的字符串数组String[] products = {"商品1", "商品2", "商品3", "商品4"};// 使用ArrayAdapter将商品数据绑定到ListViewArrayAdapter<String> adapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1, products);listViewProducts.setAdapter(adapter);}
}

步骤 3:实现登录功能

然后在 MainActivity.java 中处理登录逻辑,验证用户名和密码是否正确。在成功登录后,跳转到商品列表页面。

package com.leo.login_filestore;import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;
import android.widget.Toast;public class MainActivity extends AppCompatActivity {private EditText editTextUsername;private EditText editTextPassword;private Button buttonLogin;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);editTextUsername = findViewById(R.id.editTextUsername);editTextPassword = findViewById(R.id.editTextPassword);buttonLogin = findViewById(R.id.buttonLogin);buttonLogin.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 在这里验证用户名和密码是否正确String username = editTextUsername.getText().toString();String password = editTextPassword.getText().toString();if (isValidCredentials(username, password)) {// 登录成功,跳转到商品列表页面startActivity(new Intent(MainActivity.this, ProductListActivity.class));} else {// 登录失败,显示错误消息Toast.makeText(MainActivity.this, "登录失败,用户名或密码不正确", Toast.LENGTH_SHORT).show();}}});}private boolean isValidCredentials(String username, String password) {// 在这里实现验证逻辑,比较输入的用户名和密码是否正确// 这里可以将用户名和密码写在代码中或从其他数据源获取// 用户名和密码硬编码在代码中,用于演示String validUsername = "user";String validPassword = "password";// 比较输入的用户名和密码与有效的用户名和密码是否匹配return username.equals(validUsername) && password.equals(validPassword);}}

实现效果
user

步骤 4:请求外部存储权限

要请求外部存储权限,你需要在 AndroidManifest.xml 中添加权限声明。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:ignore="WrongManifestParent" />

在这里插入图片描述

步骤 5:编写SaveUtil类用于保存数据到外部存储上的文件

创建一个 SaveUtil.java 类来处理数据保存到外部存储的逻辑。

使用 Environment.getExternalStorageDirectory() 来获取外部存储的根目录,然后创建一个文件并将数据写入其中。这将使你的代码更加灵活,因为它动态获取了外部存储的路径,而不是硬编码路径。请确保在使用外部存储时处理好权限问题。

package com.leo.login_filestore;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;import android.os.Environment;public class SaveUtil {public static boolean saveDataToExternalStorage(String filename, String data) {// 在这里实现数据保存到外部存储的逻辑// 注意要处理异常情况try {// 获取外部存储根目录File root = Environment.getExternalStorageDirectory();// 创建要保存的文件File file = new File(root, filename);// 创建文件输出流FileOutputStream fos = new FileOutputStream(file);// 写入数据fos.write(data.getBytes());// 关闭文件输出流fos.close();return true;} catch (IOException e) {e.printStackTrace();return false;}}
}

步骤 6: 在MainActivity中调用SaveUtil类实现保存用户名和密码

在登录成功后,调用 SaveUtil 类保存用户名和密码到外部存储。这里我们使用模拟数据,实际情况下应该更加安全地保存密码。

存储的默认目录:/storage/emulated/0/你的文件

// 登录成功后
if (isValidCredentials(username, password)) {// 保存用户名和密码到外部存储boolean saved = SaveUtil.saveDataToExternalStorage("credentials.txt", username + "," + password);if (saved) {// 跳转到商品列表页面startActivity(new Intent(MainActivity.this, ProductListActivity.class));} else {// 处理保存失败的情况}
}

步骤 7:在 MainActivity 中请求权限保存代码

还需要在 MainActivity 中请求权限。通常,这会在应用的运行时动态请求。
完整代码

package com.leo.login_filestore;import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;import android.Manifest;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.widget.Toast;public class MainActivity extends AppCompatActivity {private static final int PERMISSION_REQUEST_CODE = 1;private EditText editTextUsername;private EditText editTextPassword;private  String username;private  String password;private Button buttonLogin;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);editTextUsername = findViewById(R.id.editTextUsername);editTextPassword = findViewById(R.id.editTextPassword);buttonLogin = findViewById(R.id.buttonLogin);// 请求外部存储权限requestStoragePermission();buttonLogin.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 在这里验证用户名和密码是否正确username = editTextUsername.getText().toString();password = editTextPassword.getText().toString();if (isValidCredentials(username, password)) {// 登录成功,跳转到商品列表页面startActivity(new Intent(MainActivity.this, ProductListActivity.class));saveDataToExternalStorage();} else {// 登录失败,显示错误消息Toast.makeText(MainActivity.this, "登录失败,用户名或密码不正确", Toast.LENGTH_SHORT).show();}}});}private void requestStoragePermission() {if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {// 请求权限ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},PERMISSION_REQUEST_CODE);}}private void saveDataToExternalStorage() {System.out.println(username + "," + password);// 可以使用FileOutputStream等方式boolean saved = SaveUtil.saveDataToExternalStorage("credentials.txt", username + "," + password);}private boolean isValidCredentials(String username, String password) {// 在这里实现验证逻辑,比较输入的用户名和密码是否正确// 这里可以将用户名和密码写在代码中或从其他数据源获取// 用户名和密码硬编码在代码中,用于演示String validUsername = "user";String validPassword = "password";// 比较输入的用户名和密码与有效的用户名和密码是否匹配return username.equals(validUsername) && password.equals(validPassword);}}

实现效果
请添加图片描述
存储到虚拟机文件中的内容——/storage/emulated/0/credentials.txt
在这里插入图片描述

步骤 8:尝试自动登录

当前我们已经实现了保存用户名和密码到外部存储的逻辑。接下来,需要修改 MainActivity,在启动应用时尝试读取 credentials.txt 文件中的用户名和密码,并实现自动登录。

private static final String CREDENTIALS_FILE = "credentials.txt";@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// ...// 尝试自动登录tryAutoLogin();
}private void tryAutoLogin() {String savedCredentials = readDataFromExternalStorage(CREDENTIALS_FILE);if (savedCredentials != null) {String[] parts = savedCredentials.split(",");if (parts.length == 2) {String savedUsername = parts[0];String savedPassword = parts[1];// 检查保存的用户名和密码是否与有效凭据匹配if (isValidCredentials(savedUsername, savedPassword)) {// 自动登录成功,跳转到商品列表页面startActivity(new Intent(MainActivity.this, ProductListActivity.class));}}}
}private String readDataFromExternalStorage(String filename) {try {File root = Environment.getExternalStorageDirectory();File file = new File(root, filename);if (file.exists()) {FileInputStream fis = new FileInputStream(file);InputStreamReader isr = new InputStreamReader(fis);BufferedReader bufferedReader = new BufferedReader(isr);StringBuilder sb = new StringBuilder();String line;while ((line = bufferedReader.readLine()) != null) {sb.append(line);}bufferedReader.close();return sb.toString();}} catch (IOException e) {e.printStackTrace();}return null;
}

上述代码在 onCreate 中调用了 tryAutoLogin 方法,该方法会尝试从 credentials.txt 文件中读取保存的用户名和密码,然后检查它们是否与有效凭据匹配。如果匹配成功,它将执行自动登录并跳转到商品列表页面。

请确保在 AndroidManifest.xml 中添加适当的权限声明以及在 Android 11 及更高版本上正确处理存储权限。

实现自动登录效果
请添加图片描述

步骤 9: 使用内部存储文件和SharedPreferences实现自动登录功能

我们使用SharedPreferences来保存和检索用户名和密码。tryAutoLogin 方法尝试从SharedPreferences中获取保存的凭据,并自动登录用户,如果凭据存在并有效的话。

确保在 ProductListActivity 中实现商品列表的显示,这部分代码应该保持不变。

代码如下:

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private EditText editTextUsername;private EditText editTextPassword;private Button buttonLogin;private SharedPreferences sharedPreferences;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);editTextUsername = findViewById(R.id.editTextUsername);editTextPassword = findViewById(R.id.editTextPassword);buttonLogin = findViewById(R.id.buttonLogin);sharedPreferences = getSharedPreferences("MyAppPrefs", MODE_PRIVATE);tryAutoLogin();buttonLogin.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String username = editTextUsername.getText().toString();String password = editTextPassword.getText().toString();if (isValidCredentials(username, password)) {// 登录成功,保存用户名和密码到SharedPreferencessaveCredentials(username, password);// 跳转到商品列表页面startActivity(new Intent(MainActivity.this, ProductListActivity.class));} else {// 登录失败,显示错误消息Toast.makeText(MainActivity.this, "登录失败,用户名或密码不正确", Toast.LENGTH_SHORT).show();}}});}private void tryAutoLogin() {String savedUsername = sharedPreferences.getString("username", "");String savedPassword = sharedPreferences.getString("password", "");if (!savedUsername.isEmpty() && !savedPassword.isEmpty()) {// 自动登录成功,跳转到商品列表页面startActivity(new Intent(MainActivity.this, ProductListActivity.class));}}private void saveCredentials(String username, String password) {SharedPreferences.Editor editor = sharedPreferences.edit();editor.putString("username", username);editor.putString("password", password);editor.apply();}private boolean isValidCredentials(String username, String password) {// 在这里实现验证逻辑,比较输入的用户名和密码是否正确// 这里可以将用户名和密码写在代码中或从其他数据源获取// 示例:用户名和密码硬编码在代码中,用于演示String validUsername = "user";String validPassword = "password";// 比较输入的用户名和密码与有效的用户名和密码是否匹配return username.equals(validUsername) && password.equals(validPassword);}
}

MainActivity完整代码

package com.leo.login_filestore;
/** 使用内部存储文件和SharedPreferences实现自动登录功能 **/
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private EditText editTextUsername;private EditText editTextPassword;private Button buttonLogin;private SharedPreferences sharedPreferences;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);editTextUsername = findViewById(R.id.editTextUsername);editTextPassword = findViewById(R.id.editTextPassword);buttonLogin = findViewById(R.id.buttonLogin);sharedPreferences = getSharedPreferences("MyAppPrefs", MODE_PRIVATE);tryAutoLogin();buttonLogin.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String username = editTextUsername.getText().toString();String password = editTextPassword.getText().toString();if (isValidCredentials(username, password)) {// 登录成功,保存用户名和密码到SharedPreferencessaveCredentials(username, password);// 跳转到商品列表页面startActivity(new Intent(MainActivity.this, ProductListActivity.class));} else {// 登录失败,显示错误消息Toast.makeText(MainActivity.this, "登录失败,用户名或密码不正确", Toast.LENGTH_SHORT).show();}}});}private void tryAutoLogin() {String savedUsername = sharedPreferences.getString("username", "");String savedPassword = sharedPreferences.getString("password", "");if (!savedUsername.isEmpty() && !savedPassword.isEmpty()) {// 自动登录成功,跳转到商品列表页面startActivity(new Intent(MainActivity.this, ProductListActivity.class));}}private void saveCredentials(String username, String password) {SharedPreferences.Editor editor = sharedPreferences.edit();editor.putString("username", username);editor.putString("password", password);editor.apply();}private boolean isValidCredentials(String username, String password) {// 在这里实现验证逻辑,比较输入的用户名和密码是否正确// 这里可以将用户名和密码写在代码中或从其他数据源获取// 示例:用户名和密码硬编码在代码中,用于演示String validUsername = "user";String validPassword = "password";// 比较输入的用户名和密码与有效的用户名和密码是否匹配return username.equals(validUsername) && password.equals(validPassword);}
}/** # 外部存储实现自动登录 **/
//
//import android.content.Intent;
//import android.content.pm.PackageManager;
//import android.os.Bundle;
//import android.os.Environment;
//import android.view.View;
//import android.widget.Button;
//import android.widget.EditText;
//
//import android.Manifest;
//
//import androidx.annotation.NonNull;
//import androidx.appcompat.app.AppCompatActivity;
//import androidx.core.app.ActivityCompat;
//import androidx.core.content.ContextCompat;
//import android.widget.Toast;
//
//import java.io.BufferedReader;
//import java.io.File;
//import java.io.FileInputStream;
//import java.io.IOException;
//import java.io.InputStreamReader;
//
//public class MainActivity extends AppCompatActivity {
//    private static final int PERMISSION_REQUEST_CODE = 1;
//    private static final String CREDENTIALS_FILE = "credentials.txt";
//
//
//    private EditText editTextUsername;
//    private EditText editTextPassword;
//
//    private  String username;
//    private  String password;
//
//    private Button buttonLogin;
//
//    @Override
//    protected void onCreate(Bundle savedInstanceState) {
//        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);
//
//        editTextUsername = findViewById(R.id.editTextUsername);
//        editTextPassword = findViewById(R.id.editTextPassword);
//        buttonLogin = findViewById(R.id.buttonLogin);
//        // 请求外部存储权限
//        requestStoragePermission();
//
//        tryAutoLogin();
//
//        buttonLogin.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//
//                // 在这里验证用户名和密码是否正确
//                username = editTextUsername.getText().toString();
//                password = editTextPassword.getText().toString();
//
//                if (isValidCredentials(username, password)) {
//                    // 登录成功,跳转到商品列表页面
//                    startActivity(new Intent(MainActivity.this, ProductListActivity.class));
//                    saveDataToExternalStorage();
//                } else {
//                    // 登录失败,显示错误消息
//                    Toast.makeText(MainActivity.this, "登录失败,用户名或密码不正确", Toast.LENGTH_SHORT).show();
//                }
//            }
//        });
//    }
//    private void requestStoragePermission() {
//
//        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
//                != PackageManager.PERMISSION_GRANTED) {
//            // 请求权限
//            ActivityCompat.requestPermissions(this,
//                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
//                    PERMISSION_REQUEST_CODE);
//        }
//    }
//
//    private void saveDataToExternalStorage() {
//        System.out.println(username + "," + password);
//        // 可以使用FileOutputStream等方式
//        boolean saved = SaveUtil.saveDataToExternalStorage("credentials.txt", username + "," + password);
//
//    }
//
//    private boolean isValidCredentials(String username, String password) {
//        // 在这里实现验证逻辑,比较输入的用户名和密码是否正确
//        // 这里可以将用户名和密码写在代码中或从其他数据源获取
//
//        // 用户名和密码硬编码在代码中,用于演示
//        String validUsername = "user";
//        String validPassword = "password";
//
//        // 比较输入的用户名和密码与有效的用户名和密码是否匹配
//        return username.equals(validUsername) && password.equals(validPassword);
//    }
//
//    private void tryAutoLogin() {
//        String savedCredentials = readDataFromExternalStorage(CREDENTIALS_FILE);
//        if (savedCredentials != null) {
//            String[] parts = savedCredentials.split(",");
//            if (parts.length == 2) {
//                String savedUsername = parts[0];
//                String savedPassword = parts[1];
//
//                // 检查保存的用户名和密码是否与有效凭据匹配
//                if (isValidCredentials(savedUsername, savedPassword)) {
//                    // 自动登录成功,跳转到商品列表页面
//                    startActivity(new Intent(MainActivity.this, ProductListActivity.class));
//                }
//            }
//        }
//    }
//
//    private String readDataFromExternalStorage(String filename) {
//        try {
//            File root = Environment.getExternalStorageDirectory();
//            File file = new File(root, filename);
//
//            if (file.exists()) {
//                FileInputStream fis = new FileInputStream(file);
//                InputStreamReader isr = new InputStreamReader(fis);
//                BufferedReader bufferedReader = new BufferedReader(isr);
//
//                StringBuilder sb = new StringBuilder();
//                String line;
//                while ((line = bufferedReader.readLine()) != null) {
//                    sb.append(line);
//                }
//
//                bufferedReader.close();
//                return sb.toString();
//            }
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//
//        return null;
//    }
//
//}

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

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

相关文章

Qt之实现圆形进度条

在Qt自带的控件中&#xff0c;只有垂直进度条、水平进度条两种。 在平时做页面开发时&#xff0c;有些时候会用到圆形进度条&#xff0c;比如说&#xff1a;下载某个文件的下载进度。 展示效果&#xff0c;如下图所示&#xff1a; 实现这个功能主要由以下几个重点&#xff1a…

记录vue开发实例

封装的表格组件 <template><div><div style"width: 100%" v-if"showList"><el-table v-loading.lock"loading" :data"dataList":header-cell-style"{background: #F2FCFE,fontSize: 14px,color: #50606D}&…

因为在此系统上禁止运行脚本

问题&#xff1a; 解决办法&#xff1a; vue项目搭建中"因为在此系统上禁止运行脚本"报错&#xff0c;解决方法 - 你的剧本 - 博客园 (cnblogs.com)

详解链表oJ<反转链表,链表的中间节点及链表的回文>

hello&#xff0c;大家好&#xff0c;这里是Dark FlameMaster,今天和大家分享的是有关数据结构链表的几道题目&#xff0c;链表的中间节点&#xff0c;反转链表及判断链表是否为回文结构&#xff0c;放在一起讲解会印象更加深刻。 文章目录 一&#xff0c;链表的中间节点二&…

从0到1基于ChatGLM-6B使用LoRA进行参数高效微调

从0到1基于ChatGLM-6B使用LoRA进行参数高效微调 吃果冻不吐果冻皮 ​ 关注他 cliniNLPer 等 189 人赞同了该文章 ​ 目录 收起 ChatGLM-6B简介 具备的一些能力 局限性 LoRA 技术原理 环境搭建 数据集准备 数据预处理 参数高效微调 单卡模式模型训练 数据并行模式模型训练 模型推…

自动驾驶学习笔记(二)——Apollo入门

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《2023星火培训【感知专项营】》免费课程—>传送门 文章目录 前言 Ubuntu Linux文件系统 Linux指令…

水波纹文字效果动画

效果展示 CSS 知识点 text-shadow 属性绘制立体文字clip-path 属性来绘制水波纹 工具网站 CSS clip-path maker 效果编辑器 页面整体结构实现 使用多个 H2 标签来实现水波纹的效果实现&#xff0c;然后使用clip-path结合动画属性一起来进行波浪的起伏动画实现。 <div …

5分钟理解什么是卷积的特征提取

大家好啊&#xff0c;我是董董灿。 卷积算法之所以重要&#xff0c;关键在于其提取特征的能力。 5分钟入门卷积算法中提到&#xff0c;卷积模仿的就是人眼识图的过程&#xff0c;以“感受野”的视角去扫描图片&#xff0c;从而获取不同区域的图片信息。 在这一过程中&#x…

新风机注意事项有哪些?

选择和使用新风机时&#xff0c;有几个关键注意事项需要牢记&#xff1a; 安装位置&#xff1a;新风机的安装位置很重要。通常情况下&#xff0c;应将其安装在室外以避免室内产生噪音和减少室内的体积占据。确保选择合适的安装位置&#xff0c;以便新风机能够顺利引入新鲜空气。…

《从零开始学ARM》勘误

1. 50页 2 51页 3 236页 14.2.3 mkU-Boot 修改为&#xff1a; mkuboot 4 56页 修改为&#xff1a; 位[31&#xff1a;24]为条件标志位域&#xff0c;用f表示&#xff1b; 位[23&#xff1a;16]为状态位域&#xff0c;用s表示&#xff1b; 位[15&#xff1a;8]为扩展位域&…

【Unity C#_菜单Window开发系列_Inspector Component UnityEditor开发】

GUI系列操作 1.枚举菜单实现文件1&#xff1a;Assets/MyScript/Test1.cs代码如下&#xff1a; 文件2&#xff1a;Assets/MyScript/Editor/Test1Editor.cs代码如下&#xff1a; 测试一下新建一个场景&#xff0c;新建一个Empty 节点&#xff0c;用来测试枚举组件将文件1&#xf…

Nginx详细学习记录

1. Nginx概述 Nginx是一个轻量级的高性能HTTP反向代理服务器&#xff0c;同时它也是一个通用类型的代理服务器&#xff0c;支持绝大部分协议&#xff0c;如TCP、UDP、SMTP、HTTPS等。 1.1 Nginx基础架构 Nginx默认采用多进程工作方式&#xff0c;Nginx启动后&#xff0c;会运行…

ArcMap:第二届全国大学生GIS技能大赛(广西师范学院)详解-上午题

目录 01 题目 1.1 第一小题 1.2 第二小题 1.3 第三小题 1.4 数据展示 02 思路和实操 2.1 第一问思路 2.2 第一问操作过程 2.2.1 地理配准 2.2.2 镶嵌 2.2.2.1 第一种镶嵌方法 2.2.2.2 第二种镶嵌方法 2.2.3 裁剪 2.2.4 DEM信息提取 2.2.5 分类 2.3 第二问思路 …

网络安全:个人信息保护,企业信息安全,国家网络安全的重要性

在当前的数字化时代&#xff0c;无论是个人&#xff0c;企业&#xff0c;还是国家&#xff0c;都会面临严重的网络安全威胁。网络安全不仅涉及我们的日常生活&#xff0c;也涉及到社会的稳定和国家的安全。这就需要我们高度重视网络安全&#xff0c;强化个人信息保护&#xff0…

数据库配置mysql5.7

1 创建数据库 """ 1.管理员连接数据库 mysql -uroot -proot2.创建数据库 create database hello default charsetutf8;3.查看用户 select user,host,password from mysql.user;# 5.7往后的版本 select user,host,authentication_string from mysql.user; "…

机器学习:决策树

决策树 决策树是一种基于树形结构的模型&#xff0c;决策树从根节点开始&#xff0c;一步步走到叶子节点&#xff08;决策&#xff09;&#xff0c;所有的数据最终都会落到叶子节点&#xff0c;既可以做分类也可以做回归。 特征选择 根节点的选择该用哪一个特征呢&#xff…

【单元测试】如何使用 JUnit5 框架?

JUnit5 单元测试框架使用教程 一、Junit5 是什么&#xff1f; Junit5是一个用于在Java平台上进行单元测试的框架。JUnit 5 框架主要由三部分组成&#xff1a;JUnit Platform、JUnit Jupiter 和 JUnit Vintage。 JUnit Platform&#xff1a;定义了测试引擎的 API&#xff0c;是…

软考程序员考试大纲(2023)

文章目录 前言一、考试说明1.考试目标2.考试要求3&#xff0e;考试科目设置 二、考试范围考试科目1&#xff1a;计算机与软件工程基本知识1&#xff0e;计算机科学基础2&#xff0e;计算机系统基础知识3&#xff0e;系统开发和运行知识4&#xff0e;网络与信息安全基础知识5&am…

pnpm、npm、yarn 包管理工具『优劣对比』及『环境迁移』

前言 博主在开发前端网站的时候&#xff0c;发现随着开发的项目的逐渐增多&#xff0c;安装的依赖包越来越臃肿&#xff0c;依赖包的安装速度也是非常越来越慢&#xff0c;多项目开发管理也是比较麻烦。之前我就了解过 pnpm&#xff0c;但是当时担心更换包管理环境可能会出现的…