日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

使用React Native和Spring Boot构建一个移动应用

發(fā)布時(shí)間:2023/12/3 javascript 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用React Native和Spring Boot构建一个移动应用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

“我喜歡編寫身份驗(yàn)證和授權(quán)代碼。” ?從來(lái)沒(méi)有Java開(kāi)發(fā)人員。 厭倦了一次又一次地建立相同的登錄屏幕? 嘗試使用Okta API進(jìn)行托管身份驗(yàn)證,授權(quán)和多因素身份驗(yàn)證。

React Native是使用React構(gòu)建移動(dòng)應(yīng)用程序的框架。 React允許您使用聲明式編程風(fēng)格來(lái)描述UI外觀。 它使用嵌入式HTML(稱為JSX)來(lái)呈現(xiàn)按鈕,列表,可滾動(dòng)視圖和許多其他組件。

我是一位經(jīng)驗(yàn)豐富的Java和JavaScript開(kāi)發(fā)人員,喜歡Spring和TypeScript。 有人可能稱我為Java趕時(shí)髦的人,因?yàn)槲蚁矚gJavaScript。 在本文中,我將向您展示如何構(gòu)建與PostgreSQL數(shù)據(jù)庫(kù)對(duì)話的Spring Boot API。 您將使用Elasticsearch使數(shù)據(jù)可搜索。 您還將學(xué)習(xí)如何使用Kubernetes將其部署到Cloud Foundry和Google Cloud Platform。

真正很酷的部分是您將看到如何使用React Native構(gòu)建移動(dòng)應(yīng)用程序。 React Native允許您使用已知和喜愛(ài)的Web技術(shù)構(gòu)建移動(dòng)應(yīng)用程序:React和JavaScript! 我將向您展示如何在設(shè)備仿真器上對(duì)其進(jìn)行測(cè)試并將其部署到手機(jī)中。 Giddyup!

創(chuàng)建一個(gè)Spring Boot應(yīng)用

在我最近的開(kāi)發(fā)人員生涯中,我構(gòu)建了一個(gè)應(yīng)用程序來(lái)幫助我跟蹤和監(jiān)視我的健康狀況。 我在編寫JHipster Mini-Book時(shí)想到了這個(gè)主意。 我的靈感來(lái)自Spring Boot的執(zhí)行器,它可以幫助您監(jiān)視Spring Boot應(yīng)用程序的運(yùn)行狀況。 該應(yīng)用程序名為21-Points Health,您可以在GitHub上找到其源代碼 。

21點(diǎn)健康系統(tǒng)使用21點(diǎn)系統(tǒng)來(lái)查看您每周的健康狀況。 它的規(guī)則很簡(jiǎn)單:由于以下原因,您每天最多可以賺取三分:

  • 如果您飲食健康,那么您會(huì)有所收獲。 否則為零。
  • 如果您運(yùn)動(dòng),就會(huì)有所收獲。
  • 如果你不喝酒,你會(huì)得到一點(diǎn)。

我將在本教程中作弊。 與其逐行編寫每個(gè)組件,不如使用JHipster和Ignite JHipster 生成 API和應(yīng)用程序。

什么是JHipster?

我很高興你問(wèn)! 這是一個(gè)Apache許可的開(kāi)源項(xiàng)目,可讓您生成Spring Boot API以及Angular或React UI。 它包括對(duì)生成CRUD屏幕和添加所有必要管道的支持。 它甚至生成微服務(wù)架構(gòu)!

Ignite JHipster是JHipster的補(bǔ)充功能。 這是Ignite CLI項(xiàng)目的藍(lán)圖模板。 Ignite CLI是開(kāi)源的,并由MIT許可,由Infinite Red的好伙伴制作。 通過(guò)Ignite CLI,您可以在幾秒鐘內(nèi)生成預(yù)集成了許多組件的React Native應(yīng)用程序。 第一次看到Gant Laborde的演示時(shí),我被震撼了 。

為了使事情Swift發(fā)展,我運(yùn)行了jhipster export-jdl來(lái)從21點(diǎn)健康導(dǎo)出一個(gè)實(shí)體定義。 導(dǎo)出實(shí)體定義后,我使用JDL-Studio為我的項(xiàng)目創(chuàng)建了一個(gè)應(yīng)用程序定義。 然后,我單擊下載圖標(biāo)以將文件保存到硬盤。

您在下面看到的代碼稱為JDL或JHipster域語(yǔ)言。 它最初是為JHipster設(shè)計(jì)的,以允許多個(gè)實(shí)體并指定其所有屬性,關(guān)系和分頁(yè)功能。 最近對(duì)其進(jìn)行了增強(qiáng),可以從一個(gè)文件生成整個(gè)應(yīng)用程序! 💥

application {config {applicationType monolith,baseName HealthPointspackageName com.okta.developer,authenticationType oauth2,prodDatabaseType postgresql,buildTool gradle,searchEngine elasticsearch,testFrameworks [protractor],clientFramework react,useSass true,enableTranslation true,nativeLanguage en,languages [en, es]}entities Points, BloodPressure, Weight, Preferences }// JDL definition for application 'TwentyOnePoints' generated with command 'jhipster export-jdl'entity BloodPressure {timestamp ZonedDateTime required,systolic Integer required,diastolic Integer required } entity Weight {timestamp ZonedDateTime required,weight Double required } entity Points {date LocalDate required,exercise Integer,meals Integer,alcohol Integer,notes String maxlength(140) } entity Preferences {weeklyGoal Integer required min(10) max(21),weightUnits Units required }enum Units {KG,LB }relationship OneToOne {Preferences{user(login)} to User } relationship ManyToOne {BloodPressure{user(login)} to User,Weight{user(login)} to User,Points{user(login)} to User }paginate BloodPressure, Weight with infinite-scroll paginate Points with pagination

創(chuàng)建一個(gè)新目錄,其中包含jhipster-api目錄。

mkdir -p react-native-spring-boot/jhipster-api

將上面的JDL復(fù)制到react-native-spring-boot目錄內(nèi)的app.jh文件中。 使用npm安裝JHipster。

npm i -g generator-jhipster@5.4.2

在終端窗口中導(dǎo)航到j(luò)hipster-api目錄。 運(yùn)行下面的命令以生成具有大量可用功能的應(yīng)用程序。

jhipster import-jdl ../app.jh

運(yùn)行您的Spring Boot應(yīng)用

此應(yīng)用程序在其應(yīng)用程序配置中指定了許多技術(shù)和功能,包括OIDC身份驗(yàn)證,PostgreSQL,Gradle,Elasticsearch,量角器測(cè)試,React和Sass。 不僅如此,它甚至還涵蓋了大多數(shù)代碼的測(cè)試范圍!

為了確保您的應(yīng)用程序正常運(yùn)行,請(qǐng)為Elasticsearch,Keycloak,PostgreSQL和Sonar啟動(dòng)一些Docker容器。 以下命令應(yīng)從jhipster-api目錄運(yùn)行。

docker-compose -f src/main/docker/elasticsearch.yml up -d docker-compose -f src/main/docker/keycloak.yml up -d docker-compose -f src/main/docker/postgresql.yml up -d docker-compose -f src/main/docker/sonar.yml up -d

這些容器可能需要一點(diǎn)時(shí)間才能下載,因此您可能想要喝杯咖啡或一杯水。

在等待時(shí),您還可以將項(xiàng)目提交到Git。 如果安裝了Git,JHipster將在jhipster-api目錄中運(yùn)行g(shù)it init 。 由于您將Spring Boot應(yīng)用程序和React Native應(yīng)用程序放在同一存儲(chǔ)庫(kù)中,因此請(qǐng)從jhipster-api刪除.git并在父目錄中初始化Git。

rm -rf jhipster-api/.git git init git add . git commit -m "Generate Spring Boot API"

使用聲納確保測(cè)試覆蓋率

JHipster生成具有高代碼質(zhì)量的應(yīng)用程序。 使用SonarCloud分析代碼質(zhì)量,SonarCloud由JHipster自動(dòng)配置。 “代碼質(zhì)量”度量標(biāo)準(zhǔn)由測(cè)試覆蓋的代碼百分比確定。

一旦所有Docker容器啟動(dòng)完成,請(qǐng)運(yùn)行以下命令以證明代碼質(zhì)量為👍(來(lái)自jhipster-api目錄)。

./gradlew -Pprod clean test sonarqube
如果您不將項(xiàng)目提交給Git,那么sonarqube任務(wù)可能會(huì)失敗 。

此過(guò)程完成后,您可以在Sonar儀表板上的http://127.0.0.1:9001上獲得對(duì)項(xiàng)目的分析。 進(jìn)行檢查-您的應(yīng)用程序獲得了AAA評(píng)級(jí)! 還不錯(cuò)吧?

為您的Spring Boot API創(chuàng)建一個(gè)React Native應(yīng)用

您可以使用Jon Ruddell創(chuàng)建的Ignite JHipster為Spring Boot API構(gòu)建React Native應(yīng)用。 喬恩(Jon)是最多產(chǎn)的JHipster貢獻(xiàn)者之一 。 ??

安裝Ignite CLI:

npm i -g ignite-cli@2.1.2 ignite-jhipster@1.12.1

確保您位于react-native-spring-boot目錄中,然后生成一個(gè)React Native應(yīng)用程序。

ignite new HealthPoints -b ignite-jhipster

當(dāng)提示您輸入jhipster-api項(xiàng)目的路徑時(shí),輸入jhipster-api 。

項(xiàng)目完成生成后,將HealthPoints重命名為react-native-app ,然后將其提交給Git。

mv HealthPoints react-native-app rm -rf react-native-app/.git git add . git commit -m "Add React Native app"

您可能會(huì)注意到,兩個(gè)新文件已添加到您的API項(xiàng)目中。

create mode 100644 jhipster-api/src/main/java/com/okta/developer/config/ResourceServerConfiguration.java create mode 100644 jhipster-api/src/main/java/com/okta/developer/web/rest/AuthInfoResource.java

這些類為您的項(xiàng)目配置資源服務(wù)器(以便您可以傳遞帶有訪問(wèn)令牌的Authorization標(biāo)頭),并通過(guò)REST端點(diǎn)公開(kāi)OIDC頒發(fā)者和客戶端ID。

修改React Native App以進(jìn)行OAuth 2.0 / OIDC登錄

您將需要對(duì)React Native應(yīng)用程序進(jìn)行一些更改 ,以便OIDC登錄有效。 我在下面總結(jié)了它們。

為iOS更新文件

如果您想在iOS上運(yùn)行您的應(yīng)用,則需要修改react-native-app/ios/HealthPoints/AppDelegate.m以在頂部添加openURL()方法和導(dǎo)入。

#import <React/RCTLinkingManager.h>

然后在文件底部的@end之前添加方法。

- (BOOL)application:(UIApplication *)applicationopenURL:(NSURL *)urloptions:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {return [RCTLinkingManager application:application openURL:url options:options]; }

您還需要配置iOS URL方案。 運(yùn)行open ios/HealthPoints.xcodeproj以在Xcode中打開(kāi)項(xiàng)目。 導(dǎo)航到“ 項(xiàng)目” >“ 信息” >“ URL類型”,然后指定healthpoints如下面的屏幕截圖所示。

如果您不想使用Xcode,也可以修改ios/HealthPoints/Info.plist 。

<key>CFBundleSignature</key><string>????</string> + <key>CFBundleURLTypes</key> + <array> + <dict> + <key>CFBundleTypeRole</key> + <string>Editor</string> + <key>CFBundleURLName</key> + <string>healthpoints</string> + <key>CFBundleURLSchemes</key> + <array> + <string>healthpoints</string> + </array> + </dict> + </array><key>CFBundleVersion</key>

Android更新檔案

為了讓Android方面了解您的URL方案,請(qǐng)將其添加到android/app/src/main/AndroidManifest.xml 。 以下XML應(yīng)該位于現(xiàn)有的<intent-filter> 。

<intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /><data android:scheme="healthpoints" /> </intent-filter>

您還需要將android:launchMode屬性添加到主要的<application>元素。 Android需要此功能以在現(xiàn)有MainActivity接收深度鏈接響應(yīng),而不是新響應(yīng)。

<applicationandroid:name=".MainApplication"android:launchMode="singleTask"

更新Keycloak的重定向URI

您還需要更新Keycloak才能知道您應(yīng)用的URL方案,因?yàn)樗米髦囟ㄏ騏RI。 在瀏覽器中打開(kāi)http://localhost:9080/auth/admin ,然后使用admin / admin登錄。 導(dǎo)航到客戶端 > web_app并添加healthpoints://authorize作為有效的重定向URI。

在iOS上運(yùn)行您的React Native App

要運(yùn)行React Native應(yīng)用程序,您需要首先啟動(dòng)Spring Boot應(yīng)用程序。 導(dǎo)航到j(luò)hipster-api目錄并運(yùn)行./gradlew 。 在另一個(gè)終端窗口中,導(dǎo)航到react-native-app并運(yùn)行react-native run-ios 。

如果出現(xiàn)錯(cuò)誤Print: Entry, ":CFBundleIdentifier", Does Not Exist ,請(qǐng)運(yùn)行rm -rf ~/.rncache試。

單擊左上角的漢堡菜單,然后單擊登錄,驗(yàn)證您可以登錄 。 使用“ admin”作為用戶名和密碼。

要在iOS Simulator中啟用代碼的實(shí)時(shí)重載,請(qǐng)先單擊模擬器,然后按? + R

在Android上運(yùn)行您的React Native App

要在Android模擬器上運(yùn)行您的應(yīng)用,請(qǐng)運(yùn)行react-native run-android 。 如果您沒(méi)有插入電話或沒(méi)有運(yùn)行Android虛擬設(shè)備(AVD),則會(huì)看到錯(cuò)誤消息:

Could not install the app on the device, read the error above for details.

要解決此問(wèn)題,請(qǐng)打開(kāi)Android Studio,選擇打開(kāi)現(xiàn)有項(xiàng)目 ,然后在項(xiàng)目中選擇android目錄。 如果系統(tǒng)提示您“安裝構(gòu)建工具并同步項(xiàng)目”,請(qǐng)執(zhí)行此操作。

要?jiǎng)?chuàng)建新的AVD,請(qǐng)導(dǎo)航至工具 > Android > AVD Manager 。 創(chuàng)建一個(gè)新的虛擬設(shè)備,然后單擊播放。 從下面的設(shè)置中可以看到,我選擇了Pixel 2。

為了使Keycloak和您的API在模擬器中與Android一起使用,您必須將所有l(wèi)ocalhost鏈接更改為計(jì)算機(jī)的IP地址(例如192.168.0.2 )。

這意味著您需要將JHipster應(yīng)用src/main/resources/config/application.yml中的src/main/resources/config/application.yml更新為以下內(nèi)容。

security:oauth2:client:access-token-uri: http://{yourIPAddress}:9080/auth/realms/jhipster/protocol/openid-connect/tokenuser-authorization-uri: http://{yourIPAddress}:9080/auth/realms/jhipster/protocol/openid-connect/authclient-id: web_appclient-secret: web_appscope: openid profile emailresource:user-info-uri: http://{yourIPAddress}:9080/auth/realms/jhipster/protocol/openid-connect/userinfo

您還需要在React Native應(yīng)用程序的App/Config/AppConfig.js更新apiUrl 。

export default {apiUrl: 'http://{yourIPAddress}:8080/',appUrlScheme: 'healthpoints' }

再次運(yùn)行react-native run-android 。 您應(yīng)該能夠像在iOS上一樣登錄。

要在Android上實(shí)時(shí)重新加載代碼,請(qǐng)先在模擬器上單擊,然后按Ctrl + M (在MacOS上為? + M )或搖晃具有正在運(yùn)行的應(yīng)用程序的Android設(shè)備。 然后從彈出窗口中選擇“ 啟用實(shí)時(shí)重新加載”選項(xiàng)。

在本教程的其余部分中,我將展示iOS上的所有示例,但您可以根據(jù)需要使用Android。

在React Native App中生成CRUD頁(yè)面

要在Spring Boot API中生成用于管理實(shí)體的頁(yè)面,請(qǐng)?jiān)趓eact-native-app目錄中運(yùn)行以下命令。

ignite generate import-jdl ../app.jh

運(yùn)行react-native run-ios ,登錄,然后單擊“ 實(shí)體”菜單項(xiàng)。 您應(yīng)該會(huì)看到類似下面的屏幕。

單擊點(diǎn) ,您應(yīng)該可以添加點(diǎn)。

調(diào)整React Native Points編輯屏幕以使用Toggles

我的21點(diǎn)健康應(yīng)用程序的目標(biāo)是計(jì)算一周內(nèi)您獲得的健康點(diǎn)總數(shù),最大值為21。因此,我認(rèn)為更改運(yùn)動(dòng),進(jìn)餐,和酒精可以切換,而不是原始整數(shù)。 如果用戶將其打開(kāi),則應(yīng)用程序應(yīng)將值存儲(chǔ)為“ 1”。 如果他們關(guān)閉它,它應(yīng)該記錄為“ 0”。

要對(duì)React Native應(yīng)用程序進(jìn)行此更改, App/Containers/PointEntityEditScreen.js在您喜歡的編輯器中打開(kāi)App/Containers/PointEntityEditScreen.js 。 更改formModel以將t.Boolean用于運(yùn)動(dòng),進(jìn)餐和飲酒。

formModel: t.struct({id: t.maybe(t.Number),date: t.Date,exercise: t.maybe(t.Boolean),meals: t.maybe(t.Boolean),alcohol: t.maybe(t.Boolean),notes: t.maybe(t.String),userId: this.getUsers() }),

然后,根據(jù)用戶的選擇,更改entityToFormValue()和formValueToEntity()方法以保存1或0。

entityToFormValue = (value) => {if (!value) {return {}}return {id: value.id || null,date: value.date || null,exercise: value.exercise === 1 ? true : false,meals: value.meals === 1 ? true : false,alcohol: value.alcohol === 1 ? true : false,notes: value.notes || null,userId: (value.user && value.user.id) ? value.user.id : null} } formValueToEntity = (value) => {return {id: value.id || null,date: value.date || null,exercise: (value.exercise) ? 1 : 0,meals: (value.meals) ? 1 : 0,alcohol: (value.alcohol) ? 1 : 0,notes: value.notes || null,user: value.userId ? { id: value.userId } : null} }

在使用它時(shí),您可以將默認(rèn)的Points實(shí)體更改為具有默認(rèn)日期的今天日期和true日期。 您可以通過(guò)修改componentWillMount()并更改formValue 。

componentWillMount () {if (this.props.entityId) {this.props.getPoint(this.props.entityId)} else {this.setState({formValue: {date: new Date(), exercise: true, meals: true, alcohol: true}})}this.props.getAllUsers() }

使用? + M在Simulator中刷新應(yīng)用。 創(chuàng)建新點(diǎn)時(shí),應(yīng)該會(huì)看到新的默認(rèn)值。

調(diào)整React App的使用要點(diǎn)復(fù)選框

由于您的JHipster應(yīng)用程序也具有React UI,因此有必要將點(diǎn)輸入/編輯屏幕更改為使用類似的機(jī)制:復(fù)選框。 打開(kāi)jhipster-api/src/main/webapp/…?/points-update.tsx并用以下三個(gè)字段替換TSX(T表示TypeScript)。 您可能會(huì)注意到trueValue和falseValue屬性處理將檢查轉(zhuǎn)換為true,反之亦然。

jhipster-api / src / main / webapp / app / entities / points / points-point.update.tsx

<AvGroup check><AvInput id="points-exercise" type="checkbox" className="form-control"name="exercise" trueValue={1} falseValue={0} /> // (1)<Label check id="exerciseLabel" for="exercise"><Translate contentKey="healthPointsApp.points.exercise">Exercise</Translate></Label> </AvGroup> <AvGroup check><AvInput id="points-meals" type="checkbox" className="form-control"name="meals" trueValue={1} falseValue={0} /><Label check id="mealsLabel" for="meals"><Translate contentKey="healthPointsApp.points.meals">Meals</Translate></Label> </AvGroup> <AvGroup check><AvInput id="points-alcohol" type="checkbox" className="form-control"name="alcohol" trueValue={1} falseValue={0} /><Label check id="alcoholLabel" for="alcohol"><Translate contentKey="healthPointsApp.points.alcohol">Alcohol</Translate></Label> </AvGroup>

在jhipster-api目錄中,運(yùn)行npm start (或yarn start )并驗(yàn)證您的更改是否存在。 下面的屏幕快照顯示了編輯React Native應(yīng)用輸入的記錄時(shí)的外觀。

使用Okta的API進(jìn)行身份識(shí)別

借助Spring Boot和Spring Security,在JHipster應(yīng)用程序中從Keycload切換到Okta以獲得身份很容易。 首先,您需要一個(gè)Okta開(kāi)發(fā)人員帳戶。 如果您還沒(méi)有,請(qǐng)?jiān)L問(wèn)developer.okta.com/signup進(jìn)行注冊(cè)。 Okta是像Keycloak這樣的OIDC提供程序,但它始終處于打開(kāi)狀態(tài),因此您不必對(duì)其進(jìn)行管理。

登錄到您的Okta Developer帳戶,然后導(dǎo)航到Applications > Add Application 。 單擊“ Web” ,然后單擊“ 下一步” 。 給應(yīng)用程序起一個(gè)您會(huì)記住的名稱,并指定http://localhost:8080/login和healthpoints://authorize作為登錄重定向URI。 單擊完成 ,然后再次對(duì)其進(jìn)行編輯以選擇“隱式(混合)” +允許ID和訪問(wèn)令牌。 請(qǐng)注意客戶端ID和密碼,您需要在一分鐘內(nèi)將它們復(fù)制/粘貼到文件中。

創(chuàng)建一個(gè)ROLE_ADMIN和ROLE_USER組(“ 用戶” >“ 組” >“ 添加組” )并將用戶添加到其中。 我建議將您注冊(cè)時(shí)使用的帳戶添加到ROLE_ADMIN并創(chuàng)建一個(gè)新用戶(“ 用戶” >“ 添加人” )以添加到ROLE_USER 。

導(dǎo)航到API > 授權(quán)服務(wù)器 ,然后單擊一個(gè)名為default的名稱進(jìn)行編輯。 點(diǎn)擊索賠標(biāo)簽,然后添加索賠 。 將其命名為“角色”,并將其包含在ID令牌中。 將值類型設(shè)置為“ Groups”,并將過(guò)濾器設(shè)置為.*的正則表達(dá)式。 單擊創(chuàng)建以完成該過(guò)程。

在硬盤驅(qū)動(dòng)器上創(chuàng)建一個(gè)名為~/.okta.env的文件,并在其中指定應(yīng)用程序的設(shè)置。

#!/bin/bash export SECURITY_OAUTH2_CLIENT_ACCESS_TOKEN_URI="https://{yourOktaDomain}/oauth2/default/v1/token" export SECURITY_OAUTH2_CLIENT_USER_AUTHORIZATION_URI="https://{yourOktaDomain}/oauth2/default/v1/authorize" export SECURITY_OAUTH2_RESOURCE_USER_INFO_URI="https://{yourOktaDomain}/oauth2/default/v1/userinfo" export SECURITY_OAUTH2_CLIENT_CLIENT_ID="{yourClientId}" export SECURITY_OAUTH2_CLIENT_CLIENT_SECRET="{yourClientSecret}"
確保您的*URI變量中沒(méi)有-admin 。 這是一個(gè)常見(jiàn)的錯(cuò)誤。

在運(yùn)行Spring Boot應(yīng)用程序的終端中,終止進(jìn)程,運(yùn)行source ~/.okta.env , ./gradlew再次運(yùn)行./gradlew 。 您應(yīng)該能夠在瀏覽器和React Native應(yīng)用程序中登錄http://localhost:8080 (刷新或重新啟動(dòng)后)。

調(diào)試React Native Apps

如果您遇到問(wèn)題,或者只是想看看正在執(zhí)行什么API調(diào)用,可以使用Reactotron 。 Reactotron是一個(gè)桌面應(yīng)用程序,用于檢查您的React和React Native應(yīng)用程序。 它應(yīng)該可以與iOS一起使用,而無(wú)需進(jìn)行任何更改。 對(duì)于Android,在運(yùn)行AVD之后,您需要運(yùn)行adb reverse tcp:9090 tcp:9090 。

一旦運(yùn)行,您就可以看到正在進(jìn)行的API調(diào)用以及日志消息。

如果您想將自己的消息記錄到Reactotron,可以使用< console.tron.log('debug message') 。

打包您的React Native App進(jìn)行生產(chǎn)

最后,我想向您展示將應(yīng)用程序部署到生產(chǎn)環(huán)境。 由于將React Native應(yīng)用程序安裝到物理設(shè)備上有很多步驟,因此我將參考React Native的“在設(shè)備上運(yùn)行”文檔 。 它應(yīng)該像通過(guò)USB插入設(shè)備,配置代碼簽名以及構(gòu)建/運(yùn)行應(yīng)用程序那樣簡(jiǎn)單。 您還需要配置API所在的URL。

您知道Spring Boot有什么很棒的功能嗎? 有很多支持它的云提供商! 如果平臺(tái)支持Spring Boot,則應(yīng)該可以在其上運(yùn)行JHipster應(yīng)用程序!

請(qǐng)按照以下說(shuō)明使用Kubernetes將您的API部署到Pivotal的Cloud Foundry和Google Cloud Platform。 Cloud Foundry和Kubernetes都有多個(gè)提供程序,因此即使您未使用Pivotal或Google,這些說(shuō)明也應(yīng)適用。

將Spring Boot API部署到Cloud Foundry

JHipster具有Cloud Foundry子生成器 ,可以輕松部署到Cloud Foundry。 它只需要您運(yùn)行一個(gè)命令。 但是,您已經(jīng)在API中配置了Elasticsearch,并且子生成器不支持自動(dòng)為您配置Elasticsearch實(shí)例。 要解決此限制,請(qǐng)修改jhipster-api/src/main/resources/config/application-prod.yml并為Spring Data Jest查找以下配置:

data:jest:uri: http://localhost:9200

將其替換為以下內(nèi)容,這將使Elasticsearch以嵌入式模式運(yùn)行。

data:elasticsearch:properties:path:home: /tmp/elasticsearch

由于我在JHipster中發(fā)現(xiàn)了一個(gè)問(wèn)題 ,您還需要?jiǎng)h除幾個(gè)屬性。

@@ -30,15 +30,12 @@ spring:url: jdbc:postgresql://localhost:5432/HealthPointsusername: HealthPointspassword: - hikari: - auto-commit: falsejpa:database-platform: io.github.jhipster.domain.util.FixedPostgreSQL82Dialectdatabase: POSTGRESQLshow-sql: falseproperties:hibernate.id.new_generator_mappings: true - hibernate.connection.provider_disables_autocommit: truehibernate.cache.use_second_level_cache: truehibernate.cache.use_query_cache: falsehibernate.generate_statistics: false

要使用Pivotal Web Services在Cloud Foundry上部署所有內(nèi)容,您需要?jiǎng)?chuàng)建一個(gè)帳戶,下載/安裝Cloud Foundry CLI并登錄(使用cf login -a api.run.pivotal.io )。

登錄“ No space targeted, use 'cf target -s SPACE'后,您可能會(huì)收到警告。 如果這樣做, 請(qǐng)?jiān)跒g覽器中登錄https://run.pivotal.io ,創(chuàng)建一個(gè)空格,然后根據(jù)建議運(yùn)行命令。

然后在jhipster-api目錄中運(yùn)行jhipster cloudfoundry 。 您會(huì)在下面的提示中看到我選擇的值。

CloudFoundry configuration is starting ? Name to deploy as? HealthPoints ? Which profile would you like to use? prod ? What is the name of your database service? elephantsql ? What is the name of your database plan? turtle

當(dāng)提示您覆蓋build.gradle ,鍵入a 。

第一次運(yùn)行jhipster cloudfoundry ,它沒(méi)有用。 第二次運(yùn)行成功。
source ~/.okta.env export CF_APP_NAME=healthpoints cf set-env $CF_APP_NAME FORCE_HTTPS true cf set-env $CF_APP_NAME SECURITY_OAUTH2_CLIENT_ACCESS_TOKEN_URI "$SECURITY_OAUTH2_CLIENT_ACCESS_TOKEN_URI" cf set-env $CF_APP_NAME SECURITY_OAUTH2_CLIENT_USER_AUTHORIZATION_URI "$SECURITY_OAUTH2_CLIENT_USER_AUTHORIZATION_URI" cf set-env $CF_APP_NAME SECURITY_OAUTH2_RESOURCE_USER_INFO_URI "$SECURITY_OAUTH2_RESOURCE_USER_INFO_URI" cf set-env $CF_APP_NAME SECURITY_OAUTH2_CLIENT_CLIENT_ID "$SECURITY_OAUTH2_CLIENT_CLIENT_ID" cf set-env $CF_APP_NAME SECURITY_OAUTH2_CLIENT_CLIENT_SECRET "$SECURITY_OAUTH2_CLIENT_CLIENT_SECRET" cf restage healthpoints

覆蓋Spring Security的默認(rèn)OIDC設(shè)置后,您需要在Okta OIDC應(yīng)用程序中添加https://healthpoints.cfapps.io/login作為重定向URI。

然后...您將可以進(jìn)行身份??驗(yàn)證。 瞧! 😃

將您的React Native應(yīng)用程序的apiUrl (位于App/Config/AppConfig.js )修改為https://healthpoints.cfapps.io/并將其部署到您的手機(jī)中。 提示:使用我前面提到的“在設(shè)備上運(yùn)行”文檔。

export default {apiUrl: 'https://healthpoints.cfapps.io/',appUrlScheme: 'healthpoints' }

我在Mac上使用Xcode( open react-native-app/ios/HealthPoints.xcodeproj )并將其部署到open react-native-app/ios/HealthPoints.xcodeproj 。

當(dāng)我在Xcode中遇到構(gòu)建問(wèn)題時(shí),我運(yùn)行rm -rf ~/.rncache并修復(fù)了它們。 我還使用了一些rm -rf node_modules && yarn 。

以下是顯示其工作原理的屏幕截圖!

使用Kubernetes將Spring Boot API部署到Google Cloud Platform

JHipster還支持將您的應(yīng)用程序部署到生產(chǎn)中最熱門的東西:Kubernetes!

要進(jìn)行嘗試,請(qǐng)?jiān)趈hipster-api目錄旁邊創(chuàng)建一個(gè)k8s目錄。 然后在其中運(yùn)行jhipster kubernetes 。 出現(xiàn)提示時(shí),請(qǐng)指定以下答案:

  • 應(yīng)用類型: 整體應(yīng)用
  • 根目錄: ../
  • 哪些應(yīng)用程序: jhipster-api
  • 設(shè)置監(jiān)控:
  • Kubernetes命名空間: 默認(rèn)
  • Docker存儲(chǔ)庫(kù)名稱:<您的Docker Hub用戶名>
  • docker push命令: docker push
  • Kubernetes服務(wù)類型: LoadBalancer

將打印出許多您需要運(yùn)行的命令。 在jhipster-api目錄中運(yùn)行以下jhipster-api 。

docker login export USERNAME=<your username> ./gradlew bootWar -Pprod jibDockerBuild docker image tag healthpoints $USERNAME/healthpoints docker push $USERNAME/healthpoints

Google Cloud Platform(又名GCP)是基于Google核心基礎(chǔ)架構(gòu)的PaaS(平臺(tái)即服務(wù))。 它自然是云中Kubernetes的良好提供商。 完成以下步驟,將JHipster API部署到Google Cloud。

  • 通過(guò)console.cloud.google.com創(chuàng)建一個(gè)Google Cloud項(xiàng)目。
  • 導(dǎo)航到https://console.cloud.google.com/kubernetes/list初始化項(xiàng)目的Kubernetes引擎。 如果未自動(dòng)選擇項(xiàng)目,請(qǐng)?jiān)趯?dǎo)航欄中選擇它以在GCP中啟動(dòng)GKE初始化。
  • 安裝Google Cloud SDK ,登錄并使用以下項(xiàng)目設(shè)置項(xiàng)目:
  • gcloud auth login gcloud config set project <project-name>
  • 創(chuàng)建集群: gcloud components install kubectl gcloud container clusters create <cluster-name> --machine-type n1-standard-2 --scopes cloud-platform --zone us-west1-a

    要查看可能的區(qū)域列表,請(qǐng)運(yùn)行g(shù)cloud compute zones list 。

  • 為您的Spring Boot應(yīng)用程序設(shè)置環(huán)境變量以使用Okta for Identity。 您可以通過(guò)修改做到這一點(diǎn)k8s/healthpoints/healthpoints-deployment.yml ,增添了env列表,并指定你的SECURITY_OAUTH2_*您1563 OIDC應(yīng)用價(jià)值。 換句話說(shuō),在JAVA_OPTS之后添加名稱/值對(duì)。 containers: - name: healthpoints-appimage: mraible/healthpointsenv:- name: SPRING_PROFILES_ACTIVEvalue: prod- name: SPRING_DATASOURCE_URLvalue: jdbc:postgresql://healthpoints-postgresql.default.svc.cluster.local:5432/HealthPoints- name: SPRING_DATA_JEST_URIvalue: http://healthpoints-elasticsearch.default.svc.cluster.local:9200- name: JAVA_OPTSvalue: " -Xmx256m -Xms256m"- name: SECURITY_OAUTH2_CLIENT_ACCESS_TOKEN_URIvalue: "https://{yourOktaDomain}/oauth2/default/v1/token"- name: SECURITY_OAUTH2_CLIENT_USER_AUTHORIZATION_URIvalue: "https://{yourOktaDomain}/oauth2/default/v1/authorize"- name: SECURITY_OAUTH2_RESOURCE_USER_INFO_URIvalue: "https://{yourOktaDomain}/oauth2/default/v1/userinfo"- name: SECURITY_OAUTH2_CLIENT_CLIENT_IDvalue: "{yourClientId}"- name: SECURITY_OAUTH2_CLIENT_CLIENT_SECRETvalue: "{yourClientSecret}"
  • 從k8s目錄運(yùn)行./kubectl-apply.sh 。 您應(yīng)該看到一堆創(chuàng)建的消息。 deployment.apps "healthpoints" created deployment.extensions "healthpoints-elasticsearch" created service "healthpoints-elasticsearch" created deployment.extensions "healthpoints-postgresql" created service "healthpoints-postgresql" created service "healthpoints" created

    您可以使用kubectl get pods和kubectl logs -f {podName}來(lái)查看日志。

    $ kubectl get pods NAME READY STATUS RESTARTS AGE healthpoints-6b56d9d646-h9cn2 1/1 Running 0 3m healthpoints-elasticsearch-84cf759984-vwhv8 1/1 Running 0 18m healthpoints-postgresql-56ddd4bfc9-mptch 1/1 Running 0 18m
  • 運(yùn)行kubectl get svc healthpoints以在Google Cloud上獲取應(yīng)用程序的外部IP。 打開(kāi)http://<external-ip>:8080以查看正在運(yùn)行的應(yīng)用程序。
  • 更新您的Okta應(yīng)用程序,使其具有應(yīng)用程序的IP地址作為登錄重定向URI(例如, http://<external-ip>:8080/login )。 然后,驗(yàn)證一切正常。
  • 使用kubectl根據(jù)需要kubectl應(yīng)用程序:
  • kubectl scale --replicas=3 deployment/healthpoints

    運(yùn)行kubectl get pods來(lái)監(jiān)視pods的啟動(dòng)。

    NAME READY STATUS RESTARTS AGE healthpoints-6b56d9d646-5lmjk 0/1 Running 0 14s healthpoints-6b56d9d646-h9cn2 1/1 Running 0 7m healthpoints-6b56d9d646-vsm4r 0/1 Running 0 14s healthpoints-elasticsearch-84cf759984-vwhv8 1/1 Running 0 23m healthpoints-postgresql-56ddd4bfc9-mptch 1/1 Running 0 23m

    結(jié)果? 在GKE上的生產(chǎn)環(huán)境中運(yùn)行的Spring Boot API! 哇!

    在GCP上反應(yīng)Native + Spring Boot

    要使您的React Native應(yīng)用程序與GCP實(shí)例一起使用,您只需要修改其AppConfig.js文件以指向其URI,然后打包并部署即可。

    export default {apiUrl: 'http://<external-ip>:8080',appUrlScheme: 'healthpoints' }

    秘訣:更改不同環(huán)境的API URL

    您可能認(rèn)為必須為不同的環(huán)境(本地開(kāi)發(fā)與Cloud Foundry與Google Cloud)更改API URL感到很痛苦。 我同意!

    幸運(yùn)的是,Ignite JHipster已經(jīng)內(nèi)置了react-native-config 。 這個(gè)項(xiàng)目允許您將配置變量暴露給React Native中JavaScript代碼。 您可以將API密鑰,URL和其他敏感信息存儲(chǔ)在.env文件中。

    API_URL=https://production-is-awesome.cfapps.io

    要在您的應(yīng)用程序中使用react-native-config,請(qǐng)使用以下步驟:

  • 將.env.example復(fù)制到.env并更新.gitignore以將其忽略。
  • 添加您的配置變量。
  • 按照l(shuí)uggit / react-native-config#setup上的說(shuō)明進(jìn)行操作 。
  • 將您的AppConfig.js更改為以下內(nèi)容:
  • import Secrets from 'react-native-config'export default {apiUrl: Secrets.API_URL,appUrlScheme: 'healthpoints' }

    探索React Native,Spring Boot和JHipster

    本教程向您展示了如何僅使用幾個(gè)命令即可構(gòu)建安全的Spring Boot API(由JPA,PostgreSQL和Elasticsearch驅(qū)動(dòng))。 然后,您學(xué)習(xí)了如何使用Gradle運(yùn)行應(yīng)用程序,如何使用Docker運(yùn)行外部服務(wù)以及如何使用Sonar驗(yàn)證高質(zhì)量的代碼。 那僅僅是開(kāi)始!

    我再次向您展示了如何構(gòu)建React Native應(yīng)用程序,僅需幾個(gè)命令。 哎呀,甚至部署到云中也只用了一些有趣的CLI命令。

    本教程的源代碼位于GitHub @ oktadeveloper / okta-react-native-spring-boot-example上 。

    您不覺(jué)得所有這些一流的技術(shù)都在嬉戲嗎? 我確定! 🤓

    想保持臀部? 查閱其他一些關(guān)于React Native,Spring Boot和JHipster的教程。

    • 構(gòu)建一個(gè)React Native應(yīng)用程序并使用OAuth 2.0進(jìn)行身份驗(yàn)證 –使用React Native AppAuth,它是Ignite JHipster的計(jì)劃集成 。
    • 使用OAuth 2.0和JHipster開(kāi)發(fā)微服務(wù)架構(gòu) -包括有關(guān)如何部署到Heroku的說(shuō)明。
    • 使用React和Spring Boot來(lái)構(gòu)建一個(gè)簡(jiǎn)單的CRUD應(yīng)用程序 –當(dāng)您計(jì)劃JUG Tours時(shí),CRUD應(yīng)用程序會(huì)很酷!
    • 使用React,Spring Boot和JHipster構(gòu)建照相館PWA –使用JHipster和React構(gòu)建Flickr克隆。 使其成為PWA。
    • 使用Ionic for JHipster來(lái)創(chuàng)建具有OIDC身份驗(yàn)證的移動(dòng)應(yīng)用程序 –不在React Native中嗎? 離子呢?

    關(guān)注我們 , 觀看我們的視頻 ,如果您想了解更多關(guān)于最好的開(kāi)源技術(shù)的信息,請(qǐng)與我們聯(lián)系 。 我們是開(kāi)源的忠實(shí)擁護(hù)者。 💙

    使用React Native和Spring Boot構(gòu)建移動(dòng)應(yīng)用程序''最初于2018年10月10日發(fā)布在Okta開(kāi)發(fā)者博客上。

    “我喜歡編寫身份驗(yàn)證和授權(quán)代碼。” ?從來(lái)沒(méi)有Java開(kāi)發(fā)人員。 厭倦了一次又一次地建立相同的登錄屏幕? 嘗試使用Okta API進(jìn)行托管身份驗(yàn)證,授權(quán)和多因素身份驗(yàn)證。

    翻譯自: https://www.javacodegeeks.com/2018/11/build-mobile-app-react-native-spring-boot.html

    總結(jié)

    以上是生活随笔為你收集整理的使用React Native和Spring Boot构建一个移动应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    国产精品h在线观看 | 国内精品久久久久久久久 | 91成人精品观看 | 国产成人在线观看免费 | 91精品久久久久久久久久入口 | 91看片麻豆 | 日日干激情五月 | 国内精品久久久久影院一蜜桃 | 特片网久久 | 91精品导航| 欧美性猛片, | 国产午夜精品一区二区三区欧美 | 人人看人人草 | 久久av在线| 日韩精品第1页 | 久草在线视频首页 | 国产精品久久久久久爽爽爽 | 国产成人精品一区二区三区在线观看 | 91精品啪啪 | 最新国产精品视频 | 亚洲国产精品成人女人久久 | 日日摸日日爽 | 国产乱码精品一区二区三区介绍 | 国产精品资源在线 | 亚洲黄色高清 | 人人爱人人添 | 国产视频一区二区三区在线 | 91传媒免费观看 | 一区二区三区四区五区在线 | 91在线精品一区二区 | 国产精品正在播放 | 99久久精品免费看国产四区 | 亚洲 欧美 91 | 九九久久久久99精品 | 成人啊 v | 国产精品免费观看国产网曝瓜 | 三级性生活视频 | 亚洲高清视频一区二区三区 | 美女视频是黄的免费观看 | av一级片网站 | 国产99久久精品一区二区永久免费 | 久久精品一级片 | 亚洲三级黄色 | 亚洲一区欧美激情 | 在线免费观看麻豆视频 | 91桃花视频| 天天插日日射 | 国产免费久久精品 | 欧美韩日精品 | 五月婷婷综合在线观看 | 久久精品一区二区三区中文字幕 | 午夜精品久久久99热福利 | 欧美色伊人 | 国产成人精品一区二区在线 | 麻豆成人小视频 | 国产永久免费 | 婷婷综合伊人 | 久久亚洲区 | 国产精品情侣视频 | 最新三级在线 | 亚洲一区 av | 日韩和的一区二在线 | 免费黄色看片 | 96亚洲精品久久久蜜桃 | se视频网址 | 国产日产高清dvd碟片 | 久久久久久国产精品 | 国产三级精品三级在线观看 | 亚洲视频1 | 国产精品久久久一区二区三区网站 | 亚洲第一香蕉视频 | 亚洲免费观看视频 | 一区二区三区视频 | 午夜精品福利在线 | 这里只有精品视频在线 | 亚洲 欧美 变态 国产 另类 | 久草在线免 | 免费亚洲视频在线观看 | 亚洲 综合 激情 | 91在线视频在线观看 | 在线www色 | 99成人精品 | 国产超碰97 | 亚洲高清在线观看视频 | 永久黄网站色视频免费观看w | 97人人人人 | 色人久久| 高清av免费看| 992tv又爽又黄的免费视频 | 狠狠狠狠狠狠 | 91精品久久久久久久久久入口 | 精品自拍网 | 亚洲色综合 | av丁香| av+在线播放在线播放 | 日韩在线三级 | 日本99干网 | 欧美日韩伦理一区 | 91福利视频久久久久 | 亚洲经典视频 | 亚洲天堂色婷婷 | 久久短视频 | 午夜美女福利直播 | 亚洲天堂精品视频在线观看 | 欧美日韩国产一二 | 91av在线精品| 中文字幕乱码一区二区 | 日韩中文字幕国产精品 | 欧美久久久久久 | 精品999 | 日韩av网站在线播放 | 色香蕉在线 | 天天插视频| 99爱这里只有精品 | 国产精品原创av片国产免费 | 日本中文在线播放 | 国产日产精品一区二区三区四区的观看方式 | 免费av片在线 | 色一级片 | 天堂av在线网站 | 国产999精品 | 国产成人综合在线观看 | avav99| 日韩精品久久久久久中文字幕8 | а天堂中文最新一区二区三区 | 伊人导航 | 免费电影一区二区三区 | 久久精品国产一区 | 综合久久影院 | 色综合天天视频在线观看 | 亚洲一区欧美激情 | 国产 在线 高清 精品 | 欧美性大战久久久久 | 欧美精品久久久久久久久久白贞 | 黄色免费观看 | 欧美精品国产综合久久 | 婷婷久久精品 | 伊人影院99 | 日韩高清精品一区二区 | 中文字幕色站 | 欧美在线视频一区二区 | 国产成人精品综合久久久 | 美女视频黄在线观看 | 久久久久在线 | 黄色在线看网站 | 一区二区中文字幕在线播放 | 精品一区二区久久久久久久网站 | 天天躁日日躁狠狠躁av麻豆 | 天天操夜夜操 | 久久久不卡影院 | 六月丁香综合 | 深爱五月激情五月 | 亚洲伊人成综合网 | 中文字幕成人网 | 热久久视久久精品18亚洲精品 | 狠狠色丁香| 国产蜜臀av | 亚洲成人免费在线观看 | 五月天中文字幕mv在线 | 午夜久久网 | 国产91精品高清一区二区三区 | 亚洲乱码久久 | 91综合色 | 五月天中文在线 | 久久久午夜影院 | 日本公妇色中文字幕 | av综合站| 色婷婷97| 999国内精品永久免费视频 | 国产自制av| 一区二区毛片 | 国产91成人在在线播放 | 九九热在线精品 | 永久免费av在线播放 | 激情综合网在线观看 | 日本中文字幕高清 | 在线观看色网站 | 久久黄色a级片 | 美女网站在线 | 国内精品久久久久影院男同志 | 欧美激情精品久久久久久免费印度 | 97精品国产手机 | 日韩在线观看影院 | 日韩在线短视频 | 国产亚洲婷婷免费 | 黄色三级免费片 | 免费一级黄色 | 婷婷综合久久 | 91激情在线视频 | 五月天电影免费在线观看一区 | 亚洲精品国 | 欧美一区中文字幕 | 国产精品亚洲综合久久 | 91伊人影院 | 日韩一级电影网站 | 天天五月天色 | 日韩中文字幕在线看 | 日躁夜躁狠狠躁2001 | 成年人免费在线看 | 国产高清不卡在线 | 色视频网址| 98久9在线 | 免费 | 日韩欧美xxx| 国产片网站 | 91热在线 | 国产精品久久一区二区三区, | 亚洲一级黄色片 | 久久免费视频一区 | 亚洲三级影院 | 国产一区二区在线播放视频 | 97超碰在| 黄网站免费看 | 色狠狠婷婷 | 一级特黄aaa大片在线观看 | 91精品亚洲影视在线观看 | 久草精品视频在线观看 | 在线日韩视频 | 欧美精品一区二区免费 | 午夜精品一区二区三区四区 | av在线一| 日韩视频 一区 | 黄色亚洲片| 国产高清小视频 | 在线观看黄色av | 国产高清视频色在线www | 在线电影91 | 在线 国产一区 | 久久国产精品久久w女人spa | 久久综合色综合88 | 国产成人99久久亚洲综合精品 | 亚洲成av人片 | 日韩高清二区 | 国产精品初高中精品久久 | 久久黄色精品视频 | 久久精品牌麻豆国产大山 | 人人爽人人射 | 天天激情天天干 | 婷婷国产在线 | 欧美成人tv | 91色国产 | 久久天天躁夜夜躁狠狠躁2022 | 精品国产乱码久久久久久浪潮 | 五月天天av | 色天天天 | 99精品国产免费久久久久久下载 | 一区二区三区福利 | 成人黄色在线电影 | 久久精品视频中文字幕 | 91精品天码美女少妇 | 国产又粗又长又硬免费视频 | 国产成人a亚洲精品v | 亚洲精品观看 | 免费观看一区 | 婷婷久久五月天 | 日本xxxxav| 欧美精品在线一区二区 | 欧美日韩69| 久久久久国产成人精品亚洲午夜 | 欧美一二三在线 | 久草在线在线精品观看 | 精品一区二区免费在线观看 | 国产黄大片在线观看 | a视频在线 | 午夜黄色一级片 | 日本在线h | 中文字幕在线观看完整版 | 黄色成人av在线 | 国产精品 国产精品 | 中文字幕观看视频 | 中文字幕一区二 | 新版资源中文在线观看 | 成年人视频免费在线播放 | 热99久久精品 | 免费在线成人av | 中文字幕一区二区三区在线播放 | 久章草在线 | 最近日本韩国中文字幕 | 日韩精品在线视频免费观看 | 国产色综合天天综合网 | 亚洲第五色综合网 | 日本精品久久久久影院 | 国产一区二区三区在线 | av在线官网 | 欧美午夜精品久久久久久浪潮 | 日韩成人看片 | 国产视频在线观看一区二区 | 日韩欧美在线观看 | 精品999在线| 精品国产123 | 超碰人人在线观看 | 欧美一区二区免费在线观看 | 五月天激情视频 | 字幕网在线观看 | 成人网色 | 九色精品免费永久在线 | 在线看免费 | 亚洲成人午夜av | 亚洲成人精品影院 | 成人黄大片视频在线观看 | 久久久久女人精品毛片九一 | 久久精品视频国产 | 日韩激情小视频 | 日日夜夜精品免费视频 | 亚洲男男gaygayxxxgv | 欧美精品中文 | 五月亚洲综合 | 国产成人亚洲在线电影 | 欧美最新另类人妖 | 美女免费视频网站 | 久久99影院| 国产在线观看你懂得 | 99视频精品视频高清免费 | 日韩在线欧美在线 | 全久久久久久久久久久电影 | 天天天干天天天操 | 国产视频黄 | 日韩久久精品 | 免费高清在线视频一区· | 国产色综合| 国产精品久久久久久久久久三级 | 99国产免费网址 | 国产一二三在线视频 | 国产精品初高中精品久久 | 亚洲国产一区av | www欧美色 | 91九色丨porny丨丰满6 | 水蜜桃亚洲一二三四在线 | 精品美女久久久久久免费 | www.香蕉视频在线观看 | 天天操天天摸天天干 | 精品国产一区二区三区日日嗨 | 国产精品 999 | 欧美一区二区三区在线播放 | 91av视频| 婷婷丁香导航 | 国产福利免费在线观看 | 国产aaa大片 | 国产精品久久久久久久免费 | 久草在线免费播放 | 日韩在线视频线视频免费网站 | 成人久久免费视频 | 欧美日韩在线观看不卡 | 国产va饥渴难耐女保洁员在线观看 | 97在线观看视频免费 | 97国产精品久久 | 中文字幕在线免费看 | 国产精品女同一区二区三区久久夜 | av天天澡天天爽天天av | 182午夜在线观看 | 香蕉在线观看视频 | 免费久久久 | 99爱这里只有精品 | 中文字幕国内精品 | 在线看片一区 | 六月丁香婷 | 国产视频中文字幕 | 丁香婷婷综合激情五月色 | 国内精品国产三级国产aⅴ久 | 在线观看一区视频 | 欧美日一级片 | 日日摸日日添夜夜爽97 | 久久99国产精品自在自在app | 五月天久久久久久 | 91香蕉视频污在线 | 美女免费视频一区 | 96国产在线| 免费视频久久 | av在线免费不卡 | 91av中文| 1区2区视频 | 最近中文字幕mv免费高清在线 | 天天插综合| 91原创在线观看 | 97超碰.com | av电影免费观看 | 亚洲国产精品电影在线观看 | 在线中文字母电影观看 | 一区二区三区四区不卡 | 天天曰天天曰 | 人人看人人爱 | 国产精品第 | 国产精品美女免费看 | 成人精品视频 | 狠狠躁日日躁狂躁夜夜躁 | 少妇bbw搡bbbb搡bbbb | 九九九在线观看视频 | 99热国产精品 | 深爱激情五月网 | 国产精品欧美日韩 | 五月婷婷六月综合 | 91视视频在线直接观看在线看网页在线看 | 韩国一区二区三区视频 | 丁香九月婷婷 | 夜色.com| 操操操日日日干干干 | 久久免费视频网站 | 久久久久久久久久网 | 亚洲电影在线看 | 国产精品专区在线 | 久久99精品热在线观看 | 亚州精品天堂中文字幕 | 亚洲春色成人 | 亚洲天堂精品视频在线观看 | 免费观看视频的网站 | 日韩在线中文字幕视频 | 久久久久久久免费 | 国产不卡一区二区视频 | 97免费在线观看视频 | 国产女教师精品久久av | 精品欧美乱码久久久久久 | 日韩理论片 | 色成人亚洲 | 日本在线成人 | 亚洲成人影音 | 亚洲欧洲成人 | 欧美一区二区日韩一区二区 | va视频在线观看 | 国产精品综合久久久 | 亚洲综合欧美日韩狠狠色 | 日韩av片无码一区二区不卡电影 | 91精品免费在线视频 | 成人在线视频一区 | 一本色道久久精品 | 日本一区二区高清不卡 | 超碰人在线 | 成人黄色电影在线播放 | 日韩一级成人av | 欧美极品在线播放 | 久久久久国产精品免费免费搜索 | 国产在线一线 | 在线91av| 丝袜美腿在线 | 免费在线观看成人小视频 | 婷婷六月丁 | 成年人免费在线观看 | 日韩精品一区二区三区水蜜桃 | 狠狠夜夜| 色婷婷99| 中文字幕免费观看视频 | 奇米影视999 | 中文字幕 国产视频 | 主播av在线| 天天看天天干天天操 | 久久视影 | 亚洲精品一区二区三区新线路 | 日韩在线理论 | 免费a级黄色毛片 | 欧美性生活免费 | 色综合久久五月 | 久久九九精品 | 美女又爽又黄 | 色国产精品一区在线观看 | 日韩理论在线 | 婷婷国产v亚洲v欧美久久 | 人人爽人人爽人人片av免 | 国产美女被啪进深处喷白浆视频 | av观看在线观看 | 日韩在线观看 | 免费色av| 成人免费在线网 | 91久久久久久久一区二区 | 色在线视频 | 国产精品一区二区美女视频免费看 | 精品成人在线 | 五月婷婷操| 中文字幕传媒 | 欧美日韩在线观看一区 | 丁香久久五月 | 久草爱| 91免费网址 | 深爱激情站 | av网在线观看 | 国产1区在线 | 99精品久久久久久久 | 深爱五月激情五月 | 99久久精品国产毛片 | 午夜a区 | 国产一区黄色 | 日韩电影一区二区三区 | 狠狠干婷婷 | 99爱爱| 韩国av免费观看 | 国语自产偷拍精品视频偷 | 91成人破解版 | 狠狠干,狠狠操 | 精品一区二区免费 | 操操操av| 久久99偷拍视频 | 国产精品自产拍在线观看蜜 | 久久新 | 日韩啪视频 | 色天天综合久久久久综合片 | 中文字幕首页 | 一本一本久久a久久精品综合妖精 | 天天草天天摸 | 国产a国产 | 久久国产一区 | 久久99国产精品久久99 | 99国产情侣在线播放 | 色综合欧洲 | 亚洲免费一级电影 | 国产资源在线观看 | www.xxx.性狂虐| 九九九九精品 | 一本一本久久a久久精品牛牛影视 | 韩日在线一区 | 久久国产亚洲视频 | 日p视频在线观看 | 97在线超碰| 不卡在线一区 | 97在线观看免费高清完整版在线观看 | 蜜臀av夜夜澡人人爽人人桃色 | 青青视频一区 | 色婷婷综合久久久中文字幕 | 91精品国产电影 | 亚洲免费视频观看 | 久久高清视频免费 | 91成年人视频 | 欧美精品亚洲精品日韩精品 | 91福利免费 | 欧美巨大荫蒂茸毛毛人妖 | 日韩欧美一区视频 | 人人爽人人爽人人爽学生一级 | 国产欧美日韩视频 | 久久免费视频4 | 亚洲国产精品va在线看 | 亚洲视频 视频在线 | 国产精品一区二区免费 | 91精品久| www.五月婷婷.com | 特级a老妇做爰全过程 | 伊人宗合网| 国产精品免费小视频 | www.xxxx变态.com | 韩国精品在线观看 | 波多野结衣在线观看一区二区三区 | 亚洲婷婷免费 | www178ccom视频在线| 久久久国产一区二区三区 | 麻豆精品在线视频 | 99视频精品全国免费 | 日日夜夜骑| 欧美激情另类文学 | 欧美日韩免费一区二区 | 91污在线| 天天草夜夜| 精品久久久免费视频 | av黄网站| 91视频网址入口 | 一本到视频在线观看 | 久久免费电影网 | 日韩精品欧美精品 | 亚洲国产一区在线观看 | 天天操天天干天天操天天干 | 色婷婷在线观看视频 | 久久久国产精品视频 | 国产午夜精品理论片在线 | av在线播放快速免费阴 | www.夜夜 | 久草在线免费看视频 | 中文字幕字幕中文 | 97超碰人人澡人人 | 色婷婷在线视频 | 日b视频在线观看网址 | 中文国产字幕在线观看 | 国产视频在线看 | 98涩涩国产露脸精品国产网 | 亚洲精品乱码久久久久久按摩 | 天天草天天干 | 国产日韩欧美视频 | 国产 日韩 在线 亚洲 字幕 中文 | 久久综合成人 | 香蕉视频在线网站 | 日韩区欧美久久久无人区 | 五月天中文在线 | 国产一线二线三线在线观看 | 99精品视频免费在线观看 | 亚洲精品乱码久久久久久高潮 | 99视频这里只有 | 天天射射天天 | 久久综合色播五月 | 国产精品99在线播放 | 成人av电影免费观看 | 中国一级片在线观看 | 欧美久久成人 | 超碰在线天天 | 久久成人国产精品免费软件 | 成人黄色大片在线免费观看 | 香蕉视频在线看 | 92精品国产成人观看免费 | 精品视频专区 | 一区二区三区在线观看免费视频 | 草久在线观看 | 色婷婷综合在线 | 免费国产在线视频 | 97超碰网 | 亚洲欧美综合 | 91成人在线网站 | 日韩av一区二区在线影视 | 伊人狠狠干 | 国产一区二区播放 | 在线观看91精品国产网站 | 久久精品国产亚洲 | 亚洲日韩精品欧美一区二区 | 超碰97在线资源 | 午夜在线看片 | 激情在线免费视频 | 日日操天天操夜夜操 | 亚洲 综合 激情 | 欧美日本不卡视频 | 天天拍天天爽 | 国产成人精品女人久久久 | 久久99精品久久久久婷婷 | 亚洲日韩中文字幕在线播放 | 欧美片一区二区三区 | 亚洲涩涩涩涩涩涩 | 五月开心综合 | 91高清免费在线观看 | 免费在线色 | 国产日韩精品一区二区在线观看播放 | 女人18精品一区二区三区 | 在线国产91 | 99免在线观看免费视频高清 | 日韩国产精品久久 | 91人人澡 | 午夜影院三级 | 中文字幕免费观看全部电影 | 成人a视频在线观看 | 国产精品精品国产 | 中文字幕在线观看三区 | 欧美日韩一区二区在线观看 | 天天射天天干天天爽 | 成人久久精品视频 | 国产成人综合在线观看 | 国产亚洲精品中文字幕 | 亚洲久草网| 一区二区三区免费网站 | 久久久伊人网 | 91最新视频| 日韩成人欧美 | 久久久久麻豆v国产 | 亚洲成av人片在线观看无 | 国内成人精品2018免费看 | 日韩视频一区二区在线 | 亚洲色图色 | 日本性xxx| 国产精品久久久久婷婷 | 天天操人人干 | 国产精品一区二区麻豆 | 国产手机av在线 | 欧美激情精品久久久 | 激情久久久久久久久久久久久久久久 | 国产精品淫 | 99久久精品国产系列 | 国产色中涩 | 成人av在线亚洲 | 精品视频 | 日本特黄一级片 | 91黄色小视频 | av888.com| 青草草在线视频 | 中文字幕在线播放视频 | 午夜精品视频一区 | 久二影院| 亚洲精品91天天久久人人 | 久久久精品欧美一区二区免费 | 欧美日韩视频观看 | 久久精品久久综合 | 91亚洲精品久久久中文字幕 | 99热在线国产 | 久久精品一区二区三区中文字幕 | 久久久国产精华液 | 午夜aaaa| 人人添人人澡人人澡人人人爽 | 久草在线视频首页 | 国产精品系列在线观看 | av在线网站免费观看 | 国产香蕉97碰碰久久人人 | 亚洲精品国产精品99久久 | 成年人在线观看 | 国内精品免费 | 久久久99久久 | 激情欧美一区二区免费视频 | 亚洲视频久久久 | 国产精品免费久久久久久久久久中文 | 五月黄色| 狠狠色丁香婷婷综合基地 | 最近中文字幕久久 | 久久精国产 | 国产黄影院色大全免费 | 欧美日韩精品在线免费观看 | 成人免费亚洲 | 亚洲精品女人久久久 | 欧美日韩一区二区三区不卡 | 在线v片免费观看视频 | 色在线亚洲 | 久久99九九99精品 | 精品av在线播放 | 久草国产精品 | 在线观看视频国产 | 在线草 | 国产中文字幕在线视频 | 91在线看片| 欧美日韩亚洲在线观看 | 黄色网在线播放 | 亚洲91网站 | 欧洲av不卡 | 亚洲高清视频一区二区三区 | 欧美整片sss | 精品视频在线观看 | 久久国产精品99久久久久久丝袜 | 亚洲 欧美 变态 国产 另类 | 亚洲精品午夜一区人人爽 | 久久免费视频一区 | 亚洲国产精品久久 | av在线播放免费 | 四虎影视成人精品国库在线观看 | 色视频网站在线观看一=区 a视频免费在线观看 | 狠狠色丁香婷婷综合基地 | 亚洲国产精品第一区二区 | 91大神精品视频在线观看 | 97av影院 | 一级片视频免费观看 | 久久久久人人 | 久久国产网| 中文字幕丰满人伦在线 | 美女久久视频 | 91精品成人 | 中文字幕av免费观看 | 午夜色影院 | 天天看天天干天天操 | 69国产成人综合久久精品欧美 | 国产精彩视频一区二区 | avove黑丝 | 久久超碰网 | 久久久久久久久久久久99 | 婷婷亚洲最大 | 成人毛片在线观看视频 | 国产精品久久久久久久久久妇女 | 久久久久国产成人精品亚洲午夜 | 欧美一级视频免费看 | 久久色在线播放 | 精品一区二区免费在线观看 | 99久久激情视频 | 伊人资源站 | av成人在线看 | www国产一区| 最近日本mv字幕免费观看 | 91av中文| 偷拍精品一区二区三区 | 免费久久精品视频 | 超碰97成人 | 欧美少妇bbwhd| 丁香六月婷婷开心 | 免费在线播放黄色 | 91av在| 97国产精品视频 | 欧美精品久久久久久 | 日本中文字幕系列 | 欧美片一区二区三区 | 人人爽人人爽 | 奇米网网址 | 日韩午夜视频在线观看 | 日韩免费专区 | 欧美午夜a | 在线观看免费一级片 | 日产乱码一二三区别在线 | 久久久久久久久电影 | 日韩精品在线免费播放 | 亚洲干视频在线观看 | 五月天激情综合 | 天天操天天爽天天干 | 亚洲美女免费视频 | 亚洲视频在线视频 | 国内成人综合 | 亚洲视频www | 在线观看亚洲成人 | 久久久人人爽 | 国产亚洲欧美精品久久久久久 | 成人毛片网 | 午夜电影 电影 | 免费特级黄色片 | 免费看污黄网站 | 99精彩视频| 一区二区不卡在线观看 | 国产一区高清在线 | 中文字幕免费看 | 精品久久久国产 | 黄色91在线观看 | 国产精品99久久99久久久二8 | 国产日韩在线视频 | 亚洲在线日韩 | 91禁在线看| 九九视频一区 | 天天操综 | 欧日韩在线视频 | 国产精品久久久av | 99国内精品 | 国产精品免费观看视频 | 亚洲美女在线一区 | 久久综合丁香 | www九九热 | 中文字幕在线视频第一页 | 激情五月激情综合网 | 国产在线第三页 | 亚洲黄a| 日韩av免费在线看 | 国产精品欧美久久 | 国产资源在线播放 | 久久理论视频 | 韩国av在线 | 91麻豆精品国产自产 | 中文字幕 国产视频 | 五月婷婷六月综合 | 国产视频在线观看一区 | 国产又粗又猛又黄又爽 | 日日添夜夜添 | 超碰在线公开 | 一区二区三区四区免费视频 | 射久久久 | 亚洲精品国产精品久久99热 | 2019中文在线观看 | 日韩乱色精品一区二区 | 视频成人| 91精品国产91久久久久久三级 | 婷婷丁香色综合狠狠色 | 日韩欧美视频在线免费观看 | 国色天香第二季 | 四虎国产 | 色偷偷888欧美精品久久久 | 免费日韩三级 | 最新色站| 欧美成a人片在线观看久 | 日韩精品久久一区二区三区 | 欧美日韩一区二区免费在线观看 | 国产欧美在线一区二区三区 | 国产剧在线观看片 | 久久久久综合 | 贫乳av女优大全 | 欧美激情综合五月色丁香小说 | 最新免费av在线 | 欧美日韩不卡在线视频 | 久久视频精品在线观看 | 91免费观看网站 | 亚洲综合色激情五月 | 中文字幕一区二区在线播放 | 精品国产乱码久久久久 | 欧美精品在线观看免费 | 久久久免费播放 | 六月色婷 | 三级在线视频观看 | 免费a视频在线 | 日韩欧美综合在线视频 | 亚洲一区二区三区精品在线观看 | 亚洲播播 | 成人cosplay福利网站 | 欧美精品久久久久久久亚洲调教 | 狠狠躁天天躁 | 日本黄色免费电影网站 | 色欲综合视频天天天 | 亚洲精品久久久久58 | 亚洲精品国产高清 | 999抗病毒口服液 | 免费黄色激情视频 | 国产精品久久久久久久久久不蜜月 | 97超在线 | 国产在线观看91 | 九九热在线播放 | 又黄又爽又色无遮挡免费 | 免费v片 | 99视频偷窥在线精品国自产拍 | freejavvideo日本免费 | 在线草 | 最近中文字幕在线 | 最近中文字幕免费视频 | 中文字幕不卡在线88 | 亚洲国产影院 | 97人人模人人爽人人少妇 | 91精品国自产在线观看欧美 | 国产精品久久久久免费 | 黄免费网站 | 成人国产精品免费观看 | 最近日本韩国中文字幕 | 婷婷网五月天 | 91av在线不卡| 国产精品9区 | 福利视频一区二区 | 中文字幕日本在线 | 香蕉影院在线播放 | 日韩欧美高清不卡 | 国产精品九色 | 91九色最新地址 | 超级碰碰免费视频 | 97超视频在线观看 | 在线观看岛国av | 手机色站| 亚洲黄色av网址 | jizzjizzjizz亚洲 | 久草综合在线观看 | 天天干夜夜操视频 | 久久精品老司机 | 亚洲精品高清在线观看 | 在线黄频 | 精品亚洲免费 | 色综合天天干 | 97高清免费视频 | 最近中文字幕mv免费高清在线 | 色婷婷五 | 伊人影院得得 | 在线观看韩日电影免费 | 日韩欧美在线中文字幕 | 欧美精品少妇xxxxx喷水 | 国产亚洲欧美在线视频 | 国产福利91精品 | 免费不卡中文字幕视频 | japanesefreesexvideo高潮 | 免费看片网页 | 国产专区免费 | 美国三级黄色大片 | 欧美性另类 | 天天干天天拍天天操 | 国产美女久久久 | 青青五月天 | 久久99精品一区二区三区三区 | 国产日韩精品久久 | 香蕉视频一级 | 天天干人人插 | 伊人亚洲综合网 | 99视频精品免费观看, | 成年人看片网站 | 狠狠干天天射 | 99热免费在线 | 狠狠的日日 | 久久这里有精品 | 亚洲精品人人 | 久久天天操 | 超碰97av在线| 亚洲精品乱码久久久久久9色 | 五月开心激情 | 欧美a级片免费看 | 欧美在线视频精品 | av资源免费观看 | 国产福利91精品张津瑜 | 少妇bbr搡bbb搡bbb | 久久国产精品99久久久久久老狼 | 在线观看视频你懂的 | 伊人婷婷久久 | 国产第一页福利影院 | 中文字幕麻豆 | 久久精品国产第一区二区三区 | 日韩精品免费在线播放 | 午夜精品久久久久久久久久久 | 国产精品视频全国免费观看 | 韩日电影在线 | 天天干天天想 | 国产成人精品久久 | 福利一区视频 | 天天干人人干 | 91禁在线看 | 精品黄色视 | 色久综合 | 久热只有精品 | 成年人免费看 | 亚洲91精品在线观看 | 亚洲不卡av一区二区三区 | 欧美精品一区在线发布 | 精品国产一二区 | 亚洲乱码一区 | 精品国产亚洲一区二区麻豆 | 精品久久网站 | 亚洲免费婷婷 | 视频在线观看一区 | 国产三级午夜理伦三级 | 国产一级一级国产 | 国产成人一区在线 | 日韩v欧美v日本v亚洲v国产v | 最近日韩免费视频 | 国产 日韩 在线 亚洲 字幕 中文 | 亚洲 精品在线视频 | av中文字幕第一页 | 91看片淫黄大片一级在线观看 | 日精品| www..com黄色片 | 日日夜夜天天综合 | 伊人五月天婷婷 | 成人99免费视频 | 国产亚洲在 | 久久a久久 | 精品在线播放视频 | 91精品啪在线观看国产 | 欧美日韩国产页 | 日本精品视频一区二区 | 一区二区三区高清在线观看 | 日精品在线观看 | 国产免费高清视频 | 亚洲视频大全 | 五月天中文字幕 | 亚洲精品乱码久久久久久 |