个人学习记录app
包含了注册,登录,设置查看每周目标,添加查看每日总结,添加查看每日编程记录。
登录活动:
package com.example.learningrecordapp.activities;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.learningrecordapp.R;
import com.example.learningrecordapp.utils.DBConnection;
import com.example.learningrecordapp.utils.EncryptionUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class LoginActivity extends AppCompatActivity {
private EditText etUserId, etPassword;
private Button btnLogin, btnRegister;
private SharedPreferences sharedPreferences; // 添加 SharedPreferences 对象
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    initViews();
    setupLoginButton();
    setupRegisterNavigation();
}
private void initViews() {
    etUserId = findViewById(R.id.et_login_user_id);
    etPassword = findViewById(R.id.et_login_password);
    btnLogin = findViewById(R.id.btn_login);
    btnRegister = findViewById(R.id.btn_go_to_register);
    // 初始化 SharedPreferences
    sharedPreferences = getSharedPreferences("user_info", MODE_PRIVATE);
}
private void setupLoginButton() {
    btnLogin.setOnClickListener(v -> {
        String userId = etUserId.getText().toString().trim();
        String password = etPassword.getText().toString().trim();
        if (TextUtils.isEmpty(userId) || TextUtils.isEmpty(password)) {
            Toast.makeText(this, "请输入学号和密码", Toast.LENGTH_SHORT).show();
            return;
        }
        new LoginTask().execute(userId, password);
    });
}
private void setupRegisterNavigation() {
    btnRegister.setOnClickListener(v -> {
        startActivity(new Intent(LoginActivity.this, RegisterActivity.class));
    });
}
private class LoginTask extends AsyncTask<String, Void, Boolean> {
    private String error = "";
    @Override
    protected Boolean doInBackground(String... params) {
        String userId = params[0];
        String password = params[1];
        String encryptedPassword = EncryptionUtils.encryptPassword(password);
        try (Connection conn = DBConnection.getConnection()) {
            String sql = "SELECT * FROM users WHERE user_id = ? AND password = ?";
            try (PreparedStatement stmt = conn.prepareStatement(sql)) {
                stmt.setString(1, userId);
                stmt.setString(2, encryptedPassword);
                return stmt.executeQuery().next();
            }
        } catch (SQLException e) {
            e.printStackTrace();
            error = "网络连接失败,请重试";
            return false;
        }
    }
    @Override
    protected void onPostExecute(Boolean success) {
        if (success) {
            // 登录成功后保存用户 ID 到 SharedPreferences
            saveUserIdToSharedPreferences(etUserId.getText().toString().trim());
            Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
            startActivity(new Intent(LoginActivity.this, MainActivity.class));
            finish();
        } else {
            Toast.makeText(LoginActivity.this, "登录失败:" + (TextUtils.isEmpty(error) ? "学号或密码错误" : error), Toast.LENGTH_SHORT).show();
        }
    }
}
// 添加保存用户 ID 到 SharedPreferences 的方法
private void saveUserIdToSharedPreferences(String userId) {
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString("user_id", userId); // 键名需与 WeeklyGoalActivity 中一致
    editor.apply(); // 使用 apply() 或 commit() 保存
}
}
界面 :
<?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:gravity="center_horizontal">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="用户登录"
        android:textSize="24sp"
        android:textColor="@android:color/black"
        android:layout_marginBottom="24dp" />
    <!-- 用户ID -->
    <EditText
        android:id="@+id/et_login_user_id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="学号(用户ID)"
        android:padding="12dp"
        android:background="@drawable/border_edittext"
        android:textColorHint="@color/darker_gray"
        android:layout_marginBottom="16dp" />
    <!-- 密码 -->
    <EditText
        android:id="@+id/et_login_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="密码"
        android:inputType="textPassword"
        android:padding="12dp"
        android:background="@drawable/border_edittext"
        android:textColorHint="@color/darker_gray"
        android:layout_marginBottom="24dp" />
    <!-- 登录按钮 -->
    <Button
        android:id="@+id/btn_login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="登录"
        android:background="@color/colorPrimary"
        android:textColor="@android:color/white"
        android:padding="12dp"
        android:layout_marginBottom="16dp" />
    <!-- 注册导航 -->
    <Button
        android:id="@+id/btn_go_to_register"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="还没有账号?立即注册"
        android:textColor="@color/colorPrimary"
        android:background="@android:color/transparent"
        android:textSize="14sp" />
</LinearLayout>
注册活动:
```plaintext
package com.example.learningrecordapp.activities;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.learningrecordapp.R;
import com.example.learningrecordapp.utils.DBConnection;
import com.example.learningrecordapp.utils.EncryptionUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class RegisterActivity extends AppCompatActivity {
    private EditText etUserId, etUsername, etPassword, etPhoneNumber, etUserUnit, etUserClass;
    private Button btnRegister;
    private SharedPreferences sharedPreferences;
    private static final String SHARED_PREF_NAME = "user_info";
    private static final String KEY_USER_ID = "user_id";
    private static final String KEY_USERNAME = "username";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        initViews();
        loadSavedUsername();
        setupRegisterButton();
    }
    private void initViews() {
        etUserId = findViewById(R.id.et_user_id);
        etUsername = findViewById(R.id.et_username);
        etPassword = findViewById(R.id.et_password);
        etPhoneNumber = findViewById(R.id.et_phone_number);
        etUserUnit = findViewById(R.id.et_user_unit);
        etUserClass = findViewById(R.id.et_user_class);
        btnRegister = findViewById(R.id.btn_register);
        sharedPreferences = getSharedPreferences(SHARED_PREF_NAME, MODE_PRIVATE);
    }
    private void loadSavedUsername() {
        String savedUsername = sharedPreferences.getString(KEY_USERNAME, "");
        String savedUserId = sharedPreferences.getString(KEY_USER_ID, "");
        if (!savedUsername.isEmpty()) {
            etUsername.setText(savedUsername);
            etUsername.setEnabled(false);
            etUserId.setText(savedUserId);
            etUserId.setEnabled(false);
        } else {
            etUsername.setEnabled(true);
            etUserId.setEnabled(true);
        }
    }
    private void setupRegisterButton() {
        btnRegister.setOnClickListener(v -> {
            String userId = etUserId.getText().toString().trim();
            String username = etUsername.getText().toString().trim();
            String password = etPassword.getText().toString().trim();
            String phoneNumber = etPhoneNumber.getText().toString().trim();
            String userUnit = etUserUnit.getText().toString().trim();
            String userClass = etUserClass.getText().toString().trim();
            if (validateInputs(userId, username, password, phoneNumber, userUnit, userClass)) {
                new RegisterTask().execute(userId, username, password, phoneNumber, userUnit, userClass);
            }
        });
    }
    private boolean validateInputs(String userId, String username, String password, String phoneNumber, String userUnit, String userClass) {
        if (userId.isEmpty()) {
            Toast.makeText(this, "请输入学号(用户ID)", Toast.LENGTH_SHORT).show();
            return false;
        }
        if (username.isEmpty() && sharedPreferences.getString(KEY_USERNAME, "").isEmpty()) {
            Toast.makeText(this, "请输入姓名", Toast.LENGTH_SHORT).show();
            return false;
        }
        if (password.isEmpty() || password.length() < 6 || password.length() > 16) {
            Toast.makeText(this, "密码需6 - 16位", Toast.LENGTH_SHORT).show();
            return false;
        }
        if (phoneNumber.isEmpty() || phoneNumber.length() != 11) {
            Toast.makeText(this, "请输入有效的手机号码", Toast.LENGTH_SHORT).show();
            return false;
        }
        if (userUnit.isEmpty() || userClass.isEmpty()) {
            Toast.makeText(this, "请输入用户单位和班级", Toast.LENGTH_SHORT).show();
            return false;
        }
        return true;
    }
    private class RegisterTask extends AsyncTask<String, Void, Boolean> {
        private String errorMessage = "";
        @Override
        protected Boolean doInBackground(String... params) {
            String userId = params[0];
            String username = params[1];
            String password = params[2];
            String phoneNumber = params[3];
            String userUnit = params[4];
            String userClass = params[5];
            try (Connection conn = DBConnection.getConnection()) {
                // 检查用户ID是否已存在
                String checkSql = "SELECT user_id FROM users WHERE user_id = ?";
                try (PreparedStatement checkStmt = conn.prepareStatement(checkSql)) {
                    checkStmt.setString(1, userId);
                    ResultSet rs = checkStmt.executeQuery();
                    if (rs.next()) {
                        errorMessage = "该学号已注册!";
                        return false;
                    }
                }
                // 插入新用户
                String insertSql = "INSERT INTO users (user_id, username, phone_number, user_unit, user_class, password) VALUES (?, ?, ?, ?, ?, ?)";
                try (PreparedStatement insertStmt = conn.prepareStatement(insertSql)) {
                    insertStmt.setString(1, userId);
                    insertStmt.setString(2, username);
                    insertStmt.setString(3, phoneNumber);
                    insertStmt.setString(4, userUnit);
                    insertStmt.setString(5, userClass);
                    insertStmt.setString(6, EncryptionUtils.encryptPassword(password));
                    insertStmt.executeUpdate();
                    return true;
                }
            } catch (SQLException e) {
                e.printStackTrace();
                errorMessage = "注册失败,请稍后重试:" + e.getMessage();
                return false;
            }
        }
        @Override
        protected void onPostExecute(Boolean success) {
            if (success) {
                saveUserInfo(etUserId.getText().toString(), etUsername.getText().toString());
                Toast.makeText(RegisterActivity.this, "注册成功!", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
                startActivity(intent);
                finish();
            } else {
                Toast.makeText(RegisterActivity.this, errorMessage, Toast.LENGTH_SHORT).show();
            }
        }
    }
    private void saveUserInfo(String userId, String username) {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(KEY_USER_ID, userId);
        editor.putString(KEY_USERNAME, username);
        editor.apply();
        etUsername.setEnabled(false);
        etUserId.setEnabled(false);
    }
}
界面:
```plaintext
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center_horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="用户注册"
            android:textSize="24sp"
            android:textColor="@android:color/black"
            android:layout_marginBottom="24dp" />
        <!-- 用户ID -->
        <EditText
            android:id="@+id/et_user_id"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="学号(用户ID)"
            android:padding="12dp"
            android:background="@drawable/border_edittext"
            android:textColorHint="@color/darker_gray"
            android:layout_marginBottom="16dp" />
        <!-- 用户名 -->
        <EditText
            android:id="@+id/et_username"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="姓名"
            android:padding="12dp"
            android:background="@drawable/border_edittext"
            android:textColorHint="@color/darker_gray"
            android:layout_marginBottom="16dp" />
        <!-- 密码 -->
        <EditText
            android:id="@+id/et_password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="密码(6 - 16位)"
            android:inputType="textPassword"
            android:padding="12dp"
            android:background="@drawable/border_edittext"
            android:textColorHint="@color/darker_gray"
            android:layout_marginBottom="16dp" />
        <!-- 手机号码 -->
        <EditText
            android:id="@+id/et_phone_number"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="手机号码"
            android:inputType="phone"
            android:padding="12dp"
            android:background="@drawable/border_edittext"
            android:textColorHint="@color/darker_gray"
            android:layout_marginBottom="16dp" />
        <!-- 用户单位 -->
        <EditText
            android:id="@+id/et_user_unit"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="用户单位(如学院)"
            android:padding="12dp"
            android:background="@drawable/border_edittext"
            android:textColorHint="@color/darker_gray"
            android:layout_marginBottom="16dp" />
        <!-- 用户班级 -->
        <EditText
            android:id="@+id/et_user_class"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="用户班级(如2023级计算机1班)"
            android:padding="12dp"
            android:background="@drawable/border_edittext"
            android:textColorHint="@color/darker_gray"
            android:layout_marginBottom="24dp" />
        <!-- 注册按钮 -->
        <Button
            android:id="@+id/btn_register"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="注册"
            android:background="@color/colorPrimary"
            android:textColor="@android:color/white"
            android:padding="12dp"
            android:layout_marginBottom="16dp" />
    </LinearLayout>
</ScrollView>
主活动:
```plaintext
package com.example.learningrecordapp.activities;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import com.example.learningrecordapp.R;
public class MainActivity extends AppCompatActivity {
    private Button btnSetWeeklyGoal, btnAddDailySummary, btnAddDailyProgramming, btnViewWeeklyGoal;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnSetWeeklyGoal = findViewById(R.id.btn_set_weekly_goal);
        btnAddDailySummary = findViewById(R.id.btn_add_daily_summary);
        btnAddDailyProgramming = findViewById(R.id.btn_add_daily_programming);
        btnViewWeeklyGoal = findViewById(R.id.btn_view_weekly_goal);
        btnSetWeeklyGoal.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, WeeklyGoalActivity.class);
                startActivity(intent);
            }
        });
        btnAddDailySummary.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, DailySummaryActivity.class);
                startActivity(intent);
            }
        });
        btnAddDailyProgramming.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, DailyProgrammingActivity.class);
                startActivity(intent);
            }
        });
        btnViewWeeklyGoal.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, ViewWeeklyGoalActivity.class);
                startActivity(intent);
            }
        });
    }
}
界面:
```plaintext
<?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:gravity="center"
    android:padding="16dp"
    android:background="#f4f4f9"> <!-- 设置背景颜色 -->
    <Button
        android:id="@+id/btn_set_weekly_goal"
        android:layout_width="200dp"
        android:layout_height="50dp"
        android:text="设置每周目标"
        android:textSize="18sp"
        android:textColor="#ffffff"
        android:background="#007bff"
        android:layout_marginBottom="20dp"
        android:elevation="4dp"
        android:gravity="center" />
    <Button
        android:id="@+id/btn_add_daily_summary"
        android:layout_width="200dp"
        android:layout_height="50dp"
        android:text="每日总结"
        android:textSize="18sp"
        android:textColor="#ffffff"
        android:background="#28a745"
        android:layout_marginBottom="20dp"
        android:elevation="4dp"
        android:gravity="center" />
    <Button
        android:id="@+id/btn_add_daily_programming"
        android:layout_width="200dp"
        android:layout_height="50dp"
        android:text="添加每日编程记录"
        android:textSize="18sp"
        android:textColor="#ffffff"
        android:background="#ffc107"
        android:layout_marginBottom="20dp"
        android:elevation="4dp"
        android:gravity="center" />
    <Button
        android:id="@+id/btn_view_weekly_goal"
        android:layout_width="200dp"
        android:layout_height="50dp"
        android:text="查看每周学习目标"
        android:textSize="18sp"
        android:textColor="#ffffff"
        android:background="#dc3545"
        android:elevation="4dp"
        android:gravity="center" />
</LinearLayout>
每周目标功能:
```plaintext
package com.example.learningrecordapp.activities;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.learningrecordapp.R;
import com.example.learningrecordapp.entities.DailyPlan;
import com.example.learningrecordapp.entities.WeeklyGoal;
import com.example.learningrecordapp.utils.DBConnection;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class WeeklyGoalActivity extends AppCompatActivity {
    private DatePicker dpWeekStart;
    private EditText etTotalGoal, etMonday, etTuesday, etWednesday, etThursday, etFriday;
    private Button btnSaveGoal;
    private SharedPreferences sharedPreferences;
    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_weekly_goal);
        initViews();
        setupDatePicker();
        setupSaveButton();
    }
    private void initViews() {
        dpWeekStart = findViewById(R.id.dp_week_start);
        etTotalGoal = findViewById(R.id.et_total_goal);
        etMonday = findViewById(R.id.et_monday_plan);
        etTuesday = findViewById(R.id.et_tuesday_plan);
        etWednesday = findViewById(R.id.et_wednesday_plan);
        etThursday = findViewById(R.id.et_thursday_plan);
        etFriday = findViewById(R.id.et_friday_plan);
        btnSaveGoal = findViewById(R.id.btn_save_goal);
        // 获取登录时保存的用户信息
        sharedPreferences = getSharedPreferences("user_info", MODE_PRIVATE);
    }
    private void setupDatePicker() {
        // 默认选择当前周的周一
        Calendar calendar = Calendar.getInstance();
        setToMonday(calendar);
        dpWeekStart.init(
                calendar.get(Calendar.YEAR),
                calendar.get(Calendar.MONTH),
                calendar.get(Calendar.DAY_OF_MONTH),
                null
        );
    }
    private void setupSaveButton() {
        btnSaveGoal.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 检查用户是否已登录(从SharedPreferences获取用户ID)
                String userId = sharedPreferences.getString("user_id", "");
                if (userId.isEmpty()) {
                    Toast.makeText(WeeklyGoalActivity.this, "请先登录", Toast.LENGTH_SHORT).show();
                    return;
                }
                Date weekStartDate = getSelectedMonday();
                // 将 Editable 对象转换为 String 类型再调用 trim 方法
                String totalGoal = etTotalGoal.getText().toString().trim();
                String[] dailyPlans = {
                        etMonday.getText().toString().trim(),
                        etTuesday.getText().toString().trim(),
                        etWednesday.getText().toString().trim(),
                        etThursday.getText().toString().trim(),
                        etFriday.getText().toString().trim()
                };
                // 验证输入:总目标或至少一天计划不为空
                if (totalGoal.isEmpty() && allDailyPlansEmpty(dailyPlans)) {
                    Toast.makeText(WeeklyGoalActivity.this, "总目标或至少一天的计划不可为空", Toast.LENGTH_SHORT).show();
                    return;
                }
                new SaveWeeklyGoalTask().execute(userId, weekStartDate, totalGoal, dailyPlans);
            }
        });
    }
    // 检查所有日计划是否都为空
    private boolean allDailyPlansEmpty(String[] dailyPlans) {
        for (String plan : dailyPlans) {
            if (!plan.isEmpty()) return false;
        }
        return true;
    }
    private Date getSelectedMonday() {
        int year = dpWeekStart.getYear();
        int month = dpWeekStart.getMonth();
        int day = dpWeekStart.getDayOfMonth();
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month, day);
        setToMonday(calendar); // 调整到当周周一
        return calendar.getTime();
    }
    private void setToMonday(Calendar calendar) {
        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
        if (dayOfWeek != Calendar.MONDAY) {
            calendar.add(Calendar.DAY_OF_WEEK, - (dayOfWeek - Calendar.MONDAY));
        }
    }
    private class SaveWeeklyGoalTask extends AsyncTask<Object, Void, Boolean> {
        private String errorMessage = "";
        @Override
        protected Boolean doInBackground(Object... params) {
            String userId = (String) params[0];
            Date weekStartDate = (Date) params[1];
            String totalGoal = (String) params[2];
            String[] dailyPlans = (String[]) params[3];
            try (Connection conn = DBConnection.getConnection()) {
                // 1. 保存周目标
                WeeklyGoal weeklyGoal = new WeeklyGoal();
                weeklyGoal.setUserId(userId);
                weeklyGoal.setWeekStartDate(new java.sql.Date(weekStartDate.getTime()));
                weeklyGoal.setTotalGoal(totalGoal);
                String goalSql = "INSERT INTO weekly_goals (user_id, week_start_date, total_goal) VALUES (?, ?, ?)";
                try (PreparedStatement goalStmt = conn.prepareStatement(goalSql, PreparedStatement.RETURN_GENERATED_KEYS)) {
                    goalStmt.setString(1, weeklyGoal.getUserId());
                    goalStmt.setDate(2, weeklyGoal.getWeekStartDate());
                    goalStmt.setString(3, weeklyGoal.getTotalGoal());
                    goalStmt.executeUpdate();
                    // 获取生成的goal_id
                    int goalId = 0;
                    try (ResultSet rs = goalStmt.getGeneratedKeys()) {
                        if (rs.next()) goalId = rs.getInt(1);
                    }
                    // 2. 保存日计划(周一到周五)
                    Calendar calendar = Calendar.getInstance();
                    calendar.setTime(weekStartDate);
                    for (int i = 0; i < 5; i++) {
                        String planContent = dailyPlans[i];
                        if (!planContent.isEmpty()) {
                            DailyPlan dailyPlan = new DailyPlan();
                            dailyPlan.setGoalId(goalId);
                            dailyPlan.setPlanDate(new java.sql.Date(calendar.getTime().getTime()));
                            dailyPlan.setPlanContent(planContent);
                            String planSql = "INSERT INTO daily_plans (goal_id, plan_date, plan_content) VALUES (?, ?, ?)";
                            try (PreparedStatement planStmt = conn.prepareStatement(planSql)) {
                                planStmt.setInt(1, dailyPlan.getGoalId());
                                planStmt.setDate(2, dailyPlan.getPlanDate());
                                planStmt.setString(3, dailyPlan.getPlanContent());
                                planStmt.executeUpdate();
                            }
                        }
                        calendar.add(Calendar.DAY_OF_YEAR, 1); // 下一天
                    }
                    return true;
                }
            } catch (SQLException e) {
                e.printStackTrace();
                // 捕获外键约束等数据库异常
                if (e.getMessage().contains("foreign key constraint")) {
                    errorMessage = "保存失败:周目标不存在,外键约束错误";
                } else {
                    errorMessage = "保存失败:" + e.getMessage();
                }
                return false;
            }
        }
        @Override
        protected void onPostExecute(Boolean success) {
            if (success) {
                Toast.makeText(WeeklyGoalActivity.this, "周目标保存成功", Toast.LENGTH_SHORT).show();
                finish(); // 保存后返回上一界面
            } else {
                Toast.makeText(WeeklyGoalActivity.this, errorMessage, Toast.LENGTH_SHORT).show();
            }
        }
    }
}
界面:
```plaintext
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center_horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="设定每周学习目标"
            android:textSize="24sp"
            android:textColor="@android:color/black"
            android:layout_marginBottom="24dp" />
        <!-- 周开始日期选择(固定为周一) -->
        <DatePicker
            android:id="@+id/dp_week_start"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:datePickerMode="calendar"
            android:layout_marginBottom="24dp" />
        <!-- 本周总目标 -->
        <EditText
            android:id="@+id/et_total_goal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="本周总目标"
            android:padding="12dp"
            android:background="@drawable/border_edittext"
            android:textColorHint="@color/darker_gray"
            android:layout_marginBottom="16dp" />
        <!-- 周一到周五计划 -->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="工作日学习计划"
            android:textSize="16sp"
            android:textColor="@color/darker_gray"
            android:layout_marginBottom="8dp" />
        <EditText
            android:id="@+id/et_monday_plan"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="周一计划"
            android:padding="12dp"
            android:background="@drawable/border_edittext"
            android:textColorHint="@color/darker_gray"
            android:layout_marginBottom="8dp" />
        <EditText
            android:id="@+id/et_tuesday_plan"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="周二计划"
            android:padding="12dp"
            android:background="@drawable/border_edittext"
            android:textColorHint="@color/darker_gray"
            android:layout_marginBottom="8dp" />
        <EditText
            android:id="@+id/et_wednesday_plan"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="周三计划"
            android:padding="12dp"
            android:background="@drawable/border_edittext"
            android:textColorHint="@color/darker_gray"
            android:layout_marginBottom="8dp" />
        <EditText
            android:id="@+id/et_thursday_plan"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="周四计划"
            android:padding="12dp"
            android:background="@drawable/border_edittext"
            android:textColorHint="@color/darker_gray"
            android:layout_marginBottom="8dp" />
        <EditText
            android:id="@+id/et_friday_plan"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="周五计划"
            android:padding="12dp"
            android:background="@drawable/border_edittext"
            android:textColorHint="@color/darker_gray"
            android:layout_marginBottom="24dp" />
        <!-- 保存按钮 -->
        <Button
            android:id="@+id/btn_save_goal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="保存周目标"
            android:background="@color/colorPrimary"
            android:textColor="@android:color/white"
            android:padding="12dp" />
    </LinearLayout>
</ScrollView>
查看每周目标功能:
```plaintext
package com.example.learningrecordapp.activities;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.learningrecordapp.R;
import com.example.learningrecordapp.entities.DailyPlan;
import com.example.learningrecordapp.entities.WeeklyGoal;
import com.example.learningrecordapp.utils.DBConnection;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
public class ViewWeeklyGoalActivity extends AppCompatActivity {
    private DatePicker dpWeekStart;
    private Button btnViewGoal;
    private TextView tvWeekStartDate, tvTotalGoal;
    private ListView lvDailyPlans;
    private SharedPreferences sharedPreferences;
    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_weekly_goal);
        initViews();
        sharedPreferences = getSharedPreferences("user_info", MODE_PRIVATE);
        setupButtonClickListener();
    }
    private void initViews() {
        dpWeekStart = findViewById(R.id.dp_week_start);
        btnViewGoal = findViewById(R.id.btn_view_goal);
        tvWeekStartDate = findViewById(R.id.tv_week_start_date);
        tvTotalGoal = findViewById(R.id.tv_total_goal);
        lvDailyPlans = findViewById(R.id.lv_daily_plans);
    }
    private void setupButtonClickListener() {
        btnViewGoal.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int year = dpWeekStart.getYear();
                int month = dpWeekStart.getMonth();
                int day = dpWeekStart.getDayOfMonth();
                Calendar calendar = Calendar.getInstance();
                calendar.set(year, month, day);
                Date selectedDate = calendar.getTime();
                new FetchWeeklyGoalTask().execute(sharedPreferences.getString("user_id", ""), selectedDate);
            }
        });
    }
    private class FetchWeeklyGoalTask extends AsyncTask<Object, Void, WeeklyGoal> {
        private String errorMessage = "";
        private List<DailyPlan> dailyPlans = new ArrayList<>();
        @Override
        protected WeeklyGoal doInBackground(Object... params) {
            String userId = (String) params[0];
            Date selectedDate = (Date) params[1];
            WeeklyGoal weeklyGoal = null;
            try (Connection conn = DBConnection.getConnection()) {
                // 查询指定周的周目标
                String goalSql = "SELECT * FROM weekly_goals WHERE user_id = ? AND week_start_date = ?";
                try (PreparedStatement goalStmt = conn.prepareStatement(goalSql)) {
                    goalStmt.setString(1, userId);
                    goalStmt.setDate(2, new java.sql.Date(selectedDate.getTime()));
                    ResultSet goalRs = goalStmt.executeQuery();
                    if (goalRs.next()) {
                        weeklyGoal = new WeeklyGoal();
                        weeklyGoal.setGoalId(goalRs.getInt("goal_id"));
                        weeklyGoal.setUserId(goalRs.getString("user_id"));
                        weeklyGoal.setWeekStartDate(goalRs.getDate("week_start_date"));
                        weeklyGoal.setTotalGoal(goalRs.getString("total_goal"));
                        // 查询该周目标下的每日计划
                        String planSql = "SELECT * FROM daily_plans WHERE goal_id = ?";
                        try (PreparedStatement planStmt = conn.prepareStatement(planSql)) {
                            planStmt.setInt(1, weeklyGoal.getGoalId());
                            ResultSet planRs = planStmt.executeQuery();
                            while (planRs.next()) {
                                DailyPlan dailyPlan = new DailyPlan();
                                dailyPlan.setPlanId(planRs.getInt("plan_id"));
                                dailyPlan.setGoalId(planRs.getInt("goal_id"));
                                dailyPlan.setPlanDate(planRs.getDate("plan_date"));
                                dailyPlan.setPlanContent(planRs.getString("plan_content"));
                                dailyPlans.add(dailyPlan);
                            }
                        }
                    }
                }
            } catch (SQLException e) {
                e.printStackTrace();
                errorMessage = "获取周目标失败:" + e.getMessage();
            }
            return weeklyGoal;
        }
        @Override
        protected void onPostExecute(WeeklyGoal weeklyGoal) {
            if (weeklyGoal != null) {
                tvWeekStartDate.setText("周开始日期: " + dateFormat.format(weeklyGoal.getWeekStartDate()));
                tvTotalGoal.setText("总目标: " + weeklyGoal.getTotalGoal());
                List<String> planItems = new ArrayList<>();
                for (DailyPlan dailyPlan : dailyPlans) {
                    planItems.add(dateFormat.format(dailyPlan.getPlanDate()) + ": " + dailyPlan.getPlanContent());
                }
                ArrayAdapter<String> adapter = new ArrayAdapter<>(ViewWeeklyGoalActivity.this,
                        android.R.layout.simple_list_item_1, planItems);
                lvDailyPlans.setAdapter(adapter);
            } else {
                Toast.makeText(ViewWeeklyGoalActivity.this, errorMessage.isEmpty() ? "未找到该周的周目标" : errorMessage, Toast.LENGTH_SHORT).show();
            }
        }
    }
}
界面:
```plaintext
<?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">
    <DatePicker
        android:id="@+id/dp_week_start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" />
    <Button
        android:id="@+id/btn_view_goal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="查看目标"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="16dp" />
    <TextView
        android:id="@+id/tv_week_start_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:textStyle="bold"
        android:layout_marginTop="16dp" />
    <TextView
        android:id="@+id/tv_total_goal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:layout_marginTop="8dp" />
    <ListView
        android:id="@+id/lv_daily_plans"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp" />
</LinearLayout>
每日总结功能:
```plaintext
package com.example.learningrecordapp.activities;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.CalendarView;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.learningrecordapp.R;
import com.example.learningrecordapp.entities.DailySummary;
import com.example.learningrecordapp.utils.DBConnection;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DailySummaryActivity extends AppCompatActivity {
    private CalendarView calendarView;
    private EditText etSummaryContent, etBlogUrl;
    private Button btnAddSummary, btnViewSummary;
    private String selectedDate;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_daily_summary);
        initViews();
        setupCalendarListener();
        setupButtonListeners();
    }
    private void initViews() {
        calendarView = findViewById(R.id.calendarView);
        etSummaryContent = findViewById(R.id.et_summary_content);
        etBlogUrl = findViewById(R.id.et_blog_url);
        btnAddSummary = findViewById(R.id.btn_add_summary);
        btnViewSummary = findViewById(R.id.btn_view_summary);
    }
    private void setupCalendarListener() {
        calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
            @Override
            public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) {
                Calendar calendar = Calendar.getInstance();
                calendar.set(year, month, dayOfMonth);
                Date date = calendar.getTime();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                selectedDate = sdf.format(date);
            }
        });
    }
    private void setupButtonListeners() {
        btnAddSummary.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (TextUtils.isEmpty(selectedDate)) {
                    Toast.makeText(DailySummaryActivity.this, "请先选择日期", Toast.LENGTH_SHORT).show();
                    return;
                }
                String summaryContent = etSummaryContent.getText().toString().trim();
                String blogUrl = etBlogUrl.getText().toString().trim();
                if (TextUtils.isEmpty(summaryContent)) {
                    Toast.makeText(DailySummaryActivity.this, "请输入总结内容", Toast.LENGTH_SHORT).show();
                    return;
                }
                new SaveDailySummaryTask().execute(selectedDate, summaryContent, blogUrl);
            }
        });
        btnViewSummary.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (TextUtils.isEmpty(selectedDate)) {
                    Toast.makeText(DailySummaryActivity.this, "请先选择日期", Toast.LENGTH_SHORT).show();
                    return;
                }
                new FetchDailySummaryTask().execute(selectedDate);
            }
        });
    }
    private class SaveDailySummaryTask extends AsyncTask<String, Void, Boolean> {
        private String errorMessage = "";
        @Override
        protected Boolean doInBackground(String... params) {
            String createDateStr = params[0];
            String summaryContent = params[1];
            String blogUrl = params[2];
            try (Connection conn = DBConnection.getConnection()) {
                String sql = "INSERT INTO daily_summaries (create_date, summary_content, blog_url) VALUES (?, ?, ?)";
                try (PreparedStatement stmt = conn.prepareStatement(sql)) {
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    Date date = sdf.parse(createDateStr);
                    Timestamp timestamp = new Timestamp(date.getTime()); // 将 Date 转换为 Timestamp
                    stmt.setTimestamp(1, timestamp); // 使用 setTimestamp 方法
                    stmt.setString(2, summaryContent);
                    stmt.setString(3, blogUrl);
                    stmt.executeUpdate();
                    return true;
                }
            } catch (Exception e) {
                e.printStackTrace();
                errorMessage = "保存失败:" + e.getMessage();
                return false;
            }
        }
        @Override
        protected void onPostExecute(Boolean success) {
            if (success) {
                Toast.makeText(DailySummaryActivity.this, "总结保存成功", Toast.LENGTH_SHORT).show();
                etSummaryContent.setText("");
                etBlogUrl.setText("");
            } else {
                Toast.makeText(DailySummaryActivity.this, errorMessage, Toast.LENGTH_SHORT).show();
            }
        }
    }
    private class FetchDailySummaryTask extends AsyncTask<String, Void, DailySummary> {
        private String errorMessage = "";
        @Override
        protected DailySummary doInBackground(String... params) {
            String createDateStr = params[0];
            try (Connection conn = DBConnection.getConnection()) {
                String sql = "SELECT * FROM daily_summaries WHERE create_date = ?";
                try (PreparedStatement stmt = conn.prepareStatement(sql)) {
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    Date date = sdf.parse(createDateStr);
                    Timestamp timestamp = new Timestamp(date.getTime()); // 将 Date 转换为 Timestamp
                    stmt.setTimestamp(1, timestamp); // 使用 setTimestamp 方法
                    ResultSet rs = stmt.executeQuery();
                    if (rs.next()) {
                        DailySummary summary = new DailySummary();
                        summary.setSummaryId(rs.getInt("summary_id"));
                        summary.setCreateDate(rs.getTimestamp("create_date")); // 获取 Timestamp 类型
                        summary.setSummaryContent(rs.getString("summary_content"));
                        summary.setBlogUrl(rs.getString("blog_url"));
                        return summary;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                errorMessage = "获取总结失败:" + e.getMessage();
            }
            return null;
        }
        @Override
        protected void onPostExecute(DailySummary summary) {
            if (summary != null) {
                etSummaryContent.setText(summary.getSummaryContent());
                etBlogUrl.setText(summary.getBlogUrl());
                if (!TextUtils.isEmpty(summary.getBlogUrl())) {
                    etBlogUrl.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(summary.getBlogUrl()));
                            startActivity(intent);
                        }
                    });
                }
            } else {
                Toast.makeText(DailySummaryActivity.this, errorMessage.isEmpty() ? "未找到该日的总结" : errorMessage, Toast.LENGTH_SHORT).show();
                etSummaryContent.setText("");
                etBlogUrl.setText("");
            }
        }
    }
}
界面:
```plaintext
<?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">
    <CalendarView
        android:id="@+id/calendarView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <ListView
        android:id="@+id/lv_daily_summaries"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp" />
</LinearLayout>
每日编程记录活动:
```plaintext
package com.example.learningrecordapp.activities;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CalendarView;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.learningrecordapp.R;
import com.example.learningrecordapp.entities.DailyProgrammingRecord;
import com.example.learningrecordapp.utils.DBConnection;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DailyProgrammingActivity extends AppCompatActivity {
    private EditText etPlanTime, etRequirementAnalysis, etDesignDocument, etCodeSpecification, etSpecificDesign, etSpecificCoding, etTesting, etWorkload, etSummary;
    private Button btnSave, btnView;
    private CalendarView calendarView;
    private SharedPreferences sharedPreferences;
    private String selectedDate;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_daily_programming);
        etPlanTime = findViewById(R.id.et_plan_time);
        etRequirementAnalysis = findViewById(R.id.et_requirement_analysis);
        etDesignDocument = findViewById(R.id.et_design_document);
        etCodeSpecification = findViewById(R.id.et_code_specification);
        etSpecificDesign = findViewById(R.id.et_specific_design);
        etSpecificCoding = findViewById(R.id.et_specific_coding);
        etTesting = findViewById(R.id.et_testing);
        etWorkload = findViewById(R.id.et_workload);
        etSummary = findViewById(R.id.et_summary);
        btnSave = findViewById(R.id.btn_save);
        btnView = findViewById(R.id.btn_view);
        calendarView = findViewById(R.id.calendarView);
        sharedPreferences = getSharedPreferences("user_info", MODE_PRIVATE);
        calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
            @Override
            public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) {
                selectedDate = year + "-" + (month + 1) + "-" + dayOfMonth;
            }
        });
        btnSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String planTime = etPlanTime.getText().toString();
                String requirementAnalysis = etRequirementAnalysis.getText().toString();
                String designDocument = etDesignDocument.getText().toString();
                String codeSpecification = etCodeSpecification.getText().toString();
                String specificDesign = etSpecificDesign.getText().toString();
                String specificCoding = etSpecificCoding.getText().toString();
                String testing = etTesting.getText().toString();
                String workload = etWorkload.getText().toString();
                String summary = etSummary.getText().toString();
                if (planTime.isEmpty() || requirementAnalysis.isEmpty() || designDocument.isEmpty() || codeSpecification.isEmpty() || specificDesign.isEmpty() || specificCoding.isEmpty() || testing.isEmpty() || workload.isEmpty() || summary.isEmpty()) {
                    Toast.makeText(DailyProgrammingActivity.this, "请填写所有信息", Toast.LENGTH_SHORT).show();
                    return;
                }
                if (selectedDate == null) {
                    Toast.makeText(DailyProgrammingActivity.this, "请选择日期", Toast.LENGTH_SHORT).show();
                    return;
                }
                String userId = sharedPreferences.getString("user_id", "");
                try {
                    Date recordDate = new SimpleDateFormat("yyyy-MM-dd").parse(selectedDate);
                    DailyProgrammingRecord record = new DailyProgrammingRecord(0, userId, recordDate, planTime, requirementAnalysis, designDocument, codeSpecification, specificDesign, specificCoding, testing, workload, summary);
                    new SaveDailyProgrammingRecordTask().execute(record);
                } catch (Exception e) {
                    e.printStackTrace();
                    Toast.makeText(DailyProgrammingActivity.this, "日期格式错误", Toast.LENGTH_SHORT).show();
                }
            }
        });
        btnView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (selectedDate == null) {
                    Toast.makeText(DailyProgrammingActivity.this, "请选择日期", Toast.LENGTH_SHORT).show();
                    return;
                }
                String userId = sharedPreferences.getString("user_id", "");
                new FetchDailyProgrammingRecordTask().execute(userId, selectedDate);
            }
        });
    }
    private class SaveDailyProgrammingRecordTask extends AsyncTask<DailyProgrammingRecord, Void, Boolean> {
        @Override
        protected Boolean doInBackground(DailyProgrammingRecord... records) {
            DailyProgrammingRecord record = records[0];
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            try (Connection conn = DBConnection.getConnection()) {
                String sql = "INSERT INTO daily_programming_records (user_id, record_date, plan_time, requirement_analysis_time, design_document_time, code_specification_time, specific_design_time, specific_coding_time, testing_time, workload_calculation, post_summary) VALUES (?,?,?,?,?,?,?,?,?,?,?)";
                try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
                    pstmt.setString(1, record.getUserId());
                    pstmt.setString(2, sdf.format(record.getRecordDate()));
                    pstmt.setString(3, record.getPlanTime());
                    pstmt.setString(4, record.getRequirementAnalysisTime());
                    pstmt.setString(5, record.getDesignDocumentTime());
                    pstmt.setString(6, record.getCodeSpecificationTime());
                    pstmt.setString(7, record.getSpecificDesignTime());
                    pstmt.setString(8, record.getSpecificCodingTime());
                    pstmt.setString(9, record.getTestingTime());
                    pstmt.setString(10, record.getWorkloadCalculation());
                    pstmt.setString(11, record.getPostSummary());
                    pstmt.executeUpdate();
                    return true;
                }
            } catch (SQLException e) {
                e.printStackTrace();
                return false;
            }
        }
        @Override
        protected void onPostExecute(Boolean result) {
            if (result) {
                Toast.makeText(DailyProgrammingActivity.this, "每日编程记录保存成功", Toast.LENGTH_SHORT).show();
                clearFields();
            } else {
                Toast.makeText(DailyProgrammingActivity.this, "保存失败,请稍后重试", Toast.LENGTH_SHORT).show();
            }
        }
    }
    private class FetchDailyProgrammingRecordTask extends AsyncTask<String, Void, DailyProgrammingRecord> {
        @Override
        protected DailyProgrammingRecord doInBackground(String... params) {
            String userId = params[0];
            String recordDate = params[1];
            try (Connection conn = DBConnection.getConnection()) {
                String sql = "SELECT * FROM daily_programming_records WHERE user_id = ? AND record_date = ?";
                try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
                    pstmt.setString(1, userId);
                    pstmt.setString(2, recordDate);
                    ResultSet rs = pstmt.executeQuery();
                    if (rs.next()) {
                        int id = rs.getInt("id");
                        Date date = new SimpleDateFormat("yyyy-MM-dd").parse(rs.getString("record_date"));
                        String planTime = rs.getString("plan_time");
                        String requirementAnalysis = rs.getString("requirement_analysis_time");
                        String designDocument = rs.getString("design_document_time");
                        String codeSpecification = rs.getString("code_specification_time");
                        String specificDesign = rs.getString("specific_design_time");
                        String specificCoding = rs.getString("specific_coding_time");
                        String testing = rs.getString("testing_time");
                        String workload = rs.getString("workload_calculation");
                        String summary = rs.getString("post_summary");
                        return new DailyProgrammingRecord(id, userId, date, planTime, requirementAnalysis, designDocument, codeSpecification, specificDesign, specificCoding, testing, workload, summary);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
        @Override
        protected void onPostExecute(DailyProgrammingRecord record) {
            if (record != null) {
                etPlanTime.setText(record.getPlanTime());
                etRequirementAnalysis.setText(record.getRequirementAnalysisTime());
                etDesignDocument.setText(record.getDesignDocumentTime());
                etCodeSpecification.setText(record.getCodeSpecificationTime());
                etSpecificDesign.setText(record.getSpecificDesignTime());
                etSpecificCoding.setText(record.getSpecificCodingTime());
                etTesting.setText(record.getTestingTime());
                etWorkload.setText(record.getWorkloadCalculation());
                etSummary.setText(record.getPostSummary());
            } else {
                Toast.makeText(DailyProgrammingActivity.this, "未找到该日期的记录", Toast.LENGTH_SHORT).show();
                clearFields();
            }
        }
    }
    private void clearFields() {
        etPlanTime.setText("");
        etRequirementAnalysis.setText("");
        etDesignDocument.setText("");
        etCodeSpecification.setText("");
        etSpecificDesign.setText("");
        etSpecificCoding.setText("");
        etTesting.setText("");
        etWorkload.setText("");
        etSummary.setText("");
    }
}
界面:
```plaintext
<?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">
    <CalendarView
        android:id="@+id/calendarView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:fillViewport="true">
        <TableLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:stretchColumns="*"
            android:background="@android:color/white"
            android:padding="8dp"
            android:elevation="4dp">
            <TableRow
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@android:color/darker_gray"
                android:padding="8dp">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="项目"
                    android:textColor="@android:color/white"
                    android:textStyle="bold" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="时间/内容"
                    android:textColor="@android:color/white"
                    android:textStyle="bold" />
            </TableRow>
            <TableRow
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@android:color/white"
                android:padding="4dp">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="计划时间"
                    android:paddingRight="8dp" />
                <EditText
                    android:id="@+id/et_plan_time"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:background="@drawable/edit_text_border"
                    android:padding="4dp" />
            </TableRow>
            <TableRow
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@android:color/white"
                android:padding="4dp">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="需求分析时间"
                    android:paddingRight="8dp" />
                <EditText
                    android:id="@+id/et_requirement_analysis"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:background="@drawable/edit_text_border"
                    android:padding="4dp" />
            </TableRow>
            <TableRow
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@android:color/white"
                android:padding="4dp">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="设计文档时间"
                    android:paddingRight="8dp" />
                <EditText
                    android:id="@+id/et_design_document"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:background="@drawable/edit_text_border"
                    android:padding="4dp" />
            </TableRow>
            <TableRow
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@android:color/white"
                android:padding="4dp">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="代码规范时间"
                    android:paddingRight="8dp" />
                <EditText
                    android:id="@+id/et_code_specification"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:background="@drawable/edit_text_border"
                    android:padding="4dp" />
            </TableRow>
            <TableRow
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@android:color/white"
                android:padding="4dp">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="详细设计时间"
                    android:paddingRight="8dp" />
                <EditText
                    android:id="@+id/et_specific_design"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:background="@drawable/edit_text_border"
                    android:padding="4dp" />
            </TableRow>
            <TableRow
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@android:color/white"
                android:padding="4dp">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="详细编码时间"
                    android:paddingRight="8dp" />
                <EditText
                    android:id="@+id/et_specific_coding"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:background="@drawable/edit_text_border"
                    android:padding="4dp" />
            </TableRow>
            <TableRow
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@android:color/white"
                android:padding="4dp">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="测试时间"
                    android:paddingRight="8dp" />
                <EditText
                    android:id="@+id/et_testing"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:background="@drawable/edit_text_border"
                    android:padding="4dp" />
            </TableRow>
            <TableRow
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@android:color/white"
                android:padding="4dp">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="工作量计算"
                    android:paddingRight="8dp" />
                <EditText
                    android:id="@+id/et_workload"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:background="@drawable/edit_text_border"
                    android:padding="4dp" />
            </TableRow>
            <TableRow
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@android:color/white"
                android:padding="4dp">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="总结"
                    android:paddingRight="8dp" />
                <EditText
                    android:id="@+id/et_summary"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:background="@drawable/edit_text_border"
                    android:padding="4dp" />
            </TableRow>
        </TableLayout>
    </ScrollView>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center"
        android:layout_marginTop="16dp">
        <Button
            android:id="@+id/btn_save"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="保存"
            android:layout_marginRight="8dp" />
        <Button
            android:id="@+id/btn_view"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="查看记录"
            android:layout_marginLeft="8dp" />
    </LinearLayout>
</LinearLayout>
以上是主要功能的代码。
整体架构:

 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号