参考happycasts.net的后端代码，重写后端；前端复用