update from server

This commit is contained in:
zhaoxinyu
2024-07-25 14:41:47 +08:00
parent e67b63616e
commit 8b8d12bfed
13 changed files with 176 additions and 60 deletions
@@ -74,15 +74,17 @@ public class TrainEduStatisticsVideoController {
u.loginname,
u.unitname,
u.unionname,
tev.qualifiedNum,
(
SELECT
SUM(IF( cnt > 2, 2, cnt )) AS count
SUM(IF( cnt > tev.everyDayMaxWatchNum, tev.everyDayMaxWatchNum, cnt )) AS count
FROM
( SELECT watchTime, COUNT( 1 ) AS cnt FROM train_edu_video_watch_record where userId = tevwr.userId and albumId = tevwr.albumId GROUP BY watchTime ) AS subquery
) as watchCount
FROM
`train_edu_video_watch_record` tevwr
LEFT JOIN train_edu_video tev ON tev.id = tevwr.videoId
LEFT JOIN train_edu_album tea on tea.id = tevwr.albumId
LEFT JOIN `user` u ON u.id = tevwr.userId
$condition
@@ -65,4 +65,9 @@ public class TrainEduVideo extends BaseModel {
@ColDefine(type = ColType.INT)
private Integer everyDayMaxWatchNum;
@Column
@Comment("合格/达标次数")
@ColDefine(type = ColType.INT)
private Integer qualifiedNum;
}
@@ -26,6 +26,23 @@ const removeHTMLTag = (str) => {
return str;
}
function groupBy(array, key) {
return array.reduce((result, currentItem) => {
// 使用 key 函数获取分组的键
const groupKey = key(currentItem);
// 检查结果对象中是否已经有了这个键
const existingGroup = result.find(item => item.key === groupKey);
if (existingGroup) {
// 如果已存在,则将当前项添加到该组数组中
existingGroup.items.push(currentItem);
} else {
// 如果不存在,则创建新组并添加当前项
result.push({ key: groupKey, items: [currentItem] });
}
return result;
}, []);
}
const CREATE_PREVIEW_URL = (val) => {
return FILE_STREAM_PREVIEW_ADDRESS + "?id=" + val
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+10 -3
View File
@@ -9,15 +9,15 @@
/>
<van-number-keyboard safe-area-inset-bottom/>
<title></title>
<link rel="stylesheet" href="https://cdn.staticfile.org/vant/2.12.5/index.min.css"/>
<link rel="stylesheet" href="${base!}/assets/platform/plugins/vant/index.min.css"/>
<link rel="stylesheet" href="${base!}/assets/mobile/css/theme.css">
<link rel="stylesheet" href="${base!}/assets/mobile/css/main.css">
<script src="${base!}/assets/platform/plugins/vue/vue.min.js"></script>
<script src="https://cdn.staticfile.org/vant/2.12.5/vant.min.js"></script>
<script src="${base!}/assets/platform/plugins/vant/vant.min.js"></script>
<script src="${base!}/assets/platform/plugins/vue-loader/httpVueLoader.js"></script>
<script src="${base!}/assets/mobile/js/basic.js"></script>
<script src="${base!}/assets/mobile/js/basic.js?v=0.0.1"></script>
<script src="${base!}/assets/platform/plugins/jquery/jquery-1.11.1.min.js"></script>
@@ -48,6 +48,13 @@
<script type="text/javascript"
src="https://webapi.amap.com/maps?v=2.0&key=6ab3452804ba35050880b5e047436853&plugin=AMap.PolyEditor,AMap.Geolocation"></script>
<script src="https://cdn-go.cn/cdn/vod-js-sdk-v6/latest/vod-js-sdk-v6.js"></script>
<link href="https://web.sdk.qcloud.com/player/tcplayer/release/v4.5.2/tcplayer.min.css" rel="stylesheet"/>
<!--如果需要在 Chrome 和 Firefox 等现代浏览器中通过 H5 播放 HLS 格式的视频,需要在 tcplayer.vx.x.x.min.js 之前引入 hls.min.x.xx.xm.js。-->
<script src="https://web.sdk.qcloud.com/player/tcplayer/release/v4.5.2/libs/hls.min.0.13.2m.js"></script>
<!--播放器脚本文件-->
<script src="https://web.sdk.qcloud.com/player/tcplayer/release/v4.5.2/tcplayer.v4.3.0.min.js"></script>
</head>
<body>
@@ -19,12 +19,12 @@ layout("/mobile/platform.html"){
</style>
<script src="https://cdn-go.cn/cdn/vod-js-sdk-v6/latest/vod-js-sdk-v6.js"></script>
<link href="https://web.sdk.qcloud.com/player/tcplayer/release/v4.3.0/tcplayer.min.css" rel="stylesheet"/>
<!--如果需要在 Chrome 和 Firefox 等现代浏览器中通过 H5 播放 HLS 格式的视频,需要在 tcplayer.vx.x.x.min.js 之前引入 hls.min.x.xx.xm.js。-->
<script src="https://web.sdk.qcloud.com/player/tcplayer/release/v4.3.0/libs/hls.min.0.13.2m.js"></script>
<!--播放器脚本文件-->
<script src="https://web.sdk.qcloud.com/player/tcplayer/release/v4.3.0/tcplayer.v4.3.0.min.js"></script>
<!--<script src="/assets/platform/plugins/vod/vod-js-sdk-v6.js"></script>-->
<!--<link href="/assets/platform/plugins/vod/tcplayer.min.css"/>-->
<!--<script src="/assets/platform/plugins/vod/hls.min.0.13.2m.js"></script>-->
<!--<script src="/assets/platform/plugins/vod/tcplayer.v4.3.0.min.js"></script>-->
<style>
#app {
@@ -33,6 +33,7 @@ layout("/mobile/platform.html"){
.video-container {
height: 300px;
position: relative;
}
#player-container-id {
@@ -75,7 +76,7 @@ layout("/mobile/platform.html"){
word-break: break-all;
}
.myWatchRecord{
.myWatchRecord {
font-size: 14px;
}
@@ -92,19 +93,66 @@ layout("/mobile/platform.html"){
></van-nav-bar>
<div class="video-container">
<video v-if="isPlay" id="player-container-id" preload="auto" playsinline
<video id="player-container-id" preload="auto"
autoplay
playsinline
webkit-playsinline>
</video>
<van-image
v-else
style="width: 100%;height: 100%"
:src="FILE_DOMAIN+'/fileStreamPreview?id='+albumInfo.cover"
></van-image>
<!-- <div v-if="!isPlay" style=" height: 100%;-->
<!-- background: #000;-->
<!-- position: absolute;-->
<!-- top: 0;-->
<!-- left: 0;-->
<!-- right: 0;-->
<!-- bottom: 0;">-->
<!-- <van-image-->
<!-- style="width: 90%;-->
<!-- height: 100%;-->
<!-- z-index: 999;"-->
<!-- fit="contain"-->
<!-- :src="FILE_DOMAIN+'/fileStreamPreview?id='+albumInfo.cover"-->
<!-- ></van-image>-->
<!-- <div class="tcp-skin">-->
<!-- <div class="vjs-big-play-button">-->
<!-- <div class="vjs-button-icon">-->
<!-- <svg height="100%" width="100%" viewBox="0 0 484 348">-->
<!-- <path class="draw-fill" transform="translate(4 4)"-->
<!-- d="M383,124C350-42,122.3-40.5,90.6,123.5c-110.4,18.5-131,185,.6,216.5H381.6C519.7,310.7,494.1,137.8,383,124Z"></path>-->
<!-- <path transform="translate(4 4)"-->
<!-- d="M200.4,110.2c-9.4-5.8-19.6,2.7-19.4,11.7V256.2c0,8,10.4,16.7,19.4,10.8,2.2-1.4,111.8-65.9,114-67.3,7.4-4,10.1-15.8,0-22.2Z"-->
<!-- style="fill:#fff ;"></path>-->
<!-- </svg>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
</div>
<van-tabs v-model="tabIndex" sticky>
<!-- <van-tab title="目录">-->
<!-- <div style="height: 5px;background-color: #f6f7f9"></div>-->
<!-- <van-cell-group class="video-list">-->
<!-- <van-cell v-for="(o,i) in videoList" :key="o.id" @click="playVideo(o)">-->
<!-- <template #title>-->
<!-- <van-tag plain type="primary" style="margin-right: 10px">视频</van-tag>-->
<!-- <span style="margin-right: 10px">-->
<!-- {{i+1}}.-->
<!-- </span>-->
<!-- <span>-->
<!-- {{o.title}}-->
<!-- </span>-->
<!-- </template>-->
<!-- <template #label>-->
<!-- &lt;!&ndash; {{getWatchStatus(o)}}&ndash;&gt;-->
<!-- </template>-->
<!-- <template>-->
<!-- </template>-->
<!-- </van-cell>-->
<!-- </van-cell-group>-->
<!-- </van-tab>-->
<van-tab title="介绍">
<div style="height: 5px;background-color: #f6f7f9"></div>
@@ -124,33 +172,10 @@ layout("/mobile/platform.html"){
</van-cell>
</van-tab>
<van-tab title="目录">
<div style="height: 5px;background-color: #f6f7f9"></div>
<van-cell-group class="video-list">
<van-cell v-for="(o,i) in videoList" :key="o.id" @click="playVideo(o)">
<template #title>
<van-tag plain type="primary" style="margin-right: 10px">视频</van-tag>
<span style="margin-right: 10px">
{{i+1}}.
</span>
<span>
{{o.title}}
</span>
</template>
<template #label>
<!-- {{getWatchStatus(o)}}-->
</template>
<template>
</template>
</van-cell>
</van-cell-group>
</van-tab>
<van-tab title="学习记录">
<div style="height: 5px;background-color: #f6f7f9"></div>
<van-cell-group class="video-list">
<van-cell v-for="(o,i) in videoList" :key="o.id" @click="playVideo(o)">
<van-cell v-for="(o,i) in videoList" :key="o.id">
<template #title>
<van-tag plain type="primary" style="margin-right: 10px">视频</van-tag>
<span style="margin-right: 10px">
@@ -161,19 +186,21 @@ layout("/mobile/platform.html"){
</span>
</template>
<template #label>
<div v-if="o.everyDayMaxWatchNum && o.everyDayMaxWatchNum>0" style="padding: 10px 0;color: #0a84ff;white-space: normal">
<div v-if="o.everyDayMaxWatchNum && o.everyDayMaxWatchNum>0"
style="padding: 10px 0;color: #0a84ff;white-space: normal">
本视频在活动结束时每天最多只会统计
<span style="color: #0a84ff;font-weight: bold">{{o.everyDayMaxWatchNum}}</span>
次完整观看记录,您可以无限制的观看。
</div>
<div v-for="(v,k) in Object.groupBy(watchRecordList,v=>v.watchTime)" :key="k" class="myWatchRecord">
<div v-for="(v,index) in groupBy(watchRecordList,v=>v.watchTime)" :key="index"
class="myWatchRecord">
<div style="display: flex;justify-content: space-between">
<div>
{{moment(k).format('YYYY年MM月DD日')}}
{{moment(v.key).format('YYYY年MM月DD日')}}
</div>
<div style="color: #000000;">
观看次数
<span style="font-weight: bold">{{v.length}}</span>
<span style="font-weight: bold">{{v.items && v.items.filter(v=>v.finish).length}}</span>
</div>
</div>
</div>
@@ -184,9 +211,9 @@ layout("/mobile/platform.html"){
</van-tab>
</van-tabs>
<div class="bottom-wrap" v-show="isPlay">
<van-button type="info" block @click="endLearn">上传学习记录</van-button>
</div>
<!-- <div class="bottom-wrap" v-show="isPlay">-->
<!-- <van-button type="info" block @click="endLearn">上传学习记录</van-button>-->
<!-- </div>-->
</div>
@@ -213,6 +240,8 @@ layout("/mobile/platform.html"){
player: null,
vvv: []
}
},
@@ -221,8 +250,8 @@ layout("/mobile/platform.html"){
methods: {
async getVideoInfo() {
const {data} = await $.get('/mobile/trainEducation/getVideoList', {albumId: this.albumId})
this.vvv = data
this.videoList = data
},
async getAlbumInfo() {
const {data} = await $.get('/mobile/trainEducation/getAlbumInfo', {id: this.albumId})
@@ -364,7 +393,7 @@ layout("/mobile/platform.html"){
if (resp.code === 0) {
this.$modal.msgSuccess('上传成功')
} else {
this.$modal.msgError('上传成功')
this.$modal.msgError('上传失败')
}
}).catch(err => {
console.log(err)
@@ -373,14 +402,19 @@ layout("/mobile/platform.html"){
}
},
created() {
async created() {
// this.watchPage()
const id = this.GetQueryString("id")
const id = GetQueryString("id")
if (id) {
this.albumId = id
this.getAlbumInfo()
this.getVideoInfo()
this.getMyWatchRecord()
await this.getAlbumInfo()
await this.getVideoInfo()
await this.getMyWatchRecord()
if (this.videoList && this.videoList.length > 0) {
this.playVideo(this.videoList[0])
} else {
this.$toast('暂无视频学习')
}
}
}
})
@@ -46,8 +46,16 @@ layout("/layouts/platform.html"){
:prop="column.prop"
:sortable="column.sortable"
>
<template v-if="column.prop==='sumDuration'" scope="{row}">
{{(row.sumDuration / 60 / 60).toFixed(2) + 'h'}}
<!-- <template v-if="column.prop==='sumDuration'" scope="{row}">-->
<!-- {{(row.sumDuration / 60 / 60).toFixed(2) + 'h'}}-->
<!-- </template>-->
<template v-if="column.prop==='isQualified'" scope="{row}">
<span v-if="row.watchCount>=row.qualifiedNum" class="text-success">
是
</span>
<span v-else class="text-danger">
否
</span>
</template>
</el-table-column>
<!-- <el-table-column align="center" header-align="center" label="操作" width="200">-->
@@ -110,7 +118,8 @@ layout("/layouts/platform.html"){
{prop: 'unitname', label: '单位'},
{prop: 'unionname', label: '分工会'},
// {prop: 'studyDuration', label: '观看总时长'},
{prop: 'watchCount', label: '学习总次数'}
{prop: 'watchCount', label: '学习总次数'},
{prop: 'isQualified', label: '是否达标'},
],
viewTableColumns: [
{prop: 'username', label: '姓名'},
@@ -118,7 +127,7 @@ layout("/layouts/platform.html"){
{prop: 'unitname', label: '单位'},
{prop: 'unionname', label: '分工会'},
// {prop: 'studyDuration', label: '观看总时长'},
{prop: 'watchCount', label: '学习总次数'}
{prop: 'watchCount', label: '学习总次数'},
],
viewPageForm: {
pageNumber: 1,
@@ -140,6 +140,10 @@ layout("/layouts/platform.html"){
<el-input-number :min="1" :max="100" v-model="formData.everyDayMaxWatchNum"></el-input-number>
</el-form-item>
<el-form-item label="合格/达标次数" prop="qualifiedNum">
<el-input-number :min="1" :max="1000" v-model="formData.qualifiedNum"></el-input-number>
</el-form-item>
<el-form-item label="是否启用" prop="disabled">
<el-switch
v-model="formData.disabled"