这是基于vue-vben-admin 模板适用于abp Vnext的前端管理项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

120 lines
3.0 KiB

import 'dart:convert';
import 'package:core/models/auth.dart';
import 'package:core/models/session.dart';
import 'package:core/proxy/index.dart';
import 'package:core/utils/internal.store.dart';
import 'package:core/utils/string.extensions.dart';
import 'package:get/get.dart';
import 'package:rxdart/rxdart.dart';
import 'auth.service.dart';
import 'storage.service.dart';
import 'config.state.service.dart';
import 'service.base.dart';
class SessionService extends ServiceBase {
static const String sessionKey = '_abp_session_';
final InternalStore<Session> _store = InternalStore<Session>(state: _initState());
static SessionService get to => Get.find();
AuthService get _authService => find();
StorageService get _storageService => find();
ConfigStateService get _configStateService => find();
bool get isAuthenticated {
if (_store.state.profile == null || _store.state.token == null) {
return false;
}
return !_store.state.profile!.id.isNullOrWhiteSpace() &&
!_store.state.token!.accessToken.isNullOrWhiteSpace();
}
CurrentTenantDto? get tenant{
return _store.state.tenant;
}
UserProfile? get profile {
return _store.state.profile;
}
Token? get token {
return _store.state.token;
}
String? get currentLanguage {
return _store.state.language;
}
@override
void onInit() {
super.onInit();
_initUpdateStream();
}
static Session _initState() {
var session = StorageService.initStorage(sessionKey, (value) => Session.fromJson(jsonDecode(value)));
return session ?? Session();
}
void _initUpdateStream() {
var token$ = _store.sliceState((state) => state.token);
token$.doOnData((_) => _configStateService.refreshAppState())
.whereNotNull()
.switchMap((_) => Stream.fromFuture(_authService.getProfile()))
.listen((profile) {
var abpConfig = _configStateService.getAll();
_store.patch((state) {
state.profile = profile;
state.tenant = abpConfig.currentTenant;
});
});
var session$ = _store.sliceUpdate((state) => state);
session$.listen((session) {
_storageService.setItem(sessionKey, jsonEncode(session.toJson()));
});
}
Stream<UserProfile?> getProfile$() {
return _store.sliceState((state) => state.profile);
}
Stream<Token?> getToken$() {
return _store.sliceState((state) => state.token);
}
Stream<String?> getLanguage$() {
return _store.sliceState((state) => state.language);
}
Stream<String?> onLanguageChange$() {
return _store.sliceUpdate((state) => state.language);
}
void setLanguage(String language) {
if (language == _store.state.language) return;
_store.patch((state) => state.language = language);
}
void refreshProfile() {
_store.patch((state) {
state.profile = profile;
});
}
void refreshToken(Token? token) {
_store.patch((state) {
state.token = token;
});
}
void resetSession() {
_store.patch((state) {
state.token = null;
state.profile = null;
});
}
}