- COMPLETAMENTO PASSAGGIO A VITE - versione 1.2.2:

- Sistemato RefreshToken
  - Integrato modifiche di PiuCheBuono
  - Aggiornato a Node 22
  - Aggiornato Server a Mongodb 8.0.
This commit is contained in:
Surya Paolo
2025-03-10 17:20:48 +01:00
parent 5a32e057b2
commit e853fd23c2
666 changed files with 6815 additions and 7198771 deletions

View File

@@ -257,9 +257,9 @@ export default defineComponent({
default: 0,
},
heightcarousel: {
type: Number,
type: String,
required: false,
default: 0,
default: '',
},
prop_pagination: {
type: Object as PropType<IPagination>,

View File

@@ -28,7 +28,7 @@
myclass="fixed-size"
:title="$t('statusreg.online_today')"
icon="fas fa-wifi"
:mytextval="datastat.online_today"
:mytextval="tools.numtostr(datastat.online_today)"
classColor="text-orange"
colBack="yellow"
>

View File

@@ -8,8 +8,6 @@ const msg_website_enUs = {
products: {
quantity: 'Quantità',
quantityAvailable: 'Disponibili',
stockQty: 'In Magazzino',
stockBloccatiQty: 'Bloccati In Magazzino',
weight: 'Peso',
stars: 'Voto',
color: 'Colore',
@@ -38,7 +36,6 @@ const msg_website_enUs = {
productslist: 'Lista Prodotti',
collabora: 'Collabora',
storehouses: 'Magazzino',
providers: 'Fornitori',
departments: 'Uffici',
orders: 'Ordini Ricevuti',
orders2: 'Ordini Ricevuti',

View File

@@ -8,7 +8,6 @@ const msg_website_es = {
products: {
quantity: 'Quantità',
quantityAvailable: 'Disponibili',
stockQty: 'In Magazzino',
weight: 'Peso',
stars: 'Voto',
color: 'Colore',

View File

@@ -1,9 +1,9 @@
const msg_website_it = {
ws: {
sitename: 'Più che Buono',
siteshortname: 'Più che Buono',
description: '',
keywords: '',
sitename: 'Riso',
siteshortname: 'RISO',
description: 'Siamo la Rete Italiana di Scambio Orizzontale, abbiamo creato questa piattaforma per metterla al servizio di chi vuole riscoprire il valore della condivisione e della cooperazione. Valori semplici e profondi che ci aiutano a ritrovare il Senso della Vita, perduto in questa società consumista, e riporti quei Sani Pricìpi Naturali ed Umani di Fratellanza che intere popolazioni antiche conoscevano bene.',
keywords: 'riso, piattaforma di scambio, rete italiana scambio orizzontale, riso app, riso piattaforma, scambio e baratto, momenta RIS',
},
hours: {
descr: 'Descrizione',
@@ -16,35 +16,23 @@ const msg_website_it = {
pages: {
home: 'Home',
profile: 'Profilo',
install_site: 'Installa Sito',
profile2: 'ProfiloU',
mypage2: 'mypage2',
myservice2: 'myservice2',
myhosps2: 'myhosps2',
mygood2: 'mygood2',
catalogo: 'Catalogo',
fundraising: 'Sostieni il Progetto',
notifs: 'Configura le Notifiche',
unsubscribe: 'Disiscriviti',
unsubscribe_user: 'Disiscriviti User',
test: 'Test',
projects: 'Progetti',
report: 'Report Ore',
producer: 'Produttore',
orderinfo: 'Ordini Effettuati',
products: 'Prodotti',
cash: 'Cassa',
productInfos: 'Info Prodotti',
listinoprodotti: 'Listino Prodotti',
productslist: 'Lista Prodotti',
collabora: 'Collabora',
categories: 'Categorie',
storehouses: 'Magazzino',
providers: 'Fornitori',
catprods: 'Categorie',
subcatprods: 'Sotto-Categorie',
gasordine: 'Gas Ordine',
scontisticas: 'Scontistica',
departments: 'Uffici',
orders: 'Ordini Ricevuti',
orders2: 'Ordini Ricevuti',
@@ -133,11 +121,15 @@ const msg_website_it = {
only_residenti: 'Solo Residenti',
only_consiglio: 'Solo Consiglieri',
color: 'Colore',
gasordini: 'Gas Ordini',
gestoreordini: 'Gestore Ordini',
mainMenu: 'Menu Principale',
subtitle: 'Sottotitolo',
lang: 'Lingua',
keywords: 'Parole Chiave',
desctiption: 'Descrizione',
heightimg: 'Altezza Immagine',
},
msg: {
myAppName: 'Più che Buono',
myAppName: 'Riso',
myAppDescription: 'Il primo Vero Social Libero, Equo e Solidale, dove Vive Consapevolezza e Aiuto Comunitario. Gratuito',
underconstruction: 'App in costruzione...',
myDescriz: '',

View File

@@ -1,4 +1,4 @@
import {
import type {
IListRoutes,
ILang,
IPreloadImages,
@@ -7,6 +7,30 @@ import {
import { func } from '@store/Modules/fieldsTable'
// const SHOW_PROJINTHEMENU = false
//
// let arrlistafavourite = []
// let arrlistaprojtutti = []
// let arrlistaprojmiei = []
// if (SHOW_PROJINTHEMENU) {
// arrlistaprojtutti = Projects.getters.listaprojects(RouteNames.projectsall)
// arrlistaprojmiei = Projects.getters.listaprojects(RouteNames.myprojects)
// arrlistafavourite = Projects.getters.listaprojects(RouteNames.favouriteprojects)
// }
// PROGETTI -> FAVORITI :
// if (arrlistafavourite.length > 0) {
// arrMenu.push({
// icon: 'favorite_border',
// nametranslate: 'pages.' + RouteNames.favouriteprojects,
// urlroute: RouteNames.favouriteprojects,
// level_parent: 0.0,
// level_child: 0.5,
// routes2: arrlistafavourite,
// idelem: ''
// })
// }
const firstPage = {
active: true,
order: 5,
@@ -40,12 +64,76 @@ function getDynamicPages(site: ISites): IListRoutes[] {
materialIcon: 'fas fa-test',
name: 'mypages.test',
component: () => import('@src/views/testServer/testServer.vue'),
inmenu: false,
infooter: false,
},
{
active: true,
order: 12,
path: '/goods',
materialIcon: 'fas fa-tshirt',
name: 'mypages.goods',
component: () => import('@src/root/goods/goods.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
active: true,
order: 15,
path: '/services',
materialIcon: 'fas fa-house-user',
name: 'mypages.services',
component: () => import('@src/root/services/services.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
active: true,
order: 15,
path: '/activities',
materialIcon: 'fas fa-house-user',
name: 'mypages.activities',
component: () => import('@src/root/activities/activities.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
},
/*{
{
active: true,
order: 15,
path: '/provapao',
materialIcon: 'fas fa-house-user',
name: 'mypages.provapao',
component: () => import('@src/root/provapao/provapao.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
},
{
active: true,
order: 15,
path: '/hosps',
materialIcon: 'fas fa-bed',
name: 'mypages.hosp',
component: () => import('@src/root/hosp/hosp.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
active: site.confpages && site.confpages.enableCircuits,
order: 16,
path: '/circuits',
materialIcon: 'fas fa-coins',
name: 'mypages.circuits',
component: () => import('@src/views/user/mycircuits/mycircuits.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
active: true,
order: 20,
path: '/events',
@@ -55,17 +143,6 @@ function getDynamicPages(site: ISites): IListRoutes[] {
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},*/
{
active: site.confpages && site.confpages.showProfile,
order: 120,
path: '/myprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile',
component: () => import('@src/views/user/myprofile/myprofile.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
active: true,
@@ -78,6 +155,17 @@ function getDynamicPages(site: ISites): IListRoutes[] {
inmenu: false,
infooter: false,
},
{
active: true,
order: 120,
path: '/myprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile',
component: () => import('@src/views/user/myprofile/myprofile.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
active: true,
order: 120,
@@ -90,7 +178,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
infooter: false,
},
{
active: site.confpages && site.confpages.showiscrittiMenu,
active: true,
order: 130,
path: '/friends',
materialIcon: 'fas fa-user-friends',
@@ -100,19 +188,6 @@ function getDynamicPages(site: ISites): IListRoutes[] {
inmenu: true,
infooter: true,
},
{
active: site.confpages && site.confpages.enableCircuits,
order: 16,
path: '/circuits',
materialIcon: 'fas fa-coins',
name: 'mypages.circuits',
component: () => import('@src/views/user/mycircuits/mycircuits.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
onlyAdmin: true,
onlyManager: true,
},
{
active: site.confpages && site.confpages.enableGroups,
order: 132,
@@ -123,8 +198,6 @@ function getDynamicPages(site: ISites): IListRoutes[] {
meta: { requiresAuth: true },
inmenu: true,
infooter: false,
onlyAdmin: true,
onlyManager: true,
},
{
active: true,
@@ -203,7 +276,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
{
active: true,
order: 150,
path: '/fundraising',
path: '/sostieniilprogetto',
materialIcon: 'fas fa-hand-holding-heart',
name: 'pages.fundraising',
component: () => import('@src/root/fundraising/fundraising.vue'),
@@ -228,7 +301,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
export function firstimagehome() {
let img = 'statics/images/background.jpg'
const img = 'statics/images/background.jpg'
return img
}

View File

@@ -10,7 +10,7 @@
<meta name="description" content="<%= productDescription %>">
<meta name="format-detection" content="telephone=no">
<meta name="msapplication-tap-highlight" content="no">
<meta name="version" content="1.1.23">
<meta name="version" content="1.2.2">
<meta name="viewport"
content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width<% if (ctx.mode.cordova || ctx.mode.capacitor) { %>, viewport-fit=cover<% } %>">

View File

@@ -117,8 +117,6 @@ const msg_it = {
link_scheda: 'Link Scheda',
addtocart_ext: 'Aggiungi',
formato: 'Formato',
edizione: 'Edizione',
editore: 'Ediitore',
isbn: 'ISBN',
},
storehouses: {
@@ -2032,7 +2030,7 @@ const msg_it = {
idPageAssigned: 'Pagina Assegnata',
idPageAssigned_stampa: 'Pagina Assegnata (per STAMPA)',
descr_introduttiva: 'Descrizione Introduttiva (circa 1300 battute)',
editore: 'Gruppo Editoriale',
editore: 'Marchio Editoriale',
versione_perstampa: 'Per Stampa',
pdf_generato: 'Pdf generato',
pdf_online: 'Pdf online Ufficiale',

View File

@@ -87,78 +87,75 @@ export const Api = {
},
async refreshToken() {
// Implementa la logica per ottenere un nuovo token utilizzando il refreshToken
// Potrebbe essere una chiamata al server simile a sendRequest()
// Se il refreshToken è valido, salva il nuovo token e restituiscilo
// Altrimenti, gestisci il caso di refreshToken scaduto o invalido, e.g., redirecting to login
const userStore = useUserStore();
try {
const userStore = useUserStore()
// console.log('refreshToken')
const refrTok = localStorage.getItem(toolsext.localStorage.refreshToken)
let response = null
if (refrTok && refrTok !== 'undefined') {
// console.log('refreshToken=', refrTok)
response = await sendRequest('/users/newtok', 'POST', { refreshToken: refrTok })
const refrTok = localStorage.getItem(toolsext.localStorage.refreshToken);
if (response) {
if (!refrTok || refrTok === 'undefined') {
throw new Error('Refresh token non disponibile');
}
// Save the new access token in local storage
localStorage.setItem(toolsext.localStorage.token, response.data.token);
const response = await sendRequest('/users/newtok', 'POST', { refreshToken: refrTok });
// Reset the refresh token if it was reset by the server
if (response.data.refreshToken) {
// console.log('salva refreshtoken', response.data.refreshToken)
userStore.setRefreshToken(response.data.refreshToken)
}
// Return the new access token
return response.data.token;
} else {
userStore.setAuth('', '')
localStorage.removeItem(toolsext.localStorage.token)
localStorage.removeItem(toolsext.localStorage.refreshToken)
if (response && response.data) {
// Salva il nuovo access token
localStorage.setItem(toolsext.localStorage.token, response.data.token);
// Aggiorna il refresh token se fornito dal server
if (response.data.refreshToken) {
userStore.setRefreshToken(response.data.refreshToken);
localStorage.setItem(toolsext.localStorage.refreshToken, response.data.refreshToken);
}
return response.data.token;
} else {
throw new Error('Risposta del server non valida durante il refresh token');
}
} catch (error) {
// Handle the error, for example by logging out the user
console.error(error)
localStorage.removeItem(toolsext.localStorage.token)
localStorage.removeItem(toolsext.localStorage.refreshToken)
throw error
console.error('Errore durante il refresh token:', error);
// Logout dell'utente in caso di errore critico
userStore.setAuth('', '');
localStorage.removeItem(toolsext.localStorage.token);
localStorage.removeItem(toolsext.localStorage.refreshToken);
throw error;
}
},
async checkTokenScaduto(status: number, evitaloop: boolean, resolve: any, reject: any, url: string, method: string, mydata: any, setAuthToken = false) {
const userStore = useUserStore()
async checkTokenScaduto(status, evitaloop, resolve, reject, url, method, mydata, setAuthToken = false) {
const userStore = useUserStore();
if (status === serv_constants.RIS_CODE__HTTP_FORBIDDEN_TOKEN_EXPIRED) {
try {
console.log('Token Scaduto.')
console.log('Token scaduto. Tentativo di refresh...');
const newAccessToken = await this.refreshToken();
if (newAccessToken) {
userStore.setAuth(newAccessToken, userStore.refreshToken);
if (!evitaloop) {
console.log('uso il RefreshToken...')
console.log('Nuovo token ottenuto. Riprovo la richiesta...');
return resolve(this.SendReq(url, method, mydata, setAuthToken, true));
}
} else {
// $router.push('/signin')
// Se il refresh token fallisce, logout dell'utente
userStore.setAuth('', '');
return reject({ code: toolsext.ERR_AUTHENTICATION });
}
} catch (err2: any) {
console.error('err2, Token Invalido', err2)
if (err2?.code === serv_constants.RIS_CODE__HTTP_FORBIDDEN_INVALID_TOKEN) {
userStore.setServerCode(toolsext.ERR_AUTHENTICATION)
userStore.setAuth('', '')
return reject({ code: toolsext.ERR_AUTHENTICATION })
}
}
} catch (err2) {
console.error('Errore durante il refresh token:', err2);
return null
if (err2?.code === serv_constants.RIS_CODE__HTTP_FORBIDDEN_INVALID_TOKEN) {
userStore.setServerCode(toolsext.ERR_AUTHENTICATION);
userStore.setAuth('', '');
return reject({ code: toolsext.ERR_AUTHENTICATION });
}
// Gestione di altri errori critici
return reject(err2);
}
}
return null;
},
async SendReqBase(url: string, method: string, mydata: any, setAuthToken = false, evitaloop = false, myformdata?: any, responsedata?: any, options?: any): Promise<Types.AxiosSuccess | Types.AxiosError> {
@@ -186,22 +183,20 @@ export const Api = {
}
}, 1000)
if (res.status) {
userStore.setResStatus(res.status)
if (res.status === serv_constants.RIS_CODE__HTTP_FORBIDDEN_INVALID_TOKEN) {
userStore.setServerCode(toolsext.ERR_AUTHENTICATION)
userStore.setAuth('', '')
return reject({ code: toolsext.ERR_AUTHENTICATION })
}
if (res.status === serv_constants.RIS_CODE__HTTP_FORBIDDEN_INVALID_TOKEN) {
userStore.setServerCode(toolsext.ERR_AUTHENTICATION);
userStore.setAuth('', '');
return reject({ code: toolsext.ERR_AUTHENTICATION });
}
const ret = await this.checkTokenScaduto(res.status, evitaloop, resolve, reject, url, method, mydataout, setAuthToken)
const ret = await this.checkTokenScaduto(res.status, evitaloop, resolve, reject, url, method, mydata, setAuthToken);
if (ret) {
return ret
return ret;
}
if (tools.isDebug())
console.log(' ----> ', res)
return resolve(res)
})
.catch(async (error) => {
@@ -214,13 +209,15 @@ export const Api = {
}
}, 1000)
const ret = await this.checkTokenScaduto(error.status, evitaloop, resolve, reject, url, method, mydataout, setAuthToken)
let ret = await this.checkTokenScaduto(error.status, evitaloop, resolve, reject, url, method, mydataout, setAuthToken)
if (ret) {
return ret
} else {
ret = await this.checkTokenScaduto(error.status, evitaloop, resolve, reject, url, method, mydataout, setAuthToken)
}
console.log('ERROR', error)
return reject(error)
console.error('Errore nella richiesta:', error);
return reject(error);
}))
},

View File

@@ -3641,17 +3641,17 @@ export const tools = {
if ('serviceWorker' in navigator) {
options = {
body: 'You successfully subscribed to our Notification service!',
icon: '/icons/app-icon-96x96.png',
icon: '/myicons/app-icon-96x96.png',
image: '/images/sf-boat.jpg',
dir: 'ltr',
lang: 'enUs', // BCP 47,
vibrate: [100, 50, 200],
badge: '/icons/app-icon-96x96.png',
badge: '/myicons/app-icon-96x96.png',
tag: 'confirm-notification',
renotify: true, // if it's already sent, will Vibrate anyway
actions: [
{ action: 'confirm', title: 'Okay', icon: '/icons/app-icon-96x96.png' },
{ action: 'cancel', title: 'Cancel', icon: '/icons/app-icon-96x96.png' },
{ action: 'confirm', title: 'Okay', icon: '/myicons/app-icon-96x96.png' },
{ action: 'cancel', title: 'Cancel', icon: '/myicons/app-icon-96x96.png' },
],
}

View File

@@ -888,6 +888,7 @@ export const useUserStore = defineStore('UserStore', {
clearAuthData() {
console.log('clearAuthData')
this.my = DefaultUser
// resetArrToken(mystate.my.tokens)

View File

@@ -1848,10 +1848,10 @@ export const useGlobalStore = defineStore('GlobalStore', {
return false
} else {
console.log('NON SONO LOGGATO... MYUSER NON TORNATO dal SRV',)
console.log('Sbianca cmq i dati')
// Sbianca cmq i dati
const token = localStorage.getItem(toolsext.localStorage.token)
if (token) {
console.log('Sbianca cmq i dati')
// Sbianca cmq i dati
userStore.logout()
this.rightDrawerOpen = true
return false