diff --git a/sop-admin/sop-admin-front/assets/js/ApiUtil.js b/sop-admin/sop-admin-front/assets/js/ApiUtil.js
new file mode 100644
index 00000000..3917785e
--- /dev/null
+++ b/sop-admin/sop-admin-front/assets/js/ApiUtil.js
@@ -0,0 +1,31 @@
+/**
+ * 请求工具
+ */
+var ApiUtil = (function () {
+ // 接口URL,更改此处即可
+ var url = 'http://localhost:8082/api';
+ var URI_CHAR = '/';
+
+ function formatUri(uri) {
+ if (uri.substring(0, 1) !== URI_CHAR) {
+ uri = URI_CHAR + uri;
+ }
+ if (uri.substring(uri.length - 1) !== URI_CHAR) {
+ uri = uri + URI_CHAR;
+ }
+ return uri;
+ }
+
+ return {
+ post: function (uri, params, callback) {
+ uri = formatUri(uri);
+ sdk.post({
+ url: url + uri
+ , data: params // 请求参数
+ , callback: function (resp) { // 成功回调
+ callback(resp);
+ }
+ });
+ }
+ }
+})();
diff --git a/sop-admin/sop-admin-front/assets/lib/easyopen/index.html b/sop-admin/sop-admin-front/assets/lib/easyopen/index.html
new file mode 100644
index 00000000..e910b9f5
--- /dev/null
+++ b/sop-admin/sop-admin-front/assets/lib/easyopen/index.html
@@ -0,0 +1,136 @@
+
+
+
+
+sdk
+
+
+
+
+
+打开F12查看效果
+
+
+
+
+
+
+
+
+//需要发布到服务器上运行,并且server端需要处理跨域
+//在IndexController.java上加@CrossOrigin(origins={"*"})
+
+sdk.config({
+ url : 'http://localhost:8080/api'
+ ,app_key : 'test'
+ ,secret : '123456'
+});
+
+sdk.get({
+ name : 'goods.get' // 接口名
+ ,data : {'goods_name':'iphone'} // 请求参数
+ ,callback:function(resp) { // 成功回调
+ console.log(resp)
+ }
+}); // get方式不支持上传
+
+sdk.post({
+ name : 'goods.get' // 接口名
+ ,data : {'goods_name':'iphone'} // 请求参数
+ ,callback:function(resp) { // 成功回调
+ console.log(resp)
+ }
+});
+
+
+/* ****************上传文件**************** */
+<form id="frm">
+ 上传文件1:<input type="file" name="headImg"/>
+ 上传文件2:<input type="file" name="idcardImg"/>
+</form>
+
+function uploadTest() {
+ sdk.get({
+ name : 'file.upload' // 接口名
+ ,data : {'goods_name':'iphone'} // 请求参数
+ ,form : document.getElementById('frm')
+ ,callback:function(resp) { // 成功回调
+ if(resp.code == '0') {
+ alert('上传成功,' + resp.msg);
+ } else {
+ alert('上传失败,' + resp.msg)
+ }
+ }
+ });
+}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sop-admin/sop-admin-front/assets/lib/easyopen/sdk.js b/sop-admin/sop-admin-front/assets/lib/easyopen/sdk.js
new file mode 100644
index 00000000..f3760be0
--- /dev/null
+++ b/sop-admin/sop-admin-front/assets/lib/easyopen/sdk.js
@@ -0,0 +1,293 @@
+// MD5
+var hexcase=0;var b64pad="";var chrsz=8;function hex_md5(s){return binl2hex(core_md5(str2binl(s),s.length*chrsz))}function b64_md5(s){return binl2b64(core_md5(str2binl(s),s.length*chrsz))}function str_md5(s){return binl2str(core_md5(str2binl(s),s.length*chrsz))}function hex_hmac_md5(key,data){return binl2hex(core_hmac_md5(key,data))}function b64_hmac_md5(key,data){return binl2b64(core_hmac_md5(key,data))}function str_hmac_md5(key,data){return binl2str(core_hmac_md5(key,data))}function md5_vm_test(){return hex_md5("abc")=="900150983cd24fb0d6963f7d28e17f72"}function core_md5(x,len){x[len>>5]|=128<<((len)%32);x[(((len+64)>>>9)<<4)+14]=len;var a=1732584193;var b=-271733879;var c=-1732584194;var d=271733878;for(var i=0;i16){bkey=core_md5(bkey,key.length*chrsz)}var ipad=Array(16),opad=Array(16);for(var i=0;i<16;i++){ipad[i]=bkey[i]^909522486;opad[i]=bkey[i]^1549556828}var hash=core_md5(ipad.concat(str2binl(data)),512+data.length*chrsz);return core_md5(opad.concat(hash),512+128)}function safe_add(x,y){var lsw=(x&65535)+(y&65535);var msw=(x>>16)+(y>>16)+(lsw>>16);return(msw<<16)|(lsw&65535)}function bit_rol(num,cnt){return(num<>>(32-cnt))}function str2binl(str){var bin=Array();var mask=(1<>5]|=(str.charCodeAt(i/chrsz)&mask)<<(i%32)}return bin}function binl2str(bin){var str="";var mask=(1<>5]>>>(i%32))&mask)}return str}function binl2hex(binarray){var hex_tab=hexcase?"0123456789ABCDEF":"0123456789abcdef";var str="";for(var i=0;i>2]>>((i%4)*8+4))&15)+hex_tab.charAt((binarray[i>>2]>>((i%4)*8))&15)}return str}function binl2b64(binarray){var tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var str="";for(var i=0;i>2]>>8*(i%4))&255)<<16)|(((binarray[i+1>>2]>>8*((i+1)%4))&255)<<8)|((binarray[i+2>>2]>>8*((i+2)%4))&255);
+for(var j=0;j<4;j++){if(i*8+j*6>binarray.length*32){str+=b64pad}else{str+=tab.charAt((triplet>>6*(3-j))&63)}}}return str};
+/**
+//需要发布到服务器上运行,并且server端需要处理跨域
+//在IndexController.java上加@CrossOrigin(origins={"*"})
+
+sdk.config({
+ url : 'http://localhost:8080/api'
+ ,app_key : 'test'
+ ,secret : '123456'
+ ,jwt : 'xxx'
+});
+
+sdk.post({
+ name : 'goods.get' // 接口名
+// ,version:'1.0'
+// ,access_token:''
+ ,data : {'goods_name':'iphone'} // 请求参数
+ ,callback:function(resp) { // 成功回调
+ console.log(resp)
+ }
+});
+
+sdk.post({
+ name : 'goods.get' // 接口名
+ ,data : {'goods_name':'iphone'} // 请求参数
+ ,callback:function(resp) { // 成功回调
+ console.log(resp)
+ }
+});
+ */
+;(function(){
+
+ var config = {
+ url : 'http://127.0.0.1:8080/api'
+ ,app_key : 'test'
+ ,secret : '123456'
+ ,default_version : ''
+
+ ,api_name : "name"
+ ,version_name : "version"
+ ,app_key_name : "app_key"
+ ,data_name : "data"
+ ,timestamp_name : "timestamp"
+ ,sign_name : "sign"
+ ,format_name : "format"
+ ,access_token_name : "access_token"
+ ,jwt : ''
+ }
+
+ var DEFAULT_FORMAT = 'json';
+ var UPLOAD_FORM_DATA_NAME = 'body_data';
+ var CONTENT_TYPE_JSON = 'application/json';
+
+ var CONTENT_TYPE_KEY = 'Content-Type';
+ var POST_TYPE = 'POST';
+ var GET_TYPE = 'GET';
+
+ function copy(source, target) {
+ if (target && source && typeof source == 'object') {
+ for (var p in source) {
+ target[p] = source[p];
+ }
+ }
+ return target;
+ }
+
+ function add0(m){return m<10?'0'+m:m }
+
+ function formatDate(time)
+ {
+ var y = time.getFullYear();
+ var m = time.getMonth()+1;
+ var d = time.getDate();
+ var h = time.getHours();
+ var mm = time.getMinutes();
+ var s = time.getSeconds();
+ return y+'-'+add0(m)+'-'+add0(d)+' '+add0(h)+':'+add0(mm)+':'+add0(s);
+ }
+
+ /** 构建签名 */
+ function buildSign(postData,secret) {
+ if (typeof postData === 'string') {
+ throw new Error('postData类型必须json对象');
+ }
+ var paramNames = [];
+ for(var key in postData) {
+ paramNames.push(key);
+ }
+
+ paramNames.sort();
+
+ var paramNameValue = [];
+
+ for(var i=0,len=paramNames.length;i= 200 && status < 300) || status == 304){
+ jsonData = JSON.parse(xhr.responseText);
+ callback(jsonData, paramStr);
+ } else {
+ jsonData = JSON.parse('{"message":"后台请求错误(status:' + status + ')"}');
+ console.log(xhr.responseText)
+ error(jsonData, paramStr);
+ }
+ }
+ };
+ if (method == GET_TYPE) {
+ var queryString = [];
+ for (var key in params) {
+ var p = key + '=' + encodeURIComponent(params[key]);
+ queryString.push(p);
+ }
+ url = url + '?' + queryString.join('&');
+ }
+
+ xhr.open(method, url, true);
+
+ // 添加header
+ if(headers) {
+ for (var key in headers) {
+ xhr.setRequestHeader(key,headers[key]);
+ }
+ }
+ var postData = null;
+ if(method == POST_TYPE) {
+ if(form) {
+ var formData = new FormData(form);
+ // 添加json
+ formData.append(UPLOAD_FORM_DATA_NAME, paramStr);
+ postData = formData;
+ } else {
+ xhr.setRequestHeader(CONTENT_TYPE_KEY, CONTENT_TYPE_JSON);
+ postData = paramStr;
+ }
+ }
+ // 发送请求
+ xhr.send(postData);
+ }
+ /**
+ * 创建XHR对象
+ * @private
+ */
+ ,createXhrObject:function() {
+ var methods = [
+ function(){ return new XMLHttpRequest();}
+ ,function(){ return new ActiveXObject('Msxml2.XMLHTTP');}
+ ,function(){ return new ActiveXObject('Microsoft.XMLHTTP');}
+ ];
+
+ var xhr = null;
+ for(var i=0,len=methods.length; ieasyopen-spring-boot-starter
1.16.0
+
+
+ org.apache.curator
+ curator-framework
+ 4.2.0
+
org.springframework.boot
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/ConfigListApi.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/ConfigListApi.java
new file mode 100644
index 00000000..d3e33398
--- /dev/null
+++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/ConfigListApi.java
@@ -0,0 +1,14 @@
+package com.gitee.sop.adminserver.api;
+
+import com.gitee.easyopen.annotation.ApiService;
+import com.gitee.easyopen.doc.annotation.ApiDoc;
+
+/**
+ * @author tanghc
+ */
+@ApiService
+@ApiDoc("配置列表")
+public class ConfigListApi {
+
+// public
+}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/RouteListApi.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/RouteListApi.java
new file mode 100644
index 00000000..59930d69
--- /dev/null
+++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/RouteListApi.java
@@ -0,0 +1,13 @@
+package com.gitee.sop.adminserver.api;
+
+import com.gitee.easyopen.annotation.ApiService;
+import com.gitee.easyopen.doc.annotation.ApiDoc;
+
+/**
+ * @author tanghc
+ */
+@ApiService
+@ApiDoc("路由列表")
+public class RouteListApi {
+
+}
diff --git a/sop-admin/sop-admin-server/src/main/resources/application-dev.properties b/sop-admin/sop-admin-server/src/main/resources/application-dev.properties
new file mode 100644
index 00000000..3e962752
--- /dev/null
+++ b/sop-admin/sop-admin-server/src/main/resources/application-dev.properties
@@ -0,0 +1,38 @@
+server.port=8082
+
+#################easyopen基础配置#################
+# 显示文档
+easyopen.show-doc=true
+# 本地秘钥
+easyopen.app-secret.test=123456
+
+# 关闭跨域,默认开启
+#easyopen.cors=false
+
+# 开启webflux
+easyopen.mono=false
+
+## 拦截器
+#easyopen.interceptors[0]=com.gitee.easyopen.support.LimitInterceptor
+#easyopen.interceptors[1]=com.gitee.easyopen.support.PermissionInterceptor
+
+# 配置中心,config-server-port对应easyopen-config中的netty.server.port
+#easyopen.app-name=app-normal
+#easyopen.config-server-ip=127.0.0.1
+#easyopen.config-server-port=8071
+#easyopen.doc-url=http://127.0.0.1:8081/api/doc
+
+
+#################redis基础配置#################
+spring.redis.database=1
+spring.redis.host=10.1.11.48
+spring.redis.password=0987654321rfvujmtgbyhn
+spring.redis.port=6379
+# 连接超时时间 单位 ms(毫秒)
+spring.redis.timeout=3000
+
+
+logging.file=D:/logs/server/server
+logging.level.com.gitee=debug
+
+
diff --git a/sop-admin/sop-admin-server/src/main/resources/application.properties b/sop-admin/sop-admin-server/src/main/resources/application.properties
index 3e962752..257b3064 100644
--- a/sop-admin/sop-admin-server/src/main/resources/application.properties
+++ b/sop-admin/sop-admin-server/src/main/resources/application.properties
@@ -1,38 +1 @@
-server.port=8082
-
-#################easyopen基础配置#################
-# 显示文档
-easyopen.show-doc=true
-# 本地秘钥
-easyopen.app-secret.test=123456
-
-# 关闭跨域,默认开启
-#easyopen.cors=false
-
-# 开启webflux
-easyopen.mono=false
-
-## 拦截器
-#easyopen.interceptors[0]=com.gitee.easyopen.support.LimitInterceptor
-#easyopen.interceptors[1]=com.gitee.easyopen.support.PermissionInterceptor
-
-# 配置中心,config-server-port对应easyopen-config中的netty.server.port
-#easyopen.app-name=app-normal
-#easyopen.config-server-ip=127.0.0.1
-#easyopen.config-server-port=8071
-#easyopen.doc-url=http://127.0.0.1:8081/api/doc
-
-
-#################redis基础配置#################
-spring.redis.database=1
-spring.redis.host=10.1.11.48
-spring.redis.password=0987654321rfvujmtgbyhn
-spring.redis.port=6379
-# 连接超时时间 单位 ms(毫秒)
-spring.redis.timeout=3000
-
-
-logging.file=D:/logs/server/server
-logging.level.com.gitee=debug
-
-
+spring.profiles.active=dev
\ No newline at end of file