个人作业安卓端

package com.example.blogapp.activity;

import android.os.Bundle;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.example.blogapp.R;
import com.example.blogapp.activity.SummaryStatsAdapter;
import com.example.blogapp.model.ApiResponse;
import com.example.blogapp.network.RetrofitClient;
import com.example.blogapp.ApiService;

import java.util.List;
import java.util.Map;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class AllSummaryStatsActivity extends AppCompatActivity {

private RecyclerView recyclerView;
private SummaryStatsAdapter adapter;
private ProgressBar progressBar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_all_summary_stats);

    recyclerView = findViewById(R.id.recyclerView);
    progressBar = findViewById(R.id.progressBar);

    // 设置 RecyclerView
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    adapter = new SummaryStatsAdapter();
    recyclerView.setAdapter(adapter);

    loadStudentSummaryStats();
}

private void loadStudentSummaryStats() {
    progressBar.setVisibility(View.VISIBLE);

    // 使用正确的 Retrofit 客户端
    ApiService apiService ;
    apiService = RetrofitClient.getClient("http://192.168.20.105:8080/").create(com.example.blogapp.ApiService.class);


    Call<ApiResponse<List<Map<String, Object>>>> call = apiService.getStudentSummaryStats();

    call.enqueue(new Callback<ApiResponse<List<Map<String, Object>>>>() {
        @Override
        public void onResponse(Call<ApiResponse<List<Map<String, Object>>>> call,
                               Response<ApiResponse<List<Map<String, Object>>>> response) {
            progressBar.setVisibility(View.GONE);

            if (response.isSuccessful() && response.body() != null) {
                List<Map<String, Object>> statsList = response.body().getData();
                adapter.setData(statsList);
            } else {
                Toast.makeText(AllSummaryStatsActivity.this,
                        "获取数据失败", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<ApiResponse<List<Map<String, Object>>>> call, Throwable t) {
            progressBar.setVisibility(View.GONE);
            Toast.makeText(AllSummaryStatsActivity.this,
                    "网络错误: " + t.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}

}package com.example.blogapp.activity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.example.blogapp.R;
import com.example.blogapp.model.CodingRecord;
import com.example.blogapp.activity.CodingRecordAdapter;
import com.example.blogapp.network.RetrofitClient;
import com.example.blogapp.utils.SecureStorage;

import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class CodingRecordActivity extends AppCompatActivity {

private EditText planningContentEditText;
private EditText planningTimeEditText;
private EditText analysisContentEditText;
private EditText analysisTimeEditText;
private EditText designSpecContentEditText;
private EditText designSpecTimeEditText;
private EditText codingStandardContentEditText;
private EditText codingStandardTimeEditText;
private EditText designContentEditText;
private EditText designTimeEditText;
private EditText codingContentEditText;
private EditText codingTimeEditText;
private EditText testContentEditText;
private EditText testTimeEditText;
private EditText sizeMeasurementContentEditText;
private EditText sizeMeasurementTimeEditText;
private EditText postmortemContentEditText;
private EditText postmortemTimeEditText;
private EditText totalTimeEditText;

private RecyclerView recyclerView;
private CodingRecordAdapter adapter;
private com.example.blogapp.ApiService apiService;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_coding_record);

    // 初始化控件
    planningContentEditText = findViewById(R.id.planningContent);
    planningTimeEditText = findViewById(R.id.planningTime);
    analysisContentEditText = findViewById(R.id.analysisContent);
    analysisTimeEditText = findViewById(R.id.analysisTime);
    designSpecContentEditText = findViewById(R.id.designSpecContent);
    designSpecTimeEditText = findViewById(R.id.designSpecTime);
    codingStandardContentEditText = findViewById(R.id.codingStandardContent);
    codingStandardTimeEditText = findViewById(R.id.codingStandardTime);
    designContentEditText = findViewById(R.id.designContent);
    designTimeEditText = findViewById(R.id.designTime);
    codingContentEditText = findViewById(R.id.codingContent);
    codingTimeEditText = findViewById(R.id.codingTime);
    testContentEditText = findViewById(R.id.testContent);
    testTimeEditText = findViewById(R.id.testTime);
    sizeMeasurementContentEditText = findViewById(R.id.sizeMeasurementContent);
    sizeMeasurementTimeEditText = findViewById(R.id.sizeMeasurementTime);
    postmortemContentEditText = findViewById(R.id.postmortemContent);
    postmortemTimeEditText = findViewById(R.id.postmortemTime);
    totalTimeEditText = findViewById(R.id.totalTime);

    recyclerView = findViewById(R.id.recycler_view);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    adapter = new CodingRecordAdapter();
    recyclerView.setAdapter(adapter);

    // 初始化 Retrofit
    apiService = RetrofitClient.getClient("http://192.168.20.105:8080/").create(com.example.blogapp.ApiService.class);

    // 加载编程记录
    loadCodingRecords();

    // 设置保存记录按钮点击事件
    findViewById(R.id.btn_save).setOnClickListener(v -> saveCodingRecord());
}

private void loadCodingRecords() {
    String userId = SecureStorage.getUserId(this);
    if (userId == null || userId.isEmpty()) {
        Toast.makeText(this, "用户ID为空,请先登录", Toast.LENGTH_SHORT).show();
        return;
    }

    Call<List<CodingRecord>> call = apiService.getCodingRecords(userId);
    call.enqueue(new Callback<List<CodingRecord>>() {
        @Override
        public void onResponse(Call<List<CodingRecord>> call, Response<List<CodingRecord>> response) {
            if (response.isSuccessful() && response.body() != null) {
                List<CodingRecord> records = response.body();
                Log.d("CodingRecordActivity", "获取到数据: " + records.size() + "条");
                adapter.setData(records);
            } else {
                Log.e("CodingRecordActivity", "响应不成功: " + response.code());
            }
        }

        @Override
        public void onFailure(Call<List<CodingRecord>> call, Throwable t) {
            Log.e("CodingRecordActivity", "加载失败", t);
            Toast.makeText(CodingRecordActivity.this, "加载失败: " + t.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}

private void saveCodingRecord() {
    // 获取用户ID(确保已登录)
    String userId = SecureStorage.getUserId(this);
    if (userId == null || userId.isEmpty()) {
        Toast.makeText(this, "请先登录", Toast.LENGTH_SHORT).show();
        return;
    }



    // 获取输入值
    String planningContent = planningContentEditText.getText().toString();
    Integer planningTime = Integer.parseInt(planningTimeEditText.getText().toString());
    String analysisContent = analysisContentEditText.getText().toString();
    Integer analysisTime = Integer.parseInt(analysisTimeEditText.getText().toString());
    String designSpecContent = designSpecContentEditText.getText().toString();
    Integer designSpecTime = Integer.parseInt(designSpecTimeEditText.getText().toString());
    String codingStandardContent = codingStandardContentEditText.getText().toString();
    Integer codingStandardTime = Integer.parseInt(codingStandardTimeEditText.getText().toString());
    String designContent = designContentEditText.getText().toString();
    Integer designTime = Integer.parseInt(designTimeEditText.getText().toString());
    String codingContent = codingContentEditText.getText().toString();
    Integer codingTime = Integer.parseInt(codingTimeEditText.getText().toString());
    String testContent = testContentEditText.getText().toString();
    Integer testTime = Integer.parseInt(testTimeEditText.getText().toString());
    String sizeMeasurementContent = sizeMeasurementContentEditText.getText().toString();
    Integer sizeMeasurementTime = Integer.parseInt(sizeMeasurementTimeEditText.getText().toString());
    String postmortemContent = postmortemContentEditText.getText().toString();
    Integer postmortemTime = Integer.parseInt(postmortemTimeEditText.getText().toString());
    Integer totalTime = Integer.parseInt(totalTimeEditText.getText().toString());

    // 创建 CodingRecord 对象
    CodingRecord codingRecord = new CodingRecord();
    codingRecord.setPlanningContent(planningContent);
    codingRecord.setPlanningTime(planningTime);
    codingRecord.setAnalysisContent(analysisContent);
    codingRecord.setAnalysisTime(analysisTime);
    codingRecord.setDesignSpecContent(designSpecContent);
    codingRecord.setDesignSpecTime(designSpecTime);
    codingRecord.setCodingStandardContent(codingStandardContent);
    codingRecord.setCodingStandardTime(codingStandardTime);
    codingRecord.setDesignContent(designContent);
    codingRecord.setDesignTime(designTime);
    codingRecord.setCodingContent(codingContent);
    codingRecord.setCodingTime(codingTime);
    codingRecord.setTestContent(testContent);
    codingRecord.setTestTime(testTime);
    codingRecord.setSizeMeasurementContent(sizeMeasurementContent);
    codingRecord.setSizeMeasurementTime(sizeMeasurementTime);
    codingRecord.setPostmortemContent(postmortemContent);
    codingRecord.setPostmortemTime(postmortemTime);
    codingRecord.setTotalTime(totalTime);
    // 创建 CodingRecord 对象并设置 userId

    codingRecord.setUserId(userId);  // 关键修复:设置用户ID


    // 调用 Retrofit 接口
    Call<Void> call = apiService.addCodingRecord(codingRecord);
    call.enqueue(new Callback<Void>() {
        @Override
        public void onResponse(Call<Void> call, Response<Void> response) {
            if (response.isSuccessful()) {
                loadCodingRecords();
                Toast.makeText(CodingRecordActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
                loadCodingRecords(); // 刷新列表
            }
        }

        @Override
        public void onFailure(Call<Void> call, Throwable t) {
            Toast.makeText(CodingRecordActivity.this, "保存失败", Toast.LENGTH_SHORT).show();
        }
    });
}

}package com.example.blogapp.activity;

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.blogapp.R;
import com.example.blogapp.model.CodingRecord;

import java.util.List;

public class CodingRecordAdapter extends RecyclerView.Adapter<CodingRecordAdapter.CodingRecordViewHolder> {
private List codingRecords;

public void setData(List<CodingRecord> codingRecords) {
    this.codingRecords = codingRecords;
    notifyDataSetChanged();
}

@NonNull
@Override
public CodingRecordViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_coding_record, parent, false);
    return new CodingRecordViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull CodingRecordViewHolder holder, int position) {
    CodingRecord record = codingRecords.get(position);
    holder.bind(record);
}

@Override
public int getItemCount() {
    return codingRecords == null ? 0 : codingRecords.size();
}

public static class CodingRecordViewHolder extends RecyclerView.ViewHolder {
    private TextView dateTextView;
    private TextView planningTimeTextView;
    private TextView analysisTimeTextView;
    private TextView designSpecTimeTextView;
    private TextView codingStandardTimeTextView;
    private TextView designTimeTextView;
    private TextView codingTimeTextView;
    private TextView testTimeTextView;
    private TextView sizeMeasurementTimeTextView;
    private TextView postmortemTimeTextView;
    private TextView totalTimeTextView;

    public CodingRecordViewHolder(View itemView) {
        super(itemView);
        dateTextView = itemView.findViewById(R.id.dateTextView);
        planningTimeTextView = itemView.findViewById(R.id.planningTimeTextView);
        analysisTimeTextView = itemView.findViewById(R.id.analysisTimeTextView);
        designSpecTimeTextView = itemView.findViewById(R.id.designSpecTimeTextView);
        codingStandardTimeTextView = itemView.findViewById(R.id.codingStandardTimeTextView);
        designTimeTextView = itemView.findViewById(R.id.designTimeTextView);
        codingTimeTextView = itemView.findViewById(R.id.codingTimeTextView);
        testTimeTextView = itemView.findViewById(R.id.testTimeTextView);
        sizeMeasurementTimeTextView = itemView.findViewById(R.id.sizeMeasurementTimeTextView);
        postmortemTimeTextView = itemView.findViewById(R.id.postmortemTimeTextView);
        totalTimeTextView = itemView.findViewById(R.id.totalTimeTextView);
    }

    public void bind(CodingRecord record) {
        // 设置日期
        dateTextView.setText(record.getDate() != null ?
                "日期: " + record.getDate() : "无日期");

        // 设置各阶段时间
        planningTimeTextView.setText(String.valueOf(record.getPlanningTime()));
        analysisTimeTextView.setText(String.valueOf(record.getAnalysisTime()));
        designSpecTimeTextView.setText(String.valueOf(record.getDesignSpecTime()));
        codingStandardTimeTextView.setText(String.valueOf(record.getCodingStandardTime()));
        designTimeTextView.setText(String.valueOf(record.getDesignTime()));
        codingTimeTextView.setText(String.valueOf(record.getCodingTime()));
        testTimeTextView.setText(String.valueOf(record.getTestTime()));
        sizeMeasurementTimeTextView.setText(String.valueOf(record.getSizeMeasurementTime()));
        postmortemTimeTextView.setText(String.valueOf(record.getPostmortemTime()));

        // 设置合计时间
        totalTimeTextView.setText(String.valueOf(record.getTotalTime()));
    }
}

}package com.example.blogapp.activity;

import android.content.Intent;
import android.net.Uri;
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.blogapp.DailySummaryResponse;
import com.example.blogapp.R;
import com.example.blogapp.model.DailySummary;

import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Locale;

// DailySummaryAdapter.java
public class DailySummaryAdapter extends RecyclerView.Adapter<DailySummaryAdapter.ViewHolder> {
private final List summaryList;

public DailySummaryAdapter(List<DailySummaryResponse> summaryList) {
    this.summaryList = summaryList;
}

private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
private final SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());


@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item_daily_summary, parent, false);
    return new ViewHolder(view);
}


@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    DailySummaryResponse item = summaryList.get(position);

    holder.dateText.setText(item.getSummaryDate());
    holder.userIdText.setText(String.valueOf(item.getUserId()));
    holder.blogUrlText.setText(item.getBlogUrl());
    holder.createTimeText.setText(item.getFormattedCreateTime());

    // 点击事件
    holder.blogUrlText.setOnClickListener(v -> {
        if (item.getBlogUrl() != null) {
            holder.itemView.getContext().startActivity(
                    new Intent(Intent.ACTION_VIEW, Uri.parse(item.getBlogUrl())));
        }
    });
}

// ... 其他代码不变
@Override
public int getItemCount() {
    return summaryList.size();
}

static class ViewHolder extends RecyclerView.ViewHolder {
    TextView dateText;
    TextView userIdText;
    TextView blogUrlText;
    TextView createTimeText;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        dateText = itemView.findViewById(R.id.dateText);
        userIdText = itemView.findViewById(R.id.userIdText);
        blogUrlText = itemView.findViewById(R.id.blogUrlText);
        createTimeText = itemView.findViewById(R.id.createTimeText);
    }
}

}

package com.example.blogapp.activity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.example.blogapp.ApiService;
import com.example.blogapp.R;
import com.example.blogapp.model.ApiResponse;
import com.example.blogapp.model.WeeklyGoal;
import com.example.blogapp.network.RetrofitClient;
import com.example.blogapp.utils.SecureStorage;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class GoalActivity extends AppCompatActivity {
private ApiService apiService;
private TextView tvCurrentGoal;
private EditText etGoal;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getSupportActionBar().hide();
    setContentView(R.layout.activity_goal);

    // 初始化 Retrofit
    apiService = RetrofitClient.getClient("http://192.168.20.105:8080/").create(ApiService.class);

    tvCurrentGoal = findViewById(R.id.tv_current_goal);
    etGoal = findViewById(R.id.et_goal);

    // 从 SecureStorage 获取用户 ID
    String userId = SecureStorage.getUserId(this);
    if (userId == null || userId.isEmpty()) {
        Toast.makeText(this, "请先登录", Toast.LENGTH_SHORT).show();
        startActivity(new Intent(this, LoginActivity.class));
        finish();
        return;
    }

    loadCurrentGoal(Long.parseLong(userId));

    findViewById(R.id.btn_set_goal).setOnClickListener(v -> setGoal(Long.parseLong(userId)));
}

private void loadCurrentGoal(Long userId) {
    Call<ApiResponse<WeeklyGoal>> call = apiService.getCurrentGoal(userId);
    call.enqueue(new Callback<ApiResponse<WeeklyGoal>>() {
        @Override
        public void onResponse(Call<ApiResponse<WeeklyGoal>> call, Response<ApiResponse<WeeklyGoal>> response) {
            if (response.isSuccessful() && response.body() != null && response.body().getData() != null) {
                WeeklyGoal goal = response.body().getData();
                runOnUiThread(() -> {
                    tvCurrentGoal.setText("本周目标: " + goal.getContent());
                });
            } else {
                runOnUiThread(() -> {
                    tvCurrentGoal.setText("暂无本周学习目标");
                });
            }
        }

        @Override
        public void onFailure(Call<ApiResponse<WeeklyGoal>> call, Throwable t) {
            runOnUiThread(() -> {
                tvCurrentGoal.setText("加载失败");
                Toast.makeText(GoalActivity.this, "加载失败: " + t.getMessage(), Toast.LENGTH_SHORT).show();
            });
        }
    });
}

private void setGoal(Long userId) {
    String content = etGoal.getText().toString();
    Call<ApiResponse<Void>> call = apiService.setWeeklyGoal(content, userId);
    call.enqueue(new Callback<ApiResponse<Void>>() {
        @Override
        public void onResponse(Call<ApiResponse<Void>> call, Response<ApiResponse<Void>> response) {
            if (response.isSuccessful()) {
                loadCurrentGoal(userId);
                Toast.makeText(GoalActivity.this, "设置成功", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<ApiResponse<Void>> call, Throwable t) {
            Toast.makeText(GoalActivity.this, "设置失败", Toast.LENGTH_SHORT).show();
        }
    });
}

}
package com.example.blogapp.activity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;

import com.example.blogapp.R;
import com.example.blogapp.activity.LoginActivity;
import com.example.blogapp.utils.SecureStorage;

public class HomeActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    // 初始化控件
    TextView welcomeText = findViewById(R.id.welcomeText);
    TextView userIdText = findViewById(R.id.userIdText);
    TextView userClassText = findViewById(R.id.userClassText);
    Button logoutButton = findViewById(R.id.logoutButton);
    Button codingRecordsButton = findViewById(R.id.codingRecordsButton);

    // 获取用户信息
    String username = SecureStorage.getUsername(this); // 假设你已存储用户名
    String userId = SecureStorage.getUserId(this);
    String userClass = SecureStorage.getUserClass(this);

    // 设置欢迎信息
    welcomeText.setText("欢迎, " + username + "!");
    userIdText.setText("学号: " + userId);
    userClassText.setText("班级: " + userClass);

    // 设置每日总结按钮点击事件
    findViewById(R.id.summaryButton).setOnClickListener(v -> {
        Intent intent = new Intent(HomeActivity.this, SummaryActivity.class);
        startActivity(intent);
    });

    // 设置每周目标按钮点击事件
    findViewById(R.id.goalButton).setOnClickListener(v -> {
        Intent intent = new Intent(HomeActivity.this, GoalActivity.class);
        startActivity(intent);
    });

    // 设置每日编程记录按钮点击事件
    codingRecordsButton.setOnClickListener(v -> {
        Intent intent = new Intent(HomeActivity.this, CodingRecordActivity.class);
        startActivity(intent);
    });

    // 设置退出登录按钮点击事件
    logoutButton.setOnClickListener(v -> {
        SecureStorage.clearUserDetails(this); // 清除用户信息
        Intent intent = new Intent(HomeActivity.this, LoginActivity.class);
        startActivity(intent);
        finish();
    });
}

}package com.example.blogapp.activity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.example.blogapp.R;
import com.example.blogapp.ApiService;
import com.example.blogapp.model.ApiResponse;
import com.example.blogapp.model.User;
import com.example.blogapp.network.RetrofitClient;
import com.example.blogapp.utils.SecureStorage;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class LoginActivity extends AppCompatActivity {
private EditText userIdEditText;
private EditText passwordEditText;
private RadioButton studentRadioButton;
private RadioButton teacherRadioButton;
private ApiService apiService;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    userIdEditText = findViewById(R.id.userIdEditText);
    passwordEditText = findViewById(R.id.passwordEditText);
    studentRadioButton = findViewById(R.id.studentRadioButton);
    teacherRadioButton = findViewById(R.id.teacherRadioButton);

    // 初始化 Retrofit 客户端和服务接口
    apiService = RetrofitClient.getClient("http://192.168.20.105:8080/").create(ApiService.class);

    findViewById(R.id.loginButton).setOnClickListener(v -> loginUser());

    findViewById(R.id.registerTextView).setOnClickListener(v -> {
        Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
        startActivity(intent);
    });
}

private void loginUser() {
    String userId = userIdEditText.getText().toString();
    String password = passwordEditText.getText().toString();
    String role = studentRadioButton.isChecked() ? "student" : "teacher";

    Call<ApiResponse<User>> call = apiService.login(userId, password, role);

    call.enqueue(new Callback<ApiResponse<User>>() {
        @Override
        public void onResponse(Call<ApiResponse<User>> call, Response<ApiResponse<User>> response) {
            // 在登录成功的回调中修改
            if (response.isSuccessful()) {
                ApiResponse<User> apiResponse = response.body();
                if (apiResponse != null && apiResponse.getStatus() == 200) {
                    User user = apiResponse.getData();

                    // 保存用户信息
                    SecureStorage.saveUserDetails(LoginActivity.this,
                            user.getUserId(),
                            user.getRole(),
                            user.getUsername(),
                            user.getUserClass());

                    // 根据角色跳转
                    if ("teacher".equals(user.getRole())) {
                        startActivity(new Intent(LoginActivity.this, TeacherDashboardActivity.class));
                    } else {
                        startActivity(new Intent(LoginActivity.this, HomeActivity.class));
                    }
                    finish();
                }
            }
        }

        @Override
        public void onFailure(Call<ApiResponse<User>> call, Throwable t) {
            Toast.makeText(LoginActivity.this, "网络错误: " + t.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}

}package com.example.blogapp.activity;

import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import com.example.blogapp.R;
import com.example.blogapp.ApiService;
import com.example.blogapp.network.RetrofitClient;
import com.example.blogapp.model.ApiResponse;
import com.example.blogapp.model.User;
import com.example.blogapp.utils.SecureStorage;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class MainActivity extends AppCompatActivity {

private ApiService apiService;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    EdgeToEdge.enable(this);
    setContentView(R.layout.activity_main);
    ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
        Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
        v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
        return insets;
    });

    // 初始化 Retrofit 客户端和服务接口
    apiService = RetrofitClient.getClient("http://192.168.20.105:8080/").create(ApiService.class);

    // 从 SecureStorage 获取用户 ID 和角色
    String userId = SecureStorage.getUserId(this);
    String userRole = SecureStorage.getUserRole(this);
    if (userId == null || userId.isEmpty() || userRole == null || userRole.isEmpty()) {
        startActivity(new Intent(MainActivity.this, LoginActivity.class));
        finish();
        return;
    }

    // 发起请求获取当前用户信息
    Call<ApiResponse<User>> call = apiService.getCurrentUser(userId, userRole);

    call.enqueue(new Callback<ApiResponse<User>>() {
        @Override
        public void onResponse(Call<ApiResponse<User>> call, Response<ApiResponse<User>> response) {
            if (response.isSuccessful() && response.body() != null) {
                User user = response.body().getData();
                updateUI(user);
            } else {
                Toast.makeText(MainActivity.this, "请求失败", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<ApiResponse<User>> call, Throwable t) {
            Toast.makeText(MainActivity.this, "网络错误: " + t.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}

private void updateUI(User user) {
    Intent intent = new Intent(MainActivity.this, HomeActivity.class);
    startActivity(intent);
    finish();
}

}package com.example.blogapp.activity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.example.blogapp.R;
import com.example.blogapp.ApiService;
import com.example.blogapp.model.ApiResponse;
import com.example.blogapp.network.RetrofitClient;
import com.example.blogapp.model.User;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class RegisterActivity extends AppCompatActivity {
private EditText userIdEditText;
private EditText usernameEditText;
private EditText passwordEditText;
private EditText phoneEditText;
private EditText userClassEditText;
private RadioButton studentRadioButton;
private RadioButton teacherRadioButton;
private ApiService apiService;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_register);

    userIdEditText = findViewById(R.id.userIdEditText);
    usernameEditText = findViewById(R.id.usernameEditText);
    passwordEditText = findViewById(R.id.passwordEditText);
    phoneEditText = findViewById(R.id.phoneEditText);
    userClassEditText = findViewById(R.id.userClassEditText);
    studentRadioButton = findViewById(R.id.studentRadioButton);
    teacherRadioButton = findViewById(R.id.teacherRadioButton);

    apiService = RetrofitClient.getClient("http://192.168.20.105:8080/").create(ApiService.class);

    findViewById(R.id.registerButton).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            registerUser();
        }
    });

    findViewById(R.id.loginTextView).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
            startActivity(intent);
        }
    });
}

private void registerUser() {
    String userId = userIdEditText.getText().toString();
    String username = usernameEditText.getText().toString();
    String password = passwordEditText.getText().toString();
    String phone = phoneEditText.getText().toString();
    String userClass = userClassEditText.getText().toString();
    String role = studentRadioButton.isChecked() ? "student" : "teacher";

    User user = new User();
    user.setUserId(userId);
    user.setUsername(username);
    user.setPassword(password);
    user.setPhone(phone);
    user.setUserClass(userClass);
    user.setRole(role);
    Log.d("Register", "Registering user with role: " + role);
    // 调用接口(返回 ApiResponse)
    Call<ApiResponse<Void>> call = apiService.register(user);
    call.enqueue(new Callback<ApiResponse<Void>>() {
        @Override
        public void onResponse(Call<ApiResponse<Void>> call, Response<ApiResponse<Void>> response) {
            if (response.isSuccessful()) {
                ApiResponse<Void> apiResponse = response.body();
                if (apiResponse != null && apiResponse.getStatus() == 200) {
                    Toast.makeText(RegisterActivity.this, "注册成功", Toast.LENGTH_SHORT).show();
                    startActivity(new Intent(RegisterActivity.this, LoginActivity.class));
                } else {
                    String errorMsg = apiResponse != null ? apiResponse.getMessage() : "未知错误";
                    Toast.makeText(RegisterActivity.this, "注册失败:" + errorMsg, Toast.LENGTH_SHORT).show();
                }
            } else {
                Toast.makeText(RegisterActivity.this, "请求失败", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<ApiResponse<Void>> call, Throwable t) {
            Toast.makeText(RegisterActivity.this, "网络错误:" + t.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}

}package com.example.blogapp.activity;

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.blogapp.R;
import com.example.blogapp.model.CodingRecord;
import com.example.blogapp.model.DailySummary;

import java.util.ArrayList;
import java.util.List;

public class StatsAdapter extends RecyclerView.Adapter<StatsAdapter.ViewHolder> {
private List records = new ArrayList<>();

public void setRecords(List<CodingRecord> records) {
    this.records = records;
    notifyDataSetChanged();
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item_student_record, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    CodingRecord record = records.get(position);
    holder.bind(record);
}

@Override
public int getItemCount() {
    return records.size();
}

static class ViewHolder extends RecyclerView.ViewHolder {
    private TextView dateView, studentIdView, planningView, devView, reportView, totalView;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        dateView = itemView.findViewById(R.id.dateView);
        studentIdView = itemView.findViewById(R.id.studentIdView);
        planningView = itemView.findViewById(R.id.planningView);
        devView = itemView.findViewById(R.id.devView);
        reportView = itemView.findViewById(R.id.reportView);
        totalView = itemView.findViewById(R.id.totalView);
    }

    public void bind(CodingRecord record) {
        dateView.setText(record.getDate());
        studentIdView.setText(record.getUserId());
        planningView.setText(String.valueOf(record.getPlanningTime()));

        int devTime = record.getCodingTime() + record.getDesignTime() + record.getTestTime();
        int reportTime = record.getSizeMeasurementTime() + record.getPostmortemTime();

        devView.setText(String.valueOf(devTime));
        reportView.setText(String.valueOf(reportTime));
        totalView.setText(String.valueOf(record.getTotalTime()));
    }
}

}package com.example.blogapp.activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.example.blogapp.ApiService;
import com.example.blogapp.R;
import com.example.blogapp.model.ApiResponse;
import com.example.blogapp.model.CodingRecord;
import com.example.blogapp.network.RetrofitClient;

import java.util.List;
import java.util.Map;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class StudentStatsActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private StatsAdapter adapter; // 改为使用StatsAdapter
private ApiService apiService;
private TextView totalStatsView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_student_stats);

    recyclerView = findViewById(R.id.recyclerView);
    totalStatsView = findViewById(R.id.totalStatsView);
    Button backButton = findViewById(R.id.backButton);

    // 初始化RecyclerView
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    adapter = new StatsAdapter();  // 使用StatsAdapter
    recyclerView.setAdapter(adapter);

    // 初始化Retrofit
    apiService = RetrofitClient.getClient("http://192.168.20.105:8080/")
            .create(ApiService.class);

    // 加载数据
    loadStudentStats();

    backButton.setOnClickListener(v -> finish());
}

private void loadStudentStats() {
    apiService.getStudentCodingRecords(null)
            .enqueue(new Callback<ApiResponse<List<CodingRecord>>>() {
                @Override
                public void onResponse(Call<ApiResponse<List<CodingRecord>>> call,
                                       Response<ApiResponse<List<CodingRecord>>> response) {
                    if(response.isSuccessful() && response.body() != null) {
                        List<CodingRecord> records = response.body().getData();
                        updateRecordsList(records);
                        displayTotalStats(records);
                    }
                }

                @Override
                public void onFailure(Call<ApiResponse<List<CodingRecord>>> call, Throwable t) {
                    Toast.makeText(StudentStatsActivity.this, "加载失败", Toast.LENGTH_SHORT).show();
                }
            });
}

private void updateRecordsList(List<CodingRecord> records) {
    adapter.setRecords(records);  // 调用StatsAdapter的setRecords方法
}

private void displayTotalStats(List<CodingRecord> records) {
    int totalTime = 0;
    int planningTotal = 0;
    int devTotal = 0;
    int reportTotal = 0;

    for (CodingRecord record : records) {
        totalTime += record.getTotalTime() != null ? record.getTotalTime() : 0;
        planningTotal += record.getPlanningTime() != null ? record.getPlanningTime() : 0;

        // 计算开发时间(编码+设计+测试)
        int codingTime = record.getCodingTime() != null ? record.getCodingTime() : 0;
        int designTime = record.getDesignTime() != null ? record.getDesignTime() : 0;
        int testTime = record.getTestTime() != null ? record.getTestTime() : 0;
        devTotal += codingTime + designTime + testTime;

        // 计算报告时间(规模测量+事后分析)
        int sizeTime = record.getSizeMeasurementTime() != null ? record.getSizeMeasurementTime() : 0;
        int postmortemTime = record.getPostmortemTime() != null ? record.getPostmortemTime() : 0;
        reportTotal += sizeTime + postmortemTime;
    }

    String statsText = String.format(
            "总记录数: %d\n" +
                    "总编程时间: %d分钟\n" +
                    "计划时间: %d分钟\n" +
                    "开发时间: %d分钟\n" +
                    "报告时间: %d分钟",
            records.size(), totalTime, planningTotal, devTotal, reportTotal);

    totalStatsView.setText(statsText);
}

}package com.example.blogapp.activity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Toast;
import java.util.List;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.example.blogapp.R;
import com.example.blogapp.model.ApiResponse;
import com.example.blogapp.model.DailySummary;
import com.example.blogapp.network.RetrofitClient;
import com.example.blogapp.utils.SecureStorage;

import java.sql.Date;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class SummaryActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private SummaryAdapter adapter;
private com.example.blogapp.ApiService apiService;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_summary);

    apiService = RetrofitClient.getClient("http://192.168.20.105:8080/").create(com.example.blogapp.ApiService.class);

    recyclerView = findViewById(R.id.recycler_view);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    adapter = new SummaryAdapter();
    recyclerView.setAdapter(adapter);

    loadSummaries();

    findViewById(R.id.fab_add).setOnClickListener(v -> showAddDialog());
}

private void loadSummaries() {
    String userId = SecureStorage.getUserId(this);
    if (userId != null && !userId.isEmpty()) {
        Long currentUserId = Long.parseLong(userId);
        Call<ApiResponse<List<DailySummary>>> call = apiService.getSummaries(currentUserId);
        call.enqueue(new Callback<ApiResponse<List<DailySummary>>>() {
            @Override
            public void onResponse(Call<ApiResponse<List<DailySummary>>> call,
                                   Response<ApiResponse<List<DailySummary>>> response) {
                if (response.isSuccessful() && response.body() != null) {
                    List<DailySummary> data = response.body().getData();
                    Log.d("SummaryActivity", "获取到数据: " + data.size() + "条");
                    if (data != null && !data.isEmpty()) {
                        adapter.setData(data);
                    } else {
                        Toast.makeText(SummaryActivity.this, "没有总结数据", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    Log.e("SummaryActivity", "响应不成功: " + response.code());
                }
            }

            @Override
            public void onFailure(Call<ApiResponse<List<DailySummary>>> call, Throwable t) {
                Log.e("SummaryActivity", "加载失败", t);
                Toast.makeText(SummaryActivity.this, "加载失败: " + t.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

private void addSummary(DailySummary summary) {
    // 从本地存储中获取当前用户 ID
    String userId = SecureStorage.getUserId(this);
    if (userId != null && !userId.isEmpty()) {
        Long currentUserId = Long.parseLong(userId);
        summary.setUserId(currentUserId);
        Call<ApiResponse<Void>> call = apiService.addSummary(summary);
        call.enqueue(new Callback<ApiResponse<Void>>() {
            @Override
            public void onResponse(Call<ApiResponse<Void>> call, Response<ApiResponse<Void>> response) {
                if (response.isSuccessful()) {
                    loadSummaries();
                    Toast.makeText(SummaryActivity.this, "添加成功", Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailure(Call<ApiResponse<Void>> call, Throwable t) {
                Toast.makeText(SummaryActivity.this, "添加失败", Toast.LENGTH_SHORT).show();
            }
        });
    } else {
        Toast.makeText(this, "用户信息未找到,请重新登录", Toast.LENGTH_SHORT).show();
        startActivity(new Intent(this, LoginActivity.class));
        finish();
    }
}

private void showAddDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    View view = LayoutInflater.from(this).inflate(R.layout.dialog_add_summary, null);
    EditText etUrl = view.findViewById(R.id.et_url);
    DatePicker datePicker = view.findViewById(R.id.date_picker);

    builder.setView(view)
            .setPositiveButton("提交", (dialog, which) -> {
                String url = etUrl.getText().toString();
                int year = datePicker.getYear();
                int month = datePicker.getMonth() + 1;
                int day = datePicker.getDayOfMonth();
                String date = String.format("%04d-%02d-%02d", year, month, day);

                DailySummary summary = new DailySummary();
                summary.setBlogUrl(url);
                summary.setSummaryDate(Date.valueOf(date));

                addSummary(summary);
            })
            .setNegativeButton("取消", null)
            .show();
}

}package com.example.blogapp.activity;

import android.content.Intent;
import android.net.Uri;
import android.util.Log;
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.blogapp.R;
import com.example.blogapp.model.DailySummary;

import java.util.ArrayList;
import java.util.List;

public class SummaryAdapter extends RecyclerView.Adapter<SummaryAdapter.SummaryViewHolder> {
private List summaries = new ArrayList<>(); // 初始化空列表

public void setData(List<DailySummary> summaries) {
    this.summaries = summaries;
    notifyDataSetChanged();
    Log.d("SummaryAdapter", "数据更新,数量: " + summaries.size()); // 添加日志
}

@Override
public void onBindViewHolder(@NonNull SummaryViewHolder holder, int position) {
    DailySummary summary = summaries.get(position);
    Log.d("SummaryAdapter", "绑定数据: " + summary.getBlogUrl()); // 添加日志
    holder.bind(summary);
}
@NonNull
@Override
public SummaryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_summary, parent, false);
    return new SummaryViewHolder(view);
}



@Override
public int getItemCount() {
    return summaries == null ? 0 : summaries.size();
}

public static class SummaryViewHolder extends RecyclerView.ViewHolder {
    private TextView urlTextView;
    private TextView dateTextView;

    public SummaryViewHolder(View itemView) {
        super(itemView);
        urlTextView = itemView.findViewById(R.id.url_text);
        dateTextView = itemView.findViewById(R.id.date_text);
    }




    public void bind(DailySummary summary) {
        urlTextView.setText(summary.getBlogUrl());
        // 直接显示日期字符串,或者格式化显示
        dateTextView.setText(summary.getSummaryDate().toString());

        urlTextView.setOnClickListener(v -> {
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(summary.getBlogUrl()));
            v.getContext().startActivity(intent);
        });
    }
}

}package com.example.blogapp.activity;

import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.example.blogapp.ApiService;
import com.example.blogapp.DailySummaryResponse;
import com.example.blogapp.R;
import com.example.blogapp.activity.DailySummaryAdapter;
import com.example.blogapp.model.ApiResponse;
import com.example.blogapp.model.DailySummary;
import com.example.blogapp.network.RetrofitClient;
import com.example.blogapp.utils.SecureStorage;
import com.google.android.material.datepicker.MaterialDatePicker;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class SummarySearchActivity extends AppCompatActivity {

private EditText startDateEditText;
private EditText endDateEditText;
private EditText keywordEditText;
private RecyclerView recyclerView;
private DailySummaryAdapter adapter;
// SummarySearchActivity.java
private List<DailySummaryResponse> summaryList = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_summary_search);

    // 初始化视图
    startDateEditText = findViewById(R.id.startDateEditText);
    endDateEditText = findViewById(R.id.endDateEditText);
    keywordEditText = findViewById(R.id.keywordEditText);
    Button searchButton = findViewById(R.id.searchButton);
    recyclerView = findViewById(R.id.recyclerView);

    // 设置RecyclerView
    // 修改Adapter初始化
    adapter = new DailySummaryAdapter(summaryList);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(adapter);

    // 设置日期选择器
    setupDatePickers();

    // 设置搜索按钮点击事件
    searchButton.setOnClickListener(v -> searchSummaries());

    // 默认加载最近一周的数据
    loadDefaultData();
}

private void setupDatePickers() {
    MaterialDatePicker<Long> startDatePicker = MaterialDatePicker.Builder.datePicker()
            .setTitleText("选择开始日期")
            .build();

    MaterialDatePicker<Long> endDatePicker = MaterialDatePicker.Builder.datePicker()
            .setTitleText("选择结束日期")
            .build();

    startDatePicker.addOnPositiveButtonClickListener(selection -> {
        if (selection != null) {
            String formattedDate = formatDate(selection);
            startDateEditText.setText(formattedDate);
        }
    });

    endDatePicker.addOnPositiveButtonClickListener(selection -> {
        if (selection != null) {
            String formattedDate = formatDate(selection);
            endDateEditText.setText(formattedDate);
        }
    });

    startDateEditText.setOnClickListener(v -> {
        if (!isFinishing() && !isDestroyed()) {
            startDatePicker.show(getSupportFragmentManager(), "START_DATE_PICKER");
        }
    });

    endDateEditText.setOnClickListener(v -> {
        if (!isFinishing() && !isDestroyed()) {
            endDatePicker.show(getSupportFragmentManager(), "END_DATE_PICKER");
        }
    });
}

private String formatDate(long timestamp) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
    return sdf.format(new Date(timestamp));
}

private void loadDefaultData() {
    // 默认加载最近一周的数据
    searchSummaries();
}

private void searchSummaries() {
    String startDate = startDateEditText.getText().toString();
    String endDate = endDateEditText.getText().toString();
    String keyword = keywordEditText.getText().toString();

    ApiService apiService = RetrofitClient.getClient("http://192.168.20.105:8080/").create(ApiService.class);

    Call<ApiResponse<List<DailySummaryResponse>>> call = apiService.searchSummaries(
            startDate.isEmpty() ? null : startDate,
            endDate.isEmpty() ? null : endDate,
            keyword.isEmpty() ? null : keyword
    );

    call.enqueue(new Callback<ApiResponse<List<DailySummaryResponse>>>() {
        @Override
        public void onResponse(Call<ApiResponse<List<DailySummaryResponse>>> call,
                               Response<ApiResponse<List<DailySummaryResponse>>> response) {
            if (response.isSuccessful() && response.body() != null && response.body().getData() != null) {
                summaryList.clear();
                summaryList.addAll(response.body().getData());
                adapter.notifyDataSetChanged();

                if (summaryList.isEmpty()) {
                    Toast.makeText(SummarySearchActivity.this,
                            "没有找到匹配的每日总结记录", Toast.LENGTH_SHORT).show();
                }
            } else {
                Toast.makeText(SummarySearchActivity.this,
                        "获取数据失败", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<ApiResponse<List<DailySummaryResponse>>> call, Throwable t) {
            Toast.makeText(SummarySearchActivity.this,
                    "网络错误: " + t.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}

}package com.example.blogapp.activity;

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.blogapp.R;

import java.util.List;
import java.util.Map;

public class SummaryStatsAdapter extends RecyclerView.Adapter<SummaryStatsAdapter.ViewHolder> {

private List<Map<String, Object>> statsList;

public void setData(List<Map<String, Object>> statsList) {
    this.statsList = statsList;
    notifyDataSetChanged();
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item_summary_stats, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    Map<String, Object> stat = statsList.get(position);

    holder.classText.setText((String) stat.get("userClass"));
    holder.idText.setText((String) stat.get("userId"));
    holder.nameText.setText((String) stat.get("username"));
    holder.countText.setText(String.valueOf(stat.get("summaryCount")));
}

@Override
public int getItemCount() {
    return statsList == null ? 0 : statsList.size();
}

static class ViewHolder extends RecyclerView.ViewHolder {
    TextView classText;
    TextView idText;
    TextView nameText;
    TextView countText;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        classText = itemView.findViewById(R.id.classText);
        idText = itemView.findViewById(R.id.idText);
        nameText = itemView.findViewById(R.id.nameText);
        countText = itemView.findViewById(R.id.countText);
    }
}

}package com.example.blogapp.activity;

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.blogapp.R;

import java.util.List;
import java.util.Map;

public class SummaryStatsAdapter extends RecyclerView.Adapter<SummaryStatsAdapter.ViewHolder> {

private List<Map<String, Object>> statsList;

public void setData(List<Map<String, Object>> statsList) {
    this.statsList = statsList;
    notifyDataSetChanged();
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item_summary_stats, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    Map<String, Object> stat = statsList.get(position);

    holder.classText.setText((String) stat.get("userClass"));
    holder.idText.setText((String) stat.get("userId"));
    holder.nameText.setText((String) stat.get("username"));
    holder.countText.setText(String.valueOf(stat.get("summaryCount")));
}

@Override
public int getItemCount() {
    return statsList == null ? 0 : statsList.size();
}

static class ViewHolder extends RecyclerView.ViewHolder {
    TextView classText;
    TextView idText;
    TextView nameText;
    TextView countText;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        classText = itemView.findViewById(R.id.classText);
        idText = itemView.findViewById(R.id.idText);
        nameText = itemView.findViewById(R.id.nameText);
        countText = itemView.findViewById(R.id.countText);
    }
}

}package com.example.blogapp.activity;

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.blogapp.R;

import java.util.List;
import java.util.Map;

public class SummaryStatsAdapter extends RecyclerView.Adapter<SummaryStatsAdapter.ViewHolder> {

private List<Map<String, Object>> statsList;

public void setData(List<Map<String, Object>> statsList) {
    this.statsList = statsList;
    notifyDataSetChanged();
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item_summary_stats, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    Map<String, Object> stat = statsList.get(position);

    holder.classText.setText((String) stat.get("userClass"));
    holder.idText.setText((String) stat.get("userId"));
    holder.nameText.setText((String) stat.get("username"));
    holder.countText.setText(String.valueOf(stat.get("summaryCount")));
}

@Override
public int getItemCount() {
    return statsList == null ? 0 : statsList.size();
}

static class ViewHolder extends RecyclerView.ViewHolder {
    TextView classText;
    TextView idText;
    TextView nameText;
    TextView countText;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        classText = itemView.findViewById(R.id.classText);
        idText = itemView.findViewById(R.id.idText);
        nameText = itemView.findViewById(R.id.nameText);
        countText = itemView.findViewById(R.id.countText);
    }
}

}

posted @ 2025-03-07 21:44  ytr123  阅读(9)  评论(0)    收藏  举报