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

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

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

复制代码
https://blog.csdn.net/wtt234/article/details/131759154

优化内容:

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

2.前端才有layui优化内容

后端:

复制代码
package main

import (
	"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 filename
			names[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;
  }
  //JS
  layui.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

界面优化:

相关推荐
xjt_090113 分钟前
基于 Vue 3 构建企业级 Web Components 组件库
前端·javascript·vue.js
我是伪码农25 分钟前
Vue 2.3
前端·javascript·vue.js
夜郎king1 小时前
HTML5 SVG 实现日出日落动画与实时天气可视化
前端·html5·svg 日出日落
辰风沐阳1 小时前
JavaScript 的宏任务和微任务
javascript
夏幻灵2 小时前
HTML5里最常用的十大标签
前端·html·html5
冰暮流星2 小时前
javascript之二重循环练习
开发语言·javascript·数据库
Mr Xu_2 小时前
Vue 3 中 watch 的使用详解:监听响应式数据变化的利器
前端·javascript·vue.js
未来龙皇小蓝2 小时前
RBAC前端架构-01:项目初始化
前端·架构
程序员agions2 小时前
2026年,微前端终于“死“了
前端·状态模式
万岳科技系统开发2 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法