Ext.define('saas.view.viewport.ViewportController', {
extend: 'Ext.app.ViewController',
alias: 'controller.viewport',
listen: {
controller: {
'*': {
login: 'onLogin',
logout: 'onLogout',
selectCompany: 'onSelectCompany',
unmatchedroute: 'handleUnmatchedRoute'
}
}
},
routes: {
'login': 'handleLoginRoute'
},
init: function() {
var me = this;
me.originalRoute = saas.getApplication().getDefaultToken();
// electron app
if (typeof require === 'function') {
me.ipc = require('electron').ipcRenderer;
me.ipc.on('session', function(e, session){
saas.util.State.set('session', Ext.decode(session));
me.restoreSession();
});
} else {
me.restoreSession();
}
},
mainviewboxready: function() {
var me = this;
//初始化setSessionPage地址
Ext.DomHelper.insertHtml('beforeEnd', document.body,
'');
if(!Ext.isChrome && !Ext.isFirefox) {
saas.util.BaseUtil.showConfirm('温馨提示', '为了更好地呈现页面效果,推荐使用Chrome浏览器或火狐浏览器');
}
},
showView: function(xtype) {
var view = this.lookup(xtype),
viewport = this.getView();
if (!view) {
viewport.removeAll(true);
view = viewport.add({
xtype: xtype,
reference: xtype
});
}
viewport.getLayout().setActiveItem(view);
},
showAuth: function() {
this.showView('login');
},
showMain: function() {
var me = this;
//读取系统参数
saas.util.BaseUtil.request({url:'/api/commons/configs/list'})
.then(function(res) {
if(res.success) {
var list = res.data.list;
if(list.length>0){
var d = {};
Ext.each(list, function(item, index){
d[item.code] = item.data;
});
me.getViewModel().setData(d)
}
}
})
.catch(function(e) {
console.error(e);
});
me.showView('main');
},
// ROUTING
handleLoginRoute: function() {
var session = this.session;
if (session && session.isValid()) {
this.redirectTo('', {replace: true});
return;
}
this.showAuth();
},
handleUnmatchedRoute: function(route) {
var me = this;
if ((!me.session || !me.session.isValid()) && !me.ipc) {
// There is no authenticated user, let's redirect to the login page but keep track
// of the original route to restore the requested route after user authentication.
me.originalRoute = route;
//没有session时 判断cookie中的uid
var hasValidCookie = Ext.util.Cookies.get('uid')?me.getAccountCookie():false;
if(!hasValidCookie){
if(window.location.host.indexOf('.usoftchina.com')>-1){
me.redirectPortal();
}else{
me.redirectTo('login', {replace: true});
}
}else{
me.redirectTo('main', {replace: true});
}
return;
}
// There is an authenticated user, so let's simply redirect to the default token.
var target = saas.getApplication().getDefaultToken();
Ext.log.warn('Route unknown: ', route);
if (route !== target) {
me.redirectTo(target, {replace: true});
}
},
getAccountCookie:function(){
var hasValidCookie = false;
Ext.Ajax.request({
url: '/api/auth/info',
withCredentials: true,
async:false,
dataType: 'json',
headers:{
'Authorization':'',
'Access-Control-Allow-Origin': ' | *'
},
method: 'GET',
success: function(response, opts) {
var res = Ext.decode(response.responseText);
var data = res.data;
var token = data.token;
data.expire = token.expire;
data.timestamp = token.timestamp;
data.token = token.token;
delete data['token'];
if(data.conpanyId){
session = data? saas.model.Session.loadData(data) : null;
if (session && session.isValid()) {
me.setRequestToken(session.get('token'));
me.saveSession(session);
}
hasValidCookie = true
} else{
me.redirectPortal();
}
},
failure: function(response, opts) {
showErrorToast('解析cookie失败:'+response.message)
}
});
return hasValidCookie;
},
setRequestToken: function(token) {
var headers = Ext.Ajax.getDefaultHeaders() || {};
if (token) {
headers['Authorization'] = token;
} else {
delete headers['Authorization'];
}
Ext.Ajax.setDefaultHeaders(headers);
},
// SESSION MANAGEMENT
restoreSession: function() {
var data = saas.util.State.get('session'),
session = data? saas.model.Session.loadData(data) : null;
if (session && session.isValid()) {
this.initiateSession(session);
} else {
this.terminateSession();
}
return session;
},
initiateSession: function(session) {
this.setRequestToken(session.get('token'));
this.saveSession(session);
this.showMain();
},
terminateSession: function() {
this.setRequestToken(null);
this.saveSession(null);
//this.showAuth();
},
saveSession: function(session) {
saas.util.State.set('session', session && session.getData(true));
this.getViewModel().set('account', session && session.get('account'));
this.session = session;
},
// AUTHENTICATION
onLogin: function(session) {
if (!session || !session.isValid()) {
return false;
}
this.initiateSession(session);
this.redirectTo(this.originalRoute, {replace: true});
},
onLogout: function() {
var me = this,
view = me.getView(),
session = me.session;
if (!session || !session.isValid()) {
return false;
}
view.mask();
session.logout().catch(function(error) {
saas.util.BaseUtil.showErrorToast(error.message);
}).then(function() {
me.originalRoute = Ext.History.getToken();
me.terminateSession();
view.unmask();
me.syncSessionToPortal();
me.redirectPortal();
//me.redirectTo('login', {replace: true});
});
},
onSelectCompany: function(companyId) {
var me = this, view = me.getView(), viewModel = me.getViewModel(),
oldSession = me.session, company = viewModel.get('company');
if (company.id != companyId) {
view.mask('请稍等...');
saas.model.Session.switchCompany(oldSession, companyId)
.then(function(newSession) {
newSession.get('account').companyId = companyId;
me.initiateSession(newSession);
me.syncSessionToPortal(newSession);
})
.catch(function(error) {
saas.util.BaseUtil.showErrorToast(error.message);
})
.then(function() {
view.isMasked() && view.unmask();
window.location.reload();
});
}
},
/**
* 同步session到门户
* @param {} session
*/
syncSessionToPortal: function(session) {
var sessionStr = session ? JSON.stringify(session) : '';
if (this.ipc) {
this.ipc.send('session.change', sessionStr);
} else {
//解析session 把data作为sessionStr
sessionStr = session ? JSON.stringify(session.data) : '';
const frame = window.frames[window.frames.length - 1];
frame.postMessage(sessionStr, '*');
}
},
/**
* 跳转门户
*/
redirectPortal: function() {
if (this.ipc) {
// window.close();
} else {
window.location.href = Ext.manifest.server.sso+'/logquit?appId=sp&returnURL='+Ext.manifest.server.accountCenter
}
}
});