团队项目-android端
今天将团队项目的android端的登录注册功能写出,并将主页面写了出来。但是遇到了前后端连不上的问题
登录:
package com.example.faceapp.ui.login;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.faceapp.R;
import com.example.faceapp.api.ApiClient;
import com.example.faceapp.api.ApiService;
import com.example.faceapp.model.User;
import com.example.faceapp.ui.main.MainActivity;
import com.google.gson.Gson;
import java.io.IOException;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class LoginActivity extends AppCompatActivity {
private EditText etUsername, etPassword;
private Button btnLogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
etUsername = findViewById(R.id.et_username);
etPassword = findViewById(R.id.et_password);
btnLogin = findViewById(R.id.btn_login);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String username = etUsername.getText().toString();
String password = etPassword.getText().toString();
User user = new User(username, password);
ApiService apiService = ApiClient.getClient().create(ApiService.class);
Call<User> call = apiService.login(user);
call.enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
if (response.isSuccessful()) {
Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
// 保存用户信息到 SharedPreferences
SharedPreferences sharedPreferences=getSharedPreferences("user_info", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
Gson gson = new Gson();
String userJson = gson.toJson(response.body());
editor.putString("user", userJson);
editor.apply();
startActivity(new Intent(LoginActivity.this, MainActivity.class));
finish();
} else {
Toast.makeText(LoginActivity.this, "用户名或密码错误", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<User> call, Throwable t) {
Toast.makeText(LoginActivity.this,"网络错误"+t.getMessage(), Toast.LENGTH_SHORT).show();
t.printStackTrace();
}
});
}
});
}
}
<?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"
android:background="#f5f7fa">
<!-- 标题 -->
<TextView
android:layout_width="wrap_content"
android:layout_height="48dp"
android:text="登录"
android:textSize="20sp"
android:textStyle="bold"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:layout_marginBottom="20dp"/>
<!-- 用户名输入框 -->
<EditText
android:id="@+id/et_username"
android:layout_width="match_parent"
android:layout_height="48dp"
android:hint="用户名"
android:padding="10dp"
android:layout_marginBottom="15dp"
android:background="@android:color/white"
android:elevation="4dp"/>
<!-- 密码输入框 -->
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="48dp"
android:hint="密码"
android:padding="10dp"
android:layout_marginBottom="15dp"
android:background="@android:color/white"
android:elevation="4dp"
android:inputType="textPassword"/>
<!-- 登录按钮 -->
<Button
android:id="@+id/btn_login"
android:layout_width="match_parent"
android:layout_height="48dp"
android:text="登录"
android:background="#4299e1"
android:padding="10dp"
android:textColor="#3E2723"
android:textSize="16sp" />
</LinearLayout>

注册:
package com.example.faceapp.ui.register;
import static androidx.core.content.ContextCompat.startActivity;
import android.content.Intent;
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;
import com.example.faceapp.R;
import com.example.faceapp.api.ApiClient;
import com.example.faceapp.api.ApiService;
import com.example.faceapp.model.User;
import com.example.faceapp.ui.login.LoginActivity;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class RegisterActivity extends AppCompatActivity {
private EditText etUsername, etPassword;
private Button btnRegister;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
etUsername = findViewById(R.id.et_username);
etPassword = findViewById(R.id.et_password);
btnRegister = findViewById(R.id.btn_register);
btnRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String username = etUsername.getText().toString();
String password = etPassword.getText().toString();
User user = new User(username, password);
ApiService apiService = ApiClient.getClient().create(ApiService.class);
Call<User> call = apiService.register(user);
call.enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
if (response.isSuccessful()) {
Toast.makeText(RegisterActivity.this, "注册成功!您的ID: " + response.body().getId(), Toast.LENGTH_SHORT).show();
// 跳转到登录界面
startActivity(new Intent(RegisterActivity.this, LoginActivity.class));
finish();
} else {
Toast.makeText(RegisterActivity.this, "注册失败", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<User> call, Throwable t) {
Toast.makeText(RegisterActivity.this, "网络错误", Toast.LENGTH_SHORT).show();
}
});
}
});
}
}
<?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"
android:background="#f5f7fa">
<!-- 标题 -->
<TextView
android:layout_width="wrap_content"
android:layout_height="48dp"
android:text="注册"
android:textSize="20sp"
android:textStyle="bold"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:layout_marginBottom="20dp"/>
<!-- 用户名输入框 -->
<EditText
android:id="@+id/et_username"
android:layout_width="match_parent"
android:layout_height="48dp"
android:hint="用户名"
android:padding="10dp"
android:layout_marginBottom="15dp"
android:background="@android:color/white"
android:elevation="4dp"/>
<!-- 密码输入框 -->
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="48dp"
android:hint="密码"
android:padding="10dp"
android:layout_marginBottom="15dp"
android:background="@android:color/white"
android:elevation="4dp"
android:inputType="textPassword"/>
<!-- 注册按钮 -->
<Button
android:id="@+id/btn_register"
android:layout_width="match_parent"
android:layout_height="48dp"
android:text="注册"
android:background="#4299e1"
android:padding="10dp"
android:textColor="#3E2723"
android:textSize="16sp" />
</LinearLayout>
主页面:
package com.example.faceapp.ui.main;
import static com.example.faceapp.api.ApiUrls.MEETING_SUMMARY_URL;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.faceapp.R;
import com.example.faceapp.model.User;
import com.example.faceapp.ui.adduser.AddUserActivity;
import com.example.faceapp.ui.changepassword.ChangePasswordActivity;
import com.example.faceapp.ui.importstudents.ImportStudentsActivity;
import com.example.faceapp.ui.selectlesson.SelectLessonActivity;
import com.example.faceapp.ui.importmeetinginfo.ImportMeetingInfoActivity;
import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private TextView tvUserInfo;
private Button btnAddUser;
private Button btnManageUsers;
private Button btnChangePassword;
private Button btnImportFaceData;
private Button btnMeetingSummary;
private Button btnSelectLesson;
private Button btnImportMeetingInfo;
private User user;
private boolean isAdmin;
private List<User> userList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化视图组件
tvUserInfo = findViewById(R.id.tv_user_info);
btnAddUser = findViewById(R.id.btn_add_user);
btnManageUsers = findViewById(R.id.btn_manage_users);
btnChangePassword = findViewById(R.id.btn_change_password);
btnImportFaceData = findViewById(R.id.btn_import_face_data);
btnMeetingSummary = findViewById(R.id.btn_meeting_summary);
btnSelectLesson = findViewById(R.id.btn_select_lesson);
btnImportMeetingInfo = findViewById(R.id.btn_import_meeting_info);
// 获取登录用户信息
SharedPreferences sharedPreferences = getSharedPreferences("user_info", MODE_PRIVATE);
String userJson = sharedPreferences.getString("user", "");
if (userJson != null && !userJson.isEmpty()) {
user = new Gson().fromJson(userJson, User.class);
if (user != null) {
tvUserInfo.setText("欢迎," + user.getName());
isAdmin = user.getId().equals("admin");
if (!isAdmin) {
btnAddUser.setVisibility(View.GONE);
}
}
}else{
Toast.makeText(this, "未获取到用户信息,请重新登录", Toast.LENGTH_SHORT).show();
}
Log.d("MainActivity", "onCreate: User info retrieved");
// 设置按钮点击事件监听器
btnAddUser.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, AddUserActivity.class));
}
});
btnManageUsers.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isAdmin) {
// 管理员用户管理逻辑
Toast.makeText(MainActivity.this, "用户管理功能待实现", Toast.LENGTH_SHORT).show();
} else {
// 普通用户删除自己的逻辑
Toast.makeText(MainActivity.this, "删除当前用户功能待实现", Toast.LENGTH_SHORT).show();
}
}
});
btnChangePassword.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, ChangePasswordActivity.class));
}
});
btnImportFaceData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, ImportStudentsActivity.class));
}
});
btnMeetingSummary.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 跳转到指定端口的网页(与Web端相同)
String url = MEETING_SUMMARY_URL;
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
} else {
Toast.makeText(MainActivity.this, "无法打开网页", Toast.LENGTH_SHORT).show();
}
}
});
btnSelectLesson.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, SelectLessonActivity.class));
}
});
btnImportMeetingInfo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, ImportMeetingInfoActivity.class));
}
});
}
}
<?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"
android:background="#f5f7fa">
<!-- 用户信息栏 -->
<TextView
android:id="@+id/tv_user_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:padding="10dp"
android:background="@android:color/white"
android:elevation="4dp"
android:textColor="#000"
android:textStyle="bold"
android:layout_marginBottom="20dp"/>
<!-- 左侧面板:用户管理 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@android:color/white"
android:padding="16dp"
android:elevation="4dp"
android:layout_marginBottom="20dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="用户管理"
android:textSize="18sp"
android:textStyle="bold"
android:layout_marginBottom="10dp"/>
<Button
android:id="@+id/btn_add_user"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加用户"
android:drawableLeft="@android:drawable/ic_input_add"
android:drawablePadding="10dp"
android:layout_marginBottom="10dp"/>
<Button
android:id="@+id/btn_manage_users"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="管理用户"
android:drawableLeft="@android:drawable/ic_menu_manage"
android:drawablePadding="10dp"
android:layout_marginBottom="10dp"/>
<Button
android:id="@+id/btn_change_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="修改密码"
android:drawableLeft="@android:drawable/ic_lock_lock"
android:drawablePadding="10dp"/>
</LinearLayout>
<!-- 右侧面板:操作按钮 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@android:color/white"
android:padding="16dp"
android:elevation="4dp">
<!-- 操作按钮组 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="4"
android:layout_marginBottom="20dp">
<Button
android:id="@+id/btn_import_face_data"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="添加人脸数据"
android:drawableTop="@android:drawable/ic_menu_gallery"
android:drawablePadding="5dp"
android:layout_marginRight="5dp"/>
<Button
android:id="@+id/btn_meeting_summary"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="会议总结"
android:drawableTop="@android:drawable/ic_menu_sort_by_size"
android:drawablePadding="5dp"
android:layout_marginRight="5dp"/>
<Button
android:id="@+id/btn_select_lesson"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="开启会议"
android:drawableTop="@android:drawable/ic_media_play"
android:drawablePadding="5dp"
android:layout_marginRight="5dp"/>
<Button
android:id="@+id/btn_import_meeting_info"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="会议信息导入"
android:drawableTop="@android:drawable/ic_menu_upload"
android:drawablePadding="5dp"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>


浙公网安备 33010602011771号