| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395 | <template>  <view class="polyv_detail">    <uni-nav-bar      left-icon="back"      :statusBar="true"      fixed="true"      :title="detail.courseName || '课程详情'"      @clickLeft="clickLeft"    ></uni-nav-bar>    <!-- <nav-bar      :title="detail.courseName || '课程详情'"      v-show="navShow"    ></nav-bar> -->    <view id="top">      <view class="video_box" v-if="!startStatus">        <image          :src="$method.splitImgHost(detail.coverUrl)"          mode="widthFix"          style="width: 100%; height: 421rpx"        ></image>        <image          v-if="false"          class="video_play"          src="/static/play.png"          @click="startVideo"        ></image>      </view>      <view v-else>        <!-- v-if="playVID" -->        <view class="video_box" style="width: 100%; height: 421rpx">          <polyv-player            v-if="playVID"            id="playerVideo"            playerId="playerVideo"            height="421rpx"            :vid="vid"            :showSettingBtn="true"            :enablePlayGesture="true"            :custom-cache="false"            :object-fit="'contain'"            @statechange="onStateChange"            @fullscreenchange="fullscreenchange"            @error="playError"            :autoplay="true"            :page-gesture="true"            :vslide-gesture="true"            :vslide-gesture-in-fullscreen="true"            :isAllowSeek="isAllowSeek"            :playbackRate="playbackRate"            :startTime="startTime"            :enableAutoRotation="enableAutoRotation"            @loadedmetadata="loadedmetadata"          ></polyv-player>          <cover-view            class="video-toast__close"            v-if="videoToastShow"            @click="closeToast()"            >X</cover-view          >          <cover-view class="video-toast" v-if="videoToastShow">            <cover-view class="video-toast__text"              >您上次看到 {{ seekTime }},正在自动续播</cover-view            >            <cover-view class="video-toast__btn" @click="restart()"              >从头播放</cover-view            >          </cover-view>        </view>      </view>      <view class="course_name">        <view class="course_titles">          <view class="video_t1" :class="{ one: !goodsData.buyNote }">{{            detail.courseName          }}</view>          <view class="notice_wrap" v-if="goodsData.buyNote">            <view class="video_t1_t" @click="studyNotice"> 学员须知 </view>          </view>          <view            v-if="courseTotal > 1"            class="toggle_course"            @click="changeCourses()"          >            <image class="img" src="/pages3/static/imgs/toggle.png"></image>            <view class="toggle_name">切换课程</view>            <view class="numbers">共{{ courseTotal }}门</view>          </view>        </view>        <!-- <u-row>          <u-col span="10">            <view class="video_t1">{{ detail.courseName }}</view>          </u-col>          <u-col span="2">            <div class="notice_wrap" v-if="goodsData.buyNote">              <view class="video_t1_t" @click="studyNotice"> 学员须知 </view>            </div>          </u-col>        </u-row> -->      </view>      <u-line color="#D6D6DB" />      <view>        <view          ><u-tabs            gutter="0"            :item-width="itemWidth()"            :list="list"            font-size="32"            bar-width="24"            :current="current"            @change="change"            active-color="#007AFF"          ></u-tabs        ></view>      </view>      <u-line color="#D6D6DB" />    </view>    <view class="box" :class="{ first_ml: current == 0 }">      <scroll-view class="box_in" scroll-y="true">        <!--目录 -->        <view v-show="current == 0">          <view            class="top__header"            v-if="livingItem"            @click="goLive(livingItem)"          >            <image              class="img"              src="/pages3/static/imgs/live.png"              mode="widthFix"            ></image>            <view class="note">正在直播中</view>            <view class="title">{{ livingItem.sectionName }}</view>          </view>          <view class="menuBox" v-for="(item, index) in menuList" :key="index">            <!--模块 -->            <view v-if="item.type == 1"              ><courseModule                v-if="reStart"                :isLive="true"                :orderGoodsId="orderGoodsId"                :sectionMaxNum="goodsData.sectionMaxNum"                :needOpen="menuIndex[0] === index ? true : false"                :courseId="courseId"                :preItem="menuList[index - 1]"                :learningOrder="businessData.goodsLearningOrder"                :goodsId="goodsId"                :gradeId="gradeId"                :isBuy="true"                :menuItem="item"                :levelId="item.menuId"                :sectionItem="sectionItem"              ></courseModule            ></view>            <!--章 -->            <view v-if="item.type == 2"              ><courseChapter                v-if="reStart"                :isLive="true"                :orderGoodsId="orderGoodsId"                :sectionMaxNum="goodsData.sectionMaxNum"                :needOpen="menuIndex[0] === index ? true : false"                :courseId="courseId"                :preItem="menuList[index - 1]"                @playEnd="sectionPlayEnd($event, index)"                :learningOrder="businessData.goodsLearningOrder"                :goodsId="goodsId"                :gradeId="gradeId"                :isBuy="true"                :menuItem="item"                :levelId="'0-' + item.menuId"                :goodsType="6"              ></courseChapter            ></view>            <!--节 -->            <view v-if="item.type == 3"              ><courseSection                v-if="reStart"                :isLive="true"                :orderGoodsId="orderGoodsId"                :sectionMaxNum="goodsData.sectionMaxNum"                @playEnd="sectionPlayEnd($event, index)"                :courseId="courseId"                :preItem="menuList[index - 1]"                :learningOrder="businessData.goodsLearningOrder"                :goodsId="goodsId"                :gradeId="gradeId"                :isBuy="true"                :menuItem="item"                :levelId="'0-0-' + item.menuId"              ></courseSection            ></view>          </view>        </view>        <!--笔记 -->        <view v-show="current == 1">          <view v-if="noteList.length == 0" style="text-align: center"            >暂无笔记</view          >          <!-- <view class="inputBottom" v-if="!(isPlayRebuild > 0) && playChannelId ==0">            <view style="width: 10%"              ><image                src="/static/icon/note3.png"                style="width: 39rpx; height: 39rpx; margin: 0 29rpx"              ></image            ></view>            <view style="width: 73%; height: 100%; padding: 10rpx 0">              <u-input                class="input"                height="60"                fixed="true"                placeholder="您可以在这里输入笔记内容"                type="input"                :custom-style="inputStyle"                v-model="noteValue"              />            </view>            <view              style="                color: #007aff;                font-size: 30rpx;                font-weight: bold;                width: 15%;                text-align: center;              "              @click="postNote"              >提交</view            >          </view> -->          <view v-for="(item, index) in noteList" :key="index">            <view class="dateBox">{{              $method.timestampToTime(item.dateNote)            }}</view>            <view class="noteBox">              <view                v-for="(item1, index1) in item.userNotes"                :key="index1"                style="margin-top: 30rpx"                @click="jumpNote(item1)"              >                <view style="display: flex">                  <view class="left_ti">                    <view>                      <image                        src="/static/icon/note2.png"                        v-if="noteId != item1.noteId"                        style="width: 39rpx; height: 39rpx; margin: 0 29rpx"                      ></image>                      <image                        src="/static/icon/note1.png"                        v-if="noteId == item1.noteId"                        style="width: 39rpx; height: 39rpx; margin: 0 29rpx"                      ></image>                    </view>                    <view class="title" style="width: 39rpx; height: 39rpx">{{                      $method.secondToDate(item1.noteSecond)                    }}</view>                  </view>                  <view style="margin-left: 10rpx">                    <view class="t2Content leftPadding">{{                      item1.sectionName                    }}</view>                    <view class="tBox2">{{ item1.noteText }}</view>                  </view>                </view>              </view>            </view>          </view>        </view>        <!--答疑 -->        <view v-show="current == 2" class="Answering">          <!-- <view class="inputBottom">            <view class="flex_auto">              <u-input                height="60"                fixed="true"								:focus="isFocus"                :placeholder="placeholder"                type="input"								@blur="blur"                :custom-style="inputStyle"                v-model="ctxValue"              />            </view>            <view class="btn" @click="postContent">提交</view>          </view> -->          <view            v-for="(item, index) in answerList"            :key="index"            style="background-color: #ffffff"            class="answer_item"          >            <view class="chat_box" @click.stop="clearCtx">              <view style="display: flex; flex: 1">                <view                  ><image                    :src="                      item.assignUserId > 0 && !item.realname                        ? '/static/logo_xcx.png'                        : $method.splitImgHost(item.avatar)                    "                    style="width: 64rpx; height: 64rpx"                  ></image                ></view>                <view style="margin-left: 15rpx">                  <view class="chat1">{{                    item.assignUserId > 0 && !item.realname                      ? "祥粤老师"                      : item.realname                  }}</view>                  <view class="chat2">{{                    $method.timestampToTime(item.createTime, false)                  }}</view>                  <view class="chat3">                    <text v-if="item.assignUserId > 0">回复</text>                    <text v-if="item.assignUserId > 0" style="color: #007aff"                      >@{{ item.assignRealname }}</text                    >                    <view style="word-break: break-all">{{                      item.answerText                    }}</view>                  </view>                </view>              </view>              <view                class="btnReply"                @click.stop="replyContent(item)"                v-if="item.userId != userInfo.userId"                >回复</view              >              <view v-else class="btnDel" @click.stop="delContent(item)"                >删除</view              >            </view>            <u-line color="#D6D6DB" />          </view>          <view v-if="answerList.length == 0" style="text-align: center"            >暂无记录</view          >        </view>        <!--答疑 -->        <view v-show="current == 3">          <view            v-for="(item, index) in historyChatMsgList"            :key="index"            style="background-color: #ffffff; margin-bottom: 20rpx"          >            <view class="chat_box" @click.stop="clearCtx">              <view style="display: flex; flex: 1">                <view                  ><image                    :src="item.user.pic"                    style="width: 64rpx; height: 64rpx"                  ></image                ></view>                <view style="margin-left: 15rpx">                  <view class="chat1">{{ item.user.nickname }}</view>                  <view class="chat2">{{ item.time | formatDate }}</view>                  <view class="chat3">                    <!-- <text v-if="item.assignUserId > 0">回复</text>									  <text v-if="item.assignUserId > 0" style="color: #007aff"									    >@{{ item.assignRealname }}</text									  > -->                    <view style="word-break: break-all">{{                      item.content                    }}</view>                  </view>                </view>              </view>            </view>            <u-line color="#D6D6DB" />          </view>          <view v-if="historyChatMsgList.length == 0" style="text-align: center"            >暂无记录</view          >        </view>      </scroll-view>      <!-- 底部固定按钮 -->      <!-- 笔记的输入框 -->      <template v-if="current == 1">        <view          class="inputBottom"          v-if="!(isPlayRebuild > 0) && playChannelId == 0"          :style="{ bottom: bottomHeight + 'px' }"        >          <view style="width: 10%"            ><image              src="/static/icon/note3.png"              style="width: 39rpx; height: 39rpx; margin: 0 29rpx"            ></image          ></view>          <view style="width: 73%; height: 100%; padding: 10rpx 0">            <input              v-model="noteValue"              class="input"              height="60"              fixed="true"              placeholder="您可以在这里输入笔记内容"              type="text"              :custom-style="inputStyle"              :adjust-position="false"              @focus="focusNote"              @blur="blurNote"            />          </view>          <view            style="              color: #007aff;              font-size: 30rpx;              font-weight: bold;              width: 15%;              text-align: center;            "            @click="postNote"            >提交</view          >        </view>      </template>      <!-- 答疑 -->      <view        v-if="current == 2"        class="inputBottom"        :style="{ bottom: bottomHeight + 'px' }"      >        <view class="flex_auto">          <input            v-model="ctxValue"            height="60"            fixed="true"            :focus="isFocus"            :placeholder="placeholder"            type="text"            :custom-style="inputStyle"            :adjust-position="false"            class="input"            @focus="focusNote"            @blur="blur"          />        </view>        <view class="btn" @click="postContent">提交</view>      </view>    </view>    <!-- 播放前拍照end -->    <u-popup      v-model="showSet"      :mask-close-able="false"      mode="center"      border-radius="24"    >      <view        style="          align-items: center;          padding: 0 40rpx;          display: flex;          flex-direction: column;          justify-content: center;        "      >        <view          style="            font-weight: bold;            color: #333333;            font-size: 30rpx;            margin-top: 30rpx;          "          >温馨提示</view        >        <view          style="            width: 457rpx;            color: #666666;            font-size: 30rpx;            margin-top: 30rpx;          "          >学习过程中需要拍照验证学员身份, 拍照功能需要使用您的相机。          是否授权使用?</view        >        <view style="margin: 40rpx 0">          <button            open-type="openSetting"            @bindopensetting="openSetting"            class="btnSet"          >            去授权          </button>        </view>      </view>    </u-popup>    <u-popup      v-model="photoPopup"      mode="bottom"      border-radius="40"      :mask-close-able="false"    >      <!-- 播放前拍照start -->      <!-- :mask-close-able="false" -->      <!-- style="bottom: 0; position: fixed; width: 100%; z-index: 999" -->      <view v-if="photoPopup">        <view class="photoBox">          <view class="photoTop">            <view class="sqzz" v-if="false"              ><u-icon                name="close"                color="#333333"                size="30"                @click="closePhoto"              ></u-icon            ></view>            <view class="centersq">请正视手机屏幕</view>            <view class="sqzz"></view>          </view>          <view class="photoCenter">            <view class="center_camera" v-if="photoPopup && isTaking">              <!-- #ifdef MP-WEIXIN -->              <camera                device-position="front"                flash="off"                @error="error"                style="width: 100%; height: 100%"              >                <!-- 加人脸框 -->                <cover-view class="head_take">                  <cover-view class="headTake_up color"></cover-view>                  <cover-view class="headTake_minddle">                    <cover-view class="min_left color"></cover-view>                    <cover-view class="min_img"></cover-view>                    <cover-view class="min_right color"></cover-view>                  </cover-view>                  <cover-view class="headTake_down color"></cover-view>                </cover-view>              </camera>              <!-- #endif -->              <!-- #ifdef H5 -->              <video                :controls="false"                id="video"                width="400"                height="300"                class="photo_v"              ></video>              <view class="mask"></view>              <!-- #endif -->            </view>            <view class="custom" v-if="!isTaking">              <!-- #ifdef MP-WEIXIN -->              <image :src="avatarUrl" mode=""></image>              <!-- #endif -->              <!-- #ifdef H5 -->              <image :src="faceUrl" mode=""></image>              <!-- #endif -->            </view>          </view>          <view class="btns">            <!-- <view class="btnResult" v-if="isTaking" @click="takePhoto"              >拍照</view            > -->            <view v-if="isTaking" class="takePhoto_btn">              <view style="width: 100rpx; height: 2rpx"></view>              <view class="middle_btn" @click="takePhoto">                <view class="square"></view>              </view>              <view class="rights" @click="takePhTips()">                <text>拍照提示</text>                <u-icon name="arrow-right" color="#FFFFFF" size="30"></u-icon>              </view>            </view>            <view class="btnResult" v-if="!isTaking" @click="reTake">重拍</view>            <view class="btnResult" v-if="!isTaking" @click="submit">确认</view>          </view>        </view>      </view>    </u-popup>    <u-popup      v-model="noticeShow"      class="notice_modal"      mode="center"      border-radius="28"      width="650rpx"      height="622rpx"      :mask-close-able="false"      @close="closeNotice"    >      <view class="content">        <view class="title">学员须知</view>        <scroll-view scroll-y="true">          <view            class="text"            v-html="              goodsData.buyNote && goodsData.buyNote.replace(/\n|\r\n/g, '<br>')            "          >          </view>        </scroll-view>        <view          class="had_read"          :class="{ gray: CountTo >= 0 }"          @click="noticeConfirm()"        >          <text v-if="CountTo >= 0">请阅读学员须知,30s后可关闭</text>          <text v-else>我已阅读学员须知</text>          <text v-if="CountTo >= 0">{{ " " + CountTo + "s" }}</text>        </view>      </view>    </u-popup>    <!-- 切换课程弹窗 -->    <u-popup      v-model="toggleCourseShow"      mode="bottom"      border-radius="40"      :mask-close-able="false"    >      <view class="popup_box">        <view class="check_head">          <view class="headers">            <view class="grade">切换课程</view>            <u-icon              name="close"              color="#9C9C9C"              size="40"              @click="closePop()"            ></u-icon>          </view>          <view class="coruse_num">共{{ courseTotal }}门</view>          <view class="menuSel">            <scroll-view class="sub_sliper" scroll-x="true">              <view                v-for="(item, index) in subList"                :key="index"                style="margin-right: 50rpx; display: inline-block"              >                <view                  class="r_t1"                  :class="{ nactive: subIndex == index }"                  @click="cMenu(item, index)"                >                  {{ item.subjectName }}                </view>              </view>            </scroll-view>          </view>        </view>        <view class="check_con">          <scroll-view scroll-y="true" style="height: 700rpx">            <view              class="course_items"              v-for="(item, index) in s_courseList"              :key="index"            >              <view class="course_lefts">                <view class="course_title">{{ item.courseName }}</view>                <!-- <view class="course_pros">                    学习进度                    <text> {{ item.stuAllNum + item.recordNum }}/{{ item.secAllNum + item.examNum}}</text>                  </view> -->              </view>              <view class="course_rights" @click="jump(item, index)">                <view class="cicles">                  <u-icon name="arrow-right" color="#498AFE" size="20"></u-icon>                </view>                <view class="intoStudy">进入学习</view>              </view>            </view>          </scroll-view>        </view>      </view>    </u-popup>    <!-- 拍照提示 -->    <popup-photo      :popupPhotoShow.sync="popupPhotoShow"      @takePhoto="toTakePhoto()"    ></popup-photo>  </view></template><script>import plv from "@/pages3/static/polyv-sdk/index";import courseModule from "@/components/course/courseModule.vue";import courseChapter from "@/components/course/courseChapter.vue";import courseSection from "@/components/course/courseSection.vue";import PopupPhoto from "@/components/popup/index.vue";import { mapGetters, mapMutations } from "vuex";export default {  components: {    courseModule,    courseChapter,    courseSection,    PopupPhoto,  },  filters: {    formatDate(date) {      const nDate = new Date(date);      const nyear = nDate.getFullYear();      const nmonth = (nDate.getMonth() + 1).toString().padStart(2, 0);      const nday = nDate.getDate().toString().padStart(2, 0);      const hour = nDate.getHours();      const mins = nDate.getMinutes();      const seconds = nDate.getSeconds();      return (        nyear +        "-" +        nmonth +        "-" +        nday +        " " +        hour +        ":" +        (mins >= 10 ? mins : "0" + mins) +        ":" +        (seconds >= 10 ? seconds : "0" + seconds)      );    },  },  data() {    return {      hasStart: false,      lockTimer: null,      orderGoodsId: 0,      noticeShow: false,      navShow: true,      enableAutoRotation: true,      seekTime: "",      toastTimer: null,      videoToastShow: false,      videoOption: {        mode: "live",        uid: "",        cid: "",        openId: "",        isAutoChange: false,        forceVideo: false,      },      courseHandoutsData: "",      liveDetail: {},      showSet: false,      startStatus: false,      detail: {},      courseId: 0,      placeholder:        "您可以在这里输入笔记内容\n还可以点击左侧图标为笔记加上时间标记",      inputStyle: {        background: "rgba(244, 244, 244, 0.98)",        borderRadius: "24rpx",        padding: "8rpx",        marginBottom: "10rpx",      },      list: [        {          name: "目录",        },        {          name: "笔记",        },        {          name: "答疑",        },        {          name: "聊天",        },      ],      menuList: [],      current: 0,      vid: "",      goodsId: 0,      goodsData: {},      photoPopup: false,      goodsPlayConfig: null,      autoplay: false,      isAllowSeek: "no",      playbackRate: [1.0],      timer: null,      // answerTimer: null,      goodsPhotographConfig: null,      intervalTimeList: [], // 间隔拍照时长      intervalTimeIndex: 0, //当前处于哪个时间段拍照      playTime: 0, //页面播放时长,不含暂停      currentTime: 0,      avatarUrl: "",      ossAvatarUrl: "",      studyDuration: 0, // 当前视频时长      gradeId: 0,      chapterId: 0,      moduleId: 0,      reMenuList: [],      answerList: [],      assignUserId: 0,      placeholder: "您可以在这里输入答疑内容",      ctxValue: "",      noteList: [],      noteValue: "",      noteId: 0,      recordObj: 0,      gradeDetail: {},      isTaking: true, //是否正在拍照      needSeek: false, //第一次播放是否需要跳转      needProfileModal: false, //是否需要资料审核弹框      liveObj: {},      photoNum: 0,      photoList: [], //拍照的时间点      photoConfig: false, //是否配置好拍照次数      photoIndex: 0, //当前位于拍照的区间下标 从0开始      photoHistoryList: [], //已拍照历史的下标点      sectionItem: {},      businessData: {},      showNotes: true,      menuIndex: [],      uploadLock: false, //上传图片      isPlayRebuild: false, //是否正在播放重修视频      isRebuild: false, //视频是否从重修目录点击      isFocus: false,      clearTimer: null,      historyChatMsgList: [],      livingItem: "",      bottomHeight: 0,      toggleCourseShow: false, // 切换课程弹窗      informId: "", //消息id,从公众号消息模板进来的才有      courseList: [], // 课程列表      courseTotal: 0,      options: {},      reStart: false, // 是否显示模块/章/节      s_courseList: [], // 筛选后的      subList: [],      subIndex: 0,      compareFaceData: 0, // 拍照匹配相似度      CountTo: 30, // 倒计时      popupPhotoShow: false,      // h5      faceUrl: "",    };  },  computed: {    ...mapGetters([      "userInfo",      "playSectionId",      "playChannelId",      "playVID",      "other",    ]),  },  onLoad(option) {    console.log("--option--", option);    this.options = option;    this.courseId = option.courseId || "";    this.goodsId = Number(option.goodsId);    // this.gradeId = option.gradeId || 0    this.orderGoodsId = Number(option.orderGoodsId) || "";    // 公众号模板消息的数据埋点    if (option.informId) {      this.informId = option.informId;      // this.clickOfficial()    }  },  async onShow() {    // this.photoPopup = true;    // this.isTaking = true;    console.log("this.options:", this.options);    if (this.options.skipPort) {      await this.$method.skipLogin(this.options.skipPort);    }    if (this.$method.isGoLogin()) {      // 从公众号消息进来的没登录需要跳到登录页,登录后返回      return;    }    this.courseCourseList();    this.informId && this.clickOfficial(); // 从公众号消息点击进来上报一次    this.$store.getters.dictObj;    //相机授权    // this.userConfirmInfoDetail().then(res => {    // })    // this.getbaseprofiletplists();  },  onUnload() {    this.originUnload();  },  onHide() {    this.originUnload();  },  mounted() {},  methods: {    ...mapMutations(["updateChapterOpen", "updateLiveLast"]),    // 新增微信公众号模板消息点击数据    clickOfficial() {      this.$http({        url: "/data/click",        method: "post",        data: { informId: this.informId },      }).then((res) => {        if (res.data.code == 200) {          console.log("埋点");        }      });    },    // 点击课程目录    cMenu(item, index) {      this.subIndex = index;      if (item.subjectId != 0) {        this.s_courseList = this.courseList.filter(          (e) => e.subjectId == item.subjectId        );      } else {        this.s_courseList = this.courseList;      }    },    courseCourseList() {      this.courseList = [];      this.$api        .courseCourseList({          pageNum: 1,          pageSize: 100,          goodsId: this.goodsId,          gradeId: this.gradeId,          orderGoodsId: this.orderGoodsId,        })        .then((res) => {          if (res.data.code == 200) {            this.courseList.push.apply(this.courseList, res.data.rows);            this.courseTotal = res.data.total || 0;            this.s_courseList = this.courseList;            let allItem = [{ subjectId: 0, subjectName: "所有" }];            let ids = [];            const newArr = [];            this.courseList.forEach((item) => {              if (ids.indexOf(item.subjectId) == -1) {                ids.push(item.subjectId);                newArr.push(item);              }            });            this.subList = [...allItem, ...newArr];            if (res.data.total > 1) {              this.getUserWatchLast();            } else if (res.data.total == 1) {              this.originOnShow();              this.originOnMount();            }          }        });    },    // 查询用户最后一次看的录播的信息    getUserWatchLast() {      this.$http({        // url: '/study/record/getUserWatchLast',        url: "/study/record/queryLiveLast",        method: "get",        data: {          goodsId: this.goodsId,        },      }).then((res) => {        if (res.data.code == 200) {          this.sectionItem = res.data.data || {};          if (res.data.data && Object.keys(res.data.data).length) {            //有最后一次看的录播的信息            this.courseId = res.data.data.courseId;          } else {            this.courseId = this.courseList[0].courseId; // 没有观看记录默认一个课程            // this.toggleCourseShow = true          }        } else {          this.courseId = this.courseList[0].courseId; // 没有观看记录默认一个课程        }        this.originOnShow();        this.originOnMount();      });    },    // 原来onshow里面的内容    originOnShow() {      this.updateLiveLast(null);      this.courseDetail();      this.getGoodsDetail();      this.getAnswerList();      // this.studyRecordMenuAllList();      // this.answerTimer = setInterval(() => {      //   this.getAnswerList();      // }, 5000);      let option = this.options;      let noteSecond = Number(option.noteSecond);      if (noteSecond > 0) {        //我的消息跳过来,播放节        let item = {          sectionId: Number(option.sectionId),          recordingUrl: option.recordingUrl,          noteSecond: noteSecond,          studyDuration: noteSecond,        };        let playNextId = `moduleId${option.moduleId}chapterId${          option.chapterId        }sectionId${option.sectionId}${option.isRebuild ? "isRebuild" : ""}`;        this.$store.commit("setPlaySectionId", {          playSectionId: item.sectionId || item.menuId,        });        this.$store.commit("setPlayVID", { playVID: item.recordingUrl });        this.$store.commit("updatePlayNextId", playNextId);        this.playNoteVideo(item);      } else {        this.studyRecordQueryLiveLast();      }    },    // 原来的mouted内容    originOnMount() {      uni.$on("changeSection", (oldSectionId) => {        this.hasStart = false;        this.photoConfig = false;        this.photoIndex = 0;        var polyvPlayerContext = this.selectComponent("#playerVideo");        if (polyvPlayerContext) {          //解决同个节视频切换问题          polyvPlayerContext.seek(0);          polyvPlayerContext.pause();        }        //清除直播        this.$store.commit("setPlayChannelId", { playChannelId: 0 });        this.postStudyRecord(0, oldSectionId);      });      uni.$on("getSection", (item) => {        //清除直播        this.hasStart = false;        this.isPlayRebuild = item.rebuild;        this.photoConfig = false;        this.photoIndex = 0;        this.sectionItem = item;        this.moduleId = item.moduleId || null;        this.chapterId = item.chapterId || null;        this.$store.commit("setPlayChannelId", { playChannelId: 0 });        this.$store.commit("setPlaySectionId", {          playSectionId: item.sectionId || item.menuId,        });        console.log(          "清除直播节点胡:",          this.moduleId,          this.chapterId,          this.playSectionId        );        //获取拍照历史        this.getPhotoLastRecord();        this.polyvLiveHistoryChatMsgList();        this.playVideo(item);      });      uni.$on("levelId", (item) => {        let arr = item.split("-");        //点击节获取的各层级ID        this.moduleId = arr[0];        this.chapterId = arr[1];      });      uni.$on("isRebuild", (item) => {        this.isRebuild = item;      });      this.updateChapterOpen(true);    },    // 原来onUnload里面的内容    originUnload() {      if (this.playSectionId > 0 && this.hasStart) {        //退出提交记录        this.postStudyRecord();      }      //清除正在播放的节ID      // this.$store.commit('setPlayObj',null)      this.$store.commit("setPlaySectionId", { playSectionId: 0 });      this.$store.commit("setPlayChannelId", { playChannelId: 0 });      this.$store.commit("setPlayVID", { playVID: null });      this.closePlv();      //移除所有的事件监听器      uni.$off();      this.clearTimer && clearTimeout(this.clearTimer);      this.toastTimer && clearTimeout(this.toastTimer);      this.timer && clearInterval(this.timer);      if (this.lockTimer) {        clearInterval(this.lockTimer);        this.$api          .lockDelLock({            uuid: this.$method.getUuid(),            action: "jxjy",          })          .then((res) => {            uni.hideLoading();          });      }    },    changeCourses() {      this.toggleCourseShow = true;    },    closePop() {      this.toggleCourseShow = false;    },    // 进入学习    async jump(item, index) {      this.vid = "";      this.hasStart = true;      await this.originUnload();      this.courseId = item.courseId;      this.reStart = false;      this.toggleCourseShow = false;      this.originOnShow();      this.originOnMount();    },    clickLeft() {      // uni.navigateBack()      uni.switchTab({        url: "/pages/learn/index",      });    },    /**     * 获取上次观看的直播     */    studyRecordGetLastLive() {      this.$api        .studyRecordGetLastLive({          orderGoodsId: this.orderGoodsId,          courseId: this.courseId,        })        .then((res) => {          this.updateLiveLast(res.data.data);        });    },    /**     * 获取最后一次看的节     */    studyRecordQueryLiveLast() {      // /study/record/queryLiveLast      this.$api        .studyRecordQueryLiveLast({          orderGoodsId: this.orderGoodsId,          courseId: this.courseId,        })        .then(async (res) => {          if (res.data.data) {            this.moduleId = res.data.data.moduleId;            this.chapterId = res.data.data.chapterId;            if (res.data.data.sectionType == 1) {              //录播              this.$store.commit("setPlaySectionId", {                playSectionId: res.data.data.sectionId,              });              this.$store.commit("setPlayVID", {                playVID: res.data.data.recordingUrl,              });              this.sectionItem = res.data.data;              await this.getPhotoLastRecord(); // 获取拍照历史              this.playVideo(res.data.data);            } else if (res.data.data.sectionType == 2) {              //直播              this.studyRecordGetLastLive();            } else if (res.data.data.sectionType == 3) {              //回放              this.$store.commit("setPlaySectionId", {                playSectionId: res.data.data.sectionId,              });              this.$store.commit("setPlayVID", {                playVID: res.data.data.recordingUrl,              });              this.sectionItem = res.data.data;              this.polyvLiveHistoryChatMsgList();              if (!res.data.data.recordingUrl) {                return;              }              await this.getPhotoLastRecord(); // 获取拍照历史              this.playVideo(res.data.data);            }          }        });    },    async goLive(item) {      let data = await this.studyRecordGetChannelBasicInfo(item.liveUrl);      let nowTime = +this.$method.timest();      if (item.liveStartTime > nowTime) {        if (data.watchStatus == "end" || data.watchStatus == "playback") {          uni.showToast({            title: "直播未开始",            icon: "none",          });          return;        }      } else if (item.liveStartTime < nowTime && item.liveEndTime > nowTime) {        if (data.watchStatus == "end" || data.watchStatus == "playback") {          uni.showToast({            title: "暂无直播",            icon: "none",          });          return;        }      } else if (item.liveEndTime < nowTime) {        if (data.watchStatus == "end" || data.watchStatus == "playback") {          uni.showToast({            title: "直播已结束",            icon: "none",          });          return;        }      }      let moduleId = item.moduleId || 0;      let chapterId = item.chapterId || 0;      let sectionId = item.sectionId || item.menuId;      let uuid = new Date().valueOf() + "";      // buyCourse 是否购买课程:1是 0否      let encode = encodeURIComponent(        this.other.hostLive +          "/pages/live/index?token=" +          uni.getStorageSync("token") +          "&userInfo=" +          (JSON.stringify(this.userInfo) || "") +          "&channelId=" +          item.liveUrl +          "&gradeId=" +          this.gradeId +          "&courseId=" +          this.courseId +          "&goodsId=" +          this.goodsId +          "&orderGoodsId=" +          this.orderGoodsId +          "§ionId=" +          sectionId +          "&chapterId=" +          chapterId +          "&moduleId=" +          moduleId +          "&buyCourse=1" +          "&ident=" +          uuid      );      uni.navigateTo({        url: `/pages5/webview/index?url=` + encode,      });    },    studyRecordMenuAllList() {      this.$api        .studyRecordMenuAllList({          courseId: this.courseId,          gradeId: this.gradeId,          goodsId: this.goodsId,        })        .then((res) => {          let nowTime = Number(new Date().getTime() / 1000).toFixed(0);          // this.livingItem = res.data.data[0]          if (res.data.data) {            this.livingItem = res.data.data.find(              (item) =>                item.liveStartTime <= nowTime && item.liveEndTime > nowTime            );            let isShowNotice =              this.goodsData.buyNote &&              res.data.data.every((e) => e.studyStatus == -1);            if (this.CountTo == 30 && isShowNotice) {              // studyStatus 全部等于-1的时候就是没有看过              this.noticeShow = true;              var timer = setInterval(() => {                this.CountTo--;                if (this.CountTo < 0) {                  clearInterval(timer);                }              }, 1000);            } else {              this.CountTo = -1;            }          } else {            this.CountTo = -1;          }        });    },    noticeConfirm() {      console.log("CountTo:", this.CountTo);      if (this.CountTo < 0) {        this.noticeShow = false;      }    },    studyRecordGetChannelBasicInfo(channelId) {      return new Promise((resolve) => {        this.$api          .studyRecordGetChannelBasicInfo({            channelId,          })          .then((res) => {            resolve(res.data.data);          });      });    },    polyvLiveHistoryChatMsgList() {      this.$api        .polyvLiveHistoryChatMsgList({          sectionId: this.playSectionId,          channelId: this.sectionItem.liveUrl,        })        .then((res) => {          this.historyChatMsgList = res.data.data;        });    },    /**     * 获取业务层次详情     */    // courseBusiness() {    //   this.$api.courseBusiness(this.goodsData.businessId).then((res) => {    //     this.businessData = res.data.data;    //   });    // },    /**     * 计算tabs宽度     */    itemWidth() {      return 100 / this.list.length + "%";    },    /**     * 获取讲义权限     */    // courseHandouts() {    //   this.$api.courseHandouts(this.goodsData.handoutsId).then((res) => {    //     this.courseHandoutsData = res.data.data;    //   });    // },    findMenuNextSection(index) {      for (let i = index + 1; i < this.reMenuList.length; i++) {        let item = this.reMenuList[i];        if (item.type == 3) {          return item;        }      }      return {};    },    loadedmetadata(e) {      var polyvPlayerContext = this.selectComponent("#playerVideo");      this.hasStart = true;      uni.$off("playPause");      uni.$on("playPause", () => {        polyvPlayerContext.pause();      });      if (!this.recordObj.videoCurrentTime) {        //新视频直接提交一条观看记录        this.postStudyRecord(0);      }    },    getPhotoLastRecord() {      let self = this;      let data = {        sectionId: parseInt(self.playSectionId),        goodsId: parseInt(self.goodsId),        courseId: parseInt(self.courseId),        gradeId: parseInt(self.gradeId),        chapterId: parseInt(self.chapterId),        moduleId: parseInt(self.moduleId),        orderGoodsId: this.orderGoodsId,      };      this.$api.getPhotoLastRecord(data).then((res) => {        if (res.data.code == 200) {          //清空历史数据          self.photoHistoryList = [];          this.photoIndex = 0;          self.photoList = [];          for (let i = 0; i < res.data.data.length; i++) {            //-2存储随机拍照数组            if (res.data.data[i].photoIndex == -2) {              self.photoList = res.data.data[i].timeInterval.split(",");            } else {              self.photoHistoryList.push(res.data.data[i].photoIndex);            }          }        }      });    },    //postTime 只提交随机时间    postCoursePhotoRecord(postTime = false) {      return new Promise((resolve, reject) => {        let currentTime = 0;        var polyvPlayerContext = this.selectComponent("#playerVideo");        if (polyvPlayerContext) {          currentTime = polyvPlayerContext.getCurrentTime();        }        let self = this;        let photoIndex = self.photoIndex;        let data = {          photo: self.ossAvatarUrl,          sectionId: parseInt(self.playSectionId),          goodsId: parseInt(self.goodsId),          courseId: parseInt(self.courseId),          photoTime: parseInt(currentTime > 0 ? currentTime : 0),          gradeId: parseInt(self.gradeId),          photoIndex: postTime ? -2 : parseInt(photoIndex), //从0算起,-2只提交随机时间          photoNum: parseInt(self.photoNum),          chapterId: parseInt(self.chapterId),          moduleId: parseInt(self.moduleId),          timeInterval: postTime ? self.photoList.join(",") : "",          orderGoodsId: this.orderGoodsId,        };        // console.log("提交接口", data);        this.$api          .coursePhotoRecord(data)          .then((res) => {            // console.log(res,'postCoursePhotoRecord')            if (res.data.code == 200) {              resolve();            } else {              reject();            }          })          .catch((err) => {            reject();          });      });    },    randomNum(minNum, maxNum) {      switch (arguments.length) {        case 1:          return parseInt(Math.random() * minNum + 1, 10);          break;        case 2:          return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);          break;        default:          return 0;          break;      }    },    //配置随机拍照时间    configPhoto() {      var polyvPlayerContext = this.selectComponent("#playerVideo");      let totalVideoTime = polyvPlayerContext.getDuration();      let duration = polyvPlayerContext.getCurrentTime();      let photoNum = this.photoNum;      if (!this.photoConfig) {        this.photoConfig = true;        // let  spaceTime = Math.floor(totalVideoTime/photoNum) //拍照时间区间        // if(spaceTime<5){//区间小于5秒        // 	photoNum = Math.floor(totalVideoTime/5)        // 	spaceTime = 5        // }        // if(photoNum<1){        // 	photoNum = 1 //只要设置,至少拍一次        // 	spaceTime = totalVideoTime        // }        // let initSpace = 0        //没有历史拍照间隔数据        if (this.photoList.length == 0) {          if (totalVideoTime >= 900) {            //大于15分钟            if (photoNum == 1) {              //开头拍1张              this.photoList.push(0);            } else if (photoNum == 3) {              //拍3张              this.photoList.push(0); //开头拍一张              let centerTime = Math.floor(totalVideoTime / 2); //获取中间时间              let centerMinTime = centerTime - 300; //前后5分钟              let centerMaxTime = centerTime + 300;              let centerTakeTime = this.randomNum(centerMinTime, centerMaxTime);              this.photoList.push(centerTakeTime); //中间拍一张              let endMaxTime = totalVideoTime - 60;              let endMinTime = totalVideoTime - 300;              let endTakeTime = this.randomNum(endMinTime, endMaxTime);              this.photoList.push(endTakeTime); //最后拍一张            }          } else {            //小于15分钟,只拍前后各一张            if (photoNum == 1) {              //开头拍1张              this.photoList.push(0);            } else if (photoNum == 3) {              this.photoList.push(1);              let centerTime = this.randomNum(                (1 / 3) * totalVideoTime,                (2 / 3) * totalVideoTime              );              this.photoList.push(centerTime);              let endTakeTime = this.randomNum(                (2 / 3) * totalVideoTime,                totalVideoTime              );              this.photoList.push(endTakeTime);            }          }          // for(let i=0;i<photoNum;i++){          // 	let s = this.randomNum(initSpace,initSpace+spaceTime)          // 	if(s>totalVideoTime){          // 		s = totalVideoTime-1          // 	}          // 	if(s<=5){          // 		s =5 //避免出现5秒内拍照时间          // 	}          // 	this.photoList.push(s)          // 	initSpace+=spaceTime          // }          // console.log(this.photoList, "随机拍照时间数组11", photoNum);          this.postCoursePhotoRecord(true); //提交随机拍照时间数组        }        // console.log(this.photoList, "随机拍照时间数组");        //兼容已有观看历史        for (let i = 0; i < this.photoList.length - 1; i++) {          if (            this.photoList[i] < duration &&            this.photoList[i + 1] > duration          ) {            this.photoIndex = i + 1;            break;          }          if (duration > this.photoList[this.photoList.length - 1]) {            this.photoIndex = this.photoList.length - 1; //取最后一个下标            break;          }        }      }    },    openSetting(res) {      // console.log(res, 98);    },    getCameraSetting() {      const self = this;      wx.getSetting({        success: (res) => {          if (res.authSetting["scope.camera"]) {            // 用户已经授权            self.showSet = false;          } else {            // 用户还没有授权,向用户发起授权请求            wx.authorize({              scope: "scope.camera",              success() {                // 用户同意授权                self.showSet = false;              },              fail() {                // 用户不同意授权                self.showSet = true;                /* wx.showToast({		                title: '摄像头授权失败',		                icon: 'none',		                duration: 3000		              }) */              },            });          }        },        fail: (res) => {},      });    },    studyNotice() {      this.noticeShow = true;    },    //播放笔记视频    async playNoteVideo(item) {      if (this.timer) {        clearInterval(this.timer);      }      if (this.vid) {        //切换视频        var polyvPlayerContext = this.selectComponent("#playerVideo");        polyvPlayerContext.changeVid(item.recordingUrl);      } else {        this.vid = item.recordingUrl;      }      this.recordObj = { videoCurrentTime: item.noteSecond };      if (this.recordObj.videoCurrentTime) {        this.needSeek = true; //需要跳转到播放记录      }      this.startStatus = true;      //获取节笔记      this.getNoteList();    },    //正常播放视频    async playVideo(item) {      console.log(item, "2222222222");      if (item.sectionType == 3) {        // 回放的不播放        return;      }      if (this.timer) {        clearInterval(this.timer);      }      if (this.vid) {        //切换视频        var polyvPlayerContext = this.selectComponent("#playerVideo");        polyvPlayerContext.changeVid(item.recordingUrl);      } else {        this.vid = item.recordingUrl;      }      this.recordObj = null;      this.recordObj = await this.getRecordLast();      // console.log('this.recordObj:', this.recordObj)      this.needSeek = true; //跳转到播放记录      this.startStatus = true;      // 提交学习记录      this.postStudyRecord(0);      //获取节笔记      this.getNoteList();    },    getRecordLast() {      let self = this;      return new Promise((resolve) => {        let data = {          gradeId: Number(self.gradeId),          goodsId: Number(self.goodsId),          sectionId: Number(self.playSectionId),          courseId: Number(self.courseId),          chapterId: parseInt(self.chapterId),          moduleId: parseInt(self.moduleId),          orderGoodsId: this.orderGoodsId,        };        // 获取用户节的最后一次学习记录/study/record/last        self.$api.recordLast(data).then((res) => {          resolve(res.data.data);        });      });    },    jumpNote(item) {      this.noteId = item.noteId;      //没视频播放      if (this.playSectionId == 0) {        this.$u.toast("即将跳到笔记位置");        this.$store.commit("setPlaySectionId", {          playSectionId: item.sectionId || item.menuId,        });        this.$store.commit("setPlayVID", { playVID: item.recordingUrl });        this.playNoteVideo(item);      } else {        //正在看当前笔记视频        this.$u.toast("即将跳到笔记位置");        //跳到笔记时刻        var polyvPlayerContext = this.selectComponent("#playerVideo");        polyvPlayerContext.seek(item.noteSecond);        polyvPlayerContext.play();      }    },    postNote() {      let self = this;      if (!(this.playSectionId > 0)) {        this.$u.toast("目前无播放视频");        return;      }      if (!this.noteValue) {        this.$u.toast("请输入内容");        return;      }      // if (!this.gradeId) { // 直播课程没有班级,去掉判断,默认为0      //   this.$u.toast("暂无班级数据");      //   return;      // }      var polyvPlayerContext = this.selectComponent("#playerVideo");      let noteDate = this.$method.getZeroTime();      let noteSecond = polyvPlayerContext.getCurrentTime();      if (!noteSecond) {        if (noteSecond == 0) {          //播放结束          noteSecond = polyvPlayerContext.getDuration();        }        if (!noteSecond) {          this.$u.toast("视频暂未开始");          return;        }      }      let data = {        gradeId: this.gradeId,        goodsId: this.goodsId,        sectionId: this.playSectionId,        courseId: this.courseId,        noteText: this.noteValue,        noteDate: noteDate,        noteSecond: noteSecond,        orderGoodsId: this.orderGoodsId,      };      // /user/note 新增用户笔记      this.$api.postNote(data).then((res) => {        if (res.data.code == 200) {          this.$u.toast("发布成功");          self.getNoteList();          this.noteValue = "";        }      });    },    getNoteList() {      let self = this;      self.noteList = [];      let data = {        courseId: this.courseId,        gradeId: this.gradeId,        goodsId: this.goodsId,        orderGoodsId: this.orderGoodsId,      };      if (this.playSectionId > 0) {        data.sectionId = this.playSectionId;      }      this.$api.noteList(data).then((res) => {        if (res.data.code == 200) {          self.noteList = res.data.rows;        }      });    },    delAnswer(answerId) {      let self = this;      let data = {        answerId: answerId,        status: -1,        orderGoodsId: this.orderGoodsId,      };      this.$api.delAnswer(data).then((res) => {        if (res.data.code == 200) {          self.getAnswerList();        }      });    },    clearCtx() {      this.placeholder = "您可以在这里输入答疑内容";      this.ctxValue = "";      this.assignUserId = 0;    },    focusNote(event) {      this.bottomHeight = event.detail.height;    },    blurNote() {      this.bottomHeight = 0;    },    blur() {      this.bottomHeight = 0;      this.clearTimer = setTimeout(() => {        this.ctxValue = "";        this.isFocus = false;        this.assignUserId = 0;        this.placeholder = "您可以在这里输入答疑内容";      }, 2000);    },    replyContent(item) {      this.isFocus = true;      this.assignUserId = item.userId;      this.placeholder = "@" + item.realname;    },    delContent(item) {      this.delAnswer(item.answerId);    },    postAnswer() {      let self = this;      let data = {        courseId: this.courseId,        answerText: this.ctxValue,        goodsId: this.goodsId,        orderGoodsId: this.orderGoodsId,      };      if (this.assignUserId > 0) {        data.assignUserId = this.assignUserId;      }      this.$api.postAnswer(data).then((res) => {        if (res.data.code == 200) {          this.$u.toast("发布成功");          self.getAnswerList();          this.isFocus = false;          this.placeholder = "您可以在这里输入答疑内容";          this.ctxValue = "";          this.assignUserId = 0;        }      });    },    postContent() {      if (!this.ctxValue || this.ctxValue == "") {        this.$u.toast("请输入内容");        return;      }      this.postAnswer();    },    postStudyRecord(status = 0, sectionId = this.playSectionId) {      let currentTime = 0;      let PlayDuration = 0;      var polyvPlayerContext = this.selectComponent("#playerVideo");      if (polyvPlayerContext) {        currentTime = polyvPlayerContext.getCurrentTime(); //总的视频播放时刻        PlayDuration = polyvPlayerContext.getVideoPlayDuration(); //本次看的时长      }      if (this.playChannelId > 0) {        currentTime = 2; //直播无法获取,无论开始结束都传2秒      }      let self = this;      let data = {        fromPlat: 1, //来源平台 1小程序 2网站        photo: self.ossAvatarUrl,        sectionId: sectionId || 0,        goodsId: parseInt(self.goodsId),        courseId: parseInt(self.courseId),        orderGoodsId: this.orderGoodsId,        studyDuration: parseInt(          PlayDuration > 0 ? PlayDuration : self.studyDuration        ),        gradeId: parseInt(self.gradeId),        chapterId: this.chapterId || 0,        moduleId: this.moduleId || 0,        videoCurrentTime: parseInt(          currentTime > 0 ? currentTime : self.studyDuration        ),      };      if (this.ossAvatarUrl) {        data.similarity = this.compareFaceData; // 相似度      }      if (status > 0) {        data.status = status;      }      // console.log("提交接口", data);      this.$api.studyRecord(data).then((res) => {        if (res.data.code == 200) {          if (status > 0) {            let moduleId = this.moduleId || 0;            let chapterId = this.chapterId || 0;            let playNextIdisRebuild = `moduleId${moduleId}chapterId${chapterId}sectionId${sectionId}isRebuild`;            let playNextId = `moduleId${moduleId}chapterId${chapterId}sectionId${sectionId}`; //拼接对应章节唯一id            uni.$emit("playNext" + playNextIdisRebuild, {              fromRebuild: this.isRebuild,            }); //通知播放结束,不来自重修目录的点击不用弹窗学习下一节            uni.$emit("playNext" + playNextId); //通知播放结束          }          self.ossAvatarUrl = "";        } else {          this.uploadLock = false;          uni.showToast({            icon: "none",            title: res.data.msg,          });        }      });    },    uploadFile(options, int) {      var self = this;      return new Promise((resolve, reject) => {        var data = {          imageStatus: int,          gradeId: this.gradeId,          orderGoodsId: this.orderGoodsId,        };        self.$api.aliyunpolicy(data).then((res) => {          if (res.data.code != 200) {            self.$method.showToast("签名错误" + JSON.stringify(res.data));            return;          }          var ossToken = res.data.data.resultContent;          if (ossToken.host == null || ossToken.host == undefined) {            self.$method.showToast("上传路径报错" + JSON.stringify(res.data));            return;          }          let filePath = "";          // #ifdef H5          var localData = options; //dataUrl为base64位          let base = atob(localData.substring(localData.indexOf(",") + 1)); // base是将base64编码解码,去掉data:image/png;base64部分          let length = base.length;          let url = new Uint8Array(length);          while (length--) {            url[length] = base.charCodeAt(length);          }          filePath = new File([url], "a.jpg", {            type: "image/jpg",          });          console.log("filePath:", filePath);          uni.uploadFile({            url: ossToken.host,            name: "file",            file: filePath,            fileType: "image",            header: {              AuthorizationToken: "WX " + uni.getStorageSync("token"),            },            formData: {              key: ossToken.dir,              OSSAccessKeyId: ossToken.accessid,              policy: ossToken.policy,              Signature: ossToken.signature,              callback: ossToken.callback,              success_action_status: 200,            },            success: (result) => {              this.$u.toast("上传成功");              this.ossAvatarUrl = ossToken.dir;              console.log("h5上传成功--:", this.ossAvatarUrl);              resolve(this.ossAvatarUrl);            },            fail: (error) => {              console.log("h5上传失败:", error);              uni.showToast({                title: "上传接口报错,请重新拍照上传" + error,                icon: "none",              });              this.openPhoto();              return;            },          });          // #endif          // #ifdef MP-WEIXIN          uni.uploadFile({            url: ossToken.host,            name: "file",            filePath: options,            fileType: "image",            header: {              AuthorizationToken: "WX " + uni.getStorageSync("token"),            },            formData: {              key: ossToken.dir,              OSSAccessKeyId: ossToken.accessid,              policy: ossToken.policy,              Signature: ossToken.signature,              callback: ossToken.callback,              success_action_status: 200,            },            success: (result) => {              // if (result.statusCode === 200) {              this.$u.toast("上传成功");              this.ossAvatarUrl = ossToken.dir;              resolve(this.ossAvatarUrl);              // } else {              //   uni.showToast({              //     title: "上传失败",              //     icon: "none",              //   });              //   this.openPhoto();              //   return;              // }            },            fail: (error) => {              uni.showToast({                title: "上传接口报错,请重新拍照上传" + error,                icon: "none",              });              this.openPhoto();              return;            },          });          // #endif        });      });    },    imageInfos() {      var self = this;      return new Promise(async (resolve, reject) => {        // #ifdef MP-WEIXIN        uni.getImageInfo({          src: self.avatarUrl,          success: async (res) => {            let canvasWidth = res.width; //图片原始长宽            let canvasHeight = res.height;            if (canvasWidth > 2000 || canvasHeight > 2000) {              uni.compressImage({                src: self.avatarUrl,                quality: 75,                width: "35%",                height: "35%",                success: async (rest) => {                  const waitUpload = await self.uploadFile(                    rest.tempFilePath,                    0                  );                  resolve(waitUpload);                },              });            } else if (canvasWidth > 1000 || canvasHeight > 1000) {              uni.compressImage({                src: self.avatarUrl,                quality: 75,                width: "50%",                height: "50%",                success: async (rest) => {                  const waitUpload = await self.uploadFile(                    rest.tempFilePath,                    0                  );                  resolve(waitUpload);                },              });            } else {              // console.log("无需压缩");              const waitUpload = await self.uploadFile(self.avatarUrl, 0);              resolve(waitUpload);            }          },          fail: (err) => {            this.$u.toast("图片上传失败");          },        });        // #endif        // #ifdef H5        const waitUpload = await this.uploadFile(this.faceUrl, 0);        resolve(waitUpload);        // #endif      });    },    timeEvent() {      let self = this;      var polyvPlayerContext = this.selectComponent("#playerVideo");      if (polyvPlayerContext != null) {        this.playTime = polyvPlayerContext.getCurrentTime(); //播放时刻        //	console.log(this.playTime,789,this.photoHistoryList)        //判断是否需要拍照        if (this.photoNum > 0) {          this.configPhoto();          let photoTime = 0; //获取拍照秒数          for (let i = 0; i < this.photoList.length; i++) {            photoTime = Number(this.photoList[i]); //获取拍照秒数            if (photoTime < this.playTime && photoTime > this.playTime - 8) {              //3秒区间内才触发拍照,避免拉动滚动条              if (                this.photoHistoryList.indexOf(i) < 0 &&                this.sectionItem.learning != 1              ) {                //不存在拍照历史,没有重修过,没有学过,则拍照                //启动拍照                //暂停                polyvPlayerContext.exitFullScreen();                polyvPlayerContext.pause();                if (uni.getStorageSync("tabkePhotoShow")) {                  this.photoIndex = i;                  this.openPhoto();                } else {                  this.popupPhotoShow = true;                  uni.setStorageSync("tabkePhotoShow", 1); // 本地缓存用来判断是否已经弹出过弹窗                }              }            }          }        }      }    },    closeToast() {      clearTimeout(this.toastTimer);      this.videoToastShow = false;    },    restart() {      var polyvPlayerContext = this.selectComponent("#playerVideo");      polyvPlayerContext.seek(0);      clearTimeout(this.toastTimer);      this.videoToastShow = false;    },    // 新增用户视频学习日志    studyLog() {      this.$http({        url: "/user/study/log",        method: "post",        data: {          goodsId: this.goodsId,          courseId: this.courseId,          moduleId: this.moduleId || 0,          chapterId: this.chapterId || 0,          sectionId: this.playSectionId || 0,          fromPlat: 1, //来源平台 1小程序 2PC网站          goodsType: 6, // 商品类型 1视频2题库 3补考 4前培 5虚拟赠送题库 6直播          orderGoodsId: this.orderGoodsId,        },      }).then((res) => {        // console.log('直播的用户学习日志:', res)      });    },    onStateChange(newstate, oldstate) {      if (newstate.detail.newstate == "playing") {        if (this.needSeek) {          var polyvPlayerContext = this.selectComponent("#playerVideo");          if (this.recordObj.videoCurrentTime) {            polyvPlayerContext.seek(this.recordObj.videoCurrentTime);            this.seekTime = this.$method.secondToDate(              this.recordObj.videoCurrentTime            );            this.videoToastShow = true;            this.toastTimer = setTimeout(() => {              this.videoToastShow = false;            }, 3000);          } else {            polyvPlayerContext.seek(1); //避免相同节继续播放          }          polyvPlayerContext.play();          this.needSeek = false;          // 新增用户视频学习日志          this.studyLog();        }        //开始播放        if (this.timer) {          clearInterval(this.timer);        }        this.timer = setInterval(this.timeEvent, 1000); //定时器      }      if (newstate.detail.newstate == "pause") {        clearInterval(this.timer);        //暂停提交记录        /* this.ossAvatarUrl = ""				this.postStudyRecord() */      }      if (newstate.detail.newstate == "ended") {        clearInterval(this.timer);        uni.showToast({          icon: "none",          title: "播放完毕",        });        this.hasStart = false;        this.postStudyRecord(1);        // uni.$emit('playNext') //播放重修下一节      }    },    //拍照    openPhoto() {      var polyvPlayerContext = this.selectComponent("#playerVideo");      if (polyvPlayerContext) {        polyvPlayerContext.exitFullScreen();      }      // #ifdef MP-WEIXIN      this.enableAutoRotation = false;      this.photoPopup = true;      this.isTaking = true;      uni.setKeepScreenOn({        keepScreenOn: true,      });      uni.authorize({        scope: "scope.camera",        success() {},      });      // #endif      // #ifdef H5      if (        (window.navigator.mediaDevices &&          window.navigator.mediaDevices.getUserMedia) ||        window.navigator.getUserMedia ||        window.navigator.webkitGetUserMedia ||        window.navigator.mozGetUserMedia      ) {        console.log("getUserMedia----");        // 调用用户媒体设备, 访问摄像头        this.getUserMedia(          {            video: {              width: 400,              height: 300,            },          },          this.photographSuccess,          this.photographError        );      } else {        console.log("1111没有摄像");        this.photographError();      }      // #endif    },    /**     * 人脸匹配     */    faceRecognition(url) {      return new Promise((resolve) => {        // // #ifdef MP-WEIXIN        // let fileSystem = uni.getFileSystemManager();        // fileSystem.readFile({        //   filePath: `${this.avatarUrl}`,        //   encoding: "base64",        //   position: 0,        //   success: (res) => {        //     let base64 = "data:image/jpg;base64," + res.data;        //     console.log("直播课-base64Data人脸识别参数:", {        //       imageA: base64,        //       orderGoodsId: this.orderGoodsId,        //       gradeId: this.gradeId,        //     });        //     this.CompareFace(base64, resolve);        //   },        //   fail(err) {        //     console.error(err, "err");        //   },        // });        // // #endif        // // #ifdef H5        // this.CompareFace(this.faceUrl, resolve);        // // #endif		this.CompareFace(url, resolve);      });    },    CompareFace(url, resolve) {      let timer = setTimeout(() => {        uni.showToast({          icon: "none",          title: "拍照超时,请重新拍照",          duration: 2000,          success: () => {            setTimeout(() => {              uni.navigateBack();            }, 1000);          },        });      }, 10 * 1000);      this.$api        .faceCertificationCompareFace({			urlA: url,          // imageA: url,          orderGoodsId: this.orderGoodsId,          gradeId: this.gradeId,        })        .then((res) => {          clearTimeout(timer);          console.log(res, "人脸识别成功res");          resolve(res.data);        })        .catch((err) => {          clearTimeout(timer);          // 当前网络延迟,          console.log("人脸识别错误:", err);          uni.showModal({            content: "当前网络延迟",            showCancel: false,            success: (resultst) => {              if (resultst.confirm) {                uni.navigateBack();              }            },          });        });    },    async submit() {      if (this.uploadLock) {        return;      }      this.uploadLock = true;        const waitYS = await this.imageInfos();      let compareFaceData = await this.faceRecognition(waitYS);      if (compareFaceData.code === 200) {      this.compareFaceData = compareFaceData.data;        this.postCoursePhotoRecord()          .then((res) => {            this.photoHistoryList.push(this.photoIndex);            this.postStudyRecord(); //提交记录            //恢复播放            uni.setKeepScreenOn({              keepScreenOn: false,            });            this.photoPopup = false;            this.uploadLock = false;            this.enableAutoRotation = true;            var polyvPlayerContext = this.selectComponent("#playerVideo");            if (polyvPlayerContext != null) {              polyvPlayerContext.play();            }          })          .catch((err) => {            uni.showToast({              title: "上传接口报错,请重新拍照上传" + err,              icon: "none",            });            this.uploadLock = false;            this.openPhoto();          });      } else {        uni.showToast({          title: compareFaceData.msg,          icon: "none",          duration: 2000,        });        setTimeout(() => {          this.uploadLock = false;          this.openPhoto();        }, 2000);        return;      }    },    reTake() {      this.isTaking = true;      // #ifdef H5      this.faceUrl = "";      this.getUserMedia({        video: {          width: 400,          height: 300,        },      });      // #endif    },    toTakePhoto() {      this.popupPhotoShow = false;      this.openPhoto();    },    takePhTips() {      this.popupPhotoShow = true;      this.isTaking = false;      this.photoPopup = false;      this.enableAutoRotation = false;    },    //确认拍照    takePhoto() {      // #ifdef MP-WEIXIN      const ctx = uni.createCameraContext();      ctx.takePhoto({        quality: "high",        success: (res) => {          this.avatarUrl = res.tempImagePath;          this.isTaking = false;        },        fail: (err) => {          console.log(err);        },      });      // #endif      // #ifdef H5      const canvas = document.createElement("canvas");      canvas.width = 400;      canvas.height = 400;      const context = canvas.getContext("2d");      const box = document.querySelector(".photo_v");      const video = box.querySelector("video");      context.drawImage(video, 0, 0, 400, 400);      this.faceUrl = canvas.toDataURL("image/png");      this.isTaking = false;      // #endif    },    playError(e) {      console.log(e);    },    //拍照报错    error(e) {      console.log(e.detail);    },    //关闭相机    closePhoto() {      this.photoPopup = false;      self.enableAutoRotation = true;    },    /**     * 进入全屏     */    fullscreenchange(event) {      if (event.detail.direction == "vertical") {        this.navShow = true;      } else if (event.detail.direction == "horizontal") {        this.navShow = false;      }    },    getGoodsDetail() {      let self = this;      // goods/'+ data      this.$api.goodsDetail(this.goodsId).then((res) => {        self.goodsData = res.data.data;        // this.courseBusiness();        // this.courseHandouts();        self.getMenuList();        //获取节笔记        this.getNoteList();        if (self.goodsData.goodsPlayConfig) {          self.goodsPlayConfig = JSON.parse(self.goodsData.goodsPlayConfig);          if (self.goodsPlayConfig.autoPlay > 0) {            self.autoplay = true;          }          if (self.goodsPlayConfig.drag > 0) {            self.isAllowSeek = "yes";          }          if (self.goodsPlayConfig.speed > 0) {            self.playbackRate = [0.5, 0.8, 1.0, 1.25, 1.5, 2.0];          }        }        if (self.goodsData.goodsPhotographConfig) {          self.goodsPhotographConfig = JSON.parse(            self.goodsData.goodsPhotographConfig          );          if (self.goodsPhotographConfig.photoNum > 0) {            self.photoNum = self.goodsPhotographConfig.photoNum;          }        }        this.studyRecordMenuAllList();      });    },    startVideo() {      this.startStatus = true;    },    getAnswerList() {      let self = this;      this.$api        .answerList({          courseId: this.courseId,          goodsId: this.goodsId,          orderGoodsId: this.orderGoodsId,        })        .then((res) => {          if (res.data.code == 200) {            self.answerList = res.data.rows;          }        });    },    getMenuList() {      // let self = this;      // /course/menuList      this.$api        .reMenuList({          courseId: this.courseId,          gradeId: this.gradeId,          orderGoodsId: this.orderGoodsId,        })        .then((res) => {          if (res.data.code == 200) {            for (let i = 0; i < res.data.rows.length; i++) {              let item = res.data.rows[i];              item.down = true;              item.id = item.menuId;              item.name = item.menuName;              item.menuType = item.type;            }            this.menuList = res.data.rows;            this.reStart = true;            for (let i = 0; i < res.data.rows.length; i++) {              if (res.data.rows[i].type == 1) {                if (Object.keys(this.sectionItem).length) {                  let playNextId = `moduleId${this.sectionItem.moduleId}chapterId${this.sectionItem.chapterId}sectionId${this.sectionItem.sectionId}`;                  this.$store.commit("updatePlayNextId", playNextId);                  if (res.data.rows[i].menuId == this.sectionItem.moduleId) {                    this.menuIndex = [i];                    break;                  }                } else {                  this.menuIndex = [i];                  break;                }              } else if (res.data.rows[i].type == 2) {                // 章                if (Object.keys(this.sectionItem).length) {                  let playNextId = `moduleId${this.sectionItem.moduleId}chapterId${this.sectionItem.chapterId}sectionId${this.sectionItem.sectionId}`;                  this.$store.commit("updatePlayNextId", playNextId);                  if (                    res.data.rows[i].menuId == this.sectionItem.chapterId &&                    (!this.sectionItem.moduleId ||                      this.sectionItem.moduleId == 0)                  ) {                    this.menuIndex = [i];                    break;                  }                } else {                  this.menuIndex = [i];                  break;                }              }            }          }        });    },    courseDetail() {      let self = this;      // /course/'+data 获取课程详细信息      this.$api.courseDetail(this.courseId).then((res) => {        if (res.data.code == 200) {          // if (res.data.data.educationName == "继续教育") {          this.$api            .lockLockAction({              action: "jxjy",              uuid: this.$method.getUuid(),            })            .then((res) => {});          this.lockTimer = setInterval(() => {            this.$api              .lockLockAction({                action: "jxjy",                uuid: this.$method.getUuid(),              })              .then((res) => {});          }, 10000);          // websocket.sendMsg("doCourse");          // }          self.detail = res.data.data;        }      });    },    open(item) {      item.showChildren = !item.showChildren;    },    change(index) {      this.current = index;    },    openDocument() {      let self = this;      let url = this.$method.splitImgHost(this.courseHandoutsData.handoutsUrl);      uni.downloadFile({        url: url,        success: function (res) {          var filePath = res.tempFilePath;          uni.openDocument({            filePath: filePath,            showMenu: self.courseHandoutsData.canDownload == 1 ? true : false,            success: function (res) {              // console.log(res, "打开文档成功");            },            fail: function (err) {              uni.showToast({                icon: "none",                title: "文档地址错误",              });            },          });        },        fail: (err) => {          uni.showModal({            title: "提示",            content: "文档错误," + err.errMsg,            showCancel: false,          });        },      });    },    /**     * 退出全屏     */    exitFullscreen() {      try {        var de = document;        // console.log(de);        if (de.exitFullscreen) {          de.exitFullscreen();        } else if (de.mozCancelFullScreen) {          de.mozCancelFullScreen();        } else if (de.webkitCancelFullScreen) {          de.webkitCancelFullScreen();        }      } catch (err) {}    },    fullele() {      return (        document.fullscreenElement ||        document.webkitFullscreenElement ||        document.msFullscreenElement ||        document.mozFullScreenElement ||        null      );    },    //判断是否全屏    isFullScreen() {      return !!(document.webkitIsFullScreen || this.fullele());    },    getUserMedia(constraints, success, error) {      console.log("getUserMedia===", constraints, "success:", success);      if (window.navigator.mediaDevices.getUserMedia) {        // 最新的标准API        window.navigator.mediaDevices          .getUserMedia(constraints)          .then(success)          .catch(error);      } else if (window.navigator.webkitGetUserMedia) {        // webkit核心浏览器        window.navigator.webkitGetUserMedia(constraints, success, error);      } else if (window.navigator.mozGetUserMedia) {        // firfox浏览器        window.navigator.mozGetUserMedia(constraints, success, error);      } else if (window.navigator.getUserMedia) {        // 旧版API        window.navigator.getUserMedia(constraints, success, error);      }    },    photographSuccess(stream) {      console.log("有摄像头---", stream);      this.photoPopup = true;      this.isTaking = true;      this.enableAutoRotation = false;      this.$nextTick(() => {        const box = document.querySelector(".photo_v");        const video = box.querySelector("video");        console.log("video:", video);        video.srcObject = stream;        video.play();      });    },    photographError(err) {      console.log("没有摄像头:", err);      uni.showModal({        title: "提示",        content:          "课程学习需要开启摄像头进行拍照,经检测您的设备无摄像头可使用,请检测环境是否支持。",        cancelText: "取消",        confirmText: "确定",        success: (res) => {          if (res.confirm) {            uni.navigateBack();          } else if (res.cancel) {          }        },      });    },  },};</script><style lang="scss" scope>@import "../polyv/css/detail.scss";.top {  &__header {    position: relative;    width: 100%;    height: 150rpx;    padding: 24rpx 150rpx 24rpx 24rpx;    .img {      position: absolute;      left: 0;      top: 0;      width: 100%;    }    .note {      position: relative;      z-index: 10;      font-size: 24rpx;      font-family: PingFang SC;      font-weight: bold;      color: #efdbff;    }    .title {      position: relative;      z-index: 10;      font-size: 26rpx;      font-family: PingFang SC;      font-weight: bold;      color: #ffffff;    }    .desc {    }  }}.polyv_detail {  display: flex;  flex-direction: column;  height: 100vh;  .box {    flex: 1;    overflow: hidden;    margin: 16rpx 16rpx 100rpx 16rpx;    .box_in {      height: 100%;    }  }  .first_ml {    margin: 16rpx 16rpx 16rpx 16rpx;  }}.btnSet {  width: 440rpx;  height: 80rpx;  background: #007aff;  border-radius: 40rpx;  color: #ffffff;  font-size: 28rpx;  line-height: 80rpx;}.btnReply {  width: 80rpx;  height: 40rpx;  background: #e3f0ff;  border-radius: 16rpx;  text-align: center;  color: #007aff;}.btnDel {  width: 80rpx;  height: 40rpx;  background: #ffedf0;  border-radius: 16rpx;  text-align: center;  color: #ff2d55;}.btnReply {  width: 80rpx;  height: 40rpx;  background: #e3f0ff;  border-radius: 16rpx;  font-size: 24rpx;}.lecture-box {  display: flex;  align-items: center;  height: 80rpx;  background: #ffffff;  border-radius: 16rpx 16rpx 16rpx 16rpx;  .title {    padding: 10rpx;    flex: 1;    overflow: hidden;    text-overflow: ellipsis;    white-space: nowrap;    color: #333;    font-weight: bold;    font-size: 32rpx;  }  .btn {    display: flex;    align-items: center;    justify-content: center;    width: 80rpx;    height: 80rpx;    background: #ffffff;    box-shadow: -4rpx 0rpx 4rpx 0rpx rgba(0, 0, 0, 0.1);    border-radius: 16rpx 16rpx 16rpx 16rpx;  }}.lecture-content {  background: #fff;  margin-top: 10rpx;  padding: 10rpx;  border-radius: 16rpx;}.photoBox {  width: 100%;  // background-color: #ffffff;  // border-radius: 24px 24px 0px 0px;  .photoTop {    width: 100%;    height: 74rpx;    border-radius: 20px 20px 0px 0px;    background-color: #ffffff;    display: flex;    align-items: center;    justify-content: center;    padding: 0rpx 38rpx;    .sqzz {      width: 28rpx;      height: 28rpx;      display: flex;      align-items: center;      justify-content: center;    }    .centersq {      color: #333;      font-size: 30rpx;      font-weight: 500;    }  }  .photoCenter {    width: 750rpx;    height: 75vh;    position: relative;    .center_camera {      width: 100%;      height: 75vh;      position: fixed;      .head_take {        width: 100%;        height: 75vh;        display: flex;        flex-direction: column;      }      .headTake_up {        width: 100%;        height: 100rpx;      }      .headTake_minddle {        display: flex;        .min_img {          width: 500rpx;          height: 550rpx;        }        .min_left,        .min_right {          flex: 1;          height: 550rpx;        }      }      .headTake_down {        width: 100%;        flex: 1;      }      .color {        background-color: #333;        opacity: 0.5;      }      .photo_v {        width: 100%;        height: 100%;      }      .mask {        width: 500rpx;        height: 550rpx;        position: absolute;        top: 100rpx;        left: 0;        right: 0;        bottom: 0;        margin: 0 auto;        box-shadow: 0 0 0 2000px rgba(0, 0, 0, 0.4);      }    }    .custom {      width: 750rpx;      height: 75vh;      position: absolute;      z-index: 1000;      top: 0;      left: 0;      image {        width: 100%;        height: 100%;      }    }  }  .btns {    display: flex;    .takePhoto_btn {      width: 100%;      display: flex;      align-items: center;      justify-content: space-between;      background: #a9a7a9;      padding: 40rpx 26rpx;      .middle_btn {        width: 120rpx;        height: 120rpx;        border-radius: 40rpx;        border: 4rpx solid #ffffff;        display: flex;        align-items: center;        justify-content: center;      }      .square {        width: 96rpx;        height: 96rpx;        background: #ffffff;        border-radius: 28rpx;      }      .rights {        font-size: 32rpx;        font-weight: 500;        color: #ffffff;      }    }    .btnResult {      height: 100rpx;      flex: 1;      background-color: #07c160;      text-align: center;      line-height: 100rpx;      color: #fff;      font-size: 32rpx;      font-weight: bold;    }  }}.chat_box {  display: flex;  padding: 20rpx;  justify-content: space-between;}.chat3 {  font-size: 30rpx;  font-family: PingFang SC;  font-weight: 500;  color: #666666;  margin-top: 10rpx;}.chat2 {  font-size: 20rpx;  font-family: PingFang SC;  font-weight: 500;  color: #999999;  margin-top: 10rpx;}.chat1 {  font-size: 24rpx;  font-family: PingFang SC;  font-weight: 500;  color: #333333;}.leftPadding {  margin-left: 8rpx;}.t2Content {  font-size: 24rpx;  font-family: PingFang SC;  font-weight: bold;  color: #999999;  line-height: 48rpx;}.tBox2 {  display: flex;  padding-top: 10rpx;  color: #333333;  font-size: 30rpx;  font-weight: 400;}.tBox {  display: flex;  align-items: center;  padding-top: 10rpx;}.title {  font-size: 24rpx;  color: #999999;}page {  // padding-top: 10px;  // padding-top: constant(safe-area-inset-top);  // padding-top: env(safe-area-inset-top);}.Answering {  .answer_item {    &:nth-child(2) {      border-radius: 16rpx 16rpx 0rpx 0rpx;    }    &:nth-last-child(1) {      border-radius: 0rpx 0rpx 16rpx 16rpx;    }  }}.inputBottom {  position: fixed;  left: 0;  bottom: 0;  background: #ffffff;  height: 98rpx;  display: flex;  align-items: center;  width: 100%;  z-index: 99;  .flex_auto {    flex: 1;    margin-left: 10%;    word-break: break-all;  }  .btn {    color: #007aff;    font-size: 30rpx;    font-weight: bold;    width: 15%;    text-align: center;  }  .input {    background: rgba(244, 244, 244, 0.98);    height: 60rpx;    border-radius: 24rpx;    margin-top: 12rpx;  }}.noteBox {  width: 100%;  background: #ffffff;  padding: 0rpx 10rpx 20rpx;  border-radius: 16rpx;  overflow: hidden;  .left_ti {    padding-top: 14rpx;  }}.dateBox {  width: 216rpx;  height: 48rpx;  background: #ffffff;  border-radius: 24rpx;  font-size: 24rpx;  color: #666666;  text-align: center;  line-height: 48rpx;  margin: 16rpx 0rpx 8rpx;}.t_content1 {  color: #007aff;  margin-left: 10rpx;}.tag1 {  border: 2rpx solid #007aff;  border-radius: 8rpx;  font-size: 20rpx;  color: #007aff;  padding: 5rpx;}.b_title {  color: #333333;  font-size: 30rpx;  font-weight: bold;}page {  background: #eaeef1;}.menuBox {  width: 100%;  background: #ffffff;  border-radius: 16rpx;  padding: 20rpx;  margin-bottom: 20rpx;}.btnspric {  border-top: 1rpx solid #eee;  display: flex;  align-items: center;  justify-content: space-between;  height: 108rpx;  padding-left: 43rpx;  padding-right: 32rpx;}.btnspric > .lefprL {  font-size: 36rpx;  color: #0c141f;  font-weight: bold;}.btnspric > .lefprR {  padding: 0rpx 24rpx;  height: 60rpx;  line-height: 60rpx;  text-align: center;  color: #fff;  background: #32467b;  border-radius: 24rpx;  box-shadow: 0rpx 0rpx 16rpx 4rpx rgba(145, 156, 178, 0.1);}.yhj,.hdyhj {  padding: 24rpx 29rpx 24rpx 34rpx;}.yhj {  border-bottom: 16rpx solid #f9f9f9;}.yhjtit {  font-size: 30rpx;  color: #0c141f;  font-weight: 500;  margin-bottom: 14rpx;}.yhjList {  display: flex;  align-items: center;  justify-content: space-between;  margin-bottom: 14rpx;}.yhjList > .yhjLefts {  display: flex;  align-items: center;}.yhjLefts > .yhl {  color: #32467b;  font-size: 30rpx;  margin-right: 31rpx;}.yhjLefts > .yhbq {  font-size: 24rpx;  color: #ff9500;  border-radius: 18rpx;  background-color: rgba(255, 149, 0, 0.2);  border: 2rpx solid #ff9500;  height: 38rpx;  line-height: 38rpx;  padding: 0rpx 16rpx;}.ts {  font-size: 24rpx;  color: #999;  margin: 14rpx 0rpx;  padding-right: 29rpx;  padding-left: 34rpx;}.yh {  padding-top: 20rpx;}.yh > .yhtitle {  display: flex;  align-items: center;  justify-content: space-between;  padding-right: 29rpx;  padding-left: 34rpx;}.priceBxs {  display: flex;  align-items: center;}.priceBxs > .pricleft {  border-radius: 24rpx;  border: 1rpx solid #e91313;  background-color: rgba(233, 19, 19, 0.1);  padding: 0rpx 18rpx;  height: 49rpx;  line-height: 49rpx;  text-align: center;  font-size: 30rpx;  font-weight: 500;  color: #e91313;  margin-right: 13rpx;}.topBox {  padding: 32rpx 32rpx 24rpx;  border-bottom: 1rpx solid #eeeeee;}.topBox > .boldFonstType {  font-weight: 500;  font-size: 30rpx;  margin: 16rpx 0rpx 23rpx;}.topBox > .firstTopL {  display: flex;  align-items: center;}.topBox > .firstTopL > .imageBs {  width: 331rpx;  height: 160rpx;  border-radius: 6rpx;  overflow: hidden;  margin-right: 8rpx;  box-shadow: 0rpx 6rpx 6rpx 0rpx rgba(47, 67, 121, 0.08);}.topBox > .firstTopL > .imageBs > image {  width: 100%;  height: 100%;}.topBox > .firstTopL > .textBs {  font-size: 30rpx;  font-weight: bold;  color: #0c141f;}.content {  padding: 24rpx;  text-align: left;}.catalogBox {  display: flex;  align-items: center;  flex-wrap: nowrap;  overflow-x: auto;  padding-left: 38rpx;  max-height: 305rpx;  overflow-y: auto;  transition: all 0.4s;}.catalogBox > .catalogA {  min-width: 200rpx;  height: 48rpx;  line-height: 48rpx;  // text-align: center;  border: 2rpx solid transparent;  white-space: nowrap;  text-overflow: ellipsis;  overflow: hidden;  word-break: break-all;  border-radius: 10rpx;  background: rgba(22, 119, 255, 0.05);  padding-left: 19rpx;  box-sizing: border-box;  padding-right: 15rpx;  margin-right: 16rpx;  margin-bottom: 20rpx;  margin-top: 15rpx;  font-size: 24rpx;  color: #666;}.catalogBox > .activesq {  border-color: #1677ff;}.changeCatalogBox {  display: block;}.catalogBox::-webkit-scrollbar {  display: none; /* Chrome Safari */}.price_t2 {  font-size: 18rpx;  font-family: PingFang SC;  font-weight: 500;  text-decoration: line-through;  color: #999999;}.price_t1 {  font-size: 33rpx;  font-family: PingFang SC;  font-weight: bold;  color: #e91313;}.sc_t {  font-size: 22rpx;  color: #000000;}.sc {  width: 29rpx;  height: 29rpx;}.buy {  width: 138rpx;  height: 48rpx;  line-height: 48rpx;  background: #32467b;  border-radius: 10rpx;  color: #ffffff;  font-size: 28rpx;  text-align: center;  vertical-align: middle;  position: absolute;  right: 30rpx;}.video_body {  padding-bottom: 96rpx;}.footer_tab {  position: fixed;  bottom: 0;  height: 96rpx;  width: 100%;  background-color: #ffffff;}.tj_box {  width: 50%;  display: inline-block;  text-align: center;  margin: 10rpx 0;}.teacher_t {  font-size: 24rpx;  font-family: PingFang SC;  font-weight: 400;  color: #666666;  line-height: 36rpx;  margin-left: 15rpx;}.teacher_img {  width: 87rpx;  height: 129rpx;}.t2 {  font-size: 24rpx;  font-family: PingFang SC;  color: #666666;  line-height: 36rpx;  margin: 15rpx;}.r_t2 {  width: 201rpx;  height: 49rpx;  background: rgba(22, 119, 255, 0.05);  border: 1rpx solid #32467b;  border-radius: 16rpx;  color: #666666;  font-size: 23rpx;  text-align: center;  display: flex;  align-items: center;  padding: 5rpx;}.scroll_box {  width: 100%;  height: 60rpx;  background: #ffffff;  box-shadow: 0rpx 0rpx 16rpx 4rpx rgba(145, 156, 178, 0.1);  white-space: nowrap;  overflow: hidden;  margin: 15rpx 0;}.r_sliper {  padding: 0 20rpx;}.top_line {  width: 6rpx;  height: 22rpx;  background: #32467b;  margin-right: 10rpx;}.video_t2 {  font-size: 24rpx;  font-family: PingFang SC;  font-weight: 500;  color: #666666;}.course_name {  height: 80rpx;  background-color: #fff;}.video_t1 {  height: 80rpx;  color: #333333;  line-height: 80rpx;  font-size: 30rpx;  font-family: PingFang SC;  font-weight: bold;  color: #333333;  margin-left: 15rpx;  overflow: hidden;  text-overflow: ellipsis;  white-space: nowrap;}.notice_wrap {  height: 80rpx;  display: flex;  align-items: center;  justify-content: flex-end;  .video_t1_t {    width: 100%;    height: 40rpx;    line-height: 40rpx;    text-align: center;    background: rgba(245, 154, 35, 1);    color: #333;    border-radius: 10rpx;    font-size: 24rpx;  }}.video_play {  position: absolute;  width: 95rpx;  height: 95rpx;  top: 0;  left: 0;  right: 0;  bottom: 0;  margin: auto;}.video_box {  position: relative;  .video-toast {    position: absolute;    width: 686rpx;    height: 80rpx;    background: rgba(0, 0, 0, 0.6);    border-radius: 24rpx;    bottom: 100rpx;    left: 50%;    transform: translateX(-50%);    color: #fff;    display: flex;    font-size: 26rpx;    align-items: center;    overflow: visible;    &__text {      flex: 1;      margin-left: 40rpx;    }    &__btn {      width: 180rpx;      text-align: center;      border-left: 1rpx solid #fff;    }  }  .video-toast__close {    position: absolute;    right: 32rpx;    bottom: 184rpx;    width: 40rpx;    height: 40rpx;    line-height: 40rpx;    text-align: center;    background: rgba(0, 0, 0, 0.6);    border-radius: 50%;    color: rgba(255, 255, 255, 0.3);  }}.rotoct {  transform: rotate(90deg);}.notice_modal {  .content {    width: 100%;    height: 100%;    padding: 56rpx 56rpx 56rpx 64rpx;    .title {      color: #222;      line-height: 40rpx;      font-size: 36rpx;      text-align: center;      font-weight: bold;      margin-bottom: 24rpx;    }    .text {      height: 340rpx;      line-height: 40rpx;      text-indent: 2em;      font-size: 32rpx;      color: #222;    }    .had_read {      width: 100%;      height: 88rpx;      line-height: 88rpx;      text-align: center;      background: #3577e8;      border-radius: 240rpx;      font-size: 32rpx;      font-weight: 500;      color: #fff;      margin-top: 20rpx;      &.gray {        background: #bbbec5;      }    }  }}</style>
 |