Browse Source

feat:生成短链接口、微信验证解析url接口

caoliqin 3 months ago
parent
commit
20f0b5a282

+ 18 - 0
fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java

@@ -3,6 +3,8 @@ package com.fs.app.controller;
 import com.fs.app.annotation.Login;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
+import com.fs.course.param.FsCourseLinkCreateParam;
+import com.fs.course.param.newfs.FsCourseSortLinkParam;
 import com.fs.course.param.newfs.FsUserCourseListParam;
 import com.fs.course.param.newfs.UserCourseVideoPageParam;
 import com.fs.course.service.IFsUserCourseService;
@@ -17,6 +19,7 @@ import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -91,4 +94,19 @@ public class FsUserCourseVideoController extends AppBaseController {
         List<FsUserCourseParticipationRecordVO> record = fsUserCourseService.getParticipationRecordByMap(params);
         return ResponseResult.ok(new PageInfo<>(record));
     }
+
+    @Login
+    @GetMapping("/courseSortLink")
+    @ApiOperation("生成课程分享短链")
+    public R createCourseSortLink(FsCourseSortLinkParam param) {
+        FsCourseLinkCreateParam fsCourseLinkCreateParam = new FsCourseLinkCreateParam();
+        // todo 入参需要确认调整
+        BeanUtils.copyProperties(param, fsCourseLinkCreateParam);
+
+        R courseSortLink = fsUserCourseService.createCourseSortLink(fsCourseLinkCreateParam);
+        String url = courseSortLink.get("url").toString();
+        Map<String, Object> map = new HashMap<>();
+        map.put("url", url);
+        return R.ok(map);
+    }
 }

+ 41 - 0
fs-company-app/src/main/java/com/fs/app/controller/WxMpController.java

@@ -0,0 +1,41 @@
+package com.fs.app.controller;
+
+import com.fs.common.core.domain.R;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.Synchronized;
+import me.chanjar.weixin.common.bean.WxJsapiSignature;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.api.WxMpService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+
+
+@RestController
+@Api("微信配置")
+@RequestMapping("/app/wx/mp")
+public class WxMpController {
+
+    @Autowired
+    private WxMpService wxMpService;
+
+
+    @GetMapping("/getWeiXinConfig")
+    @ApiOperation("微信url验证")
+    @Synchronized
+    public R getWxConfig(@RequestParam String url) throws WxErrorException {
+        try {
+            String sLink = URLDecoder.decode(url, "UTF-8");
+            final WxJsapiSignature jsapiSignature = wxMpService.createJsapiSignature(sLink);
+            return R.ok().put("data", jsapiSignature);
+        } catch (UnsupportedEncodingException e) {
+            // URL解码异常
+            return R.error(e.getMessage());
+        }
+    }
+
+
+}

+ 39 - 0
fs-service-system/src/main/java/com/fs/course/param/newfs/FsCourseSortLinkParam.java

@@ -0,0 +1,39 @@
+package com.fs.course.param.newfs;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(description = "生成课程短链入参")
+public class FsCourseSortLinkParam {
+
+    @ApiModelProperty(value = "视频id")
+    private Long videoId;
+
+    private String qwUserId;
+
+    private String corpId;
+
+    @ApiModelProperty(value = "公司id")
+    private Long companyId;
+
+    @ApiModelProperty(value = "销售id")
+    private Long companyUserId;
+
+    @ApiModelProperty(value = "课程id")
+    private Long courseId;
+
+    @ApiModelProperty(value = "标题")
+    private String title;
+
+    @ApiModelProperty(value = "封面")
+    private String imageUrl;
+
+    @ApiModelProperty(value = "描述")
+    private String desc;
+
+//    @ApiModelProperty(value = "跳转的链接地址,格式举例:/course/pages/xxx?course=")
+//    private String realLink;
+
+}

+ 8 - 4
fs-service-system/src/main/java/com/fs/course/service/IFsUserCourseService.java

@@ -5,10 +5,7 @@ import java.util.Map;
 
 import com.fs.common.core.domain.R;
 import com.fs.course.domain.FsUserCourse;
-import com.fs.course.param.FsUserCourseAddStudyCourseParam;
-import com.fs.course.param.FsUserCourseGetIntegralParam;
-import com.fs.course.param.FsUserCourseListUParam;
-import com.fs.course.param.FsUserCourseParam;
+import com.fs.course.param.*;
 import com.fs.course.param.newfs.FsUserCourseListParam;
 import com.fs.course.vo.*;
 import com.fs.course.vo.newfs.FsUserCourseListVO;
@@ -118,4 +115,11 @@ public interface IFsUserCourseService
      * @return  list
      */
     List<FsUserCourseParticipationRecordVO> getParticipationRecordByMap(Map<String, Object> params);
+
+    /**
+     * 创建生成课程短链
+     * @param param 入参
+     * @return
+     */
+    R createCourseSortLink(FsCourseLinkCreateParam param);
 }

+ 79 - 9
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java

@@ -1,6 +1,7 @@
 package com.fs.course.service.impl;
 
 import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
@@ -10,24 +11,21 @@ import com.fs.company.domain.CompanyTag;
 import com.fs.company.domain.CompanyTagUser;
 import com.fs.company.mapper.CompanyTagMapper;
 import com.fs.company.mapper.CompanyTagUserMapper;
-import com.fs.course.domain.FsUserCourse;
-import com.fs.course.domain.FsUserCourseStudy;
-import com.fs.course.domain.FsUserCourseStudyLog;
-import com.fs.course.domain.FsUserCourseVideo;
+import com.fs.company.mapper.CompanyUserMapper;
+import com.fs.course.config.CourseConfig;
+import com.fs.course.domain.*;
 import com.fs.course.mapper.*;
-import com.fs.course.param.FsUserCourseAddStudyCourseParam;
-import com.fs.course.param.FsUserCourseGetIntegralParam;
-import com.fs.course.param.FsUserCourseListUParam;
-import com.fs.course.param.FsUserCourseParam;
+import com.fs.course.param.*;
 import com.fs.course.param.newfs.FsUserCourseListParam;
 import com.fs.course.service.IFsUserCourseService;
 import com.fs.course.vo.*;
 import com.fs.course.vo.newfs.FsUserCourseListVO;
 import com.fs.his.vo.OptionsVO;
+import com.fs.system.service.ISysConfigService;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-
 import java.util.*;
 
 /**
@@ -53,6 +51,15 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
     private FsUserCourseStudyLogMapper fsUserCourseStudyLogMapper;
     @Autowired
     private CompanyTagMapper companyTagMapper;
+    @Autowired
+    private ISysConfigService configService;
+    @Autowired
+    private FsCourseLinkMapper fsCourseLinkMapper;
+    @Autowired
+    private CompanyUserMapper companyUserMapper;
+
+    // todo 链接url需要调整
+    private static final String realLink = "/courseh5/pages/course/learning?course=";
 
     /**
      * 查询课程
@@ -390,4 +397,67 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
         });
         return list;
     }
+
+    @Override
+    public R createCourseSortLink(FsCourseLinkCreateParam param) {
+        String json = configService.selectConfigByKey("course.config");
+        CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
+
+        //新增链接表信息
+        FsCourseLink link = new FsCourseLink();
+        BeanUtils.copyProperties(param, link);
+        link.setLinkType(0);
+        link.setIsRoom(0);
+
+        FsCourseRealLink courseMap = new FsCourseRealLink();
+        BeanUtils.copyProperties(link, courseMap);
+        String courseJson = JSON.toJSONString(courseMap);
+
+        link.setRealLink(realLink + courseJson);
+        link.setLink(generateRandomString());
+        link.setCreateTime(new Date());
+
+        //获取过期时间
+        Calendar calendar = getExpireDay(param, config, link.getCreateTime());
+        link.setUpdateTime(calendar.getTime());
+        int i = fsCourseLinkMapper.insertFsCourseLink(link);
+        if (i > 0){
+            String domainName = getDomainName(param.getCompanyUserId(), config);
+            String sortLink = domainName + "/s/" + link.getLink();
+            return R.ok().put("url", sortLink);
+        }
+        return R.error("生成链接失败!");
+    }
+
+    private static Calendar getExpireDay(FsCourseLinkCreateParam param, CourseConfig config, Date createTime) {
+        Integer expireDays;
+        if (param.getDays() == null || param.getDays() == 0){
+            expireDays = config.getVideoLinkExpireDate();
+        }else {
+            expireDays = param.getDays();
+        }
+        // 设置过期时间
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(createTime);
+        calendar.add(Calendar.DAY_OF_MONTH, expireDays);
+        return calendar;
+    }
+
+
+    //
+
+    /**
+     * 生成随机的八位数字字母大小写的字符串(改为生成随机不重复的雪花id)
+     */
+    public static String generateRandomString() {
+        return FsCourseLinkServiceImpl.generateRandomString();
+    }
+
+    private String getDomainName(Long companyUserId, CourseConfig config){
+        String domainName = companyUserMapper.selectDomainByUserId(companyUserId);
+        if (StringUtils.isEmpty(domainName)){
+            domainName = config.getRealLinkDomainName();
+        }
+        return domainName;
+    }
 }