简单版本视频播放服务器V4,layui界面

简单版本视频播放服务器V4

前一个版本内容,可以查看

https://blog.csdn.net/wtt234/article/details/131759154

优化内容:

1.返回列表的优化,优化了原来返回空列表名称的问题

2.前端才有layui优化内容

后端:

package mainimport ("fmt""io/ioutil""net/http""os""path""strings""github.com/gin-gonic/gin"
)// 这个代码在windows,linux中都是可以使用,这里重点关注的就是
//
//	videos := fmt.Sprintf("%s/%s", ml, "videos") 这样设置  windows linux都是可以使用
//
// 实现遍历程序的当前目录videos下的文件
func ListDir() ([]string, error) {ml, _ := os.Getwd()videos := fmt.Sprintf("%s/%s", ml, "videos")infos, err := ioutil.ReadDir(videos)if err != nil {return nil, err}//names := make([]string, len(infos))  这里容易有问题!!!names := make([]string, 0)for _, info := range infos {//获取文件名 确认以*MP4结尾的放入切片中filename := info.Name()//fmt.Printf("name:%v,kind:%T\n", filename, filename)把layui的包文件过滤掉,里面有css,js文件等//if filename == "layui" {//	continue//}//fmt.Printf("name%v,type:%T", filename, filename)isbool := strings.HasSuffix(filename, ".mp4")if isbool {//if filename//优化的地方,如果不优化,的话,返回的slcie中会有空“文件名”的出现//names[i] = info.Name()names = append(names, filename)}}fmt.Printf("%s==>%d", names, len(names))//fmt.Printf("is:===>%v", names)return names, nil
}func ListDirllinux() ([]string, error) {ml, _ := os.Getwd()videos := fmt.Sprintf("%s//%s", ml, "videos")infos, err := ioutil.ReadDir(videos)if err != nil {return nil, err}names := make([]string, len(infos))for i, info := range infos {//获取文件名 确认以*MP4结尾的放入切片中filename := info.Name()//fmt.Println(filename)if strings.HasSuffix(filename, ".mp4") {//if filenamenames[i] = info.Name()}}return names, nil
}// 文件下载功能实现
func DowFile(c *gin.Context) {//通过动态路由方式获取文件名,以实现下载不同文件的功能name := c.Param("name")//拼接路径,如果没有这一步,则默认在当前路径下寻找filename := path.Join("./videos", name)//响应一个文件c.File(filename)return
}func main() {r := gin.Default()r.LoadHTMLGlob("templates/*")// 初始化默认静态资源r.StaticFS("/videos", http.Dir("./videos"))//windows 和linux下的路径稍微不同names, _ := ListDir()//names, _ := ListDirllinux()r.GET("/index", func(c *gin.Context) {//c.HTML(http.StatusOK, "index.html", gin.H{"names": names})//c.HTML(http.StatusOK, "index.html", gin.H{"names": names})c.HTML(http.StatusOK, "layui_index.html", gin.H{"names": names})//c.HTML(http.StatusOK, "index_lab.html", gin.H{"names": names})})r.GET("/GetFile/:name", DowFile)//r.Run()r.Run("0.0.0.0:8080")
}

前端:

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>视频播放</title><meta name="renderer" content="webkit"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/videos/layui/css/layui.css"><script src="/videos/layui/layui.js"></script><!--  在移动端和PC端自动设置div的宽度和高度,可以使用CSS media --><style>/* 在移动端设置div的宽度和高度 */@media screen and (max-width: 767px) {#video {width: 100%;height: 300px;}}/* 在PC端设置div的宽度和高度 */@media screen and (min-width: 768px) {#video {width: 800px;height: 600px;}}</style>
</head>
<body>
<div class="layui-layout layui-layout-admin"><div class="layui-header"><div class="layui-logo layui-hide-xs layui-bg-black">播放器</div><!-- 头部区域(可配合layui 已有的水平导航) --><ul class="layui-nav layui-layout-left"><!-- 移动端显示 --><li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm" lay-header-event="menuLeft"><i class="layui-icon layui-icon-spread-left"></i></li></ul><ul class="layui-nav layui-layout-right"></ul></div><div class="layui-side layui-bg-black"><div class="layui-side-scroll"><!-- 左侧导航区域(可配合layui已有的垂直导航) --><ul class="layui-nav layui-nav-tree" lay-filter="test"><li class="layui-nav-item layui-nav-itemed"><a class="" href="javascript:;">播放列表</a>{{range $index,$v := .names}}<dl class="layui-nav-child"><dd><a href="javascript:;" onclick="changeVideo('{{$v }}', '{{$v }}')">{{$v }}</a></dd></dl>{{end}}</li></ul></div></div><div class="layui-body"><!-- 内容主体区域 --><div style="padding: 15px;"><!--     <blockquote class="layui-elem-quote layui-text">Layui 框体布局内容主体区域</blockquote> --><div class="layui-card layui-panel"><!--    <div class="layui-card-header">下面是充数内容,为的是出现滚动条</div> --><div class="layui-card-body">
<!--          <video src="movie.ogg" controls="controls" height="800px">-->
<!--          <video id="video" width="800" height="600" controls="controls" src="http://10.72.1.241:8080/GetFile/a1.mp4"-->
<!--                 type="video/ogg"></video></br>--><video id="video" controls="controls" src="http://10.72.1.241:8080/GetFile/a1.mp4"type="video/ogg"></video></video></div></div><br><br></div></div></div> -->
</div><!--<script src="//cdn.staticfile.org/layui/2.8.11/layui.js"></script>-->
<!--<script src="/videos/layui/layui.js"></script>-->
<script>function changeVideo(source, title) {video.src ="http://10.72.1.241:8080/GetFile/" + source;// video.play();// 更新选中状态和标题playlistItems.forEach(function(item) {item.classList.remove('active');});event.target.classList.add('active');document.title = title;}//JSlayui.use(['element', 'layer', 'util'], function(){var element = layui.element;var layer = layui.layer;var util = layui.util;var $ = layui.$;//头部事件util.event('lay-header-event', {menuLeft: function(othis){ // 左侧菜单事件layer.msg('展开左侧菜单的操作', {icon: 0});},});});
</script>
</body>
</html>

优化slice

 界面优化:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/17260.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安科瑞AMC200多回路智能电量采集监控装置在隧道中的应用-安科瑞黄安南

1项目背景 河南安阳林州市某高速公路项目是河南省政府主要打造的一项公路建设项目&#xff0c;该项目全长约70公里&#xff0c;起点位于安阳市内&#xff0c;终点位于林州市县。该项目总投资约60亿元人民币&#xff0c;建设工期预计为3年。 该项目的建设旨在缓解当地交通压力…

为高性能计算构建,由亚马逊云科技Amazon Graviton3E驱动的最新实例正式可用

亚马逊云科技宣布两款基于最新一代自研芯片Amazon Graviton3E的新实例Amazon Elastic Compute Cloud&#xff08;Amazon EC2&#xff09;Hpc7g和Amazon EC2 C7gn正式可用。 其中&#xff0c;Hpc7g实例专为计算和网络密集型高性能计算&#xff08;HPC&#xff09;工作负载而构建…

微信小程序配置上传多个u-upload上传

微信小程序配置上传多个u-upload上传 使用的是uView框架 微信小程序配置上传多个u-upload上传图片 场景需求&#xff1a;根据PC端配置项追加图片配置 小程序根据配置的图片数量&#xff0c;图片名称&#xff0c;进行上传图片 难度在于 我们不知道用户会追加多少个图片配置字段 …

git撤销上一次的commit

一行命令 git reset --soft HEAD^如果在vscode上面&#xff0c;就可以

【Leecode】交替合并字符串- join

题目 给你两个字符串 word1 和 word2 。请你从 word1 开始&#xff0c;通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长&#xff0c;就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 错误1 class Solution:def mergeAlternately(self, w…

C++ 类和对象篇(三) 空类和默认成员函数

目录 一、空类 二、6个默认成员函数 一、空类 1.是什么&#xff1f; 如果一个类中没有显示定义任何成员&#xff0c;简称为空类。 class A {};//一个空类 2.空类中的成员&#xff1f; 空类中真的什么都没有吗&#xff1f; 并不是&#xff0c;任何类在什么都不写时&#xff0c…

关于Python 的 Web 自动化测试的实践

Web 测试是软件测试中比较重要的一个分支&#xff0c;而要实现 Web 自动化测试则要求测试人员能熟练掌握自动化测试工具和编程语言。介绍免费开源的 Web 测试工具 Selenium&#xff0c;以及流行的编程语言 Python。根据自动化测试的原理&#xff0c;对网页元素的常用定位方式&a…

ES6 - Iterator迭代器和for...of 循环

文章目录 前言一、Iterator介绍二、Iterator原理三、实现Iterator接口的原生对象有五、默认调用 Iterator 接口的场合六&#xff0c;for... of 循环七&#xff0c;总结 前言 JavaScript 原有的表示“集合”的数据结构&#xff0c;主要是数组&#xff08;Array&#xff09;和对…

Qt Creator 11 开放源码集成开发环境新增集成终端和 GitHub Copilot 支持

导读Qt 项目今天发布了 Qt Creator 11&#xff0c;这是一款开源、免费、跨平台 IDE&#xff08;集成开发环境&#xff09;软件的最新稳定版本&#xff0c;适用于 GNU/Linux、macOS 和 Windows 平台。 Qt Creator 11 的亮点包括支持标签、多外壳、颜色和字体的集成终端模拟器&am…

【微信小程序创作之路】- 小程序事件绑定、动态提示Toast、对话框 Modal

【微信小程序创作之路】- 小程序事件绑定、动态提示Toast、对话框 Modal 第六章 小程序事件绑定、动态提示Toast、对话框 Modal 文章目录 【微信小程序创作之路】- 小程序事件绑定、动态提示Toast、对话框 Modal前言一、事件是什么&#xff1f;二、小程序中常用事件三、事件传…

2023年受人欢迎的低代码开发平台大盘点

随着企业对于降低成本和加快软件开发的需求增加&#xff0c;低代码开发平台逐渐成为一种受欢迎的选择。这些平台提供了拖放界面和预置组件&#xff0c;使得开发人员可以用更少的代码创建复杂的应用软件。低代码开发平台不仅有助于企业加速数字化转型&#xff0c;而且还能打破业…

URP基于GL的Unity物体网格线绘制方法参考

直接上代码&#xff1a; using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering;public class GLWireMesh : MonoBehaviour {[Serializable]public class IntPair{public int a;public int b;public IntPair(int a, int b){this.a…

Linux系统管理:虚拟机Rocky Linux安装

目录 一、理论 1.Rocky Linux 2.NetworkManager配置 3.ipaddress 配置文件 4.nmtui 配置 ipaddress 二、实验 1.虚拟机Rocky Linux安装准备阶段 2.安装Rocky Linux 3.进入系统 三、问题 1.网络配置文件权限不够 一、理论 1.Rocky Linux &#xff08;1&#xff0…

下载的谷歌模型如何转为3dtiles

收费工具&#xff0c;学生党勿扰 收费金额1000元 已经购买过工具的大佬&#xff0c;可以免费更新 1 概述 上个月&#xff0c;写了一篇<<谷歌地图模型自动下载>>的文章&#xff0c;效果还不错&#xff0c;能够帮到一些同学。 但是&#xff0c;随着谷歌模型下载的越…

uniapp开发微信小程序--自定义顶部导航栏

一、实现效果&#xff1a; 二、代码实现&#xff1a; 1.在pages.json文件中&#xff0c;单页面定义导航栏&#xff0c;添加以下代码&#xff1a; "navigationStyle": "custom" //自定义导航栏如图所示&#xff1a; 2.在components文件夹下&#xff0c;…

使用多数据源dynamic-datasource-spring-boot-starter遇到的问题记录

记录使用多数据源dynamic-datasource-spring-boot-starter遇到的问题&#xff1a; 1、工程启动失败 缺少clickhouse连接驱动&#xff0c;引入对应的maven依赖 <!--ck连接驱动--><dependency><groupId>ru.yandex.clickhouse</groupId><artifactId>…

Kylin v10基于cephadm工具离线部署ceph分布式存储

1. 环境&#xff1a; ceph&#xff1a;octopus OS&#xff1a;Kylin-Server-V10_U1-Release-Build02-20210824-GFB-x86_64、CentOS Linux release 7.9.2009 2. ceph和cephadm 2.1 ceph简介 Ceph可用于向云平台提供对象存储、块设备服务和文件系统。所有Ceph存储集群部署都从…

制作crate并发布到Crates.io

准备 发布 crate 时, 一旦发布无法修改,无法覆盖, 因此要注意邮箱等一些个人信息 访问crates.io 的 帐号设定页面[1],生成Token 并在命令行 执行 cargo login your token 此命令将告诉 Cargo 你的 API 令牌, 并将其存储在本地 ~/.cargo/credentials crates.io 上crate的名字, 会…

生成测试报告就万事大吉了吗?NO,升职加薪就差这一步啦!- 04(非常详细,非常实用)

简介 上一篇生成测试报告&#xff0c;小伙伴们和童鞋们就又问道&#xff0c;测试报告已经生成了&#xff0c;怎么发送给相关的负责人了&#xff1f;小伙伴们和童鞋们不要着急&#xff0c;慢慢给你道来&#xff0c;心急吃不了热豆腐哈。这些小伙伴们的表现还是不错的&#xff0c…

安装nvm之后,node -v 提示‘node‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

1. 检查有没有执行这个命令&#xff1a;nvm use [nodejs version name] 2. 检查nvm安装位置同级&#xff0c;有没有nodejs文件夹&#xff0c;是一个快捷键&#xff01;如果有一个其他的nodejs&#xff0c;把它删掉&#xff0c;然后到cmd中&#xff0c;重新nvm install一下&…