代码分离为widget