fzzj преди 9 месеца
родител
ревизия
3765687847
променени са 25 файла, в които са добавени 716 реда и са изтрити 78 реда
  1. 18
    1
      RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
  2. 20
    1
      RuoYi-Vue/ruoyi-admin/src/main/resources/application-druid.yml
  3. 14
    0
      RuoYi-Vue/ruoyi-admin/src/main/resources/application.yml
  4. 21
    9
      RuoYi-Vue/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java
  5. 43
    8
      RuoYi-Vue/ruoyi-system/pom.xml
  6. 27
    0
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/config/CustomHealthIndicator.java
  7. 90
    0
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/config/DataSourceConfig.java
  8. 42
    0
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/config/ElasticsearchConfig.java
  9. 33
    0
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/config/ElasticsearchInitializer.java
  10. 41
    0
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/config/JpaConfig.java
  11. 3
    2
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/config/NovelJwtAuthenticationTokenFilter.java
  12. 3
    1
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/config/SecurityConfig.java
  13. 8
    15
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/controller/NovelController.java
  14. 10
    2
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/domain/Novel.java
  15. 8
    0
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/repository/elastic/NovelSearchRepository.java
  16. 10
    1
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/repository/jpa/NovelRepository.java
  17. 180
    0
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/repository/jpa/NovelRepositoryImpl.java
  18. 5
    0
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/IAuthService.java
  19. 32
    1
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/NovelService.java
  20. 8
    2
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/UserRepository.java
  21. 47
    23
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/impl/AuthServiceImpl.java
  22. 39
    10
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/impl/NovelServiceImpl.java
  23. 4
    2
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
  24. 2
    0
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
  25. 8
    0
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java

+ 18
- 1
RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java Целия файл

@@ -2,14 +2,31 @@ package com.ruoyi;
2 2
 
3 3
 import org.springframework.boot.SpringApplication;
4 4
 import org.springframework.boot.autoconfigure.SpringBootApplication;
5
+import org.springframework.boot.autoconfigure.domain.EntityScan;
5 6
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
7
+import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
8
+import org.springframework.context.annotation.ComponentScan;
9
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
6 10
 
7 11
 /**
8 12
  * 启动程序
9 13
  * 
10 14
  * @author ruoyi
11 15
  */
12
-@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
16
+@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class},
17
+        scanBasePackages = {
18
+                "com.ruoyi",
19
+                "com.ruoyi.novel"  // 确保包含 novel 包
20
+        })
21
+@EnableJpaRepositories(basePackages = "com.ruoyi.novel.repository.jpa")
22
+
23
+@EntityScan("com.ruoyi.novel.domain")
24
+@ComponentScan(basePackages = {
25
+        "com.ruoyi.framework",
26
+        "com.ruoyi.system",
27
+        "com.ruoyi.common",
28
+        "com.ruoyi.novel"
29
+})
13 30
 public class RuoYiApplication
14 31
 {
15 32
     public static void main(String[] args)

+ 20
- 1
RuoYi-Vue/ruoyi-admin/src/main/resources/application-druid.yml Целия файл

@@ -61,4 +61,23 @@ spring:
61 61
                         multi-statement-allow: true
62 62
             remove-abandoned: true
63 63
             remove-abandoned-timeout: 300  # 5分钟无操作视为泄露
64
-            log-abandoned: true
64
+            log-abandoned: true
65
+    jpa:
66
+        hibernate:
67
+            ddl-auto: update
68
+        show-sql: true
69
+        properties:
70
+            hibernate:
71
+                dialect: org.hibernate.dialect.MySQL8Dialect
72
+                format_sql: true
73
+
74
+    # Elasticsearch 配置
75
+    data:
76
+        elasticsearch:
77
+            client:
78
+                reactive:
79
+                    endpoints: localhost:9200
80
+            repositories:
81
+                enabled: true
82
+            cluster-nodes: localhost:9300  # 如果是集群模式
83
+            cluster-name: elasticsearch    # 集群名称

+ 14
- 0
RuoYi-Vue/ruoyi-admin/src/main/resources/application.yml Целия файл

@@ -93,6 +93,15 @@ spring:
93 93
     uris: http://localhost:9200 # ES地址
94 94
     connection-timeout: 3000
95 95
     socket-timeout: 5000
96
+  jpa:
97
+    show-sql: true
98
+    hibernate:
99
+      ddl-auto: update
100
+    properties:
101
+      hibernate:
102
+        dialect: org.hibernate.dialect.MySQL8Dialect
103
+        format_sql: true
104
+        use_sql_comments: true
96 105
 # PHP系统配置
97 106
 php:
98 107
   data:
@@ -186,3 +195,8 @@ xss:
186 195
 # application.yml(或 application-dev.yml)
187 196
 scheduled:
188 197
   ad-retry-interval: 30000  # 单位:毫秒,示例值30秒,按需调整
198
+app:
199
+  jwt:
200
+    secret: your-very-strong-secret-key-here # 至少32位随机字符串
201
+    expiration: 86400000 # 令牌过期时间(毫秒),默认24小时
202
+    header: Authorization # 请求头名称

+ 21
- 9
RuoYi-Vue/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java Целия файл

@@ -3,6 +3,7 @@ package com.ruoyi.framework.web.service;
3 3
 import org.slf4j.Logger;
4 4
 import org.slf4j.LoggerFactory;
5 5
 import org.springframework.beans.factory.annotation.Autowired;
6
+import org.springframework.beans.factory.annotation.Qualifier;
6 7
 import org.springframework.security.core.userdetails.UserDetails;
7 8
 import org.springframework.security.core.userdetails.UserDetailsService;
8 9
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
@@ -25,14 +26,21 @@ public class UserDetailsServiceImpl implements UserDetailsService
25 26
 {
26 27
     private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class);
27 28
 
28
-    @Autowired
29
-    private ISysUserService userService;
30
-    
31
-    @Autowired
32
-    private SysPasswordService passwordService;
29
+    private final ISysUserService userService;
30
+    private final SysPasswordService passwordService;
31
+    private final SysPermissionService permissionService;
33 32
 
33
+    // 修复构造函数注入
34 34
     @Autowired
35
-    private SysPermissionService permissionService;
35
+    public UserDetailsServiceImpl(
36
+            ISysUserService userService,
37
+            SysPasswordService passwordService,
38
+            SysPermissionService permissionService) {
39
+
40
+        this.userService = userService;
41
+        this.passwordService = passwordService;
42
+        this.permissionService = permissionService;
43
+    }
36 44
 
37 45
     @Override
38 46
     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
@@ -59,8 +67,12 @@ public class UserDetailsServiceImpl implements UserDetailsService
59 67
         return createLoginUser(user);
60 68
     }
61 69
 
62
-    public UserDetails createLoginUser(SysUser user)
63
-    {
64
-        return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user));
70
+    public UserDetails createLoginUser(SysUser user) {
71
+        return new LoginUser(
72
+                user.getUserId(),
73
+                user.getDeptId(),
74
+                user,
75
+                permissionService.getMenuPermission(user)
76
+        );
65 77
     }
66 78
 }

+ 43
- 8
RuoYi-Vue/ruoyi-system/pom.xml Целия файл

@@ -74,10 +74,10 @@
74 74
             <artifactId>guava</artifactId>
75 75
             <version>33.4.0-jre</version> <!-- 使用较新版本 -->
76 76
         </dependency>
77
-<!--        <dependency>-->
78
-<!--            <groupId>org.projectlombok</groupId>-->
79
-<!--            <artifactId>lombok</artifactId>-->
80
-<!--        </dependency>-->
77
+        <!--        <dependency>-->
78
+        <!--            <groupId>org.projectlombok</groupId>-->
79
+        <!--            <artifactId>lombok</artifactId>-->
80
+        <!--        </dependency>-->
81 81
         <dependency>
82 82
             <groupId>org.aspectj</groupId>
83 83
             <artifactId>aspectjweaver</artifactId>
@@ -85,11 +85,38 @@
85 85
         <dependency>
86 86
             <groupId>org.springframework.boot</groupId>
87 87
             <artifactId>spring-boot-starter-data-jpa</artifactId>
88
+<!--            <exclusions>-->
89
+<!--                <exclusion>-->
90
+<!--                    <groupId>org.hibernate</groupId>-->
91
+<!--                    <artifactId>hibernate-core</artifactId>-->
92
+<!--                </exclusion>-->
93
+<!--                <exclusion>-->
94
+<!--                    <groupId>org.hibernate</groupId>-->
95
+<!--                    <artifactId>hibernate-entitymanager</artifactId>-->
96
+<!--                </exclusion>-->
97
+<!--            </exclusions>-->
88 98
         </dependency>
89
-<!--        <dependency>-->
90
-<!--            <groupId>org.springframework.boot</groupId>-->
91
-<!--            <artifactId>spring-boot-starter-data-jpa</artifactId>-->
92
-<!--        </dependency>-->
99
+        <!--        <dependency>-->
100
+        <!--            <groupId>org.springframework.boot</groupId>-->
101
+        <!--            <artifactId>spring-boot-starter-data-jpa</artifactId>-->
102
+        <!--        </dependency>-->
103
+        <dependency>
104
+            <groupId>org.springframework.boot</groupId>
105
+            <artifactId>spring-boot-starter-actuator</artifactId>
106
+<!--            <version>2.7.0</version> &lt;!&ndash; 根据Spring Boot版本调整 &ndash;&gt;-->
107
+        </dependency>
108
+        <!-- JPA API -->
109
+        <dependency>
110
+            <groupId>jakarta.persistence</groupId>
111
+            <artifactId>jakarta.persistence-api</artifactId>
112
+            <version>3.1.0</version>
113
+        </dependency>
114
+        <!-- Spring ORM 支持 -->
115
+        <dependency>
116
+            <groupId>org.springframework</groupId>
117
+            <artifactId>spring-orm</artifactId>
118
+        </dependency>
119
+
93 120
         <dependency>
94 121
             <groupId>org.testng</groupId>
95 122
             <artifactId>testng</artifactId>
@@ -114,6 +141,14 @@
114 141
             <version>0.11.5</version>
115 142
             <scope>runtime</scope>
116 143
         </dependency>
144
+        <dependency>
145
+            <groupId>jakarta.persistence</groupId>
146
+            <artifactId>jakarta.persistence-api</artifactId>
147
+        </dependency>
148
+        <dependency>
149
+            <groupId>org.springframework.boot</groupId>
150
+            <artifactId>spring-boot-actuator</artifactId>
151
+        </dependency>
117 152
     </dependencies>
118 153
 
119 154
 </project>

+ 27
- 0
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/config/CustomHealthIndicator.java Целия файл

@@ -0,0 +1,27 @@
1
+package com.ruoyi.novel.config;
2
+
3
+import org.springframework.boot.actuate.health.AbstractHealthIndicator;
4
+import org.springframework.boot.actuate.health.Health;
5
+import org.springframework.boot.actuate.health.HealthIndicator;
6
+import org.springframework.stereotype.Component;
7
+
8
+@Component
9
+public class CustomHealthIndicator extends AbstractHealthIndicator implements HealthIndicator {
10
+    @Override
11
+    protected void doHealthCheck(Health.Builder builder) throws Exception {
12
+        // 检查逻辑(如数据库连接)
13
+//        boolean isHealthy = checkService();
14
+//        if (isHealthy) {
15
+//            builder.up()
16
+//                    .withDetail("service", "available");
17
+//        } else {
18
+//            builder.down()
19
+//                    .withDetail("error", "connection refused");
20
+//        }
21
+    }
22
+
23
+//    @Override
24
+//    public Health health() {
25
+//        return Health.up().withDetail("status", "active").build();
26
+//    }
27
+}

+ 90
- 0
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/config/DataSourceConfig.java Целия файл

@@ -0,0 +1,90 @@
1
+//package com.ruoyi.novel.config;
2
+//
3
+//import org.elasticsearch.client.RestHighLevelClient;
4
+//import org.springframework.beans.factory.annotation.Qualifier;
5
+//import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
6
+//import org.springframework.boot.context.properties.ConfigurationProperties;
7
+//import org.springframework.boot.jdbc.DataSourceBuilder;
8
+//import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
9
+//import org.springframework.context.annotation.Bean;
10
+//import org.springframework.context.annotation.Configuration;
11
+//import org.springframework.context.annotation.Primary;
12
+//import org.springframework.data.elasticsearch.client.ClientConfiguration;
13
+//import org.springframework.data.elasticsearch.client.RestClients;
14
+//import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
15
+//import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
16
+//import org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter;
17
+//import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext;
18
+//import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
19
+//import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
20
+//import org.springframework.orm.jpa.JpaTransactionManager;
21
+//import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
22
+//import org.springframework.transaction.PlatformTransactionManager;
23
+//
24
+////import javax.persistence.EntityManagerFactory;
25
+//import javax.sql.DataSource;
26
+//
27
+//// src/main/java/com/ruoyi/novel/config/DataSourceConfig.java
28
+//@Configuration
29
+//@EnableJpaRepositories(
30
+//        basePackages = "com.ruoyi.novel.repository.jpa",
31
+//        entityManagerFactoryRef = "jpaEntityManagerFactory",
32
+//        transactionManagerRef = "jpaTransactionManager"
33
+//)
34
+//@EnableElasticsearchRepositories(
35
+//        basePackages = "com.ruoyi.novel.repository.elastic",
36
+//        elasticsearchTemplateRef = "elasticsearchTemplate"
37
+//)
38
+//public class DataSourceConfig {
39
+//
40
+//    // JPA 配置
41
+//    /**
42
+//     * 主数据源配置(MySQL)
43
+//     */
44
+//    @Bean(name = "dataSource")
45
+//    @Primary
46
+//    @ConfigurationProperties(prefix = "spring.datasource")
47
+//    public DataSource dataSource() {
48
+//        return DataSourceBuilder.create().build();
49
+//    }
50
+//
51
+//    /**
52
+//     * Elasticsearch 客户端配置
53
+//     */
54
+//    @Bean
55
+//    public RestHighLevelClient elasticsearchClient() {
56
+//        // 从配置文件读取ES配置
57
+//        ClientConfiguration clientConfiguration = ClientConfiguration.builder()
58
+//                .connectedTo("localhost:9200") // ES服务器地址
59
+//                .withConnectTimeout(5000)       // 连接超时
60
+//                .withSocketTimeout(10000)        // 套接字超时
61
+//                .build();
62
+//
63
+//        return RestClients.create(clientConfiguration).rest();
64
+//    }
65
+//    /**
66
+//     * Elasticsearch 映射上下文
67
+//     */
68
+//    @Bean
69
+//    public SimpleElasticsearchMappingContext elasticsearchMappingContext() {
70
+//        return new SimpleElasticsearchMappingContext();
71
+//    }
72
+//
73
+//    /**
74
+//     * Elasticsearch 转换器
75
+//     */
76
+//    @Bean
77
+//    public ElasticsearchConverter elasticsearchConverter() {
78
+//        return new MappingElasticsearchConverter(elasticsearchMappingContext());
79
+//    }
80
+//
81
+//    /**
82
+//     * Elasticsearch 模板
83
+//     */
84
+//    @Bean(name = "elasticsearchTemplate")
85
+//    public ElasticsearchRestTemplate elasticsearchTemplate(
86
+//            @Qualifier("elasticsearchClient") RestHighLevelClient client,
87
+//            ElasticsearchConverter converter) {
88
+//        return new ElasticsearchRestTemplate(client, converter);
89
+//    }
90
+//}

+ 42
- 0
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/config/ElasticsearchConfig.java Целия файл

@@ -0,0 +1,42 @@
1
+package com.ruoyi.novel.config;
2
+
3
+import org.elasticsearch.client.RequestOptions;
4
+import org.elasticsearch.client.RestHighLevelClient;
5
+import org.springframework.boot.actuate.health.AbstractHealthIndicator;
6
+import org.springframework.boot.actuate.health.Health;
7
+import org.springframework.boot.actuate.health.HealthIndicator;
8
+import org.springframework.boot.actuate.health.Status;
9
+import org.springframework.context.annotation.Bean;
10
+import org.springframework.context.annotation.Configuration;
11
+import org.springframework.data.elasticsearch.client.ClientConfiguration;
12
+import org.springframework.data.elasticsearch.client.RestClients;
13
+import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
14
+
15
+@Configuration
16
+public class ElasticsearchConfig {
17
+
18
+    @Bean
19
+    public ElasticsearchRestTemplate elasticsearchRestTemplate(RestHighLevelClient client) {
20
+        return new ElasticsearchRestTemplate(client);
21
+    }
22
+
23
+    @Bean
24
+    public RestHighLevelClient elasticsearchClient() {
25
+        return RestClients.create(ClientConfiguration.localhost()).rest();
26
+    }
27
+
28
+    @Bean
29
+    public HealthIndicator elasticsearchHealthIndicator(RestHighLevelClient client) {
30
+        return new AbstractHealthIndicator() {
31
+            @Override
32
+            protected void doHealthCheck(Health.Builder builder) throws Exception {
33
+                try {
34
+                    boolean available = client.ping(RequestOptions.DEFAULT);
35
+                    builder.status(available ? Status.UP : Status.DOWN);
36
+                } catch (Exception e) {
37
+                    builder.down(e);
38
+                }
39
+            }
40
+        };
41
+    }
42
+}

+ 33
- 0
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/config/ElasticsearchInitializer.java Целия файл

@@ -0,0 +1,33 @@
1
+package com.ruoyi.novel.config;
2
+
3
+import com.ruoyi.novel.domain.Novel;
4
+import com.ruoyi.novel.service.impl.NovelServiceImpl;
5
+import org.slf4j.Logger;
6
+import org.slf4j.LoggerFactory;
7
+import org.springframework.boot.ApplicationArguments;
8
+import org.springframework.boot.ApplicationRunner;
9
+import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
10
+import org.springframework.stereotype.Component;
11
+
12
+@Component
13
+public class ElasticsearchInitializer implements ApplicationRunner {
14
+    private static final Logger logger = LoggerFactory.getLogger(ElasticsearchInitializer.class);
15
+    private final ElasticsearchRestTemplate elasticsearchTemplate;
16
+
17
+    public ElasticsearchInitializer(ElasticsearchRestTemplate elasticsearchTemplate) {
18
+        this.elasticsearchTemplate = elasticsearchTemplate;
19
+    }
20
+
21
+    @Override
22
+    public void run(ApplicationArguments args) {
23
+        try {
24
+            if (!elasticsearchTemplate.indexOps(Novel.class).exists()) {
25
+                elasticsearchTemplate.indexOps(Novel.class).create();
26
+                elasticsearchTemplate.indexOps(Novel.class).putMapping();
27
+                logger.info("Created Elasticsearch index for Novel");
28
+            }
29
+        } catch (Exception e) {
30
+            logger.warn("Failed to create Elasticsearch index", e);
31
+        }
32
+    }
33
+}

+ 41
- 0
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/config/JpaConfig.java Целия файл

@@ -0,0 +1,41 @@
1
+package com.ruoyi.novel.config;
2
+
3
+import org.springframework.context.annotation.Bean;
4
+import org.springframework.context.annotation.Configuration;
5
+import org.springframework.orm.jpa.JpaTransactionManager;
6
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
7
+import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
8
+import org.springframework.transaction.PlatformTransactionManager;
9
+
10
+import javax.persistence.EntityManagerFactory;
11
+import javax.sql.DataSource;
12
+import java.util.Properties;
13
+
14
+// 在 com.ruoyi.framework.config 包下
15
+@Configuration
16
+public class JpaConfig {
17
+
18
+    @Bean
19
+    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
20
+        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
21
+        em.setDataSource(dataSource);
22
+        em.setPackagesToScan("com.ruoyi.novel.domain"); // 实体类所在包
23
+
24
+        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
25
+        em.setJpaVendorAdapter(vendorAdapter);
26
+
27
+        Properties properties = new Properties();
28
+        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect");
29
+        properties.setProperty("hibernate.hbm2ddl.auto", "update");
30
+        em.setJpaProperties(properties);
31
+
32
+        return em;
33
+    }
34
+
35
+    @Bean
36
+    public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
37
+        JpaTransactionManager transactionManager = new JpaTransactionManager();
38
+        transactionManager.setEntityManagerFactory(entityManagerFactory);
39
+        return transactionManager;
40
+    }
41
+}

RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/config/JwtAuthenticationTokenFilter.java → RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/config/NovelJwtAuthenticationTokenFilter.java Целия файл

@@ -17,8 +17,9 @@ import javax.servlet.http.HttpServletRequest;
17 17
 import javax.servlet.http.HttpServletResponse;
18 18
 import java.io.IOException;
19 19
 
20
-@Component
21
-public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
20
+
21
+@Component("novelJwtTokenFilter") // 修改Bean名称
22
+public class NovelJwtAuthenticationTokenFilter  extends OncePerRequestFilter {
22 23
 
23 24
     @Autowired
24 25
     private TokenProvider tokenService;

+ 3
- 1
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/config/SecurityConfig.java Целия файл

@@ -23,7 +23,9 @@
23 23
 //@EnableWebSecurity
24 24
 //@EnableGlobalMethodSecurity(prePostEnabled = true)
25 25
 //public class SecurityConfig extends WebSecurityConfigurerAdapter {
26
-//
26
+//@Autowired
27
+//@Qualifier("novelJwtTokenFilter") // 使用新名称
28
+//private NovelJwtAuthenticationTokenFilter novelJwtTokenFilter;
27 29
 //    @Autowired
28 30
 //    private CustomUserDetailsService customUserDetailsService;
29 31
 //

+ 8
- 15
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/controller/NovelController.java Целия файл

@@ -43,10 +43,7 @@ public class NovelController extends BaseController {
43 43
         this.authService = authService;
44 44
     }
45 45
     // 添加所有缺失方法
46
-    @GetMapping("/categories")
47
-    public List<Category> getAllCategories() {
48
-        return novelService.getAllCategories();
49
-    }
46
+
50 47
     @GetMapping("/hot")
51 48
     public List<Novel> getHotNovels() {
52 49
         return novelService.getHotNovels();
@@ -73,11 +70,7 @@ public class NovelController extends BaseController {
73 70
 public TableDataInfo getNovelsByCategory(@RequestParam(required = false) Long categoryId) {
74 71
     return (TableDataInfo) novelService.getNovelsByCategory(categoryId);
75 72
 }
76
-//    @GetMapping("/list")
77
-//    public ResponseEntity<?> getNovelsByCategory(@RequestParam(required = false) Long categoryId) {
78
-//        return ResponseEntity.ok(novelService.getNovelsByCategory(categoryId));
79
-//    }
80
-    // 获取小说章节列表
73
+
81 74
 // 获取小说章节列表
82 75
 @GetMapping("/{novelId}/chapters")
83 76
 public AjaxResult getChapters(@PathVariable Long novelId) {
@@ -121,12 +114,12 @@ public AjaxResult getChapterContent(@PathVariable Long chapterId) {
121 114
         novelService.submitAuthorApplication(dto, userId);
122 115
         return ResponseEntity.ok().build();
123 116
     }
124
-    @GetMapping("/list")
125
-    public TableDataInfo list(Novel novel) {
126
-        startPage();
127
-        List<Novel> list = novelService.selectNovelList(novel);
128
-        return getDataTable(list);
129
-    }
117
+//    @GetMapping("/list")
118
+//    public TableDataInfo list(Novel novel) {
119
+//        startPage();
120
+//        List<Novel> list = novelService.selectNovelList(novel);
121
+//        return getDataTable(list);
122
+//    }
130 123
     @PostMapping("/add")
131 124
     public AjaxResult add(@RequestBody Novel novel) {
132 125
         return toAjax(novelService.insertNovel(novel));

+ 10
- 2
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/domain/Novel.java Целия файл

@@ -10,15 +10,21 @@ import org.springframework.data.elasticsearch.annotations.Field;
10 10
 import org.springframework.data.elasticsearch.annotations.FieldType;
11 11
 
12 12
 import javax.persistence.Column;
13
+import javax.persistence.Entity;
14
+import javax.persistence.GeneratedValue;
15
+import javax.persistence.GenerationType;
13 16
 import java.util.Date;
14 17
 
15 18
 // Novel.java
16
-@Data
19
+
20
+@Entity
17 21
 @TableName("novel")
18 22
 @Document(indexName = "novels")
23
+@Data
19 24
 public class Novel {
25
+    @javax.persistence.Id
20 26
     @Id
21
-    //@GeneratedValue(strategy = GenerationType.IDENTITY)
27
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
22 28
     @TableId(type = IdType.AUTO)
23 29
     private Long id;
24 30
     @Field(type = FieldType.Text, analyzer = "ik_max_word")
@@ -42,4 +48,6 @@ public class Novel {
42 48
     private Date createTime = new Date();
43 49
     @Column(name = "update_time")
44 50
     private Date updateTime = new Date();
51
+
52
+
45 53
 }

+ 8
- 0
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/repository/elastic/NovelSearchRepository.java Целия файл

@@ -0,0 +1,8 @@
1
+package com.ruoyi.novel.repository.elastic;
2
+
3
+import com.ruoyi.novel.domain.Novel;
4
+import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
5
+
6
+public interface NovelSearchRepository extends ElasticsearchRepository<Novel, Long> {
7
+    // Elasticsearch 特定查询方法
8
+}

RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/NovelRepository.java → RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/repository/jpa/NovelRepository.java Целия файл

@@ -1,19 +1,28 @@
1
-package com.ruoyi.novel.service;
1
+package com.ruoyi.novel.repository.jpa;
2 2
 
3 3
 import com.ruoyi.novel.domain.Novel;
4 4
 import org.apache.ibatis.annotations.Param;
5 5
 import org.springframework.data.elasticsearch.annotations.Query;
6 6
 import org.springframework.data.jpa.repository.JpaRepository;
7
+import org.springframework.data.repository.NoRepositoryBean;
8
+import org.springframework.stereotype.Repository;
7 9
 
8 10
 import java.awt.print.Pageable;
9 11
 import java.util.Date;
10 12
 import java.util.List;
13
+import java.util.Optional;
11 14
 
15
+@Repository
12 16
 // NovelRepository.java
17
+@NoRepositoryBean  // 防止被实例化
13 18
 public interface NovelRepository extends JpaRepository<Novel, Long> {
14 19
 
15 20
     @Query("SELECT n FROM Novel n WHERE n.updateTime > :since ORDER BY n.readCount DESC")
16 21
     List<Novel> findHotNovels(@Param("since") Date since, Pageable pageable);
17 22
 
18 23
     List<Novel> findByCategoryId(Integer categoryId, Pageable pageable);
24
+
25
+    Novel save(Novel novel);
26
+    Optional<Novel> findById(Long id);
27
+    List<Novel> findAll();
19 28
 }

+ 180
- 0
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/repository/jpa/NovelRepositoryImpl.java Целия файл

@@ -0,0 +1,180 @@
1
+package com.ruoyi.novel.repository.jpa;
2
+
3
+import com.ruoyi.novel.domain.Novel;
4
+import org.springframework.data.domain.Example;
5
+import org.springframework.data.domain.Page;
6
+import org.springframework.data.domain.Sort;
7
+import org.springframework.stereotype.Repository;
8
+
9
+import javax.persistence.EntityManager;
10
+import javax.persistence.PersistenceContext;
11
+import javax.persistence.criteria.CriteriaQuery;
12
+import java.awt.print.Pageable;
13
+import java.util.Date;
14
+import java.util.List;
15
+import java.util.Optional;
16
+
17
+@Repository
18
+public class NovelRepositoryImpl implements NovelRepository {
19
+
20
+    @PersistenceContext
21
+    private EntityManager entityManager;
22
+
23
+    @Override
24
+    public List<Novel> findHotNovels(Date since, Pageable pageable) {
25
+        return null;
26
+    }
27
+
28
+    @Override
29
+    public List<Novel> findByCategoryId(Integer categoryId, Pageable pageable) {
30
+        return null;
31
+    }
32
+
33
+    @Override
34
+    public Novel save(Novel novel) {
35
+        if (novel.getId() == null) {
36
+            entityManager.persist(novel);
37
+            return novel;
38
+        } else {
39
+            return entityManager.merge(novel);
40
+        }
41
+    }
42
+
43
+    @Override
44
+    public Optional<Novel> findById(Long id) {
45
+        return Optional.ofNullable(entityManager.find(Novel.class, id));
46
+    }
47
+
48
+    @Override
49
+    public boolean existsById(Long aLong) {
50
+        return false;
51
+    }
52
+
53
+    @Override
54
+    public List<Novel> findAll() {
55
+        CriteriaQuery<Novel> query = entityManager.getCriteriaBuilder().createQuery(Novel.class);
56
+        query.select(query.from(Novel.class));
57
+        return entityManager.createQuery(query).getResultList();
58
+    }
59
+
60
+    @Override
61
+    public List<Novel> findAll(Sort sort) {
62
+        return null;
63
+    }
64
+
65
+    @Override
66
+    public Page<Novel> findAll(org.springframework.data.domain.Pageable pageable) {
67
+        return null;
68
+    }
69
+
70
+    @Override
71
+    public List<Novel> findAllById(Iterable<Long> longs) {
72
+        return null;
73
+    }
74
+
75
+    @Override
76
+    public long count() {
77
+        return 0;
78
+    }
79
+
80
+    @Override
81
+    public void deleteById(Long aLong) {
82
+
83
+    }
84
+
85
+    @Override
86
+    public void delete(Novel entity) {
87
+
88
+    }
89
+
90
+    @Override
91
+    public void deleteAllById(Iterable<? extends Long> longs) {
92
+
93
+    }
94
+
95
+    @Override
96
+    public void deleteAll(Iterable<? extends Novel> entities) {
97
+
98
+    }
99
+
100
+    @Override
101
+    public void deleteAll() {
102
+
103
+    }
104
+
105
+    @Override
106
+    public <S extends Novel> List<S> saveAll(Iterable<S> entities) {
107
+        return null;
108
+    }
109
+
110
+    @Override
111
+    public void flush() {
112
+
113
+    }
114
+
115
+    @Override
116
+    public <S extends Novel> S saveAndFlush(S entity) {
117
+        return null;
118
+    }
119
+
120
+    @Override
121
+    public <S extends Novel> List<S> saveAllAndFlush(Iterable<S> entities) {
122
+        return null;
123
+    }
124
+
125
+    @Override
126
+    public void deleteAllInBatch(Iterable<Novel> entities) {
127
+
128
+    }
129
+
130
+    @Override
131
+    public void deleteAllByIdInBatch(Iterable<Long> longs) {
132
+
133
+    }
134
+
135
+    @Override
136
+    public void deleteAllInBatch() {
137
+
138
+    }
139
+
140
+    @Override
141
+    public Novel getOne(Long aLong) {
142
+        return null;
143
+    }
144
+
145
+    @Override
146
+    public Novel getById(Long aLong) {
147
+        return null;
148
+    }
149
+
150
+    @Override
151
+    public <S extends Novel> Optional<S> findOne(Example<S> example) {
152
+        return Optional.empty();
153
+    }
154
+
155
+    @Override
156
+    public <S extends Novel> List<S> findAll(Example<S> example) {
157
+        return null;
158
+    }
159
+
160
+    @Override
161
+    public <S extends Novel> List<S> findAll(Example<S> example, Sort sort) {
162
+        return null;
163
+    }
164
+
165
+    @Override
166
+    public <S extends Novel> Page<S> findAll(Example<S> example, org.springframework.data.domain.Pageable pageable) {
167
+        return null;
168
+    }
169
+
170
+    @Override
171
+    public <S extends Novel> long count(Example<S> example) {
172
+        return 0;
173
+    }
174
+
175
+    @Override
176
+    public <S extends Novel> boolean exists(Example<S> example) {
177
+        return false;
178
+    }
179
+
180
+}

+ 5
- 0
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/IAuthService.java Целия файл

@@ -1,9 +1,14 @@
1 1
 package com.ruoyi.novel.service;
2 2
 
3 3
 import com.ruoyi.common.core.domain.model.LoginUser;
4
+import org.springframework.stereotype.Service;
4 5
 
6
+@Service
5 7
 // IAuthService.java
6 8
 public interface IAuthService {
7 9
     LoginUser getLoginUser(String token);
8 10
     Long getUserIdFromToken(String token);
11
+
12
+    boolean authenticate(String token);
13
+    String generateToken(String userId);
9 14
 }

+ 32
- 1
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/NovelService.java Целия файл

@@ -4,12 +4,20 @@ import com.ruoyi.novel.domain.AuthorApplication;
4 4
 import com.ruoyi.novel.domain.AuthorApplicationDTO;
5 5
 import com.ruoyi.novel.domain.Chapter;
6 6
 import com.ruoyi.novel.domain.Novel;
7
+import com.ruoyi.novel.repository.elastic.NovelSearchRepository;
8
+import com.ruoyi.novel.repository.jpa.NovelRepository;
7 9
 import jdk.jfr.Category;
10
+import org.elasticsearch.client.tasks.ElasticsearchException;
11
+import org.springframework.scheduling.annotation.Async;
12
+import org.springframework.stereotype.Service;
13
+import org.springframework.transaction.annotation.Propagation;
8 14
 import org.springframework.transaction.annotation.Transactional;
9 15
 import org.springframework.web.multipart.MultipartFile;
10 16
 
17
+import javax.annotation.PostConstruct;
11 18
 import java.util.List;
12
-
19
+@Service
20
+@Transactional
13 21
 public interface NovelService {
14 22
     List<Novel> selectNovelList(Novel novel);
15 23
 
@@ -33,6 +41,8 @@ public interface NovelService {
33 41
     Chapter getChapterContent(Long chapterId);
34 42
     void submitAuthorApplication(AuthorApplicationDTO dto, Long userId);
35 43
 
44
+    List<Novel> getAllNovels();
45
+
36 46
     Novel processNovelUpload(MultipartFile file, String title, Long authorId);
37 47
 
38 48
     Chapter processChapterUpload(MultipartFile file, Long novelId, Integer chapterOrder);
@@ -46,4 +56,25 @@ public interface NovelService {
46 56
 //    List<Chapter> getChaptersByNovelId(Long novelId);
47 57
 //    String getChapterContent(Long chapterId);
48 58
 //    void submitAuthorApplication(AuthorApplicationDTO dto, Long userId);
59
+public NovelRepository novelRepository = null; // JPA
60
+    public NovelSearchRepository novelSearchRepository = null; // ES
61
+    @Transactional(propagation = Propagation.REQUIRED)
62
+    public default void syncNovelToEs(Long novelId) {
63
+        Novel novel = novelRepository.findById(novelId).orElseThrow();
64
+        novelSearchRepository.save(novel);
65
+    }
66
+
67
+    @Async
68
+    public default void asyncIndexToEs(Novel novel) {
69
+        novelSearchRepository.save(novel);
70
+    }
71
+//    @Retryable(value = { ElasticsearchException.class }, maxAttempts = 3, backoff = @Backoff(delay = 1000))
72
+//    public void saveToEsWithRetry(Novel novel) {
73
+//        novelSearchRepository.save(novel);
74
+//    }
75
+    @PostConstruct
76
+    public default void checkRepositories() {
77
+        assert novelRepository != null : "JPA Repository未注入";
78
+        assert novelSearchRepository != null : "ES Repository未注入";
79
+    }
49 80
 }

+ 8
- 2
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/UserRepository.java Целия файл

@@ -2,11 +2,17 @@ package com.ruoyi.novel.service;
2 2
 
3 3
 import org.elasticsearch.client.security.user.User;
4 4
 import org.springframework.data.jpa.repository.JpaRepository;
5
+import org.springframework.stereotype.Repository;
5 6
 
6 7
 import java.util.Optional;
7
-
8
+@Repository
8 9
 // UserRepository.java
9 10
 public interface UserRepository extends JpaRepository<User, Long> {
10 11
 
11
-    Optional<User> findByUsername(String username);
12
+    //Optional<User> findByUsername(String username);
13
+    // 自定义查询方法
14
+    User findByUsername(String username);
15
+    User findByEmail(String email);
16
+
17
+    User findByToken(String token);
12 18
 }

+ 47
- 23
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/impl/AuthServiceImpl.java Целия файл

@@ -1,31 +1,43 @@
1
-//package com.ruoyi.novel.service.impl;
2
-//
3
-//import com.ruoyi.common.core.domain.model.LoginUser;
4
-//import com.ruoyi.novel.service.IAuthService;
5
-//import com.ruoyi.novel.service.TokenService;
6
-//import com.ruoyi.novel.service.UserRepository;
7
-//import com.ruoyi.novel.utils.JwtTokenProvider;
8
-//import org.springframework.beans.factory.annotation.Autowired;
9
-//import org.springframework.stereotype.Service;
10
-//
11
-//@Service
12
-//public class AuthServiceImpl implements IAuthService {
13
-//
14
-//    @Autowired
15
-//    private JwtTokenProvider tokenProvider;
16
-//
17
-//    @Autowired
18
-//    private UserRepository userRepository;
1
+package com.ruoyi.novel.service.impl;
2
+
3
+import com.ruoyi.common.core.domain.model.LoginUser;
4
+import com.ruoyi.novel.service.IAuthService;
5
+import com.ruoyi.novel.service.UserRepository;
6
+import com.ruoyi.novel.utils.JwtTokenProvider;
7
+import org.springframework.beans.factory.annotation.Autowired;
8
+import org.springframework.stereotype.Service;
9
+
10
+@Service
11
+public class AuthServiceImpl implements IAuthService {
12
+
13
+    @Autowired
14
+    private JwtTokenProvider tokenProvider;
15
+
16
+    @Autowired
17
+    private UserRepository userRepository;
19 18
 //    @Autowired
20 19
 //    private final TokenService tokenService;
21
-//
22
-//
23
-//
20
+
21
+    @Autowired
22
+    public AuthServiceImpl(UserRepository userRepository) {
23
+        this.userRepository = userRepository;
24
+    }
25
+
24 26
 //    @Autowired
25 27
 //    public AuthServiceImpl(TokenService tokenService) {
26 28
 //        this.tokenService = tokenService;
27 29
 //    }
28
-//
30
+
31
+    @Override
32
+    public LoginUser getLoginUser(String token) {
33
+        return null;
34
+    }
35
+
36
+    @Override
37
+    public Long getUserIdFromToken(String token) {
38
+        return null;
39
+    }
40
+
29 41
 //    @Override
30 42
 //    public LoginUser getLoginUser(String token) {
31 43
 //        return tokenService.getLoginUser(token);
@@ -35,4 +47,16 @@
35 47
 //    public Long getUserIdFromToken(String token) {
36 48
 //        return tokenService.parseUserId(token);
37 49
 //    }
38
-//}
50
+    @Override
51
+    public boolean authenticate(String token) {
52
+        // 实际实现:验证JWT令牌
53
+        //return token != null && token.startsWith("valid-");
54
+        return userRepository.findByToken(token) != null;
55
+    }
56
+
57
+    @Override
58
+    public String generateToken(String userId) {
59
+        // 实际实现:生成JWT令牌
60
+        return "generated-token-for-" + userId;
61
+    }
62
+}

+ 39
- 10
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/impl/NovelServiceImpl.java Целия файл

@@ -13,6 +13,9 @@ import com.ruoyi.novel.mapper.AuthorApplicationMapper;
13 13
 import com.ruoyi.novel.mapper.CategoryMapper;
14 14
 import com.ruoyi.novel.mapper.ChapterMapper;
15 15
 import com.ruoyi.novel.mapper.NovelMapper;
16
+//import com.ruoyi.novel.repository.elastic.NovelSearchRepository;
17
+
18
+import com.ruoyi.novel.repository.jpa.NovelRepository;
16 19
 import com.ruoyi.novel.service.*;
17 20
 import com.ruoyi.system.mapper.SysUserMapper;
18 21
 import jdk.jfr.Category;
@@ -32,20 +35,12 @@ import java.util.*;
32 35
 @Service
33 36
 public class NovelServiceImpl implements NovelService {
34 37
     private static final Logger logger = LoggerFactory.getLogger(NovelServiceImpl.class);
35
-    @Autowired
36
-    private NovelRepository novelRepository;
38
+    private final NovelRepository novelRepository; // JPA
37 39
 
38
-    @Autowired
39
-    private ChapterRepository chapterRepository;
40
-    @Autowired
41
-    private AuthorApplicationRepository authorApplicationRepository;
42 40
 
43
-    @Autowired
44
-    private CategoryRepository categoryRepository;
41
+    //private final NovelSearchRepository novelSearchRepository; // ES
45 42
 
46 43
     @Autowired
47
-    private UserRepository userRepository;
48
-    @Autowired
49 44
     private NovelMapper novelMapper;
50 45
     @Autowired
51 46
     private ChapterMapper chapterMapper;
@@ -58,6 +53,40 @@ public class NovelServiceImpl implements NovelService {
58 53
 
59 54
     @Autowired
60 55
     private SysUserMapper userMapper;
56
+
57
+//    @Autowired
58
+//    public NovelServiceImpl(
59
+//            NovelRepository novelRepository,
60
+//            NovelSearchRepository novelSearchRepository) {
61
+//        this.novelRepository = novelRepository;
62
+//        this.novelSearchRepository = novelSearchRepository;
63
+//    }
64
+    @Autowired
65
+    public NovelServiceImpl(
66
+            NovelRepository novelRepository
67
+            //,
68
+            //@Autowired(required = false) NovelSearchRepository novelSearchRepository
69
+    ) {
70
+        this.novelRepository = novelRepository;
71
+        //this.novelSearchRepository = novelSearchRepository;
72
+        //logger.info("Elasticsearch repository available: {}", novelSearchRepository != null);
73
+    }
74
+    @Override
75
+    public List<Novel> getAllNovels() {
76
+        return novelRepository.findAll();
77
+    }
78
+    public void saveNovel(Novel novel) {
79
+        // 保存到数据库
80
+        novelRepository.save(novel);
81
+        // 如果 Elasticsearch 可用,同步到搜索索引
82
+//        if (novelSearchRepository != null) {
83
+//            try {
84
+//                novelSearchRepository.save(novel);
85
+//            } catch (Exception e) {
86
+//                logger.error("Failed to index novel in Elasticsearch", e);
87
+//            }
88
+//        }
89
+    }
61 90
     @Override
62 91
     @Transactional
63 92
     public Novel processNovelUpload(MultipartFile file, String title, Long authorId) {

+ 4
- 2
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java Целия файл

@@ -44,7 +44,7 @@ public interface SysUserMapper
44 44
      * @param userName 用户名
45 45
      * @return 用户对象信息
46 46
      */
47
-    public SysUser selectUserByUserName(String userName);
47
+    //public SysUser selectUserByUserName(String userName);
48 48
 
49 49
     /**
50 50
      * 通过用户ID查询用户
@@ -52,7 +52,7 @@ public interface SysUserMapper
52 52
      * @param userId 用户ID
53 53
      * @return 用户对象信息
54 54
      */
55
-    public SysUser selectUserById(Long userId);
55
+//    public SysUser selectUserById(Long userId);
56 56
 
57 57
     /**
58 58
      * 新增用户信息
@@ -130,4 +130,6 @@ public interface SysUserMapper
130 130
 
131 131
 //    SysUser selectUserById(Long userId);
132 132
 //    int updateUser(SysUser user);
133
+SysUser selectUserByUserName(@Param("username") String username);
134
+    SysUser selectUserById(@Param("userId") Long userId);
133 135
 }

+ 2
- 0
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java Целия файл

@@ -2,12 +2,14 @@ package com.ruoyi.system.service;
2 2
 
3 3
 import java.util.List;
4 4
 import com.ruoyi.common.core.domain.entity.SysUser;
5
+import org.springframework.stereotype.Service;
5 6
 
6 7
 /**
7 8
  * 用户 业务层
8 9
  * 
9 10
  * @author ruoyi
10 11
  */
12
+@Service
11 13
 public interface ISysUserService
12 14
 {
13 15
     /**

+ 8
- 0
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java Целия файл

@@ -554,4 +554,12 @@ public class SysUserServiceImpl implements ISysUserService
554 554
         SysUser user = userMapper.selectUserById(userId);
555 555
         return user != null && "1".equals(user.getVipStatus());
556 556
     }
557
+
558
+    @Autowired
559
+    public SysUserServiceImpl(SysUserMapper userMapper) {
560
+        this.userMapper = userMapper;
561
+    }
562
+
563
+
564
+
557 565
 }

Loading…
Отказ
Запис