更改实现方案，重写了90%代码