硅谷课堂笔记(上)
文章目錄
- 概述
- 功能架構(gòu)圖
- 技術(shù)架構(gòu)圖
- MybatisPlus復(fù)習(xí)
- 后臺(tái)開(kāi)發(fā)
- 搭建工程
- 數(shù)據(jù)庫(kù)設(shè)計(jì)
- 數(shù)據(jù)庫(kù)設(shè)計(jì)規(guī)則
- 搭建工程
- 實(shí)體類(lèi)子模塊model
- 服務(wù)子模塊service
- 總結(jié)
- 引入Swagger
- 遇到的坑
- 后臺(tái)開(kāi)發(fā)-講師管理接口
- 概述
- 基礎(chǔ)代碼自動(dòng)生成
- 配置文件和啟動(dòng)類(lèi)
- 小改造
- 測(cè)試
- 引入統(tǒng)一返回結(jié)果
- 引入全局異常處理
- 示例
- 自定義異常處理
- 引入全局異常
- 測(cè)試
- 教師接口
- 邏輯刪除教師
- 分頁(yè)條件查詢(xún)講師
- 分頁(yè)查詢(xún)Bug
- 添加教師
- 修改教師
- 批量刪除講師
- 前臺(tái)開(kāi)發(fā)
- 騰訊云存儲(chǔ)相關(guān)內(nèi)容
- 快速起步
- 開(kāi)通“對(duì)象存儲(chǔ)COS”服務(wù)
- 創(chuàng)建存儲(chǔ)桶以及測(cè)試
- 創(chuàng)建API秘鑰
- 騰訊云存儲(chǔ)后端接口開(kāi)發(fā)
- 基礎(chǔ)環(huán)境
- 上傳接口編寫(xiě)
- 前端上傳頭像
- 后臺(tái)開(kāi)發(fā)-課程分類(lèi)管理接口
- 需求分析
- 1、課程分類(lèi)管理模塊需求
- 2、課程分類(lèi)數(shù)據(jù)庫(kù)設(shè)計(jì)
- 3、功能實(shí)現(xiàn)-課程分類(lèi)列表
- 后端開(kāi)發(fā)
- 課程分類(lèi)前端頁(yè)面
- EasyExcel
- 概述
- EasyExcel特點(diǎn)
- 讀寫(xiě)操作
- EasyExcel寫(xiě)操作
- EasyExcel讀操作
- 功能實(shí)現(xiàn)-課程分類(lèi)導(dǎo)入導(dǎo)出
- 實(shí)體類(lèi)創(chuàng)建
- 導(dǎo)出接口編寫(xiě)
- 整合導(dǎo)出前端
- 導(dǎo)入接口編寫(xiě)
- 整合導(dǎo)入前端
- 后臺(tái)開(kāi)發(fā)-點(diǎn)播管理模塊
- 涉及數(shù)據(jù)表
- 根據(jù)相關(guān)表生成數(shù)據(jù)
- 后端接口編寫(xiě)
- 課程列表帶條件的分頁(yè)
- 整合課程列表前端
- 課程列表接口
- 整合課程添加前端
- 課程列表修改課程基本信息
- 獲取課程Form
- 更新課程
- 編輯大綱Bug
- 整合修改課程基本信息前端
- 課程大綱列表功能
- 后端接口編寫(xiě)
- 整合課程大綱前端
- 小節(jié)視頻后端接口編寫(xiě)
- 整合視頻小節(jié)前端
- 發(fā)布課程-課程最終發(fā)布
- 課程最終發(fā)布接口
- 小Bug
- 整合課程發(fā)布前端
- 刪除課程
- 課程刪除接口
- 整合前端
- 后臺(tái)開(kāi)發(fā)-點(diǎn)播模塊
- 播放統(tǒng)計(jì)模塊
- 整合播放統(tǒng)計(jì)模塊前端
- 整合騰訊云點(diǎn)播
- 云點(diǎn)播服務(wù)
- 上傳視頻
- 前端集成播放頁(yè)面
- 云點(diǎn)播服務(wù)端接口
- 后端上傳視頻
- 后端刪除視頻
- 點(diǎn)播服務(wù)整合前端
- 騰訊云上傳視頻其他方式
- 之前的缺點(diǎn)
- 客戶(hù)端上傳視頻
- 整合客戶(hù)端前端頁(yè)面
- 完善刪除視頻功能
概述
資料下載提取碼:8op3
功能架構(gòu)圖
技術(shù)架構(gòu)圖
MybatisPlus復(fù)習(xí)
篇幅有限,我另起了一個(gè)筆記進(jìn)行復(fù)習(xí)
MybatisPlus快速學(xué)習(xí)
后臺(tái)開(kāi)發(fā)
搭建工程
數(shù)據(jù)庫(kù)設(shè)計(jì)
這里的數(shù)據(jù)庫(kù)用的是MySQL8.0版本
如果有小伙伴跟著做了,最少也要5.7以上的版本
數(shù)據(jù)庫(kù)和表
數(shù)據(jù)庫(kù)設(shè)計(jì)規(guī)則
以下規(guī)則只針對(duì)本模塊,更全面的文檔參考《阿里巴巴Java開(kāi)發(fā)手冊(cè)》:
1、庫(kù)名與應(yīng)用名稱(chēng)盡量一致2、表名、字段名必須使用小寫(xiě)字母或數(shù)字,禁止出現(xiàn)數(shù)字開(kāi)頭,3、表名不使用復(fù)數(shù)名詞4、表的命名最好是加上“業(yè)務(wù)名稱(chēng)_表的作用”。如,edu_teacher5、表必備三字段:id, gmt_create, gmt_modified說(shuō)明:其中 id 必為主鍵,類(lèi)型為 bigint unsigned、單表時(shí)自增、步長(zhǎng)為 1。(如果使用分庫(kù)分表集群部署,則id類(lèi)型為verchar,非自增,業(yè)務(wù)中使用分布式id生成器)gmt_create, gmt_modified 的類(lèi)型均為 datetime 類(lèi)型,前者現(xiàn)在時(shí)表示主動(dòng)創(chuàng)建,后者過(guò)去分詞表示被 動(dòng)更新。6、單表行數(shù)超過(guò) 500 萬(wàn)行或者單表容量超過(guò) 2GB,才推薦進(jìn)行分庫(kù)分表。 說(shuō)明:如果預(yù)計(jì)三年后的數(shù)據(jù)量根本達(dá)不到這個(gè)級(jí)別,請(qǐng)不要在創(chuàng)建表時(shí)就分庫(kù)分表。 7、表達(dá)是與否概念的字段,必須使用 is_xxx 的方式命名,數(shù)據(jù)類(lèi)型是 unsigned tinyint (1 表示是,0 表示否)。 說(shuō)明:任何字段如果為非負(fù)數(shù),必須是 unsigned。 注意:POJO 類(lèi)中的任何布爾類(lèi)型的變量,都不要加 is 前綴。數(shù)據(jù)庫(kù)表示是與否的值,使用 tinyint 類(lèi)型,堅(jiān)持 is_xxx 的 命名方式是為了明確其取值含義與取值范圍。 正例:表達(dá)邏輯刪除的字段名 is_deleted,1 表示刪除,0 表示未刪除。 8、小數(shù)類(lèi)型為 decimal,禁止使用 float 和 double。 說(shuō)明:float 和 double 在存儲(chǔ)的時(shí)候,存在精度損失的問(wèn)題,很可能在值的比較時(shí),得到不 正確的結(jié)果。如果存儲(chǔ)的數(shù)據(jù)范圍超過(guò) decimal 的范圍,建議將數(shù)據(jù)拆成整數(shù)和小數(shù)分開(kāi)存儲(chǔ)。9、如果存儲(chǔ)的字符串長(zhǎng)度幾乎相等,使用 char 定長(zhǎng)字符串類(lèi)型。 10、varchar 是可變長(zhǎng)字符串,不預(yù)先分配存儲(chǔ)空間,長(zhǎng)度不要超過(guò) 5000,如果存儲(chǔ)長(zhǎng)度大于此值,定義字段類(lèi)型為 text,獨(dú)立出來(lái)一張表,用主鍵來(lái)對(duì)應(yīng),避免影響其它字段索 引效率。11、唯一索引名為 uk_字段名;普通索引名則為 idx_字段名。說(shuō)明:uk_ 即 unique key;idx_ 即 index 的簡(jiǎn)稱(chēng)12、不得使用外鍵與級(jí)聯(lián),一切外鍵概念必須在應(yīng)用層解決。外鍵與級(jí)聯(lián)更新適用于單機(jī)低并發(fā),不適合分布式、高并發(fā)集群;級(jí)聯(lián)更新是強(qiáng)阻塞,存在數(shù)據(jù)庫(kù)更新風(fēng)暴的風(fēng)險(xiǎn);外鍵影響數(shù)據(jù)庫(kù)的插入速度。搭建工程
包結(jié)構(gòu)
模塊說(shuō)明
ggkt_parent:硅谷課堂根目錄(父工程),管理多個(gè)子模塊:
common:公共模塊父節(jié)點(diǎn)
common_util:工具類(lèi)模塊,所有模塊都可以依賴(lài)于它
service_utils:service服務(wù)的base包,包含service服務(wù)的公共配置類(lèi),所有service模塊依賴(lài)于它
rabbit_utils:rabbitmq封裝工具類(lèi)
model:實(shí)體類(lèi)相關(guān)模塊
server-gateway:服務(wù)網(wǎng)關(guān)
service:api接口服務(wù)父節(jié)點(diǎn)
? service_acl:權(quán)限管理接口服務(wù)
? service_activity:優(yōu)惠券api接口服務(wù)
? service_live:直播課程api接口服務(wù)
? service_order:訂單api接口服務(wù)
? service_user:用戶(hù)api接口服務(wù)
? service_vod:點(diǎn)播課程 api接口服務(wù)
? service_wechat:公眾號(hào)api接口服務(wù)
service-client:feign服務(wù)調(diào)用父節(jié)點(diǎn)
? service-activity-client:優(yōu)惠券api接口
? service-live-client:直播課程api接口
? service-order-client:訂單api接口
? service-user-client:用戶(hù)api接口
? service-vod-client:點(diǎn)播課程api接口
介紹完畢,開(kāi)始搭建
不用管官方的依賴(lài),我們后面Pom文件自己加
SpringBoot版本統(tǒng)一為2.2.1RELEASE版本
而且作為父工程,是不需要src目錄的,因?yàn)橹饕膬?nèi)容都在他子模塊下
所以留個(gè)Pom就行
依賴(lài)我就不粘貼了,太多
需要的小伙伴直接去Gitee找到父工程下的Pom就可以查看
實(shí)體類(lèi)子模塊model
先在parent下新建子模塊model
以Maven模版生成就可以了
直接導(dǎo)入實(shí)體類(lèi)子模塊model,當(dāng)然,MP自動(dòng)生成也不是不行~
同樣子模塊也需要引入各種jar包和依賴(lài)
<dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><scope>provided </scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><scope>provided </scope></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><!--在引用時(shí)請(qǐng)?jiān)趍aven中央倉(cāng)庫(kù)搜索2.X最新版本號(hào)--><scope>provided</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId><scope>provided </scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><scope>provided </scope></dependency><!--創(chuàng)建索引庫(kù)的--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><scope>provided </scope></dependency></dependencies>服務(wù)子模塊service
再建一個(gè)Service子模塊
同樣需要引入對(duì)應(yīng)的依賴(lài)
因?yàn)閟ervice包也是對(duì)服務(wù)進(jìn)行管理,所以也不留src路徑,下面繼續(xù)還要?jiǎng)?chuàng)建多個(gè)服務(wù)包
再建service_vod(視頻點(diǎn)播)模塊
總結(jié)
引入Swagger
對(duì)接口信息進(jìn)行管理,測(cè)試一條龍服務(wù)
非常快樂(lè)
因?yàn)镾wagger組件是公共的,所以單獨(dú)拿一個(gè)模塊做Common-serviceUtils模塊
依賴(lài)我就不多說(shuō)了,具體路徑可以看這個(gè)onlineClass\common\pom.xml
注意,common包下及其子模塊 作為一個(gè)單獨(dú)的子模塊,是無(wú)法被service模塊所看到的。
所以這里也要像之前引入實(shí)體類(lèi)一樣,去service模塊把這個(gè)common模塊引入
引入之前一定一定要補(bǔ)全common子模塊service-utils的pom信息,缺少信息會(huì)找不到
這個(gè)是service-utils里的信息
這里是service包引入依賴(lài)
到這還不算完,要在在service_vod啟動(dòng)類(lèi)上加入對(duì)于Swagger的掃描
在想管理的方法上面加入對(duì)應(yīng)注解就好啦
定義在類(lèi)上:@Api
定義在方法上:@ApiOperation
定義在參數(shù)上:@ApiParam
Swagger后臺(tái)路徑:http://localhost:啟動(dòng)端口號(hào)/swagger-ui.html
后續(xù)包括文檔的生成,參數(shù)注解生成等等都比較好辦了,這里不是重點(diǎn)就不過(guò)多贅述了
遇到的坑
左找右找,先后加了注解,也不知為什么找不到controller,全都是error
通過(guò)百度,發(fā)現(xiàn)這個(gè)問(wèn)題一般來(lái)說(shuō)都是Swagger配置類(lèi)沒(méi)寫(xiě)好。但是剛剛我還寫(xiě)了配置類(lèi),顯然不太可能是配置類(lèi)的鍋
推測(cè)應(yīng)該是沒(méi)掃到配置類(lèi),之前說(shuō)過(guò)要在啟動(dòng)類(lèi)上加入配置類(lèi)掃描
仔細(xì)一看,好家伙包名沒(méi)對(duì)上!
改了包名就正常了,掃描到配置類(lèi)自然就都合理起來(lái)了
Swagger后臺(tái)路徑:http://localhost:啟動(dòng)端口號(hào)/swagger-ui.html
后臺(tái)開(kāi)發(fā)-講師管理接口
概述
添加課程時(shí)候,需要選擇所屬講師,所以要對(duì)講師進(jìn)行管理,就是基于講師的CRUD操作
引入代碼生成器,自動(dòng)生成相關(guān)內(nèi)容
基礎(chǔ)代碼自動(dòng)生成
建議這些操作放到test測(cè)試包中,避免一起打包了,生成完畢也不需要再刪除
(1)引入代碼生成器依賴(lài)
(2)復(fù)制生成代碼工具類(lèi)
修改代碼中路徑、數(shù)據(jù)庫(kù)、包和表,復(fù)制到test目錄下
(3)實(shí)體類(lèi)統(tǒng)一替換為model模塊的實(shí)體類(lèi)
配置文件和啟動(dòng)類(lèi)
配置文件
# 服務(wù)端口 server.port=8301 # 服務(wù)名 spring.application.name=service-vod# 環(huán)境設(shè)置:dev、test、prod spring.profiles.active=dev# mysql數(shù)據(jù)庫(kù)連接 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/glkt_vod?characterEncoding=utf-8&useSSL=false spring.datasource.username=root spring.datasource.password=root#返回json的全局時(shí)間格式 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=GMT+8#mybatis日志 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl代碼生成器
public class CodeGet {public static void main(String[] args) {// 1、創(chuàng)建代碼生成器AutoGenerator mpg = new AutoGenerator();// 2、全局配置// 全局配置GlobalConfig gc = new GlobalConfig();String projectPath = System.getProperty("user.dir");//gc.setOutputDir(projectPath + "/src/main/java");//這里是輸出生成代碼的目錄,這里要填電腦的絕對(duì)路徑(必改)+拼接出來(lái)的路徑gc.setOutputDir("D:\\JavaProject\\onlineClass\\service\\service_vod\\"+"/src/main/java");gc.setServiceName("%sService"); //去掉Service接口的首字母Igc.setAuthor("cc");gc.setOpen(false);mpg.setGlobalConfig(gc);// 3、數(shù)據(jù)源配置DataSourceConfig dsc = new DataSourceConfig();dsc.setUrl("jdbc:mysql://localhost:3307/glkt_vod");dsc.setDriverName("com.mysql.jdbc.Driver");dsc.setUsername("root");dsc.setPassword("123456");dsc.setDbType(DbType.MYSQL);mpg.setDataSource(dsc);// 4、包配置PackageConfig pc = new PackageConfig();pc.setModuleName("service_vod"); //模塊名pc.setParent("com");//包名,最后組合成 com.service_vodpc.setController("controller");pc.setEntity("entity");pc.setService("service");pc.setMapper("mapper");mpg.setPackageInfo(pc);// 5、策略配置StrategyConfig strategy = new StrategyConfig();//具體生成哪些表要具體指定//strategy.setInclude("想要生成的表名");strategy.setInclude("teacher");strategy.setNaming(NamingStrategy.underline_to_camel);//數(shù)據(jù)庫(kù)表映射到實(shí)體的命名策略strategy.setColumnNaming(NamingStrategy.underline_to_camel);//數(shù)據(jù)庫(kù)表字段映射到實(shí)體的命名策略strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter鏈?zhǔn)讲僮?/span>strategy.setRestControllerStyle(true); //restful api風(fēng)格控制器strategy.setControllerMappingHyphenStyle(true); //url中駝峰轉(zhuǎn)連字符mpg.setStrategy(strategy);// 6、執(zhí)行mpg.execute();} }啟動(dòng)類(lèi)
@SpringBootApplication public class ServiceVodApplication {public static void main(String[] args) {SpringApplication.run(ServiceVodApplication.class, args);} }小改造
修改一下引入的實(shí)體類(lèi),使用我們創(chuàng)建的實(shí)體類(lèi)工程
加入MP配置類(lèi)
測(cè)試
寫(xiě)一個(gè)遍歷老師信息的測(cè)試
到這里就算搭建成功了,可以開(kāi)始著手下一步接口的撰寫(xiě)了。
引入統(tǒng)一返回結(jié)果
Result結(jié)果集,都是老朋友了
項(xiàng)目中我們會(huì)將響應(yīng)封裝成json返回,一般我們會(huì)將所有接口的數(shù)據(jù)格式統(tǒng)一, 使前端(iOS Android, Web)對(duì)數(shù)據(jù)的操作更一致、輕松。
一般情況下,統(tǒng)一返回?cái)?shù)據(jù)格式?jīng)]有固定的格式,只要能描述清楚返回的數(shù)據(jù)狀態(tài)以及要返回的具體數(shù)據(jù)就可以。但是一般會(huì)包含狀態(tài)碼、返回消息、數(shù)據(jù)這幾部分內(nèi)容
因?yàn)檫@個(gè)也算工具的一種,所以把這個(gè)結(jié)果集寫(xiě)到Common模塊的子模塊service_utils中
- 一個(gè)結(jié)果集 Result
- 一個(gè)結(jié)果信息枚舉集 ResultCodeEnum
具體位置:com.cc.result.Result,com.cc.result.ResultCodeEnum
復(fù)習(xí)一下Json格式
使用的話(huà),Result.success.(數(shù)據(jù)).message(“想填入的信息”)
Result.success.(數(shù)據(jù))
引入全局異常處理
有特定異常就先處理特定異常,匹配不到特定異常就走全局異常處理
示例
先看看這種代碼的try catch
這種try catch來(lái)捕獲異常固然好,但是,代碼量一大起來(lái),超級(jí)多的try catch就會(huì)很亂
所以我們要加入全局異常處理
由于這是工具類(lèi)的屬性在Common包的service_utils下,和Result同級(jí),這里只是示例,并不完整
如圖是某個(gè)特定異常處理
有了這些異常處理,就可以捕獲控制臺(tái)輸出的異常信息,從而對(duì)其進(jìn)行處理
自定義異常處理
引入全局異常
把自定義異常引入全局異常處理
測(cè)試
先測(cè)自定義異常,找一個(gè)接口人為制造異常
測(cè)試一下
如果我們把try catch去掉,只留下int i=10/0,這個(gè)異常算是算數(shù)異常,也就是ArithmeticException,因此也會(huì)被捕獲,此時(shí)不出意外就會(huì)走特殊異常處理
最后,來(lái)試試全局異常,一個(gè)沒(méi)有設(shè)置對(duì)應(yīng)有任何處理的異常
當(dāng)然,如果想好幾種異常都走一種處理方式,也是完全可以的
只需要在異常類(lèi)型注解上面加入對(duì)應(yīng)類(lèi)型就好
@ExceptionHandler({異常類(lèi)型1.class,異常類(lèi)型2.class})
以上就是全局異常處理類(lèi)的相關(guān)內(nèi)容
教師接口
邏輯刪除教師
Delete請(qǐng)求方式+ResultFul請(qǐng)求風(fēng)格
還是非常簡(jiǎn)單的,注意,這里是邏輯刪除,沒(méi)有做表的實(shí)際刪除。
也就是把邏輯字段更新了一下
分頁(yè)條件查詢(xún)講師
就是簡(jiǎn)單的按條件分頁(yè)查詢(xún)
位置:service模塊下的service_vod子模塊com.cc.service_vod.controller.TeacherController (findQueryPage)
復(fù)習(xí)一下RequestBody注解
分頁(yè)查詢(xún)Bug
到了前端測(cè)試的時(shí)候,發(fā)現(xiàn)分頁(yè)不好使,怎么查都沒(méi)有Limit
還以為mp出問(wèn)題了,結(jié)果一看,MP的分頁(yè)配置類(lèi)沒(méi)寫(xiě)
蚌埠住了,沒(méi)寫(xiě)配置類(lèi)
加上配置類(lèi)就好了
添加教師
位置:service模塊下的service_vod子模塊com.cc.service_vod.controller.TeacherController (saveTeacher)
修改教師
注意,要是想修改的話(huà),肯定是得先獲取講師的信息,才能在獲取的基礎(chǔ)上對(duì)教師信息進(jìn)行改進(jìn)
所以要先獲取,根據(jù)id獲取,這里不多贅述,歡迎去Gitee查看~
獲取教師位置:service模塊下的service_vod子模塊com.cc.service_vod.controller.TeacherController (getTeacherById)
更新教師位置:service模塊下的service_vod子模塊com.cc.service_vod.controller.TeacherController (updateById)
批量刪除講師
根據(jù)id集合刪講師位置:service模塊下的service_vod子模塊com.cc.service_vod.controller.TeacherController (batchRemove)
前臺(tái)開(kāi)發(fā)
前端內(nèi)容比較多,這里單獨(dú)再開(kāi)一篇文章專(zhuān)門(mén)寫(xiě)這個(gè)
只有教師接口部分是手寫(xiě)的,剩下的內(nèi)容都是復(fù)制粘貼
這部分是基礎(chǔ)內(nèi)容
硅谷課堂前端內(nèi)容
騰訊云存儲(chǔ)相關(guān)內(nèi)容
快速起步
點(diǎn)擊就送
開(kāi)通“對(duì)象存儲(chǔ)COS”服務(wù)
進(jìn)入會(huì)送一定額度的免費(fèi)存儲(chǔ)
(1)申請(qǐng)騰訊云賬號(hào):https://cloud.tencent.com/
(2)實(shí)名認(rèn)證
(3)開(kāi)通“對(duì)象存儲(chǔ)COS”服務(wù)
(4)進(jìn)入管理控制臺(tái)
創(chuàng)建存儲(chǔ)桶以及測(cè)試
進(jìn)入管理控制臺(tái),找到存儲(chǔ)桶列表, 創(chuàng)建存儲(chǔ)桶
簡(jiǎn)單填一下信息就可以了,注意不要選私有讀寫(xiě)
后面的配置不用管,無(wú)腦跳過(guò)就行
創(chuàng)建完畢
點(diǎn)擊 桶名稱(chēng),進(jìn)入詳情頁(yè),可測(cè)試上傳文件
創(chuàng)建API秘鑰
基本操作已經(jīng)完畢,剩下的交給后端接口
騰訊云存儲(chǔ)后端接口開(kāi)發(fā)
基礎(chǔ)環(huán)境
參考文檔:https://cloud.tencent.com/document/product/436/10199
Pom依賴(lài)
為后端服務(wù)引入依賴(lài)
配置application.properties
在Service模塊里新建utils工具包,把配置文件引入
/*** 常量類(lèi),讀取配置文件application.properties中的配置*/ @Component public class ConstantPropertiesUtil implements InitializingBean {@Value("${tencent.cos.file.region}")private String region;@Value("${tencent.cos.file.secretid}")private String secretId;@Value("${tencent.cos.file.secretkey}")private String secretKey;@Value("${tencent.cos.file.bucketname}")private String bucketName;public static String END_POINT;public static String ACCESS_KEY_ID;public static String ACCESS_KEY_SECRET;public static String BUCKET_NAME;@Overridepublic void afterPropertiesSet() throws Exception {END_POINT = region;ACCESS_KEY_ID = secretId;ACCESS_KEY_SECRET = secretKey;BUCKET_NAME = bucketName;} }上傳接口編寫(xiě)
創(chuàng)建Interface:FileService.java
public interface FileService {//文件上傳String upload(MultipartFile file); }實(shí)現(xiàn):FileServiceImpl.java
存儲(chǔ)Service實(shí)現(xiàn)類(lèi)
一些數(shù)據(jù)根據(jù)工具類(lèi)就讀取了
編寫(xiě)controller,注入相關(guān)接口service就好
記得加跨域
直接打開(kāi)Swagger進(jìn)行測(cè)試
上傳文件
回到騰訊云,文件已經(jīng)上傳上來(lái)了
前端上傳頭像
復(fù)制粘貼樣式和JS,測(cè)一下,好用
測(cè)試一下
后臺(tái)開(kāi)發(fā)-課程分類(lèi)管理接口
需求分析
1、課程分類(lèi)管理模塊需求
(1)課程分類(lèi)列表功能
這個(gè)也叫懶加載,不點(diǎn)就不加載
點(diǎn)了就展現(xiàn)二級(jí)內(nèi)容
(2)課程分類(lèi)導(dǎo)入功能
(3)課程分類(lèi)導(dǎo)出功能
2、課程分類(lèi)數(shù)據(jù)庫(kù)設(shè)計(jì)
(1)創(chuàng)建課程分類(lèi)表subject
3、功能實(shí)現(xiàn)-課程分類(lèi)列表
接口實(shí)現(xiàn)分析
課程分類(lèi)采用樹(shù)形展示,我們使用“樹(shù)形數(shù)據(jù)與懶加載”的方式展現(xiàn)數(shù)據(jù)列表,因此需要提供的接口如下:根據(jù)上級(jí)id獲取下級(jí)數(shù)據(jù),參考element-ui文檔:https://element.eleme.cn/#/zh-CN/component/table,頁(yè)面搜索:樹(shù)形數(shù)據(jù)與懶加載
后端開(kāi)發(fā)
因?yàn)闆](méi)有生成相關(guān)的實(shí)體類(lèi),所以要用代碼生成器生成一下,簡(jiǎn)單修改一下就可以生成
生成完畢后就可以寫(xiě)接口了
根據(jù)剛剛的分析,要對(duì)當(dāng)前課程是否有parentId做出相關(guān)判斷
controller位置:com.cc.service_vod.controller.SubjectController
serviceImpl位置:com.cc.service_vod.service.impl.FileServiceImpl (selectList、isChild)
這里有個(gè)小問(wèn)題,就是Service層去調(diào)用MP的擴(kuò)展方法怎么辦
答案就是用BaseMapper去調(diào)用,因?yàn)橐呀?jīng)擴(kuò)展好了
課程分類(lèi)前端頁(yè)面
引入JS 創(chuàng)建文件 src/api/vod/subject.js
復(fù)制粘貼樣式 編寫(xiě)subject/list.vue src\views\vod\subject\list.vue
測(cè)試一下,包括懶加載都沒(méi)有問(wèn)題了
EasyExcel
概述
EasyExcel是阿里巴巴開(kāi)源的一個(gè)excel處理框架,以使用簡(jiǎn)單、節(jié)省內(nèi)存著稱(chēng)。EasyExcel能大大減少占用內(nèi)存的主要原因是在解析Excel時(shí)沒(méi)有將文件數(shù)據(jù)一次性全部加載到內(nèi)存中,而是從磁盤(pán)上一行行讀取數(shù)據(jù),逐個(gè)解析。
EasyExcel特點(diǎn)
- Java領(lǐng)域解析、生成Excel比較有名的框架有Apache poi、jxl等。但他們都存在一個(gè)嚴(yán)重的問(wèn)題就是非常的耗內(nèi)存。如果你的系統(tǒng)并發(fā)量不大的話(huà)可能還行,但是一旦并發(fā)上來(lái)后一定會(huì)OOM或者JVM頻繁的full gc。
- EasyExcel采用一行一行的解析模式,并將一行的解析結(jié)果以觀察者的模式通知處理(AnalysisEventListener)
- EasyExcel是一個(gè)基于Java的簡(jiǎn)單、省內(nèi)存的讀寫(xiě)Excel的開(kāi)源項(xiàng)目。在盡可能節(jié)約內(nèi)存的情況下支持讀寫(xiě)百M(fèi)的Excel。
比較一下二者的區(qū)別
讀寫(xiě)操作
EasyExcel寫(xiě)操作
(1)pom中引入xml相關(guān)依賴(lài)
<dependencies><!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.1</version></dependency> </dependencies>(2)創(chuàng)建實(shí)體類(lèi)
Excel作為一種表,和數(shù)據(jù)庫(kù)一樣,也應(yīng)該有實(shí)體類(lèi)與之對(duì)應(yīng)
設(shè)置表頭和添加的數(shù)據(jù)字段
@Data public class Stu {//設(shè)置表頭名稱(chēng)@ExcelProperty("學(xué)生編號(hào)")private int sno;//設(shè)置表頭名稱(chēng)@ExcelProperty("學(xué)生姓名")private String sname; }(3)實(shí)現(xiàn)寫(xiě)操作
創(chuàng)建方法循環(huán)設(shè)置要添加到Excel的數(shù)據(jù)
//循環(huán)設(shè)置要添加的數(shù)據(jù),最終封裝到list集合中 private static List<Stu> data() {List<Stu> list = new ArrayList<Stu>();for (int i = 0; i < 10; i++) {Stu data = new Stu();data.setSno(i);data.setSname("張三"+i);list.add(data);}return list; }實(shí)現(xiàn)最終的添加操作
public static void main(String[] args) throws Exception {// 寫(xiě)法1String fileName = "F:\\11.xlsx";// 這里 需要指定寫(xiě)用哪個(gè)class去寫(xiě),然后寫(xiě)到第一個(gè)sheet,名字為模板 然后文件流會(huì)自動(dòng)關(guān)閉// 如果這里想使用03 則 傳入excelType參數(shù)即可EasyExcel.write(fileName, 對(duì)應(yīng)實(shí)體類(lèi).class).sheet("sheet表名").doWrite(data()); }
這個(gè)時(shí)候,在D盤(pán)中已經(jīng)生成了一個(gè)對(duì)應(yīng)的Excel文件
EasyExcel讀操作
(1)創(chuàng)建實(shí)體類(lèi)
@Data public class Stu {//設(shè)置表頭名稱(chēng)//設(shè)置列對(duì)應(yīng)的屬性 index代表表頭下標(biāo),從0開(kāi)始@ExcelProperty(value = "學(xué)生編號(hào)",index = 0)private int sno;//設(shè)置表頭名稱(chēng)//設(shè)置列對(duì)應(yīng)的屬性@ExcelProperty(value = "學(xué)生姓名",index = 1)private String sname; }(2)創(chuàng)建讀取操作的監(jiān)聽(tīng)器
public class ExcelListener extends AnalysisEventListener<Stu> {//創(chuàng)建list集合封裝最終的數(shù)據(jù)List<Stu> list = new ArrayList<Stu>();//一行一行去讀取excle內(nèi)容//默認(rèn)從第二行開(kāi)始讀,第一行默認(rèn)表頭,表頭在下面的invokeHeadMap中讀@Overridepublic void invoke(Stu user, AnalysisContext analysisContext) {System.out.println("***"+user);list.add(user);}//讀取excel表頭信息(第一行)@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {System.out.println("表頭信息:"+headMap);}//讀取完成后執(zhí)行@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {} }(3)調(diào)用實(shí)現(xiàn)最終的讀取
public static void main(String[] args) throws Exception {//指定讀取路徑String fileName = "D:\\11.xlsx";// 這里 需要指定讀用哪個(gè)class去讀,然后讀取第一個(gè)sheet 文件流會(huì)自動(dòng)關(guān)閉EasyExcel.read(fileName, 實(shí)體類(lèi).class, new ExcelListener()).sheet().doRead(); }測(cè)試一下,已經(jīng)讀取到內(nèi)存了
功能實(shí)現(xiàn)-課程分類(lèi)導(dǎo)入導(dǎo)出
思路
實(shí)體類(lèi)創(chuàng)建
在model模塊下,創(chuàng)建課程表對(duì)應(yīng)實(shí)體類(lèi),Excel版Subject專(zhuān)用
和普通的Subject分隔開(kāi)
導(dǎo)出接口編寫(xiě)
整合導(dǎo)出前端
加入這倆按鈕
JS邏輯
導(dǎo)入接口編寫(xiě)
controller接口
因?yàn)樽x操作要用監(jiān)聽(tīng)器,所以創(chuàng)建一個(gè)
ServiceImpl層
整合導(dǎo)入前端
(1)在list.vue頁(yè)面添加導(dǎo)入按鈕
<el-button type="text" @click="importData"><i class="fa fa-plus"/> 導(dǎo)入</el-button>(2)添加導(dǎo)入彈出層
<el-dialog title="導(dǎo)入" :visible.sync="dialogImportVisible" width="480px"><el-form label-position="right" label-width="170px"><el-form-item label="文件"><el-upload:multiple="false":on-success="onUploadSuccess":action="'http://localhost:8301/admin/vod/subject/importData'"class="upload-demo"><el-button size="small" type="primary">點(diǎn)擊上傳</el-button><div slot="tip" class="el-upload__tip">只能上傳xls文件,且不超過(guò)500kb</div></el-upload></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button @click="dialogImportVisible = false">取消</el-button></div> </el-dialog>(3)添加導(dǎo)入彈出層屬性
data() {return {dialogImportVisible: false,list:[] //數(shù)據(jù)字典列表數(shù)組} },(4)添加導(dǎo)入方法
importData() {this.dialogImportVisible = true }, onUploadSuccess(response, file) {this.$message.info('上傳成功')this.dialogImportVisible = falsethis.getSubList(0) },測(cè)試一下,導(dǎo)入成功
后臺(tái)開(kāi)發(fā)-點(diǎn)播管理模塊
涉及數(shù)據(jù)表
課程基本信息表course
課程描述表course_description
章節(jié)表chapter
小節(jié)和視頻表video
課程分類(lèi)表subject
根據(jù)相關(guān)表生成數(shù)據(jù)
后端接口編寫(xiě)
課程列表帶條件的分頁(yè)
controller代碼位置
service代碼位置
整合課程列表前端
先引入路由
這樣新的列表就出來(lái)了
創(chuàng)建對(duì)應(yīng)的頁(yè)面
在api目錄創(chuàng)建course.js文件
在api目錄teacher.js文件定義接口
編寫(xiě)list.vue頁(yè)面,直接CV了
課程列表接口
發(fā)布新課程
要操作兩個(gè)表
無(wú)非就是把前端傳來(lái)的CourseVo拆分成Course和CourseDescription這兩個(gè)對(duì)象,分別傳入對(duì)應(yīng)的表
還是比較好做的
controller位置
service位置:
整合課程添加前端
課程列表list.vue添加方法
course.js定義接口
添加課程按鈕標(biāo)簽在這里添加
點(diǎn)擊添加后課程具體信息列表
課程列表修改課程基本信息
一看就是個(gè)更新信息,按ID查詢(xún)回顯+update操作
按ID查詢(xún)的URL
注意,這個(gè)getById返回的是Vo,因?yàn)橐獛еn程描述一起更改,所以返回的是CourseFormVo
獲取課程Form
Controller位置
ServiceImpl位置
更新課程
Controller位置
ServiceImpl位置
編輯大綱Bug
點(diǎn)擊修改之后編輯信息進(jìn)入下一步
發(fā)出的RestFul請(qǐng)求的id是null,這個(gè)明顯是不對(duì)的
這里少了兩個(gè)id,一個(gè)是課程表單ID,另一個(gè)是課程的描述id
一個(gè)是課程表單ID
看看前端的方法,明顯是需要一個(gè)course的返回值的
在CourseController里的update方法
原來(lái)這里是沒(méi)有返回值的
課程描述ID
這個(gè)BUG折磨了我一晚上,淦
希望能幫到諸位小伙伴
整合修改課程基本信息前端
course.js定義方法
修改Info.vue頁(yè)面,引入樣式信息
創(chuàng)建Chapter-index.vue頁(yè)面
CV了樣式,就那樣了~
課程大綱列表功能
后端接口編寫(xiě)
表關(guān)系
重點(diǎn)就放在章節(jié)和小節(jié)的接口上
看看大綱的數(shù)據(jù)JSON結(jié)構(gòu):
數(shù)組結(jié)構(gòu)的JSON,明顯是返回List集合
Controller位置
業(yè)務(wù)比較復(fù)雜,在Service單獨(dú)分離出來(lái)的業(yè)務(wù)
在這個(gè)路徑下,歡迎去Gitee查看~
整合課程大綱前端
定義對(duì)應(yīng)JS的API,都是CRUD的內(nèi)容
畫(huà)前端的頁(yè)面,直接CV樣式了
小節(jié)視頻后端接口編寫(xiě)
這個(gè)模塊都是單表的CRUD,在Controller層直接用MybatisPlus就可以實(shí)現(xiàn)
所以只有Controller層
整合視頻小節(jié)前端
發(fā)布課程-課程最終發(fā)布
課程最終發(fā)布接口
一共有兩個(gè)接口,一個(gè)是回顯的根據(jù)id查詢(xún)課程信息,另一個(gè)是根據(jù)ID發(fā)布課程(更新一下是否發(fā)布的字段)
根據(jù)id查詢(xún)課程信息
Controller位置:
service層
Mapper接口對(duì)應(yīng)
這次是多表聯(lián)查,不用MP了,用Mybatis去編寫(xiě)XML文件直接查多表
根據(jù)ID發(fā)布課程
發(fā)布課程,相當(dāng)于把字段更新了
controller位置:和上面一樣,Service也一樣
小Bug
Mybatis的綁定問(wèn)題
這種問(wèn)題無(wú)外乎兩種
第一種:Mapper接口名稱(chēng)和XML文件的id對(duì)不上,沒(méi)綁定上自然就報(bào)錯(cuò)了。這個(gè)要仔細(xì)檢查
第二種:Maven沒(méi)有加載這個(gè)文件
修改POM文件(就在當(dāng)前模塊下):
在POM最末尾(也就是 </ project> 之前)
修改properties文件
mybatis-plus.mapper-locations=classpath:com/atguigu/ggkt/vod/mapper/xml/*.xml整合課程發(fā)布前端
先是引入相關(guān)JS,在API目錄下的course.js定義接口
再去復(fù)制樣式 編寫(xiě)Publish.vue
刪除課程
一個(gè)課程下包含多個(gè)內(nèi)容
課程刪除接口
(1)編寫(xiě)課程Controller
@ApiOperation(value = "刪除課程") @DeleteMapping("remove/{id}") public Result remove(@PathVariable Long id) {courseService.removeCourseById(id);return Result.ok(); }(2)編寫(xiě)課程Service
//刪除課程@Overridepublic void removeCourseById(Long id) {//根據(jù)課程id刪除小節(jié)videoService.removeVideoByCourseId(id);//根據(jù)課程id刪除章節(jié)chapterService.removeChapterByCourseId(id);//根據(jù)課程id刪除描述descriptionService.removeById(id);//根據(jù)課程id刪除課程baseMapper.deleteById(id);}(3)編寫(xiě)VideoService
@Service public class VideoServiceImpl extends ServiceImpl<VideoMapper, Video> implements VideoService {//根據(jù)課程id刪除小節(jié)@Overridepublic void removeVideoByCourseId(Long id) {QueryWrapper<Video> wrapper = new QueryWrapper<>();wrapper.eq("course_id",id);baseMapper.delete(wrapper);} }(4)編寫(xiě)ChapterService
//根據(jù)課程id刪除章節(jié)@Overridepublic void removeChapterByCourseId(Long id) {QueryWrapper<Chapter> wrapper = new QueryWrapper<>();wrapper.eq("course_id",id);baseMapper.delete(wrapper);}整合前端
API下course.js定義接口
course -> list.vue添加方法
都是老生常談,歡迎到Gitee查看
后臺(tái)開(kāi)發(fā)-點(diǎn)播模塊
播放統(tǒng)計(jì)模塊
課程統(tǒng)計(jì)需求
用折線(xiàn)圖來(lái)顯示觀看人數(shù)數(shù)據(jù)
還可以通過(guò)時(shí)間區(qū)間對(duì)數(shù)據(jù)進(jìn)行約束
所以涉及的表就是video_visitor
折線(xiàn)圖對(duì)應(yīng)的就是Echars
分析一下返回?cái)?shù)據(jù),一個(gè)要放x軸的日期,一個(gè)要放y軸的數(shù)量
所以,對(duì)應(yīng)的就是兩個(gè)集合,來(lái)存放不同的數(shù)據(jù)
因?yàn)槭荎-V的形式拿到最后的數(shù)據(jù),所以這里用Key-集合Value的形式
Controller位置:
這里放出Mapper和Service的內(nèi)容
最終查出來(lái)的效果,對(duì)播放數(shù)量進(jìn)行了統(tǒng)計(jì)
整合播放統(tǒng)計(jì)模塊前端
Echars肯定不用想,必用
安裝ECharts組件
ECharts是百度的一個(gè)項(xiàng)目,后來(lái)百度把Echart捐給apache,用于圖表展示,提供了常規(guī)的折線(xiàn)圖、柱狀圖、散點(diǎn)圖、餅圖、K線(xiàn)圖,用于統(tǒng)計(jì)的盒形圖,用于地理數(shù)據(jù)可視化的地圖、熱力圖、線(xiàn)圖,用于關(guān)系數(shù)據(jù)可視化的關(guān)系圖、treemap、旭日?qǐng)D,多維數(shù)據(jù)可視化的平行坐標(biāo),還有用于 BI 的漏斗圖,儀表盤(pán),并且支持圖與圖之間的混搭。
官方網(wǎng)站:https://echarts.apache.org/zh/index.html
npm install --save echarts@4.1.0編寫(xiě)頁(yè)面
創(chuàng)建chart.vue頁(yè)面直接CV了~
整合騰訊云點(diǎn)播
上傳視頻
在發(fā)布課程時(shí)候,需要添加課時(shí)并且上傳課程視頻,這個(gè)時(shí)候需要使用到騰訊云點(diǎn)播服務(wù)進(jìn)行上傳視頻管理
需求分析
云點(diǎn)播服務(wù)
這個(gè)功能要去騰訊云開(kāi)一個(gè)點(diǎn)播服務(wù)的,大概幾塊錢(qián)的流量就可以了
騰訊云點(diǎn)播服務(wù):https://console.cloud.tencent.com/vod/register
開(kāi)通好了進(jìn)來(lái)就自帶體驗(yàn)流量
上傳視頻
上傳視頻可將視頻上傳到云點(diǎn)播的存儲(chǔ)中,以進(jìn)行后續(xù)的處理和分發(fā)等。
- 單擊左側(cè)菜單欄【媒資管理 > 視頻管理】,默認(rèn)展示【已上傳】標(biāo)簽頁(yè);
- 點(diǎn)擊【上傳視頻】按鈕;
- 單擊【選擇視頻】,選擇本地視頻文件;
- 單擊【開(kāi)始上傳】;
- 頁(yè)面將自動(dòng)跳轉(zhuǎn)至【正在上傳】標(biāo)簽頁(yè), 本地文件所在行【狀態(tài)】欄為“上傳成功”時(shí),單擊【已上傳】標(biāo)簽頁(yè),可見(jiàn)完成上傳的視頻;
到這里就上傳完畢了,單擊【管理】,可以查看視頻詳情;
前端集成播放頁(yè)面
前端集成有兩種方式,使用“超級(jí)播放器預(yù)覽”與“web播放器預(yù)覽”,或者代碼已經(jīng)不更新,推薦使用前者,因此“web播放器預(yù)覽”僅做了解。
1、查看“web播放器預(yù)覽”;
說(shuō)明:需要將視頻進(jìn)行轉(zhuǎn)碼,才能支持超級(jí)播放器播放,轉(zhuǎn)碼為:自適應(yīng)碼流
2、查看“任務(wù)流設(shè)置”
3、點(diǎn)擊查看詳情
當(dāng)前任務(wù)流就是系統(tǒng)默認(rèn)的“自適應(yīng)碼流”任務(wù)流
4、在【音視頻管理】重新上傳視頻
5、查看詳情,下面有HTML代碼,復(fù)制粘貼到瀏覽器就可以使用
云點(diǎn)播服務(wù)端接口
因?yàn)槭且曨l點(diǎn)播接口,相關(guān)類(lèi)需要?jiǎng)?chuàng)建Vod相關(guān)的播放接口
因?yàn)榉?wù)在騰訊云上,所以這里就不需要有Mapper相關(guān)接口了
引入點(diǎn)播相關(guān)POM依賴(lài)
< exclusion>是避免日志和SpringBoot的日志有沖突
騰訊云點(diǎn)播Java文檔:https://cloud.tencent.com/document/product/266/10276
后端上傳視頻
Controller位置:Service_Vod下的com.cc.service_vod.controller.VodController
ServiceImpl 這里要引入騰訊云官方的SDK
ConstantPropertiesUtil是讀取properties的工具類(lèi),通過(guò)這個(gè)工具類(lèi)讀取出相關(guān)配置內(nèi)容,都是靜態(tài)變量
//上傳視頻@Overridepublic String uploadVideo(InputStream inputStream, String originalFilename) {try {VodUploadClient client =new VodUploadClient(ConstantPropertiesUtil.ACCESS_KEY_ID,ConstantPropertiesUtil.ACCESS_KEY_SECRET);VodUploadRequest request = new VodUploadRequest();//視頻本地地址request.setMediaFilePath("D:\\測(cè)試視頻.mp4");//指定任務(wù)流,就是之前你上傳時(shí)設(shè)置的那個(gè)request.setProcedure("任務(wù)流");//調(diào)用上傳方法,傳入接入點(diǎn)地域及上傳請(qǐng)求。VodUploadResponse response = client.upload("對(duì)應(yīng)的AP節(jié)點(diǎn)", request);//返回文件id保存到業(yè)務(wù)表,用于控制視頻播放String fileId = response.getFileId();System.out.println("Upload FileId = {}"+response.getFileId());return fileId;} catch (Exception e) {System.out.println(e.toString());}return null;}后端刪除視頻
Controller和上面一樣,重點(diǎn)Service不太一樣
還是騰訊云SDK的內(nèi)容可在線(xiàn)生成相關(guān)刪除代碼:
地址:https://console.cloud.tencent.com/api/explorer?Product=vod&Version=2018-07-17&Action=DescribeMediaInfos&SignVersion=
生成出來(lái)的Service代碼
//刪除視頻@Overridepublic void removeVideo(String videoSourceId) {try{// 實(shí)例化一個(gè)認(rèn)證對(duì)象,入?yún)⑿枰獋魅腧v訊云賬戶(hù)secretId,secretKey,此處還需注意密鑰對(duì)的保密Credential cred = new Credential(ConstantPropertiesUtil.ACCESS_KEY_ID, ConstantPropertiesUtil.ACCESS_KEY_SECRET);// 實(shí)例化要請(qǐng)求產(chǎn)品的client對(duì)象,clientProfile是可選的VodClient client = new VodClient(cred, "");// 實(shí)例化一個(gè)請(qǐng)求對(duì)象,每個(gè)接口都會(huì)對(duì)應(yīng)一個(gè)request對(duì)象DeleteMediaRequest req = new DeleteMediaRequest();//設(shè)置刪除視頻IDreq.setFileId(videoSourceId);// 返回的resp是一個(gè)DeleteMediaResponse的實(shí)例,與請(qǐng)求對(duì)象對(duì)應(yīng)DeleteMediaResponse resp = client.DeleteMedia(req);// 輸出json格式的字符串回包System.out.println(DeleteMediaResponse.toJsonString(resp));} catch (TencentCloudSDKException e) {System.out.println(e.toString());}}點(diǎn)播服務(wù)整合前端
定義vod.js
CV頁(yè)面樣式 修改Video -> Form.vue頁(yè)面
騰訊云上傳視頻其他方式
之前的缺點(diǎn)
上傳代碼的部分有Bug,上傳路徑寫(xiě)固化了,而且沒(méi)有官方解決辦法
所以這里有了新的辦法就是下面的客戶(hù)端上傳視頻
更改是服務(wù)端Server上傳
客戶(hù)端上傳視頻
https://cloud.tencent.com/document/product/266/9219
操作步驟一(申請(qǐng)上傳簽名)
找到Java簽名示例
復(fù)制一下,編寫(xiě)簽名工具類(lèi)
Signature類(lèi) 在Util包下
在編寫(xiě)Controller來(lái)獲取生成的簽名,還是在那個(gè)包的Controller
整合客戶(hù)端前端頁(yè)面
因?yàn)樯蟼饕彩且粋€(gè)頁(yè)面嘛,所以也要對(duì)應(yīng)的有頁(yè)面進(jìn)行處理
復(fù)制粘貼騰訊云給的示例代碼
https://tencentyun.github.io/vod-js-sdk-v6/
請(qǐng) 單擊此處 查看 script 方式引入的 Demo,請(qǐng) 單擊此處 查看 Demo 源碼。
創(chuàng)建之后把 Demo 源碼CV進(jìn)去
在頁(yè)面上右鍵,跑起來(lái),就可以對(duì)客戶(hù)端上傳進(jìn)行測(cè)試
完善刪除視頻功能
將課程中對(duì)應(yīng)的視頻全部刪除
VideoController 刪除小節(jié)時(shí)帶著這個(gè)小節(jié)下的視頻全刪掉
提前注入,一會(huì)要調(diào)用服務(wù)刪視頻
一共兩個(gè)接口,一個(gè)是根據(jù)課程id刪除小節(jié),另一個(gè)是根據(jù)小節(jié)id刪除小節(jié)刪除視頻
從這里開(kāi)始就算是硅谷課堂的上半部分了,因?yàn)殚_(kāi)始了分布式的內(nèi)容
硅谷課堂中間部分筆記
具體鏈接可以看看博客主頁(yè)~
總結(jié)
- 上一篇: 网易云linux版本下载
- 下一篇: 微信小程序(看文档写实例七)微信小程序课