大致的框架，留下函数的具体实现待填充