上篇展示了APP的页面,这篇接上篇进行核心代码的展示
首先是主类:

package com.example.studyapp;

import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
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.studyapp.data.DatabaseHelper;
import com.example.studyapp.data.UserDao;
import com.example.studyapp.data.UserPreferences;
import com.example.studyapp.data.WeeklyGoalDao;
import com.example.studyapp.model.User;
import com.example.studyapp.model.WeeklyGoal;
import com.example.studyapp.util.DatabaseTask;

public class MainActivity extends AppCompatActivity {

    private UserDao userDao;
    private UserPreferences userPreferences;
    private WeeklyGoalDao weeklyGoalDao;
    private TextView welcomeText;
    private Button setGoalButton;
    private Button viewGoalButton;
    private Button addRecordButton;
    private Button viewRecordButton;
    private Button logoutButton;
    private Button exitButton;

    @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;
        });

        // 初始化
        userPreferences = new UserPreferences(this);
        userDao = new UserDao();
        weeklyGoalDao = new WeeklyGoalDao();
        
        // 初始化UI控件
        welcomeText = findViewById(R.id.welcomeText);
        setGoalButton = findViewById(R.id.setGoalButton);
        viewGoalButton = findViewById(R.id.viewGoalButton);
        addRecordButton = findViewById(R.id.addRecordButton);
        viewRecordButton = findViewById(R.id.viewRecordButton);
        logoutButton = findViewById(R.id.logoutButton);
        exitButton = findViewById(R.id.exitButton);

        // 初始化数据库
        initDatabase();
        
        // 设置点击事件
        setGoalButton.setOnClickListener(v -> navigateToSetGoal());
        viewGoalButton.setOnClickListener(v -> navigateToViewGoal());
        addRecordButton.setOnClickListener(v -> navigateToAddRecord());
        viewRecordButton.setOnClickListener(v -> navigateToViewRecord());
        logoutButton.setOnClickListener(v -> logout());
        exitButton.setOnClickListener(v -> exitToLogin());
        
        // 如果用户已登录,显示欢迎信息
        if (userPreferences.isRegistered()) {
            String userName = userPreferences.getUser().getName();
            welcomeText.setText("欢迎您," + userName + "!");
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 用户登录状态检查
        if (userPreferences.isRegistered()) {
            // 更新欢迎信息
            String userName = userPreferences.getUser().getName();
            welcomeText.setText("欢迎您," + userName + "!");
        }
    }

    /**
     * 初始化数据库
     */
    private void initDatabase() {
        DatabaseTask.executeVoidTask(() -> {
            DatabaseHelper.initDatabase();
        }, new DatabaseTask.DatabaseCallback<Boolean>() {
            @Override
            public void onComplete(Boolean result) {
                // 数据库初始化成功后,检查用户是否已注册
                checkUserRegistration();
            }

            @Override
            public void onError(Exception e) {
                Toast.makeText(MainActivity.this, "数据库连接失败: " + e.getMessage(), Toast.LENGTH_LONG).show();
            }
        });
    }

    /**
     * 检查用户是否已注册
     */
    private void checkUserRegistration() {
        if (userPreferences.isRegistered()) {
            // 本地有记录,检查数据库中是否也存在
            final String studentId = userPreferences.getUser().getStudentId();
            
            DatabaseTask.executeTask(() -> userDao.userExists(studentId), 
                new DatabaseTask.DatabaseCallback<Boolean>() {
                    @Override
                    public void onComplete(Boolean exists) {
                        if (!exists) {
                            // 数据库中不存在此用户,跳转到注册页面
                            goToRegister();
                        }
                    }

                    @Override
                    public void onError(Exception e) {
                        // 出错时也跳转到注册页面
                        goToRegister();
                    }
                });
        } else {
            // 本地无记录,直接跳转到注册页面
            goToRegister();
        }
    }

    /**
     * 跳转到注册页面
     */
    private void goToRegister() {
        Intent intent = new Intent(this, RegisterActivity.class);
        startActivity(intent);
        finish(); // 关闭当前活动
    }
    
    /**
     * 注销用户
     */
    private void logout() {
        // 清除本地用户数据
        userPreferences.clearUser();
        
        Toast.makeText(this, "已注销,请重新注册", Toast.LENGTH_SHORT).show();
        
        // 跳转到注册页面
        goToRegister();
    }
    
    /**
     * 退出到登录页面但保留用户信息
     */
    private void exitToLogin() {
        Toast.makeText(this, "退出到登录页面", Toast.LENGTH_SHORT).show();
        
        // 跳转到注册页面但不清除用户数据
        Intent intent = new Intent(this, RegisterActivity.class);
        startActivity(intent);
        finish();
    }
    
    /**
     * 导航到设置周目标页面
     */
    private void navigateToSetGoal() {
        Intent intent = new Intent(this, WeeklyGoalActivity.class);
        startActivity(intent);
    }
    
    /**
     * 导航到查看周目标页面
     */
    private void navigateToViewGoal() {
        Intent intent = new Intent(this, ViewWeeklyGoalActivity.class);
        startActivity(intent);
    }
    
    /**
     * 导航到添加编程记录页面
     */
    private void navigateToAddRecord() {
        Intent intent = new Intent(this, CodingRecordActivity.class);
        startActivity(intent);
    }
    
    /**
     * 导航到查看编程记录页面
     */
    private void navigateToViewRecord() {
        Intent intent = new Intent(this, ViewCodingRecordActivity.class);
        startActivity(intent);
    }
}

然后是注册类:

点击查看代码
```plaintext
package com.example.studyapp;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.example.studyapp.data.UserDao;
import com.example.studyapp.data.UserPreferences;
import com.example.studyapp.model.User;
import com.example.studyapp.util.DatabaseTask;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;

/**
 * 用户注册界面
 */
public class RegisterActivity extends AppCompatActivity {

    private TextInputEditText studentIdInput;
    private TextInputEditText passwordInput;
    private TextInputEditText nameInput;
    private TextInputEditText phoneInput;
    private TextInputEditText classNameInput;
    private TextInputLayout classNameLayout;
    private RadioGroup roleRadioGroup;
    private RadioButton studentRadioButton;
    private RadioButton teacherRadioButton;
    private LinearLayout roleLayout;
    
    private LinearLayout buttonAreaLayout;
    private LinearLayout formAreaLayout;
    private Button loginButton;
    private Button showRegisterButton;
    private Button registerButton;
    private Button backButton;
    
    private UserPreferences userPreferences;
    private UserDao userDao;
    private ProgressDialog progressDialog;
    
    // 是否需要清空输入框
    private boolean shouldClearInputs = false;
    // 当前模式(登录/注册)
    private boolean isLoginMode = true;

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

        // 检查是否需要清空输入框(从退出按钮进入)
        if (getIntent() != null) {
            shouldClearInputs = getIntent().getBooleanExtra("CLEAR_INPUTS", false);
        }

        // 初始化UI组件
        buttonAreaLayout = findViewById(R.id.buttonAreaLayout);
        formAreaLayout = findViewById(R.id.formAreaLayout);
        loginButton = findViewById(R.id.loginButton);
        showRegisterButton = findViewById(R.id.showRegisterButton);
        backButton = findViewById(R.id.backButton);
        registerButton = findViewById(R.id.registerButton);
        
        studentIdInput = findViewById(R.id.studentIdInput);
        passwordInput = findViewById(R.id.passwordInput);
        nameInput = findViewById(R.id.nameInput);
        phoneInput = findViewById(R.id.phoneInput);
        classNameInput = findViewById(R.id.classNameInput);
        classNameLayout = (TextInputLayout) classNameInput.getParent().getParent();
        roleRadioGroup = findViewById(R.id.roleRadioGroup);
        studentRadioButton = findViewById(R.id.studentRadioButton);
        teacherRadioButton = findViewById(R.id.teacherRadioButton);
        roleLayout = findViewById(R.id.roleLayout);

        // 初始化用户数据访问
        userPreferences = new UserPreferences(this);
        userDao = new UserDao();
        
        // 确保数据库表结构正确
        userDao.ensureTableExists();
        
        // 初始化进度对话框
        progressDialog = new ProgressDialog(this);
        progressDialog.setTitle("请稍候");
        progressDialog.setMessage("正在处理...");
        progressDialog.setCancelable(false);

        // 设置按钮点击事件
        loginButton.setOnClickListener(v -> showLoginForm());
        showRegisterButton.setOnClickListener(v -> showRegisterForm());
        backButton.setOnClickListener(v -> showButtonArea());
        registerButton.setOnClickListener(v -> validateAndRegister());
        
        // 设置角色切换监听器
        roleRadioGroup.setOnCheckedChangeListener((group, checkedId) -> {
            if (checkedId == R.id.teacherRadioButton) {
                // 教师角色,隐藏班级
                classNameLayout.setVisibility(View.GONE);
            } else {
                // 学生角色,显示班级
                classNameLayout.setVisibility(View.VISIBLE);
            }
        });
        
        // 默认显示按钮区域
        showButtonArea();
        
        // 如果从退出按钮进入,则清空输入框
        if (shouldClearInputs) {
            clearAllInputs();
        }
    }
    
    /**
     * 显示按钮区域(登录/注册选择)
     */
    private void showButtonArea() {
        buttonAreaLayout.setVisibility(View.VISIBLE);
        formAreaLayout.setVisibility(View.GONE);
    }
    
    /**
     * 显示登录表单
     */
    private void showLoginForm() {
        buttonAreaLayout.setVisibility(View.GONE);
        formAreaLayout.setVisibility(View.VISIBLE);
        
        // 设置为登录模式
        isLoginMode = true;
        registerButton.setText("登录");
        
        // 隐藏不需要的字段
        nameInput.setVisibility(View.GONE);
        phoneInput.setVisibility(View.GONE);
        classNameLayout.setVisibility(View.GONE);
        roleLayout.setVisibility(View.GONE);
        
        // 清空输入框
        clearAllInputs();
        
        // 重置错误提示
        studentIdInput.setError(null);
        passwordInput.setError(null);
    }
    
    /**
     * 显示注册表单
     */
    private void showRegisterForm() {
        buttonAreaLayout.setVisibility(View.GONE);
        formAreaLayout.setVisibility(View.VISIBLE);
        
        // 设置为注册模式
        isLoginMode = false;
        registerButton.setText("注册");
        
        // 显示所有字段
        nameInput.setVisibility(View.VISIBLE);
        phoneInput.setVisibility(View.VISIBLE);
        roleLayout.setVisibility(View.VISIBLE);
        
        // 根据当前选中的角色决定是否显示班级
        if (teacherRadioButton.isChecked()) {
            classNameLayout.setVisibility(View.GONE);
        } else {
            classNameLayout.setVisibility(View.VISIBLE);
        }
        
        // 清空输入框
        clearAllInputs();
        
        // 重置错误提示
        studentIdInput.setError(null);
        passwordInput.setError(null);
        nameInput.setError(null);
        phoneInput.setError(null);
        classNameInput.setError(null);
    }
    
    /**
     * 清空所有输入框
     */
    private void clearAllInputs() {
        studentIdInput.setText("");
        passwordInput.setText("");
        nameInput.setText("");
        phoneInput.setText("");
        classNameInput.setText("");
        studentRadioButton.setChecked(true);
        
        // 确保姓名输入框可编辑
        nameInput.setEnabled(true);
    }
    
    /**
     * 填充用户信息到界面
     */
    private void fillUserInfo(User user) {
        studentIdInput.setText(user.getStudentId());
        nameInput.setText(user.getName());
        phoneInput.setText(user.getPhoneNumber());
        classNameInput.setText(user.getClassName());
        
        // 设置角色
        if (user.isTeacher()) {
            teacherRadioButton.setChecked(true);
            // 如果是教师,隐藏班级
            classNameLayout.setVisibility(View.GONE);
        } else {
            studentRadioButton.setChecked(true);
            // 如果是学生,显示班级
            classNameLayout.setVisibility(View.VISIBLE);
        }
        
        // 由于用户姓名不用每次都输入,可以禁用姓名输入框
        nameInput.setEnabled(false);
    }

    /**
     * 验证输入并注册或登录用户
     */
    private void validateAndRegister() {
        final String studentId = studentIdInput.getText().toString().trim();
        final String password = passwordInput.getText().toString().trim();
        
        // 验证工号/学号输入
        if (TextUtils.isEmpty(studentId)) {
            studentIdInput.setError("请输入工号/学号");
            return;
        }
        
        // 验证密码输入
        if (TextUtils.isEmpty(password)) {
            passwordInput.setError("请输入密码");
            return;
        }
        
        // 判断是登录还是注册模式
        if (isLoginMode) {
            // 登录模式,直接查询用户
            loginUser(studentId, password);
        } else {
            // 注册模式,需要完整验证
            registerUser(studentId, password);
        }
    }
    
    /**
     * 登录用户
     */
    private void loginUser(String studentId, String password) {
        // 显示进度对话框
        progressDialog.show();
        
        // 查询数据库中是否存在该用户
        DatabaseTask.executeTask(() -> userDao.findUserByStudentId(studentId),
            new DatabaseTask.DatabaseCallback<User>() {
                @Override
                public void onComplete(User user) {
                    progressDialog.dismiss();
                    
                    if (user != null) {
                        // 用户存在,验证密码
                        if (password.equals(user.getPassword())) {
                            // 密码正确,保存到本地并登录
                            userPreferences.saveUser(user);
                            Toast.makeText(RegisterActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
                            
                            // 根据角色跳转到不同的页面
                            Intent intent;
                            if (user.isTeacher()) {
                                intent = new Intent(RegisterActivity.this, TeacherDashboardActivity.class);
                            } else {
                                intent = new Intent(RegisterActivity.this, MainActivity.class);
                            }
                            startActivity(intent);
                            finish();
                        } else {
                            // 密码错误
                            Toast.makeText(RegisterActivity.this, "密码错误", Toast.LENGTH_SHORT).show();
                            passwordInput.setError("密码错误");
                            passwordInput.requestFocus();
                        }
                    } else {
                        // 用户不存在
                        Toast.makeText(RegisterActivity.this, "该工号/学号未注册,请先注册", Toast.LENGTH_SHORT).show();
                        // 提示注册
                        showRegisterForm();
                        studentIdInput.setText(studentId);
                        passwordInput.setText(password);
                    }
                }

                @Override
                public void onError(Exception e) {
                    progressDialog.dismiss();
                    Toast.makeText(RegisterActivity.this, 
                        "登录失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
    }
    
    /**
     * 注册新用户
     */
    private void registerUser(String studentId, String password) {
        String name = nameInput.getText().toString().trim();
        String phone = phoneInput.getText().toString().trim();
        String className = classNameInput.getText().toString().trim();
        String role = teacherRadioButton.isChecked() ? "teacher" : "student";

        // 验证其他输入
        if (TextUtils.isEmpty(name)) {
            nameInput.setError("请输入姓名");
            return;
        }

        if (TextUtils.isEmpty(phone)) {
            phoneInput.setError("请输入手机号码");
            return;
        }

        // 只有学生角色才需要验证班级
        if (role.equals("student") && TextUtils.isEmpty(className)) {
            classNameInput.setError("请输入班级");
            return;
        }
        
        // 为教师设置默认班级值,表示可以查看所有班级
        if (role.equals("teacher")) {
            className = "ALL";
        }

        // 显示进度对话框
        progressDialog.show();
        
        // 先检查工号/学号是否已被注册
        final String finalName = name;
        final String finalClassName = className;
        DatabaseTask.executeTask(() -> userDao.userExists(studentId), 
            new DatabaseTask.DatabaseCallback<Boolean>() {
                @Override
                public void onComplete(Boolean exists) {
                    if (exists) {
                        // 该工号/学号已注册
                        progressDialog.dismiss();
                        Toast.makeText(RegisterActivity.this, 
                            "该工号/学号已被注册,请直接登录或使用其他工号/学号", Toast.LENGTH_SHORT).show();
                        // 切换到登录模式
                        showLoginForm();
                        studentIdInput.setText(studentId);
                        passwordInput.setText(password);
                    } else {
                        // 工号/学号未注册,可以继续
                        continueRegister(studentId, finalName, phone, finalClassName, role, password);
                    }
                }

                @Override
                public void onError(Exception e) {
                    progressDialog.dismiss();
                    Toast.makeText(RegisterActivity.this, 
                        "检查工号/学号失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
    }
    
    /**
     * 继续注册流程
     */
    private void continueRegister(String studentId, String name, String phone, String className, String role, String password) {
        // 创建用户对象
        final User user = new User(studentId, name, phone, className, role, password);
        
        // 异步保存到数据库
        DatabaseTask.executeTask(() -> userDao.saveUser(user), new DatabaseTask.DatabaseCallback<Boolean>() {
            @Override
            public void onComplete(Boolean result) {
                progressDialog.dismiss();
                
                if (result) {
                    // 数据库保存成功后,也保存到本地
                    userPreferences.saveUser(user);
                    
                    Toast.makeText(RegisterActivity.this, "注册成功", Toast.LENGTH_SHORT).show();
                    
                    // 根据角色跳转到不同的页面
                    Intent intent;
                    if (user.isTeacher()) {
                        intent = new Intent(RegisterActivity.this, TeacherDashboardActivity.class);
                    } else {
                        intent = new Intent(RegisterActivity.this, MainActivity.class);
                    }
                    startActivity(intent);
                    finish();
                } else {
                    Toast.makeText(RegisterActivity.this, "注册失败,请重试", Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onError(Exception e) {
                progressDialog.dismiss();
                Toast.makeText(RegisterActivity.this, "注册失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }
} 
</details>

学生类:
`package com.example.studyapp;

import android.os.Bundle;
import android.os.Environment;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.example.studyapp.data.TeacherDao;
import com.example.studyapp.data.UserPreferences;
import com.example.studyapp.model.User;
import com.example.studyapp.util.DatabaseTask;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;

/**
 * 学生统计报表活动
 */
public class StudentSummaryActivity extends AppCompatActivity {
    
    private UserPreferences userPreferences;
    private User currentUser;
    private TeacherDao teacherDao;
    
    private TextView summaryTitleText;
    private TextView summaryInfoText;
    private TableLayout summaryTableLayout;
    private Button exportButton;
    
    private List<Map<String, Object>> summaryList = new ArrayList<>();
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_student_summary);
        
        // 启用返回按钮
        if (getSupportActionBar() != null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setTitle("学生统计报表");
        }
        
        // 初始化用户信息
        userPreferences = new UserPreferences(this);
        currentUser = userPreferences.getUser();
        
        // 检查是否是教师用户
        if (!currentUser.isTeacher()) {
            Toast.makeText(this, "您不是教师,无法访问此功能", Toast.LENGTH_SHORT).show();
            finish();
            return;
        }
        
        // 初始化DAO
        teacherDao = new TeacherDao();
        
        // 初始化UI组件
        summaryTitleText = findViewById(R.id.summaryTitleText);
        summaryInfoText = findViewById(R.id.summaryInfoText);
        summaryTableLayout = findViewById(R.id.summaryTableLayout);
        exportButton = findViewById(R.id.exportButton);
        
        // 设置导出按钮点击事件
        exportButton.setOnClickListener(v -> exportSummary());
        
        // 生成报表
        generateSummary();
    }
    
    /**
     * 生成统计报表
     */
    private void generateSummary() {
        summaryInfoText.setText("正在生成报表...");
        
        DatabaseTask.executeTask(() -> teacherDao.generateStudentRecordSummary(), 
            new DatabaseTask.DatabaseCallback<List<Map<String, Object>>>() {
                @Override
                public void onComplete(List<Map<String, Object>> result) {
                    summaryList.clear();
                    summaryList.addAll(result);
                    
                    displaySummary();
                }

                @Override
                public void onError(Exception e) {
                    Toast.makeText(StudentSummaryActivity.this, 
                            "生成报表失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
                    summaryInfoText.setText("生成报表失败,请重试");
                }
            });
    }
    
    /**
     * 显示统计报表
     */
    private void displaySummary() {
        // 清除之前的数据行
        int headerRowCount = 1; // 表头行数
        if (summaryTableLayout.getChildCount() > headerRowCount) {
            summaryTableLayout.removeViews(headerRowCount, summaryTableLayout.getChildCount() - headerRowCount);
        }
        
        // 更新统计信息
        summaryInfoText.setText("共统计 " + summaryList.size() + " 名学生");
        
        // 添加数据行
        for (Map<String, Object> summary : summaryList) {
            TableRow row = new TableRow(this);
            row.setPadding(8, 8, 8, 8);
            
            // 序号
            addTextViewToRow(row, String.valueOf(summary.get("serialNumber")));
            
            // 班级
            addTextViewToRow(row, String.valueOf(summary.get("className")));
            
            // 学号
            addTextViewToRow(row, String.valueOf(summary.get("studentId")));
            
            // 姓名
            addTextViewToRow(row, String.valueOf(summary.get("name")));
            
            // 记录次数
            addTextViewToRow(row, String.valueOf(summary.get("recordCount")));
            
            // 最近记录内容
            String content = String.valueOf(summary.get("recentContent"));
            // 内容过长时截取
            if (content.length() > 20) {
                content = content.substring(0, 20) + "...";
            }
            addTextViewToRow(row, content);
            
            // 设置交替行颜色
            if (((int)summary.get("serialNumber")) % 2 == 0) {
                row.setBackgroundColor(0xFFF5F5F5);
            }
            
            summaryTableLayout.addView(row);
        }
    }
    
    /**
     * 向表格行中添加文本单元格
     */
    private void addTextViewToRow(TableRow row, String text) {
        TextView textView = new TextView(this);
        textView.setText(text);
        textView.setPadding(4, 4, 4, 4);
        row.addView(textView);
    }
    
    /**
     * 导出报表到CSV文件
     */
    private void exportSummary() {
        if (summaryList.isEmpty()) {
            Toast.makeText(this, "没有数据可导出", Toast.LENGTH_SHORT).show();
            return;
        }
        
        try {
            File dir = getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());
            String fileName = "学生编程记录统计_" + dateFormat.format(new Date()) + ".csv";
            File file = new File(dir, fileName);
            
            FileWriter writer = new FileWriter(file);
            
            // 写入UTF-8 BOM,确保Excel可以正确显示中文
            writer.write('\ufeff');
            
            // 写入表头
            writer.write("序号,班级,学号,姓名,记录次数,最近记录内容\n");
            
            // 写入数据
            for (Map<String, Object> summary : summaryList) {
                writer.write(summary.get("serialNumber") + ",");
                writer.write("\"" + summary.get("className") + "\",");
                writer.write("\"" + summary.get("studentId") + "\",");
                writer.write("\"" + summary.get("name") + "\",");
                writer.write(summary.get("recordCount") + ",");
                writer.write("\"" + summary.get("recentContent") + "\"\n");
            }
            
            writer.close();
            
            Toast.makeText(this, "报表已导出到:" + file.getAbsolutePath(), Toast.LENGTH_LONG).show();
            
        } catch (IOException e) {
            Toast.makeText(this, "导出失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            onBackPressed();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
} `

教师类:

<details>
<summary>点击查看代码</summary>

package com.example.studyapp;

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

import androidx.appcompat.app.AppCompatActivity;

import com.example.studyapp.data.DatabaseHelper;
import com.example.studyapp.data.UserPreferences;
import com.example.studyapp.model.User;

/**

  • 教师主界面活动
    */
    public class TeacherDashboardActivity extends AppCompatActivity {

    private UserPreferences userPreferences;
    private User currentUser;

    private TextView welcomeTeacherText;
    private Button viewAllRecordsButton;
    private Button searchByKeywordButton;
    private Button generateReportButton;
    private Button logoutButton;
    private Button exitButton;

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

     // 启用返回按钮
     if (getSupportActionBar() != null) {
         getSupportActionBar().setTitle("教师管理平台");
     }
     
     // 初始化用户信息
     userPreferences = new UserPreferences(this);
     currentUser = userPreferences.getUser();
     
     // 检查是否是教师用户
     if (!currentUser.isTeacher()) {
         Toast.makeText(this, "您不是教师,无法访问此功能", Toast.LENGTH_SHORT).show();
         finish();
         return;
     }
     
     // 初始化UI组件
     welcomeTeacherText = findViewById(R.id.welcomeTeacherText);
     viewAllRecordsButton = findViewById(R.id.viewAllRecordsButton);
     searchByKeywordButton = findViewById(R.id.searchByKeywordButton);
     generateReportButton = findViewById(R.id.generateReportButton);
     logoutButton = findViewById(R.id.logoutButton);
     exitButton = findViewById(R.id.exitButton);
     
     // 设置欢迎文本
     welcomeTeacherText.setText("欢迎您," + currentUser.getName() + " 老师");
     
     // 设置按钮点击事件
     viewAllRecordsButton.setOnClickListener(v -> navigateToViewAllRecords());
     searchByKeywordButton.setOnClickListener(v -> navigateToKeywordSearch());
     generateReportButton.setOnClickListener(v -> navigateToStudentSummary());
     logoutButton.setOnClickListener(v -> logout());
     exitButton.setOnClickListener(v -> exitToLogin());
     
     // 初始化数据库
     initDatabase();
    

    }

    /**

    • 初始化数据库
      */
      private void initDatabase() {
      // 异步初始化数据库
      new Thread(() -> {
      try {
      DatabaseHelper.initDatabase();
      } catch (Exception e) {
      runOnUiThread(() -> {
      Toast.makeText(TeacherDashboardActivity.this,
      "数据库初始化失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
      });
      }
      }).start();
      }

    /**

    • 跳转到查看所有记录页面
      */
      private void navigateToViewAllRecords() {
      Intent intent = new Intent(this, ViewAllRecordsActivity.class);
      startActivity(intent);
      }

    /**

    • 跳转到关键词搜索页面
      */
      private void navigateToKeywordSearch() {
      Intent intent = new Intent(this, KeywordSearchActivity.class);
      startActivity(intent);
      }

    /**

    • 跳转到学生统计报表页面
      */
      private void navigateToStudentSummary() {
      Intent intent = new Intent(this, StudentSummaryActivity.class);
      startActivity(intent);
      }

    /**

    • 注销登录
      */
      private void logout() {
      userPreferences.clearUser();
      Toast.makeText(this, "已注销,请重新登录", Toast.LENGTH_SHORT).show();

      // 跳转到注册页面
      Intent intent = new Intent(this, RegisterActivity.class);
      startActivity(intent);
      finish(); // 关闭当前活动
      }

    /**

    • 退出到登录页面但保留用户信息
      */
      private void exitToLogin() {
      Toast.makeText(this, "退出到登录页面", Toast.LENGTH_SHORT).show();

      // 跳转到注册页面但不清除用户数据
      Intent intent = new Intent(this, RegisterActivity.class);
      // 添加标志位表示是从退出按钮进入,需要清空输入框
      intent.putExtra("CLEAR_INPUTS", true);
      startActivity(intent);
      finish();
      }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
    onBackPressed();
    return true;
    }
    return super.onOptionsItemSelected(item);
    }
    }

</details>

其他的具体功能类就不在此展示了,已经提交至gitee码云仓库查看。
posted on 2025-04-14 18:56  -MARIO  阅读(25)  评论(0)    收藏  举报