Android studio进阶开发(七)---做一个完整的登录系统(前后端连接)
我们已经讲过了okhttp和登录系统的使用,我们今天做一个完整的登录系统,后端用spring+mybatis去做
数据库内容
-- 创建学生信息表
CREATE TABLE student_info (id SERIAL PRIMARY KEY, -- 添加自增主键name VARCHAR(255) NOT NULL,number INT NOT NULL,code INT NOT NULL,student_id INT UNIQUE NOT NULL, -- 学号唯一Ptteacher VARCHAR(255),Zone INT,grade INT NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 添加创建时间戳
);-- 插入示例数据
INSERT INTO student_info (name, number, code, student_id, Ptteacher, Zone, grade)
VALUES ('张三', 1001, 2023, 20230001, '王老师', 2, 1),('李四', 1002, 2023, 20230002, '刘老师', 1, 1),('王五', 2001, 2022, 20220001, '张老师', 3, 2),('赵六', 2002, 2022, 20220002, '谢老师', 2, 2), -- 导师可以为空('钱七', 3001, 2021, 20210001, '陈老师', 1, 3);-- 查询验证数据
SELECT * FROM student_info;
效果图
后端
Student.java
package com.example.threes;public class Student { // 改为更有意义的类名private Integer id; // 添加主键private String name;private Integer number;private Integer code;private Integer studentId; // 改为Java命名规范private String ptTeacher; // 改为Java命名规范private Integer zone;private Integer grade;// 所有getter/setterpublic Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getNumber() {return number;}public void setNumber(Integer number) {this.number = number;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public Integer getStudentId() {return studentId;}public void setStudentId(Integer studentId) {this.studentId = studentId;}public String getPtTeacher() {return ptTeacher;}public void setPtTeacher(String ptTeacher) {this.ptTeacher = ptTeacher;}public Integer getZone() {return zone;}public void setZone(Integer zone) {this.zone = zone;}public Integer getGrade() {return grade;}public void setGrade(Integer grade) {this.grade = grade;}
}
StudentController.java
package com.example.threes;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
@RequestMapping("/students")
public class StudentController {@Autowiredprivate StudentService studentService;@GetMapping("/all")public List<Student> getAllStudents() {return studentService.getAllStudents();}@GetMapping("/search")public List<Student> getStudentById(@RequestParam(value = "student_id", required = true) Integer studentId) {return studentService.getStudentById(studentId);}
}
StudentDao.java
package com.example.threes;
import java.util.List;import java.util.List;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface StudentDao { // 接口改名List<Student> findAll();List<Student> findByStudentId(Integer studentId); // 单一查询方法// 删除其他不相关的方法
}
StudentService.java
package com.example.threes;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class StudentService {@Autowiredprivate StudentDao studentDao;public List<Student> getAllStudents(){return studentDao.findAll();}public List<Student> getStudentById(Integer studentId){return studentDao.findByStudentId(studentId);}
}
Student.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.threes.StudentDao"> <!-- 更新为正确的接口名 --><!-- 结果映射 --><resultMap id="studentResultMap" type="com.example.threes.Student"><id property="id" column="id"/><result property="name" column="name"/><result property="number" column="number"/><result property="code" column="code"/><result property="studentId" column="student_id"/><result property="ptTeacher" column="ptteacher"/><result property="zone" column="zone"/><result property="grade" column="grade"/></resultMap><!-- 查询所有学生 --><select id="findAll" resultMap="studentResultMap">SELECT * FROM student_info</select><!-- 按student_id查询 --><select id="findByStudentId" resultMap="studentResultMap" parameterType="int">SELECT * FROM student_infoWHERE student_id = #{studentId}</select>
</mapper>
效果图
客户端
student.java
package com.example.project_a.Information;public class Student {public String name;public int number;public int code;public int student_id;public String Ptteacher;public int Zone;public int grade;//学生的必要信息,可从数据库中修改public String getName() {return name;}public void setName(String name) {this.name = name;}// number 属性的getter和setterpublic int getNumber() {return number;}public void setNumber(int number) {this.number = number;}// code 属性的getter和setterpublic int getCode() {return code;}public void setCode(int code) {this.code = code;}// student_id 属性的getter和setterpublic int getStudent_id() {return student_id;}public void setStudent_id(int student_id) {this.student_id = student_id;}// Ptteacher 属性的getter和setterpublic String getPtteacher() {return Ptteacher;}public void setPtteacher(String Ptteacher) {this.Ptteacher = Ptteacher;}// Zone 属性的getter和setterpublic int getZone() {return Zone;}public void setZone(int Zone) {this.Zone = Zone;}// grade 属性的getter和setterpublic int getGrade() {return grade;}public void setGrade(int grade) {this.grade = grade;}
}
Stu_Login_Activity.java
package com.example.project_a;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;import android.Manifest;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.PasswordTransformationMethod;
import android.text.method.TransformationMethod;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;import com.example.project_a.Information.Student;
import com.example.project_a.tools.PermissionsInfo;import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import pub.devrel.easypermissions.AfterPermissionGranted;
import pub.devrel.easypermissions.EasyPermissions;public class Stu_Login_Activity extends AppCompatActivity {// 控件声明private EditText mEtUsername;private EditText mEtPassword;private Button mBtnLogin;private Button mBtnFound;private ImageView mImgEye;private CheckBox mChbRemember;private TextView tv_result;private CheckBox mChbAutoLogin;// 额外声明private SharedPreferences loginPreferences;// Student对象作为成员变量private Student student;private boolean studentDataLoaded = false;// 常量定义private static String strUsername = "1";private static String strPassword = "1";private static boolean hide = true;private static String CheckOrNot = "checked";private static String UserName = "UserName";private static String PassWord = "PassWord";private boolean isNetworkVerificationInProgress = false; // 新增标志位@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_stu_login);checkingAndroidVersion(); // 检查安卓版本// 初始化Student对象student = new Student();// 控件绑定mEtUsername = findViewById(R.id.ed_stuLogin_username);mEtPassword = findViewById(R.id.et_stuLogin_Password);mBtnLogin = findViewById(R.id.btn_stuLogin_login);mBtnFound = findViewById(R.id.btn_stuLogin_find);mImgEye = findViewById(R.id.img_stuLogin_eye);mChbRemember = findViewById(R.id.cb_stuLogin_remember);mChbAutoLogin = findViewById(R.id.cb_stuLogin_autologin);tv_result = findViewById(R.id.tv_result); // 确保有这个TextViewloginPreferences = getSharedPreferences("Login_stu", MODE_PRIVATE);boolean checked = loginPreferences.getBoolean(CheckOrNot, false);if (checked) {Map<String, String> map = readLogin();if (map != null) {mEtUsername.setText(map.get(UserName).toString());mEtPassword.setText(map.get(PassWord).toString());mChbRemember.setChecked(checked);}}// 功能实现// 登录mBtnLogin.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 读取是否保存了密码configLoginInfo(mChbRemember.isChecked());// 防止重复点击if (isNetworkVerificationInProgress) {return;}// 正常登录if (onCheck(v)) {Intent intent = new Intent(Stu_Login_Activity.this, Activity_Student_Homepage.class);startActivity(intent);}}});// 跳转到网页mBtnFound.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Uri uri = Uri.parse("http://www.bing.com"); // 账户找回url修改位置Intent intent = new Intent(Intent.ACTION_VIEW, uri);startActivity(intent);}});// 密码显示与否设置mImgEye.setImageResource(R.drawable.invisible);mImgEye.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (v.getId() == R.id.img_stuLogin_eye) {if (hide == true) {mImgEye.setImageResource(R.drawable.visible);HideReturnsTransformationMethod method = HideReturnsTransformationMethod.getInstance();mEtPassword.setTransformationMethod(method);hide = false;} else if (hide == false) {mImgEye.setImageResource(R.drawable.invisible);TransformationMethod method = PasswordTransformationMethod.getInstance();mEtPassword.setTransformationMethod(method);hide = true;}}}});}// 发起GET方式的HTTP请求private void doGet() {isNetworkVerificationInProgress = true; // 设置网络验证开始标志final String username = mEtUsername.getText().toString().trim();if (username.isEmpty()) {runOnUiThread(() -> {Toast.makeText(Stu_Login_Activity.this, "用户名不能为空", Toast.LENGTH_SHORT).show();isNetworkVerificationInProgress = false;});return;}// 1. 构建带参数的URLHttpUrl url = new HttpUrl.Builder().scheme("http").host("192.168.43.9") // 替换为实际IP.port(8080).addPathSegments("students/search") // 层级路径的正确写法.addQueryParameter("student_id", username) // 查询参数 - 使用真实的用户名.build();OkHttpClient client = new OkHttpClient.Builder().connectTimeout(15, TimeUnit.SECONDS) // 添加超时配置.readTimeout(20, TimeUnit.SECONDS).build();Request request = new Request.Builder().url(url).header("Accept-Language", "zh-CN").build();runOnUiThread(() -> Toast.makeText(Stu_Login_Activity.this, "正在验证账号...", Toast.LENGTH_SHORT).show());client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {runOnUiThread(() -> {Toast.makeText(Stu_Login_Activity.this, "网络请求失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();tv_result.setText("请求失败: " + e.getMessage());isNetworkVerificationInProgress = false;});}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (response.isSuccessful()) {String resp = response.body().string();try {JSONArray jsonArray = new JSONArray(resp);// 检查是否有数据if (jsonArray.length() > 0) {// 只取第一组学生数据JSONObject jsonObject = jsonArray.getJSONObject(0);// 填充Student对象数据student.name = jsonObject.optString("name", "未知");student.number = jsonObject.optInt("number", 0);student.code = jsonObject.optInt("code", 0);student.student_id = jsonObject.optInt("studentId", 0);student.Ptteacher = jsonObject.optString("ptTeacher", "未知");student.Zone = jsonObject.optInt("zone", 0);student.grade = jsonObject.optInt("grade", 0);// 标记数据已加载studentDataLoaded = true;// 在UI线程中完成密码验证runOnUiThread(() -> {// 获取用户输入的密码String password = mEtPassword.getText().toString().trim();// 验证服务器返回的code是否与密码匹配if (password.equals(String.valueOf(student.code))) {Toast.makeText(Stu_Login_Activity.this, "登录成功!", Toast.LENGTH_SHORT).show();Intent intent = new Intent(Stu_Login_Activity.this, Activity_Student_Homepage.class);startActivity(intent);} else {Toast.makeText(Stu_Login_Activity.this, "密码错误", Toast.LENGTH_SHORT).show();}isNetworkVerificationInProgress = false; // 重置网络验证标志});} else {runOnUiThread(() -> {Toast.makeText(Stu_Login_Activity.this, "未找到学生信息", Toast.LENGTH_SHORT).show();tv_result.setText("未找到学生信息");isNetworkVerificationInProgress = false;});}} catch (JSONException e) {runOnUiThread(() -> {Toast.makeText(Stu_Login_Activity.this, "JSON解析失败", Toast.LENGTH_SHORT).show();tv_result.setText("JSON解析失败\n原始数据:" + resp);isNetworkVerificationInProgress = false;});}} else {runOnUiThread(() -> {Toast.makeText(Stu_Login_Activity.this, "服务器返回错误: " + response.code(), Toast.LENGTH_SHORT).show();tv_result.setText("服务器返回错误\n状态码:" + response.code());isNetworkVerificationInProgress = false;});}response.close(); // 确保关闭响应资源}});}/*onCheck确认密码事件*/private boolean onCheck(View v) {// 需要获取输入的用户名和密码String username = mEtUsername.getText().toString();String password = mEtPassword.getText().toString();// 弹出内容设置String ok = "登陆成功!";String fail = "密码或用户名有误,登陆失败。";// 1. 检查本地测试账号(特殊硬编码账号)if (username.equals(strUsername) && password.equals(strPassword)) {Toast.makeText(getApplicationContext(), ok, Toast.LENGTH_SHORT).show();return true;}// 2. 检查是否已加载学生数据(网络验证已成功且加载过数据)if (studentDataLoaded && password.equals(String.valueOf(student.code))) {Toast.makeText(getApplicationContext(), ok, Toast.LENGTH_SHORT).show();return true;}// 3. 尝试网络验证doGet();Toast toastCenter = Toast.makeText(Stu_Login_Activity.this, "正在验证账号...", Toast.LENGTH_SHORT);toastCenter.setGravity(Gravity.CENTER_HORIZONTAL, 0, 0);toastCenter.show();return false; // 返回false,等待网络验证回调处理登录结果}/*保存密码*/private void configLoginInfo(boolean checked) {SharedPreferences.Editor editor = loginPreferences.edit();editor.putBoolean(CheckOrNot, mChbRemember.isChecked());if (checked) {editor.putString(UserName, mEtUsername.getText().toString());editor.putString(PassWord, mEtPassword.getText().toString());} else {editor.remove(UserName).remove(PassWord);}editor.commit();}/*登录临时信息读取*/private Map<String, String> readLogin() {Map<String, String> map = new HashMap<>();String username = loginPreferences.getString(UserName, "");String password = loginPreferences.getString(PassWord, "");map.put(UserName, username);map.put(PassWord, password);return map;}// PermissionInfoprivate static final int REQUEST_PERMISSIONS = 9527;public void checkingAndroidVersion() {Toast toastCenter = Toast.makeText(getApplicationContext(), "当前安卓版本为" + Build.VERSION.SDK_INT, Toast.LENGTH_SHORT);toastCenter.show();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {// Android6.0及以上先获取权限再定位requestPermission();} else {// Android6.0以下直接定位Toast toastCenter1 = Toast.makeText(getApplicationContext(), "ok", Toast.LENGTH_SHORT);toastCenter1.show();}}@AfterPermissionGranted(REQUEST_PERMISSIONS)public void requestPermission() {String[] permissions = {android.Manifest.permission.ACCESS_COARSE_LOCATION,android.Manifest.permission.ACCESS_FINE_LOCATION,android.Manifest.permission.READ_PHONE_STATE,Manifest.permission.WRITE_EXTERNAL_STORAGE};if (EasyPermissions.hasPermissions(this, permissions)) {// true 有权限 开始定位Toast info = Toast.makeText(getApplicationContext(), "已获得权限,可以定位啦!", Toast.LENGTH_SHORT);info.show();} else {// false 无权限EasyPermissions.requestPermissions(this, "需要权限", REQUEST_PERMISSIONS, permissions);}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);// 设置权限请求结果EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);}
}
stu_log.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".Stu_Login_Activity"><ImageViewandroid:layout_width="64dp"android:layout_height="64dp"android:src="@drawable/kids"android:layout_marginTop="200dp"android:layout_gravity="center_horizontal"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="20sp"android:text="学 生 登 录 界 面"android:layout_marginTop="10dp"android:gravity="center_horizontal"android:layout_gravity="center_horizontal"/><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"android:layout_marginTop="65dp"android:layout_gravity="center_horizontal"><EditTextandroid:id="@+id/ed_stuLogin_username"android:layout_width="350dp"android:layout_height="48dp"android:layout_gravity="center"android:hint="Username"android:maxLines="1"android:textSize="16sp"/><RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"><EditTextandroid:id="@+id/et_stuLogin_Password"android:layout_width="350dp"android:layout_height="48dp"android:layout_marginTop="6dp"android:layout_gravity="center_horizontal"android:hint="Password"android:inputType="textPassword"android:maxLines="1"android:textSize="16sp"/><ImageViewandroid:id="@+id/img_stuLogin_eye"android:layout_width="32dp"android:layout_height="32dp"android:layout_alignBottom="@+id/et_stuLogin_Password"android:layout_alignEnd="@+id/et_stuLogin_Password"android:layout_alignTop="@+id/et_stuLogin_Password"android:src="@drawable/invisible"/></RelativeLayout><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_gravity="center_horizontal"><CheckBoxandroid:id="@+id/cb_stuLogin_remember"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="记住密码"android:textSize="13sp"/><CheckBoxandroid:id="@+id/cb_stuLogin_autologin"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="自动登录"android:textSize="13sp"android:layout_marginLeft="76dp"/></LinearLayout></LinearLayout><RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"><Buttonandroid:id="@+id/btn_stuLogin_login"android:layout_width="200dp"android:layout_height="wrap_content"android:text="Login"android:textSize="17sp"/><Buttonandroid:id="@+id/btn_stuLogin_find"android:layout_width="95dp"android:layout_height="wrap_content"android:text="found"android:textSize="17sp"android:layout_toRightOf="@id/btn_stuLogin_login"android:layout_marginLeft="5dp"/></RelativeLayout><TextViewandroid:id="@+id/tv_result"android:layout_width="match_parent"android:layout_height="wrap_content"android:paddingLeft="5dp"android:textColor="@color/black"android:textSize="17sp" />
</LinearLayout>
之后我们通过数据库中的student_id和code来进行登录,同时还要保证网络连接的相同,就可以正常连接了。
相关文章:

Android studio进阶开发(七)---做一个完整的登录系统(前后端连接)
我们已经讲过了okhttp和登录系统的使用,我们今天做一个完整的登录系统,后端用springmybatis去做 数据库内容 -- 创建学生信息表 CREATE TABLE student_info (id SERIAL PRIMARY KEY, -- 添加自增主键name VARCHAR(255) NOT NULL,number INT NOT NULL,…...

计算机网络第1章(下):网络性能指标与分层模型全面解析
目录 一、计算机网络的性能指标1.1 性能指标1:速率1.2 性能指标2:带宽1.3 性能指标3:吞吐量1.4 性能指标4:时延1.5 性能指标5:时延带宽积1.6 性能指标6:往返时延1.7 性能指标7:信道利用率 二、计…...

恶意软件清理工具,让Mac电脑安全更简单
你的Mac最近是不是开始表演"电子迷惑行为"?浏览器主页突然变成澳门赌场,风扇转得比直升机螺旋桨还猛......恭喜你!可能中奖获得"恶意软件大礼包"!别慌,今天就教你用恶意软件清理工具化身数字特工…...

HackMyVM-Jabita
信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.43.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-01 05:20 EDT Nmap scan report for 192.168.43.1 Host is up (0.020s latency). MAC Address: C6:45:66:05:91:88 (Unknown) Nmap scan repo…...

112 Gbps 及以上串行链路的有效链路均衡
通道均衡已成为当今高速串行链路的关键机制。目前有许多均衡方案,例如发射机加重均衡、接收机CTLE(连续时间线性均衡器)、FFE(前馈均衡器)、DFE(判决反馈均衡器)和FEC(前向纠错&…...
Mac 版不能连接华为 GaussDB 吗?我看 Windows 版可以连接?
🧑💻 GaussDB 用户 Mac 版不能连接华为 GaussDB 吗?我看Windows 版可以连接。 🧑🔧 官方技术中心 由于 GaussDB 数据库本身未支持 macOS 系统,所以在 macOS 上的 Navicat 中也未支持该数据库。 &…...

Python-13(永久存储)
创建并打开文件 open(file,mode)函数 该函数用于打开一个文件并返回对应的文件对象。 file参数指定的是文件路径和文件名,如果没有添加路径,那么默认将文件创建在python的主文件夹里面。mode参数指定的是打开的模式,r表示读取(…...
《关于有序推动绿电直连发展有关事项的通知》核心内容
《关于有序推动绿电直连发展有关事项的通知》(发改能源〔2025〕650 号)由国家发展改革委和国家能源局于 2025 年 5 月 21 日联合印发,旨在明确绿电直连项目的适用范围、规划引导、运行管理、交易与价格机制以及组织保障等内容。 适用范围与原…...
数据结构-排序(1)
一,排序的基本概念 1.排序的定义 核心概念: 给定一个包含 n 个元素的序列 (R1, R2, ..., Rn) 和一个关键码 Ki(通常是记录 Ri 的一个属性),排序的目标是找到一个排列 (p1, p2, ..., pn),使得关键码序列 (K…...

记录一次session安装应用recyclerview更新数据的bug
首先抛出异常日志,在 先说结论:因为session安装监听是在点击事件里面,所以会保留旧的对象数据 直接上代码,原有的逻辑是点击时执行session安装,并注册监听回调 private fun installApk(position: Int) {val packageIns…...

大数据-274 Spark MLib - 基础介绍 机器学习算法 剪枝 后剪枝 ID3 C4.5 CART
点一下关注吧!!!非常感谢!!持续更新!!! 大模型篇章已经开始! 目前已经更新到了第 22 篇:大语言模型 22 - MCP 自动操作 FigmaCursor 自动设计原型 Java篇开…...

力扣面试150题--二叉树的锯齿形层序遍历
Day 56 题目描述 思路 锯齿形就是一层是从左向右,一层是从右向左,那么我们可以分析样例,对于第奇数层是从左向右,第偶数层是从右向左,于是可以采取一个计数器,采取链表方式,从左向右就是正常插…...

如何在 CentOS / RHEL 上修改 MySQL 默认数据目录 ?
MySQL 是一个广泛使用的开源关系数据库管理系统(RDBMS),为无数的 web 应用程序和服务提供支持。默认情况下,MySQL 将其数据存储在预定义的目录中,这可能并不总是适合您的需求。您可能希望将数据目录移动到另一个位置以获得更好的性能和安全性…...
网页前端开发(基础进阶2)
前面学习了html与css,接下来学习JS(JavaScript与Java无关)。 web标准(网页标准)分为3个部分: 1.html主要负责网页的结构(页面的元素和内容) 2.css主要负责网页的表现(…...

简历制作要精而不简
不得不说,不管是春招,还是秋招,我们在求职时,第一步便是制作一份简历。不得不承认,好的简历,就像一块敲门砖,能让面试官眼前一亮,让应聘成功的概率增添一分。 对于一个初次求职者来…...

SPA-RL:通过Stepwise Progress Attribution训练LLM智能体
SPA-RL:通过Stepwise Progress Attribution训练LLM智能体 在大语言模型(LLM)驱动智能体发展的浪潮中,强化学习(RL)面临着延迟奖励这一关键挑战。本文提出的SPA-RL框架,通过创新的分步进度归因机…...

【深度学习】9. CNN性能提升-轻量化模型专辑:SqueezeNet / MobileNet / ShuffleNet / EfficientNet
SqueezeNet / MobileNet / ShuffleNet / EfficientNet 一、背景与动机 随着深度神经网络在图像识别任务上取得巨大成功,它们的结构越来越深、参数越来越多。然而在移动端或嵌入式设备中: 存储资源有限推理计算能力弱能耗受限 因此,研究者…...

Relational Algebra(数据库关系代数)
目录 What is an “Algebra” What is Relational Algebra? Core Relational Algebra Selection Projection Extended Projection Product(笛卡尔积) Theta-Join Natural Join Renaming Building Complex Expressions Sequences of Assignm…...
【C/C++】面试常考题目
面试中最常考的数据结构与算法题,适合作为刷题的第一阶段重点。 ✅ 分类 & 推荐题目列表(精选 70 道核心题) 一、数组 & 字符串(共 15 题) 题目类型LeetCode编号两数之和哈希表#1盛最多水的容器双指针#11三数…...

Chorme如何对于youtube视频进行画中画背景播放?
画中画可以让你小窗播放,然后浏览器放后台还可以做点别的事情。 B站直接可以选择小窗播放,游览器最小化就可以,但是youtube的小窗播放游览器一切换就不显示了。 其实是因为youtube的小窗播放不是真的小窗播放。要想真的实现需要在youtube视…...

017搜索之深度优先搜索——算法备赛
深度优先搜索 如果说广度优先搜索是逐层扩散,那深度优先搜索就是一条道走到黑。 深度优先遍历是用递归实现的,预定一条顺序规则(如上下左右顺序) ,一直往第一个方向搜索直到走到尽头或不满足要求后返回上一个叉路口按…...
从单机到集群,再到分布式,再到微服务
我会尽量详细讲解,从单机到集群,再到分布式和微服务每个层次的概念、特点和应用场景。同时也会探讨C是否适合做微服务项目。 一、从单机到集群,再到分布式,再到微服务——详细解析 1. 单机(Single Machine)…...
关于ios点击分享自动复制到粘贴板的问题
前言 Android 系统没有什么特别的要求,实现这个也比较容易。但ios在某些情况下就会出现问题。 如果ios是点击之后,请求接口,再把接口的内容赋值给粘贴板肯定行不通,会被ios系统拦截,导致赋值失败或者赋值为空。建议使…...
Hive的JOIN操作如何优化?
Hive的JOIN操作优化是提升查询性能的关键,尤其是在处理大数据量时。以下是详细的JOIN优化策略和实现方法: 一、MapJoin(小表广播优化) 核心原理 将小表全量加载到每个MapTask的内存中,避免Shuffle,直接在…...
React Native 实现抖音式图片滑动切换浏览组件-媲美抖音体验的滑动式流畅预览组件
写在前面 “如何让用户像刷抖音一样浏览我们的图片列表?” —— 这个需求背后隐藏着性能、体验和交互设计的多重挑战。本文将带你从零实现一个高性能的React Native图片浏览器,支持分页预加载、横向滑动预览、文字展示和缓存优化,打造媲美原…...

睿抗机器人开发者大赛CAIP-编程技能赛-历年真题 解题报告汇总 | 珂学家
前言 汇总 睿抗机器人开发者大赛CAIP-编程技能赛-历年真题 解题报告汇总 2024年 2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组 (国赛) 解题报告 2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛)解题报告 2024 睿抗机器人开发者大赛CAI…...

【c++】【数据结构】AVL树
目录 AVL树的定义AVL树的部分模拟实现平衡因子的引入平衡因子的向上调整旋转算法单旋算法右单旋左单旋 双旋算法左右双旋右左双旋 AVL树的定义 AVL树本质是一种搜索二叉树,传统的二叉搜索树我们都有所了解,其在理想情况下也就是接近满二叉树时拥有极高的…...
【原神 × 插入排序】刷圣遗物也讲算法:圣遗物评分系统背后的排序逻辑你真的懂吗?
📘 改编自:王争《数据结构与算法之美》 🎮 游戏演绎:米哈游《原神》 🧠 核心关键词:插入排序、排序算法、评分系统、属性评价、强化圣遗物、冒泡排序对比 🧭 引言:原神刷本=刷排序? 玩《原神》的玩家每天日常是啥?体力用来刷圣遗物、精通头、暴击头、攻充沙………...
ORB-SLAM2学习笔记:ExtractorNode::DivideNode和ORBextractor::DistributeOctTree函数详解
一、ExtractorNode::DivideNode void ExtractorNode::DivideNode(ExtractorNode &n1, ExtractorNode &n2, ExtractorNode &n3, ExtractorNode &n4) {const int halfX = ceil(static_cast<float>(UR.x-UL.x)/2);const int halfY = ceil(static_cast<f…...
nt!MmMapViewInSystemCache函数分析PointerPte的填充
第一部分: 1: kd> kc # 00 nt!MmMapViewInSystemCache 01 nt!CcGetVacbMiss 02 nt!CcGetVirtualAddress 03 nt!CcMapData 04 Ntfs!NtfsMapStream 05 Ntfs!NtfsReadBootSector 06 Ntfs!NtfsMountVolume 07 Ntfs!NtfsCommonFileSystemControl 08 Ntfs!NtfsFspDis…...