k94314517
2024-03-18 277f2d65a70bddbf9c571e2023315faad26e12d0
Merge branch 'master' into 1.0.1
已添加8个文件
已修改8个文件
632 ■■■■■ 文件已修改
server/company/src/main/java/com/doumee/api/system/SystemController.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/platform/src/main/java/com/doumee/api/system/SystemController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/pom.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/core/utils/Constants.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/core/wx/AccessToken.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/core/wx/SendWxMessage.java 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/core/wx/SpringUtils.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/core/wx/TemplateData.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/core/wx/WxMiniConfig.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/core/wx/WxMsgVO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/core/wx/WxPayProperties.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/system/dto/LoginDTO.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/system/dto/WxMiniLoginDTO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/system/model/SystemUser.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/system/SystemLoginService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/company/src/main/java/com/doumee/api/system/SystemController.java
@@ -7,10 +7,7 @@
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.utils.Constants;
import com.doumee.dao.system.dto.LoginDTO;
import com.doumee.dao.system.dto.LoginPhoneDTO;
import com.doumee.dao.system.dto.UpdatePwdDto;
import com.doumee.dao.system.dto.WebLoginDTO;
import com.doumee.dao.system.dto.*;
import com.doumee.service.system.SystemLoginService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -46,17 +43,31 @@
    @ApiOperation("登录 - åŽç«¯")
    @PostMapping("/login")
    public ApiResponse<String> login (@Validated @RequestBody LoginDTO dto, HttpServletRequest request) {
        return ApiResponse.success(systemLoginService.loginByPassword(dto, Constants.ONE, request));
        return ApiResponse.success(systemLoginService.loginByPassword(dto, Constants.ONE, true, request));
    }
    @PreventRepeat(limit = 10, lockTime = 10000)
    @ApiOperation("短信验证码登录")
    @PostMapping("/loginByPhone")
    public ApiResponse<String> loginByPhone (@Validated @RequestBody LoginPhoneDTO dto, HttpServletRequest request) {
        return ApiResponse.success(systemLoginService.loginByPhone(dto, Constants.ZERO, request));
        return ApiResponse.success(systemLoginService.loginByPhone(dto, Constants.ONE, true, request));
    }
    @PreventRepeat(limit = 10, lockTime = 10000)
    @ApiOperation("微信小程序登录")
    @PostMapping("/loginByWxMini")
    public ApiResponse<String> loginByWxMini (@Validated @RequestBody WxMiniLoginDTO dto, HttpServletRequest request) {
        return ApiResponse.success(systemLoginService.loginByWxMini(dto, request));
    }
    @ApiOperation(value = "授权openId",notes = "登录后")
    @GetMapping("/wxEmpower")
    public ApiResponse<String> wxEmpower (@RequestParam String code, HttpServletRequest request) {
        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        return ApiResponse.success(systemLoginService.wxEmpower(code, loginUserInfo.getId()));
    }
    @ApiOperation("退出登录")
    @PostMapping("/logout")
    public ApiResponse logout () {
server/platform/src/main/java/com/doumee/api/system/SystemController.java
@@ -44,13 +44,13 @@
    @ApiOperation("登录")
    @PostMapping("/login")
    public ApiResponse<String> login (@Validated @RequestBody LoginDTO dto, HttpServletRequest request) {
        return ApiResponse.success(systemLoginService.loginByPassword(dto, Constants.ZERO, request));
        return ApiResponse.success(systemLoginService.loginByPassword(dto, Constants.ZERO,true, request));
    }
    @PreventRepeat(limit = 10, lockTime = 10000)
    @ApiOperation("短信验证码登录")
    @PostMapping("/loginByPhone")
    public ApiResponse<String> loginByPhone (@Validated @RequestBody LoginPhoneDTO dto, HttpServletRequest request) {
        return ApiResponse.success(systemLoginService.loginByPhone(dto, Constants.ZERO, request));
        return ApiResponse.success(systemLoginService.loginByPhone(dto, Constants.ZERO, true,request));
    }
    @ApiOperation("退出登录")
server/pom.xml
@@ -37,6 +37,8 @@
    <oshi.version>5.7.0</oshi.version>
    <jna.version>5.7.0</jna.version>
    <poi.version>5.0.0</poi.version>
    <!-- å¾®ä¿¡å°ç¨‹åº -->
    <weixin-java-miniapp.version>4.1.0</weixin-java-miniapp.version>
  </properties>
  <dependencies>
@@ -212,6 +214,14 @@
      <version>2.5.1</version>
    </dependency>
    <!-- WeChat å°ç¨‹åº -->
    <dependency>
      <groupId>com.github.binarywang</groupId>
      <artifactId>weixin-java-miniapp</artifactId>
      <version>${weixin-java-miniapp.version}</version>
    </dependency>
    <dependency>
      <groupId>net.sourceforge.jexcelapi</groupId>
      <artifactId>jxl</artifactId>
server/service/src/main/java/com/doumee/core/utils/Constants.java
@@ -43,7 +43,9 @@
    public static final String RANGE_SIZE = "RANGE_SIZE";
    public static final String CATE_PARAM_OPEN = "_CATE_PARAM_OPEN";
    public static final String OPEN_SYNC_SWITCH = "OPEN_SYNC_SWITCH";
    public static final String WX_MIN_PROGRAM = "WX_MIN_PROGRAM";
    public static final String WX_MIN_APPID = "WX_MIN_APPID";
    public static final String WX_MIN_SECRET = "WX_MIN_SECRET";
    public static final String SYSTEM ="SYSTEM";
    public static final String GOODS_IMG_DIR ="GOODS_IMG_DIR";
server/service/src/main/java/com/doumee/core/wx/AccessToken.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.doumee.core.wx;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2022/12/7 17:26
 */
@Data
public class AccessToken {
    private String accessToken;
    //过期时间 å½“前系统时间+微信传来的过期时间
    private Long expiresTime;
    public AccessToken(String accessToken, String expiresIn) {
        this.accessToken = accessToken;
        this.expiresTime = System.currentTimeMillis()+Integer.parseInt(expiresIn)*1000;
    }
    /**
     * åˆ¤æ–­token是否过期
     * @return
     */
    public boolean isExpired(){
        return System.currentTimeMillis()>expiresTime;
    }
}
server/service/src/main/java/com/doumee/core/wx/SendWxMessage.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,164 @@
package com.doumee.core.wx;
import com.alibaba.fastjson.JSONObject;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.system.model.SystemUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.Map;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2022/12/7 17:27
 */
@Service
@Slf4j
public class SendWxMessage {
    private static String programUrl = "packagesMine/meetingDetails/meetingDetails?id=";
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
//    /**
//     * ä¼šè®®å¼€å§‹é€šçŸ¥
//     * @param systemUser ç”¨æˆ·
//     * @param bookings ä¼šè®®ä¿¡æ¯
//     * @param rooms ä¼šè®®å®¤ä¿¡æ¯
//     */
//    public  void  bookingsStart(SystemUser systemUser, Bookings bookings, Rooms rooms){
//        RestTemplate restTemplate = new RestTemplate();
//        String accessToken = systemDictDataBiz.queryCodeById(106);
//        log.info("微信小程序 ä¼šè®®å¼€å§‹è®¢é˜…消息发送日志 -> accessToken:{}",accessToken);
//        //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
//        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken;
//        //拼接推送的模版
//        WxMsgVO wxMsgVo = new WxMsgVO();
//        //用户的openid(要发送给那个用户)
//        wxMsgVo.setTouser(systemUser.getOpenid());
//        //订阅消息模板id
//        wxMsgVo.setTemplate_id("di_lWUtlqvWAo7aWKZCH8Kzs1Cv2z3H6fOkKI4RwJzg");
//        Map<String, TemplateData> m = new HashMap<>(4);
//        //会议主题
//        m.put("thing1", new TemplateData(bookings.getName()));
//        //会议地点
//        m.put("thing2", new TemplateData(rooms.getName()));
//        //时间
//        m.put("thing3", new TemplateData(DateUtil.getDate(bookings.getStartTime(),"yyyy-MM-dd")));
//        //主持人
//        m.put("name4", new TemplateData(systemUser.getRealname()));
//        wxMsgVo.setPage(programUrl +bookings.getId());
//        wxMsgVo.setData(m);
//        ResponseEntity<String> responseEntity =
//                restTemplate.postForEntity(url, wxMsgVo, String.class);
//        log.info("微信小程序-> å–消通知订阅消息发送日志:{}",JSONObject.toJSONString(responseEntity));
//    }
//
//    /**
//     * ä¼šè®®å–消通知
//     * @param systemUser ç”¨æˆ·
//     * @param bookings ä¼šè®®ä¿¡æ¯
//     * @param rooms ä¼šè®®å®¤ä¿¡æ¯
//     */
//    public  void  bookingsCancel(SystemUser systemUser, Bookings bookings, Rooms rooms){
//        RestTemplate restTemplate = new RestTemplate();
//        String accessToken = systemDictDataBiz.queryCodeById(106);
//        log.info("微信小程序 ä¼šè®®å¼€å§‹è®¢é˜…消息发送日志 -> accessToken:{}",accessToken);
//        //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
//        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken;
//        //拼接推送的模版
//        WxMsgVO wxMsgVo = new WxMsgVO();
//        //用户的openid(要发送给那个用户)
//        wxMsgVo.setTouser(systemUser.getOpenid());
//        //订阅消息模板id
//        wxMsgVo.setTemplate_id("6A79DG8Fd9CjUDHhxJVv8dWcqww0v9_wwQLr7_ZuNqU");
//        Map<String, TemplateData> m = new HashMap<>(4);
//        //会议名称
//        m.put("thing4", new TemplateData(bookings.getName()));
//        //会议时间
//        m.put("time2", new TemplateData(DateUtil.getDate(bookings.getStartTime(),"yyyy-MM-dd")));
////        m.put("time4", new TemplateData(
////                DateUtil.getDate(bookings.getStartTime(),"yyyy-MM-dd")+
////                        " " + DateUtil.getDate(bookings.getStartTime(),"HH:mm")+
////                        " è‡³ " + DateUtil.getDate(bookings.getEndTime(),"HH:mm") ) );
//        //会议室
//        m.put("thing1", new TemplateData(rooms.getName()));
//        //备注
//        m.put("thing3", new TemplateData(bookings.getRemark()));
//        wxMsgVo.setPage(programUrl +bookings.getId());
//        wxMsgVo.setData(m);
//        ResponseEntity<String> responseEntity =
//                restTemplate.postForEntity(url, wxMsgVo, String.class);
//        log.info("微信小程序->取消通知订阅消息发送日志:{}",JSONObject.toJSONString(responseEntity));
//    }
//
//
//    /**
//     * ä¼šè®®é¢„约成功通知
//     * @param systemUser ç”¨æˆ·
//     * @param bookings ä¼šè®®ä¿¡æ¯
//     * @param rooms ä¼šè®®å®¤ä¿¡æ¯
//     */
//    public void  bookingsReservation(SystemUser systemUser, Bookings bookings, Rooms rooms){
//        RestTemplate restTemplate = new RestTemplate();
//        String accessToken = systemDictDataBiz.queryCodeById(106);
//        log.info("微信小程序 ä¼šè®®å¼€å§‹è®¢é˜…消息发送日志 -> accessToken:{}",accessToken);
//
//        //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
//        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken;
//        //拼接推送的模版
//        WxMsgVO wxMsgVo = new WxMsgVO();
//        //用户的openid(要发送给那个用户)
//        wxMsgVo.setTouser(systemUser.getOpenid());
//        //订阅消息模板id
//        wxMsgVo.setTemplate_id("usZxJqJ2AYPg24ViPMuY2lI-YRjdSD2JvFY3gY5kqh4");
//        Map<String, TemplateData> m = new HashMap<>(4);
//        //会议主题
//        m.put("thing3", new TemplateData(bookings.getName()));
//        //会议时间
//        m.put("time1", new TemplateData(
//                DateUtil.getDate(bookings.getStartTime(),"yyyy-MM-dd")
////                        +
////                        " " + DateUtil.getDate(bookings.getStartTime(),"HH:mm")+
////                        " è‡³ " + DateUtil.getDate(bookings.getEndTime(),"HH:mm")
//        ) );
//        //会议地点
//        m.put("thing2", new TemplateData(rooms.getName()));
//        //发起人
//        m.put("thing4", new TemplateData(systemUser.getRealname()));
//        wxMsgVo.setPage(programUrl +bookings.getId());
//        wxMsgVo.setData(m);
//        ResponseEntity<String> responseEntity =
//                restTemplate.postForEntity(url, wxMsgVo, String.class);
//        log.info("微信小程序-> ä¼šè®®é¢„约成功订阅消息发送日志:{}",JSONObject.toJSONString(responseEntity));
//    }
//    /**
//     * èŽ·å–token
//     */
//    private static String getAccessToken() {
//        //发送请求获取token
//        JSONObject token = null;
//        try {
//            token = JSONObject.parseObject(HttpsUtil.get(APP_ACCESS_TOKEN_URL,false));
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        JSONObject jsonObject = token;
//        String accessToken = (String) jsonObject.get("access_token");
//        Integer expiresIn = (Integer) jsonObject.get("expires_in");
//        //创建token对象,并存储
//        return new AccessToken(accessToken,String.valueOf(expiresIn)).getAccessToken();
//    }
}
server/service/src/main/java/com/doumee/core/wx/SpringUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package com.doumee.core.wx;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
 * NOTICE: NEVER USE IT WHEN REGISTERING A SPRING BEAN.
 *
 * @author Guang YANG
 */
@Component
public class SpringUtils implements ApplicationContextAware {
    private static ApplicationContext CTX;
    public static ApplicationContext get() {
        return CTX;
    }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        CTX = applicationContext;
    }
    /**
     * å‘容器中动态添加Bean
     *
     * @param ctx
     * @param beanName
     * @param beanClass
     */
    public static void addBean(ApplicationContext ctx, String beanName, Class beanClass) {
        BeanDefinitionRegistry beanDefReg = (DefaultListableBeanFactory)ctx.getAutowireCapableBeanFactory();
        BeanDefinitionBuilder beanDefBuilder = BeanDefinitionBuilder.genericBeanDefinition(beanClass);
        BeanDefinition beanDef = beanDefBuilder.getBeanDefinition();
        if (!beanDefReg.containsBeanDefinition(beanName)) {
            beanDefReg.registerBeanDefinition(beanName, beanDef);
        }
    }
    /**
     * ä»Žå®¹å™¨ä¸­ç§»é™¤Bean
     *
     * @param ctx
     * @param beanName
     */
   public static void removeBean(ApplicationContext ctx, String beanName) {
        BeanDefinitionRegistry beanDefReg = (DefaultListableBeanFactory) ctx.getAutowireCapableBeanFactory();
        beanDefReg.getBeanDefinition(beanName);
        beanDefReg.removeBeanDefinition(beanName);
    }
    /**
     * éåŽ†è¾“å‡ºæ‰€æœ‰Bean的信息
     */
    static void showAllBeans(ApplicationContext ctx) {
        //遍历
        for (String name : ctx.getBeanDefinitionNames()) {
            System.out.println("name:" + name + ",class:" + ctx.getBean(name).getClass());
        }
    }
}
server/service/src/main/java/com/doumee/core/wx/TemplateData.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.doumee.core.wx;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2022/12/7 17:28
 */
@Data
public class TemplateData {
    private String value;
    public TemplateData(String value) {
        this.value = value;
    }
}
server/service/src/main/java/com/doumee/core/wx/WxMiniConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
package com.doumee.core.wx;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.utils.Constants;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
/**
 * å¾®ä¿¡å°ç¨‹åºç»„ä»¶
 */
@Configuration
public class WxMiniConfig {
    /********微信小程序服务**********/
    public static WxMaService wxMaService;
    /********微信小程序支付**********/
//    public static WxPayService wxPayService;
//    /********微信APP支付**********/
//    public static WxPayService wxAppPayService;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    public static WxMiniConfig me() {
        return SpringUtils.get().getBean(WxMiniConfig.class);
    }
    @PostConstruct
    void init() {
        this.load_WxMaService();
//        this.load_wxPayService();
//        this.load_wxAppPayService();
    }
    /**
     * åˆå§‹åŒ–微信小程序
     */
    public void load_WxMaService() {
        WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
        config.setAppid(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.WX_MIN_PROGRAM,Constants.WX_MIN_APPID).getCode()));
        config.setSecret(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.WX_MIN_PROGRAM,Constants.WX_MIN_SECRET).getCode()));
        config.setMsgDataFormat("JSON");
        //config.setToken("");
        //config.setAesKey("");
        WxMaService wxMaService = new WxMaServiceImpl();
        wxMaService.setWxMaConfig(config);
        this.wxMaService = wxMaService;
    }
    /**
     * åˆå§‹åŒ–微信小程序支付
     */
//    public void load_wxPayService() {
//        WxPayConfig payConfig = new WxPayConfig();
//        payConfig.setTradeType(WxPayConstants.TradeType.JSAPI);
//        payConfig.setSignType(WxPayConstants.SignType.MD5);
//        payConfig.setAppId(StringUtils.trimToNull(wxPayProperties.getAppId()));
//        payConfig.setMchId(StringUtils.trimToNull(wxPayProperties.getMchId()));
//        payConfig.setMchKey(StringUtils.trimToNull(wxPayProperties.getMchKey()));
//        payConfig.setKeyPath(StringUtils.trimToNull(wxPayProperties.getKeyPath()));
//        payConfig.setNotifyUrl(StringUtils.trimToNull(wxPayProperties.getNotifyUrl()));
//        WxPayService wxPayService = new WxPayServiceImpl();
//        wxPayService.setConfig(payConfig);
//        this.wxPayService = wxPayService;
//    }
//    /**
//     * åˆå§‹åŒ–App支付
//     */
//    public void load_wxAppPayService() {
//        WxPayConfig payConfig = new WxPayConfig();
//        payConfig.setTradeType(WxPayConstants.TradeType.APP);
//        payConfig.setSignType(WxPayConstants.SignType.MD5);
//        payConfig.setAppId("");
//        payConfig.setMchId(StringUtils.trimToNull(sysDictService.getSysDictValue(SysDictEnum.WX_MINI_MchId.getCode())));
//        payConfig.setMchKey(StringUtils.trimToNull(sysDictService.getSysDictValue(SysDictEnum.WX_MINI_MchKey.getCode())));
//        payConfig.setKeyPath(StringUtils.trimToNull(sysDictService.getSysDictValue(SysDictEnum.WX_MINI_KeyPath.getCode())));
//        payConfig.setNotifyUrl(StringUtils.trimToNull(sysDictService.getSysDictValue(SysDictEnum.WX_MINI_NotifyUrl.getCode())));
//        WxPayService wxPayService = new WxPayServiceImpl();
//        wxPayService.setConfig(payConfig);
//        this.wxAppPayService = wxPayService;
//    }
}
server/service/src/main/java/com/doumee/core/wx/WxMsgVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.doumee.core.wx;
import lombok.Data;
import java.util.Map;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2022/12/7 17:27
 */
@Data
public class WxMsgVO {
    //用户openId
    private String touser;
    //模版id
    private String template_id;
    //推送文字
    private Map<String , TemplateData> data;
    //跳转路径 ï¼Œé»˜è®¤è·³è½¬åˆ°å°ç¨‹åºé¦–页
    private String page="pages/index/index";
}
server/service/src/main/java/com/doumee/core/wx/WxPayProperties.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.doumee.core.wx;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/3/22 18:04
 */
@Component
@ConfigurationProperties(prefix = "wx.pay")
@Data
public class WxPayProperties {
    /**
     * AppID
     */
    private String appId;
    /**
     * AppSecret
     */
    private String appSecret;
    /**
     * å¾®ä¿¡å•†æˆ·å·
     */
    private String mchId;
    /**
     * æ”¯ä»˜API密钥
     */
    private String mchKey;
    /**
     * æ”¯ä»˜å›žè°ƒåœ°å€
     */
    private String notifyUrl;
    /**
     * æ”¯ä»˜è¯ä¹¦(p12)
     */
    private String keyPath;
}
server/service/src/main/java/com/doumee/dao/system/dto/LoginDTO.java
@@ -30,4 +30,5 @@
    @NotBlank(message = "验证码UUID不能为空")
    @ApiModelProperty(value = "验证码UUID")
    private String uuid;
}
server/service/src/main/java/com/doumee/dao/system/dto/WxMiniLoginDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.doumee.dao.system.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
 * @author Eva.Caesar Liu
 * @date 2023/02/14 11:14
 */
@Data
@ApiModel("微信小程序登录参数")
public class WxMiniLoginDTO implements Serializable {
    @ApiModelProperty(value = "用户名")
    private String username;
    @ApiModelProperty(value = "密码")
    private String password;
    @ApiModelProperty(value = "微信code")
    private String code;
}
server/service/src/main/java/com/doumee/dao/system/model/SystemUser.java
@@ -102,6 +102,9 @@
    @ApiModelProperty(value = "0 å¯ç”¨ 1 ç¦ç”¨")
    private Integer status;
    @ApiModelProperty(value = "微信小程序OPENID")
    private String openid;
    @ApiModelProperty(value = "所属企业信息对")
    @TableField(exist = false)
    private Company company;
server/service/src/main/java/com/doumee/service/system/SystemLoginService.java
@@ -2,6 +2,7 @@
import com.doumee.dao.system.dto.LoginDTO;
import com.doumee.dao.system.dto.LoginPhoneDTO;
import com.doumee.dao.system.dto.WxMiniLoginDTO;
import javax.servlet.http.HttpServletRequest;
@@ -17,6 +18,22 @@
     * @author Eva.Caesar Liu
     * @date 2023/03/21 14:49
     */
    String loginByPassword (LoginDTO dto,int type, HttpServletRequest request);
    String loginByPhone (LoginPhoneDTO dto, int type, HttpServletRequest request);
    String loginByPassword (LoginDTO dto,int type,Boolean checkCaptcha, HttpServletRequest request);
    String loginByPhone (LoginPhoneDTO dto, int type,Boolean checkSmsCode, HttpServletRequest request);
    /**
     * å¾®ä¿¡æŽˆæƒ
     * @param code
     * @param userId
     * @return
     */
    String wxEmpower(String code,Integer userId);
    /**
     *
     * @param wxMiniLoginDTO
     * @param request
     * @return
     */
    String loginByWxMini (WxMiniLoginDTO wxMiniLoginDTO, HttpServletRequest request);
}
server/service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
@@ -1,5 +1,8 @@
package com.doumee.service.system.impl;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.api.R;
import com.doumee.config.shiro.ShiroToken;
import com.doumee.core.constants.ResponseStatus;
@@ -7,15 +10,21 @@
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.core.wx.WxMiniConfig;
import com.doumee.dao.business.SmsEmailMapper;
import com.doumee.dao.system.SystemUserMapper;
import com.doumee.dao.system.dto.LoginDTO;
import com.doumee.dao.system.dto.LoginPhoneDTO;
import com.doumee.dao.system.dto.WxMiniLoginDTO;
import com.doumee.dao.system.model.SystemLoginLog;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.business.impl.SmsEmailServiceImpl;
import com.doumee.service.common.CaptchaService;
import com.doumee.service.system.SystemLoginLogService;
import com.doumee.service.system.SystemLoginService;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.subject.Subject;
@@ -43,8 +52,77 @@
    @Autowired
    private SystemLoginLogService systemLoginLogService;
    @Autowired
    private SystemUserMapper systemUserMapper;
    /**
     * å¾®ä¿¡æŽˆæƒï¼ˆç™»å½•后)
     * @param code
     */
    @Override
    public String loginByPassword(LoginDTO dto, int type,HttpServletRequest request) {
    public String wxEmpower(String code,Integer userId){
        try {
            //获取微信敏感数据
            WxMaJscode2SessionResult session = WxMiniConfig.wxMaService.getUserService().getSessionInfo(code);
            String openId = session.getOpenid();
            if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isBlank(openId)) {
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"获取openid失败!请联系管理员");
            }
            if(Objects.nonNull(userId)){
                systemUserMapper.update(null,new UpdateWrapper<SystemUser>()
                        .lambda().set(SystemUser::getOpenid,null)
                        .eq(SystemUser::getOpenid,openId)
                        .ne(SystemUser::getId,userId));
                systemUserMapper.update(null,new UpdateWrapper<SystemUser>()
                        .lambda()
                        .set(SystemUser::getOpenid,openId)
                        .eq(SystemUser::getId,userId));
            }
            return openId;
        } catch (WxErrorException e) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"微信登录异常!请联系管理员");
        }
    }
    @Override
    public String loginByWxMini (WxMiniLoginDTO wxMiniLoginDTO, HttpServletRequest request){
        if(StringUtils.isNotBlank(wxMiniLoginDTO.getCode())){
            try{
                WxMaJscode2SessionResult session = WxMiniConfig.wxMaService.getUserService().getSessionInfo(wxMiniLoginDTO.getCode());
                String openId = session.getOpenid();
                if (StringUtils.isNotBlank(openId)&&StringUtils.isBlank(wxMiniLoginDTO.getUsername())) {
                    SystemUser systemUser = systemUserMapper.selectOne(new QueryWrapper<SystemUser>()
                            .lambda().eq(SystemUser::getOpenid,openId)
                            .eq(SystemUser::getDeleted,Constants.ZERO)
                            .eq(SystemUser::getType,Constants.UserType.COMPANY.getKey())
                            .orderByDesc(SystemUser::getCreateTime)
                            .last(" limit 1")
                    );
                    if(Objects.nonNull(systemUser)){
                        LoginPhoneDTO dto = new LoginPhoneDTO();
                        dto.setPhone(systemUser.getMobile());
                        return this.loginByPhone(dto,Constants.ZERO,false,request);
                    }
                }
            } catch (WxErrorException e) {
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"微信登录异常!请联系管理员");
            }
        }
        if(StringUtils.isBlank(wxMiniLoginDTO.getUsername())
                || StringUtils.isBlank(wxMiniLoginDTO.getPassword())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        LoginDTO dto = new LoginDTO();
        dto.setUsername(wxMiniLoginDTO.getUsername());
        dto.setPassword(wxMiniLoginDTO.getPassword());
        return this.loginByPassword(dto,Constants.ONE,false,request);
    }
    @Override
    public String loginByPassword(LoginDTO dto, int type,Boolean checkCaptcha,HttpServletRequest request) {
        SystemLoginLog loginLog = new SystemLoginLog();
        loginLog.setLoginUsername(dto.getUsername());
        loginLog.setLoginTime(new Date());
@@ -57,7 +135,7 @@
        loginLog.setServerIp(Utils.Server.getIP());
        // æ ¡éªŒéªŒè¯ç 
        try {
            if(!debugModel){
            if(!debugModel&&checkCaptcha){
                captchaService.check(dto.getUuid(), dto.getCode());
            }
        } catch (Exception e) {
@@ -84,8 +162,9 @@
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(), Objects.isNull(e.getCause())?ResponseStatus.ACCOUNT_INCORRECT.getMessage():e.getCause().getMessage());
        }
    }
    @Override
    public String loginByPhone (LoginPhoneDTO dto, int type, HttpServletRequest request) {
    public String loginByPhone (LoginPhoneDTO dto, int type,Boolean checkSmsCode, HttpServletRequest request) {
        SystemLoginLog loginLog = new SystemLoginLog();
        loginLog.setLoginUsername(dto.getPhone());
        loginLog.setLoginTime(new Date());
@@ -97,9 +176,8 @@
        loginLog.setOsInfo(Utils.User_Client.getOS(request));
        loginLog.setServerIp(Utils.Server.getIP());
        // æ ¡éªŒéªŒè¯ç 
        if(type!= Constants.TWO){
            try {
                if(!debugModel){
            if(!debugModel&& checkSmsCode){
                    SmsEmailServiceImpl.isCaptcheValide(smsEmailMapper,dto.getPhone(), dto.getCode());
                }
            } catch (Exception e) {
@@ -108,7 +186,6 @@
                loginLog.setSuccess(Boolean.FALSE);
                systemLoginLogService.create(loginLog);
                throw e;
            }
        }
        // æ ¡éªŒç”¨æˆ·åå’Œå¯†ç 
        Subject subject = SecurityUtils.getSubject();
@@ -127,4 +204,10 @@
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(), Objects.isNull(e.getCause())?ResponseStatus.ACCOUNT_INCORRECT.getMessage():e.getCause().getMessage());
        }
    }
}