From 045b55722b25ccc77d88671c5d6df309edb8a66d Mon Sep 17 00:00:00 2001
From: 钟日健 <5689795+arsn@user.noreply.gitee.com>
Date: Tue, 22 Feb 2022 16:00:34 +0800
Subject: [PATCH] 1. 保安员新增异步推送数据至群访用户表 2. 会员标记接口新增,会员标记成功,则创建会员记录和会员题库记录(包含120道题目) 3. web 端考试开始,查询题目判断用户是否为会员,如果为会员则从会员题库获取当前人员的考试题目(从120道题中随机抽取60道)

---
 src/main/java/org/springblade/common/utils/HttpReqUtil.java                                   |   44 ++
 src/main/java/org/springblade/modules/exam/service/ExamSubjectChoicesService.java             |    6 
 src/main/java/org/springblade/modules/vip/service/impl/VipTopticServiceImpl.java              |   31 +
 src/main/java/org/springblade/modules/exam/service/impl/ExamSubjectChoicesServiceImpl.java    |    9 
 src/main/java/org/springblade/modules/exam/mapper/ExamSubjectChoicesMapper.xml                |    7 
 src/main/java/org/springblade/modules/system/dto/UserDTO.java                                 |   48 ++
 src/main/java/org/springblade/common/utils/HttpClientUtils.java                               |  593 ++++++++++++++++++++++++++++++++++
 src/main/java/org/springblade/modules/vip/mapper/VipTopicMapper.xml                           |    4 
 src/main/resources/application-dev.yml                                                        |    1 
 src/main/java/org/springblade/modules/exam/mapper/ExamPaperMapper.xml                         |   11 
 src/main/java/org/springblade/modules/system/controller/UserController.java                   |   16 
 src/main/java/org/springblade/common/config/FtpConfig.java                                    |   11 
 src/main/java/org/springblade/modules/vip/service/UserVipService.java                         |    8 
 src/main/java/org/springblade/modules/vip/service/impl/UserVipServiceImpl.java                |   22 +
 src/main/java/org/springblade/modules/exam/service/impl/ExamPaperServiceImpl.java             |   49 ++
 src/main/java/org/springblade/modules/training/controller/TrainingRegistrationController.java |   29 +
 src/main/java/org/springblade/modules/vip/entity/VipTopic.java                                |    8 
 src/main/java/org/springblade/modules/exam/mapper/ExamSubjectChoicesMapper.java               |    6 
 src/main/java/org/springblade/modules/vip/entity/UserVip.java                                 |    2 
 src/main/resources/application-test.yml                                                       |    1 
 src/main/java/org/springblade/common/config/AsyncConfig.java                                  |   35 ++
 src/main/java/org/springblade/modules/vip/service/VipTopicService.java                        |    8 
 src/main/java/org/springblade/modules/system/service/MyAsyncService.java                      |   48 ++
 src/main/java/org/springblade/modules/exam/mapper/ExamPaperMapper.java                        |    7 
 src/main/java/org/springblade/modules/training/entity/TrainingRegistration.java               |    5 
 25 files changed, 1,001 insertions(+), 8 deletions(-)

diff --git a/src/main/java/org/springblade/common/config/AsyncConfig.java b/src/main/java/org/springblade/common/config/AsyncConfig.java
new file mode 100644
index 0000000..f9e864e
--- /dev/null
+++ b/src/main/java/org/springblade/common/config/AsyncConfig.java
@@ -0,0 +1,35 @@
+package org.springblade.common.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.core.task.TaskExecutor;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * 异步处理配置文件
+ * @author zhongrj
+ * @since 2022-02-22
+ */
+@EnableAsync
+public class AsyncConfig {
+
+	@Bean
+	public TaskExecutor executor(){
+		ThreadPoolTaskExecutor executor=new ThreadPoolTaskExecutor();
+		//核心线程数
+		executor.setCorePoolSize(10);
+		//最大线程数
+		executor.setMaxPoolSize(20);
+		//队列大小
+		executor.setQueueCapacity(1000);
+		//线程最大空闲时间
+		executor.setKeepAliveSeconds(300);
+		executor.setThreadNamePrefix("fsx-Executor-");
+		//指定用于新创建的线程名称的前缀。
+		executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+		//返回
+		return executor;
+	}
+}
diff --git a/src/main/java/org/springblade/common/config/FtpConfig.java b/src/main/java/org/springblade/common/config/FtpConfig.java
index e48b410..4365141 100644
--- a/src/main/java/org/springblade/common/config/FtpConfig.java
+++ b/src/main/java/org/springblade/common/config/FtpConfig.java
@@ -73,6 +73,13 @@
 	public static String password;
 
 
+
+	/**
+	 * 群访群控接口调用基础url
+	 */
+	public static String qfqkBaseApiUrl;
+
+
 	public void setSqlConnect(String sqlConnect) {
 		FtpConfig.sqlConnect = sqlConnect;
 	}
@@ -116,4 +123,8 @@
 	public void setPassword(String password) {
 		FtpConfig.password = password;
 	}
+
+	public void setQfqkBaseApiUrl(String qfqkBaseApiUrl) {
+		FtpConfig.qfqkBaseApiUrl = qfqkBaseApiUrl;
+	}
 }
diff --git a/src/main/java/org/springblade/common/utils/HttpClientUtils.java b/src/main/java/org/springblade/common/utils/HttpClientUtils.java
new file mode 100644
index 0000000..ac23e65
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/HttpClientUtils.java
@@ -0,0 +1,593 @@
+package org.springblade.common.utils;
+
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.*;
+
+import com.alibaba.fastjson.JSON;
+import org.apache.http.HttpEntity;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.conn.ssl.TrustStrategy;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.*;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.apache.http.util.EntityUtils;
+import sun.misc.BASE64Encoder;
+import javax.net.ssl.SSLContext;
+
+
+public class HttpClientUtils {
+	/**
+	 * 执行有参GET请求
+	 *
+	 * @param url
+	 * @param params
+	 * @return
+	 */
+	public static String doGet(String url, Map<String, String> params) {
+
+//获取httpclient客户端
+		CloseableHttpClient httpclient = HttpClients.createDefault();
+
+		String resultString = "";
+
+		CloseableHttpResponse response = null;
+
+		try {
+			URIBuilder builder = new URIBuilder(url);
+
+			if (null != params) {
+				for (String key : params.keySet()) {
+					builder.setParameter(key, params.get(key));
+				}
+			}
+
+			HttpGet get = new HttpGet(builder.build());
+
+			response = httpclient.execute(get);
+
+			System.out.println(response.getStatusLine());
+
+			if (200 == response.getStatusLine().getStatusCode()) {
+				HttpEntity entity = response.getEntity();
+				resultString = EntityUtils.toString(entity, "utf-8");
+			}
+
+		} catch (Exception e) {
+
+			e.printStackTrace();
+		} finally {
+			if (null != response) {
+				try {
+					response.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			if (null != httpclient) {
+				try {
+					httpclient.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+
+		return resultString;
+	}
+
+	/**
+	 * 执行有参GET请求,带请求头
+	 *
+	 * @param url 请求url
+	 * @param params 参数
+	 * @param key 请求头Key
+	 * @param secretKey 秘钥
+	 * @return
+	 */
+	public static String doGetHeader(String url, String key, String secretKey,Map<String, String> params) {
+
+//获取httpclient客户端
+		CloseableHttpClient httpclient = HttpClients.createDefault();
+
+		String resultString = "";
+
+		CloseableHttpResponse response = null;
+
+		try {
+			URIBuilder builder = new URIBuilder(url);
+
+			if (null != params) {
+				for (String keys : params.keySet()) {
+					builder.addParameter(keys,params.get(keys));
+//builder.setParameter(keys, params.get(keys));
+				}
+			}
+
+			HttpGet httpGet = new HttpGet(builder.build());
+
+//设置请求头
+			httpGet.addHeader(key,secretKey);
+// 传输的类型
+			httpGet.addHeader("Content-Type", "application/x-www-form-urlencoded");
+//执行Http请求调用
+			response = httpclient.execute(httpGet);
+//判断是否请求成功返回
+			if (200 == response.getStatusLine().getStatusCode()) {
+				HttpEntity entity = response.getEntity();
+				resultString = EntityUtils.toString(entity, "utf-8");
+			}
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			if (null != response) {
+				try {
+					response.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			if (null != httpclient) {
+				try {
+					httpclient.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+
+		return resultString;
+	}
+
+	/**
+	 * 执行有参GET请求,带请求头,接收图片流
+	 *
+	 * @param url 请求url
+	 * @param params 参数
+	 * @param key 请求头Key
+	 * @param secretKey 秘钥
+	 * @return
+	 */
+	public static String doGetHeaderPictureBase64(String url, String key, String secretKey,Map<String, String> params) {
+
+//获取httpclient客户端
+		CloseableHttpClient httpclient = HttpClients.createDefault();
+		String resultString = "";
+		CloseableHttpResponse response = null;
+		try {
+			URIBuilder builder = new URIBuilder(url);
+			if (null != params) {
+				for (String keys : params.keySet()) {
+					builder.addParameter(keys,params.get(keys));
+				}
+			}
+			HttpGet httpGet = new HttpGet(builder.build());
+//设置请求头
+			httpGet.addHeader(key,secretKey);
+// 传输的类型
+			httpGet.addHeader("Content-Type", "application/x-www-form-urlencoded");
+//执行Http请求调用
+			response = httpclient.execute(httpGet);
+// 将返回的图片或者文件转化成字节数组的形式
+			byte[] data = EntityUtils.toByteArray(response.getEntity());
+			BASE64Encoder encoder = new BASE64Encoder();
+//String imageBase64 = "data:image/png;base64," + encoder.encodeBuffer(data).trim();
+			return encoder.encodeBuffer(data).trim().replaceAll("\n", "").replaceAll("\r", "").replaceAll(" ", "");//删除 \r\n
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			if (null != response) {
+				try {
+					response.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			if (null != httpclient) {
+				try {
+					httpclient.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		return resultString;
+	}
+
+	/**
+	 * 执行无参GET请求
+	 *
+	 * @param url
+	 * @return
+	 */
+	public static String doGet(String url) {
+		return doGet(url, null);
+	}
+
+	/**
+	 * 执行有参POST请求
+	 *
+	 * @param url
+	 * @param params
+	 * @return
+	 */
+	public static String doPost(String url, Map<String, String> params) {
+/**
+ * 在4.0及以上httpclient版本中,post需要指定重定向的策略,如果不指定则按默认的重定向策略。
+ *
+ * 获取httpclient客户端
+ */
+		CloseableHttpClient httpclient = HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build();
+
+		String resultString = "";
+
+		CloseableHttpResponse response = null;
+
+		try {
+
+
+			HttpPost post = new HttpPost(url);
+
+			List<NameValuePair> paramaters = new ArrayList<>();
+
+			if (null != params) {
+				for (String key : params.keySet()) {
+					paramaters.add(new BasicNameValuePair(key, params.get(key)));
+				}
+// 构造一个form表单式的实体
+				UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(paramaters);
+// 将请求实体设置到httpPost对象中
+				post.setEntity(formEntity);
+			}
+
+
+/**
+ * HTTP/1.1 403 Forbidden
+ *   原因:
+ *      有些网站,设置了反爬虫机制
+ *   解决的办法:
+ *      设置请求头,伪装浏览器
+ */
+			post.addHeader("user-agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
+
+			response = httpclient.execute(post);
+
+			System.out.println(response.getStatusLine());
+
+			if (200 == response.getStatusLine().getStatusCode()) {
+				HttpEntity entity = response.getEntity();
+				resultString = EntityUtils.toString(entity, "utf-8");
+			}
+
+		} catch (Exception e) {
+
+			e.printStackTrace();
+		} finally {
+			if (null != response) {
+				try {
+					response.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			if (null != httpclient) {
+				try {
+					httpclient.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		return resultString;
+	}
+
+	public static String doPost(String url) {
+		return doPost(url, null);
+	}
+
+
+	public static void main(String[] args) {
+
+		Map<String, String> params = new HashMap<>();
+		params.put("scope", "project");
+		params.put("q", "数据库");
+//
+//    System.out.println(doGet("http://www.baidu.com/s",params));
+
+		/**
+		 * 有一部分网站,禁止爬虫技术访问网站。
+		 *
+		 * 解决方案:
+		 *    伪装浏览器
+		 *    post.addHeader("user-agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
+		 */
+		System.out.println(doPost("http://www.oschina.net/search", params));
+	}
+
+	/**
+	 * post 请求 header 带 秘钥
+	 * @param url
+	 * @param appKey
+	 * @param appKeyValue
+	 * @param map
+	 * @return
+	 */
+	public static String httpPost(String url, String appKey, String appKeyValue, Map<String, String> map) {
+// 返回body
+		String body = null;
+// 获取连接客户端工具
+		CloseableHttpClient httpClient = HttpClients.createDefault();
+		CloseableHttpResponse httpResponse = null;
+// 2、创建一个HttpPost请求
+		HttpPost post = new HttpPost(url);
+// 5、设置header信息
+		/**header中通用属性*/
+//        post.setHeader("Accept", "*/*");
+//        post.setHeader("Accept-Encoding", "gzip, deflate");
+//        post.setHeader("Cache-Control", "no-cache");
+//        post.setHeader("Connection", "keep-alive");
+		post.setHeader("Content-Type", "application/json;charset=UTF-8");
+/**业务参数*/
+		post.setHeader(appKey, appKeyValue);
+// 设置参数
+		if (map != null) {
+			try {
+				StringEntity entity1 = new StringEntity(JSON.toJSONString(map), "UTF-8");
+				entity1.setContentEncoding("UTF-8");
+				entity1.setContentType("json/form-data");
+				post.setEntity(entity1);
+
+// 7、执行post请求操作,并拿到结果
+				httpResponse = httpClient.execute(post);
+// 获取结果实体
+				HttpEntity entity = httpResponse.getEntity();
+				if (entity != null) {
+// 按指定编码转换结果实体为String类型
+					body = EntityUtils.toString(entity, "UTF-8");
+				}
+				try {
+					httpResponse.close();
+					httpClient.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		return body;
+	}
+
+	public static SSLContext createIgnoreVerifySSL() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException {
+
+		SSLContext sc = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
+
+			public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
+				return true;
+			}
+
+		}).build();
+
+		return sc;
+	}
+
+	//适用于post请求并传送form-data数据(同样适用于post的Raw类型的application-json格式)
+	public static String postParams(String url, String appKey, String appKeyValue, Map<String, String> map) {
+		SSLContext sslcontext = null;
+		try {
+			sslcontext = createIgnoreVerifySSL();
+		} catch (KeyManagementException e) {
+			e.printStackTrace();
+		} catch (NoSuchAlgorithmException e) {
+			e.printStackTrace();
+		} catch (KeyStoreException e) {
+			e.printStackTrace();
+		}
+// 设置协议http和https对应的处理socket链接工厂的对象
+		Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
+			.register("http", PlainConnectionSocketFactory.INSTANCE)
+			.register("https", new SSLConnectionSocketFactory(sslcontext))
+			.build();
+		PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
+
+//创建自定义的httpclient对象
+		CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).build();
+		HttpPost post = new HttpPost(url);
+		post.setHeader(appKey, appKeyValue);
+		CloseableHttpResponse res = null;
+		try {
+			List<NameValuePair> nvps = new ArrayList<NameValuePair>();
+			Set<String> keySet = map.keySet();
+			for (String key : keySet) {
+				nvps.add(new BasicNameValuePair(key, map.get(key)));
+			}
+			post.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));
+			res = client.execute(post);
+			HttpEntity entity = res.getEntity();
+			return EntityUtils.toString(entity, "utf-8");
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			try {
+				res.close();
+				client.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+		return "";
+	}
+
+
+
+	//适用于post请求并传送form-data数据(同样适用于post的Raw类型的application-json格式)
+	public static String postParams(String url, Map<String, Object> map) {
+		SSLContext sslcontext = null;
+		try {
+			sslcontext = createIgnoreVerifySSL();
+		} catch (KeyManagementException e) {
+			e.printStackTrace();
+		} catch (NoSuchAlgorithmException e) {
+			e.printStackTrace();
+		} catch (KeyStoreException e) {
+			e.printStackTrace();
+		}
+// 设置协议http和https对应的处理socket链接工厂的对象
+		Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
+			.register("http", PlainConnectionSocketFactory.INSTANCE)
+			.register("https", new SSLConnectionSocketFactory(sslcontext))
+			.build();
+		PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
+
+//创建自定义的httpclient对象
+		CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).build();
+		HttpPost post = new HttpPost(url);
+//		post.setHeader(appKey, appKeyValue);
+		CloseableHttpResponse res = null;
+		try {
+			List<NameValuePair> nvps = new ArrayList<NameValuePair>();
+			Set<String> keySet = map.keySet();
+			for (String key : keySet) {
+				nvps.add(new BasicNameValuePair(key, map.get(key).toString()));
+			}
+			post.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));
+			res = client.execute(post);
+			HttpEntity entity = res.getEntity();
+			return EntityUtils.toString(entity, "utf-8");
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			try {
+				res.close();
+				client.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+		return "";
+	}
+
+	/**
+	 * 向指定 URL 发送POST方法的请求
+	 *
+	 * @param url    发送请求的 URL
+	 * @param params 请求的参数集合
+	 * @return 远程资源的响应结果
+	 */
+	@SuppressWarnings("unused")
+	public static String sendPost(String url, Map<String, String> params) {
+		OutputStreamWriter out = null;
+		BufferedReader in = null;
+		StringBuilder result = new StringBuilder();
+		try {
+			URL realUrl = new URL(url);
+			HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
+// 发送POST请求必须设置如下两行
+			conn.setDoOutput(true);
+			conn.setDoInput(true);
+// POST方法
+			conn.setRequestMethod("POST");
+// 设置通用的请求属性
+			conn.setRequestProperty("accept", "*/*");
+			conn.setRequestProperty("connection", "Keep-Alive");
+			conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+			conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+			conn.connect();
+// 获取URLConnection对象对应的输出流
+			out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
+// 发送请求参数
+			if (params != null) {
+				StringBuilder param = new StringBuilder();
+				for (Map.Entry<String, String> entry : params.entrySet()) {
+					if (param.length() > 0) {
+						param.append("&");
+					}
+					param.append(entry.getKey());
+					param.append("=");
+					param.append(entry.getValue());
+// System.out.println(entry.getKey()+":"+entry.getValue());
+				}
+// System.out.println("param:"+param.toString());
+				out.write(param.toString());
+			}
+// flush输出流的缓冲
+			out.flush();
+// 定义BufferedReader输入流来读取URL的响应
+			in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
+			String line;
+			while ((line = in.readLine()) != null) {
+				result.append(line);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+// 使用finally块来关闭输出流、输入流
+		finally {
+			try {
+				if (out != null) {
+					out.close();
+				}
+				if (in != null) {
+					in.close();
+				}
+			} catch (IOException ex) {
+				ex.printStackTrace();
+			}
+		}
+		return result.toString();
+	}
+
+
+	/**
+	 * json  body
+	 * @param url
+	 * @param json
+	 * @return
+	 * @throws IOException
+	 */
+	public static String httpPostWithjson(String url, String json) throws IOException {
+		String result = "";
+		HttpPost httpPost = new HttpPost(url);
+		CloseableHttpClient httpClient = HttpClients.createDefault();
+		try {
+			BasicResponseHandler handler = new BasicResponseHandler();
+			StringEntity entity = new StringEntity(json, "utf-8");//解决中文乱码问题
+			entity.setContentEncoding("UTF-8");
+			entity.setContentType("application/json");
+			httpPost.setEntity(entity);
+			result = httpClient.execute(httpPost, handler);
+			return result;
+		} catch (Exception e) {
+			e.printStackTrace();
+
+		} finally {
+			try {
+				httpClient.close();
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		return result;
+	}
+}
+
+
diff --git a/src/main/java/org/springblade/common/utils/HttpReqUtil.java b/src/main/java/org/springblade/common/utils/HttpReqUtil.java
index 39f99a0..3242d0d 100644
--- a/src/main/java/org/springblade/common/utils/HttpReqUtil.java
+++ b/src/main/java/org/springblade/common/utils/HttpReqUtil.java
@@ -107,6 +107,21 @@
 		return postJson(url, json, header);
 	}
 
+	public String doPostJsons(String url, Map<String, Object> params, Map<String, String> header) throws Exception {
+		String json = null;
+		if (params != null && !params.isEmpty()) {
+			for (Iterator<Entry<String, Object>> it = params.entrySet().iterator(); it.hasNext();) {
+				Entry<String, Object> entry = (Entry<String, Object>) it.next();
+				Object object = entry.getValue();
+				if (object == null) {
+					it.remove();
+				}
+			}
+			json = JSON.toJSONString(params);
+		}
+		return postJsons(url, json, header);
+	}
+
 	public String doPostJson(String url, String json) throws Exception {
 		return doPostJson(url, json, null);
 	}
@@ -144,6 +159,35 @@
 		return body;
 	}
 
+	private String postJsons(String url, String json, Map<String, String> header) throws Exception {
+		String body = null;
+		try {
+			// Post请求
+			LOG.debug(" protocol: POST");
+			LOG.debug("      url: " + url);
+			HttpPost httpPost = new HttpPost(url.trim());
+			// 设置参数
+			LOG.debug("   params: " + json);
+			httpPost.setEntity(new StringEntity(json, ContentType.DEFAULT_TEXT.withCharset(charset)));
+			httpPost.setHeader(new BasicHeader("Content-Type", "application/json"));
+			LOG.debug("     type: JSON");
+			// 设置Header
+			if (header != null && !header.isEmpty()) {
+				LOG.debug("   header: " + JSON.toJSONString(header));
+				for (Iterator<Entry<String, String>> it = header.entrySet().iterator(); it.hasNext();) {
+					Entry<String, String> entry = (Entry<String, String>) it.next();
+					httpPost.setHeader(new BasicHeader(entry.getKey(), entry.getValue()));
+				}
+			}
+			// 发送请求,获取返回数据
+			body = execute(httpPost);
+		} catch (Exception e) {
+			throw e;
+		}
+		LOG.debug("  result: " + body);
+		return body;
+	}
+
 	/**
 	 * get请求
 	 */
diff --git a/src/main/java/org/springblade/modules/exam/mapper/ExamPaperMapper.java b/src/main/java/org/springblade/modules/exam/mapper/ExamPaperMapper.java
index fd29e46..a0dfa19 100644
--- a/src/main/java/org/springblade/modules/exam/mapper/ExamPaperMapper.java
+++ b/src/main/java/org/springblade/modules/exam/mapper/ExamPaperMapper.java
@@ -159,4 +159,11 @@
 	 * @return
 	 */
 	List<ExamScoreVO> getExamScoreList(@Param("examScore") ExamScoreVO examScoreVO);
+
+	/**
+	 * 去除随机的题目
+	 * @param radio
+	 * @return
+	 */
+	List<ExamSubjectChoicesVO> queryRandomSubjectList(@Param("list") List<String> radio,@Param("number") Integer number);
 }
diff --git a/src/main/java/org/springblade/modules/exam/mapper/ExamPaperMapper.xml b/src/main/java/org/springblade/modules/exam/mapper/ExamPaperMapper.xml
index ca809af..e03378a 100644
--- a/src/main/java/org/springblade/modules/exam/mapper/ExamPaperMapper.xml
+++ b/src/main/java/org/springblade/modules/exam/mapper/ExamPaperMapper.xml
@@ -534,4 +534,15 @@
         ) aa,(select @i:=0) bb
     </select>
 
+    <select id="queryRandomSubjectList" resultType="org.springblade.modules.exam.vo.ExamSubjectChoicesVO">
+        select * from (
+            select * from exam_subject_choices
+            where id in
+            <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        ) a ORDER BY RAND() LIMIT #{number}
+    </select>
+
+
 </mapper>
diff --git a/src/main/java/org/springblade/modules/exam/mapper/ExamSubjectChoicesMapper.java b/src/main/java/org/springblade/modules/exam/mapper/ExamSubjectChoicesMapper.java
index b7f3866..b9539bd 100644
--- a/src/main/java/org/springblade/modules/exam/mapper/ExamSubjectChoicesMapper.java
+++ b/src/main/java/org/springblade/modules/exam/mapper/ExamSubjectChoicesMapper.java
@@ -47,4 +47,10 @@
 	 * @return
 	 */
 	int removeBySubjectId(@Param("id")Long id);
+
+	/**
+	 * 随机查询题库120道
+	 * @return
+	 */
+	List<String> getExamSubjectChoicesList();
 }
diff --git a/src/main/java/org/springblade/modules/exam/mapper/ExamSubjectChoicesMapper.xml b/src/main/java/org/springblade/modules/exam/mapper/ExamSubjectChoicesMapper.xml
index 17f6af0..11a7dcb 100644
--- a/src/main/java/org/springblade/modules/exam/mapper/ExamSubjectChoicesMapper.xml
+++ b/src/main/java/org/springblade/modules/exam/mapper/ExamSubjectChoicesMapper.xml
@@ -82,4 +82,11 @@
     <delete id="removeBySubjectId">
         delete from exam_subject_option where subject_choices_id = #{id}
     </delete>
+
+    <select id="getExamSubjectChoicesList" resultType="java.lang.String" >
+        SELECT id FROM ( SELECT * FROM exam_subject_choices WHERE choices_type = 0 ORDER BY RAND( ) LIMIT 50 ) a UNION ALL
+        SELECT id FROM ( SELECT * FROM exam_subject_choices WHERE choices_type = 1 ORDER BY RAND( ) LIMIT 20 ) b UNION ALL
+        SELECT id FROM ( SELECT * FROM exam_subject_choices WHERE choices_type = 2 ORDER BY RAND( ) LIMIT 40 ) c UNION ALL
+        SELECT id FROM ( SELECT * FROM exam_subject_choices WHERE choices_type = 3 ORDER BY RAND( ) LIMIT 10 ) d
+    </select>
 </mapper>
diff --git a/src/main/java/org/springblade/modules/exam/service/ExamSubjectChoicesService.java b/src/main/java/org/springblade/modules/exam/service/ExamSubjectChoicesService.java
index 7f7d595..75e7710 100644
--- a/src/main/java/org/springblade/modules/exam/service/ExamSubjectChoicesService.java
+++ b/src/main/java/org/springblade/modules/exam/service/ExamSubjectChoicesService.java
@@ -62,4 +62,10 @@
 	 * @return
 	 */
     Integer getAnswerResult(Long preSubJectId, String preResult,Long scoreId);
+
+	/**
+	 * 随机查询题库120道
+	 * @return
+	 */
+	List<String> getExamSubjectChoicesList();
 }
diff --git a/src/main/java/org/springblade/modules/exam/service/impl/ExamPaperServiceImpl.java b/src/main/java/org/springblade/modules/exam/service/impl/ExamPaperServiceImpl.java
index 7bd3708..ef9ce98 100644
--- a/src/main/java/org/springblade/modules/exam/service/impl/ExamPaperServiceImpl.java
+++ b/src/main/java/org/springblade/modules/exam/service/impl/ExamPaperServiceImpl.java
@@ -18,6 +18,7 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import liquibase.pro.packaged.L;
 import org.springblade.common.utils.TimeSwitchUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.modules.apply.entity.Apply;
@@ -27,6 +28,8 @@
 import org.springblade.modules.exam.vo.*;
 import org.springblade.modules.training.entity.TrainingRegistration;
 import org.springblade.modules.training.service.TrainingRegistrationService;
+import org.springblade.modules.vip.entity.VipTopic;
+import org.springblade.modules.vip.service.VipTopicService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -43,7 +46,7 @@
 public class ExamPaperServiceImpl extends ServiceImpl<ExamPaperMapper, ExamPaper> implements ExamPaperService {
 
 	@Autowired
-	private ExamExaminationSubjectService examExaminationSubjectService;
+	private VipTopicService vipTopicService;
 
 	@Autowired
 	private ExamAnswerRecordService examAnswerRecordService;
@@ -53,6 +56,9 @@
 
 	@Autowired
 	private ExamScoreService examScoreService;
+
+	@Autowired
+	private TrainingRegistrationService trainingRegistrationService;
 
 
 
@@ -111,8 +117,45 @@
 	public List<ExamSubjectChoicesVO> queryRandomSubject(ExamPaperVO paper) {
 		//保存题目信息
 		if (null!=paper.getScoreId()){
-			//随机分类信息
-			List<ExamSubjectChoicesVO> examSubjectChoicesVOS = baseMapper.queryRandomSubject(paper);
+			//查询该保安员是否为会员
+			ExamScore score = examScoreService.getById(paper.getScoreId());
+			TrainingRegistration trainingRegistration = trainingRegistrationService.getById(score.getApplyId());
+
+			List<ExamSubjectChoicesVO> examSubjectChoicesVOS = new ArrayList<>();
+			if (null!=trainingRegistration.getVipStatus()){
+				//如果是会员,从会员库里取题目
+				if (trainingRegistration.getVipStatus().equals(1)){
+					//查询该vip 用户的 vip 库,从该120题中取出题目
+					VipTopic vipTopic = new VipTopic();
+					vipTopic.setUserId(Long.parseLong(score.getUserId()));
+					vipTopic.setApplyId(score.getApplyId());
+					VipTopic topic = vipTopicService.getOne(Condition.getQueryWrapper(vipTopic));
+					if (null!=topic){
+						List<String> list = Arrays.asList(topic.getTopicIds().split(","));
+//						System.out.println("list.size() = " + list.size());
+						List<String> radio = list.subList(0, 49);
+						List<String> checkbox = list.subList(50, 69);
+						List<String> judge = list.subList(70, 109);
+						List<String> sort = list.subList(110, 119);
+						//随机题目
+						List<ExamSubjectChoicesVO> radioRandomSubjectList = baseMapper.queryRandomSubjectList(radio,25);
+						List<ExamSubjectChoicesVO> checkboxRandomSubjectList = baseMapper.queryRandomSubjectList(checkbox,10);
+						List<ExamSubjectChoicesVO> judgeRandomSubjectList = baseMapper.queryRandomSubjectList(judge,20);
+						List<ExamSubjectChoicesVO> sortRandomSubjectList = baseMapper.queryRandomSubjectList(sort,5);
+						//合并集合数据
+						examSubjectChoicesVOS.addAll(radioRandomSubjectList);
+						examSubjectChoicesVOS.addAll(checkboxRandomSubjectList);
+						examSubjectChoicesVOS.addAll(judgeRandomSubjectList);
+						examSubjectChoicesVOS.addAll(sortRandomSubjectList);
+					}
+				}else {
+					//随机分类信息
+					examSubjectChoicesVOS = baseMapper.queryRandomSubject(paper);
+				}
+			}else {
+				//随机分类信息
+				examSubjectChoicesVOS = baseMapper.queryRandomSubject(paper);
+			}
 //			long before = System.currentTimeMillis();
 			List<ExamExaminationSubject> list = new ArrayList<>();
 			examSubjectChoicesVOS.forEach(examSubjectChoicesVO -> {
diff --git a/src/main/java/org/springblade/modules/exam/service/impl/ExamSubjectChoicesServiceImpl.java b/src/main/java/org/springblade/modules/exam/service/impl/ExamSubjectChoicesServiceImpl.java
index ec41545..f94719f 100644
--- a/src/main/java/org/springblade/modules/exam/service/impl/ExamSubjectChoicesServiceImpl.java
+++ b/src/main/java/org/springblade/modules/exam/service/impl/ExamSubjectChoicesServiceImpl.java
@@ -393,4 +393,13 @@
 			"," + "'" + examAnswerRecord.getScoreId() + "'" + ")";
 		FtpUtil.sqlFileUpload(s);
 	}
+
+	/**
+	 * 随机查询题库120道
+	 * @return
+	 */
+	@Override
+	public List<String> getExamSubjectChoicesList() {
+		return baseMapper.getExamSubjectChoicesList();
+	}
 }
diff --git a/src/main/java/org/springblade/modules/system/controller/UserController.java b/src/main/java/org/springblade/modules/system/controller/UserController.java
index 801cf3e..f64dc8f 100644
--- a/src/main/java/org/springblade/modules/system/controller/UserController.java
+++ b/src/main/java/org/springblade/modules/system/controller/UserController.java
@@ -31,6 +31,7 @@
 import io.swagger.annotations.ApiParam;
 import com.alibaba.fastjson.JSON;
 import lombok.AllArgsConstructor;
+import net.sf.json.JSONObject;
 import org.apache.commons.codec.Charsets;
 import org.springblade.common.cache.DictCache;
 import org.springblade.common.config.FtpConfig;
@@ -38,6 +39,8 @@
 import org.springblade.common.excel.CustomCellWriteHeightConfig;
 import org.springblade.common.excel.CustomCellWriteWeightConfig;
 import org.springblade.common.excel.RowWriteHandler;
+import org.springblade.common.utils.HttpClientUtils;
+import org.springblade.common.utils.HttpReqUtil;
 import org.springblade.common.utils.ImageUtils;
 import org.springblade.common.utils.arg;
 import org.springblade.core.cache.utils.CacheUtil;
@@ -68,6 +71,7 @@
 import org.springblade.modules.securitypaper.service.SecurityPaperService;
 import org.springblade.modules.signinrecords.entity.SignInRecords;
 import org.springblade.modules.signinrecords.service.SignInRecordsService;
+import org.springblade.modules.system.dto.UserDTO;
 import org.springblade.modules.system.entity.Dept;
 import org.springblade.modules.system.entity.Role;
 import org.springblade.modules.system.entity.User;
@@ -76,11 +80,13 @@
 import org.springblade.modules.system.service.IDeptService;
 import org.springblade.modules.system.service.IRoleService;
 import org.springblade.modules.system.service.IUserService;
+import org.springblade.modules.system.service.MyAsyncService;
 import org.springblade.modules.system.vo.DeptVO;
 import org.springblade.modules.system.vo.UserVO;
 import org.springblade.modules.system.wrapper.UserWrapper;
 import org.springblade.modules.training.entity.TrainingRegistration;
 import org.springblade.modules.training.service.TrainingRegistrationService;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -134,6 +140,8 @@
 
 
 	private final SecurityPaperService securityPaperService;
+
+	private final MyAsyncService myAsyncService;
 
 	/**
 	 * 查询单条
@@ -1211,6 +1219,14 @@
 			user.setAvatar(FtpConfig.ip + user.getAvatar().substring(26));
 		}
 
+		//数据推送
+		//1.群访群控数据推送(异步)
+		if (status) {
+			myAsyncService.qfqkUserSave(user);
+		}
+
+
+		//2.内网数据推送
 		String s = "insert into blade_user(" +
 			"id,tenant_id,account,password,name,real_name,avatar,email,phone,sex," +
 			"role_id,dept_id,cardid,nativePlace,nation,fingerprint,education," +
diff --git a/src/main/java/org/springblade/modules/system/dto/UserDTO.java b/src/main/java/org/springblade/modules/system/dto/UserDTO.java
new file mode 100644
index 0000000..c548510
--- /dev/null
+++ b/src/main/java/org/springblade/modules/system/dto/UserDTO.java
@@ -0,0 +1,48 @@
+package org.springblade.modules.system.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 用户数据推送 DTO
+ * @author zhongrj
+ * @since 2022-02-22
+ */
+@Data
+public class UserDTO implements Serializable {
+	private Long id;
+
+	private String account;
+
+	/**
+	 * 密码
+	 */
+	private String password;
+
+	private String realName;
+
+	private String avatar;
+
+	private String email;
+
+	private String phone;
+
+	private Integer sex;
+
+	private String roleId;
+
+	private Integer status;
+
+	private Integer isDeleted;
+
+	private String examinationType;
+
+	private String examinationMx;
+
+	private String jurisdiction;
+
+	private String cardid;
+}
diff --git a/src/main/java/org/springblade/modules/system/service/MyAsyncService.java b/src/main/java/org/springblade/modules/system/service/MyAsyncService.java
new file mode 100644
index 0000000..637d6ed
--- /dev/null
+++ b/src/main/java/org/springblade/modules/system/service/MyAsyncService.java
@@ -0,0 +1,48 @@
+package org.springblade.modules.system.service;
+
+import net.sf.json.JSONObject;
+import org.springblade.common.utils.HttpClientUtils;
+import org.springblade.modules.system.dto.UserDTO;
+import org.springblade.modules.system.entity.User;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+
+import static org.springblade.common.config.FtpConfig.qfqkBaseApiUrl;
+
+@Service
+public class MyAsyncService {
+
+	/**
+	 * 用户新增
+	 * @param user
+	 */
+	@Async
+	public void qfqkUserSave(User user) {
+//		System.out.println("进入异步方法----------------------");
+//		try {
+//			Thread.sleep(30000);
+//		} catch (InterruptedException e) {
+//			e.printStackTrace();
+//		}
+		String requestUrl = qfqkBaseApiUrl + "/blade-user/securitySaves";
+		UserDTO userDTO = new UserDTO();
+		userDTO.setAccount(user.getAccount());
+		userDTO.setCardid(user.getCardid());
+		userDTO.setPassword(user.getPassword());
+		userDTO.setSex(user.getSex());
+		userDTO.setStatus(user.getStatus());
+		userDTO.setPhone(user.getPhone());
+		userDTO.setIsDeleted(user.getIsDeleted());
+		userDTO.setRealName(user.getRealName());
+		//装换为 json
+		JSONObject jsonObject = JSONObject.fromObject(userDTO);
+		//发送请求
+		try {
+			HttpClientUtils.httpPostWithjson(requestUrl,jsonObject.toString());
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/src/main/java/org/springblade/modules/training/controller/TrainingRegistrationController.java b/src/main/java/org/springblade/modules/training/controller/TrainingRegistrationController.java
index 06618f4..86a8c07 100644
--- a/src/main/java/org/springblade/modules/training/controller/TrainingRegistrationController.java
+++ b/src/main/java/org/springblade/modules/training/controller/TrainingRegistrationController.java
@@ -31,6 +31,9 @@
 import org.springblade.modules.training.excel.TrainingRegistrationImporter;
 import org.springblade.modules.training.service.TrainingRegistrationService;
 import org.springblade.modules.training.vo.TrainingRegistrationVo;
+import org.springblade.modules.vip.service.UserVipService;
+import org.springblade.modules.vip.service.VipTopicService;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -55,6 +58,10 @@
 	private final IUserService userService;
 
 	private final ExamPaperService examPaperService;
+
+	private final UserVipService userVipService;
+
+	private final VipTopicService vipTopicService;
 
 	/**
 	 * 自定义分页
@@ -714,4 +721,26 @@
 		}
 		return null;
 	}
+
+
+	/**
+	 * 是否为会员标记
+	 * @param trainingRegistration
+	 * @return
+	 */
+	@PostMapping("/vipSign")
+	@Transactional(rollbackFor = Exception.class)
+	public R vipSign(@RequestBody TrainingRegistration trainingRegistration){
+		//新增会员记录
+		userVipService.insertUserVipInfo(trainingRegistration);
+		//新增会员题库记录
+		vipTopicService.insertVipTopicInfo(trainingRegistration);
+		//内网报名信息同步
+		String s1 =
+			"update sys_training_registration set vip_status = " + "'" + trainingRegistration.getVipStatus() + "'"
+				+ " " + "where id = " + "'" + trainingRegistration.getId() + "'";
+		FtpUtil.sqlFileUpload(s1);
+		//更新并返回数据
+		return R.data(trainingRegistrationService.updateById(trainingRegistration));
+	}
 }
diff --git a/src/main/java/org/springblade/modules/training/entity/TrainingRegistration.java b/src/main/java/org/springblade/modules/training/entity/TrainingRegistration.java
index c640888..e2b57df 100644
--- a/src/main/java/org/springblade/modules/training/entity/TrainingRegistration.java
+++ b/src/main/java/org/springblade/modules/training/entity/TrainingRegistration.java
@@ -121,4 +121,9 @@
 	@TableField("audit_status")
 	private Integer auditStatus;
 
+	/**
+	 * vip 状态,是否为vip 1:是  2:否
+	 */
+	private Integer vipStatus;
+
 }
diff --git a/src/main/java/org/springblade/modules/vip/entity/UserVip.java b/src/main/java/org/springblade/modules/vip/entity/UserVip.java
index d60a482..cd9cfbe 100644
--- a/src/main/java/org/springblade/modules/vip/entity/UserVip.java
+++ b/src/main/java/org/springblade/modules/vip/entity/UserVip.java
@@ -64,7 +64,7 @@
 	/**
 	 * 报名id
 	 */
-	private Integer applyId;
+	private Long applyId;
 
 
 
diff --git a/src/main/java/org/springblade/modules/vip/entity/VipTopic.java b/src/main/java/org/springblade/modules/vip/entity/VipTopic.java
index 27d15aa..6c9edf7 100644
--- a/src/main/java/org/springblade/modules/vip/entity/VipTopic.java
+++ b/src/main/java/org/springblade/modules/vip/entity/VipTopic.java
@@ -28,9 +28,9 @@
 	private Long id;
 
     /**
-	 * 用户会员id
+	 * 用户id
 	 */
-	private Long userVipId;
+	private Long userId;
 
     /**
      * 题目id
@@ -44,6 +44,10 @@
 	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 	private Date createTime;
 
+	/**
+	 * 报名id
+	 */
+	private Long applyId;
 
 
 }
diff --git a/src/main/java/org/springblade/modules/vip/mapper/VipTopicMapper.xml b/src/main/java/org/springblade/modules/vip/mapper/VipTopicMapper.xml
index 336f619..70bb6bf 100644
--- a/src/main/java/org/springblade/modules/vip/mapper/VipTopicMapper.xml
+++ b/src/main/java/org/springblade/modules/vip/mapper/VipTopicMapper.xml
@@ -6,8 +6,8 @@
     <select id="selectVipTopicPage" resultType="org.springblade.modules.vip.vo.VipTopicVO">
         select * from sys_vip_topic
         where 1=1
-        <if test="vipTopic.userVipId!=null">
-            and user_vip_id =#{vipTopic.userVipId}
+        <if test="vipTopic.userId!=null">
+            and user_id =#{vipTopic.userId}
         </if>
     </select>
 
diff --git a/src/main/java/org/springblade/modules/vip/service/UserVipService.java b/src/main/java/org/springblade/modules/vip/service/UserVipService.java
index 0df3e46..3d61353 100644
--- a/src/main/java/org/springblade/modules/vip/service/UserVipService.java
+++ b/src/main/java/org/springblade/modules/vip/service/UserVipService.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.training.entity.TrainingRegistration;
 import org.springblade.modules.vip.entity.UserVip;
 import org.springblade.modules.vip.vo.UserVipVO;
 
@@ -23,4 +24,11 @@
 	 * @return
 	 */
 	IPage<UserVipVO> selectUserVipPage(IPage<UserVipVO> page, @Param("userVipVO") UserVipVO userVipVO);
+
+	/**
+	 * 新增会员信息
+	 * @param trainingRegistration
+	 * @return
+	 */
+    boolean insertUserVipInfo(TrainingRegistration trainingRegistration);
 }
diff --git a/src/main/java/org/springblade/modules/vip/service/VipTopicService.java b/src/main/java/org/springblade/modules/vip/service/VipTopicService.java
index ab7804a..10303f7 100644
--- a/src/main/java/org/springblade/modules/vip/service/VipTopicService.java
+++ b/src/main/java/org/springblade/modules/vip/service/VipTopicService.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.training.entity.TrainingRegistration;
 import org.springblade.modules.vip.entity.VipTopic;
 import org.springblade.modules.vip.vo.VipTopicVO;
 
@@ -23,4 +24,11 @@
 	 * @return
 	 */
 	IPage<VipTopicVO> selectVipTopicPage(IPage<VipTopicVO> page, @Param("vipTopicVO") VipTopicVO vipTopicVO);
+
+	/**
+	 * 新增会员题库
+	 * @param trainingRegistration
+	 * @return
+	 */
+    boolean insertVipTopicInfo(TrainingRegistration trainingRegistration);
 }
diff --git a/src/main/java/org/springblade/modules/vip/service/impl/UserVipServiceImpl.java b/src/main/java/org/springblade/modules/vip/service/impl/UserVipServiceImpl.java
index 1bf4d5a..ba1182c 100644
--- a/src/main/java/org/springblade/modules/vip/service/impl/UserVipServiceImpl.java
+++ b/src/main/java/org/springblade/modules/vip/service/impl/UserVipServiceImpl.java
@@ -3,11 +3,14 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.modules.training.entity.TrainingRegistration;
 import org.springblade.modules.vip.entity.UserVip;
 import org.springblade.modules.vip.mapper.UserVipMapper;
 import org.springblade.modules.vip.service.UserVipService;
 import org.springblade.modules.vip.vo.UserVipVO;
 import org.springframework.stereotype.Service;
+
+import java.util.Date;
 
 /**
  *  用户会员服务实现类
@@ -29,4 +32,23 @@
 	public IPage<UserVipVO> selectUserVipPage(IPage<UserVipVO> page, UserVipVO userVip) {
 		return page.setRecords(baseMapper.selectUserVipPage(page, userVip));
 	}
+
+	/**
+	 * 新增会员信息
+	 * @param trainingRegistration  报名信息对象
+	 * @since 2022-02-22
+	 * @return
+	 */
+	@Override
+	public boolean insertUserVipInfo(TrainingRegistration trainingRegistration) {
+		//1.创建用户会员对象
+		UserVip userVip = new UserVip();
+		//2.数据封装
+		userVip.setApplyId(trainingRegistration.getId());
+		userVip.setCreateTime(new Date());
+		userVip.setUpdateTime(new Date());
+		userVip.setUserId(Long.parseLong(trainingRegistration.getUserId()));
+		//3.返回
+		return this.save(userVip);
+	}
 }
diff --git a/src/main/java/org/springblade/modules/vip/service/impl/VipTopticServiceImpl.java b/src/main/java/org/springblade/modules/vip/service/impl/VipTopticServiceImpl.java
index fee9882..30cf57e 100644
--- a/src/main/java/org/springblade/modules/vip/service/impl/VipTopticServiceImpl.java
+++ b/src/main/java/org/springblade/modules/vip/service/impl/VipTopticServiceImpl.java
@@ -3,11 +3,18 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.modules.exam.service.ExamSubjectChoicesService;
+import org.springblade.modules.training.entity.TrainingRegistration;
 import org.springblade.modules.vip.entity.VipTopic;
 import org.springblade.modules.vip.mapper.VipTopicMapper;
 import org.springblade.modules.vip.service.VipTopicService;
 import org.springblade.modules.vip.vo.VipTopicVO;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  *  用户会员题库服务实现类
@@ -18,6 +25,9 @@
 @Service
 public class VipTopticServiceImpl extends ServiceImpl<VipTopicMapper, VipTopic> implements VipTopicService {
 
+	@Autowired
+	private ExamSubjectChoicesService examSubjectChoicesService;
+
 	/**
      * 自定义分页查询用户会员数据
 	 * @param page
@@ -28,4 +38,25 @@
 	public IPage<VipTopicVO> selectVipTopicPage(IPage<VipTopicVO> page, VipTopicVO vipTopic) {
 		return page.setRecords(baseMapper.selectVipTopicPage(page, vipTopic));
 	}
+
+	/**
+	 * 新增会员题库
+	 * @param trainingRegistration
+	 * @return
+	 */
+	@Override
+	public boolean insertVipTopicInfo(TrainingRegistration trainingRegistration) {
+		//1. 创建会员题库对象
+		VipTopic vipTopic = new VipTopic();
+		//2. 随机查询120道题目信息,只要题目 id 集合即可
+		List<String> list = examSubjectChoicesService.getExamSubjectChoicesList();
+		//3. 数据处理,封装
+		String collect = list.stream().collect(Collectors.joining(","));
+		vipTopic.setTopicIds(collect);
+		vipTopic.setApplyId(trainingRegistration.getId());
+		vipTopic.setCreateTime(new Date());
+		vipTopic.setUserId(Long.parseLong(trainingRegistration.getUserId()));
+		//4. 新增并返回
+		return this.save(vipTopic);
+	}
 }
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 4d72b61..9f6e2e4 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -50,6 +50,7 @@
   jsonUrl: /home/zhongsong/anbao/
   username: root
   password: ZHba@0112
+  qfqkBaseApiUrl : http://223.82.109.183:2082/api
 
 #第三方登陆
 social:
diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml
index 2019911..e3ec27c 100644
--- a/src/main/resources/application-test.yml
+++ b/src/main/resources/application-test.yml
@@ -50,6 +50,7 @@
   jsonUrl: D:\\anbao\\
   username: root
   password: ZHba@0112
+  qfqkBaseApiUrl : http://localhost:83
 
 #第三方登陆
 social:

--
Gitblit v1.9.3