diff --git a/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/anno/DdkAfterCall.java b/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/anno/DdkAfterCall.java
new file mode 100644
index 0000000000000000000000000000000000000000..9cdc6b8f09feafbe7440c60b5d18bec7f66d8b32
--- /dev/null
+++ b/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/anno/DdkAfterCall.java
@@ -0,0 +1,17 @@
+package cn.icanci.ddk.admin.dal.anno;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 通知方法调用之后的操作
+ *
+ * @author icanci(1205068)
+ * @version Id: DdkBeforeCall, v 0.1 2022/12/14 00:44 icanci Exp $
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface DdkAfterCall {
+}
diff --git a/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/anno/DdkBeforeCall.java b/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/anno/DdkBeforeCall.java
new file mode 100644
index 0000000000000000000000000000000000000000..0ddfd04ce27a1dc2db2cc96a86e76c6ee2688e9c
--- /dev/null
+++ b/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/anno/DdkBeforeCall.java
@@ -0,0 +1,17 @@
+package cn.icanci.ddk.admin.dal.anno;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 通知方法调用之前的操作
+ *
+ * @author icanci(1205068)
+ * @version Id: DdkBeforeCall, v 0.1 2022/12/14 00:44 icanci Exp $
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface DdkBeforeCall {
+}
diff --git a/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/anno/DdkCall.java b/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/anno/DdkCall.java
new file mode 100644
index 0000000000000000000000000000000000000000..8aa54d064c68b86c6f8afd078cdddac535c02e63
--- /dev/null
+++ b/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/anno/DdkCall.java
@@ -0,0 +1,17 @@
+package cn.icanci.ddk.admin.dal.anno;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 通知方法调用操作
+ *
+ * @author icanci(1205068)
+ * @version Id: DdkBeforeCall, v 0.1 2022/12/14 00:44 icanci Exp $
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface DdkCall {
+}
diff --git a/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/anno/DdkValue.java b/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/anno/DdkValue.java
new file mode 100644
index 0000000000000000000000000000000000000000..3eb657558b42d6c387d3cfc77382d60dcae9a9f6
--- /dev/null
+++ b/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/anno/DdkValue.java
@@ -0,0 +1,23 @@
+package cn.icanci.ddk.admin.dal.anno;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 值注解,作用在字段上
+ *
+ * @author icanci(1205068)
+ * @version Id: DdkBeforeCall, v 0.1 2022/12/14 00:44 icanci Exp $
+ */
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface DdkValue {
+ /**
+ * 配置字典值
+ *
+ * @return 返回配置字典值
+ */
+ String value();
+}
diff --git a/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/model/AppConfigDO.java b/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/model/AppConfigDO.java
new file mode 100644
index 0000000000000000000000000000000000000000..9242e9e861a0b4b5619af67abaf09070f8aa88d4
--- /dev/null
+++ b/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/model/AppConfigDO.java
@@ -0,0 +1,64 @@
+package cn.icanci.ddk.admin.dal.model;
+
+import java.util.StringJoiner;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2022/12/11 17:44
+ */
+public class AppConfigDO extends BaseDO {
+ /**
+ * 配置名称
+ */
+ private String appConfigName;
+ /**
+ * 配置值
+ */
+ private String appConfigValue;
+ /**
+ * 配置类型
+ */
+ private String appConfigType;
+ /**
+ * 项目关联uuid
+ */
+ private String appUuid;
+
+ public String getAppConfigName() {
+ return appConfigName;
+ }
+
+ public void setAppConfigName(String appConfigName) {
+ this.appConfigName = appConfigName;
+ }
+
+ public String getAppConfigValue() {
+ return appConfigValue;
+ }
+
+ public void setAppConfigValue(String appConfigValue) {
+ this.appConfigValue = appConfigValue;
+ }
+
+ public String getAppConfigType() {
+ return appConfigType;
+ }
+
+ public void setAppConfigType(String appConfigType) {
+ this.appConfigType = appConfigType;
+ }
+
+ public String getAppUuid() {
+ return appUuid;
+ }
+
+ public void setAppUuid(String appUuid) {
+ this.appUuid = appUuid;
+ }
+
+ @Override
+ public String toString() {
+ return new StringJoiner(",").add("appConfigName=" + appConfigName).add("appConfigValue=" + appConfigValue).add("appConfigType=" + appConfigType).add("appUuid=" + appUuid)
+ .toString();
+ }
+}
diff --git a/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/model/AppDO.java b/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/model/AppDO.java
new file mode 100644
index 0000000000000000000000000000000000000000..09ea9200ea17da2082b3986871e0f946516ffb6e
--- /dev/null
+++ b/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/model/AppDO.java
@@ -0,0 +1,53 @@
+package cn.icanci.ddk.admin.dal.model;
+
+import java.util.StringJoiner;
+
+/**
+ * 项目组项目
+ *
+ * @author icanci
+ * @since 1.0 Created in 2022/12/11 17:42
+ */
+public class AppDO extends BaseDO {
+ /**
+ * 项目id,全局唯一
+ */
+ private String appUniqueId;
+ /**
+ * 项目名字
+ */
+ private String appName;
+ /**
+ * 项目组关联uuid
+ */
+ private String teamUuid;
+
+ public String getAppUniqueId() {
+ return appUniqueId;
+ }
+
+ public void setAppUniqueId(String appUniqueId) {
+ this.appUniqueId = appUniqueId;
+ }
+
+ public String getAppName() {
+ return appName;
+ }
+
+ public void setAppName(String appName) {
+ this.appName = appName;
+ }
+
+ public String getTeamUuid() {
+ return teamUuid;
+ }
+
+ public void setTeamUuid(String teamUuid) {
+ this.teamUuid = teamUuid;
+ }
+
+ @Override
+ public String toString() {
+ return new StringJoiner(",").add("appUniqueId=" + appUniqueId).add("appName=" + appName).add("teamUuid=" + teamUuid).toString();
+ }
+}
diff --git a/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/model/BaseDO.java b/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/model/BaseDO.java
new file mode 100644
index 0000000000000000000000000000000000000000..34b0de36724a21f24d675aea46df99705568fd07
--- /dev/null
+++ b/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/model/BaseDO.java
@@ -0,0 +1,113 @@
+package cn.icanci.ddk.admin.dal.model;
+
+import java.util.Date;
+import java.util.StringJoiner;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 基础模型
+ *
+ * @author icanci
+ * @since 1.0 Created in 2022/12/11 17:37
+ */
+public class BaseDO {
+ /**
+ * 数据库id
+ */
+ private Long id;
+
+ /**
+ * 雪花算法随机UUID
+ */
+ private String uuid;
+
+ /**
+ * 功能描述
+ */
+ private String desc;
+
+ /**
+ * 创建时间
+ */
+ @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date createTime;
+
+ /**
+ * 更新时间
+ */
+ @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date updateTime;
+
+ /**
+ * 状态 0有效,1无效
+ */
+ private int isDelete;
+
+ /**
+ * 环境
+ */
+ private String env;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getUuid() {
+ return uuid;
+ }
+
+ public void setUuid(String uuid) {
+ this.uuid = uuid;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public void setDesc(String desc) {
+ this.desc = desc;
+ }
+
+ public Date getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(Date createTime) {
+ this.createTime = createTime;
+ }
+
+ public Date getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(Date updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ public int getIsDelete() {
+ return isDelete;
+ }
+
+ public void setIsDelete(int isDelete) {
+ this.isDelete = isDelete;
+ }
+
+ public String getEnv() {
+ return env;
+ }
+
+ public void setEnv(String env) {
+ this.env = env;
+ }
+
+ @Override
+ public String toString() {
+ return new StringJoiner(",").add("id=" + id).add("uuid=" + uuid).add("desc=" + desc).add("createTime=" + createTime).add("updateTime=" + updateTime)
+ .add("isDelete=" + isDelete).add("env=" + env).toString();
+ }
+}
diff --git a/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/model/GroupDO.java b/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/model/GroupDO.java
new file mode 100644
index 0000000000000000000000000000000000000000..10bc6e823319eb2377753a083d070274cb57cd5d
--- /dev/null
+++ b/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/model/GroupDO.java
@@ -0,0 +1,41 @@
+package cn.icanci.ddk.admin.dal.model;
+
+import java.util.StringJoiner;
+
+/**
+ * 事业群
+ *
+ * @author icanci
+ * @since 1.0 Created in 2022/12/11 17:39
+ */
+public class GroupDO extends BaseDO {
+ /**
+ * 事业群组id,唯一
+ */
+ private String groupId;
+ /**
+ * 事业群组名字
+ */
+ private String groupName;
+
+ public String getGroupId() {
+ return groupId;
+ }
+
+ public void setGroupId(String groupId) {
+ this.groupId = groupId;
+ }
+
+ public String getGroupName() {
+ return groupName;
+ }
+
+ public void setGroupName(String groupName) {
+ this.groupName = groupName;
+ }
+
+ @Override
+ public String toString() {
+ return new StringJoiner(",").add("groupId=" + groupId).add("groupName=" + groupName).toString();
+ }
+}
diff --git a/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/model/NoticeConfigDO.java b/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/model/NoticeConfigDO.java
new file mode 100644
index 0000000000000000000000000000000000000000..4f5ec0f32fcccc10a5239dac55c31a9cde4110c1
--- /dev/null
+++ b/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/model/NoticeConfigDO.java
@@ -0,0 +1,64 @@
+package cn.icanci.ddk.admin.dal.model;
+
+import java.util.StringJoiner;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2022/12/11 17:46
+ */
+public class NoticeConfigDO extends BaseDO {
+ /**
+ * 通知配置名称
+ */
+ private String noticeConfigName;
+ /**
+ * 通知配置资源
+ */
+ private String noticeConfigResource;
+ /**
+ * 测试配置值,可选;因为可能通过配置值进行特殊处理
+ */
+ private String noticeTestValue;
+ /**
+ * 项目关联uuid,多个以,分割
+ */
+ private String appUuids;
+
+ public String getNoticeConfigName() {
+ return noticeConfigName;
+ }
+
+ public void setNoticeConfigName(String noticeConfigName) {
+ this.noticeConfigName = noticeConfigName;
+ }
+
+ public String getNoticeConfigResource() {
+ return noticeConfigResource;
+ }
+
+ public void setNoticeConfigResource(String noticeConfigResource) {
+ this.noticeConfigResource = noticeConfigResource;
+ }
+
+ public String getNoticeTestValue() {
+ return noticeTestValue;
+ }
+
+ public void setNoticeTestValue(String noticeTestValue) {
+ this.noticeTestValue = noticeTestValue;
+ }
+
+ public String getAppUuids() {
+ return appUuids;
+ }
+
+ public void setAppUuids(String appUuids) {
+ this.appUuids = appUuids;
+ }
+
+ @Override
+ public String toString() {
+ return new StringJoiner(",").add("noticeConfigName=" + noticeConfigName).add("noticeConfigResource=" + noticeConfigResource).add("noticeTestValue=" + noticeTestValue)
+ .add("appUuids=" + appUuids).toString();
+ }
+}
diff --git a/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/model/RegisterDO.java b/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/model/RegisterDO.java
new file mode 100644
index 0000000000000000000000000000000000000000..7d74ee23f1765ff7bbfb34194b4821758d0c0ed1
--- /dev/null
+++ b/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/model/RegisterDO.java
@@ -0,0 +1,81 @@
+package cn.icanci.ddk.admin.dal.model;
+
+import java.util.Date;
+import java.util.StringJoiner;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2022/11/22 21:35
+ */
+public class RegisterDO extends BaseDO {
+ /**
+ * SDK 服务ip地址
+ */
+ private String clientAddress;
+ /**
+ * SDK 服务端口地址
+ */
+ private Integer clientPort;
+ /**
+ * SDK 服务服务唯一标识
+ */
+ private String appUniqueId;
+ /**
+ * 服务注册时间
+ */
+ private Date registerTime;
+ /**
+ * 上次注册更新时间
+ */
+ private Date lastUpdateTime;
+
+ public String getClientAddress() {
+ return clientAddress;
+ }
+
+ public void setClientAddress(String clientAddress) {
+ this.clientAddress = clientAddress;
+ }
+
+ public int getClientPort() {
+ return clientPort;
+ }
+
+ public void setClientPort(int clientPort) {
+ this.clientPort = clientPort;
+ }
+
+ public void setClientPort(Integer clientPort) {
+ this.clientPort = clientPort;
+ }
+
+ public String getAppUniqueId() {
+ return appUniqueId;
+ }
+
+ public void setAppUniqueId(String appUniqueId) {
+ this.appUniqueId = appUniqueId;
+ }
+
+ public Date getRegisterTime() {
+ return registerTime;
+ }
+
+ public void setRegisterTime(Date registerTime) {
+ this.registerTime = registerTime;
+ }
+
+ public Date getLastUpdateTime() {
+ return lastUpdateTime;
+ }
+
+ public void setLastUpdateTime(Date lastUpdateTime) {
+ this.lastUpdateTime = lastUpdateTime;
+ }
+
+ @Override
+ public String toString() {
+ return new StringJoiner(",").add("clientAddress=" + clientAddress).add("clientPort=" + clientPort).add("appUniqueId=" + appUniqueId).add("registerTime=" + registerTime)
+ .add("lastUpdateTime=" + lastUpdateTime).toString();
+ }
+}
diff --git a/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/model/TeamDO.java b/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/model/TeamDO.java
new file mode 100644
index 0000000000000000000000000000000000000000..0ecc889fbe98ee2850eca8e71977ef20d7e6a8dd
--- /dev/null
+++ b/admin/admin-dal/src/main/java/cn/icanci/ddk/admin/dal/model/TeamDO.java
@@ -0,0 +1,53 @@
+package cn.icanci.ddk.admin.dal.model;
+
+import java.util.StringJoiner;
+
+/**
+ * 项目组
+ *
+ * @author icanci
+ * @since 1.0 Created in 2022/12/11 17:40
+ */
+public class TeamDO extends BaseDO {
+ /**
+ * 项目组id,唯一
+ */
+ private String teamId;
+ /**
+ * 项目组名字
+ */
+ private String teamName;
+ /**
+ * 事业群关联uuid
+ */
+ private String groupUuid;
+
+ public String getTeamId() {
+ return teamId;
+ }
+
+ public void setTeamId(String teamId) {
+ this.teamId = teamId;
+ }
+
+ public String getTeamName() {
+ return teamName;
+ }
+
+ public void setTeamName(String teamName) {
+ this.teamName = teamName;
+ }
+
+ public String getGroupUuid() {
+ return groupUuid;
+ }
+
+ public void setGroupUuid(String groupUuid) {
+ this.groupUuid = groupUuid;
+ }
+
+ @Override
+ public String toString() {
+ return new StringJoiner(",").add("teamId=" + teamId).add("teamName=" + teamName).add("groupUuid=" + groupUuid).toString();
+ }
+}
diff --git a/client/pom.xml b/client/pom.xml
index 67e94c1e10cdd6821d480254188576af79a5c8c6..6a97559530af54dda8ef4aa1d1aa9e1252d91f6b 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -16,4 +16,47 @@
8
+
+
+ cn.icanci.ddk
+ ddk-common
+ ${parent.version}
+
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ compile
+ true
+
+
+ org.apache.commons
+ commons-lang3
+
+
+ org.apache.commons
+ commons-collections4
+
+
+ com.google.guava
+ guava
+
+
+ io.netty
+ netty-all
+
+
\ No newline at end of file