Android studio进阶开发(七)---做一个完整的登录系统(前后端连接)

article/2025/7/23 21:51:08

我们已经讲过了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>![请添加图片描述](https://i-blog.csdnimg.cn/direct/f87f0feedfa348a4a6e3add4981b8eed.png)<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来进行登录,同时还要保证网络连接的相同,就可以正常连接了。

请添加图片描述


http://www.hkcw.cn/article/GNYCnchJsE.shtml

相关文章

【笔记】在 MSYS2(MINGW64)中正确安装 Rust

#工作记录 1. 环境信息 Windows系统: MSYS2 MINGW64当前时间: 2025年6月1日Rust 版本: rustc 1.87.0 (17067e9ac 2025-05-09) (Rev2, Built by MSYS2 project) 2. 安装步骤 步骤 1: 更新系统包数据库并升级已安装的包 首先&#xff0c;确保我们的 MSYS2 系统是最新状态。打…

在Mathematica中可视化Root和Log函数

对于取n次根式&#xff0c;使用其实部 当做高度函数&#xff0c;可以实现可视化&#xff1a; ViewRootSurface[n_Integer, resolution_Integer] : ParametricPlot3D[{r*Cos[theta], r*Sin[theta], r^(1/n)*Cos[theta/n]},{r, 0, 2}, {theta, 0, 2*n*Pi},PlotPoints -> {res…

Canvas: trying to draw too large(256032000bytes) bitmap.

1、错误展示 测试了一下一张图片的显示&#xff0c;发现二个手机上测试的结果不一样&#xff0c;配制好一些的手机&#xff0c;直接就通过&#xff0c;但是屏小一些的测试手机上&#xff0c;直接报下面的错误。 这个意思是图片太大了&#xff0c;直接就崩了。 2、代码编写 lo…

免费电脑倒计时实用小工具

软件介绍 本文介绍两款电脑上实用的倒计时小软件&#xff0c;它们都能满足用户不同的计时需求。 AarClock软件特点 第一款软件是AarClock倒计时软件&#xff0c;它最大的特点是无需安装&#xff0c;下载后即可直接使用。 AarClock个性化设置 用户可以根据个人喜好自定义软件…

CSS基础巩固-基础-选择

目录 CSS是如何工作的&#xff1f; 当浏览器遇到无法解析的CSS代码时 如何导入CSS样式&#xff1f; 改变元素的默认样式 选择 前缀符号&#xff08;后面会具体介绍&#xff09; 优先级 同时应用样式到多个类上 属性选择器 伪类 伪元素 关系选择器 后代选择器 子代…

郑钦文被观众当面合唱日不落后害羞 法网8强创佳绩

在北京时间6月1日晚结束的法网女单1/8决赛中,中国选手郑钦文经过三盘苦战,以2-1战胜赛会19号种子萨姆索诺娃,首次闯入法网女单八强。比赛结束后,郑钦文来到场边给球迷签名。现场的中国球迷高声歌唱《日不落》为她庆祝。原本一脸疲惫的郑钦文被球迷的热情逗笑了,随后她也跟…

专家谈汽车行业价格战警钟 无序竞争无赢家

5月31日,中国汽车工业协会发布《关于维护公平竞争秩序 促进行业健康发展》的倡议。倡议提到,近年来我国新能源汽车产业快速发展,新能源汽车新车销售占比已经超过40%。行业整体运行呈现稳中向好态势,市场活力持续释放。然而,一段时间以来,行业盈利水平下降,以无序“价格战…

[创业之路-402]:企业战略管理案例分析-战略执行-关键任务

一、概述 BLM中关键任务概述 在BLM&#xff08;业务领先模型&#xff09;中&#xff0c;关键任务是战略执行环节的核心要素&#xff0c;是将战略意图转化为实际行动和业务成果的关键桥梁。它明确了组织在特定时期内需要聚焦完成的核心活动&#xff0c;这些活动直接关系到战略…

ck-editor5的研究 (3):初步使用 CKEditor5 的事件系统和API

前言 在上一篇文章中—— ck-editor5的研究&#xff08;2&#xff09;&#xff1a;对 CKEditor5 进行设计&#xff0c;并封装成一个可用的 vue 组件 &#xff0c;我已经把 CKEditor5 封装成了一个通用vue组件&#xff0c;并且成功在nuxt中运行&#xff0c;并具备一定的通用性&…

苏超联赛无锡观众离场不留一片垃圾 文明观赛获赞

南京奥体中心门口,几个年轻球迷正蹲在路边刷手机,手指都快把屏幕戳破了。苏超联赛的门票开售后十分钟内所有场次全部售罄,尤其是6月1日南京队主场对阵无锡队的比赛,黄牛票甚至炒到了原价的五倍。南京队更衣室里,25岁的孟振正在脚上缠绷带。这位身价75万的本土球星最近压力…

北京今天最高气温31℃,西部北部有分散性阵雨或雷阵雨 北风较大需防风

今天6月2日白天,北京天气由晴转多云,最高气温达到31℃。西部和北部地区可能出现分散性阵雨或雷阵雨。受冷空气影响,北京北风较强,阵风可达6至7级,市民需注意防风。责任编辑:zx0176

美官员:预计中美本周就关税问题会谈 双方表达谈判意愿

当地时间6月1日,白宫国家经济委员会主任凯文哈西特在美国广播公司《本周》节目中表示,预计中美将于本周就关税问题进行会谈。他提到双方都表达了谈判的意愿,并且每天都在沟通,试图推动此事取得进展。5月10日至11日,中美经贸高层在瑞士日内瓦举行会谈,双方同意在90天内降低…

SpringAI(GA):RAG下的ETL快速上手

原文链接&#xff1a;SpringAI(GA)&#xff1a;RAG下的ETL快速上手 教程说明 说明&#xff1a;本教程将采用2025年5月20日正式的GA版&#xff0c;给出如下内容 核心功能模块的快速上手教程核心功能模块的源码级解读Spring ai alibaba增强的快速上手教程 源码级解读 版本&a…

AI大模型赋能,aPaaS+iPaaS构建新一代数智化应用|爱分析报告

01 aPaaS和iPaaS成为企业用户关注重点 PaaS市场定义 根据Gartner的定义&#xff0c;PaaS&#xff08;Platform as a Service&#xff09;平台是应用基础架构&#xff08;中间件&#xff09;服务的广泛集合&#xff0c; 包含应用平台、集成、业务流程管理、数据服务和AI应用等…

性能优化 - 工具篇:基准测试 JMH

文章目录 Pre引言1. JMH 简介2. JMH 执行流程详解3. 关键注解详解3.1 Warmup3.2 Measurement3.3 BenchmarkMode3.4 OutputTimeUnit3.5 Fork3.6 Threads3.7 Group 与 GroupThreads3.8 State3.9 Setup 与 TearDown3.10 Param3.11 CompilerControl 4. 示例代码与分析4.1 关键点解读…

郑钦文淋雨一直走 从黑洞到彩虹的心情旅程

6月1日,郑钦文在法网女单1/8决赛中获胜。赛后她用张韶涵的《淋雨一直走》来形容自己的心情:“有时掉进黑洞,有时爬上彩虹。”谈及决胜盘前的调整和获胜关键,郑钦文表示第二盘第一局曾有40-0的领先优势,但未能把握住机会,反而让对手进入了状态。在丢掉第二盘后,她去卫生间…

印度拉拢蒙古能抄中国稀土的作业吗 绕不开的运输难题

印度在与巴基斯坦的冲突中失利后不久,便与蒙古国展开了联合军演。蒙古国空军成立100周年阅兵式上,仅有的两架米格-29战机飞过乌兰巴托上空。五天后,印度陆军特遣队跨越5000公里抵达这片草原,启动了一场被网友戏称为“蒙古出海军,印度出空军”的联合军演。5月31日,“游牧大…

斯瓦泰克2比1莱巴金娜 逆转晋级法网八强

6月1日,在法国网球公开赛女单第四轮比赛中,四届赛会冠军、5号种子斯瓦泰克以2-1(1-6、6-3、7-5)逆转战胜12号种子莱巴金娜,本赛季三次击败对手,并取得法网25连胜。斯瓦泰克在这场比赛中获得了430分和44万欧元的奖金。她连续六年闯入法网八强,这是她第11次跻身大满贯八强…

南京五台山体育场再现人浪 雨夜观赛创纪录

6月1日晚,江苏省城市足球联赛的一场焦点战在南京五台山体育场举行,对阵双方是南京队与无锡队。最终,南京队以1:0小胜无锡队,取得赛事两连胜,并将城市联赛排名提升至第三。比赛日下午5点不到,五台山体育场已经开始有序检票,球迷方阵先行进场布置助威横幅。由于比赛日一直…

Linux服务器 TensorFlow找不到GPU

记录一下这次长达两天的心累Debug&#xff1a;Could not find cuda drivers on your machine, GPU will not be used.&#xff0c;先说一下我的项目情况 使用VSCode ssh连接实验室服务器&#xff0c;无root权限&#xff0c;不能使用sudo指令&#xff0c;Linux系统&#xff0c;…