webCMS课程列表详情展示。视频播放

This commit is contained in:
zhujunjieit 2019-01-21 01:20:32 +08:00
parent 4a322070ca
commit b6ce6e6037
9 changed files with 526 additions and 47 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@ -2,7 +2,14 @@ package com.ruoyi.cms.controller;
import com.ruoyi.common.config.Global; import com.ruoyi.common.config.Global;
import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.exam.domain.ExamPractice;
import com.ruoyi.exam.service.IExamPracticeService;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.train.course.domain.TrainCourse;
import com.ruoyi.train.course.domain.TrainCourseSection;
import com.ruoyi.train.course.domain.TrainCourseVO; import com.ruoyi.train.course.domain.TrainCourseVO;
import com.ruoyi.train.course.service.ITrainCourseCategoryService;
import com.ruoyi.train.course.service.ITrainCourseSectionService;
import com.ruoyi.train.course.service.ITrainCourseService; import com.ruoyi.train.course.service.ITrainCourseService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -10,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap; import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -20,21 +28,32 @@ import java.util.List;
/** /**
* 通用请求处理 * 通用请求处理
* *
* @author ruoyi * @author ruoyi
*/ */
@Controller @Controller
@RequestMapping("/web") @RequestMapping("/web")
public class CmsController public class CmsController {
{ private static final Logger log = LoggerFactory.getLogger( CmsController.class );
private static final Logger log = LoggerFactory.getLogger(CmsController.class);
private String prefix = "web"; private String prefix = "web";
@Autowired @Autowired
private ITrainCourseService trainCourseService; private ITrainCourseService trainCourseService;
@Autowired
private ITrainCourseCategoryService trainCourseCategoryService;
@Autowired
private ITrainCourseSectionService trainCourseSectionService;
@Autowired
private ISysUserService sysUserService;
@Autowired
private IExamPracticeService examPracticeService;
@RequestMapping("") @RequestMapping("")
@GetMapping() @GetMapping()
public String user(TrainCourseVO trainCourse,ModelMap map) { public String user(TrainCourseVO trainCourse, ModelMap map) {
List<TrainCourseVO> list = trainCourseService.selectTrainCoursePage( trainCourse ); List<TrainCourseVO> list = trainCourseService.selectTrainCoursePage( trainCourse );
map.put( "trainCourse", list ); map.put( "trainCourse", list );
return prefix + "/index"; return prefix + "/index";
@ -55,4 +74,33 @@ public class CmsController
} }
@RequestMapping("/course/courseInfo.html/{id}")
@GetMapping()
public String courseInfo(@PathVariable("id") Integer id, ModelMap map) {
TrainCourse trainCourse = trainCourseService.selectById( id );
TrainCourseSection trainCourseSection = new TrainCourseSection();
trainCourseSection.setTrainCourseId( id );
List<TrainCourseSection> trainCourseSections = trainCourseSectionService.selectTrainCourseSectionList( trainCourseSection );
ExamPractice examPractice = new ExamPractice();
examPractice.setTrainCourseId( id );
List<ExamPractice> examPractices = examPracticeService.selectExamPracticeList( examPractice );
map.put( "trainCourse", trainCourse );
map.put( "trainCourseSections", trainCourseSections );
map.put( "examPractices", examPractices );
return prefix + "/course/courseInfo";
}
@RequestMapping("/course/courseSections.html/{id}")
@GetMapping()
public String courseSections(@PathVariable("id") Integer id, ModelMap map) {
TrainCourseSection tcs= trainCourseSectionService.selectById( id );
TrainCourseSection trainCourseSection = new TrainCourseSection();
trainCourseSection.setTrainCourseId( tcs.getTrainCourseId() );
List<TrainCourseSection> trainCourseSections = trainCourseSectionService.selectTrainCourseSectionList( trainCourseSection );
ExamPractice examPractice = new ExamPractice();
examPractice.setTrainCourseId( id );
map.put( "trainCourseSection", tcs );
map.put( "trainCourseSections", trainCourseSections );
return prefix + "/course/courseSections";
}
} }

View File

@ -0,0 +1,236 @@
<!DOCTYPE HTML>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head th:include="web/index::cmsHeader">
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<style type="text/css">
body{
background-color: #ffffff;
}
.courseView {
background-size: auto auto;
padding: 50px 0;
background-size: 100% 100%;
}
.wWidth1200 .page-width {
margin: 0 auto;
width: 1200px;
}
.courseView .box {
background: #fff;
border: 1px solid #e6e6e6;
position: relative;
}
.bd-all {
border: 1px solid #eee;
border-radius: 3px;
}
.posnav {
padding: 0 30px;
font-size: 12px;
color: #999;
line-height: 45px;
height: 45px;
}
.courseInfo {
padding: 0px 30px 30px 560px;
position: relative;
min-height: 300px;
}
.courseInfo .image {
width: 500px;
height: 300px;
position: absolute;
left: 30px;
top: 0px;
overflow: hidden;
}
.courseInfo-right {
padding-top: 5px;
display: flex;
flex-direction: column;
}
.clear {
clear: both;
overflow: hidden;
height: 0;
}
.courseInfo .image img {
width: 100%;
min-height: 100%;
}
.courseInfo-right .name {
font-size: 24px;
line-height: 34px;
color: #222;
}
.courseInfo-right .price {
height: 44px;
line-height: 44px;
}
.courseInfo-right .price span {
float: left;
position: relative;
}
.courseInfo-right .price-info {
font-size: 24px;
color: #e91c35;
}
.courseInfo-right .button {
height: 44px;
line-height: 44px;
overflow: hidden;
margin-top: 10px;
}
.courseInfo-right .hb-ui-btn, .courseInfo-right .hb-ui-btn1 {
height: 44px;
line-height: 44px;
font-size: 16px;
background: #f59121;
width: 150px;
text-align: center;
color: #fff;
border: 0px;
-webkit-transition: 0.3s;
transition: 0.3s;
float: left;
cursor: pointer;
border-radius: 3px;
}
.courseInfo-right .button em {
margin-left: 20px;
color: #b1b1b1;
}
.courseInfo-right .remark{
font-family: Arial,hiragino sans gb,microsoft yahei,simsun,sans-serif !important;
font-size: 14px;
color: #888;
height: 88px;
line-height: 44px;
overflow: hidden;
margin-top: 10px;
}
em {
font-style: normal;
}
.nav_content {
background: #f5f5f5;
border-bottom: 1px solid #e5e5e5;
}
.nav_content .page-width {
margin: 0 auto;
width: 100%;
}
.courseTab {
height: 59px;
overflow: hidden;
}
.clearfix {
display: block;
}
.courseTab li.active {
border-bottom: 3px solid #0288d1;
color: #0288d1;
}
.courseTab li {
float: left;
margin: 0px 60px 0 0;
text-align: center;
height: 56px;
line-height: 56px;
font-size: 16px;
cursor: pointer;
color: #555;
}
li {
list-style-type: none;
}
</style>
<div class="fly-header layui-bg-black" th:replace="web/index:: top">
</div>
<div class="layui-container">
<div class="courseView">
<div class="page-width">
<form id="form1" action="https://xcx.kesion.com/cshoppingcart.html" method="post">
<div class="box bd-all">
<div class="posnav">
您现在位置:<a href="/vod/zyzg">职业资格</a><em>&gt;</em> <a href="/vod/e0ITPX">IT培训</a><em>&gt;</em> 浏览课程
</div>
<div class="courseInfo">
<div class="image" id="courseImage">
<div id="view_flv" style="display:none;"></div>
<div class="course-pro0"></div>
<img th:src="${trainCourse.cover}" class="course-cover" onerror="this.src='/sysimg/nopic.gif'" width="480" height="290">
</div>
<div class="courseInfo-right">
<div class="name" th:text="${trainCourse.name}">
安全测试基础课程
</div>
<div class="price">
<span class="price-info"><span th:text="'¥'+${trainCourse.price}"></span></span>
</div>
<div class="button">
<input type="submit" onclick="return Logincart('551')" class="hb-ui-btn" value="立刻购买">
<em>有效期:<span id="shixian">永久</span></em>
</div>
<div class="remark" th:text="${trainCourse.description}">
</div>
</div>
<div class="clear"></div>
</div>
</div>
</form>
</div>
</div>
<div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
<ul class="layui-tab-title">
<li class="layui-this">课程目录</li>
<li>学员评价(<span id="commentNum">1</span>)</li>
<li>相关题库</li>
</ul>
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<ul >
<li th:each="sections:${trainCourseSections}" >
<a th:href="@{'/web/course/courseSections.html/'+${sections.id}}">
<span th:text="${sections.name}"> </span>
</a>
<hr>
</li>
</ul>
</div>
<div class="layui-tab-item">2</div>
<div class="layui-tab-item">
<ul >
<li th:each="practice,obj:${examPractices}" >
<span th:text="${obj.index+1}+'.'+${practice.name}"> </span>
<hr>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="fly-footer" th:replace="web/index::cmsBottom">
</div>
<script type="text/javascript">
layui.use('element', function(){
var element = layui.element;
});
</script>
</body>
</html>

View File

@ -0,0 +1,89 @@
<!DOCTYPE HTML>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head th:include="web/index::cmsHeader">
</head>
<body>
<div class="fly-header layui-bg-black" th:replace="web/index:: top">
</div>
<style type="text/css">
.video-box {
background-color: #000000;
padding-top: 10px;
padding-bottom: 10px;
}
.container-fluid {
width: 100%;
padding-right: 15px;
padding-left: 15px;
margin-right: auto;
margin-left: auto;
height: 450px;
}
.play-list{
padding: 0;
background-color: #202026;
height: 430px;
overflow-y: auto;
line-height: 40px;
}
.play-list .section{
display: flex;
flex-direction: row;
}
.play-list .section-index{
font-size: 2rem;
text-align: center;
width: 50px;
color: #d0d0d6;
margin-top: 15px;
}
.play-list .section-info{
margin-top: 5px;
color: #d0d0d6;
}
.play-list .section-time{
font-size: 10px;
line-height: 12px;
color: #909096;
margin-bottom: 10px;
}
a:hover .section-index, a:hover .section-info-name{
color: #2692ff;
}
</style>
<div class="container-fluid video-box layui-container">
<div class="layui-row">
<div class="layui-col-md2">1
</div>
<div class="layui-col-md6">2
<video th:src="${trainCourseSection.courseware}" width="95%" height="400px" controls="controls">
</video>
</div>
<div class="layui-col-md2">
<div class="play-list">
<ul>
<a th:each="section,obj:${trainCourseSections}" th:href="@{'/web/course/courseSections.html/'+${section.id}}">
<li class="section">
<div class="section-index" th:text="${obj.index+1}"></div>
<div class="section-info">
<div class="section-info-name" th:text="${section.name}"></div>
<div class="section-time" th:text="'创建于:'+*{#dates.format(section.createTime,'yyyy-MM-dd HH:mm:ss')}"></div>
</div>
<hr>
</li>
</a>
</ul>
</div>
</div>
<div class="layui-col-md2">4
</div>
</div>
</div>
<div class="fly-footer" th:replace="web/index::cmsBottom">
</div>
</body>
</html>

View File

@ -3,28 +3,132 @@
<head th:fragment="cmsHeader"> <head th:fragment="cmsHeader">
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title></title> <title>骏聪信息科技培训考试系统</title>
<meta name="keywords" content=""> <meta name="keywords" content="">
<meta name="description" content=""> <meta name="description" content="">
<link rel="shortcut icon" href="favicon.ico"> <link rel="shortcut icon" href="favicon.ico">
<link rel="stylesheet" th:href="@{/web/res/layui/css/layui.css}"> <link rel="stylesheet" th:href="@{/web/res/layui/css/layui.css}">
<link rel="stylesheet" th:href="@{/web/res/css/global.css}"> <link rel="stylesheet" th:href="@{/web/res/css/global.css}">
<style type="text/css"> <script th:src="@{/web/res/layui/layui.js}"></script>
.course{
height: 300px;
border: 1px solid #8a8a8a;
background-color: #ffffff;
}
</style>
</head> </head>
<body> <body>
<style type="text/css">
.course{
height: 370px;
border: 1px solid #8a8a8a;
background-color: #ffffff;
}
.title{
margin-top: 20px;
}
.title span{
font-size: 28px;
font-weight: normal;
float: left;
margin-left: 10px;
line-height: 50px;
}
.title em{
display: block;
width: 70px;
height: 24px;
border-bottom: 2px #666 solid;
float: left;
}
.title i{
float: left;
font-size: 20px;
color: #999;
margin-left: 10px;
line-height: 50px;
}
.in01{
background: rgba(0,0,0,0.6);
width: 100%;
line-height: 30px;
height: 30px;
padding: 0px 10px;
bottom: 0;
left: 0;
box-sizing: border-box;
position: relative;
}
.in01 span {
display: block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 18px;
color: #fff;
}
.remark{
width: 80%;
margin: 5% 10%;
line-height: 25px;
font-size: 14px;
color: #777;
text-align: left;
}
.remark .title{
height: 50px;
line-height: 25px;
overflow: hidden;
margin: 10px 0;
}
.remark .price{
font-size: 18px;
line-height: 30px;
color: #e91c35;
height: 30px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.remark .free_price{
font-size: 18px;
line-height: 30px;
color: #3ab57f;
height: 30px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.remark .boxbtn01{
margin: 0px 20px 20px;
}
.remark .clearfix{
display: block;
}
.remark .boxbtn01 .btn01{
float: left;
color: #999;
width: 46%;
border: 1px solid #ddd;
}
.remark .boxbtn01 .btn02{
float: right;
background: #0288d1;
color: #fff;
width: 46%;
border: 1px solid #0288d1;
}
.remark .boxbtn01 a{
height: 35px;
line-height: 35px;
text-align: center;
color: #666;
font-size: 14px;
box-sizing: border-box;
border-radius: 30px;
overflow: hidden;
}
</style>
<div class="fly-header layui-bg-black" th:fragment="top"> <div class="fly-header layui-bg-black" th:fragment="top">
<div class="layui-container"> <div class="layui-container">
<a class="fly-logo" th:href="@{/web}"> <a class="fly-logo" th:href="@{/web}">
<img th:src="@{juncong.png}" alt="骏聪" width="100px" height="50px"> <img th:src="@{juncong.png}" alt="骏聪" width="100px" height="45px">
</a> </a>
<ul class="layui-nav fly-nav layui-hide-xs"> <ul class="layui-nav fly-nav layui-hide-xs">
<li class="layui-nav-item layui-this"> <li class="layui-nav-item layui-this">
@ -53,15 +157,38 @@
</ul> </ul>
</div> </div>
</div> </div>
<div class="layui-container"> <div class="layui-container">
<div class="title">
<em></em>
<span>所有课程</span>
<i>All Course</i>
</div>
<div class="layui-row layui-col-space15"> <div class="layui-row layui-col-space15">
<div class="layui-col-md3" th:each="course:${trainCourse}"> <div class="layui-col-md3" th:each="course:${trainCourse}">
<div class="course"> <div class="course">
<div class="courseImg"> <div class="courseImg">
<img th:src="${course.cover}" th:alt="${course.name}" width="100%" height="230px"> <a th:href="@{'/web/course/courseInfo.html/'+${course.id}}">
<img th:if="${#strings.isEmpty(course.cover)}" th:src="@{/web/res/images/no_img.png}" th:alt="${course.name}" width="100%" height="180px">
<img th:if="${not #strings.isEmpty(course.cover)}" th:src="${course.cover}" th:alt="${course.name}" width="100%" height="180px">
<p class="in01">
<span class="f20 c77b" th:text="${course.name}">安全测试基础课程</span>
<span class="cfff"></span>
</p>
</a>
</div>
<div class="remark">
<div class="title" th:text="${course.description}">
</div>
<div class="price" th:if="${course.price>0}" th:text="'¥'+${course.price}">
</div>
<div class="free_price" th:if="${course.price==0}" th:text="'免费'">
</div>
<div class="boxbtn01 clearfix">
<a class="btn01" th:href="@{'/web/course/courseInfo.html/'+${course.id}}">了解更多</a>
<a class="btn02" th:href="@{/web/course/coursePay.html}">立即购买</a>
</div>
</div> </div>
<span th:text="${course.name}"></span>
</div> </div>
</div> </div>
</div> </div>
@ -71,25 +198,6 @@
<p><a href="http://fly.layui.com/" target="_blank">骏聪信息科技</a></p> <p><a href="http://fly.layui.com/" target="_blank">骏聪信息科技</a></p>
</div> </div>
<script src="../res/layui/layui.js"></script>
<script>
layui.cache.page = '';
layui.cache.user = {
username: '游客'
,uid: -1
,avatar: '../res/images/avatar/00.jpg'
,experience: 83
,sex: '男'
};
layui.config({
version: "3.0.0"
,base: '../res/mods/' //这里实际使用时,建议改成绝对路径
}).extend({
fly: 'index'
}).use('fly');
</script>
<script type="text/javascript">var cnzz_protocol = (("https:" == document.location.protocol) ? " https://" : " http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_30088308'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "w.cnzz.com/c.php%3Fid%3D30088308' type='text/javascript'%3E%3C/script%3E"));</script>
</body> </body>
</html> </html>

View File

@ -58,13 +58,8 @@
</div> </div>
<div class="fly-footer">
<p><a href="http://fly.layui.com/" target="_blank">Fly社区</a> 2017 &copy; <a href="http://www.layui.com/" target="_blank">layui.com 出品</a></p> <div class="fly-footer" th:replace="web/index::cmsBottom">
<p>
<a href="http://fly.layui.com/jie/3147/" target="_blank">付费计划</a>
<a href="http://www.layui.com/template/fly/" target="_blank">获取Fly社区模版</a>
<a href="http://fly.layui.com/jie/2461/" target="_blank">微信公众号</a>
</p>
</div> </div>
<script src="../../res/layui/layui.js"></script> <script src="../../res/layui/layui.js"></script>

View File

@ -49,7 +49,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="id != null "> and id = #{id}</if> <if test="id != null "> and id = #{id}</if>
<if test="deptId != null "> and dept_id = #{deptId}</if> <if test="deptId != null "> and dept_id = #{deptId}</if>
<if test="name != null and name != '' "> and name = #{name}</if> <if test="name != null and name != '' "> and name = #{name}</if>
<if test="trainCourseId != null "> and exam_examination.train_course_id = #{ination.trainCourseId}</if> <if test="trainCourseId != null "> and exam_practice.train_course_id = #{trainCourseId}</if>
<if test="enableControlTime != null and enableControlTime != '' "> and enable_control_time = #{enableControlTime}</if> <if test="enableControlTime != null and enableControlTime != '' "> and enable_control_time = #{enableControlTime}</if>
<if test="startTime != null "> and start_time = #{startTime}</if> <if test="startTime != null "> and start_time = #{startTime}</if>
<if test="endTime != null "> and end_time = #{endTime}</if> <if test="endTime != null "> and end_time = #{endTime}</if>
@ -73,7 +73,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
or exam_practice.enable_control_time = '0') ]]> or exam_practice.enable_control_time = '0') ]]>
<if test="id != null "> and exam_practice.id = #{id}</if> <if test="id != null "> and exam_practice.id = #{id}</if>
<if test="deptId != null "> and exam_practice.dept_id = #{deptId}</if> <if test="deptId != null "> and exam_practice.dept_id = #{deptId}</if>
<if test="trainCourseId != null "> and exam_examination.train_course_id = #{ination.trainCourseId}</if> <if test="trainCourseId != null "> and exam_practice.train_course_id = #{trainCourseId}</if>
<if test="name != null and name != '' "> and exam_practice.name = #{name}</if> <if test="name != null and name != '' "> and exam_practice.name = #{name}</if>
<if test="enableControlTime != null and enableControlTime != '' "> and exam_practice.enable_control_time = #{enableControlTime}</if> <if test="enableControlTime != null and enableControlTime != '' "> and exam_practice.enable_control_time = #{enableControlTime}</if>
<if test="startTime != null "> and exam_practice.start_time = #{startTime}</if> <if test="startTime != null "> and exam_practice.start_time = #{startTime}</if>

View File

@ -1,4 +1,5 @@
package com.ruoyi.train.course.domain; package com.ruoyi.train.course.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle; import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.base.BaseEntity; import com.ruoyi.common.base.BaseEntity;
@ -31,10 +32,12 @@ public class TrainCourseSection
/** 创建者 */ /** 创建者 */
private String createBy; private String createBy;
/** 创建时间 */ /** 创建时间 */
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime; private Date createTime;
/** 更新者 */ /** 更新者 */
private String updateBy; private String updateBy;
/** 更新时间 */ /** 更新时间 */
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime; private Date updateTime;
/** 备注 */ /** 备注 */
private String remark; private String remark;