日报25428
团队作业开发
package com.example.sanpaias.activity
import android.content.Intent
import android.content.SharedPreferences
import android.os.Bundle
import android.view.View
import android.widget.CheckBox
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import com.example.sanpaias.R
import com.example.sanpaias.activity.dashboard.DashboardActivity
import com.example.sanpaias.model.LoginRequest
import com.example.sanpaias.network.RetrofitClient
import com.google.android.material.textfield.TextInputEditText
import com.google.gson.Gson
import kotlinx.coroutines.launch
class LoginActivity : AppCompatActivity() {
private lateinit var etAccount: TextInputEditText
private lateinit var etPassword: TextInputEditText
private lateinit var cbRememberMe: CheckBox
private lateinit var progressBar: View
private lateinit var sharedPreferences: SharedPreferences
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
// 初始化视图
etAccount = findViewById(R.id.etAccount)
etPassword = findViewById(R.id.etPassword)
cbRememberMe = findViewById(R.id.cbRememberMe)
progressBar = findViewById(R.id.progressBar)
// 初始化SharedPreferences
sharedPreferences = getSharedPreferences("user_prefs", MODE_PRIVATE)
// 登录按钮点击事件
findViewById<View>(R.id.btnLogin).setOnClickListener {
login()
}
// 注册链接点击事件
findViewById<TextView>(R.id.tvRegisterLink).setOnClickListener {
startActivity(Intent(this, RegisterActivity::class.java))
}
// 检查是否已登录
checkAutoLogin()
}
private fun checkAutoLogin() {
// 显示加载进度
progressBar.visibility = View.VISIBLE
// 检查是否有保存的用户信息
val userJson = sharedPreferences.getString("user_info", null)
val savedAccount = sharedPreferences.getString("account", null)
val savedPassword = sharedPreferences.getString("password", null)
if (userJson != null && savedAccount != null && savedPassword != null) {
// 自动填充账号密码
etAccount.setText(savedAccount)
etPassword.setText(savedPassword)
// 自动登录
lifecycleScope.launch {
try {
val request = LoginRequest(savedAccount, savedPassword)
val response = RetrofitClient.instance.login(request)
if (response.isSuccessful) {
val apiResponse = response.body()
if (apiResponse?.code == 200) {
// 登录成功,跳转到主页
val intent = Intent(this@LoginActivity, DashboardActivity::class.java)
startActivity(intent)
finish()
} else {
// 自动登录失败,隐藏加载进度
progressBar.visibility = View.GONE
}
} else {
// 自动登录失败,隐藏加载进度
progressBar.visibility = View.GONE
}
} catch (e: Exception) {
// 自动登录异常,隐藏加载进度
progressBar.visibility = View.GONE
}
}
} else {
// 没有保存的用户信息,隐藏加载进度
progressBar.visibility = View.GONE
}
}
private fun login() {
val account = etAccount.text.toString().trim()
val password = etPassword.text.toString().trim()
if (account.isEmpty() || password.isEmpty()) {
Toast.makeText(this, "请输入账号和密码", Toast.LENGTH_SHORT).show()
return
}
// 显示加载进度
progressBar.visibility = View.VISIBLE
lifecycleScope.launch {
try {
val request = LoginRequest(account, password)
val response = RetrofitClient.instance.login(request)
// 隐藏加载进度
progressBar.visibility = View.GONE
if (response.isSuccessful) {
val apiResponse = response.body()
if (apiResponse?.code == 200) {
// 登录成功
Toast.makeText(this@LoginActivity, "登录成功", Toast.LENGTH_SHORT).show()
// 保存用户信息
val userJson = Gson().toJson(apiResponse.data)
sharedPreferences.edit().apply {
putString("user_info", userJson)
// 如果选择了记住密码,保存账号密码
if (cbRememberMe.isChecked) {
putString("account", account)
putString("password", password)
} else {
remove("account")
remove("password")
}
apply()
}
// 跳转到主页
val intent = Intent(this@LoginActivity, DashboardActivity::class.java)
startActivity(intent)
finish()
} else {
// 登录失败
Toast.makeText(this@LoginActivity, apiResponse?.msg ?: "登录失败", Toast.LENGTH_SHORT).show()
}
} else {
// 请求失败
Toast.makeText(this@LoginActivity, "网络请求失败: ${response.code()}", Toast.LENGTH_SHORT).show()
}
} catch (e: Exception) {
// 异常处理
progressBar.visibility = View.GONE
Toast.makeText(this@LoginActivity, "登录异常: ${e.message}", Toast.LENGTH_SHORT).show()
}
}
}
}
package com.example.sanpaias.activity
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import com.example.sanpaias.R
import com.example.sanpaias.model.RegisterRequest
import com.example.sanpaias.network.RetrofitClient
import com.google.android.material.textfield.TextInputEditText
import kotlinx.coroutines.launch
class RegisterActivity : AppCompatActivity() {
private lateinit var etUsername: TextInputEditText
private lateinit var etPhone: TextInputEditText
private lateinit var etEmail: TextInputEditText
private lateinit var etPassword: TextInputEditText
private lateinit var etConfirmPassword: TextInputEditText
private lateinit var progressBar: View
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_register)
// 初始化视图
etUsername = findViewById(R.id.etUsername)
etPhone = findViewById(R.id.etPhone)
etEmail = findViewById(R.id.etEmail)
etPassword = findViewById(R.id.etPassword)
etConfirmPassword = findViewById(R.id.etConfirmPassword)
progressBar = findViewById(R.id.progressBar)
// 注册按钮点击事件
findViewById<View>(R.id.btnRegister).setOnClickListener {
register()
}
// 登录链接点击事件
findViewById<TextView>(R.id.tvLoginLink).setOnClickListener {
finish() // 返回登录页
}
}
private fun register() {
val username = etUsername.text.toString().trim()
val phone = etPhone.text.toString().trim()
val email = etEmail.text.toString().trim()
val password = etPassword.text.toString().trim()
val confirmPassword = etConfirmPassword.text.toString().trim()
// 输入验证
if (username.isEmpty() || phone.isEmpty() || email.isEmpty() || password.isEmpty()) {
Toast.makeText(this, "请填写完整注册信息", Toast.LENGTH_SHORT).show()
return
}
if (password != confirmPassword) {
Toast.makeText(this, "两次输入的密码不一致", Toast.LENGTH_SHORT).show()
return
}
// 手机号格式验证
if (!phone.matches(Regex("^1[3-9]\\d{9}$"))) {
Toast.makeText(this, "请输入正确的手机号", Toast.LENGTH_SHORT).show()
return
}
// 邮箱格式验证
if (!android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
Toast.makeText(this, "请输入正确的邮箱地址", Toast.LENGTH_SHORT).show()
return
}
// 显示加载进度
progressBar.visibility = View.VISIBLE
// 发起注册请求
lifecycleScope.launch {
try {
val request = RegisterRequest(username, phone, email, password)
val response = RetrofitClient.instance.register(request)
// 隐藏加载进度
progressBar.visibility = View.GONE
if (response.isSuccessful) {
val apiResponse = response.body()
if (apiResponse?.code == 200) {
// 注册成功
Toast.makeText(this@RegisterActivity, "注册成功,请登录", Toast.LENGTH_SHORT).show()
finish() // 返回登录页
} else {
// 注册失败
Toast.makeText(this@RegisterActivity, apiResponse?.msg ?: "注册失败", Toast.LENGTH_SHORT).show()
}
} else {
// 请求失败
Toast.makeText(this@RegisterActivity, "网络请求失败: ${response.code()}", Toast.LENGTH_SHORT).show()
}
} catch (e: Exception) {
// 异常处理
progressBar.visibility = View.GONE
Toast.makeText(this@RegisterActivity, "注册异常: ${e.message}", Toast.LENGTH_SHORT).show()
}
}
}
}
package com.example.sanpaias.activity.dashboard
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import com.example.sanpaias.R
import com.example.sanpaias.activity.InspectionPlanListActivity
import com.example.sanpaias.fragment.HomeFragment
import com.example.sanpaias.fragment.ProfileFragment
import com.google.android.material.bottomnavigation.BottomNavigationView
class DashboardActivity : AppCompatActivity() {
private lateinit var bottomNavigation: BottomNavigationView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_dashboard)
// 初始化底部导航栏
bottomNavigation = findViewById(R.id.bottomNavigation)
// 设置导航栏选择监听器
bottomNavigation.setOnItemSelectedListener { item ->
var fragment: Fragment? = null
when (item.itemId) {
R.id.navigation_home -> {
fragment = HomeFragment()
// 不需要在这里设置点击事件,应该在HomeFragment中处理
}
R.id.navigation_profile -> {
fragment = ProfileFragment()
}
}
if (fragment != null) {
supportFragmentManager.beginTransaction()
.replace(R.id.fragmentContainer, fragment)
.commit()
return@setOnItemSelectedListener true
}
false
}
// 默认选中主页
bottomNavigation.selectedItemId = R.id.navigation_home
}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:padding="24dp"
tools:context=".activity.LoginActivity">
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设备管理系统"
android:textSize="24sp"
android:textStyle="bold"
app:layout_constraintBottom_toTopOf="@+id/tilAccount"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed" />
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tilAccount"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:hint="账号"
app:layout_constraintBottom_toTopOf="@+id/tilPassword"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvTitle">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/etAccount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tilPassword"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:hint="密码"
app:layout_constraintBottom_toTopOf="@+id/cbRememberMe"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tilAccount"
app:passwordToggleEnabled="true">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/etPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword" />
</com.google.android.material.textfield.TextInputLayout>
<CheckBox
android:id="@+id/cbRememberMe"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="记住密码"
android:checked="true"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tilPassword"
app:layout_constraintBottom_toTopOf="@+id/btnLogin" />
<Button
android:id="@+id/btnLogin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="登录"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/cbRememberMe" />
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!-- 在登录按钮下方添加注册链接 -->
<TextView
android:id="@+id/tvRegisterLink"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="还没有账号?点击注册"
android:textColor="@color/design_default_color_primary"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btnLogin" />
</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context=".activity.dashboard.DashboardActivity">
<FrameLayout
android:id="@+id/fragmentContainer"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/bottomNavigation"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottomNavigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/windowBackground"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:menu="@menu/bottom_nav_menu" />
</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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"
tools:context=".fragment.HomeFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<!-- Welcome Text -->
<TextView
android:id="@+id/tvWelcome"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="欢迎您,用户"
android:textSize="20sp"
android:textStyle="bold"
android:layout_marginBottom="16dp"/>
<!-- Device Statistics Card -->
<androidx.cardview.widget.CardView
android:id="@+id/cardDeviceStats"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="8dp"
app:cardElevation="4dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="设备统计"
android:textSize="18sp"
android:textStyle="bold"
android:layout_marginBottom="16dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<!-- Total Devices -->
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/tvTotalDevices"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textSize="24sp"
android:textStyle="bold"
android:textColor="#673AB7"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="总设备"/>
</LinearLayout>
<!-- Normal Devices -->
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/tvNormalDevices"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textSize="24sp"
android:textStyle="bold"
android:textColor="#4CAF50"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="正常"/>
</LinearLayout>
<!-- Fault Devices -->
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/tvFaultDevices"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textSize="24sp"
android:textStyle="bold"
android:textColor="#F44336"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="故障"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
<!-- Task Overview Card -->
<androidx.cardview.widget.CardView
android:id="@+id/cardTaskOverview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:cardCornerRadius="8dp"
app:cardElevation="4dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="任务概览"
android:textSize="18sp"
android:textStyle="bold"
android:layout_marginBottom="16dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<!-- Pending Tasks -->
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/tvPendingTasks"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textSize="24sp"
android:textStyle="bold"
android:textColor="#FF9800"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="待处理"/>
</LinearLayout>
<!-- Processing Tasks -->
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/tvProcessingTasks"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textSize="24sp"
android:textStyle="bold"
android:textColor="#2196F3"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="处理中"/>
</LinearLayout>
<!-- Completed Tasks -->
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/tvCompletedTasks"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textSize="24sp"
android:textStyle="bold"
android:textColor="#4CAF50"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="已完成"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
<!-- Order Approval Card -->
<androidx.cardview.widget.CardView
android:id="@+id/cardOrderApproval"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:cardCornerRadius="8dp"
app:cardElevation="4dp"
android:visibility="gone">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="工单审批"
android:textSize="18sp"
android:textStyle="bold"
android:layout_marginBottom="16dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<!-- 维修工单 -->
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/tvRepairOrderCount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textSize="24sp"
android:textStyle="bold"
android:textColor="#FF9800" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="维修工单" />
</LinearLayout>
<!-- 巡检工单 -->
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/tvInspectionOrderCount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textSize="24sp"
android:textStyle="bold"
android:textColor="#2196F3" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="巡检工单" />
</LinearLayout>
<!-- 保养工单 -->
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/tvMaintenanceOrderCount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textSize="24sp"
android:textStyle="bold"
android:textColor="#4CAF50" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="保养工单" />
</LinearLayout>
<!-- 检测工单 -->
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/tvTestingOrderCount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textSize="24sp"
android:textStyle="bold"
android:textColor="#E91E63" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="检测工单" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
<!-- 巡检卡片 -->
<androidx.cardview.widget.CardView
android:id="@+id/cardInspection"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:cardCornerRadius="8dp"
app:cardElevation="4dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="巡检计划"
android:textSize="18sp"
android:textStyle="bold"
android:layout_marginBottom="16dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/tvPendingInspections"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textColor="#4CAF50"
android:textSize="24sp"
android:textStyle="bold"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启用"
android:textSize="14sp"/>
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/tvCompletedInspections"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textColor="#FF5722"
android:textSize="24sp"
android:textStyle="bold"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停用"
android:textSize="14sp"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
<!-- 保养计划卡片 -->
<androidx.cardview.widget.CardView
android:id="@+id/cardMaintenancePlan"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:cardCornerRadius="8dp"
app:cardElevation="4dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="保养计划"
android:textSize="18sp"
android:textStyle="bold"
android:layout_marginBottom="16dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/tvPendingMaintenances"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textColor="#4CAF50"
android:textSize="24sp"
android:textStyle="bold"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启用"
android:textSize="14sp"/>
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/tvCompletedMaintenances"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textColor="#FF5722"
android:textSize="24sp"
android:textStyle="bold"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停用"
android:textSize="14sp"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
<!-- 在保养计划卡片后添加检测计划卡片 -->
<androidx.cardview.widget.CardView
android:id="@+id/cardTestingPlan"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:cardCornerRadius="8dp"
app:cardElevation="4dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="检测计划"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="@color/black"
android:layout_marginBottom="16dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/tvPendingTestings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textSize="24sp"
android:textStyle="bold"
android:textColor="#4CAF50" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启用"
android:textSize="14sp"
android:textColor="@color/black"
android:layout_marginTop="4dp" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/tvCompletedTestings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textSize="24sp"
android:textStyle="bold"
android:textColor="#FF5722" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停用"
android:textSize="14sp"
android:textColor="@color/black"
android:layout_marginTop="4dp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
</LinearLayout>
</ScrollView>
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:padding="16dp">
<TextView
android:id="@+id/tvProfileTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="个人信息"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="24dp" />
<ImageView
android:id="@+id/ivAvatar"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginTop="24dp"
android:src="@drawable/ic_person"
android:background="@drawable/circle_background"
android:padding="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvProfileTitle" />
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
app:cardCornerRadius="8dp"
app:cardElevation="4dp"
app:layout_constraintTop_toBottomOf="@id/ivAvatar">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="8dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="用户名:"
android:textStyle="bold" />
<TextView
android:id="@+id/tvUsername"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="未知" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#EEEEEE" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="8dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="工号:"
android:textStyle="bold" />
<TextView
android:id="@+id/tvUserId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="未知" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#EEEEEE" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="8dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="手机号:"
android:textStyle="bold" />
<TextView
android:id="@+id/tvPhone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="未知" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#EEEEEE" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="8dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="邮箱:"
android:textStyle="bold" />
<TextView
android:id="@+id/tvEmail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="未知" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#EEEEEE" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="8dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="角色:"
android:textStyle="bold" />
<TextView
android:id="@+id/tvRole"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="未知" />
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
<Button
android:id="@+id/btnLogout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="退出登录"
android:layout_marginBottom="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

浙公网安备 33010602011771号