android:id=“@+id/tv_date”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:textColor=“@color/white”
android:textSize=“@dimen/sp_14” />
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:gravity=“center_horizontal”
android:orientation=“horizontal”>
<TextView
android:id=“@+id/tv_temp_max”
android:typeface=“sans”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“最高温”
android:textColor=“@color/white”
android:textSize=“@dimen/sp_36” />
<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=" / "
android:textColor=“@color/white”
android:textSize=“@dimen/sp_18” />
<TextView
android:id=“@+id/tv_temp_min”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“最高温”
android:textColor=“@color/white”
android:textSize=“@dimen/sp_18” />
<View
android:layout_width=“match_parent”
android:layout_height=“0.3dp”
android:layout_margin=“@dimen/dp_12”
android:background=“@color/white” />
<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:padding=“@dimen/dp_8”
android:text=“白天天气状况”
android:textColor=“@color/white”
android:textSize=“@dimen/sp_16” />
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:gravity=“center”
android:orientation=“vertical”>
<LinearLayout
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”>
<ImageView
android:id=“@+id/iv_weather_state_d”
android:layout_width=“@dimen/dp_80”
android:layout_height=“@dimen/dp_80”
android:scaleType=“fitXY” />
<TextView
android:id=“@+id/tv_weather_state_d”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:layout_marginLeft=“@dimen/dp_8”
android:gravity=“center”
android:textColor=“@color/white”
android:textSize=“@dimen/sp_16” />
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:orientation=“vertical”>
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”>
<LinearLayout
android:layout_width=“@dimen/dp_0”
android:layout_height=“wrap_content”
android:layout_weight=“1”
android:gravity=“center_vertical”
android:paddingLeft=“@dimen/dp_12”
android:paddingRight=“@dimen/dp_12”>
<ImageView
android:layout_width=“@dimen/dp_24”
android:layout_height=“@dimen/dp_24”
android:src=“@mipmap/icon_wind_360” />
<TextView
android:id=“@+id/tv_wind_360_d”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_marginLeft=“@dimen/dp_20”
android:textColor=“@color/white”
android:textSize=“@dimen/sp_12” />
<LinearLayout
android:layout_width=“@dimen/dp_0”
android:layout_height=“wrap_content”
android:layout_weight=“1”
android:gravity=“center_vertical”
android:paddingLeft=“@dimen/dp_12”
android:paddingRight=“@dimen/dp_12”>
<ImageView
android:layout_width=“@dimen/dp_24”
android:layout_height=“@dimen/dp_24”
android:src=“@mipmap/icon_wind_dir” />
<TextView
android:id=“@+id/tv_wind_dir_d”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_marginLeft=“@dimen/dp_20”
android:textColor=“@color/white”
android:textSize=“@dimen/sp_12” />
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:layout_marginTop=“@dimen/dp_12”>
<LinearLayout
android:layout_width=“@dimen/dp_0”
android:layout_height=“wrap_content”
android:layout_weight=“1”
android:gravity=“center_vertical”
android:paddingLeft=“@dimen/dp_12”
android:paddingRight=“@dimen/dp_12”>
<ImageView
android:layout_width=“@dimen/dp_24”
android:layout_height=“@dimen/dp_24”
android:padding=“@dimen/dp_2”
android:src=“@mipmap/icon_wind_scale” />
<TextView
android:id=“@+id/tv_wind_scale_d”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_marginLeft=“@dimen/dp_20”
android:textColor=“@color/white”
android:textSize=“@dimen/sp_12” />
<LinearLayout
android:layout_width=“@dimen/dp_0”
android:layout_height=“wrap_content”
android:layout_weight=“1”
android:gravity=“center_vertical”
android:paddingLeft=“@dimen/dp_12”
android:paddingRight=“@dimen/dp_12”>
<ImageView
android:layout_width=“@dimen/dp_24”
android:layout_height=“@dimen/dp_24”
android:src=“@mipmap/icon_wind_speed” />
<TextView
android:id=“@+id/tv_wind_speed_d”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_marginLeft=“@dimen/dp_20”
android:textColor=“@color/white”
android:textSize=“@dimen/sp_12” />
<View
android:layout_width=“match_parent”
android:layout_height=“0.3dp”
android:layout_margin=“@dimen/dp_12”
android:background=“@color/white” />
<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:padding=“@dimen/dp_8”
android:text=“夜间天气状况”
android:textColor=“@color/white”
android:textSize=“@dimen/sp_16” />
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:gravity=“center”
android:orientation=“vertical”>
<LinearLayout
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”>
<ImageView
android:id=“@+id/iv_weather_state_n”
android:layout_width=“@dimen/dp_80”
android:layout_height=“@dimen/dp_80”
android:scaleType=“fitXY” />
<TextView
android:id=“@+id/tv_weather_state_n”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:layout_marginLeft=“@dimen/dp_8”
android:gravity=“center”
android:textColor=“@color/white”
android:textSize=“@dimen/sp_16” />
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:orientation=“vertical”>
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”>
<LinearLayout
android:layout_width=“@dimen/dp_0”
android:layout_height=“wrap_content”
android:layout_weight=“1”
android:gravity=“center_vertical”
android:paddingLeft=“@dimen/dp_12”
android:paddingRight=“@dimen/dp_12”>
<ImageView
android:layout_width=“@dimen/dp_24”
android:layout_height=“@dimen/dp_24”
android:src=“@mipmap/icon_wind_360” />
<TextView
android:id=“@+id/tv_wind_360_n”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_marginLeft=“@dimen/dp_20”
android:textColor=“@color/white”
android:textSize=“@dimen/sp_12” />
<LinearLayout
android:layout_width=“@dimen/dp_0”
android:layout_height=“wrap_content”
android:layout_weight=“1”
android:gravity=“center_vertical”
android:paddingLeft=“@dimen/dp_12”
android:paddingRight=“@dimen/dp_12”>
<ImageView
android:layout_width=“@dimen/dp_24”
android:layout_height=“@dimen/dp_24”
android:src=“@mipmap/icon_wind_dir” />
<TextView
android:id=“@+id/tv_wind_dir_n”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_marginLeft=“@dimen/dp_20”
android:textColor=“@color/white”
android:textSize=“@dimen/sp_12” />
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:layout_marginTop=“@dimen/dp_12”>
<LinearLayout
android:layout_width=“@dimen/dp_0”
android:layout_height=“wrap_content”
android:layout_weight=“1”
android:gravity=“center_vertical”
android:paddingLeft=“@dimen/dp_12”
android:paddingRight=“@dimen/dp_12”>
<ImageView
android:layout_width=“@dimen/dp_24”
android:layout_height=“@dimen/dp_24”
android:padding=“@dimen/dp_2”
android:src=“@mipmap/icon_wind_scale” />
<TextView
android:id=“@+id/tv_wind_scale_n”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_marginLeft=“@dimen/dp_20”
android:textColor=“@color/white”
android:textSize=“@dimen/sp_12” />
<LinearLayout
android:layout_width=“@dimen/dp_0”
android:layout_height=“wrap_content”
android:layout_weight=“1”
android:gravity=“center_vertical”
android:paddingLeft=“@dimen/dp_12”
android:paddingRight=“@dimen/dp_12”>
<ImageView
android:layout_width=“@dimen/dp_24”
android:layout_height=“@dimen/dp_24”
android:src=“@mipmap/icon_wind_speed” />
<TextView
android:id=“@+id/tv_wind_speed_n”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_marginLeft=“@dimen/dp_20”
android:textColor=“@color/white”
android:textSize=“@dimen/sp_12” />
<View
android:layout_width=“match_parent”
android:layout_height=“0.3dp”
android:layout_margin=“@dimen/dp_12”
android:background=“@color/white” />
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:orientation=“vertical”
android:padding=“@dimen/dp_12”>
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:gravity=“center_vertical”>
<TextView
android:layout_width=“@dimen/dp_80”
android:layout_height=“wrap_content”
android:gravity=“center_vertical”
android:text=“云量”
android:textColor=“@color/white” />
<ImageView
android:layout_width=“@dimen/dp_20”
android:layout_height=“@dimen/dp_20”
android:src=“@mipmap/icon_cloud” />
<TextView
android:id=“@+id/tv_cloud”
android:layout_width=“@dimen/dp_0”
android:layout_height=“wrap_content”
android:layout_weight=“1”
android:gravity=“center”
android:textColor=“@color/white” />
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:layout_marginTop=“@dimen/dp_4”
android:gravity=“center_vertical”>
<TextView
android:layout_width=“@dimen/dp_80”
android:layout_height=“wrap_content”
android:gravity=“center_vertical”
android:text=“紫外线”
android:textColor=“@color/white” />
<ImageView
android:layout_width=“@dimen/dp_20”
android:layout_height=“@dimen/dp_20”
android:src=“@mipmap/icon_uv_index” />
<TextView
android:id=“@+id/tv_uvIndex”
android:layout_width=“@dimen/dp_0”
android:layout_height=“wrap_content”
android:layout_weight=“1”
android:gravity=“center”
android:textColor=“@color/white” />
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:layout_marginTop=“@dimen/dp_4”
android:gravity=“center_vertical”>
<TextView
android:layout_width=“@dimen/dp_80”
android:layout_height=“20dp”
android:gravity=“center_vertical”
android:text=“能见度”
android:textColor=“@color/white” />
<ImageView
android:layout_width=“@dimen/dp_20”
android:layout_height=“@dimen/dp_20”
android:src=“@mipmap/icon_vis” />
<TextView
android:id=“@+id/tv_vis”
android:layout_width=“@dimen/dp_0”
android:layout_height=“wrap_content”
android:layout_weight=“1”
android:gravity=“center”
android:textColor=“@color/white” />
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:layout_marginTop=“@dimen/dp_4”
android:gravity=“center_vertical”>
<TextView
android:layout_width=“@dimen/dp_80”
android:layout_height=“wrap_content”
android:gravity=“center_vertical”
android:text=“降水量”
android:textColor=“@color/white” />
<ImageView
android:layout_width=“@dimen/dp_20”
android:layout_height=“@dimen/dp_20”
android:src=“@mipmap/icon_precip” />
<TextView
android:id=“@+id/tv_precip”
android:layout_width=“@dimen/dp_0”
android:layout_height=“wrap_content”
android:layout_weight=“1”
android:gravity=“center”
android:textColor=“@color/white” />
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:layout_marginTop=“@dimen/dp_4”
android:gravity=“center_vertical”>
<TextView
android:layout_width=“@dimen/dp_80”
android:layout_height=“wrap_content”
android:gravity=“center_vertical”
android:text=“相对湿度”
android:textColor=“@color/white” />
<ImageView
android:layout_width=“@dimen/dp_20”
android:layout_height=“@dimen/dp_20”
android:src=“@mipmap/icon_humidity” />
<TextView
android:id=“@+id/tv_humidity”
android:layout_width=“@dimen/dp_0”
android:layout_height=“wrap_content”
android:layout_weight=“1”
android:gravity=“center”
android:textColor=“@color/white” />
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:layout_marginTop=“@dimen/dp_4”
android:gravity=“center_vertical”>
<TextView
android:layout_width=“@dimen/dp_80”
android:layout_height=“wrap_content”
android:gravity=“center_vertical”
android:text=“大气压强”
android:textColor=“@color/white” />
<ImageView
android:layout_width=“@dimen/dp_20”
android:layout_height=“@dimen/dp_20”
android:src=“@mipmap/icon_pressure” />
<TextView
android:id=“@+id/tv_pressure”
android:layout_width=“@dimen/dp_0”
android:layout_height=“wrap_content”
android:layout_weight=“1”
android:gravity=“center”
android:textColor=“@color/white” />
</androidx.core.widget.NestedScrollView>
最终效果图如下
下面在app的adapter包下新建一个MoreDailyAdapter,
代码如下:
package com.llw.goodweather.adapter;
import androidx.annotation.Nullable;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.llw.goodweather.R;
import com.llw.goodweather.bean.DailyResponse;
import com.llw.goodweather.utils.DateUtils;
import com.llw.goodweather.utils.WeatherUtil;
import java.util.List;
/**
- 更多天气预报信息数据适配器
*/
public class MoreDailyAdapter extends BaseQuickAdapter<DailyResponse.DailyBean, BaseViewHolder> {
public MoreDailyAdapter(int layoutResId, @Nullable List<DailyResponse.DailyBean> data) {
super(layoutResId, data);
}
@Override
protected void convert(BaseViewHolder helper, DailyResponse.DailyBean item) {
helper.setText(R.id.tv_temp_max,item.getTempMax()+“°”)
.setText(R.id.tv_temp_min,item.getTempMin()+“°”);
helper.setText(R.id.tv_date_info, DateUtils.Week(item.getFxDate()))//日期描述
.setText(R.id.tv_date, DateUtils.dateSplit(item.getFxDate()))//日期
.setText(R.id.tv_weather_state_d, item.getTextDay())//白天天气状况文字描述
.setText(R.id.tv_weather_state_n, item.getTextNight());//晚间天气状况文字描述
helper.setText(R.id.tv_wind_360_d, item.getWind360Day() + “°”)
.setText(R.id.tv_wind_dir_d, item.getWindDirDay())
.setText(R.id.tv_wind_scale_d, item.getWindScaleDay() + “级”)
.setText(R.id.tv_wind_speed_d, item.getWindSpeedDay() + “km/h”);
helper.setText(R.id.tv_wind_360_n, item.getWind360Night() + “°”)
.setText(R.id.tv_wind_dir_n, item.getWindDirNight())
.setText(R.id.tv_wind_scale_n, item.getWindScaleNight() + “级”)
.setText(R.id.tv_wind_speed_n, item.getWindSpeedNight() + “km/h”);
helper.setText(R.id.tv_cloud, item.getCloud() + “%”)//云量
.setText(R.id.tv_uvIndex, uvIndexToString(item.getUvIndex()))//紫外线
.setText(R.id.tv_vis, item.getVis() + “km”)//能见度
.setText(R.id.tv_precip, item.getPrecip() + “mm”)//降水量
.setText(R.id.tv_humidity, item.getHumidity() + “%”)//相对湿度
.setText(R.id.tv_pressure, item.getPressure() + “hPa”)//大气压强
;
//白天天气状态图片描述
WeatherUtil.changeIcon(helper.getView(R.id.iv_weather_state_d), Integer.parseInt(item.getIconDay()));
//晚上天气状态图片描述
WeatherUtil.changeIcon(helper.getView(R.id.iv_weather_state_n), Integer.parseInt(item.getIconNight()));
}
private String uvIndexToString(String code) {//最弱(1)、弱(2)、中等(3)、强(4)、很强(5)
String result = null;
switch (code) {
case “1”:
result = “最弱”;
break;
case “2”:
result = “弱”;
break;
case “3”:
result = “中等”;
break;
case “4”:
result = “强”;
break;
case “5”:
result = “很强”;
break;
default:
result = “无紫外线”;
break;
}
return result;
}
}
这是你会发现少了一个dateSplit方法,去DateUtils里面补上
//时间截取
public static String dateSplit(String date) {//2020-08-04
String result = null;
String[] array = date.split(“-”);
result = array[1] + “/” + array[2];
return result; //08/04
}
//时间截取plus
public static String dateSplitPlus(String date) {//2020-08-07
String result = null;
String[] array = date.split(“-”);
result = Integer.parseInt(array[1]) + “月” + Integer.parseInt(array[2]) + “号”;
return result; // 8月7号
}
区别不大,不过都会用到的。Ok,现在Adapter没有问题了,就可以去写订阅器了。
在app的contract包新建一个MoreDailyContract,代码如下:
package com.llw.goodweather.contract;
import com.llw.goodweather.api.ApiService;
import com.llw.goodweather.bean.DailyResponse;
import com.llw.goodweather.bean.WorldCityResponse;
import com.llw.mvplibrary.base.BasePresenter;
import com.llw.mvplibrary.base.BaseView;
import com.llw.mvplibrary.net.NetCallBack;
import com.llw.mvplibrary.net.ServiceGenerator;
import retrofit2.Call;
import retrofit2.Response;
/**
- 更多天气预报订阅器
*/
public class MoreDailyContract {
public static class MoreDailyPresenter extends BasePresenter {
/**
-
更多天气预报 V7
-
@param location 城市id
*/
public void worldCity(String location) {
ApiService service = ServiceGenerator.createService(ApiService.class,3);
service.dailyWeather(“15d”,location).enqueue(new NetCallBack() {
@Override
public void onSuccess(Call call, Response response) {
if(getView() != null){
getView().getMoreDailyResult(response);
}
}
@Override
public void onFailed() {
if(getView() != null){
getView().getDataFailed();
}
}
});
}
}
public interface IMoreDailyView extends BaseView {
//更多天气预报返回数据 V7
void getMoreDailyResult(Response response);
//错误返回
void getDataFailed();
}
}
到最后一步了,在Activity中去实现数据请求和渲染
在MoreDailyActivity代码如下:
package com.llw.goodweather.ui;
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.PagerSnapHelper;
import androidx.recyclerview.widget.RecyclerView;
import com.llw.goodweather.R;
import com.llw.goodweather.adapter.MoreDailyAdapter;
import com.llw.goodweather.bean.DailyResponse;
import com.llw.goodweather.contract.MoreDailyContract;
import com.llw.goodweather.utils.CodeToStringUtils;
import com.llw.goodweather.utils.Constant;
import com.llw.goodweather.utils.DateUtils;
import com.llw.goodweather.utils.RecyclerViewScrollHelper;
import com.llw.goodweather.utils.StatusBarUtil;
import com.llw.goodweather.utils.ToastUtils;
import com.llw.mvplibrary.mvp.MvpActivity;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import retrofit2.Response;
/**
- 更多天气预报
*/
public class MoreDailyActivity extends MvpActivity<MoreDailyContract.MoreDailyPresenter> implements MoreDailyContract.IMoreDailyView {
@BindView(R.id.toolbar)
Toolbar toolbar;
@BindView(R.id.tv_title)
TextView tvTitle;
@BindView(R.id.rv)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
最后送福利了,现在关注我可以获取包含源码解析,自定义View,动画实现,架构分享等。
内容难度适中,篇幅精炼,每天只需花上十几分钟阅读即可。
大家可以跟我一起探讨,有flutter—底层开发—性能优化—移动架构—资深UI工程师 —NDK相关专业人员和视频教学资料,还有更多面试题等你来拿
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
rt java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import retrofit2.Response;
/**
- 更多天气预报
*/
public class MoreDailyActivity extends MvpActivity<MoreDailyContract.MoreDailyPresenter> implements MoreDailyContract.IMoreDailyView {
@BindView(R.id.toolbar)
Toolbar toolbar;
@BindView(R.id.tv_title)
TextView tvTitle;
@BindView(R.id.rv)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-X0S0O0vI-1712350319352)]
[外链图片转存中…(img-vbT0N0vY-1712350319353)]
[外链图片转存中…(img-jihr11FF-1712350319353)]
[外链图片转存中…(img-ckSsaXC8-1712350319354)]
[外链图片转存中…(img-PowTy3G7-1712350319354)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
最后送福利了,现在关注我可以获取包含源码解析,自定义View,动画实现,架构分享等。
内容难度适中,篇幅精炼,每天只需花上十几分钟阅读即可。
大家可以跟我一起探讨,有flutter—底层开发—性能优化—移动架构—资深UI工程师 —NDK相关专业人员和视频教学资料,还有更多面试题等你来拿
[外链图片转存中…(img-hwQijOPS-1712350319354)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!