Saiku ui-settings接口404错误避免

自己手动编译的saiku ,不知道为什么前端总是报错   /saiku/rest/saiku/info/ui-settings  404NotFound

于是我就去查了查后台接口 ,确实没有此请求对应的接口呀 ui-settings

因为不是特别清楚接口做了什么,所以就从前端处理此问题啦

ui-settings 解析

>>获取动态CSS的接口 URL:/saiku/rest/saiku/info/ui-settings

>>接下来当然还是要访问这个接口啦

 |——这么说吧,我如果成功success了,我要做以下的事:
|——加载所有的JS[plugins.size次异步请求]
|——加载所有的CSS[css.size次异步请求]
|——如果我不小心失败error
|——我就只能加载所有的JS[plugins.size次异步请求]啦,你总不能要求我加载获取失败的CSS吧

  

解决方案

在js文件 Saiku.js (/saiku-ui/js/saiku/Saiku.js)中,我们每次请求 ui-settings接口都是失败,为了避免页上报错,我们就直接加载所有的js了,就不去加在所有的css啦

更改 if (!Settings.BIPLUGIN) { .. } 代码段如下:

/**
* Dynamically load plugins!
*
* @type {PluginCollection}
*/
if (!Settings.BIPLUGIN) {
$(document).ready(function() {
var plugins = new PluginCollection(); plugins.fetch({
success: function() {
var i = plugins.size();
var j = 0; plugins.each(function(log) {
j = j + 1; if (log.attributes.path !== 'js/saiku/plugins/I18n/plugin.js') {
jQuery.ajax({
async: false,
type: 'GET',
url: log.attributes.path,
data: null,
success: function() {
if (j === i) {
if (Settings.CSS !== undefined) {
Saiku.loadCSS(Settings.CSS, null);
} Saiku.session = new Session({}, {
username: Settings.USERNAME,
password: Settings.PASSWORD
}); Saiku.toolbar = new Toolbar();
}
},
dataType: 'script'
});
}
else {
if (j === i) {
if (Settings.CSS !== undefined) {
Saiku.loadCSS(Settings.CSS, null);
} Saiku.session = new Session({}, {
username: Settings.USERNAME,
password: Settings.PASSWORD
}); Saiku.toolbar = new Toolbar();
}
}
});
}
});
});
}

  

完整的saiku.js文件如下:(修改后的)

/*
* Copyright 2012 OSBI Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/ /**
* Central object for handling global application state
*/
var Saiku = {
/**
* View which manages toolbar interactions
*/
toolbar: {}, /**
* View which handles tabs
*/
tabs: new TabSet(), /**
* Stop the intro plugin when it finishes
*/
introDone: false, /**
* Saiku SplashScreen
*/
splash: new SplashScreen({ toolbar: this.toolbar }), /**
* Model which handles session and authentication
*/
session: null, /**
* Global event bus
*/
events: _.extend({}, Backbone.Events), /**
* Collection of routers for page fragments
*/
routers: [], /**
* Create a new variable for Leaflet interactive maps
*/
leaflet: (typeof L !== 'undefined') ? L : {}, /**
* Convenience functions for blocking the UI
*/
ui: {
block: function(message) {
$('.processing_message').html(message);
$('.processing_message').removeClass('i18n_translated').addClass('i18n'); Saiku.i18n.translate(); $('.processing, .processing_container').show();
}, unblock: function() {
$('.processing, .processing_container, .blockOverlay').hide(); // Fix for Internet Explorer 10 UIBlock issue
$('.blockUI').fadeOut('slow');
}
}, /**
* Outputs a message to the Web Console
*/
log: function(channel, item) {
if (console && console.log) {
console.log('Logging for: ' + channel); if (item) {
console.log(item);
}
}
}, /**
* Outputs an error message to the Web Console
*/
error: function(channel, item) {
if (console && console.error) {
console.error('Logging for: ' + channel);
console.error(item);
}
}, /**
* Defines utility methods to work with the query string of a URL
*
* @example:
*
* Put in your URL:
* http://<YOUR_MACHINE_IP>:8080/?splash=false
*
* var paramsURI = Saiku.URLParams.paramsURI();
*
* if (Saiku.URLParams.contains({ splash: paramsURI.splash })) {
* // Do something...
* }
*/
URLParams: {
buildValue: function(value) {
if (/^\s*$/.test(value)) { return null; }
if (/^(true|false)$/i.test(value)) { return value.toLowerCase() === 'true'; }
if (isFinite(value)) { return parseFloat(value); } return value;
}, joinArrayValues: function(values) {
if (values.length === 2) {
return values[1];
}
else {
return values[1] + '=' + values[2];
}
}, paramsURI: function() {
var paramsURI = {};
var couples = window.location.search.substr(1).split('&');
var lenCouples = couples.length;
var keyId;
var keyValue; if (window.location.search.length > 1) {
for (keyId = 0; keyId < lenCouples; keyId++) {
keyValue = couples[keyId].split('=');
paramsURI[decodeURIComponent(keyValue[0])] = keyValue.length > 1
// ? this.buildValue(decodeURIComponent(keyValue[1]))
? this.buildValue(decodeURIComponent(this.joinArrayValues(keyValue)))
: null;
}
} return paramsURI;
}, equals: function() {
var params = Array.prototype.slice.call(arguments);
var paramsURI = this.paramsURI(); if (_.isEqual(paramsURI, params[0])) {
return true;
}
else {
return false;
}
}, contains: function() {
var params = Array.prototype.slice.call(arguments);
var paramsURI = this.paramsURI();
var common = {}; for (var key in paramsURI) {
if (paramsURI.hasOwnProperty(key)) {
if (params[0][key] && paramsURI[key] === params[0][key]) {
common[key] = params[0][key];
}
}
} if (_.isEqual(common, params[0])) {
return true;
}
else {
return false;
}
}
}, /**
* A function for loading CSS asynchronously
*
* @example:
*
* Saiku.loadCSS('PATH_OF_YOUR_CSS');
*/
loadCSS: function(href, media) {
var cssNode = window.document.createElement('link');
var ref = window.document.getElementsByTagName('script')[0]; cssNode.rel = 'stylesheet';
cssNode.href = href; // Temporarily, set media to something non-matching to
// ensure it'll fetch without blocking render
cssNode.media = 'only x'; // Inject link
ref.parentNode.insertBefore(cssNode, ref); // Set media back to `all` so that the
// stylesheet applies once it loads
setTimeout(function() {
cssNode.media = media || 'all';
}); return cssNode;
}, /**
* A function for asynchronously loading JavaScript files
*
* @example:
*
* Saiku.loadJS('PATH_OF_YOUR_JS');
*/
loadJS: function(src, callback) {
var scriptNode = window.document.createElement('script');
var ref = window.document.getElementsByTagName('script')[0]; scriptNode.src = src;
scriptNode.async = true; // Inject script
ref.parentNode.insertBefore(scriptNode, ref); // if callback...
if (callback && typeof(callback) === 'function') {
scriptNode.onload = callback;
} return scriptNode;
}, /**
* Converts value using a mask
*
* @example:
*
* Saiku.toPattern(1099911111, '(99) 9999-9999'); // -> (10) 9991-1111
* Saiku.toPattern(12122000, '99/99/9999'); // -> 12/12/2000
* Saiku.toPattern(99911111101, '999.999.999-99'); // -> 999.111.111-01
* Saiku.toPattern('ABC1234', 'AAA-9999'); // -> ABC-1234
*/
toPattern: function(value, opts) {
var DIGIT = '9';
var ALPHA = 'A';
var ALPHANUM = 'S';
var output = (typeof opts === 'object' ? opts.pattern : opts).split('');
var values = value ? value.toString().replace(/[^0-9a-zA-Z]/g, '') : '';
var index = 0;
var len = output.length; for (var i = 0; i < len; i++) {
if (index >= values.length) {
break;
}
if ((output[i] === DIGIT && values[index].match(/[0-9]/)) ||
(output[i] === ALPHA && values[index].match(/[a-zA-Z]/)) ||
(output[i] === ALPHANUM && values[index].match(/[0-9a-zA-Z]/))) {
output[i] = values[index++];
}
else if (output[i] === DIGIT ||
output[i] === ALPHA ||
output[i] === ALPHANUM) {
output = output.slice(0, i);
}
} return output.join('').substr(0, i);
}, /**
* Converts value using a mask
*
* @example:
*
* Saiku.replaceString('World', 'Web', 'Saiku Analytics World'); // -> Saiku Analytics Web
*/
replaceString: function(oldS, newS, fullS) {
var len = fullS.length; for (var i = 0; i < len; i++) {
if (fullS.substring(i, i + oldS.length) === oldS) {
fullS = fullS.substring(0, i) + newS + fullS.substring(i + oldS.length, fullS.length);
}
} return fullS;
}, /**
* Remove brackets
*
* @example:
*
* Saiku.removeBrackets('[Time].[Time].[Year]'); // -> Time.Time.Year
*/
removeBrackets: function(value) {
var str = value.toString(); return str.replace(/[\[\]]/gi, '');
}, /**
* Trim first or last char or both
*
* @example:
*
* Saiku.trimFirstLastChar('Saiku Analytics', 'first'); // -> aiku Analytics
* Saiku.trimFirstLastChar('Saiku Analytics', 'last'); // -> Saiku Analytic
* Saiku.trimFirstLastChar('Saiku Analytics'); // -> aiku Analytic
*/
trimFirstLastChar: function(value, trimPosChar) {
var str = value.toString(); if (trimPosChar === 'first') {
return str.substring(1, (str.length));
}
else if (trimPosChar === 'last') {
return str.substring(0, (str.length - 1));
}
else {
// Trim first and last char
return str.substring(1, (str.length - 1));
}
}
}; /**
* Saiku Singleton pattern
*/
Saiku.singleton = (function() {
'use strict'; var instance; Saiku.singleton = function() {
if (instance) {
return instance;
} instance = this; this.set = function(data) {
this.data = data;
}; this.get = function() {
return this.data;
};
}; return Saiku.singleton;
}()); /**
* Setting this option to true will fake PUT and DELETE requests
* with a HTTP POST, and pass them under the _method parameter.
* Setting this option will also set an X-HTTP-Method-Override header
* with the true method. This is required for BI server integration
*/
Backbone.emulateHTTP = false; /**
* Dynamically load plugins!
*
* @type {PluginCollection}
*/
/**
if (!Settings.BIPLUGIN) {
$(document).ready(function() {
var plugins = new PluginCollection(); plugins.fetch({
success: function() {
var settingsoverride = new SettingsOverrideCollection(); settingsoverride.fetch({
success: function() {
var i = plugins.size();
var j = 0; plugins.each(function(log) {
j = j + 1; if (log.attributes.path !== 'js/saiku/plugins/I18n/plugin.js') {
jQuery.ajax({
async: false,
type: 'GET',
url: log.attributes.path,
data: null,
success: function() {
if (j === i) {
var k = settingsoverride.size();
var l = 0; settingsoverride.each(function(log) {
l = l + 1; for (var key in log.attributes) {
if (log.attributes.hasOwnProperty(key)) {
Settings[key] = log.attributes[key];
}
} if (Settings.CSS !== undefined) {
Saiku.loadCSS(Settings.CSS, null);
} if (k === l) {
Saiku.session = new Session({}, {
username: Settings.USERNAME,
password: Settings.PASSWORD
}); Saiku.toolbar = new Toolbar();
}
});
}
},
dataType: 'script'
});
}
else {
if (j === i) {
var k = settingsoverride.size();
var l = 0; settingsoverride.each(function(log) {
l = l + 1; for (var key in log.attributes) {
if (log.attributes.hasOwnProperty(key)) {
Settings[key] = log.attributes[key];
}
} if (Settings.CSS !== undefined) {
Saiku.loadCSS(Settings.CSS, null);
} if (k === l) {
Saiku.session = new Session({}, {
username: Settings.USERNAME,
password: Settings.PASSWORD
}); Saiku.toolbar = new Toolbar();
}
});
}
}
});
},
error: function() {
var i = plugins.size();
var j = 0; plugins.each(function(log) {
j = j + 1; if (log.attributes.path !== 'js/saiku/plugins/I18n/plugin.js') {
jQuery.ajax({
async: false,
type: 'GET',
url: log.attributes.path,
data: null,
success: function() {
if (j === i) {
if (Settings.CSS !== undefined) {
Saiku.loadCSS(Settings.CSS, null);
} Saiku.session = new Session({}, {
username: Settings.USERNAME,
password: Settings.PASSWORD
}); Saiku.toolbar = new Toolbar();
}
},
dataType: 'script'
});
}
else {
if (j === i) {
if (Settings.CSS !== undefined) {
Saiku.loadCSS(Settings.CSS, null);
} Saiku.session = new Session({}, {
username: Settings.USERNAME,
password: Settings.PASSWORD
}); Saiku.toolbar = new Toolbar();
}
}
});
}
});
}
});
});
}
*/ /**
* Dynamically load plugins!
*
* @type {PluginCollection}
*/
if (!Settings.BIPLUGIN) {
$(document).ready(function() {
var plugins = new PluginCollection(); plugins.fetch({
success: function() {
var i = plugins.size();
var j = 0; plugins.each(function(log) {
j = j + 1; if (log.attributes.path !== 'js/saiku/plugins/I18n/plugin.js') {
jQuery.ajax({
async: false,
type: 'GET',
url: log.attributes.path,
data: null,
success: function() {
if (j === i) {
if (Settings.CSS !== undefined) {
Saiku.loadCSS(Settings.CSS, null);
} Saiku.session = new Session({}, {
username: Settings.USERNAME,
password: Settings.PASSWORD
}); Saiku.toolbar = new Toolbar();
}
},
dataType: 'script'
});
}
else {
if (j === i) {
if (Settings.CSS !== undefined) {
Saiku.loadCSS(Settings.CSS, null);
} Saiku.session = new Session({}, {
username: Settings.USERNAME,
password: Settings.PASSWORD
}); Saiku.toolbar = new Toolbar();
}
}
});
}
});
});
} var SaikuTimeLogger = function(element) {
this._element = $(element);
this._timestamps = [];
this._events = [];
}; SaikuTimeLogger.prototype.log = function(eventname) {
var time = (new Date()).getTime(); if (!eventname) {
eventname = 'Unknown';
} if (this._timestamps.length > 0) {
var lastTime = this._timestamps[this._timestamps.length -1]; if ((time - lastTime) > 1) {
this._element.append('<div>' + (time - lastTime) + ' ms ' + eventname + ' (previous: ' + this._events[this._events.length -1] + ' )</div>');
}
} this._timestamps.push(time);
this._events.push(eventname);
};

  

Saiku ui-settings接口404错误避免(二十九)的更多相关文章

  1. 第三百二十九节,web爬虫讲解2—urllib库爬虫—ip代理—用户代理和ip代理结合应用

    第三百二十九节,web爬虫讲解2—urllib库爬虫—ip代理 使用IP代理 ProxyHandler()格式化IP,第一个参数,请求目标可能是http或者https,对应设置build_opener ...

  2. WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]

    原文:WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载] 我们有两种典型的WCF调用方式:通过SvcUtil.exe(或者添加Web引用)导入发布的服务元数据生成服务代理相关的代码 ...

  3. 《条目二十九:对于逐个字符的输入请考虑istreambuf_iterator》

    <条目二十九:对于逐个字符的输入请考虑istreambuf_iterator> 1.使用: ifstream inputfile("xxxx"); string fil ...

  4. 微信小程序把玩(二十九)video组件

    原文:微信小程序把玩(二十九)video组件 视频播放组件与图片加载组件也没啥差别,使用起来也没啥注意的 重要属性: wxml <!--监听button点击事件--> <button ...

  5. FreeSql (二十九)Lambda 表达式

    FreeSql 支持功能丰富的表达式函数解析,方便程序员在不了解数据库函数的情况下编写代码.这是 FreeSql 非常特色的功能之一,深入细化函数解析尽量做到满意,所支持的类型基本都可以使用对应的表达 ...

  6. 使用Typescript重构axios(二十九)——添加baseURL

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  7. 《手把手教你》系列技巧篇(二十九)-java+ selenium自动化测试- Actions的相关操作上篇(详解教程)

    1.简介 有些测试场景或者事件,Selenium根本就没有直接提供方法去操作,而且也不可能把各种测试场景都全面覆盖提供方法去操作.比如:就像鼠标悬停,一般测试场景鼠标悬停分两种常见,一种是鼠标悬停在某 ...

  8. Bootstrap <基础二十九>面板(Panels)

    Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...

  9. Web 开发人员和设计师必读文章推荐【系列二十九】

    <Web 前端开发精华文章推荐>2014年第8期(总第29期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

随机推荐

  1. C#后台架构师成长之路-基础体系篇章大纲

    如下基础知识点,如果不熟透,以后容易弄笑话..... 1. 常用数据类型:整型:int .浮点型:double.布尔型:bool.... 2. 变量命名规范.赋值基础语法.数据类型的转换.运算符和选择 ...

  2. 使用shell脚本查看数据库负载情况

    原创 Oracle 作者:jeanron100 时间:2014-05-23 08:56:26  8912  2 平时在查看数据库的问题时,会有种迷茫的感觉,如果没有任何人反馈问题,基本上没有主动查找问 ...

  3. centos查询目标文件文件所在位置

    之前有试过whereis这种语法但是查询文件不大理想.然后找到了下边这种方式可以很好的查询目标文件的位置 #在根目录 /下查找所有叫nginx的文件 find / -name nginx

  4. Mac中创建一个OpenGL项目

    配置: OS X10.10 + Xcode 6.0 一.基本步骤 新建一个命令窗口项目 更改目标设备版本号为 OS X 8.0 添加库文件 GLUT.framework 和 OpenGL.framew ...

  5. Python目录教程集和资料分享

    以下整理的是python的基础笔记,需要python视频资料或更多的请关注我的公众号! 查看内容点击链接: Python简介及安装 Python的3种执行方式 变量及变量计算和引用 if, elif, ...

  6. 学java可以做些什么

    学java可以做些什么 对于很多新手来说,刚开始接触Java会很迷惘,不知道Java可以做什么.其实Java 可以做的东西太多了,手机游戏.中间件.软件.网站,电脑游戏,以及现在流行的安卓手机app等 ...

  7. 【STM32-V7】STM32H743XIH6开发板,丰富软件资源,强劲硬件配置,大量软件解决方案持续更新中(2019-12-12)

    说明: 争取做更多的实战性应用,分享更多的嵌入式技术,希望能在实际项目中帮到大家. (1)V7将大力加强对初学者的支持力度,已经更新至63章,下载链接,后37章和一批视频教程将加紧制作. (2)事隔五 ...

  8. Eureka工作原理及它和ZooKeeper的区别

    1.Eureka 简介: Eureka 是 Netflix 出品的用于实现服务注册和发现的工具. Spring Cloud 集成了 Eureka,并提供了开箱即用的支持.其中, Eureka 又可细分 ...

  9. 使用python解析ip地址

    前言 想要批量将ip地址转换为省份城市.国家或是经纬度?百度上的批量查找每次的容量太小满足不了要求?第三方库神器 - geoip2帮你解决所有烦恼. 准备工作 首先安装一下geoip2库, pip i ...

  10. Gluserfs 架构详解【译】官网

    Gluserfs详解 排版看着不舒服的,可以查看[我的简书](https://www.jianshu.com/p/0340e429431b) doc home:https://docs.gluster ...