reghao 6 months ago
parent
commit
87bea58af3
56 changed files with 446 additions and 647 deletions
  1. 1 4
      account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountCodeController.java
  2. 2 6
      account/account-service/src/main/java/cn/reghao/tnb/account/app/db/repository/AccountRepository.java
  3. 0 6
      account/account-service/src/main/java/cn/reghao/tnb/account/app/model/po/UserAccount.java
  4. 7 5
      account/account-service/src/main/java/cn/reghao/tnb/account/app/model/po/UserRegistry.java
  5. 2 2
      account/account-service/src/main/java/cn/reghao/tnb/account/app/rpc/AdminAccountServiceImpl.java
  6. 0 8
      account/account-service/src/main/java/cn/reghao/tnb/account/app/service/AccountProfileService.java
  7. 2 2
      account/account-service/src/main/java/cn/reghao/tnb/account/app/service/CodeService.java
  8. 2 2
      account/account-service/src/main/java/cn/reghao/tnb/account/app/service/impl/AccountLoginServiceImpl.java
  9. 4 9
      account/account-service/src/main/java/cn/reghao/tnb/account/app/service/impl/AccountRegistryServiceImpl.java
  10. 2 2
      account/account-service/src/main/resources/mapper/UserRegistryMapper.xml
  11. 1 0
      content/content-api/src/main/java/cn/reghao/tnb/content/api/dto/spider/BiliRegion.java
  12. 5 1
      content/content-api/src/main/java/cn/reghao/tnb/content/api/dto/spider/CrawledVideo.java
  13. 7 10
      content/content-service/src/main/java/cn/reghao/tnb/content/app/data/service/ChartService.java
  14. 2 2
      content/content-service/src/main/java/cn/reghao/tnb/content/app/mobile/controller/AndroidController.java
  15. 3 17
      content/content-service/src/main/java/cn/reghao/tnb/content/app/mobile/service/AndroidService.java
  16. 1 2
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/CrawledDataController.java
  17. 0 19
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/VideoEditController.java
  18. 4 5
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/db/mapper/PostTagMapper.java
  19. 0 1
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/db/mapper/VideoCategoryMapper.java
  20. 0 16
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/db/mapper/VipTagMapper.java
  21. 24 6
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/db/repository/VideoRepository.java
  22. 0 19
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/model/dto/VideoVipTags.java
  23. 3 1
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/model/po/PostTag.java
  24. 3 3
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/model/po/VideoPost.java
  25. 0 24
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/model/po/VipTag.java
  26. 0 43
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/rpc/AdminVideoServiceImpl.java
  27. 4 46
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/AdminVodService.java
  28. 7 3
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/CategoryService.java
  29. 7 37
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/CrawledDataService.java
  30. 85 0
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/TagService.java
  31. 1 27
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/VideoEditService.java
  32. 0 1
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/VideoPostQuery.java
  33. 1 0
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/VideoPostService.java
  34. 1 13
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/VideoQueryService.java
  35. 7 12
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/VideoService.java
  36. 69 9
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/impl/CategoryServiceImpl.java
  37. 9 9
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/impl/VideoPlayServiceImpl.java
  38. 38 66
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/impl/VideoPostQueryImpl.java
  39. 32 92
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/impl/VideoPostServiceImpl.java
  40. 0 14
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/rcmd/task/RcmdTask.java
  41. 14 14
      content/content-service/src/main/resources/mapper/vod/PostTagMapper.xml
  42. 0 30
      content/content-service/src/main/resources/mapper/vod/VipTagMapper.xml
  43. 0 15
      content/content-service/src/test/java/cn/reghao/tnb/content/app/vod/service/VideoPostTest.java
  44. 0 1
      file/file-api/src/main/java/cn/reghao/file/api/iface/FileService.java
  45. 19 17
      file/file-service/src/main/java/cn/reghao/tnb/file/app/config/web/OssSdkInterceptor.java
  46. 3 1
      file/file-service/src/main/java/cn/reghao/tnb/file/app/controller/UserNodeController.java
  47. 7 0
      file/file-service/src/main/java/cn/reghao/tnb/file/app/db/mapper/UserNodeMapper.java
  48. 2 0
      file/file-service/src/main/java/cn/reghao/tnb/file/app/model/dto/UserNodeDto.java
  49. 26 0
      file/file-service/src/main/java/cn/reghao/tnb/file/app/model/dto/UserNodeUpdateDto.java
  50. 1 10
      file/file-service/src/main/java/cn/reghao/tnb/file/app/rpc/ConsoleServiceImpl.java
  51. 1 0
      file/file-service/src/main/java/cn/reghao/tnb/file/app/rpc/FileServiceImpl.java
  52. 20 9
      file/file-service/src/main/java/cn/reghao/tnb/file/app/rpc/StoreServiceWrapperRouter.java
  53. 2 2
      file/file-service/src/main/java/cn/reghao/tnb/file/app/service/UploadChannelService.java
  54. 6 1
      file/file-service/src/main/java/cn/reghao/tnb/file/app/service/UserNodeService.java
  55. 6 0
      file/file-service/src/main/resources/mapper/UserNodeMapper.xml
  56. 3 3
      gateway/src/main/java/cn/reghao/tnb/gateway/token/GlobalTokenFilter.java

+ 1 - 4
account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountCodeController.java

@@ -12,16 +12,12 @@ import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
-import org.springframework.util.ClassUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.net.URL;
 import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
 import java.security.NoSuchAlgorithmException;
 import java.util.Base64;
 
@@ -67,6 +63,7 @@ public class AccountCodeController {
 
     @Operation(summary = "头像", description = "N")
     @GetMapping(value = "/avatar.jpg", produces = MediaType.APPLICATION_JSON_VALUE)
+    @Deprecated
     public ResponseEntity<byte[]> getAvatar() throws IOException {
         String avatarResource = "static/dist/images/face.jpg";
         InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(avatarResource);

+ 2 - 6
account/account-service/src/main/java/cn/reghao/tnb/account/app/db/repository/AccountRepository.java

@@ -1,5 +1,6 @@
 package cn.reghao.tnb.account.app.db.repository;
 
+import cn.reghao.jutil.web.ServletUtil;
 import cn.reghao.tnb.account.api.dto.AccountInfo;
 import cn.reghao.tnb.account.app.db.mapper.UserAccountMapper;
 import cn.reghao.tnb.account.app.db.mapper.UserAccountRoleMapper;
@@ -48,11 +49,6 @@ public class AccountRepository {
         userAccountRoleMapper.saveAll(new ArrayList<>(set));
     }
 
-    @Transactional(rollbackFor = Exception.class)
-    public void saveAccounts(List<UserAccount> userAccounts) {
-        userAccountMapper.saveAll(userAccounts);
-    }
-
     @CacheEvict(cacheNames = "tnb:account:info", key = "#userId")
     public void updateUserScreenName(long userId, String screenName) {
         userAccountMapper.updateUserScreenName(userId, screenName);
@@ -63,7 +59,7 @@ public class AccountRepository {
         userAccountMapper.updateUserAvatar(userId, avatarUrl);
     }
 
-    public void addUserRole(long userId, String role) {
+    private void addUserRole(long userId, String role) {
         UserAccountRole userAccountRole = new UserAccountRole(userId, role);
         userAccountRoleMapper.save(userAccountRole);
     }

+ 0 - 6
account/account-service/src/main/java/cn/reghao/tnb/account/app/model/po/UserAccount.java

@@ -36,8 +36,6 @@ public class UserAccount extends BaseObject<Integer> implements UserDetails {
     private LocalDateTime createAt;
     private String screenName;
     private String avatarUrl;
-    private transient int loginType;
-    private transient int plat;
 
     // Spring Security 使用的字段
     private Set<UserAuthority> authorities;
@@ -121,10 +119,6 @@ public class UserAccount extends BaseObject<Integer> implements UserDetails {
         this.authorities = authorities;
     }
 
-    public void setLoginType(int loginType) {
-        this.loginType = loginType;
-    }
-
     @Override
     public String getUsername() {
         return this.username;

+ 7 - 5
account/account-service/src/main/java/cn/reghao/tnb/account/app/model/po/UserRegistry.java

@@ -2,6 +2,7 @@ package cn.reghao.tnb.account.app.model.po;
 
 import cn.reghao.jutil.jdk.db.BaseObject;
 import lombok.Getter;
+import lombok.NoArgsConstructor;
 import lombok.Setter;
 
 /**
@@ -15,14 +16,15 @@ import lombok.Setter;
 public class UserRegistry extends BaseObject<Integer> {
     private Boolean enabled;
     private String captchaCode;
+    private Boolean enableCaptcha;
     private String verifyCode;
-    private Boolean enableCode;
-    private String domain;
+    private Boolean enableVerify;
 
     public UserRegistry() {
         this.enabled = true;
-        this.captchaCode = "tn028";
-        this.verifyCode = "23028";
-        this.enableCode = false;
+        this.captchaCode = "tnb23";
+        this.enableCaptcha = false;
+        this.verifyCode = "220233";
+        this.enableVerify = true;
     }
 }

+ 2 - 2
account/account-service/src/main/java/cn/reghao/tnb/account/app/rpc/AdminAccountServiceImpl.java

@@ -31,7 +31,7 @@ public class AdminAccountServiceImpl implements AdminAccountService {
     @Override
     public AccountRegistry getAccountRegistry() {
         UserRegistry userRegistry = accountRepository.getUserRegistry();
-        return new AccountRegistry(userRegistry.getEnabled(), userRegistry.getCaptchaCode(), userRegistry.getVerifyCode(), userRegistry.getEnableCode());
+        return new AccountRegistry(userRegistry.getEnabled(), userRegistry.getCaptchaCode(), userRegistry.getVerifyCode(), userRegistry.getEnableVerify());
     }
 
     @Override
@@ -44,7 +44,7 @@ public class AdminAccountServiceImpl implements AdminAccountService {
     @Override
     public void setAccountCode(AccountRegistryStatus accountRegistryStatus) {
         UserRegistry userRegistry = accountRepository.getUserRegistry();
-        userRegistry.setEnableCode(accountRegistryStatus.getEnabled());
+        userRegistry.setEnableCaptcha(accountRegistryStatus.getEnabled());
         accountRepository.updateUserRegistry(userRegistry);
     }
 

+ 0 - 8
account/account-service/src/main/java/cn/reghao/tnb/account/app/service/AccountProfileService.java

@@ -148,12 +148,4 @@ public class AccountProfileService {
 
         return Result.success();
     }
-
-    public void setUserAdmin(long userId) {
-        String adminRole = AccountRole.admin.getValue();
-        Set<String> userRoles = accountRepository.getUserRoles(userId);
-        if (!userRoles.contains(adminRole)) {
-            accountRepository.addUserRole(userId, adminRole);
-        }
-    }
 }

+ 2 - 2
account/account-service/src/main/java/cn/reghao/tnb/account/app/service/CodeService.java

@@ -46,7 +46,7 @@ public class CodeService {
     public InputStream generateCaptcha() throws IOException {
         String captchaCode;
         UserRegistry userRegistry = accountRepository.getUserRegistry();
-        if (!userRegistry.getEnableCode()) {
+        if (!userRegistry.getEnableCaptcha()) {
             captchaCode = RandomString.getString(5);
         } else {
             captchaCode = userRegistry.getCaptchaCode();
@@ -93,7 +93,7 @@ public class CodeService {
         }
 
         String code;
-        if (userRegistry.getEnableCode()) {
+        if (userRegistry.getEnableVerify()) {
             code = userRegistry.getVerifyCode();
         } else {
             code = RandomString.getNumber(6);

+ 2 - 2
account/account-service/src/main/java/cn/reghao/tnb/account/app/service/impl/AccountLoginServiceImpl.java

@@ -106,7 +106,7 @@ public class AccountLoginServiceImpl implements AccountLoginService {
             throw new AccountLoginException(errMsg, userId, loginId);
         }
 
-        userDetail.setLoginType(LoginType.usernamePassword.getValue());
+        //userDetail.setLoginType(LoginType.usernamePassword.getValue());
         return getAccountAuthToken(authToken, userDetail);
     }
 
@@ -146,7 +146,7 @@ public class AccountLoginServiceImpl implements AccountLoginService {
             userDetail = accountRegistryService.createAccount(principal, "");
         }
 
-        userDetail.setLoginType(LoginType.mobileCode.getValue());
+        //userDetail.setLoginType(LoginType.mobileCode.getValue());
         return getAccountAuthToken(authToken, userDetail);
     }
 

+ 4 - 9
account/account-service/src/main/java/cn/reghao/tnb/account/app/service/impl/AccountRegistryServiceImpl.java

@@ -29,11 +29,11 @@ import java.util.Set;
 @Slf4j
 @Service
 public class AccountRegistryServiceImpl implements AccountRegistryService {
+    private final String zhihuAvatar = "//picx.zhimg.com/v2-abed1a8c04700ba7d72b45195223e0ff_xll.jpg";
     private final CodeService codeService;
     private final PasswordEncoder passwordEncoder;
     private final AccountRepository accountRepository;
     private final PubkeyService pubkeyService;
-    private String avatarUrl;
 
     public AccountRegistryServiceImpl(CodeService codeService, PasswordEncoder passwordEncoder,
                                       AccountRepository accountRepository, PubkeyService pubkeyService) {
@@ -43,12 +43,6 @@ public class AccountRegistryServiceImpl implements AccountRegistryService {
         this.pubkeyService = pubkeyService;
     }
 
-    @PostConstruct
-    public void setAvatarUrl() {
-        String domain = accountRepository.getUserRegistry().getDomain();
-        this.avatarUrl = String.format("//%s/dist/images/face.jpg", domain);
-    }
-
     @Override
     public UserRegistry getUserRegistry() {
         return accountRepository.getUserRegistry();
@@ -95,7 +89,8 @@ public class AccountRegistryServiceImpl implements AccountRegistryService {
                     new UserAuthority(AccountRole.admin.getValue()),
                     new UserAuthority(AccountRole.oss.getValue()));
         }
-        UserAccount userAccount = new UserAccount(userId, encodedPassword, salt, avatarUrl, authorities);
+
+        UserAccount userAccount = new UserAccount(userId, encodedPassword, salt, zhihuAvatar, authorities);
         if (StringRegexp.matchEmail(principal)) {
             userAccount.setEmail(principal);
         } else if (StringRegexp.matchMobile(principal)) {
@@ -112,7 +107,7 @@ public class AccountRegistryServiceImpl implements AccountRegistryService {
     @Override
     public UserAccount createAccount(String principal, String password) {
         long userId = accountRepository.getNextUserId();
-        UserAccount userAccount = new UserAccount(userId, avatarUrl);
+        UserAccount userAccount = new UserAccount(userId, zhihuAvatar);
         if (StringRegexp.matchEmail(principal)) {
             userAccount.setEmail(principal);
             accountRepository.saveAccount(userAccount);

+ 2 - 2
account/account-service/src/main/resources/mapper/UserRegistryMapper.xml

@@ -4,9 +4,9 @@
 <mapper namespace="cn.reghao.tnb.account.app.db.mapper.UserRegistryMapper">
     <insert id="save">
         insert into user_registry
-        (`enabled`,`captcha_code`,`verify_code`,`enable_code`,`domain`)
+        (`enabled`,`captcha_code`,`enable_captcha`,`verify_code`,`enable_verify`,`domain`)
         values
-        (#{enabled},#{captchaCode},#{verifyCode},#{enableCode},#{domain})
+        (#{enabled},#{captchaCode},#{enableCaptcha},#{verifyCode},#{enableVerify},#{domain})
     </insert>
     
     <update id="update">

+ 1 - 0
content/content-api/src/main/java/cn/reghao/tnb/content/api/dto/spider/BiliRegion.java

@@ -11,6 +11,7 @@ import java.io.Serializable;
  */
 @Setter
 @Getter
+@Deprecated
 public class BiliRegion implements Serializable {
     private static final long serialVersionUID = 1L;
 

+ 5 - 1
content/content-api/src/main/java/cn/reghao/tnb/content/api/dto/spider/CrawledVideo.java

@@ -34,8 +34,12 @@ public class CrawledVideo implements Serializable {
     @NotBlank
     private String title;
     private String description;
-    @NotNull
+    @Deprecated
     private Integer rid;
+    @NotNull
+    private Integer categoryPid;
+    @NotNull
+    private Integer categoryId;
     //@NotBlank
     private String tags;
     @NotNull

+ 7 - 10
content/content-service/src/main/java/cn/reghao/tnb/content/app/data/service/ChartService.java

@@ -3,9 +3,9 @@ package cn.reghao.tnb.content.app.data.service;
 import cn.reghao.jutil.jdk.converter.DateTimeConverter;
 import cn.reghao.jutil.jdk.text.TextFile;
 import cn.reghao.tnb.common.auth.UserContext;
+import cn.reghao.tnb.content.api.dto.VideoRegion;
 import cn.reghao.tnb.content.app.exam.model.chart.LineChartData;
 import cn.reghao.tnb.content.app.vod.model.po.VideoCategory;
-import cn.reghao.tnb.content.app.vod.model.query.CategoryQuery;
 import cn.reghao.tnb.content.app.vod.service.CategoryService;
 import org.springframework.stereotype.Service;
 
@@ -114,11 +114,8 @@ public class ChartService {
     }
 
     public List<String> getRegionPieChart() {
-        long loginUser = UserContext.getUserId();
-
-        CategoryQuery categoryQuery = new CategoryQuery.Builder().pid(1).build();
-        List<VideoCategory> videoCategories = categoryService.getVideoCategories(categoryQuery);
-        List<String> names = videoCategories.stream().map(VideoCategory::getName).collect(Collectors.toList());
+        List<VideoRegion> list = categoryService.getCategories(true);
+        List<String> names = list.stream().map(VideoRegion::getName).collect(Collectors.toList());
         int total = names.size();
         List<String> xAxis = new ArrayList<>();
         int i = 8;
@@ -133,10 +130,10 @@ public class ChartService {
         }
         String yStr = yAxis.toString().replace("[", "").replace("]", "");
 
-        List<String> list = new ArrayList<>();
-        list.add(xStr);
-        list.add(yStr);
-        return list;
+        List<String> dataList = new ArrayList<>();
+        dataList.add(xStr);
+        dataList.add(yStr);
+        return dataList;
     }
 
     Random random = new SecureRandom();

+ 2 - 2
content/content-service/src/main/java/cn/reghao/tnb/content/app/mobile/controller/AndroidController.java

@@ -13,6 +13,7 @@ import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -57,8 +58,7 @@ public class AndroidController {
 
     @GetMapping(value = "/category", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getCategory() {
-        List<VideoRegion> list = androidService.getCategories();
-        VideoRegionResult videoRegionResult = new VideoRegionResult(list);
+        VideoRegionResult videoRegionResult = new VideoRegionResult(new ArrayList<>());
         return JsonConverter.objectToJson(videoRegionResult);
     }
 

+ 3 - 17
content/content-service/src/main/java/cn/reghao/tnb/content/app/mobile/service/AndroidService.java

@@ -13,9 +13,6 @@ import cn.reghao.tnb.content.app.mobile.model.VideoDetailsResult;
 import cn.reghao.tnb.user.api.dto.UserCard;
 import cn.reghao.tnb.user.api.iface.UserService;
 import cn.reghao.tnb.content.api.dto.VideoCard;
-import cn.reghao.tnb.content.api.dto.VideoRegion;
-import cn.reghao.tnb.content.app.vod.db.mapper.VideoPostMapper;
-import cn.reghao.tnb.content.app.vod.db.mapper.VideoTagMapper;
 import cn.reghao.tnb.content.app.vod.model.dto.PageParam;
 import cn.reghao.tnb.content.app.mobile.model.play.HDVideoInfo;
 import cn.reghao.tnb.content.app.mobile.model.play.UrlEntity;
@@ -40,19 +37,12 @@ public class AndroidService {
 
     private final VideoPlayService videoPlayService;
     private final SearchService searchService;
-    private final VideoPostMapper videoPostMapper;
-    private final VideoTagMapper videoTagMapper;
-    private final CategoryService categoryService;
     private final ContentPermission contentPermission;
 
     public AndroidService(VideoPlayService videoPlayService, SearchService searchService,
-                          VideoPostMapper videoPostMapper, VideoTagMapper videoTagMapper,
-                          CategoryService categoryService, ContentPermission contentPermission) {
+                          ContentPermission contentPermission) {
         this.videoPlayService = videoPlayService;
         this.searchService = searchService;
-        this.videoPostMapper = videoPostMapper;
-        this.videoTagMapper = videoTagMapper;
-        this.categoryService = categoryService;
         this.contentPermission = contentPermission;
     }
 
@@ -83,10 +73,6 @@ public class AndroidService {
         return new SearchVideoResult(Collections.emptyList());
     }
 
-    public List<VideoRegion> getCategories() {
-        return categoryService.getCategories(true);
-    }
-
     public VideoBeanResult getCategoryVideo() {
         PageParam pageParam = new PageParam();
         pageParam.setPageNumber(1);
@@ -114,12 +100,12 @@ public class AndroidService {
     public VideoDetailsResult getVideoDetailsResult(String videoId) {
         List<Integer> scopes = contentPermission.getUserScopes();
         VideoQuery videoQuery = new VideoQuery.Builder().scope(scopes).videoId(videoId).build();
-        VideoDetail videoDetail = videoPostMapper.findVideoPostDetail(videoQuery);
+        VideoDetail videoDetail = null;
         if (videoDetail == null) {
             return null;
         }
 
-        List<String> tags = videoTagMapper.findVideoTags(videoId);
+        List<String> tags = List.of("tag1");
         videoDetail.setTags(tags);
         String publishByStr = videoDetail.getUserId();
         long publishBy = accountQuery.getUserIdLong(publishByStr);

+ 1 - 2
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/CrawledDataController.java

@@ -74,7 +74,6 @@ public class CrawledDataController {
     @Operation(summary = "获取 bili 视频分区", description = "N")
     @GetMapping(value = "/categories/bili", produces = MediaType.APPLICATION_JSON_VALUE)
     public String videoCategories() {
-        List<BiliRegion> list = crawledDataService.getCategories();
-        return WebResult.success(list);
+        return WebResult.success();
     }
 }

+ 0 - 19
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/VideoEditController.java

@@ -4,17 +4,12 @@ import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.jutil.web.WebResult;
 import cn.reghao.tnb.content.app.vod.model.dto.VideoEdit;
 import cn.reghao.tnb.content.app.vod.model.dto.VideoErrorReport;
-import cn.reghao.tnb.content.app.vod.model.dto.VideoVipTags;
-import cn.reghao.tnb.content.app.vod.model.po.VipTag;
 import cn.reghao.tnb.content.app.vod.service.VideoEditService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.List;
-
 /**
  * @author reghao
  * @date 2025-08-02 20:12:33
@@ -42,18 +37,4 @@ public class VideoEditController {
         videoEditService.updateVideoOwner(videoEdit);
         return WebResult.success();
     }
-
-    @Operation(summary = "获取视频稿件 VIP 标签", description = "N")
-    @GetMapping(value = "/vip_tags", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String getVipTags() {
-        List<VipTag> list = videoEditService.getVipTags();
-        return WebResult.success(list);
-    }
-
-    @Operation(summary = "设置视频稿件 VIP 标签", description = "N")
-    @PostMapping(value = "/vip_tags", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String addVipTags(@RequestBody @Validated VideoVipTags videoVipTags) {
-        videoEditService.addVipTags(videoVipTags);
-        return WebResult.success();
-    }
 }

+ 4 - 5
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/db/mapper/VideoTagMapper.java → content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/db/mapper/PostTagMapper.java

@@ -1,7 +1,7 @@
 package cn.reghao.tnb.content.app.vod.db.mapper;
 
 import cn.reghao.jutil.jdk.db.BaseMapper;
-import cn.reghao.tnb.content.app.vod.model.po.VideoTag;
+import cn.reghao.tnb.content.app.vod.model.po.PostTag;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.List;
@@ -11,12 +11,11 @@ import java.util.List;
  * @date 2022-06-09 15:09:01
  */
 @Mapper
-public interface VideoTagMapper extends BaseMapper<VideoTag> {
+public interface PostTagMapper extends BaseMapper<PostTag> {
     void deleteByTagId(String tagId);
 
-    VideoTag findByName(String name);
-    VideoTag findByTagId(String tagId);
+    PostTag findByName(String name);
+    PostTag findByTagId(String tagId);
     List<String> findVideoTags(String videoId);
     List<String> findVideoIds(String tagName);
-    List<String> findRandomTags(int size);
 }

+ 0 - 1
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/db/mapper/VideoCategoryMapper.java

@@ -5,7 +5,6 @@ import cn.reghao.jutil.jdk.db.Page;
 import cn.reghao.tnb.content.api.dto.spider.BiliRegion;
 import cn.reghao.tnb.content.app.vod.model.po.VideoCategory;
 import cn.reghao.tnb.content.app.vod.model.query.CategoryQuery;
-import cn.reghao.tnb.content.app.vod.model.query.VideoQuery;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 

+ 0 - 16
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/db/mapper/VipTagMapper.java

@@ -1,16 +0,0 @@
-package cn.reghao.tnb.content.app.vod.db.mapper;
-
-import cn.reghao.jutil.jdk.db.BaseMapper;
-import cn.reghao.tnb.content.app.vod.model.po.VipTag;
-import org.apache.ibatis.annotations.Mapper;
-
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2025-08-02 19:49:37
- */
-@Mapper
-public interface VipTagMapper extends BaseMapper<VipTag> {
-    List<VipTag> findByPid(int pid);
-}

+ 24 - 6
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/db/repository/VideoRepository.java

@@ -1,8 +1,9 @@
 package cn.reghao.tnb.content.app.vod.db.repository;
 
-import cn.reghao.tnb.content.api.constant.VideoStatus;
-import cn.reghao.tnb.content.app.vod.db.mapper.*;
 import cn.reghao.tnb.common.db.GroupCount;
+import cn.reghao.tnb.content.app.vod.db.mapper.VideoFileMapper;
+import cn.reghao.tnb.content.app.vod.db.mapper.VideoPostMapper;
+import cn.reghao.tnb.content.app.vod.db.mapper.VideoStatisticMapper;
 import cn.reghao.tnb.content.app.vod.model.po.VideoFile;
 import cn.reghao.tnb.content.app.vod.model.po.VideoPost;
 import cn.reghao.tnb.content.app.vod.model.po.VideoStatistic;
@@ -20,12 +21,12 @@ import java.util.List;
  */
 @Repository
 public class VideoRepository {
-    private final VideoFileMapper videoFileMapper;
     private final VideoPostMapper videoPostMapper;
+    private final VideoFileMapper videoFileMapper;
     private final VideoStatisticMapper videoStatisticMapper;
 
-    public VideoRepository(VideoPostMapper videoPostMapper, VideoStatisticMapper videoStatisticMapper,
-                           VideoFileMapper videoFileMapper) {
+    public VideoRepository(VideoPostMapper videoPostMapper, VideoFileMapper videoFileMapper,
+                           VideoStatisticMapper videoStatisticMapper) {
         this.videoPostMapper = videoPostMapper;
         this.videoStatisticMapper = videoStatisticMapper;
         this.videoFileMapper = videoFileMapper;
@@ -44,16 +45,25 @@ public class VideoRepository {
     }
 
     @Transactional(rollbackFor = Exception.class)
+    @Deprecated
     public void updateBiliVideoFile(String videoId, VideoInfo videoInfo, int channelId) {
         VideoFile videoFile = new VideoFile(videoId, videoInfo, channelId);
         videoFileMapper.save(videoFile);
         videoPostMapper.updateVideoCached(videoId, videoInfo, channelId);
     }
 
-    public List<VideoUrlDto> findVideoUrls(String videoId) {
+    public void updateVideoStatistic(VideoStatistic videoStatistic) {
+        videoStatisticMapper.update(videoStatistic);
+    }
+
+    public List<VideoUrlDto> getVideoUrls(String videoId) {
         return videoFileMapper.findVideoUrls(videoId);
     }
 
+    public List<VideoFile> getVideoFiles(String videoId) {
+        return videoFileMapper.findByVideoId(videoId);
+    }
+
     //@Cacheable(cacheNames = "tnb:content:publishBy", key = "publishBy", unless = "#result == null")
     public List<GroupCount> getPublishUsers(int publishType) {
         List<GroupCount> list;
@@ -77,4 +87,12 @@ public class VideoRepository {
     public VideoPost getVideoPost(String videoId) {
         return videoPostMapper.findByVideoId(videoId);
     }
+
+    public VideoStatistic getVideoStatistic(String videoId) {
+        return videoStatisticMapper.findByVideoId(videoId);
+    }
+
+    public void updateIncrView(String videoId) {
+        videoStatisticMapper.updateIncrView(videoId);
+    }
 }

+ 0 - 19
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/model/dto/VideoVipTags.java

@@ -1,19 +0,0 @@
-package cn.reghao.tnb.content.app.vod.model.dto;
-
-import lombok.Getter;
-
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.Size;
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2025-08-02 21:20:20
- */
-@Getter
-public class VideoVipTags {
-    @NotBlank
-    private String videoId;
-    @Size(min = 1, max = 100, message = "视频标签")
-    private List<String> tags;
-}

+ 3 - 1
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/model/po/VideoTag.java → content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/model/po/PostTag.java

@@ -7,6 +7,8 @@ import lombok.NoArgsConstructor;
 import lombok.Setter;
 
 /**
+ * 稿件标签
+ *
  * @author reghao
  * @date 2022-06-09 15:07:40
  */
@@ -14,7 +16,7 @@ import lombok.Setter;
 @NoArgsConstructor
 @Setter
 @Getter
-public class VideoTag extends BaseObject<Integer> {
+public class PostTag extends BaseObject<Integer> {
     private String tagId;
     private String tagName;
 }

+ 3 - 3
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/model/po/VideoPost.java

@@ -65,12 +65,12 @@ public class VideoPost extends BaseObject<Integer> {
     }
 
     @Deprecated
-    public VideoPost(CrawledVideo video, int categoryPid, int categoryId) {
+    public VideoPost(CrawledVideo video) {
         this.videoId = video.getVideoId();
         this.title = video.getTitle();
         this.description = video.getDescription();
-        this.categoryPid = categoryPid;
-        this.categoryId = categoryId;
+        this.categoryPid = video.getCategoryPid();
+        this.categoryId = video.getCategoryId();
         this.scope = PostScope.PUBLIC.getCode();
         this.status = VideoStatus.noVideoFile.getCode();
         this.horizontal = video.getHorizontal();

+ 0 - 24
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/model/po/VipTag.java

@@ -1,24 +0,0 @@
-package cn.reghao.tnb.content.app.vod.model.po;
-
-import cn.reghao.jutil.jdk.db.BaseObject;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2025-08-02 19:47:51
- */
-@AllArgsConstructor
-@NoArgsConstructor
-@Setter
-@Getter
-public class VipTag extends BaseObject<Integer> {
-    private Integer pid;
-    private String name;
-    private String tagId;
-    private List<VipTag> children;
-}

+ 0 - 43
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/rpc/AdminVideoServiceImpl.java

@@ -5,19 +5,12 @@ import cn.reghao.jutil.jdk.db.Page;
 import cn.reghao.jutil.jdk.db.PageList;
 import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.jutil.jdk.serializer.JsonConverter;
-import cn.reghao.oss.sdk.model.constant.ObjectScope;
-import cn.reghao.oss.sdk.model.dto.media.VideoInfo;
-import cn.reghao.oss.sdk.model.dto.media.VideoUrlDto;
 import cn.reghao.tnb.common.db.GroupCount;
-import cn.reghao.tnb.content.api.constant.PostScope;
 import cn.reghao.tnb.content.api.dto.*;
 import cn.reghao.tnb.content.api.iface.AdminVideoService;
 import cn.reghao.tnb.content.app.vod.db.mapper.VideoPostMapper;
 import cn.reghao.tnb.content.app.vod.db.repository.VideoRepository;
 import cn.reghao.tnb.content.app.vod.model.po.BannerVideo;
-import cn.reghao.tnb.content.app.vod.model.po.VideoCategory;
-import cn.reghao.tnb.content.app.vod.model.po.VideoFile;
-import cn.reghao.tnb.content.app.vod.model.po.VideoPost;
 import cn.reghao.tnb.content.app.vod.model.query.VideoQuery;
 import cn.reghao.tnb.content.app.vod.service.CategoryService;
 import cn.reghao.tnb.content.app.vod.service.VideoPostQuery;
@@ -58,42 +51,6 @@ public class AdminVideoServiceImpl implements AdminVideoService {
         this.categoryService = categoryService;
     }
 
-    public List<VideoRegion> getVideoRegions() {
-        List<VideoCategory> list0 = categoryService.getAllCategory();
-        List<VideoRegion> menuTrees = list0.stream().map(videoCategory -> {
-            int pid = videoCategory.getPid();
-            int id = videoCategory.getId();
-            String name = videoCategory.getName();
-            int sort = videoCategory.getSort();
-            return new VideoRegion(pid, id, name, sort);
-        }).collect(Collectors.toList());
-
-        Map<Integer, VideoRegion> allMap = menuTrees.stream().collect(Collectors.toMap(VideoRegion::getId, k -> k));
-
-        Set<Integer> set = new HashSet<>();
-        menuTrees.forEach(menuTree -> {
-            int pid = menuTree.getPid();
-            VideoRegion menuTree1 = allMap.get(pid);
-            if (menuTree1 != null) {
-                List<VideoRegion> list = menuTree1.getChildren();
-                if (list == null) {
-                    list = new ArrayList<>();
-                    menuTree1.setChildren(list);
-                }
-
-                menuTree1.getChildren().add(menuTree);
-                menuTree1.getChildren().sort(Comparator.comparingInt(VideoRegion::getSort));
-                //allMap.remove(menuTree.getId());
-                set.add(menuTree.getId());
-            }
-        });
-
-        set.forEach(allMap::remove);
-        List<VideoRegion> results = new ArrayList<>(allMap.values());
-        results.sort(Comparator.comparingInt(VideoRegion::getSort));
-        return results;
-    }
-
     public PageList<UserVideoPost> getVideoPosts(VideoSearch videoSearch) {
         int pageNumber = videoSearch.getPageNumber();
         int pageSize = videoSearch.getPageSize();

+ 4 - 46
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/AdminVodService.java

@@ -9,21 +9,16 @@ import cn.reghao.oss.sdk.model.dto.media.VideoUrlDto;
 import cn.reghao.tnb.content.api.constant.PostScope;
 import cn.reghao.tnb.content.api.dto.*;
 import cn.reghao.tnb.content.app.vod.db.mapper.SiteNoticeMapper;
-import cn.reghao.tnb.content.app.vod.db.mapper.VideoCategoryMapper;
 import cn.reghao.tnb.content.app.vod.db.mapper.VideoPostMapper;
 import cn.reghao.tnb.content.app.vod.db.repository.VideoRepository;
 import cn.reghao.tnb.content.app.vod.model.dto.CategoryAdd;
 import cn.reghao.tnb.content.app.vod.model.dto.NoticeAdd;
 import cn.reghao.tnb.content.app.vod.model.po.BannerVideo;
 import cn.reghao.tnb.content.app.vod.model.po.SiteNotice;
-import cn.reghao.tnb.content.app.vod.model.po.VideoCategory;
 import cn.reghao.tnb.content.app.vod.model.po.VideoPost;
 import cn.reghao.tnb.content.app.vod.model.query.VideoQuery;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.amqp.rabbit.core.RabbitTemplate;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageImpl;
-import org.springframework.data.domain.PageRequest;
 import org.springframework.stereotype.Service;
 
 import java.util.*;
@@ -47,18 +42,15 @@ public class AdminVodService {
     private VideoPostQuery videoPostQuery;
     private VideoRepository videoRepository;
     private CategoryService categoryService;
-    private VideoCategoryMapper videoCategoryMapper;
 
     public AdminVodService(RabbitTemplate rabbitTemplate, SiteNoticeMapper siteNoticeMapper, VideoPostMapper videoPostMapper,
-                           VideoPostQuery videoPostQuery, VideoRepository videoRepository, CategoryService categoryService,
-                           VideoCategoryMapper videoCategoryMapper) {
+                           VideoPostQuery videoPostQuery, VideoRepository videoRepository, CategoryService categoryService) {
         this.rabbitTemplate = rabbitTemplate;
         this.siteNoticeMapper = siteNoticeMapper;
         this.videoPostMapper = videoPostMapper;
         this.videoPostQuery = videoPostQuery;
         this.videoRepository = videoRepository;
         this.categoryService = categoryService;
-        this.videoCategoryMapper = videoCategoryMapper;
     }
 
     public void setSiteNotice(NoticeAdd noticeAdd) {
@@ -87,39 +79,7 @@ public class AdminVodService {
     }
 
     public List<VideoRegion> getVideoRegions() {
-        List<VideoCategory> list0 = categoryService.getAllCategory();
-        List<VideoRegion> menuTrees = list0.stream().map(videoCategory -> {
-            int pid = videoCategory.getPid();
-            int id = videoCategory.getId();
-            String name = videoCategory.getName();
-            int sort = videoCategory.getSort();
-            return new VideoRegion(pid, id, name, sort);
-        }).collect(Collectors.toList());
-
-        Map<Integer, VideoRegion> allMap = menuTrees.stream().collect(Collectors.toMap(VideoRegion::getId, k -> k));
-
-        Set<Integer> set = new HashSet<>();
-        menuTrees.forEach(menuTree -> {
-            int pid = menuTree.getPid();
-            VideoRegion menuTree1 = allMap.get(pid);
-            if (menuTree1 != null) {
-                List<VideoRegion> list = menuTree1.getChildren();
-                if (list == null) {
-                    list = new ArrayList<>();
-                    menuTree1.setChildren(list);
-                }
-
-                menuTree1.getChildren().add(menuTree);
-                menuTree1.getChildren().sort(Comparator.comparingInt(VideoRegion::getSort));
-                //allMap.remove(menuTree.getId());
-                set.add(menuTree.getId());
-            }
-        });
-
-        set.forEach(allMap::remove);
-        List<VideoRegion> results = new ArrayList<>(allMap.values());
-        results.sort(Comparator.comparingInt(VideoRegion::getSort));
-        return results;
+        return categoryService.getCategories(true);
     }
 
     public PageList<UserVideoPost> getVideoPosts(VideoSearch videoSearch) {
@@ -156,7 +116,7 @@ public class AdminVodService {
             return new VideoUrls();
         }
 
-        List<VideoUrlDto> list = videoRepository.findVideoUrls(videoId);
+        List<VideoUrlDto> list = videoRepository.getVideoUrls(videoId);
         if (list.isEmpty()) {
             return new VideoUrls();
         }
@@ -222,8 +182,6 @@ public class AdminVodService {
     }
 
     public void addVideoCategory(CategoryAdd categoryAdd) {
-        VideoCategory videoCategory1 = new VideoCategory(categoryAdd);
-        List<VideoCategory> list = List.of(videoCategory1);
-        videoCategoryMapper.saveAll(list);
+        categoryService.addVideoCategory(categoryAdd);
     }
 }

+ 7 - 3
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/CategoryService.java

@@ -1,8 +1,11 @@
 package cn.reghao.tnb.content.app.vod.service;
 
+import cn.reghao.jutil.jdk.db.PageList;
 import cn.reghao.tnb.content.api.dto.VideoRegion;
+import cn.reghao.tnb.content.app.vod.model.dto.CategoryAdd;
 import cn.reghao.tnb.content.app.vod.model.po.VideoCategory;
-import cn.reghao.tnb.content.app.vod.model.query.CategoryQuery;
+import cn.reghao.tnb.content.app.vod.model.po.VideoPost;
+import cn.reghao.tnb.content.app.vod.model.query.VideoQuery;
 
 import java.util.*;
 
@@ -11,8 +14,9 @@ import java.util.*;
  * @date 2023-11-20 21:35:21
  */
 public interface CategoryService {
-    List<VideoCategory> getAllCategory();
     List<VideoRegion> getCategories(boolean vip);
     VideoCategory getVideoCategory(int id);
-    List<VideoCategory> getVideoCategories(CategoryQuery categoryQuery);
+    void addVideoCategory(CategoryAdd categoryAdd);
+    void setVideoCategoryPost(VideoPost videoPost);
+    PageList<String> getVideoIdsByCategory(VideoQuery videoQuery, int pageNumber, int pageSize);
 }

+ 7 - 37
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/CrawledDataService.java

@@ -3,22 +3,15 @@ package cn.reghao.tnb.content.app.vod.service;
 import cn.reghao.file.api.iface.OssService;
 import cn.reghao.oss.sdk.model.dto.media.VideoInfo;
 import cn.reghao.tnb.content.api.constant.PostScope;
-import cn.reghao.tnb.content.api.dto.spider.BiliRegion;
 import cn.reghao.tnb.content.api.dto.VideoFileUpdate;
 import cn.reghao.tnb.content.api.dto.spider.CrawledVideo;
-import cn.reghao.tnb.content.app.vod.db.mapper.VideoCategoryMapper;
-import cn.reghao.tnb.content.app.vod.db.mapper.VideoPostMapper;
-import cn.reghao.tnb.content.app.vod.db.mapper.VideoStatisticMapper;
 import cn.reghao.tnb.content.app.vod.db.repository.VideoRepository;
-import cn.reghao.tnb.content.app.vod.model.po.VideoCategory;
 import cn.reghao.tnb.content.app.vod.model.po.VideoPost;
 import cn.reghao.tnb.content.app.vod.model.po.VideoStatistic;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
-
 /**
  * @author reghao
  * @date 2023-05-31 11:15:22
@@ -30,50 +23,27 @@ public class CrawledDataService {
     @DubboReference(check = false)
     private OssService ossService;
 
-    private final VideoPostMapper videoPostMapper;
     private final VideoPostService videoPostService;
-    private final VideoCategoryMapper videoCategoryMapper;
-    private final VideoStatisticMapper videoStatisticMapper;
     private final VideoRepository videoRepository;
 
-    public CrawledDataService(VideoPostMapper videoPostMapper, VideoPostService videoPostService,
-                                  VideoCategoryMapper videoCategoryMapper, VideoStatisticMapper videoStatisticMapper,
-                                  VideoRepository videoRepository) {
-        this.videoPostMapper = videoPostMapper;
+    public CrawledDataService(VideoPostService videoPostService, VideoRepository videoRepository) {
         this.videoPostService = videoPostService;
-        this.videoCategoryMapper = videoCategoryMapper;
-        this.videoStatisticMapper = videoStatisticMapper;
         this.videoRepository = videoRepository;
     }
 
-    public List<BiliRegion> getCategories() {
-        List<BiliRegion> biliRegions = videoCategoryMapper.findAllCategoryIds();
-        return biliRegions;
-    }
-
     public VideoPost videoExist(String videoId) {
-        VideoPost videoPost = videoPostMapper.findByVideoId(videoId);
+        VideoPost videoPost = videoRepository.getVideoPost(videoId);
         return videoPost;
     }
 
     public synchronized void publishVideo(CrawledVideo crawledVideo) {
-        int categoryPid = 3;
-        int categoryId = 4;
-        Integer rid = crawledVideo.getRid();
-        if (rid != 0) {
-            VideoCategory videoCategory = videoCategoryMapper.findByRid(rid);
-            if (videoCategory != null) {
-                categoryPid = videoCategory.getPid();
-                categoryId = videoCategory.getId();
-            }
-        }
-
-        VideoPost videoPost1 = videoPostMapper.findByVideoId(crawledVideo.getVideoId());
+        String videoId = crawledVideo.getVideoId();
+        VideoPost videoPost1 = videoRepository.getVideoPost(videoId);
         if (videoPost1 != null ) {
             return;
         }
 
-        VideoPost videoPost = new VideoPost(crawledVideo, categoryPid, categoryId);
+        VideoPost videoPost = new VideoPost(crawledVideo);
         VideoStatistic videoStatistic = new VideoStatistic(crawledVideo);
         String tags = crawledVideo.getTags();
         videoPostService.saveVideo(videoPost, videoStatistic, tags);
@@ -81,12 +51,12 @@ public class CrawledDataService {
 
     public void updateVideoStatistic(CrawledVideo crawledVideo) {
         VideoStatistic videoStatistic = new VideoStatistic(crawledVideo);
-        videoStatisticMapper.update(videoStatistic);
+        videoRepository.updateVideoStatistic(videoStatistic);
     }
 
     public void updateVideoFile(VideoFileUpdate videoFileUpdate) {
         String videoId = videoFileUpdate.getVideoId();
-        VideoPost videoPost = videoPostMapper.findByVideoId(videoId);
+        VideoPost videoPost = videoRepository.getVideoPost(videoId);
         if (videoPost == null) {
             return;
         }

+ 85 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/TagService.java

@@ -0,0 +1,85 @@
+package cn.reghao.tnb.content.app.vod.service;
+
+import cn.reghao.jutil.jdk.db.Page;
+import cn.reghao.jutil.jdk.db.PageList;
+import cn.reghao.tnb.common.auth.UserContext;
+import cn.reghao.tnb.content.app.vod.db.mapper.PostTagMapper;
+import cn.reghao.tnb.content.app.vod.db.mapper.VideoPostTagMapper;
+import cn.reghao.tnb.content.app.vod.model.po.PostTag;
+import cn.reghao.tnb.content.app.vod.model.po.VideoPostTag;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * @author reghao
+ * @date 2025-10-20 11:04:05
+ */
+@Service
+public class TagService {
+    private final int pageSize = 12;
+    private final PostTagMapper postTagMapper;
+    private final VideoPostTagMapper videoPostTagMapper;
+    private final ContentPermission contentPermission;
+
+    public TagService(PostTagMapper postTagMapper, VideoPostTagMapper videoPostTagMapper,
+                      ContentPermission contentPermission) {
+        this.postTagMapper = postTagMapper;
+        this.videoPostTagMapper = videoPostTagMapper;
+        this.contentPermission = contentPermission;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void addVideoTags(String videoId, int scope, String tags) {
+        if (tags.isBlank()) {
+            return;
+        }
+
+        List<PostTag> list = new ArrayList<>();
+        List<VideoPostTag> list1 = new ArrayList<>();
+        for (String str : tags.split(",")) {
+            String tag = StringUtils.trimAllWhitespace(str);
+            PostTag postTag = postTagMapper.findByName(tag);
+            if (postTag != null) {
+                list1.add(new VideoPostTag(videoId, scope, postTag.getTagId()));
+            } else {
+                String tagId = UUID.randomUUID().toString().replace("-", "");
+                list.add(new PostTag(tagId, tag));
+                list1.add(new VideoPostTag(videoId, scope, tagId));
+            }
+        }
+
+        if (!list.isEmpty()) {
+            postTagMapper.saveAll(list);
+        }
+
+        if (!list1.isEmpty()) {
+            videoPostTagMapper.saveAll(list1);
+        }
+    }
+
+    public List<String> getVideoTagNames(String videoId) {
+        List<String> tagNames = videoPostTagMapper.findVideoTags(videoId);
+        return tagNames;
+    }
+
+    public PageList<String> getVideoIdsByTagName(String tagName, int pageNumber) {
+        long loginUser = UserContext.getUserId();
+        List<Integer> userScopes = contentPermission.getUserScopes(loginUser);
+
+        PostTag postTag = postTagMapper.findByName(tagName);
+        if (postTag == null) {
+            return PageList.empty();
+        }
+        String tagId = postTag.getTagId();
+
+        int total = videoPostTagMapper.countVideosByTag(tagId, userScopes);
+        Page page = new Page(pageNumber, pageSize);
+        List<String> videoIds = videoPostTagMapper.findVideosByPage(page, tagId, userScopes);
+        return PageList.pageList(pageNumber, pageSize, total, videoIds);
+    }
+}

+ 1 - 27
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/VideoEditService.java

@@ -6,21 +6,15 @@ import cn.reghao.tnb.content.api.constant.VideoErrorType;
 import cn.reghao.tnb.content.api.constant.VideoStatus;
 import cn.reghao.tnb.content.app.vod.db.mapper.VideoErrorMapper;
 import cn.reghao.tnb.content.app.vod.db.mapper.VideoPostMapper;
-import cn.reghao.tnb.content.app.vod.db.mapper.VipTagMapper;
 import cn.reghao.tnb.content.app.vod.model.dto.VideoEdit;
 import cn.reghao.tnb.content.app.vod.model.dto.VideoErrorReport;
-import cn.reghao.tnb.content.app.vod.model.dto.VideoVipTags;
 import cn.reghao.tnb.content.app.vod.model.po.VideoError;
-import cn.reghao.tnb.content.app.vod.model.po.VipTag;
 import cn.reghao.tnb.search.api.iface.DataSearchService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
-import java.util.Map;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 /**
  * @author reghao
@@ -33,14 +27,11 @@ public class VideoEditService {
     private DataSearchService dataSearchService;
 
     private final VideoPostMapper videoPostMapper;
-    private final VipTagMapper vipTagMapper;
     private final VideoErrorMapper videoErrorMapper;
     private final Set<Long> adminUsers = Set.of(10001L, 10002L);
 
-    public VideoEditService(VideoPostMapper videoPostMapper, VipTagMapper vipTagMapper,
-                            VideoErrorMapper videoErrorMapper) {
+    public VideoEditService(VideoPostMapper videoPostMapper, VideoErrorMapper videoErrorMapper) {
         this.videoPostMapper = videoPostMapper;
-        this.vipTagMapper = vipTagMapper;
         this.videoErrorMapper = videoErrorMapper;
     }
 
@@ -90,21 +81,4 @@ public class VideoEditService {
         long newUserId = videoEdit.getNewUserId();
         videoPostMapper.updateVideoUser(newUserId, videoEdit.getVideoIds());
     }
-
-    public List<VipTag> getVipTags() {
-        List<VipTag> list = vipTagMapper.findAll();
-        Map<Integer, List<VipTag>> groupMap = list.stream().collect(Collectors.groupingBy(VipTag::getPid));
-        List<VipTag> parents = groupMap.get(0);
-        for (VipTag parent : parents) {
-            int id = parent.getId();
-            parent.setChildren(groupMap.get(id));
-        }
-        return parents;
-    }
-
-    public void addVipTags(VideoVipTags videoVipTags) {
-        String videoId = videoVipTags.getVideoId();
-        List<String> tags = videoVipTags.getTags();
-        log.info("{} -> {}", videoId, tags);
-    }
 }

+ 0 - 1
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/VideoPostQuery.java

@@ -24,7 +24,6 @@ public interface VideoPostQuery {
     UserVideoPost getUserVideoPost(VideoPost videoPost);
     PageList<VideoCard> getTagVideos(String tag, int pn);
     List<BannerVideoVO> getBannerVideos();
-    List<String> getRandomTags(int size);
     List<String> getRandomVideoIds(List<Integer> userScopes, int size);
     /**
      * 获取用户发布的视频稿件

+ 1 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/VideoPostService.java

@@ -15,6 +15,7 @@ import cn.reghao.tnb.content.app.vod.model.po.VideoStatistic;
 public interface VideoPostService {
     String publishVideoFile(VideoFilePublish videoFilePublish) throws Exception;
     Result publishVideoPost(VideoPublishSbt videoPublishSbt);
+    @Deprecated
     void saveVideo(VideoPost videoPost, VideoStatistic videoStatistic, String tags);
     void updateVideoScope(VideoScopeUpdate videoScopeUpdate);
     void updateVideoInfo(VideoInfoUpdate videoInfoUpdate);

+ 1 - 13
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/VideoQueryService.java

@@ -5,8 +5,6 @@ import cn.reghao.tnb.common.db.PageScroll;
 import cn.reghao.tnb.content.api.dto.VideoCard;
 import cn.reghao.tnb.content.api.dto.VideoPostCard;
 import cn.reghao.tnb.content.app.vod.db.mapper.VideoPostMapper;
-import cn.reghao.tnb.content.app.vod.db.mapper.VideoPostTagMapper;
-import cn.reghao.tnb.content.app.vod.db.mapper.VideoTagMapper;
 import cn.reghao.tnb.content.app.vod.model.po.VideoPost;
 import cn.reghao.tnb.content.app.vod.model.query.VideoQuery;
 import cn.reghao.tnb.content.app.vod.model.vo.BannerVideoVO;
@@ -31,17 +29,12 @@ public class VideoQueryService {
     private final ContentPermission contentPermission;
     private final VideoPostMapper videoPostMapper;
     private final VideoPostQuery videoPostQuery;
-    private VideoPostTagMapper videoPostTagMapper;
-    private VideoTagMapper videoTagMapper;
 
     public VideoQueryService(ContentPermission contentPermission, VideoPostMapper videoPostMapper,
-                             VideoPostQuery videoPostQuery, VideoPostTagMapper videoPostTagMapper,
-                             VideoTagMapper videoTagMapper) {
+                             VideoPostQuery videoPostQuery) {
         this.contentPermission = contentPermission;
         this.videoPostMapper = videoPostMapper;
         this.videoPostQuery = videoPostQuery;
-        this.videoPostTagMapper = videoPostTagMapper;
-        this.videoTagMapper = videoTagMapper;
     }
 
     /**
@@ -89,11 +82,6 @@ public class VideoQueryService {
             return WebResult.notFound();
         }
 
-        /*List<String> postTags = videoPostTagMapper.findVideoTags(videoId);
-        for (String tagName : postTags) {
-            List<String> videoIds = videoTagMapper.findVideoIds(tagName);
-        }*/
-
         LocalDateTime publishAt = videoPost.getPublishAt();
         long publishBy = videoPost.getPublishBy();
         List<Integer> scopes = contentPermission.getUserScopes();

+ 7 - 12
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/VideoService.java

@@ -3,7 +3,7 @@ package cn.reghao.tnb.content.app.vod.service;
 import cn.reghao.file.api.iface.OssService;
 import cn.reghao.oss.sdk.model.dto.media.VideoUrlDto;
 import cn.reghao.tnb.common.auth.UserContext;
-import cn.reghao.tnb.content.app.vod.db.mapper.*;
+import cn.reghao.tnb.content.app.vod.db.repository.VideoRepository;
 import cn.reghao.tnb.content.app.vod.model.po.VideoPost;
 import cn.reghao.tnb.content.app.vod.model.vo.DownloadUrl;
 import lombok.extern.slf4j.Slf4j;
@@ -22,19 +22,14 @@ public class VideoService {
     @DubboReference(check = false)
     private OssService ossService;
 
-    private final VideoPostMapper videoPostMapper;
-    private final VideoFileMapper videoFileMapper;
-    private final VideoStatisticMapper videoStatisticMapper;
+    private final VideoRepository videoRepository;
 
-    public VideoService(VideoPostMapper videoPostMapper, VideoFileMapper videoFileMapper,
-                        VideoStatisticMapper videoStatisticMapper) {
-        this.videoPostMapper = videoPostMapper;
-        this.videoFileMapper = videoFileMapper;
-        this.videoStatisticMapper = videoStatisticMapper;
+    public VideoService(VideoRepository videoRepository) {
+        this.videoRepository = videoRepository;
     }
 
     public void thumbVideo(String videoId) {
-        videoStatisticMapper.updateIncrView(videoId);
+        videoRepository.updateIncrView(videoId);
     }
 
     public String getShareLink(String videoId) {
@@ -44,12 +39,12 @@ public class VideoService {
 
     public DownloadUrl downloadVideo(String videoId) {
         long userId = UserContext.getUserId();
-        VideoPost videoPost = videoPostMapper.findByVideoId(videoId);
+        VideoPost videoPost = videoRepository.getVideoPost(videoId);
         if (videoPost == null) {
             return null;
         }
 
-        List<VideoUrlDto> list = videoFileMapper.findVideoUrls(videoId);
+        List<VideoUrlDto> list = videoRepository.getVideoUrls(videoId);
         for (VideoUrlDto videoUrlDto : list) {
             try {
                 int channelId = videoUrlDto.getChannelCode();

+ 69 - 9
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/impl/CategoryServiceImpl.java

@@ -1,10 +1,16 @@
 package cn.reghao.tnb.content.app.vod.service.impl;
 
 import cn.reghao.jutil.jdk.db.Page;
+import cn.reghao.jutil.jdk.db.PageList;
 import cn.reghao.tnb.content.api.dto.VideoRegion;
 import cn.reghao.tnb.content.app.vod.db.mapper.VideoCategoryMapper;
+import cn.reghao.tnb.content.app.vod.db.mapper.VideoCategoryPostMapper;
+import cn.reghao.tnb.content.app.vod.model.dto.CategoryAdd;
 import cn.reghao.tnb.content.app.vod.model.po.VideoCategory;
+import cn.reghao.tnb.content.app.vod.model.po.VideoCategoryPost;
+import cn.reghao.tnb.content.app.vod.model.po.VideoPost;
 import cn.reghao.tnb.content.app.vod.model.query.CategoryQuery;
+import cn.reghao.tnb.content.app.vod.model.query.VideoQuery;
 import cn.reghao.tnb.content.app.vod.service.CategoryService;
 import cn.reghao.tnb.content.app.util.redis.ds.RedisStringObject;
 import org.springframework.stereotype.Service;
@@ -20,18 +26,16 @@ import java.util.stream.Collectors;
 public class CategoryServiceImpl implements CategoryService {
     private final VideoCategoryMapper videoCategoryMapper;
     private final RedisStringObject redisStringObject;
+    private final VideoCategoryPostMapper videoCategoryPostMapper;
 
-    public CategoryServiceImpl(VideoCategoryMapper videoCategoryMapper, RedisStringObject redisStringObject) {
+    public CategoryServiceImpl(VideoCategoryMapper videoCategoryMapper, RedisStringObject redisStringObject,
+                               VideoCategoryPostMapper videoCategoryPostMapper) {
         this.videoCategoryMapper = videoCategoryMapper;
         this.redisStringObject = redisStringObject;
+        this.videoCategoryPostMapper = videoCategoryPostMapper;
     }
 
-    public List<VideoCategory> getAllCategory() {
-        CategoryQuery categoryQuery = new CategoryQuery.Builder().build();
-        List<VideoCategory> list = getVideoCategories(categoryQuery);
-        return list;
-    }
-
+    @Override
     public List<VideoRegion> getCategories(boolean vip) {
         CategoryQuery categoryQuery = new CategoryQuery.Builder().build();
         List<VideoCategory> list = getVideoCategories(categoryQuery);
@@ -66,12 +70,25 @@ public class CategoryServiceImpl implements CategoryService {
         return parents;
     }
 
-    public List<VideoCategory> getVideoCategories(CategoryQuery categoryQuery) {
+    private List<VideoCategory> getVideoCategories(CategoryQuery categoryQuery) {
         int pageNumber = 1;
         int pageSize = 1000;
         Page page = new Page(pageNumber, pageSize);
         List<VideoCategory> list = videoCategoryMapper.findVideoCategoryByPage(page, categoryQuery);
-        return list;
+        if (list.isEmpty()) {
+            initVideoCategory();
+        }
+
+        return videoCategoryMapper.findVideoCategoryByPage(page, categoryQuery);
+    }
+
+    private void initVideoCategory() {
+        VideoCategory videoCategory1 = new VideoCategory(0, "大杂烩");
+        videoCategoryMapper.save(videoCategory1);
+
+        int pid = videoCategory1.getId();
+        VideoCategory videoCategory2 = new VideoCategory(pid, "杂");
+        videoCategoryMapper.save(videoCategory2);
     }
 
     private void setVideoCategory(List<VideoCategory> list) {
@@ -83,6 +100,7 @@ public class CategoryServiceImpl implements CategoryService {
         });
     }
 
+    @Override
     public VideoCategory getVideoCategory(int id) {
         String key = String.format("tnb:content:video:category:%s", id);
         Object value = redisStringObject.get(key);
@@ -92,4 +110,46 @@ public class CategoryServiceImpl implements CategoryService {
 
         return null;
     }
+
+    @Override
+    public void addVideoCategory(CategoryAdd categoryAdd) {
+        VideoCategory videoCategory1 = new VideoCategory(categoryAdd);
+        List<VideoCategory> list = List.of(videoCategory1);
+        videoCategoryMapper.saveAll(list);
+    }
+
+    @Override
+    public void setVideoCategoryPost(VideoPost videoPost) {
+        int categoryId = videoPost.getCategoryId();
+        long publishBy = videoPost.getPublishBy();
+        VideoCategoryPost videoCategoryPost = videoCategoryPostMapper.findByCategoryIdAndUserId(categoryId, publishBy);
+        if (videoCategoryPost == null) {
+            videoCategoryPost = new VideoCategoryPost(videoPost);
+            videoCategoryPostMapper.save(videoCategoryPost);
+        } else {
+            videoCategoryPost.setVideoId(videoPost.getVideoId());
+            videoCategoryPost.setScope(videoPost.getScope());
+            videoCategoryPost.setPublishAt(videoPost.getPublishAt());
+            videoCategoryPostMapper.updateVideoCategoryPost(videoCategoryPost);
+        }
+    }
+
+    @Override
+    public PageList<String> getVideoIdsByCategory(VideoQuery videoQuery, int pageNumber, int pageSize) {
+        int total = videoCategoryPostMapper.countByCriteria(videoQuery);
+        if (total > pageSize*100) {
+            total = pageSize*100;
+            if (pageNumber > 100) {
+                pageNumber = 100;
+            }
+        } else if (total == 0) {
+            return PageList.empty();
+        }
+
+        Page page = new Page(pageNumber, pageSize);
+        List<String> videoIds = videoCategoryPostMapper.findVideoCategoryPostByPage(page, videoQuery).stream()
+                .map(VideoCategoryPost::getVideoId)
+                .collect(Collectors.toList());
+        return PageList.pageList(pageNumber, pageSize, total, videoIds);
+    }
 }

+ 9 - 9
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/impl/VideoPlayServiceImpl.java

@@ -11,13 +11,13 @@ import cn.reghao.tnb.content.api.dto.VideoUrls;
 import cn.reghao.tnb.content.app.vod.db.mapper.PlayCompleteMapper;
 import cn.reghao.tnb.content.app.vod.db.mapper.PlayRecordMapper;
 import cn.reghao.tnb.content.app.vod.db.mapper.VideoPostMapper;
-import cn.reghao.tnb.content.app.vod.db.mapper.VideoPostTagMapper;
 import cn.reghao.tnb.content.app.vod.db.repository.VideoRepository;
 import cn.reghao.tnb.content.app.vod.model.po.PlayComplete;
 import cn.reghao.tnb.content.app.vod.model.po.PlayRecord;
 import cn.reghao.tnb.content.app.vod.model.po.VideoPost;
 import cn.reghao.tnb.content.api.dto.VideoRecordCard;
 import cn.reghao.tnb.content.app.vod.service.ContentPermission;
+import cn.reghao.tnb.content.app.vod.service.TagService;
 import cn.reghao.tnb.content.app.vod.service.VideoPlayService;
 import cn.reghao.tnb.content.app.vod.service.rcmd.UserInterestBased;
 import cn.reghao.tnb.message.api.dto.MediaProgress;
@@ -48,22 +48,22 @@ public class VideoPlayServiceImpl implements VideoPlayService {
     private final VideoPostMapper videoPostMapper;
     private final PlayRecordMapper playRecordMapper;
     private final VideoRepository videoRepository;
-    private final VideoPostTagMapper videoPostTagMapper;
     private final UserInterestBased userInterestBased;
     private final ContentPermission contentPermission;
-    private PlayCompleteMapper playCompleteMapper;
+    private final PlayCompleteMapper playCompleteMapper;
+    private final TagService tagService;
 
     public VideoPlayServiceImpl(VideoPostMapper videoPostMapper, PlayRecordMapper playRecordMapper,
-                                VideoRepository videoRepository, VideoPostTagMapper videoPostTagMapper,
-                                UserInterestBased userInterestBased, ContentPermission contentPermission,
-                                PlayCompleteMapper playCompleteMapper) {
+                                VideoRepository videoRepository, UserInterestBased userInterestBased,
+                                ContentPermission contentPermission, PlayCompleteMapper playCompleteMapper,
+                                TagService tagService) {
         this.videoPostMapper = videoPostMapper;
         this.playRecordMapper = playRecordMapper;
         this.videoRepository = videoRepository;
-        this.videoPostTagMapper = videoPostTagMapper;
         this.userInterestBased = userInterestBased;
         this.contentPermission = contentPermission;
         this.playCompleteMapper = playCompleteMapper;
+        this.tagService = tagService;
     }
 
     public VideoUrls getVideoPlayData(String videoId) {
@@ -74,7 +74,7 @@ public class VideoPlayServiceImpl implements VideoPlayService {
         }
 
         VideoPost videoPost = videoPostMapper.findByVideoId(videoId);
-        List<VideoUrlDto> list = videoRepository.findVideoUrls(videoId);
+        List<VideoUrlDto> list = videoRepository.getVideoUrls(videoId);
         if (list.isEmpty()) {
             return new VideoUrls();
         }
@@ -153,7 +153,7 @@ public class VideoPlayServiceImpl implements VideoPlayService {
     }
 
     private void addUserInterest(long userId, String videoId) {
-        List<String> tagIds = videoPostTagMapper.findVideoTags(videoId);
+        List<String> tagIds = tagService.getVideoTagNames(videoId);
         tagIds.forEach(tagId -> userInterestBased.addUserInterests(userId, tagId));
     }
 

+ 38 - 66
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/impl/VideoPostQueryImpl.java

@@ -14,14 +14,18 @@ import cn.reghao.tnb.content.api.constant.VideoStatus;
 import cn.reghao.tnb.content.api.dto.UserVideoPost;
 import cn.reghao.tnb.content.api.dto.VideoCard;
 import cn.reghao.tnb.content.api.dto.VideoPostCard;
-import cn.reghao.tnb.content.app.vod.db.mapper.*;
+import cn.reghao.tnb.content.app.vod.db.mapper.BannerVideoMapper;
+import cn.reghao.tnb.content.app.vod.db.mapper.VideoPostMapper;
 import cn.reghao.tnb.content.app.vod.db.repository.VideoRepository;
-import cn.reghao.tnb.content.app.vod.model.po.*;
+import cn.reghao.tnb.content.app.vod.model.po.VideoCategory;
+import cn.reghao.tnb.content.app.vod.model.po.VideoPost;
+import cn.reghao.tnb.content.app.vod.model.po.VideoStatistic;
 import cn.reghao.tnb.content.app.vod.model.vo.BannerVideoVO;
 import cn.reghao.tnb.content.app.vod.model.vo.VideoDetail;
 import cn.reghao.tnb.content.app.vod.model.query.VideoQuery;
 import cn.reghao.tnb.content.app.vod.service.CategoryService;
 import cn.reghao.tnb.content.app.vod.service.ContentPermission;
+import cn.reghao.tnb.content.app.vod.service.TagService;
 import cn.reghao.tnb.content.app.vod.service.VideoPostQuery;
 import cn.reghao.tnb.user.api.dto.UserCard;
 import cn.reghao.tnb.user.api.iface.UserService;
@@ -51,37 +55,22 @@ public class VideoPostQueryImpl implements VideoPostQuery {
 
     private final int pageSize = 12;
     private final VideoPostMapper videoPostMapper;
-    private final VideoFileMapper videoFileMapper;
-    private final VideoStatisticMapper videoStatisticMapper;
-    private final VideoCategoryPostMapper videoCategoryPostMapper;
-    private final VideoTagMapper videoTagMapper;
-    private final VideoPostTagMapper videoPostTagMapper;
     private final ContentPermission contentPermission;
     private final CategoryService categoryService;
     private final VideoRepository videoRepository;
     private final Random random = new SecureRandom();
     private final BannerVideoMapper bannerVideoMapper;
+    private final TagService tagService;
 
-    public VideoPostQueryImpl(VideoPostMapper videoPostMapper, VideoFileMapper videoFileMapper, VideoTagMapper videoTagMapper,
-                              VideoStatisticMapper videoStatisticMapper, VideoCategoryPostMapper videoCategoryPostMapper,
+    public VideoPostQueryImpl(VideoPostMapper videoPostMapper, BannerVideoMapper bannerVideoMapper,
                               ContentPermission contentPermission, CategoryService categoryService,
-                              VideoRepository videoRepository, VideoPostTagMapper videoPostTagMapper,
-                              BannerVideoMapper bannerVideoMapper) {
+                              VideoRepository videoRepository, TagService tagService) {
         this.videoPostMapper = videoPostMapper;
-        this.videoFileMapper = videoFileMapper;
-        this.videoTagMapper = videoTagMapper;
-        this.videoStatisticMapper = videoStatisticMapper;
-        this.videoCategoryPostMapper = videoCategoryPostMapper;
+        this.bannerVideoMapper = bannerVideoMapper;
         this.contentPermission = contentPermission;
         this.categoryService = categoryService;
         this.videoRepository = videoRepository;
-        this.videoPostTagMapper = videoPostTagMapper;
-        this.bannerVideoMapper = bannerVideoMapper;
-    }
-
-    public List<VideoCard> getVideoCards(List<String> videoIds) {
-        List<VideoPostCard> list = videoPostMapper.findVideoCardByVideoIds(videoIds);
-        return list.stream().map(videoPostCard -> getVideoCard(videoPostCard, true)).collect(Collectors.toList());
+        this.tagService = tagService;
     }
 
     public PageList<VideoCard> getCategoryVideos(int categoryId, int pageNumber) {
@@ -111,7 +100,17 @@ public class VideoPostQueryImpl implements VideoPostQuery {
                     .build();
         }
 
-        return getVideoCardsByUserGroup(videoQuery, pageNumber);
+        PageList<String> pageList = categoryService.getVideoIdsByCategory(videoQuery, pageNumber, pageSize);
+        List<String> videoIds = pageList.getList();
+        if (videoIds.isEmpty()) {
+            return PageList.empty();
+        }
+
+        List<VideoPostCard> list = videoPostMapper.findVideoCardByVideoIds(videoIds);
+        List<VideoCard> videoCardList = list.stream()
+                .map(videoPostCard -> getVideoCard(videoPostCard, true))
+                .collect(Collectors.toList());
+        return PageList.pageList(pageNumber, pageSize, (int) pageList.getTotalSize(), videoCardList);
     }
 
     public VideoDetail getShortVideo() {
@@ -121,12 +120,12 @@ public class VideoPostQueryImpl implements VideoPostQuery {
         }
 
         VideoPost videoPost = videoPostMapper.findByVideoId(videoId);
-        VideoStatistic videoStatistic = videoStatisticMapper.findByVideoId(videoId);
+        VideoStatistic videoStatistic = videoRepository.getVideoStatistic(videoId);
 
         long publishBy = videoPost.getPublishBy();
         String publishByStr = accountQuery.getUserIdStr(publishBy);
         VideoDetail videoDetail = new VideoDetail(videoPost, videoStatistic, publishByStr);
-        List<String> tags = videoTagMapper.findVideoTags(videoId);
+        List<String> tags = tagService.getVideoTagNames(videoId);
         videoDetail.setTags(tags);
         return videoDetail;
     }
@@ -145,46 +144,19 @@ public class VideoPostQueryImpl implements VideoPostQuery {
         return videoIds.get(randomIdx);
     }
 
-    private PageList<VideoCard> getVideoCardsByUserGroup(VideoQuery videoQuery, int pageNumber) {
-        int total = videoCategoryPostMapper.countByCriteria(videoQuery);
-        if (total > pageSize*100) {
-            total = pageSize*100;
-            if (pageNumber > 100) {
-                pageNumber = 100;
-            }
-        } else if (total == 0) {
-            return PageList.empty();
-        }
-
-        Page page = new Page(pageNumber, pageSize);
-        List<VideoCategoryPost> list0 = videoCategoryPostMapper.findVideoCategoryPostByPage(page, videoQuery);
-        List<String> videoIds = list0.stream().map(VideoCategoryPost::getVideoId).collect(Collectors.toList());
-        List<VideoPostCard> list = videoPostMapper.findVideoCardByVideoIds(videoIds);
-        List<VideoCard> list1 = list.stream()
-                .map(videoPostCard -> getVideoCard(videoPostCard, true))
-                .collect(Collectors.toList());
-        return PageList.pageList(pageNumber, pageSize, total, list1);
-    }
-
     @Override
-    public PageList<VideoCard> getTagVideos(String tag, int pn) {
-        VideoTag videoTag = videoTagMapper.findByName(tag);
-        if (videoTag == null) {
+    public PageList<VideoCard> getTagVideos(String tagName, int pageNumber) {
+        PageList<String> pageList = tagService.getVideoIdsByTagName(tagName, pageNumber);
+        List<String> videoIds = pageList.getList();
+        if (videoIds.isEmpty()) {
             return PageList.empty();
         }
 
-        long loginUser = UserContext.getUserId();
-        List<Integer> userScopes = contentPermission.getUserScopes(loginUser);
-        String tagId = videoTag.getTagId();
-        int total = videoPostTagMapper.countVideosByTag(tagId, userScopes);
-        Page page = new Page(pn, pageSize);
-        List<String> videoIds = videoPostTagMapper.findVideosByPage(page, tagId, userScopes);
         List<VideoPostCard> list = videoPostMapper.findVideoCardByVideoIds(videoIds);
-        List<VideoCard> list1 = list.stream()
+        List<VideoCard> videoCardList = list.stream()
                 .map(videoPostCard -> getVideoCard(videoPostCard, true))
                 .collect(Collectors.toList());
-
-        return PageList.pageList(pn, pageSize, total, list1);
+        return PageList.pageList(pageNumber, pageList.getPageSize(), (int) pageList.getTotalSize(), videoCardList);
     }
 
     public PageList<VideoCard> getUserVideos(long userId, int page) {
@@ -220,6 +192,11 @@ public class VideoPostQueryImpl implements VideoPostQuery {
         return PageList.pageList(page, pageSize, total, list1);
     }
 
+    public List<VideoCard> getVideoCards(List<String> videoIds) {
+        List<VideoPostCard> list = videoPostMapper.findVideoCardByVideoIds(videoIds);
+        return list.stream().map(videoPostCard -> getVideoCard(videoPostCard, true)).collect(Collectors.toList());
+    }
+
     public VideoCard getVideoCard(VideoPostCard videoPostCard, boolean user) {
         UserCard userCard = null;
         if (user) {
@@ -258,9 +235,9 @@ public class VideoPostQueryImpl implements VideoPostQuery {
 
         long publishBy = videoPost.getPublishBy();
         String publishByStr = accountQuery.getUserIdStr(publishBy);
-        VideoStatistic videoStatistic = videoStatisticMapper.findByVideoId(videoId);
+        VideoStatistic videoStatistic = videoRepository.getVideoStatistic(videoId);
         VideoDetail videoDetail = new VideoDetail(videoPost, videoStatistic, publishByStr);
-        List<String> tags = videoTagMapper.findVideoTags(videoId);
+        List<String> tags = tagService.getVideoTagNames(videoId);
         videoDetail.setTags(tags);
         return WebResult.success(videoDetail);
     }
@@ -285,11 +262,6 @@ public class VideoPostQueryImpl implements VideoPostQuery {
         return list;
     }
 
-    public List<String> getRandomTags(int size) {
-        List<String> tagIds = videoTagMapper.findRandomTags(1000);
-        return tagIds;
-    }
-
     @Override
     public List<String> getRandomVideoIds(List<Integer> userScopes, int size) {
         if (userScopes.size() == 1 && userScopes.get(0).equals(PostScope.PROTECT.getCode())) {
@@ -332,7 +304,7 @@ public class VideoPostQueryImpl implements VideoPostQuery {
         }
 
         int channelId = 105;
-        List<VideoUrlDto> list = videoFileMapper.findVideoUrls(videoId);
+        List<VideoUrlDto> list = videoRepository.getVideoUrls(videoId);
         for (VideoUrlDto videoUrlDto : list) {
             String videoFileId = videoUrlDto.getObjectId();
             try {

+ 32 - 92
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/impl/VideoPostServiceImpl.java

@@ -9,22 +9,24 @@ import cn.reghao.oss.sdk.model.dto.media.VideoInfo;
 import cn.reghao.oss.sdk.model.dto.media.VideoUrlDto;
 import cn.reghao.tnb.common.auth.UserContext;
 import cn.reghao.tnb.content.api.constant.PostScope;
-import cn.reghao.tnb.content.api.constant.VideoStatus;
 import cn.reghao.tnb.content.api.dto.VideoFilePublish;
 import cn.reghao.tnb.content.api.dto.VideoFileUpdate;
 import cn.reghao.tnb.content.api.dto.VideoPublishSbt;
-import cn.reghao.tnb.content.app.vod.db.mapper.*;
+import cn.reghao.tnb.content.app.vod.db.mapper.VideoPostMapper;
 import cn.reghao.tnb.content.app.vod.db.repository.VideoRepository;
 import cn.reghao.tnb.content.app.vod.model.dto.VideoCoverUpdate;
 import cn.reghao.tnb.content.app.vod.model.dto.VideoInfoUpdate;
 import cn.reghao.tnb.content.app.vod.model.dto.VideoScopeUpdate;
-import cn.reghao.tnb.content.app.vod.model.po.*;
+import cn.reghao.tnb.content.app.vod.model.po.VideoFile;
+import cn.reghao.tnb.content.app.vod.model.po.VideoPost;
+import cn.reghao.tnb.content.app.vod.model.po.VideoStatistic;
+import cn.reghao.tnb.content.app.vod.service.CategoryService;
+import cn.reghao.tnb.content.app.vod.service.TagService;
 import cn.reghao.tnb.content.app.vod.service.VideoPostService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.StringUtils;
 
 import java.util.*;
 
@@ -40,28 +42,19 @@ public class VideoPostServiceImpl implements VideoPostService {
     @DubboReference(check = false)
     private JobService jobService;
 
-    private int pageSize = 12;
-    private final VideoPostMapper videoPostMapper;
-    private final VideoStatisticMapper videoStatisticMapper;
-    private final VideoTagMapper videoTagMapper;
-    private final VideoPostTagMapper videoPostTagMapper;
-    private final VideoFileMapper videoFileMapper;
     private final IdGenerator idGenerator;
+    private final VideoPostMapper videoPostMapper;
     private final VideoRepository videoRepository;
-    private final VideoCategoryPostMapper videoCategoryPostMapper;
+    private final TagService tagService;
+    private final CategoryService categoryService;
 
-    public VideoPostServiceImpl(VideoPostMapper videoPostMapper, VideoStatisticMapper videoStatisticMapper,
-                                VideoTagMapper videoTagMapper, VideoPostTagMapper videoPostTagMapper,
-                                VideoFileMapper videoFileMapper, VideoRepository videoRepository,
-                                VideoCategoryPostMapper videoCategoryPostMapper) {
-        this.videoPostMapper = videoPostMapper;
-        this.videoStatisticMapper = videoStatisticMapper;
-        this.videoTagMapper = videoTagMapper;
-        this.videoPostTagMapper = videoPostTagMapper;
-        this.videoFileMapper = videoFileMapper;
+    public VideoPostServiceImpl(VideoPostMapper videoPostMapper, VideoRepository videoRepository,
+                                TagService tagService, CategoryService categoryService) {
         this.idGenerator = new IdGenerator("video-id");
+        this.videoPostMapper = videoPostMapper;
         this.videoRepository = videoRepository;
-        this.videoCategoryPostMapper = videoCategoryPostMapper;
+        this.tagService = tagService;
+        this.categoryService = categoryService;
     }
 
     public String publishVideoFile(VideoFilePublish videoFilePublish) throws Exception {
@@ -99,13 +92,13 @@ public class VideoPostServiceImpl implements VideoPostService {
             String coverUrl = imageInfo.getUrl();
 
             String videoId = videoPublishSbt.getVideoId();
-            VideoPost videoPost = videoPostMapper.findByVideoId(videoId);
+            VideoPost videoPost = videoRepository.getVideoPost(videoId);
             if (videoPost == null) {
                 String errMsg = String.format("VideoId %s 不存在", videoId);
                 return Result.fail(errMsg);
             }
 
-            List<VideoFile> videoFileList = videoFileMapper.findByVideoId(videoId);
+            List<VideoFile> videoFileList = videoRepository.getVideoFiles(videoId);
             if (videoFileList.isEmpty()) {
                 String errMsg = String.format("VideoId %s 关联的视频文件不存在", videoId);
                 return Result.fail(errMsg);
@@ -155,84 +148,30 @@ public class VideoPostServiceImpl implements VideoPostService {
     public void saveVideo(VideoPost videoPost, String tags) {
         String videoId = videoPost.getVideoId();
         VideoStatistic videoStatistic = new VideoStatistic(videoId);
-        setVideoCategoryPost(videoPost);
         videoRepository.savePostVideo(videoPost, videoStatistic);
-        setVideoTags(videoId, videoPost.getScope(), tags);
+
+        tagService.addVideoTags(videoId, videoPost.getScope(), tags);
+        categoryService.setVideoCategoryPost(videoPost);
     }
 
-    @Deprecated
     @Transactional(rollbackFor = Exception.class)
+    @Deprecated
     public void saveVideo(VideoPost videoPost, VideoStatistic videoStatistic, String tags) {
-        int categoryId = videoPost.getCategoryId();
-        long publishBy = videoPost.getPublishBy();
-        VideoCategoryPost videoCategoryPost = videoCategoryPostMapper.findByCategoryIdAndUserId(categoryId, publishBy);
-        if (videoCategoryPost == null) {
-            videoCategoryPost = new VideoCategoryPost(videoPost);
-            videoCategoryPostMapper.save(videoCategoryPost);
-        } else {
-            videoCategoryPost.setVideoId(videoPost.getVideoId());
-            videoCategoryPost.setScope(videoPost.getScope());
-            videoCategoryPost.setPublishAt(videoPost.getPublishAt());
-            videoCategoryPostMapper.updateVideoCategoryPost(videoCategoryPost);
-        }
+        videoRepository.savePostVideo(videoPost, videoStatistic);
 
         String videoId = videoPost.getVideoId();
-        videoPostMapper.save(videoPost);
-        videoStatisticMapper.save(videoStatistic);
-        setVideoTags(videoId, videoPost.getScope(), tags);
-    }
-
-    private void setVideoCategoryPost(VideoPost videoPost) {
-        int categoryId = videoPost.getCategoryId();
-        long publishBy = videoPost.getPublishBy();
-        VideoCategoryPost videoCategoryPost = videoCategoryPostMapper.findByCategoryIdAndUserId(categoryId, publishBy);
-        if (videoCategoryPost == null) {
-            videoCategoryPost = new VideoCategoryPost(videoPost);
-            videoCategoryPostMapper.save(videoCategoryPost);
-        } else {
-            videoCategoryPost.setVideoId(videoPost.getVideoId());
-            videoCategoryPost.setScope(videoPost.getScope());
-            videoCategoryPost.setPublishAt(videoPost.getPublishAt());
-            videoCategoryPostMapper.updateVideoCategoryPost(videoCategoryPost);
-        }
-    }
-
-    private void setVideoTags(String videoId, int scope, String tags) {
-        if (tags.isBlank()) {
-            return;
-        }
-
-        List<VideoTag> list = new ArrayList<>();
-        List<VideoPostTag> list1 = new ArrayList<>();
-        for (String str : tags.split(",")) {
-            String tag = StringUtils.trimAllWhitespace(str);
-            VideoTag videoTag = videoTagMapper.findByName(tag);
-            if (videoTag != null) {
-                list1.add(new VideoPostTag(videoId, scope, videoTag.getTagId()));
-            } else {
-                String tagId = UUID.randomUUID().toString().replace("-", "");
-                list.add(new VideoTag(tagId, tag));
-                list1.add(new VideoPostTag(videoId, scope, tagId));
-            }
-        }
-
-        if (!list.isEmpty()) {
-            videoTagMapper.saveAll(list);
-        }
-
-        if (!list1.isEmpty()) {
-            videoPostTagMapper.saveAll(list1);
-        }
+        tagService.addVideoTags(videoId, videoPost.getScope(), tags);
+        categoryService.setVideoCategoryPost(videoPost);
     }
 
     public void updateVideoScope(VideoScopeUpdate videoScopeUpdate) {
         String videoId = videoScopeUpdate.getVideoId();
-        VideoPost videoPost = videoPostMapper.findByVideoId(videoId);
+        VideoPost videoPost = videoRepository.getVideoPost(videoId);
         if (videoPost == null) {
             return;
         }
 
-        List<VideoUrlDto> list = videoFileMapper.findVideoUrls(videoId);
+        List<VideoUrlDto> list = videoRepository.getVideoUrls(videoId);
         for (VideoUrlDto videoUrlDto : list) {
             String videoFileId = videoUrlDto.getObjectId();
             try {
@@ -247,7 +186,8 @@ public class VideoPostServiceImpl implements VideoPostService {
     }
 
     public void updateVideoInfo(VideoInfoUpdate videoInfoUpdate) {
-        VideoPost videoPost = videoPostMapper.findByVideoId(videoInfoUpdate.getVideoId());
+        String videoId = videoInfoUpdate.getVideoId();
+        VideoPost videoPost = videoRepository.getVideoPost(videoId);
         if (videoPost == null) {
             return;
         }
@@ -257,7 +197,7 @@ public class VideoPostServiceImpl implements VideoPostService {
 
     public void updateVideoCover(VideoCoverUpdate videoCoverUpdate) {
         String videoId = videoCoverUpdate.getVideoId();
-        VideoPost videoPost = videoPostMapper.findByVideoId(videoId);
+        VideoPost videoPost = videoRepository.getVideoPost(videoId);
         if (videoPost == null) {
             return;
         }
@@ -289,12 +229,12 @@ public class VideoPostServiceImpl implements VideoPostService {
 
     public void updateVideoFile(VideoFileUpdate videoFileUpdate) {
         String videoId = videoFileUpdate.getVideoId();
-        VideoPost videoPost = videoPostMapper.findByVideoId(videoId);
+        VideoPost videoPost = videoRepository.getVideoPost(videoId);
         if (videoPost == null) {
             return;
         }
 
-        List<VideoUrlDto> list = videoFileMapper.findVideoUrls(videoId);
+        List<VideoUrlDto> list = videoRepository.getVideoUrls(videoId);
         for (VideoUrlDto videoUrlDto : list) {
             String videoFileId = videoFileUpdate.getVideoFileId();
             try {
@@ -319,7 +259,7 @@ public class VideoPostServiceImpl implements VideoPostService {
     }
 
     public void deleteVideo(String videoId) {
-        VideoPost videoPost = videoPostMapper.findByVideoId(videoId);
+        VideoPost videoPost = videoRepository.getVideoPost(videoId);
         long owner = videoPost.getPublishBy();
         if (owner == UserContext.getUserId()) {
             // 删除 videoId 关联的所有数据, 包括观看记录, 用户收藏, 视频数据, 视频标签, 推荐数据等
@@ -327,7 +267,7 @@ public class VideoPostServiceImpl implements VideoPostService {
 
             String coverUrl = videoPost.getCoverUrl();
             deleteCoverFile(coverUrl);
-            List<VideoUrlDto> list = videoFileMapper.findVideoUrls(videoId);
+            List<VideoUrlDto> list = videoRepository.getVideoUrls(videoId);
             for (VideoUrlDto videoUrlDto : list) {
                 String videoFileId = videoUrlDto.getObjectId();
                 try {

+ 0 - 14
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/rcmd/task/RcmdTask.java

@@ -71,18 +71,4 @@ public class RcmdTask implements Runnable {
         String requestId = MDC.get("request_id");
         log.info("{}: {}'s rcmd-task cost {}s", requestId, loginUser, (System.currentTimeMillis()-start)/1000);
     }
-
-    List<String> getRedisVideoIds(long loginUser) {
-        Set<String> interestTagIds = userInterestBased.getUserInterestCategory(loginUser);
-        if (interestTagIds.size() < 1000) {
-            List<String> tagIds = videoPostQuery.getRandomTags(100);
-            for (String tagId : tagIds) {
-                userInterestBased.addUserInterests(loginUser, tagId);
-            }
-        }
-
-        Set<String> interestItems = userInterestBased.getUserInterestItems(loginUser);
-        List<String> videoIds1 = new ArrayList<>(interestItems);
-        return videoIds1;
-    }
 }

+ 14 - 14
content/content-service/src/main/resources/mapper/vod/VideoTagMapper.xml → content/content-service/src/main/resources/mapper/vod/PostTagMapper.xml

@@ -1,15 +1,15 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
-<mapper namespace="cn.reghao.tnb.content.app.vod.db.mapper.VideoTagMapper">
+<mapper namespace="cn.reghao.tnb.content.app.vod.db.mapper.PostTagMapper">
     <insert id="save" useGeneratedKeys="true" keyProperty="id">
-        insert into vod_video_tag
+        insert into vod_post_tag
             (`tag_id`,`tag_name`)
         values
         (#{tagId},#{tagName})
     </insert>
     <insert id="saveAll" useGeneratedKeys="true" keyProperty="id">
-        insert ignore into vod_video_tag
+        insert ignore into vod_post_tag
             (`tag_id`,`tag_name`)
         values
         <foreach collection="list" item="item" index="index" separator=",">
@@ -18,25 +18,25 @@
     </insert>
 
     <delete id="deleteByTagId">
-        delete from vod_video_tag
+        delete from vod_post_tag
         where tag_id=#{tagId}
     </delete>
 
-    <select id="findAll" resultType="cn.reghao.tnb.content.app.vod.model.po.VideoTag">
+    <select id="findAll" resultType="cn.reghao.tnb.content.app.vod.model.po.PostTag">
         select *
-        from vod_video_tag
+        from vod_post_tag
     </select>
-    <select id="findByName" resultType="cn.reghao.tnb.content.app.vod.model.po.VideoTag">
-        select * from vod_video_tag where tag_name=#{name}
+    <select id="findByName" resultType="cn.reghao.tnb.content.app.vod.model.po.PostTag">
+        select * from vod_post_tag where tag_name=#{name}
     </select>
-    <select id="findByTagId" resultType="cn.reghao.tnb.content.app.vod.model.po.VideoTag">
+    <select id="findByTagId" resultType="cn.reghao.tnb.content.app.vod.model.po.PostTag">
         select *
-        from vod_video_tag
+        from vod_post_tag
         where tag_id=#{tagId}
     </select>
     <select id="findVideoTags" resultType="java.lang.String">
         select tag.tag_name
-        from vod_video_tag tag
+        from vod_post_tag tag
         inner join vod_video_tags tags
         on tag.tag_id=tags.tag_id and tags.video_id=#{videoId}
     </select>
@@ -45,14 +45,14 @@
         from vod_video_tags
         where tag_id in (
             select tag_id
-            from vod_video_tag
+            from vod_post_tag
             where tag_name=#{tagName}
         )
         limit 100
     </select>
     <select id="findRandomTags" resultType="java.lang.String">
-        SELECT t1.tag_id FROM vod_video_tag AS t1
-        JOIN (SELECT ROUND(RAND()*(SELECT MAX(id) FROM vod_video_tag)) AS id) AS t2
+        SELECT t1.tag_id FROM vod_post_tag AS t1
+        JOIN (SELECT ROUND(RAND()*(SELECT MAX(id) FROM vod_post_tag)) AS id) AS t2
         WHERE t1.id>=t2.id
         ORDER BY t1.id
         LIMIT #{size};

+ 0 - 30
content/content-service/src/main/resources/mapper/vod/VipTagMapper.xml

@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-
-<mapper namespace="cn.reghao.tnb.content.app.vod.db.mapper.VipTagMapper">
-    <insert id="save" useGeneratedKeys="true" keyProperty="id">
-        insert into vod_vip_tag
-        (`pid`,`name`,`tag_id`)
-        values
-        (#{pid},#{name},#{tagId})
-    </insert>
-    <insert id="saveAll" useGeneratedKeys="true" keyProperty="id">
-        insert ignore into vod_vip_tag
-        (`pid`,`name`,`tag_id`)
-        values
-        <foreach collection="list" item="item" index="index" separator=",">
-            (#{item.pid},#{item.name},#{item.tagId})
-        </foreach>
-    </insert>
-
-    <select id="findAll" resultType="cn.reghao.tnb.content.app.vod.model.po.VipTag">
-        select *
-        from vod_vip_tag
-        limit 1000
-    </select>
-    <select id="findByPid" resultType="cn.reghao.tnb.content.app.vod.model.po.VipTag">
-        select * 
-        from vod_vip_tag 
-        where pid=#{pid}
-    </select>
-</mapper>

+ 0 - 15
content/content-service/src/test/java/cn/reghao/tnb/content/app/vod/service/VideoPostTest.java

@@ -96,8 +96,6 @@ public class VideoPostTest {
         return weight1;
     }
 
-    @Autowired
-    VideoTagMapper videoTagMapper;
     @Autowired
     VideoPostTagMapper videoPostTagMapper;
     @Autowired
@@ -133,15 +131,6 @@ public class VideoPostTest {
         }*/
     }
 
-    @Test
-    public void addInterests() {
-        long userId = 10002L;
-        List<String> tagIds = videoTagMapper.findRandomTags(1000);
-        for (String tagId : tagIds) {
-            userInterestBased.addUserInterests(userId, tagId);
-        }
-    }
-
     @Autowired
     RedisSet redisSet;
     @Test
@@ -227,10 +216,6 @@ public class VideoPostTest {
             } else {
                 list.add(videoPost);
             }*/
-
-            String videoId = videoPost.getVideoId();
-            List<String> tags = videoTagMapper.findVideoTags(videoId);
-            tagList.addAll(tags);
         }
 
         /*List<String> urls = new ArrayList<>();

+ 0 - 1
file/file-api/src/main/java/cn/reghao/file/api/iface/FileService.java

@@ -9,6 +9,5 @@ import cn.reghao.jutil.jdk.result.Result;
  * @date 2024-07-07 16:55:29
  */
 public interface FileService {
-    String getAccountAvatar(long userId);
     PageList<JobInfo> getJobs(int pn, int ps);
 }

+ 19 - 17
file/file-service/src/main/java/cn/reghao/tnb/file/app/config/web/OssSdkInterceptor.java

@@ -16,10 +16,10 @@ import javax.servlet.http.HttpServletResponse;
 import java.util.UUID;
 
 /**
- * 用户访问拦截器
+ * oss-sdk 请求访问拦截器
  *
  * @author reghao
- * @date 2023-07-31 10:19:07
+ * @date 2025-10-20 17:09:07
  */
 @Slf4j
 @Component
@@ -40,24 +40,26 @@ public class OssSdkInterceptor implements HandlerInterceptor {
 
         String uri = request.getRequestURI();
         String method = request.getMethod();
-        if (uri.equals("/api/oss/sdk/key/auth")) {
-            return true;
-        }
+        if (uri.startsWith("/api/oss/sdk/")) {
+            if (uri.equals("/api/oss/sdk/key/auth")) {
+                return true;
+            }
 
-        String token = ServletUtil.getBearerToken();
-        if (token == null || token.isBlank()) {
-            log.error("request {} start with /bg/api/oss/, but not auth", uri);
-            response.setStatus(403);
-            return false;
-        }
+            String token = ServletUtil.getBearerToken();
+            if (token == null || token.isBlank()) {
+                log.error("request {} start with /bg/api/oss/, but not auth", uri);
+                response.setStatus(403);
+                return false;
+            }
 
-        LoginUser loginUser = userKeyService.getUserFromToken(token);
-        if (loginUser == null) {
-            log.error("request {} start with /api/oss/sdk, but not auth", uri);
-            response.setStatus(403);
-            return false;
+            LoginUser loginUser = userKeyService.getUserFromToken(token);
+            if (loginUser == null) {
+                log.error("request {} start with /api/oss/sdk, but not auth", uri);
+                response.setStatus(403);
+                return false;
+            }
+            UserContext user = new UserContext(loginUser);
         }
-        UserContext user = new UserContext(loginUser);
         return true;
     }
 

+ 3 - 1
file/file-service/src/main/java/cn/reghao/tnb/file/app/controller/UserNodeController.java

@@ -5,6 +5,7 @@ import cn.reghao.jutil.web.WebResult;
 import cn.reghao.tnb.common.auth.UserContext;
 import cn.reghao.tnb.file.app.model.dto.UserNodeDto;
 import cn.reghao.tnb.common.db.SelectOption;
+import cn.reghao.tnb.file.app.model.dto.UserNodeUpdateDto;
 import cn.reghao.tnb.file.app.model.vo.UserNodeInfo;
 import cn.reghao.tnb.file.app.service.UserNodeService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -54,7 +55,8 @@ public class UserNodeController {
 
     @Operation(summary = "更新用户节点", description = "N")
     @PostMapping(value = "/update", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String updateNode(@RequestBody @Validated UserNodeDto userNodeDto) {
+    public String updateNode(@RequestBody @Validated UserNodeUpdateDto userNodeUpdateDto) {
+        userNodeService.updateUserNode(userNodeUpdateDto);
         return WebResult.success();
     }
 

+ 7 - 0
file/file-service/src/main/java/cn/reghao/tnb/file/app/db/mapper/UserNodeMapper.java

@@ -1,6 +1,7 @@
 package cn.reghao.tnb.file.app.db.mapper;
 
 import cn.reghao.jutil.jdk.db.BaseMapper;
+import cn.reghao.tnb.file.app.model.dto.UserNodeUpdateDto;
 import cn.reghao.tnb.file.app.model.po.UserNode;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -13,6 +14,12 @@ import java.util.List;
  */
 @Mapper
 public interface UserNodeMapper extends BaseMapper<UserNode> {
+    /*void updateUserNode(@Param("userNodeId") int userNodeId,
+                        @Param("domain") int domain,
+                        @Param("referer") int referer,
+                        @Param("secretKey") int secretKey);*/
+    void updateUserNode(UserNodeUpdateDto userNodeUpdateDto);
+
     int countByStoreNodeId(int storeNodeId);
     UserNode findByCreateByAndStoreNodeId(@Param("createBy") long createBy, @Param("storeNodeId") int storeNodeId);
     List<UserNode> findByCreateBy(long createBy);

+ 2 - 0
file/file-service/src/main/java/cn/reghao/tnb/file/app/model/dto/UserNodeDto.java

@@ -3,6 +3,7 @@ package cn.reghao.tnb.file.app.model.dto;
 import lombok.Getter;
 import lombok.Setter;
 
+import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Pattern;
 import javax.validation.constraints.Size;
@@ -16,6 +17,7 @@ import javax.validation.constraints.Size;
 public class UserNodeDto {
     @NotNull
     private Integer storeNodeId;
+    @NotBlank
     @Pattern(regexp = "^[a-z0-9]+([\\-\\.]{1}[a-z0-9]+)*\\.[a-z]{2,6}$", message = "域名格式不正确")
     @Size(max = 128, message = "域名长度应小于 128 个字符")
     private String domain;

+ 26 - 0
file/file-service/src/main/java/cn/reghao/tnb/file/app/model/dto/UserNodeUpdateDto.java

@@ -0,0 +1,26 @@
+package cn.reghao.tnb.file.app.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+
+/**
+ * @author reghao
+ * @date 2025-10-20 16:42:44
+ */
+@Setter
+@Getter
+public class UserNodeUpdateDto {
+    @NotNull
+    private Integer userNodeId;
+    @NotBlank
+    @Pattern(regexp = "^[a-z0-9]+([\\-\\.]{1}[a-z0-9]+)*\\.[a-z]{2,6}$", message = "域名格式不正确")
+    @Size(min = 1, max = 128, message = "域名长度应小于 128 个字符")
+    private String domain;
+    private String referer;
+    private String secretKey;
+}

+ 1 - 10
file/file-service/src/main/java/cn/reghao/tnb/file/app/rpc/ConsoleServiceImpl.java

@@ -6,9 +6,6 @@ import cn.reghao.oss.api.dto.StoreNodeDto;
 import cn.reghao.oss.api.iface.ConsoleService;
 import cn.reghao.oss.api.iface.StoreService;
 import cn.reghao.oss.sdk.model.dto.ServerInfo;
-import cn.reghao.tnb.file.app.db.mapper.StoreConfigMapper;
-import cn.reghao.tnb.file.app.model.constant.OssType;
-import cn.reghao.tnb.file.app.model.po.StoreConfig;
 import cn.reghao.tnb.file.app.model.po.StoreNode;
 import cn.reghao.tnb.file.app.model.po.UploadChannel;
 import cn.reghao.tnb.file.app.model.po.UserNode;
@@ -19,7 +16,6 @@ import cn.reghao.tnb.file.app.service.UserNodeService;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.stereotype.Service;
 
-import javax.annotation.PostConstruct;
 import java.util.List;
 
 /**
@@ -29,7 +25,6 @@ import java.util.List;
 @DubboService
 @Service
 public class ConsoleServiceImpl implements ConsoleService {
-    private int ossUser = -1;
     private final UploadChannelService uploadChannelService;
     private final StoreNodeService storeNodeService;
     private final UserNodeService userNodeService;
@@ -45,11 +40,6 @@ public class ConsoleServiceImpl implements ConsoleService {
         this.storeConfigService = storeConfigService;
     }
 
-    @PostConstruct
-    public void postSetOssUser() {
-        this.ossUser = storeConfigService.getLocalOssUser(OssType.localOss);
-    }
-
     @Override
     public void registerNode(StoreNodeDto storeNodeDto) {
         storeNodeService.addOrUpdate(storeNodeDto);
@@ -90,6 +80,7 @@ public class ConsoleServiceImpl implements ConsoleService {
 
     @Override
     public ServerInfo getUploadStore(int channelCode) {
+        int ossUser = storeConfigService.getLocalOssUser();
         UploadChannel uploadChannel = uploadChannelService.getByChannelCodeAndCreateBy(channelCode, ossUser);
         if (uploadChannel == null) {
             String errMsg = String.format("channelCode %s not exist", channelCode);

+ 1 - 0
file/file-service/src/main/java/cn/reghao/tnb/file/app/rpc/FileServiceImpl.java

@@ -43,6 +43,7 @@ public class FileServiceImpl implements FileService {
         this.baseDir = System.getProperty("java.io.tmpdir");
     }
 
+    @Deprecated
     public String getAccountAvatar(long userId) {
         String siteAddr = "";
         int avatarChannelCode = 0;

+ 20 - 9
file/file-service/src/main/java/cn/reghao/tnb/file/app/rpc/StoreServiceWrapperRouter.java

@@ -14,11 +14,10 @@ import cn.reghao.tnb.file.app.db.repository.StoreRepository;
 import cn.reghao.tnb.file.app.model.constant.OssType;
 import cn.reghao.tnb.file.app.model.po.UploadChannel;
 import cn.reghao.tnb.file.app.service.StoreConfigService;
+import cn.reghao.tnb.file.app.service.UploadChannelService;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.stereotype.Service;
 
-import javax.annotation.PostConstruct;
-
 /**
  * @author reghao
  * @date 2024-07-03 14:40:25
@@ -26,30 +25,32 @@ import javax.annotation.PostConstruct;
 @DubboService
 @Service
 public class StoreServiceWrapperRouter implements OssService {
-    private int ossUser = -1;
     private final int ossType;
     private final ConsoleService consoleService;
     private final StoreServiceWrapper storeServiceWrapper;
     private final StoreConfigService storeConfigService;
     private final StoreRepository storeRepository;
+    private final UploadChannelService uploadChannelService;
 
     public StoreServiceWrapperRouter(AppProperties appProperties, ConsoleService consoleService,
                                      StoreServiceWrapper storeServiceWrapper, StoreConfigService storeConfigService,
-                                     StoreRepository storeRepository) {
+                                     StoreRepository storeRepository, UploadChannelService uploadChannelService) {
         this.ossType = appProperties.getOssType();
         this.consoleService = consoleService;
         this.storeServiceWrapper = storeServiceWrapper;
         this.storeConfigService = storeConfigService;
         this.storeRepository = storeRepository;
-    }
-
-    @PostConstruct
-    public void postSetOssUser() {
-        this.ossUser = storeConfigService.getLocalOssUser(OssType.localOss);
+        this.uploadChannelService = uploadChannelService;
     }
 
     public ServerInfo getUploadStore(String channelName) throws Exception {
+        int ossUser = storeConfigService.getLocalOssUser();
         UploadChannel uploadChannel = storeRepository.getUploadChannel(ossUser, channelName);
+        if (uploadChannel == null) {
+            uploadChannelService.initUploadChannel();
+            uploadChannel = storeRepository.getUploadChannel(ossUser, channelName);
+        }
+
         int channelCode = uploadChannel.getChannelCode();
         return consoleService.getUploadStore(channelCode);
     }
@@ -68,6 +69,7 @@ public class StoreServiceWrapperRouter implements OssService {
     }
 
     public void setObjectScope(int channelCode, String objectId, int scope) throws Exception {
+        int ossUser = storeConfigService.getLocalOssUser();
         if (ossType == OssType.localOss.getCode()) {
             storeServiceWrapper.setObjectScope(channelCode, objectId, scope, ossUser);
         } else if (ossType == OssType.aliyunOss.getCode()) {
@@ -75,6 +77,7 @@ public class StoreServiceWrapperRouter implements OssService {
     }
 
     public void deleteByObjectId(int channelCode, String objectId) throws Exception {
+        int ossUser = storeConfigService.getLocalOssUser();
         if (ossType == OssType.localOss.getCode()) {
             storeServiceWrapper.deleteByObjectId(channelCode, objectId, ossUser);
         } else if (ossType == OssType.aliyunOss.getCode()) {
@@ -82,6 +85,7 @@ public class StoreServiceWrapperRouter implements OssService {
     }
 
     public void deleteByObjectUrl(String objectUrl) throws Exception {
+        int ossUser = storeConfigService.getLocalOssUser();
         if (ossType == OssType.localOss.getCode()) {
             storeServiceWrapper.deleteByObjectUrl(objectUrl, ossUser);
         } else if (ossType == OssType.aliyunOss.getCode()) {
@@ -89,6 +93,7 @@ public class StoreServiceWrapperRouter implements OssService {
     }
 
     public ObjectInfo getObjectInfo(int channelCode, String objectId) throws Exception {
+        int ossUser = storeConfigService.getLocalOssUser();
         if (ossType == OssType.localOss.getCode()) {
             return storeServiceWrapper.getObjectInfo(channelCode, objectId, ossUser);
         } else if (ossType == OssType.aliyunOss.getCode()) {
@@ -98,6 +103,7 @@ public class StoreServiceWrapperRouter implements OssService {
     }
 
     public String getSignedUrl(int channelCode, String objectId) throws Exception {
+        int ossUser = storeConfigService.getLocalOssUser();
         if (ossType == OssType.localOss.getCode()) {
             return storeServiceWrapper.getSignedUrl(channelCode, objectId, ossUser);
         } else if (ossType == OssType.aliyunOss.getCode()) {
@@ -107,6 +113,7 @@ public class StoreServiceWrapperRouter implements OssService {
     }
 
     public String getSignedUrlByUrl(int channelCode, String objectUrl) throws Exception {
+        int ossUser = storeConfigService.getLocalOssUser();
         if (ossType == OssType.localOss.getCode()) {
             return storeServiceWrapper.getSignedUrlByUrl(channelCode, objectUrl, ossUser);
         } else if (ossType == OssType.aliyunOss.getCode()) {
@@ -116,10 +123,12 @@ public class StoreServiceWrapperRouter implements OssService {
     }
 
     public VideoInfo getVideoInfo(int channelCode, String videoFileId) throws Exception {
+        int ossUser = storeConfigService.getLocalOssUser();
         return storeServiceWrapper.getVideoInfo(channelCode, videoFileId, ossUser);
     }
 
     public ImageInfo getImageInfo(int channelCode, String imageFileId) throws Exception {
+        int ossUser = storeConfigService.getLocalOssUser();
         if (ossType == OssType.localOss.getCode()) {
             return storeServiceWrapper.getImageInfo(channelCode, imageFileId, ossUser);
         } else if (ossType == OssType.aliyunOss.getCode()) {
@@ -129,6 +138,7 @@ public class StoreServiceWrapperRouter implements OssService {
     }
 
     public ConvertedImageInfo getWebpInfo(int channelCode, String imageFileId) throws Exception {
+        int ossUser = storeConfigService.getLocalOssUser();
         if (ossType == OssType.localOss.getCode()) {
             return storeServiceWrapper.getWebpInfo(channelCode, imageFileId, ossUser);
         } else if (ossType == OssType.aliyunOss.getCode()) {
@@ -137,6 +147,7 @@ public class StoreServiceWrapperRouter implements OssService {
     }
 
     public AudioInfo getAudioInfo(int channelCode, String audioFileId) throws Exception {
+        int ossUser = storeConfigService.getLocalOssUser();
         if (ossType == OssType.localOss.getCode()) {
             return storeServiceWrapper.getAudioInfo(channelCode, audioFileId, ossUser);
         } else if (ossType == OssType.aliyunOss.getCode()) {

+ 2 - 2
file/file-service/src/main/java/cn/reghao/tnb/file/app/service/UploadChannelService.java

@@ -78,9 +78,9 @@ public class UploadChannelService {
     }
 
     private int getNextChannelCode(long createBy) {
-        int channelCode = 101;
+        int startChannelCode = 101;
         int total = uploadChannelMapper.countByCreateBy(createBy);
-        return channelCode + total;
+        return startChannelCode + total;
     }
 
     public void updateChannelStatus(int id) {

+ 6 - 1
file/file-service/src/main/java/cn/reghao/tnb/file/app/service/UserNodeService.java

@@ -6,6 +6,7 @@ import cn.reghao.tnb.file.app.db.mapper.StoreNodeMapper;
 import cn.reghao.tnb.file.app.db.mapper.UploadChannelMapper;
 import cn.reghao.tnb.file.app.db.mapper.UserNodeMapper;
 import cn.reghao.tnb.file.app.model.dto.UserNodeDto;
+import cn.reghao.tnb.file.app.model.dto.UserNodeUpdateDto;
 import cn.reghao.tnb.file.app.model.po.StoreNode;
 import cn.reghao.tnb.file.app.model.po.UploadChannel;
 import cn.reghao.tnb.file.app.model.po.UserNode;
@@ -55,13 +56,17 @@ public class UserNodeService {
 
     public void createUserNode(int storeNodeId) {
         int ossUser = storeConfigService.getLocalOssUser();
-        String domain = "";
+        String domain = "oss.reghao.cn";
         String secretKey = "";
         String referer = "";
         UserNode userNode = new UserNode(storeNodeId, domain, secretKey, referer, ossUser);
         userNodeMapper.save(userNode);
     }
 
+    public void updateUserNode(UserNodeUpdateDto userNodeUpdateDto) {
+        userNodeMapper.updateUserNode(userNodeUpdateDto);
+    }
+
     public Result delete(int id) {
         UserNode userNode = userNodeMapper.findById(id);
         if (userNode != null) {

+ 6 - 0
file/file-service/src/main/resources/mapper/UserNodeMapper.xml

@@ -17,6 +17,12 @@
         </foreach>
     </insert>
 
+    <update id="updateUserNode">
+        update file_user_node
+        set update_time=now(),`domain`=#{domain},`referer`=#{referer},`secret_key`=#{secretKey}
+        where id=#{userNodeId}
+    </update>
+
     <select id="countByStoreNodeId" resultType="java.lang.Integer">
         select *
         from file_user_node

+ 3 - 3
gateway/src/main/java/cn/reghao/tnb/gateway/token/GlobalTokenFilter.java

@@ -72,17 +72,17 @@ public class GlobalTokenFilter implements GlobalFilter, Ordered {
                 } else {
                     userLogin = getUserLoginByCookie(userData.getData());
                 }
-            } catch (JwtException jwtException) {
+            } catch (Exception exception) {
                 // token 过期, 网关返回 401,由前端自行处理
                 exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
 
                 DataBuffer buffer;
-                if (jwtException instanceof ExpiredJwtException) {
+                if (exception instanceof ExpiredJwtException) {
                     String msg = "token is expired";
                     byte[] bytes = msg.getBytes(StandardCharsets.UTF_8);
                     buffer = exchange.getResponse().bufferFactory().wrap(bytes);
                 } else {
-                    String msg = jwtException.getMessage();
+                    String msg = exception.getMessage();
                     byte[] bytes = msg.getBytes(StandardCharsets.UTF_8);
                     buffer = exchange.getResponse().bufferFactory().wrap(bytes);
                 }