0
点赞
收藏
分享

微信扫一扫

作品管理-作品小节管理

后端

定义接收前端参数 ​​ContentVideoInfoVO​

/**
 * @author BNTang
 * @version S2.3.2Dev
 * @program video_parent
 * @date Created in 2021/4/10 22:03
 * @description 作品小节接收前端参数VO
 **/
@Data
public class ContentVideoInfoVO {

    @ApiModelProperty(value = "视频ID")
    private String id;

    @ApiModelProperty(value = "小节名称")
    private String title;

    @ApiModelProperty(value = "作品ID")
    private String contentId;

    @ApiModelProperty(value = "章节ID")
    private String chapterId;

    @ApiModelProperty(value = "视频资源")
    private String videoSourceId;

    @ApiModelProperty(value = "显示排序")
    private Integer sort;

    @ApiModelProperty(value = "是否可以试听:0默认 1免费")
    private Integer isFree;
}

ContentVideoController

如下是 ContentVideoController 中所有的代码,比较简单主要是在 service 层代码我会额外进行解释

/**
 * <p>
 * 作品视频 前端控制器
 * </p>
 *
 * @author BNTang
 * @since 2021-04-08
 */
@RestController
@CrossOrigin
@Api(tags&nbsp;=&nbsp;&quot;作品视频组&quot;)
@RequestMapping(&quot;/service_video/content_video&quot;)
public&nbsp;class&nbsp;ContentVideoController&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;@Resource
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;ContentVideoService&nbsp;contentVideoService;

&nbsp;&nbsp;&nbsp;&nbsp;/**
     * <b>
     * 新增小节
     * </b>
     */
&nbsp;&nbsp;&nbsp;&nbsp;@ApiOperation(value&nbsp;=&nbsp;&quot;新增小节&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;@PostMapping(&quot;/saveVideoInfo")
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ResponseResult&nbsp;save(@RequestBody&nbsp;ContentVideoInfoVO&nbsp;videoInfoForm)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contentVideoService.saveVideoInfo(videoInfoForm);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ResponseResult.ok();
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
     * <b>
     * 根据ID查询小节
     * </b>
     */
&nbsp;&nbsp;&nbsp;&nbsp;@ApiOperation(value&nbsp;=&nbsp;&quot;根据ID查询小节&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;@GetMapping(&quot;/getVideoInfo/{id}&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ResponseResult&nbsp;getVideInfoById(@PathVariable&nbsp;String&nbsp;id)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ResponseResult.ok().data(&quot;item&quot;,&nbsp;contentVideoService.getContentVideoInfoById(id));
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
     * <b>
     * 更新小节
     * </b>
     */
&nbsp;&nbsp;&nbsp;&nbsp;@ApiOperation(value&nbsp;=&nbsp;&quot;更新小节&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;@PostMapping(&quot;/updateVideoInfo")
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ResponseResult&nbsp;updateCourseInfoById(@RequestBody&nbsp;ContentVideoInfoVO&nbsp;videoInfoForm)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contentVideoService.updateVideoInfo(videoInfoForm);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ResponseResult.ok();
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
     * <b>
     * 根据ID删除小节
     * </b>
     */
&nbsp;&nbsp;&nbsp;&nbsp;@ApiOperation(value&nbsp;=&nbsp;&quot;根据ID删除小节&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;@PostMapping(&quot;/deleteVideoInfo/{id}&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ResponseResult&nbsp;removeById(@PathVariable&nbsp;String&nbsp;id)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(contentVideoService.deleteVideoById(id))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ResponseResult.ok();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ResponseResult.error().message(&quot;删除失败&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
}

ContentVideoService 接口内容如下

/**
 * <p>
 * 作品视频 服务类
 * </p>
 *
 * @author BNTang
 * @since 2021-04-08
 */
public&nbsp;interface&nbsp;ContentVideoService&nbsp;extends&nbsp;IService&lt;ContentVideo&gt;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;/**
     * <b>
     * 根据章节ID查询是否存在小节
     * </b>
     *
     * @param id 章节ID
     * @return 是否存在小节
     */
&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;isExistContentVideoWithChapterId(String&nbsp;id);

&nbsp;&nbsp;&nbsp;&nbsp;/**
     * <b>
     * 新增小节
     * </b>
     *
     * @param contentVideoInfoVO 小节信息VO
     */
&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;saveVideoInfo(ContentVideoInfoVO&nbsp;contentVideoInfoVO);

&nbsp;&nbsp;&nbsp;&nbsp;/**
     * <b>
     * 根据ID查询小节
     * </b>
     *
     * @param id 小节ID
     * @return 小节信息
     */
&nbsp;&nbsp;&nbsp;&nbsp;ContentVideoInfoVO&nbsp;getContentVideoInfoById(String&nbsp;id);

&nbsp;&nbsp;&nbsp;&nbsp;/**
     * <b>
     * 更新小节
     * </b>
     *
     * @param contentVideoInfoVO 小节信息VO
     */
&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;updateVideoInfo(ContentVideoInfoVO&nbsp;contentVideoInfoVO);

&nbsp;&nbsp;&nbsp;&nbsp;/**
     * <b>
     * 根据ID删除小节
     * </b>
     *
     * @param id 小节ID
     * @return 是否删除成功(true : 删除成功 , false : 删除失败)
     */
&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;deleteVideoById(String&nbsp;id);
}

对应的 ContentVideoServiceImpl 实现类代码如下

/**
 * <p>
 * 作品视频 服务实现类
 * </p>
 *
 * @author BNTang
 * @since 2021-04-08
 */
@Service
public&nbsp;class&nbsp;ContentVideoServiceImpl&nbsp;extends&nbsp;ServiceImpl&lt;ContentVideoMapper,&nbsp;ContentVideo&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;implements&nbsp;ContentVideoService&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;@Override
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;isExistContentVideoWithChapterId(String&nbsp;id)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryWrapper&lt;ContentVideo&gt;&nbsp;queryWrapper&nbsp;=&nbsp;new&nbsp;QueryWrapper&lt;&gt;();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queryWrapper.eq(&quot;chapter_id&quot;,&nbsp;id);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;count&nbsp;=&nbsp;baseMapper.selectCount(queryWrapper);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null&nbsp;!=&nbsp;count&nbsp;&amp;&amp;&nbsp;count&nbsp;&gt;&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;@Override
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;saveVideoInfo(ContentVideoInfoVO&nbsp;contentVideoInfoVO)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ContentVideo&nbsp;contentVideo&nbsp;=&nbsp;new&nbsp;ContentVideo();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeanUtils.copyProperties(contentVideoInfoVO,&nbsp;contentVideo);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.save(contentVideo);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;@Override
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ContentVideoInfoVO&nbsp;getContentVideoInfoById(String&nbsp;id)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 从video表中取数据
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ContentVideo&nbsp;contentVideo&nbsp;=&nbsp;this.getById(id);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(Objects.isNull(contentVideo))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;BnTangException(20001,&nbsp;&quot;数据不存在&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 创建videoInfoForm对象
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ContentVideoInfoVO&nbsp;contentVideoInfoVO&nbsp;=&nbsp;new&nbsp;ContentVideoInfoVO();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeanUtils.copyProperties(contentVideo,&nbsp;contentVideoInfoVO);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;contentVideoInfoVO;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;@Override
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;updateVideoInfo(ContentVideoInfoVO&nbsp;contentVideoInfoVO)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ContentVideo&nbsp;contentVideo&nbsp;=&nbsp;new&nbsp;ContentVideo();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeanUtils.copyProperties(contentVideoInfoVO,&nbsp;contentVideo);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.updateById(contentVideo);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;@Override
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;deleteVideoById(String&nbsp;id)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// TODO 删除视频资源
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;result&nbsp;=&nbsp;baseMapper.deleteById(id);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result&nbsp;&gt;&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;}
}

前端

在 api 当中定义 ​​content_video​​ 前端接口

作品管理-作品小节管理_ide

import&nbsp;request&nbsp;from&nbsp;&#39;@/utils/request&#39;

const&nbsp;api_name&nbsp;=&nbsp;&#39;/service_video/content_video&#39;

export&nbsp;default&nbsp;{
&nbsp;&nbsp;// 新增小节
&nbsp;&nbsp;saveVideoInfo(videoInfo)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;request({
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;`${api_name}/saveVideoInfo`,
      method: 'post',
      data: videoInfo
    });
  },
  // 根据ID查询小节
  getVideoInfoById(id) {
    return request({
      url: `${api_name}/getVideoInfo/${id}`,
      method: 'get'
    });
  },
  // 更新小节
  updateVideoInfo(videoInfo) {
    return request({
      url: `${api_name}/updateVideoInfo`,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method:&nbsp;&#39;post&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data:&nbsp;videoInfo
&nbsp;&nbsp;&nbsp;&nbsp;});
&nbsp;&nbsp;},
&nbsp;&nbsp;// 根据ID删除小节
&nbsp;&nbsp;deleteVideoById(id)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;request({
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;`${api_name}/deleteVideoInfo/${id}`,
      method: 'post'
    });
  }
}

新增小节

定义 data 数据

作品管理-作品小节管理_数据_02

// 是否显示课时表单
dialogVideoFormVisible:&nbsp;false,
// 课时所在的章节id
chapterId:&nbsp;&#39;&#39;,
// 课时对象
contentVideo:&nbsp;{
&nbsp;&nbsp;title:&nbsp;&#39;&#39;,
&nbsp;&nbsp;sort:&nbsp;0,
&nbsp;&nbsp;isFree:&nbsp;0,
&nbsp;&nbsp;videoSourceId:&nbsp;&#39;&#39;
},

添加小节按钮点击事件

作品管理-作品小节管理_Project_03

<el-button type="text"
           @click="dialogVideoFormVisible=true;chapterId = chapter.id">添加小节</el-button>

小节表单

<!-- 
添加和修改小节表单
-->
<el-dialog :visible.sync="dialogVideoFormVisible" title="添加小节">
  <el-form :model="contentVideo" label-width="120px">
    <el-form-item label="小节标题">
      <el-input v-model="contentVideo.title"/>
    </el-form-item>
    <el-form-item label="课时排序">
      <el-input-number v-model="contentVideo.sort" :min="0" controls-position="right"/>
    </el-form-item>
    <el-form-item label="是否免费">
      <el-radio-group v-model="contentVideo.isFree">
        <el-radio :label="true">免费</el-radio>
        <el-radio :label="false">默认</el-radio>
      </el-radio-group>
    </el-form-item>
    <el-form-item label="上传视频">
      <!-- 上传视频 -->
    </el-form-item>
  </el-form>
  <div slot="footer" class="dialog-footer">
    <el-button @click="dialogVideoFormVisible = false">取 消</el-button>
    <el-button type="primary" @click="saveOrUpdateVideo">确 定</el-button>
  </div>
</el-dialog>

实现添加小节按钮点击事件

作品管理-作品小节管理_数据_04

// 小节按钮点击
saveOrUpdateVideo()&nbsp;{
&nbsp;&nbsp;if&nbsp;(!this.contentVideo.id)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;this.saveDataVideo()
&nbsp;&nbsp;}&nbsp;else&nbsp;{
&nbsp;&nbsp;}
},

// 保存小节数据信息
saveDataVideo()&nbsp;{
&nbsp;&nbsp;this.contentVideo.contentId&nbsp;=&nbsp;this.contentId;
&nbsp;&nbsp;this.contentVideo.chapterId&nbsp;=&nbsp;this.chapterId;
&nbsp;&nbsp;contentVideo.saveVideoInfo(this.contentVideo).then(res&nbsp;=&gt;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;this.$message({
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;&#39;success&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message:&nbsp;res.message
&nbsp;&nbsp;&nbsp;&nbsp;});
&nbsp;&nbsp;&nbsp;&nbsp;// 保存后, 更新相关数据
&nbsp;&nbsp;&nbsp;&nbsp;this.helpSaveVideo()
&nbsp;&nbsp;})
},

保存后, 更新相关数据

作品管理-作品小节管理_ide_05

// 保存后, 更新相关数据
helpSaveVideo()&nbsp;{
&nbsp;&nbsp;this.dialogVideoFormVisible&nbsp;=&nbsp;false;
&nbsp;&nbsp;this.getNestedTreeList();
&nbsp;&nbsp;this.contentVideo&nbsp;=&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;title:&nbsp;&#39;&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;sort:&nbsp;0,
&nbsp;&nbsp;&nbsp;&nbsp;isFree:&nbsp;0,
&nbsp;&nbsp;&nbsp;&nbsp;videoSourceId:&nbsp;&#39;&#39;
&nbsp;&nbsp;}
},

编辑小节

添加编辑小节按钮点击事件

作品管理-作品小节管理_Project_06

<el-button type="text" @click="editContentVideo(section.id)">编辑</el-button>
<el-button type="text" @click="deleteContentVideo(section.id)">删除</el-button>

实现数据回显

作品管理-作品小节管理_表单_07

// 编辑小节按钮
editContentVideo(videoId)&nbsp;{
&nbsp;&nbsp;this.dialogVideoFormVisible&nbsp;=&nbsp;true;
&nbsp;&nbsp;contentVideo.getVideoInfoById(videoId).then(response&nbsp;=&gt;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;this.contentVideo&nbsp;=&nbsp;response.data.item;
&nbsp;&nbsp;}).catch(error&nbsp;=&gt;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;this.$message.error(error.message);
&nbsp;&nbsp;});
},

编辑保存方法实现

//更新小节信息
updateDataVideo()&nbsp;{
&nbsp;&nbsp;contentVideo.updateVideoInfo(this.contentVideo).then(response&nbsp;=&gt;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;this.$message({
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;&#39;success&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message:&nbsp;response.message
&nbsp;&nbsp;&nbsp;&nbsp;});
&nbsp;&nbsp;&nbsp;&nbsp;// 更新相关数据
&nbsp;&nbsp;&nbsp;&nbsp;this.helpSaveVideo();
&nbsp;&nbsp;}).catch(error&nbsp;=&gt;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;this.$message.error(error.message);
&nbsp;&nbsp;});
},

删除小节

deleteContentVideo(videoId)&nbsp;{
&nbsp;&nbsp;this.$confirm(&#39;永久删除该记录,&nbsp;是否继续?&#39;,&nbsp;&#39;提示&#39;,&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;confirmButtonText:&nbsp;&#39;确定&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;cancelButtonText:&nbsp;&#39;取消&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;&#39;warning&#39;
&nbsp;&nbsp;}).then(()&nbsp;=&gt;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;contentVideo.deleteVideoById(videoId);
&nbsp;&nbsp;}).then((res)&nbsp;=&gt;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;// 刷新列表
&nbsp;&nbsp;&nbsp;&nbsp;this.getNestedTreeList();
&nbsp;&nbsp;&nbsp;&nbsp;this.$message({
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;&#39;success&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message:&nbsp;res.message
&nbsp;&nbsp;&nbsp;&nbsp;});
&nbsp;&nbsp;}).catch((response)&nbsp;=&gt;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(response&nbsp;===&nbsp;&#39;cancel&#39;)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.$message({
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;&#39;info&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message:&nbsp;&#39;已取消删除&#39;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;});
},


举报

相关推荐

0 条评论