**第三篇**

接下来我们在之前创立好的gson包下建立6个实体类分别为:AQI,Basic,Forecast,Now,Suggestion,Weather如下:
为了解析GSON返回来的数据

AQI代码为:

public class AQI {public AQICity city;public class AQICity{public String aqi;//空气质量指数public String pm25;//pm25指数}
}

Basic代码为:
//JSON格式中的一些字段不太适合直接作为JAVA字段来命名,
//所以使用@SerializedName注解让JSON字段和java字段之间建立映射关系

public class Basic {@SerializedName("city")public String cityName;//城市名称@SerializedName("id")public String weatherId;//城市IDpublic Update update;public class Update{@SerializedName("loc")public String updateTime;//更新时的时间}
}

Forecast代码为:

public class Forecast {public String date;@SerializedName("tmp")public Temperature temperature;@SerializedName("cond")public More more;public class Temperature{public String max;public String min;}public class More{@SerializedName("txt_d")public String info;}
}

Now代码为:

public class Now {@SerializedName("tmp")public String temperature;//温度@SerializedName("cond")public More more;public class More{@SerializedName("txt")public String info;//温度的内容}
}

Suggestion代码为:

public class Suggestion {@SerializedName("comf")public Comfort comfort;@SerializedName("cw")public CarWash carWash;public Sport sport;public class Comfort{@SerializedName("txt")public String info;}public class CarWash{@SerializedName("txt")public String info;}public class Sport{@SerializedName("txt")public String info;}
}

Weather代码为:

public class Weather {public String status;public Basic basic;public AQI aqi;public Now now;public Suggestion suggestion;@SerializedName("daily_forecast")//由于daily_forecast中包含的是一个数组,索引这里引用了List集合来引用Forecast类public List<Forecast> forecastList;
}

实体类创建完成了,接下来我们建立一个WeatherActivity活动
由于要将所有的内容都在此界面显示,所有布局文件里的内容会很多而且复杂,所有我们采用分段形式,然后在activity_weather_activity.xml布局文件内统一添加进来
首先我们先建立一个标题栏title.xml布局文件
代码如下:
其中Button的背景图是我们事先下载好的

<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"><Buttonandroid:id="@+id/nav_button"android:layout_width="30dp"android:layout_height="30dp"android:layout_marginLeft="10dp"android:layout_alignParentLeft="true"android:layout_centerVertical="true"android:background="@drawable/home" /><TextViewandroid:id="@+id/title_city"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:textColor="#fff"android:textSize="20sp"/><TextViewandroid:id="@+id/title_update_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginRight="10dp"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginEnd="10dp"android:layout_alignParentEnd="true"android:textColor="#fff"android:textSize="16sp"/>
</RelativeLayout>

然后在新建一个now.xml布局文件
用于显示温度和天气信息
代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="15dp"><TextViewandroid:id="@+id/degree_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="end"android:textColor="#fff"android:textSize="60sp"  /><TextViewandroid:id="@+id/weather_info_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="end"android:textColor="#fff"android:textSize="20sp" />
</LinearLayout>

建立一个forecast.xml布局文件
用来显示未来几天的天气情况
代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="15dp"android:background="#8000"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="15dp"android:layout_marginTop="15dp"android:text="预报"android:textColor="#fff"android:textSize="20sp"/><LinearLayoutandroid:id="@+id/forecast_layout"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="wrap_content"></LinearLayout>
</LinearLayout>

建立一个forecast_item.xml布局文件
用来显示未来几天的天气情况的子布局文件
未来几天气信息的子项布局:
天气预报日期
天气概况
当天最高温度
当天最低温度

代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="15dp"><TextViewandroid:id="@+id/date_text"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_weight="2"android:textColor="#fff"/><TextViewandroid:id="@+id/info_text"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_weight="1"android:gravity="center"android:textColor="#fff"/><TextViewandroid:id="@+id/max_text"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_weight="1"android:gravity="end"android:textColor="#fff"/><TextViewandroid:id="@+id/min_text"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_weight="1"android:gravity="end"android:textColor="#fff"/>
</LinearLayout>

建立一个aqi.xml布局文件
用于显示空气质量指数
代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="15dp"android:background="#8000"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="15dp"android:layout_marginTop="15dp"android:layout_marginStart="15dp"android:text="空气质量"android:textColor="#fff"android:textSize="20sp"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="15dp"android:baselineAligned="false"><RelativeLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerInParent="true"><TextViewandroid:id="@+id/aqi_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:textColor="#fff"android:textSize="40sp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="AQI指数"android:textColor="#fff"/></LinearLayout></RelativeLayout><RelativeLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerInParent="true"><TextViewandroid:id="@+id/pm25_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:textColor="#fff"android:textSize="40sp"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="PM2.5指数"android:textColor="#fff"/></LinearLayout></RelativeLayout></LinearLayout>
</LinearLayout>

建立一个suggestion.xml布局文件
用于显示官方建议,例如洗车,运动等
代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="15dp"android:background="#8000"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="15dp"android:layout_marginTop="15dp"android:text="生活建议"android:textColor="#fff"android:textSize="20sp"/><TextViewandroid:id="@+id/comfort_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="15dp"android:textColor="#fff"/><TextViewandroid:id="@+id/car_wash_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="15dp"android:textColor="#ffff"/><TextViewandroid:id="@+id/sport_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="15dp"android:textColor="#fff"/></LinearLayout>

然后呢我们在activity_weather_activity.xml布局文件中将他们添加进来

DrawerLayout 滑动菜单
SwipeRefreshLayout 下拉刷新
android:fitsSystemWindows=“true” 为系统状态留出空间,不然会和自己的APP头部挤在一起
代码如下:

<FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/colorPrimary"><ImageViewandroid:id="@+id/bing_pic_img"android:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="centerCrop" /><androidx.drawerlayout.widget.DrawerLayoutandroid:id="@+id/drawer_layout"android:layout_width="match_parent"android:layout_height="match_parent"><androidx.swiperefreshlayout.widget.SwipeRefreshLayoutandroid:id="@+id/swipe_refresh"android:layout_width="match_parent"android:layout_height="match_parent"><ScrollViewandroid:id="@+id/weather_layout"android:layout_width="match_parent"android:layout_height="match_parent"android:scrollbars="none"android:overScrollMode="never"><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="wrap_content"android:fitsSystemWindows="true"><!--引入布局--><include layout="@layout/title"/><include layout="@layout/now"/><include layout="@layout/forecast"/><include layout="@layout/aqi"/><include layout="@layout/suggestion"/></LinearLayout></ScrollView></androidx.swiperefreshlayout.widget.SwipeRefreshLayout><fragmentandroid:id="@+id/choose_area_fragment"android:name="com.example.weather2.ChooseAreaFragment"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="start"/></androidx.drawerlayout.widget.DrawerLayout>
</FrameLayout>

然后我们util包下建立一个名为Utility的类,用于解析GSON数据
代码如下:

public class Utility {/*** 解析和处理服务器返回的省级数据*/public static boolean handleProvinceResponse(String response){if(!TextUtils.isEmpty(response)){try{JSONArray allProvinces = new JSONArray(response);for (int i = 0; i < allProvinces.length(); i++){JSONObject provinceObject = allProvinces.getJSONObject(i);Province province = new Province();province.setProvinceName(provinceObject.getString("name"));province.setProvinceCode(provinceObject.getInt("id"));//调用save()方法将数据存储到数据库中province.save();}return true;}catch (JSONException e){e.printStackTrace();}}return false;}/*** 解析和处理服务器返回的市级数据*/public static boolean handleCityResponse(String response, int provinceId){if(!TextUtils.isEmpty(response)){try {JSONArray allCities = new JSONArray(response);for (int i = 0; i < allCities.length(); i++){JSONObject cityObject = allCities.getJSONObject(i);City city = new City();city.setCityName(cityObject.getString("name"));city.setCityCode(cityObject.getInt("id"));city.setProvinceId(provinceId);//调用save()方法将数据存储到数据库中city.save();}return true;}catch (JSONException e){e.printStackTrace();}}return false;}/*** 解析和处理服务器返回的县级数据*/public static boolean handleCountyResponse(String response, int cityId){if(!TextUtils.isEmpty(response)){try {JSONArray allCounties = new JSONArray(response);for (int i = 0; i < allCounties.length(); i++){JSONObject countyObject = allCounties.getJSONObject(i);County county = new County();county.setCountyName(countyObject.getString("name"));county.setWeatherId(countyObject.getString("weather_id"));county.setCityId(cityId);//调用save()方法将数据存储到数据库中county.save();}return true;}catch (JSONException e){e.printStackTrace();}}return false;}/*** 将返回的JSON数据解析成Weather实体类*/public static Weather handleWeatherResponse(String response){try {JSONObject jsonObject = new JSONObject(response);JSONArray jsonArray = jsonObject.getJSONArray("HeWeather");String weatherContent = jsonArray.getJSONObject(0).toString();return new Gson().fromJson(weatherContent,Weather.class);}catch (Exception e){e.printStackTrace();}return null;}
}

然后我们编写WeatherActivity里的代码,把信息显示出来
代码如下:

public class WeatherActivity extends AppCompatActivity {public DrawerLayout drawerLayout;private Button navButton;public SwipeRefreshLayout swipeRefresh;private String mWeatherId;private ScrollView weatherLayout;private TextView titleCity;private TextView titleUpdateTime;private TextView degreeText;private TextView weatherInfoText;private LinearLayout forecastLayout;private TextView aqiText;private TextView pm25Text;private TextView comfortText;private TextView carWashText;private TextView sportText;private ImageView bingPicImg;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_weather_activty);//实现背景图和手机状态栏融合在一起,这个功能在Android5.0及以上的系统才支持,所以我们要做一个版本号的判断if(Build.VERSION.SDK_INT >= 21){//拿到当前活动的DecorViewView decorView = getWindow().getDecorView();//调用它的setSystemUiVisibility()方法来改变系统UI的显示。//这里传入View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN和View.SYSTEM_UI_FLAG_LAYOUT_STABLE就表示活动的布局会显示在状态栏上decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);//调用setStatusBarColor()方法将状态栏设置为透明色。getWindow().setStatusBarColor(Color.TRANSPARENT);}//初始化各控件bingPicImg = (ImageView)findViewById(R.id.bing_pic_img);weatherLayout = (ScrollView)findViewById(R.id.weather_layout);titleCity = (TextView)findViewById(R.id.title_city);titleUpdateTime = (TextView)findViewById(R.id.title_update_time);degreeText = (TextView)findViewById(R.id.degree_text);weatherInfoText = (TextView)findViewById(R.id.weather_info_text);forecastLayout = (LinearLayout) findViewById(R.id.forecast_layout);aqiText = (TextView)findViewById(R.id.aqi_text);pm25Text = (TextView)findViewById(R.id.pm25_text);comfortText = (TextView)findViewById(R.id.comfort_text);carWashText = (TextView)findViewById(R.id.car_wash_text);sportText = (TextView)findViewById(R.id.sport_text);swipeRefresh = (SwipeRefreshLayout)findViewById(R.id.swipe_refresh);swipeRefresh.setColorSchemeResources(R.color.colorPrimary);//滑动菜单功能drawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);navButton = (Button)findViewById(R.id.nav_button);SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);String weatherString = prefs.getString("weather",null);if(weatherString != null){//有缓存时直接解析天气数据Weather weather = Utility.handleWeatherResponse(weatherString);showWeatherInfo(weather);mWeatherId = weather.basic.weatherId;}else{//无缓存时去服务器查询天气mWeatherId = getIntent().getStringExtra("weather_id");// String weatherId = getIntent().getStringExtra("weather_id");weatherLayout.setVisibility(View.INVISIBLE);//requestWeather(weatherId);requestWeather(mWeatherId);}//下拉刷新swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener(){@Overridepublic void onRefresh(){requestWeather(mWeatherId);}});//按钮点击事件滑动菜单navButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//打开滑动菜单drawerLayout.openDrawer(GravityCompat.START);}});String bingPic = prefs.getString("bing_pic",null);if(bingPic != null){Glide.with(this).load(bingPic).into(bingPicImg);}else{loadBingPic();}}/*** 根据天气id请求城市天气信息*/public void requestWeather(final String weatherId){String weatherUrl = "http://guolin.tech/api/weather?cityid=" + weatherId + "&key=6f6b5169b08547f483d662d4e8c5d591";HttpUtil.sendOkHttpRequest(weatherUrl, new Callback() {@Overridepublic void onFailure(@NotNull Call call, @NotNull IOException e) {e.printStackTrace();runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(WeatherActivity.this,"获取天气信息失败hahaha",Toast.LENGTH_SHORT).show();swipeRefresh.setRefreshing(false);}});}@Overridepublic void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {final String responseText = response.body().string();final Weather weather = Utility.handleWeatherResponse(responseText);runOnUiThread(new Runnable() {@Overridepublic void run() {if(weather != null && "ok".equals(weather.status)){SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(WeatherActivity.this).edit();editor.putString("weather",responseText);editor.apply();mWeatherId = weather.basic.weatherId;showWeatherInfo(weather);}else{Toast.makeText(WeatherActivity.this,"获取天气信息失败nonono",Toast.LENGTH_SHORT).show();}swipeRefresh.setRefreshing(false);}});}});loadBingPic();}/*** 加载必应每日一图*/private void loadBingPic(){String requestBingPic = "http://guolin.tech/api/bing_pic";HttpUtil.sendOkHttpRequest(requestBingPic, new Callback() {@Overridepublic void onFailure(@NotNull Call call, @NotNull IOException e) {e.printStackTrace();}@Overridepublic void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {final String bingPic = response.body().string();SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(WeatherActivity.this).edit();editor.putString("bing_pic",bingPic);editor.apply();runOnUiThread(new Runnable() {@Overridepublic void run() {Glide.with(WeatherActivity.this).load(bingPic).into(bingPicImg);}});}});}/*** 处理并展示Weather实体类的数据*/private void showWeatherInfo(Weather weather){String cityName = weather.basic.cityName;String updateTime = weather.basic.update.updateTime.split(" ")[1];String degree = weather.now.temperature + "℃";String weatherInfo = weather.now.more.info;titleCity.setText(cityName);titleUpdateTime.setText(updateTime);degreeText.setText(degree);weatherInfoText.setText(weatherInfo);forecastLayout.removeAllViews();for (Forecast forecast : weather.forecastList){View view = LayoutInflater.from(this).inflate(R.layout.forecast_item,forecastLayout,false);TextView dateText = (TextView)view.findViewById(R.id.date_text);TextView infoText = (TextView)view.findViewById(R.id.info_text);TextView maxText = (TextView)view.findViewById(R.id.max_text);TextView minText = (TextView)view.findViewById(R.id.min_text);dateText.setText(forecast.date);infoText.setText(forecast.more.info);maxText.setText(forecast.temperature.max);minText.setText(forecast.temperature.min);forecastLayout.addView(view);}if(weather.aqi != null){aqiText.setText(weather.aqi.city.aqi);pm25Text.setText(weather.aqi.city.pm25);}String comfort = "舒适度:" + weather.suggestion.comfort.info;String carWash = "洗车指数:" + weather.suggestion.carWash.info;String sport = "运动建议:" + weather.suggestion.sport.info;comfortText.setText(comfort);carWashText.setText(carWash);sportText.setText(sport);weatherLayout.setVisibility(View.VISIBLE);Intent intent = new Intent(this, AutoUpdateService.class);startService(intent);}
}

最后我们在MainActivity里加入一个判断缓存数据
代码如下:

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);if(prefs.getString("weather",null) != null){Intent intent = new Intent(this, WeatherActivity.class);startActivity(intent);finish();}}
}

到这里天气预报就算你告一段落了,下面我们看一下效果:

选定城市后就可以看见界面了
背景图采用必应的接口,所有每天会有不同的背景


点击左上角的小房子图标可以切换城市

Android——天气预报(酷欧天气)(第三篇)相关推荐

  1. android开发酷欧天气,酷欧天气的开发

    简介 参考<第一行代码>,开发出一款全国省市县的天气预报app. 创建数据库和表 使用LitePal对数据库进行操作,创建三个实体类分别是Province.City和County. 1. ...

  2. 用kotlin方式打开《第一行代码:Android》之开发酷欧天气(2)

    参考:<第一行代码:Android>第2版--郭霖 注1:本文为原创,例子可参考郭前辈著作:<第一行代码:Android>第2版 注2:本文不赘述android开发的基本理论, ...

  3. Android实战:CoolWeather酷欧天气(加强版数据接口)代码详解(上)

    -----------------------------------该文章代码已停更,可参考浩比天气(更新于2019/6/25)----------------------------------- ...

  4. 用kotlin方式打开《第一行代码:Android》之开发酷欧天气(1)

    参考:<第一行代码:Android>第2版--郭霖 注1:本文为原创,例子可参考郭前辈著作:<第一行代码:Android>第2版,转载请注明出处! 注2:本文不赘述androi ...

  5. 14、进入实战——开发酷欧天气

    我们将要在本章编写一个功能较为完整的天气预报程序,学习了这么久的Android开发,我们给这个软件起个名字叫酷欧天气,英文名叫作Cool Weather.下面就可以开始动手了. 14.1 功能需求及技 ...

  6. 《第一行代码》总结之实战酷欧天气、发布应用(九)

      第十四章:进入实战,开发酷欧天气            实现一个功能较为完整的天气预报程序.中文:酷欧天气:英文:Cool weather 14.1功能需求和技术可行性分析. (1)应具备以下功能 ...

  7. 酷欧天气(CoolWeather)应用源码

    <ignore_js_op> 181420yank2y45klayhaan.jpg (35 KB, 下载次数: 0) 下载附件  保存到相册 2016-3-29 15:09 上传 酷欧天气 ...

  8. 《第二行代码》—— 酷欧天气的开发

    使用的教材是国@郭霖写的<第二行代码> 应用名:Cool Weather 一.功能需求及技术可行性分析 1.具备的功能 可以罗列出全国所有的省市县 可以查看全国任意城市的天气信息 可以自由 ...

  9. 第一行代码 开发酷欧天气DataSupport,ProgressDialog,加载失败,PreferenceManager.getDefaultSharedPreferences()方法

    第一行代码学到开发酷欧天气时,在继承DataSupport类时发现DataSupport过时,于是发现LitePalSupport可以替代DataSupport.后面会用到一个DataSupport. ...

  10. 酷欧天气 java.lang.RuntimeException: Unable to start activity ComponentInfo,程序无法运行

    在学习郭霖老师<第一行代码>时,最后一章实战开发创建酷欧天气(CoolWeather)时遇到的问题 在完成遍历全国省市县数据的编码后,试运行在虚拟机上跑显示如图所示 真机测试直接闪退.也没 ...

最新文章

  1. angular蚂蚁_Angular 中后台前端解决方案 - Ng Alain 介绍
  2. Centos7 安装 telnet 服务
  3. 究竟是该采用面向服务结构,还是单体结构
  4. 使用Github(仓库管理)
  5. ORA-12514: TNS:监听程序当前无法识别连接描述符中请(转)
  6. 军事医学研究院应晓敏组招聘博士后
  7. (AirWatch 系列之一)企业移动计算的集大成者--Airwatch简介
  8. ios基础篇(十二)——UINavgationController的使用(三)ToolBar
  9. 演化博弈与GAN网络
  10. 省份和城市的数据(到县一级)
  11. c语言音阶数组,【项目6-任务7-小组14】蜂鸣器演奏简单乐曲及简易电子琴制作...
  12. WebXR 技术调研 - 在浏览器中构建扩展现实(XR)应用
  13. Java合并流实现简单的文件合并示例
  14. 图论总结(欧拉路+Floyd所有结点最短+Bellman-Ford算法+SPFA+Dijsktra算法+Tarjan算法+最小生成树(prim+kruskal) )
  15. vue下载文件并重命名
  16. python-基于python程序设计基础第二版
  17. 信息系统项目管理师教程(第3版)- OSI七层模型TCP/IP四层模型对应网络协议
  18. Vue 2.0 起步 (3) 数据流 vuex 和 LocalStorage 实例 - 微信公众号 RSS
  19. win10 资源管理器 可以识别U盘 无法识别 移动硬盘【已解决】
  20. UNI-APP在使用SubNvue原生子窗体时,清理缓存的问题

热门文章

  1. 笔记本电脑怎么重装系统Win7?给你10分钟能完成系统重装吗?
  2. Oracle Wrap破解
  3. canvas绘制中国国旗!
  4. 前端面试笔试题总结【持续更新~】
  5. 6.3 分配学号(project)
  6. JS:数组Array的方法(增删改查):push() 、pop() 、unshift()、 shift()、concat()、join()、reverse()、sort()
  7. DataX系列3-TxtFileReader介绍
  8. 计算机桌面共享怎样设置密码,教你怎么给电脑设置密码
  9. 大可乐玩众筹花样作死:山寨、抄袭动摇根基
  10. 蓝桥杯 让我怎能过大年 Java