111
k94314517
2025-07-11 372822d209a560b017294b594906aa89bd46f4ce
111
已添加13个文件
已修改11个文件
1377 ■■■■■ 文件已修改
server/pom.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/jwt/JwtProperties.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/mybatis/SpringUtils.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/wx/WxMiniConfig.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/annotation/LoginRequired.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/constants/Constants.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/constants/ResponseStatus.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/IdentityInfo.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/Member.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/Orders.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/WxPhoneRequest.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/AccountResponse.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/UserCenterVO.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/IdentityInfoService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/MemberService.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/IdentityInfoServiceImpl.java 130 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 216 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/AccountApi.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/ApiController.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/OrdersApi.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/UserApi.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/pom.xml
@@ -37,6 +37,7 @@
    <jna.version>5.7.0</jna.version>
    <poi.version>5.0.0</poi.version>
    <jjwt.version>0.9.1</jjwt.version>
    <weixin-java-pay.version>4.1.0</weixin-java-pay.version>
  </properties>
  <dependencyManagement>
    <dependencies>
@@ -230,6 +231,24 @@
      <artifactId>bcprov-jdk15on</artifactId>
      <version>1.60</version>
    </dependency>
    <!-- WeChat å°ç¨‹åº -->
    <dependency>
      <groupId>com.github.binarywang</groupId>
      <artifactId>weixin-java-miniapp</artifactId>
      <version>4.7.0</version>
    </dependency>
    <!-- WeChat æ”¯ä»˜ -->
    <dependency>
      <groupId>com.github.binarywang</groupId>
      <artifactId>weixin-java-pay</artifactId>
      <version>${weixin-java-pay.version}</version>
    </dependency>
    <dependency>
      <groupId>com.github.wechatpay-apiv3</groupId>
      <artifactId>wechatpay-java</artifactId>
      <version>0.2.12</version>
    </dependency>
 <!--   <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-storage-blob</artifactId>
server/services/src/main/java/com/doumee/config/jwt/JwtProperties.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.doumee.config.jwt;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@ConfigurationProperties(prefix = "auth.jwt")
@Component
public class JwtProperties {
    //是否开启JWT,即注入相关的类对象
    private Boolean enabled;
    //JWT密钥
    private String secret;
    //JWT有效时间
    private Long expiration;
    //前端向后端传递JWT时使用HTTP的header名称,前后端要统一
    private String header;
    //用户登录-用户名参数名称
    private String userParamName = "username";
    //用户登录-密码参数名称
    private String pwdParamName = "password";
    //是否使用默认的JWTAuthController
    private Boolean useDefaultController = false;
}
server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,137 @@
package com.doumee.config.jwt;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.Constants;
import com.doumee.core.utils.HttpsUtil;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.system.SystemUserMapper;
import com.doumee.dao.system.model.SystemUser;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
@Component
@Slf4j
public class JwtTokenUtil {
    public static final String HEADER_KEY = "token";
    public static final String MEMBER_ID = "MEMBER_ID";
    public static final String MEMBER_INFO = "MEMBER_INFO";
    @Resource
    private RedisTemplate<String,Object> redisTemplate;
    @Resource
    private JwtProperties jwtProperties;
    /**
     * ç”Ÿæˆtoken令牌
     *
     * @param member ä»¤ç‰Œä¸­æºå¸¦çš„附加信息
     * @return ä»¤token牌
     */
    public String generateToken(Member member) {
        if(member == null){
            return  null;
        }
        Map<String,Object> map = new HashMap<>();
        map.put("id",member.getId());
        return generateTokenDo(member);
    }
    public Member getUserInfoByToken(String token) {
        try {
            Member member = getClaimsFromToken(token);
            return member;
        } catch (Exception e) {
           e.printStackTrace();
        }
        return null;
    }
    /**
     * åˆ·æ–°ä»¤ç‰Œ
     *
     * @param token åŽŸä»¤ç‰Œ
     * @return æ–°ä»¤ç‰Œ
     */
    public void refreshToken(String token,Member member) {
        try {
            if(Objects.nonNull(member)){
                redisTemplate.opsForValue().set(Constants.REDIS_TOKEN_KEY+token,JSONObject.toJSONString(member),jwtProperties.getExpiration(), TimeUnit.MILLISECONDS);
            }
        } catch (Exception e) {
        }
    }
    /**
     * é€€å‡ºç™»é™†
     *
     * @param token åŽŸä»¤ç‰Œ
     * @return æ–°ä»¤ç‰Œ
     */
    public void logoutForH5(String token) {
        try {
            //删除老的token
            redisTemplate.delete(Constants.REDIS_TOKEN_KEY+token);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * ä»Žclaims生成令牌,如果看不懂就看谁调用它
     *
     * @return ä»¤ç‰Œ
     */
    private String generateTokenDo(Member member) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("id",member.getId());
        Date expirationDate = new Date(System.currentTimeMillis() + jwtProperties.getExpiration());
        String token = Jwts.builder().setClaims(claims)
                .setExpiration(expirationDate)
                .signWith(SignatureAlgorithm.HS512, jwtProperties.getSecret())
                .compact();
        redisTemplate.opsForValue().set(Constants.REDIS_TOKEN_KEY+token,JSONObject.toJSONString(member),jwtProperties.getExpiration(), TimeUnit.MILLISECONDS);
        return token;
    }
    /**
     * ä»Žä»¤ç‰Œä¸­èŽ·å–æ•°æ®å£°æ˜Ž,验证JWT签名
     *
     * @param token ä»¤ç‰Œ
     * @return æ•°æ®å£°æ˜Ž
     */
    private Member getClaimsFromToken(String token) {
        Member claims;
        try {
            String userInfo = (String) redisTemplate.opsForValue().get(Constants.REDIS_TOKEN_KEY+token);
            claims = JSONObject.toJavaObject(JSONObject.parseObject(userInfo),Member.class);
        } catch (Exception e) {
            claims = null;
        }
        return claims;
    }
}
server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,110 @@
package com.doumee.config.jwt;
import com.alibaba.fastjson.JSONObject;
import com.doumee.core.annotation.LoginRequired;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.dao.business.model.Member;
import io.jsonwebtoken.JwtException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Objects;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Autowired
    private JdbcTemplate dao;
    @Resource
    private JwtTokenUtil jwtTokenUtil;
    /**
     * æ·»åŠ æ‹¦æˆªå™¨
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //API接口JwtToken拦截器
        HandlerInterceptor TokenInterceptor = new HandlerInterceptor() {
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                // å¦‚果不是映射到方法直接通过
                if (!(handler instanceof HandlerMethod)) {
                    return true;
                }
                HandlerMethod handlerMethod = (HandlerMethod) handler;
                Class<?> beanType = handlerMethod.getBeanType();
                // æœ‰ @LoginRequired æ³¨è§£ï¼Œéœ€è¦ç™»å½•认证
                if (beanType.isAnnotationPresent(LoginRequired.class)) {
                    //获取token
                    String token = request.getHeader(JwtTokenUtil.HEADER_KEY);  // ä»Ž http è¯·æ±‚头中取出 token
                    if (StringUtils.isNotBlank(token)) {
                        checkLogin(request,response);
                    } else {
                        throw new BusinessException(ResponseStatus.BE_OVERDUE.getCode(),"未登录");
                    }
                }else if (handlerMethod.hasMethodAnnotation(LoginRequired.class)){
                    //获取token
                    String token = request.getHeader(JwtTokenUtil.HEADER_KEY);  // ä»Ž http è¯·æ±‚头中取出 token
                    if (StringUtils.isNotBlank(token)) {
                        checkLogin(request,response);
                    } else {
                        throw new BusinessException(ResponseStatus.BE_OVERDUE.getCode(),"未登录");
                    }
                }
                return true;
            }
        };
        registry.addInterceptor(TokenInterceptor).addPathPatterns("/web/**");
    }
    public Boolean checkLogin(HttpServletRequest request, HttpServletResponse response){
        String token = request.getHeader(JwtTokenUtil.HEADER_KEY);
        try {
            Member member  = jwtTokenUtil.getUserInfoByToken(token);
            if(Objects.isNull(member)){
                throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME.getCode(),"长时间未操作,请重新登录");
            }
            Integer isDeleted = dao.queryForObject(" select COALESCE(isdeleted,1)  from member where id  = ?", Integer.class, member.getId());
            if(isDeleted.equals(Constants.ONE)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已删除,请联系管理员");
            }
            Integer count = dao.queryForObject("select count(1) from member where id  = ?", Integer.class, member.getId());
            if (count != null && count > 0) {
                jwtTokenUtil.refreshToken(token,member);
                request.setAttribute(JwtTokenUtil.MEMBER_INFO, JSONObject.toJSONString(member));
                request.setAttribute(JwtTokenUtil.MEMBER_ID, member.getId());
                return true;
            }else{
                throw new BusinessException(ResponseStatus.BE_OVERDUE.getCode(),"用户信息出错");
            }
        } catch (IllegalArgumentException | JwtException e) {
            throw new BusinessException(ResponseStatus.BE_OVERDUE.getCode(),"未登录");
        }
    }
    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}
server/services/src/main/java/com/doumee/config/mybatis/SpringUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package com.doumee.config.mybatis;
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/services/src/main/java/com/doumee/config/wx/WxMiniConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package com.doumee.config.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.config.mybatis.SpringUtils;
import com.doumee.core.constants.Constants;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.constant.WxPayConstants;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
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 {
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    /********微信小程序服务**********/
    public static WxMaService wxMaService;
    /********微信小程序支付**********/
    public static WxPayService wxPayService;
    public static WxMiniConfig me() {
        return SpringUtils.get().getBean(WxMiniConfig.class);
    }
    @PostConstruct
    void init() {
        this.load_WxMaService();
//        this.load_wxPayService();
    }
    /**
     * åˆå§‹åŒ–微信小程序
     */
    public void load_WxMaService() {
        WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
        config.setAppid(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.WX_CONFIG,Constants.APPID).getCode()));
        config.setSecret(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.WX_CONFIG,Constants.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(sysDictService.getSysDictValue(SysDictEnum.WX_MINI_AppID.getCode())));
//        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.wxPayService = wxPayService;
//    }
}
server/services/src/main/java/com/doumee/core/annotation/LoginRequired.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.doumee.core.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginRequired {
}
server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -42,6 +42,15 @@
    public static final String WISDOM_SYSTEM ="WISDOM_SYSTEM" ;
    public static final String FOOT_WORDS ="FOOT_WORDS" ;
    public static final String WX_CONFIG ="WX_CONFIG" ;
    public static final String APPID ="APPID" ;
    public static final String SECRET ="SECRET" ;
    public static final String ACCESS_TOKEN ="ACCESS_TOKEN" ;
    public static final String SERVER_INTRODUCE ="SERVER_INTRODUCE" ;
    public static final String FEE_STANDARDS ="FEE_STANDARDS" ;
    public static final String ABOUT_US ="ABOUT_US" ;
    public static final String QYWX = "QYWX";
    public static final  Integer ONE = 1;
server/services/src/main/java/com/doumee/core/constants/ResponseStatus.java
@@ -28,7 +28,8 @@
    REPEAT_REQUEST(5100, "请勿重复提交"),
    MASSIVE_REQUEST(5101, "请求过于频繁"),
    NOT_ALLOWED(5110, "不允许的操作"),
    NO_LOGIN(5112, "未登录"),
    BE_OVERDUE(5112, "未登录"),
    TOKEN_EXCEED_TIME(5113, "登陆已过期"),
    ;
    private int code;
server/services/src/main/java/com/doumee/dao/business/model/IdentityInfo.java
@@ -1,5 +1,6 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -55,8 +56,8 @@
    @ExcelColumn(name="类型:0=用工身份;1=货运身份;2=供餐身份;")
    private Integer type;
    @ApiModelProperty(value = "会员逐渐", example = "1")
    @ExcelColumn(name="会员逐渐")
    @ApiModelProperty(value = "会员主键", example = "1")
    @ExcelColumn(name="会员主键")
    private Integer memberId;
    @ApiModelProperty(value = "认证类型:0=个人;1=企业", example = "1")
@@ -87,33 +88,21 @@
    @ExcelColumn(name="经度")
    private BigDecimal lgt;
    @ApiModelProperty(value = "身份证人像面")
    @ExcelColumn(name="身份证人像面")
    private String identityFront;
    @ApiModelProperty(value = "身份证人像面/营业执照")
    @ExcelColumn(name="身份证人像面/营业执照")
    private String img1;
    @ApiModelProperty(value = "身份证国徽面")
    @ExcelColumn(name="身份证国徽面")
    private String identityBack;
    @ApiModelProperty(value = "营业执照(企业类使用)")
    @ExcelColumn(name="营业执照(企业类使用)")
    private String businessLicense;
    @ApiModelProperty(value = "其他认证资料(企业类使用)")
    @ExcelColumn(name="其他认证资料(企业类使用)")
    private String otherFile;
    @ApiModelProperty(value = "道路运输经验许可证(企业类货运身份使用)")
    @ExcelColumn(name="道路运输经验许可证(企业类货运身份使用)")
    private String transportFile;
    @ApiModelProperty(value = "食品经营许可证(企业类供餐身份使用)")
    @ExcelColumn(name="食品经营许可证(企业类供餐身份使用)")
    private String foodBusinessFile;
    @ApiModelProperty(value = "身份证国徽面/道路交通营运许可证/食品经营许可证")
    @ExcelColumn(name="身份证国徽面/道路交通营运许可证/食品经营许可证")
    private String img2;
    @ApiModelProperty(value = "从业人员健康证")
    @ExcelColumn(name="从业人员健康证")
    private String healthFile;
    private String img3;
    @ApiModelProperty(value = "其他认证资料")
    @ExcelColumn(name="其他认证资料")
    private String img4;
    @ApiModelProperty(value = "认证审批状态:1=申请中;2=已通过;3=未通过;", example = "1")
    @ExcelColumn(name="认证审批状态:1=申请中;2=已通过;3=未通过;")
@@ -128,4 +117,7 @@
    @ExcelColumn(name="认证审批备注")
    private String auditRemark;
    @ApiModelProperty(value = "图片前缀")
    @TableField(exist = false)
    private String prefix;
}
server/services/src/main/java/com/doumee/dao/business/model/Member.java
@@ -1,11 +1,14 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.dao.vo.UserCenterVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.models.auth.In;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
@@ -27,7 +30,7 @@
    @ApiModelProperty(value = "是否已删除 0未删除 1已删除", example = "1")
    @ExcelColumn(name="是否已删除 0未删除 1已删除")
    private Byte deleted;
    private Integer deleted;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelColumn(name="创建人编码")
@@ -106,7 +109,7 @@
    @ApiModelProperty(value = "总接单量", example = "1")
    @ExcelColumn(name="总接单量")
    private Long reciveNum;
    private Long receiveNum;
    @ApiModelProperty(value = "总发单量", example = "1")
    @ExcelColumn(name="总发单量")
@@ -118,7 +121,7 @@
    @ApiModelProperty(value = "定位地址")
    @ExcelColumn(name="定位地址")
    private String localtion;
    private String location;
    @ApiModelProperty(value = "纬度", example = "1")
    @ExcelColumn(name="纬度")
@@ -142,6 +145,16 @@
    @ApiModelProperty(value = "是否接受自动派单:0=否;1=是;", example = "1")
    @ExcelColumn(name="是否接受自动派单:0=否;1=是;")
    private Integer autoReciveStatus;
    private Integer autoReceiveStatus;
    @ApiModelProperty(value = "当前使用身份:0=用工发布方;1=用工接单方;", example = "1")
    @ExcelColumn(name="当前使用身份:0=用工发布方;1=用工接单方;")
    private Integer useIdentity;
    @ApiModelProperty(value = "我的 - æ•°æ®ä¿¡æ¯", example = "1")
    @TableField(exist = false)
    private UserCenterVO userCenterVO;
}
server/services/src/main/java/com/doumee/dao/business/model/Orders.java
@@ -1,5 +1,6 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -10,6 +11,7 @@
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
import java.math.BigDecimal;
import java.util.List;
/**
 * è®¢å•信息记录
@@ -131,7 +133,7 @@
    @ApiModelProperty(value = "实收费用", example = "1")
    @ExcelColumn(name="实收费用")
    private Long reviceAccount;
    private Long receiveAccount;
    @ApiModelProperty(value = "费用说明")
    @ExcelColumn(name="费用说明")
@@ -240,6 +242,10 @@
    @ApiModelProperty(value = "接单方黑名单member:id å¤šä¸ªä»¥,分割")
    @ExcelColumn(name="接单方黑名单member:id å¤šä¸ªä»¥,分割")
    private String blackRecive;
    private String blackReceive;
    @ApiModelProperty
    @TableField(exist = false)
    private List<Multifile> multifileList;
}
server/services/src/main/java/com/doumee/dao/dto/WxPhoneRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.doumee.dao.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/3/23 9:50
 */
@Data
@ApiModel("微信授权手机号请求类")
public class WxPhoneRequest implements Serializable {
    @NotEmpty(message = "openid ä¸èƒ½ä¸ºç©º")
    @ApiModelProperty(value = "openid")
    private String openid;
    @NotEmpty(message = "code")
    @ApiModelProperty(value = "code")
    private String code;
}
server/services/src/main/java/com/doumee/dao/vo/AccountResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.doumee.dao.vo;
import com.doumee.core.constants.Constants;
import com.doumee.dao.business.model.Member;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/3/23 9:25
 */
@Data
@ApiModel("登录返回类")
public class AccountResponse implements Serializable {
    @ApiModelProperty(value = "用户token")
    private String token;
    @ApiModelProperty(value = "openid")
    private String openid;
    @ApiModelProperty(value = "用户信息")
    private Member member;
}
server/services/src/main/java/com/doumee/dao/vo/UserCenterVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package com.doumee.dao.vo;
import com.doumee.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2025/7/10 15:09
 */
@Data
public class UserCenterVO {
    @ApiModelProperty(value = "发布任务总数 - å‘单方使用")
    private Integer releaseTaskTotal;
    @ApiModelProperty(value = "待接单任务总数 - å‘单方使用")
    private Integer waitReceiveTotal;
    @ApiModelProperty(value = "进行中任务总数 - å‘单方使用")
    private Integer doingTotal;
    @ApiModelProperty(value = "待评价任务总数 - å‘单方使用")
    private Integer waitCommentTotal;
    @ApiModelProperty(value = "进行中任务数量 - æŽ¥å•方使用")
    private Integer taskingTotal;
    @ApiModelProperty(value = "完成任务数量 - æŽ¥å•方使用")
    private Integer doneTotal;
    @ApiModelProperty(value = "已接单任务数量 - æŽ¥å•方使用")
    private Integer receiveTotal;
    @ApiModelProperty(value = "服务介绍")
    private String serverIntroduce;
    @ApiModelProperty(value = "收费标准")
    private String feeStandards;
    @ApiModelProperty(value = "关于我们")
    private String aboutUs;
}
server/services/src/main/java/com/doumee/service/business/IdentityInfoService.java
@@ -94,4 +94,9 @@
     * @return long
     */
    long count(IdentityInfo identityInfo);
    IdentityInfo findByMemberType(Integer type,Integer memberId);
    void updateLocation(IdentityInfo identityInfo);
}
server/services/src/main/java/com/doumee/service/business/MemberService.java
@@ -1,9 +1,23 @@
package com.doumee.service.business;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.doumee.config.wx.WxMiniConfig;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.dto.WxPhoneRequest;
import com.doumee.dao.vo.AccountResponse;
import me.chanjar.weixin.common.error.WxErrorException;
import org.apache.commons.lang3.StringUtils;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
 * ä¼šå‘˜ä¿¡æ¯è¡¨Service定义
@@ -94,4 +108,42 @@
     * @return long
     */
    long count(Member member);
    /***************小程序接口*************/
    /**
     * æŽˆæƒç™»å½• æ ¹æ®openid查询账号 å¦‚果查询到 åˆ™è‡ªåŠ¨ç™»å½•
     * @param code
     * @return
     */
    AccountResponse wxLogin(String code);
    /**
     * æŽˆæƒæ‰‹æœºå· æ ¹æ®æ‰‹æœºå·æŸ¥è¯¢ç”¨æˆ·ä¿¡æ¯ å¦‚果查询到 è¿”回登录信息
     * @param wxPhoneRequest
     * @return
     */
    AccountResponse wxAuthPhone(WxPhoneRequest wxPhoneRequest);
    /**
     * æ›´æ–°ä¸ªäººä¿¡æ¯
     * @param member
     */
    void editMemberInfo(Member member);
    /**
     * åˆ‡æ¢ç”¨å·¥èº«ä»½
     * @param member
     */
    void editUseIdentity(Member member);
    /**
     * ä¸ªäººä¿¡æ¯
     * @param memberId
     * @return
     */
    Member getMemberInfo(Integer memberId);
}
server/services/src/main/java/com/doumee/service/business/impl/IdentityInfoServiceImpl.java
@@ -1,5 +1,8 @@
package com.doumee.service.business.impl;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Utils;
@@ -13,8 +16,11 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
 * ä¼šå‘˜èº«ä»½è®¤è¯ä¿¡æ¯è¡¨Service实现
@@ -29,6 +35,30 @@
    @Override
    public Integer create(IdentityInfo identityInfo) {
        if(Objects.isNull(identityInfo)
        || Objects.isNull(identityInfo.getType())
        || Objects.isNull(identityInfo.getMemberId())
        || Objects.isNull(identityInfo.getAuthType())
                || StringUtils.isEmpty(identityInfo.getLinkName())
                || StringUtils.isEmpty(identityInfo.getTelephone())
                || StringUtils.isEmpty(identityInfo.getLocation())
                || StringUtils.isEmpty(identityInfo.getImg1())
                || Objects.isNull(identityInfo.getLat())
                || Objects.isNull(identityInfo.getLgt())
                || (Constants.equalsInteger(identityInfo.getAuthType(),Constants.ONE) && StringUtils.isEmpty(identityInfo.getCompanyName()))
                || (Constants.equalsInteger(identityInfo.getAuthType(),Constants.ZERO) && StringUtils.isEmpty(identityInfo.getImg2()))
                || (Constants.equalsInteger(identityInfo.getAuthType(),Constants.ONE) && Constants.equalsInteger(identityInfo.getType(),Constants.ONE) && StringUtils.isEmpty(identityInfo.getImg2()))
                || (Constants.equalsInteger(identityInfo.getAuthType(),Constants.ONE) && Constants.equalsInteger(identityInfo.getType(),Constants.TWO) && (StringUtils.isEmpty(identityInfo.getImg2())||StringUtils.isEmpty(identityInfo.getImg3())))
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        //查询用户是否已存在当前身份
        if(identityInfoMapper.selectCount(new QueryWrapper<IdentityInfo>().lambda().eq(IdentityInfo::getMemberId,identityInfo.getMemberId())
                .eq(IdentityInfo::getType,identityInfo.getType()))>Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"已存在该身份请刷新查看!");
        };
        identityInfo.setCreateTime(new Date());
        identityInfo.setAuditStatus(Constants.ZERO);
        identityInfoMapper.insert(identityInfo);
        return identityInfo.getId();
    }
@@ -54,7 +84,65 @@
    @Override
    public void updateById(IdentityInfo identityInfo) {
        if(Objects.isNull(identityInfo)
                || Objects.isNull(identityInfo.getId())
                || Objects.isNull(identityInfo.getType())
                || Objects.isNull(identityInfo.getMemberId())
                || Objects.isNull(identityInfo.getAuthType())
                || StringUtils.isEmpty(identityInfo.getLinkName())
                || StringUtils.isEmpty(identityInfo.getTelephone())
                || StringUtils.isEmpty(identityInfo.getLocation())
                || StringUtils.isEmpty(identityInfo.getImg1())
                || Objects.isNull(identityInfo.getLat())
                || Objects.isNull(identityInfo.getLgt())
                || (Constants.equalsInteger(identityInfo.getAuthType(),Constants.ONE) && StringUtils.isEmpty(identityInfo.getCompanyName()))
                || (Constants.equalsInteger(identityInfo.getAuthType(),Constants.ZERO) && StringUtils.isEmpty(identityInfo.getImg2()))
                || (Constants.equalsInteger(identityInfo.getAuthType(),Constants.ONE) && Constants.equalsInteger(identityInfo.getType(),Constants.ONE) && StringUtils.isEmpty(identityInfo.getImg2()))
                || (Constants.equalsInteger(identityInfo.getAuthType(),Constants.ONE) && Constants.equalsInteger(identityInfo.getType(),Constants.TWO) && (StringUtils.isEmpty(identityInfo.getImg2())||StringUtils.isEmpty(identityInfo.getImg3())))
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        IdentityInfo model = identityInfoMapper.selectById(identityInfo.getId());
        if (Objects.isNull(model)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(!Constants.equalsInteger(model.getMemberId(),identityInfo.getMemberId())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"非您的数据无法进行该操作");
        }
        if(!Constants.equalsInteger(model.getAuditStatus(),Constants.THREE)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前状态无法进行该操作");
        }
        identityInfo.setUpdateTime(new Date());
        identityInfoMapper.updateById(identityInfo);
    }
    @Override
    public void updateLocation(IdentityInfo identityInfo) {
        if(Objects.isNull(identityInfo)
                || Objects.isNull(identityInfo.getId())
                || Objects.isNull(identityInfo.getMemberId())
                || StringUtils.isEmpty(identityInfo.getLocation())
                || Objects.isNull(identityInfo.getLat())
                || Objects.isNull(identityInfo.getLgt())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        IdentityInfo model = identityInfoMapper.selectById(identityInfo.getId());
        if (Objects.isNull(model)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(!Constants.equalsInteger(model.getMemberId(),identityInfo.getMemberId())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"非您的数据无法进行该操作");
        }
        if(!Constants.equalsInteger(model.getAuditStatus(),Constants.TWO)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前状态无法进行该操作");
        }
        model.setLocation(identityInfo.getLocation());
        model.setLat(identityInfo.getLat());
        model.setLgt(identityInfo.getLgt());
        model.setUpdateTime(new Date());
        identityInfoMapper.updateById(model);
    }
    @Override
@@ -69,8 +157,27 @@
    @Override
    public IdentityInfo findById(Integer id) {
        return identityInfoMapper.selectById(id);
        IdentityInfo identityInfo = identityInfoMapper.selectById(id);
        //缺失前缀
        identityInfo.setPrefix("");
        return identityInfo;
    }
    @Override
    public IdentityInfo findByMemberType(Integer type,Integer memberId){
        IdentityInfo identityInfo = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
                .eq(IdentityInfo::getMemberId,memberId).eq(IdentityInfo::getType,type));
        if(Objects.nonNull(identityInfo)){
            //缺失前缀
            identityInfo.setPrefix("");
        }else{
            identityInfo = new IdentityInfo();
        }
        return identityInfo;
    }
    @Override
    public IdentityInfo findOne(IdentityInfo identityInfo) {
@@ -138,27 +245,6 @@
        }
        if (pageWrap.getModel().getLgt() != null) {
            queryWrapper.lambda().eq(IdentityInfo::getLgt, pageWrap.getModel().getLgt());
        }
        if (pageWrap.getModel().getIdentityFront() != null) {
            queryWrapper.lambda().eq(IdentityInfo::getIdentityFront, pageWrap.getModel().getIdentityFront());
        }
        if (pageWrap.getModel().getIdentityBack() != null) {
            queryWrapper.lambda().eq(IdentityInfo::getIdentityBack, pageWrap.getModel().getIdentityBack());
        }
        if (pageWrap.getModel().getBusinessLicense() != null) {
            queryWrapper.lambda().eq(IdentityInfo::getBusinessLicense, pageWrap.getModel().getBusinessLicense());
        }
        if (pageWrap.getModel().getOtherFile() != null) {
            queryWrapper.lambda().eq(IdentityInfo::getOtherFile, pageWrap.getModel().getOtherFile());
        }
        if (pageWrap.getModel().getTransportFile() != null) {
            queryWrapper.lambda().eq(IdentityInfo::getTransportFile, pageWrap.getModel().getTransportFile());
        }
        if (pageWrap.getModel().getFoodBusinessFile() != null) {
            queryWrapper.lambda().eq(IdentityInfo::getFoodBusinessFile, pageWrap.getModel().getFoodBusinessFile());
        }
        if (pageWrap.getModel().getHealthFile() != null) {
            queryWrapper.lambda().eq(IdentityInfo::getHealthFile, pageWrap.getModel().getHealthFile());
        }
        if (pageWrap.getModel().getAuditStatus() != null) {
            queryWrapper.lambda().eq(IdentityInfo::getAuditStatus, pageWrap.getModel().getAuditStatus());
server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -1,20 +1,45 @@
package com.doumee.service.business.impl;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.jwt.JwtTokenUtil;
import com.doumee.config.wx.WxMiniConfig;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.IdentityInfoMapper;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.OrdersMapper;
import com.doumee.dao.business.model.IdentityInfo;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Orders;
import com.doumee.dao.dto.WxPhoneRequest;
import com.doumee.dao.vo.AccountResponse;
import com.doumee.dao.vo.UserCenterVO;
import com.doumee.service.business.MemberService;
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.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import io.swagger.annotations.ApiModelProperty;
import me.chanjar.weixin.common.error.WxErrorException;
import nonapi.io.github.classgraph.json.Id;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Random;
import java.util.stream.Collectors;
/**
 * ä¼šå‘˜ä¿¡æ¯è¡¨Service实现
@@ -26,6 +51,18 @@
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private IdentityInfoMapper identityInfoMapper;
    @Autowired
    private OrdersMapper ordersMapper;
    @Autowired
    private JwtTokenUtil jwtTokenUtil;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Override
    public Integer create(Member member) {
@@ -152,17 +189,11 @@
        if (pageWrap.getModel().getLoginTimes() != null) {
            queryWrapper.lambda().eq(Member::getLoginTimes, pageWrap.getModel().getLoginTimes());
        }
        if (pageWrap.getModel().getReciveNum() != null) {
            queryWrapper.lambda().eq(Member::getReciveNum, pageWrap.getModel().getReciveNum());
        }
        if (pageWrap.getModel().getPublishNum() != null) {
            queryWrapper.lambda().eq(Member::getPublishNum, pageWrap.getModel().getPublishNum());
        }
        if (pageWrap.getModel().getScore() != null) {
            queryWrapper.lambda().eq(Member::getScore, pageWrap.getModel().getScore());
        }
        if (pageWrap.getModel().getLocaltion() != null) {
            queryWrapper.lambda().eq(Member::getLocaltion, pageWrap.getModel().getLocaltion());
        }
        if (pageWrap.getModel().getLat() != null) {
            queryWrapper.lambda().eq(Member::getLat, pageWrap.getModel().getLat());
@@ -179,9 +210,6 @@
        if (pageWrap.getModel().getArea() != null) {
            queryWrapper.lambda().eq(Member::getArea, pageWrap.getModel().getArea());
        }
        if (pageWrap.getModel().getAutoReciveStatus() != null) {
            queryWrapper.lambda().eq(Member::getAutoReciveStatus, pageWrap.getModel().getAutoReciveStatus());
        }
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
@@ -197,4 +225,174 @@
        QueryWrapper<Member> wrapper = new QueryWrapper<>(member);
        return memberMapper.selectCount(wrapper);
    }
    /***************小程序接口*************/
    /**
     * å¾®ä¿¡å°ç¨‹åºç™»å½•
     * @param code
     * @return
     */
    @Override
    public AccountResponse wxLogin(String code) {
        if(StringUtils.isBlank(code)){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        try {
            //获取微信敏感数据
            WxMaJscode2SessionResult session = WxMiniConfig.wxMaService.getUserService().getSessionInfo(code);
            String openId = session.getOpenid();
            String unionId = session.getUnionid();
            if (StringUtils.isBlank(openId)) {
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "获取openid失败!请联系管理员");
            }
            Member member = memberMapper.selectOne(new QueryWrapper<Member>().eq("openid", openId).eq("isdeleted", Constants.ZERO).last("limit 1"));
            AccountResponse accountResponse = new AccountResponse();
            accountResponse.setOpenid(openId);
            if(Objects.isNull(member)){
                return accountResponse;
            }
            accountResponse.setToken(jwtTokenUtil.generateToken(member));
            accountResponse.setMember(member);
            return accountResponse;
        } catch (WxErrorException e) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "微信登录异常!请联系管理员");
        }
    }
    @Override
    public AccountResponse wxAuthPhone(WxPhoneRequest wxPhoneRequest) {
        try {
            if(Objects.isNull(wxPhoneRequest)
            || StringUtils.isBlank(wxPhoneRequest.getCode())
            || StringUtils.isBlank(wxPhoneRequest.getOpenid())){
                throw new BusinessException(ResponseStatus.BAD_REQUEST);
            }
            WxMaPhoneNumberInfo userPhoneInfo = WxMiniConfig.wxMaService.getUserService().getPhoneNumber(wxPhoneRequest.getCode());
            String mobile = userPhoneInfo.getPhoneNumber();
            if(Objects.isNull(mobile)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未获取到手机号");
            }
            Member member =  memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getTelephone,mobile).last("limit 1"));
            member.setOpenid(wxPhoneRequest.getOpenid());
            if(Objects.nonNull(member)){
                memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getTelephone,mobile)
                        .set(Member::getOpenid,wxPhoneRequest.getOpenid()).set(Member::getUpdateTime,new Date()).eq(Member::getId,member.getId()));
            }else{
                member = new Member();
                member.setCreateTime(new Date());
                member.setDeleted(Constants.ZERO);
                member.setOpenid(wxPhoneRequest.getOpenid());
                member.setTelephone(mobile);
                member.setNickName(mobile);
                member.setCoverImage("");
                member.setWorkerIdentity(Constants.ZERO);
                member.setDriverIdentity(Constants.ZERO);
                member.setChefIdentity(Constants.ZERO);
                member.setAmount(Constants.ZERO.longValue());
                member.setTotalAmount(Constants.ZERO.longValue());
                member.setStatus(Constants.ZERO);
                member.setLoginTime(new Date());
                member.setLoginTimes(Constants.ONE.longValue());
                member.setReceiveNum(Constants.ZERO.longValue());
                member.setPublishNum(Constants.ZERO.longValue());
                member.setAutoReceiveStatus(Constants.ONE);
                member.setUseIdentity(Constants.ZERO);
                memberMapper.insert(member);
            }
            AccountResponse accountResponse = new AccountResponse();
            accountResponse.setToken(jwtTokenUtil.generateToken(member));
            accountResponse.setMember(member);
            return accountResponse;
        } catch (Exception e) {
            e.printStackTrace();
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未解析到手机号");
        }
    }
    @Override
    public void editMemberInfo(Member member){
        if(Objects.isNull(member)
            || ( StringUtils.isBlank(member.getCoverImage()) || StringUtils.isBlank(member.getName()) || StringUtils.isBlank(member.getNickName()) || Objects.isNull(member.getAutoReceiveStatus()) )){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        memberMapper.update(new UpdateWrapper<Member>().lambda()
                .set(StringUtils.isNotBlank(member.getNickName()),Member::getNickName,member.getNickName())
                .set(StringUtils.isNotBlank(member.getName()),Member::getName,member.getName())
                .set(StringUtils.isNotBlank(member.getCoverImage()),Member::getCoverImage,member.getCoverImage())
                .set(Objects.nonNull(member.getAutoReceiveStatus()),Member::getCoverImage,member.getAutoReceiveStatus())
                        .set(Member::getUpdateTime,new Date())
                .eq(Member::getId,member.getId()));
    }
    @Override
    public void editUseIdentity(Member member){
        if(Objects.isNull(member)
                || Objects.isNull(member.getUseIdentity())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if(Constants.equalsInteger(member.getUseIdentity(),Constants.ZERO)){
            member.setUseIdentity(Constants.ZERO);
            memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getUseIdentity,Constants.ZERO).eq(Member::getId,member.getId()));
        }else{
            if(identityInfoMapper.selectCount(new QueryWrapper<IdentityInfo>().lambda().eq(IdentityInfo::getDeleted,Constants.ZERO)
                    .eq(IdentityInfo::getMemberId,member.getId())
                    .eq(IdentityInfo::getAuditStatus,Constants.TWO))>Constants.ZERO){
                memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getUseIdentity,Constants.ONE).eq(Member::getId,member.getId()));
            }else{
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前无可用接单身份!");
            }
        }
    }
    @Override
    public Member getMemberInfo(Integer memberId){
        Member member  = this.findById(memberId);
        if(Objects.isNull(member)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        UserCenterVO userCenterVO = new UserCenterVO();
        userCenterVO.setReleaseTaskTotal(Constants.ZERO);
        userCenterVO.setWaitReceiveTotal(Constants.ZERO);
        userCenterVO.setDoingTotal(Constants.ZERO);
        userCenterVO.setWaitCommentTotal(Constants.ZERO);
        userCenterVO.setTaskingTotal(Constants.ZERO);
        userCenterVO.setDoneTotal(Constants.ZERO);
        userCenterVO.setReceiveTotal(Constants.ZERO);
        List<Orders> releaseOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda().eq(Orders::getDeleted,Constants.ZERO).eq(Orders::getReleaseMemberId,member));
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(releaseOrders)){
            userCenterVO.setReleaseTaskTotal(releaseOrders.size());
            userCenterVO.setWaitCommentTotal(releaseOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ZERO)).collect(Collectors.toList()).size());
            userCenterVO.setDoingTotal(releaseOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.TWO)).collect(Collectors.toList()).size());
            userCenterVO.setWaitCommentTotal(releaseOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.THREE)&&Constants.equalsInteger(i.getCommentStatus(),Constants.ZERO)).collect(Collectors.toList()).size());
        }
        List<Orders> acceptOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda().eq(Orders::getDeleted,Constants.ZERO).eq(Orders::getAcceptMemberId,member));
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(acceptOrders)){
            userCenterVO.setReceiveTotal(acceptOrders.size());
            userCenterVO.setTaskingTotal(acceptOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.TWO)).collect(Collectors.toList()).size());
            userCenterVO.setDoneTotal(releaseOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.THREE)).collect(Collectors.toList()).size());
        }
        userCenterVO.setAboutUs(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.ABOUT_US).getCode()));
        userCenterVO.setFeeStandards(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.FEE_STANDARDS).getCode()));
        userCenterVO.setServerIntroduce(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.SERVER_INTRODUCE).getCode()));
        member.setUserCenterVO(userCenterVO);
        return member;
    }
}
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
@@ -1,5 +1,8 @@
package com.doumee.service.business.impl;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Utils;
@@ -10,11 +13,14 @@
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jodd.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.Objects;
/**
 * è®¢å•信息记录Service实现
@@ -29,9 +35,44 @@
    @Override
    public Integer create(Orders orders) {
        ordersMapper.insert(orders);
        return orders.getId();
    }
    public void initVerification(Orders orders){
        if(Objects.isNull(orders)
                || Objects.isNull(orders.getType())
                || Objects.isNull(orders.getStartDate())
                || Objects.isNull(orders.getEndDate())
                || StringUtil.isBlank(orders.getLocation())
                || StringUtil.isBlank(orders.getLocationRemark())
                || Objects.isNull(orders.getLat())
                || Objects.isNull(orders.getLgt())
                || Objects.isNull(orders.getCategoryId())
                || (Constants.equalsInteger(orders.getType(),Constants.ZERO) && Objects.isNull(orders.getWorkType()))
                || Objects.isNull(orders.getPriceNum1())
                || (!( Constants.equalsInteger(orders.getType(),Constants.ZERO)
                && Constants.equalsInteger(orders.getWorkType(),Constants.TWO) ) && Objects.isNull(orders.getPrice()) )
                || ( Constants.equalsInteger(orders.getType(),Constants.ONE) && Objects.isNull(orders.getTransportTypeId()) )
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if(Constants.equalsInteger(orders.getType(),Constants.ONE)){
        }
    }
    @Override
    public void deleteById(Integer id) {
@@ -171,9 +212,6 @@
        if (pageWrap.getModel().getPayAccount() != null) {
            queryWrapper.lambda().eq(Orders::getPayAccount, pageWrap.getModel().getPayAccount());
        }
        if (pageWrap.getModel().getReviceAccount() != null) {
            queryWrapper.lambda().eq(Orders::getReviceAccount, pageWrap.getModel().getReviceAccount());
        }
        if (pageWrap.getModel().getPriceRemark() != null) {
            queryWrapper.lambda().eq(Orders::getPriceRemark, pageWrap.getModel().getPriceRemark());
        }
@@ -253,9 +291,6 @@
        }
        if (pageWrap.getModel().getIsUpdate() != null) {
            queryWrapper.lambda().eq(Orders::getIsUpdate, pageWrap.getModel().getIsUpdate());
        }
        if (pageWrap.getModel().getBlackRecive() != null) {
            queryWrapper.lambda().eq(Orders::getBlackRecive, pageWrap.getModel().getBlackRecive());
        }
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
server/web/src/main/java/com/doumee/api/web/AccountApi.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
package com.doumee.api.web;
import com.doumee.core.annotation.LoginRequired;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.core.model.ApiResponse;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.dto.WxPhoneRequest;
import com.doumee.dao.vo.AccountResponse;
import com.doumee.service.business.MemberService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2025/7/10 9:29
 */
@Api(tags = "1、登录业务")
@Trace(exclude = true)
@RestController
@RequestMapping("/web/account")
@Slf4j
public class AccountApi extends  ApiController{
    @Autowired
    private MemberService memberService;
    @Trace
    @ApiOperation(value = "微信授权", notes = "小程序端")
    @GetMapping("/wxLogin")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", dataType = "String", name = "code", value = "微信code", required = true)
    })
    public ApiResponse<AccountResponse> wxLogin(@RequestParam String code) {
        return  ApiResponse.success("操作成功",memberService.wxLogin(code));
    }
    @ApiOperation(value = "授权手机号", notes = "小程序端")
    @PostMapping("/wxAuthPhone")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", dataType = "String", name = "code", value = "微信code", required = true)
    })
    public ApiResponse<AccountResponse> wxAuthPhone(@RequestBody WxPhoneRequest wxPhoneRequest) {
        return  ApiResponse.success("操作成功",memberService.wxAuthPhone(wxPhoneRequest));
    }
}
server/web/src/main/java/com/doumee/api/web/ApiController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package com.doumee.api.web;
import com.alibaba.fastjson.JSONObject;
import com.doumee.config.jwt.JwtTokenUtil;
import com.doumee.dao.business.model.Member;
import com.doumee.service.business.MemberService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/**
 * Controller基类
 * @author Eva.Caesar Liu
 * @date 2022/03/15 09:54
 */
@Slf4j
@Service
public class ApiController {
    /**
     * å¾—到request对象
     *
     * @return
     */
    public HttpServletRequest getRequest() {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        return request;
    }
    protected Integer getMemberId() {
        Object obj = this.getRequest().getAttribute(JwtTokenUtil.MEMBER_ID);
        return obj != null ? (Integer) obj : null;
    }
    /**
     * èŽ·å–ç™»å½•ç”¨æˆ·å¯¹è±¡ä¿¡æ¯
     * @return
     */
    protected Member getMemberResponse(){
        Object obj = this.getRequest().getAttribute(JwtTokenUtil.MEMBER_INFO);
        if(obj != null){
            return JSONObject.parseObject(obj.toString(),Member.class);
        }
        return null;
    }
}
server/web/src/main/java/com/doumee/api/web/OrdersApi.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package com.doumee.api.web;
import com.doumee.core.annotation.LoginRequired;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.core.model.ApiResponse;
import com.doumee.dao.business.model.IdentityInfo;
import com.doumee.dao.business.model.Member;
import com.doumee.service.business.IdentityInfoService;
import com.doumee.service.business.MemberService;
import com.doumee.service.business.OrdersService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2025/7/10 9:29
 */
@Api(tags = "1、订单业务")
@Trace(exclude = true)
@RestController
@RequestMapping("/web/orders")
@Slf4j
public class OrdersApi extends  ApiController{
    @Autowired
    private MemberService memberService;
    @Autowired
    private OrdersService ordersService;
    @LoginRequired
    @ApiOperation(value = "编辑个人信息", notes = "小程序端")
    @GetMapping("/getMemberInfo")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<Member> getMemberInfo() {
        return  ApiResponse.success("查询成功",memberService.getMemberInfo(getMemberId()));
    }
}
server/web/src/main/java/com/doumee/api/web/UserApi.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,127 @@
package com.doumee.api.web;
import com.doumee.core.annotation.LoginRequired;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.core.model.ApiResponse;
import com.doumee.dao.business.model.IdentityInfo;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.dto.WxPhoneRequest;
import com.doumee.dao.vo.AccountResponse;
import com.doumee.service.business.IdentityInfoService;
import com.doumee.service.business.MemberService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2025/7/10 9:29
 */
@Api(tags = "2、用户信息")
@Trace(exclude = true)
@RestController
@RequestMapping("/web/user")
@Slf4j
public class UserApi extends  ApiController{
    @Autowired
    private MemberService memberService;
    @Autowired
    private IdentityInfoService identityInfoService;
    @LoginRequired
    @ApiOperation(value = "编辑个人信息", notes = "小程序端")
    @GetMapping("/getMemberInfo")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<Member> getMemberInfo() {
        return  ApiResponse.success("查询成功",memberService.getMemberInfo(getMemberId()));
    }
    @LoginRequired
    @ApiOperation(value = "编辑个人信息", notes = "小程序端")
    @PostMapping("/editMemberInfo")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse editMemberInfo(@RequestBody Member member) {
        member.setId(getMemberId());
        memberService.editMemberInfo(member);
        return  ApiResponse.success("操作成功");
    }
    @LoginRequired
    @ApiOperation(value = "切换用工身份", notes = "小程序端")
    @PostMapping("/editUseIdentity")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse editUseIdentity(@RequestBody Member member) {
        member.setId(getMemberId());
        memberService.editUseIdentity(member);
        return  ApiResponse.success("操作成功");
    }
    @LoginRequired
    @ApiOperation(value = "获取身份认证信息", notes = "小程序端")
    @GetMapping("/getIdentityInfo")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<IdentityInfo> getIdentityInfo(@RequestParam Integer type) {
        return  ApiResponse.success("查询成功",identityInfoService.findByMemberType(type,getMemberId()));
    }
    @LoginRequired
    @ApiOperation(value = "申请身份信息", notes = "小程序端")
    @PostMapping("/applyForIdentity")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse applyForIdentity(@RequestBody IdentityInfo identityInfo) {
        identityInfo.setMemberId(getMemberId());
        identityInfoService.create(identityInfo);
        return  ApiResponse.success("操作成功");
    }
    @LoginRequired
    @ApiOperation(value = "修改身份信息(认证失败后使用)", notes = "小程序端")
    @PostMapping("/updateIdentity")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse updateIdentity(@RequestBody IdentityInfo identityInfo) {
        identityInfo.setMemberId(getMemberId());
        identityInfoService.updateById(identityInfo);
        return  ApiResponse.success("操作成功");
    }
    @LoginRequired
    @ApiOperation(value = "修改身份信息位置(认证成功后使用)", notes = "小程序端")
    @PostMapping("/updateLocation")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse updateLocation(@RequestBody IdentityInfo identityInfo) {
        identityInfo.setMemberId(getMemberId());
        identityInfoService.updateLocation(identityInfo);
        return  ApiResponse.success("操作成功");
    }
}