完成学习记录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的开发尚未完成。

浙公网安备 33010602011771号