vue基础入门综合项目练习-悦听播放器

1、简介

根据B站视频 黑马程序员vue前端基础教程-4个小时带你快速入门vue 学习制作。
再次感谢 免费无私的教学视频。
感谢 @李予安丶 提供的精美的css。

2、展示

image

image

3、技术点

  1. vue2
  2. axios

4、功能说明

4.1、基本功能

  1. 搜索歌曲
  2. 播放歌曲
  3. 显示歌曲热评
  4. 播放MV

4.2、修复问题

  1. 点击MV后音乐无法暂停
  2. 关闭MV后mv仍在后台播放

5、源代码

作为入门vue的代码,采用的是单文件的形式去编写。
因为html,css,js各自代码有一点多,因此为了提升逻辑性,分开为三个文件。
注意引用css和js的引用路径

5.1 html代码

Show Code



<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>悦听~</title>
    <link rel="icon" href="http://s1.music.126.net/style/favicon.ico?v20180823">
    <!-- 引入自定义css -->
    <link rel="stylesheet" href="./19.css">
</head>
<body>
    <div id="app">
        <header>
            <span class="app-title">
                <img src="./19.title.png">
            </span>
            <!-- 搜索歌曲 -->
            <span class="app-search">
                <input type="text" placeholder="搜索歌曲..." v-model="keywords" @keyup.enter="getMusicInfo" />
                <a href="javascript:void(0);" @click="getMusicInfo">
                    <img src="./19.search.png">
                </a>
            </span>
        </header>
    <main>
        <!-- 歌曲列表 -->
        <div class="music-list">
            <ul>
                <li v-for="(item,index) in musicList">
                    <a href="#">
                        <img src="./19.run.png" class="music-run-image" @click="playMusic(item.id)">
                        <span class="music-name" @click="playMusic(item.id)">
                            {{ item.name }} - {{item.artists[0].name}}
                        </span>
                        <img v-if="item.mvid!=0" @click="playMv(item.mvid)" src="./19.mv.png"
                            class="music-mv-image">
                    </a>
                </li>
            </ul>
        </div>
        <!-- 歌曲专辑封面 -->
        <div class="music-main">
            <img :src="picUrl" v-show="picUrl!=''" class="music-cover" :class="isPlay?'running':'paused'">
        </div>
        <!-- 热评列表 -->
        <div class="comment-list">
            <span class="comment-title">热门评论</span>
            <ul>
                <li v-for="item in hotCommentList">
                    <img class="user-header" :src="item.user.avatarUrl">
                    <span class="username">{{ item.user.nickname }}</span>
                    <p>{{ item.content }}</p>
                </li>
            </ul>
        </div>
    </main>

    <!-- 音乐 -->
    <footer>
        <audio :src="musicUrl" class="music-player" @play="play" @pause="pause" controls autoplay loop></audio>
    </footer>
    <!-- mv视频 -->
    <div class="music-mv" v-show="isMvShow" @click="closeMusicMv">
        <video :src="mvUrl" controls autoplay loop></video>
    </div>
</div>

<!-- 导入vue.js -->
<script src="http://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<!-- 导入axios -->
<script src="http://unpkg.com/axios/dist/axios.min.js"></script>
<!-- 引入自己编写的js -->
<script src="./19.js"></script>
</body>

5.2 css代码 (html中为19.css)

Show Code
body {
    background-image: linear-gradient(to left, rgba(248, 121, 248, 0.623), rgba(216, 160, 6, 0.795));
}

app {

position: relative;
width: 1300px;
height: 800px;
background-color: aliceblue;
margin: 50px auto;

}

header {
width: 100%;
height: 60px;
background-color: #ec4141;
}

.app-title {
float: left;
}

.app-title img {
height: 60px;
}

.app-search {
display: block;
float: right;
width: 600px;
height: 60px;
}

.app-search input {
outline: none;
background-color: #ec4141a6;
border: 1px solid #cebdbd7a;
width: 380px;
line-height: 30px;
margin: 15px 140px;
font-size: 13px;
border-radius: 5px;
text-indent: 10px;
color: #cebdbdfd;
}

.app-search input:focus {
border: 1px solid #cebdbdfd;
}

.app-search img {
width: 28px;
position: relative;
top: -46px;
left: 490px;
}

footer {
float: left;
width: 100%;
height: 60px;
background-color: #f1f3f4;
}

.music-list {
float: left;
height: 680px;
width: 280px;
position: relative;
left: -191px;
border-right: 1px solid #e0e0e0;
overflow-x: hidden;
overflow-y: auto;
}

.music-list ul {
list-style: none;
margin-top: 0px;
}

.music-list ul li a {
text-decoration: none;
color: black;
display: block;
line-height: 46px;
width: 278px;
margin-left: -40px;
text-indent: 20px;
font-size: 12px;
}

.music-list ul li a:hover {
background-color: #a8a4a433;
}

.music-run-image {
width: 20px;
position: relative;
left: -10px;
top: -1px;
}

.music-name {
display: inline-block;
width: 120px;
height: 35px;
overflow: hidden;
margin-left: -20px;
}

.music-mv-image {
width: 20px;
position: relative;
left: 100px;
top: 0px;
}

.comment-list {
float: right;
height: 680px;
width: 300px;
border-left: 1px solid #e0e0e0;
overflow: hidden;
overflow-y: auto;
}

.comment-list ul li {
width: 280px;
padding-left: 10px;
list-style: none;
font-size: 13px;
position: relative;
left: -40px;
}

.comment-title {
display: block;
line-height: 40px;
text-indent: 10px;
margin-top: 5px;
font-weight: 800;
}

.user-header {
width: 35px;
height: 35px;
border-radius: 50%;
}

.username {
position: relative;
top: -15px;
left: 10px;
font-size: 12px;
}

.music-main {
height: 680px;
width: 700px;
position: absolute;
left: 300px;
}

.music-cover {
width: 250px;
position: relative;
left: 180px;
top: 80px;
border-radius: 50%;
border: 50px solid #2a2b2dd2;
animation: fadenum 30s infinite linear;
}

.music-detail {
display: block;
color: #2a2b2dab;
position: relative;
text-align: center;
top: 120px;
}

.paused {
animation-play-state:paused;
}

.running {
animation-play-state:running;
}

@keyframes fadenum {
100% {
transform: rotate(360deg);
}
}

::-webkit-scrollbar {
width: 1px;
height: 16px;
background-color: #F5F5F5;
}

::-webkit-scrollbar-track {
-webkit-box-shadow: inset 0 0 6px rgba(126, 123, 123, 0.103);
border-radius: 10px;
background-color: #F5F5F5;
}

::-webkit-scrollbar-thumb {
border-radius: 10px;
-webkit-box-shadow: inset 0 0 6px rgba(139, 136, 136, 0.3);
background-color: rgba(199, 196, 196, 0.507);
}

.music-player {
width: 1300px;
}

.music-mv {
position: absolute;
z-index: 9999;
width: 1920px;
height: 937px;
background-color: #2a2b2da6;
top: -50px;
left: -310px;
}

.music-mv video {
position: relative;
width: 900px;
height: 500px;
left: 500px;
top: 150px;
}

5.3 js代码(html中为19.js)

Show Code
var vue = new Vue({
    el:"#app",
    data: {
        // 查询关键词
        keywords: "",
        // 歌曲列表
        musicList: [],
        // 热评列表
        hotCommentList: [],
        // 封面地址
        picUrl: "",
        // 歌曲地址
        musicUrl: "",
        // 动画播放状态
        isPlay: false,
        // mv地址
        mvUrl: "",
        // mv显示隐藏
        isMvShow: ""
    },
    methods: {
        getMusicInfo: function() {
            var that = this;
            axios.get("http://autumnfish.cn/search?keywords=" + that.keywords)
            .then(function(response) {
                console.log(response.data.result.songs)
                that.musicList = response.data.result.songs;
            }, function(err) {})
        },
        playMusic: function(id) {
            var that = this;
            // 拼接歌曲地址
            this.musicUrl = "http://music.163.com/song/media/outer/url?id="+id+".mp3"
            console.log(this.musicUrl);
        //获取歌曲详情
        axios.get("http://autumnfish.cn/song/detail?ids=" + id)
        .then(function(response) {
            console.log(response)
            that.picUrl = response.data.songs[0].al.picUrl;
        }, function(err) {})

        //获取热评
        axios.get("http://autumnfish.cn/comment/hot?type=0&id=" + id)
        .then(function(response) {
            console.log(response)
            that.hotCommentList = response.data.hotComments;
        }, function(err) {})

        that.isPlay = true;
    },
    play: function() {
        console.log("play");
        this.isPlay = true;
    },
    pause: function() {
        console.log("pause");
        this.isPlay = false;
    },
    playMv: function(mvid) {
        var that = this;
        // 暂停播放音乐
        document.querySelector("audio").pause();
        // 暂停封面动画
        that.isPlay = false;
        //获取mv地址
        axios.get("http://autumnfish.cn/mv/url?id=" + mvid)
        .then(function(response) {
            console.log(response)
            // 播放mv
            that.isMvShow = true;
            that.mvUrl = response.data.data.url;
        }, function(err) {})
    },
    closeMusicMv: function() {
        // 隐藏mv
        this.isMvShow = false;
        // 暂停播放mv
        document.querySelector("video").pause();
    }
}

})

PS:

网易云开始全面扩张VIP歌曲范围了,其中包括了我最爱的薛之谦?。

道生一,一生二,二生三,三生万物。
本文转载于网络 如有侵权请联系删除

相关文章

  • 流程控制-循环语句

    一、为什么要使用循环?循环做某件事情print("zutuanxue_comisagoodman") print("zutuanxue_comisagoodman") print("zutuanxue_comisagoodman") print("zutuanxue_comisagoodman") print("zutuanxue_comisagoodman")复制二、while语句格式while表达式: 语句复制逻辑当程序执行到while语句时,首先计算“表达式”的值。如果表达式的值为假则结束整个while语句继续向下执行,如果“表达式”的值为真则执行“语句”,执行完“语句”再次计算“表达式”的值。如果表达式的值为假则结束整个while语句继续向下执行,如果“表达式”的值为真则执行“语句”,执行完“语句”再次计算“表达式”的值。如此循环往复直到“表达式”的值为假才停止循环实现多次打印index=0 whileindex<5: print("zutuanxue_comis

  • Zabbix 5.0中被监控主机状态不可用报错:Get value from agent failed: cannot ..解决

    报错信息: Getvaluefromagentfailed:cannotconnectto[[192.168.2.129]:10050]:[113解决方法:永久关闭防火墙[root@localhost~]#systemctlstopfirewalld [root@localhost~]#systemctldisablefirewalld//永久关闭防火墙 [root@localhost~]#systemctlrestartzabbix-agent//重启zabbix-agent 复制  重启Zabbix-agent服务后刷新Zabbix页面可以看到test主机状态已经显示为可用。

  • DDIA 读书分享 第五章:Replication,主从

    本书第一部分讲单机数据系统,第二部分讲多机数据系统。冗余(Replication)是指将同一份数据复制多份,放到通过网络互联的多个机器上去。其好处有:降低延迟:可以在地理上同时接近不同地区的用户。提高可用性:当系统部分故障时仍然能够正常提供服务。提高读吞吐:平滑扩展可用于查询的机器。本章假设我们的数据系统中所有数据能够存放到一台机器中,则本章只需考虑多机冗余的问题。如果数据超过单机尺度该怎么办?那是下一章要解决的事情。如果数据是只读的,则冗余很好做,直接复制到多机即可。我们有时可以利用这个特性,使用分治策略,将数据分为只读部分和读写部分,则只读部分的冗余就会容易处理的多,甚至可以用EC方式做冗余,减小存储放大的同时,还提高了可用性。想想EC牺牲了什么? 以计算换存储。但难点就在于,数据允许数据变更时,如何维护多机冗余且一致。常用的冗余控制算法有:单领导者(singleleader)多领导者(multi-leader)无领导者(leaderless)这需要在多方面做取舍:使用同步复制还是异步复制如何处理失败的副本数据库冗余问题在学术界不是一个新问题了,但在工业界,大部分人都是新手——分布

  • 数据结构与JS也可以成为CP(十)Graph图

    我们先来看看图是什么吧~图由边和顶点的集合组成,名词解释1)有向图:一个图的顶点对是有序的。2)无序图:图是无序的。3)简单图:没有重复边、重复顶点的圈。 4)强连通:两个顶点之间有路径。图的实现下面看看图怎么实现吧!图是由顶点和边组成的,我们首先要实现顶点,然后实现边。functionGraph(v){ this.vertices=v; this.edges=0; this.adj=[]; for(vari=0;i<this.vertices;++i){ this.adj[i]=[]; this.adj[i].push(""); } this.addEdge=addEdge; this.showGraph=showGraph; } functionaddEdge(v,w){ this.adj[v].push(w); this.adj[w].push(v); this.edges++; } functionshowGraph(){ for(vari=0;i<this.vertices;++i){ putstr(i+"->");

  • 绕过防火墙过滤规则传输ICMP

    ICMP和ICMPv6ICMP和ICMPv6是Internet的主要协议。这些协议设计用于在数据包未到达目的地时进行连接测试和错误信令。接收ICMP消息让应用程序了解故障原因:数据包太大,没有可用路由等。出于不同的目的,ICMP[v6]消息由两个编码为两个字节的值标识:它们的类型和代码。每种类型都有不同的含义,例如,ICMP有以下消息:1.Echo回复和请求(类型1和8) 2.目的地无法到达(类型3) 3.Sourcequench(4型) 4.时间戳回复和请求(类型14和15)当ICMPv6具有:1.目的地无法到达(类型1) 2.数据包太大(类型2) 3.超过时间(类型3) 4.参数问题(类型4) 5.路由器询问和通告(133和134型) 6.邻居询问和通告(135和136型) 7….过去已弃用各种消息类型,而其他消息类型仍在使用中。我们可以根据其目的大致将ICMP消息分为三类:1.请求:它们由主机生成以查询某些信息; 2.回复:它们是上述ICMP请求的ICMP响应; 3.错误:它们是由网络设备或主机在无法处理数据包时创建的。本文重点介绍错误消息。这个类别非常有趣,因为它的消息作为带外

  • MySQL慢日志优化平台初步设计

    这是一个初步的概览面板,能够通过这个面板实现大部分的慢日志提取需求,目的是能够通过可视化的方式更全面的展示慢日志的信息,如下:而在这个基础上,其实我们的工作还有很多的改进之处,我们希望的不是单单的慢日志提取,听起来技术含量还是不够,我们想把这部分的内容做得更深更细一些,比如我们可以根据SQL指纹来得到一段时间周期内的性能历史情况,听过这个曲线图就能够知道同一个SQL在时间维度内的变化情况,是否稳定。我们根据快照来进行数据的提取展示,在不同的时间维度(半个小时以内)执行的时长,次数等都有一个更为精确的统计方式。在这个基础上,我们补充了表信息执行计划的信息和相关表信息,也就是说一条SQL语句,我们会根据SQL提取出相关的表名,然后把这些信息通过列表的形式来展现,下钻到具体的表结构信息,这样我们分析一条SQL的问题时可以根据具有参考性。而强烈推荐的是两个部分,一个是SQL性能模型,我们根据SQL性能进行评估和打分,然后给出一些建议,这部分的内容还是初步设计阶段,也是我们需要不断完善的核心内容。而最后的相关SQL是一个比较有意思的功能,一条SQL语句相关的表有a,b,c,那么我们会根据这些表为

  • 成立不到一年完成3轮融资,澎思科技是一家怎样的公司?

    乾明发自凹非寺 量子位报道|公众号QbitAI正式成立不到一年,澎思科技又完成了一轮融资。昨天,这家专注于AI安防的公司宣布,完成1.5亿人民币的A轮融资,领投方为360和富士康等产业基金。这已经是澎思科技的第三轮融资了。其此前的投资方还有洪泰基金、IDG资本、高捷资本、上古资本等等。不到一年时间,明星机构、产业基金纷纷投资,也体现出了对这家公司的认可。但值得注意的是,在AI领域,安防这一赛道已经相对成熟。为什么这家年轻的公司,能够如此快速的获得各方资方青睐?这家公司是一家怎样的公司?有何独特的打法?接下来将会如何发展?国内第一批AI专业的毕业生、澎思科技的创始人兼CEO马原给出了答案:第一,立足于公司现有安防核心业务和商业模式,继续夯实安防主航道。第二,坚持行业+AI落地策略,不断扩展技术边界,寻找AI技术与垂直行业的落地场景。第三,成立新加坡研究院,在安防业务和拥有充足AI技术储备的的前提下,切入新的行业。这些动向,并不仅仅只关乎澎思,也是AI行业新势力的最新实践与思考。AI行业,新玩家如何立足行业获得发展?马原和澎思的故事,也许能够为你带来一些参考。AI安防,还有很多机会澎思科技

  • ES6——箭头函数

    ES6之后,允许使用箭头=>来定义函数。首先我们来总结一下箭头函数存在的意义,之后再来细细的看它的使用方法。箭头函数表达式的语法比函数表达式更短,并且不绑定自己的this,arguments,super或者new.target。这些函数表达式最适合用于非方法函数,并且它们不能用作构造函数。讲完了箭头函数的意义,那么我们总最基础的示例开始看,先看一个常规语法定义的函数:functionfuncName(params){ returnparams+2; } funcName(2);//4复制如果这个函数用箭头函数改写的话,仅仅需要一行代码就够了:constfuncName=(params)=>params+2; funcName(2);//4复制如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,如果有返回值,就要使用return语句返回。如果表达式是单一的,则可以只用小括号()。例如我上面的例子。varsum=(number1,number2)=>{returnnumber1+number2;}复制而箭头函数的参数部分,可以用一个圆括号来代表参数部分。如

  • 机器学习 —— 浅谈贝叶斯和MCMC

    作者|徐炎琨来源|徐炎琨的知乎问答‍‍Abstract:最近课业内的任务不是很多,又临近暑假了,就在网上搜了一些有关于机器学习和深度学习的课程进行学习。网上的资料非常繁多,很难甄别,我也是货比三家进行学习。这是这个系列的第一个笔记,是关于贝叶斯和MCMC一些数学原理的讲解和代码的实现,希望能够深入浅出,叙述的容易让人理解。…▌浅谈贝叶斯不论是学习概率统计还是机器学习的过程中,贝叶斯总是是绕不过去的一道坎,大部分人在学习的时候都是在强行地背公式和套用方法,没有真正去理解其牛逼的思想内涵。我看了一下Chalmers一些涉及到贝叶斯统计的课程,content里的第一条都是PhilosophyofBayesianstatistics。▌历史背景什么事都要从头说起,贝叶斯全名为托马斯·贝叶斯(ThomasBayes,1701-1761),是一位与牛顿同时代的牧师,是一位业余数学家,平时就思考些有关上帝的事情,当然,统计学家都认为概率这个东西就是上帝在掷骰子。当时贝叶斯发现了古典统计学当中的一些缺点,从而提出了自己的“贝叶斯统计学”,但贝叶斯统计当中由于引入了一个主观因素(先验概率,下文会介绍),

  • iOS-UIWebView加载HTMLString图片显示超过屏幕宽度,导致webView可以左右滑动处的理方法

    简单介绍一下使用[self.webViewloadHTMLString:htmlsbaseURL:nil]单纯加载HTMLString的小技巧。 主要解决的是当加载的HTMLString既有文字又有图片时,图片没有缩放,导致图片宽度超过屏幕宽度,使得webView整体左右都可以滑动,这样效果非常不好(见下图):01-图片过宽导致webView可以左右滑动.gif01-图片过宽导致webView可以左右滑动.gif效果不好的代码如下: 注:以下方法是在网络请求成功回调里面调用的 //网络请求加载的数据,进行字典转模型 NSDictionary*dict=[resultobjectForKey:@"data"]; HQNewsDetailModel*model=[HQNewsDetailModelmj_objectWithKeyValues:dict]; //model.details就是后台返回的HTMLString NSString*htmlString=[NSStringstringWithString:model.details]; //webView直接加载H

  • 一周简报|智齿客服:智能客服的改造者

    编辑导语智齿客服:智能客服的改造者;时代拓灵孙学京:VR再好,也需要声音来衬托;TuSDK:刷脸时代来临,人脸识别先行;TalkingData联合Kochava发布移动广告监测国际版SDK;棱镜SDK专注于手游企业服务,彻底解决全渠道接入及安全问题.智齿客服:智能客服的改造者据艾媒咨询(iiMediaResearch)公布2015年中国移动客服最新研究报告显示:国内75%的顾客因对客服不满而放弃购买行为;超过四成的顾客因对客服不满而不推荐他人购买。其中,85后、90后等新一代用户群体,对客户服务更加敏感。智齿科技是一家创立不到两年时间,希望通过人工智能技术来重新改造客服行业的创业创新公司。在其联合创始人兼CEO徐懿看来,目前传统客服行业普遍存在三个短板:一是客服体验不友好;二是顾客等待时间长;三是没有从根本上解决顾客关心的服务问题。2014年12月,智齿科技推出集自然语言处理技术、数学统计模型、大数据分析技术于一身的在线客服问答机器人Sobot2.0版本。在2.0阶段,机器人可以根据大型企业客户自身业务需求提供个性化的在线客服定制服务。3个月后,智能客服机器人更新至3.0版本,在原来在

  • Can you answer these queries

      链接:here CanyouanswerthesequeriesI  SPOJ-GSS1  1#include<bits/stdc++.h> 2usingnamespacestd; 3#definelsrt<<1 4#definersrt<<1|1 5#definelsonl,m,ls 6#definersonm+1,r,rs 7constintmaxn=50010; 8 9inta[maxn],s[maxn]; 10intpre[maxn<<2],post[maxn<<2],maxv[maxn<<2]; 11 12voidpushup(intl,intr,intrt){ 13intm=(l+r)>>1; 14pre[rt]=max(pre[ls],s[m]-s[l-1]+pre[rs]); 15post[rt]=max(post[rs],s[r]-s[m]+post[ls]); 16maxv[rt]=max(max(maxv[rs],maxv[ls]),pre[r

  • 假期学习进度1

    毕业设计进度10% 阅读《Android开发从入门到精通》,查找要使用的知识点,并按照例子进行练习; 阅读乐理有关资料,为毕设乐理内容准备; 学习musicxml有关知识点,控制midi音频; android中字符串处理技巧;   下一步: 设计musicxml文件与字符内容匹配

  • .js文件引用后面添加时间戳防止浏览器缓存问题

    //?后面v=2和v=3就是两个不同的文件<scriptsrc="//pubunder.artron.net/library/js/getCookie.js?v=2"></script> 复制  

  • BZOJ 3532: [Sdoi2014]Lis

    3532:[Sdoi2014]Lis TimeLimit: 10Sec  MemoryLimit: 512MBSubmit: 758  Solved: 284[Submit][Status][Discuss] Description  给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci。请删除若干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案。   如果有多种方案,请输出将删去项的附加属性排序之后,字典序最小的一种。 Input  输入包含多组数据。   输入的第一行包含整数T,表示数据组数。接下来4*T行描述每组数据。   每组数据的第一行包含一个整数N,表示A的项数,接下来三行,每行N个整数A1..An,B1.,Bn,C1..Cn,满足1<=Ai,Bi,Ci<=10^9,且Ci两两不同。 Output   &nb

  • 常用Dos命令

    #盘符切换#查看当前目录所有文件dir#切换目录cdcd..返回上一级#清理屏幕cls(clearscreen)#退出终端exit#查看电脑IP地址ipconfig#打开应用calc(计算器)mspaint(画图工具)notepad(记事本)#ping命令#文件操作md目录名rd目录名cd>文件名del文件名

  • 让服务器apache/iis/nginx支持.apk/ipa文件下载

    服务器iis支持.apk文件下载的设置 IIS服务器不能下载.apk文件的原因:iis的默认MIME类型中没有.apk文件,所以无法下载。 IIS服务器不能下载.apk文件的解决办法:既然.apk无法下载是因为没有MIME,那么添加一个MIME类型就可以了。 IIS服务器不能下载.apk文件的解决步骤: 打开IIS服务管理器,找到服务器,右键-属性,打开IIS服务属性;单击MIME类型下的“MIME类型”按钮,打开MIME类型设置窗口;单击“新建”,建立新的MIME类型;扩展名中填写“.apk”,MIME类型中填写apk的MIME类型“application/vnd.android.package-archive” 单击“确定”保存设置。重启IIS,使设置生效。 服务器apache支持.apk文件下载的设置 在Apache安装目录下的conf/mime.types文件的对应位置,加上以下一行语句,指定APK文件的MIME类型为application/vnd.android.package-archive即可: application/vnd.android.package-archiv

  • ROS机械臂仿真与实物同步

    去年玩机械臂的时候做的一套ROS仿真和机械臂连接的效果,仅实现了简单的仿真与实物同步,将规划的动作通过串口发送到控制板上,详细过程后面有时间再整理,担心时间长了程序被搞乱了就跑不起来了,再调又耽误时间,先存个效果的备份。 效果如下: Rviz中的运动规划: Gazebo的仿真: 联调和实物一起控制: 机械臂动作:(由于上传限制减少了2/3的帧数,看起来不是很连贯)

  • PHP PSR 代码规范基本介绍

    PSR是PHPStandardRecommendation的简写,即PHP推荐标准。 目前通过的规范有PSR-0(AutoloadingStandard)、PSR-1(BasicCodingStandard)、PSR-2(CodingStyleGuide)、PSR-3(LoggerInterface)、PSR-4(ImprovedAutoloading)。 PSR不是PHP官方标准,而是从如Zend、Symfony2等知名PHP项目中提炼出来的一系列标准,目前有越来越多的社区项目加入并遵循该标准。 PHPFIG(FrameworkInteroperabilityGroup)框架可互用性小组是制定PSR开发规范的组织。他们的目的在于以最低程度的限制制定一个统一的标准,让各个框架遵循统一的编码规范。   ====================PSR-0(自动加载规范)======================= PSR-0(AutoloadingStandard)类自动加载规范,该规范现已废弃(Deprecated),它将由PSR-4替代。 1.一个完全合格的命名空间和类

  • Vue学习总结

    框架和库的区别?         jquery库->DOM(操作DOM)+请求         art-template库->模板引擎         框架=全方位功能齐全          简易的DOM体验+发请求+模板引擎+路由功能         代码的不同          一般使用库的代码,是调用某个函数,我们自己把控库的代码          一般使用框架,其框架在帮我们运行我们编写

  • MySQL触发器使用详解

    原文地址:https://www.cnblogs.com/duodushu/p/5446384.html MySQL包含对触发器的支持。触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行。 创建触发器在MySQL中,创建触发器语法如下: 代码如下: CREATETRIGGERtrigger_nametrigger_timetrigger_eventONtbl_nameFOREACHROWtrigger_stmt 其中: trigger_name:标识触发器名称,用户自行指定;trigger_time:标识触发时机,取值为BEFORE或AFTER;trigger_event:标识触发事件,取值为INSERT、UPDATE或DELETE;tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;trigger_stmt:触发器程序体,可以是一句SQL语句,或者用BEGIN和END包含的多条语句。 由此可见,可以建立6种触发器,即:BEFOREINSERT、BEFOREUPDATE、BEFOREDELETE、AFTE

相关推荐

推荐阅读