kodReady.push(function(){
var staticPath = "{{pluginHost}}static/";
var version = '?v={{package.version}}';
G.clientOption = {
appLoginApp: "1",
appLoginAppConfirm: "0",
appLoginWeb: "1",
backupOpen: "1",
fileOpenSupport: "1",
backupAuth: '{"all":"1","user":"","group":"","role":""}',
fileOpen: '[{"ext":"doc,docx,ppt,pptx,xls,xlsx,dwg,dxf,dwf","sort":"10000"}]',
};
_.extend(G.clientOption,jsonDecode(urlDecode("{{config}}")));
LNG.set(jsonDecode(urlDecode("{{LNG}}")));
Events.bind("admin.leftMenu.before",function(menuList){
menuList.push({
title:LNG['client.menu'],
icon:"ri-computer-line",
link:"admin/storage/client",
after:'admin/storage/share',//after/before; 插入菜单所在位置;
sort:10,
fileSrc:staticPath+'clientOpen.js',
});
});
// web端已登录,App登录界面,可以通过扫码登录App(web端个人中心-二维码)
requireAsync(staticPath+'style.css');
ClassBase.extendHook({
hookMatch:'menuItemMaxNumber,initMenuList,changeLanguage',
bindDarkMode:function(){
this.__bindDarkMode.apply(this,arguments);
if(G.clientOption.appLoginApp == '0') return;
showLoginAppView($('.menuBar .user-info'));
checkWebLoginAfter();
checkWebLoginWebAfter();
}
});
ClassBase.extendHook({
hookMatch:'addMenuMake,menuItem,bindLocation',
bindLocation:function(){
this.__bindLocation.apply(this,arguments);
if(G.clientOption.appLoginApp == '0') return;
showLoginAppView($('#app .setting-page .user-head'));
}
});
var checkUrlAllow = function(url) {
var urlInfo = $.parseUrl(url);
if( urlInfo.host == 'localhost' ||
urlInfo.host == '127.0.0.1'){
Tips.tips(LNG['client.app.scanNotIP'],'warning',5000);
return false;
}
return true;
}
var qrcodeDialog = function(urlPre,title,desc,urlAdd){
if($('.qr-login-user-dialog').length) return;
if(!checkUrlAllow(G.kod.APP_HOST)) return;
var dialog = $.dialog({
id:'qr-login-user-dialog',
ico:"",
width:'300px',height:'300px',fixed: true,
padding:'20px 20px',title:title,
content:'
',
});
var $view = dialog.$main.find('.code').addClass('can-not-select');
var render = function(){
$.ajax({
url:G.kod.APP_HOST+'?plugin/client/qrcodeToken',
type:'POST',data:{t:time()},
dataType:'json',
success:function(data){
if(!data || !data.code) return Tips.tips(data);
var url = urlPre + data.data+ (urlAdd || '');
var qrCodeImage = G.kod.APP_HOST+'?user/view/qrcode&url='+urlEncode(url);
$view.html('
');
$view.animate({opacity:1},300);
// console.log(url);$.copyText(url);
// $.copyText(urlDecode($.parseUrl($('.qr-login-user-dialog img').attr('src')).params.url));
}
});
}
var makeQrcode = function(){
$view.html('').css('opacity','0.01');
requireAsync(staticPath+'qrcode.min.js',render);
}
$view.bind('click',makeQrcode);
makeQrcode();
setTimeout(function(){
dialog.$main.find('.disable-event').removeClass('disable-event')
},100);
return dialog;
}
// 当前已登录; 扫码url访问切换账号;(token未登录则不处理,token对于账号和当前一致不处理;)
var checkWebLoginAfter = function(){
if(!_.get(Router,'query.loginAppID')) return;
$.ajax({
url:G.kod.APP_HOST+'?plugin/client/loginApp',
dataType:'json',type:'POST',data:{token:Router.query.loginAppID},
success:function(data){
if(!data || !data.code) return Tips.tips(data,'warning',3000);
var needReload = data.info == G.user.userID ? false:true;// 同一用户则刷新页面;
loginLinkTo(Router.query._page,needReload);
}
});
}
var loginLinkTo = function(page,needReload){
Tips.tips(LNG['common.loginSuccess'],true,3000);
setTimeout(function(){
if(page){Router.go(page);}
if(needReload){window.location.reload();}
},800);
};
var checkWebLoginBefore = function(viewLogin){
var hash = $.parseUrlHash(_.get(Router,'query.link',''));
if(!hash || !hash.query || !hash.query.loginAppID ) return;
Router.setParam({link:''});Router.query.link = '';
$.ajax({
url:G.kod.APP_HOST+'?plugin/client/loginApp',dataType:'json',
type:'POST',data:{token:hash.query.loginAppID},
success:function(data){
if(!data || !data.code) return Tips.tips(data,'warning',5000);
viewLogin.userApi.reloadMainView().then(function(){
loginLinkTo(hash.query._page);
});
}
});
};
var showLoginAppView = function($parent){
if(!$parent.length) return;
if($parent.find('.qr-login-user').length) return;
var icon = "";
var title = LNG['client.app.loginApp'];
var html = ""+icon+"
";
var $view = $(html).appendTo($parent);
$view.bind('mouseup',function(e){
showLoginAppDialog();
$('body').trigger('mouseup');
return stopPP(e);
});
$view.bind('click',function(e){
$('body').trigger('click');
return stopPP(e);
});
setTimeout(function(){$view.addClass('animate');},300);
};
var showLoginAppDialog = function(){
if(!checkUrlAllow(G.kod.APP_HOST)) return;
var desc = LNG['client.app.loginAppDesc']+'
'+LNG['client.app.scanVersion'];
var urlPre = G.kod.APP_HOST + '#?loginAppID=';
var dialog = false;
var success = function(){
var urlAdd = '&_page='+urlEncode($.parseUrl().hash);
qrcodeDialog(urlPre,LNG['client.app.loginApp'],desc,urlAdd);
dialog && dialog.close();
};
var checkPass = function(){
var pass = _.trim($input.val());
if(!pass) return error();
var sign = roundString(5);
$.ajax({
url:G.kod.APP_HOST+'?plugin/client/checkPass',
type:'POST',data:{sign:sign,pass:authCrypt.encode(pass,sign)},
dataType:'json',
success:function(data){
Tips.tips(data);
if(!data || !data.code) return error();
success();
}
});
return false;
};
var error = function(){
dialog.$main.shake();$input.val('');
setTimeout(function(){$input.focus();},300);
return false;
}
if(G.clientOption.appLoginAppConfirm == '0'){return success();}
dialog = $.dialog.prompt(LNG['client.app.loginAppConfirmTips'],function(){return checkPass();});
var $box = dialog.$main.find('.prompt-input');
$box.html('');
var $input = $box.find('input').focus();
$input.keyEnter(function(e){checkPass();})
};
// ===============================================================
// App已登录,扫描web端登录界面二维码登录web(App个人中心-扫描)
ClassBase.extendHook({
hookMatch:'login,bindAutoLogin,autoSetAccount,loginSuccess',
bindEvent:function(){
this.__bindEvent.apply(this,arguments);
showLoginTfaView(this);
if(G.clientOption.appLoginWeb == '1'){
checkWebLoginBefore(this);
showLoginWebView(this);
}
},
loginSuccess: function(){
var _this = this;
var _args = arguments;
// 判断是否需要二次验证,不需要则继续提交
if (this.withTfa || !_.has(tfaIn,'withTfa') || !_this.tfaPage) {
return _this.__loginSuccess.apply(_this,_args);
}
_this.tfaPage.needTfa(tfaIn,tfaInfo);
}
});
var showLoginWebView = function(viewLogin){
var $parent = $('.login-form');
if($parent.find('.qr-login-user').length) return;
var icon = "";
var title = LNG['client.app.loginWeb'];
var html = ""+icon+"
";
var $view = $(html).appendTo($('.login-form'));
$view.bind('mouseup',function(e){
showLoginWebDialog(viewLogin);
});
setTimeout(function(){$view.addClass('animate');},300);
};
var showLoginWebDialog = function(viewLogin){
var desc = LNG['client.app.loginAppDesc']+'
'+LNG['client.app.scanVersion'];
var urlPre = G.kod.APP_HOST + '#?loginWebID=';
var dialog = qrcodeDialog(urlPre,LNG['client.app.loginWeb'],desc,'');
if(!dialog) return;
// 自动检查是否已经登录;
var checkLogin = function(){
$.getJSON(G.kod.APP_HOST+'?plugin/client/check',function(data){
if(!checkTimter) return;
checkTimter = setTimeout(checkLogin,1000);
if(!data || !data.code){
if(_.isObject(data.data) && data.data.status == 'cancel'){
Tips.tips(LNG['common.cancel'],'warning',3000);
dialog.$main.find('.code').trigger('click');//已取消,刷新;
}
return;
}
dialog.$main.find('.code').addClass('code-success');
Tips.tips(LNG['common.loginSuccess'],true,3000);
checkFinished();
setTimeout(function(){viewLogin.loginSuccess();},2000);
});
};
var checkFinished = function(){clearTimeout(checkTimter);checkTimter = false;}
var checkTimter = setTimeout(checkLogin,1000);
viewLogin.bind('onRemove',function(){dialog.close();});
dialog.config.closeBefore = function(){
checkFinished();
};
};
// App扫码登录web端; 支持浏览器或微信等扫描访问;
var checkWebLoginWebAfter = function(){
var token = _.get(Router,'query.loginWebID','');
if(!token) return;
Router.setParam({loginWebID:''});Router.query.loginWebID = '';
var confirmDesc = LNG['client.app.confirmTips']+"("+htmlEncode(G.user.info.name)+")";
var content = "\
\
\
"+LNG['client.app.confirmTitle']+"\
"+confirmDesc+"\
\
"+LNG['client.app.confirmOk']+"
\
"+LNG['common.cancel']+"
";
var dialog = $.dialog({
id:'qr-login-confirm-dialog',
ico:"",
title:LNG['client.app.confirmTitle'],
content:content,
width:'300px',height:'400px',fixed: true,
closeBefore:function(){loginConfirm();}
});
var post = {token:token},isConfirm = false;
var apiUrl = G.kod.APP_HOST+'?plugin/client/loginWeb';
var requestSend = function(){
$.ajax({
url:apiUrl,type:'POST',data:post,dataType:'json',
success:function(data){
if(post.status != '1') return;
Tips.tips(data);
}
});dialog.close();
}
var loginConfirm = function(status){
if(isConfirm) return;
isConfirm = true;
if(!status) return requestSend();
$.dialog.confirm(confirmDesc,function(){
post.status = '1';
requestSend();
},function(){requestSend();},LNG['client.app.confirmOk']);
}
dialog.$main.find('.btn-confirm').bind('click',function(){loginConfirm(true);});
dialog.$main.find('.btn-cancel').bind('click',function(){loginConfirm();});
};
// 后台:二次验证设置
Events.bind("admin.setting.initViewBefore",function(formData, options, self){
if (formData.tfaOpen) return;
// 插入tabs键名
var safe = _.split(_.get(formData,'formStyle.tabs.safe'),',');
var idex = _.findIndex(safe,function(val){return val == 'needCheckCode';});
safe.splice(idex+1, 0, 'tfaOpen','tfaType');
_.set(formData,'formStyle.tabs.safe', _.join(safe,','));
// 追加数据,无法实现插入到指定位置
formData.tfaOpen = {
"type":"switch",
"value":_.get(G,'system.options.tfaOpen') || '0',
"display":LNG['client.tfa.tfaOpen'],
"desc":LNG['client.tfa.tfaOpenDesc'],
"switchItem":{"0":"","1":"tfaType"}
};
formData.tfaType = {
// "type":"radio",
"type":"checkbox",
"value":_.get(G,'system.options.tfaType') || "",
"display":LNG['client.tfa.tfaType'],
"desc":LNG['client.tfa.tfaTypeDesc'],
"info":{"email":LNG['client.tfa.email'],"phone":LNG['common.phoneNumber']}
};
});
// 移动追加项位置
Events.bind('admin.setting.initViewAfter',function(_this){
if (!_this.$('.form-row.item-tfaOpen').length) return;
$('.form-row.item-needCheckCode').after($('.form-row.item-tfaOpen,.form-row.item-tfaType'));
if (_.get(G, 'kod.versionType') == 'A') {
$('.form-row.item-tfaType input[value=phone]').prop("checked", false).prop('disabled',true);
}
});
// 登录页追加二次验证项;相较于router.after.user/login事件,这个只会触发一次,故不做重复拦截
var showLoginTfaView = function(_this) {
var callback = arguments[1] || null;
requireAsync([
staticPath+'tfa/index.js'+version,
staticPath+'tfa/index.css'+version,
],function(LoginTfa){
_this.tfaPage = new LoginTfa({parent:_this});
callback && callback();
});
}
var tfaIn = null;
var tfaInfo = null;
Events.bind('RequestAfter[login]',function(result,param){
if (!result || !result.code) return;
// if (!_.has(result,'data.tfaOpen') && _.get(result,'info')) {
if (!_.get(result,'data.tfaOpen')) {
tfaIn = null; tfaInfo = null;
return;
}
tfaIn = param;
tfaInfo = result.data;
});
Events.bind('RequestBefore[login]',function(param){
param.withTfa = false;
});
if($.hasKey('plugin.client.event')) return;
// 客户端下载;js文件为异步加载,hook不能放在js文件中调用
var clientDown = null;
var clientDownload = function(_this, type){
var data = {parent:_this, pluginApi: "{{pluginApi}}", type: type};
if (clientDown) return clientDown.bindEvent(data);
requireAsync([
staticPath+'down/index.js',
staticPath+'down/index.css',
],function(Down){
clientDown = new Down({parent:self});
clientDown.bindEvent(data);
});
}
// 左下角菜单
ClassBase.extendHook({
hookMatch:'initMenuList,loadFooter,changeLanguage',
hookInitAfter:function(){
clientDownload(this, 'menu');
},
});
// 登录界面
if(window.kodWeb) return;
ClassBase.extendHook({
hookMatch:'loginSave,loginSuccess',
init:function(){
this.__init.apply(this,arguments);
clientDownload(this, 'login');
}
});
});