Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 19 additions & 20 deletions meta.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ const path = require('path');

module.exports = {
"prompts": {

"name": {
"type": "string",
"required": true,
Expand All @@ -19,26 +18,26 @@ module.exports = {
"type": "string",
"message": "Author"
},
"build": {
"type": "list",
"message": "Vue build",
"choices": [
{
"name": "Runtime + Compiler: recommended for most users",
"value": "standalone",
"short": "standalone"
},
{
"name": "Runtime-only: about 6KB lighter min+gzip, but templates (or any Vue-specific HTML) are ONLY allowed in .vue files - render functions are required elsewhere",
"value": "runtime",
"short": "runtime"
}
]
},
"router": {
"extended": {
"type": "confirm",
"message": "Install vue-router?"
},
"message": "Add basic Login and Admin views with Vuex, Vue-router and Bootstrap-vue?"
}
},
"filters": {
"client/router.js": "extended",
"client/static/main.css": "extended === false",
"client/static/images/**/*": "extended",
"client/components/**/*": "extended",
"client/services/**/*": "extended",
"client/store/**/*": "extended",
"client/style/**/*": "extended",
"client/view/**/*": "extended",
"server/boot/add-initial-data.js": "extended",
"server/boot/create-admin.js": "extended",
"server/initial-data/**/*": "extended",
"server/models/**/*": "extended",
"test/client/components/**/*": "extended",
"test/server/account.spec.js": "extended",
},
"complete": function(data, {logger}) {
logger.log("To get started:");
Expand Down
20 changes: 10 additions & 10 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 13 additions & 1 deletion template/.babelrc
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
{
"presets": ["es2015"]
"presets": ["es2015"],
"plugins": [
[
"babel-plugin-root-import", [{
"rootPathPrefix": "~",
"rootPathSuffix": "."
}, {
"rootPathPrefix": "@",
"rootPathSuffix": "client"
}
]
]
]
}
5 changes: 4 additions & 1 deletion template/.eslintrc
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
"sourceType": "module"
},
"globals": {
"require": true
"expect": true,
"assert": true,
"require": true,
"request": true
}
}
11 changes: 9 additions & 2 deletions template/client/App.vue
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
<template lang="html">
<h1>\{{ hello }}</h1>
{{#extended}}
<router-view id="app"></router-view>
{{else}}
<h1>\{{ hello }}</h1>
{{/extended}}
</template>

<script>
export default {
{{#unless extended}}
data: () => ({
hello: 'Hello World!',
}),
{{/unless}}
}
</script>

<style lang="css">
<style {{#extended}}lang="scss"{{else}}lang="css"{{/extended}}>
{{#extended}}@import "style/app.scss";{{/extended}}
</style>
11 changes: 11 additions & 0 deletions template/client/components/HelloWorld/HelloWorld.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<template>
<div>
Hello World! This content is restricted.
</div>
</template>

<script>
export default {

}
</script>
5 changes: 4 additions & 1 deletion template/client/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@
<html>
<head>
<meta charset="utf-8">
<title></title>
<title>{{name}}</title>
{{#extended}}
<meta name="viewport" content="width=device-width, user-scalable=no">
{{/extended}}
</head>
<body>
<div id="app"></div>
Expand Down
34 changes: 33 additions & 1 deletion template/client/main.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,41 @@
{{#extended}}
/* Required by BootstrapVue */
import 'babel-polyfill';

{{/extended}}
/* Global Components */
import Vue from 'vue';
{{#extended}}
import {sync} from 'vuex-router-sync';
import 'bootstrap-vue/dist/bootstrap-vue.css';
import BootstrapVue from 'bootstrap-vue';
// import 'vue-awesome/icons';
import Icon from 'vue-awesome';

Vue.use(BootstrapVue);

Vue.component('icon', Icon);

{{/extended}}
/* Local Components and modules */
import App from './App.vue';
{{#extended}}
import router from './router.js';
import store from './store';

// Add router state to store
sync(store, router);
{{/extended}}
{{#unless extended}}
import './static/main.css';
{{/unless}}

new Vue({
// Instance Application
export default new Vue({
el: '#app',
render: (r) => r(App),
{{#extended}}
router,
store,
{{/extended}}
});
56 changes: 56 additions & 0 deletions template/client/router.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import Vue from 'vue';
import VueRouter from 'vue-router';
import store from '@/store';
import Login from './view/Login.vue';
import Dashboard from './view/Dashboard.vue';
import Profile from './view/Profile.vue';

Vue.use(VueRouter);

const router = new VueRouter({
mode: 'history',
routes: [
{
path: '/',
name: 'home',
redirect: {name: 'dashboard'},
}, {
path: '/dashboard',
name: 'dashboard',
component: Dashboard,
meta: {requiresAuth: true},
}, {
path: '/login',
name: 'login',
component: Login,
}, {
path: '/profile',
name: 'profile',
component: Profile,
// eslint-disable-next-line camelcase
props: route => ({access_token: route.query.access_token}),
meta: {requiresAuth: true},
},
],
});

router.beforeEach((to, from, next) => {
if (to.matched.some(record => record.meta.requiresAuth)) {
// this route requires auth, check if logged in
// if not, redirect to login page (except when it's profile route and
// there is an access_token).
if (to.name === 'profile' && to.query.access_token) {
next();
} else if (!store.state.auth.access_token) {
next({
name: 'login',
});
} else {
next();
}
} else {
next(); // make sure to always call next()!
}
});

export default router;
37 changes: 37 additions & 0 deletions template/client/services/loopback.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import {host, restApiRoot, port} from '~/server/config.json';
import axios from 'axios';

const http = axios.create({
baseURL: 'http://' + host + ':' + port + restApiRoot,
});

http.setToken = token => {
http.defaults.headers.common['Authorization'] = token;
};

http.removeToken = () => {
delete http.defaults.headers.common.Authorization;
};

http.find = (endpoint, filter) => http.get(endpoint, {params: {filter}});

const interceptErrors = err => {
try {
err = Object.assign(new Error(), err.response.data.error);
} catch (e) {
// Will return err if something goes wrong
}
return Promise.reject(err);
};
const interceptResponse = res => {
try {
return res.data;
} catch (e) {
return res;
}
};
http.interceptors.response.use(interceptResponse, interceptErrors);

export default http;

// Documentation: https://github.com/axios/axios
Binary file added template/client/static/images/logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
21 changes: 21 additions & 0 deletions template/client/store/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import Vue from 'vue';
import Vuex from 'vuex';

import auth from './modules/auth';

Vue.use(Vuex);

export default new Vuex.Store({
state: {
breadcrumb: [{
text: 'Home',
to: '/dashboard',
}, {
text: 'Dashboard',
active: true,
}],
},
modules: {
auth, // auth namespaced
},
});
Loading