Browse Source

Merge branch 'dev-yhq' into develop

tsurumure 2 months ago
parent
commit
0d38c18cd4

+ 1 - 2
src/main/java/com/backendsys/config/Mybatis/handler/timezone/LocalDateTimeHandler.java

@@ -50,8 +50,7 @@ public class LocalDateTimeHandler extends BaseTypeHandler<LocalDateTime> {
 
     private LocalDateTime convertToLocalDateTime(java.sql.Timestamp timestamp) {
         if (timestamp == null) return null;
-        return timestamp.toInstant()
-            .atZone(ZoneId.of("UTC"))
+        return timestamp.toInstant().atZone(ZoneId.of("UTC"))
             .withZoneSameInstant(ZoneId.of(TimezoneContextHolder.getTimeZone()))
             .toLocalDateTime();
     }

+ 10 - 2
src/main/java/com/backendsys/modules/ai/chat/entity/Chat.java

@@ -1,14 +1,18 @@
 package com.backendsys.modules.ai.chat.entity;
 
+import com.backendsys.config.Mybatis.handler.timezone.LocalDateTimeAdapter;
 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 jakarta.validation.constraints.Size;
 import lombok.Data;
 
+import java.time.LocalDateTime;
+
 @Data
 @TableName("ai_chat")
 public class Chat {
@@ -52,7 +56,11 @@ public class Chat {
     @TableField(exist = false)
     private Boolean internet = false;       // 是否联网搜索
     private Integer del_flag;
-    private String create_time;
-    private String update_time;
+
+    @JsonAdapter(LocalDateTimeAdapter.class)
+    private LocalDateTime create_time;
+
+    @JsonAdapter(LocalDateTimeAdapter.class)
+    private LocalDateTime update_time;
 
 }

+ 9 - 2
src/main/java/com/backendsys/modules/ai/chat/entity/ChatHistory.java

@@ -1,14 +1,18 @@
 package com.backendsys.modules.ai.chat.entity;
 
+import com.backendsys.config.Mybatis.handler.timezone.LocalDateTimeAdapter;
 import com.backendsys.entity.validator.RangeStringArray;
 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.Size;
 import lombok.Data;
 
+import java.time.LocalDateTime;
+
 @Data
 @TableName("ai_chat_history")
 public class ChatHistory {
@@ -30,7 +34,10 @@ public class ChatHistory {
     private Integer chat_count;
 
     private Integer del_flag;
-    private String create_time;
-    private String update_time;
+
+    @JsonAdapter(LocalDateTimeAdapter.class)
+    private LocalDateTime create_time;
+    @JsonAdapter(LocalDateTimeAdapter.class)
+    private LocalDateTime update_time;
 
 }

+ 1 - 1
src/main/java/com/backendsys/modules/cms/article/dao/ArticleDao.java

@@ -9,7 +9,7 @@ import java.util.Map;
 
 @Mapper
 public interface ArticleDao extends BaseMapper<Article> {
-    List<Article> selectArticleList(Article article);
+    List<Map<String, Object>> selectArticleList(Article article);
     Map<String, Object> selectArticleDetail(Article article);
 //    Article selectArticle(Article article);
 }

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

@@ -51,20 +51,28 @@ public class Article {
     private List<ArticleI18n> translations;
 
     private Long user_id;
+    @TableField(exist = false)
+    private String user_nickname;
+
     private Long category_id;
+    @TableField(exist = false)
+    private String category_name;
 
     @RangeArray(message="资讯状态取值有误,范围应是(-1禁用, 1启用)", value = {"-1", "1"}, groups = { Create.class, Update.class})
     private Integer status;
     private Integer is_top;
 
-    private String create_time;
-    private String update_time;
 
-    @TableField(value = "create_time")
     @JsonAdapter(LocalDateTimeAdapter.class)
-    private LocalDateTime create_time_local;
+    private LocalDateTime create_time;
 
-    @TableField(value = "update_time")
     @JsonAdapter(LocalDateTimeAdapter.class)
-    private LocalDateTime update_time_local;
+    private LocalDateTime update_time;
+
+    @TableField(value = "create_time")
+    private String create_time_utc;
+
+    @TableField(value = "update_time")
+    private String update_time_utc;
+
 }

+ 19 - 8
src/main/java/com/backendsys/modules/cms/article/service/impl/ArticleServiceImpl.java

@@ -1,7 +1,5 @@
 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;
@@ -11,6 +9,7 @@ import com.backendsys.modules.cms.article.entity.ArticleI18n;
 import com.backendsys.modules.cms.article.service.ArticleService;
 import com.backendsys.modules.common.config.security.utils.HttpRequestUtil;
 import com.backendsys.modules.common.utils.ValidationUtil;
+import com.backendsys.utils.MapUtil;
 import com.backendsys.utils.response.PageEntity;
 import com.backendsys.utils.response.PageInfoResult;
 import com.backendsys.utils.v2.PageUtils;
@@ -20,11 +19,7 @@ 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;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
@@ -44,7 +39,23 @@ public class ArticleServiceImpl implements ArticleService {
     @Override
     public PageEntity selectArticleList(Article article) {
         PageUtils.startPage();  // 分页
-        List<Article> list = articleDao.selectArticleList(article);
+
+        List<Article> list = articleDao.selectList(new LambdaQueryWrapper<>());
+//        List<Map<String, Object>> list = articleDao.selectArticleList(article);
+
+//        // 1) 完成分页实体渲染
+//        PageEntity pageEntity = new PageInfoResult(list).toEntity();
+//
+//        // 2) 分页列表格式化
+//        list = list.stream().map(item -> {
+//            item.put("create_time_shanghai", MapUtil.convertUtcToAsiaShanghai(item.get("create_time_utc")));
+//            return item;
+//        }).collect(Collectors.toList());
+//
+//        // 3) 分页实体重新赋值
+//        List<Object> objectList = list.stream().map(item -> (Object) item).collect(Collectors.toList());
+//        pageEntity.setList(objectList);
+
         return new PageInfoResult(list).toEntity();
     }
 

+ 20 - 0
src/main/java/com/backendsys/modules/crt/service/impl/CrtLoraStyleServiceImpl.java

@@ -42,6 +42,11 @@ public class CrtLoraStyleServiceImpl implements CrtLoraStyleService {
         PageUtils.startPage();  // 分页
 
         List<Map<String, Object>> list = crtLoraStyleDao.selectCrtLoraStyleList(crtLoraStyle);
+
+        // 1) 完成分页实体渲染
+        PageEntity pageEntity = new PageInfoResult(list).toEntity();
+
+        // 2) 分页列表格式化
         if (!list.isEmpty()) {
 
             // 查询风格LoRA-当前用户的收藏状态,将收藏状态添加到 list 中
@@ -57,6 +62,11 @@ public class CrtLoraStyleServiceImpl implements CrtLoraStyleService {
             }).collect(Collectors.toList());
 
         }
+
+        // 3) 分页实体重新赋值
+        List<Object> objectList = list.stream().map(item -> (Object) item).collect(Collectors.toList());
+        pageEntity.setList(objectList);
+
         return new PageInfoResult(list).toEntity();
     }
 
@@ -81,6 +91,7 @@ public class CrtLoraStyleServiceImpl implements CrtLoraStyleService {
         wrapperCollect.orderByDesc(CrtLoraStyleCollect::getCreate_time);
         List<CrtLoraStyleCollect> crtLoraStyleCollectList = crtLoraStyleCollectDao.selectList(wrapperCollect);
 
+
         PageUtils.startPage();  // 分页
 
         // 根据ID集合,查询风格LoRA列表
@@ -100,6 +111,10 @@ public class CrtLoraStyleServiceImpl implements CrtLoraStyleService {
             // [DB] 查询风格LoRA列表 (已经收藏的
             list = crtLoraStyleDao.selectList(wrapper);
 
+            // 1) 完成分页实体渲染
+            PageEntity pageEntity = new PageInfoResult(list).toEntity();
+
+            // 2) 分页列表格式化
             // 按照 lora_style_ids 的顺序 (按创建时间倒序) 对 list 进行重新排序
             CollUtil.sort(list, Comparator.comparingInt(item -> collect_lora_style_ids.indexOf(item.getId())));
 
@@ -109,7 +124,12 @@ public class CrtLoraStyleServiceImpl implements CrtLoraStyleService {
                     item.setIs_collect(1);
                     return item;
                 }).collect(Collectors.toList());
+
+            // 3) 分页实体重新赋值
+            List<Object> objectList = list.stream().map(item -> (Object) item).collect(Collectors.toList());
+            pageEntity.setList(objectList);
         }
+
         return new PageInfoResult(list).toEntity();
     }
 

+ 9 - 3
src/main/java/com/backendsys/modules/upload/entity/SysFile.java

@@ -1,11 +1,14 @@
 package com.backendsys.modules.upload.entity;
 
+import com.backendsys.config.Mybatis.handler.timezone.LocalDateTimeAdapter;
 import com.baomidou.mybatisplus.annotation.*;
+import com.google.gson.annotations.JsonAdapter;
 import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import jakarta.validation.constraints.Size;
 import lombok.Data;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 @Data
@@ -67,8 +70,11 @@ public class SysFile {
     private Boolean is_exist;
 
     // "上传时间" 只有 秒传 和 合并重复MD5 的时候会更新,"编辑" 的时候不变
-    private String upload_time;
+    @JsonAdapter(LocalDateTimeAdapter.class)
+    private LocalDateTime upload_time;
 
-    private String create_time;
-    private String update_time;
+    @JsonAdapter(LocalDateTimeAdapter.class)
+    private LocalDateTime create_time;
+    @JsonAdapter(LocalDateTimeAdapter.class)
+    private LocalDateTime update_time;
 }

+ 7 - 1
src/main/java/com/backendsys/modules/upload/service/impl/SysFileMultipartServiceImpl.java

@@ -2,6 +2,7 @@ package com.backendsys.modules.upload.service.impl;
 
 import cn.hutool.core.codec.Base64;
 import cn.hutool.core.convert.Convert;
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.io.file.FileNameUtil;
@@ -39,6 +40,8 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -199,7 +202,10 @@ public class SysFileMultipartServiceImpl implements SysFileMultipartService {
                 sysFileEntity = sysFileEntityList.get(0);
                 // [DB] 更新文件 (文件分类、上传时间)
                 sysFileEntity.setCategory_id(multipartUploadParams.getCategory_id());
-                sysFileEntity.setUpload_time(DateUtil.now());
+
+                LocalDateTime nowLocalDateTime = (new DateTime()).toInstant().atZone(ZoneId.of("UTC")).toLocalDateTime();
+                sysFileEntity.setUpload_time(nowLocalDateTime);
+
                 sysFileDao.updateById(sysFileEntity);
             } else {
                 // [DB] 创建新的文件

+ 23 - 9
src/main/java/com/backendsys/modules/upload/service/impl/SysFileServiceImpl.java

@@ -3,6 +3,7 @@ package com.backendsys.modules.upload.service.impl;
 import cn.hutool.core.codec.Base64;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.convert.Convert;
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.crypto.digest.DigestUtil;
@@ -41,6 +42,8 @@ import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.net.URL;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicReference;
@@ -105,10 +108,10 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileDao, SysFile> impleme
         PageUtils.startPage();  // 分页
         List<SysFile> sysFileList = sysFileDao.selectUploadFileList(sysFile);
 
-        // 完成分页渲染
+        // 1) 完成分页实体渲染
         PageEntity pageEntity = new PageInfoResult(sysFileList).toEntity();
 
-        // -- 完成分页渲染之后,再做列表格式化 -----------------------------------
+        // 2) 分页列表格式化
         // [Common] 根据 Tag 获得 Options
         // JSONArray COMMON_OPTIONS = sysCommonService.getCommonOptionByTag("UPLOAD_TARGET");
         // 遍历列表,赋值公共值翻译
@@ -120,9 +123,9 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileDao, SysFile> impleme
             return item;
         }).collect(Collectors.toList());
 
-        List<Object> objectList = sysFileList.stream().map(file -> (Object) file).collect(Collectors.toList());
+        // 3) 分页实体重新赋值
+        List<Object> objectList = sysFileList.stream().map(item -> (Object) item).collect(Collectors.toList());
         pageEntity.setList(objectList);
-        // -----------------------------------------------------------------
 
         return pageEntity;
     }
@@ -220,8 +223,10 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileDao, SysFile> impleme
             // 设置缩略图
             sysFileEntity = setThumbUrl(sysFileEntity, UPLOAD_THUMB_SIZE.get(), UPLOAD_THUMB_SIZE.get(), StyleEnums.THUMB_BACKGROUND.getValue());
 
-            sysFileEntity.setCreate_time(DateUtil.now());
-            sysFileEntity.setUpdate_time(DateUtil.now());
+            LocalDateTime nowLocalDateTime = (new DateTime()).toInstant().atZone(ZoneId.of("UTC")).toLocalDateTime();
+            sysFileEntity.setCreate_time(nowLocalDateTime);
+            sysFileEntity.setUpdate_time(nowLocalDateTime);
+
             sysFileDao.insert(sysFileEntity);
 
             return sysFileEntity;
@@ -290,7 +295,10 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileDao, SysFile> impleme
                     // [DB] 更新文件 (支持更换文件分类)
                     sysFileEntity.setIs_exist(true);
                     sysFileEntity.setCategory_id(category_id);
-                    sysFileEntity.setUpload_time(DateUtil.now());
+
+                    LocalDateTime nowLocalDateTime = (new DateTime()).toInstant().atZone(ZoneId.of("UTC")).toLocalDateTime();
+                    sysFileEntity.setUpload_time(nowLocalDateTime);
+
                     sysFileDao.updateById(sysFileEntity);
                 } else {
                     // [DB] 创建新的文件
@@ -471,7 +479,10 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileDao, SysFile> impleme
         sysFileEntity.setSize(sysFileResult.getSize());
         sysFileEntity.setTarget(UPLOAD_TARGET);
         sysFileEntity.setTarget_label(TargetEnums.targetToLabel(UPLOAD_TARGET));
-        sysFileEntity.setUpload_time(DateUtil.now());
+
+        LocalDateTime nowLocalDateTime = (new DateTime()).toInstant().atZone(ZoneId.of("UTC")).toLocalDateTime();
+        sysFileEntity.setUpload_time(nowLocalDateTime);
+
         sysFileDao.insert(sysFileEntity);
 
         return sysFileResult;
@@ -526,7 +537,10 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileDao, SysFile> impleme
         updateWrapper.eq(SysFile::getObject_key, target_object_key);
         SysFile updateEntity = new SysFile();
         updateEntity.setName(target_file_name);
-        updateEntity.setUpload_time(DateUtil.now());
+
+        LocalDateTime nowLocalDateTime = (new DateTime()).toInstant().atZone(ZoneId.of("UTC")).toLocalDateTime();
+        updateEntity.setUpload_time(nowLocalDateTime);
+
         sysFileDao.update(updateEntity, updateWrapper);
 
         // [DB] 批量删除 (除了 target_object_key 外的文件)

+ 5 - 0
src/main/java/com/backendsys/utils/ListUtil.java

@@ -1,7 +1,12 @@
 package com.backendsys.utils;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 

+ 21 - 0
src/main/java/com/backendsys/utils/MapUtil.java

@@ -1,15 +1,36 @@
 package com.backendsys.utils;
 
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 import org.springframework.cglib.beans.BeanMap;
 
 import java.lang.reflect.Field;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
 import java.util.*;
 
 @SuppressWarnings({"rawtypes", "unchecked"})
 public class MapUtil {
 
+    /**
+     * 将 UTC 时间字符串转换为 Asia/Shanghai 时区的时间字符串
+     * MapUtil.convertUtcToAsiaShanghai(item.get("create_time_utc"))
+     */
+    public static String convertUtcToAsiaShanghai(Object utcTime) {
+        String utcTimeStr = Convert.toStr(utcTime);
+        // 解析 UTC 时间字符串为 LocalDateTime
+        LocalDateTime utcDateTime = cn.hutool.core.date.DateUtil.parse(utcTimeStr).toLocalDateTime();
+        // 转换为 Asia/Shanghai 时区的时间
+        ZonedDateTime asiaShanghaiDateTime = utcDateTime.atZone(ZoneId.of("UTC")).withZoneSameInstant(ZoneId.of("Asia/Shanghai"));
+        // 格式化转换后的时间为字符串
+        String asiaShanghaiTimeStr = DateUtil.format(asiaShanghaiDateTime.toLocalDateTime(), "yyyy-MM-dd HH:mm:ss");
+        // 将转换后的时间放入 item 中
+        return asiaShanghaiTimeStr;
+    }
+
     /**
      * 获取多层 Map 中指定路径的值。
      * MapUtil.get(response, "Header.Code")

+ 2 - 2
src/main/resources/application-local.yml

@@ -171,9 +171,9 @@ baidu:
 
 # DeepSeek R1
 deepseek-r1:
-#  domain: http://localhost:11434
+  domain: http://localhost:11434
 #  domain: https://1wd05129tf963.vicp.fun
-  domain: http://10ue610iy6063.vicp.fun
+#  domain: http://10ue610iy6063.vicp.fun
 
 # DeepSeek API
 deepseek-api:

+ 2 - 2
src/main/resources/mapper/ai/chat/ChatDao.xml

@@ -30,8 +30,8 @@
         <result property="user_id" column="user_id" javaType="java.lang.Long" />
         <result property="robot_code" column="robot_code" />
         <result property="del_flag" column="del_flag" javaType="java.lang.Integer" />
-        <result property="create_time" column="create_time" />
-        <result property="update_time" column="update_time" />
+        <result property="create_time" column="create_time" typeHandler="com.backendsys.config.Mybatis.handler.timezone.LocalDateTimeHandler" />
+        <result property="update_time" column="update_time" typeHandler="com.backendsys.config.Mybatis.handler.timezone.LocalDateTimeHandler" />
     </resultMap>
 
     <!-- 查 列表 -->

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

@@ -53,6 +53,7 @@
         LEFT JOIN cms_article_i18n at ON a.id = at.article_id
     </sql>
 
+<!--    <resultMap id="resultMapArticle" type="com.backendsys.modules.cms.article.entity.Article">-->
     <resultMap id="resultMapArticle" type="java.util.LinkedHashMap">
         <id property="id" column="id" jdbcType="BIGINT" />
         <result property="article_id" column="article_id" javaType="java.lang.Long" />
@@ -66,10 +67,12 @@
         <result property="description" column="description" />
         <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" javaType="java.lang.String" />
-        <result property="update_time" column="update_time" javaType="java.lang.String" />
-        <result property="create_time_local" column="create_time" />
-        <result property="update_time_local" column="update_time" />
+<!--        <result property="create_time" column="create_time" typeHandler="com.backendsys.config.Mybatis.handler.timezone.LocalDateTimeHandler" />-->
+<!--        <result property="update_time" column="update_time" typeHandler="com.backendsys.config.Mybatis.handler.timezone.LocalDateTimeHandler"/>-->
+        <result property="create_time" column="create_time" />
+        <result property="update_time" column="update_time" />
+        <result property="create_time_utc" column="create_time" javaType="java.lang.String" />
+        <result property="update_time_utc" column="update_time" javaType="java.lang.String" />
     </resultMap>
 
     <resultMap id="resultMapArticleDetail" type="java.util.LinkedHashMap">

+ 7 - 3
src/main/resources/mapper/upload/SysFileDao.xml

@@ -69,9 +69,13 @@
         <result property="size" column="size" javaType="java.lang.Long" />
         <result property="md5" column="md5" />
         <result property="target" column="target" javaType="java.lang.Integer" />
-        <result property="upload_time" column="upload_time" />
-        <result property="create_time" column="create_time" />
-        <result property="update_time" column="update_time" />
+
+        <result property="upload_time" column="upload_time" typeHandler="com.backendsys.config.Mybatis.handler.timezone.LocalDateTimeHandler" />
+        <result property="create_time" column="create_time" typeHandler="com.backendsys.config.Mybatis.handler.timezone.LocalDateTimeHandler" />
+        <result property="update_time" column="update_time" typeHandler="com.backendsys.config.Mybatis.handler.timezone.LocalDateTimeHandler" />
+<!--        <result property="upload_time" column="upload_time" typeHandler="com.backendsys.config.Mybatis.handler.timezone.LocalDateTimeHandler" />-->
+<!--        <result property="create_time" column="create_time" typeHandler="com.backendsys.config.Mybatis.handler.timezone.LocalDateTimeHandler" />-->
+<!--        <result property="update_time" column="update_time" typeHandler="com.backendsys.config.Mybatis.handler.timezone.LocalDateTimeHandler" />-->
     </resultMap>
 
     <select id="selectUploadFileSimple" resultMap="resultMapFileSimple">