diff --git a/ccic-exam/.gitignore b/ccic-exam/.gitignore
new file mode 100644
index 0000000..2ac6eab
--- /dev/null
+++ b/ccic-exam/.gitignore
@@ -0,0 +1,10 @@
+#windows
+.idea
+target
+ccic-exam.iml
+*.log
+#屏蔽配置文件
+src/test/java/demo/CodeGenerator.java
+src/main/resources/dev.application.yml
+#mac
+.DS_Store
diff --git a/ccic-exam/pom.xml b/ccic-exam/pom.xml
new file mode 100644
index 0000000..db9f844
--- /dev/null
+++ b/ccic-exam/pom.xml
@@ -0,0 +1,190 @@
+
+
+ 4.0.0
+
+ ccic-emam
+ 1.0-SNAPSHOT
+
+
+ com.ccic.safeliab
+ cloud-dependencies
+ 1.0
+
+
+
+
+
+
+ org.yaml
+ snakeyaml
+ 2.3-ccic
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+ com.ccic.safeliab
+ cloud-starter
+ 1.0
+
+
+ com.ccic.safeliab
+ ccic-entity
+ 1.0-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-tomcat
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-undertow
+
+
+ io.undertow
+ undertow-servlet
+
+
+
+
+ org.projectlombok
+ lombok
+ provided
+
+
+
+ ch.qos.logback
+ logback-core
+
+
+ ch.qos.logback
+ logback-classic
+
+
+
+
+
+
+
+
+
+
+ org.apache.velocity
+ velocity-engine-core
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+
+ com.zaxxer
+ HikariCP
+ runtime
+
+
+
+ mysql
+ mysql-connector-java
+ runtime
+
+
+
+ com.alibaba
+ fastjson
+
+
+
+ junit
+ junit
+ test
+
+
+
+ com.kingbase8
+ kingbase8
+ 8.6.0
+
+
+
+ org.owasp.esapi
+ esapi
+ 2.2.0.0
+
+
+
+ org.jsoup
+ jsoup
+ 1.9.2
+
+
+
+ xml-apis
+ xml-apis
+ 1.4.01
+
+
+
+ com.bes.appserv-web
+ bes-lite-spring-boot-2.x-starter
+ 9.5.2.008
+
+
+
+ cn.hutool
+ hutool-all
+ 5.7.16
+
+
+
+
+ org.apache.commons
+ commons-pool2
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/ccic-exam/src/main/java/com/ccic/safeliab/ExamApplication.java b/ccic-exam/src/main/java/com/ccic/safeliab/ExamApplication.java
new file mode 100644
index 0000000..792656f
--- /dev/null
+++ b/ccic-exam/src/main/java/com/ccic/safeliab/ExamApplication.java
@@ -0,0 +1,13 @@
+package com.ccic.safeliab;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ExamApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ExamApplication.class, args);
+ }
+
+}
diff --git a/ccic-exam/src/main/java/com/ccic/safeliab/dao/DemoMapper.java b/ccic-exam/src/main/java/com/ccic/safeliab/dao/DemoMapper.java
new file mode 100644
index 0000000..e87c0fc
--- /dev/null
+++ b/ccic-exam/src/main/java/com/ccic/safeliab/dao/DemoMapper.java
@@ -0,0 +1,9 @@
+package com.ccic.safeliab.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ccic.safeliab.entity.InsDemo;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DemoMapper extends BaseMapper {
+}
\ No newline at end of file
diff --git a/ccic-exam/src/main/java/com/ccic/safeliab/filter/RedisConfiguration.java b/ccic-exam/src/main/java/com/ccic/safeliab/filter/RedisConfiguration.java
new file mode 100644
index 0000000..9e034f3
--- /dev/null
+++ b/ccic-exam/src/main/java/com/ccic/safeliab/filter/RedisConfiguration.java
@@ -0,0 +1,102 @@
+package com.ccic.safeliab.filter;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
+import io.lettuce.core.ReadFrom;
+import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.connection.RedisSentinelConfiguration;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+import java.text.SimpleDateFormat;
+import java.util.HashSet;
+
+/**
+ * @author 89524
+ * @ClassName RedisConfiguration
+ * @description: TODO redis哨兵配置
+ * @date 2023年09月18日
+ * @version: 1.0
+ */
+@Configuration
+public class RedisConfiguration {
+
+ /**
+ * 配置redis序列化json
+ *
+ * @param redisConnectionFactory
+ * @return
+ */
+ @Bean
+ @Primary //若有相同类型的Bean时,优先使用此注解标注的Bean
+ public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
+ // 为了开发方便,一般直接使用
+ RedisTemplate template = new RedisTemplate<>();
+ template.setConnectionFactory(redisConnectionFactory);
+
+ // 配置具体的序列化方式
+ // JSON解析任意对象
+ Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
+ ObjectMapper om = new ObjectMapper();
+ // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
+ om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+ // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
+ om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
+ // 设置日期格式
+ om.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
+ jackson2JsonRedisSerializer.setObjectMapper(om);
+ // String的序列化
+ StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
+
+
+ //key采用String的序列化
+ template.setKeySerializer(stringRedisSerializer);
+ //hash的key也采用String的序列化
+ template.setHashKeySerializer(stringRedisSerializer);
+ //value的序列化方式采用jackson
+ template.setValueSerializer(jackson2JsonRedisSerializer);
+ //hash的value序列化方式采用jackson
+ template.setHashValueSerializer(jackson2JsonRedisSerializer);
+ //设置所有配置
+ template.afterPropertiesSet();
+
+ return template;
+ }
+
+ /**
+ * 配置读写分离 redis没有放开集群配置,没用,会报错!
+ * @param redisProperties
+ * @return
+ */
+ /*@Bean
+ public RedisConnectionFactory lettuceConnectionFactory(RedisProperties redisProperties) {
+ // 配置哨兵节点以及主节点
+ RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration(
+ redisProperties.getSentinel().getMaster(), new HashSet<>(redisProperties.getSentinel().getNodes())
+ );
+
+ // 配置读写分离
+ LettucePoolingClientConfiguration lettuceClientConfiguration = LettucePoolingClientConfiguration.builder()
+ // 读写分离,这里的ReadFrom是配置Redis的读取策略,是一个枚举,包括下面选择
+ // MASTER 仅读取主节点
+ // MASTER_PREFERRED 优先读取主节点,如果主节点不可用,则读取从节点
+ // REPLICA_PREFERRED 优先读取从节点,如果从节点不可用,则读取主节点
+ // REPLICA 仅读取从节点
+ // NEAREST 从最近节点读取
+ // ANY 从任意一个从节点读取
+ .readFrom(ReadFrom.REPLICA_PREFERRED)
+ .build();
+
+ return new LettuceConnectionFactory(redisSentinelConfiguration, lettuceClientConfiguration);
+ }*/
+
+}
diff --git a/ccic-exam/src/main/java/com/ccic/safeliab/filter/RedisUtil.java b/ccic-exam/src/main/java/com/ccic/safeliab/filter/RedisUtil.java
new file mode 100644
index 0000000..afbb26d
--- /dev/null
+++ b/ccic-exam/src/main/java/com/ccic/safeliab/filter/RedisUtil.java
@@ -0,0 +1,588 @@
+package com.ccic.safeliab.filter;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public final class RedisUtil {
+
+ @Autowired
+ private RedisTemplate redisTemplate;
+
+ // =============================common============================
+
+ /**
+ * 指定缓存失效时间
+ *
+ * @param key 键
+ * @param time 时间(秒)
+ */
+ public boolean expire(String key, long time) {
+ try {
+ if (time > 0) {
+ redisTemplate.expire(key, time, TimeUnit.SECONDS);
+ }
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ /**
+ * 根据key 获取过期时间
+ *
+ * @param key 键 不能为null
+ * @return 时间(秒) 返回0代表为永久有效
+ */
+ public long getExpire(String key) {
+ return redisTemplate.getExpire(key, TimeUnit.SECONDS);
+ }
+
+
+ /**
+ * 判断key是否存在
+ *
+ * @param key 键
+ * @return true 存在 false不存在
+ */
+ public boolean hasKey(String key) {
+ try {
+ return redisTemplate.hasKey(key);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+
+ /**
+ * 删除缓存
+ *
+ * @param key 可以传一个值 或多个
+ */
+ @SuppressWarnings("unchecked")
+ public void del(String... key) {
+ if (key != null && key.length > 0) {
+ if (key.length == 1) {
+ redisTemplate.delete(key[0]);
+ } else {
+ redisTemplate.delete(CollectionUtils.arrayToList(key));
+ }
+ }
+ }
+
+
+ // ============================String=============================
+
+ /**
+ * 普通缓存获取
+ *
+ * @param key 键
+ * @return 值
+ */
+ public Object get(String key) {
+ return key == null ? null : redisTemplate.opsForValue().get(key);
+ }
+
+ /**
+ * 普通缓存放入
+ *
+ * @param key 键
+ * @param value 值
+ * @return true成功 false失败
+ */
+
+ public boolean set(String key, Object value) {
+ try {
+ redisTemplate.opsForValue().set(key, value);
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+
+ /**
+ * 普通缓存放入并设置时间
+ *
+ * @param key 键
+ * @param value 值
+ * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
+ * @return true成功 false 失败
+ */
+
+ public boolean set(String key, Object value, long time) {
+ try {
+ if (time > 0) {
+ redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
+ } else {
+ set(key, value);
+ }
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+
+ /**
+ * 递增
+ *
+ * @param key 键
+ * @param delta 要增加几(大于0)
+ */
+ public long incr(String key, long delta) {
+ if (delta < 0) {
+ throw new RuntimeException("递增因子必须大于0");
+ }
+ return redisTemplate.opsForValue().increment(key, delta);
+ }
+
+
+ /**
+ * 递减
+ *
+ * @param key 键
+ * @param delta 要减少几(小于0)
+ */
+ public long decr(String key, long delta) {
+ if (delta < 0) {
+ throw new RuntimeException("递减因子必须大于0");
+ }
+ return redisTemplate.opsForValue().increment(key, -delta);
+ }
+
+
+ // ================================Map=================================
+
+ /**
+ * HashGet
+ *
+ * @param key 键 不能为null
+ * @param item 项 不能为null
+ */
+ public Object hget(String key, String item) {
+ return redisTemplate.opsForHash().get(key, item);
+ }
+
+ /**
+ * 获取hashKey对应的所有键值
+ *
+ * @param key 键
+ * @return 对应的多个键值
+ */
+ public Map