




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
基于Java的短視頻小程序系統(tǒng)的設(shè)計(jì)摘要隨著移動(dòng)通信和網(wǎng)絡(luò)設(shè)備的日益發(fā)展和普及,通過(guò)智能手機(jī)等便攜式移動(dòng)設(shè)備進(jìn)行咨詢信息的使用者人群己經(jīng)遠(yuǎn)遠(yuǎn)多于了傳統(tǒng)的報(bào)紙、電視、廣播,乃至是計(jì)算機(jī)用戶。在這樣的時(shí)代環(huán)境下,短視頻逐漸發(fā)展成為主流并在國(guó)內(nèi)也得到了快速的發(fā)展,也逐漸成為繼文字、圖片之后在社交平臺(tái)上出現(xiàn)的新的信息承載方式。本篇論文是通過(guò)JavaWeb技術(shù)及其相關(guān)框架進(jìn)行開(kāi)發(fā)“短視頻微信小程序”,從而更深入的了解和探討有關(guān)短視頻方向的基本需求和發(fā)展趨勢(shì)。在開(kāi)發(fā)過(guò)程中采用了建立動(dòng)態(tài)網(wǎng)站的幾種主要技術(shù)和框架,如Spring、Springboot、Mybatis、SpringMVC等。在基于以上幾種框架與技術(shù)來(lái)進(jìn)行在短視頻微信小程序的開(kāi)發(fā)和設(shè)計(jì)中,主要研究了有關(guān)短視頻觀看的需求分析,后臺(tái)管理系統(tǒng)的主要功能需求。本次“短視頻微信小程序”的總體思路是根據(jù)需求分析進(jìn)行角色確立以及類的確立,之后再根據(jù)角色與類對(duì)后臺(tái)系統(tǒng)的數(shù)據(jù)庫(kù)及表乃至類型進(jìn)行分析與設(shè)計(jì),完成數(shù)據(jù)庫(kù)工作之后用Java語(yǔ)言進(jìn)行各類、各服務(wù)接口的編寫,最終再將微信小程序的前臺(tái)和后臺(tái)兩大部分進(jìn)行結(jié)合。此次的開(kāi)發(fā)主要實(shí)現(xiàn)了短視頻軟件的基本功能如短視頻觀看、點(diǎn)贊、評(píng)論、轉(zhuǎn)發(fā)、舉報(bào)功能、用戶之間的關(guān)注以及后臺(tái)管理對(duì)短視頻進(jìn)行管理等功能。本次開(kāi)發(fā)系統(tǒng)的過(guò)程符合遵循軟件工程基本開(kāi)發(fā)流程和原理,采用J2EE技術(shù)常用的MVC與三層結(jié)構(gòu)即Model模型、View視圖和Controller控制器,使用了市面上較為流行和普遍使用的SSM架構(gòu)即Spring、SpringMVC、Mybatis以及Springboot框架,其中Springmvc負(fù)責(zé)實(shí)現(xiàn)Web應(yīng)用程序等功能,Spring容器負(fù)責(zé)實(shí)現(xiàn)各類的生命周期以及依賴等功能,而本次的數(shù)據(jù)交互層選擇采用Mybatis框架進(jìn)行與數(shù)據(jù)庫(kù)的連接。關(guān)鍵字短視頻;微信小程序;J2EE;Spring;Myabits目錄1 前言 11.1課題研究背景 11.2研究方法 21.3研究目的與意義 22 開(kāi)發(fā)環(huán)境及工具 42.1 開(kāi)發(fā)工具簡(jiǎn)介 42.1.1JDK簡(jiǎn)介 42.1.2MySQL簡(jiǎn)介 42.1.3Tomcat簡(jiǎn)介 42.1.4Spring簡(jiǎn)介 42.1.5JDBC簡(jiǎn)介 52.1.6Springboot簡(jiǎn)介 52.1.7Mybatis簡(jiǎn)介 52.1.8Redis簡(jiǎn)介 52.2 本章小結(jié) 63 需求分析 83.1系統(tǒng)需求概述 83.2系統(tǒng)非功能性要求 93.3本章小結(jié) 94 系統(tǒng)總體設(shè)計(jì) 114.1 UML建模 114.2 體系結(jié)構(gòu) 114.2.1 邏輯結(jié)構(gòu) 134.2.2 數(shù)據(jù)流程 144.3 業(yè)務(wù)流程 124.4 狀態(tài)模型 124.5 本章小結(jié) 125系統(tǒng)詳細(xì)設(shè)計(jì)與實(shí)現(xiàn) 165.1前臺(tái)功能模塊實(shí)現(xiàn) 165.1.1實(shí)現(xiàn)注冊(cè)登錄 165.1.2實(shí)現(xiàn)短視頻列表 205.1.3實(shí)現(xiàn)短視頻詳情頁(yè) 225.1.4實(shí)現(xiàn)用戶頁(yè)面 245.2數(shù)據(jù)庫(kù)設(shè)計(jì) 286系統(tǒng)測(cè)試 307結(jié)論 30參考文獻(xiàn) 31前言1.1課題研究背景短視頻行業(yè)在我國(guó)的發(fā)展可謂是如日方升。以智能手機(jī)為主的移動(dòng)終端為基礎(chǔ)的短視頻APP以及網(wǎng)站在我國(guó)已經(jīng)有近十年的發(fā)展歷史。這一十年被社會(huì)大眾稱為“新時(shí)代風(fēng)口”。短視頻的“短”一般表示視頻時(shí)間不超過(guò)五分鐘,這樣的視頻滿足用戶處理碎片時(shí)間問(wèn)題。在此基礎(chǔ)上,短視頻行業(yè)的各大企業(yè)都致力于數(shù)據(jù)收集以及算法分析,并最終推算出符合用戶大致口味的短視頻,這使得用戶對(duì)短視頻的熱衷程度和依賴程度越來(lái)越深。而用戶本身可以使用有攝像功能的智能手機(jī)進(jìn)行視頻拍攝并在拍攝后進(jìn)行簡(jiǎn)單的剪輯和加工,在滿足普通視頻創(chuàng)作和有關(guān)短視頻平臺(tái)規(guī)范后隨時(shí)可以上傳到短視頻平臺(tái)。此外,短視頻無(wú)論在短視頻平臺(tái)還是在各大流行社交平臺(tái)都可以進(jìn)行分享和觀察。與傳統(tǒng)的單一表達(dá)形式如圖片、文字和音頻相比,短視頻的優(yōu)勢(shì)體現(xiàn)在是能將視覺(jué)和聽(tīng)覺(jué)結(jié)合起來(lái),在短時(shí)間內(nèi)滿足用戶的體驗(yàn),形成傳統(tǒng)表達(dá)形式不可比的感官刺激。這無(wú)疑使得短視頻成為當(dāng)下社會(huì)最為吸引年輕人眼球的媒介。通過(guò)對(duì)各個(gè)短視頻平臺(tái)進(jìn)行市場(chǎng)滲透率的計(jì)算,可以看出市場(chǎng)滲透率,排位最靠前的分別為快手,火山小視頻,西瓜視頻。計(jì)算市場(chǎng)滲透率同比增幅,可以看出抖音短視頻的市場(chǎng)滲透率同比增幅比其他短視頻平臺(tái)要高。其中西瓜視頻的市場(chǎng)滲透率,同比增幅在240%左右。同時(shí)抖音短視頻均值同比增幅,呈現(xiàn)出比較顯著的成績(jī)。短視頻的本質(zhì)上有較高的應(yīng)用性,一方面有較高的理論價(jià)值,另一方面也有較高的實(shí)踐意義,所以本篇文章的側(cè)重點(diǎn)是對(duì)短視頻部分功能進(jìn)行研究和分析,除了查閱大量的參考文獻(xiàn)之外結(jié)合自己所學(xué)的開(kāi)發(fā)技術(shù),對(duì)此小程序進(jìn)行設(shè)計(jì)與開(kāi)發(fā),使自身對(duì)開(kāi)發(fā)相關(guān)的理論以及當(dāng)下短視頻現(xiàn)狀更加深入淺出,對(duì)短視頻的發(fā)展趨勢(shì)的發(fā)展具有參考性和可操作性。1.2系統(tǒng)的研究現(xiàn)狀本課題的選取是基于目前我國(guó)互聯(lián)網(wǎng)行業(yè)迅速發(fā)展勢(shì)頭良好的大環(huán)境下短視頻行業(yè)存在于繼續(xù)發(fā)展的必然性和必要性。在我國(guó)大市場(chǎng)下,短視頻已經(jīng)走過(guò)了四個(gè)階段分別是準(zhǔn)備期、轉(zhuǎn)型期、高速發(fā)展期、到現(xiàn)在的穩(wěn)定期。在準(zhǔn)備期之時(shí),智能手機(jī)、wifi和3G網(wǎng)絡(luò)的普及讓秒拍、美拍等短視頻行業(yè)開(kāi)始出現(xiàn)。隨著網(wǎng)絡(luò)設(shè)備基礎(chǔ)設(shè)施不斷發(fā)展完善,4G網(wǎng)絡(luò)的出現(xiàn)讓各大短視頻平臺(tái)開(kāi)始分發(fā)渠道多元化。在高速發(fā)展期,字節(jié)跳動(dòng)推出西瓜視頻和抖音短視頻,并靠成熟的智能算法吸引了市場(chǎng)上絕大用戶迅速占領(lǐng)了風(fēng)口,許多互聯(lián)網(wǎng)大廠都開(kāi)始在短視頻領(lǐng)域開(kāi)始布局,因此短視頻行業(yè)在這個(gè)階段得到了迅速發(fā)展。在經(jīng)過(guò)一兩年的沉淀后,短視頻市場(chǎng)進(jìn)入了穩(wěn)定格局,很多短視頻公司進(jìn)行業(yè)務(wù)拓展、探索更多元化和深層次商業(yè)模式更有甚者開(kāi)始布局海外市場(chǎng)并取得了較好的效果。近三年來(lái),國(guó)內(nèi)市場(chǎng)基本已成定局,海外發(fā)展成為短視頻企業(yè)另謀出路獲取更大利益的最好選擇,熱門巨頭快手和字節(jié)跳動(dòng)最典型的企業(yè)代表。兩家企業(yè)在海外擴(kuò)展都分別獲得不俗的成績(jī),在美國(guó)、印度等地都出臺(tái)了相應(yīng)APP提供給海外用戶,盡管在2020年8月,TikTop海外版遭到了美國(guó)政客的威脅并被美國(guó)政府要求關(guān)閉出售業(yè)務(wù)。由于短視頻上傳機(jī)制、入門門檻低和自我審查機(jī)制少,因此在快速發(fā)展的過(guò)程中,大量不良低俗低級(jí)、虛假信息、涉嫌抄襲和侵犯版權(quán)的短視頻冒出水面。隨著問(wèn)題暴露愈發(fā)嚴(yán)重,我國(guó)相關(guān)監(jiān)管部門開(kāi)始對(duì)短視頻進(jìn)行相關(guān)監(jiān)管和制定相關(guān)法律工作。在開(kāi)發(fā)技術(shù)現(xiàn)狀上,Java語(yǔ)言悠久的發(fā)展歷史讓其在當(dāng)下開(kāi)發(fā)語(yǔ)言中仍有一席之地,Java語(yǔ)言當(dāng)前最新版本是JDK15,已經(jīng)推出了較多新特性,Java無(wú)論在網(wǎng)絡(luò)編程,數(shù)據(jù)庫(kù)操作還是類、方法的封裝都有強(qiáng)大的功能,這使得部分開(kāi)發(fā)人員更青睞于Java開(kāi)發(fā)。而SpringBoot的發(fā)展從2014年出現(xiàn)在人們眼球吸引了大量開(kāi)源愛(ài)好者參與研究和開(kāi)發(fā)到現(xiàn)在已經(jīng)發(fā)展了七個(gè)年頭。根據(jù)網(wǎng)上資料顯示,SpringBoot在美國(guó)和中國(guó)的整體使用頻率保持一致。社區(qū)對(duì)SpringBoot的熱情也讓Spring官方更加注重的SpringBoot框架的穩(wěn)定和發(fā)展。1.3研究目的與意義課題在結(jié)束研究之后,想要達(dá)到的基本要求有:1.實(shí)現(xiàn)小程序的核心功能:用戶注冊(cè)登錄注銷、用戶上傳頭像、查看用戶信息、觀看短視頻、用戶上傳短視頻相關(guān)操作、通過(guò)關(guān)鍵字搜索相關(guān)視頻、用戶與用戶間的關(guān)注、用戶與視頻間的點(diǎn)贊收藏與舉報(bào)功能、管理員上傳BGM、管理員對(duì)用戶的操作與管理等功能;2.為用戶提供短視頻的觀看或收藏下載功能。因?yàn)榧谝粭l所述的眾多功能,平臺(tái)的所有操作流程都梳理明確,實(shí)現(xiàn)過(guò)程都能一步到位的,并且在每個(gè)環(huán)節(jié)都有相當(dāng)嚴(yán)格的規(guī)范化設(shè)置;3.全面直觀的了解短視頻的信息以及用戶情況,實(shí)時(shí)都能一目了然的知道用戶和視頻的相關(guān)信息,可以查看到用戶對(duì)哪類視頻偏愛(ài)或違規(guī)視頻;4.最終的要求希望所研究的課題能夠落實(shí)到真實(shí)的生活當(dāng)中,開(kāi)發(fā)的短視頻平臺(tái)不僅能夠?yàn)橛脩籼峁┍憷?,更讓這個(gè)平臺(tái)在被用戶能夠在使用過(guò)后仍能被堅(jiān)持,擁有長(zhǎng)期的良好信譽(yù)和安全支撐。開(kāi)發(fā)環(huán)境及工具開(kāi)發(fā)工具簡(jiǎn)介2.1.1JDK簡(jiǎn)介JDK是Javadevelopmentkit,官方解釋為Java標(biāo)準(zhǔn)版開(kāi)發(fā)包,也就是Java開(kāi)發(fā)所需要的工具包。JVM、JRE和JDK是Java三大概念。JVM即JavaVirtualMachine,Java虛擬機(jī)是一個(gè)虛構(gòu)的計(jì)算機(jī),其廣義作用是在真實(shí)的計(jì)算機(jī)上模擬實(shí)現(xiàn)計(jì)算機(jī)的各種功能。此外,Java虛擬機(jī)有著其較為獨(dú)特完善的硬件結(jié)構(gòu)如處理器、堆棧、寄存器和指令系統(tǒng)等。作用實(shí)現(xiàn)具體體現(xiàn)在JVM作為Java字節(jié)碼的執(zhí)行引擎,可以根據(jù)獨(dú)特的規(guī)則優(yōu)化class字節(jié)碼文件并轉(zhuǎn)化為效率更高的機(jī)器指令。雙親委派機(jī)制是JVM進(jìn)行類裝載的重要機(jī)制,由類加載器與其子類進(jìn)行實(shí)現(xiàn)。Bootstrap類加載器:主要負(fù)責(zé)加載Java的核心類庫(kù)如lang包等;Ext類加載器:負(fù)責(zé)加載部分?jǐn)U展的jar,一般是指在jre/lib/ext目錄下的;App類加載器:負(fù)責(zé)加載應(yīng)用程序的主函數(shù)類。JVM在這三者關(guān)系中處于最底層,負(fù)責(zé)與需要運(yùn)行的操作系統(tǒng)進(jìn)行交互。而有關(guān)Java的跨平臺(tái)性主要體現(xiàn)在JVM,因?yàn)椴煌牟僮飨到y(tǒng)對(duì)應(yīng)著不同的JVM。JRE即JavaRuntimeenvironment從底層來(lái)說(shuō)是一個(gè)軟件,包含了Java虛擬機(jī)和與Java相關(guān)的基礎(chǔ)類庫(kù)。而JDK作為三者的最高層,包含了JRE與其相關(guān)的開(kāi)發(fā)、監(jiān)控和分析工具如用于編譯Java源碼的編譯器javac、用于監(jiān)控程序運(yùn)行情況的監(jiān)控工具jconsole、以及用于分析的工具jvisualvm等。2.1.2MySQL簡(jiǎn)介MySQL是一個(gè)開(kāi)源的關(guān)系型數(shù)據(jù)庫(kù),被廣泛地應(yīng)用在互聯(lián)網(wǎng)開(kāi)發(fā)中。其中不乏很多大型互聯(lián)網(wǎng)公司選擇將主線業(yè)務(wù)部署到MySQL中,更多的中小型網(wǎng)站更是青睞于其微乎其微的成本、體積小速度快成本低、有不同的存儲(chǔ)引擎對(duì)應(yīng)不同的存儲(chǔ)模式,開(kāi)源和簡(jiǎn)單易用等特點(diǎn),而選擇MySQL作為網(wǎng)站開(kāi)發(fā)時(shí)的數(shù)據(jù)庫(kù),因而在保證功能實(shí)現(xiàn)且運(yùn)行穩(wěn)定的基礎(chǔ)上節(jié)省了開(kāi)發(fā)成本。2.1.3Tomcat簡(jiǎn)介Tomcat服務(wù)器是一個(gè)用于部署JSP和Servlet的Web應(yīng)用服務(wù)器,是目前各企業(yè)較為流行使用的一個(gè)輕量級(jí)服務(wù)器,在中小型系統(tǒng)和低并發(fā)、訪問(wèn)量不大的系統(tǒng)被普遍使用。Tomcat服務(wù)器具有技術(shù)先進(jìn),性能穩(wěn)定,開(kāi)源免費(fèi)等特點(diǎn),是目前學(xué)習(xí)與開(kāi)發(fā)JavaWeb應(yīng)用程序的首選,所以本次服務(wù)器部署采用Tomcat服務(wù)器。2.1.4Spring簡(jiǎn)介Spring是一個(gè)開(kāi)源框架,是為了解決由于軟件開(kāi)發(fā)的復(fù)雜性問(wèn)題如耦合度高,可維護(hù)性低。主要是利用最基本的JavaBean來(lái)完成未開(kāi)發(fā)前只可以使用EJB完成的功能。Spring的作用不僅僅體現(xiàn)在服務(wù)端的開(kāi)發(fā),更讓大部分Java程序受益的是,Spring讓Java程序變得更為簡(jiǎn)潔易懂,提高了可測(cè)試性,大幅降低了耦合度。Spring簡(jiǎn)單來(lái)說(shuō)就是一個(gè)用于創(chuàng)建對(duì)象容器實(shí)現(xiàn)了創(chuàng)建到反射的過(guò)程,用戶可以把對(duì)象的創(chuàng)建、管理和維護(hù)對(duì)象的狀態(tài)以及各對(duì)象的依賴關(guān)系交予Spring容器。Spring最重要兩個(gè)思想是IOC和AOP,IOC即控制反轉(zhuǎn),這是一種促進(jìn)松耦合的技術(shù)思想。一個(gè)對(duì)象依賴其他對(duì)象們時(shí),其他對(duì)象們并不是由原對(duì)象進(jìn)行創(chuàng)建或查詢依賴,而是會(huì)通過(guò)被動(dòng)傳遞的方式傳遞給原對(duì)象。AOP即面向切面編程,在我們的日常開(kāi)發(fā)中,會(huì)出現(xiàn)大量重復(fù)編寫但與業(yè)務(wù)邏輯無(wú)關(guān)的代碼,而Spring提供了一個(gè)很好的支持去分離應(yīng)用業(yè)務(wù)邏輯和系統(tǒng)級(jí)服務(wù)如權(quán)限判斷和事務(wù)管理等。這樣子實(shí)現(xiàn)后,應(yīng)用對(duì)象就可以只負(fù)責(zé)解決業(yè)務(wù)邏輯問(wèn)題,它們并不負(fù)責(zé)甚至意識(shí)不到其他的系統(tǒng)關(guān)注點(diǎn)如日志系統(tǒng)。2.1.5JDBC簡(jiǎn)介JDBC,JavaDataBaseConnectivity,java數(shù)據(jù)庫(kù)連接,是Java連接市面上流行數(shù)據(jù)庫(kù)的一種準(zhǔn)則,可以通過(guò)Java的接口執(zhí)行數(shù)據(jù)庫(kù)的SQL語(yǔ)句,由一系列的Java接口和類組合而成,為多種數(shù)據(jù)庫(kù)提供統(tǒng)一訪問(wèn)服務(wù)。它與Java結(jié)合使用功能穩(wěn)健簡(jiǎn)潔,也使得像本系統(tǒng)這種類似于短視頻的用戶服務(wù)和視頻服務(wù)能夠擁有更好的獲取信息的方法。2.1.6SpringBoot簡(jiǎn)介SpringBoot是在Spring框架的基礎(chǔ)上功能更為強(qiáng)大,開(kāi)發(fā)更為簡(jiǎn)便的全新框架。從本質(zhì)上來(lái)講,SpringBoot其實(shí)是部分庫(kù)的集合,大部分項(xiàng)目的構(gòu)建系統(tǒng)都可以使用SpringBoot。與常規(guī)的Spring框架相比,最大的不同點(diǎn)是SpringBoot內(nèi)嵌了Tomcat服務(wù)器或Jetty服務(wù)器,可以基于Maven等其他插件,創(chuàng)建獨(dú)立的Spring應(yīng)用程序或可執(zhí)行的JARs和WARs,而非手動(dòng)部署到服務(wù)器。SpringBoot提供了一個(gè)yml文件用于確定各對(duì)象屬性的值,這使得開(kāi)發(fā)和后續(xù)維護(hù),修改更為便利。SpringBoot也是有兩個(gè)較為重要的思想,第一個(gè)是OutOfBox即開(kāi)箱即用,指的是在我們開(kāi)發(fā)過(guò)程中,管理對(duì)象的生命周期首先要通過(guò)MAVEN的pom.xml文件填寫所需要依賴的jar包再在相應(yīng)引用的地方用注解代替煩瑣的xml配置文件。這使得開(kāi)發(fā)工作可以更加專注在業(yè)務(wù)邏輯代碼的編寫上而非復(fù)雜的配置工作和依賴的管理。第二個(gè)是約定優(yōu)于配置,意思是由SpringBoot框架來(lái)決定目標(biāo)結(jié)構(gòu),然后開(kāi)發(fā)者在此結(jié)構(gòu)基礎(chǔ)上增加額外的信息的軟件設(shè)計(jì)范式。2.1.7Mybatis簡(jiǎn)介MyBatis本是apache的一個(gè)開(kāi)源項(xiàng)目iBatis。在傳統(tǒng)的JDBC連接數(shù)據(jù)庫(kù)時(shí),需要用戶編寫大量有關(guān)類,注冊(cè)驅(qū)動(dòng)、創(chuàng)建connection和statement、配置連接相關(guān)的參數(shù)、結(jié)果集封裝和檢索等大量重復(fù)的工作。而Mybatis正是為了解決這種繁瑣的情況,更好地讓開(kāi)發(fā)者專注于SQL語(yǔ)句的編寫從而封裝了JDBC操作數(shù)據(jù)庫(kù)的方法和過(guò)程。Mybatis的出現(xiàn)幾乎讓開(kāi)發(fā)者把所有JDBC相關(guān)代碼和參數(shù)配置工作從開(kāi)發(fā)工作中消除。Mybatis有兩種方式進(jìn)行執(zhí)行各操作,xml配置和注解方式。Xml配置是最為常見(jiàn)的,我們?cè)谂渲梦募飳?duì)Java的POJOs和接口映射成數(shù)據(jù)庫(kù)的表和字段,并在mapper文件對(duì)各SQL語(yǔ)句進(jìn)行編寫。Mybatis應(yīng)用程序生成的流程大致是,從一個(gè)xml配置文件中或一個(gè)預(yù)定配置類生成SqlSessionFactoryBuilder,再讓SqlSessionFactoryBuilder實(shí)例化SqlSessionFactory,最終由SqlSessionFactory工廠模式進(jìn)行實(shí)例化Mybatis應(yīng)用。如果市面上已經(jīng)出現(xiàn)大量的Mybatis自動(dòng)生成配置文件的免費(fèi)插件,這使得我們?cè)陂_(kāi)發(fā)過(guò)程更加簡(jiǎn)便,從而更專注于SQL語(yǔ)句的編寫,達(dá)到了對(duì)SQL和程序編碼的解耦。2.1.8Redis簡(jiǎn)介redis是一個(gè)由C語(yǔ)言編寫的高性能NoSQL系列的非關(guān)系型數(shù)據(jù)庫(kù)。而非關(guān)系型數(shù)據(jù)庫(kù)在如今較為流行的有Memcached和redis,兩者相似之處是它們都支持多種存儲(chǔ)類型,任何一種存儲(chǔ)類型都是以key-value的形式進(jìn)行存儲(chǔ)。存儲(chǔ)類型包括String字符串、List鏈表、Set集合、Zset有序集合和Hash哈希。針對(duì)這些數(shù)據(jù)類型redis對(duì)它們都有各自獨(dú)特的操作,常用常見(jiàn)的有String的set/get、List的LPOP/LPUSHRPOP/RPUSH、Set的Sadd/SPOP、Zset的ZADD/ZREM和Hash的HSET和HDEL等此外還包括數(shù)學(xué)集合的運(yùn)算如取交集并集和差集。任何Redis對(duì)數(shù)據(jù)類型的操作都是原子性的,但其事務(wù)不包括回滾性和原子性。Redis之所以高性能是因?yàn)樗鷐emcached一樣,數(shù)據(jù)都是緩存在內(nèi)存當(dāng)中,存取效率非???。跟Memcached不同的是redis有兩種持久化方式,會(huì)定時(shí)周期的把數(shù)據(jù)寫入磁盤,AOF和RDB,在此之上redis還實(shí)現(xiàn)了主從復(fù)制和哨兵模式。本章小結(jié)本章講解本次小程序系統(tǒng)的技術(shù)要求,主要是將制作本系統(tǒng)使用到的工具:JDK、MySQL、Tomcat、Redis、Spring、Springboot等技術(shù)和框架作了概述,同時(shí)對(duì)支持小程序技術(shù)的相關(guān)技術(shù)—JDBC和Mybatis作了詳細(xì)地講解,下一步系統(tǒng)將使用這些技術(shù)對(duì)系統(tǒng)做全面的開(kāi)發(fā),本章為下面的開(kāi)發(fā)及測(cè)試提供了鋪墊。需求分析系統(tǒng)需求概述隨著現(xiàn)代社會(huì)互聯(lián)網(wǎng)的迅速發(fā)展,越來(lái)越多的人熱愛(ài)短視頻。許多手機(jī)使用者為有利用短視頻填補(bǔ)空閑時(shí)間,也有通過(guò)短視頻在短時(shí)間內(nèi)獲取有用信息,但是也有用戶投入大量精力和時(shí)間的情況出現(xiàn),所以針對(duì)出現(xiàn)的這種狀況,要采取合適的短視頻平臺(tái)系統(tǒng)。因此設(shè)計(jì)合適參與角色能更好的幫助用戶管理和利用好短視頻。本系統(tǒng)的實(shí)現(xiàn)流程如圖3-1。3-1系統(tǒng)實(shí)現(xiàn)流程圖此處的系統(tǒng)功能性模塊主要依據(jù)使用者的區(qū)別進(jìn)行相關(guān)分配。3-2系統(tǒng)具體模塊圖它們各自的功能如下所述:前臺(tái)部分前臺(tái)部分主要包括一下幾個(gè)方面,用戶的注冊(cè)登錄注銷,修改信息,用戶瀏覽所有短視頻,評(píng)論短視頻,點(diǎn)贊或收藏短視頻,上傳短視頻,關(guān)注其他用戶,舉報(bào)短視頻和通過(guò)關(guān)鍵字瀏覽短視頻等。這里的使用對(duì)象主要是用戶。首先用戶可以方便地注冊(cè)和登錄。若還未注冊(cè)的顧客只能進(jìn)行短視頻的瀏覽,不能進(jìn)行用戶間的交互和與視頻的交互;未注冊(cè)的用戶可進(jìn)入注冊(cè)頁(yè)面進(jìn)行注冊(cè),然后可以進(jìn)行到個(gè)人頁(yè)面進(jìn)行信息確定,頭像上傳等。用戶可以地靈活的通過(guò)關(guān)鍵字對(duì)偏愛(ài)的短視頻進(jìn)行搜索瀏覽。用戶可以在瀏覽短視頻頁(yè)面查看視頻發(fā)布者信息,對(duì)視頻進(jìn)行點(diǎn)贊,對(duì)視頻進(jìn)行收藏,對(duì)視頻進(jìn)行評(píng)論和對(duì)視頻進(jìn)行舉報(bào)等。用戶還可以關(guān)注其他用戶,以便在關(guān)注頁(yè)面觀看關(guān)注者所發(fā)布的視頻。(2)后臺(tái)部分后臺(tái)部分,管理員必須登錄才能進(jìn)行管理。管理員可以對(duì)系統(tǒng)進(jìn)行相應(yīng)的操作。管理員可以查看所有用戶信息。管理員可以對(duì)bgm進(jìn)行上傳。管理員可以查看所有視頻信息,也可查看被舉報(bào)視頻并進(jìn)行禁播操作。系統(tǒng)非功能性要求一個(gè)成熟軟件產(chǎn)品除了滿足用戶的功能性需求更應(yīng)該注重非功能性的需求。在開(kāi)發(fā)過(guò)程中,開(kāi)發(fā)者常常輕視甚至忽視一個(gè)軟件產(chǎn)品的非功能性需求這一重要方面。系統(tǒng)非功能性需求一般不會(huì)出現(xiàn)用戶的業(yè)務(wù)需求中,需要專業(yè)的分析人員根據(jù)實(shí)現(xiàn)溝通好的邏輯業(yè)務(wù)需求進(jìn)行調(diào)研等相關(guān)工作,系統(tǒng)非功能需求在某種程度上也可以決定一個(gè)軟件產(chǎn)品的適用與否。如果一個(gè)軟件單單滿足功能性需求而在非功能性需求方面沒(méi)有進(jìn)行規(guī)范的定義和實(shí)現(xiàn),結(jié)果一般都不會(huì)令人滿意,使得產(chǎn)品在實(shí)際應(yīng)用中錯(cuò)漏百出甚至喪失了滿足系統(tǒng)的功能性需求的能力。我們一般常說(shuō)的非功能性需求是指軟件產(chǎn)品為滿足用戶業(yè)務(wù)需求而必須具有的、除功能需求以外的特性。其中有幾個(gè)較為重要的參考指數(shù)分別是UI、易用性需求、安全性需求、系統(tǒng)完整性需求、可維護(hù)性和可擴(kuò)充性等。本次系統(tǒng)主要從安全、性能、可維護(hù)性、用戶體驗(yàn)和成本預(yù)算方面出發(fā)對(duì)非功能性需求進(jìn)行分析和實(shí)現(xiàn)。安全能夠防止SQL數(shù)據(jù)庫(kù)注入式攻擊能夠防止腳本源代碼泄露性能使用緩存等技術(shù)提供訪問(wèn)速度??删S護(hù)性使用Swagger2可快速查看接口信息并測(cè)試,以便維護(hù)。事先評(píng)估可變因素,并盡量將可預(yù)估的可變參數(shù)實(shí)現(xiàn)可配置化,從而減少更改源代碼的頻率。用戶體驗(yàn)易操作,頁(yè)面設(shè)計(jì)較為簡(jiǎn)單而實(shí)用。成本預(yù)算大量使用市面上較流行有技術(shù)保證的開(kāi)源免費(fèi)技術(shù)從而減少開(kāi)發(fā)成本。優(yōu)化系統(tǒng)后期運(yùn)維方式,減少運(yùn)維人力成本。本章小結(jié)本章主要介紹了系統(tǒng)功能要求和系統(tǒng)非功能性要求,系統(tǒng)功能性要求包括前臺(tái)部分和后臺(tái)部分,系統(tǒng)非功能性要求主要包括安全、性能、可維護(hù)性、用戶體驗(yàn)和成本預(yù)算。系統(tǒng)總體設(shè)計(jì)UML建模隨著面向?qū)ο缶幊痰目焖侔l(fā)展,在開(kāi)發(fā)上逐漸代替了面向過(guò)程編程。為了方便開(kāi)發(fā)系統(tǒng),加強(qiáng)對(duì)問(wèn)題的分析,讓各方人員更好的針對(duì)系統(tǒng)進(jìn)行討論和統(tǒng)一確定需求,UML建模技術(shù)應(yīng)時(shí)而生,UML是整個(gè)軟件產(chǎn)品開(kāi)發(fā)中一種圖形化建模語(yǔ)言,為使用者提供了多種圖形模型來(lái)構(gòu)建系統(tǒng)可視化模型,成為了當(dāng)今面向?qū)ο缶幊滩豢扇鄙俚囊徊糠帧sw系結(jié)構(gòu)RobJohnson在其著名作《ExpertOne-on-OneJ2EEDesignandDevelopment》中提到,傳統(tǒng)的J2EE架構(gòu)為確定web應(yīng)用與部署web應(yīng)用的服務(wù)器之間的通訊方式規(guī)定了一組編程接口,這組接口主要是針對(duì)web服務(wù)和業(yè)務(wù)對(duì)象等的一組規(guī)范。J2EE主要功能實(shí)現(xiàn)體現(xiàn)在建立一個(gè)web服務(wù)和服務(wù)器無(wú)關(guān)的標(biāo)準(zhǔn)以及讓服務(wù)器為了更便利地處理事務(wù)和高并發(fā)訪問(wèn)量等問(wèn)題從而讓服務(wù)器掌控控件的生命周期。J2EE定義了四個(gè)獨(dú)立邏輯層,分別是客戶層、表示層、業(yè)務(wù)層以及系統(tǒng)層。然而這種體系架構(gòu)在開(kāi)發(fā)、測(cè)試、性能和維護(hù)過(guò)程的表現(xiàn)實(shí)在令人失望,EJB在當(dāng)今開(kāi)發(fā)意味著低性能、難維護(hù)、開(kāi)發(fā)繁瑣和維護(hù)成本高。這種種現(xiàn)象表示傳統(tǒng)的J2EE架構(gòu)已有違背了“帕累托法則”的跡象。說(shuō)明了使用J2EE體系結(jié)構(gòu)會(huì)花費(fèi)大量時(shí)間精力去解決少數(shù)出現(xiàn)的復(fù)雜問(wèn)題而非用于為解決常見(jiàn)的問(wèn)題作出方案。從這本書(shū)當(dāng)中也誕生了著名的springframework也就是我們本次開(kāi)發(fā)使用的spring框架。Spring框架與J2EE架構(gòu)并非對(duì)立關(guān)系。Spring中也有大量使用和體現(xiàn)了J2EE的標(biāo)準(zhǔn)。比如Spring-mvc是在servlet之上的封裝。Springdata也實(shí)現(xiàn)了JPA等。4.2.1邏輯結(jié)構(gòu)1.UI層: 微信小程序:利用微信小程序獨(dú)特的語(yǔ)言將頁(yè)面和數(shù)據(jù)返回給用戶。2.業(yè)務(wù)邏輯層:(1)Interceptor:攔截所有業(yè)務(wù)調(diào)用請(qǐng)求,根據(jù)事先規(guī)定和編寫好的Interceptor類對(duì)所有業(yè)務(wù)調(diào)用請(qǐng)求進(jìn)行邏輯處理如權(quán)限驗(yàn)證,加載日志等或在數(shù)據(jù)返回給前端等情況進(jìn)行攔截對(duì)數(shù)據(jù)進(jìn)行加工。采用Spring-web的規(guī)范實(shí)現(xiàn)。(2)Controller:接收用戶的訪問(wèn)請(qǐng)求,先在類本身進(jìn)行參數(shù)處理然后調(diào)用業(yè)務(wù)邏輯層Service得到返回信息,并將數(shù)據(jù)或頁(yè)面返回給前臺(tái)微信小程序。(3)Service:核心業(yè)務(wù)邏輯實(shí)現(xiàn)類,根據(jù)需求分析來(lái)對(duì)各數(shù)據(jù)進(jìn)行操作。3.數(shù)據(jù)訪問(wèn)層:(1)DAO:數(shù)據(jù)訪問(wèn)接口,這里包括所有定義好的數(shù)據(jù)庫(kù)操作方法接口。然后編寫mapper的SQL語(yǔ)句最后通過(guò)Mybatis的mapper映射進(jìn)行對(duì)數(shù)據(jù)庫(kù)操作。(2)MemoryCache:數(shù)據(jù)層的緩沖機(jī)制,將頻繁使用的數(shù)據(jù)存儲(chǔ)在內(nèi)存緩存中。這里采用redisTemplete類進(jìn)行對(duì)redis操作實(shí)現(xiàn)。4-2系統(tǒng)邏輯架構(gòu)4.2.2數(shù)據(jù)流程業(yè)務(wù)提交數(shù)據(jù)流程:所有業(yè)務(wù)邏輯請(qǐng)求都會(huì)先在Incetceptor進(jìn)行權(quán)限判定,然后通過(guò)Springmvc的mapper找到相應(yīng)controller進(jìn)行handle,controller類會(huì)將接收到數(shù)據(jù)進(jìn)行初步的處理例如去空格等,然后controller會(huì)將數(shù)據(jù)傳遞給service層進(jìn)行邏輯處理再根據(jù)實(shí)際情況對(duì)數(shù)據(jù)進(jìn)行加工或存儲(chǔ)。而最終數(shù)據(jù)的流向一般都會(huì)流向數(shù)據(jù)庫(kù)MySQL,MySQL根據(jù)相應(yīng)SQL語(yǔ)句進(jìn)行操作并根據(jù)規(guī)定返回一個(gè)返回值給Service,一般在Service設(shè)置好返回類的屬性再經(jīng)controller返回給前臺(tái)。前臺(tái)再根據(jù)規(guī)定好的JSON規(guī)范作出相應(yīng)反應(yīng)。4-3業(yè)務(wù)提交數(shù)據(jù)流程業(yè)務(wù)流程活動(dòng)圖是UML中用于表示業(yè)務(wù)實(shí)例實(shí)現(xiàn)的工作流程,其本質(zhì)也是一種狀態(tài)圖,通過(guò)活動(dòng)圖我們可以簡(jiǎn)單明了的認(rèn)識(shí)此業(yè)務(wù)提供的價(jià)值所需要完成的任務(wù)。本節(jié)用活動(dòng)圖來(lái)表明本小程序中部分業(yè)務(wù)的流程和運(yùn)行順序。4-4系統(tǒng)主要業(yè)務(wù)流程狀態(tài)模型狀態(tài)一般用于表述對(duì)象在生命周期所處狀況,對(duì)象在生命周期必因?yàn)榉夏撤N條件而屬于其中一種狀態(tài),而狀態(tài)之間是可以轉(zhuǎn)換的,在UML規(guī)定的建模語(yǔ)言中,狀態(tài)圖用于對(duì)一個(gè)具體對(duì)象在其生命周期的過(guò)程進(jìn)行描述,記錄了其生存時(shí)的各種動(dòng)態(tài)行為和狀態(tài)變化。狀態(tài)圖一般由狀態(tài)、轉(zhuǎn)換、事件、活動(dòng)和動(dòng)作五個(gè)部分組成。使用狀態(tài)圖可以節(jié)省大量時(shí)間和文字描述來(lái)對(duì)對(duì)象生命周期進(jìn)行描述,也讓參與項(xiàng)目者特別是開(kāi)發(fā)者對(duì)事件順序有清晰的了解。本次小程序開(kāi)發(fā)中,附帶狀態(tài)的類是videos類,且有轉(zhuǎn)換狀態(tài)的情況出現(xiàn),本節(jié)將針對(duì)videos類對(duì)視頻的狀態(tài)轉(zhuǎn)換進(jìn)行分析。4-5視頻狀態(tài)轉(zhuǎn)換過(guò)程本章小結(jié)本章主要根據(jù)軟件工程規(guī)定的思想,在系統(tǒng)分析與設(shè)計(jì)階段對(duì)涉及到的業(yè)務(wù)或?qū)ο筮M(jìn)行UML建模實(shí)例,還對(duì)傳統(tǒng)的J2EE體系結(jié)構(gòu)和本次開(kāi)發(fā)所使用的Spring框架進(jìn)行分析和比較,具體包括對(duì)Spring框架的邏輯結(jié)構(gòu)進(jìn)行介紹,和對(duì)數(shù)據(jù)流向進(jìn)行簡(jiǎn)要的分析。在本次UML建模和系統(tǒng)設(shè)計(jì)階段,本人大量使用UML標(biāo)準(zhǔn)建模語(yǔ)言對(duì)系統(tǒng)的業(yè)務(wù)進(jìn)行繪制相應(yīng)的圖然而這些繪制圖都會(huì)展示系統(tǒng)的需求和發(fā)展流程從而使整個(gè)開(kāi)發(fā)階段更加生動(dòng)形象和抽象。在整個(gè)UML建模工作中,有大量圖可供選擇,常用的有用例圖、狀態(tài)圖、活動(dòng)圖等各種流程圖,在分析階段要根據(jù)分析對(duì)象和實(shí)際實(shí)現(xiàn)情況來(lái)決定哪種圖更能體現(xiàn)系統(tǒng)的需求和發(fā)展流程。本章節(jié)采用了其中幾種圖形如狀態(tài)圖,活動(dòng)圖等詳細(xì)地對(duì)系統(tǒng)用例、業(yè)務(wù)流程和系統(tǒng)發(fā)展流程進(jìn)行分析,使后續(xù)的開(kāi)發(fā)工作提供了一個(gè)清晰的依據(jù)。系統(tǒng)詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)數(shù)據(jù)庫(kù)設(shè)計(jì)表5.1用戶表字段名稱字段類型字段意義是否非空是否鍵值默認(rèn)值useridVARCHAR主鍵ID是主鍵無(wú)usernameVARCHAR用戶名是否無(wú)passwordVARCHAR密碼是否無(wú)face_imageVARCHAR頭像路徑否否無(wú)nicknameVARCHAR昵稱是否無(wú)fans_countsINT粉絲數(shù)否否0follow_countsINT關(guān)注數(shù)否否0receive_like_countsINT收到的點(diǎn)贊否否0表4.2bgm表字段名稱字段類型字段意義是否非空是否鍵值默認(rèn)值idVARCHAR主鍵ID是主鍵無(wú)authorVARCHAR作者名字是否無(wú)nameVARCHARBgm名字是否無(wú)pathVARCHAR存放路徑是否無(wú)表4.3評(píng)論表字段名稱字段類型字段意義是否非空是否鍵值默認(rèn)值idVARCHAR主鍵ID是主鍵無(wú)father_comment_idVARCHAR父評(píng)論ID否否無(wú)to_user_idVARCHAR被評(píng)論者ID否否無(wú)video_idVARCHAR視頻ID是否無(wú)from_user_idVARCHAR評(píng)論者ID是否無(wú)commentTEXT評(píng)論內(nèi)容是否無(wú)create_timeDATATIME評(píng)論時(shí)間是否無(wú)表4.4熱搜表字段名稱字段類型字段意義是否非空是否鍵值默認(rèn)值idVARCHAR主鍵ID是主鍵無(wú)contentVARCHAR內(nèi)容是否無(wú)表4.5用戶-粉絲表字段名稱字段類型字段意義是否非空是否鍵值默認(rèn)值idVARCHAR主鍵ID是主鍵無(wú)user_idVARCHAR被關(guān)注者ID是否無(wú)fan_idVARCHAR關(guān)注者ID是否無(wú)表4.6用戶喜歡視頻表字段名稱字段類型字段意義是否非空是否鍵值默認(rèn)值idVARCHAR主鍵ID是主鍵無(wú)user_idVARCHAR用戶ID是否無(wú)video_idVARCHAR視頻ID是否無(wú)表4.7舉報(bào)表字段名稱字段類型字段意義是否非空是否鍵值默認(rèn)值idVARCHAR主鍵ID是主鍵無(wú)deal_user_idVARCHAR被舉報(bào)者ID是否無(wú)deal_video_idVARCHAR被舉報(bào)視頻ID是否無(wú)titleVARCHAR類型標(biāo)題是否無(wú)contentVARCHAR內(nèi)容否否無(wú)useridVARCHAR舉報(bào)者ID是否無(wú)create_dateDATATIME舉報(bào)時(shí)間是否無(wú)表4.8訂單狀態(tài)表字段名稱字段類型字段意義是否非空是否鍵值默認(rèn)值idVARCHAR主鍵ID是主鍵無(wú)user_idVARCHAR發(fā)布者id是否無(wú)audio_idVARCHAR用戶使用音頻的信息否否無(wú)video_descVARCHAR視頻描述否否無(wú)video_pathVARCHAR視頻存放的路徑是否無(wú)video_secondsFLOAT視頻秒數(shù)否否無(wú)video_widthINT視頻寬度否否無(wú)video_heightINT視頻高度否否無(wú)cover_pathVARCHAR視頻封面圖否否無(wú)like_countsBIGINT喜歡/贊美的數(shù)量是否無(wú)statusINT視頻狀態(tài)是否無(wú)create_timeDATATIME創(chuàng)建時(shí)間是否無(wú)后端接口設(shè)計(jì)本后端接口是利用Java語(yǔ)言實(shí)現(xiàn),類與接口的組成可以參與第四章系統(tǒng)總體設(shè)計(jì)中4-2圖所示。大致可分為pojo類、mapper接口、service類、controller類和interceptor類,另外還包括一些公共類、配置類、Springboot獨(dú)特的啟動(dòng)類以及Swagger2類。圖5.1后端結(jié)構(gòu)5.2.1Pojo類Pojo類可以簡(jiǎn)單理解為簡(jiǎn)單的Java類,其一般的設(shè)置是根據(jù)數(shù)據(jù)庫(kù)中的數(shù)據(jù)表來(lái)進(jìn)行設(shè)計(jì),這樣就方便開(kāi)發(fā)者在連接數(shù)據(jù)庫(kù)后操作數(shù)據(jù)庫(kù)。有需要還可以根據(jù)實(shí)際開(kāi)發(fā)需要建立相應(yīng)的VO。圖5.2pojo類包一個(gè)pojo類一般只用于表示一個(gè)實(shí)體類的屬性以及簡(jiǎn)單的set/get操作等。以下以本設(shè)計(jì)最為重要的一個(gè)pojo類Videos類進(jìn)行分析。@DatapublicclassVideosimplementsSerializable{privateStringid;/**發(fā)布者id*/privateStringuserId;/**用戶使用音頻的信息*/privateStringaudioId;/**視頻描述*/privateStringvideoDesc;/**視頻存放的路徑*/privateStringvideoPath;/**視頻秒數(shù)*/privateDoublevideoSeconds;/**視頻寬度*/privateIntegervideoWidth;/**視頻高度*/privateIntegervideoHeight;/**視頻封面圖*/privateStringcoverPath;/**喜歡/贊美的數(shù)量*/privateLonglikeCounts;/**視頻狀態(tài):1、發(fā)布成功2、禁止播放,管理員操作*/privateIntegerstatus;/**創(chuàng)建時(shí)間*/privateDatecreateTime;privatestaticfinallongserialVersionUID=1L;}本次在pojo類部署上采用lombok的@Data注解,該注解可以讓開(kāi)發(fā)者不用編寫此類的get/set方法從而使代碼更為簡(jiǎn)潔。5.2.2Mapper接口Mapper接口又稱Dao接口,數(shù)據(jù)訪問(wèn)對(duì)象是一個(gè)面對(duì)對(duì)象的數(shù)據(jù)庫(kù)接口。一般在此接口中定義了操作數(shù)據(jù)庫(kù)的方法,再用具體實(shí)現(xiàn)類進(jìn)行實(shí)現(xiàn),但此次開(kāi)發(fā)采用了Mybatis作為Dao層開(kāi)發(fā)工具,則所有SQL語(yǔ)句都寫在xml而非源碼中。圖5.3mapper接口包以下我選擇BgmDao接口進(jìn)行具體分析,在此接口中我定義所有有關(guān)數(shù)據(jù)庫(kù)bgm表的方法。@Mapper@RepositorypublicinterfaceBgmDao{intdeleteByPrimaryKey(Stringid);intinsert(Bgmrecord);intinsertSelective(Bgmrecord);BgmselectByPrimaryKey(Stringid);intupdateByPrimaryKeySelective(Bgmrecord);intupdateByPrimaryKey(Bgmrecord);List<Bgm>list();BgmqueryBgmById(StringbgmId);} 而具體的SQL語(yǔ)句編碼放在resources/mappers包下的BgmDao.xml,由于xml文件有各種配置格式以及接口方法較多,此處選擇兩個(gè)方法具體展示:<updateid="updateByPrimaryKey"parameterType="com.hang.hangvideosdev.pojo.Bgm">updatebgmsetauthor=#{author,jdbcType=VARCHAR},`name`=#{name,jdbcType=VARCHAR},`path`=#{path,jdbcType=VARCHAR}whereid=#{id,jdbcType=VARCHAR}</update><selectid="list"resultMap="BaseResultMap">select<includerefid="Base_Column_List"></include>frombgm</select> 在使用Mybatisxml配置方式中一定要事先配置好xml的映射關(guān)系和mybatis必備的配置文件才能正常使用mybatis操作數(shù)據(jù)庫(kù)。5.2.3Service接口與具體實(shí)現(xiàn)類Service即服務(wù)層業(yè)務(wù)層,在此層一般用于處理業(yè)務(wù)邏輯,將多個(gè)Dao層的操作方法結(jié)合起來(lái)從而實(shí)現(xiàn)業(yè)務(wù)功能。一般Service層分為Service接口和具體實(shí)現(xiàn)類,這樣設(shè)計(jì)的目的是為了提高系統(tǒng)擴(kuò)展性。圖5.4mapper接口包以下選擇UserService接口進(jìn)行方法分析,并將其中一個(gè)具體方法進(jìn)行展示:publicinterfaceUserService{booleanqueryUsernameIsExist(Stringusername);voidsaveUser(Usersuser);UsersqueryUserForLogin(Stringusername,Stringpassword);JSONResultuploadFace(StringuserId,MultipartFile[]files,StringFILE_SPACE);JSONResultqueryUserInfo(StringuserId,StringfanId);JSONResultqueryPublisher(StringloginUserId,StringvideoId,StringpublishUserId);JSONResultsaveUserFanRelation(StringuserId,StringfanId);JSONResultdeleteUserFanRelation(StringuserId,StringfanId);JSONResultreportUser(UsersReportusersReport);}其中queryUserInfo方法是用于實(shí)現(xiàn)查詢用戶信息的:@Override@Transactional(propagation=Propagation.REQUIRED)publicJSONResultqueryUserInfo(StringuserId,StringfanId){UsersuserInfo=usersDao.queryUserInfo(userId);if(userInfo!=null){UsersVOuserVO=newUsersVO();BeanUtils.copyProperties(userInfo,userVO);StringuniqueToken=String.valueOf(redisTemplate.opsForValue().get(USER_REDIS_SESSION+":"+userId)).trim();userVO.setUserToken(uniqueToken);userVO.setFollow(usersFansDao.queryIsFollow(userId,fanId)==1?true:false);returnJSONResult.ok(userVO);}returnJSONResult.errorMsg("查詢失敗");}5.2.4Controller層與InterceptorController層是用于接受前端的訪問(wèn)請(qǐng)求,從而進(jìn)行簡(jiǎn)單的數(shù)據(jù)處理。此層讓開(kāi)發(fā)設(shè)計(jì)流程更為抽象歸納。以下將選擇UserController進(jìn)行分析:@RestController@Api(value="用戶相關(guān)業(yè)務(wù)的接口",tags={"用戶相關(guān)業(yè)務(wù)的controller"})@RequestMapping("/user")publicclassUserControllerextendsBasicController{@AutowiredprivateUserServiceuserService;@ApiOperation(value="用戶上傳頭像",notes="用戶上傳頭像的接口")@ApiImplicitParam(name="userId",value="用戶id",required=true,dataType="String",paramType="query")@PostMapping("/uploadFace")publicJSONResultuploadFace(StringuserId,@RequestParam("file")MultipartFile[]files)throwsException{if(StringUtils.isBlank(userId)){returnJSONResult.errorMsg("用戶id不能為空...");}returnuserService.uploadFace(userId,files,FILE_SPACE);}}在此userController上傳頭像接口中首先會(huì)對(duì)前端傳來(lái)的參數(shù)userId進(jìn)行校準(zhǔn),如為空或不符合標(biāo)準(zhǔn)將直接返回錯(cuò)誤信息而非調(diào)用userService的接口方法。Interceptor是用于在前端訪問(wèn)請(qǐng)求Controller前對(duì)訪問(wèn)進(jìn)行一個(gè)攔截,根據(jù)相關(guān)規(guī)則進(jìn)行放行或取消訪問(wèn),或在返回?cái)?shù)據(jù)時(shí)對(duì)數(shù)據(jù)進(jìn)行加工。publicclassMiniInterceptorimplementsHandlerInterceptor{ @Autowired publicRedisTemplateredisTemplate; publicstaticfinalStringUSER_REDIS_SESSION="user-redis-session"; /** *攔截請(qǐng)求,在controller調(diào)用之前 */ @Override publicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse, Objectarg2)throwsException{ StringuserId=request.getHeader("headerUserId"); StringuserToken=request.getHeader("headerUserToken"); if(StringUtils.isNotBlank(userId)&&StringUtils.isNotBlank(userToken)){ StringuniqueToken=String.valueOf(redisTemplate.opsForValue().get(USER_REDIS_SESSION+":"+userId)).trim(); if(StringUtils.isEmpty(uniqueToken)&&StringUtils.isBlank(uniqueToken)){ System.out.println("請(qǐng)登錄..."); returnErrorResponse(response,newJSONResult().errorTokenMsg("請(qǐng)登錄...")); returnfalse; }else{ if(!uniqueToken.equals(userToken)){ System.out.println("賬號(hào)被擠出..."); returnErrorResponse(response,newJSONResult().errorTokenMsg("賬號(hào)被擠出...")); returnfalse; } } }else{ System.out.println("請(qǐng)登錄..."); returnErrorResponse(response,newJSONResult().errorTokenMsg("請(qǐng)登錄...")); returnfalse; } /** *返回false:請(qǐng)求被攔截,返回 *返回true:請(qǐng)求OK,可以繼續(xù)執(zhí)行,放行 */ returntrue; }}此處對(duì)每一個(gè)請(qǐng)求訪問(wèn)對(duì)進(jìn)行攔截,然后判斷其請(qǐng)求所帶的一各參數(shù)Token進(jìn)行校對(duì),若與redis數(shù)據(jù)庫(kù)存的數(shù)據(jù)不一致或?yàn)榭諘r(shí)將攔截返回相關(guān)操作信息。5.2.5Commond公共類包與相關(guān)配置類Commond包一般存放在開(kāi)發(fā)過(guò)程頻繁使用到的類或工具類,這樣在開(kāi)發(fā)的過(guò)程就能避免重復(fù),使結(jié)構(gòu)更加清晰明了。以下就以Commond包下的JSONResult類進(jìn)行簡(jiǎn)要分析:publicclassJSONResult{//響應(yīng)業(yè)務(wù)狀態(tài)privateIntegerstatus;//響應(yīng)消息privateStringmsg;//響應(yīng)中的數(shù)據(jù)privateObjectdata;privateStringok; //不使用publicstaticJSONResultbuild(Integerstatus,Stringmsg,Objectdata){returnnewJSONResult(status,msg,data);}publicstaticJSONResultok(Objectdata){returnnewJSONResult(data);}publicstaticJSONResultok(){returnnewJSONResult(null);}publicstaticJSONResulterrorMsg(Stringmsg){returnnewJSONResult(500,msg,null);}publicstaticJSONResulterrorMap(Objectdata){returnnewJSONResult(501,"error",data);}publicstaticJSONResulterrorTokenMsg(Stringmsg){returnnewJSONResult(502,msg,null);}publicstaticJSONResulterrorException(Stringmsg){returnnewJSONResult(555,msg,null);}publicJSONResult(){}publicJSONResult(Integerstatus,Stringmsg,Objectdata){this.status=status;this.msg=msg;this.data=data;}publicJSONResult(Objectdata){this.status=200;this.msg="OK";this.data=data;}publicBooleanisOK(){returnthis.status==200;} ...}JSONResult類貫穿整個(gè)開(kāi)發(fā)流程,它作為一個(gè)跟返回結(jié)構(gòu)類,里面定義了狀態(tài)碼,信息和數(shù)據(jù),并包含各種簡(jiǎn)便方法來(lái)快速填補(bǔ)這三個(gè)信息以便更快地傳輸信息予前端。另外Springboot最重要的一個(gè)配置類WebMvcConfig.java:@ConfigurationpublicclassWebMvcConfigimplementsWebMvcConfigurer{@OverridepublicvoidaddResourceHandlers(ResourceHandlerRegistryregistry){registry.addResourceHandler("/**").addResourceLocations("classpath:/META-INF/resources/").addResourceLocations("file:D:/hang-videos-dev/");}@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(miniInterceptor()).addPathPatterns("/user/**");}@BeanpublicMiniInterceptorminiInterceptor(){returnnewMiniInterceptor();}@BeanpublicRedisTemplateredisTemplate(RedisConnectionFactoryfactory){RedisTemplate<String,String>redisTemplate=newRedisTemplate<>();redisTemplate.setConnectionFactory(factory);StringRedisSerializerstringRedisSerializer=newStringRedisSerializer();redisTemplate.setKeySerializer(stringRedisSerializer);redisTemplate.setHashKeySerializer(stringRedisSerializer);redisTemplate.setValueSerializer(stringRedisSerializer);redisTemplate.setHashValueSerializer(stringRedisSerializer);returnredisTemplate;}}這此配置類里,我們?cè)黾恿速Y源文件并將RedisTemplate和miniInterceptor配置進(jìn)Spring容器。前臺(tái)設(shè)計(jì)基于微信小程序的短視頻開(kāi)發(fā)主要實(shí)現(xiàn)了用戶的登錄注冊(cè)、短視頻列表、視頻詳情頁(yè)、個(gè)人主頁(yè)等功能頁(yè)面。5.3.1視頻列表展示頁(yè)首先一進(jìn)入這個(gè)頁(yè)面就會(huì)自動(dòng)調(diào)用接口函數(shù),把數(shù)據(jù)庫(kù)所有的視頻進(jìn)行查詢并通過(guò)一個(gè)長(zhǎng)方形圖片組件、圓形圖片組件和文本對(duì)視頻的信息、發(fā)布者頭像和名字進(jìn)行展示。此處采用了分頁(yè)功能,具體實(shí)現(xiàn)在后端代碼,每次調(diào)用都會(huì)返回五個(gè)視頻信息。圖5.5視頻展示頁(yè)在此頁(yè)面點(diǎn)擊大封面頁(yè)面,會(huì)跳轉(zhuǎn)到視頻詳情頁(yè)。在展示完五個(gè)視頻后繼續(xù)往下來(lái)會(huì)重新發(fā)起請(qǐng)求,若展示完全部視頻則會(huì)提示沒(méi)有其他視頻了。圖5.6視頻展示頁(yè)底部5.3.2視頻列表展示頁(yè)視頻列表展示頁(yè)會(huì)展示視頻本身,左邊中部有一個(gè)星型作為收藏按鈕,一個(gè)聊天框作為評(píng)論按鈕,再者是表示其他按鈕。再往下展示視頻發(fā)布者的名字和視頻關(guān)鍵字信息。底部由一個(gè)主頁(yè)和個(gè)人信息跳轉(zhuǎn)按鈕。頂部有一個(gè)攝像機(jī)圖片,和一個(gè)搜索按鈕組件組成。圖5.7視頻詳情頁(yè)在這個(gè)頁(yè)面觀賞短視頻,并根據(jù)用戶的需求點(diǎn)擊相應(yīng)的按鈕作出相應(yīng)的請(qǐng)求。5.3.3個(gè)人信息展示頁(yè)首先一進(jìn)入這個(gè)頁(yè)面就會(huì)自動(dòng)調(diào)用接口函數(shù),請(qǐng)求該用戶的所有信息,并該用戶的信息進(jìn)行展示。其中有一個(gè)問(wèn)題,就是要判斷當(dāng)前使用用戶是否與所要展示用戶為同一用戶,若是同一用戶則如圖5.8所示,若不是則為圖5.9所示。圖5.8個(gè)人信息頁(yè)面圖5.9他人信息頁(yè)面決定展示個(gè)人信息頁(yè)面還是他人展示頁(yè)面由一個(gè)變量isMe進(jìn)行決定。具體部分實(shí)現(xiàn)代碼為:<blockwx:if="{{isMe}}"><buttonsize='mini'class='primary'bindtap='uploadVideo'>上傳作品</button><buttonsize='mini'type=''class='logout'bindtap='logout'>注銷</button></block><blockwx:if="{{!isMe}}"><blockwx:if="{{isFollow}}"><buttonsize='mini'type=''class='follow'data-followType='0'bindtap='followMe'>已關(guān)注</button></block><blockwx:if="{{!isFollow}}"><buttonsize='mini'type='primary'class='follow'data-followType='1'bindtap='followMe'>關(guān)注我</button></block>5.3.3登錄注冊(cè)頁(yè)面在此頁(yè)面用戶可以直接輸入賬號(hào)密碼進(jìn)行登錄,若沒(méi)有注冊(cè)過(guò)則可以點(diǎn)擊注冊(cè)按鈕進(jìn)行用戶注冊(cè)。而每一個(gè)用戶的密碼在注冊(cè)時(shí)都會(huì)在后端代碼進(jìn)行MD5加密。圖5.10登錄頁(yè)面圖5.11注冊(cè)頁(yè)面6結(jié)論隨著通訊行業(yè)5G新時(shí)代的普及和互聯(lián)網(wǎng)的快速發(fā)展,短視頻行業(yè)的發(fā)展只會(huì)越來(lái)越好,再加如今短視頻已經(jīng)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025飛行培訓(xùn)及雇傭意向合同書(shū)樣本
- 2025精算師考點(diǎn)關(guān)于投資連結(jié)保險(xiǎn)合同形成資產(chǎn)的解析與探究
- 2025房屋租賃合同協(xié)議范本2
- 蘇州某污水管道工程頂管施工組織設(shè)計(jì)
- 二手房買賣合同書(shū)公證操作流程簡(jiǎn)述
- 二零二五版勞動(dòng)合同書(shū)管理制7
- 二零二五版租房子合同書(shū)模板
- 二零二五版分紅協(xié)議書(shū)合同書(shū)屋
- 教師崗位員工勞動(dòng)合同書(shū)二零二五年
- 大學(xué)生職業(yè)規(guī)劃大賽《市場(chǎng)營(yíng)銷專業(yè)》生涯發(fā)展展示
- 2025-2030年中國(guó)小麥加工產(chǎn)業(yè)運(yùn)行動(dòng)態(tài)及發(fā)展可行性分析報(bào)告
- 乾坤未定皆有可能-2025屆高三百日誓師班會(huì)課件
- 臺(tái)達(dá)DELTA變頻器VFD-EL系列使用說(shuō)明書(shū)和手冊(cè)(完整中文版)VFD007EL23A
- 2025年山西汾西礦業(yè)集團(tuán)公司招聘筆試參考題庫(kù)含答案解析
- 2024年度英語(yǔ)課件容貌焦慮
- 神經(jīng)外科質(zhì)量與安全管理工作計(jì)劃
- 城市違建拆除施工方案
- 復(fù)色激光光譜分析研究
- 農(nóng)藥代銷協(xié)議書(shū)模板
- 《電力中長(zhǎng)期交易合同示范文本(2022年修訂版)》
- 小學(xué)班會(huì) 世界知識(shí)產(chǎn)權(quán)日知識(shí)產(chǎn)權(quán)宣傳周主題班會(huì) 課件
評(píng)論
0/150
提交評(píng)論