Forráskód Böngészése

********************WX************************
数据中心改版

zhangweixin 4 éve
szülő
commit
68c7cb5c97
31 módosított fájl, 1603 hozzáadás és 6 törlés
  1. 23 0
      datasyn/src/main/kotlin/com/persagy/server/syn/controllers/obj/ObjectToFromController.kt
  2. 10 0
      datasyn/src/main/kotlin/com/persagy/server/syn/models/api/obj/BuildingApi.kt
  3. 19 0
      datasyn/src/main/kotlin/com/persagy/server/syn/models/tools/conversion/BuildingRequest.kt
  4. 163 0
      datasyn/src/main/kotlin/com/persagy/server/syn/utils/ObjectBaseRequest.kt
  5. 80 0
      datasyn/src/main/kotlin/com/persagy/server/syn/utils/ObjectBaseRequestTwo.kt
  6. 5 1
      equip-componnet/build.gradle
  7. 10 0
      equip-componnet/src/main/kotlin/com/persagy/server/EquipComponentApp.kt
  8. 77 0
      equip-componnet/src/main/kotlin/com/persagy/server/ShiroConfig.kt
  9. 13 0
      equip-componnet/src/main/kotlin/com/persagy/server/Swagger2Config.kt
  10. 1 0
      equip-componnet/src/main/kotlin/com/persagy/server/WebMvcConfg.kt
  11. 8 0
      equip-componnet/src/main/kotlin/com/persagy/server/controllers/labsl/LabslController.kt
  12. 46 0
      equip-componnet/src/main/kotlin/com/persagy/server/models/Project.kt
  13. 44 0
      equip-componnet/src/main/kotlin/com/persagy/server/models/requests/UserChangePasswordRequest.kt
  14. 36 0
      equip-componnet/src/main/kotlin/com/persagy/server/models/requests/UserDeleteRequest.kt
  15. 60 0
      equip-componnet/src/main/kotlin/com/persagy/server/models/requests/UserUpdateRequest.kt
  16. 40 0
      equip-componnet/src/main/kotlin/com/persagy/server/models/responses/BaseResponse.kt
  17. 71 0
      equip-componnet/src/main/kotlin/com/persagy/server/models/responses/TokenCheckResponse.kt
  18. 57 0
      equip-componnet/src/main/kotlin/com/persagy/server/models/responses/UserCreateRequest.kt
  19. 36 0
      equip-componnet/src/main/kotlin/com/persagy/server/models/responses/UserCreateResponse.kt
  20. 31 0
      equip-componnet/src/main/kotlin/com/persagy/server/models/responses/UserInfoResponse.kt
  21. 86 0
      equip-componnet/src/main/kotlin/com/persagy/server/service/labsl/EquipTypeLabslService.kt
  22. 111 0
      equip-componnet/src/main/kotlin/com/persagy/server/sso/SSoClient.kt
  23. 60 0
      equip-componnet/src/main/kotlin/com/persagy/server/sso/User.kt
  24. 82 0
      equip-componnet/src/main/kotlin/com/persagy/server/sso/UserRealm.kt
  25. 108 0
      equip-componnet/src/main/kotlin/com/persagy/server/sso/UserService.kt
  26. 91 0
      equip-componnet/src/main/kotlin/com/persagy/server/sso/interceptors/SessionInterceptor.java
  27. 125 0
      equip-componnet/src/main/kotlin/com/persagy/server/sso/interceptors/SessionInterceptor.kt
  28. 95 0
      equip-componnet/src/main/kotlin/com/persagy/server/sso/users/UserController.kt
  29. 10 0
      equip-componnet/src/main/resources/application-dev.yml
  30. 1 1
      labsl/build.gradle
  31. 4 4
      labsl/src/main/resources/application.yml

+ 23 - 0
datasyn/src/main/kotlin/com/persagy/server/syn/controllers/obj/ObjectToFromController.kt

@@ -0,0 +1,23 @@
+package com.persagy.server.syn.controllers.obj
+
+/**
+ * 数据中心 - 数据中台
+ *
+ * @author wx  <zhangweixin@sagacloud.com>
+ * @date  2020/10/22 21:39
+ */
+class ObjectToFromController {
+
+    /**
+     * 建筑同步
+     *
+     * @param projectId     项目 id
+     */
+    fun buildingSyn(projectId: String) {
+
+    }
+
+
+
+
+}

+ 10 - 0
datasyn/src/main/kotlin/com/persagy/server/syn/models/api/obj/BuildingApi.kt

@@ -38,4 +38,14 @@ object BuildingApi {
         return ArrayList<HashMap<String, Any?>>()
     }
 
+    /**
+     * 中台创建建筑
+     */
+    fun  createBuilding(projectId: String) {
+        val url = "${opts.dataPlatform}/instance/object/create?projectId=${projectId}&appId=datacenter"
+
+
+    }
+
+
 }

+ 19 - 0
datasyn/src/main/kotlin/com/persagy/server/syn/models/tools/conversion/BuildingRequest.kt

@@ -0,0 +1,19 @@
+package com.persagy.server.syn.models.tools.conversion
+
+import com.persagy.server.syn.utils.ObjectBaseRequestTwo
+
+/**
+ * 建筑
+ *
+ * @author wx  <zhangweixin@sagacloud.com>
+ * @date  2020/10/22 21:50
+ */
+class BuildingRequest: ObjectBaseRequestTwo() {
+
+    init {
+        ignoreKeySet.addAll(hashSetOf(
+
+        ))
+    }
+
+}

+ 163 - 0
datasyn/src/main/kotlin/com/persagy/server/syn/utils/ObjectBaseRequest.kt

@@ -0,0 +1,163 @@
+package com.persagy.server.syn.utils
+
+import com.alibaba.fastjson.annotation.JSONField
+import com.alibaba.fastjson.serializer.SerializerFeature
+import com.google.gson.Gson
+import com.google.gson.annotations.SerializedName
+import com.google.gson.reflect.TypeToken
+import com.persagy.server.datacenter.models.entities.assistant.AttPic
+import com.persagy.server.datacenter.models.entities.assistant.TaskPic
+import org.json.JSONObject
+import org.slf4j.LoggerFactory
+import java.io.Serializable
+
+/**
+ * Created by Xiaoyu on 2019/4/28
+ */
+open class ObjectBaseRequest : Serializable {
+    companion object {
+        // 日志
+        private val logger = LoggerFactory.getLogger(ObjectBaseRequest::class.java)
+    } // Companion object
+    /** id */
+    @JSONField(name = "id")
+    @SerializedName("id")
+    var id: String? = null
+    /** 信息点 */
+    @JSONField(name = "infos",serialzeFeatures = [SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty])
+    @SerializedName("infos")
+    var infos: HashMap<String, Any?>? = null
+
+    //需要忽略的属性,数据平台中没有的信息点
+    @JSONField(serialize=false)
+    @Transient
+    var ignoreKeySet = hashSetOf("LastUpdate", "CreateTime")
+
+    //聚合在一起的字段名称,然后展开成数据平台需要的格式
+    @JSONField(serialize=false)
+    @Transient
+    var collectKeySet = HashSet<String>()
+
+    open fun addInfo(key: String, value: Any?) {
+        addInfo(key, value, false)
+    }
+    /**
+     * 添加信息点到infos
+     * @param key   信息点
+     * @param value 信息点值
+     * @param ignoreNull    是否忽略value为null的情况,true value为null时不添加到infos
+     */
+    open fun addInfo(key: String, value: Any?, ignoreNull: Boolean) {
+        if (collectKeySet.contains(key)) {
+            addJSONObjectInfo(value , ignoreNull)
+        } else {
+            innerAddInfo(key, value, ignoreNull)
+        }
+    }
+
+    /**
+     * 添加信息点到infos
+     * @param key   信息点
+     * @param value 信息点值
+     * @param ignoreNull    是否忽略value为null的情况,true value为null时不添加到infos
+     */
+     fun innerAddInfo(key: String, value: Any?, ignoreNull: Boolean) {
+        if (ignoreKeySet.contains(key)) {
+            return
+        }
+        if (value == null && ignoreNull) {
+            return
+        }
+        infos = infos ?: LinkedHashMap()
+        var valueArr = ArrayList<HashMap<String, Any?>>()
+
+        val hashMap = HashMap<String, Any?>()
+        if (value.toString()=="null" ){
+//            valueArr[0]["value"] = null
+            hashMap.put("value",null)
+            valueArr.add(hashMap)
+            infos!![key] = valueArr
+//            logger.debug("value值0 = ${valueArr.toJson()}")
+        }else{
+            if (key == "Pic"||key == "InstallDrawing"||key == "InstallPic"||key == "CheckReport"||
+                    key == "InsuranceFile"||key == "Nameplate" || key == "Drawing" || key == "Archive"||
+                     key == "OperationManual" || key == "ProductCertification"||key == "TestReport"
+                    ||key == "OriginalCertificate"||key == "AcceptanceReport"||key == "ApproachingAcceptance"
+                    ||key == "SupplierContract"||key == "MaintainManual"||key == "InsuranceFile"){
+
+//                logger.debug("Pic值001 = ${value}")
+//                var list = ArrayList<AttPic>()
+                if (value.toString() != "{}"||value.toString()!="[]"){
+                    try {
+                        val gson = Gson()
+                        val type = object : TypeToken<ArrayList<TaskPic>>() {
+                        }.type
+                        val attPicList = gson.fromJson<ArrayList<TaskPic>>(value.toString(),type)
+//                        val attPicList = SJsonUtil.fromJson<ArrayList<TaskPic>>(value.toString())
+                        if (attPicList.isNotEmpty()){
+                            val listPic =ArrayList<AttPic>()
+                            for (attPic in attPicList){
+                                val taskPic = AttPic()
+                                taskPic.key = attPic.key
+                                taskPic.name = attPic.name
+                                taskPic.systemId = attPic.systemId
+                                taskPic.type = attPic.type
+                                listPic.add(taskPic)
+                            }
+                            hashMap.put("value",listPic)
+                            valueArr.add(hashMap)
+                        }
+                    } catch (e: Exception) {
+                        e.printStackTrace()
+                    }
+//                    val attPicList = SJsonUtil.fromJson<ArrayList<AttPic>>(value.toString())
+
+                }else {
+                    hashMap.put("value",null)
+                    valueArr.add(hashMap)
+                }
+                infos!![key] = valueArr
+            }else{
+                hashMap.put("value",value)
+                valueArr.add(hashMap)
+                infos!![key] = valueArr
+            }
+//            logger.debug("value值1 = ${valueArr.toJson()}")
+        }
+    }
+
+    /**
+     * 按信息点的一级标签,将一级标签里的信息点平铺添加
+     */
+    open fun addMapInfo(map: Map<String, Any?>, ignoreNull: Boolean) {
+        if (map != null) {
+            for (key in map.keys) {
+                innerAddInfo(key, map[key], ignoreNull)
+            }
+        }
+    }
+
+    /**
+     * 按信息点的一级标签,将一级标签里的信息点平铺添加
+     */
+    open fun addJSONObjectInfo(json: Any?, ignoreNull: Boolean) {
+        if (json != null&&json.toString()!="null") {
+            //json: JSONObject
+            json as JSONObject
+            val iterator = json.keys()
+            while (iterator.hasNext()) {
+                val key = iterator.next()
+                val value = json.get(key as String)
+//                innerAddInfo(key, value, ignoreNull)
+                addInfo(key,value,true)
+            }
+        }
+    }
+    /**
+     *
+     */
+    open fun removeInfo(key: String) {
+        infos?.remove(key)
+    }
+
+}

+ 80 - 0
datasyn/src/main/kotlin/com/persagy/server/syn/utils/ObjectBaseRequestTwo.kt

@@ -0,0 +1,80 @@
+package com.persagy.server.syn.utils
+
+import com.alibaba.fastjson.annotation.JSONField
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+import com.persagy.server.datacenter.models.entities.assistant.AttPic
+import com.persagy.server.datacenter.models.entities.assistant.TaskPic
+import java.io.Serializable
+
+/**
+ *
+ * @author wx  <zhangweixin@sagacloud.com>
+ * @date  2020/10/22 22:11
+ */
+open class ObjectBaseRequestTwo: Serializable {
+
+    /** 对象列表 */
+    var listObject = ArrayList<HashMap<String,Any?>>()
+    /** 对象 */
+    val objMap = LinkedHashMap<String,Any?>()
+    //需要忽略的属性,数据平台中没有的信息点
+    @JSONField(serialize=false)
+    @Transient
+    var ignoreKeySet = hashSetOf("LastUpdate", "CreateTime")
+
+    /**
+     * 添加信息点到infos
+     * @param key   信息点
+     * @param value 信息点值
+     * @param ignoreNull    是否忽略value为null的情况,true value为null时不添加到infos
+     */
+    open fun addInfo(key: String, value: Any?, ignoreNull: Boolean) {
+        if (!ignoreKeySet.contains(key)) {
+            if (key == "pic"||key == "installDrawing"||key == "installPic"||key == "checkReport"||
+                key == "insuranceFile"||key == "nameplate" || key == "drawing" || key == "archive"||
+                key == "operationManual" || key == "productCertification"||key == "testReport"
+                ||key == "originalCertificate"||key == "acceptanceReport"||key == "approachingAcceptance"
+                ||key == "supplierContract"||key == "maintainManual"||key == "insuranceFile"){
+
+                if (value.toString() != "{}"||value.toString()!="[]"){
+                    try {
+                        val gson = Gson()
+                        val type = object : TypeToken<ArrayList<TaskPic>>() {
+                        }.type
+                        val attPicList = gson.fromJson<ArrayList<TaskPic>>(value.toString(),type)
+//                        val attPicList = SJsonUtil.fromJson<ArrayList<TaskPic>>(value.toString())
+                        if (attPicList.isNotEmpty()){
+                            val listPic =ArrayList<AttPic>()
+                            for (attPic in attPicList){
+                                val taskPic = AttPic()
+                                taskPic.key = attPic.key
+                                taskPic.name = attPic.name
+                                taskPic.systemId = attPic.systemId
+                                taskPic.type = attPic.type
+                                listPic.add(taskPic)
+                            }
+                            objMap[key] = listPic
+                        }
+                    } catch (e: Exception) {
+                        e.printStackTrace()
+                    }
+
+                }
+
+            }else{
+                objMap[key] = value
+            }
+        }
+
+    }
+
+
+
+
+
+
+
+
+
+}

+ 5 - 1
equip-componnet/build.gradle

@@ -48,7 +48,7 @@ dependencies {
     compile group: "org.springframework.boot", name: "spring-boot-starter-actuator", version: SPRING_BOOT_VERSION
     compile group: "org.springframework.boot", name: "spring-boot-starter-logging", version: SPRING_BOOT_VERSION
     //消息
-    compile group: "org.springframework.boot", name: "spring-boot-starter-activemq", version: SPRING_BOOT_VERSION
+//    compile group: "org.springframework.boot", name: "spring-boot-starter-activemq", version: SPRING_BOOT_VERSION
     providedCompile group: "org.springframework.boot", name:"spring-boot-starter-tomcat", version: SPRING_BOOT_VERSION
     // spring boot 缓存
     compile group:"org.springframework.boot", name:"spring-boot-starter-cache", version: SPRING_BOOT_VERSION
@@ -66,6 +66,10 @@ dependencies {
     //https://mvnrepository.com/artifact/org.postgresql/postgresql
 //    compile group: 'org.postgresql',    name: 'postgresql',     version: POSTGRESQL_VERSION
 
+
+    // https://mvnrepository.com/artifact/org.apache.shiro/shiro-spring-boot-web-starter
+//    compile group: 'org.apache.shiro', name: 'shiro-spring-boot-web-starter', version: '1.4.1'
+
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     // RESTful API 文档生成工具
     // https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui

+ 10 - 0
equip-componnet/src/main/kotlin/com/persagy/server/EquipComponentApp.kt

@@ -27,6 +27,7 @@ import org.springframework.boot.SpringApplication
 import org.springframework.boot.autoconfigure.SpringBootApplication
 import org.springframework.boot.builder.SpringApplicationBuilder
 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer
+//import org.springframework.cloud.client.loadbalancer.LoadBalanced
 import org.springframework.context.annotation.Bean
 import org.springframework.context.annotation.ComponentScan
 import org.springframework.scheduling.annotation.EnableScheduling
@@ -58,6 +59,15 @@ open class EquipComponentApp : SpringBootServletInitializer() {
     } // Function configure
 
     /**
+     * 䣦置Shiro 配置
+     */
+//    @Bean
+//    @LoadBalanced
+//    open fun restTemplate(): RestTemplate {
+//        return RestTemplate()
+//    } // Function restTemplate()
+
+    /**
      * 配置FastJson
      *
      * @return  HttpMessageConverters

+ 77 - 0
equip-componnet/src/main/kotlin/com/persagy/server/ShiroConfig.kt

@@ -0,0 +1,77 @@
+///*
+// * ********************************************************************************************************************
+// *
+// *                      :*$@@%$*:                         ;:                ;;    ;;
+// *                    :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+// *                   :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+// *                   =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+// *                   =@*                                  %!              @ $= % %@=   =%@!      %=
+// *              *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+// *            %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+// *          ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+// *          $@*   ;@@@%=!:                *@*
+// *          =@$    ;;;!=%@@@@=!           =@!
+// *           %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+// *            ;%@@$=$@@%*       *@@@$=%@@%;
+// *               ::;::             ::;::                                              All rights reserved.
+// *
+// * ********************************************************************************************************************
+// */
+//
+//package com.persagy.server
+//
+//
+//import com.persagy.server.sso.UserRealm
+//import org.apache.shiro.realm.Realm
+//import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition
+//import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition
+//import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator
+//import org.springframework.context.annotation.Bean
+//import org.springframework.context.annotation.Configuration
+//
+//@Configuration
+//open class ShiroConfig {
+//
+//    @Bean
+//    open fun userRealm(): Realm {
+//        return UserRealm()
+//    }
+//
+//    /**
+//     * 这里统一做鉴权,即判断哪些请求路径需要用户登录,哪些请求路径不需要用户登录。
+//     * 这里只做鉴权,不做权限控制,因为权限用注解来做。
+//     * @return
+//     */
+//    @Bean
+//    open fun shiroFilterChainDefinition(): ShiroFilterChainDefinition {
+//        val chain = DefaultShiroFilterChainDefinition()
+//
+//        // 设置哪些请求可以匿名访问
+//        chain.addPathDefinition("/login/**", "anon")
+//        chain.addPathDefinition("/user/userInfo", "anon")
+//
+//        // 由于使用Swagger调试,因此设置所有Swagger相关的请求可以匿名访问
+//        chain.addPathDefinition("/swagger-ui.html", "anon")
+//        chain.addPathDefinition("/swagger-resources", "anon")
+//        chain.addPathDefinition("/swagger-resources/configuration/security", "anon")
+//        chain.addPathDefinition("/swagger-resources/configuration/ui", "anon")
+//        chain.addPathDefinition("/v2/api-docs", "anon")
+//        chain.addPathDefinition("/webjars/springfox-swagger-ui/**", "anon")
+//
+//        //除了以上的请求外,其它请求都需要登录
+//        chain.addPathDefinition("/**", "authc")
+//        return chain
+//    } // Function shiroFilterChainDefinition()
+//
+//    @Bean
+//    open fun defaultAdvisorAutoProxyCreator(): DefaultAdvisorAutoProxyCreator {
+//        val creator = DefaultAdvisorAutoProxyCreator()
+//        /**
+//         * setUsePrefix(false)用于解决一个奇怪的bug。在引入spring aop的情况下。
+//         * 在@Controller注解的类的方法中加入@RequiresRole注解,会导致该方法无法映射请求,导致返回404。
+//         * 加入这项配置能解决这个bug
+//         */
+//        creator.isUsePrefix = true
+//        return creator
+//    } // Function defaultAdvisorAutoProxyCreator()
+//}

+ 13 - 0
equip-componnet/src/main/kotlin/com/persagy/server/Swagger2Config.kt

@@ -29,6 +29,7 @@ import springfox.documentation.builders.PathSelectors
 import springfox.documentation.builders.RequestHandlerSelectors
 import springfox.documentation.schema.ModelRef
 import springfox.documentation.service.ApiInfo
+import springfox.documentation.service.ApiKey
 import springfox.documentation.service.Contact
 import springfox.documentation.service.Parameter
 import springfox.documentation.spi.DocumentationType
@@ -57,9 +58,12 @@ open class Swagger2Config {
     open fun createRestApi(): Docket {
         logger.debug("createRestApi")
         val builder = ParameterBuilder()
+        val builderToken = ParameterBuilder()
         val pars = ArrayList<Parameter>()
+//        builderToken.name("sso-token").description("token").modelRef(ModelRef("string")).parameterType("header").required(false).build()
         builder.name("projectId").description("项目ID").modelRef(ModelRef("string")).parameterType("header").required(false).build()
         pars.add(builder.build())
+//        pars.add(builderToken.build())
         return Docket(DocumentationType.SWAGGER_2)
                 .apiInfo(apiInfo())
                 .select()
@@ -67,6 +71,7 @@ open class Swagger2Config {
                 .paths(PathSelectors.any())
                 .build()
                 .globalOperationParameters(pars)
+//                .securitySchemes(securitySchemes())
     } // Function createRestApi()
 
     /**
@@ -83,4 +88,12 @@ open class Swagger2Config {
                 .version("2.0")
                 .build()
     } // Function apiInfo()
+
+    private fun securitySchemes(): ArrayList<ApiKey> {
+        val apiKeyList = ArrayList<ApiKey>()
+        apiKeyList.add(ApiKey("sso-token", "sso-token", "header"))
+        apiKeyList.add(ApiKey("projectId", "projectId", "header"))
+        return apiKeyList
+    } // Function securitySchemes()
+
 } // Class Swagger2Config

+ 1 - 0
equip-componnet/src/main/kotlin/com/persagy/server/WebMvcConfg.kt

@@ -40,6 +40,7 @@ open class WebMvcConfg: WebMvcConfigurerAdapter() {
     override fun addInterceptors(registry : InterceptorRegistry) {
         //registry.addInterceptor(AccessControlAllowOriginInterceptor()).addPathPatterns("/**")
         registry.addInterceptor(SPageInterceptor()).addPathPatterns("/**")
+//        registry.addInterceptor(SessionInterceptor()).addPathPatterns("/**")
         super.addInterceptors(registry)
         return
     } // Function addInterceptors()

+ 8 - 0
equip-componnet/src/main/kotlin/com/persagy/server/controllers/labsl/LabslController.kt

@@ -69,4 +69,12 @@ class LabslController {
         return EquipTypeLabslService.pageQuery(request, withFilterList)
     } // Function query()
 
+    /**
+     * 根据设备 id 统计 设备所属的专业
+     */
+    @ApiOperation(value = "根据设备 id 统计 设备所属的专业", notes = " 设备 id 列表")
+    @PostMapping(value = ["/major/category"])
+    fun equipMajor(@RequestBody idList: ArrayList<String>): SQueryResponse<DefClass> {
+        return EquipTypeLabslService.equipMajor(idList)
+    }
 }

+ 46 - 0
equip-componnet/src/main/kotlin/com/persagy/server/models/Project.kt

@@ -0,0 +1,46 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                      :*$@@%$*:                         ;:                ;;    ;;
+ *                    :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                   :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                   =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                   =@*                                  %!              @ $= % %@=   =%@!      %=
+ *              *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *            %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *          ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *          $@*   ;@@@%=!:                *@*
+ *          =@$    ;;;!=%@@@@=!           =@!
+ *           %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *            ;%@@$=$@@%*       *@@@$=%@@%;
+ *               ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.models
+
+import io.swagger.annotations.ApiModel
+import io.swagger.annotations.ApiModelProperty
+
+/**
+ * 项目信息
+ *
+ * @author  庞利祥(sybotan@126.com
+ */
+@ApiModel(description = "项目信息")
+class Project (
+    /** id */
+    @ApiModelProperty(value = "id")
+    var id: String,
+
+    /** 项目名称 */
+    @ApiModelProperty(value = "项目名称")
+    var name: String,
+
+    /** 本地项目名称 */
+    @ApiModelProperty(value = "本地项目名称")
+    var localName: String? = null
+
+) // Class Project
+

+ 44 - 0
equip-componnet/src/main/kotlin/com/persagy/server/models/requests/UserChangePasswordRequest.kt

@@ -0,0 +1,44 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                      :*$@@%$*:                         ;:                ;;    ;;
+ *                    :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                   :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                   =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                   =@*                                  %!              @ $= % %@=   =%@!      %=
+ *              *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *            %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *          ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *          $@*   ;@@@%=!:                *@*
+ *          =@$    ;;;!=%@@@@=!           =@!
+ *           %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *            ;%@@$=$@@%*       *@@@$=%@@%;
+ *               ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.models.requests
+
+import io.swagger.annotations.ApiModel
+import io.swagger.annotations.ApiModelProperty
+
+/**
+ * 修改用户密码请求
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+@ApiModel(description = "修改用户密码请求")
+class UserChangePasswordRequest {
+    /** id */
+    @ApiModelProperty(value = "id", required = true)
+    var id: String? = null
+
+    /** 新密码 */
+    @ApiModelProperty(value = "新密码", required = true)
+    var newPwd: String? = null
+
+    /** 原密码 */
+    @ApiModelProperty(value = "原密码", required = true)
+    var oldPwd: String? = null
+} // Class UserChangePasswordRequest

+ 36 - 0
equip-componnet/src/main/kotlin/com/persagy/server/models/requests/UserDeleteRequest.kt

@@ -0,0 +1,36 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                      :*$@@%$*:                         ;:                ;;    ;;
+ *                    :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                   :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                   =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                   =@*                                  %!              @ $= % %@=   =%@!      %=
+ *              *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *            %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *          ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *          $@*   ;@@@%=!:                *@*
+ *          =@$    ;;;!=%@@@@=!           =@!
+ *           %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *            ;%@@$=$@@%*       *@@@$=%@@%;
+ *               ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.models.requests
+
+import io.swagger.annotations.ApiModel
+import io.swagger.annotations.ApiModelProperty
+
+/**
+ * 删除用户请求
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+@ApiModel(description = "删除用户请求")
+class UserDeleteRequest {
+    /** id */
+    @ApiModelProperty(value = "id", required = true)
+    var id: String? = null
+} // Class UserDeleteRequest

+ 60 - 0
equip-componnet/src/main/kotlin/com/persagy/server/models/requests/UserUpdateRequest.kt

@@ -0,0 +1,60 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                      :*$@@%$*:                         ;:                ;;    ;;
+ *                    :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                   :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                   =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                   =@*                                  %!              @ $= % %@=   =%@!      %=
+ *              *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *            %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *          ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *          $@*   ;@@@%=!:                *@*
+ *          =@$    ;;;!=%@@@@=!           =@!
+ *           %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *            ;%@@$=$@@%*       *@@@$=%@@%;
+ *               ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.models.requests
+
+import io.swagger.annotations.ApiModel
+import io.swagger.annotations.ApiModelProperty
+
+/**
+ * 更新用户请求
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+@ApiModel(description = "更新用户请求")
+class UserUpdateRequest {
+    /** id */
+    @ApiModelProperty(value = "id", required = true)
+    var id: String? = null
+
+    /** 用户名 */
+    @ApiModelProperty(value = "用户名", required = true)
+    var userName: String? = null
+
+    /** 密码 */
+    @ApiModelProperty(value = "密码", required = true)
+    var password: String? = null
+
+    /** 真实姓名 */
+    @ApiModelProperty(value = "真实姓名")
+    var realName: String? = null
+
+    /** 手机号码 */
+    @ApiModelProperty(value = "手机号码,全局唯一")
+    var phone: String? = null
+
+    /** 邮箱 */
+    @ApiModelProperty(value = "邮箱,全局唯一")
+    var mail: String? = null
+
+    /** 身份证号码 */
+    @ApiModelProperty(value = "身份证号码,全局唯一")
+    var certno: String? = null
+} // Class UserUpdateRequest

+ 40 - 0
equip-componnet/src/main/kotlin/com/persagy/server/models/responses/BaseResponse.kt

@@ -0,0 +1,40 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                      :*$@@%$*:                         ;:                ;;    ;;
+ *                    :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                   :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                   =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                   =@*                                  %!              @ $= % %@=   =%@!      %=
+ *              *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *            %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *          ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *          $@*   ;@@@%=!:                *@*
+ *          =@$    ;;;!=%@@@@=!           =@!
+ *           %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *            ;%@@$=$@@%*       *@@@$=%@@%;
+ *               ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.models.responses
+
+import io.swagger.annotations.ApiModel
+import io.swagger.annotations.ApiModelProperty
+
+/**
+ * 应答类基类
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+@ApiModel(description = "应答类基类")
+open class BaseResponse(
+    /** 返回结果 */
+    @ApiModelProperty(value = "返回结果")
+    var result: String,
+
+    /** 消息 */
+    @ApiModelProperty(value = "返回结果")
+    var message: String? = null
+)

+ 71 - 0
equip-componnet/src/main/kotlin/com/persagy/server/models/responses/TokenCheckResponse.kt

@@ -0,0 +1,71 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                      :*$@@%$*:                         ;:                ;;    ;;
+ *                    :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                   :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                   =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                   =@*                                  %!              @ $= % %@=   =%@!      %=
+ *              *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *            %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *          ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *          $@*   ;@@@%=!:                *@*
+ *          =@$    ;;;!=%@@@@=!           =@!
+ *           %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *            ;%@@$=$@@%*       *@@@$=%@@%;
+ *               ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.models.responses
+
+import com.fasterxml.jackson.annotation.JsonProperty
+import io.swagger.annotations.ApiModel
+import io.swagger.annotations.ApiModelProperty
+
+/**
+ * token审核应答
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+@ApiModel(description = "token审核应答")
+class TokenCheckResponse : BaseResponse("success"){
+    /** id */
+    @ApiModelProperty(value = "id", required = true)
+    var id: String? = null
+
+    /** 用户名 */
+    @ApiModelProperty(value = "用户名", required = true)
+    @JsonProperty(value = "username")
+    var userName: String? = null
+
+    /** 密码 */
+    @ApiModelProperty(value = "密码", required = true)
+    var password: String? = null
+
+    /** 真实姓名 */
+    @ApiModelProperty(value = "真实姓名")
+    @JsonProperty(value = "realname")
+    var realName: String? = null
+
+    /** 手机号码 */
+    @ApiModelProperty(value = "手机号码,全局唯一")
+    var phone: String? = null
+
+    /** 邮箱 */
+    @ApiModelProperty(value = "邮箱,全局唯一")
+    var mail: String? = null
+
+    /** 身份证号码 */
+    @ApiModelProperty(value = "身份证号码,全局唯一")
+    var certno: String? = null
+
+    /** 项目ID列表 */
+    @ApiModelProperty(value = "项目ID列表")
+    var projects: ArrayList<String>? = null
+
+    /** app列表 */
+    @ApiModelProperty(value = "app列表")
+    var apps: ArrayList<String>? = null
+} // Class TokenCheckResponse

+ 57 - 0
equip-componnet/src/main/kotlin/com/persagy/server/models/responses/UserCreateRequest.kt

@@ -0,0 +1,57 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                      :*$@@%$*:                         ;:                ;;    ;;
+ *                    :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                   :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                   =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                   =@*                                  %!              @ $= % %@=   =%@!      %=
+ *              *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *            %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *          ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *          $@*   ;@@@%=!:                *@*
+ *          =@$    ;;;!=%@@@@=!           =@!
+ *           %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *            ;%@@$=$@@%*       *@@@$=%@@%;
+ *               ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.models.responses
+
+import io.swagger.annotations.ApiModel
+import io.swagger.annotations.ApiModelProperty
+import java.io.Serializable
+
+/**
+ * 创建用户请求
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+@ApiModel(description = "创建用户请求")
+class UserCreateRequest: Serializable {
+    /** 用户名 */
+    @ApiModelProperty(value = "用户名", required = true)
+    var userName: String? = null
+
+    /** 密码 */
+    @ApiModelProperty(value = "密码", required = true)
+    var password: String? = null
+
+    /** 真实姓名 */
+    @ApiModelProperty(value = "真实姓名")
+    var realName: String? = null
+
+    /** 手机号码 */
+    @ApiModelProperty(value = "手机号码,全局唯一")
+    var phone: String? = null
+
+    /** 邮箱 */
+    @ApiModelProperty(value = "邮箱,全局唯一")
+    var mail: String? = null
+
+    /** 身份证号码 */
+    @ApiModelProperty(value = "身份证号码,全局唯一")
+    var certno: String? = null
+} // Class UserCreateRequest

+ 36 - 0
equip-componnet/src/main/kotlin/com/persagy/server/models/responses/UserCreateResponse.kt

@@ -0,0 +1,36 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                      :*$@@%$*:                         ;:                ;;    ;;
+ *                    :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                   :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                   =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                   =@*                                  %!              @ $= % %@=   =%@!      %=
+ *              *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *            %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *          ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *          $@*   ;@@@%=!:                *@*
+ *          =@$    ;;;!=%@@@@=!           =@!
+ *           %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *            ;%@@$=$@@%*       *@@@$=%@@%;
+ *               ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.models.responses
+
+import io.swagger.annotations.ApiModel
+import io.swagger.annotations.ApiModelProperty
+
+/**
+ * 创建用户应答
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+@ApiModel(description = "创建用户应答")
+class UserCreateResponse : BaseResponse("success") {
+    /** 用户ID */
+    @ApiModelProperty(value = "用户ID", required = true)
+    var id: String? = null
+} // Class UserCreateResponse

+ 31 - 0
equip-componnet/src/main/kotlin/com/persagy/server/models/responses/UserInfoResponse.kt

@@ -0,0 +1,31 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                      :*$@@%$*:                         ;:                ;;    ;;
+ *                    :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                   :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                   =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                   =@*                                  %!              @ $= % %@=   =%@!      %=
+ *              *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *            %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *          ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *          $@*   ;@@@%=!:                *@*
+ *          =@$    ;;;!=%@@@@=!           =@!
+ *           %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *            ;%@@$=$@@%*       *@@@$=%@@%;
+ *               ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.models.responses
+
+import com.persagy.server.models.Project
+
+
+class UserInfoResponse : BaseResponse("success") {
+    var userId: String? = null
+    var username: String? = null
+    var projects = ArrayList<Project>()
+    var permissions = ArrayList<String>()
+} // Class UserInfoResponse

+ 86 - 0
equip-componnet/src/main/kotlin/com/persagy/server/service/labsl/EquipTypeLabslService.kt

@@ -1,8 +1,16 @@
 package com.persagy.server.service.labsl
 
+import com.persagy.database.SFilter
 import com.persagy.mybatis.SMybatisDao
+import com.persagy.server.datacenter.models.entities.dictnew.DefClass
+import com.persagy.server.datacenter.models.entities.dictnew.DictMajor
+import com.persagy.server.datacenter.models.entities.dictnew.DictProject
 import com.persagy.server.models.labsl.EquipTypeLabsl
 import com.persagy.server.service.base.Service
+import com.persagy.service.SBaseService
+import com.persagy.service.SPageContext
+import com.persagy.service.models.enums.SResponseType
+import com.persagy.service.models.responses.SQueryResponse
 
 /**
  * 设备服务
@@ -11,6 +19,84 @@ import com.persagy.server.service.base.Service
  */
 object EquipTypeLabslService: Service<EquipTypeLabsl>(SMybatisDao(EquipTypeLabsl::class.java)) {
 
+    /** 字典项目服务 */
+    private val dictProjectService = SBaseService(SMybatisDao(DictProject::class.java))
+    /** 对象类型 */
+    private val defClassService = SBaseService(SMybatisDao(DefClass::class.java))
+    /** 字典专业*/
+    private val dictMajorService = SBaseService(SMybatisDao(DictMajor::class.java))
+
+    /**
+     * 设备对应的专业
+     *
+     * @param idList    id 列表
+     * @return 返回结果
+     */
+    fun  equipMajor(idList: ArrayList<String>): SQueryResponse<DefClass> {
+        try {
+            /** 返回对象 */
+            val sQueryResponse = SQueryResponse<DefClass>()
+            /** 返回标记 */
+            sQueryResponse.result = SResponseType.success
+            if (idList.size>0){
+                /** 项目 id */
+                val projectId = SPageContext.getHeader("projectId")
+                val equipList = select(SFilter.eq("projectId", projectId!!), SFilter.inList("id", idList)).exec()
+                val setType = HashSet<String>()
+                for (equip in equipList){
+                    setType.add(equip.classCode!!)
+                }
+                /** 查询项目对应的集团 */
+                val dictProject = dictProjectService.select(SFilter.eq("id", projectId!!)).entity()
+
+                /** 查询类型信息 */
+                val defClassList =
+                    defClassService.select(
+                        SFilter.eq("type", "group"),
+                        SFilter.eq("groupCode", dictProject!!.groupCode!!),
+                        SFilter.inList("code", setType.toList())
+                    ).exec()
+                val setMajor = HashSet<String>()
+                for (defClass in defClassList){
+                    setMajor.add(defClass.majorCode!!)
+                }
+                /** 专业类型列表 */
+                val majorCodeList =
+                    dictMajorService.select(
+                        SFilter.inList("code", setMajor.toList())
+                    ).exec()
+                val majorList = ArrayList<DefClass>()
+                for (majorCode in majorCodeList) {
+                    val defClass = DefClass()
+                    defClass.code = majorCode.code
+                    defClass.name = majorCode.name
+                    defClass.aliasCode = majorCode.aliasCode
+                    defClass.aliasName = majorCode.aliasName
+                    for (def in defClassList) {
+                        if (def.majorCode == majorCode.code ) {
+                            if (defClass.children.isNullOrEmpty()) {
+                                defClass.children = ArrayList<DefClass>()
+                            }
+                            defClass.children!!.add(def)
+                        }
+                    }
+                    majorList.add(defClass)
+                }
+                /** 返回的对象列表 */
+                sQueryResponse.content = majorList
+                /** 总数量 */
+                sQueryResponse.total = majorList.size.toLong()
+            } else {
+                sQueryResponse.result = SResponseType.failure
+                sQueryResponse.message = "项目下没有设备类型"
+            }
+            return  sQueryResponse
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SQueryResponse(SResponseType.failure,e.message!!)
+        }
+    }
+
 
 
 }

+ 111 - 0
equip-componnet/src/main/kotlin/com/persagy/server/sso/SSoClient.kt

@@ -0,0 +1,111 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                      :*$@@%$*:                         ;:                ;;    ;;
+ *                    :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                   :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                   =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                   =@*                                  %!              @ $= % %@=   =%@!      %=
+ *              *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *            %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *          ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *          $@*   ;@@@%=!:                *@*
+ *          =@$    ;;;!=%@@@@=!           =@!
+ *           %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *            ;%@@$=$@@%*       *@@@$=%@@%;
+ *               ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.sso
+
+import com.persagy.server.models.requests.UserChangePasswordRequest
+import com.persagy.server.models.requests.UserDeleteRequest
+import com.persagy.server.models.requests.UserUpdateRequest
+import com.persagy.server.models.responses.BaseResponse
+import com.persagy.server.models.responses.TokenCheckResponse
+import com.persagy.server.models.responses.UserCreateRequest
+import com.persagy.server.models.responses.UserCreateResponse
+import com.persagy.service.utils.SSpringContextUtil
+import org.slf4j.LoggerFactory
+import org.springframework.web.bind.annotation.RequestBody
+import org.springframework.web.client.RestTemplate
+
+/**
+ * 用户服务
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+object SSoClient {
+
+    // 日志
+    private val logger = LoggerFactory.getLogger(SSoClient::class.java)
+    private const val SSO = "http://SAGACLOUD-SSO"
+
+    /**
+     * 创建用户
+     */
+    fun create(@RequestBody request: UserCreateRequest): UserCreateResponse {
+        val user = HashMap<String, Any?>()
+        user["username"] = request.userName
+        user["password"] = request.password
+        user["realname"] = request.realName
+        user["phone"]    = request.phone
+        user["mail"]     = request.mail
+        user["certno"]   = request.certno
+
+        val restTemplate = SSpringContextUtil.getBean(RestTemplate::class.java) as RestTemplate
+        return restTemplate.postForObject("$SSO/server/user/create", user, UserCreateResponse::class.java) as UserCreateResponse
+    } // Function create()
+
+    /**
+     * 更新用户
+     */
+    fun update(@RequestBody request: UserUpdateRequest): BaseResponse {
+        val user = HashMap<String, Any?>()
+        user["id"]       = request.id
+        user["username"] = request.userName
+        user["realname"] = request.realName
+        user["phone"]    = request.phone
+        user["mail"]     = request.mail
+        user["certno"]   = request.certno
+
+        val restTemplate = SSpringContextUtil.getBean(RestTemplate::class.java) as RestTemplate
+        return restTemplate.postForObject("$SSO/server/user/update", user, BaseResponse::class.java) as BaseResponse
+    } // Function update()
+
+    /**
+     * 删除用户
+     */
+    fun delete(@RequestBody request: UserDeleteRequest): BaseResponse {
+        val user = HashMap<String, Any?>()
+        user["id"]       = request.id
+
+        val restTemplate = SSpringContextUtil.getBean(RestTemplate::class.java) as RestTemplate
+        return restTemplate.postForObject("$SSO/server/user/delete", user, BaseResponse::class.java) as BaseResponse
+    } // Function delete()
+
+    /**
+     * 修改用户密码
+     */
+    fun changePwd(@RequestBody request: UserChangePasswordRequest): BaseResponse {
+        val user = HashMap<String, Any?>()
+        user["id"]       = request.id
+        user["newPwd"]   = request.newPwd
+        user["oldPwd"]   = request.oldPwd
+
+        val restTemplate = SSpringContextUtil.getBean(RestTemplate::class.java) as RestTemplate
+        return restTemplate.postForObject("$SSO/server/user/delete", user, BaseResponse::class.java) as BaseResponse
+    } // Function changePwd()
+
+    /**
+     * 审核token
+     *
+     * @param token     被审核的token
+     */
+    fun tokenCheck(@RequestBody token: String): TokenCheckResponse {
+        val restTemplate = SSpringContextUtil.getBean(RestTemplate::class.java) as RestTemplate
+        return restTemplate.getForObject("$SSO/auth/token/check?token=$token", TokenCheckResponse::class.java) as TokenCheckResponse
+    } // Function tokenCheck()
+} // Object SSoClient()

+ 60 - 0
equip-componnet/src/main/kotlin/com/persagy/server/sso/User.kt

@@ -0,0 +1,60 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                      :*$@@%$*:                         ;:                ;;    ;;
+ *                    :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                   :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                   =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                   =@*                                  %!              @ $= % %@=   =%@!      %=
+ *              *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *            %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *          ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *          $@*   ;@@@%=!:                *@*
+ *          =@$    ;;;!=%@@@@=!           =@!
+ *           %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *            ;%@@$=$@@%*       *@@@$=%@@%;
+ *               ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.sso
+
+import io.swagger.annotations.ApiModel
+import io.swagger.annotations.ApiModelProperty
+
+/**
+ * 用户信息
+ *
+ * @author  庞利祥(sybotan@126.com
+ */
+@ApiModel(description = "用户信息")
+class User {
+    /** id */
+    @ApiModelProperty(value = "id", required = true)
+    var id: String? = null
+
+    /** 用户名 */
+    @ApiModelProperty(value = "用户名", required = true)
+    var userName: String? = null
+
+    /** 密码 */
+    @ApiModelProperty(value = "密码", required = true)
+    var password: String? = null
+
+    /** 真实姓名 */
+    @ApiModelProperty(value = "真实姓名")
+    var realName: String? = null
+
+    /** 手机号码 */
+    @ApiModelProperty(value = "手机号码,全局唯一")
+    var phone: String? = null
+
+    /** 邮箱 */
+    @ApiModelProperty(value = "邮箱,全局唯一")
+    var mail: String? = null
+
+    /** 身份证号码 */
+    @ApiModelProperty(value = "身份证号码,全局唯一")
+    var certno: String? = null
+} // Class User

+ 82 - 0
equip-componnet/src/main/kotlin/com/persagy/server/sso/UserRealm.kt

@@ -0,0 +1,82 @@
+///*
+// * ********************************************************************************************************************
+// *
+// *                      :*$@@%$*:                         ;:                ;;    ;;
+// *                    :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+// *                   :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+// *                   =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+// *                   =@*                                  %!              @ $= % %@=   =%@!      %=
+// *              *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+// *            %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+// *          ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+// *          $@*   ;@@@%=!:                *@*
+// *          =@$    ;;;!=%@@@@=!           =@!
+// *           %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+// *            ;%@@$=$@@%*       *@@@$=%@@%;
+// *               ::;::             ::;::                                              All rights reserved.
+// *
+// * ********************************************************************************************************************
+// */
+//
+//package com.persagy.server.sso
+//
+//import org.apache.shiro.authc.AuthenticationInfo
+//import org.apache.shiro.authc.AuthenticationToken
+//import org.apache.shiro.authc.SimpleAuthenticationInfo
+//import org.apache.shiro.authz.AuthorizationInfo
+//import org.apache.shiro.authz.SimpleAuthorizationInfo
+//import org.apache.shiro.realm.AuthorizingRealm
+//import org.apache.shiro.subject.PrincipalCollection
+//import org.slf4j.LoggerFactory
+//
+//class UserRealm : AuthorizingRealm() {
+//    companion object {
+//        // 日志
+//        private val logger = LoggerFactory.getLogger(UserRealm::class.java)
+//    }
+//
+//    /**
+//     * 获得授权信息
+//     */
+//    override fun doGetAuthorizationInfo(principals: PrincipalCollection): AuthorizationInfo? {
+//        logger.trace("授权")
+//        val username = principals.primaryPrincipal
+//        var authorizationInfo: SimpleAuthorizationInfo?  = null
+//        try {
+//            authorizationInfo = SimpleAuthorizationInfo()
+////            User user = userService.findByUsername(username);
+////            authorizationInfo.addRole(user.getRole().getCode());
+////            List<Permission> list = user.getRole().getPermissionList();
+////            for(Permission p:list){
+////                authorizationInfo.addStringPermission(p.getCode());
+////            }
+//        } catch (e: Exception) {
+//            e.printStackTrace()
+//        }
+//        return authorizationInfo
+//    }
+//
+//    /**
+//     * 获得认证信息
+//     */
+//    override fun doGetAuthenticationInfo(token: AuthenticationToken): AuthenticationInfo {
+//        val username = token.principal as String
+////        User user = userService.findByUsername(username);
+////        if(user == null) {
+////            throw new UnknownAccountException(); // 没找到帐号
+////        }
+//
+//        /*if(Boolean.TRUE.equals(user.getLocked())) {
+//            throw new LockedAccountException(); //帐号锁定
+//        }*/
+//
+//        //交给AuthenticatingRealm使用CredentialsMatcher进行密码匹配,如果觉得人家的不好可以在此判断或自定义实现
+//        val authenticationInfo = SimpleAuthenticationInfo(
+//                username, //用户名
+//                "password", //密码
+//                name  //realm name
+//        )
+//
+//        return authenticationInfo
+//    } // Function doGetAuthenticationInfo()
+//} // Class UserRealm

+ 108 - 0
equip-componnet/src/main/kotlin/com/persagy/server/sso/UserService.kt

@@ -0,0 +1,108 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                      :*$@@%$*:                         ;:                ;;    ;;
+ *                    :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                   :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                   =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                   =@*                                  %!              @ $= % %@=   =%@!      %=
+ *              *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *            %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *          ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *          $@*   ;@@@%=!:                *@*
+ *          =@$    ;;;!=%@@@@=!           =@!
+ *           %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *            ;%@@$=$@@%*       *@@@$=%@@%;
+ *               ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+package com.persagy.server.sso
+
+import com.persagy.base.extensions.toJson
+import com.persagy.server.models.Project
+import com.persagy.server.models.responses.TokenCheckResponse
+import com.persagy.server.models.responses.UserInfoResponse
+import com.persagy.service.SPageContext
+import com.persagy.service.models.requests.SQueryRequest
+import com.persagy.service.models.responses.SQueryResponse
+import com.persagy.service.utils.SJsonUtil
+import com.persagy.service.utils.SSpringContextUtil
+import org.slf4j.LoggerFactory
+import org.springframework.core.ParameterizedTypeReference
+import org.springframework.http.HttpEntity
+import org.springframework.http.converter.StringHttpMessageConverter
+import org.springframework.web.client.RestTemplate
+import java.nio.charset.StandardCharsets
+
+object UserService {
+    // 日志
+    private val logger = LoggerFactory.getLogger(UserService::class.java)
+    private const val DATACENTER = "http://DATACENTER"
+//    private const val DATACENTER = "http://GUANCHENG-DATACENTER"
+//    val opts: Opts by lazy {
+//        SSpringContextUtil.getBean(Opts::class.java) as Opts
+//    } // opts
+
+    /**
+     * 获得用户信息
+     */
+    fun userInfo(): UserInfoResponse {
+        val user = SPageContext.getAttribute("User") as TokenCheckResponse?
+        val resp = UserInfoResponse()
+        try {
+            logger.debug("项目= ${user?.toJson()}")
+            val projResp = projectList(user!!.projects!!)
+
+            // 获得项目
+            for (pj in projResp!!.content!!) {
+                val proj = Project(pj.id!!, "", pj.localName)
+                resp.projects.add(proj)
+            }
+
+            resp.userId = user.id
+            resp.username = user.userName
+            resp.permissions = arrayListOf("system:role:query", "system:role:create", "system:user:create",
+                    "system:user:delete",
+                    "database:hbase:query",
+                    "system:role:query",
+                    "system:user:query",
+                    "database:redis:query",
+                    "system:role:setOpts",
+                    "system:role:update",
+                    "system:user:update")
+            logger.debug("userInfo = ${resp.toJson()}")
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return resp
+    } // Function userInfo()
+
+    /**
+     * 项目列表
+     *
+     * @param   ids     项目ID列表
+     * @return  从数据中心取得项目列表
+     */
+    fun projectList(ids: ArrayList<String>): SQueryResponse<Project>? {
+        val restTemplate = SSpringContextUtil.getBean(RestTemplate::class.java) as RestTemplate
+        restTemplate.messageConverters[1] = StringHttpMessageConverter(StandardCharsets.UTF_8)
+        val req = SQueryRequest()
+        req.filters = "id in ["
+        for ((index, id) in ids.withIndex()) {
+            if (index > 0) {
+                req.filters += ", "
+            }
+            req.filters += "'$id'"
+        }
+        req.filters += "]"
+        SQueryRequest.maxRow = 100000
+        req.pageSize = 100000
+        val request = HttpEntity(req)
+        val pt = object : ParameterizedTypeReference<SQueryResponse<Project>>() {}
+        val r = restTemplate.postForObject("$DATACENTER/datacenter/project/query", req, String::class.java)
+        @Suppress("UNCHECKED_CAST")
+        return SJsonUtil.fromJson(r!!, pt.type) as SQueryResponse<Project>
+    } // Function projectList()
+
+} // Object UserService

+ 91 - 0
equip-componnet/src/main/kotlin/com/persagy/server/sso/interceptors/SessionInterceptor.java

@@ -0,0 +1,91 @@
+package com.persagy.server.sso.interceptors;//package cn.sagacloud.server.adm.interceptors
+
+//
+//import com.sagacloud.admin.entity.User;
+//import com.sagacloud.admin.model.UserModel;
+//import com.sagacloud.admin.repository.UserRepository;
+//import com.sagacloud.common.json.JsonMapper;
+//import com.sagacloud.common.web.MapResponse;
+//import com.sagacloud.common.web.ServletUtils;
+//import com.sagacloud.feign.SSOServiceClient;
+//import org.apache.shiro.SecurityUtils;
+//import org.apache.shiro.authc.UsernamePasswordToken;
+//import org.apache.shiro.subject.Subject;
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+//
+//import javax.servlet.http.HttpServletRequest;
+//import javax.servlet.http.HttpServletResponse;
+//
+//class SessionInterceptor : HandlerInterceptorAdapter {
+//
+//    final Logger logger = LoggerFactory.getLogger(SessionInterceptor.class);
+//
+//    @Autowired
+//    private SSOServiceClient ssoServiceClient;
+//
+//    @Autowired
+//    private UserRepository userRepository;
+//
+//    @Override
+//    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+//        logger.info("开始请求地址拦截");
+//        ServletUtils.showHeaders(request);
+//        ServletUtils.showCookies(request);
+//        String token = request.getHeader("sso-token");
+//
+//        if (token == null) {
+//            ServletUtils.writeJson(response, "{\"result\":\"unauthc\",\"message\":\"no token\"}");
+//            return false;
+//        }
+//
+//        try {
+//            Subject subject = SecurityUtils.getSubject();
+//            if (subject.isAuthenticated()) {
+//                Object principal = subject.getPrincipal();
+//                if (principal instanceof UserModel) {
+//                    // 防止前端切换用户, 用token做密码
+//                    UserModel userModel = (UserModel) principal;
+//                    if (!userModel.getToken().equalsIgnoreCase(token)) {
+//                        return checkToken(subject, token, response);
+//                    }
+//                } else {
+//                    return checkToken(subject, token, response);
+//                }
+//            } else {
+//                return checkToken(subject, token, response);
+//            }
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//            logger.error("login check error: {}", e);
+//            return false;
+//        }
+//        return true;
+//    }
+//
+//    private boolean checkToken(Subject subject, String token, HttpServletResponse response) {
+//        MapResponse resp = ssoServiceClient.tokenCheck(token);
+//        logger.info("token check resp: {}", JsonMapper.toSimpleJson(resp));
+//        if (!resp.success()) {
+//            logger.error("go to login");
+//            ServletUtils.writeJson(response, JsonMapper.toSimpleJson(resp));
+//            return false;
+//        }
+//
+//        Integer userId = resp.getInteger("id");
+//        User user = userRepository.findOne(userId);
+//
+//        if (user == null) {
+//            // 用户不存在
+//            ServletUtils.writeJson(response, "{\"result\": \"nouser\"}");
+//            return false;
+//        } else {
+//            UsernamePasswordToken shiroToken = new UsernamePasswordToken(user.getName(), token);
+//            subject.login(shiroToken);
+//        }
+//        return true;
+//    }
+//
+//}

+ 125 - 0
equip-componnet/src/main/kotlin/com/persagy/server/sso/interceptors/SessionInterceptor.kt

@@ -0,0 +1,125 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                      :*$@@%$*:                         ;:                ;;    ;;
+ *                    :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                   :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                   =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                   =@*                                  %!              @ $= % %@=   =%@!      %=
+ *              *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *            %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *          ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *          $@*   ;@@@%=!:                *@*
+ *          =@$    ;;;!=%@@@@=!           =@!
+ *           %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *            ;%@@$=$@@%*       *@@@$=%@@%;
+ *               ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.sso.interceptors
+
+//import org.apache.shiro.SecurityUtils
+//import org.apache.shiro.authc.UsernamePasswordToken
+//import org.apache.shiro.subject.Subject
+import org.slf4j.LoggerFactory
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter
+import javax.servlet.http.HttpServletRequest
+import javax.servlet.http.HttpServletResponse
+
+class SessionInterceptor : HandlerInterceptorAdapter() {
+    companion object {
+        // 日志
+        private val logger = LoggerFactory.getLogger(SessionInterceptor::class.java)
+    } // Companion object
+
+    override fun preHandle(request: HttpServletRequest, response: HttpServletResponse, handler: Any): Boolean {
+        println("URL=${request.requestURI.toString()}")
+        if (request.requestURI.indexOf("swagger-") > 0 ||
+                request.requestURI.endsWith(".png") ||
+                request.requestURI.endsWith(".jpg")
+                ) {
+            return super.preHandle(request, response, handler)
+        }
+
+        val token = request.getHeader("sso-token")
+        //val token = request.getParameter("token")
+
+        logger.debug("sso-token=$token")
+        if (token == null) {
+            response.writer.write("{\"result\":\"unauthc\",\"message\":\"no token\"}")
+            //writeJson(response, "{\"result\":\"unauthc\",\"message\":\"no token\"}")
+            return false
+        }
+
+        try {
+//            val subject = SecurityUtils.getSubject()
+//            if (subject.isAuthenticated) {
+//                try {
+//                    val user = subject.principal as User
+////                    if (!userModel.getToken().equalsIgnoreCase(token)) {
+////                        return checkToken(subject, token, response)
+//////                    }
+//                } catch (e1: Exception) {
+//                    return checkToken(subject, token, response)
+//                }
+//            } else {
+//                return checkToken(subject, token, response)
+//            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            logger.error("login check error: {}", e)
+            return false
+        }
+
+        return true
+    } // Function preHandle()
+
+//    private fun checkToken(subject: Subject, token: String, response: HttpServletResponse): Boolean {
+//        val resp = SSoClient.tokenCheck(token)
+//        logger.info("token check resp: ${resp.toJson()}")
+//        if (resp.result != "success") {
+//            logger.error("go to login")
+//            response.writer.write(resp.toJson())
+//            //writeJson(response, resp.toJson())
+//            return false
+//        }
+//
+//        val userId = resp.id
+//        val user: User? = User()
+//        user?.id = resp.id
+//        user?.userName = resp.userName
+//
+//        if (user == null) {
+//            // 用户不存在
+//            val r = BaseResponse("")
+//            response.writer.write("{\"result\": \"nouser\"}")
+//            //writeJson(response, "{\"result\": \"nouser\"}")
+//            return false
+//        } else {
+//            logger.error("=================================================================")
+//            SPageContext.setAttribute("User", resp)
+//            val user = SPageContext.getAttribute("User") as TokenCheckResponse?
+//            logger.error("user = ${user?.toJson()}")
+//            val token = UsernamePasswordToken(resp.id, "password")
+//            subject.login(token)
+//        }
+//        return true
+//    } // Function checkToken()
+
+
+//    fun writeJson(response: HttpServletResponse, json: String) {
+//        response.contentType = "application/json;charset=UTF-8"
+//        var out: PrintWriter? = null
+//        try {
+//            out = response.writer
+//            out!!.print(json)
+//            out.flush()
+//        } catch (e: IOException) {
+//            e.printStackTrace()
+//        } finally {
+//            out?.close()
+//        }
+//    }
+} // Class SessionInterceptor

+ 95 - 0
equip-componnet/src/main/kotlin/com/persagy/server/sso/users/UserController.kt

@@ -0,0 +1,95 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                      :*$@@%$*:                         ;:                ;;    ;;
+ *                    :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                   :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                   =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                   =@*                                  %!              @ $= % %@=   =%@!      %=
+ *              *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *            %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *          ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *          $@*   ;@@@%=!:                *@*
+ *          =@$    ;;;!=%@@@@=!           =@!
+ *           %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *            ;%@@$=$@@%*       *@@@$=%@@%;
+ *               ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.sso.users
+
+
+import com.persagy.server.models.requests.UserChangePasswordRequest
+import com.persagy.server.models.requests.UserDeleteRequest
+import com.persagy.server.models.requests.UserUpdateRequest
+import com.persagy.server.models.responses.BaseResponse
+import com.persagy.server.models.responses.UserCreateRequest
+import com.persagy.server.models.responses.UserCreateResponse
+import com.persagy.server.models.responses.UserInfoResponse
+import com.persagy.server.sso.SSoClient
+import com.persagy.server.sso.UserService
+import io.swagger.annotations.Api
+import io.swagger.annotations.ApiOperation
+import org.slf4j.LoggerFactory
+import org.springframework.web.bind.annotation.*
+
+/**
+ * 用户接口
+ *
+ * @author 庞利祥
+ */
+@Api(tags = ["用户接口"])
+@RestController
+@RequestMapping("/user")
+class UserController {
+    companion object {
+        // 日志
+        private val logger = LoggerFactory.getLogger(UserController::class.java)
+    } // Companion object
+
+    /**
+     * 创建用户
+     */
+    @ApiOperation(value = "创建用户", notes = "")
+    @PostMapping(value = ["/create"])
+    fun create(@RequestBody request: UserCreateRequest): UserCreateResponse {
+        return SSoClient.create(request)
+    } // Function create()
+
+    /**
+     * 更新用户
+     */
+    @ApiOperation(value = "更新用户", notes = "")
+    @PostMapping(value = ["/update"])
+    fun update(@RequestBody request: UserUpdateRequest): BaseResponse {
+        return SSoClient.update(request)
+    } // Function update()
+
+    /**
+     * 删除用户
+     */
+    @ApiOperation(value = "删除用户", notes = "")
+    @PostMapping(value = ["/delete"])
+    fun delete(@RequestBody request: UserDeleteRequest): BaseResponse {
+        return SSoClient.delete(request)
+    } // Function delete()
+
+    /**
+     * 修改用户密码
+     */
+    @ApiOperation(value = "修改用户密码", notes = "")
+    @PostMapping(value = ["/changePwd"])
+    fun changePwd(@RequestBody request: UserChangePasswordRequest): BaseResponse {
+        return SSoClient.changePwd(request)
+    } // Function changePwd()
+
+    @ApiOperation(value = "用户登录", notes = "")
+    @GetMapping(value = ["/userInfo"])
+    // @RequiresPermissions("permission:retrieve")
+    fun userInfo(): UserInfoResponse {
+        return UserService.userInfo()
+    } // Function userInfo
+
+} // Class UserController

+ 10 - 0
equip-componnet/src/main/resources/application-dev.yml

@@ -1,4 +1,14 @@
+# spring-cloud相关配置
+eureka:
+  client:                                   #客户端注册进eureka服务列表内
+    service-url:
+      defaultZone:                          http://39.106.8.246:8761/eureka
 
+  instance:
+    # 实例ID
+    # instance-id:                            ${spring.application.name}:${server.port}:${project.version}
+    # 优先使用IP地址方式进行注册服务
+    prefer-ip-address:                      true
 server:
   port: 8085
 

+ 1 - 1
labsl/build.gradle

@@ -59,7 +59,7 @@ dependencies {
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     // spring cloud 依赖
-//    compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka', version: SPRING_CLOUD_VERSION
+    compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka', version: SPRING_CLOUD_VERSION
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     // MySQL

+ 4 - 4
labsl/src/main/resources/application.yml

@@ -1,9 +1,9 @@
 ###############################################################################################################
 # spring-cloud相关配置
-#eureka:
-#  client:                                   #客户端注册进eureka服务列表内
-#    service-url:
-#      defaultZone:                          http://eureka-service:8761/eureka
+eureka:
+  client:                                   #客户端注册进eureka服务列表内
+    service-url:
+      defaultZone:                          http://eureka-service:8761/eureka
 #启用监控
 management:
   endpoints: