第一次结对作业
今天兆迪实现了后端代码的雏形,我将后端代码与前端进行连接以及简单的测试
package com.example.metro_info_front_end; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import com.example.metro_info_front_end.DataModel.MetroStation; import com.example.metro_info_front_end.DataModel.MetroSystem; import com.example.metro_info_front_end.api.ApiService; import com.example.metro_info_front_end.api.RetrofitClient; import java.util.ArrayList; import java.util.List; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; public class MainActivity extends AppCompatActivity { private LinearLayout llOptimalRoute; // 最优路线查询界面布局 private LinearLayout llMetroLine; // 地铁线路查询界面布局 private AutoCompleteTextView systemName1; private AutoCompleteTextView systemName2; private AutoCompleteTextView lineName; private AutoCompleteTextView departureStation; private AutoCompleteTextView destinationStation; private ApiService apiService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取布局中的线性布局 llOptimalRoute = findViewById(R.id.LL1); llMetroLine = findViewById(R.id.LL2); // 获取按钮 Button btnOptimalRoute = findViewById(R.id.btn1); Button btnMetroLine = findViewById(R.id.btn2); // 设置按钮点击事件监听器 btnOptimalRoute.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 显示最优路线查询界面,隐藏地铁线路查询界面 llOptimalRoute.setVisibility(View.VISIBLE); llMetroLine.setVisibility(View.GONE); } }); btnMetroLine.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 显示地铁线路查询界面,隐藏最优路线查询界面 llOptimalRoute.setVisibility(View.GONE); llMetroLine.setVisibility(View.VISIBLE); } }); // 获取 AutoCompleteTextView 控件 systemName1 = findViewById(R.id.SystemName1); systemName2 = findViewById(R.id.SystemName2); lineName = findViewById(R.id.LineName); departureStation = findViewById(R.id.DepartureStation); destinationStation = findViewById(R.id.DestinationStation); // 设置自动完成功能适配器 //ArrayAdapter<String> cityAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, getCityData()); ArrayAdapter<String> lineAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, getLineData()); ArrayAdapter<String> stationAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, getStationData()); //systemName1.setAdapter(cityAdapter); //systemName2.setAdapter(cityAdapter); lineName.setAdapter(lineAdapter); departureStation.setAdapter(stationAdapter); destinationStation.setAdapter(stationAdapter); // 创建 ApiService 实例 apiService = RetrofitClient.getRetrofitInstance().create(ApiService.class); // 设置查询按钮点击事件监听器 Button query1 = findViewById(R.id.query1); Button query2 = findViewById(R.id.query2); //模拟获取城市数据 fetchCityData(); query1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 获取用户输入的城市、出发站点和目标站点信息 String city1 = systemName1.getText().toString(); String departure = departureStation.getText().toString(); String destination = destinationStation.getText().toString(); Log.d("MainActivity", "发起最优路线查询:City1 = " + city1 + ", Departure = " + departure + ", Destination = " + destination); // 发起网络请求获取系统编码 Call<String> systemCodeCall = apiService.findSystemCodeBySystemName(city1); systemCodeCall.enqueue(new Callback<String>() { @Override public void onResponse(Call<String> call, Response<String> response) { if (response.isSuccessful() && response.body() != null) { String systemCode = response.body(); Log.d("MainActivity", "获取系统编码成功: " + systemCode); // 使用获取的系统编码发起最优路线查询 Call<List<MetroStation>> callShortestPath = apiService.searchShortestPath(systemCode, departure, destination); callShortestPath.enqueue(new Callback<List<MetroStation>>() { @Override public void onResponse(Call<List<MetroStation>> call, Response<List<MetroStation>> response) { if (response.isSuccessful() && response.body() != null) { Log.d("MainActivity", "最优路线查询成功"); handleResponse(response); } else { Log.e("MainActivity", "最优路线查询失败"); showToast("查询失败"); } } @Override public void onFailure(Call<List<MetroStation>> call, Throwable t) { Log.e("MainActivity", "网络请求失败", t); showToast("网络请求失败"); } }); } else { Log.e("MainActivity", "获取系统编码失败"); showToast("获取系统编码失败"); } } @Override public void onFailure(Call<String> call, Throwable t) { Log.e("MainActivity", "获取系统编码网络请求失败", t); showToast("获取系统编码失败"); } }); } }); query2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 获取用户输入的城市和线路名称信息 String city2 = systemName2.getText().toString(); String lineName1 = lineName.getText().toString(); Log.d("MainActivity", "发起地铁线路查询:City2 = " + city2 + ", LineName = " + lineName1); // 发起网络请求获取查询结果 Call<List<MetroStation>> call = apiService.getStationsBySystemAndLine(city2, lineName1); call.enqueue(new Callback<List<MetroStation>>() { @Override public void onResponse(Call<List<MetroStation>> call, Response<List<MetroStation>> response) { if (response.isSuccessful() && response.body() != null) { Log.d("MainActivity", "地铁线路查询成功"); handleResponse(response); } else { Log.e("MainActivity", "地铁线路查询失败"); showToast("查询失败"); } } @Override public void onFailure(Call<List<MetroStation>> call, Throwable t) { Log.e("MainActivity", "网络请求失败", t); showToast("网络请求失败"); } }); } }); } private void handleResponse(Response<List<MetroStation>> response) { int num=0; int cnt=1; if (response.isSuccessful() && response.body() != null) { List<MetroStation> stations = response.body(); int totalStations = stations.size(); // 处理查询结果,更新界面或显示信息 StringBuilder resultBuilder = new StringBuilder(); for (MetroStation station : stations) { if(cnt!=totalStations && num!=2){ resultBuilder.append(station.getStationName()).append(" ---> "); num++; cnt++; } else if(num==2){ resultBuilder.append(station.getStationName()).append("\n"); cnt++; num = 0; } else if(cnt==totalStations){ resultBuilder.append(station.getStationName()); } } // 显示查询结果 showResult(resultBuilder.toString()); } else { // 提示查询失败 showToast("查询失败"); } } private void showResult(String result) { // 在主线程(UI 线程)中更新 UI runOnUiThread(new Runnable() { @Override public void run() { // 获取显示结果的 TextView 控件 TextView resultTextView = findViewById(R.id.resultTextView); // 将查询结果设置到 TextView 中 resultTextView.setText(result); // 滚动到顶部 resultTextView.scrollTo(0, 0); } }); } private void showToast(String message) { // 显示 Toast 提示消息 Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show(); } // 模拟城市数据 private void fetchCityData() { // 调用后端接口获取所有地铁系统信息(城市数据) Call<List<MetroSystem>> call = apiService.getAllMetroSystems(); call.enqueue(new Callback<List<MetroSystem>>() { @Override public void onResponse(Call<List<MetroSystem>> call, Response<List<MetroSystem>> response) { if (response.isSuccessful() && response.body() != null) { List<MetroSystem> metroSystems = response.body(); // 创建存储城市名称的列表 List<String> cityNames = new ArrayList<>(); // 提取每个地铁系统的城市名称并添加到列表中 for (MetroSystem system : metroSystems) { String cityName = system.getSystemName(); cityNames.add(cityName); } // 将城市名称列表转换为字符串数组 String[] cityArray = cityNames.toArray(new String[0]); // 更新 AutoCompleteTextView 的适配器 ArrayAdapter<String> cityAdapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, cityArray); systemName1.setAdapter(cityAdapter); systemName2.setAdapter(cityAdapter); // 可以根据需要设置其他 AutoCompleteTextView 的适配器,比如线路和站点 } else { showToast("获取城市数据失败"); } } @Override public void onFailure(Call<List<MetroSystem>> call, Throwable t) { Log.e("MainActivity", "获取城市数据失败", t); showToast("网络请求失败"); } }); } private String[] getLineData() {return new String[]{"1号线","2号线","3号线","S1线","1号线八通线","4号线大兴线","5号线","6号线","7号线","8号线","9号线","10号线","11号线"};} private String[] getStationData() {return new String[]{"石家庄站","新百广场", "北国商城","庄窠·铁道大学","人民大学","北海北","中关村","北京西站"};} }