nidapeng
2024-03-20 c9f07c1f79e7ea9eb00925975d3ae2c9e8dcbd25
Merge remote-tracking branch 'origin/1.0.1' into 1.0.1
已添加9个文件
已修改16个文件
913 ■■■■■ 文件已修改
server/company/src/main/java/com/doumee/api/system/SystemController.java 16 ●●●●● 补丁 | 查看 | 原始文档 | 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/config/shiro/ShiroConfig.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/config/shiro/ShiroCredentialsMatcher.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/core/model/LoginUserInfo.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/core/utils/Constants.java 97 ●●●●● 补丁 | 查看 | 原始文档 | 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/business/dto/SaveUnionApplyDTO.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/model/InsuranceApply.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/system/dto/LoginDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/system/dto/LoginPhoneDTO.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 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/UnionApplyService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/UnionApplyServiceImpl.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/system/SystemLoginService.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java 137 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/shop/src/main/java/com/doumee/api/system/SystemController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | 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,20 +43,27 @@
    @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("退出登录")
    @PostMapping("/logout")
    public ApiResponse logout () {
        systemLoginService.cleaOpenid();
        Subject subject = SecurityUtils.getSubject();
        subject.logout();
        return ApiResponse.success(null);
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/config/shiro/ShiroConfig.java
@@ -90,6 +90,7 @@
        // è·¯å¾„拦截配置
        map.put("/system/login", "anon");
        map.put("/system/loginByPhone", "anon");
        map.put("/system/loginByWxMini", "anon");
        map.put("/system/logout", "anon");
        map.put("/common/captcha", "anon");
        map.put("/business/smsEmail/sendSms", "anon");
server/service/src/main/java/com/doumee/config/shiro/ShiroCredentialsMatcher.java
@@ -26,15 +26,21 @@
    public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {
        ShiroToken usernamePasswordToken = (ShiroToken) token;
        SystemUser queryUserDto = new SystemUser();
        queryUserDto.setUsername(usernamePasswordToken.getUsername());
        queryUserDto.setDeleted(Boolean.FALSE);
        if(!usernamePasswordToken.isNeedPassword()){
            queryUserDto.setMobile(usernamePasswordToken.getUsername());
            SystemUser systemUser = systemUserService.findOne(queryUserDto);
            if (systemUser == null) {
                return Boolean.FALSE;
            }
            return Boolean.TRUE;
        }
        queryUserDto.setUsername(usernamePasswordToken.getUsername());
        SystemUser systemUser = systemUserService.findOne(queryUserDto);
        if (systemUser == null) {
            return Boolean.FALSE;
        }
        if(!usernamePasswordToken.isNeedPassword()){
            return Boolean.TRUE;
        }
        // åŠ å¯†å¯†ç 
        String pwd = Utils.Secure.encryptPassword(new String(usernamePasswordToken.getPassword()), systemUser.getSalt());
        // æ¯”较密码
server/service/src/main/java/com/doumee/core/model/LoginUserInfo.java
@@ -34,6 +34,7 @@
    private String sex;
    private String mobile;
    private String openid;
    private Integer companyId;
    private Integer areaId;
    private Integer cityId;
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";
@@ -564,7 +566,7 @@
        SYSTEM(0, "系统用户", "管理员",Arrays.asList(0,1,2,3,4,5,6,7,8,9,10,11)),
        COMPANY(1, "企业用户", "企业",Arrays.asList(-1)),
        ZHUBO(2, "主播", "主播",Arrays.asList(-1)),
        ZHUBO(2, "商户", "商户",Arrays.asList(-1)),
        ;
        // æˆå‘˜å˜é‡
        private String name;
@@ -844,6 +846,97 @@
        }
    }
    public  enum UnionApplyStatus {
        UPLOAD(1, "待上传投保单","",0),
        ;
        // æˆå‘˜å˜é‡
        private String name;
        private String info;
        private int key;
        private int collectStatus;
        // æž„造方法
        UnionApplyStatus(int key, String name,String info,int collectStatus) {
            this.name = name;
            this.key = key;
            this.info = info;
            this.collectStatus = collectStatus;
        }
        // æ™®é€šæ–¹æ³•
        public static String getName(int index) {
            for (UnionApplyStatus c : UnionApplyStatus.values()) {
                if (c.getKey() == index) {
                    return c.name;
                }
            }
            return null;
        }
        public static List<Integer> getKesByStatus(Integer collectStatus) {
            List<Integer>  list = new ArrayList<>();
            if(collectStatus!=null){
                for (UnionApplyStatus c : UnionApplyStatus.values()) {
                    if (Constants.equalsInteger(c.getCollectStatus() ,collectStatus)) {
                        list.add(c.getKey());
                    }
                }
            }
            return list;
        }
        public static Integer getCollectStatus(Integer index) {
            for (UnionApplyStatus c : UnionApplyStatus.values()) {
                if (Constants.equalsInteger(c.getKey() , index)) {
                    return c.collectStatus;
                }
            }
            return null;
        }
        public static String getInfo(int index) {
            for (UnionApplyStatus c : UnionApplyStatus.values()) {
                if (c.getKey() == index) {
                    return c.info;
                }
            }
            return null;
        }
        // get set æ–¹æ³•
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getKey() {
            return key;
        }
        public void setKey(int key) {
            this.key = key;
        }
        public String getInfo() {
            return info;
        }
        public void setInfo(String info) {
            this.info = info;
        }
        public int getCollectStatus() {
            return collectStatus;
        }
        public void setCollectStatus(int collectStatus) {
            this.collectStatus = collectStatus;
        }
    }
    public  enum InsuranceApplyStatus {
        UPLOAD(0, "提交投保","",0),
        PLATFORM_RETURN(1, "审核不通过","提交意见:${param}",4),
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/business/dto/SaveUnionApplyDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.doumee.dao.business.dto;
import com.doumee.core.annotation.excel.ExcelColumn;
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.models.auth.In;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2024/3/15 14:42
 */
@Data
public class SaveUnionApplyDTO {
    @ApiModelProperty(value = "方案基础数据主键")
    private Integer baseSolutionId;
    @ApiModelProperty(value = "保单主键 å¤šä¸ªä»¥,分割")
    private List<Integer> applyIds;
    @ApiModelProperty(value = "开始日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date startDate;
    @ApiModelProperty(value = "结束日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date endDate;
}
server/service/src/main/java/com/doumee/dao/business/model/InsuranceApply.java
@@ -214,6 +214,9 @@
    @TableField(exist = false)
    private Integer timeUnit;
    @ApiModelProperty(value = "方案基础版本主键", example = "1")
    @TableField(exist = false)
    private Integer solutionBaseId;
    @ApiModelProperty(value = "最新版本的方案主键", example = "1")
    @TableField(exist = false)
server/service/src/main/java/com/doumee/dao/system/dto/LoginDTO.java
@@ -30,4 +30,8 @@
    @NotBlank(message = "验证码UUID不能为空")
    @ApiModelProperty(value = "验证码UUID")
    private String uuid;
    @ApiModelProperty(value = "openid",hidden = true)
    private String openid;
}
server/service/src/main/java/com/doumee/dao/system/dto/LoginPhoneDTO.java
@@ -21,5 +21,4 @@
    @NotBlank(message = "验证码不能为空")
    @ApiModelProperty(value = "验证码")
    private String code;
}
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
@@ -73,9 +73,6 @@
    @ApiModelProperty(value = "密码")
    @NotBlank(message = "初始密码不能为空")
    private String password;
    @ApiModelProperty(value = "openid")
    @NotBlank(message = "openid")
    private String openid;
    @ApiModelProperty(value = "盐")
    private String salt;
@@ -102,6 +99,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/business/UnionApplyService.java
@@ -2,6 +2,7 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.dto.SaveUnionApplyDTO;
import com.doumee.dao.business.model.UnionApply;
import java.util.List;
@@ -94,4 +95,10 @@
     * @return long
     */
    long count(UnionApply unionApply);
    /**
     * ä¿å•合并
     * @param saveUnionApplyDTO
     */
    void merge(SaveUnionApplyDTO saveUnionApplyDTO);
}
server/service/src/main/java/com/doumee/service/business/impl/UnionApplyServiceImpl.java
@@ -1,20 +1,35 @@
package com.doumee.service.business.impl;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.UnionApplyMapper;
import com.doumee.dao.business.dto.SaveUnionApplyDTO;
import com.doumee.dao.business.join.InsuranceApplyJoinMapper;
import com.doumee.dao.business.model.InsuranceApply;
import com.doumee.dao.business.model.Solutions;
import com.doumee.dao.business.model.UnionApply;
import com.doumee.service.business.UnionApplyService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.swagger.models.auth.In;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
 * åˆå¹¶æŠ•保单信息表Service实现
@@ -26,6 +41,9 @@
    @Autowired
    private UnionApplyMapper unionApplyMapper;
    @Autowired
    private InsuranceApplyJoinMapper insuranceApplyJoinMapper;
    @Override
    public Integer create(UnionApply unionApply) {
@@ -166,4 +184,66 @@
        QueryWrapper<UnionApply> wrapper = new QueryWrapper<>(unionApply);
        return unionApplyMapper.selectCount(wrapper);
    }
    @Override
    public void merge(SaveUnionApplyDTO saveUnionApplyDTO){
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(user.getType().equals(Constants.TWO)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"非商户用户,无法进行该操作");
        }
        if(Objects.isNull(saveUnionApplyDTO)
            || Objects.isNull(saveUnionApplyDTO.getApplyIds())
            || Objects.isNull(saveUnionApplyDTO.getStartDate())
            || Objects.isNull(saveUnionApplyDTO.getEndDate())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        List<InsuranceApply> insuranceApplyList = insuranceApplyJoinMapper.selectJoinList(InsuranceApply.class,
                new MPJLambdaWrapper<InsuranceApply>()
                        .selectAll(InsuranceApply.class)
                        .selectAs(InsuranceApply::getSolutionBaseId,Solutions::getBaseId)
                        .leftJoin(Solutions.class,Solutions::getId,InsuranceApply::getSolutionId)
                        .eq(InsuranceApply::getIsdeleted, Constants.ZERO)
                        .eq(InsuranceApply::getStatus,Constants.InsuranceApplyStatus.PLATFORM_CHECK_PASS.getKey())
                        .eq(Solutions::getBaseId,saveUnionApplyDTO.getBaseSolutionId())
                        .in(InsuranceApply::getId,saveUnionApplyDTO.getApplyIds())
                        .isNull(InsuranceApply::getUnionApplyId)
        );
        //查询数据是否存在未处于审批通过的数据
        if(insuranceApplyList.size()!=saveUnionApplyDTO.getApplyIds().size()){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"存在数据已处理,请刷新重试");
        }
        UnionApply unionApply = new UnionApply();
        unionApply.setCreateDate(new Date());
        unionApply.setCreator(user.getId());
        unionApply.setCompanyId(user.getCompanyId());
        unionApply.setStartTime(saveUnionApplyDTO.getStartDate());
        unionApply.setEndTime(saveUnionApplyDTO.getEndDate());
        unionApply.setCheckDate(new Date());
        unionApply.setStatus(Constants.UnionApplyStatus.UPLOAD.getKey());
        unionApply.setCheckUserId(user.getId());
        unionApply.setFee(insuranceApplyList.stream().map(i->i.getFee()).reduce(BigDecimal.ZERO,BigDecimal::add));
        unionApply.setCurrentFee(BigDecimal.ZERO);
        unionApplyMapper.insert(unionApply);
        insuranceApplyJoinMapper.update(null,new UpdateWrapper<InsuranceApply>().lambda()
                .set(InsuranceApply::getUnionApplyId,unionApply.getId())
                .set(InsuranceApply::getCheckDate,new Date())
                .set(InsuranceApply::getCheckUserId,user.getId())
                .in(InsuranceApply::getId,saveUnionApplyDTO.getApplyIds()));
    }
    public void cancelMerge(Integer id){
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(user.getType().equals(Constants.TWO)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"非商户用户,无法进行该操作");
        }
    }
}
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,16 @@
     * @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 wxMiniLoginDTO
     * @param request
     * @return
     */
    String loginByWxMini (WxMiniLoginDTO wxMiniLoginDTO, HttpServletRequest request);
    void cleaOpenid();
}
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,92 @@
    @Autowired
    private SystemLoginLogService systemLoginLogService;
    @Autowired
    private SystemUserMapper systemUserMapper;
//    /**
//     * å¾®ä¿¡æŽˆæƒï¼ˆç™»å½•后)
//     * @param code
//     */
//    @Override
//    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 loginByPassword(LoginDTO dto, int type,HttpServletRequest request) {
    public void cleaOpenid(){
        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(StringUtils.isNotBlank(loginUserInfo.getOpenid())){
            systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
                    .set(SystemUser::getOpenid,null)
                    .eq(SystemUser::getId,loginUserInfo.getId()));
        }
    }
    @Override
    public String loginByWxMini (WxMiniLoginDTO wxMiniLoginDTO, HttpServletRequest request){
        LoginDTO dto = new LoginDTO();
        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 loginPhoneDTO = new LoginPhoneDTO();
                        loginPhoneDTO.setPhone(systemUser.getMobile());
                        return  this.loginByPhone(loginPhoneDTO,Constants.ONE,false,request);
                    }else{
                        return null;
                    }
                }else{
                    dto.setOpenid(openId);
                }
            } 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);
        }
        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 +150,7 @@
        loginLog.setServerIp(Utils.Server.getIP());
        // æ ¡éªŒéªŒè¯ç 
        try {
            if(!debugModel){
            if(!debugModel&&checkCaptcha){
                captchaService.check(dto.getUuid(), dto.getCode());
            }
        } catch (Exception e) {
@@ -75,6 +168,17 @@
            loginLog.setUserId(((LoginUserInfo)subject.getPrincipal()).getId());
            loginLog.setSuccess(Boolean.TRUE);
            systemLoginLogService.create(loginLog);
            //更新openid所属用户信息
            if(StringUtils.isNotBlank(dto.getOpenid())){
                systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
                        .set(SystemUser::getOpenid,null)
                        .eq(SystemUser::getOpenid,dto.getOpenid())
                        .ne(SystemUser::getId,loginLog.getUserId()));
                systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
                        .set(SystemUser::getOpenid,dto.getOpenid())
                        .eq(SystemUser::getId,loginLog.getUserId()));
            }
            return (String)subject.getSession().getId();
        } catch (AuthenticationException e) {
            log.error(ResponseStatus.ACCOUNT_INCORRECT.getMessage(), e);
@@ -84,8 +188,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,18 +202,16 @@
        loginLog.setOsInfo(Utils.User_Client.getOS(request));
        loginLog.setServerIp(Utils.Server.getIP());
        // æ ¡éªŒéªŒè¯ç 
        if(type!= Constants.TWO){
            try {
                if(!debugModel){
                    SmsEmailServiceImpl.isCaptcheValide(smsEmailMapper,dto.getPhone(), dto.getCode());
                }
            } catch (Exception e) {
                log.error(e.getMessage(), e);
                loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage());
                loginLog.setSuccess(Boolean.FALSE);
                systemLoginLogService.create(loginLog);
                throw e;
        try {
            if(!debugModel&& checkSmsCode){
                SmsEmailServiceImpl.isCaptcheValide(smsEmailMapper,dto.getPhone(), dto.getCode());
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage());
            loginLog.setSuccess(Boolean.FALSE);
            systemLoginLogService.create(loginLog);
            throw e;
        }
        // æ ¡éªŒç”¨æˆ·åå’Œå¯†ç 
        Subject subject = SecurityUtils.getSubject();
@@ -127,4 +230,10 @@
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(), Objects.isNull(e.getCause())?ResponseStatus.ACCOUNT_INCORRECT.getMessage():e.getCause().getMessage());
        }
    }
}
server/shop/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,18 @@
    @ApiOperation("登录 - åŽç«¯")
    @PostMapping("/login")
    public ApiResponse<String> login (@Validated @RequestBody LoginDTO dto, HttpServletRequest request) {
        return ApiResponse.success(systemLoginService.loginByPassword(dto, Constants.TWO, request));
        return ApiResponse.success(systemLoginService.loginByPassword(dto, Constants.TWO,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.TWO, request));
        return ApiResponse.success(systemLoginService.loginByPhone(dto, Constants.TWO,true, request));
    }
    @ApiOperation("退出登录")
    @PostMapping("/logout")
    public ApiResponse logout () {