pull/577/head
Mr Chen 12 months ago
parent 95ec87346d
commit 2461307d64
  1. 14
      plugins/sphinx/class/sphinx_make.py
  2. 13
      plugins/sphinx/index.html
  3. 34
      plugins/sphinx/index.py
  4. 167
      plugins/sphinx/js/sphinx.js

@ -281,7 +281,9 @@ index {$DB_NAME}_{$TABLE_NAME}
def makeSqlToSphinxDb(self, db, table = []): def makeSqlToSphinxDb(self, db, table = []):
conf = '' conf = ''
for tn in table: for tn in table:
pkey_name = self.getTablePk(db,tn)
if pkey_name == '': if pkey_name == '':
continue continue
conf += self.makeSphinxDbSource(db, tn) conf += self.makeSphinxDbSource(db, tn)
@ -377,10 +379,20 @@ index {$DB_NAME}_{$TABLE_NAME}
return conf return conf
def checkDbName(self, db):
filter_db = ['information_schema','performance_schema','sys','mysql']
if db in filter_db:
return False
return True
def makeSqlToSphinx(self, db, tables = []):
conf = ''
conf += self.makeSphinxHeader()
conf += self.makeSqlToSphinxDb(db, tables)
return conf
def makeSqlToSphinxAll(self): def makeSqlToSphinxAll(self):
filter_db = ['information_schema','performance_schema','sys','mysql'] filter_db = ['information_schema','performance_schema','sys','mysql']
filter_db.append(self.delta)
dblist = self.pdb.query('show databases') dblist = self.pdb.query('show databases')

@ -1,3 +1,16 @@
<style>
#table xm-select{
min-height: 30px;
line-height: 30px;
}
#table xm-select *{
font-size: 12px;
}
</style>
<div class="bt-form"> <div class="bt-form">
<div class="bt-w-main"> <div class="bt-w-main">
<div class="bt-w-menu"> <div class="bt-w-menu">

@ -209,8 +209,7 @@ def reload():
def rebuild(): def rebuild():
file = initDreplace() file = initDreplace()
cmd = file + ' rebuild &' cmd = file + ' rebuild'
# print(cmd)
data = mw.execShell(cmd) data = mw.execShell(cmd)
if data[0].find('successfully')<0: if data[0].find('successfully')<0:
return data[0].replace("\n","<br/>") return data[0].replace("\n","<br/>")
@ -318,11 +317,9 @@ def sphinxCmd():
else: else:
return mw.returnJson(False, 'no index') return mw.returnJson(False, 'no index')
def makeDbToSphinx(): def makeDbToSphinxTest():
conf_file = getConf() conf_file = getConf()
import sphinx_make import sphinx_make
sph_make = sphinx_make.sphinxMake() sph_make = sphinx_make.sphinxMake()
conf = sph_make.makeSqlToSphinxAll() conf = sph_make.makeSqlToSphinxAll()
@ -331,6 +328,33 @@ def makeDbToSphinx():
# makeSqlToSphinxTable() # makeSqlToSphinxTable()
return True return True
def makeDbToSphinx():
args = getArgs()
check = checkArgs(args, ['db','tables','is_delta','is_cover'])
if not check[0]:
return check[1]
db = args['db']
tables = args['tables']
is_delta = args['is_delta']
is_cover = args['is_cover']
sph_file = getConf()
import sphinx_make
sph_make = sphinx_make.sphinxMake()
if not sph_make.checkDbName(db):
return mw.returnJson(False,'保留数据库名称,不可用!')
if is_cover == 'yes':
tables = tables.split(',')
content = sph_make.makeSqlToSphinx(db, tables)
mw.writeFile(sph_file,content)
return mw.returnJson(True,'设置成功!')
return mw.returnJson(True,'测试中')
if __name__ == "__main__": if __name__ == "__main__":

@ -20,6 +20,32 @@ function spPostMin(method, args, callback){
},'json'); },'json');
} }
function myPost(method, args, callback, title){
var _args = null;
if (typeof(args) == 'string'){
_args = JSON.stringify(toArrayObject(args));
} else {
_args = JSON.stringify(args);
}
var _title = '正在获取...';
if (typeof(title) != 'undefined'){
_title = title;
}
$.post('/plugins/run', {name:'mysql', func:method, args:_args}, function(data) {
if (!data.status){
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
return;
}
if(typeof(callback) == 'function'){
callback(data);
}
},'json');
}
function spPost(method, args, callback){ function spPost(method, args, callback){
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
spPostMin(method,args,function(data){ spPostMin(method,args,function(data){
@ -31,10 +57,141 @@ function spPost(method, args, callback){
} }
function commonFunc(){ function commonFunc(){
var con = '<button class="btn btn-default btn-sm" onclick="rebuildIndex();">重建索引</button>'; var con = '<button class="btn btn-default btn-sm" onclick="confirmRebuildIndex();">重建索引</button>';
con += '&nbsp;&nbsp; <button class="btn btn-default btn-sm" onclick="autoMakeConf();">自动创建配置</button>';
$(".soft-man-con").html(con); $(".soft-man-con").html(con);
} }
function autoMakeConf(){
var xm_db_list;
var con = '<ul class="help-info-text c7">';
con += '<li style="color:red;">如果数据量比较大,第一次启动会失败!(可通过手动建立索引)</li>';
con += '<li style="color:red;">以下内容,需手动加入计划任务。</li>';
layer.open({
type: 1,
area: ['380px','350px'],
title: '自动创建配置',
closeBtn: 1,
shift: 5,
shadeClose: true,
btn:["提交","关闭"],
content: "<form class='bt-form pd20'>\
<div class='line'>\
<span class='tname'>选择数据库</span>\
<div class='info-r'>\
<select class='bt-input-text mr5' name='dbname' style='width:100%'>\
<option value='all'>全部</option>\
<option value='one'>单指定</option>\
<option value='some'>多指定</option>\
</select>\
</div>\
</div>\
<div class='line'>\
<span class='tname'>选择表</span>\
<div class='info-r'>\
<div id='table'></div>\
</div>\
</div>\
<div class='line'>\
<span class='tname'>是否增量</span>\
<div class='info-r'>\
<select class='bt-input-text mr5' name='is_delta' style='width:100px'>\
<option value='yes'></option>\
<option value='no'></option>\
</select>\
</div>\
</div>\
<div class='line'>\
<span class='tname'>是否覆盖配置</span>\
<div class='info-r'>\
<select class='bt-input-text mr5' name='is_cover' style='width:100px'>\
<option value='yes'></option>\
<option value='no'></option>\
</select>\
</div>\
</div>\
<ul class='help-info-text c7'>\
<li style='color:red;'>具体配置仍须手动修改!!!</li>'\
</ul>\
</form>\
",
success:function(l,i){
$(l).find('.layui-layer-content').css('overflow','visible');
xm_db_list = xmSelect.render({
el: '#table',
repeat: false,
toolbar: {show: true},
data: [],
});
myPost('get_db_list', {"page":1,"page_size":20}, function(data){
var rdata = $.parseJSON(data.data);
var dblist = rdata.data;
var db_html = '';
for (var i = 0; i < dblist.length; i++) {
db_html += "<option value='"+dblist[i]['name']+"'>"+dblist[i]['name']+"</option>";
}
if (dblist.length > 0){
initDbSelect(dblist[0]['name']);
}
$('select[name="dbname"]').html(db_html);
});
$('select[name="dbname"]').change(function(){
var db = $('select[name="dbname"]').val();
initDbSelect(db);
});
},
yes:function(index){
var args = {}
args['db'] = $('select[name="dbname"]').val();
args['is_delta'] = $('select[name="is_delta"]').val();
args['is_cover'] = $('select[name="is_cover"]').val();
args['tables'] = xm_db_list.getValue('value').join(',');
// console.log(args);
spPost('db_to_sphinx', args, function(rdata){
var rdata = $.parseJSON(rdata.data);
// console.log(rdata);
showMsg(rdata.msg,function(){
if (rdata.status){
layer.close(index);
confirmRebuildIndex();
}
},{icon: rdata.status ? 1 : 2}, 2000);
});
}
});
function initDbSelect(db){
getDbInfo(db, function(rdata){
var rdata = $.parseJSON(rdata.data);
var tables = rdata.tables;
var idx_db = [];
for (var i = 0; i < tables.length; i++) {
var t = {};
t['name'] = tables[i]['table_name'];
t['value'] = tables[i]['table_name'];
idx_db.push(t);
}
xm_db_list = xmSelect.render({el: '#table', filterable: true,repeat: false,toolbar: {show: true},data: idx_db,});
});
}
function getDbInfo(db_name, callback){
myPost('get_db_info', {name:db_name}, function(data){
callback(data);
});
}
}
function rebuildIndex(){ function rebuildIndex(){
spPost('rebuild', '', function(data){ spPost('rebuild', '', function(data){
if (data.data == 'ok'){ if (data.data == 'ok'){
@ -45,9 +202,15 @@ function rebuildIndex(){
}); });
} }
function confirmRebuildIndex(){
layer.confirm("是否重建索引?", {icon:3,closeBtn: 1} , function(){
rebuildIndex();
});
}
function tryRebuildIndex(){ function tryRebuildIndex(){
layer.confirm("修改配置后,是否尝试重建索引。", {icon:3,closeBtn: 1} , function(){ layer.confirm("修改配置后,是否尝试重建索引!", {icon:3,closeBtn: 1} , function(){
rebuildIndex(); rebuildIndex();
}); });
} }

Loading…
Cancel
Save