{
+
+ /**
+ * 获取默认值
+ *
+ * @return 默认值
+ */
+ M getDefault();
+
+ /**
+ * 执行完整验证链
+ *
+ * preValid > updateFill > valid
+ *
+ * @param beforeModel beforeModel
+ * @param afterModel afterModel
+ */
+ void doValid(M beforeModel, M afterModel);
+
+ /**
+ * 解析数据
+ *
+ * @param serialModel serialModel
+ * @return model
+ */
+ M parse(String serialModel);
+
+ /**
+ * 转为视图配置
+ *
+ * @param model model
+ */
+ void toView(M model);
+
+ /**
+ * 转为视图配置
+ *
+ * @param serialModel serialModel
+ * @return model
+ */
+ M toView(String serialModel);
+
+}
diff --git a/modules/module-ci-terminal/src/main/java/cd/casic/module/terminal/common/GenericsStrategyDefinition.java b/modules/module-ci-terminal/src/main/java/cd/casic/module/terminal/common/GenericsStrategyDefinition.java
new file mode 100644
index 00000000..1e705776
--- /dev/null
+++ b/modules/module-ci-terminal/src/main/java/cd/casic/module/terminal/common/GenericsStrategyDefinition.java
@@ -0,0 +1,75 @@
+package cd.casic.module.terminal.common;
+
+import cd.casic.module.terminal.common.holder.SpringHolder;
+
+/**
+ * 标准数据定义
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2023/12/21 0:07
+ */
+@SuppressWarnings("unchecked")
+public interface GenericsStrategyDefinition {
+
+ /**
+ * 获取数据处理策略
+ *
+ * @return class
+ */
+ Class extends GenericsDataStrategy extends GenericsDataModel>> getStrategyClass();
+
+ /**
+ * 获取数据模型策略处理器
+ *
+ * @param Model
+ * @param Strategy
+ * @return Strategy Bean
+ */
+ default > S getStrategy() {
+ return (S) SpringHolder.getBean(this.getStrategyClass());
+ }
+
+ /**
+ * 获取默认值
+ *
+ * @param model
+ * @return model
+ */
+ default M getDefault() {
+ return (M) this.getStrategy().getDefault();
+ }
+
+ /**
+ * 执行完整验证链
+ *
+ * @param beforeModel beforeModel
+ * @param afterModel afterModel
+ */
+ default void doValid(GenericsDataModel beforeModel, GenericsDataModel afterModel) {
+ this.getStrategy().doValid(beforeModel, afterModel);
+ }
+
+ /**
+ * 反序列化对象
+ *
+ * @param serialModel serialModel
+ * @param model
+ * @return model
+ */
+ default M parse(String serialModel) {
+ return (M) this.getStrategy().parse(serialModel);
+ }
+
+ /**
+ * 转为视图对象
+ *
+ * @param serialModel serialModel
+ * @param model
+ * @return viewModel
+ */
+ default M toView(String serialModel) {
+ return (M) this.getStrategy().toView(serialModel);
+ }
+
+}
diff --git a/modules/module-ci-terminal/src/main/java/cd/casic/module/terminal/common/InitializingOperatorTypes.java b/modules/module-ci-terminal/src/main/java/cd/casic/module/terminal/common/InitializingOperatorTypes.java
new file mode 100644
index 00000000..280e11cb
--- /dev/null
+++ b/modules/module-ci-terminal/src/main/java/cd/casic/module/terminal/common/InitializingOperatorTypes.java
@@ -0,0 +1,38 @@
+
+package cd.casic.module.terminal.common;
+
+import cn.orionsec.kit.lang.utils.Arrays1;
+import jakarta.annotation.PostConstruct;
+import cd.casic.module.terminal.common.annotation.Module;
+
+
+/**
+ * 操作类型初始化器
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2023/10/13 17:45
+ */
+public abstract class InitializingOperatorTypes implements OperatorTypeDefinition {
+
+ @PostConstruct
+ public void init() {
+ // 获取模块注解
+ Module moduleDefinition = this.getClass().getAnnotation(Module.class);
+ if (moduleDefinition == null) {
+ return;
+ }
+ // 获取类型
+ OperatorType[] types = this.types();
+ if (Arrays1.isEmpty(types)) {
+ return;
+ }
+ // 定义类型
+ String module = moduleDefinition.value();
+ for (OperatorType type : types) {
+ type.setModule(module);
+ OperatorTypeHolder.set(type);
+ }
+ }
+
+}
diff --git a/modules/module-ci-terminal/src/main/java/cd/casic/module/terminal/common/OperatorLogModel.java b/modules/module-ci-terminal/src/main/java/cd/casic/module/terminal/common/OperatorLogModel.java
new file mode 100644
index 00000000..9738dd2c
--- /dev/null
+++ b/modules/module-ci-terminal/src/main/java/cd/casic/module/terminal/common/OperatorLogModel.java
@@ -0,0 +1,103 @@
+
+package cd.casic.module.terminal.common;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 操作日志模型
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2023/10/9 18:44
+ */
+@Data
+public class OperatorLogModel{
+
+ /**
+ * userId
+ */
+ private Long userId;
+
+ /**
+ * 用户名
+ */
+ private String username;
+
+ /**
+ * traceId
+ */
+ private String traceId;
+
+ /**
+ * 请求 ip
+ */
+ private String address;
+
+ /**
+ * 请求地址
+ */
+ private String location;
+
+ /**
+ * user-agent
+ */
+ private String userAgent;
+
+ /**
+ * 日志
+ */
+ private String logInfo;
+
+ /**
+ * 风险等级
+ */
+ private String riskLevel;
+
+ /**
+ * 模块
+ */
+ private String module;
+
+ /**
+ * 操作类型
+ */
+ private String type;
+
+ /**
+ * 参数
+ */
+ private String extra;
+
+ /**
+ * 操作结果 0失败 1成功
+ */
+ private Integer result;
+
+ /**
+ * 错误信息
+ */
+ private String errorMessage;
+
+ /**
+ * 返回值
+ */
+ private String returnValue;
+
+ /**
+ * 操作时间
+ */
+ private Integer duration;
+
+ /**
+ * 开始时间
+ */
+ private Date startTime;
+
+ /**
+ * 结束时间
+ */
+ private Date endTime;
+
+}
diff --git a/modules/module-ci-terminal/src/main/java/cd/casic/module/terminal/common/OperatorLogs.java b/modules/module-ci-terminal/src/main/java/cd/casic/module/terminal/common/OperatorLogs.java
new file mode 100644
index 00000000..c39b6025
--- /dev/null
+++ b/modules/module-ci-terminal/src/main/java/cd/casic/module/terminal/common/OperatorLogs.java
@@ -0,0 +1,193 @@
+
+package cd.casic.module.terminal.common;
+
+import cd.casic.framework.security.core.LoginUser;
+import cn.orionsec.kit.lang.utils.Exceptions;
+import cn.orionsec.kit.lang.utils.Strings;
+import cn.orionsec.kit.lang.utils.collect.Maps;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializeFilter;
+import java.util.Map;
+
+/**
+ * 操作日志工具类
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2023/10/10 11:32
+ */
+public class OperatorLogs implements ExtraFieldConst {
+
+ private static final String UN_SAVE_FLAG = "__un__save__";
+
+ private static SerializeFilter[] serializeFilters;
+
+ /**
+ * 拓展信息
+ */
+ private static final ThreadLocal