树洞陪聊系统源码/陪聊/陪玩/树洞/陪陪/公众号开发/源码交付/树洞系统源码搭建教程
随着社会的发展和人们生活水平的提高,越来越多的人在面临心理压力、情感困扰或生活困境时,需要一个可以宣泄、倾诉和寻求支持的平台。而传统的人际交往方式往往会遇到难以排解的问题,比如担心被他人知晓自己的隐私等,这就导致了人们在愿意分享时却没有一个安全的环境,树洞项目的诞生为人们提供了一个匿名、安全且高效的倾诉平台,让用户能够坦诚地分享自己的心声,并在这个名的空间中寻求他人的帮助和建议。
1.上传代码到宝塔 环境要求PHP7.1最佳
2.设置伪静态
location ~* (runtime|application)/{
return 403;
}
location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php?s=$1 last; break;
}
}
3.设置运行目录
4.对接数据库 同时导入数据库
`APP_DEBUG = 0 //这是是开启调试
APP_TRACE = 0
vx:tongbayun
#服务器信息
DB_DEBUG = true
DB_HOST = 127.0.0.1
DB_NAME = 库名
DB_USER = 用户名
DB_PWD = 密码`
前端主页代码部分
{include file="common/header" /}
<body {if $data.shoudan=='1'}style="overflow: hidden;"{/if}>
<div class="indexPop">
<ul>
<li class="choiceClick" style="display: none;"><img src="__cn__/images/pop3.png"><p>首单体验</p></li>
<li class="tishi"><img src="__cn__/images/Pop1.png"></li>
<li class="wechat"><img src="__cn__/images/Pop2.png"></li>
</ul>
</div>
<div class="zz" style="display: {if $data.shoudan=='1'}block{else /}none{/if};"></div>
{if $data.shoudan=='1'}
<div class="choicePop">
<div class="bt">想要和小哥哥or小姐姐聊天呢?<div class="close_manghe"></div></div>
<div class="Nr">
<ul class="sex">
<li data-sex="1"><p>
<img src="__cn__/images/mh4.png">
<img class="on" src="__cn__/images/mh5.png">小哥哥</p></li>
<li data-sex="0"><p>
<img src="__cn__/images/mh3.png">
<img class="on" src="__cn__/images/mh2.png">小姐姐</p></li>
</ul>
<div class="layer">
<div class="left">心动体验项目:</div>
<div class="right">1v1心动体验10分钟</div>
</div>
<div class="layer">
<div class="left">微信号(必填) :</div>
<div class="right"><input type="text" id="wechat" placeholder="不要填写wxid开头的号码"></div>
</div>
<dl>
<dd class="close_manghe"><a href="javascript:void(0)">暂不体验</a></dd>
<dd><a href="JavaScript:void(0)" onclick="xindongtiyan()">心动体验</a></dd>
</dl>
<div class="tips"><img src="__cn__/images/tips.png">下单请填写正确的微信号码,并关闭隐私保护设置</div>
</div>
</div>
{/if}
<div class="indexContainer">
<form method="get">
<div class="serach">
<button></button>
<input type="text" placeholder="请输入店员昵称" name="name" value="{$opt.name}"/>
</div>
</form>
<div class="banner">
<div class="swiper-container">
<div class="swiper-wrapper">
{volist name="data.banner" id="v"}
<div class="swiper-slide"><a href="{$v.link}"><img src="{$v.image}"></a></div>
{/volist}
</div>
</div>
</div>
<div class="Tips">
<p>
<marquee direction="left" scrollamount="3">{$data.gonggao}</marquee>
</p>
</div>
<div class="layer1">
<div class="hd">
<ul>
<li class="on">女神榜</li>
<li>男神榜</li>
</ul>
<span></span>
</div>
<div class="bd">
<div class="bdWarp">
<div class="bdBox">
{volist name="data.paihangbang.woman" id="v"}
<div class="PmBox Top{$key+1}" onclick="location.href='/chat_info/{$v.id}'">
<div class="bt">TOP{$key+1}</div>
<div class="icon"><div class="bg"></div><img class="pic" src="{$v.avatar}" ></div>
<h2>{$v.name}</h2>
<p>小姐姐·{$v.age}</p>
</div>
{/volist}
</div>
<div class="bdBox">
{volist name="data.paihangbang.man" id="v"}
<div class="PmBox Top{$key+1}" onclick="location.href='/chat_info/{$v.id}'">
<div class="bt">TOP{$key+1}</div>
<div class="icon"><div class="bg"></div><img class="pic" src="{$v.avatar}" ></div>
<h2>{$v.name}</h2>
<p>小哥哥·{$v.age}</p>
</div>
{/volist}
</div>
</div>
</div>
</div>
<div class="tit">
<img src="__cn__/images/a8.png">新人推荐
</div>
<div class="layer2">
<div class="swiper-container">
<div class="swiper-wrapper">
{volist name="data.xinren" id="v"}
<div class="swiper-slide" onclick="location.href='/chat_info/{$v.id}'">
<div class="icon">{if $v.status=='1'}<span></span>{/if}<img src="{$v.avatar}"></div>
<p>{$v.name}</p>
</div>
{/volist}
</div>
</div>
</div>
<div class="tit">
<img src="__cn__/images/a9.png">推荐店员
<div class="city">
<div style="display: inline-block;">
<img src="__cn__/images/a10.png">条件筛选
</div>
</div>
</div>
<div class="layer3">
<ul class="chat_list">
</ul>
<div style="text-align: center;margin: 10px 0px;color: #666;display: none" class="data_none">没有更多数据了</div>
</div>
</div>
<div class="footer">
<ul>
<li><a href="/manghe">
<div class="icon"><img src="__cn__/images/a12.png"></div>
<p>盲盒</p>
</a></li>
<li class="on"><a href="#">
<div class="icon"><img src="__cn__/images/a13.png"></div>
<p>聊聊</p>
</a></li>
<li><a href="/member">
<div class="icon"><img src="__cn__/images/a14.png"></div>
<p>我的</p>
</a></li>
</ul>
</div>
<div class="shaixuanPop">
<div class="warp">
<div class="tit">条件筛选<div class="close"></div></div>
<div class="bt">请选择性别</div>
<ul class="list1 sex">
{volist name="data.where.sex" id="v"}
<li data-id="{$key}" class="{if $opt.sex!='' and $opt.sex==$key}on{/if}" >{$v}</li>
{/volist}
</ul>
<div class="bt">请选输入年龄(18岁以上)</div>
<ul class="list2">
<li>
<input type="text" placeholder="最小年龄" id="min_age" value="{$opt.min_age}"/>
</li>
<span></span>
<li>
<input type="text" placeholder="最大年龄" id="max_age" value="{$opt.max_age}"/>
</li>
</ul>
<div class="bt">选择等级</div>
<ul class="list1 gid">
{volist name="data.where.gid" id="v"}
<li data-id="{$key}" class="{if $opt.gid==$key}on{/if}">{$v}</li>
{/volist}
</ul>
<div class="bt">匹配星座</div>
<ul class="list1 constellation">
{volist name="data.where.constellation" id="v"}
<li data-id="{$key}" class="{if $opt.constellation==$key}on{/if}">{$v}</li>
{/volist}
</ul>
<div class="bt">所在省份</div>
<select class="cityClick province">
{volist name="data.where.province" id="v"}
<option value="{$key}" {if $opt.province==$key}selected{/if}>{$v}</option>
{/volist}
</select>
</div>
<div class="btn">
<a href="/">重置</a><a href="JavaScript:void(0)" onclick="shaixuan()">筛选</a>
</div>
</div>
<!-- text toast -->
<div role="alert" id="textToast" style="display: none;">
<div class="weui-mask_transparent"></div>
<div class="weui-toast weui-toast_text">
<p class="weui-toast__content">文字提示</p>
</div>
</div>
<div role="alert" id="loadingToast" style="display: none;">
<div class="weui-mask_transparent"></div>
<div class="weui-toast">
<span class="weui-primary-loading weui-icon_toast">
<span class="weui-primary-loading__dot"></span>
</span>
<p class="weui-toast__content">正在加载</p>
</div>
</div>
<div role="alert" id="warnToast" style="display: none;">
<div class="weui-mask_transparent"></div>
<div class="weui-toast">
<i class="weui-icon-warn weui-icon_toast"></i>
<p class="weui-toast__content">获取链接失败</p>
</div>
</div>
<div id="tishi" style="display:none;position: fixed;left: 10%;top: 15%;width: 80%;background: #fff;z-index: 9999;border-radius: 16px;padding: 10px 0px;">
<h2 style="padding: 5px 15px 10px 15px;font-size: 18px;border-bottom: 1px solid #e9e9e9;">温馨提示
<div class="tishi_close" style="background: url(static/home/cn/images/top_03.jpg);width: .28rem;height: .28rem;background-size: 100% 100%;position: absolute;right: 15px;top: 22px;"></div>
</h2>
<p><span>1</span>本平台倡导绿色健康服务,请严格遵守相关法律法规共同构建文明健康的网络生态环境。</p>
<p><span>2</span>如在聊天过程中出现色情低俗、血腥暴力、恐吓威胁等不良内容,平台有权终止服务并上报给相关部门。</p>
<p><span>3</span>如服务过程中店员主动发送色情暗示、私下接单等,请保存聊天凭证并上传给平台客服,我们将严肃处理。</p>
<p><span>4</span>禁止私下转账、借钱、赠送任何物品给店员如产生任何经济纠纷,均与本平台无关。</p>
<p><span>5</span>严禁未成年消费下单或应聘店员,否则出现任何问题,本平台概不负责。</p>
</div>
<div id="wechatimg" style="display:none;position: fixed;left: 10%;top: 10%;width: 80%;background: #fff;z-index: 9999;border-radius: 16px;padding: 10px 0px;">
<h2 style="padding: 5px 15px 10px 15px;font-size: 18px;border-bottom: 1px solid #e9e9e9;">联系客服
<div class="wechat_close" style="background: url(static/home/cn/images/top_03.jpg);width: .28rem;height: .28rem;background-size: 100% 100%;position: absolute;right: 15px;top: 22px;"></div>
</h2>
<p><img src="{$data.wechatimg}" alt=""></p>
</div>
<script>
// 触底获取新数据
let page = 1;
let last_page = 2;
let follow = {$follow|raw};
$(window).scroll(function() {
if($(window).scrollTop() + $(window).height() + 1 >= $(document).height()) {
loadMoreData();
}
});
function loadMoreData() {
if(page>last_page){
$(".data_none").css('display','block');
return false;
}
layer.open({type: 2,content: '正在请求中,请稍后~',shadeClose: false});$("body").css('overflow','hidden');
//请求接口
$.ajax({
url: '/get_list',
type: 'post',
data: {
page: page,
name: '{$opt.name}',
sex: '{$opt.sex}',
min_age: '{$opt.min_age}',
max_age: '{$opt.max_age}',
gid: '{$opt.gid}',
constellation: '{$opt.constellation}',
province: '{$opt.province}',
},
success: function(res) {
// 赋值最大页码
last_page = res.data.last_page;
// 处理数据
res.data.data.forEach(val => {
// 判断是否在线
if(val.status=='1'){
chat_status = `<span></span>`;
}else {
chat_status = ``;
}
// 判断是否关注
if ($.inArray(val.id, follow) !== -1) {
guanzhu = `on`;
}else{
guanzhu = ``;
}
let content1 = `
<li class="chat_info" data-id="${val.id}">
<div class="icon">
${chat_status}<img src="${val.avatar}">
<div class="media">
<div class="music"><audio src="${val.speech}"></audio></div>
<div class="mediaBox">
<div class="c1"></div><div class="c2"></div><div class="c3"></div><div class="c2"></div><div class="c1"></div>
</div>
</div>
</div>
<div class="text">
<div class="bt">
<span>${val.name}</span>
<div class="level${val.title}">${val.title}</div>
<div class="zan ${guanzhu}"></div>
</div>
<div class="floor1">
${val.province} <b>|</b> ${val.age}岁 <b>|</b> ${val.constellation}
</div>
<div class="floor2">
<div class="swiper-container">
<div class="swiper-wrapper">`;
service = ``;
val.service.forEach(function(value, index) {
service = service + `<div class="swiper-slide"><a class="num${index}" href="">${value}</a></div>`;
});
let content2 = `</div></div></div><dl>`;
label = ``;
val.label.forEach(function(value, index) {
label = label + `<dd><a href=""><b>#</b>${value}</a></dd>`;
});
let content3 = `</dl></div></li>`;
let con = content1+service+content2+label+content3;
$(".layer3 ul").append(con);
new Swiper(".layer3 .swiper-container", {
slidesPerView: "auto",
spaceBetween: 10,
freeMode: true,
});
})
// 处理页码
page++;
// 取消遮罩层
layer.closeAll();
$("body").css('overflow','auto');
}
});
}
function xindongtiyan(){
var $s = $(".sex");
var $sex = $s.children(".on").data('sex');
var $wechat = $("#wechat").val();
if($sex==undefined){
var $textToast = $('#textToast');
if ($textToast.css('display') != 'none') return;
$('#textToast p').text('请选择性别!');
$textToast.fadeIn(100);
setTimeout(function () {
$textToast.fadeOut(100);
}, 2000);
return false;
}
if(!$wechat){
var $textToast = $('#textToast');
if ($textToast.css('display') != 'none') return;
$('#textToast p').text('请填写微信号!');
$textToast.fadeIn(100);
setTimeout(function () {
$textToast.fadeOut(100);
}, 2000);
return false;
}
var subStr = $wechat.substring(0, 4);
if(subStr=='wxid'){
var $textToast = $('#textToast');
if ($textToast.css('display') != 'none') return;
$('#textToast p').text('请不要填写wxid开头的号码,会搜不到哦!');
$textToast.fadeIn(100);
setTimeout(function () {
$textToast.fadeOut(100);
}, 2000);
return false;
}
// 加载中
$loadingToast = $('#loadingToast');
if ($loadingToast.css('display') != 'none') return;
$loadingToast.fadeIn(100);
// 发送请求
$.ajax({
url:"chat_post_three",
type:"POST",
dataType: "json",
data:{sex:$sex,wechat:$wechat},
success: function(data){
var $loadingToast = $('#loadingToast');
$loadingToast.fadeOut(100);
if(data.code==0){
var $warnToast = $('#warnToast');
if ($warnToast.css('display') != 'none') return;
$('#warnToast p').text(data.msg);
$warnToast.fadeIn(100);
setTimeout(function () {
$warnToast.fadeOut(100);
}, 2000);
return false;
}
window.location.href = data.data.url;
}
});
return false;
};
function shaixuan(){
// 性别
var sex = $(".sex").children(".on").data('id');
// 年龄
var min_age = $("#min_age").val();
var max_age = $("#max_age").val();
// 等级
var gid = $(".gid").children(".on").data('id');
// 星座
var constellation = $(".constellation").children(".on").data('id');
// 省份
var province = $('.province option:selected').val();
var where = {sex:sex,min_age:min_age,max_age:max_age,gid:gid,constellation:constellation,province:province};
location.href = '/?' + $.param(where);
}
$(".tishi").click(function (){
$('.zz').fadeIn();
$("body").css('overflow','hidden');
$('#tishi').fadeIn();
})
$(".tishi_close").click(function (){
$('#tishi').fadeOut();
$('.zz').fadeOut();
$("body").css('overflow','auto');
})
$(".wechat").click(function (){
$('.zz').fadeIn();
$("body").css('overflow','hidden');
$('#wechatimg').fadeIn();
})
$(".wechat_close").click(function (){
$('#wechatimg').fadeOut();
$('.zz').fadeOut();
$("body").css('overflow','auto');
})
$('.choiceClick').click(function(){
$(this).fadeOut()
$('.zz').fadeIn();
$("body").css('overflow','hidden');
$('.choicePop').fadeIn();
})
$('.list1 li').click(function(){
$(this).addClass('on').siblings().removeClass('on');
})
$('.city div').click(function(){
$('.shaixuanPop').css('transform','translate(-50%,0)');
$('.zz').fadeIn();
$("body").css('overflow','hidden');
})
$('.close').click(function(){
$('.zz').fadeOut();
$("body").css('overflow','auto');
$('.shaixuanPop').css('transform','translate(-50%,100%)');
})
$(document).on("click", ".chat_info", function() {
location.href = "/chat_info/"+ $(this).data('id');
return false;
})
$(document).on("click", ".zan", function(event) {
event.stopPropagation();
let id = $(this).parents('li').data('id');
if($(this).hasClass('on')){
$(this).removeClass('on')
}else{
$(this).addClass('on')
}
//请求接口
$.ajax({
url: '/member/follow',
type: 'post',
data: {
chat_id: id
},
success: function(res) {
var $textToast = $('#textToast');
if ($textToast.css('display') != 'none') return;
$('#textToast p').text(res.msg);
$textToast.fadeIn(100);
setTimeout(function () {
$textToast.fadeOut(100);
}, 1000);
return false;
}
});
return false;
})
$(document).on("click", ".media", function(event) {
event.stopPropagation();
var audio = $(this).children('.music').children('audio')[0];
if($(this).hasClass('on')){
$(this).removeClass('on')
audio.pause(); // 暂停音频
}else{
// 暂停其他音频
elements = $(".icon>.on");
elements.each(function() {
$(this).trigger('click');
});
console.log('播放音频');
$(this).addClass('on')
audio.play(); // 播放音频
}
return false;
})
var swiper3 = new Swiper(".banner .swiper-container", {
loop: true,
autoplay: {
delay: 3000,//3秒切换一次
disableOnInteraction: false
},
pagination: {
el: ".photo .swiper-pagination",
clickable: true,
},
});
var swiper = new Swiper(".layer2 .swiper-container", {
slidesPerView: 4,
spaceBetween: 10,
freeMode: true,
pagination: {
el: ".swiper-pagination",
clickable: true,
},
});
var swiper2 = new Swiper(".layer3 .swiper-container", {
slidesPerView: "auto",
spaceBetween: 10,
freeMode: true,
});
$('.layer1 .hd ul li').click(function(){
var num=$(this).index();
if(num>0){
$('.layer1 .hd span').css('left','50%');
$('.layer1 .bd .bdWarp').css('left','-100%');
}else{
$('.layer1 .hd span').css('left','0');
$('.layer1 .bd .bdWarp').css('left','0%');
}
})
$('.choicePop .Nr ul li').click(function(){
$(this).addClass('on').siblings().removeClass('on');
})
$('.close_manghe').click(function(){
$('.choiceClick').fadeIn();
$('.choicePop').fadeOut();
$('.zz').fadeOut();
$("body").css('overflow','auto');
})
</script>
{include file="common/footer" /}