1.前言

本站点(珍贵の小窝)基于作者 Ki 的开源项目 LikeGirl v5.2.0 部署以及修改,在此对 Ki 表示感谢。

由于项目本身存在少许的缺陷,以及基于自身的需求,特对项目进行了针对性调整。

本文章用于记录自身对原项目的调整,便于后续的迁移。同时也分享给喜爱这个项目的情侣们,如果有什么疑问可文末留言。

如果喜欢,可以请我喝杯 奶茶 or Coffee

2.前台调整

2.1 隐藏敏感信息

问题:在原项目中使用了公益接口(https://q1.qlogo.cn/g?b=qq&nk=账号)获取留言者头像,由于该接口需要使用QQ账号作为传输参数,导致留言者的信息暴漏在页面中,进而可能给留言者带来不必要的麻烦。暴漏示例如下图。

小窝-QQ暴漏示例.png

调整方案:将原头像获取api接口为gravatar服务,全称Globally Recognized Avatar,其采用邮箱的不可逆向破解的哈希作为参数,所以安全系数较高。由于gravatar服务在国外,以及现在采用邮箱sha256作为参数(以前采用MD5),导致无法获取或者无法获取正确头像。故这里使用国内镜像服务Cravatar – 互联网公共头像服务

调整过程:

  • 修改留言者QQ信息:打开leaving.php文件,按照如下修改:

<div class="user_info">
	<img src="https://cravatar.cn/avatar/<?php echo md5($qq.'@qq.com') ?> ?s=60&r=pg">  //修改此处
	<span class="name"><?php echo $name ?></span>
</div>
  • 隐藏男女主QQ信息:打开head.php文件,按照如下修改:

<div class="central central-800">
	<div
		class="middle <?php if ($text['Animation'] == "1") { ?>animated fadeInDown<?php } ?> <?php if ($diy['Blurkg'] == "2") { ?>Blurkg<?php } ?>">
		<div class="img-male">
			<img src="https://cravatar.cn/avatar/<?php echo md5($text['boyimg'].'@qq.com') ?>?s=400&r=pg" draggable="false">  //修改此处
			<span><?php echo $text['boy'] ?></span>
		</div>
		<div class="love-icon">
			<img src="Style/img/like.svg" draggable="false">
		</div>
		<div class="img-female">
			<img src="https://cravatar.cn/avatar/<?php echo md5($text['girlimg'].'@qq.com') ?>?s=400&r=pg" draggable="false">  //修改此处
			<span><?php echo $text['girl'] ?></span>
		</div>
	</div>
</div>

2.2 音乐播放器

效果展示:

小窝-音乐播放器展示.png

调整方案:进入 🎵明月浩空网 注册账号,进入后台设置授权域名以及播放歌单,后在index页面最底部或在后台引入JS文件即可。

使用特点:免费使用,非会员用户无法更加个性化设置,只可设置系统已有的默认歌单。

2.3 留言弹幕

效果展示:

小窝-留言弹幕示例.png

调整步骤:这里基于开源的JS项目yaseng/jquery.barrager.js进行调整,删减了部分功能和修复显示BUG。

  • 修改后的JS文件,保存内容到 /Style/js/jquery.barrager.js 文件中。

(function($) {
    $.fn.barrager =function(barrage) {
        barrage=$.extend({
            top: 0,
            speed: 8,
            color: '#fff',
        }, barrage || {});

        var time=new Date().getTime();
        var barrager_id='barrage_' + time;
        var id='#' + barrager_id;
        var div_barrager=$("<div class='barrage' id='" + barrager_id + "'></div>").appendTo($(this));
        var window_width=$(window).width() + 500;
        var this_width=(window_width > this.width()) ? this.width() : window_width;
        var top=(barrage.top==0) ? Math.floor(Math.random() * 500 + 20) : barrage.top;
        div_barrager.css("top", top + "px");
        div_barrager_box=$("<div class='barrage_box cl'></div>").appendTo(div_barrager);

        if(barrage.img) {
            div_barrager_box.append("<a class='portrait z' href='javascript:;'></a>");
            var img=$("<img src='' >").appendTo(id + " .barrage_box .portrait");
            img.attr('src', barrage.img);
        }

        div_barrager_box.append(" <div class='z p'></div>");
        var content=$("<a title='' href=''</a>").appendTo(id + " .barrage_box .p");
        content.attr({
            'href': barrage.href,
            'id': barrage.id
        }).empty().append(barrage.info);
        content.css('color', barrage.color);

        div_barrager.css('margin-right', 0);
        
        $(id).animate({
            right:this_width
        }, barrage.speed*1000, function() {
            $(id).remove();
        });

        div_barrager_box.mouseover(function() {
                $(id).stop(true);
            });
        
        div_barrager_box.mouseout(function() {
                $(id).animate({
                    right:this_width
                }
                , barrage.speed*1000, function() {
                    $(id).remove();
                });
        });

    }

    $.fn.barrager.removeAll=function() {
        $('.barrage').remove();
    }

})(jQuery);
  • 修改后的CSS文件,复制内容到 /Style/css/barrager.css 文件中。

.barrage{position: fixed;bottom:70px;right:-500px;display: inline-block;width: 500px;z-index: 99999}
.barrage_box{background-color: rgba(0,0,0,.5);padding-right: 8px; height: 40px;display: inline-block;border-radius: 25px;transition: all .3s;}
.barrage_box .portrait{ display: inline-block;margin-top: 4px; margin-left: 4px; width: 32px;height: 32px;border-radius: 50%;overflow: hidden;}
.barrage_box .portrait img{width: 100%;height: 100%;}
.barrage_box div.p a{ margin-right: 2px; font-size: 14px;color: #fff;line-height: 40px;margin-left: 18px;pointer-events:none;overflow: hidden;white-space: nowrap; text-overflow: ellipsis;display: inline-block;max-width: 350px;}
.barrage .z {float: left !important;}
.barrage  a{text-decoration:none;}
  • 修改head.php文件,在合适位置引入 js、css文件。

<script src="../Style/js/loading.js?LikeGirl=<?php echo $version ?>"></script>

<link rel="stylesheet" href="/Style/css/barrager.css"> 
<script src="/Style/js/jquery.barrager.js"></script>
  • 修改 leaving.php,文件,修改以下位置:

......
if (!$result)
    echo "错误信息:" . $stmt->error;

// 将留言数据存入数组
$messages = [];      //添加此处
$currentAdds = 0;    //添加此处

include_once 'head.php';
?>

......

<?php
      while ($stmt->fetch()) {
          if (mt_rand(0, 10) < 4 && $currentAdds < 10) {          //添加开始位置
              array_push($messages, [
                  "img" => "https://cravatar.cn/avatar/" . md5($qq . '@qq.com') . "?s=70&r=pg",
                  "info" => $text,
                  "speed" => mt_rand(12, 15)
              ]);
              $currentAdds++;
          }  //添加结束位置
          ?>
          <div class="leavform <?php if ($Animation == "1") { ?>animated fadeInUp delay-03s<?php } ?>">

......

// 在最后边的 </script> 前添加以下:

(function() {
        const messages = <?php echo json_encode($messages); ?>;
        let index = messages.length - 1; 
        let isBarrageActive = true;
        let barrageTimeoutId = null;
    
        function startBarrage() {
            if (!isBarrageActive) return; 
            if (index < 0) return;
    
            $('body').barrager(messages[index]);
            index--;
    
            const delay = Math.floor(Math.random() * 5000) + 2000;
            barrageTimeoutId = setTimeout(startBarrage, delay);
        }
    
        function stopBarrage() {
            isBarrageActive = false; 
            if (barrageTimeoutId) {
                clearTimeout(barrageTimeoutId); 
                barrageTimeoutId = null; 
            }
            $.fn.barrager.removeAll();
        }
    
        startBarrage();
    
        window.addEventListener('popstate', function(event) {
            stopBarrage(); 
        });
    
        const originalPushState = history.pushState;
        history.pushState = function(state, title, url) {
            originalPushState.apply(history, arguments);
            stopBarrage();
        };
    
        const originalReplaceState = history.replaceState;
        history.replaceState = function(state, title, url) {
            originalReplaceState.apply(history, arguments);
            stopBarrage(); 
        };
    })();
</script>

留言弹幕至多随机显示10条,避免显示过多浏览器负载过大。如有要求可自行修改

3.后台调整

3.1 男女主双管理

她说 --> "你这什么破密码,我记不住,我要自己的账号。"

"好的,立马安排! " <-- 我答

效果演示:

小窝登录示例-boy.png

小窝登录示例-girl.png

调整过程:

  • 首先直接手动在数据表 login 添加对象新用户数据。

小窝-添加女主示例.png

  • 然后是页面信息调整,将头像显示正确,修改 /admin/Nav.php 文件主要三处部分:

$sql = "select * from login where user = '" . $_SESSION['loginadmin'] . "' ";
$loginresult = mysqli_query($connect, $sql);
if (mysqli_num_rows($loginresult)) {
    $login = mysqli_fetch_array($loginresult);
} else {
    header("Location:login.php");
    die("<script>alert('参数错误')</script>");
}
$sql = "select * from login";    //冗余代码,注释或者删掉
$result = mysqli_query($connect, $sql);    //冗余代码,注释或者删掉
if (mysqli_num_rows($result)) {    //冗余代码,注释或者删掉
     $login = mysqli_fetch_array($result);    //冗余代码,注释或者删掉
}    //冗余代码,注释或者删掉

...... // 更新头像1,更新用户名称,查找 topbar-userdrop

<a class="nav-link dropdown-toggle nav-user arrow-none mr-0" data-toggle="dropdown"
      id="topbar-userdrop" href="#" role="button" aria-haspopup="true" aria-expanded="false">
      <span class="account-user-avatar">
          <img src="https://q1.qlogo.cn/g?b=qq&nk=<?php echo $login['id']==1?$text['boyimg']:$text['girlimg'] ?>&s=640"      //修改右上角头像
              alt="user-image" class="rounded-circle">
      </span>
      <span>
          <span class="account-user-name"><?php echo $login['user'] ?></span>   //修改显示昵称
          <span class="account-position">操作</span>
      </span>
</a>

..... // 更新头像2,查找 leftbar-user
<div class="leftbar-user">
    <a href="#">
        <img src="https://q1.qlogo.cn/g?b=qq&nk=<?php echo $login['id']==1? $text['boyimg']:$text['girlimg'] ?>&s=640" alt="user-image"      //修改左侧导航栏头像
            height="42" class="rounded-circle shadow-sm">
        <span class="leftbar-user-name"><?php echo $text['title'] ?></span>
    </a>
</div>
.....
  • 最后是个人密码修改调整,便于她修改密码,修改 /admin/userPost.php 文件如下:

$login_user = $_SESSION['loginadmin'];    //新增
if ($pw) {
     $loginsql = "update login set user = '$adminName' ,pw ='" . md5($pw) . "' where user = '$login_user'";  //修改
     session_destroy();
} else {
     $loginsql = "update login set user = '$adminName' where user = '$login_user'";   //修改
}

3.2 相册管理

她说 --> "这图片怎么添加呀,我不懂!图片URL又是什么? 好麻烦,你能不能弄简单一点。"

"好的,我安排一下! " <-- 我答

恋爱相册是至关重要的,多个场景(清单、相册)需要用到。原项目由于不能直接管理图片,甚至需要手动填写URL地址,带来了极大的不便。故自己花了一点时间开发新增了相册管理模块。

添加此功能需修改较多文件,故不在此阐述,仅对赞助本站的朋友提供该模块源码,喜欢的朋友可留言或email私我

功能特点:

效果演示:

相册管理示例.png

快捷选择图片-示例.png

视频演示示例:

4.常见问题

4.1 如何获取图床相册ID

由于未实现图床api配置连接测试与相册自动获取功能,当然实现也很简单,但非必要。所以此处分享如何去获取便于获取源码的朋友自助处理。

获取步骤:

  • 首先在图床新建一个相册,该相册仅用于情侣网站图片存储。

  • 点击F12或是Fn+F12调出开发者工具,具体哪一个看下图即可。然后点击我的图库 --> 选择任一图片 --> 点击添加到相册。会看F12控制台有一个数据包。

小窝-获取相册ID步骤.png

  • 点击数据包,按照如下方式,找到相册名称对应的相册ID即可。

小窝-数据包查看ID.png

5.结语

  • 本人并非专职开发,但略懂一些开发拳脚。出于对该项目的喜爱,以及功能的不便,故花些时间进行修改和记录。

  • 如果有什么疑问,较好的建议或者需求,可以文末留言交流或者Email我。

  • 本篇文章涉及的部分功能的描述,修改代码已经较为清晰,对于拥有一定技术基础的都能快速上手。若实在搞不明白,可联系我远程处理,前提是你乐意请我一杯休闲奶茶。当然,如果你喜欢这篇文章并赞赏,十分乐意提供帮助。