From dc8f508ac5c6eb6323e97b54dc321627611e7a99 Mon Sep 17 00:00:00 2001 From: Mr Chen Date: Tue, 6 Feb 2024 03:14:20 +0800 Subject: [PATCH] update --- README.md | 2 +- plugins/data_query/nosql_memcached.py | 720 ++++++---------------- plugins/data_query/nosql_mongodb.py | 1 - plugins/data_query/static/html/index.html | 100 +-- plugins/data_query/static/js/app.js | 138 ++++- requirements.txt | 2 +- route/templates/default/layout.html | 2 +- 7 files changed, 379 insertions(+), 586 deletions(-) diff --git a/README.md b/README.md index 036a359b3..3cdf80f33 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ phpMyAdmin[4.4.15]支持MySQL[5.5-5.7] phpMyAdmin[5.2.0]支持MySQL[8.0] PHP[53-72]支持phpMyAdmin[4.4.15] -PHP[72-82]支持phpMyAdmin[5.2.0] +PHP[72-83]支持phpMyAdmin[5.2.0] ``` # 郑重声明 diff --git a/plugins/data_query/nosql_memcached.py b/plugins/data_query/nosql_memcached.py index f3a58d4b6..0c10d6b24 100755 --- a/plugins/data_query/nosql_memcached.py +++ b/plugins/data_query/nosql_memcached.py @@ -1,563 +1,211 @@ # coding:utf-8 +# https://pypi.org/project/pymemcache/ +# https://pymemcache.readthedocs.io/en/latest/getting_started.html#using-a-client-pool + import sys import io import os import time import re +import json +import pymemcache sys.path.append(os.getcwd() + "/class/core") import mw -app_debug = False -if mw.isAppleSystem(): - app_debug = True - - -def getPluginName(): - return 'nosql_query' - - -def getPluginDir(): - return mw.getPluginDir() + '/' + getPluginName() +def singleton(cls): + _instance = {} + def inner(): + if cls not in _instance: + _instance[cls] = cls() + return _instance[cls] + return inner -def getServerDir(): - return mw.getServerDir() + '/' + getPluginName() +@singleton +class nosqlMemcached(): + __DB_PASS = None + __DB_USER = None + __DB_PORT = 11211 + __DB_HOST = '127.0.0.1' + __DB_CONN = None + __DB_ERR = None -def getInitDFile(): - current_os = mw.getOs() - if current_os == 'darwin': - return '/tmp/' + getPluginName() + __DB_LOCAL = None - if current_os.startswith('freebsd'): - return '/etc/rc.d/' + getPluginName() + def __init__(self): + self.__config = self.get_options(None) - return '/etc/init.d/' + getPluginName() + def conn(self): -def getConf(): - path = getServerDir() + "/redis.conf" - return path + if self.__DB_HOST in ['127.0.0.1', 'localhost']: + mem_path = "{}/memcached".format(mw.getServerDir()) + if not os.path.exists(mem_path): return False + if not self.__DB_LOCAL: + self.__DB_PORT = int(self.__config['port']) + try: + self.__DB_CONN = pymemcache.client.base.PooledClient((self.__DB_HOST,self.__DB_PORT), max_pool_size=4) + return self.__DB_CONN + except pymemcache.exceptions.MemcacheError: + return False + except Exception: + self.__DB_ERR = mw.getTracebackInfo() + return False -def getConfTpl(): - path = getPluginDir() + "/config/redis.conf" - return path + # 获取配置项 + def get_options(self, get=None): + result = {} + mem_content = mw.readFile("{}/memcached/memcached.env".format(mw.getServerDir())) + if not mem_content: return False -def getInitDTpl(): - path = getPluginDir() + "/init.d/" + getPluginName() + ".tpl" - return path - - -def getArgs(): - args = sys.argv[3:] - tmp = {} - args_len = len(args) - - if args_len == 1: - t = args[0].strip('{').strip('}') - if t.strip() == '': - tmp = [] + keys = ["bind", "PORT"] + rep = 'PORT\s*=\s*(.*)' + port_re = re.search(rep, mem_content) + if port_re: + result['port'] = int(port_re.groups()[0].strip()) else: - t = t.split(':') - tmp[t[0]] = t[1] - tmp[t[0]] = t[1] - elif args_len > 1: - for i in range(len(args)): - t = args[i].split(':') - tmp[t[0]] = t[1] - return tmp - -def checkArgs(data, ck=[]): - for i in range(len(ck)): - if not ck[i] in data: - return (False, mw.returnJson(False, '参数:(' + ck[i] + ')没有!')) - return (True, mw.returnJson(True, 'ok')) - -def configTpl(): - path = getPluginDir() + '/tpl' - pathFile = os.listdir(path) - tmp = [] - for one in pathFile: - file = path + '/' + one - tmp.append(file) - return mw.getJson(tmp) - - -def readConfigTpl(): - args = getArgs() - data = checkArgs(args, ['file']) - if not data[0]: - return data[1] - - content = mw.readFile(args['file']) - content = contentReplace(content) - return mw.returnJson(True, 'ok', content) - -def getPidFile(): - file = getConf() - content = mw.readFile(file) - rep = 'pidfile\s*(.*)' - tmp = re.search(rep, content) - return tmp.groups()[0].strip() - -def status(): - return 'start' - -def contentReplace(content): - service_path = mw.getServerDir() - content = content.replace('{$ROOT_PATH}', mw.getRootDir()) - content = content.replace('{$SERVER_PATH}', service_path) - content = content.replace('{$SERVER_APP}', service_path + '/redis') - content = content.replace('{$REDIS_PASS}', mw.getRandomString(10)) - return content - - - -def initDreplace(): - - file_tpl = getInitDTpl() - service_path = os.path.dirname(os.getcwd()) - - initD_path = getServerDir() + '/init.d' - if not os.path.exists(initD_path): - os.mkdir(initD_path) - file_bin = initD_path + '/' + getPluginName() - - # initd replace - if not os.path.exists(file_bin): - content = mw.readFile(file_tpl) - content = content.replace('{$SERVER_PATH}', service_path) - mw.writeFile(file_bin, content) - mw.execShell('chmod +x ' + file_bin) - - # log - dataLog = getServerDir() + '/data' - if not os.path.exists(dataLog): - mw.execShell('chmod +x ' + file_bin) - - # config replace - dst_conf = getServerDir() + '/redis.conf' - dst_conf_init = getServerDir() + '/init.pl' - if not os.path.exists(dst_conf_init): - conf_content = mw.readFile(getConfTpl()) - conf_content = conf_content.replace('{$SERVER_PATH}', service_path) - conf_content = conf_content.replace( - '{$REDIS_PASS}', mw.getRandomString(10)) - - mw.writeFile(dst_conf, conf_content) - mw.writeFile(dst_conf_init, 'ok') - - # systemd - systemDir = mw.systemdCfgDir() - systemService = systemDir + '/' + getPluginName() + '.service' - if os.path.exists(systemDir) and not os.path.exists(systemService): - systemServiceTpl = getPluginDir() + '/init.d/' + getPluginName() + '.service.tpl' - service_path = mw.getServerDir() - se_content = mw.readFile(systemServiceTpl) - se_content = se_content.replace('{$SERVER_PATH}', service_path) - mw.writeFile(systemService, se_content) - mw.execShell('systemctl daemon-reload') - - return file_bin - - -def redisOp(method): - file = initDreplace() - - current_os = mw.getOs() - if current_os == "darwin": - data = mw.execShell(file + ' ' + method) - if data[1] == '': - return 'ok' - return data[1] - - if current_os.startswith("freebsd"): - data = mw.execShell('service ' + getPluginName() + ' ' + method) - if data[1] == '': - return 'ok' - return data[1] - - data = mw.execShell('systemctl ' + method + ' ' + getPluginName()) - if data[1] == '': - return 'ok' - return data[1] - - -def start(): - return redisOp('start') - - -def stop(): - return redisOp('stop') - - -def restart(): - status = redisOp('restart') - - log_file = runLog() - mw.execShell("echo '' > " + log_file) - return status - - -def reload(): - return redisOp('reload') - - -def getPort(): - conf = getServerDir() + '/redis.conf' - content = mw.readFile(conf) - - rep = "^(" + 'port' + ')\s*([.0-9A-Za-z_& ~]+)' - tmp = re.search(rep, content, re.M) - if tmp: - return tmp.groups()[1] - - return '6379' - - -def getRedisCmd(): - requirepass = "" - conf = getServerDir() + '/redis.conf' - content = mw.readFile(conf) - rep = "^(requirepass" + ')\s*([.0-9A-Za-z_& ~]+)' - tmp = re.search(rep, content, re.M) - if tmp: - requirepass = tmp.groups()[1] - - default_ip = '127.0.0.1' - port = getPort() - # findDebian = mw.execShell('cat /etc/issue |grep Debian') - # if findDebian[0] != '': - # default_ip = mw.getLocalIp() - cmd = getServerDir() + "/bin/redis-cli -h " + \ - default_ip + ' -p ' + port + " " - - if requirepass != "": - cmd = getServerDir() + '/bin/redis-cli -h ' + default_ip + \ - ' -p ' + port + ' -a "' + requirepass + '" ' - - return cmd - -def runInfo(): - s = status() - if s == 'stop': - return mw.returnJson(False, '未启动') - - - cmd = getRedisCmd() - cmd = cmd + 'info' - - # print(cmd) - data = mw.execShell(cmd)[0] - # print(data) - res = [ - 'tcp_port', - 'uptime_in_days', # 已运行天数 - 'connected_clients', # 连接的客户端数量 - 'used_memory', # Redis已分配的内存总量 - 'used_memory_rss', # Redis占用的系统内存总量 - 'used_memory_peak', # Redis所用内存的高峰值 - 'mem_fragmentation_ratio', # 内存碎片比率 - 'total_connections_received', # 运行以来连接过的客户端的总数量 - 'total_commands_processed', # 运行以来执行过的命令的总数量 - 'instantaneous_ops_per_sec', # 服务器每秒钟执行的命令数量 - 'keyspace_hits', # 查找数据库键成功的次数 - 'keyspace_misses', # 查找数据库键失败的次数 - 'latest_fork_usec' # 最近一次 fork() 操作耗费的毫秒数 - ] - data = data.split("\n") - result = {} - for d in data: - if len(d) < 3: - continue - t = d.strip().split(':') - if not t[0] in res: - continue - result[t[0]] = t[1] - return mw.getJson(result) - -def infoReplication(): - # 复制信息 - s = status() - if s == 'stop': - return mw.returnJson(False, '未启动') - - cmd = getRedisCmd() - cmd = cmd + 'info replication' - - # print(cmd) - data = mw.execShell(cmd)[0] - # print(data) - res = [ - #slave - 'role',#角色 - 'master_host', # 连接主库HOST - 'master_port', # 连接主库PORT - 'master_link_status', # 连接主库状态 - 'master_last_io_seconds_ago', # 上次同步时间 - 'master_sync_in_progress', # 正在同步中 - 'slave_read_repl_offset', # 从库读取复制位置 - 'slave_repl_offset', # 从库复制位置 - 'slave_priority', # 从库同步优先级 - 'slave_read_only', # 从库是否仅读 - 'replica_announced', # 已复制副本 - 'connected_slaves', # 连接从库数量 - 'master_failover_state', # 主库故障状态 - 'master_replid', # 主库复制ID - 'master_repl_offset', # 主库复制位置 - 'second_repl_offset', # 主库复制位置时间 - 'repl_backlog_active', # 复制状态 - 'repl_backlog_size', # 复制大小 - 'repl_backlog_first_byte_offset', # 第一个字节偏移量 - 'repl_backlog_histlen', # backlog中数据的长度 - ] - - data = data.split("\n") - result = {} - for d in data: - if len(d) < 3: - continue - t = d.strip().split(':') - if not t[0] in res: - continue - result[t[0]] = t[1] - - if 'role' in result and result['role'] == 'master': - connected_slaves = int(result['connected_slaves']) - slave_l = [] - for x in range(connected_slaves): - slave_l.append('slave'+str(x)) - - for d in data: - if len(d) < 3: - continue - t = d.strip().split(':') - if not t[0] in slave_l: - continue - result[t[0]] = t[1] - - return mw.getJson(result) - - -def clusterInfo(): - #集群信息 - # https://redis.io/commands/cluster-info/ - s = status() - if s == 'stop': - return mw.returnJson(False, '未启动') - - cmd = getRedisCmd() - cmd = cmd + 'cluster info' - - # print(cmd) - data = mw.execShell(cmd)[0] - # print(data) - - res = [ - 'cluster_state',#状态 - 'cluster_slots_assigned', # 被分配的槽 - 'cluster_slots_ok', # 被分配的槽状态 - 'cluster_slots_pfail', # 连接主库状态 - 'cluster_slots_fail', # 失败的槽 - 'cluster_known_nodes', # 知道的节点 - 'cluster_size', # 大小 - 'cluster_current_epoch', # - 'cluster_my_epoch', # - 'cluster_stats_messages_sent', # 发送 - 'cluster_stats_messages_received', # 接受 - 'total_cluster_links_buffer_limit_exceeded', # - ] - - data = data.split("\n") - result = {} - for d in data: - if len(d) < 3: - continue - t = d.strip().split(':') - if not t[0] in res: - continue - result[t[0]] = t[1] - - return mw.getJson(result) - -def clusterNodes(): - s = status() - if s == 'stop': - return mw.returnJson(False, '未启动') - - cmd = getRedisCmd() - cmd = cmd + 'cluster nodes' - - # print(cmd) - data = mw.execShell(cmd)[0] - # print(data) - - data = data.strip().split("\n") - return mw.getJson(data) - -def initdStatus(): - current_os = mw.getOs() - if current_os == 'darwin': - return "Apple Computer does not support" - - if current_os.startswith('freebsd'): - initd_bin = getInitDFile() - if os.path.exists(initd_bin): - return 'ok' - - shell_cmd = 'systemctl status ' + \ - getPluginName() + ' | grep loaded | grep "enabled;"' - data = mw.execShell(shell_cmd) - if data[0] == '': - return 'fail' - return 'ok' - - -def initdInstall(): - current_os = mw.getOs() - if current_os == 'darwin': - return "Apple Computer does not support" - - # freebsd initd install - if current_os.startswith('freebsd'): - import shutil - source_bin = initDreplace() - initd_bin = getInitDFile() - shutil.copyfile(source_bin, initd_bin) - mw.execShell('chmod +x ' + initd_bin) - mw.execShell('sysrc ' + getPluginName() + '_enable="YES"') - return 'ok' - - mw.execShell('systemctl enable ' + getPluginName()) - return 'ok' - - -def initdUinstall(): - current_os = mw.getOs() - if current_os == 'darwin': - return "Apple Computer does not support" - - if current_os.startswith('freebsd'): - initd_bin = getInitDFile() - os.remove(initd_bin) - mw.execShell('sysrc ' + getPluginName() + '_enable="NO"') - return 'ok' - - mw.execShell('systemctl disable ' + getPluginName()) + result['port'] = 11211 + return result + + def set_host(self, host, port, prefix=''): + self.__DB_HOST = host + self.__DB_PORT = int(port) + self.__DB_PREFIX = prefix + self.__DB_LOCAL = 1 + return self + + +@singleton +class nosqlMemcachedCtr(): + + def __init__(self): + pass + + def getInstanceBySid(self, sid = 0): + instance = nosqlMemcached() + return instance + + def getItems(self, args): + sid = args['sid'] + mem_instance = self.getInstanceBySid(sid).conn() + if mem_instance is False: + return mw.returnData(False,'无法链接') + + result = {} + m_items = mem_instance.stats('items') + + item_no = [] + for i in m_items: + item_match = b'items:(\d*?):number' + item_match_re = re.search(item_match, i) + if item_match_re: + v = item_match_re.groups()[0].strip() + v_str = v.decode() + if not v_str in item_no: + item_no.append(v_str) + result['items'] = item_no + return mw.returnData(True,'ok', result) + + def getKeyList(self, args): + sid = args['sid'] + mem_instance = self.getInstanceBySid(sid).conn() + if mem_instance is False: + return mw.returnData(False,'无法链接') + + + p = 1 + size = 10 + if 'p' in args: + p = args['p'] + + if 'size' in args: + size = args['size'] + + item_id = args['item_id'] + m_items = mem_instance.stats('items') + + item_key = 'items:%s:number' % item_id + item_key_b = item_key.encode("utf-8") + m_items_v = m_items[item_key_b] + + + start = (p-1)*size + end = start+size + if end > m_items_v: + end = m_items_v + + + all_key = mem_instance.stats('cachedump', str(item_id) , str(0)) + # print(all_key) + all_key_list = [] + for k in all_key: + t = {} + t['k'] = k.decode("utf-8") + v = all_key[k].decode("utf-8") + v = v.strip('[').strip(']').split(';') + t['s'] = v[0] + t['t'] = v[1].strip().split(' ')[0] + all_key_list.append(t) + + # print(len(all_key_list)) + # print(start,end) + return_all_key = all_key_list[start:end] + + for x in range(len(return_all_key)): + v = mem_instance.get(return_all_key[x]['k']) + return_all_key[x]['v'] = v.decode('utf-8') + + result = {} + result['list'] = return_all_key + result['p'] = p + + page_args = {} + page_args['count'] = len(all_key_list) + page_args['tojs'] = 'memcachedGetKeyList' + page_args['p'] = p + page_args['row'] = size + result['page'] = mw.getPage(page_args) + + return mw.returnData(True,'ok', result) + + def delVal(self, args): + + sid = args['sid'] + mem_instance = self.getInstanceBySid(sid).conn() + if mem_instance is False: + return mw.returnData(False,'无法链接') + + key = args['key'] + mem_instance.delete(key) + return mw.returnData(True,'删除成功!') + + +# ---------------------------------- run ---------------------------------- +# 获取 memcached 列表 +def get_items(args): + t = nosqlMemcachedCtr() + return t.getItems(args) + +def get_key_list(args): + t = nosqlMemcachedCtr() + return t.getKeyList(args) + +def del_val(args): + t = nosqlMemcachedCtr() + return t.delVal(args) + +# 测试 +def test(args): + sid = args['sid'] + t = nosqlMemcachedCtr() + print(t.get_options()) + print("test") return 'ok' +# ---------------------------------- run ---------------------------------- -def runLog(): - return getServerDir() + '/data/redis.log' - - -def getRedisConfInfo(): - conf = getServerDir() + '/redis.conf' - - gets = [ - {'name': 'bind', 'type': 2, 'ps': '绑定IP(修改绑定IP可能会存在安全隐患)','must_show':1}, - {'name': 'port', 'type': 2, 'ps': '绑定端口','must_show':1}, - {'name': 'timeout', 'type': 2, 'ps': '空闲链接超时时间,0表示不断开','must_show':1}, - {'name': 'maxclients', 'type': 2, 'ps': '最大连接数','must_show':1}, - {'name': 'databases', 'type': 2, 'ps': '数据库数量','must_show':1}, - {'name': 'requirepass', 'type': 2, 'ps': 'redis密码,留空代表没有设置密码','must_show':1}, - {'name': 'maxmemory', 'type': 2, 'ps': 'MB,最大使用内存,0表示不限制','must_show':1}, - {'name': 'slaveof', 'type': 2, 'ps': '同步主库地址','must_show':0}, - {'name': 'masterauth', 'type': 2, 'ps': '同步主库密码', 'must_show':0} - ] - content = mw.readFile(conf) - - result = [] - for g in gets: - rep = "^(" + g['name'] + ')\s*([.0-9A-Za-z_& ~]+)' - tmp = re.search(rep, content, re.M) - if not tmp: - if g['must_show'] == 0: - continue - - g['value'] = '' - result.append(g) - continue - g['value'] = tmp.groups()[1] - if g['name'] == 'maxmemory': - g['value'] = g['value'].strip("mb") - result.append(g) - - return result - - -def getRedisConf(): - data = getRedisConfInfo() - return mw.getJson(data) - - -def submitRedisConf(): - gets = ['bind', 'port', 'timeout', 'maxclients', - 'databases', 'requirepass', 'maxmemory','slaveof','masterauth'] - args = getArgs() - conf = getServerDir() + '/redis.conf' - content = mw.readFile(conf) - for g in gets: - if g in args: - rep = g + '\s*([.0-9A-Za-z_& ~]+)' - val = g + ' ' + args[g] - - if g == 'maxmemory': - val = g + ' ' + args[g] + "mb" - - if g == 'requirepass' and args[g] == '': - content = re.sub('requirepass', '#requirepass', content) - if g == 'requirepass' and args[g] != '': - content = re.sub('#requirepass', 'requirepass', content) - content = re.sub(rep, val, content) - - if g != 'requirepass': - content = re.sub(rep, val, content) - mw.writeFile(conf, content) - reload() - return mw.returnJson(True, '设置成功') - -if __name__ == "__main__": - func = sys.argv[1] - if func == 'status': - print(status()) - elif func == 'start': - print(start()) - elif func == 'stop': - print(stop()) - elif func == 'restart': - print(restart()) - elif func == 'reload': - print(reload()) - elif func == 'initd_status': - print(initdStatus()) - elif func == 'initd_install': - print(initdInstall()) - elif func == 'initd_uninstall': - print(initdUinstall()) - elif func == 'run_info': - print(runInfo()) - elif func == 'info_replication': - print(infoReplication()) - elif func == 'cluster_info': - print(clusterInfo()) - elif func == 'cluster_nodes': - print(clusterNodes()) - elif func == 'conf': - print(getConf()) - elif func == 'run_log': - print(runLog()) - elif func == 'get_redis_conf': - print(getRedisConf()) - elif func == 'submit_redis_conf': - print(submitRedisConf()) - elif func == 'config_tpl': - print(configTpl()) - elif func == 'read_config_tpl': - print(readConfigTpl()) - else: - print('error') diff --git a/plugins/data_query/nosql_mongodb.py b/plugins/data_query/nosql_mongodb.py index 09d005baa..a8bd375e2 100755 --- a/plugins/data_query/nosql_mongodb.py +++ b/plugins/data_query/nosql_mongodb.py @@ -65,7 +65,6 @@ class nosqlMongodb(): keys = ["bind_ip", "port"] result['host'] = '127.0.0.1' - rep = 'port\s*=\s*(.*)' ip_re = re.search(rep, mgdb_content) if ip_re: diff --git a/plugins/data_query/static/html/index.html b/plugins/data_query/static/html/index.html index 146882545..e15ad1cc4 100644 --- a/plugins/data_query/static/html/index.html +++ b/plugins/data_query/static/html/index.html @@ -4,7 +4,7 @@
Redis
Mongodb
- +
Memcached
@@ -104,7 +104,7 @@ - + @@ -123,7 +123,7 @@
-
+
1共1条
@@ -132,51 +132,61 @@ -
-
-
-
-
-
-
-
- -
-
- -
-
-
-
数据类型
- - - - - - - - - - - -
用户来源端口时间
+
+ +
+
+
+ + +
+ + + +
+
+
-
-
-
-
第 1 页
-
+ +
-
- + +
+ +
+ + + + + + + + + + + + +
数据长度有效期操作
+
+
+ +
+
+ +
+
+
+
0共0条
+
diff --git a/plugins/data_query/static/js/app.js b/plugins/data_query/static/js/app.js index ff1363378..b846b29bc 100755 --- a/plugins/data_query/static/js/app.js +++ b/plugins/data_query/static/js/app.js @@ -61,6 +61,34 @@ function mgdbPostCB(method, args, callback){ },'json'); } +function memPostCB(method, args, callback){ + var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); + + var req_data = {}; + req_data['name'] = 'data_query'; + req_data['func'] = method; + req_data['script']='nosql_memcached'; + args['version'] = ''; + + if (typeof(args) == 'string' && args == ''){ + req_data['args'] = JSON.stringify(toArrayObject(args)); + } else { + req_data['args'] = JSON.stringify(args); + } + + $.post('/plugins/callback', req_data, function(data) { + layer.close(loadT); + if (!data.status){ + layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']}); + return; + } + + if(typeof(callback) == 'function'){ + callback(data); + } + },'json'); +} + function selectTab(tab = 'redis'){ $('.tab-view-box .tab-con').addClass('hide').removeClass('show').removeClass('w-full'); @@ -79,6 +107,8 @@ function initTabFunc(tab){ switch(tab){ case 'redis':initTabRedis();break; case 'mongodb':initTabMongodb();break; + case 'memcached':initTabMemcached();break; + case 'default:':initTabRedis();break; } } @@ -141,6 +171,112 @@ function initTabMongodb(){ mongodbGetList(); } +function initTabMemcached(){ + memcachedGetList(); +} + +// ------------------------- memcached start ------------------------------- +function memcachedGetSid(){ + return 0; +} + +function memcachedGetItem(){ + return $('#memcached .item_list select').val(); +} + +function memcachedGetList(){ + var sid = memcachedGetSid(); + memPostCB('get_items',{'sid':sid} ,function(rdata){ + if (rdata.data.status){ + + var items = rdata.data.data['items']; + var content = ''; + for (var i = 0; i < items.length; i++) { + var name = items[i]; + if (i == 0){ + content += ''; + } else { + content += ''; + } + } + $('#memcached .item_list select').html(content); + $('#memcached .item_list select').change(function(){ + memcachedGetKeyList(1); + }); + + memcachedGetKeyList(1); + closeInstallLayer(); + } else { + showInstallLayer(); + } + }); +} + +function memcachedGetKeyList(p){ + var item_id = memcachedGetItem(); + var sid = memcachedGetSid(); + memPostCB('get_key_list',{'sid':sid,'item_id':item_id,'p':p} ,function(rdata){ + if (rdata.data.status){ + var data = rdata.data.data; + var dlist = data['list']; + + var tbody = ''; + for (var i = 0; i < dlist.length; i++) { + tbody += ''; + + tbody += ""; + + tbody += ''+ dlist[i]['k'] +''; + tbody += ''+dlist[i]['v']+''; + tbody += ''+ dlist[i]['s'] +''; + + if (dlist[i]['t'] == '0'){ + tbody += '永久'; + } else { + tbody += ''+ dlist[i]['t'] +''; + } + + tbody += '\ + 删除\ + '; + + tbody += ''; + } + + $('.memcached_table_content tbody').html(tbody); + $('.memcached_list_page').html(data.page); + + + $('.del').click(function(){ + var i = $(this).data('index'); + memcachedDeleteKey(dlist[i]['k']); + }); + + $('.copy').click(function(){ + var i = $(this).data('index'); + copyText(dlist[i]['v']); + }); + } + }); +} + +function memcachedDeleteKey(key){ + layer.confirm('确定要删除?', {btn: ['确定', '取消']}, function(){ + var data = {}; + data['sid'] = memcachedGetSid(); + data['key'] = key; + memPostCB('del_val', data, function(rdata){ + showMsg(rdata.data.msg,function(){ + if (rdata.data.status){ + memcachedGetKeyList(1); + } + },{icon: rdata.data.status ? 1 : 2}, 2000); + }); + }); +} + +// ------------------------- memcached end --------------------------------- + // ------------------------- mongodb start --------------------------------- function mongodbGetSid(){ return 0; @@ -155,7 +291,7 @@ function mongodbCollectionName(){ // console.log(mogodb_db_list); var v = mogodb_db_list.getValue('value'); if (v.length == 0){ - console.log($('#mongodb').data('collection')); + // console.log($('#mongodb').data('collection')); return $('#mongodb').data('collection'); } return v[0]; diff --git a/requirements.txt b/requirements.txt index bb5de7bbb..c457cc4e1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -25,8 +25,8 @@ flask_sockets==0.2.1 zmq==0.0.0 paramiko>=2.8.0 pymongo +pymemcache redis -python-memcached pillow Jinja2>=2.11.2 PyMySQL==1.0.2 diff --git a/route/templates/default/layout.html b/route/templates/default/layout.html index 553152125..fbe813117 100755 --- a/route/templates/default/layout.html +++ b/route/templates/default/layout.html @@ -1,4 +1,4 @@ - +