liuyuqiang 4 月之前
父节点
当前提交
8e2c435e51

+ 17 - 0
src/main/java/com/sooka/module/web/cms/LoginController.java

@@ -1,5 +1,8 @@
 package com.sooka.module.web.cms;
 
+import com.sooka.common.utils.ControllerUtil;
+import com.sooka.common.utils.JsonUtil;
+import com.sooka.common.utils.StrUtil;
 import com.sooka.module.web.system.service.CmsUserService;
 import com.sooka.mybatis.model.TCmsUser;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -7,6 +10,9 @@ import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
 /**
  * Description:用户管理
  *
@@ -18,6 +24,17 @@ public class LoginController {
     @Autowired
     private CmsUserService userService;
 
+    @PostMapping("/login")
+    @ResponseBody
+    public Map login(HttpServletRequest request) {
+        String verifyCode = request.getParameter("verifyCode");
+        /* 临时验证码验证 */
+        if (StrUtil.isBlank(verifyCode) || !ControllerUtil.validate(verifyCode, request)) {
+            return JsonUtil.toMAP(false, "验证码输入错误");
+        }
+        return userService.login(request);
+    }
+
     @PostMapping("/register")
     @ResponseBody
     public String register(TCmsUser user) {

+ 7 - 0
src/main/java/com/sooka/module/web/system/service/CmsUserService.java

@@ -2,10 +2,17 @@ package com.sooka.module.web.system.service;
 
 import com.sooka.mybatis.model.TCmsUser;
 
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
 /**
  * Created by binary on 2025/2/8.
  */
 public interface CmsUserService {
 
+    Map<String, Object> login(HttpServletRequest request);
+
+    TCmsUser selectByUsername(String username);
+
     String insert(TCmsUser user);
 }

+ 85 - 0
src/main/java/com/sooka/module/web/system/service/impl/CmsUserServiceImpl.java

@@ -1,15 +1,30 @@
 package com.sooka.module.web.system.service.impl;
 
+import com.google.common.collect.Maps;
+import com.sooka.common.constant.CmsConst;
 import com.sooka.common.utils.CheckSumUtil;
+import com.sooka.common.utils.ControllerUtil;
 import com.sooka.common.utils.JsonUtil;
 import com.sooka.common.utils.StrUtil;
 import com.sooka.component.shiro.PasswordKit;
 import com.sooka.module.web.system.service.CmsUserService;
+import com.sooka.module.web.system.vo.UserVo;
 import com.sooka.mybatis.mapper.TCmsUserMapper;
 import com.sooka.mybatis.model.TCmsUser;
+import org.apache.commons.beanutils.BeanUtils;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.*;
+import org.apache.shiro.subject.Subject;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.Cache;
+import org.springframework.cache.ehcache.EhCacheCacheManager;
 import org.springframework.stereotype.Service;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import java.util.Date;
+import java.util.Map;
+
 /**
  * Description:前台用户控制器
  *
@@ -21,6 +36,76 @@ public class CmsUserServiceImpl implements CmsUserService {
     @Autowired
     private TCmsUserMapper userMapper;
 
+    @Autowired
+    private EhCacheCacheManager springEhCacheManager;
+
+    private void putInCache(Cache cache, String username) {
+        Integer tryCount = getTryCount(cache, username);
+        cache.put(username, tryCount += 1);
+    }
+
+    private Integer getTryCount(Cache cache, String username) {
+        Cache.ValueWrapper valueWrapper = cache.get(username);
+        Integer tryCount = 0;
+        if (valueWrapper != null) {
+            tryCount = (Integer) valueWrapper.get();
+        }
+        return tryCount;
+    }
+
+    @Override
+    public Map<String, Object> login(HttpServletRequest request) {
+        String username = request.getParameter("username"), password = request.getParameter("password"),
+                remberMe = request.getParameter("remberMe");
+        Map<String, Object> result = Maps.newHashMap();
+        result.put("success", false);
+        Cache cache = springEhCacheManager.getCache("cms-login-cache");
+        Integer tryCount = getTryCount(cache, username);
+        if (tryCount >= 5) {
+            result.put("message", "密码输入错误次数超限,请5分钟后再试");
+            return result;
+        }
+        HttpSession session = request.getSession();
+        Subject currentUser = SecurityUtils.getSubject();
+        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(username, password);
+        /*是否需要记住我*/
+        if ("true".equals(remberMe)) {
+            usernamePasswordToken.setRememberMe(true);
+        }
+        try {
+            currentUser.login(usernamePasswordToken);
+            TCmsUser user = selectByUsername(username);
+            user.setLoginTime(new Date());
+            user.setLastIp(ControllerUtil.getRemoteAddress(request));
+            /*更新用户的登陆信息*/
+            userMapper.updateByPrimaryKey(user);
+            /*userVo和TSysUser没什么区别,只是增加了siteId*/
+            UserVo userVo = new UserVo();
+            BeanUtils.copyProperties(userVo, user);
+            /*设置session*/
+            session.setAttribute(CmsConst.SITE_USER_SESSION_KEY, userVo);
+            result.put("success", true);
+            result.put("message", "登录成功!");
+        } catch (UnknownAccountException e) {
+            result.put("message", "账号输入错误!");
+        } catch (IncorrectCredentialsException e) {
+            result.put("message", "密码输入错误!");
+            putInCache(cache, username);
+        } catch (LockedAccountException e) {
+            result.put("message", "当前账号已被停用!");
+        } catch (AuthenticationException ae) {
+            result.put("message", "账号或者密码输入错误!");
+        } catch (Exception e) {
+            result.put("message", "发生了一个错误!");
+        }
+        return result;
+    }
+
+    @Override
+    public TCmsUser selectByUsername(String username) {
+        return userMapper.selectByUsername(username);
+    }
+
     @Override
     public String insert(TCmsUser user) {
         /* 加工password */

+ 9 - 0
src/main/java/com/sooka/mybatis/mapper/TCmsUserMapper.java

@@ -1,8 +1,17 @@
 package com.sooka.mybatis.mapper;
 
 import com.sooka.mybatis.model.TCmsUser;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.ResultMap;
+import org.apache.ibatis.annotations.Select;
 
 public interface TCmsUserMapper {
 
+    @Select("select * from t_cms_user where username = #{username}")
+    @ResultMap("BaseResultMap")
+    TCmsUser selectByUsername(@Param("username") String username);
+
+    int updateByPrimaryKey(TCmsUser user);
+
     int insert(TCmsUser user);
 }

+ 14 - 1
src/main/resources/com/sooka/mybatis/mapper/TCmsUserMapper.xml

@@ -26,8 +26,21 @@
         <result column="des" jdbcType="VARCHAR" property="des"/>
     </resultMap>
 
+    <update id="updateByPrimaryKey" parameterType="com.sooka.mybatis.model.TCmsUser">
+        update t_cms_user
+        <trim prefix="set" suffixOverrides=",">
+            <if test="loginTime!=null">
+                login_time = #{loginTime,jdbcType=TIMESTAMP},
+            </if>
+            <if test="lastIp!=null">
+                last_ip = #{lastIp,jdbcType=VARCHAR},
+            </if>
+        </trim>
+        where user_id = #{userId,jdbcType=INTEGER}
+    </update>
+
     <insert id="insert" useGeneratedKeys="true" keyProperty="userId" parameterType="com.sooka.mybatis.model.TCmsUser">
         insert into t_cms_user (username, password, salt, create_time)
         values (#{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{salt,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP})
-  </insert>
+    </insert>
 </mapper>

+ 15 - 0
src/main/resources/static/js/register/login.js

@@ -0,0 +1,15 @@
+// JavaScript Document
+$(function () {
+    // 提交表单
+    $('#login').click(function () {
+        show_loading();
+        // ajax提交表单,#login_form为表单的ID。如:$('#login_form').ajaxSubmit(function(data)
+        $.post("/login", {username: "test", password: "123456", "verifyCode": $("#j_captcha").val()}, function (data) {
+            var obj = eval(data);
+            show_err_msg(obj.message);
+            setTimeout(function () {
+                location.reload();
+            }, 3000);
+        }, "json");
+    });
+});

+ 17 - 3
src/main/resources/templates/www/tuiyijunren/login.html

@@ -5,6 +5,9 @@
 <title>退伍军人就业创业综合服务平台</title>
 <link href="${resPath}/tuiyijunren/images/base.css" rel="stylesheet"/>
 <link href="${resPath}/tuiyijunren/images/basic.css" rel="stylesheet"/>
+<script type="text/javascript" language="javascript" src="${resPath}/tuiyijunren/images/jquery-1.7.2.min.js"></script>
+<script src="${ctxPath}/static/js/register/login.js"></script>
+<script src="${ctxPath}/static/js/login/login_tooltips.js"></script>
 </head>
 
 <body class="dl_body">
@@ -17,8 +20,14 @@
 			<input type="text" placeholder="账号:手机号/邮箱/昵称"/>
 			<input type="text" placeholder="密码:请输入您的密码"/>
 			<p>
-				<input type="text" placeholder="请输入验证码"/>
-				<img src="" style="background: #7B7B7B"/>
+				<input type="text" class="form-control" id="j_captcha" name="verifyCode" placeholder="验证码"
+					   aria-describedby="sizing-addon-password">
+				<span class="input-group-addon code" id="basic-addon-code">
+                        <img id="captcha_img" src="${ctxPath}/verify" onclick="changeCode();" alt="点击更换"
+							 title="点击更换" class="m">
+				</span>
+				<!--<input type="text" placeholder="请输入验证码"/>
+				<img src="" style="background: #7B7B7B"/>-->
 			</p>
 			<p>
 				<label>
@@ -29,9 +38,14 @@
 				</label>
 			</p>
 			
-			<input type="button" value="登录"/>
+			<input id="login" type="button" value="登录"/>
 			<a>忘记密码?</a>
 		</div>
 	</div>
 </body>
+<script type="text/javascript">
+	function changeCode() {
+		$("#captcha_img").attr("src", "${ctxPath}/verify?t=" + (new Date().getTime()));
+	}
+</script>
 </html>