存储代码

This commit is contained in:
manghe 2025-03-23 08:37:58 +00:00
parent 8cb67eb25c
commit 38d34a554d
15 changed files with 524 additions and 120 deletions

View File

@ -67,6 +67,8 @@ class Base extends MyController
]);
}
$app_setting = getConfig('app_setting');
View::assign("app_setting", $app_setting);
}
/**

View File

@ -78,11 +78,13 @@ class Config extends Base
$config = getConfig('systemconfig');
$user_config = getConfig('user_config');
$wechat_setting = getConfig('wechat_setting');
$app_setting = getConfig('app_setting');
$wechatofficialaccount_setting = getConfig('wechatofficialaccount_setting');
View::assign("key", "systemconfig");
View::assign("data", $config);
View::assign("user_config", $user_config);
View::assign("wechat_setting", $wechat_setting);
View::assign("app_setting", $app_setting);
View::assign("wechatofficialaccount_setting", $wechatofficialaccount_setting);
return View::fetch('Config/systemconfig');
}

View File

@ -48,37 +48,33 @@ class Upload extends Base
return $this->renderError("上传文件不能超过20M");
}
// 获取存储目录参数,如果没有则使用默认目录
$dir = request()->param('dir', 'topic');
// 判断是否上传过
$hash = $files->hash('sha1');
$info = Db::name('picture')->where('token', $hash)->find();
if (false) {
$data['path'] = imageUrl($info['imgurl']);
$data['imgurl'] = $info['imgurl'];
return $this->renderSuccess('上传成功', $data);
} else {
try {
// 上传文件到腾讯云 COS
$uploadResult = $this->uploader->uploadFilePath($_FILES['file']['tmp_name'], $type);
$imgurl = $uploadResult['full_url'];
// 新增数据到数据库
$save_data['token'] = $hash;
$save_data['imgurl'] = $imgurl; // 保存 COS 中的文件路径
$save_data['addtime'] = time();
$save_data['type'] = 1;
$res = Db::name('picture')->insertGetId($save_data);
if ($res) {
$data['id'] = $res;
$data['path'] = $imgurl; // 返回文件的完整访问 URL
$data['imgurl'] = $imgurl;
return $this->renderSuccess('上传成功', $data);
} else {
return $this->renderError('上传失败');
}
} catch (\Exception $e) {
return $this->renderError('文件上传失败:' . $e->getMessage());
try {
// 上传文件到腾讯云 COS
$uploadResult = $this->uploader->uploadFilePath($_FILES['file']['tmp_name'], $type, $dir);
$imgurl = $uploadResult['full_url'];
// 新增数据到数据库
$save_data['token'] = $hash;
$save_data['imgurl'] = $imgurl; // 保存 COS 中的文件路径
$save_data['addtime'] = time();
$save_data['type'] = 1;
$res = Db::name('picture')->insertGetId($save_data);
if ($res) {
$data['id'] = $res;
$data['path'] = $imgurl; // 返回文件的完整访问 URL
$data['imgurl'] = $imgurl;
return $this->renderSuccess('上传成功', $data);
} else {
return $this->renderError('上传失败');
}
} catch (\Exception $e) {
return $this->renderError('文件上传失败:' . $e->getMessage());
}
}
/**
@ -122,7 +118,7 @@ class Upload extends Base
// 移动文件到目标目录
if (move_uploaded_file($_FILES['file']['tmp_name'], $savename)) {
$savename = str_replace('\\', '/', $savename);
$savename = substr($savename, 1); // 去掉开头的 “.”
$savename = substr($savename, 1); // 去掉开头的 "."
// 新增数据
$save_data['token'] = $hash;
@ -142,7 +138,7 @@ class Upload extends Base
}
}
}
/**
* 阿里云oss上传

View File

@ -145,7 +145,7 @@ class User extends Base
} elseif ($type == 2) {
$money = $user_info['integral'];
} elseif ($type == 3) {
$money = $user_info['score'];
$money = $user_info['money2'];
} else {
$this->renderError('请求参数错误1');
}
@ -174,13 +174,13 @@ class User extends Base
$money = $money * -1;
}
$res[] = UserModel::changeMoney($id, $money, 1, '后台变动');
} elseif ($type == 2) {#吧唧币
} elseif ($type == 2) {#货币2
if (RegInt($money)) {
return $this->renderError('修改数量不规范,请输入大于0的整数');
}
if ($type_is == 2) {
if ($money > $user_info['integral']) {
return $this->renderError('账号吧唧币扣除数量不足');
return $this->renderError('账号币扣除数量不足');
}
$money = $money * -1;
}
@ -190,12 +190,12 @@ class User extends Base
return $this->renderError('修改数量不规范,请输入大于0的整数');
}
if ($type_is == 2) {
if ($money > $user_info['score']) {
if ($money > $user_info['money2']) {
return $this->renderError('账号积分扣除数量不足');
}
$money = $money * -1;
}
$res[] = UserModel::changeScore($id, $money, 1, '后台变动');
$res[] = UserModel::changeMoney2($id, $money, 1, '后台变动');
} else {
$this->renderError('请求参数错误2');
}

View File

@ -4,7 +4,112 @@
<h2 style="text-align: center;margin-top: 20px;">系统设置</h2>
<div class="layui-fluid">
<div class="layui-row layui-col-space15">
<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="app-setting-form">
<input type="hidden" name="key" value="app_setting">
<div class="layui-form-item">
<label class="layui-form-label">项目名称</label>
<div class="layui-input-block">
<input type="text" name="app_name" value="{$app_setting.app_name|default=''}" autocomplete="off" class="layui-input" placeholder="请输入项目名称">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">购买弹窗</label>
<div class="layui-input-block">
<input type="radio" name="purchase_popup" value="0" title="弹出一次" {if !isset($app_setting.purchase_popup) || $app_setting.purchase_popup==0}checked{/if}>
<input type="radio" name="purchase_popup" value="1" title="每天显示" {if isset($app_setting.purchase_popup) && $app_setting.purchase_popup==1}checked{/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">商城兑换次数</label>
<div class="layui-input-block">
<input type="number" name="exchange_times" value="{$app_setting.exchange_times|default=0}" autocomplete="off" class="layui-input" min="0">
<div class="layui-form-mid layui-word-aux">每天允许兑换几次0不限次数</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">余额名称</label>
<div class="layui-input-inline">
<input type="text" name="balance_name" value="{$app_setting.balance_name|default=''}" autocomplete="off" class="layui-input" placeholder="请输入余额名称">
</div>
<label class="layui-form-label">余额图标</label>
<div class="layui-input-inline">
<input type="text" name="balance_icon" value="{$app_setting.balance_icon|default=''}" autocomplete="off" class="layui-input" placeholder="请输入余额图标地址">
</div>
<button type="button" class="layui-btn upload-icon" data-input="balance_icon">
<i class="layui-icon">&#xe67c;</i>上传图片
</button>
<div class="icon-preview" id="balance_icon_preview">
{if !empty($app_setting.balance_icon)}
<img src="{$app_setting.balance_icon}" style="height:38px;max-width:100px;margin-left:10px;">
{/if}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">货币1名称</label>
<div class="layui-input-inline">
<input type="text" name="currency1_name" value="{$app_setting.currency1_name|default=''}" autocomplete="off" class="layui-input" placeholder="请输入货币1名称">
</div>
<label class="layui-form-label">货币1图片</label>
<div class="layui-input-inline">
<input type="text" name="currency1_icon" value="{$app_setting.currency1_icon|default=''}" autocomplete="off" class="layui-input" placeholder="请输入货币1图片地址">
</div>
<button type="button" class="layui-btn upload-icon" data-input="currency1_icon">
<i class="layui-icon">&#xe67c;</i>上传图片
</button>
<div class="icon-preview" id="currency1_icon_preview">
{if !empty($app_setting.currency1_icon)}
<img src="{$app_setting.currency1_icon}" style="height:38px;max-width:100px;margin-left:10px;">
{/if}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">货币2名称</label>
<div class="layui-input-inline">
<input type="text" name="currency2_name" value="{$app_setting.currency2_name|default=''}" autocomplete="off" class="layui-input" placeholder="请输入货币2名称">
</div>
<label class="layui-form-label">货币2图片</label>
<div class="layui-input-inline">
<input type="text" name="currency2_icon" value="{$app_setting.currency2_icon|default=''}" autocomplete="off" class="layui-input" placeholder="请输入货币2图片地址">
</div>
<button type="button" class="layui-btn upload-icon" data-input="currency2_icon">
<i class="layui-icon">&#xe67c;</i>上传图片
</button>
<div class="icon-preview" id="currency2_icon_preview">
{if !empty($app_setting.currency2_icon)}
<img src="{$app_setting.currency2_icon}" style="height:38px;max-width:100px;margin-left:10px;">
{/if}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">中奖音频</label>
<div class="layui-input-inline" style="width: 450px;">
<input type="text" name="win_audio" value="{$app_setting.win_audio|default=''}" autocomplete="off" class="layui-input" placeholder="请输入中奖音频文件地址">
</div>
<button type="button" class="layui-btn upload-audio" data-input="win_audio">
<i class="layui-icon">&#xe67c;</i>选择文件
</button>
<div class="audio-preview" id="win_audio_preview">
{if !empty($app_setting.win_audio)}
<audio controls style="height:38px;margin-left:10px;">
<source src="{$app_setting.win_audio}" type="audio/mpeg">
您的浏览器不支持音频播放
</audio>
{/if}
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="app-setting-form">保存</button>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="layui-col-md12">
<div class="layui-card">
@ -155,15 +260,88 @@
</div>
</div>
</div>
</div>
</div>
{include file="Public:footer"/}
<script>
layui.use(['form', 'layer'], function () {
layui.use(['form', 'layer', 'upload'], function () {
var form = layui.form;
var layer = layui.layer;
var upload = layui.upload;
// 图标上传功能
$('.upload-icon').each(function() {
var inputName = $(this).data('input');
upload.render({
elem: this,
url: '{:url("/admin/picture")}',
data: {
dir: 'app/icons' // 指定存储目录为icons
},
accept: 'images',
acceptMime: 'image/*',
exts: 'jpg|png|jpeg|gif',
size: 2048, // 最大2MB
before: function(obj) {
layer.load(); // 显示等待框
},
done: function(res) {
layer.closeAll('loading'); // 关闭等待框
if (res.status) {
// 设置输入框的值
$('input[name="' + inputName + '"]').val(res.data.path);
// 更新预览图
$('#' + inputName + '_preview').html('<img src="' + res.data.path + '" style="height:38px;max-width:100px;margin-left:10px;">');
layer.msg('上传成功');
} else {
layer.msg(res.msg || '上传失败', {icon: 2});
}
},
error: function() {
layer.closeAll('loading');
layer.msg('上传失败', {icon: 2});
}
});
});
// 音频上传功能
$('.upload-audio').each(function() {
var inputName = $(this).data('input');
upload.render({
elem: this,
url: '{:url("/admin/picture")}',
data: {
dir: 'app' // 指定存储目录为app
},
accept: 'audio',
acceptMime: 'audio/*',
exts: 'mp3|wav|ogg',
size: 5120, // 最大5MB
before: function(obj) {
layer.load(); // 显示等待框
},
done: function(res) {
layer.closeAll('loading'); // 关闭等待框
if (res.status) {
// 设置输入框的值
$('input[name="' + inputName + '"]').val(res.data.path);
// 更新音频预览
$('#' + inputName + '_preview').html('<audio controls style="height:38px;margin-left:10px;"><source src="' + res.data.path + '" type="audio/mpeg">您的浏览器不支持音频播放</audio>');
layer.msg('上传成功');
} else {
layer.msg(res.msg || '上传失败', {icon: 2});
}
},
error: function() {
layer.closeAll('loading');
layer.msg('上传失败', {icon: 2});
}
});
});
// 添加地址按钮点击事件
$('#add-address').on('click', function () {
@ -193,6 +371,12 @@
// 表单提交 - 不再在前端处理数据转换,交给后端处理
form.on('submit(component-form-element)', function (data) {
var field = data.field;
// 检查并移除空的file字段
if ('file' in field && !field.file) {
delete field.file;
}
// 提交到后台
$.ajax({
url: '{:url("/admin/update")}',
@ -213,6 +397,11 @@
form.on('submit(user-uid-form)', function (data) {
var field = data.field;
// 检查并移除空的file字段
if ('file' in field && !field.file) {
delete field.file;
}
// 提交到后台
$.ajax({
url: '{:url("/admin/update")}',
@ -233,6 +422,11 @@
form.on('submit(wechat-setting-form)', function (data) {
var field = data.field;
// 检查并移除空的file字段
if ('file' in field && !field.file) {
delete field.file;
}
// 提交到后台
$.ajax({
url: '{:url("/admin/update")}',
@ -253,6 +447,36 @@
form.on('submit(wechatofficialaccount-setting-form)', function (data) {
var field = data.field;
// 检查并移除空的file字段
if ('file' in field && !field.file) {
delete field.file;
}
// 提交到后台
$.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;
});
// 项目配置表单提交
form.on('submit(app-setting-form)', function (data) {
var field = data.field;
// 检查并移除空的file字段
if ('file' in field && !field.file) {
delete field.file;
}
// 提交到后台
$.ajax({
url: '{:url("/admin/update")}',
@ -305,6 +529,28 @@
.layui-input-block {
margin-left: 150px;
}
.icon-preview {
display: inline-block;
vertical-align: middle;
}
.upload-icon {
display: inline-block;
vertical-align: middle;
margin-right: 10px;
}
.audio-preview {
display: inline-block;
vertical-align: middle;
}
.upload-audio {
display: inline-block;
vertical-align: middle;
margin-right: 10px;
}
</style>
</body>

View File

@ -202,18 +202,21 @@
}
},
{
field: 'imgurl_detail', title: '盒子详情图片', width: 90, templet: function (d) {
field: 'imgurl_detail', title: '盒子详', width: 90, templet: function (d) {
return d.imgurl_detail ? '<img src="' + d.imgurl_detail + '" style="width:60px;height:60px;" class="layui-admin-img" onclick="previewImg(this)">' : '';
}
},
{ field: 'stock', title: '盒子套数', width: 100 },
{ field: 'lock_is', title: '锁箱模式', width: 150, templet: '#lockIsTpl' },
{ field: 'show_is', title: '首页显示', width: 100, templet: '#showIsTpl' },
{ field: 'stock', title: '套数', width: 80 },
{ field: 'lock_is', title: '锁箱模式', width: 90, templet: '#lockIsTpl' },
{ field: 'show_is', title: '首页显示', width: 90, templet: '#showIsTpl' },
{ field: 'is_auto_xiajia', title: '自动下架', width: 150, templet: '#autoOffshelfTpl' },
{ field: 'prize_num', title: '擂台赏<br>抽全局赏数量', width: 90 },
{ field: 'unlock_amount', title: '解锁金额', width: 100, templet: function(d) {
return d.unlock_amount > 0 ? '<span class="layui-badge layui-bg-orange">' + d.unlock_amount + '</span>' : '无需解锁';
}},
{ field: 'sort', title: '排序', width: 80 },
{ field: 'status', title: '状态', width: 100, templet: '#statusTpl' },
{ field: 'addtime_text', title: '添加时间', width: 160 },
{ fixed: 'right',field: 'status', title: '状态', width: 100, templet: '#statusTpl' },
{ fixed: 'right', title: '操作', width: 150, toolbar: '#toolbarTpl' }
]],
done: function () {

View File

@ -224,6 +224,14 @@
placeholder="请输入从多少抽数后开始检测" class="layui-input" style="width: 600px">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">解锁金额</label>
<div class="layui-input-inline" style="width: 600px">
<input type="number" name="unlock_amount" value="0"
placeholder="请输入解锁金额0表示无需解锁" class="layui-input" style="width: 600px">
<div class="layui-form-mid layui-word-aux">新用户需要消费满此金额才能解锁此盒子0表示无需解锁</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">盒子封面图</label>
<div class="layui-input-inline">
@ -255,7 +263,7 @@
</div>
</div>
{include file="Public:footer"/}
<script>
<script type="text/javascript">
layui.use(['form', 'layedit', 'laydate', 'jquery'], function () {
let form = layui.form,
$ = layui.jquery,

View File

@ -235,6 +235,14 @@
<input type="number" name="xiajia_auto_coushu" value="{$info.xiajia_auto_coushu|default=0}" placeholder="请输入从多少抽数后开始检测" class="layui-input" style="width: 600px">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">解锁金额</label>
<div class="layui-input-inline" style="width: 600px">
<input type="number" name="unlock_amount" value="{$info.unlock_amount|default=0}"
placeholder="请输入解锁金额0表示无需解锁" class="layui-input" style="width: 600px">
<div class="layui-form-mid layui-word-aux">新用户需要消费满此金额才能解锁此盒子0表示无需解锁</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">盒子封面图</label>
<div class="layui-input-inline">
@ -268,14 +276,25 @@
</div>
</div>
{include file="Public:footer"/}
<script>
layui.use([' form', 'layedit', 'laydate', 'jquery'], function () {
let form = layui.form, $ = layui.jquery,
layer = layui.layer; // 自动下架开关切换事件 form.on('radio(autoXiajia)', function(data){
if (data.value == "1") { $('.xiajia-config').show(); } else {
$('.xiajia-config').hide();
}
}); // 其他初始化逻辑 // ... 现有代码 ... }); </script>
<script type="text/javascript">
layui.use(['form', 'layedit', 'laydate', 'jquery'], function () {
let form = layui.form,
$ = layui.jquery,
layer = layui.layer;
// 自动下架开关切换事件
form.on('radio(autoXiajia)', function (data) {
if (data.value == "1") {
$('.xiajia-config').show();
} else {
$('.xiajia-config').hide();
}
});
// 检查盒子类型,根据类型显示不同的表单项
// ... 现有代码 ...
});
</script>
</body>
</html>

View File

@ -106,19 +106,19 @@
</div>
</script>
<!-- 添加充值按钮模板 -->
<!-- 余额模板 -->
<script type="text/html" id="moneyTpl">
<span class="value-display">{{d.money}}</span>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="rechargeMoney">充值</a>
</script>
<!--货币2按钮模板-->
<script type="text/html" id="integralTpl">
<span class="value-display">{{d.integral}}</span>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="rechargeIntegral">充值</a>
</script>
<!--货币3按钮模板-->
<script type="text/html" id="scoreTpl">
<span class="value-display">{{d.score}}</span>
<span class="value-display">{{d.money2}}</span>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="rechargeScore">充值</a>
</script>
@ -168,8 +168,8 @@
<div>总出货价值:{{Number(d.user_goodslist_money3).toFixed(2)}}</div>
<div>盒柜价值:{{(Number(d.user_hegui)).toFixed(2)}}</div>
<div>微信消费:{{Number(d.user_weixin_total).toFixed(2)}}</div>
<div>余额消费:{{Number(d.user_use_money).toFixed(2)}}</div>
<div>货币消费:{{Number(d.user_use_integral).toFixed(2)}}</div>
<div>{$app_setting.balance_name}消费:{{Number(d.user_use_money).toFixed(2)}}</div>
<div>{$app_setting.currency1_name}消费:{{Number(d.user_use_integral).toFixed(2)}}</div>
<div>回收货币:{{Number(d.user_goodslist_money).toFixed(2)}}</div>
<div>发货价值:{{Number(d.user_goodslist_money2).toFixed(2)}}</div>
</div>
@ -179,7 +179,7 @@
<script type="text/html" id="userExtraInfoTpl">
<div class="user-extra-info">
<div>注册时间:{{d.addtime ? timestampToDatetime(d.addtime) : '-'}}</div>
<div>登录时间:{{d.last_login_time ? timestampToDatetime(d.last_login_time) : '空'}}</div>
<div>活跃时间:{{d.last_login_time ? timestampToDatetime(d.last_login_time) : '空'}}</div>
<div>IP{{d.last_login_ip || '-'}}</div>
<div>IP地址{{d.ip_province || '-'}}</div>
<div>IP邮编{{d.ip_adcode || '-'}}</div>
@ -227,9 +227,9 @@
, cols: [[
{ field: 'userInfo', title: '用户信息', templet: '#userInfoTpl', width: 200 }
, { field: 'pid_info', title: '推荐人', templet: '#pidInfoTpl', width: 200 }
, { field: 'money', title: '余额', templet: '#moneyTpl', width: 120 }
, { field: 'integral', title: '货币', templet: '#integralTpl', width: 120 }
, { field: 'score', title: '积分', templet: '#scoreTpl', width: 120 }
, { field: 'money', title: '{$app_setting.balance_name}', templet: '#moneyTpl', width: 120 }
, { field: 'integral', title: '{$app_setting.currency1_name}', templet: '#integralTpl', width: 120 }
, { field: 'score', title: '{$app_setting.currency2_name}', templet: '#scoreTpl', width: 120 }
, { field: 'combined', title: '货币信息', templet: '#combinedTpl', width: 200 }
, { field: 'status', title: '用户状态', templet: '#statusTpl', width: 200 }
, { field: 'extraInfo', title: '用户信息', templet: '#userExtraInfoTpl', width: 220 }
@ -301,13 +301,13 @@
clearUid(data.id, data.nickname);
break;
case 'rechargeMoney':
recharge(data.id, data.nickname, 1, '余额');
recharge(data.id, data.nickname, 1, '{$app_setting.balance_name}');
break;
case 'rechargeIntegral':
recharge(data.id, data.nickname, 2, '吧唧币');
recharge(data.id, data.nickname, 2, '{$app_setting.currency1_name}');
break;
case 'rechargeScore':
recharge(data.id, data.nickname, 3, '积分');
recharge(data.id, data.nickname, 3, '{$app_setting.currency2_name}');
break;
case 'viewBox':
layer.open({
@ -461,7 +461,7 @@
layer.close(index);
});
}
// 清空UID
function clearUid(id, username) {
layer.confirm('确认要清空' + username + '的UID吗清空后系统会按配置自动生成新的UID', {
@ -546,7 +546,7 @@
font-weight: bold;
}
/* 充值按钮样式 */
.layui-table .layui-btn-xs {
margin-top: 5px;
@ -604,6 +604,7 @@
padding: 0px 0;
}
.layui-table td {
padding: 10px 15px;
/* 调整单元格内边距 */

View File

@ -212,20 +212,40 @@ class Base extends MyController
}
/**
* 获取当前用户信息
* 获取当前登录用户ID
*
* @return int 用户ID未登录或状态异常时返回0
*/
protected function getuserid()
protected function getUserId()
{
$user_id = 0;
$token = request()->header('token', '');
$user_account = UserAccount::getInfo(['account_token' => $token]);
if ($user_account) {
$user = User::where(['id' => $user_account['user_id']])->find();
if ($user && $user['status'] == 1) {
$user_id = $user['id'];
}
// 尝试从请求参数中获取token
if (empty($token)) {
$token = $this->request->param('token', '');
}
return $user_id;
if (empty($token)) {
return 0;
}
$user_account = UserAccount::getInfo(['account_token' => $token]);
if (!$user_account) {
return 0;
}
// 验证token有效性
$user_account_is = user_md5($user_account['user_id'] . $user_account['token_num'] . $user_account['token_time']);
if ($token !== $user_account_is) {
return 0;
}
// 检查用户状态
$user = User::where(['id' => $user_account['user_id']])->find();
if (!$user || $user['status'] != 1) {
return 0;
}
return $user['id'];
}
/*
@ -271,5 +291,89 @@ class Base extends MyController
}
}
/**
* 判断用户是否已登录
*
* @param bool $returnUserId 是否返回用户ID而不是布尔值
* @return bool|int 如果$returnUserId为true返回用户ID未登录时为0否则返回布尔值
*/
protected function isLogin($returnUserId = false)
{
$token = request()->header('token', '');
if (empty($token)) {
$token = $this->request->param('token', '');
}
if (empty($token)) {
return $returnUserId ? 0 : false;
}
$user_account = UserAccount::getInfo(['account_token' => $token]);
if (!$user_account) {
return $returnUserId ? 0 : false;
}
// 验证token有效性
$user_account_is = user_md5($user_account['user_id'] . $user_account['token_num'] . $user_account['token_time']);
if ($token !== $user_account_is) {
return $returnUserId ? 0 : false;
}
// 检查用户状态
$user = User::where(['id' => $user_account['user_id']])->find();
if (!$user || $user['status'] != 1) {
return $returnUserId ? 0 : false;
}
return $returnUserId ? $user['id'] : true;
}
/**
* 检查用户登录状态未登录时返回JSON错误响应
*
* @param string $msg 自定义错误消息
* @return array|bool 登录时返回用户信息数组未登录时输出JSON并终止执行
*/
protected function checkLogin($msg = '请先登录')
{
$user = $this->getUser();
if (!$user) {
$data = [
'status' => -1,
'msg' => $msg
];
echo json_encode($data, JSON_UNESCAPED_UNICODE);
exit;
}
return $user;
}
/**
* 检查用户是否满足解锁盒子的条件
*
* @param int $unlock_amount 解锁所需金额
* @return bool 是否满足解锁条件
*/
protected function checkUnlockCondition($unlock_amount)
{
if ($unlock_amount <= 0) {
return true; // 无需解锁
}
// 获取用户ID
$userId = $this->isLogin(true);
if (!$userId) {
return false; // 未登录
}
// 获取用户消费总额
$user = User::where('id', $userId)->find();
if (!$user) {
return false;
}
// 用户消费总额大于等于解锁金额时可以解锁
return isset($user['total_consumption']) && $user['total_consumption'] >= $unlock_amount;
}
}

View File

@ -1,5 +1,5 @@
<?php
declare (strict_types=1);
declare(strict_types=1);
namespace app\api\controller;
@ -22,10 +22,11 @@ class Config extends Base
->order('sort_order')
->select()
->toArray();
$app_setting = getConfig('app_setting');
// 返回数据
return $this->renderSuccess('获取成功', [
'good_type' => $goodsTypeList
'good_type' => $goodsTypeList,
'app_setting' => $app_setting
]);
}
}
}

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace app\api\controller;
use app\api\controller\Base;
use app\common\model\Goods as Goodsmodel;
use app\common\model\GoodsLock;
@ -85,6 +86,19 @@ class Goods extends Base
$whe[] = ['type', 'not in', [4, 10]];
}
$user_id = $this->getUserId();
if ($user_id == 0) {
//充值金额
$whe[] = ['unlock_amount', '=', 0];
} else {
$order_money = Order::where('status', '=', 1)->where('user_id', '=', $user_id)->sum('price');
$userInfo = User::where('id', '=', $user_id)->field('istest')->find();
if ($userInfo && $userInfo['istest'] > 0) {
//推广账号,门槛计算是全部的
$order_money = Order::where('status', '=', 1)->where('user_id', '=', $user_id)->sum('order_zhe_total');
}
$whe[] = ['unlock_amount', '<=', $order_money];
}
#盒子
$goods = GoodsModel::where($whe)
->field("id,title,imgurl,price,type,stock,sale_stock,status,lock_is,is_shou_zhe,new_is")

View File

@ -19,7 +19,7 @@ class Login extends Base
public function initialize()
{
parent::initialize(); // 确保调用父类初始化方法
$config = getConfig('uploads');
if (!$config) {
$config = []; // 确保config是一个数组
@ -37,7 +37,7 @@ class Login extends Base
if (!empty($user['uid'])) {
return;
}
// 生成uid
$uid = $this->generateUid($user['id']);
if ($uid) {
@ -45,7 +45,7 @@ class Login extends Base
User::where('id', $user['id'])->update(['uid' => $uid]);
}
}
/**
* 生成用户UID
*
@ -57,83 +57,83 @@ class Login extends Base
// 获取用户uid配置
$user_config = getConfig('user_config');
if (empty($user_config) || !isset($user_config['uid_type'])) {
return (string)$user_id; // 默认使用真实ID
return (string) $user_id; // 默认使用真实ID
}
$uid_type = (int)$user_config['uid_type'];
$uid_length = isset($user_config['uid_length']) ? (int)$user_config['uid_length'] : 6;
$uid_type = (int) $user_config['uid_type'];
$uid_length = isset($user_config['uid_length']) ? (int) $user_config['uid_length'] : 6;
// 限制长度范围
if ($uid_length < 4) {
$uid_length = 4;
} elseif ($uid_length > 16) {
$uid_length = 16;
}
// 根据不同类型生成UID
switch ($uid_type) {
case 0: // 真实ID
return (string)$user_id;
return (string) $user_id;
case 1: // 数字ID
// 生成不以0开头的随机数字
$max_attempts = 10;
$attempt = 0;
while ($attempt < $max_attempts) {
// 生成随机数字
$min = pow(10, $uid_length - 1);
$max = pow(10, $uid_length) - 1;
$uid = (string)mt_rand($min, $max);
$uid = (string) mt_rand($min, $max);
// 检查是否唯一
$exists = User::where('uid', $uid)->count();
if ($exists == 0) {
return $uid;
}
$attempt++;
}
// 如果多次尝试后仍无法生成唯一ID则使用更可靠的方法
return $this->generateUniqueNumericId($uid_length);
case 2: // 随机字符和数字
$length = max(8, $uid_length); // 字母数字混合至少8位
$max_attempts = 10;
$attempt = 0;
while ($attempt < $max_attempts) {
// 生成随机字母数字
$characters = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ'; // 排除容易混淆的字符
$uid = '';
// 确保第一个字符不是数字
$uid .= $characters[mt_rand(8, strlen($characters) - 1)]; // 从字母开始
// 生成剩余字符
for ($i = 1; $i < $length; $i++) {
$uid .= $characters[mt_rand(0, strlen($characters) - 1)];
}
// 检查是否唯一
$exists = User::where('uid', $uid)->count();
if ($exists == 0) {
return $uid;
}
$attempt++;
}
// 如果多次尝试后仍无法生成唯一ID使用时间戳+随机数确保唯一性
return $this->generateUniqueAlphaNumId($length);
default:
return (string)$user_id;
return (string) $user_id;
}
}
/**
* 生成唯一的数字ID备用方法
*/
@ -142,16 +142,16 @@ class Login extends Base
// 使用时间微秒 + 随机数的方式保证唯一性
$base = microtime(true) * 10000 . mt_rand(1000, 9999);
$uid = substr(preg_replace('/[^0-9]/', '', $base), 0, $length);
// 确保不以0开头且长度正确
while (strlen($uid) < $length || $uid[0] == '0') {
$uid = mt_rand(1, 9) . substr($uid, 1);
$uid = substr($uid, 0, $length);
}
return $uid;
}
/**
* 生成唯一的字母数字ID备用方法
*/
@ -160,19 +160,19 @@ class Login extends Base
// 使用时间戳 + 随机字符
$base = time() . mt_rand(1000, 9999);
$hash = md5($base);
// 转换为字母数字混合
$uid = '';
$chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'; // 排除容易混淆的字符
// 确保第一个字符是字母
$uid .= $chars[mt_rand(0, 25)]; // 前26个是字母
// 生成剩余字符
for ($i = 1; $i < $length; $i++) {
$uid .= $chars[mt_rand(0, strlen($chars) - 1)];
}
return $uid;
}
/**
@ -214,10 +214,10 @@ class Login extends Base
$user->save();
}
}
// 检查并生成uid
$this->processUid($user);
#token时间戳
$time = time();
#token字符串
@ -289,14 +289,15 @@ class Login extends Base
'addtime' => time(),
'click_id' => $click_id,
'unionid' => $wx_unionid,
'uid' => '',
]);
// 生成用户uid
$uid = $this->generateUid($user_id);
if ($uid) {
User::where('id', $user_id)->update(['uid' => $uid]);
}
$time = time();
#token字符串
$token_num = getRandStr(10);
@ -465,7 +466,8 @@ class Login extends Base
'headimg' => $headimg,
'pid' => $pid,
'addtime' => time(),
'click_id' => $click_id
'click_id' => $click_id,
'uid' => '',
]);
$time = time();
#token字符串

View File

@ -45,7 +45,7 @@ class User extends Base
public function user(Request $request)
{
$user = $this->getUser();
$userinfo['ID'] = $user['id'];
$userinfo['mobile_is'] = $user['mobile'] ? 1 : 0;
$userinfo['nickname'] = $user['nickname'];
@ -153,6 +153,12 @@ class User extends Base
if (empty($nickname)) {
return $this->renderError("请输入姓名");
}
if (!$imagebase) {
//判断昵称和头像是否和用户当前的昵称和头像一致
if ($nickname == $user['nickname'] && $headimg == $user['headimg']) {
return $this->renderSuccess("无改动");
}
}
$save = [];
if ($nickname) {
$save['nickname'] = $nickname;

View File

@ -169,7 +169,7 @@ class User extends Base
/**
* 用户吧唧币变化
* 用户变化
* @param $user_id
* @param $change_money
* @param $type 1后台充值 2抽赏消费 3开券获得