Browse Source

Debug timezone;Add Volcengine

tsurumure 2 months ago
parent
commit
11f7ecbe05

+ 31 - 6
pom.xml

@@ -165,6 +165,26 @@
             <version>3.5.3.2</version>
         </dependency>
 
+
+
+<!--        <dependency>-->
+<!--            <groupId>com.fasterxml.jackson.datatype</groupId>-->
+<!--            <artifactId>jackson-datatype-jsr310</artifactId>-->
+<!--            <version>2.15.1</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>javax.annotation</groupId>-->
+<!--            <artifactId>javax.annotation-api</artifactId>-->
+<!--            <version>1.3.2</version>-->
+<!--        </dependency>-->
+
+
+
+
+
+
+
+
         <dependency>
             <groupId>com.mysql</groupId>
             <artifactId>mysql-connector-j</artifactId>
@@ -277,12 +297,17 @@
             <version>0.4.20</version>
         </dependency>
 
-        <!-- 字节 (火山引擎/豆包同款) (包的版本号不对) -->
-<!--        <dependency>-->
-<!--            <groupId>com.volcengine</groupId>-->
-<!--            <artifactId>volc-sdk-java</artifactId>-->
-<!--            <version>1.0.150</version>-->
-<!--        </dependency>-->
+        <!-- 火山引擎 -->
+        <dependency>
+            <groupId>com.volcengine</groupId>
+            <artifactId>volc-sdk-java</artifactId>
+            <version>1.0.225</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.annotation</groupId>
+            <artifactId>javax.annotation-api</artifactId>
+            <version>1.3.2</version>
+        </dependency>
 
         <!--Java 9及以上的版本,则需要添加jaxb相关依赖-->
         <dependency>

+ 38 - 0
src/main/java/com/backendsys/config/Mybatis/JacksonConfig.java

@@ -0,0 +1,38 @@
+//package com.backendsys.config.Mybatis;
+//
+//import com.fasterxml.jackson.databind.ObjectMapper;
+//import com.fasterxml.jackson.databind.SerializationFeature;
+//import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.http.converter.HttpMessageConverter;
+//import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+//import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+//
+//import javax.annotation.PostConstruct;
+//import java.util.List;
+//
+//@Configuration
+//public class JacksonConfig implements WebMvcConfigurer {
+//
+//    @Autowired
+//    private ObjectMapper objectMapper;
+//
+//    @PostConstruct
+//    public void init() {
+//        // 强制注册 JavaTimeModule
+//        objectMapper.registerModule(new JavaTimeModule());
+//        // 禁用时间戳格式
+//        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+//
+//        System.out.println("强制注册后的模块: " + objectMapper.getRegisteredModuleIds());
+//    }
+//
+//    @Override
+//    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
+//        // 确保使用配置后的 ObjectMapper
+//        converters.stream()
+//                .filter(converter -> converter instanceof MappingJackson2HttpMessageConverter)
+//                .forEach(converter -> ((MappingJackson2HttpMessageConverter) converter).setObjectMapper(objectMapper));
+//    }
+//}

+ 23 - 0
src/main/java/com/backendsys/config/Mybatis/MyBatisConfig.java

@@ -0,0 +1,23 @@
+//package com.backendsys.config.Mybatis;
+//
+//import com.backendsys.config.Mybatis.handler.timezone.LocalDateTimeHandler;
+//import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//
+//import java.time.LocalDateTime;
+//
+//@Configuration
+//public class MyBatisConfig {
+//
+//    /**
+//     * 全部设置时区时间
+//     * @return
+//     */
+//    @Bean
+//    public ConfigurationCustomizer configurationCustomizer() {
+//        return configuration -> {
+//            configuration.getTypeHandlerRegistry().register(LocalDateTime.class, new LocalDateTimeHandler());
+//        };
+//    }
+//}

+ 22 - 0
src/main/java/com/backendsys/config/Mybatis/handler/timezone/LocalDateTimeAdapter.java

@@ -0,0 +1,22 @@
+package com.backendsys.config.Mybatis.handler.timezone;
+
+import com.google.gson.*;
+
+import java.lang.reflect.Type;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+public class LocalDateTimeAdapter implements JsonSerializer<LocalDateTime>, JsonDeserializer<LocalDateTime> {
+
+    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
+
+    @Override
+    public JsonElement serialize(LocalDateTime src, Type typeOfSrc, JsonSerializationContext context) {
+        return new JsonPrimitive(formatter.format(src));
+    }
+
+    @Override
+    public LocalDateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+        return LocalDateTime.parse(json.getAsString(), formatter);
+    }
+}

+ 61 - 0
src/main/java/com/backendsys/config/Mybatis/handler/timezone/LocalDateTimeHandler.java

@@ -0,0 +1,61 @@
+package com.backendsys.config.Mybatis.handler.timezone;
+
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedJdbcTypes;
+import org.apache.ibatis.type.MappedTypes;
+import org.springframework.stereotype.Component;
+
+import java.sql.*;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+
+@MappedTypes(LocalDateTime.class)
+@MappedJdbcTypes(JdbcType.TIMESTAMP)
+@Component
+public class LocalDateTimeHandler extends BaseTypeHandler<LocalDateTime> {
+
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, LocalDateTime parameter, JdbcType jdbcType) throws SQLException {
+        ps.setTimestamp(i, java.sql.Timestamp.valueOf(parameter));
+    }
+
+    @Override
+    public void setParameter(PreparedStatement ps, int i, LocalDateTime parameter, JdbcType jdbcType) throws SQLException {
+        if (parameter == null) {
+            // 允许数据库使用默认值
+            ps.setNull(i, Types.TIMESTAMP);
+        } else {
+            super.setParameter(ps, i, parameter, jdbcType);
+        }
+    }
+
+    @Override
+    public LocalDateTime getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        java.sql.Timestamp timestamp = rs.getTimestamp(columnName);
+        return convertToLocalDateTime(timestamp);
+    }
+
+    @Override
+    public LocalDateTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        java.sql.Timestamp timestamp = rs.getTimestamp(columnIndex);
+        return convertToLocalDateTime(timestamp);
+    }
+
+    @Override
+    public LocalDateTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        java.sql.Timestamp timestamp = cs.getTimestamp(columnIndex);
+        return convertToLocalDateTime(timestamp);
+    }
+
+    /**
+     * 设置时区(如果为空则默认使用上海时区)
+     */
+    private LocalDateTime convertToLocalDateTime(java.sql.Timestamp timestamp) {
+        if (timestamp == null) return null;
+        return timestamp.toInstant()
+            .atZone(ZoneId.of("UTC"))
+            .withZoneSameInstant(ZoneId.of(TimezoneContextHolder.getTimeZone()))
+            .toLocalDateTime();
+    }
+}

+ 17 - 0
src/main/java/com/backendsys/config/Mybatis/handler/timezone/TimezoneContextHolder.java

@@ -0,0 +1,17 @@
+package com.backendsys.config.Mybatis.handler.timezone;
+
+public class TimezoneContextHolder {
+    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
+
+    public static void setTimeZone(String timeZone) {
+        contextHolder.set(timeZone);
+    }
+
+    public static String getTimeZone() {
+        return contextHolder.get();
+    }
+
+    public static void clear() {
+        contextHolder.remove();
+    }
+}

+ 49 - 0
src/main/java/com/backendsys/config/Serializer/LocalDateTimeSerializer.java

@@ -0,0 +1,49 @@
+package com.backendsys.config.Serializer;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.BeanProperty;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.ContextualSerializer;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.Optional;
+
+public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> implements ContextualSerializer {
+
+    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+    @Override
+    public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
+
+        System.out.println("LocalDateTimeSerializer serialize:");
+
+        // 从请求上下文中获取 timezone
+        String timezone = getAttributeFromRequest("timezone");
+        // 如果没有 timezone,则默认使用 Asia/Shanghai
+        ZoneId zoneId = ZoneId.of(Optional.ofNullable(timezone).orElse("Asia/Shanghai"));
+        // 转换为指定时区的本地时间
+        LocalDateTime localDateTime = value.atZone(ZoneId.of("UTC")).withZoneSameInstant(zoneId).toLocalDateTime();
+        // 格式化为字符串
+        gen.writeString(FORMATTER.format(localDateTime));
+    }
+
+    @Override
+    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) {
+        return this;
+    }
+
+    private String getAttributeFromRequest(String attributeName) {
+        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        if (requestAttributes != null) {
+            return (String) requestAttributes.getRequest().getAttribute(attributeName);
+        }
+        return null;
+    }
+}

+ 15 - 0
src/main/java/com/backendsys/modules/TestController.java

@@ -11,6 +11,8 @@ import com.backendsys.modules.common.config.security.utils.HttpRequestUtil;
 import com.backendsys.modules.common.utils.Result;
 import com.backendsys.modules.sdk.baidu.yunapp.entity.ExecuteScriptParams;
 import com.backendsys.modules.sdk.baidu.yunapp.service.YunappService;
+import com.backendsys.modules.sdk.volcengine.entity.VisualFaceSwapV2;
+import com.backendsys.modules.sdk.volcengine.service.VolcengineService;
 import com.backendsys.service.TestService;
 import com.backendsys.utils.ResourceUtil;
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -23,6 +25,8 @@ import com.tencentcloudapi.common.Credential;
 //import io.github.pigmesh.ai.deepseek.core.DeepSeekClientImpl;
 //import io.github.pigmesh.ai.deepseek.core.OpenAiHttpException;
 //import io.github.pigmesh.ai.deepseek.core.chat.ChatCompletionResponse;
+import com.volcengine.service.visual.IVisualService;
+import com.volcengine.service.visual.impl.VisualServiceImpl;
 import jakarta.servlet.ServletContext;
 import org.apache.poi.xwpf.usermodel.XWPFDocument;
 import org.redisson.api.*;
@@ -106,6 +110,17 @@ public class TestController {
 //        return deepSeekClient.chatFluxCompletion(request);
 //    }
 
+    @Autowired
+    private VolcengineService volcengineService;
+
+    @PostMapping("/FaceSwapV2")
+    public Result FaceSwapV2(@RequestBody VisualFaceSwapV2 visualFaceSwapV2) {
+        System.out.println(visualFaceSwapV2);
+        return Result.success().put("data", volcengineService.FaceSwapV2(visualFaceSwapV2));
+    }
+
+
+
     @Autowired
     private ServletContext servletContext;
 

+ 6 - 1
src/main/java/com/backendsys/modules/cms/article/entity/Article.java

@@ -1,14 +1,17 @@
 package com.backendsys.modules.cms.article.entity;
 
+import com.backendsys.config.Mybatis.handler.timezone.LocalDateTimeAdapter;
 import com.backendsys.entity.validator.RangeArray;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.google.gson.annotations.JsonAdapter;
 import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 @Data
@@ -56,6 +59,8 @@ public class Article {
     @RangeArray(message="资讯状态取值有误,范围应是(-1禁用, 1启用)", value = {"-1", "1"}, groups = { Create.class, Update.class})
     private Integer status;
     private Integer is_top;
-    private String create_time;
+
+    @JsonAdapter(LocalDateTimeAdapter.class)
+    private LocalDateTime create_time;
     private String update_time;
 }

+ 12 - 1
src/main/java/com/backendsys/modules/cms/article/service/impl/ArticleServiceImpl.java

@@ -1,5 +1,7 @@
 package com.backendsys.modules.cms.article.service.impl;
 
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.core.util.IdUtil;
 import com.backendsys.exception.CustException;
 import com.backendsys.modules.cms.article.dao.ArticleDao;
@@ -18,6 +20,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDateTime;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -40,7 +44,9 @@ public class ArticleServiceImpl implements ArticleService {
     @Override
     public PageEntity selectArticleList(Article article) {
         PageUtils.startPage();  // 分页
-        List<Article> list = articleDao.selectArticleList(article);
+//        List<Article> list = articleDao.selectArticleList(article);
+//        List<Article> list = articleDao.selectList(new LambdaQueryWrapper<Article>().eq(Article::getTitle, article.getTitle()));
+        List<Article> list = articleDao.selectList(new LambdaQueryWrapper<>());
         return new PageInfoResult(list).toEntity();
     }
 
@@ -94,6 +100,11 @@ public class ArticleServiceImpl implements ArticleService {
 
         // 插入
         article.setUser_id(httpRequestUtil.getUserId());
+
+
+//        System.out.println("create_time = " + LocalDateTime.parse(LocalDateTimeUtil.formatNormal(LocalDateTime.now())));
+//        article.setCreate_time(LocalDateTime.parse(LocalDateTimeUtil.formatNormal(LocalDateTime.now())));
+
         articleDao.insert(article);
 
         // 批量插入 (翻译字段)

+ 9 - 1
src/main/java/com/backendsys/modules/common/config/WebConfig.java

@@ -1,6 +1,7 @@
 package com.backendsys.modules.common.config;
 
 import com.backendsys.modules.common.interceptor.ApiLogInterceptor;
+import com.backendsys.modules.common.interceptor.TimezoneInterceptor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Configuration;
@@ -16,11 +17,18 @@ public class WebConfig implements WebMvcConfigurer {
 
     @Autowired
     private ApiLogInterceptor apiLogInterceptor;        // 日志拦截器
+    @Autowired
+    private TimezoneInterceptor timezoneInterceptor;    // 时区拦截器
 
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
-        // [拦截器] API日志
+
+        // 日志拦截器
         if (API_LOG) registry.addInterceptor(apiLogInterceptor);
+
+        // 时区拦截器
+        registry.addInterceptor(timezoneInterceptor);
+
     }
 
     // 静态资源映射

+ 30 - 22
src/main/java/com/backendsys/modules/common/interceptor/TimezoneInterceptor.java

@@ -1,22 +1,30 @@
-//package com.backendsys.modules.common.interceptor;
-//import org.springframework.stereotype.Component;
-//import org.springframework.web.servlet.HandlerInterceptor;
-//
-//import javax.servlet.http.HttpServletRequest;
-//import javax.servlet.http.HttpServletResponse;
-//import java.util.Optional;
-//
-//@Component
-//public class TimezoneInterceptor implements HandlerInterceptor {
-//
-//    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
-//        // 获取 headers 中的 timezone 参数
-//        String timezone = request.getHeader("timezone");
-//        // 如果没有传递 timezone,则默认使用 Asia/Shanghai
-//        String finalTimezone = Optional.ofNullable(timezone).orElse("Asia/Shanghai");
-//        // 将 timezone 存储在请求上下文中
-//        request.setAttribute("timezone", finalTimezone);
-//        return true;
-//    }
-//
-//}
+package com.backendsys.modules.common.interceptor;
+import com.backendsys.config.Mybatis.handler.timezone.TimezoneContextHolder;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Optional;
+
+@Component
+public class TimezoneInterceptor implements HandlerInterceptor {
+
+    /**
+     * 如果没有传递 timezone,则默认使用 Asia/Shanghai (默认时区)
+     */
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
+        String timezone = request.getHeader("timezone");
+        String finalTimezone = Optional.ofNullable(timezone).orElse("Asia/Shanghai");
+        // 将 timezone 存储在 ThreadLocal 中
+        TimezoneContextHolder.setTimeZone(finalTimezone);
+        return true;
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
+        // 清除 ThreadLocal 中的时区信息
+        TimezoneContextHolder.clear();
+    }
+}

+ 24 - 0
src/main/java/com/backendsys/modules/sdk/volcengine/entity/VisualFaceSwapV2.java

@@ -0,0 +1,24 @@
+package com.backendsys.modules.sdk.volcengine.entity;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+
+@Data
+public class VisualFaceSwapV2 {
+
+    // 3.6版本取固定值 face_swap3_6
+    private String req_key;
+
+    // 输入换脸和模板图片链接数组,换脸图在前(最多三张),模板图在后(最多一张)
+    private ArrayList<String> image_urls;
+
+    // 获取人脸位置的方式,支持以下三种模式
+    // - l2r:根据人脸中心点从左往右的序号获取
+    // - t2b:根据人脸中心点从上往下的序号获取
+    // - area:根据人脸面积从大到小的序号获取(默认)
+    private String face_type;
+
+
+
+}

+ 11 - 0
src/main/java/com/backendsys/modules/sdk/volcengine/service/VolcengineService.java

@@ -0,0 +1,11 @@
+package com.backendsys.modules.sdk.volcengine.service;
+
+import com.backendsys.modules.sdk.volcengine.entity.VisualFaceSwapV2;
+import com.volcengine.service.visual.model.response.VisualFaceSwapV2Response;
+
+public interface VolcengineService {
+
+    // 人像融合3.6(最新版)
+    VisualFaceSwapV2Response FaceSwapV2(VisualFaceSwapV2 visualFaceSwapV2);
+
+}

+ 55 - 0
src/main/java/com/backendsys/modules/sdk/volcengine/service/impl/VolcengineServiceImpl.java

@@ -0,0 +1,55 @@
+package com.backendsys.modules.sdk.volcengine.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.backendsys.exception.CustException;
+import com.backendsys.modules.sdk.volcengine.entity.VisualFaceSwapV2;
+import com.backendsys.modules.sdk.volcengine.service.VolcengineService;
+import com.volcengine.service.visual.IVisualService;
+import com.volcengine.service.visual.impl.VisualServiceImpl;
+import com.volcengine.service.visual.model.request.VisualFaceSwapV2Request;
+import com.volcengine.service.visual.model.response.VisualFaceSwapV2Response;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+
+@Service
+public class VolcengineServiceImpl implements VolcengineService {
+
+    /**
+     * 人像融合3.6(最新版)
+     * https://www.volcengine.com/docs/6791/1337909
+     * https://github.com/volcengine/volc-sdk-java/blob/main/example/src/main/java/com/volcengine/example/visual/FaceSwapV2Demo.java
+     */
+    @Override
+    public VisualFaceSwapV2Response FaceSwapV2(VisualFaceSwapV2 visualFaceSwapV2) {
+        IVisualService visualService = VisualServiceImpl.getInstance();
+
+        visualService.setAccessKey("AKLTNzVlZWQwNzYxYTc2NDNmY2JlYzRiMzU5NDkzOGE0ZmQ");
+        visualService.setSecretKey("TVdJMU5XWTRNV1ZpWTJFMk5ETmtNV0pqTWpGaU5Ua3hOelF6TWpjNU0yVQ==");
+
+        VisualFaceSwapV2Request req = new VisualFaceSwapV2Request();
+
+        req.setReqKey(visualFaceSwapV2.getReq_key());
+        req.setImageUrls(visualFaceSwapV2.getImage_urls());
+        req.setFaceType(visualFaceSwapV2.getFace_type());
+
+        ArrayList<VisualFaceSwapV2Request.MergeInfos> mergeInfosList= new ArrayList<>();
+        VisualFaceSwapV2Request.MergeInfos mergeInfos=new VisualFaceSwapV2Request.MergeInfos();
+        mergeInfos.setLocation(1);
+        mergeInfos.setTemplate_location(1);
+        mergeInfosList.add(mergeInfos);
+        req.setMergeInfos(mergeInfosList);
+        req.setDoRisk(false);
+        req.setSourceSimilarity("1");
+        try {
+            VisualFaceSwapV2Response response = visualService.faceSwapV2(req);
+            System.out.println(JSON.toJSONString(response));
+            return response;
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.out.println(e.getMessage());
+            throw new CustException(e.getMessage());
+        }
+    }
+
+}

+ 1 - 1
src/main/resources/mapper/cms/article/ArticleDao.xml

@@ -67,7 +67,7 @@
         <result property="status" column="status" javaType="java.lang.Integer" />
         <result property="is_top" column="is_top" javaType="java.lang.Integer" />
         <result property="create_time" column="create_time" />
-        <result property="update_time" column="update_time" />
+        <result property="update_time" column="update_time" javaType="java.lang.String" />
     </resultMap>
 
     <resultMap id="resultMapArticleDetail" type="java.util.LinkedHashMap">

+ 1 - 1
src/main/resources/mapper/crt/drama/CrtDramaProjectDao.xml

@@ -25,7 +25,7 @@
         <result property="drama_lora_character_ids" column="drama_lora_character_ids" />
         <result property="create_user_id" column="create_user_id" />
         <result property="create_time" column="create_time" />
-        <result property="update_time" column="update_time" />
+        <result property="update_time" column="update_time" javaType="java.lang.String" />
     </resultMap>
 
     <!-- 查 列表 -->