|
@@ -1,5 +1,5 @@
|
|
|
<template>
|
|
|
- <div class="observe">
|
|
|
+ <div class="observe" v-loading="loading">
|
|
|
<div class="top">
|
|
|
<div class="Title">
|
|
|
<div>课堂观察</div>
|
|
@@ -45,28 +45,76 @@
|
|
|
<div class="chat">
|
|
|
<div class="chatTxt" v-text="bmData.jsonData ? bmData.jsonData.transcriptionData : ''"></div>
|
|
|
<img src="../../assets/images/classObserve/waveanimation.png" alt="" />
|
|
|
- <div class="time">00:00</div>
|
|
|
+ <div class="time">{{ recordedForm.time }}</div>
|
|
|
</div>
|
|
|
- <div class="controlArea">
|
|
|
- <img @click="goChat" src="../../assets/images/classObserve/rootper.svg" alt="" />
|
|
|
- <van-popover placement="top" v-model="changeLanguageShow" trigger="click">
|
|
|
- <div class="languageList">
|
|
|
- <div :class="[choiceLanguageIndex==item.index?'l_active':'']" v-for="(item,index) in languageList" :key="index" @click.stop="changeLanguageFn(item.index)">{{ item.label }}</div>
|
|
|
- </div>
|
|
|
- <template #reference>
|
|
|
- <img src="../../assets/images/classObserve/langcut.svg" alt="" />
|
|
|
- </template>
|
|
|
- </van-popover>
|
|
|
-
|
|
|
- <img @click="ctrlRecord" v-if="isParse" src="../../assets/images/classObserve/endLang.svg" alt="" />
|
|
|
- <img @click="ctrlRecord" v-else src="../../assets/images/classObserve/recording.svg" alt="" />
|
|
|
- <img src="../../assets/images/classObserve/suspend.svg" alt="" />
|
|
|
- <div @click="historyBtn" style="position: relative;">
|
|
|
- <span
|
|
|
- style="position: absolute;top: -5px;right: -9px;color: rgba(54, 129, 252, 1);width: 15px;font-size: 10px;"
|
|
|
- >{{ classList.length }}</span
|
|
|
- >
|
|
|
- <img src="../../assets/images/classObserve/book.svg" alt="" />
|
|
|
+ <div class="controlArea" v-loading="recordedForm.loading">
|
|
|
+ <div class="ca_left">
|
|
|
+ <img
|
|
|
+
|
|
|
+ @click="goChat"
|
|
|
+ src="../../assets/images/classObserve/rootper.svg"
|
|
|
+ alt=""
|
|
|
+ />
|
|
|
+ <van-popover placement="top" v-model="changeLanguageShow" trigger="click">
|
|
|
+ <div class="languageList">
|
|
|
+ <div
|
|
|
+ :class="[choiceLanguageIndex == item.index ? 'l_active' : '']"
|
|
|
+ v-for="(item, index) in languageList"
|
|
|
+ :key="index"
|
|
|
+ @click.stop="changeLanguageFn(item.index)"
|
|
|
+ >
|
|
|
+ {{ item.label }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <template #reference>
|
|
|
+ <img src="../../assets/images/classObserve/langcut.svg" alt="" />
|
|
|
+ </template>
|
|
|
+ </van-popover>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="recordBtn">
|
|
|
+ <img
|
|
|
+ @click="endRecord"
|
|
|
+ v-if="[1, 2].includes(recordedForm.status)"
|
|
|
+ src="../../assets/images/classObserve/endLang.svg"
|
|
|
+ alt=""
|
|
|
+ />
|
|
|
+ <img
|
|
|
+ @click="startRecord"
|
|
|
+ v-if="[0, 3].includes(recordedForm.status)"
|
|
|
+ src="../../assets/images/classObserve/recording.svg"
|
|
|
+ alt=""
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class="ca_right">
|
|
|
+ <img
|
|
|
+ style="transform: scale(1.1,1.1);"
|
|
|
+ src="../../assets/images/classObserve/suspend.svg"
|
|
|
+ alt=""
|
|
|
+ v-if="[1].includes(recordedForm.status)"
|
|
|
+ @click.stop="stopRecord"
|
|
|
+ />
|
|
|
+ <img
|
|
|
+
|
|
|
+ src="../../assets/images/classObserve/start.svg"
|
|
|
+ alt=""
|
|
|
+ v-if="[2].includes(recordedForm.status)"
|
|
|
+ @click.stop="reStartRecord"
|
|
|
+ />
|
|
|
+ <img
|
|
|
+ style="transform: scale(.8,.8);"
|
|
|
+ src="../../assets/images/classObserve/uploadFile.svg"
|
|
|
+ alt=""
|
|
|
+ v-if="[0, 3].includes(recordedForm.status)"
|
|
|
+ @click.stop="uploadFileFn"
|
|
|
+ />
|
|
|
+ <div @click="historyBtn" style="position: relative;">
|
|
|
+ <span
|
|
|
+ style="position: absolute;top: -3px;right: -6px;color: rgba(54, 129, 252, 1);width: 15px;font-size: 10px;"
|
|
|
+ >{{ classList.length }}</span
|
|
|
+ >
|
|
|
+ <img style="transform: scale(.8,.8);" src="../../assets/images/classObserve/book.svg" alt="" />
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="selectBtn">
|
|
@@ -133,12 +181,60 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
</van-action-sheet>
|
|
|
+
|
|
|
+ <!-- 录音转文字 -->
|
|
|
+ <iframe
|
|
|
+ allow="camera *; microphone *;display-capture;midi;encrypted-media;"
|
|
|
+ src="https://beta.cloud.cocorobo.cn/browser/public/index.html"
|
|
|
+ ref="iiframe"
|
|
|
+ v-show="false"
|
|
|
+ ></iframe>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
import { Dialog } from 'vant'
|
|
|
import { loginOut } from '@/api/user'
|
|
|
+import _ from "lodash";
|
|
|
+import Papa from "papaparse";
|
|
|
+import '../../utils/aws-sdk-2.235.1.min.js'
|
|
|
+import {upload_file_knowledgeRequest } from '@/api/classObserve.js'
|
|
|
+
|
|
|
+const getFile = (url) => {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ var credentials = {
|
|
|
+ accessKeyId: "AKIATLPEDU37QV5CHLMH",
|
|
|
+ secretAccessKey: "Q2SQw37HfolS7yeaR1Ndpy9Jl4E2YZKUuuy2muZR",
|
|
|
+ }; //秘钥形式的登录上传
|
|
|
+ window.AWS.config.update(credentials);
|
|
|
+ window.AWS.config.region = "cn-northwest-1"; //设置区域
|
|
|
+ let url2 = url;
|
|
|
+ let _url2 = "";
|
|
|
+ if (url2.indexOf("https://view.officeapps.live.com/op/view.aspx?src=") != -1) {
|
|
|
+ _url2 = url2.split("https://view.officeapps.live.com/op/view.aspx?src=")[1];
|
|
|
+ } else {
|
|
|
+ _url2 = url2;
|
|
|
+ }
|
|
|
+ var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
|
|
|
+ let name = decodeURIComponent(
|
|
|
+ _url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1]
|
|
|
+ );
|
|
|
+ var params = {
|
|
|
+ Bucket: "ccrb",
|
|
|
+ Key: name,
|
|
|
+ };
|
|
|
+ s3.getObject(params, function (err, data) {
|
|
|
+ if (err) {
|
|
|
+ console.log(err, err.stack);
|
|
|
+ resolve({ data: 1 });
|
|
|
+ } else {
|
|
|
+ const fileContent = data.Body.toString("utf-8");
|
|
|
+ resolve({ data: fileContent });
|
|
|
+ } // sxuccessful response
|
|
|
+ });
|
|
|
+ // axios({
|
|
|
+ });
|
|
|
+};
|
|
|
export default {
|
|
|
props: {
|
|
|
page: {
|
|
@@ -161,21 +257,38 @@ export default {
|
|
|
data() {
|
|
|
return {
|
|
|
isParse: false,
|
|
|
+ loading:false,
|
|
|
+ recordedForm: {
|
|
|
+ time: '00:00:00', //时间
|
|
|
+ status: 0, //0--未录音 1--正在录音 2--暂停 3--录音结束
|
|
|
+ timer: null,
|
|
|
+ timeDuration: 0,
|
|
|
+ audioBlob: [],
|
|
|
+ startTime: 0,
|
|
|
+ endTime: 0,
|
|
|
+ textList: [],
|
|
|
+ loading: false
|
|
|
+ },
|
|
|
historyShow: false,
|
|
|
+ uploadFileLoading:false,
|
|
|
abuShowId: '',
|
|
|
historyListLoading: false,
|
|
|
addNewCourseShow: false,
|
|
|
- changeLanguageShow:false,
|
|
|
- languageList:[{index:13,label:"英语"},{index:3,label:"粤语"},{index:2,label:"普通话"},],
|
|
|
- choiceLanguageIndex:2,
|
|
|
+ changeLanguageShow: false,
|
|
|
+ languageList: [
|
|
|
+ { index: 13, label: '英语' },
|
|
|
+ { index: 3, label: '粤语' },
|
|
|
+ { index: 2, label: '普通话' }
|
|
|
+ ],
|
|
|
+ choiceLanguageIndex: 2
|
|
|
}
|
|
|
},
|
|
|
methods: {
|
|
|
- changeLanguageFn(newIndex){
|
|
|
- if(this.isParse)return this.$toast("正在录音中...")
|
|
|
- this.choiceLanguageIndex = newIndex;
|
|
|
- this.changeLanguageShow = false;
|
|
|
- },
|
|
|
+ changeLanguageFn(newIndex) {
|
|
|
+ if (this.isParse) return this.$toast('正在录音中...')
|
|
|
+ this.choiceLanguageIndex = newIndex
|
|
|
+ this.changeLanguageShow = false
|
|
|
+ },
|
|
|
goChat() {
|
|
|
this.$router.push({ path: '/aiChat', query: {} })
|
|
|
},
|
|
@@ -210,7 +323,233 @@ export default {
|
|
|
ctrlRecord() {
|
|
|
this.isParse = !this.isParse
|
|
|
},
|
|
|
+ endRecord() {
|
|
|
+ if(this.recordedForm.loading)return;
|
|
|
+ console.log('结束录音')
|
|
|
+ this.recordedForm.status = 3
|
|
|
+ },
|
|
|
+ startRecord() {
|
|
|
+ // if(this.recordedForm.loading)return;
|
|
|
+ // if(!this.tid){
|
|
|
+ // return this.$parent.addNewCourseByDefault().then(_=>{
|
|
|
+ // this.startRecord()
|
|
|
+ // })
|
|
|
+ // }
|
|
|
+ // this.$toast.success("已开始录音")
|
|
|
+ // console.log('开始录音')
|
|
|
+ this.recordedForm.status = 1
|
|
|
+ },
|
|
|
+ stopRecord() {
|
|
|
+ if(this.recordedForm.loading)return;
|
|
|
+ console.log('暂停录音')
|
|
|
+ this.recordedForm.status = 2
|
|
|
+ },
|
|
|
+ reStartRecord() {
|
|
|
+ if(this.recordedForm.loading)return;
|
|
|
+ console.log('继续录音')
|
|
|
+ this.recordedForm.status = 1
|
|
|
+ },
|
|
|
+ uploadFileFn() {
|
|
|
+ if(!this.tid){
|
|
|
+ return this.$toast("请先选择课堂或者创建课堂")
|
|
|
+ // return this.$parent.addNewCourseByDefault().then(_=>{
|
|
|
+ // this.uploadFileFn()
|
|
|
+ // })
|
|
|
+ }
|
|
|
+ if (this.uploadFileLoading) return this.$toast("请稍等...");
|
|
|
+ let input = document.createElement("input");
|
|
|
+ input.type = "file";
|
|
|
+ // input.accept = ".wav";
|
|
|
+ // input.accept = "audio/*, .txt, .pdf, .xlsx";
|
|
|
+ input.accept = ".wav,.txt,.pdf,.xlsx,.doc,.docx,.csv";
|
|
|
+ input.click();
|
|
|
+ input.onchange = () => {
|
|
|
+ this.uploadFileLoading = true;
|
|
|
+ let file = input.files[0];
|
|
|
+ if (!/\.(wav|txt|pdf|xlsx|doc|docx|csv)$/i.test(file.name)) {
|
|
|
+ this.uploadFileLoading = false;
|
|
|
+ return this.$toast.error(
|
|
|
+ "请上传.wav,.txt,.pdf,.xlsx,.doc,.docx,.csv格式的文件"
|
|
|
+ );
|
|
|
+ }else{
|
|
|
+
|
|
|
+ this.uploadFile(file, { changeText: true, flag: true });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ uploadFile(file, { changeText = true, flag = true }) {
|
|
|
+ var credentials = {
|
|
|
+ accessKeyId: "AKIATLPEDU37QV5CHLMH",
|
|
|
+ secretAccessKey: "Q2SQw37HfolS7yeaR1Ndpy9Jl4E2YZKUuuy2muZR",
|
|
|
+ }; //秘钥形式的登录上传
|
|
|
+ window.AWS.config.update(credentials);
|
|
|
+ window.AWS.config.region = "cn-northwest-1"; //设置区域
|
|
|
+
|
|
|
+ var bucket = new window.AWS.S3({ params: { Bucket: "ccrb" } }); //选择桶
|
|
|
+ var _this = this;
|
|
|
+
|
|
|
+ if (file) {
|
|
|
+ this.loading = true;
|
|
|
+ // this.progressData.uploadLoading = true;
|
|
|
+ // this.progressData.value = 0;
|
|
|
+ var params = {
|
|
|
+ Key:
|
|
|
+ file.name.split(".")[0] +
|
|
|
+ new Date().getTime() +
|
|
|
+ "." +
|
|
|
+ file.name.split(".")[file.name.split(".").length - 1],
|
|
|
+ ContentType: file.type,
|
|
|
+ Body: file,
|
|
|
+ "Access-Control-Allow-Credentials": "*",
|
|
|
+ ACL: "public-read",
|
|
|
+ }; //key可以设置为桶的相抵路径,Body为文件, ACL最好要设置
|
|
|
+ var options = {
|
|
|
+ partSize: 2048 * 1024 * 1024,
|
|
|
+ queueSize: 2,
|
|
|
+ leavePartsOnError: true,
|
|
|
+ };
|
|
|
+ bucket
|
|
|
+ .upload(params, options)
|
|
|
+ .on("httpUploadProgress", function (evt) {
|
|
|
+ //这里可以写进度条
|
|
|
+ // _this.progressData.value = parseInt((evt.loaded * 100) / evt.total);
|
|
|
+ // console.log("Uploaded : " + parseInt((evt.loaded * 80) / evt.total) + '%');
|
|
|
+ })
|
|
|
+ .send(function (err, data) {
|
|
|
+ if (err) {
|
|
|
+ _this.$toast.fail("上传失败");
|
|
|
+ _this.uploadFileLoading = false;
|
|
|
+ _this.loading = false;
|
|
|
+ // _this.progressData.uploadLoading = false;
|
|
|
+ } else {
|
|
|
+ // 判断是不是音频文件
|
|
|
+ const audioRegex = /\.(mp3|wav|ogg|flac|m4a)$/i;
|
|
|
+ const txtRegex = /\.(txt|csv)$/i;
|
|
|
+ const otherRegex = /\.(pdf|xlsx|doc|docx)$/i;
|
|
|
+ // if (audioRegex.test(data.Location)) {
|
|
|
+ // // console.log(data);
|
|
|
+ // _this.uploadWavFileAndGetText(file)
|
|
|
+ // _this.$emit("changeAudioUrl", data);
|
|
|
+
|
|
|
+ // // console.log("修改音频文件");
|
|
|
+ // // console.log(data)
|
|
|
+ // _this.uploadFileLoading = false;
|
|
|
+ // }else if(txtRegex.test(data.Location)){
|
|
|
+ // console.log("这hi是一个txt文件")
|
|
|
+ // } else if(otherRegex.test(data.Location)){
|
|
|
+ //
|
|
|
+ if (audioRegex.test(data.Location)) {
|
|
|
+ if (changeText) _this.wavFileGetText(file);
|
|
|
+ _this.$parent.changeAudioUrl(data);
|
|
|
+ // _this.$emit("changeAudioUrl", data);
|
|
|
+ _this.loading = false;
|
|
|
+ _this.recordedForm.audioBlob = [];
|
|
|
+ _this.recordedForm.time = "00:00:00";
|
|
|
+ _this.recordedForm.timeDuration = 0;
|
|
|
+ // _this.progressData.uploadLoading = false;
|
|
|
+ _this.recordedForm.textList = [];
|
|
|
+ _this.$parent.saveEditorBar();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ upload_file_knowledgeRequest({
|
|
|
+ url: data.Location,
|
|
|
+ })
|
|
|
+ .then((res) => {
|
|
|
+ let _data = res.FunctionResponse;
|
|
|
+ if (_data.result && _data.result.id) {
|
|
|
+ _this.$parent.changeFileId(_data.result.id)
|
|
|
+ // _this.$emit("updateFileId", _data.result.id);
|
|
|
+ // _this.$message.success("成功获取fileId");
|
|
|
+ _this.uploadFileLoading = false;
|
|
|
+ //处理文件
|
|
|
+ if (txtRegex.test(data.Location)) {
|
|
|
+ //txt
|
|
|
+ getFile(data.Location).then((_res) => {
|
|
|
+ _this.controlsStatus = 2;
|
|
|
+ _this.showIndexPage = false;
|
|
|
+ _this.pageStatus = 2;
|
|
|
+ _this.$parent.bmData.jsonData.editorBarData.type = "0";
|
|
|
+ // _this.transcriptionData.content = _res.data;
|
|
|
+ if (flag) {
|
|
|
+ const arr = Papa.parse(_res.data, {
|
|
|
+ header: false,
|
|
|
+ }).data.slice(1);
|
|
|
+ console.log(arr);
|
|
|
+ const _editorBarDataContent = `<table
|
|
|
+ border="0"
|
|
|
+ width="100%"
|
|
|
+ cellpadding="0"
|
|
|
+ cellspacing="0"
|
|
|
+ style="text-align: center"
|
|
|
+ >
|
|
|
+ <tbody>
|
|
|
+ <tr>
|
|
|
+ <th>序号</th>
|
|
|
+ <th>开始时间</th>
|
|
|
+ <th>结束时间</th>
|
|
|
+ <th>发言内容</th>
|
|
|
+ <th>时长</th>
|
|
|
+ <th>说话人身份</th>
|
|
|
+ <th>行为编码</th>
|
|
|
+ </tr>
|
|
|
+ ${arr
|
|
|
+ .map(
|
|
|
+ (row) => `
|
|
|
+ <tr>
|
|
|
+ <td>${_.get(row, 0, "")}</td>
|
|
|
+ <td>${_.get(row, 1, "")}</td>
|
|
|
+ <td>${_.get(row, 2, "")}</td>
|
|
|
+ <td>${_.get(row, 3, "")}</td>
|
|
|
+ <td>${_.get(row, 4, "")}</td>
|
|
|
+ <td>${_.get(row, 5, "")}</td>
|
|
|
+ <td>${_.get(row, 6, "")}</td>
|
|
|
+ </tr>
|
|
|
+ `
|
|
|
+ )
|
|
|
+ .join("\n")}
|
|
|
+ </tbody>
|
|
|
+ </table>`;
|
|
|
+ _this.$parent.bmData.jsonData.editorBarData.content = _editorBarDataContent;
|
|
|
+ } else {
|
|
|
+ _this.$parent.bmData.jsonData.editorBarData.content = _res.data;
|
|
|
+ }
|
|
|
+ _this.$parent.bmData.jsonData.editorBarData.url = "";
|
|
|
+ _this.$parent.saveEditorBar();
|
|
|
+ });
|
|
|
+ } else if (otherRegex.test(data.Location)) {
|
|
|
+ //pdf、 docx、doc、xlxs
|
|
|
|
|
|
+ _this.$parent.bmData.jsonData.editorBarData.type = "1";
|
|
|
+ _this.$parent.bmData.jsonData.editorBarData.url = data.Location;
|
|
|
+ _this.$parent.bmData.jsonData.editorBarData.content = "";
|
|
|
+ _this.$parent.saveEditorBar();
|
|
|
+ // console.log("pdf、xlsx、doc、docx文件处理");
|
|
|
+ }
|
|
|
+ _this.loading = false;
|
|
|
+ // _this.progressData.uploadLoading = false;
|
|
|
+
|
|
|
+
|
|
|
+ } else {
|
|
|
+ _this.$toast.fail("修改fileId失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ // this.$emit("updateFileId", data.Location)
|
|
|
+ })
|
|
|
+ .catch((e) => {
|
|
|
+ _this.uploadFileLoading = false;
|
|
|
+ // _this.progressData.uploadLoading = false;
|
|
|
+ console.log(e);
|
|
|
+ _this.$toast.fail("获取fileId失败");
|
|
|
+ });
|
|
|
+ // }
|
|
|
+
|
|
|
+ // console.log(data.Location)
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
analysis() {
|
|
|
this.$router.push({ path: '/outcome', query: {} })
|
|
|
},
|
|
@@ -402,6 +741,7 @@ export default {
|
|
|
}
|
|
|
.time {
|
|
|
color: rgba(54, 129, 252, 1);
|
|
|
+ width: 100%;
|
|
|
font-size: 12px;
|
|
|
display: flex;
|
|
|
justify-content: center;
|
|
@@ -411,8 +751,48 @@ export default {
|
|
|
display: flex;
|
|
|
justify-content: space-between;
|
|
|
align-items: center;
|
|
|
+ width: 100%;
|
|
|
+ height: 80px;
|
|
|
img {
|
|
|
object-fit: contain;
|
|
|
+ }
|
|
|
+ .ca_left{
|
|
|
+ box-sizing: border-box;
|
|
|
+ padding-right: 10px;
|
|
|
+ width: calc(50% - 30px);
|
|
|
+ height: 100%;
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-around;
|
|
|
+ align-items: center;
|
|
|
+ img{
|
|
|
+ width: 28px;
|
|
|
+ height: 28px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .ca_right{
|
|
|
+ box-sizing: border-box;
|
|
|
+ padding-left: 10px;
|
|
|
+ width: calc(50% - 30px);
|
|
|
+ height: 100%;
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-around;
|
|
|
+ align-items: center;
|
|
|
+ img{
|
|
|
+ width: 28px;
|
|
|
+ height: 28px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .recordBtn {
|
|
|
+ width: 60px;
|
|
|
+ height: 60px;
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ img {
|
|
|
+ width: 150%;
|
|
|
+ height: 150%;
|
|
|
+ object-fit: contain;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
.selectBtn {
|
|
@@ -553,26 +933,26 @@ export default {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-.languageList{
|
|
|
- width: auto;
|
|
|
- height: auto;
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- justify-content: center;
|
|
|
- align-items: center;
|
|
|
- padding: 10px;
|
|
|
-
|
|
|
- div{
|
|
|
- padding: 10px 20px;
|
|
|
- display: flex;
|
|
|
- justify-content: center;
|
|
|
- align-items: center;
|
|
|
- border-radius: 8px;
|
|
|
- transition: .3s;
|
|
|
- }
|
|
|
- .l_active{
|
|
|
- background-color: #d8d8d8a2;
|
|
|
- color: rgba(54, 129, 252, 1);
|
|
|
- }
|
|
|
+.languageList {
|
|
|
+ width: auto;
|
|
|
+ height: auto;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ padding: 10px;
|
|
|
+
|
|
|
+ div {
|
|
|
+ padding: 10px 20px;
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ border-radius: 8px;
|
|
|
+ transition: 0.3s;
|
|
|
+ }
|
|
|
+ .l_active {
|
|
|
+ background-color: #d8d8d8a2;
|
|
|
+ color: rgba(54, 129, 252, 1);
|
|
|
+ }
|
|
|
}
|
|
|
</style>
|