package cn.jfinalbbs.index; import cn.jfinalbbs.common.BaseController; import cn.jfinalbbs.common.Constants; import cn.jfinalbbs.label.Label; import cn.jfinalbbs.reply.Reply; import cn.jfinalbbs.section.Section; import cn.jfinalbbs.topic.Topic; import cn.jfinalbbs.user.AdminUser; import cn.jfinalbbs.user.User; import cn.jfinalbbs.utils.AgentUtil; import cn.jfinalbbs.utils.DateUtil; import cn.jfinalbbs.utils.EmailSender; import cn.jfinalbbs.utils.StrUtil; import cn.jfinalbbs.valicode.ValiCode; import cn.weibo.Users; import cn.weibo.model.WeiboException; import com.jfinal.kit.HashKit; import com.jfinal.kit.PropKit; import com.jfinal.plugin.activerecord.Page; import com.qq.connect.QQConnectException; import com.qq.connect.api.OpenID; import com.qq.connect.api.qzone.UserInfo; import com.qq.connect.javabeans.AccessToken; import com.qq.connect.javabeans.qzone.UserInfoBean; import com.qq.connect.oauth.Oauth; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; public class IndexController extends BaseController { /** * 首页 */ public void index() { String tab = getPara("tab"); String q = getPara("q"); Integer l = getParaToInt("l"); if (tab == null) { if (l != null) { tab = "all"; setAttr("_label", Label.me.findById(l)); } else if (!StrUtil.isBlank(q)) { tab = "all"; } else { Section section = Section.me.findDefault(); tab = section != null ? section.getStr("tab") : "news"; } } Page<Topic> page = Topic.me.paginate(getParaToInt("p", 1), getParaToInt("size", PropKit.use("config.properties").getInt("page_size")), tab, q, 1, l); for (Topic t : page.getList()) { t.put("labels", Label.me.findByTid(t.getStr("id"))); } setAttr("page", page); List<User> scoreTopTen = User.me.findBySize(10); setAttr("scoreTopTen", scoreTopTen); setAttr("tab", tab); setAttr("q", q); setAttr("l", l); //查询无人回复的话题 List<Topic> notReplyTopics = Topic.me.findNotReply(5); setAttr("notReplyTopics", notReplyTopics); //社区运行状态 int userCount = User.me.countUsers(); int topicCount = Topic.me.topicCount(); int replyCount = Reply.me.replyCount(); setAttr("userCount", userCount); setAttr("topicCount", topicCount); setAttr("replyCount", replyCount); if (!AgentUtil.getAgent(getRequest()).equals(AgentUtil.WEB)) render("mobile/index.html"); else render("front/index.html"); } /** * 登出 */ public void logout() { removeCookie(Constants.USER_COOKIE); removeSessionAttr(Constants.USER_SESSION); redirect(Constants.getBaseUrl() + "/"); } /** * 跳转qq登录 * * @throws QQConnectException */ public void qqlogin() throws QQConnectException { String source = getPara("source"); if (!StrUtil.isBlank(source)) { getSession().setAttribute("source", source); } redirect(new Oauth().getAuthorizeURL(getRequest())); } /** * qq登录回调方法 * * @throws QQConnectException */ public void qqlogincallback() throws QQConnectException, IOException { HttpServletRequest request = getRequest(); AccessToken accessTokenObj = (new Oauth()).getAccessTokenByRequest(request); String accessToken = null, openID = null; if (accessTokenObj.getAccessToken().equals("")) { renderText("用户取消了授权或没有获取到响应参数"); } else { accessToken = accessTokenObj.getAccessToken(); // 利用获取到的accessToken 去获取当前用的openid -------- start OpenID openIDObj = new OpenID(accessToken); openID = openIDObj.getUserOpenID(); UserInfo qzoneUserInfo = new UserInfo(accessToken, openID); UserInfoBean userInfoBean = qzoneUserInfo.getUserInfo(); String avatar = userInfoBean.getAvatar().getAvatarURL50(); String nickname = userInfoBean.getNickname(); System.out.println(nickname); User user = (User) getSession().getAttribute(Constants.USER_SESSION); if (user == null) { user = User.me.findByOpenID(openID, "qq"); String id = StrUtil.getUUID(); if (user == null) { user = new User(); user.set("id", id) .set("qq_nickname", nickname) .set("qq_avatar", avatar) .set("qq_open_id", openID); } else { user.set("qq_nickname", nickname) .set("qq_avatar", avatar); } setSessionAttr("open_id", openID); setSessionAttr("thirdlogin_type", "qq"); setSessionAttr("unsave_user", user); } else { User user1 = User.me.findByOpenID(openID, "qq"); if (user1 != null) { getResponse().setCharacterEncoding("utf-8"); getResponse().getWriter().write("<script>alert('此QQ号已经绑定其他账户,请更换绑定');location.href=\'/user/setting\'</script>"); return; } else { user.set("qq_nickname", nickname) .set("qq_open_id", openID) .set("qq_avatar", avatar) .update(); } } if (StrUtil.isBlank(user.getStr("email"))) { redirect(Constants.getBaseUrl() + "/reg.html?third=qq"); } else { setSessionAttr(Constants.USER_SESSION, user); setCookie(Constants.USER_COOKIE, StrUtil.getEncryptionToken(user.getStr("token")), 30 * 24 * 60 * 60); String source = (String) getSession().getAttribute("source"); if (!StrUtil.isBlank(source)) { if (source.equalsIgnoreCase("usersetting")) { getSession().removeAttribute("source"); redirect(Constants.getBaseUrl() + "/user/setting"); } } else { redirect(Constants.getBaseUrl() + "/"); } } } } /** * 新浪微博登录 * * @throws WeiboException * @throws IOException */ public void weibologin() throws WeiboException, IOException { String source = getPara("source"); if (!StrUtil.isBlank(source)) { getSession().setAttribute("source", source); } cn.weibo.Oauth oauth = new cn.weibo.Oauth(); redirect(oauth.authorize("code")); } /** * 新浪微博登录后回调 * * @throws WeiboException */ public void weibologincallback() throws WeiboException, IOException { String code = getPara("code"); cn.weibo.Oauth oauth = new cn.weibo.Oauth(); String error = getPara("error"); if (!StrUtil.isBlank(error) && error.equals("access_denied")) { renderText("用户拒绝了新浪微博登录"); } else { cn.weibo.http.AccessToken accessToken = oauth.getAccessTokenByCode(code); Users users = new Users(accessToken.getAccessToken()); cn.weibo.model.User weiboUser = users.showUserById(accessToken.getUid()); if (weiboUser != null) { User user = (User) getSession().getAttribute(Constants.USER_SESSION); if (user == null) { user = User.me.findByOpenID(weiboUser.getId(), "sina"); String id = StrUtil.getUUID(); if (user == null) { user = new User(); user.set("id", id) .set("sina_nickname", weiboUser.getScreenName()) .set("sina_avatar", weiboUser.getAvatarLarge()) .set("sina_open_id", weiboUser.getId()); } else { user.set("sina_nickname", weiboUser.getScreenName()) .set("sina_avatar", weiboUser.getAvatarLarge()); } setSessionAttr("open_id", weiboUser.getId()); setSessionAttr("thirdlogin_type", "sina"); setSessionAttr("unsave_user", user); } else { User user1 = User.me.findByOpenID(weiboUser.getId(), "sina"); if (user1 != null) { getResponse().setCharacterEncoding("utf-8"); getResponse().getWriter().write("<script>alert('此微博账号已经绑定其他账户,请更换绑定');location.href=\'/user/setting\'</script>"); return; } else { user.set("sina_nickname", weiboUser.getScreenName()) .set("sina_avatar", weiboUser.getAvatarLarge()) .set("sina_open_id", weiboUser.getId()).update(); } } if (StrUtil.isBlank(user.getStr("email"))) { redirect(Constants.getBaseUrl() + "/reg.html?third=qq"); } else { setSessionAttr(Constants.USER_SESSION, user); setCookie(Constants.USER_COOKIE, StrUtil.getEncryptionToken(user.getStr("token")), 30 * 24 * 60 * 60); String source = (String) getSession().getAttribute("source"); if (!StrUtil.isBlank(source)) { if (source.equalsIgnoreCase("usersetting")) { getSession().removeAttribute("source"); redirect(Constants.getBaseUrl() + "/user/setting"); } } else { redirect(Constants.getBaseUrl() + "/"); } } } else { renderText("新浪微博登陆失败"); } } } /** * 后台管理登录 * 默认账号admin * 默认密码123123 * 对应表 admin_user */ public void adminlogin() { String method = getRequest().getMethod(); if (method.equalsIgnoreCase(Constants.RequestMethod.GET)) { String userAdminToken = getCookie(Constants.COOKIE_ADMIN_TOKEN); if (!StrUtil.isBlank(userAdminToken)) { String[] namePwd = StrUtil.getDecryptToken(userAdminToken).split("@&@"); setAttr("username", namePwd[0]); setAttr("password", namePwd[1]); } render("front/adminlogin.html"); } else if (method.equalsIgnoreCase(Constants.RequestMethod.POST)) { String username = getPara("username"); String password = getPara("password"); int remember_me = getParaToInt("remember_me", 0); AdminUser adminUser = AdminUser.me.login(username, HashKit.md5(password)); if (adminUser == null) { setAttr(Constants.ERROR, "用户名或密码错误"); render("front/adminlogin.html"); } else { setSessionAttr(Constants.SESSION_ADMIN_USER, adminUser); if (remember_me == 1) { setCookie(Constants.COOKIE_ADMIN_TOKEN, StrUtil.getEncryptionToken(username + "@&@" + HashKit.md5(password)), 30 * 24 * 60 * 60); } String before_url = getSessionAttr(Constants.ADMIN_BEFORE_URL); if (!StrUtil.isBlank(before_url) && !before_url.contains("adminlogin")) redirect(before_url); redirect(Constants.getBaseUrl() + "/admin/index"); } } } /** * Api入口 */ public void api() { render("front/api.html"); } /** * 文档入口 */ public void doc() { render("front/doc.html"); } public void login() { String method = getRequest().getMethod(); if (method.equalsIgnoreCase(Constants.RequestMethod.GET)) { if (!AgentUtil.getAgent(getRequest()).equals(AgentUtil.WEB)) render("mobile/user/login.html"); } else if (method.equalsIgnoreCase(Constants.RequestMethod.POST)) { String email = getPara("email"); String password = getPara("password"); if (StrUtil.isBlank(email) || StrUtil.isBlank(password)) { error("用户名或密码都不能为空"); } else { User user = User.me.localLogin(email, HashKit.md5(password)); if (user == null) { error("用户名或密码错误"); } else { setSessionAttr(Constants.USER_SESSION, user); setCookie(Constants.USER_COOKIE, StrUtil.getEncryptionToken(user.getStr("token")), 30 * 24 * 60 * 60); success(); } } } } public void reg() { String method = getRequest().getMethod(); if (method.equalsIgnoreCase(Constants.RequestMethod.GET)) { String third = getPara("third"); if (StrUtil.isBlank(third)) { removeSessionAttr("open_id"); removeSessionAttr("thirdlogin_type"); removeSessionAttr("unsave_user"); } if (!AgentUtil.getAgent(getRequest()).equals(AgentUtil.WEB)) render("mobile/user/reg.html"); else render("front/user/reg.html"); } else if (method.equalsIgnoreCase(Constants.RequestMethod.POST)) { String email = getPara("reg_email"); String password = getPara("reg_password"); String nickname = getPara("reg_nickname"); String valicode = getPara("valicode"); String open_id = (String) getSession().getAttribute("open_id"); if (StrUtil.isBlank(email) || StrUtil.isBlank(password) || StrUtil.isBlank(nickname) || StrUtil.isBlank(valicode)) { error("请完善注册信息"); } else { if (!StrUtil.isEmail(email)) { error("请输入正确的邮箱地址"); } else { ValiCode code = ValiCode.me.findByCodeAndEmail(valicode, email, Constants.ValiCodeType.REG); if (code == null) { error("验证码不存在或已使用(已过期)"); } else { User user = User.me.findByEmail(email); if (user != null) { error("邮箱已经注册,请直接登录"); } else if (User.me.findByNickname(nickname) != null) { error("昵称已经被注册,请更换其他昵称"); } else { String uuid = StrUtil.getUUID(); String token = StrUtil.getUUID(); Date date = new Date(); if (StrUtil.isBlank(open_id)) { user = new User(); user.set("id", uuid) .set("nickname", StrUtil.noHtml(nickname).trim()) .set("password", HashKit.md5(password)) .set("score", 0) .set("mission", date) .set("in_time", date) .set("email", email) .set("token", token) .set("avatar", Constants.getBaseUrl() + "/static/img/default_avatar.png") .save(); } else { user = getSessionAttr("unsave_user"); if (user == null) { user = new User(); user.set("id", uuid) .set("nickname", StrUtil.noHtml(nickname).trim()) .set("password", HashKit.md5(password)) .set("score", 0) .set("mission", date) .set("in_time", date) .set("email", email) .set("token", token) .set("avatar", Constants.getBaseUrl() + "/static/img/default_avatar.png") .save(); } else { user.set("nickname", StrUtil.noHtml(nickname).trim()) .set("password", HashKit.md5(password)) .set("mission", date) .set("email", email) .set("token", token) .set("in_time", date) .set("score", 0) .set("avatar", Constants.getBaseUrl() + "/static/img/default_avatar.png") .save(); } removeSessionAttr("unsave_user"); removeSessionAttr("open_id"); removeSessionAttr("thirdlogin_type"); } setSessionAttr(Constants.USER_SESSION, user); setCookie(Constants.USER_COOKIE, StrUtil.getEncryptionToken(user.getStr("token")), 30 * 24 * 60 * 60); //更新验证状态 code.set("status", 1).update(); success(); } } } } } } public void sendValiCode() { String email = getPara("email"); if (StrUtil.isBlank(email)) { error("邮箱不能为空"); } else if (!StrUtil.isEmail(email)) { error("邮箱格式不正确"); } else { String type = getPara("type"); String valicode = StrUtil.randomString(6); if (type.equalsIgnoreCase(Constants.ValiCodeType.FORGET_PWD)) { User user = User.me.findByEmail(email); if (user == null) { error("改邮箱未被注册,请先注册"); } else { ValiCode code = new ValiCode(); code.set("code", valicode) .set("type", type) .set("in_time", new Date()) .set("status", 0) .set("expire_time", DateUtil.getMinuteAfter(new Date(), 30)) .set("target", email) .save(); EmailSender.sendMail("JFinal社区-找回密码验证码", new String[]{email}, "您找回密码的验证码是:" + valicode + "\r\n" + "该验证码只能使用一次,并且有效期仅30分钟。"); success(); } } else if (type.equalsIgnoreCase(Constants.ValiCodeType.REG)) { User user = User.me.findByEmail(email); if (user != null) { error("邮箱已经注册,请直接登录"); } else { ValiCode code = new ValiCode(); code.set("code", valicode) .set("type", type) .set("in_time", new Date()) .set("status", 0) .set("expire_time", DateUtil.getMinuteAfter(new Date(), 30)) .set("target", email) .save(); EmailSender.sendMail("JFinal社区-注册账户验证码", new String[]{email}, "您注册账户的验证码是:" + valicode + "\r\n" + "该验证码只能使用一次,并且有效期仅30分钟。"); success(); } } } } public void forgetpwd() { String method = getRequest().getMethod(); if (method.equalsIgnoreCase(Constants.RequestMethod.GET)) { if (!AgentUtil.getAgent(getRequest()).equals(AgentUtil.WEB)) render("mobile/user/forgetpwd.html"); else render("front/user/forgetpwd.html"); } else if (method.equalsIgnoreCase(Constants.RequestMethod.POST)) { String email = getPara("email"); String valicode = getPara("valicode"); String newpwd = getPara("newpwd"); if (StrUtil.isBlank(email) || StrUtil.isBlank(valicode) || StrUtil.isBlank(newpwd)) { error("请完善信息"); } else { ValiCode code = ValiCode.me.findByCodeAndEmail(valicode, email, Constants.ValiCodeType.FORGET_PWD); if (code == null) { error("验证码不存在或已使用(已过期)"); } else { User user = User.me.findByEmail(email); if (user == null) { error("改邮箱未被注册,请先注册"); } else { user.set("password", HashKit.md5(newpwd)).update(); code.set("status", 1).update(); success(); } } } } } public void donate() { render("front/donate.html"); } }