Procházet zdrojové kódy

Merge branch 'develop' of http://52.130.252.100:10000/TEAMMODEL/TEAMModelOS into develop

zhouj1203@hotmail.com před 2 roky
rodič
revize
0347bfdd5c

+ 1 - 1
TEAMModelBI/ClientApp/public/index.html

@@ -12,7 +12,7 @@
     </title>
 </head>
 <script src="https://g.alicdn.com/dingding/dinglogin/0.0.5/ddLogin.js"></script>
-<script src="https://at.alicdn.com/t/c/font_2934132_o51rdr2yzbn.js"></script>
+<script src="https://at.alicdn.com/t/c/font_2934132_gbzdmtxtsi.js"></script>
 <script src="../src/access/iconfont.js"></script>
 
 <body>

+ 6 - 0
TEAMModelBI/ClientApp/src/router/index.js

@@ -207,6 +207,12 @@ const routes = [{
             },
         ]
     },
+    //消息通知跳转页面
+    {
+        path: "/resultPage",
+        name: "resultPage",
+        component: () => require.ensure([], (require) => require(`@/view/resultpage.vue`))
+    },
     {
         path: "/404",
         name: "404",

+ 0 - 3
TEAMModelBI/ClientApp/src/view/areamanage/statistics.vue

@@ -1791,9 +1791,6 @@ export default {
         areaData.value.research.series[0].data[3].value = res.areaScStats.actStats.homework
         //基础数据 右(版本占比)
         let basicsOneself = []; let standardOneself = []; let majorOneself = [];
-        // res.schoolInfos.forEach((item) => { item.service.includes('YMPCVCIM') || item.service.includes('VLY6J6N6') || item.service.includes('VABAJ6NV') ? majorOneself.push(item) : '' })
-        // res.schoolInfos.forEach((item) => { (item.scale === 300 && item.size === 500) || (item.size > 100 && (!item.service.includes('YMPCVCIM') && !item.service.includes('VLY6J6N6') && !item.service.includes('VABAJ6NV'))) ? standardOneself.push(item) : '' })
-        // res.schoolInfos.forEach((item) => { item.scale < 300 && item.size <= 100 ? basicsOneself.push(item) : '' })
         res.schoolInfos.forEach((item) => {
           item.service.includes('YMPCVCIM') || item.service.includes('VLY6J6N6') || item.service.includes('VABAJ6NV') ? majorOneself.push(item)
             : (item.scale === 300 && item.size === 500) || (item.size > 100 && (!item.service.includes('YMPCVCIM') && !item.service.includes('VLY6J6N6') && !item.service.includes('VABAJ6NV'))) ? standardOneself.push(item)

+ 75 - 0
TEAMModelBI/ClientApp/src/view/resultpage.vue

@@ -0,0 +1,75 @@
+<template>
+  <div class="backbox">
+    <div class="positionbox">
+      <div class="icons">
+        <svg class="icons-img" aria-hidden="true">
+          <use :xlink:href="lockicon"></use>
+        </svg>
+      </div>
+      <div class="title">{{text}}</div>
+    </div>
+  </div>
+</template>
+<script setup>
+import { ref } from 'vue'
+let a = ref()
+let lockicon = ref('#icon-chenggong1')
+let text = ref('操作成功')
+let headers = window.location.href.indexOf('code=')
+let tail = window.location.href.indexOf('&msg')
+let headerHost = window.location.href.slice(headers + 5, tail)
+console.log(headerHost, '33333')
+function init () {
+  let codeNum = headerHost
+  console.log(codeNum, '当前的值')
+  switch (codeNum) {
+    case '1':
+      lockicon.value = '#icon-chenggong1'; text.value = '操作成功';
+      break;
+    case '2':
+      lockicon.value = '#icon-71shibai'; text.value = '操作失败';
+      break;
+    case '0':
+      lockicon.value = '#icon-71shibai'; text.value = '凭据失效';
+      break;
+    case '400':
+      lockicon.value = '#icon-71shibai'; text.value = '参数异常';
+      break;
+    case '500':
+      lockicon.value = '#icon-71shibai'; text.value = '服务器异常';
+    default:
+      break;
+  }
+}
+init()
+</script>
+<style  scoped>
+.backbox {
+  width: 100%;
+  /* height: 100%; */
+  /* display: flex;
+  align-items: center;
+  justify-content: center; */
+}
+.positionbox {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+  text-align: center;
+}
+.icons,
+.title {
+  /* width: 100%; */
+  text-align: center;
+}
+.title {
+  font-size: 1.8em;
+  font-weight: bold;
+  margin-top: 2%;
+}
+.icons-img {
+  width: 8em;
+  height: 8em;
+}
+</style>

+ 15 - 15
TEAMModelBI/ClientApp/src/view/schoolmanage/index.vue

@@ -1,6 +1,6 @@
 <template>
-    <div class="school-analyse">
-        <!-- <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
+  <div class="school-analyse">
+    <!-- <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
             <el-tab-pane label="数据分析" name="first">
                 <Schoolanalyse></Schoolanalyse>
             </el-tab-pane>
@@ -8,29 +8,29 @@
                 <SchoolManage></SchoolManage>
             </el-tab-pane>
         </el-tabs> -->
-        <Schoolanalyse></Schoolanalyse>
-    </div>
+    <Schoolanalyse></Schoolanalyse>
+  </div>
 </template>
 <script>
 import { ref } from 'vue'
 import Schoolanalyse from './schoolAnalyse.vue'
 import SchoolManage from './schoolManege.vue'
 export default {
-    components: {
-        Schoolanalyse,
-        SchoolManage,
-    },
-    setup() {
-        const activeName = ref('first')
-        return { activeName }
-    },
+  components: {
+    Schoolanalyse,
+    SchoolManage,
+  },
+  setup () {
+    const activeName = ref('first')
+    return { activeName }
+  },
 }
 </script>
 <style scoped>
 .school-analyse {
-    width: 100%;
-    line-height: 20px;
-    padding: 1%;
+  width: 100%;
+  line-height: 20px;
+  padding: 0% 1%;
 }
 </style>
 <style>

+ 98 - 6
TEAMModelBI/ClientApp/src/view/schoolmanage/schoolAnalyse.vue

@@ -281,6 +281,50 @@
         </el-button>
       </div>
     </div>
+    <!--课堂信息-->
+    <div class="class-datas">
+      <div class="class-info">
+        <div class="class-box box1">
+          <div class="classbox-num">126</div>
+          <div class="classbox-title">课堂总数</div>
+        </div>
+        <div class="class-box box2">
+          <div class="classbox-num">126</div>
+          <div class="classbox-title">今日课堂</div>
+        </div>
+        <div class="class-box box3">
+          <div class="classbox-num">126</div>
+          <div class="classbox-title">本周课堂</div>
+        </div>
+        <div class="class-box box4">
+          <div class="classbox-num">126</div>
+          <div class="classbox-title">本月课堂</div>
+        </div>
+      </div>
+      <div class="class-total">
+        <div class="class-box total-box total1">
+          <div class="classbox-num total-num">126</div>
+          <div class="classbox-title total-title">课堂总时数</div>
+        </div>
+        <div class="class-box total-box total2">
+          <div class="classbox-num total-num">126</div>
+          <div class="classbox-title total-title">课堂总参与人次</div>
+        </div>
+        <div class="class-box total-box total3">
+          <div class="classbox-num total-num">126</div>
+          <div class="classbox-title total-title">课堂总互动次数</div>
+        </div>
+        <div class="class-box total-box total4">
+          <div class="classbox-num total-num">126</div>
+          <div class="classbox-title total-title">课堂任务总人次</div>
+        </div>
+        <div class="class-box total-box total5">
+          <div class="classbox-num total-num">126</div>
+          <div class="classbox-title total-title">课堂提问总题数</div>
+        </div>
+      </div>
+    </div>
+    <!--课堂信息end-->
     <div class="school-analyse-top">
       <div class="school-analyse-top-left" v-loading="detailsLoding.top" element-loading-background="rgba(0, 0, 0, 0.5)">
         <Bar :barData="detailsEchart.bar1"></Bar>
@@ -1510,7 +1554,7 @@ export default {
                   [
                     {
                       offset: 0,
-                      color: 'rgba(112, 103, 245, 0.5)',
+                      color: 'rgba(3,118,255,.5)',
                     },
                     {
                       offset: 1,
@@ -1523,7 +1567,7 @@ export default {
             },
             itemStyle: {
               normal: {
-                color: 'rgba(112, 103, 245, 0.3)',
+                color: 'rgba(3,118,255,.6)',
               },
             },
           },
@@ -2111,7 +2155,7 @@ export default {
         console.log(res, '年级、科目')
         if (res.state === 200) {
           //处理显示学校版本 
-          console.log(schoolDeatils.value, '查看标准')
+          // console.log(schoolDeatils.value, '查看标准')
           // schoolDeatils.value.versions = schoolDeatils.value.scale === 0 && schoolDeatils.value.size <= 100 ? '基础版' :
           // schoolDeatils.value.scale === 300 && schoolDeatils.value.size === 500 ? '标准版' : schoolDeatils.value.size > 100 && (!res.school.service.includes('YMPCVCIM') && !res.school.service.includes('VLY6J6N6') && !res.school.service.includes('VABAJ6NV')) ? '标准版' :
           // res.school.service.includes('YMPCVCIM') || res.school.service.includes('VLY6J6N6') || res.school.service.includes('VABAJ6NV') ? '专业版' : ''
@@ -2341,10 +2385,11 @@ export default {
 .schoolanalysebox {
   width: 100%;
   position: relative;
-  padding-top: 1%;
+  padding-top: 0.5%;
 }
 .school-analyse-header {
   width: 100%;
+  border-radius: 5px;
 }
 .school-analyse-headersbox {
   /* background-color: rgb(81, 86, 184); */
@@ -2354,7 +2399,7 @@ export default {
   background-position: center center;
   display: flex;
   justify-content: space-between;
-  border-radius: 10px;
+  /* border-radius: 10px; */
   flex-wrap: wrap;
 }
 .school-analyse-headersbox-item {
@@ -2386,6 +2431,7 @@ export default {
   background: #fff;
   margin-top: 1%;
   flex-wrap: wrap;
+  border-radius: 5px;
 }
 .school-analyse-top-left,
 .school-analyse-top-center,
@@ -2405,6 +2451,7 @@ export default {
   margin-top: 1%;
   background: #fff;
   padding: 1%;
+  border-radius: 5px;
 }
 .school-analyse-center-bottom {
   width: 100%;
@@ -2456,6 +2503,7 @@ export default {
   width: 48%;
   height: 28vh;
   background-color: #fff;
+  border-radius: 5px;
 }
 .school-list {
   width: 100%;
@@ -2627,10 +2675,11 @@ export default {
 }
 .bgimg {
   background-color: rgb(81, 86, 184);
-  background-image: url("../../assets/img/school-background.jpg");
+  /* background-image: url("../../assets/img/school-background.jpg"); */
   background-repeat: no-repeat;
   background-size: cover;
   background-position: center center;
+  background: linear-gradient(90deg, #36d1dc, #5b86e5);
 }
 .attendclass-title-icon,
 .attendclass-title-text {
@@ -2722,6 +2771,49 @@ export default {
 .school-search {
   padding-left: 20%;
 }
+.class-datas {
+  width: 100%;
+  /* height: 300px; */
+  background: #fff;
+  margin-top: 1%;
+  border-radius: 5px;
+}
+.class-info,
+.class-total {
+  width: 100%;
+  padding: 0.5% 1%;
+  display: flex;
+  flex-wrap: nowrap;
+  justify-content: space-between;
+}
+.class-box {
+  width: 23%;
+  text-align: center;
+  line-height: 40px;
+  /* background-color: #eef4fb; */
+  background-color: #f2f2f2;
+  border-radius: 5px;
+  box-shadow: 0px 0px 5px hsl(0deg 0% 0% /0.25);
+}
+.classbox-num {
+  font-size: 24px;
+  font-weight: 700;
+  color: #043d75;
+}
+.classbox-title {
+  font-size: 16px;
+  color: #9bb1c8;
+  font-weight: 600;
+}
+.total-box {
+  width: 18% !important;
+}
+/* .total-title {
+  color: #fab1a0 !important;
+}
+.total-num {
+  color: #ff9f1a !important;
+} */
 </style>
 <style>
 /* .school-list .el-table .el-table__cell {

+ 110 - 1
TEAMModelBI/ClientApp/src/view/systemConfig/pushmsg/createdpush.vue

@@ -5,6 +5,14 @@
     </div>
     <div class="clearfix"></div>
     <div class="stepsshow">
+      <div class="historybtn">
+        <el-button size="small" @click="drawer=true">
+          <svg class="lockicon" aria-hidden="true">
+            <use xlink:href="#icon-lishijilu"></use>
+          </svg>
+          历史消息
+        </el-button>
+      </div>
       <div class="stepsbox">
         <el-steps :active="active" align-center finish-status="success">
           <el-step title="基础信息" />
@@ -454,6 +462,46 @@
       </div>
       <!--确认发布end-->
     </div>
+    <!--历史消息&复用-->
+    <el-drawer v-model="drawer" title="历史消息" size="45%">
+      <div class="center-table">
+        <el-table :data="tableData" style="width: 100%" height="85vh" v-loading="loading" element-loading-text="数据加载中..." empty-text="暂无消息数据">
+          <el-table-column label="类型" align="center">
+            <template #header>
+              <el-select v-model="tableSelect.value" class="m-2" placeholder="类型选择" size="small" @change="changeTag">
+                <el-option v-for="item in tableSelect.options" :key="item.value" :label="item.label" :value="item.value" />
+              </el-select>
+            </template>
+            <template #default="scope">
+              <el-tag color="rgba(99, 205, 218,.5)" effect="dark" v-if="scope.row.type ===1">系统</el-tag>
+              <el-tag type="info" effect="dark" v-if="scope.row.type ===2">普通</el-tag>
+              <el-tag type="" effect="dark" v-if="scope.row.type ===3">提示</el-tag>
+              <el-tag type="success" effect="dark" v-if="scope.row.type ===4">特殊</el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column prop="theme" label="消息主题" align="center" />
+          <el-table-column prop="content" label="消息内容" align="center" />
+          <el-table-column prop="address" label="接收产品" align="center">
+            <template #default="scope">
+              <!-- <el-tag class="ml-2 product-tag" v-for="(item,index) in scope.row.crowd.types" :key="index" :type="item ==='hita5' || item ==='HiTA'? 'success':item ==='HiTeach' ? '':'info'" size="small" effect="light ">{{item}}</el-tag> -->
+              {{scope.row.crowd.types}}
+            </template>
+          </el-table-column>
+          <el-table-column prop="time" label="时间" align="center" />
+          <el-table-column label="操作" fixed="right" align="center">
+            <template #default="scope">
+              <div class="look-btn">
+                <el-button type="primary" size="small" @click="reuseCopy(scope.row)">复用此条消息</el-button>
+              </div>
+              <!-- <div class="del-btn">
+              <el-button type="danger" size="small">删除</el-button>
+            </div> -->
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+    </el-drawer>
+    <!--历史消息&复用end!-->
   </div>
 
 </template>
@@ -598,6 +646,19 @@ const testtype = [
   { name: 'HiTA', type: 'success' },
   { name: 'IES5', type: 'info' },
 ]
+let drawer = ref(false)
+let tableData = ref()
+let originalData = ref()
+let loading = ref(false)
+let tableSelect = ref({
+  value: 'all',
+  options: [
+    { value: 'all', label: '全部' },
+    { value: 'common', label: '普通' },
+    { value: 'hint', label: '提示' },
+    { value: 'special', label: '特殊' },
+  ]
+})
 let receivedatas = computed(() => {
   return receiveArr.value.listArea.concat(receiveArr.value.listSchool).concat(receiveArr.value.listPersonage)
 })
@@ -691,6 +752,27 @@ function initSchool () {
       ElMessage.error('获取学校数据失败')
     })
   })
+
+  //获取历史消息列表
+  loading.value = true
+  proxy.$api.getMsglist({}).then((res) => {
+    if (res.state === 200) {
+      res.bINotices.forEach((item) => {
+        item.time = proxy.$common.timestampToTime(item.sendTime, 'all');
+        item.type = Number(item.type) + 1
+        item.receive = []
+        item.crowd.areaIds.forEach((areas) => { item.receive.push({ id: areas.id, name: areas.name, dataType: 'area' }) })
+        item.crowd.schoolIds.forEach((school) => { item.receive.push({ id: school.id, name: school.name, dataType: 'school' }) })
+        item.crowd.tmdIds.forEach((tmdinfo) => { item.receive.push({ id: tmdinfo.id, name: tmdinfo.name, dataType: 'tmdinfo' }) })
+      })
+      tableData.value = res.bINotices
+      originalData.value = res.bINotices
+    }
+    loading.value = false
+  }).catch((err) => {
+    ElMessage.error('API异常,获取历史消息数据失败')
+    loading.value = false
+  })
 }
 //点击学区下级
 function subordinate (id) {
@@ -753,7 +835,7 @@ function publish () {
     type: Number(data.basic.type) - 1,
     jumpUrl: data.basic.skipstate ? data.basic.skipUrl : '',
     callbackName: data.basic.callbackstate && data.basic.callbackFn === '1' ? '同意' : '查看',
-    RefuseName: data.basic.callbackstate && data.basic.callbackFn === '1' ? '拒绝' : '',
+    refuseName: data.basic.callbackstate && data.basic.callbackFn === '1' ? '拒绝' : '',
     theme: data.basic.title,
     content: data.basic.content,
     tmdIds: personageArr,
@@ -839,6 +921,26 @@ function clearall () {
   receiveArr.value.listPersonage = []
   receiveArr.value.listBatchperson = []
 }
+function changeTag (val) {
+  console.log(val)
+  let values = val
+  if (values === 'all') {
+    tableData.value = originalData.value
+  } else if (values === 'common') {
+    tableData.value = originalData.value.filter((item) => { return item.type === 2 })
+  } else if (values === 'hint') {
+    tableData.value = originalData.value.filter((item) => { return item.type === 3 })
+  } else if (values === 'special') {
+    tableData.value = originalData.value.filter((item) => { return item.type === 4 })
+  }
+}
+function reuseCopy (value) {
+  console.log(value)
+  value.type = value.type.toString()
+  reusedata(value)
+  drawer.value = false
+  ElMessage.success('已复用此条消息相关内容')
+}
 initSchool()
 watch(preciseSearch, (newdata) => {
   if (newdata.trim().length !== 0) {
@@ -893,6 +995,7 @@ watch(store.state.msgData, (newvalue) => {
   border-radius: 5px;
   justify-content: start;
   background-color: #fff;
+  position: relative;
 }
 .stepsbox {
   width: 100%;
@@ -903,6 +1006,7 @@ watch(store.state.msgData, (newvalue) => {
   width: 100%;
   /* height: 60vh; */
   margin: 0 auto;
+  position: relative;
 }
 .basicsdata {
   justify-content: center;
@@ -1296,6 +1400,11 @@ watch(store.state.msgData, (newvalue) => {
   text-align: right;
   padding-right: 2%;
 }
+.historybtn {
+  position: absolute;
+  top: 0.5%;
+  right: 0.5%;
+}
 </style>
 <style>
 .skip-switch .el-form-item__content {

+ 1 - 1
TEAMModelBI/Controllers/BICommon/BINoticeController.cs

@@ -234,7 +234,7 @@ namespace TEAMModelBI.Controllers.BICommon
 
                 bINotice = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").CreateItemAsync<BINotice>(bINotice, new PartitionKey("BINotice"));
                 //BI发送端外通知
-                _coreAPIHttpService.BIPushNotify(bINotice, new Dictionary<string, object> { { "tmdid", _tmdIds }, { "tmdname", _tmdName } }, _option.Location, _configuration, _dingDing);
+                _coreAPIHttpService.BIPushNotify(bINotice, new Dictionary<string, object> { { "tmdid", _tmdIds }, { "sendId", bINotice.crowdIds} }, _option.Location, _configuration, _dingDing);
 
                 return Ok(new { state = RespondCode.Ok, bINotice });
             }

+ 131 - 2
TEAMModelBI/Controllers/BISystem/CoreController.cs

@@ -12,6 +12,17 @@ using TEAMModelOS.SDK.DI;
 using Microsoft.Extensions.Options;
 using System.Net.Http;
 using TEAMModelOS.Models;
+using static TEAMModelOS.SDK.CoreAPIHttpService;
+using System.Collections.Generic;
+using System.IdentityModel.Tokens.Jwt;
+using System.Text;
+using System.Web;
+using TEAMModelOS.SDK.Extension;
+using System.Net;
+using Microsoft.Extensions.Configuration;
+using System.Configuration;
+using TEAMModelOS.SDK.Models.Cosmos.BI;
+using TEAMModelOS.SDK.Context.Constant;
 
 namespace TEAMModelBI.Controllers.BISystem
 {
@@ -25,14 +36,18 @@ namespace TEAMModelBI.Controllers.BISystem
         private readonly AzureStorageFactory _azureStorage;
         private readonly DingDing _dingDing;
         private readonly IPSearcher _searcher;
+        private readonly CoreAPIHttpService _coreAPIHttpService;
+        private readonly IConfiguration _configuration;
         private readonly Option _option;
 
 
-        public CoreController(AzureCosmosFactory azureCosmos, AzureRedisFactory azureRedis, AzureStorageFactory azureStorage, DingDing dingDing, IOptionsSnapshot<Option> option, IPSearcher searcher, IHttpClientFactory httpClient)
+        public CoreController(AzureCosmosFactory azureCosmos, AzureRedisFactory azureRedis, CoreAPIHttpService coreAPIHttpService, AzureStorageFactory azureStorage, DingDing dingDing, IOptionsSnapshot<Option> option, IConfiguration configuration, IPSearcher searcher, IHttpClientFactory httpClient)
         {
             _azureCosmos = azureCosmos;
             _azureRedis = azureRedis;
-            _azureStorage= azureStorage;
+            _coreAPIHttpService = coreAPIHttpService;
+            _configuration = configuration;
+            _azureStorage = azureStorage;
             _dingDing = dingDing;
             _searcher = searcher;
             _option = option?.Value;
@@ -94,5 +109,119 @@ namespace TEAMModelBI.Controllers.BISystem
 
             return Ok(new { os, version, description, nowtime, region, ip });
         }
+
+
+        public class NotifyData
+        {
+            public string notifyCode { get; set; }
+            public string data { get; set; }
+            public int notifyEvent { get; set; }
+            public string ticket { get; set; }
+            public string token { get; set; }
+        }
+
+        /// <summary>
+        /// 处理信息
+        /// </summary>
+        /// <param name="notifyData"></param>
+        /// <returns></returns>
+        [HttpGet("process-notify")]
+        public async Task<IActionResult> ProcessNotify([FromQuery] NotifyData notifyData)
+        {
+            string msg = "";
+            /// code =-1 参数异常,0 凭据失效 1不是管理员,2操作成功,3服务端异常
+            int code = -1;
+            string scope = "";
+            //string lang = _option.Location.Contains("China") ? "zh-cn" : "en-us";
+            //string path = Path.Combine("", $"Lang/{lang}.json");
+            //var jsonAuth = System.IO.File.ReadAllText(path, Encoding.UTF8);
+            //var jsonData = jsonAuth.ToObject<JsonElement>();
+            //var status = jsonData.GetProperty("notify-status");
+            var status = "";
+            try
+            {
+                string opttmdid = "";
+                if (!string.IsNullOrWhiteSpace(notifyData.ticket))
+                {
+                    var clientID = _configuration.GetValue<string>("HaBookAuth:CoreService:clientID");
+                    (HttpStatusCode statusCode, CoreAPIToken token) = await _coreAPIHttpService.GetCoreAPIoAuth2Token(
+                         new Dictionary<string, object> { { "client_id", clientID }, { "grant_type", "authorization_code" }, { "code", notifyData.ticket } }, _option.Location, _configuration, _dingDing);
+                    if (statusCode.Equals(HttpStatusCode.OK))
+                    {
+                        var jwt = new JwtSecurityToken(token.id_token);
+                        opttmdid = jwt.Payload.Sub;
+                    }
+                    else
+                    {
+                        code = 0;
+                        msg = "凭据失效";
+                    }
+                    scope = "HiTA";
+                }
+                else if (!string.IsNullOrWhiteSpace(notifyData.token) && string.IsNullOrWhiteSpace(opttmdid))
+                {
+                    var jwt = new JwtSecurityToken(notifyData.token);
+                    opttmdid = jwt.Payload.Sub;
+                    scope = "BI";
+                }
+                if (string.IsNullOrWhiteSpace(opttmdid))
+                {
+                    code = 400;
+                    msg = "参数异常";
+                    //msg = status.TryGetProperty($"code{code}", out JsonElement text) ? $"{text}" : msg;
+                }
+                var rdata = HttpUtility.UrlDecode(notifyData.data, Encoding.UTF8);
+                var dataByte = Convert.FromBase64String(rdata);
+                string data = Encoding.Unicode.GetString(dataByte);
+                Dictionary<string, object> dict = data.ToObject<Dictionary<string, object>>();
+                dict.TryGetValue("notifyCode", out object notifyCode); //消息类型
+                dict.TryGetValue("noticeId", out object noticeId);   //存在BI中的消息id
+                dict.TryGetValue("tmdid", out object _tmdid);   //发送人ID
+                dict.TryGetValue("sendId", out object _sendId);  //接收人群
+
+                switch ($"{notifyCode}")
+                {
+                    case "notify_agree": //同意拒绝
+                        if (notifyData.notifyEvent == 1) 
+                        {
+                            code = 1;
+                            msg = "操作成功";
+                        }
+                        if (notifyData.notifyEvent == 2)
+                        {
+                            code = 2;
+                            msg = "操作成功";
+                        }
+                        break;
+                    case "notify_see":  //查看
+                        code = 1;
+                        msg = "查看成功";
+                        break;
+                    default:  //默认
+                        code = 3;
+                        msg = "普通通知";
+                        break;
+                }
+
+            }
+            catch (Exception ex)
+            {
+                await _dingDing.SendBotMsg($"{ex.Message}\n{ex.StackTrace}\n{notifyData.ToJsonString()}", GroupNames.成都开发測試群組);
+                code = 500;
+                msg = "服务端异常";
+            }
+
+            if (scope.Equals("HiTA"))
+            {
+                string HostName = HttpContext.GetHostName();
+                var rurl = $"https://{HostName}/resultPage?code={code}&msg={HttpUtility.UrlEncode(msg)}";
+                return Redirect(rurl);
+            }
+            else
+            {
+                return Ok(new { code, msg });
+            }
+        }
+
     }
 }

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 34 - 6
TEAMModelOS.SDK/DI/CoreAPI/CoreAPIHttpService.cs


+ 10 - 1
TEAMModelOS.SDK/Models/Service/BI/BIStats.cs

@@ -894,8 +894,17 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                         }
                     }
                 }
+                string str = "";
+                if (scId.Count > 0)
+                {
+                    str = $"定时未清理学校id:{scId.ToJsonString()}";
+                }
+                else 
+                {
+                    str = "定时清理学校统计成功";
+                }
 
-                await _dingDing.SendBotMsg($"BI,{Environment.GetEnvironmentVariable("Option:Location")},SetStatsZeroPoint() \n定时未清理学校id:{scId.ToJsonString()}", GroupNames.成都开发測試群組);
+                await _dingDing.SendBotMsg($"BI,{Environment.GetEnvironmentVariable("Option:Location")},SetStatsZeroPoint() {str}\n  ", GroupNames.成都开发測試群組);
             }
             catch (Exception ex)
             {

+ 10 - 1
TEAMModelOS/ClientApp/public/lang/en-US.js

@@ -1011,7 +1011,7 @@ const LANG_EN_US = {
         listSchoolTips2: ', personal list cannot have cross-school students.',
         listSchoolTips3: 'Other',
         qrcodeErr: 'Failed to generate QR code',
-        edRdName: 'Change lesson record name',
+        edRdName: 'Edit lesson record',
         delAcTitle: 'Delete Activity Record',
         delAcContent: 'The activity record data cannot be recovered after deletion, are you sure to delete this activity record?',
         fvt: 'Collect',
@@ -1311,6 +1311,15 @@ const LANG_EN_US = {
 
         //ClassRecord.vue
         rcd: {
+            cover: {
+                cover: 'Cover',
+                title: 'Modify cover',
+                tip: 'The recommended upload ratio of the cover image is 4:3, and the size should not exceed 2M',
+                preview: 'Preview the new cover',
+                undo: 'Undo',
+                tip2: 'Only support the uploading image file in JPEG, PNG format! ',
+                tip3: 'The image size cannot exceed 2M! '
+            },
             ctime: 'Class Time:',
             rtn: 'Click to go back',
             rcdLabel: 'Interaction Records',

+ 10 - 1
TEAMModelOS/ClientApp/public/lang/zh-CN.js

@@ -1011,7 +1011,7 @@ const LANG_ZH_CN = {
         listSchoolTips2: '学校学生,个人名单不能添加跨校学生。',
         listSchoolTips3: '其他',
         qrcodeErr: '二维码生成失败',
-        edRdName: '修改课堂记录名称',
+        edRdName: '修改课堂记录',
         delAcTitle: '删除活动记录',
         delAcContent: '活动记录数据删除后将无法找回,确认删除当前活动记录吗?',
         fvt: '收藏',
@@ -1310,6 +1310,15 @@ const LANG_ZH_CN = {
         },
         //ClassRecord.vue
         rcd: {
+            cover: {
+                cover: '封面',
+                title: '修改封面',
+                tip: '封面图建议上传比例为4:3,大小不超过2M的图片',
+                preview: '预览新封面',
+                undo: '撤销',
+                tip2: '仅支持上传格式为jpg,jpeg,png的图片文件!',
+                tip3: '图片大小不能超过2M!'
+            },
             ctime: '上课时间:',
             rtn: '返回',
             rcdLabel: '互动记录',

+ 10 - 1
TEAMModelOS/ClientApp/public/lang/zh-TW.js

@@ -1011,7 +1011,7 @@ const LANG_ZH_TW = {
         listSchoolTips2: '學校學生,個人名單不能增加跨校學生。',
         listSchoolTips3: '其他',
         qrcodeErr: 'QR Code生成失敗',
-        edRdName: '修改課堂記錄名稱',
+        edRdName: '修改課堂記錄',
         delAcTitle: '刪除活動記錄',
         delAcContent: '活動記錄數據刪除後將無法找回,確認刪除當前活動記錄嗎?',
         fvt: '收藏',
@@ -1312,6 +1312,15 @@ const LANG_ZH_TW = {
 
         //ClassRecord.vue
         rcd: {
+            cover: {
+                cover: '封面',
+                title: '修改封面',
+                tip: '封面圖片建議上傳比例為4:3,大小不超過2M',
+                preview: '預覽新封面',
+                undo: '復原',
+                tip2: '僅支持上傳格式為 jpg, jpeg, png 的圖片檔案! ',
+                tip3: '圖片大小不能超過2M! '
+            },
             ctime: '上課時間:',
             rtn: '返回',
             rcdLabel: '互動記錄',

+ 1 - 1
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperViewBox/ArtView.vue

@@ -456,7 +456,7 @@ export default {
         },
         // 查看智音作答详情
         zyModule(busType, isUrl) {
-            const url = 'https://tstamesopen.aimusic.art'
+            const url = 'https://amesopen.aimusic.art/'
             // 智音提供的APP_ID
             const appid = '8a68f563f3384662acbc268336b98ae2'
             //第三方token

+ 4 - 1
TEAMModelOS/ClientApp/src/components/student-web/SettingView/Setting.vue

@@ -630,9 +630,12 @@ export default {
         },
         async handleUpload(file) {
             if(this.student) {
+                let imgName = file.name.split('.')
+                // 修改文件名为账号
+                let newFile = new File([file], this.userInfo.sub + '.' + imgName[imgName.length - 1], {type: file.type})
                 let blobInfo = await this.$api.blob.blobSasRCW({name: this.userInfo.azp, role: "student"})
                 let blobTool = new BlobTool(blobInfo.url, this.userInfo.azp, '?' + blobInfo.sas, 'school')
-                blobTool.upload(file, {path:'avatar', checkSize: false}).then(
+                blobTool.upload(newFile, {path:'avatar', checkSize: false}).then(
                     res => {
                         console.log(res.url);
                         let stuParam = {

+ 83 - 18
TEAMModelOS/ClientApp/src/css/common-style.less

@@ -9,39 +9,61 @@
 
 .custom-label-disabeld {
     cursor: not-allowed !important;
-    color: @second-textColor !important;
+    color: @second-textColor  !important;
 
     &:hover {
-        color: @second-textColor !important;
+        color: @second-textColor  !important;
     }
 }
+
 /*不透明文字气泡*/
 .opaque-tooltip .ivu-tooltip-inner {
-    background: rgba(70,76,91,1);
+    background: rgba(70, 76, 91, 1);
 }
 
 .custom-scroll-bar {
-    div::-webkit-scrollbar { /*滚动条整体样式*/
-        width: 5px; /*高宽分别对应横竖滚动条的尺寸*/
+    div::-webkit-scrollbar {
+        /*滚动条整体样式*/
+        width: 5px;
+        /*高宽分别对应横竖滚动条的尺寸*/
         height: 7px;
     }
 
-    div::-webkit-scrollbar-thumb { /*滚动条里面小方块*/
-        -webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
+    div::-webkit-scrollbar-thumb {
+        /*滚动条里面小方块*/
+        -webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
         background: #bebebe;
     }
 
-    div::-webkit-scrollbar-track { /*滚动条里面轨道*/
-        -webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
+    div::-webkit-scrollbar-track {
+        /*滚动条里面轨道*/
+        -webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
         background: rgba(222, 222, 222, 0);
     }
 }
+
 .common-save-btn .ivu-btn {
     border: none;
     color: #40A8F0;
 }
+
 .common-save-btn {
-    .ivu-btn.disabled, .ivu-btn.disabled.active, .ivu-btn.disabled:active, .ivu-btn.disabled:focus, .ivu-btn.disabled:hover, .ivu-btn[disabled], .ivu-btn[disabled].active, .ivu-btn[disabled]:active, .ivu-btn[disabled]:focus, .ivu-btn[disabled]:hover, fieldset[disabled] .ivu-btn, fieldset[disabled] .ivu-btn.active, fieldset[disabled] .ivu-btn:active, fieldset[disabled] .ivu-btn:focus, fieldset[disabled] .ivu-btn:hover {
+
+    .ivu-btn.disabled,
+    .ivu-btn.disabled.active,
+    .ivu-btn.disabled:active,
+    .ivu-btn.disabled:focus,
+    .ivu-btn.disabled:hover,
+    .ivu-btn[disabled],
+    .ivu-btn[disabled].active,
+    .ivu-btn[disabled]:active,
+    .ivu-btn[disabled]:focus,
+    .ivu-btn[disabled]:hover,
+    fieldset[disabled] .ivu-btn,
+    fieldset[disabled] .ivu-btn.active,
+    fieldset[disabled] .ivu-btn:active,
+    fieldset[disabled] .ivu-btn:focus,
+    fieldset[disabled] .ivu-btn:hover {
         color: #606060;
         background: none !important;
     }
@@ -53,9 +75,11 @@
     cursor: not-allowed !important;
     color: #a5a5a5 !important;
 }
-.ivu-table:before{
+
+.ivu-table:before {
     height: 0px !important;
 }
+
 //自定义check-box style
 .custom-check-box {
     user-select: none;
@@ -69,6 +93,7 @@
     .ivu-checkbox {
         margin-right: 5px;
     }
+
     .ivu-checkbox-inner {
         width: 18px;
         height: 18px;
@@ -87,6 +112,7 @@
         border-color: #4d4d4d;
         border-width: 1px;
         margin-right: 5px;
+
         &::after {
             content: "";
             display: block;
@@ -105,8 +131,9 @@
         }
     }
 }
+
 //自定义radio-box
-.custom-radio-box{
+.custom-radio-box {
     .ivu-select-selection {
         background: transparent;
         border-color: #363738;
@@ -125,6 +152,7 @@
         border-color: #c3c3c3;
         border-width: 1px;
         margin-right: 5px;
+
         &::after {
             content: "";
             display: block;
@@ -141,6 +169,7 @@
             border-color: #0094ff;
         }
     }
+
     .ivu-checkbox-inner {
         width: 18px;
         height: 18px;
@@ -158,6 +187,7 @@
         border-color: #4d4d4d;
         border-width: 1px;
         margin-right: 5px;
+
         &::after {
             content: "";
             display: block;
@@ -181,7 +211,8 @@
     display: inline-block;
     // width: 30%;
     min-width: 303px;
-    .pane{
+
+    .pane {
         margin-right: 50px;
         color: #777777;
         line-height: 45px;
@@ -189,16 +220,19 @@
         cursor: pointer;
         vertical-align: middle;
         padding: 9px 0px;
-        &.active{
+
+        &.active {
             font-weight: bold;
             color: var(--tabs-bottom-color);
             border-bottom: 2px var(--tabs-bottom-color) solid;
         }
     }
 }
-.custom-modal-top .ivu-modal{
+
+.custom-modal-top .ivu-modal {
     top: 60px;
 }
+
 //修改名称对话框
 .ed-name-modal .ivu-modal-header {
     border-bottom: none;
@@ -208,6 +242,7 @@
 
     .modal-header {
         display: inline-block;
+
         &::before {
             content: "";
             display: inline-block;
@@ -218,19 +253,49 @@
         }
     }
 }
-.edit-name-content{
+
+.edit-name-content {
     padding: 0px 30px;
-    .edit-name-label{
+
+    .edit-name-label {
         font-size: 14px;
         color: #515a6e;
         margin-bottom: 15px;
         font-weight: 700;
     }
-    .confirm-btn{
+
+    .confirm-btn {
         background: #70B1E7;
         color: white;
         margin: 40px 0px 35px 0px;
         height: 40px;
         border: none;
     }
+
+    .ed-cover {
+        display: flex;
+
+        .record-poster-wrap {
+            margin: 0;
+        }
+
+        .upload-btn {
+            width: 100px;
+            height: 65px;
+            display: inline-flex;
+            margin-left: 10px;
+            border: 2px dashed rgb(182, 182, 182);
+            justify-content: center;
+            align-items: center;
+            flex-direction: column;
+            cursor: pointer;
+
+            .ivu-icon {
+                font-size: 24px;
+                font-weight: bold;
+            }
+        }
+
+
+    }
 }

+ 1 - 1
TEAMModelOS/ClientApp/src/utils/blobTool.js

@@ -6,7 +6,7 @@ import store from '@/store'
 import FileSaver from "file-saver";
 import JSZip from "jszip";
 
-const BLOB_PATH = ['avatar', 'audio', 'doc', 'exam', 'image', 'elegant', 'item', 'notice', 'other', 'paper', 'syllabus', 'res', 'student', 'survey', 'temp', 'thum', 'video', 'vote', 'jyzx', 'train', 'yxpt', 'homework', 'policy', 'public', 'art']
+const BLOB_PATH = ['avatar', 'audio', 'doc', 'exam', 'image', 'elegant', 'item', 'notice', 'other', 'paper', 'syllabus', 'res', 'records', 'student', 'survey', 'temp', 'thum', 'video', 'vote', 'jyzx', 'train', 'yxpt', 'homework', 'policy', 'public', 'art']
 const { BlobServiceClient } = require("@azure/storage-blob")
 
 //获取文件后缀和类型

+ 1 - 1
TEAMModelOS/ClientApp/src/view/artexam/SelectMusic.vue

@@ -24,7 +24,7 @@ export default {
   },
   created() {
     // 链接
-    const url = 'https://tstamesopen.aimusic.art'
+    const url = 'https://amesopen.aimusic.art'
     // 智音提供的APP_ID
     const appid = '8a68f563f3384662acbc268336b98ae2'
     //第三方token

+ 1 - 1
TEAMModelOS/ClientApp/src/view/artexam/ZYMusicDetail.vue

@@ -31,7 +31,7 @@ export default {
   created() {
 
     // 链接
-    const url = 'https://tstamesopen.aimusic.art'
+    const url = 'https://amesopen.aimusic.art'
     // 智音提供的APP_ID
     const appid = '8a68f563f3384662acbc268336b98ae2'
     //第三方token

+ 36 - 36
TEAMModelOS/ClientApp/src/view/homepage/RcdPoster.vue

@@ -1,48 +1,48 @@
 <template>
-    <div>
-        <img class="rcd-poster-img" :src="poster" @error="imgError">
-    </div>
+  <div>
+    <img class="rcd-poster-img" :src="poster" @error="imgError">
+  </div>
 </template>
 <script>
 export default {
-    props: {
-        poster: {
-            type: String,
-            default: ''
-        }
-    },
-    data() {
-        return {
-
-        }
-    },
-    methods: {
-        imgError(event) {
-            let img = event.srcElement;
-            let local = localStorage.getItem('local')
-            switch (local) {
-                case 'zh-cn':
-                    img.src = require('@/assets/image/no-poster-cn.png')
-                    break
-                case 'zh-tw':
-                    img.src = require('@/assets/image/no-poster-tw.png')
-                    break
-                case 'en':
-                    img.src = require('@/assets/image/no-poster-en.png')
-                    break
-                default:
-                    img.src = require('@/assets/image/no-poster-en.png')
-                    break
-            }
+  props: {
+    poster: {
+      type: String,
+      default: ''
+    }
+  },
+  data() {
+    return {
 
-            img.onerror = null; //防止闪图
-        },
     }
+  },
+  methods: {
+    imgError(event) {
+      let img = event.srcElement;
+      let local = localStorage.getItem('local')
+      switch (local) {
+        case 'zh-cn':
+          img.src = require('@/assets/image/no-poster-cn.png')
+          break
+        case 'zh-tw':
+          img.src = require('@/assets/image/no-poster-tw.png')
+          break
+        case 'en':
+          img.src = require('@/assets/image/no-poster-en.png')
+          break
+        default:
+          img.src = require('@/assets/image/no-poster-en.png')
+          break
+      }
+
+      img.onerror = null; //防止闪图
+    },
+  }
 }
 </script>
 <style scoped lang="less">
 .rcd-poster-img {
-    max-width: 100%;
-    max-height: 100%;
+  width: 100%;
+  max-height: 100%;
 }
 </style>

+ 496 - 429
TEAMModelOS/ClientApp/src/view/mycourse/record/Record.vue

@@ -1,461 +1,528 @@
 <template>
-    <div class="record-container">
-        <div class="exam-action-wrap">
-            <Checkbox v-model="filterExpire" style="margin-right:35px;user-select:none" @on-change="handleFilterExpire">
-                {{$t('cusMgt.filterExp')}}
-            </Checkbox>
-            <span>
-                <Tooltip :max-width="180" :content="$t('cusMgt.autoShareTips')">
-                    <Icon type="ios-information-circle-outline" />
-                </Tooltip>
-                {{$t('cusMgt.autoShare')}}
+  <div class="record-container">
+    <div class="exam-action-wrap">
+      <Checkbox v-model="filterExpire" style="margin-right:35px;user-select:none" @on-change="handleFilterExpire">
+        {{$t('cusMgt.filterExp')}}
+      </Checkbox>
+      <span>
+        <Tooltip :max-width="180" :content="$t('cusMgt.autoShareTips')">
+          <Icon type="ios-information-circle-outline" />
+        </Tooltip>
+        {{$t('cusMgt.autoShare')}}
+      </span>
+      <i-switch :loading="sLoading" v-model="isAuto" size="small" @on-change="setAutoPublish" />
+    </div>
+    <vuescroll>
+      <Alert v-show="rcdParams.scope == 'private'" show-icon type="warning" closable>
+        {{$t('cusMgt.recordTips')}}
+      </Alert>
+      <div class="rcd-item" v-for="(item,index) in recordList" :key="index" @click="toClassRecoerd(index)">
+        <RcdPoster class="record-poster-wrap" :poster="item.poster"></RcdPoster>
+        <div style="flex:1">
+          <p class="record-name" style="padding-left:10px">
+            {{item.name}}
+            <span class="item-icon-wrap">
+              <Icon type="md-create" class="common-item-icon ed-name" @click.stop="editRecordName(index)" :title="$t('cusMgt.edRdName')" />
+              <Icon type="md-trash" class="common-item-icon delete-item" @click.stop="delRecord(item)" :title="$t('cusMgt.delRcd')" />
+              <Icon :type="item.isShare ? 'ios-share-alt':'ios-share-alt-outline'" :size="20" :class="['common-item-icon','share-student',item.isShare ? 'share-active':'']" @click.stop="toggleShare(item)" :title="item.isShare ? $t('cusMgt.unShare') : $t('cusMgt.shareToStu')" />
+              <Icon :type="isFavorite(item.id) ? 'md-heart':'md-heart-outline'" :class="['common-item-icon','heart-item',isFavorite(item.id) ? 'heart-active':'']" @click.stop="toggleFavorite(item)" :title="isFavorite(item.id) ? $t('cusMgt.unfvt') : $t('cusMgt.fvt')" />
             </span>
-            <i-switch :loading="sLoading" v-model="isAuto" size="small" @on-change="setAutoPublish" />
-        </div>
-        <vuescroll>
-            <Alert v-show="rcdParams.scope == 'private'" show-icon type="warning" closable>
-                {{$t('cusMgt.recordTips')}}
-            </Alert>
-            <div class="rcd-item" v-for="(item,index) in recordList" :key="index" @click="toClassRecoerd(index)">
-                <RcdPoster class="record-poster-wrap" :poster="item.poster"></RcdPoster>
-                <div style="flex:1">
-                    <p class="record-name" style="padding-left:10px">
-                        {{item.name}}
-                        <span class="item-icon-wrap">
-                            <Icon type="md-create" class="common-item-icon ed-name" @click.stop="editRecordName(index)" :title="$t('cusMgt.edRdName')" />
-                            <Icon type="md-trash" class="common-item-icon delete-item" @click.stop="delRecord(item)" :title="$t('cusMgt.delRcd')" />
-                            <Icon :type="item.isShare ? 'ios-share-alt':'ios-share-alt-outline'" :size="20" :class="['common-item-icon','share-student',item.isShare ? 'share-active':'']" @click.stop="toggleShare(item)" :title="item.isShare ? $t('cusMgt.unShare') : $t('cusMgt.shareToStu')" />
-                            <Icon :type="isFavorite(item.id) ? 'md-heart':'md-heart-outline'" :class="['common-item-icon','heart-item',isFavorite(item.id) ? 'heart-active':'']" @click.stop="toggleFavorite(item)" :title="isFavorite(item.id) ? $t('cusMgt.unfvt') : $t('cusMgt.fvt')" />
-                        </span>
-                    </p>
-                    <div style="padding-left:10px;margin-top:10px">
-                        <!-- 出席人数 -->
-                        <span class="record-info">
-                            <span>{{$t('cusMgt.rcd.attendCount')}}:</span>
-                            <span class="record-info-value"> {{item.attendCount}}{{$t('unit.text7')}}</span>
-                        </span>
-                        <!-- 总计分 -->
-                        <span class="record-info">
-                            <span>{{$t('cusMgt.rcdScore')}}</span>
-                            <span class="record-info-value">
-                                {{item.totalPoint}}
-                            </span>
-                        </span>
-                        <!-- 作品总数 -->
-                        <span class="record-info">
-                            <span>{{$t('cusMgt.rcd.colctCount')}}: </span>
-                            <span class="record-info-value">
-                                {{item.collateCount}}
-                            </span>
-                        </span>
-                        <!-- 测验得分率 -->
-                        <span class="record-info">
-                            <span>{{$t('cusMgt.rcd.scoreRate')}}: </span>
-                            <span class="record-info-value">
-                                {{item.examPointRate}}
-                            </span>
-                        </span>
-                        <!-- 互动总数 -->
-                        <span class="record-info">
-                            <span>{{$t('cusMgt.rcd.interactionCount')}}: </span>
-                            <span class="record-info-value">
-                                {{item.clientInteractionCount}}
-                            </span>
-                        </span>
-                        <!-- 时长 -->
-                        <span class="record-info">
-                            <span>{{$t('cusMgt.duration')}}</span>
-                            <span class="record-info-value">{{handleDuration(item.duration)}}</span>
-                        </span>
-                        <!-- 过期时间 -->
-                        <span class="record-info" v-if="item.expire > -1">
-                            <span style="color:red">
-                                {{$tools.getRelativeTime(item.expire)}}
-                            </span>
-                            <span style="color:red">
-                                {{$t('cusMgt.rcdExpired')}}
-                            </span>
-                        </span>
-                        <!-- 时间 -->
-                        <span class="record-info" style="float:right">
-                            <span>
-                                <Icon type="md-time" color="#70B1E7" />
-                            </span>
-                            <span class="record-info-value">
-                                {{$jsFn.timeFormat(item.startTime)}}
-                            </span>
-                        </span>
-                        <div class="record-action-wrap">
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <EmptyData v-show="recordList.length == 0" :textContent="$t('cusMgt.noRecord')" :top="150"></EmptyData>
-        </vuescroll>
-        <!-- 修改课堂记录名称 -->
-        <Modal v-model="editRdStatus" className="ed-name-modal" footer-hide>
-            <div slot="header" class="modal-header">
-                {{$t('cusMgt.edRdName')}}
-            </div>
-            <div class="edit-name-content">
-                <p class="edit-name-label">
-                    {{$t('cusMgt.listName')}}
-                </p>
-                <Input v-model="editName" :placeholder="$t('cusMgt.edRdName')" />
-                <Button :loading="btnLoading" @click="confirmEditRd" long type="primary" class="confirm-btn">{{ $t('syllabus.confirm') }}</Button>
+          </p>
+          <div style="padding-left:10px;margin-top:10px">
+            <!-- 出席人数 -->
+            <span class="record-info">
+              <span>{{$t('cusMgt.rcd.attendCount')}}:</span>
+              <span class="record-info-value"> {{item.attendCount}}{{$t('unit.text7')}}</span>
+            </span>
+            <!-- 总计分 -->
+            <span class="record-info">
+              <span>{{$t('cusMgt.rcdScore')}}</span>
+              <span class="record-info-value">
+                {{item.totalPoint}}
+              </span>
+            </span>
+            <!-- 作品总数 -->
+            <span class="record-info">
+              <span>{{$t('cusMgt.rcd.colctCount')}}: </span>
+              <span class="record-info-value">
+                {{item.collateCount}}
+              </span>
+            </span>
+            <!-- 测验得分率 -->
+            <span class="record-info">
+              <span>{{$t('cusMgt.rcd.scoreRate')}}: </span>
+              <span class="record-info-value">
+                {{item.examPointRate}}
+              </span>
+            </span>
+            <!-- 互动总数 -->
+            <span class="record-info">
+              <span>{{$t('cusMgt.rcd.interactionCount')}}: </span>
+              <span class="record-info-value">
+                {{item.clientInteractionCount}}
+              </span>
+            </span>
+            <!-- 时长 -->
+            <span class="record-info">
+              <span>{{$t('cusMgt.duration')}}</span>
+              <span class="record-info-value">{{handleDuration(item.duration)}}</span>
+            </span>
+            <!-- 过期时间 -->
+            <span class="record-info" v-if="item.expire > -1">
+              <span style="color:red">
+                {{$tools.getRelativeTime(item.expire)}}
+              </span>
+              <span style="color:red">
+                {{$t('cusMgt.rcdExpired')}}
+              </span>
+            </span>
+            <!-- 时间 -->
+            <span class="record-info" style="float:right">
+              <span>
+                <Icon type="md-time" color="#70B1E7" />
+              </span>
+              <span class="record-info-value">
+                {{$jsFn.timeFormat(item.startTime)}}
+              </span>
+            </span>
+            <div class="record-action-wrap">
             </div>
-        </Modal>
-    </div>
+          </div>
+        </div>
+      </div>
+      <EmptyData v-show="recordList.length == 0" :textContent="$t('cusMgt.noRecord')" :top="150"></EmptyData>
+    </vuescroll>
+    <!-- 修改课堂记录名称 -->
+    <Modal v-model="editRdStatus" className="ed-name-modal" footer-hide>
+      <div slot="header" class="modal-header">
+        {{$t('cusMgt.edRdName')}}
+      </div>
+      <div class="edit-name-content">
+        <p class="edit-name-label">
+          {{$t('cusMgt.listName')}}
+        </p>
+        <Input v-model="editName" :placeholder="$t('cusMgt.edRdName')" />
+        <p class="edit-name-label" style="margin-top:10px">
+          {{ $t('cusMgt.rcd.cover.cover')}}
+        </p>
+        <div>
+          <div class="ed-cover">
+            <RcdPoster class="record-poster-wrap" :poster="editCover"></RcdPoster>
+            <Upload action="" :before-upload="onBeforeUpload" :show-upload-list="false">
+              <span class="upload-btn">
+                <Icon type="md-add" />
+                <p>{{ $t('cusMgt.rcd.cover.title') }}</p>
+              </span>
+            </Upload>
+          </div>
+          <p style="margin:10px 0;color:red">* {{ $t('cusMgt.rcd.cover.tip') }}</p>
+          <div v-show="previewCover">
+            <p style="margin-bottom:10px">{{ $t('cusMgt.rcd.cover.preview') }} <span style="text-decoration:underline;color:gray;cursor: pointer;" @click="previewCover = ''">{{ $t('cusMgt.rcd.cover.undo') }}</span></p>
+            <img :src="previewCover" alt="" style="width: 430px;height:242px">
+          </div>
+        </div>
+        <Button :loading="btnLoading" @click="confirmEditRd" long type="primary" class="confirm-btn">{{ $t('syllabus.confirm') }}</Button>
+      </div>
+    </Modal>
+  </div>
 </template>
 <script>
+import BlobTool from '@/utils/blobTool.js'
 import { mapGetters } from 'vuex'
 import RcdPoster from "../../homepage/RcdPoster.vue"
 export default {
-    components: {
-        RcdPoster
+  components: {
+    RcdPoster
+  },
+  props: {
+    //收藏id,双向绑定
+    value: {
+      type: Array,
+      default: () => {
+        return []
+      }
     },
-    props: {
-        //收藏id,双向绑定
-        value: {
-            type: Array,
-            default: () => {
-                return []
-            }
-        },
-        rcdParams: {
-            type: Object,
-            default: () => {
-                return {}
-            }
-        }
+    rcdParams: {
+      type: Object,
+      default: () => {
+        return {}
+      }
+    }
+  },
+  data() {
+    return {
+      filterExpire: false,
+      fIds: [],
+      isAuto: false,//是否自动发布课堂记录
+      sLoading: false,
+      btnLoading: false,
+      editName: '',
+      editCover: '',
+      previewCover: '',
+      previewFile: null,
+      recordList: [],
+      editRdStatus: false,
+    }
+  },
+  computed: {
+    ...mapGetters({
+      lessonShow: 'user/getTeacherLessonShow',//是否自动发布课堂记录
+    }),
+    getDataUrl() {
+      return file => {
+        var windowURL = window.URL || window.webkitURL;
+        var dataURL = windowURL.createObjectURL(file)
+        return dataURL
+      }
     },
-    data() {
-        return {
-            filterExpire: false,
-            fIds: [],
-            isAuto: false,//是否自动发布课堂记录
-            sLoading: false,
-            btnLoading: false,
-            editName: '',
-            recordList: [],
-            editRdStatus: false,
-        }
+  },
+  methods: {
+    onBeforeUpload(file) {
+      let maxSize = 2 * 1024 * 1024
+      let nameType = file.name.split('.')[file.name.split('.').length - 1]
+      if (!['jpg', 'png', 'jpeg'].includes(nameType.toLowerCase())) {
+        this.$Message.warning(this.$t('cusMgt.rcd.cover.tip2'));
+        return false
+      }
+      if (file.size > maxSize) {
+        this.$Message.warning(this.$t('cusMgt.rcd.cover.tip3'));
+        return false
+      }
+      this.previewFile = file
+      this.previewCover = this.getDataUrl(file)
     },
-    computed: {
-        ...mapGetters({
-            lessonShow: 'user/getTeacherLessonShow',//是否自动发布课堂记录
-        }),
+
+    uploadCover() {
+      return new Promise(async (r, j) => {
+        let curRecord = this.recordList[this.edRdIndex]
+        let n = curRecord.scope === 'school' ? await this.$tools.getSchoolSas() : await this.$tools.getPrivateSas()
+        let containerClient = new BlobTool(n.url, n.name, n.sas, curRecord.scope)
+        var newFile = new File([this.previewFile], 'CoverImage.jpg', { type: this.previewFile.type });
+        containerClient.upload(newFile, { path: `records/${curRecord.id}/Record` }).then(res => {
+          r(res.url)
+        }).catch(e => {
+          j(500)
+        })
+      })
     },
-    methods: {
-        handleFilterExpire() {
-            this.getRecordList(this.filterExpire)
-        },
-        delRecord(record) {
-            this.$Modal.confirm({
-                title: this.$t('cusMgt.delRcdTitle'),
-                content: this.$t('cusMgt.delRcdContent'),
-                onOk: () => {
-                    let params = {
-                        "scope": record.scope,
-                        "tmdid": this.$store.state.userInfo.TEAMModelId,
-                        "delete_id": record.id,
-                        "opt": "delete",
-                        "school": this.$store.state.userInfo.schoolCode
-                    }
-                    this.$api.lessonRecord.delRcd(params).then(
-                        res => {
-                            this.$Message.success(this.$t('cusMgt.delOk'))
-                            const index = this.recordList.findIndex(item => item.id == record.id)
-                            if (index > -1) {
-                                this.recordList.splice(index, 1)
-                            }
-                        },
-                        err => {
-                            this.$Message.error(this.$t('cusMgt.delErr'))
-                        }
-                    )
-                }
-            })
-        },
-        //切换是否自动发布课堂记录
-        setAutoPublish() {
-            this.sLoading = true
-            let show = this.lessonShow
-            if (this.isAuto) {
-                show.push('student')
-            } else {
-                let index = show.findIndex(item => item === 'student')
-                if (index > -1) show.splice(index, 1)
-            }
-            let params = {
-                "opt": "UpdateLessonShow",
-                "lessonShow": show
+
+    handleFilterExpire() {
+      this.getRecordList(this.filterExpire)
+    },
+    delRecord(record) {
+      this.$Modal.confirm({
+        title: this.$t('cusMgt.delRcdTitle'),
+        content: this.$t('cusMgt.delRcdContent'),
+        onOk: () => {
+          let params = {
+            "scope": record.scope,
+            "tmdid": this.$store.state.userInfo.TEAMModelId,
+            "delete_id": record.id,
+            "opt": "delete",
+            "school": this.$store.state.userInfo.schoolCode
+          }
+          this.$api.lessonRecord.delRcd(params).then(
+            res => {
+              this.$Message.success(this.$t('cusMgt.delOk'))
+              const index = this.recordList.findIndex(item => item.id == record.id)
+              if (index > -1) {
+                this.recordList.splice(index, 1)
+              }
+            },
+            err => {
+              this.$Message.error(this.$t('cusMgt.delErr'))
             }
-            this.$api.schoolUser.setTeacherInfo(params).then(
-                res => {
-                    this.$Message.success(this.$t('teachermgmt.setOk'))
-                    this.$store.commit('user/setLessonShow', show)
-                },
-                err => {
-                    this.$Message.error(this.$t('teachermgmt.setErr'))
-                    this.isAuto = !this.isAuto
-                }
-            ).finally(() => {
-                this.sLoading = false
-            })
+          )
+        }
+      })
+    },
+    //切换是否自动发布课堂记录
+    setAutoPublish() {
+      this.sLoading = true
+      let show = this.lessonShow
+      if (this.isAuto) {
+        show.push('student')
+      } else {
+        let index = show.findIndex(item => item === 'student')
+        if (index > -1) show.splice(index, 1)
+      }
+      let params = {
+        "opt": "UpdateLessonShow",
+        "lessonShow": show
+      }
+      this.$api.schoolUser.setTeacherInfo(params).then(
+        res => {
+          this.$Message.success(this.$t('teachermgmt.setOk'))
+          this.$store.commit('user/setLessonShow', show)
         },
-        //分享、取消分享给学生
-        toggleShare(data) {
-            if (data && data.id) {
-                let show = []
-                if (!data.isShare) show = ['student']
-                this.$api.lessonRecord.updateLesson({
-                    "lesson_id": data.id,
-                    "tmdid": data.tmdid,
-                    "school": data.school,
-                    "scope": data.scope,
-                    "grant_types": [{
-                        "grant_type": "up-baseinfo",
-                        "data": {
-                            "show": show
-                        }
-                    }]
-                }).then(
-                    res => {
-                        if (!res.error) {
-                            if (data.isShare) {
-                                this.$Message.success(this.$t('cusMgt.unShareOk'))
-                            } else {
-                                this.$Message.success(this.$t('cusMgt.shareOk'))
-                            }
-                            let info = this.recordList.find(item => item.id == data.id)
-                            if (info) {
-                                info.show = show
-                                info.isShare = !info.isShare
-                            }
-                        } else {
-                            if (data.isShare) {
-                                this.$Message.error(this.$t('cusMgt.unShareErr'))
-                            } else {
-                                this.$Message.error(this.$t('cusMgt.shareErr'))
-                            }
-                        }
-                    },
-                    err => {
-                        if (data.isShare) {
-                            this.$Message.error(this.$t('cusMgt.unShareErr'))
-                        } else {
-                            this.$Message.error(this.$t('cusMgt.shareErr'))
-                        }
-                    }
-                )
+        err => {
+          this.$Message.error(this.$t('teachermgmt.setErr'))
+          this.isAuto = !this.isAuto
+        }
+      ).finally(() => {
+        this.sLoading = false
+      })
+    },
+    //分享、取消分享给学生
+    toggleShare(data) {
+      if (data && data.id) {
+        let show = []
+        if (!data.isShare) show = ['student']
+        this.$api.lessonRecord.updateLesson({
+          "lesson_id": data.id,
+          "tmdid": data.tmdid,
+          "school": data.school,
+          "scope": data.scope,
+          "grant_types": [{
+            "grant_type": "up-baseinfo",
+            "data": {
+              "show": show
             }
-        },
-        //收藏 取消
-        toggleFavorite(data) {
-            if (data && data.id) {
-                if (this.isFavorite(data.id)) {
-                    this.delCollection(data) //取消收藏
-                } else {
-                    this.collection(data) //收藏
-                }
+          }]
+        }).then(
+          res => {
+            if (!res.error) {
+              if (data.isShare) {
+                this.$Message.success(this.$t('cusMgt.unShareOk'))
+              } else {
+                this.$Message.success(this.$t('cusMgt.shareOk'))
+              }
+              let info = this.recordList.find(item => item.id == data.id)
+              if (info) {
+                info.show = show
+                info.isShare = !info.isShare
+              }
+            } else {
+              if (data.isShare) {
+                this.$Message.error(this.$t('cusMgt.unShareErr'))
+              } else {
+                this.$Message.error(this.$t('cusMgt.shareErr'))
+              }
             }
-        },
-        collection(data) {
-            let params = {
-                favorite: {
-                    "name": data.name,
-                    "id": data.id,
-                    "code": this.$store.state.userInfo.TEAMModelId,
-                    "fromId": data.id,
-                    "fromCode": data.code,
-                    "scope": data.scope,
-                    "owner": data.scope == 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId,
-                    "type": data.pk
-                }
+          },
+          err => {
+            if (data.isShare) {
+              this.$Message.error(this.$t('cusMgt.unShareErr'))
+            } else {
+              this.$Message.error(this.$t('cusMgt.shareErr'))
             }
-            this.$api.courseMgmt.FavoriteUpsert(params).then(
-                res => {
-                    this.$Message.success(this.$t('cusMgt.fvtOk'))
-                    this.fIds.push(data.id)
-                    this.$emit("on-favorite-change", this.fIds)
-                },
-                err => {
-                    this.$Message.error(this.$t('cusMgt.fvtOk'))
-                }
-            )
+          }
+        )
+      }
+    },
+    //收藏 取消
+    toggleFavorite(data) {
+      if (data && data.id) {
+        if (this.isFavorite(data.id)) {
+          this.delCollection(data) //取消收藏
+        } else {
+          this.collection(data) //收藏
+        }
+      }
+    },
+    collection(data) {
+      let params = {
+        favorite: {
+          "name": data.name,
+          "id": data.id,
+          "code": this.$store.state.userInfo.TEAMModelId,
+          "fromId": data.id,
+          "fromCode": data.code,
+          "scope": data.scope,
+          "owner": data.scope == 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId,
+          "type": data.pk
+        }
+      }
+      this.$api.courseMgmt.FavoriteUpsert(params).then(
+        res => {
+          this.$Message.success(this.$t('cusMgt.fvtOk'))
+          this.fIds.push(data.id)
+          this.$emit("on-favorite-change", this.fIds)
         },
-        delCollection(data) {
-            let params = {
-                "id": data.id,
-                "code": this.$store.state.userInfo.TEAMModelId,
-            }
-            this.$api.courseMgmt.FavoriteDelete(params).then(
-                res => {
-                    this.$Message.success(this.$t('cusMgt.unfvtOk'))
-                    let index = this.fIds.findIndex(item => item == data.id)
-                    if (index > -1) {
-                        this.fIds.splice(index, 1)
-                        this.$emit("on-favorite-change", this.fIds)
-                    }
-                },
-                err => {
-                    this.$Message.error(this.$t('cusMgt.unfvtErr'))
-                }
-            )
+        err => {
+          this.$Message.error(this.$t('cusMgt.fvtOk'))
+        }
+      )
+    },
+    delCollection(data) {
+      let params = {
+        "id": data.id,
+        "code": this.$store.state.userInfo.TEAMModelId,
+      }
+      this.$api.courseMgmt.FavoriteDelete(params).then(
+        res => {
+          this.$Message.success(this.$t('cusMgt.unfvtOk'))
+          let index = this.fIds.findIndex(item => item == data.id)
+          if (index > -1) {
+            this.fIds.splice(index, 1)
+            this.$emit("on-favorite-change", this.fIds)
+          }
         },
-        //根据时长换算时间
-        handleDuration(duration) {
-            if (!duration) return this.$t('cusMgt.noData')
-            let calc = duration
-            //天
-            let dayC = 24 * 60 * 60
-            let day = parseInt(calc / dayC)
-            calc = calc % dayC
+        err => {
+          this.$Message.error(this.$t('cusMgt.unfvtErr'))
+        }
+      )
+    },
+    //根据时长换算时间
+    handleDuration(duration) {
+      if (!duration) return this.$t('cusMgt.noData')
+      let calc = duration
+      //天
+      let dayC = 24 * 60 * 60
+      let day = parseInt(calc / dayC)
+      calc = calc % dayC
 
-            //时
-            let hourC = 60 * 60
-            let hour = parseInt(calc / hourC)
-            calc = calc % hourC
+      //时
+      let hourC = 60 * 60
+      let hour = parseInt(calc / hourC)
+      calc = calc % hourC
 
-            //分
-            let minC = 60
-            let min = parseInt(calc / minC)
-            calc = calc % minC
+      //分
+      let minC = 60
+      let min = parseInt(calc / minC)
+      calc = calc % minC
 
-            //秒
-            let sec = calc
-            return `${day > 0 ? day + this.$t('unit.day') : ''} ${hour > 0 ? hour + this.$t('unit.hour') : ''} ${min > 0 ? min + this.$t('unit.text5') : ''} ${sec > 0 ? sec + this.$t('unit.second') : ''}`
-        },
-        isFavorite(id) {
-            return this.fIds.includes(id)
-        },
-        // 修改记录名称
-        confirmEditRd() {
-            if (this.editName) {
-                let recordInfo = this.recordList[this.edRdIndex]
-                this.btnLoading = true
-                this.$api.lessonRecord.updateLesson({
-                    "lesson_id": recordInfo.id,
-                    "tmdid": recordInfo.tmdid,
-                    "school": recordInfo.school,
-                    "scope": recordInfo.scope,
-                    "grant_types": [{
-                        "grant_type": "up-baseinfo",
-                        "data": {
-                            "name": this.editName,
-                        }
-                    }]
-                }).then(
-                    res => {
-                        if (!res.error) {
-                            this.$Message.success(this.$t('cusMgt.editOk'))
-                            let i = this.recordList.findIndex(item => item.id == recordInfo.id)
-                            if (i > -1) {
-                                this.$set(this.recordList[i], 'name', this.editName)
-                            }
-                            this.editRdStatus = false
-                        }
-                    }).finally(() => {
-                        this.btnLoading = false
-                    })
-            } else {
-                this.$Message.warning(this.$t('learnActivity.mgtScEv.edNameHolder'))
-            }
-        },
-        editRecordName(index) {
-            this.editRdStatus = true
-            this.edRdIndex = index
-            this.editName = this.recordList[index]?.name
-        },
-        //查看课堂记录详情
-        toClassRecoerd(index) {
-            this.$router.push({
-                name: 'classRecord',
-                params: {
-                    record: this.recordList[index]
-                }
-            })
-        },
-        getRecordList(isFilterExpire) {
-            let params = {
-                "tmdid": this.$store.state.userInfo.TEAMModelId,
-                "scope": this.rcdParams.scope,
-                "school": this.$store.state.userInfo.schoolCode,
-                "DESC": "startTime",
-                "pageCount": 50,
-                "courseId": this.rcdParams.courseId,
-                "groupIds": [this.rcdParams.classId]
+      //秒
+      let sec = calc
+      return `${day > 0 ? day + this.$t('unit.day') : ''} ${hour > 0 ? hour + this.$t('unit.hour') : ''} ${min > 0 ? min + this.$t('unit.text5') : ''} ${sec > 0 ? sec + this.$t('unit.second') : ''}`
+    },
+    isFavorite(id) {
+      return this.fIds.includes(id)
+    },
+    // 修改记录名称
+    confirmEditRd() {
+      if (this.editName) {
+        let recordInfo = this.recordList[this.edRdIndex]
+        this.btnLoading = true
+        this.$api.lessonRecord.updateLesson({
+          "lesson_id": recordInfo.id,
+          "tmdid": recordInfo.tmdid,
+          "school": recordInfo.school,
+          "scope": recordInfo.scope,
+          "grant_types": [{
+            "grant_type": "up-baseinfo",
+            "data": {
+              "name": this.editName,
             }
-            if (isFilterExpire) {
-                params.expire = true
+          }]
+        }).then(
+          async res => {
+            if (!res.error) {
+              let newPoster = ''
+              if (this.previewCover && this.previewFile) {
+                newPoster = await this.uploadCover()
+              }
+              this.$Message.success(this.$t('cusMgt.editOk'))
+              let i = this.recordList.findIndex(item => item.id == recordInfo.id)
+              if (i > -1) {
+                this.$set(this.recordList[i], 'name', this.editName)
+                this.$set(this.recordList[i], 'poster', newPoster + '?' + this.recordList[i].poster.split('?')[1] + '&t=' + Math.random())
+              }
+              this.editRdStatus = false
             }
-            this.$api.lessonRecord.getLessonList(params).then(
-                res => {
-                    if (res.lessonRecords) {
-                        res.lessonRecords.forEach(item => {
-                            item.show = item.show ? item.show : []
-                            item.isShare = item.show.includes('student')
-                        })
-                        this.recordList = res.lessonRecords
-                        let sasInfo = {}
-                        let blobInfo = this.rcdParams.scope === 'school' ? this.$store.state.user.schoolProfile : this.$store.state.user.userProfile
-                        sasInfo.sas = '?' + blobInfo.blob_sas
-                        sasInfo.name = this.rcdParams.scope === 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId
-                        sasInfo.url = blobInfo.blob_uri.slice(0, blobInfo.blob_uri.lastIndexOf(sasInfo.name) - 1)
-                        this.recordList.forEach(item => {
-                            item.sokrateImg = `${sasInfo.url}/${sasInfo.name}/records/${item.id}/Sokrates/SokratesResults/event.png${sasInfo.sas}`
-                            item.eNote = `${sasInfo.url}/${sasInfo.name}/records/${item.id}/Note.pdf${sasInfo.sas}`
-                            item.video = `${sasInfo.url}/${sasInfo.name}/records/${item.id}/Record/CourseRecord.mp4${sasInfo.sas}`
-                            item.poster = `${sasInfo.url}/${sasInfo.name}/records/${item.id}/Record/CoverImage.jpg${sasInfo.sas}`
-                        })
-                        this.recordList.sort((a, b) => {
-                            return a.startTime - b.startTime > 0 ? -1 : 1
-                        })
-                    }
-                },
-                err => {
-                    this.$Message.error(this.$t('cusMgt.rcdErr'))
-                }
-            )
+          }).finally(() => {
+            this.btnLoading = false
+          })
+      } else {
+        this.$Message.warning(this.$t('learnActivity.mgtScEv.edNameHolder'))
+      }
+    },
+    editRecordName(index) {
+      this.editRdStatus = true
+      this.edRdIndex = index
+      this.editName = this.recordList[index]?.name
+      this.editCover = this.recordList[index]?.poster
+      this.previewCover = ''
+      console.error(this.recordList[index])
+    },
+    //查看课堂记录详情
+    toClassRecoerd(index) {
+      this.$router.push({
+        name: 'classRecord',
+        params: {
+          record: this.recordList[index]
+        }
+      })
+    },
+    getRecordList(isFilterExpire) {
+      let params = {
+        "tmdid": this.$store.state.userInfo.TEAMModelId,
+        "scope": this.rcdParams.scope,
+        "school": this.$store.state.userInfo.schoolCode,
+        "DESC": "startTime",
+        "pageCount": 50,
+        "courseId": this.rcdParams.courseId,
+        "groupIds": [this.rcdParams.classId]
+      }
+      if (isFilterExpire) {
+        params.expire = true
+      }
+      this.$api.lessonRecord.getLessonList(params).then(
+        res => {
+          if (res.lessonRecords) {
+            res.lessonRecords.forEach(item => {
+              item.show = item.show ? item.show : []
+              item.isShare = item.show.includes('student')
+            })
+            this.recordList = res.lessonRecords
+            let sasInfo = {}
+            let blobInfo = this.rcdParams.scope === 'school' ? this.$store.state.user.schoolProfile : this.$store.state.user.userProfile
+            sasInfo.sas = '?' + blobInfo.blob_sas
+            sasInfo.name = this.rcdParams.scope === 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId
+            sasInfo.url = blobInfo.blob_uri.slice(0, blobInfo.blob_uri.lastIndexOf(sasInfo.name) - 1)
+            this.recordList.forEach(item => {
+              item.sokrateImg = `${sasInfo.url}/${sasInfo.name}/records/${item.id}/Sokrates/SokratesResults/event.png${sasInfo.sas}`
+              item.eNote = `${sasInfo.url}/${sasInfo.name}/records/${item.id}/Note.pdf${sasInfo.sas}`
+              item.video = `${sasInfo.url}/${sasInfo.name}/records/${item.id}/Record/CourseRecord.mp4${sasInfo.sas}`
+              item.poster = `${sasInfo.url}/${sasInfo.name}/records/${item.id}/Record/CoverImage.jpg${sasInfo.sas}`
+            })
+            this.recordList.sort((a, b) => {
+              return a.startTime - b.startTime > 0 ? -1 : 1
+            })
+          }
         },
+        err => {
+          this.$Message.error(this.$t('cusMgt.rcdErr'))
+        }
+      )
     },
-    watch: {
-        rcdParams: {
-            deep: true,
-            immediate: true,
-            handler(n, o) {
-                if (n) {
-                    let { scope, courseId, classId } = n
-                    if (scope && courseId, classId) {
-                        this.getRecordList()
-                    } else {
-                        this.recordList = []
-                    }
-                }
+  },
+  watch: {
+    rcdParams: {
+      deep: true,
+      immediate: true,
+      handler(n, o) {
+        if (n) {
+          let { scope, courseId, classId } = n
+          if (scope && courseId, classId) {
+            this.getRecordList()
+          } else {
+            this.recordList = []
+          }
+        }
 
-            }
-        },
-        lessonShow: {
-            deep: true,
-            immediate: true,
-            handler(n, o) {
-                console.log(typeof n)
-                if (n && Array.isArray(n)) {
-                    this.isAuto = n.includes('student')
-                } else {
-                    this.isAuto = false
-                }
-            }
-        },
-        value: {
-            deep: true,
-            immediate: true,
-            handler(n, o) {
-                this.fIds = n
-            }
+      }
+    },
+    lessonShow: {
+      deep: true,
+      immediate: true,
+      handler(n, o) {
+        console.log(typeof n)
+        if (n && Array.isArray(n)) {
+          this.isAuto = n.includes('student')
+        } else {
+          this.isAuto = false
         }
+      }
+    },
+    value: {
+      deep: true,
+      immediate: true,
+      handler(n, o) {
+        this.fIds = n
+      }
     }
+  }
 }
 </script>
 <style lang="less" scoped>