fzzj 9 månader sedan
förälder
incheckning
844380229c
18 ändrade filer med 154 tillägg och 60 borttagningar
  1. 4
    1
      RuoYi-Vue/ruoyi-admin/src/main/resources/application-druid.yml
  2. 9
    0
      RuoYi-Vue/ruoyi-admin/src/main/resources/application.yml
  3. 4
    2
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/config/ScheduledTasks.java
  4. 9
    8
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/controller/NovelAdController.java
  5. 3
    3
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/controller/NovelController.java
  6. 3
    2
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/controller/NovelVoteController.java
  7. 0
    15
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/AdService.java
  8. 5
    0
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/IAdService.java
  9. 16
    16
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/IVoteService.java
  10. 6
    0
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/impl/AdServiceImpl.java
  11. 4
    2
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/impl/FinanceServiceImpl.java
  12. 1
    1
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/impl/NovelSearchServiceImpl.java
  13. 10
    2
      RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/utils/AdPlatformClient.java
  14. 8
    1
      RuoYi-Vue/ruoyi-system/src/main/resources/mapper/novel/AdLogMapper.xml
  15. 29
    0
      RuoYi-Vue/ruoyi-system/src/main/resources/mapper/novel/AdPlatformConfigMapper.xml
  16. 30
    0
      RuoYi-Vue/ruoyi-system/src/main/resources/mapper/novel/NovelMapper.xml
  17. 4
    1
      RuoYi-Vue/ruoyi-system/src/main/resources/mapper/novel/RoyaltySummaryMapper.xml
  18. 9
    6
      RuoYi-Vue/ruoyi-system/src/main/resources/mapper/novel/VoteRecordMapper.xml

+ 4
- 1
RuoYi-Vue/ruoyi-admin/src/main/resources/application-druid.yml Visa fil

@@ -58,4 +58,7 @@ spring:
58 58
                     merge-sql: true
59 59
                 wall:
60 60
                     config:
61
-                        multi-statement-allow: true
61
+                        multi-statement-allow: true
62
+            remove-abandoned: true
63
+            remove-abandoned-timeout: 300  # 5分钟无操作视为泄露
64
+            log-abandoned: true

+ 9
- 0
RuoYi-Vue/ruoyi-admin/src/main/resources/application.yml Visa fil

@@ -110,6 +110,12 @@ ad:
110 110
     pangle:
111 111
       url: https://ad.pangle.com/api/v1/event
112 112
       auth-token: your_pangle_token
113
+  tencent:
114
+    url: https://your-tencent-ad-url.com/api  # 替换为实际的腾讯广告URL
115
+    key: your_tencent_key                     # 替换为实际的腾讯广告密钥
116
+  pangle:
117
+    url: https://your-pangle-ad-url.com/api   # 替换为实际的Pangle广告URL
118
+    key: your_pangle_key                      # 替换为实际的Pangle广告密钥
113 119
 # DeepSeek AI配置
114 120
 deepseek:
115 121
   api:
@@ -177,3 +183,6 @@ xss:
177 183
   excludes: /system/notice
178 184
   # 匹配链接
179 185
   urlPatterns: /system/*,/monitor/*,/tool/*
186
+# application.yml(或 application-dev.yml)
187
+scheduled:
188
+  ad-retry-interval: 30000  # 单位:毫秒,示例值30秒,按需调整

+ 4
- 2
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/config/ScheduledTasks.java Visa fil

@@ -2,10 +2,11 @@ package com.ruoyi.novel.config;
2 2
 
3 3
 import com.ruoyi.novel.service.IAdService;
4 4
 import com.ruoyi.novel.service.IFinanceService;
5
-import com.ruoyi.novel.service.IVoteService;
5
+import com.ruoyi.novel.service.VoteService;
6 6
 import org.slf4j.Logger;
7 7
 import org.slf4j.LoggerFactory;
8 8
 import org.springframework.beans.factory.annotation.Autowired;
9
+import org.springframework.beans.factory.annotation.Qualifier;
9 10
 import org.springframework.context.annotation.Configuration;
10 11
 import org.springframework.scheduling.annotation.EnableScheduling;
11 12
 import org.springframework.scheduling.annotation.Scheduled;
@@ -17,10 +18,11 @@ import org.springframework.scheduling.annotation.Scheduled;
17 18
 public class ScheduledTasks {
18 19
     private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);
19 20
     @Autowired
21
+    @Qualifier("adServiceImpl")  // 明确指定实现
20 22
     private IAdService adService;
21 23
 
22 24
     @Autowired
23
-    private IVoteService voteService;
25
+    private VoteService voteService;
24 26
 
25 27
     @Autowired
26 28
     private IFinanceService financeService;

+ 9
- 8
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/controller/NovelAdController.java Visa fil

@@ -3,8 +3,9 @@ package com.ruoyi.novel.controller;
3 3
 
4 4
 import com.ruoyi.common.core.domain.AjaxResult;
5 5
 import com.ruoyi.novel.domain.AdCountRequest;
6
-import com.ruoyi.novel.service.AdService;
6
+import com.ruoyi.novel.service.IAdService;
7 7
 import org.springframework.beans.factory.annotation.Autowired;
8
+import org.springframework.beans.factory.annotation.Qualifier;
8 9
 import org.springframework.data.redis.core.RedisTemplate;
9 10
 import org.springframework.http.HttpStatus;
10 11
 import org.springframework.http.ResponseEntity;
@@ -18,12 +19,12 @@ import java.util.List;
18 19
 @RequestMapping("/ad")
19 20
 public class NovelAdController {
20 21
 
21
-    private final AdService adService;
22
+    private final IAdService iAdService;
22 23
     private final RedisTemplate<String, String> redisTemplate;
23
-
24
+    // 明确指定实现
24 25
     @Autowired
25
-    public NovelAdController(AdService adService, RedisTemplate<String, String> redisTemplate) {
26
-        this.adService = adService;
26
+    public NovelAdController(@Qualifier("adServiceImpl") IAdService iAdService, RedisTemplate<String, String> redisTemplate) {
27
+        this.iAdService = iAdService;
27 28
         this.redisTemplate = redisTemplate;
28 29
     }
29 30
 
@@ -49,7 +50,7 @@ public class NovelAdController {
49 50
         }
50 51
 
51 52
         // 记录广告
52
-        adService.logAdView(
53
+        iAdService.logAdView(
53 54
                 userId,
54 55
                 request.getChapterId(),
55 56
                 request.getAdType(),
@@ -61,9 +62,9 @@ public class NovelAdController {
61 62
 
62 63
         return ResponseEntity.ok("Ad counted");
63 64
     }
64
-    @PostMapping("/count")
65
+    @PostMapping("/log")
65 66
     public AjaxResult logAdView(@RequestBody AdCountRequest request) {
66
-        adService.logAdView(request);
67
+        iAdService.logAdView(request);
67 68
         return AjaxResult.success("广告计数成功");
68 69
     }
69 70
     private String resolveUserId(AdCountRequest request, String phpSessionId) {

+ 3
- 3
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/controller/NovelController.java Visa fil

@@ -33,8 +33,7 @@ public class NovelController {
33 33
         List<Novel> list = novelService.selectNovelList(novel);
34 34
         return getDataTable(list);
35 35
     }
36
-
37
-    @PostMapping
36
+    @PostMapping("/add")
38 37
     public AjaxResult add(@RequestBody Novel novel) {
39 38
         return toAjax(novelService.insertNovel(novel));
40 39
     }
@@ -69,7 +68,8 @@ public class NovelController {
69 68
         return AjaxResult.success(novels);
70 69
     }
71 70
 
72
-    @PostMapping
71
+
72
+    @PostMapping("/create")
73 73
     public AjaxResult addNovel(@RequestBody Novel novel) {
74 74
         novelMapper.insert(novel);
75 75
         searchService.indexNovel(novel); // 创建索引

+ 3
- 2
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/controller/NovelVoteController.java Visa fil

@@ -3,7 +3,8 @@ package com.ruoyi.novel.controller;
3 3
 import com.google.common.util.concurrent.RateLimiter;
4 4
 import com.ruoyi.common.core.domain.AjaxResult;
5 5
 import com.ruoyi.novel.domain.VoteRequest;
6
-import com.ruoyi.novel.service.IVoteService;
6
+//import com.ruoyi.novel.service.IVoteService;
7
+import com.ruoyi.novel.service.VoteService;
7 8
 import org.springframework.beans.factory.annotation.Autowired;
8 9
 import org.springframework.web.bind.annotation.PostMapping;
9 10
 import org.springframework.web.bind.annotation.RequestBody;
@@ -19,7 +20,7 @@ import java.util.concurrent.ConcurrentHashMap;
19 20
 public class NovelVoteController {
20 21
 
21 22
     @Autowired
22
-    private IVoteService voteService;
23
+    private VoteService voteService;
23 24
 
24 25
     // 使用Guava RateLimiter限制投票频率
25 26
     private static final ConcurrentHashMap<Long, RateLimiter> userRateLimiters = new ConcurrentHashMap<>();

+ 0
- 15
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/AdService.java Visa fil

@@ -1,15 +0,0 @@
1
-package com.ruoyi.novel.service;
2
-
3
-import com.ruoyi.novel.domain.AdCountRequest;
4
-import com.ruoyi.novel.domain.AdLog;
5
-import org.springframework.stereotype.Service;
6
-
7
-import java.util.List;
8
-@Service
9
-// AdService.java
10
-public interface AdService {
11
-    void logAdView(AdCountRequest request);
12
-    List<AdLog> getAdLogsByUser(Long userId);
13
-
14
-    void logAdView(String userId, Long chapterId, String adType, String source);
15
-}

+ 5
- 0
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/IAdService.java Visa fil

@@ -19,4 +19,9 @@ public interface IAdService {
19 19
     void syncWithAdPlatform(AdLog adLog);
20 20
     void retryFailedSyncs();
21 21
     Map<String, AdPlatformConfig> loadAdConfigs();
22
+
23
+//    void logAdView(AdCountRequest request);
24
+//    List<AdLog> getAdLogsByUser(Long userId);
25
+
26
+    void logAdView(String userId, Long chapterId, String adType, String source);
22 27
 }

+ 16
- 16
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/IVoteService.java Visa fil

@@ -1,16 +1,16 @@
1
-package com.ruoyi.novel.service;
2
-
3
-import com.ruoyi.novel.domain.VoteRecord;
4
-import com.ruoyi.novel.domain.VoteRequest;
5
-
6
-// IVoteService.java
7
-public interface IVoteService {
8
-    String processVote(VoteRequest request);
9
-    void generateStoryContent(VoteRecord record);
10
-    void notifyPhpSystem(VoteRecord record);
11
-    void retryFailedNotifications();
12
-
13
-    void notifyPhpSystem(VoteRequest request, String generatedContent);
14
-
15
-    String generateStoryContent(Long storyId, Long optionId);
16
-}
1
+//package com.ruoyi.novel.service;
2
+//
3
+//import com.ruoyi.novel.domain.VoteRecord;
4
+//import com.ruoyi.novel.domain.VoteRequest;
5
+//
6
+//// IVoteService.java
7
+//public interface IVoteService {
8
+//    String processVote(VoteRequest request);
9
+//    void generateStoryContent(VoteRecord record);
10
+//    void notifyPhpSystem(VoteRecord record);
11
+//    void retryFailedNotifications();
12
+//
13
+//    void notifyPhpSystem(VoteRequest request, String generatedContent);
14
+//
15
+//    String generateStoryContent(Long storyId, Long optionId);
16
+//}

+ 6
- 0
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/impl/AdServiceImpl.java Visa fil

@@ -93,6 +93,12 @@ public class AdServiceImpl implements IAdService {
93 93
         }
94 94
         return adConfigCache;
95 95
     }
96
+
97
+    @Override
98
+    public void logAdView(String userId, Long chapterId, String adType, String source) {
99
+
100
+    }
101
+
96 102
     @Override
97 103
     public void logAdView(AdCountRequest request) {
98 104
         AdLog log = new AdLog();

+ 4
- 2
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/impl/FinanceServiceImpl.java Visa fil

@@ -12,6 +12,7 @@ import com.ruoyi.novel.service.IFinanceService;
12 12
 import org.slf4j.Logger;
13 13
 import org.slf4j.LoggerFactory;
14 14
 import org.springframework.beans.factory.annotation.Autowired;
15
+import org.springframework.beans.factory.annotation.Qualifier;
15 16
 import org.springframework.beans.factory.annotation.Value;
16 17
 import org.springframework.http.*;
17 18
 import org.springframework.scheduling.annotation.Scheduled;
@@ -33,8 +34,8 @@ public class FinanceServiceImpl implements IFinanceService {
33 34
 
34 35
     @Value("${handling.fee.rate:0.05}")
35 36
     private BigDecimal handlingFeeRate;
36
-    @Value("${royalty.rate}")
37
-    private BigDecimal royaltyRate;
37
+//    @Value("${royalty.rate}")
38
+//    private BigDecimal royaltyRate;
38 39
     // 添加配置项注入
39 40
     @Value("${php.data.url}")
40 41
     private String phpDataUrl;
@@ -43,6 +44,7 @@ public class FinanceServiceImpl implements IFinanceService {
43 44
     private AdLogMapper adLogMapper; // 确保已注入
44 45
 
45 46
     @Autowired
47
+    @Qualifier("adServiceImpl")  // 明确指定实现
46 48
     private IAdService adService; // 确保已注入
47 49
 
48 50
     //@Value("${handling.fee.rate}")

+ 1
- 1
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/service/impl/NovelSearchServiceImpl.java Visa fil

@@ -35,7 +35,7 @@ public class NovelSearchServiceImpl implements NovelSearchService {
35 35
 
36 36
     private static final String INDEX_NAME = "novels";
37 37
 
38
-    @PostConstruct
38
+//    @PostConstruct
39 39
     public void createIndexIfNotExists() {
40 40
         IndexOperations indexOps = elasticTemplate.indexOps(IndexCoordinates.of(INDEX_NAME));
41 41
         if (!indexOps.exists()) {

+ 10
- 2
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/novel/utils/AdPlatformClient.java Visa fil

@@ -15,6 +15,8 @@ import org.springframework.beans.factory.annotation.Value;
15 15
 import org.springframework.http.*;
16 16
 import org.springframework.stereotype.Component;
17 17
 import org.springframework.web.client.RestTemplate;
18
+
19
+import javax.annotation.PostConstruct;
18 20
 import java.util.HashMap;
19 21
 import java.util.Map;
20 22
 
@@ -29,11 +31,17 @@ public class AdPlatformClient {
29 31
 
30 32
     @Autowired
31 33
     private RestTemplate restTemplate;
32
-    @Value("${ad.tencent.url}")
34
+    // 设置默认值为空字符串
35
+    @Value("${ad.tencent.url:}")
33 36
     private String tencentUrl;
34 37
 
35
-    @Value("${ad.pangle.url}")
38
+    @Value("${ad.pangle.url:}")
36 39
     private String pangleUrl;
40
+    @PostConstruct
41
+    public void init() {
42
+        logger.info("腾讯广告URL: {}", tencentUrl);
43
+        logger.info("Pangle广告URL: {}", pangleUrl);
44
+    }
37 45
     public void syncAdPlatform(AdLog adLog) {
38 46
         Map<String, AdPlatformConfig> configs = iAdService.loadAdConfigs();
39 47
         AdPlatformConfig config = configs.get(adLog.getAdPlatform());

+ 8
- 1
RuoYi-Vue/ruoyi-system/src/main/resources/mapper/novel/AdLogMapper.xml Visa fil

@@ -1,4 +1,7 @@
1
-<!-- AdLogMapper.xml -->
1
+<?xml version="1.0" encoding="UTF-8" ?>
2
+<!DOCTYPE mapper
3
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
2 5
 <mapper namespace="com.ruoyi.novel.mapper.AdLogMapper">
3 6
 
4 7
     <resultMap id="AdLogResult" type="AdLog">
@@ -24,4 +27,8 @@
24 27
             #{id}
25 28
         </foreach>
26 29
     </update>
30
+    <select id="selectList" resultMap="AdLogResult">
31
+        SELECT * FROM novel_ad_log
32
+        <!-- 按需添加WHERE条件 -->
33
+    </select>
27 34
 </mapper>

+ 29
- 0
RuoYi-Vue/ruoyi-system/src/main/resources/mapper/novel/AdPlatformConfigMapper.xml Visa fil

@@ -0,0 +1,29 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
3
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
4
+<mapper namespace="com.ruoyi.novel.mapper.AdPlatformConfigMapper">
5
+
6
+    <resultMap type="AdPlatformConfig" id="AdPlatformConfigResult">
7
+        <!-- 定义字段映射 -->
8
+    </resultMap>
9
+
10
+    <select id="selectList" resultMap="AdPlatformConfigResult">
11
+        SELECT * FROM novel_ad_config
12
+    </select>
13
+    <!-- 添加 insert 语句 -->
14
+    <insert id="insert" parameterType="com.ruoyi.novel.domain.AdPlatformConfig">
15
+        INSERT INTO novel_ad_config (
16
+            platform_code,
17
+            platform_name,
18
+            api_url,
19
+            auth_token,
20
+            params_template
21
+        ) VALUES (
22
+            #{platformCode},
23
+            #{platformName},
24
+            #{apiUrl},
25
+            #{authToken},
26
+            #{paramsTemplate}
27
+        )
28
+    </insert>
29
+</mapper>

+ 30
- 0
RuoYi-Vue/ruoyi-system/src/main/resources/mapper/novel/NovelMapper.xml Visa fil

@@ -0,0 +1,30 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3
+<mapper namespace="com.ruoyi.novel.mapper.NovelMapper">
4
+
5
+    <!-- 基础字段映射 -->
6
+    <resultMap type="Novel" id="NovelResult">
7
+        <id     property="id"      column="id"      />
8
+        <result property="title"        column="title"         />
9
+        <result property="author"       column="author"        />
10
+        <result property="categoryId"   column="category_id"   />
11
+        <result property="coverImg"   column="cover_img"   />
12
+        <result property="description"  column="description"   />
13
+        <result property="status"       column="status"        />
14
+        <result property="wordCount"    column="word_count"    />
15
+        <result property="readCount"    column="word_count"    />
16
+        <result property="createTime"   column="create_time"   />
17
+        <result property="updateTime"   column="update_time"   />
18
+    </resultMap>
19
+
20
+    <!-- 基础字段列表 -->
21
+    <sql id="selectNovelVo">
22
+        select
23
+            id, title, author, category_id, cover_img, description,
24
+            status, word_count, readCount,create_time, update_time
25
+        from novel
26
+    </sql>
27
+    <select id="selectList" resultMap="NovelResult">
28
+        SELECT * FROM novel
29
+    </select>
30
+</mapper>

+ 4
- 1
RuoYi-Vue/ruoyi-system/src/main/resources/mapper/novel/RoyaltySummaryMapper.xml Visa fil

@@ -1,4 +1,7 @@
1
-<!-- RoyaltySummaryMapper.xml -->
1
+<?xml version="1.0" encoding="UTF-8" ?>
2
+<!DOCTYPE mapper
3
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
2 5
 <mapper namespace="com.ruoyi.novel.mapper.RoyaltySummaryMapper">
3 6
 
4 7
     <resultMap id="RoyaltySummaryResult" type="RoyaltySummary">

+ 9
- 6
RuoYi-Vue/ruoyi-system/src/main/resources/mapper/novel/VoteRecordMapper.xml Visa fil

@@ -1,4 +1,7 @@
1
-<!-- VoteRecordMapper.xml -->
1
+<?xml version="1.0" encoding="UTF-8" ?>
2
+<!DOCTYPE mapper
3
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
2 5
 <mapper namespace="com.ruoyi.novel.mapper.VoteRecordMapper">
3 6
 
4 7
     <resultMap id="VoteRecordResult" type="VoteRecord">
@@ -18,9 +21,9 @@
18 21
         WHERE id = #{optionId}
19 22
     </update>
20 23
 
21
-    <update id="updateNotifyStatus">
22
-        UPDATE novel_vote_log
23
-        SET notify_status = #{status}
24
-        WHERE id = #{id}
25
-    </update>
24
+<!--    <update id="updateNotifyStatus">-->
25
+<!--        UPDATE novel_vote_log-->
26
+<!--        SET notify_status = #{status}-->
27
+<!--        WHERE id = #{id}-->
28
+<!--    </update>-->
26 29
 </mapper>

Laddar…
Avbryt
Spara