安全管理子系统(app) -7
web端的系统差不多了,现在需要做安卓端,我们打算用android studio写前端并连接idea中的springboot后端。
1、首先在AndroidManifest.xml中添加:
<uses-permission android:name="android.permission.INTERNET" />
添加网络权限
2、在build.gradle里添加Retrofit依赖
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
3、需要创建api接口用来连接springboot的controller
@POST("/user")
Call<Void> saveUser(@Body User user);
@GET("/user")
Call<List<User>> getUserList();
@DELETE("/user/{id}")
Call<Void> deleteUser(@Path("id") int id);
@POST("/user") // 确保这个端点与后端API一致
Call<Void> registerUser(@Body User user);
@POST("/user/login") // 确保与后端接口路径一致
Call<User> login(@Body User user);
4、创建Retrofit实例
package com.example.safety.network;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class RetrofitClient {
private static final String BASE_URL = "http://10.0.2.2:9090/";
private static Retrofit retrofit;
private static Retrofit getRetrofitInstance() {
if (retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
public static <T> T getService(Class<T> serviceClass) {
return getRetrofitInstance().create(serviceClass);
}
}
5、还需要在android studio里创建与springboot后端匹配的实体类(这里展示登录注册的)
package com.example.safety.model;
public class User {
private int id;
private String username;
private String password;
private String type;
private String person;
private int ispass;
// getters and setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getPerson() {
return person;
}
public void setPerson(String person) {
this.person = person;
}
public int getIspass() {
return ispass;
}
public void setIspass(int ispass) {
this.ispass = ispass;
}
}
6、写示例调用代码
package com.example.safety.ui;
import android.os.Bundle;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.safety.R;
import com.example.safety.api.UserApiService;
import com.example.safety.model.User;
import com.example.safety.network.RetrofitClient;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class UserListActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private UserAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_list);
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
// 发起网络请求
UserApiService service = RetrofitClient.getService(UserApiService.class);
Call<List<User>> call = service.getUserList();
call.enqueue(new Callback<List<User>>() {
@Override
public void onResponse(Call<List<User>> call, Response<List<User>> response) {
if (response.isSuccessful()) {
List<User> users = response.body();
adapter = new UserAdapter(users);
recyclerView.setAdapter(adapter);
} else {
Toast.makeText(UserListActivity.this, "请求失败", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<List<User>> call, Throwable t) {
Toast.makeText(UserListActivity.this, "网络错误: " + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
}
创建UserAdapter 类
package com.example.safety.ui;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.safety.R;
import com.example.safety.model.User;
import java.util.List;
public class UserAdapter extends RecyclerView.Adapter<UserAdapter.UserViewHolder> {
private List<User> userList;
public UserAdapter(List<User> userList) {
this.userList = userList;
}
@NonNull
@Override
public UserViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_user, parent, false);
return new UserViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull UserViewHolder holder, int position) {
User user = userList.get(position);
holder.usernameTextView.setText(user.getUsername());
holder.typeTextView.setText(user.getType());
}
@Override
public int getItemCount() {
return userList.size();
}
static class UserViewHolder extends RecyclerView.ViewHolder {
TextView usernameTextView;
TextView typeTextView;
public UserViewHolder(@NonNull View itemView) {
super(itemView);
usernameTextView = itemView.findViewById(R.id.usernameTextView);
typeTextView = itemView.findViewById(R.id.typeTextView);
}
}
}
7、写RegisterActivity,注册页面翟营的后端逻辑代码
package com.example.safety;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.safety.api.UserApiService;
import com.example.safety.model.User;
import com.example.safety.network.RetrofitClient;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class RegisterActivity extends AppCompatActivity {
private EditText accountInput, passwordInput, personnelInfoInput;
private RadioGroup userTypeGroup;
private Button registerButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.register);
// 初始化视图
accountInput = findViewById(R.id.accountInput);
passwordInput = findViewById(R.id.passwordInput);
personnelInfoInput = findViewById(R.id.personnelInfoInput);
userTypeGroup = findViewById(R.id.userTypeGroup);
registerButton = findViewById(R.id.registerButton);
TextView loginLink = findViewById(R.id.loginLink);
// 注册按钮点击事件
registerButton.setOnClickListener(v -> attemptRegister());
// 登录链接点击事件
loginLink.setOnClickListener(v -> navigateToLogin());
}
private void attemptRegister() {
String username = accountInput.getText().toString().trim();
String password = passwordInput.getText().toString().trim();
String person = personnelInfoInput.getText().toString().trim();
// 获取选中的用户类型
int selectedId = userTypeGroup.getCheckedRadioButtonId();
if (selectedId == -1) {
Toast.makeText(this, "请选择用户类型", Toast.LENGTH_SHORT).show();
return;
}
RadioButton selectedRadioButton = findViewById(selectedId);
String type = selectedRadioButton.getText().toString();
if (username.isEmpty() || password.isEmpty() || person.isEmpty()) {
Toast.makeText(this, "请填写所有字段", Toast.LENGTH_SHORT).show();
return;
}
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setPerson(person);
user.setType(type);
user.setIspass(0); // 默认未审批
registerUser(user);
}
private void registerUser(User user) {
UserApiService apiService = RetrofitClient.getService(UserApiService.class);
Call<Void> call = apiService.registerUser(user);
call.enqueue(new Callback<Void>() {
@Override
public void onResponse(Call<Void> call, Response<Void> response) {
if (response.isSuccessful()) {
Toast.makeText(RegisterActivity.this, "注册成功,请等待管理员审批", Toast.LENGTH_SHORT).show();
navigateToLogin();
} else {
Toast.makeText(RegisterActivity.this, "注册失败: " + response.code(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<Void> call, Throwable t) {
Toast.makeText(RegisterActivity.this, "网络错误: " + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
private void navigateToLogin() {
startActivity(new Intent(this, MainActivity.class));
finish();
}
}
目录结构:

浙公网安备 33010602011771号