完成学习记录APP开发

接27号的代码
手机端功能实现代码
AddSummaryMapper

package com.example.study0327;

import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
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.study0327.api.ApiService;
import com.example.study0327.api.RetrofitClient;
import com.example.study0327.modules.DailySummary;

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

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

public class AddSummaryActivity extends AppCompatActivity {
    private EditText etBlogUrl;
    private Button btnAddSummary;
    private int userId; // 从登录后获取

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

        etBlogUrl = findViewById(R.id.etBlogUrl);
        btnAddSummary = findViewById(R.id.btnAddSummary);

        // 获取当前日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
        String currentDate = sdf.format(new Date());

        btnAddSummary.setOnClickListener(v -> {
            DailySummary summary = new DailySummary();
            summary.setUserId(userId);
            summary.setSummaryDate(currentDate);
            summary.setBlogUrl(etBlogUrl.getText().toString());

            ApiService apiService = RetrofitClient.getClient().create(ApiService.class);
            Call<String> call = apiService.addDailySummary(summary);

            call.enqueue(new Callback<String>() {
                @Override
                public void onResponse(Call<String> call, Response<String> response) {
                    if (response.isSuccessful()) {
                        Toast.makeText(AddSummaryActivity.this, response.body(), Toast.LENGTH_SHORT).show();
                        // 添加成功后可以跳转到显示所有总结的页面
                    }
                }

                @Override
                public void onFailure(Call<String> call, Throwable t) {
                    Toast.makeText(AddSummaryActivity.this, "添加总结失败: " + t.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
        });
    }
}

SetGoalActivity

package com.example.study0327;

import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
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.study0327.api.ApiService;
import com.example.study0327.api.RetrofitClient;
import com.example.study0327.modules.WeeklyGoal;

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

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

public class SetGoalActivity extends AppCompatActivity {
    private EditText etGoalContent;
    private Button btnSetGoal;
    private int userId; // 从登录后获取

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

        etGoalContent = findViewById(R.id.etGoalContent);
        btnSetGoal = findViewById(R.id.btnSetGoal);

        // 获取当前周一的日期
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
        String weekStartDate = sdf.format(calendar.getTime());

        btnSetGoal.setOnClickListener(v -> {
            WeeklyGoal goal = new WeeklyGoal();
            goal.setUserId(userId);
            goal.setGoalContent(etGoalContent.getText().toString());
            goal.setWeekStartDate(weekStartDate);

            ApiService apiService = RetrofitClient.getClient().create(ApiService.class);
            Call<String> call = apiService.setWeeklyGoal(goal);

            call.enqueue(new Callback<String>() {
                @Override
                public void onResponse(Call<String> call, Response<String> response) {
                    if (response.isSuccessful()) {
                        Toast.makeText(SetGoalActivity.this, response.body(), Toast.LENGTH_SHORT).show();
                    }
                }

                @Override
                public void onFailure(Call<String> call, Throwable t) {
                    Toast.makeText(SetGoalActivity.this, "设置目标失败: " + t.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
        });
    }
}

MainActivity

package com.example.study0327;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;

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.google.android.material.bottomnavigation.BottomNavigationView;

// 确保导入正确的 R 类
import com.example.study0327.R;
import com.example.study0327.RegisterActivity; // 导入注册活动
import com.example.study0327.SetGoalActivity; // 导入设定目标活动
import com.example.study0327.AddSummaryActivity; // 导入每日总结活动
import com.example.study0327.AddRecordActivity; // 导入编程记录活动

public class MainActivity extends AppCompatActivity {

    @SuppressLint("NonConstantResourceId")
    @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;
        });

        // 在 onCreate 方法中添加
        BottomNavigationView bottomNav = findViewById(R.id.bottomNavigationView);
        bottomNav.setOnNavigationItemSelectedListener(item -> {
            int itemId = item.getItemId();
            if (itemId == R.id.nav_register) {
                // 跳转到用户注册页面
                startActivity(new Intent(MainActivity.this, RegisterActivity.class));
                return true;
            } else if (itemId == R.id.nav_set_goal) {
                // 跳转到设定每周学习目标页面
                startActivity(new Intent(MainActivity.this, SetGoalActivity.class));
                return true;
            } else if (itemId == R.id.nav_add_summary) {
                // 跳转到每日总结页面
                startActivity(new Intent(MainActivity.this, AddSummaryActivity.class));
                return true;
            } else if (itemId == R.id.nav_add_record) {
                // 跳转到每日编程记录页面
                startActivity(new Intent(MainActivity.this, AddRecordActivity.class));
                return true;
            }
            return false;
        });
    }
}

activity_add_summary.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context=".AddSummaryActivity">

    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="添加每日总结"
        android:textSize="24sp"
        android:textStyle="bold"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tvBlogUrl"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="博客链接:"
        android:layout_marginTop="24dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@id/tvTitle" />

    <EditText
        android:id="@+id/etBlogUrl"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:hint="输入博客园文章URL"
        android:inputType="textUri"
        android:minHeight="48dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/tvBlogUrl" />

    <Button
        android:id="@+id/btnAddSummary"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="添加总结"
        android:layout_marginTop="24dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/etBlogUrl" />

</androidx.constraintlayout.widget.ConstraintLayout>

activity_set_goal.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context=".SetGoalActivity">

    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="设置每周目标"
        android:textSize="24sp"
        android:textStyle="bold"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tvWeekStartDate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="本周开始日期:"
        android:layout_marginTop="24dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@id/tvTitle" />

    <TextView
        android:id="@+id/tvDateValue"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="2023-01-01"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@id/tvWeekStartDate" />

    <TextView
        android:id="@+id/tvGoalContent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="目标内容:"
        android:layout_marginTop="16dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@id/tvDateValue" />

    <EditText
        android:id="@+id/etGoalContent"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:hint="输入本周学习目标"
        android:inputType="textMultiLine"
        android:minLines="3"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/tvGoalContent" />

    <Button
        android:id="@+id/btnSetGoal"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="设置目标"
        android:layout_marginTop="24dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/etGoalContent" />

</androidx.constraintlayout.widget.ConstraintLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottomNavigationView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:menu="@menu/bottom_nav_menu" />

    <FrameLayout
        android:id="@+id/fragmentContainer"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@id/bottomNavigationView"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

相关配置代码(AndroidManifest.xml)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Study0327"
        tools:targetApi="31">
        <activity
            android:name=".LoginActivity"
            android:exported="false" />
        <activity
            android:name=".AddRecordActivity"
            android:exported="false" />
        <activity
            android:name=".AddSummaryActivity"
            android:exported="false" />
        <activity
            android:name=".RegisterActivity"
            android:exported="false" />
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

androidStudio代码基本完成,但是还存在有一些问题有待优化解决,整个APP的开发尚未完成。

posted @ 2025-03-28 21:35  haoyinuo  阅读(16)  评论(0)    收藏  举报