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

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

生活随笔

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

javascript

Angular 8 + Spring Boot 2.2:立即构建一个CRUD应用程序!

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

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

如果您已經(jīng)成為Java開(kāi)發(fā)人員超過(guò)15年,那么您可能還記得什么時(shí)候有過(guò)多的Java Web框架。 它始于Struts和WebWork。 然后Tapestry,Wicket和JSF出現(xiàn)并倡導(dǎo)基于組件的框架的想法。 Spring MVC于2004年發(fā)布(與Flex 1.0和JSF 1.0同月發(fā)布),并在接下來(lái)的六年中成為Java Web框架的實(shí)際標(biāo)準(zhǔn)。

隨之而來(lái)的是AngularJS,每個(gè)人都開(kāi)始將其UI架構(gòu)轉(zhuǎn)移到JavaScript。 Angular 2是在2014年首次發(fā)布Spring Boot的同時(shí)宣布的,它花了幾年時(shí)間才發(fā)布,固化并成為可行的選擇。 這些天,我們將其稱為Angular,沒(méi)有版本號(hào)。 最近的幾個(gè)版本相當(dāng)穩(wěn)定,主要版本之間的升級(jí)路徑很流暢。

今天,我想向您展示如何使用Angular和Spring Boot的最新和最佳版本來(lái)構(gòu)建應(yīng)用程序。 Angular 8和Spring Boot 2.2都進(jìn)行了性能改進(jìn),以改善開(kāi)發(fā)人員的生活。

Angular 8有什么新功能?

Angular 8添加了差異加載,一個(gè)可選的Ivy Renderer和Bazel作為構(gòu)建選項(xiàng)。 差異加載是CLI在構(gòu)建已部署應(yīng)用程序的一部分時(shí)構(gòu)建兩個(gè)單獨(dú)的捆綁軟件的地方。 現(xiàn)代捆綁軟件可用于常綠的瀏覽器,而傳統(tǒng)捆綁軟件則包含舊瀏覽器所需的所有必需填充。

Ivy Renderer體積更小,更快,調(diào)試更簡(jiǎn)單,類(lèi)型檢查得到了改進(jìn),并且最重要的是向后兼容。

Spring Boot 2.2中有什么新功能?

Spring Boot在快速啟動(dòng)的框架(例如Micronaut和Quarkus)中感到有些不適,并且也進(jìn)行了許多性能改進(jìn)。 現(xiàn)在默認(rèn)情況下禁用JMX,禁用Hibernate的實(shí)體掃描,并且默認(rèn)情況下啟用Bean的惰性初始化。 另外,通過(guò)在Spring Boot的@Configuration類(lèi)中使用proxyBeanMethods=false減少了啟動(dòng)時(shí)間和內(nèi)存使用。 有關(guān)更多信息,請(qǐng)參見(jiàn)Spring Boot 2.2 Release Notes 。

如果您被這些框架的舊版本所困擾,則可能需要查看我之前的幾篇文章:

  • 使用Angular 7.0和Spring Boot 2.1構(gòu)建基本的CRUD應(yīng)用
  • 使用Angular 5.0和Spring Boot 2.0構(gòu)建基本的CRUD應(yīng)用

這篇文章介紹了如何構(gòu)建一個(gè)簡(jiǎn)單的CRUD應(yīng)用程序,該應(yīng)用程序顯示了一系列涼爽的汽車(chē)。 它允許您編輯汽車(chē),并顯示GIPHY中與汽車(chē)名稱匹配的動(dòng)畫(huà)gif。 您還將學(xué)習(xí)如何使用Okta的Spring Boot啟動(dòng)程序和Angular SDK保護(hù)應(yīng)用程序的安全。 下面是該應(yīng)用完成時(shí)的屏幕截圖。

您將需要安裝Java 11和Node.js 10+才能完成本教程。

使用Spring Boot 2.2構(gòu)建API

要開(kāi)始使用Spring Boot 2.2,請(qǐng)轉(zhuǎn)到start.spring.io并創(chuàng)建一個(gè)使用Java 11(在更多選項(xiàng)下),Spring Boot版本2.2.0 M2和依賴項(xiàng)的新項(xiàng)目,以創(chuàng)建安全的API:JPA, H2,Rest Repository,Lombok,Okta和Web。

創(chuàng)建一個(gè)目錄來(lái)保存您的服務(wù)器和客戶端應(yīng)用程序。 我叫我的okta-spring-boot-2-angular-8-example ,但是您可以隨便叫什么。

如果您希望應(yīng)用程序運(yùn)行而不是編寫(xiě)代碼,則可以在GitHub上查看示例 ,或使用以下命令在本地克隆并運(yùn)行。

git clone https://github.com/oktadeveloper/okta-spring-boot-2-angular-8-example.git cd okta-spring-boot-2-angular-8-example/client npm install ng serve & cd ../server ./mvnw spring-boot:run

從start.spring.io下載demo.zip之后,展開(kāi)它,然后將demo目錄復(fù)制到您的應(yīng)用程序持有人目錄中。 將demo重命名為server 。 打開(kāi)server/pom.xml并注釋掉Okta的Spring Boot啟動(dòng)器上的依賴項(xiàng)。

<!--dependency><groupId>com.okta.spring</groupId><artifactId>okta-spring-boot-starter</artifactId><version>1.1.0</version> </dependency-->

在您最喜歡的IDE中打開(kāi)項(xiàng)目,并在src/main/java/com/okta/developer/demo目錄中創(chuàng)建Car.java類(lèi)。 您可以使用Lombok的注釋來(lái)減少樣板代碼。

package com.okta.developer.demo;import lombok.*;import javax.persistence.Id; import javax.persistence.GeneratedValue; import javax.persistence.Entity;@Entity @Data @NoArgsConstructor public class Car {@Id @GeneratedValueprivate Long id;private @NonNull String name; }

創(chuàng)建一個(gè)CarRepository類(lèi)以對(duì)Car實(shí)體執(zhí)行CRUD(創(chuàng)建,讀取,更新和刪除)。

package com.okta.developer.demo;import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.rest.core.annotation.RepositoryRestResource;@RepositoryRestResource interface CarRepository extends JpaRepository<Car, Long> { }

將ApplicationRunner bean添加到DemoApplication類(lèi)(在src/main/java/com/okta/developer/demo/DemoApplication.java ),并使用它向數(shù)據(jù)庫(kù)添加一些默認(rèn)數(shù)據(jù)。

package com.okta.developer.demo;import org.springframework.boot.ApplicationRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import java.util.stream.Stream;@SpringBootApplication public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}@BeanApplicationRunner init(CarRepository repository) {return args -> {Stream.of("Ferrari", "Jaguar", "Porsche", "Lamborghini", "Bugatti","AMC Gremlin", "Triumph Stag", "Ford Pinto", "Yugo GV").forEach(name -> {Car car = new Car();car.setName(name);repository.save(car);});repository.findAll().forEach(System.out::println);};} }

如果在添加此代碼后啟動(dòng)應(yīng)用程序(使用./mvnw spring-boot:run ),則會(huì)在啟動(dòng)時(shí)看到控制臺(tái)中顯示的汽車(chē)列表。

Car(id=1, name=Ferrari) Car(id=2, name=Jaguar) Car(id=3, name=Porsche) Car(id=4, name=Lamborghini) Car(id=5, name=Bugatti) Car(id=6, name=AMC Gremlin) Car(id=7, name=Triumph Stag) Car(id=8, name=Ford Pinto) Car(id=9, name=Yugo GV)

注意:如果看到Fatal error compiling: invalid target release: 11 ,這是因?yàn)槟褂玫氖荍ava8。如果更改為使用Java 11,則該錯(cuò)誤將消失。 如果您使用的是SDKMAN , 請(qǐng)先運(yùn)行sdk install java 11.0.2-open然后運(yùn)行sdk default java 11.0.2-open 。

添加一個(gè)CoolCarController類(lèi)(在src/main/java/com/okta/developer/demo ),該類(lèi)返回要在Angular客戶端中顯示的酷車(chē)列表。

package com.okta.developer.demo;import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Collection; import java.util.stream.Collectors;@RestController class CoolCarController {private CarRepository repository;public CoolCarController(CarRepository repository) {this.repository = repository;}@GetMapping("/cool-cars")public Collection<Car> coolCars() {return repository.findAll().stream().filter(this::isCool).collect(Collectors.toList());}private boolean isCool(Car car) {return !car.getName().equals("AMC Gremlin") &&!car.getName().equals("Triumph Stag") &&!car.getName().equals("Ford Pinto") &&!car.getName().equals("Yugo GV");} }

如果重新啟動(dòng)服務(wù)器,并使用瀏覽器或命令行客戶端訪問(wèn)http://localhost:8080/cool-cars ,則應(yīng)該看到過(guò)濾后的汽車(chē)列表。

$ http :8080/cool-cars HTTP/1.1 200 Content-Type: application/json;charset=UTF-8 Date: Tue, 07 May 2019 18:07:33 GMT Transfer-Encoding: chunked[{"id": 1,"name": "Ferrari"},{"id": 2,"name": "Jaguar"},{"id": 3,"name": "Porsche"},{"id": 4,"name": "Lamborghini"},{"id": 5,"name": "Bugatti"} ]

使用Angular CLI創(chuàng)建客戶端

Angular CLI是一個(gè)命令行實(shí)用程序,可以為您生成Angular項(xiàng)目。 它不僅可以創(chuàng)建新項(xiàng)目,而且還可以生成代碼。 這是一個(gè)方便的工具,因?yàn)樗€提供了一些命令,這些命令將生成和優(yōu)化您的項(xiàng)目以進(jìn)行生產(chǎn)。 它使用webpack在后臺(tái)進(jìn)行構(gòu)建。

安裝最新版本的Angular CLI(在撰寫(xiě)本文時(shí)為v8.0.0-rc.3版本)。

npm i -g @angular/cli@v8.0.0-rc.3

在您創(chuàng)建的傘形目錄中創(chuàng)建一個(gè)新項(xiàng)目。

ng new client --routing --style css --enable-ivy

創(chuàng)建客戶端后,導(dǎo)航至其目錄,刪除.git ,然后安裝Angular Material。

cd client rm -rf .git # optional: .git won't be created if you don't have Git installed ng add @angular/material

當(dāng)提示您提供主題和其他選項(xiàng)時(shí),請(qǐng)選擇默認(rèn)值。

您將使用Angular Material的組件來(lái)改善UI的外觀,尤其是在手機(jī)上。 如果您想了解有關(guān)Angular Material的更多信息,請(qǐng)參見(jiàn)material.angular.io 。 它具有有關(guān)其各種組件以及如何使用它們的大量文檔。 右上角的油漆桶將允許您預(yù)覽可用的主題顏色。

使用Angular CLI構(gòu)建汽車(chē)列表頁(yè)面

使用Angular CLI生成可以與Cool Cars API對(duì)話的汽車(chē)服務(wù)。

ng g s shared/car/car

更新client/src/app/shared/car/car.service.ts以從服務(wù)器獲取汽車(chē)列表。

import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs';@Injectable({providedIn: 'root' }) export class CarService {constructor(private http: HttpClient) {}getAll(): Observable<any> {return this.http.get('//localhost:8080/cool-cars');} }

打開(kāi)src/app/app.module.ts ,并將HttpClientModule添加為導(dǎo)入。

import { HttpClientModule } from '@angular/common/http';@NgModule({declarations: [AppComponent],imports: [BrowserModule,AppRoutingModule,BrowserAnimationsModule,HttpClientModule],providers: [],bootstrap: [AppComponent] })

生成car-list組件以顯示汽車(chē)列表。

ng g c car-list

更新client/src/app/car-list/car-list.component.ts以使用CarService來(lái)獲取列表并在本地cars變量中設(shè)置值。

import { Component, OnInit } from '@angular/core'; import { CarService } from '../shared/car/car.service';@Component({selector: 'app-car-list',templateUrl: './car-list.component.html',styleUrls: ['./car-list.component.css'] }) export class CarListComponent implements OnInit {cars: Array<any>;constructor(private carService: CarService) { }ngOnInit() {this.carService.getAll().subscribe(data => {this.cars = data;});} }

更新client/src/app/car-list/car-list.component.html以顯示汽車(chē)列表。

<h2>Car List</h2><div *ngFor="let car of cars">{{car.name}} </div>

更新client/src/app/app.component.html以具有app-car-list元素。

<div style="text-align:center"><h1>Welcome to {{ title }}!</h1> </div><app-car-list></app-car-list> <router-outlet></router-outlet>

使用ng serve -o啟動(dòng)客戶端應(yīng)用程序。 您現(xiàn)在還不會(huì)看到汽車(chē)清單,并且如果打開(kāi)開(kāi)發(fā)人員控制臺(tái),就會(huì)明白原因。

發(fā)生此錯(cuò)誤的原因是您尚未在服務(wù)器上啟用CORS(跨源資源共享)。

在服務(wù)器上啟用CORS

要在服務(wù)器上啟用CORS,添加@CrossOrigin注釋到CoolCarController (在server/src/main/java/com/okta/developer/demo/CoolCarController.java )。

import org.springframework.web.bind.annotation.CrossOrigin; ... @GetMapping("/cool-cars") @CrossOrigin(origins = "http://localhost:4200") public Collection<Car> coolCars() {return repository.findAll().stream().filter(this::isCool).collect(Collectors.toList()); }

在Spring啟動(dòng)版本2.1.4及以下,你還可以添加一個(gè)@CrossOrigin注釋您CarRepository 。 從Angular添加/刪除/編輯時(shí),這將允許您與其端點(diǎn)進(jìn)行通信。

import org.springframework.web.bind.annotation.CrossOrigin;@RepositoryRestResource @CrossOrigin(origins = "http://localhost:4200") interface CarRepository extends JpaRepository<Car, Long> { }

但是,這在Spring Boot 2.2.0.M2中不再起作用 。 好消息是有解決方法。 您可以將CorsFilter bean添加到DemoApplication.java類(lèi)中。 當(dāng)您同時(shí)集成Spring Security時(shí),這是必需的。 你只是早一點(diǎn)做。

import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.core.Ordered; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; import java.util.Collections;...public class DemoApplication {// main() and init() methods@Beanpublic FilterRegistrationBean<CorsFilter> simpleCorsFilter() {UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();CorsConfiguration config = new CorsConfiguration();config.setAllowCredentials(true);config.setAllowedOrigins(Collections.singletonList("http://localhost:4200"));config.setAllowedMethods(Collections.singletonList("*"));config.setAllowedHeaders(Collections.singletonList("*"));source.registerCorsConfiguration("/**", config);FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));bean.setOrder(Ordered.HIGHEST_PRECEDENCE);return bean;} }

重新啟動(dòng)服務(wù)器,刷新客戶端,您應(yīng)該在瀏覽器中看到汽車(chē)列表。

添加角材料

您已經(jīng)安裝了Angular Material,要使用其組件,需要導(dǎo)入它們。 打開(kāi)client/src/app/app.module.ts并添加動(dòng)畫(huà)的導(dǎo)入,以及Material的工具欄,按鈕,輸入,列表和卡片布局。

import { MatButtonModule, MatCardModule, MatInputModule, MatListModule, MatToolbarModule } from '@angular/material';@NgModule({...imports: [BrowserModule,AppRoutingModule,BrowserAnimationsModule,HttpClientModule,MatButtonModule,MatCardModule,MatInputModule,MatListModule,MatToolbarModule],... })

更新client/src/app/app.component.html以使用工具欄組件。

<mat-toolbar color="primary"><span>Welcome to {{title}}!</span> </mat-toolbar><app-car-list></app-car-list> <router-outlet></router-outlet>

更新client/src/app/car-list/car-list.component.html以使用卡片布局和列表組件。

<mat-card><mat-card-title>Car List</mat-card-title><mat-card-content><mat-list><mat-list-item *ngFor="let car of cars"><img mat-list-avatar src="{{car.giphyUrl}}" alt="{{car.name}}"><h3 mat-line>{{car.name}}</h3></mat-list-item></mat-list></mat-card-content> </mat-card>

如果使用ng serve運(yùn)行客戶端并導(dǎo)航到http://localhost:4200 ,則會(huì)看到汽車(chē)列表,但沒(méi)有與之關(guān)聯(lián)的圖像。

使用Giphy添加動(dòng)畫(huà)GIF

要將giphyUrl屬性添加到每輛汽車(chē),請(qǐng)創(chuàng)建client/src/app/shared/giphy/giphy.service.ts并使用以下代碼填充。

import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { map } from 'rxjs/operators';@Injectable({providedIn: 'root'}) export class GiphyService {// This is a Giphy API Key I created. Create your own at https://developers.giphy.com/dashboard/?create=true.giphyApi = '//api.giphy.com/v1/gifs/search?api_key=nOTRbUNMgD5mj4XowN2ERoPNudAkK6ft&limit=1&q=';constructor(public http: HttpClient) {}get(searchTerm) {const apiLink = this.giphyApi + searchTerm;return this.http.get(apiLink).pipe(map((response: any) => {if (response.data.length > 0) {return response.data[0].images.original.url;} else {return 'https://media.giphy.com/media/YaOxRsmrv9IeA/giphy.gif'; // dancing cat for 404}}));} }

更新client/src/app/car-list/car-list.component.ts以在每輛汽車(chē)上設(shè)置giphyUrl屬性。

import { GiphyService } from '../shared/giphy/giphy.service';export class CarListComponent implements OnInit {cars: Array<any>;constructor(private carService: CarService, private giphyService: GiphyService) { }ngOnInit() {this.carService.getAll().subscribe(data => {this.cars = data;for (const car of this.cars) {this.giphyService.get(car.name).subscribe(url => car.giphyUrl = url);}});} }

現(xiàn)在,您的瀏覽器將向您顯示汽車(chē)名稱列表,以及旁邊的頭像圖片。

向您的Angular應(yīng)用添加編輯功能

列出汽車(chē)名稱和圖像很酷,但是當(dāng)您與之互動(dòng)時(shí),它會(huì)更加有趣! 要添加編輯功能,請(qǐng)首先生成car-edit組件。

ng g c car-edit

更新client/src/app/shared/car/car.service.ts以具有添加,移除和更新汽車(chē)的方法。 這些方法跟由提供的端點(diǎn)CarRepository及其@RepositoryRestResource注釋。

import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs';@Injectable({providedIn: 'root'}) export class CarService {public API = '//localhost:8080';public CAR_API = this.API + '/cars';constructor(private http: HttpClient) {}getAll(): Observable<any> {return this.http.get(this.API + '/cool-cars');}get(id: string) {return this.http.get(this.CAR_API + '/' + id);}save(car: any): Observable<any> {let result: Observable<any>;if (car.href) {result = this.http.put(car.href, car);} else {result = this.http.post(this.CAR_API, car);}return result;}remove(href: string) {return this.http.delete(href);} }

在client/src/app/car-list/car-list.component.html ,添加指向編輯組件的鏈接。 另外,在底部添加按鈕以添加新車(chē)。

<mat-card><mat-card-title>Car List</mat-card-title><mat-card-content><mat-list><mat-list-item *ngFor="let car of cars"><img mat-list-avatar src="{{car.giphyUrl}}" alt="{{car.name}}"><h3 mat-line><a mat-button [routerLink]="['/car-edit', car.id]">{{car.name}}</a></h3></mat-list-item></mat-list></mat-card-content><button mat-fab color="primary" [routerLink]="['/car-add']">Add</button> </mat-card>

在client/src/app/app.module.ts ,導(dǎo)入FormsModule 。

import { FormsModule } from '@angular/forms';@NgModule({...imports: [...FormsModule],... })

在client/src/app/app-routing.module.ts ,為CarListComponent和CarEditComponent添加路由。

import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; import { CarListComponent } from './car-list/car-list.component'; import { CarEditComponent } from './car-edit/car-edit.component';const routes: Routes = [{ path: '', redirectTo: '/car-list', pathMatch: 'full' },{path: 'car-list',component: CarListComponent},{path: 'car-add',component: CarEditComponent},{path: 'car-edit/:id',component: CarEditComponent} ];@NgModule({imports: [RouterModule.forRoot(routes)],exports: [RouterModule] }) export class AppRoutingModule { }

修改client/src/app/car-edit/car-edit.component.ts以從URL上傳遞的ID中獲取汽車(chē)信息,并添加保存和刪除方法。

import { Component, OnDestroy, OnInit } from '@angular/core'; import { Subscription } from 'rxjs'; import { ActivatedRoute, Router } from '@angular/router'; import { CarService } from '../shared/car/car.service'; import { GiphyService } from '../shared/giphy/giphy.service'; import { NgForm } from '@angular/forms';@Component({selector: 'app-car-edit',templateUrl: './car-edit.component.html',styleUrls: ['./car-edit.component.css'] }) export class CarEditComponent implements OnInit, OnDestroy {car: any = {};sub: Subscription;constructor(private route: ActivatedRoute,private router: Router,private carService: CarService,private giphyService: GiphyService) {}ngOnInit() {this.sub = this.route.params.subscribe(params => {const id = params.id;if (id) {this.carService.get(id).subscribe((car: any) => {if (car) {this.car = car;this.car.href = car._links.self.href;this.giphyService.get(car.name).subscribe(url => car.giphyUrl = url);} else {console.log(`Car with id '${id}' not found, returning to list`);this.gotoList();}});}});}ngOnDestroy() {this.sub.unsubscribe();}gotoList() {this.router.navigate(['/car-list']);}save(form: NgForm) {this.carService.save(form).subscribe(result => {this.gotoList();}, error => console.error(error));}remove(href) {this.carService.remove(href).subscribe(result => {this.gotoList();}, error => console.error(error));} }

更新client/src/app/car-edit/car-edit.component.htmlHTML以具有帶有汽車(chē)名稱的表單,并顯示來(lái)自Giphy的圖像。

<mat-card><form #carForm="ngForm" (ngSubmit)="save(carForm.value)"><mat-card-header><mat-card-title><h2>{{car.name ? 'Edit' : 'Add'}} Car</h2></mat-card-title></mat-card-header><mat-card-content><input type="hidden" name="href" [(ngModel)]="car.href"><mat-form-field><input matInput placeholder="Car Name" [(ngModel)]="car.name"required name="name" #name></mat-form-field></mat-card-content><mat-card-actions><button mat-raised-button color="primary" type="submit"[disabled]="!carForm.valid">Save</button><button mat-raised-button color="secondary" (click)="remove(car.href)"*ngIf="car.href" type="button">Delete</button><a mat-button routerLink="/car-list">Cancel</a></mat-card-actions><mat-card-footer><div class="giphy"><img src="{{car.giphyUrl}}" alt="{{car.name}}"></div></mat-card-footer></form> </mat-card>

通過(guò)將以下CSS添加到client/src/app/car-edit/car-edit.component.css ,在圖像周?chē)砑右恍┨畛洹?

.giphy {margin: 10px; }

修改client/src/app/app.component.html并刪除<app-car-list></app-car-list> 。

<mat-toolbar color="primary"><span>Welcome to {{title}}!</span> </mat-toolbar><router-outlet></router-outlet>

進(jìn)行所有這些更改之后,您應(yīng)該可以添加,編輯或刪除任何汽車(chē)。 下面的屏幕快照顯示了帶有添加按鈕的列表。

以下屏幕截圖顯示了編輯已添加的汽車(chē)的外觀。

將OIDC身份驗(yàn)證添加到您的Spring Boot + Angular App中

使用OIDC添加身份驗(yàn)證是一個(gè)不錯(cuò)的功能,可以添加到此應(yīng)用程序中。 如果您想添加審核或個(gè)性化您的應(yīng)用程序(例如,使用評(píng)分功能),則知道此人是誰(shuí)會(huì)很方便。

Spring Security + OIDC

在服務(wù)器端,您可以使用Okta的Spring Boot Starter來(lái)鎖定一切,它利用了Spring Security及其OIDC支持。 打開(kāi)server/pom.xml并取消注釋Okta Spring Boot啟動(dòng)器。

<dependency><groupId>com.okta.spring</groupId><artifactId>okta-spring-boot-starter</artifactId><version>1.1.0</version> </dependency>

現(xiàn)在,您需要配置服務(wù)器以使用Okta進(jìn)行身份驗(yàn)證。 為此,您需要在Okta中創(chuàng)建OIDC應(yīng)用。

在Okta中創(chuàng)建OIDC應(yīng)用

登錄到您的1563開(kāi)發(fā)者帳戶(或者注冊(cè) ,如果你沒(méi)有一個(gè)帳戶)并導(dǎo)航到應(yīng)用程序 > 添加應(yīng)用程序 。 單擊“ 單頁(yè)應(yīng)用程序” ,再單擊“ 下一步” ,然后為該應(yīng)用程序命名。 將所有http://localhost:8080實(shí)例更改為http://localhost:4200 ,然后單擊完成

您將在頁(yè)面底部看到一個(gè)客戶端ID。 將它和issuer屬性添加到server/src/main/resources/application.properties 。

okta.oauth2.client-id={yourClientId} okta.oauth2.issuer=https://{yourOktaDomain}/oauth2/default

創(chuàng)建server/src/main/java/com/okta/developer/demo/SecurityConfiguration.java以將您的Spring Boot應(yīng)用配置為資源服務(wù)器。

package com.okta.developer.demo;import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@EnableWebSecurity public class SecurityConfiguration extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().oauth2ResourceServer().jwt();} }

進(jìn)行這些更改之后,您應(yīng)該能夠重新啟動(dòng)應(yīng)用程序,并在嘗試導(dǎo)航到http://localhost:8080時(shí)看到錯(cuò)誤。

注意:您可以通過(guò)將http://localhost:8080/login/oauth2/code/okta為應(yīng)用程序的重定向URI來(lái)解決此錯(cuò)誤,但這不能解決問(wèn)題。 如果您想通過(guò)Spring Boot支持OIDC登錄,則需要注冊(cè)一個(gè)Web應(yīng)用程序(而不是SPA),并在application.properties包含一個(gè)客戶端密碼。 這不是本教程中的必要步驟。

現(xiàn)在您的服務(wù)器已被鎖定,您需要配置客戶端以使用訪問(wèn)令牌與之對(duì)話。 這就是Okta的Angular SDK派上用場(chǎng)的地方。

Okta的角度支撐

Okta Angular SDK是Okta Auth JS的包裝,后者基于OIDC。 可以在GitHub上找到有關(guān)Okta的Angular庫(kù)的更多信息。

為了簡(jiǎn)化Angular SDK的安裝和配置,我們創(chuàng)建了一個(gè)@ oktadev / schematics項(xiàng)目,該項(xiàng)目可以為您完成所有工作。 您可以在“ 使用角度示意圖簡(jiǎn)化生活”中閱讀有關(guān)@ oktadev / schematics如何工作的更多信息。

在安裝它之前,最好將您的項(xiàng)目檢查到源代碼管理中。 如果未安裝Git,則可以將項(xiàng)目復(fù)制到另一個(gè)位置作為備份。 如果確實(shí)安裝了Git,請(qǐng)從項(xiàng)目的根目錄中運(yùn)行以下命令。

git init git add . git commit -m "Initialize project"

要安裝和配置Okta的Angular SDK,請(qǐng)?jiān)赾lient目錄中運(yùn)行以下命令:

ng add @oktadev/schematics --issuer=https://{yourOktaDomain}/oauth2/default --clientId={yourClientId}

該命令將:

  • 安裝@okta/okta-angular
  • 在auth-routing.module.ts為您的應(yīng)用配置Okta的Angular SDK
  • 將isAuthenticated邏輯添加到app.component.ts
  • 添加帶有登錄和注銷(xiāo)按鈕的HomeComponent
  • 使用到/home的默認(rèn)路由和/implicit/callback路由配置路由
  • 添加一個(gè)HttpInterceptor ,它向localhost請(qǐng)求添加一個(gè)帶有訪問(wèn)令牌的Authorization標(biāo)頭

修改client/src/app/app.component.html以使用Material組件并具有注銷(xiāo)按鈕。

<mat-toolbar color="primary"><span>Welcome to {{title}}!</span><span class="toolbar-spacer"></span><button mat-raised-button color="accent" *ngIf="isAuthenticated"(click)="oktaAuth.logout()" [routerLink]="['/home']">Logout</button> </mat-toolbar><router-outlet></router-outlet>

您可能會(huì)注意到toolbar-spacer類(lèi)存在跨度。 要使此功能按預(yù)期工作,請(qǐng)?jiān)赾lient/src/app/app.component.css添加一個(gè)toolbar-spacer規(guī)則。

.toolbar-spacer {flex: 1 1 auto; }

然后更新client/src/app/home/home.component.html以使用Angular Material并鏈接到Car List。

<mat-card><mat-card-content><button mat-raised-button color="accent" *ngIf="!isAuthenticated"(click)="oktaAuth.loginRedirect()">Login</button><button mat-raised-button color="accent" *ngIf="isAuthenticated"[routerLink]="['/car-list']">Car List</button></mat-card-content> </mat-card>

由于您使用的是HomeComponent Material組件,該組件由新添加的client/src/app/auth-routing.module.ts ,因此需要導(dǎo)入MatCardModule 。

import { MatCardModule } from '@angular/material';@NgModule({...imports: [...MatCardModule],... })

要使其內(nèi)容底部沒(méi)有底邊框,請(qǐng)通過(guò)將以下內(nèi)容添加到client/src/styles.css來(lái)使<mat-card>元素填充屏幕。

mat-card {height: 100vh; }

現(xiàn)在,如果您重新啟動(dòng)客戶端,一切都應(yīng)該工作。 不幸的是,這不是因?yàn)镮vy尚未實(shí)現(xiàn)CommonJS / UMD支持 。 解決方法是,您可以修改tsconfig.app.json以禁用Ivy。

"angularCompilerOptions": {"enableIvy": false }

停止并重新啟動(dòng)ng serve過(guò)程。 打開(kāi)瀏覽器到http://localhost:4200 。

單擊登錄按鈕。 如果一切配置正確,您將被重定向到Okta登錄。

輸入有效的憑據(jù),您應(yīng)該被重定向回您的應(yīng)用程序。 慶祝一切成功! 🎉

了解有關(guān)Spring Boot和Angular的更多信息

跟上快速移動(dòng)的框架(如Spring Boot和Angular)可能很難。 這篇文章旨在為您提供最新版本的快速入門(mén)。 有關(guān)Angular 8的特定更改,請(qǐng)參閱Angular團(tuán)隊(duì)針對(duì)8.0版和Ivy的計(jì)劃 。 對(duì)于Spring Boot,請(qǐng)參閱其2.2發(fā)行說(shuō)明 。

您可以在oktadeveloper / okta-spring-boot-2-angular-8-example上的GitHub上看到本教程中開(kāi)發(fā)的應(yīng)用程序的完整源代碼。

這個(gè)博客有大量的Spring Boot和Angular教程。 這是我的最?lèi)?ài):

  • 使用Angular和Electron構(gòu)建桌面應(yīng)用程序
  • 將您的Spring Boot應(yīng)用程序遷移到最新和最新的Spring Security和OAuth 2.0
  • Java 11,Spring Boot和JavaScript中的i18n
  • 為Angular應(yīng)用程序建立安全登錄
  • 使用Spring WebFlux構(gòu)建反應(yīng)性API

如有任何疑問(wèn),請(qǐng)隨時(shí)在下面發(fā)表評(píng)論,或在我們的Okta開(kāi)發(fā)者論壇上向我們提問(wèn)。 別忘了在Twitter和YouTube 上關(guān)注我們!

“ Angular 8 + Spring Boot 2.2:今天就構(gòu)建一個(gè)CRUD應(yīng)用程序!” 最初于2019年5月13日發(fā)布在Okta開(kāi)發(fā)人員博客上。

“我喜歡編寫(xiě)身份驗(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/2019/05/angular-spring-boot-build-crud-app-today.html

總結(jié)

以上是生活随笔為你收集整理的Angular 8 + Spring Boot 2.2:立即构建一个CRUD应用程序!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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

国产精品网红直播 | 久久1电影院 | 亚洲91在线| 91在线视频精品 | 波多野结衣动态图 | 久久久这里有精品 | 91c网站色版视频 | 日韩亚洲欧美中文字幕 | 8x成人免费视频 | 一区二区在线电影 | 亚洲综合在线五月 | 国产精品午夜免费福利视频 | 一区二区三区日韩在线观看 | 午夜精品久久久久久久99水蜜桃 | 91尤物国产尤物福利在线播放 | 婷婷丁香在线观看 | 欧产日产国产69 | 国产精品久久久久影院日本 | 日韩免费福利 | 欧美日韩一区二区在线 | 中文字幕亚洲在线观看 | 美女久久久久久久 | 午夜在线观看 | 成人免费观看视频网站 | 91精品婷婷国产综合久久蝌蚪 | 国产999在线观看 | 五月天六月婷婷 | 五月激情姐姐 | av电影免费 | 免费黄色在线播放 | 国产精品99久久99久久久二8 | 人人爽人人舔 | 久久精品视频播放 | 激情久久久久久久久久久久久久久久 | 亚洲黄色一级电影 | 成人动漫一区二区三区 | 蜜臀精品久久久久久蜜臀 | 国内精品久久天天躁人人爽 | 国产在线视频不卡 | 人人干人人模 | 欧美日韩国产精品一区 | 免费精品国产va自在自线 | 久久久精品免费看 | 色婷婷在线视频 | 国产黄色免费看 | 久久久久成人免费 | 国产精品久久久久国产精品日日 | 草久久影院 | 国产手机在线视频 | 91精品秘密在线观看 | 九九久久久久久久久激情 | 日韩av视屏在线观看 | 成年人视频在线免费 | 欧美色综合天天久久综合精品 | 国产成人av网站 | 激情婷婷久久 | 96av在线视频 | 国产精品国产三级国产aⅴ无密码 | 国内精品视频一区二区三区八戒 | 国产高清视频在线观看 | 色香com.| 精品久久国产一区 | 亚洲自拍偷拍色图 | 日日爱影视 | 免费亚洲视频 | 99热国产在线观看 | 乱子伦av | 黄色小网站免费看 | 九九影视理伦片 | 亚洲经典视频 | 亚洲一级在线观看 | 成人在线播放网站 | 国产精品久久艹 | 久久观看 | 成年人免费av网站 | 人人澡人人添人人爽一区二区 | 久草在线综合网 | 在线视频免费观看 | 国产视频一区精品 | 久久99精品国产 | 99视频在线精品免费观看2 | 国产精品久久久久四虎 | 69视频在线播放 | 国产综合激情 | 精品国产一区二区三区男人吃奶 | 91丨九色丨首页 | 日韩精品一区二区三区不卡 | 国产私拍在线 | 亚洲国产成人在线播放 | 欧美aa一级片| 国产91精品欧美 | 五月天中文字幕 | 在线视频a | 久久99久久99精品中文字幕 | 免费三级黄色 | www欧美色 | 精品久久久久久久久久久久久久久久 | 国产日韩欧美在线观看视频 | 国产精品一区二区白浆 | 欧美日韩在线第一页 | 成人18视频 | 日韩一区视频在线 | 黄色免费大全 | 国内久久| 日韩av手机在线看 | 国产一级片免费视频 | av电影免费在线看 | 91人人澡人人爽人人精品 | 日韩中文字幕a | 亚洲视频久久久久 | 在线a人片免费观看视频 | 午夜久久影视 | 超级碰碰免费视频 | 色中射| www.天天干 | 成人久久18免费网站图片 | 激情五月婷婷综合 | 高清免费在线视频 | 国产视频97 | 久久久久国产一区二区三区 | 五月婷婷毛片 | 日韩在观看线 | 国产91精品一区二区麻豆亚洲 | 啪啪免费试看 | 久久免费福利 | 国产精品99久久久久久宅男 | 极品久久久久久久 | 五月婷婷综合久久 | 黄色av大片| 99视频在线观看一区三区 | 97人人模人人爽人人少妇 | 激情综合中文娱乐网 | 18av在线视频 | 99精品国产一区二区三区不卡 | 色婷婷视频在线 | 91影视成人| 一区二区三区久久 | 天天干,天天操,天天射 | 久久免费黄色 | 欧美午夜性生活 | 亚洲无人区小视频 | 亚洲天堂网在线视频 | 亚洲a免费| 五月婷色 | 999久久久 | 成人黄色片免费看 | 欧美十八 | 丰满少妇在线观看资源站 | 国产专区一 | av电影一区二区三区 | 亚洲一区二区91 | 国产91小视频 | 91精品国产91久久久久 | 六月天色婷婷 | 天天干天天拍 | 日韩精品你懂的 | av解说在线 | 欧美成人在线免费 | 毛片网免费 | 免费看黄20分钟 | 中文字幕色站 | 一区二区av| 99免费| 国产一二三四在线视频 | 亚洲精品影院在线观看 | 国产精品婷婷午夜在线观看 | 亚洲在线精品 | 欧美日韩在线播放 | 日本韩国欧美在线观看 | 欧美中文字幕第一页 | 国产 一区二区三区 在线 | 国产黄色资源 | 777奇米四色 | 91大神一区二区三区 | 日韩欧美视频二区 | 天天干天天射天天操 | 久久国产成人午夜av影院潦草 | 九九精品毛片 | 精壮的侍卫呻吟h | 999久久久| 亚洲精品电影在线 | 精品久久久久久久久久久久久久久久久久 | 九九九毛片 | 91精品啪在线观看国产 | 久久国产成人午夜av影院潦草 | 久久国产精品成人免费浪潮 | 亚洲成人av在线播放 | 成人黄色大片网站 | 18女毛片 | 日本aaaa级毛片在线看 | 天天干,夜夜爽 | 中文字幕乱码日本亚洲一区二区 | 在线观看成人国产 | 日韩欧美视频在线观看免费 | 中文字幕在线久一本久 | 免费av在线网 | 五月婷婷开心中文字幕 | 日韩,精品电影 | 久久婷婷一区 | 国内精品久久久久 | 在线电影a| 国产精品黑丝在线观看 | 久久综合爱| 精油按摩av | 亚洲国产精品成人精品 | 亚洲va综合va国产va中文 | 国产精品视频不卡 | 美女激情影院 | 国产精品99久久久久久武松影视 | 91精品国产一区二区三区 | 91av大全| 米奇影视7777 | 四虎成人精品永久免费av | 久久不卡电影 | 日本中文字幕系列 | 国产成人久久精品77777综合 | 欧美一区二区三区不卡 | 久久久精选 | 国产午夜av | 精品久久久久久久久中文字幕 | 最新国产一区二区三区 | av888av.com | 日日夜夜天天干 | 国产精品毛片一区二区在线 | 波多野结衣在线观看一区二区三区 | 黄色av网站在线观看 | av不卡在线看 | 国产视频中文字幕在线观看 | 精品欧美一区二区精品久久 | 日韩精品中文字幕有码 | 欧洲不卡av | 午夜成人免费电影 | 免费一级片在线 | 成人毛片100免费观看 | 日日干 天天干 | 久久久久国产一区二区三区四区 | 日韩v欧美v日本v亚洲v国产v | 国产一区高清在线观看 | 99热这里| 首页av在线 | 日本成人中文字幕在线观看 | 亚洲成人第一区 | 免费看三级 | 国产精品久久久久久久久婷婷 | 亚洲激情一区二区三区 | 日韩av视屏| 91av播放 | 91精品国产成 | 国产精品嫩草影视久久久 | 在线播放av网址 | 88av网站 | 三级黄色a | 日韩免费网址 | 999超碰| 一区二精品 | 97超在线视频 | 欧美成人在线网站 | 国产视频在线观看一区二区 | 国产精品成人自产拍在线观看 | 日韩精品一区二区在线 | 激情五月伊人 | 999成人国产 | 午夜精品一区二区三区在线观看 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 高清一区二区三区 | 国产成人综合图片 | 中文字幕在线观看完整 | 免费视频久久久久 | 国产精品嫩草影院99网站 | 91一区啪爱嗯打偷拍欧美 | 一区二区亚洲精品 | 免费三级影片 | 国产精品亚洲a | 瑞典xxxx性hd极品 | av一区二区三区在线观看 | 黄色毛片视频免费 | 色天天久久 | 中文字幕在线观看免费 | 日韩免费观看av | 在线影视 一区 二区 三区 | 中文字幕在线观看你懂的 | 国产精品1000 | 99久久99热这里只有精品 | 久久男人中文字幕资源站 | 999久久精品 | 国产精品免费观看网站 | 怡红院av| 国产一区二区三区免费观看视频 | 久久精品视频2 | 久久久久网站 | 天躁狠狠躁 | 波多野结衣电影久久 | 精产嫩模国品一二三区 | 国产精品黄 | 欧美国产一区在线 | 亚洲伊人av| 日日爱网站 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 久久国产精品小视频 | 欧美最猛性xxxxx(亚洲精品) | 九九激情视频 | 久久调教视频 | 成人av在线网址 | 久久草精品 | 精品夜夜嗨av一区二区三区 | 亚洲久草在线 | 99视频一区二区 | 久久国产精品久久久久 | 日本黄色免费在线 | 久久久精品国产一区二区三区 | 美女免费视频一区二区 | 国产九九精品视频 | 午夜视频在线观看一区二区三区 | 久久久久久久久久网站 | 亚州精品国产 | 国产亚洲精品久久久久久电影 | 色姑娘综合 | 菠萝菠萝蜜在线播放 | 最近最新最好看中文视频 | 91九色精品 | 国产一及片 | 激情五月综合网 | 午夜在线免费观看 | 91天天操 | 久久久精选 | 人人干人人模 | 亚洲欧美婷婷六月色综合 | 国产亚洲成av片在线观看 | 亚洲精品无 | 国产精品久久久久一区二区三区 | 国产日韩视频在线观看 | 国内久久精品视频 | 粉嫩av一区二区三区四区在线观看 | 99se视频在线观看 | 久久精品一区二区三区视频 | 久久国产精品一区二区三区四区 | av短片在线| 国产很黄很色的视频 | 国产韩国日本高清视频 | 日韩午夜av | 免费看的av片 | 美女网站视频一区 | 成年人电影免费看 | 欧美一级日韩三级 | 国产热re99久久6国产精品 | 久草www| 久草爱 | 美女一区网站 | 亚洲深夜影院 | 国产日韩精品在线观看 | 综合久久五月天 | 色综合久久88色综合天天 | 国产一级免费在线 | 国产精品久久久免费看 | 69久久99精品久久久久婷婷 | 日韩一区二区在线免费观看 | 亚洲精品视频在线观看免费视频 | 91精品老司机久久一区啪 | 亚洲国产精品成人综合 | 免费日韩av片 | 美女一二三区 | 天堂va在线高清一区 | 97成人资源 | 久久久久久久综合色一本 | 国产精品永久免费在线 | 91精品久久久久久久久 | 午夜久久久久久久久久影院 | 九九热免费在线观看 | 黄色小说视频网站 | 婷婷六月综合网 | 国内精品久久久久影院优 | 国产精品露脸在线 | av福利在线导航 | 青草草在线视频 | 色婷婷视频在线观看 | 激情久久伊人 | 色欧美成人精品a∨在线观看 | av电影免费看 | 91成人精品一区在线播放 | 欧美精品久久久久性色 | 99热9| zzijzzij日本成熟少妇 | 免费看一级特黄a大片 | 人人插人人舔 | 国产亚洲精品免费 | 国产精品福利在线观看 | 九月婷婷人人澡人人添人人爽 | 久久精品国产免费看久久精品 | 国产成人综合在线观看 | 激情网第四色 | 亚洲免费色 | 免费观看v片在线观看 | 91精品视频一区二区三区 | 免费99精品国产自在在线 | 久久精品一区二区三区中文字幕 | 亚洲区精品视频 | 99久久久久免费精品国产 | 91在线视频 | 伊人手机在线 | 久久看免费视频 | 91视频高清完整版 | 99999精品 | 特黄特黄的视频 | 免费看黄色小说的网站 | 久久视频国产 | 狠狠色综合网站久久久久久久 | 在线免费视频一区 | 一区二区三区在线免费观看 | 成人aaa毛片 | 超碰97人人在线 | 狠狠ri| 色操插 | 亚洲每日更新 | 三级av在线免费观看 | 成年人在线免费看视频 | 超碰在线免费97 | 东方av在| 欧美一级大片在线观看 | 国产高清视频在线观看 | 黄网站色视频 | 日韩欧美视频在线 | 欧美日韩国产一区二区三区在线观看 | 国产一级视频免费看 | 久久综合国产伦精品免费 | 天天射网站 | 黄色片免费在线 | 免费成人看片 | 久久艹免费 | 亚洲在线国产 | 日韩中文字幕a | 香蕉蜜桃视频 | 天天要夜夜操 | 99精品视频在线免费观看 | 欧美成人在线免费 | 国产手机在线 | 91在线中字 | 日韩三级免费观看 | 亚洲在线视频免费 | 午夜在线观看影院 | 黄色avwww| 日韩欧美视频免费在线观看 | 久久天天综合网 | 国产日韩精品一区二区三区在线 | 日韩在线观看影院 | 婷婷色五 | 99热这里精品 | 欧洲亚洲激情 | 免费在线观看国产黄 | 亚洲伊人第一页 | 亚洲精品麻豆视频 | 欧美一区在线观看视频 | 成人午夜精品久久久久久久3d | 久久91久久久久麻豆精品 | 五月开心激情 | 国产精品va在线观看入 | 精品久久久国产 | 亚洲国产精品一区二区久久,亚洲午夜 | 久草在线免费资源 | 九九九在线观看 | 国产精品久久久久永久免费观看 | 久久综合色天天久久综合图片 | 可以免费观看的av片 | 成人免费av电影 | 国产91在线看 | 免费情趣视频 | 伊人夜夜| 午夜av影院 | 99久久99久久综合 | 超碰在线公开免费 | 国产精品夜夜夜一区二区三区尤 | 久久一区二区三区超碰国产精品 | 精品高清美女精品国产区 | 9草在线 | 欧美日韩高清在线一区 | 又黄又刺激又爽的视频 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 精品成人网 | 国产偷在线 | 久久美女精品 | 狠狠色丁香婷婷综合久久片 | 国内揄拍国产精品 | 草久视频在线 | 特级xxxxx欧美 | 久久电影色 | 香蕉久久久久久av成人 | 国产一二区视频 | 91最新国产 | 国产99久久久国产精品成人免费 | 激情五月六月婷婷 | 亚洲天堂精品视频在线观看 | 99精品热| 欧美日韩一级久久久久久免费看 | 特级黄录像视频 | 日韩久久精品一区二区三区 | 国产精品男女视频 | 日韩和的一区二在线 | 激情视频免费在线观看 | av一区二区在线观看中文字幕 | 热久久精品在线 | 国产手机视频在线 | 精品免费一区 | 国产91影视| 日韩欧美一区二区三区视频 | 国产精品igao视频网网址 | 天天干天天做 | 夜夜澡人模人人添人人看 | 国产 中文 日韩 欧美 | 四虎永久网站 | 欧美最猛性xxx | www.夜夜操.com | 最新免费中文字幕 | 国产激情免费 | 国产精品一区二区在线免费观看 | 不卡的av| 特级毛片在线 | 在线播放视频一区 | 日韩av午夜在线观看 | 91视频首页 | 日本精品一区二区在线观看 | 碰超在线97人人 | 正在播放国产一区 | 久久人人精 | 麻豆91在线 | av中文字幕日韩 | 国产正在播放 | 中文字幕在线视频国产 | 少妇高潮流白浆在线观看 | 天天躁日日躁狠狠 | 亚洲免费精彩视频 | 毛片网站在线看 | 国产麻豆精品在线观看 | 粉嫩av一区二区三区四区五区 | 亚洲乱码中文字幕综合 | 国产精品99免费看 | 亚洲最新在线 | 免费看一级特黄a大片 | 国内精品久久久久影院日本资源 | 成人三级网址 | 久久久久女人精品毛片 | 午夜性色 | 国产精品免费观看视频 | 欧美国产日韩一区 | 97精品国产97久久久久久久久久久久 | 精品主播网红福利资源观看 | 欧美日韩国产xxx | 人人超在线公开视频 | 国产电影一区二区三区四区 | 久久国产精品偷 | 午夜视频一区二区 | 丁香综合网 | 国产一区播放 | 在线视频1卡二卡三卡 | 伊甸园永久入口www 99热 精品在线 | 日韩一区正在播放 | 亚洲免费在线视频 | 国产精品初高中精品久久 | 九九视频免费观看视频精品 | 国内精品久久久久久久影视简单 | 久久免费视频2 | 国产一区免费在线 | 国产99视频在线观看 | 亚洲精品美女在线观看播放 | 亚洲国产精品99久久久久久久久 | 日韩精品一区二区三区高清免费 | 久久久久综合网 | 在线看成人 | 国产精品中文字幕在线观看 | 欧美色图狠狠干 | 狠狠操狠狠操 | 日韩中文幕 | 黄色大全免费网站 | 久久在线免费观看 | 99久久99热这里只有精品 | 精品国产一区二区三区四区在线观看 | 欧美 日韩 性 | 亚洲高清91 | 91在线中文| 人人网av | 一区二区三区精品在线 | h视频在线看 | 国产香蕉视频在线观看 | 黄色三级网站在线观看 | 免费在线国产黄色 | 婷婷av网站 | 亚洲电影久久久 | 日韩在线免费不卡 | 黄色大片中国 | 四虎在线免费观看 | 天天干天天碰 | 十八岁免进欧美 | 蜜臀久久99精品久久久无需会员 | 日韩精品中文字幕在线 | 免费国产一区二区 | 国产精品av免费在线观看 | 超碰97人人爱 | 五月天激情综合 | 亚洲精品日韩一区二区电影 | 激情影音 | 成人黄色小说在线观看 | 天天干夜夜爽 | 国产成人精品亚洲精品 | 免费福利视频网 | 国产综合在线观看视频 | 欧美日韩一区二区在线 | 成年人免费在线观看网站 | 国产精品毛片久久久久久久久久99999999 | 国产视频日韩 | 在线精品播放 | 精品成人免费 | 精品特级毛片 | 中文在线a天堂 | 五月婷婷亚洲 | 成人一级片免费看 | 91片黄在线观看动漫 | 色精品视频 | 国产精品第一 | 久久久免费精品 | 久保带人 | 欧美极品在线播放 | 欧美激情在线网站 | 亚洲成人黄色av | 国产精品久久久久久久免费大片 | 亚洲精品在线观看中文字幕 | 人人搞人人干 | 精品国产乱码久久久久久1区2匹 | 在线观看的av | 综合久久久久久久 | av在线h | av免费观看在线 | 福利一区在线 | 香蕉在线观看视频 | 91av电影| 国产亚洲综合精品 | 中文字幕在线播放一区二区 | 处女av在线| 97视频资源 | www日| 免费成人av电影 | 欧美精品久久久久久久久老牛影院 | 香蕉视频日本 | 天天色天天操综合网 | 91网站在线视频 | 天天操天天射天天舔 | 狠狠久久婷婷 | 国产精品资源在线观看 | 免费成人在线观看 | 免费电影一区二区三区 | 亚洲欧美日本一区二区三区 | 亚洲人毛片 | 日韩有码专区 | 麻豆极品 | 香蕉影视在线观看 | 91一区啪爱嗯打偷拍欧美 | 久久无码av一区二区三区电影网 | 天天干夜夜爱 | 黄色三级在线看 | 天天色天天 | 日日插日日干 | 国产黄在线免费观看 | 91精品1区2区 | 91人人网| 中文av一区二区 | h动漫中文字幕 | 精品国产一区二区三区四区在线观看 | av永久网址 | 丁香婷婷色综合亚洲电影 | 成人黄色大片在线观看 | 在线观看黄色国产 | 欧美另类tv| 国产精品欧美久久久久天天影视 | 久久激情小视频 | 免费视频黄 | 欧美 日韩 国产 中文字幕 | www.色午夜.com| www.av免费观看 | 色搞搞 | 三级黄免费看 | 五月婷婷六月丁香激情 | 成人黄色片免费 | 亚洲精品久久久久久中文传媒 | 日韩高清一区 | 国产精品淫| 免费在线| 国产精品乱码久久 | 爱情影院aqdy鲁丝片二区 | 久久五月天婷婷 | 国产婷婷久久 | 国产 中文 日韩 欧美 | 久久在线电影 | 免费看久久 | 午夜123| 亚洲欧美色婷婷 | 免费看v片 | 探花视频在线观看+在线播放 | 久久九九影视 | 免费在线播放黄色 | 中文久草 | 亚洲第一久久久 | 天天干天天碰 | 欧美色久| 香蕉久久久久久av成人 | 久久久久久久久久影视 | 一区二区三区四区免费视频 | 2018精品视频 | 人人爽人人爽人人爽人人爽 | 久久久久久99精品 | 亚洲精品午夜久久久久久久久久久 | 国产精品女视频 | 手机在线小视频 | 久久久999精品视频 国产美女免费观看 | 国产品久精国精产拍 | av一区二区三区在线 | 国产97碰免费视频 | 久久成人精品电影 | 中文字幕一区二区三区视频 | 91av网站在线观看 | 国产美女视频免费 | 精品在线小视频 | 天天干天天操天天射 | 欧美先锋影音 | 特黄特色特刺激视频免费播放 | 亚洲一区二区三区毛片 | 97综合网 | 17videosex性欧美 | 国产精品一区二区三区在线免费观看 | 久久久久久国产精品免费 | 中文字幕在线看片 | 高清日韩一区二区 | 亚洲一区日韩精品 | 欧美日韩精品影院 | 99热亚洲精品 | 欧美性生活大片 | 精品欧美一区二区三区久久久 | 欧美性极品xxxx做受 | 欧美激情精品 | 五月婷婷av在线 | 四虎永久免费在线观看 | 国产一区二区三区黄 | 亚洲精品国产精品国自产 | 免费在线观看黄 | 中文字幕在线视频一区二区 | 黄污视频网站 | va视频在线观看 | 高清美女视频 | 成人免费观看视频大全 | 日日操日日 | 久草网站在线 | 国产原创91 | 超碰在线94 | 日韩午夜高清 | 国产一区二区不卡视频 | 久久色在线观看 | 91麻豆精品国产午夜天堂 | 久久电影色| 精品久久1 | 欧美大jb| 午夜免费福利片 | 久久国产精品99久久人人澡 | 四虎8848免费高清在线观看 | 操处女逼 | 亚洲a在线观看 | 天堂av高清 | 免费手机黄色网址 | 国产精品久久久久影视 | 天天操夜夜拍 | 国产精品久久久久久久久蜜臀 | 精品久久久久一区二区国产 | 狠狠狠的干| 92精品国产成人观看免费 | 五月天伊人 | 久草视频在 | 欧美激情精品久久久 | 亚洲性xxxx | 天堂av在线7 | 2019中文在线观看 | 波多野结衣在线中文字幕 | av免费播放 | 特级毛片网站 | 婷婷日韩| 国产精品99久久久精品 | 日韩两性视频 | 国内视频在线 | 中文字幕免 | 欧美日韩天堂 | 成人精品一区二区三区电影免费 | 精品一区二区免费在线观看 | 国产精品va视频 | 亚洲在线不卡 | 中文字幕在线影院 | 在线观看黄色av | 久久99深爱久久99精品 | 免费高清av在线看 | 69精品视频在线观看 | 国产乱对白刺激视频在线观看女王 | 午夜91视频| www五月天婷婷 | 高清色免费 | 中文字幕婷婷 | 一级电影免费在线观看 | 欧美精品久久久久久久亚洲调教 | 玖玖国产精品视频 | 男女啪啪免费网站 | 国产精品一区二区三区在线免费观看 | 黄色福利视频网站 | 国产一区欧美一区 | 99久久综合国产精品二区 | 午夜av一区二区三区 | 天天做天天爱天天爽综合网 | 欧美亚洲精品一区 | 波多野结衣最新 | 国产69久久精品成人看 | 黄色大片视频网站 | 蜜臀aⅴ国产精品久久久国产 | 黄色av网站在线观看免费 | 中文字幕av在线播放 | 亚洲97在线 | 久久99国产综合精品 | 日本中文在线播放 | 亚洲精品字幕在线观看 | 国产做爰视频 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 99久久精品无免国产免费 | 五月婷在线观看 | 成 人 黄 色视频免费播放 | 97免费| 欧美精彩视频 | 亚洲女欲精品久久久久久久18 | 日韩免费一级a毛片在线播放一级 | 一区二区三区中文字幕在线 | 国产在线黄| 麻豆免费视频网站 | 四虎国产永久在线精品 | 免费黄a大片 | 国产一二区精品 | 狠狠色丁香婷婷综合基地 | 毛片网站在线看 | 香蕉视频18 | 六月丁香婷婷久久 | 国产又粗又猛又爽又黄的视频免费 | 九九电影在线 | 91精品国产一区 | 99热国内精品 | 欧美另类色图 | 成人高清在线观看 | 欧美综合久久久 | 久久不色| 婷婷丁香综合 | 欧美在线视频一区二区三区 | 93久久精品日日躁夜夜躁欧美 | 国偷自产视频一区二区久 | 国产中文字幕一区二区 | 7777精品伊人久久久大香线蕉 | 亚洲精品乱码久久久久久9色 | 在线观看福利网站 | 精品一区二三区 | 91精品在线免费观看视频 | 久久久久久久99精品免费观看 | 成人av影视在线 | 最新国产精品拍自在线播放 | 亚洲精品国产品国语在线 | 欧美激情精品久久久久久免费印度 | 久久久久久久久网站 | 欧美日韩视频免费 | 91香蕉嫩草| 国产精品九九热 | 成年人毛片在线观看 | 国产在线观看不卡 | 色婷婷国产精品 | 不卡的一区二区三区 | 免费一级毛毛片 | 天天摸天天干天天操天天射 | 99精品国产在热久久 | 女人魂免费观看 | 天天干中文字幕 | 国产一线在线 | 91亚洲国产 | 香蕉在线影院 | 91亚洲视频在线观看 | 三级免费黄 | 中文字幕一区二区三区久久 | 97在线视频免费播放 | 欧美黑人xxxx猛性大交 | 精品国产一区二区三区久久 | 久草在线视频免赞 | 国产成人免费av电影 | 探花视频免费观看高清视频 | 色五婷婷 | 国产精品永久免费在线 | 2018亚洲男人天堂 | 欧美成年网站 | 国产在线观 | 日韩一区精品 | 精品久久久久一区二区国产 | 国产麻豆精品95视频 | 日韩在线观看免费 | 日本午夜免费福利视频 | 在线性视频日韩欧美 | 国产免费影院 | 激情开心网站 | 精品一区二区久久久久久久网站 | 九热在线 | 欧美日韩三级 | 日日躁你夜夜躁你av蜜 | 欧美日本不卡视频 | 成人免费看视频 | 久久av一区二区三区亚洲 | 99热官网 | 91传媒免费在线观看 | 精品视频成人 | 国产精品午夜免费福利视频 | 97精品国产97久久久久久粉红 | 97超碰精品 | 麻豆传媒视频在线播放 | 久久露脸国产精品 | 午夜精品一区二区三区可下载 | 欧美另类亚洲 | 一本一本久久a久久精品综合妖精 | 97人人添人澡人人爽超碰动图 | h网站免费在线观看 | 欧美久久久一区二区三区 | 亚洲理论在线 | 国产一二三区av | 亚洲精品小视频 | 天天爱综合 | 在线观看成人网 | 国产精品久久久网站 | 黄色1级大片| avove黑丝 | 久草爱视频 | 狠狠色狠狠色综合日日小说 | 五月天中文字幕mv在线 | 99riav1国产精品视频 | 亚洲精品色| 国产露脸91国语对白 | 九9热这里真品2 | 成人免费在线播放视频 | 国产高清视频色在线www | 久久久免费精品视频 | 久久99亚洲精品久久久久 | 欧美激情一区不卡 | 国产精品入口麻豆 | 亚洲欧美日韩在线一区二区 | 又黄又爽又色无遮挡免费 | 国产日本在线观看 | 国产亚洲一级高清 | 五月激情片 | 中文视频一区二区 | 欧美日韩一区三区 | 欧美a在线免费观看 | 国产丝袜制服在线 | 中文字幕电影一区 | 国产精品一区免费看8c0m | 久久高清视频免费 | 国产成人精品av在线观 | 亚洲天堂网在线视频 | 一二三区av | 美女av电影 | 91视频在线播放视频 | 91大神一区二区三区 | 99久久国产免费,99久久国产免费大片 | 四虎永久免费在线观看 | 国产在线一区二区三区播放 | 超级碰碰碰视频 | 天天操天天干天天操天天干 | 国产精品视频内 | 夜夜嗨av色一区二区不卡 | 欧美综合干 | 99国产一区二区三精品乱码 | 91av在线免费 | 国产成人精品av在线 | 久久综合电影 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 九九在线视频免费观看 | 国产精品18久久久久久久久 | 国产成a人亚洲精v品在线观看 | 精品中文字幕在线播放 | 91看片淫黄大片在线播放 | 国产精品入口66mio女同 | 亚洲国产丝袜在线观看 | 一级片免费观看 | 在线 国产 亚洲 欧美 | 人人爽人人av | 黄色亚洲在线 | 免费视频一区二区 | 最近中文字幕大全 | 国产免费一区二区三区最新 | 91看片一区二区三区 | 久久精品国产亚洲精品 | 黄色小视频在线观看免费 | 久久国产高清视频 | 成人久久久精品国产乱码一区二区 | 在线观看免费版高清版 | 国产小视频福利在线 | 久久线视频 | 欧美激情综合五月色丁香小说 | 草久久av | 久久草av| 成人免费视频免费观看 |