8000 GitHub - ais-one/cookbook at 0.4.1
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

ais-one/cookbook

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

84 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

npm version npm Sonarcloud Status Known Vulnerabilities MadeWithVueJs.com shield

TL;DR ExpressJS & VueJS Web App Cookbook, Customisable CRUD Library, CI/CD, Cloud Container Deployment, Web Components, ES Modules, Vite

Latest Version 0.4.1 - Released 2020 Oct 08 1930 +8GMT

Features

  • Frontend Examples
    • Vite & Vue3: Web Components, Leaflet Map, ECharts, Webcam, Signature canvas, PWA, CRUD frontend for CRUD backend
    • SPA & Vuetify: Websockets, Graphql (subscriptions, cache, optimistic UI, refetch queries), REST, VueCrudX, i18n, RxJS, 2FA login, Github social login, recaptcha, JWT refresh token, GA OTP
    • Vanilla JS, ES Modules: No bundler, scalable VueJS Application , example codes (signed uploads, JWT refresh token, OTP)
  • Express JS Backend
    • Cors, proxy middleware, helmet, error handling, logging, OpenAPI
    • Objection ORM, Knex, MongoDb, Relational DB data example, migration, seed, GraphQL, Redis
    • Webpush & FCM push notification, Sendgrid email, Nexmo SMS, Telegram
    • AgendaJS message queue
    • File uploads, Signed URL file upload to GCP Storage
    • Websockets, graphql
    • JWT using RSA, JWT refresh token, Passwort SAML (WIP), token in HttpOnly cookies, GA OTP, role
    • Unit Test & Integration Test
  • Development & Deployment

QUICK START - ON YOUR LOCAL MACHINE

Backend & SPA or Vite

Backend Setup & Run

# clone repo and install backend
git clone https://github.com/ais-one/vue-crud-x.git
cd vue-crud-x
npm run install

# create and seed relational db on SQLite
npm run knex # windows
npm run knex:unix # linux or mac

# create and seed MongoDB requires MongoDB - you can skip this but MongoDB examples will not work
npm run mongo # windows
npm run mongo:unix # linux or mac

# run the backend
npm run app # windows
npm run app:unix # linux or mac

Visit the following URLs

NOTES

  • MongoDB examples needs MongoDB to work. To resolve, chose one of the methods to install MongoDB in docs/mongodb/install.md
  • The example-app/config/secret folder is missing so there maybe some console log errors (but it is ok to ignore), graphql and websockets will not work. Quick start is still usable. To resolve, in example-app/config folder, rename sample-secret folder to secret. You can look at the readme inside sample-secret folder for more information

SPA Setup & Run

cd example-web/spa
npm i
npm run serve

Navigate to http://127.0.0.1:8080 to view application with VueCrudX demo

Login using the following:

  • User: test
  • Password: test
  • OTP (if enabled - e.g. USE_OTP=TEST): use 111111 as otp pin

Vite Setup & Run

Why Use Vite

MongoDB required for testing CRUD table to work

For Push Notification

  • using Google FCM, setup your firebase account and messaging, also setup FCM server key in backend
  • using self hosted webpush is also supported and available
cd example-web/vite
npm i
npm run dev

Navigate to http://127.0.0.1:8080 to view application

Login is same as SPA

You can test PWA Push notifications using webpush on Dashboard page (need to be on 127.0.0.1). Click the following buttons in order (see their output in console.log and screen):

  • sub PN (subscribe)
  • Test PN (send a test message to user id 1 - on sqlite)
  • Unsub PN (unsubscribe)

Why No SSR or SSG

  • potential slow rendering by server app, added complexity in code, rehydration errors, added complexity in server
  • nuxt/nuxt#8102
  • prefer static sites and lazy loaded SPA

Testing

To run unit & integration test on /api/authors. E2E testing is Work In Progress

TO TEST EVERYTHING PLEASE change describe.only(...) to describe(...) in the test scripts in example-app/tests

npm run test # windows
npm run test:unix # linux or mac

Long Running Processes and Cron Triggered Process

Command to run long process (do take note of caveats, for production need a monitor to handle restart strategy)

npm run process-long # windows
npm run process-long:unix # linux or mac

Command to simulate process triggered by cron (NOTE: may be better to use cron to call API than trigger a process)

npm run process-cron # windows
npm run process-cron:unix # linux or mac

To serve the VueJS SPA production build

From vue-crud-x folder

cd example-web/spa
npm run build

From vue-crud-x folder

cd example-web/spa
npm run build
mv dist ../../example-app/public/

Change or add (if property not present) to example-app/config/secret/.development.env.js file contents

  //...
  WEB_STATIC: [
    //...
    { folder: process.cwd() + '/dist', url: '/' }, // UNCOMMENT this line
    // { folder: APP_PATH + '/public/demo-express', url: '/' }, // COMMENT this line
    //...
  ]
  //...

Using The Common Libraries In Your Own Application

  1. see example-app for backend example
  • example-app/lib/esm for common ESM codes to be used by express applications
  • example-app/lib/<all_others> for common CJS codes to be used by express applications
  1. see example-app/public for vanillaJS frontend exxample

  2. see example-web/vite for Vite Vue3 frontend example

  • example-web/vite/lib/esm for common codes to be used by Vite Vue 3 (should have same contents as example-app/lib/esm)
  1. see example-web/spa for Webpack Vue2 frontend example
  • example-web/spa/lib/webpacked for common codes to be used by Webpacked Vue 2 applications

Environment Settings

  • In package.json Files
    • Set environment using config.env property (development, uat, staging, production)
{
  "config": {
    "env": "development",
  }
}

Configuration

The example-app/config/ folder contains the config information.

You can override the configurations using <NODE_ENV>.env.js files, e.g. development.env.js or uat.env.js in example-app/config/secret

If too many config properties, split it to other more and files


Project Strcuture

vue-crud-x
+- common-lib/ : contains document to indicate which are the common libraries
+- docker-devenv/ : docker for development environment (e.g. run redis, mongodb from here)
|  +- mongodb
+- docs/ : documentation
+- example-app : an example backend application **Use this example for your project**
|  +- config/ : centralized config folder
|  |  +- certs/ : certificates for HTTPS and JWT signing
|  |  +- k8s/ : kubernetes YAML files (WIP)
|  |  +- secret
|  |  |  +- .env.<node_env>
|  |  |  +- <node_env>.deploy
|  |  |  +- <node_env>.pem
|  |  |  +- <node_env>.gcp.json
|  |  |  +- <node_env>.gcp.cors.json
|  |  +- index.js : home to your configs, can scale by adding folders and files
|  +- controllers/
|  +- coverage/ (auto-generated by test runner)
|  +- db/
|  |  +- migrations/
|  |  +- mongo/
|  |  +- seeds/
|  +- graphql/ : graphql stuff
|  +- jobs/ : message queue jobs
|  +- libs/ : common libs
|  |  +- auth/ : for express authentication
|  |  +- comms/ : messaging
|  |  +- esm/ : same as example-web/vite/lib
|  |  +- express/ : express related
|  |  +- services/ : nodejs libs
|  |  +- dist/ : distribution folder for CRUD component
|  |  +- config.default.js: the base config
|  |  +- config.js: the base config
|  +- logs/
|  +- middlewares/
|  +- models/
|  +- public/ : for serving static files - website
|  |  +- demo-express/ (127.0.0.1/)
|  |  +- demo-nobundler/
|  +- router/
|  +- sandbox/ : Useful scripts
|  +- tests/ : Jest tests
|  +- uploads/ : for serving static files - files
|  +- .dockerignore
|  +- .eslintrc.js
|  +- app.js : the express app boilerplate
|  +- deploy-gcr.sh
|  +- deploy-vm.sh
|  +- docker-compose.yml
|  +- Dockerfile
|  +- ecosystem.config.js
|  +- index.js
|  +- jest.config.js: JEST testing
|  +- knexfile.js: Knex query builder
|  +- package.json
|  +- process-cron.js: sample cron triggered process
|  +- process-long.js: sample long running process
|  +- README.md
|  +- setup.js
+- example-web/ : frontend associated to the application
|  +- spa/
|  |  +- libs/ : common libs
|  |  |  +- webpacked/ : webpacked components for frontend (including vue-crud-x)
|  +- vite/
|  |  +- libs/ : common libs
|  |  |  +- esm/ : JS that can be used by both front and backend
|  +- <your other front end here>
+- .gitignore
+- BACKLOG.md
+- CHANGELOG.md
+- ISSUES.md
+- LICENCE
+- package.json
+- README.md

DOCUMENTATION

VERSION CHANGE NOTES

  • v0.4+ Improve folders and structure organization, handle CI/CD better
  • v0.3+ Reorganize folders and structure, for ease of developing and maintaining multiple applications.
  • v0.2+ uses Vuetify 2. Due to many breaking changes from Vuetify 1 to 2, CRUD component code was refactored to be more UI framework agnostic (reduce dependencies!), easier to use, improving code quality, documentation and supprting article - VueJS+ExpressJS CRUD & Cookbook
  • v0.1 and Vuetify 1 will be supported under the v1 branch. You can refer to the v1 Legacy Article (For Historical Reference)

SAMPLE SCREENSHOTS

Login Screen

  • recaptcha

Screenshot

Table & Filter

  • filter
  • pagination

Screenshot

Form

  • custom form slot
  • tags and lazy-load autocomplete
  • click button to child table

Screenshot

Inline Edit

  • inline edit
  • date-picker, select and other controls

Screenshot

0