This commit is contained in:
manghe 2025-04-07 07:57:33 +00:00
parent be0a485dea
commit 5e25df1ea0
9 changed files with 807 additions and 45 deletions

View File

@ -79,7 +79,7 @@ class Advert extends Base
return $this->renderError("优惠券不存在");
}
}
if ($data['ttype'] == 2 || $data['ttype'] == 3) {
if ($data['ttype'] == 2 || $data['ttype'] == 3 || $data['ttype'] == 4) {
if (empty($data['goods_id']) || $data['goods_id'] < 0) {
return $this->renderError("盒子id错误");
}
@ -88,6 +88,15 @@ class Advert extends Base
return $this->renderError("盒子不存在");
}
}
if ($data['ttype'] == 5) {
if (empty($data['url_link'])) {
return $this->renderError("请输入跳转链接");
}
// 简单的URL格式验证
if (!filter_var($data['url_link'], FILTER_VALIDATE_URL)) {
return $this->renderError("请输入有效的URL地址必须包含http://或https://");
}
}
}
if (isset($data['sort']) && !ctype_digit((string)$data['sort'])) {
@ -153,7 +162,7 @@ class Advert extends Base
return $this->renderError("优惠券不存在");
}
}
if ($data['ttype'] == 2 || $data['ttype'] == 3) {
if ($data['ttype'] == 2 || $data['ttype'] == 3 || $data['ttype'] == 4) {
if (empty($data['goods_id']) || $data['goods_id'] < 0) {
return $this->renderError("盒子id错误");
}
@ -162,6 +171,15 @@ class Advert extends Base
return $this->renderError("盒子不存在");
}
}
if ($data['ttype'] == 5) {
if (empty($data['url_link'])) {
return $this->renderError("请输入跳转链接");
}
// 简单的URL格式验证
if (!filter_var($data['url_link'], FILTER_VALIDATE_URL)) {
return $this->renderError("请输入有效的URL地址必须包含http://或https://");
}
}
}
if (isset($data['sort']) && !ctype_digit((string)$data['sort'])) {

View File

@ -82,6 +82,7 @@ class Config extends Base
$app_setting = getConfig('app_setting');
$infinite_multiple = getConfig('infinite_multiple');
$wechatofficialaccount_setting = getConfig('wechatofficialaccount_setting');
$rank_setting = getConfig('rank_setting');
View::assign("key", "systemconfig");
View::assign("data", $config);
@ -90,6 +91,7 @@ class Config extends Base
View::assign("app_setting", $app_setting);
View::assign("wechatofficialaccount_setting", $wechatofficialaccount_setting);
View::assign("infinite_multiple", $infinite_multiple);
View::assign("rank_setting", $rank_setting);
return View::fetch('Config/systemconfig');
}
@ -144,6 +146,11 @@ class Config extends Base
$redis = new RedisHelper();
($redis->getRedis())->del('config:infinite_multiple');
}
if ($data['key'] == 'rank_setting') {
//清除排行榜设置缓存
\app\common\helper\ConfigHelper::clearRankSettingsCache();
}
$result = setConfig($data['key'], $data);
if ($result) {

View File

@ -34,6 +34,7 @@
<input type="radio" name="ttype" value="2" lay-filter="ttype" class="layui-input" title="一番赏(包含全局赏,积分赏)" >
<input type="radio" name="ttype" value="3" lay-filter="ttype" class="layui-input" title="无限赏(包含领主赏)" >
<input type="radio" name="ttype" value="4" lay-filter="ttype" class="layui-input" title="连击赏" >
<input type="radio" name="ttype" value="5" lay-filter="ttype" class="layui-input" title="自定义URL" >
</div>
</div>
@ -49,6 +50,13 @@
<input type="text" name="goods_id" value="0" lay-verify="required" placeholder="请输入盒子id" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item url_link">
<label class="layui-form-label">跳转链接</label>
<div class="layui-input-inline" style="width: 400px;">
<input type="text" name="url_link" value="" lay-verify="required" placeholder="请输入完整的URL地址" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid layui-word-aux">例如: /pages/shouye/index</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">图片</label>
<div class="layui-input-inline">
@ -82,23 +90,33 @@
$(".coupon_id").hide();
$(".goods_id").hide();
$(".url_link").hide();
form.on('radio(ttype)', function (data) {
var value = data.value; // 当前选中的value值
if(value == 1){
$(".coupon_id").show();
$(".goods_id").hide();
$(".url_link").hide();
}else if(value == 2) {
$(".coupon_id").hide();
$(".goods_id").show();
$(".url_link").hide();
}else if(value == 3) {
$(".coupon_id").hide();
$(".goods_id").show();
$(".url_link").hide();
}else if(value == 4) {
$(".coupon_id").hide();
$(".goods_id").show();
$(".url_link").hide();
}else if(value == 5) {
$(".coupon_id").hide();
$(".goods_id").hide();
$(".url_link").show();
}else {
$(".coupon_id").hide();
$(".goods_id").hide();
$(".url_link").hide();
}
});

View File

@ -34,6 +34,7 @@
<input type="radio" name="ttype" value="2" lay-filter="ttype" class="layui-input" title="一番赏(包含全局赏,积分赏)" {if condition="$data.ttype eq 2"}checked{/if}>
<input type="radio" name="ttype" value="3" lay-filter="ttype" class="layui-input" title="无限赏(包含领主赏)" {if condition="$data.ttype eq 3"}checked{/if}>
<input type="radio" name="ttype" value="4" lay-filter="ttype" class="layui-input" title="连击赏" {if condition="$data.ttype eq 4"}checked{/if}>
<input type="radio" name="ttype" value="5" lay-filter="ttype" class="layui-input" title="自定义URL" {if condition="$data.ttype eq 5"}checked{/if}>
</div>
</div>
@ -49,6 +50,13 @@
<input type="text" name="goods_id" value="{$data['goods_id']}" lay-verify="required" placeholder="请输入盒子id" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item url_link">
<label class="layui-form-label">跳转链接</label>
<div class="layui-input-inline" style="width: 400px;">
<input type="text" name="url_link" value="{$data['url_link']}" lay-verify="required" placeholder="请输入完整的URL地址" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid layui-word-aux">例如: /pages/shouye/index</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">图片</label>
<div class="layui-input-inline">
@ -90,18 +98,27 @@
if(value == 1){
$(".coupon_id").show();
$(".goods_id").hide();
$(".url_link").hide();
}else if(value == 2) {
$(".coupon_id").hide();
$(".goods_id").show();
$(".url_link").hide();
}else if(value == 3) {
$(".coupon_id").hide();
$(".goods_id").show();
$(".url_link").hide();
}else if(value == 4) {
$(".coupon_id").hide();
$(".goods_id").show();
$(".url_link").hide();
}else if(value == 5) {
$(".coupon_id").hide();
$(".goods_id").hide();
$(".url_link").show();
}else {
$(".coupon_id").hide();
$(".goods_id").hide();
$(".url_link").hide();
}
}

View File

@ -136,8 +136,9 @@
<div class="layui-form-item">
<label class="layui-form-label">小程序版本号</label>
<div class="layui-input-block">
<input type="text" name="applet_version" value="{$app_setting.applet_version|default=''}"
autocomplete="off" class="layui-input" placeholder="请输入小程序版本号如v1.0.0">
<input type="text" name="applet_version"
value="{$app_setting.applet_version|default=''}" autocomplete="off"
class="layui-input" placeholder="请输入小程序版本号如v1.0.0">
</div>
</div>
<div class="layui-form-item">
@ -152,7 +153,8 @@
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="app-setting-form">保存</button>
<button type="button" class="layui-btn layui-btn-normal" id="copy-download-json">复制并下载json格式</button>
<button type="button" class="layui-btn layui-btn-normal"
id="copy-download-json">复制并下载json格式</button>
</div>
</div>
</form>
@ -199,35 +201,6 @@
</div>
</div>
<div class="layui-col-md12">
<div class="layui-card">
<div class="layui-card-header">微信设置</div>
<div class="layui-card-body">
<form class="layui-form" action="" lay-filter="wechat-setting-form">
<input type="hidden" name="key" value="wechat_setting">
<div class="layui-form-item">
<label class="layui-form-label">Appid</label>
<div class="layui-input-block">
<input type="text" name="appid" value="{$wechat_setting.appid|default=''}"
autocomplete="off" class="layui-input" placeholder="请输入微信AppID">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">AppSecret</label>
<div class="layui-input-block">
<input type="text" name="appSecret" value="{$wechat_setting.appSecret|default=''}"
autocomplete="off" class="layui-input" placeholder="请输入微信AppSecret">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="wechat-setting-form">保存</button>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="layui-col-md12">
<div class="layui-card">
@ -238,9 +211,15 @@
<div class="layui-form-item">
<label class="layui-form-label">抽奖倍数</label>
<div class="layui-input-block">
<input type="radio" name="multiple" value="1000" title="1000" {if !isset($infinite_multiple.multiple) || $infinite_multiple.multiple==1000}checked{/if}>
<input type="radio" name="multiple" value="10000" title="10000" {if isset($infinite_multiple.multiple) && $infinite_multiple.multiple==10000}checked{/if}>
<input type="radio" name="multiple" value="100000" title="100000" {if isset($infinite_multiple.multiple) && $infinite_multiple.multiple==100000}checked{/if}>
<input type="radio" name="multiple" value="1000" title="1000" {if
!isset($infinite_multiple.multiple) ||
$infinite_multiple.multiple==1000}checked{/if}>
<input type="radio" name="multiple" value="10000" title="10000" {if
isset($infinite_multiple.multiple) &&
$infinite_multiple.multiple==10000}checked{/if}>
<input type="radio" name="multiple" value="100000" title="100000" {if
isset($infinite_multiple.multiple) &&
$infinite_multiple.multiple==100000}checked{/if}>
</div>
</div>
<div class="layui-form-item">
@ -253,6 +232,161 @@
</div>
</div>
<!-- 排行榜设置卡片 -->
<div class="layui-col-md12">
<div class="layui-card">
<div class="layui-card-header">排行榜设置</div>
<div class="layui-card-body">
<form class="layui-form" action="" lay-filter="rank-setting-form">
<input type="hidden" name="key" value="rank_setting">
<!-- 达达卷排行榜 -->
<fieldset class="layui-elem-field layui-field-title">
<legend>达达卷排行榜</legend>
</fieldset>
<div class="layui-form-item">
<label class="layui-form-label">统计方式</label>
<div class="layui-input-block">
<input type="radio" name="dadajuan_stat_type" value="daily" title="每天统计" lay-filter="dadajuan_stat_type"
{if !isset($rank_setting.dadajuan_stat_type) || $rank_setting.dadajuan_stat_type=='daily'}checked{/if}>
<input type="radio" name="dadajuan_stat_type" value="weekly" title="每周统计" lay-filter="dadajuan_stat_type"
{if isset($rank_setting.dadajuan_stat_type) && $rank_setting.dadajuan_stat_type=='weekly'}checked{/if}>
<input type="radio" name="dadajuan_stat_type" value="monthly" title="每月统计" lay-filter="dadajuan_stat_type"
{if isset($rank_setting.dadajuan_stat_type) && $rank_setting.dadajuan_stat_type=='monthly'}checked{/if}>
<input type="radio" name="dadajuan_stat_type" value="yearly" title="每年统计" lay-filter="dadajuan_stat_type"
{if isset($rank_setting.dadajuan_stat_type) && $rank_setting.dadajuan_stat_type=='yearly'}checked{/if}>
<input type="radio" name="dadajuan_stat_type" value="custom" title="自定义时间范围" lay-filter="dadajuan_stat_type"
{if isset($rank_setting.dadajuan_stat_type) && $rank_setting.dadajuan_stat_type=='custom'}checked{/if}>
</div>
</div>
<div class="layui-form-item dadajuan-time-range" {if !isset($rank_setting.dadajuan_stat_type) || $rank_setting.dadajuan_stat_type!='custom'}style="display:none"{/if}>
<label class="layui-form-label">开始时间</label>
<div class="layui-input-inline">
<input type="text" name="dadajuan_start_time" id="dadajuan_start_time"
value="{$rank_setting.dadajuan_start_time|default=''}" autocomplete="off"
class="layui-input" placeholder="不填则不限制开始时间">
</div>
<label class="layui-form-label">结束时间</label>
<div class="layui-input-inline">
<input type="text" name="dadajuan_end_time" id="dadajuan_end_time"
value="{$rank_setting.dadajuan_end_time|default=''}" autocomplete="off"
class="layui-input" placeholder="不填则不限制结束时间">
</div>
</div>
<!-- 钻石排行榜 -->
<fieldset class="layui-elem-field layui-field-title">
<legend>钻石排行榜</legend>
</fieldset>
<div class="layui-form-item">
<label class="layui-form-label">统计方式</label>
<div class="layui-input-block">
<input type="radio" name="diamond_stat_type" value="daily" title="每天统计" lay-filter="diamond_stat_type"
{if !isset($rank_setting.diamond_stat_type) || $rank_setting.diamond_stat_type=='daily'}checked{/if}>
<input type="radio" name="diamond_stat_type" value="weekly" title="每周统计" lay-filter="diamond_stat_type"
{if isset($rank_setting.diamond_stat_type) && $rank_setting.diamond_stat_type=='weekly'}checked{/if}>
<input type="radio" name="diamond_stat_type" value="monthly" title="每月统计" lay-filter="diamond_stat_type"
{if isset($rank_setting.diamond_stat_type) && $rank_setting.diamond_stat_type=='monthly'}checked{/if}>
<input type="radio" name="diamond_stat_type" value="yearly" title="每年统计" lay-filter="diamond_stat_type"
{if isset($rank_setting.diamond_stat_type) && $rank_setting.diamond_stat_type=='yearly'}checked{/if}>
<input type="radio" name="diamond_stat_type" value="custom" title="自定义时间范围" lay-filter="diamond_stat_type"
{if isset($rank_setting.diamond_stat_type) && $rank_setting.diamond_stat_type=='custom'}checked{/if}>
</div>
</div>
<div class="layui-form-item diamond-time-range" {if !isset($rank_setting.diamond_stat_type) || $rank_setting.diamond_stat_type!='custom'}style="display:none"{/if}>
<label class="layui-form-label">开始时间</label>
<div class="layui-input-inline">
<input type="text" name="diamond_start_time" id="diamond_start_time"
value="{$rank_setting.diamond_start_time|default=''}" autocomplete="off"
class="layui-input" placeholder="不填则不限制开始时间">
</div>
<label class="layui-form-label">结束时间</label>
<div class="layui-input-inline">
<input type="text" name="diamond_end_time" id="diamond_end_time"
value="{$rank_setting.diamond_end_time|default=''}" autocomplete="off"
class="layui-input" placeholder="不填则不限制结束时间">
</div>
</div>
<!-- UU币排行榜 -->
<fieldset class="layui-elem-field layui-field-title">
<legend>UU币排行榜</legend>
</fieldset>
<div class="layui-form-item">
<label class="layui-form-label">统计方式</label>
<div class="layui-input-block">
<input type="radio" name="integral_stat_type" value="daily" title="每天统计" lay-filter="integral_stat_type"
{if !isset($rank_setting.integral_stat_type) || $rank_setting.integral_stat_type=='daily'}checked{/if}>
<input type="radio" name="integral_stat_type" value="weekly" title="每周统计" lay-filter="integral_stat_type"
{if isset($rank_setting.integral_stat_type) && $rank_setting.integral_stat_type=='weekly'}checked{/if}>
<input type="radio" name="integral_stat_type" value="monthly" title="每月统计" lay-filter="integral_stat_type"
{if isset($rank_setting.integral_stat_type) && $rank_setting.integral_stat_type=='monthly'}checked{/if}>
<input type="radio" name="integral_stat_type" value="yearly" title="每年统计" lay-filter="integral_stat_type"
{if isset($rank_setting.integral_stat_type) && $rank_setting.integral_stat_type=='yearly'}checked{/if}>
<input type="radio" name="integral_stat_type" value="custom" title="自定义时间范围" lay-filter="integral_stat_type"
{if isset($rank_setting.integral_stat_type) && $rank_setting.integral_stat_type=='custom'}checked{/if}>
</div>
</div>
<div class="layui-form-item integral-time-range" {if !isset($rank_setting.integral_stat_type) || $rank_setting.integral_stat_type!='custom'}style="display:none"{/if}>
<label class="layui-form-label">开始时间</label>
<div class="layui-input-inline">
<input type="text" name="integral_start_time" id="integral_start_time"
value="{$rank_setting.integral_start_time|default=''}" autocomplete="off"
class="layui-input" placeholder="不填则不限制开始时间">
</div>
<label class="layui-form-label">结束时间</label>
<div class="layui-input-inline">
<input type="text" name="integral_end_time" id="integral_end_time"
value="{$rank_setting.integral_end_time|default=''}" autocomplete="off"
class="layui-input" placeholder="不填则不限制结束时间">
</div>
</div>
<!-- 邀请新人排行榜 -->
<fieldset class="layui-elem-field layui-field-title">
<legend>邀请新人排行榜</legend>
</fieldset>
<div class="layui-form-item">
<label class="layui-form-label">统计方式</label>
<div class="layui-input-block">
<input type="radio" name="invite_stat_type" value="daily" title="每天统计" lay-filter="invite_stat_type"
{if !isset($rank_setting.invite_stat_type) || $rank_setting.invite_stat_type=='daily'}checked{/if}>
<input type="radio" name="invite_stat_type" value="weekly" title="每周统计" lay-filter="invite_stat_type"
{if isset($rank_setting.invite_stat_type) && $rank_setting.invite_stat_type=='weekly'}checked{/if}>
<input type="radio" name="invite_stat_type" value="monthly" title="每月统计" lay-filter="invite_stat_type"
{if isset($rank_setting.invite_stat_type) && $rank_setting.invite_stat_type=='monthly'}checked{/if}>
<input type="radio" name="invite_stat_type" value="yearly" title="每年统计" lay-filter="invite_stat_type"
{if isset($rank_setting.invite_stat_type) && $rank_setting.invite_stat_type=='yearly'}checked{/if}>
<input type="radio" name="invite_stat_type" value="custom" title="自定义时间范围" lay-filter="invite_stat_type"
{if isset($rank_setting.invite_stat_type) && $rank_setting.invite_stat_type=='custom'}checked{/if}>
</div>
</div>
<div class="layui-form-item invite-time-range" {if !isset($rank_setting.invite_stat_type) || $rank_setting.invite_stat_type!='custom'}style="display:none"{/if}>
<label class="layui-form-label">开始时间</label>
<div class="layui-input-inline">
<input type="text" name="invite_start_time" id="invite_start_time"
value="{$rank_setting.invite_start_time|default=''}" autocomplete="off"
class="layui-input" placeholder="不填则不限制开始时间">
</div>
<label class="layui-form-label">结束时间</label>
<div class="layui-input-inline">
<input type="text" name="invite_end_time" id="invite_end_time"
value="{$rank_setting.invite_end_time|default=''}" autocomplete="off"
class="layui-input" placeholder="不填则不限制结束时间">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="rank-setting-form">保存</button>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="layui-col-md12">
<div class="layui-card">
<div class="layui-card-header">盒子同步地址</div>
@ -308,6 +442,35 @@
</div>
</div>
<div class="layui-col-md12">
<div class="layui-card">
<div class="layui-card-header">微信设置</div>
<div class="layui-card-body">
<form class="layui-form" action="" lay-filter="wechat-setting-form">
<input type="hidden" name="key" value="wechat_setting">
<div class="layui-form-item">
<label class="layui-form-label">Appid</label>
<div class="layui-input-block">
<input type="text" name="appid" value="{$wechat_setting.appid|default=''}"
autocomplete="off" class="layui-input" placeholder="请输入微信AppID">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">AppSecret</label>
<div class="layui-input-block">
<input type="text" name="appSecret" value="{$wechat_setting.appSecret|default=''}"
autocomplete="off" class="layui-input" placeholder="请输入微信AppSecret">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="wechat-setting-form">保存</button>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="layui-col-md12">
<div class="layui-card">
<div class="layui-card-header">微信公众号设置</div>
@ -342,16 +505,18 @@
</div>
</div>
</div>
{include file="Public:footer"/}
<script>
layui.use(['form', 'layer', 'upload'], function () {
layui.use(['form', 'layer', 'upload', 'laydate'], function () {
var form = layui.form;
var layer = layui.layer;
var upload = layui.upload;
var laydate = layui.laydate;
// 图标上传功能
$('.upload-icon').each(function () {
@ -598,18 +763,112 @@
return false;
});
// 排行榜设置表单提交
form.on('submit(rank-setting-form)', function (data) {
var field = data.field;
// 提交到后台
$.ajax({
url: '{:url("/admin/update")}',
type: 'post',
data: field,
success: function (res) {
if (res.status) {
layer.msg(res.msg, { icon: 1 });
} else {
layer.msg(res.msg, { icon: 2 });
}
}
});
return false;
});
// 初始化排行榜日期选择器
laydate.render({
elem: '#dadajuan_start_time',
type: 'date'
});
laydate.render({
elem: '#dadajuan_end_time',
type: 'date'
});
laydate.render({
elem: '#diamond_start_time',
type: 'date'
});
laydate.render({
elem: '#diamond_end_time',
type: 'date'
});
laydate.render({
elem: '#integral_start_time',
type: 'date'
});
laydate.render({
elem: '#integral_end_time',
type: 'date'
});
laydate.render({
elem: '#invite_start_time',
type: 'date'
});
laydate.render({
elem: '#invite_end_time',
type: 'date'
});
// 监听排行榜统计方式的选择变化
form.on('radio(dadajuan_stat_type)', function(data){
if(data.value === 'custom'){
$('.dadajuan-time-range').show();
} else {
$('.dadajuan-time-range').hide();
}
});
form.on('radio(diamond_stat_type)', function(data){
if(data.value === 'custom'){
$('.diamond-time-range').show();
} else {
$('.diamond-time-range').hide();
}
});
form.on('radio(integral_stat_type)', function(data){
if(data.value === 'custom'){
$('.integral-time-range').show();
} else {
$('.integral-time-range').hide();
}
});
form.on('radio(invite_stat_type)', function(data){
if(data.value === 'custom'){
$('.invite-time-range').show();
} else {
$('.invite-time-range').hide();
}
});
// 复制并下载JSON格式按钮点击事件
$('#copy-download-json').on('click', function () {
// 获取app-setting-form表单的所有值
var formData = form.val('app-setting-form');
// 创建包含当前时间戳的JSON对象
var jsonData = Object.assign({}, formData);
jsonData.update_time = Math.floor(Date.now() / 1000); // 添加时间戳(秒)
// 格式化为JSON字符串
var jsonString = JSON.stringify(jsonData, null, 2);
// 复制到剪贴板
var textArea = document.createElement("textarea");
textArea.value = jsonString;
@ -617,7 +876,7 @@
textArea.select();
document.execCommand('copy');
document.body.removeChild(textArea);
// 创建并下载JSON文件
var blob = new Blob([jsonString], { type: 'application/json' });
var link = document.createElement('a');
@ -626,10 +885,10 @@
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
// 提示用户
layer.msg('已复制到剪贴板并下载JSON文件', { icon: 1 });
return false; // 阻止表单提交
});

View File

@ -206,5 +206,280 @@ class Index extends Base
return $this->renderSuccess('请求成功', $user_base);
}
/**
* 获取排行榜数据
* 支持diamond(钻石排行榜)、integral(UU币排行榜)、dadajuan(达达卷排行榜)、invite(邀请新人排行榜)
*
* @return \think\response\Json
*/
public function getRankList()
{
// 获取排行榜类型参数
$type = request()->param('type', '');
// 验证排行榜类型是否有效
$validTypes = ['diamond', 'integral', 'dadajuan', 'invite'];
if (!in_array($type, $validTypes)) {
return $this->renderError('无效的排行榜类型');
}
// 从配置助手获取排行榜时间设置
$timeSettings = \app\common\helper\ConfigHelper::getRankTime($type);
$startTime = !empty($timeSettings['start_time']) ? strtotime($timeSettings['start_time']) : 0;
$endTime = !empty($timeSettings['end_time']) ? strtotime($timeSettings['end_time']) : time();
// 设置分页参数
$page = request()->param('page/d', 1);
$limit = request()->param('limit/d', 10);
// 初始化返回数据
$data = [];
// 根据不同排行榜类型查询数据
switch ($type) {
case 'diamond': // 钻石排行榜
$data = $this->getDiamondRank($startTime, $endTime, $page, $limit);
break;
case 'integral': // UU币排行榜
$data = $this->getIntegralRank($startTime, $endTime, $page, $limit);
break;
case 'dadajuan': // 达达卷排行榜
$data = $this->getDadajuanRank($startTime, $endTime, $page, $limit);
break;
case 'invite': // 邀请新人排行榜
$data = $this->getInviteRank($startTime, $endTime, $page, $limit);
break;
}
// 返回数据
return $this->renderSuccess('请求成功', $data);
}
/**
* 获取钻石排行榜数据
*
* @param int $startTime 开始时间戳
* @param int $endTime 结束时间戳
* @param int $page 页码
* @param int $limit 每页数量
* @return array 排行榜数据
*/
private function getDiamondRank($startTime, $endTime, $page, $limit)
{
// 构建查询条件
$where = [
['status', '=', 1],
['use_money', '>', 0],
['user_id', 'not in', function ($query) {
$query->name('user')->where('istest', '>', 0)->where('status', '=', 1)->field('id');
}]
];
// 添加时间范围条件
if ($startTime > 0) {
$where[] = ['pay_time', '>=', $startTime];
}
if ($endTime > 0) {
$where[] = ['pay_time', '<=', $endTime];
}
// 查询数据
$list = Order::where($where)
->field('user_id, sum(use_money) as use_money')
->group('user_id')
->order('use_money desc')
->page($page, $limit)
->select()
->toArray();
// 处理用户信息
$rankList = [];
foreach ($list as $index => $item) {
$userInfo = User::field('nickname, headimg, mobile')->where('id', $item['user_id'])->find();
if ($userInfo) {
$rankList[] = [
'rank' => ($page - 1) * $limit + $index + 1,
'user_id' => $item['user_id'],
'nickname' => $userInfo['nickname'],
'headimg' => imageUrl($userInfo['headimg']),
'value' => $item['use_money'],
'unit' => '钻石'
];
}
}
return $rankList;
}
/**
* 获取UU币排行榜数据
*
* @param int $startTime 开始时间戳
* @param int $endTime 结束时间戳
* @param int $page 页码
* @param int $limit 每页数量
* @return array 排行榜数据
*/
private function getIntegralRank($startTime, $endTime, $page, $limit)
{
// 构建查询条件
$where = [
['status', '=', 1],
['use_integral', '>', 0],
['user_id', 'not in', function ($query) {
$query->name('user')->where('istest', '>', 0)->where('status', '=', 1)->field('id');
}]
];
// 添加时间范围条件
if ($startTime > 0) {
$where[] = ['pay_time', '>=', $startTime];
}
if ($endTime > 0) {
$where[] = ['pay_time', '<=', $endTime];
}
// 查询数据
$list = Order::where($where)
->field('user_id, sum(use_integral) as use_money')
->group('user_id')
->order('use_money desc')
->page($page, $limit)
->select()
->toArray();
// 处理用户信息
$rankList = [];
foreach ($list as $index => $item) {
$userInfo = User::field('nickname, headimg, mobile')->where('id', $item['user_id'])->find();
if ($userInfo) {
$rankList[] = [
'rank' => ($page - 1) * $limit + $index + 1,
'user_id' => $item['user_id'],
'nickname' => $userInfo['nickname'],
'headimg' => imageUrl($userInfo['headimg']),
'value' => $item['use_money'],
'unit' => 'UU币'
];
}
}
return $rankList;
}
/**
* 获取达达卷排行榜数据
*
* @param int $startTime 开始时间戳
* @param int $endTime 结束时间戳
* @param int $page 页码
* @param int $limit 每页数量
* @return array 排行榜数据
*/
private function getDadajuanRank($startTime, $endTime, $page, $limit)
{
// 构建查询条件
$where = [
['status', '=', 1],
['use_money2', '>', 0],
['user_id', 'not in', function ($query) {
$query->name('user')->where('istest', '>', 0)->where('status', '=', 1)->field('id');
}]
];
// 添加时间范围条件
if ($startTime > 0) {
$where[] = ['pay_time', '>=', $startTime];
}
if ($endTime > 0) {
$where[] = ['pay_time', '<=', $endTime];
}
// 查询数据
$list = Order::where($where)
->field('user_id, sum(use_money2) as use_money')
->group('user_id')
->order('use_money desc')
->page($page, $limit)
->select()
->toArray();
// 处理用户信息
$rankList = [];
foreach ($list as $index => $item) {
$userInfo = User::field('nickname, headimg, mobile')->where('id', $item['user_id'])->find();
if ($userInfo) {
$rankList[] = [
'rank' => ($page - 1) * $limit + $index + 1,
'user_id' => $item['user_id'],
'nickname' => $userInfo['nickname'],
'headimg' => imageUrl($userInfo['headimg']),
'value' => $item['use_money'],
'unit' => '达达卷'
];
}
}
return $rankList;
}
/**
* 获取邀请新人排行榜数据
*
* @param int $startTime 开始时间戳
* @param int $endTime 结束时间戳
* @param int $page 页码
* @param int $limit 每页数量
* @return array 排行榜数据
*/
private function getInviteRank($startTime, $endTime, $page, $limit)
{
// 构建查询条件
$where = [
['pid', '>', 0],
['istest', '=', 0], // 排除测试用户
['status', '=', 1] // 只查询状态正常的用户
];
// 添加时间范围条件
if ($startTime > 0) {
$where[] = ['addtime', '>=', $startTime];
}
if ($endTime > 0) {
$where[] = ['addtime', '<=', $endTime];
}
// 查询数据
$list = User::where($where)
->field('pid, COUNT(1) as invite_count')
->group('pid')
->having('invite_count > 0')
->order('invite_count desc')
->page($page, $limit)
->select()
->toArray();
// 处理用户信息
$rankList = [];
foreach ($list as $index => $item) {
$userInfo = User::field('nickname, headimg, mobile')->where('id', $item['pid'])->find();
if ($userInfo) {
$rankList[] = [
'rank' => ($page - 1) * $limit + $index + 1,
'user_id' => $item['pid'],
'nickname' => $userInfo['nickname'],
'headimg' => imageUrl($userInfo['headimg']),
'value' => $item['invite_count'],
'unit' => '人'
];
}
}
return $rankList;
}
}

View File

@ -192,4 +192,9 @@ Route::any('fuliwu_user_records', 'FuLiWu/fuliwu_user_records');
Route::any('fuliwu_user_winning_records', 'FuLiWu/fuliwu_user_winning_records');
// 添加记录登录的路由
Route::rule('login_record', 'Login/recordLogin', 'POST');
Route::rule('login_record', 'Login/recordLogin', 'POST');
Route::any('advlist', 'Index/getAdvert');
Route::any('recordConsume', 'Index/record');
Route::any('getPeopleList', 'Index/get_user_yaoqing');
Route::any('getRankList', 'Index/getRankList');

View File

@ -19,6 +19,13 @@ class ConfigHelper
*/
private static $infiniteMultiple = null;
/**
* 静态属性,用于存储排行榜设置
*
* @var array|null
*/
private static $rankSettings = null;
/**
* 获取无限赏抽奖倍数
* 从数据库中查询key为infinite_multiple的配置获取multiple字段
@ -66,4 +73,160 @@ class ConfigHelper
return self::$infiniteMultiple;
}
/**
* 获取排行榜设置
* 从数据库中查询key为rank_setting的配置
*
* @return array 排行榜设置
*/
public static function getRankSettings()
{
// 如果静态属性已有值,直接返回
if (self::$rankSettings !== null) {
return self::$rankSettings;
}
// 实例化Redis助手
$redis = new RedisHelper();
// 设置Redis键名
$redisKey = 'config:rank_settings';
// 尝试从Redis获取
$cachedValue = $redis->get($redisKey);
if ($cachedValue !== false) {
// 缓存结果到静态属性
self::$rankSettings = json_decode($cachedValue, true);
return self::$rankSettings;
}
// Redis中不存在从数据库获取
$config = Db::name('config')
->where('key', 'rank_setting')
->value('value');
// 解析JSON数据
$configArray = json_decode($config, true) ?: [];
// 存入Redis过期时间为1小时3600秒
$redis->set($redisKey, json_encode($configArray), 3600);
// 缓存结果到静态属性
self::$rankSettings = $configArray;
return self::$rankSettings;
}
/**
* 获取特定排行榜的时间设置
*
* @param string $type 排行榜类型dadajuan(达达卷), diamond(钻石), integral(UU币), invite(邀请新人)
* @return array 包含统计方式、开始时间和结束时间的数组
*/
public static function getRankTime($type)
{
// 获取所有排行榜设置
$settings = self::getRankSettings();
// 根据类型设置默认的键名
$statTypeKey = '';
$startKey = '';
$endKey = '';
switch ($type) {
case 'dadajuan':
$statTypeKey = 'dadajuan_stat_type';
$startKey = 'dadajuan_start_time';
$endKey = 'dadajuan_end_time';
break;
case 'diamond':
$statTypeKey = 'diamond_stat_type';
$startKey = 'diamond_start_time';
$endKey = 'diamond_end_time';
break;
case 'integral':
$statTypeKey = 'integral_stat_type';
$startKey = 'integral_start_time';
$endKey = 'integral_end_time';
break;
case 'invite':
$statTypeKey = 'invite_stat_type';
$startKey = 'invite_start_time';
$endKey = 'invite_end_time';
break;
default:
return [
'stat_type' => 'daily',
'start_time' => '',
'end_time' => ''
];
}
// 获取统计方式,默认为每天统计
$statType = isset($settings[$statTypeKey]) ? $settings[$statTypeKey] : 'daily';
// 根据统计方式计算时间范围
$startTime = '';
$endTime = '';
// 当前时间
$now = time();
switch ($statType) {
case 'daily': // 每天统计当天0点到第二天0点
$startTime = date('Y-m-d 00:00:00', $now);
$endTime = date('Y-m-d 00:00:00', strtotime('+1 day', $now));
break;
case 'weekly': // 每周统计本周一0点到下周一0点
$weekStart = strtotime('this week monday', $now);
$startTime = date('Y-m-d 00:00:00', $weekStart);
$endTime = date('Y-m-d 00:00:00', strtotime('+1 week', $weekStart));
break;
case 'monthly': // 每月统计本月1号0点到下月1号0点
$startTime = date('Y-m-01 00:00:00', $now);
$endTime = date('Y-m-01 00:00:00', strtotime('+1 month', $now));
break;
case 'yearly': // 每年统计本年1月1号0点到下年1月1号0点
$startTime = date('Y-01-01 00:00:00', $now);
$endTime = date('Y-01-01 00:00:00', strtotime('+1 year', $now));
break;
case 'custom': // 自定义时间范围:使用设置的时间
$startTime = isset($settings[$startKey]) && !empty($settings[$startKey]) ?
$settings[$startKey] : '';
$endTime = isset($settings[$endKey]) && !empty($settings[$endKey]) ?
$settings[$endKey] : '';
break;
}
// 返回排行榜配置
return [
'stat_type' => $statType,
'start_time' => $startTime,
'end_time' => $endTime
];
}
/**
* 清除排行榜设置的Redis缓存
* 在排行榜设置更新时调用,确保获取最新数据
*
* @return bool 是否成功清除缓存
*/
public static function clearRankSettingsCache()
{
// 重置静态属性
self::$rankSettings = null;
// 清除Redis缓存
$redis = new RedisHelper();
$redisKey = 'config:rank_settings';
// 删除缓存,返回是否成功
return $redis->delete($redisKey);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB