Selaa lähdekoodia

update 多授权域名

ct 6 päivää sitten
vanhempi
commit
5c70bfaed5

+ 12 - 0
fs-admin/src/main/java/com/fs/course/controller/FsCoursePlaySourceConfigController.java

@@ -111,6 +111,7 @@ public class FsCoursePlaySourceConfigController extends BaseController {
         config.setCreateTime(LocalDateTime.now());
         config.setUpdateTime(LocalDateTime.now());
         fsCoursePlaySourceConfigService.save(config);
+        fsCoursePlaySourceConfigService.refreshBusinessDomainCache(config.getAppid(), config.getBusinessDomain());
         return AjaxResult.success();
     }
 
@@ -132,8 +133,13 @@ public class FsCoursePlaySourceConfigController extends BaseController {
             return AjaxResult.error("appid已存在");
         }
 
+        String oldAppId = config.getAppid();
         BeanUtils.copyProperties(param, config);
         fsCoursePlaySourceConfigService.updateById(config);
+        if (oldAppId != null && !oldAppId.equals(config.getAppid())) {
+            fsCoursePlaySourceConfigService.removeBusinessDomainCache(oldAppId);
+        }
+        fsCoursePlaySourceConfigService.refreshBusinessDomainCache(config.getAppid(), config.getBusinessDomain());
         return AjaxResult.success();
     }
 
@@ -164,10 +170,16 @@ public class FsCoursePlaySourceConfigController extends BaseController {
     @Log(title = "点播播放源配置", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable Long[] ids) {
+        Collection<FsCoursePlaySourceConfig> configs = fsCoursePlaySourceConfigService.listByIds(Arrays.asList(ids));
         Wrapper<FsCoursePlaySourceConfig> updateWrapper = Wrappers.<FsCoursePlaySourceConfig>lambdaUpdate()
                 .set(FsCoursePlaySourceConfig::getIsDel, 1)
                 .in(FsCoursePlaySourceConfig::getId, Arrays.asList(ids));
         fsCoursePlaySourceConfigService.update(updateWrapper);
+        if (configs != null) {
+            for (FsCoursePlaySourceConfig config : configs) {
+                fsCoursePlaySourceConfigService.removeBusinessDomainCache(config.getAppid());
+            }
+        }
         return AjaxResult.success();
     }
 

+ 15 - 0
fs-company/src/main/java/com/fs/company/controller/course/FsCoursePlaySourceConfigController.java

@@ -85,6 +85,7 @@ public class FsCoursePlaySourceConfigController extends BaseController {
         config.setCreateTime(LocalDateTime.now());
         config.setUpdateTime(LocalDateTime.now());
         fsCoursePlaySourceConfigService.save(config);
+        fsCoursePlaySourceConfigService.refreshBusinessDomainCache(config.getAppid(), config.getBusinessDomain());
         return AjaxResult.success();
     }
 
@@ -111,8 +112,13 @@ public class FsCoursePlaySourceConfigController extends BaseController {
             return AjaxResult.error("非法操作");
         }
 
+        String oldAppId = config.getAppid();
         BeanUtils.copyProperties(param, config);
         fsCoursePlaySourceConfigService.updateById(config);
+        if (oldAppId != null && !oldAppId.equals(config.getAppid())) {
+            fsCoursePlaySourceConfigService.removeBusinessDomainCache(oldAppId);
+        }
+        fsCoursePlaySourceConfigService.refreshBusinessDomainCache(config.getAppid(), config.getBusinessDomain());
         return AjaxResult.success();
     }
 
@@ -121,11 +127,20 @@ public class FsCoursePlaySourceConfigController extends BaseController {
     @DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable Long[] ids) {
         LoginUser loginUser = SecurityUtils.getLoginUser();
+        List<FsCoursePlaySourceConfig> configs = fsCoursePlaySourceConfigService.list(
+                Wrappers.<FsCoursePlaySourceConfig>lambdaQuery()
+                        .eq(FsCoursePlaySourceConfig::getCompanyId, loginUser.getCompany().getCompanyId())
+                        .in(FsCoursePlaySourceConfig::getId, Arrays.asList(ids)));
         Wrapper<FsCoursePlaySourceConfig> updateWrapper = Wrappers.<FsCoursePlaySourceConfig>lambdaUpdate()
                 .set(FsCoursePlaySourceConfig::getIsDel, 1)
                 .eq(FsCoursePlaySourceConfig::getCompanyId, loginUser.getCompany().getCompanyId())
                 .in(FsCoursePlaySourceConfig::getId, Arrays.asList(ids));
         fsCoursePlaySourceConfigService.update(updateWrapper);
+        if (configs != null) {
+            for (FsCoursePlaySourceConfig config : configs) {
+                fsCoursePlaySourceConfigService.removeBusinessDomainCache(config.getAppid());
+            }
+        }
         return AjaxResult.success();
     }
 

+ 7 - 0
fs-service/src/main/java/com/fs/course/constant/CourseConstant.java

@@ -5,6 +5,9 @@ public class CourseConstant {
     public static final String FEI_SHU_WATCH_HEART = "h5feishu:watch:heartbeat:";
     public static final String FEI_SHU_WATCH_DURATION = "h5feishu:watch:duration:";
 
+    /** 小程序业务域名缓存 key 前缀:course:playSource:businessDomain:{appId} */
+    public static final String PLAY_SOURCE_BUSINESS_DOMAIN = "course:playSource:businessDomain:";
+
     public static String getFeiShuWatchHeartKey(Long userId, Long videoId, Long companyUserId, Long periodId) {
         return String.format(FEI_SHU_WATCH_HEART + "%s:%s:%s:%s", userId, videoId, companyUserId, periodId);
     }
@@ -12,4 +15,8 @@ public class CourseConstant {
     public static String getFeiShuWatchDurationKey(Long userId, Long videoId, Long companyUserId, Long periodId) {
         return String.format(FEI_SHU_WATCH_DURATION + "%s:%s:%s:%s", userId, videoId, companyUserId, periodId);
     }
+
+    public static String getPlaySourceBusinessDomainKey(String appId) {
+        return PLAY_SOURCE_BUSINESS_DOMAIN + appId;
+    }
 }

+ 5 - 0
fs-service/src/main/java/com/fs/course/domain/FsCoursePlaySourceConfig.java

@@ -109,4 +109,9 @@ public class FsCoursePlaySourceConfig {
      * 商户支付配置id
      */
     private Long merchantConfigId;
+
+    /**
+     * 业务域名
+     */
+    private String businessDomain;
 }

+ 3 - 0
fs-service/src/main/java/com/fs/course/param/FsCoursePlaySourceConfigCreateParam.java

@@ -57,4 +57,7 @@ public class FsCoursePlaySourceConfigCreateParam {
 
     @ApiModelProperty("小程序状态:0正常,1半封禁,2封禁")
     private Integer status;
+
+    @ApiModelProperty("业务域名")
+    private String businessDomain;
 }

+ 3 - 0
fs-service/src/main/java/com/fs/course/param/FsCoursePlaySourceConfigEditParam.java

@@ -58,4 +58,7 @@ public class FsCoursePlaySourceConfigEditParam {
 
     @ApiModelProperty("商户支付配置id")
     private Long merchantConfigId;
+
+    @ApiModelProperty("业务域名")
+    private String businessDomain;
 }

+ 15 - 0
fs-service/src/main/java/com/fs/course/service/IFsCoursePlaySourceConfigService.java

@@ -22,4 +22,19 @@ public interface IFsCoursePlaySourceConfigService extends IService<FsCoursePlayS
      * @return
      */
     FsCoursePlaySourceConfig selectCoursePlaySourceConfigByAppId(String appId);
+
+    /**
+     * 刷新小程序业务域名 Redis 缓存(存 appId + businessDomain)
+     */
+    void refreshBusinessDomainCache(String appId, String businessDomain);
+
+    /**
+     * 删除小程序业务域名 Redis 缓存
+     */
+    void removeBusinessDomainCache(String appId);
+
+    /**
+     * 优先读 Redis,未命中再查库并回填;返回 {appId, businessDomain},未找到返回 null
+     */
+    Map<String, String> getBusinessDomainInfo(String appId);
 }

+ 60 - 1
fs-service/src/main/java/com/fs/course/service/impl/FsCoursePlaySourceConfigServiceImpl.java

@@ -2,14 +2,18 @@ package com.fs.course.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.StringUtils;
+import com.fs.course.constant.CourseConstant;
 import com.fs.course.domain.FsCoursePlaySourceConfig;
 import com.fs.course.mapper.FsCoursePlaySourceConfigMapper;
 import com.fs.course.service.IFsCoursePlaySourceConfigService;
 import com.fs.course.vo.FsCoursePlaySourceConfigVO;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -18,6 +22,9 @@ import java.util.Map;
 public class FsCoursePlaySourceConfigServiceImpl extends ServiceImpl<FsCoursePlaySourceConfigMapper, FsCoursePlaySourceConfig>
         implements IFsCoursePlaySourceConfigService {
 
+    @Autowired
+    private RedisCache redisCache;
+
     /**
      * 查询点播配置列表
      */
@@ -35,4 +42,56 @@ public class FsCoursePlaySourceConfigServiceImpl extends ServiceImpl<FsCoursePla
     public FsCoursePlaySourceConfig selectCoursePlaySourceConfigByAppId(String appId) {
         return baseMapper.selectCoursePlaySourceConfigByAppId(appId);
     }
+
+    @Override
+    public void refreshBusinessDomainCache(String appId, String businessDomain) {
+        if (StringUtils.isBlank(appId)) {
+            return;
+        }
+        Map<String, String> cache = new HashMap<>(2);
+        cache.put("appId", appId);
+        cache.put("businessDomain", businessDomain == null ? "" : businessDomain);
+        redisCache.setCacheObject(CourseConstant.getPlaySourceBusinessDomainKey(appId), cache);
+        log.info("刷新小程序业务域名缓存: appId={}, businessDomain={}", appId, businessDomain);
+    }
+
+    @Override
+    public void removeBusinessDomainCache(String appId) {
+        if (StringUtils.isBlank(appId)) {
+            return;
+        }
+        redisCache.deleteObject(CourseConstant.getPlaySourceBusinessDomainKey(appId));
+        log.info("删除小程序业务域名缓存: appId={}", appId);
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public Map<String, String> getBusinessDomainInfo(String appId) {
+        if (StringUtils.isBlank(appId)) {
+            return null;
+        }
+        String key = CourseConstant.getPlaySourceBusinessDomainKey(appId);
+        Object cachedObj = redisCache.getCacheObject(key);
+        if (cachedObj instanceof Map) {
+            Map<?, ?> cached = (Map<?, ?>) cachedObj;
+            Object cachedAppId = cached.get("appId");
+            if (cachedAppId != null) {
+                Map<String, String> result = new HashMap<>(2);
+                result.put("appId", String.valueOf(cachedAppId));
+                Object domain = cached.get("businessDomain");
+                result.put("businessDomain", domain == null ? "" : String.valueOf(domain));
+                return result;
+            }
+        }
+
+        FsCoursePlaySourceConfig config = baseMapper.selectCoursePlaySourceConfigByAppId(appId);
+        if (config == null) {
+            return null;
+        }
+        refreshBusinessDomainCache(config.getAppid(), config.getBusinessDomain());
+        Map<String, String> result = new HashMap<>(2);
+        result.put("appId", config.getAppid());
+        result.put("businessDomain", config.getBusinessDomain() == null ? "" : config.getBusinessDomain());
+        return result;
+    }
 }

+ 3 - 0
fs-service/src/main/java/com/fs/course/vo/FsCoursePlaySourceConfigVO.java

@@ -67,4 +67,7 @@ public class FsCoursePlaySourceConfigVO {
 
     @ApiModelProperty("小程序支付配置id")
     private Long merchantConfigId;
+
+    @ApiModelProperty("业务域名")
+    private String businessDomain;
 }

+ 36 - 0
fs-user-app/src/main/java/com/fs/app/controller/CommonController.java

@@ -34,6 +34,7 @@ import com.fs.company.service.ICompanyMoneyLogsService;
 import com.fs.core.utils.OrderCodeUtils;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsProjectAddressConfig;
+import com.fs.course.service.IFsCoursePlaySourceConfigService;
 import com.fs.course.service.IFsProjectAddressConfigService;
 import com.fs.course.service.IHuaweiVodService;
 import com.fs.event.TemplateBean;
@@ -144,6 +145,9 @@ public class CommonController {
 	@Autowired
 	private IFsProjectAddressConfigService projectAddressConfigService;
 
+	@Autowired
+	private IFsCoursePlaySourceConfigService fsCoursePlaySourceConfigService;
+
 //	@Autowired
 //	private RocketMQTemplate rocketMQTemplate;
 //
@@ -746,4 +750,36 @@ public class CommonController {
 		AppConfig config = JSONUtil.toBean(json, AppConfig.class);
 		return R.ok().put("isOpenWithdraw",config.getIsOpenWithdraw()==null?0:config.getIsOpenWithdraw());
 	}
+
+
+
+	/**
+	 * 根据小程序 appId 获取业务域名(优先 Redis)
+	 */
+	@ApiOperation("根据appId获取业务域名")
+	@GetMapping("/businessDomain")
+	public R getBusinessDomain(@RequestParam("appId") String appId) {
+		if (com.fs.common.utils.StringUtils.isBlank(appId)) {
+			return R.error("appId不能为空");
+		}
+		Map<String, String> info = fsCoursePlaySourceConfigService.getBusinessDomainInfo(appId);
+		if (info == null) {
+			return R.error("未找到对应小程序配置");
+		}
+		String businessDomain = info.get("businessDomain");
+		if (StringUtils.isBlank(businessDomain)) {
+			// 未单独配置时,回退到系统默认授权域名
+			String json = configService.selectConfigByKey("course.config");
+			CourseConfig courseConfig = JSONUtil.toBean(json, CourseConfig.class);
+			if (courseConfig != null && StringUtils.isNotBlank(courseConfig.getUserCourseAuthDomain())) {
+				businessDomain = courseConfig.getUserCourseAuthDomain();
+			}
+		}
+		if (StringUtils.isBlank(businessDomain)){
+			return R.error("未找到对应小程序配置业务域名");
+		}
+		return R.ok()
+				.put("appId", info.get("appId"))
+				.put("businessDomain", businessDomain);
+	}
 }