From fefe4a3011fb472788abb2e7ffdbbc5a4f58623c Mon Sep 17 00:00:00 2001
From: charles <981744753@qq.com>
Date: 星期三, 05 六月 2024 14:10:16 +0800
Subject: [PATCH] feat:更新ui界面

---
 src/views/home/components/uploadAudio/index.vue |  304 +++++++++++++++++++++++++++++++++++--------------
 1 files changed, 215 insertions(+), 89 deletions(-)

diff --git a/src/views/home/components/uploadAudio/index.vue b/src/views/home/components/uploadAudio/index.vue
index 2c870c1..364e3a7 100644
--- a/src/views/home/components/uploadAudio/index.vue
+++ b/src/views/home/components/uploadAudio/index.vue
@@ -1,96 +1,117 @@
 <template>
     <div class="upload-audio-container">
-        <div class="left">
-            <el-form :inline="true" class="demo-form-inline">
-                <el-form-item label="">
-                    <el-input v-model.lazy="keyword" placeholder="璇疯緭鍏ユ悳绱㈠唴瀹�" suffix-icon="el-icon-search" size="small"></el-input>
-                </el-form-item>
-                <el-form-item>
-                    <el-button type="primary" @click="manyAnalysisAudio" icon="el-icon-video-play"  plain size="mini">鎵归噺鍒嗘瀽</el-button>
-                    <el-button type="danger" @click="deleteManyAudio" icon="el-icon-delete" plain size="mini">鎵归噺鍒犻櫎</el-button>
-                    <el-upload
-                            style="display: inline-block;margin-left: 10px"
-                            action="/api-sa/v1/audio/upload"
-                            :on-change="selFile"
-                            accept=".mp3,.wav"
-                            :show-file-list="false"
-                            :on-success="upSuccess"
-                            >
-                        <el-button size="small" type="primary">鐐瑰嚮涓婁紶</el-button>
-                    </el-upload>
-                </el-form-item>
-            </el-form>
-        </div>
-        <div class="right">
-            <el-tabs v-model="activeName">
-                <el-tab-pane label="宸蹭笂浼�" name="first">
-                    <div>
-                        <el-table :data="pageInfo.audioList" border @selection-change="selAudio">
-                            <el-table-column label='鍏ㄩ��' type="selection"  align="center" />
-                            <el-table-column prop="name" label="鏂囦欢鍚�" min-width="200px" align="center" />
-                            <el-table-column prop="size" label="澶у皬" align="center" />
-                            <el-table-column prop="occurrenceTime" label="涓婁紶鏃堕棿" align="center" />
-                            <el-table-column prop="audioStatus" label="澶勭悊鐘舵��" align="center" >
-                                <template slot-scope="scope">
-                                    <span v-if="scope.row.audioStatus===0" style="color:wheat">涓婁紶涓�</span>
-                                    <span v-else-if="scope.row.audioStatus===1" style="color: blue">涓婁紶鎴愬姛</span>
-                                    <span v-else-if="scope.row.audioStatus===2" style="color: cyan">澶勭悊涓�</span>
-                                    <span v-else-if="scope.row.audioStatus===3" style="color: green">澶勭悊瀹屾垚</span>
-                                    <span v-else-if="scope.row.audioStatus===4" style="color: red">澶勭悊澶辫触</span>
-                                </template>
-                            </el-table-column>
-                            <el-table-column label="鎿嶄綔" align="center" >
-                                <template slot-scope="scope">
-                                    <el-button icon="el-icon-video-play" @click="analysisAudio(scope.row.ID)" type="text"></el-button>
-                                    <el-button icon="el-icon-delete" type="text" @click="deleteAudio(scope.row.ID)"></el-button>
-                                </template>
-                            </el-table-column>
-                        </el-table>
-                        <div class="pagination">
-                            <div class="total">鍏辫{{pageInfo.total}}鏉¤褰� 绗瑊{pageData.page}}/{{lastPage}}椤�</div>
-                            <div class="page">
-                                <el-pagination
-                                        background
-                                        @size-change="handleSizeChange"
-                                        @current-change="handleCurrentChange"
-                                        :current-page.sync="pageData.page"
-                                        :page-size="pageData.pageSize"
-                                        layout="prev, pager, next,sizes, jumper"
-                                        :total="pageInfo.total">
-                                </el-pagination>
-                            </div>
-                        </div>
+        <el-row type="flex" justify="center">
+            <el-col :span="23">
+                <el-card style="margin-top: 20px;height: 85vh">
+                    <div class="left">
+                        <el-form :inline="true" class="demo-form-inline">
+                            <el-form-item label="">
+                                <el-input v-model.lazy="keyword" placeholder="璇疯緭鍏ユ悳绱㈠唴瀹�" suffix-icon="el-icon-search" size="small"></el-input>
+                            </el-form-item>
+                            <el-form-item>
+                                <el-button type="primary" @click="manyAnalysisAudio" icon="el-icon-video-play"  plain size="mini">鎵归噺鍒嗘瀽</el-button>
+                                <el-button type="danger" @click="deleteManyAudio" icon="el-icon-delete" plain size="mini">鎵归噺鍒犻櫎</el-button>
+                                <el-upload
+                                        style="display: inline-block;margin-left: 10px"
+                                        action="#"
+                                        :auto-upload="false"
+                                        :on-change="selFile"
+                                        accept=".mp3,.wav"
+                                        :show-file-list="false"
+                                        :on-success="upSuccess"
+                                >
+                                    <el-button size="small" type="primary">鐐瑰嚮涓婁紶</el-button>
+                                </el-upload>
+                            </el-form-item>
+                        </el-form>
                     </div>
-                </el-tab-pane>
-                <el-tab-pane label="姝e湪涓婁紶" name="second">
-                   <!-- <el-skeleton style="width: 100%" :loading="isUpload" animated>
-                        <template slot="template">
-                            <div style="padding: 14px;">
-                                <el-skeleton-item variant="h3" style="width: 100%;height: 40px" />
-                            </div>
-                        </template>
-                    </el-skeleton>-->
-                    <div>
-                        <el-skeleton  animated :loading="isUpload">
-                            <template slot="template">
-                                <div style="padding: 14px;">
-                                    <el-skeleton-item  style="width: 100%;height: 40px" />
+                    <div class="right">
+                        <el-tabs v-model="activeName">
+                            <el-tab-pane label="宸蹭笂浼�" name="first">
+                                <div>
+                                    <el-table :data="pageInfo.audioList"
+                                              border @selection-change="selAudio"
+                                    >
+                                        <el-table-column :selectable="selectable" label='鍏ㄩ��' type="selection"  align="center" />
+                                        <el-table-column prop="name" label="鏂囦欢鍚�" min-width="200px" align="center" />
+                                        <el-table-column prop="size" label="澶у皬" align="center" />
+                                        <el-table-column prop="occurrenceTime" label="涓婁紶鏃堕棿" align="center" />
+                                        <el-table-column prop="audioStatus" label="澶勭悊鐘舵��" align="center" >
+                                            <template slot-scope="scope">
+                                                <span v-if="scope.row.audioStatus===0" style="color:wheat">涓婁紶涓�</span>
+                                                <span v-else-if="scope.row.audioStatus===1" style="color: blue">涓婁紶鎴愬姛</span>
+                                                <span v-else-if="scope.row.audioStatus===2" style="color: cyan">澶勭悊涓�</span>
+                                                <span v-else-if="scope.row.audioStatus===3" style="color: green">澶勭悊瀹屾垚</span>
+                                                <span v-else-if="scope.row.audioStatus===4" style="color: red">澶勭悊澶辫触</span>
+                                            </template>
+                                        </el-table-column>
+                                        <el-table-column label="鎿嶄綔" align="center" >
+                                            <template slot-scope="scope">
+                                                <el-tooltip class="item" effect="dark" content="涓嬭浇" placement="bottom">
+                                                    <el-button icon="el-icon-download" @click="downloadAudio(scope.row.ID)" type="text"></el-button>
+                                                </el-tooltip>
+                                                <el-tooltip class="item" effect="dark" content="鍒嗘瀽" placement="bottom">
+                                                    <el-button icon="el-icon-video-play" @click="analysisAudio(scope.row.ID)" type="text"></el-button>
+                                                </el-tooltip>
+                                                <el-tooltip v-if="scope.row.audioStatus!==3" class="item" effect="dark" content="鍒犻櫎" placement="bottom">
+                                                    <el-button icon="el-icon-delete" type="text" @click="deleteAudio(scope.row.ID)"></el-button>
+                                                </el-tooltip>
+                                            </template>
+                                        </el-table-column>
+                                    </el-table>
+                                    <div class="pagination">
+                                        <div class="total">鍏辫{{pageInfo.total}}鏉¤褰� 绗瑊{pageData.page}}/{{lastPage}}椤�</div>
+                                        <div class="page">
+                                            <el-pagination
+                                                    background
+                                                    @size-change="handleSizeChange"
+                                                    @current-change="handleCurrentChange"
+                                                    :current-page.sync="pageData.page"
+                                                    :page-size="pageData.pageSize"
+                                                    layout="prev, pager, next,sizes, jumper"
+                                                    :total="pageInfo.total">
+                                            </el-pagination>
+                                        </div>
+                                    </div>
                                 </div>
-                            </template>
-                        </el-skeleton>
+                            </el-tab-pane>
+                            <el-tab-pane label="姝e湪涓婁紶" name="second">
+                                <!-- <el-skeleton style="width: 100%" :loading="isUpload" animated>
+                                     <template slot="template">
+                                         <div style="padding: 14px;">
+                                             <el-skeleton-item variant="h3" style="width: 100%;height: 40px" />
+                                         </div>
+                                     </template>
+                                 </el-skeleton>-->
+                                <div v-if="progressLoad">
+                                    <div style="padding: 14px;" class="right-progress">
+                                        <div class="p-left">涓婁紶閫熷害:{{ this.speed }}</div>
+                                        <div class="p-right">棰勮鏃堕棿:{{ this.leftTime }}</div>
+                                    </div>
+                                    <el-progress :color="customColors" :text-inside="true" :stroke-width="26" :percentage="percentage"></el-progress>
+                                </div>
+                            </el-tab-pane>
+                        </el-tabs>
                     </div>
-                </el-tab-pane>
-            </el-tabs>
-        </div>
+                </el-card>
+            </el-col>
+        </el-row>
     </div>
 </template>
 
 <script>
     import {audioListApi,processAudioApi,deleteAudioApi,batchProcessAudioApi,batchDeleteAudioApi} from '@/api';
+    import {request} from "@/utils";
+    import axios from 'axios';
+    let timer= null;
     export default {
         name: "index",
         data(){
             return {
+                percentage:0,
+                speed:0,
+                leftTime:0,
+                progressLoad:false,
                 isUpload:false,
                 activeName:'first',
                 keyword:'',
@@ -99,7 +120,12 @@
                     total:0
                 },
                 pageData:{page:1,pageSize:10},
-                ids:[]
+                ids:[],
+                customColors: [
+                    {color: '#f56c6c', percentage: 20},
+                    {color: '#e6a23c', percentage: 40},
+                    {color: '#5cb87a', percentage: 60}
+                ]
             }
         },
         watch:{
@@ -121,7 +147,22 @@
                 return Math.ceil(this.pageInfo.total/this.pageData.pageSize)
             }
         },
+        beforeDestroy(){
+          if(timer){
+              window.clearInterval(timer);
+          }
+        },
         methods:{
+            selectable(row){
+                if(row.audioStatus===3){
+                    return false
+                }else{
+                    return true;
+                }
+            },
+            async downloadAudio(id){
+                window.location.href=`http://smartai.com:7013/api-sa/v1/audio/download?id=${id}`
+            },
             upSuccess({code}){
                if(code===200){
                    this.$message.success('涓婁紶鎴愬姛');
@@ -133,9 +174,88 @@
                    this.isUpload=false;
                });
             },
-            selFile(file,fileList){
+            async selFile(_,fileList){
                 this.activeName='second';
                 this.isUpload=true;
+                if(fileList.length>0){
+                    const file = fileList[0].raw;
+                    const formData = new FormData();
+                    formData.append("file", file);
+                    this.progressLoad = true;
+                    this.percentage=0;
+                    let lastTime = 0; // 涓婁竴娆¤绠楁椂闂�
+                    let lastSize = 0; // 涓婁竴娆¤绠楃殑鏂囦欢澶у皬
+                    try{
+                        const {code} = await axios.post("/api-sa/v1/audio/upload", formData,
+                            {
+                            onUploadProgress: (progressEvent) => {
+                                console.log(progressEvent);
+                                /*楠岃瘉鏁版嵁*/
+                                if (lastTime === 0) {
+                                    lastTime = new Date().getTime();
+                                    lastSize = progressEvent.loaded;
+                                    return;
+                                }
+                                /*璁$畻闂撮殧*/
+                                let nowTime = new Date().getTime();
+                                let intervalTime = (nowTime - lastTime) / 1000; // 鏃堕棿鍗曚綅涓烘绉掞紝闇�杞寲涓虹
+                                let intervalSize = progressEvent.loaded - lastSize;
+                                /*閲嶆柊璧嬪�间互渚夸簬涓嬫璁$畻*/
+                                lastTime = nowTime;
+                                lastSize = progressEvent.loaded;
+                                /*璁$畻閫熷害*/
+                                let speed = (intervalSize / intervalTime)/10;
+                                let bSpeed = speed; // 淇濆瓨浠/s涓哄崟浣嶇殑閫熷害鍊硷紝鏂逛究璁$畻鍓╀綑鏃堕棿
+                                let units = "b/s"; // 鍗曚綅鍚嶇О
+                                if (speed / 1024 > 1) {
+                                    speed = speed / 1024;
+                                    units = "k/s";
+                                }
+                                if (speed / 1024 > 1) {
+                                    speed = speed / 1024;
+                                    units = "M/s";
+                                }
+                                let leftTime = (progressEvent.total) / bSpeed;
+                                /*璁$畻杩涘害*/
+                                if(timer){
+                                    window.clearInterval(timer);
+                                }
+                                timer=window.setInterval(()=>{
+                                    if(this.percentage>=90){
+                                        window.clearInterval(timer);
+                                        timer=null;
+                                    }
+                                    this.percentage+=parseInt(Math.random()*10);
+                                    speed=(Math.random()*500+500).toFixed(2)
+                                    this.speed = speed + "k/s";
+                                    this.leftTime=(lastSize/speed/1000).toFixed(2)+ "绉�";
+                                },500);
+                                //= parseInt((progressEvent.loaded / progressEvent.total) * 100)-1;
+                               // this.speed = speed.toFixed(2) + units;
+                                //this.leftTime = leftTime.toFixed(2) + "绉�";
+                            }
+                        });
+                        if (code === 200) {
+                            this.$message({
+                                message: "涓婁紶鎴愬姛",
+                                type: "success"
+                            });
+                        } else {
+                            this.$message({
+                                message: "涓婁紶澶辫触",
+                                type: "error",
+                            });
+                        }
+                        this.$nextTick(()=>{
+                            this.progressLoad = false;
+                            this.percentage=100;
+                            window.clearInterval(timer);
+                            this.queryAudioList();
+                        });
+                    }catch (error) {
+                        console.log(error);
+                    }
+                }
             },
             selAudio(rows){
                 this.ids=rows.map(item=>item.ID);
@@ -153,14 +273,6 @@
                     this.pageInfo.audioList=data;
                     this.pageInfo.total=total;
                 }
-                /*this.pageInfo.audioList=[
-                    {filename:'0_20240519_xx_01.mp3',size:'879.88k',uploadAt:'2024-05-10 10:10:10',status:0},
-                    {filename:'0_20240519_xx_02.mp3',size:'879.88k',uploadAt:'2024-05-10 10:10:10',status:1},
-                    {filename:'0_20240519_xx_03.mp3',size:'879.88k',uploadAt:'2024-05-10 10:10:10',status:0},
-                    {filename:'0_20240519_xx_04.mp3',size:'879.88k',uploadAt:'2024-05-10 10:10:10',status:1},
-                    {filename:'0_20240519_xx_05.mp3',size:'879.88k',uploadAt:'2024-05-10 10:10:10',status:2},
-                    {filename:'0_20240519_xx_06.mp3',size:'879.88k',uploadAt:'2024-05-10 10:10:10',status:2},
-                ]*/
             },
             analysisAudio(id){
                 this.$confirm('鏄惁杩涜闊抽鍒嗘瀽, 鏄惁缁х画?', '鎻愮ず', {
@@ -247,6 +359,20 @@
             position: relative;
             top:-60px;
         }
+        .right-progress{
+            display: flex;
+            justify-content: space-around;
+            .p-left{
+                width: 85%;
+                text-align: center;
+                position: relative;
+                left: 20px;
+            }
+            .p-right{
+                width: 15%;
+                text-align: left;
+            }
+        }
         .pagination{
             display: flex;
             justify-content: space-between;

--
Gitblit v1.8.0