Jelajahi Sumber

搜索回到第一页

suochencheng 7 tahun lalu
induk
melakukan
8be66481c9
93 mengubah file dengan 445 tambahan dan 7 penghapusan
  1. 2 0
      src/main/java/com/izouma/awesomeadmin/service/UserInfoService.java
  2. 72 3
      src/main/java/com/izouma/awesomeadmin/service/impl/UserInfoServiceImpl.java
  3. 24 0
      src/main/java/com/izouma/awesomeadmin/shiro/WeiXinCodeRealm.java
  4. 93 0
      src/main/java/com/izouma/awesomeadmin/shiro/WeiXinCodeToken.java
  5. 244 0
      src/main/java/com/izouma/awesomeadmin/web/WeiXinController.java
  6. 2 2
      src/main/resources/properties/outsidews.properties
  7. 4 0
      src/main/resources/spring/applicationContext.xml
  8. 1 1
      src/main/vue/src/pages/UserCollections.vue
  9. 1 1
      src/main/webapp/WEB-INF/html/admin.html
  10. 2 0
      src/main/webapp/static/js/17.ab5182df4702e223d9d0.js
  11. 0 0
      src/main/webapp/static/js/17.ab5182df4702e223d9d0.js.map
  12. 0 0
      src/main/webapp/static/js/18.255b4a8a1fe65b180e8d.js
  13. 0 0
      src/main/webapp/static/js/18.255b4a8a1fe65b180e8d.js.map
  14. 0 0
      src/main/webapp/static/js/19.3604f5d9b3ef9bdd423a.js
  15. 0 0
      src/main/webapp/static/js/19.3604f5d9b3ef9bdd423a.js.map
  16. 0 0
      src/main/webapp/static/js/19.75d481bc6518e89d7880.js
  17. 0 0
      src/main/webapp/static/js/19.75d481bc6518e89d7880.js.map
  18. 0 0
      src/main/webapp/static/js/27.5e6e4578577105f839e1.js
  19. 0 0
      src/main/webapp/static/js/27.5e6e4578577105f839e1.js.map
  20. 0 0
      src/main/webapp/static/js/28.34f6e05777d4755eea25.js
  21. 0 0
      src/main/webapp/static/js/28.34f6e05777d4755eea25.js.map
  22. 0 0
      src/main/webapp/static/js/28.f15e5260dd4b1da646e1.js
  23. 0 0
      src/main/webapp/static/js/28.f15e5260dd4b1da646e1.js.map
  24. 0 0
      src/main/webapp/static/js/37.05744d76e2c443c45e5c.js
  25. 0 0
      src/main/webapp/static/js/37.05744d76e2c443c45e5c.js.map
  26. 0 0
      src/main/webapp/static/js/38.1c4e469927d9b0f95605.js
  27. 0 0
      src/main/webapp/static/js/38.1c4e469927d9b0f95605.js.map
  28. 0 0
      src/main/webapp/static/js/39.42a07d44d3d024ff9968.js
  29. 0 0
      src/main/webapp/static/js/39.42a07d44d3d024ff9968.js.map
  30. 0 0
      src/main/webapp/static/js/40.58a3156604b8370db9c3.js
  31. 0 0
      src/main/webapp/static/js/40.58a3156604b8370db9c3.js.map
  32. 0 0
      src/main/webapp/static/js/41.4ca89a3f34a471e96db7.js
  33. 0 0
      src/main/webapp/static/js/41.4ca89a3f34a471e96db7.js.map
  34. 0 0
      src/main/webapp/static/js/42.819e0436fcbbcaa49e27.js
  35. 0 0
      src/main/webapp/static/js/42.819e0436fcbbcaa49e27.js.map
  36. 0 0
      src/main/webapp/static/js/43.c111ea45834a7f0e4d62.js
  37. 0 0
      src/main/webapp/static/js/43.c111ea45834a7f0e4d62.js.map
  38. 0 0
      src/main/webapp/static/js/44.df9bfa10157b34c75c62.js
  39. 0 0
      src/main/webapp/static/js/44.df9bfa10157b34c75c62.js.map
  40. 0 0
      src/main/webapp/static/js/45.269e35b69430f44a28bb.js
  41. 0 0
      src/main/webapp/static/js/45.269e35b69430f44a28bb.js.map
  42. 0 0
      src/main/webapp/static/js/46.7608db7405ae3b9df22f.js
  43. 0 0
      src/main/webapp/static/js/46.7608db7405ae3b9df22f.js.map
  44. 0 0
      src/main/webapp/static/js/47.aaa7d71ea815a3aa6e84.js
  45. 0 0
      src/main/webapp/static/js/47.aaa7d71ea815a3aa6e84.js.map
  46. 0 0
      src/main/webapp/static/js/48.a5563be8f4282b0c1421.js
  47. 0 0
      src/main/webapp/static/js/48.a5563be8f4282b0c1421.js.map
  48. 0 0
      src/main/webapp/static/js/49.60ede8ff5bd1f15db0fe.js
  49. 0 0
      src/main/webapp/static/js/49.60ede8ff5bd1f15db0fe.js.map
  50. 0 0
      src/main/webapp/static/js/49.f124e9c019cee95b2a37.js
  51. 0 0
      src/main/webapp/static/js/49.f124e9c019cee95b2a37.js.map
  52. 0 0
      src/main/webapp/static/js/50.0bdbb9a242807fbeb35e.js
  53. 0 0
      src/main/webapp/static/js/50.0bdbb9a242807fbeb35e.js.map
  54. 0 0
      src/main/webapp/static/js/51.fa7bf1f3a680744fd6ff.js
  55. 0 0
      src/main/webapp/static/js/51.fa7bf1f3a680744fd6ff.js.map
  56. 0 0
      src/main/webapp/static/js/52.bdd61dd443e175360d64.js
  57. 0 0
      src/main/webapp/static/js/52.bdd61dd443e175360d64.js.map
  58. 0 0
      src/main/webapp/static/js/53.98e8d8ffe13d4ce1a3eb.js
  59. 0 0
      src/main/webapp/static/js/53.98e8d8ffe13d4ce1a3eb.js.map
  60. 0 0
      src/main/webapp/static/js/54.3750da222612e1831308.js
  61. 0 0
      src/main/webapp/static/js/54.3750da222612e1831308.js.map
  62. 0 0
      src/main/webapp/static/js/55.82d7a9505897bffc5695.js
  63. 0 0
      src/main/webapp/static/js/55.82d7a9505897bffc5695.js.map
  64. 0 0
      src/main/webapp/static/js/56.8f7927ce3c0428cdbbbc.js
  65. 0 0
      src/main/webapp/static/js/56.8f7927ce3c0428cdbbbc.js.map
  66. 0 0
      src/main/webapp/static/js/57.9c2e83a2112aaaec0fb2.js
  67. 0 0
      src/main/webapp/static/js/57.9c2e83a2112aaaec0fb2.js.map
  68. 0 0
      src/main/webapp/static/js/58.a200f8a91be9626137b8.js
  69. 0 0
      src/main/webapp/static/js/58.a200f8a91be9626137b8.js.map
  70. 0 0
      src/main/webapp/static/js/59.97012ca9ef04893925fc.js
  71. 0 0
      src/main/webapp/static/js/59.97012ca9ef04893925fc.js.map
  72. 0 0
      src/main/webapp/static/js/60.e3a6b59373d8feedc627.js
  73. 0 0
      src/main/webapp/static/js/60.e3a6b59373d8feedc627.js.map
  74. 0 0
      src/main/webapp/static/js/61.ec48f216ee36812b5ba5.js
  75. 0 0
      src/main/webapp/static/js/61.ec48f216ee36812b5ba5.js.map
  76. 0 0
      src/main/webapp/static/js/62.bfe424b41d9811133c54.js
  77. 0 0
      src/main/webapp/static/js/62.bfe424b41d9811133c54.js.map
  78. 0 0
      src/main/webapp/static/js/8.137753c64325f50c92a9.js
  79. 0 0
      src/main/webapp/static/js/8.137753c64325f50c92a9.js.map
  80. 0 0
      src/main/webapp/static/js/8.8fe2d0be3860177e8eac.js
  81. 0 0
      src/main/webapp/static/js/8.8fe2d0be3860177e8eac.js.map
  82. 0 0
      src/main/webapp/static/js/9.a7da0e79e9720c2a8222.js
  83. 0 0
      src/main/webapp/static/js/9.a7da0e79e9720c2a8222.js.map
  84. 0 0
      src/main/webapp/static/js/app.46941187f8854d06a8d2.js
  85. 0 0
      src/main/webapp/static/js/app.46941187f8854d06a8d2.js.map
  86. 0 0
      src/main/webapp/static/js/app.fba85f862f7a89bccc43.js
  87. 0 0
      src/main/webapp/static/js/app.fba85f862f7a89bccc43.js.map
  88. 0 0
      src/main/webapp/static/js/manifest.5e11137335f65dfb940f.js
  89. 0 0
      src/main/webapp/static/js/manifest.5e11137335f65dfb940f.js.map
  90. 0 0
      src/main/webapp/static/js/manifest.f234410ab69e0fe6d64a.js
  91. 0 0
      src/main/webapp/static/js/manifest.f234410ab69e0fe6d64a.js.map
  92. 0 0
      src/main/webapp/static/js/vendor.d308c559ff3070fd266c.js
  93. 0 0
      src/main/webapp/static/js/vendor.d308c559ff3070fd266c.js.map

+ 2 - 0
src/main/java/com/izouma/awesomeadmin/service/UserInfoService.java

@@ -29,5 +29,7 @@ public interface UserInfoService {
     UserInfo login(String username, String password);
     UserInfo login(String username, String password);
 
 
     UserInfo loginSms(String phone, String code, String sessionId) throws UserInfoServiceImpl.LoginException;
     UserInfo loginSms(String phone, String code, String sessionId) throws UserInfoServiceImpl.LoginException;
+
+    UserInfo loginWeiXin(String openId, String nickname, String sex, String headimgurl);
 }
 }
 
 

+ 72 - 3
src/main/java/com/izouma/awesomeadmin/service/impl/UserInfoServiceImpl.java

@@ -4,6 +4,7 @@ import com.izouma.awesomeadmin.constant.AppConstant;
 import com.izouma.awesomeadmin.dao.UserInfoMapper;
 import com.izouma.awesomeadmin.dao.UserInfoMapper;
 import com.izouma.awesomeadmin.dto.Page;
 import com.izouma.awesomeadmin.dto.Page;
 import com.izouma.awesomeadmin.model.UserInfo;
 import com.izouma.awesomeadmin.model.UserInfo;
+import com.izouma.awesomeadmin.service.OSSFileService;
 import com.izouma.awesomeadmin.service.UserInfoService;
 import com.izouma.awesomeadmin.service.UserInfoService;
 import com.izouma.awesomeadmin.util.MD5Util;
 import com.izouma.awesomeadmin.util.MD5Util;
 import com.izouma.awesomeadmin.util.PropertiesFileLoader;
 import com.izouma.awesomeadmin.util.PropertiesFileLoader;
@@ -14,9 +15,11 @@ import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 
 /**
 /**
  * user_info service接口实现类
  * user_info service接口实现类
@@ -32,6 +35,9 @@ public class UserInfoServiceImpl implements UserInfoService {
     @Autowired
     @Autowired
     private UserInfoMapper userInfoMapper;
     private UserInfoMapper userInfoMapper;
 
 
+    @Autowired
+    private OSSFileService ossFileService;
+
     @Override
     @Override
     public List<UserInfo> getUserInfoList(UserInfo record) {
     public List<UserInfo> getUserInfoList(UserInfo record) {
 
 
@@ -195,6 +201,69 @@ public class UserInfoServiceImpl implements UserInfoService {
         throw new LoginException("验证码错误");
         throw new LoginException("验证码错误");
     }
     }
 
 
+    @Override
+    public UserInfo loginWeiXin(String openId, String nickname, String sex, String headimgurl) {
+        logger.info("loginWeiXin");
+        try {
+            UserInfo userInfo = new UserInfo();
+            userInfo.setOpenId(openId);
+            userInfo = getUserInfo(userInfo);
+
+            if (userInfo == null) {
+                userInfo = new UserInfo();
+                userInfo.setUsername(nickname);
+                userInfo.setNickname(nickname);
+                userInfo.setWechatName(nickname);
+                userInfo.setSex(sex);
+                userInfo.setOpenId(openId);
+                if (StringUtils.isNotEmpty(headimgurl)) {
+                    HttpURLConnection httpUrl = null;
+                    URL iconUrl = null;
+                    try {
+                        iconUrl = new URL(headimgurl);
+                        httpUrl = (HttpURLConnection) iconUrl.openConnection();
+                        httpUrl.connect();
+                        // 图片生成名称
+                        String fileName = "";
+                        Date nowDate = new Date();
+                        // 格式化时间对象返回字符串
+                        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
+                        fileName += sdf.format(nowDate);
+                        Random random = new Random();
+                        String randomCode = "";
+                        for (int i = 0; i < 8; i++) {
+                            randomCode += Integer.toString(random.nextInt(36), 36);
+                        }
+                        fileName += randomCode;
+                        String virtualPath = "xiangjuwu/application/" + fileName + ".jpg";
+                        // item.write(new File(uploadPath + fileName));
+                        String result = ossFileService.upload(httpUrl.getInputStream(), virtualPath);
+                        System.out.println("存入照片:" + result);
+                        userInfo.setIcon(result);
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    } finally {
+                        if (httpUrl != null) {
+                            httpUrl.disconnect();
+                        }
+                    }
+                } else {
+
+                    userInfo.setIcon("https://microball.oss-cn-hangzhou.aliyuncs.com/huanbaojia/icon_morentouxiang.png");
+                }
+                if (!createUserInfo(userInfo)) {
+                    return null;
+                }
+            }
+
+            return userInfo;
+
+        } catch (Exception e) {
+            logger.error("loginWeiXin", e);
+        }
+        return null;
+    }
+
     public class LoginException extends Exception {
     public class LoginException extends Exception {
         public LoginException(String message) {
         public LoginException(String message) {
             super(message);
             super(message);

+ 24 - 0
src/main/java/com/izouma/awesomeadmin/shiro/WeiXinCodeRealm.java

@@ -0,0 +1,24 @@
+package com.izouma.awesomeadmin.shiro;
+
+import com.izouma.awesomeadmin.model.UserInfo;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.AuthenticationInfo;
+import org.apache.shiro.authc.AuthenticationToken;
+import org.apache.shiro.authc.SimpleAuthenticationInfo;
+
+public class WeiXinCodeRealm extends BaseRealm {
+
+    @Override
+    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
+        UserInfo userInfo = null;
+        WeiXinCodeToken weiXinCodeToken = (WeiXinCodeToken) token;
+
+        userInfo = userInfoService.loginWeiXin(weiXinCodeToken.getOpenId(), weiXinCodeToken.getNickname(), weiXinCodeToken.getSex(), weiXinCodeToken.getHeadimgurl());
+        if (userInfo == null) {
+            throw new AuthenticationException("登录失败");
+        }
+        return new SimpleAuthenticationInfo(userInfo, token.getCredentials(), this.getName());
+
+
+    }
+}

+ 93 - 0
src/main/java/com/izouma/awesomeadmin/shiro/WeiXinCodeToken.java

@@ -0,0 +1,93 @@
+package com.izouma.awesomeadmin.shiro;
+
+import org.apache.shiro.authc.HostAuthenticationToken;
+import org.apache.shiro.authc.RememberMeAuthenticationToken;
+
+public class WeiXinCodeToken implements HostAuthenticationToken, RememberMeAuthenticationToken {
+
+    private boolean rememberMe;
+    private String host;
+    private String code;
+    private String openId;
+    private String nickname;
+    private String sex;
+
+    private String headimgurl;
+
+    public WeiXinCodeToken(String code, String openId, String nickname, String sex, String headimgurl) {
+        this.code = code;
+        this.openId = openId;
+        this.nickname = nickname;
+        this.sex = sex;
+        this.headimgurl = headimgurl;
+    }
+
+    public void setRememberMe(boolean rememberMe) {
+        this.rememberMe = rememberMe;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getOpenId() {
+        return openId;
+    }
+
+    public void setOpenId(String openId) {
+        this.openId = openId;
+    }
+
+    @Override
+    public String getHost() {
+        return host;
+    }
+
+    @Override
+    public boolean isRememberMe() {
+        return rememberMe;
+    }
+
+    @Override
+    public Object getPrincipal() {
+        return openId;
+    }
+
+    @Override
+    public Object getCredentials() {
+        return code;
+    }
+
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+
+    public String getHeadimgurl() {
+        return headimgurl;
+    }
+
+    public void setHeadimgurl(String headimgurl) {
+        this.headimgurl = headimgurl;
+    }
+
+    public String getNickname() {
+        return nickname;
+    }
+
+    public void setNickname(String nickname) {
+        this.nickname = nickname;
+    }
+}

+ 244 - 0
src/main/java/com/izouma/awesomeadmin/web/WeiXinController.java

@@ -0,0 +1,244 @@
+package com.izouma.awesomeadmin.web;
+
+import com.izouma.awesomeadmin.dto.Result;
+import com.izouma.awesomeadmin.model.UserInfo;
+import com.izouma.awesomeadmin.service.UserInfoService;
+import com.izouma.awesomeadmin.service.WeiXinService;
+import com.izouma.awesomeadmin.shiro.WeiXinCodeToken;
+import com.izouma.awesomeadmin.util.CookieUtil;
+import com.izouma.awesomeadmin.util.PropertiesFileLoader;
+import com.izouma.awesomeadmin.util.WeixinUtil;
+import org.activiti.engine.IdentityService;
+import org.apache.log4j.Logger;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.subject.Subject;
+import org.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Map;
+
+@Controller
+@RequestMapping("/wx")
+public class WeiXinController extends BaseController {
+
+    private static Logger logger = Logger.getLogger(WeiXinController.class);
+
+    @Autowired
+    private WeiXinService weiXinService;
+
+    @Autowired
+    private UserInfoService userInfoService;
+
+    @Autowired
+    private IdentityService identityService;
+
+
+    @RequestMapping(value = "/getSignature", method = RequestMethod.GET)
+    @ResponseBody
+    public Map<String, String> getSignature(HttpServletRequest request) {
+
+        String shareUrl = request.getParameter("shareUrl");
+        return weiXinService.getSignature(shareUrl);
+
+    }
+
+
+    @RequestMapping(value = "/auth", method = RequestMethod.GET)
+    @ResponseBody
+    public ModelAndView auth(@RequestParam("redirectUri") String redirectUri) {
+
+        return new ModelAndView("redirect:https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + PropertiesFileLoader.getProperties("weixinappid")
+                + "&redirect_uri=" + "http://xjw.izouma.com/wx/redirectLogin?redirectUri=" + redirectUri
+                + "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect");
+    }
+
+
+    @RequestMapping(value = "/redirectLogin", method = RequestMethod.GET)
+    @ResponseBody
+    public ModelAndView redirectLogin(HttpServletRequest request, HttpServletResponse response,
+                                      @RequestParam(required = true, value = "code") String code, @RequestParam(required = false, value = "redirectUri") String redirectUri) {
+
+        ModelAndView mav = new ModelAndView("redirect:http://xjw.izouma.com/#/" + redirectUri);
+        final String APP_ID = PropertiesFileLoader.getProperties("weixinappid");
+        final String APP_SECRET = PropertiesFileLoader.getProperties("weixinsecret");
+        try {
+
+            // System.out.println("code : " + code);
+            String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APP_ID + "&secret=" + APP_SECRET + "&code=" + code
+                    + "&grant_type=authorization_code";
+            JSONObject data = WeixinUtil.loadJSON(url);
+            // System.out.println("data : " + data);
+
+            // System.out.println(json.toString());
+
+            String openId = (String) data.get("openid");
+
+            /**
+             * 新用户存储用户资料
+             */
+            String access_token = (String) data.get("access_token");
+            String userDataUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openId;
+            JSONObject userData = WeixinUtil.loadJSON(userDataUrl);
+            String weixinInfo = userData.toString();
+            // System.out.println("userDate : " + userData);
+
+
+            System.out.println("loginUserInfo:" + weixinInfo);
+            JSONObject userJson = new JSONObject(weixinInfo);
+            System.out.println("userJson" + userJson);
+
+            String headimgurl = userJson.getString("headimgurl");
+            String sex = userJson.getInt("sex") != 0 ? "男" : "女";
+
+
+            Subject subject = SecurityUtils.getSubject();
+
+            WeiXinCodeToken weiXinCodeToken = new WeiXinCodeToken(code, openId, userJson.getString("nickname"), sex, headimgurl);
+            try {
+                subject.login(weiXinCodeToken);
+            } catch (AuthenticationException e) {
+                e.printStackTrace();
+                logger.error(e);
+            }
+            UserInfo user = (UserInfo) subject.getPrincipal();
+            identityService.setAuthenticatedUserId(user.getId().toString());
+            HttpSession session = request.getSession();
+            CookieUtil.addCookie(response, "JSESSIONID", session.getId(), 3 * 24 * 60 * 60);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ModelAndView("redirect:https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + APP_ID + "&redirect_uri="
+                    + "http://xjw.izouma.com/wx/redirectLogin?redirectUri=" + redirectUri
+                    + "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect");
+        }
+        return mav;
+    }
+
+
+    /**
+     * 微信身份获取,登录验证
+     *
+     * @return
+     */
+    @RequestMapping(value = "/Login", method = RequestMethod.GET)
+    @ResponseBody
+    public ModelAndView LoginService(HttpServletRequest request, HttpServletResponse response,
+                                     @RequestParam(required = true, value = "code") String code) {
+
+        ModelAndView mav = new ModelAndView("redirect:../#/");
+        final String APP_ID = PropertiesFileLoader.getProperties("weixinappid");
+        final String APP_SECRET = PropertiesFileLoader.getProperties("weixinsecret");
+        try {
+
+
+            /**
+             * 无缓存用户
+             */
+            // System.out.println("code : " + code);
+            String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APP_ID + "&secret=" + APP_SECRET + "&code=" + code
+                    + "&grant_type=authorization_code";
+            JSONObject data = WeixinUtil.loadJSON(url);
+            logger.error("Login微信身份获取,登录验证 data : " + data);
+
+            String openId = (String) data.get("openid");
+
+
+            /**
+             * 新用户存储用户资料
+             */
+            String access_token = (String) data.get("access_token");
+            String userDataUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openId;
+            JSONObject userData = WeixinUtil.loadJSON(userDataUrl);
+            String weixinInfo = userData.toString();
+            // System.out.println("userDate : " + userData);
+
+
+            System.out.println("loginUserInfo:" + weixinInfo);
+            JSONObject userJson = new JSONObject(weixinInfo);
+            System.out.println("userJson" + userJson);
+
+            String headimgurl = userJson.getString("headimgurl");
+            String sex = userJson.getInt("sex") != 0 ? "男" : "女";
+
+            Subject subject = SecurityUtils.getSubject();
+
+            WeiXinCodeToken weiXinCodeToken = new WeiXinCodeToken(code, openId, userJson.getString("nickname"), sex, headimgurl);
+            try {
+                subject.login(weiXinCodeToken);
+            } catch (AuthenticationException e) {
+                e.printStackTrace();
+                logger.error(e);
+            }
+            UserInfo user = (UserInfo) subject.getPrincipal();
+            identityService.setAuthenticatedUserId(user.getId().toString());
+            HttpSession session = request.getSession();
+            CookieUtil.addCookie(response, "JSESSIONID", session.getId(), 3 * 24 * 60 * 60);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ModelAndView("redirect:https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + APP_ID + "&redirect_uri="
+                    + "http://xjw.izouma.com/wx/Login" + "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect");
+        }
+        return mav;
+    }
+
+
+    @RequestMapping(value = "/checkSubscribe", method = RequestMethod.GET)
+    @ResponseBody
+    public Result checkSubscribe(@RequestParam("userId") String userId) {
+
+        UserInfo userInfo = new UserInfo();
+        userInfo.setId(Integer.valueOf(userId));
+        userInfo = userInfoService.getUserInfo(userInfo);
+        try {
+            JSONObject jsonObject = WeixinUtil.loadJSON("https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + weiXinService.getAccessToken()
+                    + "&openid=" + userInfo.getOpenId());
+            int subscribe = jsonObject.getInt("subscribe");
+            if (subscribe == 1) {
+                return new Result(true, null);
+            } else {
+                return new Result(false, null);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return new Result(false, null);
+    }
+
+
+    public static JSONObject loadJSON(String url) {
+
+        StringBuilder json = new StringBuilder();
+        try {
+            URL oracle = new URL(url);
+            URLConnection yc = oracle.openConnection();
+            BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream(), "UTF-8"));
+            String inputLine = null;
+            while ((inputLine = in.readLine()) != null) {
+                json.append(inputLine);
+            }
+            in.close();
+        } catch (MalformedURLException e) {
+        } catch (IOException e) {
+        }
+        return new JSONObject(json.toString());
+    }
+
+
+}

+ 2 - 2
src/main/resources/properties/outsidews.properties

@@ -1,6 +1,6 @@
 weixinapi=https://api.weixin.qq.com/sns/oauth2/
 weixinapi=https://api.weixin.qq.com/sns/oauth2/
-weixinappid=wx0c2b9407cf94dc89
-weixinsecret=84fc992b85ba8070b324cc7b08252b72
+weixinappid=wx8a57c93a87356f00
+weixinsecret=c80d8da034ebdd3e6151afecd5d46954
 aliossid=PXzJyah5rZfWHIIH
 aliossid=PXzJyah5rZfWHIIH
 aliosskey=e1MS6j0wypXJrw8CM0hObZu8qKbfah
 aliosskey=e1MS6j0wypXJrw8CM0hObZu8qKbfah
 aliossendpoit=http://oss-cn-hangzhou.aliyuncs.com
 aliossendpoit=http://oss-cn-hangzhou.aliyuncs.com

+ 4 - 0
src/main/resources/spring/applicationContext.xml

@@ -52,6 +52,7 @@
             <list>
             <list>
                 <ref bean="phoneCodeRealm"/>
                 <ref bean="phoneCodeRealm"/>
                 <ref bean="userPasswordRealm"/>
                 <ref bean="userPasswordRealm"/>
+                <ref bean="weiXinCodeRealm"/>
             </list>
             </list>
         </property>
         </property>
     </bean>
     </bean>
@@ -63,6 +64,9 @@
     <bean id="userPasswordRealm" class="com.izouma.awesomeadmin.shiro.UserPasswordRealm">
     <bean id="userPasswordRealm" class="com.izouma.awesomeadmin.shiro.UserPasswordRealm">
         <property name="authenticationTokenClass" value="org.apache.shiro.authc.UsernamePasswordToken"/>
         <property name="authenticationTokenClass" value="org.apache.shiro.authc.UsernamePasswordToken"/>
     </bean>
     </bean>
+    <bean id="weiXinCodeRealm" class="com.izouma.awesomeadmin.shiro.WeiXinCodeRealm">
+        <property name="authenticationTokenClass" value="com.izouma.awesomeadmin.shiro.WeiXinCodeToken"/>
+    </bean>
 
 
 
 
     <context:component-scan
     <context:component-scan

+ 1 - 1
src/main/vue/src/pages/UserCollections.vue

@@ -36,7 +36,7 @@
             </el-table-column>
             </el-table-column>
             <el-table-column v-if="isColumnShow('showFlag')" prop="showFlag" label="用户显示" min-width="100">
             <el-table-column v-if="isColumnShow('showFlag')" prop="showFlag" label="用户显示" min-width="100">
             </el-table-column>
             </el-table-column>
-            <el-table-column label="操作" align="center" fixed="right" min-width="140">
+            <el-table-column label="操作" align="center" fixed="right" min-width="150">
                 <template slot-scope="scope">
                 <template slot-scope="scope">
                     <el-button @click="editRow(scope.row)" type="primary" size="mini" plain>编辑</el-button>
                     <el-button @click="editRow(scope.row)" type="primary" size="mini" plain>编辑</el-button>
                     <el-button @click="deleteRow(scope.row)" type="danger" size="mini" plain>删除</el-button>
                     <el-button @click="deleteRow(scope.row)" type="danger" size="mini" plain>删除</el-button>

+ 1 - 1
src/main/webapp/WEB-INF/html/admin.html

@@ -1 +1 @@
-<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>admin</title><script defer=defer src=https://use.fontawesome.com/releases/v5.0.10/js/all.js integrity=sha384-slN8GvtUJGnv6ca26v8EzVaR9DC58QEwsIk9q1QXdCU8Yu8ck/tL/5szYlBbqmS+ crossorigin=anonymous></script><link href=/static/css/app.4b7d6c8f482bef1fc4ac09bd6de3053c.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.f234410ab69e0fe6d64a.js></script><script type=text/javascript src=/static/js/vendor.5c8b31b525cf4ff798a3.js></script><script type=text/javascript src=/static/js/app.fba85f862f7a89bccc43.js></script></body></html>
+<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>admin</title><script defer=defer src=https://use.fontawesome.com/releases/v5.0.10/js/all.js integrity=sha384-slN8GvtUJGnv6ca26v8EzVaR9DC58QEwsIk9q1QXdCU8Yu8ck/tL/5szYlBbqmS+ crossorigin=anonymous></script><link href=/static/css/app.4b7d6c8f482bef1fc4ac09bd6de3053c.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.5e11137335f65dfb940f.js></script><script type=text/javascript src=/static/js/vendor.d308c559ff3070fd266c.js></script><script type=text/javascript src=/static/js/app.46941187f8854d06a8d2.js></script></body></html>

+ 2 - 0
src/main/webapp/static/js/17.ab5182df4702e223d9d0.js

@@ -0,0 +1,2 @@
+webpackJsonp([17],{XC6u:function(t,e,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=a("mvHQ"),n=a.n(r),o=(a("ftAF"),{created:function(){var t=this;this.$route.query.id&&this.$http.get({url:"/facedInfo/getOne",data:{id:this.$route.query.id}}).then(function(e){e.success&&(t.formData=e.data)})},data:function(){return{saving:!1,formData:{},rules:{facedName:[{required:!0,message:"请输入 朝向",trigger:"blur"}]}}},methods:{onSave:function(){var t=this;this.$refs.form.validate(function(e){if(!e)return!1;t.submit()})},submit:function(){var t=this,e=JSON.parse(n()(this.formData));this.$http.post({url:this.formData.id?"/facedInfo/update":"/facedInfo/save",data:e}).then(function(e){e.success?(t.$message.success("成功"),t.$router.go(-1)):t.$message.warning("失败")})}}}),s={render:function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",[a("el-form",{ref:"form",staticStyle:{"max-width":"500px"},attrs:{model:t.formData,rules:t.rules,"label-width":"80px","label-position":"right",size:"small"}},[a("el-form-item",{attrs:{prop:"facedName",label:"朝向"}},[a("el-input",{model:{value:t.formData.facedName,callback:function(e){t.$set(t.formData,"facedName",e)},expression:"formData.facedName"}})],1),t._v(" "),a("el-form-item",{attrs:{prop:"rank",label:"排序"}},[a("el-input",{model:{value:t.formData.rank,callback:function(e){t.$set(t.formData,"rank",e)},expression:"formData.rank"}})],1),t._v(" "),a("el-form-item",[a("el-button",{attrs:{loading:t.$store.state.fetchingData,type:"primary"},on:{click:t.onSave}},[t._v("保存")]),t._v(" "),a("el-button",{on:{click:function(e){t.$router.go(-1)}}},[t._v("取消")])],1)],1)],1)},staticRenderFns:[]};var i=a("VU/8")(o,s,!1,function(t){a("uFLN")},"data-v-bd354f50",null);e.default=i.exports},uFLN:function(t,e){}});
+//# sourceMappingURL=17.ab5182df4702e223d9d0.js.map

File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/17.ab5182df4702e223d9d0.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/18.255b4a8a1fe65b180e8d.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/18.255b4a8a1fe65b180e8d.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/19.3604f5d9b3ef9bdd423a.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/19.3604f5d9b3ef9bdd423a.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/19.75d481bc6518e89d7880.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/19.75d481bc6518e89d7880.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/27.5e6e4578577105f839e1.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/27.5e6e4578577105f839e1.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/28.34f6e05777d4755eea25.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/28.34f6e05777d4755eea25.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/28.f15e5260dd4b1da646e1.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/28.f15e5260dd4b1da646e1.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/37.05744d76e2c443c45e5c.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/37.05744d76e2c443c45e5c.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/38.1c4e469927d9b0f95605.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/38.1c4e469927d9b0f95605.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/39.42a07d44d3d024ff9968.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/39.42a07d44d3d024ff9968.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/40.58a3156604b8370db9c3.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/40.58a3156604b8370db9c3.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/41.4ca89a3f34a471e96db7.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/41.4ca89a3f34a471e96db7.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/42.819e0436fcbbcaa49e27.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/42.819e0436fcbbcaa49e27.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/43.c111ea45834a7f0e4d62.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/43.c111ea45834a7f0e4d62.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/44.df9bfa10157b34c75c62.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/44.df9bfa10157b34c75c62.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/45.269e35b69430f44a28bb.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/45.269e35b69430f44a28bb.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/46.7608db7405ae3b9df22f.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/46.7608db7405ae3b9df22f.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/47.aaa7d71ea815a3aa6e84.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/47.aaa7d71ea815a3aa6e84.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/48.a5563be8f4282b0c1421.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/48.a5563be8f4282b0c1421.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/49.60ede8ff5bd1f15db0fe.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/49.60ede8ff5bd1f15db0fe.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/49.f124e9c019cee95b2a37.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/49.f124e9c019cee95b2a37.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/50.0bdbb9a242807fbeb35e.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/50.0bdbb9a242807fbeb35e.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/51.fa7bf1f3a680744fd6ff.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/51.fa7bf1f3a680744fd6ff.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/52.bdd61dd443e175360d64.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/52.bdd61dd443e175360d64.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/53.98e8d8ffe13d4ce1a3eb.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/53.98e8d8ffe13d4ce1a3eb.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/54.3750da222612e1831308.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/54.3750da222612e1831308.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/55.82d7a9505897bffc5695.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/55.82d7a9505897bffc5695.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/56.8f7927ce3c0428cdbbbc.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/56.8f7927ce3c0428cdbbbc.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/57.9c2e83a2112aaaec0fb2.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/57.9c2e83a2112aaaec0fb2.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/58.a200f8a91be9626137b8.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/58.a200f8a91be9626137b8.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/59.97012ca9ef04893925fc.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/59.97012ca9ef04893925fc.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/60.e3a6b59373d8feedc627.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/60.e3a6b59373d8feedc627.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/61.ec48f216ee36812b5ba5.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/61.ec48f216ee36812b5ba5.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/62.bfe424b41d9811133c54.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/62.bfe424b41d9811133c54.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/8.137753c64325f50c92a9.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/8.137753c64325f50c92a9.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/8.8fe2d0be3860177e8eac.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/8.8fe2d0be3860177e8eac.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/9.a7da0e79e9720c2a8222.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/9.a7da0e79e9720c2a8222.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/app.46941187f8854d06a8d2.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/app.46941187f8854d06a8d2.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/app.fba85f862f7a89bccc43.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/app.fba85f862f7a89bccc43.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/manifest.5e11137335f65dfb940f.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/manifest.5e11137335f65dfb940f.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/manifest.f234410ab69e0fe6d64a.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/manifest.f234410ab69e0fe6d64a.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/vendor.d308c559ff3070fd266c.js


File diff ditekan karena terlalu besar
+ 0 - 0
src/main/webapp/static/js/vendor.d308c559ff3070fd266c.js.map


Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini