diff --git a/backend/app/Config.js b/backend/app/Config.js
index 66e8838..3406714 100644
--- a/backend/app/Config.js
+++ b/backend/app/Config.js
@@ -102,7 +102,7 @@ class Config{
* @type {string}
* @memberof AccessManagementOptions
*/
- salt : 'P@ssSal7y!!',
+ salt : 'P@ssSal7y!N@tur3!',
/**
* @class Cookie options, опции за бисквитките
diff --git a/backend/app/WebServer.js b/backend/app/WebServer.js
index e4d2c51..7669601 100644
--- a/backend/app/WebServer.js
+++ b/backend/app/WebServer.js
@@ -1,5 +1,6 @@
import express from 'express'
import session from 'express-session';
+import passport from 'passport';
import compression from 'compression';
import MongoDBStore from 'connect-mongodb-session';
import https from 'https';
@@ -57,6 +58,9 @@ class WebServer {
// next();
// })
+ xapp.use(passport.initialize());
+ xapp.use(passport.session());
+
xapp.use(express.json({ limit: '150mb' }));
xapp.use(express.urlencoded({ extended: false, limit: '150mb' }));
diff --git a/src/App.vue b/src/App.vue
index ab8088f..3c4f417 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -4,6 +4,12 @@
-
diff --git a/src/components/AppHeader.vue b/src/components/AppHeader.vue
index f51e870..72400e0 100644
--- a/src/components/AppHeader.vue
+++ b/src/components/AppHeader.vue
@@ -1,48 +1,23 @@
-
+
- ProNature Administrative Console
-
+ ProNature Playground
+
+
-
+
-
- {{ l.createGameObject }}
- {{ l.createScenario }}
- {{ l.createGame }}
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- BG
- EN
-
-
-
-
\ No newline at end of file
diff --git a/src/components/GamePreview/GamePreview.vue b/src/components/GamePreview/GamePreview.vue
index c5c37ac..993c32f 100644
--- a/src/components/GamePreview/GamePreview.vue
+++ b/src/components/GamePreview/GamePreview.vue
@@ -35,13 +35,8 @@
\ No newline at end of file
diff --git a/src/components/User/Profile.vue b/src/components/User/Profile.vue
new file mode 100644
index 0000000..73fb2b1
--- /dev/null
+++ b/src/components/User/Profile.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+ Update Profile
+ Sign out
+
+
+
+
\ No newline at end of file
diff --git a/src/layouts/console.vue b/src/layouts/console.vue
index 76ab18e..b770d09 100644
--- a/src/layouts/console.vue
+++ b/src/layouts/console.vue
@@ -1,5 +1,5 @@
-
+
diff --git a/src/layouts/default.vue b/src/layouts/default.vue
index 9760be6..cb761f1 100644
--- a/src/layouts/default.vue
+++ b/src/layouts/default.vue
@@ -1,10 +1,11 @@
-
-
-
-
+
+
+
+
+
diff --git a/src/lib/Utils.js b/src/lib/Utils.js
deleted file mode 100644
index 086bedc..0000000
--- a/src/lib/Utils.js
+++ /dev/null
@@ -1,108 +0,0 @@
-const epsilon = 0.1;
-
-export default {
- blobToBase64: blob => {
- const reader = new FileReader();
- reader.readAsDataURL(blob);
- return new Promise(resolve => {
- reader.onloadend = () => {
- resolve(reader.result);
- };
- });
- },
-
- adjustMinMax(r){
- return {
- x1: Math.min(r.x1, r.x2), x2: Math.max(r.x1, r.x2),
- y1: Math.min(r.y1, r.y2), y2: Math.max(r.y1, r.y2)
- }
- },
-
- intersectPointRect(p, r){
- //r = this.adjustMinMax(r);
- return p[0] >= r.x1 && p[0] <= r.x2 && p[1] >= r.y1 && p[1] <= r.y2;
- },
-
- intersectPointLine(p, l){
- //l = this.adjustMinMax(l);
- let dx = l.x2 - l.x1, dy = l.y2 - l.y1;
- let c = dy / dx;
- return this.intersectPointRect(p, l) && c * p[0] - p[1] <= epsilon
- },
-
- intersectLineRect(l, r){
- return this.intersectPointRect([l.x1, l.y1], r) ||
- this.intersectPointRect([l.x2, l.y2], r);
- },
-
- intersectRectRect(r1, r2){
- return this.intersectPointRect([r1.x1, r1.y1], r2) ||
- this.intersectPointRect([r1.x1, r1.y2], r2) ||
- this.intersectPointRect([r1.x2, r1.y1], r2) ||
- this.intersectPointRect([r1.x2, r1.y2], r2);
- },
-
- round(n, p = 2){
- let pp = Math.pow(10, p);
- return Math.round(n*pp)/pp;
- },
-
- deg2rad(deg){
- return deg * (Math.PI / 180);
- },
-
- rad2deg(rad){
- return rad * 180 / Math.PI;
- },
-
- shuffleArray(arr){
- return arr.map(value => ({ value, sort: Math.random() }))
- .sort((a, b) => a.sort - b.sort).map(({ value }) => value)
- },
-
- deepMerge(target, source, transformFn) {
- Object.entries(source).forEach(([key, value]) => {
- if (transformFn){
- value = transformFn(key, value)
- }
- if (value && typeof value === 'object') {
- let dflt = Array.isArray(value) ? [] : {};
- this.deepMerge(target[key] = target[key] || dflt, value, transformFn);
- return;
- }
- target[key] = value;
- });
- return target;
- },
-
- drawOnCanvas(svg, width, height){
- return new Promise((resolve, reject)=>{
- let url = URL.createObjectURL(new Blob([svg],{ type:"image/svg+xml;charset=utf-8" }));
- let img = new Image();
- let canvas = document.createElement('canvas');
- canvas.width = width;
- canvas.height = height;
- let ctx = canvas.getContext('2d');
-
- img.addEventListener('load', function () {
- ctx.drawImage(this, 0, 0, canvas.width, canvas.height);
- URL.revokeObjectURL(url);
- resolve(canvas);
- }, { once: true })
-
- img.src = url;
- })
- },
-
- async wait(ms){
- await new Promise((resolve, reject)=>{
- setTimeout(resolve, ms)
- })
- },
-
- async waitFor(expFn){
- while (!expFn()){
- await JsUtils.wait(200);
- }
- }
-}
\ No newline at end of file
diff --git a/src/main.js b/src/main.js
index d31eee2..3c5a471 100644
--- a/src/main.js
+++ b/src/main.js
@@ -13,8 +13,11 @@ import App from './App.vue'
// Composables
import { createApp } from 'vue'
-const app = createApp(App)
+// Global Mixins
+import GlobalMixin from '@/mixins/GlobalMixin';
+const app = createApp(App)
registerPlugins(app)
+app.mixin(GlobalMixin);
app.mount('#app')
diff --git a/src/mixins/GameEnvironmentMixin.js b/src/mixins/GameEnvironmentMixin.js
index 87b52c7..4f70a97 100644
--- a/src/mixins/GameEnvironmentMixin.js
+++ b/src/mixins/GameEnvironmentMixin.js
@@ -3,7 +3,6 @@ import { VideoPlayer } from '@/components/InteractiveObjects/VideoPlayer';
import { GameEngine } from '@/lib/GameEngine';
import { Hero } from '@/lib/Hero';
import { autoScale, getBoundingBox, getBoundingBoxSize } from '@/lib/MeshUtils';
-import Utils from '@/lib/Utils';
let gameEngine = null;
export default {
diff --git a/src/mixins/GlobalMixin.js b/src/mixins/GlobalMixin.js
new file mode 100644
index 0000000..3a32532
--- /dev/null
+++ b/src/mixins/GlobalMixin.js
@@ -0,0 +1,36 @@
+import { useAppStore } from '@/stores/app';
+
+export default {
+ data(){
+ return {
+ store: null
+ }
+ },
+ created(){
+ this.store = useAppStore();
+ },
+ computed: {
+ user: {
+ get() {
+ return this.store.user;
+ },
+ set(value) {
+ this.store.user = value;
+ }
+ },
+ roles(){
+ let roles = {};
+ this.user && this.user.roles && this.user.roles.forEach(r=>{
+ roles[r] = true;
+ })
+ return roles;
+ },
+ },
+ methods: {
+ async loadUser() {
+ let response = await this.$api.user.load();
+ this.user = response.data.user;
+ return this.user;
+ },
+ }
+}
\ No newline at end of file
diff --git a/src/plugins/api.js b/src/plugins/api.js
index 40421d5..f5d4910 100644
--- a/src/plugins/api.js
+++ b/src/plugins/api.js
@@ -1,5 +1,5 @@
import axios from 'axios';
-import Utils from '@/lib/Utils';
+import Utils from '#/app/Utils';
const $ax = axios.create({
baseURL: '/api/',
@@ -66,6 +66,21 @@ export default {
user:{
async tm(action, object, data){
return await $ax.post('/user/tm', {action, object, data});
+ },
+ async signin(data){
+ return await $ax.post('/user/signin', data);
+ },
+ async signup(data){
+ return await $ax.post('/user/signup', data);
+ },
+ async signout(){
+ return await $ax.get('/user/signout');
+ },
+ async load(){
+ return await $ax.get('/user/info');
+ },
+ async update(data){
+ return await $ax.post('/user/update', data);
}
}
}