个人作业Android学习系统开发日志二

news/2025/3/25 23:26:14/文章来源:https://www.cnblogs.com/zhanglijian/p/18792577

实现Android前端搭建:
entity:

package com.example.learningmanagement.entitydata class User(val userId: String,val username: String,val phoneNumber: String,val userClass: String,val password: String
) {// 校验所有字段非空private fun validateNotEmpty(): Boolean {return userId.isNotEmpty() &&username.isNotEmpty() &&phoneNumber.isNotEmpty() &&userClass.isNotEmpty() &&password.isNotEmpty()}// 校验手机号格式(简单版)private fun validatePhoneFormat(): Boolean {return phoneNumber.matches(Regex("^1[3-9]\\d{9}$"))}// 综合校验fun validateAll(): String? {return when {!validateNotEmpty() -> "所有字段不能为空"!validatePhoneFormat() -> "手机号格式不正确"password.length < 6 -> "密码至少需要6位"else -> null // 返回null表示校验通过}}
}
package com.example.learningmanagement.entitydata class ApiResponse<T>(val code: String,val msg: String,val data: T?
)

network:


package com.example.learningmanagement.networkimport com.google.gson.GsonBuilder
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactoryobject ServiceCreater {val gson = GsonBuilder().setLenient().create()//    换网修改IP地址private const val BASE_URL="http://192.168.78.220:9090/"private val retrofit=Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create(gson)).build()fun <T> create(serviceClass: Class<T>): T= retrofit.create(serviceClass)inline fun<reified T> create(): T= create(T::class.java)
}

service:

package com.example.learningmanagement.serviceimport com.example.learningmanagement.entity.ApiResponse
import com.example.learningmanagement.entity.User
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.Queryinterface UserApiService {@POST("user/register")suspend fun register(@Body user: User): ApiResponse<String>@POST("user/login")suspend fun login(@Body user: User): ApiResponse<User>
}

utils:
实现记住用户名:

package com.example.learningmanagement.utilsimport android.content.Context
import android.content.SharedPreferences
import androidx.core.content.editclass PrefsHelper(context: Context) {private val sharedPref: SharedPreferences = context.getSharedPreferences("AppPrefs", Context.MODE_PRIVATE)// 存储用户Namefun saveLastUserName(username: String) {sharedPref.edit() { putString("LAST_USER_NAME", username) }}// 获取最后登录的用户Namefun getLastUserName(): String? {return sharedPref.getString("LAST_USER_NAME", null)}// 清除存储的Name(可选)fun clearLastUserName() {sharedPref.edit() { remove("LAST_USER_NAME") }}
}

activity:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns: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/etUsername"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="姓名"android:inputType="text"/><EditTextandroid:id="@+id/etPassword"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="密码"android:inputType="textPassword"android:layout_marginTop="8dp"/><Buttonandroid:id="@+id/btnLogin"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="登录"android:layout_marginTop="16dp"/><TextViewandroid:id="@+id/tvToRegister"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="没有账号?立即注册"android:textColor="@color/purple_500"android:layout_gravity="center_horizontal"android:layout_marginTop="16dp"/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<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/etUserId"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="学号"android:inputType="text"/><EditTextandroid:id="@+id/etUsername"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="姓名"android:inputType="textPersonName"/><EditTextandroid:id="@+id/etPhone"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="手机号"android:inputType="phone"/><EditTextandroid:id="@+id/etClass"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="班级"android:inputType="text"/><EditTextandroid:id="@+id/etPassword"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="密码"android:inputType="textPassword"/><Buttonandroid:id="@+id/btnRegister"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="注册"android:layout_marginTop="16dp"/>
</LinearLayout>

ui:

package com.example.learningmanagement.uiimport android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import com.example.learningmanagement.R
import com.example.learningmanagement.entity.User
import com.example.learningmanagement.network.ServiceCreater
import com.example.learningmanagement.service.UserApiService
import com.example.learningmanagement.utils.PrefsHelper
import kotlinx.coroutines.launchclass LoginActivity : AppCompatActivity() {private val prefs by lazy { PrefsHelper(this) }private lateinit var etUsername: EditTextprivate lateinit var etPassword: EditTextprivate lateinit var btnLogin: Buttonprivate lateinit var tvToRegister: TextViewprivate val userService = ServiceCreater.create<UserApiService>()@SuppressLint("MissingInflatedId")override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_login)// 初始化视图etUsername = findViewById(R.id.etUsername)etPassword = findViewById(R.id.etPassword)btnLogin = findViewById(R.id.btnLogin)tvToRegister = findViewById(R.id.tvToRegister)//记住用户名prefs.getLastUserName()?.let { savedName ->findViewById<EditText>(R.id.etUsername).setText(savedName)}// 登录按钮点击事件btnLogin.setOnClickListener {handleLogin()}// 跳转到注册页面tvToRegister.setOnClickListener {startActivity(Intent(this, RegisterActivity::class.java))}}private fun handleLogin() {val user = User(userId = null.toString(),username = etUsername.text.toString().trim(),phoneNumber = null.toString(),userClass = null.toString(),password = etPassword.text.toString().trim())if (user.username.isEmpty() || user.password.isEmpty()) {Toast.makeText(this, "姓名和密码不能为空", Toast.LENGTH_SHORT).show()return}lifecycleScope.launch {try {val response = userService.login(user)if (response.code == "200") {Toast.makeText(this@LoginActivity,"登录成功",Toast.LENGTH_SHORT).show()// 这里可以跳转到主页面(例如HomeActivity)} else {Toast.makeText(this@LoginActivity,"登录失败: ${response.msg}",Toast.LENGTH_SHORT).show()}} catch (e: Exception) {Toast.makeText(this@LoginActivity,"网络错误: ${e.message}",Toast.LENGTH_SHORT).show()}}}
}

package com.example.learningmanagement.uiimport android.annotation.SuppressLint
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import com.example.learningmanagement.R
import com.example.learningmanagement.entity.User
import com.example.learningmanagement.network.ServiceCreater
import com.example.learningmanagement.service.UserApiService
import com.example.learningmanagement.utils.PrefsHelper
import kotlinx.coroutines.launchclass RegisterActivity : AppCompatActivity() {private val prefs by lazy { PrefsHelper(this) }private lateinit var etUserId: EditTextprivate lateinit var etUsername: EditTextprivate lateinit var etPhone: EditTextprivate lateinit var etClass: EditTextprivate lateinit var etPassword: EditTextprivate lateinit var btnRegister: Buttonprivate val userService = ServiceCreater.create<UserApiService>()@SuppressLint("MissingInflatedId")override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_register)// 初始化视图etUserId = findViewById(R.id.etUserId)etUsername = findViewById(R.id.etUsername)etPhone = findViewById(R.id.etPhone)etClass = findViewById(R.id.etClass)etPassword = findViewById(R.id.etPassword)btnRegister = findViewById(R.id.btnRegister)btnRegister.setOnClickListener {handleRegister()}}private fun handleRegister() {val user = User(userId = etUserId.text.toString().trim(),username = etUsername.text.toString().trim(),phoneNumber = etPhone.text.toString().trim(),userClass = etClass.text.toString().trim(),password = etPassword.text.toString().trim())// 使用实体类的校验方法user.validateAll()?.let { errorMsg ->Toast.makeText(this, errorMsg, Toast.LENGTH_SHORT).show()return}lifecycleScope.launch {try {val response = userService.register(user)if (response.code == "200") {prefs.saveLastUserName(user.username)Toast.makeText(this@RegisterActivity,response.msg,Toast.LENGTH_SHORT).show()finish()} else {Toast.makeText(this@RegisterActivity,"注册失败: ${response.msg}",Toast.LENGTH_SHORT).show()}} catch (e: Exception) {Toast.makeText(this@RegisterActivity,"网络错误: ${e.message}",Toast.LENGTH_SHORT).show()}}}
}

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

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

相关文章

石油化工厂区防爆入侵报警系统

石油化工厂区防爆入侵报警系统采用AI智能防爆预警摄像头嵌入AI人体识别深度算法,对人体目标特征的检测分析识别预警。系统设备采用AI算法,通过大量真实的场景样本训练后,能够在各种应用场景下及时准确地对场景中发生的人体入侵行为发出告警信息。通过对实时视频图像进行智能…

矿山皮带运输机安全监测预警系统

智慧矿山皮带运输机安全监测预警系统是基于AI视频监测分析识别的智能皮带管理系统,该系统通过将人工智能识别算法提高实时分析的效率,达到现场快速识别、分析、预警的目的,为矿山皮带运输系统提供可视化的安全生产保障,该系统已经实现了皮带运输机大媒块、传输带异物、传输…

OP253自动安装凸轮弹簧常见问题

1.夹爪抓取弹簧后不停扔料 两台弹簧振动盘里面的弹簧是镜像件,如果出现混料被取走,会导致卷簧时卡死。夹爪夹住弹簧并提起时,有两个接近开关会检测弹簧是否正确,如果不正确,会将弹簧扔进废料桶。上图两个接近开关是埋入式,只有中心位置检测。应该左边不亮,右边亮,如果任…

web作业

制作一个学生管理系统包括按钮和输入框学生成绩管理系统body { font-family: Arial, sans-serif; margin: 20px } \3c pre>\3c code> h1 { text-align: center } .add-student, .search, .filters { margin-bottom: 20px } table { width: 100%; border-collapse: col…

linux主机新增硬盘与挂载

近期对工作站主机新增了硬盘,网上搜罗了一些教程,整合了一下,感谢相关博主的知识分享,本篇只是整合参考:https://zhuanlan.zhihu.com/p/117651379 https://cn.linux-console.net/?p=10440新增硬盘处理 新增硬盘后,在linux系统下输入 fdisk -l 命令查看当前磁盘信息可以看…

如何优化SQL查询以提高数据库性能?

你正在自助餐厅,所有的食物看起来都很美味。但你不是拿一个盘子,只取你需要的,而是开始从各个角落堆满食物,弄得一团糟,速度也慢了下来。结果是什么?你拿的东西很多并且效率低下。 这就像没有优化的SQL查询!它们加载了不必要的数据,拖慢了整个系统的速度,并在数据库中…

HTB Season7 Dog

一、信息收集 拿到ip,先测试一下连通性连通性正常,使用nmap扫描一下ip,输入nmap -sV -sC -A 10.10.11.58 -Pn 扫描发现http页面,并且发现了网页使用了BackDropCMS在hosts内添加添加页面,访问网页发现一个登录框,尝试一下sql注入无果,只能另寻出路此时dirsearch扫描发现了…

20242802 2023-2024-2《网络攻防实践》第四周作业

20242802 2023-2024-2 《网络攻防实践》第四周作业 1.实验内容与知识点整理TCP/IP参考模型 在TCP/IP参考模型中,去掉了OSI参考模型中的会话层和表示层(这两层的功能被合并到应用层实现)。同时将OSI参考模型中的数据链路层和物理层合并为主机到网络层,所以在TCP/IP参考模型中…

浅谈--Cache Design Pattern

🤔听说你用过Redis、Caffeine,那我问你你了解Cache Design Pattern吗?Look at my eyes。 今天就来聊聊Cache Design Pattern。Cache Design Pattern是缓存设计模式,是用于优化系统性能、减少资源消耗和提升响应速度的软件架构策略。主要有六大核心缓存模式。 Cache-Aside …

七、神经网络-非线性激活

小土堆视频:https://www.bilibili.com/video/BV1hE411t7RN?spm_id_from=333.788.videopod.episodes&vd_source=6cb513d59bf1f73f86d4225e9803d47b&p=19非线性变换的主要目的:引入非线性能力,使模型能够学习复杂的映射关系。如果没有非线性激活,神经网络本质上相当…

日报2025325

今日继续学习springboot,已实现springboot+vue的前后端跨域连接关键是配置CorsConfig以及Requestjs

15. SD卡

一、SD卡简介SD 卡的规范由 SD 卡协会明确,可以访问 https://www.sdcard.org 查阅更多标准。SD 卡主要有 SD、Mini SD 和 microSD(原名 TF 卡,2004 年正式更名为 Micro SD Card)三种类型,Mini SD 已经被 microSD 取代。上述表格的 “脚位数”,对应于实卡上的 “金手指” …