Browse Source

更新返回值动态注解功能

NorthLan 7 years ago
parent
commit
c95c00b2a9

+ 8 - 1
build.gradle

@@ -5,7 +5,7 @@ allprojects {
 
 buildscript {
     ext {
-        kotlin_version = '1.2.21'
+        kotlin_version = '1.2.30'
         spring_boot_version = '1.5.10.RELEASE'
         junit_version = '4.12'
         commons_io_version = '2.5'
@@ -109,6 +109,7 @@ subprojects {
         compile("com.alibaba:fastjson:$fastjson_version")
         compile("com.belerweb:pinyin4j:$pinyin4j_version")
         compile('com.github.hotchemi:khronos:0.9.0')
+        compile('com.github.shihyuho:jackson-dynamic-filter:1.0')
 
         // sso
         compile("com.baomidou:kisso:$kisso_version")
@@ -127,4 +128,10 @@ subprojects {
     task listJars(description: 'Display all compile jars.') << {
         configurations.compile.each { File file -> println file.name }
     }
+
+    tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
+        kotlinOptions {
+            jvmTarget = "1.8"
+        }
+    }
 }

+ 1 - 1
zen-api/src/main/kotlin/com/gxzc/zen/api/sys/service/ISysDicService.kt

@@ -32,5 +32,5 @@ interface ISysDicService : BaseService<SysDic> {
      * 更新缓存项
      * TODO 同时通知其他系统
      */
-    fun modifySysDic(sysDic: SysDic)
+    fun modifySysDic(sysDic: SysDic): SysDic
 }

+ 4 - 2
zen-api/src/main/kotlin/com/gxzc/zen/api/sys/service/impl/SysDicServiceImpl.kt

@@ -33,12 +33,14 @@ class SysDicServiceImpl : ServiceImpl<SysDicMapper, SysDic>(), ISysDicService {
     }
 
     //    @CacheEvict(CACHEKEYS.SYS_DIC, key = "'key_' + #sysDic.key")
-    override fun modifySysDic(sysDic: SysDic) {
+    override fun modifySysDic(sysDic: SysDic): SysDic {
         baseMapper.updateById(sysDic)
         // 更新缓存
         val cache = cacheManager.getCache(CACHEKEYS.SYS_DIC)
         cache.evict("key_${sysDic.id}")
-        getListByKey(sysDic.key!!) // 直接调用cacheable的方法注入缓存
+        getListByKey(sysDic.key!!) // 直接调用Cacheable的方法注入缓存
+        //
+        return sysDic
     }
 
     override fun getOneByKey(key: String, sort: Int): SysDic? {

+ 2 - 1
zen-core/src/main/kotlin/com/gxzc/zen/common/base/BaseModel.kt

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotations.TableLogic
 import com.baomidou.mybatisplus.enums.FieldFill
 import com.baomidou.mybatisplus.enums.FieldStrategy
 import com.baomidou.mybatisplus.enums.IdType
+import com.fasterxml.jackson.annotation.JsonInclude
 import io.swagger.annotations.ApiModelProperty
 import java.util.*
 
@@ -13,7 +14,7 @@ import java.util.*
  * 通用实体 包含通用字段
  * @author NorthLan at 2017/12/8
  */
-//@JsonInclude(JsonInclude.Include.NON_NULL) // jackson 忽略空值
+@JsonInclude(JsonInclude.Include.NON_NULL) // jackson 忽略空值
 open class BaseModel {
     // 主键
     @TableId(type = IdType.AUTO)

+ 52 - 0
zen-core/src/main/kotlin/com/gxzc/zen/common/config/json/DynamicFilterResponseBodyAdvice.kt

@@ -0,0 +1,52 @@
+package com.gxzc.zen.common.config.json
+
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.gxzc.zen.common.config.json.annotation.ZenFilter
+import com.gxzc.zen.common.config.json.annotation.ZenFilters
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.beans.factory.annotation.Qualifier
+import org.springframework.core.MethodParameter
+import org.springframework.http.MediaType
+import org.springframework.http.converter.HttpMessageConverter
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
+import org.springframework.http.converter.json.MappingJacksonValue
+import org.springframework.http.server.ServerHttpRequest
+import org.springframework.http.server.ServerHttpResponse
+import org.springframework.web.bind.annotation.ControllerAdvice
+import org.springframework.web.servlet.mvc.method.annotation.AbstractMappingJacksonResponseBodyAdvice
+
+/**
+ * Controller aop 切面拦截写入body时动态设置filter
+ * @author NorthLan
+ * @date 2018/3/13
+ * @url https://noahlan.com
+ */
+@ControllerAdvice
+class DynamicFilterResponseBodyAdvice : AbstractMappingJacksonResponseBodyAdvice() {
+
+    @Autowired
+    @Qualifier(ZenJsonConfigurer.CONVERTER_NAME)
+    private lateinit var converter: MappingJackson2HttpMessageConverter
+
+    override fun supports(returnType: MethodParameter, converterType: Class<out HttpMessageConverter<*>>): Boolean {
+        converter.objectMapper = ObjectMapper()
+        return super.supports(returnType, converterType) &&
+                (returnType.getMethodAnnotation(ZenFilter::class.java) != null
+                        || returnType.getMethodAnnotation(ZenFilters::class.java) != null)
+    }
+
+    override fun beforeBodyWriteInternal(bodyContainer: MappingJacksonValue, contentType: MediaType, returnType: MethodParameter, request: ServerHttpRequest, response: ServerHttpResponse) {
+        val jsonSerializer = ZenJsonSerializer()
+        returnType.methodAnnotations.forEach {
+            if (it is ZenFilter) {
+                jsonSerializer.filter(it)
+            } else if (it is ZenFilters) {
+                it.value.forEach {
+                    jsonSerializer.filter(it)
+                }
+            }
+        }
+        bodyContainer.filters = jsonSerializer.jacksonFilter
+        converter.objectMapper = jsonSerializer.mapper
+    }
+}

+ 14 - 0
zen-core/src/main/kotlin/com/gxzc/zen/common/config/json/FilterConverter.kt

@@ -0,0 +1,14 @@
+package com.gxzc.zen.common.config.json
+
+import com.fasterxml.jackson.databind.ObjectMapper
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
+
+/**
+ * 自定义FilterConverter
+ * @author NorthLan
+ * @date 2018/3/13
+ * @url https://noahlan.com
+ */
+class FilterConverter : MappingJackson2HttpMessageConverter() {
+
+}

+ 12 - 0
zen-core/src/main/kotlin/com/gxzc/zen/common/config/json/ZenDynamicFilterMixin.kt

@@ -0,0 +1,12 @@
+package com.gxzc.zen.common.config.json
+
+import com.fasterxml.jackson.annotation.JsonFilter
+
+/**
+ * Mixin
+ * @author NorthLan
+ * @date 2018/3/13
+ * @url https://noahlan.com
+ */
+@JsonFilter(ZenJacksonJsonFilter.FILTER_ID)
+class ZenDynamicFilterMixin

+ 10 - 6
zen-core/src/main/kotlin/com/gxzc/zen/common/config/json/ZenJacksonJsonFilter.kt

@@ -1,11 +1,13 @@
 package com.gxzc.zen.common.config.json
 
-import com.fasterxml.jackson.annotation.JsonFilter
+import com.fasterxml.jackson.core.JsonGenerator
+import com.fasterxml.jackson.databind.SerializerProvider
+import com.fasterxml.jackson.databind.ser.BeanPropertyFilter
+import com.fasterxml.jackson.databind.ser.FilterProvider
+import com.fasterxml.jackson.databind.ser.PropertyFilter
+import com.fasterxml.jackson.databind.ser.PropertyWriter
 import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter
 import kotlin.reflect.KClass
-import com.fasterxml.jackson.databind.SerializerProvider
-import com.fasterxml.jackson.core.JsonGenerator
-import com.fasterxml.jackson.databind.ser.*
 
 
 /**
@@ -14,15 +16,17 @@ import com.fasterxml.jackson.databind.ser.*
  * @date 2018/3/12
  * @url https://noahlan.com
  */
-@JsonFilter("ZenJacksonJsonFilter")
 class ZenJacksonJsonFilter : FilterProvider() {
+    companion object {
+        const val FILTER_ID = "ZenDynamicFilterProvider\$FILTER"
+    }
 
     private val includeMap = hashMapOf<KClass<out Any>, Set<String>>()
     private val filterMap = hashMapOf<KClass<out Any>, Set<String>>()
 
     @Suppress("deprecation")
     override fun findFilter(filterId: Any?): BeanPropertyFilter {
-        throw UnsupportedOperationException("Access to deprecated filters not supported");
+        throw UnsupportedOperationException("Access to deprecated filters not supported")
     }
 
     fun include(clazz: KClass<out Any>, fields: Array<String>) {

+ 15 - 3
zen-core/src/main/kotlin/com/gxzc/zen/common/config/json/ZenJsonConfigurer.kt

@@ -1,7 +1,9 @@
 package com.gxzc.zen.common.config.json
 
+import org.springframework.context.annotation.Bean
 import org.springframework.context.annotation.Configuration
-import org.springframework.web.method.support.HandlerMethodReturnValueHandler
+import org.springframework.http.converter.HttpMessageConverter
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
 
 /**
@@ -12,7 +14,17 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
  */
 @Configuration
 class ZenJsonConfigurer : WebMvcConfigurerAdapter() {
-    override fun addReturnValueHandlers(returnValueHandlers: MutableList<HandlerMethodReturnValueHandler>) {
-        returnValueHandlers.add(ZenJsonResultHandler())
+    companion object {
+        const val CONVERTER_NAME = "hookMappingJackson2HttpMessageConverter"
     }
+
+    override fun configureMessageConverters(converters: MutableList<HttpMessageConverter<*>>) {
+        converters.add(getConverter())
+    }
+
+    @Bean(CONVERTER_NAME)
+    fun getConverter(): MappingJackson2HttpMessageConverter {
+        return MappingJackson2HttpMessageConverter()
+    }
+
 }

+ 75 - 75
zen-core/src/main/kotlin/com/gxzc/zen/common/config/json/ZenJsonResultHandler.kt

@@ -1,76 +1,76 @@
-package com.gxzc.zen.common.config.json
-
-import com.gxzc.zen.common.config.json.annotation.ZenJsonFilter
-import org.springframework.beans.factory.config.BeanPostProcessor
-import org.springframework.core.MethodParameter
-import org.springframework.http.MediaType
-import org.springframework.http.server.ServletServerHttpRequest
-import org.springframework.http.server.ServletServerHttpResponse
-import org.springframework.stereotype.Component
-import org.springframework.web.context.request.NativeWebRequest
-import org.springframework.web.method.support.HandlerMethodReturnValueHandler
-import org.springframework.web.method.support.ModelAndViewContainer
-import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
-import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice
-import javax.servlet.http.HttpServletRequest
-import javax.servlet.http.HttpServletResponse
-
-
-/**
- * 自定义Json返回值序列化
- * @author NorthLan
- * @date 2018/3/12
- * @url https://noahlan.com
- */
-@Component
-class ZenJsonResultHandler : HandlerMethodReturnValueHandler, BeanPostProcessor {
-    var advices = mutableListOf<ResponseBodyAdvice<Any>>()
-
-    override fun supportsReturnType(returnType: MethodParameter): Boolean {
-        return returnType.getMethodAnnotation(ZenJsonFilter::class.java) != null
-    }
-
-    override fun handleReturnValue(returnValue: Any, returnType: MethodParameter, mavContainer: ModelAndViewContainer, webRequest: NativeWebRequest) {
+//package com.gxzc.zen.common.config.json
+//
+//import com.gxzc.zen.common.config.json.annotation.ZenFilter
+//import org.springframework.beans.factory.config.BeanPostProcessor
+//import org.springframework.core.MethodParameter
+//import org.springframework.http.MediaType
+//import org.springframework.http.server.ServletServerHttpRequest
+//import org.springframework.http.server.ServletServerHttpResponse
+//import org.springframework.stereotype.Component
+//import org.springframework.web.context.request.NativeWebRequest
+//import org.springframework.web.method.support.HandlerMethodReturnValueHandler
+//import org.springframework.web.method.support.ModelAndViewContainer
+//import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
+//import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice
+//import javax.servlet.http.HttpServletRequest
+//import javax.servlet.http.HttpServletResponse
+//
+//
+///**
+// * 自定义Json返回值序列化
+// * @author NorthLan
+// * @date 2018/3/12
+// * @url https://noahlan.com
+// */
+//@Component
+//class ZenJsonResultHandler : HandlerMethodReturnValueHandler, BeanPostProcessor {
+//    var advices = mutableListOf<ResponseBodyAdvice<Any>>()
+//
+//    override fun supportsReturnType(returnType: MethodParameter): Boolean {
+//        return returnType.getMethodAnnotation(ZenFilter::class.java) != null
+//    }
+//
+//    override fun handleReturnValue(returnValue: Any, returnType: MethodParameter, mavContainer: ModelAndViewContainer, webRequest: NativeWebRequest) {
 //        mavContainer.isRequestHandled = true
-
-        var newReturnValue: Any = returnValue
-        advices.forEach {
-            if (it.supports(returnType, null)) {
-                newReturnValue = it.beforeBodyWrite(returnValue, returnType, MediaType.APPLICATION_JSON_UTF8, null,
-                        ServletServerHttpRequest(webRequest.getNativeRequest(HttpServletRequest::class.java)),
-                        ServletServerHttpResponse(webRequest.getNativeResponse(HttpServletResponse::class.java)))
-            }
-        }
-        val response = webRequest.getNativeResponse(HttpServletResponse::class.java)
-        val annotations = returnType.methodAnnotations
-        val jsonSerializer = ZenJsonSerializer()
-        annotations.forEach {
-            if (it is ZenJsonFilter) {
-                jsonSerializer.filter(it)
-            }
-        }
-
-        response.contentType = MediaType.APPLICATION_JSON_UTF8_VALUE
-        response.writer.write(jsonSerializer.toJson(newReturnValue))
-    }
-
-    override fun postProcessBeforeInitialization(bean: Any, beanName: String): Any {
-        return bean
-    }
-
-    @Suppress("UNCHECKED_CAST")
-    override fun postProcessAfterInitialization(bean: Any, beanName: String): Any {
-        if (bean is ResponseBodyAdvice<*>) {
-            advices.add(bean as ResponseBodyAdvice<Any>)
-        } else if (bean is RequestMappingHandlerAdapter) {
-            val handlers = ArrayList(bean.returnValueHandlers)
-            val handler = handlers.firstOrNull { it is ZenJsonResultHandler }?.let { it as ZenJsonResultHandler }
-            handler?.let {
-                handlers.remove(it)
-                handlers.add(0, it)
-                bean.returnValueHandlers = handlers // 修改排序到第一位
-            }
-        }
-        return bean
-    }
-}
+//
+//        var newReturnValue: Any = returnValue
+//        advices.forEach {
+//            if (it.supports(returnType, null)) {
+//                newReturnValue = it.beforeBodyWrite(returnValue, returnType, MediaType.APPLICATION_JSON_UTF8, null,
+//                        ServletServerHttpRequest(webRequest.getNativeRequest(HttpServletRequest::class.java)),
+//                        ServletServerHttpResponse(webRequest.getNativeResponse(HttpServletResponse::class.java)))
+//            }
+//        }
+//        val response = webRequest.getNativeResponse(HttpServletResponse::class.java)
+//        val annotations = returnType.methodAnnotations
+//        val jsonSerializer = ZenJsonSerializer()
+//        annotations.forEach {
+//            if (it is ZenFilter) {
+//                jsonSerializer.filter(it)
+//            }
+//        }
+//
+//        response.contentType = MediaType.APPLICATION_JSON_UTF8_VALUE
+//        response.writer.write(jsonSerializer.toJson(newReturnValue))
+//    }
+//
+//    override fun postProcessBeforeInitialization(bean: Any, beanName: String): Any {
+//        return bean
+//    }
+//
+//    @Suppress("UNCHECKED_CAST")
+//    override fun postProcessAfterInitialization(bean: Any, beanName: String): Any {
+//        if (bean is ResponseBodyAdvice<*>) {
+//            advices.add(bean as ResponseBodyAdvice<Any>)
+//        } else if (bean is RequestMappingHandlerAdapter) {
+//            val handlers = ArrayList(bean.returnValueHandlers)
+//            val handler = handlers.firstOrNull { it is ZenJsonResultHandler }?.let { it as ZenJsonResultHandler }
+//            handler?.let {
+//                handlers.remove(it)
+//                handlers.add(0, it)
+//                bean.returnValueHandlers = handlers // 修改排序到第一位
+//            }
+//        }
+//        return bean
+//    }
+//}

+ 10 - 10
zen-core/src/main/kotlin/com/gxzc/zen/common/config/json/ZenJsonSerializer.kt

@@ -1,7 +1,7 @@
 package com.gxzc.zen.common.config.json
 
 import com.fasterxml.jackson.databind.ObjectMapper
-import com.gxzc.zen.common.config.json.annotation.ZenJsonFilter
+import com.gxzc.zen.common.config.json.annotation.ZenFilter
 import kotlin.reflect.KClass
 
 /**
@@ -11,8 +11,8 @@ import kotlin.reflect.KClass
  * @url https://noahlan.com
  */
 class ZenJsonSerializer {
-    private val mapper = ObjectMapper()
-    private val jacksonFilter = ZenJacksonJsonFilter()
+    val mapper = ObjectMapper()
+    val jacksonFilter = ZenJacksonJsonFilter()
 
     fun filter(clazz: KClass<*>?, include: Array<String>?, filter: Array<String>?) {
         if (clazz == null) {
@@ -24,15 +24,15 @@ class ZenJsonSerializer {
         if (filter != null && filter.isNotEmpty()) {
             jacksonFilter.filter(clazz, filter)
         }
-        mapper.addMixIn(clazz.java, jacksonFilter::class.java)
+        mapper.addMixIn(clazz.java, ZenDynamicFilterMixin::class.java)
     }
 
-    fun toJson(any: Any): String {
-        mapper.setFilterProvider(jacksonFilter)
-        return mapper.writeValueAsString(any)
+    fun filter(zenFilter: ZenFilter) {
+        this.filter(zenFilter.type, zenFilter.include, zenFilter.filter)
     }
 
-    fun filter(zenJsonFilter: ZenJsonFilter) {
-        this.filter(zenJsonFilter.type, zenJsonFilter.include, zenJsonFilter.filter)
-    }
+//    fun toJson(any: Any): String {
+//        mapper.setFilterProvider(jacksonFilter)
+//        return mapper.writeValueAsString(any)
+//    }
 }

+ 21 - 0
zen-core/src/main/kotlin/com/gxzc/zen/common/config/json/annotation/ZenFilter.java

@@ -0,0 +1,21 @@
+package com.gxzc.zen.common.config.json.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * Json注解,用于返回值的动态过滤
+ * 由于kotlin不支持repeatable 故暂使用java方式进行
+ * @author NorthLan
+ * @date 2018/3/13
+ * @url https://noahlan.com
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Repeatable(ZenFilters.class)
+public @interface ZenFilter {
+    Class<?> type();
+
+    String[] include() default {};
+
+    String[] filter() default {};
+}

+ 16 - 0
zen-core/src/main/kotlin/com/gxzc/zen/common/config/json/annotation/ZenFilters.java

@@ -0,0 +1,16 @@
+package com.gxzc.zen.common.config.json.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * ZenFilter 注解容器
+ * 由于kotlin不支持repeatable 故暂使用java方式进行
+ * @author NorthLan
+ * @date 2018/3/13
+ * @url https://noahlan.com
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ZenFilters {
+    ZenFilter[] value();
+}

+ 0 - 14
zen-core/src/main/kotlin/com/gxzc/zen/common/config/json/annotation/ZenJsonFilter.kt

@@ -1,14 +0,0 @@
-package com.gxzc.zen.common.config.json.annotation
-
-import kotlin.reflect.KClass
-
-/**
- * Json注解,用于返回值的动态过滤
- * @author NorthLan
- * @date 2018/3/12
- * @url https://noahlan.com
- */
-@Target(AnnotationTarget.FUNCTION)
-@Retention(AnnotationRetention.RUNTIME)
-@Repeatable
-annotation class ZenJsonFilter(val type: KClass<out Any>, val include: Array<String> = [], val filter: Array<String> = [])

+ 3 - 1
zen-core/src/main/kotlin/com/gxzc/zen/common/dto/ResponseDto.kt

@@ -1,6 +1,7 @@
 package com.gxzc.zen.common.dto
 
 import com.fasterxml.jackson.annotation.JsonFormat
+import com.fasterxml.jackson.annotation.JsonInclude
 import khronos.Dates
 import java.util.*
 
@@ -11,8 +12,9 @@ import java.util.*
  * @date 2018/2/1
  * @url https://noahlan.com
  */
+@JsonInclude(JsonInclude.Include.NON_NULL)
 class ResponseDto {
-    var data: MutableMap<String, Any> = mutableMapOf()
+    var data: Any? = null
 
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     var time: Date = Dates.today

+ 16 - 10
zen-web/src/main/kotlin/com/gxzc/zen/web/sys/controller/SysDicController.kt

@@ -3,8 +3,10 @@ package com.gxzc.zen.web.sys.controller
 import com.gxzc.zen.api.sys.model.SysDic
 import com.gxzc.zen.api.sys.service.ISysDicService
 import com.gxzc.zen.common.base.BaseController
-import com.gxzc.zen.common.config.json.annotation.ZenJsonFilter
+import com.gxzc.zen.common.config.json.annotation.ZenFilter
 import com.gxzc.zen.common.dto.ResponseDto
+import com.gxzc.zen.common.exception.ZenException
+import com.gxzc.zen.common.exception.ZenExceptionEnum
 import org.slf4j.LoggerFactory
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.http.ResponseEntity
@@ -27,26 +29,30 @@ class SysDicController : BaseController() {
     private lateinit var sysDicService: ISysDicService
 
     @GetMapping("/list")
-    @ZenJsonFilter(type = SysDic::class, filter = ["id", "createdBy"])
+    @ZenFilter(type = SysDic::class, filter = ["createBy", "updateBy", "createTime", "updateTime"])
     fun getList(): ResponseEntity<*> {
-        val ret = sysDicService.selectList()
         return ResponseEntity.ok(ResponseDto().apply {
-            data["list"] = ret
+            data = sysDicService.selectList()
         })
     }
 
     @GetMapping("{key}")
-    @RequestMapping(method = [RequestMethod.GET])
+    @ZenFilter(type = SysDic::class, filter = ["createBy", "updateBy", "createTime", "updateTime"])
     fun get(@PathVariable key: String): ResponseEntity<*> {
-        val ret = sysDicService.getListByKey(key)
         return ResponseEntity.ok(ResponseDto().apply {
-            data["list"] = ret
+            data = sysDicService.getListByKey(key)
         })
     }
 
     @PutMapping("{key}")
-    fun putDic(@PathVariable key: String, @RequestBody requestDto: ResponseDto): ResponseEntity<*> {
-        // sysDicService.modifySysDic()
-        return ResponseEntity.ok(null)
+    @ZenFilter(type = SysDic::class, filter = ["createBy", "updateBy", "createTime", "updateTime"])
+    fun putDic(@PathVariable key: String, @RequestBody requestDic: SysDic?): ResponseEntity<*> {
+        if (requestDic == null) {
+            throw ZenException(ZenExceptionEnum.REQUEST_NULL)
+        }
+
+        return ResponseEntity.ok(ResponseDto().apply {
+            data = sysDicService.modifySysDic(requestDic)
+        })
     }
 }

+ 12 - 14
zen-web/src/main/kotlin/com/gxzc/zen/web/sys/controller/UserController.kt

@@ -1,11 +1,13 @@
 package com.gxzc.zen.web.sys.controller
 
 import com.baomidou.kisso.SSOToken
-import com.baomidou.kisso.annotation.Action
-import com.baomidou.kisso.annotation.Permission
+import com.gxzc.zen.api.sys.model.SysRole
+import com.gxzc.zen.api.sys.model.SysUser
 import com.gxzc.zen.api.sys.service.ISysUserRoleService
 import com.gxzc.zen.api.sys.service.ISysUserService
 import com.gxzc.zen.common.base.BaseController
+import com.gxzc.zen.common.config.json.annotation.ZenFilter
+import com.gxzc.zen.common.config.json.annotation.ZenFilters
 import com.gxzc.zen.common.dto.RequestDto
 import com.gxzc.zen.common.dto.ResponseDto
 import org.slf4j.LoggerFactory
@@ -34,21 +36,17 @@ class UserController : BaseController() {
 
 
     @GetMapping("/info")
-    @Permission(action = Action.Skip)
+    @ZenFilters(
+            ZenFilter(type = SysUser::class, include = ["id", "enable", "account", "username", "position", "address", "staffNo", "remark"]),
+            ZenFilter(type = SysRole::class, include = ["id", "enable", "name", "code", "perms", "remark"])
+    )
     fun userInfo(): ResponseEntity<*> {
         val token: SSOToken = getSSOToken()
-        val userRoleList = userRoleService.getUserRoleListByUserId(token.uid.toLong())
-        val userInfo = userService.getUserByIdCacheable(token.uid.toLong())
-
         return ResponseEntity.ok(ResponseDto().apply {
-            data["info"] = mutableMapOf(
-                    "account" to userInfo.account,
-                    "username" to userInfo.username,
-                    "id" to userInfo.id,
-                    "position" to userInfo.position,
-                    "address" to userInfo.address,
-                    "staffNo" to userInfo.staffNo)
-            data["roles"] = userRoleList
+            data = mutableMapOf(
+                    "info" to userService.getUserByIdCacheable(token.uid.toLong()),
+                    "roles" to userRoleService.getUserRoleListByUserId(token.uid.toLong())
+            )
         })
     }