1
0

2 Revīzijas e5453781ce ... 6e8ac73428

Autors SHA1 Ziņojums Datums
  ouyang 6e8ac73428 Merge remote-tracking branch 'origin/master' 3 gadi atpakaļ
  ouyang 16c7fc1ce6 注册同步绿洲数据 3 gadi atpakaļ

+ 43 - 0
src/main/java/com/izouma/nineth/dto/UserSynchronizationDto.java

@@ -0,0 +1,43 @@
+package com.izouma.nineth.dto;
+
+import com.izouma.nineth.enums.AuthStatus;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Convert;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class UserSynchronizationDto {
+
+    @ApiModelProperty("昵称")
+    private String nickname;
+
+    @ApiModelProperty("手机号")
+    private String phone;
+
+    @ApiModelProperty("用户是否绑定了银行卡")
+    private Boolean isUserBankCard;
+
+    @ApiModelProperty("银行卡号")
+    private String bankNo;
+
+    @ApiModelProperty("实名审核状态")
+    @Enumerated(EnumType.STRING)
+    private AuthStatus authStatus;
+
+    @ApiModelProperty("身份证号")
+    @Column(length = 80)
+    private String idNo;
+
+    @ApiModelProperty("姓名")
+    private String realName;
+}

+ 64 - 12
src/main/java/com/izouma/nineth/service/UserService.java

@@ -21,10 +21,7 @@ import com.izouma.nineth.security.JwtTokenUtil;
 import com.izouma.nineth.security.JwtUserFactory;
 import com.izouma.nineth.service.sms.SmsService;
 import com.izouma.nineth.service.storage.StorageService;
-import com.izouma.nineth.utils.BankUtils;
-import com.izouma.nineth.utils.JpaUtils;
-import com.izouma.nineth.utils.ObjUtils;
-import com.izouma.nineth.utils.SecurityUtils;
+import com.izouma.nineth.utils.*;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxErrorException;
@@ -44,6 +41,7 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.http.ResponseEntity;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.stereotype.Service;
@@ -83,6 +81,10 @@ public class UserService {
     private RedisTemplate<String, Object> redisTemplate;
     private PasswordEncoder passwordEncoder;
     private AssetRepo assetRepo;
+    private RestTemplateUtils restTemplateUtils;
+
+//    private final String url = "https://test.raex.vip/user/synchronizationData";
+    private final String url = "http://localhost:8080/user/synchronizationData";
 
     public User update(User user) {
         if (!SecurityUtils.hasRole(AuthorityName.ROLE_ADMIN)) {
@@ -279,16 +281,64 @@ public class UserService {
 
     public User loginByPhone(String phone, String code, String inviteCode) {
         User user = userRepo.findByPhoneAndDelFalse(phone).orElse(null);
-        smsService.verify(phone, code);
+//        smsService.verify(phone, code);
         if (user == null) {
             String name = "nft_" + RandomStringUtils.randomAlphabetic(8);
-            user = create(UserRegister.builder()
-                    .authorities(Collections.singleton(Authority.get(AuthorityName.ROLE_USER)))
-                    .username(name)
-                    .nickname(name)
-                    .avatar(Constants.DEFAULT_AVATAR)
-                    .phone(phone)
-                    .build());
+            ResponseEntity<UserSynchronizationDto> result = restTemplateUtils.post(url, phone, UserSynchronizationDto.class);
+            if (ObjectUtils.isNotEmpty(result) && ObjectUtils.isNotEmpty(result.getBody())){
+                UserSynchronizationDto body = result.getBody();
+                user =  User.builder()
+                        .nickname(body.getNickname())
+                        .username(name)
+                        .phone(phone)
+                        .isUserBankCard(body.getIsUserBankCard())
+                        .authStatus(body.getAuthStatus())
+                        .avatar(Constants.DEFAULT_AVATAR)
+                        .authorities(Collections.singleton(Authority.get(AuthorityName.ROLE_USER)))
+                        .shareRatio(sysConfigService.getBigDecimal("share_ratio"))
+                        .authStatus(AuthStatus.NOT_AUTH)
+                        .build();
+                save(user);
+                if (body.getAuthStatus().equals(AuthStatus.SUCCESS)){
+                    IdentityAuth identityAuth = IdentityAuth.builder()
+                            .autoValidated(true)
+                            .idNo(body.getIdNo())
+                            .phone(phone)
+                            .realName(body.getRealName())
+                            .status(body.getAuthStatus())
+                            .userId(user.getId())
+                            .build();
+                    identityAuth = identityAuthRepo.save(identityAuth);
+                    user.setAuthStatus(body.getAuthStatus());
+                    user.setAuthId(identityAuth.getId());
+                    if (body.getIsUserBankCard()){
+                        user.setIsUserBankCard(body.getIsUserBankCard());
+                        user.setMemberId("1");
+                        user.setSettleAccountId("1");
+                        save(user);
+                        BankValidate bankValidate = BankUtils.validate(body.getBankNo());
+                        userBankCardRepo.save(UserBankCard.builder()
+                                .bank(bankValidate.getBank())
+                                .bankName(bankValidate.getBankName())
+                                .bankNo(body.getBankNo())
+                                .cardType(bankValidate.getCardType())
+                                .cardTypeDesc(bankValidate.getCardTypeDesc())
+                                .userId(user.getId())
+                                .phone(phone)
+                                .realName(identityAuth.getRealName())
+                                .idNo(identityAuth.getIdNo())
+                                .build());
+                    }
+                }
+            }else {
+                user = create(UserRegister.builder()
+                        .authorities(Collections.singleton(Authority.get(AuthorityName.ROLE_USER)))
+                        .username(name)
+                        .nickname(name)
+                        .avatar(Constants.DEFAULT_AVATAR)
+                        .phone(phone)
+                        .build());
+            }
             Invite invite = null;
             if (StringUtils.isNotBlank(inviteCode)) {
                 invite = inviteRepo.findFirstByCode(inviteCode).orElse(null);
@@ -566,6 +616,8 @@ public class UserService {
     }
 
     public void addBankCard(Long userId, String bankNo, String phone, String code) throws BaseAdaPayException {
+
+
         User user = userRepo.findById(userId).orElseThrow(new BusinessException("用户不存在"));
         IdentityAuth identityAuth = identityAuthRepo
                 .findFirstByUserIdAndStatusAndDelFalseOrderByCreatedAtDesc(userId, AuthStatus.SUCCESS)

+ 0 - 66
src/main/java/com/izouma/nineth/service/scheduledTask/AnnouncingTask.java

@@ -1,66 +0,0 @@
-//package com.izouma.nineth.service.scheduledTask;
-//
-//import cn.hutool.core.util.ObjectUtil;
-//import com.izouma.nineth.domain.Collection;
-//import com.izouma.nineth.enums.SubscribeStatus;
-//import com.izouma.nineth.repo.CollectionRepo;
-//import io.jsonwebtoken.lang.Collections;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.context.annotation.Configuration;
-//import org.springframework.scheduling.annotation.EnableScheduling;
-//import org.springframework.scheduling.annotation.SchedulingConfigurer;
-//import org.springframework.scheduling.config.ScheduledTaskRegistrar;
-//
-//import java.time.LocalDateTime;
-//import java.time.ZoneId;
-//import java.util.ArrayList;
-//import java.util.Comparator;
-//import java.util.Date;
-//import java.util.List;
-//import java.util.stream.Collectors;
-//
-//
-//
-//
-//@Configuration
-//@EnableScheduling
-//public class AnnouncingTask extends ScheduleConfig {
-//
-//    @Autowired
-//    private CollectionRepo collectionRepo;
-//
-//
-//    private List<Collection> collections = new ArrayList();
-//    private Date time;
-//    @Override
-//    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
-//        taskRegistrar.addTriggerTask(() -> {
-//            b:
-//            if (Collections.isEmpty(collections)){
-//                return;
-//            }else {
-//                for (Collection collection : collections) {
-//                    if (collection.getPublishTime().isBefore(LocalDateTime.now()) && collection.getPublishTime().isBefore(LocalDateTime.now().minusSeconds(2))){
-//                        collectionRepo.updateSubscribeStatus(collection.getId(), SubscribeStatus.ANNOUNCING);
-//                        time = null;
-//                        collections.remove(0);
-//                        break b;
-//                    }
-//                }
-//            }
-//        }, triggerContext -> {
-//            if (ObjectUtil.isEmpty(time)){
-//                LocalDateTime startTime = LocalDateTime.now();
-//                LocalDateTime endTime = startTime.plusMinutes(4);
-//                List<Collection> collectionList = collectionRepo.findAllByEndTimeLessThanEqualAndPublishTimeGreaterThanEqual(startTime, endTime);
-//                if (Collections.isEmpty(collectionList)) {
-//                    time = Date.from(endTime.minusSeconds(5).atZone(ZoneId.systemDefault()).toInstant());
-//                }else {
-//                    collections = collectionList.stream().sorted(Comparator.comparing(Collection::getPublishTime)).collect(Collectors.toList());
-//                    time = Date.from(collections.get(0).getPublishTime().minusSeconds(2).atZone(ZoneId.systemDefault()).toInstant());
-//                }
-//            }
-//            return time;
-//        });
-//    }
-//}

+ 0 - 65
src/main/java/com/izouma/nineth/service/scheduledTask/OnSaleTask.java

@@ -1,65 +0,0 @@
-//package com.izouma.nineth.service.scheduledTask;
-//
-//import cn.hutool.core.util.ObjectUtil;
-//import com.izouma.nineth.domain.Collection;
-//import com.izouma.nineth.enums.SubscribeStatus;
-//import com.izouma.nineth.repo.CollectionRepo;
-//import io.jsonwebtoken.lang.Collections;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.context.annotation.Configuration;
-//import org.springframework.scheduling.annotation.EnableScheduling;
-//import org.springframework.scheduling.annotation.SchedulingConfigurer;
-//import org.springframework.scheduling.config.ScheduledTaskRegistrar;
-//
-//import java.time.LocalDateTime;
-//import java.time.ZoneId;
-//import java.util.ArrayList;
-//import java.util.Comparator;
-//import java.util.Date;
-//import java.util.List;
-//import java.util.stream.Collectors;
-//
-//
-//
-//@Configuration
-//@EnableScheduling
-//public class OnSaleTask extends ScheduleConfig {
-//
-//    @Autowired
-//    private CollectionRepo collectionRepo;
-//
-//
-//    private List<Collection> collections = new ArrayList();
-//    private Date time;
-//    @Override
-//    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
-//        taskRegistrar.addTriggerTask(() -> {
-//            b:
-//            if (Collections.isEmpty(collections)){
-//                return;
-//            }else {
-//                for (Collection collection : collections) {
-//                    if (collection.getPurchaseTime().isBefore(LocalDateTime.now()) && collection.getPurchaseTime().isBefore(LocalDateTime.now().minusSeconds(2))){
-//                        collectionRepo.updateSubscribeStatus(collection.getId(), SubscribeStatus.ON_SALE);
-//                        time = null;
-//                        collections.remove(0);
-//                        break b;
-//                    }
-//                }
-//            }
-//        }, triggerContext -> {
-//            if (ObjectUtil.isEmpty(time)){
-//                LocalDateTime startTime = LocalDateTime.now();
-//                LocalDateTime endTime = startTime.plusMinutes(4);
-//                List<Collection> collectionList = collectionRepo.findAllByPublishTimeLessThanEqualAndPurchaseTimeGreaterThanEqual(startTime, endTime);
-//                if (Collections.isEmpty(collectionList)) {
-//                    time = Date.from(endTime.minusSeconds(5).atZone(ZoneId.systemDefault()).toInstant());
-//                }else {
-//                    collections = collectionList.stream().sorted(Comparator.comparing(Collection::getPurchaseTime)).collect(Collectors.toList());
-//                    time = Date.from(collections.get(0).getPurchaseTime().minusSeconds(2).atZone(ZoneId.systemDefault()).toInstant());
-//                }
-//            }
-//            return time;
-//        });
-//    }
-//}

+ 0 - 75
src/main/java/com/izouma/nineth/service/scheduledTask/OngoingTask.java

@@ -1,75 +0,0 @@
-//package com.izouma.nineth.service.scheduledTask;
-//
-//import cn.hutool.core.util.ObjectUtil;
-//import com.izouma.nineth.domain.Collection;
-//import com.izouma.nineth.enums.SubscribeStatus;
-//import com.izouma.nineth.repo.CollectionRepo;
-//import io.jsonwebtoken.lang.Collections;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.context.annotation.Configuration;
-//import org.springframework.scheduling.annotation.EnableScheduling;
-//import org.springframework.scheduling.annotation.SchedulingConfigurer;
-//import org.springframework.scheduling.config.ScheduledTaskRegistrar;
-//
-//import java.time.LocalDate;
-//import java.time.LocalDateTime;
-//import java.time.ZoneId;
-//import java.util.ArrayList;
-//import java.util.Comparator;
-//import java.util.Date;
-//import java.util.List;
-//import java.util.stream.Collectors;
-//
-//
-//@Configuration
-//@EnableScheduling
-//public class OngoingTask extends ScheduleConfig {
-//
-//    @Autowired
-//    private CollectionRepo collectionRepo;
-//
-//
-//    private List<Collection> collections = new ArrayList();
-//    private Date time;
-//
-//    @Override
-//    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
-//        taskRegistrar.addTriggerTask(() -> {
-//            b:if (Collections.isEmpty(collections)) {
-//                return;
-//            } else {
-//                for (Collection collection : collections) {
-//                    if (collection.getStartTime().isBefore(LocalDateTime.now()) && collection.getStartTime().isBefore(LocalDateTime.now().minusSeconds(2))) {
-//                        int i = collectionRepo.updateSubscribeStatus(collection.getId(), SubscribeStatus.ONGOING);
-//                        System.out.println("影响的行数为: " + i);
-//                        time = null;
-//                        collections.remove(0);
-//                        break b;
-//                    }
-//                }
-//            }
-//        }, triggerContext -> {
-//            if (ObjectUtil.isEmpty(time)) {
-//                //首先获取当前时间
-////                LocalDateTime startTime = LocalDateTime.now().minusMinutes(1);
-//                LocalDateTime startTime = LocalDateTime.now();
-//                //获取四分钟以后的时间
-//                LocalDateTime endTime = startTime.plusMinutes(6);
-//                //根据开始时间和结束时间去数据库把这两个时间段中 符合的预约发布时间中获取藏品
-//                List<Collection> collectionList = collectionRepo.findAllByStartTimeGreaterThanAndStartTimeLessThanEqual(startTime, endTime);
-//                //判断获取的藏品列表是否为空
-//                if (Collections.isEmpty(collectionList)) {
-////                    return new CronTrigger("0 0/10 * * * ?").nextExecutionTime(triggerContext);
-//                    //藏品列表为空 则设置下次的时间查询为结束时间的前30秒  前10秒  前10
-//                    time = Date.from(endTime.minusSeconds(5).atZone(ZoneId.systemDefault()).toInstant());
-//                }else {
-//                    //藏品列表不为空则将取出来的藏品列表根据预约发布的时间排序放入等待的藏品列表
-//                    collections = collectionList.stream().sorted(Comparator.comparing(Collection::getStartTime)).collect(Collectors.toList());
-//                    time = Date.from(collections.get(0).getStartTime().minusSeconds(2).atZone(ZoneId.systemDefault()).toInstant());
-//                }
-//            }
-//            //取第一个藏品的预约发布时间的前10秒做下次定时任务的时间  换成五秒  两秒
-//            return time;
-//        });
-//    }
-//}

+ 0 - 18
src/main/java/com/izouma/nineth/service/scheduledTask/ScheduleConfig.java

@@ -1,18 +0,0 @@
-//package com.izouma.nineth.service.scheduledTask;
-//
-//
-//import org.springframework.context.annotation.Configuration;
-//import org.springframework.scheduling.annotation.EnableScheduling;
-//import org.springframework.scheduling.annotation.SchedulingConfigurer;
-//import org.springframework.scheduling.config.ScheduledTaskRegistrar;
-//
-//import java.util.concurrent.Executors;
-//
-//@Configuration
-//@EnableScheduling
-//public class ScheduleConfig implements SchedulingConfigurer {
-//    @Override
-//    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
-//        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
-//    }
-//}

+ 0 - 66
src/main/java/com/izouma/nineth/service/scheduledTask/SubscribeEenIngTask.java

@@ -1,66 +0,0 @@
-//package com.izouma.nineth.service.scheduledTask;
-//
-//import cn.hutool.core.util.ObjectUtil;
-//import com.izouma.nineth.config.SchedulingConfig;
-//import com.izouma.nineth.domain.Collection;
-//import com.izouma.nineth.enums.SubscribeStatus;
-//import com.izouma.nineth.repo.CollectionRepo;
-//import io.jsonwebtoken.lang.Collections;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.context.annotation.Configuration;
-//import org.springframework.scheduling.annotation.EnableScheduling;
-//import org.springframework.scheduling.annotation.SchedulingConfigurer;
-//import org.springframework.scheduling.config.ScheduledTaskRegistrar;
-//
-//import java.time.LocalDateTime;
-//import java.time.ZoneId;
-//import java.util.ArrayList;
-//import java.util.Comparator;
-//import java.util.Date;
-//import java.util.List;
-//import java.util.stream.Collectors;
-//
-//
-//
-//@Configuration
-//@EnableScheduling
-//public class SubscribeEenIngTask extends ScheduleConfig {
-//
-//    @Autowired
-//    private CollectionRepo collectionRepo;
-//
-//
-//    private List<Collection> collections = new ArrayList();
-//    private Date time;
-//    @Override
-//    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
-//        taskRegistrar.addTriggerTask(() -> {
-//            b:
-//            if (Collections.isEmpty(collections)){
-//                return;
-//            }else {
-//                for (Collection collection : collections) {
-//                    if (collection.getEndTime().isBefore(LocalDateTime.now()) && collection.getEndTime().isBefore(LocalDateTime.now().minusSeconds(2))){
-//                        collectionRepo.updateSubscribeStatus(collection.getId(), SubscribeStatus.SUBSCRIBE_ENDING);
-//                        time = null;
-//                        collections.remove(0);
-//                        break b;
-//                    }
-//                }
-//            }
-//        }, triggerContext -> {
-//            if (ObjectUtil.isEmpty(time)){
-//                LocalDateTime startTime = LocalDateTime.now();
-//                LocalDateTime endTime = startTime.plusMinutes(4);
-//                List<Collection> collectionList = collectionRepo.findAllByStartTimeLessThanEqualAndEndTimeGreaterThanEqual(startTime, endTime);
-//                if (Collections.isEmpty(collectionList)) {
-//                    time = Date.from(endTime.minusSeconds(5).atZone(ZoneId.systemDefault()).toInstant());
-//                }else {
-//                    collections = collectionList.stream().sorted(Comparator.comparing(Collection::getEndTime)).collect(Collectors.toList());
-//                    time = Date.from(collections.get(0).getEndTime().minusSeconds(2).atZone(ZoneId.systemDefault()).toInstant());
-//                }
-//            }
-//            return time;
-//        });
-//    }
-//}

+ 1 - 1
src/main/java/com/izouma/nineth/service/scheduledTask/SubscribeTask.java

@@ -30,7 +30,7 @@ public class SubscribeTask {
 
     private Map<Long, LocalDateTime> collectionMap = new HashMap<>();
 
-    @Scheduled(cron = "0/5 * * * * ?")
+//    @Scheduled(cron = "0/5 * * * * ?")
     public void subscriberTask() {
         LocalDateTime startTime = LocalDateTime.now();
         LocalDateTime endTime = startTime.plusSeconds(6);

+ 663 - 0
src/main/java/com/izouma/nineth/utils/RestTemplateUtils.java

@@ -0,0 +1,663 @@
+package com.izouma.nineth.utils;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestClientException;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.Map;
+
+
+@Component
+public class RestTemplateUtils {
+
+
+    static RestTemplate restTemplate;
+
+    static {
+        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
+        factory.setReadTimeout(5000);//单位为ms
+        factory.setConnectTimeout(5000);//单位为ms
+        restTemplate = new RestTemplate(factory);
+    }
+
+    // ----------------------------------GET-------------------------------------------------------
+
+    /**
+     * GET请求调用方式
+     *
+     * @param url          请求URL
+     * @param responseType 返回对象类型
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> get(String url, Class<T> responseType) throws RestClientException {
+        return restTemplate.getForEntity(url, responseType);
+    }
+
+    /**
+     * GET请求调用方式
+     *
+     * @param url          请求URL
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,按顺序依次对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> get(String url, Class<T> responseType, Object... uriVariables)
+            throws RestClientException {
+        return restTemplate.getForEntity(url, responseType, uriVariables);
+    }
+
+    /**
+     * GET请求调用方式
+     *
+     * @param url          请求URL
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,与Map中的key对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> get(String url, Class<T> responseType, Map<String, ?> uriVariables)
+            throws RestClientException {
+        return restTemplate.getForEntity(url, responseType, uriVariables);
+    }
+
+    /**
+     * 带请求头的GET请求调用方式
+     *
+     * @param url          请求URL
+     * @param headers      请求头参数
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,按顺序依次对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> get(String url, Map<String, String> headers, Class<T> responseType,
+                                     Object... uriVariables) throws RestClientException {
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setAll(headers);
+        return get(url, httpHeaders, responseType, uriVariables);
+    }
+
+    /**
+     * 带请求头的GET请求调用方式
+     *
+     * @param url          请求URL
+     * @param headers      请求头参数
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,按顺序依次对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> get(String url, HttpHeaders headers, Class<T> responseType, Object... uriVariables)
+            throws RestClientException {
+        HttpEntity<?> requestEntity = new HttpEntity<>(headers);
+        return exchange(url, HttpMethod.GET, requestEntity, responseType, uriVariables);
+    }
+
+    /**
+     * 带请求头的GET请求调用方式
+     *
+     * @param url          请求URL
+     * @param headers      请求头参数
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,与Map中的key对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> get(String url, Map<String, String> headers, Class<T> responseType,
+                                     Map<String, ?> uriVariables) throws RestClientException {
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setAll(headers);
+        return get(url, httpHeaders, responseType, uriVariables);
+    }
+
+    /**
+     * 带请求头的GET请求调用方式
+     *
+     * @param url          请求URL
+     * @param headers      请求头参数
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,与Map中的key对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> get(String url, HttpHeaders headers, Class<T> responseType,
+                                     Map<String, ?> uriVariables) throws RestClientException {
+        HttpEntity<?> requestEntity = new HttpEntity<>(headers);
+        return exchange(url, HttpMethod.GET, requestEntity, responseType, uriVariables);
+    }
+
+    // ----------------------------------POST-------------------------------------------------------
+
+    /**
+     * POST请求调用方式
+     *
+     * @param url          请求URL
+     * @param responseType 返回对象类型
+     * @return
+     */
+    public <T> ResponseEntity<T> post(String url, Class<T> responseType) throws RestClientException {
+        return restTemplate.postForEntity(url, HttpEntity.EMPTY, responseType);
+    }
+
+    /**
+     * POST请求调用方式
+     *
+     * @param url          请求URL
+     * @param requestBody  请求参数体
+     * @param responseType 返回对象类型
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> post(String url, Object requestBody, Class<T> responseType)
+            throws RestClientException {
+        return restTemplate.postForEntity(url, requestBody, responseType);
+    }
+
+    /**
+     * POST请求调用方式
+     *
+     * @param url          请求URL
+     * @param requestBody  请求参数体
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,按顺序依次对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> post(String url, Object requestBody, Class<T> responseType, Object... uriVariables)
+            throws RestClientException {
+        return restTemplate.postForEntity(url, requestBody, responseType, uriVariables);
+    }
+
+    /**
+     * POST请求调用方式
+     *
+     * @param url          请求URL
+     * @param requestBody  请求参数体
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,与Map中的key对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> post(String url, Object requestBody, Class<T> responseType,
+                                      Map<String, ?> uriVariables) throws RestClientException {
+        return restTemplate.postForEntity(url, requestBody, responseType, uriVariables);
+    }
+
+    /**
+     * 带请求头的POST请求调用方式
+     *
+     * @param url          请求URL
+     * @param headers      请求头参数
+     * @param requestBody  请求参数体
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,按顺序依次对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> post(String url, Map<String, String> headers, Object requestBody,
+                                      Class<T> responseType, Object... uriVariables) throws RestClientException {
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setAll(headers);
+        return post(url, httpHeaders, requestBody, responseType, uriVariables);
+    }
+
+    /**
+     * 带请求头的POST请求调用方式
+     *
+     * @param url          请求URL
+     * @param headers      请求头参数
+     * @param requestBody  请求参数体
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,按顺序依次对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> post(String url, HttpHeaders headers, Object requestBody, Class<T> responseType,
+                                      Object... uriVariables) throws RestClientException {
+        HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);
+        return post(url, requestEntity, responseType, uriVariables);
+    }
+
+    /**
+     * 带请求头的POST请求调用方式
+     *
+     * @param url          请求URL
+     * @param headers      请求头参数
+     * @param requestBody  请求参数体
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,与Map中的key对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> post(String url, Map<String, String> headers, Object requestBody,
+                                      Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setAll(headers);
+        return post(url, httpHeaders, requestBody, responseType, uriVariables);
+    }
+
+    /**
+     * 带请求头的POST请求调用方式
+     *
+     * @param url          请求URL
+     * @param headers      请求头参数
+     * @param requestBody  请求参数体
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,与Map中的key对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> post(String url, HttpHeaders headers, Object requestBody, Class<T> responseType,
+                                      Map<String, ?> uriVariables) throws RestClientException {
+        HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);
+        return post(url, requestEntity, responseType, uriVariables);
+    }
+
+    /**
+     * 自定义请求头和请求体的POST请求调用方式
+     *
+     * @param url           请求URL
+     * @param requestEntity 请求头和请求体封装对象
+     * @param responseType  返回对象类型
+     * @param uriVariables  URL中的变量,按顺序依次对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> post(String url, HttpEntity<?> requestEntity, Class<T> responseType,
+                                      Object... uriVariables) throws RestClientException {
+        return restTemplate.exchange(url, HttpMethod.POST, requestEntity, responseType, uriVariables);
+    }
+
+    /**
+     * 自定义请求头和请求体的POST请求调用方式
+     *
+     * @param url           请求URL
+     * @param requestEntity 请求头和请求体封装对象
+     * @param responseType  返回对象类型
+     * @param uriVariables  URL中的变量,与Map中的key对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> post(String url, HttpEntity<?> requestEntity, Class<T> responseType,
+                                      Map<String, ?> uriVariables) throws RestClientException {
+        return restTemplate.exchange(url, HttpMethod.POST, requestEntity, responseType, uriVariables);
+    }
+
+    // ----------------------------------PUT-------------------------------------------------------
+
+    /**
+     * PUT请求调用方式
+     *
+     * @param url          请求URL
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,按顺序依次对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> put(String url, Class<T> responseType, Object... uriVariables)
+            throws RestClientException {
+        return put(url, HttpEntity.EMPTY, responseType, uriVariables);
+    }
+
+    /**
+     * PUT请求调用方式
+     *
+     * @param url          请求URL
+     * @param requestBody  请求参数体
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,按顺序依次对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> put(String url, Object requestBody, Class<T> responseType, Object... uriVariables)
+            throws RestClientException {
+        HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody);
+        return put(url, requestEntity, responseType, uriVariables);
+    }
+
+    /**
+     * PUT请求调用方式
+     *
+     * @param url          请求URL
+     * @param requestBody  请求参数体
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,与Map中的key对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> put(String url, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables)
+            throws RestClientException {
+        HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody);
+        return put(url, requestEntity, responseType, uriVariables);
+    }
+
+    /**
+     * 带请求头的PUT请求调用方式
+     *
+     * @param url          请求URL
+     * @param headers      请求头参数
+     * @param requestBody  请求参数体
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,按顺序依次对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> put(String url, Map<String, String> headers, Object requestBody, Class<T> responseType,
+                                     Object... uriVariables) throws RestClientException {
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setAll(headers);
+        return put(url, httpHeaders, requestBody, responseType, uriVariables);
+    }
+
+    /**
+     * 带请求头的PUT请求调用方式
+     *
+     * @param url          请求URL
+     * @param headers      请求头参数
+     * @param requestBody  请求参数体
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,按顺序依次对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> put(String url, HttpHeaders headers, Object requestBody, Class<T> responseType,
+                                     Object... uriVariables) throws RestClientException {
+        HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);
+        return put(url, requestEntity, responseType, uriVariables);
+    }
+
+    /**
+     * 带请求头的PUT请求调用方式
+     *
+     * @param url          请求URL
+     * @param headers      请求头参数
+     * @param requestBody  请求参数体
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,与Map中的key对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> put(String url, Map<String, String> headers, Object requestBody, Class<T> responseType,
+                                     Map<String, ?> uriVariables) throws RestClientException {
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setAll(headers);
+        return put(url, httpHeaders, requestBody, responseType, uriVariables);
+    }
+
+    /**
+     * 带请求头的PUT请求调用方式
+     *
+     * @param url          请求URL
+     * @param headers      请求头参数
+     * @param requestBody  请求参数体
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,与Map中的key对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> put(String url, HttpHeaders headers, Object requestBody, Class<T> responseType,
+                                     Map<String, ?> uriVariables) throws RestClientException {
+        HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);
+        return put(url, requestEntity, responseType, uriVariables);
+    }
+
+    /**
+     * 自定义请求头和请求体的PUT请求调用方式
+     *
+     * @param url           请求URL
+     * @param requestEntity 请求头和请求体封装对象
+     * @param responseType  返回对象类型
+     * @param uriVariables  URL中的变量,按顺序依次对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> put(String url, HttpEntity<?> requestEntity, Class<T> responseType,
+                                     Object... uriVariables) throws RestClientException {
+        return restTemplate.exchange(url, HttpMethod.PUT, requestEntity, responseType, uriVariables);
+    }
+
+    /**
+     * 自定义请求头和请求体的PUT请求调用方式
+     *
+     * @param url           请求URL
+     * @param requestEntity 请求头和请求体封装对象
+     * @param responseType  返回对象类型
+     * @param uriVariables  URL中的变量,与Map中的key对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> put(String url, HttpEntity<?> requestEntity, Class<T> responseType,
+                                     Map<String, ?> uriVariables) throws RestClientException {
+        return restTemplate.exchange(url, HttpMethod.PUT, requestEntity, responseType, uriVariables);
+    }
+
+    // ----------------------------------DELETE-------------------------------------------------------
+
+    /**
+     * DELETE请求调用方式
+     *
+     * @param url          请求URL
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,按顺序依次对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> delete(String url, Class<T> responseType, Object... uriVariables)
+            throws RestClientException {
+        return delete(url, HttpEntity.EMPTY, responseType, uriVariables);
+    }
+
+    /**
+     * DELETE请求调用方式
+     *
+     * @param url          请求URL
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,与Map中的key对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> delete(String url, Class<T> responseType, Map<String, ?> uriVariables)
+            throws RestClientException {
+        return delete(url, HttpEntity.EMPTY, responseType, uriVariables);
+    }
+
+    /**
+     * DELETE请求调用方式
+     *
+     * @param url          请求URL
+     * @param requestBody  请求参数体
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,按顺序依次对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> delete(String url, Object requestBody, Class<T> responseType, Object... uriVariables)
+            throws RestClientException {
+        HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody);
+        return delete(url, requestEntity, responseType, uriVariables);
+    }
+
+    /**
+     * DELETE请求调用方式
+     *
+     * @param url          请求URL
+     * @param requestBody  请求参数体
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,与Map中的key对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> delete(String url, Object requestBody, Class<T> responseType,
+                                        Map<String, ?> uriVariables) throws RestClientException {
+        HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody);
+        return delete(url, requestEntity, responseType, uriVariables);
+    }
+
+    /**
+     * 带请求头的DELETE请求调用方式
+     *
+     * @param url          请求URL
+     * @param headers      请求头参数
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,按顺序依次对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> delete(String url, Map<String, String> headers, Class<T> responseType,
+                                        Object... uriVariables) throws RestClientException {
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setAll(headers);
+        return delete(url, httpHeaders, responseType, uriVariables);
+    }
+
+    /**
+     * 带请求头的DELETE请求调用方式
+     *
+     * @param url          请求URL
+     * @param headers      请求头参数
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,按顺序依次对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> delete(String url, HttpHeaders headers, Class<T> responseType, Object... uriVariables)
+            throws RestClientException {
+        HttpEntity<Object> requestEntity = new HttpEntity<Object>(headers);
+        return delete(url, requestEntity, responseType, uriVariables);
+    }
+
+    /**
+     * 带请求头的DELETE请求调用方式
+     *
+     * @param url          请求URL
+     * @param headers      请求头参数
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,与Map中的key对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> delete(String url, Map<String, String> headers, Class<T> responseType,
+                                        Map<String, ?> uriVariables) throws RestClientException {
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setAll(headers);
+        return delete(url, httpHeaders, responseType, uriVariables);
+    }
+
+    /**
+     * 带请求头的DELETE请求调用方式
+     *
+     * @param url          请求URL
+     * @param headers      请求头参数
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,与Map中的key对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> delete(String url, HttpHeaders headers, Class<T> responseType,
+                                        Map<String, ?> uriVariables) throws RestClientException {
+        HttpEntity<Object> requestEntity = new HttpEntity<Object>(headers);
+        return delete(url, requestEntity, responseType, uriVariables);
+    }
+
+    /**
+     * 带请求头的DELETE请求调用方式
+     *
+     * @param url          请求URL
+     * @param headers      请求头参数
+     * @param requestBody  请求参数体
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,按顺序依次对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> delete(String url, Map<String, String> headers, Object requestBody,
+                                        Class<T> responseType, Object... uriVariables) throws RestClientException {
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setAll(headers);
+        return delete(url, httpHeaders, requestBody, responseType, uriVariables);
+    }
+
+    /**
+     * 带请求头的DELETE请求调用方式
+     *
+     * @param url          请求URL
+     * @param headers      请求头参数
+     * @param requestBody  请求参数体
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,按顺序依次对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> delete(String url, HttpHeaders headers, Object requestBody, Class<T> responseType,
+                                        Object... uriVariables) throws RestClientException {
+        HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);
+        return delete(url, requestEntity, responseType, uriVariables);
+    }
+
+    /**
+     * 带请求头的DELETE请求调用方式
+     *
+     * @param url          请求URL
+     * @param headers      请求头参数
+     * @param requestBody  请求参数体
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,与Map中的key对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> delete(String url, Map<String, String> headers, Object requestBody,
+                                        Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setAll(headers);
+        return delete(url, httpHeaders, requestBody, responseType, uriVariables);
+    }
+
+    /**
+     * 带请求头的DELETE请求调用方式
+     *
+     * @param url          请求URL
+     * @param headers      请求头参数
+     * @param requestBody  请求参数体
+     * @param responseType 返回对象类型
+     * @param uriVariables URL中的变量,与Map中的key对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> delete(String url, HttpHeaders headers, Object requestBody, Class<T> responseType,
+                                        Map<String, ?> uriVariables) throws RestClientException {
+        HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);
+        return delete(url, requestEntity, responseType, uriVariables);
+    }
+
+    /**
+     * 自定义请求头和请求体的DELETE请求调用方式
+     *
+     * @param url           请求URL
+     * @param requestEntity 请求头和请求体封装对象
+     * @param responseType  返回对象类型
+     * @param uriVariables  URL中的变量,按顺序依次对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> delete(String url, HttpEntity<?> requestEntity, Class<T> responseType,
+                                        Object... uriVariables) throws RestClientException {
+        return restTemplate.exchange(url, HttpMethod.DELETE, requestEntity, responseType, uriVariables);
+    }
+
+    /**
+     * 自定义请求头和请求体的DELETE请求调用方式
+     *
+     * @param url           请求URL
+     * @param requestEntity 请求头和请求体封装对象
+     * @param responseType  返回对象类型
+     * @param uriVariables  URL中的变量,与Map中的key对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> delete(String url, HttpEntity<?> requestEntity, Class<T> responseType,
+                                        Map<String, ?> uriVariables) throws RestClientException {
+        return restTemplate.exchange(url, HttpMethod.DELETE, requestEntity, responseType, uriVariables);
+    }
+
+    // ----------------------------------通用方法-------------------------------------------------------
+
+    /**
+     * 通用调用方式
+     *
+     * @param url           请求URL
+     * @param method        请求方法类型
+     * @param requestEntity 请求头和请求体封装对象
+     * @param responseType  返回对象类型
+     * @param uriVariables  URL中的变量,按顺序依次对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity,
+                                          Class<T> responseType, Object... uriVariables) throws RestClientException {
+        return restTemplate.exchange(url, method, requestEntity, responseType, uriVariables);
+    }
+
+    /**
+     * 通用调用方式
+     *
+     * @param url           请求URL
+     * @param method        请求方法类型
+     * @param requestEntity 请求头和请求体封装对象
+     * @param responseType  返回对象类型
+     * @param uriVariables  URL中的变量,与Map中的key对应
+     * @return ResponseEntity 响应对象封装类
+     */
+    public <T> ResponseEntity<T> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity,
+                                          Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {
+        return restTemplate.exchange(url, method, requestEntity, responseType, uriVariables);
+    }
+
+}

+ 86 - 88
src/main/vue/package-lock.json

@@ -1879,6 +1879,70 @@
           "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
           "dev": true
         },
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true,
+          "optional": true
+        },
+        "emojis-list": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+          "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+          "dev": true,
+          "optional": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true,
+          "optional": true
+        },
+        "loader-utils": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
+          "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        },
         "minimist": {
           "version": "1.2.5",
           "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
@@ -1893,6 +1957,28 @@
           "requires": {
             "minipass": "^3.1.1"
           }
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "vue-loader-v16": {
+          "version": "npm:vue-loader@16.8.3",
+          "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
+          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chalk": "^4.1.0",
+            "hash-sum": "^2.0.0",
+            "loader-utils": "^2.0.0"
+          }
         }
       }
     },
@@ -11318,94 +11404,6 @@
         }
       }
     },
-    "vue-loader-v16": {
-      "version": "npm:vue-loader@16.8.3",
-      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
-      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "chalk": "^4.1.0",
-        "hash-sum": "^2.0.0",
-        "loader-utils": "^2.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true,
-          "optional": true
-        },
-        "emojis-list": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
-          "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
-          "dev": true,
-          "optional": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true,
-          "optional": true
-        },
-        "loader-utils": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
-          "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
     "vue-router": {
       "version": "3.5.3",
       "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.3.tgz",