日报2025410

个人作业开发

package com.example.dailyreport.adapter;

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.dailyreport.R;
import com.example.dailyreport.model.DailyLog;

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

public class DailyLogAdapter extends RecyclerView.Adapter<DailyLogAdapter.ViewHolder> {
    private final List<DailyLog> dailyLogList;
    private final OnDailyLogClickListener onDailyLogClickListener;
    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());

    public interface OnDailyLogClickListener {
        void onDailyLogClick(DailyLog dailyLog);
    }

    public DailyLogAdapter(List<DailyLog> dailyLogList, OnDailyLogClickListener listener) {
        this.dailyLogList = dailyLogList;
        this.onDailyLogClickListener = listener;
    }

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

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        DailyLog dailyLog = dailyLogList.get(position);
        
        String dateStr = dailyLog.getDate() != null ? dateFormat.format(dailyLog.getDate()) : "未知日期";
        holder.tvDate.setText(dateStr);
        
        String analysis = dailyLog.getDevelopmentAnalysis();
        holder.tvAnalysis.setText(analysis != null && !analysis.isEmpty() ? analysis : "无分析内容");
        
        Double hours = dailyLog.getTotalHours();
        holder.tvHours.setText(hours != null ? hours + "小时" : "未记录时间");
        
        holder.itemView.setOnClickListener(v -> onDailyLogClickListener.onDailyLogClick(dailyLog));
    }

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

    public static class ViewHolder extends RecyclerView.ViewHolder {
        final TextView tvDate;
        final TextView tvAnalysis;
        final TextView tvHours;

        public ViewHolder(View itemView) {
            super(itemView);
            tvDate = itemView.findViewById(R.id.tvDate);
            tvAnalysis = itemView.findViewById(R.id.tvAnalysis);
            tvHours = itemView.findViewById(R.id.tvHours);
        }
    }
}
package com.example.dailyreport.adapter;

import static android.widget.Toast.LENGTH_LONG;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.dailyreport.R;
import com.example.dailyreport.model.Blog;
import com.example.dailyreport.model.User;
import com.example.dailyreport.network.ApiResponse;
import com.example.dailyreport.network.RetrofitClient;

import java.util.List;

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

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

    private List<User> userList;
    private OnItemClickListener listener;

    public interface OnItemClickListener {
        void onItemClick(User user);
    }

    public UserListAdapter(List<User> userList, OnItemClickListener listener) {
        this.userList = userList;
        this.listener = listener;
    }

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

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        User user = userList.get(position);
        holder.tvId.setText("学号: " + user.getId());
        holder.tvName.setText("姓名: " + user.getName());
        holder.tvClass.setText("班级: " + user.getSclass());
        
        // 加载博客数量
        loadBlogCount(user.getId(), holder.tvBlogCount);
        
        holder.itemView.setOnClickListener(v -> listener.onItemClick(user));
    }

    private void loadBlogCount(String userId, TextView tvBlogCount) {
        RetrofitClient.getInstance().getApiService()
            .selectByUserId(userId)
            .enqueue(new Callback<ApiResponse<List<Blog>>>() {
                @Override
                public void onResponse(Call<ApiResponse<List<Blog>>> call, Response<ApiResponse<List<Blog>>> response) {
                    try {
                        if (response.isSuccessful() && response.body() != null) {
                            ApiResponse<List<Blog>> apiResponse = response.body();
                            if (apiResponse != null) {
                                List<Blog> blogs = apiResponse.getData();
                                int count = blogs != null ? blogs.size() : 0;
                                tvBlogCount.setText("博客数量: " + count);
                                // 打印响应数据,用于调试
                                System.out.println("API响应数据: " + apiResponse.toString());
                            } else {
                                tvBlogCount.setText("博客数量: 数据为空");
                                System.out.println("API响应体为空");
                            }
                        } else {
                            tvBlogCount.setText("博客数量: 请求失败");
                            System.out.println("API请求失败: " + response.code());
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        tvBlogCount.setText("博客数量: 处理异常");
                        System.out.println("数据处理异常: " + e.getMessage());
                    }
                }

                @Override
                public void onFailure(Call<ApiResponse<List<Blog>>> call, Throwable t) {
                    t.printStackTrace();
                    String errorMessage = "网络错误";
                    if (t instanceof java.net.UnknownHostException) {
                        errorMessage = "网络不可用";
                    } else if (t instanceof java.net.SocketTimeoutException) {
                        errorMessage = "请求超时";
                    } else if (t instanceof java.net.ConnectException) {
                        errorMessage = "连接失败";
                    }
                    tvBlogCount.setText("博客数量: " + errorMessage);
                    System.out.println("加载失败: " + t.getMessage());
                }
            });
    }

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

    static class ViewHolder extends RecyclerView.ViewHolder {
        TextView tvId, tvName, tvClass, tvBlogCount;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            tvId = itemView.findViewById(R.id.tvId);
            tvName = itemView.findViewById(R.id.tvName);
            tvClass = itemView.findViewById(R.id.tvClass);
            tvBlogCount = itemView.findViewById(R.id.tvBlogCount);
        }
    }
}
package com.example.dailyreport.adapter;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.dailyreport.R;
import com.example.dailyreport.model.WeeklyPlan;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Locale;

public class WeeklyPlanAdapter extends RecyclerView.Adapter<WeeklyPlanAdapter.ViewHolder> {
    private List<WeeklyPlan> plans;
    private OnDeleteClickListener deleteListener;
    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.getDefault());

    public interface OnDeleteClickListener {
        void onDeleteClick(WeeklyPlan plan);
    }

    public WeeklyPlanAdapter(List<WeeklyPlan> plans, OnDeleteClickListener listener) {
        this.plans = plans;
        this.deleteListener = listener;
    }

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

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        WeeklyPlan plan = plans.get(position);
        // 添加日期空值检查
        if (plan != null && plan.getDate() != null) {
            try {
                holder.tvDate.setText(dateFormat.format(plan.getDate()));
            } catch (Exception e) {
                holder.tvDate.setText("日期格式错误");
                e.printStackTrace();
            }
        } else {
            holder.tvDate.setText("无日期信息");
        }
        
        holder.tvPlan.setText(plan.getPlan());
        holder.btnDelete.setOnClickListener(v -> deleteListener.onDeleteClick(plan));
    }

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

    public void updatePlans(List<WeeklyPlan> newPlans) {
        this.plans = newPlans;
        notifyDataSetChanged();
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        TextView tvDate, tvPlan;
        Button btnDelete;

        ViewHolder(View view) {
            super(view);
            tvDate = view.findViewById(R.id.tvDate);
            tvPlan = view.findViewById(R.id.tvPlan);
            btnDelete = view.findViewById(R.id.btnDelete);
        }
    }
}
package com.example.dailyreport.network;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;


import java.util.concurrent.TimeUnit;

public class RetrofitClient {
    // 模拟器访问本地服务器
    private static final String BASE_URL = "http://10.0.2.2:8080/";
    
    // 真机访问需要改为实际IP(确保手机和PC在同一网络)
    // private static final String BASE_URL = "http://192.168.x.x:8080/";
    private static RetrofitClient instance;
    private final ApiService apiService;
    private Retrofit retrofit; // 添加这行声明

    private RetrofitClient() {
        OkHttpClient client = new OkHttpClient.Builder()
            .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
            .connectTimeout(30, TimeUnit.SECONDS) // 添加超时设置
            .readTimeout(30, TimeUnit.SECONDS)
            .writeTimeout(30, TimeUnit.SECONDS)
            .build();
    
        retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(client) // 使用带日志拦截器的client
            .addConverterFactory(GsonConverterFactory.create())
            .build();
        apiService = retrofit.create(ApiService.class);
    }

    public static synchronized RetrofitClient getInstance() {
        if (instance == null) {
            instance = new RetrofitClient();
        }
        return instance;
    }

    public ApiService getApiService() {
        return apiService;
    }
}
package com.example.dailyreport.network;

import com.example.dailyreport.model.Blog;
import com.example.dailyreport.model.DailyLog;
import com.example.dailyreport.model.User;
import com.example.dailyreport.model.WeeklyPlan;
import java.util.List;  // 添加这行导入
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.DELETE;  // 添加这行导入
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Query;

public interface ApiService {
    @POST("/user/login")
    Call<ApiResponse<User>> login(@Body User user);

    @POST("user/register")
    Call<ApiResponse<User>> register(@Body User user);

    @GET("blog/get/{id}")
    Call<ApiResponse<Blog>> getBlog(@Path("id") String id);

    @POST("blog/add")
    Call<Void> addBlog(@Body Blog blog);

    @GET("blog/all")
    Call<List<Blog>> getAllBlogs();

    @POST("blog/update")
    Call<ApiResponse<Blog>> updateBlog(@Body Blog blog);

    @GET("/user/id/{name}")
    Call<ApiResponse<String>> getIdByName(@Path("name") String name);

    @POST("/weeklyPlan/add")
    Call<ApiResponse<String>> addWeeklyPlan(@Body WeeklyPlan weeklyPlan);

    @GET("/weeklyPlan/list")
    Call<ApiResponse<List<WeeklyPlan>>> getWeeklyPlans();

    @DELETE("/weeklyPlan/delete/{id}")
    Call<ApiResponse<String>> deleteWeeklyPlan(@Path("id") String id);

    @POST("/dailyLog/add")
    Call<ApiResponse<String>> addDailyLog(@Body DailyLog dailyLog);

    // Add this method to your ApiService interface
    @GET("blog/user/{userId}")
    Call<ApiResponse<List<Blog>>> selectByUserId(@Path("userId") String userId);

    // 在现有的ApiService接口中添加以下方法
    @GET("dailyLog/user/{userId}")
    Call<ApiResponse<List<DailyLog>>> getDailyLogsByUserId(@Path("userId") String userId);

    @GET("dailyLog/get/{id}")
    Call<ApiResponse<DailyLog>> getDailyLogById(@Path("id") String id);

    @GET("/dailyLog/getByDate")
    Call<ApiResponse<List<DailyLog>>> getDailyLogsByDate(@Query("date") String date);

    @GET("/user/allStudents")
    Call<ApiResponse<List<User>>> getAllStudents();
}
posted @ 2025-04-10 23:03  花落水无痕  阅读(22)  评论(0)    收藏  举报