fmode-ng 0.0.41 → 0.0.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +8 -0
- package/esm2022/fmode-ng.mjs +10 -5
- package/esm2022/lib/aigc/agent/agent.prompt.mjs +10 -122
- package/esm2022/lib/aigc/agent/index.mjs +10 -2
- package/esm2022/lib/aigc/avatar/avatar.module.mjs +10 -45
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/avatar.role.mjs +10 -2
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/comp-avatar-particle.component.mjs +10 -315
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/index.mjs +10 -3
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/role-points.class.mjs +10 -57
- package/esm2022/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.mjs +10 -97
- package/esm2022/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.mjs +10 -104
- package/esm2022/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.mjs +10 -111
- package/esm2022/lib/aigc/avatar/index.mjs +10 -8
- package/esm2022/lib/aigc/avatar/interface-avatar-role.mjs +10 -2
- package/esm2022/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.mjs +8 -166
- package/esm2022/lib/aigc/chat/chat-header-area/comp-header-area.component.mjs +10 -36
- package/esm2022/lib/aigc/chat/chat-header-area/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-list/chat-list.component.mjs +8 -141
- package/esm2022/lib/aigc/chat/chat-list/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-message-area/comp-message-area.component.mjs +10 -40
- package/esm2022/lib/aigc/chat/chat-message-area/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-message-card/comp-message-card.component.mjs +10 -92
- package/esm2022/lib/aigc/chat/chat-message-card/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-modal-input/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs +8 -207
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-input.component.mjs +10 -236
- package/esm2022/lib/aigc/chat/chat-panel/chat-panel.component.mjs +10 -137
- package/esm2022/lib/aigc/chat/comp-role-prompt/comp-role-prompt.component.mjs +10 -69
- package/esm2022/lib/aigc/chat/comp-role-prompt/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/index.mjs +10 -8
- package/esm2022/lib/aigc/comp-markdown-preview/clipboard.service.mjs +10 -82
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-parse.mjs +8 -269
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.component.mjs +10 -51
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.module.mjs +10 -24
- package/esm2022/lib/aigc/comp-markdown-preview/plugins/md-mathjax/index.mjs +10 -94
- package/esm2022/lib/aigc/index.mjs +10 -13
- package/esm2022/lib/aigc/service-fmai/fmai.service.mjs +10 -21
- package/esm2022/lib/aigc/service-fmai/service-chat/chat-class.mjs +8 -736
- package/esm2022/lib/aigc/service-fmai/service-chat/chat.service.mjs +8 -181
- package/esm2022/lib/aigc/service-fmai/service-chat/index.mjs +10 -7
- package/esm2022/lib/aigc/service-fmai/service-chat/mask-list.mjs +9 -194
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/chat-content.pipe.mjs +10 -27
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/hidexml.pipe.mjs +10 -27
- package/esm2022/lib/aigc/service-fmai/service-chat/utilnow.pipe.mjs +10 -68
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine.service.mjs +8 -229
- package/esm2022/lib/aigc/service-fmai/service-imagine/index.mjs +10 -2
- package/esm2022/lib/aigc/voice/audio.player.mjs +10 -52
- package/esm2022/lib/aigc/voice/class-asr.mjs +8 -79
- package/esm2022/lib/aigc/voice/fmode-voice.service.mjs +8 -501
- package/esm2022/lib/aigc/voice/index.mjs +10 -3
- package/esm2022/lib/aigc/voice/lib/pcm2wav.mjs +10 -38
- package/esm2022/lib/aigc/voice/lib/resample.mjs +10 -34
- package/esm2022/lib/aigc/voice/stream.player.mjs +10 -0
- package/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs +8 -233
- package/esm2022/lib/aigc/voice/tts/index.mjs +10 -2
- package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.component.mjs +10 -190
- package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.module.mjs +10 -33
- package/esm2022/lib/map/index.mjs +10 -4
- package/esm2022/lib/map/map.module.mjs +10 -61
- package/esm2022/lib/map/page-loca-scatter/page-loca-scatter.component.mjs +10 -110
- package/esm2022/lib/map/page-map.start/page-map.start.component.mjs +8 -98
- package/esm2022/lib/map/page-plan-route/page-plan-route.component.mjs +8 -100
- package/esm2022/lib/nova-cloud/index.mjs +10 -2
- package/esm2022/lib/nova-cloud/nova-cloud.service.mjs +10 -148
- package/esm2022/lib/platform/cross.service.mjs +10 -63
- package/esm2022/lib/platform/index.mjs +10 -2
- package/esm2022/lib/social/index.mjs +10 -2
- package/esm2022/lib/social/wechat/wechat-jssdk.service.mjs +8 -236
- package/esm2022/lib/storage/comp-hwobs-manager/hwobs-manager.component.mjs +10 -59
- package/esm2022/lib/storage/index.mjs +10 -5
- package/esm2022/lib/storage/service-hwobs/hwobs.service.mjs +8 -130
- package/esm2022/lib/storage/service-upload/index.mjs +10 -2
- package/esm2022/lib/storage/service-upload/nova-upload.service.mjs +8 -462
- package/esm2022/lib/storage/service-upload/util-file-md5.mjs +10 -28
- package/esm2022/lib/storage/storage.module.mjs +10 -41
- package/esm2022/lib/user/account/account.service.mjs +10 -221
- package/esm2022/lib/user/captcha/captcha.component.mjs +10 -135
- package/esm2022/lib/user/comp-user-avatar/comp-user-avatar.component.mjs +10 -62
- package/esm2022/lib/user/index.mjs +10 -17
- package/esm2022/lib/user/login/auth.guard.mjs +10 -28
- package/esm2022/lib/user/login/auth.service.mjs +8 -373
- package/esm2022/lib/user/login/login.component.mjs +10 -913
- package/esm2022/lib/user/modal-user-login/modal-user-login.component.mjs +10 -273
- package/esm2022/lib/user/profile/auth-profile.guard.mjs +10 -27
- package/esm2022/lib/user/profile/auth-profile.service.mjs +10 -122
- package/esm2022/lib/user/profile/profile-bind/profile-bind.component.mjs +10 -115
- package/esm2022/lib/user/profile/profile.module.mjs +10 -57
- package/esm2022/lib/user/staff/index.mjs +10 -4
- package/esm2022/lib/user/staff/staff.guard.mjs +10 -26
- package/esm2022/lib/user/staff/staff.module.mjs +10 -18
- package/esm2022/lib/user/staff/staff.service.mjs +10 -85
- package/esm2022/lib/user/user-name.pipe.mjs +10 -29
- package/esm2022/lib/user/user.module.mjs +10 -106
- package/esm2022/lib/video/fm-video/fm-video.component.mjs +10 -67
- package/esm2022/lib/video/index.mjs +10 -2
- package/esm2022/public-api.mjs +10 -13
- package/fesm2022/fmode-ng.mjs +7 -8895
- package/fesm2022/fmode-ng.mjs.map +1 -1
- package/lib/aigc/voice/fmode-voice.service.d.ts +18 -1
- package/lib/aigc/voice/stream.player.d.ts +10 -0
- package/lib/aigc/voice/tts/fmode-tts-class.d.ts +2 -2
- package/package.json +1 -1
|
@@ -1,375 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
import Parse from "parse";
|
|
3
|
-
import { Router } from '@angular/router';
|
|
4
|
-
// import { AccountService } from '../account/account.service';
|
|
5
|
-
import { NovaCloudService } from '../../nova-cloud';
|
|
6
|
-
import { HttpClient } from '@angular/common/http';
|
|
7
|
-
import { ToastController } from '@ionic/angular/standalone';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@angular/router";
|
|
10
|
-
import * as i2 from "@ionic/angular/standalone";
|
|
11
|
-
import * as i3 from "../../nova-cloud";
|
|
12
|
-
import * as i4 from "@angular/common/http";
|
|
13
|
-
if (!Parse.applicationId) {
|
|
14
|
-
Parse.initialize("ncloudmaster");
|
|
15
|
-
Parse.serverURL = (Parse.serverURL?.split("parse")?.[0] || "https://server.fmode.cn/") + "parse";
|
|
16
|
-
}
|
|
17
|
-
export class AuthService {
|
|
18
|
-
// set isModalShow(v){
|
|
19
|
-
// this._isModalShow = v
|
|
20
|
-
// this.setAc
|
|
21
|
-
// }
|
|
22
|
-
// get isModalShow(){
|
|
23
|
-
// return this._isModalShow
|
|
24
|
-
// }
|
|
25
|
-
isGuardLock(url) {
|
|
26
|
-
let lock = true;
|
|
27
|
-
let user = Parse.User.current();
|
|
28
|
-
if (user?.id) { // 用户已登录不锁定
|
|
29
|
-
lock = false;
|
|
30
|
-
}
|
|
31
|
-
else { // 用户未登录且该页面需要守卫,则锁定
|
|
32
|
-
lock = this.guardMap[url];
|
|
33
|
-
}
|
|
34
|
-
// console.log(this.guardMap)
|
|
35
|
-
// console.log(lock)
|
|
36
|
-
return lock;
|
|
37
|
-
}
|
|
38
|
-
get loginTypeCount() {
|
|
39
|
-
return Object.values(this.loginOptions)?.filter(item => item)?.length;
|
|
40
|
-
}
|
|
41
|
-
get logoUrl() {
|
|
42
|
-
return localStorage.getItem("LOGO_URL") || this._logoUrl || "https://file.yuban.co/img/logo-feima.png";
|
|
43
|
-
}
|
|
44
|
-
set logoUrl(v) {
|
|
45
|
-
localStorage.setItem("LOGO_URL", v);
|
|
46
|
-
this._logoUrl = this._logoUrl;
|
|
47
|
-
}
|
|
48
|
-
getCompanyId() {
|
|
49
|
-
let company = localStorage.getItem("company");
|
|
50
|
-
company = this.company || company;
|
|
51
|
-
return company;
|
|
52
|
-
}
|
|
53
|
-
constructor(router,
|
|
54
|
-
// private accServ:AccountService,
|
|
55
|
-
toastCtrl, novaCloud, http) {
|
|
56
|
-
this.router = router;
|
|
57
|
-
this.toastCtrl = toastCtrl;
|
|
58
|
-
this.novaCloud = novaCloud;
|
|
59
|
-
this.http = http;
|
|
60
|
-
this.guardMap = {};
|
|
61
|
-
this.isModalShow = false;
|
|
62
|
-
this.showBackHome = true;
|
|
63
|
-
//点击按钮切换对应表单
|
|
64
|
-
this.activeButton = "账号密码"; // 默认为短信验证按钮选中
|
|
65
|
-
this.loginOptions = {
|
|
66
|
-
userpwd: true, // 帐号+密码
|
|
67
|
-
mobilepwd: true, // 手机号+密码
|
|
68
|
-
mobilecode: true, // 手机+验证码
|
|
69
|
-
wechat: true // 微信扫码登录
|
|
70
|
-
};
|
|
71
|
-
/**
|
|
72
|
-
* 企业账套:登录用户校验所在的账套
|
|
73
|
-
*/
|
|
74
|
-
this._logoUrl = "https://file.yuban.co/img/logo-feima.png";
|
|
75
|
-
this.wechatUrl = "https://file-cloud.fmode.cn/E4KpGvTEto/20230822/hv1tsm115258608.jpg";
|
|
76
|
-
/**
|
|
77
|
-
* 登录状态:默认false,登陆后为true
|
|
78
|
-
* @description
|
|
79
|
-
* 用于守卫弹窗锁定模块校验
|
|
80
|
-
*/
|
|
81
|
-
this.isLoggedIn = false;
|
|
82
|
-
this.LoginPage = '/pcuser/login';
|
|
83
|
-
// 根据手机号获得帐套内用户名
|
|
84
|
-
this.mobileUserMap = {};
|
|
85
|
-
this.enabledLocalCode = false; // 开启验证码
|
|
86
|
-
}
|
|
87
|
-
async toast(options) {
|
|
88
|
-
options.position = options?.position || "top";
|
|
89
|
-
options.duration = options?.duration || 1500;
|
|
90
|
-
options.color = options?.color || "primary";
|
|
91
|
-
let toast = await this.toastCtrl.create(options);
|
|
92
|
-
toast.present();
|
|
93
|
-
}
|
|
94
|
-
init(options) {
|
|
95
|
-
this.company = options.company;
|
|
96
|
-
this.guardType = options.guardType;
|
|
97
|
-
this.saveParamsInvite();
|
|
98
|
-
}
|
|
99
|
-
checkLoginLock() {
|
|
100
|
-
let user = Parse.User.current();
|
|
101
|
-
if (user?.id) {
|
|
102
|
-
return true;
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
this.isModalShow = true;
|
|
106
|
-
this.isLoggedIn = false;
|
|
107
|
-
return false;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
checkLogin(url) {
|
|
111
|
-
// 将url记录在被守卫页列表中,便于后续检测弹窗锁定
|
|
112
|
-
this.guardMap[url] = true;
|
|
113
|
-
// 如果已登录,验证为true无需锁定 跳出该函数
|
|
114
|
-
let currentUser = Parse.User.current();
|
|
115
|
-
console.log("currentUser", currentUser);
|
|
116
|
-
if (currentUser && currentUser.id) {
|
|
117
|
-
// this.setCurrentUserLocalStorage(currentUser)
|
|
118
|
-
this.setAccount(currentUser);
|
|
119
|
-
this.isLoggedIn = true;
|
|
120
|
-
return true;
|
|
121
|
-
}
|
|
122
|
-
// 如果未登录,判断进行两种守卫方式
|
|
123
|
-
if (!this.guardType || this.guardType == "page") { // 守卫方式1:页面跳转
|
|
124
|
-
// 否则重定向到login页面
|
|
125
|
-
// console.log(this.authService.isLoggedIn)
|
|
126
|
-
this.redirectUrl = url;
|
|
127
|
-
// console.log("请登录:",this.LoginPage)
|
|
128
|
-
this.router.navigate([this.LoginPage]);
|
|
129
|
-
return false;
|
|
130
|
-
}
|
|
131
|
-
if (this.guardType == "modal") { // 守卫方式2:弹窗锁定
|
|
132
|
-
// console.log("触发 守卫方式2:弹窗锁定")
|
|
133
|
-
this.isModalShow = true;
|
|
134
|
-
this.isLoggedIn = false;
|
|
135
|
-
return true;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
async setAccount(user) {
|
|
139
|
-
if (this.account?.id)
|
|
140
|
-
return;
|
|
141
|
-
let Account = Parse.Object.extend("Account");
|
|
142
|
-
// this.account = await this.accServ.getUserAccount(user);
|
|
143
|
-
let company = user?.get("company") || { __type: "Pointer", className: "Company", objectId: this.getCompanyId() } || null;
|
|
144
|
-
let query = new Parse.Query("Account");
|
|
145
|
-
query.equalTo("user", user.toPointer());
|
|
146
|
-
let account = await query.first();
|
|
147
|
-
if (!account?.id) {
|
|
148
|
-
account = new Account();
|
|
149
|
-
account.set({
|
|
150
|
-
user: user.toPointer(),
|
|
151
|
-
company: company,
|
|
152
|
-
});
|
|
153
|
-
account = await account.save();
|
|
154
|
-
}
|
|
155
|
-
this.account = account;
|
|
156
|
-
return account;
|
|
157
|
-
}
|
|
158
|
-
login(username, password) {
|
|
159
|
-
return new Promise((resolve, reject) => {
|
|
160
|
-
Parse.User.logIn(username, password).then(async (data) => {
|
|
161
|
-
// 检测邀请逻辑
|
|
162
|
-
this.bindInvite(data);
|
|
163
|
-
// 根据当前用户,设置帐套信息
|
|
164
|
-
this.setCurrentUserLocalStorage(data);
|
|
165
|
-
// 如果是modal弹窗登录则刷新当前页
|
|
166
|
-
if (this.guardType == "modal") {
|
|
167
|
-
await this.refreshPage();
|
|
168
|
-
resolve(true);
|
|
169
|
-
return;
|
|
170
|
-
}
|
|
171
|
-
// 如果直接进login页面,redirectUrl为undefined 导航至首页
|
|
172
|
-
let queryCom = new Parse.Query('Company');
|
|
173
|
-
queryCom.select('rootPage');
|
|
174
|
-
queryCom.equalTo('objectId', data?.get('company')?.id);
|
|
175
|
-
let com = await queryCom.first();
|
|
176
|
-
let rootPage = com?.get("rootPage");
|
|
177
|
-
this.redirectUrl = this.redirectUrl || rootPage || "/project/dashboard";
|
|
178
|
-
let url = this.redirectUrl;
|
|
179
|
-
url = decodeURIComponent(url);
|
|
180
|
-
this.router.navigate([url]);
|
|
181
|
-
}).catch(err => {
|
|
182
|
-
console.error(err);
|
|
183
|
-
reject({ message: "无此用户信息,请先在小程序登录" });
|
|
184
|
-
});
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
refreshPage() {
|
|
188
|
-
return new Promise(resolve => {
|
|
189
|
-
let currentUrl = this.router.url;
|
|
190
|
-
// location.reload(); // 页面强制刷新
|
|
191
|
-
// resolve(true)
|
|
192
|
-
if (Parse.User.current()?.id) {
|
|
193
|
-
this.isModalShow = false;
|
|
194
|
-
}
|
|
195
|
-
;
|
|
196
|
-
// NG路由重载
|
|
197
|
-
this.router.navigateByUrl('/', { skipLocationChange: true }).then(() => {
|
|
198
|
-
this.router.navigateByUrl(currentUrl).then(() => {
|
|
199
|
-
resolve(true);
|
|
200
|
-
});
|
|
201
|
-
});
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
// 用户登录后,更新帐套信息至本地存储
|
|
205
|
-
setCurrentUserLocalStorage(user) {
|
|
206
|
-
if (user.get("company")?.id) {
|
|
207
|
-
localStorage.setItem("company", user.get("company")?.id);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
logout(type, url) {
|
|
211
|
-
let company = localStorage.getItem("company");
|
|
212
|
-
let WECHAT_APP_ID = localStorage.getItem("WECHAT_APP_ID");
|
|
213
|
-
let LOGO_URL = localStorage.getItem("LOGO_URL");
|
|
214
|
-
let NOVA_APIG_SERVER = localStorage.getItem("NOVA_APIG_SERVER");
|
|
215
|
-
localStorage.clear();
|
|
216
|
-
localStorage.setItem('company', company);
|
|
217
|
-
localStorage.setItem('WECHAT_APP_ID', WECHAT_APP_ID);
|
|
218
|
-
localStorage.setItem('LOGO_URL', LOGO_URL);
|
|
219
|
-
localStorage.setItem('NOVA_APIG_SERVER', NOVA_APIG_SERVER);
|
|
220
|
-
Parse.User.logOut().then(user => {
|
|
221
|
-
});
|
|
222
|
-
this.router.navigate([url || "/pcuser/login"]);
|
|
223
|
-
}
|
|
1
|
+
|
|
224
2
|
/**
|
|
225
|
-
*
|
|
3
|
+
* @copyright © 未来飞马 © 未来全栈 www.fmode.cn
|
|
4
|
+
* 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
|
|
5
|
+
* 保留所有权利 All Rights Reserved.
|
|
6
|
+
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/user/login/auth.service.mjs
|
|
226
7
|
*/
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
if (!username) {
|
|
231
|
-
msgServ.create("error", "用户不存在,请尝试其他登录方式");
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
this.login(username, password)
|
|
235
|
-
.then(async (data) => {
|
|
236
|
-
this.isModalShow = false;
|
|
237
|
-
}).catch(err => {
|
|
238
|
-
console.log(err);
|
|
239
|
-
msgServ.create("error", "错误的用户名或密码");
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
signMobilePassword(mobile, password) {
|
|
243
|
-
return new Promise(async (resolve, reject) => {
|
|
244
|
-
let signedUser = await this.signUpAndUpdate(mobile, password);
|
|
245
|
-
resolve(signedUser);
|
|
246
|
-
});
|
|
247
|
-
}
|
|
248
|
-
async getMobileUser(mobile) {
|
|
249
|
-
let company = this.getCompanyId();
|
|
250
|
-
let userMID = company + mobile;
|
|
251
|
-
if (this.mobileUserMap[userMID])
|
|
252
|
-
return this.mobileUserMap[userMID];
|
|
253
|
-
let result = await this.novaCloud.api("/auth/getusername", {
|
|
254
|
-
company: company,
|
|
255
|
-
mobile: mobile
|
|
256
|
-
});
|
|
257
|
-
if (result?.username) {
|
|
258
|
-
this.mobileUserMap[userMID] = result?.username;
|
|
259
|
-
}
|
|
260
|
-
return this.mobileUserMap[userMID];
|
|
261
|
-
}
|
|
262
|
-
signUpAndUpdate(mobile, password) {
|
|
263
|
-
password = password || mobile + "pwd666";
|
|
264
|
-
return new Promise(resolve => {
|
|
265
|
-
Parse.User.signUp(this.getCompanyId() + "-" + mobile, password, "").then(async (signedUser) => {
|
|
266
|
-
if (signedUser.id) {
|
|
267
|
-
console.log(signedUser);
|
|
268
|
-
signedUser.set("company", {
|
|
269
|
-
__type: "Pointer",
|
|
270
|
-
className: "Company",
|
|
271
|
-
objectId: this.getCompanyId()
|
|
272
|
-
});
|
|
273
|
-
signedUser.set("mobile", mobile);
|
|
274
|
-
signedUser.set("type", "user");
|
|
275
|
-
this.bindInvite(signedUser);
|
|
276
|
-
signedUser = await signedUser.save();
|
|
277
|
-
resolve(signedUser);
|
|
278
|
-
}
|
|
279
|
-
}).catch(error => {
|
|
280
|
-
resolve(undefined);
|
|
281
|
-
});
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
async getMobileCodeToken(mobile, code) {
|
|
285
|
-
return new Promise((resolve, reject) => {
|
|
286
|
-
let host = Parse.serverURL?.split("parse")?.[0] || "https://server.fmode.cn/";
|
|
287
|
-
this.http.get(host + `api/auth/mobile?company=${this.company}&mobile=${mobile}&code=${code}`).toPromise().then(res => {
|
|
288
|
-
resolve(res);
|
|
289
|
-
}).catch(error => {
|
|
290
|
-
reject(error);
|
|
291
|
-
});
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
/* 验证码登录 */
|
|
295
|
-
async loginCode(mobile, code, msgServ, closeCallBack) {
|
|
296
|
-
if (!code) {
|
|
297
|
-
this.toast({ color: "primary", message: "请填写有效验证码" });
|
|
298
|
-
return;
|
|
299
|
-
}
|
|
300
|
-
try {
|
|
301
|
-
let res = await this.getMobileCodeToken(mobile, code);
|
|
302
|
-
if (res?.code == 200) {
|
|
303
|
-
console.log(200, res);
|
|
304
|
-
let logUser = await Parse.User.become(res.data.token);
|
|
305
|
-
console.log(logUser, logUser?.id);
|
|
306
|
-
if (logUser?.id) {
|
|
307
|
-
console.log(logUser, logUser?.id);
|
|
308
|
-
// 检测邀请逻辑
|
|
309
|
-
try {
|
|
310
|
-
await this.bindInvite(logUser);
|
|
311
|
-
}
|
|
312
|
-
catch (errb) {
|
|
313
|
-
console.error("bind err b", errb);
|
|
314
|
-
}
|
|
315
|
-
return true;
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
catch (e) {
|
|
320
|
-
console.log("error1", e);
|
|
321
|
-
if (e?.error?.mess?.indexOf("用户不存在") > -1) { // 自动注册
|
|
322
|
-
let signedUser = await this.signUpAndUpdate(mobile);
|
|
323
|
-
if (signedUser?.id) {
|
|
324
|
-
return await this.loginCode(mobile, code);
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
else {
|
|
328
|
-
this.toast({ message: e?.error?.mess });
|
|
329
|
-
return;
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
saveParamsInvite() {
|
|
334
|
-
let searchParams = this.novaCloud.searchParse();
|
|
335
|
-
console.log("saveParamsInvite", searchParams);
|
|
336
|
-
let invite = searchParams?.invite;
|
|
337
|
-
console.log(invite);
|
|
338
|
-
if (invite)
|
|
339
|
-
localStorage.setItem("invite", searchParams?.invite);
|
|
340
|
-
}
|
|
341
|
-
async bindInvite(current) {
|
|
342
|
-
current = current || Parse.User.current();
|
|
343
|
-
if (!current)
|
|
344
|
-
return; // 当前用户必须存在
|
|
345
|
-
if (current?.get("invite")?.id)
|
|
346
|
-
return; // 当前用户无邀请关系
|
|
347
|
-
let invite = localStorage.getItem("invite");
|
|
348
|
-
if (!invite)
|
|
349
|
-
return; // 本地存储邀请码必须存在
|
|
350
|
-
if (current?.id == invite)
|
|
351
|
-
return; // 不能邀请自己
|
|
352
|
-
let res;
|
|
353
|
-
try {
|
|
354
|
-
res = await this.novaCloud.api("/auth/invite", {
|
|
355
|
-
current: current?.id,
|
|
356
|
-
invite: invite,
|
|
357
|
-
type: "code"
|
|
358
|
-
});
|
|
359
|
-
console.log("bind", res);
|
|
360
|
-
}
|
|
361
|
-
catch (err) {
|
|
362
|
-
console.error("bind err", err);
|
|
363
|
-
}
|
|
364
|
-
return;
|
|
365
|
-
}
|
|
366
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthService, deps: [{ token: i1.Router }, { token: i2.ToastController }, { token: i3.NovaCloudService }, { token: i4.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
367
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthService, providedIn: 'root' }); }
|
|
368
|
-
}
|
|
369
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthService, decorators: [{
|
|
370
|
-
type: Injectable,
|
|
371
|
-
args: [{
|
|
372
|
-
providedIn: 'root',
|
|
373
|
-
}]
|
|
374
|
-
}], ctorParameters: () => [{ type: i1.Router }, { type: i2.ToastController }, { type: i3.NovaCloudService }, { type: i4.HttpClient }] });
|
|
375
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm1vZGUtbmcvc3JjL2xpYi91c2VyL2xvZ2luL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQU0xQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsK0RBQStEO0FBQy9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7OztBQVY1RCxJQUFHLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBQyxDQUFDO0lBQ3ZCLEtBQUssQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDaEMsS0FBYSxDQUFDLFNBQVMsR0FBRyxDQUFFLEtBQWEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksMEJBQTBCLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDckgsQ0FBQztBQVlELE1BQU0sT0FBTyxXQUFXO0lBVXRCLHNCQUFzQjtJQUN0QiwwQkFBMEI7SUFDMUIsZUFBZTtJQUNmLElBQUk7SUFDSixxQkFBcUI7SUFDckIsNkJBQTZCO0lBQzdCLElBQUk7SUFDSixXQUFXLENBQUMsR0FBRztRQUNiLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQTtRQUNmLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEMsSUFBRyxJQUFJLEVBQUUsRUFBRSxFQUFDLENBQUMsQ0FBQyxXQUFXO1lBQ3ZC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SUFBSSxNQUFNO1lBQUcsT0FBTSxDQUFDLFNBQVM7UUFDM0MsSUFBSSxHQUFHLENBQUE7UUFFUCxJQUFHLENBQUM7WUFDRixHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUM7Z0JBQzVDLE9BQU8sRUFBQyxPQUFPLEVBQUUsRUFBRTtnQkFDbkIsTUFBTSxFQUFDLE1BQU07Z0JBQ2IsSUFBSSxFQUFDLE1BQU07YUFDWixDQUFDLENBQUE7WUFDRixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBQyxHQUFHLENBQUMsQ0FBQTtRQUN6QixDQUFDO1FBQUEsT0FBTSxHQUFHLEVBQUMsQ0FBQztZQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQy9CLENBQUM7UUFDRCxPQUFNO0lBRVIsQ0FBQzsrR0FuWVUsV0FBVzttSEFBWCxXQUFXLGNBRlYsTUFBTTs7NEZBRVAsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgUGFyc2UgZnJvbSBcInBhcnNlXCI7XG5pZighUGFyc2UuYXBwbGljYXRpb25JZCl7XG4gIFBhcnNlLmluaXRpYWxpemUoXCJuY2xvdWRtYXN0ZXJcIik7XG4gIChQYXJzZSBhcyBhbnkpLnNlcnZlclVSTCA9ICgoUGFyc2UgYXMgYW55KS5zZXJ2ZXJVUkw/LnNwbGl0KFwicGFyc2VcIik/LlswXSB8fCBcImh0dHBzOi8vc2VydmVyLmZtb2RlLmNuL1wiKSArIFwicGFyc2VcIjtcbn1cblxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbi8vIGltcG9ydCB7IEFjY291bnRTZXJ2aWNlIH0gZnJvbSAnLi4vYWNjb3VudC9hY2NvdW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgTm92YUNsb3VkU2VydmljZSB9IGZyb20gJy4uLy4uL25vdmEtY2xvdWQnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IGNhdGNoRXJyb3IgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IFRvYXN0Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQXV0aFNlcnZpY2Uge1xuXG4gIC8qKlxuICAgKiDlrojljavmlrnlvI/vvJrmnYPpmZDpqozor4HplIHlrprmlrnlvI9cbiAgICogQHR5cGUgXCJwYWdlXCJ8XCJtb2RhbFwiIHBhZ2XpobXpnaLot7PovawgbW9kYWzlvLnnqpfplIHlrppcbiAgICovXG4gIGd1YXJkVHlwZTpcInBhZ2VcInxcIm1vZGFsXCJcbiAgZ3VhcmRNYXA6YW55ID0ge31cblxuICBpc01vZGFsU2hvdzpib29sZWFuID0gZmFsc2VcbiAgLy8gc2V0IGlzTW9kYWxTaG93KHYpe1xuICAvLyAgIHRoaXMuX2lzTW9kYWxTaG93ID0gdlxuICAvLyAgIHRoaXMuc2V0QWNcbiAgLy8gfVxuICAvLyBnZXQgaXNNb2RhbFNob3coKXtcbiAgLy8gICByZXR1cm4gdGhpcy5faXNNb2RhbFNob3dcbiAgLy8gfVxuICBpc0d1YXJkTG9jayh1cmwpe1xuICAgIGxldCBsb2NrID0gdHJ1ZVxuICAgIGxldCB1c2VyID0gUGFyc2UuVXNlci5jdXJyZW50KCk7XG4gICAgaWYodXNlcj8uaWQpeyAvLyDnlKjmiLflt7LnmbvlvZXkuI3plIHlrppcbiAgICAgIGxvY2sgPSBmYWxzZVxuICAgIH1lbHNleyAvLyDnlKjmiLfmnKrnmbvlvZXkuJTor6XpobXpnaLpnIDopoHlrojljavvvIzliJnplIHlrppcbiAgICAgIGxvY2sgPSB0aGlzLmd1YXJkTWFwW3VybF1cbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5ndWFyZE1hcClcbiAgICAvLyBjb25zb2xlLmxvZyhsb2NrKVxuICAgIHJldHVybiBsb2NrXG4gIH1cblxuICBzaG93QmFja0hvbWU6Ym9vbGVhbiA9IHRydWU7XG4gIC8v54K55Ye75oyJ6ZKu5YiH5o2i5a+55bqU6KGo5Y2VXG4gIGFjdGl2ZUJ1dHRvbjogc3RyaW5nID0gXCLotKblj7flr4bnoIFcIjsgLy8g6buY6K6k5Li655+t5L+h6aqM6K+B5oyJ6ZKu6YCJ5LitXG4gIGxvZ2luT3B0aW9uczp7XG4gICAgdXNlcnB3ZD86Ym9vbGVhbixcbiAgICBtb2JpbGVwd2Q/OmJvb2xlYW4sXG4gICAgbW9iaWxlY29kZT86Ym9vbGVhbixcbiAgICB3ZWNoYXQ/OmJvb2xlYW4sXG4gIH0gPSB7XG4gICAgdXNlcnB3ZDp0cnVlLCAvLyDluJDlj7cr5a+G56CBXG4gICAgbW9iaWxlcHdkOnRydWUsIC8vIOaJi+acuuWPtyvlr4bnoIFcbiAgICBtb2JpbGVjb2RlOnRydWUsIC8vIOaJi+acuivpqozor4HnoIFcbiAgICB3ZWNoYXQ6dHJ1ZSAvLyDlvq7kv6HmiavnoIHnmbvlvZVcbiAgfVxuICBnZXQgbG9naW5UeXBlQ291bnQoKXtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmxvZ2luT3B0aW9ucyk/LmZpbHRlcihpdGVtPT5pdGVtKT8ubGVuZ3RoXG4gIH1cblxuICAvKipcbiAgICog5LyB5Lia6LSm5aWX77ya55m75b2V55So5oi35qCh6aqM5omA5Zyo55qE6LSm5aWXXG4gICAqL1xuICBfbG9nb1VybCA9IFwiaHR0cHM6Ly9maWxlLnl1YmFuLmNvL2ltZy9sb2dvLWZlaW1hLnBuZ1wiXG4gIGdldCBsb2dvVXJsKCl7XG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiTE9HT19VUkxcIikgfHwgdGhpcy5fbG9nb1VybCB8fCBcImh0dHBzOi8vZmlsZS55dWJhbi5jby9pbWcvbG9nby1mZWltYS5wbmdcIlxuICB9XG4gIHNldCBsb2dvVXJsKHYpe1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiTE9HT19VUkxcIix2KVxuICAgIHRoaXMuX2xvZ29VcmwgPSB0aGlzLl9sb2dvVXJsXG4gIH1cbiAgY29tcGFueTpzdHJpbmdcbiAgZ2V0Q29tcGFueUlkKCl7XG4gICAgbGV0IGNvbXBhbnkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImNvbXBhbnlcIik7XG4gICAgY29tcGFueSA9IHRoaXMuY29tcGFueSB8fCBjb21wYW55XG4gICAgcmV0dXJuIGNvbXBhbnlcbiAgfVxuICBcbiAgd2VjaGF0VXJsOnN0cmluZyA9IFwiaHR0cHM6Ly9maWxlLWNsb3VkLmZtb2RlLmNuL0U0S3BHdlRFdG8vMjAyMzA4MjIvaHYxdHNtMTE1MjU4NjA4LmpwZ1wiXG5cbiAgLyoqXG4gICAqIOi1hOmHkei0puaIt++8mnVzZXLoh6rliqjliJvlu7rllK/kuIDotYTph5HotKbmiLdcbiAgICovXG4gIGFjY291bnQ6UGFyc2UuT2JqZWN0XG5cbiAgLyoqXG4gICAqIOeZu+W9leeKtuaAge+8mum7mOiupGZhbHNl77yM55m76ZmG5ZCO5Li6dHJ1ZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICog55So5LqO5a6I5Y2r5by556qX6ZSB5a6a5qih5Z2X5qCh6aqMXG4gICAqL1xuICBpc0xvZ2dlZEluID0gZmFsc2U7XG5cbiAgLy8gc3RvcmUgdGhlIFVSTCBzbyB3ZSBjYW4gcmVkaXJlY3QgYWZ0ZXIgbG9nZ2luZyBpblxuICByZWRpcmVjdFVybDogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcm91dGVyOiBSb3V0ZXIsXG4gICAgLy8gcHJpdmF0ZSBhY2NTZXJ2OkFjY291bnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3RDdHJsOlRvYXN0Q29udHJvbGxlcixcbiAgICBwcml2YXRlIG5vdmFDbG91ZDpOb3ZhQ2xvdWRTZXJ2aWNlLHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwpIHtcbiAgfVxuICBhc3luYyB0b2FzdChvcHRpb25zOmFueSl7XG4gICAgb3B0aW9ucy5wb3NpdGlvbiA9IG9wdGlvbnM/LnBvc2l0aW9uIHx8IFwidG9wXCJcbiAgICBvcHRpb25zLmR1cmF0aW9uID0gb3B0aW9ucz8uZHVyYXRpb24gfHwgMTUwMFxuICAgIG9wdGlvbnMuY29sb3IgPSBvcHRpb25zPy5jb2xvciB8fCBcInByaW1hcnlcIlxuICAgIGxldCB0b2FzdCA9IGF3YWl0IHRoaXMudG9hc3RDdHJsLmNyZWF0ZShvcHRpb25zKVxuICAgIHRvYXN0LnByZXNlbnQoKVxuICB9XG4gIGluaXQob3B0aW9uczp7XG4gICAgY29tcGFueT86c3RyaW5nXG4gICAgZ3VhcmRUeXBlPzpcInBhZ2VcInxcIm1vZGFsXCJcbiAgICBMb2dpblBhZ2U/OnN0cmluZ1xuICB9KXtcbiAgICB0aGlzLmNvbXBhbnkgPSBvcHRpb25zLmNvbXBhbnk7XG4gICAgdGhpcy5ndWFyZFR5cGUgPSBvcHRpb25zLmd1YXJkVHlwZVxuICAgIHRoaXMuc2F2ZVBhcmFtc0ludml0ZSgpXG4gIH1cbiAgY2hlY2tMb2dpbkxvY2soKXtcbiAgICBsZXQgdXNlciA9IFBhcnNlLlVzZXIuY3VycmVudCgpO1xuICAgIGlmKHVzZXI/LmlkKXtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfWVsc2V7XG4gICAgICB0aGlzLmlzTW9kYWxTaG93ID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNMb2dnZWRJbiA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIExvZ2luUGFnZSA9ICcvcGN1c2VyL2xvZ2luJ1xuICBjaGVja0xvZ2luKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG5cbiAgICAvLyDlsIZ1cmzorrDlvZXlnKjooqvlrojljavpobXliJfooajkuK3vvIzkvr/kuo7lkI7nu63mo4DmtYvlvLnnqpfplIHlrppcbiAgICB0aGlzLmd1YXJkTWFwW3VybF0gPSB0cnVlO1xuXG4gICAgLy8g5aaC5p6c5bey55m75b2V77yM6aqM6K+B5Li6dHJ1ZeaXoOmcgOmUgeWumiDot7Plh7ror6Xlh73mlbBcbiAgICBsZXQgY3VycmVudFVzZXIgPSBQYXJzZS5Vc2VyLmN1cnJlbnQoKTtcbiAgICBcbiAgICBjb25zb2xlLmxvZyhcImN1cnJlbnRVc2VyXCIsY3VycmVudFVzZXIpXG4gICAgaWYgKGN1cnJlbnRVc2VyJiZjdXJyZW50VXNlci5pZCkgeyBcbiAgICAgIC8vIHRoaXMuc2V0Q3VycmVudFVzZXJMb2NhbFN0b3JhZ2UoY3VycmVudFVzZXIpXG4gICAgICB0aGlzLnNldEFjY291bnQoY3VycmVudFVzZXIpO1xuICAgICAgdGhpcy5pc0xvZ2dlZEluID0gdHJ1ZVxuICAgICAgcmV0dXJuIHRydWU7IFxuICAgIH1cblxuICAgIC8vIOWmguaenOacqueZu+W9le+8jOWIpOaWrei/m+ihjOS4pOenjeWuiOWNq+aWueW8j1xuICAgIGlmKCF0aGlzLmd1YXJkVHlwZSB8fCB0aGlzLmd1YXJkVHlwZT09XCJwYWdlXCIpeyAvLyDlrojljavmlrnlvI8x77ya6aG16Z2i6Lez6L2sXG4gICAgICAvLyDlkKbliJnph43lrprlkJHliLBsb2dpbumhtemdolxuICAgICAgLy8gY29uc29sZS5sb2codGhpcy5hdXRoU2VydmljZS5pc0xvZ2dlZEluKVxuICAgICAgdGhpcy5yZWRpcmVjdFVybCA9IHVybDtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwi6K+355m75b2V77yaXCIsdGhpcy5Mb2dpblBhZ2UpXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5Mb2dpblBhZ2VdKTtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZih0aGlzLmd1YXJkVHlwZT09XCJtb2RhbFwiKXsgLy8g5a6I5Y2r5pa55byPMu+8muW8ueeql+mUgeWumlxuICAgICAgLy8gY29uc29sZS5sb2coXCLop6blj5Eg5a6I5Y2r5pa55byPMu+8muW8ueeql+mUgeWumlwiKVxuICAgICAgdGhpcy5pc01vZGFsU2hvdyA9IHRydWU7XG4gICAgICB0aGlzLmlzTG9nZ2VkSW4gPSBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG4gIGFzeW5jIHNldEFjY291bnQodXNlcil7XG4gICAgaWYodGhpcy5hY2NvdW50Py5pZCkgcmV0dXJuO1xuICAgIGxldCBBY2NvdW50ID0gUGFyc2UuT2JqZWN0LmV4dGVuZChcIkFjY291bnRcIilcbiAgICAvLyB0aGlzLmFjY291bnQgPSBhd2FpdCB0aGlzLmFjY1NlcnYuZ2V0VXNlckFjY291bnQodXNlcik7XG4gICAgbGV0IGNvbXBhbnkgPSB1c2VyPy5nZXQoXCJjb21wYW55XCIpIHx8IHtfX3R5cGU6XCJQb2ludGVyXCIsY2xhc3NOYW1lOlwiQ29tcGFueVwiLG9iamVjdElkOnRoaXMuZ2V0Q29tcGFueUlkKCl9IHx8IG51bGxcbiAgICBsZXQgcXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkoXCJBY2NvdW50XCIpO1xuICAgIHF1ZXJ5LmVxdWFsVG8oXCJ1c2VyXCIsdXNlci50b1BvaW50ZXIoKSlcbiAgICBsZXQgYWNjb3VudCA9IGF3YWl0IHF1ZXJ5LmZpcnN0KCk7XG4gICAgaWYoIWFjY291bnQ/LmlkKXtcbiAgICAgIGFjY291bnQgPSBuZXcgQWNjb3VudCgpO1xuICAgICAgYWNjb3VudC5zZXQoe1xuICAgICAgICB1c2VyOnVzZXIudG9Qb2ludGVyKCksXG4gICAgICAgIGNvbXBhbnk6Y29tcGFueSxcbiAgICAgIH0pXG4gICAgICBhY2NvdW50ID0gYXdhaXQgYWNjb3VudC5zYXZlKCk7XG4gICAgfVxuICAgIHRoaXMuYWNjb3VudCA9IGFjY291bnRcbiAgICByZXR1cm4gYWNjb3VudFxuICB9XG5cbiAgbG9naW4odXNlcm5hbWUsIHBhc3N3b3JkKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9PntcbiAgICAgIFBhcnNlLlVzZXIubG9nSW4odXNlcm5hbWUsIHBhc3N3b3JkKS50aGVuKCBhc3luYyBkYXRhID0+IHtcblxuICAgICAgLy8g5qOA5rWL6YKA6K+36YC76L6RXG4gICAgICB0aGlzLmJpbmRJbnZpdGUoZGF0YSk7XG5cbiAgICAgIC8vIOagueaNruW9k+WJjeeUqOaIt++8jOiuvue9ruW4kOWll+S/oeaBr1xuICAgICAgdGhpcy5zZXRDdXJyZW50VXNlckxvY2FsU3RvcmFnZShkYXRhKTtcbiAgICAgIFxuICAgICAgLy8g5aaC5p6c5pivbW9kYWzlvLnnqpfnmbvlvZXliJnliLfmlrDlvZPliY3pobVcbiAgICAgIGlmKHRoaXMuZ3VhcmRUeXBlPT1cIm1vZGFsXCIpe1xuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hQYWdlKCk7XG4gICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIOWmguaenOebtOaOpei/m2xvZ2lu6aG16Z2i77yMcmVkaXJlY3RVcmzkuLp1bmRlZmluZWQg5a+86Iiq6Iez6aaW6aG1XG4gICAgICBsZXQgcXVlcnlDb20gPSBuZXcgUGFyc2UuUXVlcnkoJ0NvbXBhbnknKVxuICAgICAgcXVlcnlDb20uc2VsZWN0KCdyb290UGFnZScpXG4gICAgICBxdWVyeUNvbS5lcXVhbFRvKCdvYmplY3RJZCcsZGF0YT8uZ2V0KCdjb21wYW55Jyk/LmlkKVxuICAgICAgbGV0IGNvbSA9IGF3YWl0IHF1ZXJ5Q29tLmZpcnN0KClcbiAgICAgICAgbGV0IHJvb3RQYWdlID0gY29tPy5nZXQoXCJyb290UGFnZVwiKVxuICAgICAgICAgdGhpcy5yZWRpcmVjdFVybCA9ICB0aGlzLnJlZGlyZWN0VXJsIHx8IHJvb3RQYWdlIHx8IFwiL3Byb2plY3QvZGFzaGJvYXJkXCJcbiAgICAgICBsZXQgdXJsID0gdGhpcy5yZWRpcmVjdFVybDtcbiAgICAgICB1cmwgPSBkZWNvZGVVUklDb21wb25lbnQodXJsKTtcbiAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdXJsXSk7XG4gICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICAgY29uc29sZS5lcnJvcihlcnIpXG4gICAgICAgcmVqZWN0KHsgbWVzc2FnZTogXCLml6DmraTnlKjmiLfkv6Hmga/vvIzor7flhYjlnKjlsI/nqIvluo/nmbvlvZVcIiB9KVxuICAgIH0pXG4gICB9KVxuIH1cbiByZWZyZXNoUGFnZSgpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmU9PntcbiAgICBsZXQgY3VycmVudFVybCA9IHRoaXMucm91dGVyLnVybDtcblxuICAgIC8vIGxvY2F0aW9uLnJlbG9hZCgpOyAvLyDpobXpnaLlvLrliLbliLfmlrBcbiAgICAvLyByZXNvbHZlKHRydWUpXG4gICAgaWYoUGFyc2UuVXNlci5jdXJyZW50KCk/LmlkKXt0aGlzLmlzTW9kYWxTaG93PWZhbHNlfTtcblxuICAgIC8vIE5H6Lev55Sx6YeN6L29XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCgnLycsIHsgc2tpcExvY2F0aW9uQ2hhbmdlOiB0cnVlIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChjdXJyZW50VXJsKS50aGVuKCgpPT57XG4gICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgIH0pXG4gICAgfSk7XG4gIH0pXG59XG5cbiAvLyDnlKjmiLfnmbvlvZXlkI7vvIzmm7TmlrDluJDlpZfkv6Hmga/oh7PmnKzlnLDlrZjlgqhcbiBzZXRDdXJyZW50VXNlckxvY2FsU3RvcmFnZSh1c2VyOlBhcnNlLlVzZXIpe1xuICBpZih1c2VyLmdldChcImNvbXBhbnlcIik/LmlkKXtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImNvbXBhbnlcIix1c2VyLmdldChcImNvbXBhbnlcIik/LmlkKVxuICB9XG4gfVxuXG4gbG9nb3V0KHR5cGUsdXJsKTogdm9pZCB7XG4gICAgbGV0IGNvbXBhbnkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImNvbXBhbnlcIik7XG4gICAgbGV0IFdFQ0hBVF9BUFBfSUQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIldFQ0hBVF9BUFBfSURcIik7XG4gICAgbGV0IExPR09fVVJMID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJMT0dPX1VSTFwiKTtcbiAgICBsZXQgTk9WQV9BUElHX1NFUlZFUiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiTk9WQV9BUElHX1NFUlZFUlwiKTtcbiAgICBsb2NhbFN0b3JhZ2UuY2xlYXIoKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY29tcGFueScsY29tcGFueSk7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ1dFQ0hBVF9BUFBfSUQnLFdFQ0hBVF9BUFBfSUQpO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdMT0dPX1VSTCcsTE9HT19VUkwpO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdOT1ZBX0FQSUdfU0VSVkVSJyxOT1ZBX0FQSUdfU0VSVkVSKTtcbiAgICBcbiAgICBQYXJzZS5Vc2VyLmxvZ091dCgpLnRoZW4odXNlcj0+e1xuICAgIH0pO1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt1cmx8fFwiL3BjdXNlci9sb2dpblwiXSk7XG4gIH1cblxuICAvKiogXG4gICAqIOagueaNruW4kOWll+WGhW1vYmlsZeWtl+auteeZu+W9lemAu+i+kVxuICAgKi9cbiAgLy8g5omL5py65Y+3K+WvhueggeeZu+W9lVxuICBhc3luYyBsb2dpbk1vYmlsZVBhc3N3b3JkKG1vYmlsZTpzdHJpbmcscGFzc3dvcmQ6c3RyaW5nLG1zZ1NlcnYpe1xuICAgIGxldCB1c2VybmFtZSA9IGF3YWl0IHRoaXMuZ2V0TW9iaWxlVXNlcihtb2JpbGUpXG4gICAgaWYoIXVzZXJuYW1lKXtcbiAgICAgIG1zZ1NlcnYuY3JlYXRlKFwiZXJyb3JcIiwgXCLnlKjmiLfkuI3lrZjlnKjvvIzor7flsJ3or5Xlhbbku5bnmbvlvZXmlrnlvI9cIik7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5sb2dpbih1c2VybmFtZSwgcGFzc3dvcmQpXG4gICAgICAudGhlbihhc3luYyBkYXRhID0+IHtcbiAgICAgICAgdGhpcy5pc01vZGFsU2hvdyA9IGZhbHNlO1xuICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyKVxuICAgICAgICBtc2dTZXJ2LmNyZWF0ZShcImVycm9yXCIsIFwi6ZSZ6K+v55qE55So5oi35ZCN5oiW5a+G56CBXCIpO1xuICAgICAgfSk7XG4gIH1cbiAgc2lnbk1vYmlsZVBhc3N3b3JkKG1vYmlsZTpzdHJpbmcscGFzc3dvcmQ6c3RyaW5nKTpQcm9taXNlPGFueT57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLHJlamVjdCk9PntcbiAgICAgIGxldCBzaWduZWRVc2VyID0gYXdhaXQgdGhpcy5zaWduVXBBbmRVcGRhdGUobW9iaWxlLHBhc3N3b3JkKTtcbiAgICAgIHJlc29sdmUoc2lnbmVkVXNlcilcbiAgICB9KVxuXG4gIH1cbiAgLy8g5qC55o2u5omL5py65Y+36I635b6X5biQ5aWX5YaF55So5oi35ZCNXG4gIG1vYmlsZVVzZXJNYXAgPSB7fVxuICBhc3luYyBnZXRNb2JpbGVVc2VyKG1vYmlsZTpzdHJpbmcpe1xuICAgIGxldCBjb21wYW55ID0gdGhpcy5nZXRDb21wYW55SWQoKVxuICAgIGxldCB1c2VyTUlEID0gY29tcGFueSttb2JpbGVcbiAgICBpZih0aGlzLm1vYmlsZVVzZXJNYXBbdXNlck1JRF0pIHJldHVybiB0aGlzLm1vYmlsZVVzZXJNYXBbdXNlck1JRF1cbiAgICBsZXQgcmVzdWx0OmFueSA9IGF3YWl0IHRoaXMubm92YUNsb3VkLmFwaShcIi9hdXRoL2dldHVzZXJuYW1lXCIse1xuICAgICAgY29tcGFueTpjb21wYW55LFxuICAgICAgbW9iaWxlOm1vYmlsZVxuICAgIH0pXG4gICAgaWYocmVzdWx0Py51c2VybmFtZSl7XG4gICAgICB0aGlzLm1vYmlsZVVzZXJNYXBbdXNlck1JRF0gPSByZXN1bHQ/LnVzZXJuYW1lXG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1vYmlsZVVzZXJNYXBbdXNlck1JRF1cbiAgfVxuICBlbmFibGVkTG9jYWxDb2RlOmJvb2xlYW4gPSBmYWxzZTsgLy8g5byA5ZCv6aqM6K+B56CBXG5cbiAgc2lnblVwQW5kVXBkYXRlKG1vYmlsZSxwYXNzd29yZD86c3RyaW5nKTpQcm9taXNlPFBhcnNlLk9iamVjdHx1bmRlZmluZWQ+e1xuICAgIHBhc3N3b3JkID0gcGFzc3dvcmQgfHwgbW9iaWxlK1wicHdkNjY2XCJcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZT0+e1xuICAgICAgUGFyc2UuVXNlci5zaWduVXAoXG4gICAgICAgIHRoaXMuZ2V0Q29tcGFueUlkKCkrXCItXCIgKyBtb2JpbGUsXG4gICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgXCJcIlxuICAgICAgICApLnRoZW4oYXN5bmMgc2lnbmVkVXNlcj0+e1xuICAgICAgICAgIGlmIChzaWduZWRVc2VyLmlkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhzaWduZWRVc2VyKVxuICAgICAgICAgICAgc2lnbmVkVXNlci5zZXQoXCJjb21wYW55XCIsIHtcbiAgICAgICAgICAgICAgX190eXBlOiBcIlBvaW50ZXJcIixcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkNvbXBhbnlcIixcbiAgICAgICAgICAgICAgb2JqZWN0SWQ6IHRoaXMuZ2V0Q29tcGFueUlkKClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2lnbmVkVXNlci5zZXQoXCJtb2JpbGVcIiwgbW9iaWxlKTtcbiAgICAgICAgICAgIHNpZ25lZFVzZXIuc2V0KFwidHlwZVwiLFwidXNlclwiKTtcbiAgICAgICAgICAgIHRoaXMuYmluZEludml0ZShzaWduZWRVc2VyKTtcbiAgICAgICAgICAgIHNpZ25lZFVzZXIgPSBhd2FpdCBzaWduZWRVc2VyLnNhdmUoKTtcbiAgICAgICAgICAgIHJlc29sdmUoc2lnbmVkVXNlcilcbiAgICAgICAgICB9XG4gICAgICAgIH0pLmNhdGNoKGVycm9yPT57XG4gICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGdldE1vYmlsZUNvZGVUb2tlbihtb2JpbGUsY29kZSk6UHJvbWlzZTxhbnk+e1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT57XG4gICAgICBsZXQgaG9zdCA9IChQYXJzZSBhcyBhbnkpLnNlcnZlclVSTD8uc3BsaXQoXCJwYXJzZVwiKT8uWzBdIHx8IFwiaHR0cHM6Ly9zZXJ2ZXIuZm1vZGUuY24vXCJcbiAgICAgIHRoaXMuaHR0cC5nZXQoaG9zdCtgYXBpL2F1dGgvbW9iaWxlP2NvbXBhbnk9JHt0aGlzLmNvbXBhbnl9Jm1vYmlsZT0ke21vYmlsZX0mY29kZT0ke2NvZGV9YCkudG9Qcm9taXNlKCkudGhlbihyZXM9PntcbiAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgfSkuY2F0Y2goZXJyb3I9PntcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pXG4gICAgfSlcbiAgICAgIFxuICB9XG5cbiAgLyog6aqM6K+B56CB55m75b2VICovXG4gIGFzeW5jIGxvZ2luQ29kZShtb2JpbGU6c3RyaW5nLCBjb2RlOnN0cmluZywgbXNnU2Vydj8sY2xvc2VDYWxsQmFjaz86YW55KTogUHJvbWlzZTxCb29sZWFuPiB7XG4gICAgICBpZiAoIWNvZGUpIHtcbiAgICAgICAgdGhpcy50b2FzdCh7Y29sb3I6XCJwcmltYXJ5XCIsbWVzc2FnZTpcIuivt+Whq+WGmeacieaViOmqjOivgeeggVwifSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnl7XG4gICAgICAgIGxldCByZXMgPSBhd2FpdCB0aGlzLmdldE1vYmlsZUNvZGVUb2tlbihtb2JpbGUsY29kZSk7XG4gICAgICAgIGlmIChyZXM/LmNvZGUgPT0gMjAwKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coMjAwLHJlcylcblxuICAgICAgICAgIGxldCBsb2dVc2VyID0gYXdhaXQgUGFyc2UuVXNlci5iZWNvbWUocmVzLmRhdGEudG9rZW4pO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGxvZ1VzZXIsbG9nVXNlcj8uaWQpXG4gICAgICAgICAgaWYgKGxvZ1VzZXI/LmlkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhsb2dVc2VyLGxvZ1VzZXI/LmlkKVxuICAgICAgICAgICAgLy8g5qOA5rWL6YKA6K+36YC76L6RXG4gICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuYmluZEludml0ZShsb2dVc2VyKTtcbiAgICAgICAgICAgIH1jYXRjaChlcnJiKXtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcImJpbmQgZXJyIGJcIixlcnJiKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9Y2F0Y2goZSl7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3IxXCIsZSk7XG4gICAgICAgIGlmKGU/LmVycm9yPy5tZXNzPy5pbmRleE9mKFwi55So5oi35LiN5a2Y5ZyoXCIpPi0xKXsgLy8g6Ieq5Yqo5rOo5YaMXG4gICAgICAgICAgbGV0IHNpZ25lZFVzZXIgPSBhd2FpdCB0aGlzLnNpZ25VcEFuZFVwZGF0ZShtb2JpbGUpO1xuICAgICAgICAgIGlmKHNpZ25lZFVzZXI/LmlkKXtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmxvZ2luQ29kZShtb2JpbGUsY29kZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICB0aGlzLnRvYXN0KHttZXNzYWdlOmU/LmVycm9yPy5tZXNzfSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuICB9XG4gIHNhdmVQYXJhbXNJbnZpdGUoKXtcbiAgICBsZXQgc2VhcmNoUGFyYW1zID0gdGhpcy5ub3ZhQ2xvdWQuc2VhcmNoUGFyc2UoKVxuICAgIGNvbnNvbGUubG9nKFwic2F2ZVBhcmFtc0ludml0ZVwiLHNlYXJjaFBhcmFtcylcbiAgICBsZXQgaW52aXRlID0gc2VhcmNoUGFyYW1zPy5pbnZpdGU7XG4gICAgY29uc29sZS5sb2coaW52aXRlKVxuICAgIGlmKGludml0ZSkgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJpbnZpdGVcIixzZWFyY2hQYXJhbXM/Lmludml0ZSlcbiAgfVxuICBhc3luYyBiaW5kSW52aXRlKGN1cnJlbnQ/OmFueSl7XG4gICAgY3VycmVudCA9IGN1cnJlbnQgfHwgUGFyc2UuVXNlci5jdXJyZW50KCk7XG4gICAgaWYoIWN1cnJlbnQpIHJldHVybiAvLyDlvZPliY3nlKjmiLflv4XpobvlrZjlnKhcbiAgICBpZihjdXJyZW50Py5nZXQoXCJpbnZpdGVcIik/LmlkKSByZXR1cm4gLy8g5b2T5YmN55So5oi35peg6YKA6K+35YWz57O7XG4gICAgXG4gICAgbGV0IGludml0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaW52aXRlXCIpIFxuICAgIGlmKCFpbnZpdGUpIHJldHVybiAvLyDmnKzlnLDlrZjlgqjpgoDor7fnoIHlv4XpobvlrZjlnKhcbiAgICBpZihjdXJyZW50Py5pZCA9PSBpbnZpdGUgKSByZXR1cm4gLy8g5LiN6IO96YKA6K+36Ieq5bexXG4gICAgbGV0IHJlcyBcbiAgICBcbiAgICB0cnl7XG4gICAgICByZXMgPSBhd2FpdCB0aGlzLm5vdmFDbG91ZC5hcGkoXCIvYXV0aC9pbnZpdGVcIix7XG4gICAgICAgIGN1cnJlbnQ6Y3VycmVudD8uaWQsXG4gICAgICAgIGludml0ZTppbnZpdGUsXG4gICAgICAgIHR5cGU6XCJjb2RlXCJcbiAgICAgIH0pXG4gICAgICBjb25zb2xlLmxvZyhcImJpbmRcIixyZXMpXG4gICAgfWNhdGNoKGVycil7XG4gICAgICBjb25zb2xlLmVycm9yKFwiYmluZCBlcnJcIixlcnIpXG4gICAgfVxuICAgIHJldHVyblxuXG4gIH1cbn0iXX0=
|
|
8
|
+
import{Injectable}from"@angular/core";import Parse from"parse";import{Router}from"@angular/router";import{NovaCloudService}from"../../nova-cloud";import{HttpClient}from"@angular/common/http";import{ToastController}from"@ionic/angular/standalone";import*as i0 from"@angular/core";import*as i1 from"@angular/router";import*as i2 from"@ionic/angular/standalone";import*as i3 from"../../nova-cloud";import*as i4 from"@angular/common/http";Parse.applicationId||(Parse.initialize("ncloudmaster"),Parse.serverURL=(Parse.serverURL?.split("parse")?.[0]||"https://server.fmode.cn/")+"parse");export class AuthService{isGuardLock(e){let t=!0,o=Parse.User.current();return t=!o?.id&&this.guardMap[e],t}get loginTypeCount(){return Object.values(this.loginOptions)?.filter((e=>e))?.length}get logoUrl(){return localStorage.getItem("LOGO_URL")||this._logoUrl||"https://file.yuban.co/img/logo-feima.png"}set logoUrl(e){localStorage.setItem("LOGO_URL",e),this._logoUrl=this._logoUrl}getCompanyId(){let e=localStorage.getItem("company");return e=this.company||e,e}constructor(e,t,o,r){this.router=e,this.toastCtrl=t,this.novaCloud=o,this.http=r,this.guardMap={},this.isModalShow=!1,this.showBackHome=!0,this.activeButton="账号密码",this.loginOptions={userpwd:!0,mobilepwd:!0,mobilecode:!0,wechat:!0},this._logoUrl="https://file.yuban.co/img/logo-feima.png",this.wechatUrl="https://file-cloud.fmode.cn/E4KpGvTEto/20230822/hv1tsm115258608.jpg",this.isLoggedIn=!1,this.LoginPage="/pcuser/login",this.mobileUserMap={},this.enabledLocalCode=!1}async toast(e){e.position=e?.position||"top",e.duration=e?.duration||1500,e.color=e?.color||"primary",(await this.toastCtrl.create(e)).present()}init(e){this.company=e.company,this.guardType=e.guardType,this.saveParamsInvite()}checkLoginLock(){let e=Parse.User.current();return!!e?.id||(this.isModalShow=!0,this.isLoggedIn=!1,!1)}checkLogin(e){this.guardMap[e]=!0;let t=Parse.User.current();return console.log("currentUser",t),t&&t.id?(this.setAccount(t),this.isLoggedIn=!0,!0):this.guardType&&"page"!=this.guardType?"modal"==this.guardType?(this.isModalShow=!0,this.isLoggedIn=!1,!0):void 0:(this.redirectUrl=e,this.router.navigate([this.LoginPage]),!1)}async setAccount(e){if(this.account?.id)return;let t=Parse.Object.extend("Account"),o=e?.get("company")||{__type:"Pointer",className:"Company",objectId:this.getCompanyId()}||null,r=new Parse.Query("Account");r.equalTo("user",e.toPointer());let i=await r.first();return i?.id||(i=new t,i.set({user:e.toPointer(),company:o}),i=await i.save()),this.account=i,i}login(e,t){return new Promise(((o,r)=>{Parse.User.logIn(e,t).then((async e=>{if(this.bindInvite(e),this.setCurrentUserLocalStorage(e),"modal"==this.guardType)return await this.refreshPage(),void o(!0);let t=new Parse.Query("Company");t.select("rootPage"),t.equalTo("objectId",e?.get("company")?.id);let r=await t.first(),i=r?.get("rootPage");this.redirectUrl=this.redirectUrl||i||"/project/dashboard";let a=this.redirectUrl;a=decodeURIComponent(a),this.router.navigate([a])})).catch((e=>{console.error(e),r({message:"无此用户信息,请先在小程序登录"})}))}))}refreshPage(){return new Promise((e=>{let t=this.router.url;Parse.User.current()?.id&&(this.isModalShow=!1),this.router.navigateByUrl("/",{skipLocationChange:!0}).then((()=>{this.router.navigateByUrl(t).then((()=>{e(!0)}))}))}))}setCurrentUserLocalStorage(e){e.get("company")?.id&&localStorage.setItem("company",e.get("company")?.id)}logout(e,t){let o=localStorage.getItem("company"),r=localStorage.getItem("WECHAT_APP_ID"),i=localStorage.getItem("LOGO_URL"),a=localStorage.getItem("NOVA_APIG_SERVER");localStorage.clear(),localStorage.setItem("company",o),localStorage.setItem("WECHAT_APP_ID",r),localStorage.setItem("LOGO_URL",i),localStorage.setItem("NOVA_APIG_SERVER",a),Parse.User.logOut().then((e=>{})),this.router.navigate([t||"/pcuser/login"])}async loginMobilePassword(e,t,o){let r=await this.getMobileUser(e);r?this.login(r,t).then((async e=>{this.isModalShow=!1})).catch((e=>{console.log(e),o.create("error","错误的用户名或密码")})):o.create("error","用户不存在,请尝试其他登录方式")}signMobilePassword(e,t){return new Promise((async(o,r)=>{o(await this.signUpAndUpdate(e,t))}))}async getMobileUser(e){let t=this.getCompanyId(),o=t+e;if(this.mobileUserMap[o])return this.mobileUserMap[o];let r=await this.novaCloud.api("/auth/getusername",{company:t,mobile:e});return r?.username&&(this.mobileUserMap[o]=r?.username),this.mobileUserMap[o]}signUpAndUpdate(e,t){return t=t||e+"pwd666",new Promise((o=>{Parse.User.signUp(this.getCompanyId()+"-"+e,t,"").then((async t=>{t.id&&(console.log(t),t.set("company",{__type:"Pointer",className:"Company",objectId:this.getCompanyId()}),t.set("mobile",e),t.set("type","user"),this.bindInvite(t),t=await t.save(),o(t))})).catch((e=>{o(void 0)}))}))}async getMobileCodeToken(e,t){return new Promise(((o,r)=>{let i=Parse.serverURL?.split("parse")?.[0]||"https://server.fmode.cn/";this.http.get(i+`api/auth/mobile?company=${this.company}&mobile=${e}&code=${t}`).toPromise().then((e=>{o(e)})).catch((e=>{r(e)}))}))}async loginCode(e,t,o,r){if(t)try{let o=await this.getMobileCodeToken(e,t);if(200==o?.code){console.log(200,o);let e=await Parse.User.become(o.data.token);if(console.log(e,e?.id),e?.id){console.log(e,e?.id);try{await this.bindInvite(e)}catch(e){console.error("bind err b",e)}return!0}}}catch(o){if(console.log("error1",o),!(o?.error?.mess?.indexOf("用户不存在")>-1))return void this.toast({message:o?.error?.mess});{let o=await this.signUpAndUpdate(e);if(o?.id)return await this.loginCode(e,t)}}else this.toast({color:"primary",message:"请填写有效验证码"})}saveParamsInvite(){let e=this.novaCloud.searchParse();console.log("saveParamsInvite",e);let t=e?.invite;console.log(t),t&&localStorage.setItem("invite",e?.invite)}async bindInvite(e){if(!(e=e||Parse.User.current()))return;if(e?.get("invite")?.id)return;let t,o=localStorage.getItem("invite");if(o&&e?.id!=o)try{t=await this.novaCloud.api("/auth/invite",{current:e?.id,invite:o,type:"code"}),console.log("bind",t)}catch(e){console.error("bind err",e)}}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:AuthService,deps:[{token:i1.Router},{token:i2.ToastController},{token:i3.NovaCloudService},{token:i4.HttpClient}],target:i0.ɵɵFactoryTarget.Injectable})}static{this.ɵprov=i0.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:AuthService,providedIn:"root"})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:AuthService,decorators:[{type:Injectable,args:[{providedIn:"root"}]}],ctorParameters:()=>[{type:i1.Router},{type:i2.ToastController},{type:i3.NovaCloudService},{type:i4.HttpClient}]});
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi91c2VyL2xvZ2luL2F1dGguc2VydmljZS5tanM=`
|
|
10
|
+
|