SCAU學習筆記 - 自科三面前端方向實戰演示

本來是準備寫完二面直接開始寫算法三面的,maimai那個封面圖我都做好了。但是可惡的出題人說要等我出完解析再針對性避開出題,所以swan決定把那個先擱置,本文我們先以2023年的自科三面前端方向題為例帶各位快速入門前端三件套(因為前端我也不太會所以只能說告訴你有些什么東西)
需要聲明的是,本文僅是拋磚引玉,介紹大部分基礎概念以及開發過程中找bug修bug的流程以及實現思路,具體代碼實現不會在文中有體現,文末會有完整代碼的鏈接,但還是希望各位能借助AI(這點很重要,AI對自學幫助很大的,任何不會的都不要猶豫馬上去問)順著我的思路來獨立的實現
擱置算法題解,我們休息一下,讀個加載進度條吧
封面

原題題面

題面
2023年的CSDN主頁和現在的不太一樣,pdf里面的文件已經失效了,我就懶得去找當時主頁長什么樣子了,直接復刻現在這個吧
20250820CSDN主頁

環境搭建

相信很多小朋友都還是第一次接觸開發,簡單來說,代碼需要用一些程序來編寫和運行,本文使用的是Pycharm,我們的Python專業課用的也是這個IDE來編寫代碼,你可以使用免費版本,對本文內容來說已經夠用了,或者看我這篇文章最前面的部分了解如何申請學生認證以免費使用完全體的Pycharm。
可能就有同學要問了,我們不是寫前端嗎,也沒有使用Python啊,為什么要使用Pycharm呢?因為我這里使用的是Flask架構來方便調試,方便我直觀地看到我網頁寫成了什么樣子。

配置Python

首先我們來到Python的官網,點擊上面導航欄的Download
頁面
直接點這個很顯眼的Download下載安裝包就行了,打開安裝包記得先勾上這個
打勾
這個選項是把Python加到你系統的環境變量里面的,然后就點Install Now一路下一步就行了

配置Pycharm

Pycharm就沒啥好說的了,在官網下載,然后一路下一步,需要的話記得把安裝目錄改到D盤就行了

新建項目

打開安裝好的Pycharm,注冊登錄之后直接點擊這個顯眼的新建項目
pycharm
選擇左邊的Flask項目,選擇你創建項目的目錄,然后創建即可
pycharm
如果你的電腦沒有安裝Flask則會在第一次創建時自動下載,需要一段時間(或者科學上網),耐心等待即可
好了,我們現在已經成功創建了我們的項目,和學習C語言時一樣,他已經填充了一些代碼,我們先運行一下試試看,點擊左上角的運行按鈕,然后下面會彈出一大堆提示,點擊這個藍色的鏈接就會彈出瀏覽器打開剛剛寫出來的網頁了
pycharm
默認的代碼出來的網頁應該是長這個樣子,需要提一嘴的是這個網頁是跑在你本地端口的,所以不要奢望說別人輸入一樣的網址也能打開這個網頁
網頁

框架介紹

雖然我們前面配置Python配了老半天,但是我們還是要回去寫前端三件套的,但是我的文件要去哪里新建?這是個問題,讓我們觀察下左邊的文件結構
文件結構
現在跟著我的這個模式來新建一些文件,并修改app.py那個python文件里面的代碼(僅有的幾步需要敲python代碼的地方)
change
接下來,我們就可以打開home.html開始編寫我們的網頁代碼了!

開碼部分

打開home.html我們可以直接在兩個body中間的部分寫上我們想要的內容,就會直接顯示在網頁上(記得每次修改之后要重新點運行而不是刷新網頁就有變化)
example

頂部導航欄

我們再嘗試導入一些圖片,我們把CSDN的Logo下載到image目錄下,然后這樣寫
logo
這個效果不太對啊,我需要的是把這個logo和搜索框放在同一行,這個時候就需要寫CSS樣式了,我們還不著急新建文件,我們直接把這兩個元素再用一層包起來
效果
我們可以通過定義style的方式來修改樣式,但是假如style特別多,我們可以類似C語言里面的結構體,把一大堆style封裝在一起起個名字然后調用,寫在最上面,比如說我現在要完善搜索框的格式,就像這樣

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Home</title><style>.search-container {display: flex;align-items: center;justify-content: flex-start;width: 100%;}.search-input {flex: 1;padding: 10px;font-size: 16px;border: 1px solid #ccc;border-radius: 8px 0 0 8px;background-color: #F5F6F7;color: #867888;box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);outline: none;}.search-input::placeholder {color: #867888;}.search-button {padding: 10px 20px;font-size: 16px;border: none;border-radius: 0 8px 8px 0;background-color: #FC5531;color: #fff;cursor: pointer;display: flex;align-items: center;justify-content: center;}.search-button:hover {background-color: #e04a28;}.search-button span {margin-left: 5px;}</style>
</head>
<body><div class="search-container"><input type="text" id="search-box" class="search-input" placeholder="輸入到此處搜索"><button class="search-button" onclick="performSearch()">🔍<span>搜索</span></button></div>
</body>
</html>

運行出來的效果就是這樣的了(反正現在帶火都有AI,具體每個參數啥意思就不細講了)
搜索框
但是我的網頁那么多東西,寫在一個文件里面太臃腫了,所以我們解鎖模塊化開發,我們把剛才寫好的頂端部分單獨寫在一個文件里面,之后遇到再調用就行,HTML的調用語法如圖所示,但是css的樣式還是必須寫在home.html里面
html
現在home.html還是很長,所以我們考慮把樣式也壓到一個css文件里面去,我們寫成這樣就可以了
css
然后簡單調整一下(不會就去問AI大人讓他改,只要你認真看了AI的解釋答辯的時候能說清楚怎么實現的就行)
需要你自己解決的問題:

  • 如何保證這個頂部導航欄始終位于頁面頂端
  • 如何保證這個搜索框分為了兩個部分
  • 如何保證搜索框的長度合適并且居中
  • (附加題)能否實現點擊搜索框跳轉到搜索頁面(不用具體實現)

目標是實現到這樣的效果,左邊那個收起按鈕涉及js,我們留到最后再作為可選項說一嘴
headbar

左側導航欄

左側導航欄就很好寫了,反正我們只需要寫一個殼子,就直接把所有圖標并排擺就行了
leftbar
但是現在發現一個問題注意到沒有,咱們這個第一個選項被headbar蓋住了,我們使用一個簡單粗暴的方法,直接進行一個整體下移就搞定了,然后我們在這一趴在上點小花活,CSDN是有選中對應的圖標的,他是進入對應的頁面圖標才會變色,我們可以把這個素材利用起來,鼠標碰到就變色,這個就屬于頁面的動態效果,需要我們寫js來實現
我們現在html里面給每個圖標兩個狀態屬性,分別為選中和未選中

		<a href="/home" class="nav-item"><img src="{{ url_for('static', filename='image/leftbar/Unselect/home.png') }}"data-unselect="{{ url_for('static', filename='image/leftbar/Unselect/home.png') }}"data-select="{{ url_for('static', filename='image/leftbar/Select/home.png') }}"alt="首頁圖標" class="nav-icon">首頁</a>

然后我們來寫js代碼

document.addEventListener("DOMContentLoaded", () => {// 1. 添加一個事件監聽器,監聽 DOMContentLoaded 事件。//    這個事件會在 HTML 文檔完全加載并解析完成后觸發,//    確保腳本在頁面的 DOM 元素可用時執行。const navItems = document.querySelectorAll(".nav-item");// 2. 使用 querySelectorAll 方法選擇所有帶有類名 "nav-item" 的元素。//    這些元素是導航欄中的每個 <a> 標簽,存儲在 navItems 變量中。//    querySelectorAll 返回的是一個 NodeList(類似數組的對象)。navItems.forEach(item => {// 3. 遍歷 navItems 中的每個導航項(item)。//    forEach 是 NodeList 的方法,用于對每個元素執行回調函數。const img = item.querySelector(".nav-icon");// 4. 在當前導航項中,使用 querySelector 方法選擇類名為 "nav-icon" 的 <img> 標簽。//    這個 <img> 標簽是導航項的圖標,存儲在 img 變量中。const unselectSrc = img.getAttribute("data-unselect");// 5. 使用 getAttribute 方法獲取 <img> 標簽的 "data-unselect" 屬性值。//    這個值是未選中狀態的圖標路徑,存儲在 unselectSrc 變量中。const selectSrc = img.getAttribute("data-select");// 6. 使用 getAttribute 方法獲取 <img> 標簽的 "data-select" 屬性值。//    這個值是選中狀態的圖標路徑,存儲在 selectSrc 變量中。item.addEventListener("mouseenter", () => {// 7. 為當前導航項添加一個 "mouseenter" 事件監聽器。//    當鼠標懸停在導航項上時,會觸發這個事件。img.setAttribute("src", selectSrc);// 8. 在事件觸發時,使用 setAttribute 方法將 <img> 的 "src" 屬性設置為 selectSrc。//    這會將圖標切換為選中狀態的圖標。});item.addEventListener("mouseleave", () => {// 9. 為當前導航項添加一個 "mouseleave" 事件監聽器。//    當鼠標移出導航項時,會觸發這個事件。img.setAttribute("src", unselectSrc);// 10. 在事件觸發時,使用 setAttribute 方法將 <img> 的 "src" 屬性設置為 unselectSrc。//     這會將圖標切換回未選中狀態的圖標。});});// 11. 結束 forEach 循環,確保每個導航項都綁定了鼠標事件監聽器。
});

最后不要忘了在home.html里面引入一下剛寫的這個js文件就大功告成啦~

<script src="{{ url_for('static', filename='js/leftbar.js') }}"></script>

既然學了js,我們現在就可以搞一搞剛才擱置的只顯示左邊欄圖標功能了,類似剛才的寫法,我們給左邊的這個leftbar加一個收起形態的標簽,給收起形態下的文字內容設置為不顯示

.leftbar.collapsed .nav-item span {display: none; /* 隱藏文字 */
}

在這里我們學了一些基礎的動效的相關知識,簡單來說就是css里面打標記,然后js控制什么時候在不同標記之間切換

主體部分

現在來到主體部分,我們從上往下看,首先需要實現的就是原本網頁的標簽頁效果,點擊不同的頁簽就會進入不同的頁面,但是我們的網址沒有改變
原版效果
這同樣也是用我們剛才學習的js實現的,不過我們不妨直接看看題目上附贈的資料里面的標簽頁插件的鏈接,所謂的插件其實就是寫好的一些css和js文件,我們只需要直接調用它們的樣式即可,我們來帶bootstrap的官網下載他的壓縮包,解壓到我們的static文件夾,然后就可以直接引用使用了(甚至可以不下載,我們直接引用在線的庫,然后網頁在加載的時候就會自動下載這些庫進行渲染)
代碼
我們按照規則導入這個頁簽的庫并寫幾個頁簽出來,實現了這樣的效果
頁簽演示
但是在測試的過程中,又發現了新的問題
新的問題
發現了沒有,我們在收縮左邊的leftbar的時候,我們的主體部分沒有跟著移動,所以我們還需要繼續完善我們剛才寫的js文件,不過在此之前,我們要先繼續推進我們代碼的模塊化,我們把整個頁面的主體部分寫到一個html文件里面,然后每個頁簽的內容再分為三個頁簽里面,然后我們就可以給這個主體部分也打一個標記,在leftbar收縮和不收縮的時候修改他的寬度,然后我們再重載一下這個頁簽按鈕的樣式,一通操作猛如虎之后,我們就搞定了
頁簽效果

輪播圖

雖然現在的CSDN沒有輪播圖,但是當年應該是有的,否則也不可能在這個做題要求里面給一個輪播圖的插件鏈接,那么我們就在全部這個頁簽里面加一個輪播圖試一下吧

<div class="carousel-container"><div id="carouselExample" class="carousel slide" data-bs-ride="carousel"><div class="carousel-inner"><div class="carousel-item active"><img src="{{ url_for('static', filename='image/ad/1.jpg') }}" class="d-block w-100" alt="Ad Image 1"></div><div class="carousel-item"><img src="{{ url_for('static', filename='image/ad/2.jpg') }}" class="d-block w-100" alt="Ad Image 2"></div><div class="carousel-item"><img src="{{ url_for('static', filename='image/ad/3.jpg') }}" class="d-block w-100" alt="Ad Image 3"></div><div class="carousel-item"><img src="{{ url_for('static', filename='image/ad/4.jpg') }}" class="d-block w-100" alt="Ad Image 4"></div><div class="carousel-item"><img src="{{ url_for('static', filename='image/ad/5.jpg') }}" class="d-block w-100" alt="Ad Image 5"></div><div class="carousel-item"><img src="{{ url_for('static', filename='image/ad/6.jpg') }}" class="d-block w-100" alt="Ad Image 6"></div></div><button class="carousel-control-prev" type="button" data-bs-target="#carouselExample" data-bs-slide="prev"><span class="carousel-control-prev-icon" aria-hidden="true"></span><span class="visually-hidden">Previous</span></button><button class="carousel-control-next" type="button" data-bs-target="#carouselExample" data-bs-slide="next"><span class="carousel-control-next-icon" aria-hidden="true"></span><span class="visually-hidden">Next</span></button></div>
</div>

于是這個效果我們就完成啦(記得關掉adblock,這個元素可能會被adb干掉)
輪播圖

寫在最后

最后再隨便填充一些東西我們的項目就完成啦!三件套齊活,插件也用上了,最終效果就長這個樣子(當然你覺得空的話還可以繼續加一些信息框啥的,排版你也可以隨便改)
最終效果
雖然這個題今年肯定不會再出,但是希望你能學習到一些有用的東西,順利進入自科,暴打swan喵~我們就下期算法三面通關筆記再見!
哦對了,還有源代碼倉庫鏈接,在這里
標題

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93903.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93903.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93903.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前后端聯合實現文件上傳,實現 SQL Server image 類型文件上傳

1、前端 Vue3QualityFileInfoDialog.vue<script setup lang"ts" name"QualityFile"> ...... // 上傳&#xff0c;防抖 const onUploadClick debounce(() > {// 模擬點擊元素if (fileInputRef.value) {// 重置以允許重復選擇相同文件fileInputRef…

使用安卓平板,通過USB數據線(而不是Wi-Fi)來控制電腦(版本1)

這是一個對延遲和穩定性要求很高的場景。 核心原理是&#xff1a;利用USB數據線&#xff0c;在手機和電腦之間創建一個高速的“虛擬網絡連接”&#xff0c;然后在這個穩定的網絡通道上運行遠程控制軟件。 方案1&#xff1a; 在完全沒有無線網絡&#xff08;Wi-Fi&#xff09;和…

linux報permission denied問題

linux報permission denied問題 一般是沒有可執行權限&#xff0c;需要先添加執行權限 1. 確認文件權限 在你的項目目錄下執行&#xff1a; ls -l ./folder你可能會看到類似&#xff1a; -rw-r--r-- 1 user user 1234 Aug 18 12:00 script.sh注意&#xff1a;這里缺少 x&#xf…

Vue深入組件:組件事件詳解2

聲明觸發的事件 為了讓組件的用法更清晰(作為文檔),同時讓 Vue 能區分事件與透傳 attribute,推薦顯式聲明組件要觸發的事件。根據組件是否使用 <script setup>,聲明方式有所不同。 使用 <script setup> 時:defineEmits() 宏 在 <script setup> 中,…

FLASK項目快速構建

Flask 項目構建 exts.py # flask_sqlalchemy from flask_sqlalchemy import SQLAlchemy from flask_mail import Mail from flask_caching import Cache from flask_wtf import CSRFProtect from flask_avatars import Avatars from flask_jwt_extended import JWTManager from…

數據結構--2:ArrayList與順序表

1.順序表的創建 2.常見操作 3.遍歷 4.擴容機制 5.例子1.順序表的創建在集合框架中&#xff0c;ArrayList是?個普通的類&#xff0c;實現了List接口&#xff0c;具體框架圖如下&#xff1a;2.常見操作代碼…

【Kubesphere】K8s容器無法訪問內網xx網絡問題

問題遇到的現象和發生背景 Kubesphere中運行的一個容器&#xff0c;可以ping通我們公司內網網段172.16.XX.XX&#xff0c;但是在容器內無法ping通192.168.5.XX&#xff0c;但是我在宿主機是可以ping通192.168.5.XX&#xff0c;這個192.168.5.XX是通過xx設備接進來的&#xff0c…

【開發語言】Groovy語言:Java生態中的動態力量

博客目錄一、Groovy 的誕生與發展二、核心特性深度解析1. 與 Java 的無縫集成2. 動態類型與可選靜態類型3. 強大的集合操作三、Groovy 在實際開發中的應用場景1. 構建自動化&#xff08;Gradle&#xff09;2. 測試開發&#xff08;Spock 框架&#xff09;3. 腳本任務自動化四、…

Obsidian 1.9.10升級

概述 Obsidian發布了更新版本1.9.10&#xff0c;是一次比較大的升級&#xff0c;尤其是增加了一些以前沒有的核心插件&#xff0c;尤其是重磅的數據庫功能。雖然可能還是比較初期&#xff0c;但是這意味著OB還是往更好的方向進化了。 本文以一些目前的視頻教程加自己的實際上手…

內容審計技術

一、 內容審計需求背景1.網絡安全法要求明確責任人&#xff1a;制定內部安全管理制度和操作規程&#xff0c;落實安全保護責任。監測、記錄并保留日志&#xff1a;采取監測、記錄網絡運行狀態、網絡安全事件的技術措施&#xff0c;并按照規定留存相關網絡日志不少于六個月。采取…

反序列化漏洞

php反序列化 1.什么是序列化和反序列化 office word是程序 doc/docx是數據 保存word文件&#xff1a;程序--保存(序列化)-->數據文件 打開word文件&#xff1a;程序--加載數據文件-->還原(反序列化) 游戲存檔&#xff1a;角色等級&#xff0c;任務&#xff0c;人物坐…

Lecture 4 Mixture of experts課程筆記

什么是MoE?用&#xff08;多個&#xff09;大型前饋網絡和一個選擇器層取代大型前饋網絡。你可以在不影響浮點運算次數的情況下增加專家數量。 MoE受歡迎的原因 相同的浮點運算次數&#xff0c;更多的參數表現更好訓練混合專家模型&#xff08;MoEs&#xff09;速度更快訓練混…

微服務架構的演進:從 Spring Cloud Netflix 到云原生新生態

過去十年,Spring Cloud 憑借 Netflix 全家桶(Eureka、Ribbon、Hystrix、Zuul 等)幾乎成為 Java 微服務的事實標準。但隨著這些核心組件逐步停止更新或進入維護模式,微服務架構正經歷一場深刻的演進。新的微服務架構更加注重 云原生兼容性、社區活躍度、企業級穩定性和低運維…

網絡流量分析——基礎知識

文章目錄所需技能和知識TCP/IP 堆棧和 OSI 模型基本網絡概念常用端口和協議IP 數據包和子層的概念協議傳輸封裝環境與設備常見的流量分析工具BPF 語法執行網絡流量分析NTA工作流程NTA工作流程網絡 - 第 1-4 層OSI / TCP-IP 模型尋址機制MAC地址IP 尋址IPv4IPv6IPv6 尋址類型IPv…

ansible playbook 實戰案例roles | 實現基于 IHS 的 AWStats 訪問監控系統

文章目錄一、核心功能描述二、roles內容2.1 文件結構2.2 主配置文件2.3 tasks文件內容三、files文件內容四、關鍵價值免費個人運維知識庫&#xff0c;歡迎您的訂閱&#xff1a;literator_ray.flowus.cn 一、核心功能描述 這個 Ansible Role 的核心功能是&#xff1a;?實現 ?…

DELL服務器 R系列 IPMI的配置

1、iDRAC功能默認都是關閉&#xff0c;需要在BIOS面啟用&#xff0c;首先重啟計算機&#xff0c;按F2然后進入BIOS&#xff0c;選擇iDRAC Setting進行iDRAC配置 2、重置一下idrac卡-重置才能恢復默認密碼 3、進入iDRAC Setting之后&#xff0c;選擇設置網絡Network 4、啟用iDRA…

模式組合應用-橋接模式(一)

寫在前面Hello&#xff0c;我是易元&#xff0c;這篇文章是我學習設計模式時的筆記和心得體會。如果其中有錯誤&#xff0c;歡迎大家留言指正&#xff01;文章為設計模式間的組合使用&#xff0c;涉及代碼較多&#xff0c;個人覺得熟能生巧&#xff0c;希望自己能從中學習到新的…

【clion】visual studio的sln轉cmakelist并使用clion構建32位

我想在linux上運行,所以先轉為cmake工程 例如可以把exe mfc 部分不構建,這樣ubuntu就不用移植。 先轉cmakelist,而后clion完成win32的構建,與vs構建對比,驗證腳本正確性。 Vcxproj2CMake https://github.com/gns333/Vcxproj2CMake cmakeconverter https://github.com/pave…

MySQL之分區功能

序言 隨著業務發展&#xff0c;我們維護的項目數據庫中的數據可能會越來越大&#xff0c;那么單張表的數據變多后&#xff0c;接口查詢效率可能會變慢&#xff0c;那我們就直接照抄大廠常見的分庫分表嗎&#xff1f;—— 當然不是的&#xff0c;分庫分表不是萬能的。 分庫分表…

java_spring boot 中使用 log4j2 及 自定義layout設置示例

1. log4j2對比 原始Logback 優勢 對于 Spring Boot 3.x&#xff0c;Logback 是默認日志框架&#xff0c;但在高并發、異步日志場景下&#xff0c;Log4j2 通常表現更優。當業務百萬級用戶、微服務、日志量大時&#xff1a; ? 1. Logback&#xff08;默認 Spring Boot 集成&am…