| | |
| | | |
| | | <properties> |
| | | <revision>1.0.0</revision> |
| | | <spring-boot.version>3.0.6</spring-boot.version> |
| | | <spring-boot.version>3.4.4</spring-boot.version> |
| | | <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
| | | <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> |
| | | <java.version>17</java.version> |
| | | <mysql.version>8.0.33</mysql.version> |
| | | <spring-boot.mybatis>3.0.1</spring-boot.mybatis> |
| | | <mybatis.version>3.5.16</mybatis.version> |
| | | <springdoc.version>2.1.0</springdoc.version> |
| | | <therapi-javadoc.version>0.15.0</therapi-javadoc.version> |
| | | <poi.version>5.2.3</poi.version> |
| | | <easyexcel.version>3.2.1</easyexcel.version> |
| | | <velocity.version>2.3</velocity.version> |
| | | <satoken.version>1.34.0</satoken.version> |
| | | <mybatis-plus.version>3.5.3.1</mybatis-plus.version> |
| | | <mybatis-plus.version>3.5.11</mybatis-plus.version> |
| | | <p6spy.version>3.9.1</p6spy.version> |
| | | <hutool.version>5.8.18</hutool.version> |
| | | <hutool.version>5.8.35</hutool.version> |
| | | <okhttp.version>4.10.0</okhttp.version> |
| | | <dynamic-ds.version>4.3.1</dynamic-ds.version> |
| | | <spring-boot-admin.version>3.0.3</spring-boot-admin.version> |
| | | <redisson.version>3.20.1</redisson.version> |
| | | <lock4j.version>2.2.4</lock4j.version> |
| | | <dynamic-ds.version>3.6.1</dynamic-ds.version> |
| | | <alibaba-ttl.version>2.14.2</alibaba-ttl.version> |
| | | <xxl-job.version>2.4.0</xxl-job.version> |
| | | <mapstruct-plus.version>1.2.1</mapstruct-plus.version> |
| | |
| | | <bouncycastle.version>1.72</bouncycastle.version> |
| | | <!-- 离线IPå°åå®ä½åº --> |
| | | <ip2region.version>2.7.0</ip2region.version> |
| | | |
| | | <!-- 临æ¶ä¿®å¤ snakeyaml æ¼æ´ --> |
| | | <snakeyaml.version>1.33</snakeyaml.version> |
| | | |
| | | <!-- OSS é
ç½® --> |
| | | <aws-java-sdk-s3.version>1.12.400</aws-java-sdk-s3.version> |
| | | <!-- SMS é
ç½® --> |
| | |
| | | <version>${satoken.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- dynamic-datasource 夿°æ®æº--> |
| | | <dependency> |
| | | <groupId>com.baomidou</groupId> |
| | | <artifactId>dynamic-datasource-spring-boot-starter</artifactId> |
| | | <version>${dynamic-ds.version}</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.mybatis.spring.boot</groupId> |
| | | <artifactId>mybatis-spring-boot-starter</artifactId> |
| | | <version>${spring-boot.mybatis}</version> |
| | | <groupId>org.mybatis</groupId> |
| | | <artifactId>mybatis</artifactId> |
| | | <version>${mybatis.version}</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>com.baomidou</groupId> |
| | | <artifactId>mybatis-plus-boot-starter</artifactId> |
| | | <artifactId>mybatis-plus-spring-boot3-starter</artifactId> |
| | | <version>${mybatis-plus.version}</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>com.baomidou</groupId> |
| | | <artifactId>mybatis-plus-jsqlparser</artifactId> |
| | | <version>${mybatis-plus.version}</version> |
| | | </dependency> |
| | | |
| | |
| | | <groupId>com.baomidou</groupId> |
| | | <artifactId>mybatis-plus-annotation</artifactId> |
| | | <version>${mybatis-plus.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- dynamic-datasource 夿°æ®æº--> |
| | | <dependency> |
| | | <groupId>com.baomidou</groupId> |
| | | <artifactId>dynamic-datasource-spring-boot3-starter</artifactId> |
| | | <version>${dynamic-ds.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- sqlæ§è½åææä»¶ --> |
| | |
| | | <groupId>com.alibaba</groupId> |
| | | <artifactId>transmittable-thread-local</artifactId> |
| | | <version>${alibaba-ttl.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- 临æ¶ä¿®å¤ snakeyaml æ¼æ´ --> |
| | | <dependency> |
| | | <groupId>org.yaml</groupId> |
| | | <artifactId>snakeyaml</artifactId> |
| | | <version>${snakeyaml.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- å å¯å
å¼å
¥ --> |
| | |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.ruoyi</groupId> |
| | | <artifactId>ruoyi-demo</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | <!-- <dependency>--> |
| | | <!-- <groupId>org.ruoyi</groupId>--> |
| | | <!-- <artifactId>ruoyi-demo</artifactId>--> |
| | | <!-- <version>${revision}</version>--> |
| | | <!-- </dependency>--> |
| | | |
| | | </dependencies> |
| | | </dependencyManagement> |
| | |
| | | <module>ruoyi-common</module> |
| | | <module>ruoyi-modules</module> |
| | | <module>ruoyi-modules-api</module> |
| | | <module>ruoyi-modules/ruoyi-mcp-server</module> |
| | | <module>ruoyi-admin</module> |
| | | <module>ruoyi-extend</module> |
| | | </modules> |
| | | |
| | | <packaging>pom</packaging> |
| | |
| | | <artifactId>mssql-jdbc</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.ruoyi</groupId> |
| | | <artifactId>ruoyi-common-doc</artifactId> |
| | | </dependency> |
| | | <!-- demo模å --> |
| | | <!-- <dependency>--> |
| | | <!-- <groupId>org.ruoyi</groupId>--> |
| | | <!-- <artifactId>ruoyi-demo</artifactId>--> |
| | | <!-- </dependency>--> |
| | | |
| | | <dependency> |
| | | <groupId>org.ruoyi</groupId> |
| | |
| | | |
| | | <dependency> |
| | | <groupId>org.ruoyi</groupId> |
| | | <artifactId>ruoyi-fusion</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.ruoyi</groupId> |
| | | <artifactId>ruoyi-knowledge</artifactId> |
| | | </dependency> |
| | | |
| | | |
| | | <!-- demo模å --> |
| | | <dependency> |
| | | <groupId>org.ruoyi</groupId> |
| | | <artifactId>ruoyi-demo</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-starter-test</artifactId> |
| | | <scope>test</scope> |
| | | </dependency> |
| | | |
| | | <!-- æ·»å thumbnailatorä¾èµ --> |
| | | <dependency> |
| | | <groupId>net.coobird</groupId> |
| | | <artifactId>thumbnailator</artifactId> |
| | | <version>0.4.11</version> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>io.github.ollama4j</groupId> |
| | | <artifactId>ollama4j</artifactId> |
| | | <version>1.0.79</version> |
| | | <scope>compile</scope> |
| | | <artifactId>ruoyi-chat</artifactId> |
| | | </dependency> |
| | | |
| | | </dependencies> |
| | |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.satoken.utils.LoginHelper; |
| | | import org.ruoyi.common.tenant.helper.TenantHelper; |
| | | import org.ruoyi.system.domain.bo.SysTenantBo; |
| | | import org.ruoyi.system.domain.vo.LoginTenantVo; |
| | | import org.ruoyi.system.domain.vo.SysTenantVo; |
| | | import org.ruoyi.system.domain.vo.TenantListVo; |
| | | import org.ruoyi.system.service.ISysTenantService; |
| | | |
| | | import org.ruoyi.system.service.SysLoginService; |
| | | import org.ruoyi.system.service.SysRegisterService; |
| | | import org.ruoyi.system.domain.vo.LoginVo; |
| | | |
| | | import jakarta.servlet.http.HttpServletRequest; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.ruoyi.system.domain.bo.SysTenantBo; |
| | | import org.ruoyi.system.domain.vo.LoginTenantVo; |
| | | import org.ruoyi.system.domain.vo.LoginVo; |
| | | import org.ruoyi.system.domain.vo.SysTenantVo; |
| | | import org.ruoyi.system.domain.vo.TenantListVo; |
| | | import org.ruoyi.system.service.ISysTenantService; |
| | | import org.ruoyi.system.service.SysLoginService; |
| | | import org.ruoyi.system.service.SysRegisterService; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.stereotype.Controller; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | /** |
| | | * é¦é¡µ |
| | |
| | | * @author Lion Li |
| | | */ |
| | | @SaIgnore |
| | | @RequiredArgsConstructor |
| | | @Controller |
| | | @RestController |
| | | public class IndexController { |
| | | |
| | | /** |
| | |
| | | */ |
| | | @GetMapping("/") |
| | | public String index() { |
| | | return "index.html"; |
| | | return "RuoYi AIå¯å¨æåï¼"; |
| | | } |
| | | |
| | | @GetMapping("/success") |
| | | public String success(){ |
| | | return "paySuccess.html"; |
| | | } |
| | | |
| | | @GetMapping("/cancel") |
| | | public String cancel(){ |
| | | return "cancel"; |
| | | } |
| | | |
| | | } |
| | |
| | | # password: 123456 |
| | | # è¿æ¥è¶
æ¶æ¶é´ |
| | | timeout: 10S |
| | | # æ¯å¦å¼å¯ssl |
| | | ssl: false |
| | | |
| | | redisson: |
| | | # redis keyåç¼ |
| | | keyPrefix: |
| | |
| | | # è
¾è®¯ä¸ç¨ |
| | | sdkAppId: |
| | | |
| | | spring: |
| | | ai: |
| | | openai: |
| | | api-key: sk-xX |
| | | base-url: https://api.pandarobot.chat |
| | | ollama: |
| | | base-url: http://localhost:11434 |
| | | init: |
| | | pull-model-strategy: always |
| | | timeout: 60s |
| | | max-retries: 1 |
| | | mcp: |
| | | client: |
| | | enabled: true |
| | | name: call-mcp-server |
| | | sse: |
| | | connections: |
| | | server1: |
| | | url: http://127.0.0.1:8080 |
| | |
| | | # æ¥å¿é
ç½® |
| | | logging: |
| | | level: |
| | | org.ruoyi: @logging.level@ |
| | | org.dromara: @logging.level@ |
| | | org.springframework: warn |
| | | org.mybatis.spring.mapper: error |
| | | org.apache.fury: warn |
| | | config: classpath:logback-plus.xml |
| | | |
| | | # ç¨æ·é
ç½® |
| | |
| | | token: '' |
| | | aesKey: '' |
| | | |
| | | |
| | | spring: |
| | | ai: |
| | | ollama: |
| | | base-url: http://localhost:11434 |
| | | mcp: |
| | | client: |
| | | enabled: true |
| | | name: call-mcp-server |
| | | sse: |
| | | connections: |
| | | server1: |
| | | url: http://127.0.0.1:6040 |
| | | |
| | |
| | | <dependency> |
| | | <groupId>com.squareup.okhttp3</groupId> |
| | | <artifactId>okhttp</artifactId> |
| | | <version>${okhttp.version}</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>com.squareup.okhttp3</groupId> |
| | | <artifactId>okhttp-sse</artifactId> |
| | | <version>${okhttp.version}</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>com.squareup.okhttp3</groupId> |
| | | <artifactId>logging-interceptor</artifactId> |
| | | <version>${okhttp.version}</version> |
| | | </dependency> |
| | | |
| | | </dependencies> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.common.core.constant; |
| | | |
| | | import cn.hutool.core.lang.RegexPool; |
| | | |
| | | /** |
| | | * å¸¸ç¨æ£å表达å¼å符串 |
| | | * <p> |
| | | * å¸¸ç¨æ£å表达å¼éåï¼æ´å¤æ£åè§: https://any86.github.io/any-rule/ |
| | | * |
| | | * @author Feng |
| | | */ |
| | | public interface RegexConstants extends RegexPool { |
| | | |
| | | /** |
| | | * åå
¸ç±»åå¿
须以忝å¼å¤´ï¼ä¸åªè½ä¸ºï¼å°ååæ¯ï¼æ°åï¼ä¸æ»çº¿ï¼ |
| | | */ |
| | | String DICTIONARY_TYPE = "^[a-z][a-z0-9_]*$"; |
| | | |
| | | /** |
| | | * æéæ è¯å¿
须符å以䏿 ¼å¼ï¼ |
| | | * 1. æ åæ ¼å¼ï¼xxx:yyy:zzz |
| | | * - 第ä¸é¨åï¼xxxï¼ï¼åªè½å
å«åæ¯ãæ°ååä¸å线ï¼_ï¼ï¼ä¸è½ä½¿ç¨ `*` |
| | | * - 第äºé¨åï¼yyyï¼ï¼å¯ä»¥å
å«åæ¯ãæ°åãä¸å线ï¼_ï¼å `*` |
| | | * - 第ä¸é¨åï¼zzzï¼ï¼å¯ä»¥å
å«åæ¯ãæ°åãä¸å线ï¼_ï¼å `*` |
| | | * 2. å
许空å符串ï¼""ï¼ï¼è¡¨ç¤ºæ²¡ææéæ è¯ |
| | | */ |
| | | String PERMISSION_STRING = "^$|^[a-zA-Z0-9_]+:[a-zA-Z0-9_*]+:[a-zA-Z0-9_*]+$"; |
| | | |
| | | /** |
| | | * 身份è¯å·ç ï¼å6ä½ï¼ |
| | | */ |
| | | String ID_CARD_LAST_6 = "^(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$"; |
| | | |
| | | /** |
| | | * QQå·ç |
| | | */ |
| | | String QQ_NUMBER = "^[1-9][0-9]\\d{4,9}$"; |
| | | |
| | | /** |
| | | * 鮿¿ç¼ç |
| | | */ |
| | | String POSTAL_CODE = "^[1-9]\\d{5}$"; |
| | | |
| | | /** |
| | | * 注åè´¦å· |
| | | */ |
| | | String ACCOUNT = "^[a-zA-Z][a-zA-Z0-9_]{4,15}$"; |
| | | |
| | | /** |
| | | * å¯ç ï¼å
å«è³å°8个å符ï¼å
æ¬å¤§å忝ãå°ååæ¯ãæ°ååç¹æ®å符 |
| | | */ |
| | | String PASSWORD = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$"; |
| | | |
| | | /** |
| | | * éç¨ç¶æï¼0表示æ£å¸¸ï¼1表示åç¨ï¼ |
| | | */ |
| | | String STATUS = "^[01]$"; |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.common.core.constant; |
| | | |
| | | /** |
| | | * ç³»ç»å¸¸éä¿¡æ¯ |
| | | * |
| | | * @author Lion Li |
| | | */ |
| | | public interface SystemConstants { |
| | | |
| | | /** |
| | | * æ£å¸¸ç¶æ |
| | | */ |
| | | String NORMAL = "0"; |
| | | |
| | | /** |
| | | * å¼å¸¸ç¶æ |
| | | */ |
| | | String DISABLE = "1"; |
| | | |
| | | /** |
| | | * æ¯å¦ä¸ºç³»ç»é»è®¤ï¼æ¯ï¼ |
| | | */ |
| | | String YES = "Y"; |
| | | |
| | | /** |
| | | * æ¯å¦ä¸ºç³»ç»é»è®¤ï¼å¦ï¼ |
| | | */ |
| | | String NO = "N"; |
| | | |
| | | /** |
| | | * æ¯å¦èåå¤é¾ï¼æ¯ï¼ |
| | | */ |
| | | String YES_FRAME = "0"; |
| | | |
| | | /** |
| | | * æ¯å¦èåå¤é¾ï¼å¦ï¼ |
| | | */ |
| | | String NO_FRAME = "1"; |
| | | |
| | | /** |
| | | * èåç±»åï¼ç®å½ï¼ |
| | | */ |
| | | String TYPE_DIR = "M"; |
| | | |
| | | /** |
| | | * èåç±»åï¼èåï¼ |
| | | */ |
| | | String TYPE_MENU = "C"; |
| | | |
| | | /** |
| | | * èåç±»åï¼æé®ï¼ |
| | | */ |
| | | String TYPE_BUTTON = "F"; |
| | | |
| | | /** |
| | | * Layoutç»ä»¶æ è¯ |
| | | */ |
| | | String LAYOUT = "Layout"; |
| | | |
| | | /** |
| | | * ParentViewç»ä»¶æ è¯ |
| | | */ |
| | | String PARENT_VIEW = "ParentView"; |
| | | |
| | | /** |
| | | * InnerLinkç»ä»¶æ è¯ |
| | | */ |
| | | String INNER_LINK = "InnerLink"; |
| | | |
| | | /** |
| | | * è¶
级管çåID |
| | | */ |
| | | Long SUPER_ADMIN_ID = 1L; |
| | | |
| | | /** |
| | | * æ ¹é¨é¨ç¥çº§å表 |
| | | */ |
| | | String ROOT_DEPT_ANCESTORS = "0"; |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.common.core.factory; |
| | | |
| | | import cn.hutool.core.lang.PatternPool; |
| | | import org.ruoyi.common.core.constant.RegexConstants; |
| | | |
| | | |
| | | import java.util.regex.Pattern; |
| | | |
| | | /** |
| | | * æ£åè¡¨è¾¾å¼æ¨¡å¼æ± å·¥å |
| | | * <p>åå§åçæ¶åå°æ£å表达å¼å å
¥ç¼åæ± å½ä¸</p> |
| | | * <p>æé«æ£å表达å¼çæ§è½ï¼é¿å
éå¤ç¼è¯ç¸åçæ£å表达å¼</p> |
| | | * |
| | | * @author 21001 |
| | | */ |
| | | public class RegexPatternPoolFactory extends PatternPool { |
| | | |
| | | /** |
| | | * åå
¸ç±»åå¿
须以忝å¼å¤´ï¼ä¸åªè½ä¸ºï¼å°ååæ¯ï¼æ°åï¼ä¸æ»çº¿ï¼ |
| | | */ |
| | | public static final Pattern DICTIONARY_TYPE = get(RegexConstants.DICTIONARY_TYPE); |
| | | |
| | | /** |
| | | * 身份è¯å·ç ï¼å6ä½ï¼ |
| | | */ |
| | | public static final Pattern ID_CARD_LAST_6 = get(RegexConstants.ID_CARD_LAST_6); |
| | | |
| | | /** |
| | | * QQå·ç |
| | | */ |
| | | public static final Pattern QQ_NUMBER = get(RegexConstants.QQ_NUMBER); |
| | | |
| | | /** |
| | | * 鮿¿ç¼ç |
| | | */ |
| | | public static final Pattern POSTAL_CODE = get(RegexConstants.POSTAL_CODE); |
| | | |
| | | /** |
| | | * 注åè´¦å· |
| | | */ |
| | | public static final Pattern ACCOUNT = get(RegexConstants.ACCOUNT); |
| | | |
| | | /** |
| | | * å¯ç ï¼å
å«è³å°8个å符ï¼å
æ¬å¤§å忝ãå°ååæ¯ãæ°ååç¹æ®å符 |
| | | */ |
| | | public static final Pattern PASSWORD = get(RegexConstants.PASSWORD); |
| | | |
| | | /** |
| | | * éç¨ç¶æï¼0表示æ£å¸¸ï¼1表示åç¨ï¼ |
| | | */ |
| | | public static final Pattern STATUS = get(RegexConstants.STATUS); |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.common.core.factory; |
| | | |
| | | |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; |
| | | import org.springframework.core.env.PropertiesPropertySource; |
| | | import org.springframework.core.env.PropertySource; |
| | | import org.springframework.core.io.support.DefaultPropertySourceFactory; |
| | | import org.springframework.core.io.support.EncodedResource; |
| | | |
| | | import java.io.IOException; |
| | | |
| | | /** |
| | | * yml é
ç½®æºå·¥å |
| | | * |
| | | * @author Lion Li |
| | | */ |
| | | public class YmlPropertySourceFactory extends DefaultPropertySourceFactory { |
| | | |
| | | @Override |
| | | public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException { |
| | | String sourceName = resource.getResource().getFilename(); |
| | | if (StringUtils.isNotBlank(sourceName) && StringUtils.endsWithAny(sourceName, ".yml", ".yaml")) { |
| | | YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); |
| | | factory.setResources(resource.getResource()); |
| | | factory.afterPropertiesSet(); |
| | | return new PropertiesPropertySource(sourceName, factory.getObject()); |
| | | } |
| | | return super.createPropertySource(name, resource); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.common.core.utils; |
| | | |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import lombok.AccessLevel; |
| | | import lombok.NoArgsConstructor; |
| | | |
| | | import java.util.function.Function; |
| | | |
| | | /** |
| | | * 对象工å
·ç±» |
| | | * |
| | | * @author ç§è¾æªå¯ |
| | | */ |
| | | @NoArgsConstructor(access = AccessLevel.PRIVATE) |
| | | public class ObjectUtils extends ObjectUtil { |
| | | |
| | | /** |
| | | * å¦æå¯¹è±¡ä¸ä¸ºç©ºï¼åè·å对象ä¸çæä¸ªå段 ObjectUtils.notNullGetter(user, User::getName); |
| | | * |
| | | * @param obj 对象 |
| | | * @param func è·åæ¹æ³ |
| | | * @return å¯¹è±¡åæ®µ |
| | | */ |
| | | public static <T, E> E notNullGetter(T obj, Function<T, E> func) { |
| | | if (isNotNull(obj) && isNotNull(func)) { |
| | | return func.apply(obj); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * å¦æå¯¹è±¡ä¸ä¸ºç©ºï¼åè·å对象ä¸çæä¸ªå段ï¼å¦åè¿åé»è®¤å¼ |
| | | * |
| | | * @param obj 对象 |
| | | * @param func è·åæ¹æ³ |
| | | * @param defaultValue é»è®¤å¼ |
| | | * @return å¯¹è±¡åæ®µ |
| | | */ |
| | | public static <T, E> E notNullGetter(T obj, Function<T, E> func, E defaultValue) { |
| | | if (isNotNull(obj) && isNotNull(func)) { |
| | | return func.apply(obj); |
| | | } |
| | | return defaultValue; |
| | | } |
| | | |
| | | /** |
| | | * 妿å¼ä¸ä¸ºç©ºï¼åè¿åå¼ï¼å¦åè¿åé»è®¤å¼ |
| | | * |
| | | * @param obj 对象 |
| | | * @param defaultValue é»è®¤å¼ |
| | | * @return å¯¹è±¡åæ®µ |
| | | */ |
| | | public static <T> T notNull(T obj, T defaultValue) { |
| | | if (isNotNull(obj)) { |
| | | return obj; |
| | | } |
| | | return defaultValue; |
| | | } |
| | | |
| | | } |
| | |
| | | package org.ruoyi.common.core.utils; |
| | | |
| | | import cn.hutool.extra.spring.SpringUtil; |
| | | import org.springframework.aop.framework.AopContext; |
| | | import org.springframework.beans.factory.NoSuchBeanDefinitionException; |
| | | import org.springframework.boot.autoconfigure.thread.Threading; |
| | | import org.springframework.context.ApplicationContext; |
| | | import org.springframework.core.env.Environment; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | |
| | | */ |
| | | @SuppressWarnings("unchecked") |
| | | public static <T> T getAopProxy(T invoker) { |
| | | return (T) AopContext.currentProxy(); |
| | | return (T) getBean(invoker.getClass()); |
| | | } |
| | | |
| | | |
| | |
| | | return getApplicationContext(); |
| | | } |
| | | |
| | | public static boolean isVirtual() { |
| | | return Threading.VIRTUAL.isActive(getBean(Environment.class)); |
| | | } |
| | | |
| | | } |
| | |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.mybatis.spring.boot</groupId> |
| | | <artifactId>mybatis-spring-boot-starter</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.bouncycastle</groupId> |
| | | <artifactId>bcprov-jdk15to18</artifactId> |
| | | </dependency> |
| | |
| | | <artifactId>hutool-crypto</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.springframework</groupId> |
| | | <artifactId>spring-webmvc</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>com.baomidou</groupId> |
| | | <artifactId>mybatis-plus-spring-boot3-starter</artifactId> |
| | | <optional>true</optional> |
| | | <exclusions> |
| | | <exclusion> |
| | | <groupId>org.mybatis</groupId> |
| | | <artifactId>mybatis-spring</artifactId> |
| | | </exclusion> |
| | | </exclusions> |
| | | </dependency> |
| | | |
| | | </dependencies> |
| | | |
| | | </project> |
| | |
| | | |
| | | <brotli4j.version>1.13.0</brotli4j.version> |
| | | <jackson-databind.version>2.16.0</jackson-databind.version> |
| | | <hutool-all.version>5.8.24</hutool-all.version> |
| | | <hutool-all.version>5.8.35</hutool-all.version> |
| | | <netty-all.version>4.1.104.Final</netty-all.version> |
| | | <logback-classic.version>1.4.12</logback-classic.version> |
| | | <lombok.version>1.18.30</lombok.version> |
| | |
| | | <groupId>org.ruoyi</groupId> |
| | | <artifactId>ruoyi-common</artifactId> |
| | | <version>${revision}</version> |
| | | <relativePath>../pom.xml</relativePath> |
| | | </parent> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | |
| | |
| | | <!-- dynamic-datasource 夿°æ®æº--> |
| | | <dependency> |
| | | <groupId>com.baomidou</groupId> |
| | | <artifactId>dynamic-datasource-spring-boot-starter</artifactId> |
| | | <artifactId>dynamic-datasource-spring-boot3-starter</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>com.baomidou</groupId> |
| | | <artifactId>mybatis-plus-boot-starter</artifactId> |
| | | <artifactId>mybatis-plus-spring-boot3-starter</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>com.baomidou</groupId> |
| | | <artifactId>mybatis-plus-jsqlparser</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- sqlæ§è½åææä»¶ --> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.annotation; |
| | | |
| | | import java.lang.annotation.*; |
| | | |
| | | /** |
| | | * æ°æ®æé注解ï¼ç¨äºæ è®°æ°æ®æéçå ä½ç¬¦å
³é®ååæ¿æ¢å¼ |
| | | * <p> |
| | | * ä¸ä¸ªæ³¨è§£åªè½å¯¹åºä¸ä¸ªæ¨¡æ¿ |
| | | * </p> |
| | | * |
| | | * @author Lion Li |
| | | * @version 3.5.0 |
| | | */ |
| | | @Target(ElementType.METHOD) |
| | | @Retention(RetentionPolicy.RUNTIME) |
| | | @Documented |
| | | public @interface DataColumn { |
| | | |
| | | /** |
| | | * æ°æ®æé模æ¿çå ä½ç¬¦å
³é®åï¼é»è®¤ä¸º "deptName" |
| | | * |
| | | * @return å ä½ç¬¦å
³é®åæ°ç» |
| | | */ |
| | | String[] key() default "deptName"; |
| | | |
| | | /** |
| | | * æ°æ®æé模æ¿çå ä½ç¬¦æ¿æ¢å¼ï¼é»è®¤ä¸º "dept_id" |
| | | * |
| | | * @return å ä½ç¬¦æ¿æ¢å¼æ°ç» |
| | | */ |
| | | String[] value() default "dept_id"; |
| | | |
| | | /** |
| | | * æéæ è¯ç¬¦ ç¨äºéè¿èåæéæ è¯ç¬¦æ¥è·åæ°æ®æé |
| | | * æ¥ææ¤æ è¯ç¬¦çè§è² å°ä¸ä¼æ¼æ¥æ¤è§è²çæ°æ®è¿æ»¤sql |
| | | * |
| | | * @return æéæ è¯ç¬¦ |
| | | */ |
| | | String permission() default ""; |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.annotation; |
| | | |
| | | import java.lang.annotation.*; |
| | | |
| | | /** |
| | | * æ°æ®æéç»æ³¨è§£ï¼ç¨äºæ è®°æ°æ®æéé
ç½®æ°ç» |
| | | * |
| | | * @author Lion Li |
| | | * @version 3.5.0 |
| | | */ |
| | | @Target({ElementType.METHOD, ElementType.TYPE}) |
| | | @Retention(RetentionPolicy.RUNTIME) |
| | | @Documented |
| | | public @interface DataPermission { |
| | | |
| | | /** |
| | | * æ°æ®æéé
ç½®æ°ç»ï¼ç¨äºæå®æ°æ®æéçå ä½ç¬¦å
³é®ååæ¿æ¢å¼ |
| | | * |
| | | * @return æ°æ®æéé
ç½®æ°ç» |
| | | */ |
| | | DataColumn[] value(); |
| | | |
| | | /** |
| | | * æéæ¼æ¥æ è¯ç¬¦(ç¨äºæå®è¿æ¥è¯å¥çsql符å·) |
| | | * å¦ä¸å¡« é»è®¤ select ç¨ OR å
¶ä»è¯å¥ç¨ AND |
| | | * å
容 OR æè
AND |
| | | */ |
| | | String joinStr() default ""; |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.aspect; |
| | | |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.aspectj.lang.JoinPoint; |
| | | import org.aspectj.lang.annotation.AfterReturning; |
| | | import org.aspectj.lang.annotation.AfterThrowing; |
| | | import org.aspectj.lang.annotation.Aspect; |
| | | import org.aspectj.lang.annotation.Before; |
| | | import org.ruoyi.annotation.DataPermission; |
| | | import org.ruoyi.helper.DataPermissionHelper; |
| | | |
| | | /** |
| | | * æ°æ®æéå¤ç |
| | | * |
| | | * @author Lion Li |
| | | */ |
| | | @Slf4j |
| | | @Aspect |
| | | public class DataPermissionAspect { |
| | | |
| | | /** |
| | | * å¤ç请æ±åæ§è¡ |
| | | */ |
| | | @Before(value = "@annotation(dataPermission)") |
| | | public void doBefore(JoinPoint joinPoint, DataPermission dataPermission) { |
| | | DataPermissionHelper.setPermission(dataPermission); |
| | | } |
| | | |
| | | /** |
| | | * å¤çå®è¯·æ±åæ§è¡ |
| | | * |
| | | * @param joinPoint åç¹ |
| | | */ |
| | | @AfterReturning(pointcut = "@annotation(dataPermission)") |
| | | public void doAfterReturning(JoinPoint joinPoint, DataPermission dataPermission) { |
| | | DataPermissionHelper.removePermission(); |
| | | } |
| | | |
| | | /** |
| | | * æ¦æªå¼å¸¸æä½ |
| | | * |
| | | * @param joinPoint åç¹ |
| | | * @param e å¼å¸¸ |
| | | */ |
| | | @AfterThrowing(value = "@annotation(dataPermission)", throwing = "e") |
| | | public void doAfterThrowing(JoinPoint joinPoint, DataPermission dataPermission, Exception e) { |
| | | DataPermissionHelper.removePermission(); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.config; |
| | | |
| | | import cn.hutool.core.net.NetUtil; |
| | | import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; |
| | | import com.baomidou.mybatisplus.core.handlers.PostInitTableInfoHandler; |
| | | import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator; |
| | | import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; |
| | | import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; |
| | | import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; |
| | | import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; |
| | | import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; |
| | | import org.ruoyi.aspect.DataPermissionAspect; |
| | | import org.ruoyi.common.core.factory.YmlPropertySourceFactory; |
| | | import org.ruoyi.common.core.utils.SpringUtils; |
| | | import org.ruoyi.handler.InjectionMetaObjectHandler; |
| | | import org.ruoyi.handler.MybatisExceptionHandler; |
| | | import org.ruoyi.handler.PlusPostInitTableInfoHandler; |
| | | import org.ruoyi.interceptor.PlusDataPermissionInterceptor; |
| | | import org.mybatis.spring.annotation.MapperScan; |
| | | import org.springframework.beans.BeansException; |
| | | import org.springframework.context.annotation.Bean; |
| | | import org.springframework.context.annotation.PropertySource; |
| | | import org.springframework.transaction.annotation.EnableTransactionManagement; |
| | | |
| | | /** |
| | | * mybatis-plusé
置类(䏿¹æ³¨éææä»¶ä»ç») |
| | | * |
| | | * @author Lion Li |
| | | */ |
| | | @EnableTransactionManagement(proxyTargetClass = true) |
| | | @MapperScan("${mybatis-plus.mapperPackage}") |
| | | @PropertySource(value = "classpath:common-mybatis.yml", factory = YmlPropertySourceFactory.class) |
| | | public class MybatisPlusConfig { |
| | | |
| | | @Bean |
| | | public MybatisPlusInterceptor mybatisPlusInterceptor() { |
| | | MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); |
| | | // å¤ç§æ·æä»¶ å¿
é¡»æ¾å°ç¬¬ä¸ä½ |
| | | try { |
| | | TenantLineInnerInterceptor tenant = SpringUtils.getBean(TenantLineInnerInterceptor.class); |
| | | interceptor.addInnerInterceptor(tenant); |
| | | } catch (BeansException ignore) { |
| | | } |
| | | // æ°æ®æéå¤ç |
| | | interceptor.addInnerInterceptor(dataPermissionInterceptor()); |
| | | // å页æä»¶ |
| | | interceptor.addInnerInterceptor(paginationInnerInterceptor()); |
| | | // ä¹è§éæä»¶ |
| | | interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor()); |
| | | return interceptor; |
| | | } |
| | | |
| | | /** |
| | | * æ°æ®æéæ¦æªå¨ |
| | | */ |
| | | public PlusDataPermissionInterceptor dataPermissionInterceptor() { |
| | | return new PlusDataPermissionInterceptor(SpringUtils.getProperty("mybatis-plus.mapperPackage")); |
| | | } |
| | | |
| | | /** |
| | | * æ°æ®æéåé¢å¤çå¨ |
| | | */ |
| | | @Bean |
| | | public DataPermissionAspect dataPermissionAspect() { |
| | | return new DataPermissionAspect(); |
| | | } |
| | | |
| | | /** |
| | | * å页æä»¶ï¼èªå¨è¯å«æ°æ®åºç±»å |
| | | */ |
| | | public PaginationInnerInterceptor paginationInnerInterceptor() { |
| | | PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); |
| | | // å页åçå |
| | | paginationInnerInterceptor.setOverflow(true); |
| | | return paginationInnerInterceptor; |
| | | } |
| | | |
| | | /** |
| | | * ä¹è§éæä»¶ |
| | | */ |
| | | public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() { |
| | | return new OptimisticLockerInnerInterceptor(); |
| | | } |
| | | |
| | | /** |
| | | * å
å¯¹è±¡åæ®µå¡«å
æ§å¶å¨ |
| | | */ |
| | | @Bean |
| | | public MetaObjectHandler metaObjectHandler() { |
| | | return new InjectionMetaObjectHandler(); |
| | | } |
| | | |
| | | /** |
| | | * 使ç¨ç½å¡ä¿¡æ¯ç»å®éªè±çæå¨ |
| | | * 鲿¢é群éªè±IDéå¤ |
| | | */ |
| | | @Bean |
| | | public IdentifierGenerator idGenerator() { |
| | | return new DefaultIdentifierGenerator(NetUtil.getLocalhost()); |
| | | } |
| | | |
| | | /** |
| | | * å¼å¸¸å¤çå¨ |
| | | */ |
| | | @Bean |
| | | public MybatisExceptionHandler mybatisExceptionHandler() { |
| | | return new MybatisExceptionHandler(); |
| | | } |
| | | |
| | | /** |
| | | * åå§å表对象å¤çå¨ |
| | | */ |
| | | @Bean |
| | | public PostInitTableInfoHandler postInitTableInfoHandler() { |
| | | return new PlusPostInitTableInfoHandler(); |
| | | } |
| | | |
| | | /** |
| | | * PaginationInnerInterceptor å页æä»¶ï¼èªå¨è¯å«æ°æ®åºç±»å |
| | | * https://baomidou.com/pages/97710a/ |
| | | * OptimisticLockerInnerInterceptor ä¹è§éæä»¶ |
| | | * https://baomidou.com/pages/0d93c0/ |
| | | * MetaObjectHandler å
å¯¹è±¡åæ®µå¡«å
æ§å¶å¨ |
| | | * https://baomidou.com/pages/4c6bcf/ |
| | | * ISqlInjector sql注å
¥å¨ |
| | | * https://baomidou.com/pages/42ea4a/ |
| | | * BlockAttackInnerInterceptor 妿æ¯å¯¹å
¨è¡¨çå é¤ææ´æ°æä½ï¼å°±ä¼ç»æ¢è¯¥æä½ |
| | | * https://baomidou.com/pages/f9a237/ |
| | | * IllegalSQLInnerInterceptor sqlæ§è½è§èæä»¶(åå¾SQLæ¦æª) |
| | | * IdentifierGenerator èªå®ä¹ä¸»é®çç¥ |
| | | * https://baomidou.com/pages/568eb2/ |
| | | * TenantLineInnerInterceptor å¤ç§æ·æä»¶ |
| | | * https://baomidou.com/pages/aef2f2/ |
| | | * DynamicTableNameInnerInterceptor å¨æè¡¨åæä»¶ |
| | | * https://baomidou.com/pages/2a45ff/ |
| | | */ |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.core.domain; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.FieldFill; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.fasterxml.jackson.annotation.JsonIgnore; |
| | | import com.fasterxml.jackson.annotation.JsonInclude; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serial; |
| | | import java.io.Serializable; |
| | | import java.util.Date; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * Entityåºç±» |
| | | * |
| | | * @author Lion Li |
| | | */ |
| | | @Data |
| | | public class BaseEntity implements Serializable { |
| | | |
| | | @Serial |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * æç´¢å¼ |
| | | */ |
| | | @JsonIgnore |
| | | @TableField(exist = false) |
| | | private String searchValue; |
| | | |
| | | /** |
| | | * å建é¨é¨ |
| | | */ |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long createDept; |
| | | |
| | | /** |
| | | * å建è
|
| | | */ |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long createBy; |
| | | |
| | | /** |
| | | * å建æ¶é´ |
| | | */ |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Date createTime; |
| | | |
| | | /** |
| | | * æ´æ°è
|
| | | */ |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private Long updateBy; |
| | | |
| | | /** |
| | | * æ´æ°æ¶é´ |
| | | */ |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private Date updateTime; |
| | | |
| | | /** |
| | | * 请æ±åæ° |
| | | */ |
| | | @JsonInclude(JsonInclude.Include.NON_EMPTY) |
| | | @TableField(exist = false) |
| | | private Map<String, Object> params = new HashMap<>(); |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.core.mapper; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import com.baomidou.mybatisplus.core.conditions.Wrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.core.toolkit.reflect.GenericTypeUtils; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.toolkit.Db; |
| | | import org.apache.ibatis.logging.Log; |
| | | import org.apache.ibatis.logging.LogFactory; |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StreamUtils; |
| | | |
| | | |
| | | import java.io.Serializable; |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.function.Function; |
| | | |
| | | /** |
| | | * èªå®ä¹ Mapper æ¥å£, å®ç° èªå®ä¹æ©å± |
| | | * |
| | | * @param <T> table æ³å |
| | | * @param <V> vo æ³å |
| | | * @author Lion Li |
| | | * @since 2021-05-13 |
| | | */ |
| | | @SuppressWarnings("unchecked") |
| | | public interface BaseMapperPlus<T, V> extends BaseMapper<T> { |
| | | |
| | | Log log = LogFactory.getLog(BaseMapperPlus.class); |
| | | |
| | | /** |
| | | * è·åå½åå®ä¾å¯¹è±¡å
³èçæ³åç±»å V ç Class 对象 |
| | | * |
| | | * @return è¿åå½åå®ä¾å¯¹è±¡å
³èçæ³åç±»å V ç Class 对象 |
| | | */ |
| | | default Class<V> currentVoClass() { |
| | | return (Class<V>) GenericTypeUtils.resolveTypeArguments(this.getClass(), BaseMapperPlus.class)[1]; |
| | | } |
| | | |
| | | /** |
| | | * è·åå½åå®ä¾å¯¹è±¡å
³èçæ³åç±»å T ç Class 对象 |
| | | * |
| | | * @return è¿åå½åå®ä¾å¯¹è±¡å
³èçæ³åç±»å T ç Class 对象 |
| | | */ |
| | | default Class<T> currentModelClass() { |
| | | return (Class<T>) GenericTypeUtils.resolveTypeArguments(this.getClass(), BaseMapperPlus.class)[0]; |
| | | } |
| | | |
| | | /** |
| | | * 使ç¨é»è®¤çæ¥è¯¢æ¡ä»¶æ¥è¯¢å¹¶è¿åç»æå表 |
| | | * |
| | | * @return è¿åæ¥è¯¢ç»æçå表 |
| | | */ |
| | | default List<T> selectList() { |
| | | return this.selectList(new QueryWrapper<>()); |
| | | } |
| | | |
| | | /** |
| | | * æ¹éæå
¥å®ä½å¯¹è±¡éå |
| | | * |
| | | * @param entityList å®ä½å¯¹è±¡éå |
| | | * @return æå
¥æä½æ¯å¦æåçå¸å°å¼ |
| | | */ |
| | | default boolean insertBatch(Collection<T> entityList) { |
| | | return Db.saveBatch(entityList); |
| | | } |
| | | |
| | | /** |
| | | * æ¹éæ ¹æ®IDæ´æ°å®ä½å¯¹è±¡éå |
| | | * |
| | | * @param entityList å®ä½å¯¹è±¡éå |
| | | * @return æ´æ°æä½æ¯å¦æåçå¸å°å¼ |
| | | */ |
| | | default boolean updateBatchById(Collection<T> entityList) { |
| | | return Db.updateBatchById(entityList); |
| | | } |
| | | |
| | | /** |
| | | * æ¹éæå
¥ææ´æ°å®ä½å¯¹è±¡éå |
| | | * |
| | | * @param entityList å®ä½å¯¹è±¡éå |
| | | * @return æå
¥ææ´æ°æä½æ¯å¦æåçå¸å°å¼ |
| | | */ |
| | | default boolean insertOrUpdateBatch(Collection<T> entityList) { |
| | | return Db.saveOrUpdateBatch(entityList); |
| | | } |
| | | |
| | | /** |
| | | * æ¹éæå
¥å®ä½å¯¹è±¡éåå¹¶æå®æ¹å¤çå¤§å° |
| | | * |
| | | * @param entityList å®ä½å¯¹è±¡éå |
| | | * @param batchSize æ¹å¤çå¤§å° |
| | | * @return æå
¥æä½æ¯å¦æåçå¸å°å¼ |
| | | */ |
| | | default boolean insertBatch(Collection<T> entityList, int batchSize) { |
| | | return Db.saveBatch(entityList, batchSize); |
| | | } |
| | | |
| | | /** |
| | | * æ¹éæ ¹æ®IDæ´æ°å®ä½å¯¹è±¡éåå¹¶æå®æ¹å¤çå¤§å° |
| | | * |
| | | * @param entityList å®ä½å¯¹è±¡éå |
| | | * @param batchSize æ¹å¤çå¤§å° |
| | | * @return æ´æ°æä½æ¯å¦æåçå¸å°å¼ |
| | | */ |
| | | default boolean updateBatchById(Collection<T> entityList, int batchSize) { |
| | | return Db.updateBatchById(entityList, batchSize); |
| | | } |
| | | |
| | | /** |
| | | * æ¹éæå
¥ææ´æ°å®ä½å¯¹è±¡éåå¹¶æå®æ¹å¤çå¤§å° |
| | | * |
| | | * @param entityList å®ä½å¯¹è±¡éå |
| | | * @param batchSize æ¹å¤çå¤§å° |
| | | * @return æå
¥ææ´æ°æä½æ¯å¦æåçå¸å°å¼ |
| | | */ |
| | | default boolean insertOrUpdateBatch(Collection<T> entityList, int batchSize) { |
| | | return Db.saveOrUpdateBatch(entityList, batchSize); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®IDæ¥è¯¢å个VO对象 |
| | | * |
| | | * @param id 主é®ID |
| | | * @return æ¥è¯¢å°çå个VO对象 |
| | | */ |
| | | default V selectVoById(Serializable id) { |
| | | return selectVoById(id, this.currentVoClass()); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®IDæ¥è¯¢å个VO对象并å°å
¶è½¬æ¢ä¸ºæå®çVOç±» |
| | | * |
| | | * @param id 主é®ID |
| | | * @param voClass è¦è½¬æ¢çVOç±»çClass对象 |
| | | * @param <C> VOç±»çç±»å |
| | | * @return æ¥è¯¢å°çå个VO对象ï¼ç»è¿è½¬æ¢ä¸ºæå®çVOç±»åè¿å |
| | | */ |
| | | default <C> C selectVoById(Serializable id, Class<C> voClass) { |
| | | T obj = this.selectById(id); |
| | | if (ObjectUtil.isNull(obj)) { |
| | | return null; |
| | | } |
| | | return MapstructUtils.convert(obj, voClass); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®IDéåæ¹éæ¥è¯¢VO对象å表 |
| | | * |
| | | * @param idList 主é®IDéå |
| | | * @return æ¥è¯¢å°çVO对象å表 |
| | | */ |
| | | default List<V> selectVoByIds(Collection<? extends Serializable> idList) { |
| | | return selectVoByIds(idList, this.currentVoClass()); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®IDéåæ¹éæ¥è¯¢å®ä½å¯¹è±¡å表ï¼å¹¶å°å
¶è½¬æ¢ä¸ºæå®çVO对象å表 |
| | | * |
| | | * @param idList 主é®IDéå |
| | | * @param voClass è¦è½¬æ¢çVOç±»çClass对象 |
| | | * @param <C> VOç±»çç±»å |
| | | * @return æ¥è¯¢å°çVO对象å表ï¼ç»è¿è½¬æ¢ä¸ºæå®çVOç±»åè¿å |
| | | */ |
| | | default <C> List<C> selectVoByIds(Collection<? extends Serializable> idList, Class<C> voClass) { |
| | | List<T> list = this.selectByIds(idList); |
| | | if (CollUtil.isEmpty(list)) { |
| | | return CollUtil.newArrayList(); |
| | | } |
| | | return MapstructUtils.convert(list, voClass); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®æ¥è¯¢æ¡ä»¶Mapæ¥è¯¢VO对象å表 |
| | | * |
| | | * @param map æ¥è¯¢æ¡ä»¶Map |
| | | * @return æ¥è¯¢å°çVO对象å表 |
| | | */ |
| | | default List<V> selectVoByMap(Map<String, Object> map) { |
| | | return selectVoByMap(map, this.currentVoClass()); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®æ¥è¯¢æ¡ä»¶Mapæ¥è¯¢å®ä½å¯¹è±¡å表ï¼å¹¶å°å
¶è½¬æ¢ä¸ºæå®çVO对象å表 |
| | | * |
| | | * @param map æ¥è¯¢æ¡ä»¶Map |
| | | * @param voClass è¦è½¬æ¢çVOç±»çClass对象 |
| | | * @param <C> VOç±»çç±»å |
| | | * @return æ¥è¯¢å°çVO对象å表ï¼ç»è¿è½¬æ¢ä¸ºæå®çVOç±»åè¿å |
| | | */ |
| | | default <C> List<C> selectVoByMap(Map<String, Object> map, Class<C> voClass) { |
| | | List<T> list = this.selectByMap(map); |
| | | if (CollUtil.isEmpty(list)) { |
| | | return CollUtil.newArrayList(); |
| | | } |
| | | return MapstructUtils.convert(list, voClass); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®æ¡ä»¶æ¥è¯¢å个VO对象 |
| | | * |
| | | * @param wrapper æ¥è¯¢æ¡ä»¶Wrapper |
| | | * @return æ¥è¯¢å°çå个VO对象 |
| | | */ |
| | | default V selectVoOne(Wrapper<T> wrapper) { |
| | | return selectVoOne(wrapper, this.currentVoClass()); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®æ¡ä»¶æ¥è¯¢å个VO对象ï¼å¹¶æ ¹æ®éè¦å³å®æ¯å¦æåºå¼å¸¸ |
| | | * |
| | | * @param wrapper æ¥è¯¢æ¡ä»¶Wrapper |
| | | * @param throwEx æ¯å¦æåºå¼å¸¸çæ å¿ |
| | | * @return æ¥è¯¢å°çå个VO对象 |
| | | */ |
| | | default V selectVoOne(Wrapper<T> wrapper, boolean throwEx) { |
| | | return selectVoOne(wrapper, this.currentVoClass(), throwEx); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®æ¡ä»¶æ¥è¯¢å个VO对象ï¼å¹¶æå®è¿åçVO对象çç±»å |
| | | * |
| | | * @param wrapper æ¥è¯¢æ¡ä»¶Wrapper |
| | | * @param voClass è¿åçVO对象çClass对象 |
| | | * @param <C> è¿åçVO对象çç±»å |
| | | * @return æ¥è¯¢å°çå个VO对象ï¼ç»è¿ç±»å转æ¢ä¸ºæå®çVOç±»åè¿å |
| | | */ |
| | | default <C> C selectVoOne(Wrapper<T> wrapper, Class<C> voClass) { |
| | | return selectVoOne(wrapper, voClass, true); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®æ¡ä»¶æ¥è¯¢å个å®ä½å¯¹è±¡ï¼å¹¶å°å
¶è½¬æ¢ä¸ºæå®çVO对象 |
| | | * |
| | | * @param wrapper æ¥è¯¢æ¡ä»¶Wrapper |
| | | * @param voClass è¦è½¬æ¢çVOç±»çClass对象 |
| | | * @param throwEx æ¯å¦æåºå¼å¸¸çæ å¿ |
| | | * @param <C> VOç±»çç±»å |
| | | * @return æ¥è¯¢å°çå个VO对象ï¼ç»è¿è½¬æ¢ä¸ºæå®çVOç±»åè¿å |
| | | */ |
| | | default <C> C selectVoOne(Wrapper<T> wrapper, Class<C> voClass, boolean throwEx) { |
| | | T obj = this.selectOne(wrapper, throwEx); |
| | | if (ObjectUtil.isNull(obj)) { |
| | | return null; |
| | | } |
| | | return MapstructUtils.convert(obj, voClass); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢ææVO对象å表 |
| | | * |
| | | * @return æ¥è¯¢å°çVO对象å表 |
| | | */ |
| | | default List<V> selectVoList() { |
| | | return selectVoList(new QueryWrapper<>(), this.currentVoClass()); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®æ¡ä»¶æ¥è¯¢VO对象å表 |
| | | * |
| | | * @param wrapper æ¥è¯¢æ¡ä»¶Wrapper |
| | | * @return æ¥è¯¢å°çVO对象å表 |
| | | */ |
| | | default List<V> selectVoList(Wrapper<T> wrapper) { |
| | | return selectVoList(wrapper, this.currentVoClass()); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®æ¡ä»¶æ¥è¯¢å®ä½å¯¹è±¡å表ï¼å¹¶å°å
¶è½¬æ¢ä¸ºæå®çVO对象å表 |
| | | * |
| | | * @param wrapper æ¥è¯¢æ¡ä»¶Wrapper |
| | | * @param voClass è¦è½¬æ¢çVOç±»çClass对象 |
| | | * @param <C> VOç±»çç±»å |
| | | * @return æ¥è¯¢å°çVO对象å表ï¼ç»è¿è½¬æ¢ä¸ºæå®çVOç±»åè¿å |
| | | */ |
| | | default <C> List<C> selectVoList(Wrapper<T> wrapper, Class<C> voClass) { |
| | | List<T> list = this.selectList(wrapper); |
| | | if (CollUtil.isEmpty(list)) { |
| | | return CollUtil.newArrayList(); |
| | | } |
| | | return MapstructUtils.convert(list, voClass); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®æ¡ä»¶å页æ¥è¯¢VO对象å表 |
| | | * |
| | | * @param page åé¡µä¿¡æ¯ |
| | | * @param wrapper æ¥è¯¢æ¡ä»¶Wrapper |
| | | * @return æ¥è¯¢å°çVO对象å页å表 |
| | | */ |
| | | default <P extends IPage<V>> P selectVoPage(IPage<T> page, Wrapper<T> wrapper) { |
| | | return selectVoPage(page, wrapper, this.currentVoClass()); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®æ¡ä»¶å页æ¥è¯¢å®ä½å¯¹è±¡å表ï¼å¹¶å°å
¶è½¬æ¢ä¸ºæå®çVO对象å页å表 |
| | | * |
| | | * @param page åé¡µä¿¡æ¯ |
| | | * @param wrapper æ¥è¯¢æ¡ä»¶Wrapper |
| | | * @param voClass è¦è½¬æ¢çVOç±»çClass对象 |
| | | * @param <C> VOç±»çç±»å |
| | | * @param <P> VO对象å页å表çç±»å |
| | | * @return æ¥è¯¢å°çVO对象å页å表ï¼ç»è¿è½¬æ¢ä¸ºæå®çVOç±»åè¿å |
| | | */ |
| | | default <C, P extends IPage<C>> P selectVoPage(IPage<T> page, Wrapper<T> wrapper, Class<C> voClass) { |
| | | // æ ¹æ®æ¡ä»¶å页æ¥è¯¢å®ä½å¯¹è±¡å表 |
| | | List<T> list = this.selectList(page, wrapper); |
| | | // å建ä¸ä¸ªæ°çVO对象å页å表ï¼å¹¶è®¾ç½®åé¡µä¿¡æ¯ |
| | | IPage<C> voPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal()); |
| | | if (CollUtil.isEmpty(list)) { |
| | | return (P) voPage; |
| | | } |
| | | voPage.setRecords(MapstructUtils.convert(list, voClass)); |
| | | return (P) voPage; |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®æ¡ä»¶æ¥è¯¢ç¬¦åæ¡ä»¶ç对象ï¼å¹¶å°å
¶è½¬æ¢ä¸ºæå®ç±»åç对象å表 |
| | | * |
| | | * @param wrapper æ¥è¯¢æ¡ä»¶Wrapper |
| | | * @param mapper 转æ¢å½æ°ï¼ç¨äºå°æ¥è¯¢å°ç对象转æ¢ä¸ºæå®ç±»åç对象 |
| | | * @param <C> è¦è½¬æ¢ç对象çç±»å |
| | | * @return æ¥è¯¢å°çç¬¦åæ¡ä»¶ç对象å表ï¼ç»è¿è½¬æ¢ä¸ºæå®ç±»åç对象åè¿å |
| | | */ |
| | | default <C> List<C> selectObjs(Wrapper<T> wrapper, Function<? super Object, C> mapper) { |
| | | return StreamUtils.toList(this.selectObjs(wrapper), mapper); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.core.page; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import com.baomidou.mybatisplus.core.metadata.OrderItem; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.fasterxml.jackson.annotation.JsonIgnore; |
| | | import lombok.Data; |
| | | import org.ruoyi.common.core.exception.ServiceException; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.core.utils.sql.SqlUtil; |
| | | |
| | | import java.io.Serial; |
| | | import java.io.Serializable; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * å页æ¥è¯¢å®ä½ç±» |
| | | * |
| | | * @author Lion Li |
| | | */ |
| | | @Data |
| | | public class PageQuery implements Serializable { |
| | | |
| | | @Serial |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * åé¡µå¤§å° |
| | | */ |
| | | private Integer pageSize; |
| | | |
| | | /** |
| | | * å½åé¡µæ° |
| | | */ |
| | | private Integer pageNum; |
| | | |
| | | /** |
| | | * æåºå |
| | | */ |
| | | private String orderByColumn; |
| | | |
| | | /** |
| | | * æåºçæ¹ådescæè
asc |
| | | */ |
| | | private String isAsc; |
| | | |
| | | /** |
| | | * å½åè®°å½èµ·å§ç´¢å¼ é»è®¤å¼ |
| | | */ |
| | | public static final int DEFAULT_PAGE_NUM = 1; |
| | | |
| | | /** |
| | | * æ¯é¡µæ¾ç¤ºè®°å½æ° é»è®¤å¼ é»è®¤æ¥å
¨é¨ |
| | | */ |
| | | public static final int DEFAULT_PAGE_SIZE = Integer.MAX_VALUE; |
| | | |
| | | /** |
| | | * æå»ºå页对象 |
| | | */ |
| | | public <T> Page<T> build() { |
| | | Integer pageNum = ObjectUtil.defaultIfNull(getPageNum(), DEFAULT_PAGE_NUM); |
| | | Integer pageSize = ObjectUtil.defaultIfNull(getPageSize(), DEFAULT_PAGE_SIZE); |
| | | if (pageNum <= 0) { |
| | | pageNum = DEFAULT_PAGE_NUM; |
| | | } |
| | | Page<T> page = new Page<>(pageNum, pageSize); |
| | | List<OrderItem> orderItems = buildOrderItem(); |
| | | if (CollUtil.isNotEmpty(orderItems)) { |
| | | page.addOrder(orderItems); |
| | | } |
| | | return page; |
| | | } |
| | | |
| | | /** |
| | | * æå»ºæåº |
| | | * |
| | | * æ¯æçç¨æ³å¦ä¸: |
| | | * {isAsc:"asc",orderByColumn:"id"} order by id asc |
| | | * {isAsc:"asc",orderByColumn:"id,createTime"} order by id asc,create_time asc |
| | | * {isAsc:"desc",orderByColumn:"id,createTime"} order by id desc,create_time desc |
| | | * {isAsc:"asc,desc",orderByColumn:"id,createTime"} order by id asc,create_time desc |
| | | */ |
| | | private List<OrderItem> buildOrderItem() { |
| | | if (StringUtils.isBlank(orderByColumn) || StringUtils.isBlank(isAsc)) { |
| | | return null; |
| | | } |
| | | String orderBy = SqlUtil.escapeOrderBySql(orderByColumn); |
| | | orderBy = StringUtils.toUnderScoreCase(orderBy); |
| | | |
| | | // å
¼å®¹å端æåºç±»å |
| | | isAsc = StringUtils.replaceEach(isAsc, new String[]{"ascending", "descending"}, new String[]{"asc", "desc"}); |
| | | |
| | | String[] orderByArr = orderBy.split(StringUtils.SEPARATOR); |
| | | String[] isAscArr = isAsc.split(StringUtils.SEPARATOR); |
| | | if (isAscArr.length != 1 && isAscArr.length != orderByArr.length) { |
| | | throw new ServiceException("æåºåæ°æè¯¯"); |
| | | } |
| | | |
| | | List<OrderItem> list = new ArrayList<>(); |
| | | // æ¯ä¸ªå段åèªæåº |
| | | for (int i = 0; i < orderByArr.length; i++) { |
| | | String orderByStr = orderByArr[i]; |
| | | String isAscStr = isAscArr.length == 1 ? isAscArr[0] : isAscArr[i]; |
| | | if ("asc".equals(isAscStr)) { |
| | | list.add(OrderItem.asc(orderByStr)); |
| | | } else if ("desc".equals(isAscStr)) { |
| | | list.add(OrderItem.desc(orderByStr)); |
| | | } else { |
| | | throw new ServiceException("æåºåæ°æè¯¯"); |
| | | } |
| | | } |
| | | return list; |
| | | } |
| | | |
| | | @JsonIgnore |
| | | public Integer getFirstNum() { |
| | | return (pageNum - 1) * pageSize; |
| | | } |
| | | |
| | | public PageQuery(Integer pageSize, Integer pageNum) { |
| | | this.pageSize = pageSize; |
| | | this.pageNum = pageNum; |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.core.page; |
| | | |
| | | import cn.hutool.http.HttpStatus; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import lombok.Data; |
| | | import lombok.NoArgsConstructor; |
| | | |
| | | import java.io.Serial; |
| | | import java.io.Serializable; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * è¡¨æ ¼åé¡µæ°æ®å¯¹è±¡ |
| | | * |
| | | * @author Lion Li |
| | | */ |
| | | @Data |
| | | @NoArgsConstructor |
| | | public class TableDataInfo<T> implements Serializable { |
| | | |
| | | @Serial |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * æ»è®°å½æ° |
| | | */ |
| | | private long total; |
| | | |
| | | /** |
| | | * åè¡¨æ°æ® |
| | | */ |
| | | private List<T> rows; |
| | | |
| | | /** |
| | | * æ¶æ¯ç¶æç |
| | | */ |
| | | private int code; |
| | | |
| | | /** |
| | | * æ¶æ¯å
容 |
| | | */ |
| | | private String msg; |
| | | |
| | | /** |
| | | * å页 |
| | | * |
| | | * @param list åè¡¨æ°æ® |
| | | * @param total æ»è®°å½æ° |
| | | */ |
| | | public TableDataInfo(List<T> list, long total) { |
| | | this.rows = list; |
| | | this.total = total; |
| | | this.code = HttpStatus.HTTP_OK; |
| | | this.msg = "æ¥è¯¢æå"; |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®å页对象æå»ºè¡¨æ ¼åé¡µæ°æ®å¯¹è±¡ |
| | | */ |
| | | public static <T> TableDataInfo<T> build(IPage<T> page) { |
| | | TableDataInfo<T> rspData = new TableDataInfo<>(); |
| | | rspData.setCode(HttpStatus.HTTP_OK); |
| | | rspData.setMsg("æ¥è¯¢æå"); |
| | | rspData.setRows(page.getRecords()); |
| | | rspData.setTotal(page.getTotal()); |
| | | return rspData; |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®æ°æ®å表æå»ºè¡¨æ ¼åé¡µæ°æ®å¯¹è±¡ |
| | | */ |
| | | public static <T> TableDataInfo<T> build(List<T> list) { |
| | | TableDataInfo<T> rspData = new TableDataInfo<>(); |
| | | rspData.setCode(HttpStatus.HTTP_OK); |
| | | rspData.setMsg("æ¥è¯¢æå"); |
| | | rspData.setRows(list); |
| | | rspData.setTotal(list.size()); |
| | | return rspData; |
| | | } |
| | | |
| | | /** |
| | | * æå»ºè¡¨æ ¼åé¡µæ°æ®å¯¹è±¡ |
| | | */ |
| | | public static <T> TableDataInfo<T> build() { |
| | | TableDataInfo<T> rspData = new TableDataInfo<>(); |
| | | rspData.setCode(HttpStatus.HTTP_OK); |
| | | rspData.setMsg("æ¥è¯¢æå"); |
| | | return rspData; |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.enums; |
| | | |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Getter; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | |
| | | |
| | | /** |
| | | * æ°æ®åºç±»å |
| | | * |
| | | * @author Lion Li |
| | | */ |
| | | @Getter |
| | | @AllArgsConstructor |
| | | public enum DataBaseType { |
| | | |
| | | /** |
| | | * MySQL |
| | | */ |
| | | MY_SQL("MySQL"), |
| | | |
| | | /** |
| | | * Oracle |
| | | */ |
| | | ORACLE("Oracle"), |
| | | |
| | | /** |
| | | * PostgreSQL |
| | | */ |
| | | POSTGRE_SQL("PostgreSQL"), |
| | | |
| | | /** |
| | | * SQL Server |
| | | */ |
| | | SQL_SERVER("Microsoft SQL Server"); |
| | | |
| | | /** |
| | | * æ°æ®åºç±»å |
| | | */ |
| | | private final String type; |
| | | |
| | | /** |
| | | * æ ¹æ®æ°æ®åºäº§ååç§°æ¥æ¾å¯¹åºçæ°æ®åºç±»å |
| | | * |
| | | * @param databaseProductName æ°æ®åºäº§ååç§° |
| | | * @return 对åºçæ°æ®åºç±»åæä¸¾å¼ï¼å¦ææªæ¾å°åè¿å null |
| | | */ |
| | | public static DataBaseType find(String databaseProductName) { |
| | | if (StringUtils.isBlank(databaseProductName)) { |
| | | return null; |
| | | } |
| | | for (DataBaseType type : values()) { |
| | | if (type.getType().equals(databaseProductName)) { |
| | | return type; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.enums; |
| | | |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Getter; |
| | | import org.ruoyi.common.core.domain.model.LoginUser; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.helper.DataPermissionHelper; |
| | | |
| | | /** |
| | | * æ°æ®æéç±»åæä¸¾ |
| | | * <p> |
| | | * æ¯æä½¿ç¨ SpEL 模æ¿è¡¨è¾¾å¼å®ä¹ SQL æ¥è¯¢æ¡ä»¶ |
| | | * å
ç½®æ°æ®ï¼ |
| | | * - {@code user}: å½åç»å½ç¨æ·ä¿¡æ¯ï¼åè {@link LoginUser} |
| | | * å
ç½®æå¡ï¼ |
| | | * - {@code sdss}: ç³»ç»æ°æ®æéæå¡ï¼åè ISysDataScopeService |
| | | * å¦éæ©å±æ°æ®ï¼å¯ä»¥éè¿ {@link DataPermissionHelper} è¿è¡æä½ |
| | | * å¦éæ©å±æå¡ï¼å¯ä»¥éè¿ ISysDataScopeService èªè¡ç¼å |
| | | * </p> |
| | | * |
| | | * @author Lion Li |
| | | * @version 3.5.0 |
| | | */ |
| | | @Getter |
| | | @AllArgsConstructor |
| | | public enum DataScopeType { |
| | | |
| | | /** |
| | | * å
¨é¨æ°æ®æé |
| | | */ |
| | | ALL("1", "", ""), |
| | | |
| | | /** |
| | | * èªå®æ°æ®æé |
| | | */ |
| | | CUSTOM("2", " #{#deptName} IN ( #{@sdss.getRoleCustom( #user.roleId )} ) ", " 1 = 0 "), |
| | | |
| | | /** |
| | | * é¨é¨æ°æ®æé |
| | | */ |
| | | DEPT("3", " #{#deptName} = #{#user.deptId} ", " 1 = 0 "), |
| | | |
| | | /** |
| | | * é¨é¨å以䏿°æ®æé |
| | | */ |
| | | DEPT_AND_CHILD("4", " #{#deptName} IN ( #{@sdss.getDeptAndChild( #user.deptId )} )", " 1 = 0 "), |
| | | |
| | | /** |
| | | * ä»
æ¬äººæ°æ®æé |
| | | */ |
| | | SELF("5", " #{#userName} = #{#user.userId} ", " 1 = 0 "), |
| | | |
| | | /** |
| | | * é¨é¨å以䏿æ¬äººæ°æ®æé |
| | | */ |
| | | DEPT_AND_CHILD_OR_SELF("6", " #{#deptName} IN ( #{@sdss.getDeptAndChild( #user.deptId )} ) OR #{#userName} = #{#user.userId} ", " 1 = 0 "); |
| | | |
| | | private final String code; |
| | | |
| | | /** |
| | | * SpEL 模æ¿è¡¨è¾¾å¼ï¼ç¨äºæå»º SQL æ¥è¯¢æ¡ä»¶ |
| | | */ |
| | | private final String sqlTemplate; |
| | | |
| | | /** |
| | | * 妿䏿»¡è¶³ {@code sqlTemplate} çæ¡ä»¶ï¼åä½¿ç¨æ¤é»è®¤ SQL è¡¨è¾¾å¼ |
| | | */ |
| | | private final String elseSql; |
| | | |
| | | /** |
| | | * æ ¹æ®æä¸¾ä»£ç æ¥æ¾å¯¹åºçæä¸¾å¼ |
| | | * |
| | | * @param code æä¸¾ä»£ç |
| | | * @return 对åºçæä¸¾å¼ï¼å¦ææªæ¾å°åè¿å null |
| | | */ |
| | | public static DataScopeType findCode(String code) { |
| | | if (StringUtils.isBlank(code)) { |
| | | return null; |
| | | } |
| | | for (DataScopeType type : values()) { |
| | | if (type.getCode().equals(code)) { |
| | | return type; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.handler; |
| | | |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import cn.hutool.http.HttpStatus; |
| | | import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.ibatis.reflection.MetaObject; |
| | | import org.ruoyi.common.core.domain.model.LoginUser; |
| | | import org.ruoyi.common.core.exception.ServiceException; |
| | | import org.ruoyi.common.core.utils.ObjectUtils; |
| | | import org.ruoyi.common.satoken.utils.LoginHelper; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | |
| | | |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * MP注å
¥å¤çå¨ |
| | | * |
| | | * @author Lion Li |
| | | * @date 2021/4/25 |
| | | */ |
| | | @Slf4j |
| | | public class InjectionMetaObjectHandler implements MetaObjectHandler { |
| | | |
| | | /** |
| | | * æå
¥å¡«å
æ¹æ³ï¼ç¨äºå¨æå
¥æ°æ®æ¶èªå¨å¡«å
å®ä½å¯¹è±¡ä¸çå建æ¶é´ãæ´æ°æ¶é´ãåå»ºäººãæ´æ°äººçä¿¡æ¯ |
| | | * |
| | | * @param metaObject å
对象ï¼ç¨äºè·ååå§å¯¹è±¡å¹¶è¿è¡å¡«å
|
| | | */ |
| | | @Override |
| | | public void insertFill(MetaObject metaObject) { |
| | | try { |
| | | if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity baseEntity) { |
| | | // è·åå½åæ¶é´ä½ä¸ºå建æ¶é´åæ´æ°æ¶é´ï¼å¦æå建æ¶é´ä¸ä¸ºç©ºï¼å使ç¨å建æ¶é´ï¼å¦å使ç¨å½åæ¶é´ |
| | | Date current = ObjectUtils.notNull(baseEntity.getCreateTime(), new Date()); |
| | | baseEntity.setCreateTime(current); |
| | | baseEntity.setUpdateTime(current); |
| | | |
| | | // 妿å建人为空ï¼åå¡«å
å½åç»å½ç¨æ·çä¿¡æ¯ |
| | | if (ObjectUtil.isNull(baseEntity.getCreateBy())) { |
| | | LoginUser loginUser = getLoginUser(); |
| | | if (ObjectUtil.isNotNull(loginUser)) { |
| | | Long userId = loginUser.getUserId(); |
| | | // å¡«å
åå»ºäººãæ´æ°äººåå建é¨é¨ä¿¡æ¯ |
| | | baseEntity.setCreateBy(userId); |
| | | baseEntity.setUpdateBy(userId); |
| | | baseEntity.setCreateDept(ObjectUtils.notNull(baseEntity.getCreateDept(), loginUser.getDeptId())); |
| | | } |
| | | } |
| | | } else { |
| | | Date date = new Date(); |
| | | this.strictInsertFill(metaObject, "createTime", Date.class, date); |
| | | this.strictInsertFill(metaObject, "updateTime", Date.class, date); |
| | | } |
| | | } catch (Exception e) { |
| | | throw new ServiceException("èªå¨æ³¨å
¥å¼å¸¸ => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ´æ°å¡«å
æ¹æ³ï¼ç¨äºå¨æ´æ°æ°æ®æ¶èªå¨å¡«å
å®ä½å¯¹è±¡ä¸çæ´æ°æ¶é´åæ´æ°äººä¿¡æ¯ |
| | | * |
| | | * @param metaObject å
对象ï¼ç¨äºè·ååå§å¯¹è±¡å¹¶è¿è¡å¡«å
|
| | | */ |
| | | @Override |
| | | public void updateFill(MetaObject metaObject) { |
| | | try { |
| | | if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity baseEntity) { |
| | | // è·åå½åæ¶é´ä½ä¸ºæ´æ°æ¶é´ï¼æ 论åå§å¯¹è±¡ä¸çæ´æ°æ¶é´æ¯å¦ä¸ºç©ºé½å¡«å
|
| | | Date current = new Date(); |
| | | baseEntity.setUpdateTime(current); |
| | | |
| | | // è·åå½åç»å½ç¨æ·çIDï¼å¹¶å¡«å
æ´æ°äººä¿¡æ¯ |
| | | Long userId = LoginHelper.getUserId(); |
| | | if (ObjectUtil.isNotNull(userId)) { |
| | | baseEntity.setUpdateBy(userId); |
| | | } |
| | | } else { |
| | | this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); |
| | | } |
| | | } catch (Exception e) { |
| | | throw new ServiceException("èªå¨æ³¨å
¥å¼å¸¸ => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è·åå½åç»å½ç¨æ·ä¿¡æ¯ |
| | | * |
| | | * @return å½åç»å½ç¨æ·çä¿¡æ¯ï¼å¦æç¨æ·æªç»å½åè¿å null |
| | | */ |
| | | private LoginUser getLoginUser() { |
| | | LoginUser loginUser; |
| | | try { |
| | | loginUser = LoginHelper.getLoginUser(); |
| | | } catch (Exception e) { |
| | | log.warn("èªå¨æ³¨å
¥è¦å => ç¨æ·æªç»å½"); |
| | | return null; |
| | | } |
| | | return loginUser; |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.handler; |
| | | |
| | | import jakarta.servlet.http.HttpServletRequest; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | import org.mybatis.spring.MyBatisSystemException; |
| | | import org.ruoyi.common.core.domain.R; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.springframework.dao.DuplicateKeyException; |
| | | import org.springframework.web.bind.annotation.ExceptionHandler; |
| | | import org.springframework.web.bind.annotation.RestControllerAdvice; |
| | | |
| | | /** |
| | | * Mybatiså¼å¸¸å¤çå¨ |
| | | * |
| | | * @author Lion Li |
| | | */ |
| | | @Slf4j |
| | | @RestControllerAdvice |
| | | public class MybatisExceptionHandler { |
| | | |
| | | /** |
| | | * 䏻鮿UNIQUEç´¢å¼ï¼æ°æ®éå¤å¼å¸¸ |
| | | */ |
| | | @ExceptionHandler(DuplicateKeyException.class) |
| | | public R<Void> handleDuplicateKeyException(DuplicateKeyException e, HttpServletRequest request) { |
| | | String requestURI = request.getRequestURI(); |
| | | log.error("请æ±å°å'{}',æ°æ®åºä¸å·²åå¨è®°å½'{}'", requestURI, e.getMessage()); |
| | | return R.fail("æ°æ®åºä¸å·²åå¨è¯¥è®°å½ï¼è¯·è系管çå确认"); |
| | | } |
| | | |
| | | /** |
| | | * Mybatisç³»ç»å¼å¸¸ éç¨å¤ç |
| | | */ |
| | | @ExceptionHandler(MyBatisSystemException.class) |
| | | public R<Void> handleCannotFindDataSourceException(MyBatisSystemException e, HttpServletRequest request) { |
| | | String requestURI = request.getRequestURI(); |
| | | String message = e.getMessage(); |
| | | if (StringUtils.contains("CannotFindDataSourceException", message)) { |
| | | log.error("请æ±å°å'{}', æªæ¾å°æ°æ®æº", requestURI); |
| | | return R.fail("æªæ¾å°æ°æ®æºï¼è¯·è系管çå确认"); |
| | | } |
| | | log.error("请æ±å°å'{}', Mybatisç³»ç»å¼å¸¸", requestURI, e); |
| | | return R.fail(message); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.handler; |
| | | |
| | | import cn.hutool.core.annotation.AnnotationUtil; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import net.sf.jsqlparser.JSQLParserException; |
| | | import net.sf.jsqlparser.expression.Expression; |
| | | import net.sf.jsqlparser.expression.operators.conditional.AndExpression; |
| | | import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList; |
| | | import net.sf.jsqlparser.parser.CCJSqlParserUtil; |
| | | import org.apache.ibatis.io.Resources; |
| | | |
| | | import org.ruoyi.annotation.DataColumn; |
| | | import org.ruoyi.annotation.DataPermission; |
| | | import org.ruoyi.common.core.domain.dto.RoleDTO; |
| | | import org.ruoyi.common.core.domain.model.LoginUser; |
| | | import org.ruoyi.common.core.exception.ServiceException; |
| | | import org.ruoyi.common.core.utils.SpringUtils; |
| | | import org.ruoyi.common.core.utils.StreamUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.satoken.utils.LoginHelper; |
| | | import org.ruoyi.enums.DataScopeType; |
| | | import org.ruoyi.helper.DataPermissionHelper; |
| | | |
| | | import org.springframework.context.ConfigurableApplicationContext; |
| | | import org.springframework.context.expression.BeanFactoryResolver; |
| | | import org.springframework.core.io.Resource; |
| | | import org.springframework.core.io.support.PathMatchingResourcePatternResolver; |
| | | import org.springframework.core.io.support.ResourcePatternResolver; |
| | | import org.springframework.core.type.ClassMetadata; |
| | | import org.springframework.core.type.classreading.CachingMetadataReaderFactory; |
| | | import org.springframework.expression.*; |
| | | import org.springframework.expression.common.TemplateParserContext; |
| | | import org.springframework.expression.spel.standard.SpelExpressionParser; |
| | | import org.springframework.expression.spel.support.StandardEvaluationContext; |
| | | import org.springframework.util.ClassUtils; |
| | | |
| | | import java.lang.reflect.Method; |
| | | import java.util.*; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | import java.util.function.Function; |
| | | |
| | | /** |
| | | * æ°æ®æéè¿æ»¤ |
| | | * |
| | | * @author Lion Li |
| | | * @version 3.5.0 |
| | | */ |
| | | @Slf4j |
| | | public class PlusDataPermissionHandler { |
| | | |
| | | /** |
| | | * ç±»åç§°ä¸æ³¨è§£çæ å°å
³ç³»ç¼å(ç±äºaopæ æ³æ¦æªmybatisæ¥å£ç±»ä¸ç注解 åªè½éè¿å¯å¨é¢æ«æçæ¹å¼è¿è¡) |
| | | */ |
| | | private final Map<String, DataPermission> dataPermissionCacheMap = new ConcurrentHashMap<>(); |
| | | |
| | | /** |
| | | * spel è§£æå¨ |
| | | */ |
| | | private final ExpressionParser parser = new SpelExpressionParser(); |
| | | private final ParserContext parserContext = new TemplateParserContext(); |
| | | /** |
| | | * beanè§£æå¨ ç¨äºå¤ç spel 表达å¼ä¸å¯¹ bean çè°ç¨ |
| | | */ |
| | | private final BeanResolver beanResolver = new BeanFactoryResolver(SpringUtils.getBeanFactory()); |
| | | |
| | | /** |
| | | * æé æ¹æ³ï¼æ«ææå®å
ä¸ç Mapper 类并åå§åç¼å |
| | | * |
| | | * @param mapperPackage Mapper ç±»æå¨çå
è·¯å¾ |
| | | */ |
| | | public PlusDataPermissionHandler(String mapperPackage) { |
| | | scanMapperClasses(mapperPackage); |
| | | } |
| | | |
| | | /** |
| | | * è·åæ°æ®è¿æ»¤æ¡ä»¶ç SQL çæ®µ |
| | | * |
| | | * @param where åå§çæ¥è¯¢æ¡ä»¶è¡¨è¾¾å¼ |
| | | * @param mappedStatementId Mapper æ¹æ³ç ID |
| | | * @param isSelect æ¯å¦ä¸ºæ¥è¯¢è¯å¥ |
| | | * @return æ°æ®è¿æ»¤æ¡ä»¶ç SQL çæ®µ |
| | | */ |
| | | public Expression getSqlSegment(Expression where, String mappedStatementId, boolean isSelect) { |
| | | try { |
| | | // è·åæ°æ®æéé
ç½® |
| | | DataPermission dataPermission = getDataPermission(mappedStatementId); |
| | | // è·åå½åç»å½ç¨æ·ä¿¡æ¯ |
| | | LoginUser currentUser = DataPermissionHelper.getVariable("user"); |
| | | if (ObjectUtil.isNull(currentUser)) { |
| | | currentUser = LoginHelper.getLoginUser(); |
| | | DataPermissionHelper.setVariable("user", currentUser); |
| | | } |
| | | // 妿æ¯è¶
级管çåæç§æ·ç®¡çåï¼åä¸è¿æ»¤æ°æ® |
| | | if (LoginHelper.isSuperAdmin() || LoginHelper.isTenantAdmin()) { |
| | | return where; |
| | | } |
| | | // æé æ°æ®è¿æ»¤æ¡ä»¶ç SQL çæ®µ |
| | | String dataFilterSql = buildDataFilter(dataPermission, isSelect); |
| | | if (StringUtils.isBlank(dataFilterSql)) { |
| | | return where; |
| | | } |
| | | Expression expression = CCJSqlParserUtil.parseExpression(dataFilterSql); |
| | | // æ°æ®æé使ç¨åç¬çæ¬å· 鲿¢ä¸å
¶ä»æ¡ä»¶å²çª |
| | | ParenthesedExpressionList<Expression> parenthesis = new ParenthesedExpressionList<>(expression); |
| | | if (ObjectUtil.isNotNull(where)) { |
| | | return new AndExpression(where, parenthesis); |
| | | } else { |
| | | return parenthesis; |
| | | } |
| | | } catch (JSQLParserException e) { |
| | | throw new ServiceException("æ°æ®æéè§£æå¼å¸¸ => " + e.getMessage()); |
| | | } finally { |
| | | DataPermissionHelper.removePermission(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æå»ºæ°æ®è¿æ»¤æ¡ä»¶ç SQL è¯å¥ |
| | | * |
| | | * @param dataPermission æ°æ®æé注解 |
| | | * @param isSelect æ å¿å½åæä½æ¯å¦ä¸ºæ¥è¯¢æä½ï¼æ¥è¯¢æä½åæ´æ°æå 餿ä½å¨å¤çè¿æ»¤æ¡ä»¶æ¶ä¼æä¸åçå¤çæ¹å¼ |
| | | * @return æå»ºçæ°æ®è¿æ»¤æ¡ä»¶ç SQL è¯å¥ |
| | | * @throws ServiceException 妿è§è²çæ°æ®èå´å¼å¸¸æè
key ä¸ value çé¿åº¦ä¸å¹é
ï¼åæåº ServiceException å¼å¸¸ |
| | | */ |
| | | private String buildDataFilter(DataPermission dataPermission, boolean isSelect) { |
| | | // æ´æ°æå é¤éæ»¡è¶³æææ¡ä»¶ |
| | | String joinStr = isSelect ? " OR " : " AND "; |
| | | if (StringUtils.isNotBlank(dataPermission.joinStr())) { |
| | | joinStr = " " + dataPermission.joinStr() + " "; |
| | | } |
| | | LoginUser user = DataPermissionHelper.getVariable("user"); |
| | | Object defaultValue = "-1"; |
| | | NullSafeStandardEvaluationContext context = new NullSafeStandardEvaluationContext(defaultValue); |
| | | context.addPropertyAccessor(new NullSafePropertyAccessor(context.getPropertyAccessors().get(0), defaultValue)); |
| | | context.setBeanResolver(beanResolver); |
| | | DataPermissionHelper.getContext().forEach(context::setVariable); |
| | | Set<String> conditions = new HashSet<>(); |
| | | // ä¼å
设置åé |
| | | List<String> keys = new ArrayList<>(); |
| | | Map<DataColumn, Boolean> ignoreMap = new HashMap<>(); |
| | | for (DataColumn dataColumn : dataPermission.value()) { |
| | | if (dataColumn.key().length != dataColumn.value().length) { |
| | | throw new ServiceException("è§è²æ°æ®èå´å¼å¸¸ => keyä¸valueé¿åº¦ä¸å¹é
"); |
| | | } |
| | | // å
å«æéæ è¯ç¬¦ è¿ç´æ¥è·³è¿ |
| | | if (StringUtils.isNotBlank(dataColumn.permission()) && |
| | | CollUtil.contains(user.getMenuPermission(), dataColumn.permission()) |
| | | ) { |
| | | ignoreMap.put(dataColumn, Boolean.TRUE); |
| | | continue; |
| | | } |
| | | // 设置注解åé key 为表达å¼åé value 为åéå¼ |
| | | for (int i = 0; i < dataColumn.key().length; i++) { |
| | | context.setVariable(dataColumn.key()[i], dataColumn.value()[i]); |
| | | } |
| | | keys.addAll(Arrays.stream(dataColumn.key()).map(key -> "#" + key).toList()); |
| | | } |
| | | |
| | | for (RoleDTO role : user.getRoles()) { |
| | | user.setRoleId(role.getRoleId()); |
| | | // è·åè§è²æéæ³å |
| | | DataScopeType type = DataScopeType.findCode(role.getDataScope()); |
| | | if (ObjectUtil.isNull(type)) { |
| | | throw new ServiceException("è§è²æ°æ®èå´å¼å¸¸ => " + role.getDataScope()); |
| | | } |
| | | // å
¨é¨æ°æ®æéç´æ¥è¿å |
| | | if (type == DataScopeType.ALL) { |
| | | return StringUtils.EMPTY; |
| | | } |
| | | boolean isSuccess = false; |
| | | for (DataColumn dataColumn : dataPermission.value()) { |
| | | // å
å«æéæ è¯ç¬¦ è¿ç´æ¥è·³è¿ |
| | | if (ignoreMap.containsKey(dataColumn)) { |
| | | // ä¿®å¤å¤è§è²ä¸æéæ è¯ç¬¦å
±ç¨é®é¢ https://gitee.com/dromara/RuoYi-Vue-Plus/issues/IB4CS4 |
| | | conditions.add(joinStr + " 1 = 1 "); |
| | | isSuccess = true; |
| | | continue; |
| | | } |
| | | // ä¸å
å« key åé åä¸å¤ç |
| | | if (!StringUtils.containsAny(type.getSqlTemplate(), keys.toArray(String[]::new))) { |
| | | continue; |
| | | } |
| | | // å½åæ³¨è§£ä¸æ»¡è¶³æ¨¡æ¿ ä¸å¤ç |
| | | if (!StringUtils.containsAny(type.getSqlTemplate(), dataColumn.key())) { |
| | | continue; |
| | | } |
| | | // å¿½ç¥æ°æ®æé 鲿¢spel表达å¼å
æå
¶ä»sqlæ¥è¯¢å¯¼è´æ»å¾ªç¯è°ç¨ |
| | | String sql = DataPermissionHelper.ignore(() -> |
| | | parser.parseExpression(type.getSqlTemplate(), parserContext).getValue(context, String.class) |
| | | ); |
| | | // è§£æsql模æ¿å¹¶å¡«å
|
| | | conditions.add(joinStr + sql); |
| | | isSuccess = true; |
| | | } |
| | | // æªå¤çæååå¡«å
å
åºæ¹æ¡ |
| | | if (!isSuccess && StringUtils.isNotBlank(type.getElseSql())) { |
| | | conditions.add(joinStr + type.getElseSql()); |
| | | } |
| | | } |
| | | |
| | | if (CollUtil.isNotEmpty(conditions)) { |
| | | String sql = StreamUtils.join(conditions, Function.identity(), ""); |
| | | return sql.substring(joinStr.length()); |
| | | } |
| | | return StringUtils.EMPTY; |
| | | } |
| | | |
| | | /** |
| | | * æ«ææå®å
ä¸ç Mapper ç±»ï¼å¹¶æ¥æ¾å
¶ä¸å¸¦æç¹å®æ³¨è§£çæ¹æ³æç±» |
| | | * |
| | | * @param mapperPackage Mapper ç±»æå¨çå
è·¯å¾ |
| | | */ |
| | | private void scanMapperClasses(String mapperPackage) { |
| | | // åå»ºèµæºè§£æå¨åå
æ°æ®è¯»åå·¥å |
| | | PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); |
| | | CachingMetadataReaderFactory factory = new CachingMetadataReaderFactory(); |
| | | // å° Mapper å
è·¯å¾æåé符æå为æ°ç» |
| | | String[] packagePatternArray = StringUtils.splitPreserveAllTokens(mapperPackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS); |
| | | String classpath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX; |
| | | try { |
| | | for (String packagePattern : packagePatternArray) { |
| | | // å°å
è·¯å¾è½¬æ¢ä¸ºèµæºè·¯å¾ |
| | | String path = ClassUtils.convertClassNameToResourcePath(packagePattern); |
| | | // è·åæå®è·¯å¾ä¸çææ .class æä»¶èµæº |
| | | Resource[] resources = resolver.getResources(classpath + path + "/*.class"); |
| | | for (Resource resource : resources) { |
| | | // è·åèµæºçç±»å
æ°æ® |
| | | ClassMetadata classMetadata = factory.getMetadataReader(resource).getClassMetadata(); |
| | | // è·åèµæºå¯¹åºç类对象 |
| | | Class<?> clazz = Resources.classForName(classMetadata.getClassName()); |
| | | // æ¥æ¾ç±»ä¸çç¹å®æ³¨è§£ |
| | | findAnnotation(clazz); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("åå§åæ°æ®å®å
¨ç¼åæ¶åºé:{}", e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 卿å®çç±»ä¸æ¥æ¾ç¹å®ç注解 DataPermissionï¼å¹¶å°å¸¦æè¿ä¸ªæ³¨è§£çæ¹æ³æç±»åå¨å° dataPermissionCacheMap ä¸ |
| | | * |
| | | * @param clazz è¦æ¥æ¾çç±» |
| | | */ |
| | | private void findAnnotation(Class<?> clazz) { |
| | | DataPermission dataPermission; |
| | | for (Method method : clazz.getMethods()) { |
| | | if (method.isDefault() || method.isVarArgs()) { |
| | | continue; |
| | | } |
| | | String mappedStatementId = clazz.getName() + "." + method.getName(); |
| | | if (AnnotationUtil.hasAnnotation(method, DataPermission.class)) { |
| | | dataPermission = AnnotationUtil.getAnnotation(method, DataPermission.class); |
| | | dataPermissionCacheMap.put(mappedStatementId, dataPermission); |
| | | } |
| | | } |
| | | if (AnnotationUtil.hasAnnotation(clazz, DataPermission.class)) { |
| | | dataPermission = AnnotationUtil.getAnnotation(clazz, DataPermission.class); |
| | | dataPermissionCacheMap.put(clazz.getName(), dataPermission); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®æ å°è¯å¥ ID æç±»åè·å对åºç DataPermission 注解对象 |
| | | * |
| | | * @param mapperId æ å°è¯å¥ ID |
| | | * @return DataPermission 注解对象ï¼å¦æä¸åå¨åè¿å null |
| | | */ |
| | | public DataPermission getDataPermission(String mapperId) { |
| | | // æ£æ¥ä¸ä¸æä¸æ¯å¦å
嫿 å°è¯å¥ ID 对åºç DataPermission 注解对象 |
| | | if (DataPermissionHelper.getPermission() != null) { |
| | | return DataPermissionHelper.getPermission(); |
| | | } |
| | | // æ£æ¥ç¼å䏿¯å¦å
嫿 å°è¯å¥ ID 对åºç DataPermission 注解对象 |
| | | if (dataPermissionCacheMap.containsKey(mapperId)) { |
| | | return dataPermissionCacheMap.get(mapperId); |
| | | } |
| | | // 妿ç¼åä¸ä¸å
嫿 å°è¯å¥ ID 对åºç DataPermission 注解对象ï¼åå°è¯ä½¿ç¨ç±»åä½ä¸ºé®æ¥æ¾ |
| | | String clazzName = mapperId.substring(0, mapperId.lastIndexOf(".")); |
| | | if (dataPermissionCacheMap.containsKey(clazzName)) { |
| | | return dataPermissionCacheMap.get(clazzName); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * æ£æ¥ç»å®çæ å°è¯å¥ ID æ¯å¦ææï¼å³æ¯å¦è½å¤æ¾å°å¯¹åºç DataPermission 注解对象 |
| | | * |
| | | * @param mapperId æ å°è¯å¥ ID |
| | | * @return 妿æ¾å°å¯¹åºç DataPermission 注解对象ï¼åè¿å falseï¼å¦åè¿å true |
| | | */ |
| | | public boolean invalid(String mapperId) { |
| | | return getDataPermission(mapperId) == null; |
| | | } |
| | | |
| | | /** |
| | | * 对æænullåéæ¾ä¸å°çåéè¿åé»è®¤å¼ |
| | | */ |
| | | @AllArgsConstructor |
| | | private static class NullSafeStandardEvaluationContext extends StandardEvaluationContext { |
| | | |
| | | private final Object defaultValue; |
| | | |
| | | @Override |
| | | public Object lookupVariable(String name) { |
| | | Object obj = super.lookupVariable(name); |
| | | // å¦æè¯»åå°ç弿¯ nullï¼åè¿åé»è®¤å¼ |
| | | if (obj == null) { |
| | | return defaultValue; |
| | | } |
| | | return obj; |
| | | } |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 对æænullåéæ¾ä¸å°çåéè¿åé»è®¤å¼ å§ææ¨¡å¼ å°ä¸éè¦å¤ççæ¹æ³å§æç»åå¤çå¨ |
| | | */ |
| | | @AllArgsConstructor |
| | | private static class NullSafePropertyAccessor implements PropertyAccessor { |
| | | |
| | | private final PropertyAccessor delegate; |
| | | private final Object defaultValue; |
| | | |
| | | @Override |
| | | public Class<?>[] getSpecificTargetClasses() { |
| | | return delegate.getSpecificTargetClasses(); |
| | | } |
| | | |
| | | @Override |
| | | public boolean canRead(EvaluationContext context, Object target, String name) throws AccessException { |
| | | return delegate.canRead(context, target, name); |
| | | } |
| | | |
| | | @Override |
| | | public TypedValue read(EvaluationContext context, Object target, String name) throws AccessException { |
| | | TypedValue value = delegate.read(context, target, name); |
| | | // å¦æè¯»åå°ç弿¯ nullï¼åè¿åé»è®¤å¼ |
| | | if (value.getValue() == null) { |
| | | return new TypedValue(defaultValue); |
| | | } |
| | | return value; |
| | | } |
| | | |
| | | @Override |
| | | public boolean canWrite(EvaluationContext context, Object target, String name) throws AccessException { |
| | | return delegate.canWrite(context, target, name); |
| | | } |
| | | |
| | | @Override |
| | | public void write(EvaluationContext context, Object target, String name, Object newValue) throws AccessException { |
| | | delegate.write(context, target, name, newValue); |
| | | } |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.handler; |
| | | |
| | | import cn.hutool.core.convert.Convert; |
| | | import com.baomidou.mybatisplus.core.handlers.PostInitTableInfoHandler; |
| | | import com.baomidou.mybatisplus.core.metadata.TableInfo; |
| | | import org.apache.ibatis.session.Configuration; |
| | | import org.ruoyi.common.core.utils.SpringUtils; |
| | | import org.ruoyi.common.core.utils.reflect.ReflectUtils; |
| | | |
| | | |
| | | /** |
| | | * ä¿®æ¹è¡¨ä¿¡æ¯åå§åæ¹å¼ |
| | | * ç®åç¨äºå
¨å±ä¿®æ¹æ¯å¦ä½¿ç¨é»è¾å é¤ |
| | | * |
| | | * @author Lion Li |
| | | */ |
| | | public class PlusPostInitTableInfoHandler implements PostInitTableInfoHandler { |
| | | |
| | | @Override |
| | | public void postTableInfo(TableInfo tableInfo, Configuration configuration) { |
| | | String flag = SpringUtils.getProperty("mybatis-plus.enableLogicDelete", "true"); |
| | | // åªæå
³éæ¶ ç»ä¸è®¾ç½®false 为trueæ¶mpèªå¨å¤æä¸å¤ç |
| | | if (!Convert.toBool(flag)) { |
| | | ReflectUtils.setFieldValue(tableInfo, "withLogicDelete", false); |
| | | } |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.helper; |
| | | |
| | | import cn.hutool.core.convert.Convert; |
| | | import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; |
| | | import lombok.AccessLevel; |
| | | import lombok.NoArgsConstructor; |
| | | |
| | | import org.ruoyi.common.core.exception.ServiceException; |
| | | import org.ruoyi.common.core.utils.SpringUtils; |
| | | import org.ruoyi.enums.DataBaseType; |
| | | |
| | | import javax.sql.DataSource; |
| | | import java.sql.Connection; |
| | | import java.sql.DatabaseMetaData; |
| | | import java.sql.SQLException; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æ°æ®åºå©æ |
| | | * |
| | | * @author Lion Li |
| | | */ |
| | | @NoArgsConstructor(access = AccessLevel.PRIVATE) |
| | | public class DataBaseHelper { |
| | | |
| | | private static final DynamicRoutingDataSource DS = SpringUtils.getBean(DynamicRoutingDataSource.class); |
| | | |
| | | /** |
| | | * è·åå½åæ°æ®åºç±»å |
| | | */ |
| | | public static DataBaseType getDataBaseType() { |
| | | DataSource dataSource = DS.determineDataSource(); |
| | | try (Connection conn = dataSource.getConnection()) { |
| | | DatabaseMetaData metaData = conn.getMetaData(); |
| | | String databaseProductName = metaData.getDatabaseProductName(); |
| | | return DataBaseType.find(databaseProductName); |
| | | } catch (SQLException e) { |
| | | throw new ServiceException(e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | public static boolean isMySql() { |
| | | return DataBaseType.MY_SQL == getDataBaseType(); |
| | | } |
| | | |
| | | public static boolean isOracle() { |
| | | return DataBaseType.ORACLE == getDataBaseType(); |
| | | } |
| | | |
| | | public static boolean isPostgerSql() { |
| | | return DataBaseType.POSTGRE_SQL == getDataBaseType(); |
| | | } |
| | | |
| | | public static boolean isSqlServer() { |
| | | return DataBaseType.SQL_SERVER == getDataBaseType(); |
| | | } |
| | | |
| | | public static String findInSet(Object var1, String var2) { |
| | | DataBaseType dataBasyType = getDataBaseType(); |
| | | String var = Convert.toStr(var1); |
| | | if (dataBasyType == DataBaseType.SQL_SERVER) { |
| | | // charindex(',100,' , ',0,100,101,') <> 0 |
| | | return "charindex(',%s,' , ','+%s+',') <> 0".formatted(var, var2); |
| | | } else if (dataBasyType == DataBaseType.POSTGRE_SQL) { |
| | | // (select strpos(',0,100,101,' , ',100,')) <> 0 |
| | | return "(select strpos(','||%s||',' , ',%s,')) <> 0".formatted(var2, var); |
| | | } else if (dataBasyType == DataBaseType.ORACLE) { |
| | | // instr(',0,100,101,' , ',100,') <> 0 |
| | | return "instr(','||%s||',' , ',%s,') <> 0".formatted(var2, var); |
| | | } |
| | | // find_in_set(100 , '0,100,101') |
| | | return "find_in_set('%s' , %s) <> 0".formatted(var, var2); |
| | | } |
| | | |
| | | /** |
| | | * è·åå½åå è½½çæ°æ®åºå |
| | | */ |
| | | public static List<String> getDataSourceNameList() { |
| | | return new ArrayList<>(DS.getDataSources().keySet()); |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.helper; |
| | | |
| | | import cn.dev33.satoken.context.SaHolder; |
| | | import cn.dev33.satoken.context.model.SaStorage; |
| | | import cn.hutool.core.collection.CollectionUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy; |
| | | import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; |
| | | import lombok.AccessLevel; |
| | | import lombok.NoArgsConstructor; |
| | | import org.ruoyi.annotation.DataPermission; |
| | | import org.ruoyi.common.core.utils.reflect.ReflectUtils; |
| | | |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | import java.util.Stack; |
| | | import java.util.function.Supplier; |
| | | |
| | | /** |
| | | * æ°æ®æé婿 |
| | | * |
| | | * @author Lion Li |
| | | * @version 3.5.0 |
| | | */ |
| | | @NoArgsConstructor(access = AccessLevel.PRIVATE) |
| | | @SuppressWarnings("unchecked cast") |
| | | public class DataPermissionHelper { |
| | | |
| | | private static final String DATA_PERMISSION_KEY = "data:permission"; |
| | | |
| | | private static final ThreadLocal<Stack<Integer>> REENTRANT_IGNORE = ThreadLocal.withInitial(Stack::new); |
| | | |
| | | private static final ThreadLocal<DataPermission> PERMISSION_CACHE = new ThreadLocal<>(); |
| | | |
| | | /** |
| | | * è·åå½åæ§è¡mapperæé注解 |
| | | * |
| | | * @return è¿åå½åæ§è¡mapperæé注解 |
| | | */ |
| | | public static DataPermission getPermission() { |
| | | return PERMISSION_CACHE.get(); |
| | | } |
| | | |
| | | /** |
| | | * 设置å½åæ§è¡mapperæé注解 |
| | | * |
| | | * @param dataPermission æ°æ®æé注解 |
| | | */ |
| | | public static void setPermission(DataPermission dataPermission) { |
| | | PERMISSION_CACHE.set(dataPermission); |
| | | } |
| | | |
| | | /** |
| | | * å é¤å½åæ§è¡mapperæé注解 |
| | | */ |
| | | public static void removePermission() { |
| | | PERMISSION_CACHE.remove(); |
| | | } |
| | | |
| | | /** |
| | | * ä»ä¸ä¸æä¸è·åæå®é®çåéå¼ï¼å¹¶å°å
¶è½¬æ¢ä¸ºæå®çç±»å |
| | | * |
| | | * @param key åéçé® |
| | | * @param <T> åéå¼çç±»å |
| | | * @return æå®é®çåéå¼ï¼å¦æä¸åå¨åè¿å null |
| | | */ |
| | | public static <T> T getVariable(String key) { |
| | | Map<String, Object> context = getContext(); |
| | | return (T) context.get(key); |
| | | } |
| | | |
| | | /** |
| | | * åä¸ä¸æä¸è®¾ç½®æå®é®çåéå¼ |
| | | * |
| | | * @param key è¦è®¾ç½®çåéçé® |
| | | * @param value è¦è®¾ç½®çåéå¼ |
| | | */ |
| | | public static void setVariable(String key, Object value) { |
| | | Map<String, Object> context = getContext(); |
| | | context.put(key, value); |
| | | } |
| | | |
| | | /** |
| | | * è·åæ°æ®æéä¸ä¸æ |
| | | * |
| | | * @return åå¨å¨SaStorageä¸çMap对象ï¼ç¨äºå卿°æ®æéç¸å
³çä¸ä¸æä¿¡æ¯ |
| | | * @throws NullPointerException å¦ææ°æ®æéä¸ä¸æç±»åå¼å¸¸ï¼åæåºNullPointerException |
| | | */ |
| | | public static Map<String, Object> getContext() { |
| | | SaStorage saStorage = SaHolder.getStorage(); |
| | | Object attribute = saStorage.get(DATA_PERMISSION_KEY); |
| | | if (ObjectUtil.isNull(attribute)) { |
| | | saStorage.set(DATA_PERMISSION_KEY, new HashMap<>()); |
| | | attribute = saStorage.get(DATA_PERMISSION_KEY); |
| | | } |
| | | if (attribute instanceof Map map) { |
| | | return map; |
| | | } |
| | | throw new NullPointerException("data permission context type exception"); |
| | | } |
| | | |
| | | private static IgnoreStrategy getIgnoreStrategy() { |
| | | Object ignoreStrategyLocal = ReflectUtils.getStaticFieldValue(ReflectUtils.getField(InterceptorIgnoreHelper.class, "IGNORE_STRATEGY_LOCAL")); |
| | | if (ignoreStrategyLocal instanceof ThreadLocal<?> IGNORE_STRATEGY_LOCAL) { |
| | | if (IGNORE_STRATEGY_LOCAL.get() instanceof IgnoreStrategy ignoreStrategy) { |
| | | return ignoreStrategy; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * å¼å¯å¿½ç¥æ°æ®æé(å¼å¯åéæå¨è°ç¨ {@link #disableIgnore()} å
³é) |
| | | */ |
| | | public static void enableIgnore() { |
| | | IgnoreStrategy ignoreStrategy = getIgnoreStrategy(); |
| | | if (ObjectUtil.isNull(ignoreStrategy)) { |
| | | InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().dataPermission(true).build()); |
| | | } else { |
| | | ignoreStrategy.setDataPermission(true); |
| | | } |
| | | Stack<Integer> reentrantStack = REENTRANT_IGNORE.get(); |
| | | reentrantStack.push(reentrantStack.size() + 1); |
| | | } |
| | | |
| | | /** |
| | | * å
³éå¿½ç¥æ°æ®æé |
| | | */ |
| | | public static void disableIgnore() { |
| | | IgnoreStrategy ignoreStrategy = getIgnoreStrategy(); |
| | | if (ObjectUtil.isNotNull(ignoreStrategy)) { |
| | | boolean noOtherIgnoreStrategy = !Boolean.TRUE.equals(ignoreStrategy.getDynamicTableName()) |
| | | && !Boolean.TRUE.equals(ignoreStrategy.getBlockAttack()) |
| | | && !Boolean.TRUE.equals(ignoreStrategy.getIllegalSql()) |
| | | && !Boolean.TRUE.equals(ignoreStrategy.getTenantLine()) |
| | | && CollectionUtil.isEmpty(ignoreStrategy.getOthers()); |
| | | Stack<Integer> reentrantStack = REENTRANT_IGNORE.get(); |
| | | boolean empty = reentrantStack.isEmpty() || reentrantStack.pop() == 1; |
| | | if (noOtherIgnoreStrategy && empty) { |
| | | InterceptorIgnoreHelper.clearIgnoreStrategy(); |
| | | } else if (empty) { |
| | | ignoreStrategy.setDataPermission(false); |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å¨å¿½ç¥æ°æ®æé䏿§è¡ |
| | | * |
| | | * @param handle å¤çæ§è¡æ¹æ³ |
| | | */ |
| | | public static void ignore(Runnable handle) { |
| | | enableIgnore(); |
| | | try { |
| | | handle.run(); |
| | | } finally { |
| | | disableIgnore(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å¨å¿½ç¥æ°æ®æé䏿§è¡ |
| | | * |
| | | * @param handle å¤çæ§è¡æ¹æ³ |
| | | */ |
| | | public static <T> T ignore(Supplier<T> handle) { |
| | | enableIgnore(); |
| | | try { |
| | | return handle.get(); |
| | | } finally { |
| | | disableIgnore(); |
| | | } |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.interceptor; |
| | | |
| | | import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; |
| | | import com.baomidou.mybatisplus.core.toolkit.PluginUtils; |
| | | import com.baomidou.mybatisplus.extension.plugins.handler.MultiDataPermissionHandler; |
| | | import com.baomidou.mybatisplus.extension.plugins.inner.BaseMultiTableInnerInterceptor; |
| | | import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import net.sf.jsqlparser.expression.Expression; |
| | | import net.sf.jsqlparser.schema.Table; |
| | | import net.sf.jsqlparser.statement.delete.Delete; |
| | | import net.sf.jsqlparser.statement.select.PlainSelect; |
| | | import net.sf.jsqlparser.statement.select.Select; |
| | | import net.sf.jsqlparser.statement.select.SetOperationList; |
| | | import net.sf.jsqlparser.statement.update.Update; |
| | | import org.apache.ibatis.executor.Executor; |
| | | import org.apache.ibatis.executor.statement.StatementHandler; |
| | | import org.apache.ibatis.mapping.BoundSql; |
| | | import org.apache.ibatis.mapping.MappedStatement; |
| | | import org.apache.ibatis.mapping.SqlCommandType; |
| | | import org.apache.ibatis.session.ResultHandler; |
| | | import org.apache.ibatis.session.RowBounds; |
| | | import org.ruoyi.handler.PlusDataPermissionHandler; |
| | | |
| | | import java.sql.Connection; |
| | | import java.sql.SQLException; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æ°æ®æéæ¦æªå¨ |
| | | * |
| | | * @author Lion Li |
| | | * @version 3.5.0 |
| | | */ |
| | | @Slf4j |
| | | public class PlusDataPermissionInterceptor extends BaseMultiTableInnerInterceptor implements InnerInterceptor { |
| | | |
| | | private final PlusDataPermissionHandler dataPermissionHandler; |
| | | |
| | | /** |
| | | * æé 彿°ï¼åå§å PlusDataPermissionHandler å®ä¾ |
| | | * |
| | | * @param mapperPackage æ«æçæ å°å¨å
|
| | | */ |
| | | public PlusDataPermissionInterceptor(String mapperPackage) { |
| | | this.dataPermissionHandler = new PlusDataPermissionHandler(mapperPackage); |
| | | } |
| | | |
| | | /** |
| | | * 卿§è¡æ¥è¯¢ä¹åï¼æ£æ¥å¹¶å¤çæ°æ®æéç¸å
³é»è¾ |
| | | * |
| | | * @param executor MyBatis æ§è¡å¨å¯¹è±¡ |
| | | * @param ms æ å°è¯å¥å¯¹è±¡ |
| | | * @param parameter æ¹æ³åæ° |
| | | * @param rowBounds å页对象 |
| | | * @param resultHandler ç»æå¤çå¨ |
| | | * @param boundSql ç»å®ç SQL 对象 |
| | | * @throws SQLException 妿åç SQL å¼å¸¸ |
| | | */ |
| | | @Override |
| | | public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { |
| | | // æ£æ¥æ¯å¦éè¦å¿½ç¥æ°æ®æéå¤ç |
| | | if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) { |
| | | return; |
| | | } |
| | | // æ£æ¥æ¯å¦ç¼ºå°ææçæ°æ®æé注解 |
| | | if (dataPermissionHandler.invalid(ms.getId())) { |
| | | return; |
| | | } |
| | | // è§£æ sql åé
å¯¹åºæ¹æ³ |
| | | PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql); |
| | | mpBs.sql(parserSingle(mpBs.sql(), ms.getId())); |
| | | } |
| | | |
| | | /** |
| | | * å¨åå¤ SQL è¯å¥ä¹åï¼æ£æ¥å¹¶å¤çæ´æ°åå 餿ä½çæ°æ®æéç¸å
³é»è¾ |
| | | * |
| | | * @param sh MyBatis StatementHandler 对象 |
| | | * @param connection æ°æ®åºè¿æ¥å¯¹è±¡ |
| | | * @param transactionTimeout äºå¡è¶
æ¶æ¶é´ |
| | | */ |
| | | @Override |
| | | public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) { |
| | | PluginUtils.MPStatementHandler mpSh = PluginUtils.mpStatementHandler(sh); |
| | | MappedStatement ms = mpSh.mappedStatement(); |
| | | // è·å SQL å½ä»¤ç±»åï¼å¢ãå ãæ¹ãæ¥ï¼ |
| | | SqlCommandType sct = ms.getSqlCommandType(); |
| | | |
| | | // åªå¤çæ´æ°åå 餿ä½ç SQL è¯å¥ |
| | | if (sct == SqlCommandType.UPDATE || sct == SqlCommandType.DELETE) { |
| | | if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) { |
| | | return; |
| | | } |
| | | // æ£æ¥æ¯å¦ç¼ºå°ææçæ°æ®æé注解 |
| | | if (dataPermissionHandler.invalid(ms.getId())) { |
| | | return; |
| | | } |
| | | PluginUtils.MPBoundSql mpBs = mpSh.mPBoundSql(); |
| | | mpBs.sql(parserMulti(mpBs.sql(), ms.getId())); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å¤ç SELECT æ¥è¯¢è¯å¥ä¸ç WHERE æ¡ä»¶ |
| | | * |
| | | * @param select SELECT æ¥è¯¢å¯¹è±¡ |
| | | * @param index æ¥è¯¢è¯å¥çç´¢å¼ |
| | | * @param sql æ¥è¯¢è¯å¥ |
| | | * @param obj WHERE æ¡ä»¶åæ° |
| | | */ |
| | | @Override |
| | | protected void processSelect(Select select, int index, String sql, Object obj) { |
| | | if (select instanceof PlainSelect) { |
| | | this.setWhere((PlainSelect) select, (String) obj); |
| | | } else if (select instanceof SetOperationList setOperationList) { |
| | | List<Select> selectBodyList = setOperationList.getSelects(); |
| | | selectBodyList.forEach(s -> this.setWhere((PlainSelect) s, (String) obj)); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å¤ç UPDATE è¯å¥ä¸ç WHERE æ¡ä»¶ |
| | | * |
| | | * @param update UPDATE æ¥è¯¢å¯¹è±¡ |
| | | * @param index æ¥è¯¢è¯å¥çç´¢å¼ |
| | | * @param sql æ¥è¯¢è¯å¥ |
| | | * @param obj WHERE æ¡ä»¶åæ° |
| | | */ |
| | | @Override |
| | | protected void processUpdate(Update update, int index, String sql, Object obj) { |
| | | Expression sqlSegment = dataPermissionHandler.getSqlSegment(update.getWhere(), (String) obj, false); |
| | | if (null != sqlSegment) { |
| | | update.setWhere(sqlSegment); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å¤ç DELETE è¯å¥ä¸ç WHERE æ¡ä»¶ |
| | | * |
| | | * @param delete DELETE æ¥è¯¢å¯¹è±¡ |
| | | * @param index æ¥è¯¢è¯å¥çç´¢å¼ |
| | | * @param sql æ¥è¯¢è¯å¥ |
| | | * @param obj WHERE æ¡ä»¶åæ° |
| | | */ |
| | | @Override |
| | | protected void processDelete(Delete delete, int index, String sql, Object obj) { |
| | | Expression sqlSegment = dataPermissionHandler.getSqlSegment(delete.getWhere(), (String) obj, false); |
| | | if (null != sqlSegment) { |
| | | delete.setWhere(sqlSegment); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 设置 SELECT è¯å¥ç WHERE æ¡ä»¶ |
| | | * |
| | | * @param plainSelect SELECT æ¥è¯¢å¯¹è±¡ |
| | | * @param mappedStatementId æ å°è¯å¥ç ID |
| | | */ |
| | | protected void setWhere(PlainSelect plainSelect, String mappedStatementId) { |
| | | Expression sqlSegment = dataPermissionHandler.getSqlSegment(plainSelect.getWhere(), mappedStatementId, true); |
| | | if (null != sqlSegment) { |
| | | plainSelect.setWhere(sqlSegment); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æå»ºè¡¨è¾¾å¼ï¼ç¨äºå¤çè¡¨çæ°æ®æé |
| | | * |
| | | * @param table 表对象 |
| | | * @param where WHERE æ¡ä»¶è¡¨è¾¾å¼ |
| | | * @param whereSegment WHERE æ¡ä»¶ç段 |
| | | * @return æå»ºçè¡¨è¾¾å¼ |
| | | */ |
| | | @Override |
| | | public Expression buildTableExpression(Table table, Expression where, String whereSegment) { |
| | | // åªææ°çæ°æ®æéå¤ç卿伿§è¡å°è¿é |
| | | final MultiDataPermissionHandler handler = (MultiDataPermissionHandler) dataPermissionHandler; |
| | | return handler.getSqlSegment(table, where, whereSegment); |
| | | } |
| | | } |
| | | |
| | |
| | | org.ruoyi.common.mybatis.config.MybatisPlusConfig |
| | | org.ruoyi.config.MybatisPlusConfig |
¶Ô±ÈÐÂÎļþ |
| | |
| | | # å
ç½®é
ç½® ä¸å
è®¸ä¿®æ¹ å¦éä¿®æ¹è¯·å¨ nacos ä¸åç¸åé
ç½®è¦ç |
| | | # MyBatisPlusé
ç½® |
| | | # https://baomidou.com/config/ |
| | | mybatis-plus: |
| | | # å¯å¨æ¶æ¯å¦æ£æ¥ MyBatis XML æä»¶çåå¨ï¼é»è®¤ä¸æ£æ¥ |
| | | checkConfigLocation: false |
| | | configuration: |
| | | # èªå¨é©¼å³°å½åè§åï¼camel caseï¼æ å° |
| | | mapUnderscoreToCamelCase: true |
| | | # MyBatis èªå¨æ å°çç¥ |
| | | # NONEï¼ä¸å¯ç¨ PARTIALï¼åªå¯¹éåµå¥ resultMap èªå¨æ å° FULLï¼å¯¹ææ resultMap èªå¨æ å° |
| | | autoMappingBehavior: FULL |
| | | # MyBatis èªå¨æ å°æ¶æªç¥åææªç¥å±æ§å¤çç |
| | | # NONEï¼ä¸åå¤ç WARNINGï¼æå°ç¸å
³è¦å FAILINGï¼æåºå¼å¸¸å详ç»ä¿¡æ¯ |
| | | autoMappingUnknownColumnBehavior: NONE |
| | | # æ´è¯¦ç»çæ¥å¿è¾åº 伿æ§è½æè org.apache.ibatis.logging.stdout.StdOutImpl |
| | | # å
³éæ¥å¿è®°å½ (å¯åçº¯ä½¿ç¨ p6spy åæ) org.apache.ibatis.logging.nologging.NoLoggingImpl |
| | | # é»è®¤æ¥å¿è¾åº org.apache.ibatis.logging.slf4j.Slf4jImpl |
| | | logImpl: org.apache.ibatis.logging.nologging.NoLoggingImpl |
| | | global-config: |
| | | # æ¯å¦æå° Logo banner |
| | | banner: true |
| | | dbConfig: |
| | | # 主é®ç±»å |
| | | # AUTO èªå¢ NONE 空 INPUT ç¨æ·è¾å
¥ ASSIGN_ID éªè± ASSIGN_UUID å¯ä¸ UUID |
| | | idType: ASSIGN_ID |
| | | # é»è¾å·²å é¤å¼(坿鿱éæä¿®æ¹) |
| | | logicDeleteValue: 1 |
| | | # é»è¾æªå é¤å¼ |
| | | logicNotDeleteValue: 0 |
| | | insertStrategy: NOT_NULL |
| | | updateStrategy: NOT_NULL |
| | | whereStrategy: NOT_NULL |
¶Ô±ÈÐÂÎļþ |
| | |
| | | # p6spy æ§è½åææä»¶é
ç½®æä»¶ |
| | | modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory |
| | | # èªå®ä¹æ¥å¿æå° |
| | | logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger |
| | | #æ¥å¿è¾åºå°æ§å¶å° |
| | | appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger |
| | | # ä½¿ç¨æ¥å¿ç³»ç»è®°å½ sql |
| | | #appender=com.p6spy.engine.spy.appender.Slf4JLogger |
| | | # åæ¶JDBC URLåç¼ |
| | | useprefix=true |
| | | # é
ç½®è®°å½ Log ä¾å¤,å¯å»æçç»æéæerror,info,batch,debug,statement,commit,rollback,result,resultset. |
| | | excludecategories=info,debug,result,commit,resultset |
| | | # æ¥ææ ¼å¼ |
| | | dateformat=yyyy-MM-dd HH:mm:ss |
| | | # SQLè¯å¥æå°æ¶é´æ ¼å¼ |
| | | databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss |
| | | # æ¯å¦è¿æ»¤ Log |
| | | filter=true |
| | | # è¿æ»¤ Log æ¶ææé¤ç sql å
³é®åï¼ä»¥éå·åé |
| | | exclude= |
| | |
| | | return isTenantAdmin(getLoginUser().getRolePermission()); |
| | | } |
| | | |
| | | /** |
| | | * æ£æ¥å½åç¨æ·æ¯å¦å·²ç»å½ |
| | | * |
| | | * @return ç»æ |
| | | */ |
| | | public static boolean isLogin() { |
| | | try { |
| | | return getLoginUser() != null; |
| | | } catch (Exception e) { |
| | | return false; |
| | | } |
| | | } |
| | | } |
| | |
| | | import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; |
| | | import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; |
| | | import org.ruoyi.common.core.utils.reflect.ReflectUtils; |
| | | import org.ruoyi.common.mybatis.config.MybatisPlusConfig; |
| | | |
| | | import org.ruoyi.common.redis.config.RedisConfig; |
| | | import org.ruoyi.common.redis.config.properties.RedissonProperties; |
| | | import org.ruoyi.common.tenant.core.TenantSaTokenDao; |
| | |
| | | import org.redisson.config.ClusterServersConfig; |
| | | import org.redisson.config.SingleServerConfig; |
| | | import org.redisson.spring.starter.RedissonAutoConfigurationCustomizer; |
| | | import org.ruoyi.config.MybatisPlusConfig; |
| | | import org.springframework.boot.autoconfigure.AutoConfiguration; |
| | | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
| | | import org.springframework.boot.context.properties.EnableConfigurationProperties; |
| | |
| | | |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | |
| | | |
| | | /** |
| | | * ç§æ·åºç±» |
| | |
| | | } |
| | | |
| | | /** |
| | | * è®¾ç½®å¨æç§æ·(ä¸ç´ææ éè¦æå¨æ¸
ç) |
| | | * <p> |
| | | * å¦æä¸ºæªç»å½ç¶æä¸ é£ä¹åªå¨å½å线ç¨å
çæ |
| | | * |
| | | * @param tenantId ç§æ·id |
| | | * @param global æ¯å¦å
¨å±çæ |
| | | */ |
| | | public static void setDynamic(String tenantId, boolean global) { |
| | | if (!isEnable()) { |
| | | return; |
| | | } |
| | | if (!LoginHelper.isLogin() || !global) { |
| | | TEMP_DYNAMIC_TENANT.set(tenantId); |
| | | return; |
| | | } |
| | | String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId(); |
| | | RedisUtils.setCacheObject(cacheKey, tenantId); |
| | | SaHolder.getStorage().set(cacheKey, tenantId); |
| | | } |
| | | |
| | | /** |
| | | * è·åå¨æç§æ·(ä¸ç´ææ éè¦æå¨æ¸
ç) |
| | | * <p> |
| | | * å¦æä¸ºéwebç¯å¢ é£ä¹åªå¨å½å线ç¨å
çæ |
| | |
| | | return tenantId; |
| | | } |
| | | |
| | | /** |
| | | * å¨å¨æç§æ·ä¸æ§è¡ |
| | | * |
| | | * @param handle å¤çæ§è¡æ¹æ³ |
| | | */ |
| | | public static void dynamic(String tenantId, Runnable handle) { |
| | | setDynamic(tenantId); |
| | | try { |
| | | handle.run(); |
| | | } finally { |
| | | clearDynamic(); |
| | | } |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <project xmlns="http://maven.apache.org/POM/4.0.0" |
| | | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| | | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | <parent> |
| | | <artifactId>ruoyi-ai</artifactId> |
| | | <groupId>org.ruoyi</groupId> |
| | | <version>${revision}</version> |
| | | <relativePath>../pom.xml</relativePath> |
| | | </parent> |
| | | |
| | | <artifactId>ruoyi-extend</artifactId> |
| | | <packaging>pom</packaging> |
| | | |
| | | <modules> |
| | | <module>ruoyi-mcp-server</module> |
| | | </modules> |
| | | |
| | | </project> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| | | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | <parent> |
| | | <groupId>org.ruoyi</groupId> |
| | | <artifactId>ruoyi-ai</artifactId> |
| | | <version>${revision}</version> |
| | | <relativePath>../../pom.xml</relativePath> |
| | | </parent> |
| | | |
| | | <artifactId>ruoyi-mcp-server</artifactId> |
| | | |
| | | <dependencyManagement> |
| | | <dependencies> |
| | | <dependency> |
| | | <groupId>org.springframework.ai</groupId> |
| | | <artifactId>spring-ai-bom</artifactId> |
| | | <version>1.0.0-M6</version> |
| | | <type>pom</type> |
| | | <scope>import</scope> |
| | | </dependency> |
| | | </dependencies> |
| | | </dependencyManagement> |
| | | |
| | | <dependencies> |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-starter</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-starter-test</artifactId> |
| | | <scope>test</scope> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-starter-web</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.springframework.ai</groupId> |
| | | <artifactId>spring-ai-mcp-server-webmvc-spring-boot-starter</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.springframework.ai</groupId> |
| | | <artifactId>spring-ai-mcp</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.ruoyi</groupId> |
| | | <artifactId>ruoyi-system-api</artifactId> |
| | | <exclusions> |
| | | <exclusion> |
| | | <groupId>org.ruoyi</groupId> |
| | | <artifactId>ruoyi-common-translation</artifactId> |
| | | </exclusion> |
| | | </exclusions> |
| | | </dependency> |
| | | |
| | | </dependencies> |
| | | </project> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.mcp.service; |
| | | |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.ruoyi.system.domain.vo.SysUserVo; |
| | | import org.ruoyi.system.mapper.SysUserMapper; |
| | | import org.springframework.ai.tool.annotation.Tool; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | /** |
| | | * @author ageer |
| | | */ |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | public class McpCustomService { |
| | | |
| | | private final SysUserMapper userMapper; |
| | | |
| | | public record User(String userName, Double userBalance) { |
| | | } |
| | | |
| | | @Tool(description = "æ ¹æ®ç¨æ·åç§°æ¥è¯¢ç¨æ·ä¿¡æ¯") |
| | | public User getUserBalance(String username) { |
| | | SysUserVo sysUserVo = userMapper.selectUserByUserName(username); |
| | | return new User(sysUserVo.getUserName(),sysUserVo.getUserBalance()); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | --- # çæ§ä¸å¿é
ç½® |
| | | spring.boot.admin.client: |
| | | # å¢å 客æ·ç«¯å¼å
³ |
| | | enabled: false |
| | | url: http://localhost:9090/admin |
| | | instance: |
| | | service-host-type: IP |
| | | username: ruoyi |
| | | password: 123456 |
| | | |
| | | --- # æ°æ®æºé
ç½® |
| | | spring: |
| | | datasource: |
| | | type: com.zaxxer.hikari.HikariDataSource |
| | | # å¨ææ°æ®æºææ¡£ https://www.kancloud.cn/tracy5546/dynamic-datasource/content |
| | | dynamic: |
| | | # æ§è½åææä»¶(ææ§è½æè ä¸å»ºè®®ç产ç¯å¢ä½¿ç¨) |
| | | p6spy: true |
| | | # 设置é»è®¤çæ°æ®æºæè
æ°æ®æºç»,é»è®¤å¼å³ä¸º master |
| | | primary: master |
| | | # ä¸¥æ ¼æ¨¡å¼ å¹é
ä¸å°æ°æ®æºåæ¥é |
| | | strict: true |
| | | datasource: |
| | | # ä¸»åºæ°æ®æº |
| | | master: |
| | | type: ${spring.datasource.type} |
| | | driverClassName: com.mysql.cj.jdbc.Driver |
| | | url: jdbc:mysql://43.139.70.230:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true |
| | | username: ry-vue |
| | | password: xx |
| | | |
| | | hikari: |
| | | # æå¤§è¿æ¥æ± æ°é |
| | | maxPoolSize: 20 |
| | | # æå°ç©ºé²çº¿ç¨æ°é |
| | | minIdle: 10 |
| | | # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ |
| | | connectionTimeout: 30000 |
| | | # æ ¡éªè¶
æ¶æ¶é´ |
| | | validationTimeout: 5000 |
| | | # 空é²è¿æ¥åæ´»æå¤§æ¶é´ï¼é»è®¤10åé |
| | | idleTimeout: 600000 |
| | | # æ¤å±æ§æ§å¶æ± ä¸è¿æ¥çæé¿çå½å¨æï¼å¼0表示æ éçå½å¨æï¼é»è®¤30åé |
| | | maxLifetime: 1800000 |
| | | # è¿æ¥æµè¯queryï¼é
ç½®æ£æµè¿æ¥æ¯å¦ææï¼ |
| | | connectionTestQuery: SELECT 1 |
| | | # å¤ä¹
æ£æ¥ä¸æ¬¡è¿æ¥çæ´»æ§ |
| | | keepaliveTime: 30000 |
| | | |
| | | --- # redis åæºé
ç½®(åæºä¸é群åªè½å¼å¯ä¸ä¸ªå¦ä¸ä¸ªéè¦æ³¨éæ) |
| | | spring.data: |
| | | redis: |
| | | # å°å |
| | | host: 127.0.0.1 |
| | | # 端å£ï¼é»è®¤ä¸º6379 |
| | | port: 6379 |
| | | # æ°æ®åºç´¢å¼ |
| | | database: 0 |
| | | # å¯ç (妿²¡æå¯ç 请注éæ) |
| | | # password: 123456 |
| | | # è¿æ¥è¶
æ¶æ¶é´ |
| | | timeout: 10S |
| | | |
| | | redisson: |
| | | # redis keyåç¼ |
| | | keyPrefix: |
| | | # çº¿ç¨æ± æ°é |
| | | threads: 4 |
| | | # Nettyçº¿ç¨æ± æ°é |
| | | nettyThreads: 8 |
| | | # åèç¹é
ç½® |
| | | singleServerConfig: |
| | | # 客æ·ç«¯åç§° |
| | | clientName: ${ruoyi.name} |
| | | # æå°ç©ºé²è¿æ¥æ° |
| | | connectionMinimumIdleSize: 8 |
| | | # è¿æ¥æ± å¤§å° |
| | | connectionPoolSize: 32 |
| | | # è¿æ¥ç©ºé²è¶
æ¶ï¼åä½ï¼æ¯«ç§ |
| | | idleConnectionTimeout: 10000 |
| | | # å½ä»¤çå¾
è¶
æ¶ï¼åä½ï¼æ¯«ç§ |
| | | timeout: 3000 |
| | | # åå¸å订é
è¿æ¥æ± å¤§å° |
| | | subscriptionConnectionPoolSize: 50 |
| | | |
| | | --- # sms çä¿¡ |
| | | sms: |
| | | enabled: false |
| | | # é¿éäº dysmsapi.aliyuncs.com |
| | | # è
¾è®¯äº sms.tencentcloudapi.com |
| | | endpoint: "dysmsapi.aliyuncs.com" |
| | | accessKeyId: xxxxxxx |
| | | accessKeySecret: xxxxxx |
| | | signName: æµè¯ |
| | | # è
¾è®¯ä¸ç¨ |
| | | sdkAppId: |
| | | |
¶Ô±ÈÐÂÎļþ |
| | |
| | | |
| | | # 项ç®ç¸å
³é
ç½® |
| | | ruoyi: |
| | | # åç§° |
| | | name: "ruoyi" |
| | | # çæ¬ |
| | | version: ${revision} |
| | | # çæå¹´ä»½ |
| | | copyrightYear: 2025 |
| | | # å®ä¾æ¼ç¤ºå¼å
³ |
| | | demoEnabled: true |
| | | # è·åipå°åå¼å
³ |
| | | addressEnabled: false |
| | | |
| | | captcha: |
| | | enable: false |
| | | # é¡µé¢ <åæ°è®¾ç½®> å¯å¼å¯å
³é éªè¯ç æ ¡éª |
| | | # éªè¯ç ç±»å math æ°ç»è®¡ç® char å符éªè¯ |
| | | type: MATH |
| | | # line çº¿æ®µå¹²æ° circle ååå¹²æ° shear ææ²å¹²æ° |
| | | category: CIRCLE |
| | | # æ°åéªè¯ç 使° |
| | | numberLength: 1 |
| | | # å符éªè¯ç é¿åº¦ |
| | | charLength: 4 |
| | | |
| | | # å¼åç¯å¢é
ç½® |
| | | server: |
| | | # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 |
| | | port: 6040 |
| | | servlet: |
| | | # åºç¨ç访é®è·¯å¾ |
| | | context-path: / |
| | | # undertow é
ç½® |
| | | undertow: |
| | | # HTTP postå
容çæå¤§å¤§å°ãå½å¼ä¸º-1æ¶ï¼é»è®¤å¼ä¸ºå¤§å°æ¯æ éç |
| | | max-http-post-size: -1 |
| | | # 以ä¸çé
ç½®ä¼å½±åbuffer,è¿äºbufferä¼ç¨äºæå¡å¨è¿æ¥çIOæä½,æç¹ç±»ä¼¼nettyçæ± åå
å管ç |
| | | # æ¯åbufferç空é´å¤§å°,è¶å°ç空é´è¢«å©ç¨è¶å
å |
| | | buffer-size: 512 |
| | | # æ¯å¦åé
çç´æ¥å
å |
| | | direct-buffers: true |
| | | threads: |
| | | # 设置IOçº¿ç¨æ°, å®ä¸»è¦æ§è¡éé»å¡çä»»å¡,å®ä»¬ä¼è´è´£å¤ä¸ªè¿æ¥, é»è®¤è®¾ç½®æ¯ä¸ªCPUæ ¸å¿ä¸ä¸ªçº¿ç¨ |
| | | io: 8 |
| | | # é»å¡ä»»å¡çº¿ç¨æ± , 彿§è¡ç±»ä¼¼servlet请æ±é»å¡æä½, undertowä¼ä»è¿ä¸ªçº¿ç¨æ± ä¸åå¾çº¿ç¨,å®çå¼è®¾ç½®åå³äºç³»ç»çè´è½½ |
| | | worker: 256 |
| | | # ç¨æ·é
ç½® |
| | | user: |
| | | password: |
| | | # å¯ç æå¤§éè¯¯æ¬¡æ° |
| | | maxRetryCount: 5 |
| | | # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ |
| | | lockTime: 10 |
| | | |
| | | # Springé
ç½® |
| | | spring: |
| | | application: |
| | | name: ${ruoyi.name} |
| | | # èµæºä¿¡æ¯ |
| | | messages: |
| | | # å½é
åèµæºæä»¶è·¯å¾ |
| | | basename: i18n/messages |
| | | profiles: |
| | | active: @profiles.active@ |
| | | # æä»¶ä¸ä¼ |
| | | servlet: |
| | | multipart: |
| | | # å个æä»¶å¤§å° |
| | | max-file-size: 50MB |
| | | # 设置æ»ä¸ä¼ çæä»¶å¤§å° |
| | | max-request-size: 200MB |
| | | mvc: |
| | | format: |
| | | date-time: yyyy-MM-dd HH:mm:ss |
| | | jackson: |
| | | # æ¥ææ ¼å¼å |
| | | date-format: yyyy-MM-dd HH:mm:ss |
| | | serialization: |
| | | # æ ¼å¼åè¾åº |
| | | indent_output: false |
| | | # å¿½ç¥æ æ³è½¬æ¢ç对象 |
| | | fail_on_empty_beans: false |
| | | deserialization: |
| | | # å
许对象忽ç¥jsonä¸ä¸åå¨ç屿§ |
| | | fail_on_unknown_properties: false |
| | | |
| | | # Sa-Tokené
ç½® |
| | | sa-token: |
| | | # tokenåç§° (忶乿¯cookieåç§°) |
| | | token-name: Authorization |
| | | # tokenæææ 设为7天 (å¿
å®è¿æ) åä½: ç§ |
| | | timeout: 604800 |
| | | # tokenä¸´æ¶æææ (æå®æ¶é´æ æä½å°±è¿æ) åä½: ç§ |
| | | activity-timeout: 604800 |
| | | # æ¯å¦å
许åä¸è´¦å·å¹¶åç»å½ (为trueæ¶å
许ä¸èµ·ç»å½, 为falseæ¶æ°ç»å½æ¤ææ§ç»å½) |
| | | is-concurrent: true |
| | | # å¨å¤äººç»å½åä¸è´¦å·æ¶ï¼æ¯å¦å
±ç¨ä¸ä¸ªtoken (为trueæ¶ææç»å½å
±ç¨ä¸ä¸ªtoken, 为falseæ¶æ¯æ¬¡ç»å½æ°å»ºä¸ä¸ªtoken) |
| | | is-share: false |
| | | # æ¯å¦å°è¯ä»headeré读åtoken |
| | | is-read-header: true |
| | | # æ¯å¦å°è¯ä»cookieé读åtoken |
| | | is-read-cookie: false |
| | | # tokenåç¼ |
| | | token-prefix: "Bearer" |
| | | # jwtç§é¥ |
| | | jwt-secret-key: abcdefghijklmnopqrstuvwxyz |
| | | |
| | | # securityé
ç½® |
| | | security: |
| | | # æé¤è·¯å¾ |
| | | excludes: |
| | | # æ¯ä»åè° |
| | | - /pay/returnUrl |
| | | - /pay/notifyUrl |
| | | # ä¸ä¼ æä»¶ |
| | | - /resource/oss/upload |
| | | # éç½®å¯ç |
| | | - /auth/reset/password |
| | | # è天æ¥å£ |
| | | - /chat |
| | | # éæèµæº |
| | | - /*.html |
| | | - /**/*.html |
| | | - /**/*.css |
| | | - /**/*.js |
| | | # å
Œ
±è·¯å¾ |
| | | - /favicon.ico |
| | | - /error |
| | | # swagger ææ¡£é
ç½® |
| | | - /*/api-docs |
| | | - /*/api-docs/** |
| | | # actuator çæ§é
ç½® |
| | | - /actuator |
| | | - /actuator/** |
| | | # å¤ç§æ·é
ç½® |
| | | tenant: |
| | | # æ¯å¦å¼å¯ |
| | | enable: false |
| | | # æé¤è¡¨ |
| | | excludes: |
| | | - sys_menu |
| | | - sys_tenant |
| | | - sys_tenant_package |
| | | - sys_role_dept |
| | | - sys_role_menu |
| | | - sys_user_post |
| | | - sys_user_role |
| | | |
| | | # MyBatisPlusé
ç½® |
| | | # https://baomidou.com/config/ |
| | | mybatis-plus: |
| | | # 䏿¯æå¤å
, 妿éè¦å¯å¨æ³¨è§£é
ç½® æ æåæ«å
ç级 |
| | | # ä¾å¦ com.**.**.mapper |
| | | mapperPackage: org.ruoyi.**.mapper |
| | | # 对åºç XML æä»¶ä½ç½® |
| | | mapperLocations: classpath*:mapper/**/*Mapper.xml |
| | | # å®ä½æ«æï¼å¤ä¸ªpackageç¨éå·æè
åå·åé |
| | | typeAliasesPackage: org.ruoyi.**.domain |
| | | # å¯å¨æ¶æ¯å¦æ£æ¥ MyBatis XML æä»¶çåå¨ï¼é»è®¤ä¸æ£æ¥ |
| | | checkConfigLocation: false |
| | | configuration: |
| | | # èªå¨é©¼å³°å½åè§åï¼camel caseï¼æ å° |
| | | mapUnderscoreToCamelCase: true |
| | | # MyBatis èªå¨æ å°çç¥ |
| | | # NONEï¼ä¸å¯ç¨ PARTIALï¼åªå¯¹éåµå¥ resultMap èªå¨æ å° FULLï¼å¯¹ææ resultMap èªå¨æ å° |
| | | autoMappingBehavior: FULL |
| | | # MyBatis èªå¨æ å°æ¶æªç¥åææªç¥å±æ§å¤çç |
| | | # NONEï¼ä¸åå¤ç WARNINGï¼æå°ç¸å
³è¦å FAILINGï¼æåºå¼å¸¸å详ç»ä¿¡æ¯ |
| | | autoMappingUnknownColumnBehavior: NONE |
| | | # æ´è¯¦ç»çæ¥å¿è¾åº 伿æ§è½æè org.apache.ibatis.logging.stdout.StdOutImpl |
| | | # å
³éæ¥å¿è®°å½ (å¯åçº¯ä½¿ç¨ p6spy åæ) org.apache.ibatis.logging.nologging.NoLoggingImpl |
| | | # é»è®¤æ¥å¿è¾åº org.apache.ibatis.logging.slf4j.Slf4jImpl |
| | | logImpl: org.apache.ibatis.logging.nologging.NoLoggingImpl |
| | | global-config: |
| | | # æ¯å¦æå° Logo banner |
| | | banner: true |
| | | dbConfig: |
| | | # 主é®ç±»å |
| | | # AUTO èªå¢ NONE 空 INPUT ç¨æ·è¾å
¥ ASSIGN_ID éªè± ASSIGN_UUID å¯ä¸ UUID |
| | | idType: ASSIGN_ID |
| | | # é»è¾å·²å é¤å¼ |
| | | logicDeleteValue: 2 |
| | | # é»è¾æªå é¤å¼ |
| | | logicNotDeleteValue: 0 |
| | | # åæ®µéªè¯çç¥ä¹ insert,å¨ insert çæ¶åçåæ®µéªè¯çç¥ |
| | | # IGNORED å¿½ç¥ NOT_NULL éNULL NOT_EMPTY é空 DEFAULT é»è®¤ NEVER ä¸å å
¥ SQL |
| | | insertStrategy: NOT_NULL |
| | | # åæ®µéªè¯çç¥ä¹ update,å¨ update çæ¶åçåæ®µéªè¯çç¥ |
| | | updateStrategy: NOT_NULL |
| | | # åæ®µéªè¯çç¥ä¹ select,å¨ select çæ¶åçåæ®µéªè¯çç¥æ¢ wrapper æ ¹æ®å
é¨ entity çæç where æ¡ä»¶ |
| | | where-strategy: NOT_NULL |
| | | |
| | | # æ°æ®å å¯ |
| | | mybatis-encryptor: |
| | | # æ¯å¦å¼å¯å å¯ |
| | | enable: false |
| | | # é»è®¤å å¯ç®æ³ |
| | | algorithm: BASE64 |
| | | # ç¼ç æ¹å¼ BASE64/HEXãé»è®¤BASE64 |
| | | encode: BASE64 |
| | | # å®å
¨ç§é¥ å¯¹ç§°ç®æ³çç§é¥ å¦ï¼AESï¼SM4 |
| | | password: |
| | | # å
¬ç§é¥ éå¯¹ç§°ç®æ³çå
¬ç§é¥ å¦ï¼SM2ï¼RSA |
| | | publicKey: |
| | | privateKey: |
| | | |
| | | # Swaggeré
ç½® |
| | | swagger: |
| | | info: |
| | | # æ é¢ |
| | | title: 'æ é¢ï¼${ruoyi.name}å¤ç§æ·ç®¡çç³»ç»_æ¥å£ææ¡£' |
| | | # æè¿° |
| | | description: 'æè¿°ï¼ç¨äºç®¡çé墿ä¸å
¬å¸ç人åä¿¡æ¯,å
·ä½å
æ¬XXX,XXX模å...' |
| | | # çæ¬ |
| | | version: 'çæ¬å·: ${ruoyi.version}' |
| | | # ä½è
ä¿¡æ¯ |
| | | contact: |
| | | name: ageerle |
| | | email: ageerle@163.com |
| | | url: https://gitee.com/ageerle/ruoyi-ai |
| | | components: |
| | | # é´ææ¹å¼é
ç½® |
| | | security-schemes: |
| | | apiKey: |
| | | type: APIKEY |
| | | in: HEADER |
| | | name: ${sa-token.token-name} |
| | | |
| | | springdoc: |
| | | api-docs: |
| | | # æ¯å¦å¼å¯æ¥å£ææ¡£ |
| | | enabled: true |
| | | swagger-ui: |
| | | # æä¹
åè®¤è¯æ°æ® |
| | | persistAuthorization: true |
| | | #è¿éå®ä¹äºä¸¤ä¸ªåç»ï¼å¯å®ä¹å¤ä¸ªï¼ä¹å¯ä»¥ä¸å®ä¹ |
| | | group-configs: |
| | | - group: 1.æ¼ç¤ºæ¨¡å |
| | | packages-to-scan: org.ruoyi.demo |
| | | - group: 2.éç¨æ¨¡å |
| | | packages-to-scan: org.ruoyi.web |
| | | - group: 3.ç³»ç»æ¨¡å |
| | | packages-to-scan: org.ruoyi.system |
| | | - group: 4.代ç çææ¨¡å |
| | | packages-to-scan: org.ruoyi.generator |
| | | |
| | | # 鲿¢XSSæ»å» |
| | | xss: |
| | | # è¿æ»¤å¼å
³ |
| | | enabled: true |
| | | # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ |
| | | excludes: /system/notice |
| | | # å¹é
龿¥ |
| | | urlPatterns: /system/*,/monitor/*,/tool/* |
| | | |
| | | # å
¨å±çº¿ç¨æ± ç¸å
³é
ç½® |
| | | thread-pool: |
| | | # æ¯å¦å¼å¯çº¿ç¨æ± |
| | | enabled: false |
| | | # éåæå¤§é¿åº¦ |
| | | queueCapacity: 128 |
| | | # çº¿ç¨æ± ç»´æ¤çº¿ç¨æå
许çç©ºé²æ¶é´ |
| | | keepAliveSeconds: 300 |
| | | |
| | | --- # åå¸å¼é lock4j å
¨å±é
ç½® |
| | | lock4j: |
| | | # è·ååå¸å¼éè¶
æ¶æ¶é´ï¼é»è®¤ä¸º 3000 æ¯«ç§ |
| | | acquire-timeout: 3000 |
| | | # åå¸å¼éçè¶
æ¶æ¶é´ï¼é»è®¤ä¸º 30 ç§ |
| | | expire: 30000 |
| | | |
| | | --- # Actuator çæ§ç«¯ç¹çé
置项 |
| | | management: |
| | | endpoints: |
| | | web: |
| | | exposure: |
| | | include: '*' |
| | | endpoint: |
| | | health: |
| | | show-details: ALWAYS |
| | | logfile: |
| | | external-file: ./logs/sys-console.log |
| | | |
| | | # websocket |
| | | websocket: |
| | | enabled: true |
| | | # è·¯å¾ |
| | | path: '/resource/websocket' |
| | | # è®¾ç½®è®¿é®æºå°å |
| | | allowedOrigins: '*' |
| | | |
| | | # 微信å°ç¨åºé
ç½®ä¿¡æ¯ |
| | | wx: |
| | | miniapp: |
| | | configs: |
| | | - appid: # ä½ çappid |
| | | secret: # ä½ çsecret |
| | | token: #微信å°ç¨åºæ¶æ¯æå¡å¨é
ç½®çtoken |
| | | aesKey: #微信å°ç¨åºæ¶æ¯æå¡å¨é
ç½®çEncodingAESKey |
| | | msgDataFormat: JSON |
| | | |
| | | # ä¼ä¸å¾®ä¿¡åºç¨ |
| | | wechat: |
| | | cp: |
| | | corpId: |
| | | appConfigs: |
| | | - agentId: |
| | | secret: '' |
| | | token: '' |
| | | aesKey: '' |
| | | |
| | | spring: |
| | | ai: |
| | | openai: |
| | | api-key: sk-xX |
| | | base-url: https://api.pandarobot.chat |
| | | ollama: |
| | | base-url: http://localhost:11434 |
| | | init: |
| | | pull-model-strategy: always |
| | | timeout: 60s |
| | | max-retries: 1 |
| | | mcp: |
| | | client: |
| | | enabled: true |
| | | name: call-mcp-server |
| | | sse: |
| | | connections: |
| | | server1: |
| | | url: http://127.0.0.1:8080 |
| | | |
| | |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-starter</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-starter-test</artifactId> |
| | | <scope>test</scope> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-starter-web</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.springframework.ai</groupId> |
| | | <artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.springframework.ai</groupId> |
| | | <artifactId>spring-ai-mcp</artifactId> |
| | | </dependency> |
| | | <!-- <dependency>--> |
| | | <!-- <groupId>org.springframework.ai</groupId>--> |
| | | <!-- <artifactId>spring-ai-mcp</artifactId>--> |
| | | <!-- </dependency>--> |
| | | |
| | | <dependency> |
| | | <groupId>org.springframework.ai</groupId> |
| | | <artifactId>spring-ai-openai-spring-boot-starter</artifactId> |
| | | </dependency> |
| | | <!-- <dependency>--> |
| | | <!-- <groupId>org.springframework.ai</groupId>--> |
| | | <!-- <artifactId>spring-ai-openai</artifactId>--> |
| | | <!-- </dependency>--> |
| | | |
| | | <dependency> |
| | | <groupId>org.springframework.ai</groupId> |
| | | <artifactId>spring-ai-ollama-spring-boot-starter</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.springframework.ai</groupId> |
| | | <artifactId>spring-ai-core</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.springframework.ai</groupId> |
| | | <artifactId>spring-ai-ollama</artifactId> |
| | | </dependency> |
| | | </dependencies> |
| | | |
| | | </project> |
| | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | |
| | | import java.io.Serial; |
| | | |
| | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | |
| | | import java.io.Serial; |
| | | |
| | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | |
| | | import java.io.Serial; |
| | | |
| | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | |
| | | import java.io.Serial; |
| | | |
| | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | |
| | | import java.io.Serial; |
| | | |
| | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | |
| | | import java.io.Serial; |
| | | |
| | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | |
| | | import java.io.Serial; |
| | | |
| | |
| | | import com.baomidou.mybatisplus.annotation.Version; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | |
| | | import java.io.Serial; |
| | | import java.io.Serializable; |
| | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.domain.ChatAgentManage; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.domain.ChatAppStore; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.domain.ChatGpts; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | |
| | | |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.domain.ChatModel; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.domain.ChatPackagePlan; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.domain.ChatPayOrder; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.domain.ChatPlugin; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.domain.ChatRobConfig; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.domain.ChatUsageToken; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import org.ruoyi.domain.ChatVisitorUsage; |
| | | |
| | | |
| | |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.domain.ChatVoucher; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | |
| | | |
| | | import org.ruoyi.domain.ChatAgentManage; |
| | | import org.ruoyi.domain.vo.ChatAgentManageVo; |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | |
| | | /** |
| | | * æºè½ä½ç®¡çMapperæ¥å£ |
| | |
| | | |
| | | import org.ruoyi.domain.ChatAppStore; |
| | | import org.ruoyi.domain.vo.ChatAppStoreVo; |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | |
| | | /** |
| | | * åºç¨ååºMapperæ¥å£ |
| | |
| | | package org.ruoyi.mapper; |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.domain.ChatGpts; |
| | | import org.ruoyi.domain.vo.ChatGptsVo; |
| | | |
| | |
| | | package org.ruoyi.mapper; |
| | | |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.domain.ChatMessage; |
| | | import org.ruoyi.domain.vo.ChatMessageVo; |
| | | |
| | |
| | | package org.ruoyi.mapper; |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.domain.ChatModel; |
| | | import org.ruoyi.domain.vo.ChatModelVo; |
| | | |
| | |
| | | package org.ruoyi.mapper; |
| | | |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.domain.ChatPackagePlan; |
| | | import org.ruoyi.domain.vo.ChatPackagePlanVo; |
| | | |
| | |
| | | package org.ruoyi.mapper; |
| | | |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.domain.ChatPayOrder; |
| | | import org.ruoyi.domain.vo.ChatPayOrderVo; |
| | | |
| | |
| | | package org.ruoyi.mapper; |
| | | |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.domain.ChatPlugin; |
| | | import org.ruoyi.domain.vo.ChatPluginVo; |
| | | |
| | |
| | | package org.ruoyi.mapper; |
| | | |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.domain.ChatRobConfig; |
| | | import org.ruoyi.domain.vo.ChatRobConfigVo; |
| | | |
| | |
| | | package org.ruoyi.mapper; |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.domain.ChatToken; |
| | | import org.ruoyi.domain.vo.ChatTokenVo; |
| | | |
| | |
| | | package org.ruoyi.mapper; |
| | | |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.domain.ChatUsageToken; |
| | | import org.ruoyi.domain.vo.ChatUsageTokenVo; |
| | | |
| | |
| | | package org.ruoyi.mapper; |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.domain.ChatVisitorUsage; |
| | | import org.ruoyi.domain.vo.ChatVisitorUsageVo; |
| | | |
| | |
| | | package org.ruoyi.mapper; |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.domain.ChatVoucher; |
| | | import org.ruoyi.domain.vo.ChatVoucherVo; |
| | | |
| | |
| | | |
| | | import org.ruoyi.domain.bo.ChatAgentManageBo; |
| | | import org.ruoyi.domain.vo.ChatAgentManageVo; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | |
| | | |
| | | import org.ruoyi.domain.bo.ChatAppStoreBo; |
| | | import org.ruoyi.domain.vo.ChatAppStoreVo; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | |
| | | package org.ruoyi.service; |
| | | |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.domain.bo.ChatGptsBo; |
| | | import org.ruoyi.domain.vo.ChatGptsVo; |
| | | |
| | |
| | | package org.ruoyi.service; |
| | | |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.domain.bo.ChatMessageBo; |
| | | import org.ruoyi.domain.vo.ChatMessageVo; |
| | | |
| | |
| | | package org.ruoyi.service; |
| | | |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.domain.bo.ChatModelBo; |
| | | import org.ruoyi.domain.vo.ChatModelVo; |
| | | |
| | |
| | | package org.ruoyi.service; |
| | | |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.domain.bo.ChatPackagePlanBo; |
| | | import org.ruoyi.domain.vo.ChatPackagePlanVo; |
| | | |
| | |
| | | package org.ruoyi.service; |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.domain.bo.ChatPayOrderBo; |
| | | import org.ruoyi.domain.vo.ChatPayOrderVo; |
| | | |
| | |
| | | package org.ruoyi.service; |
| | | |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.domain.bo.ChatPluginBo; |
| | | import org.ruoyi.domain.vo.ChatPluginVo; |
| | | |
| | |
| | | package org.ruoyi.service; |
| | | |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.domain.bo.ChatUsageTokenBo; |
| | | import org.ruoyi.domain.vo.ChatUsageTokenVo; |
| | | |
| | |
| | | package org.ruoyi.service; |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.domain.bo.ChatVisitorUsageBo; |
| | | import org.ruoyi.domain.vo.ChatVisitorUsageVo; |
| | | |
| | |
| | | package org.ruoyi.service; |
| | | |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.domain.bo.ChatVoucherBo; |
| | | import org.ruoyi.domain.vo.ChatVoucherVo; |
| | | |
| | |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import lombok.RequiredArgsConstructor; |
| | |
| | | |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | |
| | | |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | |
| | | |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | |
| | | |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | |
| | | |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | |
| | | |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | |
| | | |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.service.impl; |
| | | |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.ruoyi.domain.ChatToken; |
| | | import org.ruoyi.mapper.ChatTokenMapper; |
| | | import org.ruoyi.service.IChatTokenService; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | /** |
| | | * èå¤©æ¶æ¯Serviceä¸å¡å±å¤ç |
| | | * |
| | | * @author Lion Li |
| | | * @date 2023-11-26 |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Service |
| | | public class ChatTokenServiceImpl implements IChatTokenService { |
| | | |
| | | private final ChatTokenMapper baseMapper; |
| | | |
| | | @Override |
| | | public ChatToken queryByUserId(Long userId, String modelName) { |
| | | return baseMapper.selectOne( |
| | | new LambdaQueryWrapper<ChatToken>() |
| | | .eq(ChatToken::getUserId, userId) |
| | | .eq(ChatToken::getModelName, modelName) |
| | | .last("limit 1") |
| | | ); |
| | | } |
| | | |
| | | /** |
| | | * æ¸
ç©ºç¨æ·token |
| | | * |
| | | */ |
| | | @Override |
| | | public void resetToken(Long userId,String modelName) { |
| | | ChatToken chatToken = queryByUserId(userId, modelName); |
| | | chatToken.setToken(0); |
| | | baseMapper.updateById(chatToken); |
| | | } |
| | | |
| | | /** |
| | | * å¢å ç¨æ·token |
| | | * |
| | | */ |
| | | @Override |
| | | public void editToken(ChatToken chatToken) { |
| | | if(chatToken.getId() == null){ |
| | | baseMapper.insert(chatToken); |
| | | }else { |
| | | baseMapper.updateById(chatToken); |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | |
| | | |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | |
| | | import java.io.Serial; |
| | | |
| | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | |
| | | import java.io.Serial; |
| | | |
| | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | |
| | | import java.io.Serial; |
| | | |
| | |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.domain.KnowledgeAttach; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.domain.KnowledgeFragment; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.domain.KnowledgeInfo; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | |
| | | |
| | | import org.ruoyi.domain.KnowledgeAttach; |
| | | import org.ruoyi.domain.vo.KnowledgeAttachVo; |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | |
| | | /** |
| | | * ç¥è¯åºéä»¶Mapperæ¥å£ |
| | |
| | | |
| | | import org.ruoyi.domain.KnowledgeFragment; |
| | | import org.ruoyi.domain.vo.KnowledgeFragmentVo; |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | |
| | | /** |
| | | * ç¥è¯ç段Mapperæ¥å£ |
| | |
| | | |
| | | import org.ruoyi.domain.KnowledgeInfo; |
| | | import org.ruoyi.domain.vo.KnowledgeInfoVo; |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | |
| | | /** |
| | | * ç¥è¯åºMapperæ¥å£ |
| | |
| | | |
| | | import org.ruoyi.domain.bo.KnowledgeAttachBo; |
| | | import org.ruoyi.domain.vo.KnowledgeAttachVo; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | |
| | | package org.ruoyi.service; |
| | | |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.domain.bo.KnowledgeFragmentBo; |
| | | import org.ruoyi.domain.vo.KnowledgeFragmentVo; |
| | | |
| | |
| | | |
| | | import org.ruoyi.domain.bo.KnowledgeInfoBo; |
| | | import org.ruoyi.domain.vo.KnowledgeInfoVo; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | |
| | | |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | |
| | | |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | |
| | | |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.service.impl; |
| | | |
| | | import cn.hutool.core.lang.UUID; |
| | | import cn.hutool.json.JSONObject; |
| | | import com.google.gson.internal.LinkedTreeMap; |
| | | import io.weaviate.client.Config; |
| | | import io.weaviate.client.WeaviateClient; |
| | | import io.weaviate.client.base.Result; |
| | | import io.weaviate.client.v1.data.model.WeaviateObject; |
| | | import io.weaviate.client.v1.data.replication.model.ConsistencyLevel; |
| | | import io.weaviate.client.v1.filters.Operator; |
| | | import io.weaviate.client.v1.filters.WhereFilter; |
| | | import io.weaviate.client.v1.graphql.model.GraphQLResponse; |
| | | import io.weaviate.client.v1.graphql.query.argument.NearTextArgument; |
| | | import io.weaviate.client.v1.graphql.query.argument.NearVectorArgument; |
| | | import io.weaviate.client.v1.graphql.query.fields.Field; |
| | | import io.weaviate.client.v1.misc.model.Meta; |
| | | import io.weaviate.client.v1.misc.model.ReplicationConfig; |
| | | import io.weaviate.client.v1.misc.model.ShardingConfig; |
| | | import io.weaviate.client.v1.misc.model.VectorIndexConfig; |
| | | import io.weaviate.client.v1.schema.model.DataType; |
| | | import io.weaviate.client.v1.schema.model.Property; |
| | | import io.weaviate.client.v1.schema.model.Schema; |
| | | import io.weaviate.client.v1.schema.model.WeaviateClass; |
| | | import jakarta.annotation.PostConstruct; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.ruoyi.common.core.service.ConfigService; |
| | | import org.ruoyi.domain.vo.KnowledgeInfoVo; |
| | | import org.ruoyi.service.IKnowledgeInfoService; |
| | | import org.ruoyi.service.VectorStoreService; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | @Service |
| | | @Slf4j |
| | | public class WeaviateVectorStoreImpl implements VectorStoreService { |
| | | |
| | | private volatile String protocol; |
| | | private volatile String host; |
| | | private volatile String className; |
| | | |
| | | @Lazy |
| | | @Resource |
| | | private IKnowledgeInfoService knowledgeInfoService; |
| | | |
| | | @Lazy |
| | | @Resource |
| | | private ConfigService configService; |
| | | |
| | | @PostConstruct |
| | | public void loadConfig() { |
| | | this.protocol = configService.getConfigValue("weaviate", "protocol"); |
| | | this.host = configService.getConfigValue("weaviate", "host"); |
| | | this.className = configService.getConfigValue("weaviate", "classname"); |
| | | } |
| | | |
| | | public WeaviateClient getClient() { |
| | | Config config = new Config(protocol, host); |
| | | WeaviateClient client = new WeaviateClient(config); |
| | | return client; |
| | | } |
| | | |
| | | public Result<Meta> getMeta() { |
| | | WeaviateClient client = getClient(); |
| | | Result<Meta> meta = client.misc().metaGetter().run(); |
| | | if (meta.getError() == null) { |
| | | System.out.printf("meta.hostname: %s\n", meta.getResult().getHostname()); |
| | | System.out.printf("meta.version: %s\n", meta.getResult().getVersion()); |
| | | System.out.printf("meta.modules: %s\n", meta.getResult().getModules()); |
| | | } else { |
| | | System.out.printf("Error: %s\n", meta.getError().getMessages()); |
| | | } |
| | | return meta; |
| | | } |
| | | |
| | | public Result<Schema> getSchemas() { |
| | | WeaviateClient client = getClient(); |
| | | Result<Schema> result = client.schema().getter().run(); |
| | | if (result.hasErrors()) { |
| | | System.out.println(result.getError()); |
| | | } else { |
| | | System.out.println(result.getResult()); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | |
| | | public Result<Boolean> createSchema(String kid) { |
| | | WeaviateClient client = getClient(); |
| | | |
| | | VectorIndexConfig vectorIndexConfig = VectorIndexConfig.builder() |
| | | .distance("cosine") |
| | | .cleanupIntervalSeconds(300) |
| | | .efConstruction(128) |
| | | .maxConnections(64) |
| | | .vectorCacheMaxObjects(500000L) |
| | | .ef(-1) |
| | | .skip(false) |
| | | .dynamicEfFactor(8) |
| | | .dynamicEfMax(500) |
| | | .dynamicEfMin(100) |
| | | .flatSearchCutoff(40000) |
| | | .build(); |
| | | |
| | | ShardingConfig shardingConfig = ShardingConfig.builder() |
| | | .desiredCount(3) |
| | | .desiredVirtualCount(128) |
| | | .function("murmur3") |
| | | .key("_id") |
| | | .strategy("hash") |
| | | .virtualPerPhysical(128) |
| | | .build(); |
| | | |
| | | ReplicationConfig replicationConfig = ReplicationConfig.builder() |
| | | .factor(1) |
| | | .build(); |
| | | |
| | | JSONObject classModuleConfigValue = new JSONObject(); |
| | | classModuleConfigValue.put("vectorizeClassName", false); |
| | | JSONObject classModuleConfig = new JSONObject(); |
| | | classModuleConfig.put("text2vec-transformers", classModuleConfigValue); |
| | | |
| | | JSONObject propertyModuleConfigValueSkipTrue = new JSONObject(); |
| | | propertyModuleConfigValueSkipTrue.put("vectorizePropertyName", false); |
| | | propertyModuleConfigValueSkipTrue.put("skip", true); |
| | | JSONObject propertyModuleConfigSkipTrue = new JSONObject(); |
| | | propertyModuleConfigSkipTrue.put("text2vec-transformers", propertyModuleConfigValueSkipTrue); |
| | | |
| | | JSONObject propertyModuleConfigValueSkipFalse = new JSONObject(); |
| | | propertyModuleConfigValueSkipFalse.put("vectorizePropertyName", false); |
| | | propertyModuleConfigValueSkipFalse.put("skip", false); |
| | | JSONObject propertyModuleConfigSkipFalse = new JSONObject(); |
| | | propertyModuleConfigSkipFalse.put("text2vec-transformers", propertyModuleConfigValueSkipFalse); |
| | | |
| | | WeaviateClass clazz = WeaviateClass.builder() |
| | | .className(className + kid) |
| | | .description("local knowledge") |
| | | .vectorIndexType("hnsw") |
| | | .vectorizer("text2vec-transformers") |
| | | .shardingConfig(shardingConfig) |
| | | .vectorIndexConfig(vectorIndexConfig) |
| | | .replicationConfig(replicationConfig) |
| | | .moduleConfig(classModuleConfig) |
| | | .properties(new ArrayList() { |
| | | { |
| | | add(Property.builder() |
| | | .dataType(new ArrayList() { |
| | | { |
| | | add(DataType.TEXT); |
| | | } |
| | | }) |
| | | .name("content") |
| | | .description("The content of the local knowledge,for search") |
| | | .moduleConfig(propertyModuleConfigSkipFalse) |
| | | .build()); |
| | | add(Property.builder() |
| | | .dataType(new ArrayList() { |
| | | { |
| | | add(DataType.TEXT); |
| | | } |
| | | }) |
| | | .name("kid") |
| | | .description("The knowledge id of the local knowledge,for search") |
| | | .moduleConfig(propertyModuleConfigSkipTrue) |
| | | .build()); |
| | | add(Property.builder() |
| | | .dataType(new ArrayList() { |
| | | { |
| | | add(DataType.TEXT); |
| | | } |
| | | }) |
| | | .name("docId") |
| | | .description("The doc id of the local knowledge,for search") |
| | | .moduleConfig(propertyModuleConfigSkipTrue) |
| | | .build()); |
| | | add(Property.builder() |
| | | .dataType(new ArrayList() { |
| | | { |
| | | add(DataType.TEXT); |
| | | } |
| | | }) |
| | | .name("fid") |
| | | .description("The fragment id of the local knowledge,for search") |
| | | .moduleConfig(propertyModuleConfigSkipTrue) |
| | | .build()); |
| | | add(Property.builder() |
| | | .dataType(new ArrayList() { |
| | | { |
| | | add(DataType.TEXT); |
| | | } |
| | | }) |
| | | .name("uuid") |
| | | .description("The uuid id of the local knowledge fragment(same with id properties),for search") |
| | | .moduleConfig(propertyModuleConfigSkipTrue) |
| | | .build()); |
| | | } }) |
| | | .build(); |
| | | |
| | | Result<Boolean> result = client.schema().classCreator().withClass(clazz).run(); |
| | | if (result.hasErrors()) { |
| | | System.out.println(result.getError()); |
| | | } |
| | | System.out.println(result.getResult()); |
| | | return result; |
| | | } |
| | | |
| | | @Override |
| | | public void newSchema(String kid) { |
| | | createSchema(kid); |
| | | } |
| | | |
| | | @Override |
| | | public void removeByKidAndFid(String kid, String fid) { |
| | | List<String> resultList = new ArrayList<>(); |
| | | WeaviateClient client = getClient(); |
| | | Field fieldId = Field.builder().name("uuid").build(); |
| | | WhereFilter where = WhereFilter.builder() |
| | | .path(new String[]{"fid"}) |
| | | .operator(Operator.Equal) |
| | | .valueString(fid) |
| | | .build(); |
| | | Result<GraphQLResponse> result = client.graphQL().get() |
| | | .withClassName(className + kid) |
| | | .withFields(fieldId) |
| | | .withWhere(where) |
| | | .run(); |
| | | LinkedTreeMap<String, Object> t = (LinkedTreeMap<String, Object>) result.getResult().getData(); |
| | | LinkedTreeMap<String, ArrayList<LinkedTreeMap>> l = (LinkedTreeMap<String, ArrayList<LinkedTreeMap>>) t.get("Get"); |
| | | ArrayList<LinkedTreeMap> m = l.get(className + kid); |
| | | for (LinkedTreeMap linkedTreeMap : m) { |
| | | String uuid = linkedTreeMap.get("uuid").toString(); |
| | | resultList.add(uuid); |
| | | } |
| | | for (String uuid : resultList) { |
| | | Result<Boolean> deleteResult = client.data().deleter() |
| | | .withID(uuid) |
| | | .withClassName(className + kid) |
| | | .withConsistencyLevel(ConsistencyLevel.ALL) // default QUORUM |
| | | .run(); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void storeEmbeddings(List<String> chunkList, List<List<Double>> vectorList, String kid, String docId, List<String> fidList) { |
| | | WeaviateClient client = getClient(); |
| | | |
| | | for (int i = 0; i < Math.min(chunkList.size(), vectorList.size()); i++) { |
| | | List<Double> vector = vectorList.get(i); |
| | | Float[] vf = vector.stream().map(Double::floatValue).toArray(Float[]::new); |
| | | |
| | | Map<String, Object> dataSchema = new HashMap<>(); |
| | | dataSchema.put("content", chunkList.get(i)); |
| | | dataSchema.put("kid", kid); |
| | | dataSchema.put("docId", docId); |
| | | dataSchema.put("fid", fidList.get(i)); |
| | | String uuid = UUID.randomUUID().toString(); |
| | | dataSchema.put("uuid", uuid); |
| | | |
| | | Result<WeaviateObject> result = client.data().creator() |
| | | .withClassName(className + kid) |
| | | .withID(uuid) |
| | | .withVector(vf) |
| | | .withProperties(dataSchema) |
| | | .run(); |
| | | } |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public void removeByDocId(String kid, String docId) { |
| | | List<String> resultList = new ArrayList<>(); |
| | | WeaviateClient client = getClient(); |
| | | Field fieldId = Field.builder().name("uuid").build(); |
| | | WhereFilter where = WhereFilter.builder() |
| | | .path(new String[]{"docId"}) |
| | | .operator(Operator.Equal) |
| | | .valueString(docId) |
| | | .build(); |
| | | Result<GraphQLResponse> result = client.graphQL().get() |
| | | .withClassName(className + kid) |
| | | .withFields(fieldId) |
| | | .withWhere(where) |
| | | .run(); |
| | | LinkedTreeMap<String, Object> t = (LinkedTreeMap<String, Object>) result.getResult().getData(); |
| | | LinkedTreeMap<String, ArrayList<LinkedTreeMap>> l = (LinkedTreeMap<String, ArrayList<LinkedTreeMap>>) t.get("Get"); |
| | | ArrayList<LinkedTreeMap> m = l.get(className + kid); |
| | | for (LinkedTreeMap linkedTreeMap : m) { |
| | | String uuid = linkedTreeMap.get("uuid").toString(); |
| | | resultList.add(uuid); |
| | | } |
| | | for (String uuid : resultList) { |
| | | Result<Boolean> deleteResult = client.data().deleter() |
| | | .withID(uuid) |
| | | .withClassName(className + kid) |
| | | .withConsistencyLevel(ConsistencyLevel.ALL) // default QUORUM |
| | | .run(); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void removeByKid(String kid) { |
| | | WeaviateClient client = getClient(); |
| | | Result<Boolean> result = client.schema().classDeleter().withClassName(className + kid).run(); |
| | | if (result.hasErrors()) { |
| | | System.out.println("å é¤schema失败" + result.getError()); |
| | | } else { |
| | | System.out.println("å é¤schemaæå" + result.getResult()); |
| | | } |
| | | log.info("drop schema by kid, result = {}", result); |
| | | } |
| | | |
| | | @Override |
| | | public List<String> nearest(List<Double> queryVector, String kid) { |
| | | if (StringUtils.isBlank(kid)) { |
| | | return new ArrayList<String>(); |
| | | } |
| | | List<String> resultList = new ArrayList<>(); |
| | | Float[] vf = new Float[queryVector.size()]; |
| | | for (int j = 0; j < queryVector.size(); j++) { |
| | | Double value = queryVector.get(j); |
| | | vf[j] = value.floatValue(); |
| | | } |
| | | WeaviateClient client = getClient(); |
| | | Field contentField = Field.builder().name("content").build(); |
| | | Field _additional = Field.builder() |
| | | .name("_additional") |
| | | .fields(new Field[]{ |
| | | Field.builder().name("distance").build() |
| | | }).build(); |
| | | NearVectorArgument nearVector = NearVectorArgument.builder() |
| | | .vector(vf) |
| | | .distance(1.6f) // certainty = 1f - distance /2f |
| | | .build(); |
| | | KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(kid)); |
| | | Result<GraphQLResponse> result = client.graphQL().get() |
| | | .withClassName(className + kid) |
| | | .withFields(contentField, _additional) |
| | | .withNearVector(nearVector) |
| | | .withLimit(knowledgeInfoVo.getRetrieveLimit()) |
| | | .run(); |
| | | LinkedTreeMap<String, Object> t = (LinkedTreeMap<String, Object>) result.getResult().getData(); |
| | | LinkedTreeMap<String, ArrayList<LinkedTreeMap>> l = (LinkedTreeMap<String, ArrayList<LinkedTreeMap>>) t.get("Get"); |
| | | ArrayList<LinkedTreeMap> m = l.get(className + kid); |
| | | for (LinkedTreeMap linkedTreeMap : m) { |
| | | String content = linkedTreeMap.get("content").toString(); |
| | | resultList.add(content); |
| | | } |
| | | return resultList; |
| | | } |
| | | |
| | | @Override |
| | | public List<String> nearest(String query, String kid) { |
| | | if (StringUtils.isBlank(kid)) { |
| | | return new ArrayList<String>(); |
| | | } |
| | | List<String> resultList = new ArrayList<>(); |
| | | WeaviateClient client = getClient(); |
| | | Field contentField = Field.builder().name("content").build(); |
| | | Field _additional = Field.builder() |
| | | .name("_additional") |
| | | .fields(new Field[]{ |
| | | Field.builder().name("distance").build() |
| | | }).build(); |
| | | NearTextArgument nearText = client.graphQL().arguments().nearTextArgBuilder() |
| | | .concepts(new String[]{query}) |
| | | .distance(1.6f) // certainty = 1f - distance /2f |
| | | .build(); |
| | | KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(kid)); |
| | | Result<GraphQLResponse> result = client.graphQL().get() |
| | | .withClassName(className + kid) |
| | | .withFields(contentField, _additional) |
| | | .withNearText(nearText) |
| | | .withLimit(knowledgeInfoVo.getRetrieveLimit()) |
| | | .run(); |
| | | LinkedTreeMap<String, Object> t = (LinkedTreeMap<String, Object>) result.getResult().getData(); |
| | | LinkedTreeMap<String, ArrayList<LinkedTreeMap>> l = (LinkedTreeMap<String, ArrayList<LinkedTreeMap>>) t.get("Get"); |
| | | ArrayList<LinkedTreeMap> m = l.get(className + kid); |
| | | for (LinkedTreeMap linkedTreeMap : m) { |
| | | String content = linkedTreeMap.get("content").toString(); |
| | | resultList.add(content); |
| | | } |
| | | return resultList; |
| | | } |
| | | |
| | | public Result<Boolean> deleteSchema(String kid) { |
| | | WeaviateClient client = getClient(); |
| | | Result<Boolean> result = client.schema().classDeleter().withClassName(className + kid).run(); |
| | | if (result.hasErrors()) { |
| | | System.out.println(result.getError()); |
| | | } else { |
| | | System.out.println(result.getResult()); |
| | | } |
| | | return result; |
| | | } |
| | | } |
| | |
| | | import com.baomidou.mybatisplus.annotation.Version; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | |
| | | import java.io.Serial; |
| | | |
| | |
| | | /** |
| | | * è´è´£äºº |
| | | */ |
| | | private String leader; |
| | | private Long leader; |
| | | |
| | | /** |
| | | * èç³»çµè¯ |
| | |
| | | import org.ruoyi.common.core.constant.Constants; |
| | | import org.ruoyi.common.core.constant.UserConstants; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | |
| | | import java.io.Serial; |
| | | |
| | |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | |
| | | import java.io.Serial; |
| | | import java.util.Date; |
| | |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableLogic; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import org.ruoyi.system.domain.ChatConfig; |
| | | |
| | | /** |
| | |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | //import org.ruoyi.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import org.ruoyi.system.domain.SysConfig; |
| | | |
| | | /** |
| | |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import org.ruoyi.system.domain.SysDept; |
| | | |
| | | /** |
| | |
| | | |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import org.ruoyi.system.domain.SysDictData; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import jakarta.validation.constraints.NotBlank; |
| | |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import org.ruoyi.system.domain.SysDictType; |
| | | |
| | | /** |
| | |
| | | import com.fasterxml.jackson.annotation.JsonInclude; |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import org.ruoyi.system.domain.SysMenu; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import jakarta.validation.constraints.NotBlank; |
| | |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.common.core.xss.Xss; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import org.ruoyi.system.domain.SysNotice; |
| | | |
| | | /** |
| | |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.system.domain.SysNoticeState; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | |
| | | package org.ruoyi.system.domain.bo; |
| | | |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import org.ruoyi.system.domain.SysOss; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import lombok.Data; |
| | |
| | | |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import org.ruoyi.system.domain.SysOssConfig; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import jakarta.validation.constraints.NotBlank; |
| | |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import org.ruoyi.system.domain.SysPost; |
| | | |
| | | /** |
| | |
| | | import org.ruoyi.common.core.constant.UserConstants; |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import org.ruoyi.system.domain.SysRole; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import jakarta.validation.constraints.NotBlank; |
| | |
| | | |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import org.ruoyi.system.domain.SysTenant; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import jakarta.validation.constraints.NotBlank; |
| | |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import org.ruoyi.system.domain.SysTenantPackage; |
| | | |
| | | /** |
| | |
| | | import lombok.NoArgsConstructor; |
| | | import org.ruoyi.common.core.constant.UserConstants; |
| | | import org.ruoyi.common.core.xss.Xss; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import org.ruoyi.common.sensitive.annotation.Sensitive; |
| | | import org.ruoyi.common.sensitive.core.SensitiveStrategy; |
| | | import org.ruoyi.system.domain.SysUser; |
| | |
| | | package org.ruoyi.system.domain.bo; |
| | | |
| | | import org.ruoyi.common.core.xss.Xss; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import org.ruoyi.common.sensitive.annotation.Sensitive; |
| | | import org.ruoyi.common.sensitive.core.SensitiveStrategy; |
| | | import jakarta.validation.constraints.Email; |
| | |
| | | package org.ruoyi.system.mapper; |
| | | |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.system.domain.ChatConfig; |
| | | import org.ruoyi.system.domain.vo.ChatConfigVo; |
| | | |
| | |
| | | package org.ruoyi.system.mapper; |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.system.domain.SysConfig; |
| | | import org.ruoyi.system.domain.vo.SysConfigVo; |
| | | |
| | |
| | | import com.baomidou.mybatisplus.core.conditions.Wrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Constants; |
| | | import org.apache.ibatis.annotations.Param; |
| | | import org.ruoyi.common.mybatis.annotation.DataColumn; |
| | | import org.ruoyi.common.mybatis.annotation.DataPermission; |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.annotation.DataColumn; |
| | | import org.ruoyi.annotation.DataPermission; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.system.domain.SysDept; |
| | | import org.ruoyi.system.domain.vo.SysDeptVo; |
| | | |
| | |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import org.ruoyi.common.core.constant.UserConstants; |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.system.domain.SysDictData; |
| | | import org.ruoyi.system.domain.vo.SysDictDataVo; |
| | | |
| | |
| | | package org.ruoyi.system.mapper; |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.system.domain.SysDictType; |
| | | import org.ruoyi.system.domain.vo.SysDictTypeVo; |
| | | |
| | |
| | | package org.ruoyi.system.mapper; |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.system.domain.SysLogininfor; |
| | | import org.ruoyi.system.domain.vo.SysLogininforVo; |
| | | |
| | |
| | | import com.baomidou.mybatisplus.core.toolkit.Constants; |
| | | import org.apache.ibatis.annotations.Param; |
| | | import org.ruoyi.common.core.constant.UserConstants; |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.system.domain.SysMenu; |
| | | import org.ruoyi.system.domain.vo.SysMenuVo; |
| | | |
| | |
| | | package org.ruoyi.system.mapper; |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.system.domain.SysNotice; |
| | | import org.ruoyi.system.domain.vo.SysNoticeVo; |
| | | |
| | |
| | | |
| | | import org.ruoyi.system.domain.SysNoticeState; |
| | | import org.ruoyi.system.domain.vo.SysNoticeStateVo; |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | |
| | | /** |
| | | * ç¨æ·é
è¯»ç¶æMapperæ¥å£ |
| | |
| | | package org.ruoyi.system.mapper; |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.system.domain.SysOperLog; |
| | | import org.ruoyi.system.domain.vo.SysOperLogVo; |
| | | |
| | |
| | | package org.ruoyi.system.mapper; |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.system.domain.SysOssConfig; |
| | | import org.ruoyi.system.domain.vo.SysOssConfigVo; |
| | | |
| | |
| | | package org.ruoyi.system.mapper; |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.system.domain.SysOss; |
| | | import org.ruoyi.system.domain.vo.SysOssVo; |
| | | |
| | |
| | | package org.ruoyi.system.mapper; |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.system.domain.SysPost; |
| | | import org.ruoyi.system.domain.vo.SysPostVo; |
| | | |
| | |
| | | package org.ruoyi.system.mapper; |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.system.domain.SysRoleDept; |
| | | |
| | | /** |
| | |
| | | import com.baomidou.mybatisplus.core.toolkit.Constants; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import org.apache.ibatis.annotations.Param; |
| | | import org.ruoyi.common.mybatis.annotation.DataColumn; |
| | | import org.ruoyi.common.mybatis.annotation.DataPermission; |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.annotation.DataColumn; |
| | | import org.ruoyi.annotation.DataPermission; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.system.domain.SysRole; |
| | | import org.ruoyi.system.domain.vo.SysRoleVo; |
| | | |
| | |
| | | package org.ruoyi.system.mapper; |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.system.domain.SysRoleMenu; |
| | | |
| | | /** |
| | |
| | | package org.ruoyi.system.mapper; |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.system.domain.SysTenant; |
| | | import org.ruoyi.system.domain.vo.SysTenantVo; |
| | | |
| | |
| | | package org.ruoyi.system.mapper; |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.system.domain.SysTenantPackage; |
| | | import org.ruoyi.system.domain.vo.SysTenantPackageVo; |
| | | |
| | |
| | | import com.baomidou.mybatisplus.core.conditions.Wrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Constants; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import org.ruoyi.common.mybatis.annotation.DataColumn; |
| | | import org.ruoyi.common.mybatis.annotation.DataPermission; |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.annotation.DataColumn; |
| | | import org.ruoyi.annotation.DataPermission; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.system.domain.SysUser; |
| | | import org.ruoyi.system.domain.bo.SysUserBo; |
| | | import org.ruoyi.system.domain.vo.SysUserVo; |
| | |
| | | package org.ruoyi.system.mapper; |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.system.domain.SysUserPost; |
| | | |
| | | /** |
| | |
| | | package org.ruoyi.system.mapper; |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.system.domain.SysUserRole; |
| | | |
| | | import java.util.List; |
| | |
| | | package org.ruoyi.system.service; |
| | | |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.system.domain.bo.ChatConfigBo; |
| | | import org.ruoyi.system.domain.vo.ChatConfigVo; |
| | | |
| | |
| | | package org.ruoyi.system.service; |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.system.domain.bo.SysConfigBo; |
| | | import org.ruoyi.system.domain.vo.SysConfigVo; |
| | | |
| | |
| | | package org.ruoyi.system.service; |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.system.domain.bo.SysDictDataBo; |
| | | import org.ruoyi.system.domain.vo.SysDictDataVo; |
| | | |
| | |
| | | package org.ruoyi.system.service; |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.system.domain.bo.SysDictTypeBo; |
| | | import org.ruoyi.system.domain.vo.SysDictDataVo; |
| | | import org.ruoyi.system.domain.vo.SysDictTypeVo; |
| | |
| | | package org.ruoyi.system.service; |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.system.domain.bo.SysLogininforBo; |
| | | import org.ruoyi.system.domain.vo.SysLogininforVo; |
| | | |
| | |
| | | package org.ruoyi.system.service; |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.system.domain.SysNotice; |
| | | import org.ruoyi.system.domain.bo.SysNoticeBo; |
| | | import org.ruoyi.system.domain.vo.SysNoticeVo; |
| | |
| | | package org.ruoyi.system.service; |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.system.domain.bo.SysNoticeStateBo; |
| | | import org.ruoyi.system.domain.vo.SysNoticeStateVo; |
| | | |
| | |
| | | package org.ruoyi.system.service; |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.system.domain.bo.SysOperLogBo; |
| | | import org.ruoyi.system.domain.vo.SysOperLogVo; |
| | | |
| | |
| | | package org.ruoyi.system.service; |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.system.domain.bo.SysOssConfigBo; |
| | | import org.ruoyi.system.domain.vo.SysOssConfigVo; |
| | | |
| | |
| | | package org.ruoyi.system.service; |
| | | |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.system.domain.bo.SysOssBo; |
| | | import org.ruoyi.system.domain.vo.SysOssVo; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | |
| | | package org.ruoyi.system.service; |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.system.domain.bo.SysPostBo; |
| | | import org.ruoyi.system.domain.vo.SysPostVo; |
| | | |
| | |
| | | package org.ruoyi.system.service; |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.system.domain.SysUserRole; |
| | | import org.ruoyi.system.domain.bo.SysRoleBo; |
| | | import org.ruoyi.system.domain.vo.SysRoleVo; |
| | |
| | | package org.ruoyi.system.service; |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.system.domain.bo.SysTenantPackageBo; |
| | | import org.ruoyi.system.domain.vo.SysTenantPackageVo; |
| | | |
| | |
| | | package org.ruoyi.system.service; |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | |
| | | |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.system.domain.bo.SysTenantBo; |
| | | import org.ruoyi.system.domain.vo.SysTenantVo; |
| | | |
| | |
| | | /** |
| | | * åæ¥ç§æ·å¥é¤ |
| | | */ |
| | | Boolean syncTenantPackage(String tenantId, String packageId); |
| | | Boolean syncTenantPackage(String tenantId, Long packageId); |
| | | |
| | | /** |
| | | * åæ¥ç§æ·åå
¸ |
| | | */ |
| | | void syncTenantDict(); |
| | | } |
| | |
| | | package org.ruoyi.system.service; |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.system.domain.SysUser; |
| | | import org.ruoyi.system.domain.bo.SysUserBo; |
| | | import org.ruoyi.system.domain.vo.SysUserVo; |
| | |
| | | import org.ruoyi.common.core.service.ConfigService; |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.system.domain.ChatConfig; |
| | | import org.ruoyi.system.domain.bo.ChatConfigBo; |
| | | import org.ruoyi.system.domain.vo.ChatConfigVo; |
| | |
| | | import org.ruoyi.common.core.exception.ServiceException; |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.redis.utils.CacheUtils; |
| | | import org.ruoyi.common.tenant.helper.TenantHelper; |
| | | import org.ruoyi.system.domain.SysConfig; |
| | |
| | | import cn.hutool.core.convert.Convert; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import org.ruoyi.common.core.utils.StreamUtils; |
| | | import org.ruoyi.common.mybatis.helper.DataBaseHelper; |
| | | import org.ruoyi.helper.DataBaseHelper; |
| | | import org.ruoyi.system.domain.SysDept; |
| | | import org.ruoyi.system.domain.SysRoleDept; |
| | | import org.ruoyi.system.mapper.SysDeptMapper; |
| | |
| | | import org.ruoyi.common.core.utils.SpringUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.core.utils.TreeBuildUtils; |
| | | import org.ruoyi.common.mybatis.helper.DataBaseHelper; |
| | | import org.ruoyi.helper.DataBaseHelper; |
| | | import org.ruoyi.common.redis.utils.CacheUtils; |
| | | import org.ruoyi.common.satoken.utils.LoginHelper; |
| | | import org.ruoyi.system.domain.SysDept; |
| | |
| | | import org.ruoyi.common.core.exception.ServiceException; |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.redis.utils.CacheUtils; |
| | | import org.ruoyi.system.domain.SysDictData; |
| | | import org.ruoyi.system.domain.bo.SysDictDataBo; |
| | |
| | | import org.ruoyi.common.core.utils.SpringUtils; |
| | | import org.ruoyi.common.core.utils.StreamUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.redis.utils.CacheUtils; |
| | | import org.ruoyi.system.domain.SysDictData; |
| | | import org.ruoyi.system.domain.SysDictType; |
| | |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.core.utils.ip.AddressUtils; |
| | | import org.ruoyi.common.log.event.LogininforEvent; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.system.domain.SysLogininfor; |
| | | import org.ruoyi.system.domain.bo.SysLogininforBo; |
| | | import org.ruoyi.system.domain.vo.SysLogininforVo; |
| | |
| | | List<Long> parentIds = null; |
| | | if (tenantPackage.getMenuCheckStrictly()) { |
| | | parentIds = baseMapper.selectObjs(new LambdaQueryWrapper<SysMenu>() |
| | | .select(SysMenu::getParentId) |
| | | .in(SysMenu::getMenuId, menuIds), Convert::toLong); |
| | | .select(SysMenu::getParentId) |
| | | .in(SysMenu::getMenuId, menuIds), x -> {return Convert.toLong(x);}); |
| | | } |
| | | return baseMapper.selectObjs(new LambdaQueryWrapper<SysMenu>() |
| | | .in(SysMenu::getMenuId, menuIds) |
| | | .notIn(CollUtil.isNotEmpty(parentIds), SysMenu::getMenuId, parentIds), Convert::toLong); |
| | | .in(SysMenu::getMenuId, menuIds) |
| | | .notIn(CollUtil.isNotEmpty(parentIds), SysMenu::getMenuId, parentIds), x -> {return Convert.toLong(x);}); |
| | | } |
| | | |
| | | /** |
| | |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.satoken.utils.LoginHelper; |
| | | import org.ruoyi.system.domain.SysNotice; |
| | | import org.ruoyi.system.domain.SysNoticeState; |
| | |
| | | |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.core.utils.ip.AddressUtils; |
| | | import org.ruoyi.common.log.event.OperLogEvent; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.system.domain.SysOperLog; |
| | | import org.ruoyi.system.domain.bo.SysOperLogBo; |
| | | import org.ruoyi.system.domain.vo.SysOperLogVo; |
| | |
| | | import org.ruoyi.common.core.utils.StreamUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.json.utils.JsonUtils; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.oss.constant.OssConstant; |
| | | import org.ruoyi.common.redis.utils.CacheUtils; |
| | | import org.ruoyi.common.redis.utils.RedisUtils; |
| | |
| | | import org.ruoyi.common.core.utils.StreamUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.core.utils.file.FileUtils; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.oss.core.OssClient; |
| | | import org.ruoyi.common.oss.entity.UploadResult; |
| | | import org.ruoyi.common.oss.enumd.AccessPolicyType; |
| | |
| | | import org.ruoyi.common.core.exception.ServiceException; |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.system.domain.SysPost; |
| | | import org.ruoyi.system.domain.SysUserPost; |
| | | import org.ruoyi.system.domain.bo.SysPostBo; |
| | |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StreamUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.satoken.utils.LoginHelper; |
| | | import org.ruoyi.system.domain.SysRole; |
| | | import org.ruoyi.system.domain.SysRoleDept; |
| | |
| | | import org.ruoyi.common.core.exception.ServiceException; |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.system.domain.SysTenant; |
| | | import org.ruoyi.system.domain.SysTenantPackage; |
| | | import org.ruoyi.system.domain.bo.SysTenantPackageBo; |
| | |
| | | package org.ruoyi.system.service.impl; |
| | | |
| | | import cn.dev33.satoken.secure.BCrypt; |
| | | import cn.hutool.core.bean.BeanUtil; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.convert.Convert; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import cn.hutool.core.util.RandomUtil; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import lombok.RequiredArgsConstructor; |
| | | |
| | | import org.ruoyi.common.core.constant.CacheNames; |
| | | import org.ruoyi.common.core.constant.Constants; |
| | | import org.ruoyi.common.core.constant.SystemConstants; |
| | | import org.ruoyi.common.core.constant.TenantConstants; |
| | | import org.ruoyi.common.core.exception.ServiceException; |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.SpringUtils; |
| | | import org.ruoyi.common.core.utils.StreamUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.redis.utils.CacheUtils; |
| | | import org.ruoyi.common.tenant.helper.TenantHelper; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.system.domain.*; |
| | | import org.ruoyi.system.domain.bo.SysTenantBo; |
| | | import org.ruoyi.system.domain.vo.SysTenantVo; |
| | | import org.ruoyi.system.mapper.*; |
| | | import org.ruoyi.system.service.ISysTenantService; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.cache.annotation.CacheEvict; |
| | | import org.springframework.cache.annotation.Cacheable; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.ruoyi.common.core.utils.SpringUtils; |
| | | import org.ruoyi.common.tenant.core.TenantEntity; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Collection; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * ç§æ·Serviceä¸å¡å±å¤ç |
| | |
| | | lqw.eq(bo.getExpireTime() != null, SysTenant::getExpireTime, bo.getExpireTime()); |
| | | lqw.eq(bo.getAccountCount() != null, SysTenant::getAccountCount, bo.getAccountCount()); |
| | | lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysTenant::getStatus, bo.getStatus()); |
| | | lqw.orderByAsc(SysTenant::getId); |
| | | return lqw; |
| | | } |
| | | |
| | |
| | | |
| | | // è·åææç§æ·ç¼å· |
| | | List<String> tenantIds = baseMapper.selectObjs( |
| | | new LambdaQueryWrapper<SysTenant>().select(SysTenant::getTenantId), Convert::toStr); |
| | | new LambdaQueryWrapper<SysTenant>().select(SysTenant::getTenantId), x -> { |
| | | return Convert.toStr(x); |
| | | }); |
| | | String tenantId = generateTenantId(tenantIds); |
| | | add.setTenantId(tenantId); |
| | | boolean flag = baseMapper.insert(add) > 0; |
| | |
| | | SysDept dept = new SysDept(); |
| | | dept.setTenantId(tenantId); |
| | | dept.setDeptName(bo.getCompanyName()); |
| | | dept.setLeader(bo.getUsername()); |
| | | dept.setParentId(Constants.TOP_PARENT_ID); |
| | | dept.setAncestors(Constants.TOP_PARENT_ID.toString()); |
| | | deptMapper.insert(dept); |
| | |
| | | user.setPassword(BCrypt.hashpw(bo.getPassword())); |
| | | user.setDeptId(deptId); |
| | | userMapper.insert(user); |
| | | //æ°å¢ç³»ç»ç¨æ·åï¼é»è®¤å½åç¨æ·ä¸ºé¨é¨çè´è´£äºº |
| | | SysDept sd = new SysDept(); |
| | | sd.setLeader(user.getUserId()); |
| | | sd.setDeptId(deptId); |
| | | deptMapper.updateById(sd); |
| | | |
| | | // ç¨æ·åè§è²å
³è表 |
| | | SysUserRole userRole = new SysUserRole(); |
| | |
| | | |
| | | String defaultTenantId = TenantConstants.DEFAULT_TENANT_ID; |
| | | List<SysDictType> dictTypeList = dictTypeMapper.selectList( |
| | | new LambdaQueryWrapper<SysDictType>().eq(SysDictType::getTenantId, defaultTenantId)); |
| | | new LambdaQueryWrapper<SysDictType>().eq(SysDictType::getTenantId, defaultTenantId)); |
| | | List<SysDictData> dictDataList = dictDataMapper.selectList( |
| | | new LambdaQueryWrapper<SysDictData>().eq(SysDictData::getTenantId, defaultTenantId)); |
| | | new LambdaQueryWrapper<SysDictData>().eq(SysDictData::getTenantId, defaultTenantId)); |
| | | for (SysDictType dictType : dictTypeList) { |
| | | dictType.setDictId(null); |
| | | dictType.setTenantId(tenantId); |
| | | dictType.setCreateDept(null); |
| | | dictType.setCreateBy(null); |
| | | dictType.setCreateTime(null); |
| | | dictType.setUpdateBy(null); |
| | | dictType.setUpdateTime(null); |
| | | } |
| | | for (SysDictData dictData : dictDataList) { |
| | | dictData.setDictCode(null); |
| | | dictData.setTenantId(tenantId); |
| | | dictData.setCreateDept(null); |
| | | dictData.setCreateBy(null); |
| | | dictData.setCreateTime(null); |
| | | dictData.setUpdateBy(null); |
| | | dictData.setUpdateTime(null); |
| | | } |
| | | dictTypeMapper.insertBatch(dictTypeList); |
| | | dictDataMapper.insertBatch(dictDataList); |
| | | |
| | | List<SysConfig> sysConfigList = configMapper.selectList( |
| | | new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getTenantId, defaultTenantId)); |
| | | new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getTenantId, defaultTenantId)); |
| | | for (SysConfig config : sysConfigList) { |
| | | config.setConfigId(null); |
| | | config.setTenantId(tenantId); |
| | | config.setCreateDept(null); |
| | | config.setCreateBy(null); |
| | | config.setCreateTime(null); |
| | | config.setUpdateBy(null); |
| | | config.setUpdateTime(null); |
| | | } |
| | | configMapper.insertBatch(sysConfigList); |
| | | |
| | | return true; |
| | | } |
| | | |
| | |
| | | String numbers = RandomUtil.randomNumbers(6); |
| | | // 夿æ¯å¦åå¨ï¼å¦æåå¨åéæ°çæ |
| | | if (tenantIds.contains(numbers)) { |
| | | generateTenantId(tenantIds); |
| | | return generateTenantId(tenantIds); |
| | | } |
| | | return numbers; |
| | | } |
| | |
| | | role.setRoleName(TenantConstants.TENANT_ADMIN_ROLE_NAME); |
| | | role.setRoleKey(TenantConstants.TENANT_ADMIN_ROLE_KEY); |
| | | role.setRoleSort(1); |
| | | role.setStatus(TenantConstants.NORMAL); |
| | | role.setStatus("0"); |
| | | roleMapper.insert(role); |
| | | Long roleId = role.getRoleId(); |
| | | |
| | |
| | | @CacheEvict(cacheNames = CacheNames.SYS_TENANT, key = "#bo.tenantId") |
| | | @Override |
| | | public int updateTenantStatus(SysTenantBo bo) { |
| | | SysTenant tenant = MapstructUtils.convert(bo, SysTenant.class); |
| | | SysTenant tenant = new SysTenant(); |
| | | tenant.setId(bo.getId()); |
| | | tenant.setStatus(bo.getStatus()); |
| | | return baseMapper.updateById(tenant); |
| | | } |
| | | |
| | |
| | | throw new ServiceException("è¶
ç®¡ç§æ·ä¸è½å é¤"); |
| | | } |
| | | } |
| | | return baseMapper.deleteBatchIds(ids) > 0; |
| | | return baseMapper.deleteByIds(ids) > 0; |
| | | } |
| | | |
| | | /** |
| | |
| | | @Override |
| | | public boolean checkCompanyNameUnique(SysTenantBo bo) { |
| | | boolean exist = baseMapper.exists(new LambdaQueryWrapper<SysTenant>() |
| | | .eq(SysTenant::getCompanyName, bo.getCompanyName()) |
| | | .ne(ObjectUtil.isNotNull(bo.getTenantId()), SysTenant::getTenantId, bo.getTenantId())); |
| | | .eq(SysTenant::getCompanyName, bo.getCompanyName()) |
| | | .ne(ObjectUtil.isNotNull(bo.getTenantId()), SysTenant::getTenantId, bo.getTenantId())); |
| | | return !exist; |
| | | } |
| | | |
| | |
| | | */ |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Boolean syncTenantPackage(String tenantId, String packageId) { |
| | | public Boolean syncTenantPackage(String tenantId, Long packageId) { |
| | | SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); |
| | | List<SysRole> roles = roleMapper.selectList( |
| | | new LambdaQueryWrapper<SysRole>().eq(SysRole::getTenantId, tenantId)); |
| | | new LambdaQueryWrapper<SysRole>().eq(SysRole::getTenantId, tenantId)); |
| | | List<Long> roleIds = new ArrayList<>(roles.size() - 1); |
| | | List<Long> menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); |
| | | roles.forEach(item -> { |
| | |
| | | }); |
| | | if (!roleIds.isEmpty()) { |
| | | roleMenuMapper.delete( |
| | | new LambdaQueryWrapper<SysRoleMenu>().in(SysRoleMenu::getRoleId, roleIds).notIn(!menuIds.isEmpty(), SysRoleMenu::getMenuId, menuIds)); |
| | | new LambdaQueryWrapper<SysRoleMenu>().in(SysRoleMenu::getRoleId, roleIds).notIn(!menuIds.isEmpty(), SysRoleMenu::getMenuId, menuIds)); |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | /** |
| | | * åæ¥ç§æ·åå
¸ |
| | | */ |
| | | @Transactional(rollbackFor = Exception.class) |
| | | @Override |
| | | public void syncTenantDict() { |
| | | // æ¥è¯¢è¶
管 ææåå
¸æ°æ® |
| | | List<SysDictType> dictTypeList = new ArrayList<>(); |
| | | List<SysDictData> dictDataList = new ArrayList<>(); |
| | | TenantHelper.ignore(() -> { |
| | | dictTypeList.addAll(dictTypeMapper.selectList()); |
| | | dictDataList.addAll(dictDataMapper.selectList()); |
| | | }); |
| | | Map<String, List<SysDictType>> typeMap = StreamUtils.groupByKey(dictTypeList, TenantEntity::getTenantId); |
| | | Map<String, Map<String, List<SysDictData>>> typeDataMap = StreamUtils.groupBy2Key( |
| | | dictDataList, TenantEntity::getTenantId, SysDictData::getDictType); |
| | | // 管çç§æ·åå
¸æ°æ® |
| | | List<SysDictType> defaultTypeMap = typeMap.get(TenantConstants.DEFAULT_TENANT_ID); |
| | | Map<String, List<SysDictData>> defaultTypeDataMap = typeDataMap.get(TenantConstants.DEFAULT_TENANT_ID); |
| | | |
| | | // è·åææç§æ·ç¼å· |
| | | List<String> tenantIds = baseMapper.selectObjs( |
| | | new LambdaQueryWrapper<SysTenant>().select(SysTenant::getTenantId) |
| | | .eq(SysTenant::getStatus, SystemConstants.NORMAL), x -> { |
| | | return Convert.toStr(x); |
| | | }); |
| | | List<SysDictType> saveTypeList = new ArrayList<>(); |
| | | List<SysDictData> saveDataList = new ArrayList<>(); |
| | | Set<String> set = new HashSet<>(); |
| | | for (String tenantId : tenantIds) { |
| | | if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) { |
| | | continue; |
| | | } |
| | | for (SysDictType dictType : defaultTypeMap) { |
| | | List<String> typeList = StreamUtils.toList(typeMap.get(tenantId), SysDictType::getDictType); |
| | | List<SysDictData> dataList = defaultTypeDataMap.get(dictType.getDictType()); |
| | | if (typeList.contains(dictType.getDictType())) { |
| | | List<SysDictData> dataListTenant = typeDataMap.get(tenantId).get(dictType.getDictType()); |
| | | Map<String, SysDictData> map = StreamUtils.toIdentityMap(dataListTenant, SysDictData::getDictValue); |
| | | for (SysDictData dictData : dataList) { |
| | | if (!map.containsKey(dictData.getDictValue())) { |
| | | SysDictData data = BeanUtil.toBean(dictData, SysDictData.class); |
| | | // 设置åå
¸ç¼ç 为 null |
| | | data.setDictCode(null); |
| | | data.setTenantId(tenantId); |
| | | data.setCreateTime(null); |
| | | data.setUpdateTime(null); |
| | | data.setCreateDept(null); |
| | | data.setCreateBy(null); |
| | | data.setUpdateBy(null); |
| | | set.add(tenantId); |
| | | saveDataList.add(data); |
| | | } |
| | | } |
| | | } else { |
| | | SysDictType type = BeanUtil.toBean(dictType, SysDictType.class); |
| | | type.setDictId(null); |
| | | type.setTenantId(tenantId); |
| | | type.setCreateTime(null); |
| | | type.setUpdateTime(null); |
| | | set.add(tenantId); |
| | | saveTypeList.add(type); |
| | | if (CollUtil.isNotEmpty(dataList)) { |
| | | // çéåº dictType 对åºç data |
| | | for (SysDictData dictData : dataList) { |
| | | SysDictData data = BeanUtil.toBean(dictData, SysDictData.class); |
| | | // 设置åå
¸ç¼ç 为 null |
| | | data.setDictCode(null); |
| | | data.setTenantId(tenantId); |
| | | data.setCreateTime(null); |
| | | data.setUpdateTime(null); |
| | | data.setCreateDept(null); |
| | | data.setCreateBy(null); |
| | | data.setUpdateBy(null); |
| | | set.add(tenantId); |
| | | saveDataList.add(data); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | TenantHelper.ignore(() -> { |
| | | if (CollUtil.isNotEmpty(saveTypeList)) { |
| | | dictTypeMapper.insertBatch(saveTypeList); |
| | | } |
| | | if (CollUtil.isNotEmpty(saveDataList)) { |
| | | dictDataMapper.insertBatch(saveDataList); |
| | | } |
| | | }); |
| | | for (String tenantId : set) { |
| | | TenantHelper.dynamic(tenantId, () -> CacheUtils.clear(CacheNames.SYS_DICT)); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StreamUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.helper.DataBaseHelper; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.helper.DataBaseHelper; |
| | | import org.ruoyi.common.satoken.utils.LoginHelper; |
| | | import org.ruoyi.system.domain.SysDept; |
| | | import org.ruoyi.system.domain.SysUser; |
| | |
| | | </description> |
| | | |
| | | <modules> |
| | | <module>ruoyi-demo</module> |
| | | <module>ruoyi-chat</module> |
| | | <module>ruoyi-system</module> |
| | | <module>ruoyi-generator</module> |
| | | <module>ruoyi-admin</module> |
| | | </modules> |
| | | |
| | | <properties> |
| | |
| | | <groupId>org.ruoyi</groupId> |
| | | <artifactId>ruoyi-system-api</artifactId> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>org.springframework.ai</groupId> |
| | | <artifactId>spring-ai-ollama</artifactId> |
| | | <version>1.0.0-M6</version> |
| | | <scope>compile</scope> |
| | | </dependency> |
| | | |
| | | </dependencies> |
| | | |
| | |
| | | import cn.dev33.satoken.annotation.SaCheckPermission; |
| | | import org.ruoyi.common.excel.utils.ExcelUtil; |
| | | import org.ruoyi.common.idempotent.annotation.RepeatSubmit; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.domain.bo.ChatAgentManageBo; |
| | | import org.ruoyi.domain.vo.ChatAgentManageVo; |
| | |
| | | import org.springframework.web.bind.annotation.*; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.common.core.domain.R; |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | |
| | | import cn.dev33.satoken.annotation.SaCheckPermission; |
| | | import org.ruoyi.common.excel.utils.ExcelUtil; |
| | | import org.ruoyi.common.idempotent.annotation.RepeatSubmit; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.domain.bo.ChatAppStoreBo; |
| | | import org.ruoyi.domain.vo.ChatAppStoreVo; |
| | | import org.ruoyi.service.IChatAppStoreService; |
| | |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.common.core.domain.R; |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | |
| | | import cn.dev33.satoken.annotation.SaCheckPermission; |
| | | import org.ruoyi.common.excel.utils.ExcelUtil; |
| | | import org.ruoyi.common.idempotent.annotation.RepeatSubmit; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.system.domain.bo.ChatConfigBo; |
| | | import org.ruoyi.system.domain.vo.ChatConfigVo; |
| | | import org.ruoyi.system.service.IChatConfigService; |
| | |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.common.core.domain.R; |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | |
| | | @Validated |
| | | @RequiredArgsConstructor |
| | | @RestController |
| | | @RequestMapping("/system/config") |
| | | @RequestMapping("/system/chatConfig") |
| | | public class ChatConfigController extends BaseController { |
| | | |
| | | private final IChatConfigService chatConfigService; |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.chat.controller.chat; |
| | | |
| | | |
| | | import jakarta.servlet.http.HttpServletRequest; |
| | | import jakarta.validation.Valid; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.ruoyi.chat.service.chat.ISseService; |
| | | import org.ruoyi.common.chat.request.ChatRequest; |
| | | import org.ruoyi.common.chat.entity.Tts.TextToSpeech; |
| | | import org.ruoyi.common.chat.entity.files.UploadFileResponse; |
| | | import org.ruoyi.common.chat.entity.whisper.WhisperResponse; |
| | | import org.ruoyi.common.core.domain.R; |
| | | import org.ruoyi.common.core.domain.model.LoginUser; |
| | | import org.ruoyi.common.core.exception.base.BaseException; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.satoken.utils.LoginHelper; |
| | | import org.ruoyi.domain.bo.ChatMessageBo; |
| | | import org.ruoyi.domain.vo.ChatMessageVo; |
| | | import org.ruoyi.service.IChatMessageService; |
| | | import org.springframework.core.io.Resource; |
| | | import org.springframework.http.ResponseEntity; |
| | | import org.springframework.stereotype.Controller; |
| | | import org.springframework.web.bind.annotation.*; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; |
| | | |
| | | |
| | | /** |
| | | * æè¿°ï¼è天管ç |
| | | * |
| | | * @author ageerle@163.com |
| | | * @date 2023-03-01 |
| | | */ |
| | | @Controller |
| | | @Slf4j |
| | | @RequiredArgsConstructor |
| | | @RequestMapping("/chat") |
| | | public class ChatController { |
| | | |
| | | private final ISseService sseService; |
| | | |
| | | private final IChatMessageService chatMessageService; |
| | | |
| | | /** |
| | | * è天æ¥å£ |
| | | */ |
| | | @PostMapping("/send") |
| | | @ResponseBody |
| | | public SseEmitter sseChat(@RequestBody @Valid ChatRequest chatRequest, HttpServletRequest request) { |
| | | return sseService.sseChat(chatRequest,request); |
| | | } |
| | | |
| | | /** |
| | | * ä¸ä¼ æä»¶ |
| | | */ |
| | | @PostMapping("/upload") |
| | | @ResponseBody |
| | | public UploadFileResponse upload(@RequestPart("file") MultipartFile file) { |
| | | return sseService.upload(file); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * è¯é³è½¬ææ¬ |
| | | * |
| | | * @param file |
| | | */ |
| | | @PostMapping("/audio") |
| | | @ResponseBody |
| | | public WhisperResponse audio(@RequestParam("file") MultipartFile file) { |
| | | WhisperResponse whisperResponse = sseService.speechToTextTranscriptionsV2(file); |
| | | return whisperResponse; |
| | | } |
| | | |
| | | /** |
| | | * ææ¬è½¬è¯é³ |
| | | * |
| | | * @param textToSpeech |
| | | */ |
| | | @PostMapping("/speech") |
| | | @ResponseBody |
| | | public ResponseEntity<Resource> speech(@RequestBody TextToSpeech textToSpeech) { |
| | | return sseService.textToSpeed(textToSpeech); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * èå¤©è®°å½ |
| | | */ |
| | | @PostMapping("/chatList") |
| | | @ResponseBody |
| | | public R<TableDataInfo<ChatMessageVo>> list(@RequestBody @Valid ChatMessageBo chatRequest, @RequestBody PageQuery pageQuery) { |
| | | // é»è®¤æ¥è¯¢å½åç»å½ç¨æ·æ¶æ¯è®°å½ |
| | | LoginUser loginUser = LoginHelper.getLoginUser(); |
| | | if (loginUser == null) { |
| | | throw new BaseException("ç¨æ·æªç»å½ï¼"); |
| | | } |
| | | chatRequest.setUserId(loginUser.getUserId()); |
| | | TableDataInfo<ChatMessageVo> chatMessageVoTableDataInfo = chatMessageService.queryPageList(chatRequest, pageQuery); |
| | | return R.ok(chatMessageVoTableDataInfo); |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.dev33.satoken.annotation.SaCheckPermission; |
| | | import org.ruoyi.common.excel.utils.ExcelUtil; |
| | | import org.ruoyi.common.idempotent.annotation.RepeatSubmit; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.domain.bo.ChatGptsBo; |
| | | import org.ruoyi.domain.vo.ChatGptsVo; |
| | | import org.ruoyi.service.IChatGptsService; |
| | |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.common.core.domain.R; |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | |
| | | import cn.dev33.satoken.annotation.SaCheckPermission; |
| | | import org.ruoyi.common.excel.utils.ExcelUtil; |
| | | import org.ruoyi.common.idempotent.annotation.RepeatSubmit; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.domain.bo.ChatMessageBo; |
| | | import org.ruoyi.domain.vo.ChatMessageVo; |
| | | import org.ruoyi.service.IChatMessageService; |
| | |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.common.core.domain.R; |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | |
| | | import org.ruoyi.chat.service.chat.UserModelService; |
| | | import org.ruoyi.common.excel.utils.ExcelUtil; |
| | | import org.ruoyi.common.idempotent.annotation.RepeatSubmit; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.domain.bo.ChatModelBo; |
| | | import org.ruoyi.domain.vo.ChatModelVo; |
| | | import org.ruoyi.service.IChatModelService; |
| | |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.common.core.domain.R; |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | |
| | | import cn.dev33.satoken.annotation.SaCheckPermission; |
| | | import org.ruoyi.common.excel.utils.ExcelUtil; |
| | | import org.ruoyi.common.idempotent.annotation.RepeatSubmit; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.domain.bo.ChatPackagePlanBo; |
| | | import org.ruoyi.domain.vo.ChatPackagePlanVo; |
| | | import org.ruoyi.service.IChatPackagePlanService; |
| | |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.common.core.domain.R; |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | |
| | | import cn.dev33.satoken.annotation.SaCheckPermission; |
| | | import org.ruoyi.common.excel.utils.ExcelUtil; |
| | | import org.ruoyi.common.idempotent.annotation.RepeatSubmit; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.domain.bo.ChatPayOrderBo; |
| | | import org.ruoyi.domain.vo.ChatPayOrderVo; |
| | | import org.ruoyi.service.IChatPayOrderService; |
| | |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.common.core.domain.R; |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | |
| | | import cn.dev33.satoken.annotation.SaCheckPermission; |
| | | import org.ruoyi.common.excel.utils.ExcelUtil; |
| | | import org.ruoyi.common.idempotent.annotation.RepeatSubmit; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.domain.bo.ChatPluginBo; |
| | | import org.ruoyi.domain.vo.ChatPluginVo; |
| | | import org.ruoyi.service.IChatPluginService; |
| | |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.common.core.domain.R; |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | |
| | | import jakarta.validation.constraints.*; |
| | | import cn.dev33.satoken.annotation.SaCheckPermission; |
| | | import org.ruoyi.common.idempotent.annotation.RepeatSubmit; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.domain.bo.ChatVoucherBo; |
| | | import org.ruoyi.domain.vo.ChatVoucherVo; |
| | | import org.ruoyi.service.IChatVoucherService; |
| | |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.common.core.domain.R; |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.chat.controller.tripartite; |
| | | |
| | | import cn.hutool.json.JSONUtil; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import okhttp3.Request; |
| | | import org.apache.commons.lang3.math.NumberUtils; |
| | | import org.ruoyi.chat.domain.InsightFace; |
| | | import org.ruoyi.chat.service.chat.IChatCostService; |
| | | import org.ruoyi.chat.util.MjOkHttpUtil; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | |
| | | @Api(tags = "任塿¥è¯¢") |
| | | @RestController |
| | | @RequestMapping("/mj") |
| | | @RequiredArgsConstructor |
| | | @Slf4j |
| | | public class FaceController { |
| | | |
| | | private final IChatCostService chatCostService; |
| | | |
| | | private final MjOkHttpUtil mjOkHttpUtil; |
| | | |
| | | @ApiOperation(value = "æ¢è¸") |
| | | @PostMapping("/insight-face/swap") |
| | | public String insightFace(@RequestBody InsightFace insightFace) { |
| | | // æ£é¤æ¥å£è´¹ç¨å¹¶ä¸ä¿åæ¶æ¯è®°å½ |
| | | chatCostService.taskDeduct("mj","Face Changing", NumberUtils.toDouble(mjOkHttpUtil.getKey("faceSwapping"), 0.1)); |
| | | // å建请æ±ä½ï¼è¿é使ç¨JSONä½ä¸ºåªä½ç±»åï¼ |
| | | String insightFaceJson = JSONUtil.toJsonStr(insightFace); |
| | | String url = "mj/insight-face/swap"; |
| | | Request request = mjOkHttpUtil.createPostRequest(url, insightFaceJson); |
| | | return mjOkHttpUtil.executeRequest(request); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.chat.controller.tripartite; |
| | | |
| | | import cn.hutool.json.JSONUtil; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | import okhttp3.Request; |
| | | import org.apache.commons.lang3.math.NumberUtils; |
| | | import org.ruoyi.chat.config.OkHttpConfig; |
| | | import org.ruoyi.chat.domain.bo.GenerateLuma; |
| | | import org.ruoyi.chat.service.chat.IChatCostService; |
| | | import org.ruoyi.common.core.utils.OkHttpUtil; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | /** |
| | | * æè¿°ï¼æçè§é¢ |
| | | * |
| | | * @author ageerle@163.com |
| | | * date 2024/6/27 |
| | | */ |
| | | @RestController |
| | | @RequestMapping("/luma") |
| | | @RequiredArgsConstructor |
| | | @Slf4j |
| | | public class LumaController { |
| | | |
| | | private final OkHttpConfig okHttpConfig; |
| | | private final IChatCostService chatCostService; |
| | | |
| | | |
| | | @ApiOperation(value = "æçè§é¢") |
| | | @PostMapping("/generations/") |
| | | public String generateVideo(@RequestBody GenerateLuma generateLuma) { |
| | | OkHttpUtil okHttpUtil = okHttpConfig.getOkHttpUtil("luma"); |
| | | |
| | | chatCostService.taskDeduct("luma", "æçè§é¢", NumberUtils.toDouble(okHttpConfig.getGenerate(), 0.3)); |
| | | String generateJson = JSONUtil.toJsonStr(generateLuma); |
| | | String url = "luma/generations"; |
| | | Request request = okHttpUtil.createPostRequest(url, generateJson); |
| | | return okHttpUtil.executeRequest(request); |
| | | } |
| | | |
| | | @ApiOperation(value = "æçè§é¢ä»»å¡æ¥è¯¢") |
| | | @GetMapping("/generations/{taskId}") |
| | | public String getGenerationTask(@PathVariable String taskId) { |
| | | OkHttpUtil okHttpUtil = okHttpConfig.getOkHttpUtil("luma"); |
| | | String url = "luma/generations/" + taskId; |
| | | Request request = okHttpUtil.createGetRequest(url); |
| | | return okHttpUtil.executeRequest(request); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.chat.controller.tripartite; |
| | | |
| | | import cn.hutool.json.JSONUtil; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import okhttp3.Request; |
| | | import org.apache.commons.lang3.math.NumberUtils; |
| | | import org.ruoyi.chat.domain.dto.*; |
| | | import org.ruoyi.chat.enums.ActionType; |
| | | import org.ruoyi.chat.service.chat.IChatCostService; |
| | | import org.ruoyi.chat.util.MjOkHttpUtil; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import java.util.Optional; |
| | | |
| | | @Api(tags = "ä»»å¡æäº¤") |
| | | @RestController |
| | | @RequestMapping("/mj/submit") |
| | | @RequiredArgsConstructor |
| | | @Slf4j |
| | | public class SubmitController { |
| | | |
| | | private final IChatCostService chatCostService; |
| | | private final MjOkHttpUtil mjOkHttpUtil; |
| | | |
| | | @ApiOperation(value = "ç»å¾åå") |
| | | @PostMapping("/change") |
| | | public String change(@RequestBody SubmitChangeDTO changeDTO) { |
| | | String jsonStr = JSONUtil.toJsonStr(changeDTO); |
| | | String url = "mj/submit/change"; |
| | | Request request = mjOkHttpUtil.createPostRequest(url, jsonStr); |
| | | return mjOkHttpUtil.executeRequest(request); |
| | | } |
| | | |
| | | @ApiOperation(value = "æ§è¡å¨ä½") |
| | | @PostMapping("/action") |
| | | public String action(@RequestBody SubmitActionDTO changeDTO) { |
| | | ActionType actionType = ActionType.fromCustomId(getAction(changeDTO.getCustomId())); |
| | | Optional.ofNullable(actionType).ifPresentOrElse( |
| | | type -> { |
| | | switch (type) { |
| | | case UP_SAMPLE: |
| | | chatCostService.taskDeduct("mj","enlarge", NumberUtils.toDouble(mjOkHttpUtil.getKey("upsample"), 0.3)); |
| | | break; |
| | | case IN_PAINT: |
| | | // å±é¨éç»å·²ç»æ£è´¹,䏿§è¡ä»»ä½æä½ |
| | | break; |
| | | default: |
| | | chatCostService.taskDeduct("mj","change", NumberUtils.toDouble(mjOkHttpUtil.getKey("change"), 0.3)); |
| | | break; |
| | | } |
| | | }, |
| | | () -> chatCostService.taskDeduct("mj","change", NumberUtils.toDouble(mjOkHttpUtil.getKey("change"), 0.3)) |
| | | ); |
| | | |
| | | String jsonStr = JSONUtil.toJsonStr(changeDTO); |
| | | String url = "mj/submit/action"; |
| | | Request request = mjOkHttpUtil.createPostRequest(url, jsonStr); |
| | | return mjOkHttpUtil.executeRequest(request); |
| | | } |
| | | |
| | | @ApiOperation(value = "ç»å¾åå-simple") |
| | | @PostMapping("/simple-change") |
| | | public String simpleChange(@RequestBody SubmitSimpleChangeDTO simpleChangeDTO) { |
| | | String jsonStr = JSONUtil.toJsonStr(simpleChangeDTO); |
| | | String url = "mj/submit/simple-change"; |
| | | Request request = mjOkHttpUtil.createPostRequest(url, jsonStr); |
| | | return mjOkHttpUtil.executeRequest(request); |
| | | } |
| | | |
| | | @ApiOperation(value = "æäº¤å¾çå¾ãæ··å¾ä»»å¡") |
| | | @PostMapping("/blend") |
| | | public String blend(@RequestBody SubmitBlendDTO blendDTO) { |
| | | chatCostService.taskDeduct("mj","blend", NumberUtils.toDouble(mjOkHttpUtil.getKey("blend"), 0.3)); |
| | | String jsonStr = JSONUtil.toJsonStr(blendDTO); |
| | | String url = "mj/submit/blend"; |
| | | Request request = mjOkHttpUtil.createPostRequest(url, jsonStr); |
| | | return mjOkHttpUtil.executeRequest(request); |
| | | } |
| | | |
| | | @ApiOperation(value = "æäº¤å¾çæä»»å¡") |
| | | @PostMapping("/describe") |
| | | public String describe(@RequestBody SubmitDescribeDTO describeDTO) { |
| | | chatCostService.taskDeduct("mj","describe", NumberUtils.toDouble(mjOkHttpUtil.getKey("describe"), 0.1)); |
| | | String jsonStr = JSONUtil.toJsonStr(describeDTO); |
| | | String url = "mj/submit/describe"; |
| | | Request request = mjOkHttpUtil.createPostRequest(url, jsonStr); |
| | | return mjOkHttpUtil.executeRequest(request); |
| | | } |
| | | |
| | | @ApiOperation(value = "æäº¤æçå¾ä»»å¡") |
| | | @PostMapping("/imagine") |
| | | public String imagine(@RequestBody SubmitImagineDTO imagineDTO) { |
| | | chatCostService.taskDeduct("mj",imagineDTO.getPrompt(), NumberUtils.toDouble(mjOkHttpUtil.getKey("imagine"), 0.3)); |
| | | String jsonStr = JSONUtil.toJsonStr(imagineDTO); |
| | | String url = "mj/submit/imagine"; |
| | | Request request = mjOkHttpUtil.createPostRequest(url, jsonStr); |
| | | return mjOkHttpUtil.executeRequest(request); |
| | | } |
| | | |
| | | @ApiOperation(value = "æäº¤å±é¨éç»ä»»å¡") |
| | | @PostMapping("/modal") |
| | | public String modal(@RequestBody SubmitModalDTO submitModalDTO) { |
| | | chatCostService.taskDeduct("mj","repaint ", NumberUtils.toDouble(mjOkHttpUtil.getKey("inpaint"), 0.1)); |
| | | String jsonStr = JSONUtil.toJsonStr(submitModalDTO); |
| | | String url = "mj/submit/modal"; |
| | | Request request = mjOkHttpUtil.createPostRequest(url, jsonStr); |
| | | return mjOkHttpUtil.executeRequest(request); |
| | | } |
| | | |
| | | @ApiOperation(value = "æäº¤æç¤ºè¯åæä»»å¡") |
| | | @PostMapping("/shorten") |
| | | public String shorten(@RequestBody SubmitShortenDTO submitShortenDTO) { |
| | | chatCostService.taskDeduct("mj","shorten", NumberUtils.toDouble(mjOkHttpUtil.getKey("shorten"), 0.1)); |
| | | String jsonStr = JSONUtil.toJsonStr(submitShortenDTO); |
| | | String url = "mj/submit/shorten"; |
| | | Request request = mjOkHttpUtil.createPostRequest(url, jsonStr); |
| | | return mjOkHttpUtil.executeRequest(request); |
| | | } |
| | | |
| | | public String getAction(String customId) { |
| | | if (customId == null || customId.isEmpty()) { |
| | | return null; |
| | | } |
| | | String[] parts = customId.split("::"); |
| | | return customId.endsWith("SOLO") ? parts[1] : parts[2]; |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.chat.controller.tripartite; |
| | | |
| | | import cn.hutool.json.JSONUtil; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | import okhttp3.Request; |
| | | import org.apache.commons.lang3.math.NumberUtils; |
| | | import org.ruoyi.chat.config.OkHttpConfig; |
| | | import org.ruoyi.chat.domain.bo.GenerateLyric; |
| | | import org.ruoyi.chat.domain.bo.GenerateSuno; |
| | | import org.ruoyi.chat.service.chat.IChatCostService; |
| | | import org.ruoyi.common.core.utils.OkHttpUtil; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | @RestController |
| | | @RequestMapping("/sunoapi") |
| | | @RequiredArgsConstructor |
| | | @Slf4j |
| | | public class SunoController { |
| | | |
| | | private final OkHttpConfig okHttpConfig; |
| | | private final IChatCostService chatCostService; |
| | | |
| | | @ApiOperation(value = "æçææ²") |
| | | @PostMapping("/generate") |
| | | public String generate(@RequestBody GenerateSuno generateSuno) { |
| | | OkHttpUtil okHttpUtil = okHttpConfig.getOkHttpUtil("suno"); |
| | | // æ£é¤æ¥å£è´¹ç¨å¹¶ä¸ä¿åæ¶æ¯è®°å½ |
| | | chatCostService.taskDeduct("suno","æçææ²", NumberUtils.toDouble(okHttpConfig.getGenerate(), 0.3)); |
| | | // å建请æ±ä½ï¼è¿é使ç¨JSONä½ä¸ºåªä½ç±»åï¼ |
| | | String generateJson = JSONUtil.toJsonStr(generateSuno); |
| | | String url = "suno/generate"; |
| | | Request request = okHttpUtil.createPostRequest(url, generateJson); |
| | | return okHttpUtil.executeRequest(request); |
| | | } |
| | | |
| | | @ApiOperation(value = "çææè¯") |
| | | @PostMapping("/generate/lyrics/") |
| | | public String generate(@RequestBody GenerateLyric generateLyric) { |
| | | OkHttpUtil okHttpUtil = okHttpConfig.getOkHttpUtil("suno"); |
| | | String generateJson = JSONUtil.toJsonStr(generateLyric); |
| | | String url = "task/suno/v1/submit/lyrics"; |
| | | Request request = okHttpUtil.createPostRequest(url, generateJson); |
| | | return okHttpUtil.executeRequest(request); |
| | | } |
| | | |
| | | |
| | | @ApiOperation(value = "æ¥è¯¢æè¯ä»»å¡") |
| | | @GetMapping("/lyrics/{taskId}") |
| | | public String lyrics(@PathVariable String taskId) { |
| | | OkHttpUtil okHttpUtil = okHttpConfig.getOkHttpUtil("suno"); |
| | | String url = "task/suno/v1/fetch/"+taskId; |
| | | Request request = okHttpUtil.createGetRequest(url); |
| | | return okHttpUtil.executeRequest(request); |
| | | } |
| | | |
| | | |
| | | @ApiOperation(value = "æ¥è¯¢ææ²ä»»å¡") |
| | | @GetMapping("/feed/{taskId}") |
| | | public String feed(@PathVariable String taskId) { |
| | | OkHttpUtil okHttpUtil = okHttpConfig.getOkHttpUtil("suno"); |
| | | String url = "suno/feed/"+taskId; |
| | | Request request = okHttpUtil.createGetRequest(url); |
| | | return okHttpUtil.executeRequest(request); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.chat.controller.tripartite; |
| | | |
| | | import cn.hutool.json.JSONUtil; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import io.swagger.annotations.ApiParam; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import okhttp3.Request; |
| | | import org.ruoyi.chat.domain.dto.TaskConditionDTO; |
| | | import org.ruoyi.chat.util.MjOkHttpUtil; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | @Api(tags = "任塿¥è¯¢") |
| | | @RestController |
| | | @RequestMapping("/mj/task") |
| | | @RequiredArgsConstructor |
| | | @Slf4j |
| | | public class TaskController { |
| | | |
| | | private final MjOkHttpUtil mjOkHttpUtil; |
| | | |
| | | @ApiOperation(value = "æå®IDè·åä»»å¡") |
| | | @GetMapping("/{id}/fetch") |
| | | public String fetch(@ApiParam(value = "ä»»å¡ID") @PathVariable String id) { |
| | | String url = "mj/task/" + id + "/fetch"; |
| | | Request request = mjOkHttpUtil.createGetRequest(url); |
| | | return mjOkHttpUtil.executeRequest(request); |
| | | } |
| | | |
| | | @ApiOperation(value = "æ ¹æ®IDå表æ¥è¯¢ä»»å¡") |
| | | @PostMapping("/list-by-condition") |
| | | public String listByIds(@RequestBody TaskConditionDTO conditionDTO) { |
| | | String url = "mj/task/list-by-condition"; |
| | | String conditionJson = JSONUtil.toJsonStr(conditionDTO); |
| | | Request request = mjOkHttpUtil.createPostRequest(url,conditionJson); |
| | | return mjOkHttpUtil.executeRequest(request); |
| | | } |
| | | |
| | | @ApiOperation(value = "è·åä»»å¡å¾ççseed") |
| | | @GetMapping("/{id}/image-seed") |
| | | public String getSeed(@ApiParam(value = "ä»»å¡ID") @PathVariable String id) { |
| | | String url = "mj/task/" + id + "/image-seed"; |
| | | Request request = mjOkHttpUtil.createGetRequest(url); |
| | | return mjOkHttpUtil.executeRequest(request); |
| | | } |
| | | |
| | | } |
| | |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | import org.ruoyi.chat.service.knowledge.vectorizer.BgeLargeVectorization; |
| | | import org.ruoyi.chat.service.knowledge.vectorizer.OpenAiVectorization; |
| | | import org.ruoyi.chat.service.knowledge.BgeLargeVectorizationImpl; |
| | | import org.ruoyi.chat.service.knowledge.OpenAiVectorizationImpl; |
| | | import org.ruoyi.domain.vo.KnowledgeInfoVo; |
| | | import org.ruoyi.service.IKnowledgeInfoService; |
| | | import org.ruoyi.service.VectorizationService; |
| | |
| | | @Slf4j |
| | | public class VectorizationFactory { |
| | | |
| | | private final OpenAiVectorization openAiVectorization; |
| | | private final OpenAiVectorizationImpl openAiVectorization; |
| | | |
| | | private final BgeLargeVectorization bgeLargeVectorization; |
| | | private final BgeLargeVectorizationImpl bgeLargeVectorization; |
| | | |
| | | @Lazy |
| | | @Resource |
| | | private IKnowledgeInfoService knowledgeInfoService; |
| | | |
| | | public VectorizationFactory(OpenAiVectorization openAiVectorization, BgeLargeVectorization bgeLargeVectorization) { |
| | | public VectorizationFactory(OpenAiVectorizationImpl openAiVectorization, BgeLargeVectorizationImpl bgeLargeVectorization) { |
| | | this.openAiVectorization = openAiVectorization; |
| | | this.bgeLargeVectorization = bgeLargeVectorization; |
| | | } |
| | |
| | | |
| | | @Autowired |
| | | private IChatModelService chatModelService; |
| | | @Autowired |
| | | private ChatClient chatClient; |
| | | @Autowired |
| | | private ToolCallbackProvider tools; |
| | | |
| | | private final ChatClient chatClient; |
| | | |
| | | private final ChatMemory chatMemory = new InMemoryChatMemory(); |
| | | |
| | | public OllamaServiceImpl(ChatClient.Builder chatClientBuilder,ToolCallbackProvider tools) { |
| | | this.chatClient = chatClientBuilder |
| | | .defaultTools(tools) |
| | | .defaultOptions( |
| | | OllamaOptions.builder() |
| | | .model(OllamaModel.QWEN_2_5_7B) |
| | | .temperature(0.4) |
| | | .build()) |
| | | .build(); |
| | | } |
| | | |
| | | @Override |
| | | public SseEmitter chat(ChatRequest chatRequest,SseEmitter emitter) { |
| | |
| | | |
| | | this.chatClient.prompt(chatRequest.getPrompt()) |
| | | .advisors(messageChatMemoryAdvisor) |
| | | .tools(tools) |
| | | .options(OllamaOptions.builder() |
| | | .model(OllamaModel.QWEN_2_5_7B) |
| | | .temperature(0.4) |
| | | .build()) |
| | | .stream() |
| | | .chatResponse() |
| | | .subscribe( |
| | |
| | | import org.ruoyi.chat.service.chat.IChatCostService; |
| | | import org.ruoyi.chat.service.chat.IChatService; |
| | | import org.ruoyi.chat.service.chat.ISseService; |
| | | import org.ruoyi.chat.factory.SseServiceFactory; |
| | | import org.ruoyi.chat.util.IpUtil; |
| | | import org.ruoyi.chat.util.SSEUtil; |
| | | import org.ruoyi.common.chat.request.ChatRequest; |
| | |
| | | |
| | | private final IChatCostService chatCostService; |
| | | |
| | | private final SseServiceFactory sseServiceFactory; |
| | | private final IChatService chatService; |
| | | |
| | | |
| | | private static final String requestIdTemplate = "company-%d"; |
| | | |
| | |
| | | String model = chatRequest.getModel(); |
| | | // å¦ææ¨¡åå称以ollamaå¼å¤´ï¼åè°ç¨ollamaä¸é¨ç½²çæ¬å°æ¨¡å |
| | | if (model.startsWith("ollama-")) { |
| | | String[] parts = chatRequest.getModel().split("ollama-", 2); // éå¶å岿¬¡æ°ä¸º2 |
| | | String[] parts = chatRequest.getModel().split("ollama-", 2); |
| | | if (parts.length > 1) { |
| | | chatRequest.setModel(parts[1]); |
| | | IChatService chatService = sseServiceFactory.getSseService("ollama"); |
| | | chatService.chat(chatRequest,emitter); |
| | | chatService.mcpChat(chatRequest,emitter); |
| | | } else { |
| | | throw new IllegalArgumentException("Invalid ollama model name: " + chatRequest.getModel()); |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.chat.service.knowledge; |
| | | |
| | | import io.github.ollama4j.OllamaAPI; |
| | | import io.github.ollama4j.models.embeddings.OllamaEmbeddingsRequestModel; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.ruoyi.common.core.exception.ServiceException; |
| | | import org.ruoyi.domain.vo.ChatModelVo; |
| | | import org.ruoyi.domain.vo.KnowledgeInfoVo; |
| | | import org.ruoyi.service.IChatModelService; |
| | | import org.ruoyi.service.IKnowledgeInfoService; |
| | | import org.ruoyi.service.VectorizationService; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author ageer |
| | | */ |
| | | @Component |
| | | @Slf4j |
| | | @RequiredArgsConstructor |
| | | public class BgeLargeVectorizationImpl implements VectorizationService { |
| | | |
| | | @Lazy |
| | | @Resource |
| | | private IKnowledgeInfoService knowledgeInfoService; |
| | | |
| | | @Lazy |
| | | @Resource |
| | | private final IChatModelService chatModelService; |
| | | |
| | | @Override |
| | | public List<List<Double>> batchVectorization(List<String> chunkList, String kid) { |
| | | |
| | | KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(kid)); |
| | | |
| | | ChatModelVo chatModelVo = chatModelService.selectModelByName(knowledgeInfoVo.getVectorModel()); |
| | | |
| | | OllamaAPI api = new OllamaAPI(chatModelVo.getApiHost()); |
| | | |
| | | List<Double> doubleVector; |
| | | List<List<Double>> vectorList = new ArrayList<>(); |
| | | try { |
| | | for (String chunk : chunkList) { |
| | | doubleVector = api.generateEmbeddings(new OllamaEmbeddingsRequestModel(knowledgeInfoVo.getVectorModel(), chunk)); |
| | | vectorList.add(doubleVector); |
| | | } |
| | | } catch (Exception e) { |
| | | throw new ServiceException("ææ¬åéåå¼å¸¸ï¼"+e.getMessage()); |
| | | } |
| | | return vectorList; |
| | | } |
| | | |
| | | @Override |
| | | public List<Double> singleVectorization(String chunk, String kid) { |
| | | List<String> chunkList = new ArrayList<>(); |
| | | chunkList.add(chunk); |
| | | List<List<Double>> vectorList = batchVectorization(chunkList, kid); |
| | | return vectorList.get(0); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.chat.service.knowledge; |
| | | |
| | | import jakarta.annotation.Resource; |
| | | import lombok.Getter; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.ruoyi.chat.config.ChatConfig; |
| | | import org.ruoyi.common.chat.entity.embeddings.Embedding; |
| | | import org.ruoyi.common.chat.entity.embeddings.EmbeddingResponse; |
| | | import org.ruoyi.common.chat.openai.OpenAiStreamClient; |
| | | import org.ruoyi.domain.vo.ChatModelVo; |
| | | import org.ruoyi.domain.vo.KnowledgeInfoVo; |
| | | import org.ruoyi.service.IChatModelService; |
| | | import org.ruoyi.service.IKnowledgeInfoService; |
| | | import org.ruoyi.service.VectorizationService; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | | |
| | | @Component |
| | | @Slf4j |
| | | @RequiredArgsConstructor |
| | | public class OpenAiVectorizationImpl implements VectorizationService { |
| | | |
| | | @Lazy |
| | | @Resource |
| | | private IKnowledgeInfoService knowledgeInfoService; |
| | | |
| | | @Lazy |
| | | @Resource |
| | | private IChatModelService chatModelService; |
| | | |
| | | @Getter |
| | | private OpenAiStreamClient openAiStreamClient; |
| | | |
| | | private final ChatConfig chatConfig; |
| | | |
| | | @Override |
| | | public List<List<Double>> batchVectorization(List<String> chunkList, String kid) { |
| | | List<List<Double>> vectorList; |
| | | // è·åç¥è¯åºä¿¡æ¯ |
| | | KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(kid)); |
| | | if(knowledgeInfoVo == null){ |
| | | log.warn("ç¥è¯åºä¸åå¨:è¯·æ¥æ£ID {}",kid); |
| | | vectorList=new ArrayList<>(); |
| | | vectorList.add(new ArrayList<>()); |
| | | return vectorList; |
| | | } |
| | | ChatModelVo chatModelVo = chatModelService.selectModelByName(knowledgeInfoVo.getVectorModel()); |
| | | String apiHost= chatModelVo.getApiHost(); |
| | | String apiKey= chatModelVo.getApiKey(); |
| | | openAiStreamClient = chatConfig.createOpenAiStreamClient(apiHost,apiKey); |
| | | Embedding embedding = buildEmbedding(chunkList, knowledgeInfoVo); |
| | | EmbeddingResponse embeddings = openAiStreamClient.embeddings(embedding); |
| | | // å¤ç OpenAI è¿åçåµå
¥æ°æ® |
| | | vectorList = processOpenAiEmbeddings(embeddings); |
| | | return vectorList; |
| | | } |
| | | |
| | | /** |
| | | * æå»º Embedding 对象 |
| | | */ |
| | | private Embedding buildEmbedding(List<String> chunkList, KnowledgeInfoVo knowledgeInfoVo) { |
| | | return Embedding.builder() |
| | | .input(chunkList) |
| | | .model(knowledgeInfoVo.getVectorModel()) |
| | | .build(); |
| | | } |
| | | |
| | | /** |
| | | * å¤ç OpenAI è¿åçåµå
¥æ°æ® |
| | | */ |
| | | private List<List<Double>> processOpenAiEmbeddings(EmbeddingResponse embeddings) { |
| | | List<List<Double>> vectorList = new ArrayList<>(); |
| | | |
| | | embeddings.getData().forEach(data -> { |
| | | List<BigDecimal> vector = data.getEmbedding(); |
| | | List<Double> doubleVector = convertToDoubleList(vector); |
| | | vectorList.add(doubleVector); |
| | | }); |
| | | |
| | | return vectorList; |
| | | } |
| | | |
| | | /** |
| | | * å° BigDecimal 转æ¢ä¸º Double å表 |
| | | */ |
| | | private List<Double> convertToDoubleList(List<BigDecimal> vector) { |
| | | return vector.stream() |
| | | .map(BigDecimal::doubleValue) |
| | | .collect(Collectors.toList()); |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public List<Double> singleVectorization(String chunk, String kid) { |
| | | List<String> chunkList = new ArrayList<>(); |
| | | chunkList.add(chunk); |
| | | List<List<Double>> vectorList = batchVectorization(chunkList, kid); |
| | | return vectorList.get(0); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.ruoyi.chat.service.knowledge; |
| | | |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.ruoyi.chat.factory.VectorizationFactory; |
| | | import org.ruoyi.service.VectorizationService; |
| | | import org.springframework.context.annotation.Primary; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.List; |
| | | |
| | | @Component |
| | | @Slf4j |
| | | @Primary |
| | | @AllArgsConstructor |
| | | public class VectorizationWrapper implements VectorizationService { |
| | | |
| | | private final VectorizationFactory vectorizationFactory; |
| | | @Override |
| | | public List<List<Double>> batchVectorization(List<String> chunkList, String kid) { |
| | | VectorizationService embedding = vectorizationFactory.getEmbedding(kid); |
| | | return embedding.batchVectorization(chunkList, kid); |
| | | } |
| | | |
| | | @Override |
| | | public List<Double> singleVectorization(String chunk, String kid) { |
| | | VectorizationService embedding = vectorizationFactory.getEmbedding(kid); |
| | | return embedding.singleVectorization(chunk, kid); |
| | | } |
| | | } |
| | |
| | | import org.ruoyi.common.idempotent.annotation.RepeatSubmit; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.log.enums.BusinessType; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.demo.domain.TestDemo; |
| | | import org.ruoyi.demo.domain.bo.TestDemoBo; |
| | |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import org.ruoyi.demo.domain.TestDemo; |
| | | |
| | | /** |
| | |
| | | import lombok.EqualsAndHashCode; |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import org.ruoyi.demo.domain.TestTree; |
| | | |
| | | /** |
| | |
| | | package org.ruoyi.demo.mapper; |
| | | |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.demo.domain.TestDemoEncrypt; |
| | | |
| | | /** |
| | |
| | | import com.baomidou.mybatisplus.core.toolkit.Constants; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import org.apache.ibatis.annotations.Param; |
| | | import org.ruoyi.common.mybatis.annotation.DataColumn; |
| | | import org.ruoyi.common.mybatis.annotation.DataPermission; |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.annotation.DataColumn; |
| | | import org.ruoyi.annotation.DataPermission; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.demo.domain.TestDemo; |
| | | import org.ruoyi.demo.domain.vo.TestDemoVo; |
| | | |
| | |
| | | package org.ruoyi.demo.mapper; |
| | | |
| | | import org.ruoyi.common.mybatis.annotation.DataColumn; |
| | | import org.ruoyi.common.mybatis.annotation.DataPermission; |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.annotation.DataColumn; |
| | | import org.ruoyi.annotation.DataPermission; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.demo.domain.TestTree; |
| | | import org.ruoyi.demo.domain.vo.TestTreeVo; |
| | | |
| | |
| | | package org.ruoyi.demo.service; |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.demo.domain.TestDemo; |
| | | import org.ruoyi.demo.domain.bo.TestDemoBo; |
| | | import org.ruoyi.demo.domain.vo.TestDemoVo; |
| | |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.demo.domain.TestDemo; |
| | | import org.ruoyi.demo.domain.bo.TestDemoBo; |
| | | import org.ruoyi.demo.domain.vo.TestDemoVo; |
| | |
| | | import cn.dev33.satoken.annotation.SaCheckPermission; |
| | | import cn.hutool.core.convert.Convert; |
| | | import cn.hutool.core.io.IoUtil; |
| | | import org.ruoyi.common.mybatis.helper.DataBaseHelper; |
| | | import org.ruoyi.helper.DataBaseHelper; |
| | | import org.ruoyi.generator.domain.GenTable; |
| | | import org.ruoyi.generator.domain.GenTableColumn; |
| | | import org.ruoyi.generator.service.IGenTableService; |
| | | import org.ruoyi.common.core.domain.R; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.log.enums.BusinessType; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import lombok.RequiredArgsConstructor; |
| | |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import org.ruoyi.generator.constant.GenConstants; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import jakarta.validation.Valid; |
| | | import jakarta.validation.constraints.NotBlank; |
| | | import lombok.Data; |
| | |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import jakarta.validation.constraints.NotBlank; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | |
| | | |
| | | import com.baomidou.mybatisplus.annotation.InterceptorIgnore; |
| | | import org.ruoyi.generator.domain.GenTableColumn; |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | |
| | | import java.util.List; |
| | | |
| | |
| | | |
| | | import com.baomidou.mybatisplus.annotation.InterceptorIgnore; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.generator.domain.GenTable; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.core.utils.file.FileUtils; |
| | | import org.ruoyi.common.json.utils.JsonUtils; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.satoken.utils.LoginHelper; |
| | | import org.ruoyi.generator.constant.GenConstants; |
| | | import org.ruoyi.generator.domain.GenTable; |
| | |
| | | package org.ruoyi.generator.service; |
| | | |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.generator.domain.GenTable; |
| | | import org.ruoyi.generator.domain.GenTableColumn; |
| | | |
| | |
| | | import org.ruoyi.common.core.utils.DateUtils; |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.json.utils.JsonUtils; |
| | | import org.ruoyi.common.mybatis.helper.DataBaseHelper; |
| | | import org.ruoyi.helper.DataBaseHelper; |
| | | import lombok.AccessLevel; |
| | | import lombok.NoArgsConstructor; |
| | | import org.apache.velocity.VelocityContext; |
| | |
| | | </resultMap> |
| | | |
| | | <select id="selectDbTableColumnsByName" parameterType="String" resultMap="GenTableColumnResult"> |
| | | <if test="@org.ruoyi.common.mybatis.helper.DataBaseHelper@isMySql()"> |
| | | <if test="@org.ruoyi.helper.DataBaseHelper@isMySql()"> |
| | | select column_name, |
| | | (case when (is_nullable = 'no' <![CDATA[ && ]]> column_key != 'PRI') then '1' else null end) as is_required, |
| | | (case when column_key = 'PRI' then '1' else '0' end) as is_pk, |
| | |
| | | from information_schema.columns where table_schema = (select database()) and table_name = (#{tableName}) |
| | | order by ordinal_position |
| | | </if> |
| | | <if test="@org.ruoyi.common.mybatis.helper.DataBaseHelper@isOracle()"> |
| | | <if test="@org.ruoyi.helper.DataBaseHelper@isOracle()"> |
| | | select lower(temp.column_name) as column_name, |
| | | (case when (temp.nullable = 'N' and temp.constraint_type != 'P') then '1' else null end) as is_required, |
| | | (case when temp.constraint_type = 'P' then '1' else '0' end) as is_pk, |
| | |
| | | WHERE temp.row_flg = 1 |
| | | ORDER BY temp.column_id |
| | | </if> |
| | | <if test="@org.ruoyi.common.mybatis.helper.DataBaseHelper@isPostgerSql()"> |
| | | <if test="@org.ruoyi.helper.DataBaseHelper@isPostgerSql()"> |
| | | SELECT column_name, is_required, is_pk, sort, column_comment, is_increment, column_type |
| | | FROM ( |
| | | SELECT c.relname AS table_name, |
| | |
| | | WHERE table_name = (#{tableName}) |
| | | AND column_type <![CDATA[ <> ]]> '-' |
| | | </if> |
| | | <if test="@org.ruoyi.common.mybatis.helper.DataBaseHelper@isSqlServer()"> |
| | | <if test="@org.ruoyi.helper.DataBaseHelper@isSqlServer()"> |
| | | SELECT |
| | | cast(A.NAME as nvarchar) as column_name, |
| | | cast(B.NAME as nvarchar) + (case when B.NAME = 'numeric' then '(' + cast(A.prec as nvarchar) + ',' + cast(A.scale as nvarchar) + ')' else '' end) as column_type, |
| | |
| | | </resultMap> |
| | | |
| | | <select id="selectPageDbTableList" resultMap="GenTableResult"> |
| | | <if test="@org.ruoyi.common.mybatis.helper.DataBaseHelper@isMySql()"> |
| | | <if test="@org.ruoyi.helper.DataBaseHelper@isMySql()"> |
| | | select table_name, table_comment, create_time, update_time |
| | | from information_schema.tables |
| | | where table_schema = (select database()) |
| | |
| | | </if> |
| | | order by create_time desc |
| | | </if> |
| | | <if test="@org.ruoyi.common.mybatis.helper.DataBaseHelper@isOracle()"> |
| | | <if test="@org.ruoyi.helper.DataBaseHelper@isOracle()"> |
| | | select lower(dt.table_name) as table_name, dtc.comments as table_comment, uo.created as create_time, uo.last_ddl_time as update_time |
| | | from user_tables dt, user_tab_comments dtc, user_objects uo |
| | | where dt.table_name = dtc.table_name |
| | |
| | | </if> |
| | | order by create_time desc |
| | | </if> |
| | | <if test="@org.ruoyi.common.mybatis.helper.DataBaseHelper@isPostgerSql()"> |
| | | <if test="@org.ruoyi.helper.DataBaseHelper@isPostgerSql()"> |
| | | select table_name, table_comment, create_time, update_time |
| | | from ( |
| | | SELECT c.relname AS table_name, |
| | |
| | | </if> |
| | | order by create_time desc |
| | | </if> |
| | | <if test="@org.ruoyi.common.mybatis.helper.DataBaseHelper@isSqlServer()"> |
| | | <if test="@org.ruoyi.helper.DataBaseHelper@isSqlServer()"> |
| | | SELECT cast(D.NAME as nvarchar) as table_name, |
| | | cast(F.VALUE as nvarchar) as table_comment, |
| | | crdate as create_time, |
| | |
| | | </select> |
| | | |
| | | <select id="selectDbTableListByNames" resultMap="GenTableResult"> |
| | | <if test="@org.ruoyi.common.mybatis.helper.DataBaseHelper@isMySql()"> |
| | | <if test="@org.ruoyi.helper.DataBaseHelper@isMySql()"> |
| | | select table_name, table_comment, create_time, update_time from information_schema.tables |
| | | where table_name NOT LIKE 'xxl_job_%' and table_name NOT LIKE 'gen_%' and table_schema = (select database()) |
| | | and table_name in |
| | |
| | | #{name} |
| | | </foreach> |
| | | </if> |
| | | <if test="@org.ruoyi.common.mybatis.helper.DataBaseHelper@isOracle()"> |
| | | <if test="@org.ruoyi.helper.DataBaseHelper@isOracle()"> |
| | | select lower(dt.table_name) as table_name, dtc.comments as table_comment, uo.created as create_time, uo.last_ddl_time as update_time |
| | | from user_tables dt, user_tab_comments dtc, user_objects uo |
| | | where dt.table_name = dtc.table_name |
| | |
| | | #{name} |
| | | </foreach> |
| | | </if> |
| | | <if test="@org.ruoyi.common.mybatis.helper.DataBaseHelper@isPostgerSql()"> |
| | | <if test="@org.ruoyi.helper.DataBaseHelper@isPostgerSql()"> |
| | | select table_name, table_comment, create_time, update_time |
| | | from ( |
| | | SELECT c.relname AS table_name, |
| | |
| | | #{name} |
| | | </foreach> |
| | | </if> |
| | | <if test="@org.ruoyi.common.mybatis.helper.DataBaseHelper@isSqlServer()"> |
| | | <if test="@org.ruoyi.helper.DataBaseHelper@isSqlServer()"> |
| | | SELECT cast(D.NAME as nvarchar) as table_name, |
| | | cast(F.VALUE as nvarchar) as table_comment, |
| | | crdate as create_time, |
| | |
| | | </select> |
| | | |
| | | <select id="selectTableByName" parameterType="String" resultMap="GenTableResult"> |
| | | <if test="@org.ruoyi.common.mybatis.helper.DataBaseHelper@isMySql()"> |
| | | <if test="@org.ruoyi.helper.DataBaseHelper@isMySql()"> |
| | | select table_name, table_comment, create_time, update_time from information_schema.tables |
| | | where table_name NOT LIKE 'xxl_job_%' and table_name NOT LIKE 'gen_%' and table_schema = (select database()) |
| | | and table_name = #{tableName} |
| | | </if> |
| | | <if test="@org.ruoyi.common.mybatis.helper.DataBaseHelper@isOracle()"> |
| | | <if test="@org.ruoyi.helper.DataBaseHelper@isOracle()"> |
| | | select lower(dt.table_name) as table_name, dtc.comments as table_comment, uo.created as create_time, uo.last_ddl_time as update_time |
| | | from user_tables dt, user_tab_comments dtc, user_objects uo |
| | | where dt.table_name = dtc.table_name |
| | |
| | | AND dt.table_name NOT IN (select table_name from gen_table) |
| | | and lower(dt.table_name) = #{tableName} |
| | | </if> |
| | | <if test="@org.ruoyi.common.mybatis.helper.DataBaseHelper@isPostgerSql()"> |
| | | <if test="@org.ruoyi.helper.DataBaseHelper@isPostgerSql()"> |
| | | select table_name, table_comment, create_time, update_time |
| | | from ( |
| | | SELECT c.relname AS table_name, |
| | |
| | | where table_name NOT LIKE 'xxl_job_%' and table_name NOT LIKE 'gen_%' |
| | | and table_name = #{tableName} |
| | | </if> |
| | | <if test="@org.ruoyi.common.mybatis.helper.DataBaseHelper@isSqlServer()"> |
| | | <if test="@org.ruoyi.helper.DataBaseHelper@isSqlServer()"> |
| | | SELECT cast(D.NAME as nvarchar) as table_name, |
| | | cast(F.VALUE as nvarchar) as table_comment, |
| | | crdate as create_time, |
| | |
| | | package ${packageName}.domain.bo; |
| | | |
| | | import ${packageName}.domain.${ClassName}; |
| | | import org.ruoyi.common.mybatis.core.domain.BaseEntity; |
| | | import org.ruoyi.core.domain.BaseEntity; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | |
| | | import annotation.idempotent.common.org.ruoyi.RepeatSubmit; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.common.core.domain.R; |
| | | import org.ruoyi.common.core.validate.AddGroup; |
| | | import org.ruoyi.common.core.validate.EditGroup; |
| | |
| | | import ${packageName}.domain.bo.${ClassName}Bo; |
| | | import ${packageName}.service.I${ClassName}Service; |
| | | #if($table.crud || $table.sub) |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | #elseif($table.tree) |
| | | #end |
| | | |
| | |
| | | |
| | | import ${packageName}.domain.${ClassName}; |
| | | import ${packageName}.domain.vo.${ClassName}Vo; |
| | | import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; |
| | | import org.ruoyi.core.mapper.BaseMapperPlus; |
| | | |
| | | /** |
| | | * ${functionName}Mapperæ¥å£ |
| | |
| | | import ${packageName}.domain.vo.${ClassName}Vo; |
| | | import ${packageName}.domain.bo.${ClassName}Bo; |
| | | #if($table.crud || $table.sub) |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | #end |
| | | |
| | | import java.util.Collection; |
| | |
| | | |
| | | import org.ruoyi.common.core.utils.MapstructUtils; |
| | | #if($table.crud || $table.sub) |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | #end |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | |
| | | import org.ruoyi.common.excel.utils.ExcelUtil; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.log.enums.BusinessType; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.redis.utils.RedisUtils; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.system.domain.bo.SysLogininforBo; |
| | |
| | | import org.ruoyi.common.excel.utils.ExcelUtil; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.log.enums.BusinessType; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.system.domain.bo.SysOperLogBo; |
| | | import org.ruoyi.system.domain.vo.SysOperLogVo; |
| | |
| | | import org.ruoyi.common.core.utils.StringUtils; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.log.enums.BusinessType; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.redis.utils.RedisUtils; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.system.domain.SysUserOnline; |
| | |
| | | import org.ruoyi.common.excel.utils.ExcelUtil; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.log.enums.BusinessType; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.system.domain.bo.SysConfigBo; |
| | | import org.ruoyi.system.domain.vo.SysConfigVo; |
| | |
| | | import org.ruoyi.common.excel.utils.ExcelUtil; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.log.enums.BusinessType; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.system.domain.bo.SysDictDataBo; |
| | | import org.ruoyi.system.domain.vo.SysDictDataVo; |
| | |
| | | import org.ruoyi.common.excel.utils.ExcelUtil; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.log.enums.BusinessType; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.system.domain.bo.SysDictTypeBo; |
| | | import org.ruoyi.system.domain.vo.SysDictTypeVo; |
| | |
| | | import org.ruoyi.common.core.domain.R; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.log.enums.BusinessType; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.system.domain.SysNotice; |
| | | import org.ruoyi.system.domain.bo.SysNoticeBo; |
| | |
| | | import org.ruoyi.common.idempotent.annotation.RepeatSubmit; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.log.enums.BusinessType; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.satoken.utils.LoginHelper; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.system.domain.bo.SysNoticeStateBo; |
| | |
| | | import org.ruoyi.common.idempotent.annotation.RepeatSubmit; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.log.enums.BusinessType; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.system.domain.bo.SysOssConfigBo; |
| | | import org.ruoyi.system.domain.vo.SysOssConfigVo; |
| | |
| | | import org.ruoyi.common.core.validate.QueryGroup; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.log.enums.BusinessType; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.system.domain.bo.SysOssBo; |
| | | import org.ruoyi.system.domain.vo.SysOssUploadVo; |
| | |
| | | import org.ruoyi.common.excel.utils.ExcelUtil; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.log.enums.BusinessType; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.system.domain.bo.SysPostBo; |
| | | import org.ruoyi.system.domain.vo.SysPostVo; |
| | |
| | | import org.ruoyi.common.excel.utils.ExcelUtil; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.log.enums.BusinessType; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.system.domain.SysUserRole; |
| | | import org.ruoyi.system.domain.bo.SysDeptBo; |
| | |
| | | import org.ruoyi.common.idempotent.annotation.RepeatSubmit; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.log.enums.BusinessType; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.tenant.helper.TenantHelper; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.system.domain.bo.SysTenantBo; |
| | | import org.ruoyi.system.domain.vo.SysTenantVo; |
| | | import org.ruoyi.system.service.ISysTenantService; |
| | | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | |
| | | @RequiredArgsConstructor |
| | | @RestController |
| | | @RequestMapping("/system/tenant") |
| | | @ConditionalOnProperty(value = "tenant.enable", havingValue = "true") |
| | | public class SysTenantController extends BaseController { |
| | | |
| | | private final ISysTenantService tenantService; |
| | |
| | | */ |
| | | @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) |
| | | @SaCheckPermission("system:tenant:export") |
| | | @Log(title = "ç§æ·", businessType = BusinessType.EXPORT) |
| | | @Log(title = "ç§æ·ç®¡ç", businessType = BusinessType.EXPORT) |
| | | @PostMapping("/export") |
| | | public void export(SysTenantBo bo, HttpServletResponse response) { |
| | | List<SysTenantVo> list = tenantService.queryList(bo); |
| | |
| | | /** |
| | | * æ°å¢ç§æ· |
| | | */ |
| | | //@ApiEncrypt |
| | | @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) |
| | | @SaCheckPermission("system:tenant:add") |
| | | @Log(title = "ç§æ·", businessType = BusinessType.INSERT) |
| | | @Log(title = "ç§æ·ç®¡ç", businessType = BusinessType.INSERT) |
| | | @Lock4j |
| | | @RepeatSubmit() |
| | | @PostMapping() |
| | |
| | | */ |
| | | @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) |
| | | @SaCheckPermission("system:tenant:edit") |
| | | @Log(title = "ç§æ·", businessType = BusinessType.UPDATE) |
| | | @Log(title = "ç§æ·ç®¡ç", businessType = BusinessType.UPDATE) |
| | | @RepeatSubmit() |
| | | @PutMapping() |
| | | public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysTenantBo bo) { |
| | |
| | | */ |
| | | @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) |
| | | @SaCheckPermission("system:tenant:edit") |
| | | @Log(title = "ç§æ·", businessType = BusinessType.UPDATE) |
| | | @Log(title = "ç§æ·ç®¡ç", businessType = BusinessType.UPDATE) |
| | | @PutMapping("/changeStatus") |
| | | public R<Void> changeStatus(@RequestBody SysTenantBo bo) { |
| | | tenantService.checkTenantAllowed(bo.getTenantId()); |
| | |
| | | */ |
| | | @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) |
| | | @SaCheckPermission("system:tenant:remove") |
| | | @Log(title = "ç§æ·", businessType = BusinessType.DELETE) |
| | | @Log(title = "ç§æ·ç®¡ç", businessType = BusinessType.DELETE) |
| | | @DeleteMapping("/{ids}") |
| | | public R<Void> remove(@NotEmpty(message = "主é®ä¸è½ä¸ºç©º") |
| | | @PathVariable Long[] ids) { |
| | |
| | | @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) |
| | | @GetMapping("/dynamic/{tenantId}") |
| | | public R<Void> dynamicTenant(@NotBlank(message = "ç§æ·IDä¸è½ä¸ºç©º") @PathVariable String tenantId) { |
| | | TenantHelper.setDynamic(tenantId); |
| | | TenantHelper.setDynamic(tenantId, true); |
| | | return R.ok(); |
| | | } |
| | | |
| | |
| | | */ |
| | | @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) |
| | | @SaCheckPermission("system:tenant:edit") |
| | | @Log(title = "ç§æ·", businessType = BusinessType.UPDATE) |
| | | @Log(title = "ç§æ·ç®¡ç", businessType = BusinessType.UPDATE) |
| | | @GetMapping("/syncTenantPackage") |
| | | public R<Void> syncTenantPackage(@NotBlank(message = "ç§æ·IDä¸è½ä¸ºç©º") String tenantId, @NotBlank(message = "å¥é¤IDä¸è½ä¸ºç©º") String packageId) { |
| | | public R<Void> syncTenantPackage(@NotBlank(message = "ç§æ·IDä¸è½ä¸ºç©º") String tenantId, |
| | | @NotNull(message = "å¥é¤IDä¸è½ä¸ºç©º") Long packageId) { |
| | | return toAjax(TenantHelper.ignore(() -> tenantService.syncTenantPackage(tenantId, packageId))); |
| | | } |
| | | |
| | | /** |
| | | * åæ¥ç§æ·åå
¸ |
| | | */ |
| | | @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) |
| | | @Log(title = "ç§æ·ç®¡ç", businessType = BusinessType.INSERT) |
| | | @GetMapping("/syncTenantDict") |
| | | public R<Void> syncTenantDict() { |
| | | if (!TenantHelper.isEnable()) { |
| | | return R.fail("å½åæªå¼å¯ç§æ·æ¨¡å¼"); |
| | | } |
| | | tenantService.syncTenantDict(); |
| | | return R.ok("åæ¥ç§æ·åå
¸æå"); |
| | | } |
| | | |
| | | } |
| | |
| | | import org.ruoyi.common.idempotent.annotation.RepeatSubmit; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.log.enums.BusinessType; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.web.core.BaseController; |
| | | import org.ruoyi.system.domain.bo.SysTenantPackageBo; |
| | | import org.ruoyi.system.domain.vo.SysTenantPackageVo; |
| | |
| | | import org.ruoyi.common.excel.utils.ExcelUtil; |
| | | import org.ruoyi.common.log.annotation.Log; |
| | | import org.ruoyi.common.log.enums.BusinessType; |
| | | import org.ruoyi.common.mybatis.core.page.PageQuery; |
| | | import org.ruoyi.common.mybatis.core.page.TableDataInfo; |
| | | import org.ruoyi.core.page.PageQuery; |
| | | import org.ruoyi.core.page.TableDataInfo; |
| | | import org.ruoyi.common.satoken.utils.LoginHelper; |
| | | import org.ruoyi.common.tenant.helper.TenantHelper; |
| | | import org.ruoyi.common.web.core.BaseController; |