Angular10 + Python + MongoDB CRUD application example
Hello everyone, today we will learn how to develop a web application that is a basic User Management Application using MongoDB, Angular10, Python, and Flask.GitHub repository link is provided at the end of this tutorial. You can download the source code.
More Related Topics,
Architecture
We’re gonna build the application with the following architecture:
- Angular Client sends HTTP Requests and retrieves HTTP Replications utilizing HTTPClient, consuming data on the components. Angular Router is utilized for navigating to pages.
- Python Flask exports REST APIs & interacts with MongoDB Database using PyMongo
-View all Users:
-Update User:
-View User:
We divided this tutorial into two parts.
PART 1 - Rest APIs Development using Python and Flask
PART 2 - UI development using Angular 10
PART 2 - UI development using Angular 10
PART 1 - Rest APIs Development using Python and Flask
These are APIs that Python Flask App will export:
- GET all User's : /api/v1/users
- GET User by ID : /api/v1/users/{_id}
- POST User : /api/v1/users
- PUT User : /api/v1/users/{_id}
- DELETE User : /api/v1/users/{_id}
Back end project structure
In this project, I'm using flask, flask_cors & pymongo dependencies, use the following command to install the same.
pip install flask flask_cors pymongo
database.yaml
uri: 'mongodb://localhost:27017/knf-dev'
app.py
from flask import Flask, render_template, request, jsonifyfrom pymongo import MongoClientfrom bson.objectid import ObjectIdfrom flask_cors import CORSimport yaml
app = Flask(__name__)config = yaml.load(open('database.yaml'))client = MongoClient(config['uri'])# db = client.lin_flaskdb = client['knf-dev']CORS(app)
@app.route('/')def index(): return render_template('home.html')
@app.route('/users', methods=['POST', 'GET'])def data(): # POST a data to database if request.method == 'POST': body = request.json firstName = body['firstName'] lastName = body['lastName'] emailId = body['emailId'] # db.users.insert_one({ db['users'].insert_one({ "firstName": firstName, "lastName": lastName, "emailId":emailId }) return jsonify({ 'status': 'Data is posted to MongoDB!', 'firstName': firstName, 'lastName': lastName, 'emailId':emailId }) # GET all data from database if request.method == 'GET': allData = db['users'].find() dataJson = [] for data in allData: id = data['_id'] firstName = data['firstName'] lastName = data['lastName'] emailId = data['emailId'] dataDict = { 'id': str(id), 'firstName': firstName, 'lastName': lastName, 'emailId': emailId } dataJson.append(dataDict) print(dataJson) return jsonify(dataJson)
@app.route('/users/<string:id>', methods=['GET', 'DELETE', 'PUT'])def onedata(id):
# GET a specific data by id if request.method == 'GET': data = db['users'].find_one({'_id': ObjectId(id)}) id = data['_id'] firstName = data['firstName'] lastName = data['lastName'] emailId = data['emailId'] dataDict = { 'id': str(id), 'firstName': firstName, 'lastName': lastName, 'emailId':emailId } print(dataDict) return jsonify(dataDict) # DELETE a data if request.method == 'DELETE': db['users'].delete_many({'_id': ObjectId(id)}) print('\n # Deletion successful # \n') return jsonify({'status': 'Data id: ' + id + ' is deleted!'})
# UPDATE a data by id if request.method == 'PUT': body = request.json firstName = body['firstName'] lastName = body['lastName'] emailId = body['emailId']
db['users'].update_one( {'_id': ObjectId(id)}, { "$set": { "firstName":firstName, "lastName":lastName, "emailId": emailId } } )
print('\n # Update successful # \n') return jsonify({'status': 'Data id: ' + id + ' is updated!'})
if __name__ == '__main__': app.debug = True app.run()
Run the server file. Make sure your MongoDB server is still running. Your application server will run locally at http://localhost:5000 :
$ python app.py
Console output:
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 307-094-932
PART 2 - UI development using Angular 10
Next, we are going to develop an Angular 10 web application.
Package structure - Front end
The package.json
A package.json is a JSON file that subsists at the root of a Javascript/Node project. It holds metadata pertinent to the project and is utilized for managing the project's dependencies, scripts, version, and a whole lot more.{ "name": "front-end-simple-crud", "version": "0.0.0", "scripts": { "ng": "ng", "start": "ng serve", "build": "ng build", "test": "ng test", "lint": "ng lint", "e2e": "ng e2e" }, "private": true, "dependencies": { "@angular/animations": "~10.1.2", "@angular/common": "~10.1.2", "@angular/compiler": "~10.1.2", "@angular/core": "~10.1.2", "@angular/forms": "~10.1.2", "@angular/platform-browser": "~10.1.2", "@angular/platform-browser-dynamic": "~10.1.2", "@angular/router": "~10.1.2", "bootstrap": "^4.5.3", "jquery": "^3.5.1", "rxjs": "~6.6.0", "tslib": "^2.0.0", "zone.js": "~0.10.2" }, "devDependencies": { "@angular-devkit/build-angular": "^0.1100.3", "@angular/cli": "~10.1.2", "@angular/compiler-cli": "~10.1.2", "@types/jasmine": "~3.5.0", "@types/jasminewd2": "~2.0.3", "@types/node": "^12.11.1", "codelyzer": "^6.0.0", "jasmine-core": "~3.6.0", "jasmine-spec-reporter": "~5.0.0", "karma": "~5.0.0", "karma-chrome-launcher": "~3.1.0", "karma-coverage-istanbul-reporter": "~3.0.2", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.5.0", "protractor": "~7.0.0", "ts-node": "~8.3.0", "tslint": "~6.1.0", "typescript": "~4.0.2" } }
{ "name": "front-end-simple-crud", "version": "0.0.0", "scripts": { "ng": "ng", "start": "ng serve", "build": "ng build", "test": "ng test", "lint": "ng lint", "e2e": "ng e2e" }, "private": true, "dependencies": { "@angular/animations": "~10.1.2", "@angular/common": "~10.1.2", "@angular/compiler": "~10.1.2", "@angular/core": "~10.1.2", "@angular/forms": "~10.1.2", "@angular/platform-browser": "~10.1.2", "@angular/platform-browser-dynamic": "~10.1.2", "@angular/router": "~10.1.2", "bootstrap": "^4.5.3", "jquery": "^3.5.1", "rxjs": "~6.6.0", "tslib": "^2.0.0", "zone.js": "~0.10.2" }, "devDependencies": { "@angular-devkit/build-angular": "^0.1100.3", "@angular/cli": "~10.1.2", "@angular/compiler-cli": "~10.1.2", "@types/jasmine": "~3.5.0", "@types/jasminewd2": "~2.0.3", "@types/node": "^12.11.1", "codelyzer": "^6.0.0", "jasmine-core": "~3.6.0", "jasmine-spec-reporter": "~5.0.0", "karma": "~5.0.0", "karma-chrome-launcher": "~3.1.0", "karma-coverage-istanbul-reporter": "~3.0.2", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.5.0", "protractor": "~7.0.0", "ts-node": "~8.3.0", "tslint": "~6.1.0", "typescript": "~4.0.2" } }
The User.ts file(User Model)
Path - src/app/user.ts Before defining the UserListComponent, let’s define a User class for working with users. create a new file user.ts inside src/app folder and add the following code to it -export class User { _id: string; firstName: string; lastName: string; emailId: string; active: boolean;
}
Path - src/app/user.ts
Before defining the UserListComponent, let’s define a User class for working with users. create a new file user.ts inside src/app folder and add the following code to it -
export class User { _id: string; firstName: string; lastName: string; emailId: string; active: boolean;
}
Create User List Template and Component
User List Component
Path - src/app/user-list/user-list.component.tsLet's create the UserListComponent component which will be used to display a list of users, create a new user, and delete a user.import { UserDetailsComponent } from '../user-details/user-details.component';import { Observable } from "rxjs";import { UserService } from "../user.service";import { User } from "../user";import { Component, OnInit } from "@angular/core";import { Router } from '@angular/router';
@Component({ selector: "app-user-list", templateUrl: "./user-list.component.html", styleUrls: ["./user-list.component.css"]})export class UserListComponent implements OnInit { users: Observable<User[]>;
constructor(private userService: UserService, private router: Router) { }
ngOnInit() { this.reloadData(); }
reloadData() { this.users = this.userService.getUsersList(); }
deleteUser(_id: string) { this.userService.deleteUser(_id) .subscribe( data => { console.log(data); this.reloadData(); }, error => console.log(error)); } updateUser(id: string) { this.router.navigate(['update', id]); } userDetails(_id: string) { this.router.navigate(['details', _id]); }}
Path - src/app/user-list/user-list.component.ts
Let's create the UserListComponent component which will be used to display a list of users, create a new user, and delete a user.
import { UserDetailsComponent } from '../user-details/user-details.component';import { Observable } from "rxjs";import { UserService } from "../user.service";import { User } from "../user";import { Component, OnInit } from "@angular/core";import { Router } from '@angular/router';
@Component({ selector: "app-user-list", templateUrl: "./user-list.component.html", styleUrls: ["./user-list.component.css"]})export class UserListComponent implements OnInit { users: Observable<User[]>;
constructor(private userService: UserService, private router: Router) { }
ngOnInit() { this.reloadData(); }
reloadData() { this.users = this.userService.getUsersList(); }
deleteUser(_id: string) { this.userService.deleteUser(_id) .subscribe( data => { console.log(data); this.reloadData(); }, error => console.log(error)); } updateUser(id: string) { this.router.navigate(['update', id]); } userDetails(_id: string) { this.router.navigate(['details', _id]); }}
User List Template
Path - src/app/user-list/user-list.component.htmlAdd user-list.component.html file with the following code to it -<div class="panel panel-primary"> <div class="panel-heading"> <h2>User List</h2> </div> <div class="panel-body"> <table class="table table-striped"> <thead> <tr> <th>Firstname</th> <th>Lastname</th> <th>Email</th> <th>Actions</th> </tr> </thead> <tbody> <tr *ngFor="let user of users | async"> <td>{{user.firstName}}</td> <td>{{user.lastName}}</td> <td>{{user.emailId}}</td> <td> <button (click)="updateUser(user.id)" class="btn btn-warning" style="margin-left: 10px">Update</button> <button (click)="deleteUser(user.id)" class="btn btn-danger" style="margin-left: 10px">Delete</button> <button (click)="userDetails(user.id)" class="btn btn-info" style="margin-left: 10px">Details</button> </td> </tr> </tbody> </table> </div> </div>
Path - src/app/user-list/user-list.component.html
Add user-list.component.html file with the following code to it -
<div class="panel panel-primary"> <div class="panel-heading"> <h2>User List</h2> </div> <div class="panel-body"> <table class="table table-striped"> <thead> <tr> <th>Firstname</th> <th>Lastname</th> <th>Email</th> <th>Actions</th> </tr> </thead> <tbody> <tr *ngFor="let user of users | async"> <td>{{user.firstName}}</td> <td>{{user.lastName}}</td> <td>{{user.emailId}}</td> <td> <button (click)="updateUser(user.id)" class="btn btn-warning" style="margin-left: 10px">Update</button> <button (click)="deleteUser(user.id)" class="btn btn-danger" style="margin-left: 10px">Delete</button> <button (click)="userDetails(user.id)" class="btn btn-info" style="margin-left: 10px">Details</button> </td> </tr> </tbody> </table> </div> </div>
Create Add User Template and Component
Add User Component
Path - src/app/create-user/create-user.component.tsCreateUserComponent is used to create and handle new user form data. Add the following code to it -import { UserService } from '../user.service';import { User } from '../user';import { Component, OnInit } from '@angular/core';import { Router } from '@angular/router';
@Component({ selector: 'app-create-user', templateUrl: './create-user.component.html', styleUrls: ['./create-user.component.css']})export class CreateUserComponent implements OnInit {
user: User = new User(); submitted = false;
constructor(private userService: UserService, private router: Router) { }
ngOnInit() { }
newUser(): void { this.submitted = false; this.user = new User(); }
save() { this.userService .createUser(this.user).subscribe(data => { console.log(data) this.user = new User(); this.gotoList(); }, error => console.log(error)); }
onSubmit() { this.submitted = true; this.save(); }
gotoList() { this.router.navigate(['/users']); }}
Path - src/app/create-user/create-user.component.ts
CreateUserComponent is used to create and handle new user form data. Add the following code to it -
import { UserService } from '../user.service';import { User } from '../user';import { Component, OnInit } from '@angular/core';import { Router } from '@angular/router';
@Component({ selector: 'app-create-user', templateUrl: './create-user.component.html', styleUrls: ['./create-user.component.css']})export class CreateUserComponent implements OnInit {
user: User = new User(); submitted = false;
constructor(private userService: UserService, private router: Router) { }
ngOnInit() { }
newUser(): void { this.submitted = false; this.user = new User(); }
save() { this.userService .createUser(this.user).subscribe(data => { console.log(data) this.user = new User(); this.gotoList(); }, error => console.log(error)); }
onSubmit() { this.submitted = true; this.save(); }
gotoList() { this.router.navigate(['/users']); }}
Create a User Template
Path - src/app/create-user/create-user.component.html The create-user.component.html shows the add using HTML form. Add the following code to it -<h3>Create User</h3><div [hidden]="submitted" style="width: 400px;"> <form (ngSubmit)="onSubmit()"> <div class="form-group"> <label for="name">First Name</label> <input type="text" class="form-control" id="firstName" required [(ngModel)]="user.firstName" name="firstName"> </div>
<div class="form-group"> <label for="name">Last Name</label> <input type="text" class="form-control" id="lastName" required [(ngModel)]="user.lastName" name="lastName"> </div>
<div class="form-group"> <label for="name">Email Id</label> <input type="text" class="form-control" id="emailId" required [(ngModel)]="user.emailId" name="emailId"> </div>
<button type="submit" class="btn btn-danger">Submit</button> </form></div>
<div [hidden]="!submitted"> <h4>Successfully submitted!</h4></div>
Path - src/app/create-user/create-user.component.html
The create-user.component.html shows the add using HTML form. Add the following code to it -
<h3>Create User</h3><div [hidden]="submitted" style="width: 400px;"> <form (ngSubmit)="onSubmit()"> <div class="form-group"> <label for="name">First Name</label> <input type="text" class="form-control" id="firstName" required [(ngModel)]="user.firstName" name="firstName"> </div>
<div class="form-group"> <label for="name">Last Name</label> <input type="text" class="form-control" id="lastName" required [(ngModel)]="user.lastName" name="lastName"> </div>
<div class="form-group"> <label for="name">Email Id</label> <input type="text" class="form-control" id="emailId" required [(ngModel)]="user.emailId" name="emailId"> </div>
<button type="submit" class="btn btn-danger">Submit</button> </form></div>
<div [hidden]="!submitted"> <h4>Successfully submitted!</h4></div>
Update User Template and Component
Update User Component
Path - src/app/update-user/update-user.component.ts UpdateUserComponent is used to update an existing user.import { Component, OnInit } from '@angular/core';import { User } from '../user';import { ActivatedRoute, Router } from '@angular/router';import { UserService } from '../user.service';
@Component({ selector: 'app-update-user', templateUrl: './update-user.component.html', styleUrls: ['./update-user.component.css']})export class UpdateUserComponent implements OnInit {
_id: string; user: User;
constructor(private route: ActivatedRoute, private router: Router, private userService: UserService) { }
ngOnInit() { this.user = new User();
this._id = this.route.snapshot.params['_id'];
this.userService.getUser(this._id) .subscribe(data => { this.user = data; }, error => console.log(error)); }
updateUser() { this.userService.updateUser(this._id, this.user) .subscribe(data => { console.log(data); this.user = new User(); this.gotoList(); }, error => console.log(error)); }
onSubmit() { this.updateUser(); }
gotoList() { this.router.navigate(['/users']); }}
Path - src/app/update-user/update-user.component.ts
UpdateUserComponent is used to update an existing user.
import { Component, OnInit } from '@angular/core';import { User } from '../user';import { ActivatedRoute, Router } from '@angular/router';import { UserService } from '../user.service';
@Component({ selector: 'app-update-user', templateUrl: './update-user.component.html', styleUrls: ['./update-user.component.css']})export class UpdateUserComponent implements OnInit {
_id: string; user: User;
constructor(private route: ActivatedRoute, private router: Router, private userService: UserService) { }
ngOnInit() { this.user = new User();
this._id = this.route.snapshot.params['_id'];
this.userService.getUser(this._id) .subscribe(data => { this.user = data; }, error => console.log(error)); }
updateUser() { this.userService.updateUser(this._id, this.user) .subscribe(data => { console.log(data); this.user = new User(); this.gotoList(); }, error => console.log(error)); }
onSubmit() { this.updateUser(); }
gotoList() { this.router.navigate(['/users']); }}
Update User Template
Path - src/app/update-user/update-user.component.html The update-user.component.html shows the updated user HTML form. Add the following code to this file -<h3>Update User</h3><div style="width: 500px;"> <form (ngSubmit)="onSubmit()"> <div class="form-group"> <label for="name">First Name</label> <input type="text" class="form-control" id="firstName" required [(ngModel)]="user.firstName" name="firstName"> </div>
<div class="form-group"> <label for="name">Last Name</label> <input type="text" class="form-control" id="lastName" required [(ngModel)]="user.lastName" name="lastName"> </div>
<div class="form-group"> <label for="name">Email Id</label> <input type="text" class="form-control" id="emailId" required [(ngModel)]="user.emailId" name="emailId"> </div>
<button type="submit" class="btn btn-success">Submit</button> </form></div>
Path - src/app/update-user/update-user.component.html
The update-user.component.html shows the updated user HTML form. Add the following code to this file -
<h3>Update User</h3><div style="width: 500px;"> <form (ngSubmit)="onSubmit()"> <div class="form-group"> <label for="name">First Name</label> <input type="text" class="form-control" id="firstName" required [(ngModel)]="user.firstName" name="firstName"> </div>
<div class="form-group"> <label for="name">Last Name</label> <input type="text" class="form-control" id="lastName" required [(ngModel)]="user.lastName" name="lastName"> </div>
<div class="form-group"> <label for="name">Email Id</label> <input type="text" class="form-control" id="emailId" required [(ngModel)]="user.emailId" name="emailId"> </div>
<button type="submit" class="btn btn-success">Submit</button> </form></div>
Create a View User Details Template and Component
User Details Component
Path - src/app/user-details/user-details.component.ts The UserDetailsComponent component is used to display a particular user detail. Add the following code to it -import { User } from '../user';import { Component, OnInit, Input } from '@angular/core';import { UserService } from '../user.service';import { Router, ActivatedRoute } from '@angular/router';
@Component({ selector: 'app-user-details', templateUrl: './user-details.component.html', styleUrls: ['./user-details.component.css']})export class UserDetailsComponent implements OnInit {
_id: string; user: User;
constructor(private route: ActivatedRoute,private router: Router, private userService: UserService) { }
ngOnInit() { this.user = new User();
this._id = this.route.snapshot.params['_id']; console.log("gh"+this._id); this.userService.getUser(this._id) .subscribe(data => { console.log(data) this.user = data; }, error => console.log(error)); }
list(){ this.router.navigate(['users']); }}
Path - src/app/user-details/user-details.component.ts
The UserDetailsComponent component is used to display a particular user detail. Add the following code to it -
import { User } from '../user';import { Component, OnInit, Input } from '@angular/core';import { UserService } from '../user.service';import { Router, ActivatedRoute } from '@angular/router';
@Component({ selector: 'app-user-details', templateUrl: './user-details.component.html', styleUrls: ['./user-details.component.css']})export class UserDetailsComponent implements OnInit {
_id: string; user: User;
constructor(private route: ActivatedRoute,private router: Router, private userService: UserService) { }
ngOnInit() { this.user = new User();
this._id = this.route.snapshot.params['_id']; console.log("gh"+this._id); this.userService.getUser(this._id) .subscribe(data => { console.log(data) this.user = data; }, error => console.log(error)); }
list(){ this.router.navigate(['users']); }}
User Details Template
Path - src/app/user-details/user-details.component.html The user-details.component.html displays a particular user detail. Add the following code to it -<h2>User Details</h2><hr /><div *ngIf="user"> <div> <label><b>First Name: </b></label> {{user.firstName}} </div> <div> <label><b>Last Name: </b></label> {{user.lastName}} </div> <div> <label><b>Email Id: </b></label> {{user.emailId}} </div></div>
<br><br><button (click)="list()" class="btn btn-primary">User List</button><br>
Path - src/app/user-details/user-details.component.html
The user-details.component.html displays a particular user detail. Add the following code to it -
<h2>User Details</h2><hr /><div *ngIf="user"> <div> <label><b>First Name: </b></label> {{user.firstName}} </div> <div> <label><b>Last Name: </b></label> {{user.lastName}} </div> <div> <label><b>Email Id: </b></label> {{user.emailId}} </div></div>
<br><br><button (click)="list()" class="btn btn-primary">User List</button><br>
User Service
Path - src/app/user.service.ts The UserService will be used to get the data from the backend by calling APIs. Update the user.service.ts file inside src/app directory with the following code to it -import { Injectable } from '@angular/core';import { HttpClient } from '@angular/common/http';import { Observable } from 'rxjs';
@Injectable({ providedIn: 'root'})export class UserService {
private baseUrl = 'http://localhost:8000/api/v1/users';
constructor(private http: HttpClient) { }
getUser(_id: string): Observable<any> { return this.http.get(`${this.baseUrl}/${_id}`); }
createUser(user: Object): Observable<Object> { return this.http.post(`${this.baseUrl}`, user); }
updateUser(_id: string, value: any): Observable<Object> { return this.http.put(`${this.baseUrl}/${_id}`, value); }
deleteUser(_id: string): Observable<any> { return this.http.delete(`${this.baseUrl}/${_id}`, { responseType: 'text' }); }
getUsersList(): Observable<any> { return this.http.get(`${this.baseUrl}`); }}
Path - src/app/user.service.ts
The UserService will be used to get the data from the backend by calling APIs. Update the user.service.ts file inside src/app directory with the following code to it -
import { Injectable } from '@angular/core';import { HttpClient } from '@angular/common/http';import { Observable } from 'rxjs';
@Injectable({ providedIn: 'root'})export class UserService {
private baseUrl = 'http://localhost:8000/api/v1/users';
constructor(private http: HttpClient) { }
getUser(_id: string): Observable<any> { return this.http.get(`${this.baseUrl}/${_id}`); }
createUser(user: Object): Observable<Object> { return this.http.post(`${this.baseUrl}`, user); }
updateUser(_id: string, value: any): Observable<Object> { return this.http.put(`${this.baseUrl}/${_id}`, value); }
deleteUser(_id: string): Observable<any> { return this.http.delete(`${this.baseUrl}/${_id}`, { responseType: 'text' }); }
getUsersList(): Observable<any> { return this.http.get(`${this.baseUrl}`); }}
App Routing Module
Path: /src/app/app.routing.module.ts Routing for the Angular app is configured as an array of Routes, each component is mapped to a path so the Angular Router knows which component to display based on the URL in the browser address bar.import { UserDetailsComponent } from './user-details/user-details.component';import { CreateUserComponent } from './create-user/create-user.component';import { NgModule } from '@angular/core';import { Routes, RouterModule } from '@angular/router';import {UserListComponent } from './user-list/user-list.component';import { UpdateUserComponent } from './update-user/update-user.component';
const routes: Routes = [ { path: '', redirectTo: 'user', pathMatch: 'full' }, { path: 'users', component: UserListComponent }, { path: 'add', component: CreateUserComponent }, { path: 'update/:_id', component: UpdateUserComponent }, { path: 'details/:_id', component: UserDetailsComponent },];
@NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule]})export class AppRoutingModule { }
Path: /src/app/app.routing.module.ts
Routing for the Angular app is configured as an array of Routes, each component is mapped to a path so the Angular Router knows which component to display based on the URL in the browser address bar.
import { UserDetailsComponent } from './user-details/user-details.component';import { CreateUserComponent } from './create-user/create-user.component';import { NgModule } from '@angular/core';import { Routes, RouterModule } from '@angular/router';import {UserListComponent } from './user-list/user-list.component';import { UpdateUserComponent } from './update-user/update-user.component';
const routes: Routes = [ { path: '', redirectTo: 'user', pathMatch: 'full' }, { path: 'users', component: UserListComponent }, { path: 'add', component: CreateUserComponent }, { path: 'update/:_id', component: UpdateUserComponent }, { path: 'details/:_id', component: UserDetailsComponent },];
@NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule]})export class AppRoutingModule { }
App Component
Path: /src/app/app.component.ts The app component is the root component of the application, it defines the root tag of the app as with the selector property of the @Component decorator.import { Component } from '@angular/core';
@Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css']})export class AppComponent { title = 'Python + Angular 10 + Mongo DB CRUD ';}
Path: /src/app/app.component.ts
The app component is the root component of the application, it defines the root tag of the app as with the selector property of the @Component decorator.
import { Component } from '@angular/core';
@Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css']})export class AppComponent { title = 'Python + Angular 10 + Mongo DB CRUD ';}
App Component Template
Path: /src/app/app.component.html Defines the HTML template associated with the root AppComponent.<nav class="navbar navbar-expand-sm bg-success navbar-dark"> <!-- Links --> <ul class="navbar-nav"> <li class="nav-item"> <a routerLink="users" class="nav-link" routerLinkActive="active"> User List</a> </li> <li class="nav-item"> <a routerLink="add" class="nav-link" routerLinkActive="active"> Add User</a> </li> </ul> </nav> <div class="container"> <br> <h2 style="text-align: center;">{{title}}</h2> <hr> <div class="card"> <div class="card-body"> <router-outlet></router-outlet> </div> </div> </div> <footer class="footer"> <div class="container"> <span>All Rights Reserved 2020 @Knowledge Factory</span> </div> </footer>
Path: /src/app/app.component.html
Defines the HTML template associated with the root AppComponent.
<nav class="navbar navbar-expand-sm bg-success navbar-dark"> <!-- Links --> <ul class="navbar-nav"> <li class="nav-item"> <a routerLink="users" class="nav-link" routerLinkActive="active"> User List</a> </li> <li class="nav-item"> <a routerLink="add" class="nav-link" routerLinkActive="active"> Add User</a> </li> </ul> </nav> <div class="container"> <br> <h2 style="text-align: center;">{{title}}</h2> <hr> <div class="card"> <div class="card-body"> <router-outlet></router-outlet> </div> </div> </div> <footer class="footer"> <div class="container"> <span>All Rights Reserved 2020 @Knowledge Factory</span> </div> </footer>
App Module
Path: /src/app/app.module.ts Defines the root module, named AppModule, that tells Angular how to assemble the application. Initially declares only the AppComponent. import { BrowserModule } from '@angular/platform-browser';import { NgModule } from '@angular/core';import { FormsModule } from '@angular/forms';import { AppRoutingModule } from './app-routing.module';import { AppComponent } from './app.component';import { CreateUserComponent } from './create-user/create-user.component';import { UserDetailsComponent }<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Angular10CRUD</title>
<base href="/">
<meta name="viewport" content="width=device-width,
initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
<app-root></app-root>
</body>
</html> from './user-details/user-details.component';import { UserListComponent } from './user-list/user-list.component';import { UpdateUserComponent } from './update-user/update-user.component';import { HttpClientModule } from '@angular/common/http';@NgModule({ declarations: [ AppComponent, CreateUserComponent, UserDetailsComponent, UserListComponent, UpdateUserComponent ], imports: [ BrowserModule, AppRoutingModule, FormsModule, HttpClientModule ], providers: [], bootstrap: [AppComponent]})export class AppModule { }
Path: /src/app/app.module.ts
Defines the root module, named AppModule, that tells Angular how to assemble the application. Initially declares only the AppComponent.
import { BrowserModule } from '@angular/platform-browser';import { NgModule } from '@angular/core';import { FormsModule } from '@angular/forms';import { AppRoutingModule } from './app-routing.module';import { AppComponent } from './app.component';import { CreateUserComponent } from './create-user/create-user.component';import { UserDetailsComponent }<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Angular10CRUD</title>
<base href="/">
<meta name="viewport" content="width=device-width,
initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
<app-root></app-root>
</body>
</html> from './user-details/user-details.component';import { UserListComponent } from './user-list/user-list.component';import { UpdateUserComponent } from './update-user/update-user.component';import { HttpClientModule } from '@angular/common/http';@NgModule({ declarations: [ AppComponent, CreateUserComponent, UserDetailsComponent, UserListComponent, UpdateUserComponent ], imports: [ BrowserModule, AppRoutingModule, FormsModule, HttpClientModule ], providers: [], bootstrap: [AppComponent]})export class AppModule { }
index.html
Path: /src/index.html The main index.html file is the initial page loaded by the browser that kicks everything off.<!doctype html><html lang="en"><head> <meta charset="utf-8"> <title>Angular10CRUD</title> <base href="/"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="icon" type="image/x-icon" href="favicon.ico"></head><body> <app-root></app-root></body></html>
Path: /src/index.html
The main index.html file is the initial page loaded by the browser that kicks everything off.
<!doctype html><html lang="en"><head> <meta charset="utf-8"> <title>Angular10CRUD</title> <base href="/"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="icon" type="image/x-icon" href="favicon.ico"></head><body> <app-root></app-root></body></html>
Main File
Path: /src/main.ts The main file is the entry point used by angular to launch and bootstrap the application.import { enableProdMode } from '@angular/core';import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';import { environment } from './environments/environment';
if (environment.production) { enableProdMode();}
platformBrowserDynamic().bootstrapModule(AppModule) .catch(err => console.error(err));
Path: /src/main.ts
The main file is the entry point used by angular to launch and bootstrap the application.
import { enableProdMode } from '@angular/core';import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';import { environment } from './environments/environment';
if (environment.production) { enableProdMode();}
platformBrowserDynamic().bootstrapModule(AppModule) .catch(err => console.error(err));
Download the dependencies using the following command
npm install
npm install