安全管理子系统(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();
    }
}

目录结构:

posted @ 2025-05-27 11:27  呓语-MSHK  阅读(21)  评论(0)    收藏  举报