class Menu: def __init__(self): self._head = Function(FunctionNodeBase()) self.input_text = None # 链接 def linkToHead(self, function): self._head.add(function) # 搜索 def search(self, text): cur = self._head for i in text.split('-'): if cur.go(i) == None: return None else: self.input_text = i cur = cur.go(i) return cur
叶子 跟 树的主体都有了,下面来创建树顶
展示: 基础功能叶 动态功能叶 静态功能叶
# 空的功能Node class FunctionNodeBase: __metaclass__ = ABCMeta def __init__(self, user=None, f_type="default", input_text=None, sub_text=None): self.user = user self.sub_text = sub_text self.input_text = input_text self.f_type = f_type self.f_mark = [] # 菜单通过run方法执行与生成文本 @abstractmethod def run(self): return self.__str__() # 描述 @abstractmethod def __str__(self): return "菜单树顶层" # 动态生成 class SelectDeploymentTop(FunctionNodeBase): # 动态生成的菜单需要声明f_type def __init__(self): super().__init__() self.f_type = "dynamic" def run(self): text = "请选择事业部\n\n" deployment_list = [i for i in FunctionList.keys()] for _, i in enumerate(deployment_list): self.f_mark.append(_) text += "%s %s\n" % (_, i) return text # 微信显示的文本信息 def __str__(self): return "选择事业部" # 静态 class MySQLFunctionTop(FunctionNodeBase): def __init__(self): super().__init__() def run(self): text = "您选择的是%s,请选择您想要操作:\n" % str(self.__str__()) text += "%s\n" % self.sub_text return text def __str__(self): return "MySQL操作"
效果图,第一层功能展示
将需要的功能逐一写好后需要进行注册
def api(tid,user): # 实例化 menu = Menu() top = Function(SelectDeploymentTop) function_top = Function(FunctionTop) mysql_top = Function(MySQLFunctionTop) # 链接 top.add(function_top function_top.add(mysql_top) # 关联菜单树 menu.linkToHead(top) # 递归搜索 function = menu.search(tid)
Redis存储对话代码片段
class redis_db: def __init__(self): # 按符号隔开 self.mark = '-' self.redis_db = redis.StrictRedis( host = host, port=6379, db=1, decode_responses=True) # 默认回话过期600秒,每次存储 '-'隔开 def add(self,key,text,Timeout=600): if key not in self.keys(): self.redis_db.set(key,'',ex=Timeout) if self.get(key): self.redis_db.append(key,self.mark) self.redis_db.append(key,text)
同理,返回上层就删除一格; 退出即删除该KEY的值.
成果
下图为:通过交互机器人连接k8s增加POD数的应用场景
后记
该系统已经在平台上稳定运行大半年, 上线后使运维人员能够更高效快速解决日常中遇到的一些故障.