From e397131473cfeee286a06e11e90b254a0dd7bc4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E6=B5=B7?= Date: Sat, 25 Apr 2020 15:32:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E7=99=BB=E5=BD=95=EF=BC=8C=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E7=94=A8=E6=88=B7=E4=BF=A1=E6=81=AF=E5=92=8C=E6=B3=A8?= =?UTF-8?q?=E9=94=80=E7=9A=84=E6=95=B0=E6=8D=AE=E5=A4=84=E7=90=86=E7=A7=BB?= =?UTF-8?q?=E5=88=B0service=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index/src/app/api/api.service.ts | 47 +--------- index/src/app/services/user.service.spec.ts | 16 ++++ index/src/app/services/user.service.ts | 96 +++++++++++++++++++++ 3 files changed, 114 insertions(+), 45 deletions(-) create mode 100644 index/src/app/services/user.service.spec.ts create mode 100644 index/src/app/services/user.service.ts diff --git a/index/src/app/api/api.service.ts b/index/src/app/api/api.service.ts index e1a2dfd..369d73e 100644 --- a/index/src/app/api/api.service.ts +++ b/index/src/app/api/api.service.ts @@ -1,6 +1,5 @@ import {Injectable} from '@angular/core'; import {HttpClient} from '@angular/common/http'; -import {Observable, Observer, of} from 'rxjs'; import {Article} from '../class/Article'; import {HttpService} from './http/http.service'; @@ -13,7 +12,6 @@ import {CommentReq} from '../class/Comment'; import {Link} from '../class/Link'; import {User} from '../class/User'; import {LoginReq} from '../class/User'; -import {Response} from '../class/HttpReqAndResp'; import {LocalStorageService} from '../services/local-storage.service'; @@ -202,34 +200,15 @@ export class ApiService extends HttpService { login(loginReq: LoginReq) { - const observable = super.Service({ + return super.Service({ path: '/login', method: 'POST', contentType: 'application/json', data: loginReq }); - let observer: Observer>; - const oob = new Observable>(o => observer = o); - observable.subscribe({ - next: o => { - if (o.code === 0) { - // 登录成功 - this.localStorageService.setToken(o.result.token); - this.localStorageService.setUser(o.result); - } - observer.next(o); - observer.complete(); - }, - error: err => { - observer.error(err); - observer.complete(); - } - }); - return oob; } logout() { - this.localStorageService.clear(); return super.Service({ path: '/logout', method: 'GET', @@ -288,32 +267,10 @@ export class ApiService extends HttpService { } userInfo() { - // 判断本地缓存的用户信息是否符合要求,符合要求返回本地缓存 - const user = this.localStorageService.getUser(); - if (this.localStorageService.isLogin() && user && !this.localStorageService.checkNeedNet()) { - return of>(new Response(user)); - } - // 不符合 请求网络数据并更新缓存 - const observable = super.Service({ + return super.Service({ path: '/user/userInfo', method: 'GET', }); - let observer: Observer>; - const oob = new Observable>(o => observer = o); - observable.subscribe({ - next: o => { - this.localStorageService.setUser(o.result); - observer.next(o); - observer.complete(); - }, - error: err => { - // console.debug('登录过期 token错误 等等'); - this.localStorageService.removeToken(); - observer.error(err); - observer.complete(); - } - }); - return oob; } visit() { diff --git a/index/src/app/services/user.service.spec.ts b/index/src/app/services/user.service.spec.ts new file mode 100644 index 0000000..3f804c9 --- /dev/null +++ b/index/src/app/services/user.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { UserService } from './user.service'; + +describe('UserService', () => { + let service: UserService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(UserService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/index/src/app/services/user.service.ts b/index/src/app/services/user.service.ts new file mode 100644 index 0000000..9c1c484 --- /dev/null +++ b/index/src/app/services/user.service.ts @@ -0,0 +1,96 @@ +import {Injectable} from '@angular/core'; +import {LoginReq, User} from '../class/User'; +import {ApiService} from '../api/api.service'; +import {Observable, Observer} from 'rxjs'; +import {Response} from '../class/HttpReqAndResp'; +import {LocalStorageService} from './local-storage.service'; + +@Injectable({ + providedIn: 'root' +}) +export class UserService { + + constructor(private apiService: ApiService, + private localStorageService: LocalStorageService) { + } + + // 存储订阅者 + private userObserverArray: Observer>[] = []; + + watchUserInfo(observer: Observer>) { + if (this.userObserverArray.indexOf(observer) < 0) this.userObserverArray.push(observer); + const user = this.localStorageService.getUser(); + // 判断本地缓存的用户信息是否符合要求,符合要求返回本地缓存 + if (this.localStorageService.isLogin() && user && !this.localStorageService.checkNeedNet()) { + observer.next(new Response(user)); + return { + unsubscribe() { + observer.complete(); + } + } + } + // 不符合 请求网络数据并更新缓存 + // 向订阅者传数据 + const subscription = this.apiService.userInfo().subscribe({ + next: o => { + this.localStorageService.setUser(o.result); + observer.next(o); + }, + error: err => { + // console.debug('登录过期 token错误 等等'); + this.localStorageService.removeToken(); + observer.next(new Response(null)); + observer.error(err); + } + }); + return { + unsubscribe() { + observer.complete(); + subscription.unsubscribe() + } + } + } + + login(loginReq: LoginReq, observer: Observer>) { + const oob = new Observable>(o => observer = o); + const subscription = this.apiService.login(loginReq).subscribe({ + next: o => { + // 登录成功 + this.localStorageService.setToken(o.result.token); + this.localStorageService.setUser(o.result); + // this.userObserver.next(o); + this.userObserverArray.forEach(ob => ob.next(o)) + observer.next(o); + observer.complete(); + }, + error: err => { + observer.error(err); + observer.complete(); + } + }); + return { + unsubscribe() { + observer.complete(); + subscription.unsubscribe(); + } + }; + } + + logout(observer?: Observer>) { + // 如果不需要返回消息也ok + this.apiService.logout().subscribe(data => { + this.localStorageService.clear(); + this.userObserverArray.forEach(ob => ob.next(new Response(null))) + if (observer) { + observer.next(data); + observer.complete(); + } + }, + error => { + if (observer) { + observer.error(error); + observer.complete(); + } + }) + } +}