Compare commits
	
		
			3 Commits
		
	
	
		
			200b1601aa
			...
			d040250343
		
	
	| Author | SHA1 | Date | 
|---|---|---|
| 
							
							
								
								 | 
						d040250343 | |
| 
							
							
								
								 | 
						23c53ee068 | |
| 
							
							
								
								 | 
						c5262c92b8 | 
							
								
								
									
										7
									
								
								pom.xml
								
								
								
								
							
							
						
						
									
										7
									
								
								pom.xml
								
								
								
								
							| 
						 | 
				
			
			@ -319,7 +319,12 @@
 | 
			
		|||
			<groupId>org.springframework.boot</groupId>
 | 
			
		||||
			<artifactId>spring-boot-starter-amqp</artifactId>
 | 
			
		||||
		</dependency>
 | 
			
		||||
	</dependencies>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.alibaba.fastjson2</groupId>
 | 
			
		||||
            <artifactId>fastjson2</artifactId>
 | 
			
		||||
            <version>2.0.9</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
	<build>
 | 
			
		||||
		<plugins>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,6 +2,7 @@ package com.bonus.nxdt.energy.manager.config;
 | 
			
		|||
 | 
			
		||||
import com.bonus.nxdt.energy.manager.filter.TokenFilter;
 | 
			
		||||
import com.bonus.nxdt.energy.manager.filter.VerifyFilter;
 | 
			
		||||
import com.bonus.nxdt.energy.manager.service.impl.UserDetailsServiceImpl;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Value;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
| 
						 | 
				
			
			@ -37,6 +38,10 @@ public class BnsSecurityConfig extends WebSecurityConfigurerAdapter {
 | 
			
		|||
 | 
			
		||||
	@Autowired
 | 
			
		||||
	private UserDetailsService userDetailsService;
 | 
			
		||||
 | 
			
		||||
	@Autowired
 | 
			
		||||
	private  UserDetailsServiceImpl service;
 | 
			
		||||
 | 
			
		||||
	@Autowired
 | 
			
		||||
	private TokenFilter tokenFilter;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -77,6 +82,7 @@ public class BnsSecurityConfig extends WebSecurityConfigurerAdapter {
 | 
			
		|||
 | 
			
		||||
	@Override
 | 
			
		||||
	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
 | 
			
		||||
		auth.authenticationProvider(new DecodePwdAuthenticationProvider(service));
 | 
			
		||||
		auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,42 @@
 | 
			
		|||
package com.bonus.nxdt.energy.manager.config;
 | 
			
		||||
 | 
			
		||||
import com.bonus.nxdt.energy.manager.service.impl.UserDetailsServiceImpl;
 | 
			
		||||
import com.bonus.nxdt.energy.manager.utils.AesCbcUtils;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.security.authentication.BadCredentialsException;
 | 
			
		||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 | 
			
		||||
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
 | 
			
		||||
import org.springframework.security.core.AuthenticationException;
 | 
			
		||||
import org.springframework.security.core.userdetails.UserDetails;
 | 
			
		||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 密码自定义校验
 | 
			
		||||
 */
 | 
			
		||||
@Slf4j
 | 
			
		||||
public class DecodePwdAuthenticationProvider extends DaoAuthenticationProvider {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public DecodePwdAuthenticationProvider(UserDetailsServiceImpl userDetailsService){
 | 
			
		||||
        setUserDetailsService(userDetailsService);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) throws AuthenticationException {
 | 
			
		||||
        if (authentication.getCredentials() == null) {
 | 
			
		||||
            this.logger.debug("Authentication failed: no credentials provided");
 | 
			
		||||
            throw new BadCredentialsException(this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"));
 | 
			
		||||
        } else {
 | 
			
		||||
            String presentedPassword = authentication.getCredentials().toString();
 | 
			
		||||
            presentedPassword= AesCbcUtils.decrypt(presentedPassword);
 | 
			
		||||
            BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
 | 
			
		||||
            if (!passwordEncoder.matches(presentedPassword, userDetails.getPassword())) {
 | 
			
		||||
                this.logger.debug("Authentication failed: password does not match stored value");
 | 
			
		||||
                throw new BadCredentialsException(this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,13 @@
 | 
			
		|||
package com.bonus.nxdt.energy.manager.config.aes;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
import java.lang.annotation.Target;
 | 
			
		||||
 | 
			
		||||
@Target(ElementType.METHOD)
 | 
			
		||||
@Retention(RetentionPolicy.RUNTIME)
 | 
			
		||||
public @interface DecryptAndVerify {
 | 
			
		||||
    /** 解密后的参数类型 */
 | 
			
		||||
    Class<?> decryptedClass();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,50 @@
 | 
			
		|||
package com.bonus.nxdt.energy.manager.config.aes;
 | 
			
		||||
 | 
			
		||||
import com.alibaba.fastjson.JSON;
 | 
			
		||||
import com.bonus.nxdt.energy.manager.utils.AesCbcUtils;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.aspectj.lang.ProceedingJoinPoint;
 | 
			
		||||
import org.aspectj.lang.annotation.Around;
 | 
			
		||||
import org.aspectj.lang.annotation.Aspect;
 | 
			
		||||
import org.aspectj.lang.annotation.Pointcut;
 | 
			
		||||
import org.aspectj.lang.reflect.MethodSignature;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@Slf4j
 | 
			
		||||
@Aspect
 | 
			
		||||
@Component
 | 
			
		||||
public class DecryptAndVerifyAspect {
 | 
			
		||||
    @Pointcut("@annotation(com.bonus.nxdt.energy.manager.config.aes.DecryptAndVerify)")
 | 
			
		||||
    public void pointCut() {}
 | 
			
		||||
    @Around("pointCut()")
 | 
			
		||||
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
 | 
			
		||||
        Object[] args = joinPoint.getArgs();
 | 
			
		||||
        if (args == null || args.length == 0) {
 | 
			
		||||
            throw new DecryptAndVerifyException(joinPoint.getSignature().getName() + ",参数为空");
 | 
			
		||||
        }
 | 
			
		||||
        EncryptedReq encryptedReq = null;
 | 
			
		||||
        for (Object obj : args) {
 | 
			
		||||
            if (obj instanceof EncryptedReq) {
 | 
			
		||||
                encryptedReq = (EncryptedReq) obj;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (encryptedReq == null) {
 | 
			
		||||
          //  throw new DecryptAndVerifyException(joinPoint.getSignature().getName() + ",参数中无待解密类");
 | 
			
		||||
        }
 | 
			
		||||
        String decryptedData = decryptAndVerify(encryptedReq);
 | 
			
		||||
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
 | 
			
		||||
        DecryptAndVerify annotation = methodSignature.getMethod().getAnnotation(DecryptAndVerify.class);
 | 
			
		||||
        if (annotation == null || annotation.decryptedClass() == null) {
 | 
			
		||||
            throw new DecryptAndVerifyException(joinPoint.getSignature().getName() + ",未指定解密类型");
 | 
			
		||||
        }
 | 
			
		||||
        encryptedReq.setData(JSON.parseObject(decryptedData, annotation.decryptedClass()));
 | 
			
		||||
        return joinPoint.proceed();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private String decryptAndVerify(EncryptedReq encryptedReq) {
 | 
			
		||||
       return  AesCbcUtils.decrypt(encryptedReq.getEncryptedData());
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
package com.bonus.nxdt.energy.manager.config.aes;
 | 
			
		||||
 | 
			
		||||
public class DecryptAndVerifyException extends RuntimeException {
 | 
			
		||||
 | 
			
		||||
    public DecryptAndVerifyException(String message) {
 | 
			
		||||
        super(message);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,19 @@
 | 
			
		|||
package com.bonus.nxdt.energy.manager.config.aes;
 | 
			
		||||
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
@Data
 | 
			
		||||
public class EncryptedReq<T> {
 | 
			
		||||
    /** 签名 */
 | 
			
		||||
 | 
			
		||||
    private String sign;
 | 
			
		||||
    /** 加密请求数据 */
 | 
			
		||||
 | 
			
		||||
    private String encryptedData;
 | 
			
		||||
    /** 原始请求数据(解密后回填到对象) */
 | 
			
		||||
    private T data;
 | 
			
		||||
    /** 请求的时间戳 */
 | 
			
		||||
 | 
			
		||||
    private Long timestamp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -5,6 +5,7 @@ import com.bonus.nxdt.energy.manager.entity.LoginUser;
 | 
			
		|||
import com.bonus.nxdt.energy.manager.model.Permission;
 | 
			
		||||
import com.bonus.nxdt.energy.manager.model.SysUser;
 | 
			
		||||
import com.bonus.nxdt.energy.manager.service.UserService;
 | 
			
		||||
import com.bonus.nxdt.energy.manager.utils.AesCbcUtils;
 | 
			
		||||
import org.springframework.beans.BeanUtils;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException;
 | 
			
		||||
| 
						 | 
				
			
			@ -29,8 +30,11 @@ public class UserDetailsServiceImpl implements UserDetailsService {
 | 
			
		|||
	@Autowired
 | 
			
		||||
	private PermissionDao permissionDao;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
 | 
			
		||||
		username= AesCbcUtils.decrypt(username);
 | 
			
		||||
		SysUser sysUser = userService.getUser(username);
 | 
			
		||||
		if (sysUser == null) {
 | 
			
		||||
			throw new AuthenticationCredentialsNotFoundException("用户名不存在");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,118 @@
 | 
			
		|||
package com.bonus.nxdt.energy.manager.utils;
 | 
			
		||||
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.apache.commons.codec.binary.Base64;
 | 
			
		||||
import org.bouncycastle.jce.provider.BouncyCastleProvider;
 | 
			
		||||
 | 
			
		||||
import javax.crypto.Cipher;
 | 
			
		||||
import javax.crypto.spec.IvParameterSpec;
 | 
			
		||||
import javax.crypto.spec.SecretKeySpec;
 | 
			
		||||
import java.security.Security;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * AES加密工具类
 | 
			
		||||
 * @author HeiZi
 | 
			
		||||
 */
 | 
			
		||||
@Slf4j
 | 
			
		||||
public class AesCbcUtils {
 | 
			
		||||
    //使用AES-256-CBC加密模式,key需要为16位,key和iv可以相同!
 | 
			
		||||
    /**
 | 
			
		||||
     * 密钥算法
 | 
			
		||||
     */
 | 
			
		||||
    private static final String KEY_ALGORITHM = "AES";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 加密/解密算法 / 工作模式 / 填充方式
 | 
			
		||||
     * Java 6支持PKCS5Padding填充方式
 | 
			
		||||
     * Bouncy Castle支持PKCS7Padding填充方式
 | 
			
		||||
     */
 | 
			
		||||
    private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS7Padding";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 偏移量,只有CBC模式才需要
 | 
			
		||||
     */
 | 
			
		||||
    private final static String IV_PARAMETER = "1234567812345678";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * AES要求密钥长度为128位或192位或256位,java默认限制AES密钥长度最多128位
 | 
			
		||||
     */
 | 
			
		||||
    public static String sKey = "zhgd@bonus@zhgd@bonus@1234567890";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 编码格式导出
 | 
			
		||||
     */
 | 
			
		||||
    public static final String ENCODING = "utf-8";
 | 
			
		||||
 | 
			
		||||
    static {
 | 
			
		||||
        //如果是PKCS7Padding填充方式,则必须加上下面这行
 | 
			
		||||
        Security.addProvider(new BouncyCastleProvider());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * AES加密
 | 
			
		||||
     *(CBC模式)
 | 
			
		||||
     * @param source 源字符串
 | 
			
		||||
     * @param
 | 
			
		||||
     * @throws Exception
 | 
			
		||||
     * @return 加密后的密文
 | 
			
		||||
     */
 | 
			
		||||
    public static String encrypt(String source )   {
 | 
			
		||||
        try{
 | 
			
		||||
            String key=sKey;
 | 
			
		||||
            byte[] sourceBytes = source.getBytes(ENCODING);
 | 
			
		||||
            byte[] keyBytes = key.getBytes(ENCODING);
 | 
			
		||||
            Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM, "BC");
 | 
			
		||||
            IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(ENCODING));
 | 
			
		||||
            cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(keyBytes, KEY_ALGORITHM), iv);
 | 
			
		||||
            byte[] decrypted = cipher.doFinal(sourceBytes);
 | 
			
		||||
            return Base64.encodeBase64String(decrypted);
 | 
			
		||||
        }catch (Exception e){
 | 
			
		||||
            log.error(e.toString(),e);
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void main(String[] args) {
 | 
			
		||||
    //    String  json="";
 | 
			
		||||
 | 
			
		||||
        String  json="{\"username\":\"guest\",\"password\":\"admin@123\"}";
 | 
			
		||||
        String data=encrypt(json);
 | 
			
		||||
        System.err.println(data);
 | 
			
		||||
        String jm=decrypt("2rrMRoOfoo9n17MTPSRTidwgXeatSLxWFQfPNSCUJdHvqT58extTi87f1e5LJS0DdMcjzIdtFoHvur9gP7desQ==");
 | 
			
		||||
        String jiemi=decrypt(data);
 | 
			
		||||
        System.err.println(jm);
 | 
			
		||||
        System.err.println(jiemi);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * AES解密
 | 
			
		||||
     *(CBC模式)
 | 
			
		||||
     * @param data 加密后的密文
 | 
			
		||||
     * @param
 | 
			
		||||
     * @throws Exception
 | 
			
		||||
     * @return 源字符串
 | 
			
		||||
     */
 | 
			
		||||
    public static String decrypt(String data)  {
 | 
			
		||||
        try{
 | 
			
		||||
            String  encryptStr="";
 | 
			
		||||
            if(StringHelper.isNotEmpty(data)){
 | 
			
		||||
                encryptStr=data.replace(" ","+");
 | 
			
		||||
            }
 | 
			
		||||
            String key=sKey;
 | 
			
		||||
            byte[] sourceBytes = Base64.decodeBase64(encryptStr);
 | 
			
		||||
            byte[] keyBytes = key.getBytes(ENCODING);
 | 
			
		||||
            Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM, "BC");
 | 
			
		||||
            IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(ENCODING));
 | 
			
		||||
            cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(keyBytes, KEY_ALGORITHM), iv);
 | 
			
		||||
            byte[] decoded = cipher.doFinal(sourceBytes);
 | 
			
		||||
            return new String(decoded, ENCODING);
 | 
			
		||||
        }catch (Exception e){
 | 
			
		||||
            log.info("------------------->请求加密参数不正确");
 | 
			
		||||
            log.error(e.toString(),e);
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -6,25 +6,26 @@ import com.alibaba.fastjson.JSONObject;
 | 
			
		|||
import com.bonus.nxdt.energy.GetResponsibleFor.entity.ApprovalProcessBean;
 | 
			
		||||
import com.bonus.nxdt.energy.GetResponsibleFor.service.GetResponsibleForService;
 | 
			
		||||
import com.bonus.nxdt.energy.constrator.entity.*;
 | 
			
		||||
import com.bonus.nxdt.energy.manager.config.MessageSender;
 | 
			
		||||
import com.bonus.nxdt.energy.manager.config.RabbitMQConfig;
 | 
			
		||||
import com.bonus.nxdt.energy.manager.config.aes.DecryptAndVerify;
 | 
			
		||||
import com.bonus.nxdt.energy.manager.config.aes.EncryptedReq;
 | 
			
		||||
import com.bonus.nxdt.energy.manager.table.PageTableHandler;
 | 
			
		||||
import com.bonus.nxdt.energy.manager.table.PageTableRequest;
 | 
			
		||||
import com.bonus.nxdt.energy.manager.table.PageTableResponse;
 | 
			
		||||
import com.bonus.nxdt.energy.manager.utils.AjaxRes;
 | 
			
		||||
import com.bonus.nxdt.energy.manager.utils.DateTimeHelper;
 | 
			
		||||
import com.bonus.nxdt.energy.manager.utils.GlobalConst;
 | 
			
		||||
import com.bonus.nxdt.energy.manager.utils.StringHelper;
 | 
			
		||||
import com.bonus.nxdt.energy.material.entity.FileUpBean;
 | 
			
		||||
import com.bonus.nxdt.energy.material.entity.HistoryBean;
 | 
			
		||||
import com.bonus.nxdt.energy.material.entity.MaterialBean;
 | 
			
		||||
import com.bonus.nxdt.energy.material.entity.PersonBean;
 | 
			
		||||
import com.bonus.nxdt.energy.manager.utils.*;
 | 
			
		||||
import com.bonus.nxdt.energy.material.entity.*;
 | 
			
		||||
import com.bonus.nxdt.energy.material.service.MaterialUploadService;
 | 
			
		||||
import com.bonus.nxdt.energy.newSubApply.dao.NewsConsDao;
 | 
			
		||||
import com.bonus.nxdt.energy.newSubApply.entity.SubEntranceBean;
 | 
			
		||||
import com.bonus.nxdt.energy.newSubApply.service.NewconsService;
 | 
			
		||||
import com.rabbitmq.client.Channel;
 | 
			
		||||
import com.rabbitmq.client.Connection;
 | 
			
		||||
import com.rabbitmq.client.ConnectionFactory;
 | 
			
		||||
import io.swagger.annotations.Api;
 | 
			
		||||
import io.swagger.annotations.ApiOperation;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
import org.springframework.amqp.core.AmqpTemplate;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.web.bind.annotation.*;
 | 
			
		||||
import org.springframework.web.multipart.MultipartFile;
 | 
			
		||||
| 
						 | 
				
			
			@ -54,6 +55,64 @@ public class MaterialUploadController {
 | 
			
		|||
    @Resource
 | 
			
		||||
    private NewsConsDao newsConsDao;
 | 
			
		||||
 | 
			
		||||
    // 注入RabbitMQ操作模板
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private AmqpTemplate amqpTemplate;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private MessageSender messageSender;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//    @SupportFieldEncrypt
 | 
			
		||||
    @GetMapping("/encrypt")
 | 
			
		||||
    public FieldAopDemo encrypt(FieldAopDemo demo){
 | 
			
		||||
        System.out.println(demo);
 | 
			
		||||
        String ss = AesCbcUtils.encrypt("{\"name\":\"hellow\",\"id\":\"hellow\",\"sex\":\"hellow\"}");
 | 
			
		||||
        System.out.println("22"+ss);
 | 
			
		||||
        return demo;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @DecryptAndVerify(decryptedClass = FieldAopDemo.class)//加解密统一管理
 | 
			
		||||
    @GetMapping("/decrypt")
 | 
			
		||||
    public FieldAopDemo decrypt(EncryptedReq<FieldAopDemo> demo){
 | 
			
		||||
        System.out.println("11"+demo);
 | 
			
		||||
//        String name = demo.getName();
 | 
			
		||||
//        String encrypt = AesCbcUtils.decrypt(name);
 | 
			
		||||
//        System.out.println(encrypt);
 | 
			
		||||
//        demo.setName(encrypt);
 | 
			
		||||
        return demo.getData();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 测试
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @RequestMapping(value = "sendMes", method = RequestMethod.POST)
 | 
			
		||||
    @ResponseBody
 | 
			
		||||
    public String sendMes() throws Exception{
 | 
			
		||||
       //amqpTemplate.convertAndSend("test", RabbitMQConfig.bindingKey,"测试消息发送成功!");
 | 
			
		||||
       // messageSender.sendMessage(RabbitMQConfig.bindingKey,"测试消息发送成功");
 | 
			
		||||
        ConnectionFactory connectionFactory = new ConnectionFactory();
 | 
			
		||||
        connectionFactory.setHost("127.0.0.1");
 | 
			
		||||
        connectionFactory.setPort(5672);
 | 
			
		||||
        connectionFactory.setVirtualHost("/bonus");
 | 
			
		||||
        connectionFactory.setUsername("bonus");
 | 
			
		||||
        connectionFactory.setPassword("bonus@admin");
 | 
			
		||||
        //2 创建Connection
 | 
			
		||||
        Connection connection = connectionFactory.newConnection();
 | 
			
		||||
        //3 创建Channel
 | 
			
		||||
        Channel channel = connection.createChannel();
 | 
			
		||||
        //4 声明
 | 
			
		||||
        String exchangeName = "topicExchange";
 | 
			
		||||
        //定义三个routingKey 其中第三个我们再消费者中故意匹配不成功
 | 
			
		||||
        //5 发送
 | 
			
		||||
        String msg = "Test Topic Exchange Message";
 | 
			
		||||
        channel.basicPublish(exchangeName, RabbitMQConfig.bindingKey , null , msg.getBytes());
 | 
			
		||||
        channel.close();
 | 
			
		||||
        connection.close();
 | 
			
		||||
        return "发送消息";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @RequestMapping(value = "getWorkType", method = RequestMethod.POST)
 | 
			
		||||
    @ResponseBody
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
package com.bonus.nxdt.energy.material.entity;
 | 
			
		||||
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author xliu
 | 
			
		||||
 * @date 2024/6/11 11:21
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
public class FieldAopDemo {
 | 
			
		||||
    private String name;
 | 
			
		||||
 | 
			
		||||
    private String id;
 | 
			
		||||
 | 
			
		||||
    private String sex;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1188,7 +1188,7 @@ public class New_SubCheckManageServiceImpl implements New_SubCheckManageService
 | 
			
		|||
                checkManageDao.insertCheckMsg(nextId, msg, o.getAuditStatus(), o.getMsgId(), o.getProId());
 | 
			
		||||
                listAfter.forEach(i ->  {
 | 
			
		||||
                    String msg1 = "【" + o.getContractorName() + "-" + o.getNewDataMsg() + "】" + loginName + "(" + phone + ") 将" + o.getNewDataMsg() + "材料提交至 -" + i.getValue() + "- 处,请注意及时审核";
 | 
			
		||||
//                    setPhoneMsg(i.getPhone(), msg1);
 | 
			
		||||
                    setPhoneMsg(i.getPhone(), msg1);
 | 
			
		||||
                });
 | 
			
		||||
            } else {
 | 
			
		||||
                //终审
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,7 +15,7 @@ import javax.annotation.Resource;
 | 
			
		|||
 * @date 2023-01-30 17:30:00
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
//@EnableScheduling
 | 
			
		||||
@EnableScheduling
 | 
			
		||||
@Slf4j
 | 
			
		||||
public class BallStatusPushTask {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -28,7 +28,7 @@ public class BallStatusPushTask {
 | 
			
		|||
     * 球机在离线状态更新定时器
 | 
			
		||||
     * 60S执行一次
 | 
			
		||||
     */
 | 
			
		||||
    @Scheduled(fixedRate = 1000*60)
 | 
			
		||||
    @Scheduled(fixedRate = 1000*60*5)
 | 
			
		||||
    @Async
 | 
			
		||||
    public void ballStatusTask(){
 | 
			
		||||
        log.info("--------球机在离线状态更新定时器启动--------");
 | 
			
		||||
| 
						 | 
				
			
			@ -38,21 +38,21 @@ public class BallStatusPushTask {
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
    // 项目负责人黑名单
 | 
			
		||||
    @Scheduled(fixedRate = 1000*60)
 | 
			
		||||
    @Scheduled(fixedRate = 1000*60*60*24)
 | 
			
		||||
    public int addProBlackList() {
 | 
			
		||||
        log.info("--------项目负责人黑名单--------");
 | 
			
		||||
        return consBlackService.addProBlackList();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //承包商黑名单
 | 
			
		||||
    @Scheduled(fixedRate = 1000*60)
 | 
			
		||||
    @Scheduled(fixedRate = 1000*60*60*25)
 | 
			
		||||
    public int addConsBlackList() {
 | 
			
		||||
        log.info("--------承包商黑名单--------");
 | 
			
		||||
        return consBlackService.addConsBlackList();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 施工人员黑名单
 | 
			
		||||
    @Scheduled(fixedRate = 1000*60)
 | 
			
		||||
    @Scheduled(fixedRate = 1000*60*60*26)
 | 
			
		||||
    public int addSgBlackList() {
 | 
			
		||||
        log.info("--------施工人员黑名单--------");
 | 
			
		||||
        return consBlackService.addSgBlackList();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,71 @@
 | 
			
		|||
!function(t,n){"object"==typeof exports?module.exports=exports=n():"function"==typeof define&&define.amd?define([],n):t.CryptoJS=n()}(this,function(){var t=t||function(t,n){var i=Object.create||function(){function t(){}return function(n){var i;return t.prototype=n,i=new t,t.prototype=null,i}}(),e={},r=e.lib={},o=r.Base=function(){return{extend:function(t){var n=i(this);return t&&n.mixIn(t),n.hasOwnProperty("init")&&this.init!==n.init||(n.init=function(){n.$super.init.apply(this,arguments)}),n.init.prototype=n,n.$super=this,n},create:function(){var t=this.extend();return t.init.apply(t,arguments),t},init:function(){},mixIn:function(t){for(var n in t)t.hasOwnProperty(n)&&(this[n]=t[n]);t.hasOwnProperty("toString")&&(this.toString=t.toString)},clone:function(){return this.init.prototype.extend(this)}}}(),s=r.WordArray=o.extend({init:function(t,i){t=this.words=t||[],i!=n?this.sigBytes=i:this.sigBytes=4*t.length},toString:function(t){return(t||c).stringify(this)},concat:function(t){var n=this.words,i=t.words,e=this.sigBytes,r=t.sigBytes;if(this.clamp(),e%4)for(var o=0;o<r;o++){var s=i[o>>>2]>>>24-o%4*8&255;n[e+o>>>2]|=s<<24-(e+o)%4*8}else for(var o=0;o<r;o+=4)n[e+o>>>2]=i[o>>>2];return this.sigBytes+=r,this},clamp:function(){var n=this.words,i=this.sigBytes;n[i>>>2]&=4294967295<<32-i%4*8,n.length=t.ceil(i/4)},clone:function(){var t=o.clone.call(this);return t.words=this.words.slice(0),t},random:function(n){for(var i,e=[],r=function(n){var n=n,i=987654321,e=4294967295;return function(){i=36969*(65535&i)+(i>>16)&e,n=18e3*(65535&n)+(n>>16)&e;var r=(i<<16)+n&e;return r/=4294967296,r+=.5,r*(t.random()>.5?1:-1)}},o=0;o<n;o+=4){var a=r(4294967296*(i||t.random()));i=987654071*a(),e.push(4294967296*a()|0)}return new s.init(e,n)}}),a=e.enc={},c=a.Hex={stringify:function(t){for(var n=t.words,i=t.sigBytes,e=[],r=0;r<i;r++){var o=n[r>>>2]>>>24-r%4*8&255;e.push((o>>>4).toString(16)),e.push((15&o).toString(16))}return e.join("")},parse:function(t){for(var n=t.length,i=[],e=0;e<n;e+=2)i[e>>>3]|=parseInt(t.substr(e,2),16)<<24-e%8*4;return new s.init(i,n/2)}},u=a.Latin1={stringify:function(t){for(var n=t.words,i=t.sigBytes,e=[],r=0;r<i;r++){var o=n[r>>>2]>>>24-r%4*8&255;e.push(String.fromCharCode(o))}return e.join("")},parse:function(t){for(var n=t.length,i=[],e=0;e<n;e++)i[e>>>2]|=(255&t.charCodeAt(e))<<24-e%4*8;return new s.init(i,n)}},f=a.Utf8={stringify:function(t){try{return decodeURIComponent(escape(u.stringify(t)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(t){return u.parse(unescape(encodeURIComponent(t)))}},h=r.BufferedBlockAlgorithm=o.extend({reset:function(){this._data=new s.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=f.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(n){var i=this._data,e=i.words,r=i.sigBytes,o=this.blockSize,a=4*o,c=r/a;c=n?t.ceil(c):t.max((0|c)-this._minBufferSize,0);var u=c*o,f=t.min(4*u,r);if(u){for(var h=0;h<u;h+=o)this._doProcessBlock(e,h);var p=e.splice(0,u);i.sigBytes-=f}return new s.init(p,f)},clone:function(){var t=o.clone.call(this);return t._data=this._data.clone(),t},_minBufferSize:0}),p=(r.Hasher=h.extend({cfg:o.extend(),init:function(t){this.cfg=this.cfg.extend(t),this.reset()},reset:function(){h.reset.call(this),this._doReset()},update:function(t){return this._append(t),this._process(),this},finalize:function(t){t&&this._append(t);var n=this._doFinalize();return n},blockSize:16,_createHelper:function(t){return function(n,i){return new t.init(i).finalize(n)}},_createHmacHelper:function(t){return function(n,i){return new p.HMAC.init(t,i).finalize(n)}}}),e.algo={});return e}(Math);return t});
 | 
			
		||||
//# sourceMappingURL=core.min.js.map
 | 
			
		||||
!function(e,t,i){"object"==typeof exports?module.exports=exports=t(require("./core.min"),require("./sha1.min"),require("./hmac.min")):"function"==typeof define&&define.amd?define(["./core.min","./sha1.min","./hmac.min"],t):t(e.CryptoJS)}(this,function(e){return function(){var t=e,i=t.lib,r=i.Base,n=i.WordArray,o=t.algo,a=o.MD5,c=o.EvpKDF=r.extend({cfg:r.extend({keySize:4,hasher:a,iterations:1}),init:function(e){this.cfg=this.cfg.extend(e)},compute:function(e,t){for(var i=this.cfg,r=i.hasher.create(),o=n.create(),a=o.words,c=i.keySize,f=i.iterations;a.length<c;){s&&r.update(s);var s=r.update(e).finalize(t);r.reset();for(var u=1;u<f;u++)s=r.finalize(s),r.reset();o.concat(s)}return o.sigBytes=4*c,o}});t.EvpKDF=function(e,t,i){return c.create(i).compute(e,t)}}(),e.EvpKDF});
 | 
			
		||||
//# sourceMappingURL=evpkdf.min.js.map
 | 
			
		||||
!function(r,e){"object"==typeof exports?module.exports=exports=e(require("./core.min")):"function"==typeof define&&define.amd?define(["./core.min"],e):e(r.CryptoJS)}(this,function(r){return function(){function e(r,e,t){for(var n=[],i=0,o=0;o<e;o++)if(o%4){var f=t[r.charCodeAt(o-1)]<<o%4*2,c=t[r.charCodeAt(o)]>>>6-o%4*2;n[i>>>2]|=(f|c)<<24-i%4*8,i++}return a.create(n,i)}var t=r,n=t.lib,a=n.WordArray,i=t.enc;i.Base64={stringify:function(r){var e=r.words,t=r.sigBytes,n=this._map;r.clamp();for(var a=[],i=0;i<t;i+=3)for(var o=e[i>>>2]>>>24-i%4*8&255,f=e[i+1>>>2]>>>24-(i+1)%4*8&255,c=e[i+2>>>2]>>>24-(i+2)%4*8&255,s=o<<16|f<<8|c,h=0;h<4&&i+.75*h<t;h++)a.push(n.charAt(s>>>6*(3-h)&63));var p=n.charAt(64);if(p)for(;a.length%4;)a.push(p);return a.join("")},parse:function(r){var t=r.length,n=this._map,a=this._reverseMap;if(!a){a=this._reverseMap=[];for(var i=0;i<n.length;i++)a[n.charCodeAt(i)]=i}var o=n.charAt(64);if(o){var f=r.indexOf(o);f!==-1&&(t=f)}return e(r,t,a)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}}(),r.enc.Base64});
 | 
			
		||||
//# sourceMappingURL=enc-base64.min.js.map
 | 
			
		||||
!function(e,t,r){"object"==typeof exports?module.exports=exports=t(require("./core.min"),require("./evpkdf.min")):"function"==typeof define&&define.amd?define(["./core.min","./evpkdf.min"],t):t(e.CryptoJS)}(this,function(e){e.lib.Cipher||function(t){var r=e,i=r.lib,n=i.Base,c=i.WordArray,o=i.BufferedBlockAlgorithm,s=r.enc,a=(s.Utf8,s.Base64),f=r.algo,p=f.EvpKDF,d=i.Cipher=o.extend({cfg:n.extend(),createEncryptor:function(e,t){return this.create(this._ENC_XFORM_MODE,e,t)},createDecryptor:function(e,t){return this.create(this._DEC_XFORM_MODE,e,t)},init:function(e,t,r){this.cfg=this.cfg.extend(r),this._xformMode=e,this._key=t,this.reset()},reset:function(){o.reset.call(this),this._doReset()},process:function(e){return this._append(e),this._process()},finalize:function(e){e&&this._append(e);var t=this._doFinalize();return t},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(){function e(e){return"string"==typeof e?B:x}return function(t){return{encrypt:function(r,i,n){return e(i).encrypt(t,r,i,n)},decrypt:function(r,i,n){return e(i).decrypt(t,r,i,n)}}}}()}),h=(i.StreamCipher=d.extend({_doFinalize:function(){var e=this._process(!0);return e},blockSize:1}),r.mode={}),u=i.BlockCipherMode=n.extend({createEncryptor:function(e,t){return this.Encryptor.create(e,t)},createDecryptor:function(e,t){return this.Decryptor.create(e,t)},init:function(e,t){this._cipher=e,this._iv=t}}),l=h.CBC=function(){function e(e,r,i){var n=this._iv;if(n){var c=n;this._iv=t}else var c=this._prevBlock;for(var o=0;o<i;o++)e[r+o]^=c[o]}var r=u.extend();return r.Encryptor=r.extend({processBlock:function(t,r){var i=this._cipher,n=i.blockSize;e.call(this,t,r,n),i.encryptBlock(t,r),this._prevBlock=t.slice(r,r+n)}}),r.Decryptor=r.extend({processBlock:function(t,r){var i=this._cipher,n=i.blockSize,c=t.slice(r,r+n);i.decryptBlock(t,r),e.call(this,t,r,n),this._prevBlock=c}}),r}(),_=r.pad={},v=_.Pkcs7={pad:function(e,t){for(var r=4*t,i=r-e.sigBytes%r,n=i<<24|i<<16|i<<8|i,o=[],s=0;s<i;s+=4)o.push(n);var a=c.create(o,i);e.concat(a)},unpad:function(e){var t=255&e.words[e.sigBytes-1>>>2];e.sigBytes-=t}},y=(i.BlockCipher=d.extend({cfg:d.cfg.extend({mode:l,padding:v}),reset:function(){d.reset.call(this);var e=this.cfg,t=e.iv,r=e.mode;if(this._xformMode==this._ENC_XFORM_MODE)var i=r.createEncryptor;else{var i=r.createDecryptor;this._minBufferSize=1}this._mode&&this._mode.__creator==i?this._mode.init(this,t&&t.words):(this._mode=i.call(r,this,t&&t.words),this._mode.__creator=i)},_doProcessBlock:function(e,t){this._mode.processBlock(e,t)},_doFinalize:function(){var e=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){e.pad(this._data,this.blockSize);var t=this._process(!0)}else{var t=this._process(!0);e.unpad(t)}return t},blockSize:4}),i.CipherParams=n.extend({init:function(e){this.mixIn(e)},toString:function(e){return(e||this.formatter).stringify(this)}})),m=r.format={},k=m.OpenSSL={stringify:function(e){var t=e.ciphertext,r=e.salt;if(r)var i=c.create([1398893684,1701076831]).concat(r).concat(t);else var i=t;return i.toString(a)},parse:function(e){var t=a.parse(e),r=t.words;if(1398893684==r[0]&&1701076831==r[1]){var i=c.create(r.slice(2,4));r.splice(0,4),t.sigBytes-=16}return y.create({ciphertext:t,salt:i})}},x=i.SerializableCipher=n.extend({cfg:n.extend({format:k}),encrypt:function(e,t,r,i){i=this.cfg.extend(i);var n=e.createEncryptor(r,i),c=n.finalize(t),o=n.cfg;return y.create({ciphertext:c,key:r,iv:o.iv,algorithm:e,mode:o.mode,padding:o.padding,blockSize:e.blockSize,formatter:i.format})},decrypt:function(e,t,r,i){i=this.cfg.extend(i),t=this._parse(t,i.format);var n=e.createDecryptor(r,i).finalize(t.ciphertext);return n},_parse:function(e,t){return"string"==typeof e?t.parse(e,this):e}}),g=r.kdf={},S=g.OpenSSL={execute:function(e,t,r,i){i||(i=c.random(8));var n=p.create({keySize:t+r}).compute(e,i),o=c.create(n.words.slice(t),4*r);return n.sigBytes=4*t,y.create({key:n,iv:o,salt:i})}},B=i.PasswordBasedCipher=x.extend({cfg:x.cfg.extend({kdf:S}),encrypt:function(e,t,r,i){i=this.cfg.extend(i);var n=i.kdf.execute(r,e.keySize,e.ivSize);i.iv=n.iv;var c=x.encrypt.call(this,e,t,n.key,i);return c.mixIn(n),c},decrypt:function(e,t,r,i){i=this.cfg.extend(i),t=this._parse(t,i.format);var n=i.kdf.execute(r,e.keySize,e.ivSize,t.salt);i.iv=n.iv;var c=x.decrypt.call(this,e,t,n.key,i);return c}})}()});
 | 
			
		||||
//# sourceMappingURL=cipher-core.min.js.map
 | 
			
		||||
!function(e,i){"object"==typeof exports?module.exports=exports=i(require("./core.min")):"function"==typeof define&&define.amd?define(["./core.min"],i):i(e.CryptoJS)}(this,function(e){!function(){var i=e,t=i.lib,n=t.Base,s=i.enc,r=s.Utf8,o=i.algo;o.HMAC=n.extend({init:function(e,i){e=this._hasher=new e.init,"string"==typeof i&&(i=r.parse(i));var t=e.blockSize,n=4*t;i.sigBytes>n&&(i=e.finalize(i)),i.clamp();for(var s=this._oKey=i.clone(),o=this._iKey=i.clone(),a=s.words,f=o.words,c=0;c<t;c++)a[c]^=1549556828,f[c]^=909522486;s.sigBytes=o.sigBytes=n,this.reset()},reset:function(){var e=this._hasher;e.reset(),e.update(this._iKey)},update:function(e){return this._hasher.update(e),this},finalize:function(e){var i=this._hasher,t=i.finalize(e);i.reset();var n=i.finalize(this._oKey.clone().concat(t));return n}})}()});
 | 
			
		||||
//# sourceMappingURL=hmac.min.js.map
 | 
			
		||||
!function(e,o,r){"object"==typeof exports?module.exports=exports=o(require("./core.min"),require("./cipher-core.min")):"function"==typeof define&&define.amd?define(["./core.min","./cipher-core.min"],o):o(e.CryptoJS)}(this,function(e){return e.mode.ECB=function(){var o=e.lib.BlockCipherMode.extend();return o.Encryptor=o.extend({processBlock:function(e,o){this._cipher.encryptBlock(e,o)}}),o.Decryptor=o.extend({processBlock:function(e,o){this._cipher.decryptBlock(e,o)}}),o}(),e.mode.ECB});
 | 
			
		||||
//# sourceMappingURL=mode-ecb.min.js.map
 | 
			
		||||
!function(e,r,i){"object"==typeof exports?module.exports=exports=r(require("./core.min"),require("./cipher-core.min")):"function"==typeof define&&define.amd?define(["./core.min","./cipher-core.min"],r):r(e.CryptoJS)}(this,function(e){return e.pad.Pkcs7});
 | 
			
		||||
//# sourceMappingURL=pad-pkcs7.min.js.map
 | 
			
		||||
!function(e,r,i){"object"==typeof exports?module.exports=exports=r(require("./core.min"),require("./enc-base64.min"),require("./md5.min"),require("./evpkdf.min"),require("./cipher-core.min")):"function"==typeof define&&define.amd?define(["./core.min","./enc-base64.min","./md5.min","./evpkdf.min","./cipher-core.min"],r):r(e.CryptoJS)}(this,function(e){return function(){var r=e,i=r.lib,n=i.BlockCipher,o=r.algo,t=[],c=[],s=[],f=[],a=[],d=[],u=[],v=[],h=[],y=[];!function(){for(var e=[],r=0;r<256;r++)r<128?e[r]=r<<1:e[r]=r<<1^283;for(var i=0,n=0,r=0;r<256;r++){var o=n^n<<1^n<<2^n<<3^n<<4;o=o>>>8^255&o^99,t[i]=o,c[o]=i;var p=e[i],l=e[p],_=e[l],k=257*e[o]^16843008*o;s[i]=k<<24|k>>>8,f[i]=k<<16|k>>>16,a[i]=k<<8|k>>>24,d[i]=k;var k=16843009*_^65537*l^257*p^16843008*i;u[o]=k<<24|k>>>8,v[o]=k<<16|k>>>16,h[o]=k<<8|k>>>24,y[o]=k,i?(i=p^e[e[e[_^p]]],n^=e[e[n]]):i=n=1}}();var p=[0,1,2,4,8,16,32,64,128,27,54],l=o.AES=n.extend({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var e=this._keyPriorReset=this._key,r=e.words,i=e.sigBytes/4,n=this._nRounds=i+6,o=4*(n+1),c=this._keySchedule=[],s=0;s<o;s++)if(s<i)c[s]=r[s];else{var f=c[s-1];s%i?i>6&&s%i==4&&(f=t[f>>>24]<<24|t[f>>>16&255]<<16|t[f>>>8&255]<<8|t[255&f]):(f=f<<8|f>>>24,f=t[f>>>24]<<24|t[f>>>16&255]<<16|t[f>>>8&255]<<8|t[255&f],f^=p[s/i|0]<<24),c[s]=c[s-i]^f}for(var a=this._invKeySchedule=[],d=0;d<o;d++){var s=o-d;if(d%4)var f=c[s];else var f=c[s-4];d<4||s<=4?a[d]=f:a[d]=u[t[f>>>24]]^v[t[f>>>16&255]]^h[t[f>>>8&255]]^y[t[255&f]]}}},encryptBlock:function(e,r){this._doCryptBlock(e,r,this._keySchedule,s,f,a,d,t)},decryptBlock:function(e,r){var i=e[r+1];e[r+1]=e[r+3],e[r+3]=i,this._doCryptBlock(e,r,this._invKeySchedule,u,v,h,y,c);var i=e[r+1];e[r+1]=e[r+3],e[r+3]=i},_doCryptBlock:function(e,r,i,n,o,t,c,s){for(var f=this._nRounds,a=e[r]^i[0],d=e[r+1]^i[1],u=e[r+2]^i[2],v=e[r+3]^i[3],h=4,y=1;y<f;y++){var p=n[a>>>24]^o[d>>>16&255]^t[u>>>8&255]^c[255&v]^i[h++],l=n[d>>>24]^o[u>>>16&255]^t[v>>>8&255]^c[255&a]^i[h++],_=n[u>>>24]^o[v>>>16&255]^t[a>>>8&255]^c[255&d]^i[h++],k=n[v>>>24]^o[a>>>16&255]^t[d>>>8&255]^c[255&u]^i[h++];a=p,d=l,u=_,v=k}var p=(s[a>>>24]<<24|s[d>>>16&255]<<16|s[u>>>8&255]<<8|s[255&v])^i[h++],l=(s[d>>>24]<<24|s[u>>>16&255]<<16|s[v>>>8&255]<<8|s[255&a])^i[h++],_=(s[u>>>24]<<24|s[v>>>16&255]<<16|s[a>>>8&255]<<8|s[255&d])^i[h++],k=(s[v>>>24]<<24|s[a>>>16&255]<<16|s[d>>>8&255]<<8|s[255&u])^i[h++];e[r]=p,e[r+1]=l,e[r+2]=_,e[r+3]=k},keySize:8});r.AES=n._createHelper(l)}(),e.AES});
 | 
			
		||||
//# sourceMappingURL=aes.min.js.map
 | 
			
		||||
!function(e,n){"object"==typeof exports?module.exports=exports=n(require("./core.min")):"function"==typeof define&&define.amd?define(["./core.min"],n):n(e.CryptoJS)}(this,function(e){return e.enc.Utf8});
 | 
			
		||||
//# sourceMappingURL=enc-utf8.min.js.map
 | 
			
		||||
var cbc_key = CryptoJS.enc.Utf8.parse("zhgd@bonus@zhgd@bonus@1234567890");
 | 
			
		||||
var cbc_iv = CryptoJS.enc.Utf8.parse("1234567812345678");
 | 
			
		||||
function encryptCBC(word){
 | 
			
		||||
	if(!aqEnnable){
 | 
			
		||||
		return  word;
 | 
			
		||||
	}
 | 
			
		||||
	var  srcs = CryptoJS.enc.Utf8.parse(word)
 | 
			
		||||
    var encrypted = CryptoJS.AES.encrypt(srcs, cbc_key, {
 | 
			
		||||
				iv: cbc_iv,
 | 
			
		||||
				mode: CryptoJS.mode.CBC,
 | 
			
		||||
				padding: CryptoJS.pad.Pkcs7
 | 
			
		||||
			});
 | 
			
		||||
	 return encrypted.toString();
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * 解密
 | 
			
		||||
 * @param word
 | 
			
		||||
 * @returns {*}
 | 
			
		||||
 */
 | 
			
		||||
function decryptCBC(word){
 | 
			
		||||
	if(!aqEnnable){
 | 
			
		||||
		return  word;
 | 
			
		||||
	}
 | 
			
		||||
    var encrypted = CryptoJS.AES.decrypt(word, cbc_key, {
 | 
			
		||||
				iv: cbc_iv,
 | 
			
		||||
				mode: CryptoJS.mode.CBC,
 | 
			
		||||
				padding: CryptoJS.pad.Pkcs7
 | 
			
		||||
			});
 | 
			
		||||
	return encrypted.toString(CryptoJS.enc.Utf8);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {Object} fmt
 | 
			
		||||
 * @param {Object} date时间格式化工具类
 | 
			
		||||
 */
 | 
			
		||||
function dateFtt(fmt, date) { //author: meizz   
 | 
			
		||||
		var o = {
 | 
			
		||||
			"M+": date.getMonth() + 1, //月份   
 | 
			
		||||
			"d+": date.getDate(), //日   
 | 
			
		||||
			"h+": date.getHours(), //小时   
 | 
			
		||||
			"m+": date.getMinutes(), //分   
 | 
			
		||||
			"s+": date.getSeconds(), //秒   
 | 
			
		||||
			"q+": Math.floor((date.getMonth() + 3) / 3), //季度   
 | 
			
		||||
			"S": date.getMilliseconds() //毫秒   
 | 
			
		||||
		};
 | 
			
		||||
		if(/(y+)/.test(fmt))
 | 
			
		||||
			fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
 | 
			
		||||
		for(var k in o)
 | 
			
		||||
			if(new RegExp("(" + k + ")").test(fmt))
 | 
			
		||||
				fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
 | 
			
		||||
		return fmt;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
// var dataUrl ="http://218.21.27.6:1930/nxnyback/";
 | 
			
		||||
// var dataUrl ="http://127.0.0.1:1930/nxnyback/";
 | 
			
		||||
var dataUrl = "http://192.168.0.14:1930/nxnyback";
 | 
			
		||||
// var dataUrl ="http://140.210.195.210:1918/gzrbmw/";
 | 
			
		||||
// var dataUrl ="http://140.210.195.210:1920/gzrbmw/";
 | 
			
		||||
var dataUrl ="http://218.21.27.6:1930/nxnyback";
 | 
			
		||||
var token=localStorage.getItem('token');
 | 
			
		||||
$(function() {
 | 
			
		||||
	var headHTML = document.getElementsByTagName('head')[0].innerHTML;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,28 +1,29 @@
 | 
			
		|||
var ctxPath = getContextPath();
 | 
			
		||||
var dataPath = "http://192.168.0.14:1930/nxnyback";
 | 
			
		||||
// var dataUrl ="http://218.21.27.6:1930/nxnyback/";
 | 
			
		||||
// var dataUrl ="http://127.0.0.1:1930/nxnyback/";
 | 
			
		||||
// var dataPath = "http://192.168.0.176:1930/nxnyback";
 | 
			
		||||
var dataUrl ="http://218.21.27.6:1930/nxnyback/";
 | 
			
		||||
var aqEnnable = true;
 | 
			
		||||
 | 
			
		||||
//查看图片的路径
 | 
			
		||||
// var lookFile = "http://218.21.27.6:1999/nxnyback/statics";  //文件路径
 | 
			
		||||
var lookFile = "http://192.168.0.14:1930/nxnyback/statics";  //文件路径
 | 
			
		||||
var lookFile = "http://218.21.27.6:1999/nxnyback/statics";  //文件路径
 | 
			
		||||
//var lookFile = "http://192.168.0.14:1930/nxenergyweb/statics";  //文件路径
 | 
			
		||||
 | 
			
		||||
//kk file 测试环境地址
 | 
			
		||||
var filePreviewPathAll = "http://192.168.0.14:8012/onlinePreview?url=";
 | 
			
		||||
// var filePreviewPathAll = "http://218.21.27.6:8012/onlinePreview?url=";
 | 
			
		||||
//var filePreviewPathAll = "http://192.168.0.14:8012/onlinePreview?url=";
 | 
			
		||||
var filePreviewPathAll = "http://218.21.27.6:8012/onlinePreview?url=";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function getContextPath() {
 | 
			
		||||
    var pathName = document.location.pathname;
 | 
			
		||||
    var index = pathName.substr(1).indexOf("/");
 | 
			
		||||
    return pathName.substr(0, index + 1);
 | 
			
		||||
    var result = pathName.substr(0, index + 1);
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var disphoto = ctxPath + '/statics/';
 | 
			
		||||
var filePath = ctxPath + '/statics';
 | 
			
		||||
 | 
			
		||||
function isNotEmpty(str) {
 | 
			
		||||
    if (str != null && str !== 'null' && str !== '') {
 | 
			
		||||
    if (str != null && str != 'null' && str != '') {
 | 
			
		||||
        return true;
 | 
			
		||||
    } else {
 | 
			
		||||
        return false;
 | 
			
		||||
| 
						 | 
				
			
			@ -36,7 +37,11 @@ function openFileWindows(url) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
function isEmpty(str) {
 | 
			
		||||
    return str == null || str === 'null' || str === '';
 | 
			
		||||
    if (str == null || str == 'null' || str == '') {
 | 
			
		||||
        return true;
 | 
			
		||||
    } else {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function choseType(str) {
 | 
			
		||||
| 
						 | 
				
			
			@ -46,9 +51,13 @@ function choseType(str) {
 | 
			
		|||
        return true;
 | 
			
		||||
    } else if (str.indexOf("jpeg") > 0) {
 | 
			
		||||
        return true;
 | 
			
		||||
    } else return str.indexOf("gif") > 0;
 | 
			
		||||
    } else if (str.indexOf("gif") > 0) {
 | 
			
		||||
        return true;
 | 
			
		||||
    } else {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function getTypeImg(str) {
 | 
			
		||||
    if (str.toLowerCase().indexOf("xlsx") > 0 || str.toLowerCase().indexOf("xls") > 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -155,12 +164,12 @@ function addSvg(svgId,addDivId) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
function getFirst(str) {
 | 
			
		||||
    if(str  ==null | str ==='null' | str === undefined | str ==='undefined' || str.length<1){
 | 
			
		||||
    if(str  ==null | str =='null' | str ==undefined | str=='undefined' | str.length<1){
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    var x = str.substring(0,1);
 | 
			
		||||
    var y = str.substring(1,str.length);
 | 
			
		||||
    if(x === "/"){
 | 
			
		||||
    if(x == "/"){
 | 
			
		||||
        // str.substring(1,str.length);
 | 
			
		||||
        console.log("str111=="+y)
 | 
			
		||||
        return y;
 | 
			
		||||
| 
						 | 
				
			
			@ -275,8 +284,10 @@ function checkPsidno(value)
 | 
			
		|||
        }
 | 
			
		||||
        // 不能是2月30号、4月31号、5月32号出生的吧
 | 
			
		||||
        const date = new Date(year, month, 0) // 获取当月的最后一天
 | 
			
		||||
        return !(day < 1 || day > date.getDate());
 | 
			
		||||
 | 
			
		||||
        if (day < 1 || day > date.getDate()) {
 | 
			
		||||
            return false
 | 
			
		||||
        }
 | 
			
		||||
        return true
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 4.18位号码校验生成的校验码
 | 
			
		||||
| 
						 | 
				
			
			@ -301,8 +312,10 @@ function checkPsidno(value)
 | 
			
		|||
    // 验证手机号码的正则
 | 
			
		||||
const phone_reg = function(num){
 | 
			
		||||
        var num_reg = /^13[0-9]{1}[0-9]{8}$|15[0-9]{1}[0-9]{8}$|16[0-9]{1}[0-9]{8}$|18[0-9]{1}[0-9]{8}|17[0-9]{1}[0-9]{8}$|19[0-9]{1}[0-9]{8}$|14[0-9]{1}[0-9]{8}/;
 | 
			
		||||
        return num_reg.test(num);
 | 
			
		||||
 | 
			
		||||
        if(!num_reg.test(num)){
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -320,7 +333,7 @@ function changeDivHeightById(divId,num) {
 | 
			
		|||
    var height = $("#"+divId).outerHeight()
 | 
			
		||||
    var lineNum = Math.ceil(num/6);
 | 
			
		||||
    var  ss = height*lineNum;
 | 
			
		||||
    $('#'+divId).css("height", ss+"px");
 | 
			
		||||
    $("#"+divId).css("height", ss+"px");
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -335,57 +348,19 @@ function changeDivHeightByIdAndLine(divId,num,lineNum,type) {
 | 
			
		|||
    if(num <= 0){
 | 
			
		||||
        num =1;
 | 
			
		||||
    }
 | 
			
		||||
    let lineNum1;
 | 
			
		||||
    const height = 160;
 | 
			
		||||
    if(type ===1){
 | 
			
		||||
        lineNum1  = Math.ceil((num+1)/lineNum);
 | 
			
		||||
    var height = 160;
 | 
			
		||||
    if(type ==1){
 | 
			
		||||
        var lineNum = Math.ceil((num+1)/lineNum);
 | 
			
		||||
    }else{
 | 
			
		||||
        lineNum1 = Math.ceil(num/lineNum);
 | 
			
		||||
        var lineNum = Math.ceil(num/lineNum);
 | 
			
		||||
    }
 | 
			
		||||
    const ss = height * lineNum1;
 | 
			
		||||
    var  ss = height*lineNum;
 | 
			
		||||
    $("#"+divId).css("height", ss+"px");
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const provinces = {
 | 
			
		||||
    11: "北京",
 | 
			
		||||
    12: "天津",
 | 
			
		||||
    13: "河北",
 | 
			
		||||
    14: "山西",
 | 
			
		||||
    15: "内蒙古",
 | 
			
		||||
    21: "辽宁",
 | 
			
		||||
    22: "吉林",
 | 
			
		||||
    23: "黑龙江",
 | 
			
		||||
    31: "上海",
 | 
			
		||||
    32: "江苏",
 | 
			
		||||
    33: "浙江",
 | 
			
		||||
    34: "安徽",
 | 
			
		||||
    35: "福建",
 | 
			
		||||
    36: "江西",
 | 
			
		||||
    37: "山东",
 | 
			
		||||
    41: "河南",
 | 
			
		||||
    42: "湖北",
 | 
			
		||||
    43: "湖南",
 | 
			
		||||
    44: "广东",
 | 
			
		||||
    45: "广西",
 | 
			
		||||
    46: "海南",
 | 
			
		||||
    50: "重庆",
 | 
			
		||||
    51: "四川",
 | 
			
		||||
    52: "贵州",
 | 
			
		||||
    53: "云南",
 | 
			
		||||
    54: "西藏",
 | 
			
		||||
    61: "陕西",
 | 
			
		||||
    62: "甘肃",
 | 
			
		||||
    63: "青海",
 | 
			
		||||
    64: "宁夏",
 | 
			
		||||
    65: "新疆",
 | 
			
		||||
    71: "台湾",
 | 
			
		||||
    81: "香港",
 | 
			
		||||
    82: "澳门",
 | 
			
		||||
    91: "国外"
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var provinces = { 11: "北京", 12: "天津", 13: "河北", 14: "山西", 15: "内蒙古", 21: "辽宁", 22: "吉林", 23: "黑龙江", 31: "上海", 32: "江苏", 33: "浙江", 34: "安徽", 35: "福建", 36: "江西", 37: "山东", 41: "河南", 42: "湖北", 43: "湖南", 44: "广东", 45: "广西", 46: "海南", 50: "重庆", 51: "四川", 52: "贵州", 53: "云南", 54: "西藏", 61: "陕西", 62: "甘肃", 63: "青海", 64: "宁夏", 65: "新疆", 71: "台湾", 81: "香港", 82: "澳门", 91: "国外" };
 | 
			
		||||
function getProvince(idNumber){
 | 
			
		||||
    return provinces[parseInt(idNumber.substr(0, 2))];
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -40,30 +40,43 @@ layui.use(['table', 'form', 'laydate', 'dropdown' ,'util'], function () {
 | 
			
		|||
        if (options.title === '开工申请') {
 | 
			
		||||
            openFrameTwo('开工申请', './startWorkApplication.html',"", consId, proId, startWorkStatus, proName, consName,"");
 | 
			
		||||
        }else{
 | 
			
		||||
            if(startWorkStatus === "2"){
 | 
			
		||||
                //根据 title 做出不同操作
 | 
			
		||||
                if (options.title === '增加人员') {
 | 
			
		||||
                    openFrame('增加人员', './personAdd.html', consId, proId, proName, consName,"");
 | 
			
		||||
                } else if (options.title === '增加设备') {
 | 
			
		||||
                    openFrame('增加设备', './addEquipmentForm.html', consId, proId, proName, consName,"");
 | 
			
		||||
                } else if (options.title === '分包入场') {
 | 
			
		||||
                    openFrame('分包入场', './subAdmissionApplication.html', consId, proId, proName, consName,"");
 | 
			
		||||
                } else if (options.title === '人员出场') {
 | 
			
		||||
                    openFrame('人员出场', './personExitSet.html', consId, proId, proName, consName,"");
 | 
			
		||||
                } else if (options.title === '承包商出场') {
 | 
			
		||||
                    openFrameTwo('承包商出场', 'cbsAppearApply.html',ifMaster, consId, proId, consApplyStatus, proName, consName,"");
 | 
			
		||||
                }else if (options.title === '人员出场延期申请'){
 | 
			
		||||
                    openFrame('人员出场延期申请', './deferExitApply.html', consId, proId, proName, consName,"");
 | 
			
		||||
                }
 | 
			
		||||
            }else if (startWorkStatus === "10"){
 | 
			
		||||
                layer.alert("未提交开工申请,不能进行操作");
 | 
			
		||||
            }else if (startWorkStatus === "1"){
 | 
			
		||||
                layer.alert("开工申请未审核通过,不能进行操作");
 | 
			
		||||
            }else if (startWorkStatus === "0"){
 | 
			
		||||
                layer.alert("开工申请审核中,不能进行操作");
 | 
			
		||||
            }else if (startWorkStatus === "5"){
 | 
			
		||||
                layer.alert("开工申请已撤回,不能进行操作");
 | 
			
		||||
            if (options.title === '增加人员') {
 | 
			
		||||
                openFrame('增加人员', './personAdd.html', consId, proId, proName, consName,"");
 | 
			
		||||
            } else if (options.title === '增加设备') {
 | 
			
		||||
                openFrame('增加设备', './addEquipmentForm.html', consId, proId, proName, consName,"");
 | 
			
		||||
            } else if (options.title === '分包入场') {
 | 
			
		||||
                openFrame('分包入场', './subAdmissionApplication.html', consId, proId, proName, consName,"");
 | 
			
		||||
            } else if (options.title === '人员出场') {
 | 
			
		||||
                openFrame('人员出场', './personExitSet.html', consId, proId, proName, consName,"");
 | 
			
		||||
            } else if (options.title === '承包商出场') {
 | 
			
		||||
                openFrameTwo('承包商出场', 'cbsAppearApply.html',ifMaster, consId, proId, consApplyStatus, proName, consName,"");
 | 
			
		||||
            }else if (options.title === '人员出场延期申请'){
 | 
			
		||||
                openFrame('人员出场延期申请', './deferExitApply.html', consId, proId, proName, consName,"");
 | 
			
		||||
            }
 | 
			
		||||
            // if(startWorkStatus === "2"){
 | 
			
		||||
            //     //根据 title 做出不同操作
 | 
			
		||||
            //     if (options.title === '增加人员') {
 | 
			
		||||
            //         openFrame('增加人员', './personAdd.html', consId, proId, proName, consName,"");
 | 
			
		||||
            //     } else if (options.title === '增加设备') {
 | 
			
		||||
            //         openFrame('增加设备', './addEquipmentForm.html', consId, proId, proName, consName,"");
 | 
			
		||||
            //     } else if (options.title === '分包入场') {
 | 
			
		||||
            //         openFrame('分包入场', './subAdmissionApplication.html', consId, proId, proName, consName,"");
 | 
			
		||||
            //     } else if (options.title === '人员出场') {
 | 
			
		||||
            //         openFrame('人员出场', './personExitSet.html', consId, proId, proName, consName,"");
 | 
			
		||||
            //     } else if (options.title === '承包商出场') {
 | 
			
		||||
            //         openFrameTwo('承包商出场', 'cbsAppearApply.html',ifMaster, consId, proId, consApplyStatus, proName, consName,"");
 | 
			
		||||
            //     }else if (options.title === '人员出场延期申请'){
 | 
			
		||||
            //         openFrame('人员出场延期申请', './deferExitApply.html', consId, proId, proName, consName,"");
 | 
			
		||||
            //     }
 | 
			
		||||
            // }else if (startWorkStatus === "10"){
 | 
			
		||||
            //     layer.alert("未提交开工申请,不能进行操作");
 | 
			
		||||
            // }else if (startWorkStatus === "1"){
 | 
			
		||||
            //     layer.alert("开工申请未审核通过,不能进行操作");
 | 
			
		||||
            // }else if (startWorkStatus === "0"){
 | 
			
		||||
            //     layer.alert("开工申请审核中,不能进行操作");
 | 
			
		||||
            // }else if (startWorkStatus === "5"){
 | 
			
		||||
            //     layer.alert("开工申请已撤回,不能进行操作");
 | 
			
		||||
            // }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -63,6 +63,7 @@
 | 
			
		|||
<script type="text/javascript" src="layui/layui.js"></script>
 | 
			
		||||
<script src="js/qrcode.js"></script>
 | 
			
		||||
<script src="js/publicJs.js"></script>
 | 
			
		||||
<script src="js/ace/AesCbc.js"></script>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
	$.ajaxSetup({
 | 
			
		||||
| 
						 | 
				
			
			@ -172,8 +173,8 @@
 | 
			
		|||
				type : 'post',
 | 
			
		||||
				url : ctxPath + '/login',
 | 
			
		||||
				data : {
 | 
			
		||||
					username : username,
 | 
			
		||||
					password : password,
 | 
			
		||||
					username : encryptCBC(username),
 | 
			
		||||
					password : encryptCBC(password),
 | 
			
		||||
					verifyCode  : verifyCode,
 | 
			
		||||
					uuid : uuid
 | 
			
		||||
				},
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue