package cn.dreampie.common.web.controller;
import cn.dreampie.common.config.AppConstants;
import cn.dreampie.common.plugin.mail.Mailer;
import cn.dreampie.common.plugin.mail.MailerTemplate;
import cn.dreampie.common.plugin.patchca.PatchcaRender;
import cn.dreampie.common.plugin.shiro.hasher.Hasher;
import cn.dreampie.common.plugin.shiro.hasher.HasherInfo;
import cn.dreampie.common.plugin.shiro.hasher.HasherUtils;
import cn.dreampie.common.utils.SubjectUtils;
import cn.dreampie.common.utils.TimeUtils;
import cn.dreampie.common.utils.ValidateUtils;
import cn.dreampie.common.web.thread.ThreadLocalUtil;
import cn.dreampie.function.user.Token;
import cn.dreampie.function.user.User;
import com.jfinal.aop.Before;
import com.jfinal.plugin.activerecord.tx.Tx;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;
import java.util.UUID;
/**
* Controller
*/
public class Controller extends com.jfinal.core.Controller {
protected Logger logger = LoggerFactory.getLogger(getClass());
public void dynaRender(String view) {
if (ThreadLocalUtil.isJson())
super.renderJson();
else
super.render(view);
}
/**
* 根目录
*/
// @Before(EvictInterceptor.class)
// @CacheName("index")
public void index() {
dynaRender("/view/index.ftl");
}
/**
* 登录页
*/
public void tologin() {
dynaRender("/view/login.ftl");
}
public void tosignup() {
String uuid = getPara("token");
if (uuid != null && ValidateUtils.me().isUUID(uuid)) {
Token token = Token.dao.findFirstBy("`token`.uuid='" + uuid + "' AND `token`.expiration_at>'" + TimeUtils.me().toString(DateTime.now()) + "' AND `token`.used_to=0");
// if (token == null) {
// Token stoken = new Token();
// stoken.set("uuid", uuid);
// stoken.set("username", "302509116@qq.com");
// DateTime now = DateTime.now();
// stoken.set("created_at", now.toDate());
// stoken.set("expiration_at", now.plusDays(1).toDate());
// stoken.set("used_to", 0);
// if (stoken.save()) {
// token = Token.dao.findFirstBy("`token`.uuid='" + uuid + "' AND `token`.expiration_at>'" + TimeUtils.me().toString(DateTime.now()) + "' AND `token`.used_to = 0");
// }
// }
if (token != null) {
logger.info("tosignup:" + token.getStr("username") + ":" + token.getStr("uuid"));
User regUser = new User();
regUser.set("email", token.get("username"));
setAttr("email", regUser.get("email"));
SubjectUtils.me().getSession().setAttribute(AppConstants.TEMP_USER, regUser);
dynaRender("/view/signup.ftl");
return;
}
}
dynaRender("/view/signup_email.ftl");
}
/**
* 验证码
*/
public void patchca() {
int width = 0, height = 0, minnum = 0, maxnum = 0;
if (isParaExists("width")) {
width = getParaToInt("width");
}
if (isParaExists("height")) {
height = getParaToInt("height");
}
if (isParaExists("minnum")) {
minnum = getParaToInt("minnum");
}
if (isParaExists("maxnum")) {
maxnum = getParaToInt("maxnum");
}
render(new PatchcaRender(minnum, maxnum, width, height));
}
@Before({RootValidator.RegisterEmailValidator.class, Tx.class})
public void signupEmail() {
User regUser = getModel(User.class);
Token token = new Token();
token.set("uuid", UUID.randomUUID().toString());
token.set("username", regUser.get("email"));
DateTime now = DateTime.now();
token.set("created_at", now.toDate());
token.set("expiration_at", now.plusDays(1).toDate());
token.set("used_to", 0);
if (token.save()) {
logger.info("signupEmail:" + token.getStr("username") + ":" + token.getStr("uuid"));
Mailer.me().sendHtml("Dreampie.cn-梦想派",
MailerTemplate.me().set("full_name", "先生/女士").set("safe_url", getAttr("_webRootPath") + "/tosignup?token=" + token.get("uuid"))
.getText("mails/signup_email.ftl"), regUser.getStr("email"));
setAttr("user", regUser);
dynaRender("/view/send_email_notice.ftl");
}
}
@Before({RootValidator.RegisterValidator.class, Tx.class})
public void signup() {
User regUser = getModel(User.class);
// Object u = SubjectUtils.me().getSession().getAttribute(AppConstants.TEMP_USER);
// regUser.set("email", ((User) u).get("email"));
regUser.set("email", getAttr("email"));
regUser.set("created_at", new Date());
regUser.set("providername", "dreampie");
regUser.set("full_name", regUser.get("first_name") + "·" + regUser.get("last_name"));
boolean autoLogin = getParaToBoolean("autoLogin") == null ? false : getParaToBoolean("autoLogin");
HasherInfo passwordInfo = HasherUtils.me().hash(regUser.getStr("password"), Hasher.DEFAULT);
regUser.set("password", passwordInfo.getHashResult());
regUser.set("hasher", passwordInfo.getHasher().value());
regUser.set("salt", passwordInfo.getSalt());
if (regUser.save()) {
//删除token
Token.dao.dropBy("username='" + regUser.get("email") + "' AND used_to=0");
regUser.addUserInfo(null).addRole(null);
setAttr("state", "success");
if (autoLogin) {
if (SubjectUtils.me().login(regUser.getStr("username"), passwordInfo.getHashText())) {
//添加到session
SubjectUtils.me().getSession().setAttribute(AppConstants.CURRENT_USER, regUser);
dynaRender("/view/index.ftl");
return;
}
}
} else {
setAttr("state", "failure");
dynaRender("/view/signup.ftl");
return;
}
dynaRender("/view/login.ftl");
}
}