Jelajahi Sumber

feat:生成课程分享海报、会员绑定销售、生成会员分享短链(未完成)

caoliqin 1 bulan lalu
induk
melakukan
a0bea2c848

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

@@ -3,10 +3,12 @@ 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.common.utils.StringUtils;
 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.IFsCourseLinkService;
 import com.fs.course.service.IFsUserCourseService;
 import com.fs.course.service.IFsUserCourseVideoService;
 import com.fs.course.vo.FsUserCourseParticipationRecordVO;
@@ -23,6 +25,7 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.io.File;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -40,6 +43,9 @@ public class FsUserCourseVideoController extends AppBaseController {
     @Autowired
     private IFsUserCourseService fsUserCourseService;
 
+    @Autowired
+    private IFsCourseLinkService courseLinkService;
+
     @Login
     @GetMapping("/pageList")
     @ApiOperation("课程分页列表")
@@ -112,4 +118,48 @@ public class FsUserCourseVideoController extends AppBaseController {
         map.put("url", url);
         return R.ok(map);
     }
+
+    @Login
+    @PostMapping("/courseImage")
+    @ApiOperation("生成课程海报")
+    public R createCourseImage(@RequestBody FsCourseSortLinkParam param) {
+        // 获取生成链接
+        FsCourseLinkCreateParam fsCourseLinkCreateParam = new FsCourseLinkCreateParam();
+        BeanUtils.copyProperties(param, fsCourseLinkCreateParam);
+
+        R courseSortLink = fsUserCourseService.createCourseSortLink(fsCourseLinkCreateParam);
+        String link = courseSortLink.get("link").toString();
+        R r = courseLinkService.getRealLink(link);
+        String realLink = r.get("realLink").toString();
+        try {
+            File file = new File("D:\\logo.jpg");
+            if(StringUtils.isEmpty(param.getImgUrl())){
+                return R.error(400,"课程封面不能为空!");
+            }
+            String base64Image = fsUserCourseService.createCourseImageQR(realLink, param.getImgUrl(), file, "png", param.getTitle(), param.getDuration());
+            // 返回Base64编码的图片字符串
+            Map<String, Object> map = new HashMap<>();
+            map.put("url", base64Image);
+            return R.ok().put("posterImage", map);
+        } catch (Exception e) {
+            log.error("生成海报失败,param:{}", param);
+            return R.error("生成海报失败!");
+        }
+    }
+
+
+
+//    @Login
+//    @PostMapping("/sortLink/courseMember")
+//    @ApiOperation("生成分享成为会员短链")
+//    public R createCourseMemberSortLink(@RequestBody FsUserCourseBeMemberParam param) {
+//        FsCourseLinkCreateParam fsCourseLinkCreateParam = new FsCourseLinkCreateParam();
+//        BeanUtils.copyProperties(param, fsCourseLinkCreateParam);
+//
+//        R courseSortLink = fsUserCourseService.createCourseMemberSortLink(fsCourseLinkCreateParam);
+//        String url = courseSortLink.get("url").toString();
+//        Map<String, Object> map = new HashMap<>();
+//        map.put("url", url);
+//        return R.ok(map);
+//    }
 }

+ 10 - 1
fs-service-system/src/main/java/com/fs/course/param/newfs/FsCourseSortLinkParam.java

@@ -5,7 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 @Data
-@ApiModel(description = "生成课程短链入参")
+@ApiModel(description = "生成课程短链/海报入参")
 public class FsCourseSortLinkParam {
 
     @ApiModelProperty(value = "视频id")
@@ -23,4 +23,13 @@ public class FsCourseSortLinkParam {
     @ApiModelProperty(value = "链接有效时长")
     private Integer effectiveDuration;
 
+    @ApiModelProperty(value = "课程封面,生成海报时必传")
+    private String imgUrl;
+
+    @ApiModelProperty(value = "标题,生成海报时必传")
+    private String title;
+
+    @ApiModelProperty(value = "视频时长,生成海报时必传")
+    private String duration;
+
 }

+ 27 - 0
fs-service-system/src/main/java/com/fs/course/param/newfs/FsUserCourseBeMemberParam.java

@@ -0,0 +1,27 @@
+package com.fs.course.param.newfs;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+@Data
+public class FsUserCourseBeMemberParam implements Serializable {
+
+    @NotNull(message = "用户id不能为空")
+    @ApiModelProperty(value = "授权的用户id")
+    private Long userId;
+
+    @NotNull(message = "销售id不能为空")
+    @ApiModelProperty(value = "销售id")
+    private Long companyUserId;
+
+    @ApiModelProperty(value = "公司id")
+    private Long companyId;
+
+    @ApiModelProperty(value = "标签ids,多个用逗号隔开")
+    private String[] tagIds;
+
+
+}

+ 21 - 0
fs-service-system/src/main/java/com/fs/course/service/IFsUserCourseService.java

@@ -1,5 +1,6 @@
 package com.fs.course.service;
 
+import java.io.File;
 import java.util.List;
 import java.util.Map;
 
@@ -122,4 +123,24 @@ public interface IFsUserCourseService
      * @return
      */
     R createCourseSortLink(FsCourseLinkCreateParam param);
+
+    /**
+     * 生成海报
+     * @param url
+     * @param backgroundImagePath
+     * @param file
+     * @param outputFormat
+     * @param title
+     * @param duration
+     * @return
+     * @throws Exception
+     */
+    String createCourseImageQR(String url, String backgroundImagePath, File file, String outputFormat, String title, String duration) throws Exception;
+
+    /**
+     * 创建 分享成为会员 短链
+     * @param param 入参
+     * @return
+     */
+    R createCourseMemberSortLink(FsCourseLinkCreateParam param);
 }

+ 236 - 0
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java

@@ -2,6 +2,7 @@ package com.fs.course.service.impl;
 
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
@@ -22,11 +23,28 @@ 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 com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.client.j2se.MatrixToImageWriter;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.QRCodeWriter;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.net.URL;
 import java.util.*;
+import java.util.List;
 
 /**
  * 课程Service业务层处理
@@ -60,6 +78,7 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
 
     private static final String realLink = "/courseH5/pages/course/learning?course=";
     private static final String shortLink = "/courseH5/pages/course/learning?s=";
+    private static final String userRealLink = "/pages/user/users/becomeVIP?";
 
     /**
      * 查询课程
@@ -414,10 +433,227 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
         String courseJson = JSON.toJSONString(courseMap);
 
         link.setRealLink(realLink + courseJson);
+        String random = generateRandomString();
+        link.setLink(random);
+        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 + shortLink + link.getLink();
+            return R.ok().put("url", sortLink).put("link", random);
+        }
+        return R.error("生成链接失败!");
+    }
+
+
+    @Override
+    public String createCourseImageQR(String url, String backgroundImagePath, File file,
+                                      String outputFormat, String title, String duration) throws Exception {
+        // 读取并缩放背景图片
+        BufferedImage backgroundImage = createScaledBackgroundImage(backgroundImagePath);
+        int scaledWidth = backgroundImage.getWidth();
+        int scaledHeight = backgroundImage.getHeight();
+
+        // 创建最终的合成图片,确保底部区域有足够空间
+        int bottomHeight = 200; // 增加底部区域高度,确保内容完全显示
+        int totalHeight = scaledHeight + bottomHeight;
+        BufferedImage combined = new BufferedImage(scaledWidth, totalHeight, BufferedImage.TYPE_INT_ARGB);
+        Graphics2D graphics = initializeGraphics(combined);
+
+        // 绘制背景和底部白色区域
+        graphics.drawImage(backgroundImage, 0, 0, null);
+        graphics.setColor(Color.WHITE);
+        graphics.fillRect(0, scaledHeight, scaledWidth, bottomHeight);
+
+        // 绘制推荐区域(图片和文字)
+        drawRecommendationArea(graphics, file, scaledHeight);
+
+        // 绘制二维码
+        drawQRCode(graphics, url, scaledWidth, totalHeight);
+
+        // 绘制标题和时长
+        drawTitleAndDuration(graphics, title, duration, scaledHeight);
+
+        graphics.dispose();
+
+        // 转换为Base64
+        return convertToBase64(combined, outputFormat);
+    }
+
+    /**
+     * 读取并缩放背景图片
+     */
+    private BufferedImage createScaledBackgroundImage(String backgroundImagePath) throws IOException {
+        // 设置固定的目标尺寸
+        final int TARGET_WIDTH = 600;
+        final int TARGET_HEIGHT = 300; // 固定背景图片高度为300像素
+
+        URL imagePath = new URL(backgroundImagePath);
+        BufferedImage originalBackground = ImageIO.read(imagePath);
+
+        // 计算缩放比例,以高度为基准
+        double scale = (double) TARGET_HEIGHT / originalBackground.getHeight();
+        int scaledWidth = (int) (originalBackground.getWidth() * scale);
+
+        // 创建固定大小的背景图片
+        BufferedImage backgroundImage = new BufferedImage(TARGET_WIDTH, TARGET_HEIGHT, BufferedImage.TYPE_INT_ARGB);
+        Graphics2D g2d = backgroundImage.createGraphics();
+        g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
+
+        // 计算居中位置
+        int x = (TARGET_WIDTH - scaledWidth) / 2;
+
+        // 绘制缩放后的图片
+        g2d.drawImage(originalBackground, x, 0, scaledWidth, TARGET_HEIGHT, null);
+        g2d.dispose();
+
+        return backgroundImage;
+    }
+
+    /**
+     * 初始化图形上下文
+     */
+    private Graphics2D initializeGraphics(BufferedImage combined) {
+        Graphics2D graphics = combined.createGraphics();
+        graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+        graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+        graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
+        graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
+        return graphics;
+    }
+
+    /**
+     * 绘制推荐区域
+     */
+    private void drawRecommendationArea(Graphics2D graphics, File file, int scaledHeight) throws IOException {
+        // 读取并绘制推荐图片
+        BufferedImage referenceImg = ImageIO.read(file);
+        int refHeight = 40;
+        int refWidth = 40;
+        int refY = scaledHeight + 20;
+        int refX = 30;
+        graphics.drawImage(referenceImg, refX, refY, refWidth, refHeight, null);
+
+        // 设置并绘制推荐文字
+        Font recommendFont = new Font("微软雅黑", Font.BOLD, 16);
+        graphics.setFont(recommendFont);
+
+        // 绘制"云联融智"
+        int textX = refX + refWidth + 10;
+        int textY = refY + 25;
+        graphics.setColor(new Color(51, 51, 51));
+        graphics.drawString("云联融智", textX, textY);
+
+        // 绘制"为您推荐"
+        FontMetrics metrics = graphics.getFontMetrics(recommendFont);
+        int brandWidth = metrics.stringWidth("云联融智");
+        int textX1 = textX + brandWidth + 5;
+        graphics.setColor(new Color(102, 102, 102));
+        graphics.drawString("为您推荐", textX1, textY);
+//        FontMetrics metrics = graphics.getFontMetrics(recommendFont);
+        int reWidth = metrics.stringWidth("为您推荐");
+    }
+
+
+    /**
+     * 生成二维码图片
+     */
+    private static BufferedImage generateQrCodeImage(String text, int width, int height) throws Exception {
+        QRCodeWriter qrCodeWriter = new QRCodeWriter();
+        Map<EncodeHintType, Object> hints = new HashMap<>();
+        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
+        hints.put(EncodeHintType.MARGIN, 1);
+        BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height, hints);
+        return MatrixToImageWriter.toBufferedImage(bitMatrix);
+    }
+
+    /**
+     * 绘制二维码
+     */
+    private void drawQRCode(Graphics2D graphics, String url, int scaledWidth, int totalHeight) throws Exception {
+        BufferedImage qrCodeImage = generateQrCodeImage(url, 200, 200);
+        int qrSize = 100;
+        int qrMarginRight = 25;
+        int qrMarginBottom = 30;
+        int qrX = scaledWidth - qrSize - qrMarginRight;
+        int qrY = totalHeight - qrSize - qrMarginBottom;
+        graphics.drawImage(qrCodeImage, qrX, qrY, qrSize, qrSize, null);
+    }
+
+    /**
+     * 绘制标题和时长
+     */
+    private void drawTitleAndDuration(Graphics2D graphics, String title, String duration, int scaledHeight) {
+        Font titleFont = new Font("微软雅黑", Font.BOLD, 18);
+        Font descFont = new Font("微软雅黑", Font.PLAIN, 14);
+
+        int contentX = 30;
+        int titleY = scaledHeight + 85;
+        int descY = titleY + 25;
+
+        graphics.setFont(titleFont);
+        graphics.setColor(new Color(51, 51, 51));
+        graphics.drawString(title, contentX, titleY);
+
+        graphics.setFont(descFont);
+        graphics.setColor(new Color(102, 102, 102));
+        if(StringUtils.isNotBlank(duration)){
+            // 将秒转化为分钟
+            BigDecimal bigDecimal = new BigDecimal(duration);
+            bigDecimal = bigDecimal.divide(new BigDecimal(60), 2, RoundingMode.HALF_UP);
+            String minutes = bigDecimal.toString();
+            graphics.drawString("播放时长:" + minutes + "分钟", contentX, descY);
+        } else {
+            graphics.drawString("播放时长:" + "暂无", contentX, descY);
+        }
+
+    }
+
+    /**
+     * 将图片转换为Base64字符串
+     */
+    private String convertToBase64(BufferedImage image, String outputFormat) throws IOException {
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        ImageIO.write(image, outputFormat, outputStream);
+        byte[] imageBytes = outputStream.toByteArray();
+        String s = Base64.getEncoder().encodeToString(imageBytes);
+        StringBuilder result = new StringBuilder();
+        if(StringUtils.isNotEmpty(s)){
+            result.append("data:image/png;base64,").append(s);
+        }
+        return result.toString();
+    }
+
+    @Override
+    public R createCourseMemberSortLink(FsCourseLinkCreateParam param) {
+        // todo 需要调整路径
+        String json = configService.selectConfigByKey("company.user");
+        JSONObject object = JSON.parseObject(json);
+        String realLinkDomainName = object.get("realLinkDomainName").toString();
+        Integer linkExpireTime = Integer.parseInt(object.get("linkExpireTime").toString());
+
+        //新增链接表信息
+        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(userRealLink + courseJson);
         link.setLink(generateRandomString());
         link.setCreateTime(new Date());
 
         //获取过期时间
+        CourseConfig config = new CourseConfig();
+        config.setRealLinkDomainName(realLinkDomainName);
+        config.setVideoLinkExpireDate(linkExpireTime);
         Calendar calendar = getExpireDay(param, config, link.getCreateTime());
         link.setUpdateTime(calendar.getTime());
         int i = fsCourseLinkMapper.insertFsCourseLink(link);

+ 9 - 0
fs-service-system/src/main/java/com/fs/store/service/IFsUserService.java

@@ -4,8 +4,10 @@ import java.util.List;
 import java.util.Map;
 
 import com.fs.common.core.domain.R;
+import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.company.vo.CompanyQueryVo;
+import com.fs.course.param.newfs.FsUserCourseBeMemberParam;
 import com.fs.course.vo.newfs.FsCourseAnalysisVO;
 import com.fs.qw.param.QwFsUserParam;
 import com.fs.qw.vo.QwFsUserVO;
@@ -226,4 +228,11 @@ public interface IFsUserService
      */
     CompanyUserSummaryCountVO companyUserSummaryCount(Long userId, String companyUserId);
 
+    /**
+     * 成为销售的会员
+     * @param param
+     * @return 是否成功
+     */
+    ResponseResult<Boolean> becomeMember(FsUserCourseBeMemberParam param);
+
 }

+ 56 - 0
fs-service-system/src/main/java/com/fs/store/service/impl/FsUserServiceImpl.java

@@ -12,13 +12,18 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.utils.DateUtils;
 import com.fs.company.cache.ICompanyUserCacheService;
+import com.fs.company.domain.CompanyTagUser;
 import com.fs.company.domain.CompanyUser;
+import com.fs.company.mapper.CompanyTagUserMapper;
+import com.fs.company.mapper.CompanyUserMapper;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.company.vo.CompanyQueryVo;
 import com.fs.course.mapper.FsUserCourseVideoMapper;
+import com.fs.course.param.newfs.FsUserCourseBeMemberParam;
 import com.fs.course.param.newfs.UserCourseVideoPageParam;
 import com.fs.course.vo.newfs.FsCourseAnalysisCountVO;
 import com.fs.course.vo.newfs.FsCourseAnalysisVO;
@@ -41,6 +46,7 @@ import com.fs.store.service.IFsUserBillService;
 import com.fs.store.vo.FSUserVO;
 import com.fs.store.vo.FsCompanyUserListQueryVO;
 import com.fs.store.vo.FsUserTuiVO;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.http.util.Asserts;
 import com.fs.store.vo.h5.FsUserPageListVO;
@@ -67,6 +73,7 @@ import static com.fs.store.enums.BillDetailEnum.CATEGORY_3;
  * @date 2022-03-15
  */
 @Service
+@Slf4j
 public class FsUserServiceImpl implements IFsUserService
 {
     @Autowired
@@ -87,6 +94,12 @@ public class FsUserServiceImpl implements IFsUserService
     @Autowired
     private FsUserCourseVideoMapper userCourseVideoMapper;
 
+    @Autowired
+    private CompanyUserMapper companyUserMapper;
+
+    @Autowired
+    private CompanyTagUserMapper  companyTagUserMapper;
+
     /**
      * 查询用户
      *
@@ -648,4 +661,47 @@ public class FsUserServiceImpl implements IFsUserService
         vo.setTodayUserRedPacketAmount(newUserRedPacketCount.getTodayUserRedPacketAmount());
         return vo;
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public ResponseResult<Boolean> becomeMember(FsUserCourseBeMemberParam param) {
+        //查询用户
+        FsUser fsUser = fsUserMapper.selectFsUserById(param.getUserId());
+        if (Objects.isNull(fsUser)){
+            return ResponseResult.fail(401,"未授权");
+        }
+        if (fsUser.getCompanyUserId() != null){
+            return ResponseResult.fail(500,"该用户已成为其他销售会员");
+        }
+
+        //判断该销售是否存在
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getCompanyUserId());
+        if (Objects.isNull(companyUser)){
+            return ResponseResult.fail(500,"销售不存在");
+        }
+
+        // 关联销售
+        fsUser.setCompanyId(param.getCompanyId());
+        fsUser.setCompanyUserId(param.getCompanyUserId());
+        fsUserMapper.updateFsUser(fsUser);
+
+        //关联会员标签,先删除再新增
+        Map<String, Object> map = new HashMap<>();
+        map.put("userId", param.getUserId());
+        map.put("companyId", fsUser.getCompanyId());
+        map.put("companyUserId", fsUser.getCompanyUserId());
+        companyTagUserMapper.deleteCompanyTagUserByMap(map);
+
+        // 不为空则添加新标签
+        if (Objects.nonNull(param.getTagIds()) && param.getTagIds().length > 0) {
+            CompanyTagUser companyTagUser = new CompanyTagUser();
+            companyTagUser.setUserId(param.getUserId());
+            companyTagUser.setCompanyId(fsUser.getCompanyId());
+            companyTagUser.setCompanyUserId(fsUser.getCompanyUserId());
+            companyTagUser.setTagIds(String.join(",", param.getTagIds()));
+            companyTagUser.setCreateTime(new Date());
+            companyTagUserMapper.insertCompanyTagUser(companyTagUser);
+        }
+        return ResponseResult.ok(Boolean.TRUE);
+    }
 }

+ 13 - 0
fs-user-app/src/main/java/com/fs/app/controller/CourseWxH5Controller.java

@@ -12,12 +12,14 @@ import com.fs.course.param.FsCourseQuestionAnswerUParam;
 import com.fs.course.param.FsCourseSendRewardUParam;
 import com.fs.course.param.FsUserCourseVideoFinishUParam;
 import com.fs.course.param.newfs.FsUserCourseAddCompanyUserParam;
+import com.fs.course.param.newfs.FsUserCourseBeMemberParam;
 import com.fs.course.param.newfs.FsUserCourseVideoLinkParam;
 import com.fs.course.param.newfs.FsUserCourseVideoUParam;
 import com.fs.course.service.*;
 import com.fs.course.vo.FsUserCourseVideoH5VO;
 import com.fs.course.vo.newfs.FsUserCourseVideoDetailsVO;
 import com.fs.course.vo.newfs.FsUserCourseVideoLinkDetailsVO;
+import com.fs.store.service.IFsUserService;
 import com.fs.system.service.ISysConfigService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -51,6 +53,9 @@ public class CourseWxH5Controller extends AppBaseController {
     @Autowired
     private IFsCourseQuestionBankService questionBankService;
 
+    @Autowired
+    private IFsUserService fsUserService;
+
 
     @Login
     @ApiOperation("判断是否添加客服(是否关联销售)")
@@ -124,4 +129,12 @@ public class CourseWxH5Controller extends AppBaseController {
         logger.error("zyp \n【h5看课中途报错】:{}",msg);
     }
 
+    @Login
+    @ApiOperation("会员关联绑定销售")
+    @PostMapping("/beMember")
+    public ResponseResult<Boolean> becomeMember(@Valid @RequestBody FsUserCourseBeMemberParam param) {
+        return fsUserService.becomeMember(param);
+    }
+
+
 }