用nodejs写个简单的视频网站[教程]

用nodejs写个简单的视频网站[教程]#


首先你要有nodejs环境和会使用npm,不会自行Google或百度。

ok!开始吧!

效果示例

第一步 用nodejs编写后台:

1.新建项目

2.创建static文件夹(可自行更改)

3.static文件夹下创建videos文件夹(可自行更改)

4.在项目目录创建 app.js 内部代码如下

 
var http = require('http');
var fs = require('fs');
var rd = require('rd');
var express = require('express');
var app = express();  
app.use("/static", express.static(__dirname + '/static'));//引入静态文件夹

var vdo_path = __dirname + "\\static\\videos\\";//视频文件夹路径(可自行更改)
var vdo_info_ls = [];//获取到的文件信息集
function getFileInfo(path) {//遍历文件夹
    try {
        var files = rd.readSync(path);//获取目录下所有文件和文件夹
        for (var i in files) {//循环遍历
            if (!fs.lstatSync(files[i]).isDirectory()) {//判断是否为文件 
                if (files[i].toLowerCase().split(".mp4").reverse()[0].length== 0) {//判断是否为MP4格式文件(这里默认以MP4为例 其他格式大家自行过滤)
                    vdo_info_ls[vdo_info_ls.length]={
                        name: files[i].split("\\").reverse()[0].replace(".mp4", "").replace(".MP4", ""),//获取文件名
                        url: (vdo_path.replace(__dirname, "")+ files[i].replace(vdo_path, "")).replace("\\", "/"), //获取文件的web路径
                        mtime: fs.statSync(files[i]).mtime//修改时间作为发布时间
                    }//添加信息到文件信息集
                }
            }
        }

    }
    catch (e) {
        console.log(e)
    }
}

function reGetFileInfos() {//这里是为了大家以后写后台进行文件刷新时使用
    vdo_info_ls = [];//初始化集合
    getFileInfo(vdo_path); //遍历文件夹
    vdo_info_ls.sort(function (a, b) {//时间排序
        return Date.parse(b.ctime) - Date.parse(a.ctime);//时间正序(不过这个方法好像只能对月日起效 对年好像不起作用)
    }); 
} 
 
var page_count = 20;//分页条数
app.get('/getvdojson', function (req, res) {
    var ret = [];//返回的分页json初始化
    if (req.query.page) {//判断是否有get参数page
        if (parseInt(req.query.page) >= 0) {//
            for (var i = 0; i < page_count; i++) {//遍历获取
                ret[ret.length] = vdo_info_ls[parseInt(req.query.page) * page_count + i];
            }
        }
    } 
    res.json(ret);//返回json
});
 
// 创建服务端
http.createServer(app).listen('5000', function () {
    reGetFileInfos();//初始化文件信息集
    console.log('启动服务器完成');
});

写入代码后运行。

浏览器访问http://127.0.0.1:5000/getvdojson?page=0 查看效果

改变url的page参数查看效果。

如果运行正常页面会返回json。(如:[{“name”:”一分钟学唱《loser》…..”mtime”:”2016-07-27T11:11:28.501Z”}])

第二步 编写网站前台主页面:

1.添加以下代码到app.js

app.get('/', function (req, res) {
    res.sendFile(__dirname + "\\" + "index.html");
});

2.static文件夹下创建img,js和css文件夹分别存放img,js和css文件

3.在项目下创建index.html写入以下代码

<!DOCTYPE html>
<html >

<head>
    <meta charset="UTF-8">
    <title>小视频</title>
    <script src="/static/js/jquery.min.js"></script>
    <script src="/static/js/minigrid.js"></script><!--  轻量级瀑布流插件 具体可搜索minigrid了解 -->
    <style>
        /*全局样式*/
        * {
            margin: 0;
            padding: 0;
        }
        
        a {
            text-decoration: none;
        }
        
        body {
            line-height: 1;
            background: #FFF;
        } 
        body {
            font-family: "Microsoft Yahei";
            background: #f4f4f4;
            min-width: 1000px;
            height: 100%;
        }
        /*主体居中*/
        .container {
            width: 98%;
            position: relative;
            margin-bottom: 20px;
            margin: 0 auto;
        } 
        #photo-box .photo {
            display: block;
            /*float: left;*/
            width: 225px;
            background-color: #fff;
            overflow: hidden;
            position: absolute;
            -webkit-transition: .3s ease-in-out;
            -o-transition: .3s ease-in-out;
            transition: .3s ease-in-out;
            border: 1px solid #e2e2e2;
        }
        
        #photo-box .photo .content {
            margin: 0 10px  ;
            font-size: 14px;
            color: #777;
            line-height: 20px;
            word-break: break-all;
        }

        /*显示加载*/
         #load-over{
                width: 95%;
                margin: 0 auto; 
                border-bottom: 1px #ccc solid;
                border-top: 1px #ccc solid;
                padding: 20px 0px;
                text-align: center;
                margin-bottom: 30px;
                color: #999;
        }
    </style>
</head>

<body>
    <!--"photo-box"为瀑布流 图片容器-->
    <div id="photo-box" class="container">
        <!--"photo"显示视频缩略图与图片信息-->
        <a class="photo" target="_blank" href="#">
            [站外图片上传中……(2)]
            <div class="content">
                欢迎来到XXX(公告或广告位)
            </div>
        </a> 


<a class="photo" target="_blank" href="#">
            [站外图片上传中……(3)]
            <div class="content">
                欢迎来到XXX(公告或广告位)
            </div>
        </a> 
        <a class="photo" target="_blank" href="#">
            [站外图片上传中……(4)]
            <div class="content">
                欢迎来到XXX(公告或广告位)
            </div>
        </a> 
        <a class="photo" target="_blank" href="#">
            [站外图片上传中……(5)]
            <div class="content">
                欢迎来到XXX(公告或广告位)
            </div>
        </a> 
        <a class="photo" target="_blank" href="#">
            [站外图片上传中……(6)]
            <div class="content">
                欢迎来到XXX(公告或广告位)
            </div>
        </a> 
        <a class="photo" target="_blank" href="#">
            [站外图片上传中……(7)]
            <div class="content">
                欢迎来到XXX(公告或广告位)
            </div>
        </a> 
        <a class="photo" target="_blank" href="#">
            [站外图片上传中……(8)]
            <div class="content">
                欢迎来到XXX(公告或广告位)
            </div>
        </a> 
        <a class="photo" target="_blank" href="#">
            [站外图片上传中……(9)]
            <div class="content">
                欢迎来到XXX(公告或广告位)
            </div>
        </a> 
        <a class="photo" target="_blank" href="#">
            [站外图片上传中……(10)]
            <div class="content">
                欢迎来到XXX(公告或广告位)
            </div>
        </a> 
        <a class="photo" target="_blank" href="#">
            [站外图片上传中……(11)]
            <div class="content">
                欢迎来到XXX(公告或广告位)
            </div>
        </a> 
        <a class="photo" target="_blank" href="#">
            [站外图片上传中……(12)]
            <div class="content">
                欢迎来到XXX(公告或广告位)
            </div>
        </a> 
        <a class="photo" target="_blank" href="#">
            [站外图片上传中……(13)]
            <div class="content">
                欢迎来到XXX(公告或广告位)
            </div>
        </a> 

    </div>

    <div id="load-over" style="">
        加载中...
    </div>
    <script> 
            minigrid('#photo-box', '.photo', 20, null,
                function() {
                    //更新后回调
                });//瀑布流插件初始化
            window.addEventListener('resize', function() {//窗口大小改变自动排版
                minigrid('#photo-box', '.photo');
            }); 
                  
    </script>
</body>

</html>

访问http://127.0.0.1:5000/ 查看效果
效果示例:

Paste_Image.png

第三步 前后台结合:

1.修改index.html为以下代码(请注意修改变化)


<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>小视频</title>
    <script src="/static/js/jquery-2.1.4.min.js"></script>
    <script src="/static/js/minigrid.js"></script>
    <style>
        /*全局样式*/
        
        * {
            margin: 0;
            padding: 0;
        }
        
        a {
            text-decoration: none;
        }
        
        body {
            line-height: 1;
            background: #FFF;
        }
        
        body {
            font-family: "Microsoft Yahei";
            background: #f4f4f4;
            min-width: 1000px;
            height: 100%;
        }
        /*主体居中*/
        
        .container {
            width: 98%;
            position: relative;
            margin-bottom: 20px;
            margin: 0 auto;
        }
        
        #photo-box .photo {
            display: block;
            /*float: left;*/
            width: 225px;
            background-color: #fff;
            overflow: hidden;
            position: absolute;
            -webkit-transition: .3s ease-in-out;
            -o-transition: .3s ease-in-out;
            transition: .3s ease-in-out;
            border: 1px solid #e2e2e2;
        }
        
        #photo-box .photo .content {
            margin: 0 10px;
            font-size: 14px;
            color: #777;
            line-height: 20px;
            word-break: break-all;
        }
        /*显示加载*/
        
        #load-over {
            width: 95%;
            margin: 0 auto;
            border-bottom: 1px #ccc solid;
            border-top: 1px #ccc solid;
            padding: 20px 0px;
            text-align: center;
            margin-bottom: 30px;
            color: #999;
        }
    </style>
    <script>
        //--获取视频缩略图--
            function vload(obj) {
                $(obj).removeAttr("poster");
                var vimg = $("<img/>",{width:"100%"})[0];
                captureImage(obj, vimg);
                $(obj).after(vimg);
                obj.remove();
                minigrid('#photo-box', '.photo');
            };
            var scale = 0.8; //缩放
            function captureImage(video, output) { //截图 
                try {
                    var videocanvas = $("<canvas/>")[0];
                    videocanvas.width = video.videoWidth * scale;
                    videocanvas.height = video.videoHeight * scale;
                    videocanvas.getContext('2d').drawImage(video, 0, 0, videocanvas.width, videocanvas.height);
                    output.src = videocanvas.toDataURL("image/png");
                    delete videocanvas; 
                } catch(e) {
                    output.src = "/static/img/status.gif"; //--status.gif为加载动画
                }  
            };
    </script>
</head>

<body>
    <!--"photo-box"为瀑布流 图片容器-->
    <div id="photo-box" class="container">
        <!--"photo"显示视频缩略图与图片信息-->
        <a class="photo" target="_blank" href="#">
            [站外图片上传中……(14)]
            <div class="content">
                欢迎来到XXX(公告或广告位)
            </div>
        </a>  
    </div>

    <div id="load-over" style="">
        加载中...
    </div>
    <script> 
        minigrid('#photo-box', '.photo', 20, null,
            function() {
                //更新后回调
            });//瀑布流插件初始化
        window.addEventListener('resize', function() {//窗口大小改变自动排版
            minigrid('#photo-box', '.photo');
        }); 

        function b_load(page){
            $("#load-over").text("加载...");
            $.getJSON("/getvdojson?page=" + page, function(data) { 
                    if(data.length > 0) {
                        for(let i in data) {
                            if(data[i]==null){
                                $("#load-over").text("加载完毕"); 
                                continue;
                            }
                            $("#photo-box").append(
                                    $("<a/>", {
                                        class: "photo",
                                        href:"javascript:void(0)"
                                    })
                                    .append($("<video/>", { src:  data[i].url , preload: "metadata", onloadeddata:'vload(this)',poster:"/static/img/status.gif",width: "100%"
                                    }))
                                .append($("<div/>", { class: "content" }).html(data[i].name) ) 
                                .append($("<input/>",{type:"datetime-local",value:(data[i].mtime).split('.')[0],readonly:"readonly"
                                }).css({width:"100%",
                                border:"none",
                                color: "#777",
                                "padding-left": "10px",
                                "padding-bottom": "10px"
                                }))
                        );
                    } 
                    minigrid('#photo-box', '.photo');
                }
            });
        }
         
        page = 0;
        window.onscroll = function() { 
            // var scrolltop=document.documentElement.scrollTop||document.body.scrollTop;
            var tops = $(document).scrollTop(); //获取滚动条的位置
            var sctop = $(document).height() - $(window).height();
            if(tops >= sctop) //成立说明滚动条已在最底部
            {
                page = page + 1; //传递页码 
                b_load(page);
            }
        };
        b_load(page);
        page=page+1;
        b_load(page); 
</script>
</body>

</html>

[为什么不直接显示视频而偏偏搞个截图?--因为本人前写过类似小网站,发现如果后台插件获取视频截图麻烦,但直接显示视频也就是video标签的话会出现当加载大量视频时,出现卡顿,导致部分视频无法显示缩略图和无法播放的现象。]
运行项目重新访问http://127.0.0.1:5000/ 查看效果

第四步 添加点击播放功能:

1.修改index.html为以下代码(请注意修改变化)


<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>小视频</title>
    <script src="/static/js/jquery-2.1.4.min.js"></script>
    <script src="/static/js/minigrid.js"></script>
    <style>
        /*全局样式*/
        
        * {
            margin: 0;
            padding: 0;
        }
        
        a {
            text-decoration: none;
        }
        
        body {
            line-height: 1;
            background: #FFF;
        }
        
        body {
            font-family: "Microsoft Yahei";
            background: #f4f4f4;
            min-width: 1000px;
            height: 100%;
        }
        /*主体居中*/
        
        .container {
            width: 98%;
            position: relative;
            margin-bottom: 20px;
            margin: 0 auto;
        }
        
        #photo-box .photo {
            display: block;
            /*float: left;*/
            width: 225px;
            background-color: #fff;
            overflow: hidden;
            position: absolute;
            -webkit-transition: .3s ease-in-out;
            -o-transition: .3s ease-in-out;
            transition: .3s ease-in-out;
            border: 1px solid #e2e2e2;
        }
        
        #photo-box .photo .content {
            margin: 0 10px;
            font-size: 14px;
            color: #777;
            line-height: 20px;
            word-break: break-all;
        }
        /*显示加载*/
        
        #load-over {
            width: 95%;
            margin: 0 auto;
            border-bottom: 1px #ccc solid;
            border-top: 1px #ccc solid;
            padding: 20px 0px;
            text-align: center;
            margin-bottom: 30px;
            color: #999;
        }
        /*弹出播放页面样式*/
        
        .mask {
            z-index: 999;
            position: fixed;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            background: rgba(229, 229, 229, .95);
            overflow: auto;
            padding-top: 30px;
        }
        
        .mask .close-layer {
            width: 56px;
            height: 56px;
            position: fixed;
            right: 14px;
            top: 0;
            cursor: pointer;
            z-index: 99995;
        }
        
        .mask .close-layer i {
            background: url(/static/img/btn_close_layer.png) 0 0 no-repeat;
            width: 36px;
            height: 36px;
            position: absolute;
            left: 50%;
            top: 50%;
            margin: -18px 0 0 -18px;
        }
        
        .pin-view-wrapper {
            width: 84%;
            margin: 0 auto;
            position: relative;
        }
        
        .pin-view-wrapper>.main-part,
        .pin-view-wrapper>.side-part {
            background-color: #fff;
            display: block;
            width: 100%;
        }
        
        .pin-view-wrapper>.main-part {}
        
        .pin-view-wrapper>.side-part {
            margin-bottom: 15px;
        }
        
        ul {
            list-style: none outside none;
            padding-left: 0;
            margin: 0;
        }
        
        .main-part .item img {
            /*width: 100%;*/
            display: block;
            margin: 0 auto;
            max-width: 100%;
        } 
        .main-part .item {} 
        .lSSlideOuter .lSPager.lSGallery img {
            display: block;
            height: 100%;
            max-width: 100px;
            width: 100%;
            max-height: 100px;
        }
        
        .clearfix video {
            width: 640px;
            margin: 0 auto;
            height: 480px;
            display: block;
            background-color: #000;
        }
    </style>
    <script>
        //--获取视频缩略图--
            function vload(obj) {
                $(obj).removeAttr("poster");
                var vimg = $("<img/>",{width:"100%"})[0];
                captureImage(obj, vimg);
                $(obj).after(vimg);
                obj.remove();
                minigrid('#photo-box', '.photo');
            };
            var scale = 0.8; //缩放
            function captureImage(video, output) { //截图 
                try {
                    var videocanvas = $("<canvas/>")[0];
                    videocanvas.width = video.videoWidth * scale;
                    videocanvas.height = video.videoHeight * scale;
                    videocanvas.getContext('2d').drawImage(video, 0, 0, videocanvas.width, videocanvas.height);
                    output.src = videocanvas.toDataURL("image/png");
                    delete videocanvas; 
                } catch(e) {
                    output.src = "/static/img/status.gif"; //--status.gif为加载动画
                }  
            };
    </script>
</head>

<body>
    <!--"photo-box"为瀑布流 图片容器-->
    <div id="photo-box" class="container">
        <!--"photo"显示视频缩略图与图片信息-->
        <a class="photo" target="_blank" href="#">
            [站外图片上传中……(15)]
            <div class="content">
                欢迎来到XXX(公告或广告位)
            </div>
        </a>
    </div>

    <div id="load-over" style="">
        加载中...
    </div>

    <!--遮罩层-->
    <div id="vdo-mask" class="mask" hidden="hidden" style="display: none;">
        <div class="close-layer" onclick="$(this).parent().fadeOut(300);$('#vdo-tBox').attr('src','');$('.side-part').html('')">
            <i></i>
        </div>
        <div class="pin-view-wrapper">
            <div class="side-part" style="text-align: center;padding: 10px 10px;font-size: 16px;font-weight: 600; color: #777;"></div>
            <div class="main-part" style="padding: 10px 10px;">
                <div class="item">
                    <div class="clearfix">
                        <video id="vdo-tBox" style="height: 600px; width: 100%;" controls="controls">
                        </video>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <script> 
        minigrid('#photo-box', '.photo', 20, null,
            function() {
                //更新后回调
            });//瀑布流插件初始化
        window.addEventListener('resize', function() {//窗口大小改变自动排版
            minigrid('#photo-box', '.photo');
        }); 

        function b_load(page){
            $("#load-over").text("加载...");
            $.getJSON("/getvdojson?page=" + page, function(data) { 
                    if(data.length > 0) {
                        for(let i in data) {
                            if(data[i]==null){
                                $("#load-over").text("加载完毕"); 
                                continue;
                            }
                            $("#photo-box").append(
                                    $("<a/>", {
                                        class: "photo",
                                        href:"javascript:void(0)", 
                                        onclick:"$('#vdo-mask').show(100); $('#vdo-tBox').attr('src','"+data[i].url+"');$('.side-part').html('"+data[i].name+"  <small>(发布:"+(data[i].mtime.split('.')[0]).replace("T"," ").replace("/","-")+")</small>')"
                                    })
                                    .append($("<video/>", { src:  data[i].url , preload: "metadata", onloadeddata:'vload(this)',poster:"/static/img/status.gif",width: "100%"
                                    }))
                                .append($("<div/>", { class: "content" }).html(data[i].name) ) 
                                .append($("<input/>",{type:"datetime-local",value:(data[i].mtime).split('.')[0],readonly:"readonly"
                                }).css({width:"100%",
                                border:"none",
                                color: "#777",
                                "padding-left": "10px",
                                "padding-bottom": "10px"
                                }))
                        );
                    } 
                    minigrid('#photo-box', '.photo');
                }
            });
        }
         
        page = 0;
        window.onscroll = function() { 
            // var scrolltop=document.documentElement.scrollTop||document.body.scrollTop;
            var tops = $(document).scrollTop(); //获取滚动条的位置
            var sctop = $(document).height() - $(window).height();
            if(tops >= sctop) //成立说明滚动条已在最底部
            {
                page = page + 1; //传递页码 
                b_load(page);
            }
        };
        //默认先加载
        b_load(page);
        page=page+1;
        b_load(page);
         
      //播放时阻止 滚动条 上下滚动 防止滚动加载
        $.fn.scrollUnique = function() {
            return $(this).each(function() {
                var eventType = 'mousewheel';
                if(document.mozHidden !== undefined) {
                    eventType = 'DOMMouseScroll';
                }
                $(this).on(eventType, function(event) {
                    // 一些数据
                    var scrollTop = this.scrollTop,
                        scrollHeight = this.scrollHeight,
                        height = this.clientHeight;

                    var delta = (event.originalEvent.wheelDelta) ? event.originalEvent.wheelDelta : -(event.originalEvent.detail || 0);

                    if((delta > 0 && scrollTop <= delta) || (delta < 0 && scrollHeight - height - scrollTop <= -1 * delta)) {
                        // IE浏览器下滚动会跨越边界直接影响父级滚动,因此,临界时候手动边界滚动定位
                        this.scrollTop = delta > 0 ? 0 : scrollHeight;
                        // 向上滚 || 向下滚
                        event.preventDefault();
                    }
                });
            });
        };
        $('.mask').scrollUnique();//事件绑定
</script>
</body>

</html>

完整DEMO下载

--注意:视频的名字尽量不要出现特殊符号,比如:#--

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容