Sales Trainer v0.1: corporate sales-training simulator (Flask+Vue, 15 personas, chat simulator, judge, analytics)
- Auth/roles (no self-reg), admin user provision, JWT - Analyze: sales kit + initial pain-fit from form/upload - Persona generator: 15 personas (5/tier) w/ pain variety, negotiation, init mode, channel, latent/revealable, wrong_text special - Chat simulator: per-mode initiation, one-shot, hidden signals, judge-LLM debrief+coaching - Trainee loop: win/lose board, weak-areas, user-generated personas - Admin analytics; EN+TH Vue SPA served by Flask - Deploy: Dockerfile, docker-compose, README, eng-log + HANDOFF - Tests (mock LLM): m0/m1/routes/e2e all pass
This commit is contained in:
38
frontend/src/store/auth.js
Normal file
38
frontend/src/store/auth.js
Normal file
@@ -0,0 +1,38 @@
|
||||
// Auth + role store (reactive).
|
||||
import { reactive } from 'vue'
|
||||
import { getToken, setToken, api } from '../api'
|
||||
|
||||
export const auth = reactive({
|
||||
user: null,
|
||||
token: getToken(),
|
||||
get role() {
|
||||
return this.user ? this.user.role : null
|
||||
},
|
||||
get isAdmin() {
|
||||
return this.role === 'admin' || this.role === 'super_admin'
|
||||
},
|
||||
async load() {
|
||||
if (!this.token) return null
|
||||
try {
|
||||
const data = await api.me()
|
||||
this.user = data.user
|
||||
return this.user
|
||||
} catch (e) {
|
||||
this.user = null
|
||||
setToken(null)
|
||||
return null
|
||||
}
|
||||
},
|
||||
async login(email, password) {
|
||||
const data = await api.login(email, password)
|
||||
this.token = data.token
|
||||
setToken(data.token)
|
||||
this.user = data.user
|
||||
return data.user
|
||||
},
|
||||
logout() {
|
||||
this.user = null
|
||||
this.token = null
|
||||
setToken(null)
|
||||
},
|
||||
})
|
||||
Reference in New Issue
Block a user