├── .babelrc ├── .browserslistrc ├── .dockerignore ├── .editorconfig ├── .eslintrc.js ├── .github └── workflows │ └── web.yml ├── .gitignore ├── .sequelizerc ├── .vscode ├── launch.json ├── settings.json └── tasks.json ├── Dockerfile ├── Dockerfile.prod ├── LICENSE ├── README.md ├── build ├── setup-dev-server.js ├── vue-loader.config.js ├── webpack.base.config.js ├── webpack.client.config.js └── webpack.server.config.js ├── docker-compose.debug.yml ├── docker-compose.yml ├── e2e ├── app.e2e-spec.js ├── environment.js └── utils │ ├── browser.js │ └── index.js ├── manifest.json ├── nodemon.json ├── package.json ├── public └── images │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── apple-touch-icon.png │ ├── browserconfig.xml │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ ├── mstile-150x150.png │ └── safari-pinned-tab.svg ├── server.js ├── server ├── config.json ├── config.prod.json ├── db │ ├── database.json │ ├── drop-all-tables.sql │ ├── migrations │ │ ├── 20171015202614-role.js │ │ ├── 20171016202024-user.js │ │ ├── 20171016202025-user-image.js │ │ ├── 20171016202124-userrole.js │ │ ├── 20171016212003-language.js │ │ ├── 20171016212650-contents.js │ │ └── 20171016212917-contenttexts.js │ ├── models │ │ ├── content.model.js │ │ ├── contenttext.model.js │ │ ├── index.js │ │ ├── language.model.js │ │ ├── role.model.js │ │ ├── user-images.model.js │ │ └── user.model.js │ └── seeders │ │ ├── 20171013141110-role.js │ │ ├── 20171013151110-user.js │ │ ├── 20171013151115-userrole.js │ │ ├── 20171013171318-language.js │ │ ├── 20171013171459-content.js │ │ └── 20171013222943-contenttext.js ├── features │ ├── app │ │ ├── app.controller.js │ │ └── app.routes.js │ ├── content │ │ ├── content-public.routes.js │ │ ├── content.controller.js │ │ ├── content.policy.js │ │ └── content.routes.js │ ├── core │ │ ├── errorHandler.js │ │ └── index.js │ ├── logger.js │ └── users │ │ ├── admin.controller.js │ │ ├── admin.routes.js │ │ ├── admin.routes.policy.js │ │ ├── index.js │ │ ├── strategies │ │ ├── facebook.js │ │ ├── google.js │ │ ├── jwt.js │ │ └── local.js │ │ ├── token.js │ │ ├── user.controller.js │ │ └── user.routes.js ├── index.js └── views │ ├── reset-password-confirm-email.hbs │ └── reset-password-email.hbs ├── src ├── App.vue ├── app.js ├── components │ ├── AppFooter.vue │ ├── AppHeader.vue │ ├── AppSocialLogin.vue │ ├── Layout.vue │ └── ProgressBar.vue ├── constants │ ├── app.constants.js │ └── index.js ├── entry-client.js ├── entry-server.js ├── forms │ └── index.js ├── index.template.html ├── router │ └── index.js ├── services │ ├── data.service.js │ ├── helpers.js │ ├── index.js │ ├── jwt-decode │ │ ├── decode.js │ │ └── index.js │ ├── session.service.js │ └── user.service.js ├── store │ ├── index.js │ └── posts.js ├── styles │ ├── _Base.scss │ ├── _Blockquote.scss │ ├── _Button.scss │ ├── _Card.scss │ ├── _Code.scss │ ├── _Color.scss │ ├── _Divider.scss │ ├── _Form.scss │ ├── _Grid.scss │ ├── _Image.scss │ ├── _Layout.scss │ ├── _Link.scss │ ├── _List.scss │ ├── _Nav.scss │ ├── _Spacing.scss │ ├── _Table.scss │ ├── _Typography.scss │ ├── _Utility.scss │ └── index.scss ├── util │ ├── filters.js │ └── title.js └── views │ ├── AboutView.vue │ ├── HomeView.vue │ ├── LoginView.vue │ ├── NotFoundView.vue │ ├── RegisterView.vue │ ├── examples │ ├── ExamplesView.vue │ ├── modal │ │ ├── ModalComponent.vue │ │ └── ModalView.vue │ └── prefetch │ │ ├── CategoryView.vue │ │ └── PostCard.vue │ └── profile │ ├── ProfilePasswordView.vue │ ├── ProfileUserInfoView.vue │ └── ProfileView.vue └── tests └── App.spec.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "@babel/preset-env", 5 | { 6 | "modules": false 7 | } 8 | ] 9 | ], 10 | "plugins": [ 11 | "@babel/plugin-syntax-dynamic-import", 12 | [ 13 | "@babel/plugin-proposal-object-rest-spread", 14 | { 15 | "useBuiltIns": true 16 | } 17 | ] 18 | ], 19 | "env": { 20 | "test": { 21 | "presets": [ 22 | [ 23 | "@babel/preset-env", 24 | { 25 | "targets": { 26 | "node": 8 27 | } 28 | } 29 | ] 30 | ] 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /.browserslistrc: -------------------------------------------------------------------------------- 1 | # Browsers that we support 2 | 3 | defaults 4 | not IE 11 5 | not IE_Mob 11 6 | maintained node versions -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | **/.classpath 2 | **/.dockerignore 3 | **/.env 4 | **/.git 5 | **/.gitignore 6 | **/.project 7 | **/.settings 8 | **/.toolstarget 9 | **/.vs 10 | **/.vscode 11 | **/*.*proj.user 12 | **/*.dbmdl 13 | **/*.db 14 | **/*.jfm 15 | **/azds.yaml 16 | **/bin 17 | **/charts 18 | **/docker-compose* 19 | # **/Dockerfile* 20 | **/node_modules 21 | **/npm-debug.log 22 | **/obj 23 | **/secrets.dev.yaml 24 | **/values.dev.yaml 25 | LICENSE 26 | README.md -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | parserOptions: { 4 | sourceType: "module", 5 | parser: "babel-eslint" 6 | }, 7 | env: { 8 | browser: true 9 | }, 10 | extends: ["prettier", "prettier/standard", "plugin:vue/recommended"], 11 | plugins: ["vue", "prettier"], 12 | rules: { 13 | "prettier/prettier": ["error", { "singleQuote": true }] 14 | } 15 | }; 16 | 17 | -------------------------------------------------------------------------------- /.github/workflows/web.yml: -------------------------------------------------------------------------------- 1 | name: Web 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | jobs: 9 | build_vuenode-fullstack: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v1 13 | - name: Build and deploy the Docker image 14 | env: 15 | HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }} 16 | APP_NAME: ${{ 'vuenode-fullstack' }} 17 | run: | 18 | docker build -t $APP_NAME -f Dockerfile.prod . 19 | docker tag $APP_NAME registry.heroku.com/$APP_NAME/web 20 | docker login --username=_ --password=$HEROKU_API_KEY registry.heroku.com 21 | docker push registry.heroku.com/$APP_NAME/web 22 | heroku container:release web -a $APP_NAME 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | coverage/ 4 | dist/ 5 | npm-debug.log 6 | yarn-error.log 7 | package-lock.json 8 | .idea 9 | *.iml 10 | *.sqlite -------------------------------------------------------------------------------- /.sequelizerc: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | 3 | module.exports = { 4 | 'config': path.resolve('server', 'db', 'database.json'), 5 | 'models-path': path.resolve('server', 'db', 'models'), 6 | 'seeders-path': path.resolve('server', 'db', 'seeders'), 7 | 'migrations-path': path.resolve('server', 'db', 'migrations') 8 | } -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "node", 9 | "request": "attach", 10 | "name": "Attach", 11 | "port": 9229 12 | }, 13 | { 14 | "type": "node", 15 | "request": "launch", 16 | "name": "Launch Program", 17 | "program": "${workspaceFolder}\\server" 18 | }, 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "search.exclude": { 3 | "**/node_modules": true, 4 | "**/bower_components": true 5 | }, 6 | "files.exclude": { 7 | "**/.git": true, 8 | "**/.svn": true, 9 | "**/.hg": true, 10 | "**/CVS": true, 11 | "**/.DS_Store": true, 12 | "**/node_modules": true 13 | }, 14 | "eslint.enable": true, 15 | "eslint.validate": ["javascript", "javascriptreact", "vue", "vue-html"], 16 | "eslint.run": "onType", 17 | "prettier.singleQuote": true, 18 | // relevant for 'prettier-eslint' instead of 'prettier' 19 | "vetur.format.defaultFormatter.html": "none", 20 | "vetur.format.defaultFormatter.css": "prettier", 21 | "vetur.format.defaultFormatter.postcss": "prettier", 22 | "vetur.format.defaultFormatter.scss": "prettier", 23 | "vetur.format.defaultFormatter.less": "prettier", 24 | "vetur.format.defaultFormatter.stylus": "stylus-supremacy", 25 | "vetur.format.defaultFormatter.js": "prettier", 26 | "vetur.format.defaultFormatter.ts": "prettier", 27 | "vetur.validation.style": true, 28 | // Validate vue-html in