Selaa lähdekoodia

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	src/main/java/cn/com/ctop/okr/config/ShiroConfig.java
#	src/main/java/cn/com/ctop/okr/controller/LoginController.java
#	src/main/resources/application.yml
syh 4 vuotta sitten
vanhempi
commit
8ceb1ea957

+ 4 - 3
src/main/java/cn/com/ctop/okr/config/ShiroConfig.java

@@ -2,6 +2,7 @@ package cn.com.ctop.okr.config;
 
 import cn.com.ctop.okr.shiro.authc.ShiroRealm;
 import cn.com.ctop.okr.shiro.authc.aop.JwtFilter;
+import cn.com.ctop.okr.shiro.authc.aop.ResourceCheckFilter;
 import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
 import org.apache.shiro.mgt.DefaultSubjectDAO;
 import org.apache.shiro.mgt.SecurityManager;
@@ -47,7 +48,7 @@ public class ShiroConfig {
         filterChainDefinitionMap.put("/callback/qywexin", "anon");
         filterChainDefinitionMap.put("/qywx/departAndUser", "anon");
         filterChainDefinitionMap.put("/department/queryTreeList", "anon");
-
+        filterChainDefinitionMap.put("/sys/logout", "anon");
 
         // 添加自己的过滤器并且取名为jwt
         Map<String, Filter> filterMap = new HashMap<>(1);
@@ -57,8 +58,8 @@ public class ShiroConfig {
         filterChainDefinitionMap.put("/**", "jwt");
 
         // 未授权界面返回JSON
-        shiroFilterFactoryBean.setUnauthorizedUrl("/sys/common/403");
-        shiroFilterFactoryBean.setLoginUrl("/sys/common/403");
+        shiroFilterFactoryBean.setUnauthorizedUrl("/login");
+        shiroFilterFactoryBean.setLoginUrl("/login");
         shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
         return shiroFilterFactoryBean;
     }

+ 71 - 0
src/main/java/cn/com/ctop/okr/config/XxlJobConfig.java

@@ -0,0 +1,71 @@
+package cn.com.ctop.okr.config;
+
+import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
+import com.xxl.job.core.log.XxlJobLogger;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * xxl-job config
+ *
+ * @author xuxueli 2017-04-28
+ */
+@Configuration
+public class XxlJobConfig {
+    @Value("${xxl.job.admin.addresses}")
+    private String adminAddresses;
+
+    @Value("${xxl.job.executor.appname}")
+    private String appName;
+
+    @Value("${xxl.job.executor.ip}")
+    private String ip;
+
+    @Value("${xxl.job.executor.port}")
+    private int port;
+
+    @Value("${xxl.job.accessToken}")
+    private String accessToken;
+
+    @Value("${xxl.job.executor.logpath}")
+    private String logPath;
+
+    @Value("${xxl.job.executor.logretentiondays}")
+    private int logRetentionDays;
+
+
+    @Bean
+    public XxlJobSpringExecutor xxlJobExecutor() {
+        XxlJobLogger.log(">>>>>>>>>>> xxl-job config init.");
+        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
+        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
+        xxlJobSpringExecutor.setAppName(appName);
+        xxlJobSpringExecutor.setIp(ip);
+        xxlJobSpringExecutor.setPort(port);
+        xxlJobSpringExecutor.setAccessToken(accessToken);
+        xxlJobSpringExecutor.setLogPath(logPath);
+        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
+
+        return xxlJobSpringExecutor;
+    }
+
+    /**
+     * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
+     *
+     *      1、引入依赖:
+     *          <dependency>
+     *             <groupId>org.springframework.cloud</groupId>
+     *             <artifactId>spring-cloud-commons</artifactId>
+     *             <version>${version}</version>
+     *         </dependency>
+     *
+     *      2、配置文件,或者容器启动变量
+     *          spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
+     *
+     *      3、获取IP
+     *          String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
+     */
+
+
+}

+ 22 - 8
src/main/java/cn/com/ctop/okr/controller/LoginController.java

@@ -1,10 +1,14 @@
 package cn.com.ctop.okr.controller;
 
+import cn.com.ctop.okr.constant.CommonConstant;
 import cn.com.ctop.okr.entity.QYWxUserInfo;
 import cn.com.ctop.okr.qywx.constant.QYWxConstant;
 import cn.com.ctop.okr.service.QYWxService;
+import cn.com.ctop.okr.shiro.vo.DefContants;
 import cn.com.ctop.okr.utils.JwtUtil;
 import cn.com.ctop.okr.utils.RedisUtil;
+import cn.com.ctop.okr.utils.oConvertUtils;
+import cn.com.ctop.okr.vo.LoginUser;
 import cn.com.ctop.okr.vo.Result;
 import com.alibaba.fastjson.JSONObject;
 import lombok.val;
@@ -84,9 +88,9 @@ public class LoginController {
         String userid = user.getUserid();  //userId
         // 生成token
         String token = JwtUtil.sign(openId, userid);
-        //redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);
-        // 设置超时时间
-        //redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME / 1000);
+        redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);
+        //设置超时时间
+        redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME / 1000);
 
         // 获取用户部门信息
         JSONObject obj = new JSONObject();
@@ -117,13 +121,23 @@ public class LoginController {
     @RequestMapping(value = "/logout")
     public Result<Object> logout(HttpServletRequest request, HttpServletResponse response) {
         //用户退出逻辑
-        Subject subject = SecurityUtils.getSubject();
-        //LoginUser sysUser = (LoginUser) subject.getPrincipal();
-        QYWxUserInfo sysUser = (QYWxUserInfo) subject.getPrincipal();
+        //Subject subject = SecurityUtils.getSubject();
+        //QYWxUserInfo sysUser = (QYWxUserInfo) subject.getPrincipal();
 
-        logger.info(" 用户名:  " + sysUser.getName() + ",退出成功! ");
-        subject.logout();
+        //logger.info(" 用户名:  " + sysUser.getName() + ",退出成功! ");
+        //subject.logout();
 
+        //if(){
+        //
+        //}HttpServletRequest httpServletRequest = (HttpServletRequest) request;
+
+        String token = request.getHeader(DefContants.X_ACCESS_TOKEN);
+        //String openId = JwtUtil.getUsername("");
+        //String cacheToken = String.valueOf(redisUtil.get(CommonConstant.PREFIX_USER_TOKEN + token));
+
+        if (token != null) {
+            redisUtil.del(CommonConstant.PREFIX_USER_TOKEN + token);
+        }
         return Result.ok("退出登录成功!");
     }
 

+ 78 - 6
src/main/java/cn/com/ctop/okr/controller/OkrController.java

@@ -2,15 +2,13 @@ package cn.com.ctop.okr.controller;
 
 import cn.com.ctop.okr.dto.OkrDto;
 import cn.com.ctop.okr.dto.UserInfoDto;
-import cn.com.ctop.okr.entity.OkrContentStatus;
-import cn.com.ctop.okr.entity.OkrKrInfo;
-import cn.com.ctop.okr.entity.OkrObjectInfo;
-import cn.com.ctop.okr.entity.OkrTaskInfo;
+import cn.com.ctop.okr.entity.*;
 import cn.com.ctop.okr.service.OkrService;
 import cn.com.ctop.okr.vo.Result;
 import com.alibaba.fastjson.JSONObject;
 import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
+import org.apache.shiro.SecurityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -20,6 +18,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -117,7 +116,7 @@ public class OkrController {
     public Result saveOkrMember(@RequestBody UserInfoDto dto,
                              HttpServletRequest request,
                              HttpServletResponse response){
-        logger.info("/okr/getOkrInfo 方法开始");
+        logger.info("/okr/saveOkrMember 方法开始");
         Result result = new Result();
         List<String> userIdList = dto.getUserIdList();
         if(userIdList == null || userIdList.size() == 0){
@@ -133,7 +132,80 @@ public class OkrController {
             result.setSuccess(false);
             result.setMessage("error");
         }finally{
-            logger.info("/okr/getOkrInfo 方法结束");
+            logger.info("/okr/saveOkrMember 方法结束");
+        }
+
+        return result;
+    }
+
+    @ResponseBody
+    @RequestMapping(value = "/deleteOkrMember")
+    public Result deleteOkrMember(@RequestBody UserInfoDto dto,
+                                HttpServletRequest request,
+                                HttpServletResponse response){
+        logger.info("/okr/deleteOkrMember 方法开始");
+        Result result = new Result();
+        if(dto == null || StringUtils.isBlank(dto.getMemberId())){
+            result.setSuccess(false);
+            result.setMessage("需要删除的同步人不能为空");
+            return result;
+        }
+
+        try {
+            okrService.deleteOkrMember(dto.getMemberId());
+        }catch (Exception e){
+            logger.error(e.getMessage());
+            result.setSuccess(false);
+            result.setMessage("error");
+        }finally{
+            logger.info("/okr/deleteOkrMember 方法结束");
+        }
+
+        return result;
+    }
+
+    @ResponseBody
+    @RequestMapping(value = "/saveOkrMember2")
+    public Result saveOkrMember2(@RequestBody UserInfoDto dto,
+                                HttpServletRequest request,
+                                HttpServletResponse response){
+        logger.info("/okr/saveOkrMember2 方法开始");
+        Result result = new Result();
+        List<String> userIdList = dto.getUserIdList();
+        if(userIdList == null || userIdList.size() == 0){
+            result.setSuccess(false);
+            result.setMessage("同步人员不能为空");
+            return result;
+        }
+
+        List<String> userListFilter = new ArrayList<>();
+        //同步人是否重复校验
+        List<UserInfoDto> memberList = okrService.getMemberListByUserId(null);
+        for(String userId:userIdList){
+            int filter = 0;
+            for (UserInfoDto memberInfo:memberList){
+                if(StringUtils.equals(userId,memberInfo.getUserId())){
+                    //result.setSuccess(false);
+                    //result.setMessage(memberInfo.getName() + "已是同步人,请重新选择");
+                    //return result;
+                    filter = -1;
+                    break;
+                }
+            }
+            if(filter == 0){
+                userListFilter.add(userId);
+            }
+
+        }
+
+        try {
+            okrService.insertOkrMember2(userListFilter);
+        }catch (Exception e){
+            logger.error(e.getMessage());
+            result.setSuccess(false);
+            result.setMessage("error");
+        }finally{
+            logger.info("/okr/saveOkrMember2 方法结束");
         }
 
         return result;

+ 1 - 0
src/main/java/cn/com/ctop/okr/dto/UserInfoDto.java

@@ -13,5 +13,6 @@ public class UserInfoDto {
     private List<String> userIdList;
     private Integer year;
     private Integer quarter;
+    private String memberId;
 
 }

+ 3 - 1
src/main/java/cn/com/ctop/okr/mapper/OkrMemberMapper.java

@@ -8,7 +8,9 @@ import org.apache.ibatis.annotations.Param;
 import java.util.List;
 
 public interface OkrMemberMapper extends BaseMapper<OkrContentStatus> {
-    void deleteOkrMemberByUserId(@Param("userId")String userId);
+    void deleteOkrMemberByUserId(@Param("userId")String userId, @Param("year")Integer year, @Param("quarter")Integer quarter);
+
+    void deleteOkrMemberByUserId2(@Param("userId")String userId, @Param("memberId")String memberId,@Param("year")Integer year, @Param("quarter")Integer quarter);
 
     void insertOkrMember(@Param("userId")String userId, @Param("memberList") List<String> memberList, @Param("year")Integer year, @Param("quarter")Integer quarter);
 

+ 12 - 0
src/main/java/cn/com/ctop/okr/mapper/xml/OkrMemberMapper.xml

@@ -25,6 +25,18 @@
         from
         okr_member
         where user_id = #{userId}
+        and year = #{year}
+        and quarter = #{quarter}
+    </delete>
+
+    <delete id="deleteOkrMemberByUserId2">
+        delete
+        from
+        okr_member
+        where user_id = #{userId}
+        and member_id = #{memberId}
+        and year = #{year}
+        and quarter = #{quarter}
     </delete>
 
     <insert id="insertOkrMember">

+ 1 - 0
src/main/java/cn/com/ctop/okr/mapper/xml/OkrTaskInfoMapper.xml

@@ -17,6 +17,7 @@
         type = #{type}
         and
         status = 1
+        order by priority
     </select>
 
     <!-- 增加任务 -->

+ 4 - 0
src/main/java/cn/com/ctop/okr/service/OkrService.java

@@ -17,6 +17,10 @@ public interface OkrService{
 
     void insertOkrMember(List<String> memberList);
 
+    void deleteOkrMember(String memberId);
+
+    void insertOkrMember2(List<String> memberList);
+
     List<UserInfoDto> getMemberListByUserId(String name);
 
     Map<String, Object> getSyncUserListByMemberId(JSONObject data);

+ 26 - 1
src/main/java/cn/com/ctop/okr/service/impl/OkrServiceImpl.java

@@ -87,11 +87,36 @@ public class OkrServiceImpl implements OkrService {
         Integer quarter = DateUtils.getQuarter(new Date());
         Integer year = DateUtils.getYear(new Date());
 
-        okrMemberMapper.deleteOkrMemberByUserId(userId);
+        okrMemberMapper.deleteOkrMemberByUserId(userId,year,quarter);
         okrMemberMapper.insertOkrMember(userId, memberList, year, quarter);
     }
 
     @Override
+    public void insertOkrMember2(List<String> memberList){
+        QYWxUserInfo sysUser = (QYWxUserInfo) SecurityUtils.getSubject().getPrincipal();
+        String userId = sysUser.getOpenId();
+        //String userId = "ou_03c4826ae66623a53f2af456ff3661a1";
+
+        Integer quarter = DateUtils.getQuarter(new Date());
+        Integer year = DateUtils.getYear(new Date());
+
+        //okrMemberMapper.deleteOkrMemberByUserId2(userId,memyear,quarter);
+        okrMemberMapper.insertOkrMember(userId, memberList, year, quarter);
+    }
+
+    @Override
+    public void deleteOkrMember(String memberId){
+        QYWxUserInfo sysUser = (QYWxUserInfo) SecurityUtils.getSubject().getPrincipal();
+        String userId = sysUser.getOpenId();
+
+        Integer quarter = DateUtils.getQuarter(new Date());
+        Integer year = DateUtils.getYear(new Date());
+
+        okrMemberMapper.deleteOkrMemberByUserId2(userId, memberId, year, quarter);
+
+    }
+
+    @Override
     public List<UserInfoDto> getMemberListByUserId(String name){
         QYWxUserInfo sysUser = (QYWxUserInfo) SecurityUtils.getSubject().getPrincipal();
         String userId = sysUser.getOpenId();

+ 17 - 9
src/main/java/cn/com/ctop/okr/service/impl/QYWxServiceImpl.java

@@ -12,6 +12,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sun.media.jfxmedia.logging.Logger;
 import jdk.nashorn.internal.runtime.UserAccessorProperty;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.shiro.SecurityUtils;
@@ -128,17 +129,24 @@ public class QYWxServiceImpl extends ServiceImpl<CorpUserInfoMapper, CorpUserInf
      * @param token
      * @throws Exception
      */
-    public void updateUserOpenId(String token) throws Exception {
+    public void updateUserOpenId(String token) {
         List<String> userList = wxUserInfoMapper.getUseridList();
         for(String userid:userList){
-            JSONObject resultJson = DepartUserProvider.convertUserIdToOpenId(userid, token);
-            Integer errcode = resultJson.getInteger("errcode");
-            if(errcode == 0){
-                String openId = resultJson.getString("openid");
-                wxUserInfoMapper.updateUserInfoByUserid(userid, openId);
-                wxUserInfoMapper.updateUserDepartMapOpenIdByUserid(userid, openId);
-            }else{
-                throw new Exception("userid转换为openId出错啦,resultJson为" + resultJson);
+            try{
+                JSONObject resultJson = DepartUserProvider.convertUserIdToOpenId(userid, token);
+
+                Integer errcode = resultJson.getInteger("errcode");
+                if(errcode == 0){
+                    String openId = resultJson.getString("openid");
+                    wxUserInfoMapper.updateUserInfoByUserid(userid, openId);
+                    wxUserInfoMapper.updateUserDepartMapOpenIdByUserid(userid, openId);
+                }else{
+                    //throw new Exception("userid转换为openId出错啦,resultJson为" + resultJson);
+                    System.out.println(userid + " : userid转换为openId出错啦" + resultJson);
+                    //log.info("1112");
+                }
+            }catch(Exception e){
+
             }
         }
 

+ 7 - 4
src/main/java/cn/com/ctop/okr/shiro/authc/ShiroRealm.java

@@ -92,6 +92,7 @@ public class ShiroRealm extends AuthorizingRealm {
                 return new SimpleAuthenticationInfo(loginUser, token, getName());
             }
         }
+
         return null;
     }
 
@@ -111,7 +112,7 @@ public class ShiroRealm extends AuthorizingRealm {
         String openId = JwtUtil.getUsername(token);  //username即为open_id
         if (openId == null) {
             log.error("token非法无效!");
-            // throw new AuthenticationException("token非法无效!");
+            throw new AuthenticationException("token非法无效!");
         }
         // 查询用户信息
         QYWxUserInfo loginUser = new QYWxUserInfo();
@@ -122,9 +123,11 @@ public class ShiroRealm extends AuthorizingRealm {
         }
 
         // 校验token是否超时失效 & 或者账号密码是否错误
-//        if (!jwtTokenRefresh(token, username, sysUser.getPassword())) {
-//            log.error("Token失效,请重新登录!");
-//        }
+        if (!jwtTokenRefresh(token, userInfo.getOpenId(), userInfo.getUserid())) {
+            log.error("Token失效,请重新登录!");
+            throw new AuthenticationException("Token失效,请重新登录!!");
+            //return null;
+        }
 
         // 判断用户状态
         //if (sysUser.getStatus() != 1) {

+ 43 - 3
src/main/java/cn/com/ctop/okr/shiro/authc/aop/JwtFilter.java

@@ -2,6 +2,9 @@ package cn.com.ctop.okr.shiro.authc.aop;
 
 import cn.com.ctop.okr.shiro.authc.JwtToken;
 import cn.com.ctop.okr.shiro.vo.DefContants;
+import cn.com.ctop.okr.shiro.vo.JsonResponse;
+import cn.com.ctop.okr.shiro.vo.ResponseBean;
+import com.alibaba.fastjson.JSON;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter;
 import org.springframework.http.HttpStatus;
@@ -11,6 +14,8 @@ import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
 
 /**
  * @Description: 鉴权登录拦截器
@@ -30,7 +35,8 @@ public class JwtFilter extends BasicHttpAuthenticationFilter {
      */
     @Override
     protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
-
+        HttpServletRequest req = (HttpServletRequest) request;
+        HttpServletResponse resp = (HttpServletResponse) response;
         boolean successful = false;
         try {
             successful = executeLogin(request, response);
@@ -46,7 +52,6 @@ public class JwtFilter extends BasicHttpAuthenticationFilter {
      */
     @Override
     protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception {
-
         try {
             HttpServletRequest httpServletRequest = (HttpServletRequest) request;
             String token = httpServletRequest.getHeader(DefContants.X_ACCESS_TOKEN);
@@ -56,10 +61,10 @@ public class JwtFilter extends BasicHttpAuthenticationFilter {
             // 如果没有抛出异常则代表登入成功,返回true
             return true;
         } catch (Exception e) {
+
             return false;
         }
 
-
     }
 
     /**
@@ -79,4 +84,39 @@ public class JwtFilter extends BasicHttpAuthenticationFilter {
         }
         return super.preHandle(request, response);
     }
+
+    @Override
+    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
+        JsonResponse<Void> res = JsonResponse.noLogin("请先登录");
+
+        //resp.sendRedirect("http://localhost:3000/login");
+        //response.sendRedirect(state + "?code=" + code);
+        //((HttpServletResponse) response).setContentType("application/json; charset=utf-8");
+       // ResponseBean bean = new ResponseBean(500,"Token失效,请重新登录!",null);
+        //返回json
+        //((HttpServletResponse) response).getOutputStream().print("error");
+
+        out((HttpServletResponse) response, res);
+
+        return Boolean.FALSE ;
+    }
+
+
+    private void out(HttpServletResponse response, JsonResponse jsonObj){
+        PrintWriter out = null;
+        try {
+            response.setStatus(500);
+            response.setCharacterEncoding("UTF-8");
+            response.setContentType("application/json; charset=utf-8");
+            out = response.getWriter();
+            out.write(JSON.toJSONString(jsonObj));
+            //response.sendRedirect("192.168.1.94:3000/login");
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if (out != null) {
+                out.close();
+            }
+        }
+    }
 }

+ 58 - 0
src/main/java/cn/com/ctop/okr/shiro/authc/aop/MyMvcExceptionHandler.java

@@ -0,0 +1,58 @@
+package cn.com.ctop.okr.shiro.authc.aop;
+
+import cn.com.ctop.okr.shiro.vo.JsonResStateEnum;
+import cn.com.ctop.okr.shiro.vo.JsonResponse;
+import com.alibaba.fastjson.JSON;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authz.AuthorizationException;
+import org.apache.shiro.authz.UnauthenticatedException;
+import org.apache.shiro.authz.UnauthorizedException;
+import org.apache.shiro.session.UnknownSessionException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerExceptionResolver;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+//@Component
+public class MyMvcExceptionHandler implements HandlerExceptionResolver {
+
+    protected final Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Override
+    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
+
+        logger.error(ex.getMessage(), ex);
+
+        if (ex instanceof UnauthenticatedException || ex instanceof AuthenticationException || ex instanceof UnknownSessionException) {
+            return outJson(request, response, JsonResponse.noLogin("请先登录"));
+        }
+        if (ex instanceof UnauthorizedException || ex instanceof AuthorizationException) {
+            return outJson(request, response, JsonResponse.noPermission("没有访问权限"));
+        }
+        return outJson(request, response, JsonResponse.error(ex.getMessage(), JsonResStateEnum.SYSTEM_ERROR));
+    }
+
+    private ModelAndView outJson(HttpServletRequest request, HttpServletResponse response, JsonResponse res) {
+        ModelAndView mv = new ModelAndView();
+        /*  使用response返回    */
+        response.setStatus(HttpStatus.OK.value()); //设置状态码
+        response.setContentType(MediaType.APPLICATION_JSON_VALUE); //设置ContentType
+        response.setCharacterEncoding("UTF-8"); //避免乱码
+        response.setHeader("Cache-Control", "no-cache, must-revalidate");
+        try {
+            String json = JSON.toJSONString(res);
+            response.getWriter().write(json);
+        } catch (IOException e) {
+            logger.error("与客户端通讯异常:" + e.getMessage(), e);
+        }
+
+        return mv;
+    }
+}

+ 35 - 0
src/main/java/cn/com/ctop/okr/shiro/vo/JsonResStateEnum.java

@@ -0,0 +1,35 @@
+package cn.com.ctop.okr.shiro.vo;
+
+public interface JsonResStateEnum  {
+
+    /**
+     * 没有登录时的状态
+     */
+    public static final  Integer NO_LOGIN = -1;
+
+    /**
+     * 没有访问权限时的状态
+     */
+    public static final  Integer NO_PERMISSION = -2;
+
+    /**
+     * 系统错误时的错误, 不可掌控错误
+     */
+    public static final  Integer SYSTEM_ERROR = -3;
+
+    /**
+     * token验证错误
+     */
+    public static final Integer TOKEN_ERROR = -4;
+
+    /**
+     * 由用户自定义返回的错误, 受用户掌控
+     */
+    public static final  Integer USER_ERROR = 0;
+
+    /**
+     * 正常状态
+     */
+    public static final  Integer SUCCESS = 1;
+
+}

+ 106 - 0
src/main/java/cn/com/ctop/okr/shiro/vo/JsonResponse.java

@@ -0,0 +1,106 @@
+package cn.com.ctop.okr.shiro.vo;
+
+import java.io.Serializable;
+
+//@ApiModel
+public class JsonResponse<T> implements Serializable {
+
+    private static final long serialVersionUID = -7817536542662556767L;
+
+    //@ApiModelProperty("请求成功/失败标志")
+    private boolean success;
+
+    //@ApiModelProperty("状态码, -1:没有登录, -2:没有权限, -3:系统报错, 0: 后台返回错误信息, 1: 成功访问")
+    private int code;
+
+    //@ApiModelProperty("访问提示信息")
+    private String msg;
+
+    //@ApiModelProperty("后台返回数据")
+    private T data;
+
+    public JsonResponse() {
+    }
+
+    public JsonResponse(boolean success) {
+        this();
+        this.success = success;
+    }
+
+    public JsonResponse(boolean success, String msg) {
+        this(success);
+        this.msg = msg;
+    }
+
+    public JsonResponse(boolean success, String msg, int code) {
+        this(success, msg);
+        this.code = code;
+    }
+
+    public JsonResponse(boolean success, String msg, int code, T data) {
+        this(success, msg, code);
+        this.data = data;
+    }
+
+    public boolean isSuccess() {
+        return success;
+    }
+
+    public void setSuccess(boolean success) {
+        this.success = success;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public static JsonResponse<Void> SUCCESS = new JsonResponse<>(true);
+
+    public static <T> JsonResponse<T> success(T data) {
+        return new JsonResponse<>(true, null, JsonResStateEnum.SUCCESS, data);
+    }
+
+    public static <T> JsonResponse<T> success(T data, String msg) {
+        return new JsonResponse<>(true, msg, JsonResStateEnum.SUCCESS, data);
+    }
+
+    public static <T> JsonResponse<T> error(String msg) {
+        return new JsonResponse<>(false, msg, JsonResStateEnum.USER_ERROR);
+    }
+
+    public static <T> JsonResponse<T> error(String msg,  T data) {
+        return new JsonResponse<>(false, msg, JsonResStateEnum.USER_ERROR, data);
+    }
+
+    public static <T> JsonResponse<T> error(String msg, int code) {
+        return new JsonResponse<>(false, msg, code);
+    }
+
+    public static <T> JsonResponse<T> noLogin(String msg) {
+        return new JsonResponse<>(false, msg, JsonResStateEnum.NO_LOGIN);
+    }
+
+    public static <T> JsonResponse<T> noPermission(String msg) {
+        return new JsonResponse<>(false, msg, JsonResStateEnum.NO_PERMISSION);
+    }
+}

+ 7 - 1
src/main/java/cn/com/ctop/okr/utils/DateUtils.java

@@ -1367,7 +1367,13 @@ public class DateUtils extends PropertyEditorSupport {
     }
 
     public static void main(String[] args) {
-        System.out.println(stampToDate(1593740000L * 1000));
+        //System.out.println(stampToDate(1593740000L * 1000));
+        Integer pageSize = 20;
+
+        Integer TotalPage = (20-1)/pageSize + 1;
+
+        System.out.println(TotalPage);
+
     }
 }
 

+ 4 - 2
src/main/java/cn/com/ctop/okr/utils/JwtUtil.java

@@ -20,7 +20,9 @@ public class JwtUtil {
     /**
      * 过期时间30分钟
      */
-    public static final long EXPIRE_TIME = 30 * 60 * 1000;
+    public static final long EXPIRE_TIME = 2 * 24 * 60 * 60 * 1000;
+    //public static final long EXPIRE_TIME = 10 * 1000;
+
 
     /**
      * 校验token是否正确
@@ -67,7 +69,7 @@ public class JwtUtil {
         Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
         Algorithm algorithm = Algorithm.HMAC256(secret);
         // 附带username信息
-        return JWT.create().withClaim("username", username).withExpiresAt(date).sign(algorithm);
+        return JWT.create().withClaim("username", username).sign(algorithm);  //.withExpiresAt(date)
 
     }