refactore move some pacakge, make abstract user