Android入門實戰——歷史上的今天

2022-01-06 老鯨魚的地下城堡

Hello,這裡是振華OPPO!

一個愛運動、愛音樂、

愛敲代碼的研究生博主

1:項目概述

本項目名稱叫做TodayHistory,

顧名思義,就是「歷史上的今天」。

點擊就能查看在這悠久的歷史長河裡面,

今天這個日期都發生了哪些大事件。

這個應用有著三點優勢:

一來可以培養人文情懷,

二來豐富自己的知識文化儲備,

三來以史為鑑知曉大義。

主要功能是怎麼實現的呢?

下面就一起來看下。

2:開發環境

3:主要實現

1、介紹下項目的總體結構

首先base包裡面放的是底層需要調用的類BaseActivity和UniteApp,裡面都是繼承父類和接口後重寫了方法。ContentURL就是我們調用的接口類,裡面是獲取URL的方法。

bean包都是實體集,HIstoryBean是【歷史上的今天】實體集,HIstoryDescBean是【詳細信息】實體集,LaoHuangliBean是【老黃曆】實體集,你可以把bean理解為資料庫裡面一張表的設計,就是一個類它所有的私有屬性以及get/set方法。

下面的HistoryActivity就是二級頁面的活動文件,HistoryAdapter是適配器文件,用來把從網絡上獲取的數據顯示到列表中,有列表那肯定有adapter,可以把它理解為容器,ListView裝上adapter就可以顯示了。

HistoryDescActivity是三級頁面的活動文件,它不是列表顯示,所以不需要adapter。最後就是MainActivity了,作為所有Android項目都有的活動文件,這裡它起到的還是列表的作用,從上到下展示內容,我們下面會講到。


2、獲取網絡數據的URL

這裡的key值是我自己申請的,如果你運行項目出現沒有數據的情況,應該是使用次數到達每日上限,方便起見,可以自己去【聚合數據】官網申請這兩個key,一個是【老黃曆】,還有一個是【歷史上的今天】,然後替換掉下面三個方法中對應的key值,第一個和第三個需要替換【歷史上的今天】的key值,第二個需要替換【老黃曆】的key值。

運行環境要保證電腦是聯網的,不然key值有用,也不會顯示數據。


3、一級界面的繪製

首先講activity_main,這個布局文件是一個RelativeLayout,它定義了一個ListView(列表)和一個ImageButton(圖片按鈕),ListView不是為了顯示一個個條目,而是將我們要顯示的界面分為頭部和尾部,依次放置在這個ListView中,這個圖標按鈕是用來點擊更改日曆的,之所以能顯示在這個列表右下方,是因為 android:layout_alignParentRight="true"和android:layout_alignParentBottom="true"這兩句設置的與父布局的位置關係,代碼如下:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    android:layout_width="match_parent"    android:layout_height="match_parent">
<ListView android:id="@+id/main_lv" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="@null"/> <ImageButton android:id="@+id/main_imgbtn" android:layout_width="70dp" android:layout_height="70dp" android:src="@mipmap/icon_calendar" android:layout_alignParentRight="true" android:layout_alignParentBottom="true" android:background="@drawable/calendarbg" android:layout_margin="20dp"/></RelativeLayout>

整體顯示效果如下:

圖片按鈕,我在drawable文件夾下定義了一個calendarbg.xml文件,更改了它的顯示效果。首先形狀設置成圓形(oval),顏色設置成淡紅色,然後添加上下左右的內邊距,對它的長度和高度也設置成了30dp,代碼如下:

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"    android:shape="oval"    android:useLevel="false">    <solid android:color="#88B22222"/>    <padding        android:left="2dp"        android:right="2dp"        android:top="1dp"        android:bottom="1dp"/>    <size android:width="30dp"        android:height="30dp"/></shape>

接下來是main_headerview,就是主界面的頭部,這裡展示的就是【老黃曆】顯示的信息,設置的都是TextView,垂直居中分布,比較簡單,代碼如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical" android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@color/mainBg">    <TextView        android:id="@+id/main_header_tv_yangli"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:textStyle="bold"        android:textSize="18sp"        android:gravity="center"        android:padding="3dp"        android:text=""/>    <TextView        android:id="@+id/main_header_tv_day"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center"        android:textStyle="bold"        android:textSize="80sp"        android:text=""        android:textColor="@color/fireRed"/>    <TextView        android:id="@+id/main_header_tv_week"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center"        android:textColor="@color/fireRed"        android:textStyle="bold"        android:textSize="26sp"        android:text=""/>    <TextView        android:id="@+id/main_header_tv_nongli"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center"        android:padding="3dp"        android:textStyle="bold"        android:textSize="18sp"        android:layout_marginTop="10dp"        android:text=""/>    <LinearLayout        android:orientation="vertical"        android:layout_margin="20dp"        android:padding="10dp"        android:background="@drawable/headerbg"        android:layout_width="match_parent"        android:layout_height="wrap_content">        <TextView            android:id="@+id/main_header_tv_baiji"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_marginTop="10dp"            android:textSize="14sp"            android:text=""/>        <TextView            android:id="@+id/main_header_tv_wuxing"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:textSize="14sp"            android:text=""/>        <TextView            android:id="@+id/main_header_tv_chongsha"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:textSize="14sp"            android:layout_marginBottom="10dp"            android:text=""/>
<TextView android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/fireRed"/>
<TextView android:id="@+id/main_header_tv_jishen" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:textSize="14sp" android:text=""/> <TextView android:id="@+id/main_header_tv_xiongshen" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:textSize="14sp" android:text=""/>
<TextView android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/fireRed"/>
<TextView android:id="@+id/main_header_tv_yi" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:textSize="14sp" android:text=""/> <TextView android:id="@+id/main_header_tv_ji" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:textSize="14sp" android:text=""/> </LinearLayout>
<TextView android:id="@+id/main_header_tv_history" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="歷史上的這一天" android:layout_marginLeft="20dp" android:textSize="18sp" android:textStyle="bold"/></LinearLayout>

具體效果:

最後就是main_footer這個布局文件,就是主界面的尾部,這個就是顯示一個TextView,用來點擊使用,然後加載更多信息的,最簡單的一個layout文件了,代碼如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"    android:layout_height="wrap_content"    android:gravity="center"    android:orientation="horizontal"    android:background="@color/mainBg">     <TextView         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:text="點擊加載更多"         android:padding="15dp"/></LinearLayout>

具體效果:

這樣,在MainActivity裡面就將頭部和尾部放到ListView中,共同構成了主界面

    private void addHeaderAndFooterView() {        View headerView = LayoutInflater.from(this).inflate(R.layout.main_headerview,null);        initHeaderView(headerView);        mainLv.addHeaderView(headerView);        View footerView = LayoutInflater.from(this).inflate(R.layout.main_footer,null);        footerView.setTag("footer");        footerView.setOnClickListener(this);        mainLv.addFooterView(footerView);    }

4、二級界面的繪製

二級界面就是【歷史上的今天】,包含所有事件的一個界面。首先最上面在一個子RelativeLayout中放置了TextView,文本內容 android:text=「歷史上的這一天」,android:layout_centerInParent="true"居中顯示在父布局中。然後左側放置了一個ImageView,這是返回按鈕的圖片,用的是垂直居中,代碼如下:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">    <RelativeLayout        android:layout_width="match_parent"        android:layout_height="45dp"        android:id="@+id/history_title"        android:background="@color/mainBg">        <TextView            android:id="@+id/history_title_tv"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="歷史上的這一天"            android:textSize="18sp"            android:textStyle="bold"            android:layout_centerInParent="true"/>        <ImageView            android:id="@+id/history_iv_back"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerVertical="true"            android:src="@mipmap/icon_back"/>    </RelativeLayout>
<TextView android:id="@+id/history_line" android:layout_width="match_parent" android:layout_height="1dp" android:layout_below="@id/history_title" android:background="@color/fireRed"/> <ListView android:id="@+id/history_lv" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/history_line" android:divider="@null"></ListView> <TextView android:id="@+id/history_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:textStyle="bold" android:textSize="30sp" android:text="暫無數據" android:visibility="gone"/></RelativeLayout>

顯示效果:

有ListView肯定少不了item,而item_main_timeline就是這樣一個條目文件,它顯示了時間線圖片和文本,代碼如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical" android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@color/mainBg">    <LinearLayout        android:id="@+id/item_main_ll"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="horizontal">        <LinearLayout            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:orientation="vertical">            <ImageView                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_gravity="center_horizontal"                android:layout_marginLeft="1dp"                android:src="@mipmap/timeline_group_divider"                />            <View                android:layout_width="1dp"                android:layout_height="30dp"                android:layout_gravity="center_horizontal"                android:layout_marginTop="2dp"                android:background="#996600"/>        </LinearLayout>        <TextView            android:id="@+id/item_main_time"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_marginTop="6dp"            android:layout_weight="15"            android:text="2019-11-14"            android:textColor="#996600"/>    </LinearLayout>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="70dp"        android:orientation="horizontal">        <RelativeLayout            android:layout_width="0dp"            android:layout_height="match_parent"            android:layout_weight="1">            <LinearLayout                android:layout_width="match_parent"                android:layout_height="match_parent"                android:layout_marginTop="2dp"                android:gravity="center_horizontal"                android:orientation="vertical">                <ImageView                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:src="@mipmap/template_time_spot"/>                <View                    android:layout_width="1dp"                    android:layout_height="match_parent"                    android:background="#996600"                    android:layout_marginTop="2dp"/>            </LinearLayout>        </RelativeLayout>      <android.support.v7.widget.CardView          android:layout_width="0dp"          android:layout_height="match_parent"          android:layout_weight="15"          android:background="#FFF"          android:layout_marginRight="15dp"          android:layout_marginBottom="10dp"          android:elevation="5dp">          <LinearLayout              android:layout_width="match_parent"              android:layout_height="match_parent"              android:orientation="horizontal">              <ImageView                  android:id="@+id/item_main_pic"                  android:layout_width="0dp"                  android:layout_height="match_parent"                  android:layout_weight="1"                  android:scaleType="centerCrop"                  android:src="@mipmap/icon"/>              <TextView                  android:id="@+id/item_main_title"                  android:layout_width="0dp"                  android:layout_height="match_parent"                  android:layout_weight="2"                  android:text="聯想集團公司在京成立"                  android:padding="5dp"                  />          </LinearLayout>      </android.support.v7.widget.CardView>    </LinearLayout></LinearLayout>

顯示效果,可以看到時間是一個小圓,事件是一個小點,左邊圖片,右邊文字:

4、三級界面的繪製

最後就是activity_history_desc這個布局文件了,它和二級界面在頂部幾乎是一樣的,只是多了一個分享按鈕,主要是下面使用了ScrollView(垂直滾動條),用來放大量數據,防止數據顯示不完,可以上下滑動,就和我們瀏覽網頁一樣,這個滾動條中,我們放了一個LinearLayout子布局,在其中放了TextView控制項,顯示當天日期,下面就是ImageView控制項,顯示歷史上這件事的圖片,有可能有多張,所以可以滾動,最下面就是這個事件的詳細闡述,也是用一個TextView就搞定了,代碼如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout 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:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@color/mainBg"    android:orientation="vertical">    <RelativeLayout        android:layout_width="match_parent"        android:layout_height="45dp">        <TextView            android:id="@+id/history_tv_title"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="歷史上的這一天"            android:layout_centerInParent="true"            android:textSize="18sp"            android:textStyle="bold"/>        <ImageView            android:id="@+id/desc_back_iv"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerVertical="true"            android:src="@mipmap/icon_back"/>
<ImageView android:id="@+id/desc_share_iv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:src="@mipmap/icon_share" android:layout_alignParentRight="true" android:layout_marginRight="10dp"/> </RelativeLayout> <TextView android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/fireRed"/> <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/desc_tv_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:textSize="18sp" android:textStyle="bold" android:layout_margin="10dp"/>
<ImageView android:layout_width="match_parent" android:layout_height="280dp" android:id="@+id/desc_iv_pic" android:scaleType="fitXY" android:layout_margin="10dp"/>
<TextView android:id="@+id/desc_tv_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="16sp" android:layout_margin="10dp"/> </LinearLayout> </ScrollView></LinearLayout>

4:項目演示

1、進入應用,主頁從上至下,依次顯示的是陽曆、陰曆、歷史上的這一天

2、我們往下拖,可以看到底下顯示了5條內容,點擊加載更多內容,就會進入到二級頁面,顯示更多內容

3、進入二級界面後,會顯示所有的事件,這些事件有的有圖片,有的沒有圖片,而且有的還有兩三張圖片,這主要根據網絡數據提供,最上面有【返回】按鈕,可以返回上一級頁面,標題是【歷史上的這一天】

4、我們點擊其中一個事件,跳轉到三級界面,可以看到它的詳細內容desc,標題+大圖+文字描述,非常好的用戶體驗

5、在事件的詳情頁面中,即上圖中右上角有個分享按鈕,點擊可以分享給好友

6、右下角有一個日曆,點擊它彈出日曆的對話框,可以選擇日期

7、我們選擇2021.06.01,然後發現日曆和歷史的今天都更新成了六月一號

5:項目總結

以上就是該項目的主要內容介紹,考察的還是基礎控制項(ImageButton、ListView、TextView、ImageView)和布局(RelativeLayout、LinearLayout)的使用;還有每個項目必不可少的類:適配器Adapter、實體集Bean等,綜合運用,融會貫通,邊寫邊思考,才能加深記憶,寫起來行雲流水。

6:項目源碼

後臺回覆:歷史上的今天

如果對你有幫助的話,點個「贊+在看」

歡迎大家轉發分享給身邊的同學~

這有你錯過的往期精彩~


Android Studio實現一個星座配對APP

Android Stduio實現一個天氣預報APP

Android Studio實現一個健康飲食搭配APP

珍藏四年的學習資料,開學季免費分享!

那我們下期再見嘍~

相關焦點

  • Android新手入門-Android中文SDK
    Android新手入門本文引用地址:http://www.eepw.com.cn/article/201610/305797.htmAndroid新手入門 (Getting Started with Android)新手入門Android,請首先閱讀下面的章節 (To get started with Android
  • Android上玩玩Hook:Cydia Substrate實戰
    而「鉤子」的意思,就是在事件傳送到終點前截獲並監控事件的傳輸,像個鉤子勾上事件一樣。並且能夠在勾上事件時,處理一些自己特定的事件。如下圖所示:alteration);/** * 使用一個ClassLoader重載一個對象 * * @param loader 使用的ClassLoader * @param object 帶重載的對象 * @return 重載後的對象 */<T> T moveUnderClassLoader(ClassLoader loader, T object);開始實戰
  • Android自定義View入門及實戰案例分析
    onFinishInflate() 回調方法,當應用從XML加載該組件並用它構建界面之後調用的方法      onWindowFocusChanged(boolean) 當該組件得到、失去焦點時      onAttachedToWindow() 當把該組件放入到某個窗口時       onDetachedFromWindow() 當把該組件從某個窗口上分離時觸發的方法
  • 放蕩不羈SVG講解與實戰——Android高級UI
    今天小盆友也來談談這個優秀的SVG,同時分享一些個人比較喜歡的知識小點。老規矩,先上實戰圖。"手寫"掘金地圖查閱器" />這裡不存在兼容問題,小盆友在4.4的機子上也有測試過。上一小節我們知道,對 SVG 添加動畫,簡單方便,但是也說明了使用系統自帶的這一套操作無法實現較為複雜的交互,所以我們只能自己動手,才能豐衣足食了。
  • Android Hook神器:XPosed入門與登陸劫持演示
    今天,就向大家簡單地介紹一下Xposed,並書寫一個簡單的登陸劫持Demo,讓大家快速地入門學習Xposed。實戰,登陸劫持(原理) 之前跟大家也說過使用CydiaSubstrate進行廣告注入,很多網友問我,除了簡單地注入一個廣告,還能做什麼嗎? 登陸劫持!!! 你沒聽錯,今天我們這裡就簡單地演示一下,如何對一個應用程式的登陸功能進行劫持,並把帳號密碼列印出來。
  • 【Android 原創】實戰分析一個Crackme的過程(超級詳細)
    Crackme的過程一、寫在前面自學這個也有幾個星期了,今天就總結一下近期學習的成果,實戰分析一個Crackme,並寫下了這篇超級詳細的過程,從軟體環境的配置到軟體詳細的使用再到最後的逆向分析出結果,為了文章的貼圖方便和文章美觀展示,用了兩臺電腦+MUMU模擬器+Google6.0.1版真機,相互切換著截圖附在帖子裡,也主要是因為模擬器動態調試so加載好像有問題。
  • 一看就懂的Android APP開發入門教程
    工作中有做過手機App項目,前端和android或ios程式設計師配合完成整個項目的開發,開發過程中與ios程序配合基本沒什麼問題,而 android
  • 第23課:Android - LinearLayout布局講解
    老黑這節課開始,我們要講解一下Android的幾種頁面布局,通過頁面布局的學習,大家可以做出任意變化的頁面,而只要充分掌握了這點,基本上可以算Android入門了,同時會對自己的信心有一個顯著的提高。當然,布局的內部除了放置控制項外,也可以嵌套布局,通過多層布局的嵌套,我們可以完成一些比較複雜的頁面,如圖:好了,大概清楚布局是怎麼一回事就行了,接下來我們來看今天需要掌握的第一個布局,也是正式項目中最常用的布局—— LinearLayout。
  • 【教程資源】project視頻教程入門到精通 2003/2007/2010/2013/2016 實戰教學
    project視頻教程入門到精通 2003/2007/2010/2013/2016 實戰教學《需要的可以找我,你就可以擁有這個課程
  • Android安全幾道入門題目
    Android系統由於其開源的屬性,市場上針對開原始碼定製的ROM參差不齊,在系統層面的安全防範和易損性都不一樣,android
  • 【實戰】Android Data Binding從牴觸到愛不釋手
    登錄/未登錄有好幾年findViewById實戰經驗的我,感覺並不難啊。本文只關注單向的Binding,即:Model的變化,自動同步到View上。隨後,在DetailActivity4.java中調用測試代碼,執行完會在1秒後改變adapter上的name值,並且同步到View上,測試代碼如下:
  • 【移動安全】Android程序分析入門
    ><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical
  • Android APP安全測試入門
    有句古語:」工欲善其事,必先利其器」,我們要研究App安全,沒有幾款高大上的神器是會非常麻煩的,因此本文主要給大家分享一下筆者學到的一些基礎知識,主要是一些移動端測試輔助工具的使用。模擬器模擬器筆者經常使用有兩款,一款是BlueStacks,這款個人感覺是做的非常不錯的,一般安裝操作App非常流暢,不會有卡死的情況。
  • android手機app開發程式語言是什麼,自學難嗎?愛好者告訴你答案
    大家好,首先,小編我也是一名編程愛好者,有C語言編程基礎,和一些數據結構算法等基礎,隨著手機應用的崛起,也加入到了android編程的行列中來。做為一名android編程愛好者,水平初級,走過彎路,所以本文目的就是讓大家學習起來不走彎路。
  • Android NDK 入門與實踐之 CMake
    《Android NDK 入門與實踐》很多讀者反饋,為什麼不用 CMake,CMake 更方便。
  • [JAVA] 85天 精通JAVAEE+Android 黑馬程式設計師JavaEE+Android培訓課程60G
    WebInitParam註解方式配置Servlet, 動態部署Servlet以及為Servlet增加URL映射,可插性支持(Servlet3.0引入了稱之為「Web 模塊部署描述符片段」的 web-fragment.xml部署描述文件),HttpServletResponse和HttpServletRequest的應用,Cookie 及Cookie的應用,HttpOnly的cookie,Cookie實現商品瀏覽歷史記錄
  • Android應用開發實戰:GPS與加速度傳感器
    manifest>標籤內的<permission>標籤中請求這兩種權限,如下所示:<uses-permission android:name="android.permission.LOCATION"/>       對於細粒度的位置更新,也就是近距離顯示有關對象,還需要添加以下內容:<
  • Android破解實戰:遊戲蜂窩3.21版本破解記錄
    ><LinearLayoutandroid:orientation="vertical" android:layout_width="0.0dip" android:layout_height="0.0dip" xmlns:android="http://schemas.android.com/apk/res/android">
  • Android 12上煥然一新的小組件
    似乎除了天氣、時鐘等常用小組件以外鮮少使用,逐漸被人遺忘Windows Phone的動態磁貼在自由尺寸的Logo上靈活展示信息的設計非常超前,奈何生態構建困難,早已退場Apple向來穩重(保守),直到iOS 10才引入小組件,但負一屏限制著它的發展。
  • 好課資源共享:android逆向
    android逆向511.—公眾號網頁支付( Java版)尚學堂2020java全套視頻教程200G(每月更新)軟體破解逆向工程實戰 - 第六期  DLL黑客 作弊開發訓練營巧匠電商視覺實戰設計視頻教程28期前端Vue3.0從0到1手把手擼碼搭建管理後臺系統暖石100 零基礎入職網際網路運營(完結)逆冬2020權重站教程黑馬·C+