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 } } });