From e1d7f0371d303fd57ef6064efabae65a5f4e8df7 Mon Sep 17 00:00:00 2001
From: theo <971366405@qq.com>
Date: Thu, 4 Dec 2025 11:26:27 +0800
Subject: [PATCH] =?UTF-8?q?feat(database):=20=E6=94=AF=E6=8C=81=E8=BE=BE?=
=?UTF-8?q?=E6=A2=A6=E6=95=B0=E6=8D=AE=E5=BA=93=E9=80=82=E9=85=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 在多个Mapper XML文件中增加对达梦数据库的SQL语句适配
- 为AiCommandRecordMapper.xml中的model字段添加反引号避免关键字冲突
- 为LogMapper.xml、UserMapper.xml和DatabaseMapper.xml添加databaseId属性区分不同数据库
- 新增MybatisConfig配置类用于识别数据库类型并注册VendorDatabaseIdProvider
- pom.xml中引入达梦数据库驱动依赖DmJdbcDriver8
- 完善RoleMapper接口注释明确返回值类型
---
pom.xml | 6 +
.../com/youlai/boot/config/MybatisConfig.java | 17 +++
.../youlai/boot/system/mapper/LogMapper.java | 3 +-
.../youlai/boot/system/mapper/RoleMapper.java | 2 +-
.../mapper/ai/AiCommandRecordMapper.xml | 2 +-
.../mapper/codegen/DatabaseMapper.xml | 84 ++++++++++-
.../resources/mapper/system/LogMapper.xml | 136 +++++++++++++++---
.../resources/mapper/system/UserMapper.xml | 107 +++++++++++++-
8 files changed, 321 insertions(+), 36 deletions(-)
diff --git a/pom.xml b/pom.xml
index 12fb26ce..3a51ac4b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -274,6 +274,12 @@
1.0.0-M6
+
+ com.dameng
+ DmJdbcDriver8
+ 8.1.4.181
+
+
diff --git a/src/main/java/com/youlai/boot/config/MybatisConfig.java b/src/main/java/com/youlai/boot/config/MybatisConfig.java
index 7cc08b39..537cb7e5 100644
--- a/src/main/java/com/youlai/boot/config/MybatisConfig.java
+++ b/src/main/java/com/youlai/boot/config/MybatisConfig.java
@@ -7,11 +7,15 @@ import com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionIntercepto
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.youlai.boot.plugin.mybatis.MyDataPermissionHandler;
import com.youlai.boot.plugin.mybatis.MyMetaObjectHandler;
+import org.apache.ibatis.mapping.DatabaseIdProvider;
+import org.apache.ibatis.mapping.VendorDatabaseIdProvider;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
+import java.util.Properties;
+
/**
* mybatis-plus 配置类
*
@@ -57,4 +61,17 @@ public class MybatisConfig {
return globalConfig;
}
+ /**
+ * 数据库类型自动识别
+ */
+ @Bean
+ public DatabaseIdProvider databaseIdProvider() {
+ DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
+ Properties properties = new Properties();
+ properties.setProperty("DM", "dm");
+ properties.setProperty("MySQL", "mysql");
+ databaseIdProvider.setProperties(properties);
+ return databaseIdProvider;
+ }
+
}
diff --git a/src/main/java/com/youlai/boot/system/mapper/LogMapper.java b/src/main/java/com/youlai/boot/system/mapper/LogMapper.java
index 50607b8a..a52ae257 100644
--- a/src/main/java/com/youlai/boot/system/mapper/LogMapper.java
+++ b/src/main/java/com/youlai/boot/system/mapper/LogMapper.java
@@ -1,13 +1,12 @@
package com.youlai.boot.system.mapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.boot.system.model.bo.VisitCount;
import com.youlai.boot.system.model.bo.VisitStatsBO;
import com.youlai.boot.system.model.entity.Log;
import com.youlai.boot.system.model.query.LogPageQuery;
import com.youlai.boot.system.model.vo.LogPageVO;
-import com.youlai.boot.system.model.vo.VisitStatsVO;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
diff --git a/src/main/java/com/youlai/boot/system/mapper/RoleMapper.java b/src/main/java/com/youlai/boot/system/mapper/RoleMapper.java
index 69a2cff4..7db98cfd 100644
--- a/src/main/java/com/youlai/boot/system/mapper/RoleMapper.java
+++ b/src/main/java/com/youlai/boot/system/mapper/RoleMapper.java
@@ -19,7 +19,7 @@ public interface RoleMapper extends BaseMapper {
* 获取最大范围的数据权限
*
* @param roles 角色编码集合
- * @return
+ * @return {@link Integer} – 数据权限范围
*/
Integer getMaximumDataScope(Set roles);
}
diff --git a/src/main/resources/mapper/ai/AiCommandRecordMapper.xml b/src/main/resources/mapper/ai/AiCommandRecordMapper.xml
index 0a065278..d23d1c26 100644
--- a/src/main/resources/mapper/ai/AiCommandRecordMapper.xml
+++ b/src/main/resources/mapper/ai/AiCommandRecordMapper.xml
@@ -45,7 +45,7 @@
acr.username,
acr.original_command,
acr.provider,
- acr.model,
+ acr.`model`,
acr.parse_success,
acr.function_calls,
acr.explanation,
diff --git a/src/main/resources/mapper/codegen/DatabaseMapper.xml b/src/main/resources/mapper/codegen/DatabaseMapper.xml
index d923000c..c2aefee0 100644
--- a/src/main/resources/mapper/codegen/DatabaseMapper.xml
+++ b/src/main/resources/mapper/codegen/DatabaseMapper.xml
@@ -2,10 +2,11 @@
+
-
-
diff --git a/src/main/resources/mapper/system/LogMapper.xml b/src/main/resources/mapper/system/LogMapper.xml
index 29d8c504..ad3a205b 100644
--- a/src/main/resources/mapper/system/LogMapper.xml
+++ b/src/main/resources/mapper/system/LogMapper.xml
@@ -2,10 +2,11 @@
+
-
-
+
+
SELECT
t1.id,
t1.module,
@@ -46,6 +47,48 @@
ORDER BY
t1.create_time DESC
+
+
+ SELECT
+ t1.id,
+ t1.module,
+ t1.content,
+ t1.request_uri,
+ t1.ip,
+ t1.province || ' ' || t1.city AS region,
+ t1.execution_time,
+ t1.browser || ' ' || t1.browser_version AS browser,
+ t1.os,
+ t1.create_time,
+ t2.nickname AS operator
+ FROM
+ sys_log t1
+ LEFT JOIN sys_user t2 ON t1.create_by = t2.id
+
+ t1.is_deleted = 0
+
+ AND (
+ t1.content LIKE concat('%',#{queryParams.keywords},'%')
+ OR
+ t1.ip LIKE concat('%',#{queryParams.keywords},'%')
+ OR
+ t2.nickname LIKE concat('%',#{queryParams.keywords},'%')
+ )
+
+
+
+
+ AND t1.create_time >= #{startDate}
+
+
+
+ AND t1.create_time <= #{endDate}
+
+
+
+ ORDER BY
+ t1.create_time DESC
+
@@ -75,44 +118,91 @@
DATE_FORMAT(create_time, '%Y-%m-%d')
-
-
+
+
SELECT
COUNT(CASE WHEN DATE(create_time) = CURDATE() THEN 1 END) AS todayCount,
COUNT(*) AS totalCount,
+ ROUND(
+ CASE
+ WHEN COUNT(CASE WHEN DATE(create_time) = CURDATE() - INTERVAL 1 DAY AND TIME(create_time) <= TIME(NOW()) THEN 1 END) = 0 THEN 0
+ ELSE
+ (COUNT(CASE WHEN DATE(create_time) = CURDATE() THEN 1 END) -
+ COUNT(CASE WHEN DATE(create_time) = CURDATE() - INTERVAL 1 DAY AND TIME(create_time) <= TIME(NOW()) THEN 1 END)) /
+ COUNT(CASE WHEN DATE(create_time) = CURDATE() - INTERVAL 1 DAY AND TIME(create_time) <= TIME(NOW()) THEN 1 END)
+ END,
+ 2) AS growthRate
+ FROM
+ sys_log
+ WHERE
+ is_deleted = 0
+
+
+
+ SELECT
+ COUNT(CASE WHEN TRUNC(create_time) = TRUNC(SYSDATE) THEN 1 END) AS todayCount,
+ COUNT(*) AS totalCount,
ROUND(
CASE
- WHEN COUNT(CASE WHEN DATE(create_time) = CURDATE() - INTERVAL 1 DAY AND TIME(create_time) <= TIME(NOW()) THEN 1 END) = 0 THEN 0
+ WHEN COUNT(CASE WHEN TRUNC(create_time) = TRUNC(SYSDATE) - 1
+ AND TO_CHAR(create_time, 'HH24:MI:SS') <= TO_CHAR(SYSDATE, 'HH24:MI:SS') THEN 1 END) = 0 THEN 0
ELSE
- (COUNT(CASE WHEN DATE(create_time) = CURDATE() THEN 1 END) -
- COUNT(CASE WHEN DATE(create_time) = CURDATE() - INTERVAL 1 DAY AND TIME(create_time) <= TIME(NOW()) THEN 1 END)) /
- COUNT(CASE WHEN DATE(create_time) = CURDATE() - INTERVAL 1 DAY AND TIME(create_time) <= TIME(NOW()) THEN 1 END)
+ (COUNT(CASE WHEN TRUNC(create_time) = TRUNC(SYSDATE) THEN 1 END) -
+ COUNT(CASE WHEN TRUNC(create_time) = TRUNC(SYSDATE) - 1
+ AND TO_CHAR(create_time, 'HH24:MI:SS') <= TO_CHAR(SYSDATE, 'HH24:MI:SS') THEN 1 END)) /
+ COUNT(CASE WHEN TRUNC(create_time) = TRUNC(SYSDATE) - 1
+ AND TO_CHAR(create_time, 'HH24:MI:SS') <= TO_CHAR(SYSDATE, 'HH24:MI:SS') THEN 1 END)
END,
2) AS growthRate
FROM
- sys_log
+ sys_log
WHERE
- is_deleted = 0
+ is_deleted = 0
-
-
- SELECT
- COUNT(DISTINCT CASE WHEN DATE(create_time) = CURDATE() THEN ip END) AS todayCount,
- COUNT(DISTINCT ip) AS totalCount,
- ROUND(
- CASE
- WHEN COUNT(DISTINCT CASE WHEN DATE(create_time) = CURDATE() - INTERVAL 1 DAY AND TIME(create_time) <= TIME(NOW()) THEN ip END) = 0 THEN 0
+
+
+ SELECT
+ COUNT(DISTINCT CASE WHEN DATE(create_time) = CURDATE() THEN ip END) AS todayCount,
+ COUNT(DISTINCT ip) AS totalCount,
+ ROUND(
+ CASE
+ WHEN COUNT(DISTINCT CASE WHEN DATE(create_time) = CURDATE() - INTERVAL 1 DAY AND TIME(create_time) <= TIME(NOW()) THEN ip END) = 0 THEN 0
ELSE
(COUNT(DISTINCT CASE WHEN DATE(create_time) = CURDATE() THEN ip END) -
- COUNT(DISTINCT CASE WHEN DATE(create_time) = CURDATE() - INTERVAL 1 DAY AND TIME(create_time) <= TIME(NOW()) THEN ip END)) /
+ COUNT(DISTINCT CASE WHEN DATE(create_time) = CURDATE() - INTERVAL 1 DAY AND TIME(create_time) <= TIME(NOW()) THEN ip END)) /
COUNT(DISTINCT CASE WHEN DATE(create_time) = CURDATE() - INTERVAL 1 DAY AND TIME(create_time) <= TIME(NOW()) THEN ip END)
END,
2) AS growthRate
- FROM
- sys_log
- WHERE
- is_deleted = 0
+ FROM
+ sys_log
+ WHERE
+ is_deleted = 0
+
+
+
+ SELECT COUNT(DISTINCT CASE WHEN TRUNC(create_time) = TRUNC(SYSDATE) THEN ip END) AS todayCount,
+ COUNT(DISTINCT ip) AS totalCount,
+ ROUND(
+ CASE
+ WHEN COUNT(DISTINCT CASE
+ WHEN TRUNC(create_time) = TRUNC(SYSDATE - 1)
+ THEN ip END) = 0
+ THEN 0
+ ELSE
+ (COUNT(DISTINCT CASE
+ WHEN TRUNC(create_time) = TRUNC(SYSDATE)
+ THEN ip END) -
+ COUNT(DISTINCT CASE
+ WHEN TRUNC(create_time) = TRUNC(SYSDATE - 1)
+ THEN ip END)) * 1.0 /
+ COUNT(DISTINCT CASE
+ WHEN TRUNC(create_time) = TRUNC(SYSDATE - 1)
+ THEN ip END)
+ END,
+ 2) AS growthRate
+ FROM sys_log
+ WHERE is_deleted = 0
diff --git a/src/main/resources/mapper/system/UserMapper.xml b/src/main/resources/mapper/system/UserMapper.xml
index 4e281a17..7ea2f9f7 100644
--- a/src/main/resources/mapper/system/UserMapper.xml
+++ b/src/main/resources/mapper/system/UserMapper.xml
@@ -2,10 +2,11 @@
+
-
-
+
+
SELECT
u.id,
u.username,
@@ -80,6 +81,82 @@
+
+
+ SELECT
+ u.id,
+ u.username,
+ u.nickname,
+ u.mobile,
+ u.gender,
+ u.avatar,
+ u.STATUS,
+ u.email,
+ d.NAME AS dept_name,
+ LISTAGG(r.name, ',') WITHIN GROUP (ORDER BY r.name) AS roleNames,
+ u.create_time
+ FROM
+ sys_user u
+ LEFT JOIN sys_dept d ON u.dept_id = d.id
+ LEFT JOIN sys_user_role sur ON u.id = sur.user_id
+ LEFT JOIN sys_role r ON sur.role_id = r.id
+
+ u.is_deleted = 0
+
+
+ AND NOT EXISTS (
+ SELECT
+ 1
+ FROM sys_user_role sur
+ INNER JOIN sys_role r ON sur.role_id = r.id
+ WHERE
+ sur.user_id = u.id
+ AND r.code = '${@com.youlai.boot.common.constant.SystemConstants@ROOT_ROLE_CODE}'
+ )
+
+
+ AND (
+ u.username LIKE CONCAT('%',#{queryParams.keywords},'%')
+ OR u.nickname LIKE CONCAT('%',#{queryParams.keywords},'%')
+ OR u.mobile LIKE CONCAT('%',#{queryParams.keywords},'%')
+ )
+
+
+ AND u.status = #{queryParams.status}
+
+
+ AND concat(',',concat(d.tree_path,',',d.id),',') like concat('%,',#{queryParams.deptId},',%')
+
+
+
+
+ AND u.create_time >= #{startDate}
+
+
+
+ AND u.create_time <= #{endDate}
+
+
+
+ AND sur.role_id IN
+
+ #{roleId}
+
+
+
+ GROUP BY
+ u.id
+
+
+
+ ORDER BY u.${queryParams.field} ${queryParams.direction}
+
+
+
+ ORDER BY u.update_time DESC, u.create_time DESC
+
+
+
@@ -224,8 +301,8 @@
GROUP BY u.id
-
-
+
+
SELECT
u.id,
u.username,
@@ -246,5 +323,27 @@
WHERE
u.id = #{userId} AND u.is_deleted = 0
+
+
+ SELECT
+ u.id,
+ u.username,
+ u.nickname,
+ u.mobile,
+ u.gender,
+ u.avatar,
+ u.STATUS,
+ u.email,
+ d.NAME AS deptName,
+ LISTAGG(r.name, ',') WITHIN GROUP (ORDER BY r.name) AS roleNames,
+ u.create_time
+ FROM
+ sys_user u
+ LEFT JOIN sys_dept d ON u.dept_id = d.id
+ LEFT JOIN sys_user_role sur ON u.id = sur.user_id
+ LEFT JOIN sys_role r ON sur.role_id = r.id
+ WHERE
+ u.id = #{userId} AND u.is_deleted = 0
+