From 363897a0951713ab35d4a947ec845a7e39c3e2aa Mon Sep 17 00:00:00 2001 From: yikth Date: Sat, 5 Sep 2020 08:04:24 +0800 Subject: [PATCH] consolidate notes --- FintechSG-FrontendBackend.JPG | Bin 0 -> 97264 bytes README.md | 215 +++++++++------------------------- fullstack.md | 158 +++++++++++++++++++++++++ homepage.JPG | Bin 0 -> 33428 bytes nusmoney.md | 193 ++++++++++++++++++++++++++++++ 5 files changed, 408 insertions(+), 158 deletions(-) create mode 100644 FintechSG-FrontendBackend.JPG create mode 100644 fullstack.md create mode 100644 homepage.JPG create mode 100644 nusmoney.md diff --git a/FintechSG-FrontendBackend.JPG b/FintechSG-FrontendBackend.JPG new file mode 100644 index 0000000000000000000000000000000000000000..de3b3e23922126f9b8fb8c2e7230131a0997215c GIT binary patch literal 97264 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 9fdc22e..ebb7164 100644 --- a/README.md +++ b/README.md @@ -1,158 +1,57 @@ -# Prepare Full Stack App - -## Pre Requisite -* Install React : `sudo npm -g install create-react-app` -* Install Express : `sudo npm install -g express-generator` -* Install CORS : `sudo npm install -g save cors` - -## Procedure -1. Create Project Folder. Eg. fullstackapp -2. Navigate to the folder -3. Create / prepare Backend project - ``` - $ express --view=pug backend - $ cd backend - $ npm install - ``` -4. Create Frontend - ``` - $ npx create-react-app frontend - ``` - -## Check Backend function -1. Navigate to backend folder -2. Start the server - ``` - $ npm start - ``` -3. Use browser to navigate [http://localhost:3000](http://localhost:3000) -4. The page should display "Express", "Welcome to express" -5. Press ctrl+c to stop the backend - - -## Check the frontend function -1. Navigate to frontend folder -2. Start the server - ``` - $ npm start - ``` -3. Open browser and navigate to [http://localhost:3001](http://localhost:3001) -4. The page should display "React welcome page with react logo" -5. Press `ctrl+c` to stop the frontend - - -## Editing Backend in VScode -1. Launch VCcode from project folder `fullstack` -2. Navigate to backend -3. Open the file `/bin/www` -4. Change server port to 7000 - ``` - var port = normalizePort(process.env.PORT || '3000'); - app.set('port', port); - ``` -5. Goto `routes` folder -6. Create a new file called `mypage.js` - ``` - var express = require('express'); // import - var router = express.Router(); - - var mystr = "I am sending this DATA from backend to Frontend"; - - /* GET my page */ - router.get('/', function(req, res, next) { - res.send(mystr); - }); - - module.exports = router; - ``` -7. Open app.js and `add this line` - ``` - var createError = require('http-errors'); - var express = require('express'); - var path = require('path'); - var cookieParser = require('cookie-parser'); - var logger = require('morgan'); - var cors = require("cors"); // add this line - - var indexRouter = require('./routes/index'); - var usersRouter = require('./routes/users'); - var mypageRouter = require('./routes/mypage'); // add this line - - var app = express(); - - // view engine setup - app.set('views', path.join(__dirname, 'views')); - app.set('view engine', 'pug'); - - app.use(logger('dev')); - app.use(express.json()); - app.use(express.urlencoded({ extended: false })); - app.use(cookieParser()); - app.use(express.static(path.join(__dirname, 'public'))); - - app.use(cors()); // add this line - app.use('/', indexRouter); - app.use('/users', usersRouter); - app.use('/mypage', mypageRouter); // add this line - - // catch 404 and forward to error handler - app.use(function(req, res, next) { - next(createError(404)); - }); - ``` -8. Install cors locally. Navigate to `backend` folder - ``` - $ sudo npm install cors - ``` -9. Open browser and navigate to [http://localhost:7000/mypage](http://localhost:7000/mypage). You should see - ``` - I am sending this DATA from backend to Frontend - ``` - -## Editing Frontend in VSCode -1. Navigate to frontend -2. Open `/src/App.js`. Delete everything and copy the following - ``` - import React from 'react'; - import logo from './logo.svg'; - import './App.css'; - - class App extends React.Component { - constructor(props){ - super(props); - this.state = { serverResponse: "" }; - } - - callAPIServer() { - fetch("http://localhost:7000/mypage") - .then(res => res.text()) - .then(res => this.setState({ serverResponse: res })) - .catch(err => err); - } - - componentDidMount() { // react lifecycle method componentDidMount() - // will execute the callAPIServer() methods afteer the component mounts - this.callAPIServer(); - } - - render() { - return ( -
-
- logo -

Welcome to FintechSG React Course

-

{this.state.serverResponse}

-
-
- ) - } - } - - export default App; - ``` -9. Open browser and navigate to [http://localhost:3000](http://localhost:3000). You should see - ``` - Welcome to FintechSG React Course - - I am sending this DATA from backend to Frontend - ``` \ No newline at end of file +# Frontend - Backend + +## Server Client Project + +### Prerequisite + +* Run cmd in administrator mode +* npm - node package manager +* Install `React` for frontend +``` +$ npm install -g create-react-app +``` +* Install `express` for backend +``` +$ npm install -g express-generator +``` +* Install `cors` ??for backend +``` +$ npm install -g save cors +``` + + +## Prepare Client (Frontend) + +* run npx (node package execute) from command line +``` +$ npx create-react-app frontend +``` +* navigate to `frontend` folder. start +``` +$ cd frontend +$ npm start +``` + +## Prepare Server (Backend) + +* run from command line +``` +$ express --view=pug backend +$ cd backend + +// optional : something global install not working +$ npm install cors + +// install dependencies defined in package.json +$ npm install +``` +* navigate to `backend` folder. start +``` +$ cd backend +$ npm start +``` + +### Example + +1. [NUSMoney](nusmoney.md) frontend +2. [Fullstack](fullstack.md) process diff --git a/fullstack.md b/fullstack.md new file mode 100644 index 0000000..9fdc22e --- /dev/null +++ b/fullstack.md @@ -0,0 +1,158 @@ +# Prepare Full Stack App + +## Pre Requisite +* Install React : `sudo npm -g install create-react-app` +* Install Express : `sudo npm install -g express-generator` +* Install CORS : `sudo npm install -g save cors` + +## Procedure +1. Create Project Folder. Eg. fullstackapp +2. Navigate to the folder +3. Create / prepare Backend project + ``` + $ express --view=pug backend + $ cd backend + $ npm install + ``` +4. Create Frontend + ``` + $ npx create-react-app frontend + ``` + +## Check Backend function +1. Navigate to backend folder +2. Start the server + ``` + $ npm start + ``` +3. Use browser to navigate [http://localhost:3000](http://localhost:3000) +4. The page should display "Express", "Welcome to express" +5. Press ctrl+c to stop the backend + + +## Check the frontend function +1. Navigate to frontend folder +2. Start the server + ``` + $ npm start + ``` +3. Open browser and navigate to [http://localhost:3001](http://localhost:3001) +4. The page should display "React welcome page with react logo" +5. Press `ctrl+c` to stop the frontend + + +## Editing Backend in VScode +1. Launch VCcode from project folder `fullstack` +2. Navigate to backend +3. Open the file `/bin/www` +4. Change server port to 7000 + ``` + var port = normalizePort(process.env.PORT || '3000'); + app.set('port', port); + ``` +5. Goto `routes` folder +6. Create a new file called `mypage.js` + ``` + var express = require('express'); // import + var router = express.Router(); + + var mystr = "I am sending this DATA from backend to Frontend"; + + /* GET my page */ + router.get('/', function(req, res, next) { + res.send(mystr); + }); + + module.exports = router; + ``` +7. Open app.js and `add this line` + ``` + var createError = require('http-errors'); + var express = require('express'); + var path = require('path'); + var cookieParser = require('cookie-parser'); + var logger = require('morgan'); + var cors = require("cors"); // add this line + + var indexRouter = require('./routes/index'); + var usersRouter = require('./routes/users'); + var mypageRouter = require('./routes/mypage'); // add this line + + var app = express(); + + // view engine setup + app.set('views', path.join(__dirname, 'views')); + app.set('view engine', 'pug'); + + app.use(logger('dev')); + app.use(express.json()); + app.use(express.urlencoded({ extended: false })); + app.use(cookieParser()); + app.use(express.static(path.join(__dirname, 'public'))); + + app.use(cors()); // add this line + app.use('/', indexRouter); + app.use('/users', usersRouter); + app.use('/mypage', mypageRouter); // add this line + + // catch 404 and forward to error handler + app.use(function(req, res, next) { + next(createError(404)); + }); + ``` +8. Install cors locally. Navigate to `backend` folder + ``` + $ sudo npm install cors + ``` +9. Open browser and navigate to [http://localhost:7000/mypage](http://localhost:7000/mypage). You should see + ``` + I am sending this DATA from backend to Frontend + ``` + +## Editing Frontend in VSCode +1. Navigate to frontend +2. Open `/src/App.js`. Delete everything and copy the following + ``` + import React from 'react'; + import logo from './logo.svg'; + import './App.css'; + + class App extends React.Component { + constructor(props){ + super(props); + this.state = { serverResponse: "" }; + } + + callAPIServer() { + fetch("http://localhost:7000/mypage") + .then(res => res.text()) + .then(res => this.setState({ serverResponse: res })) + .catch(err => err); + } + + componentDidMount() { // react lifecycle method componentDidMount() + // will execute the callAPIServer() methods afteer the component mounts + this.callAPIServer(); + } + + render() { + return ( +
+
+ logo +

Welcome to FintechSG React Course

+

{this.state.serverResponse}

+
+
+ ) + } + } + + export default App; + ``` +9. Open browser and navigate to [http://localhost:3000](http://localhost:3000). You should see + ``` + Welcome to FintechSG React Course + + I am sending this DATA from backend to Frontend + ``` \ No newline at end of file diff --git a/homepage.JPG b/homepage.JPG new file mode 100644 index 0000000000000000000000000000000000000000..289b87fd61b51e682d30f600a0d277f6970e9162 GIT binary patch literal 33428 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 XqR`x;9MrR~{^=_0|9~p4usi-6+o2ia literal 0 HcmV?d00001 diff --git a/nusmoney.md b/nusmoney.md new file mode 100644 index 0000000..0591d0a --- /dev/null +++ b/nusmoney.md @@ -0,0 +1,193 @@ +# NUSMoney Frontend + +1. Create react project + ``` + npx create-react-app nusmoney + ``` +2. Replace `App.js, App.css,brand-logo.png` reference code +* App.js + ```javascript + import React from "react"; + import logo from "./brand-logo.png" + import "./App.css"; + + class App extends React.Component { + constructor(props) { + super(props); + this.state = { + newBank: "", + bankList: [] + }; + } + + addBank(bankName) { + if (bankName !== "") { + const newBank = { + id: Date.now(), + value: bankName, + isDone: false + }; + const bankList = [...this.state.bankList]; //get the Banklist from state + bankList.push(newBank); //add new back to the list + + this.setState({ //update the state + bankList, + newBank: "" + }); + } + } + + deleteItem(id) { + const bankList = [...this.state.bankList]; + //const updatedbankList = bankList.filter(item => item.id !== id); + const updatedbankList = bankList.filter(function(item){return item.id !== id}); + this.setState({ bankList: updatedbankList }); + } + + updateInput(input) { + this.setState({ newBank: input }); + } + + render() { + return ( +
+ brand logo +

Fintech@SG NUSmoney App

+
+ Add your new Bank.... +
+ this.updateInput(e.target.value)} + /> + +
+
    + {this.state.bankList.map( (item) => { + return ( +
  • + + {item.value} + +
  • + ) + } + )} +
  • + DBS Bank + +
  • +
+
+
+
+ ); + } + } + + export default App; + ``` + +* App.css + ```css + body { + background: #97d5e8; + font-family: "Montserrat", sans-serif; + font-size: 20px; + } + + .logo { + display: block; + margin-left: auto; + margin-right: auto; + } + + .input-text { + display: inline; + margin: 0; + border: none; + border-radius: 0.4rem; + padding: 10px; + } + + .list ul li button { + position: absolute; + right: 0%; + background: #f34541; + color: #fff !important; + text-transform: uppercase; + text-decoration: none; + margin-left: 10px; + margin-right: 10px; + padding: 10px; + border-radius: 0.4rem; + display: inline-block; + border: none; + } + + .add-btn { + color: #fff !important; + text-transform: uppercase; + text-decoration: none; + background: #7313cb; + margin: 20px; + padding: 10px; + border-radius: 0.4rem; + display: inline-block; + border: none; + } + + .app-title { + text-align: center; + color: #fff; + font-size: 70px; + } + ul { + /* remove default padding and margin from ul*/ + margin: 0px; + padding: 0px; + } + .list ul li { + display: block; + width: 100%; + text-decoration: none; + color: #000000; + background-color: #ffffff; + line-height: 30px; + border-bottom-style: solid; + border-bottom-width: 1px; + border-bottom-color: #cccccc; + padding: 10px; + position: relative; + } + + .container { + color: #fff; + max-width: 500px; + margin: auto; + } + ``` + +3. Navigate to nusmoney. Start the server + ``` + npm start + ``` +4. Navigate browser to [http://localhost:3000](http://localhost:3000) +5. The page should display + +![](homepage.JPG)