在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenHarmony開發(fā)案例:【電影卡片】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-04-15 17:53 ? 次閱讀

介紹

本篇Codelab基于元服務(wù)卡片的能力,實現(xiàn)帶有卡片的電影應(yīng)用,介紹卡片的開發(fā)過程和生命周期實現(xiàn)。需要完成以下功能:

  1. 元服務(wù)卡片,用于在桌面上添加2x2或2x4規(guī)格元服務(wù)卡片。
  2. 關(guān)系型數(shù)據(jù)庫,用于創(chuàng)建、查詢、添加、刪除卡片數(shù)據(jù)。

MovieCard.gif

相關(guān)概念

  • [關(guān)系型數(shù)據(jù)庫]:關(guān)系型數(shù)據(jù)庫基于SQLite組件提供了一套完整的對本地數(shù)據(jù)庫進(jìn)行管理的機(jī)制,對外提供了一系列的增、刪、改、查等接口,也可以直接運(yùn)行用戶輸入的SQL語句來滿足復(fù)雜的場景需要。
  • [元服務(wù)卡片]:卡片是一種界面展示形式,可以將應(yīng)用的重要信息或操作前置到卡片,以達(dá)到服務(wù)直達(dá)、減少體驗層級的目的。
    • 卡片提供方:顯示卡片內(nèi)容,控制卡片布局以及控件點(diǎn)擊事件。
    • 卡片使用方:顯示卡片內(nèi)容的宿主應(yīng)用,控制卡片在宿主中展示的位置。
    • 卡片管理服務(wù):用于管理系統(tǒng)中所添加卡片的常駐代理服務(wù),包括卡片對象的管理與使用,以及卡片周期性刷新等。

環(huán)境搭建

軟件要求

  • [DevEco Studio]版本:DevEco Studio 3.1 Release。
  • OpenHarmony SDK版本:API version 9。
  • 鴻蒙開發(fā)參考文檔:[qr23.cn/AKFP8k]

硬件要求

  • 開發(fā)板類型:[潤和RK3568開發(fā)板]。
  • OpenHarmony系統(tǒng):3.2 Release。

環(huán)境搭建

  1. [獲取OpenHarmony系統(tǒng)版本]:標(biāo)準(zhǔn)系統(tǒng)解決方案(二進(jìn)制)。以3.2 Release版本為例:
  2. 搭建燒錄環(huán)境。
    1. [完成DevEco Device Tool的安裝]
    2. [完成RK3568開發(fā)板的燒錄]
  3. 搭建開發(fā)環(huán)境。
    1. 開始前請參考[工具準(zhǔn)備],完成DevEco Studio的安裝和開發(fā)環(huán)境配置。
    2. 開發(fā)環(huán)境配置完成后,請參考[使用工程向?qū)創(chuàng)建工程(模板選擇“Empty Ability”)。
    3. 工程創(chuàng)建完成后,選擇使用[真機(jī)進(jìn)行調(diào)測]。

代碼結(jié)構(gòu)解讀

本篇Codelab只對核心代碼進(jìn)行講解,對于完整代碼,我們會在gitee中提供。

├──entry/src/main/ets            // 代碼區(qū)     
│  ├──common  
│  │  ├──constants
│  │  │  ├──CommonConstants.ets  // 常量類
│  │  │  └──StyleConstants.ets   // 格式常量類
│  │  ├──datasource
│  │  │  ├──DataSource.ets       // 懶加載數(shù)據(jù)源
│  │  │  └──MovieListData.ets    // 電影列表數(shù)據(jù) 
│  │  └──utils
│  │     ├──CommonUtils.ets      // 數(shù)據(jù)操作工具類  
│  │     ├──GlobalContext.ets    // 全局上下文工具類
│  │     └──Logger.ets           // 日志打印工具類
│  ├──detailsability
│  │  └──EntryDetailsAbility.ets // 電影詳情入口類
│  ├──entryability
│  │  └──EntryAbility.ets        // 程序入口類
│  ├──entryformability
│  │  └──EntryFormAbility.ets    // 卡片創(chuàng)建,更新,刪除操作類
│  ├──pages
│  │  ├──MovieDetailsPage.ets    // 電影詳情頁
│  │  └──MovieListPage.ets       // 主頁面
│  ├──view
│  │  ├──MovieDetailsTitle.ets   // 電影詳情頭部組件
│  │  ├──MovieItem.ets           // 列表item組件
│  │  ├──MovieStarring.ets       // 電影主演組件
│  │  ├──MovieStills.ets         // 電影劇照組件
│  │  ├──StarsWidget.ets         // 電影評分組件
│  │  └──StoryIntroduce.ets      // 電影簡介組件
│  └──viewmodel
│     ├──FormBean.ets            // 卡片對象
│     ├──FormDataBean.ets        // 卡片數(shù)據(jù)對象
│     └──MovieDataBean.ets       // 電影數(shù)據(jù)對象
├──entry/src/main/js             // js代碼區(qū)
│  ├──card2x2                    // 2x2卡片目錄
│  ├──card2x4                    // 2x4卡片目錄
│  └──common                     // 卡片資源目錄
└──entry/src/main/resources      // 資源文件目錄


![搜狗高速瀏覽器截圖20240326151344.png](//file1.elecfans.com/web2/M00/C6/C5/wKgaomYCyYKAZp6HAAB4LWPdpdQ014.jpg)

## 關(guān)系型數(shù)據(jù)庫

元服務(wù)卡片需要用數(shù)據(jù)庫保存不同卡片數(shù)據(jù),而且在添加多張卡片情況下,需要保持?jǐn)?shù)據(jù)同步刷新。因此需要創(chuàng)建一張表,用于保存卡片信息。

1. 數(shù)據(jù)庫創(chuàng)建使用的SQLite。

// CommonConstants.ets
// 創(chuàng)建數(shù)據(jù)庫表結(jié)構(gòu)
static readonly CREATE_TABLE_FORM: string = 'CREATE TABLE IF NOT EXISTS Form ' +
'(id INTEGER PRIMARY KEY AUTOINCREMENT, formId TEXT NOT NULL, formName TEXT NOT NULL, dimension INTEGER)';

2. 在EntryAbility的onCreate方法通過CommonUtils.createRdbStore方法創(chuàng)建數(shù)據(jù)庫,并創(chuàng)建相應(yīng)的表。

// EntryAbility.ets
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
...
// 創(chuàng)建數(shù)據(jù)庫
CommonUtil.createRdbStore(this.context);
}
}

// CommonUtils.ets
import relationalStore from '@ohos.data.relationalStore';

async createRdbStore(context: Context) {
let rdbStore = GlobalContext.getContext().getObject('rdbStore') as relationalStore.RdbStore;
if (this.isEmpty(rdbStore)) {
rdbStore = await relationalStore.getRdbStore(context, CommonConstants.STORE_CONFIG);
if (!this.isEmpty(rdbStore)) {
rdbStore.executeSql(CommonConstants.CREATE_TABLE_FORM).catch((error: Error) = > {
Logger.error(CommonConstants.TAG_COMMON_UTILS, 'executeSql error ' + JSON.stringify(error));
});
GlobalContext.getContext().setObject('rdbStore', rdbStore);
}
}
return rdbStore;
}

## 構(gòu)建應(yīng)用頁面

電影卡片應(yīng)用有兩個頁面,分別是電影列表和電影詳情。

## 電影列表

電影列表采用Column容器嵌套List和自定義組件MovieItem形式完成頁面整體布局,效果如圖所示:

![](//file1.elecfans.com/web2/M00/C8/93/wKgZomYc95GAJr0JAAB7gIkV6B4913.jpg)

// MovieListPage.ets
build() {
Column() {
...
List({ space: StyleConstants.LIST_COMPONENT_SPACE }) {
LazyForEach(this.dataSource, (item: MovieDataBean) = > {
ListItem() {
// 電影item
MovieItem({ movieItem: item });
}
}, (item: MovieDataBean) = > JSON.stringify(item))
}
...
}
...
}

// MovieItem.ets
aboutToAppear() {
if (CommonUtils.isEmpty(this.movieItem)) {
Logger.error(CommonConstants.TAG_MOVIE_ITEM, 'movieItem is null');
return;
}
// 獲取電影索引
this.sort = this.movieItem.sort;
...
}

build() {
Row(){
...
Text($r('app.string.want_to_see'))
...
.onClick(() = > {
router.pushUrl({
url: CommonConstants.SEE_BUTTON_PUSH,
params: {
index: this.sort
}
}).catch((error: Error) = > {
...
});
})
}
...
}

## 電影詳情

電影詳情采用Column容器嵌套自定義組件MovieDetailsTitleStoryIntroduceMovieStarringMovieStills形式完成頁面整體布局,效果如圖所示:

![](//file1.elecfans.com/web2/M00/C9/77/wKgaomYc95GAPidnAACH3mClliI740.jpg)

// MovieDetailPage.ets
aboutToAppear() {
let index: number = 0;
let params = router.getParams() as Record< string, Object >;
if (!CommonUtils.isEmpty(params)) {
index = params.index as number;
} else {
let position = GlobalContext.getContext().getObject('position') as number;
index = position ?? 0;
}
let listData: MovieDataBean[] = CommonUtils.getListData();
if (CommonUtils.isEmptyArr(listData)) {
Logger.error(CommonConstants.TAG_DETAILS_PAGE, 'listData is 0');
return;
}
this.movieData = listData[index];
this.introduction = listData[index].introduction;
}

build() {
Column() {
...
Column() {
// 電影詳情頭部組件
MovieDetailsTitle({
movieDetail: this.movieData
})
// 劇情簡介組件
StoryIntroduce({
introduction: this.introduction
})
}
...
// 電影主演組件
MovieStarring()
// 電影劇照組件
MovieStills()
}
...
}

## 元服務(wù)卡片

使用元服務(wù)卡片分為四步:創(chuàng)建、初始化、更新、刪除。

### 創(chuàng)建元服務(wù)卡片目錄

1. 在main目錄下,點(diǎn)擊鼠標(biāo)右鍵 > New > Service Widget。
   ![](//file1.elecfans.com/web2/M00/C8/6F/wKgZomYbz2OAdDzsAADeJtQGk-c457.jpg)
2. 然后選擇第一個選項下面帶有Hello World字樣,點(diǎn)擊下一步Next。
   ![](//file1.elecfans.com/web2/M00/C8/6F/wKgZomYbz2SAc8ymAABjV3ZW-3g413.jpg)
3. 填寫卡片名字(Service widget name)、卡片介紹(Description)、是否開啟低代碼開發(fā)(Enable Super Visual)、開發(fā)語言(ArkTS和JS)、支持卡片規(guī)格(Support dimension)、關(guān)聯(lián)表單(Ability name)點(diǎn)擊Finish完成創(chuàng)建。如需創(chuàng)建多個卡片目錄重新按照步驟1執(zhí)行。
   ![](//file1.elecfans.com/web2/M00/C8/6F/wKgZomYbz2OAd_d6AABvu7227Bc994.jpg)
4. 創(chuàng)建完卡片后,同級目錄出現(xiàn)js目錄,然后開發(fā)者在js目錄下使用hml+css+json開發(fā)js卡片頁面。
   ![](//file1.elecfans.com/web2/M00/C9/56/wKgaomYbz2SARbYQAAAwbXW2TmQ950.jpg)

### 初始化元服務(wù)卡片

應(yīng)用選擇添加元服務(wù)卡片到桌面后,在EntryFormAbility的onAddForm方法進(jìn)行卡片初始化操作,效果如圖所示:

![](//file1.elecfans.com/web2/M00/C8/93/wKgZomYc95GAWiCzAAAzGCnPa84657.jpg)

// EntryFormAbility.ets
onAddForm(want: Want) {
if (want.parameters === undefined) {
return formBindingData.createFormBindingData();
}
let formId: string = want.parameters[CommonConstants.IDENTITY_KEY] as string;
let formName: string = want.parameters[CommonConstants.NAME_KEY] as string;
let dimensionFlag: number = want.parameters[CommonConstants.DIMENSION_KEY] as number;
CommonUtils.createRdbStore(this.context).then((rdbStore: relationalStore.RdbStore) = > {
let form: FormBean = new FormBean();
form.formId = formId;
form.formName = formName;
form.dimension = dimensionFlag;
CommonUtils.insertForm(form, rdbStore);
}).catch((error: Error) = > {
Logger.error(CommonConstants.TAG_FORM_ABILITY, 'onAddForm create rdb error ' + JSON.stringify(error));
});
let listData: MovieDataBean[] = CommonUtils.getListData();
let formData = CommonUtils.getFormData(listData);
return formBindingData.createFormBindingData(formData);
}

### 更新元服務(wù)卡片

1. 初始化加載電影列表布局之前,在MovieListPage的aboutToAppear方法中,通過CommonUtils.startTimer方法開啟定時器,時間到則調(diào)用updateMovieCardData方法更新電影卡片數(shù)據(jù)。

// MovieListPage.ets
aboutToAppear() {
...
// 啟動定時器,每5分鐘更新一次電影卡片數(shù)據(jù)。
CommonUtils.startTimer();
}

// CommonUtils.ets
startTimer() {
let intervalId = GlobalContext.getContext().getObject('intervalId') as number;
if (this.isEmpty(intervalId)) {
intervalId = setInterval(() = > {
let rdbStore = GlobalContext.getContext().getObject('rdbStore') as relationalStore.RdbStore;
this.updateMovieCardData(rdbStore);
}, CommonConstants.INTERVAL_DELAY_TIME);
}
GlobalContext.getContext().setObject('intervalId', intervalId);
}

// 更新電影卡片數(shù)據(jù)
updateMovieCardData(rdbStore: relationalStore.RdbStore) {
if (this.isEmpty(rdbStore)) {
Logger.error(CommonConstants.TAG_COMMON_UTILS, 'rdbStore is null');
return;
}
let predicates: relationalStore.RdbPredicates = new relationalStore.RdbPredicates(CommonConstants.TABLE_NAME);
rdbStore.query(predicates).then((resultSet: relationalStore.ResultSet) = > {
if (resultSet.rowCount <= 0) {
Logger.error(CommonConstants.TAG_COMMON_UTILS, 'updateCardMovieData rowCount <= 0');
return;
}
let listData: MovieDataBean[] = this.getListData();
resultSet.goToFirstRow();
do {
let formData = this.getFormData(listData);
let formId: string = resultSet.getString(resultSet.getColumnIndex(CommonConstants.FORM_ID));
formProvider.updateForm(formId, formBindingData.createFormBindingData(formData))
.catch((error: Error) = > {
Logger.error(CommonConstants.TAG_COMMON_UTILS, 'updateForm error ' + JSON.stringify(error));
});
} while (resultSet.goToNextRow());
resultSet.close();
}).catch((error: Error) = > {
Logger.error(CommonConstants.TAG_COMMON_UTILS, 'updateCardMovieData error ' + JSON.stringify(error));
});

2. 通過src/main/resources/base/profile/form_config.json配置文件,根據(jù)updateDuration或者scheduledUpdateTime字段配置刷新時間。updateDuration優(yōu)先級高于scheduledUpdateTime,兩者同時配置時,以updateDuration配置的刷新時間為準(zhǔn)。當(dāng)配置的刷新時間到了,系統(tǒng)調(diào)用onUpdateForm方法進(jìn)行更新。

// form_config.json
{
// 卡片的類名
"name": "card2x2",
// 卡片的描述
"description": "This is a service widget.",
// 卡片對應(yīng)完整路徑
"src": "./js/card2x2/pages/index/index",
// 定義與顯示窗口相關(guān)的配置
"window": {
"designWidth": 720,
"autoDesignWidth": true
},
// 卡片的主題樣式
"colorMode": "auto",
// 是否為默認(rèn)卡片
"isDefault": true,
// 卡片是否支持周期性刷新
"updateEnabled": true,
// 采用24小時制,精確到分鐘
"scheduledUpdateTime": "00:00",
// 當(dāng)取值為0時,表示該參數(shù)不生效,當(dāng)取值為正整數(shù)N時,表示刷新周期為30N分鐘。
"updateDuration": 1,
// 卡片默認(rèn)外觀規(guī)格
"defaultDimension": "2
2",
// 卡片支持外觀規(guī)格
"supportDimensions": [
"2*2"
]
}
...

// EntryFormAbility.ets
onUpdateForm(formId: string) {
CommonUtils.createRdbStore(this.context).then((rdbStore: relationalStore.RdbStore) = > {
CommonUtils.updateMovieCardData(rdbStore);
}).catch((error: Error) = > {
...
});
...
}

### 刪除元服務(wù)卡片

當(dāng)用戶需要刪除元服務(wù)卡片時,可以在EntryFormAbility的onRemoveForm方法中,通過CommonUtils.deleteFormData方法刪除數(shù)據(jù)庫中對應(yīng)的卡片信息。

// EntryFormAbility.ets
onRemoveForm(formId: string) {
CommonUtils.createRdbStore(this.context).then((rdbStore: relationalStore.RdbStore) = > {
// 從數(shù)據(jù)庫中刪除電影卡片信息
CommonUtils.deleteFormData(formId, rdbStore);
}).catch((error: Error) = > {
...
});
}

// CommonUtils.ets
deleteFormData(formId: string, rdbStore: relationalStore.RdbStore) {
...
let predicates: relationalStore.RdbPredicates = new relationalStore.RdbPredicates(CommonConstants.TABLE_NAME);
predicates.equalTo(CommonConstants.FORM_ID, formId);
rdbStore.delete(predicates).catch((error: Error) = > {
...
});
}


審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2351

    瀏覽量

    42850
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3722

    瀏覽量

    16313
收藏 人收藏

    評論

    相關(guān)推薦

    TL3588-視頻開發(fā)案

    TL3588-視頻開發(fā)案
    的頭像 發(fā)表于 01-24 16:29 ?681次閱讀
    TL3588-視頻<b class='flag-5'>開發(fā)案</b>例

    TLT507-Linux-RT應(yīng)用開發(fā)案

    TLT507-Linux-RT應(yīng)用開發(fā)案
    的頭像 發(fā)表于 01-26 09:46 ?708次閱讀
    TLT507-Linux-RT應(yīng)用<b class='flag-5'>開發(fā)案</b>例

    鴻蒙OS開發(fā)案例:【Stage模型卡片

    本示例展示了Stage模型卡片提供方的創(chuàng)建與使用。
    的頭像 發(fā)表于 04-09 17:13 ?995次閱讀
    鴻蒙OS<b class='flag-5'>開發(fā)案</b>例:【Stage模型<b class='flag-5'>卡片</b>】

    OpenHarmony南向開發(fā)案例:【分布式畫板】

    使用OpenHarmony3.1-Release開發(fā)的應(yīng)用。通過OpenHarmony的分布式技術(shù),使多人能夠一起畫畫。
    的頭像 發(fā)表于 04-12 14:40 ?1038次閱讀
    <b class='flag-5'>OpenHarmony</b>南向<b class='flag-5'>開發(fā)案</b>例:【分布式畫板】

    3568F-視頻開發(fā)案

    3568F-視頻開發(fā)案
    的頭像 發(fā)表于 04-12 13:51 ?898次閱讀
    3568F-視頻<b class='flag-5'>開發(fā)案</b>例

    OpenHarmony開發(fā)案例:【計步器卡片

    基于Stage模型實現(xiàn)帶有卡片的計步應(yīng)用,用于介紹卡片開發(fā)及生命周期實現(xiàn)。
    的頭像 發(fā)表于 04-15 09:22 ?701次閱讀
    <b class='flag-5'>OpenHarmony</b><b class='flag-5'>開發(fā)案</b>例:【計步器<b class='flag-5'>卡片</b>】

    OpenHarmony南向開發(fā)案例:【智能油煙機(jī)】

    基于Hi3516開發(fā)板,使用開源OpenHarmony開發(fā)的應(yīng)用。
    的頭像 發(fā)表于 04-18 15:54 ?1057次閱讀
    <b class='flag-5'>OpenHarmony</b>南向<b class='flag-5'>開發(fā)案</b>例:【智能油煙機(jī)】

    基于HarmonyOS Java UI,實現(xiàn)一個可以定時刷新文字和圖片的電影推薦卡片

    參考Java卡片開發(fā)指導(dǎo)7. 回顧和總結(jié)本篇Codelab我們介紹了Java電影卡片的頁面布局開發(fā)卡片
    發(fā)表于 09-14 14:55

    HarmonyOS與OpenHarmony應(yīng)用開發(fā)差異

    DevEco Studio是HarmonyOS的配套的開發(fā)IDE,因為HarmonyOS是基于OpenHarmony開發(fā)的,因此,使用DevEco Studio(配套HarmonyOS)也可以進(jìn)行
    發(fā)表于 10-22 10:35

    HarmonyOS/OpenHarmony應(yīng)用開發(fā)-FA卡片開發(fā)體驗

    :HarmonyOSOpenHarmony應(yīng)用開發(fā)-FA卡片開發(fā)體驗.docx示例代碼:https://gitee.com/jltfcloudcn/jump_to/tree/maste
    發(fā)表于 12-06 14:48

    HarmonyOS/OpenHarmony元服務(wù)開發(fā)-配置卡片的配置文件

    ;supportDimensions\": [ \"2*2\" ] } ] } *附件:HarmonyOSOpenHarmony元服務(wù)開發(fā)-配置卡片的配置文件.docx
    發(fā)表于 08-01 11:45

    華為開發(fā)者分論壇HarmonyOS學(xué)生公開課-OpenHarmony Codelabs開發(fā)案

    2021華為開發(fā)者分論壇HarmonyOS學(xué)生公開課-OpenHarmony Codelabs開發(fā)案
    的頭像 發(fā)表于 10-24 11:25 ?1921次閱讀
    華為<b class='flag-5'>開發(fā)</b>者分論壇HarmonyOS學(xué)生公開課-<b class='flag-5'>OpenHarmony</b> Codelabs<b class='flag-5'>開發(fā)案</b>例

    如何在OpenHarmony開發(fā)服務(wù)卡片

    本篇文章我們將分享如何在 OpenHarmony開發(fā)服務(wù)卡片
    的頭像 發(fā)表于 04-10 11:12 ?1059次閱讀

    RK3568---NPU開發(fā)案

    RK3568---NPU開發(fā)案
    的頭像 發(fā)表于 01-19 13:50 ?929次閱讀
    RK3568---NPU<b class='flag-5'>開發(fā)案</b>例

    OpenHarmony南向開發(fā)案例:【智能中控屏】

    基于Hi3516開發(fā)板,使用開源OpenHarmony開發(fā)的應(yīng)用。通過控制面板可以控制同一局域網(wǎng)內(nèi)的空調(diào),窗簾,燈等智能家居設(shè)備。
    的頭像 發(fā)表于 04-17 16:12 ?389次閱讀
    <b class='flag-5'>OpenHarmony</b>南向<b class='flag-5'>開發(fā)案</b>例:【智能中控屏】
    主站蜘蛛池模板: 两性色午夜视频免费网| 成人a毛片视频免费看| 日韩精品免费一区二区三区| 色爱区综合激情五月综合色| 国产三级a三级三级野外| www五月天| 97久草| 色婷婷九月| 人人叉人人| 国产黄页| 999久久久免费精品国产牛牛| 亚洲人成人| 欧美洲视频在线观看| 国产成人优优影院| 奇米影视777欧美在线观看| 大美女久久久久久j久久| 欧美激情xxxx性bbbb| 免费在线观看a| 91九色成人| 国产资源在线视频| 亚洲欧美婷婷| 操你啦在线播放| 69日本人xxxx16-18| 一区二区三区免费视频网站| 日韩欧美视频在线一区二区| 亚洲第一视频在线观看| 2019天天干夜夜操| 天堂在线中文无弹窗全文阅读| www日本高清| 亚洲乱码卡一卡二卡三| 色天使色婷婷丁香久久综合| 亚洲午夜久久影院| 国产91啪| 天天射综合| 五月天欧美| 一级做a爰片久久毛片人呢| 高清毛片一区二区三区| 中文字幕亚洲一区二区v@在线| 欧美伊人| a一级视频| 欧美性狂猛xxxxxbbbbb|